@sonordev/agency-site-kit 0.3.1 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (374) hide show
  1. package/README.md +302 -0
  2. package/bin/setup.mjs +79 -0
  3. package/dist/{chunk-RXBK2EOE.js → chunk-4IES23GV.js} +3 -3
  4. package/dist/{chunk-RXBK2EOE.js.map → chunk-4IES23GV.js.map} +1 -1
  5. package/dist/{chunk-WNR4KNG4.cjs → chunk-5MEZU3OG.cjs} +4 -4
  6. package/dist/{chunk-WNR4KNG4.cjs.map → chunk-5MEZU3OG.cjs.map} +1 -1
  7. package/dist/chunk-7D4H36UF.js +13 -0
  8. package/dist/chunk-7D4H36UF.js.map +1 -0
  9. package/dist/chunk-7ZHRMWJU.cjs +306 -0
  10. package/dist/chunk-7ZHRMWJU.cjs.map +1 -0
  11. package/dist/chunk-CVT7I5BQ.js +71 -0
  12. package/dist/chunk-CVT7I5BQ.js.map +1 -0
  13. package/dist/chunk-HQGAX2LI.cjs +8 -0
  14. package/dist/chunk-HQGAX2LI.cjs.map +1 -0
  15. package/dist/chunk-K2BGTDSN.js +45 -0
  16. package/dist/chunk-K2BGTDSN.js.map +1 -0
  17. package/dist/chunk-KXLROAO5.js +291 -0
  18. package/dist/chunk-KXLROAO5.js.map +1 -0
  19. package/dist/chunk-L4EOQVRJ.js +6 -0
  20. package/dist/chunk-L4EOQVRJ.js.map +1 -0
  21. package/dist/chunk-NI4FVCLS.cjs +32 -0
  22. package/dist/chunk-NI4FVCLS.cjs.map +1 -0
  23. package/dist/chunk-NLGUPJZA.js +507 -0
  24. package/dist/chunk-NLGUPJZA.js.map +1 -0
  25. package/dist/chunk-QDXZ27R7.js +33 -0
  26. package/dist/chunk-QDXZ27R7.js.map +1 -0
  27. package/dist/chunk-QGSW43TM.cjs +538 -0
  28. package/dist/chunk-QGSW43TM.cjs.map +1 -0
  29. package/dist/{chunk-TVFXN6W6.js → chunk-QL6KVIFR.js} +8 -4
  30. package/dist/chunk-QL6KVIFR.js.map +1 -0
  31. package/dist/chunk-RWQ675N6.js +165 -0
  32. package/dist/chunk-RWQ675N6.js.map +1 -0
  33. package/dist/chunk-UXUU7FVT.cjs +171 -0
  34. package/dist/chunk-UXUU7FVT.cjs.map +1 -0
  35. package/dist/chunk-XJ434N7I.js +30 -0
  36. package/dist/chunk-XJ434N7I.js.map +1 -0
  37. package/dist/{chunk-EE75WRCM.cjs → chunk-XOWSXZYW.cjs} +8 -4
  38. package/dist/chunk-XOWSXZYW.cjs.map +1 -0
  39. package/dist/chunk-ZBPF7TLZ.cjs +16 -0
  40. package/dist/chunk-ZBPF7TLZ.cjs.map +1 -0
  41. package/dist/chunk-ZINKVJQU.js +67 -0
  42. package/dist/chunk-ZINKVJQU.js.map +1 -0
  43. package/dist/index.cjs +53 -30
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.d.cts +17 -9
  46. package/dist/index.d.ts +17 -9
  47. package/dist/index.js +8 -9
  48. package/dist/index.js.map +1 -1
  49. package/dist/layout/index.cjs +3 -3
  50. package/dist/layout/index.d.cts +1 -1
  51. package/dist/layout/index.d.ts +1 -1
  52. package/dist/layout/index.js +2 -2
  53. package/dist/portfolio/client.cjs +376 -12
  54. package/dist/portfolio/client.cjs.map +1 -1
  55. package/dist/portfolio/client.d.cts +27 -85
  56. package/dist/portfolio/client.d.ts +27 -85
  57. package/dist/portfolio/client.js +182 -4
  58. package/dist/portfolio/client.js.map +1 -1
  59. package/dist/portfolio/components/PortfolioAnalytics.cjs +87 -0
  60. package/dist/portfolio/components/PortfolioAnalytics.cjs.map +1 -0
  61. package/dist/portfolio/components/PortfolioAnalytics.d.cts +5 -0
  62. package/dist/portfolio/components/PortfolioAnalytics.d.ts +5 -0
  63. package/dist/portfolio/components/PortfolioAnalytics.js +9 -0
  64. package/dist/portfolio/components/PortfolioAnalytics.js.map +1 -0
  65. package/dist/portfolio/components/PortfolioErrorFallback.cjs +65 -0
  66. package/dist/portfolio/components/PortfolioErrorFallback.cjs.map +1 -0
  67. package/dist/portfolio/components/PortfolioErrorFallback.d.cts +22 -0
  68. package/dist/portfolio/components/PortfolioErrorFallback.d.ts +22 -0
  69. package/dist/portfolio/components/PortfolioErrorFallback.js +9 -0
  70. package/dist/portfolio/components/PortfolioErrorFallback.js.map +1 -0
  71. package/dist/portfolio/components/PortfolioLeadCTA.cjs +91 -0
  72. package/dist/portfolio/components/PortfolioLeadCTA.cjs.map +1 -0
  73. package/dist/portfolio/components/PortfolioLeadCTA.d.cts +34 -0
  74. package/dist/portfolio/components/PortfolioLeadCTA.d.ts +34 -0
  75. package/dist/portfolio/components/PortfolioLeadCTA.js +9 -0
  76. package/dist/portfolio/components/PortfolioLeadCTA.js.map +1 -0
  77. package/dist/portfolio/index.cjs +43 -19
  78. package/dist/portfolio/index.d.cts +210 -7
  79. package/dist/portfolio/index.d.ts +210 -7
  80. package/dist/portfolio/index.js +7 -7
  81. package/dist/portfolio/primitives/AnimatedCounter.cjs +88 -0
  82. package/dist/portfolio/primitives/AnimatedCounter.cjs.map +1 -0
  83. package/dist/portfolio/primitives/AnimatedCounter.d.cts +22 -0
  84. package/dist/portfolio/primitives/AnimatedCounter.d.ts +22 -0
  85. package/dist/portfolio/primitives/AnimatedCounter.js +68 -0
  86. package/dist/portfolio/primitives/AnimatedCounter.js.map +1 -0
  87. package/dist/portfolio/primitives/AnnotatedImage.cjs +320 -0
  88. package/dist/portfolio/primitives/AnnotatedImage.cjs.map +1 -0
  89. package/dist/portfolio/primitives/AnnotatedImage.d.cts +18 -0
  90. package/dist/portfolio/primitives/AnnotatedImage.d.ts +18 -0
  91. package/dist/portfolio/primitives/AnnotatedImage.js +264 -0
  92. package/dist/portfolio/primitives/AnnotatedImage.js.map +1 -0
  93. package/dist/portfolio/primitives/BeforeAfterSlider.cjs +348 -0
  94. package/dist/portfolio/primitives/BeforeAfterSlider.cjs.map +1 -0
  95. package/dist/portfolio/primitives/BeforeAfterSlider.d.cts +13 -0
  96. package/dist/portfolio/primitives/BeforeAfterSlider.d.ts +13 -0
  97. package/dist/portfolio/primitives/BeforeAfterSlider.js +292 -0
  98. package/dist/portfolio/primitives/BeforeAfterSlider.js.map +1 -0
  99. package/dist/portfolio/primitives/DeviceTrifolio.cjs +298 -0
  100. package/dist/portfolio/primitives/DeviceTrifolio.cjs.map +1 -0
  101. package/dist/portfolio/primitives/DeviceTrifolio.d.cts +14 -0
  102. package/dist/portfolio/primitives/DeviceTrifolio.d.ts +14 -0
  103. package/dist/portfolio/primitives/DeviceTrifolio.js +242 -0
  104. package/dist/portfolio/primitives/DeviceTrifolio.js.map +1 -0
  105. package/dist/portfolio/primitives/FrequencyBarSkeleton.cjs +88 -0
  106. package/dist/portfolio/primitives/FrequencyBarSkeleton.cjs.map +1 -0
  107. package/dist/portfolio/primitives/FrequencyBarSkeleton.d.cts +10 -0
  108. package/dist/portfolio/primitives/FrequencyBarSkeleton.d.ts +10 -0
  109. package/dist/portfolio/primitives/FrequencyBarSkeleton.js +68 -0
  110. package/dist/portfolio/primitives/FrequencyBarSkeleton.js.map +1 -0
  111. package/dist/portfolio/primitives/GlassCard.cjs +45 -0
  112. package/dist/portfolio/primitives/GlassCard.cjs.map +1 -0
  113. package/dist/portfolio/primitives/GlassCard.d.cts +11 -0
  114. package/dist/portfolio/primitives/GlassCard.d.ts +11 -0
  115. package/dist/portfolio/primitives/GlassCard.js +43 -0
  116. package/dist/portfolio/primitives/GlassCard.js.map +1 -0
  117. package/dist/portfolio/primitives/MetricBadge.cjs +74 -0
  118. package/dist/portfolio/primitives/MetricBadge.cjs.map +1 -0
  119. package/dist/portfolio/primitives/MetricBadge.d.cts +9 -0
  120. package/dist/portfolio/primitives/MetricBadge.d.ts +9 -0
  121. package/dist/portfolio/primitives/MetricBadge.js +54 -0
  122. package/dist/portfolio/primitives/MetricBadge.js.map +1 -0
  123. package/dist/portfolio/primitives/SVGChart.cjs +316 -0
  124. package/dist/portfolio/primitives/SVGChart.cjs.map +1 -0
  125. package/dist/portfolio/primitives/SVGChart.d.cts +18 -0
  126. package/dist/portfolio/primitives/SVGChart.d.ts +18 -0
  127. package/dist/portfolio/primitives/SVGChart.js +296 -0
  128. package/dist/portfolio/primitives/SVGChart.js.map +1 -0
  129. package/dist/portfolio/primitives/ScrollReveal.cjs +97 -0
  130. package/dist/portfolio/primitives/ScrollReveal.cjs.map +1 -0
  131. package/dist/portfolio/primitives/ScrollReveal.d.cts +27 -0
  132. package/dist/portfolio/primitives/ScrollReveal.d.ts +27 -0
  133. package/dist/portfolio/primitives/ScrollReveal.js +77 -0
  134. package/dist/portfolio/primitives/ScrollReveal.js.map +1 -0
  135. package/dist/portfolio/primitives/SplitHeadline.cjs +107 -0
  136. package/dist/portfolio/primitives/SplitHeadline.cjs.map +1 -0
  137. package/dist/portfolio/primitives/SplitHeadline.d.cts +24 -0
  138. package/dist/portfolio/primitives/SplitHeadline.d.ts +24 -0
  139. package/dist/portfolio/primitives/SplitHeadline.js +87 -0
  140. package/dist/portfolio/primitives/SplitHeadline.js.map +1 -0
  141. package/dist/portfolio/sections/BeforeAfterSection.cjs +271 -0
  142. package/dist/portfolio/sections/BeforeAfterSection.cjs.map +1 -0
  143. package/dist/portfolio/sections/BeforeAfterSection.d.cts +9 -0
  144. package/dist/portfolio/sections/BeforeAfterSection.d.ts +9 -0
  145. package/dist/{BeforeAfterSection-6BHFLY4Y.js → portfolio/sections/BeforeAfterSection.js} +66 -27
  146. package/dist/portfolio/sections/BeforeAfterSection.js.map +1 -0
  147. package/dist/portfolio/sections/CTASection.cjs +123 -0
  148. package/dist/portfolio/sections/CTASection.cjs.map +1 -0
  149. package/dist/portfolio/sections/CTASection.d.cts +9 -0
  150. package/dist/portfolio/sections/CTASection.d.ts +9 -0
  151. package/dist/portfolio/sections/CTASection.js +93 -0
  152. package/dist/portfolio/sections/CTASection.js.map +1 -0
  153. package/dist/{ChallengesSection-IZ3DHECS.cjs → portfolio/sections/ChallengesSection.cjs} +13 -7
  154. package/dist/portfolio/sections/ChallengesSection.cjs.map +1 -0
  155. package/dist/portfolio/sections/ChallengesSection.d.cts +9 -0
  156. package/dist/portfolio/sections/ChallengesSection.d.ts +9 -0
  157. package/dist/{ChallengesSection-GEQGVSJN.js → portfolio/sections/ChallengesSection.js} +6 -5
  158. package/dist/portfolio/sections/ChallengesSection.js.map +1 -0
  159. package/dist/portfolio/sections/ConversionFunnelSection.cjs +263 -0
  160. package/dist/portfolio/sections/ConversionFunnelSection.cjs.map +1 -0
  161. package/dist/portfolio/sections/ConversionFunnelSection.d.cts +9 -0
  162. package/dist/portfolio/sections/ConversionFunnelSection.d.ts +9 -0
  163. package/dist/{ConversionFunnelSection-D3GE4NKE.js → portfolio/sections/ConversionFunnelSection.js} +60 -56
  164. package/dist/portfolio/sections/ConversionFunnelSection.js.map +1 -0
  165. package/dist/{DesignSystemSection-KXIQXITF.cjs → portfolio/sections/DesignSystemSection.cjs} +13 -7
  166. package/dist/portfolio/sections/DesignSystemSection.cjs.map +1 -0
  167. package/dist/portfolio/sections/DesignSystemSection.d.cts +32 -0
  168. package/dist/portfolio/sections/DesignSystemSection.d.ts +32 -0
  169. package/dist/{DesignSystemSection-2R5BRBGO.js → portfolio/sections/DesignSystemSection.js} +5 -4
  170. package/dist/portfolio/sections/DesignSystemSection.js.map +1 -0
  171. package/dist/{DetailsSection-TTUZAPZZ.cjs → portfolio/sections/DetailsSection.cjs} +12 -6
  172. package/dist/portfolio/sections/DetailsSection.cjs.map +1 -0
  173. package/dist/portfolio/sections/DetailsSection.d.cts +9 -0
  174. package/dist/portfolio/sections/DetailsSection.d.ts +9 -0
  175. package/dist/{DetailsSection-A6PZQUQL.js → portfolio/sections/DetailsSection.js} +5 -4
  176. package/dist/portfolio/sections/DetailsSection.js.map +1 -0
  177. package/dist/portfolio/sections/FeatureSpotlightSection.cjs +267 -0
  178. package/dist/portfolio/sections/FeatureSpotlightSection.cjs.map +1 -0
  179. package/dist/portfolio/sections/FeatureSpotlightSection.d.cts +9 -0
  180. package/dist/portfolio/sections/FeatureSpotlightSection.d.ts +9 -0
  181. package/dist/{FeatureSpotlightSection-B7P3JGNL.js → portfolio/sections/FeatureSpotlightSection.js} +39 -33
  182. package/dist/portfolio/sections/FeatureSpotlightSection.js.map +1 -0
  183. package/dist/portfolio/sections/GallerySection.cjs +321 -0
  184. package/dist/portfolio/sections/GallerySection.cjs.map +1 -0
  185. package/dist/portfolio/sections/GallerySection.d.cts +9 -0
  186. package/dist/portfolio/sections/GallerySection.d.ts +9 -0
  187. package/dist/{GallerySection-VMKORC47.js → portfolio/sections/GallerySection.js} +65 -18
  188. package/dist/portfolio/sections/GallerySection.js.map +1 -0
  189. package/dist/portfolio/sections/HeroSection.cjs +180 -0
  190. package/dist/portfolio/sections/HeroSection.cjs.map +1 -0
  191. package/dist/portfolio/sections/HeroSection.d.cts +15 -0
  192. package/dist/portfolio/sections/HeroSection.d.ts +15 -0
  193. package/dist/portfolio/sections/HeroSection.js +171 -0
  194. package/dist/portfolio/sections/HeroSection.js.map +1 -0
  195. package/dist/{MetricsTimelineSection-4L6DUHJ5.cjs → portfolio/sections/MetricsTimelineSection.cjs} +102 -61
  196. package/dist/portfolio/sections/MetricsTimelineSection.cjs.map +1 -0
  197. package/dist/portfolio/sections/MetricsTimelineSection.d.cts +9 -0
  198. package/dist/portfolio/sections/MetricsTimelineSection.d.ts +9 -0
  199. package/dist/{MetricsTimelineSection-6BT5GNFV.js → portfolio/sections/MetricsTimelineSection.js} +45 -29
  200. package/dist/portfolio/sections/MetricsTimelineSection.js.map +1 -0
  201. package/dist/portfolio/sections/PerformanceSection.cjs +336 -0
  202. package/dist/portfolio/sections/PerformanceSection.cjs.map +1 -0
  203. package/dist/portfolio/sections/PerformanceSection.d.cts +22 -0
  204. package/dist/portfolio/sections/PerformanceSection.d.ts +22 -0
  205. package/dist/{PerformanceSection-MGCEIXDX.js → portfolio/sections/PerformanceSection.js} +59 -104
  206. package/dist/portfolio/sections/PerformanceSection.js.map +1 -0
  207. package/dist/{ResultsSection-XLGMMQKY.cjs → portfolio/sections/ResultsSection.cjs} +23 -10
  208. package/dist/portfolio/sections/ResultsSection.cjs.map +1 -0
  209. package/dist/portfolio/sections/ResultsSection.d.cts +13 -0
  210. package/dist/portfolio/sections/ResultsSection.d.ts +13 -0
  211. package/dist/{ResultsSection-DFUJ5U6M.js → portfolio/sections/ResultsSection.js} +14 -7
  212. package/dist/portfolio/sections/ResultsSection.js.map +1 -0
  213. package/dist/portfolio/sections/ServicesSection.cjs +129 -0
  214. package/dist/portfolio/sections/ServicesSection.cjs.map +1 -0
  215. package/dist/portfolio/sections/ServicesSection.d.cts +9 -0
  216. package/dist/portfolio/sections/ServicesSection.d.ts +9 -0
  217. package/dist/portfolio/sections/ServicesSection.js +122 -0
  218. package/dist/portfolio/sections/ServicesSection.js.map +1 -0
  219. package/dist/{SiteArchitectureSection-J7BPBERH.cjs → portfolio/sections/SiteArchitectureSection.cjs} +117 -93
  220. package/dist/portfolio/sections/SiteArchitectureSection.cjs.map +1 -0
  221. package/dist/portfolio/sections/SiteArchitectureSection.d.cts +21 -0
  222. package/dist/portfolio/sections/SiteArchitectureSection.d.ts +21 -0
  223. package/dist/{SiteArchitectureSection-TE22OAWV.js → portfolio/sections/SiteArchitectureSection.js} +47 -48
  224. package/dist/portfolio/sections/SiteArchitectureSection.js.map +1 -0
  225. package/dist/{SpeedComparisonSection-EZKFQVGW.cjs → portfolio/sections/SpeedComparisonSection.cjs} +13 -7
  226. package/dist/portfolio/sections/SpeedComparisonSection.cjs.map +1 -0
  227. package/dist/portfolio/sections/SpeedComparisonSection.d.cts +20 -0
  228. package/dist/portfolio/sections/SpeedComparisonSection.d.ts +20 -0
  229. package/dist/{SpeedComparisonSection-Y3K7OFZQ.js → portfolio/sections/SpeedComparisonSection.js} +6 -5
  230. package/dist/portfolio/sections/SpeedComparisonSection.js.map +1 -0
  231. package/dist/portfolio/sections/StrategySection.cjs +233 -0
  232. package/dist/portfolio/sections/StrategySection.cjs.map +1 -0
  233. package/dist/portfolio/sections/StrategySection.d.cts +9 -0
  234. package/dist/portfolio/sections/StrategySection.d.ts +9 -0
  235. package/dist/{StrategySection-DI5RSCJU.js → portfolio/sections/StrategySection.js} +60 -26
  236. package/dist/portfolio/sections/StrategySection.js.map +1 -0
  237. package/dist/portfolio/sections/TeamSection.cjs +162 -0
  238. package/dist/portfolio/sections/TeamSection.cjs.map +1 -0
  239. package/dist/portfolio/sections/TeamSection.d.cts +9 -0
  240. package/dist/portfolio/sections/TeamSection.d.ts +9 -0
  241. package/dist/portfolio/sections/TeamSection.js +106 -0
  242. package/dist/portfolio/sections/TeamSection.js.map +1 -0
  243. package/dist/portfolio/sections/TechStackSection.cjs +106 -0
  244. package/dist/portfolio/sections/TechStackSection.cjs.map +1 -0
  245. package/dist/portfolio/sections/TechStackSection.d.cts +9 -0
  246. package/dist/portfolio/sections/TechStackSection.d.ts +9 -0
  247. package/dist/portfolio/sections/TechStackSection.js +99 -0
  248. package/dist/portfolio/sections/TechStackSection.js.map +1 -0
  249. package/dist/{TestimonialSection-XPTFUQIN.cjs → portfolio/sections/TestimonialSection.cjs} +47 -28
  250. package/dist/portfolio/sections/TestimonialSection.cjs.map +1 -0
  251. package/dist/portfolio/sections/TestimonialSection.d.cts +9 -0
  252. package/dist/portfolio/sections/TestimonialSection.d.ts +9 -0
  253. package/dist/{TestimonialSection-6RGSMXQB.js → portfolio/sections/TestimonialSection.js} +40 -27
  254. package/dist/portfolio/sections/TestimonialSection.js.map +1 -0
  255. package/dist/portfolio/sections/VideoSection.cjs +181 -0
  256. package/dist/portfolio/sections/VideoSection.cjs.map +1 -0
  257. package/dist/portfolio/sections/VideoSection.d.cts +9 -0
  258. package/dist/portfolio/sections/VideoSection.d.ts +9 -0
  259. package/dist/{VideoSection-4A2HC6K6.js → portfolio/sections/VideoSection.js} +21 -13
  260. package/dist/portfolio/sections/VideoSection.js.map +1 -0
  261. package/dist/portfolio/server.cjs +56 -144
  262. package/dist/portfolio/server.cjs.map +1 -1
  263. package/dist/portfolio/server.d.cts +157 -7
  264. package/dist/portfolio/server.d.ts +157 -7
  265. package/dist/portfolio/server.js +3 -142
  266. package/dist/portfolio/server.js.map +1 -1
  267. package/dist/preview.cjs +56 -0
  268. package/dist/preview.cjs.map +1 -0
  269. package/dist/preview.d.cts +31 -0
  270. package/dist/preview.d.ts +31 -0
  271. package/dist/preview.js +54 -0
  272. package/dist/preview.js.map +1 -0
  273. package/dist/{types-DL4t_Cfa.d.ts → types-0tVPy4pU.d.cts} +7 -1
  274. package/dist/{types-DL4t_Cfa.d.cts → types-0tVPy4pU.d.ts} +7 -1
  275. package/dist/types-D0nb6KAx.d.cts +299 -0
  276. package/dist/types-D0nb6KAx.d.ts +299 -0
  277. package/package.json +38 -14
  278. package/templates/api-portfolio-preview.ts +6 -0
  279. package/templates/api-revalidate.ts +5 -0
  280. package/templates/work-category-page.tsx +40 -0
  281. package/templates/work-error.tsx +3 -0
  282. package/templates/work-loading.tsx +1 -0
  283. package/templates/work-page.tsx +37 -0
  284. package/templates/work-slug-loading.tsx +1 -0
  285. package/templates/work-slug-page.tsx +41 -0
  286. package/dist/BeforeAfterSection-6BHFLY4Y.js.map +0 -1
  287. package/dist/BeforeAfterSection-JTORBR3A.cjs +0 -181
  288. package/dist/BeforeAfterSection-JTORBR3A.cjs.map +0 -1
  289. package/dist/CTASection-4JKLXEUF.cjs +0 -111
  290. package/dist/CTASection-4JKLXEUF.cjs.map +0 -1
  291. package/dist/CTASection-BJA72XIL.js +0 -106
  292. package/dist/CTASection-BJA72XIL.js.map +0 -1
  293. package/dist/ChallengesSection-GEQGVSJN.js.map +0 -1
  294. package/dist/ChallengesSection-IZ3DHECS.cjs.map +0 -1
  295. package/dist/ConversionFunnelSection-AUUSJ5HQ.cjs +0 -209
  296. package/dist/ConversionFunnelSection-AUUSJ5HQ.cjs.map +0 -1
  297. package/dist/ConversionFunnelSection-D3GE4NKE.js.map +0 -1
  298. package/dist/DesignSystemSection-2R5BRBGO.js.map +0 -1
  299. package/dist/DesignSystemSection-KXIQXITF.cjs.map +0 -1
  300. package/dist/DetailsSection-A6PZQUQL.js.map +0 -1
  301. package/dist/DetailsSection-TTUZAPZZ.cjs.map +0 -1
  302. package/dist/FeatureSpotlightSection-B7P3JGNL.js.map +0 -1
  303. package/dist/FeatureSpotlightSection-WRHXS7TU.cjs +0 -210
  304. package/dist/FeatureSpotlightSection-WRHXS7TU.cjs.map +0 -1
  305. package/dist/GallerySection-VMKORC47.js.map +0 -1
  306. package/dist/GallerySection-WJ4PQDBI.cjs +0 -219
  307. package/dist/GallerySection-WJ4PQDBI.cjs.map +0 -1
  308. package/dist/MetricsTimelineSection-4L6DUHJ5.cjs.map +0 -1
  309. package/dist/MetricsTimelineSection-6BT5GNFV.js.map +0 -1
  310. package/dist/PerformanceSection-24TVVFZA.cjs +0 -356
  311. package/dist/PerformanceSection-24TVVFZA.cjs.map +0 -1
  312. package/dist/PerformanceSection-MGCEIXDX.js.map +0 -1
  313. package/dist/ResultsSection-DFUJ5U6M.js.map +0 -1
  314. package/dist/ResultsSection-XLGMMQKY.cjs.map +0 -1
  315. package/dist/ServicesSection-D5V3Q4GR.js +0 -118
  316. package/dist/ServicesSection-D5V3Q4GR.js.map +0 -1
  317. package/dist/ServicesSection-WJMGK2MF.cjs +0 -120
  318. package/dist/ServicesSection-WJMGK2MF.cjs.map +0 -1
  319. package/dist/SiteArchitectureSection-J7BPBERH.cjs.map +0 -1
  320. package/dist/SiteArchitectureSection-TE22OAWV.js.map +0 -1
  321. package/dist/SpeedComparisonSection-EZKFQVGW.cjs.map +0 -1
  322. package/dist/SpeedComparisonSection-Y3K7OFZQ.js.map +0 -1
  323. package/dist/StrategySection-CJ7Y6OFQ.cjs +0 -174
  324. package/dist/StrategySection-CJ7Y6OFQ.cjs.map +0 -1
  325. package/dist/StrategySection-DI5RSCJU.js.map +0 -1
  326. package/dist/TeamSection-DZVSNZE6.cjs +0 -112
  327. package/dist/TeamSection-DZVSNZE6.cjs.map +0 -1
  328. package/dist/TeamSection-HGKFW6PQ.js +0 -107
  329. package/dist/TeamSection-HGKFW6PQ.js.map +0 -1
  330. package/dist/TechStackSection-2AQ7RGY3.js +0 -93
  331. package/dist/TechStackSection-2AQ7RGY3.js.map +0 -1
  332. package/dist/TechStackSection-VTNNZR5V.cjs +0 -95
  333. package/dist/TechStackSection-VTNNZR5V.cjs.map +0 -1
  334. package/dist/TestimonialSection-6RGSMXQB.js.map +0 -1
  335. package/dist/TestimonialSection-XPTFUQIN.cjs.map +0 -1
  336. package/dist/VideoSection-4A2HC6K6.js.map +0 -1
  337. package/dist/VideoSection-G3DFS7UH.cjs +0 -118
  338. package/dist/VideoSection-G3DFS7UH.cjs.map +0 -1
  339. package/dist/chunk-2Y4O3LWM.js +0 -53
  340. package/dist/chunk-2Y4O3LWM.js.map +0 -1
  341. package/dist/chunk-633UMQQH.cjs +0 -31
  342. package/dist/chunk-633UMQQH.cjs.map +0 -1
  343. package/dist/chunk-7CFFAKDM.js +0 -74
  344. package/dist/chunk-7CFFAKDM.js.map +0 -1
  345. package/dist/chunk-APG2QSMB.js +0 -131
  346. package/dist/chunk-APG2QSMB.js.map +0 -1
  347. package/dist/chunk-AVCH4LMG.cjs +0 -620
  348. package/dist/chunk-AVCH4LMG.cjs.map +0 -1
  349. package/dist/chunk-AYBUHRFS.js +0 -613
  350. package/dist/chunk-AYBUHRFS.js.map +0 -1
  351. package/dist/chunk-EE75WRCM.cjs.map +0 -1
  352. package/dist/chunk-IKBK7HYX.cjs +0 -79
  353. package/dist/chunk-IKBK7HYX.cjs.map +0 -1
  354. package/dist/chunk-KEOHORIH.cjs +0 -79
  355. package/dist/chunk-KEOHORIH.cjs.map +0 -1
  356. package/dist/chunk-OA5ZM4OA.cjs +0 -139
  357. package/dist/chunk-OA5ZM4OA.cjs.map +0 -1
  358. package/dist/chunk-TVFXN6W6.js.map +0 -1
  359. package/dist/chunk-VVTK4OL6.js +0 -28
  360. package/dist/chunk-VVTK4OL6.js.map +0 -1
  361. package/dist/chunk-XCKXHK44.js +0 -15
  362. package/dist/chunk-XCKXHK44.js.map +0 -1
  363. package/dist/chunk-XONXEFJY.cjs +0 -58
  364. package/dist/chunk-XONXEFJY.cjs.map +0 -1
  365. package/dist/chunk-XQNJED46.cjs +0 -19
  366. package/dist/chunk-XQNJED46.cjs.map +0 -1
  367. package/dist/chunk-YB4B3OMC.js +0 -74
  368. package/dist/chunk-YB4B3OMC.js.map +0 -1
  369. package/dist/portfolio/sections.cjs +0 -20
  370. package/dist/portfolio/sections.cjs.map +0 -1
  371. package/dist/portfolio/sections.d.cts +0 -42
  372. package/dist/portfolio/sections.d.ts +0 -42
  373. package/dist/portfolio/sections.js +0 -4
  374. package/dist/portfolio/sections.js.map +0 -1
@@ -1,25 +1,37 @@
1
1
  'use client';
2
- import { GlassCard } from './chunk-YB4B3OMC.js';
3
- import { ScrollReveal } from './chunk-7CFFAKDM.js';
4
- import { useRef, useState, useEffect, useCallback } from 'react';
5
- import gsap from 'gsap';
6
- import { jsx, jsxs } from 'react/jsx-runtime';
2
+ "use client";
3
+ import {
4
+ resolvePortfolioImage
5
+ } from "../../chunk-QDXZ27R7.js";
7
6
 
7
+ // src/portfolio/components/sections/BeforeAfterSection.tsx
8
+ import { useRef, useState, useCallback, useEffect } from "react";
9
+ import Image from "next/image";
10
+ import ScrollReveal from "@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal";
11
+ import GlassCard from "@sonordev/agency-site-kit/portfolio/primitives/GlassCard";
12
+ import { jsx, jsxs } from "react/jsx-runtime";
8
13
  function BeforeAfterSection({ data }) {
9
14
  const containerRef = useRef(null);
10
- const sliderRef = useRef(null);
11
15
  const [position, setPosition] = useState(data.defaultPosition ?? 50);
16
+ const [handleHidden, setHandleHidden] = useState(false);
12
17
  const isDragging = useRef(false);
13
- const beforeUrl = data.beforeUrl || data.before?.asset?._ref || "";
14
- const afterUrl = data.afterUrl || data.after?.asset?._ref || "";
18
+ const before = resolvePortfolioImage(data.beforeUrl || data.before);
19
+ const after = resolvePortfolioImage(data.afterUrl || data.after);
15
20
  useEffect(() => {
16
- const prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
17
- if (prefersReducedMotion || !sliderRef.current) return;
18
- gsap.fromTo(
19
- sliderRef.current,
20
- { opacity: 0, scale: 0.8 },
21
- { opacity: 1, scale: 1, duration: 0.6, delay: 0.5, ease: "back.out(2)" }
22
- );
21
+ const el = containerRef.current;
22
+ if (!el) return;
23
+ if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
24
+ const rect = el.getBoundingClientRect();
25
+ if (rect.top < window.innerHeight && rect.bottom > 0) return;
26
+ setHandleHidden(true);
27
+ const io = new IntersectionObserver(([entry]) => {
28
+ if (entry.isIntersecting) {
29
+ setHandleHidden(false);
30
+ io.disconnect();
31
+ }
32
+ });
33
+ io.observe(el);
34
+ return () => io.disconnect();
23
35
  }, []);
24
36
  const updatePosition = useCallback((clientX) => {
25
37
  const container = containerRef.current;
@@ -47,6 +59,18 @@ function BeforeAfterSection({ data }) {
47
59
  const handlePointerUp = useCallback(() => {
48
60
  isDragging.current = false;
49
61
  }, []);
62
+ const handleKeyDown = useCallback((e) => {
63
+ const step = e.shiftKey ? 10 : 5;
64
+ const nudge = (delta) => {
65
+ e.preventDefault();
66
+ setPosition((prev) => Math.max(0, Math.min(100, prev + delta)));
67
+ };
68
+ if (e.key === "ArrowLeft" || e.key === "ArrowDown") nudge(-step);
69
+ else if (e.key === "ArrowRight" || e.key === "ArrowUp") nudge(step);
70
+ else if (e.key === "Home") nudge(-100);
71
+ else if (e.key === "End") nudge(100);
72
+ }, []);
73
+ if (!before || !after) return null;
50
74
  return /* @__PURE__ */ jsx(
51
75
  "section",
52
76
  {
@@ -78,19 +102,29 @@ function BeforeAfterSection({ data }) {
78
102
  "div",
79
103
  {
80
104
  ref: containerRef,
105
+ role: "slider",
106
+ tabIndex: 0,
107
+ "aria-label": "Before and after comparison",
108
+ "aria-valuemin": 0,
109
+ "aria-valuemax": 100,
110
+ "aria-valuenow": Math.round(position),
111
+ "aria-valuetext": `${Math.round(position)}% before, ${100 - Math.round(position)}% after`,
81
112
  className: "relative w-full overflow-hidden rounded-xl cursor-col-resize select-none",
82
113
  style: { aspectRatio: "16/10" },
83
114
  onPointerDown: handlePointerDown,
84
115
  onPointerMove: handlePointerMove,
85
116
  onPointerUp: handlePointerUp,
86
117
  onPointerCancel: handlePointerUp,
118
+ onKeyDown: handleKeyDown,
87
119
  children: [
88
120
  /* @__PURE__ */ jsx(
89
- "img",
121
+ Image,
90
122
  {
91
- src: afterUrl,
123
+ src: after.url,
92
124
  alt: "After",
93
- className: "absolute inset-0 w-full h-full object-cover",
125
+ fill: true,
126
+ sizes: "(max-width: 1280px) 100vw, 1200px",
127
+ className: "object-cover",
94
128
  draggable: false
95
129
  }
96
130
  ),
@@ -100,11 +134,13 @@ function BeforeAfterSection({ data }) {
100
134
  className: "absolute inset-0 overflow-hidden",
101
135
  style: { width: `${position}%` },
102
136
  children: /* @__PURE__ */ jsx(
103
- "img",
137
+ Image,
104
138
  {
105
- src: beforeUrl,
139
+ src: before.url,
106
140
  alt: "Before",
107
- className: "absolute inset-0 w-full h-full object-cover",
141
+ fill: true,
142
+ sizes: "(max-width: 1280px) 100vw, 1200px",
143
+ className: "object-cover",
108
144
  style: { minWidth: containerRef.current?.offsetWidth || "100%" },
109
145
  draggable: false
110
146
  }
@@ -126,11 +162,14 @@ function BeforeAfterSection({ data }) {
126
162
  /* @__PURE__ */ jsx(
127
163
  "div",
128
164
  {
129
- ref: sliderRef,
130
165
  className: "absolute top-1/2 flex items-center justify-center w-10 h-10 rounded-full",
131
166
  style: {
132
167
  left: `${position}%`,
133
- transform: "translate(-50%, -50%)",
168
+ transform: handleHidden ? "translate(-50%, -50%) scale(0.8)" : "translate(-50%, -50%) scale(1)",
169
+ opacity: handleHidden ? 0 : 1,
170
+ // Transition only on reveal so the hydration hide is instant;
171
+ // .6s back-out overshoot after a .5s beat, like the old entrance.
172
+ transition: handleHidden ? "none" : "opacity 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) 0.5s, transform 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) 0.5s",
134
173
  background: "var(--sk-primary, #6366f1)",
135
174
  boxShadow: "0 4px 16px rgba(0,0,0,0.3)",
136
175
  border: "3px solid #ffffff",
@@ -170,7 +209,7 @@ function BeforeAfterSection({ data }) {
170
209
  }
171
210
  );
172
211
  }
173
-
174
- export { BeforeAfterSection as default };
175
- //# sourceMappingURL=BeforeAfterSection-6BHFLY4Y.js.map
176
- //# sourceMappingURL=BeforeAfterSection-6BHFLY4Y.js.map
212
+ export {
213
+ BeforeAfterSection as default
214
+ };
215
+ //# sourceMappingURL=BeforeAfterSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/portfolio/components/sections/BeforeAfterSection.tsx"],"sourcesContent":["'use client';\n\nimport React, { useRef, useState, useCallback, useEffect } from 'react';\nimport Image from 'next/image';\nimport type { PortfolioBeforeAfterData } from '../../../types';\nimport { resolvePortfolioImage } from '../../../shared/images';\nimport ScrollReveal from '@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal';\nimport GlassCard from '@sonordev/agency-site-kit/portfolio/primitives/GlassCard';\n\ninterface BeforeAfterSectionProps {\n data: PortfolioBeforeAfterData;\n}\n\nexport default function BeforeAfterSection({ data }: BeforeAfterSectionProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState(data.defaultPosition ?? 50);\n const [handleHidden, setHandleHidden] = useState(false);\n const isDragging = useRef(false);\n\n // Support both direct URL strings and (API-resolved) Sanity image objects\n const before = resolvePortfolioImage((data as any).beforeUrl || data.before);\n const after = resolvePortfolioImage((data as any).afterUrl || data.after);\n\n // Slider-handle entrance (ScrollReveal pattern): SSR renders it visible,\n // hydration hides it only while the comparison is still below the viewport,\n // then an IntersectionObserver pops it back in via CSS transition.\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n\n // Never re-hide a handle already in the viewport at hydration.\n const rect = el.getBoundingClientRect();\n if (rect.top < window.innerHeight && rect.bottom > 0) return;\n\n setHandleHidden(true);\n const io = new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting) {\n setHandleHidden(false);\n io.disconnect();\n }\n });\n io.observe(el);\n return () => io.disconnect();\n }, []);\n\n const updatePosition = useCallback((clientX: number) => {\n const container = containerRef.current;\n if (!container) return;\n\n const rect = container.getBoundingClientRect();\n const x = clientX - rect.left;\n const percent = Math.max(0, Math.min(100, (x / rect.width) * 100));\n setPosition(percent);\n }, []);\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n isDragging.current = true;\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n updatePosition(e.clientX);\n },\n [updatePosition],\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent) => {\n if (!isDragging.current) return;\n updatePosition(e.clientX);\n },\n [updatePosition],\n );\n\n const handlePointerUp = useCallback(() => {\n isDragging.current = false;\n }, []);\n\n // Keyboard operation — arrows nudge, Home/End jump (WAI-ARIA slider)\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n const step = e.shiftKey ? 10 : 5;\n const nudge = (delta: number) => {\n e.preventDefault();\n setPosition((prev) => Math.max(0, Math.min(100, prev + delta)));\n };\n if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') nudge(-step);\n else if (e.key === 'ArrowRight' || e.key === 'ArrowUp') nudge(step);\n else if (e.key === 'Home') nudge(-100);\n else if (e.key === 'End') nudge(100);\n }, []);\n\n // Without both images the comparison is meaningless — render nothing\n // rather than a frame with broken images.\n if (!before || !after) return null;\n\n return (\n <section\n className=\"w-full py-20 md:py-28\"\n style={{ background: 'var(--sk-bg, #0a0a0a)' }}\n >\n <div className=\"max-w-5xl mx-auto px-6\">\n {(data.title || data.description) && (\n <ScrollReveal y={30}>\n {data.title && (\n <h2\n className=\"text-3xl md:text-4xl font-bold mb-4\"\n style={{\n color: 'var(--sk-text-primary, #ffffff)',\n fontFamily: 'var(--sk-font-heading, inherit)',\n }}\n >\n {data.title}\n </h2>\n )}\n {data.description && (\n <p\n className=\"text-lg mb-12 max-w-2xl\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n {data.description}\n </p>\n )}\n </ScrollReveal>\n )}\n\n <ScrollReveal y={40}>\n <GlassCard padding=\"sm\" hover={false}>\n <div\n ref={containerRef}\n role=\"slider\"\n tabIndex={0}\n aria-label=\"Before and after comparison\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(position)}\n aria-valuetext={`${Math.round(position)}% before, ${100 - Math.round(position)}% after`}\n className=\"relative w-full overflow-hidden rounded-xl cursor-col-resize select-none\"\n style={{ aspectRatio: '16/10' }}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n onKeyDown={handleKeyDown}\n >\n {/* After image (full background) */}\n <Image\n src={after.url}\n alt=\"After\"\n fill\n sizes=\"(max-width: 1280px) 100vw, 1200px\"\n className=\"object-cover\"\n draggable={false}\n />\n\n {/* Before image (clipped) */}\n <div\n className=\"absolute inset-0 overflow-hidden\"\n style={{ width: `${position}%` }}\n >\n <Image\n src={before.url}\n alt=\"Before\"\n fill\n sizes=\"(max-width: 1280px) 100vw, 1200px\"\n className=\"object-cover\"\n style={{ minWidth: containerRef.current?.offsetWidth || '100%' }}\n draggable={false}\n />\n </div>\n\n {/* Slider line */}\n <div\n className=\"absolute top-0 bottom-0 w-0.5\"\n style={{\n left: `${position}%`,\n transform: 'translateX(-50%)',\n background: '#ffffff',\n boxShadow: '0 0 8px rgba(0,0,0,0.5)',\n }}\n />\n\n {/* Slider handle */}\n <div\n className=\"absolute top-1/2 flex items-center justify-center w-10 h-10 rounded-full\"\n style={{\n left: `${position}%`,\n transform: handleHidden\n ? 'translate(-50%, -50%) scale(0.8)'\n : 'translate(-50%, -50%) scale(1)',\n opacity: handleHidden ? 0 : 1,\n // Transition only on reveal so the hydration hide is instant;\n // .6s back-out overshoot after a .5s beat, like the old entrance.\n transition: handleHidden\n ? 'none'\n : 'opacity 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) 0.5s, transform 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) 0.5s',\n background: 'var(--sk-primary, #6366f1)',\n boxShadow: '0 4px 16px rgba(0,0,0,0.3)',\n border: '3px solid #ffffff',\n zIndex: 5,\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M5 3l-4 5 4 5M11 3l4 5-4 5\" stroke=\"#ffffff\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </div>\n\n {/* Before / After labels */}\n <span\n className=\"absolute top-4 left-4 px-3 py-1 rounded-lg text-xs font-semibold uppercase tracking-wider\"\n style={{\n background: 'rgba(0,0,0,0.6)',\n color: '#ffffff',\n backdropFilter: 'blur(4px)',\n }}\n >\n {(data as any).beforeLabel || 'Before'}\n </span>\n <span\n className=\"absolute top-4 right-4 px-3 py-1 rounded-lg text-xs font-semibold uppercase tracking-wider\"\n style={{\n background: 'rgba(0,0,0,0.6)',\n color: '#ffffff',\n backdropFilter: 'blur(4px)',\n }}\n >\n {(data as any).afterLabel || 'After'}\n </span>\n </div>\n </GlassCard>\n </ScrollReveal>\n </div>\n </section>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,123 @@
1
+ 'use client';
2
+ "use strict";
3
+ "use client";
4
+ var __create = Object.create;
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __export = (target, all) => {
11
+ for (var name in all)
12
+ __defProp(target, name, { get: all[name], enumerable: true });
13
+ };
14
+ var __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from))
17
+ if (!__hasOwnProp.call(to, key) && key !== except)
18
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
+ // If the importer is in node compatibility mode or this is not an ESM
24
+ // file that has been converted to a CommonJS file using a Babel-
25
+ // compatible transform (i.e. "__esModule" has not been set), then set
26
+ // "default" to the CommonJS "module.exports" for node compatibility.
27
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
+ mod
29
+ ));
30
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
31
+
32
+ // src/portfolio/components/sections/CTASection.tsx
33
+ var CTASection_exports = {};
34
+ __export(CTASection_exports, {
35
+ default: () => CTASection
36
+ });
37
+ module.exports = __toCommonJS(CTASection_exports);
38
+ var import_ScrollReveal = __toESM(require("@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal"), 1);
39
+ var import_GlassCard = __toESM(require("@sonordev/agency-site-kit/portfolio/primitives/GlassCard"), 1);
40
+ var import_jsx_runtime = require("react/jsx-runtime");
41
+ var CTA_BUTTON_CSS = `
42
+ .sk-cta-button{transition:transform .25s cubic-bezier(.25,.46,.45,.94)}
43
+ .sk-cta-button:hover{transform:translateY(-2px) scale(1.05)}
44
+ @media (prefers-reduced-motion:reduce){.sk-cta-button{transition:none}.sk-cta-button:hover{transform:none}}
45
+ `;
46
+ function CTASection({ data }) {
47
+ const style = data.style || "primary";
48
+ const content = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col items-center text-center gap-6 py-12 px-8 md:px-16", children: [
49
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ScrollReveal.default, { y: 30, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50
+ "h2",
51
+ {
52
+ className: "text-3xl md:text-4xl lg:text-5xl font-bold leading-tight",
53
+ style: {
54
+ color: style === "primary" ? "#ffffff" : "var(--sk-text-primary, #ffffff)",
55
+ fontFamily: "var(--sk-font-heading, inherit)"
56
+ },
57
+ children: data.headline
58
+ }
59
+ ) }),
60
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ScrollReveal.default, { y: 20, delay: 0.15, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
61
+ "p",
62
+ {
63
+ className: "text-base md:text-lg max-w-xl leading-relaxed",
64
+ style: {
65
+ color: style === "primary" ? "rgba(255,255,255,0.85)" : "var(--sk-text-secondary, #a1a1aa)"
66
+ },
67
+ children: data.description
68
+ }
69
+ ) }),
70
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ScrollReveal.default, { y: 20, delay: 0.3, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
71
+ "a",
72
+ {
73
+ href: data.buttonUrl,
74
+ "data-portfolio-action": "cta",
75
+ className: "sk-cta-button inline-flex items-center gap-2 px-8 py-4 rounded-xl text-base font-semibold",
76
+ style: {
77
+ background: style === "primary" ? "#ffffff" : "var(--sk-primary, #6366f1)",
78
+ color: style === "primary" ? "var(--sk-primary, #6366f1)" : "#ffffff",
79
+ boxShadow: "0 4px 20px rgba(0,0,0,0.2)",
80
+ willChange: "transform"
81
+ },
82
+ children: [
83
+ data.buttonText,
84
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M3.75 9h10.5M9.75 4.5L14.25 9l-4.5 4.5", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) })
85
+ ]
86
+ }
87
+ ) })
88
+ ] });
89
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "w-full py-20 md:py-28", children: [
90
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("style", { href: "sk-cta-button", precedence: "default", children: CTA_BUTTON_CSS }),
91
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "max-w-5xl mx-auto px-6", children: style === "primary" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
92
+ "div",
93
+ {
94
+ className: "relative overflow-hidden rounded-2xl",
95
+ style: {
96
+ background: `linear-gradient(135deg, var(--sk-primary, #6366f1) 0%, color-mix(in srgb, var(--sk-primary, #6366f1) 70%, #000000) 100%)`
97
+ },
98
+ children: [
99
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
100
+ "div",
101
+ {
102
+ className: "absolute -top-24 -right-24 w-64 h-64 rounded-full opacity-20",
103
+ style: {
104
+ background: "radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)"
105
+ }
106
+ }
107
+ ),
108
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
109
+ "div",
110
+ {
111
+ className: "absolute -bottom-16 -left-16 w-48 h-48 rounded-full opacity-15",
112
+ style: {
113
+ background: "radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)"
114
+ }
115
+ }
116
+ ),
117
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative z-10", children: content })
118
+ ]
119
+ }
120
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_GlassCard.default, { padding: "sm", hover: false, children: content }) })
121
+ ] });
122
+ }
123
+ //# sourceMappingURL=CTASection.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/portfolio/components/sections/CTASection.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\nimport type { PortfolioCTAData } from '../../../types';\nimport ScrollReveal from '@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal';\nimport GlassCard from '@sonordev/agency-site-kit/portfolio/primitives/GlassCard';\n\ninterface CTASectionProps {\n data: PortfolioCTAData;\n}\n\n// Button lift on hover (y -2, scale 1.05) — pure CSS, no mouse handlers.\n// .25s with a power2.out-style ease matches the old hover tween.\nconst CTA_BUTTON_CSS = `\n.sk-cta-button{transition:transform .25s cubic-bezier(.25,.46,.45,.94)}\n.sk-cta-button:hover{transform:translateY(-2px) scale(1.05)}\n@media (prefers-reduced-motion:reduce){.sk-cta-button{transition:none}.sk-cta-button:hover{transform:none}}\n`;\n\nexport default function CTASection({ data }: CTASectionProps) {\n const style = data.style || 'primary';\n\n const content = (\n <div className=\"flex flex-col items-center text-center gap-6 py-12 px-8 md:px-16\">\n <ScrollReveal y={30}>\n <h2\n className=\"text-3xl md:text-4xl lg:text-5xl font-bold leading-tight\"\n style={{\n color: style === 'primary' ? '#ffffff' : 'var(--sk-text-primary, #ffffff)',\n fontFamily: 'var(--sk-font-heading, inherit)',\n }}\n >\n {data.headline}\n </h2>\n </ScrollReveal>\n\n <ScrollReveal y={20} delay={0.15}>\n <p\n className=\"text-base md:text-lg max-w-xl leading-relaxed\"\n style={{\n color: style === 'primary' ? 'rgba(255,255,255,0.85)' : 'var(--sk-text-secondary, #a1a1aa)',\n }}\n >\n {data.description}\n </p>\n </ScrollReveal>\n\n <ScrollReveal y={20} delay={0.3}>\n <a\n href={data.buttonUrl}\n data-portfolio-action=\"cta\"\n className=\"sk-cta-button inline-flex items-center gap-2 px-8 py-4 rounded-xl text-base font-semibold\"\n style={{\n background:\n style === 'primary'\n ? '#ffffff'\n : 'var(--sk-primary, #6366f1)',\n color:\n style === 'primary'\n ? 'var(--sk-primary, #6366f1)'\n : '#ffffff',\n boxShadow: '0 4px 20px rgba(0,0,0,0.2)',\n willChange: 'transform',\n }}\n >\n {data.buttonText}\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\n <path d=\"M3.75 9h10.5M9.75 4.5L14.25 9l-4.5 4.5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </a>\n </ScrollReveal>\n </div>\n );\n\n return (\n <section className=\"w-full py-20 md:py-28\">\n {/* Hover CSS (React 19 hoists + dedupes via href/precedence) */}\n <style href=\"sk-cta-button\" precedence=\"default\">\n {CTA_BUTTON_CSS}\n </style>\n <div className=\"max-w-5xl mx-auto px-6\">\n {style === 'primary' ? (\n <div\n className=\"relative overflow-hidden rounded-2xl\"\n style={{\n background: `linear-gradient(135deg, var(--sk-primary, #6366f1) 0%, color-mix(in srgb, var(--sk-primary, #6366f1) 70%, #000000) 100%)`,\n }}\n >\n {/* Background gradient decorations */}\n <div\n className=\"absolute -top-24 -right-24 w-64 h-64 rounded-full opacity-20\"\n style={{\n background: 'radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)',\n }}\n />\n <div\n className=\"absolute -bottom-16 -left-16 w-48 h-48 rounded-full opacity-15\"\n style={{\n background: 'radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)',\n }}\n />\n <div className=\"relative z-10\">{content}</div>\n </div>\n ) : (\n <GlassCard padding=\"sm\" hover={false}>\n {content}\n </GlassCard>\n )}\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,0BAAyB;AACzB,uBAAsB;AAoBd;AAZR,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAMR,SAAR,WAA4B,EAAE,KAAK,GAAoB;AAC5D,QAAM,QAAQ,KAAK,SAAS;AAE5B,QAAM,UACJ,6CAAC,SAAI,WAAU,oEACb;AAAA,gDAAC,oBAAAA,SAAA,EAAa,GAAG,IACf;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO,UAAU,YAAY,YAAY;AAAA,UACzC,YAAY;AAAA,QACd;AAAA,QAEC,eAAK;AAAA;AAAA,IACR,GACF;AAAA,IAEA,4CAAC,oBAAAA,SAAA,EAAa,GAAG,IAAI,OAAO,MAC1B;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO,UAAU,YAAY,2BAA2B;AAAA,QAC1D;AAAA,QAEC,eAAK;AAAA;AAAA,IACR,GACF;AAAA,IAEA,4CAAC,oBAAAA,SAAA,EAAa,GAAG,IAAI,OAAO,KAC1B;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,yBAAsB;AAAA,QACtB,WAAU;AAAA,QACV,OAAO;AAAA,UACL,YACE,UAAU,YACN,YACA;AAAA,UACN,OACE,UAAU,YACN,+BACA;AAAA,UACN,WAAW;AAAA,UACX,YAAY;AAAA,QACd;AAAA,QAEC;AAAA,eAAK;AAAA,UACN,4CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,sDAAC,UAAK,GAAE,0CAAyC,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,GACtI;AAAA;AAAA;AAAA,IACF,GACF;AAAA,KACF;AAGF,SACE,6CAAC,aAAQ,WAAU,yBAEjB;AAAA,gDAAC,WAAM,MAAK,iBAAgB,YAAW,WACpC,0BACH;AAAA,IACA,4CAAC,SAAI,WAAU,0BACZ,oBAAU,YACT;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,YAAY;AAAA,QACd;AAAA,QAGA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA,UACA,4CAAC,SAAI,WAAU,iBAAiB,mBAAQ;AAAA;AAAA;AAAA,IAC1C,IAEA,4CAAC,iBAAAC,SAAA,EAAU,SAAQ,MAAK,OAAO,OAC5B,mBACH,GAEJ;AAAA,KACF;AAEJ;","names":["ScrollReveal","GlassCard"]}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { a as PortfolioCTAData } from '../../types-D0nb6KAx.cjs';
3
+
4
+ interface CTASectionProps {
5
+ data: PortfolioCTAData;
6
+ }
7
+ declare function CTASection({ data }: CTASectionProps): React.JSX.Element;
8
+
9
+ export { CTASection as default };
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { a as PortfolioCTAData } from '../../types-D0nb6KAx.js';
3
+
4
+ interface CTASectionProps {
5
+ data: PortfolioCTAData;
6
+ }
7
+ declare function CTASection({ data }: CTASectionProps): React.JSX.Element;
8
+
9
+ export { CTASection as default };
@@ -0,0 +1,93 @@
1
+ 'use client';
2
+ "use client";
3
+
4
+ // src/portfolio/components/sections/CTASection.tsx
5
+ import ScrollReveal from "@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal";
6
+ import GlassCard from "@sonordev/agency-site-kit/portfolio/primitives/GlassCard";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ var CTA_BUTTON_CSS = `
9
+ .sk-cta-button{transition:transform .25s cubic-bezier(.25,.46,.45,.94)}
10
+ .sk-cta-button:hover{transform:translateY(-2px) scale(1.05)}
11
+ @media (prefers-reduced-motion:reduce){.sk-cta-button{transition:none}.sk-cta-button:hover{transform:none}}
12
+ `;
13
+ function CTASection({ data }) {
14
+ const style = data.style || "primary";
15
+ const content = /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center text-center gap-6 py-12 px-8 md:px-16", children: [
16
+ /* @__PURE__ */ jsx(ScrollReveal, { y: 30, children: /* @__PURE__ */ jsx(
17
+ "h2",
18
+ {
19
+ className: "text-3xl md:text-4xl lg:text-5xl font-bold leading-tight",
20
+ style: {
21
+ color: style === "primary" ? "#ffffff" : "var(--sk-text-primary, #ffffff)",
22
+ fontFamily: "var(--sk-font-heading, inherit)"
23
+ },
24
+ children: data.headline
25
+ }
26
+ ) }),
27
+ /* @__PURE__ */ jsx(ScrollReveal, { y: 20, delay: 0.15, children: /* @__PURE__ */ jsx(
28
+ "p",
29
+ {
30
+ className: "text-base md:text-lg max-w-xl leading-relaxed",
31
+ style: {
32
+ color: style === "primary" ? "rgba(255,255,255,0.85)" : "var(--sk-text-secondary, #a1a1aa)"
33
+ },
34
+ children: data.description
35
+ }
36
+ ) }),
37
+ /* @__PURE__ */ jsx(ScrollReveal, { y: 20, delay: 0.3, children: /* @__PURE__ */ jsxs(
38
+ "a",
39
+ {
40
+ href: data.buttonUrl,
41
+ "data-portfolio-action": "cta",
42
+ className: "sk-cta-button inline-flex items-center gap-2 px-8 py-4 rounded-xl text-base font-semibold",
43
+ style: {
44
+ background: style === "primary" ? "#ffffff" : "var(--sk-primary, #6366f1)",
45
+ color: style === "primary" ? "var(--sk-primary, #6366f1)" : "#ffffff",
46
+ boxShadow: "0 4px 20px rgba(0,0,0,0.2)",
47
+ willChange: "transform"
48
+ },
49
+ children: [
50
+ data.buttonText,
51
+ /* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", children: /* @__PURE__ */ jsx("path", { d: "M3.75 9h10.5M9.75 4.5L14.25 9l-4.5 4.5", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) })
52
+ ]
53
+ }
54
+ ) })
55
+ ] });
56
+ return /* @__PURE__ */ jsxs("section", { className: "w-full py-20 md:py-28", children: [
57
+ /* @__PURE__ */ jsx("style", { href: "sk-cta-button", precedence: "default", children: CTA_BUTTON_CSS }),
58
+ /* @__PURE__ */ jsx("div", { className: "max-w-5xl mx-auto px-6", children: style === "primary" ? /* @__PURE__ */ jsxs(
59
+ "div",
60
+ {
61
+ className: "relative overflow-hidden rounded-2xl",
62
+ style: {
63
+ background: `linear-gradient(135deg, var(--sk-primary, #6366f1) 0%, color-mix(in srgb, var(--sk-primary, #6366f1) 70%, #000000) 100%)`
64
+ },
65
+ children: [
66
+ /* @__PURE__ */ jsx(
67
+ "div",
68
+ {
69
+ className: "absolute -top-24 -right-24 w-64 h-64 rounded-full opacity-20",
70
+ style: {
71
+ background: "radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)"
72
+ }
73
+ }
74
+ ),
75
+ /* @__PURE__ */ jsx(
76
+ "div",
77
+ {
78
+ className: "absolute -bottom-16 -left-16 w-48 h-48 rounded-full opacity-15",
79
+ style: {
80
+ background: "radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)"
81
+ }
82
+ }
83
+ ),
84
+ /* @__PURE__ */ jsx("div", { className: "relative z-10", children: content })
85
+ ]
86
+ }
87
+ ) : /* @__PURE__ */ jsx(GlassCard, { padding: "sm", hover: false, children: content }) })
88
+ ] });
89
+ }
90
+ export {
91
+ CTASection as default
92
+ };
93
+ //# sourceMappingURL=CTASection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/portfolio/components/sections/CTASection.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\nimport type { PortfolioCTAData } from '../../../types';\nimport ScrollReveal from '@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal';\nimport GlassCard from '@sonordev/agency-site-kit/portfolio/primitives/GlassCard';\n\ninterface CTASectionProps {\n data: PortfolioCTAData;\n}\n\n// Button lift on hover (y -2, scale 1.05) — pure CSS, no mouse handlers.\n// .25s with a power2.out-style ease matches the old hover tween.\nconst CTA_BUTTON_CSS = `\n.sk-cta-button{transition:transform .25s cubic-bezier(.25,.46,.45,.94)}\n.sk-cta-button:hover{transform:translateY(-2px) scale(1.05)}\n@media (prefers-reduced-motion:reduce){.sk-cta-button{transition:none}.sk-cta-button:hover{transform:none}}\n`;\n\nexport default function CTASection({ data }: CTASectionProps) {\n const style = data.style || 'primary';\n\n const content = (\n <div className=\"flex flex-col items-center text-center gap-6 py-12 px-8 md:px-16\">\n <ScrollReveal y={30}>\n <h2\n className=\"text-3xl md:text-4xl lg:text-5xl font-bold leading-tight\"\n style={{\n color: style === 'primary' ? '#ffffff' : 'var(--sk-text-primary, #ffffff)',\n fontFamily: 'var(--sk-font-heading, inherit)',\n }}\n >\n {data.headline}\n </h2>\n </ScrollReveal>\n\n <ScrollReveal y={20} delay={0.15}>\n <p\n className=\"text-base md:text-lg max-w-xl leading-relaxed\"\n style={{\n color: style === 'primary' ? 'rgba(255,255,255,0.85)' : 'var(--sk-text-secondary, #a1a1aa)',\n }}\n >\n {data.description}\n </p>\n </ScrollReveal>\n\n <ScrollReveal y={20} delay={0.3}>\n <a\n href={data.buttonUrl}\n data-portfolio-action=\"cta\"\n className=\"sk-cta-button inline-flex items-center gap-2 px-8 py-4 rounded-xl text-base font-semibold\"\n style={{\n background:\n style === 'primary'\n ? '#ffffff'\n : 'var(--sk-primary, #6366f1)',\n color:\n style === 'primary'\n ? 'var(--sk-primary, #6366f1)'\n : '#ffffff',\n boxShadow: '0 4px 20px rgba(0,0,0,0.2)',\n willChange: 'transform',\n }}\n >\n {data.buttonText}\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\n <path d=\"M3.75 9h10.5M9.75 4.5L14.25 9l-4.5 4.5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </a>\n </ScrollReveal>\n </div>\n );\n\n return (\n <section className=\"w-full py-20 md:py-28\">\n {/* Hover CSS (React 19 hoists + dedupes via href/precedence) */}\n <style href=\"sk-cta-button\" precedence=\"default\">\n {CTA_BUTTON_CSS}\n </style>\n <div className=\"max-w-5xl mx-auto px-6\">\n {style === 'primary' ? (\n <div\n className=\"relative overflow-hidden rounded-2xl\"\n style={{\n background: `linear-gradient(135deg, var(--sk-primary, #6366f1) 0%, color-mix(in srgb, var(--sk-primary, #6366f1) 70%, #000000) 100%)`,\n }}\n >\n {/* Background gradient decorations */}\n <div\n className=\"absolute -top-24 -right-24 w-64 h-64 rounded-full opacity-20\"\n style={{\n background: 'radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)',\n }}\n />\n <div\n className=\"absolute -bottom-16 -left-16 w-48 h-48 rounded-full opacity-15\"\n style={{\n background: 'radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)',\n }}\n />\n <div className=\"relative z-10\">{content}</div>\n </div>\n ) : (\n <GlassCard padding=\"sm\" hover={false}>\n {content}\n </GlassCard>\n )}\n </div>\n </section>\n );\n}\n"],"mappings":";;;;AAIA,OAAO,kBAAkB;AACzB,OAAO,eAAe;AAoBd,cAuBA,YAvBA;AAZR,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAMR,SAAR,WAA4B,EAAE,KAAK,GAAoB;AAC5D,QAAM,QAAQ,KAAK,SAAS;AAE5B,QAAM,UACJ,qBAAC,SAAI,WAAU,oEACb;AAAA,wBAAC,gBAAa,GAAG,IACf;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO,UAAU,YAAY,YAAY;AAAA,UACzC,YAAY;AAAA,QACd;AAAA,QAEC,eAAK;AAAA;AAAA,IACR,GACF;AAAA,IAEA,oBAAC,gBAAa,GAAG,IAAI,OAAO,MAC1B;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO,UAAU,YAAY,2BAA2B;AAAA,QAC1D;AAAA,QAEC,eAAK;AAAA;AAAA,IACR,GACF;AAAA,IAEA,oBAAC,gBAAa,GAAG,IAAI,OAAO,KAC1B;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,yBAAsB;AAAA,QACtB,WAAU;AAAA,QACV,OAAO;AAAA,UACL,YACE,UAAU,YACN,YACA;AAAA,UACN,OACE,UAAU,YACN,+BACA;AAAA,UACN,WAAW;AAAA,UACX,YAAY;AAAA,QACd;AAAA,QAEC;AAAA,eAAK;AAAA,UACN,oBAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,8BAAC,UAAK,GAAE,0CAAyC,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,GACtI;AAAA;AAAA;AAAA,IACF,GACF;AAAA,KACF;AAGF,SACE,qBAAC,aAAQ,WAAU,yBAEjB;AAAA,wBAAC,WAAM,MAAK,iBAAgB,YAAW,WACpC,0BACH;AAAA,IACA,oBAAC,SAAI,WAAU,0BACZ,oBAAU,YACT;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,YAAY;AAAA,QACd;AAAA,QAGA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,SAAI,WAAU,iBAAiB,mBAAQ;AAAA;AAAA;AAAA,IAC1C,IAEA,oBAAC,aAAU,SAAQ,MAAK,OAAO,OAC5B,mBACH,GAEJ;AAAA,KACF;AAEJ;","names":[]}
@@ -1,9 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var chunkKEOHORIH_cjs = require('./chunk-KEOHORIH.cjs');
4
- var chunkIKBK7HYX_cjs = require('./chunk-IKBK7HYX.cjs');
3
+ var ScrollReveal = require('@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal');
4
+ var GlassCard = require('@sonordev/agency-site-kit/portfolio/primitives/GlassCard');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
 
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var ScrollReveal__default = /*#__PURE__*/_interopDefault(ScrollReveal);
10
+ var GlassCard__default = /*#__PURE__*/_interopDefault(GlassCard);
11
+
12
+ // src/portfolio/components/sections/ChallengesSection.tsx
7
13
  function ChallengeIcon({ name }) {
8
14
  if (!name) return null;
9
15
  const icons = {
@@ -32,7 +38,7 @@ function ChallengesSection({ data }) {
32
38
  className: "w-full py-20 md:py-28",
33
39
  style: { background: "var(--sk-bg, #0a0a0a)" },
34
40
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-7xl mx-auto px-6", children: [
35
- /* @__PURE__ */ jsxRuntime.jsxs(chunkIKBK7HYX_cjs.ScrollReveal, { y: 30, children: [
41
+ /* @__PURE__ */ jsxRuntime.jsxs(ScrollReveal__default.default, { y: 30, children: [
36
42
  /* @__PURE__ */ jsxRuntime.jsx(
37
43
  "h2",
38
44
  {
@@ -49,13 +55,13 @@ function ChallengesSection({ data }) {
49
55
  {
50
56
  className: "text-lg mb-12 max-w-2xl",
51
57
  style: { color: "var(--sk-text-secondary, #a1a1aa)" },
52
- children: "Every great project starts with obstacles to overcome. Here is how we tackled them."
58
+ children: "What stood in the way, and how we cleared it."
53
59
  }
54
60
  )
55
61
  ] }),
56
62
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-8", children: data.items.map((item, index) => {
57
63
  const isEven = index % 2 === 0;
58
- return /* @__PURE__ */ jsxRuntime.jsx(chunkIKBK7HYX_cjs.ScrollReveal, { y: 40, delay: index * 0.1, children: /* @__PURE__ */ jsxRuntime.jsx(chunkKEOHORIH_cjs.GlassCard, { padding: "lg", hover: false, children: /* @__PURE__ */ jsxRuntime.jsxs(
64
+ return /* @__PURE__ */ jsxRuntime.jsx(ScrollReveal__default.default, { y: 40, delay: index * 0.1, children: /* @__PURE__ */ jsxRuntime.jsx(GlassCard__default.default, { padding: "lg", hover: false, children: /* @__PURE__ */ jsxRuntime.jsxs(
59
65
  "div",
60
66
  {
61
67
  className: `flex flex-col lg:flex-row gap-8 ${isEven ? "" : "lg:flex-row-reverse"}`,
@@ -178,5 +184,5 @@ function ChallengesSection({ data }) {
178
184
  }
179
185
 
180
186
  module.exports = ChallengesSection;
181
- //# sourceMappingURL=ChallengesSection-IZ3DHECS.cjs.map
182
- //# sourceMappingURL=ChallengesSection-IZ3DHECS.cjs.map
187
+ //# sourceMappingURL=ChallengesSection.cjs.map
188
+ //# sourceMappingURL=ChallengesSection.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/portfolio/components/sections/ChallengesSection.tsx"],"names":["jsx","jsxs","ScrollReveal","GlassCard"],"mappings":"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","file":"ChallengesSection.cjs","sourcesContent":["// Server component — renders on the server; the client primitives below cross the\n// RSC boundary via package subpaths (never import them relatively here).\nimport React from 'react';\nimport type { PortfolioChallengesData } from '../../../types';\nimport ScrollReveal from '@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal';\nimport GlassCard from '@sonordev/agency-site-kit/portfolio/primitives/GlassCard';\n\ninterface ChallengesSectionProps {\n data: PortfolioChallengesData;\n}\n\n/** Icon registry lookup. Returns an inline SVG for known icon keys. */\nfunction ChallengeIcon({ name }: { name?: string }) {\n if (!name) return null;\n\n const icons: Record<string, React.ReactNode> = {\n speed: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n seo: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M21 21l-4.35-4.35\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n ),\n design: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n conversion: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M22 12h-4l-3 9L9 3l-3 9H2\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n mobile: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M12 18h.01\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n ),\n content: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M14 2v6h6M16 13H8M16 17H8M10 9H8\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n };\n\n return (\n <span style={{ color: 'var(--sk-primary, #6366f1)' }}>\n {icons[name] || icons.speed}\n </span>\n );\n}\n\nexport default function ChallengesSection({ data }: ChallengesSectionProps) {\n return (\n <section\n className=\"w-full py-20 md:py-28\"\n style={{ background: 'var(--sk-bg, #0a0a0a)' }}\n >\n <div className=\"max-w-7xl mx-auto px-6\">\n <ScrollReveal y={30}>\n <h2\n className=\"text-3xl md:text-4xl font-bold mb-4\"\n style={{\n color: 'var(--sk-text-primary, #ffffff)',\n fontFamily: 'var(--sk-font-heading, inherit)',\n }}\n >\n Challenges &amp; Solutions\n </h2>\n <p\n className=\"text-lg mb-12 max-w-2xl\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n What stood in the way, and how we cleared it.\n </p>\n </ScrollReveal>\n\n <div className=\"flex flex-col gap-8\">\n {data.items.map((item, index) => {\n const isEven = index % 2 === 0;\n return (\n <ScrollReveal key={index} y={40} delay={index * 0.1}>\n <GlassCard padding=\"lg\" hover={false}>\n <div\n className={`flex flex-col lg:flex-row gap-8 ${\n isEven ? '' : 'lg:flex-row-reverse'\n }`}\n >\n {/* Challenge side */}\n <div className=\"flex-1 flex flex-col gap-3\">\n <div className=\"flex items-center gap-3\">\n {/* Number badge */}\n <span\n className=\"flex items-center justify-center w-10 h-10 rounded-full text-sm font-bold shrink-0\"\n style={{\n background: 'color-mix(in srgb, var(--sk-primary, #6366f1) 15%, transparent)',\n color: 'var(--sk-primary, #6366f1)',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #6366f1) 25%, transparent)',\n }}\n >\n {String(index + 1).padStart(2, '0')}\n </span>\n <ChallengeIcon name={item.icon} />\n <h3\n className=\"text-xl font-semibold\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n {item.title}\n </h3>\n </div>\n <p\n className=\"text-base leading-relaxed\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {item.description}\n </p>\n </div>\n\n {/* Divider */}\n <div\n className=\"hidden lg:block w-px self-stretch\"\n style={{\n background: 'var(--sk-border, rgba(255,255,255,0.1))',\n }}\n />\n <div\n className=\"lg:hidden h-px w-full\"\n style={{\n background: 'var(--sk-border, rgba(255,255,255,0.1))',\n }}\n />\n\n {/* Solution side */}\n <div className=\"flex-1 flex flex-col gap-3\">\n <div className=\"flex items-center gap-2\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ color: '#10b981' }}\n >\n <path\n d=\"M16.667 5L7.5 14.167 3.333 10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span\n className=\"text-sm font-semibold uppercase tracking-wider\"\n style={{ color: '#10b981' }}\n >\n Solution\n </span>\n </div>\n <p\n className=\"text-base leading-relaxed\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n {item.solution}\n </p>\n {item.result && (\n <div\n className=\"mt-2 px-4 py-2 rounded-lg text-sm\"\n style={{\n background: 'color-mix(in srgb, var(--sk-primary, #6366f1) 8%, transparent)',\n color: 'var(--sk-primary, #6366f1)',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #6366f1) 15%, transparent)',\n }}\n >\n <span className=\"font-semibold\">Result:</span> {item.result}\n </div>\n )}\n </div>\n </div>\n </GlassCard>\n </ScrollReveal>\n );\n })}\n </div>\n </div>\n </section>\n );\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { c as PortfolioChallengesData } from '../../types-0tVPy4pU.cjs';
3
+
4
+ interface ChallengesSectionProps {
5
+ data: PortfolioChallengesData;
6
+ }
7
+ declare function ChallengesSection({ data }: ChallengesSectionProps): React.JSX.Element;
8
+
9
+ export { ChallengesSection as default };
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { c as PortfolioChallengesData } from '../../types-0tVPy4pU.js';
3
+
4
+ interface ChallengesSectionProps {
5
+ data: PortfolioChallengesData;
6
+ }
7
+ declare function ChallengesSection({ data }: ChallengesSectionProps): React.JSX.Element;
8
+
9
+ export { ChallengesSection as default };
@@ -1,7 +1,8 @@
1
- import { GlassCard } from './chunk-YB4B3OMC.js';
2
- import { ScrollReveal } from './chunk-7CFFAKDM.js';
1
+ import ScrollReveal from '@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal';
2
+ import GlassCard from '@sonordev/agency-site-kit/portfolio/primitives/GlassCard';
3
3
  import { jsx, jsxs } from 'react/jsx-runtime';
4
4
 
5
+ // src/portfolio/components/sections/ChallengesSection.tsx
5
6
  function ChallengeIcon({ name }) {
6
7
  if (!name) return null;
7
8
  const icons = {
@@ -47,7 +48,7 @@ function ChallengesSection({ data }) {
47
48
  {
48
49
  className: "text-lg mb-12 max-w-2xl",
49
50
  style: { color: "var(--sk-text-secondary, #a1a1aa)" },
50
- children: "Every great project starts with obstacles to overcome. Here is how we tackled them."
51
+ children: "What stood in the way, and how we cleared it."
51
52
  }
52
53
  )
53
54
  ] }),
@@ -176,5 +177,5 @@ function ChallengesSection({ data }) {
176
177
  }
177
178
 
178
179
  export { ChallengesSection as default };
179
- //# sourceMappingURL=ChallengesSection-GEQGVSJN.js.map
180
- //# sourceMappingURL=ChallengesSection-GEQGVSJN.js.map
180
+ //# sourceMappingURL=ChallengesSection.js.map
181
+ //# sourceMappingURL=ChallengesSection.js.map