@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/core.d.mts +41 -0
- package/dist/core.d.ts +41 -0
- package/dist/core.js +90 -0
- package/dist/core.mjs +55 -0
- package/dist/index.d.mts +23 -30
- package/dist/index.d.ts +23 -30
- package/dist/index.esm.js +138 -54
- package/dist/index.js +155 -69
- package/dist/index.mjs +138 -54
- package/package.json +31 -10
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
|
|
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
|
|
651
|
+
var import_react16 = __toESM(require("react"));
|
|
600
652
|
|
|
601
653
|
// src/components/UniformRichText/nodes/HeadingRichTextNode.tsx
|
|
602
|
-
var
|
|
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__ */
|
|
658
|
+
return /* @__PURE__ */ import_react8.default.createElement(HTag, null, children);
|
|
607
659
|
};
|
|
608
660
|
|
|
609
661
|
// src/components/UniformRichText/nodes/LinebreakRichTextNode.tsx
|
|
610
|
-
var
|
|
662
|
+
var import_react9 = __toESM(require("react"));
|
|
611
663
|
var LinebreakRichTextNode = () => {
|
|
612
|
-
return /* @__PURE__ */
|
|
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
|
|
669
|
+
var import_react10 = __toESM(require("react"));
|
|
618
670
|
var LinkRichTextNode = ({ children, node }) => {
|
|
619
671
|
const { link } = node;
|
|
620
|
-
return /* @__PURE__ */
|
|
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
|
|
676
|
+
var import_react11 = __toESM(require("react"));
|
|
625
677
|
var ListItemRichTextNode = ({ children, node }) => {
|
|
626
678
|
const { value } = node;
|
|
627
|
-
return /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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
|
|
692
|
+
var import_react13 = __toESM(require("react"));
|
|
641
693
|
var ParagraphRichTextNode = ({ children, node }) => {
|
|
642
694
|
const { format, direction } = node;
|
|
643
|
-
return /* @__PURE__ */
|
|
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
|
|
706
|
+
var import_react14 = __toESM(require("react"));
|
|
655
707
|
var TabRichTextNode = () => {
|
|
656
|
-
return /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
681
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
742
|
+
["quote", ({ children }) => /* @__PURE__ */ import_react16.default.createElement("blockquote", null, children)],
|
|
691
743
|
[
|
|
692
744
|
"code",
|
|
693
|
-
({ children }) => /* @__PURE__ */
|
|
745
|
+
({ children }) => /* @__PURE__ */ import_react16.default.createElement("pre", null, /* @__PURE__ */ import_react16.default.createElement("code", null, children))
|
|
694
746
|
],
|
|
695
|
-
["root", ({ children }) => /* @__PURE__ */
|
|
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 =
|
|
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,
|
|
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,
|
|
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__ */
|
|
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
|
|
718
|
-
|
|
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
|
|
727
|
-
const
|
|
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__ */
|
|
791
|
+
return /* @__PURE__ */ import_react18.default.createElement(Tag, { style: isMultiline ? { whiteSpace: "pre-wrap" } : {}, ...props }, render(value));
|
|
748
792
|
}
|
|
749
|
-
const
|
|
750
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
855
|
+
var import_canvas8 = require("@uniformdev/canvas");
|
|
772
856
|
var getParameterAttributes = (options) => {
|
|
773
857
|
return {
|
|
774
|
-
...(0,
|
|
858
|
+
...(0, import_canvas8.getParameterAttributes)(options),
|
|
775
859
|
suppressContentEditableWarning: true
|
|
776
860
|
};
|
|
777
861
|
};
|
|
778
862
|
|
|
779
863
|
// src/hooks/useCompositionEventEffect.ts
|
|
780
|
-
var
|
|
781
|
-
var
|
|
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,
|
|
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,
|
|
878
|
+
const eventBus = await (0, import_canvas9.createEventBus)();
|
|
795
879
|
if (eventBus) {
|
|
796
|
-
goodbye = (0,
|
|
880
|
+
goodbye = (0, import_canvas9.subscribeToComposition)({
|
|
797
881
|
eventBus,
|
|
798
882
|
compositionId,
|
|
799
|
-
compositionState:
|
|
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
|
|
817
|
-
var
|
|
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,
|
|
824
|
-
const channel = (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|