Compare commits
9 Commits
version_4_
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| f977576c77 | |||
|
|
177feb133d | ||
| dbc0f7b8c3 | |||
| d03b62ef30 | |||
| 0b12ec570d | |||
| ad4bbd980e | |||
| a29a6679a9 | |||
| 7ee6f74ec2 | |||
| 725fe34f7e |
@@ -1,20 +1,26 @@
|
||||
// AUTO-GENERATED shell by per-section-migrate.
|
||||
// Section bodies live in ./<PageBase>/sections/<X>.tsx. Edit the section
|
||||
// files directly. Non-block content (wrappers, non-inlinable sections) is
|
||||
// preserved inline; extracted section blocks become <XSection/> refs.
|
||||
|
||||
import { motion } from "motion/react";
|
||||
import { StyleProvider } from "@/components/ui/StyleProvider";
|
||||
import SiteBackgroundSlot from "@/components/ui/SiteBackgroundSlot";
|
||||
import TestimonialTrustCard from "@/components/sections/testimonial/TestimonialTrustCard";
|
||||
import HeroWorkScrollStack from "@/components/sections/hero/HeroWorkScrollStack";
|
||||
import AboutTestimonialParallax from "@/components/sections/about/AboutTestimonialParallax";
|
||||
import FeaturesBentoGridCta from "@/components/sections/features/FeaturesBentoGridCta";
|
||||
import FaqTabbedAccordion from "@/components/sections/faq/FaqTabbedAccordion";
|
||||
import ContactSplitFormParallax from "@/components/sections/contact/ContactSplitFormParallax";
|
||||
import LoaderReveal from "@/components/ui/LoaderReveal";
|
||||
import CornerGlowBackground from "@/components/ui/CornerGlowBackground";
|
||||
import React from 'react';
|
||||
import HeroSection from './HomePage/sections/Hero';
|
||||
import TestimonialSection from './HomePage/sections/Testimonial';
|
||||
import AboutSection from './HomePage/sections/About';
|
||||
import ServicesSection from './HomePage/sections/Services';
|
||||
import FaqSection from './HomePage/sections/Faq';
|
||||
import ContactSection from './HomePage/sections/Contact';
|
||||
|
||||
export default function HomePage() {
|
||||
export default function HomePage(): React.JSX.Element {
|
||||
return (
|
||||
<StyleProvider siteBackground="none" heroBackground="none" buttonVariant="stagger">
|
||||
<LoaderReveal
|
||||
imageSrc="https://storage.googleapis.com/webild/default/templates/creative-portfolio/avatar.webp?_wi=1"
|
||||
imageSrc="https://storage.googleapis.com/webild/users/user_3EgQruFBe8v7fZsAOmV8S569n7g/uploaded-1782613527940-t2nclcub.jpg?_wi=1"
|
||||
title="Phang Kar-Men"
|
||||
/>
|
||||
|
||||
@@ -29,157 +35,17 @@ export default function HomePage() {
|
||||
|
||||
</motion.div>
|
||||
|
||||
<HeroWorkScrollStack
|
||||
heroAnimationDelay={4}
|
||||
tag="1 spot left this month"
|
||||
title="Design that"
|
||||
titleHighlight="commands attention."
|
||||
description="Design engineered for performance, not just aesthetics."
|
||||
descriptionMuted="I craft every visual touchpoint your brand needs to capture attention and convert it into revenue."
|
||||
primaryButton={{
|
||||
text: "Book a call with me",
|
||||
href: "#contact",
|
||||
avatarSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/avatar.webp",
|
||||
avatarLabel: "You",
|
||||
}}
|
||||
sectionTag="Selected Work"
|
||||
sectionTitle="Projects That Speak for Themselves"
|
||||
sectionDescription="A curated selection of design work that drove real business results for ambitious brands."
|
||||
items={[
|
||||
{
|
||||
title: "HydroFlow Product Launch",
|
||||
description: "Beverage brand shoot. Every frame engineered to sell.",
|
||||
imageSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/screen-1.webp",
|
||||
tag: "Product Shot",
|
||||
},
|
||||
{
|
||||
title: "Webild Athlete Campaign",
|
||||
description: "Sports tech shoot. Wearables captured in raw motion.",
|
||||
imageSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/screen-2.webp",
|
||||
tag: "Photography",
|
||||
},
|
||||
{
|
||||
title: "Maru Residence",
|
||||
description: "Architectural interior shoot. Minimal compositions.",
|
||||
imageSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/screen-3.webp",
|
||||
tag: "Interior Design",
|
||||
},
|
||||
]}
|
||||
secondaryButton={{ text: "View all my projects", href: "#" }}
|
||||
/>
|
||||
<HeroSection />
|
||||
|
||||
<TestimonialTrustCard
|
||||
quote="Working with Kar-Men felt like having a seasoned design partner who truly understood our vision for KYMA and brought it to life in ways we hadn't even imagined."
|
||||
rating={5}
|
||||
author="Thomas Weber — Co-founder of KYMA"
|
||||
avatars={[
|
||||
{ name: "Thomas Weber", imageSrc: "https://randomuser.me/api/portraits/men/75.jpg" },
|
||||
]}
|
||||
/>
|
||||
<TestimonialSection />
|
||||
|
||||
<div id="about" data-section="about">
|
||||
<AboutTestimonialParallax
|
||||
tag="About"
|
||||
quote="I don't design to decorate — I design to solve. Sharp, intentional work that moves brands forward."
|
||||
author="Phang Kar-Men"
|
||||
role="Independent Designer"
|
||||
imageSrc="https://storage.googleapis.com/webild/default/templates/creative-portfolio/avatar.webp?_wi=2"
|
||||
socialLinks={[
|
||||
{ icon: "Twitter", label: "Twitter", href: "#" },
|
||||
{ icon: "Linkedin", label: "LinkedIn", href: "#" },
|
||||
{ icon: "Instagram", label: "Instagram", href: "#" },
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
<AboutSection />
|
||||
|
||||
<div id="services" data-section="services">
|
||||
<FeaturesBentoGridCta
|
||||
tag="Services"
|
||||
title="What I Bring to the Table"
|
||||
description="End-to-end creative services designed to make your brand impossible to ignore — from the first frame to the final pixel."
|
||||
features={[
|
||||
{ title: "Photography", description: "Art-directed shoots that capture your brand's personality. Every image is color-graded and built to stop the scroll.", imageSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/photography.webp" },
|
||||
{ title: "Product Design", description: "User-centered interfaces for apps and SaaS products. From wireframe to pixel-perfect UI — intuitive experiences that keep users coming back.", imageSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/product-design.webp" },
|
||||
{ title: "Website", description: "Conversion-focused websites that look sharp and perform. Clean layouts, strategic CTAs, and responsive design that turns traffic into revenue.", imageSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/website.webp" },
|
||||
{ title: "Videos", description: "Brand films and product videos engineered for engagement. Story-driven visuals that convert viewers into customers.", imageSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/videos.webp" },
|
||||
]}
|
||||
ctaButton={{
|
||||
text: "Book a call with me",
|
||||
href: "#contact",
|
||||
avatarSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/avatar.webp",
|
||||
avatarLabel: "You",
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<ServicesSection />
|
||||
|
||||
<FaqTabbedAccordion
|
||||
tag="FAQ"
|
||||
title="Frequently Asked Questions"
|
||||
description="Everything you need to know before we start working together."
|
||||
categories={[
|
||||
{
|
||||
name: "General",
|
||||
items: [
|
||||
{ question: "What type of clients do you work with?", answer: "I work with ambitious brands, startups, and established businesses that value premium creative work. Whether you're launching a new product or refreshing your brand identity, I bring the same level of craft and attention to detail." },
|
||||
{ question: "What's your availability like?", answer: "I typically take on 2–3 projects at a time to ensure each client gets my full attention. Reach out to check my current availability — I'm happy to discuss timelines." },
|
||||
{ question: "Do you work remotely or on-site?", answer: "Primarily remote, but I'm open to on-site work for shoots, workshops, or strategy sessions depending on the project scope and location." },
|
||||
{ question: "Can I see more examples of your work?", answer: "Absolutely. The projects on this site are a curated selection. I'm happy to share additional case studies relevant to your industry during our initial call." },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Pricing",
|
||||
items: [
|
||||
{ question: "How do you structure your pricing?", answer: "I offer project-based pricing tailored to scope and deliverables. Every engagement starts with a discovery call so I can provide an accurate, transparent quote — no surprises." },
|
||||
{ question: "Do you require a deposit?", answer: "Yes, I require a 50% deposit to secure your spot and begin work. The remaining balance is due upon delivery of final assets." },
|
||||
{ question: "Do you offer retainer packages?", answer: "I do. For clients with ongoing creative needs, monthly retainers offer priority access, discounted rates, and faster turnaround times." },
|
||||
{ question: "What's included in a typical project quote?", answer: "Quotes include all creative direction, production, editing, and delivery of final files. Revisions are built in — I want you to be thrilled with the result." },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Process",
|
||||
items: [
|
||||
{ question: "What does your process look like?", answer: "Discovery call → Creative brief → Concept development → Production → Review & refinement → Final delivery. I keep you in the loop at every stage with clear timelines and checkpoints." },
|
||||
{ question: "How long does a typical project take?", answer: "Most projects wrap within 2–4 weeks depending on complexity. Larger campaigns or multi-deliverable projects may extend further, and I'll set expectations upfront." },
|
||||
{ question: "How many revisions are included?", answer: "Two rounds of revisions are standard. In practice, my clients rarely need more than one — I invest heavily in understanding your vision before production begins." },
|
||||
{ question: "What do you need from me to get started?", answer: "A brief overview of your brand, goals, and any existing assets or references. I'll guide you through the rest during our kickoff call." },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Results",
|
||||
items: [
|
||||
{ question: "What kind of results can I expect?", answer: "My work is designed to drive measurable outcomes — higher engagement, increased conversions, and a brand presence that commands attention. I'll share relevant case studies during our call." },
|
||||
{ question: "Do you track performance metrics?", answer: "While I focus on the creative, I design everything with performance in mind. I'm happy to collaborate with your marketing team to align on KPIs and measure impact." },
|
||||
{ question: "Can you share client testimonials?", answer: "Yes — I have testimonials and references available. Many of my clients see 2–3x improvements in engagement after implementing new creative assets." },
|
||||
{ question: "What makes your work different?", answer: "I combine strategic thinking with high-end execution. Every project is approached as a partnership — I'm invested in your success, not just delivering files." },
|
||||
],
|
||||
},
|
||||
]}
|
||||
cta={{
|
||||
imageSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/avatar.webp?_wi=3",
|
||||
name: "More questions? Reach out anytime.",
|
||||
role: "karmen@phangcreative.com",
|
||||
buttonText: "Book a call",
|
||||
buttonHref: "#contact",
|
||||
}}
|
||||
/>
|
||||
<FaqSection />
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<ContactSplitFormParallax
|
||||
tag="Get in Touch"
|
||||
title="Let's Build"
|
||||
description="Have a project in mind? Drop me a message and I'll get back to you within 24 hours."
|
||||
inputs={[
|
||||
{ name: "name", type: "text", placeholder: "Your name", required: true },
|
||||
{ name: "email", type: "email", placeholder: "Your email", required: true }
|
||||
]}
|
||||
textarea={{ name: "message", placeholder: "Tell me about your project...", rows: 5, required: true }}
|
||||
buttonText="Send Message"
|
||||
imageSrc="https://storage.googleapis.com/webild/default/templates/creative-portfolio/contact.webp"
|
||||
ctaLinks={[
|
||||
{ icon: "Video", label: "Book a Call", href: "#" },
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
<ContactSection />
|
||||
|
||||
|
||||
</StyleProvider>
|
||||
|
||||
24
src/pages/HomePage/sections/About.tsx
Normal file
24
src/pages/HomePage/sections/About.tsx
Normal file
@@ -0,0 +1,24 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "about" section.
|
||||
|
||||
import React from 'react';
|
||||
import AboutTestimonialParallax from "@/components/sections/about/AboutTestimonialParallax";
|
||||
|
||||
export default function AboutSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="about" data-section="about">
|
||||
<AboutTestimonialParallax
|
||||
tag="About"
|
||||
quote="I don't design to decorate — I design to solve. Sharp, intentional work that moves brands forward."
|
||||
author="Phang Kar-Men"
|
||||
role="Independent Designer"
|
||||
imageSrc="https://storage.googleapis.com/webild/users/user_3EgQruFBe8v7fZsAOmV8S569n7g/uploaded-1782613527940-t2nclcub.jpg?_wi=2"
|
||||
socialLinks={[
|
||||
{ icon: "Twitter", label: "Twitter", href: "#" },
|
||||
{ icon: "Linkedin", label: "LinkedIn", href: "#" },
|
||||
{ icon: "Instagram", label: "Instagram", href: "#" },
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
27
src/pages/HomePage/sections/Contact.tsx
Normal file
27
src/pages/HomePage/sections/Contact.tsx
Normal file
@@ -0,0 +1,27 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "contact" section.
|
||||
|
||||
import React from 'react';
|
||||
import ContactSplitFormParallax from "@/components/sections/contact/ContactSplitFormParallax";
|
||||
|
||||
export default function ContactSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="contact" data-section="contact">
|
||||
<ContactSplitFormParallax
|
||||
tag="Get in Touch"
|
||||
title="Let's Build"
|
||||
description="Have a project in mind? Drop me a message and I'll get back to you within 24 hours."
|
||||
inputs={[
|
||||
{ name: "name", type: "text", placeholder: "Your name", required: true },
|
||||
{ name: "email", type: "email", placeholder: "Your email", required: true }
|
||||
]}
|
||||
textarea={{ name: "message", placeholder: "Tell me about your project...", rows: 5, required: true }}
|
||||
buttonText="Send Message"
|
||||
imageSrc="https://storage.googleapis.com/webild/default/templates/creative-portfolio/contact.webp"
|
||||
ctaLinks={[
|
||||
{ icon: "Video", label: "Book a Call", href: "#" },
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
62
src/pages/HomePage/sections/Faq.tsx
Normal file
62
src/pages/HomePage/sections/Faq.tsx
Normal file
@@ -0,0 +1,62 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "faq" section.
|
||||
|
||||
import React from 'react';
|
||||
import FaqTabbedAccordion from "@/components/sections/faq/FaqTabbedAccordion";
|
||||
|
||||
export default function FaqSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="faq" data-section="faq">
|
||||
<FaqTabbedAccordion
|
||||
tag="FAQ"
|
||||
title="Frequently Asked Questions"
|
||||
description="Everything you need to know before we start working together."
|
||||
categories={[
|
||||
{
|
||||
name: "General",
|
||||
items: [
|
||||
{ question: "What type of clients do you work with?", answer: "I work with ambitious brands, startups, and established businesses that value premium creative work. Whether you're launching a new product or refreshing your brand identity, I bring the same level of craft and attention to detail." },
|
||||
{ question: "What's your availability like?", answer: "I typically take on 2–3 projects at a time to ensure each client gets my full attention. Reach out to check my current availability — I'm happy to discuss timelines." },
|
||||
{ question: "Do you work remotely or on-site?", answer: "Primarily remote, but I'm open to on-site work for shoots, workshops, or strategy sessions depending on the project scope and location." },
|
||||
{ question: "Can I see more examples of your work?", answer: "Absolutely. The projects on this site are a curated selection. I'm happy to share additional case studies relevant to your industry during our initial call." },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Pricing",
|
||||
items: [
|
||||
{ question: "How do you structure your pricing?", answer: "I offer project-based pricing tailored to scope and deliverables. Every engagement starts with a discovery call so I can provide an accurate, transparent quote — no surprises." },
|
||||
{ question: "Do you require a deposit?", answer: "Yes, I require a 50% deposit to secure your spot and begin work. The remaining balance is due upon delivery of final assets." },
|
||||
{ question: "Do you offer retainer packages?", answer: "I do. For clients with ongoing creative needs, monthly retainers offer priority access, discounted rates, and faster turnaround times." },
|
||||
{ question: "What's included in a typical project quote?", answer: "Quotes include all creative direction, production, editing, and delivery of final files. Revisions are built in — I want you to be thrilled with the result." },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Process",
|
||||
items: [
|
||||
{ question: "What does your process look like?", answer: "Discovery call → Creative brief → Concept development → Production → Review & refinement → Final delivery. I keep you in the loop at every stage with clear timelines and checkpoints." },
|
||||
{ question: "How long does a typical project take?", answer: "Most projects wrap within 2–4 weeks depending on complexity. Larger campaigns or multi-deliverable projects may extend further, and I'll set expectations upfront." },
|
||||
{ question: "How many revisions are included?", answer: "Two rounds of revisions are standard. In practice, my clients rarely need more than one — I invest heavily in understanding your vision before production begins." },
|
||||
{ question: "What do you need from me to get started?", answer: "A brief overview of your brand, goals, and any existing assets or references. I'll guide you through the rest during our kickoff call." },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Results",
|
||||
items: [
|
||||
{ question: "What kind of results can I expect?", answer: "My work is designed to drive measurable outcomes — higher engagement, increased conversions, and a brand presence that commands attention. I'll share relevant case studies during our call." },
|
||||
{ question: "Do you track performance metrics?", answer: "While I focus on the creative, I design everything with performance in mind. I'm happy to collaborate with your marketing team to align on KPIs and measure impact." },
|
||||
{ question: "Can you share client testimonials?", answer: "Yes — I have testimonials and references available. Many of my clients see 2–3x improvements in engagement after implementing new creative assets." },
|
||||
{ question: "What makes your work different?", answer: "I combine strategic thinking with high-end execution. Every project is approached as a partnership — I'm invested in your success, not just delivering files." },
|
||||
],
|
||||
},
|
||||
]}
|
||||
cta={{
|
||||
imageSrc: "https://storage.googleapis.com/webild/users/user_3EgQruFBe8v7fZsAOmV8S569n7g/uploaded-1782613527940-t2nclcub.jpg?_wi=3",
|
||||
name: "More questions? Reach out anytime.",
|
||||
role: "karmen@phangcreative.com",
|
||||
buttonText: "Book a call",
|
||||
buttonHref: "#contact",
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
50
src/pages/HomePage/sections/Hero.tsx
Normal file
50
src/pages/HomePage/sections/Hero.tsx
Normal file
@@ -0,0 +1,50 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "hero" section.
|
||||
|
||||
import React from 'react';
|
||||
import HeroWorkScrollStack from "@/components/sections/hero/HeroWorkScrollStack";
|
||||
|
||||
export default function HeroSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="hero" data-section="hero">
|
||||
<HeroWorkScrollStack
|
||||
heroAnimationDelay={4}
|
||||
tag="1 spot left this month"
|
||||
title="Design that"
|
||||
titleHighlight="commands attention."
|
||||
description="Design engineered for performance, not just aesthetics."
|
||||
descriptionMuted="I craft every visual touchpoint your brand needs to capture attention and convert it into revenue."
|
||||
primaryButton={{
|
||||
text: "Book a call with me",
|
||||
href: "#contact",
|
||||
avatarSrc: "https://storage.googleapis.com/webild/users/user_3EgQruFBe8v7fZsAOmV8S569n7g/uploaded-1782613527940-t2nclcub.jpg",
|
||||
avatarLabel: "You",
|
||||
}}
|
||||
sectionTag="Selected Work"
|
||||
sectionTitle="Projects That Speak for Themselves"
|
||||
sectionDescription="A curated selection of design work that drove real business results for ambitious brands."
|
||||
items={[
|
||||
{
|
||||
title: "HydroFlow Product Launch",
|
||||
description: "Beverage brand shoot. Every frame engineered to sell.",
|
||||
imageSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/screen-1.webp",
|
||||
tag: "Product Shot",
|
||||
},
|
||||
{
|
||||
title: "Webild Athlete Campaign",
|
||||
description: "Sports tech shoot. Wearables captured in raw motion.",
|
||||
imageSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/screen-2.webp",
|
||||
tag: "Photography",
|
||||
},
|
||||
{
|
||||
title: "Maru Residence",
|
||||
description: "Architectural interior shoot. Minimal compositions.",
|
||||
imageSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/screen-3.webp",
|
||||
tag: "Interior Design",
|
||||
},
|
||||
]}
|
||||
secondaryButton={{ text: "View all my projects", href: "#" }}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
146
src/pages/HomePage/sections/Services.tsx
Normal file
146
src/pages/HomePage/sections/Services.tsx
Normal file
@@ -0,0 +1,146 @@
|
||||
/* eslint-disable */
|
||||
// @ts-nocheck — generated by catalog-eject; runtime-correct but TS strict-mode false-positives on inlined catalog body
|
||||
import ImageOrVideo from "@/components/ui/ImageOrVideo";
|
||||
import TextAnimation from "@/components/ui/TextAnimation";
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal";
|
||||
import { cls } from "@/lib/utils";
|
||||
|
||||
const features = [
|
||||
{
|
||||
title: "Photography",
|
||||
description: "Art-directed shoots that capture your brand's personality. Every image is color-graded and built to stop the scroll.",
|
||||
imageSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/photography.webp"
|
||||
},
|
||||
{
|
||||
title: "Product Design",
|
||||
description: "User-centered interfaces for apps and SaaS products. From wireframe to pixel-perfect UI — intuitive experiences that keep users coming back.",
|
||||
imageSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/product-design.webp"
|
||||
},
|
||||
{
|
||||
title: "Website",
|
||||
description: "Conversion-focused websites that look sharp and perform. Clean layouts, strategic CTAs, and responsive design that turns traffic into revenue.",
|
||||
imageSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/website.webp"
|
||||
},
|
||||
{
|
||||
title: "Videos",
|
||||
description: "Brand films and product videos engineered for engagement. Story-driven visuals that convert viewers into customers.",
|
||||
imageSrc: "https://storage.googleapis.com/webild/default/templates/creative-portfolio/videos.webp"
|
||||
}
|
||||
];
|
||||
const ctaButton = {
|
||||
text: "Book a call with me",
|
||||
href: "#contact",
|
||||
avatarSrc: "https://storage.googleapis.com/webild/users/user_3EgQruFBe8v7fZsAOmV8S569n7g/uploaded-1782613527940-t2nclcub.jpg",
|
||||
avatarLabel: "You"
|
||||
};
|
||||
|
||||
type FeatureItem = {
|
||||
title: string;
|
||||
description: string;
|
||||
} & ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never });
|
||||
|
||||
interface FeaturesBentoGridCtaProps {
|
||||
tag: string;
|
||||
title: string;
|
||||
description: string;
|
||||
features: [FeatureItem, FeatureItem, FeatureItem, FeatureItem];
|
||||
ctaButton?: {
|
||||
text: string;
|
||||
href: string;
|
||||
avatarSrc?: string;
|
||||
avatarLabel?: string;
|
||||
};
|
||||
}
|
||||
|
||||
const ServicesInline = () => {
|
||||
const colSpans = ["md:col-span-5", "md:col-span-7", "md:col-span-7", "md:col-span-5"];
|
||||
|
||||
return (
|
||||
<section aria-label="Features section" className="py-24 relative">
|
||||
<div className="w-content-width mx-auto grid grid-cols-1 lg:grid-cols-12 gap-12 lg:gap-8 items-start">
|
||||
<div className="lg:col-span-5 lg:sticky lg:top-32 flex flex-col items-start gap-4">
|
||||
<div className="px-3 py-1 mb-1 text-sm card rounded w-fit">
|
||||
<p>{"Services"}</p>
|
||||
</div>
|
||||
|
||||
<TextAnimation
|
||||
text={"What I Bring to the Table"}
|
||||
variant="slide-up"
|
||||
gradientText={true}
|
||||
tag="h2"
|
||||
className="text-5xl lg:text-6xl leading-[1.15] font-semibold text-left text-balance"
|
||||
/>
|
||||
|
||||
<TextAnimation
|
||||
text={"End-to-end creative services designed to make your brand impossible to ignore — from the first frame to the final pixel."}
|
||||
variant="slide-up"
|
||||
gradientText={false}
|
||||
tag="p"
|
||||
className="text-lg md:text-xl leading-snug text-left text-balance text-accent"
|
||||
/>
|
||||
|
||||
{ctaButton && (
|
||||
<ScrollReveal variant="slide-up" delay={0.2}>
|
||||
<a
|
||||
href={ctaButton.href}
|
||||
className="group flex items-center gap-3 mt-2 text-primary-cta-text rounded-full pl-3 pr-6 py-3 w-fit primary-button transition-all duration-300"
|
||||
>
|
||||
{ctaButton.avatarSrc && (
|
||||
<div className="flex items-center">
|
||||
<div className="card p-px rounded-full transition-transform duration-500 ease-out group-hover:-rotate-6">
|
||||
<img
|
||||
src={ctaButton.avatarSrc}
|
||||
className="w-9 h-9 rounded-full object-cover"
|
||||
alt=""
|
||||
/>
|
||||
</div>
|
||||
<div className="grid grid-cols-[0fr] group-hover:grid-cols-[1fr] transition-all duration-500 ease-out">
|
||||
<div className="overflow-hidden flex items-center">
|
||||
<span className="text-primary-cta-text text-sm font-semibold mx-2 transition-transform duration-500 ease-out -translate-x-3 group-hover:translate-x-0">
|
||||
+
|
||||
</span>
|
||||
<div className="card p-px rounded-full shrink-0 transition-transform duration-500 ease-out -translate-x-5 group-hover:translate-x-0 group-hover:rotate-6">
|
||||
<span className="w-9 h-9 rounded-full flex items-center justify-center">
|
||||
<span className="text-foreground text-xs font-bold">{ctaButton.avatarLabel || "You"}</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
<span className="text-base font-semibold whitespace-nowrap">{ctaButton.text}</span>
|
||||
</a>
|
||||
</ScrollReveal>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="lg:col-span-7 flex flex-col gap-8 lg:gap-24 lg:pb-32">
|
||||
{features.map((feature, index) => (
|
||||
<ScrollReveal key={feature.title} variant="slide-up" delay={0.1}>
|
||||
<div
|
||||
className="sticky flex flex-col gap-4 p-4 card rounded-lg shadow-sm border border-foreground/5"
|
||||
style={{ top: `calc(8rem + ${index * 1.5}rem)` }}
|
||||
>
|
||||
<div className="h-64 sm:h-80 lg:h-96 rounded overflow-hidden bg-foreground/5">
|
||||
<ImageOrVideo imageSrc={feature.imageSrc} videoSrc={feature.videoSrc} className="w-full h-full object-cover" />
|
||||
</div>
|
||||
<div className="flex flex-col gap-2 p-2">
|
||||
<h3 className="text-2xl font-semibold leading-snug">{feature.title}</h3>
|
||||
<p className="text-base text-accent leading-snug">{feature.description}</p>
|
||||
</div>
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default function ServicesSection() {
|
||||
return (
|
||||
<div data-webild-section="services" id="services">
|
||||
<ServicesInline />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
20
src/pages/HomePage/sections/Testimonial.tsx
Normal file
20
src/pages/HomePage/sections/Testimonial.tsx
Normal file
@@ -0,0 +1,20 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "testimonial" section.
|
||||
|
||||
import React from 'react';
|
||||
import TestimonialTrustCard from "@/components/sections/testimonial/TestimonialTrustCard";
|
||||
|
||||
export default function TestimonialSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="testimonial" data-section="testimonial">
|
||||
<TestimonialTrustCard
|
||||
quote="Working with Kar-Men felt like having a seasoned design partner who truly understood our vision for KYMA and brought it to life in ways we hadn't even imagined."
|
||||
rating={5}
|
||||
author="Thomas Weber — Co-founder of KYMA"
|
||||
avatars={[
|
||||
{ name: "Thomas Weber", imageSrc: "https://randomuser.me/api/portraits/men/75.jpg" },
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user