← back to Model Arena
data/artifacts/193230252710/kimi.html
739 lines
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Designer Wallcoverings — Mood Board Generator</title>
<style>
/* ============================================
DESIGN TOKENS — Luxury Wallcovering Brand
============================================ */
:root {
/* Base palette — Luxe Noir with gold accent */
--bg: #0d0d0f;
--surface: #17171c;
--surface-light: #1f1f26;
--text: #f5f2ea;
--ink: #1c1a17;
--muted: #8a8578;
--accent: #c9a961;
--accent-dim: #7d6a45;
/* Lines & shadows */
--line: rgba(245, 242, 234, 0.12);
--line-strong: rgba(245, 242, 234, 0.25);
--shadow: 0 24px 64px rgba(0, 0, 0, 0.45);
--shadow-soft: 0 8px 32px rgba(0, 0, 0, 0.25);
/* Easing */
--ease-swift: cubic-bezier(.22,.9,.24,1);
--ease-power: cubic-bezier(.77,0,.18,1);
--ease-hero: cubic-bezier(.22,1,.36,1);
/* Typography */
--font-display: 'Didot', 'Bodoni MT', 'Playfair Display', Georgia, serif;
--font-body: 'Avenir Next', 'Century Gothic', Futura, 'Segoe UI', sans-serif;
/* Scale */
--size-caption: 11px;
--size-body: 14px;
--size-lead: 18px;
--size-h3: 24px;
--size-h2: 32px;
--size-h1: 42px;
--size-display: 56px;
}
/* ============================================
RESET & BASE
============================================ */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html, body {
height: 100%;
background: var(--bg);
color: var(--text);
font-family: var(--font-body);
font-size: var(--size-body);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* ============================================
HEADER — Fixed Top Bar
============================================ */
header {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 72px;
background: rgba(13, 13, 15, 0.95);
backdrop-filter: blur(12px);
border-bottom: 1px solid var(--line);
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 48px;
z-index: 1000;
}
.wordmark {
font-family: var(--font-display);
font-size: 42px;
font-weight: 400;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--text);
white-space: nowrap;
}
.scoreboard {
font-family: var(--font-body);
font-size: var(--size-caption);
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--muted);
}
/* ============================================
MAIN LAYOUT
============================================ */
main {
min-height: 100vh;
padding-top: 120px;
padding-bottom: 80px;
display: flex;
flex-direction: column;
align-items: center;
gap: 32px;
}
/* ============================================
THEME SELECTOR
============================================ */
.theme-bar {
display: flex;
gap: 12px;
padding: 8px;
background: var(--surface);
border-radius: 100px;
border: 1px solid var(--line);
}
.theme-btn {
padding: 12px 28px;
font-family: var(--font-body);
font-size: var(--size-caption);
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--muted);
background: transparent;
border: none;
border-radius: 100px;
cursor: pointer;
transition: all 0.3s var(--ease-swift);
}
.theme-btn:hover {
color: var(--text);
}
.theme-btn.active {
background: var(--surface-light);
color: var(--accent);
box-shadow: 0 2px 8px rgba(0,0,0,0.3);
}
/* ============================================
CANVAS — Mood Board
============================================ */
.canvas-wrapper {
position: relative;
padding: 24px;
background: var(--surface);
border-radius: 4px;
box-shadow: var(--shadow);
}
.mood-canvas {
width: 540px;
height: 675px;
background: var(--text);
position: relative;
overflow: hidden;
transition: all 0.6s var(--ease-hero);
}
/* Grid layouts for different arrangements */
.mood-canvas.layout-1 {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 2fr 1fr 1fr;
gap: 3px;
}
.mood-canvas.layout-2 {
display: grid;
grid-template-columns: 2fr 1fr;
grid-template-rows: 1fr 1fr 1fr;
gap: 3px;
}
.mood-canvas.layout-3 {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 2fr 1fr;
gap: 3px;
}
.mood-canvas.layout-4 {
display: grid;
grid-template-columns: 1fr 2fr;
grid-template-rows: 1fr 2fr 1fr;
gap: 3px;
}
/* ============================================
MOOD BOARD ELEMENTS
============================================ */
.board-element {
position: relative;
overflow: hidden;
transition: all 0.5s var(--ease-hero);
}
.board-element:hover {
transform: scale(0.98);
}
/* Hero Pattern — Large feature */
.hero-pattern {
background: var(--ink);
position: relative;
}
/* Color Chips */
.color-chip {
display: flex;
flex-direction: column;
justify-content: flex-end;
padding: 20px;
position: relative;
}
.color-chip::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 40%;
background: linear-gradient(to top, rgba(0,0,0,0.6), transparent);
}
.color-name {
position: relative;
z-index: 2;
font-family: var(--font-display);
font-size: var(--size-h3);
color: var(--text);
text-transform: uppercase;
letter-spacing: 0.08em;
opacity: 0.95;
}
/* Type Sample */
.type-sample {
background: var(--surface-light);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 24px;
text-align: center;
}
.type-sample .sample-head {
font-family: var(--font-display);
font-size: var(--size-h2);
color: var(--text);
line-height: 1.1;
margin-bottom: 8px;
}
.type-sample .sample-body {
font-family: var(--font-body);
font-size: var(--size-body);
color: var(--muted);
letter-spacing: 0.05em;
}
/* Texture Tile */
.texture-tile {
position: relative;
background: var(--surface);
}
/* ============================================
PATTERN LIBRARY — CSS/SVG Only
============================================ */
/* Classic: Damask-inspired geometric */
.pattern-classic {
background-color: #1a1a1f;
background-image:
radial-gradient(circle at 30% 30%, rgba(201, 169, 97, 0.15) 0%, transparent 50%),
radial-gradient(circle at 70% 70%, rgba(201, 169, 97, 0.1) 0%, transparent 40%),
repeating-linear-gradient(45deg, transparent, transparent 35px, rgba(201, 169, 97, 0.03) 35px, rgba(201, 169, 97, 0.03) 36px),
repeating-linear-gradient(-45deg, transparent, transparent 35px, rgba(201, 169, 97, 0.03) 35px, rgba(201, 169, 97, 0.03) 36px);
}
.pattern-classic-hero {
background:
radial-gradient(ellipse at 50% 0%, rgba(201, 169, 97, 0.2) 0%, transparent 60%),
linear-gradient(135deg, #1a1a1f 0%, #0f0f12 100%);
position: relative;
}
.pattern-classic-hero::before {
content: '';
position: absolute;
inset: 40px;
border: 1px solid rgba(201, 169, 97, 0.3);
border-radius: 2px;
}
.pattern-classic-hero::after {
content: '◆';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 120px;
color: rgba(201, 169, 97, 0.15);
}
/* Coastal: Woven texture, airy */
.pattern-coastal {
background-color: #f5f2ea;
background-image:
repeating-linear-gradient(0deg, transparent, transparent 8px, rgba(125, 147, 161, 0.08) 8px, rgba(125, 147, 161, 0.08) 9px),
repeating-linear-gradient(90deg, transparent, transparent 8px, rgba(125, 147, 161, 0.08) 8px, rgba(125, 147, 161, 0.08) 9px);
}
.pattern-coastal-hero {
background:
linear-gradient(180deg, #e8e4dc 0%, #d4cfc4 100%);
position: relative;
}
.pattern-coastal-hero::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(circle at 20% 80%, rgba(125, 147, 161, 0.15) 0%, transparent 40%),
radial-gradient(circle at 80% 20%, rgba(125, 147, 161, 0.1) 0%, transparent 35%);
}
.pattern-coastal-hero::after {
content: '≋';
position: absolute;
bottom: 40px;
right: 40px;
font-size: 80px;
color: rgba(125, 147, 161, 0.25);
}
/* Moody: Dark botanical, rich */
.pattern-moody {
background-color: #141416;
background-image:
radial-gradient(ellipse at 20% 50%, rgba(89, 69, 89, 0.3) 0%, transparent 50%),
radial-gradient(ellipse at 80% 50%, rgba(69, 89, 79, 0.2) 0%, transparent 40%);
}
.pattern-moody-hero {
background:
linear-gradient(160deg, #1a181c 0%, #0d0c0e 100%);
position: relative;
overflow: hidden;
}
.pattern-moody-hero::before {
content: '';
position: absolute;
width: 200%;
height: 200%;
top: -50%;
left: -50%;
background:
radial-gradient(circle at 30% 70%, rgba(139, 109, 129, 0.2) 0%, transparent 30%),
radial-gradient(circle at 70% 30%, rgba(109, 129, 119, 0.15) 0%, transparent 25%);
animation: moodyDrift 20s ease-in-out infinite;
}
@keyframes moodyDrift {
0%, 100% { transform: translate(0, 0) rotate(0deg); }
50% { transform: translate(-5%, -5%) rotate(2deg); }
}
/* Botanical: Organic, leafy */
.pattern-botanical {
background-color: #e8e6e1;
background-image:
radial-gradient(circle at 0% 0%, rgba(139, 149, 119, 0.15) 0%, transparent 40%),
radial-gradient(circle at 100% 100%, rgba(149, 139, 119, 0.1) 0%, transparent 40%);
}
.pattern-botanical-hero {
background:
linear-gradient(135deg, #f0ebe4 0%, #e0d9d0 100%);
position: relative;
}
.pattern-botanical-hero::before {
content: '';
position: absolute;
inset: 30px;
border: 1px solid rgba(119, 139, 109, 0.2);
border-radius: 50% 50% 2px 2px;
}
.pattern-botanical-hero::after {
content: '❦';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 100px;
color: rgba(119, 139, 109, 0.2);
}
/* Texture variations */
.texture-linen {
background:
repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(0,0,0,0.03) 2px, rgba(0,0,0,0.03) 3px),
repeating-linear-gradient(90deg, transparent, transparent 2px, rgba(0,0,0,0.03) 2px, rgba(0,0,0,0.03) 3px),
var(--surface-light);
}
.texture-velvet {
background:
radial-gradient(ellipse at 30% 20%, rgba(201, 169, 97, 0.1) 0%, transparent 50%),
linear-gradient(135deg, #1a1a20 0%, #121216 100%);
}
.texture-silk {
background:
repeating-linear-gradient(90deg, transparent, transparent 20px, rgba(255,255,255,0.02) 20px, rgba(255,255,255,0.02) 21px),
linear-gradient(180deg, #f5f2ea 0%, #e8e4dc 100%);
}
.texture-grasscloth {
background:
repeating-linear-gradient(85deg, transparent, transparent 3px, rgba(0,0,0,0.04) 3px, rgba(0,0,0,0.04) 4px),
#e5e2dc;
}
/* ============================================
REGENERATE BUTTON
============================================ */
.regenerate-bar {
display: flex;
gap: 16px;
align-items: center;
}
.btn-primary {
padding: 16px 40px;
font-family: var(--font-body);
font-size: var(--size-caption);
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--ink);
background: var(--accent);
border: none;
border-radius: 2px;
cursor: pointer;
transition: all 0.3s var(--ease-swift);
}
.btn-primary:hover {
background: var(--text);
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(201, 169, 97, 0.3);
}
.btn-primary:active {
transform: translateY(0);
}
/* ============================================
ANIMATIONS
============================================ */
@keyframes fadeIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
.board-element {
animation: fadeIn 0.6s var(--ease-hero) backwards;
}
.board-element:nth-child(1) { animation-delay: 0.05s; }
.board-element:nth-child(2) { animation-delay: 0.1s; }
.board-element:nth-child(3) { animation-delay: 0.15s; }
.board-element:nth-child(4) { animation-delay: 0.2s; }
.board-element:nth-child(5) { animation-delay: 0.25s; }
/* ============================================
UTILITY
============================================ */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
</style>
</head>
<body>
<header>
<div class="wordmark">Designer Wallcoverings</div>
<div class="scoreboard">Mood Board Generator</div>
</header>
<main>
<div class="theme-bar" role="tablist" aria-label="Select style theme">
<button class="theme-btn active" data-theme="classic" role="tab" aria-selected="true">Classic</button>
<button class="theme-btn" data-theme="coastal" role="tab" aria-selected="false">Coastal</button>
<button class="theme-btn" data-theme="moody" role="tab" aria-selected="false">Moody</button>
<button class="theme-btn" data-theme="botanical" role="tab" aria-selected="false">Botanical</button>
</div>
<div class="canvas-wrapper">
<div class="mood-canvas layout-1" id="moodCanvas" aria-label="Generated mood board">
<!-- Dynamic content injected by JS -->
</div>
</div>
<div class="regenerate-bar">
<button class="btn-primary" id="regenerateBtn">Regenerate Board</button>
</div>
</main>
<script>
/* ============================================
MOOD BOARD GENERATOR
============================================ */
const themes = {
classic: {
name: 'Classic',
hero: 'pattern-classic-hero',
texture: 'texture-velvet',
colors: [
{ name: 'Gilded Noir', hex: '#1a1a1f' },
{ name: 'Burnished Gold', hex: '#c9a961' },
{ name: 'Aged Brass', hex: '#8b7355' }
],
typeHead: 'Timeless',
typeBody: 'Elegance',
typeColor: '#f5f2ea',
typeBg: '#1a1a1f'
},
coastal: {
name: 'Coastal',
hero: 'pattern-coastal-hero',
texture: 'texture-silk',
colors: [
{ name: 'Sea Salt', hex: '#f5f2ea' },
{ name: 'Driftwood', hex: '#b8b0a4' },
{ name: 'Ocean Mist', hex: '#9bb0b8' }
],
typeHead: 'Serene',
typeBody: 'Horizons',
typeColor: '#4a5560',
typeBg: '#f5f2ea'
},
moody: {
name: 'Moody',
hero: 'pattern-moody-hero',
texture: 'texture-velvet',
colors: [
{ name: 'Midthorn', hex: '#2d2428' },
{ name: 'Shadow Bloom', hex: '#4a3f44' },
{ name: 'Deep Verdigris', hex: '#3d4a44' }
],
typeHead: 'Dramatic',
typeBody: 'Depths',
typeColor: '#e8e4dc',
typeBg: '#1a181c'
},
botanical: {
name: 'Botanical',
hero: 'pattern-botanical-hero',
texture: 'texture-grasscloth',
colors: [
{ name: 'Seed Pearl', hex: '#f0ebe4' },
{ name: 'Sage Stem', hex: '#9ba88e' },
{ name: 'Terra Cotta', hex: '#b8907a' }
],
typeHead: 'Organic',
typeBody: 'Forms',
typeColor: '#5a6350',
typeBg: '#f0ebe4'
}
};
let currentTheme = 'classic';
let currentLayout = 1;
const canvas = document.getElementById('moodCanvas');
const regenerateBtn = document.getElementById('regenerateBtn');
const themeBtns = document.querySelectorAll('.theme-btn');
function getRandomLayout() {
return Math.floor(Math.random() * 4) + 1;
}
function renderBoard() {
const theme = themes[currentTheme];
const layout = getRandomLayout();
// Remove old layout class
canvas.className = `mood-canvas layout-${layout}`;
// Clear current content
canvas.innerHTML = '';
// Create elements based on layout
const elements = [];
// Hero pattern (always present, size varies by layout)
const hero = document.createElement('div');
hero.className = `board-element hero-pattern ${theme.hero}`;
hero.style.gridColumn = layout === 1 ? '1 / -1' : layout === 2 ? '1 / 2' : layout === 3 ? '1 / -1' : '2 / -1';
hero.style.gridRow = layout === 1 ? '1 / 2' : layout === 2 ? '1 / -1' : layout === 3 ? '1 / 2' : '1 / 3';
elements.push(hero);
// Color chips
theme.colors.forEach((color, i) => {
const chip = document.createElement('div');
chip.className = 'board-element color-chip';
chip.style.background = color.hex;
chip.innerHTML = `<span class="color-name">${color.name}</span>`;
// Position based on layout
if (layout === 1) {
chip.style.gridColumn = `${(i % 2) + 1} / ${(i % 2) + 2}`;
chip.style.gridRow = `${Math.floor(i / 2) + 2} / ${Math.floor(i / 2) + 3}`;
} else if (layout === 2) {
chip.style.gridColumn = '2 / 3';
chip.style.gridRow = `${i + 1} / ${i + 2}`;
} else if (layout === 3) {
chip.style.gridColumn = `${i + 1} / ${i + 2}`;
chip.style.gridRow = '2 / 3';
} else {
chip.style.gridColumn = '1 / 2';
chip.style.gridRow = `${i + 1} / ${i + 2}`;
}
elements.push(chip);
});
// Type sample
const typeSample = document.createElement('div');
typeSample.className = 'board-element type-sample';
typeSample.style.background = theme.typeBg;
typeSample.innerHTML = `
<div class="sample-head" style="color: ${theme.typeColor}">${theme.typeHead}</div>
<div class="sample-body" style="color: ${theme.typeColor}; opacity: 0.7">${theme.typeBody}</div>
`;
if (layout === 1) {
typeSample.style.gridColumn = '1 / 2';
typeSample.style.gridRow = '4 / 5';
} else if (layout === 2) {
typeSample.style.gridColumn = '1 / 2';
typeSample.style.gridRow = '1 / 2';
} else if (layout === 3) {
typeSample.style.gridColumn = '1 / 2';
typeSample.style.gridRow = '2 / 3';
} else {
typeSample.style.gridColumn = '2 / 3';
typeSample.style.gridRow = '3 / 4';
}
elements.push(typeSample);
// Texture tile
const texture = document.createElement('div');
texture.className = `board-element texture-tile ${theme.texture}`;
if (layout === 1) {
texture.style.gridColumn = '2 / 3';
texture.style.gridRow = '4 / 5';
} else if (layout === 2) {
texture.style.gridColumn = '1 / 2';
texture.style.gridRow = '1 / 2';
} else if (layout === 3) {
texture.style.gridColumn = '2 / 4';
texture.style.gridRow = '2 / 3';
} else {
texture.style.gridColumn = '1 / 2';
texture.style.gridRow = '1 / 2';
}
elements.push(texture);
// Append all elements
elements.forEach(el => canvas.appendChild(el));
}
// Theme switching
themeBtns.forEach(btn => {
btn.addEventListener('click', () => {
themeBtns.forEach(b => {
b.classList.remove('active');
b.setAttribute('aria-selected', 'false');
});
btn.classList.add('active');
btn.setAttribute('aria-selected', 'true');
currentTheme = btn.dataset.theme;
renderBoard();
});
});
// Regenerate
regenerateBtn.addEventListener('click', () => {
// Add a brief transition effect
canvas.style.opacity = '0.5';
canvas.style.transform = 'scale(0.98)';
setTimeout(() => {
renderBoard();
canvas.style.opacity = '1';
canvas.style.transform = 'scale(1)';
}, 150);
});
// Initial render
renderBoard();
</script>
</body>
</html>