@uniformdev/canvas-react 19.46.1-alpha.8 → 19.47.1-alpha.11

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
@@ -34,6 +34,8 @@ __export(src_exports, {
34
34
  NOT_IMPLEMENTED_COMPONENT: () => NOT_IMPLEMENTED_COMPONENT,
35
35
  UniformComponent: () => UniformComponent,
36
36
  UniformComposition: () => UniformComposition,
37
+ UniformCompositionContext: () => UniformCompositionContext,
38
+ UniformPlayground: () => UniformPlayground,
37
39
  UniformRichText: () => UniformRichText,
38
40
  UniformRichTextNode: () => UniformRichTextNode,
39
41
  UniformSlot: () => UniformSlot,
@@ -590,57 +592,107 @@ function resolveChildren({
590
592
  return renderChildren;
591
593
  }
592
594
 
595
+ // src/components/UniformPlayground.tsx
596
+ var import_canvas7 = require("@uniformdev/canvas");
597
+ var import_react7 = __toESM(require("react"));
598
+ var UniformPlayground = ({
599
+ resolveRenderer,
600
+ decorators = [],
601
+ contextualEditingEnhancer,
602
+ behaviorTracking,
603
+ contextualEditingDefaultPlaceholder,
604
+ children
605
+ }) => {
606
+ const { composition, isContextualEditing } = useUniformContextualEditing({
607
+ initialCompositionValue: import_canvas7.EMPTY_COMPOSITION,
608
+ enhance: contextualEditingEnhancer
609
+ });
610
+ const renderedComponent = (0, import_react7.useMemo)(() => {
611
+ if (!composition) {
612
+ return null;
613
+ }
614
+ let component = /* @__PURE__ */ import_react7.default.createElement(
615
+ UniformComponent,
616
+ {
617
+ data: composition,
618
+ behaviorTracking,
619
+ resolveRenderer,
620
+ contextualEditingDefaultPlaceholder
621
+ },
622
+ children
623
+ );
624
+ decorators.forEach((Decorator) => {
625
+ component = /* @__PURE__ */ import_react7.default.createElement(Decorator, { data: composition }, component);
626
+ });
627
+ return component;
628
+ }, [
629
+ children,
630
+ resolveRenderer,
631
+ decorators,
632
+ composition,
633
+ behaviorTracking,
634
+ contextualEditingDefaultPlaceholder
635
+ ]);
636
+ return /* @__PURE__ */ import_react7.default.createElement(
637
+ UniformCompositionContext.Provider,
638
+ {
639
+ value: { data: composition, behaviorTracking, resolveRenderer, isContextualEditing }
640
+ },
641
+ /* @__PURE__ */ import_react7.default.createElement(ContextualEditingComponentWrapper, { component: composition }, renderedComponent)
642
+ );
643
+ };
644
+
593
645
  // src/components/UniformRichText/UniformRichText.tsx
594
646
  var import_richtext5 = require("@uniformdev/richtext");
595
- var import_react16 = __toESM(require("react"));
647
+ var import_react17 = __toESM(require("react"));
596
648
 
597
649
  // src/components/UniformRichText/UniformRichTextNode.tsx
598
650
  var import_richtext4 = require("@uniformdev/richtext");
599
- var import_react15 = __toESM(require("react"));
651
+ var import_react16 = __toESM(require("react"));
600
652
 
601
653
  // src/components/UniformRichText/nodes/HeadingRichTextNode.tsx
602
- var import_react7 = __toESM(require("react"));
654
+ var import_react8 = __toESM(require("react"));
603
655
  var HeadingRichTextNode = ({ children, node }) => {
604
656
  const { tag } = node;
605
657
  const HTag = tag != null ? tag : "h1";
606
- return /* @__PURE__ */ import_react7.default.createElement(HTag, null, children);
658
+ return /* @__PURE__ */ import_react8.default.createElement(HTag, null, children);
607
659
  };
608
660
 
609
661
  // src/components/UniformRichText/nodes/LinebreakRichTextNode.tsx
610
- var import_react8 = __toESM(require("react"));
662
+ var import_react9 = __toESM(require("react"));
611
663
  var LinebreakRichTextNode = () => {
612
- return /* @__PURE__ */ import_react8.default.createElement("br", null);
664
+ return /* @__PURE__ */ import_react9.default.createElement("br", null);
613
665
  };
614
666
 
615
667
  // src/components/UniformRichText/nodes/LinkRichTextNode.tsx
616
668
  var import_richtext = require("@uniformdev/richtext");
617
- var import_react9 = __toESM(require("react"));
669
+ var import_react10 = __toESM(require("react"));
618
670
  var LinkRichTextNode = ({ children, node }) => {
619
671
  const { link } = node;
620
- return /* @__PURE__ */ import_react9.default.createElement("a", { href: (0, import_richtext.linkParamValueToHref)(link) }, children);
672
+ return /* @__PURE__ */ import_react10.default.createElement("a", { href: (0, import_richtext.linkParamValueToHref)(link) }, children);
621
673
  };
622
674
 
623
675
  // src/components/UniformRichText/nodes/ListItemRichTextNode.tsx
624
- var import_react10 = __toESM(require("react"));
676
+ var import_react11 = __toESM(require("react"));
625
677
  var ListItemRichTextNode = ({ children, node }) => {
626
678
  const { value } = node;
627
- return /* @__PURE__ */ import_react10.default.createElement("li", { value: Number.isFinite(value) && value > 0 ? value : void 0 }, children);
679
+ return /* @__PURE__ */ import_react11.default.createElement("li", { value: Number.isFinite(value) && value > 0 ? value : void 0 }, children);
628
680
  };
629
681
 
630
682
  // src/components/UniformRichText/nodes/ListRichTextNode.tsx
631
- var import_react11 = __toESM(require("react"));
683
+ var import_react12 = __toESM(require("react"));
632
684
  var ListRichTextNode = ({ children, node }) => {
633
685
  const { tag, start } = node;
634
686
  const ListTag = tag != null ? tag : "ul";
635
- return /* @__PURE__ */ import_react11.default.createElement(ListTag, { start: Number.isFinite(start) && start > 0 ? start : void 0 }, children);
687
+ return /* @__PURE__ */ import_react12.default.createElement(ListTag, { start: Number.isFinite(start) && start > 0 ? start : void 0 }, children);
636
688
  };
637
689
 
638
690
  // src/components/UniformRichText/nodes/ParagraphRichTextNode.tsx
639
691
  var import_richtext2 = require("@uniformdev/richtext");
640
- var import_react12 = __toESM(require("react"));
692
+ var import_react13 = __toESM(require("react"));
641
693
  var ParagraphRichTextNode = ({ children, node }) => {
642
694
  const { format, direction } = node;
643
- return /* @__PURE__ */ import_react12.default.createElement(
695
+ return /* @__PURE__ */ import_react13.default.createElement(
644
696
  "p",
645
697
  {
646
698
  dir: (0, import_richtext2.isPureDirection)(direction) ? direction : void 0,
@@ -651,18 +703,18 @@ var ParagraphRichTextNode = ({ children, node }) => {
651
703
  };
652
704
 
653
705
  // src/components/UniformRichText/nodes/TabRichTextNode.tsx
654
- var import_react13 = __toESM(require("react"));
706
+ var import_react14 = __toESM(require("react"));
655
707
  var TabRichTextNode = () => {
656
- return /* @__PURE__ */ import_react13.default.createElement(import_react13.default.Fragment, null, " ");
708
+ return /* @__PURE__ */ import_react14.default.createElement(import_react14.default.Fragment, null, " ");
657
709
  };
658
710
 
659
711
  // src/components/UniformRichText/nodes/TextRichTextNode.tsx
660
712
  var import_richtext3 = require("@uniformdev/richtext");
661
- var import_react14 = __toESM(require("react"));
713
+ var import_react15 = __toESM(require("react"));
662
714
  var TextRichTextNode = ({ node }) => {
663
715
  const { text, format } = node;
664
716
  const tags = (0, import_richtext3.getRichTextTagsFromTextFormat)(format);
665
- return /* @__PURE__ */ import_react14.default.createElement(import_react14.default.Fragment, null, tags.length > 0 ? tags.reduceRight((children, Tag) => /* @__PURE__ */ import_react14.default.createElement(Tag, null, children), text) : text);
717
+ return /* @__PURE__ */ import_react15.default.createElement(import_react15.default.Fragment, null, tags.length > 0 ? tags.reduceRight((children, Tag) => /* @__PURE__ */ import_react15.default.createElement(Tag, null, children), text) : text);
666
718
  };
667
719
 
668
720
  // src/components/UniformRichText/UniformRichTextNode.tsx
@@ -677,8 +729,8 @@ function UniformRichTextNode({ node, ...props }) {
677
729
  if (!NodeRenderer) {
678
730
  return null;
679
731
  }
680
- const children = node.children ? node.children.map((childNode, i) => /* @__PURE__ */ import_react15.default.createElement(UniformRichTextNode, { ...props, key: i, node: childNode })) : null;
681
- return /* @__PURE__ */ import_react15.default.createElement(NodeRenderer, { node }, children);
732
+ const children = node.children ? node.children.map((childNode, i) => /* @__PURE__ */ import_react16.default.createElement(UniformRichTextNode, { ...props, key: i, node: childNode })) : null;
733
+ return /* @__PURE__ */ import_react16.default.createElement(NodeRenderer, { node }, children);
682
734
  }
683
735
  var rendererMap = /* @__PURE__ */ new Map([
684
736
  ["heading", HeadingRichTextNode],
@@ -687,12 +739,12 @@ var rendererMap = /* @__PURE__ */ new Map([
687
739
  ["list", ListRichTextNode],
688
740
  ["listitem", ListItemRichTextNode],
689
741
  ["paragraph", ParagraphRichTextNode],
690
- ["quote", ({ children }) => /* @__PURE__ */ import_react15.default.createElement("blockquote", null, children)],
742
+ ["quote", ({ children }) => /* @__PURE__ */ import_react16.default.createElement("blockquote", null, children)],
691
743
  [
692
744
  "code",
693
- ({ children }) => /* @__PURE__ */ import_react15.default.createElement("pre", null, /* @__PURE__ */ import_react15.default.createElement("code", null, children))
745
+ ({ children }) => /* @__PURE__ */ import_react16.default.createElement("pre", null, /* @__PURE__ */ import_react16.default.createElement("code", null, children))
694
746
  ],
695
- ["root", ({ children }) => /* @__PURE__ */ import_react15.default.createElement(import_react15.default.Fragment, null, children)],
747
+ ["root", ({ children }) => /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, children)],
696
748
  ["text", TextRichTextNode],
697
749
  ["tab", TabRichTextNode]
698
750
  ]);
@@ -701,102 +753,134 @@ var resolveRichTextDefaultRenderer = (node) => {
701
753
  };
702
754
 
703
755
  // src/components/UniformRichText/UniformRichText.tsx
704
- var UniformRichText = import_react16.default.forwardRef(function UniformRichText2({ parameterId, resolveRichTextRenderer, as: Tag = "div", ...props }, ref) {
756
+ var UniformRichText = import_react17.default.forwardRef(function UniformRichText2({ parameterId, resolveRichTextRenderer, as: Tag = "div", ...props }, ref) {
705
757
  const { data: componentData } = useUniformCurrentComponent();
706
- const parameter = (0, import_react16.useMemo)(() => {
758
+ const parameter = (0, import_react17.useMemo)(() => {
707
759
  var _a;
708
760
  return (_a = componentData == null ? void 0 : componentData.parameters) == null ? void 0 : _a[parameterId];
709
761
  }, [componentData, parameterId]);
710
- const value = (0, import_react16.useMemo)(() => parameter == null ? void 0 : parameter.value, [parameter]);
762
+ const value = (0, import_react17.useMemo)(() => parameter == null ? void 0 : parameter.value, [parameter]);
711
763
  if (!value || !(0, import_richtext5.isRichTextValue)(value) || (0, import_richtext5.isRichTextValueConsideredEmpty)(value))
712
764
  return null;
713
- return Tag === null ? /* @__PURE__ */ import_react16.default.createElement(UniformRichTextNode, { node: value.root, resolveRichTextRenderer }) : /* @__PURE__ */ import_react16.default.createElement(Tag, { ref, ...props }, /* @__PURE__ */ import_react16.default.createElement(UniformRichTextNode, { node: value.root, resolveRichTextRenderer }));
765
+ return Tag === null ? /* @__PURE__ */ import_react17.default.createElement(UniformRichTextNode, { node: value.root, resolveRichTextRenderer }) : /* @__PURE__ */ import_react17.default.createElement(Tag, { ref, ...props }, /* @__PURE__ */ import_react17.default.createElement(UniformRichTextNode, { node: value.root, resolveRichTextRenderer }));
714
766
  });
715
767
 
716
768
  // src/components/UniformText.tsx
717
- var import_react17 = __toESM(require("react"));
718
- var UniformText = ({
769
+ var import_react19 = __toESM(require("react"));
770
+
771
+ // src/components/PureUniformText.tsx
772
+ var import_react18 = __toESM(require("react"));
773
+ var PureUniformText = ({
719
774
  as: Tag = "span",
720
775
  parameterId,
776
+ component,
777
+ skipCustomRendering,
778
+ isContextualEditing,
721
779
  isMultiline = false,
722
780
  placeholder,
723
781
  render = (value) => value,
724
782
  ...props
725
783
  }) => {
726
- var _a, _b;
727
- const { data: componentData, contextualEditingDefaultPlaceholder } = useUniformCurrentComponent();
728
- const { isContextualEditing } = useUniformCurrentComposition();
729
- const [isFocused, setIsFocused] = (0, import_react17.useState)(false);
730
- const parameter = (0, import_react17.useMemo)(() => {
731
- var _a2;
732
- return (_a2 = componentData == null ? void 0 : componentData.parameters) == null ? void 0 : _a2[parameterId];
733
- }, [componentData, parameterId]);
784
+ var _a;
785
+ const parameter = (_a = component == null ? void 0 : component.parameters) == null ? void 0 : _a[parameterId];
734
786
  const value = parameter == null ? void 0 : parameter.value;
735
- const isEditable = (_b = (_a = parameter == null ? void 0 : parameter._contextualEditing) == null ? void 0 : _a.isEditable) != null ? _b : false;
736
- const shouldSkipCustomRendering = isFocused && isEditable;
737
- const handleOnFocus = (0, import_react17.useCallback)(() => {
738
- setIsFocused(true);
739
- }, [setIsFocused]);
740
- const handleOnBlur = (0, import_react17.useCallback)(() => {
741
- setIsFocused(false);
742
- }, [setIsFocused]);
743
787
  if (!parameter) {
744
788
  return null;
745
789
  }
746
790
  if (!isContextualEditing) {
747
- return /* @__PURE__ */ import_react17.default.createElement(Tag, { style: isMultiline ? { whiteSpace: "pre-wrap" } : {}, ...props }, render(value));
791
+ return /* @__PURE__ */ import_react18.default.createElement(Tag, { style: isMultiline ? { whiteSpace: "pre-wrap" } : {}, ...props }, render(value));
748
792
  }
749
- const placeholderProp = placeholder != null ? placeholder : contextualEditingDefaultPlaceholder;
750
- const computedPlaceholder = typeof placeholderProp === "function" ? placeholderProp({ id: parameterId }) : placeholderProp;
751
- return /* @__PURE__ */ import_react17.default.createElement(
793
+ const computedPlaceholder = typeof placeholder === "function" ? placeholder({ id: parameterId }) : placeholder;
794
+ return /* @__PURE__ */ import_react18.default.createElement(
752
795
  Tag,
753
796
  {
754
797
  ...props,
755
798
  ...getParameterAttributes({
756
- component: componentData,
799
+ component,
757
800
  id: parameterId,
758
801
  isMultiline
759
802
  }),
760
803
  "data-uniform-parameter-type": "text",
761
804
  "data-uniform-placeholder": computedPlaceholder,
762
- style: isMultiline ? { whiteSpace: "pre-wrap" } : {},
763
- onFocus: handleOnFocus,
764
- onBlur: handleOnBlur
805
+ style: isMultiline ? { whiteSpace: "pre-wrap" } : {}
765
806
  },
766
- shouldSkipCustomRendering ? value : render(value)
807
+ skipCustomRendering ? value : render(value)
808
+ );
809
+ };
810
+
811
+ // src/components/UniformText.tsx
812
+ var UniformText = ({
813
+ as: tag = "span",
814
+ parameterId,
815
+ isMultiline = false,
816
+ placeholder,
817
+ render = (value) => value,
818
+ ...props
819
+ }) => {
820
+ var _a, _b, _c;
821
+ const { data: componentData, contextualEditingDefaultPlaceholder } = useUniformCurrentComponent();
822
+ const { isContextualEditing } = useUniformCurrentComposition();
823
+ const [isFocused, setIsFocused] = (0, import_react19.useState)(false);
824
+ const parameter = (_a = componentData == null ? void 0 : componentData.parameters) == null ? void 0 : _a[parameterId];
825
+ const isEditable = (_c = (_b = parameter == null ? void 0 : parameter._contextualEditing) == null ? void 0 : _b.isEditable) != null ? _c : false;
826
+ const shouldSkipCustomRendering = isFocused && isEditable;
827
+ if (!parameter) {
828
+ return null;
829
+ }
830
+ const placeholderProp = placeholder != null ? placeholder : contextualEditingDefaultPlaceholder;
831
+ const computedPlaceholder = typeof placeholderProp === "function" ? placeholderProp({ id: parameterId }) : placeholderProp;
832
+ return /* @__PURE__ */ import_react19.default.createElement(
833
+ PureUniformText,
834
+ {
835
+ ...props,
836
+ as: tag,
837
+ parameterId,
838
+ component: componentData,
839
+ skipCustomRendering: shouldSkipCustomRendering,
840
+ isContextualEditing,
841
+ placeholder: computedPlaceholder,
842
+ render,
843
+ isMultiline,
844
+ onFocus: () => {
845
+ setIsFocused(true);
846
+ },
847
+ onBlur: () => {
848
+ setIsFocused(false);
849
+ }
850
+ }
767
851
  );
768
852
  };
769
853
 
770
854
  // src/helpers/getParameterAttributes.ts
771
- var import_canvas7 = require("@uniformdev/canvas");
855
+ var import_canvas8 = require("@uniformdev/canvas");
772
856
  var getParameterAttributes = (options) => {
773
857
  return {
774
- ...(0, import_canvas7.getParameterAttributes)(options),
858
+ ...(0, import_canvas8.getParameterAttributes)(options),
775
859
  suppressContentEditableWarning: true
776
860
  };
777
861
  };
778
862
 
779
863
  // src/hooks/useCompositionEventEffect.ts
780
- var import_canvas8 = require("@uniformdev/canvas");
781
- var import_react18 = require("react");
864
+ var import_canvas9 = require("@uniformdev/canvas");
865
+ var import_react20 = require("react");
782
866
  function useCompositionEventEffect({
783
867
  enabled,
784
868
  projectId,
785
869
  compositionId,
786
870
  effect
787
871
  }) {
788
- (0, import_react18.useEffect)(() => {
872
+ (0, import_react20.useEffect)(() => {
789
873
  if (!enabled || !compositionId || !projectId) {
790
874
  return;
791
875
  }
792
876
  let goodbye = void 0;
793
877
  const loadEffect = async () => {
794
- const eventBus = await (0, import_canvas8.createEventBus)();
878
+ const eventBus = await (0, import_canvas9.createEventBus)();
795
879
  if (eventBus) {
796
- goodbye = (0, import_canvas8.subscribeToComposition)({
880
+ goodbye = (0, import_canvas9.subscribeToComposition)({
797
881
  eventBus,
798
882
  compositionId,
799
- compositionState: import_canvas8.CANVAS_DRAFT_STATE,
883
+ compositionState: import_canvas9.CANVAS_DRAFT_STATE,
800
884
  projectId,
801
885
  callback: effect,
802
886
  event: "updated"
@@ -813,31 +897,31 @@ function useCompositionEventEffect({
813
897
  }
814
898
 
815
899
  // src/hooks/useUniformContextualEditingState.ts
816
- var import_canvas9 = require("@uniformdev/canvas");
817
- var import_react19 = require("react");
900
+ var import_canvas10 = require("@uniformdev/canvas");
901
+ var import_react21 = require("react");
818
902
  var useUniformContextualEditingState = ({
819
903
  global = false
820
904
  } = {}) => {
821
905
  const { isContextualEditing } = useUniformCurrentComposition();
822
906
  const { data: componentData } = useUniformCurrentComponent();
823
- const [selectedComponentReference, setSelectedComponentReference] = (0, import_react19.useState)();
824
- const channel = (0, import_react19.useMemo)(() => {
907
+ const [selectedComponentReference, setSelectedComponentReference] = (0, import_react21.useState)();
908
+ const channel = (0, import_react21.useMemo)(() => {
825
909
  if (!isContextualEditing) {
826
910
  return;
827
911
  }
828
- const channel2 = (0, import_canvas9.createCanvasChannel)({
912
+ const channel2 = (0, import_canvas10.createCanvasChannel)({
829
913
  broadcastTo: [window],
830
914
  listenTo: [window]
831
915
  });
832
916
  return channel2;
833
917
  }, [isContextualEditing]);
834
- (0, import_react19.useEffect)(() => {
918
+ (0, import_react21.useEffect)(() => {
835
919
  if (!channel) {
836
920
  return;
837
921
  }
838
922
  const unsubscribe = channel.on("update-contextual-editing-state-internal", async (message) => {
839
923
  var _a;
840
- if (!(0, import_canvas9.isUpdateContextualEditingStateInternalMessage)(message)) {
924
+ if (!(0, import_canvas10.isUpdateContextualEditingStateInternalMessage)(message)) {
841
925
  return;
842
926
  }
843
927
  if (!global && (componentData == null ? void 0 : componentData._id) !== ((_a = message.state.selectedComponentReference) == null ? void 0 : _a.parentId)) {
@@ -861,6 +945,8 @@ var useUniformContextualEditingState = ({
861
945
  NOT_IMPLEMENTED_COMPONENT,
862
946
  UniformComponent,
863
947
  UniformComposition,
948
+ UniformCompositionContext,
949
+ UniformPlayground,
864
950
  UniformRichText,
865
951
  UniformRichTextNode,
866
952
  UniformSlot,