@developer_tribe/react-builder 1.0.8 → 1.0.9

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 (216) hide show
  1. package/dist/build-components/BIcon/BIconProps.generated.d.ts +3 -0
  2. package/dist/build-components/BackgroundImage/BackgroundImageProps.generated.d.ts +1 -0
  3. package/dist/build-components/Button/ButtonProps.generated.d.ts +1 -0
  4. package/dist/build-components/Carousel/CarouselProps.generated.d.ts +5 -0
  5. package/dist/build-components/CarouselButtons/CarouselButtonsProps.generated.d.ts +1 -0
  6. package/dist/build-components/CarouselDots/CarouselDotsProps.generated.d.ts +1 -0
  7. package/dist/build-components/CarouselItem/CarouselItemProps.generated.d.ts +1 -0
  8. package/dist/build-components/CarouselProvider/CarouselProviderProps.generated.d.ts +1 -0
  9. package/dist/build-components/Image/ImageProps.generated.d.ts +1 -0
  10. package/dist/build-components/Main/MainProps.generated.d.ts +1 -1
  11. package/dist/build-components/Onboard/OnboardProps.generated.d.ts +1 -0
  12. package/dist/build-components/OnboardButton/OnboardButtonProps.generated.d.ts +1 -0
  13. package/dist/build-components/OnboardButtons/OnboardButtonsProps.generated.d.ts +1 -0
  14. package/dist/build-components/OnboardDot/OnboardDotProps.generated.d.ts +1 -0
  15. package/dist/build-components/OnboardFooter/OnboardFooterProps.generated.d.ts +3 -0
  16. package/dist/build-components/OnboardImage/OnboardImageProps.generated.d.ts +1 -0
  17. package/dist/build-components/OnboardItem/OnboardItemProps.generated.d.ts +1 -0
  18. package/dist/build-components/OnboardProvider/OnboardProviderProps.generated.d.ts +3 -0
  19. package/dist/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.d.ts +3 -0
  20. package/dist/build-components/OnboardTitle/OnboardTitleProps.generated.d.ts +3 -0
  21. package/dist/build-components/PaywallBackground/PaywallBackgroundProps.generated.d.ts +1 -1
  22. package/dist/build-components/PaywallCloseButton/PaywallCloseButtonProps.generated.d.ts +3 -1
  23. package/dist/build-components/PaywallOptions/PaywallOptionsProps.generated.d.ts +1 -1
  24. package/dist/build-components/PaywallProvider/PaywallContext.d.ts +12 -0
  25. package/dist/build-components/PaywallProvider/PaywallProviderProps.generated.d.ts +1 -1
  26. package/dist/build-components/PaywallSubscribeButton/PaywallSubscribeButtonProps.generated.d.ts +1 -0
  27. package/dist/build-components/RadioButton/RadioButtonProps.generated.d.ts +1 -1
  28. package/dist/build-components/Text/TextProps.generated.d.ts +3 -0
  29. package/dist/build-components/View/ViewProps.generated.d.ts +1 -0
  30. package/dist/build-components/patterns.generated.d.ts +372 -374
  31. package/dist/components/BuilderProvider.d.ts +2 -0
  32. package/dist/components/ParamsProvider.d.ts +5 -0
  33. package/dist/components/RenderErrorBoundary.d.ts +28 -0
  34. package/dist/hooks/useSyncHtmlThemeClass.d.ts +7 -0
  35. package/dist/index.cjs.js +5 -5
  36. package/dist/index.cjs.js.map +1 -1
  37. package/dist/index.d.ts +2 -0
  38. package/dist/index.esm.js +3 -3
  39. package/dist/index.esm.js.map +1 -1
  40. package/dist/index.native.cjs.js +4 -4
  41. package/dist/index.native.cjs.js.map +1 -1
  42. package/dist/index.native.d.ts +1 -0
  43. package/dist/index.native.esm.js +4 -4
  44. package/dist/index.native.esm.js.map +1 -1
  45. package/dist/migrations/migratePipe.d.ts +14 -0
  46. package/dist/migrations/migrations/1.1.0_normalize_style_attributes.d.ts +2 -0
  47. package/dist/migrations/semver.d.ts +8 -0
  48. package/dist/migrations/types.d.ts +8 -0
  49. package/dist/mockOS/components/SubscriptionModal.d.ts +7 -0
  50. package/dist/mockOS/context/MockOSContextBase.d.ts +1 -0
  51. package/dist/mockOS/hooks/useMockIap.d.ts +3 -0
  52. package/dist/mockOS/index.d.ts +4 -0
  53. package/dist/mockOS/managers/mockOSIapManager.d.ts +6 -0
  54. package/dist/mockOS/managers/subscriptionManager.d.ts +10 -0
  55. package/dist/pages/ProjectDebug.d.ts +14 -0
  56. package/dist/pages/ProjectMigrationPage.d.ts +23 -0
  57. package/dist/pages/ProjectValidationPage.d.ts +15 -0
  58. package/dist/styles.css +1 -1
  59. package/dist/types/Device.d.ts +5 -0
  60. package/dist/utils/__special_exceptions.d.ts +7 -0
  61. package/dist/utils/getImage.d.ts +23 -0
  62. package/dist/utils/pasteNode.d.ts +15 -0
  63. package/dist/utils/patterns.d.ts +1 -2
  64. package/package.json +6 -2
  65. package/scripts/migrate-patterns-to-v2.mjs +131 -0
  66. package/scripts/migrate-samples-to-current.ts +79 -0
  67. package/scripts/prebuild/utils/createGeneratedProps.js +4 -5
  68. package/scripts/prebuild/utils/validateAllComponentsOrThrow.js +32 -21
  69. package/scripts/prebuild/utils/validatePatternJson.js +12 -10
  70. package/src/.DS_Store +0 -0
  71. package/src/AttributesEditor.tsx +41 -11
  72. package/src/RenderPage.tsx +55 -0
  73. package/src/assets/.DS_Store +0 -0
  74. package/src/assets/devices.json +91 -0
  75. package/src/assets/samples/carousel-sample.json +141 -29
  76. package/src/assets/samples/getSamples.ts +9 -0
  77. package/src/assets/samples/paywall-1.json +119 -71
  78. package/src/assets/samples/simple-1.json +28 -16
  79. package/src/assets/samples/simple-2.json +157 -82
  80. package/src/assets/samples/unmigrated-builder1.json +42 -0
  81. package/src/assets/samples/unvalidated-builder1.json +49 -0
  82. package/src/assets/samples/unvalidated-crash1.json +19 -0
  83. package/src/assets/samples/unvalidated-crashcomponent1.json +16 -0
  84. package/src/assets/samples/vpn-onboard-1.json +91 -51
  85. package/src/assets/samples/vpn-onboard-2.json +318 -278
  86. package/src/assets/samples/vpn-onboard-3.json +286 -252
  87. package/src/assets/samples/vpn-onboard-4.json +286 -252
  88. package/src/assets/samples/vpn-onboard-5.json +434 -374
  89. package/src/assets/samples/vpn-onboard-6.json +290 -250
  90. package/src/attributes-editor/Field.tsx +1 -1
  91. package/src/attributes-editor/LayoutPreviewPicker.tsx +5 -2
  92. package/src/build-components/BIcon/BIconProps.generated.ts +3 -0
  93. package/src/build-components/BIcon/pattern.json +12 -9
  94. package/src/build-components/BackgroundImage/BackgroundImage.tsx +3 -1
  95. package/src/build-components/BackgroundImage/BackgroundImageProps.generated.ts +1 -0
  96. package/src/build-components/BackgroundImage/pattern.json +25 -16
  97. package/src/build-components/Button/Button.tsx +26 -3
  98. package/src/build-components/Button/ButtonProps.generated.ts +1 -0
  99. package/src/build-components/Button/pattern.json +10 -6
  100. package/src/build-components/Carousel/CarouselProps.generated.ts +5 -0
  101. package/src/build-components/Carousel/pattern.json +19 -8
  102. package/src/build-components/CarouselButtons/CarouselButtonsProps.generated.ts +1 -0
  103. package/src/build-components/CarouselButtons/pattern.json +11 -5
  104. package/src/build-components/CarouselDots/CarouselDotsProps.generated.ts +1 -0
  105. package/src/build-components/CarouselDots/pattern.json +5 -4
  106. package/src/build-components/CarouselItem/CarouselItemProps.generated.ts +1 -0
  107. package/src/build-components/CarouselItem/pattern.json +5 -4
  108. package/src/build-components/CarouselProvider/CarouselProvider.tsx +44 -2
  109. package/src/build-components/CarouselProvider/CarouselProviderProps.generated.ts +1 -0
  110. package/src/build-components/Image/Image.tsx +2 -1
  111. package/src/build-components/Image/ImageProps.generated.ts +1 -0
  112. package/src/build-components/Image/pattern.json +11 -5
  113. package/src/build-components/Main/MainProps.generated.ts +1 -1
  114. package/src/build-components/Main/pattern.json +12 -9
  115. package/src/build-components/Onboard/OnboardProps.generated.ts +1 -0
  116. package/src/build-components/Onboard/pattern.json +14 -9
  117. package/src/build-components/OnboardButton/OnboardButtonProps.generated.ts +1 -0
  118. package/src/build-components/OnboardButton/pattern.json +5 -4
  119. package/src/build-components/OnboardButtons/OnboardButtonsProps.generated.ts +1 -0
  120. package/src/build-components/OnboardButtons/pattern.json +5 -4
  121. package/src/build-components/OnboardDot/OnboardDotProps.generated.ts +1 -0
  122. package/src/build-components/OnboardDot/pattern.json +5 -4
  123. package/src/build-components/OnboardFooter/OnboardFooterProps.generated.ts +3 -0
  124. package/src/build-components/OnboardFooter/pattern.json +8 -5
  125. package/src/build-components/OnboardImage/OnboardImageProps.generated.ts +1 -0
  126. package/src/build-components/OnboardImage/pattern.json +7 -4
  127. package/src/build-components/OnboardItem/OnboardItemProps.generated.ts +1 -0
  128. package/src/build-components/OnboardItem/pattern.json +18 -9
  129. package/src/build-components/OnboardProvider/OnboardProviderProps.generated.ts +3 -0
  130. package/src/build-components/OnboardProvider/pattern.json +21 -6
  131. package/src/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.ts +3 -0
  132. package/src/build-components/OnboardSubtitle/pattern.json +10 -6
  133. package/src/build-components/OnboardTitle/OnboardTitleProps.generated.ts +3 -0
  134. package/src/build-components/OnboardTitle/pattern.json +11 -7
  135. package/src/build-components/PaywallBackground/PaywallBackgroundProps.generated.ts +1 -1
  136. package/src/build-components/PaywallBackground/pattern.json +5 -4
  137. package/src/build-components/PaywallCloseButton/PaywallCloseButton.tsx +6 -1
  138. package/src/build-components/PaywallCloseButton/PaywallCloseButtonProps.generated.ts +3 -1
  139. package/src/build-components/PaywallCloseButton/pattern.json +15 -12
  140. package/src/build-components/PaywallOptions/PaywallOptionButton.tsx +0 -1
  141. package/src/build-components/PaywallOptions/PaywallOptions.tsx +3 -2
  142. package/src/build-components/PaywallOptions/PaywallOptionsProps.generated.ts +1 -1
  143. package/src/build-components/PaywallOptions/pattern.json +14 -11
  144. package/src/build-components/PaywallProvider/PaywallContext.ts +25 -0
  145. package/src/build-components/PaywallProvider/PaywallProvider.tsx +102 -5
  146. package/src/build-components/PaywallProvider/PaywallProviderProps.generated.ts +1 -1
  147. package/src/build-components/PaywallProvider/pattern.json +11 -8
  148. package/src/build-components/PaywallSubscribeButton/PaywallSubscribeButton.tsx +7 -0
  149. package/src/build-components/PaywallSubscribeButton/PaywallSubscribeButtonProps.generated.ts +1 -0
  150. package/src/build-components/PaywallSubscribeButton/pattern.json +16 -13
  151. package/src/build-components/RadioButton/RadioButtonProps.generated.ts +1 -1
  152. package/src/build-components/RadioButton/pattern.json +5 -4
  153. package/src/build-components/Text/Text.tsx +107 -4
  154. package/src/build-components/Text/TextProps.generated.ts +3 -0
  155. package/src/build-components/Text/pattern.json +19 -4
  156. package/src/build-components/View/ViewProps.generated.ts +1 -0
  157. package/src/build-components/View/pattern.json +28 -13
  158. package/src/build-components/other.tsx +15 -0
  159. package/src/build-components/patterns.generated.ts +340 -235
  160. package/src/build-components/useNode.ts +22 -3
  161. package/src/components/Builder.tsx +20 -6
  162. package/src/components/BuilderButton.tsx +75 -38
  163. package/src/components/BuilderProvider.tsx +22 -2
  164. package/src/components/DeviceButton.tsx +12 -5
  165. package/src/components/EditorHeader.tsx +296 -38
  166. package/src/components/ParamsProvider.tsx +7 -0
  167. package/src/components/RenderErrorBoundary.tsx +200 -0
  168. package/src/hooks/useParams.ts +5 -1
  169. package/src/hooks/useSyncHtmlThemeClass.ts +19 -0
  170. package/src/index.native.ts +7 -0
  171. package/src/index.ts +8 -0
  172. package/src/migrations/migratePipe.ts +59 -0
  173. package/src/migrations/migrations/1.1.0_normalize_style_attributes.ts +80 -0
  174. package/src/migrations/semver.ts +24 -0
  175. package/src/migrations/types.ts +9 -0
  176. package/src/mockOS/components/PermissionModal.tsx +3 -2
  177. package/src/mockOS/components/SubscriptionModal.tsx +400 -0
  178. package/src/mockOS/context/MockOSContext.tsx +61 -10
  179. package/src/mockOS/context/MockOSContextBase.ts +1 -0
  180. package/src/mockOS/hooks/useMockIap.ts +11 -0
  181. package/src/mockOS/index.ts +7 -0
  182. package/src/mockOS/managers/mockOSIapManager.ts +10 -0
  183. package/src/mockOS/managers/subscriptionManager.ts +36 -0
  184. package/src/modals/IconPickerModal.tsx +1 -1
  185. package/src/pages/ProjectDebug.tsx +331 -0
  186. package/src/pages/ProjectMigrationPage.tsx +92 -0
  187. package/src/pages/ProjectPage.tsx +313 -161
  188. package/src/pages/ProjectValidationPage.tsx +54 -0
  189. package/src/styles/base/_global.scss +58 -11
  190. package/src/styles/components/_attributes-editor.scss +1 -1
  191. package/src/styles/components/_bottom-bar.scss +7 -4
  192. package/src/styles/components/_editor-shell.scss +126 -4
  193. package/src/styles/components/_mockos-router.scss +3 -2
  194. package/src/styles/components/_ui-components.scss +10 -5
  195. package/src/styles/foundation/_colors.scss +78 -11
  196. package/src/styles/foundation/_mixins.scss +4 -1
  197. package/src/styles/foundation/_sizes.scss +4 -2
  198. package/src/styles/index.scss +1 -0
  199. package/src/styles/layout/_builder.scss +61 -0
  200. package/src/styles/layout/_project-validation.scss +214 -0
  201. package/src/styles/modals/_add-component.scss +4 -2
  202. package/src/styles/modals/_color-modal.scss +4 -2
  203. package/src/styles/modals/_modal-shell.scss +3 -1
  204. package/src/types/Device.ts +5 -0
  205. package/src/utils/__special_exceptions.ts +88 -0
  206. package/src/utils/analyseNode.ts +8 -2
  207. package/src/utils/analyseNodeByPatterns.ts +43 -9
  208. package/src/utils/extractTextStyle.ts +19 -6
  209. package/src/utils/extractViewStyle.ts +68 -59
  210. package/src/utils/getImage.ts +76 -0
  211. package/src/utils/novaToJson.ts +2 -1
  212. package/src/utils/pasteNode.ts +172 -0
  213. package/src/utils/patterns.ts +4 -3
  214. package/dist/android.svg +0 -43
  215. package/dist/apple.svg +0 -16
  216. package/dist/background.jpg +0 -0
@@ -44,12 +44,14 @@ body,
44
44
  border-color 0.2s ease,
45
45
  transform 0.1s ease,
46
46
  box-shadow 0.2s ease;
47
- box-shadow: 0 1px 2px hsl(var(--foreground, 220.9 39.3% 11%) / 0.04);
47
+ box-shadow: 0 1px 2px
48
+ hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.04);
48
49
 
49
50
  &:hover {
50
51
  border-color: colors.$mutedTextColor;
51
52
  transform: translateY(-1px);
52
- box-shadow: 0 6px 16px hsl(var(--foreground, 220.9 39.3% 11%) / 0.1);
53
+ box-shadow: 0 6px 16px
54
+ hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.1);
53
55
  }
54
56
  }
55
57
 
@@ -101,8 +103,10 @@ body,
101
103
  align-self: center;
102
104
  border: 1px solid colors.$borderColor;
103
105
  box-shadow:
104
- 0 18px 50px hsl(var(--foreground, 220.9 39.3% 11%) / 0.16),
105
- 0 6px 16px hsl(var(--foreground, 220.9 39.3% 11%) / 0.1);
106
+ 0 18px 50px
107
+ hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.16),
108
+ 0 6px 16px
109
+ hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.1);
106
110
  overflow: hidden;
107
111
  .scroll-container {
108
112
  /* Mobile-like scrollbar styling */
@@ -116,13 +120,18 @@ body,
116
120
  }
117
121
 
118
122
  &::-webkit-scrollbar-thumb {
119
- background: hsl(var(--foreground, 220.9 39.3% 11%) / 0.25);
123
+ background: hsl(
124
+ var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.25
125
+ );
120
126
  border-radius: 8px;
121
127
  }
122
128
 
123
129
  /* For Firefox */
124
130
  scrollbar-width: thin;
125
- scrollbar-color: hsl(var(--foreground, 220.9 39.3% 11%) / 0.25) transparent;
131
+ scrollbar-color: hsl(
132
+ var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.25
133
+ )
134
+ transparent;
126
135
  }
127
136
  }
128
137
 
@@ -276,7 +285,8 @@ body,
276
285
  background: colors.$textColor;
277
286
  color: colors.$surfaceColor;
278
287
  border-color: colors.$textColor;
279
- box-shadow: 0 6px 16px hsl(var(--foreground, 220.9 39.3% 11%) / 0.15);
288
+ box-shadow: 0 6px 16px
289
+ hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.15);
280
290
  }
281
291
 
282
292
  .mobile-panel-toggle__icon {
@@ -301,7 +311,9 @@ body,
301
311
  right: sizes.$spaceCozy;
302
312
  border: none;
303
313
  border-radius: sizes.$radiusRounded;
304
- background: hsl(var(--foreground, 220.9 39.3% 11%) / 0.7);
314
+ background: hsl(
315
+ var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.7
316
+ );
305
317
  color: colors.$surfaceColor;
306
318
  padding: sizes.$spaceSnug sizes.$spaceComfy;
307
319
  font-weight: 600;
@@ -330,7 +342,8 @@ body,
330
342
  width: 100%;
331
343
  height: 100%;
332
344
  background: colors.$canvasColor;
333
- box-shadow: 0 25px 60px hsl(var(--foreground, 220.9 39.3% 11%) / 0.15);
345
+ box-shadow: 0 25px 60px
346
+ hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.15);
334
347
  transition:
335
348
  transform 0.3s ease,
336
349
  opacity 0.3s ease;
@@ -375,7 +388,9 @@ body,
375
388
  display: block;
376
389
  position: absolute;
377
390
  inset: 0;
378
- background: hsl(var(--foreground, 220.9 39.3% 11%) / 0.35);
391
+ background: hsl(
392
+ var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.35
393
+ );
379
394
  border: none;
380
395
  padding: 0;
381
396
  margin: 0;
@@ -409,7 +424,7 @@ body,
409
424
  align-items: center;
410
425
  justify-content: center;
411
426
  pointer-events: none;
412
- background: hsl(var(--card, 0 0% 100%) / 0.55);
427
+ background: hsl(var(--card, var(--rb-card, 0 0% 100%)) / 0.55);
413
428
  backdrop-filter: blur(1px);
414
429
  }
415
430
 
@@ -420,3 +435,35 @@ body,
420
435
  max-width: 360px;
421
436
  opacity: 0.95;
422
437
  }
438
+
439
+ /* RenderPage empty preview overlay */
440
+ .rb-empty-preview {
441
+ position: absolute;
442
+ inset: 0;
443
+ z-index: 2;
444
+ display: flex;
445
+ align-items: center;
446
+ justify-content: center;
447
+ pointer-events: none;
448
+ }
449
+
450
+ .rb-empty-preview__card {
451
+ width: min(320px, calc(100% - 32px));
452
+ padding: 14px 16px;
453
+ border-radius: sizes.$radiusRounded;
454
+ border: 1px dashed colors.$borderColor;
455
+ background: hsl(var(--card, var(--rb-card, 0 0% 100%)) / 0.72);
456
+ backdrop-filter: blur(1px);
457
+ text-align: center;
458
+ }
459
+
460
+ .rb-empty-preview__title {
461
+ font-weight: 700;
462
+ color: colors.$textColor;
463
+ margin-bottom: 4px;
464
+ }
465
+
466
+ .rb-empty-preview__hint {
467
+ font-size: 13px;
468
+ color: colors.$mutedTextColor;
469
+ }
@@ -177,7 +177,7 @@
177
177
 
178
178
  &__trigger:focus-visible {
179
179
  outline: sizes.$outlineWidthFocus solid
180
- hsl(var(--foreground, 220.9 39.3% 11%) / 0.4);
180
+ hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.4);
181
181
  outline-offset: sizes.$outlineWidthFocus;
182
182
  }
183
183
 
@@ -3,7 +3,7 @@
3
3
  .rb-bottom-bar {
4
4
  position: fixed;
5
5
  left: 50%;
6
- transform: translateX(-66%);
6
+ transform: translateX(-76%);
7
7
  bottom: 10px;
8
8
  z-index: 200;
9
9
 
@@ -22,7 +22,8 @@
22
22
  gap: 10px;
23
23
 
24
24
  border: 1px solid colors.$borderColor;
25
- box-shadow: 0 8px 20px hsl(var(--foreground, 220.9 39.3% 11%) / 0.08);
25
+ box-shadow: 0 8px 20px
26
+ hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.08);
26
27
  }
27
28
 
28
29
  .rb-bottom-bar__button {
@@ -43,7 +44,8 @@
43
44
  color: colors.$accentColor;
44
45
  background: colors.$accentColor; /* Fallback */
45
46
  background: color-mix(in srgb, #{colors.$accentColor}, transparent 92%);
46
- box-shadow: 0 0 10px hsl(var(--primary, 221.2 83.2% 53.3%) / 0.18);
47
+ box-shadow: 0 0 10px
48
+ hsl(var(--primary, var(--rb-primary, 221.2 83.2% 53.3%)) / 0.18);
47
49
  }
48
50
 
49
51
  /* border between each tool button */
@@ -90,7 +92,8 @@
90
92
 
91
93
  .rb-bottom-bar__lang.is-active {
92
94
  color: colors.$accentColor;
93
- text-shadow: 0 0 12px hsl(var(--primary, 221.2 83.2% 53.3%) / 0.25);
95
+ text-shadow: 0 0 12px
96
+ hsl(var(--primary, var(--rb-primary, 221.2 83.2% 53.3%)) / 0.25);
94
97
  }
95
98
 
96
99
  /* border between each language button */
@@ -109,6 +109,123 @@
109
109
  gap: 8px;
110
110
  }
111
111
 
112
+ .editor-actions-dropdown {
113
+ position: relative;
114
+ display: inline-flex;
115
+ align-items: center;
116
+ }
117
+
118
+ .editor-actions-dropdown__trigger {
119
+ min-width: auto;
120
+ gap: 8px;
121
+ }
122
+
123
+ .editor-actions-dropdown__caret {
124
+ font-size: 16px;
125
+ line-height: 1;
126
+ opacity: 0.8;
127
+ }
128
+
129
+ .editor-actions-dropdown__menu {
130
+ position: absolute;
131
+ top: calc(100% + 6px);
132
+ right: 0;
133
+ z-index: 20;
134
+ min-width: 220px;
135
+ padding: 6px;
136
+ margin: 0;
137
+ list-style: none;
138
+ background: colors.$surfaceColor;
139
+ border: 1px solid colors.$borderColor;
140
+ border-radius: 10px;
141
+ box-shadow: 0 10px 30px hsl(0 0% 0% / 0.18);
142
+ }
143
+
144
+ .editor-actions-dropdown__submenu-root {
145
+ position: relative;
146
+ }
147
+
148
+ .editor-actions-dropdown__submenu-root::after {
149
+ /* "Hover bridge" so moving into the left submenu doesn't close the menu */
150
+ content: '';
151
+ position: absolute;
152
+ top: 0;
153
+ right: 100%;
154
+ width: 12px;
155
+ height: 100%;
156
+ }
157
+
158
+ .editor-actions-dropdown__submenu {
159
+ display: none;
160
+ position: absolute;
161
+ top: 0;
162
+ right: 100%; /* open to the left (no gap) */
163
+ z-index: 21;
164
+ min-width: 240px;
165
+ max-height: 320px;
166
+ overflow: auto;
167
+ padding: 6px;
168
+ margin: 0;
169
+ list-style: none;
170
+ background: colors.$surfaceColor;
171
+ border: 1px solid colors.$borderColor;
172
+ border-radius: 10px;
173
+ box-shadow: 0 10px 30px hsl(0 0% 0% / 0.18);
174
+ }
175
+
176
+ .editor-actions-dropdown__submenu-root:hover
177
+ > .editor-actions-dropdown__submenu,
178
+ .editor-actions-dropdown__submenu-root:focus-within
179
+ > .editor-actions-dropdown__submenu {
180
+ display: block;
181
+ }
182
+
183
+ .editor-actions-dropdown__submenu-caret {
184
+ margin-left: auto;
185
+ font-size: 14px;
186
+ line-height: 1;
187
+ opacity: 0.7;
188
+ }
189
+
190
+ .editor-actions-dropdown__item {
191
+ width: 100%;
192
+ display: flex;
193
+ align-items: center;
194
+ justify-content: flex-start;
195
+ height: 36px;
196
+ padding: 0 10px;
197
+ border: 1px solid transparent;
198
+ border-radius: 8px;
199
+ background: transparent;
200
+ color: colors.$textColor;
201
+ cursor: pointer;
202
+ font-size: 12px;
203
+ font-weight: 600;
204
+ text-align: left;
205
+ }
206
+
207
+ .editor-actions-dropdown__item--compact {
208
+ height: 32px;
209
+ font-weight: 500;
210
+ }
211
+
212
+ .editor-actions-dropdown__item:hover {
213
+ background: colors.$canvasColor;
214
+ border-color: hsl(
215
+ var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.12
216
+ );
217
+ }
218
+
219
+ .editor-actions-dropdown__item:disabled {
220
+ opacity: 0.5;
221
+ cursor: default;
222
+ }
223
+
224
+ .editor-actions-dropdown__item:focus-visible {
225
+ outline: 2px solid colors.$accentColor;
226
+ outline-offset: 2px;
227
+ }
228
+
112
229
  .editor-button {
113
230
  display: inline-flex;
114
231
  align-items: center;
@@ -130,14 +247,19 @@
130
247
  font-size: 12px;
131
248
  line-height: 1.2;
132
249
  border-radius: 999px;
133
- background: hsl(var(--card, 0 0% 100%) / 0.95);
134
- border-color: hsl(var(--foreground, 220.9 39.3% 11%) / 0.15);
135
- box-shadow: 0 2px 4px hsl(var(--foreground, 220.9 39.3% 11%) / 0.08);
250
+ background: hsl(var(--card, var(--rb-card, 0 0% 100%)) / 0.95);
251
+ border-color: hsl(
252
+ var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.15
253
+ );
254
+ box-shadow: 0 2px 4px
255
+ hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.08);
136
256
  }
137
257
 
138
258
  .debug-button:hover {
139
259
  background: colors.$surfaceColor;
140
- border-color: hsl(var(--foreground, 220.9 39.3% 11%) / 0.3);
260
+ border-color: hsl(
261
+ var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.3
262
+ );
141
263
  }
142
264
 
143
265
  .editor-button:disabled {
@@ -109,7 +109,7 @@
109
109
  transition: background-color 0.2s;
110
110
 
111
111
  &:hover {
112
- background-color: hsl(var(--card, 0 0% 100%) / 0.1);
112
+ background-color: hsl(var(--card, var(--rb-card, 0 0% 100%)) / 0.1);
113
113
  }
114
114
 
115
115
  &:active {
@@ -122,7 +122,8 @@
122
122
  height: 60px;
123
123
  border-radius: 13px;
124
124
  overflow: hidden;
125
- box-shadow: 0 2px 8px hsl(var(--foreground, 220.9 39.3% 11%) / 0.3);
125
+ box-shadow: 0 2px 8px
126
+ hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.3);
126
127
 
127
128
  svg {
128
129
  width: 100%;
@@ -42,7 +42,8 @@
42
42
 
43
43
  &:hover {
44
44
  background: colors.$canvasColor;
45
- box-shadow: 0 6px 16px hsl(var(--foreground, 220.9 39.3% 11%) / 0.06);
45
+ box-shadow: 0 6px 16px
46
+ hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.06);
46
47
  }
47
48
  }
48
49
 
@@ -64,7 +65,8 @@
64
65
 
65
66
  &:focus {
66
67
  border-color: colors.$borderColor;
67
- box-shadow: 0 0 0 3px hsl(var(--foreground, 220.9 39.3% 11%) / 0.04);
68
+ box-shadow: 0 0 0 3px
69
+ hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.04);
68
70
  }
69
71
  }
70
72
 
@@ -128,7 +130,8 @@
128
130
  border-color 0.2s ease,
129
131
  box-shadow 0.2s ease,
130
132
  transform 0.2s ease;
131
- box-shadow: 0 2px 6px hsl(var(--foreground, 220.9 39.3% 11%) / 0.12);
133
+ box-shadow: 0 2px 6px
134
+ hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.12);
132
135
 
133
136
  &::after {
134
137
  content: '';
@@ -149,13 +152,15 @@
149
152
  }
150
153
 
151
154
  .builder-checkbox__native:focus-visible + .builder-checkbox__control {
152
- box-shadow: 0 0 0 3px hsl(var(--primary, 221.2 83.2% 53.3%) / 0.3);
155
+ box-shadow: 0 0 0 3px
156
+ hsl(var(--primary, var(--rb-primary, 221.2 83.2% 53.3%)) / 0.3);
153
157
  }
154
158
 
155
159
  .builder-checkbox__native:checked + .builder-checkbox__control {
156
160
  background: linear-gradient(135deg, colors.$textColor, colors.$accentColor);
157
161
  border-color: transparent;
158
- box-shadow: 0 6px 14px hsl(var(--primary, 221.2 83.2% 53.3%) / 0.35);
162
+ box-shadow: 0 6px 14px
163
+ hsl(var(--primary, var(--rb-primary, 221.2 83.2% 53.3%)) / 0.35);
159
164
  }
160
165
 
161
166
  .builder-checkbox__native:checked + .builder-checkbox__control::after {
@@ -6,17 +6,84 @@
6
6
  * - If the host doesn't define a token, we fall back to the builder defaults.
7
7
  */
8
8
 
9
- $background: hsl(var(--background, 220 14.3% 95.9%));
10
- $foreground: hsl(var(--foreground, 220.9 39.3% 11%));
11
- $card: hsl(var(--card, 0 0% 100%));
12
- $cardForeground: hsl(var(--card-foreground, 220.9 39.3% 11%));
13
- $muted: hsl(var(--muted, 220 14.3% 95.9%));
14
- $mutedForeground: hsl(var(--muted-foreground, 220 8.9% 46.1%));
15
- $primary: hsl(var(--primary, 221.2 83.2% 53.3%));
16
- $primaryForeground: hsl(var(--primary-foreground, 0 0% 100%));
17
- $destructive: hsl(var(--destructive, 0 84.2% 60.2%));
18
- $destructiveForeground: hsl(var(--destructive-foreground, 0 0% 100%));
19
- $border: hsl(var(--border, 220 13% 91%));
9
+ /* ------------------------------------------------------------
10
+ * Default tokens (scoped via --rb-* to avoid overriding host apps)
11
+ *
12
+ * - Host apps can override by defining `--background`, `--foreground`, etc.
13
+ * - Builder provides defaults via `--rb-background`, `--rb-foreground`, etc.
14
+ * - Dark mode defaults are provided via `.dark` and `prefers-color-scheme`.
15
+ * ------------------------------------------------------------ */
16
+
17
+ :root {
18
+ --rb-background: 220 14.3% 95.9%;
19
+ --rb-foreground: 220.9 39.3% 11%;
20
+ --rb-card: 0 0% 100%;
21
+ --rb-card-foreground: 220.9 39.3% 11%;
22
+ --rb-muted: 220 14.3% 95.9%;
23
+ --rb-muted-foreground: 220 8.9% 46.1%;
24
+ --rb-primary: 221.2 83.2% 53.3%;
25
+ --rb-primary-foreground: 0 0% 100%;
26
+ --rb-destructive: 0 84.2% 60.2%;
27
+ --rb-destructive-foreground: 0 0% 100%;
28
+ --rb-border: 220 13% 91%;
29
+ color-scheme: light;
30
+ }
31
+
32
+ .dark {
33
+ --rb-background: 222.2 84% 4.9%;
34
+ --rb-foreground: 210 40% 98%;
35
+ --rb-card: 222.2 84% 4.9%;
36
+ --rb-card-foreground: 210 40% 98%;
37
+ --rb-muted: 217.2 32.6% 17.5%;
38
+ --rb-muted-foreground: 215 20.2% 65.1%;
39
+ --rb-primary: 217.2 91.2% 59.8%;
40
+ --rb-primary-foreground: 222.2 84% 4.9%;
41
+ --rb-destructive: 0 62.8% 30.6%;
42
+ --rb-destructive-foreground: 210 40% 98%;
43
+ --rb-border: 217.2 32.6% 17.5%;
44
+ color-scheme: dark;
45
+ }
46
+
47
+ /* Automatic dark mode if the app doesn't explicitly set `.light`/`.dark`. */
48
+ @media (prefers-color-scheme: dark) {
49
+ :root:not(.light):not(.dark) {
50
+ --rb-background: 222.2 84% 4.9%;
51
+ --rb-foreground: 210 40% 98%;
52
+ --rb-card: 222.2 84% 4.9%;
53
+ --rb-card-foreground: 210 40% 98%;
54
+ --rb-muted: 217.2 32.6% 17.5%;
55
+ --rb-muted-foreground: 215 20.2% 65.1%;
56
+ --rb-primary: 217.2 91.2% 59.8%;
57
+ --rb-primary-foreground: 222.2 84% 4.9%;
58
+ --rb-destructive: 0 62.8% 30.6%;
59
+ --rb-destructive-foreground: 210 40% 98%;
60
+ --rb-border: 217.2 32.6% 17.5%;
61
+ color-scheme: dark;
62
+ }
63
+ }
64
+
65
+ $background: hsl(var(--background, var(--rb-background, 220 14.3% 95.9%)));
66
+ $foreground: hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)));
67
+ $card: hsl(var(--card, var(--rb-card, 0 0% 100%)));
68
+ $cardForeground: hsl(
69
+ var(--card-foreground, var(--rb-card-foreground, 220.9 39.3% 11%))
70
+ );
71
+ $muted: hsl(var(--muted, var(--rb-muted, 220 14.3% 95.9%)));
72
+ $mutedForeground: hsl(
73
+ var(--muted-foreground, var(--rb-muted-foreground, 220 8.9% 46.1%))
74
+ );
75
+ $primary: hsl(var(--primary, var(--rb-primary, 221.2 83.2% 53.3%)));
76
+ $primaryForeground: hsl(
77
+ var(--primary-foreground, var(--rb-primary-foreground, 0 0% 100%))
78
+ );
79
+ $destructive: hsl(var(--destructive, var(--rb-destructive, 0 84.2% 60.2%)));
80
+ $destructiveForeground: hsl(
81
+ var(
82
+ --destructive-foreground,
83
+ var(--rb-destructive-foreground, 0 0% 100%)
84
+ )
85
+ );
86
+ $border: hsl(var(--border, var(--rb-border, 220 13% 91%)));
20
87
 
21
88
  /* Back-compat aliases used by the existing SCSS. */
22
89
  $textColor: $foreground;
@@ -14,7 +14,10 @@
14
14
 
15
15
  @mixin thin-scrollbar {
16
16
  scrollbar-width: thin;
17
- scrollbar-color: hsl(var(--foreground, 220.9 39.3% 11%) / 0.25) transparent;
17
+ scrollbar-color: hsl(
18
+ var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.25
19
+ )
20
+ transparent;
18
21
  &::-webkit-scrollbar {
19
22
  width: 8px;
20
23
  height: 4px;
@@ -18,8 +18,10 @@ $radiusPill: 12px;
18
18
  $borderWidthHairline: 1px;
19
19
  $outlineWidthFocus: 2px;
20
20
 
21
- $cardShadow: 0 10px 30px hsl(var(--foreground, 220.9 39.3% 11%) / 0.12);
22
- $shadowTooltip: 0 6px 16px hsl(var(--foreground, 220.9 39.3% 11%) / 0.2);
21
+ $cardShadow: 0 10px 30px
22
+ hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.12);
23
+ $shadowTooltip: 0 6px 16px
24
+ hsl(var(--foreground, var(--rb-foreground, 220.9 39.3% 11%)) / 0.2);
23
25
 
24
26
  $fontSizeXs: 11px;
25
27
  $fontSizeSm: 12px;
@@ -8,6 +8,7 @@
8
8
  @use './base/global';
9
9
  @use './layout/pages';
10
10
  @use './layout/builder';
11
+ @use './layout/project-validation';
11
12
 
12
13
  @use './components/ui-components';
13
14
  @use './components/editor-shell';
@@ -55,9 +55,70 @@
55
55
  overflow: hidden;
56
56
  text-overflow: ellipsis;
57
57
  cursor: pointer;
58
+ border: none;
59
+ text-align: left;
58
60
  }
59
61
  }
60
62
 
63
+ .builder__button-actions {
64
+ position: relative;
65
+ display: flex;
66
+ align-items: stretch;
67
+ }
68
+
69
+ .builder__button-actions-trigger {
70
+ @include card;
71
+ height: sizes.$buttonHeight;
72
+ width: sizes.$buttonHeight;
73
+ display: inline-flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ border: none;
77
+ margin-left: sizes.$spaceTight;
78
+ background: colors.$canvasColor;
79
+ color: colors.$mutedTextColor;
80
+ cursor: pointer;
81
+ box-shadow: inset 0 0 0 1px colors.$borderColor;
82
+ }
83
+
84
+ .builder__button-actions-menu {
85
+ position: absolute;
86
+ right: 0;
87
+ top: calc(100% + 6px);
88
+ min-width: 160px;
89
+ padding: 6px;
90
+ margin: 0;
91
+ list-style: none;
92
+ background: colors.$surfaceColor;
93
+ border-radius: sizes.$radiusSoft;
94
+ box-shadow: 0 10px 25px hsl(0 0% 0% / 0.15);
95
+ border: 1px solid colors.$borderColor;
96
+ z-index: 20;
97
+ }
98
+
99
+ .builder__button-actions-item {
100
+ width: 100%;
101
+ text-align: left;
102
+ border: none;
103
+ background: transparent;
104
+ padding: 8px 10px;
105
+ border-radius: sizes.$radiusSoft;
106
+ cursor: pointer;
107
+ font-size: 12px;
108
+ color: colors.$textColor;
109
+ &:hover {
110
+ background: colors.$canvasColor;
111
+ }
112
+ &:disabled {
113
+ opacity: 0.5;
114
+ cursor: not-allowed;
115
+ }
116
+ }
117
+
118
+ .builder__button-actions-item--danger {
119
+ color: colors.$dangerColor;
120
+ }
121
+
61
122
  .builder__sort-controls {
62
123
  display: flex;
63
124
  flex-direction: column;