@webiny/website-builder-vue 6.4.0-beta.5 → 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 +10 -8
  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
@@ -5,8 +5,6 @@ import { GridColumn } from "./GridColumn.manifest.js";
5
5
  import { Image } from "./Image.manifest.js";
6
6
  import { Lexical } from "./Lexical.manifest.js";
7
7
  import { Root } from "./Root.manifest.js";
8
-
9
- export const editorComponents = [Root, Box, Grid, GridColumn, Image, Lexical, Fragment];
10
-
8
+ export declare const editorComponents: import("@webiny/website-builder-sdk/types.js").Component[];
11
9
  export { Box, Fragment, Grid, GridColumn, Image, Lexical, Root };
12
10
  export { createLexicalValue } from "./Lexical.js";
@@ -0,0 +1,20 @@
1
+ import { Box } from "./Box.manifest.js";
2
+ import { Fragment } from "./Fragment.manifest.js";
3
+ import { Grid } from "./Grid.manifest.js";
4
+ import { GridColumn } from "./GridColumn.manifest.js";
5
+ import { Image } from "./Image.manifest.js";
6
+ import { Lexical } from "./Lexical.manifest.js";
7
+ import { Root } from "./Root.manifest.js";
8
+ const editorComponents = [
9
+ Root,
10
+ Box,
11
+ Grid,
12
+ GridColumn,
13
+ Image,
14
+ Lexical,
15
+ Fragment
16
+ ];
17
+ export { createLexicalValue } from "./Lexical.js";
18
+ export { Box, Fragment, Grid, GridColumn, Image, Lexical, Root, editorComponents };
19
+
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editorComponents/index.js","sources":["../../src/editorComponents/index.ts"],"sourcesContent":["import { Box } from \"./Box.manifest.js\";\nimport { Fragment } from \"./Fragment.manifest.js\";\nimport { Grid } from \"./Grid.manifest.js\";\nimport { GridColumn } from \"./GridColumn.manifest.js\";\nimport { Image } from \"./Image.manifest.js\";\nimport { Lexical } from \"./Lexical.manifest.js\";\nimport { Root } from \"./Root.manifest.js\";\n\nexport const editorComponents = [Root, Box, Grid, GridColumn, Image, Lexical, Fragment];\n\nexport { Box, Fragment, Grid, GridColumn, Image, Lexical, Root };\nexport { createLexicalValue } from \"./Lexical.js\";\n"],"names":["editorComponents","Root","Box","Grid","GridColumn","Image","Lexical","Fragment"],"mappings":";;;;;;;AAQO,MAAMA,mBAAmB;IAACC;IAAMC;IAAKC;IAAMC;IAAYC;IAAOC;IAASC;CAAS"}
package/index.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export { createTextInput, createLongTextInput, createNumberInput, createBooleanInput, createColorInput, createFileInput, createDateInput, createLexicalInput, createSelectInput, createRadioInput, createObjectInput, createTagsInput, createSlotInput, createInput, createElement, createTheme, contentSdk, environment, setHeadersProvider, getHeadersProvider, registerComponentGroup, type CssProperties, type Document, type DocumentElement, type Breakpoint, type CreateElementParams, type ContentSDKConfig, type ComponentManifest, type ComponentInput, type ComponentConstraint, type WebsiteBuilderThemeInput, StyleSettings } from "@webiny/website-builder-sdk";
2
+ export { createComponent } from "./createComponent.js";
3
+ export * from "./components/index.js";
4
+ export * from "./editorComponents/index.js";
5
+ export * from "./composables/useViewport.js";
6
+ export * from "./composables/useSelectFromState.js";
7
+ export * from "./composables/useObservable.js";
8
+ export * from "./composables/useBindingsForElement.js";
9
+ export * from "./composables/useDocumentState.js";
10
+ export type { ComponentProps, ComponentPropsWithChildren, InferManifest, InferComponentChange, InferDescendantChange } from "./types.js";
package/index.js CHANGED
@@ -1,4 +1,9 @@
1
- // Dev-only proxy: forwards to the compiled dist so that workspace symlinks
2
- // resolve correctly when the package is consumed by external Node.js runtimes
3
- // (e.g. Nitro) that follow symlinks to this source root.
4
- export * from "./dist/index.js";
1
+ export * from "./components/index.js";
2
+ export * from "./editorComponents/index.js";
3
+ export * from "./composables/useViewport.js";
4
+ export * from "./composables/useSelectFromState.js";
5
+ export * from "./composables/useObservable.js";
6
+ export * from "./composables/useBindingsForElement.js";
7
+ export * from "./composables/useDocumentState.js";
8
+ export { StyleSettings, contentSdk, createBooleanInput, createColorInput, createDateInput, createElement, createFileInput, createInput, createLexicalInput, createLongTextInput, createNumberInput, createObjectInput, createRadioInput, createSelectInput, createSlotInput, createTagsInput, createTextInput, createTheme, environment, getHeadersProvider, registerComponentGroup, setHeadersProvider } from "@webiny/website-builder-sdk";
9
+ export { createComponent } from "./createComponent.js";
package/package.json CHANGED
@@ -1,8 +1,7 @@
1
1
  {
2
2
  "name": "@webiny/website-builder-vue",
3
- "version": "6.4.0-beta.5",
3
+ "version": "6.4.0-beta.6",
4
4
  "type": "module",
5
- "main": "index.js",
6
5
  "repository": {
7
6
  "type": "git",
8
7
  "url": "https://github.com/webiny/webiny-js.git"
@@ -18,21 +17,24 @@
18
17
  ],
19
18
  "license": "MIT",
20
19
  "dependencies": {
21
- "@webiny/website-builder-sdk": "6.4.0-beta.5",
22
- "deep-equal": "^2.2.3",
23
- "mobx": "^6.15.3",
24
- "vue": "^3.5.0"
20
+ "@webiny/website-builder-sdk": "6.4.0-beta.6",
21
+ "deep-equal": "2.2.3",
22
+ "mobx": "6.15.3",
23
+ "vue": "3.5.34"
25
24
  },
26
25
  "devDependencies": {
27
- "@webiny/build-tools": "6.4.0-beta.5",
26
+ "@webiny/build-tools": "6.4.0-beta.6",
28
27
  "typescript": "6.0.3"
29
28
  },
30
29
  "peerDependencies": {
31
- "vue": ">=3.3"
30
+ "vue": "3.5.34"
32
31
  },
33
32
  "publishConfig": {
34
33
  "access": "public"
35
34
  },
35
+ "webiny": {
36
+ "publishFrom": "dist"
37
+ },
36
38
  "adio": {
37
39
  "ignore": {
38
40
  "dependencies": [
@@ -1,12 +1,5 @@
1
- import type {
2
- CssProperties,
3
- DocumentElement,
4
- ComponentManifestInput,
5
- ComponentChangeHandler,
6
- DescendantChangeHandler
7
- } from "@webiny/website-builder-sdk";
1
+ import type { CssProperties, DocumentElement, ComponentManifestInput, ComponentChangeHandler, DescendantChangeHandler } from "@webiny/website-builder-sdk";
8
2
  import type { VNode } from "vue";
9
-
10
3
  /**
11
4
  * Props received by every user-defined component registered via createComponent().
12
5
  */
@@ -16,31 +9,17 @@ export type ComponentProps<TInputs = unknown> = {
16
9
  element: DocumentElement;
17
10
  breakpoint: string;
18
11
  };
19
-
20
12
  /**
21
13
  * Shorthand for components that accept children (Box, Root, GridColumn, etc.).
22
14
  * `inputs.children` is the resolved VNode produced by ElementSlot.
23
15
  */
24
- export type ComponentPropsWithChildren<TInputs = unknown> = ComponentProps<
25
- TInputs & { children: VNode | null }
26
- >;
27
-
28
- // ---------- TypeScript utility types (mirrors the React package) ----------
29
-
30
- export type ExtractInputs<T> = T extends { inputs: infer I } ? I : never;
31
-
32
- export type ExtractInputNames<T extends (props: any) => any> = keyof ExtractInputs<
33
- Parameters<T>[0]
34
- >;
35
-
36
- export type InferManifest<T extends (props: any) => any> = ComponentManifestInput<
37
- ExtractInputs<Parameters<T>[0]>
38
- >;
39
-
40
- export type InferComponentChange<T extends (props: any) => any> = ComponentChangeHandler<
41
- ExtractInputs<Parameters<T>[0]>
42
- >;
43
-
44
- export type InferDescendantChange<T extends (props: any) => any> = DescendantChangeHandler<
45
- ExtractInputs<Parameters<T>[0]>
46
- >;
16
+ export type ComponentPropsWithChildren<TInputs = unknown> = ComponentProps<TInputs & {
17
+ children: VNode | null;
18
+ }>;
19
+ export type ExtractInputs<T> = T extends {
20
+ inputs: infer I;
21
+ } ? I : never;
22
+ export type ExtractInputNames<T extends (props: any) => any> = keyof ExtractInputs<Parameters<T>[0]>;
23
+ export type InferManifest<T extends (props: any) => any> = ComponentManifestInput<ExtractInputs<Parameters<T>[0]>>;
24
+ export type InferComponentChange<T extends (props: any) => any> = ComponentChangeHandler<ExtractInputs<Parameters<T>[0]>>;
25
+ export type InferDescendantChange<T extends (props: any) => any> = DescendantChangeHandler<ExtractInputs<Parameters<T>[0]>>;
package/types.js ADDED
File without changes
@@ -1,46 +0,0 @@
1
- import { defineComponent, ref, onMounted, h, type PropType } from "vue";
2
- import { contentSdk, type Component, type Document } from "@webiny/website-builder-sdk";
3
- import { DocumentStoreProvider } from "./DocumentStoreProvider.js";
4
- import { ElementRenderer } from "./ElementRenderer.js";
5
-
6
- /**
7
- * Used in editing mode: fetches a fresh copy of the page from the SDK,
8
- * then mounts a DocumentStoreProvider + ElementRenderer for it.
9
- *
10
- * `document` is optional — when omitted (e.g. the live page is a draft not
11
- * yet published), the current URL pathname is used as the page path so the
12
- * editing SDK can still receive the document via the editor's postMessage.
13
- *
14
- * Equivalent of the React ConnectToEditor component.
15
- */
16
- export const ConnectToEditor = defineComponent({
17
- name: "WebinyConnectToEditor",
18
-
19
- props: {
20
- document: { type: Object as PropType<Document | undefined>, default: undefined },
21
- components: { type: Array as PropType<Component[]>, required: true }
22
- },
23
-
24
- setup(props) {
25
- const data = ref<Document | null>(null);
26
-
27
- onMounted(() => {
28
- const path = props.document?.properties?.path ?? window.location.pathname;
29
- contentSdk.getPage(path).then(doc => {
30
- data.value = doc;
31
- });
32
- });
33
-
34
- return () => {
35
- if (!data.value) {
36
- return null;
37
- }
38
-
39
- return h(
40
- DocumentStoreProvider,
41
- { id: data.value.properties.id, document: data.value },
42
- { default: () => h(ElementRenderer, { id: "root" }) }
43
- );
44
- };
45
- }
46
- });
@@ -1,43 +0,0 @@
1
- import { defineComponent, type PropType } from "vue";
2
- import type { Slot } from "vue";
3
-
4
- /**
5
- * Declarative fragment marker — analogous to the React DocumentFragment
6
- * component but implemented differently in Vue.
7
- *
8
- * Usage inside a <DocumentRenderer>:
9
- *
10
- * ```vue
11
- * <DocumentRenderer :document="doc" :components="comps">
12
- * <!-- Inject a Vue subtree into the 'header' named fragment slot -->
13
- * <template #fragment:header>
14
- * <MySiteHeader />
15
- * </template>
16
- * </DocumentRenderer>
17
- * ```
18
- *
19
- * For component-type fragments pass a `fragments` prop directly to
20
- * DocumentRenderer instead:
21
- * ```ts
22
- * const fragments = [{ type: "component", component: "Webiny/MyNav", inputs: {} }];
23
- * ```
24
- */
25
- export type DocumentFragmentProps =
26
- | { name: string; element: Slot; component?: never; inputs?: never }
27
- | { component: string; inputs?: Record<string, unknown>; name?: never; element?: never };
28
-
29
- export const DocumentFragment = defineComponent({
30
- name: "WebinyDocumentFragment",
31
- props: {
32
- name: { type: String, default: undefined },
33
- component: { type: String, default: undefined },
34
- inputs: {
35
- type: Object as PropType<Record<string, unknown>>,
36
- default: undefined
37
- }
38
- },
39
- setup(_, { slots }) {
40
- // If used directly in a template, render the default slot.
41
- return () => slots.default?.() ?? null;
42
- }
43
- });
@@ -1,102 +0,0 @@
1
- import { defineComponent, computed, h, type PropType } from "vue";
2
- import { contentSdk, type Component, type Document } from "@webiny/website-builder-sdk";
3
- import { DocumentStoreProvider } from "./DocumentStoreProvider.js";
4
- import { ConnectToEditor } from "./ConnectToEditor.js";
5
- import { FragmentsProvider, type DocumentFragmentConfig } from "./FragmentsProvider.js";
6
- import { ElementRenderer } from "./ElementRenderer.js";
7
- import { editorComponents } from "~/editorComponents/index.js";
8
-
9
- /**
10
- * Top-level rendering component. Accepts a Webiny document and a list of
11
- * custom components, then renders the full page tree.
12
- *
13
- * **Named-slot fragments**
14
- *
15
- * Inject app-level Vue subtrees into named fragment slots:
16
- * ```vue
17
- * <DocumentRenderer :document="page.document" :components="myComps">
18
- * <template #fragment:header><MySiteHeader /></template>
19
- * <template #fragment:footer><MySiteFooter /></template>
20
- * </DocumentRenderer>
21
- * ```
22
- *
23
- * **Component fragments** (reference built-in editor components by name):
24
- * ```ts
25
- * const fragments = [
26
- * { type: "component", component: "Webiny/MyNav", inputs: { label: "Nav" } }
27
- * ];
28
- * ```
29
- */
30
- export const DocumentRenderer = defineComponent({
31
- name: "WebinyDocumentRenderer",
32
-
33
- props: {
34
- document: {
35
- type: Object as PropType<Document | null>,
36
- default: null
37
- },
38
- components: {
39
- type: Array as PropType<Component[]>,
40
- default: () => []
41
- },
42
- /** Additional fragment configs (component-type or pre-built fixed fragments). */
43
- fragments: {
44
- type: Array as PropType<DocumentFragmentConfig[]>,
45
- default: () => []
46
- }
47
- },
48
-
49
- setup(props, { slots }) {
50
- // Collect named slot fragments: <template #fragment:header> etc.
51
- const slotFragments = computed((): DocumentFragmentConfig[] =>
52
- Object.entries(slots)
53
- .filter(([name]) => name.startsWith("fragment:"))
54
- .map(
55
- ([name, slot]): DocumentFragmentConfig => ({
56
- type: "fixed",
57
- name: name.slice("fragment:".length),
58
- element: slot!
59
- })
60
- )
61
- );
62
-
63
- const allFragments = computed(() => [...slotFragments.value, ...props.fragments]);
64
-
65
- return () => {
66
- const { document, components } = props;
67
-
68
- // Register all components with the SDK on every render (idempotent).
69
- const allComponents = [...editorComponents, ...components];
70
- allComponents.forEach(c => contentSdk.registerComponent(c));
71
-
72
- if (!document && !contentSdk.isEditing()) {
73
- return h("div", { "data-role": "document-renderer" }, slots.default?.());
74
- }
75
-
76
- return h("div", { "data-role": "document-renderer" }, [
77
- h(
78
- FragmentsProvider,
79
- { fragments: allFragments.value },
80
- {
81
- default: () =>
82
- contentSdk.isEditing()
83
- ? h(ConnectToEditor, {
84
- document: document ?? undefined,
85
- components
86
- })
87
- : h(
88
- DocumentStoreProvider,
89
- {
90
- id: document!.properties.id,
91
- document: document!
92
- },
93
- {
94
- default: () => h(ElementRenderer, { id: "root" })
95
- }
96
- )
97
- }
98
- )
99
- ]);
100
- };
101
- }
102
- });
@@ -1,53 +0,0 @@
1
- import {
2
- defineComponent,
3
- provide,
4
- inject,
5
- watchEffect,
6
- type InjectionKey,
7
- type PropType
8
- } from "vue";
9
- import type { DocumentStore, Document } from "@webiny/website-builder-sdk";
10
- import { documentStoreManager } from "@webiny/website-builder-sdk";
11
-
12
- export const DOCUMENT_STORE_KEY: InjectionKey<DocumentStore> = Symbol("WebinyDocumentStore");
13
-
14
- /**
15
- * Creates (or retrieves) the DocumentStore for the given document ID and
16
- * provides it to all descendants via Vue's provide/inject.
17
- *
18
- * Equivalent of the React DocumentStoreProvider context provider.
19
- */
20
- export const DocumentStoreProvider = defineComponent({
21
- name: "WebinyDocumentStoreProvider",
22
-
23
- props: {
24
- id: { type: String, required: true },
25
- document: { type: Object as PropType<Document | undefined>, default: undefined }
26
- },
27
-
28
- setup(props, { slots }) {
29
- const store = documentStoreManager.getStore(props.id);
30
-
31
- watchEffect(() => {
32
- if (props.document) {
33
- store.setDocument(props.document);
34
- }
35
- });
36
-
37
- provide(DOCUMENT_STORE_KEY, store);
38
-
39
- return () => slots.default?.();
40
- }
41
- });
42
-
43
- /**
44
- * Composable – retrieve the nearest DocumentStore from the component tree.
45
- * Must be called inside a setup() that is a descendant of DocumentStoreProvider.
46
- */
47
- export const useDocumentStore = (): DocumentStore => {
48
- const store = inject(DOCUMENT_STORE_KEY);
49
- if (!store) {
50
- throw new Error("useDocumentStore must be used within a DocumentStoreProvider");
51
- }
52
- return store;
53
- };
@@ -1,59 +0,0 @@
1
- // This file is identical to the React version — it is a pure-TypeScript MobX
2
- // class with no framework-specific code, so it can be shared as-is.
3
- "use client";
4
- import { makeAutoObservable, observable, toJS } from "mobx";
5
- import type { DocumentStore } from "@webiny/website-builder-sdk";
6
- import {
7
- contentSdk,
8
- jsonPatch,
9
- type EditingSdk,
10
- type DocumentElement
11
- } from "@webiny/website-builder-sdk";
12
-
13
- export class EditingElementRendererPresenter {
14
- private element: DocumentElement;
15
- private listeners: Array<() => void> = [];
16
- private documentStore: DocumentStore;
17
- private readonly editingSdk: EditingSdk | undefined;
18
-
19
- constructor(documentStore: DocumentStore) {
20
- this.documentStore = documentStore;
21
- this.element = observable({}) as DocumentElement;
22
- this.editingSdk = contentSdk.getEditingSdk();
23
- makeAutoObservable(this);
24
- }
25
-
26
- get vm() {
27
- return {
28
- element: toJS(this.element)
29
- };
30
- }
31
-
32
- init(element: DocumentElement) {
33
- this.element = element;
34
- this.setupPreview();
35
- }
36
-
37
- dispose() {
38
- this.listeners.forEach(fn => fn());
39
- }
40
-
41
- private setupPreview() {
42
- const element = this.element;
43
- if (!element) {
44
- return;
45
- }
46
-
47
- const { id } = element;
48
-
49
- if (this.editingSdk) {
50
- this.listeners.push(
51
- this.editingSdk.messenger.on(`element.patch.${id}`, patch => {
52
- this.documentStore.updateDocument(document => {
53
- jsonPatch.applyPatch(document.bindings[id], patch, false, true);
54
- });
55
- })
56
- );
57
- }
58
- }
59
- }
@@ -1,70 +0,0 @@
1
- import { defineComponent, onUnmounted, watch, h, type PropType } from "vue";
2
- import { type DocumentElement } from "@webiny/website-builder-sdk";
3
- import { EditingElementRendererPresenter } from "./EditingElementRenderer.presenter.js";
4
- import { LiveElementRenderer } from "../LiveElementRenderer.js";
5
- import { useElementSlotDepth } from "../ElementSlotDepthProvider.js";
6
- import { useElementIndex } from "../ElementIndexProvider.js";
7
- import { useDocumentStore } from "../DocumentStoreProvider.js";
8
- import { useObservable } from "~/composables/useObservable.js";
9
-
10
- /**
11
- * Wraps LiveElementRenderer with data-* attributes consumed by the Webiny
12
- * editor (depth, sibling index, parent element ID/slot).
13
- *
14
- * Also sets up an EditingElementRendererPresenter that listens for element
15
- * patch messages from the editor iframe and applies them to the document store.
16
- */
17
- export const EditingElementRenderer = defineComponent({
18
- name: "WebinyEditingElementRenderer",
19
-
20
- props: {
21
- element: { type: Object as PropType<DocumentElement>, required: true }
22
- },
23
-
24
- setup(props) {
25
- const documentStore = useDocumentStore();
26
- const depth = useElementSlotDepth();
27
- const index = useElementIndex();
28
-
29
- const presenter = new EditingElementRendererPresenter(documentStore);
30
-
31
- // Initialise the presenter when the element (or its ID) changes.
32
- const stopWatch = watch(
33
- () => props.element?.id,
34
- () => {
35
- if (props.element) {
36
- presenter.init(props.element);
37
- }
38
- },
39
- { immediate: true }
40
- );
41
-
42
- onUnmounted(() => {
43
- presenter.dispose();
44
- stopWatch();
45
- });
46
-
47
- // Bridge the presenter's MobX observable vm into a Vue reactive ref.
48
- const vm = useObservable(() => presenter.vm);
49
-
50
- return () => {
51
- const element = vm.value?.element;
52
- if (!element?.id) {
53
- return null;
54
- }
55
-
56
- return h(
57
- "div",
58
- {
59
- style: { display: "contents" },
60
- "data-element-id": element.id,
61
- "data-depth": depth,
62
- "data-parent-index": index,
63
- "data-parent-id": element.parent?.id,
64
- "data-parent-slot": element.parent?.slot
65
- },
66
- [h(LiveElementRenderer, { element })]
67
- );
68
- };
69
- }
70
- });
@@ -1,24 +0,0 @@
1
- import { defineComponent, provide, inject, type InjectionKey, type PropType } from "vue";
2
-
3
- const INDEX_KEY: InjectionKey<number> = Symbol("WebinyElementIndex");
4
-
5
- /**
6
- * Provides the sibling index of the current element to all descendants.
7
- */
8
- export const ElementIndexProvider = defineComponent({
9
- name: "WebinyElementIndexProvider",
10
-
11
- props: {
12
- index: { type: Number as PropType<number>, required: true }
13
- },
14
-
15
- setup(props, { slots }) {
16
- provide(INDEX_KEY, props.index);
17
- return () => slots.default?.();
18
- }
19
- });
20
-
21
- /** Returns the sibling index of the current element (0-based). */
22
- export const useElementIndex = (): number => {
23
- return inject(INDEX_KEY, 0);
24
- };
@@ -1,42 +0,0 @@
1
- import { defineComponent, h } from "vue";
2
- import { environment } from "@webiny/website-builder-sdk";
3
- import { EditingElementRenderer } from "./EditingElementRenderer/index.js";
4
- import { LiveElementRenderer } from "./LiveElementRenderer.js";
5
- import { useDocumentStore } from "./DocumentStoreProvider.js";
6
- import { useObservable } from "~/composables/useObservable.js";
7
- import { setElementRenderer } from "./LiveElementSlot.js";
8
-
9
- /**
10
- * Entry point for rendering a single document element by ID.
11
- *
12
- * - Retrieves the live element from the MobX DocumentStore (reactive via useObservable).
13
- * - Dispatches to EditingElementRenderer (editor mode) or LiveElementRenderer (live mode).
14
- */
15
- export const ElementRenderer = defineComponent({
16
- name: "WebinyElementRenderer",
17
-
18
- props: {
19
- id: { type: String, required: true }
20
- },
21
-
22
- setup(props) {
23
- const documentStore = useDocumentStore();
24
-
25
- // Reactively track the element in the MobX store.
26
- const element = useObservable(() => documentStore.getElement(props.id));
27
-
28
- return () => {
29
- if (!element.value) {
30
- return null;
31
- }
32
-
33
- if (environment.isEditing()) {
34
- return h(EditingElementRenderer, { element: element.value });
35
- }
36
- return h(LiveElementRenderer, { element: element.value });
37
- };
38
- }
39
- });
40
-
41
- // Break the circular dependency: LiveElementSlot needs ElementRenderer.
42
- setElementRenderer(ElementRenderer);
@@ -1,34 +0,0 @@
1
- import { defineComponent, h, type PropType } from "vue";
2
- import { environment } from "@webiny/website-builder-sdk";
3
- import { LiveElementSlot } from "./LiveElementSlot.js";
4
- import { PreviewElementSlot } from "./PreviewElementSlot.js";
5
-
6
- /**
7
- * Dispatches to PreviewElementSlot (editing mode) or LiveElementSlot (live
8
- * mode) based on the current environment.
9
- *
10
- * Used by LiveElementRenderer when resolving slot inputs so that child elements
11
- * are rendered recursively via ElementRenderer.
12
- */
13
- export const ElementSlot = defineComponent({
14
- name: "WebinyElementSlot",
15
-
16
- props: {
17
- parentId: { type: String, required: true },
18
- slot: { type: String, required: true },
19
- elements: { type: Array as PropType<string[]>, default: () => [] }
20
- },
21
-
22
- setup(props) {
23
- return () => {
24
- if (environment.isEditing()) {
25
- return h(PreviewElementSlot, {
26
- parentId: props.parentId,
27
- slot: props.slot,
28
- elements: props.elements
29
- });
30
- }
31
- return h(LiveElementSlot, { elements: props.elements });
32
- };
33
- }
34
- });
@@ -1,24 +0,0 @@
1
- import { defineComponent, provide, inject, type InjectionKey, type PropType } from "vue";
2
-
3
- const DEPTH_KEY: InjectionKey<number> = Symbol("WebinyElementSlotDepth");
4
-
5
- /**
6
- * Provides the current element-slot nesting depth to all descendants.
7
- */
8
- export const ElementSlotDepthProvider = defineComponent({
9
- name: "WebinyElementSlotDepthProvider",
10
-
11
- props: {
12
- depth: { type: Number as PropType<number>, required: true }
13
- },
14
-
15
- setup(props, { slots }) {
16
- provide(DEPTH_KEY, props.depth);
17
- return () => slots.default?.();
18
- }
19
- });
20
-
21
- /** Returns the current slot nesting depth (0 at the root). */
22
- export const useElementSlotDepth = (): number => {
23
- return inject(DEPTH_KEY, 0);
24
- };