@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.
- package/README.md +302 -0
- package/bin/setup.mjs +79 -0
- package/dist/{chunk-RXBK2EOE.js → chunk-4IES23GV.js} +3 -3
- package/dist/{chunk-RXBK2EOE.js.map → chunk-4IES23GV.js.map} +1 -1
- package/dist/{chunk-WNR4KNG4.cjs → chunk-5MEZU3OG.cjs} +4 -4
- package/dist/{chunk-WNR4KNG4.cjs.map → chunk-5MEZU3OG.cjs.map} +1 -1
- package/dist/chunk-7D4H36UF.js +13 -0
- package/dist/chunk-7D4H36UF.js.map +1 -0
- package/dist/chunk-7ZHRMWJU.cjs +306 -0
- package/dist/chunk-7ZHRMWJU.cjs.map +1 -0
- package/dist/chunk-CVT7I5BQ.js +71 -0
- package/dist/chunk-CVT7I5BQ.js.map +1 -0
- package/dist/chunk-HQGAX2LI.cjs +8 -0
- package/dist/chunk-HQGAX2LI.cjs.map +1 -0
- package/dist/chunk-K2BGTDSN.js +45 -0
- package/dist/chunk-K2BGTDSN.js.map +1 -0
- package/dist/chunk-KXLROAO5.js +291 -0
- package/dist/chunk-KXLROAO5.js.map +1 -0
- package/dist/chunk-L4EOQVRJ.js +6 -0
- package/dist/chunk-L4EOQVRJ.js.map +1 -0
- package/dist/chunk-NI4FVCLS.cjs +32 -0
- package/dist/chunk-NI4FVCLS.cjs.map +1 -0
- package/dist/chunk-NLGUPJZA.js +507 -0
- package/dist/chunk-NLGUPJZA.js.map +1 -0
- package/dist/chunk-QDXZ27R7.js +33 -0
- package/dist/chunk-QDXZ27R7.js.map +1 -0
- package/dist/chunk-QGSW43TM.cjs +538 -0
- package/dist/chunk-QGSW43TM.cjs.map +1 -0
- package/dist/{chunk-TVFXN6W6.js → chunk-QL6KVIFR.js} +8 -4
- package/dist/chunk-QL6KVIFR.js.map +1 -0
- package/dist/chunk-RWQ675N6.js +165 -0
- package/dist/chunk-RWQ675N6.js.map +1 -0
- package/dist/chunk-UXUU7FVT.cjs +171 -0
- package/dist/chunk-UXUU7FVT.cjs.map +1 -0
- package/dist/chunk-XJ434N7I.js +30 -0
- package/dist/chunk-XJ434N7I.js.map +1 -0
- package/dist/{chunk-EE75WRCM.cjs → chunk-XOWSXZYW.cjs} +8 -4
- package/dist/chunk-XOWSXZYW.cjs.map +1 -0
- package/dist/chunk-ZBPF7TLZ.cjs +16 -0
- package/dist/chunk-ZBPF7TLZ.cjs.map +1 -0
- package/dist/chunk-ZINKVJQU.js +67 -0
- package/dist/chunk-ZINKVJQU.js.map +1 -0
- package/dist/index.cjs +53 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -9
- package/dist/index.d.ts +17 -9
- package/dist/index.js +8 -9
- package/dist/index.js.map +1 -1
- package/dist/layout/index.cjs +3 -3
- package/dist/layout/index.d.cts +1 -1
- package/dist/layout/index.d.ts +1 -1
- package/dist/layout/index.js +2 -2
- package/dist/portfolio/client.cjs +376 -12
- package/dist/portfolio/client.cjs.map +1 -1
- package/dist/portfolio/client.d.cts +27 -85
- package/dist/portfolio/client.d.ts +27 -85
- package/dist/portfolio/client.js +182 -4
- package/dist/portfolio/client.js.map +1 -1
- package/dist/portfolio/components/PortfolioAnalytics.cjs +87 -0
- package/dist/portfolio/components/PortfolioAnalytics.cjs.map +1 -0
- package/dist/portfolio/components/PortfolioAnalytics.d.cts +5 -0
- package/dist/portfolio/components/PortfolioAnalytics.d.ts +5 -0
- package/dist/portfolio/components/PortfolioAnalytics.js +9 -0
- package/dist/portfolio/components/PortfolioAnalytics.js.map +1 -0
- package/dist/portfolio/components/PortfolioErrorFallback.cjs +65 -0
- package/dist/portfolio/components/PortfolioErrorFallback.cjs.map +1 -0
- package/dist/portfolio/components/PortfolioErrorFallback.d.cts +22 -0
- package/dist/portfolio/components/PortfolioErrorFallback.d.ts +22 -0
- package/dist/portfolio/components/PortfolioErrorFallback.js +9 -0
- package/dist/portfolio/components/PortfolioErrorFallback.js.map +1 -0
- package/dist/portfolio/components/PortfolioLeadCTA.cjs +91 -0
- package/dist/portfolio/components/PortfolioLeadCTA.cjs.map +1 -0
- package/dist/portfolio/components/PortfolioLeadCTA.d.cts +34 -0
- package/dist/portfolio/components/PortfolioLeadCTA.d.ts +34 -0
- package/dist/portfolio/components/PortfolioLeadCTA.js +9 -0
- package/dist/portfolio/components/PortfolioLeadCTA.js.map +1 -0
- package/dist/portfolio/index.cjs +43 -19
- package/dist/portfolio/index.d.cts +210 -7
- package/dist/portfolio/index.d.ts +210 -7
- package/dist/portfolio/index.js +7 -7
- package/dist/portfolio/primitives/AnimatedCounter.cjs +88 -0
- package/dist/portfolio/primitives/AnimatedCounter.cjs.map +1 -0
- package/dist/portfolio/primitives/AnimatedCounter.d.cts +22 -0
- package/dist/portfolio/primitives/AnimatedCounter.d.ts +22 -0
- package/dist/portfolio/primitives/AnimatedCounter.js +68 -0
- package/dist/portfolio/primitives/AnimatedCounter.js.map +1 -0
- package/dist/portfolio/primitives/AnnotatedImage.cjs +320 -0
- package/dist/portfolio/primitives/AnnotatedImage.cjs.map +1 -0
- package/dist/portfolio/primitives/AnnotatedImage.d.cts +18 -0
- package/dist/portfolio/primitives/AnnotatedImage.d.ts +18 -0
- package/dist/portfolio/primitives/AnnotatedImage.js +264 -0
- package/dist/portfolio/primitives/AnnotatedImage.js.map +1 -0
- package/dist/portfolio/primitives/BeforeAfterSlider.cjs +348 -0
- package/dist/portfolio/primitives/BeforeAfterSlider.cjs.map +1 -0
- package/dist/portfolio/primitives/BeforeAfterSlider.d.cts +13 -0
- package/dist/portfolio/primitives/BeforeAfterSlider.d.ts +13 -0
- package/dist/portfolio/primitives/BeforeAfterSlider.js +292 -0
- package/dist/portfolio/primitives/BeforeAfterSlider.js.map +1 -0
- package/dist/portfolio/primitives/DeviceTrifolio.cjs +298 -0
- package/dist/portfolio/primitives/DeviceTrifolio.cjs.map +1 -0
- package/dist/portfolio/primitives/DeviceTrifolio.d.cts +14 -0
- package/dist/portfolio/primitives/DeviceTrifolio.d.ts +14 -0
- package/dist/portfolio/primitives/DeviceTrifolio.js +242 -0
- package/dist/portfolio/primitives/DeviceTrifolio.js.map +1 -0
- package/dist/portfolio/primitives/FrequencyBarSkeleton.cjs +88 -0
- package/dist/portfolio/primitives/FrequencyBarSkeleton.cjs.map +1 -0
- package/dist/portfolio/primitives/FrequencyBarSkeleton.d.cts +10 -0
- package/dist/portfolio/primitives/FrequencyBarSkeleton.d.ts +10 -0
- package/dist/portfolio/primitives/FrequencyBarSkeleton.js +68 -0
- package/dist/portfolio/primitives/FrequencyBarSkeleton.js.map +1 -0
- package/dist/portfolio/primitives/GlassCard.cjs +45 -0
- package/dist/portfolio/primitives/GlassCard.cjs.map +1 -0
- package/dist/portfolio/primitives/GlassCard.d.cts +11 -0
- package/dist/portfolio/primitives/GlassCard.d.ts +11 -0
- package/dist/portfolio/primitives/GlassCard.js +43 -0
- package/dist/portfolio/primitives/GlassCard.js.map +1 -0
- package/dist/portfolio/primitives/MetricBadge.cjs +74 -0
- package/dist/portfolio/primitives/MetricBadge.cjs.map +1 -0
- package/dist/portfolio/primitives/MetricBadge.d.cts +9 -0
- package/dist/portfolio/primitives/MetricBadge.d.ts +9 -0
- package/dist/portfolio/primitives/MetricBadge.js +54 -0
- package/dist/portfolio/primitives/MetricBadge.js.map +1 -0
- package/dist/portfolio/primitives/SVGChart.cjs +316 -0
- package/dist/portfolio/primitives/SVGChart.cjs.map +1 -0
- package/dist/portfolio/primitives/SVGChart.d.cts +18 -0
- package/dist/portfolio/primitives/SVGChart.d.ts +18 -0
- package/dist/portfolio/primitives/SVGChart.js +296 -0
- package/dist/portfolio/primitives/SVGChart.js.map +1 -0
- package/dist/portfolio/primitives/ScrollReveal.cjs +97 -0
- package/dist/portfolio/primitives/ScrollReveal.cjs.map +1 -0
- package/dist/portfolio/primitives/ScrollReveal.d.cts +27 -0
- package/dist/portfolio/primitives/ScrollReveal.d.ts +27 -0
- package/dist/portfolio/primitives/ScrollReveal.js +77 -0
- package/dist/portfolio/primitives/ScrollReveal.js.map +1 -0
- package/dist/portfolio/primitives/SplitHeadline.cjs +107 -0
- package/dist/portfolio/primitives/SplitHeadline.cjs.map +1 -0
- package/dist/portfolio/primitives/SplitHeadline.d.cts +24 -0
- package/dist/portfolio/primitives/SplitHeadline.d.ts +24 -0
- package/dist/portfolio/primitives/SplitHeadline.js +87 -0
- package/dist/portfolio/primitives/SplitHeadline.js.map +1 -0
- package/dist/portfolio/sections/BeforeAfterSection.cjs +271 -0
- package/dist/portfolio/sections/BeforeAfterSection.cjs.map +1 -0
- package/dist/portfolio/sections/BeforeAfterSection.d.cts +9 -0
- package/dist/portfolio/sections/BeforeAfterSection.d.ts +9 -0
- package/dist/{BeforeAfterSection-6BHFLY4Y.js → portfolio/sections/BeforeAfterSection.js} +66 -27
- package/dist/portfolio/sections/BeforeAfterSection.js.map +1 -0
- package/dist/portfolio/sections/CTASection.cjs +123 -0
- package/dist/portfolio/sections/CTASection.cjs.map +1 -0
- package/dist/portfolio/sections/CTASection.d.cts +9 -0
- package/dist/portfolio/sections/CTASection.d.ts +9 -0
- package/dist/portfolio/sections/CTASection.js +93 -0
- package/dist/portfolio/sections/CTASection.js.map +1 -0
- package/dist/{ChallengesSection-IZ3DHECS.cjs → portfolio/sections/ChallengesSection.cjs} +13 -7
- package/dist/portfolio/sections/ChallengesSection.cjs.map +1 -0
- package/dist/portfolio/sections/ChallengesSection.d.cts +9 -0
- package/dist/portfolio/sections/ChallengesSection.d.ts +9 -0
- package/dist/{ChallengesSection-GEQGVSJN.js → portfolio/sections/ChallengesSection.js} +6 -5
- package/dist/portfolio/sections/ChallengesSection.js.map +1 -0
- package/dist/portfolio/sections/ConversionFunnelSection.cjs +263 -0
- package/dist/portfolio/sections/ConversionFunnelSection.cjs.map +1 -0
- package/dist/portfolio/sections/ConversionFunnelSection.d.cts +9 -0
- package/dist/portfolio/sections/ConversionFunnelSection.d.ts +9 -0
- package/dist/{ConversionFunnelSection-D3GE4NKE.js → portfolio/sections/ConversionFunnelSection.js} +60 -56
- package/dist/portfolio/sections/ConversionFunnelSection.js.map +1 -0
- package/dist/{DesignSystemSection-KXIQXITF.cjs → portfolio/sections/DesignSystemSection.cjs} +13 -7
- package/dist/portfolio/sections/DesignSystemSection.cjs.map +1 -0
- package/dist/portfolio/sections/DesignSystemSection.d.cts +32 -0
- package/dist/portfolio/sections/DesignSystemSection.d.ts +32 -0
- package/dist/{DesignSystemSection-2R5BRBGO.js → portfolio/sections/DesignSystemSection.js} +5 -4
- package/dist/portfolio/sections/DesignSystemSection.js.map +1 -0
- package/dist/{DetailsSection-TTUZAPZZ.cjs → portfolio/sections/DetailsSection.cjs} +12 -6
- package/dist/portfolio/sections/DetailsSection.cjs.map +1 -0
- package/dist/portfolio/sections/DetailsSection.d.cts +9 -0
- package/dist/portfolio/sections/DetailsSection.d.ts +9 -0
- package/dist/{DetailsSection-A6PZQUQL.js → portfolio/sections/DetailsSection.js} +5 -4
- package/dist/portfolio/sections/DetailsSection.js.map +1 -0
- package/dist/portfolio/sections/FeatureSpotlightSection.cjs +267 -0
- package/dist/portfolio/sections/FeatureSpotlightSection.cjs.map +1 -0
- package/dist/portfolio/sections/FeatureSpotlightSection.d.cts +9 -0
- package/dist/portfolio/sections/FeatureSpotlightSection.d.ts +9 -0
- package/dist/{FeatureSpotlightSection-B7P3JGNL.js → portfolio/sections/FeatureSpotlightSection.js} +39 -33
- package/dist/portfolio/sections/FeatureSpotlightSection.js.map +1 -0
- package/dist/portfolio/sections/GallerySection.cjs +321 -0
- package/dist/portfolio/sections/GallerySection.cjs.map +1 -0
- package/dist/portfolio/sections/GallerySection.d.cts +9 -0
- package/dist/portfolio/sections/GallerySection.d.ts +9 -0
- package/dist/{GallerySection-VMKORC47.js → portfolio/sections/GallerySection.js} +65 -18
- package/dist/portfolio/sections/GallerySection.js.map +1 -0
- package/dist/portfolio/sections/HeroSection.cjs +180 -0
- package/dist/portfolio/sections/HeroSection.cjs.map +1 -0
- package/dist/portfolio/sections/HeroSection.d.cts +15 -0
- package/dist/portfolio/sections/HeroSection.d.ts +15 -0
- package/dist/portfolio/sections/HeroSection.js +171 -0
- package/dist/portfolio/sections/HeroSection.js.map +1 -0
- package/dist/{MetricsTimelineSection-4L6DUHJ5.cjs → portfolio/sections/MetricsTimelineSection.cjs} +102 -61
- package/dist/portfolio/sections/MetricsTimelineSection.cjs.map +1 -0
- package/dist/portfolio/sections/MetricsTimelineSection.d.cts +9 -0
- package/dist/portfolio/sections/MetricsTimelineSection.d.ts +9 -0
- package/dist/{MetricsTimelineSection-6BT5GNFV.js → portfolio/sections/MetricsTimelineSection.js} +45 -29
- package/dist/portfolio/sections/MetricsTimelineSection.js.map +1 -0
- package/dist/portfolio/sections/PerformanceSection.cjs +336 -0
- package/dist/portfolio/sections/PerformanceSection.cjs.map +1 -0
- package/dist/portfolio/sections/PerformanceSection.d.cts +22 -0
- package/dist/portfolio/sections/PerformanceSection.d.ts +22 -0
- package/dist/{PerformanceSection-MGCEIXDX.js → portfolio/sections/PerformanceSection.js} +59 -104
- package/dist/portfolio/sections/PerformanceSection.js.map +1 -0
- package/dist/{ResultsSection-XLGMMQKY.cjs → portfolio/sections/ResultsSection.cjs} +23 -10
- package/dist/portfolio/sections/ResultsSection.cjs.map +1 -0
- package/dist/portfolio/sections/ResultsSection.d.cts +13 -0
- package/dist/portfolio/sections/ResultsSection.d.ts +13 -0
- package/dist/{ResultsSection-DFUJ5U6M.js → portfolio/sections/ResultsSection.js} +14 -7
- package/dist/portfolio/sections/ResultsSection.js.map +1 -0
- package/dist/portfolio/sections/ServicesSection.cjs +129 -0
- package/dist/portfolio/sections/ServicesSection.cjs.map +1 -0
- package/dist/portfolio/sections/ServicesSection.d.cts +9 -0
- package/dist/portfolio/sections/ServicesSection.d.ts +9 -0
- package/dist/portfolio/sections/ServicesSection.js +122 -0
- package/dist/portfolio/sections/ServicesSection.js.map +1 -0
- package/dist/{SiteArchitectureSection-J7BPBERH.cjs → portfolio/sections/SiteArchitectureSection.cjs} +117 -93
- package/dist/portfolio/sections/SiteArchitectureSection.cjs.map +1 -0
- package/dist/portfolio/sections/SiteArchitectureSection.d.cts +21 -0
- package/dist/portfolio/sections/SiteArchitectureSection.d.ts +21 -0
- package/dist/{SiteArchitectureSection-TE22OAWV.js → portfolio/sections/SiteArchitectureSection.js} +47 -48
- package/dist/portfolio/sections/SiteArchitectureSection.js.map +1 -0
- package/dist/{SpeedComparisonSection-EZKFQVGW.cjs → portfolio/sections/SpeedComparisonSection.cjs} +13 -7
- package/dist/portfolio/sections/SpeedComparisonSection.cjs.map +1 -0
- package/dist/portfolio/sections/SpeedComparisonSection.d.cts +20 -0
- package/dist/portfolio/sections/SpeedComparisonSection.d.ts +20 -0
- package/dist/{SpeedComparisonSection-Y3K7OFZQ.js → portfolio/sections/SpeedComparisonSection.js} +6 -5
- package/dist/portfolio/sections/SpeedComparisonSection.js.map +1 -0
- package/dist/portfolio/sections/StrategySection.cjs +233 -0
- package/dist/portfolio/sections/StrategySection.cjs.map +1 -0
- package/dist/portfolio/sections/StrategySection.d.cts +9 -0
- package/dist/portfolio/sections/StrategySection.d.ts +9 -0
- package/dist/{StrategySection-DI5RSCJU.js → portfolio/sections/StrategySection.js} +60 -26
- package/dist/portfolio/sections/StrategySection.js.map +1 -0
- package/dist/portfolio/sections/TeamSection.cjs +162 -0
- package/dist/portfolio/sections/TeamSection.cjs.map +1 -0
- package/dist/portfolio/sections/TeamSection.d.cts +9 -0
- package/dist/portfolio/sections/TeamSection.d.ts +9 -0
- package/dist/portfolio/sections/TeamSection.js +106 -0
- package/dist/portfolio/sections/TeamSection.js.map +1 -0
- package/dist/portfolio/sections/TechStackSection.cjs +106 -0
- package/dist/portfolio/sections/TechStackSection.cjs.map +1 -0
- package/dist/portfolio/sections/TechStackSection.d.cts +9 -0
- package/dist/portfolio/sections/TechStackSection.d.ts +9 -0
- package/dist/portfolio/sections/TechStackSection.js +99 -0
- package/dist/portfolio/sections/TechStackSection.js.map +1 -0
- package/dist/{TestimonialSection-XPTFUQIN.cjs → portfolio/sections/TestimonialSection.cjs} +47 -28
- package/dist/portfolio/sections/TestimonialSection.cjs.map +1 -0
- package/dist/portfolio/sections/TestimonialSection.d.cts +9 -0
- package/dist/portfolio/sections/TestimonialSection.d.ts +9 -0
- package/dist/{TestimonialSection-6RGSMXQB.js → portfolio/sections/TestimonialSection.js} +40 -27
- package/dist/portfolio/sections/TestimonialSection.js.map +1 -0
- package/dist/portfolio/sections/VideoSection.cjs +181 -0
- package/dist/portfolio/sections/VideoSection.cjs.map +1 -0
- package/dist/portfolio/sections/VideoSection.d.cts +9 -0
- package/dist/portfolio/sections/VideoSection.d.ts +9 -0
- package/dist/{VideoSection-4A2HC6K6.js → portfolio/sections/VideoSection.js} +21 -13
- package/dist/portfolio/sections/VideoSection.js.map +1 -0
- package/dist/portfolio/server.cjs +56 -144
- package/dist/portfolio/server.cjs.map +1 -1
- package/dist/portfolio/server.d.cts +157 -7
- package/dist/portfolio/server.d.ts +157 -7
- package/dist/portfolio/server.js +3 -142
- package/dist/portfolio/server.js.map +1 -1
- package/dist/preview.cjs +56 -0
- package/dist/preview.cjs.map +1 -0
- package/dist/preview.d.cts +31 -0
- package/dist/preview.d.ts +31 -0
- package/dist/preview.js +54 -0
- package/dist/preview.js.map +1 -0
- package/dist/{types-DL4t_Cfa.d.ts → types-0tVPy4pU.d.cts} +7 -1
- package/dist/{types-DL4t_Cfa.d.cts → types-0tVPy4pU.d.ts} +7 -1
- package/dist/types-D0nb6KAx.d.cts +299 -0
- package/dist/types-D0nb6KAx.d.ts +299 -0
- package/package.json +38 -14
- package/templates/api-portfolio-preview.ts +6 -0
- package/templates/api-revalidate.ts +5 -0
- package/templates/work-category-page.tsx +40 -0
- package/templates/work-error.tsx +3 -0
- package/templates/work-loading.tsx +1 -0
- package/templates/work-page.tsx +37 -0
- package/templates/work-slug-loading.tsx +1 -0
- package/templates/work-slug-page.tsx +41 -0
- package/dist/BeforeAfterSection-6BHFLY4Y.js.map +0 -1
- package/dist/BeforeAfterSection-JTORBR3A.cjs +0 -181
- package/dist/BeforeAfterSection-JTORBR3A.cjs.map +0 -1
- package/dist/CTASection-4JKLXEUF.cjs +0 -111
- package/dist/CTASection-4JKLXEUF.cjs.map +0 -1
- package/dist/CTASection-BJA72XIL.js +0 -106
- package/dist/CTASection-BJA72XIL.js.map +0 -1
- package/dist/ChallengesSection-GEQGVSJN.js.map +0 -1
- package/dist/ChallengesSection-IZ3DHECS.cjs.map +0 -1
- package/dist/ConversionFunnelSection-AUUSJ5HQ.cjs +0 -209
- package/dist/ConversionFunnelSection-AUUSJ5HQ.cjs.map +0 -1
- package/dist/ConversionFunnelSection-D3GE4NKE.js.map +0 -1
- package/dist/DesignSystemSection-2R5BRBGO.js.map +0 -1
- package/dist/DesignSystemSection-KXIQXITF.cjs.map +0 -1
- package/dist/DetailsSection-A6PZQUQL.js.map +0 -1
- package/dist/DetailsSection-TTUZAPZZ.cjs.map +0 -1
- package/dist/FeatureSpotlightSection-B7P3JGNL.js.map +0 -1
- package/dist/FeatureSpotlightSection-WRHXS7TU.cjs +0 -210
- package/dist/FeatureSpotlightSection-WRHXS7TU.cjs.map +0 -1
- package/dist/GallerySection-VMKORC47.js.map +0 -1
- package/dist/GallerySection-WJ4PQDBI.cjs +0 -219
- package/dist/GallerySection-WJ4PQDBI.cjs.map +0 -1
- package/dist/MetricsTimelineSection-4L6DUHJ5.cjs.map +0 -1
- package/dist/MetricsTimelineSection-6BT5GNFV.js.map +0 -1
- package/dist/PerformanceSection-24TVVFZA.cjs +0 -356
- package/dist/PerformanceSection-24TVVFZA.cjs.map +0 -1
- package/dist/PerformanceSection-MGCEIXDX.js.map +0 -1
- package/dist/ResultsSection-DFUJ5U6M.js.map +0 -1
- package/dist/ResultsSection-XLGMMQKY.cjs.map +0 -1
- package/dist/ServicesSection-D5V3Q4GR.js +0 -118
- package/dist/ServicesSection-D5V3Q4GR.js.map +0 -1
- package/dist/ServicesSection-WJMGK2MF.cjs +0 -120
- package/dist/ServicesSection-WJMGK2MF.cjs.map +0 -1
- package/dist/SiteArchitectureSection-J7BPBERH.cjs.map +0 -1
- package/dist/SiteArchitectureSection-TE22OAWV.js.map +0 -1
- package/dist/SpeedComparisonSection-EZKFQVGW.cjs.map +0 -1
- package/dist/SpeedComparisonSection-Y3K7OFZQ.js.map +0 -1
- package/dist/StrategySection-CJ7Y6OFQ.cjs +0 -174
- package/dist/StrategySection-CJ7Y6OFQ.cjs.map +0 -1
- package/dist/StrategySection-DI5RSCJU.js.map +0 -1
- package/dist/TeamSection-DZVSNZE6.cjs +0 -112
- package/dist/TeamSection-DZVSNZE6.cjs.map +0 -1
- package/dist/TeamSection-HGKFW6PQ.js +0 -107
- package/dist/TeamSection-HGKFW6PQ.js.map +0 -1
- package/dist/TechStackSection-2AQ7RGY3.js +0 -93
- package/dist/TechStackSection-2AQ7RGY3.js.map +0 -1
- package/dist/TechStackSection-VTNNZR5V.cjs +0 -95
- package/dist/TechStackSection-VTNNZR5V.cjs.map +0 -1
- package/dist/TestimonialSection-6RGSMXQB.js.map +0 -1
- package/dist/TestimonialSection-XPTFUQIN.cjs.map +0 -1
- package/dist/VideoSection-4A2HC6K6.js.map +0 -1
- package/dist/VideoSection-G3DFS7UH.cjs +0 -118
- package/dist/VideoSection-G3DFS7UH.cjs.map +0 -1
- package/dist/chunk-2Y4O3LWM.js +0 -53
- package/dist/chunk-2Y4O3LWM.js.map +0 -1
- package/dist/chunk-633UMQQH.cjs +0 -31
- package/dist/chunk-633UMQQH.cjs.map +0 -1
- package/dist/chunk-7CFFAKDM.js +0 -74
- package/dist/chunk-7CFFAKDM.js.map +0 -1
- package/dist/chunk-APG2QSMB.js +0 -131
- package/dist/chunk-APG2QSMB.js.map +0 -1
- package/dist/chunk-AVCH4LMG.cjs +0 -620
- package/dist/chunk-AVCH4LMG.cjs.map +0 -1
- package/dist/chunk-AYBUHRFS.js +0 -613
- package/dist/chunk-AYBUHRFS.js.map +0 -1
- package/dist/chunk-EE75WRCM.cjs.map +0 -1
- package/dist/chunk-IKBK7HYX.cjs +0 -79
- package/dist/chunk-IKBK7HYX.cjs.map +0 -1
- package/dist/chunk-KEOHORIH.cjs +0 -79
- package/dist/chunk-KEOHORIH.cjs.map +0 -1
- package/dist/chunk-OA5ZM4OA.cjs +0 -139
- package/dist/chunk-OA5ZM4OA.cjs.map +0 -1
- package/dist/chunk-TVFXN6W6.js.map +0 -1
- package/dist/chunk-VVTK4OL6.js +0 -28
- package/dist/chunk-VVTK4OL6.js.map +0 -1
- package/dist/chunk-XCKXHK44.js +0 -15
- package/dist/chunk-XCKXHK44.js.map +0 -1
- package/dist/chunk-XONXEFJY.cjs +0 -58
- package/dist/chunk-XONXEFJY.cjs.map +0 -1
- package/dist/chunk-XQNJED46.cjs +0 -19
- package/dist/chunk-XQNJED46.cjs.map +0 -1
- package/dist/chunk-YB4B3OMC.js +0 -74
- package/dist/chunk-YB4B3OMC.js.map +0 -1
- package/dist/portfolio/sections.cjs +0 -20
- package/dist/portfolio/sections.cjs.map +0 -1
- package/dist/portfolio/sections.d.cts +0 -42
- package/dist/portfolio/sections.d.ts +0 -42
- package/dist/portfolio/sections.js +0 -4
- 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 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/portfolio/index.cjs
CHANGED
|
@@ -1,42 +1,66 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
5
|
-
require('../chunk-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
require('../chunk-
|
|
9
|
-
require('../chunk-
|
|
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
|
|
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
|
|
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, "
|
|
45
|
+
Object.defineProperty(exports, "MetricsProvenance", {
|
|
22
46
|
enumerable: true,
|
|
23
|
-
get: function () { return
|
|
47
|
+
get: function () { return chunkUXUU7FVT_cjs.MetricsProvenance; }
|
|
24
48
|
});
|
|
25
|
-
Object.defineProperty(exports, "
|
|
49
|
+
Object.defineProperty(exports, "curateHeroKpis", {
|
|
26
50
|
enumerable: true,
|
|
27
|
-
get: function () { return
|
|
51
|
+
get: function () { return chunkUXUU7FVT_cjs.curateHeroKpis; }
|
|
28
52
|
});
|
|
29
|
-
Object.defineProperty(exports, "
|
|
53
|
+
Object.defineProperty(exports, "curatePortfolioProof", {
|
|
30
54
|
enumerable: true,
|
|
31
|
-
get: function () { return
|
|
55
|
+
get: function () { return chunkUXUU7FVT_cjs.curatePortfolioProof; }
|
|
32
56
|
});
|
|
33
|
-
Object.defineProperty(exports, "
|
|
57
|
+
Object.defineProperty(exports, "curateResultItems", {
|
|
34
58
|
enumerable: true,
|
|
35
|
-
get: function () { return
|
|
59
|
+
get: function () { return chunkUXUU7FVT_cjs.curateResultItems; }
|
|
36
60
|
});
|
|
37
|
-
Object.defineProperty(exports, "
|
|
61
|
+
Object.defineProperty(exports, "gateMetricsDeltas", {
|
|
38
62
|
enumerable: true,
|
|
39
|
-
get: function () { return
|
|
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
|
|
2
|
-
import { P as PortfolioItemFull } from '../types-
|
|
3
|
-
export {
|
|
4
|
-
export
|
|
5
|
-
|
|
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):
|
|
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 };
|