@brunoalz/smartgesti-site-editor 0.2.2 → 1.1.0

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 (607) hide show
  1. package/dist/editor/BlockSelector.d.ts +2 -1
  2. package/dist/editor/BlockSelector.d.ts.map +1 -1
  3. package/dist/editor/BlockSelector.js +55 -64
  4. package/dist/editor/BlockSelector.js.map +1 -1
  5. package/dist/editor/LandingPageEditor.d.ts +19 -0
  6. package/dist/editor/LandingPageEditor.d.ts.map +1 -0
  7. package/dist/editor/LandingPageEditor.js +239 -0
  8. package/dist/editor/LandingPageEditor.js.map +1 -0
  9. package/dist/editor/PageTabBar.d.ts +4 -1
  10. package/dist/editor/PageTabBar.d.ts.map +1 -1
  11. package/dist/editor/PageTabBar.js +179 -41
  12. package/dist/editor/PageTabBar.js.map +1 -1
  13. package/dist/editor/PropertyEditor/BlockPropertyEditor.d.ts +5 -3
  14. package/dist/editor/PropertyEditor/BlockPropertyEditor.d.ts.map +1 -1
  15. package/dist/editor/PropertyEditor/BlockPropertyEditor.js +60 -113
  16. package/dist/editor/PropertyEditor/BlockPropertyEditor.js.map +1 -1
  17. package/dist/editor/PropertyEditor/CollapsiblePropertyGroup.d.ts +3 -1
  18. package/dist/editor/PropertyEditor/CollapsiblePropertyGroup.d.ts.map +1 -1
  19. package/dist/editor/PropertyEditor/CollapsiblePropertyGroup.js +47 -33
  20. package/dist/editor/PropertyEditor/CollapsiblePropertyGroup.js.map +1 -1
  21. package/dist/editor/PropertyEditor/PropertyGroup.d.ts +1 -1
  22. package/dist/editor/PropertyEditor/PropertyGroup.d.ts.map +1 -1
  23. package/dist/editor/PropertyEditor/VariationSelector.d.ts +2 -1
  24. package/dist/editor/PropertyEditor/VariationSelector.d.ts.map +1 -1
  25. package/dist/editor/PropertyEditor/VariationSelector.js +35 -31
  26. package/dist/editor/PropertyEditor/VariationSelector.js.map +1 -1
  27. package/dist/editor/PropertyEditor/index.js +30 -28
  28. package/dist/editor/PropertyEditor/inputs/CarouselImagesInput.d.ts +16 -0
  29. package/dist/editor/PropertyEditor/inputs/CarouselImagesInput.d.ts.map +1 -0
  30. package/dist/editor/PropertyEditor/inputs/CarouselImagesInput.js +170 -0
  31. package/dist/editor/PropertyEditor/inputs/CarouselImagesInput.js.map +1 -0
  32. package/dist/editor/PropertyEditor/inputs/ImageGridInput.d.ts +1 -1
  33. package/dist/editor/PropertyEditor/inputs/ImageGridInput.d.ts.map +1 -1
  34. package/dist/editor/PropertyEditor/inputs/ImageGridInput.js +148 -121
  35. package/dist/editor/PropertyEditor/inputs/ImageGridInput.js.map +1 -1
  36. package/dist/editor/PropertyEditor/inputs/ImageInput.d.ts.map +1 -0
  37. package/dist/{components → editor/PropertyEditor}/inputs/ImageInput.js +41 -39
  38. package/dist/editor/PropertyEditor/inputs/ImageInput.js.map +1 -0
  39. package/dist/editor/PropertyEditor/inputs/TypographyInput.js +41 -44
  40. package/dist/editor/PropertyEditor/inputs/TypographyInput.js.map +1 -1
  41. package/dist/editor/PropertyEditor/inputs/index.d.ts +2 -0
  42. package/dist/editor/PropertyEditor/inputs/index.d.ts.map +1 -1
  43. package/dist/editor/PropertyEditor/renderPropertyInput.d.ts +1 -1
  44. package/dist/editor/PropertyEditor/renderPropertyInput.d.ts.map +1 -1
  45. package/dist/editor/PropertyEditor/renderPropertyInput.js +167 -139
  46. package/dist/editor/PropertyEditor/renderPropertyInput.js.map +1 -1
  47. package/dist/editor/components/CenterPanel.d.ts +13 -4
  48. package/dist/editor/components/CenterPanel.d.ts.map +1 -1
  49. package/dist/editor/components/CenterPanel.js +40 -31
  50. package/dist/editor/components/CenterPanel.js.map +1 -1
  51. package/dist/editor/components/LeftPanel.d.ts +2 -1
  52. package/dist/editor/components/LeftPanel.d.ts.map +1 -1
  53. package/dist/editor/components/LeftPanel.js +13 -12
  54. package/dist/editor/components/LeftPanel.js.map +1 -1
  55. package/dist/editor/components/LoadingSpinner.d.ts.map +1 -0
  56. package/dist/editor/components/LoadingSpinner.js.map +1 -0
  57. package/dist/editor/components/RightPanel.d.ts +8 -2
  58. package/dist/editor/components/RightPanel.d.ts.map +1 -1
  59. package/dist/editor/components/RightPanel.js +24 -19
  60. package/dist/editor/components/RightPanel.js.map +1 -1
  61. package/dist/editor/components/Toolbar.d.ts +5 -1
  62. package/dist/editor/components/Toolbar.d.ts.map +1 -1
  63. package/dist/editor/components/Toolbar.js +56 -40
  64. package/dist/editor/components/Toolbar.js.map +1 -1
  65. package/dist/engine/export/exportHtml.d.ts +10 -5
  66. package/dist/engine/export/exportHtml.d.ts.map +1 -1
  67. package/dist/engine/export/exportHtml.js +38 -40
  68. package/dist/engine/export/exportHtml.js.map +1 -1
  69. package/dist/engine/export/exporters/content/HeadingExporter.d.ts.map +1 -1
  70. package/dist/engine/export/exporters/content/HeadingExporter.js +6 -6
  71. package/dist/engine/export/exporters/content/HeadingExporter.js.map +1 -1
  72. package/dist/engine/export/exporters/content/LinkExporter.d.ts.map +1 -1
  73. package/dist/engine/export/exporters/content/LinkExporter.js +6 -6
  74. package/dist/engine/export/exporters/content/LinkExporter.js.map +1 -1
  75. package/dist/engine/export/exporters/content/TextExporter.d.ts.map +1 -1
  76. package/dist/engine/export/exporters/content/TextExporter.js +7 -7
  77. package/dist/engine/export/exporters/content/TextExporter.js.map +1 -1
  78. package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts +6 -0
  79. package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts.map +1 -0
  80. package/dist/engine/export/exporters/sections/BlogPostExporters.js +101 -0
  81. package/dist/engine/export/exporters/sections/BlogPostExporters.js.map +1 -0
  82. package/dist/engine/export/exporters/sections/FooterExporter.d.ts.map +1 -1
  83. package/dist/engine/export/exporters/sections/FooterExporter.js +33 -40
  84. package/dist/engine/export/exporters/sections/FooterExporter.js.map +1 -1
  85. package/dist/engine/export/exporters/sections/HeroExporter.d.ts.map +1 -1
  86. package/dist/engine/export/exporters/sections/HeroExporter.js +222 -218
  87. package/dist/engine/export/exporters/sections/HeroExporter.js.map +1 -1
  88. package/dist/engine/export/exporters/sections/MarketingExporters.js +88 -88
  89. package/dist/engine/export/exporters/sections/MarketingExporters.js.map +1 -1
  90. package/dist/engine/export/exporters/sections/NavbarExporter.js +34 -34
  91. package/dist/engine/export/exporters/sections/NavbarExporter.js.map +1 -1
  92. package/dist/engine/export/exporters/sections/index.d.ts.map +1 -1
  93. package/dist/engine/export/exporters/sections/index.js +29 -22
  94. package/dist/engine/export/exporters/sections/index.js.map +1 -1
  95. package/dist/engine/export/sanitizeHtml.d.ts.map +1 -1
  96. package/dist/engine/export/sanitizeHtml.js +65 -18
  97. package/dist/engine/export/sanitizeHtml.js.map +1 -1
  98. package/dist/engine/export/styleResolver.d.ts.map +1 -1
  99. package/dist/engine/export/styleResolver.js +33 -33
  100. package/dist/engine/export/styleResolver.js.map +1 -1
  101. package/dist/engine/generators/generateLandingPage.d.ts +4 -4
  102. package/dist/engine/generators/generateLandingPage.d.ts.map +1 -1
  103. package/dist/engine/generators/generateLandingPage.js.map +1 -1
  104. package/dist/engine/index.d.ts +6 -3
  105. package/dist/engine/index.d.ts.map +1 -1
  106. package/dist/engine/index.js +99 -89
  107. package/dist/engine/index.js.map +1 -1
  108. package/dist/engine/patch/PatchBuilder.d.ts +11 -11
  109. package/dist/engine/patch/PatchBuilder.d.ts.map +1 -1
  110. package/dist/engine/patch/PatchBuilder.js +92 -93
  111. package/dist/engine/patch/PatchBuilder.js.map +1 -1
  112. package/dist/engine/patch/applyPatch.js.map +1 -1
  113. package/dist/engine/plugins/builtin/blog/index.d.ts +3 -0
  114. package/dist/engine/plugins/builtin/blog/index.d.ts.map +1 -0
  115. package/dist/engine/plugins/builtin/blog/manifest.d.ts +3 -0
  116. package/dist/engine/plugins/builtin/blog/manifest.d.ts.map +1 -0
  117. package/dist/engine/plugins/builtin/blog/manifest.js +273 -0
  118. package/dist/engine/plugins/builtin/blog/manifest.js.map +1 -0
  119. package/dist/engine/plugins/builtin/blog/mockContentProvider.d.ts +7 -0
  120. package/dist/engine/plugins/builtin/blog/mockContentProvider.d.ts.map +1 -0
  121. package/dist/engine/plugins/builtin/blog/mockContentProvider.js +135 -0
  122. package/dist/engine/plugins/builtin/blog/mockContentProvider.js.map +1 -0
  123. package/dist/engine/plugins/contentHydration.d.ts +17 -0
  124. package/dist/engine/plugins/contentHydration.d.ts.map +1 -0
  125. package/dist/engine/plugins/contentHydration.js +121 -0
  126. package/dist/engine/plugins/contentHydration.js.map +1 -0
  127. package/dist/engine/plugins/dynamicPageResolver.d.ts +25 -0
  128. package/dist/engine/plugins/dynamicPageResolver.d.ts.map +1 -0
  129. package/dist/engine/plugins/dynamicPageResolver.js +32 -0
  130. package/dist/engine/plugins/dynamicPageResolver.js.map +1 -0
  131. package/dist/engine/plugins/index.d.ts +11 -0
  132. package/dist/engine/plugins/index.d.ts.map +1 -0
  133. package/dist/engine/plugins/pluginRegistry.d.ts +37 -0
  134. package/dist/engine/plugins/pluginRegistry.d.ts.map +1 -0
  135. package/dist/engine/plugins/pluginRegistry.js +134 -0
  136. package/dist/engine/plugins/pluginRegistry.js.map +1 -0
  137. package/dist/engine/plugins/types.d.ts +180 -0
  138. package/dist/engine/plugins/types.d.ts.map +1 -0
  139. package/dist/engine/presets/heroVariations.d.ts +5 -0
  140. package/dist/engine/presets/heroVariations.d.ts.map +1 -1
  141. package/dist/engine/presets/heroVariations.js +50 -6
  142. package/dist/engine/presets/heroVariations.js.map +1 -1
  143. package/dist/engine/preview/Preview.d.ts +19 -0
  144. package/dist/engine/preview/Preview.d.ts.map +1 -0
  145. package/dist/engine/preview/Preview.js +418 -0
  146. package/dist/engine/preview/Preview.js.map +1 -0
  147. package/dist/engine/registry/blocks/sections/blogPostCard.d.ts +3 -0
  148. package/dist/engine/registry/blocks/sections/blogPostCard.d.ts.map +1 -0
  149. package/dist/engine/registry/blocks/sections/blogPostCard.js +53 -0
  150. package/dist/engine/registry/blocks/sections/blogPostCard.js.map +1 -0
  151. package/dist/engine/registry/blocks/sections/blogPostDetail.d.ts +3 -0
  152. package/dist/engine/registry/blocks/sections/blogPostDetail.d.ts.map +1 -0
  153. package/dist/engine/registry/blocks/sections/blogPostDetail.js +49 -0
  154. package/dist/engine/registry/blocks/sections/blogPostDetail.js.map +1 -0
  155. package/dist/engine/registry/blocks/sections/blogPostGrid.d.ts +3 -0
  156. package/dist/engine/registry/blocks/sections/blogPostGrid.d.ts.map +1 -0
  157. package/dist/engine/registry/blocks/sections/blogPostGrid.js +89 -0
  158. package/dist/engine/registry/blocks/sections/blogPostGrid.js.map +1 -0
  159. package/dist/engine/registry/blocks/sections/hero.d.ts.map +1 -1
  160. package/dist/engine/registry/blocks/sections/hero.js +67 -14
  161. package/dist/engine/registry/blocks/sections/hero.js.map +1 -1
  162. package/dist/engine/registry/blocks/sections/index.d.ts +3 -0
  163. package/dist/engine/registry/blocks/sections/index.d.ts.map +1 -1
  164. package/dist/engine/registry/blocks/sections/navbar.d.ts.map +1 -1
  165. package/dist/engine/registry/blocks/sections/navbar.js +2 -1
  166. package/dist/engine/registry/blocks/sections/navbar.js.map +1 -1
  167. package/dist/engine/registry/registry.d.ts.map +1 -1
  168. package/dist/engine/registry/registry.js +39 -36
  169. package/dist/engine/registry/registry.js.map +1 -1
  170. package/dist/engine/registry/types.d.ts +17 -13
  171. package/dist/engine/registry/types.d.ts.map +1 -1
  172. package/dist/engine/render/renderNodeImpl.js +85 -85
  173. package/dist/engine/render/renderNodeImpl.js.map +1 -1
  174. package/dist/engine/render/renderPage.d.ts +3 -3
  175. package/dist/engine/render/renderPage.d.ts.map +1 -1
  176. package/dist/engine/render/renderPage.js.map +1 -1
  177. package/dist/engine/render/renderers/composition/CardRenderer.js +4 -4
  178. package/dist/engine/render/renderers/content/LinkRenderer.d.ts.map +1 -1
  179. package/dist/engine/render/renderers/content/LinkRenderer.js +41 -16
  180. package/dist/engine/render/renderers/content/LinkRenderer.js.map +1 -1
  181. package/dist/engine/render/renderers/content/SocialLinksRenderer.d.ts.map +1 -1
  182. package/dist/engine/render/renderers/content/SocialLinksRenderer.js +16 -23
  183. package/dist/engine/render/renderers/content/SocialLinksRenderer.js.map +1 -1
  184. package/dist/engine/render/renderers/forms/FormRenderer.js +6 -6
  185. package/dist/engine/render/renderers/layout/GridRenderer.js +3 -3
  186. package/dist/engine/render/renderers/sections/BlogPostCardRenderer.d.ts +3 -0
  187. package/dist/engine/render/renderers/sections/BlogPostCardRenderer.d.ts.map +1 -0
  188. package/dist/engine/render/renderers/sections/BlogPostCardRenderer.js +199 -0
  189. package/dist/engine/render/renderers/sections/BlogPostCardRenderer.js.map +1 -0
  190. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.d.ts +3 -0
  191. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.d.ts.map +1 -0
  192. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js +293 -0
  193. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js.map +1 -0
  194. package/dist/engine/render/renderers/sections/BlogPostGridRenderer.d.ts +3 -0
  195. package/dist/engine/render/renderers/sections/BlogPostGridRenderer.d.ts.map +1 -0
  196. package/dist/engine/render/renderers/sections/BlogPostGridRenderer.js +101 -0
  197. package/dist/engine/render/renderers/sections/BlogPostGridRenderer.js.map +1 -0
  198. package/dist/engine/render/renderers/sections/CtaRenderer.d.ts.map +1 -1
  199. package/dist/engine/render/renderers/sections/CtaRenderer.js +33 -31
  200. package/dist/engine/render/renderers/sections/CtaRenderer.js.map +1 -1
  201. package/dist/engine/render/renderers/sections/FaqItemRenderer.d.ts.map +1 -1
  202. package/dist/engine/render/renderers/sections/FaqItemRenderer.js +7 -6
  203. package/dist/engine/render/renderers/sections/FaqItemRenderer.js.map +1 -1
  204. package/dist/engine/render/renderers/sections/FaqRenderer.js +7 -7
  205. package/dist/engine/render/renderers/sections/FaqRenderer.js.map +1 -1
  206. package/dist/engine/render/renderers/sections/FeatureGridRenderer.d.ts.map +1 -1
  207. package/dist/engine/render/renderers/sections/FeatureGridRenderer.js +19 -18
  208. package/dist/engine/render/renderers/sections/FeatureGridRenderer.js.map +1 -1
  209. package/dist/engine/render/renderers/sections/FeatureRenderer.d.ts.map +1 -1
  210. package/dist/engine/render/renderers/sections/FeatureRenderer.js +5 -4
  211. package/dist/engine/render/renderers/sections/FeatureRenderer.js.map +1 -1
  212. package/dist/engine/render/renderers/sections/FooterRenderer.d.ts.map +1 -1
  213. package/dist/engine/render/renderers/sections/FooterRenderer.js +25 -30
  214. package/dist/engine/render/renderers/sections/FooterRenderer.js.map +1 -1
  215. package/dist/engine/render/renderers/sections/HeroRenderer.d.ts.map +1 -1
  216. package/dist/engine/render/renderers/sections/HeroRenderer.js +293 -229
  217. package/dist/engine/render/renderers/sections/HeroRenderer.js.map +1 -1
  218. package/dist/engine/render/renderers/sections/NavbarRenderer.d.ts.map +1 -1
  219. package/dist/engine/render/renderers/sections/NavbarRenderer.js +23 -22
  220. package/dist/engine/render/renderers/sections/NavbarRenderer.js.map +1 -1
  221. package/dist/engine/render/renderers/sections/PricingCardRenderer.d.ts.map +1 -1
  222. package/dist/engine/render/renderers/sections/PricingCardRenderer.js +7 -6
  223. package/dist/engine/render/renderers/sections/PricingCardRenderer.js.map +1 -1
  224. package/dist/engine/render/renderers/sections/PricingRenderer.js +9 -9
  225. package/dist/engine/render/renderers/sections/PricingRenderer.js.map +1 -1
  226. package/dist/engine/render/renderers/sections/TestimonialGridRenderer.d.ts.map +1 -1
  227. package/dist/engine/render/renderers/sections/TestimonialGridRenderer.js +17 -16
  228. package/dist/engine/render/renderers/sections/TestimonialGridRenderer.js.map +1 -1
  229. package/dist/engine/render/renderers/sections/TestimonialRenderer.d.ts.map +1 -1
  230. package/dist/engine/render/renderers/sections/TestimonialRenderer.js +11 -10
  231. package/dist/engine/render/renderers/sections/TestimonialRenderer.js.map +1 -1
  232. package/dist/engine/render/renderers/sections/index.js +24 -18
  233. package/dist/engine/render/renderers/sections/index.js.map +1 -1
  234. package/dist/engine/schema/siteDocument.d.ts +118 -7
  235. package/dist/engine/schema/siteDocument.d.ts.map +1 -1
  236. package/dist/engine/schema/siteDocument.js +1 -1
  237. package/dist/engine/schema/siteDocument.js.map +1 -1
  238. package/dist/engine/schema/themeTokens.d.ts +1 -1
  239. package/dist/engine/schema/themeTokens.js.map +1 -1
  240. package/dist/engine/shared/carouselAnimation.d.ts +20 -0
  241. package/dist/engine/shared/carouselAnimation.d.ts.map +1 -0
  242. package/dist/engine/shared/carouselAnimation.js +62 -0
  243. package/dist/engine/shared/carouselAnimation.js.map +1 -0
  244. package/dist/engine/shared/imageGrid/presets.js +4 -12
  245. package/dist/engine/shared/imageGrid/presets.js.map +1 -1
  246. package/dist/engine/shared/imageGrid/types.d.ts +2 -0
  247. package/dist/engine/shared/imageGrid/types.d.ts.map +1 -1
  248. package/dist/engine/shared/layoutConstants.d.ts +13 -0
  249. package/dist/engine/shared/layoutConstants.d.ts.map +1 -0
  250. package/dist/engine/shared/layoutConstants.js +14 -0
  251. package/dist/engine/shared/layoutConstants.js.map +1 -0
  252. package/dist/engine/shared/shadowConstants.d.ts +5 -0
  253. package/dist/engine/shared/shadowConstants.d.ts.map +1 -0
  254. package/dist/engine/shared/shadowConstants.js +11 -0
  255. package/dist/engine/shared/shadowConstants.js.map +1 -0
  256. package/dist/engine/shared/showWhen.d.ts +44 -0
  257. package/dist/engine/shared/showWhen.d.ts.map +1 -0
  258. package/dist/engine/shared/showWhen.js +33 -0
  259. package/dist/engine/shared/showWhen.js.map +1 -0
  260. package/dist/engine/shared/socialIcons.d.ts +6 -0
  261. package/dist/engine/shared/socialIcons.d.ts.map +1 -0
  262. package/dist/engine/shared/socialIcons.js +13 -0
  263. package/dist/engine/shared/socialIcons.js.map +1 -0
  264. package/dist/engine/shared/typeGuards.d.ts +11 -0
  265. package/dist/engine/shared/typeGuards.d.ts.map +1 -0
  266. package/dist/hooks/useEditorState.d.ts +8 -5
  267. package/dist/hooks/useEditorState.d.ts.map +1 -1
  268. package/dist/hooks/useEditorState.js +150 -194
  269. package/dist/hooks/useEditorState.js.map +1 -1
  270. package/dist/hooks/useNavbarAutoSync.d.ts +2 -2
  271. package/dist/hooks/useNavbarAutoSync.d.ts.map +1 -1
  272. package/dist/hooks/useNavbarAutoSync.js.map +1 -1
  273. package/dist/index.d.ts +60 -14
  274. package/dist/index.d.ts.map +1 -1
  275. package/dist/index.js +109 -124
  276. package/dist/index.js.map +1 -1
  277. package/dist/shared/index.d.ts +2 -2
  278. package/dist/shared/index.d.ts.map +1 -1
  279. package/dist/shared/schema.d.ts +4 -4
  280. package/dist/shared/schema.d.ts.map +1 -1
  281. package/dist/shared/schema.js.map +1 -1
  282. package/dist/shared/templates/escola-blog.d.ts +3 -0
  283. package/dist/shared/templates/escola-blog.d.ts.map +1 -0
  284. package/dist/shared/templates/escola-blog.js +160 -0
  285. package/dist/shared/templates/escola-blog.js.map +1 -0
  286. package/dist/shared/templates/escola-edvi.d.ts +2 -2
  287. package/dist/shared/templates/escola-edvi.d.ts.map +1 -1
  288. package/dist/shared/templates/escola-edvi.js.map +1 -1
  289. package/dist/shared/templates/escola-premium.d.ts +2 -2
  290. package/dist/shared/templates/escola-premium.d.ts.map +1 -1
  291. package/dist/shared/templates/escola-premium.js.map +1 -1
  292. package/dist/shared/templates/escola-zilom.d.ts +2 -2
  293. package/dist/shared/templates/escola-zilom.d.ts.map +1 -1
  294. package/dist/shared/templates/escola-zilom.js.map +1 -1
  295. package/dist/shared/templates/index.d.ts +7 -5
  296. package/dist/shared/templates/index.d.ts.map +1 -1
  297. package/dist/shared/templates/index.js +30 -12
  298. package/dist/shared/templates/index.js.map +1 -1
  299. package/dist/shared/validators.d.ts +3 -3
  300. package/dist/shared/validators.d.ts.map +1 -1
  301. package/dist/shared/validators.js.map +1 -1
  302. package/dist/site/BlockRenderer.d.ts +1 -1
  303. package/dist/site/BlockRenderer.d.ts.map +1 -1
  304. package/dist/site/BlockRenderer.js +22 -26
  305. package/dist/site/BlockRenderer.js.map +1 -1
  306. package/dist/site/blocks/Button.js +15 -17
  307. package/dist/site/blocks/Button.js.map +1 -1
  308. package/dist/site/blocks/Card.js +13 -15
  309. package/dist/site/blocks/Card.js.map +1 -1
  310. package/dist/site/blocks/Features.js +15 -17
  311. package/dist/site/blocks/Features.js.map +1 -1
  312. package/dist/site/blocks/Footer.js +10 -12
  313. package/dist/site/blocks/Footer.js.map +1 -1
  314. package/dist/site/blocks/Hero.js +12 -14
  315. package/dist/site/blocks/Hero.js.map +1 -1
  316. package/dist/site/blocks/Navbar.js +13 -15
  317. package/dist/site/blocks/Navbar.js.map +1 -1
  318. package/dist/site/blocks/Section.js +9 -11
  319. package/dist/site/blocks/Section.js.map +1 -1
  320. package/dist/site/blocks/SectionHeader.js +9 -11
  321. package/dist/site/blocks/SectionHeader.js.map +1 -1
  322. package/dist/site/blocks/SiteRoot.js +9 -12
  323. package/dist/site/blocks/SiteRoot.js.map +1 -1
  324. package/dist/site/index.js +73 -73
  325. package/dist/styles/site/sections.css.d.ts +1 -1
  326. package/dist/utils/blockUtils.d.ts +2 -2
  327. package/dist/utils/blockUtils.d.ts.map +1 -1
  328. package/dist/utils/blockUtils.js.map +1 -1
  329. package/dist/utils/changeDetector.d.ts +3 -2
  330. package/dist/utils/changeDetector.d.ts.map +1 -1
  331. package/dist/utils/changeDetector.js +39 -39
  332. package/dist/utils/changeDetector.js.map +1 -1
  333. package/dist/utils/cn.js +2 -2
  334. package/dist/utils/dataURLUtils.d.ts +24 -0
  335. package/dist/utils/dataURLUtils.d.ts.map +1 -0
  336. package/dist/utils/dataURLUtils.js +47 -0
  337. package/dist/utils/dataURLUtils.js.map +1 -0
  338. package/dist/utils/documentHash.d.ts +2 -2
  339. package/dist/utils/documentHash.d.ts.map +1 -1
  340. package/dist/utils/documentHash.js +8 -7
  341. package/dist/utils/documentHash.js.map +1 -1
  342. package/dist/utils/logger.d.ts +13 -0
  343. package/dist/utils/logger.d.ts.map +1 -0
  344. package/dist/utils/logger.js +13 -0
  345. package/dist/utils/logger.js.map +1 -0
  346. package/dist/utils/navbarSync.d.ts +3 -3
  347. package/dist/utils/navbarSync.d.ts.map +1 -1
  348. package/dist/utils/navbarSync.js +25 -24
  349. package/dist/utils/navbarSync.js.map +1 -1
  350. package/dist/utils/sharedTemplateToEngine.d.ts +7 -8
  351. package/dist/utils/sharedTemplateToEngine.d.ts.map +1 -1
  352. package/dist/utils/sharedTemplateToEngine.js +14 -87
  353. package/dist/utils/sharedTemplateToEngine.js.map +1 -1
  354. package/dist/viewer/LandingPageViewer.d.ts +32 -0
  355. package/dist/viewer/LandingPageViewer.d.ts.map +1 -0
  356. package/dist/viewer/LandingPageViewer.js +300 -0
  357. package/dist/viewer/LandingPageViewer.js.map +1 -0
  358. package/package.json +10 -5
  359. package/dist/components/ComponentPalette/definitions.d.ts +0 -3
  360. package/dist/components/ComponentPalette/definitions.d.ts.map +0 -1
  361. package/dist/components/ComponentPalette/definitions.js +0 -206
  362. package/dist/components/ComponentPalette/definitions.js.map +0 -1
  363. package/dist/components/ComponentPalette/index.d.ts +0 -7
  364. package/dist/components/ComponentPalette/index.d.ts.map +0 -1
  365. package/dist/components/ComponentPalette/index.js +0 -86
  366. package/dist/components/ComponentPalette/index.js.map +0 -1
  367. package/dist/components/LoadingSpinner.d.ts.map +0 -1
  368. package/dist/components/LoadingSpinner.js.map +0 -1
  369. package/dist/components/PreviewPanel/index.d.ts +0 -12
  370. package/dist/components/PreviewPanel/index.d.ts.map +0 -1
  371. package/dist/components/PreviewPanel/index.js +0 -140
  372. package/dist/components/PreviewPanel/index.js.map +0 -1
  373. package/dist/components/PropertyPanel/index.d.ts +0 -8
  374. package/dist/components/PropertyPanel/index.d.ts.map +0 -1
  375. package/dist/components/PropertyPanel/index.js +0 -223
  376. package/dist/components/PropertyPanel/index.js.map +0 -1
  377. package/dist/components/SiteEditor/index.d.ts +0 -3
  378. package/dist/components/SiteEditor/index.d.ts.map +0 -1
  379. package/dist/components/SiteEditor/index.js +0 -251
  380. package/dist/components/SiteEditor/index.js.map +0 -1
  381. package/dist/components/SiteViewer/index.d.ts +0 -3
  382. package/dist/components/SiteViewer/index.d.ts.map +0 -1
  383. package/dist/components/SiteViewer/index.js +0 -55
  384. package/dist/components/SiteViewer/index.js.map +0 -1
  385. package/dist/components/TemplateSelector/index.d.ts +0 -7
  386. package/dist/components/TemplateSelector/index.d.ts.map +0 -1
  387. package/dist/components/TemplateSelector/index.js +0 -109
  388. package/dist/components/TemplateSelector/index.js.map +0 -1
  389. package/dist/components/Toolbar/index.d.ts +0 -15
  390. package/dist/components/Toolbar/index.d.ts.map +0 -1
  391. package/dist/components/Toolbar/index.js +0 -113
  392. package/dist/components/Toolbar/index.js.map +0 -1
  393. package/dist/components/editors/PaletteSelector.d.ts +0 -14
  394. package/dist/components/editors/PaletteSelector.d.ts.map +0 -1
  395. package/dist/components/editors/PaletteSelector.js +0 -175
  396. package/dist/components/editors/PaletteSelector.js.map +0 -1
  397. package/dist/components/effects/SectionGlow.d.ts +0 -12
  398. package/dist/components/effects/SectionGlow.d.ts.map +0 -1
  399. package/dist/components/effects/SectionGlow.js +0 -139
  400. package/dist/components/effects/SectionGlow.js.map +0 -1
  401. package/dist/components/inputs/CheckboxInput.d.ts +0 -3
  402. package/dist/components/inputs/CheckboxInput.d.ts.map +0 -1
  403. package/dist/components/inputs/CheckboxInput.js +0 -46
  404. package/dist/components/inputs/CheckboxInput.js.map +0 -1
  405. package/dist/components/inputs/ColorInput.d.ts +0 -7
  406. package/dist/components/inputs/ColorInput.d.ts.map +0 -1
  407. package/dist/components/inputs/ColorInput.js +0 -180
  408. package/dist/components/inputs/ColorInput.js.map +0 -1
  409. package/dist/components/inputs/GradientInput.d.ts +0 -7
  410. package/dist/components/inputs/GradientInput.d.ts.map +0 -1
  411. package/dist/components/inputs/GradientInput.js +0 -78
  412. package/dist/components/inputs/GradientInput.js.map +0 -1
  413. package/dist/components/inputs/ImageInput.d.ts.map +0 -1
  414. package/dist/components/inputs/ImageInput.js.map +0 -1
  415. package/dist/components/inputs/SelectInput.d.ts +0 -7
  416. package/dist/components/inputs/SelectInput.d.ts.map +0 -1
  417. package/dist/components/inputs/SelectInput.js +0 -97
  418. package/dist/components/inputs/SelectInput.js.map +0 -1
  419. package/dist/components/inputs/SliderInput.d.ts +0 -8
  420. package/dist/components/inputs/SliderInput.d.ts.map +0 -1
  421. package/dist/components/inputs/SliderInput.js +0 -77
  422. package/dist/components/inputs/SliderInput.js.map +0 -1
  423. package/dist/components/inputs/index.d.ts +0 -11
  424. package/dist/components/inputs/index.d.ts.map +0 -1
  425. package/dist/components/inputs/types.d.ts +0 -48
  426. package/dist/components/inputs/types.d.ts.map +0 -1
  427. package/dist/components/inputs/types.js +0 -9
  428. package/dist/components/inputs/types.js.map +0 -1
  429. package/dist/components/renderers/ComponentRenderer.d.ts +0 -8
  430. package/dist/components/renderers/ComponentRenderer.d.ts.map +0 -1
  431. package/dist/components/renderers/ComponentRenderer.js +0 -13
  432. package/dist/components/renderers/ComponentRenderer.js.map +0 -1
  433. package/dist/components/renderers/HeroRenderer.d.ts +0 -3
  434. package/dist/components/renderers/HeroRenderer.d.ts.map +0 -1
  435. package/dist/components/renderers/HeroRenderer.js +0 -10
  436. package/dist/components/renderers/HeroRenderer.js.map +0 -1
  437. package/dist/components/renderers/hero/HeroBanner.d.ts +0 -3
  438. package/dist/components/renderers/hero/HeroBanner.d.ts.map +0 -1
  439. package/dist/components/renderers/hero/HeroBanner.js +0 -122
  440. package/dist/components/renderers/hero/HeroBanner.js.map +0 -1
  441. package/dist/components/renderers/hero/HeroCinematic.d.ts +0 -3
  442. package/dist/components/renderers/hero/HeroCinematic.d.ts.map +0 -1
  443. package/dist/components/renderers/hero/HeroCinematic.js +0 -141
  444. package/dist/components/renderers/hero/HeroCinematic.js.map +0 -1
  445. package/dist/components/renderers/hero/HeroClassic.d.ts +0 -3
  446. package/dist/components/renderers/hero/HeroClassic.d.ts.map +0 -1
  447. package/dist/components/renderers/hero/HeroClassic.js +0 -241
  448. package/dist/components/renderers/hero/HeroClassic.js.map +0 -1
  449. package/dist/components/renderers/hero/HeroCollage.d.ts +0 -3
  450. package/dist/components/renderers/hero/HeroCollage.d.ts.map +0 -1
  451. package/dist/components/renderers/hero/HeroCollage.js +0 -131
  452. package/dist/components/renderers/hero/HeroCollage.js.map +0 -1
  453. package/dist/components/renderers/hero/HeroColumns.d.ts +0 -3
  454. package/dist/components/renderers/hero/HeroColumns.d.ts.map +0 -1
  455. package/dist/components/renderers/hero/HeroColumns.js +0 -114
  456. package/dist/components/renderers/hero/HeroColumns.js.map +0 -1
  457. package/dist/components/renderers/hero/HeroGlass.d.ts +0 -3
  458. package/dist/components/renderers/hero/HeroGlass.d.ts.map +0 -1
  459. package/dist/components/renderers/hero/HeroGlass.js +0 -119
  460. package/dist/components/renderers/hero/HeroGlass.js.map +0 -1
  461. package/dist/components/renderers/hero/HeroNeon.d.ts +0 -3
  462. package/dist/components/renderers/hero/HeroNeon.d.ts.map +0 -1
  463. package/dist/components/renderers/hero/HeroNeon.js +0 -136
  464. package/dist/components/renderers/hero/HeroNeon.js.map +0 -1
  465. package/dist/components/renderers/hero/HeroParallax.d.ts +0 -3
  466. package/dist/components/renderers/hero/HeroParallax.d.ts.map +0 -1
  467. package/dist/components/renderers/hero/HeroParallax.js +0 -99
  468. package/dist/components/renderers/hero/HeroParallax.js.map +0 -1
  469. package/dist/components/renderers/hero/HeroSplit.d.ts +0 -3
  470. package/dist/components/renderers/hero/HeroSplit.d.ts.map +0 -1
  471. package/dist/components/renderers/hero/HeroSplit.js +0 -142
  472. package/dist/components/renderers/hero/HeroSplit.js.map +0 -1
  473. package/dist/components/renderers/hero/HeroSpotlight.d.ts +0 -3
  474. package/dist/components/renderers/hero/HeroSpotlight.d.ts.map +0 -1
  475. package/dist/components/renderers/hero/HeroSpotlight.js +0 -213
  476. package/dist/components/renderers/hero/HeroSpotlight.js.map +0 -1
  477. package/dist/components/renderers/hero/index.d.ts +0 -14
  478. package/dist/components/renderers/hero/index.d.ts.map +0 -1
  479. package/dist/components/renderers/index.d.ts +0 -8
  480. package/dist/components/renderers/index.d.ts.map +0 -1
  481. package/dist/components/renderers/index.js +0 -89
  482. package/dist/components/renderers/index.js.map +0 -1
  483. package/dist/components/renderers/types.d.ts +0 -11
  484. package/dist/components/renderers/types.d.ts.map +0 -1
  485. package/dist/editor/LandingPageEditorV2.d.ts +0 -19
  486. package/dist/editor/LandingPageEditorV2.d.ts.map +0 -1
  487. package/dist/editor/LandingPageEditorV2.js +0 -311
  488. package/dist/editor/LandingPageEditorV2.js.map +0 -1
  489. package/dist/editor/PropertyEditor/PropertyGroup.js +0 -23
  490. package/dist/editor/PropertyEditor/PropertyGroup.js.map +0 -1
  491. package/dist/engine/preview/PreviewV2.d.ts +0 -15
  492. package/dist/engine/preview/PreviewV2.d.ts.map +0 -1
  493. package/dist/engine/preview/PreviewV2.js +0 -242
  494. package/dist/engine/preview/PreviewV2.js.map +0 -1
  495. package/dist/modules/registry.d.ts +0 -31
  496. package/dist/modules/registry.d.ts.map +0 -1
  497. package/dist/modules/registry.js +0 -67
  498. package/dist/modules/registry.js.map +0 -1
  499. package/dist/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js +0 -57
  500. package/dist/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js.map +0 -1
  501. package/dist/node_modules/@dnd-kit/core/dist/core.esm.js +0 -2345
  502. package/dist/node_modules/@dnd-kit/core/dist/core.esm.js.map +0 -1
  503. package/dist/node_modules/@dnd-kit/sortable/dist/sortable.esm.js +0 -440
  504. package/dist/node_modules/@dnd-kit/sortable/dist/sortable.esm.js.map +0 -1
  505. package/dist/node_modules/@dnd-kit/utilities/dist/utilities.esm.js +0 -236
  506. package/dist/node_modules/@dnd-kit/utilities/dist/utilities.esm.js.map +0 -1
  507. package/dist/node_modules/clsx/dist/clsx.js +0 -17
  508. package/dist/node_modules/clsx/dist/clsx.js.map +0 -1
  509. package/dist/node_modules/lucide-react/dist/esm/Icon.js +0 -35
  510. package/dist/node_modules/lucide-react/dist/esm/Icon.js.map +0 -1
  511. package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.js +0 -18
  512. package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.js.map +0 -1
  513. package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.js +0 -15
  514. package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.js.map +0 -1
  515. package/dist/node_modules/lucide-react/dist/esm/icons/arrow-right.js +0 -9
  516. package/dist/node_modules/lucide-react/dist/esm/icons/arrow-right.js.map +0 -1
  517. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js +0 -9
  518. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js.map +0 -1
  519. package/dist/node_modules/lucide-react/dist/esm/icons/check.js +0 -6
  520. package/dist/node_modules/lucide-react/dist/esm/icons/check.js.map +0 -1
  521. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.js +0 -8
  522. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.js.map +0 -1
  523. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.js +0 -8
  524. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.js.map +0 -1
  525. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js +0 -6
  526. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js.map +0 -1
  527. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js +0 -15
  528. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js.map +0 -1
  529. package/dist/node_modules/lucide-react/dist/esm/icons/file-text.js +0 -12
  530. package/dist/node_modules/lucide-react/dist/esm/icons/file-text.js.map +0 -1
  531. package/dist/node_modules/lucide-react/dist/esm/icons/globe.js +0 -10
  532. package/dist/node_modules/lucide-react/dist/esm/icons/globe.js.map +0 -1
  533. package/dist/node_modules/lucide-react/dist/esm/icons/grid-3x3.js +0 -12
  534. package/dist/node_modules/lucide-react/dist/esm/icons/grid-3x3.js.map +0 -1
  535. package/dist/node_modules/lucide-react/dist/esm/icons/grip-vertical.js +0 -13
  536. package/dist/node_modules/lucide-react/dist/esm/icons/grip-vertical.js.map +0 -1
  537. package/dist/node_modules/lucide-react/dist/esm/icons/heading.js +0 -10
  538. package/dist/node_modules/lucide-react/dist/esm/icons/heading.js.map +0 -1
  539. package/dist/node_modules/lucide-react/dist/esm/icons/image.js +0 -10
  540. package/dist/node_modules/lucide-react/dist/esm/icons/image.js.map +0 -1
  541. package/dist/node_modules/lucide-react/dist/esm/icons/images.js +0 -11
  542. package/dist/node_modules/lucide-react/dist/esm/icons/images.js.map +0 -1
  543. package/dist/node_modules/lucide-react/dist/esm/icons/list.js +0 -13
  544. package/dist/node_modules/lucide-react/dist/esm/icons/list.js.map +0 -1
  545. package/dist/node_modules/lucide-react/dist/esm/icons/loader-circle.js +0 -8
  546. package/dist/node_modules/lucide-react/dist/esm/icons/loader-circle.js.map +0 -1
  547. package/dist/node_modules/lucide-react/dist/esm/icons/minus.js +0 -6
  548. package/dist/node_modules/lucide-react/dist/esm/icons/minus.js.map +0 -1
  549. package/dist/node_modules/lucide-react/dist/esm/icons/mouse-pointer-click.js +0 -18
  550. package/dist/node_modules/lucide-react/dist/esm/icons/mouse-pointer-click.js.map +0 -1
  551. package/dist/node_modules/lucide-react/dist/esm/icons/navigation.js +0 -8
  552. package/dist/node_modules/lucide-react/dist/esm/icons/navigation.js.map +0 -1
  553. package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js +0 -10
  554. package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js.map +0 -1
  555. package/dist/node_modules/lucide-react/dist/esm/icons/phone.js +0 -14
  556. package/dist/node_modules/lucide-react/dist/esm/icons/phone.js.map +0 -1
  557. package/dist/node_modules/lucide-react/dist/esm/icons/plus.js +0 -9
  558. package/dist/node_modules/lucide-react/dist/esm/icons/plus.js.map +0 -1
  559. package/dist/node_modules/lucide-react/dist/esm/icons/redo-2.js +0 -9
  560. package/dist/node_modules/lucide-react/dist/esm/icons/redo-2.js.map +0 -1
  561. package/dist/node_modules/lucide-react/dist/esm/icons/redo.js +0 -9
  562. package/dist/node_modules/lucide-react/dist/esm/icons/redo.js.map +0 -1
  563. package/dist/node_modules/lucide-react/dist/esm/icons/rotate-ccw.js +0 -9
  564. package/dist/node_modules/lucide-react/dist/esm/icons/rotate-ccw.js.map +0 -1
  565. package/dist/node_modules/lucide-react/dist/esm/icons/save.js +0 -16
  566. package/dist/node_modules/lucide-react/dist/esm/icons/save.js.map +0 -1
  567. package/dist/node_modules/lucide-react/dist/esm/icons/square.js +0 -8
  568. package/dist/node_modules/lucide-react/dist/esm/icons/square.js.map +0 -1
  569. package/dist/node_modules/lucide-react/dist/esm/icons/star.js +0 -14
  570. package/dist/node_modules/lucide-react/dist/esm/icons/star.js.map +0 -1
  571. package/dist/node_modules/lucide-react/dist/esm/icons/trash-2.js +0 -12
  572. package/dist/node_modules/lucide-react/dist/esm/icons/trash-2.js.map +0 -1
  573. package/dist/node_modules/lucide-react/dist/esm/icons/type.js +0 -10
  574. package/dist/node_modules/lucide-react/dist/esm/icons/type.js.map +0 -1
  575. package/dist/node_modules/lucide-react/dist/esm/icons/undo-2.js +0 -9
  576. package/dist/node_modules/lucide-react/dist/esm/icons/undo-2.js.map +0 -1
  577. package/dist/node_modules/lucide-react/dist/esm/icons/undo.js +0 -9
  578. package/dist/node_modules/lucide-react/dist/esm/icons/undo.js.map +0 -1
  579. package/dist/node_modules/lucide-react/dist/esm/icons/user.js +0 -9
  580. package/dist/node_modules/lucide-react/dist/esm/icons/user.js.map +0 -1
  581. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils.js +0 -6
  582. package/dist/node_modules/lucide-react/dist/esm/shared/src/utils.js.map +0 -1
  583. package/dist/node_modules/react-colorful/dist/index.js +0 -167
  584. package/dist/node_modules/react-colorful/dist/index.js.map +0 -1
  585. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +0 -2266
  586. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
  587. package/dist/types/index.d.ts +0 -99
  588. package/dist/types/index.d.ts.map +0 -1
  589. package/dist/types/module.d.ts +0 -25
  590. package/dist/types/module.d.ts.map +0 -1
  591. package/dist/utils/htmlExporter.d.ts +0 -6
  592. package/dist/utils/htmlExporter.d.ts.map +0 -1
  593. package/dist/utils/htmlExporter.js +0 -92
  594. package/dist/utils/htmlExporter.js.map +0 -1
  595. package/dist/utils/themeApplier.d.ts +0 -11
  596. package/dist/utils/themeApplier.d.ts.map +0 -1
  597. package/dist/utils/themeApplier.js +0 -29
  598. package/dist/utils/themeApplier.js.map +0 -1
  599. package/dist/utils/useDebounce.d.ts +0 -12
  600. package/dist/utils/useDebounce.d.ts.map +0 -1
  601. package/dist/viewer/LandingPageViewerV2.d.ts +0 -25
  602. package/dist/viewer/LandingPageViewerV2.d.ts.map +0 -1
  603. package/dist/viewer/LandingPageViewerV2.js +0 -253
  604. package/dist/viewer/LandingPageViewerV2.js.map +0 -1
  605. /package/dist/{components → editor/PropertyEditor}/inputs/ImageInput.d.ts +0 -0
  606. /package/dist/{components → editor/components}/LoadingSpinner.d.ts +0 -0
  607. /package/dist/{components → editor/components}/LoadingSpinner.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ImageGridInput.js","sources":["../../../../src/editor/PropertyEditor/inputs/ImageGridInput.tsx"],"sourcesContent":["/**\n * ImageGridInput\n * Componente de edição para grid de imagens com seletor de preset visual\n */\n\nimport { useRef } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport {\n type ImageGridItem,\n type ImageGridPreset,\n gridPresetMap,\n imageGridPresetIds,\n} from \"../../../engine/shared/imageGrid\";\nimport type { UploadConfig } from \"../../LandingPageEditorV2\";\n\ninterface ImageGridInputProps {\n /** Preset atual */\n preset?: ImageGridPreset;\n /** Array de imagens */\n images?: ImageGridItem[];\n /** Gap em pixels */\n gap?: number;\n /** Callback para atualizar preset */\n onPresetChange: (preset: ImageGridPreset) => void;\n /** Callback para atualizar imagens */\n onImagesChange: (images: ImageGridItem[]) => void;\n /** Callback para atualizar gap */\n onGapChange: (gap: number) => void;\n /** Label do componente */\n label?: string;\n /** Descrição */\n description?: string;\n /** Configuração de upload (tenantId, authToken, etc) */\n uploadConfig?: UploadConfig;\n}\n\n/**\n * Ícones visuais dos presets usando divs estilizadas\n */\nfunction PresetIcon({ preset, isActive }: { preset: ImageGridPreset; isActive: boolean }) {\n const config = gridPresetMap[preset];\n\n // Usar uma mini-grid visual para representar cada preset\n const getPresetVisual = () => {\n switch (preset) {\n case \"single\":\n return (\n <div className=\"w-full h-full bg-current rounded-sm\" />\n );\n case \"two-horizontal\":\n return (\n <div className=\"w-full h-full grid grid-cols-2 gap-0.5\">\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm\" />\n </div>\n );\n case \"two-vertical\":\n return (\n <div className=\"w-full h-full grid grid-rows-2 gap-0.5\">\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm\" />\n </div>\n );\n case \"three-left\":\n return (\n <div className=\"w-full h-full grid grid-cols-2 grid-rows-2 gap-0.5\">\n <div className=\"bg-current rounded-sm row-span-2\" />\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm\" />\n </div>\n );\n case \"three-right\":\n return (\n <div className=\"w-full h-full grid grid-cols-2 grid-rows-2 gap-0.5\">\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm row-span-2\" />\n <div className=\"bg-current rounded-sm\" />\n </div>\n );\n case \"three-top\":\n return (\n <div className=\"w-full h-full grid grid-cols-2 grid-rows-2 gap-0.5\">\n <div className=\"bg-current rounded-sm col-span-2\" />\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm\" />\n </div>\n );\n case \"four-equal\":\n return (\n <div className=\"w-full h-full grid grid-cols-2 grid-rows-2 gap-0.5\">\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm\" />\n </div>\n );\n default:\n return null;\n }\n };\n\n return (\n <div\n className={cn(\n \"w-8 h-8 p-1\",\n isActive ? \"text-blue-500\" : \"text-gray-400 dark:text-gray-500\"\n )}\n title={config.name}\n >\n {getPresetVisual()}\n </div>\n );\n}\n\n/**\n * Slot de imagem individual com preview e upload\n */\nfunction ImageSlot({\n index,\n image,\n onChange,\n onRemove,\n}: {\n index: number;\n image?: ImageGridItem;\n onChange: (image: ImageGridItem) => void;\n onRemove: () => void;\n}) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n // Validação básica\n if (!file.type.startsWith(\"image/\")) {\n alert(\"Apenas imagens são permitidas\");\n return;\n }\n\n if (file.size > 10 * 1024 * 1024) {\n alert(\"Arquivo muito grande. Máximo: 10MB\");\n return;\n }\n\n // Usar Data URL para preview (deferUpload mode)\n const reader = new FileReader();\n reader.onload = (evt) => {\n const dataUrl = evt.target?.result as string;\n onChange({ src: dataUrl, alt: image?.alt || \"\" });\n };\n reader.readAsDataURL(file);\n };\n\n const handleClick = () => {\n if (inputRef.current) {\n inputRef.current.value = \"\"; // Reset para permitir selecionar o mesmo arquivo\n inputRef.current.click();\n }\n };\n\n return (\n <div className=\"relative group\">\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileChange}\n className=\"hidden\"\n />\n\n <button\n type=\"button\"\n onClick={handleClick}\n className={cn(\n \"w-16 h-16 rounded-lg overflow-hidden border-2 transition-all\",\n \"flex items-center justify-center\",\n \"bg-gray-50 dark:bg-gray-800 hover:bg-gray-100 dark:hover:bg-gray-700\",\n image?.src\n ? \"border-blue-400 dark:border-blue-500\"\n : \"border-dashed border-gray-300 dark:border-gray-600 hover:border-blue-400\"\n )}\n >\n {image?.src ? (\n <img\n src={image.src}\n alt={image.alt || `Imagem ${index + 1}`}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <svg\n className=\"w-6 h-6 text-gray-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n )}\n </button>\n\n {/* Botão de remover */}\n {image?.src && (\n <button\n type=\"button\"\n onClick={onRemove}\n className={cn(\n \"absolute -top-1 -right-1 w-5 h-5 rounded-full\",\n \"bg-red-500 text-white\",\n \"flex items-center justify-center\",\n \"opacity-0 group-hover:opacity-100 transition-opacity\",\n \"text-xs font-bold\"\n )}\n >\n ×\n </button>\n )}\n\n {/* Número do slot */}\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/50 text-white text-[10px] text-center py-0.5\">\n {index + 1}\n </div>\n </div>\n );\n}\n\nexport function ImageGridInput({\n preset: presetProp,\n images: imagesProp,\n gap: gapProp,\n onPresetChange,\n onImagesChange,\n onGapChange,\n label,\n description,\n}: ImageGridInputProps) {\n const preset = presetProp || \"four-equal\";\n const images = imagesProp || [];\n const gap = gapProp ?? 8;\n\n const currentConfig = gridPresetMap[preset];\n const maxImages = currentConfig.maxImages;\n\n // Atualiza o preset\n const handlePresetChange = (newPreset: ImageGridPreset) => {\n const newConfig = gridPresetMap[newPreset];\n // Truncar imagens se o novo preset suporta menos\n if (images.length > newConfig.maxImages) {\n onImagesChange(images.slice(0, newConfig.maxImages));\n }\n onPresetChange(newPreset);\n };\n\n // Atualiza uma imagem específica\n const handleImageChange = (index: number, image: ImageGridItem) => {\n const newImages = [...images];\n // Preencher slots vazios até o índice\n while (newImages.length <= index) {\n newImages.push({ src: \"\", alt: \"\" });\n }\n newImages[index] = image;\n onImagesChange(newImages);\n };\n\n // Remove uma imagem\n const handleImageRemove = (index: number) => {\n const newImages = [...images];\n newImages[index] = { src: \"\", alt: \"\" };\n onImagesChange(newImages);\n };\n\n return (\n <div className=\"space-y-3\">\n {/* Label */}\n {label && (\n <label className=\"block text-xs font-medium text-gray-800 dark:text-gray-100\">\n {label}\n {description && (\n <span className=\"text-gray-500 dark:text-gray-400 text-xs font-normal ml-1\">\n {description}\n </span>\n )}\n </label>\n )}\n\n {/* Seletor de Preset */}\n <div className=\"space-y-1\">\n <span className=\"text-[10px] text-gray-500 dark:text-gray-400 uppercase tracking-wide\">\n Layout\n </span>\n <div className=\"flex flex-wrap gap-1 p-1 bg-gray-100 dark:bg-gray-800 rounded-lg\">\n {imageGridPresetIds.map((presetId) => (\n <button\n key={presetId}\n type=\"button\"\n onClick={() => handlePresetChange(presetId)}\n className={cn(\n \"rounded-md transition-all\",\n preset === presetId\n ? \"bg-white dark:bg-gray-700 shadow-sm\"\n : \"hover:bg-white/50 dark:hover:bg-gray-700/50\"\n )}\n >\n <PresetIcon preset={presetId} isActive={preset === presetId} />\n </button>\n ))}\n </div>\n </div>\n\n {/* Slots de Imagens */}\n <div className=\"space-y-1\">\n <span className=\"text-[10px] text-gray-500 dark:text-gray-400 uppercase tracking-wide\">\n Imagens ({images.filter(img => img?.src).length}/{maxImages})\n </span>\n <div className=\"flex flex-wrap gap-2\">\n {Array.from({ length: maxImages }).map((_, index) => (\n <ImageSlot\n key={index}\n index={index}\n image={images[index]}\n onChange={(img) => handleImageChange(index, img)}\n onRemove={() => handleImageRemove(index)}\n />\n ))}\n </div>\n </div>\n\n {/* Slider de Gap */}\n <div className=\"space-y-1\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[10px] text-gray-500 dark:text-gray-400 uppercase tracking-wide\">\n Espaçamento\n </span>\n <span className=\"text-xs text-gray-600 dark:text-gray-400\">\n {gap}px\n </span>\n </div>\n <input\n type=\"range\"\n value={gap}\n onChange={(e) => onGapChange(Number(e.target.value))}\n min={0}\n max={24}\n step={2}\n className=\"w-full h-2 bg-gray-200 dark:bg-gray-700 rounded-lg appearance-none cursor-pointer\"\n />\n </div>\n </div>\n );\n}\n"],"names":["PresetIcon","preset","isActive","config","gridPresetMap","getPresetVisual","jsx","jsxs","cn","ImageSlot","index","image","onChange","onRemove","inputRef","useRef","e","file","reader","evt","dataUrl","ImageGridInput","presetProp","imagesProp","gapProp","onPresetChange","onImagesChange","onGapChange","label","description","images","gap","maxImages","handlePresetChange","newPreset","newConfig","handleImageChange","newImages","handleImageRemove","imageGridPresetIds","presetId","img","_"],"mappings":"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"}
1
+ {"version":3,"file":"ImageGridInput.js","sources":["../../../../src/editor/PropertyEditor/inputs/ImageGridInput.tsx"],"sourcesContent":["/**\n * ImageGridInput\n * Componente de edição para grid de imagens com seletor de preset visual\n */\n\nimport { useRef } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport {\n type ImageGridItem,\n type ImageGridPreset,\n gridPresetMap,\n imageGridPresetIds,\n} from \"../../../engine/shared/imageGrid\";\nimport type { UploadConfig } from \"../../LandingPageEditor\";\n\ninterface ImageGridInputProps {\n /** Preset atual */\n preset?: ImageGridPreset;\n /** Array de imagens */\n images?: ImageGridItem[];\n /** Gap em pixels */\n gap?: number;\n /** Callback para atualizar preset */\n onPresetChange: (preset: ImageGridPreset) => void;\n /** Callback para atualizar imagens */\n onImagesChange: (images: ImageGridItem[]) => void;\n /** Callback para atualizar gap */\n onGapChange: (gap: number) => void;\n /** Label do componente */\n label?: string;\n /** Descrição */\n description?: string;\n /** Configuração de upload (tenantId, authToken, etc) */\n uploadConfig?: UploadConfig;\n}\n\n/**\n * Ícones visuais dos presets usando divs estilizadas\n */\nfunction PresetIcon({ preset, isActive }: { preset: ImageGridPreset; isActive: boolean }) {\n const config = gridPresetMap[preset];\n\n // Usar uma mini-grid visual para representar cada preset\n const getPresetVisual = () => {\n switch (preset) {\n case \"single\":\n return (\n <div className=\"w-full h-full bg-current rounded-sm\" />\n );\n case \"two-horizontal\":\n return (\n <div className=\"w-full h-full grid grid-cols-2 gap-0.5\">\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm\" />\n </div>\n );\n case \"two-vertical\":\n return (\n <div className=\"w-full h-full grid grid-rows-2 gap-0.5\">\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm\" />\n </div>\n );\n case \"three-left\":\n return (\n <div className=\"w-full h-full grid grid-cols-2 grid-rows-2 gap-0.5\">\n <div className=\"bg-current rounded-sm row-span-2\" />\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm\" />\n </div>\n );\n case \"three-right\":\n return (\n <div className=\"w-full h-full grid grid-cols-2 grid-rows-2 gap-0.5\">\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm row-span-2\" />\n <div className=\"bg-current rounded-sm\" />\n </div>\n );\n case \"three-top\":\n return (\n <div className=\"w-full h-full grid grid-cols-2 grid-rows-2 gap-0.5\">\n <div className=\"bg-current rounded-sm col-span-2\" />\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm\" />\n </div>\n );\n case \"four-equal\":\n return (\n <div className=\"w-full h-full grid grid-cols-2 grid-rows-2 gap-0.5\">\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm\" />\n <div className=\"bg-current rounded-sm\" />\n </div>\n );\n default:\n return null;\n }\n };\n\n return (\n <div\n className={cn(\n \"w-8 h-8 p-1\",\n isActive ? \"text-blue-500\" : \"text-gray-400 dark:text-gray-500\"\n )}\n title={config.name}\n >\n {getPresetVisual()}\n </div>\n );\n}\n\n/**\n * Slot de imagem individual com preview, upload e slider de escala\n * Layout: row horizontal com preview à esquerda e slider à direita\n */\nfunction ImageSlot({\n index,\n image,\n onChange,\n onRemove,\n onScaleChange,\n}: {\n index: number;\n image?: ImageGridItem;\n onChange: (image: ImageGridItem) => void;\n onRemove: () => void;\n onScaleChange: (scale: number) => void;\n}) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n // Validação básica\n if (!file.type.startsWith(\"image/\")) {\n alert(\"Apenas imagens são permitidas\");\n return;\n }\n\n if (file.size > 10 * 1024 * 1024) {\n alert(\"Arquivo muito grande. Máximo: 10MB\");\n return;\n }\n\n // Usar Data URL para preview (deferUpload mode)\n // Preservar scale existente ao trocar imagem\n const reader = new FileReader();\n reader.onload = (evt) => {\n const dataUrl = evt.target?.result as string;\n onChange({ src: dataUrl, alt: image?.alt || \"\", scale: image?.scale });\n };\n reader.readAsDataURL(file);\n };\n\n const handleClick = () => {\n if (inputRef.current) {\n inputRef.current.value = \"\"; // Reset para permitir selecionar o mesmo arquivo\n inputRef.current.click();\n }\n };\n\n const hasImage = !!image?.src;\n const scale = image?.scale ?? 1;\n\n return (\n <div className=\"flex items-center gap-3 group\">\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileChange}\n className=\"hidden\"\n />\n\n {/* Preview da imagem */}\n <div className=\"relative flex-shrink-0\">\n <button\n type=\"button\"\n onClick={handleClick}\n className={cn(\n \"w-12 h-12 rounded-lg overflow-hidden border-2 transition-all\",\n \"flex items-center justify-center\",\n \"bg-gray-50 dark:bg-gray-800 hover:bg-gray-100 dark:hover:bg-gray-700\",\n hasImage\n ? \"border-blue-400 dark:border-blue-500\"\n : \"border-dashed border-gray-300 dark:border-gray-600 hover:border-blue-400\"\n )}\n >\n {hasImage ? (\n <img\n src={image.src}\n alt={image.alt || `Imagem ${index + 1}`}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <svg\n className=\"w-5 h-5 text-gray-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n )}\n </button>\n\n {/* Botão de remover */}\n {hasImage && (\n <button\n type=\"button\"\n onClick={onRemove}\n className={cn(\n \"absolute -top-1 -right-1 w-4 h-4 rounded-full\",\n \"bg-red-500 text-white\",\n \"flex items-center justify-center\",\n \"opacity-0 group-hover:opacity-100 transition-opacity\",\n \"text-[10px] font-bold leading-none\"\n )}\n >\n ×\n </button>\n )}\n\n {/* Número do slot */}\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/50 text-white text-[8px] text-center\">\n {index + 1}\n </div>\n </div>\n\n {/* Slider de escala — só aparece quando a imagem tem src */}\n {hasImage && (\n <div className=\"flex-1 flex items-center gap-2 min-w-0\">\n <input\n type=\"range\"\n value={scale}\n onChange={(e) => onScaleChange(Number(e.target.value))}\n min={1}\n max={3}\n step={0.1}\n className=\"flex-1 h-1.5 bg-gray-200 dark:bg-gray-700 rounded-lg appearance-none cursor-pointer\"\n />\n <span className=\"text-[10px] text-gray-500 dark:text-gray-400 w-8 text-right tabular-nums flex-shrink-0\">\n {Math.round(scale * 100)}%\n </span>\n </div>\n )}\n </div>\n );\n}\n\nexport function ImageGridInput({\n preset: presetProp,\n images: imagesProp,\n gap: gapProp,\n onPresetChange,\n onImagesChange,\n onGapChange,\n label,\n description,\n}: ImageGridInputProps) {\n const preset = presetProp || \"four-equal\";\n const images = imagesProp || [];\n const gap = gapProp ?? 8;\n\n const currentConfig = gridPresetMap[preset];\n const maxImages = currentConfig.maxImages;\n\n // Atualiza o preset\n const handlePresetChange = (newPreset: ImageGridPreset) => {\n const newConfig = gridPresetMap[newPreset];\n // Truncar imagens se o novo preset suporta menos\n if (images.length > newConfig.maxImages) {\n onImagesChange(images.slice(0, newConfig.maxImages));\n }\n onPresetChange(newPreset);\n };\n\n // Atualiza uma imagem específica\n const handleImageChange = (index: number, image: ImageGridItem) => {\n const newImages = [...images];\n // Preencher slots vazios até o índice\n while (newImages.length <= index) {\n newImages.push({ src: \"\", alt: \"\" });\n }\n newImages[index] = image;\n onImagesChange(newImages);\n };\n\n // Remove uma imagem\n const handleImageRemove = (index: number) => {\n const newImages = [...images];\n newImages[index] = { src: \"\", alt: \"\" };\n onImagesChange(newImages);\n };\n\n // Atualiza a escala de uma imagem específica\n const handleScaleChange = (index: number, scale: number) => {\n const newImages = [...images];\n while (newImages.length <= index) {\n newImages.push({ src: \"\", alt: \"\" });\n }\n newImages[index] = { ...newImages[index], scale };\n onImagesChange(newImages);\n };\n\n return (\n <div className=\"space-y-3\">\n {/* Label */}\n {label && (\n <label className=\"block text-xs font-medium text-gray-800 dark:text-gray-100\">\n {label}\n {description && (\n <span className=\"text-gray-500 dark:text-gray-400 text-xs font-normal ml-1\">\n {description}\n </span>\n )}\n </label>\n )}\n\n {/* Seletor de Preset */}\n <div className=\"space-y-1\">\n <span className=\"text-[10px] text-gray-500 dark:text-gray-400 uppercase tracking-wide\">\n Layout\n </span>\n <div className=\"flex flex-wrap gap-1 p-1 bg-gray-100 dark:bg-gray-800 rounded-lg\">\n {imageGridPresetIds.map((presetId) => (\n <button\n key={presetId}\n type=\"button\"\n onClick={() => handlePresetChange(presetId)}\n className={cn(\n \"rounded-md transition-all\",\n preset === presetId\n ? \"bg-white dark:bg-gray-700 shadow-sm\"\n : \"hover:bg-white/50 dark:hover:bg-gray-700/50\"\n )}\n >\n <PresetIcon preset={presetId} isActive={preset === presetId} />\n </button>\n ))}\n </div>\n </div>\n\n {/* Slots de Imagens — lista vertical */}\n <div className=\"space-y-1\">\n <span className=\"text-[10px] text-gray-500 dark:text-gray-400 uppercase tracking-wide\">\n Imagens ({images.filter(img => img?.src).length}/{maxImages})\n </span>\n <div className=\"flex flex-col gap-2\">\n {Array.from({ length: maxImages }).map((_, index) => (\n <ImageSlot\n key={index}\n index={index}\n image={images[index]}\n onChange={(img) => handleImageChange(index, img)}\n onRemove={() => handleImageRemove(index)}\n onScaleChange={(scale) => handleScaleChange(index, scale)}\n />\n ))}\n </div>\n </div>\n\n {/* Slider de Gap */}\n <div className=\"space-y-1\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[10px] text-gray-500 dark:text-gray-400 uppercase tracking-wide\">\n Espaçamento\n </span>\n <span className=\"text-xs text-gray-600 dark:text-gray-400\">\n {gap}px\n </span>\n </div>\n <input\n type=\"range\"\n value={gap}\n onChange={(e) => onGapChange(Number(e.target.value))}\n min={0}\n max={24}\n step={2}\n className=\"w-full h-2 bg-gray-200 dark:bg-gray-700 rounded-lg appearance-none cursor-pointer\"\n />\n </div>\n </div>\n );\n}\n"],"names":["PresetIcon","preset","isActive","config","gridPresetMap","getPresetVisual","jsx","jsxs","cn","ImageSlot","index","image","onChange","onRemove","onScaleChange","inputRef","useRef","handleFileChange","e","file","reader","evt","dataUrl","handleClick","hasImage","scale","ImageGridInput","presetProp","imagesProp","gapProp","onPresetChange","onImagesChange","onGapChange","label","description","images","gap","maxImages","handlePresetChange","newPreset","newConfig","handleImageChange","newImages","handleImageRemove","handleScaleChange","imageGridPresetIds","presetId","img","_"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageInput.d.ts","sourceRoot":"","sources":["../../../../src/editor/PropertyEditor/inputs/ImageInput.tsx"],"names":[],"mappings":"AAIA,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACxC,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;IAC/C,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAA;CAC5C;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,YAAmB,EACnB,SAAa,EACb,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,SAAS,EACT,SAAmB,EACnB,WAAmB,EACnB,aAAa,GACd,EAAE,eAAe,2CAiMjB"}
@@ -1,24 +1,26 @@
1
- import { jsxs as w, jsx as t } from "react/jsx-runtime";
2
- import { useState as E } from "react";
3
- import { cn as N } from "../../utils/cn.js";
1
+ import { jsxs as E, jsx as t } from "react/jsx-runtime";
2
+ import { useState as N } from "react";
3
+ import { cn as _ } from "../../../utils/cn.js";
4
+ import { logger as f } from "../../../utils/logger.js";
5
+ const S = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1 };
4
6
  function F({
5
7
  value: i,
6
8
  onChange: d,
7
- label: f,
8
- size: h,
9
- showUrlInput: j = !0,
10
- maxSizeMB: x = 5,
9
+ label: h,
10
+ size: x,
11
+ showUrlInput: R = !0,
12
+ maxSizeMB: b = 5,
11
13
  tenantId: c,
12
14
  schoolId: u,
13
15
  siteId: p,
14
- authToken: g,
15
- assetType: b = "image",
16
+ authToken: m,
17
+ assetType: y = "image",
16
18
  deferUpload: U = !1,
17
- onPendingFile: y
19
+ onPendingFile: v
18
20
  }) {
19
- const [n, v] = E(!1), [k, a] = E(null);
20
- return /* @__PURE__ */ w("div", { className: "space-y-2 flex flex-col items-center", children: [
21
- f && /* @__PURE__ */ t("label", { className: "block text-xs font-medium text-gray-800 dark:text-gray-100 text-center", children: f }),
21
+ const [n, k] = N(!1), [w, a] = N(null);
22
+ return /* @__PURE__ */ E("div", { className: "space-y-2 flex flex-col items-center", children: [
23
+ h && /* @__PURE__ */ t("label", { className: "block text-xs font-medium text-gray-800 dark:text-gray-100 text-center", children: h }),
22
24
  /* @__PURE__ */ t(
23
25
  "input",
24
26
  {
@@ -28,12 +30,12 @@ function F({
28
30
  type: "file",
29
31
  accept: "image/*",
30
32
  onChange: async (r) => {
31
- console.log("[ImageInput] Upload config:", { tenantId: c, schoolId: u, siteId: p, hasAuthToken: !!g, assetType: b });
33
+ f.debug("[ImageInput] Upload config:", { tenantId: c, schoolId: u, siteId: p, hasAuthToken: !!m, assetType: y });
32
34
  const o = r.target.files?.[0];
33
35
  if (!o) return;
34
- const A = x * 1024 * 1024;
35
- if (o.size > A) {
36
- a(`Arquivo muito grande. Máximo: ${x}MB`);
36
+ const j = b * 1024 * 1024;
37
+ if (o.size > j) {
38
+ a(`Arquivo muito grande. Máximo: ${b}MB`);
37
39
  return;
38
40
  }
39
41
  if (!o.type.startsWith("image/") && !o.type.startsWith("video/")) {
@@ -43,18 +45,18 @@ function F({
43
45
  if (a(null), U) {
44
46
  try {
45
47
  const e = new FileReader();
46
- e.onload = (m) => {
47
- const s = m.target?.result;
48
- d(s), y && y(o);
48
+ e.onload = (g) => {
49
+ const s = g.target?.result;
50
+ d(s), v && v(o);
49
51
  }, e.onerror = () => {
50
52
  a("Erro ao ler o arquivo");
51
53
  }, e.readAsDataURL(o);
52
54
  } catch (e) {
53
- console.error("Erro ao criar preview:", e), a(e instanceof Error ? e.message : "Erro ao processar imagem");
55
+ f.error("Erro ao criar preview:", e), a(e instanceof Error ? e.message : "Erro ao processar imagem");
54
56
  }
55
57
  return;
56
58
  }
57
- if (!g) {
59
+ if (!m) {
58
60
  a("Autenticação necessária para upload");
59
61
  return;
60
62
  }
@@ -62,29 +64,29 @@ function F({
62
64
  a("Contexto do tenant é necessário");
63
65
  return;
64
66
  }
65
- v(!0);
67
+ k(!0);
66
68
  try {
67
69
  const e = new FormData();
68
70
  e.append("file", o);
69
- const m = "http://localhost:3001", s = new URLSearchParams({ tenantId: c, assetType: b });
71
+ const g = "http://localhost:3001", s = new URLSearchParams({ tenantId: c, assetType: y });
70
72
  u && s.append("schoolId", u), p && s.append("siteId", p);
71
- const l = await fetch(`${m}/api/site-assets/upload?${s}`, {
73
+ const l = await fetch(`${g}/api/site-assets/upload?${s}`, {
72
74
  method: "POST",
73
75
  headers: {
74
- Authorization: `Bearer ${g}`
76
+ Authorization: `Bearer ${m}`
75
77
  },
76
78
  body: e
77
79
  });
78
80
  if (!l.ok) {
79
- const R = await l.json().catch(() => ({}));
80
- throw l.status === 401 ? new Error("Sessão expirada. Faça login novamente.") : new Error(R.message || "Upload falhou");
81
+ const D = await l.json().catch(() => ({}));
82
+ throw l.status === 401 ? new Error("Sessão expirada. Faça login novamente.") : new Error(D.message || "Upload falhou");
81
83
  }
82
- const C = await l.json();
83
- d(C.url), a(null);
84
+ const A = await l.json();
85
+ d(A.url), a(null);
84
86
  } catch (e) {
85
- console.error("Erro no upload:", e), a(e instanceof Error ? e.message : "Erro ao fazer upload da imagem");
87
+ f.error("Erro no upload:", e), a(e instanceof Error ? e.message : "Erro ao fazer upload da imagem");
86
88
  } finally {
87
- v(!1);
89
+ k(!1);
88
90
  }
89
91
  },
90
92
  disabled: n,
@@ -101,7 +103,7 @@ function F({
101
103
  r && (r.value = "", r.click());
102
104
  },
103
105
  disabled: n,
104
- className: N(
106
+ className: _(
105
107
  "rounded-lg overflow-hidden border-2 transition-all duration-200",
106
108
  "flex items-center justify-center",
107
109
  "bg-gray-50 dark:bg-gray-800 hover:bg-gray-100 dark:hover:bg-gray-700",
@@ -110,8 +112,8 @@ function F({
110
112
  !n && "cursor-pointer"
111
113
  ),
112
114
  style: {
113
- height: h?.height || 120,
114
- width: h?.width || 200
115
+ height: x?.height || 120,
116
+ width: x?.width || 200
115
117
  },
116
118
  children: i ? /* @__PURE__ */ t(
117
119
  "img",
@@ -123,7 +125,7 @@ function F({
123
125
  r.currentTarget.style.display = "none";
124
126
  }
125
127
  }
126
- ) : /* @__PURE__ */ w("div", { className: "flex flex-col items-center justify-center gap-2 p-4 text-center", children: [
128
+ ) : /* @__PURE__ */ E("div", { className: "flex flex-col items-center justify-center gap-2 p-4 text-center", children: [
127
129
  /* @__PURE__ */ t("svg", { className: "w-8 h-8 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 4v16m8-8H4" }) }),
128
130
  /* @__PURE__ */ t("span", { className: "text-xs text-gray-500 dark:text-gray-400", children: n ? "Enviando..." : "Clique para selecionar" })
129
131
  ] })
@@ -138,14 +140,14 @@ function F({
138
140
  children: "Remover imagem"
139
141
  }
140
142
  ),
141
- j && /* @__PURE__ */ t(
143
+ R && /* @__PURE__ */ t(
142
144
  "input",
143
145
  {
144
146
  type: "text",
145
147
  placeholder: "URL da imagem",
146
148
  value: i || "",
147
149
  onChange: (r) => d(r.target.value || void 0),
148
- className: N(
150
+ className: _(
149
151
  "flex h-11 w-full rounded-lg border-2 bg-white dark:bg-gray-800 px-4 py-2.5 text-sm transition-all duration-200",
150
152
  "placeholder:text-gray-400 dark:placeholder:text-gray-500",
151
153
  "focus:outline-none",
@@ -154,7 +156,7 @@ function F({
154
156
  )
155
157
  }
156
158
  ),
157
- k && /* @__PURE__ */ t("div", { className: "text-xs text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 p-2 rounded border border-red-200 dark:border-red-800", children: k })
159
+ w && /* @__PURE__ */ t("div", { className: "text-xs text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 p-2 rounded border border-red-200 dark:border-red-800", children: w })
158
160
  ] });
159
161
  }
160
162
  export {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageInput.js","sources":["../../../../src/editor/PropertyEditor/inputs/ImageInput.tsx"],"sourcesContent":["import { useState } from 'react'\nimport { cn } from '../../../utils/cn'\nimport { logger } from '../../../utils/logger'\n\ninterface ImageInputProps {\n value?: string\n onChange: (v?: string) => void\n label?: string\n size?: { width: number; height: number }\n showUrlInput?: boolean\n maxSizeMB?: number\n tenantId?: string\n schoolId?: string\n siteId?: string\n authToken?: string\n assetType?: 'image' | 'video' | 'icon' | 'logo'\n deferUpload?: boolean\n onPendingFile?: (file: File | null) => void\n}\n\nexport function ImageInput({\n value,\n onChange,\n label,\n size,\n showUrlInput = true,\n maxSizeMB = 5,\n tenantId,\n schoolId,\n siteId,\n authToken,\n assetType = 'image',\n deferUpload = false,\n onPendingFile,\n}: ImageInputProps) {\n const [uploading, setUploading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n logger.debug('[ImageInput] Upload config:', { tenantId, schoolId, siteId, hasAuthToken: !!authToken, assetType })\n const file = e.target.files?.[0]\n if (!file) return\n\n const maxBytes = maxSizeMB * 1024 * 1024\n if (file.size > maxBytes) {\n setError(`Arquivo muito grande. Máximo: ${maxSizeMB}MB`)\n return\n }\n\n if (!file.type.startsWith('image/') && !file.type.startsWith('video/')) {\n setError('Apenas imagens e vídeos são permitidos')\n return\n }\n\n setError(null)\n\n if (deferUpload) {\n try {\n const reader = new FileReader()\n reader.onload = (e) => {\n const dataUrl = e.target?.result as string\n onChange(dataUrl)\n if (onPendingFile) {\n onPendingFile(file)\n }\n }\n reader.onerror = () => {\n setError('Erro ao ler o arquivo')\n }\n reader.readAsDataURL(file)\n } catch (err) {\n logger.error(\"Erro ao criar preview:\", err)\n setError(err instanceof Error ? err.message : \"Erro ao processar imagem\")\n }\n return\n }\n\n if (!authToken) {\n setError('Autenticação necessária para upload')\n return\n }\n\n if (!tenantId) {\n setError('Contexto do tenant é necessário')\n return\n }\n\n setUploading(true)\n\n try {\n const formData = new FormData()\n formData.append('file', file)\n\n const apiUrl = (import.meta as any).env\n ? ((import.meta as any).env as Record<string, string>).VITE_API_URL || 'http://localhost:3001'\n : 'http://localhost:3001'\n\n const params = new URLSearchParams({ tenantId, assetType })\n if (schoolId) params.append('schoolId', schoolId)\n if (siteId) params.append('siteId', siteId)\n\n const res = await fetch(`${apiUrl}/api/site-assets/upload?${params}`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${authToken}`,\n },\n body: formData,\n })\n\n if (!res.ok) {\n const errorData = await res.json().catch(() => ({}))\n if (res.status === 401) {\n throw new Error('Sessão expirada. Faça login novamente.')\n }\n throw new Error((errorData as Record<string, string>).message || 'Upload falhou')\n }\n\n const data = await res.json()\n onChange((data as Record<string, string>).url)\n setError(null)\n } catch (err) {\n logger.error(\"Erro no upload:\", err)\n setError(err instanceof Error ? err.message : \"Erro ao fazer upload da imagem\")\n } finally {\n setUploading(false)\n }\n }\n\n return (\n <div className=\"space-y-2 flex flex-col items-center\">\n {label && (\n <label className=\"block text-xs font-medium text-gray-800 dark:text-gray-100 text-center\">\n {label}\n </label>\n )}\n\n <input\n ref={(el) => {\n if (el) (window as any).__imageInputRef = el;\n }}\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileChange}\n disabled={uploading}\n className=\"hidden\"\n id={`image-input-${Math.random()}`}\n />\n\n <button\n type=\"button\"\n onClick={() => {\n const input = document.querySelector('input[type=\"file\"][accept=\"image/*\"]') as HTMLInputElement;\n if (input) {\n input.value = '';\n input.click();\n }\n }}\n disabled={uploading}\n className={cn(\n 'rounded-lg overflow-hidden border-2 transition-all duration-200',\n 'flex items-center justify-center',\n 'bg-gray-50 dark:bg-gray-800 hover:bg-gray-100 dark:hover:bg-gray-700',\n value\n ? 'border-blue-400 dark:border-blue-500 hover:border-blue-500'\n : 'border-dashed border-gray-300 dark:border-gray-600 hover:border-blue-400',\n uploading && 'opacity-50 cursor-not-allowed',\n !uploading && 'cursor-pointer'\n )}\n style={{\n height: size?.height || 120,\n width: size?.width || 200,\n }}\n >\n {value ? (\n <img\n src={value}\n alt=\"preview\"\n className=\"w-full h-full object-contain\"\n onError={(e) => {\n e.currentTarget.style.display = 'none';\n }}\n />\n ) : (\n <div className=\"flex flex-col items-center justify-center gap-2 p-4 text-center\">\n <svg className=\"w-8 h-8 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {uploading ? 'Enviando...' : 'Clique para selecionar'}\n </span>\n </div>\n )}\n </button>\n\n {value && !uploading && (\n <button\n onClick={() => onChange(undefined)}\n type=\"button\"\n className=\"text-xs text-red-600 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300 text-left transition-colors font-medium\"\n >\n Remover imagem\n </button>\n )}\n\n {showUrlInput && (\n <input\n type=\"text\"\n placeholder=\"URL da imagem\"\n value={value || ''}\n onChange={(e) => onChange(e.target.value || undefined)}\n className={cn(\n 'flex h-11 w-full rounded-lg border-2 bg-white dark:bg-gray-800 px-4 py-2.5 text-sm transition-all duration-200',\n 'placeholder:text-gray-400 dark:placeholder:text-gray-500',\n 'focus:outline-none',\n 'border-gray-300 dark:border-gray-600 hover:border-blue-400/50 focus:border-blue-500',\n 'text-gray-900 dark:text-gray-100'\n )}\n />\n )}\n\n {error && (\n <div className=\"text-xs text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 p-2 rounded border border-red-200 dark:border-red-800\">\n {error}\n </div>\n )}\n </div>\n )\n}\n"],"names":["ImageInput","value","onChange","label","size","showUrlInput","maxSizeMB","tenantId","schoolId","siteId","authToken","assetType","deferUpload","onPendingFile","uploading","setUploading","useState","error","setError","jsxs","jsx","el","e","logger","file","maxBytes","reader","dataUrl","err","formData","apiUrl","params","res","errorData","data","input","cn"],"mappings":";;;;;AAoBO,SAASA,EAAW;AAAA,EACzB,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,aAAAC,IAAc;AAAA,EACd,eAAAC;AACF,GAAoB;AAClB,QAAM,CAACC,GAAWC,CAAY,IAAIC,EAAS,EAAK,GAC1C,CAACC,GAAOC,CAAQ,IAAIF,EAAwB,IAAI;AA4FtD,SACE,gBAAAG,EAAC,OAAA,EAAI,WAAU,wCACZ,UAAA;AAAA,IAAAhB,uBACE,SAAA,EAAM,WAAU,0EACd,UAAAA,GACH;AAAA,IAGF,gBAAAiB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK,CAACC,MAAO;AACX,UAAIA,aAAoB,kBAAkBA;AAAA,QAC5C;AAAA,QACA,MAAK;AAAA,QACL,QAAO;AAAA,QACP,UAxGmB,OAAOC,MAA2C;AACzE,UAAAC,EAAO,MAAM,+BAA+B,EAAE,UAAAhB,GAAU,UAAAC,GAAU,QAAAC,GAAQ,cAAc,CAAC,CAACC,GAAW,WAAAC,EAAA,CAAW;AAChH,gBAAMa,IAAOF,EAAE,OAAO,QAAQ,CAAC;AAC/B,cAAI,CAACE,EAAM;AAEX,gBAAMC,IAAWnB,IAAY,OAAO;AACpC,cAAIkB,EAAK,OAAOC,GAAU;AACxB,YAAAP,EAAS,iCAAiCZ,CAAS,IAAI;AACvD;AAAA,UACF;AAEA,cAAI,CAACkB,EAAK,KAAK,WAAW,QAAQ,KAAK,CAACA,EAAK,KAAK,WAAW,QAAQ,GAAG;AACtE,YAAAN,EAAS,wCAAwC;AACjD;AAAA,UACF;AAIA,cAFAA,EAAS,IAAI,GAETN,GAAa;AACf,gBAAI;AACF,oBAAMc,IAAS,IAAI,WAAA;AACnB,cAAAA,EAAO,SAAS,CAACJ,MAAM;AACrB,sBAAMK,IAAUL,EAAE,QAAQ;AAC1B,gBAAApB,EAASyB,CAAO,GACZd,KACFA,EAAcW,CAAI;AAAA,cAEtB,GACAE,EAAO,UAAU,MAAM;AACrB,gBAAAR,EAAS,uBAAuB;AAAA,cAClC,GACAQ,EAAO,cAAcF,CAAI;AAAA,YAC3B,SAASI,GAAK;AACZ,cAAAL,EAAO,MAAM,0BAA0BK,CAAG,GAC1CV,EAASU,aAAe,QAAQA,EAAI,UAAU,0BAA0B;AAAA,YAC1E;AACA;AAAA,UACF;AAEA,cAAI,CAAClB,GAAW;AACd,YAAAQ,EAAS,qCAAqC;AAC9C;AAAA,UACF;AAEA,cAAI,CAACX,GAAU;AACb,YAAAW,EAAS,iCAAiC;AAC1C;AAAA,UACF;AAEA,UAAAH,EAAa,EAAI;AAEjB,cAAI;AACF,kBAAMc,IAAW,IAAI,SAAA;AACrB,YAAAA,EAAS,OAAO,QAAQL,CAAI;AAE5B,kBAAMM,IACmE,yBAGnEC,IAAS,IAAI,gBAAgB,EAAE,UAAAxB,GAAU,WAAAI,GAAW;AAC1D,YAAIH,KAAUuB,EAAO,OAAO,YAAYvB,CAAQ,GAC5CC,KAAQsB,EAAO,OAAO,UAAUtB,CAAM;AAE1C,kBAAMuB,IAAM,MAAM,MAAM,GAAGF,CAAM,2BAA2BC,CAAM,IAAI;AAAA,cACpE,QAAQ;AAAA,cACR,SAAS;AAAA,gBACP,eAAiB,UAAUrB,CAAS;AAAA,cAAA;AAAA,cAEtC,MAAMmB;AAAA,YAAA,CACP;AAED,gBAAI,CAACG,EAAI,IAAI;AACX,oBAAMC,IAAY,MAAMD,EAAI,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AACnD,oBAAIA,EAAI,WAAW,MACX,IAAI,MAAM,wCAAwC,IAEpD,IAAI,MAAOC,EAAqC,WAAW,eAAe;AAAA,YAClF;AAEA,kBAAMC,IAAO,MAAMF,EAAI,KAAA;AACvB,YAAA9B,EAAUgC,EAAgC,GAAG,GAC7ChB,EAAS,IAAI;AAAA,UACf,SAASU,GAAK;AACZ,YAAAL,EAAO,MAAM,mBAAmBK,CAAG,GACnCV,EAASU,aAAe,QAAQA,EAAI,UAAU,gCAAgC;AAAA,UAChF,UAAA;AACE,YAAAb,EAAa,EAAK;AAAA,UACpB;AAAA,QACF;AAAA,QAiBM,UAAUD;AAAA,QACV,WAAU;AAAA,QACV,IAAI,eAAe,KAAK,OAAA,CAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,IAGlC,gBAAAM;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM;AACb,gBAAMe,IAAQ,SAAS,cAAc,sCAAsC;AAC3E,UAAIA,MACFA,EAAM,QAAQ,IACdA,EAAM,MAAA;AAAA,QAEV;AAAA,QACA,UAAUrB;AAAA,QACV,WAAWsB;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACAnC,IACI,+DACA;AAAA,UACJa,KAAa;AAAA,UACb,CAACA,KAAa;AAAA,QAAA;AAAA,QAEhB,OAAO;AAAA,UACL,QAAQV,GAAM,UAAU;AAAA,UACxB,OAAOA,GAAM,SAAS;AAAA,QAAA;AAAA,QAGvB,UAAAH,IACC,gBAAAmB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKnB;AAAA,YACL,KAAI;AAAA,YACJ,WAAU;AAAA,YACV,SAAS,CAACqB,MAAM;AACd,cAAAA,EAAE,cAAc,MAAM,UAAU;AAAA,YAClC;AAAA,UAAA;AAAA,QAAA,IAGF,gBAAAH,EAAC,OAAA,EAAI,WAAU,mEACb,UAAA;AAAA,UAAA,gBAAAC,EAAC,SAAI,WAAU,yBAAwB,MAAK,QAAO,QAAO,gBAAe,SAAQ,aAC/E,4BAAC,QAAA,EAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,iBAAA,CAAiB,EAAA,CACxF;AAAA,4BACC,QAAA,EAAK,WAAU,4CACb,UAAAN,IAAY,gBAAgB,yBAAA,CAC/B;AAAA,QAAA,GACF;AAAA,MAAA;AAAA,IAAA;AAAA,IAIHb,KAAS,CAACa,KACT,gBAAAM;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,MAAMlB,EAAS,MAAS;AAAA,QACjC,MAAK;AAAA,QACL,WAAU;AAAA,QACX,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAKFG,KACC,gBAAAe;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,aAAY;AAAA,QACZ,OAAOnB,KAAS;AAAA,QAChB,UAAU,CAACqB,MAAMpB,EAASoB,EAAE,OAAO,SAAS,MAAS;AAAA,QACrD,WAAWc;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,IAIHnB,uBACE,OAAA,EAAI,WAAU,6HACZ,UAAAA,GACH;AAAA,EAAA,GAEJ;AAEJ;"}
@@ -1,51 +1,48 @@
1
1
  import { jsxs as a, jsx as e } from "react/jsx-runtime";
2
- import { useState as b, useRef as C, useEffect as S } from "react";
3
- import { HexColorPicker as x } from "../../../node_modules/react-colorful/dist/index.js";
2
+ import { useState as m, useRef as S, useEffect as z, useCallback as y } from "react";
3
+ import { HexColorPicker as k } from "react-colorful";
4
+ import { ChevronUp as I, ChevronDown as E, Minus as W, Plus as P } from "lucide-react";
4
5
  import { cn as s } from "../../../utils/cn.js";
5
- import { fontWeightLabels as z, textEffectLabels as I } from "../../../engine/shared/typography/types.js";
6
- import { generateTypographySummary as E } from "../../../engine/shared/typography/cssGenerator.js";
7
- import W from "../../../node_modules/lucide-react/dist/esm/icons/chevron-up.js";
8
- import P from "../../../node_modules/lucide-react/dist/esm/icons/chevron-down.js";
9
- import M from "../../../node_modules/lucide-react/dist/esm/icons/minus.js";
10
- import j from "../../../node_modules/lucide-react/dist/esm/icons/plus.js";
11
- const L = ["light", "normal", "medium", "semibold", "bold"], O = ["none", "shadow", "glow", "outline", "gradient"];
6
+ import { generateTypographySummary as M } from "../../../engine/shared/typography/cssGenerator.js";
7
+ import { fontWeightLabels as j, textEffectLabels as L } from "../../../engine/shared/typography/types.js";
8
+ const O = ["light", "normal", "medium", "semibold", "bold"], T = ["none", "shadow", "glow", "outline", "gradient"];
12
9
  function B({
13
10
  value: l,
14
- onChange: p,
15
- label: k,
16
- defaultFontSize: m = 16,
17
- defaultFontWeight: v = "normal"
11
+ onChange: f,
12
+ label: v,
13
+ defaultFontSize: i = 16,
14
+ defaultFontWeight: N = "normal"
18
15
  }) {
19
- const [d, f] = b(!1), [y, i] = b(!1), [u, c] = b(!1), g = C(null), t = {
20
- fontSize: l?.fontSize ?? m,
21
- fontWeight: l?.fontWeight ?? v,
16
+ const [d, u] = m(!1), [x, c] = m(!1), [h, g] = m(!1), b = S(null), t = {
17
+ fontSize: l?.fontSize ?? i,
18
+ fontWeight: l?.fontWeight ?? N,
22
19
  color: l?.color ?? "",
23
20
  effect: l?.effect ?? "none",
24
21
  effectColor: l?.effectColor ?? "#000000",
25
22
  effectIntensity: l?.effectIntensity ?? 50
26
23
  };
27
- S(() => {
24
+ z(() => {
28
25
  function r(n) {
29
- g.current && !g.current.contains(n.target) && (f(!1), i(!1), c(!1));
26
+ b.current && !b.current.contains(n.target) && (u(!1), c(!1), g(!1));
30
27
  }
31
28
  return document.addEventListener("mousedown", r), () => document.removeEventListener("mousedown", r);
32
29
  }, []);
33
- const o = (r) => {
34
- p({ ...t, ...r });
35
- }, h = (r) => {
36
- const n = Math.max(8, Math.min(200, (t.fontSize || m) + r));
30
+ const o = y((r) => {
31
+ f({ ...t, ...r });
32
+ }, [t, f]), p = y((r) => {
33
+ const n = Math.max(8, Math.min(200, (t.fontSize || i) + r));
37
34
  o({ fontSize: n });
38
- }, N = (r) => {
35
+ }, [t.fontSize, i, o]), w = y((r) => {
39
36
  const n = parseInt(r.target.value, 10);
40
37
  !isNaN(n) && n >= 8 && n <= 200 && o({ fontSize: n });
41
- }, w = E(t);
42
- return /* @__PURE__ */ a("div", { ref: g, className: "relative", children: [
43
- /* @__PURE__ */ e("div", { className: "flex items-center justify-between mb-1", children: /* @__PURE__ */ e("span", { className: "text-xs font-medium text-gray-600 dark:text-gray-400", children: k }) }),
38
+ }, [o]), C = M(t);
39
+ return /* @__PURE__ */ a("div", { ref: b, className: "relative", children: [
40
+ /* @__PURE__ */ e("div", { className: "flex items-center justify-between mb-1", children: /* @__PURE__ */ e("span", { className: "text-xs font-medium text-gray-600 dark:text-gray-400", children: v }) }),
44
41
  /* @__PURE__ */ a(
45
42
  "button",
46
43
  {
47
44
  type: "button",
48
- onClick: () => f(!d),
45
+ onClick: () => u(!d),
49
46
  className: s(
50
47
  "w-full flex items-center justify-between px-3 py-2 rounded-lg border transition-all cursor-pointer",
51
48
  "bg-white dark:bg-gray-800 border-gray-200 dark:border-gray-600",
@@ -61,10 +58,10 @@ function B({
61
58
  fontSize: `${Math.min(t.fontSize || 16, 18)}px`,
62
59
  fontWeight: t.fontWeight === "bold" ? 700 : t.fontWeight === "semibold" ? 600 : 400
63
60
  },
64
- children: w
61
+ children: C
65
62
  }
66
63
  ),
67
- d ? /* @__PURE__ */ e(W, { className: "w-4 h-4 text-gray-400" }) : /* @__PURE__ */ e(P, { className: "w-4 h-4 text-gray-400" })
64
+ d ? /* @__PURE__ */ e(I, { className: "w-4 h-4 text-gray-400" }) : /* @__PURE__ */ e(E, { className: "w-4 h-4 text-gray-400" })
68
65
  ]
69
66
  }
70
67
  ),
@@ -76,9 +73,9 @@ function B({
76
73
  "button",
77
74
  {
78
75
  type: "button",
79
- onClick: () => h(-2),
76
+ onClick: () => p(-2),
80
77
  className: "p-2 rounded-lg bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors cursor-pointer",
81
- children: /* @__PURE__ */ e(M, { className: "w-4 h-4" })
78
+ children: /* @__PURE__ */ e(W, { className: "w-4 h-4" })
82
79
  }
83
80
  ),
84
81
  /* @__PURE__ */ e(
@@ -86,7 +83,7 @@ function B({
86
83
  {
87
84
  type: "number",
88
85
  value: t.fontSize,
89
- onChange: N,
86
+ onChange: w,
90
87
  min: 8,
91
88
  max: 200,
92
89
  className: s(
@@ -102,9 +99,9 @@ function B({
102
99
  "button",
103
100
  {
104
101
  type: "button",
105
- onClick: () => h(2),
102
+ onClick: () => p(2),
106
103
  className: "p-2 rounded-lg bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors cursor-pointer",
107
- children: /* @__PURE__ */ e(j, { className: "w-4 h-4" })
104
+ children: /* @__PURE__ */ e(P, { className: "w-4 h-4" })
108
105
  }
109
106
  ),
110
107
  /* @__PURE__ */ e("span", { className: "text-xs text-gray-400 ml-1", children: "px" })
@@ -112,7 +109,7 @@ function B({
112
109
  ] }),
113
110
  /* @__PURE__ */ a("div", { children: [
114
111
  /* @__PURE__ */ e("label", { className: "block text-xs font-medium text-gray-500 dark:text-gray-400 mb-2", children: "Peso" }),
115
- /* @__PURE__ */ e("div", { className: "flex flex-wrap gap-1", children: L.map((r) => /* @__PURE__ */ e(
112
+ /* @__PURE__ */ e("div", { className: "flex flex-wrap gap-1", children: O.map((r) => /* @__PURE__ */ e(
116
113
  "button",
117
114
  {
118
115
  type: "button",
@@ -121,7 +118,7 @@ function B({
121
118
  "px-3 py-1.5 text-xs font-medium rounded-lg transition-all cursor-pointer",
122
119
  t.fontWeight === r ? "bg-blue-500 text-white" : "bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-600"
123
120
  ),
124
- children: z[r]
121
+ children: j[r]
125
122
  },
126
123
  r
127
124
  )) })
@@ -133,7 +130,7 @@ function B({
133
130
  {
134
131
  type: "button",
135
132
  onClick: () => {
136
- i(!y), c(!1);
133
+ c(!x), g(!1);
137
134
  },
138
135
  className: s(
139
136
  "w-full flex items-center gap-2 px-3 py-2 rounded-lg border cursor-pointer",
@@ -152,9 +149,9 @@ function B({
152
149
  ]
153
150
  }
154
151
  ),
155
- y && /* @__PURE__ */ a("div", { className: "absolute z-10 mt-2 p-3 bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-600", children: [
152
+ x && /* @__PURE__ */ a("div", { className: "absolute z-10 mt-2 p-3 bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-600", children: [
156
153
  /* @__PURE__ */ e(
157
- x,
154
+ k,
158
155
  {
159
156
  color: t.color || "#000000",
160
157
  onChange: (r) => o({ color: r })
@@ -173,7 +170,7 @@ function B({
173
170
  ] }),
174
171
  /* @__PURE__ */ a("div", { children: [
175
172
  /* @__PURE__ */ e("label", { className: "block text-xs font-medium text-gray-500 dark:text-gray-400 mb-2", children: "Efeito" }),
176
- /* @__PURE__ */ e("div", { className: "flex flex-wrap gap-1", children: O.map((r) => /* @__PURE__ */ e(
173
+ /* @__PURE__ */ e("div", { className: "flex flex-wrap gap-1", children: T.map((r) => /* @__PURE__ */ e(
177
174
  "button",
178
175
  {
179
176
  type: "button",
@@ -182,7 +179,7 @@ function B({
182
179
  "px-3 py-1.5 text-xs font-medium rounded-lg transition-all cursor-pointer",
183
180
  t.effect === r ? "bg-blue-500 text-white" : "bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-600"
184
181
  ),
185
- children: I[r]
182
+ children: L[r]
186
183
  },
187
184
  r
188
185
  )) })
@@ -195,7 +192,7 @@ function B({
195
192
  {
196
193
  type: "button",
197
194
  onClick: () => {
198
- c(!u), i(!1);
195
+ g(!h), c(!1);
199
196
  },
200
197
  className: s(
201
198
  "w-full flex items-center gap-2 px-3 py-2 rounded-lg border cursor-pointer",
@@ -214,8 +211,8 @@ function B({
214
211
  ]
215
212
  }
216
213
  ),
217
- u && /* @__PURE__ */ e("div", { className: "absolute z-10 mt-2 p-3 bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-600", children: /* @__PURE__ */ e(
218
- x,
214
+ h && /* @__PURE__ */ e("div", { className: "absolute z-10 mt-2 p-3 bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-600", children: /* @__PURE__ */ e(
215
+ k,
219
216
  {
220
217
  color: t.effectColor || "#000000",
221
218
  onChange: (r) => o({ effectColor: r })
@@ -1 +1 @@
1
- {"version":3,"file":"TypographyInput.js","sources":["../../../../src/editor/PropertyEditor/inputs/TypographyInput.tsx"],"sourcesContent":["/**\n * TypographyInput - Editor de tipografia composto\n * Permite customizar: tamanho, peso, cor e efeitos de texto\n */\n\nimport { useState, useRef, useEffect } from 'react';\nimport { HexColorPicker } from 'react-colorful';\nimport { ChevronDown, ChevronUp, Minus, Plus } from 'lucide-react';\nimport { cn } from '../../../utils/cn';\nimport {\n TypographyConfig,\n FontWeight,\n TextEffect,\n fontWeightLabels,\n textEffectLabels,\n generateTypographySummary,\n} from '../../../engine/shared/typography';\n\ninterface TypographyInputProps {\n value: TypographyConfig | undefined;\n onChange: (value: TypographyConfig) => void;\n label: string;\n defaultFontSize?: number;\n defaultFontWeight?: FontWeight;\n}\n\nconst fontWeights: FontWeight[] = ['light', 'normal', 'medium', 'semibold', 'bold'];\nconst textEffects: TextEffect[] = ['none', 'shadow', 'glow', 'outline', 'gradient'];\n\nexport function TypographyInput({\n value,\n onChange,\n label,\n defaultFontSize = 16,\n defaultFontWeight = 'normal',\n}: TypographyInputProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [showColorPicker, setShowColorPicker] = useState(false);\n const [showEffectColorPicker, setShowEffectColorPicker] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const config: TypographyConfig = {\n fontSize: value?.fontSize ?? defaultFontSize,\n fontWeight: value?.fontWeight ?? defaultFontWeight,\n color: value?.color ?? '',\n effect: value?.effect ?? 'none',\n effectColor: value?.effectColor ?? '#000000',\n effectIntensity: value?.effectIntensity ?? 50,\n };\n\n // Fecha ao clicar fora\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n setShowColorPicker(false);\n setShowEffectColorPicker(false);\n }\n }\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const updateConfig = (updates: Partial<TypographyConfig>) => {\n onChange({ ...config, ...updates });\n };\n\n const handleFontSizeChange = (delta: number) => {\n const newSize = Math.max(8, Math.min(200, (config.fontSize || defaultFontSize) + delta));\n updateConfig({ fontSize: newSize });\n };\n\n const handleFontSizeInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = parseInt(e.target.value, 10);\n if (!isNaN(val) && val >= 8 && val <= 200) {\n updateConfig({ fontSize: val });\n }\n };\n\n const summary = generateTypographySummary(config);\n\n return (\n <div ref={containerRef} className=\"relative\">\n {/* Label e botão de toggle */}\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-xs font-medium text-gray-600 dark:text-gray-400\">\n {label}\n </span>\n </div>\n\n {/* Trigger button */}\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n \"w-full flex items-center justify-between px-3 py-2 rounded-lg border transition-all cursor-pointer\",\n \"bg-white dark:bg-gray-800 border-gray-200 dark:border-gray-600\",\n \"hover:border-blue-400 dark:hover:border-blue-500\",\n isOpen && \"border-blue-500 ring-1 ring-blue-500\"\n )}\n >\n <span\n className=\"text-sm font-medium text-gray-700 dark:text-gray-200\"\n style={{\n fontSize: `${Math.min(config.fontSize || 16, 18)}px`,\n fontWeight: config.fontWeight === 'bold' ? 700 : config.fontWeight === 'semibold' ? 600 : 400,\n }}\n >\n {summary}\n </span>\n {isOpen ? (\n <ChevronUp className=\"w-4 h-4 text-gray-400\" />\n ) : (\n <ChevronDown className=\"w-4 h-4 text-gray-400\" />\n )}\n </button>\n\n {/* Popover */}\n {isOpen && (\n <div className=\"absolute z-50 mt-2 w-full bg-white dark:bg-gray-800 rounded-xl shadow-xl border border-gray-200 dark:border-gray-600 p-4 space-y-4 max-h-[400px] overflow-y-auto\">\n {/* Tamanho da fonte - estilo RichText */}\n <div>\n <label className=\"block text-xs font-medium text-gray-500 dark:text-gray-400 mb-2\">\n Tamanho\n </label>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => handleFontSizeChange(-2)}\n className=\"p-2 rounded-lg bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors cursor-pointer\"\n >\n <Minus className=\"w-4 h-4\" />\n </button>\n <input\n type=\"number\"\n value={config.fontSize}\n onChange={handleFontSizeInput}\n min={8}\n max={200}\n className={cn(\n \"w-20 text-center py-2 rounded-lg border\",\n \"bg-gray-50 dark:bg-gray-700 border-gray-200 dark:border-gray-600\",\n \"text-lg font-semibold text-gray-800 dark:text-gray-100\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500\"\n )}\n style={{ fontSize: `${Math.min(config.fontSize || 16, 24)}px` }}\n />\n <button\n type=\"button\"\n onClick={() => handleFontSizeChange(2)}\n className=\"p-2 rounded-lg bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors cursor-pointer\"\n >\n <Plus className=\"w-4 h-4\" />\n </button>\n <span className=\"text-xs text-gray-400 ml-1\">px</span>\n </div>\n </div>\n\n {/* Peso da fonte */}\n <div>\n <label className=\"block text-xs font-medium text-gray-500 dark:text-gray-400 mb-2\">\n Peso\n </label>\n <div className=\"flex flex-wrap gap-1\">\n {fontWeights.map((weight) => (\n <button\n key={weight}\n type=\"button\"\n onClick={() => updateConfig({ fontWeight: weight })}\n className={cn(\n \"px-3 py-1.5 text-xs font-medium rounded-lg transition-all cursor-pointer\",\n config.fontWeight === weight\n ? \"bg-blue-500 text-white\"\n : \"bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-600\"\n )}\n >\n {fontWeightLabels[weight]}\n </button>\n ))}\n </div>\n </div>\n\n {/* Cor do texto */}\n <div className=\"relative\">\n <label className=\"block text-xs font-medium text-gray-500 dark:text-gray-400 mb-2\">\n Cor\n </label>\n <button\n type=\"button\"\n onClick={() => {\n setShowColorPicker(!showColorPicker);\n setShowEffectColorPicker(false);\n }}\n className={cn(\n \"w-full flex items-center gap-2 px-3 py-2 rounded-lg border cursor-pointer\",\n \"bg-gray-50 dark:bg-gray-700 border-gray-200 dark:border-gray-600\",\n \"hover:border-blue-400 transition-colors\"\n )}\n >\n <div\n className=\"w-6 h-6 rounded border border-gray-300 dark:border-gray-500\"\n style={{ backgroundColor: config.color || 'transparent' }}\n />\n <span className=\"text-sm text-gray-600 dark:text-gray-300\">\n {config.color || 'Padrão do tema'}\n </span>\n </button>\n {showColorPicker && (\n <div className=\"absolute z-10 mt-2 p-3 bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-600\">\n <HexColorPicker\n color={config.color || '#000000'}\n onChange={(color) => updateConfig({ color })}\n />\n <button\n type=\"button\"\n onClick={() => updateConfig({ color: undefined })}\n className=\"w-full mt-2 px-3 py-1.5 text-xs text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 cursor-pointer\"\n >\n Usar cor do tema\n </button>\n </div>\n )}\n </div>\n\n {/* Efeito */}\n <div>\n <label className=\"block text-xs font-medium text-gray-500 dark:text-gray-400 mb-2\">\n Efeito\n </label>\n <div className=\"flex flex-wrap gap-1\">\n {textEffects.map((effect) => (\n <button\n key={effect}\n type=\"button\"\n onClick={() => updateConfig({ effect })}\n className={cn(\n \"px-3 py-1.5 text-xs font-medium rounded-lg transition-all cursor-pointer\",\n config.effect === effect\n ? \"bg-blue-500 text-white\"\n : \"bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-600\"\n )}\n >\n {textEffectLabels[effect]}\n </button>\n ))}\n </div>\n </div>\n\n {/* Configurações do efeito (se não for 'none') */}\n {config.effect && config.effect !== 'none' && (\n <div className=\"space-y-3 pt-2 border-t border-gray-200 dark:border-gray-600\">\n {/* Cor do efeito */}\n <div className=\"relative\">\n <label className=\"block text-xs font-medium text-gray-500 dark:text-gray-400 mb-2\">\n {config.effect === 'gradient' ? 'Segunda Cor' : 'Cor do Efeito'}\n </label>\n <button\n type=\"button\"\n onClick={() => {\n setShowEffectColorPicker(!showEffectColorPicker);\n setShowColorPicker(false);\n }}\n className={cn(\n \"w-full flex items-center gap-2 px-3 py-2 rounded-lg border cursor-pointer\",\n \"bg-gray-50 dark:bg-gray-700 border-gray-200 dark:border-gray-600\",\n \"hover:border-blue-400 transition-colors\"\n )}\n >\n <div\n className=\"w-6 h-6 rounded border border-gray-300 dark:border-gray-500\"\n style={{ backgroundColor: config.effectColor || '#000000' }}\n />\n <span className=\"text-sm text-gray-600 dark:text-gray-300\">\n {config.effectColor || '#000000'}\n </span>\n </button>\n {showEffectColorPicker && (\n <div className=\"absolute z-10 mt-2 p-3 bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-600\">\n <HexColorPicker\n color={config.effectColor || '#000000'}\n onChange={(color) => updateConfig({ effectColor: color })}\n />\n </div>\n )}\n </div>\n\n {/* Intensidade do efeito */}\n <div>\n <label className=\"block text-xs font-medium text-gray-500 dark:text-gray-400 mb-2\">\n Intensidade: {config.effectIntensity}%\n </label>\n <input\n type=\"range\"\n min={0}\n max={100}\n step={10}\n value={config.effectIntensity}\n onChange={(e) => updateConfig({ effectIntensity: parseInt(e.target.value, 10) })}\n className=\"w-full h-2 bg-gray-200 dark:bg-gray-700 rounded-lg appearance-none cursor-pointer accent-blue-500\"\n />\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["fontWeights","textEffects","TypographyInput","value","onChange","label","defaultFontSize","defaultFontWeight","isOpen","setIsOpen","useState","showColorPicker","setShowColorPicker","showEffectColorPicker","setShowEffectColorPicker","containerRef","useRef","config","useEffect","handleClickOutside","event","updateConfig","updates","handleFontSizeChange","delta","newSize","handleFontSizeInput","e","val","summary","generateTypographySummary","jsxs","jsx","cn","ChevronUp","ChevronDown","Minus","Plus","weight","HexColorPicker","color","effect"],"mappings":";;;;;;;;;;AA0BA,MAAMA,IAA4B,CAAC,SAAS,UAAU,UAAU,YAAY,MAAM,GAC5EC,IAA4B,CAAC,QAAQ,UAAU,QAAQ,WAAW,UAAU;AAE3E,SAASC,EAAgB;AAAA,EAC9B,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,mBAAAC,IAAoB;AACtB,GAAyB;AACvB,QAAM,CAACC,GAAQC,CAAS,IAAIC,EAAS,EAAK,GACpC,CAACC,GAAiBC,CAAkB,IAAIF,EAAS,EAAK,GACtD,CAACG,GAAuBC,CAAwB,IAAIJ,EAAS,EAAK,GAClEK,IAAeC,EAAuB,IAAI,GAE1CC,IAA2B;AAAA,IAC/B,UAAUd,GAAO,YAAYG;AAAA,IAC7B,YAAYH,GAAO,cAAcI;AAAA,IACjC,OAAOJ,GAAO,SAAS;AAAA,IACvB,QAAQA,GAAO,UAAU;AAAA,IACzB,aAAaA,GAAO,eAAe;AAAA,IACnC,iBAAiBA,GAAO,mBAAmB;AAAA,EAAA;AAI7C,EAAAe,EAAU,MAAM;AACd,aAASC,EAAmBC,GAAmB;AAC7C,MAAIL,EAAa,WAAW,CAACA,EAAa,QAAQ,SAASK,EAAM,MAAc,MAC7EX,EAAU,EAAK,GACfG,EAAmB,EAAK,GACxBE,EAAyB,EAAK;AAAA,IAElC;AACA,oBAAS,iBAAiB,aAAaK,CAAkB,GAClD,MAAM,SAAS,oBAAoB,aAAaA,CAAkB;AAAA,EAC3E,GAAG,CAAA,CAAE;AAEL,QAAME,IAAe,CAACC,MAAuC;AAC3D,IAAAlB,EAAS,EAAE,GAAGa,GAAQ,GAAGK,GAAS;AAAA,EACpC,GAEMC,IAAuB,CAACC,MAAkB;AAC9C,UAAMC,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI,MAAMR,EAAO,YAAYX,KAAmBkB,CAAK,CAAC;AACvF,IAAAH,EAAa,EAAE,UAAUI,GAAS;AAAA,EACpC,GAEMC,IAAsB,CAACC,MAA2C;AACtE,UAAMC,IAAM,SAASD,EAAE,OAAO,OAAO,EAAE;AACvC,IAAI,CAAC,MAAMC,CAAG,KAAKA,KAAO,KAAKA,KAAO,OACpCP,EAAa,EAAE,UAAUO,GAAK;AAAA,EAElC,GAEMC,IAAUC,EAA0Bb,CAAM;AAEhD,SACE,gBAAAc,EAAC,OAAA,EAAI,KAAKhB,GAAc,WAAU,YAEhC,UAAA;AAAA,IAAA,gBAAAiB,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA,gBAAAA,EAAC,UAAK,WAAU,wDACb,aACH,EAAA,CACF;AAAA,IAGA,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAMtB,EAAU,CAACD,CAAM;AAAA,QAChC,WAAWyB;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACAzB,KAAU;AAAA,QAAA;AAAA,QAGZ,UAAA;AAAA,UAAA,gBAAAwB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,UAAU,GAAG,KAAK,IAAIf,EAAO,YAAY,IAAI,EAAE,CAAC;AAAA,gBAChD,YAAYA,EAAO,eAAe,SAAS,MAAMA,EAAO,eAAe,aAAa,MAAM;AAAA,cAAA;AAAA,cAG3F,UAAAY;AAAA,YAAA;AAAA,UAAA;AAAA,UAEFrB,sBACE0B,GAAA,EAAU,WAAU,yBAAwB,IAE7C,gBAAAF,EAACG,GAAA,EAAY,WAAU,wBAAA,CAAwB;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAKlD3B,KACC,gBAAAuB,EAAC,OAAA,EAAI,WAAU,oKAEb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAC,EAAC,SAAA,EAAM,WAAU,mEAAkE,UAAA,WAEnF;AAAA,QACA,gBAAAD,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAMT,EAAqB,EAAE;AAAA,cACtC,WAAU;AAAA,cAEV,UAAA,gBAAAS,EAACI,GAAA,EAAM,WAAU,UAAA,CAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAE7B,gBAAAJ;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOf,EAAO;AAAA,cACd,UAAUS;AAAA,cACV,KAAK;AAAA,cACL,KAAK;AAAA,cACL,WAAWO;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA;AAAA,cAEF,OAAO,EAAE,UAAU,GAAG,KAAK,IAAIhB,EAAO,YAAY,IAAI,EAAE,CAAC,KAAA;AAAA,YAAK;AAAA,UAAA;AAAA,UAEhE,gBAAAe;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAMT,EAAqB,CAAC;AAAA,cACrC,WAAU;AAAA,cAEV,UAAA,gBAAAS,EAACK,GAAA,EAAK,WAAU,UAAA,CAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAE5B,gBAAAL,EAAC,QAAA,EAAK,WAAU,8BAA6B,UAAA,KAAA,CAAE;AAAA,QAAA,EAAA,CACjD;AAAA,MAAA,GACF;AAAA,wBAGC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,mEAAkE,UAAA,QAEnF;AAAA,0BACC,OAAA,EAAI,WAAU,wBACZ,UAAAhC,EAAY,IAAI,CAACsC,MAChB,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,SAAS,MAAMX,EAAa,EAAE,YAAYiB,GAAQ;AAAA,YAClD,WAAWL;AAAA,cACT;AAAA,cACAhB,EAAO,eAAeqB,IAClB,2BACA;AAAA,YAAA;AAAA,YAGL,YAAiBA,CAAM;AAAA,UAAA;AAAA,UAVnBA;AAAA,QAAA,CAYR,EAAA,CACH;AAAA,MAAA,GACF;AAAA,MAGA,gBAAAP,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,QAAA,gBAAAC,EAAC,SAAA,EAAM,WAAU,mEAAkE,UAAA,OAEnF;AAAA,QACA,gBAAAD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AACb,cAAAnB,EAAmB,CAACD,CAAe,GACnCG,EAAyB,EAAK;AAAA,YAChC;AAAA,YACA,WAAWmB;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,YAGF,UAAA;AAAA,cAAA,gBAAAD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO,EAAE,iBAAiBf,EAAO,SAAS,cAAA;AAAA,gBAAc;AAAA,cAAA;AAAA,gCAEzD,QAAA,EAAK,WAAU,4CACb,UAAAA,EAAO,SAAS,iBAAA,CACnB;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAEDN,KACC,gBAAAoB,EAAC,OAAA,EAAI,WAAU,qHACb,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAACO;AAAAA,YAAA;AAAA,cACC,OAAOtB,EAAO,SAAS;AAAA,cACvB,UAAU,CAACuB,MAAUnB,EAAa,EAAE,OAAAmB,GAAO;AAAA,YAAA;AAAA,UAAA;AAAA,UAE7C,gBAAAR;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAMX,EAAa,EAAE,OAAO,QAAW;AAAA,cAChD,WAAU;AAAA,cACX,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,EAAA,CACF;AAAA,MAAA,GAEJ;AAAA,wBAGC,OAAA,EACC,UAAA;AAAA,QAAA,gBAAAW,EAAC,SAAA,EAAM,WAAU,mEAAkE,UAAA,UAEnF;AAAA,0BACC,OAAA,EAAI,WAAU,wBACZ,UAAA/B,EAAY,IAAI,CAACwC,MAChB,gBAAAT;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,SAAS,MAAMX,EAAa,EAAE,QAAAoB,GAAQ;AAAA,YACtC,WAAWR;AAAA,cACT;AAAA,cACAhB,EAAO,WAAWwB,IACd,2BACA;AAAA,YAAA;AAAA,YAGL,YAAiBA,CAAM;AAAA,UAAA;AAAA,UAVnBA;AAAA,QAAA,CAYR,EAAA,CACH;AAAA,MAAA,GACF;AAAA,MAGCxB,EAAO,UAAUA,EAAO,WAAW,UAClC,gBAAAc,EAAC,OAAA,EAAI,WAAU,gEAEb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,UAAA,gBAAAC,EAAC,WAAM,WAAU,mEACd,YAAO,WAAW,aAAa,gBAAgB,gBAAA,CAClD;AAAA,UACA,gBAAAD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM;AACb,gBAAAjB,EAAyB,CAACD,CAAqB,GAC/CD,EAAmB,EAAK;AAAA,cAC1B;AAAA,cACA,WAAWqB;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA;AAAA,cAGF,UAAA;AAAA,gBAAA,gBAAAD;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO,EAAE,iBAAiBf,EAAO,eAAe,UAAA;AAAA,kBAAU;AAAA,gBAAA;AAAA,kCAE3D,QAAA,EAAK,WAAU,4CACb,UAAAA,EAAO,eAAe,UAAA,CACzB;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEDJ,KACC,gBAAAmB,EAAC,OAAA,EAAI,WAAU,qHACb,UAAA,gBAAAA;AAAA,YAACO;AAAAA,YAAA;AAAA,cACC,OAAOtB,EAAO,eAAe;AAAA,cAC7B,UAAU,CAACuB,MAAUnB,EAAa,EAAE,aAAamB,GAAO;AAAA,YAAA;AAAA,UAAA,EAC1D,CACF;AAAA,QAAA,GAEJ;AAAA,0BAGC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAT,EAAC,SAAA,EAAM,WAAU,mEAAkE,UAAA;AAAA,YAAA;AAAA,YACnEd,EAAO;AAAA,YAAgB;AAAA,UAAA,GACvC;AAAA,UACA,gBAAAe;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,cACL,MAAM;AAAA,cACN,OAAOf,EAAO;AAAA,cACd,UAAU,CAACU,MAAMN,EAAa,EAAE,iBAAiB,SAASM,EAAE,OAAO,OAAO,EAAE,EAAA,CAAG;AAAA,cAC/E,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,EAAA,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GAEJ;AAEJ;"}
1
+ {"version":3,"file":"TypographyInput.js","sources":["../../../../src/editor/PropertyEditor/inputs/TypographyInput.tsx"],"sourcesContent":["/**\n * TypographyInput - Editor de tipografia composto\n * Permite customizar: tamanho, peso, cor e efeitos de texto\n */\n\nimport { useState, useRef, useEffect, useCallback } from 'react';\nimport { HexColorPicker } from 'react-colorful';\nimport { ChevronDown, ChevronUp, Minus, Plus } from 'lucide-react';\nimport { cn } from '../../../utils/cn';\nimport {\n TypographyConfig,\n FontWeight,\n TextEffect,\n fontWeightLabels,\n textEffectLabels,\n generateTypographySummary,\n} from '../../../engine/shared/typography';\n\ninterface TypographyInputProps {\n value: TypographyConfig | undefined;\n onChange: (value: TypographyConfig) => void;\n label: string;\n defaultFontSize?: number;\n defaultFontWeight?: FontWeight;\n}\n\nconst fontWeights: FontWeight[] = ['light', 'normal', 'medium', 'semibold', 'bold'];\nconst textEffects: TextEffect[] = ['none', 'shadow', 'glow', 'outline', 'gradient'];\n\nexport function TypographyInput({\n value,\n onChange,\n label,\n defaultFontSize = 16,\n defaultFontWeight = 'normal',\n}: TypographyInputProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [showColorPicker, setShowColorPicker] = useState(false);\n const [showEffectColorPicker, setShowEffectColorPicker] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const config: TypographyConfig = {\n fontSize: value?.fontSize ?? defaultFontSize,\n fontWeight: value?.fontWeight ?? defaultFontWeight,\n color: value?.color ?? '',\n effect: value?.effect ?? 'none',\n effectColor: value?.effectColor ?? '#000000',\n effectIntensity: value?.effectIntensity ?? 50,\n };\n\n // Fecha ao clicar fora\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n setShowColorPicker(false);\n setShowEffectColorPicker(false);\n }\n }\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const updateConfig = useCallback((updates: Partial<TypographyConfig>) => {\n onChange({ ...config, ...updates });\n }, [config, onChange]);\n\n const handleFontSizeChange = useCallback((delta: number) => {\n const newSize = Math.max(8, Math.min(200, (config.fontSize || defaultFontSize) + delta));\n updateConfig({ fontSize: newSize });\n }, [config.fontSize, defaultFontSize, updateConfig]);\n\n const handleFontSizeInput = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const val = parseInt(e.target.value, 10);\n if (!isNaN(val) && val >= 8 && val <= 200) {\n updateConfig({ fontSize: val });\n }\n }, [updateConfig]);\n\n const summary = generateTypographySummary(config);\n\n return (\n <div ref={containerRef} className=\"relative\">\n {/* Label e botão de toggle */}\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-xs font-medium text-gray-600 dark:text-gray-400\">\n {label}\n </span>\n </div>\n\n {/* Trigger button */}\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n \"w-full flex items-center justify-between px-3 py-2 rounded-lg border transition-all cursor-pointer\",\n \"bg-white dark:bg-gray-800 border-gray-200 dark:border-gray-600\",\n \"hover:border-blue-400 dark:hover:border-blue-500\",\n isOpen && \"border-blue-500 ring-1 ring-blue-500\"\n )}\n >\n <span\n className=\"text-sm font-medium text-gray-700 dark:text-gray-200\"\n style={{\n fontSize: `${Math.min(config.fontSize || 16, 18)}px`,\n fontWeight: config.fontWeight === 'bold' ? 700 : config.fontWeight === 'semibold' ? 600 : 400,\n }}\n >\n {summary}\n </span>\n {isOpen ? (\n <ChevronUp className=\"w-4 h-4 text-gray-400\" />\n ) : (\n <ChevronDown className=\"w-4 h-4 text-gray-400\" />\n )}\n </button>\n\n {/* Popover */}\n {isOpen && (\n <div className=\"absolute z-50 mt-2 w-full bg-white dark:bg-gray-800 rounded-xl shadow-xl border border-gray-200 dark:border-gray-600 p-4 space-y-4 max-h-[400px] overflow-y-auto\">\n {/* Tamanho da fonte - estilo RichText */}\n <div>\n <label className=\"block text-xs font-medium text-gray-500 dark:text-gray-400 mb-2\">\n Tamanho\n </label>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => handleFontSizeChange(-2)}\n className=\"p-2 rounded-lg bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors cursor-pointer\"\n >\n <Minus className=\"w-4 h-4\" />\n </button>\n <input\n type=\"number\"\n value={config.fontSize}\n onChange={handleFontSizeInput}\n min={8}\n max={200}\n className={cn(\n \"w-20 text-center py-2 rounded-lg border\",\n \"bg-gray-50 dark:bg-gray-700 border-gray-200 dark:border-gray-600\",\n \"text-lg font-semibold text-gray-800 dark:text-gray-100\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500\"\n )}\n style={{ fontSize: `${Math.min(config.fontSize || 16, 24)}px` }}\n />\n <button\n type=\"button\"\n onClick={() => handleFontSizeChange(2)}\n className=\"p-2 rounded-lg bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors cursor-pointer\"\n >\n <Plus className=\"w-4 h-4\" />\n </button>\n <span className=\"text-xs text-gray-400 ml-1\">px</span>\n </div>\n </div>\n\n {/* Peso da fonte */}\n <div>\n <label className=\"block text-xs font-medium text-gray-500 dark:text-gray-400 mb-2\">\n Peso\n </label>\n <div className=\"flex flex-wrap gap-1\">\n {fontWeights.map((weight) => (\n <button\n key={weight}\n type=\"button\"\n onClick={() => updateConfig({ fontWeight: weight })}\n className={cn(\n \"px-3 py-1.5 text-xs font-medium rounded-lg transition-all cursor-pointer\",\n config.fontWeight === weight\n ? \"bg-blue-500 text-white\"\n : \"bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-600\"\n )}\n >\n {fontWeightLabels[weight]}\n </button>\n ))}\n </div>\n </div>\n\n {/* Cor do texto */}\n <div className=\"relative\">\n <label className=\"block text-xs font-medium text-gray-500 dark:text-gray-400 mb-2\">\n Cor\n </label>\n <button\n type=\"button\"\n onClick={() => {\n setShowColorPicker(!showColorPicker);\n setShowEffectColorPicker(false);\n }}\n className={cn(\n \"w-full flex items-center gap-2 px-3 py-2 rounded-lg border cursor-pointer\",\n \"bg-gray-50 dark:bg-gray-700 border-gray-200 dark:border-gray-600\",\n \"hover:border-blue-400 transition-colors\"\n )}\n >\n <div\n className=\"w-6 h-6 rounded border border-gray-300 dark:border-gray-500\"\n style={{ backgroundColor: config.color || 'transparent' }}\n />\n <span className=\"text-sm text-gray-600 dark:text-gray-300\">\n {config.color || 'Padrão do tema'}\n </span>\n </button>\n {showColorPicker && (\n <div className=\"absolute z-10 mt-2 p-3 bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-600\">\n <HexColorPicker\n color={config.color || '#000000'}\n onChange={(color) => updateConfig({ color })}\n />\n <button\n type=\"button\"\n onClick={() => updateConfig({ color: undefined })}\n className=\"w-full mt-2 px-3 py-1.5 text-xs text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 cursor-pointer\"\n >\n Usar cor do tema\n </button>\n </div>\n )}\n </div>\n\n {/* Efeito */}\n <div>\n <label className=\"block text-xs font-medium text-gray-500 dark:text-gray-400 mb-2\">\n Efeito\n </label>\n <div className=\"flex flex-wrap gap-1\">\n {textEffects.map((effect) => (\n <button\n key={effect}\n type=\"button\"\n onClick={() => updateConfig({ effect })}\n className={cn(\n \"px-3 py-1.5 text-xs font-medium rounded-lg transition-all cursor-pointer\",\n config.effect === effect\n ? \"bg-blue-500 text-white\"\n : \"bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-600\"\n )}\n >\n {textEffectLabels[effect]}\n </button>\n ))}\n </div>\n </div>\n\n {/* Configurações do efeito (se não for 'none') */}\n {config.effect && config.effect !== 'none' && (\n <div className=\"space-y-3 pt-2 border-t border-gray-200 dark:border-gray-600\">\n {/* Cor do efeito */}\n <div className=\"relative\">\n <label className=\"block text-xs font-medium text-gray-500 dark:text-gray-400 mb-2\">\n {config.effect === 'gradient' ? 'Segunda Cor' : 'Cor do Efeito'}\n </label>\n <button\n type=\"button\"\n onClick={() => {\n setShowEffectColorPicker(!showEffectColorPicker);\n setShowColorPicker(false);\n }}\n className={cn(\n \"w-full flex items-center gap-2 px-3 py-2 rounded-lg border cursor-pointer\",\n \"bg-gray-50 dark:bg-gray-700 border-gray-200 dark:border-gray-600\",\n \"hover:border-blue-400 transition-colors\"\n )}\n >\n <div\n className=\"w-6 h-6 rounded border border-gray-300 dark:border-gray-500\"\n style={{ backgroundColor: config.effectColor || '#000000' }}\n />\n <span className=\"text-sm text-gray-600 dark:text-gray-300\">\n {config.effectColor || '#000000'}\n </span>\n </button>\n {showEffectColorPicker && (\n <div className=\"absolute z-10 mt-2 p-3 bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-600\">\n <HexColorPicker\n color={config.effectColor || '#000000'}\n onChange={(color) => updateConfig({ effectColor: color })}\n />\n </div>\n )}\n </div>\n\n {/* Intensidade do efeito */}\n <div>\n <label className=\"block text-xs font-medium text-gray-500 dark:text-gray-400 mb-2\">\n Intensidade: {config.effectIntensity}%\n </label>\n <input\n type=\"range\"\n min={0}\n max={100}\n step={10}\n value={config.effectIntensity}\n onChange={(e) => updateConfig({ effectIntensity: parseInt(e.target.value, 10) })}\n className=\"w-full h-2 bg-gray-200 dark:bg-gray-700 rounded-lg appearance-none cursor-pointer accent-blue-500\"\n />\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["fontWeights","textEffects","TypographyInput","value","onChange","label","defaultFontSize","defaultFontWeight","isOpen","setIsOpen","useState","showColorPicker","setShowColorPicker","showEffectColorPicker","setShowEffectColorPicker","containerRef","useRef","config","useEffect","handleClickOutside","event","updateConfig","useCallback","updates","handleFontSizeChange","delta","newSize","handleFontSizeInput","e","val","summary","generateTypographySummary","jsxs","jsx","cn","ChevronUp","ChevronDown","Minus","Plus","weight","HexColorPicker","color","effect"],"mappings":"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"}
@@ -10,4 +10,6 @@ export { ButtonGroupInput } from './ButtonGroupInput';
10
10
  export { IconGridInput } from './IconGridInput';
11
11
  export { ImageGridInput } from './ImageGridInput';
12
12
  export { TypographyInput } from './TypographyInput';
13
+ export { ImageInput } from './ImageInput';
14
+ export { CarouselImagesInput } from './CarouselImagesInput';
13
15
  //# sourceMappingURL=index.d.ts.map