Generated with npm run build. The source is on the astro branch. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
202 lines
5.6 KiB
CSS
202 lines
5.6 KiB
CSS
/* Khaos im Kiez — terminal look, pure CSS, no JS */
|
|
|
|
:root {
|
|
--bg: #020a04;
|
|
--fg: #33ff66;
|
|
--dim: #1f9a3f;
|
|
--hot: #ff2a2a; /* KiK-Logo-Rot */
|
|
--glow: 0 0 6px color-mix(in srgb, currentColor 55%, transparent); /* in each text's own color */
|
|
}
|
|
|
|
* { box-sizing: border-box; }
|
|
|
|
html { background: #000; }
|
|
|
|
body {
|
|
margin: 0;
|
|
min-height: 100vh;
|
|
padding: 2rem 1rem 4rem;
|
|
background: radial-gradient(ellipse at center, var(--bg) 55%, #000 100%);
|
|
color: var(--fg);
|
|
font: 16px/1.5 "DejaVu Sans Mono", "Liberation Mono", "Cascadia Mono", Menlo, Consolas, monospace;
|
|
text-shadow: var(--glow);
|
|
}
|
|
|
|
/* CRT: Scanlines + Vignette */
|
|
body::before {
|
|
content: "";
|
|
position: fixed; inset: 0;
|
|
pointer-events: none;
|
|
z-index: 10;
|
|
background:
|
|
repeating-linear-gradient(to bottom,
|
|
rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 0) 2px,
|
|
rgba(0, 0, 0, .22) 3px, rgba(0, 0, 0, .22) 4px),
|
|
radial-gradient(ellipse at center, rgba(0,0,0,0) 60%, rgba(0,0,0,.55) 100%);
|
|
}
|
|
|
|
::selection { background: var(--fg); color: #000; text-shadow: none; }
|
|
|
|
.term {
|
|
max-width: 82ch;
|
|
margin: 0 auto;
|
|
}
|
|
|
|
a {
|
|
color: var(--fg);
|
|
text-decoration: none;
|
|
}
|
|
a:hover, a:focus-visible {
|
|
background: var(--fg);
|
|
color: #000;
|
|
text-shadow: none;
|
|
outline: none;
|
|
}
|
|
|
|
/* Prompt */
|
|
.prompt { white-space: pre-wrap; }
|
|
.prompt .cwd { color: #3465a4; } /* the shell prompt's blue, as xterm.js renders it */
|
|
.cursor {
|
|
display: inline-block;
|
|
width: .6em; height: 1.1em;
|
|
vertical-align: text-bottom;
|
|
background: var(--fg);
|
|
animation: blink 1.1s steps(1) infinite;
|
|
}
|
|
@keyframes blink { 50% { opacity: 0; } }
|
|
#term-input { all: unset; width: 0; caret-color: transparent; } /* as wide as its text, so the block cursor follows it */
|
|
|
|
/* Terminal: continues right below the first prompt. Lines scrolled off its screen become page text,
|
|
the screen shows the rows in use and xterm.js fits rows and columns to the window. */
|
|
.prompt:has(+ .history) { margin-bottom: 0; }
|
|
.history { white-space: pre; overflow-x: clip; } /* rows of the terminal's width; cut, not wrapped, if the window narrows */
|
|
.history > div { min-height: 1lh; } /* keeps empty lines */
|
|
.history span { color: var(--fg); }
|
|
.screen { overflow: clip; }
|
|
.screen > div { height: 100dvh; }
|
|
.screen .xterm-viewport, .screen .scrollbar { display: none; } /* the page scrolls instead */
|
|
/* hovered links (xterm.js underlines them inline) invert in their own color, like the page's links */
|
|
.screen .xterm-rows span[style*="text-decoration: underline"] { background-color: currentColor; -webkit-text-fill-color: #000; text-shadow: none; }
|
|
@media (prefers-reduced-motion: no-preference) {
|
|
/* typing still reaches the terminal when it is not focused, so its cursor keeps blinking like the page's */
|
|
.screen .xterm-rows:not(.xterm-focus) .xterm-cursor-block { animation: blink 1.1s steps(1) infinite; }
|
|
}
|
|
|
|
/* Header */
|
|
header {
|
|
display: flex;
|
|
gap: 1.5rem;
|
|
align-items: center;
|
|
margin: 1rem 0 1.5rem;
|
|
}
|
|
header img {
|
|
width: 150px; height: 150px;
|
|
flex: none;
|
|
image-rendering: auto;
|
|
filter: drop-shadow(0 0 8px rgba(255, 42, 42, .5));
|
|
}
|
|
h1 {
|
|
margin: 0;
|
|
font-size: 1.9rem;
|
|
line-height: 1.15;
|
|
font-weight: bold;
|
|
letter-spacing: .04em;
|
|
text-transform: uppercase;
|
|
}
|
|
h1 span { color: var(--hot); }
|
|
.tagline { margin: .4rem 0 0; color: var(--dim); }
|
|
|
|
/* Menü */
|
|
nav {
|
|
border-top: 1px solid var(--dim);
|
|
border-bottom: 1px solid var(--dim);
|
|
padding: .3rem 0;
|
|
margin-bottom: 2rem;
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: .25rem 1.5rem;
|
|
}
|
|
nav .lang { margin-left: auto; }
|
|
|
|
/* Fenster-Boxen */
|
|
section {
|
|
border: 1px solid var(--fg);
|
|
box-shadow: 0 0 10px rgba(51, 255, 102, .25), inset 0 0 10px rgba(51, 255, 102, .08);
|
|
margin: 0 0 2rem;
|
|
padding: 1.1rem 1.2rem .8rem;
|
|
position: relative;
|
|
}
|
|
section > h2 {
|
|
position: absolute;
|
|
top: -.85em; left: 1rem;
|
|
margin: 0;
|
|
padding: 0 .6ch;
|
|
background: #010603;
|
|
font-size: 1rem;
|
|
font-weight: bold;
|
|
}
|
|
section > h2::before { content: "┤ "; color: var(--dim); }
|
|
section > h2::after { content: " ├"; color: var(--dim); }
|
|
|
|
section p { margin: 0 0 1rem; }
|
|
|
|
dl.kv {
|
|
display: grid;
|
|
grid-template-columns: max-content 1fr;
|
|
gap: .15rem 1.5ch;
|
|
margin: 0 0 1rem;
|
|
}
|
|
dl.kv dt { color: var(--dim); white-space: nowrap; min-width: 12ch; }
|
|
dl.kv dt::after { content: " :"; }
|
|
dl.kv dd { margin: 0; }
|
|
|
|
/* Buttons */
|
|
.btn {
|
|
display: inline-block;
|
|
margin: 0 1.5ch .5rem 0;
|
|
padding: 0 1ch;
|
|
border: 1px solid var(--fg);
|
|
}
|
|
.btn::before { content: "[ "; }
|
|
.btn::after { content: " ]"; }
|
|
.btn { border: 0; padding: 0; }
|
|
.btn.hot { color: var(--hot); }
|
|
.btn.hot:hover, .btn.hot:focus-visible { background: var(--hot); color: #000; }
|
|
|
|
.note { color: var(--dim); }
|
|
.todo { color: #ffcc33; text-shadow: none; }
|
|
|
|
/* Output-Listen */
|
|
ul.out { list-style: none; margin: 0 0 1rem; padding: 0; }
|
|
ul.out li::before { content: "> "; color: var(--dim); }
|
|
|
|
footer {
|
|
color: var(--dim);
|
|
text-align: center;
|
|
border-top: 1px solid var(--dim);
|
|
padding-top: .8rem;
|
|
}
|
|
footer a { color: var(--dim); }
|
|
footer a:hover { color: #000; }
|
|
|
|
/* Mobil */
|
|
@media (max-width: 560px) {
|
|
body { font-size: 14px; padding: 1rem .6rem 3rem; }
|
|
header { flex-direction: column; align-items: flex-start; gap: .8rem; }
|
|
header img { width: 110px; height: 110px; }
|
|
h1 { font-size: 1.4rem; }
|
|
dl.kv { grid-template-columns: 1fr; }
|
|
dl.kv dt::after { content: ""; }
|
|
dl.kv dd { margin-bottom: .5rem; }
|
|
nav .lang { margin-left: 0; }
|
|
}
|
|
|
|
@media (prefers-reduced-motion: reduce) {
|
|
.cursor { animation: none; }
|
|
}
|
|
|
|
@media print {
|
|
body::before { display: none; }
|
|
body, a { color: #000; background: #fff; text-shadow: none; }
|
|
section { box-shadow: none; border-color: #000; }
|
|
}
|