@weaverse/react 0.7.20 → 0.7.22

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.d.ts CHANGED
@@ -63,6 +63,11 @@ interface BackgroundDataProps {
63
63
  interface LayoutElementProps extends BackgroundDataProps, GridContentElementProps {
64
64
  gridSize: number;
65
65
  }
66
+ interface LayoutBackgroundProps {
67
+ imgUrl?: string;
68
+ bgColor?: string;
69
+ objectFit?: CSSProperties['objectFit'];
70
+ }
66
71
  interface MapElementProps extends WeaverseElementProps {
67
72
  place: string;
68
73
  zoom: number;
@@ -93,7 +98,7 @@ interface CountdownElementProps extends WeaverseElementProps {
93
98
  }
94
99
  declare type TimerBlockProps = {
95
100
  label: string;
96
- value: number;
101
+ value: string | number;
97
102
  };
98
103
  interface InstagramElementProps extends WeaverseElementProps {
99
104
  token: string;
@@ -112,4 +117,4 @@ declare type InstagramMedia = {
112
117
 
113
118
  declare let WeaverseRoot: ({ context }: WeaverseRootPropsType) => JSX.Element | null;
114
119
 
115
- export { ButtonElementProps, ContainerElementProps, CountdownElementProps, CountdownTimeKey, CountdownTimerType, Elements, GridContentElementProps, ImageElementProps, InstagramElementProps, InstagramMedia, ItemComponentProps, LayoutElementProps, MapElementProps, PlaceholderProps, SharedComponents, TextElementProps, TimerBlockProps, VideoElementProps, WeaverseContext, WeaverseContextConsumer, WeaverseContextProvider, WeaverseElementProps, WeaverseRoot, WeaverseRootPropsType, createRootContext };
120
+ export { ButtonElementProps, ContainerElementProps, CountdownElementProps, CountdownTimeKey, CountdownTimerType, Elements, GridContentElementProps, ImageElementProps, InstagramElementProps, InstagramMedia, ItemComponentProps, LayoutBackgroundProps, LayoutElementProps, MapElementProps, PlaceholderProps, SharedComponents, TextElementProps, TimerBlockProps, VideoElementProps, WeaverseContext, WeaverseContextConsumer, WeaverseContextProvider, WeaverseElementProps, WeaverseRoot, WeaverseRootPropsType, createRootContext };
package/dist/index.js CHANGED
@@ -39,11 +39,29 @@ module.exports = __toCommonJS(src_exports);
39
39
 
40
40
  // src/elements/button.tsx
41
41
  var React = __toESM(require("react"));
42
+ var import_react2 = require("react");
43
+
44
+ // src/context.ts
45
+ var import_core = require("@weaverse/core");
46
+ var import_react = require("react");
47
+ var createRootContext = (configs) => {
48
+ let rootContext = new import_core.Weaverse(configs);
49
+ Object.keys(Elements).forEach((key) => {
50
+ rootContext.registerElement(Elements[key]);
51
+ });
52
+ return rootContext;
53
+ };
54
+ var WeaverseContext = (0, import_react.createContext)({});
55
+ var WeaverseContextProvider = WeaverseContext.Provider;
56
+ var WeaverseContextConsumer = WeaverseContext.Consumer;
57
+
58
+ // src/elements/button.tsx
42
59
  var Button = React.forwardRef((props, ref) => {
60
+ let { isDesignMode } = (0, import_react2.useContext)(WeaverseContext);
43
61
  let { text, clickAction, linkTo, openInNewTab, ...rest } = props;
44
62
  if (clickAction && linkTo) {
45
63
  return /* @__PURE__ */ React.createElement("a", {
46
- href: linkTo,
64
+ href: !isDesignMode ? linkTo : void 0,
47
65
  target: openInNewTab ? "_blank" : "_self",
48
66
  rel: "noreferrer",
49
67
  ...rest,
@@ -76,11 +94,11 @@ var css = {
76
94
  var button_default = Button;
77
95
 
78
96
  // src/elements/container.tsx
79
- var import_react = __toESM(require("react"));
80
- var Container = (0, import_react.forwardRef)(
97
+ var import_react3 = __toESM(require("react"));
98
+ var Container = (0, import_react3.forwardRef)(
81
99
  (props, ref) => {
82
100
  let { children, ...rest } = props;
83
- return /* @__PURE__ */ import_react.default.createElement("div", {
101
+ return /* @__PURE__ */ import_react3.default.createElement("div", {
84
102
  ref,
85
103
  ...rest
86
104
  }, children);
@@ -104,30 +122,16 @@ Container.defaultProps = {};
104
122
  var container_default = Container;
105
123
 
106
124
  // src/elements/countdown/index.tsx
107
- var import_react4 = __toESM(require("react"));
108
-
109
- // src/context.ts
110
- var import_core = require("@weaverse/core");
111
- var import_react2 = require("react");
112
- var createRootContext = (configs) => {
113
- let rootContext = new import_core.Weaverse(configs);
114
- Object.keys(Elements).forEach((key) => {
115
- rootContext.registerElement(Elements[key]);
116
- });
117
- return rootContext;
118
- };
119
- var WeaverseContext = (0, import_react2.createContext)({});
120
- var WeaverseContextProvider = WeaverseContext.Provider;
121
- var WeaverseContextConsumer = WeaverseContext.Consumer;
125
+ var import_react5 = __toESM(require("react"));
122
126
 
123
127
  // src/elements/countdown/timer-block.tsx
124
- var import_react3 = __toESM(require("react"));
128
+ var import_react4 = __toESM(require("react"));
125
129
  function TimerBlock({ value, label }) {
126
- return /* @__PURE__ */ import_react3.default.createElement("div", {
130
+ return /* @__PURE__ */ import_react4.default.createElement("div", {
127
131
  className: "wv-cd-block"
128
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
132
+ }, /* @__PURE__ */ import_react4.default.createElement("div", {
129
133
  className: "wv-cd-number"
130
- }, value.toString().padStart(2, "0")), label && /* @__PURE__ */ import_react3.default.createElement("div", {
134
+ }, typeof value === "string" ? value : value.toString().padStart(2, "0")), label && /* @__PURE__ */ import_react4.default.createElement("div", {
131
135
  className: "wv-cd-label"
132
136
  }, label));
133
137
  }
@@ -150,51 +154,75 @@ function getTime(_seconds) {
150
154
  }
151
155
 
152
156
  // src/elements/countdown/index.tsx
153
- var Countdown = (0, import_react4.forwardRef)(
157
+ var countdownKey = "wv-cd-evergreen-start";
158
+ var Countdown = (0, import_react5.forwardRef)(
154
159
  (props, ref) => {
155
- const { isDesignMode } = (0, import_react4.useContext)(WeaverseContext);
160
+ const { isDesignMode } = (0, import_react5.useContext)(WeaverseContext);
156
161
  let {
157
162
  timerType,
158
- startTime,
159
- endTime,
160
- periods,
163
+ startTime: startTimeProp,
164
+ endTime: endTimeProp,
165
+ periods: periodsProp,
161
166
  redirectUrl,
162
167
  openInNewTab,
163
168
  showColon,
164
169
  showLabel,
165
170
  ...rest
166
171
  } = props;
167
- const [remaining, setRemaining] = import_react4.default.useState(0);
168
- if (typeof endTime !== "number") {
169
- endTime = Number.parseInt(endTime);
170
- }
171
- (0, import_react4.useEffect)(() => {
172
- const flag = setInterval(() => {
173
- const remainingTime = Math.max(
174
- (timerType === "fixed-time" ? new Date(endTime).getTime() : new Date(startTime).getTime() + periods * 60 * 1e3) - Date.now(),
175
- 0
176
- );
177
- if (!isDesignMode && redirectUrl && remainingTime > 0 && remainingTime < 1e3) {
178
- window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
179
- clearInterval(flag);
172
+ const [remaining, setRemaining] = import_react5.default.useState(0);
173
+ let periods = periodsProp * 60 * 1e3;
174
+ const handleEnd = () => {
175
+ if (!isDesignMode && redirectUrl)
176
+ window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
177
+ };
178
+ const getStartTime = () => {
179
+ let startTime = startTimeProp;
180
+ if (timerType === "evergreen") {
181
+ const start = localStorage.getItem(countdownKey);
182
+ if (start) {
183
+ startTime = Number.parseInt(start);
184
+ if (startTime + periods < Date.now()) {
185
+ startTime = Date.now();
186
+ localStorage.setItem(countdownKey, startTime.toString());
187
+ }
188
+ } else {
189
+ startTime = Date.now();
190
+ localStorage.setItem(countdownKey, startTime.toString());
180
191
  }
181
- setRemaining(remainingTime);
182
- }, 1e3);
192
+ }
193
+ return startTime;
194
+ };
195
+ const checkActive = (startTime) => startTime < Date.now() && endTimeProp > Date.now();
196
+ const handleRemaining = () => {
197
+ let startTime = getStartTime();
198
+ let endTime = timerType === "fixed-time" ? endTimeProp : startTime + periods;
199
+ let isActive = checkActive(startTime);
200
+ const remainingTime = isActive ? Math.max(endTime - Date.now(), 0) : 0;
201
+ if (remainingTime > 0 && remainingTime < 1e3) {
202
+ handleEnd();
203
+ }
204
+ setRemaining(remainingTime);
205
+ };
206
+ (0, import_react5.useEffect)(() => {
207
+ let intervalFlag = setInterval(
208
+ handleRemaining,
209
+ 1e3
210
+ );
183
211
  return () => {
184
- clearInterval(flag);
212
+ clearInterval(intervalFlag);
185
213
  };
186
- }, [startTime, endTime, periods, timerType]);
214
+ }, [startTimeProp, endTimeProp, periods, timerType]);
187
215
  const timer = getTime(remaining);
188
- return /* @__PURE__ */ import_react4.default.createElement("div", {
216
+ return /* @__PURE__ */ import_react5.default.createElement("div", {
189
217
  ref,
190
218
  ...rest
191
219
  }, times.map((time) => {
192
- return /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, {
220
+ return /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, {
193
221
  key: time
194
- }, /* @__PURE__ */ import_react4.default.createElement(TimerBlock, {
222
+ }, /* @__PURE__ */ import_react5.default.createElement(TimerBlock, {
195
223
  label: showLabel ? time : "",
196
- value: timer[time]
197
- }), time !== "seconds" && /* @__PURE__ */ import_react4.default.createElement("div", null, /* @__PURE__ */ import_react4.default.createElement("span", {
224
+ value: remaining === 0 ? "--" : timer[time]
225
+ }), time !== "seconds" && /* @__PURE__ */ import_react5.default.createElement("div", null, /* @__PURE__ */ import_react5.default.createElement("span", {
198
226
  className: `wv-cd-number ${showColon ? "" : "hidden"}`
199
227
  }, ":")));
200
228
  }));
@@ -229,9 +257,9 @@ var css3 = {
229
257
  Countdown.defaultProps = {
230
258
  timerType: "fixed-time",
231
259
  startTime: Date.now(),
232
- endTime: 1666756528e3,
260
+ endTime: Date.now() + 1e3 * 60 * 60 * 24,
233
261
  periods: 90,
234
- redirectUrl: "https://myshop.com",
262
+ redirectUrl: "",
235
263
  openInNewTab: false,
236
264
  showLabel: true,
237
265
  showColon: true
@@ -239,8 +267,8 @@ Countdown.defaultProps = {
239
267
  var countdown_default = Countdown;
240
268
 
241
269
  // src/elements/image.tsx
242
- var import_react5 = __toESM(require("react"));
243
- var Image = import_react5.default.forwardRef(
270
+ var import_react6 = __toESM(require("react"));
271
+ var Image = import_react6.default.forwardRef(
244
272
  (props, ref) => {
245
273
  let {
246
274
  src,
@@ -256,18 +284,18 @@ var Image = import_react5.default.forwardRef(
256
284
  "--wv-img-object-fit": objectFit,
257
285
  "--wv-img-object-position": objectPosition
258
286
  };
259
- let content = /* @__PURE__ */ import_react5.default.createElement("img", {
287
+ let content = /* @__PURE__ */ import_react6.default.createElement("img", {
260
288
  alt,
261
289
  "data-blink-src": src
262
290
  });
263
291
  if (onClickAction === "open-link" && linkTo) {
264
292
  let target = openLinkInNewTab ? "_blank" : "_self";
265
- content = /* @__PURE__ */ import_react5.default.createElement("a", {
293
+ content = /* @__PURE__ */ import_react6.default.createElement("a", {
266
294
  href: linkTo,
267
295
  target
268
296
  }, content);
269
297
  }
270
- return /* @__PURE__ */ import_react5.default.createElement("div", {
298
+ return /* @__PURE__ */ import_react6.default.createElement("div", {
271
299
  ref,
272
300
  ...rest,
273
301
  style
@@ -299,8 +327,8 @@ Image.defaultProps = {
299
327
  var image_default = Image;
300
328
 
301
329
  // src/elements/layout.tsx
302
- var import_react6 = __toESM(require("react"));
303
- var Layout = (0, import_react6.forwardRef)((props, ref) => {
330
+ var import_react7 = __toESM(require("react"));
331
+ var Layout = (0, import_react7.forwardRef)((props, ref) => {
304
332
  let {
305
333
  children,
306
334
  rows,
@@ -321,15 +349,15 @@ var Layout = (0, import_react6.forwardRef)((props, ref) => {
321
349
  "--row-size": rowSize + "px",
322
350
  "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))"
323
351
  };
324
- return /* @__PURE__ */ import_react6.default.createElement("section", {
352
+ return /* @__PURE__ */ import_react7.default.createElement("section", {
325
353
  ref,
326
354
  ...rest,
327
355
  style
328
- }, /* @__PURE__ */ import_react6.default.createElement(LayoutBackground, {
356
+ }, /* @__PURE__ */ import_react7.default.createElement(LayoutBackground, {
329
357
  imgUrl: backgroundImage,
330
358
  bgColor: backgroundColor,
331
359
  objectFit
332
- }), /* @__PURE__ */ import_react6.default.createElement("div", {
360
+ }), /* @__PURE__ */ import_react7.default.createElement("div", {
333
361
  "data-layout-content": true
334
362
  }, children));
335
363
  });
@@ -339,10 +367,10 @@ var LayoutBackground = (props) => {
339
367
  ["--bg-color"]: bgColor,
340
368
  ["--object-fit"]: objectFit
341
369
  };
342
- return imgUrl || bgColor ? /* @__PURE__ */ import_react6.default.createElement("div", {
370
+ return imgUrl || bgColor ? /* @__PURE__ */ import_react7.default.createElement("div", {
343
371
  "data-wv-bg": true,
344
372
  style
345
- }, imgUrl && /* @__PURE__ */ import_react6.default.createElement("img", {
373
+ }, imgUrl && /* @__PURE__ */ import_react7.default.createElement("img", {
346
374
  width: "100%",
347
375
  height: "100%",
348
376
  "data-blink-src": imgUrl,
@@ -394,13 +422,13 @@ Layout.defaultProps = {
394
422
  var layout_default = Layout;
395
423
 
396
424
  // src/elements/map.tsx
397
- var import_react7 = __toESM(require("react"));
398
- var Map = (0, import_react7.forwardRef)((props, ref) => {
425
+ var import_react8 = __toESM(require("react"));
426
+ var Map = (0, import_react8.forwardRef)((props, ref) => {
399
427
  let { place, zoom, ...rest } = props;
400
- return /* @__PURE__ */ import_react7.default.createElement("div", {
428
+ return /* @__PURE__ */ import_react8.default.createElement("div", {
401
429
  ref,
402
430
  ...rest
403
- }, /* @__PURE__ */ import_react7.default.createElement("iframe", {
431
+ }, /* @__PURE__ */ import_react8.default.createElement("iframe", {
404
432
  loading: "lazy",
405
433
  scrolling: "no",
406
434
  width: "100%",
@@ -443,24 +471,24 @@ Text.defaultProps = {
443
471
  var text_default = Text;
444
472
 
445
473
  // src/elements/video.tsx
446
- var import_react8 = __toESM(require("react"));
447
- var Video = (0, import_react8.forwardRef)((props, ref) => {
448
- let { isDesignMode } = (0, import_react8.useContext)(WeaverseContext);
474
+ var import_react9 = __toESM(require("react"));
475
+ var Video = (0, import_react9.forwardRef)((props, ref) => {
476
+ let { isDesignMode } = (0, import_react9.useContext)(WeaverseContext);
449
477
  let { src, type, controls, poster, autoPlay, loop, muted, ...rest } = props;
450
- return /* @__PURE__ */ import_react8.default.createElement("div", {
478
+ return /* @__PURE__ */ import_react9.default.createElement("div", {
451
479
  ref,
452
480
  ...rest
453
- }, /* @__PURE__ */ import_react8.default.createElement("video", {
481
+ }, /* @__PURE__ */ import_react9.default.createElement("video", {
454
482
  controls: isDesignMode ? false : controls,
455
483
  autoPlay: isDesignMode ? false : autoPlay,
456
484
  loop,
457
485
  muted: true,
458
486
  controlsList: "nodownload",
459
487
  disablePictureInPicture: true
460
- }, /* @__PURE__ */ import_react8.default.createElement("source", {
488
+ }, /* @__PURE__ */ import_react9.default.createElement("source", {
461
489
  src,
462
490
  type: type || "video/mp4"
463
- }), /* @__PURE__ */ import_react8.default.createElement("source", {
491
+ }), /* @__PURE__ */ import_react9.default.createElement("source", {
464
492
  src,
465
493
  type: "video/ogg"
466
494
  }), "Your browser does not support the video tag."));
@@ -486,33 +514,33 @@ Video.defaultProps = {
486
514
  var video_default = Video;
487
515
 
488
516
  // src/elements/instagram.tsx
489
- var import_react10 = __toESM(require("react"));
517
+ var import_react11 = __toESM(require("react"));
490
518
 
491
519
  // src/elements/shared/Placeholder.tsx
492
- var import_react9 = __toESM(require("react"));
493
- var Placeholder = (0, import_react9.forwardRef)(
520
+ var import_react10 = __toESM(require("react"));
521
+ var Placeholder = (0, import_react10.forwardRef)(
494
522
  (props, ref) => {
495
523
  let { element, children, ...rest } = props;
496
- return /* @__PURE__ */ import_react9.default.createElement("div", {
524
+ return /* @__PURE__ */ import_react10.default.createElement("div", {
497
525
  "data-wv-placeholder": true,
498
526
  style: { display: "none" },
499
527
  ref,
500
528
  ...rest
501
- }, /* @__PURE__ */ import_react9.default.createElement("div", {
529
+ }, /* @__PURE__ */ import_react10.default.createElement("div", {
502
530
  style: { fontWeight: 600, marginBottom: "10px" }
503
- }, element), /* @__PURE__ */ import_react9.default.createElement("div", null, children));
531
+ }, element), /* @__PURE__ */ import_react10.default.createElement("div", null, children));
504
532
  }
505
533
  );
506
534
  var Placeholder_default = Placeholder;
507
535
 
508
536
  // src/elements/instagram.tsx
509
537
  var INSTAGRAM_API = "https://graph.instagram.com";
510
- var Instagram = (0, import_react10.forwardRef)(
538
+ var Instagram = (0, import_react11.forwardRef)(
511
539
  (props, ref) => {
512
540
  let { token, username, numberOfImages, imagesPerRow, gap, ...rest } = props;
513
- let [media, setMedia] = (0, import_react10.useState)([]);
514
- let [error, setError] = (0, import_react10.useState)(null);
515
- (0, import_react10.useEffect)(() => {
541
+ let [media, setMedia] = (0, import_react11.useState)([]);
542
+ let [error, setError] = (0, import_react11.useState)(null);
543
+ (0, import_react11.useEffect)(() => {
516
544
  if (token) {
517
545
  let params = new URLSearchParams({
518
546
  access_token: token,
@@ -529,10 +557,10 @@ var Instagram = (0, import_react10.forwardRef)(
529
557
  }
530
558
  }, [token]);
531
559
  if (!token || error) {
532
- return /* @__PURE__ */ import_react10.default.createElement("div", {
560
+ return /* @__PURE__ */ import_react11.default.createElement("div", {
533
561
  ref,
534
562
  ...rest
535
- }, /* @__PURE__ */ import_react10.default.createElement(Placeholder_default, {
563
+ }, /* @__PURE__ */ import_react11.default.createElement(Placeholder_default, {
536
564
  element: "Instagram"
537
565
  }, !token ? "Connect to Instagram to display photos on your site." : "Invalid or expired token!"));
538
566
  }
@@ -540,20 +568,20 @@ var Instagram = (0, import_react10.forwardRef)(
540
568
  "--wv-ig-images-per-row": imagesPerRow,
541
569
  "--wv-ig-images-gap": gap + "px"
542
570
  };
543
- return /* @__PURE__ */ import_react10.default.createElement("div", {
571
+ return /* @__PURE__ */ import_react11.default.createElement("div", {
544
572
  ref,
545
573
  ...rest,
546
574
  style
547
- }, /* @__PURE__ */ import_react10.default.createElement("div", {
575
+ }, /* @__PURE__ */ import_react11.default.createElement("div", {
548
576
  className: "wv-ig-media-container"
549
577
  }, media.slice(0, numberOfImages).map((item) => {
550
578
  let { id, permalink, caption, media_url } = item;
551
- return /* @__PURE__ */ import_react10.default.createElement("a", {
579
+ return /* @__PURE__ */ import_react11.default.createElement("a", {
552
580
  key: id,
553
581
  href: permalink,
554
582
  target: "_blank",
555
583
  rel: "noreferrer"
556
- }, /* @__PURE__ */ import_react10.default.createElement("img", {
584
+ }, /* @__PURE__ */ import_react11.default.createElement("img", {
557
585
  alt: caption,
558
586
  src: media_url
559
587
  }));
@@ -642,7 +670,7 @@ var Elements = {
642
670
 
643
671
  // src/renderer.tsx
644
672
  var import_core2 = require("@weaverse/core");
645
- var import_react11 = __toESM(require("react"));
673
+ var import_react12 = __toESM(require("react"));
646
674
 
647
675
  // src/utils/index.ts
648
676
  function shortCssObject(css10) {
@@ -653,11 +681,10 @@ function shortCssObject(css10) {
653
681
  }
654
682
  var permanentClasses = {};
655
683
  function generateItemClass(instance, stitchesInstance) {
656
- var _a, _b;
657
684
  let { css: css10, type, className: cls = "" } = instance.data;
658
685
  let className = "";
659
686
  let permanentClass = "";
660
- let perCss = (_a = instance.Element) == null ? void 0 : _a.permanentCss;
687
+ let perCss = instance.Element?.permanentCss;
661
688
  if (perCss) {
662
689
  if (type in permanentClasses) {
663
690
  permanentClass = permanentClasses[type];
@@ -672,7 +699,7 @@ function generateItemClass(instance, stitchesInstance) {
672
699
  let formattedCss = shortCssObject(css10);
673
700
  let { className: newClass = "" } = stitchesInstance.css(formattedCss)();
674
701
  let { stitchesClass } = instance;
675
- let otherClass = (((_b = instance.ref.current) == null ? void 0 : _b.className) || "").replace(stitchesClass, "").replace(cls, "").replace(permanentClass, "").trim();
702
+ let otherClass = (instance.ref.current?.className || "").replace(stitchesClass, "").replace(cls, "").replace(permanentClass, "").trim();
676
703
  className = `${permanentClass} ${cls} ${newClass} ${otherClass}`.trim();
677
704
  instance.stitchesClass = newClass;
678
705
  }
@@ -681,37 +708,36 @@ function generateItemClass(instance, stitchesInstance) {
681
708
 
682
709
  // src/renderer.tsx
683
710
  var WeaverseRoot = ({ context }) => {
684
- var _a, _b;
685
- let [, setData] = (0, import_react11.useState)(context.projectData);
686
- let rootRef = (0, import_react11.useRef)();
711
+ let [, setData] = (0, import_react12.useState)(context.projectData);
712
+ let rootRef = (0, import_react12.useRef)();
687
713
  let renderRoot = () => setData({});
688
- (0, import_react11.useEffect)(() => {
714
+ (0, import_react12.useEffect)(() => {
689
715
  context.subscribe(renderRoot);
690
716
  context.contentRootElement = rootRef.current;
691
717
  return () => {
692
718
  context.unsubscribe(renderRoot);
693
719
  };
694
720
  }, []);
695
- let eventHandlers = ((_a = context == null ? void 0 : context.studioBridge) == null ? void 0 : _a.eventHandlers) || {};
721
+ let eventHandlers = context?.studioBridge?.eventHandlers || {};
696
722
  let themeClass = context.stitchesInstance.theme.className;
697
- if ((_b = context.projectData) == null ? void 0 : _b.rootId) {
698
- return /* @__PURE__ */ import_react11.default.createElement("div", {
723
+ if (context.projectData?.rootId) {
724
+ return /* @__PURE__ */ import_react12.default.createElement("div", {
699
725
  className: `weaverse-content-root ${themeClass}`,
700
726
  ...eventHandlers,
701
727
  ref: rootRef
702
- }, /* @__PURE__ */ import_react11.default.createElement(WeaverseContextProvider, {
728
+ }, /* @__PURE__ */ import_react12.default.createElement(WeaverseContextProvider, {
703
729
  value: context
704
- }, /* @__PURE__ */ import_react11.default.createElement(ItemInstance, {
730
+ }, /* @__PURE__ */ import_react12.default.createElement(ItemInstance, {
705
731
  id: context.projectData.rootId
706
732
  })));
707
733
  }
708
734
  return null;
709
735
  };
710
736
  var ItemComponent = ({ instance }) => {
711
- let { stitchesInstance, elementInstances } = (0, import_react11.useContext)(WeaverseContext);
712
- let [data, setData] = (0, import_react11.useState)(instance.data);
737
+ let { stitchesInstance, elementInstances } = (0, import_react12.useContext)(WeaverseContext);
738
+ let [data, setData] = (0, import_react12.useState)(instance.data);
713
739
  let { id, type, childIds = [], css: css10, className, ...rest } = data;
714
- (0, import_react11.useEffect)(() => {
740
+ (0, import_react12.useEffect)(() => {
715
741
  let render = (data2) => setData({ ...data2 });
716
742
  instance.subscribe(render);
717
743
  if (import_core2.isBrowser && !instance.ref.current) {
@@ -722,18 +748,18 @@ var ItemComponent = ({ instance }) => {
722
748
  return () => instance.unsubscribe(render);
723
749
  }, []);
724
750
  let Element = elementInstances.get(type);
725
- if (Element == null ? void 0 : Element.Component) {
751
+ if (Element?.Component) {
726
752
  let Component = Element.Component;
727
753
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
728
754
  rest.ref = instance.ref;
729
755
  }
730
- return /* @__PURE__ */ import_react11.default.createElement(Component, {
756
+ return /* @__PURE__ */ import_react12.default.createElement(Component, {
731
757
  key: id,
732
758
  "data-wv-type": type,
733
759
  "data-wv-id": id,
734
760
  className: generateItemClass(instance, stitchesInstance),
735
761
  ...rest
736
- }, childIds.map((id2) => /* @__PURE__ */ import_react11.default.createElement(ItemInstance, {
762
+ }, childIds.map((id2) => /* @__PURE__ */ import_react12.default.createElement(ItemInstance, {
737
763
  key: id2,
738
764
  id: id2
739
765
  })));
@@ -743,15 +769,15 @@ var ItemComponent = ({ instance }) => {
743
769
  }
744
770
  };
745
771
  var ItemInstance = ({ id }) => {
746
- let context = (0, import_react11.useContext)(WeaverseContext);
772
+ let context = (0, import_react12.useContext)(WeaverseContext);
747
773
  let { itemInstances } = context;
748
774
  let instance = itemInstances.get(id);
749
775
  if (!instance) {
750
- return /* @__PURE__ */ import_react11.default.createElement("div", {
776
+ return /* @__PURE__ */ import_react12.default.createElement("div", {
751
777
  style: { display: "none" }
752
778
  }, "Item instance ", id, " not found");
753
779
  }
754
- return /* @__PURE__ */ import_react11.default.createElement(ItemComponent, {
780
+ return /* @__PURE__ */ import_react12.default.createElement(ItemComponent, {
755
781
  key: id,
756
782
  instance
757
783
  });
package/dist/index.mjs CHANGED
@@ -1,10 +1,28 @@
1
1
  // src/elements/button.tsx
2
2
  import * as React from "react";
3
+ import { useContext } from "react";
4
+
5
+ // src/context.ts
6
+ import { Weaverse } from "@weaverse/core";
7
+ import { createContext } from "react";
8
+ var createRootContext = (configs) => {
9
+ let rootContext = new Weaverse(configs);
10
+ Object.keys(Elements).forEach((key) => {
11
+ rootContext.registerElement(Elements[key]);
12
+ });
13
+ return rootContext;
14
+ };
15
+ var WeaverseContext = createContext({});
16
+ var WeaverseContextProvider = WeaverseContext.Provider;
17
+ var WeaverseContextConsumer = WeaverseContext.Consumer;
18
+
19
+ // src/elements/button.tsx
3
20
  var Button = React.forwardRef((props, ref) => {
21
+ let { isDesignMode } = useContext(WeaverseContext);
4
22
  let { text, clickAction, linkTo, openInNewTab, ...rest } = props;
5
23
  if (clickAction && linkTo) {
6
24
  return /* @__PURE__ */ React.createElement("a", {
7
- href: linkTo,
25
+ href: !isDesignMode ? linkTo : void 0,
8
26
  target: openInNewTab ? "_blank" : "_self",
9
27
  rel: "noreferrer",
10
28
  ...rest,
@@ -65,21 +83,7 @@ Container.defaultProps = {};
65
83
  var container_default = Container;
66
84
 
67
85
  // src/elements/countdown/index.tsx
68
- import React4, { forwardRef as forwardRef3, useContext, useEffect } from "react";
69
-
70
- // src/context.ts
71
- import { Weaverse } from "@weaverse/core";
72
- import { createContext } from "react";
73
- var createRootContext = (configs) => {
74
- let rootContext = new Weaverse(configs);
75
- Object.keys(Elements).forEach((key) => {
76
- rootContext.registerElement(Elements[key]);
77
- });
78
- return rootContext;
79
- };
80
- var WeaverseContext = createContext({});
81
- var WeaverseContextProvider = WeaverseContext.Provider;
82
- var WeaverseContextConsumer = WeaverseContext.Consumer;
86
+ import React4, { forwardRef as forwardRef3, useContext as useContext2, useEffect } from "react";
83
87
 
84
88
  // src/elements/countdown/timer-block.tsx
85
89
  import React3 from "react";
@@ -88,7 +92,7 @@ function TimerBlock({ value, label }) {
88
92
  className: "wv-cd-block"
89
93
  }, /* @__PURE__ */ React3.createElement("div", {
90
94
  className: "wv-cd-number"
91
- }, value.toString().padStart(2, "0")), label && /* @__PURE__ */ React3.createElement("div", {
95
+ }, typeof value === "string" ? value : value.toString().padStart(2, "0")), label && /* @__PURE__ */ React3.createElement("div", {
92
96
  className: "wv-cd-label"
93
97
  }, label));
94
98
  }
@@ -111,14 +115,15 @@ function getTime(_seconds) {
111
115
  }
112
116
 
113
117
  // src/elements/countdown/index.tsx
118
+ var countdownKey = "wv-cd-evergreen-start";
114
119
  var Countdown = forwardRef3(
115
120
  (props, ref) => {
116
- const { isDesignMode } = useContext(WeaverseContext);
121
+ const { isDesignMode } = useContext2(WeaverseContext);
117
122
  let {
118
123
  timerType,
119
- startTime,
120
- endTime,
121
- periods,
124
+ startTime: startTimeProp,
125
+ endTime: endTimeProp,
126
+ periods: periodsProp,
122
127
  redirectUrl,
123
128
  openInNewTab,
124
129
  showColon,
@@ -126,25 +131,48 @@ var Countdown = forwardRef3(
126
131
  ...rest
127
132
  } = props;
128
133
  const [remaining, setRemaining] = React4.useState(0);
129
- if (typeof endTime !== "number") {
130
- endTime = Number.parseInt(endTime);
131
- }
132
- useEffect(() => {
133
- const flag = setInterval(() => {
134
- const remainingTime = Math.max(
135
- (timerType === "fixed-time" ? new Date(endTime).getTime() : new Date(startTime).getTime() + periods * 60 * 1e3) - Date.now(),
136
- 0
137
- );
138
- if (!isDesignMode && redirectUrl && remainingTime > 0 && remainingTime < 1e3) {
139
- window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
140
- clearInterval(flag);
134
+ let periods = periodsProp * 60 * 1e3;
135
+ const handleEnd = () => {
136
+ if (!isDesignMode && redirectUrl)
137
+ window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
138
+ };
139
+ const getStartTime = () => {
140
+ let startTime = startTimeProp;
141
+ if (timerType === "evergreen") {
142
+ const start = localStorage.getItem(countdownKey);
143
+ if (start) {
144
+ startTime = Number.parseInt(start);
145
+ if (startTime + periods < Date.now()) {
146
+ startTime = Date.now();
147
+ localStorage.setItem(countdownKey, startTime.toString());
148
+ }
149
+ } else {
150
+ startTime = Date.now();
151
+ localStorage.setItem(countdownKey, startTime.toString());
141
152
  }
142
- setRemaining(remainingTime);
143
- }, 1e3);
153
+ }
154
+ return startTime;
155
+ };
156
+ const checkActive = (startTime) => startTime < Date.now() && endTimeProp > Date.now();
157
+ const handleRemaining = () => {
158
+ let startTime = getStartTime();
159
+ let endTime = timerType === "fixed-time" ? endTimeProp : startTime + periods;
160
+ let isActive = checkActive(startTime);
161
+ const remainingTime = isActive ? Math.max(endTime - Date.now(), 0) : 0;
162
+ if (remainingTime > 0 && remainingTime < 1e3) {
163
+ handleEnd();
164
+ }
165
+ setRemaining(remainingTime);
166
+ };
167
+ useEffect(() => {
168
+ let intervalFlag = setInterval(
169
+ handleRemaining,
170
+ 1e3
171
+ );
144
172
  return () => {
145
- clearInterval(flag);
173
+ clearInterval(intervalFlag);
146
174
  };
147
- }, [startTime, endTime, periods, timerType]);
175
+ }, [startTimeProp, endTimeProp, periods, timerType]);
148
176
  const timer = getTime(remaining);
149
177
  return /* @__PURE__ */ React4.createElement("div", {
150
178
  ref,
@@ -154,7 +182,7 @@ var Countdown = forwardRef3(
154
182
  key: time
155
183
  }, /* @__PURE__ */ React4.createElement(TimerBlock, {
156
184
  label: showLabel ? time : "",
157
- value: timer[time]
185
+ value: remaining === 0 ? "--" : timer[time]
158
186
  }), time !== "seconds" && /* @__PURE__ */ React4.createElement("div", null, /* @__PURE__ */ React4.createElement("span", {
159
187
  className: `wv-cd-number ${showColon ? "" : "hidden"}`
160
188
  }, ":")));
@@ -190,9 +218,9 @@ var css3 = {
190
218
  Countdown.defaultProps = {
191
219
  timerType: "fixed-time",
192
220
  startTime: Date.now(),
193
- endTime: 1666756528e3,
221
+ endTime: Date.now() + 1e3 * 60 * 60 * 24,
194
222
  periods: 90,
195
- redirectUrl: "https://myshop.com",
223
+ redirectUrl: "",
196
224
  openInNewTab: false,
197
225
  showLabel: true,
198
226
  showColon: true
@@ -404,9 +432,9 @@ Text.defaultProps = {
404
432
  var text_default = Text;
405
433
 
406
434
  // src/elements/video.tsx
407
- import React9, { forwardRef as forwardRef7, useContext as useContext2 } from "react";
435
+ import React9, { forwardRef as forwardRef7, useContext as useContext3 } from "react";
408
436
  var Video = forwardRef7((props, ref) => {
409
- let { isDesignMode } = useContext2(WeaverseContext);
437
+ let { isDesignMode } = useContext3(WeaverseContext);
410
438
  let { src, type, controls, poster, autoPlay, loop, muted, ...rest } = props;
411
439
  return /* @__PURE__ */ React9.createElement("div", {
412
440
  ref,
@@ -603,7 +631,7 @@ var Elements = {
603
631
 
604
632
  // src/renderer.tsx
605
633
  import { isBrowser } from "@weaverse/core";
606
- import React12, { useContext as useContext3, useEffect as useEffect3, useRef, useState as useState2 } from "react";
634
+ import React12, { useContext as useContext4, useEffect as useEffect3, useRef, useState as useState2 } from "react";
607
635
 
608
636
  // src/utils/index.ts
609
637
  function shortCssObject(css10) {
@@ -614,11 +642,10 @@ function shortCssObject(css10) {
614
642
  }
615
643
  var permanentClasses = {};
616
644
  function generateItemClass(instance, stitchesInstance) {
617
- var _a, _b;
618
645
  let { css: css10, type, className: cls = "" } = instance.data;
619
646
  let className = "";
620
647
  let permanentClass = "";
621
- let perCss = (_a = instance.Element) == null ? void 0 : _a.permanentCss;
648
+ let perCss = instance.Element?.permanentCss;
622
649
  if (perCss) {
623
650
  if (type in permanentClasses) {
624
651
  permanentClass = permanentClasses[type];
@@ -633,7 +660,7 @@ function generateItemClass(instance, stitchesInstance) {
633
660
  let formattedCss = shortCssObject(css10);
634
661
  let { className: newClass = "" } = stitchesInstance.css(formattedCss)();
635
662
  let { stitchesClass } = instance;
636
- let otherClass = (((_b = instance.ref.current) == null ? void 0 : _b.className) || "").replace(stitchesClass, "").replace(cls, "").replace(permanentClass, "").trim();
663
+ let otherClass = (instance.ref.current?.className || "").replace(stitchesClass, "").replace(cls, "").replace(permanentClass, "").trim();
637
664
  className = `${permanentClass} ${cls} ${newClass} ${otherClass}`.trim();
638
665
  instance.stitchesClass = newClass;
639
666
  }
@@ -642,7 +669,6 @@ function generateItemClass(instance, stitchesInstance) {
642
669
 
643
670
  // src/renderer.tsx
644
671
  var WeaverseRoot = ({ context }) => {
645
- var _a, _b;
646
672
  let [, setData] = useState2(context.projectData);
647
673
  let rootRef = useRef();
648
674
  let renderRoot = () => setData({});
@@ -653,9 +679,9 @@ var WeaverseRoot = ({ context }) => {
653
679
  context.unsubscribe(renderRoot);
654
680
  };
655
681
  }, []);
656
- let eventHandlers = ((_a = context == null ? void 0 : context.studioBridge) == null ? void 0 : _a.eventHandlers) || {};
682
+ let eventHandlers = context?.studioBridge?.eventHandlers || {};
657
683
  let themeClass = context.stitchesInstance.theme.className;
658
- if ((_b = context.projectData) == null ? void 0 : _b.rootId) {
684
+ if (context.projectData?.rootId) {
659
685
  return /* @__PURE__ */ React12.createElement("div", {
660
686
  className: `weaverse-content-root ${themeClass}`,
661
687
  ...eventHandlers,
@@ -669,7 +695,7 @@ var WeaverseRoot = ({ context }) => {
669
695
  return null;
670
696
  };
671
697
  var ItemComponent = ({ instance }) => {
672
- let { stitchesInstance, elementInstances } = useContext3(WeaverseContext);
698
+ let { stitchesInstance, elementInstances } = useContext4(WeaverseContext);
673
699
  let [data, setData] = useState2(instance.data);
674
700
  let { id, type, childIds = [], css: css10, className, ...rest } = data;
675
701
  useEffect3(() => {
@@ -683,7 +709,7 @@ var ItemComponent = ({ instance }) => {
683
709
  return () => instance.unsubscribe(render);
684
710
  }, []);
685
711
  let Element = elementInstances.get(type);
686
- if (Element == null ? void 0 : Element.Component) {
712
+ if (Element?.Component) {
687
713
  let Component = Element.Component;
688
714
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
689
715
  rest.ref = instance.ref;
@@ -704,7 +730,7 @@ var ItemComponent = ({ instance }) => {
704
730
  }
705
731
  };
706
732
  var ItemInstance = ({ id }) => {
707
- let context = useContext3(WeaverseContext);
733
+ let context = useContext4(WeaverseContext);
708
734
  let { itemInstances } = context;
709
735
  let instance = itemInstances.get(id);
710
736
  if (!instance) {
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.7.20",
2
+ "version": "0.7.22",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -31,7 +31,7 @@
31
31
  "name": "@weaverse/react",
32
32
  "author": "Weaverse Team",
33
33
  "dependencies": {
34
- "@weaverse/core": "0.7.20",
34
+ "@weaverse/core": "0.7.22",
35
35
  "nuka-carousel": "^5.4.0"
36
36
  }
37
37
  }