Spaces:
Running
Running
| /* Ai fitting room — editorial layout matching the design mock */ | |
| :root { | |
| --black: #000; | |
| --white: #fff; | |
| --paper: #fafafa; | |
| --ink: #111; | |
| --muted: #666; | |
| /* Tony spec: Bodoni 72 + Optima (Apple system fonts), with web fallbacks */ | |
| --serif: "Bodoni 72", "Bodoni Moda", Bodoni, "Didot", "Times New Roman", serif; | |
| --sans: "Optima", "Optima Nova", "Avenir Next", "Avenir", "Lato", | |
| -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; | |
| } | |
| * { box-sizing: border-box; } | |
| html, body { margin: 0; padding: 0; background: var(--paper); color: var(--ink); } | |
| body { font-family: var(--serif); font-size: 18px; line-height: 1.4; } | |
| button { font-family: inherit; cursor: pointer; } | |
| img { max-width: 100%; display: block; } | |
| em { font-style: italic; } | |
| [hidden] { display: none ; } | |
| /* ============================================================ | |
| HERO — desktop: face left, brand+examples stacked right | |
| mobile: brand top, face left, examples right | |
| ============================================================ */ | |
| .hero { | |
| padding: 48px 64px 24px; | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| grid-template-rows: auto auto; | |
| grid-template-areas: | |
| "face brand" | |
| "face examples"; | |
| gap: 24px 48px; | |
| align-items: start; | |
| } | |
| /* ----- brand wordmark ----- */ | |
| .brand-block { | |
| grid-area: brand; | |
| text-align: right; | |
| align-self: start; | |
| } | |
| .brand { | |
| margin: 0; | |
| font-family: var(--serif); | |
| font-weight: 400; | |
| font-size: clamp(56px, 7vw, 96px); | |
| letter-spacing: -0.01em; | |
| line-height: 0.95; | |
| } | |
| .brand-ai { font-style: normal; } | |
| .brand-rest { display: inline-block; } | |
| .brand-byline { | |
| display: inline-block; | |
| margin-top: 10px; | |
| font-family: var(--sans); | |
| font-size: 14px; | |
| letter-spacing: 0.02em; | |
| color: var(--muted); | |
| text-decoration: underline; | |
| text-underline-offset: 3px; | |
| } | |
| .brand-byline:hover { color: var(--ink); } | |
| /* ----- face upload ----- */ | |
| .face-block { | |
| grid-area: face; | |
| display: flex; | |
| justify-content: flex-start; | |
| align-items: stretch; | |
| } | |
| .upload-box { | |
| width: 100%; | |
| max-width: 360px; | |
| aspect-ratio: 4 / 5; | |
| border: 2px dashed var(--ink); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| cursor: pointer; | |
| position: relative; | |
| background: var(--white); | |
| overflow: hidden; | |
| } | |
| .upload-box:hover { background: #f1f1f1; } | |
| .upload-box.has-face { border-style: solid; } | |
| .upload-box.drag-over { background: #e9e9e9; border-color: var(--ink); } | |
| .upload-box input[type="file"] { display: none ; } | |
| /* X button to clear an uploaded/selected face */ | |
| .clear-face { | |
| position: absolute; | |
| top: 8px; | |
| right: 8px; | |
| width: 28px; | |
| height: 28px; | |
| border: none; | |
| background: rgba(0, 0, 0, 0.65); | |
| color: var(--white); | |
| font-family: var(--sans); | |
| font-size: 18px; | |
| line-height: 1; | |
| border-radius: 50%; | |
| cursor: pointer; | |
| display: none; | |
| align-items: center; | |
| justify-content: center; | |
| padding: 0; | |
| z-index: 2; | |
| } | |
| .clear-face:hover { background: rgba(0, 0, 0, 0.85); } | |
| .upload-box.has-face .clear-face { display: flex; } | |
| .upload-prompt { | |
| font-family: var(--sans); | |
| font-size: 13px; | |
| color: var(--muted); | |
| } | |
| #facePreview { width: 100%; height: 100%; object-fit: cover; } | |
| .box-caption { | |
| position: absolute; | |
| left: 50%; | |
| bottom: 14px; | |
| transform: translateX(-50%); | |
| font-family: var(--sans); | |
| font-size: 13px; | |
| color: var(--muted); | |
| pointer-events: none; | |
| } | |
| .upload-box.has-face .box-caption, | |
| .upload-box.has-face .upload-prompt { display: none; } | |
| /* ----- examples ----- */ | |
| .examples { | |
| grid-area: examples; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: flex-end; | |
| gap: 6px; | |
| } | |
| .example-thumbs { display: flex; gap: 12px; } | |
| .example-face { | |
| border: 2px solid transparent; | |
| background: none; | |
| padding: 0; | |
| width: 96px; | |
| height: 96px; | |
| overflow: hidden; | |
| } | |
| .example-face img { width: 100%; height: 100%; object-fit: cover; } | |
| .example-face.selected { border-color: var(--ink); } | |
| .examples-label { | |
| margin: 0; | |
| font-family: var(--sans); | |
| font-size: 14px; | |
| letter-spacing: 0.02em; | |
| color: var(--muted); | |
| } | |
| /* ============================================================ | |
| CLOTHING — single horizontal row of 6 | |
| ============================================================ */ | |
| .clothing-section { padding: 16px 64px; } | |
| .step-label { | |
| margin: 0 0 12px; | |
| font-family: var(--sans); | |
| font-size: 14px; | |
| color: var(--muted); | |
| } | |
| .clothing-row { | |
| display: grid; | |
| grid-template-columns: repeat(6, 1fr); | |
| gap: 8px; | |
| } | |
| .clothing-tile { | |
| border: 3px solid transparent; | |
| background: none; | |
| padding: 0; | |
| aspect-ratio: 3 / 4; | |
| overflow: hidden; | |
| } | |
| .clothing-tile img { width: 100%; height: 100%; object-fit: cover; } | |
| .clothing-tile.selected { border-color: var(--ink); } | |
| /* ============================================================ | |
| GENERATE bar | |
| ============================================================ */ | |
| .generate-bar { | |
| padding: 24px 64px 24px; | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| gap: 16px; | |
| } | |
| #generateBtn { | |
| background: var(--white); | |
| border: 1.5px solid var(--ink); | |
| color: var(--ink); | |
| padding: 10px 36px; | |
| font-family: var(--sans); | |
| font-size: 15px; | |
| letter-spacing: 0.01em; | |
| } | |
| #generateBtn:not(:disabled):hover { background: var(--ink); color: var(--white); } | |
| #generateBtn:disabled { opacity: 0.4; cursor: not-allowed; } | |
| .status { margin: 0; font-size: 13px; color: var(--muted); font-family: var(--sans); } | |
| /* ============================================================ | |
| MARQUEE | |
| ============================================================ */ | |
| .marquee { | |
| background: var(--black); | |
| color: var(--white); | |
| padding: 14px 0; | |
| overflow: hidden; | |
| white-space: nowrap; | |
| font-family: var(--sans); | |
| font-size: 16px; | |
| letter-spacing: 0.04em; | |
| text-transform: lowercase; | |
| } | |
| .marquee-track { | |
| display: inline-flex; | |
| animation: scroll 60s linear infinite; | |
| will-change: transform; | |
| } | |
| .marquee-track > span { padding-right: 40px; } | |
| @keyframes scroll { | |
| from { transform: translateX(0); } | |
| to { transform: translateX(-50%); } | |
| } | |
| /* ============================================================ | |
| OUTPUT — dashed box (left) + lorem copy (right) | |
| ============================================================ */ | |
| .output-section { | |
| padding: 40px 64px 64px; | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| gap: 48px; | |
| align-items: start; | |
| } | |
| .output-frame { display: flex; justify-content: flex-start; } | |
| .output-box { | |
| width: 100%; | |
| max-width: 360px; | |
| aspect-ratio: 4 / 5; | |
| border: 2px dashed var(--ink); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| background: var(--white); | |
| overflow: hidden; | |
| position: relative; | |
| } | |
| .output-box.has-result { border-style: solid; } | |
| .output-box img { width: 100%; height: 100%; object-fit: cover; } | |
| .output-placeholder { | |
| font-family: var(--sans); | |
| font-size: 13px; | |
| color: var(--muted); | |
| } | |
| .output-box.has-result .output-placeholder, | |
| .output-box.has-result .box-caption { display: none; } | |
| .output-copy p { | |
| margin: 0 0 1.2em; | |
| font-family: var(--serif); | |
| font-size: 17px; | |
| line-height: 1.55; | |
| } | |
| /* loading spinner */ | |
| .output-box.loading::after { | |
| content: ""; | |
| width: 28px; | |
| height: 28px; | |
| border: 2px solid #ddd; | |
| border-top-color: var(--ink); | |
| border-radius: 50%; | |
| animation: spin 0.9s linear infinite; | |
| position: absolute; | |
| } | |
| .output-box.loading .output-placeholder, | |
| .output-box.loading .box-caption { display: none; } | |
| @keyframes spin { to { transform: rotate(360deg); } } | |
| /* ============================================================ | |
| MOBILE — brand spans top, then face | examples | |
| ============================================================ */ | |
| @media (max-width: 760px) { | |
| .hero { | |
| padding: 24px 24px 16px; | |
| grid-template-columns: 1fr; | |
| grid-template-areas: | |
| "brand" | |
| "examples" | |
| "face"; | |
| gap: 12px; | |
| } | |
| .brand-block { text-align: left; } | |
| .brand { font-size: clamp(40px, 14vw, 64px); } | |
| .examples { align-items: flex-start; } | |
| .face-block { justify-content: center; } | |
| .upload-box { | |
| width: 100%; | |
| max-width: 260px; | |
| aspect-ratio: 4 / 5; | |
| } | |
| .example-face { width: 72px; height: 72px; } | |
| .example-thumbs { gap: 8px; } | |
| .clothing-section { padding: 12px 24px; } | |
| .clothing-row { grid-template-columns: repeat(3, 1fr); } | |
| .generate-bar { padding: 20px 24px 24px; } | |
| .output-section { | |
| padding: 24px 24px 56px; | |
| grid-template-columns: 1fr; | |
| gap: 24px; | |
| } | |
| .output-box { max-width: 100%; aspect-ratio: 3 / 4; } | |
| } | |