← back to Model Arena
data/artifacts/15bc10e7ee25/kimi.html
689 lines
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Grandmillennial Lookbook — Designer Wallcoverings</title>
<style>
:root{
/* Color Tokens - Restrained Luxury with Cream Ground */
--ink:#1c1a17;
--cream:#f5f2ea;
--warm-white:#faf8f3;
--clay:#c4a77d;
--rose:#b88a8a;
--sage:#8a9a7b;
--navy:#2e3a48;
--gold:#c9a961;
--stone:#8a8578;
/* Typography */
--font-display:'Didot','Bodoni MT','Playfair Display',Georgia,serif;
--font-body:Georgia,'Times New Roman',serif;
--font-label:-apple-system,'Segoe UI','Helvetica Neue',Arial,sans-serif;
/* Scale */
--text-caption:12px;
--text-body:16px;
--text-lead:21px;
--text-h3:28px;
--text-h2:38px;
--text-h1:50px;
--text-display:42px;
/* Spacing */
--space-xs:8px;
--space-sm:16px;
--space-md:24px;
--space-lg:40px;
--space-xl:64px;
/* Motion */
--ease-luxe:cubic-bezier(0.22,1,0.36,1);
--dur:0.7s;
}
*{
margin:0;
padding:0;
box-sizing:border-box;
}
html,body{
height:100%;
background:var(--cream);
color:var(--ink);
font-family:var(--font-body);
font-size:var(--text-body);
line-height:1.6;
overflow:hidden;
}
/* Header - Fixed at top */
header{
position:fixed;
top:0;
left:0;
right:0;
z-index:100;
background:var(--cream);
padding:var(--space-sm) var(--space-md);
border-bottom:1px solid rgba(28,26,23,0.08);
}
header h1{
font-family:var(--font-display);
font-size:var(--text-lead);
font-weight:400;
letter-spacing:0.15em;
text-transform:uppercase;
color:var(--ink);
text-align:center;
}
/* Carousel Container */
.carousel{
position:relative;
width:100%;
height:100%;
display:flex;
overflow:hidden;
}
/* Slides Track */
.slides-track{
display:flex;
width:500%;
height:100%;
transition:transform var(--dur) var(--ease-luxe);
}
/* Individual Slide */
.slide{
width:20%;
height:100%;
display:flex;
align-items:center;
justify-content:center;
padding:var(--space-lg);
padding-top:80px;
}
/* Card Container */
.card{
width:100%;
max-width:420px;
background:var(--warm-white);
border-radius:4px;
box-shadow:0 8px 32px rgba(28,26,23,0.08);
overflow:hidden;
display:flex;
flex-direction:column;
animation:fadeUp var(--dur) var(--ease-luxe) both;
}
/* Image Container for Patterns/Vignettes */
.card-visual{
width:100%;
aspect-ratio:4/5;
position:relative;
overflow:hidden;
background:var(--cream);
}
/* Text Content - Flex Column Layout */
.card-content{
padding:var(--space-md);
display:flex;
flex-direction:column;
gap:var(--space-xs);
flex-shrink:0;
}
.card-content h2{
font-family:var(--font-display);
font-size:var(--text-h3);
line-height:1.2;
color:var(--ink);
font-weight:400;
}
.card-content p{
font-size:var(--text-body);
color:var(--stone);
line-height:1.5;
font-style:italic;
}
/* Label Style */
.label{
font-family:var(--font-label);
font-size:var(--text-caption);
text-transform:uppercase;
letter-spacing:0.15em;
color:var(--stone);
margin-bottom:var(--space-xs);
}
/* Pattern Swatches */
.pattern-swatch{
position:absolute;
top:var(--space-sm);
left:var(--space-sm);
width:80px;
height:80px;
border-radius:50%;
border:3px solid var(--warm-white);
box-shadow:0 4px 12px rgba(28,26,23,0.15);
z-index:10;
}
/* Grandmillennial Patterns */
/* Chintz Floral - SVG Pattern */
.pattern-chintz{
background:var(--rose);
}
.pattern-chintz svg{
width:100%;
height:100%;
opacity:0.9;
}
/* Toile - SVG Pattern */
.pattern-toile{
background:var(--navy);
}
.pattern-toile svg{
width:100%;
height:100%;
opacity:0.95;
}
/* Gingham - CSS Pattern */
.pattern-gingham{
background:
repeating-linear-gradient(
0deg,
transparent,
transparent 10px,
var(--clay) 10px,
var(--clay) 20px
),
repeating-linear-gradient(
90deg,
transparent,
transparent 10px,
var(--clay) 10px,
var(--clay) 20px
);
background-color:var(--cream);
background-blend-mode:multiply;
opacity:0.7;
}
/* Room Vignettes - CSS Art */
/* Living Room Vignette */
.room-living{
width:100%;
height:100%;
background:
/* Art frame */
linear-gradient(to bottom, rgba(28,26,23,0.1) 0%, transparent 100%) 50% 20% / 120px 80px no-repeat,
/* Wallpaper */
radial-gradient(circle at 30% 40%, var(--rose) 2px, transparent 2px),
radial-gradient(circle at 70% 60%, var(--rose) 2px, transparent 2px),
radial-gradient(circle at 50% 80%, var(--rose) 2px, transparent 2px),
/* Wall */
linear-gradient(to bottom, var(--cream) 0%, #ebe6dc 100%);
background-size:
120px 80px,
60px 60px,
60px 60px,
60px 60px,
100% 100%;
position:relative;
}
.room-living::before{
content:'';
position:absolute;
bottom:0;
left:20%;
right:20%;
height:45%;
background:
/* Sofa back */
linear-gradient(to bottom, var(--navy) 0%, #3d4d5c 100%);
border-radius:8px 8px 0 0;
box-shadow:inset 0 -20px 40px rgba(0,0,0,0.2);
}
.room-living::after{
content:'';
position:absolute;
bottom:10%;
left:25%;
right:25%;
height:25%;
background:var(--clay);
border-radius:4px;
opacity:0.9;
}
/* Bedroom Vignette */
.room-bedroom{
width:100%;
height:100%;
background:
/* Headboard */
linear-gradient(to bottom, var(--navy) 0%, #2e3a48 100%) 50% 35% / 200px 120px no-repeat,
/* Wall pattern */
repeating-linear-gradient(
90deg,
transparent,
transparent 40px,
rgba(200,169,97,0.15) 40px,
rgba(200,169,97,0.15) 42px
),
/* Wall base */
linear-gradient(to bottom, #f0ece3 0%, var(--cream) 100%);
position:relative;
}
.room-bedroom::before{
content:'';
position:absolute;
bottom:0;
left:15%;
right:15%;
height:50%;
background:
/* Bedding */
linear-gradient(135deg, var(--warm-white) 0%, #f0ece3 100%);
border-radius:8px 8px 0 0;
}
.room-bedroom::after{
content:'';
position:absolute;
bottom:30%;
left:20%;
right:20%;
height:20%;
background:var(--rose);
opacity:0.6;
filter:blur(20px);
}
/* Dining Room Vignette */
.room-dining{
width:100%;
height:100%;
background:
/* Chandelier suggestion */
radial-gradient(circle at 50% 15%, var(--gold) 8px, transparent 8px),
radial-gradient(circle at 50% 15%, rgba(201,169,97,0.3) 0%, transparent 40px),
/* Wall molding */
linear-gradient(to right, transparent 0%, rgba(28,26,23,0.05) 50%, transparent 100%) 0 30% / 100% 2px no-repeat,
linear-gradient(to right, transparent 0%, rgba(28,26,23,0.05) 50%, transparent 100%) 0 70% / 100% 2px no-repeat,
/* Wall */
linear-gradient(to bottom, var(--cream) 0%, #ebe6dc 100%);
position:relative;
}
.room-dining::before{
content:'';
position:absolute;
bottom:15%;
left:10%;
right:10%;
height:8px;
background:var(--clay);
border-radius:4px;
}
.room-dining::after{
content:'';
position:absolute;
bottom:15%;
left:30%;
right:30%;
height:35%;
background:
/* Chair backs */
linear-gradient(to bottom, var(--sage) 0%, #7a8a6b 100%) 20% 0 / 40px 100% no-repeat,
linear-gradient(to bottom, var(--sage) 0%, #7a8a6b 100%) 80% 0 / 40px 100% no-repeat;
background-color:var(--warm-white);
border-radius:4px 4px 0 0;
}
/* Cover Slide Styles */
.cover-card{
text-align:center;
padding:var(--space-xl) var(--space-lg);
}
.cover-card h2{
font-family:var(--font-display);
font-size:var(--text-display);
line-height:1.1;
color:var(--ink);
margin-bottom:var(--space-sm);
letter-spacing:-0.02em;
}
.cover-card .subtitle{
font-size:var(--text-lead);
color:var(--stone);
font-style:italic;
margin-bottom:var(--space-md);
}
.cover-year{
font-family:var(--font-label);
font-size:var(--text-caption);
letter-spacing:0.2em;
text-transform:uppercase;
color:var(--clay);
}
/* CTA Slide Styles */
.cta-card{
text-align:center;
padding:var(--space-xl) var(--space-lg);
}
.cta-card h2{
font-family:var(--font-display);
font-size:var(--text-h2);
color:var(--ink);
margin-bottom:var(--space-sm);
}
.cta-card p{
color:var(--stone);
margin-bottom:var(--space-lg);
font-size:var(--text-lead);
}
.cta-button{
display:inline-block;
padding:var(--space-sm) var(--space-lg);
background:var(--ink);
color:var(--cream);
font-family:var(--font-label);
font-size:var(--text-caption);
letter-spacing:0.15em;
text-transform:uppercase;
text-decoration:none;
border-radius:2px;
transition:background 0.3s var(--ease-luxe);
}
.cta-button:hover{
background:var(--navy);
}
/* Navigation Dots */
.dots{
position:fixed;
bottom:var(--space-lg);
left:50%;
transform:translateX(-50%);
display:flex;
gap:var(--space-sm);
z-index:100;
}
.dot{
width:10px;
height:10px;
border-radius:50%;
background:rgba(28,26,23,0.2);
cursor:pointer;
transition:all 0.3s var(--ease-luxe);
border:none;
}
.dot.active{
background:var(--ink);
transform:scale(1.2);
}
/* Touch/Swipe Areas */
.swipe-area{
position:fixed;
top:80px;
bottom:100px;
width:20%;
z-index:50;
cursor:pointer;
}
.swipe-left{left:0;}
.swipe-right{right:0;}
/* Animations */
@keyframes fadeUp{
from{opacity:0;transform:translateY(28px)}
to{opacity:1;transform:none}
}
.slide.active .card{
animation:fadeUp var(--dur) var(--ease-luxe) both;
}
/* Decorative Elements */
.ornament{
width:60px;
height:2px;
background:var(--clay);
margin:var(--space-md) auto;
}
/* Responsive */
@media(max-width:480px){
:root{
--text-display:32px;
--text-h2:28px;
--text-h3:24px;
}
.slide{
padding:var(--space-md);
padding-top:80px;
}
}
</style>
</head>
<body>
<header>
<h1>Designer Wallcoverings</h1>
</header>
<div class="carousel">
<div class="slides-track" id="track">
<!-- Slide 1: Cover -->
<div class="slide active">
<div class="card cover-card">
<div class="cover-year">Collection 2024</div>
<h2>Grandmillennial</h2>
<div class="ornament"></div>
<p class="subtitle">Where inherited elegance meets collected comfort</p>
</div>
</div>
<!-- Slide 2: Chintz -->
<div class="slide">
<div class="card">
<div class="card-visual">
<div class="pattern-swatch pattern-chintz">
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<defs>
<pattern id="chintz" x="0" y="0" width="50" height="50" patternUnits="userSpaceOnUse">
<circle cx="25" cy="25" r="15" fill="none" stroke="#f5f2ea" stroke-width="1.5" opacity="0.6"/>
<circle cx="25" cy="25" r="10" fill="none" stroke="#f5f2ea" stroke-width="1" opacity="0.4"/>
<circle cx="25" cy="10" r="4" fill="#f5f2ea" opacity="0.5"/>
<circle cx="40" cy="25" r="4" fill="#f5f2ea" opacity="0.5"/>
<circle cx="25" cy="40" r="4" fill="#f5f2ea" opacity="0.5"/>
<circle cx="10" cy="25" r="4" fill="#f5f2ea" opacity="0.5"/>
<path d="M25 10 Q35 25 25 40 Q15 25 25 10" fill="none" stroke="#f5f2ea" stroke-width="0.8" opacity="0.3"/>
<path d="M10 25 Q25 35 40 25 Q25 15 10 25" fill="none" stroke="#f5f2ea" stroke-width="0.8" opacity="0.3"/>
</pattern>
</defs>
<rect width="100" height="100" fill="url(#chintz)"/>
</svg>
</div>
<div class="room-living"></div>
</div>
<div class="card-content">
<div class="label">Pattern 01</div>
<h2>English Chintz</h2>
<p>Layer cabbage rose motifs with modern silhouettes for updated romance</p>
</div>
</div>
</div>
<!-- Slide 3: Toile -->
<div class="slide">
<div class="card">
<div class="card-visual">
<div class="pattern-swatch pattern-toile">
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<defs>
<pattern id="toile" x="0" y="0" width="60" height="60" patternUnits="userSpaceOnUse">
<path d="M10 50 Q20 30 30 50 T50 50" fill="none" stroke="#f5f2ea" stroke-width="1" opacity="0.5"/>
<path d="M30 10 Q40 30 30 50" fill="none" stroke="#f5f2ea" stroke-width="0.8" opacity="0.4"/>
<circle cx="50" cy="20" r="3" fill="#f5f2ea" opacity="0.4"/>
<path d="M50 20 L55 10 L60 20 Z" fill="#f5f2ea" opacity="0.3"/>
<path d="M10 30 Q20 40 30 30" fill="none" stroke="#f5f2ea" stroke-width="0.8" opacity="0.3"/>
</pattern>
</defs>
<rect width="100" height="100" fill="url(#toile)"/>
</svg>
</div>
<div class="room-bedroom"></div>
</div>
<div class="card-content">
<div class="label">Pattern 02</div>
<h2>Narrative Toile</h2>
<p>Storybook scenes in deep indigo create sophisticated sanctuary walls</p>
</div>
</div>
</div>
<!-- Slide 4: Gingham -->
<div class="slide">
<div class="card">
<div class="card-visual">
<div class="pattern-swatch pattern-gingham"></div>
<div class="room-dining"></div>
</div>
<div class="card-content">
<div class="label">Pattern 03</div>
<h2>Refined Gingham</h2>
<p>Oversized checks in warm neutrals bridge country and contemporary</p>
</div>
</div>
</div>
<!-- Slide 5: CTA -->
<div class="slide">
<div class="card cta-card">
<h2>Start Your Project</h2>
<p>Request samples or schedule a consultation with our design team</p>
<a href="#" class="cta-button" onclick="event.preventDefault();">Get in Touch</a>
<div class="ornament" style="margin-top:var(--space-lg);"></div>
<p style="font-size:var(--text-caption);color:var(--stone);">designerwallcoverings.com</p>
</div>
</div>
</div>
</div>
<!-- Swipe Areas -->
<div class="swipe-area swipe-left" onclick="prevSlide()"></div>
<div class="swipe-area swipe-right" onclick="nextSlide()"></div>
<!-- Navigation Dots -->
<div class="dots" id="dots">
<button class="dot active" onclick="goToSlide(0)" aria-label="Slide 1"></button>
<button class="dot" onclick="goToSlide(1)" aria-label="Slide 2"></button>
<button class="dot" onclick="goToSlide(2)" aria-label="Slide 3"></button>
<button class="dot" onclick="goToSlide(3)" aria-label="Slide 4"></button>
<button class="dot" onclick="goToSlide(4)" aria-label="Slide 5"></button>
</div>
<script>
let currentSlide = 0;
const totalSlides = 5;
const track = document.getElementById('track');
const dots = document.querySelectorAll('.dot');
const slides = document.querySelectorAll('.slide');
function updateSlide(){
track.style.transform = `translateX(-${currentSlide * 20}%)`;
dots.forEach((dot, index) => {
dot.classList.toggle('active', index === currentSlide);
});
slides.forEach((slide, index) => {
slide.classList.toggle('active', index === currentSlide);
});
}
function nextSlide(){
currentSlide = (currentSlide + 1) % totalSlides;
updateSlide();
}
function prevSlide(){
currentSlide = (currentSlide - 1 + totalSlides) % totalSlides;
updateSlide();
}
function goToSlide(index){
currentSlide = index;
updateSlide();
}
// Keyboard navigation
document.addEventListener('keydown', (e) => {
if(e.key === 'ArrowRight') nextSlide();
if(e.key === 'ArrowLeft') prevSlide();
});
// Touch/Swipe support
let touchStartX = 0;
let touchEndX = 0;
document.addEventListener('touchstart', (e) => {
touchStartX = e.changedTouches[0].screenX;
});
document.addEventListener('touchend', (e) => {
touchEndX = e.changedTouches[0].screenX;
handleSwipe();
});
function handleSwipe(){
const threshold = 50;
const diff = touchStartX - touchEndX;
if(Math.abs(diff) > threshold){
if(diff > 0){
nextSlide();
}else{
prevSlide();
}
}
}
</script>
</body>
</html>