@developer_tribe/react-builder 1.1.0 → 1.2.1

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 (682) hide show
  1. package/README.md +6 -0
  2. package/dist/AttributesEditor.d.ts +3 -1
  3. package/dist/DeviceMockFrame.d.ts +2 -1
  4. package/dist/RenderPage.d.ts +5 -3
  5. package/dist/assets/samples/getSamples.d.ts +1 -0
  6. package/dist/attributes-editor/Field.d.ts +18 -0
  7. package/dist/attributes-editor/FieldInfoTooltip.d.ts +7 -0
  8. package/dist/attributes-editor/LayoutPreviewPicker.d.ts +12 -0
  9. package/dist/attributes-editor/SizeField.d.ts +9 -0
  10. package/dist/attributes-editor/SpecialCategorySection.d.ts +20 -0
  11. package/dist/attributes-editor/types.d.ts +14 -0
  12. package/dist/build-components/BIcon/BIcon.d.ts +5 -0
  13. package/dist/build-components/BIcon/BIconProps.generated.d.ts +58 -0
  14. package/dist/build-components/BackgroundImage/BackgroundImage.d.ts +5 -0
  15. package/dist/build-components/BackgroundImage/BackgroundImageProps.generated.d.ts +50 -0
  16. package/dist/build-components/Button/Button.d.ts +1 -1
  17. package/dist/build-components/Button/ButtonProps.generated.d.ts +39 -1
  18. package/dist/build-components/Carousel/CarouselProps.generated.d.ts +44 -1
  19. package/dist/build-components/CarouselButtons/CarouselButtonsProps.generated.d.ts +38 -0
  20. package/dist/build-components/CarouselDots/CarouselDotsProps.generated.d.ts +38 -0
  21. package/dist/build-components/CarouselItem/CarouselItemProps.generated.d.ts +40 -1
  22. package/dist/build-components/CarouselProvider/CarouselProviderProps.generated.d.ts +40 -1
  23. package/dist/build-components/Image/ImageProps.generated.d.ts +38 -3
  24. package/dist/build-components/Main/Main.d.ts +5 -0
  25. package/dist/build-components/Main/MainProps.generated.d.ts +48 -0
  26. package/dist/build-components/Onboard/OnboardProps.generated.d.ts +40 -1
  27. package/dist/build-components/OnboardButton/OnboardButtonProps.generated.d.ts +38 -1
  28. package/dist/build-components/OnboardButtons/OnboardButtonsProps.generated.d.ts +38 -0
  29. package/dist/build-components/OnboardDot/OnboardDot.d.ts +1 -1
  30. package/dist/build-components/OnboardDot/OnboardDotProps.generated.d.ts +36 -3
  31. package/dist/build-components/OnboardFooter/OnboardFooterProps.generated.d.ts +21 -7
  32. package/dist/build-components/OnboardImage/OnboardImageProps.generated.d.ts +38 -3
  33. package/dist/build-components/OnboardItem/OnboardItemProps.generated.d.ts +37 -3
  34. package/dist/build-components/OnboardProvider/OnboardProviderProps.generated.d.ts +40 -6
  35. package/dist/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.d.ts +21 -7
  36. package/dist/build-components/OnboardTitle/OnboardTitleProps.generated.d.ts +21 -7
  37. package/dist/build-components/PaywallBackground/PaywallBackground.d.ts +5 -0
  38. package/dist/build-components/PaywallBackground/PaywallBackgroundProps.generated.d.ts +47 -0
  39. package/dist/build-components/PaywallCloseButton/PaywallCloseButton.d.ts +5 -0
  40. package/dist/build-components/PaywallCloseButton/PaywallCloseButtonProps.generated.d.ts +58 -0
  41. package/dist/build-components/PaywallOptions/PaywallOptionButton.d.ts +9 -0
  42. package/dist/build-components/PaywallOptions/PaywallOptions.d.ts +5 -0
  43. package/dist/build-components/PaywallOptions/PaywallOptionsProps.generated.d.ts +47 -0
  44. package/dist/build-components/PaywallOptions/usePaywallOptionParamsFactory.d.ts +10 -0
  45. package/dist/build-components/PaywallProvider/PaywallContext.d.ts +12 -0
  46. package/dist/build-components/PaywallProvider/PaywallProvider.d.ts +5 -0
  47. package/dist/build-components/PaywallProvider/PaywallProviderProps.generated.d.ts +47 -0
  48. package/dist/build-components/PaywallSubscribeButton/PaywallSubscribeButton.d.ts +5 -0
  49. package/dist/build-components/PaywallSubscribeButton/PaywallSubscribeButtonProps.generated.d.ts +51 -0
  50. package/dist/build-components/RadioButton/RadioButton.d.ts +11 -0
  51. package/dist/build-components/RadioButton/RadioButtonProps.generated.d.ts +50 -0
  52. package/dist/build-components/RenderNode.generated.d.ts +1 -1
  53. package/dist/build-components/Text/TextProps.generated.d.ts +21 -7
  54. package/dist/build-components/View/ViewProps.generated.d.ts +16 -4
  55. package/dist/build-components/index.d.ts +10 -1
  56. package/dist/build-components/patterns.generated.d.ts +10325 -203
  57. package/dist/components/AttributesEditorPanel.d.ts +4 -4
  58. package/dist/components/BottomBar.d.ts +12 -0
  59. package/dist/components/Breadcrumb.d.ts +3 -1
  60. package/dist/components/Builder.d.ts +3 -2
  61. package/dist/components/BuilderButton.d.ts +9 -0
  62. package/dist/components/BuilderProvider.d.ts +17 -0
  63. package/dist/components/Checkbox.d.ts +17 -0
  64. package/dist/components/DeviceButton.d.ts +8 -0
  65. package/dist/components/DeviceNavigationBar.d.ts +10 -0
  66. package/dist/components/DeviceStatusBar.d.ts +9 -0
  67. package/dist/components/EditorHeader.d.ts +3 -8
  68. package/dist/components/Icon.generated.d.ts +11 -0
  69. package/dist/components/JsonTextEditor.d.ts +9 -0
  70. package/dist/components/LoadingComponent.d.ts +1 -0
  71. package/dist/components/LocalizationParamsProvider.d.ts +11 -0
  72. package/dist/components/ParamsProvider.d.ts +19 -0
  73. package/dist/components/RenderErrorBoundary.d.ts +28 -0
  74. package/dist/hooks/useLocalizationParams.d.ts +1 -0
  75. package/dist/hooks/useLocalize.d.ts +2 -0
  76. package/dist/hooks/useParams.d.ts +1 -0
  77. package/dist/hooks/useProjectFonts.d.ts +13 -0
  78. package/dist/hooks/useSafeAreaViewStyle.d.ts +1 -0
  79. package/dist/hooks/useSyncHtmlThemeClass.d.ts +7 -0
  80. package/dist/index.cjs.js +5 -5
  81. package/dist/index.cjs.js.map +1 -1
  82. package/dist/index.d.ts +17 -2
  83. package/dist/index.esm.js +5 -5
  84. package/dist/index.esm.js.map +1 -1
  85. package/dist/index.native.cjs.js +29 -0
  86. package/dist/index.native.cjs.js.map +1 -0
  87. package/dist/index.native.d.ts +32 -0
  88. package/dist/index.native.esm.js +29 -0
  89. package/dist/index.native.esm.js.map +1 -0
  90. package/dist/migrations/migratePipe.d.ts +14 -0
  91. package/dist/migrations/migrations/1.1.0_normalize_style_attributes.d.ts +2 -0
  92. package/dist/migrations/semver.d.ts +8 -0
  93. package/dist/migrations/types.d.ts +8 -0
  94. package/dist/mockOS/components/MockLaunchScreenComponent.d.ts +6 -0
  95. package/dist/mockOS/components/MockOSRouter.d.ts +8 -0
  96. package/dist/mockOS/components/PermissionModal.d.ts +9 -0
  97. package/dist/mockOS/components/SubscriptionModal.d.ts +7 -0
  98. package/dist/mockOS/context/MockOSContext.d.ts +22 -0
  99. package/dist/mockOS/context/MockOSContextBase.d.ts +22 -0
  100. package/dist/mockOS/hooks/useMockIap.d.ts +3 -0
  101. package/dist/mockOS/hooks/useMockNavigation.d.ts +3 -0
  102. package/dist/mockOS/hooks/useMockPermission.d.ts +3 -0
  103. package/dist/mockOS/index.d.ts +14 -0
  104. package/dist/mockOS/managers/mockOSIapManager.d.ts +6 -0
  105. package/dist/mockOS/managers/mockPermissionManager.d.ts +10 -0
  106. package/dist/mockOS/managers/navigationManager.d.ts +17 -0
  107. package/dist/mockOS/managers/subscriptionManager.d.ts +10 -0
  108. package/dist/modals/AddComponentModal.d.ts +8 -0
  109. package/dist/modals/BenefitEditModal.d.ts +13 -0
  110. package/dist/modals/BenefitPresetsModal.d.ts +9 -0
  111. package/dist/modals/ColorModal.d.ts +11 -0
  112. package/dist/modals/DeviceSelectorModal.d.ts +9 -0
  113. package/dist/modals/IconPickerModal.d.ts +9 -0
  114. package/dist/modals/LocalicationModal.d.ts +8 -0
  115. package/dist/modals/MockableFeatureModal.d.ts +6 -0
  116. package/dist/modals/Modal.d.ts +12 -0
  117. package/dist/modals/ProductEditModal.d.ts +9 -0
  118. package/dist/modals/ProductPresetsModal.d.ts +9 -0
  119. package/dist/modals/ScreenColorsModal.d.ts +8 -0
  120. package/dist/modals/index.d.ts +12 -0
  121. package/dist/pages/ProjectDebug.d.ts +14 -0
  122. package/dist/pages/ProjectMigrationPage.d.ts +23 -0
  123. package/dist/pages/ProjectPage.d.ts +18 -4
  124. package/dist/pages/ProjectValidationPage.d.ts +15 -0
  125. package/dist/pages/tabs/BuilderPanel.d.ts +8 -0
  126. package/dist/pages/tabs/SideTool.d.ts +8 -0
  127. package/dist/paywall/hooks/index.d.ts +5 -0
  128. package/dist/paywall/hooks/useCalculateLocalizedPrice.d.ts +4 -0
  129. package/dist/paywall/hooks/useCarouselOptionsSeperator.d.ts +6 -0
  130. package/dist/paywall/hooks/useCloseStatusPaywall.d.ts +4 -0
  131. package/dist/paywall/hooks/useDiscountRate.d.ts +4 -0
  132. package/dist/paywall/hooks/usePaywallCounter.d.ts +4 -0
  133. package/dist/paywall/types/benefits.d.ts +14 -0
  134. package/dist/paywall/types/paywall-types.d.ts +43 -0
  135. package/dist/store.d.ts +57 -3
  136. package/dist/styles.css +1 -1
  137. package/dist/types/Device.d.ts +5 -0
  138. package/dist/types/Fonts.d.ts +16 -0
  139. package/dist/types/Icons.d.ts +2 -0
  140. package/dist/types/Project.d.ts +26 -0
  141. package/dist/utils/__special_exceptions.d.ts +7 -0
  142. package/dist/utils/analyseNode.d.ts +2 -4
  143. package/dist/utils/analyseNodeByPatterns.d.ts +16 -0
  144. package/dist/utils/analyseNodeStructural.d.ts +11 -0
  145. package/dist/utils/extractImageStyle.d.ts +2 -1
  146. package/dist/utils/extractTextStyle.d.ts +8 -1
  147. package/dist/utils/extractViewStyle.d.ts +7 -1
  148. package/dist/utils/findNodeByKeyNested.d.ts +2 -0
  149. package/dist/utils/fontWeight.d.ts +3 -0
  150. package/dist/utils/fontsDebug.d.ts +12 -0
  151. package/dist/utils/getImage.d.ts +23 -0
  152. package/dist/utils/loadFontFamily.d.ts +30 -0
  153. package/dist/utils/logger.d.ts +11 -0
  154. package/dist/utils/nodeGuards.d.ts +5 -0
  155. package/dist/utils/nodeTree.d.ts +5 -0
  156. package/dist/utils/novaToJson.d.ts +5 -0
  157. package/dist/utils/parseColor.d.ts +7 -0
  158. package/dist/utils/pasteNode.d.ts +15 -0
  159. package/dist/utils/patterns.d.ts +39 -2
  160. package/dist/utils/replaceLocalizationParams.d.ts +1 -0
  161. package/dist/utils/selection.d.ts +7 -0
  162. package/dist/utils/useLogRender.d.ts +1 -0
  163. package/dist/utils/useMergedStyle.d.ts +2 -0
  164. package/package.json +42 -7
  165. package/scripts/migrate-patterns-to-v2.mjs +131 -0
  166. package/scripts/migrate-samples-to-current.ts +79 -0
  167. package/scripts/prebuild/assets/icon.template +71 -0
  168. package/scripts/prebuild/build-components.js +5 -0
  169. package/scripts/prebuild/icon-generator.js +206 -0
  170. package/scripts/prebuild/prebuild.js +10 -1
  171. package/scripts/prebuild/utils/createComponentTsx.js +6 -3
  172. package/scripts/prebuild/utils/createGeneratedProps.js +25 -8
  173. package/scripts/prebuild/utils/createRenderNodeGenerated.js +43 -8
  174. package/scripts/prebuild/utils/validateAllComponentsOrThrow.js +92 -29
  175. package/scripts/prebuild/utils/validatePatternJson.js +26 -15
  176. package/src/.DS_Store +0 -0
  177. package/src/AttributesEditor.tsx +903 -303
  178. package/src/DeviceMockFrame.tsx +50 -66
  179. package/src/RenderPage.tsx +120 -16
  180. package/src/assets/.DS_Store +0 -0
  181. package/src/assets/benefits.json +24 -0
  182. package/src/assets/devices.json +91 -0
  183. package/src/assets/iconset/activity-heart.svg +3 -0
  184. package/src/assets/iconset/activity.svg +3 -0
  185. package/src/assets/iconset/alert-circle.svg +3 -0
  186. package/src/assets/iconset/alert-triangle.svg +3 -0
  187. package/src/assets/iconset/anchor.svg +3 -0
  188. package/src/assets/iconset/archive.svg +3 -0
  189. package/src/assets/iconset/arrow-down.svg +3 -0
  190. package/src/assets/iconset/arrow-left.svg +3 -0
  191. package/src/assets/iconset/arrow-narrow-down-left.svg +3 -0
  192. package/src/assets/iconset/arrow-narrow-up-right.svg +3 -0
  193. package/src/assets/iconset/arrow-right-smooth.svg +4 -0
  194. package/src/assets/iconset/arrow-right.svg +7 -0
  195. package/src/assets/iconset/asterisk-01.svg +3 -0
  196. package/src/assets/iconset/asterisk-02.svg +3 -0
  197. package/src/assets/iconset/at-sign.svg +3 -0
  198. package/src/assets/iconset/award.svg +4 -0
  199. package/src/assets/iconset/battery-charging.svg +6 -0
  200. package/src/assets/iconset/bell-01.svg +5 -0
  201. package/src/assets/iconset/bell-02.svg +3 -0
  202. package/src/assets/iconset/bell-ringing-02.svg +3 -0
  203. package/src/assets/iconset/bookmark-add.svg +3 -0
  204. package/src/assets/iconset/bookmark-check.svg +3 -0
  205. package/src/assets/iconset/bookmark-minus.svg +3 -0
  206. package/src/assets/iconset/bookmark-x.svg +3 -0
  207. package/src/assets/iconset/bookmark.svg +3 -0
  208. package/src/assets/iconset/bubble.svg +5 -0
  209. package/src/assets/iconset/building-01.svg +3 -0
  210. package/src/assets/iconset/building-02.svg +3 -0
  211. package/src/assets/iconset/building-03.svg +3 -0
  212. package/src/assets/iconset/building-04.svg +3 -0
  213. package/src/assets/iconset/building-05.svg +3 -0
  214. package/src/assets/iconset/building-06.svg +3 -0
  215. package/src/assets/iconset/building-07.svg +3 -0
  216. package/src/assets/iconset/building-08.svg +3 -0
  217. package/src/assets/iconset/building-09.svg +3 -0
  218. package/src/assets/iconset/camera-01.svg +8 -0
  219. package/src/assets/iconset/camera-steel.svg +4 -0
  220. package/src/assets/iconset/camera.svg +4 -0
  221. package/src/assets/iconset/check-circle-bold.svg +3 -0
  222. package/src/assets/iconset/check-circle-broken.svg +3 -0
  223. package/src/assets/iconset/check-circle.svg +3 -0
  224. package/src/assets/iconset/check-done-01.svg +3 -0
  225. package/src/assets/iconset/check-done-02.svg +3 -0
  226. package/src/assets/iconset/check-heart.svg +3 -0
  227. package/src/assets/iconset/check-square-broken.svg +3 -0
  228. package/src/assets/iconset/check-square.svg +3 -0
  229. package/src/assets/iconset/check-verified-01.svg +3 -0
  230. package/src/assets/iconset/check-verified-02.svg +3 -0
  231. package/src/assets/iconset/check-verified-03.svg +3 -0
  232. package/src/assets/iconset/check.svg +3 -0
  233. package/src/assets/iconset/checkbox.svg +4 -0
  234. package/src/assets/iconset/checkv.svg +3 -0
  235. package/src/assets/iconset/chevron-down.svg +3 -0
  236. package/src/assets/iconset/chevron-down2.svg +3 -0
  237. package/src/assets/iconset/chevron-left-2.svg +3 -0
  238. package/src/assets/iconset/chevron-left.svg +3 -0
  239. package/src/assets/iconset/chevron-right-empty.svg +3 -0
  240. package/src/assets/iconset/chevron-right-smooth.svg +3 -0
  241. package/src/assets/iconset/chevron-right.svg +3 -0
  242. package/src/assets/iconset/chevron-up.svg +3 -0
  243. package/src/assets/iconset/circle.svg +32 -0
  244. package/src/assets/iconset/clock-fast-forward.svg +10 -0
  245. package/src/assets/iconset/clock.svg +3 -0
  246. package/src/assets/iconset/close-circle.svg +3 -0
  247. package/src/assets/iconset/close.svg +3 -0
  248. package/src/assets/iconset/cloud-01.svg +5 -0
  249. package/src/assets/iconset/cloud-blank-01.svg +3 -0
  250. package/src/assets/iconset/cloud-blank-02.svg +3 -0
  251. package/src/assets/iconset/coin.svg +5 -0
  252. package/src/assets/iconset/coins-02.svg +3 -0
  253. package/src/assets/iconset/colors.svg +3 -0
  254. package/src/assets/iconset/copy-01.svg +3 -0
  255. package/src/assets/iconset/copy-02.svg +3 -0
  256. package/src/assets/iconset/copy-03.svg +3 -0
  257. package/src/assets/iconset/copy-04.svg +3 -0
  258. package/src/assets/iconset/copy-05.svg +3 -0
  259. package/src/assets/iconset/copy-06.svg +3 -0
  260. package/src/assets/iconset/copy-07.svg +3 -0
  261. package/src/assets/iconset/corner-down-right.svg +3 -0
  262. package/src/assets/iconset/crypto-bold.svg +4 -0
  263. package/src/assets/iconset/delete-icon.svg +5 -0
  264. package/src/assets/iconset/diamond.svg +3 -0
  265. package/src/assets/iconset/dice-3.svg +3 -0
  266. package/src/assets/iconset/divide-01.svg +3 -0
  267. package/src/assets/iconset/divide-02.svg +3 -0
  268. package/src/assets/iconset/divide-03.svg +3 -0
  269. package/src/assets/iconset/document-check-bold.svg +4 -0
  270. package/src/assets/iconset/dots-circle.svg +10 -0
  271. package/src/assets/iconset/dots-grid.svg +11 -0
  272. package/src/assets/iconset/dots-horizontal.svg +5 -0
  273. package/src/assets/iconset/dots-vertical.svg +5 -0
  274. package/src/assets/iconset/download-01.svg +3 -0
  275. package/src/assets/iconset/download-02.svg +3 -0
  276. package/src/assets/iconset/download-03.svg +3 -0
  277. package/src/assets/iconset/edit-03.svg +3 -0
  278. package/src/assets/iconset/edit-04.svg +3 -0
  279. package/src/assets/iconset/edit-05.svg +3 -0
  280. package/src/assets/iconset/element-3.svg +6 -0
  281. package/src/assets/iconset/ellipse-127.svg +3 -0
  282. package/src/assets/iconset/exclaimation-circle.svg +8 -0
  283. package/src/assets/iconset/eye-off-line.svg +5 -0
  284. package/src/assets/iconset/face-smile.svg +5 -0
  285. package/src/assets/iconset/file-04.svg +3 -0
  286. package/src/assets/iconset/file-05.svg +3 -0
  287. package/src/assets/iconset/file-check-02.svg +3 -0
  288. package/src/assets/iconset/file-plus-01.svg +5 -0
  289. package/src/assets/iconset/file-shield-02.svg +5 -0
  290. package/src/assets/iconset/filter-funnel-01.svg +3 -0
  291. package/src/assets/iconset/flag-03.svg +3 -0
  292. package/src/assets/iconset/flash.svg +3 -0
  293. package/src/assets/iconset/folder-plus.svg +3 -0
  294. package/src/assets/iconset/folder.svg +3 -0
  295. package/src/assets/iconset/gallery.svg +3 -0
  296. package/src/assets/iconset/globe-01.svg +3 -0
  297. package/src/assets/iconset/globe-04.svg +5 -0
  298. package/src/assets/iconset/globe-bold.svg +4 -0
  299. package/src/assets/iconset/guard.svg +3 -0
  300. package/src/assets/iconset/headphones-01.svg +3 -0
  301. package/src/assets/iconset/headphones-02.svg +5 -0
  302. package/src/assets/iconset/headset-bold.svg +4 -0
  303. package/src/assets/iconset/heart-bold.svg +3 -0
  304. package/src/assets/iconset/heart.svg +3 -0
  305. package/src/assets/iconset/help-circle.svg +5 -0
  306. package/src/assets/iconset/home-2.svg +4 -0
  307. package/src/assets/iconset/home-line.svg +3 -0
  308. package/src/assets/iconset/hourglass-02.svg +5 -0
  309. package/src/assets/iconset/image-01.svg +5 -0
  310. package/src/assets/iconset/image-03.svg +3 -0
  311. package/src/assets/iconset/image.svg +4 -0
  312. package/src/assets/iconset/inbox-01.svg +3 -0
  313. package/src/assets/iconset/inbox-arrow-down.svg +3 -0
  314. package/src/assets/iconset/info-circle.svg +3 -0
  315. package/src/assets/iconset/keyboard-line.svg +9 -0
  316. package/src/assets/iconset/lamp-charge.svg +5 -0
  317. package/src/assets/iconset/layer.svg +3 -0
  318. package/src/assets/iconset/light.svg +6 -0
  319. package/src/assets/iconset/like-dislike.svg +6 -0
  320. package/src/assets/iconset/lock-03.svg +3 -0
  321. package/src/assets/iconset/logout.svg +3 -0
  322. package/src/assets/iconset/magicpen.svg +7 -0
  323. package/src/assets/iconset/mail-01.svg +5 -0
  324. package/src/assets/iconset/mail.svg +3 -0
  325. package/src/assets/iconset/marker.svg +3 -0
  326. package/src/assets/iconset/medal-star.svg +5 -0
  327. package/src/assets/iconset/menu-04.svg +3 -0
  328. package/src/assets/iconset/menu.svg +5 -0
  329. package/src/assets/iconset/message-circle-01.svg +5 -0
  330. package/src/assets/iconset/message-plus-circle.svg +3 -0
  331. package/src/assets/iconset/message-question-circle.svg +5 -0
  332. package/src/assets/iconset/message-text-circle-01.svg +5 -0
  333. package/src/assets/iconset/message-text-square-02.svg +3 -0
  334. package/src/assets/iconset/message-x-square.svg +3 -0
  335. package/src/assets/iconset/microphone-02.svg +3 -0
  336. package/src/assets/iconset/microphone-slash.svg +8 -0
  337. package/src/assets/iconset/mirror.svg +4 -0
  338. package/src/assets/iconset/moon-01.svg +3 -0
  339. package/src/assets/iconset/moon-bold.svg +3 -0
  340. package/src/assets/iconset/mouse-circle.svg +4 -0
  341. package/src/assets/iconset/move.svg +5 -0
  342. package/src/assets/iconset/notification-fill.svg +3 -0
  343. package/src/assets/iconset/notification-text.svg +3 -0
  344. package/src/assets/iconset/notification.svg +5 -0
  345. package/src/assets/iconset/pdf-01.svg +6 -0
  346. package/src/assets/iconset/pencil-01.svg +5 -0
  347. package/src/assets/iconset/phone-01.svg +3 -0
  348. package/src/assets/iconset/phone-arrow-down-left.svg +4 -0
  349. package/src/assets/iconset/phone-arrow-up-right.svg +8 -0
  350. package/src/assets/iconset/phone-hang-up.svg +5 -0
  351. package/src/assets/iconset/phone-hangup2.svg +8 -0
  352. package/src/assets/iconset/phone-incoming-01.svg +3 -0
  353. package/src/assets/iconset/phone-outgoing-01.svg +3 -0
  354. package/src/assets/iconset/phone-plus.svg +3 -0
  355. package/src/assets/iconset/phone-x.svg +3 -0
  356. package/src/assets/iconset/phone.svg +3 -0
  357. package/src/assets/iconset/plus-circle.svg +3 -0
  358. package/src/assets/iconset/plus.svg +4 -0
  359. package/src/assets/iconset/printer.svg +3 -0
  360. package/src/assets/iconset/question-mark-circle.svg +5 -0
  361. package/src/assets/iconset/refresh-ccw-01.svg +3 -0
  362. package/src/assets/iconset/refresh-cw-01.svg +3 -0
  363. package/src/assets/iconset/refresh-cw-04.svg +3 -0
  364. package/src/assets/iconset/refresh-right-square-bold.svg +3 -0
  365. package/src/assets/iconset/remove-circle.svg +12 -0
  366. package/src/assets/iconset/repeat-04.svg +3 -0
  367. package/src/assets/iconset/repeat-bold.svg +3 -0
  368. package/src/assets/iconset/ruler-pen.svg +4 -0
  369. package/src/assets/iconset/search-lg.svg +3 -0
  370. package/src/assets/iconset/search-md.svg +5 -0
  371. package/src/assets/iconset/search-refraction.svg +5 -0
  372. package/src/assets/iconset/search.svg +3 -0
  373. package/src/assets/iconset/send-01.svg +3 -0
  374. package/src/assets/iconset/send-02.svg +5 -0
  375. package/src/assets/iconset/send-diagonal.svg +3 -0
  376. package/src/assets/iconset/setting-2.svg +4 -0
  377. package/src/assets/iconset/settings-02.svg +4 -0
  378. package/src/assets/iconset/settings-04.svg +5 -0
  379. package/src/assets/iconset/settings-2.svg +4 -0
  380. package/src/assets/iconset/settings-cog.svg +3 -0
  381. package/src/assets/iconset/settings.svg +4 -0
  382. package/src/assets/iconset/share-01.svg +4 -0
  383. package/src/assets/iconset/share-03.svg +3 -0
  384. package/src/assets/iconset/share-04.svg +3 -0
  385. package/src/assets/iconset/share-05.svg +5 -0
  386. package/src/assets/iconset/share-06.svg +3 -0
  387. package/src/assets/iconset/share-bold.svg +3 -0
  388. package/src/assets/iconset/shield-01.svg +3 -0
  389. package/src/assets/iconset/shield-bold.svg +3 -0
  390. package/src/assets/iconset/solar-check.svg +3 -0
  391. package/src/assets/iconset/speaker-wave.svg +9 -0
  392. package/src/assets/iconset/speaker.svg +5 -0
  393. package/src/assets/iconset/speedometer-03.svg +3 -0
  394. package/src/assets/iconset/star-rounded.svg +3 -0
  395. package/src/assets/iconset/star.svg +3 -0
  396. package/src/assets/iconset/sun.svg +5 -0
  397. package/src/assets/iconset/target-03.svg +3 -0
  398. package/src/assets/iconset/text-input.svg +3 -0
  399. package/src/assets/iconset/translate.svg +7 -0
  400. package/src/assets/iconset/trash-02.svg +3 -0
  401. package/src/assets/iconset/trash-03.svg +5 -0
  402. package/src/assets/iconset/trash-04.svg +3 -0
  403. package/src/assets/iconset/trash.svg +7 -0
  404. package/src/assets/iconset/trush-square-bold.svg +3 -0
  405. package/src/assets/iconset/unlimited.svg +3 -0
  406. package/src/assets/iconset/user-circle.svg +3 -0
  407. package/src/assets/iconset/user-jogging.svg +3 -0
  408. package/src/assets/iconset/user-plus-01.svg +5 -0
  409. package/src/assets/iconset/user-square.svg +5 -0
  410. package/src/assets/iconset/user-x-01.svg +5 -0
  411. package/src/assets/iconset/user-x-02.svg +3 -0
  412. package/src/assets/iconset/user2.svg +3 -0
  413. package/src/assets/iconset/users-02.svg +5 -0
  414. package/src/assets/iconset/users-speaker.svg +7 -0
  415. package/src/assets/iconset/verify.svg +3 -0
  416. package/src/assets/iconset/voice-cricle.svg +8 -0
  417. package/src/assets/iconset/x-circle.svg +3 -0
  418. package/src/assets/iconset/x-close.svg +3 -0
  419. package/src/assets/iconset/x-sm.svg +3 -0
  420. package/src/assets/iconset/zap.svg +3 -0
  421. package/src/assets/images/android.svg +42 -42
  422. package/src/assets/images/apple.svg +15 -15
  423. package/src/assets/images/background.jpg +0 -0
  424. package/src/assets/loading_animation.json +1 -0
  425. package/src/assets/products.json +98 -0
  426. package/src/assets/samples/carousel-sample.json +142 -29
  427. package/src/assets/samples/getSamples.ts +48 -66
  428. package/src/assets/samples/paywall-1.json +268 -0
  429. package/src/assets/samples/simple-1.json +29 -16
  430. package/src/assets/samples/simple-2.json +158 -82
  431. package/src/assets/samples/unmigrated-builder1.json +42 -0
  432. package/src/assets/samples/unvalidated-builder1.json +49 -0
  433. package/src/assets/samples/unvalidated-crash1.json +19 -0
  434. package/src/assets/samples/unvalidated-crashcomponent1.json +16 -0
  435. package/src/assets/samples/vpn-onboard-1.json +357 -713
  436. package/src/assets/samples/vpn-onboard-2.json +360 -704
  437. package/src/assets/samples/vpn-onboard-3.json +325 -701
  438. package/src/assets/samples/vpn-onboard-4.json +325 -702
  439. package/src/assets/samples/vpn-onboard-5.json +484 -909
  440. package/src/assets/samples/vpn-onboard-6.json +333 -608
  441. package/src/attributes-editor/Field.tsx +575 -0
  442. package/src/attributes-editor/FieldInfoTooltip.tsx +49 -0
  443. package/src/attributes-editor/LayoutPreviewPicker.tsx +202 -0
  444. package/src/attributes-editor/SizeField.tsx +184 -0
  445. package/src/attributes-editor/SpecialCategorySection.tsx +292 -0
  446. package/src/attributes-editor/types.ts +30 -0
  447. package/src/build-components/BIcon/BIcon.tsx +56 -0
  448. package/src/build-components/BIcon/BIconProps.generated.ts +74 -0
  449. package/src/build-components/BIcon/pattern.json +50 -0
  450. package/src/build-components/BackgroundImage/BackgroundImage.tsx +79 -0
  451. package/src/build-components/BackgroundImage/BackgroundImageProps.generated.ts +66 -0
  452. package/src/build-components/BackgroundImage/pattern.json +54 -0
  453. package/src/build-components/Button/Button.tsx +73 -2
  454. package/src/build-components/Button/ButtonProps.generated.ts +50 -1
  455. package/src/build-components/Button/pattern.json +41 -5
  456. package/src/build-components/Carousel/Carousel.tsx +39 -2
  457. package/src/build-components/Carousel/CarouselProps.generated.ts +56 -1
  458. package/src/build-components/Carousel/pattern.json +26 -5
  459. package/src/build-components/CarouselButtons/CarouselButtons.tsx +23 -2
  460. package/src/build-components/CarouselButtons/CarouselButtonsProps.generated.ts +49 -0
  461. package/src/build-components/CarouselButtons/pattern.json +32 -4
  462. package/src/build-components/CarouselDots/CarouselDots.tsx +51 -8
  463. package/src/build-components/CarouselDots/CarouselDotsProps.generated.ts +49 -0
  464. package/src/build-components/CarouselDots/pattern.json +19 -3
  465. package/src/build-components/CarouselItem/CarouselItem.tsx +24 -3
  466. package/src/build-components/CarouselItem/CarouselItemProps.generated.ts +52 -1
  467. package/src/build-components/CarouselItem/pattern.json +11 -3
  468. package/src/build-components/CarouselProvider/CarouselProvider.tsx +66 -5
  469. package/src/build-components/CarouselProvider/CarouselProviderProps.generated.ts +52 -1
  470. package/src/build-components/CarouselProvider/pattern.json +8 -1
  471. package/src/build-components/Image/Image.tsx +33 -6
  472. package/src/build-components/Image/ImageProps.generated.ts +49 -3
  473. package/src/build-components/Image/pattern.json +48 -7
  474. package/src/build-components/Main/Main.tsx +61 -0
  475. package/src/build-components/Main/MainProps.generated.ts +64 -0
  476. package/src/build-components/Main/pattern.json +38 -0
  477. package/src/build-components/Onboard/Onboard.tsx +8 -1
  478. package/src/build-components/Onboard/OnboardProps.generated.ts +52 -1
  479. package/src/build-components/Onboard/pattern.json +18 -2
  480. package/src/build-components/OnboardButton/OnboardButton.tsx +53 -6
  481. package/src/build-components/OnboardButton/OnboardButtonProps.generated.ts +49 -1
  482. package/src/build-components/OnboardButton/pattern.json +74 -7
  483. package/src/build-components/OnboardButtons/OnboardButtons.tsx +35 -11
  484. package/src/build-components/OnboardButtons/OnboardButtonsProps.generated.ts +49 -0
  485. package/src/build-components/OnboardButtons/pattern.json +73 -6
  486. package/src/build-components/OnboardDot/OnboardDot.tsx +135 -4
  487. package/src/build-components/OnboardDot/OnboardDotProps.generated.ts +36 -3
  488. package/src/build-components/OnboardDot/pattern.json +45 -7
  489. package/src/build-components/OnboardFooter/OnboardFooter.tsx +42 -11
  490. package/src/build-components/OnboardFooter/OnboardFooterProps.generated.ts +21 -18
  491. package/src/build-components/OnboardFooter/pattern.json +64 -5
  492. package/src/build-components/OnboardImage/OnboardImage.tsx +51 -5
  493. package/src/build-components/OnboardImage/OnboardImageProps.generated.ts +49 -3
  494. package/src/build-components/OnboardImage/pattern.json +26 -2
  495. package/src/build-components/OnboardItem/OnboardItem.tsx +20 -12
  496. package/src/build-components/OnboardItem/OnboardItemProps.generated.ts +48 -3
  497. package/src/build-components/OnboardItem/pattern.json +54 -9
  498. package/src/build-components/OnboardProvider/OnboardProvider.tsx +50 -21
  499. package/src/build-components/OnboardProvider/OnboardProviderProps.generated.ts +52 -6
  500. package/src/build-components/OnboardProvider/pattern.json +56 -12
  501. package/src/build-components/OnboardSubtitle/OnboardSubtitle.tsx +2 -0
  502. package/src/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.ts +21 -18
  503. package/src/build-components/OnboardSubtitle/pattern.json +15 -5
  504. package/src/build-components/OnboardTitle/OnboardTitle.tsx +2 -0
  505. package/src/build-components/OnboardTitle/OnboardTitleProps.generated.ts +21 -18
  506. package/src/build-components/OnboardTitle/pattern.json +16 -6
  507. package/src/build-components/PaywallBackground/PaywallBackground.tsx +47 -0
  508. package/src/build-components/PaywallBackground/PaywallBackgroundProps.generated.ts +63 -0
  509. package/src/build-components/PaywallBackground/pattern.json +17 -0
  510. package/src/build-components/PaywallCloseButton/PaywallCloseButton.tsx +67 -0
  511. package/src/build-components/PaywallCloseButton/PaywallCloseButtonProps.generated.ts +74 -0
  512. package/src/build-components/PaywallCloseButton/pattern.json +26 -0
  513. package/src/build-components/PaywallOptions/PaywallOptionButton.tsx +63 -0
  514. package/src/build-components/PaywallOptions/PaywallOptions.tsx +93 -0
  515. package/src/build-components/PaywallOptions/PaywallOptionsProps.generated.ts +63 -0
  516. package/src/build-components/PaywallOptions/pattern.json +25 -0
  517. package/src/build-components/PaywallOptions/usePaywallOptionParamsFactory.ts +42 -0
  518. package/src/build-components/PaywallProvider/PaywallContext.ts +25 -0
  519. package/src/build-components/PaywallProvider/PaywallProvider.tsx +175 -0
  520. package/src/build-components/PaywallProvider/PaywallProviderProps.generated.ts +63 -0
  521. package/src/build-components/PaywallProvider/pattern.json +27 -0
  522. package/src/build-components/PaywallSubscribeButton/PaywallSubscribeButton.tsx +67 -0
  523. package/src/build-components/PaywallSubscribeButton/PaywallSubscribeButtonProps.generated.ts +78 -0
  524. package/src/build-components/PaywallSubscribeButton/pattern.json +30 -0
  525. package/src/build-components/RadioButton/RadioButton.tsx +123 -0
  526. package/src/build-components/RadioButton/RadioButtonProps.generated.ts +66 -0
  527. package/src/build-components/RadioButton/pattern.json +43 -0
  528. package/src/build-components/RenderNode.generated.tsx +134 -35
  529. package/src/build-components/Text/Text.tsx +135 -8
  530. package/src/build-components/Text/TextProps.generated.ts +21 -18
  531. package/src/build-components/Text/pattern.json +66 -19
  532. package/src/build-components/View/View.tsx +33 -6
  533. package/src/build-components/View/ViewProps.generated.ts +16 -4
  534. package/src/build-components/View/pattern.json +352 -25
  535. package/src/build-components/index.ts +54 -9
  536. package/src/build-components/other.tsx +15 -0
  537. package/src/build-components/patterns.generated.ts +10505 -280
  538. package/src/build-components/useNode.ts +22 -3
  539. package/src/components/AttributesEditorPanel.tsx +21 -64
  540. package/src/components/BottomBar.tsx +242 -0
  541. package/src/components/Breadcrumb.tsx +39 -5
  542. package/src/components/Builder.tsx +389 -128
  543. package/src/components/BuilderButton.tsx +161 -0
  544. package/src/components/BuilderProvider.tsx +65 -0
  545. package/src/components/Checkbox.tsx +81 -0
  546. package/src/components/DeviceButton.tsx +46 -0
  547. package/src/components/DeviceNavigationBar.tsx +200 -0
  548. package/src/components/DeviceStatusBar.tsx +85 -0
  549. package/src/components/EditorHeader.tsx +328 -103
  550. package/src/components/Icon.generated.tsx +540 -0
  551. package/src/components/JsonTextEditor.tsx +185 -0
  552. package/src/components/LoadingComponent.tsx +10 -0
  553. package/src/components/LocalizationParamsProvider.tsx +22 -0
  554. package/src/components/ParamsProvider.tsx +45 -0
  555. package/src/components/RenderErrorBoundary.tsx +200 -0
  556. package/src/hooks/useLocalizationParams.ts +5 -0
  557. package/src/hooks/useLocalize.ts +23 -0
  558. package/src/hooks/useParams.ts +12 -0
  559. package/src/hooks/useProjectFonts.ts +130 -0
  560. package/src/hooks/useSafeAreaViewStyle.ts +67 -0
  561. package/src/hooks/useSyncHtmlThemeClass.ts +19 -0
  562. package/src/index.native.ts +82 -0
  563. package/src/index.ts +41 -2
  564. package/src/migrations/migratePipe.ts +59 -0
  565. package/src/migrations/migrations/1.1.0_normalize_style_attributes.ts +80 -0
  566. package/src/migrations/semver.ts +24 -0
  567. package/src/migrations/types.ts +9 -0
  568. package/src/mockOS/components/MockLaunchScreenComponent.tsx +43 -0
  569. package/src/mockOS/components/MockOSRouter.tsx +124 -0
  570. package/src/mockOS/components/PermissionModal.tsx +271 -0
  571. package/src/mockOS/components/SubscriptionModal.tsx +400 -0
  572. package/src/mockOS/context/MockOSContext.tsx +201 -0
  573. package/src/mockOS/context/MockOSContextBase.ts +36 -0
  574. package/src/mockOS/hooks/useMockIap.ts +11 -0
  575. package/src/mockOS/hooks/useMockNavigation.ts +11 -0
  576. package/src/mockOS/hooks/useMockPermission.ts +11 -0
  577. package/src/mockOS/index.ts +34 -0
  578. package/src/mockOS/managers/mockOSIapManager.ts +10 -0
  579. package/src/mockOS/managers/mockPermissionManager.ts +50 -0
  580. package/src/mockOS/managers/navigationManager.ts +86 -0
  581. package/src/mockOS/managers/subscriptionManager.ts +36 -0
  582. package/src/modals/AddComponentModal.tsx +314 -0
  583. package/src/modals/BenefitEditModal.tsx +160 -0
  584. package/src/modals/BenefitPresetsModal.tsx +166 -0
  585. package/src/modals/ColorModal.tsx +503 -0
  586. package/src/modals/DeviceSelectorModal.tsx +57 -0
  587. package/src/modals/IconPickerModal.tsx +109 -0
  588. package/src/modals/LocalicationModal.tsx +53 -0
  589. package/src/modals/MockableFeatureModal.tsx +292 -0
  590. package/src/modals/Modal.tsx +64 -0
  591. package/src/modals/ProductEditModal.tsx +215 -0
  592. package/src/modals/ProductPresetsModal.tsx +151 -0
  593. package/src/modals/ScreenColorsModal.tsx +121 -0
  594. package/src/modals/index.ts +12 -0
  595. package/src/pages/ProjectDebug.tsx +331 -0
  596. package/src/pages/ProjectMigrationPage.tsx +92 -0
  597. package/src/pages/ProjectPage.tsx +488 -70
  598. package/src/pages/ProjectValidationPage.tsx +54 -0
  599. package/src/pages/tabs/BuilderPanel.tsx +37 -0
  600. package/src/pages/tabs/SideTool.tsx +253 -0
  601. package/src/paywall/hooks/index.ts +5 -0
  602. package/src/paywall/hooks/useCalculateLocalizedPrice.ts +6 -0
  603. package/src/paywall/hooks/useCarouselOptionsSeperator.ts +8 -0
  604. package/src/paywall/hooks/useCloseStatusPaywall.ts +6 -0
  605. package/src/paywall/hooks/useDiscountRate.ts +6 -0
  606. package/src/paywall/hooks/usePaywallCounter.ts +6 -0
  607. package/src/paywall/types/benefits.ts +44 -0
  608. package/src/paywall/types/paywall-types.ts +51 -0
  609. package/src/size-matters/index.ts +27 -5
  610. package/src/store.ts +222 -16
  611. package/src/styles/base/_global.scss +469 -0
  612. package/src/styles/components/_attributes-editor.scss +310 -0
  613. package/src/styles/components/_bottom-bar.scss +104 -0
  614. package/src/styles/components/_editor-shell.scss +331 -0
  615. package/src/styles/components/_mockos-router.scss +143 -0
  616. package/src/styles/components/_ui-components.scss +188 -0
  617. package/src/styles/foundation/_colors.scss +95 -0
  618. package/src/styles/foundation/_mixins.scss +25 -0
  619. package/src/styles/{_reset.scss → foundation/_reset.scss} +5 -2
  620. package/src/styles/foundation/_sizes.scss +41 -0
  621. package/src/styles/foundation/_typography.scss +4 -0
  622. package/src/styles/foundation/_variables.scss +3 -0
  623. package/src/styles/index.scss +29 -136
  624. package/src/styles/layout/_builder.scss +185 -0
  625. package/src/styles/layout/_pages.scss +3 -0
  626. package/src/styles/layout/_project-validation.scss +214 -0
  627. package/src/styles/modals/_add-component.scss +124 -0
  628. package/src/styles/modals/_benefit-edit-modal.scss +17 -0
  629. package/src/styles/modals/_benefit-presets-modal.scss +79 -0
  630. package/src/styles/modals/_color-modal.scss +190 -0
  631. package/src/styles/modals/_device-selector.scss +18 -0
  632. package/src/styles/modals/_localication-modal.scss +68 -0
  633. package/src/styles/modals/_mockable-feature-modal.scss +15 -0
  634. package/src/styles/modals/_modal-shell.scss +48 -0
  635. package/src/styles/modals/_product-edit-modal.scss +23 -0
  636. package/src/styles/modals/_product-presets-modal.scss +81 -0
  637. package/src/styles/utilities/_carousel.scss +126 -0
  638. package/src/types/Device.ts +5 -0
  639. package/src/types/Fonts.ts +20 -0
  640. package/src/types/Icons.ts +244 -0
  641. package/src/types/Project.ts +32 -0
  642. package/src/types/images.d.ts +8 -0
  643. package/src/types/jest-globals.d.ts +13 -0
  644. package/src/utils/__special_exceptions.ts +88 -0
  645. package/src/utils/analyseNode.ts +79 -62
  646. package/src/utils/analyseNodeByPatterns.ts +481 -0
  647. package/src/utils/analyseNodeStructural.ts +52 -0
  648. package/src/utils/extractImageStyle.ts +3 -6
  649. package/src/utils/extractTextStyle.ts +130 -81
  650. package/src/utils/extractViewStyle.ts +118 -17
  651. package/src/utils/findNodeByKeyNested.ts +32 -0
  652. package/src/utils/fontWeight.ts +29 -0
  653. package/src/utils/fontsDebug.ts +16 -0
  654. package/src/utils/getImage.ts +76 -0
  655. package/src/utils/isCarousel.ts +21 -5
  656. package/src/utils/loadFontFamily.ts +318 -0
  657. package/src/utils/logger.ts +76 -0
  658. package/src/utils/nodeGuards.ts +26 -0
  659. package/src/utils/nodeTree.ts +99 -0
  660. package/src/utils/novaToJson.ts +23 -10
  661. package/src/utils/parseColor.ts +43 -0
  662. package/src/utils/pasteNode.ts +172 -0
  663. package/src/utils/patterns.ts +100 -5
  664. package/src/utils/replaceLocalizationParams.ts +15 -0
  665. package/src/utils/selection.ts +24 -0
  666. package/src/utils/useLogRender.ts +13 -0
  667. package/src/utils/useMergedStyle.ts +16 -0
  668. package/dist/build-components/OnboardDot/OnboardExpandingDotProps.generated.d.ts +0 -10
  669. package/dist/pages/tabs/BuilderTab.d.ts +0 -9
  670. package/dist/pages/tabs/DebugTab.d.ts +0 -7
  671. package/dist/pages/tabs/PreviewTab.d.ts +0 -3
  672. package/src/build-components/OnboardDot/OnboardExpandingDotProps.generated.ts +0 -20
  673. package/src/pages/tabs/BuilderTab.tsx +0 -31
  674. package/src/pages/tabs/DebugTab.tsx +0 -21
  675. package/src/pages/tabs/PreviewTab.tsx +0 -192
  676. package/src/styles/_mixins.scss +0 -21
  677. package/src/styles/_variables.scss +0 -27
  678. package/src/styles/builder.scss +0 -60
  679. package/src/styles/components.scss +0 -88
  680. package/src/styles/editor.scss +0 -174
  681. package/src/styles/global.scss +0 -200
  682. package/src/styles/pages.scss +0 -2
@@ -0,0 +1,202 @@
1
+ import React from 'react';
2
+ import type { ViewPropsGenerated } from '../build-components/View/ViewProps.generated';
3
+ import { LayoutContext, LayoutFieldName } from './types';
4
+
5
+ type LayoutPreviewPickerProps = {
6
+ mode: LayoutFieldName;
7
+ options: string[];
8
+ value?: string;
9
+ onChange: (val?: string) => void;
10
+ layoutContext?: LayoutContext;
11
+ viewAttributes?: Partial<ViewPropsGenerated['attributes']>;
12
+ };
13
+
14
+ export function LayoutPreviewPicker({
15
+ mode,
16
+ options,
17
+ value,
18
+ onChange,
19
+ layoutContext,
20
+ viewAttributes,
21
+ }: LayoutPreviewPickerProps) {
22
+ if (!options.length) {
23
+ return null;
24
+ }
25
+
26
+ const selectedValue =
27
+ typeof value === 'string'
28
+ ? value
29
+ : (layoutContext?.[mode as keyof LayoutContext] as string | undefined);
30
+
31
+ return (
32
+ <div
33
+ style={{
34
+ display: 'flex',
35
+ flexWrap: 'wrap',
36
+ gap: 6,
37
+ paddingBottom: 2,
38
+ }}
39
+ >
40
+ {options.map((option) => {
41
+ const isActive = selectedValue === option;
42
+ return (
43
+ <button
44
+ key={option}
45
+ type="button"
46
+ onClick={() => onChange(option)}
47
+ style={{
48
+ borderRadius: 8,
49
+ padding: 5,
50
+ width: 110,
51
+ flex: '0 0 auto',
52
+ border: isActive ? '2px solid #222' : '1px solid #d5d5d5',
53
+ background: 'hsl(var(--card, var(--rb-card, 0 0% 100%)))',
54
+ textAlign: 'left',
55
+ display: 'flex',
56
+ flexDirection: 'column',
57
+ gap: 3,
58
+ cursor: 'pointer',
59
+ boxShadow: isActive ? '0 2px 4px rgba(0,0,0,0.08)' : 'none',
60
+ }}
61
+ >
62
+ <LayoutPreview
63
+ mode={mode}
64
+ option={option}
65
+ isActive={isActive}
66
+ layoutContext={layoutContext}
67
+ viewAttributes={viewAttributes}
68
+ />
69
+ <span style={{ fontWeight: 600, fontSize: 11 }}>
70
+ {formatLayoutLabel(option)}
71
+ </span>
72
+ </button>
73
+ );
74
+ })}
75
+ </div>
76
+ );
77
+ }
78
+
79
+ type LayoutPreviewProps = {
80
+ mode: LayoutFieldName;
81
+ option: string;
82
+ isActive: boolean;
83
+ layoutContext?: LayoutContext;
84
+ viewAttributes?: Partial<ViewPropsGenerated['attributes']>;
85
+ };
86
+
87
+ function LayoutPreview({
88
+ mode,
89
+ option,
90
+ isActive,
91
+ layoutContext,
92
+ viewAttributes,
93
+ }: LayoutPreviewProps) {
94
+ const resolved = resolvePreviewContext(mode, option, layoutContext);
95
+ const isColumn = resolved.flexDirection?.startsWith('column');
96
+ const resolvedBackground =
97
+ viewAttributes?.backgroundColor ??
98
+ (isActive
99
+ ? 'hsl(var(--muted, var(--rb-muted, 220 14.3% 95.9%)) / 0.55)'
100
+ : 'hsl(var(--muted, var(--rb-muted, 220 14.3% 95.9%)))');
101
+ const resolvedGap = parseNumeric(viewAttributes?.gap) ?? 3;
102
+ const resolvedBorderRadius = parseNumeric(viewAttributes?.borderRadius) ?? 4;
103
+
104
+ const stretchOverrides =
105
+ resolved.alignItems === 'stretch'
106
+ ? isColumn
107
+ ? { width: '100%' }
108
+ : { height: '100%' }
109
+ : undefined;
110
+
111
+ return (
112
+ <div
113
+ style={{
114
+ borderRadius: resolvedBorderRadius,
115
+ border: '1px dashed rgba(0,0,0,0.2)',
116
+ padding: 5,
117
+ background: resolvedBackground,
118
+ }}
119
+ >
120
+ <div
121
+ style={{
122
+ display: 'flex',
123
+ flexDirection: resolved.flexDirection ?? 'row',
124
+ justifyContent: resolved.justifyContent ?? 'flex-start',
125
+ alignItems: resolved.alignItems ?? 'stretch',
126
+ gap: resolvedGap,
127
+ width: '100%',
128
+ minHeight: isColumn ? 52 : 40,
129
+ transition: 'all 0.2s ease',
130
+ }}
131
+ >
132
+ {Array.from({ length: 3 }).map((_, idx) => (
133
+ <span
134
+ key={idx}
135
+ style={{
136
+ width: isColumn ? 22 : 10,
137
+ height: isColumn ? 10 : 10,
138
+ borderRadius: 2.5,
139
+ background: '#f7a500',
140
+ border: '1px solid rgba(0,0,0,0.1)',
141
+ flex: mode === 'justifyContent' ? '0 0 auto' : undefined,
142
+ ...(stretchOverrides ?? {}),
143
+ }}
144
+ />
145
+ ))}
146
+ </div>
147
+ </div>
148
+ );
149
+ }
150
+
151
+ function resolvePreviewContext(
152
+ mode: LayoutFieldName,
153
+ option: string,
154
+ layoutContext?: LayoutContext,
155
+ ): LayoutContext {
156
+ const fallback: LayoutContext = {
157
+ flexDirection: layoutContext?.flexDirection ?? 'row',
158
+ alignItems: layoutContext?.alignItems ?? 'center',
159
+ justifyContent: layoutContext?.justifyContent ?? 'flex-start',
160
+ };
161
+
162
+ switch (mode) {
163
+ case 'flexDirection':
164
+ return {
165
+ flexDirection: option as LayoutContext['flexDirection'],
166
+ alignItems: fallback.alignItems,
167
+ justifyContent: fallback.justifyContent,
168
+ };
169
+ case 'alignItems':
170
+ return {
171
+ flexDirection: fallback.flexDirection,
172
+ alignItems: option as LayoutContext['alignItems'],
173
+ justifyContent: fallback.justifyContent,
174
+ };
175
+ case 'justifyContent':
176
+ return {
177
+ flexDirection: fallback.flexDirection,
178
+ alignItems: fallback.alignItems,
179
+ justifyContent: option as LayoutContext['justifyContent'],
180
+ };
181
+ default:
182
+ return fallback;
183
+ }
184
+ }
185
+
186
+ function parseNumeric(value?: string | number | null) {
187
+ if (value === null || value === undefined) {
188
+ return undefined;
189
+ }
190
+ if (typeof value === 'number') {
191
+ return value;
192
+ }
193
+ const parsed = Number.parseFloat(value);
194
+ return Number.isNaN(parsed) ? undefined : parsed;
195
+ }
196
+
197
+ function formatLayoutLabel(option: string) {
198
+ return option
199
+ .replace(/[-_]/g, ' ')
200
+ .replace(/\s+/g, ' ')
201
+ .replace(/^\w|\s\w/g, (char) => char.toUpperCase());
202
+ }
@@ -0,0 +1,184 @@
1
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
+
3
+ type SizeUnit = '' | 'vs' | 's' | 'f' | '%';
4
+ type SizeSelectUnit = SizeUnit | 'auto';
5
+
6
+ export type PreferredScale = 'vs' | 's' | 'f' | '%';
7
+
8
+ export function toPreferredScale(value: unknown): PreferredScale | undefined {
9
+ if (value === 'vs' || value === 's' || value === 'f' || value === '%') {
10
+ return value;
11
+ }
12
+ if (typeof value !== 'string') return undefined;
13
+ const normalized = value.trim().toLowerCase();
14
+ return normalized === 'vs' ||
15
+ normalized === 's' ||
16
+ normalized === 'f' ||
17
+ normalized === '%'
18
+ ? (normalized as PreferredScale)
19
+ : undefined;
20
+ }
21
+
22
+ export type SizeFieldProps = {
23
+ value: unknown;
24
+ onChange: (val: unknown) => void;
25
+ preferredScale?: PreferredScale;
26
+ fieldName: string;
27
+ };
28
+
29
+ function parseSizeValue(value: unknown): { amount: string; unit: SizeUnit } {
30
+ const empty = { amount: '', unit: '' as SizeUnit };
31
+ if (typeof value === 'number' && Number.isFinite(value)) {
32
+ return { amount: String(value), unit: '' };
33
+ }
34
+ if (typeof value !== 'string') return empty;
35
+ const trimmed = value.trim();
36
+ if (!trimmed) return empty;
37
+ if (trimmed.endsWith('%')) {
38
+ return { amount: trimmed.slice(0, -1), unit: '%' };
39
+ }
40
+ const lower = trimmed.toLowerCase();
41
+ if (lower.endsWith('@vs'))
42
+ return { amount: trimmed.slice(0, -3), unit: 'vs' };
43
+ if (lower.endsWith('vs')) return { amount: trimmed.slice(0, -2), unit: 'vs' };
44
+ if (lower.endsWith('@fs')) return { amount: trimmed.slice(0, -3), unit: 'f' };
45
+ if (lower.endsWith('@f')) return { amount: trimmed.slice(0, -2), unit: 'f' };
46
+ if (lower.endsWith('fs')) return { amount: trimmed.slice(0, -2), unit: 'f' };
47
+ if (lower.endsWith('f')) return { amount: trimmed.slice(0, -1), unit: 'f' };
48
+ if (lower.endsWith('@s')) return { amount: trimmed.slice(0, -2), unit: 's' };
49
+ if (lower.endsWith('s')) return { amount: trimmed.slice(0, -1), unit: 's' };
50
+ if (lower.endsWith('px')) return { amount: trimmed.slice(0, -2), unit: '' };
51
+ return { amount: trimmed, unit: '' };
52
+ }
53
+
54
+ function composeSizeValue(amount: string, unit: SizeUnit): string | number {
55
+ const trimmed = amount.trim();
56
+ if (unit === '%') {
57
+ return `${trimmed}%`;
58
+ }
59
+ if (unit === '') {
60
+ const numeric = Number(trimmed);
61
+ return Number.isFinite(numeric) ? numeric : trimmed;
62
+ }
63
+ if (unit === 'f') {
64
+ return `${trimmed}@fs`;
65
+ }
66
+ return `${trimmed}@${unit}`;
67
+ }
68
+
69
+ function normalizePreferredScale(
70
+ preferredScale: PreferredScale | undefined,
71
+ fieldName: string,
72
+ ): SizeUnit {
73
+ const fallbackName = fieldName.trim().toLowerCase();
74
+ const fallback: SizeUnit =
75
+ fallbackName.includes('height') ||
76
+ fallbackName.includes('top') ||
77
+ fallbackName.includes('vertical')
78
+ ? 'vs'
79
+ : 's';
80
+ return preferredScale ?? fallback;
81
+ }
82
+
83
+ export function SizeField({
84
+ value,
85
+ onChange,
86
+ preferredScale,
87
+ fieldName,
88
+ }: SizeFieldProps) {
89
+ const parsed = useMemo(() => parseSizeValue(value), [value]);
90
+ const normalizedPreferred = useMemo(
91
+ () => normalizePreferredScale(preferredScale, fieldName),
92
+ [preferredScale, fieldName],
93
+ );
94
+
95
+ const [amount, setAmount] = useState(parsed.amount);
96
+ const [unit, setUnit] = useState<SizeSelectUnit>(() => {
97
+ // Default to "auto" when the stored unit is already the preferred one (or empty)
98
+ // so that "auto" means "use preferredScale" without changing behavior.
99
+ return parsed.unit && parsed.unit !== normalizedPreferred
100
+ ? parsed.unit
101
+ : 'auto';
102
+ });
103
+
104
+ useEffect(() => {
105
+ setAmount(parsed.amount);
106
+
107
+ // Keep "auto" selected whenever value is preferred (or unscaled).
108
+ const nextUnit: SizeSelectUnit =
109
+ parsed.unit && parsed.unit !== normalizedPreferred ? parsed.unit : 'auto';
110
+ setUnit(nextUnit);
111
+ }, [parsed.amount, parsed.unit, normalizedPreferred]);
112
+
113
+ const resolveUnit = useCallback(
114
+ (nextUnit: SizeSelectUnit): SizeUnit =>
115
+ nextUnit === 'auto' ? normalizedPreferred : nextUnit,
116
+ [normalizedPreferred],
117
+ );
118
+
119
+ const emitValue = useCallback(
120
+ (nextAmount: string, nextUnit: SizeSelectUnit) => {
121
+ const trimmed = nextAmount.trim();
122
+ if (!trimmed) {
123
+ onChange(undefined);
124
+ return;
125
+ }
126
+ // If "auto" is selected, persist the preferredScale.
127
+ onChange(composeSizeValue(trimmed, resolveUnit(nextUnit)));
128
+ },
129
+ [onChange, resolveUnit],
130
+ );
131
+
132
+ const handleAmountChange = (e: React.ChangeEvent<HTMLInputElement>) => {
133
+ const nextAmount = e.target.value;
134
+ setAmount(nextAmount);
135
+ if (!nextAmount.trim()) {
136
+ onChange(undefined);
137
+ return;
138
+ }
139
+ emitValue(nextAmount, unit);
140
+ };
141
+
142
+ const handleUnitChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
143
+ const nextUnit = e.target.value as SizeSelectUnit;
144
+ setUnit(nextUnit);
145
+ if (!amount.trim()) return;
146
+ emitValue(amount, nextUnit);
147
+ };
148
+
149
+ const unitPriority: SizeUnit[] = ['vs', 's', 'f', '%'];
150
+ const orderedUnits = [
151
+ normalizedPreferred,
152
+ ...unitPriority.filter((u) => u !== normalizedPreferred),
153
+ ];
154
+
155
+ const unitOptions: Array<{ value: SizeSelectUnit; label: string }> = [
156
+ { value: 'auto', label: 'auto' },
157
+ ...orderedUnits.map((u) => ({
158
+ value: u,
159
+ label: u === normalizedPreferred ? `${u} (preferred)` : u,
160
+ })),
161
+ ];
162
+
163
+ return (
164
+ <div className="attributes-editor__size-field">
165
+ <input
166
+ type="number"
167
+ className="input attributes-editor__size-field-input"
168
+ value={amount}
169
+ onChange={handleAmountChange}
170
+ />
171
+ <select
172
+ className="input attributes-editor__size-field-select"
173
+ value={unit}
174
+ onChange={handleUnitChange}
175
+ >
176
+ {unitOptions.map((opt) => (
177
+ <option key={opt.value} value={opt.value}>
178
+ {opt.label}
179
+ </option>
180
+ ))}
181
+ </select>
182
+ </div>
183
+ );
184
+ }
@@ -0,0 +1,292 @@
1
+ import React, { useState } from 'react';
2
+ import { NodeDefaultAttribute } from '../types/Node';
3
+ import type { ProjectColors } from '../types/Project';
4
+ import { Field } from './Field';
5
+ import { FieldInfoTooltip } from './FieldInfoTooltip';
6
+ import { toPreferredScale } from './SizeField';
7
+ import {
8
+ AttributeMetaMap,
9
+ LayoutContext,
10
+ SchemaEntry,
11
+ isBooleanFieldType,
12
+ } from './types';
13
+
14
+ type SpecialCategorySectionProps = {
15
+ category: string;
16
+ entries: SchemaEntry[];
17
+ attributeMeta?: AttributeMetaMap;
18
+ attributes: NodeDefaultAttribute;
19
+ onAttributeChange: (name: string, value: unknown) => void;
20
+ componentType?: string;
21
+ projectColors?: ProjectColors;
22
+ layoutContext?: LayoutContext;
23
+ viewAttributes?: NodeDefaultAttribute;
24
+ meta?: {
25
+ label?: string;
26
+ description?: string;
27
+ };
28
+ };
29
+
30
+ type BoxFieldSlot = 'top' | 'bottom' | 'left' | 'right';
31
+
32
+ const FIELD_SLOT_MATCHERS: Record<BoxFieldSlot, RegExp> = {
33
+ top: /(^|[-_])(top)$/i,
34
+ bottom: /(^|[-_])(bottom)$/i,
35
+ left: /(^|[-_])(left)$/i,
36
+ right: /(^|[-_])(right)$/i,
37
+ };
38
+
39
+ export function SpecialCategorySection({
40
+ category,
41
+ entries,
42
+ attributeMeta,
43
+ attributes,
44
+ onAttributeChange,
45
+ componentType,
46
+ projectColors,
47
+ layoutContext,
48
+ viewAttributes,
49
+ meta,
50
+ }: SpecialCategorySectionProps) {
51
+ const [showAdvanced, setShowAdvanced] = useState(false);
52
+ const normalizedTitle =
53
+ meta?.label && meta.label.trim().length > 0
54
+ ? meta.label
55
+ : category && category.length > 0
56
+ ? category.charAt(0).toUpperCase() + category.slice(1)
57
+ : 'Special';
58
+ const normalizedDescription = meta?.description;
59
+ const requiresAdvancedToggle =
60
+ category === 'padding' || category === 'margin' || category === 'offset';
61
+
62
+ const shouldUseBoxLayout = requiresAdvancedToggle;
63
+
64
+ const detectFieldSlot = (fieldName: string): BoxFieldSlot | undefined => {
65
+ if (!shouldUseBoxLayout) {
66
+ return undefined;
67
+ }
68
+ const normalized = fieldName
69
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
70
+ .replace(/\s+/g, '-')
71
+ .toLowerCase();
72
+ return (Object.keys(FIELD_SLOT_MATCHERS) as BoxFieldSlot[]).find((slot) =>
73
+ FIELD_SLOT_MATCHERS[slot].test(normalized),
74
+ );
75
+ };
76
+
77
+ const renderFields = () => {
78
+ if (!entries.length) {
79
+ return (
80
+ <p className="special-category-section__placeholder">
81
+ -- not defined --
82
+ </p>
83
+ );
84
+ }
85
+ const fieldsClassNames = [
86
+ 'special-category-section__fields',
87
+ shouldUseBoxLayout ? 'special-category-section__fields--box' : '',
88
+ ]
89
+ .filter(Boolean)
90
+ .join(' ');
91
+ return (
92
+ <div className={fieldsClassNames}>
93
+ {entries.map(({ name, type }) => {
94
+ const label = attributeMeta?.[name]?.label ?? name;
95
+ const description = attributeMeta?.[name]?.description;
96
+ const preferredScale = toPreferredScale(
97
+ attributeMeta?.[name]?.preferedScale,
98
+ );
99
+ const currentValue = (attributes as Record<string, unknown>)[name];
100
+ const isBoolean = isBooleanFieldType(type);
101
+ const fieldSlot = detectFieldSlot(name);
102
+ const wrapperClassNames = [
103
+ 'attributes-editor__field-wrapper',
104
+ 'special-category-section__field',
105
+ isBoolean ? 'attributes-editor__field-wrapper--boolean' : '',
106
+ ]
107
+ .filter(Boolean)
108
+ .join(' ');
109
+ return (
110
+ <FieldInfoTooltip key={name} description={description}>
111
+ <div className={wrapperClassNames} data-field-slot={fieldSlot}>
112
+ {!isBoolean ? (
113
+ <p className="attributes-editor__field-label">{label}</p>
114
+ ) : null}
115
+ <Field
116
+ name={name}
117
+ type={type}
118
+ value={currentValue}
119
+ onChange={(val) => onAttributeChange(name, val)}
120
+ componentType={componentType}
121
+ projectColors={projectColors}
122
+ layoutContext={layoutContext}
123
+ viewAttributes={viewAttributes}
124
+ label={isBoolean ? label : undefined}
125
+ preferredScale={preferredScale}
126
+ />
127
+ </div>
128
+ </FieldInfoTooltip>
129
+ );
130
+ })}
131
+ </div>
132
+ );
133
+ };
134
+
135
+ const renderContent = () => {
136
+ if (!entries.length) {
137
+ return (
138
+ <p className="special-category-section__placeholder">
139
+ -- not defined --
140
+ </p>
141
+ );
142
+ }
143
+
144
+ if (!requiresAdvancedToggle) {
145
+ return renderFields();
146
+ }
147
+
148
+ // Separate directional fields (paddingTop, etc.) from shorthand fields (padding, paddingHorizontal, etc.)
149
+ const boxEntries = entries
150
+ .filter((entry) => detectFieldSlot(entry.name))
151
+ .sort((a, b) => {
152
+ const slotOrder: BoxFieldSlot[] = ['top', 'left', 'right', 'bottom'];
153
+ const slotA = detectFieldSlot(a.name);
154
+ const slotB = detectFieldSlot(b.name);
155
+ const indexA = slotA ? slotOrder.indexOf(slotA) : 999;
156
+ const indexB = slotB ? slotOrder.indexOf(slotB) : 999;
157
+ return indexA - indexB;
158
+ });
159
+ const baseEntries = entries.filter((entry) => !detectFieldSlot(entry.name));
160
+
161
+ if (boxEntries.length === 0) {
162
+ return (
163
+ <p className="special-category-section__placeholder">
164
+ -- not defined --
165
+ </p>
166
+ );
167
+ }
168
+
169
+ // Always show directional fields in box layout
170
+ const boxFieldsJSX = (
171
+ <div className="special-category-section__fields special-category-section__fields--box">
172
+ {boxEntries.map(({ name, type }) => {
173
+ const label = attributeMeta?.[name]?.label ?? name;
174
+ const description = attributeMeta?.[name]?.description;
175
+ const preferredScale = toPreferredScale(
176
+ attributeMeta?.[name]?.preferedScale,
177
+ );
178
+ const currentValue = (attributes as Record<string, unknown>)[name];
179
+ const isBoolean = isBooleanFieldType(type);
180
+ const fieldSlot = detectFieldSlot(name);
181
+ const wrapperClassNames = [
182
+ 'attributes-editor__field-wrapper',
183
+ 'special-category-section__field',
184
+ isBoolean ? 'attributes-editor__field-wrapper--boolean' : '',
185
+ ]
186
+ .filter(Boolean)
187
+ .join(' ');
188
+ return (
189
+ <FieldInfoTooltip key={name} description={description}>
190
+ <div className={wrapperClassNames} data-field-slot={fieldSlot}>
191
+ {!isBoolean ? (
192
+ <p className="attributes-editor__field-label">{label}</p>
193
+ ) : null}
194
+ <Field
195
+ name={name}
196
+ type={type}
197
+ value={currentValue}
198
+ onChange={(val) => onAttributeChange(name, val)}
199
+ componentType={componentType}
200
+ projectColors={projectColors}
201
+ layoutContext={layoutContext}
202
+ viewAttributes={viewAttributes}
203
+ label={isBoolean ? label : undefined}
204
+ preferredScale={preferredScale}
205
+ />
206
+ </div>
207
+ </FieldInfoTooltip>
208
+ );
209
+ })}
210
+ </div>
211
+ );
212
+
213
+ // Show shorthand fields only when advanced is toggled
214
+ const baseFieldsJSX =
215
+ showAdvanced && baseEntries.length > 0 ? (
216
+ <div className="special-category-section__fields">
217
+ {baseEntries.map(({ name, type }) => {
218
+ const label = attributeMeta?.[name]?.label ?? name;
219
+ const description = attributeMeta?.[name]?.description;
220
+ const preferredScale = toPreferredScale(
221
+ attributeMeta?.[name]?.preferedScale,
222
+ );
223
+ const currentValue = (attributes as Record<string, unknown>)[name];
224
+ const isBoolean = isBooleanFieldType(type);
225
+ const wrapperClassNames = [
226
+ 'attributes-editor__field-wrapper',
227
+ 'special-category-section__field',
228
+ isBoolean ? 'attributes-editor__field-wrapper--boolean' : '',
229
+ ]
230
+ .filter(Boolean)
231
+ .join(' ');
232
+ return (
233
+ <FieldInfoTooltip key={name} description={description}>
234
+ <div className={wrapperClassNames}>
235
+ {!isBoolean ? (
236
+ <p className="attributes-editor__field-label">{label}</p>
237
+ ) : null}
238
+ <Field
239
+ name={name}
240
+ type={type}
241
+ value={currentValue}
242
+ onChange={(val) => onAttributeChange(name, val)}
243
+ componentType={componentType}
244
+ projectColors={projectColors}
245
+ layoutContext={layoutContext}
246
+ viewAttributes={viewAttributes}
247
+ label={isBoolean ? label : undefined}
248
+ preferredScale={preferredScale}
249
+ />
250
+ </div>
251
+ </FieldInfoTooltip>
252
+ );
253
+ })}
254
+ </div>
255
+ ) : null;
256
+
257
+ return (
258
+ <>
259
+ {boxFieldsJSX}
260
+ {baseFieldsJSX}
261
+ </>
262
+ );
263
+ };
264
+
265
+ // Check if we have shorthand fields to show the toggle
266
+ const baseEntries = entries.filter((entry) => !detectFieldSlot(entry.name));
267
+ const shouldShowToggle = requiresAdvancedToggle && baseEntries.length > 0;
268
+
269
+ return (
270
+ <section className="special-category-section">
271
+ <div className="special-category-section__header">
272
+ <p className="special-category-section__title">{normalizedTitle}</p>
273
+ {shouldShowToggle ? (
274
+ <button
275
+ type="button"
276
+ onClick={() => setShowAdvanced((prev) => !prev)}
277
+ className="special-category-section__toggle"
278
+ data-active={showAdvanced}
279
+ >
280
+ {showAdvanced ? 'Show less' : 'Show more'}
281
+ </button>
282
+ ) : null}
283
+ </div>
284
+ {normalizedDescription ? (
285
+ <p className="special-category-section__description">
286
+ {normalizedDescription}
287
+ </p>
288
+ ) : null}
289
+ {renderContent()}
290
+ </section>
291
+ );
292
+ }
@@ -0,0 +1,30 @@
1
+ import type {
2
+ AlignItemsOptionType,
3
+ FlexDirectionOptionType,
4
+ JustifyContentOptionType,
5
+ } from '../build-components/View/ViewProps.generated';
6
+ import { getAttributeMeta } from '../utils/patterns';
7
+
8
+ export type SchemaEntry = {
9
+ name: string;
10
+ type: string | string[];
11
+ };
12
+
13
+ export type AttributeMetaMap = ReturnType<typeof getAttributeMeta>;
14
+
15
+ export type LayoutFieldName = 'flexDirection' | 'alignItems' | 'justifyContent';
16
+
17
+ export type LayoutContext = {
18
+ flexDirection?: FlexDirectionOptionType;
19
+ alignItems?: AlignItemsOptionType;
20
+ justifyContent?: JustifyContentOptionType;
21
+ };
22
+
23
+ const BOOLEAN_ALIASES = new Set(['bool', 'boolean']);
24
+
25
+ export function isBooleanFieldType(type: string | string[]): boolean {
26
+ if (Array.isArray(type)) return false;
27
+ if (typeof type !== 'string') return false;
28
+ const normalized = type.trim().toLowerCase();
29
+ return BOOLEAN_ALIASES.has(normalized);
30
+ }