@sonordev/agency-site-kit 0.3.1 → 0.4.0
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-4N7ENJ7L.cjs +108 -0
- package/dist/chunk-4N7ENJ7L.cjs.map +1 -0
- 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-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-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-L7E3UHQC.cjs +535 -0
- package/dist/chunk-L7E3UHQC.cjs.map +1 -0
- package/dist/chunk-NI4FVCLS.cjs +32 -0
- package/dist/chunk-NI4FVCLS.cjs.map +1 -0
- package/dist/chunk-NIZJLONK.js +106 -0
- package/dist/chunk-NIZJLONK.js.map +1 -0
- package/dist/chunk-QDXZ27R7.js +33 -0
- package/dist/chunk-QDXZ27R7.js.map +1 -0
- package/dist/{chunk-TVFXN6W6.js → chunk-QL6KVIFR.js} +8 -4
- package/dist/chunk-QL6KVIFR.js.map +1 -0
- package/dist/chunk-UNTOEWQL.js +504 -0
- package/dist/chunk-UNTOEWQL.js.map +1 -0
- package/dist/chunk-XJ434N7I.js +30 -0
- package/dist/chunk-XJ434N7I.js.map +1 -0
- package/dist/chunk-XLK77USA.js +45 -0
- package/dist/chunk-XLK77USA.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-ZINKVJQU.js +67 -0
- package/dist/chunk-ZINKVJQU.js.map +1 -0
- package/dist/index.cjs +29 -31
- 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 +7 -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 +342 -12
- package/dist/portfolio/client.cjs.map +1 -1
- package/dist/portfolio/client.d.cts +11 -88
- package/dist/portfolio/client.d.ts +11 -88
- package/dist/portfolio/client.js +150 -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 +19 -20
- package/dist/portfolio/index.d.cts +133 -7
- package/dist/portfolio/index.d.ts +133 -7
- package/dist/portfolio/index.js +6 -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} +12 -6
- 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} +5 -4
- 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/{PerformanceSection-24TVVFZA.cjs → portfolio/sections/PerformanceSection.cjs} +136 -93
- 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} +58 -40
- package/dist/portfolio/sections/PerformanceSection.js.map +1 -0
- package/dist/{ResultsSection-XLGMMQKY.cjs → portfolio/sections/ResultsSection.cjs} +22 -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} +13 -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} +116 -92
- 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} +46 -47
- package/dist/portfolio/sections/SiteArchitectureSection.js.map +1 -0
- package/dist/{SpeedComparisonSection-EZKFQVGW.cjs → portfolio/sections/SpeedComparisonSection.cjs} +12 -6
- 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} +5 -4
- 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.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
|
@@ -1,18 +1,348 @@
|
|
|
1
|
-
'use
|
|
1
|
+
'use client';
|
|
2
|
+
"use strict";
|
|
3
|
+
"use client";
|
|
4
|
+
var __create = Object.create;
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
7
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
8
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
9
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
10
|
+
var __export = (target, all) => {
|
|
11
|
+
for (var name in all)
|
|
12
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
13
|
+
};
|
|
14
|
+
var __copyProps = (to, from, except, desc) => {
|
|
15
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
16
|
+
for (let key of __getOwnPropNames(from))
|
|
17
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
18
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
23
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
24
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
25
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
26
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
27
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
28
|
+
mod
|
|
29
|
+
));
|
|
30
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
2
31
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
32
|
+
// src/portfolio/client.ts
|
|
33
|
+
var client_exports = {};
|
|
34
|
+
__export(client_exports, {
|
|
35
|
+
PortfolioAnalytics: () => PortfolioAnalytics,
|
|
36
|
+
PortfolioCard: () => PortfolioCard,
|
|
37
|
+
PortfolioErrorFallback: () => PortfolioErrorFallback,
|
|
38
|
+
PortfolioGrid: () => PortfolioGrid,
|
|
39
|
+
PortfolioLeadCTA: () => PortfolioLeadCTA
|
|
40
|
+
});
|
|
41
|
+
module.exports = __toCommonJS(client_exports);
|
|
6
42
|
|
|
43
|
+
// src/portfolio/components/PortfolioGrid.tsx
|
|
44
|
+
var import_ScrollReveal = __toESM(require("@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal"), 1);
|
|
7
45
|
|
|
46
|
+
// src/portfolio/components/PortfolioCard.tsx
|
|
47
|
+
var import_image = __toESM(require("next/image"), 1);
|
|
48
|
+
var import_link = __toESM(require("next/link"), 1);
|
|
49
|
+
var import_GlassCard = __toESM(require("@sonordev/agency-site-kit/portfolio/primitives/GlassCard"), 1);
|
|
50
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
51
|
+
function PortfolioCard({ item, className = "", basePath = "/work" }) {
|
|
52
|
+
const thumbnailSrc = item.hero_screenshots?.desktop || item.hero_image || (item.project_id ? `/portfolio-previews/${item.slug}.png` : void 0);
|
|
53
|
+
const kpis = Array.isArray(item.kpis) ? item.kpis : [];
|
|
54
|
+
const services = Array.isArray(item.services) ? item.services : [];
|
|
55
|
+
const kpiPreview = kpis.slice(0, 3);
|
|
56
|
+
const servicePreview = services.slice(0, 3);
|
|
57
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: `${basePath}/${item.slug}`, className: `block group ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_GlassCard.default, { padding: "sm", hover: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-4", children: [
|
|
58
|
+
thumbnailSrc && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
59
|
+
"div",
|
|
60
|
+
{
|
|
61
|
+
className: "relative w-full overflow-hidden rounded-xl",
|
|
62
|
+
style: { aspectRatio: "16/10" },
|
|
63
|
+
children: [
|
|
64
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
65
|
+
import_image.default,
|
|
66
|
+
{
|
|
67
|
+
src: thumbnailSrc,
|
|
68
|
+
alt: item.hero_image_alt || item.title,
|
|
69
|
+
fill: true,
|
|
70
|
+
sizes: "(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw",
|
|
71
|
+
className: "object-cover object-top transition-transform duration-500 group-hover:scale-105"
|
|
72
|
+
}
|
|
73
|
+
),
|
|
74
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
75
|
+
"span",
|
|
76
|
+
{
|
|
77
|
+
className: "absolute top-3 left-3 px-3 py-1 rounded-full text-[11px] uppercase tracking-wider font-semibold",
|
|
78
|
+
style: {
|
|
79
|
+
background: "color-mix(in srgb, var(--sk-primary, #6366f1) 80%, transparent)",
|
|
80
|
+
color: "#ffffff",
|
|
81
|
+
backdropFilter: "blur(8px)"
|
|
82
|
+
},
|
|
83
|
+
children: item.category?.replace(/[-_]/g, " ").replace(/\b\w/g, (c) => c.toUpperCase())
|
|
84
|
+
}
|
|
85
|
+
)
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
),
|
|
89
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-2 px-2 pb-2", children: [
|
|
90
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
91
|
+
"h3",
|
|
92
|
+
{
|
|
93
|
+
className: "text-lg font-semibold line-clamp-1",
|
|
94
|
+
style: { color: "var(--sk-text-primary, #ffffff)" },
|
|
95
|
+
children: item.title
|
|
96
|
+
}
|
|
97
|
+
),
|
|
98
|
+
item.subtitle && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
99
|
+
"p",
|
|
100
|
+
{
|
|
101
|
+
className: "text-sm line-clamp-2",
|
|
102
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
103
|
+
children: item.subtitle
|
|
104
|
+
}
|
|
105
|
+
),
|
|
106
|
+
kpiPreview.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex items-center gap-4 mt-1", children: kpiPreview.map((kpi, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col", children: [
|
|
107
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
108
|
+
"span",
|
|
109
|
+
{
|
|
110
|
+
className: "text-base font-bold",
|
|
111
|
+
style: { color: "var(--sk-primary, #6366f1)" },
|
|
112
|
+
children: [
|
|
113
|
+
kpi.prefix || "",
|
|
114
|
+
kpi.value.toLocaleString(),
|
|
115
|
+
kpi.suffix
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
),
|
|
119
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
120
|
+
"span",
|
|
121
|
+
{
|
|
122
|
+
className: "text-[10px] uppercase tracking-wider font-medium",
|
|
123
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
124
|
+
children: kpi.label
|
|
125
|
+
}
|
|
126
|
+
)
|
|
127
|
+
] }, i)) }),
|
|
128
|
+
servicePreview.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-wrap gap-1.5 mt-2", children: [
|
|
129
|
+
servicePreview.map((service) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
130
|
+
"span",
|
|
131
|
+
{
|
|
132
|
+
className: "px-2.5 py-0.5 rounded-full text-[11px] font-medium",
|
|
133
|
+
style: {
|
|
134
|
+
background: "var(--sk-surface, rgba(255,255,255,0.05))",
|
|
135
|
+
color: "var(--sk-text-secondary, #a1a1aa)",
|
|
136
|
+
border: "1px solid var(--sk-border, rgba(255,255,255,0.1))"
|
|
137
|
+
},
|
|
138
|
+
children: service
|
|
139
|
+
},
|
|
140
|
+
service
|
|
141
|
+
)),
|
|
142
|
+
services.length > 3 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
143
|
+
"span",
|
|
144
|
+
{
|
|
145
|
+
className: "px-2.5 py-0.5 rounded-full text-[11px] font-medium",
|
|
146
|
+
style: {
|
|
147
|
+
background: "var(--sk-surface, rgba(255,255,255,0.05))",
|
|
148
|
+
color: "var(--sk-text-tertiary, #71717a)"
|
|
149
|
+
},
|
|
150
|
+
children: [
|
|
151
|
+
"+",
|
|
152
|
+
item.services.length - 3
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
)
|
|
156
|
+
] })
|
|
157
|
+
] })
|
|
158
|
+
] }) }) });
|
|
159
|
+
}
|
|
8
160
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
161
|
+
// src/portfolio/components/PortfolioGrid.tsx
|
|
162
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
163
|
+
function PortfolioGrid({ items, className = "", basePath = "/work" }) {
|
|
164
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ScrollReveal.default, { stagger: 0.1, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
165
|
+
"div",
|
|
166
|
+
{
|
|
167
|
+
className: `grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 ${className}`,
|
|
168
|
+
style: {
|
|
169
|
+
gap: "var(--sk-grid-gap, 24px)"
|
|
170
|
+
},
|
|
171
|
+
children: items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(PortfolioCard, { item, basePath }, item.id))
|
|
172
|
+
}
|
|
173
|
+
) });
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// src/portfolio/components/PortfolioErrorFallback.tsx
|
|
177
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
178
|
+
function PortfolioErrorFallback({ error, reset }) {
|
|
179
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("section", { className: "w-full py-24", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
180
|
+
"div",
|
|
181
|
+
{
|
|
182
|
+
className: "max-w-xl mx-auto px-8 py-12 rounded-2xl text-center flex flex-col items-center gap-4",
|
|
183
|
+
style: {
|
|
184
|
+
background: "var(--sk-surface, rgba(255,255,255,0.05))",
|
|
185
|
+
border: "1px solid var(--sk-border, rgba(255,255,255,0.1))"
|
|
186
|
+
},
|
|
187
|
+
children: [
|
|
188
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
189
|
+
"h2",
|
|
190
|
+
{
|
|
191
|
+
className: "text-xl font-semibold",
|
|
192
|
+
style: { color: "var(--sk-text-primary, #ffffff)" },
|
|
193
|
+
children: "Our work is taking a moment to load"
|
|
194
|
+
}
|
|
195
|
+
),
|
|
196
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "text-sm", style: { color: "var(--sk-text-secondary, #a1a1aa)" }, children: "The portfolio couldn't be fetched just now. It's us, not you \u2014 try again in a few seconds." }),
|
|
197
|
+
error?.digest && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { className: "text-xs", style: { color: "var(--sk-text-tertiary, #71717a)" }, children: [
|
|
198
|
+
"Reference: ",
|
|
199
|
+
error.digest
|
|
200
|
+
] }),
|
|
201
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
202
|
+
"button",
|
|
203
|
+
{
|
|
204
|
+
onClick: reset,
|
|
205
|
+
className: "mt-2 px-6 py-2.5 rounded-xl text-sm font-semibold transition-opacity hover:opacity-90",
|
|
206
|
+
style: { background: "var(--sk-primary, #6366f1)", color: "#ffffff" },
|
|
207
|
+
children: "Try again"
|
|
208
|
+
}
|
|
209
|
+
)
|
|
210
|
+
]
|
|
211
|
+
}
|
|
212
|
+
) });
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// src/portfolio/components/PortfolioLeadCTA.tsx
|
|
216
|
+
var import_forms = require("@sonordev/site-kit/forms");
|
|
217
|
+
var import_client = require("@sonordev/site-kit/client");
|
|
218
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
219
|
+
function PortfolioLeadCTA({
|
|
220
|
+
formId,
|
|
221
|
+
item,
|
|
222
|
+
heading = "Want results like these?",
|
|
223
|
+
description = "Tell us about your project and we'll show you what's possible.",
|
|
224
|
+
className = ""
|
|
225
|
+
}) {
|
|
226
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
227
|
+
"section",
|
|
228
|
+
{
|
|
229
|
+
className: `w-full py-20 md:py-28 ${className}`,
|
|
230
|
+
style: { background: "var(--sk-bg, #0a0a0a)" },
|
|
231
|
+
"data-portfolio-section": "portfolioLeadForm",
|
|
232
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "max-w-2xl mx-auto px-6", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
233
|
+
"div",
|
|
234
|
+
{
|
|
235
|
+
className: "rounded-2xl p-8 md:p-12",
|
|
236
|
+
style: {
|
|
237
|
+
background: "var(--sk-surface, rgba(255,255,255,0.05))",
|
|
238
|
+
backdropFilter: "blur(16px)",
|
|
239
|
+
border: "1px solid var(--sk-border, rgba(255,255,255,0.1))"
|
|
240
|
+
},
|
|
241
|
+
children: [
|
|
242
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
243
|
+
"h2",
|
|
244
|
+
{
|
|
245
|
+
className: "text-2xl md:text-3xl font-bold mb-3",
|
|
246
|
+
style: {
|
|
247
|
+
color: "var(--sk-text-primary, #ffffff)",
|
|
248
|
+
fontFamily: "var(--sk-font-heading, inherit)"
|
|
249
|
+
},
|
|
250
|
+
children: heading
|
|
251
|
+
}
|
|
252
|
+
),
|
|
253
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
254
|
+
"p",
|
|
255
|
+
{
|
|
256
|
+
className: "text-base mb-8",
|
|
257
|
+
style: { color: "var(--sk-text-secondary, #a1a1aa)" },
|
|
258
|
+
children: description
|
|
259
|
+
}
|
|
260
|
+
),
|
|
261
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
262
|
+
import_forms.ManagedForm,
|
|
263
|
+
{
|
|
264
|
+
formId,
|
|
265
|
+
onSuccess: () => {
|
|
266
|
+
(0, import_client.trackConversion)({
|
|
267
|
+
type: "portfolio_lead",
|
|
268
|
+
metadata: { case_study: item.slug, case_study_title: item.title }
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
)
|
|
273
|
+
]
|
|
274
|
+
}
|
|
275
|
+
) })
|
|
276
|
+
}
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// src/portfolio/components/PortfolioAnalytics.tsx
|
|
281
|
+
var import_react = require("react");
|
|
282
|
+
var import_client2 = require("@sonordev/site-kit/client");
|
|
283
|
+
function PortfolioAnalytics({ slug }) {
|
|
284
|
+
(0, import_react.useEffect)(() => {
|
|
285
|
+
let cleanup = () => {
|
|
286
|
+
};
|
|
287
|
+
const setup = () => {
|
|
288
|
+
const seen = /* @__PURE__ */ new Set();
|
|
289
|
+
const io = new IntersectionObserver(
|
|
290
|
+
(entries) => {
|
|
291
|
+
for (const entry of entries) {
|
|
292
|
+
if (!entry.isIntersecting) continue;
|
|
293
|
+
const type = entry.target.dataset.portfolioSection;
|
|
294
|
+
if (!type || seen.has(type)) continue;
|
|
295
|
+
seen.add(type);
|
|
296
|
+
(0, import_client2.trackEvent)({
|
|
297
|
+
name: "portfolio_section_view",
|
|
298
|
+
category: "portfolio",
|
|
299
|
+
label: type,
|
|
300
|
+
properties: { case_study: slug, section: type }
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
{ threshold: 0.4 }
|
|
305
|
+
);
|
|
306
|
+
document.querySelectorAll("[data-portfolio-section]").forEach((el) => io.observe(el));
|
|
307
|
+
const onClick = (event) => {
|
|
308
|
+
const link = event.target.closest(
|
|
309
|
+
"a[data-portfolio-action]"
|
|
310
|
+
);
|
|
311
|
+
if (!link) return;
|
|
312
|
+
const action = link.dataset.portfolioAction;
|
|
313
|
+
(0, import_client2.trackEvent)({
|
|
314
|
+
name: action === "live-site" ? "portfolio_live_site_click" : "portfolio_cta_click",
|
|
315
|
+
category: "portfolio",
|
|
316
|
+
label: slug,
|
|
317
|
+
properties: { case_study: slug, href: link.href }
|
|
318
|
+
});
|
|
319
|
+
};
|
|
320
|
+
document.addEventListener("click", onClick, { passive: true });
|
|
321
|
+
cleanup = () => {
|
|
322
|
+
io.disconnect();
|
|
323
|
+
document.removeEventListener("click", onClick);
|
|
324
|
+
};
|
|
325
|
+
};
|
|
326
|
+
let idleId;
|
|
327
|
+
if ("requestIdleCallback" in window) {
|
|
328
|
+
idleId = window.requestIdleCallback(setup, { timeout: 3e3 });
|
|
329
|
+
} else {
|
|
330
|
+
idleId = setTimeout(setup, 1500);
|
|
331
|
+
}
|
|
332
|
+
return () => {
|
|
333
|
+
if ("requestIdleCallback" in window) window.cancelIdleCallback(idleId);
|
|
334
|
+
else clearTimeout(idleId);
|
|
335
|
+
cleanup();
|
|
336
|
+
};
|
|
337
|
+
}, [slug]);
|
|
338
|
+
return null;
|
|
339
|
+
}
|
|
340
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
341
|
+
0 && (module.exports = {
|
|
342
|
+
PortfolioAnalytics,
|
|
343
|
+
PortfolioCard,
|
|
344
|
+
PortfolioErrorFallback,
|
|
345
|
+
PortfolioGrid,
|
|
346
|
+
PortfolioLeadCTA
|
|
16
347
|
});
|
|
17
|
-
//# sourceMappingURL=client.cjs.map
|
|
18
348
|
//# sourceMappingURL=client.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"client.cjs"}
|
|
1
|
+
{"version":3,"sources":["../../src/portfolio/client.ts","../../src/portfolio/components/PortfolioGrid.tsx","../../src/portfolio/components/PortfolioCard.tsx","../../src/portfolio/components/PortfolioErrorFallback.tsx","../../src/portfolio/components/PortfolioLeadCTA.tsx","../../src/portfolio/components/PortfolioAnalytics.tsx"],"sourcesContent":["'use client';\n\n/**\n * @sonordev/agency-site-kit/portfolio/client — Client-only portfolio components\n *\n * Components in this barrel require browser APIs (DOM, events, animations).\n * The 'use client' directive marks the client boundary; the build also stamps\n * every compiled file in the client bundle with the directive.\n *\n * Individual section components live at\n * `@sonordev/agency-site-kit/portfolio/sections/<Name>` and animation\n * primitives at `@sonordev/agency-site-kit/portfolio/primitives/<Name>` —\n * import those subpaths directly to compose custom layouts.\n */\n\nimport type { PortfolioItem, PortfolioItemFull, PortfolioSection } from '../types';\n\n// Grid/Card are shared (directive-less) components; importing them through\n// this 'use client' barrel yields the client copy for client-side callers.\n// Server code renders them via PortfolioIndex / the /portfolio barrel.\nexport { default as PortfolioGrid } from './components/PortfolioGrid';\nexport { default as PortfolioCard } from './components/PortfolioCard';\n\n// Error boundary UI for portfolio routes (error.tsx must be a client file)\nexport { default as PortfolioErrorFallback } from './components/PortfolioErrorFallback';\nexport type { PortfolioErrorFallbackProps } from './components/PortfolioErrorFallback';\n\n// Lead capture CTA — Sonor managed form with case-study attribution\nexport { default as PortfolioLeadCTA } from './components/PortfolioLeadCTA';\nexport type { PortfolioLeadCTAProps } from './components/PortfolioLeadCTA';\n\n// Engagement-tracking island (PortfolioPage mounts this automatically;\n// exported for custom layouts)\nexport { default as PortfolioAnalytics } from './components/PortfolioAnalytics';\n\n// Re-export types for convenience\nexport type {\n PortfolioItem,\n PortfolioItemFull,\n PortfolioSection,\n};\n","// Shared component — no directive on purpose: hook-free, so it renders\n// server-side (zero JS) from PortfolioIndex and stays usable from client\n// code via the /portfolio/client barrel.\nimport React from 'react';\nimport type { PortfolioItem } from '../../types';\nimport ScrollReveal from '@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal';\nimport PortfolioCard from './PortfolioCard';\n\ninterface PortfolioGridProps {\n items: PortfolioItem[];\n className?: string;\n /** Base path for portfolio detail links (default: '/work') */\n basePath?: string;\n}\n\nexport default function PortfolioGrid({ items, className = '', basePath = '/work' }: PortfolioGridProps) {\n return (\n <ScrollReveal stagger={0.1}>\n <div\n className={`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 ${className}`}\n style={{\n gap: 'var(--sk-grid-gap, 24px)',\n }}\n >\n {items.map((item) => (\n <PortfolioCard key={item.id} item={item} basePath={basePath} />\n ))}\n </div>\n </ScrollReveal>\n );\n}\n","// Shared component — no directive on purpose: hook-free, so it renders\n// server-side (zero JS) from PortfolioIndex and stays usable from client\n// code via the /portfolio/client barrel.\nimport React from 'react';\nimport Image from 'next/image';\nimport Link from 'next/link';\nimport type { PortfolioItem } from '../../types';\nimport GlassCard from '@sonordev/agency-site-kit/portfolio/primitives/GlassCard';\n\ninterface PortfolioCardProps {\n item: PortfolioItem;\n className?: string;\n /** Base path for portfolio detail links (default: '/work') */\n basePath?: string;\n}\n\nexport default function PortfolioCard({ item, className = '', basePath = '/work' }: PortfolioCardProps) {\n // Use hero_screenshots desktop → hero_image → trifolio screenshot convention\n const thumbnailSrc =\n item.hero_screenshots?.desktop ||\n item.hero_image ||\n (item.project_id ? `/portfolio-previews/${item.slug}.png` : undefined);\n const kpis = Array.isArray(item.kpis) ? item.kpis : [];\n const services = Array.isArray(item.services) ? item.services : [];\n const kpiPreview = kpis.slice(0, 3);\n const servicePreview = services.slice(0, 3);\n\n return (\n <Link href={`${basePath}/${item.slug}`} className={`block group ${className}`}>\n <GlassCard padding=\"sm\" hover>\n <div className=\"flex flex-col gap-4\">\n {/* Thumbnail */}\n {thumbnailSrc && (\n <div\n className=\"relative w-full overflow-hidden rounded-xl\"\n style={{ aspectRatio: '16/10' }}\n >\n <Image\n src={thumbnailSrc}\n alt={item.hero_image_alt || item.title}\n fill\n sizes=\"(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw\"\n className=\"object-cover object-top transition-transform duration-500 group-hover:scale-105\"\n />\n {/* Category badge */}\n <span\n className=\"absolute top-3 left-3 px-3 py-1 rounded-full text-[11px] uppercase tracking-wider font-semibold\"\n style={{\n background: 'color-mix(in srgb, var(--sk-primary, #6366f1) 80%, transparent)',\n color: '#ffffff',\n backdropFilter: 'blur(8px)',\n }}\n >\n {item.category?.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (c: string) => c.toUpperCase())}\n </span>\n </div>\n )}\n\n {/* Text content */}\n <div className=\"flex flex-col gap-2 px-2 pb-2\">\n <h3\n className=\"text-lg font-semibold line-clamp-1\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n {item.title}\n </h3>\n\n {item.subtitle && (\n <p\n className=\"text-sm line-clamp-2\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {item.subtitle}\n </p>\n )}\n\n {/* KPI preview */}\n {kpiPreview.length > 0 && (\n <div className=\"flex items-center gap-4 mt-1\">\n {kpiPreview.map((kpi, i) => (\n <div key={i} className=\"flex flex-col\">\n <span\n className=\"text-base font-bold\"\n style={{ color: 'var(--sk-primary, #6366f1)' }}\n >\n {kpi.prefix || ''}\n {kpi.value.toLocaleString()}\n {kpi.suffix}\n </span>\n <span\n className=\"text-[10px] uppercase tracking-wider font-medium\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {kpi.label}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* Services tags */}\n {servicePreview.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 mt-2\">\n {servicePreview.map((service) => (\n <span\n key={service}\n className=\"px-2.5 py-0.5 rounded-full text-[11px] font-medium\"\n style={{\n background: 'var(--sk-surface, rgba(255,255,255,0.05))',\n color: 'var(--sk-text-secondary, #a1a1aa)',\n border: '1px solid var(--sk-border, rgba(255,255,255,0.1))',\n }}\n >\n {service}\n </span>\n ))}\n {services.length > 3 && (\n <span\n className=\"px-2.5 py-0.5 rounded-full text-[11px] font-medium\"\n style={{\n background: 'var(--sk-surface, rgba(255,255,255,0.05))',\n color: 'var(--sk-text-tertiary, #71717a)',\n }}\n >\n +{item.services.length - 3}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n </GlassCard>\n </Link>\n );\n}\n","'use client';\n\n/**\n * Error boundary UI for portfolio routes — pairs with the PortfolioApiError\n * contract (infrastructure failures throw; Next renders the route's\n * error.tsx). Drop into `error.tsx`:\n *\n * ```tsx\n * 'use client';\n * export { PortfolioErrorFallback as default } from '@sonordev/agency-site-kit/portfolio/client';\n * ```\n */\n\nimport React from 'react';\n\nexport interface PortfolioErrorFallbackProps {\n error: Error & { digest?: string };\n reset: () => void;\n}\n\nexport default function PortfolioErrorFallback({ error, reset }: PortfolioErrorFallbackProps) {\n return (\n <section className=\"w-full py-24\">\n <div\n className=\"max-w-xl mx-auto px-8 py-12 rounded-2xl text-center flex flex-col items-center gap-4\"\n style={{\n background: 'var(--sk-surface, rgba(255,255,255,0.05))',\n border: '1px solid var(--sk-border, rgba(255,255,255,0.1))',\n }}\n >\n <h2\n className=\"text-xl font-semibold\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n Our work is taking a moment to load\n </h2>\n <p className=\"text-sm\" style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}>\n The portfolio couldn't be fetched just now. It's us, not you — try again in a\n few seconds.\n </p>\n {error?.digest && (\n <p className=\"text-xs\" style={{ color: 'var(--sk-text-tertiary, #71717a)' }}>\n Reference: {error.digest}\n </p>\n )}\n <button\n onClick={reset}\n className=\"mt-2 px-6 py-2.5 rounded-xl text-sm font-semibold transition-opacity hover:opacity-90\"\n style={{ background: 'var(--sk-primary, #6366f1)', color: '#ffffff' }}\n >\n Try again\n </button>\n </div>\n </section>\n );\n}\n","'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","'use client';\n\n/**\n * PortfolioAnalytics — childless engagement-tracking island.\n *\n * Mounted by PortfolioPage as a SIBLING of the content (never a wrapper —\n * house perf doctrine), deferred to idle so it stays out of the hydration\n * path. Observes the server-rendered `data-portfolio-section` markers and\n * emits events through site-kit's standalone dispatch (which queues until\n * the site's AnalyticsProvider mounts and no-ops if it never does):\n *\n * portfolio_section_view once per section type per page view\n * portfolio_live_site_click clicks on [data-portfolio-action=\"live-site\"]\n * portfolio_cta_click clicks on [data-portfolio-action=\"cta\"]\n *\n * This is the raw material for \"your QCR case study converts best\" insights.\n */\n\nimport { useEffect } from 'react';\nimport { trackEvent } from '@sonordev/site-kit/client';\n\nexport default function PortfolioAnalytics({ slug }: { slug: string }) {\n useEffect(() => {\n let cleanup = () => {};\n\n const setup = () => {\n const seen = new Set<string>();\n const io = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (!entry.isIntersecting) continue;\n const type = (entry.target as HTMLElement).dataset.portfolioSection;\n if (!type || seen.has(type)) continue;\n seen.add(type);\n trackEvent({\n name: 'portfolio_section_view',\n category: 'portfolio',\n label: type,\n properties: { case_study: slug, section: type },\n });\n }\n },\n { threshold: 0.4 },\n );\n document\n .querySelectorAll<HTMLElement>('[data-portfolio-section]')\n .forEach((el) => io.observe(el));\n\n const onClick = (event: MouseEvent) => {\n const link = (event.target as HTMLElement).closest<HTMLAnchorElement>(\n 'a[data-portfolio-action]',\n );\n if (!link) return;\n const action = link.dataset.portfolioAction;\n trackEvent({\n name: action === 'live-site' ? 'portfolio_live_site_click' : 'portfolio_cta_click',\n category: 'portfolio',\n label: slug,\n properties: { case_study: slug, href: link.href },\n });\n };\n document.addEventListener('click', onClick, { passive: true });\n\n cleanup = () => {\n io.disconnect();\n document.removeEventListener('click', onClick);\n };\n };\n\n // Idle-defer: engagement tracking must never compete with hydration.\n let idleId: number | ReturnType<typeof setTimeout>;\n if ('requestIdleCallback' in window) {\n idleId = window.requestIdleCallback(setup, { timeout: 3000 });\n } else {\n idleId = setTimeout(setup, 1500);\n }\n\n return () => {\n if ('requestIdleCallback' in window) window.cancelIdleCallback(idleId as number);\n else clearTimeout(idleId as ReturnType<typeof setTimeout>);\n cleanup();\n };\n }, [slug]);\n\n return null;\n}\n"],"mappings":"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","names":["Link","GlassCard","Image","import_jsx_runtime","ScrollReveal","import_jsx_runtime","import_jsx_runtime","import_client"]}
|
|
@@ -1,101 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { i as PortfolioItem } from '../types-D0nb6KAx.cjs';
|
|
2
|
+
export { j as PortfolioItemFull, k as PortfolioSection } from '../types-D0nb6KAx.cjs';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
export { default as PortfolioErrorFallback, PortfolioErrorFallbackProps } from './components/PortfolioErrorFallback.cjs';
|
|
5
|
+
export { default as PortfolioLeadCTA, PortfolioLeadCTAProps } from './components/PortfolioLeadCTA.cjs';
|
|
6
|
+
export { default as PortfolioAnalytics } from './components/PortfolioAnalytics.cjs';
|
|
3
7
|
|
|
4
|
-
interface PortfolioGridProps
|
|
8
|
+
interface PortfolioGridProps {
|
|
5
9
|
items: PortfolioItem[];
|
|
6
10
|
className?: string;
|
|
7
11
|
/** Base path for portfolio detail links (default: '/work') */
|
|
8
12
|
basePath?: string;
|
|
9
13
|
}
|
|
10
|
-
declare function PortfolioGrid({ items, className, basePath }: PortfolioGridProps
|
|
14
|
+
declare function PortfolioGrid({ items, className, basePath }: PortfolioGridProps): React.JSX.Element;
|
|
11
15
|
|
|
12
|
-
interface PortfolioCardProps
|
|
16
|
+
interface PortfolioCardProps {
|
|
13
17
|
item: PortfolioItem;
|
|
14
18
|
className?: string;
|
|
15
19
|
/** Base path for portfolio detail links (default: '/work') */
|
|
16
20
|
basePath?: string;
|
|
17
21
|
}
|
|
18
|
-
declare function PortfolioCard({ item, className, basePath }: PortfolioCardProps
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* @sonordev/agency-site-kit/portfolio/client — Client-only portfolio components
|
|
22
|
-
*
|
|
23
|
-
* Components in this barrel require browser APIs (DOM, events, IntersectionObserver,
|
|
24
|
-
* animations). The 'use client' directive at the top marks the client boundary.
|
|
25
|
-
*
|
|
26
|
-
* Client components will be added here as they are implemented:
|
|
27
|
-
*
|
|
28
|
-
* - PortfolioPageClient — full case study page with scroll-driven sections
|
|
29
|
-
* - PortfolioFilter — category/service filter bar with animated transitions
|
|
30
|
-
* - PortfolioGrid — animated grid layout with filtering
|
|
31
|
-
* - PortfolioCard — interactive card with hover effects and KPI preview
|
|
32
|
-
* - PortfolioLightbox — fullscreen image viewer for gallery sections
|
|
33
|
-
* - PortfolioBeforeAfterSlider — drag/touch comparison slider
|
|
34
|
-
* - PortfolioMetricsChart — animated chart for metrics timeline
|
|
35
|
-
* - PortfolioFunnelViz — conversion funnel visualization
|
|
36
|
-
*
|
|
37
|
-
* For now, export the type interfaces so consuming code can reference them.
|
|
38
|
-
*/
|
|
39
|
-
|
|
40
|
-
interface PortfolioPageClientProps {
|
|
41
|
-
item: PortfolioItemFull;
|
|
42
|
-
/** Back link URL (defaults to /portfolio) */
|
|
43
|
-
backUrl?: string;
|
|
44
|
-
/** Custom class name for the page wrapper */
|
|
45
|
-
className?: string;
|
|
46
|
-
}
|
|
47
|
-
interface PortfolioFilterProps {
|
|
48
|
-
/** All available categories extracted from items */
|
|
49
|
-
categories: string[];
|
|
50
|
-
/** All available services extracted from items */
|
|
51
|
-
services: string[];
|
|
52
|
-
/** Currently selected category (null = all) */
|
|
53
|
-
activeCategory: string | null;
|
|
54
|
-
/** Currently selected services */
|
|
55
|
-
activeServices: string[];
|
|
56
|
-
/** Callback when category changes */
|
|
57
|
-
onCategoryChange: (category: string | null) => void;
|
|
58
|
-
/** Callback when services selection changes */
|
|
59
|
-
onServicesChange: (services: string[]) => void;
|
|
60
|
-
/** Custom class name */
|
|
61
|
-
className?: string;
|
|
62
|
-
}
|
|
63
|
-
interface PortfolioGridProps {
|
|
64
|
-
/** Portfolio items to display */
|
|
65
|
-
items: PortfolioItem[];
|
|
66
|
-
/** Number of columns at each breakpoint */
|
|
67
|
-
columns?: {
|
|
68
|
-
sm?: number;
|
|
69
|
-
md?: number;
|
|
70
|
-
lg?: number;
|
|
71
|
-
xl?: number;
|
|
72
|
-
};
|
|
73
|
-
/** Animation style for grid items */
|
|
74
|
-
animation?: 'fade' | 'slide' | 'scale' | 'none';
|
|
75
|
-
/** Custom class name */
|
|
76
|
-
className?: string;
|
|
77
|
-
}
|
|
78
|
-
interface PortfolioCardProps {
|
|
79
|
-
/** Portfolio item data */
|
|
80
|
-
item: PortfolioItem;
|
|
81
|
-
/** Card size variant */
|
|
82
|
-
variant?: 'default' | 'featured' | 'compact';
|
|
83
|
-
/** Whether to show KPI preview on hover */
|
|
84
|
-
showKpis?: boolean;
|
|
85
|
-
/** Click handler (if not using Link) */
|
|
86
|
-
onClick?: (item: PortfolioItem) => void;
|
|
87
|
-
/** Link href for the card */
|
|
88
|
-
href?: string;
|
|
89
|
-
/** Custom class name */
|
|
90
|
-
className?: string;
|
|
91
|
-
}
|
|
92
|
-
interface PortfolioSectionRendererProps {
|
|
93
|
-
/** The section to render */
|
|
94
|
-
section: PortfolioSection;
|
|
95
|
-
/** Index within the page (for animation staggering) */
|
|
96
|
-
index?: number;
|
|
97
|
-
/** Custom class name */
|
|
98
|
-
className?: string;
|
|
99
|
-
}
|
|
22
|
+
declare function PortfolioCard({ item, className, basePath }: PortfolioCardProps): React.JSX.Element;
|
|
100
23
|
|
|
101
|
-
export { PortfolioCard,
|
|
24
|
+
export { PortfolioCard, PortfolioGrid, PortfolioItem };
|
|
@@ -1,101 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { i as PortfolioItem } from '../types-D0nb6KAx.js';
|
|
2
|
+
export { j as PortfolioItemFull, k as PortfolioSection } from '../types-D0nb6KAx.js';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
export { default as PortfolioErrorFallback, PortfolioErrorFallbackProps } from './components/PortfolioErrorFallback.js';
|
|
5
|
+
export { default as PortfolioLeadCTA, PortfolioLeadCTAProps } from './components/PortfolioLeadCTA.js';
|
|
6
|
+
export { default as PortfolioAnalytics } from './components/PortfolioAnalytics.js';
|
|
3
7
|
|
|
4
|
-
interface PortfolioGridProps
|
|
8
|
+
interface PortfolioGridProps {
|
|
5
9
|
items: PortfolioItem[];
|
|
6
10
|
className?: string;
|
|
7
11
|
/** Base path for portfolio detail links (default: '/work') */
|
|
8
12
|
basePath?: string;
|
|
9
13
|
}
|
|
10
|
-
declare function PortfolioGrid({ items, className, basePath }: PortfolioGridProps
|
|
14
|
+
declare function PortfolioGrid({ items, className, basePath }: PortfolioGridProps): React.JSX.Element;
|
|
11
15
|
|
|
12
|
-
interface PortfolioCardProps
|
|
16
|
+
interface PortfolioCardProps {
|
|
13
17
|
item: PortfolioItem;
|
|
14
18
|
className?: string;
|
|
15
19
|
/** Base path for portfolio detail links (default: '/work') */
|
|
16
20
|
basePath?: string;
|
|
17
21
|
}
|
|
18
|
-
declare function PortfolioCard({ item, className, basePath }: PortfolioCardProps
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* @sonordev/agency-site-kit/portfolio/client — Client-only portfolio components
|
|
22
|
-
*
|
|
23
|
-
* Components in this barrel require browser APIs (DOM, events, IntersectionObserver,
|
|
24
|
-
* animations). The 'use client' directive at the top marks the client boundary.
|
|
25
|
-
*
|
|
26
|
-
* Client components will be added here as they are implemented:
|
|
27
|
-
*
|
|
28
|
-
* - PortfolioPageClient — full case study page with scroll-driven sections
|
|
29
|
-
* - PortfolioFilter — category/service filter bar with animated transitions
|
|
30
|
-
* - PortfolioGrid — animated grid layout with filtering
|
|
31
|
-
* - PortfolioCard — interactive card with hover effects and KPI preview
|
|
32
|
-
* - PortfolioLightbox — fullscreen image viewer for gallery sections
|
|
33
|
-
* - PortfolioBeforeAfterSlider — drag/touch comparison slider
|
|
34
|
-
* - PortfolioMetricsChart — animated chart for metrics timeline
|
|
35
|
-
* - PortfolioFunnelViz — conversion funnel visualization
|
|
36
|
-
*
|
|
37
|
-
* For now, export the type interfaces so consuming code can reference them.
|
|
38
|
-
*/
|
|
39
|
-
|
|
40
|
-
interface PortfolioPageClientProps {
|
|
41
|
-
item: PortfolioItemFull;
|
|
42
|
-
/** Back link URL (defaults to /portfolio) */
|
|
43
|
-
backUrl?: string;
|
|
44
|
-
/** Custom class name for the page wrapper */
|
|
45
|
-
className?: string;
|
|
46
|
-
}
|
|
47
|
-
interface PortfolioFilterProps {
|
|
48
|
-
/** All available categories extracted from items */
|
|
49
|
-
categories: string[];
|
|
50
|
-
/** All available services extracted from items */
|
|
51
|
-
services: string[];
|
|
52
|
-
/** Currently selected category (null = all) */
|
|
53
|
-
activeCategory: string | null;
|
|
54
|
-
/** Currently selected services */
|
|
55
|
-
activeServices: string[];
|
|
56
|
-
/** Callback when category changes */
|
|
57
|
-
onCategoryChange: (category: string | null) => void;
|
|
58
|
-
/** Callback when services selection changes */
|
|
59
|
-
onServicesChange: (services: string[]) => void;
|
|
60
|
-
/** Custom class name */
|
|
61
|
-
className?: string;
|
|
62
|
-
}
|
|
63
|
-
interface PortfolioGridProps {
|
|
64
|
-
/** Portfolio items to display */
|
|
65
|
-
items: PortfolioItem[];
|
|
66
|
-
/** Number of columns at each breakpoint */
|
|
67
|
-
columns?: {
|
|
68
|
-
sm?: number;
|
|
69
|
-
md?: number;
|
|
70
|
-
lg?: number;
|
|
71
|
-
xl?: number;
|
|
72
|
-
};
|
|
73
|
-
/** Animation style for grid items */
|
|
74
|
-
animation?: 'fade' | 'slide' | 'scale' | 'none';
|
|
75
|
-
/** Custom class name */
|
|
76
|
-
className?: string;
|
|
77
|
-
}
|
|
78
|
-
interface PortfolioCardProps {
|
|
79
|
-
/** Portfolio item data */
|
|
80
|
-
item: PortfolioItem;
|
|
81
|
-
/** Card size variant */
|
|
82
|
-
variant?: 'default' | 'featured' | 'compact';
|
|
83
|
-
/** Whether to show KPI preview on hover */
|
|
84
|
-
showKpis?: boolean;
|
|
85
|
-
/** Click handler (if not using Link) */
|
|
86
|
-
onClick?: (item: PortfolioItem) => void;
|
|
87
|
-
/** Link href for the card */
|
|
88
|
-
href?: string;
|
|
89
|
-
/** Custom class name */
|
|
90
|
-
className?: string;
|
|
91
|
-
}
|
|
92
|
-
interface PortfolioSectionRendererProps {
|
|
93
|
-
/** The section to render */
|
|
94
|
-
section: PortfolioSection;
|
|
95
|
-
/** Index within the page (for animation staggering) */
|
|
96
|
-
index?: number;
|
|
97
|
-
/** Custom class name */
|
|
98
|
-
className?: string;
|
|
99
|
-
}
|
|
22
|
+
declare function PortfolioCard({ item, className, basePath }: PortfolioCardProps): React.JSX.Element;
|
|
100
23
|
|
|
101
|
-
export { PortfolioCard,
|
|
24
|
+
export { PortfolioCard, PortfolioGrid, PortfolioItem };
|