@webstudio-is/react-sdk 0.60.0 → 0.61.0

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 (83) hide show
  1. package/lib/cjs/components/blockquote.ws.js +36 -48
  2. package/lib/cjs/components/body.ws.js +20 -17
  3. package/lib/cjs/components/button.ws.js +1 -1
  4. package/lib/cjs/components/code.ws.js +20 -28
  5. package/lib/cjs/components/component-meta.js +2 -1
  6. package/lib/cjs/components/form.ws.js +14 -7
  7. package/lib/cjs/components/heading.ws.js +1 -1
  8. package/lib/cjs/components/image.ws.js +8 -9
  9. package/lib/cjs/components/italic.ws.js +5 -5
  10. package/lib/cjs/components/link-block.ws.js +5 -5
  11. package/lib/cjs/components/link.ws.js +9 -10
  12. package/lib/cjs/components/list-item.ws.js +1 -1
  13. package/lib/cjs/components/list.ws.js +22 -22
  14. package/lib/cjs/components/paragraph.ws.js +1 -1
  15. package/lib/cjs/components/separator.ws.js +20 -20
  16. package/lib/cjs/components/text-block.ws.js +6 -7
  17. package/lib/cjs/css/css.js +6 -9
  18. package/lib/cjs/css/normalize.js +166 -185
  19. package/lib/cjs/css/presets.js +14 -34
  20. package/lib/cjs/css/style-rules.js +17 -0
  21. package/lib/cjs/embed-template.js +160 -0
  22. package/lib/cjs/index.js +1 -0
  23. package/lib/components/blockquote.ws.js +36 -48
  24. package/lib/components/body.ws.js +20 -17
  25. package/lib/components/button.ws.js +1 -1
  26. package/lib/components/code.ws.js +20 -28
  27. package/lib/components/component-meta.js +2 -1
  28. package/lib/components/form.ws.js +14 -7
  29. package/lib/components/heading.ws.js +1 -1
  30. package/lib/components/image.ws.js +8 -9
  31. package/lib/components/italic.ws.js +5 -5
  32. package/lib/components/link-block.ws.js +5 -5
  33. package/lib/components/link.ws.js +9 -10
  34. package/lib/components/list-item.ws.js +1 -1
  35. package/lib/components/list.ws.js +22 -22
  36. package/lib/components/paragraph.ws.js +1 -1
  37. package/lib/components/separator.ws.js +20 -20
  38. package/lib/components/text-block.ws.js +6 -7
  39. package/lib/css/css.js +8 -11
  40. package/lib/css/normalize.js +166 -185
  41. package/lib/css/presets.js +14 -34
  42. package/lib/css/style-rules.js +17 -0
  43. package/lib/embed-template.js +140 -0
  44. package/lib/index.js +1 -0
  45. package/lib/types/components/box.stories.d.ts +2 -2
  46. package/lib/types/components/component-meta.d.ts +20 -5
  47. package/lib/types/components/components-utils.d.ts +1 -1
  48. package/lib/types/css/normalize.d.ts +8786 -2286
  49. package/lib/types/css/presets.d.ts +2 -38
  50. package/lib/types/css/style-rules.d.ts +11 -9
  51. package/lib/types/embed-template.d.ts +1725 -0
  52. package/lib/types/embed-template.test.d.ts +1 -0
  53. package/lib/types/index.d.ts +1 -0
  54. package/package.json +14 -13
  55. package/src/components/blockquote.ws.tsx +42 -52
  56. package/src/components/body.ws.tsx +26 -23
  57. package/src/components/bold.ws.tsx +6 -3
  58. package/src/components/box.ws.ts +6 -3
  59. package/src/components/button.ws.tsx +7 -4
  60. package/src/components/code.ws.tsx +26 -32
  61. package/src/components/component-meta.ts +5 -3
  62. package/src/components/form.ws.tsx +19 -9
  63. package/src/components/heading.ws.tsx +7 -4
  64. package/src/components/image.ws.tsx +14 -12
  65. package/src/components/input.ws.tsx +6 -3
  66. package/src/components/italic.ws.tsx +11 -8
  67. package/src/components/link-block.ws.tsx +11 -8
  68. package/src/components/link.ws.tsx +15 -13
  69. package/src/components/list-item.ws.tsx +7 -4
  70. package/src/components/list.ws.tsx +28 -25
  71. package/src/components/paragraph.ws.tsx +7 -4
  72. package/src/components/separator.ws.tsx +26 -25
  73. package/src/components/span.ws.tsx +6 -3
  74. package/src/components/subscript.ws.tsx +6 -3
  75. package/src/components/superscript.ws.tsx +6 -3
  76. package/src/components/text-block.ws.tsx +12 -11
  77. package/src/css/css.ts +8 -11
  78. package/src/css/normalize.ts +165 -188
  79. package/src/css/presets.ts +15 -37
  80. package/src/css/style-rules.ts +24 -0
  81. package/src/embed-template.test.ts +210 -0
  82. package/src/embed-template.ts +187 -0
  83. package/src/index.ts +1 -0
@@ -1,64 +1,52 @@
1
1
  import { BlockquoteIcon } from "@webstudio-is/icons";
2
2
  import { props } from "./__generated__/blockquote.props";
3
3
  const presetStyle = {
4
- blockquote: {
5
- marginTop: {
6
- type: "unit",
7
- value: 0,
8
- unit: "number"
4
+ blockquote: [
5
+ {
6
+ property: "marginTop",
7
+ value: { type: "unit", value: 0, unit: "number" }
9
8
  },
10
- marginRight: {
11
- type: "unit",
12
- value: 0,
13
- unit: "number"
9
+ {
10
+ property: "marginRight",
11
+ value: { type: "unit", value: 0, unit: "number" }
14
12
  },
15
- marginBottom: {
16
- type: "unit",
17
- value: 10,
18
- unit: "px"
13
+ {
14
+ property: "marginBottom",
15
+ value: { type: "unit", value: 10, unit: "px" }
19
16
  },
20
- marginLeft: {
21
- type: "unit",
22
- value: 0,
23
- unit: "number"
17
+ {
18
+ property: "marginLeft",
19
+ value: { type: "unit", value: 0, unit: "number" }
24
20
  },
25
- paddingTop: {
26
- type: "unit",
27
- value: 10,
28
- unit: "px"
21
+ {
22
+ property: "paddingTop",
23
+ value: { type: "unit", value: 10, unit: "px" }
29
24
  },
30
- paddingBottom: {
31
- type: "unit",
32
- value: 10,
33
- unit: "px"
25
+ {
26
+ property: "paddingBottom",
27
+ value: { type: "unit", value: 10, unit: "px" }
34
28
  },
35
- paddingLeft: {
36
- type: "unit",
37
- value: 20,
38
- unit: "px"
29
+ {
30
+ property: "paddingLeft",
31
+ value: { type: "unit", value: 20, unit: "px" }
39
32
  },
40
- paddingRight: {
41
- type: "unit",
42
- value: 20,
43
- unit: "px"
33
+ {
34
+ property: "paddingRight",
35
+ value: { type: "unit", value: 20, unit: "px" }
44
36
  },
45
- borderLeftWidth: {
46
- type: "unit",
47
- value: 5,
48
- unit: "px"
37
+ {
38
+ property: "borderLeftWidth",
39
+ value: { type: "unit", value: 5, unit: "px" }
49
40
  },
50
- borderLeftStyle: {
51
- type: "keyword",
52
- value: "solid"
41
+ {
42
+ property: "borderLeftStyle",
43
+ value: { type: "keyword", value: "solid" }
53
44
  },
54
- borderLeftColor: {
55
- type: "rgb",
56
- r: 226,
57
- g: 226,
58
- b: 226,
59
- alpha: 1
45
+ {
46
+ property: "borderLeftColor",
47
+ value: { type: "rgb", r: 226, g: 226, b: 226, alpha: 1 }
60
48
  }
61
- }
49
+ ]
62
50
  };
63
51
  const meta = {
64
52
  category: "typography",
@@ -66,7 +54,7 @@ const meta = {
66
54
  label: "Blockquote",
67
55
  Icon: BlockquoteIcon,
68
56
  presetStyle,
69
- children: ["Blockquote you can edit"]
57
+ children: [{ type: "text", value: "Blockquote you can edit" }]
70
58
  };
71
59
  const propsMeta = {
72
60
  props
@@ -2,28 +2,31 @@ import { BodyIcon } from "@webstudio-is/icons";
2
2
  import { body } from "../css/normalize";
3
3
  import { props } from "./__generated__/body.props";
4
4
  const presetStyle = {
5
- body: {
5
+ body: [
6
6
  ...body,
7
- minHeight: {
8
- type: "unit",
9
- unit: "%",
10
- value: 100
7
+ {
8
+ property: "minHeight",
9
+ value: { type: "unit", unit: "%", value: 100 }
11
10
  },
12
- fontFamily: {
13
- type: "keyword",
14
- value: "Arial"
11
+ {
12
+ property: "fontFamily",
13
+ value: { type: "keyword", value: "Arial" }
15
14
  },
16
- fontSize: {
17
- type: "unit",
18
- unit: "px",
19
- value: 14
15
+ {
16
+ property: "fontSize",
17
+ value: { type: "unit", unit: "px", value: 14 }
20
18
  },
21
- lineHeight: {
22
- type: "unit",
23
- unit: "number",
24
- value: 1.5
19
+ {
20
+ property: "lineHeight",
21
+ value: { type: "unit", unit: "number", value: 1.5 }
22
+ },
23
+ // temporary set root color
24
+ // until builder start to fallback "inherit" to black
25
+ {
26
+ property: "color",
27
+ value: { type: "keyword", value: "black" }
25
28
  }
26
- }
29
+ ]
27
30
  };
28
31
  const meta = {
29
32
  type: "container",
@@ -1,6 +1,6 @@
1
1
  import { ButtonElementIcon } from "@webstudio-is/icons";
2
- import { props } from "./__generated__/button.props";
3
2
  import { button } from "../css/normalize";
3
+ import { props } from "./__generated__/button.props";
4
4
  const presetStyle = {
5
5
  button
6
6
  };
@@ -2,38 +2,30 @@ import { CodeIcon } from "@webstudio-is/icons";
2
2
  import { displayVarNamespace } from "./code";
3
3
  import { props } from "./__generated__/code.props";
4
4
  import { code } from "../css/normalize";
5
- const display = {
6
- type: "var",
7
- value: displayVarNamespace,
8
- fallbacks: [
9
- {
10
- type: "keyword",
11
- value: "inline-block"
12
- }
13
- ]
14
- };
15
5
  const presetStyle = {
16
- code: {
6
+ code: [
17
7
  ...code,
18
- display,
19
- paddingLeft: {
20
- type: "unit",
21
- value: 0.2,
22
- unit: "em"
8
+ {
9
+ property: "display",
10
+ value: {
11
+ type: "var",
12
+ value: displayVarNamespace,
13
+ fallbacks: [{ type: "keyword", value: "inline-block" }]
14
+ }
23
15
  },
24
- paddingRight: {
25
- type: "unit",
26
- value: 0.2,
27
- unit: "em"
16
+ {
17
+ property: "paddingLeft",
18
+ value: { type: "unit", value: 0.2, unit: "em" }
19
+ },
20
+ {
21
+ property: "paddingRight",
22
+ value: { type: "unit", value: 0.2, unit: "em" }
28
23
  },
29
- backgroundColor: {
30
- type: "rgb",
31
- r: 238,
32
- g: 238,
33
- b: 238,
34
- alpha: 1
24
+ {
25
+ property: "backgroundColor",
26
+ value: { type: "rgb", r: 238, g: 238, b: 238, alpha: 1 }
35
27
  }
36
- }
28
+ ]
37
29
  };
38
30
  const meta = {
39
31
  category: "general",
@@ -41,7 +33,7 @@ const meta = {
41
33
  label: "Code",
42
34
  Icon: CodeIcon,
43
35
  presetStyle,
44
- children: ["Code you can edit"]
36
+ children: [{ type: "text", value: "Code you can edit" }]
45
37
  };
46
38
  const propsMeta = {
47
39
  props,
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { PropMeta } from "@webstudio-is/generate-arg-types";
3
+ import { WsEmbedTemplate } from "../embed-template";
3
4
  const WsComponentPropsMeta = z.object({
4
5
  props: z.record(PropMeta),
5
6
  initialProps: z.array(z.string()).optional()
@@ -32,7 +33,7 @@ const WsComponentMeta = z.object({
32
33
  Icon: z.function(),
33
34
  presetStyle: z.optional(z.any()),
34
35
  states: z.optional(z.array(ComponentState)),
35
- children: z.optional(z.array(z.string()))
36
+ children: z.optional(WsEmbedTemplate)
36
37
  });
37
38
  export {
38
39
  ComponentState,
@@ -2,21 +2,28 @@ import { FormIcon } from "@webstudio-is/icons";
2
2
  import { form } from "../css/normalize";
3
3
  import { props } from "./__generated__/form.props";
4
4
  const presetStyle = {
5
- form: {
5
+ form: [
6
6
  ...form,
7
- minHeight: {
8
- type: "unit",
9
- unit: "px",
10
- value: 20
7
+ {
8
+ property: "minHeight",
9
+ value: { type: "unit", unit: "px", value: 20 }
11
10
  }
12
- }
11
+ ]
13
12
  };
14
13
  const meta = {
15
14
  category: "forms",
16
15
  type: "container",
17
16
  label: "Form",
18
17
  Icon: FormIcon,
19
- presetStyle
18
+ presetStyle,
19
+ children: [
20
+ { type: "instance", component: "Input", children: [] },
21
+ {
22
+ type: "instance",
23
+ component: "Button",
24
+ children: [{ type: "text", value: "Submit" }]
25
+ }
26
+ ]
20
27
  };
21
28
  const propsMeta = {
22
29
  props
@@ -14,7 +14,7 @@ const meta = {
14
14
  type: "rich-text",
15
15
  label: "Heading",
16
16
  Icon: HeadingIcon,
17
- children: ["Heading you can edit"],
17
+ children: [{ type: "text", value: "Heading you can edit" }],
18
18
  presetStyle
19
19
  };
20
20
  const propsMeta = {
@@ -2,21 +2,20 @@ import { ImageIcon } from "@webstudio-is/icons";
2
2
  import { img } from "../css/normalize";
3
3
  import { props } from "./__generated__/image.props";
4
4
  const presetStyle = {
5
- img: {
5
+ img: [
6
6
  ...img,
7
7
  // Otherwise on new image insert onto canvas it can overfit screen size multiple times
8
- maxWidth: {
9
- type: "unit",
10
- unit: "%",
11
- value: 100
8
+ {
9
+ property: "maxWidth",
10
+ value: { type: "unit", unit: "%", value: 100 }
12
11
  },
13
12
  // inline | inline-block is not suitable because without line-height: 0 on the parent you get unsuitable spaces/margins
14
13
  // see https://stackoverflow.com/questions/24771194/is-the-margin-of-inline-block-4px-is-static-for-all-browsers
15
- display: {
16
- type: "keyword",
17
- value: "block"
14
+ {
15
+ property: "display",
16
+ value: { type: "keyword", value: "block" }
18
17
  }
19
- }
18
+ ]
20
19
  };
21
20
  const meta = {
22
21
  category: "media",
@@ -2,13 +2,13 @@ import { TextItalicIcon } from "@webstudio-is/icons";
2
2
  import { props } from "./__generated__/italic.props";
3
3
  import { i } from "../css/normalize";
4
4
  const presetStyle = {
5
- i: {
5
+ i: [
6
6
  ...i,
7
- fontStyle: {
8
- type: "keyword",
9
- value: "italic"
7
+ {
8
+ property: "fontStyle",
9
+ value: { type: "keyword", value: "italic" }
10
10
  }
11
- }
11
+ ]
12
12
  };
13
13
  const meta = {
14
14
  type: "rich-text-child",
@@ -3,13 +3,13 @@ import { props } from "./__generated__/link-block.props";
3
3
  import { meta as linkMeta, propsMeta as linkPropsMeta } from "./link.ws";
4
4
  import { a } from "../css/normalize";
5
5
  const presetStyle = {
6
- a: {
6
+ a: [
7
7
  ...a,
8
- display: {
9
- type: "keyword",
10
- value: "inline-block"
8
+ {
9
+ property: "display",
10
+ value: { type: "keyword", value: "inline-block" }
11
11
  }
12
- }
12
+ ]
13
13
  };
14
14
  const meta = {
15
15
  category: "general",
@@ -2,18 +2,17 @@ import { LinkIcon } from "@webstudio-is/icons";
2
2
  import { a } from "../css/normalize";
3
3
  import { props } from "./__generated__/link.props";
4
4
  const presetStyle = {
5
- a: {
5
+ a: [
6
6
  ...a,
7
- minHeight: {
8
- type: "unit",
9
- unit: "em",
10
- value: 1
7
+ {
8
+ property: "minHeight",
9
+ value: { type: "unit", unit: "em", value: 1 }
11
10
  },
12
- display: {
13
- type: "keyword",
14
- value: "inline-block"
11
+ {
12
+ property: "display",
13
+ value: { type: "keyword", value: "inline-block" }
15
14
  }
16
- }
15
+ ]
17
16
  };
18
17
  const meta = {
19
18
  category: "general",
@@ -22,7 +21,7 @@ const meta = {
22
21
  Icon: LinkIcon,
23
22
  presetStyle,
24
23
  states: [{ selector: "[aria-current=page]", label: "Current page" }],
25
- children: ["Link text you can edit"]
24
+ children: [{ type: "text", value: "Link text you can edit" }]
26
25
  };
27
26
  const propsMeta = {
28
27
  props: {
@@ -9,7 +9,7 @@ const meta = {
9
9
  type: "rich-text",
10
10
  label: "List Item",
11
11
  Icon: ListItemIcon,
12
- children: ["List Item you can edit"],
12
+ children: [{ type: "text", value: "List Item you can edit" }],
13
13
  presetStyle
14
14
  };
15
15
  const propsMeta = {
@@ -2,36 +2,36 @@ import { ListIcon } from "@webstudio-is/icons";
2
2
  import { props } from "./__generated__/list.props";
3
3
  import { ol, ul } from "../css/normalize";
4
4
  const presetStyle = {
5
- ol: {
5
+ ol: [
6
6
  ...ol,
7
- marginTop: {
8
- type: "keyword",
9
- value: "0"
7
+ {
8
+ property: "marginTop",
9
+ value: { type: "keyword", value: "0" }
10
10
  },
11
- marginBottom: {
12
- type: "keyword",
13
- value: "10px"
11
+ {
12
+ property: "marginBottom",
13
+ value: { type: "keyword", value: "10px" }
14
14
  },
15
- paddingLeft: {
16
- type: "keyword",
17
- value: "40px"
15
+ {
16
+ property: "paddingLeft",
17
+ value: { type: "keyword", value: "40px" }
18
18
  }
19
- },
20
- ul: {
19
+ ],
20
+ ul: [
21
21
  ...ul,
22
- marginTop: {
23
- type: "keyword",
24
- value: "0"
22
+ {
23
+ property: "marginTop",
24
+ value: { type: "keyword", value: "0" }
25
25
  },
26
- marginBottom: {
27
- type: "keyword",
28
- value: "10px"
26
+ {
27
+ property: "marginBottom",
28
+ value: { type: "keyword", value: "10px" }
29
29
  },
30
- paddingLeft: {
31
- type: "keyword",
32
- value: "40px"
30
+ {
31
+ property: "paddingLeft",
32
+ value: { type: "keyword", value: "40px" }
33
33
  }
34
- }
34
+ ]
35
35
  };
36
36
  const meta = {
37
37
  category: "typography",
@@ -9,7 +9,7 @@ const meta = {
9
9
  type: "rich-text",
10
10
  label: "Paragraph",
11
11
  Icon: TextAlignLeftIcon,
12
- children: ["Pragraph you can edit"],
12
+ children: [{ type: "text", value: "Pragraph you can edit" }],
13
13
  presetStyle
14
14
  };
15
15
  const propsMeta = {
@@ -2,33 +2,33 @@ import { DashIcon } from "@webstudio-is/icons";
2
2
  import { props } from "./__generated__/separator.props";
3
3
  import { hr } from "../css/normalize";
4
4
  const presetStyle = {
5
- hr: {
5
+ hr: [
6
6
  ...hr,
7
- height: {
8
- type: "keyword",
9
- value: "1px"
7
+ {
8
+ property: "height",
9
+ value: { type: "keyword", value: "1px" }
10
10
  },
11
- backgroundColor: {
12
- type: "keyword",
13
- value: "gray"
11
+ {
12
+ property: "backgroundColor",
13
+ value: { type: "keyword", value: "gray" }
14
14
  },
15
- borderTopStyle: {
16
- type: "keyword",
17
- value: "none"
15
+ {
16
+ property: "borderTopStyle",
17
+ value: { type: "keyword", value: "none" }
18
18
  },
19
- borderRightStyle: {
20
- type: "keyword",
21
- value: "none"
19
+ {
20
+ property: "borderRightStyle",
21
+ value: { type: "keyword", value: "none" }
22
22
  },
23
- borderLeftStyle: {
24
- type: "keyword",
25
- value: "none"
23
+ {
24
+ property: "borderLeftStyle",
25
+ value: { type: "keyword", value: "none" }
26
26
  },
27
- borderBottomStyle: {
28
- type: "keyword",
29
- value: "none"
27
+ {
28
+ property: "borderBottomStyle",
29
+ value: { type: "keyword", value: "none" }
30
30
  }
31
- }
31
+ ]
32
32
  };
33
33
  const meta = {
34
34
  category: "general",
@@ -2,14 +2,13 @@ import { TextBlockIcon } from "@webstudio-is/icons";
2
2
  import { props } from "./__generated__/text-block.props";
3
3
  import { div } from "../css/normalize";
4
4
  const presetStyle = {
5
- div: {
5
+ div: [
6
6
  ...div,
7
- minHeight: {
8
- type: "unit",
9
- unit: "em",
10
- value: 1
7
+ {
8
+ property: "minHeight",
9
+ value: { type: "unit", unit: "em", value: 1 }
11
10
  }
12
- }
11
+ ]
13
12
  };
14
13
  const meta = {
15
14
  category: "typography",
@@ -17,7 +16,7 @@ const meta = {
17
16
  label: "Text Block",
18
17
  Icon: TextBlockIcon,
19
18
  presetStyle,
20
- children: ["Block of text you can edit"]
19
+ children: [{ type: "text", value: "Block of text you can edit" }]
21
20
  };
22
21
  const propsMeta = {
23
22
  props
package/lib/css/css.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { createCssEngine } from "@webstudio-is/css-engine";
2
2
  import { getComponentNames } from "../components/components-utils";
3
3
  import { getComponentMeta } from "../components";
4
- import { componentAttribute, idAttribute } from "../tree";
4
+ import { idAttribute } from "../tree";
5
5
  import { addGlobalRules } from "./global-rules";
6
- import { getStyleRules } from "./style-rules";
6
+ import { getPresetStyleRules, getStyleRules } from "./style-rules";
7
7
  const createImageValueTransformer = (assets, options) => (styleValue) => {
8
8
  if (styleValue.type === "image" && styleValue.value.type === "asset") {
9
9
  const asset = assets.get(styleValue.value.value);
@@ -40,15 +40,12 @@ const generateCssText = (data, options) => {
40
40
  for (const component of getComponentNames()) {
41
41
  const meta = getComponentMeta(component);
42
42
  const presetStyle = meta?.presetStyle;
43
- if (presetStyle !== void 0) {
44
- for (const [tag, style] of Object.entries(presetStyle)) {
45
- engine.addStyleRule(
46
- `${tag}:where([${componentAttribute}=${component}])`,
47
- {
48
- style
49
- }
50
- );
51
- }
43
+ if (presetStyle === void 0) {
44
+ continue;
45
+ }
46
+ const rules = getPresetStyleRules(component, presetStyle);
47
+ for (const [selector, style] of rules) {
48
+ engine.addStyleRule(selector, { style });
52
49
  }
53
50
  }
54
51
  const styleRules = getStyleRules(styles, styleSourceSelections);