@webiny/website-builder-vue 6.4.0-beta.5 → 6.4.0-beta.7
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/LICENSE +21 -0
- package/README.md +11 -0
- package/components/ConnectToEditor.d.ts +35 -0
- package/components/ConnectToEditor.js +40 -0
- package/components/ConnectToEditor.js.map +1 -0
- package/components/DocumentFragment.d.ts +67 -0
- package/components/DocumentFragment.js +24 -0
- package/components/DocumentFragment.js.map +1 -0
- package/components/DocumentRenderer.d.ts +59 -0
- package/components/DocumentRenderer.js +68 -0
- package/components/DocumentRenderer.js.map +1 -0
- package/components/DocumentStoreProvider.d.ts +37 -0
- package/components/DocumentStoreProvider.js +32 -0
- package/components/DocumentStoreProvider.js.map +1 -0
- package/components/EditingElementRenderer/EditingElementRenderer.d.ts +22 -0
- package/components/EditingElementRenderer/EditingElementRenderer.js +53 -0
- package/components/EditingElementRenderer/EditingElementRenderer.js.map +1 -0
- package/components/EditingElementRenderer/EditingElementRenderer.presenter.d.ts +15 -0
- package/components/EditingElementRenderer/EditingElementRenderer.presenter.js +37 -0
- package/components/EditingElementRenderer/EditingElementRenderer.presenter.js.map +1 -0
- package/components/EditingElementRenderer/index.js +2 -0
- package/components/ElementIndexProvider.d.ts +19 -0
- package/components/ElementIndexProvider.js +19 -0
- package/components/ElementIndexProvider.js.map +1 -0
- package/components/ElementRenderer.d.ts +19 -0
- package/components/ElementRenderer.js +33 -0
- package/components/ElementRenderer.js.map +1 -0
- package/components/ElementSlot.d.ts +39 -0
- package/components/ElementSlot.js +36 -0
- package/components/ElementSlot.js.map +1 -0
- package/components/ElementSlotDepthProvider.d.ts +19 -0
- package/components/ElementSlotDepthProvider.js +19 -0
- package/components/ElementSlotDepthProvider.js.map +1 -0
- package/components/FragmentsProvider.d.ts +46 -0
- package/components/FragmentsProvider.js +40 -0
- package/components/FragmentsProvider.js.map +1 -0
- package/components/LiveElementRenderer.d.ts +24 -0
- package/components/LiveElementRenderer.js +74 -0
- package/components/LiveElementRenderer.js.map +1 -0
- package/components/LiveElementSlot.d.ts +21 -0
- package/components/LiveElementSlot.js +36 -0
- package/components/LiveElementSlot.js.map +1 -0
- package/components/PreviewElementSlot.d.ts +38 -0
- package/components/PreviewElementSlot.js +45 -0
- package/components/PreviewElementSlot.js.map +1 -0
- package/{src/components/index.ts → components/index.d.ts} +2 -11
- package/components/index.js +8 -0
- package/composables/useBindingsForElement.d.ts +825 -0
- package/composables/useBindingsForElement.js +24 -0
- package/composables/useBindingsForElement.js.map +1 -0
- package/composables/useDocumentState.d.ts +5 -0
- package/composables/useDocumentState.js +11 -0
- package/composables/useDocumentState.js.map +1 -0
- package/composables/useObservable.d.ts +13 -0
- package/composables/useObservable.js +14 -0
- package/composables/useObservable.js.map +1 -0
- package/{src/composables/useSelectFromState.ts → composables/useSelectFromState.d.ts} +2 -10
- package/composables/useSelectFromState.js +9 -0
- package/composables/useSelectFromState.js.map +1 -0
- package/composables/useViewport.d.ts +7 -0
- package/composables/useViewport.js +18 -0
- package/composables/useViewport.js.map +1 -0
- package/createComponent.d.ts +21 -0
- package/createComponent.js +31 -0
- package/createComponent.js.map +1 -0
- package/editorComponents/Box.d.ts +7 -0
- package/editorComponents/Box.js +4 -0
- package/editorComponents/Box.js.map +1 -0
- package/editorComponents/Box.manifest.d.ts +1 -0
- package/{src/editorComponents/Box.manifest.ts → editorComponents/Box.manifest.js} +6 -4
- package/editorComponents/Box.manifest.js.map +1 -0
- package/editorComponents/Fragment.d.ts +13 -0
- package/editorComponents/Fragment.js +39 -0
- package/editorComponents/Fragment.js.map +1 -0
- package/editorComponents/Fragment.manifest.d.ts +1 -0
- package/{src/editorComponents/Fragment.manifest.ts → editorComponents/Fragment.manifest.js} +6 -4
- package/editorComponents/Fragment.manifest.js.map +1 -0
- package/editorComponents/Grid.d.ts +24 -0
- package/editorComponents/Grid.js +33 -0
- package/editorComponents/Grid.js.map +1 -0
- package/editorComponents/Grid.manifest.d.ts +1 -0
- package/{src/editorComponents/Grid.manifest.ts → editorComponents/Grid.manifest.js} +58 -55
- package/editorComponents/Grid.manifest.js.map +1 -0
- package/editorComponents/GridColumn.d.ts +5 -0
- package/editorComponents/GridColumn.js +4 -0
- package/editorComponents/GridColumn.js.map +1 -0
- package/editorComponents/GridColumn.manifest.d.ts +1 -0
- package/{src/editorComponents/GridColumn.manifest.ts → editorComponents/GridColumn.manifest.js} +9 -5
- package/editorComponents/GridColumn.manifest.js.map +1 -0
- package/editorComponents/Image.d.ts +37 -0
- package/editorComponents/Image.js +115 -0
- package/editorComponents/Image.js.map +1 -0
- package/editorComponents/Image.manifest.d.ts +1 -0
- package/{src/editorComponents/Image.manifest.ts → editorComponents/Image.manifest.js} +17 -12
- package/editorComponents/Image.manifest.js.map +1 -0
- package/editorComponents/Lexical.d.ts +18 -0
- package/editorComponents/Lexical.js +15 -0
- package/editorComponents/Lexical.js.map +1 -0
- package/editorComponents/Lexical.manifest.d.ts +1 -0
- package/editorComponents/Lexical.manifest.js +24 -0
- package/editorComponents/Lexical.manifest.js.map +1 -0
- package/editorComponents/Root.d.ts +7 -0
- package/editorComponents/Root.js +4 -0
- package/editorComponents/Root.js.map +1 -0
- package/editorComponents/Root.manifest.d.ts +1 -0
- package/editorComponents/Root.manifest.js +13 -0
- package/editorComponents/Root.manifest.js.map +1 -0
- package/{src/editorComponents/index.ts → editorComponents/index.d.ts} +1 -3
- package/editorComponents/index.js +20 -0
- package/editorComponents/index.js.map +1 -0
- package/index.d.ts +10 -0
- package/index.js +9 -4
- package/package.json +10 -8
- package/{src/types.ts → types.d.ts} +11 -32
- package/types.js +0 -0
- package/src/components/ConnectToEditor.ts +0 -46
- package/src/components/DocumentFragment.ts +0 -43
- package/src/components/DocumentRenderer.ts +0 -102
- package/src/components/DocumentStoreProvider.ts +0 -53
- package/src/components/EditingElementRenderer/EditingElementRenderer.presenter.ts +0 -59
- package/src/components/EditingElementRenderer/EditingElementRenderer.ts +0 -70
- package/src/components/ElementIndexProvider.ts +0 -24
- package/src/components/ElementRenderer.ts +0 -42
- package/src/components/ElementSlot.ts +0 -34
- package/src/components/ElementSlotDepthProvider.ts +0 -24
- package/src/components/FragmentsProvider.ts +0 -87
- package/src/components/LiveElementRenderer.ts +0 -102
- package/src/components/LiveElementSlot.ts +0 -46
- package/src/components/PreviewElementSlot.ts +0 -43
- package/src/composables/useBindingsForElement.ts +0 -40
- package/src/composables/useDocumentState.ts +0 -13
- package/src/composables/useObservable.ts +0 -30
- package/src/composables/useViewport.ts +0 -27
- package/src/createComponent.ts +0 -55
- package/src/editorComponents/Box.ts +0 -8
- package/src/editorComponents/Fragment.ts +0 -57
- package/src/editorComponents/Grid.ts +0 -72
- package/src/editorComponents/GridColumn.ts +0 -6
- package/src/editorComponents/Image.ts +0 -144
- package/src/editorComponents/Lexical.manifest.ts +0 -24
- package/src/editorComponents/Lexical.ts +0 -23
- package/src/editorComponents/Root.manifest.ts +0 -10
- package/src/editorComponents/Root.ts +0 -8
- package/src/index.ts +0 -52
- package/tsconfig.build.json +0 -16
- package/tsconfig.json +0 -16
- package/webiny.config.js +0 -8
- /package/{src/components/EditingElementRenderer/index.ts → components/EditingElementRenderer/index.d.ts} +0 -0
- /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.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.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,EAAE;gBAAE,UAAUA,KAAK,KAAK;YAAC,GAC1C;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.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!.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,EAAE;4BAChB,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,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"}
|