@weaverse/react 0.6.21 → 0.6.24

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,5 +1,6 @@
1
1
  import * as react from 'react';
2
- import { WeaverseType, Weaverse, WeaverseItemStore } from '@weaverse/core';
2
+ import { ReactElement, ReactNode } from 'react';
3
+ import { WeaverseType, Weaverse, ElementCSS, WeaverseItemStore } from '@weaverse/core';
3
4
  export * from '@weaverse/core';
4
5
 
5
6
  declare let createRootContext: (configs: WeaverseType) => Weaverse;
@@ -7,17 +8,85 @@ declare let WeaverseContext: react.Context<Weaverse>;
7
8
  declare let WeaverseContextProvider: react.Provider<Weaverse>;
8
9
  declare let WeaverseContextConsumer: react.Consumer<Weaverse>;
9
10
 
10
- interface WeaverseElementProps {
11
- children?: React.ReactNode;
11
+ interface WeaverseElementProps extends ReactElement {
12
+ css?: ElementCSS;
13
+ children?: ReactElement | ReactElement[] | ReactNode | ReactNode[];
12
14
  }
13
15
  declare type WeaverseRootPropsType = {
14
16
  context: Weaverse;
15
17
  };
16
- declare type CountdownTimeKey = 'days' | 'hours' | 'minutes' | 'seconds';
17
18
  declare type ItemComponentProps = {
18
19
  instance: InstanceType<typeof WeaverseItemStore>;
19
20
  };
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
+ };
20
89
 
21
90
  declare let WeaverseRoot: ({ context }: WeaverseRootPropsType) => JSX.Element;
22
91
 
23
- export { CountdownTimeKey, ItemComponentProps, WeaverseContext, WeaverseContextConsumer, WeaverseContextProvider, WeaverseElementProps, WeaverseRoot, WeaverseRootPropsType, createRootContext };
92
+ export { ButtonElementProps, ContainerElementProps, CountdownElementProps, CountdownTimeKey, ImageElementProps, InstagramElementProps, InstagramMedia, ItemComponentProps, LayoutElementProps, MapElementProps, PlaceholderProps, TextElementProps, TimerBlockProps, VideoElementProps, 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_react9 = require("react");
65
+ var import_react13 = 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
- const _a = props, { openInNewTab, target, value } = _a, rest = __objRest(_a, ["openInNewTab", "target", "value"]);
70
+ let _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,9 +102,10 @@ 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"]);
105
106
  return /* @__PURE__ */ import_react.default.createElement("div", __spreadValues({
106
107
  ref
107
- }, props));
108
+ }, rest), children);
108
109
  });
109
110
  Container.defaultProps = {
110
111
  css: {
@@ -178,7 +179,7 @@ var Countdown = (0, import_react3.forwardRef)((props, ref) => {
178
179
  }
179
180
  (0, import_react3.useEffect)(() => {
180
181
  const flag = setInterval(() => {
181
- const remainingTime = Math.max((timerType === "specific" ? new Date(endTime).getTime() : new Date(startTime).getTime() + periods * 60 * 1e3) - Date.now(), 0);
182
+ const remainingTime = Math.max((timerType === "fixed-time" ? new Date(endTime).getTime() : new Date(startTime).getTime() + periods * 60 * 1e3) - Date.now(), 0);
182
183
  if (!isDesignMode && redirectUrl && remainingTime > 0 && remainingTime < 1e3) {
183
184
  window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
184
185
  }
@@ -203,7 +204,7 @@ var Countdown = (0, import_react3.forwardRef)((props, ref) => {
203
204
  }));
204
205
  });
205
206
  Countdown.defaultProps = {
206
- timerType: "specific",
207
+ timerType: "fixed-time",
207
208
  startTime: Date.now(),
208
209
  endTime: 1661140528e3,
209
210
  periods: 90,
@@ -223,7 +224,7 @@ Countdown.defaultProps = {
223
224
  width: 48,
224
225
  textAlign: "center"
225
226
  },
226
- "& .wv-countdown-label": {
227
+ ".wv-countdown-label": {
227
228
  fontSize: 10
228
229
  },
229
230
  "& > span": {
@@ -240,10 +241,10 @@ var countdown_default = Countdown;
240
241
  // src/elements/image.tsx
241
242
  var import_react4 = __toESM(require("react"));
242
243
  var Image = import_react4.default.forwardRef((props, ref) => {
243
- let _a = props, { src, alt, children } = _a, rest = __objRest(_a, ["src", "alt", "children"]);
244
- return /* @__PURE__ */ import_react4.default.createElement("img", __spreadProps(__spreadValues({
244
+ let _a = props, { src, alt } = _a, rest = __objRest(_a, ["src", "alt"]);
245
+ return /* @__PURE__ */ import_react4.default.createElement("div", __spreadValues({
245
246
  ref
246
- }, rest), {
247
+ }, rest), /* @__PURE__ */ import_react4.default.createElement("img", {
247
248
  alt,
248
249
  src
249
250
  }));
@@ -253,12 +254,11 @@ Image.defaultProps = {
253
254
  alt: "weaverse image element",
254
255
  css: {
255
256
  "@desktop": {
256
- width: "100%",
257
- height: "100%",
258
- objectFit: "cover"
259
- },
260
- "@mobile": {
261
- display: "block"
257
+ img: {
258
+ width: "100%",
259
+ height: "100%",
260
+ objectFit: "cover"
261
+ }
262
262
  }
263
263
  }
264
264
  };
@@ -268,17 +268,19 @@ 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
- 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", {
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", {
282
284
  "data-layout-content": true
283
285
  }, children));
284
286
  });
@@ -317,7 +319,7 @@ var layout_default = Layout;
317
319
  // src/elements/map.tsx
318
320
  var import_react6 = __toESM(require("react"));
319
321
  var Map = (0, import_react6.forwardRef)((props, ref) => {
320
- const _a = props, { place, zoom } = _a, rest = __objRest(_a, ["place", "zoom"]);
322
+ let _a = props, { place, zoom } = _a, rest = __objRest(_a, ["place", "zoom"]);
321
323
  return /* @__PURE__ */ import_react6.default.createElement("div", __spreadValues({
322
324
  ref
323
325
  }, rest), /* @__PURE__ */ import_react6.default.createElement("iframe", {
@@ -327,19 +329,12 @@ var Map = (0, import_react6.forwardRef)((props, ref) => {
327
329
  height: "100%",
328
330
  title: "map",
329
331
  src: `https://maps.google.com/maps?z=${zoom}&t=m&q=${place}&ie=UTF8&&output=embed`,
330
- style: {
331
- pointerEvents: "none"
332
- }
332
+ style: { pointerEvents: "none" }
333
333
  }));
334
334
  });
335
335
  Map.defaultProps = {
336
336
  place: "Hanoi",
337
- zoom: 14,
338
- css: {
339
- "@desktop": {
340
- gridArea: "1 / 1 / 11 / 13"
341
- }
342
- }
337
+ zoom: 14
343
338
  };
344
339
  var map_default = Map;
345
340
 
@@ -359,8 +354,7 @@ Text.defaultProps = {
359
354
  "@desktop": {
360
355
  width: "100%",
361
356
  height: "fit-content",
362
- padding: 0,
363
- margin: 0,
357
+ padding: "20px",
364
358
  outline: "none",
365
359
  wordBreak: "break-word",
366
360
  overflowWrap: "break-word",
@@ -373,23 +367,24 @@ var text_default = Text;
373
367
  // src/elements/video.tsx
374
368
  var import_react7 = __toESM(require("react"));
375
369
  var Video = (0, import_react7.forwardRef)((props, ref) => {
376
- const { isDesignMode } = (0, import_react7.useContext)(WeaverseContext);
370
+ let { isDesignMode } = (0, import_react7.useContext)(WeaverseContext);
377
371
  let _a = props, { src, type, controls, poster, autoPlay, loop, muted } = _a, rest = __objRest(_a, ["src", "type", "controls", "poster", "autoPlay", "loop", "muted"]);
378
- return /* @__PURE__ */ import_react7.default.createElement("video", __spreadValues({
379
- ref,
372
+ return /* @__PURE__ */ import_react7.default.createElement("div", __spreadValues({
373
+ ref
374
+ }, rest), /* @__PURE__ */ import_react7.default.createElement("video", {
380
375
  controls: isDesignMode ? false : controls,
381
376
  autoPlay: isDesignMode ? false : autoPlay,
382
377
  loop,
383
378
  muted: true,
384
379
  controlsList: "nodownload",
385
380
  disablePictureInPicture: true
386
- }, rest), /* @__PURE__ */ import_react7.default.createElement("source", {
381
+ }, /* @__PURE__ */ import_react7.default.createElement("source", {
387
382
  src,
388
383
  type: type || "video/mp4"
389
- }));
384
+ }), "Your browser does not support the video tag."));
390
385
  });
391
386
  Video.defaultProps = {
392
- src: "https://ucarecdn.com/7cae0dab-8966-4484-9998-602728c360ca/IMG_0048.MOV",
387
+ src: "https://youtu.be/wM-NT6hcw48",
393
388
  poster: "https://ucarecdn.com/48d73272-3fe3-43f6-8b5b-22b68fc5a8c8/section.png",
394
389
  loop: false,
395
390
  type: "video/mp4",
@@ -398,64 +393,117 @@ Video.defaultProps = {
398
393
  muted: true,
399
394
  css: {
400
395
  "@desktop": {
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"
396
+ video: {
397
+ height: "100%",
398
+ width: "100%",
399
+ aspectRatio: "16 / 9"
400
+ }
409
401
  }
410
402
  }
411
403
  };
412
404
  var video_default = Video;
413
405
 
414
406
  // src/elements/instagram.tsx
407
+ var import_react9 = __toESM(require("react"));
408
+
409
+ // src/elements/shared/Placeholder.tsx
415
410
  var import_react8 = __toESM(require("react"));
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
- });
425
- }, [token]);
426
- const css = {
427
- gridTemplateColumns: `repeat(${imagesPerRow[0] || 1}, 1fr)`
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
+ position: "absolute",
415
+ height: "100%",
416
+ width: "100%",
417
+ display: "flex",
418
+ flexDirection: "column",
419
+ alignItems: "center",
420
+ justifyContent: "center",
421
+ color: "#374151",
422
+ pointerEvents: "none",
423
+ zIndex: 1
428
424
  };
429
- const { className: instagramClass = "" } = stitchesInstance.css(css)();
430
425
  return /* @__PURE__ */ import_react8.default.createElement("div", __spreadValues({
431
- className: `${className} ${instagramClass}`,
426
+ style,
432
427
  ref
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%",
428
+ }, rest), /* @__PURE__ */ import_react8.default.createElement("div", {
429
+ style: { fontWeight: 600, marginBottom: "10px" }
430
+ }, element), /* @__PURE__ */ import_react8.default.createElement("div", null, children));
431
+ });
432
+ var Placeholder_default = Placeholder;
433
+
434
+ // src/elements/instagram.tsx
435
+ var INSTAGRAM_API = "https://graph.instagram.com";
436
+ var Instagram = (0, import_react9.forwardRef)((props, ref) => {
437
+ const _a = props, { token, username, numberOfImages, imagesPerRow, gap } = _a, rest = __objRest(_a, ["token", "username", "numberOfImages", "imagesPerRow", "gap"]);
438
+ const [media, setMedia] = (0, import_react9.useState)([]);
439
+ const [error, setError] = (0, import_react9.useState)(null);
440
+ let { isDesignMode } = (0, import_react9.useContext)(WeaverseContext);
441
+ (0, import_react9.useEffect)(() => {
442
+ if (token) {
443
+ let params = new URLSearchParams({
444
+ access_token: token,
445
+ fields: "id,media_type,caption,media_url,permalink"
446
+ });
447
+ fetch(`${INSTAGRAM_API}/me/media?${params.toString()}`).then((res) => res.json()).then((res) => {
448
+ if (res.error) {
449
+ setError(res);
450
+ } else {
451
+ setError(null);
452
+ setMedia([...res.data]);
453
+ }
454
+ }).catch(setError);
455
+ }
456
+ }, [token]);
457
+ if (!token || error) {
458
+ return /* @__PURE__ */ import_react9.default.createElement("div", __spreadValues({
459
+ ref
460
+ }, rest), /* @__PURE__ */ import_react9.default.createElement(Placeholder_default, {
461
+ element: "Instagram"
462
+ }, !token ? "Connect your Instagram account to display photos on your site." : "Invalid or expired token!"));
463
+ }
464
+ let style = {
465
+ "--wv-ig-images-per-row": imagesPerRow,
466
+ "--wv-ig-images-gap": gap
467
+ };
468
+ return /* @__PURE__ */ import_react9.default.createElement("div", __spreadProps(__spreadValues({
469
+ ref
470
+ }, rest), {
471
+ style
472
+ }), /* @__PURE__ */ import_react9.default.createElement("div", {
473
+ className: "wv-ig-media-container"
474
+ }, media.slice(0, numberOfImages).map((item) => {
475
+ let linkProps;
476
+ if (!isDesignMode) {
477
+ linkProps = { href: item.permalink, target: "_blank" };
478
+ }
479
+ return /* @__PURE__ */ import_react9.default.createElement("a", __spreadValues({
480
+ key: item.id
481
+ }, linkProps), /* @__PURE__ */ import_react9.default.createElement("img", {
440
482
  alt: item.caption,
441
483
  src: item.media_url
442
484
  }));
443
- }));
485
+ })));
444
486
  });
445
487
  Instagram.defaultProps = {
446
488
  token: "",
447
- numberOfImages: [12],
448
- imagesPerRow: [4],
489
+ username: "",
490
+ numberOfImages: 8,
491
+ imagesPerRow: 4,
492
+ gap: 0,
449
493
  css: {
450
494
  "@desktop": {
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"
495
+ ".wv-ig-media-container": {
496
+ overflow: "hidden",
497
+ maxWidth: "100%",
498
+ maxHeight: "100%",
499
+ display: "grid",
500
+ gridTemplateColumns: "repeat(var(--wv-ig-images-per-row, 4), 1fr)",
501
+ gap: "var(--wv-ig-images-gap, 0px)",
502
+ img: {
503
+ aspectRatio: "1 / 1",
504
+ width: "100%",
505
+ height: "100%",
506
+ objectFit: "cover"
459
507
  }
460
508
  }
461
509
  }
@@ -463,6 +511,126 @@ Instagram.defaultProps = {
463
511
  };
464
512
  var instagram_default = Instagram;
465
513
 
514
+ // src/elements/accordion/index.tsx
515
+ var import_react10 = __toESM(require("react"));
516
+ var AccordionContext = (0, import_react10.createContext)({
517
+ active: null,
518
+ setActive: () => {
519
+ }
520
+ });
521
+ var Accordion = (0, import_react10.forwardRef)((props, ref) => {
522
+ const _a = props, { items, children } = _a, rest = __objRest(_a, ["items", "children"]);
523
+ const [active, setActive] = (0, import_react10.useState)(null);
524
+ const setOpenAccordion = (id) => {
525
+ if (id === active) {
526
+ setActive(null);
527
+ } else {
528
+ setActive(id);
529
+ }
530
+ };
531
+ console.info("9779 active", active);
532
+ return /* @__PURE__ */ import_react10.default.createElement("div", __spreadValues({
533
+ ref
534
+ }, rest), /* @__PURE__ */ import_react10.default.createElement(AccordionContext.Provider, {
535
+ value: { active, setActive: setOpenAccordion }
536
+ }, children));
537
+ });
538
+ Accordion.defaultProps = {
539
+ items: [
540
+ {
541
+ id: 1,
542
+ headerText: "Header 1",
543
+ childrenId: true
544
+ },
545
+ {
546
+ id: 2,
547
+ headerText: "Header 2"
548
+ }
549
+ ],
550
+ css: {
551
+ "@desktop": {
552
+ display: "flex",
553
+ flexDirection: "column",
554
+ gap: 4,
555
+ ".wv-accordion-header": {
556
+ borderRadius: 4,
557
+ padding: 4,
558
+ marginBottom: 4,
559
+ backgroundColor: "#aaa",
560
+ "&.active": {
561
+ color: "blue"
562
+ },
563
+ '&.active + [data-wv-type="accordion.content"]': {
564
+ display: "grid"
565
+ }
566
+ }
567
+ }
568
+ }
569
+ };
570
+ var accordion_default = Accordion;
571
+
572
+ // src/elements/accordion/AccordionWrapper.tsx
573
+ var import_react11 = __toESM(require("react"));
574
+ var AccordionWrapper = (0, import_react11.forwardRef)((props, ref) => {
575
+ const _a = props, { wrapperId, headerText, children } = _a, rest = __objRest(_a, ["wrapperId", "headerText", "children"]);
576
+ const { active, setActive } = (0, import_react11.useContext)(AccordionContext);
577
+ return /* @__PURE__ */ import_react11.default.createElement("div", __spreadValues({
578
+ ref
579
+ }, rest), /* @__PURE__ */ import_react11.default.createElement("div", {
580
+ onClick: () => setActive(wrapperId),
581
+ className: `wv-accordion-header ${active === wrapperId ? "active" : ""}`
582
+ }, headerText, " #", wrapperId), children);
583
+ });
584
+ AccordionWrapper.defaultProps = {
585
+ wrapperId: 1,
586
+ headerText: "Header 1",
587
+ css: {
588
+ "@desktop": {
589
+ maxHeight: "100%"
590
+ }
591
+ }
592
+ };
593
+ var AccordionWrapper_default = AccordionWrapper;
594
+
595
+ // src/elements/accordion/AccordionContent.tsx
596
+ var import_react12 = __toESM(require("react"));
597
+ var AccordionContent = (0, import_react12.forwardRef)((props, ref) => {
598
+ const _a = props, { rows, columns, gap, rowSize, children } = _a, rest = __objRest(_a, ["rows", "columns", "gap", "rowSize", "children"]);
599
+ let style = {
600
+ "--rows": rows,
601
+ "--columns": columns,
602
+ "--gap": gap + "px",
603
+ "--row-size": rowSize + "px",
604
+ "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))"
605
+ };
606
+ return /* @__PURE__ */ import_react12.default.createElement("div", __spreadProps(__spreadValues({
607
+ ref
608
+ }, rest), {
609
+ style
610
+ }), import_react12.default.Children.count(children) > 0 ? children : /* @__PURE__ */ import_react12.default.createElement(Placeholder_default, {
611
+ element: "Accordion"
612
+ }, "Item Content"));
613
+ });
614
+ AccordionContent.defaultProps = {
615
+ rows: 2,
616
+ columns: 12,
617
+ gap: 4,
618
+ rowSize: 48,
619
+ css: {
620
+ "@desktop": {
621
+ width: "100%",
622
+ maxWidth: "var(--grid-size)",
623
+ backgroundColor: "#DDD",
624
+ display: "none",
625
+ gridTemplateRows: "repeat(var(--rows), var(--row-size))",
626
+ gridTemplateColumns: "repeat(var(--columns), minmax(0, var(--col-size)))",
627
+ gap: "var(--gap)",
628
+ borderRadius: 4
629
+ }
630
+ }
631
+ };
632
+ var AccordionContent_default = AccordionContent;
633
+
466
634
  // src/elements/index.ts
467
635
  var elements = {
468
636
  Countdown: {
@@ -500,6 +668,18 @@ var elements = {
500
668
  Video: {
501
669
  Component: video_default,
502
670
  type: "video"
671
+ },
672
+ Accordion: {
673
+ Component: accordion_default,
674
+ type: "accordion"
675
+ },
676
+ AccordionWrapper: {
677
+ Component: AccordionWrapper_default,
678
+ type: "accordion.wrapper"
679
+ },
680
+ AccordionContent: {
681
+ Component: AccordionContent_default,
682
+ type: "accordion.content"
503
683
  }
504
684
  };
505
685
  var elements_default = elements;
@@ -512,13 +692,13 @@ var createRootContext = (configs) => {
512
692
  });
513
693
  return rootContext;
514
694
  };
515
- var WeaverseContext = (0, import_react9.createContext)({});
695
+ var WeaverseContext = (0, import_react13.createContext)({});
516
696
  var WeaverseContextProvider = WeaverseContext.Provider;
517
697
  var WeaverseContextConsumer = WeaverseContext.Consumer;
518
698
 
519
699
  // src/renderer.tsx
520
700
  var import_core2 = require("@weaverse/core");
521
- var import_react10 = __toESM(require("react"));
701
+ var import_react14 = __toESM(require("react"));
522
702
 
523
703
  // src/utils/index.ts
524
704
  var shortCssObject = (css) => {
@@ -546,9 +726,9 @@ function generateItemClass(instance, stitchesInstance) {
546
726
  // src/renderer.tsx
547
727
  var WeaverseRoot = ({ context }) => {
548
728
  var _a;
549
- let [, setData] = (0, import_react10.useState)(context.projectData);
550
- let rootRef = (0, import_react10.useRef)();
551
- (0, import_react10.useEffect)(() => {
729
+ let [, setData] = (0, import_react14.useState)(context.projectData);
730
+ let rootRef = (0, import_react14.useRef)();
731
+ (0, import_react14.useEffect)(() => {
552
732
  let update = () => setData({});
553
733
  context.subscribe(update);
554
734
  if (context.projectData) {
@@ -561,21 +741,21 @@ var WeaverseRoot = ({ context }) => {
561
741
  }, []);
562
742
  let eventHandlers = ((_a = context == null ? void 0 : context.studioBridge) == null ? void 0 : _a.eventHandlers) || {};
563
743
  let themeClass = context.stitchesInstance.theme.className;
564
- return /* @__PURE__ */ import_react10.default.createElement("div", __spreadProps(__spreadValues({
744
+ return /* @__PURE__ */ import_react14.default.createElement("div", __spreadProps(__spreadValues({
565
745
  className: `weaverse-content-root ${themeClass}`
566
746
  }, eventHandlers), {
567
747
  ref: rootRef
568
- }), /* @__PURE__ */ import_react10.default.createElement(WeaverseContextProvider, {
748
+ }), /* @__PURE__ */ import_react14.default.createElement(WeaverseContextProvider, {
569
749
  value: context
570
- }, /* @__PURE__ */ import_react10.default.createElement(ItemInstance, {
750
+ }, /* @__PURE__ */ import_react14.default.createElement(ItemInstance, {
571
751
  id: context.projectData.rootId || 0
572
752
  })));
573
753
  };
574
754
  var ItemComponent = ({ instance }) => {
575
- let { stitchesInstance, elementInstances } = (0, import_react10.useContext)(WeaverseContext);
576
- let [data, setData] = (0, import_react10.useState)(instance.data);
755
+ let { stitchesInstance, elementInstances } = (0, import_react14.useContext)(WeaverseContext);
756
+ let [data, setData] = (0, import_react14.useState)(instance.data);
577
757
  let _a = data, { id, type, childIds = [], css, className } = _a, rest = __objRest(_a, ["id", "type", "childIds", "css", "className"]);
578
- (0, import_react10.useEffect)(() => {
758
+ (0, import_react14.useEffect)(() => {
579
759
  var _a2;
580
760
  let update = (data2) => setData(__spreadValues({}, data2));
581
761
  instance.subscribe(update);
@@ -595,12 +775,12 @@ var ItemComponent = ({ instance }) => {
595
775
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
596
776
  rest.ref = instance.ref;
597
777
  }
598
- return /* @__PURE__ */ import_react10.default.createElement(Component, __spreadValues({
778
+ return /* @__PURE__ */ import_react14.default.createElement(Component, __spreadValues({
599
779
  key: id,
600
780
  "data-wv-type": type,
601
781
  "data-wv-id": id,
602
782
  className: generateItemClass(instance, stitchesInstance)
603
- }, rest), childIds.map((id2) => /* @__PURE__ */ import_react10.default.createElement(ItemInstance, {
783
+ }, rest), childIds.map((id2) => /* @__PURE__ */ import_react14.default.createElement(ItemInstance, {
604
784
  key: id2,
605
785
  id: id2
606
786
  })));
@@ -608,15 +788,15 @@ var ItemComponent = ({ instance }) => {
608
788
  return null;
609
789
  };
610
790
  var ItemInstance = ({ id }) => {
611
- let context = (0, import_react10.useContext)(WeaverseContext);
791
+ let context = (0, import_react14.useContext)(WeaverseContext);
612
792
  let { itemInstances } = context;
613
793
  let instance = itemInstances.get(id);
614
794
  if (!instance) {
615
- return /* @__PURE__ */ import_react10.default.createElement("div", {
795
+ return /* @__PURE__ */ import_react14.default.createElement("div", {
616
796
  style: { display: "none" }
617
797
  }, "Item instance ", id, " not found");
618
798
  }
619
- return /* @__PURE__ */ import_react10.default.createElement(ItemComponent, {
799
+ return /* @__PURE__ */ import_react14.default.createElement(ItemComponent, {
620
800
  instance
621
801
  });
622
802
  };
package/dist/index.mjs CHANGED
@@ -32,12 +32,12 @@ var __objRest = (source, exclude) => {
32
32
 
33
33
  // src/context.ts
34
34
  import { Weaverse } from "@weaverse/core";
35
- import { createContext } from "react";
35
+ import { createContext as createContext2 } from "react";
36
36
 
37
37
  // src/elements/button.tsx
38
38
  import * as React from "react";
39
39
  var Button = React.forwardRef((props, ref) => {
40
- const _a = props, { openInNewTab, target, value } = _a, rest = __objRest(_a, ["openInNewTab", "target", "value"]);
40
+ let _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,9 +72,10 @@ 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"]);
75
76
  return /* @__PURE__ */ React2.createElement("div", __spreadValues({
76
77
  ref
77
- }, props));
78
+ }, rest), children);
78
79
  });
79
80
  Container.defaultProps = {
80
81
  css: {
@@ -148,7 +149,7 @@ var Countdown = forwardRef3((props, ref) => {
148
149
  }
149
150
  useEffect(() => {
150
151
  const flag = setInterval(() => {
151
- const remainingTime = Math.max((timerType === "specific" ? new Date(endTime).getTime() : new Date(startTime).getTime() + periods * 60 * 1e3) - Date.now(), 0);
152
+ const remainingTime = Math.max((timerType === "fixed-time" ? new Date(endTime).getTime() : new Date(startTime).getTime() + periods * 60 * 1e3) - Date.now(), 0);
152
153
  if (!isDesignMode && redirectUrl && remainingTime > 0 && remainingTime < 1e3) {
153
154
  window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
154
155
  }
@@ -173,7 +174,7 @@ var Countdown = forwardRef3((props, ref) => {
173
174
  }));
174
175
  });
175
176
  Countdown.defaultProps = {
176
- timerType: "specific",
177
+ timerType: "fixed-time",
177
178
  startTime: Date.now(),
178
179
  endTime: 1661140528e3,
179
180
  periods: 90,
@@ -193,7 +194,7 @@ Countdown.defaultProps = {
193
194
  width: 48,
194
195
  textAlign: "center"
195
196
  },
196
- "& .wv-countdown-label": {
197
+ ".wv-countdown-label": {
197
198
  fontSize: 10
198
199
  },
199
200
  "& > span": {
@@ -210,10 +211,10 @@ var countdown_default = Countdown;
210
211
  // src/elements/image.tsx
211
212
  import React5 from "react";
212
213
  var Image = React5.forwardRef((props, ref) => {
213
- let _a = props, { src, alt, children } = _a, rest = __objRest(_a, ["src", "alt", "children"]);
214
- return /* @__PURE__ */ React5.createElement("img", __spreadProps(__spreadValues({
214
+ let _a = props, { src, alt } = _a, rest = __objRest(_a, ["src", "alt"]);
215
+ return /* @__PURE__ */ React5.createElement("div", __spreadValues({
215
216
  ref
216
- }, rest), {
217
+ }, rest), /* @__PURE__ */ React5.createElement("img", {
217
218
  alt,
218
219
  src
219
220
  }));
@@ -223,12 +224,11 @@ Image.defaultProps = {
223
224
  alt: "weaverse image element",
224
225
  css: {
225
226
  "@desktop": {
226
- width: "100%",
227
- height: "100%",
228
- objectFit: "cover"
229
- },
230
- "@mobile": {
231
- display: "block"
227
+ img: {
228
+ width: "100%",
229
+ height: "100%",
230
+ objectFit: "cover"
231
+ }
232
232
  }
233
233
  }
234
234
  };
@@ -238,17 +238,19 @@ 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
- 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", {
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", {
252
254
  "data-layout-content": true
253
255
  }, children));
254
256
  });
@@ -287,7 +289,7 @@ var layout_default = Layout;
287
289
  // src/elements/map.tsx
288
290
  import React7, { forwardRef as forwardRef5 } from "react";
289
291
  var Map = forwardRef5((props, ref) => {
290
- const _a = props, { place, zoom } = _a, rest = __objRest(_a, ["place", "zoom"]);
292
+ let _a = props, { place, zoom } = _a, rest = __objRest(_a, ["place", "zoom"]);
291
293
  return /* @__PURE__ */ React7.createElement("div", __spreadValues({
292
294
  ref
293
295
  }, rest), /* @__PURE__ */ React7.createElement("iframe", {
@@ -297,19 +299,12 @@ var Map = forwardRef5((props, ref) => {
297
299
  height: "100%",
298
300
  title: "map",
299
301
  src: `https://maps.google.com/maps?z=${zoom}&t=m&q=${place}&ie=UTF8&&output=embed`,
300
- style: {
301
- pointerEvents: "none"
302
- }
302
+ style: { pointerEvents: "none" }
303
303
  }));
304
304
  });
305
305
  Map.defaultProps = {
306
306
  place: "Hanoi",
307
- zoom: 14,
308
- css: {
309
- "@desktop": {
310
- gridArea: "1 / 1 / 11 / 13"
311
- }
312
- }
307
+ zoom: 14
313
308
  };
314
309
  var map_default = Map;
315
310
 
@@ -329,8 +324,7 @@ Text.defaultProps = {
329
324
  "@desktop": {
330
325
  width: "100%",
331
326
  height: "fit-content",
332
- padding: 0,
333
- margin: 0,
327
+ padding: "20px",
334
328
  outline: "none",
335
329
  wordBreak: "break-word",
336
330
  overflowWrap: "break-word",
@@ -343,23 +337,24 @@ var text_default = Text;
343
337
  // src/elements/video.tsx
344
338
  import React9, { forwardRef as forwardRef7, useContext as useContext2 } from "react";
345
339
  var Video = forwardRef7((props, ref) => {
346
- const { isDesignMode } = useContext2(WeaverseContext);
340
+ let { isDesignMode } = useContext2(WeaverseContext);
347
341
  let _a = props, { src, type, controls, poster, autoPlay, loop, muted } = _a, rest = __objRest(_a, ["src", "type", "controls", "poster", "autoPlay", "loop", "muted"]);
348
- return /* @__PURE__ */ React9.createElement("video", __spreadValues({
349
- ref,
342
+ return /* @__PURE__ */ React9.createElement("div", __spreadValues({
343
+ ref
344
+ }, rest), /* @__PURE__ */ React9.createElement("video", {
350
345
  controls: isDesignMode ? false : controls,
351
346
  autoPlay: isDesignMode ? false : autoPlay,
352
347
  loop,
353
348
  muted: true,
354
349
  controlsList: "nodownload",
355
350
  disablePictureInPicture: true
356
- }, rest), /* @__PURE__ */ React9.createElement("source", {
351
+ }, /* @__PURE__ */ React9.createElement("source", {
357
352
  src,
358
353
  type: type || "video/mp4"
359
- }));
354
+ }), "Your browser does not support the video tag."));
360
355
  });
361
356
  Video.defaultProps = {
362
- src: "https://ucarecdn.com/7cae0dab-8966-4484-9998-602728c360ca/IMG_0048.MOV",
357
+ src: "https://youtu.be/wM-NT6hcw48",
363
358
  poster: "https://ucarecdn.com/48d73272-3fe3-43f6-8b5b-22b68fc5a8c8/section.png",
364
359
  loop: false,
365
360
  type: "video/mp4",
@@ -368,64 +363,117 @@ Video.defaultProps = {
368
363
  muted: true,
369
364
  css: {
370
365
  "@desktop": {
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"
366
+ video: {
367
+ height: "100%",
368
+ width: "100%",
369
+ aspectRatio: "16 / 9"
370
+ }
379
371
  }
380
372
  }
381
373
  };
382
374
  var video_default = Video;
383
375
 
384
376
  // src/elements/instagram.tsx
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"]);
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
+ position: "absolute",
385
+ height: "100%",
386
+ width: "100%",
387
+ display: "flex",
388
+ flexDirection: "column",
389
+ alignItems: "center",
390
+ justifyContent: "center",
391
+ color: "#374151",
392
+ pointerEvents: "none",
393
+ zIndex: 1
394
+ };
395
+ return /* @__PURE__ */ React10.createElement("div", __spreadValues({
396
+ style,
397
+ ref
398
+ }, rest), /* @__PURE__ */ React10.createElement("div", {
399
+ style: { fontWeight: 600, marginBottom: "10px" }
400
+ }, element), /* @__PURE__ */ React10.createElement("div", null, children));
401
+ });
402
+ var Placeholder_default = Placeholder;
403
+
404
+ // src/elements/instagram.tsx
405
+ var INSTAGRAM_API = "https://graph.instagram.com";
406
+ var Instagram = forwardRef9((props, ref) => {
407
+ const _a = props, { token, username, numberOfImages, imagesPerRow, gap } = _a, rest = __objRest(_a, ["token", "username", "numberOfImages", "imagesPerRow", "gap"]);
389
408
  const [media, setMedia] = useState([]);
409
+ const [error, setError] = useState(null);
410
+ let { isDesignMode } = useContext3(WeaverseContext);
390
411
  useEffect2(() => {
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
- });
412
+ if (token) {
413
+ let params = new URLSearchParams({
414
+ access_token: token,
415
+ fields: "id,media_type,caption,media_url,permalink"
416
+ });
417
+ fetch(`${INSTAGRAM_API}/me/media?${params.toString()}`).then((res) => res.json()).then((res) => {
418
+ if (res.error) {
419
+ setError(res);
420
+ } else {
421
+ setError(null);
422
+ setMedia([...res.data]);
423
+ }
424
+ }).catch(setError);
425
+ }
395
426
  }, [token]);
396
- const css = {
397
- gridTemplateColumns: `repeat(${imagesPerRow[0] || 1}, 1fr)`
427
+ if (!token || error) {
428
+ return /* @__PURE__ */ React11.createElement("div", __spreadValues({
429
+ ref
430
+ }, rest), /* @__PURE__ */ React11.createElement(Placeholder_default, {
431
+ element: "Instagram"
432
+ }, !token ? "Connect your Instagram account to display photos on your site." : "Invalid or expired token!"));
433
+ }
434
+ let style = {
435
+ "--wv-ig-images-per-row": imagesPerRow,
436
+ "--wv-ig-images-gap": gap
398
437
  };
399
- const { className: instagramClass = "" } = stitchesInstance.css(css)();
400
- return /* @__PURE__ */ React10.createElement("div", __spreadValues({
401
- className: `${className} ${instagramClass}`,
438
+ return /* @__PURE__ */ React11.createElement("div", __spreadProps(__spreadValues({
402
439
  ref
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%",
440
+ }, rest), {
441
+ style
442
+ }), /* @__PURE__ */ React11.createElement("div", {
443
+ className: "wv-ig-media-container"
444
+ }, media.slice(0, numberOfImages).map((item) => {
445
+ let linkProps;
446
+ if (!isDesignMode) {
447
+ linkProps = { href: item.permalink, target: "_blank" };
448
+ }
449
+ return /* @__PURE__ */ React11.createElement("a", __spreadValues({
450
+ key: item.id
451
+ }, linkProps), /* @__PURE__ */ React11.createElement("img", {
410
452
  alt: item.caption,
411
453
  src: item.media_url
412
454
  }));
413
- }));
455
+ })));
414
456
  });
415
457
  Instagram.defaultProps = {
416
458
  token: "",
417
- numberOfImages: [12],
418
- imagesPerRow: [4],
459
+ username: "",
460
+ numberOfImages: 8,
461
+ imagesPerRow: 4,
462
+ gap: 0,
419
463
  css: {
420
464
  "@desktop": {
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"
465
+ ".wv-ig-media-container": {
466
+ overflow: "hidden",
467
+ maxWidth: "100%",
468
+ maxHeight: "100%",
469
+ display: "grid",
470
+ gridTemplateColumns: "repeat(var(--wv-ig-images-per-row, 4), 1fr)",
471
+ gap: "var(--wv-ig-images-gap, 0px)",
472
+ img: {
473
+ aspectRatio: "1 / 1",
474
+ width: "100%",
475
+ height: "100%",
476
+ objectFit: "cover"
429
477
  }
430
478
  }
431
479
  }
@@ -433,6 +481,126 @@ Instagram.defaultProps = {
433
481
  };
434
482
  var instagram_default = Instagram;
435
483
 
484
+ // src/elements/accordion/index.tsx
485
+ import React12, { createContext, forwardRef as forwardRef10, useState as useState2 } from "react";
486
+ var AccordionContext = createContext({
487
+ active: null,
488
+ setActive: () => {
489
+ }
490
+ });
491
+ var Accordion = forwardRef10((props, ref) => {
492
+ const _a = props, { items, children } = _a, rest = __objRest(_a, ["items", "children"]);
493
+ const [active, setActive] = useState2(null);
494
+ const setOpenAccordion = (id) => {
495
+ if (id === active) {
496
+ setActive(null);
497
+ } else {
498
+ setActive(id);
499
+ }
500
+ };
501
+ console.info("9779 active", active);
502
+ return /* @__PURE__ */ React12.createElement("div", __spreadValues({
503
+ ref
504
+ }, rest), /* @__PURE__ */ React12.createElement(AccordionContext.Provider, {
505
+ value: { active, setActive: setOpenAccordion }
506
+ }, children));
507
+ });
508
+ Accordion.defaultProps = {
509
+ items: [
510
+ {
511
+ id: 1,
512
+ headerText: "Header 1",
513
+ childrenId: true
514
+ },
515
+ {
516
+ id: 2,
517
+ headerText: "Header 2"
518
+ }
519
+ ],
520
+ css: {
521
+ "@desktop": {
522
+ display: "flex",
523
+ flexDirection: "column",
524
+ gap: 4,
525
+ ".wv-accordion-header": {
526
+ borderRadius: 4,
527
+ padding: 4,
528
+ marginBottom: 4,
529
+ backgroundColor: "#aaa",
530
+ "&.active": {
531
+ color: "blue"
532
+ },
533
+ '&.active + [data-wv-type="accordion.content"]': {
534
+ display: "grid"
535
+ }
536
+ }
537
+ }
538
+ }
539
+ };
540
+ var accordion_default = Accordion;
541
+
542
+ // src/elements/accordion/AccordionWrapper.tsx
543
+ import React13, { forwardRef as forwardRef11, useContext as useContext4 } from "react";
544
+ var AccordionWrapper = forwardRef11((props, ref) => {
545
+ const _a = props, { wrapperId, headerText, children } = _a, rest = __objRest(_a, ["wrapperId", "headerText", "children"]);
546
+ const { active, setActive } = useContext4(AccordionContext);
547
+ return /* @__PURE__ */ React13.createElement("div", __spreadValues({
548
+ ref
549
+ }, rest), /* @__PURE__ */ React13.createElement("div", {
550
+ onClick: () => setActive(wrapperId),
551
+ className: `wv-accordion-header ${active === wrapperId ? "active" : ""}`
552
+ }, headerText, " #", wrapperId), children);
553
+ });
554
+ AccordionWrapper.defaultProps = {
555
+ wrapperId: 1,
556
+ headerText: "Header 1",
557
+ css: {
558
+ "@desktop": {
559
+ maxHeight: "100%"
560
+ }
561
+ }
562
+ };
563
+ var AccordionWrapper_default = AccordionWrapper;
564
+
565
+ // src/elements/accordion/AccordionContent.tsx
566
+ import React14, { forwardRef as forwardRef12 } from "react";
567
+ var AccordionContent = forwardRef12((props, ref) => {
568
+ const _a = props, { rows, columns, gap, rowSize, children } = _a, rest = __objRest(_a, ["rows", "columns", "gap", "rowSize", "children"]);
569
+ let style = {
570
+ "--rows": rows,
571
+ "--columns": columns,
572
+ "--gap": gap + "px",
573
+ "--row-size": rowSize + "px",
574
+ "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))"
575
+ };
576
+ return /* @__PURE__ */ React14.createElement("div", __spreadProps(__spreadValues({
577
+ ref
578
+ }, rest), {
579
+ style
580
+ }), React14.Children.count(children) > 0 ? children : /* @__PURE__ */ React14.createElement(Placeholder_default, {
581
+ element: "Accordion"
582
+ }, "Item Content"));
583
+ });
584
+ AccordionContent.defaultProps = {
585
+ rows: 2,
586
+ columns: 12,
587
+ gap: 4,
588
+ rowSize: 48,
589
+ css: {
590
+ "@desktop": {
591
+ width: "100%",
592
+ maxWidth: "var(--grid-size)",
593
+ backgroundColor: "#DDD",
594
+ display: "none",
595
+ gridTemplateRows: "repeat(var(--rows), var(--row-size))",
596
+ gridTemplateColumns: "repeat(var(--columns), minmax(0, var(--col-size)))",
597
+ gap: "var(--gap)",
598
+ borderRadius: 4
599
+ }
600
+ }
601
+ };
602
+ var AccordionContent_default = AccordionContent;
603
+
436
604
  // src/elements/index.ts
437
605
  var elements = {
438
606
  Countdown: {
@@ -470,6 +638,18 @@ var elements = {
470
638
  Video: {
471
639
  Component: video_default,
472
640
  type: "video"
641
+ },
642
+ Accordion: {
643
+ Component: accordion_default,
644
+ type: "accordion"
645
+ },
646
+ AccordionWrapper: {
647
+ Component: AccordionWrapper_default,
648
+ type: "accordion.wrapper"
649
+ },
650
+ AccordionContent: {
651
+ Component: AccordionContent_default,
652
+ type: "accordion.content"
473
653
  }
474
654
  };
475
655
  var elements_default = elements;
@@ -482,13 +662,13 @@ var createRootContext = (configs) => {
482
662
  });
483
663
  return rootContext;
484
664
  };
485
- var WeaverseContext = createContext({});
665
+ var WeaverseContext = createContext2({});
486
666
  var WeaverseContextProvider = WeaverseContext.Provider;
487
667
  var WeaverseContextConsumer = WeaverseContext.Consumer;
488
668
 
489
669
  // src/renderer.tsx
490
670
  import { isBrowser } from "@weaverse/core";
491
- import React11, { useContext as useContext4, useEffect as useEffect3, useRef, useState as useState2 } from "react";
671
+ import React15, { useContext as useContext5, useEffect as useEffect3, useRef, useState as useState3 } from "react";
492
672
 
493
673
  // src/utils/index.ts
494
674
  var shortCssObject = (css) => {
@@ -516,7 +696,7 @@ function generateItemClass(instance, stitchesInstance) {
516
696
  // src/renderer.tsx
517
697
  var WeaverseRoot = ({ context }) => {
518
698
  var _a;
519
- let [, setData] = useState2(context.projectData);
699
+ let [, setData] = useState3(context.projectData);
520
700
  let rootRef = useRef();
521
701
  useEffect3(() => {
522
702
  let update = () => setData({});
@@ -531,19 +711,19 @@ var WeaverseRoot = ({ context }) => {
531
711
  }, []);
532
712
  let eventHandlers = ((_a = context == null ? void 0 : context.studioBridge) == null ? void 0 : _a.eventHandlers) || {};
533
713
  let themeClass = context.stitchesInstance.theme.className;
534
- return /* @__PURE__ */ React11.createElement("div", __spreadProps(__spreadValues({
714
+ return /* @__PURE__ */ React15.createElement("div", __spreadProps(__spreadValues({
535
715
  className: `weaverse-content-root ${themeClass}`
536
716
  }, eventHandlers), {
537
717
  ref: rootRef
538
- }), /* @__PURE__ */ React11.createElement(WeaverseContextProvider, {
718
+ }), /* @__PURE__ */ React15.createElement(WeaverseContextProvider, {
539
719
  value: context
540
- }, /* @__PURE__ */ React11.createElement(ItemInstance, {
720
+ }, /* @__PURE__ */ React15.createElement(ItemInstance, {
541
721
  id: context.projectData.rootId || 0
542
722
  })));
543
723
  };
544
724
  var ItemComponent = ({ instance }) => {
545
- let { stitchesInstance, elementInstances } = useContext4(WeaverseContext);
546
- let [data, setData] = useState2(instance.data);
725
+ let { stitchesInstance, elementInstances } = useContext5(WeaverseContext);
726
+ let [data, setData] = useState3(instance.data);
547
727
  let _a = data, { id, type, childIds = [], css, className } = _a, rest = __objRest(_a, ["id", "type", "childIds", "css", "className"]);
548
728
  useEffect3(() => {
549
729
  var _a2;
@@ -565,12 +745,12 @@ var ItemComponent = ({ instance }) => {
565
745
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
566
746
  rest.ref = instance.ref;
567
747
  }
568
- return /* @__PURE__ */ React11.createElement(Component, __spreadValues({
748
+ return /* @__PURE__ */ React15.createElement(Component, __spreadValues({
569
749
  key: id,
570
750
  "data-wv-type": type,
571
751
  "data-wv-id": id,
572
752
  className: generateItemClass(instance, stitchesInstance)
573
- }, rest), childIds.map((id2) => /* @__PURE__ */ React11.createElement(ItemInstance, {
753
+ }, rest), childIds.map((id2) => /* @__PURE__ */ React15.createElement(ItemInstance, {
574
754
  key: id2,
575
755
  id: id2
576
756
  })));
@@ -578,15 +758,15 @@ var ItemComponent = ({ instance }) => {
578
758
  return null;
579
759
  };
580
760
  var ItemInstance = ({ id }) => {
581
- let context = useContext4(WeaverseContext);
761
+ let context = useContext5(WeaverseContext);
582
762
  let { itemInstances } = context;
583
763
  let instance = itemInstances.get(id);
584
764
  if (!instance) {
585
- return /* @__PURE__ */ React11.createElement("div", {
765
+ return /* @__PURE__ */ React15.createElement("div", {
586
766
  style: { display: "none" }
587
767
  }, "Item instance ", id, " not found");
588
768
  }
589
- return /* @__PURE__ */ React11.createElement(ItemComponent, {
769
+ return /* @__PURE__ */ React15.createElement(ItemComponent, {
590
770
  instance
591
771
  });
592
772
  };
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.6.21",
2
+ "version": "0.6.24",
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.21"
34
+ "@weaverse/core": "0.6.24"
35
35
  }
36
36
  }