@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,185 @@
1
+ import React, { useEffect, useMemo, useState } from 'react';
2
+
3
+ type JsonTextEditorProps = {
4
+ value: unknown;
5
+ onChange?: (next: unknown) => void;
6
+ rootName?: string;
7
+ readOnly?: boolean;
8
+ className?: string;
9
+ };
10
+
11
+ function safeStringify(value: unknown) {
12
+ try {
13
+ return JSON.stringify(value, null, 2) ?? '';
14
+ } catch {
15
+ // Fallback for circular structures or non-serializable values
16
+ return String(value ?? '');
17
+ }
18
+ }
19
+
20
+ export function JsonTextEditor({
21
+ value,
22
+ onChange,
23
+ rootName,
24
+ readOnly = false,
25
+ className,
26
+ }: JsonTextEditorProps) {
27
+ const initialText = useMemo(() => safeStringify(value), [value]);
28
+ const [text, setText] = useState(initialText);
29
+ const [parseError, setParseError] = useState<string | null>(null);
30
+ const [applyError, setApplyError] = useState<string | null>(null);
31
+ const [parsedValue, setParsedValue] = useState<unknown>(value);
32
+
33
+ useEffect(() => {
34
+ setText(initialText);
35
+ setParseError(null);
36
+ setApplyError(null);
37
+ setParsedValue(value);
38
+ }, [initialText, value]);
39
+
40
+ const handleCopy = async () => {
41
+ try {
42
+ await navigator.clipboard.writeText(text);
43
+ } catch {
44
+ // ignore (e.g. non-secure context)
45
+ }
46
+ };
47
+
48
+ const handleFormat = () => {
49
+ try {
50
+ const parsed = JSON.parse(text);
51
+ setText(JSON.stringify(parsed, null, 2));
52
+ setParseError(null);
53
+ setApplyError(null);
54
+ setParsedValue(parsed);
55
+ } catch (e) {
56
+ setParseError(e instanceof Error ? e.message : 'Invalid JSON');
57
+ }
58
+ };
59
+
60
+ const handleApply = () => {
61
+ if (!onChange) return;
62
+ try {
63
+ const parsed = JSON.parse(text);
64
+ setParseError(null);
65
+ setApplyError(null);
66
+ setParsedValue(parsed);
67
+ try {
68
+ onChange(parsed);
69
+ } catch (e) {
70
+ setApplyError(e instanceof Error ? e.message : 'Failed to apply JSON');
71
+ }
72
+ } catch (e) {
73
+ setParseError(e instanceof Error ? e.message : 'Invalid JSON');
74
+ }
75
+ };
76
+
77
+ const headerLabel = rootName ? `${rootName}.json` : 'data.json';
78
+
79
+ return (
80
+ <div
81
+ className={className}
82
+ style={{
83
+ height: '100%',
84
+ width: '100%',
85
+ display: 'flex',
86
+ flexDirection: 'column',
87
+ gap: 10,
88
+ }}
89
+ >
90
+ <div
91
+ style={{
92
+ display: 'flex',
93
+ alignItems: 'center',
94
+ justifyContent: 'space-between',
95
+ gap: 8,
96
+ flexWrap: 'wrap',
97
+ }}
98
+ >
99
+ <div style={{ fontSize: 12, opacity: 0.75 }}>{headerLabel}</div>
100
+ <div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>
101
+ <button type="button" className="editor-button" onClick={handleCopy}>
102
+ Copy
103
+ </button>
104
+ <button
105
+ type="button"
106
+ className="editor-button"
107
+ onClick={handleFormat}
108
+ >
109
+ Format
110
+ </button>
111
+ {!readOnly && (
112
+ <button
113
+ type="button"
114
+ className="editor-button"
115
+ onClick={handleApply}
116
+ disabled={!onChange}
117
+ title={onChange ? 'Apply JSON changes' : 'Read only'}
118
+ >
119
+ Apply
120
+ </button>
121
+ )}
122
+ </div>
123
+ </div>
124
+
125
+ <div
126
+ style={{
127
+ display: 'grid',
128
+ gridTemplateColumns: 'minmax(0, 1fr)',
129
+ gap: 10,
130
+ flex: 1,
131
+ minHeight: 0,
132
+ }}
133
+ >
134
+ <textarea
135
+ value={text}
136
+ onChange={(e) => {
137
+ const nextText = e.target.value;
138
+ setText(nextText);
139
+ setApplyError(null);
140
+ if (readOnly) return;
141
+ try {
142
+ const parsed = JSON.parse(nextText);
143
+ setParseError(null);
144
+ setParsedValue(parsed);
145
+ } catch (e) {
146
+ setParseError(e instanceof Error ? e.message : 'Invalid JSON');
147
+ }
148
+ }}
149
+ readOnly={readOnly}
150
+ spellCheck={false}
151
+ style={{
152
+ width: '100%',
153
+ height: '100%',
154
+ minHeight: 320,
155
+ resize: 'none',
156
+ border: '1px solid rgba(0,0,0,0.12)',
157
+ borderRadius: 10,
158
+ padding: 12,
159
+ fontFamily:
160
+ 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',
161
+ fontSize: 12,
162
+ lineHeight: 1.5,
163
+ background: 'transparent',
164
+ outline: 'none',
165
+ }}
166
+ />
167
+ </div>
168
+
169
+ {parseError ? (
170
+ <div style={{ fontSize: 12, color: '#d12f2f' }}>
171
+ Invalid JSON: {parseError}
172
+ </div>
173
+ ) : applyError ? (
174
+ <div style={{ fontSize: 12, color: '#d12f2f' }}>
175
+ Could not apply: {applyError}
176
+ </div>
177
+ ) : (
178
+ <div style={{ fontSize: 12, opacity: 0.7 }}>
179
+ Valid JSON ({safeStringify(parsedValue).length.toLocaleString()}{' '}
180
+ chars)
181
+ </div>
182
+ )}
183
+ </div>
184
+ );
185
+ }
@@ -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,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,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,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,11 +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
+ import { useRenderStore } from '../../store';
4
5
  // Note: We might use react-router or similar library in the future for more complex routing
5
6
 
6
7
  interface MockOSRouterProps {
7
8
  children?: ReactNode;
8
- childrenBelongTo?: 'launchscreen' | 'home' | 'onboard' | 'subscription';
9
+ childrenBelongTo?:
10
+ | 'launchscreen'
11
+ | 'app'
12
+ | 'home'
13
+ | 'onboard'
14
+ | 'subscription';
9
15
  appName?: string;
10
16
  }
11
17
 
@@ -85,26 +91,21 @@ export function MockOSRouter({
85
91
  appName = 'My App',
86
92
  }: MockOSRouterProps) {
87
93
  const context = useMockOSContext();
88
-
89
94
  if (!context) {
90
95
  throw new Error('MockOSRouter must be used within MockOSProvider');
91
96
  }
92
-
97
+ const incForceRender = useRenderStore((s) => s.incForceRender);
93
98
  const { currentRoute, navigation } = context;
94
99
 
95
100
  const handleLaunchApp = useCallback(() => {
96
101
  // Navigate to the route specified in childrenBelongTo or default to 'onboard'
97
- const targetRoute = childrenBelongTo || 'onboard';
102
+ const targetRoute = childrenBelongTo || 'app';
98
103
  navigation(targetRoute);
99
104
  }, [childrenBelongTo, navigation]);
100
105
 
101
106
  useEffect(() => {
102
- const timer = setTimeout(() => {
103
- handleLaunchApp();
104
- }, 1000);
105
-
106
- return () => clearTimeout(timer);
107
- }, [handleLaunchApp]);
107
+ incForceRender();
108
+ }, [currentRoute, incForceRender]);
108
109
 
109
110
  return (
110
111
  <div className="mockos-router">
@@ -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,
@@ -81,7 +59,6 @@ export function MockOSProvider({
81
59
  ]);
82
60
 
83
61
  const navigation = useCallback((route: RouteType) => {
84
- console.log(`[Mock OS] Navigating to: ${route}`);
85
62
  setCurrentRoute(route);
86
63
 
87
64
  // If navigating from launchscreen and the last item in stack is launchscreen,
@@ -109,12 +86,10 @@ export function MockOSProvider({
109
86
  newStack.pop();
110
87
  const previousRoute = newStack[newStack.length - 1];
111
88
 
112
- console.log(`[Mock OS] Going back to: ${previousRoute.route}`);
113
89
  setCurrentRoute(previousRoute.route);
114
90
  setNavigationStack(newStack);
115
91
  return true;
116
92
  }
117
- console.log('[Mock OS] Cannot go back - at root');
118
93
  return false;
119
94
  }, [navigationStack]);
120
95
 
@@ -129,12 +104,10 @@ export function MockOSProvider({
129
104
  };
130
105
 
131
106
  const handleAllow = () => {
132
- console.log(`[Mock OS] Permission granted: ${permission}`);
133
107
  setPermission(null);
134
108
  };
135
109
 
136
110
  const handleDeny = () => {
137
- console.log(`[Mock OS] Permission denied: ${permission}`);
138
111
  setPermission(null);
139
112
  };
140
113
 
@@ -159,11 +132,9 @@ export function MockOSProvider({
159
132
  flex: 1,
160
133
  overflow: 'hidden',
161
134
  position: 'relative',
162
- paddingLeft: insetLeft,
163
- paddingRight: insetRight,
164
135
  }}
165
136
  >
166
- <MockOSRouter childrenBelongTo="onboard" appName={appName}>
137
+ <MockOSRouter childrenBelongTo="app" appName={appName}>
167
138
  {children}
168
139
  </MockOSRouter>
169
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';