@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,33 @@
1
+ 'use client';
2
+
3
+ // src/shared/images.ts
4
+ var SANITY_ASSET_REF = /^image-[A-Za-z0-9]+-\d+x\d+-[a-z0-9]+$/;
5
+ var FILENAME_DIMS = /-(\d{2,5})x(\d{2,5})\.[a-z0-9]+(?:\?.*)?$/i;
6
+ var warnedAboutRefs = false;
7
+ function resolvePortfolioImage(input) {
8
+ const raw = typeof input === "string" ? input : input?.asset?._ref ?? "";
9
+ const value = (raw || "").trim();
10
+ if (!value) return null;
11
+ if (SANITY_ASSET_REF.test(value)) {
12
+ if (!warnedAboutRefs && typeof console !== "undefined") {
13
+ warnedAboutRefs = true;
14
+ console.warn(
15
+ "[@sonordev/agency-site-kit] Received a raw Sanity asset ref instead of an image URL \u2014 skipping render. The Sonor API should resolve image refs to cdn.sanity.io URLs before returning portfolio sections."
16
+ );
17
+ }
18
+ return null;
19
+ }
20
+ if (!/^https?:\/\//i.test(value) && !value.startsWith("/")) return null;
21
+ const dims = value.match(FILENAME_DIMS);
22
+ if (dims) {
23
+ const width = parseInt(dims[1], 10);
24
+ const height = parseInt(dims[2], 10);
25
+ if (width > 0 && height > 0) return { url: value, width, height };
26
+ }
27
+ return { url: value };
28
+ }
29
+
30
+ export {
31
+ resolvePortfolioImage
32
+ };
33
+ //# sourceMappingURL=chunk-QDXZ27R7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/images.ts"],"sourcesContent":["/**\n * Portfolio image resolution — single source of truth for turning the mixed\n * image shapes the API sends (plain URL strings, Supabase Storage URLs,\n * Sanity image objects) into something safe to render.\n *\n * IMPORTANT: a raw Sanity asset _ref (`image-{id}-{W}x{H}-{fmt}`) is an asset\n * ID, NOT a URL. Rendering it as `src` issues a garbage relative request\n * against the agency site's origin. Resolving refs to cdn.sanity.io URLs is\n * the API's job (it owns the Sanity project config); this helper refuses refs\n * so a broken image can never render, and warns once so the gap is visible.\n *\n * When a URL carries `-{W}x{H}.{ext}` dimensions (Sanity CDN URLs always do),\n * they're parsed out so callers can give next/image exact intrinsic sizes.\n */\n\nexport interface ResolvedPortfolioImage {\n url: string;\n width?: number;\n height?: number;\n}\n\n/** Raw Sanity asset reference — an ID, not a URL. */\nconst SANITY_ASSET_REF = /^image-[A-Za-z0-9]+-\\d+x\\d+-[a-z0-9]+$/;\n\n/** `…-1200x800.png` (optionally with a query string) → intrinsic dimensions. */\nconst FILENAME_DIMS = /-(\\d{2,5})x(\\d{2,5})\\.[a-z0-9]+(?:\\?.*)?$/i;\n\ninterface SanityImageLike {\n asset?: { _ref?: string };\n}\n\nlet warnedAboutRefs = false;\n\n/**\n * Resolve a portfolio image input into a renderable URL (+ intrinsic\n * dimensions when they can be derived). Returns null for empty values and\n * for unresolved Sanity refs — callers skip rendering in that case.\n */\nexport function resolvePortfolioImage(\n input: string | SanityImageLike | null | undefined,\n): ResolvedPortfolioImage | null {\n const raw =\n typeof input === 'string' ? input : input?.asset?._ref ?? '';\n const value = (raw || '').trim();\n if (!value) return null;\n\n if (SANITY_ASSET_REF.test(value)) {\n if (!warnedAboutRefs && typeof console !== 'undefined') {\n warnedAboutRefs = true;\n console.warn(\n '[@sonordev/agency-site-kit] Received a raw Sanity asset ref instead of an ' +\n 'image URL — skipping render. The Sonor API should resolve image refs to ' +\n 'cdn.sanity.io URLs before returning portfolio sections.',\n );\n }\n return null;\n }\n\n // Only absolute http(s) URLs or site-rooted paths are renderable.\n if (!/^https?:\\/\\//i.test(value) && !value.startsWith('/')) return null;\n\n const dims = value.match(FILENAME_DIMS);\n if (dims) {\n const width = parseInt(dims[1], 10);\n const height = parseInt(dims[2], 10);\n if (width > 0 && height > 0) return { url: value, width, height };\n }\n\n return { url: value };\n}\n"],"mappings":";;;AAsBA,IAAM,mBAAmB;AAGzB,IAAM,gBAAgB;AAMtB,IAAI,kBAAkB;AAOf,SAAS,sBACd,OAC+B;AAC/B,QAAM,MACJ,OAAO,UAAU,WAAW,QAAQ,OAAO,OAAO,QAAQ;AAC5D,QAAM,SAAS,OAAO,IAAI,KAAK;AAC/B,MAAI,CAAC,MAAO,QAAO;AAEnB,MAAI,iBAAiB,KAAK,KAAK,GAAG;AAChC,QAAI,CAAC,mBAAmB,OAAO,YAAY,aAAa;AACtD,wBAAkB;AAClB,cAAQ;AAAA,QACN;AAAA,MAGF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,gBAAgB,KAAK,KAAK,KAAK,CAAC,MAAM,WAAW,GAAG,EAAG,QAAO;AAEnE,QAAM,OAAO,MAAM,MAAM,aAAa;AACtC,MAAI,MAAM;AACR,UAAM,QAAQ,SAAS,KAAK,CAAC,GAAG,EAAE;AAClC,UAAM,SAAS,SAAS,KAAK,CAAC,GAAG,EAAE;AACnC,QAAI,QAAQ,KAAK,SAAS,EAAG,QAAO,EAAE,KAAK,OAAO,OAAO,OAAO;AAAA,EAClE;AAEA,SAAO,EAAE,KAAK,MAAM;AACtB;","names":[]}
@@ -0,0 +1,538 @@
1
+ 'use strict';
2
+
3
+ var chunkZBPF7TLZ_cjs = require('./chunk-ZBPF7TLZ.cjs');
4
+ var chunkUXUU7FVT_cjs = require('./chunk-UXUU7FVT.cjs');
5
+ var chunk7ZHRMWJU_cjs = require('./chunk-7ZHRMWJU.cjs');
6
+ var dynamic = require('next/dynamic');
7
+ var HeroSection = require('@sonordev/agency-site-kit/portfolio/sections/HeroSection');
8
+ var ChallengesSection = require('@sonordev/agency-site-kit/portfolio/sections/ChallengesSection');
9
+ var ResultsSection = require('@sonordev/agency-site-kit/portfolio/sections/ResultsSection');
10
+ var TechStackSection = require('@sonordev/agency-site-kit/portfolio/sections/TechStackSection');
11
+ var ServicesSection = require('@sonordev/agency-site-kit/portfolio/sections/ServicesSection');
12
+ var TestimonialSection = require('@sonordev/agency-site-kit/portfolio/sections/TestimonialSection');
13
+ var SpeedComparisonSection = require('@sonordev/agency-site-kit/portfolio/sections/SpeedComparisonSection');
14
+ var DesignSystemSection = require('@sonordev/agency-site-kit/portfolio/sections/DesignSystemSection');
15
+ var DetailsSection = require('@sonordev/agency-site-kit/portfolio/sections/DetailsSection');
16
+ var PortfolioAnalytics = require('@sonordev/agency-site-kit/portfolio/components/PortfolioAnalytics');
17
+ var jsxRuntime = require('react/jsx-runtime');
18
+ var ScrollReveal = require('@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal');
19
+ var Image = require('next/image');
20
+ var Link = require('next/link');
21
+ var GlassCard = require('@sonordev/agency-site-kit/portfolio/primitives/GlassCard');
22
+ var client = require('@sonordev/agency-site-kit/portfolio/client');
23
+
24
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
25
+
26
+ var dynamic__default = /*#__PURE__*/_interopDefault(dynamic);
27
+ var HeroSection__default = /*#__PURE__*/_interopDefault(HeroSection);
28
+ var ChallengesSection__default = /*#__PURE__*/_interopDefault(ChallengesSection);
29
+ var ResultsSection__default = /*#__PURE__*/_interopDefault(ResultsSection);
30
+ var TechStackSection__default = /*#__PURE__*/_interopDefault(TechStackSection);
31
+ var ServicesSection__default = /*#__PURE__*/_interopDefault(ServicesSection);
32
+ var TestimonialSection__default = /*#__PURE__*/_interopDefault(TestimonialSection);
33
+ var SpeedComparisonSection__default = /*#__PURE__*/_interopDefault(SpeedComparisonSection);
34
+ var DesignSystemSection__default = /*#__PURE__*/_interopDefault(DesignSystemSection);
35
+ var DetailsSection__default = /*#__PURE__*/_interopDefault(DetailsSection);
36
+ var PortfolioAnalytics__default = /*#__PURE__*/_interopDefault(PortfolioAnalytics);
37
+ var ScrollReveal__default = /*#__PURE__*/_interopDefault(ScrollReveal);
38
+ var Image__default = /*#__PURE__*/_interopDefault(Image);
39
+ var Link__default = /*#__PURE__*/_interopDefault(Link);
40
+ var GlassCard__default = /*#__PURE__*/_interopDefault(GlassCard);
41
+
42
+ var StrategySection = dynamic__default.default(() => import('@sonordev/agency-site-kit/portfolio/sections/StrategySection'), { ssr: true });
43
+ var GallerySection = dynamic__default.default(() => import('@sonordev/agency-site-kit/portfolio/sections/GallerySection'), { ssr: true });
44
+ var VideoSection = dynamic__default.default(() => import('@sonordev/agency-site-kit/portfolio/sections/VideoSection'), { ssr: true });
45
+ var TeamSection = dynamic__default.default(() => import('@sonordev/agency-site-kit/portfolio/sections/TeamSection'), { ssr: true });
46
+ var FeatureSpotlightSection = dynamic__default.default(() => import('@sonordev/agency-site-kit/portfolio/sections/FeatureSpotlightSection'), { ssr: true });
47
+ var BeforeAfterSection = dynamic__default.default(() => import('@sonordev/agency-site-kit/portfolio/sections/BeforeAfterSection'), { ssr: true });
48
+ var MetricsTimelineSection = dynamic__default.default(() => import('@sonordev/agency-site-kit/portfolio/sections/MetricsTimelineSection'), { ssr: true });
49
+ var ConversionFunnelSection = dynamic__default.default(() => import('@sonordev/agency-site-kit/portfolio/sections/ConversionFunnelSection'), { ssr: true });
50
+ var PerformanceSection = dynamic__default.default(() => import('@sonordev/agency-site-kit/portfolio/sections/PerformanceSection'), { ssr: true });
51
+ var SiteArchitectureSection = dynamic__default.default(() => import('@sonordev/agency-site-kit/portfolio/sections/SiteArchitectureSection'), { ssr: true });
52
+ var CTASection = dynamic__default.default(() => import('@sonordev/agency-site-kit/portfolio/sections/CTASection'), { ssr: true });
53
+ function renderSection(section, item, index) {
54
+ const key = `${section.sectionType}-${index}`;
55
+ switch (section.sectionType) {
56
+ case "portfolioHero":
57
+ return /* @__PURE__ */ jsxRuntime.jsx(
58
+ HeroSection__default.default,
59
+ {
60
+ data: section.data,
61
+ screenshots: item.hero_screenshots ?? void 0,
62
+ liveUrl: item.live_url ?? void 0
63
+ },
64
+ key
65
+ );
66
+ case "portfolioChallenges":
67
+ return /* @__PURE__ */ jsxRuntime.jsx(ChallengesSection__default.default, { data: section.data }, key);
68
+ case "portfolioStrategy":
69
+ return /* @__PURE__ */ jsxRuntime.jsx(StrategySection, { data: section.data }, key);
70
+ case "portfolioResults":
71
+ return /* @__PURE__ */ jsxRuntime.jsx(
72
+ ResultsSection__default.default,
73
+ {
74
+ data: section.data,
75
+ metricsDelta: item.metricsDelta,
76
+ metricsRefreshedAt: item.metrics_last_refreshed_at
77
+ },
78
+ key
79
+ );
80
+ case "portfolioTechStack":
81
+ return /* @__PURE__ */ jsxRuntime.jsx(TechStackSection__default.default, { data: section.data }, key);
82
+ case "portfolioServices":
83
+ return /* @__PURE__ */ jsxRuntime.jsx(ServicesSection__default.default, { data: section.data }, key);
84
+ case "portfolioTestimonial":
85
+ return /* @__PURE__ */ jsxRuntime.jsx(TestimonialSection__default.default, { data: section.data }, key);
86
+ case "portfolioGallery":
87
+ return /* @__PURE__ */ jsxRuntime.jsx(GallerySection, { data: section.data }, key);
88
+ case "portfolioVideo":
89
+ return /* @__PURE__ */ jsxRuntime.jsx(VideoSection, { data: section.data }, key);
90
+ case "portfolioTeam":
91
+ return /* @__PURE__ */ jsxRuntime.jsx(TeamSection, { data: section.data }, key);
92
+ case "portfolioFeatureSpotlight":
93
+ return /* @__PURE__ */ jsxRuntime.jsx(FeatureSpotlightSection, { data: section.data }, key);
94
+ case "portfolioBeforeAfter":
95
+ return /* @__PURE__ */ jsxRuntime.jsx(BeforeAfterSection, { data: section.data }, key);
96
+ case "portfolioMetricsTimeline":
97
+ return /* @__PURE__ */ jsxRuntime.jsx(MetricsTimelineSection, { data: section.data }, key);
98
+ case "portfolioConversionFunnel":
99
+ return /* @__PURE__ */ jsxRuntime.jsx(ConversionFunnelSection, { data: section.data }, key);
100
+ case "portfolioPerformance":
101
+ return /* @__PURE__ */ jsxRuntime.jsx(PerformanceSection, { data: section.data }, key);
102
+ case "portfolioSpeedComparison":
103
+ return /* @__PURE__ */ jsxRuntime.jsx(SpeedComparisonSection__default.default, { data: section.data }, key);
104
+ case "portfolioSiteArchitecture":
105
+ return /* @__PURE__ */ jsxRuntime.jsx(SiteArchitectureSection, { data: chunk7ZHRMWJU_cjs.sanitizeSiteArchitectureData(section.data) }, key);
106
+ case "portfolioDesignSystem":
107
+ return /* @__PURE__ */ jsxRuntime.jsx(DesignSystemSection__default.default, { data: section.data }, key);
108
+ case "portfolioDetails":
109
+ return /* @__PURE__ */ jsxRuntime.jsx(DetailsSection__default.default, { data: section.data }, key);
110
+ case "portfolioCTA":
111
+ return /* @__PURE__ */ jsxRuntime.jsx(CTASection, { data: section.data }, key);
112
+ case "portfolioSeo":
113
+ return null;
114
+ default:
115
+ return null;
116
+ }
117
+ }
118
+ var SECTION_ORDER = {
119
+ portfolioHero: 0,
120
+ portfolioChallenges: 1,
121
+ portfolioStrategy: 2,
122
+ portfolioResults: 3,
123
+ portfolioPerformance: 4,
124
+ portfolioSpeedComparison: 5,
125
+ portfolioSiteArchitecture: 6,
126
+ portfolioTechStack: 7,
127
+ portfolioDesignSystem: 8,
128
+ portfolioServices: 9,
129
+ portfolioBeforeAfter: 10,
130
+ portfolioTestimonial: 11,
131
+ portfolioMetricsTimeline: 12,
132
+ portfolioConversionFunnel: 13,
133
+ portfolioDetails: 14,
134
+ portfolioSeo: 15,
135
+ portfolioCTA: 16
136
+ };
137
+ function PortfolioPage({ item: rawItem }) {
138
+ const item = chunkUXUU7FVT_cjs.curatePortfolioProof(rawItem);
139
+ const sortedSections = item.sectionsOrdered ? [...item.sections].sort(
140
+ (a, b) => (a.sectionType === "portfolioHero" ? 0 : 1) - (b.sectionType === "portfolioHero" ? 0 : 1)
141
+ ) : [...item.sections].sort(
142
+ (a, b) => (SECTION_ORDER[a.sectionType] ?? 99) - (SECTION_ORDER[b.sectionType] ?? 99)
143
+ );
144
+ return /* @__PURE__ */ jsxRuntime.jsxs("article", { className: "flex w-full min-w-0 max-w-full flex-col overflow-x-clip", children: [
145
+ sortedSections.map((section, index) => {
146
+ const rendered = renderSection(section, item, index);
147
+ if (!rendered) return null;
148
+ return /* @__PURE__ */ jsxRuntime.jsx(
149
+ "div",
150
+ {
151
+ className: "w-full",
152
+ "data-portfolio-section": section.sectionType,
153
+ children: rendered
154
+ },
155
+ `wrapper-${section.sectionType}-${index}`
156
+ );
157
+ }),
158
+ /* @__PURE__ */ jsxRuntime.jsx(PortfolioAnalytics__default.default, { slug: item.slug })
159
+ ] });
160
+ }
161
+ function jsonLd(value) {
162
+ return JSON.stringify(value).replace(/</g, "\\u003c");
163
+ }
164
+ function PortfolioSchema({ item, url, publisher }) {
165
+ const headline = item.seo?.metaTitle || item.title;
166
+ const description = item.seo?.metaDescription || item.description;
167
+ const keywords = [
168
+ ...item.seo?.keywords ?? [],
169
+ item.category,
170
+ ...item.services
171
+ ].filter(Boolean);
172
+ const org = publisher ? {
173
+ "@type": "Organization",
174
+ name: publisher.name,
175
+ ...publisher.url ? { url: publisher.url } : {},
176
+ ...publisher.logo ? { logo: { "@type": "ImageObject", url: publisher.logo } } : {}
177
+ } : void 0;
178
+ const schema = {
179
+ "@context": "https://schema.org",
180
+ "@type": "Article",
181
+ headline,
182
+ ...description ? { description } : {},
183
+ ...item.hero_image ? { image: [item.hero_image] } : {},
184
+ url,
185
+ mainEntityOfPage: { "@type": "WebPage", "@id": url },
186
+ ...item.published_at ? { datePublished: item.published_at } : {},
187
+ ...item.metrics_last_refreshed_at || item.published_at ? { dateModified: item.metrics_last_refreshed_at || item.published_at } : {},
188
+ ...keywords.length ? { keywords: keywords.join(", ") } : {},
189
+ ...org ? { author: org, publisher: org } : {},
190
+ ...item.details?.industry ? { about: item.details.industry } : {}
191
+ };
192
+ return /* @__PURE__ */ jsxRuntime.jsx(
193
+ "script",
194
+ {
195
+ type: "application/ld+json",
196
+ dangerouslySetInnerHTML: { __html: jsonLd(schema) }
197
+ }
198
+ );
199
+ }
200
+ function PortfolioCard({ item, className = "", basePath = "/work" }) {
201
+ const thumbnailSrc = item.hero_screenshots?.desktop || item.hero_image || (item.project_id ? `/portfolio-previews/${item.slug}.png` : void 0);
202
+ const kpis = Array.isArray(item.kpis) ? item.kpis : [];
203
+ const services = Array.isArray(item.services) ? item.services : [];
204
+ const kpiPreview = chunkUXUU7FVT_cjs.curateHeroKpis(kpis).slice(0, 3);
205
+ const servicePreview = services.slice(0, 3);
206
+ return /* @__PURE__ */ jsxRuntime.jsx(Link__default.default, { href: `${basePath}/${item.slug}`, className: `block group ${className}`, children: /* @__PURE__ */ jsxRuntime.jsx(GlassCard__default.default, { padding: "sm", hover: true, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4", children: [
207
+ thumbnailSrc && /* @__PURE__ */ jsxRuntime.jsxs(
208
+ "div",
209
+ {
210
+ className: "relative w-full overflow-hidden rounded-xl",
211
+ style: { aspectRatio: "16/10" },
212
+ children: [
213
+ /* @__PURE__ */ jsxRuntime.jsx(
214
+ Image__default.default,
215
+ {
216
+ src: thumbnailSrc,
217
+ alt: item.hero_image_alt || item.title,
218
+ fill: true,
219
+ sizes: "(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw",
220
+ className: "object-cover object-top transition-transform duration-500 group-hover:scale-105"
221
+ }
222
+ ),
223
+ /* @__PURE__ */ jsxRuntime.jsx(
224
+ "span",
225
+ {
226
+ className: "absolute top-3 left-3 px-3 py-1 rounded-full text-[11px] uppercase tracking-wider font-semibold",
227
+ style: {
228
+ background: "color-mix(in srgb, var(--sk-primary, #6366f1) 80%, transparent)",
229
+ color: "#ffffff",
230
+ backdropFilter: "blur(8px)"
231
+ },
232
+ children: chunkZBPF7TLZ_cjs.formatCategoryLabel(item.category)
233
+ }
234
+ )
235
+ ]
236
+ }
237
+ ),
238
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2 px-2 pb-2", children: [
239
+ /* @__PURE__ */ jsxRuntime.jsx(
240
+ "h3",
241
+ {
242
+ className: "text-lg font-semibold line-clamp-1",
243
+ style: { color: "var(--sk-text-primary, #ffffff)" },
244
+ children: item.title
245
+ }
246
+ ),
247
+ item.subtitle && /* @__PURE__ */ jsxRuntime.jsx(
248
+ "p",
249
+ {
250
+ className: "text-sm line-clamp-2",
251
+ style: { color: "var(--sk-text-tertiary, #71717a)" },
252
+ children: item.subtitle
253
+ }
254
+ ),
255
+ kpiPreview.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-4 mt-1", children: kpiPreview.map((kpi, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
256
+ /* @__PURE__ */ jsxRuntime.jsxs(
257
+ "span",
258
+ {
259
+ className: "text-base font-bold",
260
+ style: { color: "var(--sk-primary, #6366f1)" },
261
+ children: [
262
+ kpi.prefix || "",
263
+ kpi.value.toLocaleString(),
264
+ kpi.suffix
265
+ ]
266
+ }
267
+ ),
268
+ /* @__PURE__ */ jsxRuntime.jsx(
269
+ "span",
270
+ {
271
+ className: "text-[10px] uppercase tracking-wider font-medium",
272
+ style: { color: "var(--sk-text-tertiary, #71717a)" },
273
+ children: kpi.label
274
+ }
275
+ )
276
+ ] }, i)) }),
277
+ servicePreview.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap gap-1.5 mt-2", children: [
278
+ servicePreview.map((service) => /* @__PURE__ */ jsxRuntime.jsx(
279
+ "span",
280
+ {
281
+ className: "px-2.5 py-0.5 rounded-full text-[11px] font-medium",
282
+ style: {
283
+ background: "var(--sk-surface, rgba(255,255,255,0.05))",
284
+ color: "var(--sk-text-secondary, #a1a1aa)",
285
+ border: "1px solid var(--sk-border, rgba(255,255,255,0.1))"
286
+ },
287
+ children: chunkZBPF7TLZ_cjs.formatServiceTag(service)
288
+ },
289
+ service
290
+ )),
291
+ services.length > 3 && /* @__PURE__ */ jsxRuntime.jsxs(
292
+ "span",
293
+ {
294
+ className: "px-2.5 py-0.5 rounded-full text-[11px] font-medium",
295
+ style: {
296
+ background: "var(--sk-surface, rgba(255,255,255,0.05))",
297
+ color: "var(--sk-text-tertiary, #71717a)"
298
+ },
299
+ children: [
300
+ "+",
301
+ item.services.length - 3
302
+ ]
303
+ }
304
+ )
305
+ ] })
306
+ ] })
307
+ ] }) }) });
308
+ }
309
+ function PortfolioGrid({ items, className = "", basePath = "/work" }) {
310
+ return /* @__PURE__ */ jsxRuntime.jsx(ScrollReveal__default.default, { stagger: 0.1, children: /* @__PURE__ */ jsxRuntime.jsx(
311
+ "div",
312
+ {
313
+ className: `grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 ${className}`,
314
+ style: {
315
+ gap: "var(--sk-grid-gap, 24px)"
316
+ },
317
+ children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(PortfolioCard, { item, basePath }, item.id))
318
+ }
319
+ ) });
320
+ }
321
+ function CategoryLink({
322
+ href,
323
+ label,
324
+ active
325
+ }) {
326
+ return /* @__PURE__ */ jsxRuntime.jsx(
327
+ "a",
328
+ {
329
+ href,
330
+ "aria-current": active ? "page" : void 0,
331
+ className: "px-4 py-1.5 rounded-full text-sm font-medium transition-colors",
332
+ style: {
333
+ background: active ? "color-mix(in srgb, var(--sk-primary, #6366f1) 15%, transparent)" : "var(--sk-surface, rgba(255,255,255,0.05))",
334
+ color: active ? "var(--sk-primary, #6366f1)" : "var(--sk-text-secondary, #a1a1aa)",
335
+ border: `1px solid ${active ? "color-mix(in srgb, var(--sk-primary, #6366f1) 25%, transparent)" : "var(--sk-border, rgba(255,255,255,0.1))"}`
336
+ },
337
+ children: label
338
+ }
339
+ );
340
+ }
341
+ function PageLink({ href, label, disabled }) {
342
+ if (disabled) {
343
+ return /* @__PURE__ */ jsxRuntime.jsx(
344
+ "span",
345
+ {
346
+ "aria-disabled": "true",
347
+ className: "px-4 py-2 rounded-xl text-sm font-medium opacity-40",
348
+ style: {
349
+ background: "var(--sk-surface, rgba(255,255,255,0.05))",
350
+ color: "var(--sk-text-tertiary, #71717a)",
351
+ border: "1px solid var(--sk-border, rgba(255,255,255,0.1))"
352
+ },
353
+ children: label
354
+ }
355
+ );
356
+ }
357
+ return /* @__PURE__ */ jsxRuntime.jsx(
358
+ "a",
359
+ {
360
+ href,
361
+ className: "px-4 py-2 rounded-xl text-sm font-medium transition-colors",
362
+ style: {
363
+ background: "var(--sk-surface, rgba(255,255,255,0.05))",
364
+ color: "var(--sk-text-secondary, #a1a1aa)",
365
+ border: "1px solid var(--sk-border, rgba(255,255,255,0.1))"
366
+ },
367
+ children: label
368
+ }
369
+ );
370
+ }
371
+ async function PortfolioIndex({
372
+ basePath = "/work",
373
+ category = null,
374
+ page = 1,
375
+ pageSize = 12,
376
+ heading,
377
+ emptyState,
378
+ showCategories = true,
379
+ className = ""
380
+ }) {
381
+ const currentPage = Math.max(1, Math.floor(page));
382
+ const categories = await chunk7ZHRMWJU_cjs.getPortfolioCategories();
383
+ const activeCategory = category ? categories.find((c) => chunk7ZHRMWJU_cjs.slugifyCategory(c) === category) ?? null : null;
384
+ const { items, total } = await chunk7ZHRMWJU_cjs.getPortfolioItems({
385
+ category: activeCategory ?? void 0,
386
+ limit: pageSize,
387
+ offset: (currentPage - 1) * pageSize
388
+ });
389
+ const totalPages = Math.max(1, Math.ceil(total / pageSize));
390
+ const pageHref = (p) => {
391
+ const base = activeCategory ? `${basePath}/category/${chunk7ZHRMWJU_cjs.slugifyCategory(activeCategory)}` : basePath;
392
+ return p <= 1 ? base : `${base}?page=${p}`;
393
+ };
394
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: `w-full ${className}`, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-7xl mx-auto px-6", children: [
395
+ heading,
396
+ showCategories && categories.length > 1 && /* @__PURE__ */ jsxRuntime.jsxs("nav", { "aria-label": "Portfolio categories", className: "flex flex-wrap gap-2 mb-10", children: [
397
+ /* @__PURE__ */ jsxRuntime.jsx(CategoryLink, { href: basePath, label: "All", active: !activeCategory }),
398
+ categories.map((c) => /* @__PURE__ */ jsxRuntime.jsx(
399
+ CategoryLink,
400
+ {
401
+ href: `${basePath}/category/${chunk7ZHRMWJU_cjs.slugifyCategory(c)}`,
402
+ label: c,
403
+ active: activeCategory === c
404
+ },
405
+ c
406
+ ))
407
+ ] }),
408
+ items.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(PortfolioGrid, { items, basePath }) : emptyState ?? /* @__PURE__ */ jsxRuntime.jsxs(
409
+ "div",
410
+ {
411
+ className: "flex flex-col items-center gap-3 py-24 rounded-2xl text-center",
412
+ style: {
413
+ background: "var(--sk-surface, rgba(255,255,255,0.03))",
414
+ border: "1px dashed var(--sk-border, rgba(255,255,255,0.1))"
415
+ },
416
+ children: [
417
+ /* @__PURE__ */ jsxRuntime.jsx(
418
+ "span",
419
+ {
420
+ className: "text-lg font-semibold",
421
+ style: { color: "var(--sk-text-primary, #ffffff)" },
422
+ children: "Case studies coming soon"
423
+ }
424
+ ),
425
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", style: { color: "var(--sk-text-tertiary, #71717a)" }, children: activeCategory ? `Nothing published in ${activeCategory} yet.` : "We're writing up our latest work right now." })
426
+ ]
427
+ }
428
+ ),
429
+ totalPages > 1 && /* @__PURE__ */ jsxRuntime.jsxs(
430
+ "nav",
431
+ {
432
+ "aria-label": "Portfolio pages",
433
+ className: "flex items-center justify-center gap-3 mt-12",
434
+ children: [
435
+ /* @__PURE__ */ jsxRuntime.jsx(
436
+ PageLink,
437
+ {
438
+ href: pageHref(currentPage - 1),
439
+ label: "\u2190 Previous",
440
+ disabled: currentPage <= 1
441
+ }
442
+ ),
443
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm", style: { color: "var(--sk-text-tertiary, #71717a)" }, children: [
444
+ "Page ",
445
+ currentPage,
446
+ " of ",
447
+ totalPages
448
+ ] }),
449
+ /* @__PURE__ */ jsxRuntime.jsx(
450
+ PageLink,
451
+ {
452
+ href: pageHref(currentPage + 1),
453
+ label: "Next \u2192",
454
+ disabled: currentPage >= totalPages
455
+ }
456
+ )
457
+ ]
458
+ }
459
+ )
460
+ ] }) });
461
+ }
462
+ var PULSE_CSS = `
463
+ .sk-skeleton{animation:sk-skeleton-pulse 1.6s ease-in-out infinite;background:var(--sk-surface,rgba(255,255,255,0.06));border:1px solid var(--sk-border,rgba(255,255,255,0.08));border-radius:16px}
464
+ @keyframes sk-skeleton-pulse{0%,100%{opacity:.55}50%{opacity:1}}
465
+ @media (prefers-reduced-motion:reduce){.sk-skeleton{animation:none}}
466
+ `;
467
+ function SkeletonStyles() {
468
+ return /* @__PURE__ */ jsxRuntime.jsx("style", { href: "sk-skeletons", precedence: "default", children: PULSE_CSS });
469
+ }
470
+ function PortfolioIndexSkeleton({ cards = 6 }) {
471
+ return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "w-full py-16", children: [
472
+ /* @__PURE__ */ jsxRuntime.jsx(SkeletonStyles, {}),
473
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-7xl mx-auto px-6", children: [
474
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-skeleton h-9 w-56 mb-4" }),
475
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-skeleton h-5 w-80 mb-10" }),
476
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6", children: Array.from({ length: cards }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [
477
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-skeleton w-full", style: { aspectRatio: "16/10" } }),
478
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-skeleton h-5 w-3/4" }),
479
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-skeleton h-4 w-1/2" })
480
+ ] }, i)) })
481
+ ] })
482
+ ] });
483
+ }
484
+ function PortfolioPageSkeleton() {
485
+ return /* @__PURE__ */ jsxRuntime.jsxs("article", { className: "w-full", children: [
486
+ /* @__PURE__ */ jsxRuntime.jsx(SkeletonStyles, {}),
487
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-7xl mx-auto px-6 py-24", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-12 items-start", children: [
488
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-5", children: [
489
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-skeleton h-7 w-32", style: { borderRadius: "9999px" } }),
490
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-skeleton h-12 w-full" }),
491
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-skeleton h-12 w-4/5" }),
492
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-skeleton h-5 w-full" }),
493
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-skeleton h-5 w-2/3" })
494
+ ] }),
495
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-skeleton w-full", style: { aspectRatio: "11/5" } })
496
+ ] }) })
497
+ ] });
498
+ }
499
+
500
+ // src/types.ts
501
+ var PORTFOLIO_SECTION_TYPES = [
502
+ "portfolioHero",
503
+ "portfolioChallenges",
504
+ "portfolioStrategy",
505
+ "portfolioResults",
506
+ "portfolioTechStack",
507
+ "portfolioServices",
508
+ "portfolioTestimonial",
509
+ "portfolioGallery",
510
+ "portfolioVideo",
511
+ "portfolioTeam",
512
+ "portfolioFeatureSpotlight",
513
+ "portfolioBeforeAfter",
514
+ "portfolioMetricsTimeline",
515
+ "portfolioConversionFunnel",
516
+ "portfolioPerformance",
517
+ "portfolioSpeedComparison",
518
+ "portfolioSiteArchitecture",
519
+ "portfolioDesignSystem",
520
+ "portfolioDetails",
521
+ "portfolioSeo",
522
+ "portfolioCTA"
523
+ ];
524
+
525
+ exports.PORTFOLIO_SECTION_TYPES = PORTFOLIO_SECTION_TYPES;
526
+ exports.PortfolioIndex = PortfolioIndex;
527
+ exports.PortfolioIndexSkeleton = PortfolioIndexSkeleton;
528
+ exports.PortfolioPage = PortfolioPage;
529
+ exports.PortfolioPageSkeleton = PortfolioPageSkeleton;
530
+ exports.PortfolioSchema = PortfolioSchema;
531
+ Object.keys(client).forEach(function (k) {
532
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
533
+ enumerable: true,
534
+ get: function () { return client[k]; }
535
+ });
536
+ });
537
+ //# sourceMappingURL=chunk-QGSW43TM.cjs.map
538
+ //# sourceMappingURL=chunk-QGSW43TM.cjs.map