This commit is contained in:
2026-05-18 05:01:36 -06:00
parent 783359af98
commit cf09b8dd08
11 changed files with 1313 additions and 54 deletions

View File

@@ -0,0 +1,135 @@
<h2>3 Concrete Approaches</h2>
<p class="subtitle">All share: Dracula bg (#282a36), dot matrix texture, rounded soft cards. They differ in accent color strategy.</p>
<style>
/* Shared base */
.mockup-wrap {
font-family: ui-monospace, 'JetBrains Mono', 'Fira Code', monospace;
background: #282a36;
background-image: radial-gradient(circle, rgba(98,114,164,0.55) 1px, transparent 1px);
background-size: 20px 20px;
border-radius: 10px;
padding: 18px 16px 14px;
margin-top: 12px;
}
.mockup-title {
text-align: center;
font-size: 15px;
font-weight: 700;
letter-spacing: 0.04em;
margin-bottom: 12px;
text-transform: uppercase;
}
.mockup-cards {
display: flex;
gap: 8px;
justify-content: center;
}
.mc {
width: 120px;
padding: 10px 11px;
border-radius: 8px;
font-size: 11px;
}
.mc h5 { margin: 0 0 4px; font-size: 11px; }
.mc p { margin: 0; font-size: 10px; opacity: 0.6; line-height: 1.4; }
/* ── Approach A: Purple Focus ── */
.a-title {
background: linear-gradient(90deg, #bd93f9 0%, #ff79c6 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.a-title::after { content: " ▌"; -webkit-text-fill-color: #bd93f9; animation: blink 1s step-end infinite; }
@keyframes blink { 50% { opacity: 0; } }
.a-card {
background: #313244;
border: 1px solid #44475a;
box-shadow: 0 4px 14px rgba(0,0,0,0.4);
color: #f8f8f2;
}
.a-card h5 { color: #bd93f9; }
/* ── Approach B: Cyan Dev ── */
.b-title { color: #8be9fd; text-shadow: 0 0 12px rgba(139,233,253,0.5); }
.b-title::after { content: " ▌"; animation: blink 1s step-end infinite; }
.b-card {
background: #313244;
border: 1px solid #44475a;
border-left: 2px solid #8be9fd;
box-shadow: 0 4px 14px rgba(0,0,0,0.4);
color: #f8f8f2;
}
.b-card h5 { color: #8be9fd; }
/* ── Approach C: Multi-accent ── */
.c-title {
background: linear-gradient(90deg, #ff79c6 0%, #bd93f9 33%, #8be9fd 66%, #50fa7b 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.c-card {
background: #313244;
border: 1px solid #44475a;
box-shadow: 0 4px 14px rgba(0,0,0,0.4);
color: #f8f8f2;
}
.c-card-1 { border-top: 2px solid #ff79c6; }
.c-card-1 h5 { color: #ff79c6; }
.c-card-2 { border-top: 2px solid #bd93f9; }
.c-card-2 h5 { color: #bd93f9; }
.c-card-3 { border-top: 2px solid #8be9fd; }
.c-card-3 h5 { color: #8be9fd; }
</style>
<div class="options">
<div class="option" data-choice="purple" onclick="toggleSelect(this)">
<div class="letter">A</div>
<div class="content">
<h3>Purple Focus <span style="font-size:11px;opacity:0.6;font-weight:normal">(recommended)</span></h3>
<p>#bd93f9 mauve as the single accent. Gradient title (purple→pink). Clean card hover with purple glow. Cohesive and refined.</p>
<div class="mockup-wrap">
<div class="mockup-title a-title">IoT Learning</div>
<div class="mockup-cards">
<div class="mc a-card"><h5>OJ Platform</h5><p>Online judge</p></div>
<div class="mc a-card"><h5>Code Runner</h5><p>Run snippets</p></div>
<div class="mc a-card"><h5>Textbooks</h5><p>Reference books</p></div>
</div>
</div>
</div>
</div>
<div class="option" data-choice="cyan" onclick="toggleSelect(this)">
<div class="letter">B</div>
<div class="content">
<h3>Cyan Dev</h3>
<p>#8be9fd cyan as accent. Glowing title, left-border accent on cards. Closer to the old terminal vibe — just upgraded. More "code editor", less "app".</p>
<div class="mockup-wrap">
<div class="mockup-title b-title">IoT Learning</div>
<div class="mockup-cards">
<div class="mc b-card"><h5>OJ Platform</h5><p>Online judge</p></div>
<div class="mc b-card"><h5>Code Runner</h5><p>Run snippets</p></div>
<div class="mc b-card"><h5>Textbooks</h5><p>Reference books</p></div>
</div>
</div>
</div>
</div>
<div class="option" data-choice="multi" onclick="toggleSelect(this)">
<div class="letter">C</div>
<div class="content">
<h3>Multi-Accent Rainbow</h3>
<p>Each card gets a different Dracula color top border (pink, purple, cyan…). Title uses all colors. Most colorful — looks like syntax highlighting applied to the UI.</p>
<div class="mockup-wrap">
<div class="mockup-title c-title">IoT Learning</div>
<div class="mockup-cards">
<div class="mc c-card c-card-1"><h5>OJ Platform</h5><p>Online judge</p></div>
<div class="mc c-card c-card-2"><h5>Code Runner</h5><p>Run snippets</p></div>
<div class="mc c-card c-card-3"><h5>Textbooks</h5><p>Reference books</p></div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,98 @@
<h2>Background Treatment</h2>
<p class="subtitle">The background sets the whole mood. All options use Dracula's base color (#282a36) as the foundation.</p>
<style>
.bg-preview {
width: 100%;
height: 110px;
border-radius: 8px;
margin-top: 10px;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
}
.bg-label {
font-family: ui-monospace, monospace;
font-size: 11px;
color: rgba(248,248,242,0.5);
letter-spacing: 0.08em;
}
/* A: flat clean */
.bg-flat {
background: #282a36;
}
/* B: radial aurora glow */
.bg-aurora {
background: #282a36;
background-image:
radial-gradient(ellipse at 20% 30%, rgba(189,147,249,0.18) 0%, transparent 55%),
radial-gradient(ellipse at 80% 70%, rgba(255,121,198,0.12) 0%, transparent 50%),
radial-gradient(ellipse at 55% 90%, rgba(139,233,253,0.08) 0%, transparent 45%);
}
/* C: subtle grid */
.bg-grid {
background: #282a36;
background-image:
linear-gradient(rgba(68,71,90,0.4) 1px, transparent 1px),
linear-gradient(90deg, rgba(68,71,90,0.4) 1px, transparent 1px);
background-size: 24px 24px;
}
/* D: dot matrix */
.bg-dots {
background: #282a36;
background-image: radial-gradient(circle, rgba(98,114,164,0.5) 1px, transparent 1px);
background-size: 20px 20px;
}
</style>
<div class="options">
<div class="option" data-choice="flat" onclick="toggleSelect(this)">
<div class="letter">A</div>
<div class="content">
<h3>Flat & Clean</h3>
<p>Pure #282a36, no texture. Maximum focus on content. Closest to how most Dracula apps look.</p>
<div class="bg-preview bg-flat">
<span class="bg-label">#282a36 — pure</span>
</div>
</div>
</div>
<div class="option" data-choice="aurora" onclick="toggleSelect(this)">
<div class="letter">B</div>
<div class="content">
<h3>Aurora Glow</h3>
<p>Subtle radial gradients using Dracula's purple, pink, and cyan — like a soft aurora bleeding through the dark. Gives depth without noise.</p>
<div class="bg-preview bg-aurora">
<span class="bg-label">radial glows — purple / pink / cyan</span>
</div>
</div>
</div>
<div class="option" data-choice="grid" onclick="toggleSelect(this)">
<div class="letter">C</div>
<div class="content">
<h3>Subtle Grid</h3>
<p>Faint 24px grid overlay on the dark background. Keeps a technical/terminal feel while the cards are soft. Nod to graph paper or circuit boards.</p>
<div class="bg-preview bg-grid">
<span class="bg-label">24px grid — #44475a lines</span>
</div>
</div>
</div>
<div class="option" data-choice="dots" onclick="toggleSelect(this)">
<div class="letter">D</div>
<div class="content">
<h3>Dot Matrix</h3>
<p>Subtle dot pattern — evokes old terminal screens and LED matrices. Quiet texture, doesn't compete with content.</p>
<div class="bg-preview bg-dots">
<span class="bg-label">20px dot grid — comment color dots</span>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,36 @@
<h2>Terminal Theme — Redesign Direction</h2>
<p class="subtitle">The current theme is functional but sparse: green-on-black, square borders, blinking cursor. Which direction feels right?</p>
<div class="options">
<div class="option" data-choice="crt" onclick="toggleSelect(this)">
<div class="letter">A</div>
<div class="content">
<h3>CRT Phosphor Glow</h3>
<p>Keep the green palette but push the retro CRT aesthetic much further — stronger scanlines, phosphor bloom on text, vignette darkening at corners, subtle screen curvature illusion. Very nostalgic, visually rich.</p>
</div>
</div>
<div class="option" data-choice="bios" onclick="toggleSelect(this)">
<div class="letter">B</div>
<div class="content">
<h3>Retro BIOS / DOS Amber</h3>
<p>Shift the palette from green to amber/orange (#ffb000) — the classic monochrome phosphor of early PCs. Or go full IBM-BIOS blue (dark blue bg, bright white text, cyan highlights). A completely different retro personality.</p>
</div>
</div>
<div class="option" data-choice="modern" onclick="toggleSelect(this)">
<div class="letter">C</div>
<div class="content">
<h3>Modern Terminal (Dracula / Catppuccin)</h3>
<p>Inspired by popular terminal themes (Dracula, Catppuccin Mocha, One Dark). Multiple accent colors, not just green — purple, cyan, pink, yellow all used. Clean, developer-aesthetic, but rich with color. Less "retro", more "everyday dev tool".</p>
</div>
</div>
<div class="option" data-choice="matrix" onclick="toggleSelect(this)">
<div class="letter">D</div>
<div class="content">
<h3>Matrix / Hacker Aesthetic</h3>
<p>Stay green but add drama — cascading character rain animation in the background (subtle, faint), stronger glow effects, maybe ASCII art borders on cards. Very cinematic, very "movie hacker screen".</p>
</div>
</div>
</div>

View File

@@ -0,0 +1,232 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Terminal Theme — Full Mockup</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: ui-monospace, 'JetBrains Mono', 'Fira Code', monospace;
background: #282a36;
background-image: radial-gradient(circle, rgba(98,114,164,0.55) 1px, transparent 1px);
background-size: 20px 20px;
min-height: 100vh;
color: #f8f8f2;
letter-spacing: 0.01em;
}
/* Controls */
.controls {
position: fixed;
top: 20px;
right: 20px;
display: flex;
gap: 10px;
align-items: center;
z-index: 100;
}
.ctrl-btn {
height: 44px;
padding: 0 16px;
background: rgba(40,42,54,0.92);
border: 1px solid #44475a;
border-radius: 8px;
color: #f8f8f2;
font-family: inherit;
font-size: 13px;
cursor: pointer;
display: flex;
align-items: center;
gap: 6px;
transition: all 0.2s;
min-width: 118px;
justify-content: center;
}
.ctrl-btn:hover {
border-color: #bd93f9;
color: #bd93f9;
background: rgba(189,147,249,0.08);
}
.ctrl-icon {
width: 44px;
height: 44px;
padding: 0;
min-width: unset;
justify-content: center;
opacity: 0.4;
cursor: not-allowed;
}
.ctrl-icon:hover { border-color: #44475a; color: #f8f8f2; background: rgba(40,42,54,0.92); }
.chevron { opacity: 0.6; font-size: 10px; }
/* Main */
.main {
display: flex;
flex-direction: column;
align-items: center;
padding: 5rem 2rem 2rem;
}
/* Title */
.title {
font-size: 2.5rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
background: linear-gradient(90deg, #bd93f9 0%, #ff79c6 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 1rem;
text-align: center;
}
.title-cursor {
-webkit-text-fill-color: #bd93f9;
animation: blink 1s step-end infinite;
}
@keyframes blink { 50% { opacity: 0; } }
/* Description */
.description {
color: #6272a4;
font-size: 1.1rem;
margin-bottom: 3rem;
text-align: center;
}
/* Grid */
.grid {
display: flex;
flex-wrap: wrap;
gap: 1rem;
justify-content: center;
max-width: 860px;
}
/* Cards */
.card {
width: 260px;
padding: 1.5rem;
background: #313244;
border: 1px solid #44475a;
border-radius: 10px;
box-shadow: 0 4px 16px rgba(0,0,0,0.45);
transition: all 0.2s ease;
cursor: pointer;
text-decoration: none;
color: inherit;
display: block;
}
.card:hover {
border-color: #bd93f9;
box-shadow:
0 0 0 1px rgba(189,147,249,0.25),
0 8px 28px rgba(189,147,249,0.15),
0 4px 12px rgba(0,0,0,0.5);
transform: translateY(-2px);
}
.card.pin { background: #383a4a; }
.card h2 {
font-size: 1rem;
font-weight: 600;
color: #f8f8f2;
margin-bottom: 0.5rem;
transition: color 0.2s;
}
.card:hover h2 { color: #bd93f9; }
.card p {
font-size: 0.85rem;
color: #6272a4;
line-height: 1.6;
}
.card:hover p { color: #cdd6f4; }
/* Beian */
.beian {
margin: 2rem 0 1.5rem;
color: #6272a4;
font-size: 13px;
text-align: center;
}
.beian a { color: #6272a4; text-decoration: none; transition: color 0.2s; }
.beian a:hover { color: #bd93f9; }
/* Annotation layer */
.annotation {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: rgba(30,32,43,0.97);
border-top: 1px solid #44475a;
padding: 14px 24px;
font-size: 12px;
color: #6272a4;
display: flex;
gap: 24px;
flex-wrap: wrap;
font-family: ui-monospace, monospace;
z-index: 200;
}
.ann-item { display: flex; align-items: center; gap: 8px; }
.swatch { width: 12px; height: 12px; border-radius: 2px; display: inline-block; flex-shrink: 0; }
</style>
</head>
<body>
<div class="controls">
<button class="ctrl-btn">Terminal <span class="chevron"></span></button>
<button class="ctrl-btn ctrl-icon"></button>
</div>
<div class="main">
<h1 class="title">IoT Learning<span class="title-cursor"></span></h1>
<p class="description">// your gateway to embedded systems & IoT resources</p>
<div class="grid">
<a class="card pin" href="#">
<h2>OJ Platform</h2>
<p>Online judge — submit and test your code against real problems</p>
</a>
<a class="card" href="#">
<h2>Code Runner</h2>
<p>Instant code execution in-browser for quick experiments</p>
</a>
<a class="card" href="#">
<h2>Reference Books</h2>
<p>Curated textbooks and documentation for IoT & embedded dev</p>
</a>
<a class="card" href="#">
<h2>Video Lectures</h2>
<p>Course recordings and tutorials from the lab</p>
</a>
<a class="card" href="#">
<h2>Arduino Docs</h2>
<p>Official Arduino reference and community guides</p>
</a>
<a class="card" href="#">
<h2>Forum</h2>
<p>Ask questions, share projects with classmates</p>
</a>
</div>
<div class="beian">
<a href="#">备案号 12345678</a> &nbsp;·&nbsp; <a href="#">粤ICP备XXXXXXXX号</a>
</div>
</div>
<!-- Color annotations at bottom -->
<div class="annotation">
<div class="ann-item"><span class="swatch" style="background:#282a36;border:1px solid #44475a"></span> bg #282a36</div>
<div class="ann-item"><span class="swatch" style="background:#313244"></span> card #313244</div>
<div class="ann-item"><span class="swatch" style="background:#44475a"></span> border #44475a</div>
<div class="ann-item"><span class="swatch" style="background:#bd93f9"></span> accent #bd93f9</div>
<div class="ann-item"><span class="swatch" style="background:#ff79c6"></span> pink #ff79c6</div>
<div class="ann-item"><span class="swatch" style="background:#6272a4"></span> muted #6272a4</div>
<div class="ann-item"><span class="swatch" style="background:#f8f8f2"></span> fg #f8f8f2</div>
<div class="ann-item" style="margin-left:auto">hover a card to preview interaction →</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,86 @@
<h2>Which Palette?</h2>
<p class="subtitle">Modern terminal themes each have a distinct personality. Which palette should drive the redesign?</p>
<style>
.swatch-row { display: flex; gap: 6px; margin: 10px 0 6px; flex-wrap: wrap; }
.swatch { width: 28px; height: 28px; border-radius: 4px; display: inline-block; }
.palette-preview {
font-family: ui-monospace, 'JetBrains Mono', monospace;
font-size: 12px;
padding: 10px 14px;
border-radius: 8px;
margin-top: 8px;
line-height: 1.6;
}
</style>
<div class="options">
<div class="option" data-choice="dracula" onclick="toggleSelect(this)">
<div class="letter">A</div>
<div class="content">
<h3>Dracula</h3>
<p>Dark purple background, vibrant pink/cyan/green accents. The most iconic dark theme — moody yet colorful.</p>
<div class="swatch-row">
<span class="swatch" style="background:#282a36" title="Background"></span>
<span class="swatch" style="background:#44475a" title="Current Line"></span>
<span class="swatch" style="background:#ff79c6" title="Pink"></span>
<span class="swatch" style="background:#8be9fd" title="Cyan"></span>
<span class="swatch" style="background:#50fa7b" title="Green"></span>
<span class="swatch" style="background:#bd93f9" title="Purple"></span>
<span class="swatch" style="background:#ffb86c" title="Orange"></span>
<span class="swatch" style="background:#f1fa8c" title="Yellow"></span>
</div>
<div class="palette-preview" style="background:#282a36;color:#f8f8f2">
<span style="color:#ff79c6">fn</span> <span style="color:#50fa7b">visit</span>(<span style="color:#8be9fd">url</span>: <span style="color:#bd93f9">str</span>) {<br>
&nbsp;&nbsp;<span style="color:#ffb86c">// navigate to resource</span><br>
}
</div>
</div>
</div>
<div class="option" data-choice="catppuccin" onclick="toggleSelect(this)">
<div class="letter">B</div>
<div class="content">
<h3>Catppuccin Mocha</h3>
<p>Warm, desaturated dark background with soft pastel accents. Gentle on the eyes, cozy and modern.</p>
<div class="swatch-row">
<span class="swatch" style="background:#1e1e2e" title="Base"></span>
<span class="swatch" style="background:#313244" title="Surface0"></span>
<span class="swatch" style="background:#f38ba8" title="Red"></span>
<span class="swatch" style="background:#89dceb" title="Sky"></span>
<span class="swatch" style="background:#a6e3a1" title="Green"></span>
<span class="swatch" style="background:#cba6f7" title="Mauve"></span>
<span class="swatch" style="background:#fab387" title="Peach"></span>
<span class="swatch" style="background:#f9e2af" title="Yellow"></span>
</div>
<div class="palette-preview" style="background:#1e1e2e;color:#cdd6f4">
<span style="color:#f38ba8">fn</span> <span style="color:#a6e3a1">visit</span>(<span style="color:#89dceb">url</span>: <span style="color:#cba6f7">str</span>) {<br>
&nbsp;&nbsp;<span style="color:#fab387">// navigate to resource</span><br>
}
</div>
</div>
</div>
<div class="option" data-choice="tokyonight" onclick="toggleSelect(this)">
<div class="letter">C</div>
<div class="content">
<h3>Tokyo Night</h3>
<p>Deep blue-navy background, electric blue and magenta highlights. Calm, cool, city-at-night aesthetic.</p>
<div class="swatch-row">
<span class="swatch" style="background:#1a1b26" title="Background"></span>
<span class="swatch" style="background:#24283b" title="Surface"></span>
<span class="swatch" style="background:#f7768e" title="Red"></span>
<span class="swatch" style="background:#7dcfff" title="Cyan"></span>
<span class="swatch" style="background:#9ece6a" title="Green"></span>
<span class="swatch" style="background:#bb9af7" title="Purple"></span>
<span class="swatch" style="background:#ff9e64" title="Orange"></span>
<span class="swatch" style="background:#e0af68" title="Yellow"></span>
</div>
<div class="palette-preview" style="background:#1a1b26;color:#c0caf5">
<span style="color:#f7768e">fn</span> <span style="color:#9ece6a">visit</span>(<span style="color:#7dcfff">url</span>: <span style="color:#bb9af7">str</span>) {<br>
&nbsp;&nbsp;<span style="color:#ff9e64">// navigate to resource</span><br>
}
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,106 @@
<h2>Dracula — How Far to Lean Into "Terminal"?</h2>
<p class="subtitle">Same palette, different personality. Which card style feels right?</p>
<style>
.preview-grid {
display: flex;
gap: 20px;
margin-top: 16px;
flex-wrap: wrap;
justify-content: center;
}
.preview-card-wrap { display: flex; flex-direction: column; align-items: center; gap: 10px; }
.preview-card-wrap .label { font-size: 11px; text-transform: uppercase; letter-spacing: 0.1em; opacity: 0.6; }
/* Style A: still terminal — square, monospace, minimal */
.card-terminal {
width: 200px;
padding: 16px;
font-family: ui-monospace, 'JetBrains Mono', monospace;
background: transparent;
border: 1px solid rgba(80,250,123,0.4);
color: #f8f8f2;
font-size: 13px;
}
.card-terminal h4 { margin: 0 0 6px; color: #50fa7b; font-size: 13px; text-transform: uppercase; letter-spacing: 0.06em; }
.card-terminal p { margin: 0; color: #6272a4; font-size: 12px; }
.card-terminal:hover { background: rgba(80,250,123,0.06); border-color: #50fa7b; }
/* Style B: soft modern — rounded, card bg, subtle */
.card-modern {
width: 200px;
padding: 16px;
font-family: ui-monospace, 'JetBrains Mono', monospace;
background: #313244;
border: 1px solid #44475a;
border-radius: 10px;
color: #f8f8f2;
font-size: 13px;
box-shadow: 0 4px 16px rgba(0,0,0,0.4);
}
.card-modern h4 { margin: 0 0 6px; color: #bd93f9; font-size: 13px; }
.card-modern p { margin: 0; color: #6272a4; font-size: 12px; }
/* Style C: vibrant accented — colored top border, gradient glow */
.card-vibrant {
width: 200px;
padding: 16px;
font-family: ui-monospace, 'JetBrains Mono', monospace;
background: #282a36;
border: 1px solid #44475a;
border-top: 2px solid #ff79c6;
border-radius: 0 0 8px 8px;
color: #f8f8f2;
font-size: 13px;
box-shadow: 0 0 0 1px rgba(255,121,198,0.08), 0 8px 24px rgba(0,0,0,0.5);
}
.card-vibrant h4 { margin: 0 0 6px; color: #ff79c6; font-size: 13px; }
.card-vibrant p { margin: 0; color: #6272a4; font-size: 12px; }
</style>
<div class="options">
<div class="option" data-choice="terminal-dracula" onclick="toggleSelect(this)">
<div class="letter">A</div>
<div class="content">
<h3>Still Terminal</h3>
<p>Square corners, transparent cards, Dracula green as primary accent. Same structural DNA as today — just a better palette and more glow.</p>
<div style="background:#282a36;padding:16px;margin-top:10px;border-radius:6px">
<div style="color:#6272a4;font-family:monospace;font-size:11px;margin-bottom:8px"># IoT Learning Portal</div>
<div class="card-terminal">
<h4>▶ OJ Platform</h4>
<p>Online judge for practice</p>
</div>
</div>
</div>
</div>
<div class="option" data-choice="modern-dracula" onclick="toggleSelect(this)">
<div class="letter">B</div>
<div class="content">
<h3>Soft Modern</h3>
<p>Rounded cards with Dracula surface colors, purple accent, subtle shadows. Feels like a polished app — less "green terminal", more "Dracula theme everything".</p>
<div style="background:#282a36;padding:16px;margin-top:10px;border-radius:6px">
<div style="color:#6272a4;font-family:monospace;font-size:11px;margin-bottom:8px"># IoT Learning Portal</div>
<div class="card-modern">
<h4>OJ Platform</h4>
<p>Online judge for practice</p>
</div>
</div>
</div>
</div>
<div class="option" data-choice="vibrant-dracula" onclick="toggleSelect(this)">
<div class="letter">C</div>
<div class="content">
<h3>Vibrant & Accented</h3>
<p>Colored top border on cards (like Cyberpunk's treatment), pink/cyan/purple accents used actively, neon glow on hover. Most visually punchy of the three.</p>
<div style="background:#282a36;padding:16px;margin-top:10px;border-radius:6px">
<div style="color:#6272a4;font-family:monospace;font-size:11px;margin-bottom:8px"># IoT Learning Portal</div>
<div class="card-vibrant">
<h4>OJ Platform</h4>
<p>Online judge for practice</p>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,3 @@
<div style="display:flex;align-items:center;justify-content:center;min-height:60vh">
<p class="subtitle">Continuing in terminal…</p>
</div>

View File

@@ -0,0 +1 @@
{"reason":"owner process exited","timestamp":1779101686437}

View File

@@ -0,0 +1 @@
73384

View File

@@ -0,0 +1,540 @@
# Minecraft Theme Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Add a "minecraft" design theme — zero border-radius, Minecraft GUI bevel shadows, 16px pixel grid background, monospace font, dark (Stone & Cave) + light (Overworld Day) modes.
**Architecture:** Four small file edits following the established theme pattern. Dark mode uses `html[data-theme="dark"][data-design-theme="minecraft"]` selectors (same specificity as the generic dark override rules, but placed later in the file so they win). Light mode uses `html[data-theme="light"][data-design-theme="minecraft"]`. No font imports — system monospace only.
**Tech Stack:** Vanilla JS, Vite, CSS custom properties. No test suite — verification is manual via `npm start`.
---
## Files Modified
| File | Change |
|---|---|
| `theme.js:1` | Add `"minecraft"` to `DESIGN_THEMES` |
| `index.html:48` | Add `<li role="option" data-value="minecraft">` after animal-crossing |
| `i18n.js:136226` | Add `minecraft` key in all 11 language objects of `DESIGN_THEME_LABELS` |
| `style.css` | Append dark vars + light vars + body/grid/control/card overrides + reduced-motion |
---
## Task 1: Register the theme slug
**Files:**
- Modify: `theme.js:1`
- Modify: `index.html:48`
- [ ] **Step 1: Add slug to DESIGN_THEMES in theme.js**
Change line 1 from:
```js
const DESIGN_THEMES = ["fluent", "material-you", "terminal", "cyberpunk", "nord", "animal-crossing"]
```
to:
```js
const DESIGN_THEMES = ["fluent", "material-you", "terminal", "cyberpunk", "nord", "animal-crossing", "minecraft"]
```
- [ ] **Step 2: Add dropdown option in index.html**
After the animal-crossing `<li>` (currently lines 4648):
```html
<li role="option" data-value="animal-crossing" aria-selected="false">
Animal Crossing
</li>
```
add immediately after:
```html
<li role="option" data-value="minecraft" aria-selected="false">
Minecraft
</li>
```
- [ ] **Step 3: Commit**
```bash
git add theme.js index.html
git commit -m "feat: register minecraft theme slug"
```
---
## Task 2: Add i18n labels
**Files:**
- Modify: `i18n.js:136226`
- [ ] **Step 1: Add `minecraft` key to every language object in DESIGN_THEME_LABELS**
Replace the entire `DESIGN_THEME_LABELS` constant with:
```js
export const DESIGN_THEME_LABELS = {
"zh-Hans": {
fluent: "Fluent",
"material-you": "Material You",
terminal: "终端",
cyberpunk: "赛博朋克",
nord: "Nord",
"animal-crossing": "动森",
minecraft: "我的世界",
},
"zh-Hant": {
fluent: "Fluent",
"material-you": "Material You",
terminal: "終端",
cyberpunk: "賽博龐克",
nord: "Nord",
"animal-crossing": "動森",
minecraft: "我的世界",
},
en: {
fluent: "Fluent",
"material-you": "Material You",
terminal: "Terminal",
cyberpunk: "Cyberpunk",
nord: "Nord",
"animal-crossing": "Animal Crossing",
minecraft: "Minecraft",
},
ja: {
fluent: "Fluent",
"material-you": "Material You",
terminal: "ターミナル",
cyberpunk: "サイバーパンク",
nord: "Nord",
"animal-crossing": "どうぶつの森",
minecraft: "マインクラフト",
},
ko: {
fluent: "Fluent",
"material-you": "Material You",
terminal: "터미널",
cyberpunk: "사이버펑크",
nord: "Nord",
"animal-crossing": "동물의 숲",
minecraft: "마인크래프트",
},
wenyan: {
fluent: "流光",
"material-you": "物材",
terminal: "终端",
cyberpunk: "赛博",
nord: "清寒",
"animal-crossing": "森友",
minecraft: "方块世界",
},
mars: {
fluent: "流↗光",
"material-you": "材↘質",
terminal: "終↗★端",
cyberpunk: "賽↘!博",
nord: "清↗寒★",
"animal-crossing": "动↗森★",
minecraft: "我↗的★世界",
},
garbled: {
fluent: "◼è▦",
"material-you": "拷▤屯ä锟◽",
terminal: "¥¬▤▨¿¿",
cyberpunk: "◼çæ¥烫¥",
nord: "æ◽屯¿",
"animal-crossing": "ä◼▤è",
minecraft: "▤◼▦è屯",
},
bin: {
fluent: "0101",
"material-you": "010101",
terminal: "01010101",
cyberpunk: "0101010101",
nord: "0101010",
"animal-crossing": "01010101",
minecraft: "0101010",
},
meow: {
fluent: "喵喵",
"material-you": "喵喵喵",
terminal: "喵喵",
cyberpunk: "喵喵喵喵",
nord: "喵喵喵",
"animal-crossing": "喵喵喵喵",
minecraft: "喵喵喵",
},
emoji: {
fluent: "💧",
"material-you": "🧱",
terminal: "⌨️",
cyberpunk: "⚡",
nord: "❄️",
"animal-crossing": "🌿",
minecraft: "⛏️",
},
}
```
- [ ] **Step 2: Commit**
```bash
git add i18n.js
git commit -m "feat: add minecraft labels for all 11 languages"
```
---
## Task 3: Add CSS — dark mode (Stone & Cave)
**Files:**
- Modify: `style.css` (append after the `prefers-reduced-motion` block at end of file)
- [ ] **Step 1: Append dark mode CSS block at end of style.css**
```css
/* ─── Minecraft — Stone & Cave / Overworld Day ──────────────── */
html[data-design-theme="minecraft"] {
color-scheme: dark;
--accent: #5aaa3a;
--accent-rgb: 90, 170, 58;
--accent-2: #3d8a2a;
--accent-3: #2a6e1a;
--accent-secondary-rgb: 91, 191, 232;
--page-gradient: #1a1a1a;
--page-texture: none;
--title-gradient: linear-gradient(135deg, #5bbfe8 0%, #5aaa3a 100%);
--control-bg: rgba(62, 62, 62, 0.92);
--control-border: #1a1a1a;
--control-inset: rgba(255, 255, 255, 0.2);
--control-fg: #f0f0f0;
}
html[data-theme="dark"][data-design-theme="minecraft"] {
color-scheme: dark;
--accent: #5aaa3a;
--accent-rgb: 90, 170, 58;
--accent-2: #3d8a2a;
--accent-3: #2a6e1a;
--accent-secondary-rgb: 91, 191, 232;
--page-gradient: #1a1a1a;
--page-texture: none;
--title-gradient: linear-gradient(135deg, #5bbfe8 0%, #5aaa3a 100%);
--control-bg: rgba(62, 62, 62, 0.92);
--control-border: #1a1a1a;
--control-inset: rgba(255, 255, 255, 0.2);
--control-fg: #f0f0f0;
}
html[data-design-theme="minecraft"] body {
font-family: ui-monospace, "Courier New", Courier, monospace;
letter-spacing: 0.04em;
color: #f0f0f0;
}
html[data-theme="dark"][data-design-theme="minecraft"] body {
color: #f0f0f0;
}
html[data-design-theme="minecraft"] body::before {
background-image:
linear-gradient(rgba(255, 255, 255, 0.025) 1px, transparent 1px),
linear-gradient(90deg, rgba(255, 255, 255, 0.025) 1px, transparent 1px);
background-size: 16px 16px;
}
html[data-design-theme="minecraft"] .design-theme-button,
html[data-design-theme="minecraft"] .theme-toggle {
border-radius: 0;
backdrop-filter: none;
-webkit-backdrop-filter: none;
box-shadow:
inset 2px 2px 0 rgba(255, 255, 255, 0.25),
inset -2px -2px 0 rgba(0, 0, 0, 0.5);
transition: all 0.1s steps(2, end);
}
html[data-design-theme="minecraft"] .design-theme-button:hover,
html[data-design-theme="minecraft"] .theme-toggle:hover {
background: rgba(82, 82, 82, 0.95);
box-shadow:
inset 2px 2px 0 rgba(255, 255, 255, 0.35),
inset -2px -2px 0 rgba(0, 0, 0, 0.4);
transform: none;
border-color: rgba(var(--accent-rgb), 0.7);
}
html[data-design-theme="minecraft"] .design-theme-button:active,
html[data-design-theme="minecraft"] .theme-toggle:active {
box-shadow:
inset 2px 2px 0 rgba(0, 0, 0, 0.4),
inset -2px -2px 0 rgba(255, 255, 255, 0.12);
}
html[data-design-theme="minecraft"] .design-theme-list {
border-radius: 0;
backdrop-filter: none;
-webkit-backdrop-filter: none;
background: rgba(30, 30, 30, 0.96);
border: 2px solid #111111;
box-shadow:
inset 2px 2px 0 rgba(255, 255, 255, 0.1),
inset -2px -2px 0 rgba(0, 0, 0, 0.6);
}
html[data-design-theme="minecraft"] .design-theme-list [role="option"] {
border-radius: 0;
}
html[data-design-theme="minecraft"]
.design-theme-list
[role="option"]:hover,
html[data-design-theme="minecraft"]
.design-theme-list
[role="option"][aria-selected="true"] {
background: rgba(var(--accent-rgb), 0.25);
color: var(--control-fg);
}
html[data-theme="dark"][data-design-theme="minecraft"] .card {
background: #3c3c3c;
border: 2px solid #111111;
border-radius: 0;
backdrop-filter: none;
-webkit-backdrop-filter: none;
box-shadow:
inset 2px 2px 0 rgba(255, 255, 255, 0.2),
inset -2px -2px 0 rgba(0, 0, 0, 0.5);
transition: all 0.1s steps(2, end);
transform: none;
}
html[data-theme="dark"][data-design-theme="minecraft"] .card::before {
display: none;
}
html[data-theme="dark"][data-design-theme="minecraft"] .card.pin {
background: #454545;
}
html[data-theme="dark"][data-design-theme="minecraft"] .card h2 {
color: #f0f0f0;
}
html[data-theme="dark"][data-design-theme="minecraft"] .card p {
color: #c8c8c8;
}
html[data-theme="dark"][data-design-theme="minecraft"] .card:hover,
html[data-theme="dark"][data-design-theme="minecraft"] .card:focus {
background: #484848;
transform: none;
border-color: #5aaa3a;
box-shadow:
inset 2px 2px 0 rgba(0, 0, 0, 0.35),
inset -2px -2px 0 rgba(255, 255, 255, 0.12);
}
html[data-theme="dark"][data-design-theme="minecraft"] .card:hover h2,
html[data-theme="dark"][data-design-theme="minecraft"] .card:focus h2 {
color: #5aaa3a;
}
html[data-theme="dark"][data-design-theme="minecraft"] .card:hover p,
html[data-theme="dark"][data-design-theme="minecraft"] .card:focus p {
color: #e0e0e0;
}
html[data-theme="dark"][data-design-theme="minecraft"] .beian a {
color: #c8c8c8;
}
html[data-theme="dark"][data-design-theme="minecraft"] .beian a:hover {
color: #5aaa3a;
}
```
- [ ] **Step 2: Verify dark mode in browser**
Start dev server (`npm start`). Select "我的世界" in dark mode. Verify:
- Background is `#1a1a1a` dark stone (not generic dark gray)
- Title has blue-to-green gradient
- Cards are `#3c3c3c` with visible bevel (lighter top-left, darker bottom-right inset)
- Cards have NO rounded corners (sharp square edges)
- Card hover inverts the bevel and border turns green
- Controls have zero border-radius and bevel effect
- [ ] **Step 3: Commit**
```bash
git add style.css
git commit -m "feat: add minecraft dark mode CSS"
```
---
## Task 4: Add CSS — light mode (Overworld Day)
**Files:**
- Modify: `style.css` (append after dark mode block from Task 3)
- [ ] **Step 1: Append light mode CSS block**
```css
html[data-theme="light"][data-design-theme="minecraft"] {
color-scheme: light;
--accent: #5c9e40;
--accent-rgb: 92, 158, 64;
--accent-2: #4a8a30;
--accent-3: #8b6914;
--accent-secondary-rgb: 135, 206, 235;
--page-gradient: linear-gradient(180deg, #87ceeb 0%, #c9e8f7 50%, #f0f8ff 100%);
--page-texture: none;
--title-gradient: linear-gradient(135deg, #5c9e40 0%, #8b6914 100%);
--control-bg: rgba(198, 198, 198, 0.92);
--control-border: #555555;
--control-inset: rgba(255, 255, 255, 0.5);
--control-fg: #2a2a2a;
}
html[data-theme="light"][data-design-theme="minecraft"] body {
color: #2a2a2a;
}
html[data-theme="light"][data-design-theme="minecraft"] body::before {
background-image:
linear-gradient(rgba(0, 0, 0, 0.04) 1px, transparent 1px),
linear-gradient(90deg, rgba(0, 0, 0, 0.04) 1px, transparent 1px);
background-size: 16px 16px;
}
html[data-theme="light"][data-design-theme="minecraft"] .design-theme-list {
background: rgba(210, 210, 210, 0.96);
border: 2px solid #555555;
box-shadow:
inset 2px 2px 0 rgba(255, 255, 255, 0.7),
inset -2px -2px 0 rgba(0, 0, 0, 0.2);
}
html[data-theme="light"][data-design-theme="minecraft"] .card {
background: rgba(198, 198, 198, 0.85);
border: 2px solid #555555;
border-radius: 0;
backdrop-filter: none;
-webkit-backdrop-filter: none;
box-shadow:
inset 2px 2px 0 rgba(255, 255, 255, 0.6),
inset -2px -2px 0 rgba(0, 0, 0, 0.25);
transition: all 0.1s steps(2, end);
transform: none;
}
html[data-theme="light"][data-design-theme="minecraft"] .card::before {
display: none;
}
html[data-theme="light"][data-design-theme="minecraft"] .card.pin {
background: rgba(210, 210, 210, 0.88);
}
html[data-theme="light"][data-design-theme="minecraft"] .card h2 {
color: #2a2a2a;
}
html[data-theme="light"][data-design-theme="minecraft"] .card p {
color: #4a4a4a;
}
html[data-theme="light"][data-design-theme="minecraft"] .card:hover,
html[data-theme="light"][data-design-theme="minecraft"] .card:focus {
background: rgba(212, 224, 198, 0.92);
transform: none;
border-color: #5c9e40;
box-shadow:
inset 2px 2px 0 rgba(0, 0, 0, 0.15),
inset -2px -2px 0 rgba(255, 255, 255, 0.5);
}
html[data-theme="light"][data-design-theme="minecraft"] .card:hover h2,
html[data-theme="light"][data-design-theme="minecraft"] .card:focus h2 {
color: #5c9e40;
}
html[data-theme="light"][data-design-theme="minecraft"] .card:hover p,
html[data-theme="light"][data-design-theme="minecraft"] .card:focus p {
color: #2a2a2a;
}
html[data-theme="light"][data-design-theme="minecraft"] .beian a {
color: #4a4a4a;
}
html[data-theme="light"][data-design-theme="minecraft"] .beian a:hover {
color: #5c9e40;
}
@media (prefers-reduced-motion: reduce) {
html[data-design-theme="minecraft"] .card,
html[data-design-theme="minecraft"] .design-theme-button,
html[data-design-theme="minecraft"] .theme-toggle {
transition-duration: 0.01ms !important;
transform: none !important;
}
}
```
- [ ] **Step 2: Verify light mode in browser**
Toggle to light mode with "我的世界" theme active. Verify:
- Background is sky blue gradient (top `#87ceeb` to near-white at bottom)
- Cards are stone gray `rgba(198,198,198)` with bevel (light top-left, darker bottom-right)
- Cards have NO rounded corners
- Card hover turns slightly green-tinted and border goes grass green
- 16px grid is faintly visible on the sky background
- [ ] **Step 3: Commit**
```bash
git add style.css
git commit -m "feat: add minecraft light mode CSS"
```
---
## Task 5: Final verification
- [ ] **Step 1: Check `minecraft` is not in FORCED_DARK_DESIGN_THEMES**
Read `theme.js` line 2. It must remain:
```js
const FORCED_DARK_DESIGN_THEMES = new Set(["terminal", "cyberpunk"])
```
"minecraft" must NOT appear here.
- [ ] **Step 2: Verify theme cycles cleanly**
Cycle through all 7 themes in the dropdown. No broken styles at any step.
- [ ] **Step 3: Verify forced-dark restore**
While on Minecraft (light mode), switch to Terminal (forces dark), then back to Minecraft — should restore light mode.
- [ ] **Step 4: Run formatter**
```bash
npm run fmt
```
If files changed, commit:
```bash
git add style.css index.html i18n.js theme.js
git commit -m "style: run prettier after minecraft theme"
```

129
style.css
View File

@@ -51,32 +51,24 @@ body {
html[data-design-theme="terminal"] {
color-scheme: dark;
--accent: #33ff00;
--accent-rgb: 51, 255, 0;
--accent-2: #33ff00;
--accent-3: #33ff00;
--accent-secondary-rgb: 255, 176, 0;
--accent: #bd93f9;
--accent-rgb: 189, 147, 249;
--accent-2: #ff79c6;
--accent-3: #8be9fd;
--accent-secondary-rgb: 255, 121, 198;
--page-gradient: #0a0a0a;
--page-texture:
repeating-linear-gradient(
to bottom,
rgba(var(--accent-rgb), 0.035) 0px,
rgba(var(--accent-rgb), 0.035) 1px,
transparent 2px,
transparent 4px
),
radial-gradient(
circle at 50% 50%,
rgba(var(--accent-rgb), 0.05) 0%,
transparent 60%
);
--title-gradient: none;
--page-gradient: #282a36;
--page-texture: radial-gradient(
circle,
rgba(98, 114, 164, 0.55) 1px,
transparent 1px
);
--title-gradient: linear-gradient(90deg, #bd93f9 0%, #ff79c6 100%);
--control-bg: rgba(10, 10, 10, 0.85);
--control-border: rgba(var(--accent-rgb), 0.35);
--control-bg: rgba(40, 42, 54, 0.92);
--control-border: #44475a;
--control-inset: transparent;
--control-fg: var(--accent);
--control-fg: #f8f8f2;
}
html[data-design-theme="cyberpunk"] {
@@ -704,7 +696,11 @@ html[data-design-theme="terminal"] body {
ui-monospace, "JetBrains Mono", "Fira Code", "VT323", Menlo, Consolas,
"Liberation Mono", monospace;
letter-spacing: 0.01em;
color: var(--accent);
color: #f8f8f2;
}
html[data-design-theme="terminal"] body::before {
background-size: 20px 20px;
}
html[data-design-theme="terminal"] .theme-controls {
@@ -713,11 +709,11 @@ html[data-design-theme="terminal"] .theme-controls {
html[data-design-theme="terminal"] .design-theme-button,
html[data-design-theme="terminal"] .theme-toggle {
border-radius: 0;
border-radius: 8px;
box-shadow: none;
backdrop-filter: none;
-webkit-backdrop-filter: none;
border: 1px solid rgba(var(--accent-rgb), 0.55);
border: 1px solid #44475a;
}
html[data-design-theme="terminal"] .theme-toggle {
@@ -726,9 +722,9 @@ html[data-design-theme="terminal"] .theme-toggle {
html[data-design-theme="terminal"] .design-theme-button:hover,
html[data-design-theme="terminal"] .theme-toggle:hover {
background: var(--accent);
color: #0a0a0a;
border-color: var(--accent);
background: rgba(189, 147, 249, 0.08);
color: #bd93f9;
border-color: #bd93f9;
transform: none;
}
@@ -737,12 +733,12 @@ html[data-design-theme="terminal"] .design-theme-button::after {
}
html[data-design-theme="terminal"] .design-theme-list {
border-radius: 0;
border-radius: 10px;
box-shadow: none;
backdrop-filter: none;
-webkit-backdrop-filter: none;
background: rgba(10, 10, 10, 0.92);
border: 1px solid rgba(var(--accent-rgb), 0.55);
background: rgba(40, 42, 54, 0.96);
border: 1px solid #44475a;
}
html[data-design-theme="terminal"] .design-theme-list [role="option"] {
@@ -754,15 +750,17 @@ html[data-design-theme="terminal"] .design-theme-list [role="option"]:hover,
html[data-design-theme="terminal"]
.design-theme-list
[role="option"][aria-selected="true"] {
background: var(--accent);
color: #0a0a0a;
background: rgba(189, 147, 249, 0.15);
color: #bd93f9;
}
html[data-design-theme="terminal"] .title {
background: none;
-webkit-text-fill-color: currentColor;
color: var(--accent);
text-shadow: 0 0 5px rgba(var(--accent-rgb), 0.5);
background: var(--title-gradient);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
color: transparent;
text-shadow: none;
text-transform: uppercase;
letter-spacing: 0.04em;
position: relative;
@@ -772,44 +770,67 @@ html[data-design-theme="terminal"] .title::after {
content: "\2588";
margin-left: 8px;
animation: terminal-cursor-blink 1s step-end infinite;
-webkit-text-fill-color: #bd93f9;
}
html[data-design-theme="terminal"] .card {
border-radius: 0;
background: transparent;
border: 1px solid rgba(var(--accent-rgb), 0.35);
box-shadow: none;
border-radius: 10px;
background: #313244;
border: 1px solid #44475a;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.45);
backdrop-filter: none;
-webkit-backdrop-filter: none;
transform: none;
transform: translateY(0);
transition: all 0.2s ease;
}
html[data-design-theme="terminal"] .card.pin {
background: #383a4a;
}
html[data-design-theme="terminal"] .card::before {
display: none;
}
html[data-design-theme="terminal"] .card h2,
html[data-design-theme="terminal"] .card p,
html[data-design-theme="terminal"] .beian a {
color: var(--accent);
text-shadow: 0 0 5px rgba(var(--accent-rgb), 0.25);
html[data-design-theme="terminal"] .card h2 {
color: #f8f8f2;
text-shadow: none;
}
html[data-design-theme="terminal"] .card p {
color: #6272a4;
text-shadow: none;
}
html[data-design-theme="terminal"] .card:hover,
html[data-design-theme="terminal"] .card:focus {
background: rgba(var(--accent-rgb), 0.06);
border-color: var(--accent);
box-shadow: none;
background: #313244;
border-color: #bd93f9;
box-shadow:
0 0 0 1px rgba(189, 147, 249, 0.25),
0 8px 28px rgba(189, 147, 249, 0.15),
0 4px 12px rgba(0, 0, 0, 0.5);
transform: translateY(-2px);
}
html[data-design-theme="terminal"] .card:hover h2,
html[data-design-theme="terminal"] .card:focus h2 {
color: var(--accent);
color: #bd93f9;
}
html[data-design-theme="terminal"] .card:hover p,
html[data-design-theme="terminal"] .card:focus p {
color: #cdd6f4;
}
html[data-design-theme="terminal"] .beian a {
color: #6272a4;
text-shadow: none;
}
html[data-design-theme="terminal"] .beian a:hover {
background: var(--accent);
color: #0a0a0a;
color: #bd93f9;
background: none;
text-shadow: none;
}