@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
@@ -0,0 +1,91 @@
1
+ 'use client';
2
+ "use strict";
3
+ "use client";
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/portfolio/components/PortfolioLeadCTA.tsx
23
+ var PortfolioLeadCTA_exports = {};
24
+ __export(PortfolioLeadCTA_exports, {
25
+ default: () => PortfolioLeadCTA
26
+ });
27
+ module.exports = __toCommonJS(PortfolioLeadCTA_exports);
28
+ var import_forms = require("@sonordev/site-kit/forms");
29
+ var import_client = require("@sonordev/site-kit/client");
30
+ var import_jsx_runtime = require("react/jsx-runtime");
31
+ function PortfolioLeadCTA({
32
+ formId,
33
+ item,
34
+ heading = "Want results like these?",
35
+ description = "Tell us about your project and we'll show you what's possible.",
36
+ className = ""
37
+ }) {
38
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
39
+ "section",
40
+ {
41
+ className: `w-full py-20 md:py-28 ${className}`,
42
+ style: { background: "var(--sk-bg, #0a0a0a)" },
43
+ "data-portfolio-section": "portfolioLeadForm",
44
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "max-w-2xl mx-auto px-6", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
45
+ "div",
46
+ {
47
+ className: "rounded-2xl p-8 md:p-12",
48
+ style: {
49
+ background: "var(--sk-surface, rgba(255,255,255,0.05))",
50
+ backdropFilter: "blur(16px)",
51
+ border: "1px solid var(--sk-border, rgba(255,255,255,0.1))"
52
+ },
53
+ children: [
54
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
55
+ "h2",
56
+ {
57
+ className: "text-2xl md:text-3xl font-bold mb-3",
58
+ style: {
59
+ color: "var(--sk-text-primary, #ffffff)",
60
+ fontFamily: "var(--sk-font-heading, inherit)"
61
+ },
62
+ children: heading
63
+ }
64
+ ),
65
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
66
+ "p",
67
+ {
68
+ className: "text-base mb-8",
69
+ style: { color: "var(--sk-text-secondary, #a1a1aa)" },
70
+ children: description
71
+ }
72
+ ),
73
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
74
+ import_forms.ManagedForm,
75
+ {
76
+ formId,
77
+ onSuccess: () => {
78
+ (0, import_client.trackConversion)({
79
+ type: "portfolio_lead",
80
+ metadata: { case_study: item.slug, case_study_title: item.title }
81
+ });
82
+ }
83
+ }
84
+ )
85
+ ]
86
+ }
87
+ ) })
88
+ }
89
+ );
90
+ }
91
+ //# sourceMappingURL=PortfolioLeadCTA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/portfolio/components/PortfolioLeadCTA.tsx"],"sourcesContent":["'use client';\n\n/**\n * PortfolioLeadCTA — turn a case study into a lead source.\n *\n * Renders a Sonor managed form (site-kit ManagedForm — never hand-rolled\n * markup) inside a CTA shell. Attribution comes free on two rails:\n *\n * 1. The submission's metadata.pageUrl (sent automatically by site-kit)\n * lands in the CRM's page_url/source_url columns — that IS the case\n * study URL.\n * 2. onSuccess fires a `portfolio_lead` conversion with the case-study\n * slug via the standalone dispatch, so Signal/analytics can report\n * \"leads per case study\" without parsing URLs.\n *\n * If the managed form defines a hidden `portfolio_slug` field, define it in\n * the dashboard and it will arrive pre-filled too (fields JSONB).\n */\n\nimport React from 'react';\nimport { ManagedForm } from '@sonordev/site-kit/forms';\nimport { trackConversion } from '@sonordev/site-kit/client';\n\nexport interface PortfolioLeadCTAProps {\n /** Managed form key from the Sonor dashboard (e.g. \"portfolio-inquiry\"). */\n formId: string;\n /** The case study this CTA sits on — used for lead attribution. */\n item: { slug: string; title: string };\n heading?: string;\n description?: string;\n className?: string;\n}\n\nexport default function PortfolioLeadCTA({\n formId,\n item,\n heading = 'Want results like these?',\n description = \"Tell us about your project and we'll show you what's possible.\",\n className = '',\n}: PortfolioLeadCTAProps) {\n return (\n <section\n className={`w-full py-20 md:py-28 ${className}`}\n style={{ background: 'var(--sk-bg, #0a0a0a)' }}\n data-portfolio-section=\"portfolioLeadForm\"\n >\n <div className=\"max-w-2xl mx-auto px-6\">\n <div\n className=\"rounded-2xl p-8 md:p-12\"\n style={{\n background: 'var(--sk-surface, rgba(255,255,255,0.05))',\n backdropFilter: 'blur(16px)',\n border: '1px solid var(--sk-border, rgba(255,255,255,0.1))',\n }}\n >\n <h2\n className=\"text-2xl md:text-3xl font-bold mb-3\"\n style={{\n color: 'var(--sk-text-primary, #ffffff)',\n fontFamily: 'var(--sk-font-heading, inherit)',\n }}\n >\n {heading}\n </h2>\n <p\n className=\"text-base mb-8\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n {description}\n </p>\n\n <ManagedForm\n formId={formId}\n onSuccess={() => {\n trackConversion({\n type: 'portfolio_lead',\n metadata: { case_study: item.slug, case_study_title: item.title },\n });\n }}\n />\n </div>\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBA,mBAA4B;AAC5B,oBAAgC;AA0BxB;AAdO,SAAR,iBAAkC;AAAA,EACvC;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,cAAc;AAAA,EACd,YAAY;AACd,GAA0B;AACxB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,yBAAyB,SAAS;AAAA,MAC7C,OAAO,EAAE,YAAY,wBAAwB;AAAA,MAC7C,0BAAuB;AAAA,MAEvB,sDAAC,SAAI,WAAU,0BACb;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,QAAQ;AAAA,UACV;AAAA,UAEA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,OAAO;AAAA,kBACP,YAAY;AAAA,gBACd;AAAA,gBAEC;AAAA;AAAA,YACH;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,oCAAoC;AAAA,gBAEnD;AAAA;AAAA,YACH;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,WAAW,MAAM;AACf,qDAAgB;AAAA,oBACd,MAAM;AAAA,oBACN,UAAU,EAAE,YAAY,KAAK,MAAM,kBAAkB,KAAK,MAAM;AAAA,kBAClE,CAAC;AAAA,gBACH;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF,GACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+
3
+ /**
4
+ * PortfolioLeadCTA — turn a case study into a lead source.
5
+ *
6
+ * Renders a Sonor managed form (site-kit ManagedForm — never hand-rolled
7
+ * markup) inside a CTA shell. Attribution comes free on two rails:
8
+ *
9
+ * 1. The submission's metadata.pageUrl (sent automatically by site-kit)
10
+ * lands in the CRM's page_url/source_url columns — that IS the case
11
+ * study URL.
12
+ * 2. onSuccess fires a `portfolio_lead` conversion with the case-study
13
+ * slug via the standalone dispatch, so Signal/analytics can report
14
+ * "leads per case study" without parsing URLs.
15
+ *
16
+ * If the managed form defines a hidden `portfolio_slug` field, define it in
17
+ * the dashboard and it will arrive pre-filled too (fields JSONB).
18
+ */
19
+
20
+ interface PortfolioLeadCTAProps {
21
+ /** Managed form key from the Sonor dashboard (e.g. "portfolio-inquiry"). */
22
+ formId: string;
23
+ /** The case study this CTA sits on — used for lead attribution. */
24
+ item: {
25
+ slug: string;
26
+ title: string;
27
+ };
28
+ heading?: string;
29
+ description?: string;
30
+ className?: string;
31
+ }
32
+ declare function PortfolioLeadCTA({ formId, item, heading, description, className, }: PortfolioLeadCTAProps): React.JSX.Element;
33
+
34
+ export { type PortfolioLeadCTAProps, PortfolioLeadCTA as default };
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+
3
+ /**
4
+ * PortfolioLeadCTA — turn a case study into a lead source.
5
+ *
6
+ * Renders a Sonor managed form (site-kit ManagedForm — never hand-rolled
7
+ * markup) inside a CTA shell. Attribution comes free on two rails:
8
+ *
9
+ * 1. The submission's metadata.pageUrl (sent automatically by site-kit)
10
+ * lands in the CRM's page_url/source_url columns — that IS the case
11
+ * study URL.
12
+ * 2. onSuccess fires a `portfolio_lead` conversion with the case-study
13
+ * slug via the standalone dispatch, so Signal/analytics can report
14
+ * "leads per case study" without parsing URLs.
15
+ *
16
+ * If the managed form defines a hidden `portfolio_slug` field, define it in
17
+ * the dashboard and it will arrive pre-filled too (fields JSONB).
18
+ */
19
+
20
+ interface PortfolioLeadCTAProps {
21
+ /** Managed form key from the Sonor dashboard (e.g. "portfolio-inquiry"). */
22
+ formId: string;
23
+ /** The case study this CTA sits on — used for lead attribution. */
24
+ item: {
25
+ slug: string;
26
+ title: string;
27
+ };
28
+ heading?: string;
29
+ description?: string;
30
+ className?: string;
31
+ }
32
+ declare function PortfolioLeadCTA({ formId, item, heading, description, className, }: PortfolioLeadCTAProps): React.JSX.Element;
33
+
34
+ export { type PortfolioLeadCTAProps, PortfolioLeadCTA as default };
@@ -0,0 +1,9 @@
1
+ 'use client';
2
+ "use client";
3
+ import {
4
+ PortfolioLeadCTA
5
+ } from "../../chunk-CVT7I5BQ.js";
6
+ export {
7
+ PortfolioLeadCTA as default
8
+ };
9
+ //# sourceMappingURL=PortfolioLeadCTA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,42 +1,66 @@
1
1
  'use strict';
2
2
 
3
- var chunkAVCH4LMG_cjs = require('../chunk-AVCH4LMG.cjs');
4
- require('../chunk-XONXEFJY.cjs');
5
- require('../chunk-633UMQQH.cjs');
6
- var chunkXQNJED46_cjs = require('../chunk-XQNJED46.cjs');
7
- var chunkOA5ZM4OA_cjs = require('../chunk-OA5ZM4OA.cjs');
8
- require('../chunk-KEOHORIH.cjs');
9
- require('../chunk-IKBK7HYX.cjs');
3
+ var chunkQGSW43TM_cjs = require('../chunk-QGSW43TM.cjs');
4
+ var chunkZBPF7TLZ_cjs = require('../chunk-ZBPF7TLZ.cjs');
5
+ var chunkUXUU7FVT_cjs = require('../chunk-UXUU7FVT.cjs');
6
+ require('../chunk-7ZHRMWJU.cjs');
7
+ require('../chunk-FCKDJ4MJ.cjs');
8
+ require('../chunk-HQGAX2LI.cjs');
9
+ require('../chunk-XOWSXZYW.cjs');
10
10
 
11
11
 
12
12
 
13
13
  Object.defineProperty(exports, "PORTFOLIO_SECTION_TYPES", {
14
14
  enumerable: true,
15
- get: function () { return chunkAVCH4LMG_cjs.PORTFOLIO_SECTION_TYPES; }
15
+ get: function () { return chunkQGSW43TM_cjs.PORTFOLIO_SECTION_TYPES; }
16
+ });
17
+ Object.defineProperty(exports, "PortfolioIndex", {
18
+ enumerable: true,
19
+ get: function () { return chunkQGSW43TM_cjs.PortfolioIndex; }
20
+ });
21
+ Object.defineProperty(exports, "PortfolioIndexSkeleton", {
22
+ enumerable: true,
23
+ get: function () { return chunkQGSW43TM_cjs.PortfolioIndexSkeleton; }
16
24
  });
17
25
  Object.defineProperty(exports, "PortfolioPage", {
18
26
  enumerable: true,
19
- get: function () { return chunkAVCH4LMG_cjs.PortfolioPage; }
27
+ get: function () { return chunkQGSW43TM_cjs.PortfolioPage; }
28
+ });
29
+ Object.defineProperty(exports, "PortfolioPageSkeleton", {
30
+ enumerable: true,
31
+ get: function () { return chunkQGSW43TM_cjs.PortfolioPageSkeleton; }
32
+ });
33
+ Object.defineProperty(exports, "PortfolioSchema", {
34
+ enumerable: true,
35
+ get: function () { return chunkQGSW43TM_cjs.PortfolioSchema; }
36
+ });
37
+ Object.defineProperty(exports, "formatCategoryLabel", {
38
+ enumerable: true,
39
+ get: function () { return chunkZBPF7TLZ_cjs.formatCategoryLabel; }
40
+ });
41
+ Object.defineProperty(exports, "formatServiceTag", {
42
+ enumerable: true,
43
+ get: function () { return chunkZBPF7TLZ_cjs.formatServiceTag; }
20
44
  });
21
- Object.defineProperty(exports, "getRegisteredSectionTypes", {
45
+ Object.defineProperty(exports, "MetricsProvenance", {
22
46
  enumerable: true,
23
- get: function () { return chunkXQNJED46_cjs.getRegisteredSectionTypes; }
47
+ get: function () { return chunkUXUU7FVT_cjs.MetricsProvenance; }
24
48
  });
25
- Object.defineProperty(exports, "getSectionRenderer", {
49
+ Object.defineProperty(exports, "curateHeroKpis", {
26
50
  enumerable: true,
27
- get: function () { return chunkXQNJED46_cjs.getSectionRenderer; }
51
+ get: function () { return chunkUXUU7FVT_cjs.curateHeroKpis; }
28
52
  });
29
- Object.defineProperty(exports, "registerSectionRenderer", {
53
+ Object.defineProperty(exports, "curatePortfolioProof", {
30
54
  enumerable: true,
31
- get: function () { return chunkXQNJED46_cjs.registerSectionRenderer; }
55
+ get: function () { return chunkUXUU7FVT_cjs.curatePortfolioProof; }
32
56
  });
33
- Object.defineProperty(exports, "PortfolioCard", {
57
+ Object.defineProperty(exports, "curateResultItems", {
34
58
  enumerable: true,
35
- get: function () { return chunkOA5ZM4OA_cjs.PortfolioCard; }
59
+ get: function () { return chunkUXUU7FVT_cjs.curateResultItems; }
36
60
  });
37
- Object.defineProperty(exports, "PortfolioGrid", {
61
+ Object.defineProperty(exports, "gateMetricsDeltas", {
38
62
  enumerable: true,
39
- get: function () { return chunkOA5ZM4OA_cjs.PortfolioGrid; }
63
+ get: function () { return chunkUXUU7FVT_cjs.gateMetricsDeltas; }
40
64
  });
41
65
  //# sourceMappingURL=index.cjs.map
42
66
  //# sourceMappingURL=index.cjs.map
@@ -1,12 +1,215 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { P as PortfolioItemFull } from '../types-DL4t_Cfa.cjs';
3
- export { M as MetricSource, e as MetricsDelta, f as MetricsSnapshot, g as PORTFOLIO_SECTION_TYPES, i as PortfolioBeforeAfterData, j as PortfolioCTAData, l as PortfolioChallengesData, n as PortfolioConversionFunnelData, o as PortfolioDetailsData, p as PortfolioFeatureSpotlightData, r as PortfolioGalleryData, t as PortfolioHeroData, u as PortfolioItem, v as PortfolioKPI, a as PortfolioListResponse, x as PortfolioMetricsTimelineData, z as PortfolioResultsData, A as PortfolioSection, d as PortfolioSectionData, c as PortfolioSectionDataMap, b as PortfolioSectionType, C as PortfolioSeoData, E as PortfolioServicesData, F as PortfolioStrategyData, H as PortfolioTeamData, K as PortfolioTechStackData, L as PortfolioTestimonialData, N as PortfolioVideoData } from '../types-DL4t_Cfa.cjs';
4
- export { PortfolioCard, PortfolioCardProps, PortfolioFilterProps, PortfolioGrid, PortfolioGridProps, PortfolioPageClientProps, PortfolioSectionRendererProps } from './client.cjs';
5
- export { PortfolioSectionRenderer, PortfolioSectionRenderer as SectionRenderer, getRegisteredSectionTypes, getSectionRenderer, registerSectionRenderer } from './sections.cjs';
1
+ import React from 'react';
2
+ import { P as PortfolioItemFull, M as MetricsDelta, x as PortfolioKPI, A as PortfolioResultItem } from '../types-0tVPy4pU.cjs';
3
+ export { j as MetricSource, k as MetricsSnapshot, l as PORTFOLIO_SECTION_TYPES, n as PortfolioBeforeAfterData, o as PortfolioCTAData, c as PortfolioChallengesData, r as PortfolioConversionFunnelData, d as PortfolioDetailsData, s as PortfolioFeatureSpotlightData, u as PortfolioGalleryData, e as PortfolioHeroData, w as PortfolioItem, b as PortfolioListResponse, z as PortfolioMetricsTimelineData, f as PortfolioResultsData, a as PortfolioSection, C as PortfolioSectionData, D as PortfolioSectionDataMap, E as PortfolioSectionType, F as PortfolioSeoData, g as PortfolioServicesData, H as PortfolioStrategyData, J as PortfolioTeamData, h as PortfolioTechStackData, i as PortfolioTestimonialData, N as PortfolioVideoData } from '../types-0tVPy4pU.cjs';
4
+ export * from '@sonordev/agency-site-kit/portfolio/client';
5
+
6
+ /**
7
+ * PortfolioPage — Server component that renders a full portfolio case study.
8
+ *
9
+ * Maps each section in item.sections to the correct renderer component.
10
+ * All sections below the hero are loaded lazily via next/dynamic.
11
+ *
12
+ * NOTE: This file is intentionally NOT a client component — it is designed
13
+ * to be used as an RSC in a Next.js app directory page.
14
+ *
15
+ * Sections MUST be imported via `@sonordev/agency-site-kit/portfolio/sections/*`
16
+ * (self-referencing subpaths, external in tsup's server build), never via
17
+ * relative paths: a relative import would bundle the client sections into
18
+ * this server chunk, the 'use client' boundary would be lost, and the whole
19
+ * PortfolioItemFull would serialize into the RSC flight payload again.
20
+ *
21
+ * Whether a section is a server or client component is decided by the
22
+ * section file itself (its 'use client' directive; tsup routes it to the
23
+ * matching build). Server sections are imported statically — they ship zero
24
+ * client JS, so there is nothing to lazy-load. Client sections load through
25
+ * next/dynamic so each becomes its own browser chunk, fetched only when the
26
+ * case study actually renders that section type.
27
+ */
6
28
 
7
29
  interface PortfolioPageProps {
8
30
  item: PortfolioItemFull;
9
31
  }
10
- declare function PortfolioPage({ item }: PortfolioPageProps): react_jsx_runtime.JSX.Element;
32
+ declare function PortfolioPage({ item: rawItem }: PortfolioPageProps): React.JSX.Element;
33
+
34
+ /**
35
+ * PortfolioSchema — JSON-LD structured data for a case study page.
36
+ *
37
+ * Server component: renders a single <script type="application/ld+json">
38
+ * describing the case study as a schema.org Article (there is no dedicated
39
+ * CaseStudy type; Article is what Google documents for editorial content).
40
+ * Ships zero client JS and adds rich-result eligibility + entity clarity for
41
+ * the agency's portfolio pages.
42
+ *
43
+ * Usage (in the case study page, next to <PortfolioPage />):
44
+ *
45
+ * ```tsx
46
+ * <PortfolioSchema
47
+ * item={item}
48
+ * url={`https://youragency.com/work/${item.slug}`}
49
+ * publisher={{ name: 'Your Agency', url: 'https://youragency.com' }}
50
+ * />
51
+ * ```
52
+ *
53
+ * Only reads fields from the already-sanitized PortfolioItemFull (see
54
+ * getPortfolioItem / sanitize.ts) — never section internals.
55
+ */
56
+
57
+ interface PortfolioSchemaProps {
58
+ item: PortfolioItemFull;
59
+ /** Canonical URL of this case study page. */
60
+ url: string;
61
+ /** The agency, emitted as author + publisher Organization. */
62
+ publisher?: {
63
+ name: string;
64
+ url?: string;
65
+ /** Absolute URL to a logo image. */
66
+ logo?: string;
67
+ };
68
+ }
69
+ declare function PortfolioSchema({ item, url, publisher }: PortfolioSchemaProps): React.JSX.Element;
70
+
71
+ /**
72
+ * PortfolioIndex — turnkey, server-rendered /work index.
73
+ *
74
+ * Fetches items + categories and renders: category nav (real links —
75
+ * crawlable, no client state), the portfolio grid, pagination, and an
76
+ * intentional empty state. Ships zero component JS.
77
+ *
78
+ * Category filtering is route-based for SEO:
79
+ * /work → all items
80
+ * /work/category/[category] → one category (slug via slugifyCategory)
81
+ * Pagination via ?page= on either route.
82
+ */
83
+
84
+ interface PortfolioIndexProps {
85
+ /** Route prefix for case studies + category links. Defaults to "/work". */
86
+ basePath?: string;
87
+ /** Active category SLUG (from the [category] route param). */
88
+ category?: string | null;
89
+ /** 1-based page number (from ?page=). */
90
+ page?: number;
91
+ /** Items per page. Defaults to 12. */
92
+ pageSize?: number;
93
+ /** Optional heading block rendered above the category nav. */
94
+ heading?: React.ReactNode;
95
+ /** Override the empty state. */
96
+ emptyState?: React.ReactNode;
97
+ /** Hide the category nav (e.g. single-category portfolios). */
98
+ showCategories?: boolean;
99
+ className?: string;
100
+ }
101
+ declare function PortfolioIndex({ basePath, category, page, pageSize, heading, emptyState, showCategories, className, }: PortfolioIndexProps): Promise<React.JSX.Element>;
102
+
103
+ /**
104
+ * MetricsProvenance — "these numbers are real" strip for case studies.
105
+ *
106
+ * Server component, zero JS. Renders the live metric deltas the platform
107
+ * computes from GSC/analytics baselines (MetricsDelta[]) plus the refresh
108
+ * timestamp — the trust signal a static agency portfolio can't fake.
109
+ *
110
+ * `direction` semantics come from the API: 'up' ALWAYS means "improved"
111
+ * (lower-is-better metrics like Avg Position/LCP are inverted server-side
112
+ * in metrics-baseline.service), so 'up' renders green. The ARROW glyph
113
+ * follows the raw numbers instead — an improved bounce rate shows a green ▼,
114
+ * never a green ▲ next to a value that visibly went down.
115
+ *
116
+ * Deltas pass through gateMetricsDeltas (curate-proof.ts) before display:
117
+ * raw platform deltas carry no editorial judgment, and this strip only
118
+ * exists to flatter — see that module for the policy.
119
+ */
120
+
121
+ interface MetricsProvenanceProps {
122
+ deltas: MetricsDelta[];
123
+ /** ISO timestamp of the last live-metrics refresh. */
124
+ refreshedAt?: string | null;
125
+ }
126
+ declare function MetricsProvenance({ deltas, refreshedAt }: MetricsProvenanceProps): React.JSX.Element | null;
127
+
128
+ /**
129
+ * curate-proof — single source of truth for which proof points a public case
130
+ * study is allowed to display, and in what shape.
131
+ *
132
+ * Two classes of problem this guards against (both shipped to production on
133
+ * upforge.io before this existed):
134
+ *
135
+ * 1. Repetition: generated items arrive with four "100/100 Lighthouse X"
136
+ * KPIs in the hero, the same four restated as Results cards, AND a full
137
+ * Performance section with score gauges. One differentiator repeated
138
+ * twelve times per page stops differentiating. The Performance section is
139
+ * the one home for the Lighthouse breakdown; hero/results/cards collapse
140
+ * to at most one summary tile.
141
+ *
142
+ * 2. Self-harming live metrics: MetricsDelta rows are computed from raw
143
+ * analytics baselines with no editorial judgment — a bounce rate of
144
+ * "100 → 99.69" rendered as a green win. Marketing surfaces only show a
145
+ * delta when it's a genuinely flattering, meaningful story.
146
+ *
147
+ * Used by PortfolioPage (hero KPIs + results items), PortfolioCard (KPI
148
+ * preview), and MetricsProvenance (delta gate). Change display policy here,
149
+ * nowhere else.
150
+ */
151
+
152
+ /**
153
+ * Collapse per-category Lighthouse KPIs to at most one summary tile, business
154
+ * outcomes first. When every category is present at 100 the summary says so;
155
+ * otherwise the Performance category (the one buyers know) represents the set.
156
+ */
157
+ declare function curateHeroKpis(kpis: PortfolioKPI[]): PortfolioKPI[];
158
+ /**
159
+ * Drop Results cards that restate Lighthouse scores when the case study also
160
+ * renders a Performance section (the score breakdown's single home).
161
+ */
162
+ declare function curateResultItems(items: PortfolioResultItem[], hasPerformanceSection: boolean): PortfolioResultItem[];
163
+ /**
164
+ * Editorial gate for live metric deltas ("Verified from live analytics").
165
+ * `direction` comes from the platform with 'up' meaning IMPROVED (lower-is-
166
+ * better metrics are inverted server-side). A public case study only shows a
167
+ * delta when it's a win worth telling:
168
+ * - improved ('up'), never a regression or flat noise
169
+ * - moved by a double-digit relative margin (small drift isn't a story)
170
+ * - bounce-rate-style metrics must also be respectable in absolute terms —
171
+ * "100 → 99.69" is technically an improvement and still self-harm
172
+ */
173
+ declare function gateMetricsDeltas(deltas: MetricsDelta[] | undefined | null): MetricsDelta[];
174
+ /**
175
+ * Apply the full display policy to a portfolio item before rendering.
176
+ * Pure — returns a new item; the fetched payload is never mutated.
177
+ */
178
+ declare function curatePortfolioProof(item: PortfolioItemFull): PortfolioItemFull;
179
+
180
+ /**
181
+ * Presentation formatters shared by portfolio components and consuming apps.
182
+ */
183
+ /**
184
+ * Human label for a category slug. Single source of truth — HeroSection,
185
+ * PortfolioCard, and app-side filter chips all render categories through
186
+ * this. Underscores become spaces; hyphens are PRESERVED so compound slugs
187
+ * keep their canonical form ("e-commerce" → "E-Commerce", never "E Commerce"),
188
+ * and every word start (including after a hyphen) is capitalized.
189
+ */
190
+ declare function formatCategoryLabel(slug: string | undefined | null): string;
191
+ /**
192
+ * Normalize a service tag's casing for display: the first character of each
193
+ * word is uppercased, the rest left alone (so "Next.js development" becomes
194
+ * "Next.js Development" and "Technical SEO implementation" keeps "SEO").
195
+ * Fixes per-item casing drift in stored tags without touching the data.
196
+ */
197
+ declare function formatServiceTag(tag: string | undefined | null): string;
198
+
199
+ /**
200
+ * Loading skeletons for portfolio routes — pure CSS pulse, server-safe,
201
+ * zero JS. Drop into `loading.tsx`:
202
+ *
203
+ * ```tsx
204
+ * export { PortfolioIndexSkeleton as default } from '@sonordev/agency-site-kit/portfolio';
205
+ * ```
206
+ */
207
+
208
+ /** Grid of pulsing card placeholders for the /work index. */
209
+ declare function PortfolioIndexSkeleton({ cards }: {
210
+ cards?: number;
211
+ }): React.JSX.Element;
212
+ /** Hero-shaped placeholder for /work/[slug] case study pages. */
213
+ declare function PortfolioPageSkeleton(): React.JSX.Element;
11
214
 
12
- export { PortfolioItemFull, PortfolioPage };
215
+ export { MetricsDelta, MetricsProvenance, PortfolioIndex, type PortfolioIndexProps, PortfolioIndexSkeleton, PortfolioItemFull, PortfolioKPI, PortfolioPage, PortfolioPageSkeleton, PortfolioSchema, curateHeroKpis, curatePortfolioProof, curateResultItems, formatCategoryLabel, formatServiceTag, gateMetricsDeltas };