@webiny/website-builder-vue 6.4.0-beta.4 → 6.4.0-beta.6

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.
Files changed (148) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/components/ConnectToEditor.d.ts +35 -0
  4. package/components/ConnectToEditor.js +40 -0
  5. package/components/ConnectToEditor.js.map +1 -0
  6. package/components/DocumentFragment.d.ts +67 -0
  7. package/components/DocumentFragment.js +24 -0
  8. package/components/DocumentFragment.js.map +1 -0
  9. package/components/DocumentRenderer.d.ts +59 -0
  10. package/components/DocumentRenderer.js +68 -0
  11. package/components/DocumentRenderer.js.map +1 -0
  12. package/components/DocumentStoreProvider.d.ts +37 -0
  13. package/components/DocumentStoreProvider.js +32 -0
  14. package/components/DocumentStoreProvider.js.map +1 -0
  15. package/components/EditingElementRenderer/EditingElementRenderer.d.ts +22 -0
  16. package/components/EditingElementRenderer/EditingElementRenderer.js +53 -0
  17. package/components/EditingElementRenderer/EditingElementRenderer.js.map +1 -0
  18. package/components/EditingElementRenderer/EditingElementRenderer.presenter.d.ts +15 -0
  19. package/components/EditingElementRenderer/EditingElementRenderer.presenter.js +37 -0
  20. package/components/EditingElementRenderer/EditingElementRenderer.presenter.js.map +1 -0
  21. package/components/EditingElementRenderer/index.js +2 -0
  22. package/components/ElementIndexProvider.d.ts +19 -0
  23. package/components/ElementIndexProvider.js +19 -0
  24. package/components/ElementIndexProvider.js.map +1 -0
  25. package/components/ElementRenderer.d.ts +19 -0
  26. package/components/ElementRenderer.js +33 -0
  27. package/components/ElementRenderer.js.map +1 -0
  28. package/components/ElementSlot.d.ts +39 -0
  29. package/components/ElementSlot.js +36 -0
  30. package/components/ElementSlot.js.map +1 -0
  31. package/components/ElementSlotDepthProvider.d.ts +19 -0
  32. package/components/ElementSlotDepthProvider.js +19 -0
  33. package/components/ElementSlotDepthProvider.js.map +1 -0
  34. package/components/FragmentsProvider.d.ts +46 -0
  35. package/components/FragmentsProvider.js +40 -0
  36. package/components/FragmentsProvider.js.map +1 -0
  37. package/components/LiveElementRenderer.d.ts +24 -0
  38. package/components/LiveElementRenderer.js +74 -0
  39. package/components/LiveElementRenderer.js.map +1 -0
  40. package/components/LiveElementSlot.d.ts +21 -0
  41. package/components/LiveElementSlot.js +36 -0
  42. package/components/LiveElementSlot.js.map +1 -0
  43. package/components/PreviewElementSlot.d.ts +38 -0
  44. package/components/PreviewElementSlot.js +45 -0
  45. package/components/PreviewElementSlot.js.map +1 -0
  46. package/{src/components/index.ts → components/index.d.ts} +2 -11
  47. package/components/index.js +8 -0
  48. package/composables/useBindingsForElement.d.ts +825 -0
  49. package/composables/useBindingsForElement.js +24 -0
  50. package/composables/useBindingsForElement.js.map +1 -0
  51. package/composables/useDocumentState.d.ts +5 -0
  52. package/composables/useDocumentState.js +11 -0
  53. package/composables/useDocumentState.js.map +1 -0
  54. package/composables/useObservable.d.ts +13 -0
  55. package/composables/useObservable.js +14 -0
  56. package/composables/useObservable.js.map +1 -0
  57. package/{src/composables/useSelectFromState.ts → composables/useSelectFromState.d.ts} +2 -10
  58. package/composables/useSelectFromState.js +9 -0
  59. package/composables/useSelectFromState.js.map +1 -0
  60. package/composables/useViewport.d.ts +7 -0
  61. package/composables/useViewport.js +18 -0
  62. package/composables/useViewport.js.map +1 -0
  63. package/createComponent.d.ts +21 -0
  64. package/createComponent.js +31 -0
  65. package/createComponent.js.map +1 -0
  66. package/editorComponents/Box.d.ts +7 -0
  67. package/editorComponents/Box.js +4 -0
  68. package/editorComponents/Box.js.map +1 -0
  69. package/editorComponents/Box.manifest.d.ts +1 -0
  70. package/{src/editorComponents/Box.manifest.ts → editorComponents/Box.manifest.js} +6 -4
  71. package/editorComponents/Box.manifest.js.map +1 -0
  72. package/editorComponents/Fragment.d.ts +13 -0
  73. package/editorComponents/Fragment.js +39 -0
  74. package/editorComponents/Fragment.js.map +1 -0
  75. package/editorComponents/Fragment.manifest.d.ts +1 -0
  76. package/{src/editorComponents/Fragment.manifest.ts → editorComponents/Fragment.manifest.js} +6 -4
  77. package/editorComponents/Fragment.manifest.js.map +1 -0
  78. package/editorComponents/Grid.d.ts +24 -0
  79. package/editorComponents/Grid.js +33 -0
  80. package/editorComponents/Grid.js.map +1 -0
  81. package/editorComponents/Grid.manifest.d.ts +1 -0
  82. package/{src/editorComponents/Grid.manifest.ts → editorComponents/Grid.manifest.js} +58 -55
  83. package/editorComponents/Grid.manifest.js.map +1 -0
  84. package/editorComponents/GridColumn.d.ts +5 -0
  85. package/editorComponents/GridColumn.js +4 -0
  86. package/editorComponents/GridColumn.js.map +1 -0
  87. package/editorComponents/GridColumn.manifest.d.ts +1 -0
  88. package/{src/editorComponents/GridColumn.manifest.ts → editorComponents/GridColumn.manifest.js} +9 -5
  89. package/editorComponents/GridColumn.manifest.js.map +1 -0
  90. package/editorComponents/Image.d.ts +37 -0
  91. package/editorComponents/Image.js +115 -0
  92. package/editorComponents/Image.js.map +1 -0
  93. package/editorComponents/Image.manifest.d.ts +1 -0
  94. package/{src/editorComponents/Image.manifest.ts → editorComponents/Image.manifest.js} +17 -12
  95. package/editorComponents/Image.manifest.js.map +1 -0
  96. package/editorComponents/Lexical.d.ts +18 -0
  97. package/editorComponents/Lexical.js +15 -0
  98. package/editorComponents/Lexical.js.map +1 -0
  99. package/editorComponents/Lexical.manifest.d.ts +1 -0
  100. package/editorComponents/Lexical.manifest.js +24 -0
  101. package/editorComponents/Lexical.manifest.js.map +1 -0
  102. package/editorComponents/Root.d.ts +7 -0
  103. package/editorComponents/Root.js +4 -0
  104. package/editorComponents/Root.js.map +1 -0
  105. package/editorComponents/Root.manifest.d.ts +1 -0
  106. package/{src/editorComponents/Root.manifest.ts → editorComponents/Root.manifest.js} +5 -3
  107. package/editorComponents/Root.manifest.js.map +1 -0
  108. package/{src/editorComponents/index.ts → editorComponents/index.d.ts} +1 -3
  109. package/editorComponents/index.js +20 -0
  110. package/editorComponents/index.js.map +1 -0
  111. package/index.d.ts +10 -0
  112. package/index.js +9 -4
  113. package/package.json +11 -10
  114. package/{src/types.ts → types.d.ts} +11 -32
  115. package/types.js +0 -0
  116. package/src/components/ConnectToEditor.ts +0 -46
  117. package/src/components/DocumentFragment.ts +0 -43
  118. package/src/components/DocumentRenderer.ts +0 -102
  119. package/src/components/DocumentStoreProvider.ts +0 -53
  120. package/src/components/EditingElementRenderer/EditingElementRenderer.presenter.ts +0 -59
  121. package/src/components/EditingElementRenderer/EditingElementRenderer.ts +0 -70
  122. package/src/components/ElementIndexProvider.ts +0 -24
  123. package/src/components/ElementRenderer.ts +0 -42
  124. package/src/components/ElementSlot.ts +0 -34
  125. package/src/components/ElementSlotDepthProvider.ts +0 -24
  126. package/src/components/FragmentsProvider.ts +0 -87
  127. package/src/components/LiveElementRenderer.ts +0 -102
  128. package/src/components/LiveElementSlot.ts +0 -46
  129. package/src/components/PreviewElementSlot.ts +0 -43
  130. package/src/composables/useBindingsForElement.ts +0 -40
  131. package/src/composables/useDocumentState.ts +0 -13
  132. package/src/composables/useObservable.ts +0 -30
  133. package/src/composables/useViewport.ts +0 -27
  134. package/src/createComponent.ts +0 -55
  135. package/src/editorComponents/Box.ts +0 -8
  136. package/src/editorComponents/Fragment.ts +0 -57
  137. package/src/editorComponents/Grid.ts +0 -72
  138. package/src/editorComponents/GridColumn.ts +0 -6
  139. package/src/editorComponents/Image.ts +0 -144
  140. package/src/editorComponents/Lexical.manifest.ts +0 -24
  141. package/src/editorComponents/Lexical.ts +0 -23
  142. package/src/editorComponents/Root.ts +0 -8
  143. package/src/index.ts +0 -52
  144. package/tsconfig.build.json +0 -16
  145. package/tsconfig.json +0 -16
  146. package/webiny.config.js +0 -8
  147. /package/{src/components/EditingElementRenderer/index.ts → components/EditingElementRenderer/index.d.ts} +0 -0
  148. /package/{src/lexical.css → lexical.css} +0 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Webiny
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # @webiny/website-builder-vue
2
+
3
+ > [!NOTE]
4
+ > This package is part of the [Webiny](https://www.webiny.com) monorepo.
5
+ > It’s **included in every Webiny project by default** and is not meant to be used as a standalone package.
6
+
7
+ 📘 **Documentation:** [https://www.webiny.com/docs](https://www.webiny.com/docs)
8
+
9
+ ---
10
+
11
+ _This README file is automatically generated during the publish process._
@@ -0,0 +1,35 @@
1
+ import { type PropType } from "vue";
2
+ import { type Component, type Document } from "@webiny/website-builder-sdk";
3
+ /**
4
+ * Used in editing mode: fetches a fresh copy of the page from the SDK,
5
+ * then mounts a DocumentStoreProvider + ElementRenderer for it.
6
+ *
7
+ * `document` is optional — when omitted (e.g. the live page is a draft not
8
+ * yet published), the current URL pathname is used as the page path so the
9
+ * editing SDK can still receive the document via the editor's postMessage.
10
+ *
11
+ * Equivalent of the React ConnectToEditor component.
12
+ */
13
+ export declare const ConnectToEditor: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
14
+ document: {
15
+ type: PropType<Document | undefined>;
16
+ default: undefined;
17
+ };
18
+ components: {
19
+ type: PropType<Component[]>;
20
+ required: true;
21
+ };
22
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
23
+ [key: string]: any;
24
+ }> | null, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
25
+ document: {
26
+ type: PropType<Document | undefined>;
27
+ default: undefined;
28
+ };
29
+ components: {
30
+ type: PropType<Component[]>;
31
+ required: true;
32
+ };
33
+ }>> & Readonly<{}>, {
34
+ document: Document | undefined;
35
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -0,0 +1,40 @@
1
+ import { defineComponent, h, onMounted, ref } from "vue";
2
+ import { contentSdk } from "@webiny/website-builder-sdk";
3
+ import { DocumentStoreProvider } from "./DocumentStoreProvider.js";
4
+ import { ElementRenderer } from "./ElementRenderer.js";
5
+ const ConnectToEditor = defineComponent({
6
+ name: "WebinyConnectToEditor",
7
+ props: {
8
+ document: {
9
+ type: Object,
10
+ default: void 0
11
+ },
12
+ components: {
13
+ type: Array,
14
+ required: true
15
+ }
16
+ },
17
+ setup (props) {
18
+ const data = ref(null);
19
+ onMounted(()=>{
20
+ const path = props.document?.properties?.path ?? window.location.pathname;
21
+ contentSdk.getPage(path).then((doc)=>{
22
+ data.value = doc;
23
+ });
24
+ });
25
+ return ()=>{
26
+ if (!data.value) return null;
27
+ return h(DocumentStoreProvider, {
28
+ id: data.value.properties.id,
29
+ document: data.value
30
+ }, {
31
+ default: ()=>h(ElementRenderer, {
32
+ id: "root"
33
+ })
34
+ });
35
+ };
36
+ }
37
+ });
38
+ export { ConnectToEditor };
39
+
40
+ //# sourceMappingURL=ConnectToEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/ConnectToEditor.js","sources":["../../src/components/ConnectToEditor.ts"],"sourcesContent":["import { defineComponent, ref, onMounted, h, type PropType } from \"vue\";\nimport { contentSdk, type Component, type Document } from \"@webiny/website-builder-sdk\";\nimport { DocumentStoreProvider } from \"./DocumentStoreProvider.js\";\nimport { ElementRenderer } from \"./ElementRenderer.js\";\n\n/**\n * Used in editing mode: fetches a fresh copy of the page from the SDK,\n * then mounts a DocumentStoreProvider + ElementRenderer for it.\n *\n * `document` is optional — when omitted (e.g. the live page is a draft not\n * yet published), the current URL pathname is used as the page path so the\n * editing SDK can still receive the document via the editor's postMessage.\n *\n * Equivalent of the React ConnectToEditor component.\n */\nexport const ConnectToEditor = defineComponent({\n name: \"WebinyConnectToEditor\",\n\n props: {\n document: { type: Object as PropType<Document | undefined>, default: undefined },\n components: { type: Array as PropType<Component[]>, required: true }\n },\n\n setup(props) {\n const data = ref<Document | null>(null);\n\n onMounted(() => {\n const path = props.document?.properties?.path ?? window.location.pathname;\n contentSdk.getPage(path).then(doc => {\n data.value = doc;\n });\n });\n\n return () => {\n if (!data.value) {\n return null;\n }\n\n return h(\n DocumentStoreProvider,\n { id: data.value.properties.id, document: data.value },\n { default: () => h(ElementRenderer, { id: \"root\" }) }\n );\n };\n }\n});\n"],"names":["ConnectToEditor","defineComponent","Object","undefined","Array","props","data","ref","onMounted","path","window","contentSdk","doc","h","DocumentStoreProvider","ElementRenderer"],"mappings":";;;;AAeO,MAAMA,kBAAkBC,gBAAgB;IAC3C,MAAM;IAEN,OAAO;QACH,UAAU;YAAE,MAAMC;YAA0C,SAASC;QAAU;QAC/E,YAAY;YAAE,MAAMC;YAAgC,UAAU;QAAK;IACvE;IAEA,OAAMC,KAAK;QACP,MAAMC,OAAOC,IAAqB;QAElCC,UAAU;YACN,MAAMC,OAAOJ,MAAM,QAAQ,EAAE,YAAY,QAAQK,OAAO,QAAQ,CAAC,QAAQ;YACzEC,WAAW,OAAO,CAACF,MAAM,IAAI,CAACG,CAAAA;gBAC1BN,KAAK,KAAK,GAAGM;YACjB;QACJ;QAEA,OAAO;YACH,IAAI,CAACN,KAAK,KAAK,EACX,OAAO;YAGX,OAAOO,EACHC,uBACA;gBAAE,IAAIR,KAAK,KAAK,CAAC,UAAU,CAAC,EAAE;gBAAE,UAAUA,KAAK,KAAK;YAAC,GACrD;gBAAE,SAAS,IAAMO,EAAEE,iBAAiB;wBAAE,IAAI;oBAAO;YAAG;QAE5D;IACJ;AACJ"}
@@ -0,0 +1,67 @@
1
+ import { type PropType } from "vue";
2
+ import type { Slot } from "vue";
3
+ /**
4
+ * Declarative fragment marker — analogous to the React DocumentFragment
5
+ * component but implemented differently in Vue.
6
+ *
7
+ * Usage inside a <DocumentRenderer>:
8
+ *
9
+ * ```vue
10
+ * <DocumentRenderer :document="doc" :components="comps">
11
+ * <!-- Inject a Vue subtree into the 'header' named fragment slot -->
12
+ * <template #fragment:header>
13
+ * <MySiteHeader />
14
+ * </template>
15
+ * </DocumentRenderer>
16
+ * ```
17
+ *
18
+ * For component-type fragments pass a `fragments` prop directly to
19
+ * DocumentRenderer instead:
20
+ * ```ts
21
+ * const fragments = [{ type: "component", component: "Webiny/MyNav", inputs: {} }];
22
+ * ```
23
+ */
24
+ export type DocumentFragmentProps = {
25
+ name: string;
26
+ element: Slot;
27
+ component?: never;
28
+ inputs?: never;
29
+ } | {
30
+ component: string;
31
+ inputs?: Record<string, unknown>;
32
+ name?: never;
33
+ element?: never;
34
+ };
35
+ export declare const DocumentFragment: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
36
+ name: {
37
+ type: StringConstructor;
38
+ default: undefined;
39
+ };
40
+ component: {
41
+ type: StringConstructor;
42
+ default: undefined;
43
+ };
44
+ inputs: {
45
+ type: PropType<Record<string, unknown>>;
46
+ default: undefined;
47
+ };
48
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
49
+ [key: string]: any;
50
+ }>[] | null, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
51
+ name: {
52
+ type: StringConstructor;
53
+ default: undefined;
54
+ };
55
+ component: {
56
+ type: StringConstructor;
57
+ default: undefined;
58
+ };
59
+ inputs: {
60
+ type: PropType<Record<string, unknown>>;
61
+ default: undefined;
62
+ };
63
+ }>> & Readonly<{}>, {
64
+ inputs: Record<string, unknown>;
65
+ name: string;
66
+ component: string;
67
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -0,0 +1,24 @@
1
+ import { defineComponent } from "vue";
2
+ const DocumentFragment = defineComponent({
3
+ name: "WebinyDocumentFragment",
4
+ props: {
5
+ name: {
6
+ type: String,
7
+ default: void 0
8
+ },
9
+ component: {
10
+ type: String,
11
+ default: void 0
12
+ },
13
+ inputs: {
14
+ type: Object,
15
+ default: void 0
16
+ }
17
+ },
18
+ setup (_, { slots }) {
19
+ return ()=>slots.default?.() ?? null;
20
+ }
21
+ });
22
+ export { DocumentFragment };
23
+
24
+ //# sourceMappingURL=DocumentFragment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/DocumentFragment.js","sources":["../../src/components/DocumentFragment.ts"],"sourcesContent":["import { defineComponent, type PropType } from \"vue\";\nimport type { Slot } from \"vue\";\n\n/**\n * Declarative fragment marker — analogous to the React DocumentFragment\n * component but implemented differently in Vue.\n *\n * Usage inside a <DocumentRenderer>:\n *\n * ```vue\n * <DocumentRenderer :document=\"doc\" :components=\"comps\">\n * <!-- Inject a Vue subtree into the 'header' named fragment slot -->\n * <template #fragment:header>\n * <MySiteHeader />\n * </template>\n * </DocumentRenderer>\n * ```\n *\n * For component-type fragments pass a `fragments` prop directly to\n * DocumentRenderer instead:\n * ```ts\n * const fragments = [{ type: \"component\", component: \"Webiny/MyNav\", inputs: {} }];\n * ```\n */\nexport type DocumentFragmentProps =\n | { name: string; element: Slot; component?: never; inputs?: never }\n | { component: string; inputs?: Record<string, unknown>; name?: never; element?: never };\n\nexport const DocumentFragment = defineComponent({\n name: \"WebinyDocumentFragment\",\n props: {\n name: { type: String, default: undefined },\n component: { type: String, default: undefined },\n inputs: {\n type: Object as PropType<Record<string, unknown>>,\n default: undefined\n }\n },\n setup(_, { slots }) {\n // If used directly in a template, render the default slot.\n return () => slots.default?.() ?? null;\n }\n});\n"],"names":["DocumentFragment","defineComponent","String","undefined","Object","_","slots"],"mappings":";AA4BO,MAAMA,mBAAmBC,gBAAgB;IAC5C,MAAM;IACN,OAAO;QACH,MAAM;YAAE,MAAMC;YAAQ,SAASC;QAAU;QACzC,WAAW;YAAE,MAAMD;YAAQ,SAASC;QAAU;QAC9C,QAAQ;YACJ,MAAMC;YACN,SAASD;QACb;IACJ;IACA,OAAME,CAAC,EAAE,EAAEC,KAAK,EAAE;QAEd,OAAO,IAAMA,MAAM,OAAO,QAAQ;IACtC;AACJ"}
@@ -0,0 +1,59 @@
1
+ import { type PropType } from "vue";
2
+ import { type Component, type Document } from "@webiny/website-builder-sdk";
3
+ import { type DocumentFragmentConfig } from "./FragmentsProvider.js";
4
+ /**
5
+ * Top-level rendering component. Accepts a Webiny document and a list of
6
+ * custom components, then renders the full page tree.
7
+ *
8
+ * **Named-slot fragments**
9
+ *
10
+ * Inject app-level Vue subtrees into named fragment slots:
11
+ * ```vue
12
+ * <DocumentRenderer :document="page.document" :components="myComps">
13
+ * <template #fragment:header><MySiteHeader /></template>
14
+ * <template #fragment:footer><MySiteFooter /></template>
15
+ * </DocumentRenderer>
16
+ * ```
17
+ *
18
+ * **Component fragments** (reference built-in editor components by name):
19
+ * ```ts
20
+ * const fragments = [
21
+ * { type: "component", component: "Webiny/MyNav", inputs: { label: "Nav" } }
22
+ * ];
23
+ * ```
24
+ */
25
+ export declare const DocumentRenderer: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
26
+ document: {
27
+ type: PropType<Document | null>;
28
+ default: null;
29
+ };
30
+ components: {
31
+ type: PropType<Component[]>;
32
+ default: () => never[];
33
+ };
34
+ /** Additional fragment configs (component-type or pre-built fixed fragments). */
35
+ fragments: {
36
+ type: PropType<DocumentFragmentConfig[]>;
37
+ default: () => never[];
38
+ };
39
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
40
+ [key: string]: any;
41
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
42
+ document: {
43
+ type: PropType<Document | null>;
44
+ default: null;
45
+ };
46
+ components: {
47
+ type: PropType<Component[]>;
48
+ default: () => never[];
49
+ };
50
+ /** Additional fragment configs (component-type or pre-built fixed fragments). */
51
+ fragments: {
52
+ type: PropType<DocumentFragmentConfig[]>;
53
+ default: () => never[];
54
+ };
55
+ }>> & Readonly<{}>, {
56
+ components: Component[];
57
+ document: Document | null;
58
+ fragments: DocumentFragmentConfig[];
59
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -0,0 +1,68 @@
1
+ import { computed, defineComponent, h } from "vue";
2
+ import { contentSdk } from "@webiny/website-builder-sdk";
3
+ import { DocumentStoreProvider } from "./DocumentStoreProvider.js";
4
+ import { ConnectToEditor } from "./ConnectToEditor.js";
5
+ import { FragmentsProvider } from "./FragmentsProvider.js";
6
+ import { ElementRenderer } from "./ElementRenderer.js";
7
+ import { editorComponents } from "../editorComponents/index.js";
8
+ const DocumentRenderer = defineComponent({
9
+ name: "WebinyDocumentRenderer",
10
+ props: {
11
+ document: {
12
+ type: Object,
13
+ default: null
14
+ },
15
+ components: {
16
+ type: Array,
17
+ default: ()=>[]
18
+ },
19
+ fragments: {
20
+ type: Array,
21
+ default: ()=>[]
22
+ }
23
+ },
24
+ setup (props, { slots }) {
25
+ const slotFragments = computed(()=>Object.entries(slots).filter(([name])=>name.startsWith("fragment:")).map(([name, slot])=>({
26
+ type: "fixed",
27
+ name: name.slice(9),
28
+ element: slot
29
+ })));
30
+ const allFragments = computed(()=>[
31
+ ...slotFragments.value,
32
+ ...props.fragments
33
+ ]);
34
+ return ()=>{
35
+ const { document, components } = props;
36
+ const allComponents = [
37
+ ...editorComponents,
38
+ ...components
39
+ ];
40
+ allComponents.forEach((c)=>contentSdk.registerComponent(c));
41
+ if (!document && !contentSdk.isEditing()) return h("div", {
42
+ "data-role": "document-renderer"
43
+ }, slots.default?.());
44
+ return h("div", {
45
+ "data-role": "document-renderer"
46
+ }, [
47
+ h(FragmentsProvider, {
48
+ fragments: allFragments.value
49
+ }, {
50
+ default: ()=>contentSdk.isEditing() ? h(ConnectToEditor, {
51
+ document: document ?? void 0,
52
+ components
53
+ }) : h(DocumentStoreProvider, {
54
+ id: document.properties.id,
55
+ document: document
56
+ }, {
57
+ default: ()=>h(ElementRenderer, {
58
+ id: "root"
59
+ })
60
+ })
61
+ })
62
+ ]);
63
+ };
64
+ }
65
+ });
66
+ export { DocumentRenderer };
67
+
68
+ //# sourceMappingURL=DocumentRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/DocumentRenderer.js","sources":["../../src/components/DocumentRenderer.ts"],"sourcesContent":["import { defineComponent, computed, h, type PropType } from \"vue\";\nimport { contentSdk, type Component, type Document } from \"@webiny/website-builder-sdk\";\nimport { DocumentStoreProvider } from \"./DocumentStoreProvider.js\";\nimport { ConnectToEditor } from \"./ConnectToEditor.js\";\nimport { FragmentsProvider, type DocumentFragmentConfig } from \"./FragmentsProvider.js\";\nimport { ElementRenderer } from \"./ElementRenderer.js\";\nimport { editorComponents } from \"~/editorComponents/index.js\";\n\n/**\n * Top-level rendering component. Accepts a Webiny document and a list of\n * custom components, then renders the full page tree.\n *\n * **Named-slot fragments**\n *\n * Inject app-level Vue subtrees into named fragment slots:\n * ```vue\n * <DocumentRenderer :document=\"page.document\" :components=\"myComps\">\n * <template #fragment:header><MySiteHeader /></template>\n * <template #fragment:footer><MySiteFooter /></template>\n * </DocumentRenderer>\n * ```\n *\n * **Component fragments** (reference built-in editor components by name):\n * ```ts\n * const fragments = [\n * { type: \"component\", component: \"Webiny/MyNav\", inputs: { label: \"Nav\" } }\n * ];\n * ```\n */\nexport const DocumentRenderer = defineComponent({\n name: \"WebinyDocumentRenderer\",\n\n props: {\n document: {\n type: Object as PropType<Document | null>,\n default: null\n },\n components: {\n type: Array as PropType<Component[]>,\n default: () => []\n },\n /** Additional fragment configs (component-type or pre-built fixed fragments). */\n fragments: {\n type: Array as PropType<DocumentFragmentConfig[]>,\n default: () => []\n }\n },\n\n setup(props, { slots }) {\n // Collect named slot fragments: <template #fragment:header> etc.\n const slotFragments = computed((): DocumentFragmentConfig[] =>\n Object.entries(slots)\n .filter(([name]) => name.startsWith(\"fragment:\"))\n .map(\n ([name, slot]): DocumentFragmentConfig => ({\n type: \"fixed\",\n name: name.slice(\"fragment:\".length),\n element: slot!\n })\n )\n );\n\n const allFragments = computed(() => [...slotFragments.value, ...props.fragments]);\n\n return () => {\n const { document, components } = props;\n\n // Register all components with the SDK on every render (idempotent).\n const allComponents = [...editorComponents, ...components];\n allComponents.forEach(c => contentSdk.registerComponent(c));\n\n if (!document && !contentSdk.isEditing()) {\n return h(\"div\", { \"data-role\": \"document-renderer\" }, slots.default?.());\n }\n\n return h(\"div\", { \"data-role\": \"document-renderer\" }, [\n h(\n FragmentsProvider,\n { fragments: allFragments.value },\n {\n default: () =>\n contentSdk.isEditing()\n ? h(ConnectToEditor, {\n document: document ?? undefined,\n components\n })\n : h(\n DocumentStoreProvider,\n {\n id: document!.properties.id,\n document: document!\n },\n {\n default: () => h(ElementRenderer, { id: \"root\" })\n }\n )\n }\n )\n ]);\n };\n }\n});\n"],"names":["DocumentRenderer","defineComponent","Object","Array","props","slots","slotFragments","computed","name","slot","allFragments","document","components","allComponents","editorComponents","c","contentSdk","h","FragmentsProvider","ConnectToEditor","undefined","DocumentStoreProvider","ElementRenderer"],"mappings":";;;;;;;AA6BO,MAAMA,mBAAmBC,gBAAgB;IAC5C,MAAM;IAEN,OAAO;QACH,UAAU;YACN,MAAMC;YACN,SAAS;QACb;QACA,YAAY;YACR,MAAMC;YACN,SAAS,IAAM,EAAE;QACrB;QAEA,WAAW;YACP,MAAMA;YACN,SAAS,IAAM,EAAE;QACrB;IACJ;IAEA,OAAMC,KAAK,EAAE,EAAEC,KAAK,EAAE;QAElB,MAAMC,gBAAgBC,SAAS,IAC3BL,OAAO,OAAO,CAACG,OACV,MAAM,CAAC,CAAC,CAACG,KAAK,GAAKA,KAAK,UAAU,CAAC,cACnC,GAAG,CACA,CAAC,CAACA,MAAMC,KAAK,GAA8B;oBACvC,MAAM;oBACN,MAAMD,KAAK,KAAK,CAAC;oBACjB,SAASC;gBACb;QAIZ,MAAMC,eAAeH,SAAS,IAAM;mBAAID,cAAc,KAAK;mBAAKF,MAAM,SAAS;aAAC;QAEhF,OAAO;YACH,MAAM,EAAEO,QAAQ,EAAEC,UAAU,EAAE,GAAGR;YAGjC,MAAMS,gBAAgB;mBAAIC;mBAAqBF;aAAW;YAC1DC,cAAc,OAAO,CAACE,CAAAA,IAAKC,WAAW,iBAAiB,CAACD;YAExD,IAAI,CAACJ,YAAY,CAACK,WAAW,SAAS,IAClC,OAAOC,EAAE,OAAO;gBAAE,aAAa;YAAoB,GAAGZ,MAAM,OAAO;YAGvE,OAAOY,EAAE,OAAO;gBAAE,aAAa;YAAoB,GAAG;gBAClDA,EACIC,mBACA;oBAAE,WAAWR,aAAa,KAAK;gBAAC,GAChC;oBACI,SAAS,IACLM,WAAW,SAAS,KACdC,EAAEE,iBAAiB;4BACf,UAAUR,YAAYS;4BACtBR;wBACJ,KACAK,EACII,uBACA;4BACI,IAAIV,SAAU,UAAU,CAAC,EAAE;4BAC3B,UAAUA;wBACd,GACA;4BACI,SAAS,IAAMM,EAAEK,iBAAiB;oCAAE,IAAI;gCAAO;wBACnD;gBAElB;aAEP;QACL;IACJ;AACJ"}
@@ -0,0 +1,37 @@
1
+ import { type InjectionKey, type PropType } from "vue";
2
+ import type { DocumentStore, Document } from "@webiny/website-builder-sdk";
3
+ export declare const DOCUMENT_STORE_KEY: InjectionKey<DocumentStore>;
4
+ /**
5
+ * Creates (or retrieves) the DocumentStore for the given document ID and
6
+ * provides it to all descendants via Vue's provide/inject.
7
+ *
8
+ * Equivalent of the React DocumentStoreProvider context provider.
9
+ */
10
+ export declare const DocumentStoreProvider: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
11
+ id: {
12
+ type: StringConstructor;
13
+ required: true;
14
+ };
15
+ document: {
16
+ type: PropType<Document | undefined>;
17
+ default: undefined;
18
+ };
19
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
20
+ [key: string]: any;
21
+ }>[] | undefined, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
22
+ id: {
23
+ type: StringConstructor;
24
+ required: true;
25
+ };
26
+ document: {
27
+ type: PropType<Document | undefined>;
28
+ default: undefined;
29
+ };
30
+ }>> & Readonly<{}>, {
31
+ document: Document | undefined;
32
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
33
+ /**
34
+ * Composable – retrieve the nearest DocumentStore from the component tree.
35
+ * Must be called inside a setup() that is a descendant of DocumentStoreProvider.
36
+ */
37
+ export declare const useDocumentStore: () => DocumentStore;
@@ -0,0 +1,32 @@
1
+ import { defineComponent, inject, provide, watchEffect } from "vue";
2
+ import { documentStoreManager } from "@webiny/website-builder-sdk";
3
+ const DOCUMENT_STORE_KEY = Symbol("WebinyDocumentStore");
4
+ const DocumentStoreProvider = defineComponent({
5
+ name: "WebinyDocumentStoreProvider",
6
+ props: {
7
+ id: {
8
+ type: String,
9
+ required: true
10
+ },
11
+ document: {
12
+ type: Object,
13
+ default: void 0
14
+ }
15
+ },
16
+ setup (props, { slots }) {
17
+ const store = documentStoreManager.getStore(props.id);
18
+ watchEffect(()=>{
19
+ if (props.document) store.setDocument(props.document);
20
+ });
21
+ provide(DOCUMENT_STORE_KEY, store);
22
+ return ()=>slots.default?.();
23
+ }
24
+ });
25
+ const useDocumentStore = ()=>{
26
+ const store = inject(DOCUMENT_STORE_KEY);
27
+ if (!store) throw new Error("useDocumentStore must be used within a DocumentStoreProvider");
28
+ return store;
29
+ };
30
+ export { DOCUMENT_STORE_KEY, DocumentStoreProvider, useDocumentStore };
31
+
32
+ //# sourceMappingURL=DocumentStoreProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/DocumentStoreProvider.js","sources":["../../src/components/DocumentStoreProvider.ts"],"sourcesContent":["import {\n defineComponent,\n provide,\n inject,\n watchEffect,\n type InjectionKey,\n type PropType\n} from \"vue\";\nimport type { DocumentStore, Document } from \"@webiny/website-builder-sdk\";\nimport { documentStoreManager } from \"@webiny/website-builder-sdk\";\n\nexport const DOCUMENT_STORE_KEY: InjectionKey<DocumentStore> = Symbol(\"WebinyDocumentStore\");\n\n/**\n * Creates (or retrieves) the DocumentStore for the given document ID and\n * provides it to all descendants via Vue's provide/inject.\n *\n * Equivalent of the React DocumentStoreProvider context provider.\n */\nexport const DocumentStoreProvider = defineComponent({\n name: \"WebinyDocumentStoreProvider\",\n\n props: {\n id: { type: String, required: true },\n document: { type: Object as PropType<Document | undefined>, default: undefined }\n },\n\n setup(props, { slots }) {\n const store = documentStoreManager.getStore(props.id);\n\n watchEffect(() => {\n if (props.document) {\n store.setDocument(props.document);\n }\n });\n\n provide(DOCUMENT_STORE_KEY, store);\n\n return () => slots.default?.();\n }\n});\n\n/**\n * Composable – retrieve the nearest DocumentStore from the component tree.\n * Must be called inside a setup() that is a descendant of DocumentStoreProvider.\n */\nexport const useDocumentStore = (): DocumentStore => {\n const store = inject(DOCUMENT_STORE_KEY);\n if (!store) {\n throw new Error(\"useDocumentStore must be used within a DocumentStoreProvider\");\n }\n return store;\n};\n"],"names":["DOCUMENT_STORE_KEY","Symbol","DocumentStoreProvider","defineComponent","String","Object","undefined","props","slots","store","documentStoreManager","watchEffect","provide","useDocumentStore","inject","Error"],"mappings":";;AAWO,MAAMA,qBAAkDC,OAAO;AAQ/D,MAAMC,wBAAwBC,gBAAgB;IACjD,MAAM;IAEN,OAAO;QACH,IAAI;YAAE,MAAMC;YAAQ,UAAU;QAAK;QACnC,UAAU;YAAE,MAAMC;YAA0C,SAASC;QAAU;IACnF;IAEA,OAAMC,KAAK,EAAE,EAAEC,KAAK,EAAE;QAClB,MAAMC,QAAQC,qBAAqB,QAAQ,CAACH,MAAM,EAAE;QAEpDI,YAAY;YACR,IAAIJ,MAAM,QAAQ,EACdE,MAAM,WAAW,CAACF,MAAM,QAAQ;QAExC;QAEAK,QAAQZ,oBAAoBS;QAE5B,OAAO,IAAMD,MAAM,OAAO;IAC9B;AACJ;AAMO,MAAMK,mBAAmB;IAC5B,MAAMJ,QAAQK,OAAOd;IACrB,IAAI,CAACS,OACD,MAAM,IAAIM,MAAM;IAEpB,OAAON;AACX"}
@@ -0,0 +1,22 @@
1
+ import { type PropType } from "vue";
2
+ import { type DocumentElement } from "@webiny/website-builder-sdk";
3
+ /**
4
+ * Wraps LiveElementRenderer with data-* attributes consumed by the Webiny
5
+ * editor (depth, sibling index, parent element ID/slot).
6
+ *
7
+ * Also sets up an EditingElementRendererPresenter that listens for element
8
+ * patch messages from the editor iframe and applies them to the document store.
9
+ */
10
+ export declare const EditingElementRenderer: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
11
+ element: {
12
+ type: PropType<DocumentElement>;
13
+ required: true;
14
+ };
15
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
16
+ [key: string]: any;
17
+ }> | null, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
18
+ element: {
19
+ type: PropType<DocumentElement>;
20
+ required: true;
21
+ };
22
+ }>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -0,0 +1,53 @@
1
+ import { defineComponent, h, onUnmounted, watch } from "vue";
2
+ import { EditingElementRendererPresenter } from "./EditingElementRenderer.presenter.js";
3
+ import { LiveElementRenderer } from "../LiveElementRenderer.js";
4
+ import { useElementSlotDepth } from "../ElementSlotDepthProvider.js";
5
+ import { useElementIndex } from "../ElementIndexProvider.js";
6
+ import { useDocumentStore } from "../DocumentStoreProvider.js";
7
+ import { useObservable } from "../../composables/useObservable.js";
8
+ const EditingElementRenderer = defineComponent({
9
+ name: "WebinyEditingElementRenderer",
10
+ props: {
11
+ element: {
12
+ type: Object,
13
+ required: true
14
+ }
15
+ },
16
+ setup (props) {
17
+ const documentStore = useDocumentStore();
18
+ const depth = useElementSlotDepth();
19
+ const index = useElementIndex();
20
+ const presenter = new EditingElementRendererPresenter(documentStore);
21
+ const stopWatch = watch(()=>props.element?.id, ()=>{
22
+ if (props.element) presenter.init(props.element);
23
+ }, {
24
+ immediate: true
25
+ });
26
+ onUnmounted(()=>{
27
+ presenter.dispose();
28
+ stopWatch();
29
+ });
30
+ const vm = useObservable(()=>presenter.vm);
31
+ return ()=>{
32
+ const element = vm.value?.element;
33
+ if (!element?.id) return null;
34
+ return h("div", {
35
+ style: {
36
+ display: "contents"
37
+ },
38
+ "data-element-id": element.id,
39
+ "data-depth": depth,
40
+ "data-parent-index": index,
41
+ "data-parent-id": element.parent?.id,
42
+ "data-parent-slot": element.parent?.slot
43
+ }, [
44
+ h(LiveElementRenderer, {
45
+ element
46
+ })
47
+ ]);
48
+ };
49
+ }
50
+ });
51
+ export { EditingElementRenderer };
52
+
53
+ //# sourceMappingURL=EditingElementRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/EditingElementRenderer/EditingElementRenderer.js","sources":["../../../src/components/EditingElementRenderer/EditingElementRenderer.ts"],"sourcesContent":["import { defineComponent, onUnmounted, watch, h, type PropType } from \"vue\";\nimport { type DocumentElement } from \"@webiny/website-builder-sdk\";\nimport { EditingElementRendererPresenter } from \"./EditingElementRenderer.presenter.js\";\nimport { LiveElementRenderer } from \"../LiveElementRenderer.js\";\nimport { useElementSlotDepth } from \"../ElementSlotDepthProvider.js\";\nimport { useElementIndex } from \"../ElementIndexProvider.js\";\nimport { useDocumentStore } from \"../DocumentStoreProvider.js\";\nimport { useObservable } from \"~/composables/useObservable.js\";\n\n/**\n * Wraps LiveElementRenderer with data-* attributes consumed by the Webiny\n * editor (depth, sibling index, parent element ID/slot).\n *\n * Also sets up an EditingElementRendererPresenter that listens for element\n * patch messages from the editor iframe and applies them to the document store.\n */\nexport const EditingElementRenderer = defineComponent({\n name: \"WebinyEditingElementRenderer\",\n\n props: {\n element: { type: Object as PropType<DocumentElement>, required: true }\n },\n\n setup(props) {\n const documentStore = useDocumentStore();\n const depth = useElementSlotDepth();\n const index = useElementIndex();\n\n const presenter = new EditingElementRendererPresenter(documentStore);\n\n // Initialise the presenter when the element (or its ID) changes.\n const stopWatch = watch(\n () => props.element?.id,\n () => {\n if (props.element) {\n presenter.init(props.element);\n }\n },\n { immediate: true }\n );\n\n onUnmounted(() => {\n presenter.dispose();\n stopWatch();\n });\n\n // Bridge the presenter's MobX observable vm into a Vue reactive ref.\n const vm = useObservable(() => presenter.vm);\n\n return () => {\n const element = vm.value?.element;\n if (!element?.id) {\n return null;\n }\n\n return h(\n \"div\",\n {\n style: { display: \"contents\" },\n \"data-element-id\": element.id,\n \"data-depth\": depth,\n \"data-parent-index\": index,\n \"data-parent-id\": element.parent?.id,\n \"data-parent-slot\": element.parent?.slot\n },\n [h(LiveElementRenderer, { element })]\n );\n };\n }\n});\n"],"names":["EditingElementRenderer","defineComponent","Object","props","documentStore","useDocumentStore","depth","useElementSlotDepth","index","useElementIndex","presenter","EditingElementRendererPresenter","stopWatch","watch","onUnmounted","vm","useObservable","element","h","LiveElementRenderer"],"mappings":";;;;;;;AAgBO,MAAMA,yBAAyBC,gBAAgB;IAClD,MAAM;IAEN,OAAO;QACH,SAAS;YAAE,MAAMC;YAAqC,UAAU;QAAK;IACzE;IAEA,OAAMC,KAAK;QACP,MAAMC,gBAAgBC;QACtB,MAAMC,QAAQC;QACd,MAAMC,QAAQC;QAEd,MAAMC,YAAY,IAAIC,gCAAgCP;QAGtD,MAAMQ,YAAYC,MACd,IAAMV,MAAM,OAAO,EAAE,IACrB;YACI,IAAIA,MAAM,OAAO,EACbO,UAAU,IAAI,CAACP,MAAM,OAAO;QAEpC,GACA;YAAE,WAAW;QAAK;QAGtBW,YAAY;YACRJ,UAAU,OAAO;YACjBE;QACJ;QAGA,MAAMG,KAAKC,cAAc,IAAMN,UAAU,EAAE;QAE3C,OAAO;YACH,MAAMO,UAAUF,GAAG,KAAK,EAAE;YAC1B,IAAI,CAACE,SAAS,IACV,OAAO;YAGX,OAAOC,EACH,OACA;gBACI,OAAO;oBAAE,SAAS;gBAAW;gBAC7B,mBAAmBD,QAAQ,EAAE;gBAC7B,cAAcX;gBACd,qBAAqBE;gBACrB,kBAAkBS,QAAQ,MAAM,EAAE;gBAClC,oBAAoBA,QAAQ,MAAM,EAAE;YACxC,GACA;gBAACC,EAAEC,qBAAqB;oBAAEF;gBAAQ;aAAG;QAE7C;IACJ;AACJ"}
@@ -0,0 +1,15 @@
1
+ import type { DocumentStore } from "@webiny/website-builder-sdk";
2
+ import { type DocumentElement } from "@webiny/website-builder-sdk";
3
+ export declare class EditingElementRendererPresenter {
4
+ private element;
5
+ private listeners;
6
+ private documentStore;
7
+ private readonly editingSdk;
8
+ constructor(documentStore: DocumentStore);
9
+ get vm(): {
10
+ element: DocumentElement;
11
+ };
12
+ init(element: DocumentElement): void;
13
+ dispose(): void;
14
+ private setupPreview;
15
+ }
@@ -0,0 +1,37 @@
1
+ "use client";
2
+ import { makeAutoObservable, observable, toJS } from "mobx";
3
+ import { contentSdk, jsonPatch } from "@webiny/website-builder-sdk";
4
+ class EditingElementRendererPresenter {
5
+ constructor(documentStore){
6
+ this.listeners = [];
7
+ this.documentStore = documentStore;
8
+ this.element = observable({});
9
+ this.editingSdk = contentSdk.getEditingSdk();
10
+ makeAutoObservable(this);
11
+ }
12
+ get vm() {
13
+ return {
14
+ element: toJS(this.element)
15
+ };
16
+ }
17
+ init(element) {
18
+ this.element = element;
19
+ this.setupPreview();
20
+ }
21
+ dispose() {
22
+ this.listeners.forEach((fn)=>fn());
23
+ }
24
+ setupPreview() {
25
+ const element = this.element;
26
+ if (!element) return;
27
+ const { id } = element;
28
+ if (this.editingSdk) this.listeners.push(this.editingSdk.messenger.on(`element.patch.${id}`, (patch)=>{
29
+ this.documentStore.updateDocument((document)=>{
30
+ jsonPatch.applyPatch(document.bindings[id], patch, false, true);
31
+ });
32
+ }));
33
+ }
34
+ }
35
+ export { EditingElementRendererPresenter };
36
+
37
+ //# sourceMappingURL=EditingElementRenderer.presenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/EditingElementRenderer/EditingElementRenderer.presenter.js","sources":["../../../src/components/EditingElementRenderer/EditingElementRenderer.presenter.ts"],"sourcesContent":["// This file is identical to the React version — it is a pure-TypeScript MobX\n// class with no framework-specific code, so it can be shared as-is.\n\"use client\";\nimport { makeAutoObservable, observable, toJS } from \"mobx\";\nimport type { DocumentStore } from \"@webiny/website-builder-sdk\";\nimport {\n contentSdk,\n jsonPatch,\n type EditingSdk,\n type DocumentElement\n} from \"@webiny/website-builder-sdk\";\n\nexport class EditingElementRendererPresenter {\n private element: DocumentElement;\n private listeners: Array<() => void> = [];\n private documentStore: DocumentStore;\n private readonly editingSdk: EditingSdk | undefined;\n\n constructor(documentStore: DocumentStore) {\n this.documentStore = documentStore;\n this.element = observable({}) as DocumentElement;\n this.editingSdk = contentSdk.getEditingSdk();\n makeAutoObservable(this);\n }\n\n get vm() {\n return {\n element: toJS(this.element)\n };\n }\n\n init(element: DocumentElement) {\n this.element = element;\n this.setupPreview();\n }\n\n dispose() {\n this.listeners.forEach(fn => fn());\n }\n\n private setupPreview() {\n const element = this.element;\n if (!element) {\n return;\n }\n\n const { id } = element;\n\n if (this.editingSdk) {\n this.listeners.push(\n this.editingSdk.messenger.on(`element.patch.${id}`, patch => {\n this.documentStore.updateDocument(document => {\n jsonPatch.applyPatch(document.bindings[id], patch, false, true);\n });\n })\n );\n }\n }\n}\n"],"names":["EditingElementRendererPresenter","documentStore","observable","contentSdk","makeAutoObservable","toJS","element","fn","id","patch","document","jsonPatch"],"mappings":";;;AAYO,MAAMA;IAMT,YAAYC,aAA4B,CAAE;aAJlC,SAAS,GAAsB,EAAE;QAKrC,IAAI,CAAC,aAAa,GAAGA;QACrB,IAAI,CAAC,OAAO,GAAGC,WAAW,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAGC,WAAW,aAAa;QAC1CC,mBAAmB,IAAI;IAC3B;IAEA,IAAI,KAAK;QACL,OAAO;YACH,SAASC,KAAK,IAAI,CAAC,OAAO;QAC9B;IACJ;IAEA,KAAKC,OAAwB,EAAE;QAC3B,IAAI,CAAC,OAAO,GAAGA;QACf,IAAI,CAAC,YAAY;IACrB;IAEA,UAAU;QACN,IAAI,CAAC,SAAS,CAAC,OAAO,CAACC,CAAAA,KAAMA;IACjC;IAEQ,eAAe;QACnB,MAAMD,UAAU,IAAI,CAAC,OAAO;QAC5B,IAAI,CAACA,SACD;QAGJ,MAAM,EAAEE,EAAE,EAAE,GAAGF;QAEf,IAAI,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,SAAS,CAAC,IAAI,CACf,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,cAAc,EAAEE,IAAI,EAAEC,CAAAA;YAChD,IAAI,CAAC,aAAa,CAAC,cAAc,CAACC,CAAAA;gBAC9BC,UAAU,UAAU,CAACD,SAAS,QAAQ,CAACF,GAAG,EAAEC,OAAO,OAAO;YAC9D;QACJ;IAGZ;AACJ"}
@@ -0,0 +1,2 @@
1
+ export { EditingElementRenderer } from "./EditingElementRenderer.js";
2
+ export { EditingElementRendererPresenter } from "./EditingElementRenderer.presenter.js";
@@ -0,0 +1,19 @@
1
+ import { type PropType } from "vue";
2
+ /**
3
+ * Provides the sibling index of the current element to all descendants.
4
+ */
5
+ export declare const ElementIndexProvider: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
6
+ index: {
7
+ type: PropType<number>;
8
+ required: true;
9
+ };
10
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
11
+ [key: string]: any;
12
+ }>[] | undefined, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
13
+ index: {
14
+ type: PropType<number>;
15
+ required: true;
16
+ };
17
+ }>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
18
+ /** Returns the sibling index of the current element (0-based). */
19
+ export declare const useElementIndex: () => number;
@@ -0,0 +1,19 @@
1
+ import { defineComponent, inject, provide } from "vue";
2
+ const INDEX_KEY = Symbol("WebinyElementIndex");
3
+ const ElementIndexProvider = defineComponent({
4
+ name: "WebinyElementIndexProvider",
5
+ props: {
6
+ index: {
7
+ type: Number,
8
+ required: true
9
+ }
10
+ },
11
+ setup (props, { slots }) {
12
+ provide(INDEX_KEY, props.index);
13
+ return ()=>slots.default?.();
14
+ }
15
+ });
16
+ const useElementIndex = ()=>inject(INDEX_KEY, 0);
17
+ export { ElementIndexProvider, useElementIndex };
18
+
19
+ //# sourceMappingURL=ElementIndexProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components/ElementIndexProvider.js","sources":["../../src/components/ElementIndexProvider.ts"],"sourcesContent":["import { defineComponent, provide, inject, type InjectionKey, type PropType } from \"vue\";\n\nconst INDEX_KEY: InjectionKey<number> = Symbol(\"WebinyElementIndex\");\n\n/**\n * Provides the sibling index of the current element to all descendants.\n */\nexport const ElementIndexProvider = defineComponent({\n name: \"WebinyElementIndexProvider\",\n\n props: {\n index: { type: Number as PropType<number>, required: true }\n },\n\n setup(props, { slots }) {\n provide(INDEX_KEY, props.index);\n return () => slots.default?.();\n }\n});\n\n/** Returns the sibling index of the current element (0-based). */\nexport const useElementIndex = (): number => {\n return inject(INDEX_KEY, 0);\n};\n"],"names":["INDEX_KEY","Symbol","ElementIndexProvider","defineComponent","Number","props","slots","provide","useElementIndex","inject"],"mappings":";AAEA,MAAMA,YAAkCC,OAAO;AAKxC,MAAMC,uBAAuBC,gBAAgB;IAChD,MAAM;IAEN,OAAO;QACH,OAAO;YAAE,MAAMC;YAA4B,UAAU;QAAK;IAC9D;IAEA,OAAMC,KAAK,EAAE,EAAEC,KAAK,EAAE;QAClBC,QAAQP,WAAWK,MAAM,KAAK;QAC9B,OAAO,IAAMC,MAAM,OAAO;IAC9B;AACJ;AAGO,MAAME,kBAAkB,IACpBC,OAAOT,WAAW"}