@weaverse/react 0.7.5 → 0.7.8

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
@@ -37,7 +37,7 @@ module.exports = __toCommonJS(src_exports);
37
37
 
38
38
  // src/context.ts
39
39
  var import_core = require("@weaverse/core");
40
- var import_react18 = require("react");
40
+ var import_react20 = require("react");
41
41
 
42
42
  // src/elements/button.tsx
43
43
  var React = __toESM(require("react"));
@@ -257,7 +257,7 @@ var Image = import_react4.default.forwardRef(
257
257
  }
258
258
  );
259
259
  Image.defaultProps = {
260
- src: "https://ucarecdn.com/1cdc9d39-ca62-492e-8ec7-f1a86b241a90/",
260
+ src: "https://ucarecdn.com/c413b8fe-ceec-4948-9c42-a0434c4ca920/",
261
261
  alt: "Image alt text",
262
262
  objectFit: "cover",
263
263
  objectPosition: "center",
@@ -427,20 +427,9 @@ var import_react8 = __toESM(require("react"));
427
427
  var Placeholder = (0, import_react8.forwardRef)(
428
428
  (props, ref) => {
429
429
  let { element, children, ...rest } = props;
430
- let style = {
431
- position: "absolute",
432
- height: "100%",
433
- width: "100%",
434
- display: "flex",
435
- flexDirection: "column",
436
- alignItems: "center",
437
- justifyContent: "center",
438
- color: "#374151",
439
- pointerEvents: "none",
440
- zIndex: 1
441
- };
442
430
  return /* @__PURE__ */ import_react8.default.createElement("div", {
443
- style,
431
+ "data-wv-type": "placeholder",
432
+ style: { display: "none" },
444
433
  ref,
445
434
  ...rest
446
435
  }, /* @__PURE__ */ import_react8.default.createElement("div", {
@@ -535,108 +524,190 @@ var instagram_default = Instagram;
535
524
  // src/elements/accordion/index.tsx
536
525
  var import_react10 = __toESM(require("react"));
537
526
  var AccordionContext = (0, import_react10.createContext)({
538
- active: null,
527
+ iconName: "arrow",
528
+ active: [],
539
529
  setActive: () => {
540
530
  }
541
531
  });
542
532
  var Accordion = (0, import_react10.forwardRef)(
543
533
  (props, ref) => {
544
- const { items, children, ...rest } = props;
545
- const [active, setActive] = (0, import_react10.useState)(null);
534
+ const { iconName, children, ...rest } = props;
535
+ const [active, setActive] = (0, import_react10.useState)([]);
546
536
  const setOpenAccordion = (id) => {
547
- if (id === active) {
548
- setActive(null);
537
+ if (active.includes(id)) {
538
+ setActive(active.filter((_id) => _id !== id));
549
539
  } else {
550
- setActive(id);
540
+ setActive([...active, id]);
551
541
  }
552
542
  };
553
543
  return /* @__PURE__ */ import_react10.default.createElement("div", {
554
544
  ref,
555
545
  ...rest
556
546
  }, /* @__PURE__ */ import_react10.default.createElement(AccordionContext.Provider, {
557
- value: { active, setActive: setOpenAccordion }
547
+ value: { active, setActive: setOpenAccordion, iconName }
558
548
  }, children));
559
549
  }
560
550
  );
561
551
  Accordion.defaultProps = {
562
- items: [
563
- {
564
- id: 1,
565
- headerText: "Header 1",
566
- childrenId: true
567
- },
568
- {
569
- id: 2,
570
- headerText: "Header 2"
571
- }
572
- ],
552
+ iconName: "arrow",
573
553
  css: {
574
554
  "@desktop": {
575
555
  display: "flex",
576
556
  flexDirection: "column",
577
- gap: 4,
578
- ".wv-accordion-header": {
579
- borderRadius: 4,
580
- padding: 12,
581
- marginBottom: 4,
582
- border: "1px solid #76A9FA",
583
- "&.active": {
584
- color: "blue"
585
- },
586
- '&.active + [data-wv-type="accordion.content"]': {
587
- maxHeight: "var(--max-height, inherit)"
588
- }
589
- }
557
+ gap: 4
590
558
  }
591
559
  }
592
560
  };
593
561
  var accordion_default = Accordion;
594
562
 
595
563
  // src/elements/accordion/AccordionWrapper.tsx
564
+ var import_react12 = __toESM(require("react"));
565
+
566
+ // src/elements/accordion/Icon.tsx
596
567
  var import_react11 = __toESM(require("react"));
597
- var AccordionWrapper = (0, import_react11.forwardRef)((props, ref) => {
598
- const { ["data-wv-id"]: wvId, headerText, children, ...rest } = props;
599
- const { active, setActive } = (0, import_react11.useContext)(AccordionContext);
600
- return /* @__PURE__ */ import_react11.default.createElement("div", {
568
+ var ICONS = {
569
+ caret: {
570
+ animationType: "rotate90",
571
+ css: {
572
+ position: "absolute!important",
573
+ left: 5,
574
+ top: 2,
575
+ width: 0,
576
+ height: 0,
577
+ borderTop: "6px solid transparent",
578
+ borderBottom: "6px solid transparent",
579
+ borderLeft: "6px solid #1F2A37"
580
+ }
581
+ },
582
+ arrow: {
583
+ animationType: "rotate90",
584
+ css: {
585
+ border: "solid #1F2A37",
586
+ borderWidth: "0 1px 1px 0",
587
+ display: "inline-block",
588
+ transform: "rotate(-45deg) translate(15%, -15%)",
589
+ padding: 4
590
+ }
591
+ },
592
+ plus: {
593
+ animationType: "custom",
594
+ css: {
595
+ display: "inline-block",
596
+ top: -6,
597
+ width: 15,
598
+ height: 1,
599
+ backgroundColor: "#1F2A37",
600
+ "&:after": {
601
+ position: "absolute",
602
+ content: "",
603
+ top: -7,
604
+ left: 7,
605
+ width: 1,
606
+ height: 15,
607
+ backgroundColor: "#1F2A37",
608
+ transition: "all 0.3s ease-in-out 0s"
609
+ },
610
+ "&.active": {
611
+ "&:after": {
612
+ transform: "rotate(90deg)"
613
+ }
614
+ }
615
+ }
616
+ }
617
+ };
618
+ var rotateAnimation = {
619
+ transition: "all 0.3s ease-in-out 0s",
620
+ transform: "rotate(90deg)"
621
+ };
622
+ function Icon(props) {
623
+ let { name, active = false, style, ...rest } = props;
624
+ let { stitchesInstance } = (0, import_react11.useContext)(WeaverseContext);
625
+ const { animationType, css } = ICONS[name];
626
+ if (active && animationType === "rotate90") {
627
+ style = { ...rotateAnimation, ...style };
628
+ }
629
+ let { className } = stitchesInstance.css(css)();
630
+ if (active)
631
+ className += " active";
632
+ return /* @__PURE__ */ import_react11.default.createElement("span", {
633
+ style,
634
+ ...rest
635
+ }, /* @__PURE__ */ import_react11.default.createElement("i", {
636
+ className
637
+ }));
638
+ }
639
+ var Icon_default = Icon;
640
+
641
+ // src/elements/accordion/AccordionWrapper.tsx
642
+ var AccordionWrapper = (0, import_react12.forwardRef)((props, ref) => {
643
+ const { ["data-wv-id"]: wvId, name, children, ...rest } = props;
644
+ const { iconName, active, setActive } = (0, import_react12.useContext)(AccordionContext);
645
+ const isActive = active.includes(wvId);
646
+ return /* @__PURE__ */ import_react12.default.createElement("div", {
601
647
  ref,
602
648
  ...rest
603
- }, /* @__PURE__ */ import_react11.default.createElement("div", {
649
+ }, /* @__PURE__ */ import_react12.default.createElement("div", {
604
650
  onClick: () => setActive(wvId),
605
- className: `wv-accordion-header ${active === wvId ? "active" : ""}`
606
- }, headerText), children);
651
+ className: `wv-acc-header ${isActive ? "active" : ""}`
652
+ }, /* @__PURE__ */ import_react12.default.createElement("span", null, name), /* @__PURE__ */ import_react12.default.createElement(Icon_default, {
653
+ className: "wv-acc-icon",
654
+ active: isActive,
655
+ name: iconName
656
+ })), children);
607
657
  });
608
658
  AccordionWrapper.defaultProps = {
609
- headerText: "Header text",
659
+ name: "Accordion item",
610
660
  css: {
611
661
  "@desktop": {
612
- maxHeight: "100%"
662
+ maxHeight: "100%",
663
+ ".wv-acc-icon": {
664
+ position: "absolute",
665
+ right: 16,
666
+ width: 16,
667
+ height: 16,
668
+ transition: "all 0.3s ease-in-out 0s"
669
+ },
670
+ ".wv-acc-header": {
671
+ display: "flex",
672
+ alignItems: "center",
673
+ borderRadius: 4,
674
+ padding: 12,
675
+ marginBottom: 4,
676
+ border: "1px solid #76A9FA",
677
+ cursor: "pointer",
678
+ '&.active + [data-wv-type="accordion.content"]': {
679
+ maxHeight: "var(--max-height, inherit)"
680
+ }
681
+ }
613
682
  }
614
683
  }
615
684
  };
616
685
  var AccordionWrapper_default = AccordionWrapper;
617
686
 
618
687
  // src/elements/accordion/AccordionContent.tsx
619
- var import_react12 = __toESM(require("react"));
620
- var AccordionContent = (0, import_react12.forwardRef)((props, ref) => {
621
- const { rows, columns, gap, rowSize, children, ...rest } = props;
622
- let style = {
623
- "--rows": rows,
624
- "--columns": columns,
625
- "--gap": gap + "px",
626
- "--row-size": rowSize + "px",
627
- "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))",
628
- "--max-height": rows * rowSize + gap * (rowSize - 1) + "px"
629
- };
630
- return /* @__PURE__ */ import_react12.default.createElement("div", {
631
- ref,
632
- ...rest,
633
- style
634
- }, import_react12.default.Children.count(children) > 0 ? children : /* @__PURE__ */ import_react12.default.createElement(Placeholder_default, {
635
- element: "Accordion"
636
- }, "Item Content"));
637
- });
688
+ var import_react13 = __toESM(require("react"));
689
+ var AccordionContent = (0, import_react13.forwardRef)(
690
+ (props, ref) => {
691
+ const { rows, columns, gap, rowSize, children, ...rest } = props;
692
+ let style = {
693
+ "--rows": rows,
694
+ "--columns": columns,
695
+ "--gap": gap + "px",
696
+ "--row-size": rowSize + "px",
697
+ "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))",
698
+ "--max-height": rows * rowSize + gap * (rowSize - 1) + "px"
699
+ };
700
+ return /* @__PURE__ */ import_react13.default.createElement("div", {
701
+ ref,
702
+ ...rest,
703
+ style
704
+ }, import_react13.default.Children.count(children) > 0 ? children : /* @__PURE__ */ import_react13.default.createElement(Placeholder_default, {
705
+ element: "Accordion Content"
706
+ }, "Please drag and drop an element here"));
707
+ }
708
+ );
638
709
  AccordionContent.defaultProps = {
639
- rows: 2,
710
+ rows: 3,
640
711
  columns: 12,
641
712
  gap: 4,
642
713
  rowSize: 48,
@@ -658,96 +729,88 @@ AccordionContent.defaultProps = {
658
729
  var AccordionContent_default = AccordionContent;
659
730
 
660
731
  // src/elements/tab/index.tsx
661
- var import_react14 = __toESM(require("react"));
732
+ var import_react15 = __toESM(require("react"));
662
733
 
663
734
  // src/elements/tab/TabHeaderWrapper.tsx
664
- var import_react13 = __toESM(require("react"));
735
+ var import_react14 = __toESM(require("react"));
665
736
  function TabHeader(props) {
666
737
  const { wvId } = props;
667
- const { active, setActive } = (0, import_react13.useContext)(TabContext);
668
- const { itemInstances } = (0, import_react13.useContext)(WeaverseContext);
738
+ const { active, setActive } = (0, import_react14.useContext)(TabContext);
739
+ const { itemInstances } = (0, import_react14.useContext)(WeaverseContext);
669
740
  const instance = itemInstances.get(wvId);
670
- let [data, setData] = (0, import_react13.useState)(instance.data);
671
- (0, import_react13.useEffect)(() => {
741
+ let [data, setData] = (0, import_react14.useState)(instance.data);
742
+ (0, import_react14.useEffect)(() => {
672
743
  let update = (data2) => setData({ ...data2 });
673
744
  instance.subscribe(update);
674
745
  }, []);
675
- const text = data.headerText;
676
- return /* @__PURE__ */ import_react13.default.createElement("div", {
746
+ return /* @__PURE__ */ import_react14.default.createElement("div", {
677
747
  onClick: () => setActive(wvId),
678
748
  className: `wv-tab-header${active === wvId ? " active" : ""}`
679
- }, text);
749
+ }, data.name);
680
750
  }
681
751
  function TabHeaderWrapper(props) {
682
- const { itemInstances } = (0, import_react13.useContext)(WeaverseContext);
752
+ const { itemInstances } = (0, import_react14.useContext)(WeaverseContext);
683
753
  const instance = itemInstances.get(props.wvId);
684
754
  const data = instance.data;
685
755
  const childIds = data.childIds;
686
- return /* @__PURE__ */ import_react13.default.createElement("div", {
687
- className: "wv-tab-headerWrapper"
688
- }, childIds.map((id) => /* @__PURE__ */ import_react13.default.createElement(TabHeader, {
756
+ return /* @__PURE__ */ import_react14.default.createElement("div", {
757
+ className: "wv-tab-header-wrapper"
758
+ }, childIds.map((id) => /* @__PURE__ */ import_react14.default.createElement(TabHeader, {
689
759
  key: id,
690
760
  wvId: id
691
761
  })));
692
762
  }
693
763
 
694
764
  // src/elements/tab/index.tsx
695
- var TabContext = (0, import_react14.createContext)({
765
+ var TabContext = (0, import_react15.createContext)({
696
766
  active: null,
697
767
  setActive: () => {
698
768
  }
699
769
  });
700
- var Tab = (0, import_react14.forwardRef)((props, ref) => {
770
+ var Tab = (0, import_react15.forwardRef)((props, ref) => {
701
771
  var _a, _b, _c;
702
772
  const wvId = props["data-wv-id"];
703
- const { items, children, ...rest } = props;
704
- const defaultActive = (_c = (_b = (_a = import_react14.default.Children.toArray(children)) == null ? void 0 : _a[0]) == null ? void 0 : _b.props) == null ? void 0 : _c.id;
705
- const [active, setActive] = (0, import_react14.useState)(defaultActive);
773
+ const { fullWidthTabHeader, children, ...rest } = props;
774
+ const defaultActive = (_c = (_b = (_a = import_react15.default.Children.toArray(children)) == null ? void 0 : _a[0]) == null ? void 0 : _b.props) == null ? void 0 : _c.id;
775
+ const [active, setActive] = (0, import_react15.useState)(defaultActive);
706
776
  const setOpenTab = (id) => {
707
- if (id === active) {
708
- setActive(null);
709
- } else {
777
+ if (id !== active) {
710
778
  setActive(id);
711
779
  }
712
780
  };
713
- return /* @__PURE__ */ import_react14.default.createElement("div", {
781
+ return /* @__PURE__ */ import_react15.default.createElement("div", {
714
782
  ref,
715
- ...rest
716
- }, /* @__PURE__ */ import_react14.default.createElement(TabContext.Provider, {
783
+ ...rest,
784
+ style: {
785
+ "--tab-width": fullWidthTabHeader ? "100%" : "auto"
786
+ }
787
+ }, /* @__PURE__ */ import_react15.default.createElement(TabContext.Provider, {
717
788
  value: { active, setActive: setOpenTab }
718
- }, /* @__PURE__ */ import_react14.default.createElement(TabHeaderWrapper, {
789
+ }, /* @__PURE__ */ import_react15.default.createElement(TabHeaderWrapper, {
719
790
  wvId
720
791
  }), children));
721
792
  });
722
793
  Tab.defaultProps = {
723
- items: [
724
- {
725
- headerText: "Header 1"
726
- },
727
- {
728
- headerText: "Header 2"
729
- },
730
- {
731
- headerText: "Header 2"
732
- }
733
- ],
794
+ fullWidthTabHeader: false,
734
795
  css: {
735
796
  "@desktop": {
736
797
  display: "flex",
737
798
  flexDirection: "column",
738
799
  gap: 4,
739
- "& .wv-tab-headerWrapper": {
800
+ "& .wv-tab-header-wrapper": {
740
801
  width: "100%",
741
802
  display: "flex",
742
803
  marginBottom: 10
743
804
  },
744
805
  "& .wv-tab-header": {
745
- backgroundColor: "#f0f2f3",
746
- padding: "10px 16px",
806
+ backgroundColor: "#fff",
807
+ padding: "15px 24px",
808
+ border: "1px solid #E4E7EB",
747
809
  cursor: "pointer",
810
+ textAlign: "center",
811
+ width: "var(--tab-width, auto)",
748
812
  "&.active": {
749
- backgroundColor: "#0F71FF",
750
- color: "#fff"
813
+ backgroundColor: "#E4E7EB"
751
814
  }
752
815
  }
753
816
  }
@@ -756,10 +819,10 @@ Tab.defaultProps = {
756
819
  var tab_default = Tab;
757
820
 
758
821
  // src/elements/tab/TabContent.tsx
759
- var import_react15 = __toESM(require("react"));
760
- var TabContent = (0, import_react15.forwardRef)(
822
+ var import_react16 = __toESM(require("react"));
823
+ var TabContent = (0, import_react16.forwardRef)(
761
824
  (props, ref) => {
762
- const { active } = (0, import_react15.useContext)(TabContext);
825
+ const { active } = (0, import_react16.useContext)(TabContext);
763
826
  const wvId = props["data-wv-id"];
764
827
  const { rows, columns, gap, rowSize, children, ...rest } = props;
765
828
  let style = {
@@ -771,20 +834,21 @@ var TabContent = (0, import_react15.forwardRef)(
771
834
  "--max-height": rows * rowSize + gap * (rowSize - 1) + "px",
772
835
  "--content-active": active === wvId ? "grid" : "none"
773
836
  };
774
- return /* @__PURE__ */ import_react15.default.createElement("div", {
837
+ return /* @__PURE__ */ import_react16.default.createElement("div", {
775
838
  ref,
776
839
  ...rest,
777
840
  style
778
- }, import_react15.default.Children.count(children) > 0 ? children : /* @__PURE__ */ import_react15.default.createElement(Placeholder_default, {
779
- element: "Tab"
780
- }, "Item Content"));
841
+ }, import_react16.default.Children.count(children) > 0 ? children : /* @__PURE__ */ import_react16.default.createElement(Placeholder_default, {
842
+ element: "Tab Content"
843
+ }, "Please drag and drop an element here"));
781
844
  }
782
845
  );
783
846
  TabContent.defaultProps = {
784
- rows: 2,
847
+ rows: 3,
785
848
  columns: 12,
786
849
  gap: 4,
787
850
  rowSize: 48,
851
+ name: "Tab header",
788
852
  css: {
789
853
  "@desktop": {
790
854
  width: "100%",
@@ -800,47 +864,90 @@ TabContent.defaultProps = {
800
864
  var TabContent_default = TabContent;
801
865
 
802
866
  // src/elements/slider/index.tsx
803
- var import_react16 = __toESM(require("react"));
804
- var Carousel = __toESM(require("nuka-carousel"));
805
- var SliderContext = (0, import_react16.createContext)({
806
- active: null,
807
- setActive: () => {
808
- }
809
- });
810
- var Slider = (0, import_react16.forwardRef)((props, ref) => {
811
- var _a, _b, _c;
812
- const { children, ...rest } = props;
813
- const defaultActive = (_c = (_b = (_a = import_react16.default.Children.toArray(children)) == null ? void 0 : _a[0]) == null ? void 0 : _b.props) == null ? void 0 : _c.id;
814
- const [active, setActive] = (0, import_react16.useState)(defaultActive);
815
- return /* @__PURE__ */ import_react16.default.createElement("div", {
867
+ var import_react17 = __toESM(require("react"));
868
+ var import_carousel = require("nuka-carousel/lib/carousel");
869
+ var Slider = (0, import_react17.forwardRef)((props, ref) => {
870
+ const { isDesignMode } = (0, import_react17.useContext)(WeaverseContext);
871
+ const { autoplay, delay, children, ...rest } = props;
872
+ return /* @__PURE__ */ import_react17.default.createElement("div", {
816
873
  ...rest,
817
874
  ref
818
- }, /* @__PURE__ */ import_react16.default.createElement(SliderContext.Provider, {
819
- value: { active, setActive }
820
- }, children), /* @__PURE__ */ import_react16.default.createElement(Carousel.default, null, /* @__PURE__ */ import_react16.default.createElement("div", {
821
- className: "slide"
822
- }, "Hi"), /* @__PURE__ */ import_react16.default.createElement("div", {
823
- className: "slide"
824
- }, "Hieee"), /* @__PURE__ */ import_react16.default.createElement("div", {
825
- className: "slide"
826
- }, "Hixxx"), /* @__PURE__ */ import_react16.default.createElement("div", {
827
- className: "slide"
828
- }, "Hi3")));
875
+ }, /* @__PURE__ */ import_react17.default.createElement(import_carousel.Carousel, {
876
+ dragging: false,
877
+ renderCenterLeftControls: (props2) => /* @__PURE__ */ import_react17.default.createElement("button", {
878
+ className: "wv-slider-btn",
879
+ onClick: props2.previousSlide,
880
+ disabled: (isDesignMode || !autoplay) && props2.currentSlide === 0
881
+ }, /* @__PURE__ */ import_react17.default.createElement("i", {
882
+ className: "wv-slider-arrow wv-slider-arrow-left"
883
+ })),
884
+ renderCenterRightControls: (props2) => /* @__PURE__ */ import_react17.default.createElement("button", {
885
+ className: "wv-slider-btn",
886
+ onClick: props2.nextSlide,
887
+ disabled: (isDesignMode || !autoplay) && props2.slideCount === props2.currentSlide
888
+ }, /* @__PURE__ */ import_react17.default.createElement("i", {
889
+ className: "wv-slider-arrow wv-slider-arrow-right"
890
+ })),
891
+ wrapAround: !isDesignMode,
892
+ autoplay: !isDesignMode && autoplay,
893
+ autoplayInterval: delay * 1e3
894
+ }, children));
829
895
  });
830
896
  Slider.defaultProps = {
897
+ fullWidth: true,
898
+ autoplay: true,
899
+ delay: 3,
831
900
  css: {
832
- "@desktop": {}
901
+ "@desktop": {
902
+ "& .wv-slider-btn": {
903
+ borderRadius: "100%",
904
+ width: 40,
905
+ height: 40,
906
+ background: "#fff",
907
+ border: "none",
908
+ cursor: "pointer",
909
+ "&[disabled]": {
910
+ cursor: "not-allowed"
911
+ },
912
+ "&:hover .wv-slider-arrow": {
913
+ borderColor: "#999"
914
+ },
915
+ "& .wv-slider-arrow": {
916
+ border: "solid black",
917
+ borderWidth: "0 1px 1px 0",
918
+ display: "inline-block",
919
+ padding: 5
920
+ },
921
+ "& .wv-slider-arrow-right": {
922
+ transform: "rotate(-45deg)",
923
+ marginRight: 5
924
+ },
925
+ "& .wv-slider-arrow-left": {
926
+ transform: "rotate(135deg)",
927
+ marginLeft: 5
928
+ }
929
+ }
930
+ }
833
931
  }
834
932
  };
835
933
  var slider_default = Slider;
836
934
 
837
935
  // src/elements/slider/SliderContent.tsx
838
- var import_react17 = __toESM(require("react"));
839
- var SliderContent = (0, import_react17.forwardRef)(
936
+ var import_react18 = __toESM(require("react"));
937
+ var SliderContent = (0, import_react18.forwardRef)(
840
938
  (props, ref) => {
841
- const { active } = (0, import_react17.useContext)(SliderContext);
842
- const wvId = props["data-wv-id"];
843
- const { rows, columns, gap, rowSize, children, ...rest } = props;
939
+ const { isDesignMode } = (0, import_react18.useContext)(WeaverseContext);
940
+ const {
941
+ mediaUrl,
942
+ targetLink,
943
+ openInNewTab,
944
+ rows,
945
+ columns,
946
+ gap,
947
+ rowSize,
948
+ children,
949
+ ...rest
950
+ } = props;
844
951
  let style = {
845
952
  "--rows": rows,
846
953
  "--columns": columns,
@@ -848,19 +955,28 @@ var SliderContent = (0, import_react17.forwardRef)(
848
955
  "--row-size": rowSize + "px",
849
956
  "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))",
850
957
  "--max-height": rows * rowSize + gap * (rowSize - 1) + "px",
851
- "--content-active": active === wvId ? "grid" : "none"
958
+ "--background-url": `url(${mediaUrl}`
852
959
  };
853
- return /* @__PURE__ */ import_react17.default.createElement("div", {
854
- ref,
960
+ const handleClick = () => {
961
+ if (!isDesignMode && targetLink) {
962
+ window.open(targetLink, openInNewTab ? "_blank" : "_self");
963
+ }
964
+ };
965
+ return /* @__PURE__ */ import_react18.default.createElement("div", {
855
966
  ...rest,
856
- style
857
- }, import_react17.default.Children.count(children) > 0 ? children : /* @__PURE__ */ import_react17.default.createElement(Placeholder_default, {
858
- element: "Slider"
859
- }, "Slider Content"));
967
+ style,
968
+ onClick: handleClick
969
+ }, import_react18.default.Children.count(children) > 0 ? children : /* @__PURE__ */ import_react18.default.createElement(Placeholder_default, {
970
+ element: "Slider Content"
971
+ }, "Please drag and drop an element here"));
860
972
  }
861
973
  );
862
974
  SliderContent.defaultProps = {
863
- rows: 2,
975
+ name: "Slider",
976
+ mediaUrl: "",
977
+ openInNewTab: false,
978
+ targetLink: "https://myshop.com",
979
+ rows: 4,
864
980
  columns: 12,
865
981
  gap: 4,
866
982
  rowSize: 48,
@@ -868,18 +984,56 @@ SliderContent.defaultProps = {
868
984
  "@desktop": {
869
985
  width: "100%",
870
986
  maxWidth: "var(--grid-size)",
871
- display: "var(--content-active, none)",
987
+ display: "grid",
872
988
  gridTemplateRows: "repeat(var(--rows), var(--row-size))",
873
989
  gridTemplateColumns: "repeat(var(--columns), minmax(0, var(--col-size)))",
874
990
  gap: "var(--gap)",
875
- borderRadius: 4
991
+ borderRadius: 4,
992
+ backgroundImage: "var(--background-url, none)"
876
993
  }
877
994
  }
878
995
  };
879
996
  var SliderContent_default = SliderContent;
880
997
 
998
+ // src/elements/custom-html.tsx
999
+ var import_react19 = __toESM(require("react"));
1000
+ var CustomHTML = (0, import_react19.forwardRef)(
1001
+ (props, ref) => {
1002
+ const { content, children, ...rest } = props;
1003
+ const { isDesignMode } = (0, import_react19.useContext)(WeaverseContext);
1004
+ const style = {
1005
+ "--pointer-events": isDesignMode ? "none" : "auto"
1006
+ };
1007
+ if (!content)
1008
+ return /* @__PURE__ */ import_react19.default.createElement("div", {
1009
+ ref,
1010
+ ...rest
1011
+ }, /* @__PURE__ */ import_react19.default.createElement(Placeholder_default, {
1012
+ element: "Custom HTML"
1013
+ }, "Please add your custom HTML codes."));
1014
+ return /* @__PURE__ */ import_react19.default.createElement("div", {
1015
+ ref,
1016
+ ...rest,
1017
+ style,
1018
+ dangerouslySetInnerHTML: { __html: content }
1019
+ });
1020
+ }
1021
+ );
1022
+ CustomHTML.defaultProps = {
1023
+ content: "",
1024
+ type: "custom.html",
1025
+ css: {
1026
+ "@desktop": {
1027
+ "& > *": {
1028
+ pointerEvents: "var(--pointer-events, unset)"
1029
+ }
1030
+ }
1031
+ }
1032
+ };
1033
+ var custom_html_default = CustomHTML;
1034
+
881
1035
  // src/elements/index.ts
882
- var elements = {
1036
+ var Elements = {
883
1037
  Countdown: {
884
1038
  Component: countdown_default,
885
1039
  type: "countdown"
@@ -943,33 +1097,36 @@ var elements = {
943
1097
  SliderContent: {
944
1098
  Component: SliderContent_default,
945
1099
  type: "slider.content"
1100
+ },
1101
+ CustomHTML: {
1102
+ Component: custom_html_default,
1103
+ type: "custom.html"
946
1104
  }
947
1105
  };
948
- var elements_default = elements;
949
1106
 
950
1107
  // src/context.ts
951
1108
  var createRootContext = (configs) => {
952
1109
  let rootContext = new import_core.Weaverse(configs);
953
- Object.keys(elements_default).forEach((key) => {
954
- rootContext.registerElement(elements_default[key]);
1110
+ Object.keys(Elements).forEach((key) => {
1111
+ rootContext.registerElement(Elements[key]);
955
1112
  });
956
1113
  return rootContext;
957
1114
  };
958
- var WeaverseContext = (0, import_react18.createContext)({});
1115
+ var WeaverseContext = (0, import_react20.createContext)({});
959
1116
  var WeaverseContextProvider = WeaverseContext.Provider;
960
1117
  var WeaverseContextConsumer = WeaverseContext.Consumer;
961
1118
 
962
1119
  // src/renderer.tsx
963
1120
  var import_core2 = require("@weaverse/core");
964
- var import_react19 = __toESM(require("react"));
1121
+ var import_react21 = __toESM(require("react"));
965
1122
 
966
1123
  // src/utils/index.ts
967
- var shortCssObject = (css) => {
1124
+ function shortCssObject(css) {
968
1125
  return {
969
1126
  "@desktop": css["@desktop"],
970
1127
  "@mobile": css["@mobile"]
971
1128
  };
972
- };
1129
+ }
973
1130
  function generateItemClass(instance, stitchesInstance) {
974
1131
  var _a, _b, _c, _d;
975
1132
  let { css, className: cls = "" } = instance.data;
@@ -989,10 +1146,10 @@ function generateItemClass(instance, stitchesInstance) {
989
1146
  // src/renderer.tsx
990
1147
  var WeaverseRoot = ({ context }) => {
991
1148
  var _a, _b;
992
- let [, setData] = (0, import_react19.useState)(context.projectData);
993
- let rootRef = (0, import_react19.useRef)();
1149
+ let [, setData] = (0, import_react21.useState)(context.projectData);
1150
+ let rootRef = (0, import_react21.useRef)();
994
1151
  let update = () => setData({});
995
- (0, import_react19.useEffect)(() => {
1152
+ (0, import_react21.useEffect)(() => {
996
1153
  context.subscribe(update);
997
1154
  context.contentRootElement = rootRef.current;
998
1155
  return () => {
@@ -1001,21 +1158,21 @@ var WeaverseRoot = ({ context }) => {
1001
1158
  }, []);
1002
1159
  let eventHandlers = ((_a = context == null ? void 0 : context.studioBridge) == null ? void 0 : _a.eventHandlers) || {};
1003
1160
  let themeClass = context.stitchesInstance.theme.className;
1004
- return ((_b = context.projectData) == null ? void 0 : _b.rootId) ? /* @__PURE__ */ import_react19.default.createElement("div", {
1161
+ return ((_b = context.projectData) == null ? void 0 : _b.rootId) ? /* @__PURE__ */ import_react21.default.createElement("div", {
1005
1162
  className: `weaverse-content-root ${themeClass}`,
1006
1163
  ...eventHandlers,
1007
1164
  ref: rootRef
1008
- }, /* @__PURE__ */ import_react19.default.createElement(WeaverseContextProvider, {
1165
+ }, /* @__PURE__ */ import_react21.default.createElement(WeaverseContextProvider, {
1009
1166
  value: context
1010
- }, /* @__PURE__ */ import_react19.default.createElement(ItemInstance, {
1167
+ }, /* @__PURE__ */ import_react21.default.createElement(ItemInstance, {
1011
1168
  id: context.projectData.rootId
1012
1169
  }))) : null;
1013
1170
  };
1014
1171
  var ItemComponent = ({ instance }) => {
1015
- let { stitchesInstance, elementInstances } = (0, import_react19.useContext)(WeaverseContext);
1016
- let [data, setData] = (0, import_react19.useState)(instance.data);
1172
+ let { stitchesInstance, elementInstances } = (0, import_react21.useContext)(WeaverseContext);
1173
+ let [data, setData] = (0, import_react21.useState)(instance.data);
1017
1174
  let { id, type, childIds = [], css, className, ...rest } = data;
1018
- (0, import_react19.useEffect)(() => {
1175
+ (0, import_react21.useEffect)(() => {
1019
1176
  var _a;
1020
1177
  let update = (data2) => setData({ ...data2 });
1021
1178
  instance.subscribe(update);
@@ -1035,13 +1192,13 @@ var ItemComponent = ({ instance }) => {
1035
1192
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
1036
1193
  rest.ref = instance.ref;
1037
1194
  }
1038
- return /* @__PURE__ */ import_react19.default.createElement(Component, {
1195
+ return /* @__PURE__ */ import_react21.default.createElement(Component, {
1039
1196
  key: id,
1040
1197
  "data-wv-type": type,
1041
1198
  "data-wv-id": id,
1042
1199
  className: generateItemClass(instance, stitchesInstance),
1043
1200
  ...rest
1044
- }, childIds.map((id2) => /* @__PURE__ */ import_react19.default.createElement(ItemInstance, {
1201
+ }, childIds.map((id2) => /* @__PURE__ */ import_react21.default.createElement(ItemInstance, {
1045
1202
  key: id2,
1046
1203
  id: id2
1047
1204
  })));
@@ -1049,15 +1206,15 @@ var ItemComponent = ({ instance }) => {
1049
1206
  return null;
1050
1207
  };
1051
1208
  var ItemInstance = ({ id }) => {
1052
- let context = (0, import_react19.useContext)(WeaverseContext);
1209
+ let context = (0, import_react21.useContext)(WeaverseContext);
1053
1210
  let { itemInstances } = context;
1054
1211
  let instance = itemInstances.get(id);
1055
1212
  if (!instance) {
1056
- return /* @__PURE__ */ import_react19.default.createElement("div", {
1213
+ return /* @__PURE__ */ import_react21.default.createElement("div", {
1057
1214
  style: { display: "none" }
1058
1215
  }, "Item instance ", id, " not found");
1059
1216
  }
1060
- return /* @__PURE__ */ import_react19.default.createElement(ItemComponent, {
1217
+ return /* @__PURE__ */ import_react21.default.createElement(ItemComponent, {
1061
1218
  instance
1062
1219
  });
1063
1220
  };