@weaverse/react 0.7.27 → 0.7.30

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
@@ -27,8 +27,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
27
27
  // src/index.ts
28
28
  var src_exports = {};
29
29
  __export(src_exports, {
30
+ Components: () => Components,
30
31
  Elements: () => Elements,
31
- SharedComponents: () => SharedComponents,
32
32
  WeaverseContext: () => WeaverseContext,
33
33
  WeaverseContextConsumer: () => WeaverseContextConsumer,
34
34
  WeaverseContextProvider: () => WeaverseContextProvider,
@@ -36,28 +36,17 @@ __export(src_exports, {
36
36
  createRootContext: () => createRootContext
37
37
  });
38
38
  module.exports = __toCommonJS(src_exports);
39
-
40
- // src/elements/button.tsx
41
- var React = __toESM(require("react"));
42
- var import_react2 = require("react");
39
+ __reExport(src_exports, require("@weaverse/core"), module.exports);
43
40
 
44
41
  // src/context.ts
45
42
  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;
43
+ var import_react14 = require("react");
57
44
 
58
- // src/elements/button.tsx
45
+ // src/elements/Button.tsx
46
+ var React = __toESM(require("react"));
47
+ var import_react = require("react");
59
48
  var Button = React.forwardRef((props, ref) => {
60
- let { isDesignMode } = (0, import_react2.useContext)(WeaverseContext);
49
+ let { isDesignMode } = (0, import_react.useContext)(WeaverseContext);
61
50
  let { text, clickAction, linkTo, openInNewTab, ...rest } = props;
62
51
  if (clickAction && linkTo) {
63
52
  return /* @__PURE__ */ React.createElement("a", {
@@ -91,14 +80,14 @@ var css = {
91
80
  textDecoration: "none"
92
81
  }
93
82
  };
94
- var button_default = Button;
83
+ var Button_default = Button;
95
84
 
96
- // src/elements/container.tsx
97
- var import_react3 = __toESM(require("react"));
98
- var Container = (0, import_react3.forwardRef)(
85
+ // src/elements/Container.tsx
86
+ var import_react2 = __toESM(require("react"));
87
+ var Container = (0, import_react2.forwardRef)(
99
88
  (props, ref) => {
100
89
  let { children, ...rest } = props;
101
- return /* @__PURE__ */ import_react3.default.createElement("div", {
90
+ return /* @__PURE__ */ import_react2.default.createElement("div", {
102
91
  ref,
103
92
  ...rest
104
93
  }, children);
@@ -119,45 +108,92 @@ var css2 = {
119
108
  }
120
109
  };
121
110
  Container.defaultProps = {};
122
- var container_default = Container;
123
-
124
- // src/elements/countdown/index.tsx
125
- var import_react5 = __toESM(require("react"));
111
+ var Container_default = Container;
126
112
 
127
- // src/elements/countdown/timer-block.tsx
113
+ // src/elements/Countdown/index.tsx
128
114
  var import_react4 = __toESM(require("react"));
129
- function TimerBlock({ value, label }) {
130
- return /* @__PURE__ */ import_react4.default.createElement("div", {
131
- className: "wv-cd-block"
132
- }, /* @__PURE__ */ import_react4.default.createElement("div", {
133
- className: "wv-cd-number"
134
- }, typeof value === "string" ? value : value.toString().padStart(2, "0")), label && /* @__PURE__ */ import_react4.default.createElement("div", {
135
- className: "wv-cd-label"
136
- }, label));
115
+
116
+ // src/constant/index.ts
117
+ var TIMES = ["days", "hours", "minutes", "seconds"];
118
+ var COUNTDOWN_KEY = "wv-cd-evergreen-start";
119
+ var INSTAGRAM_API = "https://graph.instagram.com";
120
+
121
+ // src/utils/css.ts
122
+ function shortCssObject(css10) {
123
+ return {
124
+ "@desktop": css10["@desktop"],
125
+ "@mobile": css10["@mobile"]
126
+ };
127
+ }
128
+ var permanentClasses = {};
129
+ function generateItemClass(instance, stitchesInstance) {
130
+ let { css: css10, type, className: cls = "" } = instance.data;
131
+ let className = "";
132
+ let permanentClass = "";
133
+ let perCss = instance.Element?.permanentCss;
134
+ if (perCss) {
135
+ if (type in permanentClasses) {
136
+ permanentClass = permanentClasses[type];
137
+ } else {
138
+ let { className: perCls } = stitchesInstance.css(perCss)();
139
+ Object.assign(permanentClasses, { [type]: perCls });
140
+ permanentClass = perCls;
141
+ }
142
+ }
143
+ className = permanentClass;
144
+ if (css10) {
145
+ let formattedCss = shortCssObject(css10);
146
+ let { className: newClass = "" } = stitchesInstance.css(formattedCss)();
147
+ let { stitchesClass } = instance;
148
+ let otherClass = (instance.ref.current?.className || "").replace(stitchesClass, "").replace(cls, "").replace(permanentClass, "").trim();
149
+ className = `${permanentClass} ${cls} ${newClass} ${otherClass}`.trim();
150
+ instance.stitchesClass = newClass;
151
+ }
152
+ return className;
137
153
  }
138
154
 
139
- // src/elements/countdown/utils.ts
140
- var times = ["days", "hours", "minutes", "seconds"];
155
+ // src/utils/index.ts
141
156
  function getTime(_seconds) {
142
- const ONE_MINUTE = 60 * 1e3;
143
- const ONE_HOUR = 60 * ONE_MINUTE;
144
- const ONE_DAY = 24 * ONE_HOUR;
145
- const days = Math.floor(_seconds / ONE_DAY);
146
- const hours = Math.floor((_seconds - days * ONE_DAY) / ONE_HOUR);
147
- const minutes = Math.floor(
157
+ let ONE_MINUTE = 60 * 1e3;
158
+ let ONE_HOUR = 60 * ONE_MINUTE;
159
+ let ONE_DAY = 24 * ONE_HOUR;
160
+ let days = Math.floor(_seconds / ONE_DAY);
161
+ let hours = Math.floor((_seconds - days * ONE_DAY) / ONE_HOUR);
162
+ let minutes = Math.floor(
148
163
  (_seconds - days * ONE_DAY - hours * ONE_HOUR) / ONE_MINUTE
149
164
  );
150
- const seconds = Math.floor(
165
+ let seconds = Math.floor(
151
166
  (_seconds - days * ONE_DAY - hours * ONE_HOUR - minutes * ONE_MINUTE) / 1e3
152
167
  );
153
168
  return { days, hours, minutes, seconds };
154
169
  }
170
+ function getYoutubeEmbedId(url) {
171
+ const match = url.match(
172
+ /(?:https?:\/\/)?(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch\?v=)?(.+)/
173
+ );
174
+ return match ? match[1] : null;
175
+ }
176
+ function getVimeoId(url) {
177
+ const match = url.match(/(?:https?:\/\/)?(?:www\.)?vimeo\.com\/(.+)/);
178
+ return match ? match[1] : null;
179
+ }
180
+
181
+ // src/elements/Countdown/TimerBlock.tsx
182
+ var import_react3 = __toESM(require("react"));
183
+ function TimerBlock({ value, label }) {
184
+ return /* @__PURE__ */ import_react3.default.createElement("div", {
185
+ className: "wv-cd-block"
186
+ }, /* @__PURE__ */ import_react3.default.createElement("div", {
187
+ className: "wv-cd-number"
188
+ }, typeof value === "string" ? value : value.toString().padStart(2, "0")), label && /* @__PURE__ */ import_react3.default.createElement("div", {
189
+ className: "wv-cd-label"
190
+ }, label));
191
+ }
155
192
 
156
- // src/elements/countdown/index.tsx
157
- var countdownKey = "wv-cd-evergreen-start";
158
- var Countdown = (0, import_react5.forwardRef)(
193
+ // src/elements/Countdown/index.tsx
194
+ var Countdown = (0, import_react4.forwardRef)(
159
195
  (props, ref) => {
160
- const { isDesignMode } = (0, import_react5.useContext)(WeaverseContext);
196
+ const { isDesignMode } = (0, import_react4.useContext)(WeaverseContext);
161
197
  let {
162
198
  timerType,
163
199
  startTime: startTimeProp,
@@ -169,7 +205,7 @@ var Countdown = (0, import_react5.forwardRef)(
169
205
  showLabel,
170
206
  ...rest
171
207
  } = props;
172
- const [remaining, setRemaining] = import_react5.default.useState(0);
208
+ const [remaining, setRemaining] = import_react4.default.useState(0);
173
209
  let periods = periodsProp * 60 * 1e3;
174
210
  const handleEnd = () => {
175
211
  if (!isDesignMode && redirectUrl)
@@ -178,16 +214,16 @@ var Countdown = (0, import_react5.forwardRef)(
178
214
  const getStartTime = () => {
179
215
  let startTime = startTimeProp;
180
216
  if (timerType === "evergreen") {
181
- const start = localStorage.getItem(countdownKey);
217
+ const start = localStorage.getItem(COUNTDOWN_KEY);
182
218
  if (start) {
183
219
  startTime = Number.parseInt(start);
184
220
  if (startTime + periods < Date.now()) {
185
221
  startTime = Date.now();
186
- localStorage.setItem(countdownKey, startTime.toString());
222
+ localStorage.setItem(COUNTDOWN_KEY, startTime.toString());
187
223
  }
188
224
  } else {
189
225
  startTime = Date.now();
190
- localStorage.setItem(countdownKey, startTime.toString());
226
+ localStorage.setItem(COUNTDOWN_KEY, startTime.toString());
191
227
  }
192
228
  }
193
229
  return startTime;
@@ -203,7 +239,7 @@ var Countdown = (0, import_react5.forwardRef)(
203
239
  }
204
240
  setRemaining(remainingTime);
205
241
  };
206
- (0, import_react5.useEffect)(() => {
242
+ (0, import_react4.useEffect)(() => {
207
243
  let intervalFlag = setInterval(
208
244
  handleRemaining,
209
245
  1e3
@@ -213,16 +249,16 @@ var Countdown = (0, import_react5.forwardRef)(
213
249
  };
214
250
  }, [startTimeProp, endTimeProp, periods, timerType]);
215
251
  const timer = getTime(remaining);
216
- return /* @__PURE__ */ import_react5.default.createElement("div", {
252
+ return /* @__PURE__ */ import_react4.default.createElement("div", {
217
253
  ref,
218
254
  ...rest
219
- }, times.map((time) => {
220
- return /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, {
255
+ }, TIMES.map((time) => {
256
+ return /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, {
221
257
  key: time
222
- }, /* @__PURE__ */ import_react5.default.createElement(TimerBlock, {
258
+ }, /* @__PURE__ */ import_react4.default.createElement(TimerBlock, {
223
259
  label: showLabel ? time : "",
224
260
  value: remaining === 0 ? "--" : timer[time]
225
- }), time !== "seconds" && /* @__PURE__ */ import_react5.default.createElement("div", null, /* @__PURE__ */ import_react5.default.createElement("span", {
261
+ }), time !== "seconds" && /* @__PURE__ */ import_react4.default.createElement("div", null, /* @__PURE__ */ import_react4.default.createElement("span", {
226
262
  className: `wv-cd-number ${showColon ? "" : "hidden"}`
227
263
  }, ":")));
228
264
  }));
@@ -264,11 +300,11 @@ Countdown.defaultProps = {
264
300
  showLabel: true,
265
301
  showColon: true
266
302
  };
267
- var countdown_default = Countdown;
303
+ var Countdown_default = Countdown;
268
304
 
269
- // src/elements/image.tsx
270
- var import_react6 = __toESM(require("react"));
271
- var Image = import_react6.default.forwardRef(
305
+ // src/elements/Image.tsx
306
+ var import_react5 = __toESM(require("react"));
307
+ var Image = import_react5.default.forwardRef(
272
308
  (props, ref) => {
273
309
  let {
274
310
  src,
@@ -284,18 +320,18 @@ var Image = import_react6.default.forwardRef(
284
320
  "--wv-img-object-fit": objectFit,
285
321
  "--wv-img-object-position": objectPosition
286
322
  };
287
- let content = /* @__PURE__ */ import_react6.default.createElement("img", {
323
+ let content = /* @__PURE__ */ import_react5.default.createElement("img", {
288
324
  alt,
289
325
  "data-blink-src": src
290
326
  });
291
327
  if (onClickAction === "open-link" && linkTo) {
292
328
  let target = openLinkInNewTab ? "_blank" : "_self";
293
- content = /* @__PURE__ */ import_react6.default.createElement("a", {
329
+ content = /* @__PURE__ */ import_react5.default.createElement("a", {
294
330
  href: linkTo,
295
331
  target
296
332
  }, content);
297
333
  }
298
- return /* @__PURE__ */ import_react6.default.createElement("div", {
334
+ return /* @__PURE__ */ import_react5.default.createElement("div", {
299
335
  ref,
300
336
  ...rest,
301
337
  style
@@ -324,11 +360,11 @@ Image.defaultProps = {
324
360
  openLinkInNewTab: false,
325
361
  linkTo: ""
326
362
  };
327
- var image_default = Image;
363
+ var Image_default = Image;
328
364
 
329
- // src/elements/layout.tsx
330
- var import_react7 = __toESM(require("react"));
331
- var Layout = (0, import_react7.forwardRef)((props, ref) => {
365
+ // src/elements/Layout.tsx
366
+ var import_react6 = __toESM(require("react"));
367
+ var Layout = (0, import_react6.forwardRef)((props, ref) => {
332
368
  let {
333
369
  children,
334
370
  rows,
@@ -349,15 +385,15 @@ var Layout = (0, import_react7.forwardRef)((props, ref) => {
349
385
  "--row-size": rowSize + "px",
350
386
  "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))"
351
387
  };
352
- return /* @__PURE__ */ import_react7.default.createElement("section", {
388
+ return /* @__PURE__ */ import_react6.default.createElement("section", {
353
389
  ref,
354
390
  ...rest,
355
391
  style
356
- }, /* @__PURE__ */ import_react7.default.createElement(LayoutBackground, {
392
+ }, /* @__PURE__ */ import_react6.default.createElement(LayoutBackground, {
357
393
  imgUrl: backgroundImage,
358
394
  bgColor: backgroundColor,
359
395
  objectFit
360
- }), /* @__PURE__ */ import_react7.default.createElement("div", {
396
+ }), /* @__PURE__ */ import_react6.default.createElement("div", {
361
397
  "data-layout-content": true
362
398
  }, children));
363
399
  });
@@ -367,10 +403,10 @@ var LayoutBackground = (props) => {
367
403
  ["--bg-color"]: bgColor,
368
404
  ["--object-fit"]: objectFit
369
405
  };
370
- return imgUrl || bgColor ? /* @__PURE__ */ import_react7.default.createElement("div", {
406
+ return imgUrl || bgColor ? /* @__PURE__ */ import_react6.default.createElement("div", {
371
407
  "data-wv-bg": true,
372
408
  style
373
- }, imgUrl && /* @__PURE__ */ import_react7.default.createElement("img", {
409
+ }, imgUrl && /* @__PURE__ */ import_react6.default.createElement("img", {
374
410
  width: "100%",
375
411
  height: "100%",
376
412
  "data-blink-src": imgUrl,
@@ -419,16 +455,16 @@ Layout.defaultProps = {
419
455
  gap: 16,
420
456
  rowSize: 48
421
457
  };
422
- var layout_default = Layout;
458
+ var Layout_default = Layout;
423
459
 
424
- // src/elements/map.tsx
425
- var import_react8 = __toESM(require("react"));
426
- var Map = (0, import_react8.forwardRef)((props, ref) => {
460
+ // src/elements/Map.tsx
461
+ var import_react7 = __toESM(require("react"));
462
+ var Map = (0, import_react7.forwardRef)((props, ref) => {
427
463
  let { place, zoom, ...rest } = props;
428
- return /* @__PURE__ */ import_react8.default.createElement("div", {
464
+ return /* @__PURE__ */ import_react7.default.createElement("div", {
429
465
  ref,
430
466
  ...rest
431
- }, /* @__PURE__ */ import_react8.default.createElement("iframe", {
467
+ }, /* @__PURE__ */ import_react7.default.createElement("iframe", {
432
468
  loading: "lazy",
433
469
  scrolling: "no",
434
470
  width: "100%",
@@ -443,9 +479,9 @@ Map.defaultProps = {
443
479
  place: "Hanoi",
444
480
  zoom: 14
445
481
  };
446
- var map_default = Map;
482
+ var Map_default = Map;
447
483
 
448
- // src/elements/text.tsx
484
+ // src/elements/Text.tsx
449
485
  var React8 = __toESM(require("react"));
450
486
  var Text = React8.forwardRef(
451
487
  (props, ref) => {
@@ -468,46 +504,38 @@ var css7 = {
468
504
  Text.defaultProps = {
469
505
  value: "The quick brown fox jumps over the lazy dog"
470
506
  };
471
- var text_default = Text;
507
+ var Text_default = Text;
472
508
 
473
- // src/elements/video/index.tsx
474
- var import_react12 = __toESM(require("react"));
509
+ // src/elements/Video/index.tsx
510
+ var import_react11 = __toESM(require("react"));
475
511
 
476
- // src/elements/video/utils.ts
477
- function getYoutubeEmbedId(url) {
478
- const match = url.match(
479
- /(?:https?:\/\/)?(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch\?v=)?(.+)/
480
- );
481
- return match ? match[1] : null;
482
- }
483
- function getVimeoId(url) {
484
- const match = url.match(/(?:https?:\/\/)?(?:www\.)?vimeo\.com\/(.+)/);
485
- return match ? match[1] : null;
512
+ // src/elements/Video/HTMLVideo.tsx
513
+ var import_react8 = __toESM(require("react"));
514
+ function HTMLVideo(props) {
515
+ let { src, type, controls, autoPlay, loop, muted } = props;
516
+ return /* @__PURE__ */ import_react8.default.createElement("video", {
517
+ controls,
518
+ autoPlay,
519
+ loop,
520
+ muted,
521
+ controlsList: "nodownload",
522
+ disablePictureInPicture: true
523
+ }, /* @__PURE__ */ import_react8.default.createElement("source", {
524
+ src,
525
+ type: type || "video/mp4"
526
+ }), /* @__PURE__ */ import_react8.default.createElement("source", {
527
+ src,
528
+ type: "video/ogg"
529
+ }), "Your browser does not support the video tag.");
486
530
  }
487
531
 
488
- // src/elements/video/Youtube.tsx
532
+ // src/elements/Video/Vimeo.tsx
489
533
  var import_react9 = __toESM(require("react"));
490
- function Youtube(props) {
491
- let { youtubeId, controls, autoPlay, loop, muted } = props;
492
- let params = `autoplay=${autoPlay ? 1 : 0}&controls=${controls ? 1 : 0}&loop=${loop ? 1 : 0}&mute=${muted ? 1 : 0}`;
493
- let youtubeSrc = `https://www.youtube.com/embed/${youtubeId}?${params}`;
494
- let allow = `accelerometer;${autoPlay ? "autoplay;" : ""} clipboard-write; encrypted-media; gyroscope; picture-in-picture`;
495
- return /* @__PURE__ */ import_react9.default.createElement("iframe", {
496
- src: youtubeSrc,
497
- width: "100%",
498
- height: "100%",
499
- allowFullScreen: true,
500
- allow
501
- });
502
- }
503
-
504
- // src/elements/video/vimeo.tsx
505
- var import_react10 = __toESM(require("react"));
506
534
  function Vimeo(props) {
507
535
  let { vimeoId, controls, autoPlay, loop, muted } = props;
508
536
  let params = `autoplay=${autoPlay}&loop=${loop}&controls=${controls}&muted=${muted}`;
509
537
  let vimeoSrc = `https://player.vimeo.com/video/${vimeoId}?${params}`;
510
- return /* @__PURE__ */ import_react10.default.createElement("iframe", {
538
+ return /* @__PURE__ */ import_react9.default.createElement("iframe", {
511
539
  src: vimeoSrc,
512
540
  width: "100%",
513
541
  height: "100%",
@@ -515,29 +543,30 @@ function Vimeo(props) {
515
543
  });
516
544
  }
517
545
 
518
- // src/elements/video/html-video.tsx
519
- var import_react11 = __toESM(require("react"));
520
- function HtmlVideo(props) {
521
- let { src, type, controls, autoPlay, loop, muted } = props;
522
- return /* @__PURE__ */ import_react11.default.createElement("video", {
523
- controls,
524
- autoPlay,
525
- loop,
526
- muted,
527
- controlsList: "nodownload",
528
- disablePictureInPicture: true
529
- }, /* @__PURE__ */ import_react11.default.createElement("source", {
530
- src,
531
- type: type || "video/mp4"
532
- }), /* @__PURE__ */ import_react11.default.createElement("source", {
533
- src,
534
- type: "video/ogg"
535
- }), "Your browser does not support the video tag.");
546
+ // src/elements/Video/Youtube.tsx
547
+ var import_react10 = __toESM(require("react"));
548
+ function Youtube(props) {
549
+ let { youtubeId, controls, autoPlay, loop, muted } = props;
550
+ let params = new URLSearchParams({
551
+ autoplay: autoPlay ? "1" : "0",
552
+ controls: controls ? "1" : "0",
553
+ loop: loop ? "1" : "0",
554
+ mute: muted ? "1" : "0"
555
+ });
556
+ let youtubeSrc = `https://www.youtube.com/embed/${youtubeId}?${params.toString()}`;
557
+ let allow = `accelerometer;${autoPlay ? "autoplay;" : ""} clipboard-write; encrypted-media; gyroscope; picture-in-picture`;
558
+ return /* @__PURE__ */ import_react10.default.createElement("iframe", {
559
+ src: youtubeSrc,
560
+ width: "100%",
561
+ height: "100%",
562
+ allowFullScreen: true,
563
+ allow
564
+ });
536
565
  }
537
566
 
538
- // src/elements/video/index.tsx
539
- var Video = (0, import_react12.forwardRef)((props, ref) => {
540
- let { isDesignMode } = (0, import_react12.useContext)(WeaverseContext);
567
+ // src/elements/Video/index.tsx
568
+ var Video = (0, import_react11.forwardRef)((props, ref) => {
569
+ let { isDesignMode } = (0, import_react11.useContext)(WeaverseContext);
541
570
  let {
542
571
  src,
543
572
  controls,
@@ -553,21 +582,21 @@ var Video = (0, import_react12.forwardRef)((props, ref) => {
553
582
  let youtubeId = getYoutubeEmbedId(src);
554
583
  let vimeoId = getVimeoId(src);
555
584
  if (youtubeId) {
556
- content = /* @__PURE__ */ import_react12.default.createElement(Youtube, {
585
+ content = /* @__PURE__ */ import_react11.default.createElement(Youtube, {
557
586
  ...videoProps,
558
587
  youtubeId
559
588
  });
560
589
  } else if (vimeoId) {
561
- content = /* @__PURE__ */ import_react12.default.createElement(Vimeo, {
590
+ content = /* @__PURE__ */ import_react11.default.createElement(Vimeo, {
562
591
  ...videoProps,
563
592
  vimeoId
564
593
  });
565
594
  } else {
566
- content = /* @__PURE__ */ import_react12.default.createElement(HtmlVideo, {
595
+ content = /* @__PURE__ */ import_react11.default.createElement(HTMLVideo, {
567
596
  ...videoProps
568
597
  });
569
598
  }
570
- return /* @__PURE__ */ import_react12.default.createElement("div", {
599
+ return /* @__PURE__ */ import_react11.default.createElement("div", {
571
600
  ref,
572
601
  ...rest
573
602
  }, content);
@@ -589,35 +618,34 @@ Video.defaultProps = {
589
618
  autoPlay: true,
590
619
  muted: true
591
620
  };
592
- var video_default = Video;
593
-
594
- // src/elements/instagram.tsx
595
- var import_react14 = __toESM(require("react"));
621
+ var Video_default = Video;
596
622
 
597
- // src/elements/shared/Placeholder.tsx
623
+ // src/elements/Instagram.tsx
598
624
  var import_react13 = __toESM(require("react"));
599
- var Placeholder = (0, import_react13.forwardRef)(
625
+
626
+ // src/components/Placeholder.tsx
627
+ var import_react12 = __toESM(require("react"));
628
+ var Placeholder = (0, import_react12.forwardRef)(
600
629
  (props, ref) => {
601
630
  let { element, children, ...rest } = props;
602
- return /* @__PURE__ */ import_react13.default.createElement("div", {
631
+ return /* @__PURE__ */ import_react12.default.createElement("div", {
603
632
  "data-wv-placeholder": true,
604
633
  ref,
605
634
  ...rest
606
- }, /* @__PURE__ */ import_react13.default.createElement("div", {
635
+ }, /* @__PURE__ */ import_react12.default.createElement("div", {
607
636
  style: { fontWeight: 600, marginBottom: "10px" }
608
- }, element), /* @__PURE__ */ import_react13.default.createElement("div", null, children));
637
+ }, element), /* @__PURE__ */ import_react12.default.createElement("div", null, children));
609
638
  }
610
639
  );
611
640
  var Placeholder_default = Placeholder;
612
641
 
613
- // src/elements/instagram.tsx
614
- var INSTAGRAM_API = "https://graph.instagram.com";
615
- var Instagram = (0, import_react14.forwardRef)(
642
+ // src/elements/Instagram.tsx
643
+ var Instagram = (0, import_react13.forwardRef)(
616
644
  (props, ref) => {
617
645
  let { token, username, numberOfImages, imagesPerRow, gap, ...rest } = props;
618
- let [media, setMedia] = (0, import_react14.useState)([]);
619
- let [error, setError] = (0, import_react14.useState)(null);
620
- (0, import_react14.useEffect)(() => {
646
+ let [media, setMedia] = (0, import_react13.useState)([]);
647
+ let [error, setError] = (0, import_react13.useState)(null);
648
+ (0, import_react13.useEffect)(() => {
621
649
  if (token) {
622
650
  let params = new URLSearchParams({
623
651
  access_token: token,
@@ -634,10 +662,10 @@ var Instagram = (0, import_react14.forwardRef)(
634
662
  }
635
663
  }, [token]);
636
664
  if (!token || error) {
637
- return /* @__PURE__ */ import_react14.default.createElement("div", {
665
+ return /* @__PURE__ */ import_react13.default.createElement("div", {
638
666
  ref,
639
667
  ...rest
640
- }, /* @__PURE__ */ import_react14.default.createElement(Placeholder_default, {
668
+ }, /* @__PURE__ */ import_react13.default.createElement(Placeholder_default, {
641
669
  element: "Instagram"
642
670
  }, !token ? "Connect to Instagram to display photos on your site." : "Invalid or expired token!"));
643
671
  }
@@ -645,20 +673,20 @@ var Instagram = (0, import_react14.forwardRef)(
645
673
  "--wv-ig-images-per-row": imagesPerRow,
646
674
  "--wv-ig-images-gap": gap + "px"
647
675
  };
648
- return /* @__PURE__ */ import_react14.default.createElement("div", {
676
+ return /* @__PURE__ */ import_react13.default.createElement("div", {
649
677
  ref,
650
678
  ...rest,
651
679
  style
652
- }, /* @__PURE__ */ import_react14.default.createElement("div", {
680
+ }, /* @__PURE__ */ import_react13.default.createElement("div", {
653
681
  className: "wv-ig-media-container"
654
682
  }, media.slice(0, numberOfImages).map((item) => {
655
683
  let { id, permalink, caption, media_url } = item;
656
- return /* @__PURE__ */ import_react14.default.createElement("a", {
684
+ return /* @__PURE__ */ import_react13.default.createElement("a", {
657
685
  key: id,
658
686
  href: permalink,
659
687
  target: "_blank",
660
688
  rel: "noreferrer"
661
- }, /* @__PURE__ */ import_react14.default.createElement("img", {
689
+ }, /* @__PURE__ */ import_react13.default.createElement("img", {
662
690
  alt: caption,
663
691
  src: media_url
664
692
  }));
@@ -681,6 +709,19 @@ var permanentCss2 = {
681
709
  objectFit: "cover"
682
710
  }
683
711
  }
712
+ },
713
+ "@mobile": {
714
+ ".wv-ig-media-container": {
715
+ overflowX: "auto",
716
+ display: "flex",
717
+ scrollSnapType: "x mandatory"
718
+ },
719
+ ".wv-ig-media-container a": {
720
+ scrollSnapAlign: "start",
721
+ flexGrow: 0,
722
+ flexShrink: 0,
723
+ flexBasis: "100%"
724
+ }
684
725
  }
685
726
  };
686
727
  Instagram.defaultProps = {
@@ -690,106 +731,176 @@ Instagram.defaultProps = {
690
731
  imagesPerRow: 4,
691
732
  gap: 0
692
733
  };
693
- var instagram_default = Instagram;
734
+ var Instagram_default = Instagram;
694
735
 
695
736
  // src/elements/index.ts
696
- var SharedComponents = {
697
- Placeholder: Placeholder_default
698
- };
699
737
  var Elements = {
700
738
  Countdown: {
701
- Component: countdown_default,
739
+ Component: Countdown_default,
702
740
  type: "countdown",
703
741
  defaultCss: css3
704
742
  },
705
743
  Button: {
706
- Component: button_default,
744
+ Component: Button_default,
707
745
  type: "button",
708
746
  defaultCss: css
709
747
  },
710
748
  Container: {
711
- Component: container_default,
749
+ Component: Container_default,
712
750
  type: "container",
713
751
  defaultCss: css2
714
752
  },
715
753
  Image: {
716
- Component: image_default,
754
+ Component: Image_default,
717
755
  type: "image",
718
756
  defaultCss: css4
719
757
  },
720
758
  Instagram: {
721
- Component: instagram_default,
759
+ Component: Instagram_default,
722
760
  type: "instagram",
723
761
  defaultCss: css9,
724
762
  permanentCss: permanentCss2
725
763
  },
726
764
  Layout: {
727
- Component: layout_default,
765
+ Component: Layout_default,
728
766
  type: "layout",
729
767
  defaultCss: css5,
730
768
  permanentCss
731
769
  },
732
770
  Map: {
733
- Component: map_default,
771
+ Component: Map_default,
734
772
  type: "map",
735
773
  defaultCss: css6
736
774
  },
737
775
  Text: {
738
- Component: text_default,
776
+ Component: Text_default,
739
777
  type: "text",
740
778
  defaultCss: css7
741
779
  },
742
780
  Video: {
743
- Component: video_default,
781
+ Component: Video_default,
744
782
  type: "video",
745
783
  defaultCss: css8
746
784
  }
747
785
  };
748
786
 
749
- // src/renderer.tsx
750
- var import_core2 = require("@weaverse/core");
751
- var import_react15 = __toESM(require("react"));
787
+ // src/context.ts
788
+ var createRootContext = (configs) => {
789
+ let rootContext = new import_core.Weaverse(configs);
790
+ Object.keys(Elements).forEach((key) => {
791
+ rootContext.registerElement(Elements[key]);
792
+ });
793
+ return rootContext;
794
+ };
795
+ var WeaverseContext = (0, import_react14.createContext)({});
796
+ var WeaverseContextProvider = WeaverseContext.Provider;
797
+ var WeaverseContextConsumer = WeaverseContext.Consumer;
752
798
 
753
- // src/utils/index.ts
754
- function shortCssObject(css10) {
755
- return {
756
- "@desktop": css10["@desktop"],
757
- "@mobile": css10["@mobile"]
758
- };
759
- }
760
- var permanentClasses = {};
761
- function generateItemClass(instance, stitchesInstance) {
762
- let { css: css10, type, className: cls = "" } = instance.data;
763
- let className = "";
764
- let permanentClass = "";
765
- let perCss = instance.Element?.permanentCss;
766
- if (perCss) {
767
- if (type in permanentClasses) {
768
- permanentClass = permanentClasses[type];
769
- } else {
770
- let { className: perCls } = stitchesInstance.css(perCss)();
771
- Object.assign(permanentClasses, { [type]: perCls });
772
- permanentClass = perCls;
773
- }
774
- }
775
- className = permanentClass;
776
- if (css10) {
777
- let formattedCss = shortCssObject(css10);
778
- let { className: newClass = "" } = stitchesInstance.css(formattedCss)();
779
- let { stitchesClass } = instance;
780
- let otherClass = (instance.ref.current?.className || "").replace(stitchesClass, "").replace(cls, "").replace(permanentClass, "").trim();
781
- className = `${permanentClass} ${cls} ${newClass} ${otherClass}`.trim();
782
- instance.stitchesClass = newClass;
799
+ // src/components/Modal.tsx
800
+ var Modal_exports = {};
801
+ __export(Modal_exports, {
802
+ Modal: () => Modal,
803
+ ModalClose: () => ModalClose,
804
+ ModalContent: () => ModalContent,
805
+ ModalHeader: () => ModalHeader,
806
+ ModalTrigger: () => ModalTrigger
807
+ });
808
+ var import_react15 = __toESM(require("react"));
809
+ var import_react_dialog = require("@radix-ui/react-dialog");
810
+ var import_react16 = require("@stitches/react");
811
+ var Modal = import_react_dialog.Root;
812
+ var ModalTrigger = import_react_dialog.Trigger;
813
+ var ModalHeader = (0, import_react16.styled)(import_react_dialog.Title, {
814
+ margin: 0,
815
+ fontWeight: 500,
816
+ color: "#ededef",
817
+ fontSize: 17
818
+ });
819
+ var ModalContent = (0, import_react15.forwardRef)(
820
+ (props, ref) => {
821
+ let { children, ...rest } = props;
822
+ return /* @__PURE__ */ import_react15.default.createElement(import_react_dialog.Portal, null, /* @__PURE__ */ import_react15.default.createElement(StyledOverlay, null), /* @__PURE__ */ import_react15.default.createElement(StyledContent, {
823
+ ...rest,
824
+ onCloseAutoFocus: (e) => e.preventDefault(),
825
+ ref
826
+ }, /* @__PURE__ */ import_react15.default.createElement("div", null, /* @__PURE__ */ import_react15.default.createElement(ModalClose, null), /* @__PURE__ */ import_react15.default.createElement("div", null, children))));
783
827
  }
784
- return className;
828
+ );
829
+ var ModalClose = import_react_dialog.Close;
830
+ ModalClose.defaultProps = {
831
+ asChild: true
832
+ };
833
+ var overlayShow = (0, import_react16.keyframes)({
834
+ "0%": { opacity: 0 },
835
+ "100%": { opacity: 1 }
836
+ });
837
+ var contentShow = (0, import_react16.keyframes)({
838
+ "0%": { opacity: 0, transform: "translate(-50%, -48%) scale(.96)" },
839
+ "100%": { opacity: 1, transform: "translate(-50%, -50%) scale(1)" }
840
+ });
841
+ var StyledOverlay = (0, import_react16.styled)(import_react_dialog.Overlay, {
842
+ backgroundColor: "#707070",
843
+ position: "fixed",
844
+ zIndex: 9999,
845
+ inset: 0,
846
+ animation: `${overlayShow} 150ms cubic-bezier(0.16, 1, 0.3, 1)`
847
+ });
848
+ var StyledContent = (0, import_react16.styled)(import_react_dialog.Content, {
849
+ backgroundColor: "white",
850
+ borderRadius: 6,
851
+ boxShadow: "hsl(206 22% 7% / 35%) 0px 10px 38px -10px, hsl(206 22% 7% / 20%) 0px 10px 20px -15px",
852
+ position: "fixed",
853
+ top: "50%",
854
+ left: "50%",
855
+ transform: "translate(-50%, -50%)",
856
+ width: "90vw",
857
+ maxWidth: "450px",
858
+ maxHeight: "85vh",
859
+ padding: 25,
860
+ animation: `${contentShow} 150ms cubic-bezier(0.16, 1, 0.3, 1)`,
861
+ "&:focus": { outline: "none" },
862
+ zIndex: 9999
863
+ });
864
+
865
+ // src/components/Spinner.tsx
866
+ var import_react17 = __toESM(require("react"));
867
+ function Spinner() {
868
+ return /* @__PURE__ */ import_react17.default.createElement("span", {
869
+ className: "wv-spinner-wrapper"
870
+ }, /* @__PURE__ */ import_react17.default.createElement("svg", {
871
+ className: "wv-spinner",
872
+ xmlns: "http://www.w3.org/2000/svg",
873
+ fill: "none",
874
+ viewBox: "0 0 24 24"
875
+ }, /* @__PURE__ */ import_react17.default.createElement("circle", {
876
+ style: { opacity: ".25" },
877
+ cx: "12",
878
+ cy: "12",
879
+ r: "10",
880
+ stroke: "currentColor",
881
+ strokeWidth: "4"
882
+ }), /* @__PURE__ */ import_react17.default.createElement("path", {
883
+ style: { opacity: ".75" },
884
+ fill: "currentColor",
885
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
886
+ })));
785
887
  }
786
888
 
889
+ // src/components/index.ts
890
+ var Components = {
891
+ Placeholder: Placeholder_default,
892
+ Spinner,
893
+ ModalComponents: Modal_exports
894
+ };
895
+
787
896
  // src/renderer.tsx
897
+ var import_core2 = require("@weaverse/core");
898
+ var import_react18 = __toESM(require("react"));
788
899
  var WeaverseRoot = ({ context }) => {
789
- let [, setData] = (0, import_react15.useState)(context.projectData);
790
- let rootRef = (0, import_react15.useRef)();
900
+ let [, setData] = (0, import_react18.useState)(context.projectData);
901
+ let rootRef = (0, import_react18.useRef)();
791
902
  let renderRoot = () => setData({});
792
- (0, import_react15.useEffect)(() => {
903
+ (0, import_react18.useEffect)(() => {
793
904
  context.subscribe(renderRoot);
794
905
  context.contentRootElement = rootRef.current;
795
906
  return () => {
@@ -799,23 +910,23 @@ var WeaverseRoot = ({ context }) => {
799
910
  let eventHandlers = context?.studioBridge?.eventHandlers || {};
800
911
  let themeClass = context.stitchesInstance.theme.className;
801
912
  if (context.projectData?.rootId) {
802
- return /* @__PURE__ */ import_react15.default.createElement("div", {
913
+ return /* @__PURE__ */ import_react18.default.createElement("div", {
803
914
  className: `weaverse-content-root ${themeClass}`,
804
915
  ...eventHandlers,
805
916
  ref: rootRef
806
- }, /* @__PURE__ */ import_react15.default.createElement(WeaverseContextProvider, {
917
+ }, /* @__PURE__ */ import_react18.default.createElement(WeaverseContextProvider, {
807
918
  value: context
808
- }, /* @__PURE__ */ import_react15.default.createElement(ItemInstance, {
919
+ }, /* @__PURE__ */ import_react18.default.createElement(ItemInstance, {
809
920
  id: context.projectData.rootId
810
921
  })));
811
922
  }
812
923
  return null;
813
924
  };
814
925
  var ItemComponent = ({ instance }) => {
815
- let { stitchesInstance, elementInstances } = (0, import_react15.useContext)(WeaverseContext);
816
- let [data, setData] = (0, import_react15.useState)(instance.data);
926
+ let { stitchesInstance, elementInstances } = (0, import_react18.useContext)(WeaverseContext);
927
+ let [data, setData] = (0, import_react18.useState)(instance.data);
817
928
  let { id, type, childIds = [], css: css10, className, ...rest } = data;
818
- (0, import_react15.useEffect)(() => {
929
+ (0, import_react18.useEffect)(() => {
819
930
  let render = (data2) => setData({ ...data2 });
820
931
  instance.subscribe(render);
821
932
  if (import_core2.isBrowser && !instance.ref.current) {
@@ -831,13 +942,13 @@ var ItemComponent = ({ instance }) => {
831
942
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
832
943
  rest.ref = instance.ref;
833
944
  }
834
- return /* @__PURE__ */ import_react15.default.createElement(Component, {
945
+ return /* @__PURE__ */ import_react18.default.createElement(Component, {
835
946
  key: id,
836
947
  "data-wv-type": type,
837
948
  "data-wv-id": id,
838
949
  className: generateItemClass(instance, stitchesInstance),
839
950
  ...rest
840
- }, childIds.map((id2) => /* @__PURE__ */ import_react15.default.createElement(ItemInstance, {
951
+ }, childIds.map((id2) => /* @__PURE__ */ import_react18.default.createElement(ItemInstance, {
841
952
  key: id2,
842
953
  id: id2
843
954
  })));
@@ -847,26 +958,23 @@ var ItemComponent = ({ instance }) => {
847
958
  }
848
959
  };
849
960
  var ItemInstance = ({ id }) => {
850
- let context = (0, import_react15.useContext)(WeaverseContext);
961
+ let context = (0, import_react18.useContext)(WeaverseContext);
851
962
  let { itemInstances } = context;
852
963
  let instance = itemInstances.get(id);
853
964
  if (!instance) {
854
- return /* @__PURE__ */ import_react15.default.createElement("div", {
965
+ return /* @__PURE__ */ import_react18.default.createElement("div", {
855
966
  style: { display: "none" }
856
967
  }, "Item instance ", id, " not found");
857
968
  }
858
- return /* @__PURE__ */ import_react15.default.createElement(ItemComponent, {
969
+ return /* @__PURE__ */ import_react18.default.createElement(ItemComponent, {
859
970
  key: id,
860
971
  instance
861
972
  });
862
973
  };
863
-
864
- // src/index.ts
865
- __reExport(src_exports, require("@weaverse/core"), module.exports);
866
974
  // Annotate the CommonJS export names for ESM import in node:
867
975
  0 && (module.exports = {
976
+ Components,
868
977
  Elements,
869
- SharedComponents,
870
978
  WeaverseContext,
871
979
  WeaverseContextConsumer,
872
980
  WeaverseContextProvider,