@developer_tribe/react-builder 1.0.4 → 1.0.6

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 (512) hide show
  1. package/README.md +6 -0
  2. package/dist/assets/samples/getSamples.d.ts +1 -0
  3. package/dist/background.jpg +0 -0
  4. package/dist/build-components/BIcon/BIcon.d.ts +5 -0
  5. package/dist/build-components/BIcon/BIconProps.generated.d.ts +55 -0
  6. package/dist/build-components/BackgroundImage/BackgroundImageProps.generated.d.ts +4 -0
  7. package/dist/build-components/Button/ButtonProps.generated.d.ts +4 -0
  8. package/dist/build-components/Carousel/CarouselProps.generated.d.ts +4 -0
  9. package/dist/build-components/CarouselButtons/CarouselButtonsProps.generated.d.ts +4 -0
  10. package/dist/build-components/CarouselDots/CarouselDotsProps.generated.d.ts +4 -0
  11. package/dist/build-components/CarouselItem/CarouselItemProps.generated.d.ts +4 -0
  12. package/dist/build-components/CarouselProvider/CarouselProviderProps.generated.d.ts +4 -0
  13. package/dist/build-components/Image/ImageProps.generated.d.ts +4 -0
  14. package/dist/build-components/Main/Main.d.ts +5 -0
  15. package/dist/build-components/Main/MainProps.generated.d.ts +48 -0
  16. package/dist/build-components/Onboard/OnboardProps.generated.d.ts +4 -0
  17. package/dist/build-components/OnboardButton/OnboardButtonProps.generated.d.ts +4 -0
  18. package/dist/build-components/OnboardButtons/OnboardButtonsProps.generated.d.ts +4 -0
  19. package/dist/build-components/OnboardDot/OnboardDotProps.generated.d.ts +4 -0
  20. package/dist/build-components/OnboardFooter/OnboardFooterProps.generated.d.ts +4 -0
  21. package/dist/build-components/OnboardImage/OnboardImageProps.generated.d.ts +4 -0
  22. package/dist/build-components/OnboardItem/OnboardItemProps.generated.d.ts +4 -0
  23. package/dist/build-components/OnboardProvider/OnboardProviderProps.generated.d.ts +4 -1
  24. package/dist/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.d.ts +4 -0
  25. package/dist/build-components/OnboardTitle/OnboardTitleProps.generated.d.ts +4 -0
  26. package/dist/build-components/PaywallBackground/PaywallBackground.d.ts +5 -0
  27. package/dist/build-components/PaywallBackground/PaywallBackgroundProps.generated.d.ts +47 -0
  28. package/dist/build-components/PaywallCloseButton/PaywallCloseButton.d.ts +5 -0
  29. package/dist/build-components/PaywallCloseButton/PaywallCloseButtonProps.generated.d.ts +56 -0
  30. package/dist/build-components/PaywallOptions/PaywallOptionButton.d.ts +9 -0
  31. package/dist/build-components/PaywallOptions/PaywallOptions.d.ts +5 -0
  32. package/dist/build-components/PaywallOptions/PaywallOptionsProps.generated.d.ts +47 -0
  33. package/dist/build-components/PaywallOptions/usePaywallOptionParamsFactory.d.ts +10 -0
  34. package/dist/build-components/PaywallProvider/PaywallProvider.d.ts +5 -0
  35. package/dist/build-components/PaywallProvider/PaywallProviderProps.generated.d.ts +47 -0
  36. package/dist/build-components/PaywallSubscribeButton/PaywallSubscribeButton.d.ts +5 -0
  37. package/dist/build-components/PaywallSubscribeButton/PaywallSubscribeButtonProps.generated.d.ts +50 -0
  38. package/dist/build-components/RadioButton/RadioButton.d.ts +11 -0
  39. package/dist/build-components/RadioButton/RadioButtonProps.generated.d.ts +50 -0
  40. package/dist/build-components/RenderNode.generated.d.ts +1 -1
  41. package/dist/build-components/Text/TextProps.generated.d.ts +4 -0
  42. package/dist/build-components/View/ViewProps.generated.d.ts +4 -0
  43. package/dist/build-components/index.d.ts +9 -1
  44. package/dist/build-components/patterns.generated.d.ts +4442 -655
  45. package/dist/components/AttributesEditorPanel.d.ts +4 -3
  46. package/dist/components/BottomBar.d.ts +8 -0
  47. package/dist/components/Builder.d.ts +1 -1
  48. package/dist/components/BuilderButton.d.ts +1 -1
  49. package/dist/components/BuilderProvider.d.ts +15 -0
  50. package/dist/components/Checkbox.d.ts +1 -1
  51. package/dist/components/EditorHeader.d.ts +1 -1
  52. package/dist/components/Icon.generated.d.ts +11 -0
  53. package/dist/components/LoadingComponent.d.ts +1 -0
  54. package/dist/components/LocalizationParamsProvider.d.ts +11 -0
  55. package/dist/components/MobilePanelToggleButton.d.ts +8 -0
  56. package/dist/components/ParamsProvider.d.ts +14 -0
  57. package/dist/hooks/useLocalizationParams.d.ts +1 -0
  58. package/dist/hooks/useLocalize.d.ts +2 -0
  59. package/dist/hooks/useMinimumDelay.d.ts +7 -0
  60. package/dist/hooks/useMobileEditorPanels.d.ts +12 -0
  61. package/dist/hooks/useParams.d.ts +1 -0
  62. package/dist/hooks/useSafeAreaViewStyle.d.ts +1 -0
  63. package/dist/hooks/useSyncProjectPageStore.d.ts +15 -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/ScreenColorsModal.d.ts +8 -0
  85. package/dist/modals/index.d.ts +7 -0
  86. package/dist/pages/ProjectPage.d.ts +3 -2
  87. package/dist/pages/tabs/BuilderPanel.d.ts +3 -3
  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 +35 -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/findNodeByKeyNested.d.ts +2 -0
  104. package/dist/utils/nodeGuards.d.ts +5 -0
  105. package/dist/utils/nodeTree.d.ts +5 -0
  106. package/dist/utils/novaToJson.d.ts +5 -0
  107. package/dist/utils/patterns.d.ts +14 -0
  108. package/dist/utils/replaceLocalizationParams.d.ts +1 -0
  109. package/package.json +33 -3
  110. package/scripts/prebuild/assets/icon.template +71 -0
  111. package/scripts/prebuild/build-components.js +5 -0
  112. package/scripts/prebuild/icon-generator.js +206 -0
  113. package/scripts/prebuild/prebuild.js +10 -1
  114. package/scripts/prebuild/utils/createComponentTsx.js +6 -3
  115. package/scripts/prebuild/utils/createGeneratedProps.js +4 -2
  116. package/scripts/prebuild/utils/createRenderNodeGenerated.js +43 -8
  117. package/scripts/prebuild/utils/validateAllComponentsOrThrow.js +20 -9
  118. package/scripts/prebuild/utils/validatePatternJson.js +3 -2
  119. package/src/AttributesEditor.tsx +178 -34
  120. package/src/DeviceMockFrame.tsx +41 -43
  121. package/src/RenderPage.tsx +11 -49
  122. package/src/assets/benefits.json +24 -0
  123. package/src/assets/iconset/activity-heart.svg +3 -0
  124. package/src/assets/iconset/activity.svg +3 -0
  125. package/src/assets/iconset/alert-circle.svg +3 -0
  126. package/src/assets/iconset/alert-triangle.svg +3 -0
  127. package/src/assets/iconset/anchor.svg +3 -0
  128. package/src/assets/iconset/archive.svg +3 -0
  129. package/src/assets/iconset/arrow-down.svg +3 -0
  130. package/src/assets/iconset/arrow-left.svg +3 -0
  131. package/src/assets/iconset/arrow-narrow-down-left.svg +3 -0
  132. package/src/assets/iconset/arrow-narrow-up-right.svg +3 -0
  133. package/src/assets/iconset/arrow-right-smooth.svg +4 -0
  134. package/src/assets/iconset/arrow-right.svg +7 -0
  135. package/src/assets/iconset/asterisk-01.svg +3 -0
  136. package/src/assets/iconset/asterisk-02.svg +3 -0
  137. package/src/assets/iconset/at-sign.svg +3 -0
  138. package/src/assets/iconset/award.svg +4 -0
  139. package/src/assets/iconset/battery-charging.svg +6 -0
  140. package/src/assets/iconset/bell-01.svg +5 -0
  141. package/src/assets/iconset/bell-02.svg +3 -0
  142. package/src/assets/iconset/bell-ringing-02.svg +3 -0
  143. package/src/assets/iconset/bookmark-add.svg +3 -0
  144. package/src/assets/iconset/bookmark-check.svg +3 -0
  145. package/src/assets/iconset/bookmark-minus.svg +3 -0
  146. package/src/assets/iconset/bookmark-x.svg +3 -0
  147. package/src/assets/iconset/bookmark.svg +3 -0
  148. package/src/assets/iconset/bubble.svg +5 -0
  149. package/src/assets/iconset/building-01.svg +3 -0
  150. package/src/assets/iconset/building-02.svg +3 -0
  151. package/src/assets/iconset/building-03.svg +3 -0
  152. package/src/assets/iconset/building-04.svg +3 -0
  153. package/src/assets/iconset/building-05.svg +3 -0
  154. package/src/assets/iconset/building-06.svg +3 -0
  155. package/src/assets/iconset/building-07.svg +3 -0
  156. package/src/assets/iconset/building-08.svg +3 -0
  157. package/src/assets/iconset/building-09.svg +3 -0
  158. package/src/assets/iconset/camera-01.svg +8 -0
  159. package/src/assets/iconset/camera-steel.svg +4 -0
  160. package/src/assets/iconset/camera.svg +4 -0
  161. package/src/assets/iconset/check-circle-bold.svg +3 -0
  162. package/src/assets/iconset/check-circle-broken.svg +3 -0
  163. package/src/assets/iconset/check-circle.svg +3 -0
  164. package/src/assets/iconset/check-done-01.svg +3 -0
  165. package/src/assets/iconset/check-done-02.svg +3 -0
  166. package/src/assets/iconset/check-heart.svg +3 -0
  167. package/src/assets/iconset/check-square-broken.svg +3 -0
  168. package/src/assets/iconset/check-square.svg +3 -0
  169. package/src/assets/iconset/check-verified-01.svg +3 -0
  170. package/src/assets/iconset/check-verified-02.svg +3 -0
  171. package/src/assets/iconset/check-verified-03.svg +3 -0
  172. package/src/assets/iconset/check.svg +3 -0
  173. package/src/assets/iconset/checkbox.svg +4 -0
  174. package/src/assets/iconset/checkv.svg +3 -0
  175. package/src/assets/iconset/chevron-down.svg +3 -0
  176. package/src/assets/iconset/chevron-down2.svg +3 -0
  177. package/src/assets/iconset/chevron-left-2.svg +3 -0
  178. package/src/assets/iconset/chevron-left.svg +3 -0
  179. package/src/assets/iconset/chevron-right-empty.svg +3 -0
  180. package/src/assets/iconset/chevron-right-smooth.svg +3 -0
  181. package/src/assets/iconset/chevron-right.svg +3 -0
  182. package/src/assets/iconset/chevron-up.svg +3 -0
  183. package/src/assets/iconset/circle.svg +32 -0
  184. package/src/assets/iconset/clock-fast-forward.svg +10 -0
  185. package/src/assets/iconset/clock.svg +3 -0
  186. package/src/assets/iconset/close-circle.svg +3 -0
  187. package/src/assets/iconset/close.svg +3 -0
  188. package/src/assets/iconset/cloud-01.svg +5 -0
  189. package/src/assets/iconset/cloud-blank-01.svg +3 -0
  190. package/src/assets/iconset/cloud-blank-02.svg +3 -0
  191. package/src/assets/iconset/coin.svg +5 -0
  192. package/src/assets/iconset/coins-02.svg +3 -0
  193. package/src/assets/iconset/colors.svg +3 -0
  194. package/src/assets/iconset/copy-01.svg +3 -0
  195. package/src/assets/iconset/copy-02.svg +3 -0
  196. package/src/assets/iconset/copy-03.svg +3 -0
  197. package/src/assets/iconset/copy-04.svg +3 -0
  198. package/src/assets/iconset/copy-05.svg +3 -0
  199. package/src/assets/iconset/copy-06.svg +3 -0
  200. package/src/assets/iconset/copy-07.svg +3 -0
  201. package/src/assets/iconset/corner-down-right.svg +3 -0
  202. package/src/assets/iconset/crypto-bold.svg +4 -0
  203. package/src/assets/iconset/delete-icon.svg +5 -0
  204. package/src/assets/iconset/diamond.svg +3 -0
  205. package/src/assets/iconset/dice-3.svg +3 -0
  206. package/src/assets/iconset/divide-01.svg +3 -0
  207. package/src/assets/iconset/divide-02.svg +3 -0
  208. package/src/assets/iconset/divide-03.svg +3 -0
  209. package/src/assets/iconset/document-check-bold.svg +4 -0
  210. package/src/assets/iconset/dots-circle.svg +10 -0
  211. package/src/assets/iconset/dots-grid.svg +11 -0
  212. package/src/assets/iconset/dots-horizontal.svg +5 -0
  213. package/src/assets/iconset/dots-vertical.svg +5 -0
  214. package/src/assets/iconset/download-01.svg +3 -0
  215. package/src/assets/iconset/download-02.svg +3 -0
  216. package/src/assets/iconset/download-03.svg +3 -0
  217. package/src/assets/iconset/edit-03.svg +3 -0
  218. package/src/assets/iconset/edit-04.svg +3 -0
  219. package/src/assets/iconset/edit-05.svg +3 -0
  220. package/src/assets/iconset/element-3.svg +6 -0
  221. package/src/assets/iconset/ellipse-127.svg +3 -0
  222. package/src/assets/iconset/exclaimation-circle.svg +8 -0
  223. package/src/assets/iconset/eye-off-line.svg +5 -0
  224. package/src/assets/iconset/face-smile.svg +5 -0
  225. package/src/assets/iconset/file-04.svg +3 -0
  226. package/src/assets/iconset/file-05.svg +3 -0
  227. package/src/assets/iconset/file-check-02.svg +3 -0
  228. package/src/assets/iconset/file-plus-01.svg +5 -0
  229. package/src/assets/iconset/file-shield-02.svg +5 -0
  230. package/src/assets/iconset/filter-funnel-01.svg +3 -0
  231. package/src/assets/iconset/flag-03.svg +3 -0
  232. package/src/assets/iconset/flash.svg +3 -0
  233. package/src/assets/iconset/folder-plus.svg +3 -0
  234. package/src/assets/iconset/folder.svg +3 -0
  235. package/src/assets/iconset/gallery.svg +3 -0
  236. package/src/assets/iconset/globe-01.svg +3 -0
  237. package/src/assets/iconset/globe-04.svg +5 -0
  238. package/src/assets/iconset/globe-bold.svg +4 -0
  239. package/src/assets/iconset/guard.svg +3 -0
  240. package/src/assets/iconset/headphones-01.svg +3 -0
  241. package/src/assets/iconset/headphones-02.svg +5 -0
  242. package/src/assets/iconset/headset-bold.svg +4 -0
  243. package/src/assets/iconset/heart-bold.svg +3 -0
  244. package/src/assets/iconset/heart.svg +3 -0
  245. package/src/assets/iconset/help-circle.svg +5 -0
  246. package/src/assets/iconset/home-2.svg +4 -0
  247. package/src/assets/iconset/home-line.svg +3 -0
  248. package/src/assets/iconset/hourglass-02.svg +5 -0
  249. package/src/assets/iconset/image-01.svg +5 -0
  250. package/src/assets/iconset/image-03.svg +3 -0
  251. package/src/assets/iconset/image.svg +4 -0
  252. package/src/assets/iconset/inbox-01.svg +3 -0
  253. package/src/assets/iconset/inbox-arrow-down.svg +3 -0
  254. package/src/assets/iconset/info-circle.svg +3 -0
  255. package/src/assets/iconset/keyboard-line.svg +9 -0
  256. package/src/assets/iconset/lamp-charge.svg +5 -0
  257. package/src/assets/iconset/layer.svg +3 -0
  258. package/src/assets/iconset/light.svg +6 -0
  259. package/src/assets/iconset/like-dislike.svg +6 -0
  260. package/src/assets/iconset/lock-03.svg +3 -0
  261. package/src/assets/iconset/logout.svg +3 -0
  262. package/src/assets/iconset/magicpen.svg +7 -0
  263. package/src/assets/iconset/mail-01.svg +5 -0
  264. package/src/assets/iconset/mail.svg +3 -0
  265. package/src/assets/iconset/marker.svg +3 -0
  266. package/src/assets/iconset/medal-star.svg +5 -0
  267. package/src/assets/iconset/menu-04.svg +3 -0
  268. package/src/assets/iconset/menu.svg +5 -0
  269. package/src/assets/iconset/message-circle-01.svg +5 -0
  270. package/src/assets/iconset/message-plus-circle.svg +3 -0
  271. package/src/assets/iconset/message-question-circle.svg +5 -0
  272. package/src/assets/iconset/message-text-circle-01.svg +5 -0
  273. package/src/assets/iconset/message-text-square-02.svg +3 -0
  274. package/src/assets/iconset/message-x-square.svg +3 -0
  275. package/src/assets/iconset/microphone-02.svg +3 -0
  276. package/src/assets/iconset/microphone-slash.svg +8 -0
  277. package/src/assets/iconset/mirror.svg +4 -0
  278. package/src/assets/iconset/moon-01.svg +3 -0
  279. package/src/assets/iconset/moon-bold.svg +3 -0
  280. package/src/assets/iconset/mouse-circle.svg +4 -0
  281. package/src/assets/iconset/move.svg +5 -0
  282. package/src/assets/iconset/notification-fill.svg +3 -0
  283. package/src/assets/iconset/notification-text.svg +3 -0
  284. package/src/assets/iconset/notification.svg +5 -0
  285. package/src/assets/iconset/pdf-01.svg +6 -0
  286. package/src/assets/iconset/pencil-01.svg +5 -0
  287. package/src/assets/iconset/phone-01.svg +3 -0
  288. package/src/assets/iconset/phone-arrow-down-left.svg +4 -0
  289. package/src/assets/iconset/phone-arrow-up-right.svg +8 -0
  290. package/src/assets/iconset/phone-hang-up.svg +5 -0
  291. package/src/assets/iconset/phone-hangup2.svg +8 -0
  292. package/src/assets/iconset/phone-incoming-01.svg +3 -0
  293. package/src/assets/iconset/phone-outgoing-01.svg +3 -0
  294. package/src/assets/iconset/phone-plus.svg +3 -0
  295. package/src/assets/iconset/phone-x.svg +3 -0
  296. package/src/assets/iconset/phone.svg +3 -0
  297. package/src/assets/iconset/plus-circle.svg +3 -0
  298. package/src/assets/iconset/plus.svg +4 -0
  299. package/src/assets/iconset/printer.svg +3 -0
  300. package/src/assets/iconset/question-mark-circle.svg +5 -0
  301. package/src/assets/iconset/refresh-ccw-01.svg +3 -0
  302. package/src/assets/iconset/refresh-cw-01.svg +3 -0
  303. package/src/assets/iconset/refresh-cw-04.svg +3 -0
  304. package/src/assets/iconset/refresh-right-square-bold.svg +3 -0
  305. package/src/assets/iconset/remove-circle.svg +12 -0
  306. package/src/assets/iconset/repeat-04.svg +3 -0
  307. package/src/assets/iconset/repeat-bold.svg +3 -0
  308. package/src/assets/iconset/ruler-pen.svg +4 -0
  309. package/src/assets/iconset/search-lg.svg +3 -0
  310. package/src/assets/iconset/search-md.svg +5 -0
  311. package/src/assets/iconset/search-refraction.svg +5 -0
  312. package/src/assets/iconset/search.svg +3 -0
  313. package/src/assets/iconset/send-01.svg +3 -0
  314. package/src/assets/iconset/send-02.svg +5 -0
  315. package/src/assets/iconset/send-diagonal.svg +3 -0
  316. package/src/assets/iconset/setting-2.svg +4 -0
  317. package/src/assets/iconset/settings-02.svg +4 -0
  318. package/src/assets/iconset/settings-04.svg +5 -0
  319. package/src/assets/iconset/settings-2.svg +4 -0
  320. package/src/assets/iconset/settings-cog.svg +3 -0
  321. package/src/assets/iconset/settings.svg +4 -0
  322. package/src/assets/iconset/share-01.svg +4 -0
  323. package/src/assets/iconset/share-03.svg +3 -0
  324. package/src/assets/iconset/share-04.svg +3 -0
  325. package/src/assets/iconset/share-05.svg +5 -0
  326. package/src/assets/iconset/share-06.svg +3 -0
  327. package/src/assets/iconset/share-bold.svg +3 -0
  328. package/src/assets/iconset/shield-01.svg +3 -0
  329. package/src/assets/iconset/shield-bold.svg +3 -0
  330. package/src/assets/iconset/solar-check.svg +3 -0
  331. package/src/assets/iconset/speaker-wave.svg +9 -0
  332. package/src/assets/iconset/speaker.svg +5 -0
  333. package/src/assets/iconset/speedometer-03.svg +3 -0
  334. package/src/assets/iconset/star-rounded.svg +3 -0
  335. package/src/assets/iconset/star.svg +3 -0
  336. package/src/assets/iconset/sun.svg +5 -0
  337. package/src/assets/iconset/target-03.svg +3 -0
  338. package/src/assets/iconset/text-input.svg +3 -0
  339. package/src/assets/iconset/translate.svg +7 -0
  340. package/src/assets/iconset/trash-02.svg +3 -0
  341. package/src/assets/iconset/trash-03.svg +5 -0
  342. package/src/assets/iconset/trash-04.svg +3 -0
  343. package/src/assets/iconset/trash.svg +7 -0
  344. package/src/assets/iconset/trush-square-bold.svg +3 -0
  345. package/src/assets/iconset/unlimited.svg +3 -0
  346. package/src/assets/iconset/user-circle.svg +3 -0
  347. package/src/assets/iconset/user-jogging.svg +3 -0
  348. package/src/assets/iconset/user-plus-01.svg +5 -0
  349. package/src/assets/iconset/user-square.svg +5 -0
  350. package/src/assets/iconset/user-x-01.svg +5 -0
  351. package/src/assets/iconset/user-x-02.svg +3 -0
  352. package/src/assets/iconset/user2.svg +3 -0
  353. package/src/assets/iconset/users-02.svg +5 -0
  354. package/src/assets/iconset/users-speaker.svg +7 -0
  355. package/src/assets/iconset/verify.svg +3 -0
  356. package/src/assets/iconset/voice-cricle.svg +8 -0
  357. package/src/assets/iconset/x-circle.svg +3 -0
  358. package/src/assets/iconset/x-close.svg +3 -0
  359. package/src/assets/iconset/x-sm.svg +3 -0
  360. package/src/assets/iconset/zap.svg +3 -0
  361. package/src/assets/images/background.jpg +0 -0
  362. package/src/assets/loading_animation.json +1 -0
  363. package/src/assets/products.json +98 -0
  364. package/src/assets/samples/carousel-sample.json +100 -81
  365. package/src/assets/samples/getSamples.ts +39 -66
  366. package/src/assets/samples/paywall-1.json +220 -0
  367. package/src/assets/samples/simple-1.json +9 -2
  368. package/src/assets/samples/simple-2.json +37 -9
  369. package/src/assets/samples/vpn-onboard-1.json +326 -718
  370. package/src/assets/samples/vpn-onboard-2.json +329 -709
  371. package/src/assets/samples/vpn-onboard-3.json +297 -706
  372. package/src/assets/samples/vpn-onboard-4.json +297 -707
  373. package/src/assets/samples/vpn-onboard-5.json +440 -919
  374. package/src/assets/samples/vpn-onboard-6.json +301 -612
  375. package/src/attributes-editor/SpecialCategorySection.tsx +1 -1
  376. package/src/build-components/BIcon/BIcon.tsx +56 -0
  377. package/src/build-components/BIcon/BIconProps.generated.ts +82 -0
  378. package/src/build-components/BIcon/pattern.json +47 -0
  379. package/src/build-components/BackgroundImage/BackgroundImageProps.generated.ts +4 -0
  380. package/src/build-components/BackgroundImage/pattern.json +2 -2
  381. package/src/build-components/Button/Button.tsx +14 -1
  382. package/src/build-components/Button/ButtonProps.generated.ts +4 -0
  383. package/src/build-components/Button/pattern.json +4 -1
  384. package/src/build-components/Carousel/CarouselProps.generated.ts +4 -0
  385. package/src/build-components/Carousel/pattern.json +2 -2
  386. package/src/build-components/CarouselButtons/CarouselButtonsProps.generated.ts +4 -0
  387. package/src/build-components/CarouselButtons/pattern.json +1 -1
  388. package/src/build-components/CarouselDots/CarouselDotsProps.generated.ts +4 -0
  389. package/src/build-components/CarouselDots/pattern.json +1 -1
  390. package/src/build-components/CarouselItem/CarouselItem.tsx +1 -1
  391. package/src/build-components/CarouselItem/CarouselItemProps.generated.ts +4 -0
  392. package/src/build-components/CarouselItem/pattern.json +1 -1
  393. package/src/build-components/CarouselProvider/CarouselProvider.tsx +1 -1
  394. package/src/build-components/CarouselProvider/CarouselProviderProps.generated.ts +4 -0
  395. package/src/build-components/CarouselProvider/pattern.json +1 -1
  396. package/src/build-components/Image/ImageProps.generated.ts +4 -0
  397. package/src/build-components/Image/pattern.json +1 -1
  398. package/src/build-components/Main/Main.tsx +61 -0
  399. package/src/build-components/Main/MainProps.generated.ts +64 -0
  400. package/src/build-components/Main/pattern.json +35 -0
  401. package/src/build-components/Onboard/OnboardProps.generated.ts +4 -0
  402. package/src/build-components/OnboardButton/OnboardButtonProps.generated.ts +4 -0
  403. package/src/build-components/OnboardButtons/OnboardButtonsProps.generated.ts +4 -0
  404. package/src/build-components/OnboardDot/OnboardDotProps.generated.ts +4 -0
  405. package/src/build-components/OnboardFooter/OnboardFooterProps.generated.ts +4 -0
  406. package/src/build-components/OnboardImage/OnboardImageProps.generated.ts +4 -0
  407. package/src/build-components/OnboardItem/OnboardItem.tsx +1 -1
  408. package/src/build-components/OnboardItem/OnboardItemProps.generated.ts +4 -0
  409. package/src/build-components/OnboardProvider/OnboardProviderProps.generated.ts +4 -1
  410. package/src/build-components/OnboardProvider/pattern.json +6 -16
  411. package/src/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.ts +4 -0
  412. package/src/build-components/OnboardTitle/OnboardTitleProps.generated.ts +4 -0
  413. package/src/build-components/PaywallBackground/PaywallBackground.tsx +47 -0
  414. package/src/build-components/PaywallBackground/PaywallBackgroundProps.generated.ts +63 -0
  415. package/src/build-components/PaywallBackground/pattern.json +16 -0
  416. package/src/build-components/PaywallCloseButton/PaywallCloseButton.tsx +62 -0
  417. package/src/build-components/PaywallCloseButton/PaywallCloseButtonProps.generated.ts +83 -0
  418. package/src/build-components/PaywallCloseButton/pattern.json +23 -0
  419. package/src/build-components/PaywallOptions/PaywallOptionButton.tsx +64 -0
  420. package/src/build-components/PaywallOptions/PaywallOptions.tsx +92 -0
  421. package/src/build-components/PaywallOptions/PaywallOptionsProps.generated.ts +63 -0
  422. package/src/build-components/PaywallOptions/pattern.json +22 -0
  423. package/src/build-components/PaywallOptions/usePaywallOptionParamsFactory.ts +42 -0
  424. package/src/build-components/PaywallProvider/PaywallProvider.tsx +78 -0
  425. package/src/build-components/PaywallProvider/PaywallProviderProps.generated.ts +63 -0
  426. package/src/build-components/PaywallProvider/pattern.json +24 -0
  427. package/src/build-components/PaywallSubscribeButton/PaywallSubscribeButton.tsx +60 -0
  428. package/src/build-components/PaywallSubscribeButton/PaywallSubscribeButtonProps.generated.ts +77 -0
  429. package/src/build-components/PaywallSubscribeButton/pattern.json +27 -0
  430. package/src/build-components/RadioButton/RadioButton.tsx +123 -0
  431. package/src/build-components/RadioButton/RadioButtonProps.generated.ts +66 -0
  432. package/src/build-components/RadioButton/pattern.json +42 -0
  433. package/src/build-components/RenderNode.generated.tsx +133 -37
  434. package/src/build-components/Text/Text.tsx +3 -3
  435. package/src/build-components/Text/TextProps.generated.ts +4 -0
  436. package/src/build-components/Text/pattern.json +1 -1
  437. package/src/build-components/View/ViewProps.generated.ts +4 -0
  438. package/src/build-components/View/pattern.json +44 -6
  439. package/src/build-components/index.ts +50 -10
  440. package/src/build-components/patterns.generated.ts +4516 -712
  441. package/src/components/AttributesEditorPanel.tsx +15 -9
  442. package/src/components/BottomBar.tsx +236 -0
  443. package/src/components/Builder.tsx +3 -5
  444. package/src/components/BuilderButton.tsx +2 -7
  445. package/src/components/BuilderProvider.tsx +45 -0
  446. package/src/components/DeviceNavigationBar.tsx +1 -1
  447. package/src/components/EditorHeader.tsx +15 -5
  448. package/src/components/Icon.generated.tsx +540 -0
  449. package/src/components/LoadingComponent.tsx +10 -0
  450. package/src/components/LocalizationParamsProvider.tsx +22 -0
  451. package/src/components/MobilePanelToggleButton.tsx +39 -0
  452. package/src/components/ParamsProvider.tsx +38 -0
  453. package/src/hooks/useLocalizationParams.ts +5 -0
  454. package/src/hooks/useLocalize.ts +23 -0
  455. package/src/hooks/useMinimumDelay.ts +20 -0
  456. package/src/hooks/useMobileEditorPanels.ts +56 -0
  457. package/src/hooks/useParams.ts +8 -0
  458. package/src/hooks/useSafeAreaViewStyle.ts +67 -0
  459. package/src/hooks/useSyncProjectPageStore.ts +40 -0
  460. package/src/index.native.ts +75 -0
  461. package/src/index.ts +26 -0
  462. package/src/mockOS/components/MockOSRouter.tsx +9 -14
  463. package/src/mockOS/context/MockOSContext.tsx +12 -36
  464. package/src/mockOS/context/MockOSContextBase.ts +35 -0
  465. package/src/mockOS/index.ts +3 -2
  466. package/src/modals/AddComponentModal.tsx +1 -0
  467. package/src/modals/BenefitEditModal.tsx +160 -0
  468. package/src/modals/BenefitPresetsModal.tsx +166 -0
  469. package/src/modals/IconPickerModal.tsx +109 -0
  470. package/src/modals/MockableFeatureModal.tsx +292 -0
  471. package/src/modals/ProductEditModal.tsx +215 -0
  472. package/src/modals/ProductPresetsModal.tsx +151 -0
  473. package/src/modals/ScreenColorsModal.tsx +115 -0
  474. package/src/modals/index.ts +7 -0
  475. package/src/pages/ProjectPage.tsx +99 -232
  476. package/src/pages/tabs/BuilderPanel.tsx +15 -9
  477. package/src/paywall/hooks/index.ts +5 -0
  478. package/src/paywall/hooks/useCalculateLocalizedPrice.ts +6 -0
  479. package/src/paywall/hooks/useCarouselOptionsSeperator.ts +8 -0
  480. package/src/paywall/hooks/useCloseStatusPaywall.ts +6 -0
  481. package/src/paywall/hooks/useDiscountRate.ts +6 -0
  482. package/src/paywall/hooks/usePaywallCounter.ts +6 -0
  483. package/src/paywall/types/benefits.ts +44 -0
  484. package/src/paywall/types/paywall-types.ts +51 -0
  485. package/src/store.ts +165 -47
  486. package/src/styles/base/_global.scss +61 -45
  487. package/src/styles/components/_attributes-editor.scss +49 -6
  488. package/src/styles/components/_bottom-bar.scss +113 -0
  489. package/src/styles/components/_editor-shell.scss +0 -25
  490. package/src/styles/components/_ui-components.scss +2 -1
  491. package/src/styles/index.scss +6 -0
  492. package/src/styles/modals/_benefit-edit-modal.scss +17 -0
  493. package/src/styles/modals/_benefit-presets-modal.scss +79 -0
  494. package/src/styles/modals/_mockable-feature-modal.scss +15 -0
  495. package/src/styles/modals/_product-edit-modal.scss +23 -0
  496. package/src/styles/modals/_product-presets-modal.scss +81 -0
  497. package/src/types/Icons.ts +244 -0
  498. package/src/types/Project.ts +5 -0
  499. package/src/types/jest-globals.d.ts +13 -0
  500. package/src/utils/analyseNode.ts +22 -109
  501. package/src/utils/analyseNodeByPatterns.ts +453 -0
  502. package/src/utils/analyseNodeStructural.ts +52 -0
  503. package/src/utils/extractViewStyle.ts +19 -0
  504. package/src/utils/findNodeByKeyNested.ts +32 -0
  505. package/src/utils/isCarousel.ts +21 -5
  506. package/src/utils/nodeGuards.ts +26 -0
  507. package/src/utils/nodeTree.ts +99 -0
  508. package/src/utils/novaToJson.ts +21 -9
  509. package/src/utils/patterns.ts +62 -3
  510. package/src/utils/replaceLocalizationParams.ts +15 -0
  511. package/dist/pages/tabs/SideTool.d.ts +0 -8
  512. package/src/pages/tabs/SideTool.tsx +0 -260
@@ -0,0 +1,10 @@
1
+ import Lottie from 'lottie-react';
2
+ import loadingAnimation from '../assets/loading_animation.json';
3
+
4
+ export function LoadingComponent() {
5
+ return (
6
+ <div className="rb-loading">
7
+ <Lottie animationData={loadingAnimation as any} loop autoplay />
8
+ </div>
9
+ );
10
+ }
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import { ParamsProvider, type LocalizationParams } from './ParamsProvider';
3
+
4
+ /**
5
+ * Backward-compatible wrapper.
6
+ * Prefer `ParamsProvider` instead.
7
+ */
8
+ export type LocalizationParamsProviderProps = {
9
+ params: LocalizationParams;
10
+ children: React.ReactNode;
11
+ };
12
+
13
+ export function LocalizationParamsProvider({
14
+ params,
15
+ children,
16
+ }: LocalizationParamsProviderProps) {
17
+ return (
18
+ <ParamsProvider localizationParams={params} otherParams={{}}>
19
+ {children}
20
+ </ParamsProvider>
21
+ );
22
+ }
@@ -0,0 +1,39 @@
1
+ export type MobilePanelToggleButtonProps = {
2
+ label: string;
3
+ isActive: boolean;
4
+ ariaLabel: string;
5
+ ariaControls: string;
6
+ onClick: () => void;
7
+ };
8
+
9
+ export function MobilePanelToggleButton({
10
+ label,
11
+ isActive,
12
+ ariaLabel,
13
+ ariaControls,
14
+ onClick,
15
+ }: MobilePanelToggleButtonProps) {
16
+ return (
17
+ <button
18
+ type="button"
19
+ className={`mobile-panel-toggle__button${isActive ? ' mobile-panel-toggle__button--active' : ''}`}
20
+ aria-label={ariaLabel}
21
+ aria-expanded={isActive}
22
+ aria-controls={ariaControls}
23
+ onClick={onClick}
24
+ >
25
+ <span className="mobile-panel-toggle__icon" aria-hidden="true">
26
+ <svg viewBox="0 0 16 12" role="presentation" focusable="false">
27
+ <path
28
+ d="M1 1h14M1 6h14M1 11h14"
29
+ stroke="currentColor"
30
+ strokeWidth="2"
31
+ strokeLinecap="round"
32
+ fill="none"
33
+ />
34
+ </svg>
35
+ </span>
36
+ <span className="mobile-panel-toggle__label">{label}</span>
37
+ </button>
38
+ );
39
+ }
@@ -0,0 +1,38 @@
1
+ import React, { createContext, useMemo } from 'react';
2
+
3
+ export type LocalizationParams = Record<string, string>;
4
+ export type OtherParams = Record<string, string | boolean | number>;
5
+
6
+ export type ParamsContextValue = {
7
+ localizationParams: LocalizationParams;
8
+ otherParams: OtherParams;
9
+ };
10
+
11
+ export type ParamsProviderProps = {
12
+ localizationParams?: LocalizationParams;
13
+ otherParams?: OtherParams;
14
+ children: React.ReactNode;
15
+ };
16
+
17
+ export const ParamsContext = createContext<ParamsContextValue>({
18
+ localizationParams: {},
19
+ otherParams: {},
20
+ });
21
+
22
+ export function ParamsProvider({
23
+ localizationParams,
24
+ otherParams,
25
+ children,
26
+ }: ParamsProviderProps) {
27
+ const value = useMemo<ParamsContextValue>(
28
+ () => ({
29
+ localizationParams: localizationParams ?? {},
30
+ otherParams: otherParams ?? {},
31
+ }),
32
+ [localizationParams, otherParams],
33
+ );
34
+
35
+ return (
36
+ <ParamsContext.Provider value={value}>{children}</ParamsContext.Provider>
37
+ );
38
+ }
@@ -0,0 +1,5 @@
1
+ import { useParams } from './useParams';
2
+
3
+ export function useLocalizationParams() {
4
+ return useParams().localizationParams ?? {};
5
+ }
@@ -0,0 +1,23 @@
1
+ import { useCallback } from 'react';
2
+ import { useRenderStore } from '../store';
3
+ import { useLocalizationParams } from './useLocalizationParams';
4
+ import { replaceLocalizationParams } from '../utils/replaceLocalizationParams';
5
+
6
+ export type LocalizeFn = (keyOrText: string) => string;
7
+
8
+ export function useLocalize(): LocalizeFn {
9
+ const { defaultLanguage, localication } = useRenderStore((s) => ({
10
+ defaultLanguage: s.appConfig?.defaultLanguage,
11
+ localication: s.appConfig?.localication,
12
+ }));
13
+ const params = useLocalizationParams();
14
+
15
+ return useCallback(
16
+ (keyOrText: string) => {
17
+ const raw =
18
+ localication?.[defaultLanguage ?? 'en']?.[keyOrText] ?? keyOrText;
19
+ return replaceLocalizationParams(raw, params);
20
+ },
21
+ [defaultLanguage, localication, params],
22
+ );
23
+ }
@@ -0,0 +1,20 @@
1
+ import { useEffect, useState } from 'react';
2
+
3
+ /**
4
+ * Ensures a boolean becomes `true` only after a minimum delay.
5
+ * Resets to `false` whenever `deps` change.
6
+ *
7
+ * Common use-case: keep a loading indicator visible for at least N ms.
8
+ */
9
+ export function useMinimumDelay(delayMs: number, deps: unknown[] = []) {
10
+ const [done, setDone] = useState<boolean>(false);
11
+
12
+ useEffect(() => {
13
+ setDone(false);
14
+ const timer = setTimeout(() => setDone(true), delayMs);
15
+ return () => clearTimeout(timer);
16
+ // eslint-disable-next-line react-hooks/exhaustive-deps
17
+ }, [delayMs, ...deps]);
18
+
19
+ return done;
20
+ }
@@ -0,0 +1,56 @@
1
+ import { useCallback, useEffect, useState } from 'react';
2
+
3
+ export type MobileEditorPanel = 'builder' | 'attributes';
4
+
5
+ export type UseMobileEditorPanelsOptions = {
6
+ breakpoint?: number;
7
+ };
8
+
9
+ export function useMobileEditorPanels(
10
+ options: UseMobileEditorPanelsOptions = {},
11
+ ) {
12
+ const { breakpoint = 1000 } = options;
13
+
14
+ const [mobilePanel, setMobilePanel] = useState<MobileEditorPanel | null>(
15
+ null,
16
+ );
17
+ const [isMobile, setIsMobile] = useState<boolean>(() => {
18
+ if (typeof window === 'undefined') return false;
19
+ return window.innerWidth <= breakpoint;
20
+ });
21
+
22
+ useEffect(() => {
23
+ function handleResize() {
24
+ setIsMobile(window.innerWidth <= breakpoint);
25
+ }
26
+
27
+ handleResize();
28
+ window.addEventListener('resize', handleResize);
29
+ return () => window.removeEventListener('resize', handleResize);
30
+ }, [breakpoint]);
31
+
32
+ // Reset active panel when switching between mobile/desktop layouts
33
+ useEffect(() => {
34
+ setMobilePanel(null);
35
+ }, [isMobile]);
36
+
37
+ const toggleMobilePanel = useCallback((panel: MobileEditorPanel) => {
38
+ setMobilePanel((prev) => (prev === panel ? null : panel));
39
+ }, []);
40
+
41
+ const closeMobilePanels = useCallback(() => {
42
+ setMobilePanel(null);
43
+ }, []);
44
+
45
+ const leftPanelIsOpen = !isMobile || mobilePanel === 'builder';
46
+ const attributesPanelIsOpen = !isMobile || mobilePanel === 'attributes';
47
+
48
+ return {
49
+ isMobile,
50
+ mobilePanel,
51
+ toggleMobilePanel,
52
+ closeMobilePanels,
53
+ leftPanelIsOpen,
54
+ attributesPanelIsOpen,
55
+ };
56
+ }
@@ -0,0 +1,8 @@
1
+ import { useContext } from 'react';
2
+ import { ParamsContext } from '../components/ParamsProvider';
3
+
4
+ export function useParams() {
5
+ return (
6
+ useContext(ParamsContext) ?? { localizationParams: {}, otherParams: {} }
7
+ );
8
+ }
@@ -0,0 +1,67 @@
1
+ import { useMemo } from 'react';
2
+ import { useRenderStore } from '../store';
3
+
4
+ function addInset(
5
+ base: React.CSSProperties['paddingTop'],
6
+ insetPx: number,
7
+ ): React.CSSProperties['paddingTop'] {
8
+ if (!insetPx) return base;
9
+ if (base === undefined) return insetPx;
10
+ if (typeof base === 'number') return base + insetPx;
11
+ if (typeof base === 'string' && base.trim())
12
+ return `calc(${base.trim()} + ${insetPx}px)`;
13
+ return insetPx;
14
+ }
15
+
16
+ function subtractInset(
17
+ base: React.CSSProperties['width'],
18
+ insetPx: number,
19
+ ): React.CSSProperties['width'] {
20
+ if (!insetPx) return base;
21
+ if (base === undefined) return `calc(100% - ${insetPx}px)`;
22
+ if (typeof base === 'number') return Math.max(0, base - insetPx);
23
+ if (typeof base === 'string' && base.trim())
24
+ return `calc(${base.trim()} - ${insetPx}px)`;
25
+ return `calc(100% - ${insetPx}px)`;
26
+ }
27
+
28
+ export function useSafeAreaViewStyle(
29
+ baseStyle: React.CSSProperties,
30
+ enabled: boolean,
31
+ ) {
32
+ const device = useRenderStore((s) => s.device);
33
+
34
+ return useMemo(() => {
35
+ if (!enabled) return baseStyle;
36
+
37
+ const [insetTop, insetRight, insetBottom, insetLeft] = device.insets ?? [
38
+ 0, 0, 0, 0,
39
+ ];
40
+
41
+ // Match DeviceMockFrame fallbacks: status bar overlays content, so we treat it as top safe area.
42
+ const top =
43
+ insetTop || (device.platform === 'ios' ? 20 : device.platform ? 24 : 0);
44
+
45
+ // Bottom safe area is handled visually by the mock navigation bar area, which takes layout space.
46
+ // So we intentionally don't add bottom padding here to avoid double-spacing.
47
+ const right = insetRight ?? 0;
48
+ const left = insetLeft ?? 0;
49
+ const bottom = 0;
50
+
51
+ const horizontal = left + right;
52
+ const vertical = top + bottom;
53
+
54
+ return {
55
+ ...baseStyle,
56
+ // Use margins to "push" the view into the safe area (instead of shrinking content via padding).
57
+ // Since in this project these wrappers are typically full-size (100% x 100%),
58
+ // we also subtract the insets from width/height to avoid overflow.
59
+ marginTop: addInset(baseStyle.marginTop, top),
60
+ marginRight: addInset(baseStyle.marginRight, right),
61
+ marginBottom: addInset(baseStyle.marginBottom, bottom),
62
+ marginLeft: addInset(baseStyle.marginLeft, left),
63
+ width: subtractInset(baseStyle.width ?? '100%', horizontal),
64
+ height: subtractInset(baseStyle.height ?? '100%', vertical),
65
+ };
66
+ }, [enabled, baseStyle, device]);
67
+ }
@@ -0,0 +1,40 @@
1
+ import { useEffect } from 'react';
2
+ import type { AppConfig } from '../types/PreviewConfig';
3
+ import type { ProjectColors } from '../types/Project';
4
+ import { logger } from '../utils/logger';
5
+
6
+ export type UseSyncProjectPageStoreArgs = {
7
+ appConfig: AppConfig;
8
+ name: string;
9
+ projectColors: ProjectColors | undefined;
10
+ setAppConfig: (appConfig: AppConfig) => void;
11
+ setProjectName: (name: string) => void;
12
+ setProjectColors: (colors: ProjectColors | undefined) => void;
13
+ };
14
+
15
+ /**
16
+ * Syncs ProjectPage props into the render store.
17
+ * Kept as a small hook to keep ProjectPage UI-focused.
18
+ */
19
+ export function useSyncProjectPageStore({
20
+ appConfig,
21
+ name,
22
+ projectColors,
23
+ setAppConfig,
24
+ setProjectName,
25
+ setProjectColors,
26
+ }: UseSyncProjectPageStoreArgs) {
27
+ useEffect(() => {
28
+ setAppConfig(appConfig);
29
+ logger.verbose('ProjectPage', 'appConfig applied', appConfig);
30
+ }, [appConfig, setAppConfig]);
31
+
32
+ useEffect(() => {
33
+ setProjectName(name);
34
+ }, [name, setProjectName]);
35
+
36
+ useEffect(() => {
37
+ setProjectColors(projectColors);
38
+ return () => setProjectColors(undefined);
39
+ }, [projectColors, setProjectColors]);
40
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * React Native-safe entrypoint.
3
+ *
4
+ * IMPORTANT:
5
+ * - No SCSS imports
6
+ * - No `react-dom` imports
7
+ * - No web-only modules that touch `window`/`document`/`localStorage`
8
+ *
9
+ * This file is meant to be used via the package `react-native` entry (Metro)
10
+ * or explicit `@developer_tribe/react-builder/native` style imports.
11
+ */
12
+
13
+ // Types
14
+ export type { TargetedScreenSize } from './types/TargetedScreenSize';
15
+ export type { Node, NodeData, NodeDefaultAttribute } from './types/Node';
16
+ export type { Project, ProjectColors } from './types/Project';
17
+ export type { Device } from './types/Device';
18
+ export type { AppConfig, Localication } from './types/PreviewConfig';
19
+ export { defaultAppConfig } from './types/PreviewConfig';
20
+ export type {
21
+ PaywallBenefitValue,
22
+ PaywallBenefits,
23
+ Product as PaywallProduct,
24
+ PaywallModel,
25
+ } from './paywall/types/paywall-types';
26
+
27
+ // Paywall hooks (RN-safe placeholders)
28
+ export {
29
+ usePaywallCounter,
30
+ useCloseStatusPaywall,
31
+ useCarouselOptionsSeperator,
32
+ useCalculateLocalizedPrice,
33
+ useDiscountRate,
34
+ } from './paywall/hooks';
35
+
36
+ // Context (RN-safe). In React Native, `products` should come from an IAP wrapper
37
+ // (e.g. `react-native-iap`) and be passed into `BuilderProvider` by the host app.
38
+ export {
39
+ BuilderProvider,
40
+ useBuilderParams,
41
+ } from './components/BuilderProvider';
42
+ export { ParamsProvider } from './components/ParamsProvider';
43
+ export { LocalizationParamsProvider } from './components/LocalizationParamsProvider';
44
+ export { useParams } from './hooks/useParams';
45
+ export { useLocalizationParams } from './hooks/useLocalizationParams';
46
+ export { useLocalize } from './hooks/useLocalize';
47
+
48
+ // Pure utilities (RN-safe)
49
+ export {
50
+ isNodeNullOrUndefined,
51
+ isNodeString,
52
+ isNodeArray,
53
+ isEmptyObject,
54
+ analyseNode,
55
+ analyseAndProccess,
56
+ } from './utils/analyseNode';
57
+ export { novaToJson } from './utils/novaToJson';
58
+ export { getDevices, getDefaultDevice } from './utils/getDevices';
59
+ export { querySelector } from './utils/querySelector';
60
+ export {
61
+ getPatternByType,
62
+ getAttributeSchema,
63
+ getAttributeMeta,
64
+ getDefaultsForType,
65
+ getTypeSchema,
66
+ isPrimitiveType,
67
+ getArrayItemType,
68
+ } from './utils/patterns';
69
+
70
+ // Static sample data helpers (RN-safe)
71
+ export {
72
+ getSamples,
73
+ getBasicSamples,
74
+ getOnboardSamples,
75
+ } from './assets/samples/getSamples';
package/src/index.ts CHANGED
@@ -1,5 +1,16 @@
1
1
  import './styles/index.scss';
2
2
  import AttributesEditor from './AttributesEditor';
3
+ // NOTE: In React Native, `products` should be sourced from an IAP wrapper (e.g. `react-native-iap`)
4
+ // and passed into `BuilderProvider` from the host app.
5
+ export {
6
+ BuilderProvider,
7
+ useBuilderParams,
8
+ } from './components/BuilderProvider';
9
+ export { ParamsProvider } from './components/ParamsProvider';
10
+ export { LocalizationParamsProvider } from './components/LocalizationParamsProvider';
11
+ export { useParams } from './hooks/useParams';
12
+ export { useLocalizationParams } from './hooks/useLocalizationParams';
13
+ export { useLocalize } from './hooks/useLocalize';
3
14
 
4
15
  export type { TargetedScreenSize } from './types/TargetedScreenSize';
5
16
  export type { Node, NodeData, NodeDefaultAttribute } from './types/Node';
@@ -32,3 +43,18 @@ export type { ProjectPageProps } from './pages/ProjectPage';
32
43
  export { copyNode } from './utils/copyNode';
33
44
  export { logger } from './utils/logger';
34
45
  export type { LogLevel } from './types/Project';
46
+ export type {
47
+ PaywallBenefitValue,
48
+ PaywallBenefits,
49
+ Product as PaywallProduct,
50
+ PaywallModel,
51
+ } from './paywall/types/paywall-types';
52
+
53
+ // Paywall hooks
54
+ export {
55
+ usePaywallCounter,
56
+ useCloseStatusPaywall,
57
+ useCarouselOptionsSeperator,
58
+ useCalculateLocalizedPrice,
59
+ useDiscountRate,
60
+ } from './paywall/hooks';
@@ -1,12 +1,17 @@
1
1
  import React, { ReactNode, useCallback, useEffect } from 'react';
2
- import { useMockOSContext } from '../context/MockOSContext';
2
+ import { useMockOSContext } from '../context/MockOSContextBase';
3
3
  import { MockLaunchScreenComponent } from './MockLaunchScreenComponent';
4
4
  import { useRenderStore } from '../../store';
5
5
  // Note: We might use react-router or similar library in the future for more complex routing
6
6
 
7
7
  interface MockOSRouterProps {
8
8
  children?: ReactNode;
9
- childrenBelongTo?: 'launchscreen' | 'home' | 'onboard' | 'subscription';
9
+ childrenBelongTo?:
10
+ | 'launchscreen'
11
+ | 'app'
12
+ | 'home'
13
+ | 'onboard'
14
+ | 'subscription';
10
15
  appName?: string;
11
16
  }
12
17
 
@@ -86,28 +91,18 @@ export function MockOSRouter({
86
91
  appName = 'My App',
87
92
  }: MockOSRouterProps) {
88
93
  const context = useMockOSContext();
89
- const incForceRender = useRenderStore((s) => s.incForceRender);
90
-
91
94
  if (!context) {
92
95
  throw new Error('MockOSRouter must be used within MockOSProvider');
93
96
  }
94
-
97
+ const incForceRender = useRenderStore((s) => s.incForceRender);
95
98
  const { currentRoute, navigation } = context;
96
99
 
97
100
  const handleLaunchApp = useCallback(() => {
98
101
  // Navigate to the route specified in childrenBelongTo or default to 'onboard'
99
- const targetRoute = childrenBelongTo || 'onboard';
102
+ const targetRoute = childrenBelongTo || 'app';
100
103
  navigation(targetRoute);
101
104
  }, [childrenBelongTo, navigation]);
102
105
 
103
- useEffect(() => {
104
- const timer = setTimeout(() => {
105
- handleLaunchApp();
106
- }, 1000);
107
-
108
- return () => clearTimeout(timer);
109
- }, [handleLaunchApp]);
110
-
111
106
  useEffect(() => {
112
107
  incForceRender();
113
108
  }, [currentRoute, incForceRender]);
@@ -1,40 +1,20 @@
1
- import React, {
2
- createContext,
3
- useContext,
4
- ReactNode,
5
- useState,
6
- useCallback,
7
- } from 'react';
1
+ import React, { ReactNode, useState, useCallback } from 'react';
8
2
  import type { PermissionType } from '../managers/mockPermissionManager';
9
3
  import { PermissionModal } from '../components/PermissionModal';
10
4
  import { MockOSRouter } from '../components/MockOSRouter';
11
5
  import { DeviceStatusBar } from '../../components/DeviceStatusBar';
12
6
  import { DeviceNavigationBar } from '../../components/DeviceNavigationBar';
13
7
  import type { Device } from '../../types/Device';
8
+ import {
9
+ MockOSContext,
10
+ type MockOSContextValue,
11
+ type RouteStackItem,
12
+ type RouteType,
13
+ useMockOSContext,
14
+ } from './MockOSContextBase';
14
15
 
15
- export type RouteType = 'launchscreen' | 'home' | 'onboard' | 'subscription';
16
-
17
- export interface RouteStackItem {
18
- route: RouteType;
19
- timestamp: number;
20
- }
21
-
22
- export interface MockOSContextValue {
23
- isEnabled: boolean;
24
- permission: PermissionType | string | null;
25
- setPermission: (permission: PermissionType | string | null) => void;
26
- // Router
27
- currentRoute: RouteType;
28
- navigation: (route: RouteType) => void;
29
- goBack: () => boolean;
30
- navigationStack: RouteStackItem[];
31
- }
32
-
33
- const MockOSContext = createContext<MockOSContextValue | null>(null);
34
-
35
- export const useMockOSContext = () => {
36
- return useContext(MockOSContext);
37
- };
16
+ export type { RouteType, RouteStackItem, MockOSContextValue };
17
+ export { useMockOSContext };
38
18
 
39
19
  interface MockOSProviderProps {
40
20
  children: ReactNode;
@@ -58,7 +38,7 @@ interface MockOSProviderProps {
58
38
 
59
39
  export function MockOSProvider({
60
40
  children,
61
- defaultRoute = 'launchscreen',
41
+ defaultRoute = 'app',
62
42
  appName,
63
43
  statusBarHeight,
64
44
  statusBarBackgroundColor,
@@ -69,8 +49,6 @@ export function MockOSProvider({
69
49
  navBarPlatform,
70
50
  navBarNavigationBarType,
71
51
  navBarIsDark,
72
- insetLeft,
73
- insetRight,
74
52
  }: MockOSProviderProps) {
75
53
  const [permission, setPermission] = useState<PermissionType | string | null>(
76
54
  null,
@@ -154,11 +132,9 @@ export function MockOSProvider({
154
132
  flex: 1,
155
133
  overflow: 'hidden',
156
134
  position: 'relative',
157
- paddingLeft: insetLeft,
158
- paddingRight: insetRight,
159
135
  }}
160
136
  >
161
- <MockOSRouter childrenBelongTo="onboard" appName={appName}>
137
+ <MockOSRouter childrenBelongTo="app" appName={appName}>
162
138
  {children}
163
139
  </MockOSRouter>
164
140
  </div>
@@ -0,0 +1,35 @@
1
+ import { createContext, useContext } from 'react';
2
+ import type { PermissionType } from '../managers/mockPermissionManager';
3
+
4
+ export type RouteType =
5
+ | 'launchscreen'
6
+ | 'app'
7
+ | 'home'
8
+ | 'onboard'
9
+ | 'subscription';
10
+
11
+ export interface RouteStackItem {
12
+ route: RouteType;
13
+ timestamp: number;
14
+ }
15
+
16
+ export interface MockOSContextValue {
17
+ isEnabled: boolean;
18
+ permission: PermissionType | string | null;
19
+ setPermission: (permission: PermissionType | string | null) => void;
20
+ // Router
21
+ currentRoute: RouteType;
22
+ navigation: (route: RouteType) => void;
23
+ goBack: () => boolean;
24
+ navigationStack: RouteStackItem[];
25
+ }
26
+
27
+ /**
28
+ * Keep this module "pure" (no imports from mockOS/components or app components),
29
+ * so consumers can import `useMockOSContext` without creating circular deps in bundlers.
30
+ */
31
+ export const MockOSContext = createContext<MockOSContextValue | null>(null);
32
+
33
+ export const useMockOSContext = () => {
34
+ return useContext(MockOSContext);
35
+ };
@@ -1,10 +1,11 @@
1
1
  // Context
2
- export { MockOSProvider, useMockOSContext } from './context/MockOSContext';
2
+ export { MockOSProvider } from './context/MockOSContext';
3
+ export { useMockOSContext } from './context/MockOSContextBase';
3
4
  export type {
4
5
  MockOSContextValue,
5
6
  RouteType,
6
7
  RouteStackItem,
7
- } from './context/MockOSContext';
8
+ } from './context/MockOSContextBase';
8
9
 
9
10
  // Components
10
11
  export { MockOSRouter } from './components/MockOSRouter';
@@ -1,6 +1,7 @@
1
1
  import React, { useEffect, useMemo, useState } from 'react';
2
2
  import Modal from './Modal';
3
3
  import { getPatternByType } from '../utils/patterns';
4
+ //TODO: filtreleme kısmları karıştığı için snapshot testi ekle
4
5
 
5
6
  type AddComponentModalProps = {
6
7
  allowedChildTypes: string[];