feat(faq): expanded chemistry glossary + Dr. Flask lab zone
Replaces the compact 3-column table with the full long-form glossary (Commander + Gemini copy): - Dr. Flask cover card beside the intro (web-optimized 560px from docs/character/drflask-final.png, 1.8MB -> 394KB). - 'In plain English' callout + the Formulae->...->Lab Notes flow strip. - 8 term cards (Catalyst Console, re-Agent, Substrate, Formulae, Reactions, Compounds, Lab Notes, The Exchange) — chemistry meaning / Corrosion role / punchy kicker each. - Dr. Flask sign-off card with his bio + quips. - Lab-zone treatment: green accent scoped to .sec--lab so the whole section reads as a deliberate 'lab' corner, breaking up the orange brand. Visually verified via Playwright on the dev server (marketing host): 8 cards, green theming, Dr. Flask cover + sign-off all render; no page errors. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
BIN
docs/character/drflask-final.png
Normal file
BIN
docs/character/drflask-final.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.8 MiB |
BIN
frontend/src/assets/mascots/drflask.png
Normal file
BIN
frontend/src/assets/mascots/drflask.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 394 KiB |
@@ -3,6 +3,9 @@ import { ref, onMounted, onUnmounted } from 'vue'
|
||||
import { RouterLink } from 'vue-router'
|
||||
import Icon from '@/components/ds/core/Icon.vue'
|
||||
import CorrosionMark from '@/components/brand/CorrosionMark.vue'
|
||||
// Dr. Flask, Ph.D. — the chemistry glossary's mascot/cover (placeholder render).
|
||||
// Web-optimized from docs/character/drflask-final.png.
|
||||
import drFlask from '@/assets/mascots/drflask.png'
|
||||
|
||||
interface FaqItem {
|
||||
question: string
|
||||
@@ -154,50 +157,59 @@ const groups: FaqGroup[] = [
|
||||
|
||||
interface ChemTerm {
|
||||
term: string
|
||||
science: string
|
||||
role: string
|
||||
chem: string
|
||||
corro: string
|
||||
kicker: string
|
||||
}
|
||||
|
||||
const chemistry: ChemTerm[] = [
|
||||
{
|
||||
term: 'Catalyst',
|
||||
science: 'Speeds up a reaction without being consumed',
|
||||
role: 'The control panel — the operator console where you manage servers, players, plugins, files, wipes, and automation.',
|
||||
term: 'Catalyst Console',
|
||||
chem: 'A catalyst helps a reaction happen faster or more efficiently without being consumed by it.',
|
||||
corro: 'The control panel where you manage your game servers, players, plugins, files, wipes, schedules, and automation.',
|
||||
kicker: 'Mission control for your server community.',
|
||||
},
|
||||
{
|
||||
term: 're-Agent',
|
||||
science: 'A reagent causes or takes part in a chemical reaction',
|
||||
role: 'The host connector you install on the Substrate — it links your machine securely to Catalyst and runs its commands.',
|
||||
chem: 'A reagent is something that participates in a chemical reaction.',
|
||||
corro: 'The lightweight agent installed on your server. It connects your hardware to Catalyst over secure outbound communication — so you never open inbound ports.',
|
||||
kicker: 'What lets Corrosion see, manage, and automate your host.',
|
||||
},
|
||||
{
|
||||
term: 'Substrate',
|
||||
science: 'The material or surface on which a reaction takes place',
|
||||
role: 'The host / bare-metal surface where your game servers actually run — native processes on your own Windows or Linux box.',
|
||||
chem: 'A substrate is the surface or material where a reaction happens.',
|
||||
corro: 'The bare-metal or virtual machine your game server runs on — the hardware surface underneath everything, where re-Agent lives and Formulae are applied.',
|
||||
kicker: 'Think "bedrock," but more chemistry.',
|
||||
},
|
||||
{
|
||||
term: 'Formulae',
|
||||
science: 'A formula describes the ingredients and structure of a compound or reaction',
|
||||
role: 'Deployment recipes — one per game (Rust, Dune, Conan, Soulmask, and more) that define what a server should be.',
|
||||
chem: 'A formula describes the ingredients, structure, or recipe for something.',
|
||||
corro: 'Reusable deployment recipes for games and server types — how a Rust server, Dune BattleGroup, Conan world, or Soulmask cluster should be configured and deployed.',
|
||||
kicker: 'Complex setups, made repeatable instead of manual.',
|
||||
},
|
||||
{
|
||||
term: 'Reaction',
|
||||
science: 'A process where substances transform',
|
||||
role: 'A job executing against the Substrate — a wipe, restart, update, deploy, or backup.',
|
||||
term: 'Reactions',
|
||||
chem: 'A chemical reaction is a process where things change from one state to another.',
|
||||
corro: 'The jobs and workflows that change your server state — wipes, restarts, updates, backups, maintenance windows, deployments, and scheduled tasks.',
|
||||
kicker: 'When Corrosion does work, a Reaction is usually happening.',
|
||||
},
|
||||
{
|
||||
term: 'Compound',
|
||||
science: 'A combination of elements bonded together',
|
||||
role: 'A grouped set of runtime services that run together as one stack (a Dune battlegroup is a Compound).',
|
||||
term: 'Compounds',
|
||||
chem: 'A compound is made when different elements combine into something that works as a whole.',
|
||||
corro: 'Grouped services or stack components that belong together — a game server, supporting services, shared storage, config, and helper processes as one unit.',
|
||||
kicker: 'Related pieces, treated as one operational unit.',
|
||||
},
|
||||
{
|
||||
term: 'Lab Notes',
|
||||
science: 'Recorded observations and results from an experiment',
|
||||
role: 'Logs, audit history, and job results — what happened, when, and to what.',
|
||||
chem: 'Lab notes record what happened during an experiment.',
|
||||
corro: 'The logs, audit history, job results, and operational records — what happened, when it happened, and whether it succeeded.',
|
||||
kicker: 'If something goes sideways, start here.',
|
||||
},
|
||||
{
|
||||
term: 'The Exchange',
|
||||
science: 'Ion exchange transfers ions between materials',
|
||||
role: 'The Corrosion-native marketplace — items, VIP packages, and automated in-game delivery.',
|
||||
chem: 'Ion exchange is a process where ions are swapped between materials.',
|
||||
corro: 'The native marketplace layer for server communities — item catalogs, VIP packages, payment processing, and automated in-game delivery.',
|
||||
kicker: 'Where your community trades value for perks, packages, and content.',
|
||||
},
|
||||
]
|
||||
|
||||
@@ -307,50 +319,63 @@ onUnmounted(() => { io?.disconnect() })
|
||||
</section>
|
||||
|
||||
<!-- CHEMISTRY GLOSSARY -->
|
||||
<section class="sec" id="chemistry">
|
||||
<section class="sec sec--lab" id="chemistry">
|
||||
<div class="wrap">
|
||||
<div class="sec__head reveal">
|
||||
<div class="lab-intro reveal">
|
||||
<img :src="drFlask" alt="Dr. Flask, Ph.D. — Chemistry Teacher" class="lab-intro__card" />
|
||||
<div class="lab-intro__copy">
|
||||
<span class="eyebrow">Glossary</span>
|
||||
<h2 class="title">Brush up on your chemistry while managing your game server</h2>
|
||||
<p class="lead">
|
||||
Corrosion uses a chemistry-inspired naming system because managing game servers is all
|
||||
about controlled reactions — deploying, updating, wiping, automating, and recovering
|
||||
complex systems without letting them melt down.
|
||||
Corrosion uses a chemistry-inspired naming system because running game servers is a lot
|
||||
like managing controlled reactions: the right ingredients, the right environment, the
|
||||
right timing, and a safe way to see what happened when the smoke clears.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="glossary reveal">
|
||||
<div class="glossary__row glossary__row--head">
|
||||
<span>Term</span>
|
||||
<span>Chemistry meaning</span>
|
||||
<span>In Corrosion</span>
|
||||
</div>
|
||||
<div v-for="t in chemistry" :key="t.term" class="glossary__row">
|
||||
<span class="glossary__term">{{ t.term }}</span>
|
||||
<span class="glossary__sci">{{ t.science }}</span>
|
||||
<span class="glossary__role">{{ t.role }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="glossary__foot reveal">
|
||||
<p class="glossary__note">
|
||||
<p class="lead">
|
||||
You don't need a chemistry degree to use Corrosion. The names are here to make the
|
||||
platform memorable — and to give each part of the system a clear job.
|
||||
platform more memorable — and to give each part of the system a clear job.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- The one-line summary for skimmers -->
|
||||
<p class="lab-plain reveal">
|
||||
<strong>In plain English:</strong> <strong>Catalyst</strong> is the console,
|
||||
<strong>re-Agent</strong> connects your server, <strong>Substrate</strong> is the hardware
|
||||
it runs on, <strong>Formulae</strong> define game deployments, and
|
||||
<strong>Lab Notes</strong> show you what happened.
|
||||
</p>
|
||||
|
||||
<div class="flow" aria-hidden="true">
|
||||
<div class="flow reveal" aria-hidden="true">
|
||||
<template v-for="(step, i) in flow" :key="step">
|
||||
<span class="flow__step">{{ step }}</span>
|
||||
<span v-if="i < flow.length - 1" class="flow__arr">→</span>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
<p class="glossary__plain">
|
||||
<strong>How it fits together:</strong> a <strong>Formula</strong> defines what should
|
||||
happen, <strong>Catalyst</strong> kicks it off, <strong>re-Agent</strong> carries it out
|
||||
on the <strong>Substrate</strong> as a <strong>Reaction</strong>, and
|
||||
<strong>Lab Notes</strong> record the result.
|
||||
<!-- Full glossary, one card per term -->
|
||||
<div class="term-grid reveal">
|
||||
<div v-for="t in chemistry" :key="t.term" class="term-card">
|
||||
<h3 class="term-card__name">{{ t.term }}</h3>
|
||||
<p class="term-card__chem">{{ t.chem }}</p>
|
||||
<p class="term-card__corro">{{ t.corro }}</p>
|
||||
<p class="term-card__kick">{{ t.kicker }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Dr. Flask sign-off -->
|
||||
<div class="drflask-card reveal">
|
||||
<h3 class="term-card__name">Dr. Flask</h3>
|
||||
<p class="term-card__corro">
|
||||
Dr. Flask is Corrosion's friendly chemistry guide. He turns up in the FAQ and help
|
||||
sections to explain Corrosion terms — without turning your server panel into a
|
||||
full-blown chemistry class.
|
||||
</p>
|
||||
<ul class="drflask-card__quips">
|
||||
<li>Helpful? <strong>Yes.</strong></li>
|
||||
<li>Mandatory? <strong>No.</strong></li>
|
||||
<li>Likely bubbling with questionable enthusiasm? <strong>Absolutely.</strong></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -452,51 +477,55 @@ onUnmounted(() => { io?.disconnect() })
|
||||
line-height: 1.65;
|
||||
}
|
||||
|
||||
/* Chemistry glossary */
|
||||
.glossary {
|
||||
max-width: 920px;
|
||||
margin: 0 auto;
|
||||
background: var(--surface-base);
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: var(--ring-default);
|
||||
overflow: hidden;
|
||||
/* Chemistry glossary — "lab zone": scope the accent tokens to green so the whole
|
||||
section (eyebrow, term color, flow chips, callout) reads as Dr. Flask's corner
|
||||
without touching the orange brand everywhere else. */
|
||||
.sec--lab {
|
||||
--accent: #3fb968;
|
||||
--accent-text: #5bd183;
|
||||
--accent-soft: rgba(82, 200, 124, 0.13);
|
||||
--accent-border: rgba(82, 200, 124, 0.34);
|
||||
}
|
||||
.glossary__row {
|
||||
display: grid;
|
||||
grid-template-columns: 150px 1.05fr 1.6fr;
|
||||
gap: 18px;
|
||||
padding: 15px 20px;
|
||||
border-top: 1px solid var(--border-subtle);
|
||||
align-items: start;
|
||||
}
|
||||
.glossary__row:first-child { border-top: none; }
|
||||
.glossary__row--head {
|
||||
font-size: var(--text-xs);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.06em;
|
||||
font-weight: 600;
|
||||
color: var(--text-muted);
|
||||
background: var(--surface-raised-2);
|
||||
}
|
||||
.glossary__term { font-weight: 700; color: var(--accent-text); font-size: var(--text-sm); }
|
||||
.glossary__sci { font-size: var(--text-sm); color: var(--text-tertiary); font-style: italic; line-height: 1.55; }
|
||||
.glossary__role { font-size: var(--text-sm); color: var(--text-secondary); line-height: 1.6; }
|
||||
|
||||
.glossary__foot {
|
||||
.lab-intro {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 300px) 1fr;
|
||||
gap: 30px;
|
||||
align-items: center;
|
||||
max-width: 920px;
|
||||
margin: 22px auto 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
margin: 0 auto 40px;
|
||||
}
|
||||
.glossary__note { font-size: var(--text-sm); color: var(--text-tertiary); line-height: 1.65; margin: 0; }
|
||||
.lab-intro__card {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: var(--ring-default), 0 18px 40px rgba(0, 0, 0, 0.45);
|
||||
}
|
||||
.lab-intro__copy { text-align: left; }
|
||||
.lab-intro__copy .eyebrow { display: block; margin-bottom: 12px; }
|
||||
.lab-intro__copy .title { margin: 0 0 14px; }
|
||||
.lab-plain {
|
||||
max-width: 920px;
|
||||
margin: 0 auto 14px;
|
||||
font-size: var(--text-sm);
|
||||
color: var(--text-primary);
|
||||
line-height: 1.65;
|
||||
padding: 14px 18px;
|
||||
background: var(--accent-soft);
|
||||
border-radius: var(--radius-md);
|
||||
box-shadow: inset 0 0 0 1px var(--accent-border);
|
||||
text-align: center;
|
||||
}
|
||||
.lab-plain strong { color: var(--accent-text); }
|
||||
|
||||
.flow {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 8px;
|
||||
padding: 4px 0;
|
||||
max-width: 920px;
|
||||
margin: 0 auto 28px;
|
||||
}
|
||||
.flow__step {
|
||||
font-size: var(--text-xs);
|
||||
@@ -509,22 +538,56 @@ onUnmounted(() => { io?.disconnect() })
|
||||
white-space: nowrap;
|
||||
}
|
||||
.flow__arr { color: var(--text-muted); font-size: var(--text-sm); }
|
||||
.glossary__plain {
|
||||
font-size: var(--text-sm);
|
||||
color: var(--text-primary);
|
||||
line-height: 1.65;
|
||||
margin: 0;
|
||||
padding: 14px 16px;
|
||||
background: var(--accent-soft);
|
||||
border-radius: var(--radius-md);
|
||||
box-shadow: inset 0 0 0 1px var(--accent-border);
|
||||
/* Term cards — the full glossary, one card per term */
|
||||
.term-grid {
|
||||
max-width: 920px;
|
||||
margin: 0 auto;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 14px;
|
||||
}
|
||||
.glossary__plain strong { color: var(--accent-text); }
|
||||
.term-card {
|
||||
background: var(--surface-base);
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: var(--ring-default);
|
||||
padding: 18px 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
.term-card__name { font-size: var(--text-base, 1rem); font-weight: 700; color: var(--accent-text); margin: 0; }
|
||||
.term-card__chem { font-size: var(--text-sm); color: var(--text-tertiary); font-style: italic; line-height: 1.55; margin: 0; }
|
||||
.term-card__corro { font-size: var(--text-sm); color: var(--text-secondary); line-height: 1.6; margin: 0; }
|
||||
.term-card__kick { font-size: var(--text-sm); color: var(--accent-text); font-weight: 600; line-height: 1.5; margin: 4px 0 0; }
|
||||
|
||||
/* Dr. Flask sign-off */
|
||||
.drflask-card {
|
||||
max-width: 920px;
|
||||
margin: 14px auto 0;
|
||||
background: var(--accent-soft);
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: inset 0 0 0 1px var(--accent-border);
|
||||
padding: 20px 22px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
}
|
||||
.drflask-card__quips {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 2px 0 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
font-size: var(--text-sm);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
.drflask-card__quips strong { color: var(--accent-text); }
|
||||
|
||||
@media (max-width: 720px) {
|
||||
.glossary__row { grid-template-columns: 1fr; gap: 5px; padding: 16px; }
|
||||
.glossary__row--head { display: none; }
|
||||
.glossary__sci::before { content: 'Chemistry — '; color: var(--text-muted); font-style: normal; }
|
||||
.glossary__role::before { content: 'In Corrosion — '; color: var(--text-muted); }
|
||||
.lab-intro { grid-template-columns: 1fr; gap: 18px; justify-items: center; text-align: center; }
|
||||
.lab-intro__card { max-width: 280px; }
|
||||
.lab-intro__copy { text-align: center; }
|
||||
.term-grid { grid-template-columns: 1fr; }
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user