@developer_tribe/react-builder 1.2.14 → 1.2.15

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 (160) hide show
  1. package/dist/build-components/BIcon/BIconProps.generated.d.ts +2 -0
  2. package/dist/build-components/BackgroundImage/BackgroundImageProps.generated.d.ts +2 -0
  3. package/dist/build-components/Button/ButtonProps.generated.d.ts +2 -0
  4. package/dist/build-components/Carousel/CarouselProps.generated.d.ts +2 -0
  5. package/dist/build-components/CarouselButtons/CarouselButtonsProps.generated.d.ts +2 -0
  6. package/dist/build-components/CarouselDots/CarouselDotsProps.generated.d.ts +2 -0
  7. package/dist/build-components/CarouselItem/CarouselItemProps.generated.d.ts +2 -0
  8. package/dist/build-components/CarouselProvider/CarouselProviderProps.generated.d.ts +2 -0
  9. package/dist/build-components/CountDown/CountDown.d.ts +2 -0
  10. package/dist/build-components/CountDown/CountDownProps.generated.d.ts +61 -0
  11. package/dist/build-components/CountDown/formatCountdownTime.d.ts +1 -0
  12. package/dist/build-components/Counter/Counter.d.ts +2 -0
  13. package/dist/build-components/Counter/CounterProps.generated.d.ts +61 -0
  14. package/dist/build-components/Image/ImageProps.generated.d.ts +2 -0
  15. package/dist/build-components/Main/MainProps.generated.d.ts +2 -0
  16. package/dist/build-components/Onboard/OnboardProps.generated.d.ts +2 -0
  17. package/dist/build-components/OnboardButton/OnboardButtonProps.generated.d.ts +2 -0
  18. package/dist/build-components/OnboardButtons/OnboardButtonsProps.generated.d.ts +2 -0
  19. package/dist/build-components/OnboardDot/OnboardDotProps.generated.d.ts +2 -0
  20. package/dist/build-components/OnboardFooter/OnboardFooterProps.generated.d.ts +2 -0
  21. package/dist/build-components/OnboardImage/OnboardImageProps.generated.d.ts +2 -0
  22. package/dist/build-components/OnboardItem/OnboardItemProps.generated.d.ts +2 -0
  23. package/dist/build-components/OnboardProvider/OnboardProviderProps.generated.d.ts +2 -0
  24. package/dist/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.d.ts +2 -0
  25. package/dist/build-components/OnboardTitle/OnboardTitleProps.generated.d.ts +2 -0
  26. package/dist/build-components/PaywallBackground/PaywallBackgroundProps.generated.d.ts +2 -0
  27. package/dist/build-components/PaywallCloseButton/PaywallCloseButtonProps.generated.d.ts +2 -0
  28. package/dist/build-components/PaywallCounter/PaywallCounter.d.ts +2 -0
  29. package/dist/build-components/PaywallCounter/PaywallCounterProps.generated.d.ts +61 -0
  30. package/dist/build-components/PaywallOptions/PaywallOptionsProps.generated.d.ts +2 -0
  31. package/dist/build-components/PaywallProvider/PaywallProviderProps.generated.d.ts +2 -0
  32. package/dist/build-components/PaywallSubscribeButton/PaywallSubscribeButtonProps.generated.d.ts +2 -0
  33. package/dist/build-components/RadioButton/RadioButtonProps.generated.d.ts +2 -0
  34. package/dist/build-components/Text/TextProps.generated.d.ts +2 -0
  35. package/dist/build-components/View/ViewProps.generated.d.ts +2 -0
  36. package/dist/build-components/index.d.ts +4 -1
  37. package/dist/build-components/patterns.generated.d.ts +2961 -1552
  38. package/dist/components/BuilderProvider.d.ts +0 -1
  39. package/dist/index.cjs.js +4 -4
  40. package/dist/index.cjs.js.map +1 -1
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.esm.js +4 -4
  43. package/dist/index.esm.js.map +1 -1
  44. package/dist/index.native.d.ts +7 -0
  45. package/dist/index.web.cjs.js +7 -5
  46. package/dist/index.web.cjs.js.map +1 -1
  47. package/dist/index.web.esm.js +7 -5
  48. package/dist/index.web.esm.js.map +1 -1
  49. package/dist/utils/getDefaultProject.d.ts +4 -0
  50. package/dist/utils/patterns.d.ts +3 -0
  51. package/package.json +2 -1
  52. package/scripts/prebuild/utils/createComponentTsx.js +1 -1
  53. package/scripts/prebuild/utils/createGeneratedProps.js +6 -2
  54. package/scripts/prebuild/utils/createRenderNodeGenerated.js +26 -5
  55. package/scripts/prebuild/utils/validateAllComponentsOrThrow.js +17 -5
  56. package/scripts/prebuild/utils/validateExistingComponentTsx.js +12 -8
  57. package/src/AttributesEditor.tsx +7 -2
  58. package/src/RenderPage.tsx +34 -3
  59. package/src/assets/meta.json +1 -1
  60. package/src/assets/samples/carousel-sample.json +44 -14
  61. package/src/assets/samples/getSamples.ts +3 -1
  62. package/src/assets/samples/paywall-1.json +73 -29
  63. package/src/assets/samples/paywall-2.json +338 -0
  64. package/src/assets/samples/simple-1.json +9 -3
  65. package/src/assets/samples/simple-2.json +72 -24
  66. package/src/assets/samples/unmigrated-builder-1.1.1.json +19 -7
  67. package/src/assets/samples/unmigrated-builder1.json +10 -4
  68. package/src/assets/samples/unvalidated-builder1.json +10 -4
  69. package/src/assets/samples/unvalidated-crash1.json +3 -1
  70. package/src/assets/samples/unvalidated-crashcomponent1.json +3 -1
  71. package/src/assets/samples/vpn-onboard-1.json +88 -40
  72. package/src/assets/samples/vpn-onboard-2.json +85 -37
  73. package/src/assets/samples/vpn-onboard-3.json +93 -45
  74. package/src/assets/samples/vpn-onboard-4.json +93 -45
  75. package/src/assets/samples/vpn-onboard-5.json +121 -53
  76. package/src/assets/samples/vpn-onboard-6.json +93 -45
  77. package/src/attributes-editor/AttributesEditorView.tsx +39 -1
  78. package/src/attributes-editor/Field.tsx +30 -0
  79. package/src/build-components/BIcon/BIconProps.generated.ts +2 -0
  80. package/src/build-components/BIcon/pattern.json +2 -0
  81. package/src/build-components/BackgroundImage/BackgroundImageProps.generated.ts +2 -0
  82. package/src/build-components/BackgroundImage/pattern.json +2 -0
  83. package/src/build-components/Button/ButtonProps.generated.ts +2 -0
  84. package/src/build-components/Button/pattern.json +2 -0
  85. package/src/build-components/Carousel/CarouselProps.generated.ts +2 -0
  86. package/src/build-components/Carousel/pattern.json +2 -0
  87. package/src/build-components/CarouselButtons/CarouselButtonsProps.generated.ts +2 -0
  88. package/src/build-components/CarouselButtons/pattern.json +2 -0
  89. package/src/build-components/CarouselDots/CarouselDotsProps.generated.ts +2 -0
  90. package/src/build-components/CarouselDots/pattern.json +2 -0
  91. package/src/build-components/CarouselItem/CarouselItemProps.generated.ts +2 -0
  92. package/src/build-components/CarouselItem/pattern.json +4 -1
  93. package/src/build-components/CarouselProvider/CarouselProviderProps.generated.ts +2 -0
  94. package/src/build-components/CarouselProvider/pattern.json +4 -1
  95. package/src/build-components/CountDown/CountDown.tsx +73 -0
  96. package/src/build-components/CountDown/CountDownProps.generated.ts +78 -0
  97. package/src/build-components/CountDown/formatCountdownTime.ts +10 -0
  98. package/src/build-components/CountDown/pattern.json +24 -0
  99. package/src/build-components/Counter/Counter.tsx +44 -0
  100. package/src/build-components/Counter/CounterProps.generated.ts +78 -0
  101. package/src/build-components/Counter/pattern.json +26 -0
  102. package/src/build-components/Image/ImageProps.generated.ts +2 -0
  103. package/src/build-components/Image/pattern.json +2 -0
  104. package/src/build-components/Main/MainProps.generated.ts +2 -0
  105. package/src/build-components/Main/pattern.json +2 -0
  106. package/src/build-components/Onboard/OnboardProps.generated.ts +2 -0
  107. package/src/build-components/Onboard/pattern.json +4 -1
  108. package/src/build-components/OnboardButton/OnboardButtonProps.generated.ts +2 -0
  109. package/src/build-components/OnboardButton/pattern.json +2 -0
  110. package/src/build-components/OnboardButtons/OnboardButtonsProps.generated.ts +2 -0
  111. package/src/build-components/OnboardButtons/pattern.json +2 -0
  112. package/src/build-components/OnboardDot/OnboardDotProps.generated.ts +2 -0
  113. package/src/build-components/OnboardDot/pattern.json +2 -0
  114. package/src/build-components/OnboardFooter/OnboardFooterProps.generated.ts +2 -0
  115. package/src/build-components/OnboardFooter/pattern.json +2 -0
  116. package/src/build-components/OnboardImage/OnboardImageProps.generated.ts +2 -0
  117. package/src/build-components/OnboardImage/pattern.json +2 -0
  118. package/src/build-components/OnboardItem/OnboardItemProps.generated.ts +2 -0
  119. package/src/build-components/OnboardItem/pattern.json +2 -0
  120. package/src/build-components/OnboardProvider/OnboardProviderProps.generated.ts +2 -0
  121. package/src/build-components/OnboardProvider/pattern.json +2 -0
  122. package/src/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.ts +2 -0
  123. package/src/build-components/OnboardSubtitle/pattern.json +4 -1
  124. package/src/build-components/OnboardTitle/OnboardTitleProps.generated.ts +2 -0
  125. package/src/build-components/OnboardTitle/pattern.json +4 -1
  126. package/src/build-components/PaywallBackground/PaywallBackgroundProps.generated.ts +2 -0
  127. package/src/build-components/PaywallBackground/pattern.json +4 -1
  128. package/src/build-components/PaywallCloseButton/PaywallCloseButton.tsx +7 -5
  129. package/src/build-components/PaywallCloseButton/PaywallCloseButtonProps.generated.ts +2 -0
  130. package/src/build-components/PaywallCloseButton/pattern.json +4 -1
  131. package/src/build-components/PaywallCounter/PaywallCounter.tsx +49 -0
  132. package/src/build-components/PaywallCounter/PaywallCounterProps.generated.ts +78 -0
  133. package/src/build-components/PaywallCounter/pattern.json +24 -0
  134. package/src/build-components/PaywallOptions/PaywallOptionsProps.generated.ts +2 -0
  135. package/src/build-components/PaywallOptions/pattern.json +4 -1
  136. package/src/build-components/PaywallProvider/PaywallProvider.tsx +8 -16
  137. package/src/build-components/PaywallProvider/PaywallProviderProps.generated.ts +2 -0
  138. package/src/build-components/PaywallProvider/pattern.json +4 -1
  139. package/src/build-components/PaywallSubscribeButton/PaywallSubscribeButtonProps.generated.ts +2 -0
  140. package/src/build-components/PaywallSubscribeButton/pattern.json +4 -1
  141. package/src/build-components/RadioButton/RadioButtonProps.generated.ts +2 -0
  142. package/src/build-components/RadioButton/pattern.json +2 -0
  143. package/src/build-components/RenderNode.generated.tsx +17 -2
  144. package/src/build-components/Text/TextProps.generated.ts +2 -0
  145. package/src/build-components/Text/pattern.json +3 -1
  146. package/src/build-components/View/View.tsx +1 -1
  147. package/src/build-components/View/ViewProps.generated.ts +2 -0
  148. package/src/build-components/View/pattern.json +35 -38
  149. package/src/build-components/index.ts +15 -0
  150. package/src/build-components/patterns.generated.ts +3084 -1570
  151. package/src/components/BuilderButton.tsx +23 -6
  152. package/src/components/BuilderProvider.tsx +10 -7
  153. package/src/index.native.ts +7 -0
  154. package/src/index.ts +1 -0
  155. package/src/mockOS/context/MockOSContext.tsx +22 -8
  156. package/src/mockOS/managers/navigationManager.ts +4 -0
  157. package/src/pages/projectPageUtils.ts +3 -2
  158. package/src/utils/analyseNodeByPatterns.ts +21 -0
  159. package/src/utils/getDefaultProject.ts +34 -0
  160. package/src/utils/patterns.ts +6 -7
@@ -68,14 +68,22 @@ export function BuilderButton({
68
68
  }
69
69
 
70
70
  const nodeData = node as NodeData<NodeDefaultAttribute>;
71
- let extra = '';
71
+ let conditionText = '';
72
72
  if (nodeData.attributes?.condition) {
73
- extra = ` (${nodeData.attributes.condition} ${nodeData.attributes.conditionVariable})`;
73
+ conditionText =
74
+ `${nodeData.attributes.condition} ${nodeData.attributes.conditionVariable ?? ''}`.trim();
74
75
  }
75
76
  const patternLabel = getPatternByType(nodeData.type)?.meta?.label?.trim();
76
77
  const baseLabel =
77
78
  patternLabel && patternLabel.length > 0 ? patternLabel : nodeData.type;
78
- const conditionLabel = extra.trim() ? extra : '';
79
+ const conditionLabel = conditionText.trim() ? conditionText : '';
80
+ const title =
81
+ typeof nodeData.attributes?.title === 'string'
82
+ ? nodeData.attributes.title.trim()
83
+ : '';
84
+ const hasTitle = title.length > 0;
85
+ const topLabel = hasTitle ? title : baseLabel;
86
+ const shouldShowBottom = hasTitle || conditionLabel.length > 0;
79
87
 
80
88
  return (
81
89
  <div className="builder__button">
@@ -108,7 +116,7 @@ export function BuilderButton({
108
116
  </div>
109
117
  )}
110
118
  <button type="button" className="builder__button-link" onClick={onClick}>
111
- {baseLabel}
119
+ {topLabel}
112
120
  </button>
113
121
  <div className="builder__button-actions" ref={actionsRef}>
114
122
  <button
@@ -153,8 +161,17 @@ export function BuilderButton({
153
161
  </ul>
154
162
  )}
155
163
  </div>
156
- {conditionLabel && (
157
- <span className="builder__button-condition">{conditionLabel}</span>
164
+ {shouldShowBottom && (
165
+ <span className="builder__button-condition">
166
+ {hasTitle ? (
167
+ <>
168
+ <small>{baseLabel}</small>
169
+ {conditionLabel ? ` · ${conditionLabel}` : ''}
170
+ </>
171
+ ) : (
172
+ conditionLabel
173
+ )}
174
+ </span>
158
175
  )}
159
176
  </div>
160
177
  );
@@ -1,4 +1,4 @@
1
- import React, { createContext, useContext, useMemo } from 'react';
1
+ import React, { createContext, useContext, useEffect, useMemo } from 'react';
2
2
  import type { Product } from '../paywall/types/paywall-types';
3
3
  import type { PaywallBenefits } from '../paywall/types/benefits';
4
4
  import type { AppConfig } from '../types/PreviewConfig';
@@ -21,7 +21,6 @@ export type BuilderProviderParams = {
21
21
  * - 'native': returns React Native-friendly styles (no DOM-only props like overflowX/Y).
22
22
  */
23
23
  platform?: 'web' | 'native';
24
- onPaywallClose?: () => void;
25
24
  onPaywallSubscribe?: (product?: Product) => void | boolean | Promise<boolean>;
26
25
  /**
27
26
  * Optional runtime config + styling inputs.
@@ -56,10 +55,6 @@ export function BuilderProvider({ params, children }: BuilderProviderProps) {
56
55
  params?.benefits && typeof params.benefits === 'object'
57
56
  ? (params.benefits as PaywallBenefits)
58
57
  : {},
59
- onPaywallClose:
60
- typeof params?.onPaywallClose === 'function'
61
- ? params.onPaywallClose
62
- : undefined,
63
58
  onPaywallSubscribe:
64
59
  typeof params?.onPaywallSubscribe === 'function'
65
60
  ? params.onPaywallSubscribe
@@ -85,7 +80,6 @@ export function BuilderProvider({ params, children }: BuilderProviderProps) {
85
80
  params?.benefits,
86
81
  params?.products,
87
82
  params?.platform,
88
- params?.onPaywallClose,
89
83
  params?.onPaywallSubscribe,
90
84
  params?.appConfig,
91
85
  params?.projectColors,
@@ -96,6 +90,15 @@ export function BuilderProvider({ params, children }: BuilderProviderProps) {
96
90
  ],
97
91
  );
98
92
 
93
+ useEffect(() => {
94
+ console.info('[preview] BuilderProvider params', {
95
+ previewMode: value.previewMode,
96
+ selectedKey: value.selectedKey,
97
+ platform: value.platform,
98
+ productsCount: Array.isArray(value.products) ? value.products.length : 0,
99
+ });
100
+ }, [value.previewMode, value.selectedKey, value.platform, value.products]);
101
+
99
102
  return (
100
103
  <BuilderContext.Provider value={value}>{children}</BuilderContext.Provider>
101
104
  );
@@ -0,0 +1,7 @@
1
+ /**
2
+ * React Native entrypoint alias.
3
+ *
4
+ * Some consumers/tests expect `src/index.native` to exist.
5
+ * We keep the RN-safe exports in `src/index.ts` and re-export from here.
6
+ */
7
+ export * from './index';
package/src/index.ts CHANGED
@@ -91,4 +91,5 @@ export {
91
91
  getBasicSamples,
92
92
  getOnboardSamples,
93
93
  } from './assets/samples/getSamples';
94
+ export { getDefaultProject } from './utils/getDefaultProject';
94
95
  export type { EventObjectGenerated } from './build-components/OnboardButton/OnboardButtonProps.generated';
@@ -78,6 +78,9 @@ export function MockOSProvider({
78
78
  // replace it instead of adding new item
79
79
  setNavigationStack((prev) => {
80
80
  const lastItem = prev[prev.length - 1];
81
+ if (lastItem && lastItem.route === route) {
82
+ return prev;
83
+ }
81
84
  if (
82
85
  lastItem &&
83
86
  lastItem.route === 'launchscreen' &&
@@ -94,17 +97,28 @@ export function MockOSProvider({
94
97
  }, []);
95
98
 
96
99
  const goBack = useCallback(() => {
97
- if (navigationStack.length > 1) {
98
- const newStack = [...navigationStack];
100
+ if (navigationStack.length <= 1) {
101
+ return false;
102
+ }
103
+
104
+ const newStack = [...navigationStack];
105
+ // Pop once, then keep popping if the route doesn't change (avoid duplicates).
106
+ do {
99
107
  newStack.pop();
100
- const previousRoute = newStack[newStack.length - 1];
108
+ } while (
109
+ newStack.length > 0 &&
110
+ newStack[newStack.length - 1].route === currentRoute
111
+ );
101
112
 
102
- setCurrentRoute(previousRoute.route);
103
- setNavigationStack(newStack);
104
- return true;
113
+ if (newStack.length === 0) {
114
+ return false;
105
115
  }
106
- return false;
107
- }, [navigationStack]);
116
+
117
+ const previousRoute = newStack[newStack.length - 1];
118
+ setCurrentRoute(previousRoute.route);
119
+ setNavigationStack(newStack);
120
+ return true;
121
+ }, [currentRoute, navigationStack]);
108
122
 
109
123
  const requestSubscriptionPurchase = useCallback((productId: string) => {
110
124
  // Cancel any existing pending request (resolve false)
@@ -60,6 +60,10 @@ export class MockNavigationManager {
60
60
  }
61
61
 
62
62
  goBack(): boolean {
63
+ if (this.context?.goBack) {
64
+ return this.context.goBack();
65
+ }
66
+
63
67
  if (this.context === null) {
64
68
  alert('Go Back\n(Mock OS context not available)');
65
69
  return false;
@@ -1,5 +1,6 @@
1
1
  import type { Project } from '../types/Project';
2
2
  import type { Node } from '../types/Node';
3
+ import { getDefaultProject } from '../utils/getDefaultProject';
3
4
 
4
5
  export function resolveProjectForSave(args: {
5
6
  project: Project;
@@ -7,8 +8,8 @@ export function resolveProjectForSave(args: {
7
8
  data: Node;
8
9
  }): Project {
9
10
  const base = args.overrideProject ?? args.project;
10
- return {
11
+ return getDefaultProject({
11
12
  ...base,
12
13
  data: args.data,
13
- };
14
+ });
14
15
  }
@@ -244,6 +244,17 @@ function validatePrimitiveValue(
244
244
  return typeof value === 'string'
245
245
  ? ok()
246
246
  : fail(`Expected color (string)`, path);
247
+ case 'title':
248
+ if (typeof value !== 'string') {
249
+ return fail(`Expected title (string)`, path);
250
+ }
251
+ return value.length <= 20
252
+ ? ok()
253
+ : fail(`Expected title to be <= 20 characters`, path);
254
+ case 'description':
255
+ return typeof value === 'string'
256
+ ? ok()
257
+ : fail(`Expected description (string)`, path);
247
258
  case 'size':
248
259
  // Sizes can be numbers or strings like "16@fs" / "100%" / "20px"
249
260
  return typeof value === 'number' || typeof value === 'string'
@@ -403,6 +414,16 @@ function validateAttributesByPattern(
403
414
  if (attrName === 'style') continue;
404
415
  const attrSpec = schema?.[attrName] as AttributeTypeSpec | undefined;
405
416
  if (!attrSpec) {
417
+ if (attrName === 'title' || attrName === 'description') {
418
+ const res = validateAttributeValue(
419
+ pattern.pattern.type,
420
+ attrValue,
421
+ attrName,
422
+ joinPath(path, attrName),
423
+ );
424
+ if (!res.valid) return res;
425
+ continue;
426
+ }
406
427
  // Back-compat: allow legacy flat style keys even when the schema nests them.
407
428
  const legacyStyleSpec = styleSchema?.[attrName] as
408
429
  | AttributeTypeSpec
@@ -0,0 +1,34 @@
1
+ import metaJson from '../assets/meta.json';
2
+ import type { Project } from '../types/Project';
3
+ import type { Node } from '../types/Node';
4
+
5
+ type GetDefaultProjectArgs = Partial<Project>;
6
+
7
+ export function getDefaultProject(
8
+ overrides: GetDefaultProjectArgs = {},
9
+ ): Project {
10
+ const supportedVersion =
11
+ typeof metaJson?.supportedProjectVersion === 'string' &&
12
+ metaJson.supportedProjectVersion.trim()
13
+ ? metaJson.supportedProjectVersion.trim()
14
+ : '0.0.0';
15
+
16
+ const version =
17
+ typeof overrides.version === 'string' && overrides.version.trim()
18
+ ? overrides.version.trim()
19
+ : supportedVersion;
20
+
21
+ const name =
22
+ typeof overrides.name === 'string' && overrides.name.trim()
23
+ ? overrides.name.trim()
24
+ : 'project';
25
+
26
+ return {
27
+ name,
28
+ version,
29
+ data: (overrides.data ?? null) as Node,
30
+ appConfig: overrides.appConfig,
31
+ projectColors: overrides.projectColors,
32
+ type: overrides.type,
33
+ };
34
+ }
@@ -7,7 +7,10 @@ export type AttributeMeta = {
7
7
  category?: 'style' | 'container' | 'other' | string;
8
8
  specialCategory?: 'padding' | 'margin' | 'offset' | null | string;
9
9
  sort?: number;
10
+ /** Legacy typo kept for backwards compatibility with older patterns. */
10
11
  preferedScale?: 's' | 'vs' | 'f' | '%' | '' | string;
12
+ /** Correct spelling. Prefer this in new/updated patterns. */
13
+ preferredScale?: 's' | 'vs' | 'f' | '%' | '' | string;
11
14
  /**
12
15
  * When true, this attribute should remain visible even if the component
13
16
  * metadata requests hiding all attributes (e.g. `meta.hideAllAttributes`).
@@ -108,13 +111,7 @@ function adjustMetaForPlatform(
108
111
  // Values that are not directly style-friendly for the target platform should be shown under "other"
109
112
  // (so they remain editable, but are clearly non-style / platform-specific behavior).
110
113
  const moveToOtherAlways = new Set<string>(['scrollable']);
111
- const moveToOtherOnWeb = new Set<string>([
112
- // RN-only shorthands; on web they are translated to paddingLeft/Right, etc.
113
- 'paddingHorizontal',
114
- 'paddingVertical',
115
- 'marginHorizontal',
116
- 'marginVertical',
117
- ]);
114
+ const moveToOtherOnWeb = new Set<string>([]);
118
115
  const moveToOtherOnNative = new Set<string>([
119
116
  // CSS-only layout convenience (not widely supported in RN style across versions).
120
117
  'gap',
@@ -277,6 +274,8 @@ export function getTypeSchema(
277
274
  export function isPrimitiveType(typeName: string): boolean {
278
275
  return (
279
276
  typeName === 'string' ||
277
+ typeName === 'title' ||
278
+ typeName === 'description' ||
280
279
  typeName === 'number' ||
281
280
  typeName === 'boolean' ||
282
281
  typeName === 'color' ||