@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
@@ -0,0 +1,151 @@
1
+ import React, { useMemo } from 'react';
2
+ import Modal from './Modal';
3
+ import type { Product } from '../paywall/types/paywall-types';
4
+ import presetsJson from '../assets/products.json';
5
+
6
+ type PresetMap = Record<string, Product[]>;
7
+ const DEFAULT_PRESET_KEY = 'Embeded Paywall';
8
+
9
+ type ProductPresetsModalProps = {
10
+ current: Product[];
11
+ onReplace: (next: Product[]) => void;
12
+ onAppend: (next: Product[]) => void;
13
+ onClose: () => void;
14
+ };
15
+
16
+ function normalizeProduct(p: Product): Product {
17
+ return {
18
+ productId: p?.productId ?? '',
19
+ title: p?.title ?? '',
20
+ description: p?.description ?? '',
21
+ localizedPrice: p?.localizedPrice ?? '',
22
+ price: p?.price ?? '',
23
+ currency: p?.currency ?? '',
24
+ };
25
+ }
26
+
27
+ function getPresetMap(): PresetMap {
28
+ const raw = presetsJson as unknown as PresetMap;
29
+ const safe: PresetMap = {};
30
+ Object.entries(raw ?? {}).forEach(([key, list]) => {
31
+ if (!key || typeof key !== 'string') return;
32
+ if (!Array.isArray(list)) return;
33
+ safe[key] = list
34
+ .filter(Boolean)
35
+ .map((p) => normalizeProduct(p as Product))
36
+ .filter((p) => typeof p.productId === 'string');
37
+ });
38
+ return safe;
39
+ }
40
+
41
+ export function ProductPresetsModal({
42
+ current,
43
+ onReplace,
44
+ onAppend,
45
+ onClose,
46
+ }: ProductPresetsModalProps) {
47
+ const presetMap = useMemo(() => getPresetMap(), []);
48
+ const presetEntries = useMemo(
49
+ () =>
50
+ Object.entries(presetMap).sort((a, b) => {
51
+ const aKey = a[0];
52
+ const bKey = b[0];
53
+ if (aKey === DEFAULT_PRESET_KEY && bKey !== DEFAULT_PRESET_KEY)
54
+ return -1;
55
+ if (bKey === DEFAULT_PRESET_KEY && aKey !== DEFAULT_PRESET_KEY)
56
+ return 1;
57
+ return aKey.localeCompare(bKey);
58
+ }),
59
+ [presetMap],
60
+ );
61
+
62
+ return (
63
+ <Modal
64
+ onClose={onClose}
65
+ ariaLabelledBy="product-presets-modal-title"
66
+ contentClassName="product-presets-modal"
67
+ >
68
+ <div className="modal__header">
69
+ <h3 id="product-presets-modal-title" className="modal__title">
70
+ Product presets
71
+ </h3>
72
+ <button type="button" className="editor-button" onClick={onClose}>
73
+ Close
74
+ </button>
75
+ </div>
76
+
77
+ <div className="product-presets-modal__body">
78
+ <section className="product-presets-modal__section">
79
+ <p className="product-presets-modal__section-title">
80
+ Current ({Array.isArray(current) ? current.length : 0})
81
+ </p>
82
+ <p className="product-presets-modal__muted">
83
+ Pick a preset below to replace or append to the current list.
84
+ </p>
85
+ </section>
86
+
87
+ <section className="product-presets-modal__section">
88
+ <p className="product-presets-modal__section-title">Presets</p>
89
+
90
+ {presetEntries.length ? (
91
+ <div className="product-presets-modal__grid">
92
+ {presetEntries.map(([key, list]) => (
93
+ <div key={key} className="product-presets-modal__card">
94
+ <div className="product-presets-modal__card-header">
95
+ <p className="product-presets-modal__card-title">{key}</p>
96
+ <p className="product-presets-modal__card-count">
97
+ {list.length} products
98
+ </p>
99
+ </div>
100
+
101
+ <ul className="product-presets-modal__card-list">
102
+ {list.slice(0, 3).map((p) => (
103
+ <li
104
+ key={p.productId}
105
+ className="product-presets-modal__card-item"
106
+ >
107
+ {p.productId}
108
+ </li>
109
+ ))}
110
+ {list.length > 3 ? (
111
+ <li className="product-presets-modal__card-item product-presets-modal__muted">
112
+ +{list.length - 3} more…
113
+ </li>
114
+ ) : null}
115
+ </ul>
116
+
117
+ <div className="product-presets-modal__actions">
118
+ <button
119
+ type="button"
120
+ className="editor-button"
121
+ onClick={() => {
122
+ onReplace(list);
123
+ onClose();
124
+ }}
125
+ >
126
+ Replace
127
+ </button>
128
+ <button
129
+ type="button"
130
+ className="editor-button"
131
+ onClick={() => {
132
+ onAppend(list);
133
+ onClose();
134
+ }}
135
+ >
136
+ Append
137
+ </button>
138
+ </div>
139
+ </div>
140
+ ))}
141
+ </div>
142
+ ) : (
143
+ <p className="product-presets-modal__muted">No presets found.</p>
144
+ )}
145
+ </section>
146
+ </div>
147
+ </Modal>
148
+ );
149
+ }
150
+
151
+ export default ProductPresetsModal;
@@ -2,4 +2,10 @@ export { default as Modal } from './Modal';
2
2
  export { AddComponentModal } from './AddComponentModal';
3
3
  export { DeviceSelectorModal } from './DeviceSelectorModal';
4
4
  export { ColorModal } from './ColorModal';
5
+ export { IconPickerModal } from './IconPickerModal';
5
6
  export { LocalicationModal } from './LocalicationModal';
7
+ export { MockableFeatureModal } from './MockableFeatureModal';
8
+ export { ProductEditModal } from './ProductEditModal';
9
+ export { ProductPresetsModal } from './ProductPresetsModal';
10
+ export { BenefitEditModal } from './BenefitEditModal';
11
+ export { BenefitPresetsModal } from './BenefitPresetsModal';
@@ -1,7 +1,10 @@
1
1
  import { useCallback, useEffect, useState } from 'react';
2
- import { Node, NodeData, RenderPage, Project, ProjectColors } from '..';
2
+ import type { Node, NodeData } from '../types/Node';
3
+ import type { Project, ProjectColors } from '../types/Project';
4
+ import { RenderPage } from '../RenderPage';
3
5
  import { EditorHeader } from '../components/EditorHeader';
4
6
  import { AttributesEditorPanel } from '../components/AttributesEditorPanel';
7
+ import { BuilderProvider } from '../components/BuilderProvider';
5
8
  import { BuilderPanel } from './tabs/BuilderPanel';
6
9
  import { SideTool } from './tabs/SideTool';
7
10
  import { AppConfig, defaultAppConfig } from '../types/PreviewConfig';
@@ -11,12 +14,16 @@ import { useLogRender } from '../utils/useLogRender';
11
14
  import type { LogLevel } from '../types/Project';
12
15
  import { analyseAndProccess } from '../utils/analyseNode';
13
16
  import backgroundImage from '../assets/images/background.jpg';
17
+ import type { PaywallBenefits } from '../paywall/types/benefits';
18
+ import Lottie from 'lottie-react';
19
+ import loadingAnimation from '../assets/loading_animation.json';
14
20
  export type ProjectPageProps = {
15
21
  project: Project;
16
22
  onSaveProject: (project: Project) => void;
17
23
  appConfig?: AppConfig;
18
24
  logLevel?: LogLevel;
19
25
  projectColors?: ProjectColors;
26
+ name: string;
20
27
  };
21
28
 
22
29
  const MOBILE_BREAKPOINT = 1000;
@@ -27,15 +34,28 @@ export function ProjectPage({
27
34
  onSaveProject,
28
35
  logLevel,
29
36
  projectColors,
37
+ name,
30
38
  }: ProjectPageProps) {
31
39
  useLogRender('ProjectPage');
32
40
  const resolvedProjectColors = projectColors ?? project.projectColors;
33
- const { current, setCurrent, setProjectColors } = useRenderStore((s) => ({
41
+ const {
42
+ current,
43
+ setCurrent,
44
+ setProjectColors,
45
+ setProjectName,
46
+ products,
47
+ benefits,
48
+ } = useRenderStore((s) => ({
34
49
  current: s.current,
35
50
  setCurrent: s.setCurrent,
36
51
  setProjectColors: s.setProjectColors,
52
+ setProjectName: s.setProjectName,
53
+ products: s.products,
54
+ benefits: s.benefits,
37
55
  }));
38
56
  const [editorData, setEditorData] = useState<Node>(null);
57
+ const [minLoadingDelayDone, setMinLoadingDelayDone] =
58
+ useState<boolean>(false);
39
59
  const [mobilePanel, setMobilePanel] = useState<
40
60
  'builder' | 'attributes' | null
41
61
  >(null);
@@ -46,8 +66,14 @@ export function ProjectPage({
46
66
 
47
67
  const handleDeleteNode = useCallback(
48
68
  (nodeToDelete: Node) => {
49
- // Do not allow deleting the root node
69
+ // Extra warning for deleting the root node (editorData)
50
70
  if (nodeToDelete === editorData) {
71
+ const shouldDeleteRoot = window.confirm(
72
+ 'You are about to delete the root component. This will clear the entire screen. Continue?',
73
+ );
74
+ if (!shouldDeleteRoot) return;
75
+ setEditorData(null);
76
+ setCurrent(null);
51
77
  return;
52
78
  }
53
79
  const updated: Node = deleteNodeFromTree(editorData, nodeToDelete);
@@ -81,6 +107,10 @@ export function ProjectPage({
81
107
  };
82
108
  }, [appConfig, project.name]);
83
109
 
110
+ useEffect(() => {
111
+ setProjectName(name);
112
+ }, [name, setProjectName]);
113
+
84
114
  useEffect(() => {
85
115
  setProjectColors(resolvedProjectColors);
86
116
  return () => setProjectColors(undefined);
@@ -116,8 +146,18 @@ export function ProjectPage({
116
146
  const leftPanelIsOpen = !isMobile || mobilePanel === 'builder';
117
147
  const attributesPanelIsOpen = !isMobile || mobilePanel === 'attributes';
118
148
 
149
+ useEffect(() => {
150
+ setMinLoadingDelayDone(false);
151
+ const timer = setTimeout(() => setMinLoadingDelayDone(true), 1000);
152
+ return () => clearTimeout(timer);
153
+ }, [project.data]);
154
+
119
155
  useEffect(() => {
120
156
  try {
157
+ // Reset to "loading" immediately on project change so the loader is shown
158
+ // until a valid node is available (and for at least 2 seconds).
159
+ setEditorData(null);
160
+ setCurrent(null);
121
161
  const processed = analyseAndProccess(project.data);
122
162
  if (!processed) {
123
163
  setEditorData(null);
@@ -127,13 +167,14 @@ export function ProjectPage({
127
167
  setEditorData(processed);
128
168
  setCurrent(processed);
129
169
  } catch (error) {
130
- // eslint-disable-next-line no-alert
131
- alert('Duplicate node key detected. Please check your project data.');
170
+ console.error(error);
132
171
  setEditorData(null);
133
172
  setCurrent(null);
134
173
  }
135
174
  }, [project.data]);
136
175
 
176
+ const showLoading = editorData === null || !minLoadingDelayDone;
177
+
137
178
  return (
138
179
  <div className="container-full">
139
180
  <EditorHeader
@@ -227,17 +268,31 @@ export function ProjectPage({
227
268
  />
228
269
  </div>
229
270
  </div>
230
- <div className="split-right">
231
- <div className="split-right__controls">
232
- <SideTool data={editorData} setData={setEditorData} />
233
- </div>
234
- <div
235
- className="split-right-background"
236
- style={{
237
- backgroundImage: `url(${backgroundImage})`,
238
- }}
239
- />
240
- {editorData && <RenderPage data={editorData} name={project.name} />}
271
+ <div
272
+ style={{ backgroundImage: `url(${backgroundImage})` }}
273
+ className="split-right"
274
+ >
275
+ <SideTool data={editorData} setData={setEditorData} />
276
+
277
+ {showLoading && (
278
+ <div className="rb-loading-overlay" aria-busy="true">
279
+ <LoadingComponent />
280
+ </div>
281
+ )}
282
+ {/* NOTE: In React Native, `products` should come from an IAP wrapper (e.g. `react-native-iap`). */}
283
+ {!showLoading && editorData && (
284
+ <BuilderProvider
285
+ params={{
286
+ products,
287
+ benefits:
288
+ benefits && typeof benefits === 'object'
289
+ ? (benefits as PaywallBenefits)
290
+ : {},
291
+ }}
292
+ >
293
+ <RenderPage data={editorData} name={project.name} />
294
+ </BuilderProvider>
295
+ )}
241
296
  </div>
242
297
  <div
243
298
  id="split-attributes-panel"
@@ -289,6 +344,14 @@ export function ProjectPage({
289
344
  );
290
345
  }
291
346
 
347
+ function LoadingComponent() {
348
+ return (
349
+ <div className="rb-loading">
350
+ <Lottie animationData={loadingAnimation as any} loop autoplay />
351
+ </div>
352
+ );
353
+ }
354
+
292
355
  function deleteNodeFromTree(root: Node, target: Node): Node {
293
356
  if (root === null || root === undefined) return root;
294
357
  if (typeof root === 'string') return root;
@@ -1,4 +1,4 @@
1
- import { Node } from '../..';
1
+ import type { Node } from '../../types/Node';
2
2
  import { useLogRender } from '../../utils/useLogRender';
3
3
  import { Builder } from '../../components/Builder';
4
4
  import { useRenderStore } from '../../store';
@@ -1,11 +1,13 @@
1
1
  import React, { useEffect, useState } from 'react';
2
- import { JsonEditor } from 'json-edit-react';
2
+ import { JsonTextEditor } from '../../components/JsonTextEditor';
3
3
  import { Modal } from '../../modals';
4
- import { Localication, Node } from '../..';
4
+ import type { Node } from '../../types/Node';
5
+ import type { Localication } from '../../types/PreviewConfig';
5
6
  import { useLogRender } from '../../utils/useLogRender';
6
7
  import { useRenderStore } from '../../store';
7
8
  import { Checkbox } from '../../components/Checkbox';
8
9
  import { LocalicationModal } from '../../modals/LocalicationModal';
10
+ import { analyseAndProccess } from '../../utils/analyseNode';
9
11
 
10
12
  const screenStyleDefaults = {
11
13
  light: { backgroundColor: '#FDFDFD', color: '#161827' },
@@ -17,7 +19,7 @@ type ScreenColorKey = keyof (typeof screenStyleDefaults)['light'];
17
19
 
18
20
  type SideToolProps = {
19
21
  data: Node;
20
- setData: (data: Node) => void;
22
+ setData: React.Dispatch<React.SetStateAction<Node>>;
21
23
  };
22
24
 
23
25
  const colorFields = [
@@ -108,27 +110,18 @@ export function SideTool({ data, setData }: SideToolProps) {
108
110
  };
109
111
 
110
112
  return (
111
- <div
112
- style={{
113
- height: '100%',
114
- display: 'flex',
115
- flexDirection: 'column',
116
- gap: 8,
117
- backgroundColor: isCompactMode ? '#fff' : undefined,
118
- }}
119
- >
113
+ <div className="side-tool-container">
120
114
  <button
121
115
  type="button"
122
116
  className="editor-button"
123
117
  onClick={() => setIsCompactPanelVisible((prev) => !prev)}
124
118
  aria-pressed={isCompactPanelVisible}
125
- style={{ alignSelf: 'flex-start' }}
126
119
  >
127
120
  {isCompactPanelVisible ? 'Hide tools' : 'Show tools'}
128
121
  </button>
129
122
 
130
123
  {isCompactPanelVisible && (
131
- <div className="side-tool" style={{ display: 'flex', height: '100%' }}>
124
+ <div className="side-tool">
132
125
  <select
133
126
  value={appConfig.defaultLanguage ?? 'en'}
134
127
  onChange={(e) =>
@@ -233,12 +226,13 @@ export function SideTool({ data, setData }: SideToolProps) {
233
226
  </div>
234
227
  <div className="localication-modal__body">
235
228
  <div className="localication-modal__editor">
236
- <JsonEditor
237
- rootName="debug"
238
- data={data as any}
239
- setData={setData as any}
229
+ <JsonTextEditor
230
+ rootName="node"
231
+ value={data ?? {}}
232
+ onChange={(next) =>
233
+ setData(analyseAndProccess(next as Node) as Node)
234
+ }
240
235
  className="localication-modal__json-editor"
241
- maxWidth="100%"
242
236
  />
243
237
  </div>
244
238
  </div>
@@ -0,0 +1,5 @@
1
+ export { usePaywallCounter } from './usePaywallCounter';
2
+ export { useCloseStatusPaywall } from './useCloseStatusPaywall';
3
+ export { useCarouselOptionsSeperator } from './useCarouselOptionsSeperator';
4
+ export { useCalculateLocalizedPrice } from './useCalculateLocalizedPrice';
5
+ export { useDiscountRate } from './useDiscountRate';
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Placeholder hook — will be implemented later.
3
+ */
4
+ export function useCalculateLocalizedPrice(): string {
5
+ return '';
6
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Placeholder hook — will be implemented later.
3
+ *
4
+ * NOTE: name kept as `Seperator` to match existing external API usage.
5
+ */
6
+ export function useCarouselOptionsSeperator(): string {
7
+ return '';
8
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Placeholder hook — will be implemented later.
3
+ */
4
+ export function useCloseStatusPaywall(): boolean {
5
+ return false;
6
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Placeholder hook — will be implemented later.
3
+ */
4
+ export function useDiscountRate(): number {
5
+ return 0;
6
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Placeholder hook — will be implemented later.
3
+ */
4
+ export function usePaywallCounter(): number {
5
+ return 0;
6
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Benefits are a simple key/value map used by paywall UIs to show feature bullets,
3
+ * trial metadata, headlines, etc.
4
+ *
5
+ * We keep the value type primitive so it serializes cleanly and is easy to mock.
6
+ */
7
+ export type PaywallBenefitValue = string | number | boolean;
8
+
9
+ export type PaywallBenefits = Record<string, PaywallBenefitValue>;
10
+
11
+ export type PaywallBenefitEntry = {
12
+ key: string;
13
+ value: PaywallBenefitValue;
14
+ };
15
+
16
+ export function benefitMapToEntries(
17
+ map: PaywallBenefits | undefined,
18
+ ): PaywallBenefitEntry[] {
19
+ if (!map || typeof map !== 'object') return [];
20
+ return Object.entries(map)
21
+ .filter(([key]) => typeof key === 'string' && key.trim().length > 0)
22
+ .map(([key, value]) => ({ key, value: value as PaywallBenefitValue }));
23
+ }
24
+
25
+ export function benefitEntriesToMap(
26
+ entries: Array<PaywallBenefitEntry | null | undefined> | undefined,
27
+ ): PaywallBenefits {
28
+ const out: PaywallBenefits = {};
29
+ if (!Array.isArray(entries)) return out;
30
+ entries.forEach((entry) => {
31
+ const key = entry?.key?.toString?.().trim?.() ?? '';
32
+ if (!key) return;
33
+ const value = entry?.value as PaywallBenefitValue;
34
+ if (
35
+ typeof value !== 'string' &&
36
+ typeof value !== 'number' &&
37
+ typeof value !== 'boolean'
38
+ ) {
39
+ return;
40
+ }
41
+ out[key] = value;
42
+ });
43
+ return out;
44
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Simple paywall-related types.
3
+ *
4
+ * We keep this intentionally small and runtime-agnostic.
5
+ *
6
+ * Product fields are based on the common shape returned by `react-native-iap`
7
+ * calls like `getProducts()` / `getSubscriptions()`.
8
+ * See: `https://www.npmjs.com/package/react-native-iap`
9
+ */
10
+
11
+ export type { PaywallBenefits, PaywallBenefitValue } from './benefits';
12
+
13
+ /**
14
+ * Minimal "product" representation (compatible with `react-native-iap` product-ish objects).
15
+ *
16
+ * Note: `react-native-iap` has slightly different fields per platform/product type.
17
+ * This is the common subset most paywalls need.
18
+ */
19
+ export interface Product {
20
+ /** iOS: `productId`, Android: `productId` */
21
+ productId: string;
22
+
23
+ /** Display name / title from the store (when available). */
24
+ title?: string;
25
+
26
+ /** Description from the store (when available). */
27
+ description?: string;
28
+
29
+ /**
30
+ * Localized formatted price (e.g. "$4.99", "€9,99").
31
+ * In `react-native-iap` this is typically `localizedPrice`.
32
+ */
33
+ localizedPrice?: string;
34
+
35
+ /**
36
+ * Raw price string from the store (often numeric string).
37
+ * In `react-native-iap` this is typically `price`.
38
+ */
39
+ price?: string;
40
+
41
+ /** Currency code (e.g. "USD", "EUR"). */
42
+ currency?: string;
43
+ }
44
+
45
+ /**
46
+ * A simple paywall model you can store/serialize.
47
+ */
48
+ export interface PaywallModel {
49
+ product: Product[];
50
+ benefits: import('./benefits').PaywallBenefits;
51
+ }