@weaverse/react 0.7.26 → 0.7.28

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
+ }
155
180
 
156
- // src/elements/countdown/index.tsx
157
- var countdownKey = "wv-cd-evergreen-start";
158
- var Countdown = (0, import_react5.forwardRef)(
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
+ }
192
+
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,30 +504,102 @@ 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.tsx
474
- var import_react9 = __toESM(require("react"));
475
- var Video = (0, import_react9.forwardRef)((props, ref) => {
476
- let { isDesignMode } = (0, import_react9.useContext)(WeaverseContext);
477
- let { src, type, controls, poster, autoPlay, loop, muted, ...rest } = props;
478
- return /* @__PURE__ */ import_react9.default.createElement("div", {
479
- ref,
480
- ...rest
481
- }, /* @__PURE__ */ import_react9.default.createElement("video", {
482
- controls: isDesignMode ? false : controls,
483
- autoPlay: isDesignMode ? false : autoPlay,
509
+ // src/elements/Video/index.tsx
510
+ var import_react11 = __toESM(require("react"));
511
+
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,
484
519
  loop,
485
- muted: true,
520
+ muted,
486
521
  controlsList: "nodownload",
487
522
  disablePictureInPicture: true
488
- }, /* @__PURE__ */ import_react9.default.createElement("source", {
523
+ }, /* @__PURE__ */ import_react8.default.createElement("source", {
489
524
  src,
490
525
  type: type || "video/mp4"
491
- }), /* @__PURE__ */ import_react9.default.createElement("source", {
526
+ }), /* @__PURE__ */ import_react8.default.createElement("source", {
492
527
  src,
493
528
  type: "video/ogg"
494
- }), "Your browser does not support the video tag."));
529
+ }), "Your browser does not support the video tag.");
530
+ }
531
+
532
+ // src/elements/Video/Vimeo.tsx
533
+ var import_react9 = __toESM(require("react"));
534
+ function Vimeo(props) {
535
+ let { vimeoId, controls, autoPlay, loop, muted } = props;
536
+ let params = `autoplay=${autoPlay}&loop=${loop}&controls=${controls}&muted=${muted}`;
537
+ let vimeoSrc = `https://player.vimeo.com/video/${vimeoId}?${params}`;
538
+ return /* @__PURE__ */ import_react9.default.createElement("iframe", {
539
+ src: vimeoSrc,
540
+ width: "100%",
541
+ height: "100%",
542
+ allowFullScreen: true
543
+ });
544
+ }
545
+
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
+ });
565
+ }
566
+
567
+ // src/elements/Video/index.tsx
568
+ var Video = (0, import_react11.forwardRef)((props, ref) => {
569
+ let { isDesignMode } = (0, import_react11.useContext)(WeaverseContext);
570
+ let {
571
+ src,
572
+ controls,
573
+ poster,
574
+ autoPlay: originAutoPlay,
575
+ loop,
576
+ muted,
577
+ ...rest
578
+ } = props;
579
+ let autoPlay = !isDesignMode && originAutoPlay;
580
+ let videoProps = { src, controls, poster, autoPlay, loop, muted };
581
+ let content;
582
+ let youtubeId = getYoutubeEmbedId(src);
583
+ let vimeoId = getVimeoId(src);
584
+ if (youtubeId) {
585
+ content = /* @__PURE__ */ import_react11.default.createElement(Youtube, {
586
+ ...videoProps,
587
+ youtubeId
588
+ });
589
+ } else if (vimeoId) {
590
+ content = /* @__PURE__ */ import_react11.default.createElement(Vimeo, {
591
+ ...videoProps,
592
+ vimeoId
593
+ });
594
+ } else {
595
+ content = /* @__PURE__ */ import_react11.default.createElement(HTMLVideo, {
596
+ ...videoProps
597
+ });
598
+ }
599
+ return /* @__PURE__ */ import_react11.default.createElement("div", {
600
+ ref,
601
+ ...rest
602
+ }, content);
495
603
  });
496
604
  var css8 = {
497
605
  "@desktop": {
@@ -506,40 +614,38 @@ Video.defaultProps = {
506
614
  src: "https://youtu.be/wM-NT6hcw48",
507
615
  poster: "https://ucarecdn.com/c413b8fe-ceec-4948-9c42-a0434c4ca920/-/preview/-/quality/smart/-/format/auto/",
508
616
  loop: false,
509
- type: "video/mp4",
510
617
  controls: false,
511
618
  autoPlay: true,
512
619
  muted: true
513
620
  };
514
- var video_default = Video;
621
+ var Video_default = Video;
515
622
 
516
- // src/elements/instagram.tsx
517
- var import_react11 = __toESM(require("react"));
623
+ // src/elements/Instagram.tsx
624
+ var import_react13 = __toESM(require("react"));
518
625
 
519
- // src/elements/shared/Placeholder.tsx
520
- var import_react10 = __toESM(require("react"));
521
- var Placeholder = (0, import_react10.forwardRef)(
626
+ // src/components/Placeholder.tsx
627
+ var import_react12 = __toESM(require("react"));
628
+ var Placeholder = (0, import_react12.forwardRef)(
522
629
  (props, ref) => {
523
630
  let { element, children, ...rest } = props;
524
- return /* @__PURE__ */ import_react10.default.createElement("div", {
631
+ return /* @__PURE__ */ import_react12.default.createElement("div", {
525
632
  "data-wv-placeholder": true,
526
633
  ref,
527
634
  ...rest
528
- }, /* @__PURE__ */ import_react10.default.createElement("div", {
635
+ }, /* @__PURE__ */ import_react12.default.createElement("div", {
529
636
  style: { fontWeight: 600, marginBottom: "10px" }
530
- }, element), /* @__PURE__ */ import_react10.default.createElement("div", null, children));
637
+ }, element), /* @__PURE__ */ import_react12.default.createElement("div", null, children));
531
638
  }
532
639
  );
533
640
  var Placeholder_default = Placeholder;
534
641
 
535
- // src/elements/instagram.tsx
536
- var INSTAGRAM_API = "https://graph.instagram.com";
537
- var Instagram = (0, import_react11.forwardRef)(
642
+ // src/elements/Instagram.tsx
643
+ var Instagram = (0, import_react13.forwardRef)(
538
644
  (props, ref) => {
539
645
  let { token, username, numberOfImages, imagesPerRow, gap, ...rest } = props;
540
- let [media, setMedia] = (0, import_react11.useState)([]);
541
- let [error, setError] = (0, import_react11.useState)(null);
542
- (0, import_react11.useEffect)(() => {
646
+ let [media, setMedia] = (0, import_react13.useState)([]);
647
+ let [error, setError] = (0, import_react13.useState)(null);
648
+ (0, import_react13.useEffect)(() => {
543
649
  if (token) {
544
650
  let params = new URLSearchParams({
545
651
  access_token: token,
@@ -556,10 +662,10 @@ var Instagram = (0, import_react11.forwardRef)(
556
662
  }
557
663
  }, [token]);
558
664
  if (!token || error) {
559
- return /* @__PURE__ */ import_react11.default.createElement("div", {
665
+ return /* @__PURE__ */ import_react13.default.createElement("div", {
560
666
  ref,
561
667
  ...rest
562
- }, /* @__PURE__ */ import_react11.default.createElement(Placeholder_default, {
668
+ }, /* @__PURE__ */ import_react13.default.createElement(Placeholder_default, {
563
669
  element: "Instagram"
564
670
  }, !token ? "Connect to Instagram to display photos on your site." : "Invalid or expired token!"));
565
671
  }
@@ -567,27 +673,28 @@ var Instagram = (0, import_react11.forwardRef)(
567
673
  "--wv-ig-images-per-row": imagesPerRow,
568
674
  "--wv-ig-images-gap": gap + "px"
569
675
  };
570
- return /* @__PURE__ */ import_react11.default.createElement("div", {
676
+ return /* @__PURE__ */ import_react13.default.createElement("div", {
571
677
  ref,
572
678
  ...rest,
573
679
  style
574
- }, /* @__PURE__ */ import_react11.default.createElement("div", {
680
+ }, /* @__PURE__ */ import_react13.default.createElement("div", {
575
681
  className: "wv-ig-media-container"
576
682
  }, media.slice(0, numberOfImages).map((item) => {
577
683
  let { id, permalink, caption, media_url } = item;
578
- return /* @__PURE__ */ import_react11.default.createElement("a", {
684
+ return /* @__PURE__ */ import_react13.default.createElement("a", {
579
685
  key: id,
580
686
  href: permalink,
581
687
  target: "_blank",
582
688
  rel: "noreferrer"
583
- }, /* @__PURE__ */ import_react11.default.createElement("img", {
689
+ }, /* @__PURE__ */ import_react13.default.createElement("img", {
584
690
  alt: caption,
585
691
  src: media_url
586
692
  }));
587
693
  })));
588
694
  }
589
695
  );
590
- var css9 = {
696
+ var css9 = {};
697
+ var permanentCss2 = {
591
698
  "@desktop": {
592
699
  ".wv-ig-media-container": {
593
700
  overflow: "hidden",
@@ -597,12 +704,24 @@ var css9 = {
597
704
  gridTemplateColumns: "repeat(var(--wv-ig-images-per-row, 4), 1fr)",
598
705
  gap: "var(--wv-ig-images-gap, 0px)",
599
706
  img: {
600
- aspectRatio: "1 / 1",
601
- width: "100%",
602
- height: "100%",
707
+ maxWidth: "100%",
708
+ maxHeight: "100%",
603
709
  objectFit: "cover"
604
710
  }
605
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
+ }
606
725
  }
607
726
  };
608
727
  Instagram.defaultProps = {
@@ -612,105 +731,176 @@ Instagram.defaultProps = {
612
731
  imagesPerRow: 4,
613
732
  gap: 0
614
733
  };
615
- var instagram_default = Instagram;
734
+ var Instagram_default = Instagram;
616
735
 
617
736
  // src/elements/index.ts
618
- var SharedComponents = {
619
- Placeholder: Placeholder_default
620
- };
621
737
  var Elements = {
622
738
  Countdown: {
623
- Component: countdown_default,
739
+ Component: Countdown_default,
624
740
  type: "countdown",
625
741
  defaultCss: css3
626
742
  },
627
743
  Button: {
628
- Component: button_default,
744
+ Component: Button_default,
629
745
  type: "button",
630
746
  defaultCss: css
631
747
  },
632
748
  Container: {
633
- Component: container_default,
749
+ Component: Container_default,
634
750
  type: "container",
635
751
  defaultCss: css2
636
752
  },
637
753
  Image: {
638
- Component: image_default,
754
+ Component: Image_default,
639
755
  type: "image",
640
756
  defaultCss: css4
641
757
  },
642
758
  Instagram: {
643
- Component: instagram_default,
759
+ Component: Instagram_default,
644
760
  type: "instagram",
645
- defaultCss: css9
761
+ defaultCss: css9,
762
+ permanentCss: permanentCss2
646
763
  },
647
764
  Layout: {
648
- Component: layout_default,
765
+ Component: Layout_default,
649
766
  type: "layout",
650
767
  defaultCss: css5,
651
768
  permanentCss
652
769
  },
653
770
  Map: {
654
- Component: map_default,
771
+ Component: Map_default,
655
772
  type: "map",
656
773
  defaultCss: css6
657
774
  },
658
775
  Text: {
659
- Component: text_default,
776
+ Component: Text_default,
660
777
  type: "text",
661
778
  defaultCss: css7
662
779
  },
663
780
  Video: {
664
- Component: video_default,
781
+ Component: Video_default,
665
782
  type: "video",
666
783
  defaultCss: css8
667
784
  }
668
785
  };
669
786
 
670
- // src/renderer.tsx
671
- var import_core2 = require("@weaverse/core");
672
- var import_react12 = __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;
673
798
 
674
- // src/utils/index.ts
675
- function shortCssObject(css10) {
676
- return {
677
- "@desktop": css10["@desktop"],
678
- "@mobile": css10["@mobile"]
679
- };
680
- }
681
- var permanentClasses = {};
682
- function generateItemClass(instance, stitchesInstance) {
683
- let { css: css10, type, className: cls = "" } = instance.data;
684
- let className = "";
685
- let permanentClass = "";
686
- let perCss = instance.Element?.permanentCss;
687
- if (perCss) {
688
- if (type in permanentClasses) {
689
- permanentClass = permanentClasses[type];
690
- } else {
691
- let { className: perCls } = stitchesInstance.css(perCss)();
692
- Object.assign(permanentClasses, { [type]: perCls });
693
- permanentClass = perCls;
694
- }
695
- }
696
- className = permanentClass;
697
- if (css10) {
698
- let formattedCss = shortCssObject(css10);
699
- let { className: newClass = "" } = stitchesInstance.css(formattedCss)();
700
- let { stitchesClass } = instance;
701
- let otherClass = (instance.ref.current?.className || "").replace(stitchesClass, "").replace(cls, "").replace(permanentClass, "").trim();
702
- className = `${permanentClass} ${cls} ${newClass} ${otherClass}`.trim();
703
- 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))));
704
827
  }
705
- 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
+ })));
706
887
  }
707
888
 
889
+ // src/components/index.ts
890
+ var Components = {
891
+ Placeholder: Placeholder_default,
892
+ Spinner,
893
+ ModalComponents: Modal_exports
894
+ };
895
+
708
896
  // src/renderer.tsx
897
+ var import_core2 = require("@weaverse/core");
898
+ var import_react18 = __toESM(require("react"));
709
899
  var WeaverseRoot = ({ context }) => {
710
- let [, setData] = (0, import_react12.useState)(context.projectData);
711
- let rootRef = (0, import_react12.useRef)();
900
+ let [, setData] = (0, import_react18.useState)(context.projectData);
901
+ let rootRef = (0, import_react18.useRef)();
712
902
  let renderRoot = () => setData({});
713
- (0, import_react12.useEffect)(() => {
903
+ (0, import_react18.useEffect)(() => {
714
904
  context.subscribe(renderRoot);
715
905
  context.contentRootElement = rootRef.current;
716
906
  return () => {
@@ -720,23 +910,23 @@ var WeaverseRoot = ({ context }) => {
720
910
  let eventHandlers = context?.studioBridge?.eventHandlers || {};
721
911
  let themeClass = context.stitchesInstance.theme.className;
722
912
  if (context.projectData?.rootId) {
723
- return /* @__PURE__ */ import_react12.default.createElement("div", {
913
+ return /* @__PURE__ */ import_react18.default.createElement("div", {
724
914
  className: `weaverse-content-root ${themeClass}`,
725
915
  ...eventHandlers,
726
916
  ref: rootRef
727
- }, /* @__PURE__ */ import_react12.default.createElement(WeaverseContextProvider, {
917
+ }, /* @__PURE__ */ import_react18.default.createElement(WeaverseContextProvider, {
728
918
  value: context
729
- }, /* @__PURE__ */ import_react12.default.createElement(ItemInstance, {
919
+ }, /* @__PURE__ */ import_react18.default.createElement(ItemInstance, {
730
920
  id: context.projectData.rootId
731
921
  })));
732
922
  }
733
923
  return null;
734
924
  };
735
925
  var ItemComponent = ({ instance }) => {
736
- let { stitchesInstance, elementInstances } = (0, import_react12.useContext)(WeaverseContext);
737
- let [data, setData] = (0, import_react12.useState)(instance.data);
926
+ let { stitchesInstance, elementInstances } = (0, import_react18.useContext)(WeaverseContext);
927
+ let [data, setData] = (0, import_react18.useState)(instance.data);
738
928
  let { id, type, childIds = [], css: css10, className, ...rest } = data;
739
- (0, import_react12.useEffect)(() => {
929
+ (0, import_react18.useEffect)(() => {
740
930
  let render = (data2) => setData({ ...data2 });
741
931
  instance.subscribe(render);
742
932
  if (import_core2.isBrowser && !instance.ref.current) {
@@ -752,13 +942,13 @@ var ItemComponent = ({ instance }) => {
752
942
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
753
943
  rest.ref = instance.ref;
754
944
  }
755
- return /* @__PURE__ */ import_react12.default.createElement(Component, {
945
+ return /* @__PURE__ */ import_react18.default.createElement(Component, {
756
946
  key: id,
757
947
  "data-wv-type": type,
758
948
  "data-wv-id": id,
759
949
  className: generateItemClass(instance, stitchesInstance),
760
950
  ...rest
761
- }, childIds.map((id2) => /* @__PURE__ */ import_react12.default.createElement(ItemInstance, {
951
+ }, childIds.map((id2) => /* @__PURE__ */ import_react18.default.createElement(ItemInstance, {
762
952
  key: id2,
763
953
  id: id2
764
954
  })));
@@ -768,26 +958,23 @@ var ItemComponent = ({ instance }) => {
768
958
  }
769
959
  };
770
960
  var ItemInstance = ({ id }) => {
771
- let context = (0, import_react12.useContext)(WeaverseContext);
961
+ let context = (0, import_react18.useContext)(WeaverseContext);
772
962
  let { itemInstances } = context;
773
963
  let instance = itemInstances.get(id);
774
964
  if (!instance) {
775
- return /* @__PURE__ */ import_react12.default.createElement("div", {
965
+ return /* @__PURE__ */ import_react18.default.createElement("div", {
776
966
  style: { display: "none" }
777
967
  }, "Item instance ", id, " not found");
778
968
  }
779
- return /* @__PURE__ */ import_react12.default.createElement(ItemComponent, {
969
+ return /* @__PURE__ */ import_react18.default.createElement(ItemComponent, {
780
970
  key: id,
781
971
  instance
782
972
  });
783
973
  };
784
-
785
- // src/index.ts
786
- __reExport(src_exports, require("@weaverse/core"), module.exports);
787
974
  // Annotate the CommonJS export names for ESM import in node:
788
975
  0 && (module.exports = {
976
+ Components,
789
977
  Elements,
790
- SharedComponents,
791
978
  WeaverseContext,
792
979
  WeaverseContextConsumer,
793
980
  WeaverseContextProvider,