Files
chuan 14e8087aac feat: add design preview site with search and filtering functionality
- Implemented a new web interface for previewing designs, allowing users to search and filter by category.
- Created `app.js` to handle state management, event binding, and rendering of design records.
- Developed `index.html` as the main structure for the design gallery, including search input and design list.
- Added `styles.css` for styling the design gallery and ensuring a responsive layout.
- Updated Rust backend to support site generation, including new commands for building and serving the site.
- Refactored catalog parsing to support new data structure for design entries.
- Enhanced the sync process to collect site records and generate appropriate URLs for previews.
- Introduced a new serving mechanism for the generated site, allowing local previews of designs.
2026-04-20 23:18:02 +08:00

1121 lines
40 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Design System Inspiration of PlayStation</title>
<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=Manrope:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<style>
:root {
--ps-blue: #0070cc;
--ps-blue-dark: #0068bd;
--ps-cyan: #1eaedb;
--link-hover-blue: #1883fd;
--link-dark-blue: #53b1ff;
--commerce-orange: #d53b00;
--commerce-orange-active: #aa2f00;
--warning-red: #c81b3a;
--console-black: #000000;
--shadow-black: #121314;
--canvas: #000000;
--surface: #0d0e10;
--surface-2: #17181b;
--surface-3: #222326;
--paper-white: #ffffff;
--divider-tint: rgba(255, 255, 255, 0.08);
--primary-text: #ffffff;
--secondary-text: #cccccc;
--body-gray: #949494;
--mute-gray: #6b6b6b;
--placeholder-ink: rgba(255, 255, 255, 0.5);
--shadow-feather: rgba(0, 0, 0, 0.4);
--shadow-light: rgba(0, 0, 0, 0.5);
--shadow-mid: rgba(0, 0, 0, 0.7);
--shadow-dramatic: rgba(0, 0, 0, 0.9);
--font-sans: 'Manrope', 'SST', Arial, Helvetica, sans-serif;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
html { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
body {
background: var(--canvas);
color: var(--primary-text);
font-family: var(--font-sans);
font-size: 16px;
font-weight: 400;
line-height: 1.50;
letter-spacing: 0.1px;
}
a { color: inherit; text-decoration: none; transition: color 180ms ease; }
a:hover { color: var(--link-hover-blue); }
button { font-family: inherit; cursor: pointer; border: none; background: none; }
/* NAV */
.nav {
position: sticky; top: 0; z-index: 100;
padding: 16px 48px;
background: var(--canvas);
border-bottom: 1px solid var(--divider-tint);
}
.nav-brand {
font-family: var(--font-sans);
font-size: 20px;
font-weight: 300;
color: var(--primary-text);
letter-spacing: 0.1px;
}
.nav-links {
display: flex; gap: 32px; list-style: none; align-items: center;
}
.nav-links a {
font-family: var(--font-sans);
font-size: 14px;
font-weight: 500;
color: var(--primary-text);
letter-spacing: 0.14px;
}
.nav-cta {
display: inline-block;
background: var(--ps-blue);
color: var(--paper-white);
padding: 10px 22px;
border: none;
border-radius: 999px;
font-family: var(--font-sans);
font-size: 14px;
font-weight: 700;
letter-spacing: 0.324px;
transition: background 180ms ease, transform 180ms ease, box-shadow 180ms ease;
}
.nav-cta:hover {
background: var(--ps-cyan);
transform: scale(1.1);
box-shadow: 0 0 0 2px var(--paper-white), 0 0 0 4px var(--ps-blue);
}
/* HERO */
.hero {
padding: 96px 48px 88px;
background: linear-gradient(180deg, var(--shadow-black) 0%, var(--canvas) 100%);
color: var(--primary-text);
}
.hero-eyebrow {
display: block;
font-family: var(--font-sans);
font-size: 14px;
font-weight: 500;
color: var(--link-dark-blue);
margin-bottom: 20px;
letter-spacing: 0.14px;
}
.hero h1 {
font-family: var(--font-sans);
font-size: 88px;
font-weight: 300;
line-height: 1.10;
letter-spacing: -0.5px;
color: var(--primary-text);
margin-bottom: 28px;
max-width: 1100px;
}
.hero p {
font-family: var(--font-sans);
font-size: 18px;
font-weight: 400;
line-height: 1.50;
letter-spacing: 0.1px;
color: rgba(255, 255, 255, 0.7);
max-width: 680px;
margin-bottom: 44px;
}
.hero-buttons { display: flex; gap: 18px; flex-wrap: wrap; }
/* BUTTONS */
.btn-primary {
display: inline-block;
background: var(--ps-blue);
color: var(--paper-white);
padding: 14px 30px;
border: 2px solid transparent;
border-radius: 999px;
font-family: var(--font-sans);
font-size: 18px;
font-weight: 500;
letter-spacing: 0.4px;
transition: background 180ms ease, transform 180ms ease, box-shadow 180ms ease, border-color 180ms ease;
}
.btn-primary:hover {
background: var(--ps-cyan);
color: var(--paper-white);
border-color: var(--paper-white);
transform: scale(1.1);
box-shadow: 0 0 0 2px var(--ps-blue);
}
.btn-secondary {
display: inline-block;
background: var(--paper-white);
color: var(--ps-blue-dark);
padding: 14px 30px;
border: 2px solid var(--paper-white);
border-radius: 999px;
font-family: var(--font-sans);
font-size: 18px;
font-weight: 500;
letter-spacing: 0.4px;
transition: background 180ms ease, transform 180ms ease, box-shadow 180ms ease, border-color 180ms ease, color 180ms ease;
}
.btn-secondary:hover {
background: var(--ps-cyan);
color: var(--paper-white);
border-color: var(--paper-white);
transform: scale(1.1);
box-shadow: 0 0 0 2px var(--ps-blue);
}
.btn-commerce {
display: inline-block;
background: var(--commerce-orange);
color: var(--paper-white);
padding: 14px 30px;
border: 2px solid transparent;
border-radius: 999px;
font-family: var(--font-sans);
font-size: 18px;
font-weight: 700;
letter-spacing: 0.45px;
transition: background 180ms ease, transform 180ms ease, box-shadow 180ms ease, border-color 180ms ease;
}
.btn-commerce:hover {
background: var(--ps-cyan);
color: var(--paper-white);
border-color: var(--paper-white);
transform: scale(1.1);
box-shadow: 0 0 0 2px var(--ps-blue);
}
.btn-ghost {
display: inline-block;
background: transparent;
color: var(--primary-text);
padding: 12px 24px;
border: 1px solid rgba(255, 255, 255, 0.3);
border-radius: 999px;
font-family: var(--font-sans);
font-size: 14px;
font-weight: 500;
transition: background 180ms ease, transform 180ms ease, box-shadow 180ms ease, color 180ms ease, border-color 180ms ease;
}
.btn-ghost:hover {
background: var(--ps-cyan);
color: var(--paper-white);
border-color: var(--paper-white);
transform: scale(1.1);
box-shadow: 0 0 0 2px var(--ps-blue);
}
.btn-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 44px;
height: 44px;
background: rgba(0, 0, 0, 0.4);
color: var(--primary-text);
border: 1px solid rgba(255, 255, 255, 0.3);
border-radius: 100%;
font-family: var(--font-sans);
font-size: 18px;
font-weight: 500;
transition: background 180ms ease, transform 180ms ease, box-shadow 180ms ease, color 180ms ease, border-color 180ms ease;
}
.btn-icon:hover {
background: var(--ps-cyan);
color: var(--paper-white);
border-color: var(--paper-white);
transform: scale(1.1);
box-shadow: 0 0 0 2px var(--ps-blue);
}
.btn-pill {
display: inline-block;
background: rgba(255, 255, 255, 0.08);
color: var(--primary-text);
padding: 14px 22px;
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 9999px;
font-family: var(--font-sans);
font-size: 14px;
font-weight: 500;
}
/* SECTION FRAME */
section.preview-section {
padding: 96px 48px;
background: var(--canvas);
border-top: 1px solid var(--divider-tint);
}
section.preview-section.mist {
background: linear-gradient(180deg, var(--canvas) 0%, var(--surface) 100%);
}
.section-eyebrow {
display: block;
font-family: var(--font-sans);
font-size: 14px;
font-weight: 500;
color: var(--link-dark-blue);
margin-bottom: 16px;
letter-spacing: 0.14px;
}
.section-title {
font-family: var(--font-sans);
font-size: 54px;
font-weight: 300;
line-height: 1.15;
letter-spacing: -0.1px;
color: var(--primary-text);
margin-bottom: 16px;
}
.section-subtitle {
font-family: var(--font-sans);
font-size: 18px;
font-weight: 400;
line-height: 1.50;
letter-spacing: 0.1px;
color: var(--secondary-text);
margin-bottom: 56px;
max-width: 760px;
}
/* COLOR PALETTE */
.color-group { margin-bottom: 40px; }
.color-group-label {
font-family: var(--font-sans);
font-size: 14px;
font-weight: 700;
color: var(--primary-text);
padding-bottom: 14px;
margin-bottom: 24px;
border-bottom: 1px solid var(--divider-tint);
}
.color-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 24px;
}
.color-swatch {
background: var(--surface-2);
border-radius: 19px;
padding: 0;
overflow: hidden;
border: 1px solid var(--divider-tint);
}
.color-block { height: 150px; }
.color-meta { padding: 22px 24px 24px; }
.color-name {
font-family: var(--font-sans);
font-size: 22px;
font-weight: 300;
line-height: 1.25;
color: var(--primary-text);
letter-spacing: 0.1px;
margin-bottom: 8px;
}
.color-hex {
font-family: var(--font-sans);
font-size: 12px;
font-weight: 500;
color: var(--body-gray);
margin-bottom: 12px;
letter-spacing: 0.5px;
}
.color-role {
font-family: var(--font-sans);
font-size: 14px;
font-weight: 400;
line-height: 1.50;
color: var(--secondary-text);
}
/* TYPOGRAPHY */
.type-row {
display: grid;
grid-template-columns: 260px 1fr;
gap: 40px;
padding: 32px 0;
border-bottom: 1px solid var(--divider-tint);
align-items: baseline;
}
.type-row:last-child { border-bottom: none; }
.type-meta {
font-family: var(--font-sans);
font-size: 12px;
font-weight: 500;
color: var(--body-gray);
line-height: 1.60;
}
.type-meta strong {
display: block;
color: var(--primary-text);
font-weight: 700;
margin-bottom: 8px;
font-size: 14px;
}
.type-sample { color: var(--primary-text); }
/* BUTTONS GRID */
.button-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 24px;
}
.button-cell {
padding: 44px 36px;
border-radius: 24px;
background: var(--surface-2);
border: 1px solid var(--divider-tint);
display: flex;
flex-direction: column;
gap: 24px;
}
.button-cell .label {
font-family: var(--font-sans);
font-size: 14px;
font-weight: 700;
color: var(--secondary-text);
letter-spacing: 0.14px;
}
/* PRODUCT TILE */
.product-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 28px;
}
.product-tile {
background: var(--surface-2);
border-radius: 19px;
overflow: hidden;
border: 1px solid var(--divider-tint);
transition: transform 200ms ease, box-shadow 200ms ease;
}
.product-tile:hover {
transform: translateY(-4px);
box-shadow: 0 12px 28px 0 var(--shadow-dramatic);
}
.product-image {
aspect-ratio: 3 / 4;
background: linear-gradient(135deg, #0070cc 0%, #121314 100%);
border-radius: 12px;
margin: 16px 16px 0;
}
.product-tile.variant-2 .product-image { background: linear-gradient(135deg, #d53b00 0%, #4a1800 100%); }
.product-tile.variant-3 .product-image { background: linear-gradient(135deg, #1eaedb 0%, #0070cc 100%); }
.product-tile.variant-4 .product-image { background: linear-gradient(135deg, #4a00a4 0%, #000000 100%); }
.product-meta {
padding: 20px 22px 22px;
}
.product-platform {
display: inline-block;
font-family: var(--font-sans);
font-size: 12px;
font-weight: 500;
color: var(--secondary-text);
padding: 4px 12px;
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 9999px;
margin-bottom: 12px;
}
.product-title {
font-family: var(--font-sans);
font-size: 18px;
font-weight: 500;
line-height: 1.25;
color: var(--primary-text);
margin-bottom: 16px;
letter-spacing: 0.1px;
}
.product-footer {
display: flex;
justify-content: space-between;
align-items: center;
}
.product-price {
font-family: var(--font-sans);
font-size: 14px;
font-weight: 700;
color: var(--commerce-orange);
letter-spacing: 0.14px;
}
/* FORMS */
.form-stack {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 32px;
max-width: 920px;
}
.form-field { display: flex; flex-direction: column; gap: 10px; }
.form-label {
font-family: var(--font-sans);
font-size: 14px;
font-weight: 700;
color: var(--primary-text);
letter-spacing: 0.14px;
}
.form-input {
background: var(--surface-2);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 3px;
padding: 14px 16px;
font-family: var(--font-sans);
font-size: 16px;
font-weight: 400;
color: var(--primary-text);
outline: none;
transition: border-color 180ms ease, box-shadow 180ms ease;
}
.form-input::placeholder { color: var(--placeholder-ink); }
.form-input.focus { border-color: rgba(255, 255, 255, 0.2); box-shadow: 0 0 0 2px var(--ps-blue); }
.form-input.error { border-color: var(--warning-red); color: #ff6b82; }
.form-error {
font-family: var(--font-sans);
font-size: 12px;
font-weight: 500;
color: #ff6b82;
}
.form-textarea {
min-height: 120px;
resize: vertical;
line-height: 1.5;
}
/* SPACING */
.spacing-row {
display: flex;
align-items: flex-end;
gap: 20px;
flex-wrap: wrap;
}
.spacing-item { display: flex; flex-direction: column; gap: 12px; align-items: flex-start; }
.spacing-block {
background: var(--ps-blue);
height: 72px;
border-radius: 6px;
}
.spacing-label {
font-family: var(--font-sans);
font-size: 12px;
font-weight: 500;
color: var(--secondary-text);
}
/* RADIUS */
.radius-row {
display: flex;
gap: 28px;
flex-wrap: wrap;
align-items: flex-end;
}
.radius-item { display: flex; flex-direction: column; gap: 14px; align-items: center; }
.radius-block {
width: 110px;
height: 110px;
background: var(--ps-blue);
}
.radius-block.r2 { border-radius: 2px; }
.radius-block.r3 { border-radius: 3px; }
.radius-block.r6 { border-radius: 6px; }
.radius-block.r12 { border-radius: 12px; }
.radius-block.r19 { border-radius: 19px; }
.radius-block.r20 { border-radius: 20px; }
.radius-block.r24 { border-radius: 24px; }
.radius-block.r36 { border-radius: 36px; }
.radius-block.r48 { border-radius: 48px; }
.radius-block.r999 { border-radius: 999px; width: 160px; height: 50px; }
.radius-block.rfull { border-radius: 100%; }
.radius-label {
font-family: var(--font-sans);
font-size: 11px;
font-weight: 500;
color: var(--primary-text);
text-align: center;
}
.radius-label small { display: block; color: var(--body-gray); margin-top: 4px; font-weight: 400; font-size: 10px; }
/* ELEVATION */
.elevation-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 24px;
}
.elevation-cell {
padding: 44px 28px;
border-radius: 24px;
background: var(--surface-2);
text-align: center;
min-height: 200px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
gap: 16px;
color: var(--primary-text);
}
.elevation-cell.lvl-0 { border: 1px solid var(--divider-tint); }
.elevation-cell.lvl-1 { box-shadow: 0 5px 9px 0 var(--shadow-feather); }
.elevation-cell.lvl-2 { box-shadow: 0 5px 9px 0 var(--shadow-light); }
.elevation-cell.lvl-3 { box-shadow: 0 5px 9px 0 var(--shadow-mid); }
.elevation-cell.lvl-4 { box-shadow: 0 5px 9px 0 var(--shadow-dramatic); }
.elevation-cell.lvl-5 { box-shadow: 0 0 0 2px var(--ps-blue); }
.elevation-cell.lvl-6 { box-shadow: 0 0 0 2px var(--paper-white); }
.elevation-cell.lvl-7 {
background: linear-gradient(180deg, var(--shadow-black) 0%, var(--canvas) 100%);
color: var(--primary-text);
}
.elevation-cell .label {
font-family: var(--font-sans);
font-size: 14px;
font-weight: 700;
color: inherit;
letter-spacing: 0.14px;
}
.elevation-cell .desc {
font-family: var(--font-sans);
font-size: 13px;
line-height: 1.50;
color: inherit;
opacity: 0.75;
}
/* FOOTER */
.footer {
background: var(--ps-blue);
color: var(--paper-white);
padding: 48px 48px;
font-family: var(--font-sans);
font-size: 14px;
font-weight: 500;
text-align: center;
letter-spacing: 0.14px;
}
.footer a { color: var(--paper-white); }
/* RESPONSIVE */
@media (max-width: 900px) {
.hero { padding: 64px 24px 56px; }
.hero h1 { font-size: 44px; }
.section-title { font-size: 36px; }
section.preview-section { padding: 64px 24px; }
.form-stack { grid-template-columns: 1fr; }
.type-row { grid-template-columns: 1fr; gap: 16px; }
.nav { padding: 12px 20px; }
.nav-links { display: none; }
}
/* getdesign.md nav additions */
.nav-left { display: flex; align-items: center; gap: 20px; }
.nav-brand-link,
.nav-brand-link:link,
.nav-brand-link:visited,
.nav-brand-link:hover,
.nav-brand-link:active { text-decoration: none; color: inherit; }
.nav-github,
.nav-github:link,
.nav-github:visited,
.nav-github:hover,
.nav-github:active {
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 12px;
font-weight: 600;
color: inherit;
text-decoration: none;
padding: 5px 10px;
border: 1px solid rgba(128, 128, 128, 0.3);
border-radius: 6px;
opacity: 0.75;
transition: opacity 200ms ease, border-color 200ms ease;
font-family: inherit;
line-height: 1;
white-space: nowrap;
}
.nav-github:hover { opacity: 1; border-color: rgba(128, 128, 128, 0.55); }
.nav-github svg { display: block; flex-shrink: 0; }
/* getdesign.md nav centering */
.nav { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; }
.nav > .nav-left { justify-self: start; }
.nav > .nav-links { justify-self: center; }
.nav > :last-child { justify-self: end; }
.nav .nav-github { color: #ffffff; border-color: rgba(255, 255, 255, 0.25); }
.nav .nav-github:hover { border-color: rgba(255, 255, 255, 0.5); }
</style>
</head>
<body>
<nav class="nav">
<div class="nav-left">
<a href="https://getdesign.md/" target="_blank" rel="noopener noreferrer" class="nav-brand-link">
<span class="nav-brand">getdesign.md</span>
</a>
<a class="nav-github" href="https://github.com/VoltAgent/awesome-design-md" target="_blank" rel="noopener noreferrer" aria-label="awesome-design-md on GitHub">
<svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2 .37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"/></svg>
awesome-design-md
</a>
</div>
<ul class="nav-links">
<li><a href="#palette">Palette</a></li>
<li><a href="#typography">Type</a></li>
<li><a href="#components">Components</a></li>
<li><a href="#layout">Layout</a></li>
</ul>
<button class="nav-cta">Sign In</button>
</nav>
<section class="hero">
<span class="hero-eyebrow">Design System / Console Retail</span>
<h1>Design System Inspiration of PlayStation</h1>
<p>Quiet-authority display type, cyan hover-scale interactions, and a three-surface channel layout anchored by PlayStation Blue. Generated from DESIGN.md.</p>
<div class="hero-buttons">
<button class="btn-primary">Explore the System</button>
<button class="btn-commerce">Add to Cart</button>
</div>
</section>
<section class="preview-section" id="palette">
<span class="section-eyebrow">Section 01 / Palette</span>
<h2 class="section-title">Color Palette</h2>
<p class="section-subtitle">PlayStation Blue as the anchor, Cyan reserved for hover states, Commerce Orange for purchase moments.</p>
<div class="color-group">
<div class="color-group-label">Primary — Brand Anchor</div>
<div class="color-grid">
<div class="color-swatch">
<div class="color-block" style="background: #0070cc;"></div>
<div class="color-meta">
<div class="color-name">PlayStation Blue</div>
<div class="color-hex">#0070CC</div>
<div class="color-role">The anchor. Primary CTAs, footer, and inline link color.</div>
</div>
</div>
<div class="color-swatch">
<div class="color-block" style="background: #000000;"></div>
<div class="color-meta">
<div class="color-name">Console Black</div>
<div class="color-hex">#000000</div>
<div class="color-role">The masthead and hero canvas — framing hardware like a museum piece.</div>
</div>
</div>
</div>
</div>
<div class="color-group">
<div class="color-group-label">Secondary & Accent</div>
<div class="color-grid">
<div class="color-swatch">
<div class="color-block" style="background: #1eaedb;"></div>
<div class="color-meta">
<div class="color-name">PlayStation Cyan</div>
<div class="color-hex">#1EAEDB</div>
<div class="color-role">The interaction color. Hover, focus, and active states only — never at rest.</div>
</div>
</div>
<div class="color-swatch">
<div class="color-block" style="background: #1883fd;"></div>
<div class="color-meta">
<div class="color-name">Link Hover Blue</div>
<div class="color-hex">#1883FD</div>
<div class="color-role">Brighter variant for inline text-link hover states.</div>
</div>
</div>
<div class="color-swatch">
<div class="color-block" style="background: #53b1ff;"></div>
<div class="color-meta">
<div class="color-name">Dark-Link Blue</div>
<div class="color-hex">#53B1FF</div>
<div class="color-role">Link rest color on dark surfaces.</div>
</div>
</div>
</div>
</div>
<div class="color-group">
<div class="color-group-label">Commerce & Semantic</div>
<div class="color-grid">
<div class="color-swatch">
<div class="color-block" style="background: #d53b00;"></div>
<div class="color-meta">
<div class="color-name">Commerce Orange</div>
<div class="color-hex">#D53B00</div>
<div class="color-role">Reserved for PlayStation Store buy CTAs and price callouts.</div>
</div>
</div>
<div class="color-swatch">
<div class="color-block" style="background: #aa2f00;"></div>
<div class="color-meta">
<div class="color-name">Commerce Orange Active</div>
<div class="color-hex">#AA2F00</div>
<div class="color-role">Pressed state for commerce buttons.</div>
</div>
</div>
<div class="color-swatch">
<div class="color-block" style="background: #c81b3a;"></div>
<div class="color-meta">
<div class="color-name">Warning Red</div>
<div class="color-hex">#C81B3A</div>
<div class="color-role">Form errors and destructive warnings.</div>
</div>
</div>
</div>
</div>
<div class="color-group">
<div class="color-group-label">Surface & Background</div>
<div class="color-grid">
<div class="color-swatch">
<div class="color-block" style="background: #ffffff;"></div>
<div class="color-meta">
<div class="color-name">Paper White</div>
<div class="color-hex">#FFFFFF</div>
<div class="color-role">Primary content canvas for editorial panels.</div>
</div>
</div>
<div class="color-swatch">
<div class="color-block" style="background: #f5f7fa;"></div>
<div class="color-meta">
<div class="color-name">Ice Mist</div>
<div class="color-hex">#F5F7FA</div>
<div class="color-role">Atmospheric end-stop of the light section gradient.</div>
</div>
</div>
<div class="color-swatch">
<div class="color-block" style="background: #121314;"></div>
<div class="color-meta">
<div class="color-name">Shadow Black</div>
<div class="color-hex">#121314</div>
<div class="color-role">Starting anchor of the dark section gradient.</div>
</div>
</div>
<div class="color-swatch">
<div class="color-block" style="background: #f3f3f3;"></div>
<div class="color-meta">
<div class="color-name">Divider Tint</div>
<div class="color-hex">#F3F3F3</div>
<div class="color-role">Quiet horizontal-rule color between content rows.</div>
</div>
</div>
</div>
</div>
<div class="color-group">
<div class="color-group-label">Neutrals & Text</div>
<div class="color-grid">
<div class="color-swatch">
<div class="color-block" style="background: #1f1f1f;"></div>
<div class="color-meta">
<div class="color-name">Deep Charcoal</div>
<div class="color-hex">#1F1F1F</div>
<div class="color-role">Body headlines and link color at rest on light surfaces.</div>
</div>
</div>
<div class="color-swatch">
<div class="color-block" style="background: #6b6b6b;"></div>
<div class="color-meta">
<div class="color-name">Body Gray</div>
<div class="color-hex">#6B6B6B</div>
<div class="color-role">Secondary body text and metadata.</div>
</div>
</div>
<div class="color-swatch">
<div class="color-block" style="background: #cccccc;"></div>
<div class="color-meta">
<div class="color-name">Mute Gray</div>
<div class="color-hex">#CCCCCC</div>
<div class="color-role">Tertiary labels and disabled states.</div>
</div>
</div>
</div>
</div>
</section>
<section class="preview-section mist" id="typography">
<span class="section-eyebrow">Section 02 / Typography</span>
<h2 class="section-title">Typographic Hierarchy</h2>
<p class="section-subtitle">SST weight 300 for display — quiet authority. Weights rise to 500700 only at the UI layer.</p>
<div class="type-row">
<div class="type-meta"><strong>Hero Display XL</strong>SST · 54px / 300 / 1.25 / -0.1px</div>
<div class="type-sample" style="font-family: var(--font-sans); font-size: 54px; font-weight: 300; line-height: 1.25; letter-spacing: -0.1px;">Play has no limits</div>
</div>
<div class="type-row">
<div class="type-meta"><strong>Hero Display L</strong>SST · 44px / 300 / 1.25 / 0.1px</div>
<div class="type-sample" style="font-family: var(--font-sans); font-size: 44px; font-weight: 300; line-height: 1.25; letter-spacing: 0.1px;">Explore the new console</div>
</div>
<div class="type-row">
<div class="type-meta"><strong>Large Display</strong>SST · 35px / 300 / 1.25</div>
<div class="type-sample" style="font-family: var(--font-sans); font-size: 35px; font-weight: 300; line-height: 1.25;">Feature panel headline</div>
</div>
<div class="type-row">
<div class="type-meta"><strong>Mid Display</strong>SST · 28px / 300 / 1.25 / 0.1px</div>
<div class="type-sample" style="font-family: var(--font-sans); font-size: 28px; font-weight: 300; line-height: 1.25; letter-spacing: 0.1px;">Section heading text</div>
</div>
<div class="type-row">
<div class="type-meta"><strong>Compact Display</strong>SST · 22px / 300 / 1.25 / 0.1px</div>
<div class="type-sample" style="font-family: var(--font-sans); font-size: 22px; font-weight: 300; line-height: 1.25; letter-spacing: 0.1px;">Module title — still in light weight</div>
</div>
<div class="type-row">
<div class="type-meta"><strong>UI Heading</strong>SST · 18px / 600 / 1.00</div>
<div class="type-sample" style="font-family: var(--font-sans); font-size: 18px; font-weight: 600; line-height: 1.00;">Tight UI heading</div>
</div>
<div class="type-row">
<div class="type-meta"><strong>Primary Button</strong>SST · 18px / 500 / 1.25 / 0.4px</div>
<div class="type-sample" style="font-family: var(--font-sans); font-size: 18px; font-weight: 500; line-height: 1.25; letter-spacing: 0.4px;">Primary CTA label</div>
</div>
<div class="type-row">
<div class="type-meta"><strong>Emphasized Button</strong>SST · 18px / 700 / 1.25 / 0.45px</div>
<div class="type-sample" style="font-family: var(--font-sans); font-size: 18px; font-weight: 700; line-height: 1.25; letter-spacing: 0.45px;">Buy PlayStation Plus</div>
</div>
<div class="type-row">
<div class="type-meta"><strong>Body Relaxed</strong>SST · 18px / 400 / 1.50 / 0.1px</div>
<div class="type-sample" style="font-family: var(--font-sans); font-size: 18px; font-weight: 400; line-height: 1.50; letter-spacing: 0.1px;">Standard reading body — generous leading for product narrative, with just enough letter-spacing to feel composed without looking designed.</div>
</div>
<div class="type-row">
<div class="type-meta"><strong>Compact Button</strong>SST · 14px / 700 / 1.25 / 0.324px</div>
<div class="type-sample" style="font-family: var(--font-sans); font-size: 14px; font-weight: 700; line-height: 1.25; letter-spacing: 0.324px;">Add to Cart</div>
</div>
<div class="type-row">
<div class="type-meta"><strong>Utility Caption</strong>SST · 14px / 500 / 1.50</div>
<div class="type-sample" style="font-family: var(--font-sans); font-size: 14px; font-weight: 500; line-height: 1.50;">Rated E · PS5 · PS4</div>
</div>
<div class="type-row">
<div class="type-meta"><strong>Micro Caption</strong>SST · 12px / 500 / 1.50</div>
<div class="type-sample" style="font-family: var(--font-sans); font-size: 12px; font-weight: 500; line-height: 1.50;">© 2026 Sony Interactive Entertainment LLC</div>
</div>
</section>
<section class="preview-section" id="components">
<span class="section-eyebrow">Section 03 / Buttons</span>
<h2 class="section-title">Button Variants</h2>
<p class="section-subtitle">Every primary button shares the same hover move: cyan fill, white border, blue ring, scale 1.2×. Hover to see.</p>
<div class="button-grid">
<div class="button-cell">
<span class="label">Primary — Blue Pill</span>
<div><button class="btn-primary">Sign Up</button></div>
</div>
<div class="button-cell">
<span class="label">Secondary — White Pill</span>
<div><button class="btn-secondary">Learn More</button></div>
</div>
<div class="button-cell">
<span class="label">Commerce — Orange Pill</span>
<div><button class="btn-commerce">Buy Now $69.99</button></div>
</div>
<div class="button-cell">
<span class="label">Ghost — Transparent</span>
<div><button class="btn-ghost">Filter Results</button></div>
</div>
<div class="button-cell">
<span class="label">Icon Circle — 100%</span>
<div><button class="btn-icon"></button></div>
</div>
<div class="button-cell">
<span class="label">Neutral Pill Tag</span>
<div><span class="btn-pill">PS5</span></div>
</div>
</div>
</section>
<section class="preview-section mist">
<span class="section-eyebrow">Section 04 / Product Tiles</span>
<h2 class="section-title">Game Cover Grid</h2>
<p class="section-subtitle">3:4 cover art in 12px rounded frames, feather-weight elevation, commerce-orange prices.</p>
<div class="product-grid">
<div class="product-tile">
<div class="product-image"></div>
<div class="product-meta">
<span class="product-platform">PS5</span>
<h3 class="product-title">Astro Bot — Galaxy Edition</h3>
<div class="product-footer">
<span class="product-price">$69.99</span>
<button class="btn-primary" style="font-size: 14px; padding: 8px 18px;">Buy</button>
</div>
</div>
</div>
<div class="product-tile variant-2">
<div class="product-image"></div>
<div class="product-meta">
<span class="product-platform">PS5 · PS4</span>
<h3 class="product-title">Horizon Forbidden West</h3>
<div class="product-footer">
<span class="product-price">$49.99</span>
<button class="btn-primary" style="font-size: 14px; padding: 8px 18px;">Buy</button>
</div>
</div>
</div>
<div class="product-tile variant-3">
<div class="product-image"></div>
<div class="product-meta">
<span class="product-platform">PS5</span>
<h3 class="product-title">Rift Apart: Beyond Dimensions</h3>
<div class="product-footer">
<span class="product-price">$39.99</span>
<button class="btn-primary" style="font-size: 14px; padding: 8px 18px;">Buy</button>
</div>
</div>
</div>
<div class="product-tile variant-4">
<div class="product-image"></div>
<div class="product-meta">
<span class="product-platform">PSVR2</span>
<h3 class="product-title">Synthwave Odyssey VR</h3>
<div class="product-footer">
<span class="product-price">$29.99</span>
<button class="btn-primary" style="font-size: 14px; padding: 8px 18px;">Buy</button>
</div>
</div>
</div>
</div>
</section>
<section class="preview-section">
<span class="section-eyebrow">Section 05 / Forms</span>
<h2 class="section-title">Inputs & Newsletter</h2>
<p class="section-subtitle">Tight 3px radius inputs — the one place PlayStation gets genuinely compact. Focus uses a 2px blue ring.</p>
<div class="form-stack">
<div class="form-field">
<label class="form-label">Email — Default</label>
<input class="form-input" type="email" placeholder="player@playstation.com">
</div>
<div class="form-field">
<label class="form-label">Email — Focus</label>
<input class="form-input focus" type="email" placeholder="player@playstation.com">
</div>
<div class="form-field">
<label class="form-label">Email — Error</label>
<input class="form-input error" type="email" value="not-an-email">
<span class="form-error">Please enter a valid email address</span>
</div>
<div class="form-field">
<label class="form-label">Message — Textarea</label>
<textarea class="form-input form-textarea" placeholder="Share your thoughts..."></textarea>
</div>
</div>
</section>
<section class="preview-section mist" id="layout">
<span class="section-eyebrow">Section 06 / Spacing</span>
<h2 class="section-title">Spacing Scale (8px System)</h2>
<p class="section-subtitle">Fine micro-scale (15px) for pills, editorial scale (1221px) for the grid.</p>
<div class="spacing-row">
<div class="spacing-item"><div class="spacing-block" style="width: 1px;"></div><span class="spacing-label">1px</span></div>
<div class="spacing-item"><div class="spacing-block" style="width: 2px;"></div><span class="spacing-label">2px</span></div>
<div class="spacing-item"><div class="spacing-block" style="width: 5px;"></div><span class="spacing-label">5px</span></div>
<div class="spacing-item"><div class="spacing-block" style="width: 8px;"></div><span class="spacing-label">8px · base</span></div>
<div class="spacing-item"><div class="spacing-block" style="width: 10px;"></div><span class="spacing-label">10px</span></div>
<div class="spacing-item"><div class="spacing-block" style="width: 12px;"></div><span class="spacing-label">12px</span></div>
<div class="spacing-item"><div class="spacing-block" style="width: 14px;"></div><span class="spacing-label">14px</span></div>
<div class="spacing-item"><div class="spacing-block" style="width: 16px;"></div><span class="spacing-label">16px</span></div>
<div class="spacing-item"><div class="spacing-block" style="width: 18px;"></div><span class="spacing-label">18px</span></div>
<div class="spacing-item"><div class="spacing-block" style="width: 20px;"></div><span class="spacing-label">20px</span></div>
<div class="spacing-item"><div class="spacing-block" style="width: 21px;"></div><span class="spacing-label">21px</span></div>
</div>
</section>
<section class="preview-section">
<span class="section-eyebrow">Section 07 / Radius</span>
<h2 class="section-title">Border Radius Scale</h2>
<p class="section-subtitle">Eleven discrete radii — from 2px utility UI to 999px full-pill CTAs.</p>
<div class="radius-row">
<div class="radius-item">
<div class="radius-block r2"></div>
<span class="radius-label">2px<small>Admin UI</small></span>
</div>
<div class="radius-item">
<div class="radius-block r3"></div>
<span class="radius-label">3px<small>Inputs, tabs</small></span>
</div>
<div class="radius-item">
<div class="radius-block r6"></div>
<span class="radius-label">6px<small>Compact buttons</small></span>
</div>
<div class="radius-item">
<div class="radius-block r12"></div>
<span class="radius-label">12px<small>Media, figures</small></span>
</div>
<div class="radius-item">
<div class="radius-block r19"></div>
<span class="radius-label">19px<small>Feature cards</small></span>
</div>
<div class="radius-item">
<div class="radius-block r24"></div>
<span class="radius-label">24px<small>Hero cards</small></span>
</div>
<div class="radius-item">
<div class="radius-block r36"></div>
<span class="radius-label">36px<small>Secondary pills</small></span>
</div>
<div class="radius-item">
<div class="radius-block r48"></div>
<span class="radius-label">48px<small>Feature buttons</small></span>
</div>
<div class="radius-item">
<div class="radius-block r999"></div>
<span class="radius-label">999px<small>Primary pill</small></span>
</div>
<div class="radius-item">
<div class="radius-block rfull"></div>
<span class="radius-label">100%<small>Icon circles</small></span>
</div>
</div>
</section>
<section class="preview-section mist">
<span class="section-eyebrow">Section 08 / Elevation</span>
<h2 class="section-title">Depth & Elevation</h2>
<p class="section-subtitle">Shadow opacity lands on 0.06 / 0.08 / 0.16 / 0.8 — whispered or shouted, never muttered.</p>
<div class="elevation-grid">
<div class="elevation-cell lvl-0">
<span class="label">Level 0</span>
<div class="desc">Border only — divider tint</div>
</div>
<div class="elevation-cell lvl-1">
<span class="label">Level 1</span>
<div class="desc">Feather-weight shadow</div>
</div>
<div class="elevation-cell lvl-2">
<span class="label">Level 2</span>
<div class="desc">Standard tile elevation</div>
</div>
<div class="elevation-cell lvl-3">
<span class="label">Level 3</span>
<div class="desc">Emphasized active state</div>
</div>
<div class="elevation-cell lvl-4">
<span class="label">Level 4</span>
<div class="desc">Dramatic hero drop</div>
</div>
<div class="elevation-cell lvl-5">
<span class="label">Level 5</span>
<div class="desc">2px #0070CC focus ring</div>
</div>
<div class="elevation-cell lvl-6">
<span class="label">Level 6</span>
<div class="desc">2px white hover ring</div>
</div>
<div class="elevation-cell lvl-7">
<span class="label">Level 7</span>
<div class="desc">Dark gradient hero surface</div>
</div>
</div>
</section>
<footer class="footer">Maintained by <a href="https://github.com/VoltAgent/voltagent" target="_blank" rel="noopener noreferrer" style="text-decoration:none;"><img src="https://github.com/VoltAgent.png?size=32" alt="VoltAgent" width="14" height="14" style="border-radius:3px;vertical-align:-2px;margin-right:3px;">VoltAgent</a> team</footer>
</body>
</html>