@developer_tribe/react-builder 1.0.3 → 1.0.5

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 (532) hide show
  1. package/README.md +6 -0
  2. package/dist/android.svg +43 -0
  3. package/dist/apple.svg +16 -0
  4. package/dist/assets/samples/getSamples.d.ts +1 -0
  5. package/dist/attributes-editor/Field.d.ts +2 -1
  6. package/dist/attributes-editor/SizeField.d.ts +9 -0
  7. package/dist/background.jpg +0 -0
  8. package/dist/build-components/BIcon/BIcon.d.ts +5 -0
  9. package/dist/build-components/BIcon/BIconProps.generated.d.ts +55 -0
  10. package/dist/build-components/BackgroundImage/BackgroundImageProps.generated.d.ts +5 -0
  11. package/dist/build-components/Button/ButtonProps.generated.d.ts +5 -0
  12. package/dist/build-components/Carousel/CarouselProps.generated.d.ts +5 -0
  13. package/dist/build-components/CarouselButtons/CarouselButtonsProps.generated.d.ts +5 -0
  14. package/dist/build-components/CarouselDots/CarouselDotsProps.generated.d.ts +5 -0
  15. package/dist/build-components/CarouselItem/CarouselItemProps.generated.d.ts +5 -0
  16. package/dist/build-components/CarouselProvider/CarouselProviderProps.generated.d.ts +5 -0
  17. package/dist/build-components/Image/ImageProps.generated.d.ts +5 -0
  18. package/dist/build-components/Main/Main.d.ts +5 -0
  19. package/dist/build-components/Main/MainProps.generated.d.ts +48 -0
  20. package/dist/build-components/Onboard/OnboardProps.generated.d.ts +5 -0
  21. package/dist/build-components/OnboardButton/OnboardButtonProps.generated.d.ts +5 -1
  22. package/dist/build-components/OnboardButtons/OnboardButtonsProps.generated.d.ts +5 -0
  23. package/dist/build-components/OnboardDot/OnboardDotProps.generated.d.ts +6 -3
  24. package/dist/build-components/OnboardFooter/OnboardFooterProps.generated.d.ts +5 -0
  25. package/dist/build-components/OnboardImage/OnboardImageProps.generated.d.ts +6 -1
  26. package/dist/build-components/OnboardItem/OnboardItemProps.generated.d.ts +5 -0
  27. package/dist/build-components/OnboardProvider/OnboardProviderProps.generated.d.ts +5 -1
  28. package/dist/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.d.ts +5 -0
  29. package/dist/build-components/OnboardTitle/OnboardTitleProps.generated.d.ts +5 -0
  30. package/dist/build-components/PaywallBackground/PaywallBackground.d.ts +5 -0
  31. package/dist/build-components/PaywallBackground/PaywallBackgroundProps.generated.d.ts +47 -0
  32. package/dist/build-components/PaywallCloseButton/PaywallCloseButton.d.ts +5 -0
  33. package/dist/build-components/PaywallCloseButton/PaywallCloseButtonProps.generated.d.ts +56 -0
  34. package/dist/build-components/PaywallOptions/PaywallOptionButton.d.ts +9 -0
  35. package/dist/build-components/PaywallOptions/PaywallOptions.d.ts +5 -0
  36. package/dist/build-components/PaywallOptions/PaywallOptionsProps.generated.d.ts +47 -0
  37. package/dist/build-components/PaywallOptions/usePaywallOptionParamsFactory.d.ts +10 -0
  38. package/dist/build-components/PaywallProvider/PaywallProvider.d.ts +5 -0
  39. package/dist/build-components/PaywallProvider/PaywallProviderProps.generated.d.ts +47 -0
  40. package/dist/build-components/PaywallSubscriButton/PaywallSubscriButton.d.ts +5 -0
  41. package/dist/build-components/PaywallSubscriButton/PaywallSubscriButtonProps.generated.d.ts +50 -0
  42. package/dist/build-components/PaywallSubscribeButton/PaywallSubscribeButton.d.ts +5 -0
  43. package/dist/build-components/PaywallSubscribeButton/PaywallSubscribeButtonProps.generated.d.ts +50 -0
  44. package/dist/build-components/RadioButton/RadioButton.d.ts +11 -0
  45. package/dist/build-components/RadioButton/RadioButtonProps.generated.d.ts +50 -0
  46. package/dist/build-components/RenderNode.generated.d.ts +1 -1
  47. package/dist/build-components/Text/TextProps.generated.d.ts +5 -0
  48. package/dist/build-components/View/ViewProps.generated.d.ts +5 -0
  49. package/dist/build-components/index.d.ts +10 -1
  50. package/dist/build-components/patterns.generated.d.ts +5030 -723
  51. package/dist/components/AttributesEditorPanel.d.ts +2 -1
  52. package/dist/components/Builder.d.ts +1 -1
  53. package/dist/components/BuilderButton.d.ts +1 -1
  54. package/dist/components/BuilderProvider.d.ts +15 -0
  55. package/dist/components/EditorHeader.d.ts +1 -1
  56. package/dist/components/Icon.generated.d.ts +11 -0
  57. package/dist/components/JsonTextEditor.d.ts +9 -0
  58. package/dist/components/LocalizationParamsProvider.d.ts +11 -0
  59. package/dist/components/ParamsProvider.d.ts +14 -0
  60. package/dist/hooks/useLocalizationParams.d.ts +1 -0
  61. package/dist/hooks/useLocalize.d.ts +2 -0
  62. package/dist/hooks/useParams.d.ts +1 -0
  63. package/dist/hooks/useSafeAreaViewStyle.d.ts +1 -0
  64. package/dist/index.cjs.js +5 -5
  65. package/dist/index.cjs.js.map +1 -1
  66. package/dist/index.d.ts +8 -0
  67. package/dist/index.esm.js +5 -5
  68. package/dist/index.esm.js.map +1 -1
  69. package/dist/index.native.cjs.js +29 -0
  70. package/dist/index.native.cjs.js.map +1 -0
  71. package/dist/index.native.d.ts +31 -0
  72. package/dist/index.native.esm.js +29 -0
  73. package/dist/index.native.esm.js.map +1 -0
  74. package/dist/mockOS/components/MockOSRouter.d.ts +1 -1
  75. package/dist/mockOS/context/MockOSContext.d.ts +4 -18
  76. package/dist/mockOS/context/MockOSContextBase.d.ts +21 -0
  77. package/dist/mockOS/index.d.ts +3 -2
  78. package/dist/modals/BenefitEditModal.d.ts +13 -0
  79. package/dist/modals/BenefitPresetsModal.d.ts +9 -0
  80. package/dist/modals/IconPickerModal.d.ts +9 -0
  81. package/dist/modals/MockableFeatureModal.d.ts +6 -0
  82. package/dist/modals/ProductEditModal.d.ts +9 -0
  83. package/dist/modals/ProductPresetsModal.d.ts +9 -0
  84. package/dist/modals/index.d.ts +6 -0
  85. package/dist/pages/ProjectPage.d.ts +3 -2
  86. package/dist/pages/tabs/BuilderPanel.d.ts +1 -1
  87. package/dist/pages/tabs/SideTool.d.ts +3 -2
  88. package/dist/paywall/hooks/index.d.ts +5 -0
  89. package/dist/paywall/hooks/useCalculateLocalizedPrice.d.ts +4 -0
  90. package/dist/paywall/hooks/useCarouselOptionsSeperator.d.ts +6 -0
  91. package/dist/paywall/hooks/useCloseStatusPaywall.d.ts +4 -0
  92. package/dist/paywall/hooks/useDiscountRate.d.ts +4 -0
  93. package/dist/paywall/hooks/usePaywallCounter.d.ts +4 -0
  94. package/dist/paywall/types/benefits.d.ts +14 -0
  95. package/dist/paywall/types/paywall-types.d.ts +43 -0
  96. package/dist/store.d.ts +31 -1
  97. package/dist/styles.css +1 -1
  98. package/dist/types/Icons.d.ts +2 -0
  99. package/dist/types/Project.d.ts +5 -0
  100. package/dist/utils/analyseNode.d.ts +1 -4
  101. package/dist/utils/analyseNodeByPatterns.d.ts +16 -0
  102. package/dist/utils/analyseNodeStructural.d.ts +11 -0
  103. package/dist/utils/extractImageStyle.d.ts +2 -1
  104. package/dist/utils/extractViewStyle.d.ts +1 -2
  105. package/dist/utils/findNodeByKeyNested.d.ts +2 -0
  106. package/dist/utils/nodeGuards.d.ts +5 -0
  107. package/dist/utils/novaToJson.d.ts +5 -0
  108. package/dist/utils/patterns.d.ts +14 -0
  109. package/dist/utils/replaceLocalizationParams.d.ts +1 -0
  110. package/dist/utils/selection.d.ts +7 -0
  111. package/dist/utils/useMergedStyle.d.ts +2 -0
  112. package/package.json +33 -6
  113. package/scripts/prebuild/assets/icon.template +71 -0
  114. package/scripts/prebuild/build-components.js +5 -0
  115. package/scripts/prebuild/icon-generator.js +206 -0
  116. package/scripts/prebuild/prebuild.js +10 -1
  117. package/scripts/prebuild/utils/createComponentTsx.js +6 -3
  118. package/scripts/prebuild/utils/createGeneratedProps.js +4 -2
  119. package/scripts/prebuild/utils/createRenderNodeGenerated.js +43 -8
  120. package/scripts/prebuild/utils/validateAllComponentsOrThrow.js +20 -9
  121. package/scripts/prebuild/utils/validatePatternJson.js +3 -2
  122. package/src/.DS_Store +0 -0
  123. package/src/AttributesEditor.tsx +185 -36
  124. package/src/DeviceMockFrame.tsx +41 -43
  125. package/src/RenderPage.tsx +6 -43
  126. package/src/assets/benefits.json +24 -0
  127. package/src/assets/iconset/activity-heart.svg +3 -0
  128. package/src/assets/iconset/activity.svg +3 -0
  129. package/src/assets/iconset/alert-circle.svg +3 -0
  130. package/src/assets/iconset/alert-triangle.svg +3 -0
  131. package/src/assets/iconset/anchor.svg +3 -0
  132. package/src/assets/iconset/archive.svg +3 -0
  133. package/src/assets/iconset/arrow-down.svg +3 -0
  134. package/src/assets/iconset/arrow-left.svg +3 -0
  135. package/src/assets/iconset/arrow-narrow-down-left.svg +3 -0
  136. package/src/assets/iconset/arrow-narrow-up-right.svg +3 -0
  137. package/src/assets/iconset/arrow-right-smooth.svg +4 -0
  138. package/src/assets/iconset/arrow-right.svg +7 -0
  139. package/src/assets/iconset/asterisk-01.svg +3 -0
  140. package/src/assets/iconset/asterisk-02.svg +3 -0
  141. package/src/assets/iconset/at-sign.svg +3 -0
  142. package/src/assets/iconset/award.svg +4 -0
  143. package/src/assets/iconset/battery-charging.svg +6 -0
  144. package/src/assets/iconset/bell-01.svg +5 -0
  145. package/src/assets/iconset/bell-02.svg +3 -0
  146. package/src/assets/iconset/bell-ringing-02.svg +3 -0
  147. package/src/assets/iconset/bookmark-add.svg +3 -0
  148. package/src/assets/iconset/bookmark-check.svg +3 -0
  149. package/src/assets/iconset/bookmark-minus.svg +3 -0
  150. package/src/assets/iconset/bookmark-x.svg +3 -0
  151. package/src/assets/iconset/bookmark.svg +3 -0
  152. package/src/assets/iconset/bubble.svg +5 -0
  153. package/src/assets/iconset/building-01.svg +3 -0
  154. package/src/assets/iconset/building-02.svg +3 -0
  155. package/src/assets/iconset/building-03.svg +3 -0
  156. package/src/assets/iconset/building-04.svg +3 -0
  157. package/src/assets/iconset/building-05.svg +3 -0
  158. package/src/assets/iconset/building-06.svg +3 -0
  159. package/src/assets/iconset/building-07.svg +3 -0
  160. package/src/assets/iconset/building-08.svg +3 -0
  161. package/src/assets/iconset/building-09.svg +3 -0
  162. package/src/assets/iconset/camera-01.svg +8 -0
  163. package/src/assets/iconset/camera-steel.svg +4 -0
  164. package/src/assets/iconset/camera.svg +4 -0
  165. package/src/assets/iconset/check-circle-bold.svg +3 -0
  166. package/src/assets/iconset/check-circle-broken.svg +3 -0
  167. package/src/assets/iconset/check-circle.svg +3 -0
  168. package/src/assets/iconset/check-done-01.svg +3 -0
  169. package/src/assets/iconset/check-done-02.svg +3 -0
  170. package/src/assets/iconset/check-heart.svg +3 -0
  171. package/src/assets/iconset/check-square-broken.svg +3 -0
  172. package/src/assets/iconset/check-square.svg +3 -0
  173. package/src/assets/iconset/check-verified-01.svg +3 -0
  174. package/src/assets/iconset/check-verified-02.svg +3 -0
  175. package/src/assets/iconset/check-verified-03.svg +3 -0
  176. package/src/assets/iconset/check.svg +3 -0
  177. package/src/assets/iconset/checkbox.svg +4 -0
  178. package/src/assets/iconset/checkv.svg +3 -0
  179. package/src/assets/iconset/chevron-down.svg +3 -0
  180. package/src/assets/iconset/chevron-down2.svg +3 -0
  181. package/src/assets/iconset/chevron-left-2.svg +3 -0
  182. package/src/assets/iconset/chevron-left.svg +3 -0
  183. package/src/assets/iconset/chevron-right-empty.svg +3 -0
  184. package/src/assets/iconset/chevron-right-smooth.svg +3 -0
  185. package/src/assets/iconset/chevron-right.svg +3 -0
  186. package/src/assets/iconset/chevron-up.svg +3 -0
  187. package/src/assets/iconset/circle.svg +32 -0
  188. package/src/assets/iconset/clock-fast-forward.svg +10 -0
  189. package/src/assets/iconset/clock.svg +3 -0
  190. package/src/assets/iconset/close-circle.svg +3 -0
  191. package/src/assets/iconset/close.svg +3 -0
  192. package/src/assets/iconset/cloud-01.svg +5 -0
  193. package/src/assets/iconset/cloud-blank-01.svg +3 -0
  194. package/src/assets/iconset/cloud-blank-02.svg +3 -0
  195. package/src/assets/iconset/coin.svg +5 -0
  196. package/src/assets/iconset/coins-02.svg +3 -0
  197. package/src/assets/iconset/colors.svg +3 -0
  198. package/src/assets/iconset/copy-01.svg +3 -0
  199. package/src/assets/iconset/copy-02.svg +3 -0
  200. package/src/assets/iconset/copy-03.svg +3 -0
  201. package/src/assets/iconset/copy-04.svg +3 -0
  202. package/src/assets/iconset/copy-05.svg +3 -0
  203. package/src/assets/iconset/copy-06.svg +3 -0
  204. package/src/assets/iconset/copy-07.svg +3 -0
  205. package/src/assets/iconset/corner-down-right.svg +3 -0
  206. package/src/assets/iconset/crypto-bold.svg +4 -0
  207. package/src/assets/iconset/delete-icon.svg +5 -0
  208. package/src/assets/iconset/diamond.svg +3 -0
  209. package/src/assets/iconset/dice-3.svg +3 -0
  210. package/src/assets/iconset/divide-01.svg +3 -0
  211. package/src/assets/iconset/divide-02.svg +3 -0
  212. package/src/assets/iconset/divide-03.svg +3 -0
  213. package/src/assets/iconset/document-check-bold.svg +4 -0
  214. package/src/assets/iconset/dots-circle.svg +10 -0
  215. package/src/assets/iconset/dots-grid.svg +11 -0
  216. package/src/assets/iconset/dots-horizontal.svg +5 -0
  217. package/src/assets/iconset/dots-vertical.svg +5 -0
  218. package/src/assets/iconset/download-01.svg +3 -0
  219. package/src/assets/iconset/download-02.svg +3 -0
  220. package/src/assets/iconset/download-03.svg +3 -0
  221. package/src/assets/iconset/edit-03.svg +3 -0
  222. package/src/assets/iconset/edit-04.svg +3 -0
  223. package/src/assets/iconset/edit-05.svg +3 -0
  224. package/src/assets/iconset/element-3.svg +6 -0
  225. package/src/assets/iconset/ellipse-127.svg +3 -0
  226. package/src/assets/iconset/exclaimation-circle.svg +8 -0
  227. package/src/assets/iconset/eye-off-line.svg +5 -0
  228. package/src/assets/iconset/face-smile.svg +5 -0
  229. package/src/assets/iconset/file-04.svg +3 -0
  230. package/src/assets/iconset/file-05.svg +3 -0
  231. package/src/assets/iconset/file-check-02.svg +3 -0
  232. package/src/assets/iconset/file-plus-01.svg +5 -0
  233. package/src/assets/iconset/file-shield-02.svg +5 -0
  234. package/src/assets/iconset/filter-funnel-01.svg +3 -0
  235. package/src/assets/iconset/flag-03.svg +3 -0
  236. package/src/assets/iconset/flash.svg +3 -0
  237. package/src/assets/iconset/folder-plus.svg +3 -0
  238. package/src/assets/iconset/folder.svg +3 -0
  239. package/src/assets/iconset/gallery.svg +3 -0
  240. package/src/assets/iconset/globe-01.svg +3 -0
  241. package/src/assets/iconset/globe-04.svg +5 -0
  242. package/src/assets/iconset/globe-bold.svg +4 -0
  243. package/src/assets/iconset/guard.svg +3 -0
  244. package/src/assets/iconset/headphones-01.svg +3 -0
  245. package/src/assets/iconset/headphones-02.svg +5 -0
  246. package/src/assets/iconset/headset-bold.svg +4 -0
  247. package/src/assets/iconset/heart-bold.svg +3 -0
  248. package/src/assets/iconset/heart.svg +3 -0
  249. package/src/assets/iconset/help-circle.svg +5 -0
  250. package/src/assets/iconset/home-2.svg +4 -0
  251. package/src/assets/iconset/home-line.svg +3 -0
  252. package/src/assets/iconset/hourglass-02.svg +5 -0
  253. package/src/assets/iconset/image-01.svg +5 -0
  254. package/src/assets/iconset/image-03.svg +3 -0
  255. package/src/assets/iconset/image.svg +4 -0
  256. package/src/assets/iconset/inbox-01.svg +3 -0
  257. package/src/assets/iconset/inbox-arrow-down.svg +3 -0
  258. package/src/assets/iconset/info-circle.svg +3 -0
  259. package/src/assets/iconset/keyboard-line.svg +9 -0
  260. package/src/assets/iconset/lamp-charge.svg +5 -0
  261. package/src/assets/iconset/layer.svg +3 -0
  262. package/src/assets/iconset/light.svg +6 -0
  263. package/src/assets/iconset/like-dislike.svg +6 -0
  264. package/src/assets/iconset/lock-03.svg +3 -0
  265. package/src/assets/iconset/logout.svg +3 -0
  266. package/src/assets/iconset/magicpen.svg +7 -0
  267. package/src/assets/iconset/mail-01.svg +5 -0
  268. package/src/assets/iconset/mail.svg +3 -0
  269. package/src/assets/iconset/marker.svg +3 -0
  270. package/src/assets/iconset/medal-star.svg +5 -0
  271. package/src/assets/iconset/menu-04.svg +3 -0
  272. package/src/assets/iconset/menu.svg +5 -0
  273. package/src/assets/iconset/message-circle-01.svg +5 -0
  274. package/src/assets/iconset/message-plus-circle.svg +3 -0
  275. package/src/assets/iconset/message-question-circle.svg +5 -0
  276. package/src/assets/iconset/message-text-circle-01.svg +5 -0
  277. package/src/assets/iconset/message-text-square-02.svg +3 -0
  278. package/src/assets/iconset/message-x-square.svg +3 -0
  279. package/src/assets/iconset/microphone-02.svg +3 -0
  280. package/src/assets/iconset/microphone-slash.svg +8 -0
  281. package/src/assets/iconset/mirror.svg +4 -0
  282. package/src/assets/iconset/moon-01.svg +3 -0
  283. package/src/assets/iconset/moon-bold.svg +3 -0
  284. package/src/assets/iconset/mouse-circle.svg +4 -0
  285. package/src/assets/iconset/move.svg +5 -0
  286. package/src/assets/iconset/notification-fill.svg +3 -0
  287. package/src/assets/iconset/notification-text.svg +3 -0
  288. package/src/assets/iconset/notification.svg +5 -0
  289. package/src/assets/iconset/pdf-01.svg +6 -0
  290. package/src/assets/iconset/pencil-01.svg +5 -0
  291. package/src/assets/iconset/phone-01.svg +3 -0
  292. package/src/assets/iconset/phone-arrow-down-left.svg +4 -0
  293. package/src/assets/iconset/phone-arrow-up-right.svg +8 -0
  294. package/src/assets/iconset/phone-hang-up.svg +5 -0
  295. package/src/assets/iconset/phone-hangup2.svg +8 -0
  296. package/src/assets/iconset/phone-incoming-01.svg +3 -0
  297. package/src/assets/iconset/phone-outgoing-01.svg +3 -0
  298. package/src/assets/iconset/phone-plus.svg +3 -0
  299. package/src/assets/iconset/phone-x.svg +3 -0
  300. package/src/assets/iconset/phone.svg +3 -0
  301. package/src/assets/iconset/plus-circle.svg +3 -0
  302. package/src/assets/iconset/plus.svg +4 -0
  303. package/src/assets/iconset/printer.svg +3 -0
  304. package/src/assets/iconset/question-mark-circle.svg +5 -0
  305. package/src/assets/iconset/refresh-ccw-01.svg +3 -0
  306. package/src/assets/iconset/refresh-cw-01.svg +3 -0
  307. package/src/assets/iconset/refresh-cw-04.svg +3 -0
  308. package/src/assets/iconset/refresh-right-square-bold.svg +3 -0
  309. package/src/assets/iconset/remove-circle.svg +12 -0
  310. package/src/assets/iconset/repeat-04.svg +3 -0
  311. package/src/assets/iconset/repeat-bold.svg +3 -0
  312. package/src/assets/iconset/ruler-pen.svg +4 -0
  313. package/src/assets/iconset/search-lg.svg +3 -0
  314. package/src/assets/iconset/search-md.svg +5 -0
  315. package/src/assets/iconset/search-refraction.svg +5 -0
  316. package/src/assets/iconset/search.svg +3 -0
  317. package/src/assets/iconset/send-01.svg +3 -0
  318. package/src/assets/iconset/send-02.svg +5 -0
  319. package/src/assets/iconset/send-diagonal.svg +3 -0
  320. package/src/assets/iconset/setting-2.svg +4 -0
  321. package/src/assets/iconset/settings-02.svg +4 -0
  322. package/src/assets/iconset/settings-04.svg +5 -0
  323. package/src/assets/iconset/settings-2.svg +4 -0
  324. package/src/assets/iconset/settings-cog.svg +3 -0
  325. package/src/assets/iconset/settings.svg +4 -0
  326. package/src/assets/iconset/share-01.svg +4 -0
  327. package/src/assets/iconset/share-03.svg +3 -0
  328. package/src/assets/iconset/share-04.svg +3 -0
  329. package/src/assets/iconset/share-05.svg +5 -0
  330. package/src/assets/iconset/share-06.svg +3 -0
  331. package/src/assets/iconset/share-bold.svg +3 -0
  332. package/src/assets/iconset/shield-01.svg +3 -0
  333. package/src/assets/iconset/shield-bold.svg +3 -0
  334. package/src/assets/iconset/solar-check.svg +3 -0
  335. package/src/assets/iconset/speaker-wave.svg +9 -0
  336. package/src/assets/iconset/speaker.svg +5 -0
  337. package/src/assets/iconset/speedometer-03.svg +3 -0
  338. package/src/assets/iconset/star-rounded.svg +3 -0
  339. package/src/assets/iconset/star.svg +3 -0
  340. package/src/assets/iconset/sun.svg +5 -0
  341. package/src/assets/iconset/target-03.svg +3 -0
  342. package/src/assets/iconset/text-input.svg +3 -0
  343. package/src/assets/iconset/translate.svg +7 -0
  344. package/src/assets/iconset/trash-02.svg +3 -0
  345. package/src/assets/iconset/trash-03.svg +5 -0
  346. package/src/assets/iconset/trash-04.svg +3 -0
  347. package/src/assets/iconset/trash.svg +7 -0
  348. package/src/assets/iconset/trush-square-bold.svg +3 -0
  349. package/src/assets/iconset/unlimited.svg +3 -0
  350. package/src/assets/iconset/user-circle.svg +3 -0
  351. package/src/assets/iconset/user-jogging.svg +3 -0
  352. package/src/assets/iconset/user-plus-01.svg +5 -0
  353. package/src/assets/iconset/user-square.svg +5 -0
  354. package/src/assets/iconset/user-x-01.svg +5 -0
  355. package/src/assets/iconset/user-x-02.svg +3 -0
  356. package/src/assets/iconset/user2.svg +3 -0
  357. package/src/assets/iconset/users-02.svg +5 -0
  358. package/src/assets/iconset/users-speaker.svg +7 -0
  359. package/src/assets/iconset/verify.svg +3 -0
  360. package/src/assets/iconset/voice-cricle.svg +8 -0
  361. package/src/assets/iconset/x-circle.svg +3 -0
  362. package/src/assets/iconset/x-close.svg +3 -0
  363. package/src/assets/iconset/x-sm.svg +3 -0
  364. package/src/assets/iconset/zap.svg +3 -0
  365. package/src/assets/images/background.jpg +0 -0
  366. package/src/assets/loading_animation.json +1 -0
  367. package/src/assets/products.json +98 -0
  368. package/src/assets/samples/carousel-sample.json +1 -0
  369. package/src/assets/samples/getSamples.ts +39 -66
  370. package/src/assets/samples/paywall-1.json +220 -0
  371. package/src/assets/samples/simple-1.json +1 -0
  372. package/src/assets/samples/simple-2.json +1 -0
  373. package/src/assets/samples/vpn-onboard-1.json +324 -720
  374. package/src/assets/samples/vpn-onboard-2.json +299 -683
  375. package/src/assets/samples/vpn-onboard-3.json +270 -680
  376. package/src/assets/samples/vpn-onboard-4.json +270 -681
  377. package/src/assets/samples/vpn-onboard-5.json +408 -893
  378. package/src/assets/samples/vpn-onboard-6.json +279 -594
  379. package/src/attributes-editor/Field.tsx +48 -160
  380. package/src/attributes-editor/SizeField.tsx +184 -0
  381. package/src/attributes-editor/SpecialCategorySection.tsx +11 -4
  382. package/src/build-components/BIcon/BIcon.tsx +56 -0
  383. package/src/build-components/BIcon/BIconProps.generated.ts +82 -0
  384. package/src/build-components/BIcon/pattern.json +47 -0
  385. package/src/build-components/BackgroundImage/BackgroundImage.tsx +7 -17
  386. package/src/build-components/BackgroundImage/BackgroundImageProps.generated.ts +5 -0
  387. package/src/build-components/BackgroundImage/pattern.json +2 -2
  388. package/src/build-components/Button/Button.tsx +20 -9
  389. package/src/build-components/Button/ButtonProps.generated.ts +5 -0
  390. package/src/build-components/Button/pattern.json +4 -1
  391. package/src/build-components/Carousel/Carousel.tsx +7 -9
  392. package/src/build-components/Carousel/CarouselProps.generated.ts +5 -0
  393. package/src/build-components/Carousel/pattern.json +2 -2
  394. package/src/build-components/CarouselButtons/CarouselButtonsProps.generated.ts +5 -0
  395. package/src/build-components/CarouselButtons/pattern.json +1 -1
  396. package/src/build-components/CarouselDots/CarouselDotsProps.generated.ts +5 -0
  397. package/src/build-components/CarouselDots/pattern.json +1 -1
  398. package/src/build-components/CarouselItem/CarouselItem.tsx +1 -1
  399. package/src/build-components/CarouselItem/CarouselItemProps.generated.ts +5 -0
  400. package/src/build-components/CarouselItem/pattern.json +1 -1
  401. package/src/build-components/CarouselProvider/CarouselProvider.tsx +1 -1
  402. package/src/build-components/CarouselProvider/CarouselProviderProps.generated.ts +5 -0
  403. package/src/build-components/CarouselProvider/pattern.json +1 -1
  404. package/src/build-components/Image/Image.tsx +11 -18
  405. package/src/build-components/Image/ImageProps.generated.ts +5 -0
  406. package/src/build-components/Image/pattern.json +2 -10
  407. package/src/build-components/Main/Main.tsx +61 -0
  408. package/src/build-components/Main/MainProps.generated.ts +64 -0
  409. package/src/build-components/Main/pattern.json +35 -0
  410. package/src/build-components/Onboard/OnboardProps.generated.ts +5 -0
  411. package/src/build-components/OnboardButton/OnboardButton.tsx +0 -3
  412. package/src/build-components/OnboardButton/OnboardButtonProps.generated.ts +5 -1
  413. package/src/build-components/OnboardButtons/OnboardButtonsProps.generated.ts +5 -0
  414. package/src/build-components/OnboardDot/OnboardDot.tsx +59 -39
  415. package/src/build-components/OnboardDot/OnboardDotProps.generated.ts +6 -3
  416. package/src/build-components/OnboardDot/pattern.json +2 -18
  417. package/src/build-components/OnboardFooter/OnboardFooter.tsx +28 -15
  418. package/src/build-components/OnboardFooter/OnboardFooterProps.generated.ts +5 -0
  419. package/src/build-components/OnboardImage/OnboardImageProps.generated.ts +6 -1
  420. package/src/build-components/OnboardItem/OnboardItem.tsx +2 -12
  421. package/src/build-components/OnboardItem/OnboardItemProps.generated.ts +5 -0
  422. package/src/build-components/OnboardProvider/OnboardProvider.tsx +1 -8
  423. package/src/build-components/OnboardProvider/OnboardProviderProps.generated.ts +5 -1
  424. package/src/build-components/OnboardProvider/pattern.json +6 -16
  425. package/src/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.ts +5 -0
  426. package/src/build-components/OnboardTitle/OnboardTitleProps.generated.ts +5 -0
  427. package/src/build-components/PaywallBackground/PaywallBackground.tsx +47 -0
  428. package/src/build-components/PaywallBackground/PaywallBackgroundProps.generated.ts +63 -0
  429. package/src/build-components/PaywallBackground/pattern.json +16 -0
  430. package/src/build-components/PaywallCloseButton/PaywallCloseButton.tsx +62 -0
  431. package/src/build-components/PaywallCloseButton/PaywallCloseButtonProps.generated.ts +83 -0
  432. package/src/build-components/PaywallCloseButton/pattern.json +23 -0
  433. package/src/build-components/PaywallOptions/PaywallOptionButton.tsx +64 -0
  434. package/src/build-components/PaywallOptions/PaywallOptions.tsx +92 -0
  435. package/src/build-components/PaywallOptions/PaywallOptionsProps.generated.ts +63 -0
  436. package/src/build-components/PaywallOptions/pattern.json +22 -0
  437. package/src/build-components/PaywallOptions/usePaywallOptionParamsFactory.ts +42 -0
  438. package/src/build-components/PaywallProvider/PaywallProvider.tsx +78 -0
  439. package/src/build-components/PaywallProvider/PaywallProviderProps.generated.ts +63 -0
  440. package/src/build-components/PaywallProvider/pattern.json +24 -0
  441. package/src/build-components/PaywallSubscriButton/PaywallSubscriButton.tsx +10 -0
  442. package/src/build-components/PaywallSubscriButton/PaywallSubscriButtonProps.generated.ts +77 -0
  443. package/src/build-components/PaywallSubscriButton/pattern.json +27 -0
  444. package/src/build-components/PaywallSubscribeButton/PaywallSubscribeButton.tsx +60 -0
  445. package/src/build-components/PaywallSubscribeButton/PaywallSubscribeButtonProps.generated.ts +77 -0
  446. package/src/build-components/PaywallSubscribeButton/pattern.json +27 -0
  447. package/src/build-components/RadioButton/RadioButton.tsx +123 -0
  448. package/src/build-components/RadioButton/RadioButtonProps.generated.ts +66 -0
  449. package/src/build-components/RadioButton/pattern.json +42 -0
  450. package/src/build-components/RenderNode.generated.tsx +140 -37
  451. package/src/build-components/Text/Text.tsx +12 -18
  452. package/src/build-components/Text/TextProps.generated.ts +5 -0
  453. package/src/build-components/Text/pattern.json +1 -1
  454. package/src/build-components/View/View.tsx +7 -9
  455. package/src/build-components/View/ViewProps.generated.ts +5 -0
  456. package/src/build-components/View/pattern.json +50 -4
  457. package/src/build-components/index.ts +55 -10
  458. package/src/build-components/patterns.generated.ts +5085 -745
  459. package/src/components/AttributesEditorPanel.tsx +3 -1
  460. package/src/components/Builder.tsx +64 -22
  461. package/src/components/BuilderButton.tsx +2 -7
  462. package/src/components/BuilderProvider.tsx +45 -0
  463. package/src/components/DeviceNavigationBar.tsx +1 -2
  464. package/src/components/EditorHeader.tsx +15 -2
  465. package/src/components/Icon.generated.tsx +540 -0
  466. package/src/components/JsonTextEditor.tsx +185 -0
  467. package/src/components/LocalizationParamsProvider.tsx +22 -0
  468. package/src/components/ParamsProvider.tsx +38 -0
  469. package/src/hooks/useLocalizationParams.ts +5 -0
  470. package/src/hooks/useLocalize.ts +23 -0
  471. package/src/hooks/useParams.ts +8 -0
  472. package/src/hooks/useSafeAreaViewStyle.ts +67 -0
  473. package/src/index.native.ts +75 -0
  474. package/src/index.ts +26 -0
  475. package/src/mockOS/components/MockOSRouter.tsx +12 -11
  476. package/src/mockOS/context/MockOSContext.tsx +12 -41
  477. package/src/mockOS/context/MockOSContextBase.ts +35 -0
  478. package/src/mockOS/index.ts +3 -2
  479. package/src/mockOS/managers/mockPermissionManager.ts +0 -4
  480. package/src/mockOS/managers/navigationManager.ts +1 -6
  481. package/src/modals/AddComponentModal.tsx +1 -0
  482. package/src/modals/BenefitEditModal.tsx +160 -0
  483. package/src/modals/BenefitPresetsModal.tsx +166 -0
  484. package/src/modals/ColorModal.tsx +103 -25
  485. package/src/modals/IconPickerModal.tsx +109 -0
  486. package/src/modals/LocalicationModal.tsx +4 -5
  487. package/src/modals/MockableFeatureModal.tsx +292 -0
  488. package/src/modals/Modal.tsx +8 -1
  489. package/src/modals/ProductEditModal.tsx +215 -0
  490. package/src/modals/ProductPresetsModal.tsx +151 -0
  491. package/src/modals/index.ts +6 -0
  492. package/src/pages/ProjectPage.tsx +79 -16
  493. package/src/pages/tabs/BuilderPanel.tsx +1 -1
  494. package/src/pages/tabs/SideTool.tsx +13 -19
  495. package/src/paywall/hooks/index.ts +5 -0
  496. package/src/paywall/hooks/useCalculateLocalizedPrice.ts +6 -0
  497. package/src/paywall/hooks/useCarouselOptionsSeperator.ts +8 -0
  498. package/src/paywall/hooks/useCloseStatusPaywall.ts +6 -0
  499. package/src/paywall/hooks/useDiscountRate.ts +6 -0
  500. package/src/paywall/hooks/usePaywallCounter.ts +6 -0
  501. package/src/paywall/types/benefits.ts +44 -0
  502. package/src/paywall/types/paywall-types.ts +51 -0
  503. package/src/store.ts +157 -38
  504. package/src/styles/base/_global.scss +54 -41
  505. package/src/styles/components/_attributes-editor.scss +40 -5
  506. package/src/styles/components/_editor-shell.scss +5 -9
  507. package/src/styles/components/_ui-components.scss +2 -1
  508. package/src/styles/index.scss +5 -0
  509. package/src/styles/modals/_benefit-edit-modal.scss +17 -0
  510. package/src/styles/modals/_benefit-presets-modal.scss +79 -0
  511. package/src/styles/modals/_color-modal.scss +30 -1
  512. package/src/styles/modals/_mockable-feature-modal.scss +15 -0
  513. package/src/styles/modals/_product-edit-modal.scss +23 -0
  514. package/src/styles/modals/_product-presets-modal.scss +81 -0
  515. package/src/styles/utilities/_carousel.scss +9 -8
  516. package/src/types/Icons.ts +244 -0
  517. package/src/types/Project.ts +5 -0
  518. package/src/types/jest-globals.d.ts +13 -0
  519. package/src/utils/analyseNode.ts +22 -109
  520. package/src/utils/analyseNodeByPatterns.ts +438 -0
  521. package/src/utils/analyseNodeStructural.ts +52 -0
  522. package/src/utils/extractImageStyle.ts +3 -6
  523. package/src/utils/extractTextStyle.ts +2 -81
  524. package/src/utils/extractViewStyle.ts +39 -15
  525. package/src/utils/findNodeByKeyNested.ts +32 -0
  526. package/src/utils/isCarousel.ts +21 -5
  527. package/src/utils/nodeGuards.ts +26 -0
  528. package/src/utils/novaToJson.ts +21 -9
  529. package/src/utils/patterns.ts +62 -3
  530. package/src/utils/replaceLocalizationParams.ts +15 -0
  531. package/src/utils/selection.ts +24 -0
  532. package/src/utils/useMergedStyle.ts +16 -0
@@ -5,7 +5,7 @@ import type { ProjectColors } from '../types/Project';
5
5
  import { parseSize } from '../size-matters';
6
6
  import { parseColor } from './parseColor';
7
7
 
8
- type ExtractViewStyleOptions = {
8
+ export type ExtractViewStyleOptions = {
9
9
  appConfig?: AppConfig;
10
10
  projectColors?: ProjectColors;
11
11
  };
@@ -21,7 +21,14 @@ export function extractViewStyle<T extends ViewPropsGenerated['attributes']>(
21
21
  flexDirection: 'column',
22
22
  };
23
23
  if (!attributes) return style;
24
+ const isEmptySizeValue = (value: unknown) =>
25
+ value === undefined ||
26
+ value === null ||
27
+ (typeof value === 'string' && value.trim() === '');
24
28
  if (scrollable) {
29
+ // Important for flex children: allow the element to shrink so overflow scroll can work.
30
+ style.minWidth = 0;
31
+ style.minHeight = 0;
25
32
  if (attributes.flexDirection === 'row') {
26
33
  style.overflowX = 'auto';
27
34
  style.overflowY = 'hidden';
@@ -45,7 +52,7 @@ export function extractViewStyle<T extends ViewPropsGenerated['attributes']>(
45
52
  property: K,
46
53
  rawValue: string | number | undefined,
47
54
  ) => {
48
- if (rawValue === undefined) return;
55
+ if (isEmptySizeValue(rawValue)) return;
49
56
  const parsed = parseSize(rawValue);
50
57
  style[property] = parsed as React.CSSProperties[K];
51
58
  };
@@ -54,44 +61,41 @@ export function extractViewStyle<T extends ViewPropsGenerated['attributes']>(
54
61
  setParsedSize('padding', attributes.padding);
55
62
  setParsedSize('margin', attributes.margin);
56
63
 
57
- if (attributes.paddingHorizontal !== undefined) {
64
+ if (!isEmptySizeValue(attributes.paddingHorizontal)) {
58
65
  const parsed = parseSize(attributes.paddingHorizontal);
59
66
  style.paddingLeft = parsed as React.CSSProperties['paddingLeft'];
60
67
  style.paddingRight = parsed as React.CSSProperties['paddingRight'];
61
68
  }
62
- if (attributes.paddingVertical !== undefined) {
69
+ if (!isEmptySizeValue(attributes.paddingVertical)) {
63
70
  const parsed = parseSize(attributes.paddingVertical);
64
71
  style.paddingTop = parsed as React.CSSProperties['paddingTop'];
65
72
  style.paddingBottom = parsed as React.CSSProperties['paddingBottom'];
66
73
  }
67
74
 
75
+ // Explicit per-side paddings should override paddingHorizontal/paddingVertical.
76
+ setParsedSize('paddingTop', attributes.paddingTop);
77
+ setParsedSize('paddingBottom', attributes.paddingBottom);
78
+ setParsedSize('paddingLeft', attributes.paddingLeft);
79
+ setParsedSize('paddingRight', attributes.paddingRight);
80
+
68
81
  const marginHorizontalRaw = (attributes as Record<string, unknown>)
69
82
  .marginHorizontal as string | number | undefined;
70
- if (marginHorizontalRaw !== undefined) {
83
+ if (!isEmptySizeValue(marginHorizontalRaw)) {
71
84
  const parsed = parseSize(marginHorizontalRaw);
72
85
  style.marginLeft = parsed as React.CSSProperties['marginLeft'];
73
86
  style.marginRight = parsed as React.CSSProperties['marginRight'];
74
87
  }
75
88
 
76
- if (attributes.marginVertical !== undefined) {
89
+ if (!isEmptySizeValue(attributes.marginVertical)) {
77
90
  const parsed = parseSize(attributes.marginVertical);
78
91
  style.marginTop = parsed as React.CSSProperties['marginTop'];
79
92
  style.marginBottom = parsed as React.CSSProperties['marginBottom'];
80
93
  }
81
94
 
82
- setParsedSize('paddingTop', attributes.paddingTop);
83
- setParsedSize('paddingBottom', attributes.paddingBottom);
84
- setParsedSize('paddingLeft', attributes.paddingLeft);
85
- setParsedSize('paddingRight', attributes.paddingRight);
86
95
  setParsedSize('marginTop', attributes.marginTop);
87
96
  setParsedSize('marginBottom', attributes.marginBottom);
88
97
  setParsedSize('marginLeft', attributes.marginLeft);
89
98
  setParsedSize('marginRight', attributes.marginRight);
90
- console.log('attributes.backgroundColor', attributes.backgroundColor);
91
- console.log(
92
- 'parseColor(attributes.backgroundColor)',
93
- parseColor(attributes.backgroundColor),
94
- );
95
99
  if (attributes.backgroundColor) {
96
100
  style.backgroundColor =
97
101
  parseColor(attributes.backgroundColor, {
@@ -101,12 +105,32 @@ export function extractViewStyle<T extends ViewPropsGenerated['attributes']>(
101
105
  }
102
106
  setParsedSize('borderRadius', attributes.borderRadius);
103
107
  setParsedSize('width', attributes.width);
108
+ setParsedSize(
109
+ 'minWidth',
110
+ (attributes as ViewPropsGenerated['attributes']).minWidth,
111
+ );
112
+ setParsedSize(
113
+ 'maxWidth',
114
+ (attributes as ViewPropsGenerated['attributes']).maxWidth,
115
+ );
104
116
  setParsedSize('height', attributes.height);
117
+ setParsedSize(
118
+ 'minHeight',
119
+ (attributes as ViewPropsGenerated['attributes']).minHeight,
120
+ );
121
+ setParsedSize(
122
+ 'maxHeight',
123
+ (attributes as ViewPropsGenerated['attributes']).maxHeight,
124
+ );
125
+ if (attributes.flex !== undefined)
126
+ style.flex = attributes.flex as React.CSSProperties['flex'];
105
127
  if (attributes.position)
106
128
  style.position = attributes.position as React.CSSProperties['position'];
107
129
  setParsedSize('top', attributes.top);
108
130
  setParsedSize('bottom', attributes.bottom);
109
131
  setParsedSize('left', attributes.left);
110
132
  setParsedSize('right', attributes.right);
133
+ if (attributes.zIndex !== undefined)
134
+ style.zIndex = attributes.zIndex as React.CSSProperties['zIndex'];
111
135
  return style;
112
136
  }
@@ -0,0 +1,32 @@
1
+ import type { Node, NodeData } from '../types/Node';
2
+
3
+ export function findNodeByKeyNested(node: Node, key: string): NodeData | null {
4
+ if (node === null || node === undefined) {
5
+ return null;
6
+ }
7
+
8
+ if (typeof node === 'string') {
9
+ return null;
10
+ }
11
+
12
+ if (Array.isArray(node)) {
13
+ for (const child of node) {
14
+ const found = findNodeByKeyNested(child, key);
15
+ if (found) {
16
+ return found;
17
+ }
18
+ }
19
+ return null;
20
+ }
21
+
22
+ const recordData = node as NodeData;
23
+ if (recordData.key === key) {
24
+ return recordData;
25
+ }
26
+
27
+ if (recordData.children) {
28
+ return findNodeByKeyNested(recordData.children as Node, key);
29
+ }
30
+
31
+ return null;
32
+ }
@@ -1,28 +1,44 @@
1
1
  import { Node, NodeData } from '../types/Node';
2
+ import { normalizeComponentType } from './patterns';
2
3
 
3
4
  export const isCarouselProvider = (node: Node): node is NodeData => {
4
5
  if (!node || typeof node !== 'object' || Array.isArray(node)) return false;
5
- return 'type' in node && node.type === 'carouselProvider';
6
+ return (
7
+ 'type' in node &&
8
+ normalizeComponentType((node as NodeData).type) === 'CarouselProvider'
9
+ );
6
10
  };
7
11
 
8
12
  export const isCarousel = (node: Node): node is NodeData => {
9
13
  if (!node || typeof node !== 'object' || Array.isArray(node)) return false;
10
- return 'type' in node && node.type === 'carousel';
14
+ return (
15
+ 'type' in node &&
16
+ normalizeComponentType((node as NodeData).type) === 'Carousel'
17
+ );
11
18
  };
12
19
 
13
20
  export const isCarouselItem = (node: Node): node is NodeData => {
14
21
  if (!node || typeof node !== 'object' || Array.isArray(node)) return false;
15
- return 'type' in node && node.type === 'carouselItem';
22
+ return (
23
+ 'type' in node &&
24
+ normalizeComponentType((node as NodeData).type) === 'CarouselItem'
25
+ );
16
26
  };
17
27
 
18
28
  export const isCarouselDots = (node: Node): node is NodeData => {
19
29
  if (!node || typeof node !== 'object' || Array.isArray(node)) return false;
20
- return 'type' in node && node.type === 'carouselDots';
30
+ return (
31
+ 'type' in node &&
32
+ normalizeComponentType((node as NodeData).type) === 'CarouselDots'
33
+ );
21
34
  };
22
35
 
23
36
  export const isCarouselButtons = (node: Node): node is NodeData => {
24
37
  if (!node || typeof node !== 'object' || Array.isArray(node)) return false;
25
- return 'type' in node && node.type === 'carouselButtons';
38
+ return (
39
+ 'type' in node &&
40
+ normalizeComponentType((node as NodeData).type) === 'CarouselButtons'
41
+ );
26
42
  };
27
43
 
28
44
  export const isCarouselComponent = (node: Node): boolean => {
@@ -0,0 +1,26 @@
1
+ import type { Node, NodeDefaultAttribute } from '../types/Node';
2
+
3
+ export function isNodeNullOrUndefined<T = NodeDefaultAttribute>(
4
+ node: Node<T>,
5
+ ): boolean {
6
+ return node === null || node === undefined;
7
+ }
8
+
9
+ export function isNodeString<T = NodeDefaultAttribute>(node: Node<T>): boolean {
10
+ return typeof node === 'string';
11
+ }
12
+
13
+ export function isNodeArray<T = NodeDefaultAttribute>(node: Node<T>): boolean {
14
+ return node instanceof Array;
15
+ }
16
+
17
+ export function isEmptyObject<T = NodeDefaultAttribute>(
18
+ node: Node<T>,
19
+ ): boolean {
20
+ return (
21
+ typeof node === 'object' &&
22
+ node !== null &&
23
+ !Array.isArray(node) &&
24
+ Object.keys(node as object).length === 0
25
+ );
26
+ }
@@ -1,9 +1,13 @@
1
1
  import { Node, NodeData } from '../types/Node';
2
2
  import { Project, ProjectBase } from '../types/Project';
3
-
3
+ //TODO: deprecated olmasına rağmen snapshot testi ekle
4
+ /**
5
+ * @deprecated Legacy converter for old "nova" onboard JSON formats.
6
+ * The built-in samples are now shipped in the new `Project<Node>` format,
7
+ * so this should no longer be needed in normal usage.
8
+ */
4
9
  export function novaToJson(nova: ProjectBase<unknown>): Node {
5
10
  const layout = (nova.data as any).data?.layout;
6
- console.info('layout', layout);
7
11
  if (layout === 'onboard-layout') {
8
12
  return onboardNovaToJson(nova);
9
13
  }
@@ -26,7 +30,6 @@ function onboardNovaToJson(nova: ProjectBase<unknown>): Node {
26
30
 
27
31
  const providerNode: NodeData = {
28
32
  type: 'OnboardProvider',
29
- isMain: true,
30
33
  key: (nova?.data as any)?.data?.key,
31
34
  children: [
32
35
  carouselNode,
@@ -37,15 +40,24 @@ function onboardNovaToJson(nova: ProjectBase<unknown>): Node {
37
40
  ],
38
41
  attributes: {
39
42
  theme: (nova?.data as any)?.theme,
40
- // forward safe area inset preference; default to true when absent
41
- use_safe_area_inset:
42
- (attributes as any)?.use_safe_area_inset !== undefined
43
- ? (attributes as any)?.use_safe_area_inset
44
- : true,
45
43
  },
46
44
  };
47
45
 
48
- return providerNode;
46
+ const mainNode: NodeData = {
47
+ type: 'Main',
48
+ isMain: true,
49
+ key: (nova?.data as any)?.data?.key,
50
+ children: [providerNode],
51
+ attributes: {
52
+ // default safe area view on; can be overridden in the editor
53
+ useSafeAreaView: true,
54
+ },
55
+ };
56
+
57
+ // Provider should have its own key if needed; avoid duplicating root key on child.
58
+ delete (providerNode as any).key;
59
+
60
+ return mainNode;
49
61
  }
50
62
  //@eslint-disable-next-line @typescript-eslint/no-explicit-any
51
63
  function buildCarouselFromPages(pages: any[]): {
@@ -1,4 +1,4 @@
1
- import { patterns as generatedPatterns } from '../build-components';
1
+ import { patterns as generatedPatterns } from '../build-components/patterns.generated';
2
2
  import type { NodeDefaultAttribute } from '../types/Node';
3
3
 
4
4
  export type AttributeMeta = {
@@ -8,6 +8,15 @@ export type AttributeMeta = {
8
8
  specialCategory?: 'padding' | 'margin' | 'offset' | null | string;
9
9
  sort?: number;
10
10
  preferedScale?: 's' | 'vs' | 'f' | '%' | '' | string;
11
+ /**
12
+ * When true, this attribute should remain visible even if the component
13
+ * metadata requests hiding all attributes (e.g. `meta.hideAllAttributes`).
14
+ */
15
+ forceVisible?: boolean;
16
+ /**
17
+ * Alias for `forceVisible` used by some patterns.
18
+ */
19
+ override?: boolean;
11
20
  };
12
21
 
13
22
  export type SpecialCategoryMeta = {
@@ -24,6 +33,9 @@ type PatternMeta = {
24
33
  specialCategories?: Record<string, SpecialCategoryMeta>;
25
34
  desiredParent?: string[];
26
35
  desiredChildren?: string[];
36
+ mockableFeatures?: Record<string, boolean>;
37
+ /** If true, hide all attributes in the editor except ones with `forceVisible/override`. */
38
+ hideAllAttributes?: boolean;
27
39
  };
28
40
 
29
41
  type Pattern = {
@@ -52,9 +64,51 @@ const patternIndex: Map<string, Pattern> = new Map(
52
64
  patterns.map((p) => [p.pattern.type, p]),
53
65
  );
54
66
 
67
+ function pascalToCamelCase(s: string): string {
68
+ if (!s) return s;
69
+ return s[0].toLowerCase() + s.slice(1);
70
+ }
71
+
72
+ function pascalToKebabCase(s: string): string {
73
+ if (!s) return s;
74
+ // BackgroundImage -> background-image, IAPBackground -> iap-background
75
+ return s
76
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
77
+ .replace(/([A-Z]+)([A-Z][a-z0-9]+)/g, '$1-$2')
78
+ .toLowerCase();
79
+ }
80
+
81
+ const typeAliases: Map<string, string> = new Map();
82
+ for (const p of patterns) {
83
+ const canonical = p?.pattern?.type;
84
+ if (typeof canonical !== 'string' || !canonical) continue;
85
+ const aliases = [
86
+ canonical,
87
+ canonical.toLowerCase(),
88
+ pascalToCamelCase(canonical),
89
+ pascalToKebabCase(canonical),
90
+ ];
91
+ for (const a of aliases) {
92
+ if (!a) continue;
93
+ if (!typeAliases.has(a)) {
94
+ typeAliases.set(a, canonical);
95
+ }
96
+ }
97
+ }
98
+
99
+ /** Normalize legacy/variant component type strings to the canonical pattern.type (PascalCase). */
100
+ export function normalizeComponentType(
101
+ type?: string | null,
102
+ ): string | undefined {
103
+ if (typeof type !== 'string' || !type) return undefined;
104
+ if (patternIndex.has(type)) return type;
105
+ return typeAliases.get(type) ?? typeAliases.get(type.toLowerCase());
106
+ }
107
+
55
108
  export function getPatternByType(type?: string | null): Pattern | undefined {
56
109
  if (typeof type !== 'string') return undefined;
57
- return patternIndex.get(type);
110
+ const normalized = normalizeComponentType(type) ?? type;
111
+ return patternIndex.get(normalized);
58
112
  }
59
113
 
60
114
  export function getAttributeSchema(
@@ -101,7 +155,12 @@ export function getTypeSchema(
101
155
  /** Utility: returns true if the type name refers to a primitive scalar */
102
156
  export function isPrimitiveType(typeName: string): boolean {
103
157
  return (
104
- typeName === 'string' || typeName === 'number' || typeName === 'boolean'
158
+ typeName === 'string' ||
159
+ typeName === 'number' ||
160
+ typeName === 'boolean' ||
161
+ typeName === 'color' ||
162
+ typeName === 'size' ||
163
+ typeName === 'iconType'
105
164
  );
106
165
  }
107
166
 
@@ -0,0 +1,15 @@
1
+ export function replaceLocalizationParams(
2
+ text: string,
3
+ params?: Record<string, string> | null,
4
+ ): string {
5
+ if (!text) return text;
6
+ if (!params) return text;
7
+
8
+ return (
9
+ Object.entries(params).reduce((acc, [key, val]) => {
10
+ const needle = `@${key}`;
11
+ // Replace all occurrences without regex escaping pitfalls.
12
+ return acc.split(needle).join(String(val));
13
+ }, text) || text
14
+ );
15
+ }
@@ -0,0 +1,24 @@
1
+ import type { CSSProperties } from 'react';
2
+
3
+ export const SELECTED_OUTLINE_STYLE: CSSProperties = {
4
+ outline: '2px solid #2684FF',
5
+ };
6
+
7
+ function getNodeKey(value: unknown): string | undefined {
8
+ if (!value || typeof value !== 'object') return undefined;
9
+ if (!('key' in value)) return undefined;
10
+ const key = (value as { key?: unknown }).key;
11
+ return typeof key === 'string' ? key : undefined;
12
+ }
13
+
14
+ export function isNodeSelected(args: {
15
+ previewMode: boolean;
16
+ current?: unknown;
17
+ node?: unknown;
18
+ }): boolean {
19
+ const currentKey = getNodeKey(args.current);
20
+ const nodeKey = getNodeKey(args.node);
21
+ return (
22
+ !!args.previewMode && !!currentKey && !!nodeKey && currentKey === nodeKey
23
+ );
24
+ }
@@ -0,0 +1,16 @@
1
+ import { useMemo } from 'react';
2
+ import type { CSSProperties } from 'react';
3
+
4
+ const EMPTY_STYLE: CSSProperties = {};
5
+
6
+ export function useMergedStyle(
7
+ base?: CSSProperties,
8
+ override?: CSSProperties,
9
+ ): CSSProperties {
10
+ return useMemo(() => {
11
+ if (!base && !override) return EMPTY_STYLE;
12
+ if (!override) return base ?? EMPTY_STYLE;
13
+ if (!base) return override;
14
+ return { ...base, ...override };
15
+ }, [base, override]);
16
+ }