Compare commits
35 Commits
version_8_
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 1ba2908279 | |||
| 040a7fd535 | |||
| 15c6856558 | |||
| 9fb1e00c11 | |||
| e32e760e99 | |||
| 8b201cbe6c | |||
| 283adff54f | |||
| c49e96a7c3 | |||
| 8a3d08ed7f | |||
|
|
4bd9d5f39b | ||
|
|
c4d2a0b52d | ||
| 21f2c691bb | |||
| d4ad543155 | |||
| 061ef09376 | |||
| 558ac5ef57 | |||
| 8c930d8c2c | |||
| 51817f8b8a | |||
| 900e502413 | |||
| 0c0da7d82f | |||
|
|
54ebac3115 | ||
| 354cdc7a53 | |||
| 9d36ba87f6 | |||
| 79bc470c0f | |||
|
|
006a6229a0 | ||
| e851769a06 | |||
|
|
c1e727a163 | ||
|
|
1bc8f87a62 | ||
| 9c5793758d | |||
|
|
3e1a113d0d | ||
| 43afe69979 | |||
|
|
d1e35626bd | ||
|
|
c6e6f46f09 | ||
| 448a58d8e7 | |||
|
|
ae98bd05d7 | ||
| fc1ec4482f |
@@ -5,7 +5,7 @@
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Geist:wght@100..900&family=Inter+Tight:ital,wght@0,100..900;1,100..900&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Playfair+Display:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Studio Madrid | Luxury Interior Design</title>
|
||||
<meta property="og:title" content="Studio Madrid | Luxury Interior Design" />
|
||||
@@ -13,9 +13,13 @@
|
||||
<meta name="description" content="Studio Madrid specializes in high-end interior design for luxury residences, flats, and villas throughout Madrid. Transform your home today." />
|
||||
<meta property="og:description" content="Studio Madrid specializes in high-end interior design for luxury residences, flats, and villas throughout Madrid. Transform your home today." />
|
||||
<meta name="twitter:description" content="Studio Madrid specializes in high-end interior design for luxury residences, flats, and villas throughout Madrid. Transform your home today." />
|
||||
<meta property="og:image" content="https://storage.googleapis.com/webild/users/user_3AFDRpptPx4buwNV34xBpWy9jNG/uploaded-1781471648940-wopf0ep1.png" />
|
||||
<meta name="twitter:image" content="https://storage.googleapis.com/webild/users/user_3AFDRpptPx4buwNV34xBpWy9jNG/uploaded-1781471648940-wopf0ep1.png" />
|
||||
<link rel="icon" type="image/png" href="/favicon.png" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/main.tsx"></script>
|
||||
<script defer src="https://analytics.webild.io/wb" data-website-id="118223fc-0bc0-49da-a4b4-fc8388d2274c" data-webild-analytics></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
BIN
public/favicon.png
Normal file
BIN
public/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 527 KiB |
@@ -2,13 +2,19 @@ import { Routes, Route } from 'react-router-dom';
|
||||
import Layout from './components/Layout';
|
||||
import HomePage from './pages/HomePage';
|
||||
|
||||
import BlogPage from './pages/blog/BlogPage';
|
||||
import BlogPostPage from './pages/blog/BlogPostPage';
|
||||
import ProjectsPage from "@/pages/ProjectsPage";
|
||||
import BarrioDeSalamancaPenthousePage from "@/pages/BarrioDeSalamancaPenthousePage";
|
||||
export default function App() {
|
||||
return (
|
||||
<Routes>
|
||||
<Route element={<Layout />}>
|
||||
<Route path="/" element={<HomePage />} />
|
||||
<Route path="/projects" element={<ProjectsPage />} />
|
||||
<Route path="/barrio-de-salamanca-penthouse" element={<BarrioDeSalamancaPenthousePage />} />
|
||||
<Route path="/blog" element={<BlogPage />} />
|
||||
<Route path="/blog/:slug" element={<BlogPostPage />} />
|
||||
</Route>
|
||||
</Routes>
|
||||
);
|
||||
|
||||
@@ -7,14 +7,15 @@ import { StyleProvider } from "@/components/ui/StyleProvider";
|
||||
|
||||
export default function Layout() {
|
||||
const navItems = [
|
||||
{ name: "About", href: "#about" },
|
||||
{ name: "Projects", href: "#projects" },
|
||||
{ name: "Contact", href: "#contact" },
|
||||
{ name: "Hero", href: "#hero" },
|
||||
{ name: "Features", href: "#features" },
|
||||
{ name: "Metrics", href: "#metrics" },
|
||||
{ name: "Testimonials", href: "#testimonials" },
|
||||
{ name: "About", href: "/#about" },
|
||||
{ name: "Projects", href: "/projects" },
|
||||
{ name: "Features", href: "/#features" },
|
||||
{ name: "Metrics", href: "/#metrics" },
|
||||
{ name: "Testimonials", href: "/#testimonials" },
|
||||
{ name: "Contact", href: "/#contact" },
|
||||
{ name: "Barrio De Salamanca Penthouse", href: "/barrio-de-salamanca-penthouse" },
|
||||
{ name: "Blog", href: "/blog" },
|
||||
|
||||
|
||||
];
|
||||
|
||||
|
||||
@@ -5,15 +5,15 @@
|
||||
|
||||
:root {
|
||||
/* @colorThemes/lightTheme/grayNavyBlue */
|
||||
--background: #f6f0e9;
|
||||
--card: #efe7dd;
|
||||
--foreground: #2b180a;
|
||||
--primary-cta: #2b180a;
|
||||
--primary-cta-text: #f6f0e9;
|
||||
--secondary-cta: #efe7dd;
|
||||
--secondary-cta-text: #2b180a;
|
||||
--accent: #94877c;
|
||||
--background-accent: #afa094;
|
||||
--background: #f5faff;
|
||||
--card: #ffffff;
|
||||
--foreground: #001122;
|
||||
--primary-cta: #15479c;
|
||||
--primary-cta-text: #f5faff;
|
||||
--secondary-cta: #ffffff;
|
||||
--secondary-cta-text: #001122;
|
||||
--accent: #a8cce8;
|
||||
--background-accent: #7ba3cf;
|
||||
|
||||
/* @layout/border-radius/rounded */
|
||||
--radius: 1rem;
|
||||
|
||||
25
src/pages/BarrioDeSalamancaPenthousePage.tsx
Normal file
25
src/pages/BarrioDeSalamancaPenthousePage.tsx
Normal file
@@ -0,0 +1,25 @@
|
||||
import Button from "@/components/ui/Button";
|
||||
import HeroBackgroundSlot from "@/components/ui/HeroBackgroundSlot";
|
||||
import TextAnimation from "@/components/ui/TextAnimation";
|
||||
import ImageOrVideo from "@/components/ui/ImageOrVideo";
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal";
|
||||
import AvatarGroup from "@/components/ui/AvatarGroup";
|
||||
import { cls } from "@/lib/utils";
|
||||
|
||||
export default function BarrioDeSalamancaPenthousePage() {
|
||||
return (
|
||||
<>
|
||||
<div data-webild-section="HeroBillboard"><section aria-label="Hero section" className="relative pt-25 pb-20 md:pt-30"><HeroBackgroundSlot /><div className="flex flex-col gap-12 md:gap-15 w-content-width mx-auto"><div className="flex flex-col items-center gap-3 text-center"><div className="px-3 py-1 mb-1 text-sm card rounded w-fit"><p>Residential Portfolio</p></div><TextAnimation text="Barrio de Salamanca Penthouse" variant="fade-blur" gradientText={true} tag="h1" className="md:max-w-8/10 text-7xl 2xl:text-8xl leading-[1.15] font-semibold text-center text-balance" /><TextAnimation text="A bespoke sanctuary in the heart of Madrid. We transformed this penthouse into a sophisticated retreat, blending natural textures with abundant light to tell a unique personal story." variant="fade-blur" gradientText={false} tag="p" className="md:max-w-7/10 text-lg md:text-xl leading-snug text-balance" /><div className="flex flex-wrap justify-center gap-3 mt-2 md:mt-3"><Button text="Explore Project" href="#details" variant="primary" /><Button text="All Projects" href="/projects" variant="secondary" animationDelay={0.1} /></div></div><ScrollReveal variant="fade-blur" delay={0.2} className="w-full p-2 xl:p-3 2xl:p-4 card rounded overflow-hidden"><ImageOrVideo imageSrc="https://img.freepik.com/free-photo/3d-rendering-modern-dining-room-living-room-with-luxury-decor_105762-2216.jpg" className="aspect-4/5 md:aspect-video" /></ScrollReveal></div></section></div>
|
||||
<div data-webild-section="AboutTextSplit"><section aria-label="About section" className="py-20"><div className="flex flex-col gap-20 mx-auto w-content-width"><div className="flex flex-col md:flex-row gap-3 md:gap-15"><div className="w-full md:w-1/2"><TextAnimation text="A Sanctuary Above Salamanca" variant="fade-blur" gradientText={true} tag="h2" className="text-7xl 2xl:text-8xl leading-[1.15] font-semibold text-balance" /></div><div className="flex flex-col gap-2 w-full md:w-1/2"><TextAnimation key={0} text="Perched high above Madrid's most exclusive district, this penthouse is a masterclass in understated luxury. We transformed a classic layout into a fluid, light-filled sanctuary." variant="fade-blur" gradientText={false} tag="p" className="text-xl md:text-2xl leading-snug text-balance" />
|
||||
<TextAnimation key={1} text="Rich textures of natural stone and bespoke oak cabinetry anchor the space. Expansive windows invite the golden Spanish sun to dance across the minimalist forms." variant="fade-blur" gradientText={false} tag="p" className="text-xl md:text-2xl leading-snug text-balance" />
|
||||
<TextAnimation key={2} text="Every detail was selected to reflect the client's refined taste, creating a personal narrative woven through bespoke design and timeless elegance." variant="fade-blur" gradientText={false} tag="p" className="text-xl md:text-2xl leading-snug text-balance" /><div className="flex flex-wrap gap-3 mt-2 md:mt-3"><Button text="Back to Projects" href="/projects" variant="primary" /><Button text="Inquire Now" href="/contact" variant="secondary" animationDelay={0.1} /></div></div></div><div className="w-full border-b border-foreground/5" /></div></section></div>
|
||||
<div data-webild-section="FeaturesImageBento"><section aria-label="Features image bento section" className="py-20"><div className="flex flex-col gap-8 md:gap-10"><div className="flex flex-col items-center w-content-width mx-auto gap-2"><div className="px-3 py-1 mb-1 text-sm card rounded w-fit"><p>Featured Project</p></div><TextAnimation text="Barrio de Salamanca Penthouse" variant="fade-blur" gradientText={true} tag="h2" className="md:max-w-8/10 text-6xl 2xl:text-7xl leading-[1.15] font-semibold text-center text-balance" /><TextAnimation text="A masterclass in bespoke luxury, blending classic Madrid architecture with contemporary elegance and curated textures." variant="fade-blur" gradientText={false} tag="p" className="md:max-w-7/10 text-lg md:text-xl leading-snug text-center text-balance" /><div className="flex flex-wrap justify-center gap-3 mt-2 md:mt-3"><Button text="View Gallery" href="#gallery" variant="primary" /><Button text="All Projects" href="/projects" variant="secondary" animationDelay={0.1} /></div></div><div className="w-content-width mx-auto grid grid-cols-1 md:grid-cols-6 gap-3"><ScrollReveal key={0} variant="fade" delay={0} className="col-span-1 group md:col-span-2"><div className="overflow-hidden rounded"></div></ScrollReveal>
|
||||
<ScrollReveal key={1} variant="fade" delay={0.1} className="col-span-1 group md:col-span-4"><div className="overflow-hidden rounded"></div></ScrollReveal>
|
||||
<ScrollReveal key={2} variant="fade" delay={0} className="col-span-1 group md:col-span-3"><div className="overflow-hidden rounded"></div></ScrollReveal>
|
||||
<ScrollReveal key={3} variant="fade" delay={0.1} className="col-span-1 group md:col-span-3"><div className="overflow-hidden rounded"></div></ScrollReveal>
|
||||
<ScrollReveal key={4} variant="fade" delay={0} className="col-span-1 group md:col-span-2"><div className="overflow-hidden rounded"></div></ScrollReveal>
|
||||
<ScrollReveal key={5} variant="fade" delay={0.1} className="col-span-1 group md:col-span-2"><div className="overflow-hidden rounded"></div></ScrollReveal>
|
||||
<ScrollReveal key={6} variant="fade" delay={0.2} className="col-span-1 group md:col-span-2"><div className="overflow-hidden rounded"></div></ScrollReveal></div></div></section></div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
19
src/pages/BlogPage.tsx
Normal file
19
src/pages/BlogPage.tsx
Normal file
@@ -0,0 +1,19 @@
|
||||
import Button from "@/components/ui/Button";
|
||||
import HeroBackgroundSlot from "@/components/ui/HeroBackgroundSlot";
|
||||
import TextAnimation from "@/components/ui/TextAnimation";
|
||||
import ImageOrVideo from "@/components/ui/ImageOrVideo";
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal";
|
||||
import AvatarGroup from "@/components/ui/AvatarGroup";
|
||||
import { ArrowUpRight, Loader2 } from "lucide-react";
|
||||
import GridOrCarousel from "@/components/ui/GridOrCarousel";
|
||||
import { useButtonClick } from "@/hooks/useButtonClick";
|
||||
import useBlogPosts from "@/hooks/useBlogPosts";
|
||||
|
||||
export default function BlogPage() {
|
||||
return (
|
||||
<>
|
||||
<div data-webild-section="HeroBillboard"><section aria-label="Hero section" className="relative pt-25 pb-20 md:pt-30"><HeroBackgroundSlot /><div className="flex flex-col gap-12 md:gap-15 w-content-width mx-auto"><div className="flex flex-col items-center gap-3 text-center"><div className="px-3 py-1 mb-1 text-sm card rounded w-fit"><p>Design Journal</p></div><TextAnimation text="Stories of Space and Light" variant="fade-blur" gradientText={true} tag="h1" className="md:max-w-8/10 text-7xl 2xl:text-8xl leading-[1.15] font-semibold text-center text-balance" /><TextAnimation text="Explore our latest thoughts on bespoke interiors, architectural trends, and the art of curating spaces that reflect your personal essence." variant="fade-blur" gradientText={false} tag="p" className="md:max-w-7/10 text-lg md:text-xl leading-snug text-balance" /><div className="flex flex-wrap justify-center gap-3 mt-2 md:mt-3"><Button text="Read Latest" href="#latest" variant="primary" /><Button text="Explore Topics" href="#topics" variant="secondary" animationDelay={0.1} /></div></div><ScrollReveal variant="fade-blur" delay={0.2} className="w-full p-2 xl:p-3 2xl:p-4 card rounded overflow-hidden"><ImageOrVideo imageSrc="https://picsum.photos/seed/2089910226/1200/800" className="aspect-4/5 md:aspect-video" /></ScrollReveal></div></section></div>
|
||||
<div data-webild-section="BlogMediaCards"><section aria-label="Blog section" className="py-20"><div className="w-content-width mx-auto flex justify-center"><Loader2 className="size-8 animate-spin text-foreground" strokeWidth={1.5} /></div></section></div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -36,7 +36,7 @@ export default function HeroSection(): React.JSX.Element {
|
||||
"Bilbao",
|
||||
"Malaga",
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/close-up-happy-healthy-young-woman-with-dark-curly-hair-lying-comfortable-sofa-terrace_197531-22796.jpg"
|
||||
imageSrc="https://images.pexels.com/photos/28484958/pexels-photo-28484958.jpeg?auto=compress&cs=tinysrgb&h=650&w=940&id=28484958"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
|
||||
@@ -1,57 +1,159 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "projects" section.
|
||||
/* eslint-disable */
|
||||
// @ts-nocheck — generated by catalog-eject; runtime-correct but TS strict-mode false-positives on inlined catalog body
|
||||
import Button from "@/components/ui/Button";
|
||||
import TextAnimation from "@/components/ui/TextAnimation";
|
||||
import ImageOrVideo from "@/components/ui/ImageOrVideo";
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal";
|
||||
import { cls } from "@/lib/utils";
|
||||
|
||||
import React from 'react';
|
||||
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
const items = [
|
||||
{
|
||||
title: "Luxury Flat",
|
||||
description: "Barrio de Salamanca penthouse",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/woman-reading-book-reading-club-library_23-2150293528.jpg",
|
||||
href: "/barrio-de-salamanca-penthouse"
|
||||
},
|
||||
{
|
||||
title: "Urban Oasis",
|
||||
description: "Modern terrace concept",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/modern-spacious-room-with-large-panoramic-window_7502-7289.jpg"
|
||||
},
|
||||
{
|
||||
title: "Boutique Villa",
|
||||
description: "Contemporary architecture",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/young-coworkers-gathering-table-office_23-2147668778.jpg"
|
||||
},
|
||||
{
|
||||
title: "Townhouse Staging",
|
||||
description: "Modern living transformation",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-blurry-man-walking_23-2150378941.jpg"
|
||||
},
|
||||
{
|
||||
title: "Minimalist Loft",
|
||||
description: "Open plan urban living",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/ai-generated-house-design_23-2150666254.jpg"
|
||||
},
|
||||
{
|
||||
title: "Traditional Fusion",
|
||||
description: "Renovating history",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/bathroom-interior-background-white-spa-towels-wood_1258-111485.jpg"
|
||||
},
|
||||
{
|
||||
title: "Private Residence",
|
||||
description: "Custom luxury detail",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/abstract-blur-furniture-shop-store-interior_74190-4976.jpg"
|
||||
}
|
||||
];
|
||||
|
||||
type FeatureItem = {
|
||||
title: string;
|
||||
description: string;
|
||||
href?: string;
|
||||
} & ({ imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never });
|
||||
|
||||
interface FeaturesImageBentoProps {
|
||||
tag: string;
|
||||
title: string;
|
||||
description: string;
|
||||
primaryButton?: { text: string; href: string };
|
||||
secondaryButton?: { text: string; href: string };
|
||||
items: [FeatureItem, FeatureItem, FeatureItem, FeatureItem, FeatureItem, FeatureItem, FeatureItem];
|
||||
}
|
||||
|
||||
const ProjectsInline = () => {
|
||||
const gridClasses = [
|
||||
"md:col-span-2",
|
||||
"md:col-span-4",
|
||||
"md:col-span-3",
|
||||
"md:col-span-3",
|
||||
"md:col-span-2",
|
||||
"md:col-span-2",
|
||||
"md:col-span-2",
|
||||
];
|
||||
|
||||
const staggerDelays = [
|
||||
0,
|
||||
0.1,
|
||||
0,
|
||||
0.1,
|
||||
0,
|
||||
0.1,
|
||||
0.2,
|
||||
];
|
||||
|
||||
export default function ProjectsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="projects" data-section="projects">
|
||||
<SectionErrorBoundary name="projects">
|
||||
<FeaturesImageBento
|
||||
tag="Featured Work"
|
||||
title="Selected Projects in Madrid"
|
||||
description="Discover our latest transformations across the city."
|
||||
items={[
|
||||
{
|
||||
title: "Luxury Flat",
|
||||
description: "Barrio de Salamanca renovation",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/woman-reading-book-reading-club-library_23-2150293528.jpg",
|
||||
},
|
||||
{
|
||||
title: "Urban Oasis",
|
||||
description: "Modern terrace concept",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/modern-spacious-room-with-large-panoramic-window_7502-7289.jpg",
|
||||
},
|
||||
{
|
||||
title: "Boutique Villa",
|
||||
description: "Contemporary architecture",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/young-coworkers-gathering-table-office_23-2147668778.jpg",
|
||||
},
|
||||
{
|
||||
title: "Townhouse Staging",
|
||||
description: "Modern living transformation",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-blurry-man-walking_23-2150378941.jpg",
|
||||
},
|
||||
{
|
||||
title: "Minimalist Loft",
|
||||
description: "Open plan urban living",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/ai-generated-house-design_23-2150666254.jpg",
|
||||
},
|
||||
{
|
||||
title: "Traditional Fusion",
|
||||
description: "Renovating history",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/bathroom-interior-background-white-spa-towels-wood_1258-111485.jpg",
|
||||
},
|
||||
{
|
||||
title: "Private Residence",
|
||||
description: "Custom luxury detail",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/abstract-blur-furniture-shop-store-interior_74190-4976.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
<section aria-label="Features image bento section" className="py-20">
|
||||
<div className="flex flex-col gap-8 md:gap-10">
|
||||
<div className="flex flex-col items-center w-content-width mx-auto gap-2">
|
||||
<div className="px-3 py-1 mb-1 text-sm card rounded w-fit">
|
||||
<p>{"Featured Work"}</p>
|
||||
</div>
|
||||
|
||||
<TextAnimation
|
||||
text={"Selected Projects in Madrid"}
|
||||
variant="fade-blur"
|
||||
gradientText={true}
|
||||
tag="h2"
|
||||
className="md:max-w-8/10 text-6xl 2xl:text-7xl leading-[1.15] font-semibold text-center text-balance"
|
||||
/>
|
||||
|
||||
<TextAnimation
|
||||
text={"Discover our latest transformations across the city."}
|
||||
variant="fade-blur"
|
||||
gradientText={false}
|
||||
tag="p"
|
||||
className="md:max-w-7/10 text-lg md:text-xl leading-snug text-center text-balance"
|
||||
/>
|
||||
|
||||
{(undefined || undefined) && (
|
||||
<div className="flex flex-wrap justify-center gap-3 mt-2 md:mt-3">
|
||||
{undefined && <Button text={undefined.text} href={undefined.href} variant="primary"/>}
|
||||
{undefined && <Button text={undefined.text} href={undefined.href} variant="secondary" animationDelay={0.1} />}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="w-content-width mx-auto grid grid-cols-1 md:grid-cols-6 gap-3">
|
||||
{items.map((item, index) => {
|
||||
const content = (
|
||||
<div className="relative h-80 xl:h-100 2xl:h-120 overflow-hidden">
|
||||
<ImageOrVideo
|
||||
imageSrc={item.imageSrc}
|
||||
videoSrc={item.videoSrc}
|
||||
className="rounded group-hover:scale-105 transition-transform duration-500"
|
||||
/>
|
||||
|
||||
<div className="absolute inset-x-5 bottom-5 xl:inset-x-6 xl:bottom-6 2xl:inset-x-7 2xl:bottom-7 flex flex-col text-background">
|
||||
<span className="text-2xl font-semibold leading-snug truncate">{item.title}</span>
|
||||
<span className="text-base leading-snug truncate">{item.description}</span>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
return (
|
||||
<ScrollReveal key={index} variant="fade" delay={staggerDelays[index]} className={cls("col-span-1 group", gridClasses[index])}>
|
||||
{item.href ? (
|
||||
<a href={item.href} className="block overflow-hidden rounded">
|
||||
{content}
|
||||
</a>
|
||||
) : (
|
||||
<div className="overflow-hidden rounded">
|
||||
{content}
|
||||
</div>
|
||||
)}
|
||||
</ScrollReveal>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default function ProjectsSection() {
|
||||
return (
|
||||
<div data-webild-section="projects" id="projects">
|
||||
<ProjectsInline />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -309,6 +309,36 @@ const TestimonialsInline = () => {
|
||||
</div>
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
|
||||
<ScrollReveal variant="fade-blur" delay={0.4}>
|
||||
<div className="relative w-full overflow-hidden flex group mt-5">
|
||||
<div className="flex animate-marquee group-hover:[animation-play-state:paused]">
|
||||
{[...testimonials, ...testimonials].map((testimonial, index) => (
|
||||
<div key={`fourth-${index}`} className="flex flex-col justify-between gap-4 xl:gap-5 2xl:gap-6 shrink-0 w-72 md:w-80 mr-5 p-6 xl:p-7 2xl:p-8 rounded card">
|
||||
<p className="text-lg leading-snug line-clamp-3">{testimonial.quote}</p>
|
||||
|
||||
<div className="flex flex-col gap-4">
|
||||
<div className="flex items-center gap-3">
|
||||
<ImageOrVideo
|
||||
imageSrc={testimonial.imageSrc}
|
||||
videoSrc={testimonial.videoSrc}
|
||||
className="size-10 md:size-11 2xl:size-12 rounded-full object-cover"
|
||||
/>
|
||||
<div className="flex flex-col min-w-0">
|
||||
<div className="flex items-center gap-1">
|
||||
<span className="text-base text-foreground font-semibold leading-snug truncate">{testimonial.name}</span>
|
||||
<BadgeCheck className="size-4 text-blue-500 shrink-0" />
|
||||
</div>
|
||||
<span className="text-base text-foreground/75 leading-snug truncate">{testimonial.role}</span>
|
||||
</div>
|
||||
</div>
|
||||
<Button text="Contact" variant="secondary" className="w-full py-2 text-sm" />
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
|
||||
@@ -7,4 +7,6 @@ export interface Route {
|
||||
export const routes: Route[] = [
|
||||
{ path: '/', label: 'Home', pageFile: 'HomePage' },
|
||||
{ path: '/projects', label: 'Projects', pageFile: 'ProjectsPage' },
|
||||
{ path: '/barrio-de-salamanca-penthouse', label: 'Barrio De Salamanca Penthouse', pageFile: 'BarrioDeSalamancaPenthousePage' },
|
||||
{ path: '/blog', label: 'Blog', pageFile: 'BlogPage' },
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user