@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,356 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkKEOHORIH_cjs = require('./chunk-KEOHORIH.cjs');
4
- var chunkIKBK7HYX_cjs = require('./chunk-IKBK7HYX.cjs');
5
- var react = require('react');
6
- var gsap = require('gsap');
7
- var ScrollTrigger = require('gsap/ScrollTrigger');
8
- var jsxRuntime = require('react/jsx-runtime');
9
-
10
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
-
12
- var gsap__default = /*#__PURE__*/_interopDefault(gsap);
13
-
14
- var CATEGORIES = [
15
- { key: "performance", label: "Performance", color: "#10b981" },
16
- { key: "seo", label: "SEO", color: "#6366f1" },
17
- { key: "accessibility", label: "Accessibility", color: "#f59e0b" },
18
- { key: "bestPractices", label: "Best Practices", color: "#3b82f6" }
19
- ];
20
- function getScoreColor(score) {
21
- if (score >= 90) return "#10b981";
22
- if (score >= 50) return "#f59e0b";
23
- return "#ef4444";
24
- }
25
- function ScoreGauge({
26
- score,
27
- label,
28
- previousScore,
29
- delay = 0
30
- }) {
31
- const circleRef = react.useRef(null);
32
- const [displayScore, setDisplayScore] = react.useState(0);
33
- react.useEffect(() => {
34
- gsap__default.default.registerPlugin(ScrollTrigger.ScrollTrigger);
35
- if (!circleRef.current) return;
36
- const radius = 44;
37
- const circumference = 2 * Math.PI * radius;
38
- const offset = circumference - score / 100 * circumference;
39
- gsap__default.default.set(circleRef.current, {
40
- strokeDasharray: circumference,
41
- strokeDashoffset: circumference
42
- });
43
- const ctx = gsap__default.default.context(() => {
44
- gsap__default.default.to(circleRef.current, {
45
- strokeDashoffset: offset,
46
- duration: 1.5,
47
- ease: "power2.out",
48
- delay,
49
- scrollTrigger: {
50
- trigger: circleRef.current,
51
- start: "top 85%",
52
- toggleActions: "play none none none"
53
- },
54
- onUpdate: function() {
55
- const progress = 1 - (this.targets()[0].style.strokeDashoffset ? parseFloat(this.targets()[0].style.strokeDashoffset) / circumference : 0);
56
- setDisplayScore(Math.round(progress * score));
57
- }
58
- });
59
- });
60
- return () => ctx.revert();
61
- }, [score, delay]);
62
- const color = getScoreColor(score);
63
- const improvement = previousScore ? score - previousScore : void 0;
64
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-3", children: [
65
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative w-28 h-28", children: [
66
- /* @__PURE__ */ jsxRuntime.jsxs("svg", { className: "w-full h-full -rotate-90", viewBox: "0 0 100 100", children: [
67
- /* @__PURE__ */ jsxRuntime.jsx(
68
- "circle",
69
- {
70
- cx: "50",
71
- cy: "50",
72
- r: "44",
73
- fill: "none",
74
- stroke: "var(--sk-surface, rgba(255,255,255,0.05))",
75
- strokeWidth: "6"
76
- }
77
- ),
78
- /* @__PURE__ */ jsxRuntime.jsx(
79
- "circle",
80
- {
81
- ref: circleRef,
82
- cx: "50",
83
- cy: "50",
84
- r: "44",
85
- fill: "none",
86
- stroke: color,
87
- strokeWidth: "6",
88
- strokeLinecap: "round"
89
- }
90
- )
91
- ] }),
92
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
93
- "span",
94
- {
95
- className: "text-2xl font-bold",
96
- style: { color },
97
- children: displayScore
98
- }
99
- ) })
100
- ] }),
101
- /* @__PURE__ */ jsxRuntime.jsx(
102
- "span",
103
- {
104
- className: "text-sm font-medium text-center",
105
- style: { color: "var(--sk-text-primary, #ffffff)" },
106
- children: label
107
- }
108
- ),
109
- improvement !== void 0 && improvement > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
110
- "span",
111
- {
112
- className: "text-xs font-semibold px-2 py-0.5 rounded-full",
113
- style: {
114
- background: "color-mix(in srgb, #10b981 15%, transparent)",
115
- color: "#10b981"
116
- },
117
- children: [
118
- "+",
119
- improvement,
120
- " pts"
121
- ]
122
- }
123
- )
124
- ] });
125
- }
126
- var SCORE_EXPLANATIONS = {
127
- performance: {
128
- why: "Faster sites convert more visitors into customers. A 1-second delay in load time reduces conversions by up to 7%. Google uses page speed as a direct ranking factor.",
129
- competitors: "Wix and GoDaddy sites typically score 30\u201350 due to bloated JavaScript bundles and shared hosting. Template builders prioritize ease-of-use over speed."
130
- },
131
- seo: {
132
- why: "Technical SEO determines whether search engines can properly crawl, index, and rank your pages. Higher scores mean more organic visibility and free traffic.",
133
- competitors: "DIY builders often miss critical SEO fundamentals\u2014proper meta tags, structured data, canonical URLs, and server-side rendering that search engines need."
134
- },
135
- accessibility: {
136
- why: "Accessible sites reach more customers, including the 1 in 4 adults with disabilities. It also reduces legal risk and improves usability for everyone.",
137
- competitors: "Template platforms generate markup that frequently fails WCAG standards\u2014missing alt text, poor contrast ratios, and keyboard navigation issues."
138
- },
139
- bestPractices: {
140
- why: "Best practices cover security (HTTPS, safe APIs), modern code standards, and browser compatibility. They protect your business and your visitors.",
141
- competitors: "Older platforms rely on outdated libraries, insecure dependencies, and legacy patterns that create vulnerabilities and degrade user trust."
142
- }
143
- };
144
- function PerformanceSection({ data }) {
145
- const hasBeforeAfter = data.before && data.after;
146
- const scores = data.after || data.before;
147
- if (!scores && !data.cwv) return null;
148
- return /* @__PURE__ */ jsxRuntime.jsx(
149
- "section",
150
- {
151
- className: "w-full py-20 md:py-28",
152
- style: { background: "var(--sk-bg, #0a0a0a)" },
153
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-5xl mx-auto px-6", children: [
154
- /* @__PURE__ */ jsxRuntime.jsxs(chunkIKBK7HYX_cjs.ScrollReveal, { y: 30, children: [
155
- /* @__PURE__ */ jsxRuntime.jsx(
156
- "h2",
157
- {
158
- className: "text-3xl md:text-4xl font-bold mb-4",
159
- style: {
160
- color: "var(--sk-text-primary, #ffffff)",
161
- fontFamily: "var(--sk-font-heading, inherit)"
162
- },
163
- children: "Performance"
164
- }
165
- ),
166
- /* @__PURE__ */ jsxRuntime.jsx(
167
- "p",
168
- {
169
- className: "text-lg mb-12 max-w-2xl",
170
- style: { color: "var(--sk-text-secondary, #a1a1aa)" },
171
- children: hasBeforeAfter ? "Real Lighthouse scores \u2014 before and after our rebuild." : "Real performance metrics measured by Google Lighthouse."
172
- }
173
- )
174
- ] }),
175
- scores && /* @__PURE__ */ jsxRuntime.jsx(chunkIKBK7HYX_cjs.ScrollReveal, { y: 30, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-8 mb-8", children: CATEGORIES.map((cat, i) => {
176
- const currentScore = scores[cat.key];
177
- const previousScore = hasBeforeAfter ? data.before?.[cat.key] : void 0;
178
- if (currentScore === void 0) return null;
179
- return /* @__PURE__ */ jsxRuntime.jsx(
180
- ScoreGauge,
181
- {
182
- score: currentScore,
183
- label: cat.label,
184
- previousScore,
185
- delay: i * 0.15
186
- },
187
- cat.key
188
- );
189
- }) }) }),
190
- scores && /* @__PURE__ */ jsxRuntime.jsx(chunkIKBK7HYX_cjs.ScrollReveal, { y: 30, delay: 0.2, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid md:grid-cols-2 gap-4 mb-12", children: CATEGORIES.map((cat) => {
191
- const currentScore = scores[cat.key];
192
- if (currentScore === void 0) return null;
193
- const explanation = SCORE_EXPLANATIONS[cat.key];
194
- if (!explanation) return null;
195
- return /* @__PURE__ */ jsxRuntime.jsx(chunkKEOHORIH_cjs.GlassCard, { padding: "md", hover: false, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [
196
- /* @__PURE__ */ jsxRuntime.jsx(
197
- "div",
198
- {
199
- className: "w-10 h-10 rounded-lg flex items-center justify-center shrink-0 text-sm font-bold",
200
- style: {
201
- background: `color-mix(in srgb, ${getScoreColor(currentScore)} 15%, transparent)`,
202
- color: getScoreColor(currentScore)
203
- },
204
- children: currentScore
205
- }
206
- ),
207
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
208
- /* @__PURE__ */ jsxRuntime.jsx(
209
- "h4",
210
- {
211
- className: "text-sm font-semibold mb-1",
212
- style: { color: "var(--sk-text-primary, #ffffff)" },
213
- children: cat.label
214
- }
215
- ),
216
- /* @__PURE__ */ jsxRuntime.jsx(
217
- "p",
218
- {
219
- className: "text-xs leading-relaxed mb-2",
220
- style: { color: "var(--sk-text-secondary, #a1a1aa)" },
221
- children: explanation.why
222
- }
223
- ),
224
- /* @__PURE__ */ jsxRuntime.jsx(
225
- "p",
226
- {
227
- className: "text-xs leading-relaxed",
228
- style: { color: "var(--sk-text-tertiary, #71717a)" },
229
- children: explanation.competitors
230
- }
231
- )
232
- ] })
233
- ] }) }, cat.key);
234
- }) }) }),
235
- hasBeforeAfter && /* @__PURE__ */ jsxRuntime.jsx(chunkIKBK7HYX_cjs.ScrollReveal, { y: 30, delay: 0.3, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid md:grid-cols-2 gap-4", children: [
236
- /* @__PURE__ */ jsxRuntime.jsxs(chunkKEOHORIH_cjs.GlassCard, { padding: "lg", hover: false, children: [
237
- /* @__PURE__ */ jsxRuntime.jsx(
238
- "h3",
239
- {
240
- className: "text-sm font-semibold uppercase tracking-wider mb-4",
241
- style: { color: "#ef4444" },
242
- children: "Before (Original Site)"
243
- }
244
- ),
245
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-3", children: CATEGORIES.map((cat) => {
246
- const val = data.before?.[cat.key];
247
- if (val === void 0) return null;
248
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
249
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-2xl font-bold", style: { color: getScoreColor(val) }, children: val }),
250
- /* @__PURE__ */ jsxRuntime.jsx(
251
- "span",
252
- {
253
- className: "block text-[11px] mt-1",
254
- style: { color: "var(--sk-text-tertiary, #71717a)" },
255
- children: cat.label
256
- }
257
- )
258
- ] }, cat.key);
259
- }) })
260
- ] }),
261
- /* @__PURE__ */ jsxRuntime.jsxs(chunkKEOHORIH_cjs.GlassCard, { padding: "lg", hover: false, children: [
262
- /* @__PURE__ */ jsxRuntime.jsx(
263
- "h3",
264
- {
265
- className: "text-sm font-semibold uppercase tracking-wider mb-4",
266
- style: { color: "#10b981" },
267
- children: "After (Next.js Rebuild)"
268
- }
269
- ),
270
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-3", children: CATEGORIES.map((cat) => {
271
- const val = data.after?.[cat.key];
272
- if (val === void 0) return null;
273
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
274
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-2xl font-bold", style: { color: getScoreColor(val) }, children: val }),
275
- /* @__PURE__ */ jsxRuntime.jsx(
276
- "span",
277
- {
278
- className: "block text-[11px] mt-1",
279
- style: { color: "var(--sk-text-tertiary, #71717a)" },
280
- children: cat.label
281
- }
282
- )
283
- ] }, cat.key);
284
- }) })
285
- ] })
286
- ] }) }),
287
- data.cwv && (data.cwv.lcp != null || data.cwv.cls != null || data.cwv.inp != null) && /* @__PURE__ */ jsxRuntime.jsx(chunkIKBK7HYX_cjs.ScrollReveal, { y: 30, delay: 0.4, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-3 gap-4 mt-8", children: [
288
- data.cwv.lcp != null && /* @__PURE__ */ jsxRuntime.jsxs(chunkKEOHORIH_cjs.GlassCard, { padding: "md", hover: false, className: "text-center", children: [
289
- /* @__PURE__ */ jsxRuntime.jsxs(
290
- "span",
291
- {
292
- className: "text-2xl font-bold",
293
- style: { color: data.cwv.lcp < 2500 ? "#10b981" : data.cwv.lcp < 4e3 ? "#f59e0b" : "#ef4444" },
294
- children: [
295
- (data.cwv.lcp / 1e3).toFixed(1),
296
- "s"
297
- ]
298
- }
299
- ),
300
- /* @__PURE__ */ jsxRuntime.jsx(
301
- "span",
302
- {
303
- className: "block text-xs mt-1",
304
- style: { color: "var(--sk-text-tertiary, #71717a)" },
305
- children: "LCP"
306
- }
307
- )
308
- ] }),
309
- data.cwv.cls != null && /* @__PURE__ */ jsxRuntime.jsxs(chunkKEOHORIH_cjs.GlassCard, { padding: "md", hover: false, className: "text-center", children: [
310
- /* @__PURE__ */ jsxRuntime.jsx(
311
- "span",
312
- {
313
- className: "text-2xl font-bold",
314
- style: { color: data.cwv.cls < 0.1 ? "#10b981" : data.cwv.cls < 0.25 ? "#f59e0b" : "#ef4444" },
315
- children: data.cwv.cls.toFixed(3)
316
- }
317
- ),
318
- /* @__PURE__ */ jsxRuntime.jsx(
319
- "span",
320
- {
321
- className: "block text-xs mt-1",
322
- style: { color: "var(--sk-text-tertiary, #71717a)" },
323
- children: "CLS"
324
- }
325
- )
326
- ] }),
327
- data.cwv.inp != null && /* @__PURE__ */ jsxRuntime.jsxs(chunkKEOHORIH_cjs.GlassCard, { padding: "md", hover: false, className: "text-center", children: [
328
- /* @__PURE__ */ jsxRuntime.jsxs(
329
- "span",
330
- {
331
- className: "text-2xl font-bold",
332
- style: { color: data.cwv.inp < 200 ? "#10b981" : data.cwv.inp < 500 ? "#f59e0b" : "#ef4444" },
333
- children: [
334
- data.cwv.inp,
335
- "ms"
336
- ]
337
- }
338
- ),
339
- /* @__PURE__ */ jsxRuntime.jsx(
340
- "span",
341
- {
342
- className: "block text-xs mt-1",
343
- style: { color: "var(--sk-text-tertiary, #71717a)" },
344
- children: "INP"
345
- }
346
- )
347
- ] })
348
- ] }) })
349
- ] })
350
- }
351
- );
352
- }
353
-
354
- module.exports = PerformanceSection;
355
- //# sourceMappingURL=PerformanceSection-24TVVFZA.cjs.map
356
- //# sourceMappingURL=PerformanceSection-24TVVFZA.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/portfolio/components/sections/PerformanceSection.tsx"],"names":["useRef","useState","useEffect","gsap","ScrollTrigger","jsxs","jsx","ScrollReveal","GlassCard"],"mappings":"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","file":"PerformanceSection-24TVVFZA.cjs","sourcesContent":["'use client';\n\nimport React, { useRef, useEffect, useState } from 'react';\nimport gsap from 'gsap';\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\nimport ScrollReveal from '../primitives/ScrollReveal';\nimport GlassCard from '../primitives/GlassCard';\n\ninterface LighthouseScores {\n performance?: number;\n seo?: number;\n accessibility?: number;\n bestPractices?: number;\n}\n\ninterface PerformanceSectionProps {\n data: {\n before?: LighthouseScores;\n after?: LighthouseScores;\n cwv?: {\n lcp?: number;\n cls?: number;\n inp?: number;\n };\n };\n}\n\nconst CATEGORIES = [\n { key: 'performance', label: 'Performance', color: '#10b981' },\n { key: 'seo', label: 'SEO', color: '#6366f1' },\n { key: 'accessibility', label: 'Accessibility', color: '#f59e0b' },\n { key: 'bestPractices', label: 'Best Practices', color: '#3b82f6' },\n] as const;\n\nfunction getScoreColor(score: number): string {\n if (score >= 90) return '#10b981'; // green\n if (score >= 50) return '#f59e0b'; // amber\n return '#ef4444'; // red\n}\n\nfunction ScoreGauge({\n score,\n label,\n previousScore,\n delay = 0,\n}: {\n score: number;\n label: string;\n previousScore?: number;\n delay?: number;\n}) {\n const circleRef = useRef<SVGCircleElement>(null);\n const [displayScore, setDisplayScore] = useState(0);\n\n useEffect(() => {\n gsap.registerPlugin(ScrollTrigger);\n if (!circleRef.current) return;\n\n const radius = 44;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference - (score / 100) * circumference;\n\n gsap.set(circleRef.current, {\n strokeDasharray: circumference,\n strokeDashoffset: circumference,\n });\n\n const ctx = gsap.context(() => {\n gsap.to(circleRef.current, {\n strokeDashoffset: offset,\n duration: 1.5,\n ease: 'power2.out',\n delay,\n scrollTrigger: {\n trigger: circleRef.current,\n start: 'top 85%',\n toggleActions: 'play none none none',\n },\n onUpdate: function () {\n const progress = 1 - (this.targets()[0].style.strokeDashoffset\n ? parseFloat(this.targets()[0].style.strokeDashoffset) / circumference\n : 0);\n setDisplayScore(Math.round(progress * score));\n },\n });\n });\n\n return () => ctx.revert();\n }, [score, delay]);\n\n const color = getScoreColor(score);\n const improvement = previousScore ? score - previousScore : undefined;\n\n return (\n <div className=\"flex flex-col items-center gap-3\">\n <div className=\"relative w-28 h-28\">\n <svg className=\"w-full h-full -rotate-90\" viewBox=\"0 0 100 100\">\n {/* Background circle */}\n <circle\n cx=\"50\"\n cy=\"50\"\n r=\"44\"\n fill=\"none\"\n stroke=\"var(--sk-surface, rgba(255,255,255,0.05))\"\n strokeWidth=\"6\"\n />\n {/* Score arc */}\n <circle\n ref={circleRef}\n cx=\"50\"\n cy=\"50\"\n r=\"44\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n />\n </svg>\n {/* Score text */}\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <span\n className=\"text-2xl font-bold\"\n style={{ color }}\n >\n {displayScore}\n </span>\n </div>\n </div>\n <span\n className=\"text-sm font-medium text-center\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n {label}\n </span>\n {improvement !== undefined && improvement > 0 && (\n <span\n className=\"text-xs font-semibold px-2 py-0.5 rounded-full\"\n style={{\n background: 'color-mix(in srgb, #10b981 15%, transparent)',\n color: '#10b981',\n }}\n >\n +{improvement} pts\n </span>\n )}\n </div>\n );\n}\n\n/** Explains why each Lighthouse category matters for the business */\nconst SCORE_EXPLANATIONS: Record<string, { why: string; competitors: string }> = {\n performance: {\n why: 'Faster sites convert more visitors into customers. A 1-second delay in load time reduces conversions by up to 7%. Google uses page speed as a direct ranking factor.',\n competitors: 'Wix and GoDaddy sites typically score 30\\u201350 due to bloated JavaScript bundles and shared hosting. Template builders prioritize ease-of-use over speed.',\n },\n seo: {\n why: 'Technical SEO determines whether search engines can properly crawl, index, and rank your pages. Higher scores mean more organic visibility and free traffic.',\n competitors: 'DIY builders often miss critical SEO fundamentals\\u2014proper meta tags, structured data, canonical URLs, and server-side rendering that search engines need.',\n },\n accessibility: {\n why: 'Accessible sites reach more customers, including the 1 in 4 adults with disabilities. It also reduces legal risk and improves usability for everyone.',\n competitors: 'Template platforms generate markup that frequently fails WCAG standards\\u2014missing alt text, poor contrast ratios, and keyboard navigation issues.',\n },\n bestPractices: {\n why: 'Best practices cover security (HTTPS, safe APIs), modern code standards, and browser compatibility. They protect your business and your visitors.',\n competitors: 'Older platforms rely on outdated libraries, insecure dependencies, and legacy patterns that create vulnerabilities and degrade user trust.',\n },\n};\n\nexport default function PerformanceSection({ data }: PerformanceSectionProps) {\n const hasBeforeAfter = data.before && data.after;\n const scores = data.after || data.before;\n if (!scores && !data.cwv) 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 <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 Performance\n </h2>\n <p\n className=\"text-lg mb-12 max-w-2xl\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n {hasBeforeAfter\n ? 'Real Lighthouse scores — before and after our rebuild.'\n : 'Real performance metrics measured by Google Lighthouse.'}\n </p>\n </ScrollReveal>\n\n {/* Score gauges */}\n {scores && (\n <ScrollReveal y={30}>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-8 mb-8\">\n {CATEGORIES.map((cat, i) => {\n const currentScore = (scores as any)[cat.key];\n const previousScore = hasBeforeAfter ? (data.before as any)?.[cat.key] : undefined;\n if (currentScore === undefined) return null;\n return (\n <ScoreGauge\n key={cat.key}\n score={currentScore}\n label={cat.label}\n previousScore={previousScore}\n delay={i * 0.15}\n />\n );\n })}\n </div>\n </ScrollReveal>\n )}\n\n {/* Why these scores matter — explanation cards */}\n {scores && (\n <ScrollReveal y={30} delay={0.2}>\n <div className=\"grid md:grid-cols-2 gap-4 mb-12\">\n {CATEGORIES.map((cat) => {\n const currentScore = (scores as any)[cat.key];\n if (currentScore === undefined) return null;\n const explanation = SCORE_EXPLANATIONS[cat.key];\n if (!explanation) return null;\n return (\n <GlassCard key={cat.key} padding=\"md\" hover={false}>\n <div className=\"flex items-start gap-3\">\n <div\n className=\"w-10 h-10 rounded-lg flex items-center justify-center shrink-0 text-sm font-bold\"\n style={{\n background: `color-mix(in srgb, ${getScoreColor(currentScore)} 15%, transparent)`,\n color: getScoreColor(currentScore),\n }}\n >\n {currentScore}\n </div>\n <div>\n <h4\n className=\"text-sm font-semibold mb-1\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n {cat.label}\n </h4>\n <p\n className=\"text-xs leading-relaxed mb-2\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n {explanation.why}\n </p>\n <p\n className=\"text-xs leading-relaxed\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {explanation.competitors}\n </p>\n </div>\n </div>\n </GlassCard>\n );\n })}\n </div>\n </ScrollReveal>\n )}\n\n {/* Before/After comparison cards */}\n {hasBeforeAfter && (\n <ScrollReveal y={30} delay={0.3}>\n <div className=\"grid md:grid-cols-2 gap-4\">\n <GlassCard padding=\"lg\" hover={false}>\n <h3\n className=\"text-sm font-semibold uppercase tracking-wider mb-4\"\n style={{ color: '#ef4444' }}\n >\n Before (Original Site)\n </h3>\n <div className=\"grid grid-cols-2 gap-3\">\n {CATEGORIES.map((cat) => {\n const val = (data.before as any)?.[cat.key];\n if (val === undefined) return null;\n return (\n <div key={cat.key} className=\"text-center\">\n <span className=\"text-2xl font-bold\" style={{ color: getScoreColor(val) }}>\n {val}\n </span>\n <span\n className=\"block text-[11px] mt-1\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {cat.label}\n </span>\n </div>\n );\n })}\n </div>\n </GlassCard>\n <GlassCard padding=\"lg\" hover={false}>\n <h3\n className=\"text-sm font-semibold uppercase tracking-wider mb-4\"\n style={{ color: '#10b981' }}\n >\n After (Next.js Rebuild)\n </h3>\n <div className=\"grid grid-cols-2 gap-3\">\n {CATEGORIES.map((cat) => {\n const val = (data.after as any)?.[cat.key];\n if (val === undefined) return null;\n return (\n <div key={cat.key} className=\"text-center\">\n <span className=\"text-2xl font-bold\" style={{ color: getScoreColor(val) }}>\n {val}\n </span>\n <span\n className=\"block text-[11px] mt-1\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {cat.label}\n </span>\n </div>\n );\n })}\n </div>\n </GlassCard>\n </div>\n </ScrollReveal>\n )}\n\n {/* Core Web Vitals */}\n {data.cwv && (data.cwv.lcp != null || data.cwv.cls != null || data.cwv.inp != null) && (\n <ScrollReveal y={30} delay={0.4}>\n <div className=\"grid grid-cols-3 gap-4 mt-8\">\n {data.cwv.lcp != null && (\n <GlassCard padding=\"md\" hover={false} className=\"text-center\">\n <span\n className=\"text-2xl font-bold\"\n style={{ color: data.cwv.lcp < 2500 ? '#10b981' : data.cwv.lcp < 4000 ? '#f59e0b' : '#ef4444' }}\n >\n {(data.cwv.lcp / 1000).toFixed(1)}s\n </span>\n <span\n className=\"block text-xs mt-1\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n LCP\n </span>\n </GlassCard>\n )}\n {data.cwv.cls != null && (\n <GlassCard padding=\"md\" hover={false} className=\"text-center\">\n <span\n className=\"text-2xl font-bold\"\n style={{ color: data.cwv.cls < 0.1 ? '#10b981' : data.cwv.cls < 0.25 ? '#f59e0b' : '#ef4444' }}\n >\n {data.cwv.cls.toFixed(3)}\n </span>\n <span\n className=\"block text-xs mt-1\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n CLS\n </span>\n </GlassCard>\n )}\n {data.cwv.inp != null && (\n <GlassCard padding=\"md\" hover={false} className=\"text-center\">\n <span\n className=\"text-2xl font-bold\"\n style={{ color: data.cwv.inp < 200 ? '#10b981' : data.cwv.inp < 500 ? '#f59e0b' : '#ef4444' }}\n >\n {data.cwv.inp}ms\n </span>\n <span\n className=\"block text-xs mt-1\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n INP\n </span>\n </GlassCard>\n )}\n </div>\n </ScrollReveal>\n )}\n </div>\n </section>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/portfolio/components/sections/PerformanceSection.tsx"],"names":[],"mappings":"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","file":"PerformanceSection-MGCEIXDX.js","sourcesContent":["'use client';\n\nimport React, { useRef, useEffect, useState } from 'react';\nimport gsap from 'gsap';\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\nimport ScrollReveal from '../primitives/ScrollReveal';\nimport GlassCard from '../primitives/GlassCard';\n\ninterface LighthouseScores {\n performance?: number;\n seo?: number;\n accessibility?: number;\n bestPractices?: number;\n}\n\ninterface PerformanceSectionProps {\n data: {\n before?: LighthouseScores;\n after?: LighthouseScores;\n cwv?: {\n lcp?: number;\n cls?: number;\n inp?: number;\n };\n };\n}\n\nconst CATEGORIES = [\n { key: 'performance', label: 'Performance', color: '#10b981' },\n { key: 'seo', label: 'SEO', color: '#6366f1' },\n { key: 'accessibility', label: 'Accessibility', color: '#f59e0b' },\n { key: 'bestPractices', label: 'Best Practices', color: '#3b82f6' },\n] as const;\n\nfunction getScoreColor(score: number): string {\n if (score >= 90) return '#10b981'; // green\n if (score >= 50) return '#f59e0b'; // amber\n return '#ef4444'; // red\n}\n\nfunction ScoreGauge({\n score,\n label,\n previousScore,\n delay = 0,\n}: {\n score: number;\n label: string;\n previousScore?: number;\n delay?: number;\n}) {\n const circleRef = useRef<SVGCircleElement>(null);\n const [displayScore, setDisplayScore] = useState(0);\n\n useEffect(() => {\n gsap.registerPlugin(ScrollTrigger);\n if (!circleRef.current) return;\n\n const radius = 44;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference - (score / 100) * circumference;\n\n gsap.set(circleRef.current, {\n strokeDasharray: circumference,\n strokeDashoffset: circumference,\n });\n\n const ctx = gsap.context(() => {\n gsap.to(circleRef.current, {\n strokeDashoffset: offset,\n duration: 1.5,\n ease: 'power2.out',\n delay,\n scrollTrigger: {\n trigger: circleRef.current,\n start: 'top 85%',\n toggleActions: 'play none none none',\n },\n onUpdate: function () {\n const progress = 1 - (this.targets()[0].style.strokeDashoffset\n ? parseFloat(this.targets()[0].style.strokeDashoffset) / circumference\n : 0);\n setDisplayScore(Math.round(progress * score));\n },\n });\n });\n\n return () => ctx.revert();\n }, [score, delay]);\n\n const color = getScoreColor(score);\n const improvement = previousScore ? score - previousScore : undefined;\n\n return (\n <div className=\"flex flex-col items-center gap-3\">\n <div className=\"relative w-28 h-28\">\n <svg className=\"w-full h-full -rotate-90\" viewBox=\"0 0 100 100\">\n {/* Background circle */}\n <circle\n cx=\"50\"\n cy=\"50\"\n r=\"44\"\n fill=\"none\"\n stroke=\"var(--sk-surface, rgba(255,255,255,0.05))\"\n strokeWidth=\"6\"\n />\n {/* Score arc */}\n <circle\n ref={circleRef}\n cx=\"50\"\n cy=\"50\"\n r=\"44\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n />\n </svg>\n {/* Score text */}\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <span\n className=\"text-2xl font-bold\"\n style={{ color }}\n >\n {displayScore}\n </span>\n </div>\n </div>\n <span\n className=\"text-sm font-medium text-center\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n {label}\n </span>\n {improvement !== undefined && improvement > 0 && (\n <span\n className=\"text-xs font-semibold px-2 py-0.5 rounded-full\"\n style={{\n background: 'color-mix(in srgb, #10b981 15%, transparent)',\n color: '#10b981',\n }}\n >\n +{improvement} pts\n </span>\n )}\n </div>\n );\n}\n\n/** Explains why each Lighthouse category matters for the business */\nconst SCORE_EXPLANATIONS: Record<string, { why: string; competitors: string }> = {\n performance: {\n why: 'Faster sites convert more visitors into customers. A 1-second delay in load time reduces conversions by up to 7%. Google uses page speed as a direct ranking factor.',\n competitors: 'Wix and GoDaddy sites typically score 30\\u201350 due to bloated JavaScript bundles and shared hosting. Template builders prioritize ease-of-use over speed.',\n },\n seo: {\n why: 'Technical SEO determines whether search engines can properly crawl, index, and rank your pages. Higher scores mean more organic visibility and free traffic.',\n competitors: 'DIY builders often miss critical SEO fundamentals\\u2014proper meta tags, structured data, canonical URLs, and server-side rendering that search engines need.',\n },\n accessibility: {\n why: 'Accessible sites reach more customers, including the 1 in 4 adults with disabilities. It also reduces legal risk and improves usability for everyone.',\n competitors: 'Template platforms generate markup that frequently fails WCAG standards\\u2014missing alt text, poor contrast ratios, and keyboard navigation issues.',\n },\n bestPractices: {\n why: 'Best practices cover security (HTTPS, safe APIs), modern code standards, and browser compatibility. They protect your business and your visitors.',\n competitors: 'Older platforms rely on outdated libraries, insecure dependencies, and legacy patterns that create vulnerabilities and degrade user trust.',\n },\n};\n\nexport default function PerformanceSection({ data }: PerformanceSectionProps) {\n const hasBeforeAfter = data.before && data.after;\n const scores = data.after || data.before;\n if (!scores && !data.cwv) 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 <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 Performance\n </h2>\n <p\n className=\"text-lg mb-12 max-w-2xl\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n {hasBeforeAfter\n ? 'Real Lighthouse scores — before and after our rebuild.'\n : 'Real performance metrics measured by Google Lighthouse.'}\n </p>\n </ScrollReveal>\n\n {/* Score gauges */}\n {scores && (\n <ScrollReveal y={30}>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-8 mb-8\">\n {CATEGORIES.map((cat, i) => {\n const currentScore = (scores as any)[cat.key];\n const previousScore = hasBeforeAfter ? (data.before as any)?.[cat.key] : undefined;\n if (currentScore === undefined) return null;\n return (\n <ScoreGauge\n key={cat.key}\n score={currentScore}\n label={cat.label}\n previousScore={previousScore}\n delay={i * 0.15}\n />\n );\n })}\n </div>\n </ScrollReveal>\n )}\n\n {/* Why these scores matter — explanation cards */}\n {scores && (\n <ScrollReveal y={30} delay={0.2}>\n <div className=\"grid md:grid-cols-2 gap-4 mb-12\">\n {CATEGORIES.map((cat) => {\n const currentScore = (scores as any)[cat.key];\n if (currentScore === undefined) return null;\n const explanation = SCORE_EXPLANATIONS[cat.key];\n if (!explanation) return null;\n return (\n <GlassCard key={cat.key} padding=\"md\" hover={false}>\n <div className=\"flex items-start gap-3\">\n <div\n className=\"w-10 h-10 rounded-lg flex items-center justify-center shrink-0 text-sm font-bold\"\n style={{\n background: `color-mix(in srgb, ${getScoreColor(currentScore)} 15%, transparent)`,\n color: getScoreColor(currentScore),\n }}\n >\n {currentScore}\n </div>\n <div>\n <h4\n className=\"text-sm font-semibold mb-1\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n {cat.label}\n </h4>\n <p\n className=\"text-xs leading-relaxed mb-2\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n {explanation.why}\n </p>\n <p\n className=\"text-xs leading-relaxed\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {explanation.competitors}\n </p>\n </div>\n </div>\n </GlassCard>\n );\n })}\n </div>\n </ScrollReveal>\n )}\n\n {/* Before/After comparison cards */}\n {hasBeforeAfter && (\n <ScrollReveal y={30} delay={0.3}>\n <div className=\"grid md:grid-cols-2 gap-4\">\n <GlassCard padding=\"lg\" hover={false}>\n <h3\n className=\"text-sm font-semibold uppercase tracking-wider mb-4\"\n style={{ color: '#ef4444' }}\n >\n Before (Original Site)\n </h3>\n <div className=\"grid grid-cols-2 gap-3\">\n {CATEGORIES.map((cat) => {\n const val = (data.before as any)?.[cat.key];\n if (val === undefined) return null;\n return (\n <div key={cat.key} className=\"text-center\">\n <span className=\"text-2xl font-bold\" style={{ color: getScoreColor(val) }}>\n {val}\n </span>\n <span\n className=\"block text-[11px] mt-1\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {cat.label}\n </span>\n </div>\n );\n })}\n </div>\n </GlassCard>\n <GlassCard padding=\"lg\" hover={false}>\n <h3\n className=\"text-sm font-semibold uppercase tracking-wider mb-4\"\n style={{ color: '#10b981' }}\n >\n After (Next.js Rebuild)\n </h3>\n <div className=\"grid grid-cols-2 gap-3\">\n {CATEGORIES.map((cat) => {\n const val = (data.after as any)?.[cat.key];\n if (val === undefined) return null;\n return (\n <div key={cat.key} className=\"text-center\">\n <span className=\"text-2xl font-bold\" style={{ color: getScoreColor(val) }}>\n {val}\n </span>\n <span\n className=\"block text-[11px] mt-1\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {cat.label}\n </span>\n </div>\n );\n })}\n </div>\n </GlassCard>\n </div>\n </ScrollReveal>\n )}\n\n {/* Core Web Vitals */}\n {data.cwv && (data.cwv.lcp != null || data.cwv.cls != null || data.cwv.inp != null) && (\n <ScrollReveal y={30} delay={0.4}>\n <div className=\"grid grid-cols-3 gap-4 mt-8\">\n {data.cwv.lcp != null && (\n <GlassCard padding=\"md\" hover={false} className=\"text-center\">\n <span\n className=\"text-2xl font-bold\"\n style={{ color: data.cwv.lcp < 2500 ? '#10b981' : data.cwv.lcp < 4000 ? '#f59e0b' : '#ef4444' }}\n >\n {(data.cwv.lcp / 1000).toFixed(1)}s\n </span>\n <span\n className=\"block text-xs mt-1\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n LCP\n </span>\n </GlassCard>\n )}\n {data.cwv.cls != null && (\n <GlassCard padding=\"md\" hover={false} className=\"text-center\">\n <span\n className=\"text-2xl font-bold\"\n style={{ color: data.cwv.cls < 0.1 ? '#10b981' : data.cwv.cls < 0.25 ? '#f59e0b' : '#ef4444' }}\n >\n {data.cwv.cls.toFixed(3)}\n </span>\n <span\n className=\"block text-xs mt-1\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n CLS\n </span>\n </GlassCard>\n )}\n {data.cwv.inp != null && (\n <GlassCard padding=\"md\" hover={false} className=\"text-center\">\n <span\n className=\"text-2xl font-bold\"\n style={{ color: data.cwv.inp < 200 ? '#10b981' : data.cwv.inp < 500 ? '#f59e0b' : '#ef4444' }}\n >\n {data.cwv.inp}ms\n </span>\n <span\n className=\"block text-xs mt-1\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n INP\n </span>\n </GlassCard>\n )}\n </div>\n </ScrollReveal>\n )}\n </div>\n </section>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/portfolio/components/sections/ResultsSection.tsx"],"names":[],"mappings":"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","file":"ResultsSection-DFUJ5U6M.js","sourcesContent":["'use client';\n\nimport React from 'react';\nimport type { PortfolioResultsData } from '../../../types';\nimport ScrollReveal from '../primitives/ScrollReveal';\nimport AnimatedCounter from '../primitives/AnimatedCounter';\nimport GlassCard from '../primitives/GlassCard';\n\ninterface ResultsSectionProps {\n data: PortfolioResultsData;\n}\n\nexport default function ResultsSection({ data }: ResultsSectionProps) {\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 Results\n </h2>\n <p\n className=\"text-lg mb-12 max-w-2xl\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n Measurable outcomes that speak for themselves.\n </p>\n </ScrollReveal>\n\n <ScrollReveal stagger={0.1}>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\n {data.items.map((item, index) => (\n <GlassCard key={index} padding=\"lg\" hover>\n <div className=\"flex flex-col gap-3\">\n {/* Metric counter */}\n {item.metric && (\n <div\n className=\"text-3xl md:text-4xl font-bold\"\n style={{ color: 'var(--sk-primary, #6366f1)' }}\n >\n <AnimatedCounter\n value={item.metric.value}\n suffix={item.metric.suffix}\n prefix={item.metric.prefix}\n duration={2.5}\n />\n </div>\n )}\n\n <h3\n className=\"text-lg font-semibold\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n {item.title}\n </h3>\n\n <p\n className=\"text-sm leading-relaxed\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {item.description}\n </p>\n\n {/* Source badge */}\n <span\n className=\"inline-flex self-start items-center gap-1 px-2.5 py-1 rounded-full text-[11px] uppercase tracking-wider font-medium mt-1\"\n style={{\n background:\n item.source === 'measured'\n ? 'color-mix(in srgb, #10b981 12%, transparent)'\n : 'color-mix(in srgb, #f59e0b 12%, transparent)',\n color: item.source === 'measured' ? '#10b981' : '#f59e0b',\n border: `1px solid ${\n item.source === 'measured'\n ? 'color-mix(in srgb, #10b981 20%, transparent)'\n : 'color-mix(in srgb, #f59e0b 20%, transparent)'\n }`,\n }}\n >\n {item.source === 'measured' ? (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M10 3L4.5 8.5 2 6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ) : (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <circle cx=\"6\" cy=\"6\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M6 4v2.5l1.5 1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n )}\n {item.source}\n </span>\n </div>\n </GlassCard>\n ))}\n </div>\n </ScrollReveal>\n </div>\n </section>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/portfolio/components/sections/ResultsSection.tsx"],"names":["jsx","jsxs","ScrollReveal","GlassCard","AnimatedCounter"],"mappings":"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","file":"ResultsSection-XLGMMQKY.cjs","sourcesContent":["'use client';\n\nimport React from 'react';\nimport type { PortfolioResultsData } from '../../../types';\nimport ScrollReveal from '../primitives/ScrollReveal';\nimport AnimatedCounter from '../primitives/AnimatedCounter';\nimport GlassCard from '../primitives/GlassCard';\n\ninterface ResultsSectionProps {\n data: PortfolioResultsData;\n}\n\nexport default function ResultsSection({ data }: ResultsSectionProps) {\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 Results\n </h2>\n <p\n className=\"text-lg mb-12 max-w-2xl\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n Measurable outcomes that speak for themselves.\n </p>\n </ScrollReveal>\n\n <ScrollReveal stagger={0.1}>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\n {data.items.map((item, index) => (\n <GlassCard key={index} padding=\"lg\" hover>\n <div className=\"flex flex-col gap-3\">\n {/* Metric counter */}\n {item.metric && (\n <div\n className=\"text-3xl md:text-4xl font-bold\"\n style={{ color: 'var(--sk-primary, #6366f1)' }}\n >\n <AnimatedCounter\n value={item.metric.value}\n suffix={item.metric.suffix}\n prefix={item.metric.prefix}\n duration={2.5}\n />\n </div>\n )}\n\n <h3\n className=\"text-lg font-semibold\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n {item.title}\n </h3>\n\n <p\n className=\"text-sm leading-relaxed\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {item.description}\n </p>\n\n {/* Source badge */}\n <span\n className=\"inline-flex self-start items-center gap-1 px-2.5 py-1 rounded-full text-[11px] uppercase tracking-wider font-medium mt-1\"\n style={{\n background:\n item.source === 'measured'\n ? 'color-mix(in srgb, #10b981 12%, transparent)'\n : 'color-mix(in srgb, #f59e0b 12%, transparent)',\n color: item.source === 'measured' ? '#10b981' : '#f59e0b',\n border: `1px solid ${\n item.source === 'measured'\n ? 'color-mix(in srgb, #10b981 20%, transparent)'\n : 'color-mix(in srgb, #f59e0b 20%, transparent)'\n }`,\n }}\n >\n {item.source === 'measured' ? (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M10 3L4.5 8.5 2 6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ) : (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <circle cx=\"6\" cy=\"6\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M6 4v2.5l1.5 1\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n )}\n {item.source}\n </span>\n </div>\n </GlassCard>\n ))}\n </div>\n </ScrollReveal>\n </div>\n </section>\n );\n}\n"]}
@@ -1,118 +0,0 @@
1
- import { GlassCard } from './chunk-YB4B3OMC.js';
2
- import { ScrollReveal } from './chunk-7CFFAKDM.js';
3
- import { jsx, jsxs } from 'react/jsx-runtime';
4
-
5
- function ServicesSection({ data }) {
6
- return /* @__PURE__ */ jsx(
7
- "section",
8
- {
9
- className: "w-full py-20 md:py-28",
10
- style: { background: "var(--sk-bg, #0a0a0a)" },
11
- children: /* @__PURE__ */ jsxs("div", { className: "max-w-7xl mx-auto px-6", children: [
12
- /* @__PURE__ */ jsxs(ScrollReveal, { y: 30, children: [
13
- /* @__PURE__ */ jsx(
14
- "h2",
15
- {
16
- className: "text-3xl md:text-4xl font-bold mb-4",
17
- style: {
18
- color: "var(--sk-text-primary, #ffffff)",
19
- fontFamily: "var(--sk-font-heading, inherit)"
20
- },
21
- children: "Services Provided"
22
- }
23
- ),
24
- /* @__PURE__ */ jsx(
25
- "p",
26
- {
27
- className: "text-lg mb-12 max-w-2xl",
28
- style: { color: "var(--sk-text-secondary, #a1a1aa)" },
29
- children: "A breakdown of the services delivered for this project."
30
- }
31
- )
32
- ] }),
33
- /* @__PURE__ */ jsx(ScrollReveal, { stagger: 0.1, children: /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6", children: data.items.map((service, index) => /* @__PURE__ */ jsx(GlassCard, { padding: "lg", hover: true, children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
34
- /* @__PURE__ */ jsx(
35
- "div",
36
- {
37
- className: "flex items-center justify-center w-12 h-12 rounded-xl",
38
- style: {
39
- background: "color-mix(in srgb, var(--sk-primary, #6366f1) 15%, transparent)"
40
- },
41
- children: service.icon ? /* @__PURE__ */ jsx("img", { src: service.icon, alt: "", width: 24, height: 24, className: "w-6 h-6 object-contain" }) : /* @__PURE__ */ jsx(
42
- "svg",
43
- {
44
- width: "24",
45
- height: "24",
46
- viewBox: "0 0 24 24",
47
- fill: "none",
48
- style: { color: "var(--sk-primary, #6366f1)" },
49
- children: /* @__PURE__ */ jsx(
50
- "path",
51
- {
52
- d: "M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5",
53
- stroke: "currentColor",
54
- strokeWidth: "2",
55
- strokeLinecap: "round",
56
- strokeLinejoin: "round"
57
- }
58
- )
59
- }
60
- )
61
- }
62
- ),
63
- /* @__PURE__ */ jsx(
64
- "h3",
65
- {
66
- className: "text-lg font-semibold",
67
- style: { color: "var(--sk-text-primary, #ffffff)" },
68
- children: service.title
69
- }
70
- ),
71
- /* @__PURE__ */ jsx(
72
- "p",
73
- {
74
- className: "text-sm leading-relaxed",
75
- style: { color: "var(--sk-text-tertiary, #71717a)" },
76
- children: service.description
77
- }
78
- ),
79
- service.features.length > 0 && /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-2 mt-1", children: service.features.map((feature, fi) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2", children: [
80
- /* @__PURE__ */ jsx(
81
- "svg",
82
- {
83
- width: "16",
84
- height: "16",
85
- viewBox: "0 0 16 16",
86
- fill: "none",
87
- className: "shrink-0 mt-0.5",
88
- style: { color: "#10b981" },
89
- children: /* @__PURE__ */ jsx(
90
- "path",
91
- {
92
- d: "M13.333 4L6 11.333 2.667 8",
93
- stroke: "currentColor",
94
- strokeWidth: "1.5",
95
- strokeLinecap: "round",
96
- strokeLinejoin: "round"
97
- }
98
- )
99
- }
100
- ),
101
- /* @__PURE__ */ jsx(
102
- "span",
103
- {
104
- className: "text-sm",
105
- style: { color: "var(--sk-text-secondary, #a1a1aa)" },
106
- children: feature
107
- }
108
- )
109
- ] }, fi)) })
110
- ] }) }, index)) }) })
111
- ] })
112
- }
113
- );
114
- }
115
-
116
- export { ServicesSection as default };
117
- //# sourceMappingURL=ServicesSection-D5V3Q4GR.js.map
118
- //# sourceMappingURL=ServicesSection-D5V3Q4GR.js.map