ki-kennzahlen-coach/www/cockpit/cockpit.css

706 lines
28 KiB
CSS
Raw Normal View History

/* Kai Cockpit vanilla CSS, no external fonts/CDN.
Extends Kai widget theme: teal #0891b2/#06b6d4, bg #0a0a0f, text #f1f0f5. */
* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
:root {
--bg: #0a0a0f;
--bg-elev: #12121a;
--bg-elev2: #191924;
--bg-elev3: #22222f;
--line: #2a2a38;
--line-soft: #1f1f2b;
--text: #f1f0f5;
--text-mute: #a0a0b5;
--text-dim: #707088;
--teal: #0891b2;
--teal-b: #06b6d4;
--teal-c: #22d3ee;
--teal-dim: rgba(8,145,178,.15);
--ok: #10b981;
--warn: #f59e0b;
--err: #ef4444;
--violet: #a78bfa;
--dock-w: 300px;
--nav-w: 220px;
--radius: 10px;
--radius-sm: 6px;
--shadow: 0 8px 24px rgba(0,0,0,.45);
--t: 0.2s ease;
}
body {
background: var(--bg);
color: var(--text);
font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
font-size: 15px;
line-height: 1.5;
min-height: 100vh;
-webkit-font-smoothing: antialiased;
}
a { color: var(--teal-c); text-decoration: none; }
a:hover { text-decoration: underline; }
button { font-family: inherit; font-size: inherit; }
code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; background: #0d0d14; padding: 1px 5px; border-radius: 4px; border: 1px solid var(--line-soft); font-size: .9em; }
/* ============ LAYOUT ============ */
.cockpit {
display: grid;
grid-template-columns: var(--nav-w) minmax(0, 1fr) var(--dock-w);
grid-template-rows: auto 1fr auto;
grid-template-areas:
"top top top"
"nav main dock"
"foot foot foot";
min-height: 100vh;
background: radial-gradient(ellipse at top, rgba(8,145,178,.08), transparent 60%), var(--bg);
}
.topbar { grid-area: top; }
.nav { grid-area: nav; }
.main { grid-area: main; }
.chat-dock { grid-area: dock; }
.footer { grid-area: foot; }
/* ============ TOPBAR ============ */
.topbar {
display: flex;
align-items: center;
gap: 16px;
padding: 14px 22px;
border-bottom: 1px solid var(--line);
background: linear-gradient(180deg, rgba(18,18,26,.92), rgba(10,10,15,.92));
backdrop-filter: blur(6px);
position: sticky; top: 0; z-index: 50;
}
.brand { display: flex; align-items: center; gap: 12px; }
.brand-icon {
width: 36px; height: 36px; border-radius: 9px;
background: linear-gradient(135deg, var(--teal), var(--teal-b));
display: flex; align-items: center; justify-content: center;
font-weight: 700; font-size: 18px; color: #001013;
box-shadow: 0 0 0 1px rgba(34,211,238,.25), 0 6px 14px rgba(8,145,178,.35);
}
.brand-text { display: flex; flex-direction: column; line-height: 1.1; }
.brand-title { font-weight: 600; font-size: 16px; letter-spacing: -.2px; }
.brand-title small { font-weight: 400; color: var(--text-mute); font-size: 13px; margin-left: 2px; }
.brand-sub { color: var(--text-dim); font-size: 11px; letter-spacing: .04em; text-transform: uppercase; }
.spacer { flex: 1; }
.xp-wrap { display: flex; flex-direction: column; gap: 4px; min-width: 170px; }
.xp-row { display: flex; justify-content: space-between; font-size: 12px; color: var(--text-mute); }
.xp-level { color: var(--teal-c); font-weight: 500; }
.xp-score { color: var(--text-mute); }
.xp-bar { height: 5px; background: var(--bg-elev2); border-radius: 99px; overflow: hidden; border: 1px solid var(--line-soft); }
.xp-bar-fill { height: 100%; width: 0%; background: linear-gradient(90deg, var(--teal), var(--teal-c)); transition: width .4s ease; }
.back-link {
padding: 7px 14px; border: 1px solid var(--line);
border-radius: 8px; font-size: 13px; color: var(--text-mute);
transition: var(--t);
}
.back-link:hover { color: var(--text); border-color: var(--teal); background: var(--teal-dim); text-decoration: none; }
/* ============ NAV ============ */
.nav {
border-right: 1px solid var(--line);
padding: 22px 14px;
display: flex; flex-direction: column; gap: 4px;
background: rgba(18,18,26,.5);
}
.nav-item {
display: grid;
grid-template-columns: auto 1fr auto;
gap: 10px;
align-items: center;
background: transparent;
border: 1px solid transparent;
color: var(--text-mute);
padding: 12px 14px;
border-radius: var(--radius);
cursor: pointer;
text-align: left;
transition: var(--t);
font-size: 14px;
}
.nav-item:hover { background: var(--bg-elev); color: var(--text); }
.nav-item[aria-selected="true"] {
background: linear-gradient(90deg, rgba(8,145,178,.2), rgba(8,145,178,.06));
border-color: rgba(34,211,238,.35);
color: var(--text);
box-shadow: inset 2px 0 0 var(--teal-c);
}
.nav-num { font-variant-numeric: tabular-nums; font-size: 11px; color: var(--text-dim); letter-spacing: .08em; }
.nav-item[aria-selected="true"] .nav-num { color: var(--teal-c); }
.nav-label { font-weight: 500; letter-spacing: -.2px; }
.nav-kbd { font-size: 10px; color: var(--text-dim); background: var(--bg-elev2); padding: 2px 5px; border-radius: 4px; border: 1px solid var(--line-soft); }
/* ============ MAIN ============ */
.main { padding: 28px 36px 40px; min-width: 0; }
.module { display: none; max-width: 1100px; margin: 0 auto; }
.module[data-active="true"] { display: block; animation: fadeIn .25s ease; }
@keyframes fadeIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }
.mod-head { margin-bottom: 28px; }
.mod-head h1 {
margin: 0 0 8px; font-size: 28px; font-weight: 600; letter-spacing: -0.5px;
background: linear-gradient(90deg, var(--text), var(--teal-c));
-webkit-background-clip: text; background-clip: text; color: transparent;
}
.mod-head p { margin: 0; color: var(--text-mute); max-width: 720px; font-size: 14px; }
.mod-badge {
display: inline-flex; align-items: center; gap: 6px;
font-size: 11px; font-weight: 500; letter-spacing: .05em; text-transform: uppercase;
color: var(--teal-c); background: var(--teal-dim);
border: 1px solid rgba(34,211,238,.25);
padding: 4px 10px; border-radius: 99px; margin-bottom: 12px;
}
/* Cards + surfaces */
.card {
background: var(--bg-elev);
border: 1px solid var(--line);
border-radius: var(--radius);
padding: 20px;
transition: var(--t);
}
.card-hover:hover { border-color: rgba(34,211,238,.4); transform: translateY(-1px); cursor: pointer; }
.btn {
padding: 9px 16px; border-radius: 8px;
font-weight: 500; cursor: pointer;
border: 1px solid var(--line);
background: var(--bg-elev2); color: var(--text);
transition: var(--t); font-size: 14px;
}
.btn:hover:not(:disabled) { border-color: var(--teal); color: var(--teal-c); }
.btn:disabled { opacity: .4; cursor: not-allowed; }
.btn-primary {
background: linear-gradient(135deg, var(--teal), var(--teal-b));
border: none; color: #001013; font-weight: 600;
}
.btn-primary:hover:not(:disabled) { filter: brightness(1.15); color: #001013; }
.btn-ghost { background: transparent; border: 1px solid var(--line); }
.btn-sm { padding: 6px 12px; font-size: 13px; }
.btn-ask-kai {
background: transparent;
border: 1px dashed rgba(34,211,238,.4);
color: var(--teal-c);
padding: 8px 14px; font-size: 13px;
border-radius: 8px; cursor: pointer; transition: var(--t);
display: inline-flex; align-items: center; gap: 6px;
}
.btn-ask-kai:hover { background: var(--teal-dim); border-style: solid; }
/* ============ REIFEGRAD ============ */
.reifegrad-intro {
display: grid; gap: 10px; margin-bottom: 20px;
padding: 16px 20px;
background: linear-gradient(135deg, rgba(8,145,178,.08), rgba(18,18,26,.6));
border: 1px solid var(--line);
border-radius: var(--radius);
}
.reifegrad-intro .intro-stats {
display: flex; gap: 16px; flex-wrap: wrap;
font-size: 12px; color: var(--text-mute);
}
.reifegrad-intro .intro-stats span strong { color: var(--teal-c); font-variant-numeric: tabular-nums; margin-right: 4px; }
.dim-grid {
display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 14px; margin-bottom: 24px;
}
.dim-card {
background: var(--bg-elev);
border: 1px solid var(--line);
border-radius: var(--radius);
padding: 16px 18px;
cursor: pointer; transition: var(--t);
position: relative; overflow: hidden;
}
.dim-card:hover { border-color: rgba(34,211,238,.35); transform: translateY(-1px); }
.dim-card.done { border-color: rgba(16,185,129,.45); }
.dim-card.done::after {
content: "✓"; position: absolute; top: 10px; right: 12px;
color: var(--ok); font-size: 14px; font-weight: 700;
}
.dim-card h3 { margin: 0 0 6px; font-size: 15px; font-weight: 600; color: var(--text); }
.dim-card p { margin: 0; color: var(--text-mute); font-size: 12.5px; line-height: 1.4; }
.dim-card .dim-score {
display: flex; align-items: center; gap: 6px;
margin-top: 10px; font-size: 12px;
color: var(--teal-c); font-variant-numeric: tabular-nums;
}
.dim-card .dim-score .mini-bar {
flex: 1; height: 4px; background: var(--bg-elev3); border-radius: 2px; overflow: hidden;
}
.dim-card .dim-score .mini-bar-fill {
height: 100%; background: linear-gradient(90deg, var(--teal), var(--teal-c));
transition: width .3s ease;
}
/* Assessment question view */
.assessment {
background: var(--bg-elev);
border: 1px solid var(--line);
border-radius: var(--radius);
padding: 24px 28px;
margin-bottom: 24px;
}
.assessment-nav {
display: flex; justify-content: space-between; align-items: center;
margin-bottom: 20px; font-size: 12px; color: var(--text-mute);
}
.assessment-nav button.linklike {
background: transparent; border: none; color: var(--teal-c); cursor: pointer; font-size: 13px;
}
.assessment-nav button.linklike:hover { text-decoration: underline; }
.assessment-progress {
height: 4px; background: var(--bg-elev3); border-radius: 99px; overflow: hidden; margin-bottom: 22px;
}
.assessment-progress-fill { height: 100%; background: linear-gradient(90deg, var(--teal), var(--teal-c)); transition: width .3s ease; }
.question-block h2 { margin: 0 0 6px; font-size: 20px; font-weight: 600; letter-spacing: -.3px; }
.question-block .question-hint { color: var(--text-mute); font-size: 13px; margin-bottom: 22px; }
.likert {
display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px;
margin-bottom: 16px;
}
.likert-btn {
background: var(--bg-elev2);
border: 1px solid var(--line);
color: var(--text); padding: 14px 10px;
border-radius: 8px; cursor: pointer; transition: var(--t);
display: flex; flex-direction: column; gap: 4px; text-align: center;
}
.likert-btn:hover { border-color: var(--teal); }
.likert-btn[aria-pressed="true"] {
background: linear-gradient(135deg, rgba(8,145,178,.3), rgba(8,145,178,.1));
border-color: var(--teal-c); color: var(--teal-c);
}
.likert-btn .likert-n { font-size: 20px; font-weight: 600; font-variant-numeric: tabular-nums; }
.likert-btn .likert-t { font-size: 11px; color: var(--text-mute); }
.likert-btn[aria-pressed="true"] .likert-t { color: var(--teal-c); }
.q-nav { display: flex; justify-content: space-between; margin-top: 10px; gap: 10px; }
/* Radar + results */
.radar-wrap {
background: var(--bg-elev);
border: 1px solid var(--line);
border-radius: var(--radius);
padding: 24px;
display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 30px;
align-items: center;
margin-bottom: 20px;
}
.radar-legend { display: flex; flex-direction: column; gap: 10px; }
.radar-legend .legend-row { display: flex; align-items: center; gap: 10px; font-size: 13px; }
.radar-legend .legend-swatch { width: 14px; height: 14px; border-radius: 3px; flex-shrink: 0; }
.radar-score-big { font-size: 36px; font-weight: 600; color: var(--teal-c); margin: 4px 0 2px; font-variant-numeric: tabular-nums; }
.radar-score-hint { color: var(--text-mute); font-size: 12px; margin-bottom: 16px; }
.recos { display: grid; gap: 12px; margin-top: 14px; }
.reco-item {
display: grid; grid-template-columns: auto 1fr; gap: 14px;
background: var(--bg-elev); border: 1px solid var(--line);
border-radius: var(--radius); padding: 16px 18px; align-items: start;
}
.reco-num { width: 30px; height: 30px; border-radius: 50%; background: var(--teal-dim); color: var(--teal-c); display: flex; align-items: center; justify-content: center; font-weight: 600; font-size: 14px; }
.reco-item h4 { margin: 0 0 4px; font-size: 14px; font-weight: 600; }
.reco-item p { margin: 0 0 10px; color: var(--text-mute); font-size: 13px; }
/* ============ AI ACT CLASSIFIER ============ */
.wizard {
background: var(--bg-elev);
border: 1px solid var(--line);
border-radius: var(--radius);
padding: 28px; max-width: 720px; margin: 0 auto;
}
.wizard .progress-dots {
display: flex; gap: 6px; justify-content: center; margin-bottom: 22px;
}
.wizard .progress-dots span {
width: 8px; height: 8px; border-radius: 50%; background: var(--bg-elev3); transition: var(--t);
}
.wizard .progress-dots span.active { background: var(--teal-c); }
.wizard .progress-dots span.done { background: var(--teal); }
.wizard-q h2 { margin: 0 0 8px; font-size: 22px; font-weight: 600; letter-spacing: -.3px; }
.wizard-q p { margin: 0 0 22px; color: var(--text-mute); font-size: 14px; }
.yesno-row { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.yesno-btn {
padding: 22px; border-radius: var(--radius);
background: var(--bg-elev2);
border: 1px solid var(--line);
color: var(--text); cursor: pointer; transition: var(--t);
font-size: 16px; font-weight: 500;
}
.yesno-btn:hover { border-color: var(--teal); transform: translateY(-1px); }
.yesno-btn.yes:hover { border-color: var(--err); color: var(--err); }
.yesno-btn.no:hover { border-color: var(--teal-c); color: var(--teal-c); }
.verdict {
padding: 28px; border-radius: var(--radius);
border: 1px solid var(--line);
background: var(--bg-elev);
}
.verdict .verdict-label {
display: inline-block; padding: 4px 12px; border-radius: 99px;
font-size: 11px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase;
margin-bottom: 14px;
}
.verdict.prohibited { border-color: var(--err); background: rgba(239,68,68,.06); }
.verdict.prohibited .verdict-label { background: rgba(239,68,68,.18); color: var(--err); }
.verdict.high { border-color: var(--warn); background: rgba(245,158,11,.06); }
.verdict.high .verdict-label { background: rgba(245,158,11,.18); color: var(--warn); }
.verdict.limited { border-color: var(--teal); background: rgba(8,145,178,.06); }
.verdict.limited .verdict-label { background: rgba(8,145,178,.2); color: var(--teal-c); }
.verdict.minimal { border-color: var(--ok); background: rgba(16,185,129,.06); }
.verdict.minimal .verdict-label { background: rgba(16,185,129,.18); color: var(--ok); }
.verdict h2 { margin: 0 0 10px; font-size: 26px; font-weight: 600; }
.verdict p.verdict-summary { margin: 0 0 18px; color: var(--text-mute); }
.verdict .obligation-list {
list-style: none; padding: 0; margin: 0 0 22px; display: grid; gap: 10px;
}
.verdict .obligation-list li {
padding: 10px 14px; background: rgba(255,255,255,.02);
border-left: 3px solid var(--teal-c);
border-radius: 4px; font-size: 13px; color: var(--text);
}
.verdict .obligation-list li strong { color: var(--teal-c); margin-right: 8px; }
.verdict-run-counter { color: var(--text-dim); font-size: 12px; margin-top: 14px; }
/* ============ DASHBOARD ============ */
.dash-group { margin-bottom: 26px; }
.dash-group-title {
font-size: 12px; letter-spacing: .08em; text-transform: uppercase;
color: var(--text-dim); margin-bottom: 10px;
display: flex; align-items: center; gap: 10px;
}
.dash-group-title::after { content: ""; flex: 1; height: 1px; background: var(--line); }
.dash-grid { display: grid; gap: 14px; }
.dash-grid.exec { grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }
.dash-grid.ops { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
.dash-grid.tech { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
.tile {
background: var(--bg-elev);
border: 1px solid var(--line);
border-radius: var(--radius);
padding: 18px 20px; cursor: pointer; transition: var(--t);
text-align: left; display: flex; flex-direction: column; gap: 6px;
position: relative; overflow: hidden;
}
.tile:hover { border-color: rgba(34,211,238,.4); transform: translateY(-2px); box-shadow: var(--shadow); }
.tile.seen { border-color: rgba(34,211,238,.25); }
.tile.seen::before {
content: ""; position: absolute; top: 10px; right: 12px;
width: 6px; height: 6px; border-radius: 50%; background: var(--teal-c);
}
.tile.exec { padding: 22px 24px; }
.tile-label { font-size: 12px; color: var(--text-mute); letter-spacing: .02em; }
.tile-value { font-size: 26px; font-weight: 600; color: var(--text); font-variant-numeric: tabular-nums; letter-spacing: -0.5px; }
.tile.exec .tile-value { font-size: 34px; }
.tile-trend {
font-size: 11px; display: flex; align-items: center; gap: 4px;
color: var(--text-mute); font-variant-numeric: tabular-nums;
}
.tile-trend.up { color: var(--ok); }
.tile-trend.down { color: var(--err); }
.tile-trend.neutral { color: var(--text-mute); }
/* ============ MODAL ============ */
.modal-root {
position: fixed; inset: 0; z-index: 200;
display: none; align-items: center; justify-content: center;
padding: 20px; background: rgba(0,0,0,.7); backdrop-filter: blur(6px);
}
.modal-root.open { display: flex; animation: fadeIn .2s; }
.modal {
background: var(--bg-elev);
border: 1px solid var(--line);
border-radius: 12px;
padding: 26px 28px;
max-width: 560px; width: 100%; max-height: 90vh; overflow-y: auto;
box-shadow: var(--shadow);
animation: modalIn .2s ease;
}
@keyframes modalIn { from { transform: translateY(8px); opacity: 0; } to { transform: none; opacity: 1; } }
.modal-head { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 14px; gap: 16px; }
.modal-head h3 { margin: 0; font-size: 20px; font-weight: 600; letter-spacing: -.3px; }
.modal-head .modal-close { background: transparent; border: none; color: var(--text-mute); font-size: 22px; cursor: pointer; line-height: 1; }
.modal-head .modal-close:hover { color: var(--text); }
.modal-value {
font-size: 36px; font-weight: 600; color: var(--teal-c);
margin-bottom: 4px; font-variant-numeric: tabular-nums;
}
.modal-value-sub { color: var(--text-mute); font-size: 13px; margin-bottom: 18px; }
.modal p { margin: 0 0 14px; font-size: 13.5px; color: var(--text-mute); line-height: 1.5; }
.modal p strong { color: var(--text); }
.modal-actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 20px; flex-wrap: wrap; }
/* ============ CHAT DOCK ============ */
.chat-dock {
border-left: 1px solid var(--line);
background: rgba(18,18,26,.6);
display: flex; flex-direction: column;
position: sticky; top: 64px; height: calc(100vh - 64px - 44px);
overflow: hidden;
}
.dock-head {
display: flex; align-items: baseline; gap: 8px;
padding: 14px 18px; border-bottom: 1px solid var(--line);
background: rgba(8,145,178,.06);
}
.dock-title { font-weight: 600; color: var(--teal-c); }
.dock-sub { font-size: 11px; color: var(--text-dim); flex: 1; }
.dock-reset, .dock-collapse {
background: transparent; border: 1px solid var(--line);
color: var(--text-mute); width: 26px; height: 26px;
border-radius: 6px; cursor: pointer; font-size: 12px;
display: flex; align-items: center; justify-content: center;
transition: var(--t);
}
.dock-reset:hover, .dock-collapse:hover { color: var(--text); border-color: var(--teal); }
.dock-box {
flex: 1; overflow-y: auto; padding: 14px;
display: flex; flex-direction: column; gap: 10px;
scrollbar-width: thin; scrollbar-color: var(--line) transparent;
}
.dock-box::-webkit-scrollbar { width: 6px; }
.dock-box::-webkit-scrollbar-thumb { background: var(--line); border-radius: 3px; }
.dock-msg {
padding: 10px 12px; border-radius: 10px;
font-size: 13px; line-height: 1.5; max-width: 95%;
word-wrap: break-word; overflow-wrap: break-word;
}
.dock-msg.user {
align-self: flex-end;
background: linear-gradient(135deg, var(--teal), var(--teal-b));
color: #001013;
border-bottom-right-radius: 3px;
}
.dock-msg.bot {
align-self: flex-start;
background: var(--bg-elev2);
border: 1px solid var(--line);
border-bottom-left-radius: 3px;
}
.dock-msg.bot p { margin: 0 0 8px; }
.dock-msg.bot p:last-child { margin-bottom: 0; }
.dock-msg.bot ul, .dock-msg.bot ol { margin: 6px 0; padding-left: 20px; }
.dock-msg.bot li { margin-bottom: 2px; }
.dock-msg.bot code { font-size: .88em; }
.dock-msg.bot pre { background: #0d0d14; border: 1px solid var(--line-soft); padding: 10px; border-radius: 6px; overflow-x: auto; font-size: .85em; margin: 8px 0; }
.dock-msg.err {
background: rgba(239,68,68,.1); border: 1px solid rgba(239,68,68,.3); color: #fca5a5;
}
.dock-msg.sys {
font-size: 12px; color: var(--text-dim);
background: transparent; border: 1px dashed var(--line); align-self: center; text-align: center;
}
.dots { display: inline-flex; gap: 4px; padding: 4px 0; }
.dots span {
width: 6px; height: 6px; border-radius: 50%; background: var(--teal-c);
animation: bounce 1.2s infinite ease-in-out;
}
.dots span:nth-child(2) { animation-delay: .15s; }
.dots span:nth-child(3) { animation-delay: .3s; }
@keyframes bounce { 0%, 80%, 100% { transform: translateY(0); opacity: .4; } 40% { transform: translateY(-4px); opacity: 1; } }
.dock-form {
display: grid; grid-template-columns: 1fr auto;
gap: 8px; padding: 12px; border-top: 1px solid var(--line);
background: var(--bg-elev);
}
.dock-form textarea {
resize: none; min-height: 38px; max-height: 140px;
background: var(--bg-elev2);
border: 1px solid var(--line);
border-radius: 8px; color: var(--text);
padding: 9px 12px; font-family: inherit; font-size: 13px;
transition: var(--t);
}
.dock-form textarea:focus { outline: none; border-color: var(--teal-c); box-shadow: 0 0 0 3px rgba(34,211,238,.15); }
.btn-send {
background: linear-gradient(135deg, var(--teal), var(--teal-b));
border: none; color: #001013; font-weight: 700;
width: 40px; height: 40px; border-radius: 8px; cursor: pointer;
font-size: 18px; transition: var(--t);
}
.btn-send:hover:not(:disabled) { filter: brightness(1.15); }
.btn-send:disabled { opacity: .4; cursor: not-allowed; }
.dock-footer-link {
display: block; padding: 8px 14px; font-size: 11px; color: var(--text-dim);
text-align: center; border-top: 1px solid var(--line); background: var(--bg-elev);
}
.dock-footer-link:hover { color: var(--teal-c); text-decoration: none; }
/* Floating open button (mobile / collapsed state) */
.dock-open {
display: none;
position: fixed; bottom: 24px; right: 24px; z-index: 60;
padding: 12px 18px; border-radius: 99px;
background: linear-gradient(135deg, var(--teal), var(--teal-b));
color: #001013; font-weight: 600; border: none;
box-shadow: 0 8px 24px rgba(8,145,178,.5);
cursor: pointer; font-size: 14px;
align-items: center; gap: 8px;
}
.dock-open-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: #001013; animation: pulse 1.4s infinite; }
@keyframes pulse { 0%,100% { opacity: 1; } 50% { opacity: .35; } }
.chat-dock.collapsed { display: none; }
.chat-dock.collapsed + .dock-open { display: inline-flex; }
/* Full chat module (⌃4) — reuses dock style but takes full width */
.chat-full-wrap { max-width: 780px; margin: 0 auto; }
.chat-full-wrap p { color: var(--text-mute); font-size: 13px; margin-bottom: 18px; }
.chat-full-wrap .chat-full-empty {
display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 10px; margin: 16px 0 22px;
}
.chat-full-wrap .chip {
background: var(--bg-elev); border: 1px solid var(--line);
color: var(--text-mute); padding: 10px 14px; border-radius: 8px;
cursor: pointer; transition: var(--t); font-size: 13px; text-align: left;
}
.chat-full-wrap .chip:hover { border-color: var(--teal); color: var(--text); }
/* ============ FOOTER ============ */
.footer {
grid-area: foot;
padding: 12px 22px;
border-top: 1px solid var(--line);
text-align: center;
font-size: 12px; color: var(--text-dim);
background: var(--bg-elev);
}
.footer a { color: var(--text-mute); }
/* ============ TOASTS ============ */
.toast-stack {
position: fixed; top: 16px; right: 16px; z-index: 500;
display: flex; flex-direction: column; gap: 8px; pointer-events: none;
}
.toast {
padding: 10px 16px; border-radius: 8px;
background: var(--bg-elev2); border: 1px solid var(--line);
color: var(--text); font-size: 13px; min-width: 220px;
box-shadow: var(--shadow); animation: slideIn .3s ease;
pointer-events: auto;
}
.toast.success { border-color: var(--ok); color: #86efac; }
.toast.err { border-color: var(--err); color: #fca5a5; }
.toast.info { border-color: var(--teal-c); color: var(--teal-c); }
@keyframes slideIn { from { transform: translateX(20px); opacity: 0; } to { transform: none; opacity: 1; } }
/* ============ BADGES (completion) ============ */
.badges-row {
display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px;
}
.badge-chip {
display: inline-flex; align-items: center; gap: 8px;
padding: 6px 12px; border-radius: 99px;
background: var(--bg-elev2); border: 1px solid var(--line);
font-size: 12px; color: var(--text-mute);
}
.badge-chip.earned { border-color: var(--teal-c); color: var(--teal-c); background: var(--teal-dim); }
.badge-chip .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--text-dim); }
.badge-chip.earned .dot { background: var(--teal-c); box-shadow: 0 0 6px var(--teal-c); }
/* ============ RESPONSIVE ============ */
@media (max-width: 1160px) {
.cockpit { grid-template-columns: 180px minmax(0, 1fr) 260px; --nav-w: 180px; --dock-w: 260px; }
.main { padding: 22px 24px 36px; }
}
@media (max-width: 960px) {
.cockpit {
grid-template-columns: 1fr;
grid-template-areas: "top" "nav" "main" "foot";
}
.nav {
flex-direction: row; overflow-x: auto; padding: 12px;
border-right: none; border-bottom: 1px solid var(--line);
position: sticky; top: 70px; z-index: 30;
background: rgba(10,10,15,.95); backdrop-filter: blur(8px);
}
.nav-item { flex: 1 0 auto; grid-template-columns: 1fr; gap: 2px; text-align: center; padding: 8px 12px; }
.nav-num, .nav-kbd { display: none; }
.nav-label { font-size: 13px; }
.chat-dock {
position: fixed; top: 0; right: 0; bottom: 0;
width: 100%; max-width: 360px;
height: 100vh; z-index: 100;
box-shadow: -10px 0 40px rgba(0,0,0,.6);
transform: translateX(100%); transition: transform .3s ease;
}
.chat-dock.open { transform: translateX(0); }
.dock-open { display: inline-flex; }
.radar-wrap { grid-template-columns: 1fr; }
.yesno-row { grid-template-columns: 1fr; }
.topbar { flex-wrap: wrap; padding: 10px 14px; }
.xp-wrap { min-width: 140px; order: 3; }
.back-link { order: 2; }
.main { padding: 18px 14px 30px; }
.mod-head h1 { font-size: 22px; }
}
@media (max-width: 480px) {
.likert { grid-template-columns: repeat(5, 1fr); gap: 4px; }
.likert-btn { padding: 10px 4px; }
.likert-btn .likert-n { font-size: 16px; }
.likert-btn .likert-t { font-size: 9px; }
.brand-sub { display: none; }
}
/* ============ A11Y ============ */
.sr-only {
position: absolute; width: 1px; height: 1px;
padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); border: 0;
}
button:focus-visible, .nav-item:focus-visible, textarea:focus-visible, a:focus-visible {
outline: 2px solid var(--teal-c); outline-offset: 2px;
}
/* SVG */
.radar-svg { width: 100%; height: auto; display: block; }
.sparkline-svg { width: 100%; height: 80px; display: block; }
/* GFM table (added 2026-04-24) */
.md-table {
width: 100%;
border-collapse: collapse;
margin: .6rem 0;
font-size: .9em;
background: rgba(255,255,255,0.02);
border: 1px solid rgba(255,255,255,0.08);
border-radius: 6px;
overflow: hidden;
}
.md-table thead {
background: rgba(8,145,178,0.12);
}
.md-table th,
.md-table td {
padding: .5rem .7rem;
border-bottom: 1px solid rgba(255,255,255,0.06);
text-align: left;
vertical-align: top;
}
.md-table th {
color: #06b6d4;
font-weight: 600;
font-size: .78em;
letter-spacing: .04em;
text-transform: uppercase;
}
.md-table tbody tr:last-child td { border-bottom: none; }
.md-table tbody tr:hover { background: rgba(255,255,255,0.03); }
.md-table code { font-size: .92em; padding: 1px 5px; }
.chat-dock .md-table,
.dock-body .md-table {
display: block;
overflow-x: auto;
font-size: .82em;
}