Z.ai GLM 5.3 – Style and Fashion

via Z.AI · Generated

  • AIMAC Debt 4.44
  • Cost $0.18
  • Total Violations 13
  • HTML Size 75 KB
  • Em Dashes 79

Screenshot

View Z.ai GLM 5.3 Style and Fashion page View Live Page

Accessibility Issues Found

13 Serious

  • color-contrast serious 13 instances

    Elements must meet minimum color contrast ratio thresholds

    Example HTML <span class="swatch-name">Shade One</span>

Artifacts

View Generated HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Maison Velour — Where Silhouette Meets Story</title>
<meta name="description" content="Maison Velour is a curated fashion destination: trend reports, designer spotlights, wardrobe essentials, and a professional styling studio.">
<link rel="icon" href="https://placehold.co/32x32/1B1712/A34A2A?text=MV&font=playfair+display">
<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=Playfair+Display:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400;1,500;1,600&family=Jost:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400&display=swap" rel="stylesheet">
<style>
/* ============ RESET & TOKENS ============ */
*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
:root{
  --cream:#F4EFE6;
  --paper:#FBF8F1;
  --cream-2:#ECE4D4;
  --ink:#1B1712;
  --ink-soft:#5C5347;
  --accent:#A34A2A;
  --accent-deep:#7E3517;
  --accent-soft:#C97B4F;
  --line:rgba(27,23,18,.15);
  --line-light:rgba(244,239,230,.18);
  --serif:'Playfair Display',Georgia,serif;
  --sans:'Jost','Century Gothic',sans-serif;
}
html{scroll-behavior:smooth;scroll-padding-top:112px}
body{font-family:var(--sans);background:var(--cream);color:var(--ink);font-size:16.5px;line-height:1.75;-webkit-font-smoothing:antialiased}
img{display:block;max-width:100%}
a{color:inherit}
button{font-family:inherit;cursor:pointer}
.container{width:min(1180px,92%);margin:0 auto}
::selection{background:var(--accent);color:#fff}

/* ============ REVEAL ============ */
.reveal{opacity:0;transform:translateY(26px);transition:opacity .8s cubic-bezier(.22,.61,.36,1),transform .8s cubic-bezier(.22,.61,.36,1);transition-delay:var(--d,0s)}
.reveal.in{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){
  .reveal{opacity:1;transform:none;transition:none}
  .ticker-track{animation:none}
}

/* ============ ANNOUNCEMENT BAR ============ */
.annbar{background:var(--ink);color:var(--cream);text-align:center;padding:10px 16px;border-bottom:1px solid var(--line-light)}
.annbar p{font-size:11px;letter-spacing:.2em;text-transform:uppercase;font-weight:500}
.annbar em{font-style:normal;color:var(--accent-soft)}

/* ============ HEADER ============ */
.site-header{position:sticky;top:0;z-index:60;background:rgba(244,239,230,.93);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border-bottom:1px solid var(--line);transition:box-shadow .3s,padding .3s}
.site-header.scrolled{box-shadow:0 10px 30px -18px rgba(27,23,18,.4)}
.header-inner{display:flex;align-items:center;justify-content:space-between;gap:24px;padding:16px 0;transition:padding .3s}
.site-header.scrolled .header-inner{padding:10px 0}
.brand{display:flex;align-items:center;gap:14px;text-decoration:none}
.brand-logo{width:50px;height:50px;border:1px solid var(--line)}
.brand-name{font-family:var(--serif);font-weight:700;font-size:22px;letter-spacing:.04em;line-height:1}
.brand-tag{display:block;font-size:9.5px;letter-spacing:.32em;text-transform:uppercase;color:var(--ink-soft);margin-top:5px;font-weight:500}
.primary-nav{display:flex;align-items:center;gap:28px}
.nav-link{position:relative;font-size:11.5px;font-weight:600;letter-spacing:.17em;text-transform:uppercase;text-decoration:none;padding:6px 0;transition:color .25s}
.nav-link::after{content:"";position:absolute;left:0;bottom:0;height:1px;width:0;background:var(--accent);transition:width .3s}
.nav-link:hover{color:var(--accent)}
.nav-link:hover::after{width:100%}
.header-right{display:flex;align-items:center;gap:16px}
.menu-btn{display:none;background:none;border:1px solid var(--line);padding:10px 12px;line-height:0}
.menu-btn svg{stroke:var(--ink)}

/* ============ BUTTONS ============ */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:10px;font-size:12px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;padding:17px 30px;border:1px solid var(--ink);background:var(--ink);color:var(--cream);text-decoration:none;transition:all .25s ease}
.btn:hover{background:var(--accent);border-color:var(--accent);color:#fff;transform:translateY(-2px)}
.btn.ghost{background:transparent;color:var(--ink)}
.btn.ghost:hover{background:var(--ink);color:var(--cream);border-color:var(--ink)}
.btn.light{background:var(--cream);border-color:var(--cream);color:var(--ink)}
.btn.light:hover{background:var(--accent);border-color:var(--accent);color:#fff}
.btn.ghost-light{background:transparent;border-color:rgba(244,239,230,.45);color:var(--cream)}
.btn.ghost-light:hover{background:var(--cream);border-color:var(--cream);color:var(--ink)}
.btn.sm{padding:13px 24px}
.text-link{font-size:12px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;text-decoration:none;color:var(--ink);border-bottom:1px solid var(--accent);padding-bottom:3px;transition:color .25s}
.text-link:hover{color:var(--accent)}

/* ============ HERO ============ */
.hero{padding:clamp(56px,8vw,100px) 0 clamp(60px,7vw,96px)}
.hero-grid{display:grid;grid-template-columns:1.04fr .96fr;gap:clamp(36px,5vw,72px);align-items:center}
.hero-eyebrow{display:flex;align-items:center;gap:14px;font-size:11px;font-weight:600;letter-spacing:.26em;text-transform:uppercase;color:var(--accent);margin-bottom:26px}
.hero-eyebrow::before{content:"";width:36px;height:1px;background:var(--accent)}
.hero-title{font-family:var(--serif);font-weight:600;font-size:clamp(42px,6.2vw,72px);line-height:1.06;letter-spacing:-.015em;margin-bottom:28px}
.hero-title em{font-style:italic;color:var(--accent);font-weight:500}
.hero-lede{font-size:17.5px;color:var(--ink-soft);max-width:52ch;margin-bottom:36px}
.hero-actions{display:flex;flex-wrap:wrap;gap:16px;margin-bottom:48px}
.hero-stats{display:flex;flex-wrap:wrap}
.stat{padding:6px 34px 6px 0;margin-right:34px;border-right:1px solid var(--line)}
.stat:last-child{border-right:none;margin-right:0;padding-right:0}
.stat-num{font-family:var(--serif);font-size:32px;font-weight:700;line-height:1.1}
.stat-label{font-size:10.5px;letter-spacing:.2em;text-transform:uppercase;color:var(--ink-soft);font-weight:500;margin-top:4px}
.hero-visual{position:relative}
.hero-img-main{width:100%;aspect-ratio:4/5;object-fit:cover}
.hero-img-2{position:absolute;left:-56px;bottom:-42px;width:38%;aspect-ratio:4/5;object-fit:cover;border:8px solid var(--cream);box-shadow:0 30px 50px -30px rgba(27,23,18,.5)}
.hero-badge{position:absolute;top:22px;right:-18px;background:var(--paper);border:1px solid var(--line);padding:14px 18px;max-width:210px;box-shadow:0 20px 40px -24px rgba(27,23,18,.45)}
.hero-badge strong{display:block;font-family:var(--serif);font-size:15px;font-weight:700;margin-bottom:3px}
.hero-badge span{font-size:10.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--accent);font-weight:600}
.hero-badge p{font-size:12.5px;color:var(--ink-soft);line-height:1.5;margin-top:6px}

/* ============ TICKER ============ */
.ticker{background:var(--ink);color:var(--cream);overflow:hidden;padding:15px 0}
.ticker-track{display:flex;width:max-content;animation:ticker 32s linear infinite}
.ticker:hover .ticker-track{animation-play-state:paused}
.ticker-group{display:flex;align-items:center}
.ticker-group span{font-size:11.5px;font-weight:500;letter-spacing:.24em;text-transform:uppercase;white-space:nowrap;padding:0 14px}
.ticker-group i{font-style:normal;color:var(--accent-soft);font-size:12px}
@keyframes ticker{to{transform:translateX(-50%)}}

/* ============ SECTIONS ============ */
.section{padding:clamp(66px,9vw,112px) 0}
.section.alt{background:var(--cream-2)}
.section.dark{background:var(--ink);color:var(--cream)}
.eyebrow{display:flex;align-items:center;gap:14px;font-size:11px;font-weight:600;letter-spacing:.26em;text-transform:uppercase;color:var(--accent);margin-bottom:20px}
.section.dark .eyebrow{color:var(--accent-soft)}
.eyebrow::before{content:"";width:36px;height:1px;background:currentColor}
.section-title{font-family:var(--serif);font-weight:600;font-size:clamp(30px,4.2vw,46px);line-height:1.12;letter-spacing:-.01em}
.section-title em{font-style:italic;font-weight:500}
.section-intro{color:var(--ink-soft);max-width:56ch}
.section.dark .section-intro{color:rgba(244,239,230,.72)}
.section-head{margin-bottom:clamp(36px,5vw,58px)}
.section-head.split{display:grid;grid-template-columns:1.1fr .9fr;gap:clamp(24px,4vw,64px);align-items:end}
.section-head.center{text-align:center;max-width:640px;margin-left:auto;margin-right:auto}
.section-head.center .eyebrow{justify-content:center}
.section-head.center .section-intro{margin:16px auto 0}

/* ============ TREND GRID ============ */
.trend-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:22px}
.trend-card{background:var(--paper);border:1px solid var(--line);display:flex;flex-direction:column;transition:transform .35s,box-shadow .35s}
.trend-card:hover{transform:translateY(-7px);box-shadow:0 28px 46px -28px rgba(27,23,18,.4)}
.trend-media{overflow:hidden;aspect-ratio:4/5}
.trend-media img{width:100%;height:100%;object-fit:cover;transition:transform .7s ease}
.trend-card:hover .trend-media img{transform:scale(1.06)}
.trend-body{padding:24px 24px 26px;display:flex;flex-direction:column;flex:1}
.trend-tag{font-size:10px;font-weight:600;letter-spacing:.24em;text-transform:uppercase;color:var(--accent);margin-bottom:12px}
.trend-title{font-family:var(--serif);font-size:22px;font-weight:700;line-height:1.25;margin-bottom:12px}
.trend-desc{font-size:14.5px;color:var(--ink-soft);line-height:1.7;margin-bottom:18px;flex:1}
.center-cta{text-align:center;margin-top:44px}

/* ============ DESIGNER SPOTLIGHT ============ */
.spot-grid{display:grid;grid-template-columns:.92fr 1.08fr;gap:clamp(36px,5vw,76px);align-items:center}
.spot-visual{position:relative}
.spot-visual .main-img{width:100%;aspect-ratio:4/5;object-fit:cover}
.spot-visual .detail-img{position:absolute;right:-34px;bottom:-38px;width:44%;aspect-ratio:3/2;object-fit:cover;border:7px solid var(--ink);box-shadow:0 30px 50px -26px rgba(0,0,0,.7)}
.spot-caption{position:absolute;top:18px;left:18px;background:rgba(27,23,18,.82);color:var(--cream);padding:10px 16px;font-size:10px;letter-spacing:.22em;text-transform:uppercase;font-weight:500}
.spot-meta{font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--accent-soft);font-weight:600;margin-bottom:18px}
.spot-copy .section-title{margin-bottom:24px}
.spot-copy p{color:rgba(244,239,230,.75);margin-bottom:20px}
.pullquote{border-left:2px solid var(--accent);padding:8px 0 8px 26px;margin:30px 0;font-family:var(--serif);font-style:italic;font-size:22px;line-height:1.5;color:var(--cream)}
.spot-stats{display:flex;flex-wrap:wrap;gap:0;margin:28px 0 34px;border-top:1px solid var(--line-light);border-bottom:1px solid var(--line-light)}
.spot-stats span{padding:16px 26px 16px 0;margin-right:26px;border-right:1px solid var(--line-light);font-size:12px;letter-spacing:.14em;text-transform:uppercase;font-weight:500}
.spot-stats span:last-child{border-right:none}
.spot-stats strong{display:block;font-family:var(--serif);font-size:26px;font-weight:700;letter-spacing:0;text-transform:none;margin-bottom:2px;color:var(--cream)}
.spot-actions{display:flex;flex-wrap:wrap;gap:14px}

/* ============ ESSENTIALS / CAPSULE ============ */
.capsule-progress{background:var(--paper);border:1px solid var(--line);padding:22px 26px;margin-bottom:40px;display:flex;align-items:center;gap:26px;flex-wrap:wrap}
.capsule-progress .label{font-size:11px;font-weight:600;letter-spacing:.22em;text-transform:uppercase;white-space:nowrap}
.capsule-count{font-family:var(--serif);font-size:24px;font-weight:700;color:var(--accent)}
.progress-track{flex:1;min-width:180px;height:4px;background:var(--line);overflow:hidden}
.progress-fill{height:100%;width:0%;background:var(--accent);transition:width .45s ease}
.essentials-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}
.essential-card{background:var(--paper);border:1px solid var(--line);overflow:hidden;transition:transform .3s,box-shadow .3s}
.essential-card:hover{transform:translateY(-6px);box-shadow:0 26px 44px -28px rgba(27,23,18,.38)}
.essential-media{aspect-ratio:5/4;overflow:hidden}
.essential-media img{width:100%;height:100%;object-fit:cover;transition:transform .7s}
.essential-card:hover .essential-media img{transform:scale(1.05)}
.essential-body{padding:24px}
.essential-num{font-size:10.5px;letter-spacing:.24em;color:var(--accent);font-weight:600;text-transform:uppercase}
.essential-name{font-family:var(--serif);font-size:21px;font-weight:700;margin:8px 0 10px}
.essential-desc{font-size:14px;color:var(--ink-soft);line-height:1.65;margin-bottom:18px}
.essential-add{display:inline-flex;align-items:center;gap:9px;background:transparent;border:1px solid var(--ink);color:var(--ink);font-size:11px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;padding:11px 18px;transition:all .25s}
.essential-add svg{width:13px;height:13px;stroke:currentColor;stroke-width:2.4;fill:none;opacity:0;transition:opacity .25s}
.essential-add:hover{border-color:var(--accent);color:var(--accent)}
.essential-add.added{background:var(--accent);border-color:var(--accent);color:#fff}
.essential-add.added svg{opacity:1}
.capsule-done{display:none;align-items:center;gap:18px;background:var(--ink);color:var(--cream);border:1px solid var(--ink);padding:24px 28px;margin-top:36px}
.capsule-done.show{display:flex;animation:fadeUp .6s ease}
.capsule-done .cd-icon{flex-shrink:0;width:44px;height:44px;border:1px solid var(--accent-soft);border-radius:50%;display:flex;align-items:center;justify-content:center}
.capsule-done .cd-icon svg{stroke:var(--accent-soft);stroke-width:2.4;fill:none;width:20px;height:20px}
.capsule-done p{font-size:15px;line-height:1.6;color:rgba(244,239,230,.85)}
.capsule-done a{color:var(--accent-soft);font-weight:600;text-decoration:none;border-bottom:1px solid var(--accent-soft)}
@keyframes fadeUp{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}

/* ============ COLOUR STUDIO ============ */
.palette-wrap{display:grid;grid-template-columns:.9fr 1.1fr;gap:clamp(36px,5vw,70px);align-items:start}
.palette-controls .control-group{margin-bottom:26px}
.control-label{font-size:11px;font-weight:600;letter-spacing:.22em;text-transform:uppercase;margin-bottom:12px;display:flex;justify-content:space-between;gap:12px}
.control-label small{color:var(--ink-soft);font-weight:500;letter-spacing:.06em;text-transform:none;font-size:11.5px}
.seg{display:flex;flex-wrap:wrap;gap:10px}
.seg button{background:var(--paper);border:1px solid var(--line);padding:12px 22px;font-size:12px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-soft);transition:all .22s}
.seg button:hover{border-color:var(--ink);color:var(--ink)}
.seg button.active{background:var(--ink);border-color:var(--ink);color:var(--cream)}
.palette-hint{font-size:12.5px;color:var(--ink-soft);line-height:1.6;border-left:2px solid var(--accent);padding-left:16px;margin:26px 0}
.palette-generate{width:100%}
.palette-result{background:var(--ink);color:var(--cream);padding:clamp(28px,3.4vw,44px)}
.palette-result-head{display:flex;justify-content:space-between;align-items:baseline;gap:16px;flex-wrap:wrap;border-bottom:1px solid var(--line-light);padding-bottom:18px;margin-bottom:24px}
.palette-result-head h3{font-family:var(--serif);font-size:22px;font-weight:700}
.palette-result-head span{font-size:10.5px;letter-spacing:.22em;text-transform:uppercase;color:var(--accent-soft);font-weight:600}
.swatch-row{display:grid;grid-template-columns:repeat(6,1fr);gap:12px;margin-bottom:26px}
.swatch{background:none;border:none;text-align:left;padding:0;opacity:0;animation:swatchIn .55s cubic-bezier(.22,.61,.36,1) forwards;animation-delay:var(--d)}
.swatch-color{display:block;height:96px;background:var(--c);border:1px solid rgba(244,239,230,.2);transition:transform .25s}
.swatch:hover .swatch-color{transform:translateY(-5px)}
.swatch-name{display:block;font-family:var(--serif);font-size:13.5px;font-weight:600;margin-top:10px;color:var(--cream)}
.swatch-hex{display:block;font-size:10.5px;letter-spacing:.1em;color:rgba(244,239,230,.55);margin-top:2px}
.swatch.ph .swatch-color{background:repeating-linear-gradient(45deg,transparent,transparent 7px,rgba(244,239,230,.06) 7px,rgba(244,239,230,.06) 14px);border:1px dashed rgba(244,239,230,.35);animation:none;opacity:1}
.swatch.ph .swatch-name{color:rgba(244,239,230,.35)}
.swatch.ph .swatch-hex{color:rgba(244,239,230,.25)}
@keyframes swatchIn{from{opacity:0;transform:translateY(16px) scale(.93)}to{opacity:1;transform:none}}
.palette-notes p{font-size:14.5px;line-height:1.7;color:rgba(244,239,230,.78);margin-bottom:14px}
.palette-notes strong{color:var(--cream)}
.palette-notes .copy-hint{font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--accent-soft);font-weight:600;margin-top:20px;margin-bottom:0}

/* ============ STYLING STUDIO ============ */
.studio-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px;align-items:stretch}
.price-card{background:var(--paper);border:1px solid var(--line);padding:36px 32px;display:flex;flex-direction:column;position:relative;transition:transform .3s,box-shadow .3s}
.price-card:hover{transform:translateY(-6px);box-shadow:0 28px 46px -30px rgba(27,23,18,.4)}
.price-card.featured{background:var(--ink);color:var(--cream);border-color:var(--ink)}
.badge-pop{position:absolute;top:-13px;left:32px;background:var(--accent);color:#fff;font-size:10px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;padding:7px 14px}
.price-name{font-family:var(--serif);font-size:23px;font-weight:700;margin-bottom:6px}
.price-amount{font-size:13px;letter-spacing:.16em;text-transform:uppercase;font-weight:600;color:var(--accent);margin-bottom:18px}
.price-card.featured .price-amount{color:var(--accent-soft)}
.price-desc{font-size:14.5px;line-height:1.7;color:var(--ink-soft);margin-bottom:24px;padding-bottom:24px;border-bottom:1px solid var(--line)}
.price-card.featured .price-desc{color:rgba(244,239,230,.75);border-color:var(--line-light)}
.price-features{list-style:none;flex:1;margin-bottom:28px}
.price-features li{display:flex;gap:12px;align-items:baseline;font-size:14px;line-height:1.6;padding:7px 0;color:var(--ink-soft)}
.price-card.featured .price-features li{color:rgba(244,239,230,.8)}
.price-features li::before{content:"✦";color:var(--accent);font-size:11px;flex-shrink:0}
.price-card.featured .price-features li::before{color:var(--accent-soft)}
.studio-note{text-align:center;margin-top:36px;font-size:13.5px;color:var(--ink-soft)}
.studio-note em{font-style:normal;color:var(--accent);font-weight:600}

/* ============ MAGAZINE ============ */
.mag-grid{display:grid;grid-template-columns:1fr 340px;gap:clamp(36px,4.5vw,60px);align-items:start}
.article-main article{background:var(--paper);border:1px solid var(--line)}
.article-media{aspect-ratio:16/10;overflow:hidden}
.article-media img{width:100%;height:100%;object-fit:cover}
.article-body{padding:clamp(26px,3vw,40px)}
.article-top{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;margin-bottom:16px}
.article-tag{font-size:10px;font-weight:600;letter-spacing:.24em;text-transform:uppercase;color:#fff;background:var(--accent);padding:6px 12px}
.article-meta{font-size:12px;letter-spacing:.1em;color:var(--ink-soft)}
.article-title{font-family:var(--serif);font-size:clamp(26px,3vw,34px);font-weight:700;line-height:1.18;margin-bottom:20px}
.article-text p{font-size:15.5px;line-height:1.8;color:var(--ink-soft);margin-bottom:18px}
.article-cta{margin-top:8px}
.article-minis{display:grid;grid-template-columns:1fr 1fr;gap:22px;margin-top:24px}
.mini-card{background:var(--paper);border:1px solid var(--line);padding:26px;transition:transform .3s,box-shadow .3s}
.mini-card:hover{transform:translateY(-5px);box-shadow:0 24px 40px -26px rgba(27,23,18,.38)}
.mini-tag{font-size:10px;font-weight:600;letter-spacing:.24em;text-transform:uppercase;color:var(--accent);margin-bottom:10px;display:block}
.mini-title{font-family:var(--serif);font-size:19px;font-weight:700;line-height:1.3;margin-bottom:10px}
.mini-desc{font-size:13.5px;color:var(--ink-soft);line-height:1.65;margin-bottom:16px}
.sidebar{display:flex;flex-direction:column;gap:30px;position:sticky;top:130px}
.side-block{background:var(--paper);border:1px solid var(--line);padding:28px}
.side-title{font-size:12px;font-weight:700;letter-spacing:.24em;text-transform:uppercase;padding-bottom:14px;border-bottom:1px solid var(--line);margin-bottom:6px;display:flex;justify-content:space-between;align-items:center}
.side-title a{font-size:10px;color:var(--accent);text-decoration:none;letter-spacing:.14em}
.pick-item{display:flex;gap:16px;align-items:center;padding:16px 0;border-bottom:1px solid var(--line)}
.pick-item:last-child{border-bottom:none;padding-bottom:4px}
.pick-thumb{width:72px;height:88px;object-fit:cover;flex-shrink:0}
.pick-info h4{font-family:var(--serif);font-size:16px;font-weight:700;line-height:1.3;margin-bottom:5px}
.pick-info span{font-size:10.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--accent);font-weight:600}
.product-item{display:flex;gap:16px;align-items:center;padding:14px 0;border-bottom:1px solid var(--line)}
.product-item:last-of-type{border-bottom:none}
.product-thumb{width:64px;height:76px;object-fit:cover;flex-shrink:0}
.product-info{flex:1}
.product-info h4{font-family:var(--serif);font-size:15.5px;font-weight:700;margin-bottom:4px}
.product-price{font-size:12.5px;letter-spacing:.08em;color:var(--ink-soft)}
.product-info a{font-size:10.5px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);text-decoration:none;border-bottom:1px solid var(--accent)}
.side-note{font-size:11.5px;color:var(--ink-soft);letter-spacing:.06em;margin-top:14px;line-height:1.55}
.side-block .btn{width:100%;margin-top:18px}

/* ============ TESTIMONIALS ============ */
.testi-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}
.testi-card{background:var(--paper);border:1px solid var(--line);padding:34px 30px;display:flex;flex-direction:column;transition:transform .3s,box-shadow .3s}
.testi-card:hover{transform:translateY(-6px);box-shadow:0 26px 44px -28px rgba(27,23,18,.35)}
.stars{color:var(--accent);letter-spacing:5px;font-size:15px;margin-bottom:18px}
.testi-quote{font-family:var(--serif);font-style:italic;font-size:18px;line-height:1.65;margin-bottom:26px;flex:1}
.testi-person{display:flex;align-items:center;gap:14px;border-top:1px solid var(--line);padding-top:22px}
.testi-person img{width:52px;height:52px;border-radius:50%;object-fit:cover}
.testi-name{font-size:14px;font-weight:600;letter-spacing:.04em}
.testi-role{font-size:11.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-soft)}

/* ============ FAQ ============ */
.faq-wrap{max-width:780px;margin:0 auto}
.faq-item{border-bottom:1px solid var(--line)}
.faq-item:first-child{border-top:1px solid var(--line)}
.faq-q{width:100%;display:flex;justify-content:space-between;align-items:center;gap:20px;background:none;border:none;text-align:left;padding:24px 4px;font-family:var(--serif);font-size:19px;font-weight:700;color:var(--ink);transition:color .25s}
.faq-q:hover{color:var(--accent)}
.faq-icon{flex-shrink:0;width:30px;height:30px;border:1px solid var(--line);border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .3s}
.faq-icon::before{content:"+";font-family:var(--sans);font-size:17px;font-weight:400;line-height:1}
.faq-item.open .faq-icon{background:var(--accent);border-color:var(--accent);color:#fff;transform:rotate(45deg)}
.faq-a{max-height:0;overflow:hidden;transition:max-height .4s ease}
.faq-a p{padding:0 44px 26px 4px;font-size:15px;line-height:1.75;color:var(--ink-soft)}

/* ============ NEWSLETTER ============ */
.newsletter{background:var(--accent);color:#fff;padding:clamp(60px,8vw,96px) 0}
.nl-inner{max-width:620px;margin:0 auto;text-align:center}
.nl-eyebrow{font-size:11px;font-weight:600;letter-spacing:.28em;text-transform:uppercase;margin-bottom:18px;color:rgba(255,255,255,.75)}
.newsletter h2{font-family:var(--serif);font-size:clamp(30px,4vw,44px);font-weight:600;line-height:1.12;margin-bottom:18px}
.newsletter h2 em{font-style:italic;font-weight:500}
.newsletter p{font-size:16px;line-height:1.7;color:rgba(255,255,255,.88);margin-bottom:32px}
.nl-form{display:flex;gap:0;max-width:520px;margin:0 auto}
.nl-form input{flex:1;min-width:0;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.5);border-right:none;padding:16px 20px;font-family:var(--sans);font-size:14px;color:#fff;outline:none;transition:border .25s}
.nl-form input::placeholder{color:rgba(255,255,255,.6)}
.nl-form input:focus{border-color:#fff}
.nl-form .btn{background:#fff;color:var(--ink);border-color:#fff}
.nl-form .btn:hover{background:var(--ink);border-color:var(--ink);color:#fff}
.nl-small{font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;color:rgba(255,255,255,.65);margin-top:18px}
.nl-success{display:none;background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.5);padding:20px 26px;font-family:var(--serif);font-style:italic;font-size:18px}
.nl-success.show{display:block;animation:fadeUp .5s ease}

/* ============ FOOTER ============ */
.site-footer{background:var(--ink);color:var(--cream);padding:clamp(60px,7vw,90px) 0 0;border-top:4px solid var(--accent)}
.footer-grid{display:grid;grid-template-columns:1.6fr 1fr 1fr 1.25fr;gap:clamp(30px,4vw,56px);padding-bottom:56px}
.footer-brand .brand-name{font-size:26px}
.footer-brand p{font-size:14.5px;line-height:1.75;color:rgba(244,239,230,.65);margin:18px 0 24px;max-width:34ch}
.footer-social{list-style:none;display:flex;flex-wrap:wrap;gap:10px 22px}
.footer-social a{font-size:11.5px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;text-decoration:none;color:rgba(244,239,230,.8);border-bottom:1px solid transparent;transition:all .25s;padding-bottom:2px}
.footer-social a:hover{color:var(--accent-soft);border-color:var(--accent-soft)}
.footer-col h4{font-size:11.5px;font-weight:700;letter-spacing:.24em;text-transform:uppercase;color:var(--accent-soft);margin-bottom:22px}
.footer-col ul{list-style:none}
.footer-col ul li{margin-bottom:12px}
.footer-col ul a{font-size:14.5px;color:rgba(244,239,230,.7);text-decoration:none;transition:color .25s}
.footer-col ul a:hover{color:var(--cream)}
.footer-contact li{display:flex;gap:12px;font-size:14.5px;color:rgba(244,239,230,.7);margin-bottom:14px;line-height:1.6}
.footer-contact i{font-style:normal;color:var(--accent-soft)}
.footer-bottom{border-top:1px solid var(--line-light);padding:26px 0;display:flex;justify-content:space-between;align-items:center;gap:18px;flex-wrap:wrap}
.footer-bottom p{font-size:12.5px;color:rgba(244,239,230,.5);letter-spacing:.04em}
.footer-legal{display:flex;gap:22px;flex-wrap:wrap}
.footer-legal a{font-size:12px;letter-spacing:.1em;text-transform:uppercase;color:rgba(244,239,230,.6);text-decoration:none;transition:color .25s}
.footer-legal a:hover{color:var(--accent-soft)}

/* ============ TOAST ============ */
.toast{position:fixed;bottom:28px;left:50%;transform:translate(-50%,20px);background:var(--ink);color:var(--cream);border:1px solid var(--accent);padding:15px 26px;font-size:13px;letter-spacing:.08em;opacity:0;pointer-events:none;transition:all .35s ease;z-index:100;max-width:90vw;text-align:center}
.toast.show{opacity:1;transform:translate(-50%,0)}

/* ============ RESPONSIVE ============ */
@media (max-width:1060px){
  .primary-nav{position:absolute;top:100%;left:0;right:0;background:var(--cream);border-bottom:1px solid var(--line);flex-direction:column;align-items:flex-start;gap:0;padding:10px 4vw 22px;display:none;box-shadow:0 24px 40px -30px rgba(27,23,18,.5)}
  .primary-nav.open{display:flex}
  .primary-nav .nav-link{padding:14px 0;font-size:13px;width:100%;border-bottom:1px solid var(--line)}
  .primary-nav .nav-link::after{display:none}
  .menu-btn{display:block}
  .header-cta{display:none}
  .hero-grid{grid-template-columns:1fr}
  .hero-visual{max-width:560px}
  .spot-grid{grid-template-columns:1fr}
  .spot-visual{max-width:520px}
  .mag-grid{grid-template-columns:1fr}
  .sidebar{position:static}
  .palette-wrap{grid-template-columns:1fr}
}
@media (max-width:900px){
  .trend-grid{grid-template-columns:1fr 1fr}
  .essentials-grid{grid-template-columns:1fr 1fr}
  .studio-grid{grid-template-columns:1fr}
  .price-card.featured{transform:none}
  .testi-grid{grid-template-columns:1fr}
  .section-head.split{grid-template-columns:1fr;align-items:start}
  .footer-grid{grid-template-columns:1fr 1fr}
}
@media (max-width:640px){
  .trend-grid{grid-template-columns:1fr}
  .essentials-grid{grid-template-columns:1fr}
  .article-minis{grid-template-columns:1fr}
  .swatch-row{grid-template-columns:repeat(3,1fr)}
  .hero-img-2{display:none}
  .hero-badge{right:12px;top:12px}
  .stat{padding-right:20px;margin-right:20px}
  .stat-num{font-size:26px}
  .nl-form{flex-direction:column;gap:12px}
  .nl-form input{border-right:1px solid rgba(255,255,255,.5);padding:16px 18px}
  .footer-grid{grid-template-columns:1fr}
  .spot-visual .detail-img{right:8px;bottom:-24px}
  .capsule-progress{gap:16px}
  .footer-bottom{justify-content:center;text-align:center}
}
</style>
</head>
<body id="top">

<!-- ANNOUNCEMENT BAR -->
<div class="annbar">
  <p>The Autumn/Winter '25 Edit has landed — <em>complimentary styling consultations</em> every Friday in October</p>
</div>

<!-- HEADER -->
<header class="site-header" id="siteHeader">
  <div class="container header-inner">
    <a class="brand" href="#top" aria-label="Maison Velour home">
      <img class="brand-logo" src="https://placehold.co/56x56/1B1712/F4EFE6?text=MV&font=playfair+display" alt="Maison Velour monogram logo">
      <span>
        <span class="brand-name">MAISON VELOUR</span>
        <span class="brand-tag">Where Silhouette Meets Story</span>
      </span>
    </a>
    <nav class="primary-nav" id="primaryNav" aria-label="Primary">
      <a class="nav-link" href="#collections">Collections</a>
      <a class="nav-link" href="#trends">Trends</a>
      <a class="nav-link" href="#essentials">Wardrobe</a>
      <a class="nav-link" href="#shop">Shop</a>
      <a class="nav-link" href="#magazine">Magazine</a>
      <a class="nav-link" href="#studio">Styling Studio</a>
    </nav>
    <div class="header-right">
      <a class="btn sm" href="#studio">Book a Stylist</a>
      <button class="menu-btn" id="menuBtn" aria-label="Toggle menu" aria-expanded="false" aria-controls="primaryNav">
        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round"><path d="M3 6h18M3 12h18M3 18h18"/></svg>
      </button>
    </div>
  </div>
</header>

<main>

<!-- HERO -->
<section class="hero">
  <div class="container hero-grid">
    <div class="hero-copy reveal">
      <div class="hero-eyebrow">The Style Edit — Autumn/Winter 2025</div>
      <h1 class="hero-title">Dress like the story <em>only you</em> can tell.</h1>
      <p class="hero-lede">Maison Velour is a curated destination for the modern wardrobe — part trend bureau, part styling studio, part archive of the silhouettes that shaped the season. From the haute couture runways of Paris to the quiet luxury of everyday dressing, we translate fashion into something you can actually wear.</p>
      <div class="hero-actions">
        <a class="btn" href="#trends">Explore Trends</a>
        <a class="btn ghost" href="#studio">Book a Stylist</a>
      </div>
      <div class="hero-stats">
        <div class="stat">
          <div class="stat-num">250K+</div>
          <div class="stat-label">Monthly Readers</div>
        </div>
        <div class="stat">
          <div class="stat-num">40+</div>
          <div class="stat-label">Ateliers Featured</div>
        </div>
        <div class="stat">
          <div class="stat-num">4.9/5</div>
          <div class="stat-label">Stylist Rating</div>
        </div>
      </div>
    </div>
    <div class="hero-visual reveal" style="--d:.15s">
      <img class="hero-img-main" src="https://picsum.photos/seed/velour-hero/760/920?grayscale" alt="Editorial fashion photograph, Autumn/Winter 2025">
      <img class="hero-img-2" src="https://picsum.photos/seed/velour-hero2/420/520?grayscale" alt="Detail shot of draped fabric">
      <div class="hero-badge">
        <span>Now Reading</span>
        <strong>Issue 14 — The Texture Issue</strong>
        <p>Nineteen collections, one thread: fabric you can feel from the front row.</p>
      </div>
    </div>
  </div>
</section>

<!-- TICKER -->
<div class="ticker" aria-hidden="true">
  <div class="ticker-track">
    <div class="ticker-group">
      <span>Issue 14 — The Texture Issue</span><i>✦</i>
      <span>Sculptural Shoulders</span><i>✦</i>
      <span>Butter Yellow</span><i>✦</i>
      <span>Sheer Layering</span><i>✦</i>
      <span>Tonal Dressing</span><i>✦</i>
      <span>Quiet Luxury 2.0</span><i>✦</i>
      <span>Free Styling Calls in October</span><i>✦</i>
      <span>The New Minimal</span><i>✦</i>
    </div>
    <div class="ticker-group">
      <span>Issue 14 — The Texture Issue</span><i>✦</i>
      <span>Sculptural Shoulders</span><i>✦</i>
      <span>Butter Yellow</span><i>✦</i>
      <span>Sheer Layering</span><i>✦</i>
      <span>Tonal Dressing</span><i>✦</i>
      <span>Quiet Luxury 2.0</span><i>✦</i>
      <span>Free Styling Calls in October</span><i>✦</i>
      <span>The New Minimal</span><i>✦</i>
    </div>
  </div>
</div>

<!-- 01 · TREND REPORT -->
<section class="section" id="trends">
  <div class="container">
    <div class="section-head split reveal">
      <div>
        <div class="eyebrow">01 · The Trend Report</div>
        <h2 class="section-title">Four movements<br>defining the <em>season</em></h2>
      </div>
      <p class="section-intro">Decoded by our editors, translated for your wardrobe. We track the runways of Paris, Milan, and Copenhagen — and the streets between the shows — so you can skip the noise and wear what actually lasts beyond the season it was shown in.</p>
    </div>
    <div class="trend-grid">
      <article class="trend-card reveal">
        <div class="trend-media"><img src="https://picsum.photos/seed/trend-quiet/600/760?grayscale" alt="Quiet luxury tailoring editorial"></div>
        <div class="trend-body">
          <div class="trend-tag">Movement 01 · The Runway</div>
          <h3 class="trend-title">Quiet Luxury 2.0</h3>
          <p class="trend-desc">Stealth wealth returns with a softer edge — unbranded cashmere, fluid tailoring, and tonal dressing that whispers instead of shouts. The new status symbol is fabric you can feel from across the room.</p>
          <a class="text-link" href="#magazine">Read the Trend</a>
        </div>
      </article>
      <article class="trend-card reveal" style="--d:.1s">
        <div class="trend-media"><img src="https://picsum.photos/seed/trend-sculpt/600/760?grayscale" alt="Sculptural shoulder silhouette"></div>
        <div class="trend-body">
          <div class="trend-tag">Movement 02 · The Silhouette</div>
          <h3 class="trend-title">Sculptural Shoulders</h3>
          <p class="trend-desc">Architecture is back in the silhouette. Exaggerated shoulder lines and sculpted sleeves borrow from eighties couture, but this season they're cut with restraint — volume on top, slim everything else.</p>
          <a class="text-link" href="#magazine">Read the Trend</a>
        </div>
      </article>
      <article class="trend-card reveal" style="--d:.2s">
        <div class="trend-media"><img src="https://picsum.photos/seed/trend-butter/600/760?grayscale" alt="Butter yellow knitwear editorial"></div>
        <div class="trend-body">
          <div class="trend-tag">Movement 03 · The Palette</div>
          <h3 class="trend-title">Butter Yellow</h3>
          <p class="trend-desc">The season's surprise hue is the gentlest yellow we've seen in years. Grounding cream tailoring or energising raw denim, it reads optimistic without the shock of neon — the rare trend that suits nearly everyone.</p>
          <a class="text-link" href="#palette">Read the Trend</a>
        </div>
      </article>
      <article class="trend-card reveal" style="--d:.3s">
        <div class="trend-media"><img src="https://picsum.photos/seed/trend-sheer/600/760?grayscale" alt="Sheer layering detail"></div>
        <div class="trend-body">
          <div class="trend-tag">Movement 04 · The Technique</div>
          <h3 class="trend-title">Sheer Layering</h3>
          <p class="trend-desc">Organza and tulle move from evening into daylight. The trick is contrast — a bias-cut slip beneath a crisp poplin shirt, transparency always balanced by structure somewhere else in the look.</p>
          <a class="text-link" href="#magazine">Read the Trend</a>
        </div>
      </article>
    </div>
    <div class="center-cta reveal">
      <a class="btn ghost" href="#magazine">Explore All Trends</a>
    </div>
  </div>
</section>

<!-- 02 · DESIGNER SPOTLIGHT -->
<section class="section dark" id="collections">
  <div class="container">
    <div class="spot-grid">
      <div class="spot-visual reveal">
        <img class="main-img" src="https://picsum.photos/seed/velour-ines/720/880?grayscale" alt="Designer Inès Marchetti in her atelier">
        <img class="detail-img" src="https://picsum.photos/seed/velour-ines2/420/280?grayscale" alt="Detail of hand-draped silk">
        <div class="spot-caption">Atelier · Le Marais, Paris</div>
      </div>
      <div class="spot-copy reveal" style="--d:.15s">
        <div class="eyebrow">02 · Designer Spotlight</div>
        <div class="spot-meta">Spotlight No. 07 — Photographed September 2025</div>
        <h2 class="section-title">Inès Marchetti is rewriting the rules of <em>drape</em></h2>
        <p>Inès Marchetti spent eleven years in the ateliers of Parisian haute couture before showing a single collection under her own name. Trained as a draper first and a designer second, she approaches fabric the way a sculptor approaches clay — pinning, releasing, and letting the material decide where the silhouette wants to go.</p>
        <p>Her debut collection, <em>Terra Fragile</em>, opened Paris Fashion Week's off-schedule to a standing ovation: nineteen looks of bias-cut silk, felted wool, and hand-pleated organza, each one exploring the same question — how little structure can a garment carry and still hold a silhouette?</p>
        <blockquote class="pullquote">"A silhouette should feel inevitable — as if the fabric always knew where it wanted to fall."</blockquote>
        <p>The answer lives in her signature suspended waist: a seam that floats two fingers below the natural waistline, elongating the torso and softening the hip. Buyers from three continents placed orders before the finale look had left the runway.</p>
        <div class="spot-stats">
          <span><strong>19</strong>Looks</span>
          <span><strong>3</strong>Ateliers</span>
          <span><strong>1</strong>Standing Ovation</span>
        </div>
        <div class="spot-actions">
          <button class="btn light" id="followBtn">Follow Designer</button>
          <a class="btn ghost-light" href="#shop">View the Collection</a>
        </div>
      </div>
    </div>
  </div>
</section>

<!-- 03 · WARDROBE ESSENTIALS -->
<section class="section" id="essentials">
  <div class="container">
    <div class="section-head split reveal">
      <div>
        <div class="eyebrow">03 · Wardrobe Essentials</div>
        <h2 class="section-title">The capsule <em>checklist</em></h2>
      </div>
      <p class="section-intro">Six pieces that carry ninety percent of your outfits. Add them to your capsule as you go — at your first session, one of our stylists will review your list, flag the weak links, and suggest what to buy next (and what never to buy again).</p>
    </div>
    <div class="capsule-progress reveal">
      <span class="label">Your Capsule</span>
      <span class="capsule-count" id="capsuleCount">0 / 6</span>
      <div class="progress-track"><div class="progress-fill" id="capsuleFill"></div></div>
    </div>
    <div class="essentials-grid">
      <article class="essential-card reveal">
        <div class="essential-media"><img src="https://picsum.photos/seed/ess-shirt/500/400?grayscale" alt="Crisp white poplin shirt"></div>
        <div class="essential-body">
          <span class="essential-num">Piece 01</span>
          <h3 class="essential-name">The Crisp White Shirt</h3>
          <p class="essential-desc">Poplin or oxford, with a collar that stands on its own. The hardest-working piece in any wardrobe — under knitwear, over slip dresses, buttoned to the throat or worn open over a vest.</p>
          <button class="essential-add"><svg viewBox="0 0 24 24"><path d="M4 12.5l5 5L20 6.5"/></svg><span>Add to Capsule</span></button>
        </div>
      </article>
      <article class="essential-card reveal" style="--d:.08s">
        <div class="essential-media"><img src="https://picsum.photos/seed/ess-trench/500/400?grayscale" alt="Cotton gabardine trench coat"></div>
        <div class="essential-body">
          <span class="essential-num">Piece 02</span>
          <h3 class="essential-name">The Trench Coat</h3>
          <p class="essential-desc">Cotton gabardine, horn buttons, and a belt you'll actually tie. It carries spring showers, autumn evenings, and everything in between — the only outerwear that improves with age.</p>
          <button class="essential-add"><svg viewBox="0 0 24 24"><path d="M4 12.5l5 5L20 6.5"/></svg><span>Add to Capsule</span></button>
        </div>
      </article>
      <article class="essential-card reveal" style="--d:.16s">
        <div class="essential-media"><img src="https://picsum.photos/seed/ess-trouser/500/400?grayscale" alt="Tailored wool trousers"></div>
        <div class="essential-body">
          <span class="essential-num">Piece 03</span>
          <h3 class="essential-name">Tailored Wool Trousers</h3>
          <p class="essential-desc">A straight leg with a single pleat, cut high enough to respect the waist and hemmed to skim the shoe — never longer. In charcoal or camel, they anchor every silhouette you own.</p>
          <button class="essential-add"><svg viewBox="0 0 24 24"><path d="M4 12.5l5 5L20 6.5"/></svg><span>Add to Capsule</span></button>
        </div>
      </article>
      <article class="essential-card reveal">
        <div class="essential-media"><img src="https://picsum.photos/seed/ess-lbd/500/400?grayscale" alt="Little black dress"></div>
        <div class="essential-body">
          <span class="essential-num">Piece 04</span>
          <h3 class="essential-name">The Little Black Dress</h3>
          <p class="essential-desc">Bias-cut or structured, knee-length or midi — the one that makes getting dressed effortless. Choose the fabric over the trend: a good crepe survives a decade of dinner invitations.</p>
          <button class="essential-add"><svg viewBox="0 0 24 24"><path d="M4 12.5l5 5L20 6.5"/></svg><span>Add to Capsule</span></button>
        </div>
      </article>
      <article class="essential-card reveal" style="--d:.08s">
        <div class="essential-media"><img src="https://picsum.photos/seed/ess-loafer/500/400?grayscale" alt="Polished leather loafers"></div>
        <div class="essential-body">
          <span class="essential-num">Piece 05</span>
          <h3 class="essential-name">Leather Loafers</h3>
          <p class="essential-desc">Polished grain leather, a low heel, and a construction that can be resoled. Buy once, wear for a decade — the quiet definition of luxury as longevity rather than label.</p>
          <button class="essential-add"><svg viewBox="0 0 24 24"><path d="M4 12.5l5 5L20 6.5"/></svg><span>Add to Capsule</span></button>
        </div>
      </article>
      <article class="essential-card reveal" style="--d:.16s">
        <div class="essential-media"><img src="https://picsum.photos/seed/ess-cashmere/500/400?grayscale" alt="Cashmere crewneck jumper"></div>
        <div class="essential-body">
          <span class="essential-num">Piece 06</span>
          <h3 class="essential-name">Cashmere Crewneck</h3>
          <p class="essential-desc">Two-ply, mid-weight, in a colour you'd happily wear weekly. It layers under tailoring in November and stands alone in April — the hardest working knit in the capsule.</p>
          <button class="essential-add"><svg viewBox="0 0 24 24"><path d="M4 12.5l5 5L20 6.5"/></svg><span>Add to Capsule</span></button>
        </div>
      </article>
    </div>
    <div class="capsule-done" id="capsuleDone">
      <div class="cd-icon"><svg viewBox="0 0 24 24"><path d="M4 12.5l5 5L20 6.5"/></svg></div>
      <p><strong>Capsule complete.</strong> Six pieces, infinite outfits — a stylist can fill the final gaps. Your first consultation is on us this October. <a href="#studio">Book a Stylist →</a></p>
    </div>
  </div>
</section>

<!-- 04 · COLOUR STUDIO -->
<section class="section alt" id="palette">
  <div class="container">
    <div class="section-head center reveal">
      <div class="eyebrow">04 · The Colour Studio</div>
      <h2 class="section-title">Find your <em>palette</em></h2>
      <p class="section-intro">Great dressing starts with colour that flatters. Tell us your undertone, depth, and mood — our colour engine composes a six-shade palette, from your lightest neutral to your boldest accent, with notes on how to wear it.</p>
    </div>
    <div class="palette-wrap">
      <div class="palette-controls reveal">
        <div class="control-group">
          <div class="control-label"><span>Your Undertone</span><small>The vein test helps</small></div>
          <div class="seg" data-key="undertone" role="group" aria-label="Undertone">
            <button type="button" data-value="warm" aria-pressed="false">Warm</button>
            <button type="button" data-value="cool" aria-pressed="false">Cool</button>
            <button type="button" data-value="neutral" aria-pressed="false">Neutral</button>
          </div>
        </div>
        <div class="control-group">
          <div class="control-label"><span>Your Depth</span><small>Hair, skin, eyes — overall</small></div>
          <div class="seg" data-key="depth" role="group" aria-label="Depth">
            <button type="button" data-value="light" aria-pressed="false">Light</button>
            <button type="button" data-value="medium" aria-pressed="false">Medium</button>
            <button type="button" data-value="deep" aria-pressed="false">Deep</button>
          </div>
        </div>
        <div class="control-group">
          <div class="control-label"><span>Your Mood</span><small>How loud should it be?</small></div>
          <div class="seg" data-key="mood" role="group" aria-label="Mood">
            <button type="button" data-value="soft" aria-pressed="false">Soft</button>
            <button type="button" data-value="classic" aria-pressed="false">Classic</button>
            <button type="button" data-value="bold" aria-pressed="false">Bold</button>
          </div>
        </div>
        <p class="palette-hint">Not sure of your undertone? Look at the veins on your wrist in daylight: greenish veins lean warm, bluish lean cool, and a mix of both usually means neutral.</p>
        <button class="btn palette-generate" id="generateBtn">Compose My Palette</button>
      </div>
      <div class="palette-result reveal" style="--d:.15s">
        <div class="palette-result-head">
          <h3 id="paletteHeading">Your Palette Awaits</h3>
          <span id="paletteProfile">Undertone · Depth · Mood</span>
        </div>
        <div class="swatch-row" id="swatchRow">
          <div class="swatch ph"><span class="swatch-color"></span><span class="swatch-name">Shade One</span><span class="swatch-hex">— — —</span></div>
          <div class="swatch ph"><span class="swatch-color"></span><span class="swatch-name">Shade Two</span><span class="swatch-hex">— — —</span></div>
          <div class="swatch ph"><span class="swatch-color"></span><span class="swatch-name">Shade Three</span><span class="swatch-hex">— — —</span></div>
          <div class="swatch ph"><span class="swatch-color"></span><span class="swatch-name">Shade Four</span><span class="swatch-hex">— — —</span></div>
          <div class="swatch ph"><span class="swatch-color"></span><span class="swatch-name">Shade Five</span><span class="swatch-hex">— — —</span></div>
          <div class="swatch ph"><span class="swatch-color"></span><span class="swatch-name">Shade Six</span><span class="swatch-hex">— — —</span></div>
        </div>
        <div class="palette-notes" id="paletteNotes">
          <p>Choose an option from each row, then compose your palette. Six shades — curated to your colouring — will appear here, each one copyable at a tap.</p>
        </div>
      </div>
    </div>
  </div>
</section>

<!-- 05 · STYLING STUDIO -->
<section class="section" id="studio">
  <div class="container">
    <div class="section-head center reveal">
      <div class="eyebrow">05 · The Styling Studio</div>
      <h2 class="section-title">Book a <em>stylist</em></h2>
      <p class="section-intro">Our stylists have dressed editors, founders, and everyone in between. Sessions are virtual unless noted, size-inclusive by default, and built around your life — not a trend calendar.</p>
    </div>
    <div class="studio-grid">
      <article class="price-card reveal">
        <h3 class="price-name">The Consultation</h3>
        <div class="price-amount">£95 · One Hour</div>
        <p class="price-desc">A focused 60-minute video session. We audit your wardrobe's greatest hits, map your fit priorities, and leave you with a shoppable three-look plan you can execute the same week.</p>
        <ul class="price-features">
          <li>Live wardrobe audit call</li>
          <li>Personal fit &amp; proportion guide</li>
          <li>Three curated looks</li>
          <li>Written notes within 48 hours</li>
        </ul>
        <a class="btn ghost" href="#studio-cta">Book Stylist</a>
      </article>
      <article class="price-card featured reveal" style="--d:.12s">
        <span class="badge-pop">Most Popular</span>
        <h3 class="price-name">The Capsule Refresh</h3>
        <div class="price-amount">£350 · Four Weeks</div>
        <p class="price-desc">One coherent wardrobe, built with you over a month. We edit what you own, fill the gaps with intention, and style twelve outfits from the final rail — so getting dressed stops being a negotiation.</p>
        <ul class="price-features">
          <li>Everything in The Consultation</li>
          <li>40-piece wardrobe edit</li>
          <li>Personal shopping list</li>
          <li>Twelve styled outfits</li>
          <li>Two progress check-in calls</li>
        </ul>
        <a class="btn light" href="#studio-cta">Book Stylist</a>
      </article>
      <article class="price-card reveal" style="--d:.24s">
        <h3 class="price-name">The Full Wardrobe Edit</h3>
        <div class="price-amount">£750 · One Day</div>
        <p class="price-desc">A day in your home, anywhere we travel. We rebuild your storage, photograph your archive piece by piece, and document every combination — you'll never again stand in front of a full wardrobe with nothing to wear.</p>
        <ul class="price-features">
          <li>In-home session, up to six hours</li>
          <li>Complete reorganisation</li>
          <li>Photographed lookbook of your wardrobe</li>
          <li>Seasonal top-up plan</li>
        </ul>
        <a class="btn ghost" href="#studio-cta">Book Stylist</a>
      </article>
    </div>
    <p class="studio-note reveal" id="studio-cta">Complimentary 15-minute discovery calls every Friday in October — mention <em>"Issue 14"</em> when booking.</p>
  </div>
</section>

<!-- 06 · MAGAZINE + SIDEBAR -->
<section class="section alt" id="magazine">
  <div class="container">
    <div class="section-head split reveal">
      <div>
        <div class="eyebrow">06 · The Magazine</div>
        <h2 class="section-title">Reads worth your <em>Metro stop</em></h2>
      </div>
      <p class="section-intro">Long-form style journalism with the noise removed: celebrity style autopsies, beauty intelligence, and street-style formulas — written by editors who would rather explain a silhouette than chase a scandal.</p>
    </div>
    <div class="mag-grid">
      <div class="article-main">
        <article class="reveal">
          <div class="article-media"><img src="https://picsum.photos/seed/mag-carpet/900/560?grayscale" alt="Red carpet look, understated satin column dress"></div>
          <div class="article-body">
            <div class="article-top">
              <span class="article-tag">Celebrity Style</span>
              <span class="article-meta">By Camille Duret · 8 min read</span>
            </div>
            <h2 class="article-title">The red carpet went quiet — and it's never looked better</h2>
            <div class="article-text">
              <p>Award season used to be a shouting match: the biggest logos, the loudest gemstones, the most metres of trained tulle a stylist could source in three weeks. This year, the loudest statement on the carpet was restraint. The dominant silhouette was the liquid satin column dress — cut on the bias, skimming rather than gripping — in shades of bone, oxblood, and deep sea green.</p>
              <p>The shift tracks with everything else in fashion right now. Custom pieces arrived with no visible branding whatsoever; stylists briefed us that their clients asked for "quiet" by name. Tonal ivory suiting replaced crystal-studded everything, and the single sculptural earring — one, never a pair — became the night's recurring punctuation mark. Even the beauty followed suit: skin first, hair pulled clean, makeup in a single deliberate gesture.</p>
              <p>The takeaway for the rest of us doesn't require a red carpet. One strong silhouette, one deliberate accessory, nothing competing for attention — that's a formula that works at a wedding, a boardroom, or a Tuesday. Restraint, it turns out, photographs beautifully from any angle.</p>
            </div>
            <div class="article-cta">
              <a class="text-link" href="#newsletter">Read the Story →</a>
            </div>
          </div>
        </article>
        <div class="article-minis">
          <article class="mini-card reveal">
            <span class="mini-tag">Beauty</span>
            <h3 class="mini-title">The five-minute face that survives fashion week</h3>
            <p class="mini-desc">Backstage beauty directors all agree: this season, skin is the statement. Their condensed routine — and the three products worth the counter space.</p>
            <a class="text-link" href="#newsletter">Read →</a>
          </article>
          <article class="mini-card reveal" style="--d:.12s">
            <span class="mini-tag">Street Style</span>
            <h3 class="mini-title">Copenhagen's layering formula, decoded</h3>
            <p class="mini-desc">Three layers, one colour family, zero bulk. How the Scandi capital dresses for four seasons in a single day — and how to copy it by Monday.</p>
            <a class="text-link" href="#newsletter">Read →</a>
          </article>
        </div>
      </div>
      <aside class="sidebar">
        <div class="side-block reveal">
          <h3 class="side-title">Editor's Picks <a href="#magazine">All →</a></h3>
          <div class="pick-item">
            <img class="pick-thumb" src="https://picsum.photos/seed/pick-midi/144/176?grayscale" alt="Midi skirt editorial">
            <div class="pick-info"><h4>The midi skirt returns — with a vengeance</h4><span>Trends</span></div>
          </div>
          <div class="pick-item">
            <img class="pick-thumb" src="https://picsum.photos/seed/pick-cash/144/176?grayscale" alt="Cashmere knit detail">
            <div class="pick-info"><h4>How to buy cashmere that lasts decades</h4><span>Guides</span></div>
          </div>
          <div class="pick-item">
            <img class="pick-thumb" src="https://picsum.photos/seed/pick-backstage/144/176?grayscale" alt="Backstage fashion week photograph">
            <div class="pick-info"><h4>Skin first, makeup second: the beauty edit</h4><span>Beauty</span></div>
          </div>
        </div>
        <div class="side-block reveal" style="--d:.12s" id="shop">
          <h3 class="side-title">New Arrivals</h3>
          <div class="product-item">
            <img class="product-thumb" src="https://picsum.photos/seed/prod-skirt/128/152?grayscale" alt="Pleated silk midi skirt">
            <div class="product-info"><h4>Pleated Silk Midi Skirt</h4><span class="product-price">£189</span><br><a href="#shop">Shop Piece</a></div>
          </div>
          <div class="product-item">
            <img class="product-thumb" src="https://picsum.photos/seed/prod-roll/128/152?grayscale" alt="Merino roll-neck">
            <div class="product-info"><h4>Merino Roll-Neck</h4><span class="product-price">£95</span><br><a href="#shop">Shop Piece</a></div>
          </div>
          <div class="product-item">
            <img class="product-thumb" src="https://picsum.photos/seed/prod-tote/128/152?grayscale" alt="Structured leather tote">
            <div class="product-info"><h4>Structured Leather Tote</h4><span class="product-price">£240</span><br><a href="#shop">Shop Piece</a></div>
          </div>
          <div class="product-item">
            <img class="product-thumb" src="https://picsum.photos/seed/prod-scarf/128/152?grayscale" alt="Ochre silk scarf">
            <div class="product-info"><h4>Ochre Silk Scarf</h4><span class="product-price">£65</span><br><a href="#shop">Shop Piece</a></div>
          </div>
          <p class="side-note">Curated by our editors · Ships worldwide</p>
          <button class="btn sm" id="shopBtn">Shop New Arrivals</button>
        </div>
      </aside>
    </div>
  </div>
</section>

<!-- 07 · TESTIMONIALS -->
<section class="section">
  <div class="container">
    <div class="section-head center reveal">
      <div class="eyebrow">07 · Kind Words</div>
      <h2 class="section-title">Styled by us, worn by <em>you</em></h2>
      <p class="section-intro">Twelve hundred sessions booked last year. A few of the people who now open their wardrobes without sighing.</p>
    </div>
    <div class="testi-grid">
      <article class="testi-card reveal">
        <div class="stars" aria-label="Rated 5 out of 5">★★★★★</div>
        <p class="testi-quote">"The capsule refresh paid for itself within a month. I open my wardrobe and everything works together — I'd honestly forgotten what that felt like."</p>
        <div class="testi-person">
          <img src="https://i.pravatar.cc/120?u=amara-osei" alt="Portrait of Amara Osei">
          <div>
            <div class="testi-name">Amara Osei</div>
            <div class="testi-role">Creative Director · London</div>
          </div>
        </div>
      </article>
      <article class="testi-card reveal" style="--d:.12s">
        <div class="stars" aria-label="Rated 5 out of 5">★★★★★</div>
        <p class="testi-quote">"Their trend reports are the only ones I read all the way through. Zero noise, real analysis of the silhouettes, and photography that actually respects the clothes."</p>
        <div class="testi-person">
          <img src="https://i.pravatar.cc/120?u=daniel-reyes" alt="Portrait of Daniel Reyes">
          <div>
            <div class="testi-name">Daniel Reyes</div>
            <div class="testi-role">Fashion Photographer · Madrid</div>
          </div>
        </div>
      </article>
      <article class="testi-card reveal" style="--d:.24s">
        <div class="stars" aria-label="Rated 5 out of 5">★★★★★</div>
        <p class="testi-quote">"I booked a consultation before my funding round and walked into that room feeling like the most composed person in it. Worth every krona — I've sent three friends since."</p>
        <div class="testi-person">
          <img src="https://i.pravatar.cc/120?u=sofia-lindqvist" alt="Portrait of Sofia Lindqvist">
          <div>
            <div class="testi-name">Sofia Lindqvist</div>
            <div class="testi-role">Founder · Stockholm</div>
          </div>
        </div>
      </article>
    </div>
  </div>
</section>

<!-- 08 · FAQ -->
<section class="section alt">
  <div class="container">
    <div class="section-head center reveal">
      <div class="eyebrow">08 · Questions</div>
      <h2 class="section-title">Before you <em>book</em></h2>
    </div>
    <div class="faq-wrap reveal">
      <div class="faq-item">
        <button class="faq-q">How does a virtual styling session work?<span class="faq-icon"></span></button>
        <div class="faq-a"><p>You'll receive a short questionnaire and a wardrobe photo brief before we meet. The session runs over video: we review your pieces live, discuss fit and gaps, and you leave with a written plan — looks, priorities, and a shoppable list — within 48 hours of the call.</p></div>
      </div>
      <div class="faq-item">
        <button class="faq-q">Do you work with all body types and budgets?<span class="faq-icon"></span></button>
        <div class="faq-a"><p>Always. Our stylists are trained in inclusive sizing across menswear and womenswear, and we've built wardrobes on every budget from high street to haute. We'll tell you honestly where to invest and where to save — a £95 roll-neck can absolutely outlive a £950 one if you know what to look for.</p></div>
      </div>
      <div class="faq-item">
        <button class="faq-q">Can I reschedule or cancel my booking?<span class="faq-icon"></span></button>
        <div class="faq-a"><p>Reschedule free of charge up to 48 hours before your session. Cancellations inside 48 hours are refunded at 50%; in-home wardrobe edits can be moved once at no cost. Life happens — we'd rather you rebook than rush.</p></div>
      </div>
      <div class="faq-item">
        <button class="faq-q">How do you choose the designers and trends you feature?<span class="faq-icon"></span></button>
        <div class="faq-a"><p>Editorial features are chosen on craft, never on advertising. We look at construction, materials, and the story behind the collection — if a piece can't survive our editors' wear-testing, it doesn't make the page, no matter whose name is on the label.</p></div>
      </div>
      <div class="faq-item">
        <button class="faq-q">Do you offer gift cards?<span class="faq-icon"></span></button>
        <div class="faq-a"><p>Yes — consultations and capsule refreshes can be gifted as digital cards with a personalised note, valid for twelve months. They're our most popular present every December, and we've never had one returned.</p></div>
      </div>
    </div>
  </div>
</section>

<!-- NEWSLETTER -->
<section class="newsletter" id="newsletter">
  <div class="container nl-inner reveal">
    <div class="nl-eyebrow">The Weekly Dispatch</div>
    <h2>The Sunday <em>Silhouette</em></h2>
    <p>One email, every Sunday: the trends worth your time, the pieces worth your money, and one silhouette to try before the week is out. 120,000 readers and counting.</p>
    <form class="nl-form" id="nlForm" novalidate>
      <input type="email" id="nlEmail" placeholder="your@email.com" aria-label="Email address" required>
      <button type="submit" class="btn">Subscribe</button>
    </form>
    <div class="nl-success" id="nlSuccess">Welcome to the edit — your first Silhouette lands this Sunday.</div>
    <p class="nl-small">No noise · No spam · Unsubscribe anytime</p>
  </div>
</section>

</main>

<!-- FOOTER -->
<footer class="site-footer">
  <div class="container">
    <div class="footer-grid">
      <div class="footer-brand">
        <a class="brand" href="#top" style="text-decoration:none">
          <img class="brand-logo" src="https://placehold.co/56x56/F4EFE6/1B1712?text=MV&font=playfair+display" alt="Maison Velour monogram">
          <span>
            <span class="brand-name">MAISON VELOUR</span>
            <span class="brand-tag" style="color:rgba(244,239,230,.55)">Where Silhouette Meets Story</span>
          </span>
        </a>
        <p>Trend bureau, styling studio, and archive of the season — published from our atelier in Soho and read in forty countries every Sunday morning.</p>
        <ul class="footer-social">
          <li><a href="#top">Instagram ↗</a></li>
          <li><a href="#top">Pinterest ↗</a></li>
          <li><a href="#top">TikTok ↗</a></li>
          <li><a href="#top">X ↗</a></li>
        </ul>
      </div>
      <div class="footer-col">
        <h4>Explore</h4>
        <ul>
          <li><a href="#collections">Collections</a></li>
          <li><a href="#trends">Trends</a></li>
          <li><a href="#essentials">Wardrobe Essentials</a></li>
          <li><a href="#shop">Shop New Arrivals</a></li>
          <li><a href="#magazine">The Magazine</a></li>
        </ul>
      </div>
      <div class="footer-col">
        <h4>The Studio</h4>
        <ul>
          <li><a href="#studio">Book a Stylist</a></li>
          <li><a href="#studio">The Consultation</a></li>
          <li><a href="#studio">Capsule Refresh</a></li>
          <li><a href="#studio">Full Wardrobe Edit</a></li>
          <li><a href="#newsletter">Gift Cards</a></li>
        </ul>
      </div>
      <div class="footer-col">
        <h4>Visit &amp; Contact</h4>
        <ul class="footer-contact">
          <li><i>◈</i><span>Studio 5, 42 Garland Lane,<br>Soho, London W1D 3QA</span></li>
          <li><i>✆</i><span>+44 20 7946 0821</span></li>
          <li><i>✉</i><span>hello@maisonvelour.com</span></li>
          <li><i>◷</i><span>Mon–Fri, 9:00–18:00 GMT</span></li>
        </ul>
      </div>
    </div>
    <div class="footer-bottom">
      <p>© <span id="year">2025</span> Maison Velour Ltd. All rights reserved.</p>
      <nav class="footer-legal" aria-label="Legal">
        <a href="#top">Privacy Policy</a>
        <a href="#top">Terms of Service</a>
        <a href="#top">Cookie Notice</a>
        <a href="#top">Editorial Guidelines</a>
      </nav>
    </div>
  </div>
</footer>

<!-- TOAST -->
<div class="toast" id="toast" role="status" aria-live="polite"></div>

<script>
/* ================= UTILITIES ================= */
let toastTimer;
function toast(msg){
  const t = document.getElementById('toast');
  t.textContent = msg;
  t.classList.add('show');
  clearTimeout(toastTimer);
  toastTimer = setTimeout(() => t.classList.remove('show'), 2600);
}

/* ================= HEADER ================= */
const header = document.getElementById('siteHeader');
window.addEventListener('scroll', () => {
  header.classList.toggle('scrolled', window.scrollY > 10);
}, { passive: true });

const menuBtn = document.getElementById('menuBtn');
const primaryNav = document.getElementById('primaryNav');
menuBtn.addEventListener('click', () => {
  const open = primaryNav.classList.toggle('open');
  menuBtn.setAttribute('aria-expanded', open);
});
primaryNav.querySelectorAll('a').forEach(a => a.addEventListener('click', () => primaryNav.classList.remove('open')));

/* ================= REVEAL ON SCROLL ================= */
const io = new IntersectionObserver(entries => {
  entries.forEach(en => {
    if (en.isIntersecting){ en.target.classList.add('in'); io.unobserve(en.target); }
  });
}, { threshold: 0.12 });
document.querySelectorAll('.reveal').forEach(el => io.observe(el));

/* ================= FOLLOW DESIGNER ================= */
const followBtn = document.getElementById('followBtn');
followBtn.addEventListener('click', () => {
  followBtn.textContent = 'Following ✓';
  followBtn.disabled = true;
  followBtn.style.opacity = '.75';
  followBtn.style.cursor = 'default';
  toast("You're now following Inès Marchetti — updates land in your Sunday Silhouette.");
});

/* ================= SHOP BUTTON ================= */
document.getElementById('shopBtn').addEventListener('click', () => {
  toast('The shop opens fully with Issue 15 — you are on the list.');
});

/* ================= CAPSULE CHECKLIST ================= */
const addBtns = document.querySelectorAll('.essential-add');
const capsuleFill = document.getElementById('capsuleFill');
const capsuleCount = document.getElementById('capsuleCount');
const capsuleDone = document.getElementById('capsuleDone');
function updateCapsule(){
  const total = addBtns.length;
  const n = document.querySelectorAll('.essential-add.added').length;
  capsuleCount.textContent = n + ' / ' + total;
  capsuleFill.style.width = (n / total * 100) + '%';
  capsuleDone.classList.toggle('show', n === total);
}
addBtns.forEach(btn => btn.addEventListener('click', () => {
  btn.classList.toggle('added');
  btn.querySelector('span').textContent = btn.classList.contains('added') ? 'In Your Capsule' : 'Add to Capsule';
  updateCapsule();
  if (document.querySelectorAll('.essential-add.added').length === addBtns.length){
    toast('Capsule complete — six pieces, infinite outfits.');
  }
}));

/* ================= COLOUR MATCHER ================= */
const profile = { undertone: null, depth: null, mood: null };

document.querySelectorAll('.seg').forEach(group => {
  group.addEventListener('click', e => {
    const btn = e.target.closest('button[data-value]');
    if (!btn) return;
    group.querySelectorAll('button').forEach(b => {
      b.classList.remove('active');
      b.setAttribute('aria-pressed', 'false');
    });
    btn.classList.add('active');
    btn.setAttribute('aria-pressed', 'true');
    profile[group.dataset.key] = btn.dataset.value;
  });
});

function hslToHex(h, s, l){
  s /= 100; l /= 100;
  const k = n => (n + h / 30) % 12;
  const a = s * Math.min(l, 1 - l);
  const f = n => l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));
  const to = x => Math.round(255 * x).toString(16).padStart(2, '0');
  return ('#' + to(f(0)) + to(f(8)) + to(f(4))).toUpperCase();
}

function shadeName(h, s, l){
  if (s < 14){
    if (l >= 90) return 'Porcelain';
    if (l >= 82) return 'Bone';
    if (l >= 72) return 'Oat';
    if (l >= 58) return 'Greige';
    if (l >= 44) return 'Taupe';
    if (l >= 30) return 'Umber';
    if (l >= 20) return 'Graphite';
    return 'Onyx';
  }
  const families = [
    { max: 15,  names: ['Rose Petal','Coral','Poppy','Garnet','Oxblood'] },
    { max: 45,  names: ['Honey','Caramel','Amber','Chestnut','Espresso'] },
    { max: 70,  names: ['Flax','Olive','Moss','Juniper','Pine'] },
    { max: 160, names: ['Mint','Sage','Jade','Emerald','Forest'] },
    { max: 200, names: ['Aqua','Sea Glass','Teal','Peacock','Deep Sea'] },
    { max: 250, names: ['Powder Blue','Sky','Cornflower','Cobalt','Midnight'] },
    { max: 290, names: ['Lilac','Wisteria','Iris','Amethyst','Aubergine'] },
    { max: 345, names: ['Blush','Orchid','Raspberry','Mulberry','Blackberry'] },
    { max: 361, names: ['Rose Petal','Coral','Poppy','Garnet','Oxblood'] }
  ];
  const fam = families.find(f => h < f.max).names;
  const idx = l > 76 ? 0 : l > 60 ? 1 : l > 44 ? 2 : l > 30 ? 3 : 4;
  return fam[idx];
}

const BASE_HUE   = { warm: 34, cool: 212, neutral: 30 };
const SAT_SCALE  = { warm: 1, cool: 1, neutral: 0.45 };
const MOOD_SAT   = { soft: 20, classic: 38, bold: 62 };
const DEPTH_L    = {
  light:  [92, 81, 70, 60, 50, 42],
  medium: [90, 76, 64, 52, 40, 28],
  deep:   [94, 72, 56, 42, 30, 18]
};
const TONE_DESC = {
  warm: 'sun-warmed, golden tones',
  cool: 'cool, blue-based tones',
  neutral: 'soft, earth-grounded neutrals'
};
const DEPTH_DESC = {
  light: 'lighter colouring — fair skin, ash or blonde hair',
  medium: 'medium-depth colouring with moderate natural contrast',
  deep: 'deeper skin tones and rich, high contrast'
};
const MOOD_TIP = {
  soft: 'Keep contrast gentle: pair adjacent shades rather than extremes, and let texture — bouclé, brushed wool, washed silk — do the talking.',
  classic: 'Anchor each outfit with a light neutral, add one mid-tone layer, and let your deepest shade define the silhouette.',
  bold: 'Block your deepest shade against the accent for statement moments — or thread the accent through accessories when you want to whisper.'
};

const swatchRow = document.getElementById('swatchRow');
const paletteNotes = document.getElementById('paletteNotes');
const paletteHeading = document.getElementById('paletteHeading');
const paletteProfile = document.getElementById('paletteProfile');

document.getElementById('generateBtn').addEventListener('click', () => {
  if (!profile.undertone || !profile.depth || !profile.mood){
    toast('Choose an option from each row to compose your palette.');
    return;
  }
  const { undertone, depth, mood } = profile;
  const jitter = Math.random() * 8 - 4;
  const base = (BASE_HUE[undertone] + jitter + 360) % 360;
  const S = Math.round(MOOD_SAT[mood] * SAT_SCALE[undertone]);
  const Ls = DEPTH_L[depth];

  const hueOffsets = [3, 10, -5, 16, -14];
  const satFactors = [0.12, 0.7, 1, 1.08, 1.05];
  const swatches = [];
  for (let i = 0; i < 5; i++){
    swatches.push({
      h: (base + hueOffsets[i] + 360) % 360,
      s: Math.min(Math.round(S * satFactors[i]) + (i === 0 ? 0 : 4), 90),
      l: Ls[i]
    });
  }
  if (mood === 'bold'){
    swatches.push({ h: (base + 168) % 360, s: Math.min(Math.round(S * 1.4), 86), l: Math.min(Ls[5] + 14, 46) });
  } else if (mood === 'classic'){
    swatches.push({ h: (base + 12) % 360, s: S, l: Ls[5] });
  } else {
    swatches.push({ h: base, s: Math.round(S * 0.85), l: Ls[5] });
  }

  const data = swatches.map(c => ({
    hex: hslToHex(c.h, c.s, c.l),
    name: shadeName(c.h, c.s, c.l)
  }));

  swatchRow.innerHTML = data.map((d, i) =>
    '<button type="button" class="swatch" style="--c:' + d.hex + ';--d:' + (i * 0.07) + 's" data-hex="' + d.hex + '" title="Copy ' + d.hex + '">' +
      '<span class="swatch-color"></span>' +
      '<span class="swatch-name">' + d.name + '</span>' +
      '<span class="swatch-hex">' + d.hex + '</span>' +
    '</button>'
  ).join('');

  paletteHeading.textContent = 'Your Composed Palette';
  paletteProfile.textContent = undertone + ' · ' + depth + ' · ' + mood;
  paletteNotes.innerHTML =
    '<p>A <strong>' + mood + '</strong> palette of <strong>' + TONE_DESC[undertone] + '</strong>, tuned for ' + DEPTH_DESC[depth] + '.</p>' +
    '<p>Wear <strong>' + data[0].name + '</strong> closest to your face, build mid-layers in <strong>' + data[2].name + '</strong> and <strong>' + data[3].name + '</strong>, and reserve <strong>' + data[5].name + '</strong> for the pieces you want remembered. ' + MOOD_TIP[mood] + '</p>' +
    '<p class="copy-hint">Tap any shade to copy its hex · Compose again for a variation</p>';

  toast('Palette composed — six shades, made for you.');
});

swatchRow.addEventListener('click', e => {
  const s = e.target.closest('.swatch');
  if (!s || s.classList.contains('ph')) return;
  const hex = s.dataset.hex;
  if (navigator.clipboard && navigator.clipboard.writeText){
    navigator.clipboard.writeText(hex)
      .then(() => toast(hex + ' copied to clipboard'))
      .catch(() => toast(hex));
  } else {
    toast(hex);
  }
});

/* ================= FAQ ACCORDION ================= */
document.querySelectorAll('.faq-q').forEach(btn => {
  btn.addEventListener('click', () => {
    const item = btn.parentElement;
    const panel = item.querySelector('.faq-a');
    const isOpen = item.classList.contains('open');
    document.querySelectorAll('.faq-item.open').forEach(o => {
      o.classList.remove('open');
      o.querySelector('.faq-a').style.maxHeight = null;
    });
    if (!isOpen){
      item.classList.add('open');
      panel.style.maxHeight = panel.scrollHeight + 'px';
    }
  });
});

/* ================= NEWSLETTER ================= */
const nlForm = document.getElementById('nlForm');
nlForm.addEventListener('submit', e => {
  e.preventDefault();
  const input = document.getElementById('nlEmail');
  const email = input.value.trim();
  if (!/^\S+@\S+\.\S+$/.test(email)){
    toast('Please enter a valid email address.');
    input.focus();
    return;
  }
  nlForm.style.display = 'none';
  document.getElementById('nlSuccess').classList.add('show');
  toast('Welcome to The Sunday Silhouette.');
});

/* ================= YEAR ================= */
document.getElementById('year').textContent = new Date().getFullYear();
</script>
</body>
</html>
View Axe Report (JSON)
{
  "testEngine": {
    "name": "axe-core",
    "version": "4.10.2"
  },
  "testRunner": {
    "name": "axe"
  },
  "testEnvironment": {
    "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36",
    "windowWidth": 1280,
    "windowHeight": 720,
    "orientationAngle": 0,
    "orientationType": "landscape-primary"
  },
  "timestamp": "2026-11-12T09:51:28.382Z",
  "url": "https://benchmark.aimac.invalid/84a9965099ce3d5c75b7a3e87fb7b44d088c37a7f9e08c2b4998a85451eeeb00.html",
  "toolOptions": {
    "runOnly": {
      "type": "tag",
      "values": [
        "wcag2a",
        "wcag2aa",
        "wcag21a",
        "wcag21aa",
        "wcag22a",
        "wcag22aa"
      ]
    },
    "resultTypes": [
      "violations"
    ],
    "reporter": "v1"
  },
  "inapplicable": [
    {
      "id": "area-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag244",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.2.4.4",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure <area> elements of image maps have alternative text",
      "help": "Active <area> elements must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/area-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-braille-equivalent",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure aria-braillelabel and aria-brailleroledescription have a non-braille equivalent",
      "help": "aria-braille attributes must have a non-braille equivalent",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-braille-equivalent?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-command-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every ARIA button, link and menuitem has an accessible name",
      "help": "ARIA commands must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-command-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-input-field-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every ARIA input field has an accessible name",
      "help": "ARIA input fields must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-input-field-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-meter-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag111",
        "EN-301-549",
        "EN-9.1.1.1"
      ],
      "description": "Ensure every ARIA meter node has an accessible name",
      "help": "ARIA meter nodes must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-meter-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-progressbar-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag111",
        "EN-301-549",
        "EN-9.1.1.1"
      ],
      "description": "Ensure every ARIA progressbar node has an accessible name",
      "help": "ARIA progressbar nodes must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-progressbar-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-required-children",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure elements with an ARIA role that require child roles contain them",
      "help": "Certain ARIA roles must contain particular children",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-children?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-required-parent",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure elements with an ARIA role that require parent roles are contained by them",
      "help": "Certain ARIA roles must be contained by particular parents",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-parent?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-toggle-field-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every ARIA toggle field has an accessible name",
      "help": "ARIA toggle fields must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-toggle-field-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-tooltip-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure every ARIA tooltip node has an accessible name",
      "help": "ARIA tooltip nodes must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-tooltip-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "autocomplete-valid",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag21aa",
        "wcag135",
        "EN-301-549",
        "EN-9.1.3.5",
        "ACT"
      ],
      "description": "Ensure the autocomplete attribute is correct and suitable for the form field",
      "help": "autocomplete attribute must be used correctly",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/autocomplete-valid?application=axeAPI",
      "nodes": []
    },
    {
      "id": "blink",
      "impact": null,
      "tags": [
        "cat.time-and-media",
        "wcag2a",
        "wcag222",
        "section508",
        "section508.22.j",
        "TTv5",
        "TT2.b",
        "EN-301-549",
        "EN-9.2.2.2"
      ],
      "description": "Ensure <blink> elements are not used",
      "help": "<blink> elements are deprecated and must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/blink?application=axeAPI",
      "nodes": []
    },
    {
      "id": "definition-list",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure <dl> elements are structured correctly",
      "help": "<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script>, <template> or <div> elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/definition-list?application=axeAPI",
      "nodes": []
    },
    {
      "id": "dlitem",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure <dt> and <dd> elements are contained by a <dl>",
      "help": "<dt> and <dd> elements must be contained by a <dl>",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/dlitem?application=axeAPI",
      "nodes": []
    },
    {
      "id": "frame-focusable-content",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag211",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1"
      ],
      "description": "Ensure <frame> and <iframe> elements with focusable content do not have tabindex=-1",
      "help": "Frames with focusable content must not have tabindex=-1",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-focusable-content?application=axeAPI",
      "nodes": []
    },
    {
      "id": "frame-title-unique",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT12.d",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure <iframe> and <frame> elements contain a unique title attribute",
      "help": "Frames must have a unique title attribute",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title-unique?application=axeAPI",
      "nodes": []
    },
    {
      "id": "frame-title",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.i",
        "TTv5",
        "TT12.d",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure <iframe> and <frame> elements have an accessible name",
      "help": "Frames must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title?application=axeAPI",
      "nodes": []
    },
    {
      "id": "html-xml-lang-mismatch",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2a",
        "wcag311",
        "EN-301-549",
        "EN-9.3.1.1",
        "ACT"
      ],
      "description": "Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page",
      "help": "HTML elements with lang and xml:lang must have the same base language",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-xml-lang-mismatch?application=axeAPI",
      "nodes": []
    },
    {
      "id": "input-button-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure input buttons have discernible text",
      "help": "Input buttons must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-button-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "input-image-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "EN-301-549",
        "EN-9.1.1.1",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure <input type=\"image\"> elements have alternative text",
      "help": "Image buttons must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-image-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "link-in-text-block",
      "impact": null,
      "tags": [
        "cat.color",
        "wcag2a",
        "wcag141",
        "TTv5",
        "TT13.a",
        "EN-301-549",
        "EN-9.1.4.1"
      ],
      "description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
      "help": "Links must be distinguishable without relying on color",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-in-text-block?application=axeAPI",
      "nodes": []
    },
    {
      "id": "marquee",
      "impact": null,
      "tags": [
        "cat.parsing",
        "wcag2a",
        "wcag222",
        "TTv5",
        "TT2.b",
        "EN-301-549",
        "EN-9.2.2.2"
      ],
      "description": "Ensure <marquee> elements are not used",
      "help": "<marquee> elements are deprecated and must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/marquee?application=axeAPI",
      "nodes": []
    },
    {
      "id": "meta-refresh",
      "impact": null,
      "tags": [
        "cat.time-and-media",
        "wcag2a",
        "wcag221",
        "TTv5",
        "TT8.a",
        "EN-301-549",
        "EN-9.2.2.1"
      ],
      "description": "Ensure <meta http-equiv=\"refresh\"> is not used for delayed refresh",
      "help": "Delayed refresh under 20 hours must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-refresh?application=axeAPI",
      "nodes": []
    },
    {
      "id": "object-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "EN-301-549",
        "EN-9.1.1.1"
      ],
      "description": "Ensure <object> elements have alternative text",
      "help": "<object> elements must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/object-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "role-img-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "EN-301-549",
        "EN-9.1.1.1",
        "ACT"
      ],
      "description": "Ensure [role=\"img\"] elements have alternative text",
      "help": "[role=\"img\"] elements must have an alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/role-img-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "scrollable-region-focusable",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag211",
        "wcag213",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1",
        "EN-9.2.1.3"
      ],
      "description": "Ensure elements that have scrollable content are accessible by keyboard",
      "help": "Scrollable region must have keyboard access",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/scrollable-region-focusable?application=axeAPI",
      "nodes": []
    },
    {
      "id": "select-name",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.n",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure select element has an accessible name",
      "help": "Select element must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/select-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "server-side-image-map",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag211",
        "section508",
        "section508.22.f",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1"
      ],
      "description": "Ensure that server-side image maps are not used",
      "help": "Server-side image maps must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/server-side-image-map?application=axeAPI",
      "nodes": []
    },
    {
      "id": "summary-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure summary elements have discernible text",
      "help": "Summary elements must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/summary-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "svg-img-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "EN-301-549",
        "EN-9.1.1.1",
        "ACT"
      ],
      "description": "Ensure <svg> elements with an img, graphics-document or graphics-symbol role have an accessible text",
      "help": "<svg> elements with an img role must have an alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/svg-img-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "td-headers-attr",
      "impact": null,
      "tags": [
        "cat.tables",
        "wcag2a",
        "wcag131",
        "section508",
        "section508.22.g",
        "TTv5",
        "TT14.b",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table",
      "help": "Table cells that use the headers attribute must only refer to cells in the same table",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/td-headers-attr?application=axeAPI",
      "nodes": []
    },
    {
      "id": "th-has-data-cells",
      "impact": null,
      "tags": [
        "cat.tables",
        "wcag2a",
        "wcag131",
        "section508",
        "section508.22.g",
        "TTv5",
        "TT14.b",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe",
      "help": "Table headers in a data table must refer to data cells",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/th-has-data-cells?application=axeAPI",
      "nodes": []
    },
    {
      "id": "valid-lang",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2aa",
        "wcag312",
        "TTv5",
        "TT11.b",
        "EN-301-549",
        "EN-9.3.1.2",
        "ACT"
      ],
      "description": "Ensure lang attributes have valid values",
      "help": "lang attribute must have a valid value",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/valid-lang?application=axeAPI",
      "nodes": []
    },
    {
      "id": "video-caption",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag122",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT17.a",
        "EN-301-549",
        "EN-9.1.2.2"
      ],
      "description": "Ensure <video> elements have captions",
      "help": "<video> elements must have captions",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/video-caption?application=axeAPI",
      "nodes": []
    },
    {
      "id": "no-autoplay-audio",
      "impact": null,
      "tags": [
        "cat.time-and-media",
        "wcag2a",
        "wcag142",
        "TTv5",
        "TT2.a",
        "EN-301-549",
        "EN-9.1.4.2",
        "ACT"
      ],
      "description": "Ensure <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",
      "help": "<video> or <audio> elements must not play automatically",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/no-autoplay-audio?application=axeAPI",
      "nodes": []
    }
  ],
  "passes": [
    {
      "id": "aria-allowed-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure an element's role supports its ARIA attributes",
      "help": "Elements must only use supported ARIA attributes",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-allowed-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "aria-allowed-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attributes are used correctly for the defined role"
            }
          ],
          "none": [
            {
              "id": "aria-unsupported-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attribute is supported"
            }
          ],
          "impact": null,
          "html": "<a class=\"brand\" href=\"#top\" aria-label=\"Maison Velour home\">",
          "target": [
            "a[aria-label=\"Maison Velour home\"]"
          ]
        }
      ]
    },
    {
      "id": "aria-conditional-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure ARIA attributes are used as described in the specification of the element's role",
      "help": "ARIA attributes must be used as specified for the element's role",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-conditional-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "aria-conditional-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "ARIA attribute is allowed"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<a class=\"brand\" href=\"#top\" aria-label=\"Maison Velour home\">",
          "target": [
            "a[aria-label=\"Maison Velour home\"]"
          ]
        }
      ]
    },
    {
      "id": "aria-deprecated-role",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure elements do not use deprecated roles",
      "help": "Deprecated ARIA roles must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-deprecated-role?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "deprecatedrole",
              "data": null,
              "relatedNodes": [],
              "impact": "minor",
              "message": "ARIA role is not deprecated"
            }
          ],
          "impact": null,
          "html": "<div class=\"seg\" data-key=\"undertone\" role=\"group\" aria-label=\"Undertone\">",
          "target": [
            "div[data-key=\"undertone\"]"
          ]
        }
      ]
    },
    {
      "id": "aria-hidden-body",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag131",
        "wcag412",
        "EN-301-549",
        "EN-9.1.3.1",
        "EN-9.4.1.2"
      ],
      "description": "Ensure aria-hidden=\"true\" is not present on the document body.",
      "help": "aria-hidden=\"true\" must not be present on the document body",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-body?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "aria-hidden-body",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "No aria-hidden attribute is present on document body"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<body id=\"top\">",
          "target": [
            "#top"
          ]
        }
      ]
    },
    {
      "id": "aria-hidden-focus",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure aria-hidden elements are not focusable nor contain focusable elements",
      "help": "ARIA hidden element must not be focusable or contain focusable elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "focusable-modal-open",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "No focusable elements while a modal is open"
            },
            {
              "id": "focusable-disabled",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "No focusable elements contained within element"
            },
            {
              "id": "focusable-not-tabbable",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "No focusable elements contained within element"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<div class=\"ticker\" aria-hidden=\"true\">",
          "target": [
            ".ticker"
          ]
        }
      ]
    },
    {
      "id": "aria-prohibited-attr",
      "impact": "serious",
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure ARIA attributes are not prohibited for an element's role",
      "help": "Elements must only use permitted ARIA attributes",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "aria-prohibited-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "ARIA attribute is allowed"
            }
          ],
          "impact": null,
          "html": "<a class=\"brand\" href=\"#top\" aria-label=\"Maison Velour home\">",
          "target": [
            "a[aria-label=\"Maison Velour home\"]"
          ]
        }
      ]
    },
    {
      "id": "aria-required-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure elements with ARIA roles have all required ARIA attributes",
      "help": "Required ARIA attributes must be provided",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-attr?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "aria-required-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "All required ARIA attributes are present"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<div class=\"seg\" data-key=\"undertone\" role=\"group\" aria-label=\"Undertone\">",
          "target": [
            "div[data-key=\"undertone\"]"
          ]
        }
      ]
    },
    {
      "id": "aria-roles",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure all elements with a role attribute use a valid value",
      "help": "ARIA roles used must conform to valid values",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-roles?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "invalidrole",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA role is valid"
            },
            {
              "id": "abstractrole",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Abstract roles are not used"
            },
            {
              "id": "unsupportedrole",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA role is supported"
            }
          ],
          "impact": null,
          "html": "<div class=\"seg\" data-key=\"undertone\" role=\"group\" aria-label=\"Undertone\">",
          "target": [
            "div[data-key=\"undertone\"]"
          ]
        }
      ]
    },
    {
      "id": "aria-valid-attr-value",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure all ARIA attributes have valid values",
      "help": "ARIA attributes must conform to valid values",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr-value?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "aria-valid-attr-value",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attribute values are valid"
            },
            {
              "id": "aria-errormessage",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "aria-errormessage exists and references elements visible to screen readers that use a supported aria-errormessage technique"
            },
            {
              "id": "aria-level",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "aria-level values are valid"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<a class=\"brand\" href=\"#top\" aria-label=\"Maison Velour home\">",
          "target": [
            "a[aria-label=\"Maison Velour home\"]"
          ]
        }
      ]
    },
    {
      "id": "aria-valid-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure attributes that begin with aria- are valid ARIA attributes",
      "help": "ARIA attributes must conform to valid names",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "aria-valid-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attribute name is valid"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<a class=\"brand\" href=\"#top\" aria-label=\"Maison Velour home\">",
          "target": [
            "a[aria-label=\"Maison Velour home\"]"
          ]
        }
      ]
    },
    {
      "id": "avoid-inline-spacing",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag21aa",
        "wcag1412",
        "EN-301-549",
        "EN-9.1.4.12",
        "ACT"
      ],
      "description": "Ensure that text spacing set through style attributes can be adjusted with custom stylesheets",
      "help": "Inline text spacing must be adjustable with custom stylesheets",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/avoid-inline-spacing?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "important-letter-spacing",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Letter-spacing in the style attribute is not set to !important, or meets the minimum"
            },
            {
              "id": "important-word-spacing",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "word-spacing in the style attribute is not set to !important, or meets the minimum"
            },
            {
              "id": "important-line-height",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "line-height in the style attribute is not set to !important, or meets the minimum"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<div class=\"hero-visual reveal in\" style=\"--d:.15s\">",
          "target": [
            ".hero-visual"
          ]
        }
      ]
    },
    {
      "id": "button-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure buttons have discernible text",
      "help": "Buttons must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/button-name?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "button-has-visible-text",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has inner text that is visible to screen readers"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<button class=\"btn light\" id=\"followBtn\">Follow Designer</button>",
          "target": [
            "#followBtn"
          ]
        }
      ]
    },
    {
      "id": "bypass",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag241",
        "section508",
        "section508.22.o",
        "TTv5",
        "TT9.a",
        "EN-301-549",
        "EN-9.2.4.1"
      ],
      "description": "Ensure each page has at least one mechanism for a user to bypass navigation and jump straight to the content",
      "help": "Page must have means to bypass repeated blocks",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/bypass?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "internal-link-present",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Valid skip link found"
            },
            {
              "id": "header-present",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<h1 class=\"hero-title\">Dress like the story <em>only you</em> can tell.</h1>",
                  "target": [
                    "h1"
                  ]
                },
                {
                  "html": "<h2 class=\"section-title\">Four movements<br>defining the <em>season</em></h2>",
                  "target": [
                    "#trends > .container > .split.section-head.reveal > div > .section-title"
                  ]
                },
                {
                  "html": "<h3 class=\"trend-title\">Quiet Luxury 2.0</h3>",
                  "target": [
                    ".trend-card:nth-child(1) > .trend-body > .trend-title"
                  ]
                },
                {
                  "html": "<h3 class=\"trend-title\">Sculptural Shoulders</h3>",
                  "target": [
                    ".trend-card:nth-child(2) > .trend-body > .trend-title"
                  ]
                },
                {
                  "html": "<h3 class=\"trend-title\">Butter Yellow</h3>",
                  "target": [
                    ".trend-card:nth-child(3) > .trend-body > .trend-title"
                  ]
                },
                {
                  "html": "<h3 class=\"trend-title\">Sheer Layering</h3>",
                  "target": [
                    ".trend-card:nth-child(4) > .trend-body > .trend-title"
                  ]
                },
                {
                  "html": "<h2 class=\"section-title\">In\u00e8s Marchetti is rewriting the rules of <em>drape</em></h2>",
                  "target": [
                    ".spot-copy > .section-title"
                  ]
                },
                {
                  "html": "<h2 class=\"section-title\">The capsule <em>checklist</em></h2>",
                  "target": [
                    "#essentials > .container > .split.section-head.reveal > div > .section-title"
                  ]
                },
                {
                  "html": "<h3 class=\"essential-name\">The Crisp White Shirt</h3>",
                  "target": [
                    ".essential-card:nth-child(1) > .essential-body > .essential-name"
                  ]
                },
                {
                  "html": "<h3 class=\"essential-name\">The Trench Coat</h3>",
                  "target": [
                    ".essential-card:nth-child(2) > .essential-body > .essential-name"
                  ]
                },
                {
                  "html": "<h3 class=\"essential-name\">Tailored Wool Trousers</h3>",
                  "target": [
                    ".essential-card:nth-child(3) > .essential-body > .essential-name"
                  ]
                },
                {
                  "html": "<h3 class=\"essential-name\">The Little Black Dress</h3>",
                  "target": [
                    ".essential-card:nth-child(4) > .essential-body > .essential-name"
                  ]
                },
                {
                  "html": "<h3 class=\"essential-name\">Leather Loafers</h3>",
                  "target": [
                    ".essential-card:nth-child(5) > .essential-body > .essential-name"
                  ]
                },
                {
                  "html": "<h3 class=\"essential-name\">Cashmere Crewneck</h3>",
                  "target": [
                    ".essential-card:nth-child(6) > .essential-body > .essential-name"
                  ]
                },
                {
                  "html": "<h2 class=\"section-title\">Find your <em>palette</em></h2>",
                  "target": [
                    "#palette > .container > .center.section-head.reveal > .section-title"
                  ]
                },
                {
                  "html": "<h3 id=\"paletteHeading\">Your Palette Awaits</h3>",
                  "target": [
                    "#paletteHeading"
                  ]
                },
                {
                  "html": "<h2 class=\"section-title\">Book a <em>stylist</em></h2>",
                  "target": [
                    "#studio > .container > .center.section-head.reveal > .section-title"
                  ]
                },
                {
                  "html": "<h3 class=\"price-name\">The Consultation</h3>",
                  "target": [
                    ".price-card:nth-child(1) > .price-name"
                  ]
                },
                {
                  "html": "<h3 class=\"price-name\">The Capsule Refresh</h3>",
                  "target": [
                    ".featured > .price-name"
                  ]
                },
                {
                  "html": "<h3 class=\"price-name\">The Full Wardrobe Edit</h3>",
                  "target": [
                    ".price-card:nth-child(3) > .price-name"
                  ]
                },
                {
                  "html": "<h2 class=\"section-title\">Reads worth your <em>Metro stop</em></h2>",
                  "target": [
                    "#magazine > .container > .split.section-head.reveal > div > .section-title"
                  ]
                },
                {
                  "html": "<h2 class=\"article-title\">The red carpet went quiet \u2014 and it's never looked better</h2>",
                  "target": [
                    ".article-title"
                  ]
                },
                {
                  "html": "<h3 class=\"mini-title\">The five-minute face that survives fashion week</h3>",
                  "target": [
                    ".mini-card:nth-child(1) > .mini-title"
                  ]
                },
                {
                  "html": "<h3 class=\"mini-title\">Copenhagen's layering formula, decoded</h3>",
                  "target": [
                    ".mini-card:nth-child(2) > .mini-title"
                  ]
                },
                {
                  "html": "<h3 class=\"side-title\">Editor's Picks <a href=\"#magazine\">All \u2192</a></h3>",
                  "target": [
                    ".side-block.reveal:nth-child(1) > .side-title"
                  ]
                },
                {
                  "html": "<h4>The midi skirt returns \u2014 with a vengeance</h4>",
                  "target": [
                    ".pick-item:nth-child(2) > .pick-info > h4"
                  ]
                },
                {
                  "html": "<h4>How to buy cashmere that lasts decades</h4>",
                  "target": [
                    ".pick-item:nth-child(3) > .pick-info > h4"
                  ]
                },
                {
                  "html": "<h4>Skin first, makeup second: the beauty edit</h4>",
                  "target": [
                    ".pick-item:nth-child(4) > .pick-info > h4"
                  ]
                },
                {
                  "html": "<h3 class=\"side-title\">New Arrivals</h3>",
                  "target": [
                    "#shop > .side-title"
                  ]
                },
                {
                  "html": "<h4>Pleated Silk Midi Skirt</h4>",
                  "target": [
                    ".product-item:nth-child(2) > .product-info > h4"
                  ]
                },
                {
                  "html": "<h4>Merino Roll-Neck</h4>",
                  "target": [
                    ".product-item:nth-child(3) > .product-info > h4"
                  ]
                },
                {
                  "html": "<h4>Structured Leather Tote</h4>",
                  "target": [
                    ".product-item:nth-child(4) > .product-info > h4"
                  ]
                },
                {
                  "html": "<h4>Ochre Silk Scarf</h4>",
                  "target": [
                    ".product-item:nth-child(5) > .product-info > h4"
                  ]
                },
                {
                  "html": "<h2 class=\"section-title\">Styled by us, worn by <em>you</em></h2>",
                  "target": [
                    ".section:nth-child(9) > .container > .center.section-head.reveal > .section-title"
                  ]
                },
                {
                  "html": "<h2 class=\"section-title\">Before you <em>book</em></h2>",
                  "target": [
                    ".alt.section:nth-child(10) > .container > .center.section-head.reveal > .section-title"
                  ]
                },
                {
                  "html": "<h2>The Sunday <em>Silhouette</em></h2>",
                  "target": [
                    ".nl-inner > h2"
                  ]
                },
                {
                  "html": "<h4>Explore</h4>",
                  "target": [
                    ".footer-col:nth-child(2) > h4"
                  ]
                },
                {
                  "html": "<h4>The Studio</h4>",
                  "target": [
                    ".footer-col:nth-child(3) > h4"
                  ]
                },
                {
                  "html": "<h4>Visit &amp; Contact</h4>",
                  "target": [
                    ".footer-col:nth-child(4) > h4"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Page has a heading"
            },
            {
              "id": "landmark",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<main>",
                  "target": [
                    "main"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Page has a landmark region"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<html lang=\"en\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "color-contrast",
      "impact": "serious",
      "tags": [
        "cat.color",
        "wcag2aa",
        "wcag143",
        "TTv5",
        "TT13.c",
        "EN-301-549",
        "EN-9.1.4.3",
        "ACT"
      ],
      "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
      "help": "Elements must meet minimum color contrast ratio thresholds",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#f4efe6",
                "bgColor": "#1b1712",
                "contrastRatio": 15.56,
                "fontSize": "8.3pt (11px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element has sufficient color contrast of 15.56"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<p>The Autumn/Winter '25 Edit has landed \u2014 <em>complimentary styling consultations</em> every Friday in October</p>",
          "target": [
            ".annbar > p"
          ]
        }
      ]
    },
    {
      "id": "document-title",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag242",
        "TTv5",
        "TT12.a",
        "EN-301-549",
        "EN-9.2.4.2",
        "ACT"
      ],
      "description": "Ensure each HTML document contains a non-empty <title> element",
      "help": "Documents must have <title> element to aid in navigation",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/document-title?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "doc-has-title",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Document has a non-empty <title> element"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<html lang=\"en\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "duplicate-id-aria",
      "impact": null,
      "tags": [
        "cat.parsing",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure every id attribute value used in ARIA and in labels is unique",
      "help": "IDs used in ARIA and labels must be unique",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/duplicate-id-aria?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "duplicate-id-aria",
              "data": "primaryNav",
              "relatedNodes": [],
              "impact": "critical",
              "message": "Document has no elements referenced with ARIA or labels that share the same id attribute"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<nav class=\"primary-nav\" id=\"primaryNav\" aria-label=\"Primary\">",
          "target": [
            "#primaryNav"
          ]
        }
      ]
    },
    {
      "id": "form-field-multiple-labels",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag2a",
        "wcag332",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.3.3.2"
      ],
      "description": "Ensure form field does not have multiple label elements",
      "help": "Form field must not have multiple label elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/form-field-multiple-labels?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "multiple-label",
              "data": null,
              "relatedNodes": [],
              "impact": "moderate",
              "message": "Form field does not have multiple label elements"
            }
          ],
          "impact": null,
          "html": "<input type=\"email\" id=\"nlEmail\" placeholder=\"your@email.com\" aria-label=\"Email address\" required=\"\">",
          "target": [
            "#nlEmail"
          ]
        }
      ]
    },
    {
      "id": "html-has-lang",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2a",
        "wcag311",
        "TTv5",
        "TT11.a",
        "EN-301-549",
        "EN-9.3.1.1",
        "ACT"
      ],
      "description": "Ensure every HTML document has a lang attribute",
      "help": "<html> element must have a lang attribute",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-has-lang?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "has-lang",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "The <html> element has a lang attribute"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<html lang=\"en\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "html-lang-valid",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2a",
        "wcag311",
        "TTv5",
        "TT11.a",
        "EN-301-549",
        "EN-9.3.1.1",
        "ACT"
      ],
      "description": "Ensure the lang attribute of the <html> element has a valid value",
      "help": "<html> element must have a valid value for the lang attribute",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-lang-valid?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "valid-lang",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Value of lang attribute is included in the list of valid languages"
            }
          ],
          "impact": null,
          "html": "<html lang=\"en\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "image-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "TT7.b",
        "EN-301-549",
        "EN-9.1.1.1",
        "ACT"
      ],
      "description": "Ensure <img> elements have alternative text or a role of none or presentation",
      "help": "Images must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/image-alt?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "has-alt",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has an alt attribute"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "alt-space-value",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has a valid alt attribute value"
            }
          ],
          "impact": null,
          "html": "<img class=\"brand-logo\" src=\"https://placehold.co/56x56/1B1712/F4EFE6?text=MV&amp;font=playfair+display\" alt=\"Maison Velour monogram logo\">",
          "target": [
            "img[alt=\"Maison Velour monogram logo\"]"
          ]
        }
      ]
    },
    {
      "id": "label",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.n",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every form element has a label",
      "help": "Form elements must have labels",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/label?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "aria-label",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "aria-label attribute exists and is not empty"
            },
            {
              "id": "non-empty-placeholder",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has a placeholder attribute"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "hidden-explicit-label",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Form element has a visible explicit <label>"
            }
          ],
          "impact": null,
          "html": "<input type=\"email\" id=\"nlEmail\" placeholder=\"your@email.com\" aria-label=\"Email address\" required=\"\">",
          "target": [
            "#nlEmail"
          ]
        }
      ]
    },
    {
      "id": "link-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag244",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.2.4.4",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure links have discernible text",
      "help": "Links must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-name?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "has-visible-text",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element has text that is visible to screen readers"
            },
            {
              "id": "aria-label",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "aria-label attribute exists and is not empty"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "focusable-no-name",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element is not in tab order or has accessible text"
            }
          ],
          "impact": null,
          "html": "<a class=\"brand\" href=\"#top\" aria-label=\"Maison Velour home\">",
          "target": [
            "a[aria-label=\"Maison Velour home\"]"
          ]
        }
      ]
    },
    {
      "id": "list",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure that lists are structured correctly",
      "help": "<ul> and <ol> must only directly contain <li>, <script> or <template> elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/list?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "only-listitems",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "List element only has direct children that are allowed inside <li> elements"
            }
          ],
          "impact": null,
          "html": "<ul class=\"price-features\">\n          <li>Live wardrobe audit call</li>\n          <li>Personal fit &amp; proportion guide</li>\n          <li>Three curated looks</li>\n          <li>Written notes within 48 hours</li>\n        </ul>",
          "target": [
            ".price-card:nth-child(1) > .price-features"
          ]
        }
      ]
    },
    {
      "id": "listitem",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure <li> elements are used semantically",
      "help": "<li> elements must be contained in a <ul> or <ol>",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/listitem?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "listitem",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "List item has a <ul>, <ol> or role=\"list\" parent element"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<li>Live wardrobe audit call</li>",
          "target": [
            ".price-card:nth-child(1) > .price-features > li:nth-child(1)"
          ]
        }
      ]
    },
    {
      "id": "meta-viewport",
      "impact": null,
      "tags": [
        "cat.sensory-and-visual-cues",
        "wcag2aa",
        "wcag144",
        "EN-301-549",
        "EN-9.1.4.4",
        "ACT"
      ],
      "description": "Ensure <meta name=\"viewport\"> does not disable text scaling and zooming",
      "help": "Zooming and scaling must not be disabled",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-viewport?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "meta-viewport",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "<meta> tag does not disable zooming on mobile devices"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">",
          "target": [
            "meta[name=\"viewport\"]"
          ]
        }
      ]
    },
    {
      "id": "nested-interactive",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies",
      "help": "Interactive controls must not be nested",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/nested-interactive?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "no-focusable-content",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element does not have focusable descendants"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<img class=\"brand-logo\" src=\"https://placehold.co/56x56/1B1712/F4EFE6?text=MV&amp;font=playfair+display\" alt=\"Maison Velour monogram logo\">",
          "target": [
            "img[alt=\"Maison Velour monogram logo\"]"
          ]
        }
      ]
    },
    {
      "id": "target-size",
      "impact": null,
      "tags": [
        "cat.sensory-and-visual-cues",
        "wcag22aa",
        "wcag258"
      ],
      "description": "Ensure touch targets have sufficient size and space",
      "help": "All touch targets must be 24px large, or leave sufficient space",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/target-size?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "target-size",
              "data": {
                "minSize": 24,
                "width": 303.2,
                "height": 50.5
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Control has sufficient size (303.2px by 50.5px, should be at least 24px by 24px)"
            },
            {
              "id": "target-offset",
              "data": {
                "closestOffset": 24,
                "minOffset": 24
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Target has sufficient space from its closest neighbors. Safe clickable space has a diameter of 24px which is at least 24px."
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<a class=\"brand\" href=\"#top\" aria-label=\"Maison Velour home\">",
          "target": [
            "a[aria-label=\"Maison Velour home\"]"
          ]
        }
      ]
    }
  ],
  "incomplete": [
    {
      "id": "aria-prohibited-attr",
      "impact": "serious",
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure ARIA attributes are not prohibited for an element's role",
      "help": "Elements must only use permitted ARIA attributes",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "aria-prohibited-attr",
              "data": {
                "role": null,
                "nodeName": "div",
                "messageKey": "noRoleSingular",
                "prohibited": [
                  "aria-label"
                ]
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "aria-label attribute is not well supported on a div with no valid role attribute."
            }
          ],
          "impact": "serious",
          "html": "<div class=\"stars\" aria-label=\"Rated 5 out of 5\">\u2605\u2605\u2605\u2605\u2605</div>",
          "target": [
            ".testi-card:nth-child(1) > .stars[aria-label=\"Rated 5 out of 5\"]"
          ],
          "failureSummary": "Fix all of the following:\n  aria-label attribute is not well supported on a div with no valid role attribute."
        }
      ]
    },
    {
      "id": "color-contrast",
      "impact": "serious",
      "tags": [
        "cat.color",
        "wcag2aa",
        "wcag143",
        "TTv5",
        "TT13.c",
        "EN-301-549",
        "EN-9.1.4.3",
        "ACT"
      ],
      "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
      "help": "Elements must meet minimum color contrast ratio thresholds",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "messageKey": "nonBmp"
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element content contains only non-text characters"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<i>\u2726</i>",
          "target": [
            ".ticker-group:nth-child(1) > i:nth-child(6)"
          ],
          "failureSummary": "Fix any of the following:\n  Element content contains only non-text characters"
        }
      ]
    }
  ],
  "violations": [
    {
      "id": "color-contrast",
      "impact": "serious",
      "tags": [
        "cat.color",
        "wcag2aa",
        "wcag143",
        "TTv5",
        "TT13.c",
        "EN-301-549",
        "EN-9.1.4.3",
        "ACT"
      ],
      "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
      "help": "Elements must meet minimum color contrast ratio thresholds",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#67635c",
                "bgColor": "#1b1712",
                "contrastRatio": 2.98,
                "fontSize": "10.1pt (13.5px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"palette-result reveal in\" style=\"--d:.15s\">",
                  "target": [
                    ".palette-result"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.98 (foreground color: #67635c, background color: #1b1712, font size: 10.1pt (13.5px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"swatch-name\">Shade One</span>",
          "target": [
            ".swatch.ph:nth-child(1) > .swatch-name"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.98 (foreground color: #67635c, background color: #1b1712, font size: 10.1pt (13.5px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#514d47",
                "bgColor": "#1b1712",
                "contrastRatio": 2.12,
                "fontSize": "7.9pt (10.5px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"palette-result reveal in\" style=\"--d:.15s\">",
                  "target": [
                    ".palette-result"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.12 (foreground color: #514d47, background color: #1b1712, font size: 7.9pt (10.5px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"swatch-hex\">\u2014 \u2014 \u2014</span>",
          "target": [
            ".swatch.ph:nth-child(1) > .swatch-hex"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.12 (foreground color: #514d47, background color: #1b1712, font size: 7.9pt (10.5px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#67635c",
                "bgColor": "#1b1712",
                "contrastRatio": 2.98,
                "fontSize": "10.1pt (13.5px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"palette-result reveal in\" style=\"--d:.15s\">",
                  "target": [
                    ".palette-result"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.98 (foreground color: #67635c, background color: #1b1712, font size: 10.1pt (13.5px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"swatch-name\">Shade Two</span>",
          "target": [
            ".swatch.ph:nth-child(2) > .swatch-name"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.98 (foreground color: #67635c, background color: #1b1712, font size: 10.1pt (13.5px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#514d47",
                "bgColor": "#1b1712",
                "contrastRatio": 2.12,
                "fontSize": "7.9pt (10.5px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"palette-result reveal in\" style=\"--d:.15s\">",
                  "target": [
                    ".palette-result"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.12 (foreground color: #514d47, background color: #1b1712, font size: 7.9pt (10.5px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"swatch-hex\">\u2014 \u2014 \u2014</span>",
          "target": [
            ".swatch.ph:nth-child(2) > .swatch-hex"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.12 (foreground color: #514d47, background color: #1b1712, font size: 7.9pt (10.5px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#67635c",
                "bgColor": "#1b1712",
                "contrastRatio": 2.98,
                "fontSize": "10.1pt (13.5px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"palette-result reveal in\" style=\"--d:.15s\">",
                  "target": [
                    ".palette-result"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.98 (foreground color: #67635c, background color: #1b1712, font size: 10.1pt (13.5px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"swatch-name\">Shade Three</span>",
          "target": [
            ".swatch.ph:nth-child(3) > .swatch-name"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.98 (foreground color: #67635c, background color: #1b1712, font size: 10.1pt (13.5px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#514d47",
                "bgColor": "#1b1712",
                "contrastRatio": 2.12,
                "fontSize": "7.9pt (10.5px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"palette-result reveal in\" style=\"--d:.15s\">",
                  "target": [
                    ".palette-result"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.12 (foreground color: #514d47, background color: #1b1712, font size: 7.9pt (10.5px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"swatch-hex\">\u2014 \u2014 \u2014</span>",
          "target": [
            ".swatch.ph:nth-child(3) > .swatch-hex"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.12 (foreground color: #514d47, background color: #1b1712, font size: 7.9pt (10.5px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#67635c",
                "bgColor": "#1b1712",
                "contrastRatio": 2.98,
                "fontSize": "10.1pt (13.5px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"palette-result reveal in\" style=\"--d:.15s\">",
                  "target": [
                    ".palette-result"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.98 (foreground color: #67635c, background color: #1b1712, font size: 10.1pt (13.5px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"swatch-name\">Shade Four</span>",
          "target": [
            ".swatch.ph:nth-child(4) > .swatch-name"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.98 (foreground color: #67635c, background color: #1b1712, font size: 10.1pt (13.5px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#514d47",
                "bgColor": "#1b1712",
                "contrastRatio": 2.12,
                "fontSize": "7.9pt (10.5px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"palette-result reveal in\" style=\"--d:.15s\">",
                  "target": [
                    ".palette-result"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.12 (foreground color: #514d47, background color: #1b1712, font size: 7.9pt (10.5px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"swatch-hex\">\u2014 \u2014 \u2014</span>",
          "target": [
            ".swatch.ph:nth-child(4) > .swatch-hex"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.12 (foreground color: #514d47, background color: #1b1712, font size: 7.9pt (10.5px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#67635c",
                "bgColor": "#1b1712",
                "contrastRatio": 2.98,
                "fontSize": "10.1pt (13.5px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"palette-result reveal in\" style=\"--d:.15s\">",
                  "target": [
                    ".palette-result"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.98 (foreground color: #67635c, background color: #1b1712, font size: 10.1pt (13.5px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"swatch-name\">Shade Five</span>",
          "target": [
            ".swatch.ph:nth-child(5) > .swatch-name"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.98 (foreground color: #67635c, background color: #1b1712, font size: 10.1pt (13.5px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#514d47",
                "bgColor": "#1b1712",
                "contrastRatio": 2.12,
                "fontSize": "7.9pt (10.5px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"palette-result reveal in\" style=\"--d:.15s\">",
                  "target": [
                    ".palette-result"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.12 (foreground color: #514d47, background color: #1b1712, font size: 7.9pt (10.5px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"swatch-hex\">\u2014 \u2014 \u2014</span>",
          "target": [
            ".swatch.ph:nth-child(5) > .swatch-hex"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.12 (foreground color: #514d47, background color: #1b1712, font size: 7.9pt (10.5px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#67635c",
                "bgColor": "#1b1712",
                "contrastRatio": 2.98,
                "fontSize": "10.1pt (13.5px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"palette-result reveal in\" style=\"--d:.15s\">",
                  "target": [
                    ".palette-result"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.98 (foreground color: #67635c, background color: #1b1712, font size: 10.1pt (13.5px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"swatch-name\">Shade Six</span>",
          "target": [
            ".swatch.ph:nth-child(6) > .swatch-name"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.98 (foreground color: #67635c, background color: #1b1712, font size: 10.1pt (13.5px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#514d47",
                "bgColor": "#1b1712",
                "contrastRatio": 2.12,
                "fontSize": "7.9pt (10.5px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"palette-result reveal in\" style=\"--d:.15s\">",
                  "target": [
                    ".palette-result"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.12 (foreground color: #514d47, background color: #1b1712, font size: 7.9pt (10.5px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"swatch-hex\">\u2014 \u2014 \u2014</span>",
          "target": [
            ".swatch.ph:nth-child(6) > .swatch-hex"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.12 (foreground color: #514d47, background color: #1b1712, font size: 7.9pt (10.5px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#e8d2ca",
                "bgColor": "#a34a2a",
                "contrastRatio": 4.06,
                "fontSize": "8.3pt (11px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"newsletter\" id=\"newsletter\">",
                  "target": [
                    "#newsletter"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.06 (foreground color: #e8d2ca, background color: #a34a2a, font size: 8.3pt (11px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<div class=\"nl-eyebrow\">The Weekly Dispatch</div>",
          "target": [
            ".nl-eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.06 (foreground color: #e8d2ca, background color: #a34a2a, font size: 8.3pt (11px), font weight: normal). Expected contrast ratio of 4.5:1"
        }
      ]
    }
  ],
  "coverage": {
    "contract": "main-document-vertical-scroll",
    "complete": true,
    "positions": [
      {
        "y": 0,
        "height": 11457
      },
      {
        "y": 564,
        "height": 11445
      },
      {
        "y": 1140,
        "height": 11445
      },
      {
        "y": 1716,
        "height": 11445
      },
      {
        "y": 2292,
        "height": 11445
      },
      {
        "y": 2868,
        "height": 11445
      },
      {
        "y": 3444,
        "height": 11445
      },
      {
        "y": 4020,
        "height": 11445
      },
      {
        "y": 4596,
        "height": 11445
      },
      {
        "y": 5172,
        "height": 11445
      },
      {
        "y": 5748,
        "height": 11445
      },
      {
        "y": 6324,
        "height": 11445
      },
      {
        "y": 6900,
        "height": 11445
      },
      {
        "y": 7476,
        "height": 11445
      },
      {
        "y": 8052,
        "height": 11445
      },
      {
        "y": 8628,
        "height": 11445
      },
      {
        "y": 9204,
        "height": 11445
      },
      {
        "y": 9780,
        "height": 11445
      },
      {
        "y": 10356,
        "height": 11445
      },
      {
        "y": 10725,
        "height": 11445
      }
    ],
    "scans": 21,
    "max_states": 512,
    "settle_ms": 5000,
    "page_timeout_seconds": 150,
    "layout_stability": "consecutive 100ms size samples within one CSS pixel",
    "animation_settling": "finite animations present when scroll resources are ready finish or are cancelled",
    "interactive_states": "not exercised",
    "horizontal_scroll": "not exercised"
  }
}
System Prompt
You are a lead web developer at a top digital agency, tasked with creating a one-page website for a new client based on the given specifications, delivered as an HTML file. First non-whitespace char '<', last non-whitespace char '>'. Use the following services to generate placeholder images where needed:
- placehold.co (text): https://placehold.co/[{w}x{h}|{size}][/{bg-color}/{text-color}]?text={text}&font=[lato|lora|montserrat|noto sans|open sans|oswald|playfair display|poppins|pt sans|raleway|roboto|source sans|source sans pro]
- picsum.photos (photos): https://picsum.photos/[{w}/{h}|{size}]?[grayscale][&blur={1-10}]
- pravatar.cc (avatars): https://i.pravatar.cc/{size}?u={identifier}
Choose sizes appropriate to layout.
User Prompt
Create a **complete, polished, production-quality** primary web page for a new client in the "Style & Fashion" sector.
Your goal is to generate the full HTML code for a page that is not just functional but also visually compelling, content-rich, and feels like a finished product ready for launch.

**Client & Category:**
- Industry: "Style & Fashion"
- Description: Fashion trends, style guides, beauty resources, and clothing inspiration.

**Your Creative Task:**
1.  **Invent:** Create a unique, professional-sounding site name and a strong tagline fitting the "Style & Fashion" category.
2.  **Define Page:** Determine the most effective primary page type (e.g., homepage, service landing page, category portal) to showcase this fictional entity.
3.  **Design:** Develop an opinionated, modern, and professional layout. Make distinct choices about structure and flow.

**Content & Structure Requirements (Deliver a COMPLETE page):**
-   **Overall:** The final page must feel substantial and complete, with realistic amounts of text (multiple paragraphs per section where appropriate, avoid single sentences), well-integrated placeholder images, and logical flow. It should look like a real website a business would proudly use.
-   **HEADER:** Include the invented site name, tagline, a logo placeholder image, and a primary navigation bar. Ensure the navigation has **at least 5-7 clearly defined, relevant links** including: "Collections", "Shop", "Trends".
-   **MAIN CONTENT:** Structure this area with **at least 3-4 distinct, well-developed sections**.
    -   Address key topics relevant to the "Style & Fashion" category. Consider themes similar to: "Designer Spotlights", "Celebrity Style", "Wardrobe Essentials".
    -   **Content Depth:** Populate each section with **substantial, realistic text** (multiple sentences/paragraphs). Use authentic industry language and terminology like: "haute couture", "collection", "silhouette".
    -   **Visuals:** Integrate relevant placeholder images logically within the content sections.
    -   **Calls to Action:** Include clear and contextually relevant CTAs. Use strong verbs similar to: "Follow Designer", "Book Stylist", "Explore Trends".
-   **ENGAGEMENT (Recommended):** Strongly consider incorporating **one meaningful interactive element** that would genuinely benefit a user in the "Style & Fashion" sector. Ideas similar but not limited to: "color matcher".
-   **SIDEBAR (Optional):** If your design includes a sidebar, populate it with **useful, relevant content**. Ideas: "new arrivals", "editor picks", "celebrity looks".
-   **FOOTER:** Include a professional footer with invented contact details, copyright (current year), social media links, and standard links (Privacy, Terms).
-   **MODERN WEB PATTERNS:** Include modern web patterns like testimonial cards, feature grids, or FAQ accordions where appropriate.