@developer_tribe/react-builder 1.2.8 → 1.2.9

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 (191) hide show
  1. package/dist/AttributesEditor.d.ts +2 -11
  2. package/dist/attribute-analyser/style/native/useExtractImageStyle.d.ts +10 -0
  3. package/dist/attribute-analyser/style/native/useExtractTextStyle.d.ts +9 -0
  4. package/dist/attribute-analyser/style/native/useExtractViewStyle.d.ts +8 -0
  5. package/dist/attribute-analyser/style/web/useExtractImageStyle.d.ts +4 -0
  6. package/dist/attribute-analyser/style/web/useExtractTextStyle.d.ts +4 -0
  7. package/dist/attribute-analyser/style/web/useExtractViewStyle.d.ts +4 -0
  8. package/dist/attributes-editor/AttributesEditorFields.d.ts +18 -0
  9. package/dist/attributes-editor/AttributesEditorView.d.ts +4 -0
  10. package/dist/attributes-editor/attributesEditorModelTypes.d.ts +67 -0
  11. package/dist/attributes-editor/attributesEditorUtils.d.ts +19 -0
  12. package/dist/attributes-editor/useAttributesEditorModel.d.ts +2 -0
  13. package/dist/build-components/BIcon/BIconProps.generated.d.ts +6 -6
  14. package/dist/build-components/BackgroundImage/BackgroundImageProps.generated.d.ts +3 -3
  15. package/dist/build-components/Button/ButtonProps.generated.d.ts +1 -1
  16. package/dist/build-components/Carousel/CarouselProps.generated.d.ts +2 -2
  17. package/dist/build-components/CarouselButtons/CarouselButtonsProps.generated.d.ts +4 -4
  18. package/dist/build-components/CarouselDots/CarouselDotsProps.generated.d.ts +3 -3
  19. package/dist/build-components/CarouselItem/CarouselItemProps.generated.d.ts +1 -1
  20. package/dist/build-components/CarouselProvider/CarouselProviderProps.generated.d.ts +1 -1
  21. package/dist/build-components/Image/ImageProps.generated.d.ts +5 -3
  22. package/dist/build-components/Main/MainProps.generated.d.ts +2 -2
  23. package/dist/build-components/Onboard/OnboardProps.generated.d.ts +1 -1
  24. package/dist/build-components/OnboardButton/OnboardButtonProps.generated.d.ts +9 -8
  25. package/dist/build-components/OnboardButtons/OnboardButtonsProps.generated.d.ts +11 -11
  26. package/dist/build-components/OnboardDot/OnboardDotProps.generated.d.ts +15 -9
  27. package/dist/build-components/OnboardFooter/OnboardFooterProps.generated.d.ts +10 -10
  28. package/dist/build-components/OnboardImage/OnboardImageProps.generated.d.ts +8 -6
  29. package/dist/build-components/OnboardItem/OnboardItemProps.generated.d.ts +6 -3
  30. package/dist/build-components/OnboardProvider/OnboardProviderProps.generated.d.ts +5 -4
  31. package/dist/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.d.ts +3 -3
  32. package/dist/build-components/OnboardTitle/OnboardTitleProps.generated.d.ts +3 -3
  33. package/dist/build-components/PaywallBackground/PaywallBackgroundProps.generated.d.ts +1 -1
  34. package/dist/build-components/PaywallCloseButton/PaywallCloseButtonProps.generated.d.ts +6 -6
  35. package/dist/build-components/PaywallOptions/PaywallOptionsProps.generated.d.ts +1 -1
  36. package/dist/build-components/PaywallProvider/PaywallProviderProps.generated.d.ts +1 -1
  37. package/dist/build-components/PaywallSubscribeButton/PaywallSubscribeButtonProps.generated.d.ts +1 -1
  38. package/dist/build-components/RadioButton/RadioButtonProps.generated.d.ts +4 -4
  39. package/dist/build-components/Text/TextProps.generated.d.ts +3 -3
  40. package/dist/build-components/View/ViewProps.generated.d.ts +1 -1
  41. package/dist/build-components/patterns.generated.d.ts +2690 -5804
  42. package/dist/index.cjs.js +5 -5
  43. package/dist/index.cjs.js.map +1 -1
  44. package/dist/index.d.ts +4 -0
  45. package/dist/index.esm.js +5 -5
  46. package/dist/index.esm.js.map +1 -1
  47. package/dist/index.native.cjs.js +6 -4
  48. package/dist/index.native.cjs.js.map +1 -1
  49. package/dist/index.native.d.ts +5 -6
  50. package/dist/index.native.esm.js +6 -4
  51. package/dist/index.native.esm.js.map +1 -1
  52. package/dist/migrations/migratePipe.d.ts +1 -1
  53. package/dist/migrations/migrations/1.1.2_extract_component_attributes_from_style.d.ts +2 -0
  54. package/dist/mockOS/components/PermissionModal.d.ts +1 -2
  55. package/dist/styles.css +1 -1
  56. package/dist/types/PreviewConfig.d.ts +1 -5
  57. package/dist/utils/getMeta.d.ts +5 -0
  58. package/dist/utils/patterns.d.ts +12 -0
  59. package/package.json +2 -1
  60. package/scripts/prebuild/prebuild.js +14 -0
  61. package/scripts/prebuild/utils/createGeneratedProps.js +19 -13
  62. package/scripts/prebuild/utils/index.js +1 -0
  63. package/scripts/prebuild/utils/updateMetaJson.js +66 -0
  64. package/scripts/prebuild/utils/validateAllComponentsOrThrow.js +37 -3
  65. package/scripts/prebuild/utils/validatePatternJson.js +27 -2
  66. package/scripts/public/scripts/build/index.js +20 -3
  67. package/scripts/public/scripts/build/info.json +6 -0
  68. package/scripts/public/scripts/build/utils/createComponentsIndex.js +9 -3
  69. package/scripts/public/scripts/build/utils/createRenderNodeGenerated.js +66 -8
  70. package/src/AttributesEditor.tsx +8 -944
  71. package/src/assets/meta.json +4 -0
  72. package/src/assets/samples/carousel-sample.json +1 -1
  73. package/src/assets/samples/getSamples.ts +2 -0
  74. package/src/assets/samples/paywall-1.json +11 -7
  75. package/src/assets/samples/simple-1.json +3 -3
  76. package/src/assets/samples/simple-2.json +3 -3
  77. package/src/assets/samples/unmigrated-builder-1.1.1.json +87 -0
  78. package/src/assets/samples/unmigrated-builder1.json +1 -1
  79. package/src/assets/samples/unvalidated-builder1.json +3 -3
  80. package/src/assets/samples/unvalidated-crash1.json +1 -1
  81. package/src/assets/samples/unvalidated-crashcomponent1.json +1 -1
  82. package/src/assets/samples/vpn-onboard-1.json +1 -1
  83. package/src/assets/samples/vpn-onboard-2.json +1 -1
  84. package/src/assets/samples/vpn-onboard-3.json +1 -1
  85. package/src/assets/samples/vpn-onboard-4.json +1 -1
  86. package/src/assets/samples/vpn-onboard-5.json +1 -1
  87. package/src/assets/samples/vpn-onboard-6.json +1 -1
  88. package/src/attribute-analyser/style/native/useExtractImageStyle.ts +46 -0
  89. package/src/attribute-analyser/style/native/useExtractTextStyle.ts +50 -0
  90. package/src/attribute-analyser/style/native/useExtractViewStyle.ts +32 -0
  91. package/src/attribute-analyser/style/web/useExtractImageStyle.ts +20 -0
  92. package/src/attribute-analyser/style/web/useExtractTextStyle.ts +27 -0
  93. package/src/attribute-analyser/style/web/useExtractViewStyle.ts +20 -0
  94. package/src/attributes-editor/AttributesEditorFields.tsx +248 -0
  95. package/src/attributes-editor/AttributesEditorView.tsx +360 -0
  96. package/src/attributes-editor/attributesEditorModelTypes.ts +86 -0
  97. package/src/attributes-editor/attributesEditorUtils.ts +102 -0
  98. package/src/attributes-editor/useAttributesEditorModel.ts +477 -0
  99. package/src/build-components/BIcon/BIcon.tsx +4 -4
  100. package/src/build-components/BIcon/BIconProps.generated.ts +6 -6
  101. package/src/build-components/BIcon/pattern.json +5 -6
  102. package/src/build-components/BackgroundImage/BackgroundImage.tsx +3 -2
  103. package/src/build-components/BackgroundImage/BackgroundImageProps.generated.ts +3 -3
  104. package/src/build-components/Button/Button.tsx +2 -2
  105. package/src/build-components/Button/ButtonProps.generated.ts +1 -1
  106. package/src/build-components/Button/pattern.json +17 -15
  107. package/src/build-components/Carousel/Carousel.tsx +1 -1
  108. package/src/build-components/Carousel/CarouselProps.generated.ts +2 -2
  109. package/src/build-components/CarouselButtons/CarouselButtons.tsx +4 -7
  110. package/src/build-components/CarouselButtons/CarouselButtonsProps.generated.ts +7 -7
  111. package/src/build-components/CarouselButtons/pattern.json +2 -1
  112. package/src/build-components/CarouselDots/CarouselDots.tsx +2 -2
  113. package/src/build-components/CarouselDots/CarouselDotsProps.generated.ts +9 -9
  114. package/src/build-components/CarouselItem/CarouselItem.tsx +1 -1
  115. package/src/build-components/CarouselItem/CarouselItemProps.generated.ts +1 -1
  116. package/src/build-components/CarouselProvider/CarouselProvider.tsx +1 -1
  117. package/src/build-components/CarouselProvider/CarouselProviderProps.generated.ts +1 -1
  118. package/src/build-components/Image/Image.tsx +1 -1
  119. package/src/build-components/Image/ImageProps.generated.ts +5 -3
  120. package/src/build-components/Image/pattern.json +10 -9
  121. package/src/build-components/Main/Main.tsx +2 -2
  122. package/src/build-components/Main/MainProps.generated.ts +2 -2
  123. package/src/build-components/Main/pattern.json +2 -1
  124. package/src/build-components/Onboard/OnboardProps.generated.ts +1 -1
  125. package/src/build-components/OnboardButton/OnboardButton.tsx +7 -6
  126. package/src/build-components/OnboardButton/OnboardButtonProps.generated.ts +14 -13
  127. package/src/build-components/OnboardButton/pattern.json +9 -7
  128. package/src/build-components/OnboardButtons/OnboardButtons.tsx +31 -31
  129. package/src/build-components/OnboardButtons/OnboardButtonsProps.generated.ts +14 -14
  130. package/src/build-components/OnboardButtons/pattern.json +9 -7
  131. package/src/build-components/OnboardDot/OnboardDot.tsx +7 -6
  132. package/src/build-components/OnboardDot/OnboardDotProps.generated.ts +26 -9
  133. package/src/build-components/OnboardFooter/OnboardFooter.tsx +17 -16
  134. package/src/build-components/OnboardFooter/OnboardFooterProps.generated.ts +10 -10
  135. package/src/build-components/OnboardFooter/pattern.json +16 -14
  136. package/src/build-components/OnboardImage/OnboardImage.tsx +8 -8
  137. package/src/build-components/OnboardImage/OnboardImageProps.generated.ts +8 -6
  138. package/src/build-components/OnboardImage/pattern.json +2 -1
  139. package/src/build-components/OnboardItem/OnboardItem.tsx +1 -1
  140. package/src/build-components/OnboardItem/OnboardItemProps.generated.ts +6 -3
  141. package/src/build-components/OnboardItem/pattern.json +2 -1
  142. package/src/build-components/OnboardProvider/OnboardProvider.tsx +1 -1
  143. package/src/build-components/OnboardProvider/OnboardProviderProps.generated.ts +5 -4
  144. package/src/build-components/OnboardProvider/pattern.json +2 -1
  145. package/src/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.ts +3 -3
  146. package/src/build-components/OnboardTitle/OnboardTitleProps.generated.ts +3 -3
  147. package/src/build-components/PaywallBackground/PaywallBackground.tsx +1 -1
  148. package/src/build-components/PaywallBackground/PaywallBackgroundProps.generated.ts +1 -1
  149. package/src/build-components/PaywallCloseButton/PaywallCloseButton.tsx +5 -4
  150. package/src/build-components/PaywallCloseButton/PaywallCloseButtonProps.generated.ts +6 -6
  151. package/src/build-components/PaywallOptions/PaywallOptionButton.tsx +1 -1
  152. package/src/build-components/PaywallOptions/PaywallOptionsProps.generated.ts +1 -1
  153. package/src/build-components/PaywallProvider/PaywallProvider.tsx +1 -1
  154. package/src/build-components/PaywallProvider/PaywallProviderProps.generated.ts +1 -1
  155. package/src/build-components/PaywallSubscribeButton/PaywallSubscribeButton.tsx +1 -1
  156. package/src/build-components/PaywallSubscribeButton/PaywallSubscribeButtonProps.generated.ts +1 -1
  157. package/src/build-components/RadioButton/RadioButton.tsx +5 -5
  158. package/src/build-components/RadioButton/RadioButtonProps.generated.ts +4 -4
  159. package/src/build-components/RadioButton/pattern.json +9 -7
  160. package/src/build-components/Text/Text.tsx +6 -6
  161. package/src/build-components/Text/TextProps.generated.ts +3 -3
  162. package/src/build-components/Text/pattern.json +15 -11
  163. package/src/build-components/View/View.tsx +1 -1
  164. package/src/build-components/View/ViewProps.generated.ts +1 -1
  165. package/src/build-components/View/pattern.json +71 -66
  166. package/src/build-components/patterns.generated.ts +3059 -6008
  167. package/src/components/AttributesEditorPanel.tsx +2 -2
  168. package/src/index.native.ts +6 -9
  169. package/src/index.ts +4 -0
  170. package/src/migrations/migratePipe.ts +7 -3
  171. package/src/migrations/migrations/1.1.2_extract_component_attributes_from_style.ts +211 -0
  172. package/src/mockOS/components/MockOSRouter.tsx +3 -1
  173. package/src/mockOS/components/PermissionModal.tsx +20 -160
  174. package/src/mockOS/components/SubscriptionModal.tsx +41 -278
  175. package/src/pages/ProjectPage.tsx +12 -6
  176. package/src/styles/components/_attributes-editor.scss +122 -0
  177. package/src/styles/components/_mockos-router.scss +388 -0
  178. package/src/styles/components/_onboard.scss +23 -0
  179. package/src/styles/index.scss +1 -0
  180. package/src/types/PreviewConfig.ts +1 -5
  181. package/src/utils/analyseNodeByPatterns.ts +39 -4
  182. package/src/utils/extractTextStyle/extractTextStyle.ts +4 -1
  183. package/src/utils/getMeta.ts +15 -0
  184. package/src/utils/patterns.ts +47 -4
  185. package/dist/hooks/useExtractImageStyle.d.ts +0 -5
  186. package/dist/hooks/useExtractTextStyle.d.ts +0 -3
  187. package/dist/hooks/useExtractViewStyle.d.ts +0 -3
  188. package/src/hooks/useExtractImageStyle.ts +0 -30
  189. package/src/hooks/useExtractTextStyle.ts +0 -34
  190. package/src/hooks/useExtractViewStyle.ts +0 -30
  191. package/src/migrations/migrations/1.1.0_normalize_style_attributes.ts +0 -80
@@ -1,4 +1,4 @@
1
- import React, { useContext, useEffect, useId, useState } from 'react';
1
+ import React, { useContext, useEffect, useId, useMemo, useState } from 'react';
2
2
  import type { Node } from '../../types/Node';
3
3
  import type { OnboardButtonsComponentProps } from './OnboardButtonsProps.generated';
4
4
  import { onboardContext } from '../OnboardProvider/OnboardProvider';
@@ -6,7 +6,7 @@ import RenderNode from '../RenderNode.generated';
6
6
  import useNode from '../useNode';
7
7
  import { useBuilderParams } from '../../components/BuilderProvider';
8
8
  import { useLogRender } from '../../utils/useLogRender';
9
- import { useExtractViewStyle } from '../../hooks/useExtractViewStyle';
9
+ import { useExtractViewStyle } from '../../attribute-analyser/style/web/useExtractViewStyle';
10
10
 
11
11
  function OnboardButtons({ node }: OnboardButtonsComponentProps) {
12
12
  useLogRender('OnboardButtons');
@@ -26,19 +26,31 @@ function OnboardButtons({ node }: OnboardButtonsComponentProps) {
26
26
  }
27
27
  }, [ctx.selectedIndex]);
28
28
 
29
+ const attributes = node.attributes as any;
30
+ const styleBag = attributes?.style as Record<string, unknown> | undefined as
31
+ | Record<string, unknown>
32
+ | undefined;
29
33
  const direction =
30
- node.attributes?.style?.buttons_direction === 'column' ? 'column' : 'row';
34
+ (attributes?.buttons_direction ?? (styleBag as any)?.buttons_direction) ===
35
+ 'column'
36
+ ? 'column'
37
+ : 'row';
31
38
  const seperatorColor =
32
- node.attributes?.style?.seperatorColor ?? seperatorColorDefault;
39
+ attributes?.seperatorColor ??
40
+ (styleBag as any)?.seperatorColor ??
41
+ seperatorColorDefault;
42
+ const buttonsClassName =
43
+ direction === 'column'
44
+ ? 'onboard__buttons onboard__buttons--column'
45
+ : 'onboard__buttons onboard__buttons--row';
33
46
 
34
- const renderChildren = () => {
35
- if (Array.isArray(node.children)) {
36
- return (node.children as Node[]).map((child, idx) => (
37
- <RenderNode key={idx} node={child} />
38
- ));
47
+ const children = useMemo(() => {
48
+ const raw = node.children as unknown;
49
+ if (Array.isArray(raw)) {
50
+ return raw as Node[];
39
51
  }
40
- return <RenderNode node={node.children as Node} />;
41
- };
52
+ return [raw as Node];
53
+ }, [node.children]);
42
54
 
43
55
  const viewStyle = useExtractViewStyle(node);
44
56
 
@@ -47,8 +59,9 @@ function OnboardButtons({ node }: OnboardButtonsComponentProps) {
47
59
  const generatedId = useId();
48
60
 
49
61
  // New condition logic: hide when condition is carousel-index and does not match
50
- const condition = (node.attributes?.style as any)?.condition;
51
- const conditionVariable = (node.attributes?.style as any)?.conditionVariable;
62
+ const condition = attributes?.condition ?? (styleBag as any)?.condition;
63
+ const conditionVariable =
64
+ attributes?.conditionVariable ?? (styleBag as any)?.conditionVariable;
52
65
  const shouldHide =
53
66
  condition === 'carousel-index' &&
54
67
  typeof conditionVariable === 'number' &&
@@ -66,25 +79,12 @@ function OnboardButtons({ node }: OnboardButtonsComponentProps) {
66
79
  >
67
80
  <div
68
81
  className="onboard__separator"
69
- style={{
70
- height: 1,
71
- backgroundColor: seperatorColor,
72
- width: '100%',
73
- }}
82
+ style={seperatorColor ? { backgroundColor: seperatorColor } : undefined}
74
83
  />
75
- <div
76
- className="onboard__buttons"
77
- style={{
78
- display: 'flex',
79
- flexDirection: direction as any,
80
- height: 40,
81
- gap: 12,
82
- alignItems: 'center',
83
- justifyContent: 'center',
84
- margin: '12px 24px',
85
- }}
86
- >
87
- {renderChildren()}
84
+ <div className={buttonsClassName}>
85
+ {children.map((child, idx) => (
86
+ <RenderNode key={(child as any)?.key ?? idx} node={child} />
87
+ ))}
88
88
  </div>
89
89
  </div>
90
90
  );
@@ -2,6 +2,12 @@
2
2
 
3
3
  import type { NodeData } from '../../types/Node';
4
4
 
5
+ export type ButtonTypeOptionType =
6
+ | 'previous_button'
7
+ | 'next_button'
8
+ | 'skip_button';
9
+ export type ButtonsDirectionOptionType = 'row' | 'column';
10
+ export type ConditionOptionType = 'carousel-index';
5
11
  export type FlexDirectionOptionType = 'row' | 'column';
6
12
  export type AlignItemsOptionType =
7
13
  | 'flex-start'
@@ -17,15 +23,8 @@ export type JustifyContentOptionType =
17
23
  | 'space-around'
18
24
  | 'space-evenly';
19
25
  export type PositionOptionType = 'relative' | 'absolute';
20
- export type ButtonTypeOptionType =
21
- | 'previous_button'
22
- | 'next_button'
23
- | 'skip_button';
24
- export type ButtonsDirectionOptionType = 'row' | 'column';
25
- export type ConditionOptionType = 'carousel-index';
26
26
 
27
27
  export interface OnboardButtonsStyleGenerated {
28
- scrollable?: boolean;
29
28
  flexDirection?: FlexDirectionOptionType;
30
29
  alignItems?: AlignItemsOptionType;
31
30
  justifyContent?: JustifyContentOptionType;
@@ -59,19 +58,20 @@ export interface OnboardButtonsStyleGenerated {
59
58
  left?: string;
60
59
  right?: string;
61
60
  zIndex?: number;
62
- buttonType?: ButtonTypeOptionType;
63
- skipNumber?: number;
64
- buttons_direction?: ButtonsDirectionOptionType;
65
- forIndex?: number;
66
- seperatorColor?: string;
67
- condition?: ConditionOptionType;
68
- conditionVariable?: number;
69
61
  }
70
62
 
71
63
  export interface OnboardButtonsPropsGenerated {
72
64
  child: string;
73
65
  attributes: {
74
66
  style?: OnboardButtonsStyleGenerated;
67
+ scrollable?: boolean;
68
+ buttonType?: ButtonTypeOptionType;
69
+ skipNumber?: number;
70
+ buttons_direction?: ButtonsDirectionOptionType;
71
+ forIndex?: number;
72
+ seperatorColor?: string;
73
+ condition?: ConditionOptionType;
74
+ conditionVariable?: number;
75
75
  };
76
76
  }
77
77
 
@@ -30,6 +30,15 @@
30
30
  "label": "Onboard Buttons",
31
31
  "description": "Wrapper for onboarding button set.",
32
32
  "styles": {
33
+ "seperatorColor": {
34
+ "label": "Seperator Color",
35
+ "description": "Color of the divider line.",
36
+ "category": "style",
37
+ "specialCategory": null,
38
+ "sort": 5
39
+ }
40
+ },
41
+ "attributes": {
33
42
  "buttonType": {
34
43
  "label": "Button Type",
35
44
  "description": "Which onboard button to show.",
@@ -58,13 +67,6 @@
58
67
  "specialCategory": null,
59
68
  "sort": 4
60
69
  },
61
- "seperatorColor": {
62
- "label": "Seperator Color",
63
- "description": "Color of the divider line.",
64
- "category": "style",
65
- "specialCategory": null,
66
- "sort": 5
67
- },
68
70
  "condition": {
69
71
  "label": "Condition",
70
72
  "description": "Built-in condition to check.",
@@ -3,7 +3,7 @@ import type { OnboardDotComponentProps } from './OnboardDotProps.generated';
3
3
  import { onboardContext } from '../OnboardProvider/OnboardProvider';
4
4
  import useNode from '../useNode';
5
5
  import { useLogRender } from '../../utils/useLogRender';
6
- import { useExtractViewStyle } from '../../hooks/useExtractViewStyle';
6
+ import { useExtractViewStyle } from '../../attribute-analyser/style/web/useExtractViewStyle';
7
7
  import { useBuilderParams } from '../../components/BuilderProvider';
8
8
  import { isNodeSelected, SELECTED_OUTLINE_STYLE } from '../../utils/selection';
9
9
  import { useMergedStyle } from '../../utils/useMergedStyle';
@@ -19,8 +19,9 @@ function OnboardDot({ node }: OnboardDotComponentProps) {
19
19
  const generatedId = useId();
20
20
  const attributeName = node.type ?? 'OnboardDot';
21
21
  const attributeKey = node.key ?? generatedId;
22
- const styleBag = node.attributes?.style;
23
- const dotType = styleBag?.dotType || 'normal_dot';
22
+ const attrs = node.attributes;
23
+ const styleBag = attrs?.style;
24
+ const dotType = attrs?.dotType || 'normal_dot';
24
25
  const GHOST_DOT_DARK_COLOR = '#E4E5E7';
25
26
  const GHOST_DOT_LIGHT_COLOR = '#F7F7F9';
26
27
  const {
@@ -36,8 +37,8 @@ function OnboardDot({ node }: OnboardDotComponentProps) {
36
37
  const inactiveDotColor = isDark
37
38
  ? GHOST_DOT_DARK_COLOR
38
39
  : GHOST_DOT_LIGHT_COLOR;
39
- const inactiveDotOpacity = styleBag?.inactive_dot_opacity ?? 0.3;
40
- const activeDotColor = styleBag?.active_dot_color;
40
+ const inactiveDotOpacity = attrs?.inactive_dot_opacity ?? 0.3;
41
+ const activeDotColor = attrs?.active_dot_color;
41
42
  const resolvedActiveDotColor = useMemo(
42
43
  () => parseColor(activeDotColor, { theme: appConfig.theme, projectColors }),
43
44
  [activeDotColor, appConfig.theme, projectColors],
@@ -57,7 +58,7 @@ function OnboardDot({ node }: OnboardDotComponentProps) {
57
58
  baseStyle,
58
59
  isSelected ? SELECTED_OUTLINE_STYLE : undefined,
59
60
  );
60
- const expandingDotWidthRaw = styleBag?.expanding_dot_width;
61
+ const expandingDotWidthRaw = attrs?.expanding_dot_width;
61
62
  const expandingDotWidthOverride = useMemo(() => {
62
63
  const parsed = parseSize(expandingDotWidthRaw);
63
64
  if (parsed === undefined) return undefined;
@@ -2,7 +2,6 @@
2
2
 
3
3
  import type { NodeData } from '../../types/Node';
4
4
 
5
- export type PositionOptionType = 'relative' | 'absolute';
6
5
  export type DotTypeOptionType =
7
6
  | 'expanding_dot'
8
7
  | 'normal_dot'
@@ -10,12 +9,26 @@ export type DotTypeOptionType =
10
9
  | 'sliding_border'
11
10
  | 'sliding_dot'
12
11
  | 'liquid_like';
12
+ export type FlexDirectionOptionType = 'row' | 'column';
13
+ export type AlignItemsOptionType =
14
+ | 'flex-start'
15
+ | 'center'
16
+ | 'flex-end'
17
+ | 'stretch'
18
+ | 'baseline';
19
+ export type JustifyContentOptionType =
20
+ | 'flex-start'
21
+ | 'center'
22
+ | 'flex-end'
23
+ | 'space-between'
24
+ | 'space-around'
25
+ | 'space-evenly';
26
+ export type PositionOptionType = 'relative' | 'absolute';
13
27
 
14
28
  export interface OnboardDotStyleGenerated {
15
- scrollable?: boolean;
16
- flexDirection?: never;
17
- alignItems?: never;
18
- justifyContent?: never;
29
+ flexDirection?: FlexDirectionOptionType;
30
+ alignItems?: AlignItemsOptionType;
31
+ justifyContent?: JustifyContentOptionType;
19
32
  gap?: string;
20
33
  padding?: string;
21
34
  paddingHorizontal?: string;
@@ -46,16 +59,20 @@ export interface OnboardDotStyleGenerated {
46
59
  left?: string;
47
60
  right?: string;
48
61
  zIndex?: number;
49
- dotType?: DotTypeOptionType;
50
- inactive_dot_opacity?: number;
51
- expanding_dot_width?: string;
52
- active_dot_color?: string;
53
62
  }
54
63
 
55
64
  export interface OnboardDotPropsGenerated {
56
65
  child: string;
57
66
  attributes: {
58
67
  style?: OnboardDotStyleGenerated;
68
+ scrollable?: boolean;
69
+ dotType?: DotTypeOptionType;
70
+ inactive_dot_opacity?: number;
71
+ expanding_dot_width?: string;
72
+ active_dot_color?: string;
73
+ flexDirection?: never;
74
+ alignItems?: never;
75
+ justifyContent?: never;
59
76
  };
60
77
  }
61
78
 
@@ -3,8 +3,8 @@ import type { OnboardFooterComponentProps } from './OnboardFooterProps.generated
3
3
  import useNode from '../useNode';
4
4
  import { useBuilderParams } from '../../components/BuilderProvider';
5
5
  import { parseSize } from '../../size-matters';
6
- import { useExtractTextStyle } from '../../hooks/useExtractTextStyle';
7
- import { useExtractViewStyle } from '../../hooks/useExtractViewStyle';
6
+ import { useExtractTextStyle } from '../../attribute-analyser/style/web/useExtractTextStyle';
7
+ import { useExtractViewStyle } from '../../attribute-analyser/style/web/useExtractViewStyle';
8
8
  import { useLogRender } from '../../utils/useLogRender';
9
9
  import { isNodeSelected } from '../../utils/selection';
10
10
  import { useMergedStyle } from '../../utils/useMergedStyle';
@@ -104,8 +104,9 @@ function OnboardFooter({ node }: OnboardFooterComponentProps) {
104
104
  const t = (key?: string) =>
105
105
  key ? (localication?.[defaultLanguage ?? 'en']?.[key] ?? key) : '';
106
106
 
107
- const styleBag = node?.attributes?.style;
108
- const text = t(styleBag?.textLocalizationKey);
107
+ const attrs = node?.attributes;
108
+ const styleBag = attrs?.style;
109
+ const text = t(attrs?.textLocalizationKey);
109
110
  const textStyle = useExtractTextStyle(node);
110
111
  const viewStyle = useExtractViewStyle(node);
111
112
 
@@ -142,18 +143,18 @@ function OnboardFooter({ node }: OnboardFooterComponentProps) {
142
143
  >
143
144
  {!!text &&
144
145
  (() => {
145
- const firstText = t(styleBag?.linkedWordFirstLocalizationKey);
146
- const secondText = t(styleBag?.linkedWordSecondLocalizationKey);
146
+ const firstText = t(attrs?.linkedWordFirstLocalizationKey);
147
+ const secondText = t(attrs?.linkedWordSecondLocalizationKey);
147
148
  const { segments, matchCount } = buildSegments(text, [
148
149
  {
149
150
  value: firstText,
150
- color: styleBag?.linkedWordFirstColor,
151
- page: (styleBag as any)?.linkedWordFirstPage,
151
+ color: attrs?.linkedWordFirstColor,
152
+ page: (attrs as any)?.linkedWordFirstPage,
152
153
  },
153
154
  {
154
155
  value: secondText,
155
- color: styleBag?.linkedWordSecondColor,
156
- page: (styleBag as any)?.linkedWordSecondPage,
156
+ color: attrs?.linkedWordSecondColor,
157
+ page: (attrs as any)?.linkedWordSecondPage,
157
158
  },
158
159
  ]);
159
160
 
@@ -182,21 +183,21 @@ function OnboardFooter({ node }: OnboardFooterComponentProps) {
182
183
  </p>
183
184
  {matchCount === 0 && (
184
185
  <div>
185
- {styleBag?.linkedWordFirstLocalizationKey && (
186
+ {attrs?.linkedWordFirstLocalizationKey && (
186
187
  <span
187
- style={linkStyle(styleBag?.linkedWordFirstColor)}
188
+ style={linkStyle(attrs?.linkedWordFirstColor)}
188
189
  onClick={() =>
189
- handleClick((styleBag as any)?.linkedWordFirstPage)
190
+ handleClick((attrs as any)?.linkedWordFirstPage)
190
191
  }
191
192
  >
192
193
  {firstText}
193
194
  </span>
194
195
  )}
195
- {styleBag?.linkedWordSecondLocalizationKey && (
196
+ {attrs?.linkedWordSecondLocalizationKey && (
196
197
  <span
197
- style={linkStyle(styleBag?.linkedWordSecondColor)}
198
+ style={linkStyle(attrs?.linkedWordSecondColor)}
198
199
  onClick={() =>
199
- handleClick((styleBag as any)?.linkedWordSecondPage)
200
+ handleClick((attrs as any)?.linkedWordSecondPage)
200
201
  }
201
202
  >
202
203
  {secondText}
@@ -25,9 +25,6 @@ export interface OnboardFooterStyleGenerated {
25
25
  fontFamily?: string;
26
26
  fontWeight?: string;
27
27
  textAlign?: TextAlignOptionType;
28
- adjustsFontSizeToFit?: boolean;
29
- showEllipsis?: boolean;
30
- scrollable?: boolean;
31
28
  flexDirection?: FlexDirectionOptionType;
32
29
  alignItems?: AlignItemsOptionType;
33
30
  justifyContent?: JustifyContentOptionType;
@@ -61,19 +58,22 @@ export interface OnboardFooterStyleGenerated {
61
58
  left?: string;
62
59
  right?: string;
63
60
  zIndex?: number;
64
- textLocalizationKey?: string;
65
- linkedWordFirstLocalizationKey?: string;
66
- linkedWordFirstColor?: string;
67
- linkedWordFirstPage?: string;
68
- linkedWordSecondLocalizationKey?: string;
69
- linkedWordSecondColor?: string;
70
- linkedWordSecondPage?: string;
71
61
  }
72
62
 
73
63
  export interface OnboardFooterPropsGenerated {
74
64
  child: string;
75
65
  attributes: {
76
66
  style?: OnboardFooterStyleGenerated;
67
+ adjustsFontSizeToFit?: boolean;
68
+ showEllipsis?: boolean;
69
+ scrollable?: boolean;
70
+ textLocalizationKey?: string;
71
+ linkedWordFirstLocalizationKey?: string;
72
+ linkedWordFirstColor?: string;
73
+ linkedWordFirstPage?: string;
74
+ linkedWordSecondLocalizationKey?: string;
75
+ linkedWordSecondColor?: string;
76
+ linkedWordSecondPage?: string;
77
77
  };
78
78
  }
79
79
 
@@ -26,6 +26,22 @@
26
26
  "label": "Onboard Footer",
27
27
  "description": "Footer text with optional links.",
28
28
  "styles": {
29
+ "linkedWordFirstColor": {
30
+ "label": "Linked Word First Color",
31
+ "description": "Color of the first linked word.",
32
+ "category": "style",
33
+ "specialCategory": null,
34
+ "sort": 3
35
+ },
36
+ "linkedWordSecondColor": {
37
+ "label": "Linked Word Second Color",
38
+ "description": "Color of the second linked word.",
39
+ "category": "style",
40
+ "specialCategory": null,
41
+ "sort": 6
42
+ }
43
+ },
44
+ "attributes": {
29
45
  "textLocalizationKey": {
30
46
  "label": "Text Localization Key",
31
47
  "description": "Localization key for the footer text.",
@@ -40,13 +56,6 @@
40
56
  "specialCategory": null,
41
57
  "sort": 2
42
58
  },
43
- "linkedWordFirstColor": {
44
- "label": "Linked Word First Color",
45
- "description": "Color of the first linked word.",
46
- "category": "style",
47
- "specialCategory": null,
48
- "sort": 3
49
- },
50
59
  "linkedWordFirstPage": {
51
60
  "label": "Linked Word First Page",
52
61
  "description": "Page opened by the first link.",
@@ -61,13 +70,6 @@
61
70
  "specialCategory": null,
62
71
  "sort": 5
63
72
  },
64
- "linkedWordSecondColor": {
65
- "label": "Linked Word Second Color",
66
- "description": "Color of the second linked word.",
67
- "category": "style",
68
- "specialCategory": null,
69
- "sort": 6
70
- },
71
73
  "linkedWordSecondPage": {
72
74
  "label": "Linked Word Second Page",
73
75
  "description": "Page opened by the second link.",
@@ -5,7 +5,7 @@ import type { ImageComponentProps } from '../Image/ImageProps.generated';
5
5
  import useNode from '../useNode';
6
6
  import Lottie from 'lottie-react';
7
7
  import { useLogRender } from '../../utils/useLogRender';
8
- import { useExtractViewStyle } from '../../hooks/useExtractViewStyle';
8
+ import { useExtractViewStyle } from '../../attribute-analyser/style/web/useExtractViewStyle';
9
9
 
10
10
  function OnboardImage({ node }: OnboardImageComponentProps) {
11
11
  useLogRender('OnboardImage');
@@ -15,17 +15,17 @@ function OnboardImage({ node }: OnboardImageComponentProps) {
15
15
  const attributeKey = node.key ?? generatedId;
16
16
  const [lottie, setLottie] = useState<string | null>(null);
17
17
  const viewStyle = useExtractViewStyle(node);
18
- const styleBag = node.attributes?.style;
18
+ const attrs = node.attributes;
19
19
 
20
20
  useEffect(() => {
21
- if (styleBag?.lottie) {
22
- fetch(styleBag?.lottie)
21
+ if (attrs?.lottie) {
22
+ fetch(attrs?.lottie)
23
23
  .then((res) => res.json())
24
24
  .then((data) => setLottie(data));
25
25
  }
26
- }, [styleBag?.lottie]);
26
+ }, [attrs?.lottie]);
27
27
 
28
- if (styleBag?.video_url) {
28
+ if (attrs?.video_url) {
29
29
  return (
30
30
  <video
31
31
  attribute-name={attributeName}
@@ -33,13 +33,13 @@ function OnboardImage({ node }: OnboardImageComponentProps) {
33
33
  autoPlay
34
34
  muted
35
35
  loop
36
- src={styleBag?.video_url}
36
+ src={attrs?.video_url}
37
37
  style={viewStyle}
38
38
  />
39
39
  );
40
40
  }
41
41
 
42
- if (styleBag?.lottie) {
42
+ if (attrs?.lottie) {
43
43
  if (lottie) {
44
44
  return (
45
45
  <div
@@ -20,10 +20,6 @@ export type JustifyContentOptionType =
20
20
  export type PositionOptionType = 'relative' | 'absolute';
21
21
 
22
22
  export interface OnboardImageStyleGenerated {
23
- width?: string;
24
- height?: string;
25
- resizeMode?: ResizeModeOptionType;
26
- scrollable?: boolean;
27
23
  flexDirection?: FlexDirectionOptionType;
28
24
  alignItems?: AlignItemsOptionType;
29
25
  justifyContent?: JustifyContentOptionType;
@@ -44,8 +40,10 @@ export interface OnboardImageStyleGenerated {
44
40
  marginRight?: string;
45
41
  backgroundColor?: string;
46
42
  borderRadius?: string;
43
+ width?: string;
47
44
  minWidth?: string;
48
45
  maxWidth?: string;
46
+ height?: string;
49
47
  minHeight?: string;
50
48
  maxHeight?: string;
51
49
  flex?: number;
@@ -55,8 +53,6 @@ export interface OnboardImageStyleGenerated {
55
53
  left?: string;
56
54
  right?: string;
57
55
  zIndex?: number;
58
- video_url?: string;
59
- lottie?: string;
60
56
  }
61
57
 
62
58
  export interface OnboardImagePropsGenerated {
@@ -64,6 +60,12 @@ export interface OnboardImagePropsGenerated {
64
60
  attributes: {
65
61
  style?: OnboardImageStyleGenerated;
66
62
  src?: string;
63
+ width?: string;
64
+ height?: string;
65
+ resizeMode?: ResizeModeOptionType;
66
+ scrollable?: boolean;
67
+ video_url?: string;
68
+ lottie?: string;
67
69
  };
68
70
  }
69
71
 
@@ -17,7 +17,8 @@
17
17
  ],
18
18
  "label": "Onboard Image",
19
19
  "description": "Onboarding hero image with media.",
20
- "styles": {
20
+ "styles": {},
21
+ "attributes": {
21
22
  "video_url": {
22
23
  "label": "Video Url",
23
24
  "description": "URL for the onboarding video.",
@@ -3,7 +3,7 @@ import type { OnboardItemComponentProps } from './OnboardItemProps.generated';
3
3
  import useNode from '../useNode';
4
4
  import RenderNode from '../RenderNode.generated';
5
5
  import { useLogRender } from '../../utils/useLogRender';
6
- import { useExtractViewStyle } from '../../hooks/useExtractViewStyle';
6
+ import { useExtractViewStyle } from '../../attribute-analyser/style/web/useExtractViewStyle';
7
7
 
8
8
  function OnboardItem({ node }: OnboardItemComponentProps) {
9
9
  useLogRender('OnboardItem');
@@ -2,6 +2,7 @@
2
2
 
3
3
  import type { NodeData } from '../../types/Node';
4
4
 
5
+ export type DisplayOptionType = 'flex' | 'block';
5
6
  export type FlexDirectionOptionType = 'row' | 'column';
6
7
  export type AlignItemsOptionType =
7
8
  | 'flex-start'
@@ -17,10 +18,8 @@ export type JustifyContentOptionType =
17
18
  | 'space-around'
18
19
  | 'space-evenly';
19
20
  export type PositionOptionType = 'relative' | 'absolute';
20
- export type DisplayOptionType = 'flex' | 'block';
21
21
 
22
22
  export interface OnboardItemStyleGenerated {
23
- scrollable?: boolean;
24
23
  flexDirection?: FlexDirectionOptionType;
25
24
  alignItems?: AlignItemsOptionType;
26
25
  justifyContent?: JustifyContentOptionType;
@@ -54,13 +53,17 @@ export interface OnboardItemStyleGenerated {
54
53
  left?: string;
55
54
  right?: string;
56
55
  zIndex?: number;
57
- display?: DisplayOptionType;
58
56
  }
59
57
 
60
58
  export interface OnboardItemPropsGenerated {
61
59
  child: string;
62
60
  attributes: {
63
61
  style?: OnboardItemStyleGenerated;
62
+ scrollable?: boolean;
63
+ display?: DisplayOptionType;
64
+ gap?: string;
65
+ flexDirection?: FlexDirectionOptionType;
66
+ paddingHorizontal?: string;
64
67
  };
65
68
  }
66
69
 
@@ -31,7 +31,8 @@
31
31
  ],
32
32
  "label": "Onboard Item",
33
33
  "description": "Single onboarding screen section.",
34
- "styles": {
34
+ "styles": {},
35
+ "attributes": {
35
36
  "display": {
36
37
  "label": "Display",
37
38
  "description": "Controls layout display mode.",
@@ -12,7 +12,7 @@ import useEmblaCarousel from 'embla-carousel-react';
12
12
  import RenderNode from '../RenderNode.generated';
13
13
  import useNode from '../useNode';
14
14
  import { useLogRender } from '../../utils/useLogRender';
15
- import { useExtractViewStyle } from '../../hooks/useExtractViewStyle';
15
+ import { useExtractViewStyle } from '../../attribute-analyser/style/web/useExtractViewStyle';
16
16
 
17
17
  export const onboardContext = createContext<any>(undefined);
18
18
  function OnboardProvider({ node }: OnboardProviderComponentProps) {
@@ -2,6 +2,7 @@
2
2
 
3
3
  import type { NodeData } from '../../types/Node';
4
4
 
5
+ export type ThemeOptionType = 'light' | 'dark' | 'all';
5
6
  export type FlexDirectionOptionType = 'row' | 'column';
6
7
  export type AlignItemsOptionType =
7
8
  | 'flex-start'
@@ -17,10 +18,8 @@ export type JustifyContentOptionType =
17
18
  | 'space-around'
18
19
  | 'space-evenly';
19
20
  export type PositionOptionType = 'relative' | 'absolute';
20
- export type ThemeOptionType = 'light' | 'dark' | 'all';
21
21
 
22
22
  export interface OnboardProviderStyleGenerated {
23
- scrollable?: boolean;
24
23
  flexDirection?: FlexDirectionOptionType;
25
24
  alignItems?: AlignItemsOptionType;
26
25
  justifyContent?: JustifyContentOptionType;
@@ -40,7 +39,7 @@ export interface OnboardProviderStyleGenerated {
40
39
  marginLeft?: string;
41
40
  marginRight?: string;
42
41
  backgroundColor?: string;
43
- borderRadius?: never;
42
+ borderRadius?: string;
44
43
  width?: string;
45
44
  minWidth?: string;
46
45
  maxWidth?: string;
@@ -54,13 +53,15 @@ export interface OnboardProviderStyleGenerated {
54
53
  left?: string;
55
54
  right?: string;
56
55
  zIndex?: number;
57
- theme?: ThemeOptionType;
58
56
  }
59
57
 
60
58
  export interface OnboardProviderPropsGenerated {
61
59
  child: string;
62
60
  attributes: {
63
61
  style?: OnboardProviderStyleGenerated;
62
+ scrollable?: boolean;
63
+ theme?: ThemeOptionType;
64
+ borderRadius?: never;
64
65
  };
65
66
  }
66
67