Compare commits
25 Commits
version_12
...
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 |
@@ -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,6 +2,8 @@ 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() {
|
||||
@@ -11,6 +13,8 @@ export default function App() {
|
||||
<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>
|
||||
);
|
||||
|
||||
@@ -14,6 +14,8 @@ export default function Layout() {
|
||||
{ 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;
|
||||
|
||||
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>
|
||||
|
||||
@@ -125,8 +125,7 @@ const ProjectsInline = () => {
|
||||
|
||||
<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 mb-3">{item.description}</span>
|
||||
<Button text="View Project" href={item.href || "#"} variant="secondary" className="w-max mt-2" />
|
||||
<span className="text-base leading-snug truncate">{item.description}</span>
|
||||
</div>
|
||||
</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>
|
||||
);
|
||||
|
||||
@@ -8,4 +8,5 @@ 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