@builder.io/sdk-svelte 4.2.1 → 4.2.3
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/lib/browser/blocks/form/form/form.svelte +4 -5
- package/lib/browser/blocks/img/component-info.js +33 -3
- package/lib/browser/blocks/img/img.svelte +18 -6
- package/lib/browser/blocks/symbol/symbol.svelte +5 -2
- package/lib/browser/blocks/symbol/symbol.svelte.d.ts +1 -1
- package/lib/browser/blocks/symbol/symbol.types.d.ts +1 -2
- package/lib/browser/blocks/tabs/tabs.svelte +5 -4
- package/lib/browser/blocks/tabs/tabs.svelte.d.ts +1 -1
- package/lib/browser/blocks/text/component-info.js +0 -1
- package/lib/browser/components/awaiter.types.d.ts +7 -0
- package/lib/browser/components/awaiter.types.js +1 -0
- package/lib/browser/components/block/block.svelte +2 -2
- package/lib/browser/components/block/components/component-ref/component-ref.svelte +8 -8
- package/lib/browser/components/block/components/component-ref/component-ref.svelte.d.ts +2 -2
- package/lib/browser/components/block/components/interactive-element.svelte +8 -1
- package/lib/browser/components/block/components/live-edit-block-styles.svelte +114 -0
- package/lib/browser/components/block/components/live-edit-block-styles.svelte.d.ts +22 -0
- package/lib/browser/components/block/components/style-wrapper.svelte +25 -0
- package/lib/browser/components/block/components/style-wrapper.svelte.d.ts +23 -0
- package/lib/browser/components/content/components/enable-editor.svelte +30 -9
- package/lib/browser/components/live-edit.svelte +20 -0
- package/lib/browser/components/live-edit.svelte.d.ts +26 -0
- package/lib/browser/constants/sdk-version.d.ts +1 -1
- package/lib/browser/constants/sdk-version.js +1 -1
- package/lib/browser/functions/get-content/generate-content-url.js +3 -8
- package/lib/browser/functions/get-content/index.js +8 -0
- package/lib/browser/helpers/find-block.d.ts +18 -0
- package/lib/browser/helpers/find-block.js +41 -0
- package/lib/browser/helpers/subscribe-to-editor.d.ts +3 -2
- package/lib/browser/helpers/subscribe-to-editor.js +4 -2
- package/lib/edge/blocks/form/form/form.svelte +4 -5
- package/lib/edge/blocks/img/component-info.js +33 -3
- package/lib/edge/blocks/img/img.svelte +18 -6
- package/lib/edge/blocks/symbol/symbol.svelte +5 -2
- package/lib/edge/blocks/symbol/symbol.svelte.d.ts +1 -1
- package/lib/edge/blocks/symbol/symbol.types.d.ts +1 -2
- package/lib/edge/blocks/tabs/tabs.svelte +5 -4
- package/lib/edge/blocks/tabs/tabs.svelte.d.ts +1 -1
- package/lib/edge/blocks/text/component-info.js +0 -1
- package/lib/edge/components/awaiter.types.d.ts +7 -0
- package/lib/edge/components/awaiter.types.js +1 -0
- package/lib/edge/components/block/block.svelte +2 -2
- package/lib/edge/components/block/components/component-ref/component-ref.svelte +8 -8
- package/lib/edge/components/block/components/component-ref/component-ref.svelte.d.ts +2 -2
- package/lib/edge/components/block/components/interactive-element.svelte +8 -1
- package/lib/edge/components/block/components/live-edit-block-styles.svelte +114 -0
- package/lib/edge/components/block/components/live-edit-block-styles.svelte.d.ts +22 -0
- package/lib/edge/components/block/components/style-wrapper.svelte +25 -0
- package/lib/edge/components/block/components/style-wrapper.svelte.d.ts +23 -0
- package/lib/edge/components/content/components/enable-editor.svelte +30 -9
- package/lib/edge/components/live-edit.svelte +20 -0
- package/lib/edge/components/live-edit.svelte.d.ts +26 -0
- package/lib/edge/constants/sdk-version.d.ts +1 -1
- package/lib/edge/constants/sdk-version.js +1 -1
- package/lib/edge/functions/get-content/generate-content-url.js +3 -8
- package/lib/edge/functions/get-content/index.js +8 -0
- package/lib/edge/helpers/find-block.d.ts +18 -0
- package/lib/edge/helpers/find-block.js +41 -0
- package/lib/edge/helpers/subscribe-to-editor.d.ts +3 -2
- package/lib/edge/helpers/subscribe-to-editor.js +4 -2
- package/lib/node/blocks/form/form/form.svelte +4 -5
- package/lib/node/blocks/img/component-info.js +33 -3
- package/lib/node/blocks/img/img.svelte +18 -6
- package/lib/node/blocks/symbol/symbol.svelte +5 -2
- package/lib/node/blocks/symbol/symbol.svelte.d.ts +1 -1
- package/lib/node/blocks/symbol/symbol.types.d.ts +1 -2
- package/lib/node/blocks/tabs/tabs.svelte +5 -4
- package/lib/node/blocks/tabs/tabs.svelte.d.ts +1 -1
- package/lib/node/blocks/text/component-info.js +0 -1
- package/lib/node/components/awaiter.types.d.ts +7 -0
- package/lib/node/components/awaiter.types.js +1 -0
- package/lib/node/components/block/block.svelte +2 -2
- package/lib/node/components/block/components/component-ref/component-ref.svelte +8 -8
- package/lib/node/components/block/components/component-ref/component-ref.svelte.d.ts +2 -2
- package/lib/node/components/block/components/interactive-element.svelte +8 -1
- package/lib/node/components/block/components/live-edit-block-styles.svelte +114 -0
- package/lib/node/components/block/components/live-edit-block-styles.svelte.d.ts +22 -0
- package/lib/node/components/block/components/style-wrapper.svelte +25 -0
- package/lib/node/components/block/components/style-wrapper.svelte.d.ts +23 -0
- package/lib/node/components/content/components/enable-editor.svelte +30 -9
- package/lib/node/components/live-edit.svelte +20 -0
- package/lib/node/components/live-edit.svelte.d.ts +26 -0
- package/lib/node/constants/sdk-version.d.ts +1 -1
- package/lib/node/constants/sdk-version.js +1 -1
- package/lib/node/functions/get-content/generate-content-url.js +3 -8
- package/lib/node/functions/get-content/index.js +8 -0
- package/lib/node/helpers/find-block.d.ts +18 -0
- package/lib/node/helpers/find-block.js +41 -0
- package/lib/node/helpers/subscribe-to-editor.d.ts +3 -2
- package/lib/node/helpers/subscribe-to-editor.js +4 -2
- package/package.json +1 -1
- package/src/blocks/form/form/form.svelte +4 -5
- package/src/blocks/img/component-info.ts +33 -3
- package/src/blocks/img/img.svelte +22 -6
- package/src/blocks/symbol/symbol.svelte +5 -2
- package/src/blocks/symbol/symbol.types.ts +1 -1
- package/src/blocks/tabs/tabs.svelte +5 -4
- package/src/blocks/text/component-info.ts +0 -1
- package/src/components/awaiter.types.ts +7 -0
- package/src/components/block/block.svelte +2 -2
- package/src/components/block/components/component-ref/component-ref.svelte +8 -10
- package/src/components/block/components/interactive-element.svelte +7 -0
- package/src/components/block/components/live-edit-block-styles.svelte +146 -0
- package/src/components/block/components/style-wrapper.svelte +41 -0
- package/src/components/content/components/enable-editor.svelte +32 -9
- package/src/components/live-edit.svelte +32 -0
- package/src/constants/sdk-version.ts +1 -1
- package/src/functions/get-content/generate-content-url.ts +3 -8
- package/src/functions/get-content/index.ts +8 -0
- package/src/helpers/find-block.ts +40 -0
- package/src/helpers/subscribe-to-editor.ts +7 -4
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
import type { SymbolProps } from "./symbol.types";
|
|
13
13
|
|
|
14
14
|
export let symbol: SymbolProps["symbol"] = undefined;
|
|
15
|
+
export let builderComponents: SymbolProps["builderComponents"];
|
|
15
16
|
export let attributes: SymbolProps["attributes"] = undefined;
|
|
16
17
|
export let dynamic: SymbolProps["dynamic"] = undefined;
|
|
17
18
|
export let builderContext: SymbolProps["builderContext"];
|
|
18
19
|
export let builderBlock: SymbolProps["builderBlock"];
|
|
19
|
-
export let builderComponents: SymbolProps["builderComponents"];
|
|
20
20
|
export let builderLinkComponent: SymbolProps["builderLinkComponent"] =
|
|
21
21
|
undefined;
|
|
22
22
|
|
|
@@ -38,6 +38,9 @@
|
|
|
38
38
|
$: contentWrapper = () => {
|
|
39
39
|
return "div";
|
|
40
40
|
};
|
|
41
|
+
$: customComponents = () => {
|
|
42
|
+
return Object.values(builderComponents);
|
|
43
|
+
};
|
|
41
44
|
$: className = () => {
|
|
42
45
|
return [
|
|
43
46
|
...[attributes[getClassPropName()]],
|
|
@@ -78,7 +81,7 @@
|
|
|
78
81
|
...$builderContext.context,
|
|
79
82
|
symbolId: builderBlock?.id,
|
|
80
83
|
}}
|
|
81
|
-
customComponents={
|
|
84
|
+
customComponents={customComponents()}
|
|
82
85
|
data={{
|
|
83
86
|
...symbol?.data,
|
|
84
87
|
...$builderContext.localState,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { BuilderContent } from '../../types/builder-content';
|
|
2
2
|
import type { BuilderComponentsProp, BuilderDataProps, BuilderLinkComponentProp } from '../../types/builder-props';
|
|
3
|
-
interface SymbolInfo {
|
|
3
|
+
export interface SymbolInfo {
|
|
4
4
|
model?: string;
|
|
5
5
|
entry?: string;
|
|
6
6
|
data?: any;
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
|
|
6
6
|
export let defaultActiveTab: TabsProps["defaultActiveTab"] = undefined;
|
|
7
7
|
export let tabs: TabsProps["tabs"];
|
|
8
|
+
export let activeTabStyle: TabsProps["activeTabStyle"] = undefined;
|
|
8
9
|
export let collapsible: TabsProps["collapsible"] = undefined;
|
|
9
10
|
export let tabHeaderLayout: TabsProps["tabHeaderLayout"] = undefined;
|
|
10
|
-
export let activeTabStyle: TabsProps["activeTabStyle"] = undefined;
|
|
11
11
|
export let builderBlock: TabsProps["builderBlock"];
|
|
12
12
|
export let builderContext: TabsProps["builderContext"];
|
|
13
13
|
export let builderComponents: TabsProps["builderComponents"];
|
|
@@ -27,6 +27,9 @@
|
|
|
27
27
|
function activeTabContent(active: number) {
|
|
28
28
|
return tabs && tabs[active].content;
|
|
29
29
|
}
|
|
30
|
+
function getTabStyle(index: number) {
|
|
31
|
+
return index === activeTab ? activeTabStyle : {};
|
|
32
|
+
}
|
|
30
33
|
function onClick(index: number) {
|
|
31
34
|
if (index === activeTab && collapsible) {
|
|
32
35
|
activeTab = -1;
|
|
@@ -50,9 +53,7 @@
|
|
|
50
53
|
>
|
|
51
54
|
{#each tabs as tab, index (index)}
|
|
52
55
|
<span
|
|
53
|
-
style={stringifyStyles(
|
|
54
|
-
...(activeTab === index ? activeTabStyle : {}),
|
|
55
|
-
})}
|
|
56
|
+
style={stringifyStyles(getTabStyle(index))}
|
|
56
57
|
class={`builder-tab-wrap ${
|
|
57
58
|
activeTab === index ? "builder-tab-active" : ""
|
|
58
59
|
}`}
|
|
@@ -7,7 +7,6 @@ export const componentInfo: ComponentInfo = {
|
|
|
7
7
|
} : {},
|
|
8
8
|
name: 'Text',
|
|
9
9
|
static: true,
|
|
10
|
-
isRSC: true,
|
|
11
10
|
image: 'https://firebasestorage.googleapis.com/v0/b/builder-3b0a2.appspot.com/o/images%2Fbaseline-text_fields-24px%20(1).svg?alt=media&token=12177b73-0ee3-42ca-98c6-0dd003de1929',
|
|
12
11
|
inputs: [{
|
|
13
12
|
name: 'text',
|
|
@@ -31,11 +31,11 @@
|
|
|
31
31
|
provideLinkComponent,
|
|
32
32
|
provideRegisteredComponents,
|
|
33
33
|
} from "./block.helpers";
|
|
34
|
-
import BlockStyles from "./components/block-styles.svelte";
|
|
35
34
|
import BlockWrapper from "./components/block-wrapper.svelte";
|
|
36
35
|
import type { ComponentProps } from "./components/component-ref/component-ref.helpers";
|
|
37
36
|
import ComponentRef from "./components/component-ref/component-ref.svelte";
|
|
38
37
|
import RepeatedBlock from "./components/repeated-block.svelte";
|
|
38
|
+
import StyleWrapper from "./components/style-wrapper.svelte";
|
|
39
39
|
import type { Writable } from "svelte/store";
|
|
40
40
|
|
|
41
41
|
export let block: BlockProps["block"];
|
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
</script>
|
|
149
149
|
|
|
150
150
|
{#if canShowBlock()}
|
|
151
|
-
<
|
|
151
|
+
<StyleWrapper block={processedBlock()} context={$context} id={block.id} />
|
|
152
152
|
|
|
153
153
|
{#if !blockComponent?.()?.noWrap}
|
|
154
154
|
{#if !repeatItem()}
|
|
@@ -5,22 +5,18 @@
|
|
|
5
5
|
import type { ComponentProps } from "./component-ref.helpers";
|
|
6
6
|
import { getWrapperProps } from "./component-ref.helpers";
|
|
7
7
|
|
|
8
|
-
export let componentOptions: ComponentProps["componentOptions"];
|
|
9
|
-
export let blockChildren: ComponentProps["blockChildren"];
|
|
10
8
|
export let isInteractive: ComponentProps["isInteractive"];
|
|
11
9
|
export let componentRef: ComponentProps["componentRef"];
|
|
10
|
+
export let componentOptions: ComponentProps["componentOptions"];
|
|
12
11
|
export let builderBlock: ComponentProps["builderBlock"];
|
|
13
12
|
export let context: ComponentProps["context"];
|
|
14
13
|
export let linkComponent: ComponentProps["linkComponent"];
|
|
15
14
|
export let includeBlockProps: ComponentProps["includeBlockProps"];
|
|
15
|
+
export let blockChildren: ComponentProps["blockChildren"];
|
|
16
16
|
export let registeredComponents: ComponentProps["registeredComponents"];
|
|
17
17
|
|
|
18
18
|
let shouldUpdate = false;
|
|
19
19
|
let Wrapper = isInteractive ? InteractiveElement : componentRef;
|
|
20
|
-
|
|
21
|
-
function onUpdateFn_0(..._args: any[]) {}
|
|
22
|
-
|
|
23
|
-
$: onUpdateFn_0(...[componentOptions, blockChildren]);
|
|
24
20
|
</script>
|
|
25
21
|
|
|
26
22
|
{#if componentRef}
|
|
@@ -37,8 +33,10 @@
|
|
|
37
33
|
contextValue: $context,
|
|
38
34
|
})}
|
|
39
35
|
>
|
|
40
|
-
{#
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
{#if componentRef}
|
|
37
|
+
{#each blockChildren as child (child.id)}
|
|
38
|
+
<Block block={child} {context} {registeredComponents} {linkComponent} />
|
|
39
|
+
{/each}
|
|
40
|
+
{/if}</svelte:component
|
|
41
|
+
>
|
|
44
42
|
{/if}
|
|
@@ -10,12 +10,15 @@
|
|
|
10
10
|
</script>
|
|
11
11
|
|
|
12
12
|
<script lang="ts">
|
|
13
|
+
import { TARGET } from "../../../constants/target";
|
|
13
14
|
import type { BuilderContextInterface } from "../../../context/types";
|
|
14
15
|
import { getBlockActions } from "../../../functions/get-block-actions";
|
|
15
16
|
import { getBlockProperties } from "../../../functions/get-block-properties";
|
|
17
|
+
import { isEditing } from "../../../server-index";
|
|
16
18
|
import type { BuilderBlock } from "../../../types/builder-block";
|
|
17
19
|
import type { Dictionary } from "../../../types/typescript";
|
|
18
20
|
import Awaiter from "../../awaiter.svelte";
|
|
21
|
+
import LiveEdit from "../../live-edit.svelte";
|
|
19
22
|
import type { Writable } from "svelte/store";
|
|
20
23
|
|
|
21
24
|
export let wrapperProps: InteractiveElementProps["wrapperProps"];
|
|
@@ -59,6 +62,10 @@
|
|
|
59
62
|
props={wrapperProps}
|
|
60
63
|
attributes={attributes()}><slot /></Awaiter
|
|
61
64
|
>
|
|
65
|
+
{:else if TARGET === "rsc" && isEditing()}
|
|
66
|
+
<LiveEdit {Wrapper} id={block.id || ""} attributes={attributes()}
|
|
67
|
+
><slot /></LiveEdit
|
|
68
|
+
>
|
|
62
69
|
{:else}
|
|
63
70
|
<svelte:component
|
|
64
71
|
this={Wrapper}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
<script context="module" lang="ts">
|
|
2
|
+
type LiveEditBlockStylesProps = {
|
|
3
|
+
id?: any;
|
|
4
|
+
contextProvider: BuilderContextInterface;
|
|
5
|
+
};
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<script lang="ts">
|
|
9
|
+
import {
|
|
10
|
+
getMaxWidthQueryForSize,
|
|
11
|
+
getSizesForBreakpoints,
|
|
12
|
+
} from "../../../constants/device-sizes";
|
|
13
|
+
import { TARGET } from "../../../constants/target";
|
|
14
|
+
import { camelToKebabCase } from "../../../functions/camel-to-kebab-case";
|
|
15
|
+
import { getProcessedBlock } from "../../../functions/get-processed-block";
|
|
16
|
+
import { createCssClass } from "../../../helpers/css";
|
|
17
|
+
import { findBlockById } from "../../../helpers/find-block";
|
|
18
|
+
import { checkIsDefined } from "../../../helpers/nullable";
|
|
19
|
+
import type {
|
|
20
|
+
BuilderBlock,
|
|
21
|
+
BuilderContextInterface,
|
|
22
|
+
} from "../../../server-index";
|
|
23
|
+
import InlinedStyles from "../../inlined-styles.svelte";
|
|
24
|
+
|
|
25
|
+
export let contextProvider: LiveEditBlockStylesProps["contextProvider"];
|
|
26
|
+
export let id: LiveEditBlockStylesProps["id"] = undefined;
|
|
27
|
+
|
|
28
|
+
$: block = () => {
|
|
29
|
+
return findBlockById(contextProvider.content!, id);
|
|
30
|
+
};
|
|
31
|
+
$: processedBlock = () => {
|
|
32
|
+
const foundBlock = block();
|
|
33
|
+
if (!foundBlock) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const blockToUse = foundBlock.repeat?.collection
|
|
37
|
+
? foundBlock
|
|
38
|
+
: getProcessedBlock({
|
|
39
|
+
block: foundBlock,
|
|
40
|
+
localState: contextProvider.localState,
|
|
41
|
+
rootState: contextProvider.rootState,
|
|
42
|
+
rootSetState: contextProvider.rootSetState,
|
|
43
|
+
context: contextProvider.context,
|
|
44
|
+
});
|
|
45
|
+
return blockToUse;
|
|
46
|
+
};
|
|
47
|
+
$: canShowBlock = () => {
|
|
48
|
+
if (checkIsDefined(processedBlock?.()?.hide)) {
|
|
49
|
+
return !processedBlock?.()?.hide;
|
|
50
|
+
}
|
|
51
|
+
if (checkIsDefined(processedBlock?.()?.show)) {
|
|
52
|
+
return processedBlock?.()?.show;
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
};
|
|
56
|
+
$: css = () => {
|
|
57
|
+
const styles = processedBlock?.()?.responsiveStyles;
|
|
58
|
+
const content = contextProvider.content;
|
|
59
|
+
const sizesWithUpdatedBreakpoints = getSizesForBreakpoints(
|
|
60
|
+
content?.meta?.breakpoints || {}
|
|
61
|
+
);
|
|
62
|
+
const contentHasXSmallBreakpoint = Boolean(
|
|
63
|
+
content?.meta?.breakpoints?.xsmall
|
|
64
|
+
);
|
|
65
|
+
const largeStyles = styles?.large;
|
|
66
|
+
const mediumStyles = styles?.medium;
|
|
67
|
+
const smallStyles = styles?.small;
|
|
68
|
+
const xsmallStyles = styles?.xsmall;
|
|
69
|
+
const className = processedBlock?.()?.id;
|
|
70
|
+
if (!className) {
|
|
71
|
+
return "";
|
|
72
|
+
}
|
|
73
|
+
const largeStylesClass = largeStyles
|
|
74
|
+
? createCssClass({
|
|
75
|
+
className,
|
|
76
|
+
styles: largeStyles,
|
|
77
|
+
})
|
|
78
|
+
: "";
|
|
79
|
+
const mediumStylesClass = mediumStyles
|
|
80
|
+
? createCssClass({
|
|
81
|
+
className,
|
|
82
|
+
styles: mediumStyles,
|
|
83
|
+
mediaQuery: getMaxWidthQueryForSize(
|
|
84
|
+
"medium",
|
|
85
|
+
sizesWithUpdatedBreakpoints
|
|
86
|
+
),
|
|
87
|
+
})
|
|
88
|
+
: "";
|
|
89
|
+
const smallStylesClass = smallStyles
|
|
90
|
+
? createCssClass({
|
|
91
|
+
className,
|
|
92
|
+
styles: smallStyles,
|
|
93
|
+
mediaQuery: getMaxWidthQueryForSize(
|
|
94
|
+
"small",
|
|
95
|
+
sizesWithUpdatedBreakpoints
|
|
96
|
+
),
|
|
97
|
+
})
|
|
98
|
+
: "";
|
|
99
|
+
const xsmallStylesClass =
|
|
100
|
+
xsmallStyles && contentHasXSmallBreakpoint
|
|
101
|
+
? createCssClass({
|
|
102
|
+
className,
|
|
103
|
+
styles: xsmallStyles,
|
|
104
|
+
mediaQuery: getMaxWidthQueryForSize(
|
|
105
|
+
"xsmall",
|
|
106
|
+
sizesWithUpdatedBreakpoints
|
|
107
|
+
),
|
|
108
|
+
})
|
|
109
|
+
: "";
|
|
110
|
+
const hoverAnimation =
|
|
111
|
+
processedBlock().animations &&
|
|
112
|
+
processedBlock().animations.find((item) => item.trigger === "hover");
|
|
113
|
+
let hoverStylesClass = "";
|
|
114
|
+
if (hoverAnimation) {
|
|
115
|
+
const hoverStyles = hoverAnimation.steps?.[1]?.styles || {};
|
|
116
|
+
hoverStylesClass =
|
|
117
|
+
createCssClass({
|
|
118
|
+
className: `${className}:hover`,
|
|
119
|
+
styles: {
|
|
120
|
+
...hoverStyles,
|
|
121
|
+
transition: `all ${hoverAnimation.duration}s ${camelToKebabCase(
|
|
122
|
+
hoverAnimation.easing
|
|
123
|
+
)}`,
|
|
124
|
+
transitionDelay: hoverAnimation.delay
|
|
125
|
+
? `${hoverAnimation.delay}s`
|
|
126
|
+
: "0s",
|
|
127
|
+
},
|
|
128
|
+
}) || "";
|
|
129
|
+
}
|
|
130
|
+
return [
|
|
131
|
+
largeStylesClass,
|
|
132
|
+
mediumStylesClass,
|
|
133
|
+
smallStylesClass,
|
|
134
|
+
xsmallStylesClass,
|
|
135
|
+
hoverStylesClass,
|
|
136
|
+
].join(" ");
|
|
137
|
+
};
|
|
138
|
+
</script>
|
|
139
|
+
|
|
140
|
+
{#if TARGET === "rsc" && css() && canShowBlock()}
|
|
141
|
+
<InlinedStyles
|
|
142
|
+
id="builderio-block"
|
|
143
|
+
styles={css()}
|
|
144
|
+
nonce={contextProvider.nonce}
|
|
145
|
+
/>
|
|
146
|
+
{/if}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<script context="module" lang="ts">
|
|
2
|
+
type StyleWrapperProps = {
|
|
3
|
+
block: BuilderBlock;
|
|
4
|
+
context: BuilderContextInterface;
|
|
5
|
+
id?: string;
|
|
6
|
+
};
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<script lang="ts">
|
|
10
|
+
import { getContext, onMount } from "svelte";
|
|
11
|
+
|
|
12
|
+
import { TARGET } from "../../../constants/target";
|
|
13
|
+
import { BuilderContext } from "../../../context/index";
|
|
14
|
+
import {
|
|
15
|
+
isEditing,
|
|
16
|
+
BuilderBlock,
|
|
17
|
+
BuilderContextInterface,
|
|
18
|
+
} from "../../../server-index";
|
|
19
|
+
import BlockStyles from "./block-styles.svelte";
|
|
20
|
+
import LiveEditBlockStyles from "./live-edit-block-styles.svelte";
|
|
21
|
+
|
|
22
|
+
export let block: StyleWrapperProps["block"];
|
|
23
|
+
export let context: StyleWrapperProps["context"];
|
|
24
|
+
|
|
25
|
+
let contextProvider = getContext(BuilderContext.key);
|
|
26
|
+
|
|
27
|
+
let isClientEditing = false;
|
|
28
|
+
let isHydrated = false;
|
|
29
|
+
|
|
30
|
+
onMount(() => {});
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
{#if isHydrated}
|
|
34
|
+
{#if TARGET === "rsc" && isClientEditing}
|
|
35
|
+
<LiveEditBlockStyles id={block.id} contextProvider={$contextProvider} />
|
|
36
|
+
{:else}
|
|
37
|
+
<BlockStyles {block} {context} />
|
|
38
|
+
{/if}
|
|
39
|
+
{:else}
|
|
40
|
+
<BlockStyles {block} {context} />
|
|
41
|
+
{/if}
|
|
@@ -53,7 +53,10 @@
|
|
|
53
53
|
import { getDefaultCanTrack } from "../../../helpers/canTrack";
|
|
54
54
|
import { getCookieSync } from "../../../helpers/cookie";
|
|
55
55
|
import { postPreviewContent } from "../../../helpers/preview-lru-cache/set";
|
|
56
|
-
import {
|
|
56
|
+
import {
|
|
57
|
+
createEditorListener,
|
|
58
|
+
EditType,
|
|
59
|
+
} from "../../../helpers/subscribe-to-editor";
|
|
57
60
|
import { setupBrowserForEditing } from "../../../scripts/init-editing";
|
|
58
61
|
import type { BuilderContent } from "../../../types/builder-content";
|
|
59
62
|
import type { ComponentInfo } from "../../../types/components";
|
|
@@ -96,7 +99,7 @@
|
|
|
96
99
|
return styles;
|
|
97
100
|
}
|
|
98
101
|
|
|
99
|
-
function mergeNewRootState(newData: Dictionary<any
|
|
102
|
+
function mergeNewRootState(newData: Dictionary<any>, editType?: EditType) {
|
|
100
103
|
const combinedState = {
|
|
101
104
|
...$builderContextSignal.rootState,
|
|
102
105
|
...newData,
|
|
@@ -106,8 +109,13 @@
|
|
|
106
109
|
} else {
|
|
107
110
|
$builderContextSignal.rootState = combinedState;
|
|
108
111
|
}
|
|
112
|
+
if ($builderContextSignal.rootSetState) {
|
|
113
|
+
$builderContextSignal.rootSetState(combinedState);
|
|
114
|
+
} else {
|
|
115
|
+
$builderContextSignal.rootState = combinedState;
|
|
116
|
+
}
|
|
109
117
|
}
|
|
110
|
-
function mergeNewContent(newContent: BuilderContent) {
|
|
118
|
+
function mergeNewContent(newContent: BuilderContent, editType?: EditType) {
|
|
111
119
|
const newContentValue = {
|
|
112
120
|
...$builderContextSignal.content,
|
|
113
121
|
...newContent,
|
|
@@ -146,11 +154,11 @@
|
|
|
146
154
|
animation: (animation) => {
|
|
147
155
|
triggerAnimation(animation);
|
|
148
156
|
},
|
|
149
|
-
contentUpdate: (newContent) => {
|
|
150
|
-
mergeNewContent(newContent);
|
|
157
|
+
contentUpdate: (newContent, editType) => {
|
|
158
|
+
mergeNewContent(newContent, editType);
|
|
151
159
|
},
|
|
152
|
-
stateUpdate: (newState) => {
|
|
153
|
-
mergeNewRootState(newState);
|
|
160
|
+
stateUpdate: (newState, editType) => {
|
|
161
|
+
mergeNewRootState(newState, editType);
|
|
154
162
|
},
|
|
155
163
|
},
|
|
156
164
|
})(event);
|
|
@@ -219,11 +227,15 @@
|
|
|
219
227
|
method: "GET",
|
|
220
228
|
};
|
|
221
229
|
logFetch(JSON.stringify(fetchRequestObj));
|
|
222
|
-
|
|
230
|
+
const fetchOptions = {
|
|
223
231
|
method: fetchRequestObj.method,
|
|
224
232
|
headers: fetchRequestObj.headers,
|
|
225
233
|
body: fetchRequestObj.body,
|
|
226
|
-
}
|
|
234
|
+
};
|
|
235
|
+
if (fetchRequestObj.method === "GET") {
|
|
236
|
+
delete fetchOptions.body;
|
|
237
|
+
}
|
|
238
|
+
fetch(fetchRequestObj.url, fetchOptions)
|
|
227
239
|
.then((response) => response.json())
|
|
228
240
|
.then((json) => {
|
|
229
241
|
mergeNewRootState({
|
|
@@ -352,6 +364,9 @@
|
|
|
352
364
|
let elementRef;
|
|
353
365
|
|
|
354
366
|
let hasExecuted = false;
|
|
367
|
+
let contextValue = $builderContextSignal;
|
|
368
|
+
let prevData = null;
|
|
369
|
+
let prevLocale = "";
|
|
355
370
|
let ContentWrapper = contentWrapper || "div";
|
|
356
371
|
let httpReqsData = {};
|
|
357
372
|
let httpReqsPending = {};
|
|
@@ -416,7 +431,11 @@
|
|
|
416
431
|
|
|
417
432
|
function onUpdateFn_2(..._args: any[]) {
|
|
418
433
|
if (data) {
|
|
434
|
+
if (prevData === data) {
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
419
437
|
mergeNewRootState(data);
|
|
438
|
+
prevData = data;
|
|
420
439
|
}
|
|
421
440
|
}
|
|
422
441
|
|
|
@@ -424,9 +443,13 @@
|
|
|
424
443
|
|
|
425
444
|
function onUpdateFn_3(..._args: any[]) {
|
|
426
445
|
if (locale) {
|
|
446
|
+
if (prevLocale === locale) {
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
427
449
|
mergeNewRootState({
|
|
428
450
|
locale: locale,
|
|
429
451
|
});
|
|
452
|
+
prevLocale = locale;
|
|
430
453
|
}
|
|
431
454
|
}
|
|
432
455
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<script context="module" lang="ts">
|
|
2
|
+
type LiveEditProps = {
|
|
3
|
+
children?: any;
|
|
4
|
+
id?: any;
|
|
5
|
+
Wrapper?: any;
|
|
6
|
+
attributes?: any;
|
|
7
|
+
};
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<script lang="ts">
|
|
11
|
+
import { getContext } from "svelte";
|
|
12
|
+
|
|
13
|
+
import { BuilderContext } from "../context/index";
|
|
14
|
+
import { findBlockById } from "../helpers/find-block";
|
|
15
|
+
|
|
16
|
+
export let id: LiveEditProps["id"] = undefined;
|
|
17
|
+
export let attributes: LiveEditProps["attributes"] = undefined;
|
|
18
|
+
export let Wrapper: LiveEditProps["Wrapper"] = undefined;
|
|
19
|
+
|
|
20
|
+
let context = getContext(BuilderContext.key);
|
|
21
|
+
|
|
22
|
+
$: block = () => {
|
|
23
|
+
return findBlockById($context.content!, id);
|
|
24
|
+
};
|
|
25
|
+
$: options = () => {
|
|
26
|
+
return block?.()?.component?.options || {};
|
|
27
|
+
};
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<svelte:component this={Wrapper} {...options()} {attributes}
|
|
31
|
+
><slot /></svelte:component
|
|
32
|
+
>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const SDK_VERSION = "4.2.
|
|
1
|
+
export const SDK_VERSION = "4.2.3"
|
|
@@ -39,15 +39,10 @@ export const generateContentUrl = (options: GetContentOptions): URL => {
|
|
|
39
39
|
url.searchParams.set('limit', String(limit));
|
|
40
40
|
url.searchParams.set('noTraverse', String(noTraverse));
|
|
41
41
|
url.searchParams.set('includeRefs', String(true));
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (finalLocale) {
|
|
45
|
-
url.searchParams.set('locale', finalLocale);
|
|
46
|
-
finalUserAttributes = {
|
|
47
|
-
locale: finalLocale,
|
|
48
|
-
...finalUserAttributes
|
|
49
|
-
};
|
|
42
|
+
if (locale) {
|
|
43
|
+
url.searchParams.set('locale', locale);
|
|
50
44
|
}
|
|
45
|
+
let finalUserAttributes: Record<string, any> = userAttributes || {};
|
|
51
46
|
if (enrich) url.searchParams.set('enrich', String(enrich));
|
|
52
47
|
url.searchParams.set('omit', omit ?? 'meta.componentsUsed');
|
|
53
48
|
if (fields) {
|
|
@@ -15,6 +15,14 @@ const checkContentHasResults = (content: ContentResponse): content is ContentRes
|
|
|
15
15
|
* Returns the first content entry that matches the given options.
|
|
16
16
|
*/
|
|
17
17
|
export async function fetchOneEntry(options: GetContentOptions): Promise<BuilderContent | null> {
|
|
18
|
+
const finalLocale = options.locale || options.userAttributes?.locale;
|
|
19
|
+
if (finalLocale) {
|
|
20
|
+
options.locale = finalLocale;
|
|
21
|
+
options.userAttributes = {
|
|
22
|
+
locale: finalLocale,
|
|
23
|
+
...options.userAttributes
|
|
24
|
+
};
|
|
25
|
+
}
|
|
18
26
|
const allContent = await fetchEntries({
|
|
19
27
|
...options,
|
|
20
28
|
limit: 1
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { BuilderBlock, BuilderContent } from '../server-index';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Recursively searches for a block by ID.
|
|
5
|
+
*
|
|
6
|
+
* @param content The Builder content to search through.
|
|
7
|
+
* @param id The ID of the block to search for.
|
|
8
|
+
* @returns The block if found, otherwise null.
|
|
9
|
+
*/
|
|
10
|
+
export const findBlockById = (content: BuilderContent, id: string): BuilderBlock | null => {
|
|
11
|
+
return findBlockInTree(content.data?.blocks, id);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Helper function to recursively search through block tree.
|
|
16
|
+
*
|
|
17
|
+
* @param blocks The blocks to search through.
|
|
18
|
+
* @param id The ID of the block to search for.
|
|
19
|
+
* @returns The block if found, otherwise null.
|
|
20
|
+
* @private This is an internal implementation detail.
|
|
21
|
+
*/
|
|
22
|
+
export const findBlockInTree = (blocks: BuilderBlock[] | undefined, id: string): BuilderBlock | null => {
|
|
23
|
+
if (!blocks) return null;
|
|
24
|
+
for (const block of blocks) {
|
|
25
|
+
if (block.id === id) return block;
|
|
26
|
+
if (block.children) {
|
|
27
|
+
const child = findBlockInTree(block.children, id);
|
|
28
|
+
if (child) return child;
|
|
29
|
+
}
|
|
30
|
+
if (block.component?.name === 'Columns' && block.component?.options?.columns) {
|
|
31
|
+
for (const column of block.component.options.columns) {
|
|
32
|
+
if (column.blocks) {
|
|
33
|
+
const child = findBlockInTree(column.blocks, id);
|
|
34
|
+
if (child) return child;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
@@ -6,10 +6,11 @@ import type { BuilderAnimation } from '../types/builder-block';
|
|
|
6
6
|
import type { BuilderContent } from '../types/builder-content';
|
|
7
7
|
import type { Dictionary } from '../types/typescript';
|
|
8
8
|
import { logger } from './logger';
|
|
9
|
+
export type EditType = 'client' | 'server' | undefined;
|
|
9
10
|
type ContentListener = Required<Pick<ContentProps, 'model' | 'trustedHosts'>> & {
|
|
10
11
|
callbacks: {
|
|
11
|
-
contentUpdate: (updatedContent: BuilderContent) => void;
|
|
12
|
-
stateUpdate: (newState: Dictionary<string
|
|
12
|
+
contentUpdate: (updatedContent: BuilderContent, editType?: EditType) => void;
|
|
13
|
+
stateUpdate: (newState: Dictionary<string>, editType?: EditType) => void;
|
|
13
14
|
animation: (updatedContent: BuilderAnimation) => void;
|
|
14
15
|
configureSdk: (updatedContent: any) => void;
|
|
15
16
|
};
|
|
@@ -43,8 +44,9 @@ export const createEditorListener = ({
|
|
|
43
44
|
const messageContent = data.data;
|
|
44
45
|
const modelName = messageContent.model;
|
|
45
46
|
const newState = messageContent?.state;
|
|
47
|
+
const editType = messageContent.editType;
|
|
46
48
|
if (modelName === model && newState) {
|
|
47
|
-
callbacks.stateUpdate(newState);
|
|
49
|
+
callbacks.stateUpdate(newState, editType);
|
|
48
50
|
}
|
|
49
51
|
break;
|
|
50
52
|
}
|
|
@@ -53,8 +55,9 @@ export const createEditorListener = ({
|
|
|
53
55
|
const messageContent = data.data;
|
|
54
56
|
const key = messageContent.key || messageContent.alias || messageContent.entry || messageContent.modelName;
|
|
55
57
|
const contentData = messageContent.data;
|
|
58
|
+
const editType = messageContent.editType;
|
|
56
59
|
if (key === model) {
|
|
57
|
-
callbacks.contentUpdate(contentData);
|
|
60
|
+
callbacks.contentUpdate(contentData, editType);
|
|
58
61
|
}
|
|
59
62
|
break;
|
|
60
63
|
}
|