@weaverse/react 0.6.20 → 0.6.21

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
@@ -1,6 +1,5 @@
1
1
  import * as react from 'react';
2
- import { ReactElement, ReactNode } from 'react';
3
- import { WeaverseType, Weaverse, ElementCSS, WeaverseItemStore } from '@weaverse/core';
2
+ import { WeaverseType, Weaverse, WeaverseItemStore } from '@weaverse/core';
4
3
  export * from '@weaverse/core';
5
4
 
6
5
  declare let createRootContext: (configs: WeaverseType) => Weaverse;
@@ -8,85 +7,17 @@ declare let WeaverseContext: react.Context<Weaverse>;
8
7
  declare let WeaverseContextProvider: react.Provider<Weaverse>;
9
8
  declare let WeaverseContextConsumer: react.Consumer<Weaverse>;
10
9
 
11
- interface WeaverseElementProps extends ReactElement {
12
- css?: ElementCSS;
13
- children?: ReactElement | ReactElement[] | ReactNode | ReactNode[];
10
+ interface WeaverseElementProps {
11
+ children?: React.ReactNode;
14
12
  }
15
13
  declare type WeaverseRootPropsType = {
16
14
  context: Weaverse;
17
15
  };
16
+ declare type CountdownTimeKey = 'days' | 'hours' | 'minutes' | 'seconds';
18
17
  declare type ItemComponentProps = {
19
18
  instance: InstanceType<typeof WeaverseItemStore>;
20
19
  };
21
- interface PlaceholderProps extends WeaverseElementProps {
22
- element: string;
23
- }
24
- interface ButtonElementProps extends WeaverseElementProps {
25
- value: string;
26
- openInNewTab: boolean;
27
- target: string;
28
- type: 'button' | 'submit' | 'reset';
29
- }
30
- interface ContainerElementProps extends WeaverseElementProps {
31
- [key: string]: any;
32
- }
33
- interface ImageElementProps extends WeaverseElementProps {
34
- src: string;
35
- alt: string;
36
- }
37
- interface LayoutElementProps extends WeaverseElementProps {
38
- gridSize: number;
39
- rows: number;
40
- columns: number;
41
- gap: number;
42
- rowSize: number;
43
- }
44
- interface MapElementProps extends WeaverseElementProps {
45
- place: string;
46
- zoom: number;
47
- }
48
- interface TextElementProps extends WeaverseElementProps {
49
- value: string;
50
- }
51
- interface VideoElementProps extends WeaverseElementProps {
52
- src: string;
53
- poster: string;
54
- loop: boolean;
55
- type: string;
56
- controls: boolean;
57
- autoPlay: boolean;
58
- muted: boolean;
59
- }
60
- declare type CountdownTimeKey = 'days' | 'hours' | 'minutes' | 'seconds';
61
- interface CountdownElementProps extends WeaverseElementProps {
62
- timerType: 'fixed-time' | 'evergreen';
63
- startTime: number;
64
- endTime: number;
65
- periods: number;
66
- redirectUrl: string;
67
- openInNewTab: boolean;
68
- showLabel: boolean;
69
- showColon: boolean;
70
- }
71
- declare type TimerBlockProps = {
72
- label: string;
73
- value: number;
74
- };
75
- interface InstagramElementProps extends WeaverseElementProps {
76
- token: string;
77
- username: string;
78
- numberOfImages: number;
79
- imagesPerRow: number;
80
- gap: number;
81
- }
82
- declare type InstagramMedia = {
83
- id: string;
84
- media_type: 'IMAGE' | 'CAROUSEL_ALBUM';
85
- media_url: string;
86
- permalink: string;
87
- caption: string;
88
- };
89
20
 
90
21
  declare let WeaverseRoot: ({ context }: WeaverseRootPropsType) => JSX.Element;
91
22
 
92
- export { ButtonElementProps, ContainerElementProps, CountdownElementProps, CountdownTimeKey, ImageElementProps, InstagramElementProps, InstagramMedia, ItemComponentProps, LayoutElementProps, MapElementProps, PlaceholderProps, TextElementProps, TimerBlockProps, VideoElementProps, WeaverseContext, WeaverseContextConsumer, WeaverseContextProvider, WeaverseElementProps, WeaverseRoot, WeaverseRootPropsType, createRootContext };
23
+ export { CountdownTimeKey, ItemComponentProps, WeaverseContext, WeaverseContextConsumer, WeaverseContextProvider, WeaverseElementProps, WeaverseRoot, WeaverseRootPropsType, createRootContext };
package/dist/index.js CHANGED
@@ -62,12 +62,12 @@ module.exports = __toCommonJS(src_exports);
62
62
 
63
63
  // src/context.ts
64
64
  var import_core = require("@weaverse/core");
65
- var import_react10 = require("react");
65
+ var import_react9 = require("react");
66
66
 
67
67
  // src/elements/button.tsx
68
68
  var React = __toESM(require("react"));
69
69
  var Button = React.forwardRef((props, ref) => {
70
- let _a = props, { openInNewTab, target, value } = _a, rest = __objRest(_a, ["openInNewTab", "target", "value"]);
70
+ const _a = props, { openInNewTab, target, value } = _a, rest = __objRest(_a, ["openInNewTab", "target", "value"]);
71
71
  if (target) {
72
72
  return /* @__PURE__ */ React.createElement("a", __spreadProps(__spreadValues({
73
73
  href: target,
@@ -102,10 +102,9 @@ var button_default = Button;
102
102
  // src/elements/container.tsx
103
103
  var import_react = __toESM(require("react"));
104
104
  var Container = (0, import_react.forwardRef)((props, ref) => {
105
- let _a = props, { children } = _a, rest = __objRest(_a, ["children"]);
106
105
  return /* @__PURE__ */ import_react.default.createElement("div", __spreadValues({
107
106
  ref
108
- }, rest), children);
107
+ }, props));
109
108
  });
110
109
  Container.defaultProps = {
111
110
  css: {
@@ -179,7 +178,7 @@ var Countdown = (0, import_react3.forwardRef)((props, ref) => {
179
178
  }
180
179
  (0, import_react3.useEffect)(() => {
181
180
  const flag = setInterval(() => {
182
- const remainingTime = Math.max((timerType === "fixed-time" ? new Date(endTime).getTime() : new Date(startTime).getTime() + periods * 60 * 1e3) - Date.now(), 0);
181
+ const remainingTime = Math.max((timerType === "specific" ? new Date(endTime).getTime() : new Date(startTime).getTime() + periods * 60 * 1e3) - Date.now(), 0);
183
182
  if (!isDesignMode && redirectUrl && remainingTime > 0 && remainingTime < 1e3) {
184
183
  window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
185
184
  }
@@ -204,7 +203,7 @@ var Countdown = (0, import_react3.forwardRef)((props, ref) => {
204
203
  }));
205
204
  });
206
205
  Countdown.defaultProps = {
207
- timerType: "fixed-time",
206
+ timerType: "specific",
208
207
  startTime: Date.now(),
209
208
  endTime: 1661140528e3,
210
209
  periods: 90,
@@ -241,10 +240,10 @@ var countdown_default = Countdown;
241
240
  // src/elements/image.tsx
242
241
  var import_react4 = __toESM(require("react"));
243
242
  var Image = import_react4.default.forwardRef((props, ref) => {
244
- let _a = props, { src, alt } = _a, rest = __objRest(_a, ["src", "alt"]);
245
- return /* @__PURE__ */ import_react4.default.createElement("div", __spreadValues({
243
+ let _a = props, { src, alt, children } = _a, rest = __objRest(_a, ["src", "alt", "children"]);
244
+ return /* @__PURE__ */ import_react4.default.createElement("img", __spreadProps(__spreadValues({
246
245
  ref
247
- }, rest), /* @__PURE__ */ import_react4.default.createElement("img", {
246
+ }, rest), {
248
247
  alt,
249
248
  src
250
249
  }));
@@ -254,11 +253,12 @@ Image.defaultProps = {
254
253
  alt: "weaverse image element",
255
254
  css: {
256
255
  "@desktop": {
257
- img: {
258
- width: "100%",
259
- height: "100%",
260
- objectFit: "cover"
261
- }
256
+ width: "100%",
257
+ height: "100%",
258
+ objectFit: "cover"
259
+ },
260
+ "@mobile": {
261
+ display: "block"
262
262
  }
263
263
  }
264
264
  };
@@ -268,19 +268,17 @@ var image_default = Image;
268
268
  var import_react5 = __toESM(require("react"));
269
269
  var Layout = (0, import_react5.forwardRef)((props, ref) => {
270
270
  let _a = props, { children, rows, gap, rowSize, columns, gridSize } = _a, rest = __objRest(_a, ["children", "rows", "gap", "rowSize", "columns", "gridSize"]);
271
- let style = {
272
- "--grid-size": gridSize + "px",
273
- "--rows": rows,
274
- "--columns": columns,
275
- "--gap": gap + "px",
276
- "--row-size": rowSize + "px",
277
- "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))"
278
- };
279
- return /* @__PURE__ */ import_react5.default.createElement("section", __spreadProps(__spreadValues({
280
- ref
281
- }, rest), {
282
- style
283
- }), /* @__PURE__ */ import_react5.default.createElement("div", {
271
+ return /* @__PURE__ */ import_react5.default.createElement("section", __spreadValues({
272
+ ref,
273
+ style: {
274
+ "--grid-size": gridSize + "px",
275
+ "--rows": rows,
276
+ "--columns": columns,
277
+ "--gap": gap + "px",
278
+ "--row-size": rowSize + "px",
279
+ "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))"
280
+ }
281
+ }, rest), /* @__PURE__ */ import_react5.default.createElement("div", {
284
282
  "data-layout-content": true
285
283
  }, children));
286
284
  });
@@ -319,7 +317,7 @@ var layout_default = Layout;
319
317
  // src/elements/map.tsx
320
318
  var import_react6 = __toESM(require("react"));
321
319
  var Map = (0, import_react6.forwardRef)((props, ref) => {
322
- let _a = props, { place, zoom } = _a, rest = __objRest(_a, ["place", "zoom"]);
320
+ const _a = props, { place, zoom } = _a, rest = __objRest(_a, ["place", "zoom"]);
323
321
  return /* @__PURE__ */ import_react6.default.createElement("div", __spreadValues({
324
322
  ref
325
323
  }, rest), /* @__PURE__ */ import_react6.default.createElement("iframe", {
@@ -329,12 +327,19 @@ var Map = (0, import_react6.forwardRef)((props, ref) => {
329
327
  height: "100%",
330
328
  title: "map",
331
329
  src: `https://maps.google.com/maps?z=${zoom}&t=m&q=${place}&ie=UTF8&&output=embed`,
332
- style: { pointerEvents: "none" }
330
+ style: {
331
+ pointerEvents: "none"
332
+ }
333
333
  }));
334
334
  });
335
335
  Map.defaultProps = {
336
336
  place: "Hanoi",
337
- zoom: 14
337
+ zoom: 14,
338
+ css: {
339
+ "@desktop": {
340
+ gridArea: "1 / 1 / 11 / 13"
341
+ }
342
+ }
338
343
  };
339
344
  var map_default = Map;
340
345
 
@@ -354,7 +359,8 @@ Text.defaultProps = {
354
359
  "@desktop": {
355
360
  width: "100%",
356
361
  height: "fit-content",
357
- padding: "20px",
362
+ padding: 0,
363
+ margin: 0,
358
364
  outline: "none",
359
365
  wordBreak: "break-word",
360
366
  overflowWrap: "break-word",
@@ -367,24 +373,23 @@ var text_default = Text;
367
373
  // src/elements/video.tsx
368
374
  var import_react7 = __toESM(require("react"));
369
375
  var Video = (0, import_react7.forwardRef)((props, ref) => {
370
- let { isDesignMode } = (0, import_react7.useContext)(WeaverseContext);
376
+ const { isDesignMode } = (0, import_react7.useContext)(WeaverseContext);
371
377
  let _a = props, { src, type, controls, poster, autoPlay, loop, muted } = _a, rest = __objRest(_a, ["src", "type", "controls", "poster", "autoPlay", "loop", "muted"]);
372
- return /* @__PURE__ */ import_react7.default.createElement("div", __spreadValues({
373
- ref
374
- }, rest), /* @__PURE__ */ import_react7.default.createElement("video", {
378
+ return /* @__PURE__ */ import_react7.default.createElement("video", __spreadValues({
379
+ ref,
375
380
  controls: isDesignMode ? false : controls,
376
381
  autoPlay: isDesignMode ? false : autoPlay,
377
382
  loop,
378
383
  muted: true,
379
384
  controlsList: "nodownload",
380
385
  disablePictureInPicture: true
381
- }, /* @__PURE__ */ import_react7.default.createElement("source", {
386
+ }, rest), /* @__PURE__ */ import_react7.default.createElement("source", {
382
387
  src,
383
388
  type: type || "video/mp4"
384
- }), "Your browser does not support the video tag."));
389
+ }));
385
390
  });
386
391
  Video.defaultProps = {
387
- src: "https://youtu.be/wM-NT6hcw48",
392
+ src: "https://ucarecdn.com/7cae0dab-8966-4484-9998-602728c360ca/IMG_0048.MOV",
388
393
  poster: "https://ucarecdn.com/48d73272-3fe3-43f6-8b5b-22b68fc5a8c8/section.png",
389
394
  loop: false,
390
395
  type: "video/mp4",
@@ -393,113 +398,64 @@ Video.defaultProps = {
393
398
  muted: true,
394
399
  css: {
395
400
  "@desktop": {
396
- video: {
397
- height: "100%",
398
- width: "100%",
399
- aspectRatio: "16 / 9"
400
- }
401
+ height: "fit-content",
402
+ margin: 0,
403
+ outline: "none",
404
+ overflowWrap: "break-word",
405
+ padding: 0,
406
+ whitespace: "break-spaces",
407
+ width: "100%",
408
+ wordBreak: "break-word"
401
409
  }
402
410
  }
403
411
  };
404
412
  var video_default = Video;
405
413
 
406
414
  // src/elements/instagram.tsx
407
- var import_react9 = __toESM(require("react"));
408
-
409
- // src/elements/shared/Placeholder.tsx
410
415
  var import_react8 = __toESM(require("react"));
411
- var Placeholder = (0, import_react8.forwardRef)((props, ref) => {
412
- let _a = props, { element, children } = _a, rest = __objRest(_a, ["element", "children"]);
413
- let style = {
414
- height: "100%",
415
- display: "flex",
416
- flexDirection: "column",
417
- alignItems: "center",
418
- justifyContent: "center",
419
- color: "#374151"
420
- };
421
- return /* @__PURE__ */ import_react8.default.createElement("div", __spreadValues({
422
- style,
423
- ref
424
- }, rest), /* @__PURE__ */ import_react8.default.createElement("div", {
425
- style: { fontWeight: 600, marginBottom: "10px" }
426
- }, element), /* @__PURE__ */ import_react8.default.createElement("div", null, children));
427
- });
428
- var Placeholder_default = Placeholder;
429
-
430
- // src/elements/instagram.tsx
431
- var INSTAGRAM_API = "https://graph.instagram.com";
432
- var Instagram = (0, import_react9.forwardRef)((props, ref) => {
433
- const _a = props, { token, username, numberOfImages, imagesPerRow, gap } = _a, rest = __objRest(_a, ["token", "username", "numberOfImages", "imagesPerRow", "gap"]);
434
- const [media, setMedia] = (0, import_react9.useState)([]);
435
- const [error, setError] = (0, import_react9.useState)(null);
436
- let { isDesignMode } = (0, import_react9.useContext)(WeaverseContext);
437
- (0, import_react9.useEffect)(() => {
438
- if (token) {
439
- let params = new URLSearchParams({
440
- access_token: token,
441
- fields: "id,media_type,caption,media_url,permalink"
442
- });
443
- fetch(`${INSTAGRAM_API}/me/media?${params.toString()}`).then((res) => res.json()).then((res) => {
444
- if (res.error) {
445
- setError(res);
446
- } else {
447
- setError(null);
448
- setMedia([...res.data]);
449
- }
450
- }).catch(setError);
451
- }
416
+ var Instagram = (0, import_react8.forwardRef)((props, ref) => {
417
+ const { stitchesInstance } = (0, import_react8.useContext)(WeaverseContext);
418
+ const _a = props, { token, numberOfImages, imagesPerRow, className } = _a, rest = __objRest(_a, ["token", "numberOfImages", "imagesPerRow", "className"]);
419
+ const [media, setMedia] = (0, import_react8.useState)([]);
420
+ (0, import_react8.useEffect)(() => {
421
+ const url = `https://graph.instagram.com/me/media?fields=id,media_type,caption,media_url&access_token=${token}`;
422
+ fetch(url).then((res) => res.json()).then((res) => {
423
+ setMedia(res.data);
424
+ });
452
425
  }, [token]);
453
- if (!token || error) {
454
- return /* @__PURE__ */ import_react9.default.createElement("div", __spreadValues({
455
- ref
456
- }, rest), /* @__PURE__ */ import_react9.default.createElement(Placeholder_default, {
457
- element: "Instagram"
458
- }, !token ? "Connect your Instagram account to display photos on your site." : "Invalid or expired token!"));
459
- }
460
- let style = {
461
- "--wv-ig-images-per-row": imagesPerRow,
462
- "--wv-ig-images-gap": gap
426
+ const css = {
427
+ gridTemplateColumns: `repeat(${imagesPerRow[0] || 1}, 1fr)`
463
428
  };
464
- return /* @__PURE__ */ import_react9.default.createElement("div", __spreadProps(__spreadValues({
429
+ const { className: instagramClass = "" } = stitchesInstance.css(css)();
430
+ return /* @__PURE__ */ import_react8.default.createElement("div", __spreadValues({
431
+ className: `${className} ${instagramClass}`,
465
432
  ref
466
- }, rest), {
467
- style
468
- }), /* @__PURE__ */ import_react9.default.createElement("div", {
469
- className: "wv-ig-media-container"
470
- }, media.slice(0, numberOfImages).map((item) => {
471
- let linkProps;
472
- if (!isDesignMode) {
473
- linkProps = { href: item.permalink, target: "_blank" };
474
- }
475
- return /* @__PURE__ */ import_react9.default.createElement("a", __spreadValues({
476
- key: item.id
477
- }, linkProps), /* @__PURE__ */ import_react9.default.createElement("img", {
433
+ }, rest), !token ? "Token is empty" : media.map((item, key) => {
434
+ return /* @__PURE__ */ import_react8.default.createElement("div", {
435
+ key,
436
+ className: "wv-instagram-item"
437
+ }, /* @__PURE__ */ import_react8.default.createElement("img", {
438
+ width: "100%",
439
+ height: "100%",
478
440
  alt: item.caption,
479
441
  src: item.media_url
480
442
  }));
481
- })));
443
+ }));
482
444
  });
483
445
  Instagram.defaultProps = {
484
446
  token: "",
485
- username: "",
486
- numberOfImages: 8,
487
- imagesPerRow: 4,
488
- gap: 0,
447
+ numberOfImages: [12],
448
+ imagesPerRow: [4],
489
449
  css: {
490
450
  "@desktop": {
491
- ".wv-ig-media-container": {
492
- overflow: "hidden",
493
- maxWidth: "100%",
494
- maxHeight: "100%",
495
- display: "grid",
496
- gridTemplateColumns: "repeat(var(--wv-ig-images-per-row, 4), 1fr)",
497
- gap: "var(--wv-ig-images-gap, 0px)",
498
- img: {
499
- aspectRatio: "1 / 1",
500
- width: "100%",
501
- height: "100%",
502
- objectFit: "cover"
451
+ display: "grid",
452
+ gridTemplateColumns: "repeat(4, 1fr)",
453
+ "& .wv-instagram-item": {
454
+ width: "100%",
455
+ height: "100%",
456
+ backgroundColor: "red",
457
+ "& img": {
458
+ objectFit: "contain"
503
459
  }
504
460
  }
505
461
  }
@@ -556,13 +512,13 @@ var createRootContext = (configs) => {
556
512
  });
557
513
  return rootContext;
558
514
  };
559
- var WeaverseContext = (0, import_react10.createContext)({});
515
+ var WeaverseContext = (0, import_react9.createContext)({});
560
516
  var WeaverseContextProvider = WeaverseContext.Provider;
561
517
  var WeaverseContextConsumer = WeaverseContext.Consumer;
562
518
 
563
519
  // src/renderer.tsx
564
520
  var import_core2 = require("@weaverse/core");
565
- var import_react11 = __toESM(require("react"));
521
+ var import_react10 = __toESM(require("react"));
566
522
 
567
523
  // src/utils/index.ts
568
524
  var shortCssObject = (css) => {
@@ -590,9 +546,9 @@ function generateItemClass(instance, stitchesInstance) {
590
546
  // src/renderer.tsx
591
547
  var WeaverseRoot = ({ context }) => {
592
548
  var _a;
593
- let [, setData] = (0, import_react11.useState)(context.projectData);
594
- let rootRef = (0, import_react11.useRef)();
595
- (0, import_react11.useEffect)(() => {
549
+ let [, setData] = (0, import_react10.useState)(context.projectData);
550
+ let rootRef = (0, import_react10.useRef)();
551
+ (0, import_react10.useEffect)(() => {
596
552
  let update = () => setData({});
597
553
  context.subscribe(update);
598
554
  if (context.projectData) {
@@ -605,21 +561,21 @@ var WeaverseRoot = ({ context }) => {
605
561
  }, []);
606
562
  let eventHandlers = ((_a = context == null ? void 0 : context.studioBridge) == null ? void 0 : _a.eventHandlers) || {};
607
563
  let themeClass = context.stitchesInstance.theme.className;
608
- return /* @__PURE__ */ import_react11.default.createElement("div", __spreadProps(__spreadValues({
564
+ return /* @__PURE__ */ import_react10.default.createElement("div", __spreadProps(__spreadValues({
609
565
  className: `weaverse-content-root ${themeClass}`
610
566
  }, eventHandlers), {
611
567
  ref: rootRef
612
- }), /* @__PURE__ */ import_react11.default.createElement(WeaverseContextProvider, {
568
+ }), /* @__PURE__ */ import_react10.default.createElement(WeaverseContextProvider, {
613
569
  value: context
614
- }, /* @__PURE__ */ import_react11.default.createElement(ItemInstance, {
570
+ }, /* @__PURE__ */ import_react10.default.createElement(ItemInstance, {
615
571
  id: context.projectData.rootId || 0
616
572
  })));
617
573
  };
618
574
  var ItemComponent = ({ instance }) => {
619
- let { stitchesInstance, elementInstances } = (0, import_react11.useContext)(WeaverseContext);
620
- let [data, setData] = (0, import_react11.useState)(instance.data);
575
+ let { stitchesInstance, elementInstances } = (0, import_react10.useContext)(WeaverseContext);
576
+ let [data, setData] = (0, import_react10.useState)(instance.data);
621
577
  let _a = data, { id, type, childIds = [], css, className } = _a, rest = __objRest(_a, ["id", "type", "childIds", "css", "className"]);
622
- (0, import_react11.useEffect)(() => {
578
+ (0, import_react10.useEffect)(() => {
623
579
  var _a2;
624
580
  let update = (data2) => setData(__spreadValues({}, data2));
625
581
  instance.subscribe(update);
@@ -639,12 +595,12 @@ var ItemComponent = ({ instance }) => {
639
595
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
640
596
  rest.ref = instance.ref;
641
597
  }
642
- return /* @__PURE__ */ import_react11.default.createElement(Component, __spreadValues({
598
+ return /* @__PURE__ */ import_react10.default.createElement(Component, __spreadValues({
643
599
  key: id,
644
600
  "data-wv-type": type,
645
601
  "data-wv-id": id,
646
602
  className: generateItemClass(instance, stitchesInstance)
647
- }, rest), childIds.map((id2) => /* @__PURE__ */ import_react11.default.createElement(ItemInstance, {
603
+ }, rest), childIds.map((id2) => /* @__PURE__ */ import_react10.default.createElement(ItemInstance, {
648
604
  key: id2,
649
605
  id: id2
650
606
  })));
@@ -652,15 +608,15 @@ var ItemComponent = ({ instance }) => {
652
608
  return null;
653
609
  };
654
610
  var ItemInstance = ({ id }) => {
655
- let context = (0, import_react11.useContext)(WeaverseContext);
611
+ let context = (0, import_react10.useContext)(WeaverseContext);
656
612
  let { itemInstances } = context;
657
613
  let instance = itemInstances.get(id);
658
614
  if (!instance) {
659
- return /* @__PURE__ */ import_react11.default.createElement("div", {
615
+ return /* @__PURE__ */ import_react10.default.createElement("div", {
660
616
  style: { display: "none" }
661
617
  }, "Item instance ", id, " not found");
662
618
  }
663
- return /* @__PURE__ */ import_react11.default.createElement(ItemComponent, {
619
+ return /* @__PURE__ */ import_react10.default.createElement(ItemComponent, {
664
620
  instance
665
621
  });
666
622
  };
package/dist/index.mjs CHANGED
@@ -37,7 +37,7 @@ import { createContext } from "react";
37
37
  // src/elements/button.tsx
38
38
  import * as React from "react";
39
39
  var Button = React.forwardRef((props, ref) => {
40
- let _a = props, { openInNewTab, target, value } = _a, rest = __objRest(_a, ["openInNewTab", "target", "value"]);
40
+ const _a = props, { openInNewTab, target, value } = _a, rest = __objRest(_a, ["openInNewTab", "target", "value"]);
41
41
  if (target) {
42
42
  return /* @__PURE__ */ React.createElement("a", __spreadProps(__spreadValues({
43
43
  href: target,
@@ -72,10 +72,9 @@ var button_default = Button;
72
72
  // src/elements/container.tsx
73
73
  import React2, { forwardRef as forwardRef2 } from "react";
74
74
  var Container = forwardRef2((props, ref) => {
75
- let _a = props, { children } = _a, rest = __objRest(_a, ["children"]);
76
75
  return /* @__PURE__ */ React2.createElement("div", __spreadValues({
77
76
  ref
78
- }, rest), children);
77
+ }, props));
79
78
  });
80
79
  Container.defaultProps = {
81
80
  css: {
@@ -149,7 +148,7 @@ var Countdown = forwardRef3((props, ref) => {
149
148
  }
150
149
  useEffect(() => {
151
150
  const flag = setInterval(() => {
152
- const remainingTime = Math.max((timerType === "fixed-time" ? new Date(endTime).getTime() : new Date(startTime).getTime() + periods * 60 * 1e3) - Date.now(), 0);
151
+ const remainingTime = Math.max((timerType === "specific" ? new Date(endTime).getTime() : new Date(startTime).getTime() + periods * 60 * 1e3) - Date.now(), 0);
153
152
  if (!isDesignMode && redirectUrl && remainingTime > 0 && remainingTime < 1e3) {
154
153
  window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
155
154
  }
@@ -174,7 +173,7 @@ var Countdown = forwardRef3((props, ref) => {
174
173
  }));
175
174
  });
176
175
  Countdown.defaultProps = {
177
- timerType: "fixed-time",
176
+ timerType: "specific",
178
177
  startTime: Date.now(),
179
178
  endTime: 1661140528e3,
180
179
  periods: 90,
@@ -211,10 +210,10 @@ var countdown_default = Countdown;
211
210
  // src/elements/image.tsx
212
211
  import React5 from "react";
213
212
  var Image = React5.forwardRef((props, ref) => {
214
- let _a = props, { src, alt } = _a, rest = __objRest(_a, ["src", "alt"]);
215
- return /* @__PURE__ */ React5.createElement("div", __spreadValues({
213
+ let _a = props, { src, alt, children } = _a, rest = __objRest(_a, ["src", "alt", "children"]);
214
+ return /* @__PURE__ */ React5.createElement("img", __spreadProps(__spreadValues({
216
215
  ref
217
- }, rest), /* @__PURE__ */ React5.createElement("img", {
216
+ }, rest), {
218
217
  alt,
219
218
  src
220
219
  }));
@@ -224,11 +223,12 @@ Image.defaultProps = {
224
223
  alt: "weaverse image element",
225
224
  css: {
226
225
  "@desktop": {
227
- img: {
228
- width: "100%",
229
- height: "100%",
230
- objectFit: "cover"
231
- }
226
+ width: "100%",
227
+ height: "100%",
228
+ objectFit: "cover"
229
+ },
230
+ "@mobile": {
231
+ display: "block"
232
232
  }
233
233
  }
234
234
  };
@@ -238,19 +238,17 @@ var image_default = Image;
238
238
  import React6, { forwardRef as forwardRef4 } from "react";
239
239
  var Layout = forwardRef4((props, ref) => {
240
240
  let _a = props, { children, rows, gap, rowSize, columns, gridSize } = _a, rest = __objRest(_a, ["children", "rows", "gap", "rowSize", "columns", "gridSize"]);
241
- let style = {
242
- "--grid-size": gridSize + "px",
243
- "--rows": rows,
244
- "--columns": columns,
245
- "--gap": gap + "px",
246
- "--row-size": rowSize + "px",
247
- "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))"
248
- };
249
- return /* @__PURE__ */ React6.createElement("section", __spreadProps(__spreadValues({
250
- ref
251
- }, rest), {
252
- style
253
- }), /* @__PURE__ */ React6.createElement("div", {
241
+ return /* @__PURE__ */ React6.createElement("section", __spreadValues({
242
+ ref,
243
+ style: {
244
+ "--grid-size": gridSize + "px",
245
+ "--rows": rows,
246
+ "--columns": columns,
247
+ "--gap": gap + "px",
248
+ "--row-size": rowSize + "px",
249
+ "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))"
250
+ }
251
+ }, rest), /* @__PURE__ */ React6.createElement("div", {
254
252
  "data-layout-content": true
255
253
  }, children));
256
254
  });
@@ -289,7 +287,7 @@ var layout_default = Layout;
289
287
  // src/elements/map.tsx
290
288
  import React7, { forwardRef as forwardRef5 } from "react";
291
289
  var Map = forwardRef5((props, ref) => {
292
- let _a = props, { place, zoom } = _a, rest = __objRest(_a, ["place", "zoom"]);
290
+ const _a = props, { place, zoom } = _a, rest = __objRest(_a, ["place", "zoom"]);
293
291
  return /* @__PURE__ */ React7.createElement("div", __spreadValues({
294
292
  ref
295
293
  }, rest), /* @__PURE__ */ React7.createElement("iframe", {
@@ -299,12 +297,19 @@ var Map = forwardRef5((props, ref) => {
299
297
  height: "100%",
300
298
  title: "map",
301
299
  src: `https://maps.google.com/maps?z=${zoom}&t=m&q=${place}&ie=UTF8&&output=embed`,
302
- style: { pointerEvents: "none" }
300
+ style: {
301
+ pointerEvents: "none"
302
+ }
303
303
  }));
304
304
  });
305
305
  Map.defaultProps = {
306
306
  place: "Hanoi",
307
- zoom: 14
307
+ zoom: 14,
308
+ css: {
309
+ "@desktop": {
310
+ gridArea: "1 / 1 / 11 / 13"
311
+ }
312
+ }
308
313
  };
309
314
  var map_default = Map;
310
315
 
@@ -324,7 +329,8 @@ Text.defaultProps = {
324
329
  "@desktop": {
325
330
  width: "100%",
326
331
  height: "fit-content",
327
- padding: "20px",
332
+ padding: 0,
333
+ margin: 0,
328
334
  outline: "none",
329
335
  wordBreak: "break-word",
330
336
  overflowWrap: "break-word",
@@ -337,24 +343,23 @@ var text_default = Text;
337
343
  // src/elements/video.tsx
338
344
  import React9, { forwardRef as forwardRef7, useContext as useContext2 } from "react";
339
345
  var Video = forwardRef7((props, ref) => {
340
- let { isDesignMode } = useContext2(WeaverseContext);
346
+ const { isDesignMode } = useContext2(WeaverseContext);
341
347
  let _a = props, { src, type, controls, poster, autoPlay, loop, muted } = _a, rest = __objRest(_a, ["src", "type", "controls", "poster", "autoPlay", "loop", "muted"]);
342
- return /* @__PURE__ */ React9.createElement("div", __spreadValues({
343
- ref
344
- }, rest), /* @__PURE__ */ React9.createElement("video", {
348
+ return /* @__PURE__ */ React9.createElement("video", __spreadValues({
349
+ ref,
345
350
  controls: isDesignMode ? false : controls,
346
351
  autoPlay: isDesignMode ? false : autoPlay,
347
352
  loop,
348
353
  muted: true,
349
354
  controlsList: "nodownload",
350
355
  disablePictureInPicture: true
351
- }, /* @__PURE__ */ React9.createElement("source", {
356
+ }, rest), /* @__PURE__ */ React9.createElement("source", {
352
357
  src,
353
358
  type: type || "video/mp4"
354
- }), "Your browser does not support the video tag."));
359
+ }));
355
360
  });
356
361
  Video.defaultProps = {
357
- src: "https://youtu.be/wM-NT6hcw48",
362
+ src: "https://ucarecdn.com/7cae0dab-8966-4484-9998-602728c360ca/IMG_0048.MOV",
358
363
  poster: "https://ucarecdn.com/48d73272-3fe3-43f6-8b5b-22b68fc5a8c8/section.png",
359
364
  loop: false,
360
365
  type: "video/mp4",
@@ -363,113 +368,64 @@ Video.defaultProps = {
363
368
  muted: true,
364
369
  css: {
365
370
  "@desktop": {
366
- video: {
367
- height: "100%",
368
- width: "100%",
369
- aspectRatio: "16 / 9"
370
- }
371
+ height: "fit-content",
372
+ margin: 0,
373
+ outline: "none",
374
+ overflowWrap: "break-word",
375
+ padding: 0,
376
+ whitespace: "break-spaces",
377
+ width: "100%",
378
+ wordBreak: "break-word"
371
379
  }
372
380
  }
373
381
  };
374
382
  var video_default = Video;
375
383
 
376
384
  // src/elements/instagram.tsx
377
- import React11, { forwardRef as forwardRef9, useContext as useContext3, useEffect as useEffect2, useState } from "react";
378
-
379
- // src/elements/shared/Placeholder.tsx
380
- import React10, { forwardRef as forwardRef8 } from "react";
381
- var Placeholder = forwardRef8((props, ref) => {
382
- let _a = props, { element, children } = _a, rest = __objRest(_a, ["element", "children"]);
383
- let style = {
384
- height: "100%",
385
- display: "flex",
386
- flexDirection: "column",
387
- alignItems: "center",
388
- justifyContent: "center",
389
- color: "#374151"
390
- };
391
- return /* @__PURE__ */ React10.createElement("div", __spreadValues({
392
- style,
393
- ref
394
- }, rest), /* @__PURE__ */ React10.createElement("div", {
395
- style: { fontWeight: 600, marginBottom: "10px" }
396
- }, element), /* @__PURE__ */ React10.createElement("div", null, children));
397
- });
398
- var Placeholder_default = Placeholder;
399
-
400
- // src/elements/instagram.tsx
401
- var INSTAGRAM_API = "https://graph.instagram.com";
402
- var Instagram = forwardRef9((props, ref) => {
403
- const _a = props, { token, username, numberOfImages, imagesPerRow, gap } = _a, rest = __objRest(_a, ["token", "username", "numberOfImages", "imagesPerRow", "gap"]);
385
+ import React10, { forwardRef as forwardRef8, useContext as useContext3, useEffect as useEffect2, useState } from "react";
386
+ var Instagram = forwardRef8((props, ref) => {
387
+ const { stitchesInstance } = useContext3(WeaverseContext);
388
+ const _a = props, { token, numberOfImages, imagesPerRow, className } = _a, rest = __objRest(_a, ["token", "numberOfImages", "imagesPerRow", "className"]);
404
389
  const [media, setMedia] = useState([]);
405
- const [error, setError] = useState(null);
406
- let { isDesignMode } = useContext3(WeaverseContext);
407
390
  useEffect2(() => {
408
- if (token) {
409
- let params = new URLSearchParams({
410
- access_token: token,
411
- fields: "id,media_type,caption,media_url,permalink"
412
- });
413
- fetch(`${INSTAGRAM_API}/me/media?${params.toString()}`).then((res) => res.json()).then((res) => {
414
- if (res.error) {
415
- setError(res);
416
- } else {
417
- setError(null);
418
- setMedia([...res.data]);
419
- }
420
- }).catch(setError);
421
- }
391
+ const url = `https://graph.instagram.com/me/media?fields=id,media_type,caption,media_url&access_token=${token}`;
392
+ fetch(url).then((res) => res.json()).then((res) => {
393
+ setMedia(res.data);
394
+ });
422
395
  }, [token]);
423
- if (!token || error) {
424
- return /* @__PURE__ */ React11.createElement("div", __spreadValues({
425
- ref
426
- }, rest), /* @__PURE__ */ React11.createElement(Placeholder_default, {
427
- element: "Instagram"
428
- }, !token ? "Connect your Instagram account to display photos on your site." : "Invalid or expired token!"));
429
- }
430
- let style = {
431
- "--wv-ig-images-per-row": imagesPerRow,
432
- "--wv-ig-images-gap": gap
396
+ const css = {
397
+ gridTemplateColumns: `repeat(${imagesPerRow[0] || 1}, 1fr)`
433
398
  };
434
- return /* @__PURE__ */ React11.createElement("div", __spreadProps(__spreadValues({
399
+ const { className: instagramClass = "" } = stitchesInstance.css(css)();
400
+ return /* @__PURE__ */ React10.createElement("div", __spreadValues({
401
+ className: `${className} ${instagramClass}`,
435
402
  ref
436
- }, rest), {
437
- style
438
- }), /* @__PURE__ */ React11.createElement("div", {
439
- className: "wv-ig-media-container"
440
- }, media.slice(0, numberOfImages).map((item) => {
441
- let linkProps;
442
- if (!isDesignMode) {
443
- linkProps = { href: item.permalink, target: "_blank" };
444
- }
445
- return /* @__PURE__ */ React11.createElement("a", __spreadValues({
446
- key: item.id
447
- }, linkProps), /* @__PURE__ */ React11.createElement("img", {
403
+ }, rest), !token ? "Token is empty" : media.map((item, key) => {
404
+ return /* @__PURE__ */ React10.createElement("div", {
405
+ key,
406
+ className: "wv-instagram-item"
407
+ }, /* @__PURE__ */ React10.createElement("img", {
408
+ width: "100%",
409
+ height: "100%",
448
410
  alt: item.caption,
449
411
  src: item.media_url
450
412
  }));
451
- })));
413
+ }));
452
414
  });
453
415
  Instagram.defaultProps = {
454
416
  token: "",
455
- username: "",
456
- numberOfImages: 8,
457
- imagesPerRow: 4,
458
- gap: 0,
417
+ numberOfImages: [12],
418
+ imagesPerRow: [4],
459
419
  css: {
460
420
  "@desktop": {
461
- ".wv-ig-media-container": {
462
- overflow: "hidden",
463
- maxWidth: "100%",
464
- maxHeight: "100%",
465
- display: "grid",
466
- gridTemplateColumns: "repeat(var(--wv-ig-images-per-row, 4), 1fr)",
467
- gap: "var(--wv-ig-images-gap, 0px)",
468
- img: {
469
- aspectRatio: "1 / 1",
470
- width: "100%",
471
- height: "100%",
472
- objectFit: "cover"
421
+ display: "grid",
422
+ gridTemplateColumns: "repeat(4, 1fr)",
423
+ "& .wv-instagram-item": {
424
+ width: "100%",
425
+ height: "100%",
426
+ backgroundColor: "red",
427
+ "& img": {
428
+ objectFit: "contain"
473
429
  }
474
430
  }
475
431
  }
@@ -532,7 +488,7 @@ var WeaverseContextConsumer = WeaverseContext.Consumer;
532
488
 
533
489
  // src/renderer.tsx
534
490
  import { isBrowser } from "@weaverse/core";
535
- import React12, { useContext as useContext4, useEffect as useEffect3, useRef, useState as useState2 } from "react";
491
+ import React11, { useContext as useContext4, useEffect as useEffect3, useRef, useState as useState2 } from "react";
536
492
 
537
493
  // src/utils/index.ts
538
494
  var shortCssObject = (css) => {
@@ -575,13 +531,13 @@ var WeaverseRoot = ({ context }) => {
575
531
  }, []);
576
532
  let eventHandlers = ((_a = context == null ? void 0 : context.studioBridge) == null ? void 0 : _a.eventHandlers) || {};
577
533
  let themeClass = context.stitchesInstance.theme.className;
578
- return /* @__PURE__ */ React12.createElement("div", __spreadProps(__spreadValues({
534
+ return /* @__PURE__ */ React11.createElement("div", __spreadProps(__spreadValues({
579
535
  className: `weaverse-content-root ${themeClass}`
580
536
  }, eventHandlers), {
581
537
  ref: rootRef
582
- }), /* @__PURE__ */ React12.createElement(WeaverseContextProvider, {
538
+ }), /* @__PURE__ */ React11.createElement(WeaverseContextProvider, {
583
539
  value: context
584
- }, /* @__PURE__ */ React12.createElement(ItemInstance, {
540
+ }, /* @__PURE__ */ React11.createElement(ItemInstance, {
585
541
  id: context.projectData.rootId || 0
586
542
  })));
587
543
  };
@@ -609,12 +565,12 @@ var ItemComponent = ({ instance }) => {
609
565
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
610
566
  rest.ref = instance.ref;
611
567
  }
612
- return /* @__PURE__ */ React12.createElement(Component, __spreadValues({
568
+ return /* @__PURE__ */ React11.createElement(Component, __spreadValues({
613
569
  key: id,
614
570
  "data-wv-type": type,
615
571
  "data-wv-id": id,
616
572
  className: generateItemClass(instance, stitchesInstance)
617
- }, rest), childIds.map((id2) => /* @__PURE__ */ React12.createElement(ItemInstance, {
573
+ }, rest), childIds.map((id2) => /* @__PURE__ */ React11.createElement(ItemInstance, {
618
574
  key: id2,
619
575
  id: id2
620
576
  })));
@@ -626,11 +582,11 @@ var ItemInstance = ({ id }) => {
626
582
  let { itemInstances } = context;
627
583
  let instance = itemInstances.get(id);
628
584
  if (!instance) {
629
- return /* @__PURE__ */ React12.createElement("div", {
585
+ return /* @__PURE__ */ React11.createElement("div", {
630
586
  style: { display: "none" }
631
587
  }, "Item instance ", id, " not found");
632
588
  }
633
- return /* @__PURE__ */ React12.createElement(ItemComponent, {
589
+ return /* @__PURE__ */ React11.createElement(ItemComponent, {
634
590
  instance
635
591
  });
636
592
  };
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.6.20",
2
+ "version": "0.6.21",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -31,6 +31,6 @@
31
31
  "name": "@weaverse/react",
32
32
  "author": "Weaverse Team",
33
33
  "dependencies": {
34
- "@weaverse/core": "0.6.20"
34
+ "@weaverse/core": "0.6.21"
35
35
  }
36
36
  }