@builder.io/sdk-svelte 0.0.1-3 → 0.0.1-30

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 (77) hide show
  1. package/README.md +19 -0
  2. package/package.json +8 -1
  3. package/src/blocks/button/button.svelte +25 -47
  4. package/src/blocks/columns/columns.svelte +115 -102
  5. package/src/blocks/columns/component-info.js +25 -1
  6. package/src/blocks/custom-code/custom-code.svelte +59 -61
  7. package/src/blocks/embed/component-info.js +20 -1
  8. package/src/blocks/embed/embed.svelte +38 -56
  9. package/src/blocks/embed/helpers.js +9 -0
  10. package/src/blocks/form/form.svelte +264 -294
  11. package/src/blocks/fragment/fragment.svelte +1 -25
  12. package/src/blocks/image/component-info.js +47 -1
  13. package/src/blocks/image/image.helpers.js +48 -0
  14. package/src/blocks/image/image.svelte +126 -116
  15. package/src/blocks/img/img.svelte +25 -35
  16. package/src/blocks/input/input.svelte +17 -30
  17. package/src/blocks/raw-text/raw-text.svelte +4 -25
  18. package/src/blocks/section/section.svelte +20 -35
  19. package/src/blocks/select/select.svelte +16 -36
  20. package/src/blocks/submit-button/submit-button.svelte +4 -29
  21. package/src/blocks/symbol/component-info.js +1 -0
  22. package/src/blocks/symbol/symbol.svelte +67 -52
  23. package/src/blocks/text/text.svelte +1 -24
  24. package/src/blocks/textarea/textarea.svelte +5 -28
  25. package/src/blocks/video/video.svelte +60 -41
  26. package/src/components/render-block/block-styles.svelte +54 -50
  27. package/src/components/render-block/render-block.helpers.js +23 -0
  28. package/src/components/render-block/render-block.svelte +199 -159
  29. package/src/components/render-block/render-component.svelte +20 -0
  30. package/src/components/render-block/render-repeated-block.svelte +29 -0
  31. package/src/components/render-block/types.js +0 -0
  32. package/src/components/render-blocks.svelte +74 -79
  33. package/src/components/render-content/components/render-styles.svelte +43 -63
  34. package/src/components/render-content/index.js +4 -0
  35. package/src/components/render-content/render-content.svelte +266 -207
  36. package/src/components/render-inlined-styles.svelte +15 -43
  37. package/src/constants/builder-registered-components.js +48 -0
  38. package/src/constants/device-sizes.js +3 -21
  39. package/src/context/builder.context.js +7 -1
  40. package/src/functions/camel-to-kebab-case.js +4 -0
  41. package/src/functions/convert-style-object.js +6 -0
  42. package/src/functions/get-block-component-options.js +6 -1
  43. package/src/functions/get-block-styles.js +7 -4
  44. package/src/functions/get-builder-search-params/index.js +12 -1
  45. package/src/functions/get-content/ab-testing.js +38 -0
  46. package/src/functions/get-content/fn.test.js +1 -1
  47. package/src/functions/get-content/index.js +16 -58
  48. package/src/functions/get-content/types.js +0 -0
  49. package/src/functions/get-processed-block.js +15 -8
  50. package/src/functions/get-processed-block.test.js +2 -1
  51. package/src/functions/register-component.js +45 -26
  52. package/src/functions/sanitize-styles.js +5 -0
  53. package/src/helpers/css.js +12 -0
  54. package/src/helpers/flatten.js +34 -0
  55. package/src/index-helpers/blocks-exports.js +10 -8
  56. package/src/types/components.js +0 -0
  57. package/src/types/element.js +0 -0
  58. package/src/blocks/button/index.js +0 -7
  59. package/src/blocks/columns/index.js +0 -7
  60. package/src/blocks/custom-code/index.js +0 -7
  61. package/src/blocks/embed/index.js +0 -7
  62. package/src/blocks/form/index.js +0 -7
  63. package/src/blocks/fragment/index.js +0 -7
  64. package/src/blocks/image/index.js +0 -7
  65. package/src/blocks/img/index.js +0 -7
  66. package/src/blocks/input/index.js +0 -7
  67. package/src/blocks/raw-text/index.js +0 -7
  68. package/src/blocks/section/index.js +0 -7
  69. package/src/blocks/select/index.js +0 -7
  70. package/src/blocks/submit-button/index.js +0 -7
  71. package/src/blocks/symbol/index.js +0 -7
  72. package/src/blocks/text/index.js +0 -7
  73. package/src/blocks/textarea/index.js +0 -7
  74. package/src/blocks/video/index.js +0 -7
  75. package/src/components/error-boundary.svelte +0 -26
  76. package/src/functions/macro-eval.js +0 -5
  77. package/src/functions/previewing-model-name.js +0 -11
@@ -1,54 +1,69 @@
1
1
  <script>
2
- import { onMount } from 'svelte'
3
- import { afterUpdate } from 'svelte'
4
-
5
-
6
- import RenderContent, { } from '../../components/render-content/render-content.svelte';
7
- import BuilderContext, { } from '../../context/builder.context';
8
- import { getContent } from '../../functions/get-content/index.js';
9
-
10
-
11
-
12
- import { getContext, setContext } from "svelte";
13
-
14
-
15
- export let attributes;
16
- export let symbol;
17
-
18
-
19
-
20
-
21
- let builderContext = getContext(BuilderContext.key);
22
-
23
- let className = 'builder-symbol';
24
- let content = null;
25
-
26
- onMount(() => { content = symbol?.content; });
27
-
28
- afterUpdate(() => { const symbolToUse = symbol;
29
-
30
- if (symbolToUse && !symbolToUse.content && !content && symbolToUse.model) {
31
- getContent({
32
- model: symbolToUse.model,
33
- apiKey: builderContext.apiKey,
34
- options: {
35
- entry: symbolToUse.entry
2
+ import { onMount } from "svelte";
3
+ import { afterUpdate } from "svelte";
4
+
5
+ import RenderContent from "../../components/render-content/render-content.svelte";
6
+ import BuilderContext from "../../context/builder.context";
7
+ import { getContent } from "../../functions/get-content/index.js";
8
+
9
+ import { getContext, setContext } from "svelte";
10
+
11
+ export let attributes;
12
+ export let symbol;
13
+
14
+ let builderContext = getContext(BuilderContext.key);
15
+
16
+ let className = "builder-symbol";
17
+ let content = null;
18
+
19
+ onMount(() => {
20
+ content = symbol?.content;
21
+ });
22
+
23
+ function onUpdateFn_0() {
24
+ const symbolToUse = symbol;
25
+ /**
26
+ * If:
27
+ * - we have a symbol prop
28
+ * - yet it does not have any content
29
+ * - and we have not already stored content from before
30
+ * - and it has a model name
31
+ *
32
+ * then we want to re-fetch the symbol content.
33
+ */
34
+
35
+ if (symbolToUse && !symbolToUse.content && !content && symbolToUse.model) {
36
+ getContent({
37
+ model: symbolToUse.model,
38
+ apiKey: builderContext.apiKey,
39
+ query: {
40
+ id: symbolToUse.entry,
41
+ },
42
+ }).then((response) => {
43
+ content = response;
44
+ });
45
+ }
36
46
  }
37
- }).then(response => {
38
- content = response;
39
- });
40
- } })
41
-
42
-
43
- </script>
44
-
45
- <div {...attributes} dataSet={{
46
- class: className
47
- }} class={className} >
48
-
49
- <RenderContent apiKey={builderContext.apiKey} context={builderContext.context} data={{ ...symbol?.data,
50
- ...builderContext.state,
51
- ...symbol?.content?.data?.state
52
- }} model={symbol?.model} content={content} ></RenderContent>
53
-
54
- </div>
47
+ $: onUpdateFn_0(...[symbol?.content, symbol?.model, symbol?.entry, content]);
48
+ </script>
49
+
50
+ <div
51
+ {...attributes}
52
+ dataSet={{
53
+ class: className,
54
+ }}
55
+ class={className}
56
+ >
57
+ <RenderContent
58
+ apiKey={builderContext.apiKey}
59
+ context={builderContext.context}
60
+ customComponents={Object.values(builderContext.registeredComponents)}
61
+ data={{
62
+ ...symbol?.data,
63
+ ...builderContext.state,
64
+ ...symbol?.content?.data?.state,
65
+ }}
66
+ model={symbol?.model}
67
+ {content}
68
+ />
69
+ </div>
@@ -1,28 +1,5 @@
1
1
  <script>
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
2
  export let text;
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
3
  </script>
27
4
 
28
- <div class="builder-text" >{@html text}</div>
5
+ <div class="builder-text">{@html text}</div>
@@ -1,32 +1,9 @@
1
1
  <script>
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
2
  export let attributes;
13
- export let placeholder;
14
- export let name;
15
- export let value;
16
- export let defaultValue;
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
3
+ export let placeholder;
4
+ export let name;
5
+ export let value;
6
+ export let defaultValue;
30
7
  </script>
31
8
 
32
- <textarea {...attributes} placeholder={placeholder} name={name} value={value} defaultValue={defaultValue} ></textarea>
9
+ <textarea {...attributes} {placeholder} {name} {value} {defaultValue} />
@@ -1,45 +1,64 @@
1
1
  <script>
2
-
3
-
4
-
5
-
6
-
7
-
2
+ export let autoPlay;
3
+ export let muted;
4
+ export let controls;
5
+ export let loop;
6
+ export let playsInline;
7
+ export let attributes;
8
+ export let fit;
9
+ export let position;
10
+ export let video;
11
+ export let posterImage;
8
12
 
9
-
13
+ function mitosis_styling(node, vars) {
14
+ Object.entries(vars).forEach(([p, v]) => {
15
+ node.style[p] = v;
16
+ });
17
+ }
10
18
 
11
-
12
- export let attributes;
13
- export let fit;
14
- export let position;
15
- export let video;
16
- export let posterImage;
17
- export let autoPlay;
18
- export let muted;
19
- export let controls;
20
- export let loop;
21
-
22
-
23
-
19
+ $: videoProps = () => {
20
+ return {
21
+ ...(autoPlay === true
22
+ ? {
23
+ autoPlay: true,
24
+ }
25
+ : {}),
26
+ ...(muted === true
27
+ ? {
28
+ muted: true,
29
+ }
30
+ : {}),
31
+ ...(controls === true
32
+ ? {
33
+ controls: true,
34
+ }
35
+ : {}),
36
+ ...(loop === true
37
+ ? {
38
+ loop: true,
39
+ }
40
+ : {}),
41
+ ...(playsInline === true
42
+ ? {
43
+ playsInline: true,
44
+ }
45
+ : {}),
46
+ };
47
+ };
48
+ </script>
24
49
 
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
- </script>
35
-
36
- <video {...attributes} preload="none" style={{
37
- width: '100%',
38
- height: '100%',
39
- ...attributes?.style,
40
- objectFit: fit,
41
- objectPosition: position,
42
- // Hack to get object fit to work as expected and
43
- // not have the video overflow
44
- borderRadius: 1
45
- }} key={video || 'no-src'} poster={posterImage} autoPlay={autoPlay} muted={muted} controls={controls} loop={loop} ></video>
50
+ <video
51
+ {...videoProps()}
52
+ use:mitosis_styling={{
53
+ width: "100%",
54
+ height: "100%",
55
+ ...attributes?.style,
56
+ objectFit: fit,
57
+ objectPosition: position,
58
+ // Hack to get object fit to work as expected and
59
+ // not have the video overflow
60
+ borderRadius: 1,
61
+ }}
62
+ src={video || "no-src"}
63
+ poster={posterImage}
64
+ />
@@ -1,51 +1,55 @@
1
1
  <script>
2
-
3
-
4
-
5
-
6
- import RenderInlinedStyles, { } from '../render-inlined-styles.svelte';
7
-
8
-
9
-
10
-
11
-
12
-
13
- export let block;
14
-
15
- function camelToKebabCase(string) {
16
- return string.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase();
17
- }
18
- $: css = () => {
19
- // TODO: media queries
20
- const styleObject = block.responsiveStyles?.large;
21
-
22
- if (!styleObject) {
23
- return '';
24
- }
25
-
26
- let str = `.${block.id} {`;
27
-
28
- for (const key in styleObject) {
29
- const value = styleObject[key];
30
-
31
- if (typeof value === 'string') {
32
- str += `${camelToKebabCase(key)}: ${value};`;
33
- }
34
- }
35
-
36
- str += '}';
37
- return str;
38
- };
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
- </script>
50
-
51
- <RenderInlinedStyles styles={css()} ></RenderInlinedStyles>
2
+ import { TARGET } from "../../constants/target.js";
3
+ import BuilderContext from "../../context/builder.context";
4
+ import { getProcessedBlock } from "../../functions/get-processed-block.js";
5
+ import RenderInlinedStyles from "../render-inlined-styles.svelte";
6
+ import { convertStyleMaptoCSS } from "../../helpers/css.js";
7
+ import { getMaxWidthQueryForSize } from "../../constants/device-sizes.js";
8
+
9
+ import { getContext, setContext } from "svelte";
10
+
11
+ export let block;
12
+
13
+ $: useBlock = () => {
14
+ return getProcessedBlock({
15
+ block: block,
16
+ state: builderContext.state,
17
+ context: builderContext.context,
18
+ evaluateBindings: true,
19
+ });
20
+ };
21
+
22
+ $: css = () => {
23
+ const styles = useBlock().responsiveStyles;
24
+ const largeStyles = styles?.large;
25
+ const mediumStyles = styles?.medium;
26
+ const smallStyles = styles?.small;
27
+ return `
28
+ ${
29
+ largeStyles
30
+ ? `.${useBlock().id} {${convertStyleMaptoCSS(largeStyles)}}`
31
+ : ""
32
+ }
33
+ ${
34
+ mediumStyles
35
+ ? `${getMaxWidthQueryForSize("medium")} {
36
+ .${useBlock().id} {${convertStyleMaptoCSS(mediumStyles)}}
37
+ }`
38
+ : ""
39
+ }
40
+ ${
41
+ smallStyles
42
+ ? `${getMaxWidthQueryForSize("small")} {
43
+ .${useBlock().id} {${convertStyleMaptoCSS(smallStyles)}}
44
+ }`
45
+ : ""
46
+ }
47
+ }`;
48
+ };
49
+
50
+ let builderContext = getContext(BuilderContext.key);
51
+ </script>
52
+
53
+ {#if TARGET === "vue2" || TARGET === "vue3" || TARGET === "svelte"}
54
+ <RenderInlinedStyles styles={css()} />
55
+ {/if}
@@ -0,0 +1,23 @@
1
+ const EMPTY_HTML_ELEMENTS = [
2
+ "area",
3
+ "base",
4
+ "br",
5
+ "col",
6
+ "embed",
7
+ "hr",
8
+ "img",
9
+ "input",
10
+ "keygen",
11
+ "link",
12
+ "meta",
13
+ "param",
14
+ "source",
15
+ "track",
16
+ "wbr"
17
+ ];
18
+ const isEmptyHtmlElement = (tagName) => {
19
+ return typeof tagName === "string" && EMPTY_HTML_ELEMENTS.includes(tagName.toLowerCase());
20
+ };
21
+ export {
22
+ isEmptyHtmlElement
23
+ };