@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
|
@@ -2,14 +2,14 @@ import { SvelteComponent } from "svelte";
|
|
|
2
2
|
import type { ComponentProps } from "./component-ref.helpers";
|
|
3
3
|
declare const __propDef: {
|
|
4
4
|
props: {
|
|
5
|
-
componentOptions: ComponentProps["componentOptions"];
|
|
6
|
-
blockChildren: ComponentProps["blockChildren"];
|
|
7
5
|
isInteractive: ComponentProps["isInteractive"];
|
|
8
6
|
componentRef: ComponentProps["componentRef"];
|
|
7
|
+
componentOptions: ComponentProps["componentOptions"];
|
|
9
8
|
builderBlock: ComponentProps["builderBlock"];
|
|
10
9
|
context: ComponentProps["context"];
|
|
11
10
|
linkComponent: ComponentProps["linkComponent"];
|
|
12
11
|
includeBlockProps: ComponentProps["includeBlockProps"];
|
|
12
|
+
blockChildren: ComponentProps["blockChildren"];
|
|
13
13
|
registeredComponents: ComponentProps["registeredComponents"];
|
|
14
14
|
};
|
|
15
15
|
events: {
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
<script context="module"></script>
|
|
2
2
|
|
|
3
|
-
<script>import {
|
|
3
|
+
<script>import { TARGET } from "../../../constants/target";
|
|
4
|
+
import { getBlockActions } from "../../../functions/get-block-actions";
|
|
4
5
|
import { getBlockProperties } from "../../../functions/get-block-properties";
|
|
6
|
+
import { isEditing } from "../../../server-index";
|
|
5
7
|
import Awaiter from "../../awaiter.svelte";
|
|
8
|
+
import LiveEdit from "../../live-edit.svelte";
|
|
6
9
|
export let wrapperProps;
|
|
7
10
|
export let block;
|
|
8
11
|
export let includeBlockProps;
|
|
@@ -40,6 +43,10 @@ $: onUpdateFn_0(...[wrapperProps, block?.component?.options]);
|
|
|
40
43
|
props={wrapperProps}
|
|
41
44
|
attributes={attributes()}><slot /></Awaiter
|
|
42
45
|
>
|
|
46
|
+
{:else if TARGET === "rsc" && isEditing()}
|
|
47
|
+
<LiveEdit {Wrapper} id={block.id || ""} attributes={attributes()}
|
|
48
|
+
><slot /></LiveEdit
|
|
49
|
+
>
|
|
43
50
|
{:else}
|
|
44
51
|
<svelte:component
|
|
45
52
|
this={Wrapper}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
<script context="module"></script>
|
|
2
|
+
|
|
3
|
+
<script>import { getMaxWidthQueryForSize, getSizesForBreakpoints, } from "../../../constants/device-sizes";
|
|
4
|
+
import { TARGET } from "../../../constants/target";
|
|
5
|
+
import { camelToKebabCase } from "../../../functions/camel-to-kebab-case";
|
|
6
|
+
import { getProcessedBlock } from "../../../functions/get-processed-block";
|
|
7
|
+
import { createCssClass } from "../../../helpers/css";
|
|
8
|
+
import { findBlockById } from "../../../helpers/find-block";
|
|
9
|
+
import { checkIsDefined } from "../../../helpers/nullable";
|
|
10
|
+
import InlinedStyles from "../../inlined-styles.svelte";
|
|
11
|
+
export let contextProvider;
|
|
12
|
+
export let id = undefined;
|
|
13
|
+
$: block = () => {
|
|
14
|
+
return findBlockById(contextProvider.content, id);
|
|
15
|
+
};
|
|
16
|
+
$: processedBlock = () => {
|
|
17
|
+
const foundBlock = block();
|
|
18
|
+
if (!foundBlock) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const blockToUse = foundBlock.repeat?.collection
|
|
22
|
+
? foundBlock
|
|
23
|
+
: getProcessedBlock({
|
|
24
|
+
block: foundBlock,
|
|
25
|
+
localState: contextProvider.localState,
|
|
26
|
+
rootState: contextProvider.rootState,
|
|
27
|
+
rootSetState: contextProvider.rootSetState,
|
|
28
|
+
context: contextProvider.context,
|
|
29
|
+
});
|
|
30
|
+
return blockToUse;
|
|
31
|
+
};
|
|
32
|
+
$: canShowBlock = () => {
|
|
33
|
+
if (checkIsDefined(processedBlock?.()?.hide)) {
|
|
34
|
+
return !processedBlock?.()?.hide;
|
|
35
|
+
}
|
|
36
|
+
if (checkIsDefined(processedBlock?.()?.show)) {
|
|
37
|
+
return processedBlock?.()?.show;
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
};
|
|
41
|
+
$: css = () => {
|
|
42
|
+
const styles = processedBlock?.()?.responsiveStyles;
|
|
43
|
+
const content = contextProvider.content;
|
|
44
|
+
const sizesWithUpdatedBreakpoints = getSizesForBreakpoints(content?.meta?.breakpoints || {});
|
|
45
|
+
const contentHasXSmallBreakpoint = Boolean(content?.meta?.breakpoints?.xsmall);
|
|
46
|
+
const largeStyles = styles?.large;
|
|
47
|
+
const mediumStyles = styles?.medium;
|
|
48
|
+
const smallStyles = styles?.small;
|
|
49
|
+
const xsmallStyles = styles?.xsmall;
|
|
50
|
+
const className = processedBlock?.()?.id;
|
|
51
|
+
if (!className) {
|
|
52
|
+
return "";
|
|
53
|
+
}
|
|
54
|
+
const largeStylesClass = largeStyles
|
|
55
|
+
? createCssClass({
|
|
56
|
+
className,
|
|
57
|
+
styles: largeStyles,
|
|
58
|
+
})
|
|
59
|
+
: "";
|
|
60
|
+
const mediumStylesClass = mediumStyles
|
|
61
|
+
? createCssClass({
|
|
62
|
+
className,
|
|
63
|
+
styles: mediumStyles,
|
|
64
|
+
mediaQuery: getMaxWidthQueryForSize("medium", sizesWithUpdatedBreakpoints),
|
|
65
|
+
})
|
|
66
|
+
: "";
|
|
67
|
+
const smallStylesClass = smallStyles
|
|
68
|
+
? createCssClass({
|
|
69
|
+
className,
|
|
70
|
+
styles: smallStyles,
|
|
71
|
+
mediaQuery: getMaxWidthQueryForSize("small", sizesWithUpdatedBreakpoints),
|
|
72
|
+
})
|
|
73
|
+
: "";
|
|
74
|
+
const xsmallStylesClass = xsmallStyles && contentHasXSmallBreakpoint
|
|
75
|
+
? createCssClass({
|
|
76
|
+
className,
|
|
77
|
+
styles: xsmallStyles,
|
|
78
|
+
mediaQuery: getMaxWidthQueryForSize("xsmall", sizesWithUpdatedBreakpoints),
|
|
79
|
+
})
|
|
80
|
+
: "";
|
|
81
|
+
const hoverAnimation = processedBlock().animations &&
|
|
82
|
+
processedBlock().animations.find((item) => item.trigger === "hover");
|
|
83
|
+
let hoverStylesClass = "";
|
|
84
|
+
if (hoverAnimation) {
|
|
85
|
+
const hoverStyles = hoverAnimation.steps?.[1]?.styles || {};
|
|
86
|
+
hoverStylesClass =
|
|
87
|
+
createCssClass({
|
|
88
|
+
className: `${className}:hover`,
|
|
89
|
+
styles: {
|
|
90
|
+
...hoverStyles,
|
|
91
|
+
transition: `all ${hoverAnimation.duration}s ${camelToKebabCase(hoverAnimation.easing)}`,
|
|
92
|
+
transitionDelay: hoverAnimation.delay
|
|
93
|
+
? `${hoverAnimation.delay}s`
|
|
94
|
+
: "0s",
|
|
95
|
+
},
|
|
96
|
+
}) || "";
|
|
97
|
+
}
|
|
98
|
+
return [
|
|
99
|
+
largeStylesClass,
|
|
100
|
+
mediumStylesClass,
|
|
101
|
+
smallStylesClass,
|
|
102
|
+
xsmallStylesClass,
|
|
103
|
+
hoverStylesClass,
|
|
104
|
+
].join(" ");
|
|
105
|
+
};
|
|
106
|
+
</script>
|
|
107
|
+
|
|
108
|
+
{#if TARGET === "rsc" && css() && canShowBlock()}
|
|
109
|
+
<InlinedStyles
|
|
110
|
+
id="builderio-block"
|
|
111
|
+
styles={css()}
|
|
112
|
+
nonce={contextProvider.nonce}
|
|
113
|
+
/>
|
|
114
|
+
{/if}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
|
2
|
+
type LiveEditBlockStylesProps = {
|
|
3
|
+
id?: any;
|
|
4
|
+
contextProvider: BuilderContextInterface;
|
|
5
|
+
};
|
|
6
|
+
import type { BuilderContextInterface } from "../../../server-index";
|
|
7
|
+
declare const __propDef: {
|
|
8
|
+
props: {
|
|
9
|
+
contextProvider: LiveEditBlockStylesProps["contextProvider"];
|
|
10
|
+
id?: LiveEditBlockStylesProps["id"];
|
|
11
|
+
};
|
|
12
|
+
events: {
|
|
13
|
+
[evt: string]: CustomEvent<any>;
|
|
14
|
+
};
|
|
15
|
+
slots: {};
|
|
16
|
+
};
|
|
17
|
+
type LiveEditBlockStylesProps_ = typeof __propDef.props;
|
|
18
|
+
export { LiveEditBlockStylesProps_ as LiveEditBlockStylesProps };
|
|
19
|
+
export type LiveEditBlockStylesEvents = typeof __propDef.events;
|
|
20
|
+
export type LiveEditBlockStylesSlots = typeof __propDef.slots;
|
|
21
|
+
export default class LiveEditBlockStyles extends SvelteComponent<LiveEditBlockStylesProps, LiveEditBlockStylesEvents, LiveEditBlockStylesSlots> {
|
|
22
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script context="module"></script>
|
|
2
|
+
|
|
3
|
+
<script>import { getContext, onMount } from "svelte";
|
|
4
|
+
import { TARGET } from "../../../constants/target";
|
|
5
|
+
import { BuilderContext } from "../../../context/index";
|
|
6
|
+
import "../../../server-index";
|
|
7
|
+
import BlockStyles from "./block-styles.svelte";
|
|
8
|
+
import LiveEditBlockStyles from "./live-edit-block-styles.svelte";
|
|
9
|
+
export let block;
|
|
10
|
+
export let context;
|
|
11
|
+
let contextProvider = getContext(BuilderContext.key);
|
|
12
|
+
let isClientEditing = false;
|
|
13
|
+
let isHydrated = false;
|
|
14
|
+
onMount(() => { });
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
{#if isHydrated}
|
|
18
|
+
{#if TARGET === "rsc" && isClientEditing}
|
|
19
|
+
<LiveEditBlockStyles id={block.id} contextProvider={$contextProvider} />
|
|
20
|
+
{:else}
|
|
21
|
+
<BlockStyles {block} {context} />
|
|
22
|
+
{/if}
|
|
23
|
+
{:else}
|
|
24
|
+
<BlockStyles {block} {context} />
|
|
25
|
+
{/if}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
|
2
|
+
type StyleWrapperProps = {
|
|
3
|
+
block: BuilderBlock;
|
|
4
|
+
context: BuilderContextInterface;
|
|
5
|
+
id?: string;
|
|
6
|
+
};
|
|
7
|
+
import { BuilderBlock, BuilderContextInterface } from "../../../server-index";
|
|
8
|
+
declare const __propDef: {
|
|
9
|
+
props: {
|
|
10
|
+
block: StyleWrapperProps["block"];
|
|
11
|
+
context: StyleWrapperProps["context"];
|
|
12
|
+
};
|
|
13
|
+
events: {
|
|
14
|
+
[evt: string]: CustomEvent<any>;
|
|
15
|
+
};
|
|
16
|
+
slots: {};
|
|
17
|
+
};
|
|
18
|
+
type StyleWrapperProps_ = typeof __propDef.props;
|
|
19
|
+
export { StyleWrapperProps_ as StyleWrapperProps };
|
|
20
|
+
export type StyleWrapperEvents = typeof __propDef.events;
|
|
21
|
+
export type StyleWrapperSlots = typeof __propDef.slots;
|
|
22
|
+
export default class StyleWrapper extends SvelteComponent<StyleWrapperProps, StyleWrapperEvents, StyleWrapperSlots> {
|
|
23
|
+
}
|
|
@@ -15,7 +15,7 @@ import { getInteractionPropertiesForEvent } from "../../../functions/track/inter
|
|
|
15
15
|
import { getDefaultCanTrack } from "../../../helpers/canTrack";
|
|
16
16
|
import { getCookieSync } from "../../../helpers/cookie";
|
|
17
17
|
import "../../../helpers/preview-lru-cache/set";
|
|
18
|
-
import { createEditorListener } from "../../../helpers/subscribe-to-editor";
|
|
18
|
+
import { createEditorListener, } from "../../../helpers/subscribe-to-editor";
|
|
19
19
|
import { setupBrowserForEditing } from "../../../scripts/init-editing";
|
|
20
20
|
import { triggerAnimation } from "../../block/animator";
|
|
21
21
|
import "../../dynamic-div.svelte";
|
|
@@ -46,7 +46,7 @@ function stringifyStyles(stylesObj) {
|
|
|
46
46
|
}
|
|
47
47
|
return styles;
|
|
48
48
|
}
|
|
49
|
-
function mergeNewRootState(newData) {
|
|
49
|
+
function mergeNewRootState(newData, editType) {
|
|
50
50
|
const combinedState = {
|
|
51
51
|
...$builderContextSignal.rootState,
|
|
52
52
|
...newData,
|
|
@@ -57,8 +57,14 @@ function mergeNewRootState(newData) {
|
|
|
57
57
|
else {
|
|
58
58
|
$builderContextSignal.rootState = combinedState;
|
|
59
59
|
}
|
|
60
|
+
if ($builderContextSignal.rootSetState) {
|
|
61
|
+
$builderContextSignal.rootSetState(combinedState);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
$builderContextSignal.rootState = combinedState;
|
|
65
|
+
}
|
|
60
66
|
}
|
|
61
|
-
function mergeNewContent(newContent) {
|
|
67
|
+
function mergeNewContent(newContent, editType) {
|
|
62
68
|
const newContentValue = {
|
|
63
69
|
...$builderContextSignal.content,
|
|
64
70
|
...newContent,
|
|
@@ -96,11 +102,11 @@ function processMessage(event) {
|
|
|
96
102
|
animation: (animation) => {
|
|
97
103
|
triggerAnimation(animation);
|
|
98
104
|
},
|
|
99
|
-
contentUpdate: (newContent) => {
|
|
100
|
-
mergeNewContent(newContent);
|
|
105
|
+
contentUpdate: (newContent, editType) => {
|
|
106
|
+
mergeNewContent(newContent, editType);
|
|
101
107
|
},
|
|
102
|
-
stateUpdate: (newState) => {
|
|
103
|
-
mergeNewRootState(newState);
|
|
108
|
+
stateUpdate: (newState, editType) => {
|
|
109
|
+
mergeNewRootState(newState, editType);
|
|
104
110
|
},
|
|
105
111
|
},
|
|
106
112
|
})(event);
|
|
@@ -160,11 +166,15 @@ function runHttpRequests() {
|
|
|
160
166
|
method: "GET",
|
|
161
167
|
};
|
|
162
168
|
logFetch(JSON.stringify(fetchRequestObj));
|
|
163
|
-
|
|
169
|
+
const fetchOptions = {
|
|
164
170
|
method: fetchRequestObj.method,
|
|
165
171
|
headers: fetchRequestObj.headers,
|
|
166
172
|
body: fetchRequestObj.body,
|
|
167
|
-
}
|
|
173
|
+
};
|
|
174
|
+
if (fetchRequestObj.method === "GET") {
|
|
175
|
+
delete fetchOptions.body;
|
|
176
|
+
}
|
|
177
|
+
fetch(fetchRequestObj.url, fetchOptions)
|
|
168
178
|
.then((response) => response.json())
|
|
169
179
|
.then((json) => {
|
|
170
180
|
mergeNewRootState({
|
|
@@ -268,6 +278,9 @@ $: showContentProps = () => {
|
|
|
268
278
|
};
|
|
269
279
|
let elementRef;
|
|
270
280
|
let hasExecuted = false;
|
|
281
|
+
let contextValue = $builderContextSignal;
|
|
282
|
+
let prevData = null;
|
|
283
|
+
let prevLocale = "";
|
|
271
284
|
let ContentWrapper = contentWrapper || "div";
|
|
272
285
|
let httpReqsData = {};
|
|
273
286
|
let httpReqsPending = {};
|
|
@@ -324,15 +337,23 @@ $: onUpdateFn_1_builderContextSignal_rootState =
|
|
|
324
337
|
$: onUpdateFn_1(...[onUpdateFn_1_builderContextSignal_rootState]);
|
|
325
338
|
function onUpdateFn_2(..._args) {
|
|
326
339
|
if (data) {
|
|
340
|
+
if (prevData === data) {
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
327
343
|
mergeNewRootState(data);
|
|
344
|
+
prevData = data;
|
|
328
345
|
}
|
|
329
346
|
}
|
|
330
347
|
$: onUpdateFn_2(...[data]);
|
|
331
348
|
function onUpdateFn_3(..._args) {
|
|
332
349
|
if (locale) {
|
|
350
|
+
if (prevLocale === locale) {
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
333
353
|
mergeNewRootState({
|
|
334
354
|
locale: locale,
|
|
335
355
|
});
|
|
356
|
+
prevLocale = locale;
|
|
336
357
|
}
|
|
337
358
|
}
|
|
338
359
|
$: onUpdateFn_3(...[locale]);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script context="module"></script>
|
|
2
|
+
|
|
3
|
+
<script>import { getContext } from "svelte";
|
|
4
|
+
import { BuilderContext } from "../context/index";
|
|
5
|
+
import { findBlockById } from "../helpers/find-block";
|
|
6
|
+
export let id = undefined;
|
|
7
|
+
export let attributes = undefined;
|
|
8
|
+
export let Wrapper = undefined;
|
|
9
|
+
let context = getContext(BuilderContext.key);
|
|
10
|
+
$: block = () => {
|
|
11
|
+
return findBlockById($context.content, id);
|
|
12
|
+
};
|
|
13
|
+
$: options = () => {
|
|
14
|
+
return block?.()?.component?.options || {};
|
|
15
|
+
};
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<svelte:component this={Wrapper} {...options()} {attributes}
|
|
19
|
+
><slot /></svelte:component
|
|
20
|
+
>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
|
2
|
+
type LiveEditProps = {
|
|
3
|
+
children?: any;
|
|
4
|
+
id?: any;
|
|
5
|
+
Wrapper?: any;
|
|
6
|
+
attributes?: any;
|
|
7
|
+
};
|
|
8
|
+
declare const __propDef: {
|
|
9
|
+
props: {
|
|
10
|
+
id?: LiveEditProps["id"];
|
|
11
|
+
attributes?: LiveEditProps["attributes"];
|
|
12
|
+
Wrapper?: LiveEditProps["Wrapper"];
|
|
13
|
+
};
|
|
14
|
+
events: {
|
|
15
|
+
[evt: string]: CustomEvent<any>;
|
|
16
|
+
};
|
|
17
|
+
slots: {
|
|
18
|
+
default: {};
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
type LiveEditProps_ = typeof __propDef.props;
|
|
22
|
+
export { LiveEditProps_ as LiveEditProps };
|
|
23
|
+
export type LiveEditEvents = typeof __propDef.events;
|
|
24
|
+
export type LiveEditSlots = typeof __propDef.slots;
|
|
25
|
+
export default class LiveEdit extends SvelteComponent<LiveEditProps, LiveEditEvents, LiveEditSlots> {
|
|
26
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "4.2.
|
|
1
|
+
export declare const SDK_VERSION = "4.2.3";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const SDK_VERSION = "4.2.
|
|
1
|
+
export const SDK_VERSION = "4.2.3";
|
|
@@ -20,15 +20,10 @@ export const generateContentUrl = (options) => {
|
|
|
20
20
|
url.searchParams.set('limit', String(limit));
|
|
21
21
|
url.searchParams.set('noTraverse', String(noTraverse));
|
|
22
22
|
url.searchParams.set('includeRefs', String(true));
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
if (finalLocale) {
|
|
26
|
-
url.searchParams.set('locale', finalLocale);
|
|
27
|
-
finalUserAttributes = {
|
|
28
|
-
locale: finalLocale,
|
|
29
|
-
...finalUserAttributes
|
|
30
|
-
};
|
|
23
|
+
if (locale) {
|
|
24
|
+
url.searchParams.set('locale', locale);
|
|
31
25
|
}
|
|
26
|
+
let finalUserAttributes = userAttributes || {};
|
|
32
27
|
if (enrich)
|
|
33
28
|
url.searchParams.set('enrich', String(enrich));
|
|
34
29
|
url.searchParams.set('omit', omit ?? 'meta.componentsUsed');
|
|
@@ -12,6 +12,14 @@ const checkContentHasResults = (content) => 'results' in content;
|
|
|
12
12
|
* Returns the first content entry that matches the given options.
|
|
13
13
|
*/
|
|
14
14
|
export async function fetchOneEntry(options) {
|
|
15
|
+
const finalLocale = options.locale || options.userAttributes?.locale;
|
|
16
|
+
if (finalLocale) {
|
|
17
|
+
options.locale = finalLocale;
|
|
18
|
+
options.userAttributes = {
|
|
19
|
+
locale: finalLocale,
|
|
20
|
+
...options.userAttributes
|
|
21
|
+
};
|
|
22
|
+
}
|
|
15
23
|
const allContent = await fetchEntries({
|
|
16
24
|
...options,
|
|
17
25
|
limit: 1
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { BuilderBlock, BuilderContent } from '../server-index';
|
|
2
|
+
/**
|
|
3
|
+
* Recursively searches for a block by ID.
|
|
4
|
+
*
|
|
5
|
+
* @param content The Builder content to search through.
|
|
6
|
+
* @param id The ID of the block to search for.
|
|
7
|
+
* @returns The block if found, otherwise null.
|
|
8
|
+
*/
|
|
9
|
+
export declare const findBlockById: (content: BuilderContent, id: string) => BuilderBlock | null;
|
|
10
|
+
/**
|
|
11
|
+
* Helper function to recursively search through block tree.
|
|
12
|
+
*
|
|
13
|
+
* @param blocks The blocks to search through.
|
|
14
|
+
* @param id The ID of the block to search for.
|
|
15
|
+
* @returns The block if found, otherwise null.
|
|
16
|
+
* @private This is an internal implementation detail.
|
|
17
|
+
*/
|
|
18
|
+
export declare const findBlockInTree: (blocks: BuilderBlock[] | undefined, id: string) => BuilderBlock | null;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recursively searches for a block by ID.
|
|
3
|
+
*
|
|
4
|
+
* @param content The Builder content to search through.
|
|
5
|
+
* @param id The ID of the block to search for.
|
|
6
|
+
* @returns The block if found, otherwise null.
|
|
7
|
+
*/
|
|
8
|
+
export const findBlockById = (content, id) => {
|
|
9
|
+
return findBlockInTree(content.data?.blocks, id);
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Helper function to recursively search through block tree.
|
|
13
|
+
*
|
|
14
|
+
* @param blocks The blocks to search through.
|
|
15
|
+
* @param id The ID of the block to search for.
|
|
16
|
+
* @returns The block if found, otherwise null.
|
|
17
|
+
* @private This is an internal implementation detail.
|
|
18
|
+
*/
|
|
19
|
+
export const findBlockInTree = (blocks, id) => {
|
|
20
|
+
if (!blocks)
|
|
21
|
+
return null;
|
|
22
|
+
for (const block of blocks) {
|
|
23
|
+
if (block.id === id)
|
|
24
|
+
return block;
|
|
25
|
+
if (block.children) {
|
|
26
|
+
const child = findBlockInTree(block.children, id);
|
|
27
|
+
if (child)
|
|
28
|
+
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)
|
|
35
|
+
return child;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
};
|
|
@@ -2,10 +2,11 @@ import type { ContentProps } from '../components/content/content.types';
|
|
|
2
2
|
import type { BuilderAnimation } from '../types/builder-block';
|
|
3
3
|
import type { BuilderContent } from '../types/builder-content';
|
|
4
4
|
import type { Dictionary } from '../types/typescript';
|
|
5
|
+
export type EditType = 'client' | 'server' | undefined;
|
|
5
6
|
type ContentListener = Required<Pick<ContentProps, 'model' | 'trustedHosts'>> & {
|
|
6
7
|
callbacks: {
|
|
7
|
-
contentUpdate: (updatedContent: BuilderContent) => void;
|
|
8
|
-
stateUpdate: (newState: Dictionary<string
|
|
8
|
+
contentUpdate: (updatedContent: BuilderContent, editType?: EditType) => void;
|
|
9
|
+
stateUpdate: (newState: Dictionary<string>, editType?: EditType) => void;
|
|
9
10
|
animation: (updatedContent: BuilderAnimation) => void;
|
|
10
11
|
configureSdk: (updatedContent: any) => void;
|
|
11
12
|
};
|
|
@@ -25,8 +25,9 @@ export const createEditorListener = ({ model, trustedHosts, callbacks }) => {
|
|
|
25
25
|
const messageContent = data.data;
|
|
26
26
|
const modelName = messageContent.model;
|
|
27
27
|
const newState = messageContent?.state;
|
|
28
|
+
const editType = messageContent.editType;
|
|
28
29
|
if (modelName === model && newState) {
|
|
29
|
-
callbacks.stateUpdate(newState);
|
|
30
|
+
callbacks.stateUpdate(newState, editType);
|
|
30
31
|
}
|
|
31
32
|
break;
|
|
32
33
|
}
|
|
@@ -35,8 +36,9 @@ export const createEditorListener = ({ model, trustedHosts, callbacks }) => {
|
|
|
35
36
|
const messageContent = data.data;
|
|
36
37
|
const key = messageContent.key || messageContent.alias || messageContent.entry || messageContent.modelName;
|
|
37
38
|
const contentData = messageContent.data;
|
|
39
|
+
const editType = messageContent.editType;
|
|
38
40
|
if (key === model) {
|
|
39
|
-
callbacks.contentUpdate(contentData);
|
|
41
|
+
callbacks.contentUpdate(contentData, editType);
|
|
40
42
|
}
|
|
41
43
|
break;
|
|
42
44
|
}
|
package/package.json
CHANGED
|
@@ -87,6 +87,9 @@
|
|
|
87
87
|
function submissionState() {
|
|
88
88
|
return (isEditing() && previewState) || formState;
|
|
89
89
|
}
|
|
90
|
+
function errorResponse(response: any) {
|
|
91
|
+
return JSON.stringify(response, null, 2);
|
|
92
|
+
}
|
|
90
93
|
function onSubmit(event: any) {
|
|
91
94
|
const sendWithJsProp = sendWithJs || sendSubmissionsTo === "email";
|
|
92
95
|
if (sendSubmissionsTo === "zapier") {
|
|
@@ -351,11 +354,7 @@
|
|
|
351
354
|
/>
|
|
352
355
|
{/if}
|
|
353
356
|
{#if submissionState() === "error" && responseData}
|
|
354
|
-
<pre class="builder-form-error-text pre">{
|
|
355
|
-
responseData,
|
|
356
|
-
null,
|
|
357
|
-
2
|
|
358
|
-
)}</pre>
|
|
357
|
+
<pre class="builder-form-error-text pre">{errorResponse(responseData)}</pre>
|
|
359
358
|
{/if}
|
|
360
359
|
{#if submissionState() === "success"}
|
|
361
360
|
<Blocks
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { IMAGE_FILE_TYPES } from '../../constants/file-types';
|
|
2
2
|
import type { ComponentInfo } from '../../types/components';
|
|
3
3
|
export const componentInfo: ComponentInfo = {
|
|
4
|
-
// friendlyName?
|
|
5
4
|
name: 'Raw:Img',
|
|
6
5
|
hideFromInsertMenu: true,
|
|
7
6
|
image: 'https://firebasestorage.googleapis.com/v0/b/builder-3b0a2.appspot.com/o/images%2Fbaseline-insert_photo-24px.svg?alt=media&token=4e5d0ef4-f5e8-4e57-b3a9-38d63a9b9dc4',
|
|
@@ -11,7 +10,38 @@ export const componentInfo: ComponentInfo = {
|
|
|
11
10
|
type: 'file',
|
|
12
11
|
allowedFileTypes: IMAGE_FILE_TYPES,
|
|
13
12
|
required: true
|
|
13
|
+
}, {
|
|
14
|
+
name: 'backgroundSize',
|
|
15
|
+
type: 'text',
|
|
16
|
+
defaultValue: 'cover',
|
|
17
|
+
enum: [{
|
|
18
|
+
label: 'contain',
|
|
19
|
+
value: 'contain',
|
|
20
|
+
helperText: 'The image should never get cropped'
|
|
21
|
+
}, {
|
|
22
|
+
label: 'cover',
|
|
23
|
+
value: 'cover',
|
|
24
|
+
helperText: "The image should fill it's box, cropping when needed"
|
|
25
|
+
}]
|
|
26
|
+
}, {
|
|
27
|
+
name: 'backgroundPosition',
|
|
28
|
+
type: 'text',
|
|
29
|
+
defaultValue: 'center',
|
|
30
|
+
enum: ['center', 'top', 'left', 'right', 'bottom', 'top left', 'top right', 'bottom left', 'bottom right']
|
|
31
|
+
}, {
|
|
32
|
+
name: 'altText',
|
|
33
|
+
type: 'string',
|
|
34
|
+
helperText: 'Text to display when the user has images off'
|
|
35
|
+
}, {
|
|
36
|
+
name: 'title',
|
|
37
|
+
type: 'string',
|
|
38
|
+
helperText: 'Text to display when hovering over the asset'
|
|
39
|
+
}, {
|
|
40
|
+
name: 'aspectRatio',
|
|
41
|
+
type: 'number',
|
|
42
|
+
helperText: "This is the ratio of height/width, e.g. set to 1.5 for a 300px wide and 200px tall photo. Set to 0 to not force the image to maintain it's aspect ratio",
|
|
43
|
+
advanced: true,
|
|
44
|
+
defaultValue: 0.7041
|
|
14
45
|
}],
|
|
15
|
-
noWrap: true
|
|
16
|
-
static: true
|
|
46
|
+
noWrap: true
|
|
17
47
|
}
|
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
| "top right"
|
|
20
20
|
| "bottom left"
|
|
21
21
|
| "bottom right";
|
|
22
|
+
aspectRatio?: number;
|
|
23
|
+
title?: string;
|
|
22
24
|
}
|
|
23
25
|
</script>
|
|
24
26
|
|
|
@@ -26,14 +28,16 @@
|
|
|
26
28
|
import { isEditing } from "../../functions/is-editing";
|
|
27
29
|
import { filterAttrs } from "../helpers";
|
|
28
30
|
import { getSrcSet } from "../image/image.helpers";
|
|
29
|
-
import {
|
|
31
|
+
import { getClassPropName } from "../../functions/get-class-prop-name";
|
|
30
32
|
|
|
31
33
|
export let imgSrc: ImgProps["imgSrc"] = undefined;
|
|
32
34
|
export let image: ImgProps["image"] = undefined;
|
|
35
|
+
export let attributes: ImgProps["attributes"] = undefined;
|
|
36
|
+
export let altText: ImgProps["altText"] = undefined;
|
|
37
|
+
export let title: ImgProps["title"] = undefined;
|
|
33
38
|
export let backgroundSize: ImgProps["backgroundSize"] = undefined;
|
|
34
39
|
export let backgroundPosition: ImgProps["backgroundPosition"] = undefined;
|
|
35
|
-
export let
|
|
36
|
-
export let attributes: ImgProps["attributes"] = undefined;
|
|
40
|
+
export let aspectRatio: ImgProps["aspectRatio"] = undefined;
|
|
37
41
|
function stringifyStyles(stylesObj) {
|
|
38
42
|
let styles = "";
|
|
39
43
|
for (let key in stylesObj) {
|
|
@@ -57,6 +61,17 @@
|
|
|
57
61
|
}
|
|
58
62
|
return getSrcSet(url);
|
|
59
63
|
};
|
|
64
|
+
$: imgAttrs = () => {
|
|
65
|
+
const attrs = {
|
|
66
|
+
...filterAttrs(attributes, "on:", false),
|
|
67
|
+
...filterAttrs(attributes, "on:", true),
|
|
68
|
+
[getClassPropName()]: `builder-raw-img ${
|
|
69
|
+
attributes[getClassPropName()] || ""
|
|
70
|
+
}`,
|
|
71
|
+
} as Record<string, any>;
|
|
72
|
+
delete attrs.style;
|
|
73
|
+
return attrs;
|
|
74
|
+
};
|
|
60
75
|
</script>
|
|
61
76
|
|
|
62
77
|
{#key (isEditing() && imgSrc) || "default-key"}
|
|
@@ -64,12 +79,13 @@
|
|
|
64
79
|
style={stringifyStyles({
|
|
65
80
|
objectFit: backgroundSize || "cover",
|
|
66
81
|
objectPosition: backgroundPosition || "center",
|
|
82
|
+
aspectRatio: aspectRatio || undefined,
|
|
83
|
+
...(attributes?.style || {}),
|
|
67
84
|
})}
|
|
68
85
|
loading="lazy"
|
|
69
86
|
alt={altText}
|
|
87
|
+
{title}
|
|
70
88
|
src={imgSrc || image}
|
|
71
|
-
|
|
72
|
-
{...filterAttrs(attributes, "on:", false)}
|
|
73
|
-
use:setAttrs={filterAttrs(attributes, "on:", true)}
|
|
89
|
+
{...imgAttrs()}
|
|
74
90
|
/>
|
|
75
91
|
{/key}
|