@uniformdev/canvas-react 19.35.1 → 19.35.3-alpha.82

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
@@ -43,7 +43,7 @@ __export(src_exports, {
43
43
  createComponentStore: () => createComponentStore,
44
44
  createComponentStoreResolver: () => createComponentStoreResolver,
45
45
  createUniformApiEnhancer: () => import_canvas3.createUniformApiEnhancer,
46
- getParameterAttributes: () => getParameterAttributes,
46
+ getParameterAttributes: () => getParameterAttributes2,
47
47
  registerUniformComponent: () => registerUniformComponent,
48
48
  useCompositionEventEffect: () => useCompositionEventEffect,
49
49
  useUniformContextualEditing: () => useUniformContextualEditing,
@@ -327,7 +327,8 @@ function UniformComposition({
327
327
  behaviorTracking = "onView",
328
328
  children,
329
329
  resolveRenderer,
330
- contextualEditingEnhancer
330
+ contextualEditingEnhancer,
331
+ contextualEditingDefaultPlaceholder
331
332
  }) {
332
333
  const { composition, isContextualEditing } = useUniformContextualEditing({
333
334
  initialCompositionValue: data,
@@ -343,7 +344,8 @@ function UniformComposition({
343
344
  {
344
345
  data: composition,
345
346
  behaviorTracking,
346
- resolveRenderer
347
+ resolveRenderer,
348
+ contextualEditingDefaultPlaceholder
347
349
  },
348
350
  children
349
351
  ))
@@ -531,7 +533,8 @@ function UniformComponent({
531
533
  data,
532
534
  resolveRenderer,
533
535
  children,
534
- behaviorTracking
536
+ behaviorTracking,
537
+ contextualEditingDefaultPlaceholder
535
538
  }) {
536
539
  var _a, _b, _c;
537
540
  const parentData = useUniformCurrentComponent();
@@ -545,7 +548,8 @@ function UniformComponent({
545
548
  const contextValue = {
546
549
  data,
547
550
  resolveRenderer: resolveRenderer || parentData.resolveRenderer || componentStoreResolver,
548
- behaviorTracking: (_a = behaviorTracking != null ? behaviorTracking : parentData == null ? void 0 : parentData.behaviorTracking) != null ? _a : "onView"
551
+ behaviorTracking: (_a = behaviorTracking != null ? behaviorTracking : parentData == null ? void 0 : parentData.behaviorTracking) != null ? _a : "onView",
552
+ contextualEditingDefaultPlaceholder: contextualEditingDefaultPlaceholder != null ? contextualEditingDefaultPlaceholder : parentData.contextualEditingDefaultPlaceholder
549
553
  };
550
554
  const enrichmentTags = (_c = (_b = data.parameters) == null ? void 0 : _b[import_canvas6.CANVAS_ENRICHMENT_TAG_PARAM]) == null ? void 0 : _c.value;
551
555
  const TrackComponent = contextValue.behaviorTracking === "onLoad" ? import_context_react2.TrackFragment : import_context_react2.Track;
@@ -585,56 +589,101 @@ function resolveChildren({
585
589
  }
586
590
 
587
591
  // src/components/UniformRichText/UniformRichText.tsx
592
+ var import_canvas8 = require("@uniformdev/canvas");
588
593
  var import_richtext5 = require("@uniformdev/richtext");
589
- var import_react16 = __toESM(require("react"));
594
+ var import_react17 = __toESM(require("react"));
595
+
596
+ // src/hooks/useUniformContextualEditingState.ts
597
+ var import_canvas7 = require("@uniformdev/canvas");
598
+ var import_react7 = require("react");
599
+ var useUniformContextualEditingState = ({
600
+ global = false
601
+ } = {}) => {
602
+ const { isContextualEditing } = useUniformCurrentComposition();
603
+ const { data: componentData } = useUniformCurrentComponent();
604
+ const [selectedComponentReference, setSelectedComponentReference] = (0, import_react7.useState)();
605
+ const channel = (0, import_react7.useMemo)(() => {
606
+ if (!isContextualEditing) {
607
+ return;
608
+ }
609
+ const channel2 = (0, import_canvas7.createCanvasChannel)({
610
+ broadcastTo: [window],
611
+ listenTo: [window]
612
+ });
613
+ return channel2;
614
+ }, [isContextualEditing]);
615
+ (0, import_react7.useEffect)(() => {
616
+ if (!channel) {
617
+ return;
618
+ }
619
+ const unsubscribe = channel.on("update-contextual-editing-state-internal", async (message) => {
620
+ var _a;
621
+ if (!(0, import_canvas7.isUpdateContextualEditingStateInternalMessage)(message)) {
622
+ return;
623
+ }
624
+ if (!global && (componentData == null ? void 0 : componentData._id) !== ((_a = message.state.selectedComponentReference) == null ? void 0 : _a.parentId)) {
625
+ setSelectedComponentReference(void 0);
626
+ return;
627
+ }
628
+ setSelectedComponentReference(message.state.selectedComponentReference);
629
+ });
630
+ return () => {
631
+ unsubscribe();
632
+ };
633
+ }, [global, channel, componentData == null ? void 0 : componentData._id]);
634
+ return {
635
+ isContextualEditing,
636
+ selectedComponentReference
637
+ };
638
+ };
590
639
 
591
640
  // src/components/UniformRichText/UniformRichTextNode.tsx
592
641
  var import_richtext4 = require("@uniformdev/richtext");
593
- var import_react15 = __toESM(require("react"));
642
+ var import_react16 = __toESM(require("react"));
594
643
 
595
644
  // src/components/UniformRichText/nodes/HeadingRichTextNode.tsx
596
- var import_react7 = __toESM(require("react"));
645
+ var import_react8 = __toESM(require("react"));
597
646
  var HeadingRichTextNode = ({ children, node }) => {
598
647
  const { tag } = node;
599
648
  const HTag = tag != null ? tag : "h1";
600
- return /* @__PURE__ */ import_react7.default.createElement(HTag, null, children);
649
+ return /* @__PURE__ */ import_react8.default.createElement(HTag, null, children);
601
650
  };
602
651
 
603
652
  // src/components/UniformRichText/nodes/LinebreakRichTextNode.tsx
604
- var import_react8 = __toESM(require("react"));
653
+ var import_react9 = __toESM(require("react"));
605
654
  var LinebreakRichTextNode = () => {
606
- return /* @__PURE__ */ import_react8.default.createElement("br", null);
655
+ return /* @__PURE__ */ import_react9.default.createElement("br", null);
607
656
  };
608
657
 
609
658
  // src/components/UniformRichText/nodes/LinkRichTextNode.tsx
610
659
  var import_richtext = require("@uniformdev/richtext");
611
- var import_react9 = __toESM(require("react"));
660
+ var import_react10 = __toESM(require("react"));
612
661
  var LinkRichTextNode = ({ children, node }) => {
613
662
  const { link } = node;
614
- return /* @__PURE__ */ import_react9.default.createElement("a", { href: (0, import_richtext.linkParamValueToHref)(link) }, children);
663
+ return /* @__PURE__ */ import_react10.default.createElement("a", { href: (0, import_richtext.linkParamValueToHref)(link) }, children);
615
664
  };
616
665
 
617
666
  // src/components/UniformRichText/nodes/ListItemRichTextNode.tsx
618
- var import_react10 = __toESM(require("react"));
667
+ var import_react11 = __toESM(require("react"));
619
668
  var ListItemRichTextNode = ({ children, node }) => {
620
669
  const { value } = node;
621
- return /* @__PURE__ */ import_react10.default.createElement("li", { value: Number.isFinite(value) && value > 0 ? value : void 0 }, children);
670
+ return /* @__PURE__ */ import_react11.default.createElement("li", { value: Number.isFinite(value) && value > 0 ? value : void 0 }, children);
622
671
  };
623
672
 
624
673
  // src/components/UniformRichText/nodes/ListRichTextNode.tsx
625
- var import_react11 = __toESM(require("react"));
674
+ var import_react12 = __toESM(require("react"));
626
675
  var ListRichTextNode = ({ children, node }) => {
627
676
  const { tag, start } = node;
628
677
  const ListTag = tag != null ? tag : "ul";
629
- return /* @__PURE__ */ import_react11.default.createElement(ListTag, { start: Number.isFinite(start) && start > 0 ? start : void 0 }, children);
678
+ return /* @__PURE__ */ import_react12.default.createElement(ListTag, { start: Number.isFinite(start) && start > 0 ? start : void 0 }, children);
630
679
  };
631
680
 
632
681
  // src/components/UniformRichText/nodes/ParagraphRichTextNode.tsx
633
682
  var import_richtext2 = require("@uniformdev/richtext");
634
- var import_react12 = __toESM(require("react"));
683
+ var import_react13 = __toESM(require("react"));
635
684
  var ParagraphRichTextNode = ({ children, node }) => {
636
685
  const { format, direction } = node;
637
- return /* @__PURE__ */ import_react12.default.createElement(
686
+ return /* @__PURE__ */ import_react13.default.createElement(
638
687
  "p",
639
688
  {
640
689
  dir: (0, import_richtext2.isPureDirection)(direction) ? direction : void 0,
@@ -645,18 +694,18 @@ var ParagraphRichTextNode = ({ children, node }) => {
645
694
  };
646
695
 
647
696
  // src/components/UniformRichText/nodes/TabRichTextNode.tsx
648
- var import_react13 = __toESM(require("react"));
697
+ var import_react14 = __toESM(require("react"));
649
698
  var TabRichTextNode = () => {
650
- return /* @__PURE__ */ import_react13.default.createElement(import_react13.default.Fragment, null, " ");
699
+ return /* @__PURE__ */ import_react14.default.createElement(import_react14.default.Fragment, null, " ");
651
700
  };
652
701
 
653
702
  // src/components/UniformRichText/nodes/TextRichTextNode.tsx
654
703
  var import_richtext3 = require("@uniformdev/richtext");
655
- var import_react14 = __toESM(require("react"));
704
+ var import_react15 = __toESM(require("react"));
656
705
  var TextRichTextNode = ({ node }) => {
657
706
  const { text, format } = node;
658
707
  const tags = (0, import_richtext3.getRichTextTagsFromTextFormat)(format);
659
- 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);
708
+ 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);
660
709
  };
661
710
 
662
711
  // src/components/UniformRichText/UniformRichTextNode.tsx
@@ -671,8 +720,8 @@ function UniformRichTextNode({ node, ...props }) {
671
720
  if (!NodeRenderer) {
672
721
  return null;
673
722
  }
674
- const children = node.children ? node.children.map((childNode, i) => /* @__PURE__ */ import_react15.default.createElement(UniformRichTextNode, { ...props, key: i, node: childNode })) : null;
675
- return /* @__PURE__ */ import_react15.default.createElement(NodeRenderer, { node }, children);
723
+ const children = node.children ? node.children.map((childNode, i) => /* @__PURE__ */ import_react16.default.createElement(UniformRichTextNode, { ...props, key: i, node: childNode })) : null;
724
+ return /* @__PURE__ */ import_react16.default.createElement(NodeRenderer, { node }, children);
676
725
  }
677
726
  var rendererMap = /* @__PURE__ */ new Map([
678
727
  ["heading", HeadingRichTextNode],
@@ -681,12 +730,12 @@ var rendererMap = /* @__PURE__ */ new Map([
681
730
  ["list", ListRichTextNode],
682
731
  ["listitem", ListItemRichTextNode],
683
732
  ["paragraph", ParagraphRichTextNode],
684
- ["quote", ({ children }) => /* @__PURE__ */ import_react15.default.createElement("blockquote", null, children)],
733
+ ["quote", ({ children }) => /* @__PURE__ */ import_react16.default.createElement("blockquote", null, children)],
685
734
  [
686
735
  "code",
687
- ({ children }) => /* @__PURE__ */ import_react15.default.createElement("pre", null, /* @__PURE__ */ import_react15.default.createElement("code", null, children))
736
+ ({ children }) => /* @__PURE__ */ import_react16.default.createElement("pre", null, /* @__PURE__ */ import_react16.default.createElement("code", null, children))
688
737
  ],
689
- ["root", ({ children }) => /* @__PURE__ */ import_react15.default.createElement(import_react15.default.Fragment, null, children)],
738
+ ["root", ({ children }) => /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, children)],
690
739
  ["text", TextRichTextNode],
691
740
  ["tab", TabRichTextNode]
692
741
  ]);
@@ -695,20 +744,34 @@ var resolveRichTextDefaultRenderer = (node) => {
695
744
  };
696
745
 
697
746
  // src/components/UniformRichText/UniformRichText.tsx
698
- var UniformRichText = import_react16.default.forwardRef(function UniformRichText2({ parameterId, resolveRichTextRenderer, as: Tag = "div", ...props }, ref) {
747
+ var UniformRichText = import_react17.default.forwardRef(function UniformRichText2({ parameterId, resolveRichTextRenderer, as: Tag = "div", ...props }, ref) {
699
748
  const { data: componentData } = useUniformCurrentComponent();
700
- const parameter = (0, import_react16.useMemo)(() => {
749
+ const { selectedComponentReference } = useUniformContextualEditingState({ global: true });
750
+ const parameter = (0, import_react17.useMemo)(() => {
701
751
  var _a;
702
752
  return (_a = componentData == null ? void 0 : componentData.parameters) == null ? void 0 : _a[parameterId];
703
753
  }, [componentData, parameterId]);
704
- const value = (0, import_react16.useMemo)(() => parameter == null ? void 0 : parameter.value, [parameter]);
754
+ const value = (0, import_react17.useMemo)(() => parameter == null ? void 0 : parameter.value, [parameter]);
705
755
  if (!value || !(0, import_richtext5.isRichTextValue)(value) || (0, import_richtext5.isRichTextValueConsideredEmpty)(value))
706
756
  return null;
707
- 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 }));
757
+ return Tag === null ? /* @__PURE__ */ import_react17.default.createElement(UniformRichTextNode, { node: value.root, resolveRichTextRenderer }) : /* @__PURE__ */ import_react17.default.createElement(
758
+ Tag,
759
+ {
760
+ ref,
761
+ ...props,
762
+ ...(0, import_canvas8.getParameterAttributes)({
763
+ component: componentData,
764
+ id: parameterId
765
+ }),
766
+ tabIndex: 0,
767
+ "data-uniform-selected-parameter": (selectedComponentReference == null ? void 0 : selectedComponentReference.id) === parameterId && selectedComponentReference.parentId === (componentData == null ? void 0 : componentData._id)
768
+ },
769
+ /* @__PURE__ */ import_react17.default.createElement(UniformRichTextNode, { node: value.root, resolveRichTextRenderer })
770
+ );
708
771
  });
709
772
 
710
773
  // src/components/UniformText.tsx
711
- var import_react17 = __toESM(require("react"));
774
+ var import_react18 = __toESM(require("react"));
712
775
  var UniformText = ({
713
776
  as: Tag = "span",
714
777
  parameterId,
@@ -717,25 +780,23 @@ var UniformText = ({
717
780
  render = (value) => value,
718
781
  ...props
719
782
  }) => {
720
- const { data: componentData } = useUniformCurrentComponent();
783
+ var _a, _b;
784
+ const { data: componentData, contextualEditingDefaultPlaceholder } = useUniformCurrentComponent();
721
785
  const { isContextualEditing } = useUniformCurrentComposition();
722
- const [isFocused, setIsFocused] = (0, import_react17.useState)(false);
723
- const parameter = (0, import_react17.useMemo)(() => {
724
- var _a;
725
- return (_a = componentData == null ? void 0 : componentData.parameters) == null ? void 0 : _a[parameterId];
786
+ const [isFocused, setIsFocused] = (0, import_react18.useState)(false);
787
+ const parameter = (0, import_react18.useMemo)(() => {
788
+ var _a2;
789
+ return (_a2 = componentData == null ? void 0 : componentData.parameters) == null ? void 0 : _a2[parameterId];
726
790
  }, [componentData, parameterId]);
727
- const value = (0, import_react17.useMemo)(() => parameter == null ? void 0 : parameter.value, [parameter]);
728
- const isEditable = (0, import_react17.useMemo)(() => {
729
- var _a, _b;
730
- return (_b = (_a = parameter == null ? void 0 : parameter._contextualEditing) == null ? void 0 : _a.isEditable) != null ? _b : false;
731
- }, [parameter]);
732
- const handleOnFocus = (0, import_react17.useCallback)(() => {
791
+ const value = parameter == null ? void 0 : parameter.value;
792
+ const isEditable = (_b = (_a = parameter == null ? void 0 : parameter._contextualEditing) == null ? void 0 : _a.isEditable) != null ? _b : false;
793
+ const shouldSkipCustomRendering = isFocused && isEditable;
794
+ const handleOnFocus = (0, import_react18.useCallback)(() => {
733
795
  setIsFocused(true);
734
796
  }, [setIsFocused]);
735
- const handleOnBlur = (0, import_react17.useCallback)(() => {
797
+ const handleOnBlur = (0, import_react18.useCallback)(() => {
736
798
  setIsFocused(false);
737
799
  }, [setIsFocused]);
738
- const shouldSkipCustomRendering = (0, import_react17.useMemo)(() => isFocused && isEditable, [isFocused, isEditable]);
739
800
  if (!parameter) {
740
801
  console.warn(
741
802
  `UniformText: The parameterId "${parameterId}" was not found in the component of type "${componentData == null ? void 0 : componentData.type}"`
@@ -743,21 +804,22 @@ var UniformText = ({
743
804
  return null;
744
805
  }
745
806
  if (!isContextualEditing) {
746
- return /* @__PURE__ */ import_react17.default.createElement(Tag, { style: isMultiline ? { whiteSpace: "pre-wrap" } : {}, ...props }, render(value));
807
+ return /* @__PURE__ */ import_react18.default.createElement(Tag, { style: isMultiline ? { whiteSpace: "pre-wrap" } : {}, ...props }, render(value));
747
808
  }
748
- return /* @__PURE__ */ import_react17.default.createElement(
809
+ const placeholderProp = placeholder != null ? placeholder : contextualEditingDefaultPlaceholder;
810
+ const computedPlaceholder = typeof placeholderProp === "function" ? placeholderProp({ id: parameterId }) : placeholderProp;
811
+ return /* @__PURE__ */ import_react18.default.createElement(
749
812
  Tag,
750
813
  {
751
814
  ...props,
752
- "data-uniform-component-id": componentData == null ? void 0 : componentData._id,
753
- "data-uniform-parameter-id": parameterId,
754
- "data-uniform-parameter-value": value != null ? value : "",
815
+ ...getParameterAttributes2({
816
+ component: componentData,
817
+ id: parameterId,
818
+ isMultiline
819
+ }),
755
820
  "data-uniform-parameter-type": "text",
756
- "data-uniform-is-multiline": isMultiline,
757
- "data-uniform-placeholder": placeholder,
821
+ "data-uniform-placeholder": computedPlaceholder,
758
822
  style: isMultiline ? { whiteSpace: "pre-wrap" } : {},
759
- contentEditable: isEditable,
760
- suppressContentEditableWarning: true,
761
823
  onFocus: handleOnFocus,
762
824
  onBlur: handleOnBlur
763
825
  },
@@ -766,45 +828,35 @@ var UniformText = ({
766
828
  };
767
829
 
768
830
  // src/helpers/getParameterAttributes.ts
769
- var getParameterAttributes = ({ id, component, placeholder }) => {
770
- var _a, _b, _c;
771
- const componentId = component == null ? void 0 : component._id;
772
- const parameter = (_a = component == null ? void 0 : component.parameters) == null ? void 0 : _a[id];
773
- const value = parameter == null ? void 0 : parameter.value;
774
- const type = parameter == null ? void 0 : parameter.type;
775
- const isEditable = (_c = (_b = parameter == null ? void 0 : parameter._contextualEditing) == null ? void 0 : _b.isEditable) != null ? _c : false;
831
+ var import_canvas9 = require("@uniformdev/canvas");
832
+ var getParameterAttributes2 = (options) => {
776
833
  return {
777
- "data-uniform-component-id": componentId,
778
- "data-uniform-parameter-id": id,
779
- "data-uniform-parameter-value": value != null ? value : "",
780
- "data-uniform-parameter-type": type,
781
- "data-uniform-placeholder": placeholder,
782
- contentEditable: isEditable,
834
+ ...(0, import_canvas9.getParameterAttributes)(options),
783
835
  suppressContentEditableWarning: true
784
836
  };
785
837
  };
786
838
 
787
839
  // src/hooks/useCompositionEventEffect.ts
788
- var import_canvas7 = require("@uniformdev/canvas");
789
- var import_react18 = require("react");
840
+ var import_canvas10 = require("@uniformdev/canvas");
841
+ var import_react19 = require("react");
790
842
  function useCompositionEventEffect({
791
843
  enabled,
792
844
  projectId,
793
845
  compositionId,
794
846
  effect
795
847
  }) {
796
- (0, import_react18.useEffect)(() => {
848
+ (0, import_react19.useEffect)(() => {
797
849
  if (!enabled || !compositionId || !projectId) {
798
850
  return;
799
851
  }
800
852
  let goodbye = void 0;
801
853
  const loadEffect = async () => {
802
- const eventBus = await (0, import_canvas7.createEventBus)();
854
+ const eventBus = await (0, import_canvas10.createEventBus)();
803
855
  if (eventBus) {
804
- goodbye = (0, import_canvas7.subscribeToComposition)({
856
+ goodbye = (0, import_canvas10.subscribeToComposition)({
805
857
  eventBus,
806
858
  compositionId,
807
- compositionState: import_canvas7.CANVAS_DRAFT_STATE,
859
+ compositionState: import_canvas10.CANVAS_DRAFT_STATE,
808
860
  projectId,
809
861
  callback: effect,
810
862
  event: "updated"
@@ -819,50 +871,6 @@ function useCompositionEventEffect({
819
871
  };
820
872
  }, [compositionId, enabled, projectId, effect]);
821
873
  }
822
-
823
- // src/hooks/useUniformContextualEditingState.ts
824
- var import_canvas8 = require("@uniformdev/canvas");
825
- var import_react19 = require("react");
826
- var useUniformContextualEditingState = ({
827
- global = false
828
- } = {}) => {
829
- const { isContextualEditing } = useUniformCurrentComposition();
830
- const { data: componentData } = useUniformCurrentComponent();
831
- const [selectedComponentReference, setSelectedComponentReference] = (0, import_react19.useState)();
832
- const channel = (0, import_react19.useMemo)(() => {
833
- if (!isContextualEditing) {
834
- return;
835
- }
836
- const channel2 = (0, import_canvas8.createCanvasChannel)({
837
- broadcastTo: [window],
838
- listenTo: [window]
839
- });
840
- return channel2;
841
- }, [isContextualEditing]);
842
- (0, import_react19.useEffect)(() => {
843
- if (!channel) {
844
- return;
845
- }
846
- const unsubscribe = channel.on("update-contextual-editing-state-internal", async (message) => {
847
- var _a;
848
- if (!(0, import_canvas8.isUpdateContextualEditingStateInternalMessage)(message)) {
849
- return;
850
- }
851
- if (!global && (componentData == null ? void 0 : componentData._id) !== ((_a = message.state.selectedComponentReference) == null ? void 0 : _a.parentId)) {
852
- setSelectedComponentReference(void 0);
853
- return;
854
- }
855
- setSelectedComponentReference(message.state.selectedComponentReference);
856
- });
857
- return () => {
858
- unsubscribe();
859
- };
860
- }, [global, channel, componentData == null ? void 0 : componentData._id]);
861
- return {
862
- isContextualEditing,
863
- selectedComponentReference
864
- };
865
- };
866
874
  // Annotate the CommonJS export names for ESM import in node:
867
875
  0 && (module.exports = {
868
876
  DefaultNotImplementedComponent,