@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
|
@@ -1,25 +1,37 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
"use client";
|
|
3
|
+
import {
|
|
4
|
+
resolvePortfolioImage
|
|
5
|
+
} from "../../chunk-QDXZ27R7.js";
|
|
7
6
|
|
|
7
|
+
// src/portfolio/components/sections/BeforeAfterSection.tsx
|
|
8
|
+
import { useRef, useState, useCallback, useEffect } from "react";
|
|
9
|
+
import Image from "next/image";
|
|
10
|
+
import ScrollReveal from "@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal";
|
|
11
|
+
import GlassCard from "@sonordev/agency-site-kit/portfolio/primitives/GlassCard";
|
|
12
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
13
|
function BeforeAfterSection({ data }) {
|
|
9
14
|
const containerRef = useRef(null);
|
|
10
|
-
const sliderRef = useRef(null);
|
|
11
15
|
const [position, setPosition] = useState(data.defaultPosition ?? 50);
|
|
16
|
+
const [handleHidden, setHandleHidden] = useState(false);
|
|
12
17
|
const isDragging = useRef(false);
|
|
13
|
-
const
|
|
14
|
-
const
|
|
18
|
+
const before = resolvePortfolioImage(data.beforeUrl || data.before);
|
|
19
|
+
const after = resolvePortfolioImage(data.afterUrl || data.after);
|
|
15
20
|
useEffect(() => {
|
|
16
|
-
const
|
|
17
|
-
if (
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
)
|
|
21
|
+
const el = containerRef.current;
|
|
22
|
+
if (!el) return;
|
|
23
|
+
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
|
|
24
|
+
const rect = el.getBoundingClientRect();
|
|
25
|
+
if (rect.top < window.innerHeight && rect.bottom > 0) return;
|
|
26
|
+
setHandleHidden(true);
|
|
27
|
+
const io = new IntersectionObserver(([entry]) => {
|
|
28
|
+
if (entry.isIntersecting) {
|
|
29
|
+
setHandleHidden(false);
|
|
30
|
+
io.disconnect();
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
io.observe(el);
|
|
34
|
+
return () => io.disconnect();
|
|
23
35
|
}, []);
|
|
24
36
|
const updatePosition = useCallback((clientX) => {
|
|
25
37
|
const container = containerRef.current;
|
|
@@ -47,6 +59,18 @@ function BeforeAfterSection({ data }) {
|
|
|
47
59
|
const handlePointerUp = useCallback(() => {
|
|
48
60
|
isDragging.current = false;
|
|
49
61
|
}, []);
|
|
62
|
+
const handleKeyDown = useCallback((e) => {
|
|
63
|
+
const step = e.shiftKey ? 10 : 5;
|
|
64
|
+
const nudge = (delta) => {
|
|
65
|
+
e.preventDefault();
|
|
66
|
+
setPosition((prev) => Math.max(0, Math.min(100, prev + delta)));
|
|
67
|
+
};
|
|
68
|
+
if (e.key === "ArrowLeft" || e.key === "ArrowDown") nudge(-step);
|
|
69
|
+
else if (e.key === "ArrowRight" || e.key === "ArrowUp") nudge(step);
|
|
70
|
+
else if (e.key === "Home") nudge(-100);
|
|
71
|
+
else if (e.key === "End") nudge(100);
|
|
72
|
+
}, []);
|
|
73
|
+
if (!before || !after) return null;
|
|
50
74
|
return /* @__PURE__ */ jsx(
|
|
51
75
|
"section",
|
|
52
76
|
{
|
|
@@ -78,19 +102,29 @@ function BeforeAfterSection({ data }) {
|
|
|
78
102
|
"div",
|
|
79
103
|
{
|
|
80
104
|
ref: containerRef,
|
|
105
|
+
role: "slider",
|
|
106
|
+
tabIndex: 0,
|
|
107
|
+
"aria-label": "Before and after comparison",
|
|
108
|
+
"aria-valuemin": 0,
|
|
109
|
+
"aria-valuemax": 100,
|
|
110
|
+
"aria-valuenow": Math.round(position),
|
|
111
|
+
"aria-valuetext": `${Math.round(position)}% before, ${100 - Math.round(position)}% after`,
|
|
81
112
|
className: "relative w-full overflow-hidden rounded-xl cursor-col-resize select-none",
|
|
82
113
|
style: { aspectRatio: "16/10" },
|
|
83
114
|
onPointerDown: handlePointerDown,
|
|
84
115
|
onPointerMove: handlePointerMove,
|
|
85
116
|
onPointerUp: handlePointerUp,
|
|
86
117
|
onPointerCancel: handlePointerUp,
|
|
118
|
+
onKeyDown: handleKeyDown,
|
|
87
119
|
children: [
|
|
88
120
|
/* @__PURE__ */ jsx(
|
|
89
|
-
|
|
121
|
+
Image,
|
|
90
122
|
{
|
|
91
|
-
src:
|
|
123
|
+
src: after.url,
|
|
92
124
|
alt: "After",
|
|
93
|
-
|
|
125
|
+
fill: true,
|
|
126
|
+
sizes: "(max-width: 1280px) 100vw, 1200px",
|
|
127
|
+
className: "object-cover",
|
|
94
128
|
draggable: false
|
|
95
129
|
}
|
|
96
130
|
),
|
|
@@ -100,11 +134,13 @@ function BeforeAfterSection({ data }) {
|
|
|
100
134
|
className: "absolute inset-0 overflow-hidden",
|
|
101
135
|
style: { width: `${position}%` },
|
|
102
136
|
children: /* @__PURE__ */ jsx(
|
|
103
|
-
|
|
137
|
+
Image,
|
|
104
138
|
{
|
|
105
|
-
src:
|
|
139
|
+
src: before.url,
|
|
106
140
|
alt: "Before",
|
|
107
|
-
|
|
141
|
+
fill: true,
|
|
142
|
+
sizes: "(max-width: 1280px) 100vw, 1200px",
|
|
143
|
+
className: "object-cover",
|
|
108
144
|
style: { minWidth: containerRef.current?.offsetWidth || "100%" },
|
|
109
145
|
draggable: false
|
|
110
146
|
}
|
|
@@ -126,11 +162,14 @@ function BeforeAfterSection({ data }) {
|
|
|
126
162
|
/* @__PURE__ */ jsx(
|
|
127
163
|
"div",
|
|
128
164
|
{
|
|
129
|
-
ref: sliderRef,
|
|
130
165
|
className: "absolute top-1/2 flex items-center justify-center w-10 h-10 rounded-full",
|
|
131
166
|
style: {
|
|
132
167
|
left: `${position}%`,
|
|
133
|
-
transform: "translate(-50%, -50%)",
|
|
168
|
+
transform: handleHidden ? "translate(-50%, -50%) scale(0.8)" : "translate(-50%, -50%) scale(1)",
|
|
169
|
+
opacity: handleHidden ? 0 : 1,
|
|
170
|
+
// Transition only on reveal so the hydration hide is instant;
|
|
171
|
+
// .6s back-out overshoot after a .5s beat, like the old entrance.
|
|
172
|
+
transition: handleHidden ? "none" : "opacity 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) 0.5s, transform 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) 0.5s",
|
|
134
173
|
background: "var(--sk-primary, #6366f1)",
|
|
135
174
|
boxShadow: "0 4px 16px rgba(0,0,0,0.3)",
|
|
136
175
|
border: "3px solid #ffffff",
|
|
@@ -170,7 +209,7 @@ function BeforeAfterSection({ data }) {
|
|
|
170
209
|
}
|
|
171
210
|
);
|
|
172
211
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
//# sourceMappingURL=BeforeAfterSection
|
|
212
|
+
export {
|
|
213
|
+
BeforeAfterSection as default
|
|
214
|
+
};
|
|
215
|
+
//# sourceMappingURL=BeforeAfterSection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/portfolio/components/sections/BeforeAfterSection.tsx"],"sourcesContent":["'use client';\n\nimport React, { useRef, useState, useCallback, useEffect } from 'react';\nimport Image from 'next/image';\nimport type { PortfolioBeforeAfterData } from '../../../types';\nimport { resolvePortfolioImage } from '../../../shared/images';\nimport ScrollReveal from '@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal';\nimport GlassCard from '@sonordev/agency-site-kit/portfolio/primitives/GlassCard';\n\ninterface BeforeAfterSectionProps {\n data: PortfolioBeforeAfterData;\n}\n\nexport default function BeforeAfterSection({ data }: BeforeAfterSectionProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState(data.defaultPosition ?? 50);\n const [handleHidden, setHandleHidden] = useState(false);\n const isDragging = useRef(false);\n\n // Support both direct URL strings and (API-resolved) Sanity image objects\n const before = resolvePortfolioImage((data as any).beforeUrl || data.before);\n const after = resolvePortfolioImage((data as any).afterUrl || data.after);\n\n // Slider-handle entrance (ScrollReveal pattern): SSR renders it visible,\n // hydration hides it only while the comparison is still below the viewport,\n // then an IntersectionObserver pops it back in via CSS transition.\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n\n // Never re-hide a handle already in the viewport at hydration.\n const rect = el.getBoundingClientRect();\n if (rect.top < window.innerHeight && rect.bottom > 0) return;\n\n setHandleHidden(true);\n const io = new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting) {\n setHandleHidden(false);\n io.disconnect();\n }\n });\n io.observe(el);\n return () => io.disconnect();\n }, []);\n\n const updatePosition = useCallback((clientX: number) => {\n const container = containerRef.current;\n if (!container) return;\n\n const rect = container.getBoundingClientRect();\n const x = clientX - rect.left;\n const percent = Math.max(0, Math.min(100, (x / rect.width) * 100));\n setPosition(percent);\n }, []);\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n isDragging.current = true;\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n updatePosition(e.clientX);\n },\n [updatePosition],\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent) => {\n if (!isDragging.current) return;\n updatePosition(e.clientX);\n },\n [updatePosition],\n );\n\n const handlePointerUp = useCallback(() => {\n isDragging.current = false;\n }, []);\n\n // Keyboard operation — arrows nudge, Home/End jump (WAI-ARIA slider)\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n const step = e.shiftKey ? 10 : 5;\n const nudge = (delta: number) => {\n e.preventDefault();\n setPosition((prev) => Math.max(0, Math.min(100, prev + delta)));\n };\n if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') nudge(-step);\n else if (e.key === 'ArrowRight' || e.key === 'ArrowUp') nudge(step);\n else if (e.key === 'Home') nudge(-100);\n else if (e.key === 'End') nudge(100);\n }, []);\n\n // Without both images the comparison is meaningless — render nothing\n // rather than a frame with broken images.\n if (!before || !after) return null;\n\n return (\n <section\n className=\"w-full py-20 md:py-28\"\n style={{ background: 'var(--sk-bg, #0a0a0a)' }}\n >\n <div className=\"max-w-5xl mx-auto px-6\">\n {(data.title || data.description) && (\n <ScrollReveal y={30}>\n {data.title && (\n <h2\n className=\"text-3xl md:text-4xl font-bold mb-4\"\n style={{\n color: 'var(--sk-text-primary, #ffffff)',\n fontFamily: 'var(--sk-font-heading, inherit)',\n }}\n >\n {data.title}\n </h2>\n )}\n {data.description && (\n <p\n className=\"text-lg mb-12 max-w-2xl\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n {data.description}\n </p>\n )}\n </ScrollReveal>\n )}\n\n <ScrollReveal y={40}>\n <GlassCard padding=\"sm\" hover={false}>\n <div\n ref={containerRef}\n role=\"slider\"\n tabIndex={0}\n aria-label=\"Before and after comparison\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(position)}\n aria-valuetext={`${Math.round(position)}% before, ${100 - Math.round(position)}% after`}\n className=\"relative w-full overflow-hidden rounded-xl cursor-col-resize select-none\"\n style={{ aspectRatio: '16/10' }}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n onKeyDown={handleKeyDown}\n >\n {/* After image (full background) */}\n <Image\n src={after.url}\n alt=\"After\"\n fill\n sizes=\"(max-width: 1280px) 100vw, 1200px\"\n className=\"object-cover\"\n draggable={false}\n />\n\n {/* Before image (clipped) */}\n <div\n className=\"absolute inset-0 overflow-hidden\"\n style={{ width: `${position}%` }}\n >\n <Image\n src={before.url}\n alt=\"Before\"\n fill\n sizes=\"(max-width: 1280px) 100vw, 1200px\"\n className=\"object-cover\"\n style={{ minWidth: containerRef.current?.offsetWidth || '100%' }}\n draggable={false}\n />\n </div>\n\n {/* Slider line */}\n <div\n className=\"absolute top-0 bottom-0 w-0.5\"\n style={{\n left: `${position}%`,\n transform: 'translateX(-50%)',\n background: '#ffffff',\n boxShadow: '0 0 8px rgba(0,0,0,0.5)',\n }}\n />\n\n {/* Slider handle */}\n <div\n className=\"absolute top-1/2 flex items-center justify-center w-10 h-10 rounded-full\"\n style={{\n left: `${position}%`,\n transform: handleHidden\n ? 'translate(-50%, -50%) scale(0.8)'\n : 'translate(-50%, -50%) scale(1)',\n opacity: handleHidden ? 0 : 1,\n // Transition only on reveal so the hydration hide is instant;\n // .6s back-out overshoot after a .5s beat, like the old entrance.\n transition: handleHidden\n ? 'none'\n : 'opacity 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) 0.5s, transform 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) 0.5s',\n background: 'var(--sk-primary, #6366f1)',\n boxShadow: '0 4px 16px rgba(0,0,0,0.3)',\n border: '3px solid #ffffff',\n zIndex: 5,\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M5 3l-4 5 4 5M11 3l4 5-4 5\" stroke=\"#ffffff\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </div>\n\n {/* Before / After labels */}\n <span\n className=\"absolute top-4 left-4 px-3 py-1 rounded-lg text-xs font-semibold uppercase tracking-wider\"\n style={{\n background: 'rgba(0,0,0,0.6)',\n color: '#ffffff',\n backdropFilter: 'blur(4px)',\n }}\n >\n {(data as any).beforeLabel || 'Before'}\n </span>\n <span\n className=\"absolute top-4 right-4 px-3 py-1 rounded-lg text-xs font-semibold uppercase tracking-wider\"\n style={{\n background: 'rgba(0,0,0,0.6)',\n color: '#ffffff',\n backdropFilter: 'blur(4px)',\n }}\n >\n {(data as any).afterLabel || 'After'}\n </span>\n </div>\n </GlassCard>\n </ScrollReveal>\n </div>\n </section>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,123 @@
|
|
|
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);
|
|
31
|
+
|
|
32
|
+
// src/portfolio/components/sections/CTASection.tsx
|
|
33
|
+
var CTASection_exports = {};
|
|
34
|
+
__export(CTASection_exports, {
|
|
35
|
+
default: () => CTASection
|
|
36
|
+
});
|
|
37
|
+
module.exports = __toCommonJS(CTASection_exports);
|
|
38
|
+
var import_ScrollReveal = __toESM(require("@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal"), 1);
|
|
39
|
+
var import_GlassCard = __toESM(require("@sonordev/agency-site-kit/portfolio/primitives/GlassCard"), 1);
|
|
40
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
41
|
+
var CTA_BUTTON_CSS = `
|
|
42
|
+
.sk-cta-button{transition:transform .25s cubic-bezier(.25,.46,.45,.94)}
|
|
43
|
+
.sk-cta-button:hover{transform:translateY(-2px) scale(1.05)}
|
|
44
|
+
@media (prefers-reduced-motion:reduce){.sk-cta-button{transition:none}.sk-cta-button:hover{transform:none}}
|
|
45
|
+
`;
|
|
46
|
+
function CTASection({ data }) {
|
|
47
|
+
const style = data.style || "primary";
|
|
48
|
+
const content = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col items-center text-center gap-6 py-12 px-8 md:px-16", children: [
|
|
49
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ScrollReveal.default, { y: 30, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
50
|
+
"h2",
|
|
51
|
+
{
|
|
52
|
+
className: "text-3xl md:text-4xl lg:text-5xl font-bold leading-tight",
|
|
53
|
+
style: {
|
|
54
|
+
color: style === "primary" ? "#ffffff" : "var(--sk-text-primary, #ffffff)",
|
|
55
|
+
fontFamily: "var(--sk-font-heading, inherit)"
|
|
56
|
+
},
|
|
57
|
+
children: data.headline
|
|
58
|
+
}
|
|
59
|
+
) }),
|
|
60
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ScrollReveal.default, { y: 20, delay: 0.15, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
61
|
+
"p",
|
|
62
|
+
{
|
|
63
|
+
className: "text-base md:text-lg max-w-xl leading-relaxed",
|
|
64
|
+
style: {
|
|
65
|
+
color: style === "primary" ? "rgba(255,255,255,0.85)" : "var(--sk-text-secondary, #a1a1aa)"
|
|
66
|
+
},
|
|
67
|
+
children: data.description
|
|
68
|
+
}
|
|
69
|
+
) }),
|
|
70
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ScrollReveal.default, { y: 20, delay: 0.3, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
71
|
+
"a",
|
|
72
|
+
{
|
|
73
|
+
href: data.buttonUrl,
|
|
74
|
+
"data-portfolio-action": "cta",
|
|
75
|
+
className: "sk-cta-button inline-flex items-center gap-2 px-8 py-4 rounded-xl text-base font-semibold",
|
|
76
|
+
style: {
|
|
77
|
+
background: style === "primary" ? "#ffffff" : "var(--sk-primary, #6366f1)",
|
|
78
|
+
color: style === "primary" ? "var(--sk-primary, #6366f1)" : "#ffffff",
|
|
79
|
+
boxShadow: "0 4px 20px rgba(0,0,0,0.2)",
|
|
80
|
+
willChange: "transform"
|
|
81
|
+
},
|
|
82
|
+
children: [
|
|
83
|
+
data.buttonText,
|
|
84
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M3.75 9h10.5M9.75 4.5L14.25 9l-4.5 4.5", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) })
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
) })
|
|
88
|
+
] });
|
|
89
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "w-full py-20 md:py-28", children: [
|
|
90
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("style", { href: "sk-cta-button", precedence: "default", children: CTA_BUTTON_CSS }),
|
|
91
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "max-w-5xl mx-auto px-6", children: style === "primary" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
92
|
+
"div",
|
|
93
|
+
{
|
|
94
|
+
className: "relative overflow-hidden rounded-2xl",
|
|
95
|
+
style: {
|
|
96
|
+
background: `linear-gradient(135deg, var(--sk-primary, #6366f1) 0%, color-mix(in srgb, var(--sk-primary, #6366f1) 70%, #000000) 100%)`
|
|
97
|
+
},
|
|
98
|
+
children: [
|
|
99
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
100
|
+
"div",
|
|
101
|
+
{
|
|
102
|
+
className: "absolute -top-24 -right-24 w-64 h-64 rounded-full opacity-20",
|
|
103
|
+
style: {
|
|
104
|
+
background: "radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)"
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
),
|
|
108
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
109
|
+
"div",
|
|
110
|
+
{
|
|
111
|
+
className: "absolute -bottom-16 -left-16 w-48 h-48 rounded-full opacity-15",
|
|
112
|
+
style: {
|
|
113
|
+
background: "radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
),
|
|
117
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "relative z-10", children: content })
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_GlassCard.default, { padding: "sm", hover: false, children: content }) })
|
|
121
|
+
] });
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=CTASection.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/portfolio/components/sections/CTASection.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\nimport type { PortfolioCTAData } from '../../../types';\nimport ScrollReveal from '@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal';\nimport GlassCard from '@sonordev/agency-site-kit/portfolio/primitives/GlassCard';\n\ninterface CTASectionProps {\n data: PortfolioCTAData;\n}\n\n// Button lift on hover (y -2, scale 1.05) — pure CSS, no mouse handlers.\n// .25s with a power2.out-style ease matches the old hover tween.\nconst CTA_BUTTON_CSS = `\n.sk-cta-button{transition:transform .25s cubic-bezier(.25,.46,.45,.94)}\n.sk-cta-button:hover{transform:translateY(-2px) scale(1.05)}\n@media (prefers-reduced-motion:reduce){.sk-cta-button{transition:none}.sk-cta-button:hover{transform:none}}\n`;\n\nexport default function CTASection({ data }: CTASectionProps) {\n const style = data.style || 'primary';\n\n const content = (\n <div className=\"flex flex-col items-center text-center gap-6 py-12 px-8 md:px-16\">\n <ScrollReveal y={30}>\n <h2\n className=\"text-3xl md:text-4xl lg:text-5xl font-bold leading-tight\"\n style={{\n color: style === 'primary' ? '#ffffff' : 'var(--sk-text-primary, #ffffff)',\n fontFamily: 'var(--sk-font-heading, inherit)',\n }}\n >\n {data.headline}\n </h2>\n </ScrollReveal>\n\n <ScrollReveal y={20} delay={0.15}>\n <p\n className=\"text-base md:text-lg max-w-xl leading-relaxed\"\n style={{\n color: style === 'primary' ? 'rgba(255,255,255,0.85)' : 'var(--sk-text-secondary, #a1a1aa)',\n }}\n >\n {data.description}\n </p>\n </ScrollReveal>\n\n <ScrollReveal y={20} delay={0.3}>\n <a\n href={data.buttonUrl}\n data-portfolio-action=\"cta\"\n className=\"sk-cta-button inline-flex items-center gap-2 px-8 py-4 rounded-xl text-base font-semibold\"\n style={{\n background:\n style === 'primary'\n ? '#ffffff'\n : 'var(--sk-primary, #6366f1)',\n color:\n style === 'primary'\n ? 'var(--sk-primary, #6366f1)'\n : '#ffffff',\n boxShadow: '0 4px 20px rgba(0,0,0,0.2)',\n willChange: 'transform',\n }}\n >\n {data.buttonText}\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\n <path d=\"M3.75 9h10.5M9.75 4.5L14.25 9l-4.5 4.5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </a>\n </ScrollReveal>\n </div>\n );\n\n return (\n <section className=\"w-full py-20 md:py-28\">\n {/* Hover CSS (React 19 hoists + dedupes via href/precedence) */}\n <style href=\"sk-cta-button\" precedence=\"default\">\n {CTA_BUTTON_CSS}\n </style>\n <div className=\"max-w-5xl mx-auto px-6\">\n {style === 'primary' ? (\n <div\n className=\"relative overflow-hidden rounded-2xl\"\n style={{\n background: `linear-gradient(135deg, var(--sk-primary, #6366f1) 0%, color-mix(in srgb, var(--sk-primary, #6366f1) 70%, #000000) 100%)`,\n }}\n >\n {/* Background gradient decorations */}\n <div\n className=\"absolute -top-24 -right-24 w-64 h-64 rounded-full opacity-20\"\n style={{\n background: 'radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)',\n }}\n />\n <div\n className=\"absolute -bottom-16 -left-16 w-48 h-48 rounded-full opacity-15\"\n style={{\n background: 'radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)',\n }}\n />\n <div className=\"relative z-10\">{content}</div>\n </div>\n ) : (\n <GlassCard padding=\"sm\" hover={false}>\n {content}\n </GlassCard>\n )}\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,0BAAyB;AACzB,uBAAsB;AAoBd;AAZR,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAMR,SAAR,WAA4B,EAAE,KAAK,GAAoB;AAC5D,QAAM,QAAQ,KAAK,SAAS;AAE5B,QAAM,UACJ,6CAAC,SAAI,WAAU,oEACb;AAAA,gDAAC,oBAAAA,SAAA,EAAa,GAAG,IACf;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO,UAAU,YAAY,YAAY;AAAA,UACzC,YAAY;AAAA,QACd;AAAA,QAEC,eAAK;AAAA;AAAA,IACR,GACF;AAAA,IAEA,4CAAC,oBAAAA,SAAA,EAAa,GAAG,IAAI,OAAO,MAC1B;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO,UAAU,YAAY,2BAA2B;AAAA,QAC1D;AAAA,QAEC,eAAK;AAAA;AAAA,IACR,GACF;AAAA,IAEA,4CAAC,oBAAAA,SAAA,EAAa,GAAG,IAAI,OAAO,KAC1B;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,yBAAsB;AAAA,QACtB,WAAU;AAAA,QACV,OAAO;AAAA,UACL,YACE,UAAU,YACN,YACA;AAAA,UACN,OACE,UAAU,YACN,+BACA;AAAA,UACN,WAAW;AAAA,UACX,YAAY;AAAA,QACd;AAAA,QAEC;AAAA,eAAK;AAAA,UACN,4CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,sDAAC,UAAK,GAAE,0CAAyC,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,GACtI;AAAA;AAAA;AAAA,IACF,GACF;AAAA,KACF;AAGF,SACE,6CAAC,aAAQ,WAAU,yBAEjB;AAAA,gDAAC,WAAM,MAAK,iBAAgB,YAAW,WACpC,0BACH;AAAA,IACA,4CAAC,SAAI,WAAU,0BACZ,oBAAU,YACT;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,YAAY;AAAA,QACd;AAAA,QAGA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA,UACA,4CAAC,SAAI,WAAU,iBAAiB,mBAAQ;AAAA;AAAA;AAAA,IAC1C,IAEA,4CAAC,iBAAAC,SAAA,EAAU,SAAQ,MAAK,OAAO,OAC5B,mBACH,GAEJ;AAAA,KACF;AAEJ;","names":["ScrollReveal","GlassCard"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { a as PortfolioCTAData } from '../../types-D0nb6KAx.cjs';
|
|
3
|
+
|
|
4
|
+
interface CTASectionProps {
|
|
5
|
+
data: PortfolioCTAData;
|
|
6
|
+
}
|
|
7
|
+
declare function CTASection({ data }: CTASectionProps): React.JSX.Element;
|
|
8
|
+
|
|
9
|
+
export { CTASection as default };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { a as PortfolioCTAData } from '../../types-D0nb6KAx.js';
|
|
3
|
+
|
|
4
|
+
interface CTASectionProps {
|
|
5
|
+
data: PortfolioCTAData;
|
|
6
|
+
}
|
|
7
|
+
declare function CTASection({ data }: CTASectionProps): React.JSX.Element;
|
|
8
|
+
|
|
9
|
+
export { CTASection as default };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
// src/portfolio/components/sections/CTASection.tsx
|
|
5
|
+
import ScrollReveal from "@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal";
|
|
6
|
+
import GlassCard from "@sonordev/agency-site-kit/portfolio/primitives/GlassCard";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
var CTA_BUTTON_CSS = `
|
|
9
|
+
.sk-cta-button{transition:transform .25s cubic-bezier(.25,.46,.45,.94)}
|
|
10
|
+
.sk-cta-button:hover{transform:translateY(-2px) scale(1.05)}
|
|
11
|
+
@media (prefers-reduced-motion:reduce){.sk-cta-button{transition:none}.sk-cta-button:hover{transform:none}}
|
|
12
|
+
`;
|
|
13
|
+
function CTASection({ data }) {
|
|
14
|
+
const style = data.style || "primary";
|
|
15
|
+
const content = /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center text-center gap-6 py-12 px-8 md:px-16", children: [
|
|
16
|
+
/* @__PURE__ */ jsx(ScrollReveal, { y: 30, children: /* @__PURE__ */ jsx(
|
|
17
|
+
"h2",
|
|
18
|
+
{
|
|
19
|
+
className: "text-3xl md:text-4xl lg:text-5xl font-bold leading-tight",
|
|
20
|
+
style: {
|
|
21
|
+
color: style === "primary" ? "#ffffff" : "var(--sk-text-primary, #ffffff)",
|
|
22
|
+
fontFamily: "var(--sk-font-heading, inherit)"
|
|
23
|
+
},
|
|
24
|
+
children: data.headline
|
|
25
|
+
}
|
|
26
|
+
) }),
|
|
27
|
+
/* @__PURE__ */ jsx(ScrollReveal, { y: 20, delay: 0.15, children: /* @__PURE__ */ jsx(
|
|
28
|
+
"p",
|
|
29
|
+
{
|
|
30
|
+
className: "text-base md:text-lg max-w-xl leading-relaxed",
|
|
31
|
+
style: {
|
|
32
|
+
color: style === "primary" ? "rgba(255,255,255,0.85)" : "var(--sk-text-secondary, #a1a1aa)"
|
|
33
|
+
},
|
|
34
|
+
children: data.description
|
|
35
|
+
}
|
|
36
|
+
) }),
|
|
37
|
+
/* @__PURE__ */ jsx(ScrollReveal, { y: 20, delay: 0.3, children: /* @__PURE__ */ jsxs(
|
|
38
|
+
"a",
|
|
39
|
+
{
|
|
40
|
+
href: data.buttonUrl,
|
|
41
|
+
"data-portfolio-action": "cta",
|
|
42
|
+
className: "sk-cta-button inline-flex items-center gap-2 px-8 py-4 rounded-xl text-base font-semibold",
|
|
43
|
+
style: {
|
|
44
|
+
background: style === "primary" ? "#ffffff" : "var(--sk-primary, #6366f1)",
|
|
45
|
+
color: style === "primary" ? "var(--sk-primary, #6366f1)" : "#ffffff",
|
|
46
|
+
boxShadow: "0 4px 20px rgba(0,0,0,0.2)",
|
|
47
|
+
willChange: "transform"
|
|
48
|
+
},
|
|
49
|
+
children: [
|
|
50
|
+
data.buttonText,
|
|
51
|
+
/* @__PURE__ */ jsx("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", children: /* @__PURE__ */ jsx("path", { d: "M3.75 9h10.5M9.75 4.5L14.25 9l-4.5 4.5", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) })
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
) })
|
|
55
|
+
] });
|
|
56
|
+
return /* @__PURE__ */ jsxs("section", { className: "w-full py-20 md:py-28", children: [
|
|
57
|
+
/* @__PURE__ */ jsx("style", { href: "sk-cta-button", precedence: "default", children: CTA_BUTTON_CSS }),
|
|
58
|
+
/* @__PURE__ */ jsx("div", { className: "max-w-5xl mx-auto px-6", children: style === "primary" ? /* @__PURE__ */ jsxs(
|
|
59
|
+
"div",
|
|
60
|
+
{
|
|
61
|
+
className: "relative overflow-hidden rounded-2xl",
|
|
62
|
+
style: {
|
|
63
|
+
background: `linear-gradient(135deg, var(--sk-primary, #6366f1) 0%, color-mix(in srgb, var(--sk-primary, #6366f1) 70%, #000000) 100%)`
|
|
64
|
+
},
|
|
65
|
+
children: [
|
|
66
|
+
/* @__PURE__ */ jsx(
|
|
67
|
+
"div",
|
|
68
|
+
{
|
|
69
|
+
className: "absolute -top-24 -right-24 w-64 h-64 rounded-full opacity-20",
|
|
70
|
+
style: {
|
|
71
|
+
background: "radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
),
|
|
75
|
+
/* @__PURE__ */ jsx(
|
|
76
|
+
"div",
|
|
77
|
+
{
|
|
78
|
+
className: "absolute -bottom-16 -left-16 w-48 h-48 rounded-full opacity-15",
|
|
79
|
+
style: {
|
|
80
|
+
background: "radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
),
|
|
84
|
+
/* @__PURE__ */ jsx("div", { className: "relative z-10", children: content })
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
) : /* @__PURE__ */ jsx(GlassCard, { padding: "sm", hover: false, children: content }) })
|
|
88
|
+
] });
|
|
89
|
+
}
|
|
90
|
+
export {
|
|
91
|
+
CTASection as default
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=CTASection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/portfolio/components/sections/CTASection.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\nimport type { PortfolioCTAData } from '../../../types';\nimport ScrollReveal from '@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal';\nimport GlassCard from '@sonordev/agency-site-kit/portfolio/primitives/GlassCard';\n\ninterface CTASectionProps {\n data: PortfolioCTAData;\n}\n\n// Button lift on hover (y -2, scale 1.05) — pure CSS, no mouse handlers.\n// .25s with a power2.out-style ease matches the old hover tween.\nconst CTA_BUTTON_CSS = `\n.sk-cta-button{transition:transform .25s cubic-bezier(.25,.46,.45,.94)}\n.sk-cta-button:hover{transform:translateY(-2px) scale(1.05)}\n@media (prefers-reduced-motion:reduce){.sk-cta-button{transition:none}.sk-cta-button:hover{transform:none}}\n`;\n\nexport default function CTASection({ data }: CTASectionProps) {\n const style = data.style || 'primary';\n\n const content = (\n <div className=\"flex flex-col items-center text-center gap-6 py-12 px-8 md:px-16\">\n <ScrollReveal y={30}>\n <h2\n className=\"text-3xl md:text-4xl lg:text-5xl font-bold leading-tight\"\n style={{\n color: style === 'primary' ? '#ffffff' : 'var(--sk-text-primary, #ffffff)',\n fontFamily: 'var(--sk-font-heading, inherit)',\n }}\n >\n {data.headline}\n </h2>\n </ScrollReveal>\n\n <ScrollReveal y={20} delay={0.15}>\n <p\n className=\"text-base md:text-lg max-w-xl leading-relaxed\"\n style={{\n color: style === 'primary' ? 'rgba(255,255,255,0.85)' : 'var(--sk-text-secondary, #a1a1aa)',\n }}\n >\n {data.description}\n </p>\n </ScrollReveal>\n\n <ScrollReveal y={20} delay={0.3}>\n <a\n href={data.buttonUrl}\n data-portfolio-action=\"cta\"\n className=\"sk-cta-button inline-flex items-center gap-2 px-8 py-4 rounded-xl text-base font-semibold\"\n style={{\n background:\n style === 'primary'\n ? '#ffffff'\n : 'var(--sk-primary, #6366f1)',\n color:\n style === 'primary'\n ? 'var(--sk-primary, #6366f1)'\n : '#ffffff',\n boxShadow: '0 4px 20px rgba(0,0,0,0.2)',\n willChange: 'transform',\n }}\n >\n {data.buttonText}\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\n <path d=\"M3.75 9h10.5M9.75 4.5L14.25 9l-4.5 4.5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </a>\n </ScrollReveal>\n </div>\n );\n\n return (\n <section className=\"w-full py-20 md:py-28\">\n {/* Hover CSS (React 19 hoists + dedupes via href/precedence) */}\n <style href=\"sk-cta-button\" precedence=\"default\">\n {CTA_BUTTON_CSS}\n </style>\n <div className=\"max-w-5xl mx-auto px-6\">\n {style === 'primary' ? (\n <div\n className=\"relative overflow-hidden rounded-2xl\"\n style={{\n background: `linear-gradient(135deg, var(--sk-primary, #6366f1) 0%, color-mix(in srgb, var(--sk-primary, #6366f1) 70%, #000000) 100%)`,\n }}\n >\n {/* Background gradient decorations */}\n <div\n className=\"absolute -top-24 -right-24 w-64 h-64 rounded-full opacity-20\"\n style={{\n background: 'radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)',\n }}\n />\n <div\n className=\"absolute -bottom-16 -left-16 w-48 h-48 rounded-full opacity-15\"\n style={{\n background: 'radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 70%)',\n }}\n />\n <div className=\"relative z-10\">{content}</div>\n </div>\n ) : (\n <GlassCard padding=\"sm\" hover={false}>\n {content}\n </GlassCard>\n )}\n </div>\n </section>\n );\n}\n"],"mappings":";;;;AAIA,OAAO,kBAAkB;AACzB,OAAO,eAAe;AAoBd,cAuBA,YAvBA;AAZR,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAMR,SAAR,WAA4B,EAAE,KAAK,GAAoB;AAC5D,QAAM,QAAQ,KAAK,SAAS;AAE5B,QAAM,UACJ,qBAAC,SAAI,WAAU,oEACb;AAAA,wBAAC,gBAAa,GAAG,IACf;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO,UAAU,YAAY,YAAY;AAAA,UACzC,YAAY;AAAA,QACd;AAAA,QAEC,eAAK;AAAA;AAAA,IACR,GACF;AAAA,IAEA,oBAAC,gBAAa,GAAG,IAAI,OAAO,MAC1B;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO,UAAU,YAAY,2BAA2B;AAAA,QAC1D;AAAA,QAEC,eAAK;AAAA;AAAA,IACR,GACF;AAAA,IAEA,oBAAC,gBAAa,GAAG,IAAI,OAAO,KAC1B;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,yBAAsB;AAAA,QACtB,WAAU;AAAA,QACV,OAAO;AAAA,UACL,YACE,UAAU,YACN,YACA;AAAA,UACN,OACE,UAAU,YACN,+BACA;AAAA,UACN,WAAW;AAAA,UACX,YAAY;AAAA,QACd;AAAA,QAEC;AAAA,eAAK;AAAA,UACN,oBAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,8BAAC,UAAK,GAAE,0CAAyC,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,GACtI;AAAA;AAAA;AAAA,IACF,GACF;AAAA,KACF;AAGF,SACE,qBAAC,aAAQ,WAAU,yBAEjB;AAAA,wBAAC,WAAM,MAAK,iBAAgB,YAAW,WACpC,0BACH;AAAA,IACA,oBAAC,SAAI,WAAU,0BACZ,oBAAU,YACT;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,YAAY;AAAA,QACd;AAAA,QAGA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,SAAI,WAAU,iBAAiB,mBAAQ;AAAA;AAAA;AAAA,IAC1C,IAEA,oBAAC,aAAU,SAAQ,MAAK,OAAO,OAC5B,mBACH,GAEJ;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var ScrollReveal = require('@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal');
|
|
4
|
+
var GlassCard = require('@sonordev/agency-site-kit/portfolio/primitives/GlassCard');
|
|
5
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var ScrollReveal__default = /*#__PURE__*/_interopDefault(ScrollReveal);
|
|
10
|
+
var GlassCard__default = /*#__PURE__*/_interopDefault(GlassCard);
|
|
11
|
+
|
|
12
|
+
// src/portfolio/components/sections/ChallengesSection.tsx
|
|
7
13
|
function ChallengeIcon({ name }) {
|
|
8
14
|
if (!name) return null;
|
|
9
15
|
const icons = {
|
|
@@ -32,7 +38,7 @@ function ChallengesSection({ data }) {
|
|
|
32
38
|
className: "w-full py-20 md:py-28",
|
|
33
39
|
style: { background: "var(--sk-bg, #0a0a0a)" },
|
|
34
40
|
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-7xl mx-auto px-6", children: [
|
|
35
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
41
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ScrollReveal__default.default, { y: 30, children: [
|
|
36
42
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
37
43
|
"h2",
|
|
38
44
|
{
|
|
@@ -49,13 +55,13 @@ function ChallengesSection({ data }) {
|
|
|
49
55
|
{
|
|
50
56
|
className: "text-lg mb-12 max-w-2xl",
|
|
51
57
|
style: { color: "var(--sk-text-secondary, #a1a1aa)" },
|
|
52
|
-
children: "
|
|
58
|
+
children: "What stood in the way, and how we cleared it."
|
|
53
59
|
}
|
|
54
60
|
)
|
|
55
61
|
] }),
|
|
56
62
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-8", children: data.items.map((item, index) => {
|
|
57
63
|
const isEven = index % 2 === 0;
|
|
58
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
64
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ScrollReveal__default.default, { y: 40, delay: index * 0.1, children: /* @__PURE__ */ jsxRuntime.jsx(GlassCard__default.default, { padding: "lg", hover: false, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
59
65
|
"div",
|
|
60
66
|
{
|
|
61
67
|
className: `flex flex-col lg:flex-row gap-8 ${isEven ? "" : "lg:flex-row-reverse"}`,
|
|
@@ -178,5 +184,5 @@ function ChallengesSection({ data }) {
|
|
|
178
184
|
}
|
|
179
185
|
|
|
180
186
|
module.exports = ChallengesSection;
|
|
181
|
-
//# sourceMappingURL=ChallengesSection
|
|
182
|
-
//# sourceMappingURL=ChallengesSection
|
|
187
|
+
//# sourceMappingURL=ChallengesSection.cjs.map
|
|
188
|
+
//# sourceMappingURL=ChallengesSection.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/portfolio/components/sections/ChallengesSection.tsx"],"names":["jsx","jsxs","ScrollReveal","GlassCard"],"mappings":"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","file":"ChallengesSection.cjs","sourcesContent":["// Server component — renders on the server; the client primitives below cross the\n// RSC boundary via package subpaths (never import them relatively here).\nimport React from 'react';\nimport type { PortfolioChallengesData } from '../../../types';\nimport ScrollReveal from '@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal';\nimport GlassCard from '@sonordev/agency-site-kit/portfolio/primitives/GlassCard';\n\ninterface ChallengesSectionProps {\n data: PortfolioChallengesData;\n}\n\n/** Icon registry lookup. Returns an inline SVG for known icon keys. */\nfunction ChallengeIcon({ name }: { name?: string }) {\n if (!name) return null;\n\n const icons: Record<string, React.ReactNode> = {\n speed: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n seo: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M21 21l-4.35-4.35\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n ),\n design: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n conversion: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M22 12h-4l-3 9L9 3l-3 9H2\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n mobile: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M12 18h.01\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n ),\n content: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M14 2v6h6M16 13H8M16 17H8M10 9H8\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n };\n\n return (\n <span style={{ color: 'var(--sk-primary, #6366f1)' }}>\n {icons[name] || icons.speed}\n </span>\n );\n}\n\nexport default function ChallengesSection({ data }: ChallengesSectionProps) {\n return (\n <section\n className=\"w-full py-20 md:py-28\"\n style={{ background: 'var(--sk-bg, #0a0a0a)' }}\n >\n <div className=\"max-w-7xl mx-auto px-6\">\n <ScrollReveal y={30}>\n <h2\n className=\"text-3xl md:text-4xl font-bold mb-4\"\n style={{\n color: 'var(--sk-text-primary, #ffffff)',\n fontFamily: 'var(--sk-font-heading, inherit)',\n }}\n >\n Challenges & Solutions\n </h2>\n <p\n className=\"text-lg mb-12 max-w-2xl\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n What stood in the way, and how we cleared it.\n </p>\n </ScrollReveal>\n\n <div className=\"flex flex-col gap-8\">\n {data.items.map((item, index) => {\n const isEven = index % 2 === 0;\n return (\n <ScrollReveal key={index} y={40} delay={index * 0.1}>\n <GlassCard padding=\"lg\" hover={false}>\n <div\n className={`flex flex-col lg:flex-row gap-8 ${\n isEven ? '' : 'lg:flex-row-reverse'\n }`}\n >\n {/* Challenge side */}\n <div className=\"flex-1 flex flex-col gap-3\">\n <div className=\"flex items-center gap-3\">\n {/* Number badge */}\n <span\n className=\"flex items-center justify-center w-10 h-10 rounded-full text-sm font-bold shrink-0\"\n style={{\n background: 'color-mix(in srgb, var(--sk-primary, #6366f1) 15%, transparent)',\n color: 'var(--sk-primary, #6366f1)',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #6366f1) 25%, transparent)',\n }}\n >\n {String(index + 1).padStart(2, '0')}\n </span>\n <ChallengeIcon name={item.icon} />\n <h3\n className=\"text-xl font-semibold\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n {item.title}\n </h3>\n </div>\n <p\n className=\"text-base leading-relaxed\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {item.description}\n </p>\n </div>\n\n {/* Divider */}\n <div\n className=\"hidden lg:block w-px self-stretch\"\n style={{\n background: 'var(--sk-border, rgba(255,255,255,0.1))',\n }}\n />\n <div\n className=\"lg:hidden h-px w-full\"\n style={{\n background: 'var(--sk-border, rgba(255,255,255,0.1))',\n }}\n />\n\n {/* Solution side */}\n <div className=\"flex-1 flex flex-col gap-3\">\n <div className=\"flex items-center gap-2\">\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ color: '#10b981' }}\n >\n <path\n d=\"M16.667 5L7.5 14.167 3.333 10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span\n className=\"text-sm font-semibold uppercase tracking-wider\"\n style={{ color: '#10b981' }}\n >\n Solution\n </span>\n </div>\n <p\n className=\"text-base leading-relaxed\"\n style={{ color: 'var(--sk-text-secondary, #a1a1aa)' }}\n >\n {item.solution}\n </p>\n {item.result && (\n <div\n className=\"mt-2 px-4 py-2 rounded-lg text-sm\"\n style={{\n background: 'color-mix(in srgb, var(--sk-primary, #6366f1) 8%, transparent)',\n color: 'var(--sk-primary, #6366f1)',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #6366f1) 15%, transparent)',\n }}\n >\n <span className=\"font-semibold\">Result:</span> {item.result}\n </div>\n )}\n </div>\n </div>\n </GlassCard>\n </ScrollReveal>\n );\n })}\n </div>\n </div>\n </section>\n );\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { c as PortfolioChallengesData } from '../../types-0tVPy4pU.cjs';
|
|
3
|
+
|
|
4
|
+
interface ChallengesSectionProps {
|
|
5
|
+
data: PortfolioChallengesData;
|
|
6
|
+
}
|
|
7
|
+
declare function ChallengesSection({ data }: ChallengesSectionProps): React.JSX.Element;
|
|
8
|
+
|
|
9
|
+
export { ChallengesSection as default };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { c as PortfolioChallengesData } from '../../types-0tVPy4pU.js';
|
|
3
|
+
|
|
4
|
+
interface ChallengesSectionProps {
|
|
5
|
+
data: PortfolioChallengesData;
|
|
6
|
+
}
|
|
7
|
+
declare function ChallengesSection({ data }: ChallengesSectionProps): React.JSX.Element;
|
|
8
|
+
|
|
9
|
+
export { ChallengesSection as default };
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import ScrollReveal from '@sonordev/agency-site-kit/portfolio/primitives/ScrollReveal';
|
|
2
|
+
import GlassCard from '@sonordev/agency-site-kit/portfolio/primitives/GlassCard';
|
|
3
3
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
4
|
|
|
5
|
+
// src/portfolio/components/sections/ChallengesSection.tsx
|
|
5
6
|
function ChallengeIcon({ name }) {
|
|
6
7
|
if (!name) return null;
|
|
7
8
|
const icons = {
|
|
@@ -47,7 +48,7 @@ function ChallengesSection({ data }) {
|
|
|
47
48
|
{
|
|
48
49
|
className: "text-lg mb-12 max-w-2xl",
|
|
49
50
|
style: { color: "var(--sk-text-secondary, #a1a1aa)" },
|
|
50
|
-
children: "
|
|
51
|
+
children: "What stood in the way, and how we cleared it."
|
|
51
52
|
}
|
|
52
53
|
)
|
|
53
54
|
] }),
|
|
@@ -176,5 +177,5 @@ function ChallengesSection({ data }) {
|
|
|
176
177
|
}
|
|
177
178
|
|
|
178
179
|
export { ChallengesSection as default };
|
|
179
|
-
//# sourceMappingURL=ChallengesSection
|
|
180
|
-
//# sourceMappingURL=ChallengesSection
|
|
180
|
+
//# sourceMappingURL=ChallengesSection.js.map
|
|
181
|
+
//# sourceMappingURL=ChallengesSection.js.map
|