summaryrefslogtreecommitdiff
path: root/src/css
diff options
context:
space:
mode:
Diffstat (limited to 'src/css')
-rw-r--r--src/css/style.css1277
1 files changed, 1277 insertions, 0 deletions
diff --git a/src/css/style.css b/src/css/style.css
new file mode 100644
index 0000000..50c6f48
--- /dev/null
+++ b/src/css/style.css
@@ -0,0 +1,1277 @@
+:root {
+ /* Win95 "strawberry latte" tokens */
+
+ /* Desktop (rarely used, but handy for full-page demos) */
+ --desktop: #d7a5b7;
+
+ /* Page + surfaces */
+ --bg: #f4ece7; /* page behind windows */
+ --bg-pattern: #efe5df;
+
+ /* Background texture (dither/checker overlay) */
+ --dither-ink: rgba(59, 46, 44, 0.22);
+ --dither-opacity: 0.18;
+ --surface: #e9dcd5; /* window face */
+ --surface-alt: #fff7f2; /* milk highlight */
+
+ /* Text */
+ --fg: #2a1f1d;
+ --muted: #6a5550;
+
+ /* 3D border system */
+ --border: #3b2e2c;
+ --border-light: #fff7f2;
+ --border-dark: #8e7670;
+
+ /* Girly coffee accents */
+ --primary: #e56aa6; /* strawberry */
+ --primary-light: #f08dbe; /* strawberry milk */
+ --primary-dark: #c84d86; /* rose */
+
+ --secondary: #b69cff; /* lilac */
+ --secondary-light: #d7c8ff;
+ --secondary-dark: #8f78d6;
+
+ --accent-brown: #b88a68; /* latte */
+ --accent-brown-light: #d4a574;
+ --accent-brown-dark: #7a5245;
+
+ /* Title bar (Win95-ish window chrome) */
+ --titlebar-a: #d85b9b;
+ --titlebar-b: #7a3e8e;
+ --titlebar-fg: #fff7f2;
+
+ /* Links */
+ --link: #c84d86;
+ --link-visited: #6f2f80;
+ --link-active: #b5173d;
+
+ /* Keep existing names as aliases */
+ --accent-pink: var(--primary);
+ --accent-lavender: var(--secondary);
+
+ /* Status colors (slightly softened) */
+ --success: #2e8b57;
+ --error: #b3261e;
+ --warning: #b7791f;
+ --info: #2b6cb0;
+
+ /* Spacing */
+ --space-xs: 0.5rem;
+ --space-sm: 1rem;
+ --space-md: 1.5rem;
+ --space-lg: 2rem;
+ --space-xl: 3rem;
+
+ /* Borders */
+ --border-width: 2px;
+ --border-style: solid;
+
+ /* Type */
+ --font-mono: "Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ --line-height: 1.35;
+
+ /* Shadows */
+ --shadow-sm: 1px 1px 0;
+ --shadow-md: 2px 2px 0;
+ --shadow-lg: 3px 3px 0;
+ --shadow-color: rgba(0, 0, 0, 0.22);
+ --shadow-box: 2px 2px 0 rgba(0, 0, 0, 0.12);
+ --shadow-button: 1px 1px 0 rgba(0, 0, 0, 0.18);
+
+ --highlight: rgba(255, 247, 242, 0.9);
+ --lowlight: rgba(59, 46, 44, 0.55);
+
+ --content-max-width: 1000px;
+}
+
+[data-theme="dark"] {
+ /* Espresso-night variant */
+ --bg: #2d2523;
+ --bg-pattern: #241e1c;
+
+ --dither-ink: rgba(255, 247, 242, 0.12);
+ --dither-opacity: 0.14;
+ --surface: #3b312f;
+ --surface-alt: #463a37;
+
+ --fg: #f9efea;
+ --muted: #cbb8b1;
+
+ --border: #f1e6e0;
+ --border-light: #6e5b57;
+ --border-dark: #120d0c;
+
+ --primary: #f06aa6;
+ --primary-light: #ff97c8;
+ --primary-dark: #d94b8e;
+
+ --secondary: #b69cff;
+ --secondary-light: #d7c8ff;
+ --secondary-dark: #8f78d6;
+
+ --accent-brown: #a57353;
+ --accent-brown-light: #c9936a;
+ --accent-brown-dark: #6b4a34;
+
+ --titlebar-a: #b04a80;
+ --titlebar-b: #4f245e;
+ --titlebar-fg: #fff7f2;
+
+ --link: #ff97c8;
+ --link-visited: #d7c8ff;
+ --link-active: #fff0f7;
+
+ /* Status colors (brightened for dark mode) */
+ --success: #4caf50;
+ --error: #ff6b6b;
+ --warning: #ffa500;
+ --info: #64b5f6;
+
+ --shadow-color: rgba(0, 0, 0, 0.75);
+ --highlight: rgba(255, 255, 255, 0.2);
+ --lowlight: rgba(0, 0, 0, 0.85);
+}
+
+@font-face {
+ font-family: "Mono";
+ src: url("../assets/fonts/Maple.woff2") format("woff2");
+ font-display: swap;
+ font-weight: normal;
+}
+
+@supports (font-synthesis: none) {
+ @font-face {
+ font-family: "Mono";
+ src: url("../assets/fonts/Maple.woff2") format("woff2");
+ font-synthesis: none;
+ }
+}
+
+/* base */
+
+* {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+ cursor:
+ url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 24" width="32" height="24"><path d="M1 3h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v2H9v1h1v2h1v2h-1v1H8v-1H7v-2H6v-2H5v1H4v1H3v1H1" fill="%23ff69b4" stroke="%23b19cd9" stroke-width="0.5"/><path d="M2 5h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1h1v1H8v2h1v2h1v2H8v-2H7v-2H6v-1H5v1H4v1H3v1H2" fill="white" stroke="%23ff69b4" stroke-width="0.5"/></svg>')
+ 0 0,
+ auto !important;
+}
+
+::selection {
+ background: var(--primary);
+ color: var(--surface-alt);
+}
+
+:focus-visible {
+ outline: 1px dotted var(--fg);
+ outline-offset: 2px;
+}
+
+html {
+ font-size: 16px;
+ background-color: var(--bg);
+ position: relative;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ height: 100vh;
+}
+
+html::before {
+ content: "";
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image: linear-gradient(
+ 45deg,
+ var(--dither-ink) 25%,
+ transparent 25%,
+ transparent 75%,
+ var(--dither-ink) 75%
+ ),
+ linear-gradient(
+ 45deg,
+ var(--dither-ink) 25%,
+ transparent 25%,
+ transparent 75%,
+ var(--dither-ink) 75%
+ ),
+ url("../assets/img/bg.png");
+ background-size:
+ 10px 10px,
+ 10px 10px,
+ auto;
+ background-position:
+ 0 0,
+ 5px 5px,
+ 0 0;
+ background-repeat: repeat;
+ opacity: var(--dither-opacity);
+ z-index: -1;
+ pointer-events: none;
+}
+
+body {
+ background: transparent;
+ color: var(--fg);
+ line-height: var(--line-height);
+ padding: var(--space-md);
+ padding-top: calc(var(--space-md) + 3rem);
+ max-width: var(--content-max-width);
+ margin: 0 auto;
+ font-family: var(--font-mono);
+ scrollbar-color: var(--accent-lavender) var(--bg);
+ scrollbar-width: thin;
+ display: flex;
+ flex-direction: column;
+ height: 100vh;
+}
+
+/* webkit scrollbar (chrome, safari, edge) */
+::-webkit-scrollbar {
+ width: 12px;
+}
+
+::-webkit-scrollbar-track {
+ background: var(--bg);
+ border: 2px solid var(--border);
+ box-shadow:
+ inset 1px 1px 0 var(--border-light),
+ inset -1px -1px 0 var(--border-dark);
+}
+
+::-webkit-scrollbar-thumb {
+ background: var(--accent-lavender);
+ border: 2px outset var(--border-light);
+ box-shadow:
+ inset 1px 1px 0 var(--highlight),
+ inset -1px -1px 0 var(--lowlight);
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: var(--accent-pink);
+}
+
+.div-centered {
+ max-width: var(--content-max-width);
+ margin: auto;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ min-height: calc(100vh - 4.5rem);
+ text-align: justify;
+}
+
+/* typography */
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-family: var(--font-mono);
+ font-weight: 700;
+ line-height: 1.15;
+ margin-bottom: var(--space-md);
+ color: var(--fg);
+}
+
+h1 {
+ font-size: 2rem;
+ margin-bottom: var(--space-lg);
+ background: linear-gradient(90deg, var(--titlebar-a), var(--titlebar-b));
+}
+
+/* "Titlebar" headings: retro, but still cute */
+h1,
+h2,
+h3 {
+ padding: 0.55rem 0.75rem;
+ border: var(--border-width) solid var(--border);
+ box-shadow:
+ inset 1px 1px 0 var(--border-light),
+ inset -1px -1px 0 var(--border-dark);
+ color: var(--titlebar-fg);
+ text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.25);
+}
+
+h2 {
+ font-size: 1.5rem;
+ background: linear-gradient(90deg, var(--titlebar-a), var(--titlebar-b));
+}
+
+h3 {
+ font-size: 1.25rem;
+ background: linear-gradient(90deg, var(--accent-brown-dark), var(--accent-brown));
+}
+
+h4 {
+ font-size: 1.1rem;
+}
+
+h5 {
+ font-size: 1rem;
+}
+
+h6 {
+ font-size: 0.9rem;
+}
+
+p {
+ margin-bottom: var(--space-sm);
+}
+
+a {
+ color: var(--link);
+ text-decoration: underline;
+ text-decoration-thickness: 2px;
+ text-underline-offset: 2px;
+}
+
+a:visited {
+ color: var(--link-visited);
+}
+
+a:hover {
+ background: var(--primary-light);
+ color: var(--fg);
+}
+
+a:active {
+ color: var(--link-active);
+}
+
+small {
+ color: var(--muted);
+ font-size: 0.875rem;
+}
+
+blockquote {
+ border-left: 3px solid var(--accent-brown);
+ padding-left: var(--space-md);
+ margin: var(--space-md) 0;
+ font-style: italic;
+ color: var(--muted);
+}
+
+/* lists */
+
+ul,
+ol {
+ margin: var(--space-sm) 0;
+ padding-left: var(--space-lg);
+}
+
+li {
+ margin-bottom: var(--space-xs);
+}
+
+/* tables */
+
+table {
+ width: 100%;
+ border-collapse: collapse;
+ margin: var(--space-md) 0;
+ border: var(--border-width) solid var(--border);
+ background: var(--surface);
+ box-shadow:
+ inset 1px 1px 0 var(--border-light),
+ inset -1px -1px 0 var(--border-dark),
+ 3px 3px 0 rgba(0, 0, 0, 0.12);
+}
+
+thead {
+ background: linear-gradient(90deg, var(--titlebar-a), var(--titlebar-b));
+ color: var(--titlebar-fg);
+ font-weight: 700;
+}
+
+th,
+td {
+ padding: var(--space-xs) var(--space-sm);
+ border: 1px solid var(--border-dark);
+ text-align: left;
+}
+
+tbody tr:nth-child(odd) {
+ background: var(--surface-alt);
+}
+
+tbody tr:nth-child(even) {
+ background: var(--surface);
+}
+
+tbody tr:hover {
+ background: color-mix(in srgb, var(--primary) 12%, transparent);
+}
+
+/* code */
+
+code {
+ background: var(--surface-alt);
+ padding: 0.25rem 0.5rem;
+ border: 1px solid var(--border-dark);
+ font-size: 0.875rem;
+ font-family: var(--font-mono);
+}
+
+pre {
+ background: var(--surface-alt);
+ border: var(--border-width) solid var(--border);
+ padding: var(--space-md);
+ margin: var(--space-md) 0;
+ overflow-x: auto;
+ box-shadow:
+ inset 1px 1px 0 var(--border-light),
+ inset -1px -1px 0 var(--border-dark),
+ 3px 3px 0 rgba(0, 0, 0, 0.12);
+}
+
+pre code {
+ background: transparent;
+ border: none;
+ padding: 0;
+ font-size: 0.875rem;
+}
+
+/* Prism.js syntax highlighting */
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: var(--muted);
+ font-style: italic;
+}
+
+.token.punctuation {
+ color: var(--fg);
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol {
+ color: var(--secondary-dark);
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin {
+ color: var(--accent-brown-dark);
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+ color: var(--primary-dark);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: var(--primary-dark);
+ font-weight: 700;
+}
+
+.token.function,
+.token.class-name {
+ color: var(--primary);
+ font-weight: 700;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+ color: var(--accent-brown);
+}
+
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+
+.token.italic {
+ font-style: italic;
+}
+
+/* Dark theme variants */
+
+[data-theme="dark"] .token.keyword,
+[data-theme="dark"] .token.operator {
+ color: var(--primary-light);
+}
+
+[data-theme="dark"] .token.string,
+[data-theme="dark"] .token.selector {
+ color: var(--accent-brown-light);
+}
+
+[data-theme="dark"] .token.number,
+[data-theme="dark"] .token.constant {
+ color: var(--secondary-light);
+}
+
+/* dividers */
+
+hr {
+ border: none;
+ border-top: 2px solid var(--border-dark);
+ margin: var(--space-lg) 0;
+ height: 0;
+}
+
+/* layout */
+
+header {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ z-index: 1000;
+ border-bottom: 2px solid var(--border);
+ padding: 0.45rem var(--space-md);
+ margin-bottom: 0;
+ background: linear-gradient(90deg, var(--titlebar-a), var(--titlebar-b));
+ color: var(--titlebar-fg);
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: var(--space-md);
+ box-shadow:
+ inset 1px 1px 0 var(--border-light),
+ inset -1px -1px 0 var(--border-dark),
+ 0 2px 0 rgba(0, 0, 0, 0.08);
+}
+
+header h1 {
+ display: none;
+}
+
+header::before {
+ content: "";
+ display: inline-block;
+ width: 1.5rem;
+ height: 1.5rem;
+ background-image: url("../assets/img/coffee.svg");
+ background-size: 1.1rem 1.1rem;
+ background-position: center;
+ background-repeat: no-repeat;
+ margin-right: 0.5rem;
+ background-color: var(--surface);
+ border: 2px outset var(--border-light);
+ box-shadow:
+ inset 1px 1px 0 var(--highlight),
+ inset -1px -1px 0 var(--lowlight);
+}
+
+nav {
+ display: flex;
+ gap: var(--space-md);
+ flex-wrap: wrap;
+ align-items: center;
+ margin: 0;
+ flex: 1;
+}
+
+nav a {
+ font-size: 0.85rem;
+ padding: 0.1rem 0.15rem;
+ color: var(--titlebar-fg);
+ text-decoration: none;
+ border-bottom: 2px solid color-mix(in srgb, var(--titlebar-fg) 55%, transparent);
+}
+
+nav a:visited {
+ color: var(--titlebar-fg);
+}
+
+nav a:hover {
+ background: color-mix(in srgb, var(--surface-alt) 18%, transparent);
+ border-bottom-color: var(--primary-light);
+}
+
+nav a:active {
+ background: color-mix(in srgb, var(--surface-alt) 28%, transparent);
+ border-bottom-color: var(--primary);
+}
+
+main {
+ flex: 1;
+}
+
+article {
+ border: var(--border-width) solid var(--border);
+ padding: var(--space-md);
+ margin-bottom: var(--space-lg);
+ background: var(--surface);
+ box-shadow:
+ inset 1px 1px 0 var(--border-light),
+ inset -1px -1px 0 var(--border-dark),
+ 4px 4px 0 rgba(0, 0, 0, 0.14),
+ 5px 5px 0 rgba(0, 0, 0, 0.06);
+}
+
+article > :last-child {
+ margin-bottom: 0;
+}
+
+article h2 {
+ margin: calc(var(--space-md) * -1) calc(var(--space-md) * -1) var(--space-md);
+ border-left: none;
+ border-right: none;
+ border-top: none;
+ border-bottom: var(--border-width) solid var(--border);
+ box-shadow: none;
+ text-shadow: none;
+}
+
+footer {
+ border: var(--border-width) solid var(--border);
+ padding: var(--space-md);
+ text-align: center;
+ background: var(--surface);
+ font-size: 0.875rem;
+ box-shadow:
+ inset 1px 1px 0 var(--border-light),
+ inset -1px -1px 0 var(--border-dark),
+ 4px 4px 0 rgba(0, 0, 0, 0.14),
+ 5px 5px 0 rgba(0, 0, 0, 0.06);
+}
+
+footer > :last-child {
+ margin-bottom: 0;
+}
+
+/* components */
+
+/* forms */
+
+input,
+textarea,
+select {
+ font-family: var(--font-mono);
+ padding: var(--space-xs) var(--space-sm);
+ border: 2px inset var(--border-light);
+ background: var(--surface-alt);
+ color: var(--fg);
+ font-size: 0.875rem;
+ box-shadow:
+ inset 1px 1px 0 var(--lowlight),
+ inset -1px -1px 0 var(--highlight);
+ transition: border-color 0.15s, box-shadow 0.15s;
+ width: 100%;
+ max-width: 100%;
+}
+
+input::placeholder,
+textarea::placeholder,
+select::placeholder {
+ color: var(--muted);
+ opacity: 0.8;
+}
+
+[data-theme="dark"] input::placeholder,
+[data-theme="dark"] textarea::placeholder,
+[data-theme="dark"] select::placeholder {
+ color: #b8b0a0;
+ opacity: 1;
+}
+
+input:focus,
+textarea:focus,
+select:focus {
+ outline: 1px dotted var(--fg);
+ outline-offset: 2px;
+ border-color: var(--primary);
+ box-shadow:
+ inset 1px 1px 0 var(--lowlight),
+ inset -1px -1px 0 var(--highlight),
+ 0 0 0 2px var(--primary);
+}
+
+input:invalid,
+textarea:invalid {
+ border-color: var(--error);
+}
+
+input:invalid:focus,
+textarea:invalid:focus {
+ box-shadow:
+ inset 1px 1px 0 var(--highlight),
+ inset -1px -1px 0 var(--lowlight),
+ 0 0 0 2px var(--error);
+}
+
+textarea {
+ resize: vertical;
+ min-height: 4rem;
+ width: 100%;
+}
+
+select {
+ cursor: pointer;
+ appearance: none;
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232a1f1d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
+ background-repeat: no-repeat;
+ background-position: right 0.5rem center;
+ background-size: 1.2em;
+ padding-right: 2.5rem;
+}
+
+[data-theme="dark"] select {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23f9efea' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
+}
+
+option {
+ background: var(--bg);
+ color: var(--fg);
+ padding: var(--space-sm);
+}
+
+option:checked {
+ background: linear-gradient(var(--primary), var(--primary));
+ color: var(--bg);
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+ appearance: none;
+ width: 1.3rem;
+ height: 1.3rem;
+ min-width: 1.3rem;
+ min-height: 1.3rem;
+ padding: 0;
+ cursor: pointer;
+ margin: 0 0.5rem 0 0;
+ vertical-align: middle;
+ border: 2px inset var(--border-light);
+ box-shadow:
+ inset 1px 1px 0 var(--lowlight),
+ inset -1px -1px 0 var(--highlight);
+ background: var(--surface-alt);
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ font-weight: normal;
+}
+
+input[type="radio"] {
+ border-radius: 50%;
+}
+
+input[type="checkbox"]:checked,
+input[type="radio"]:checked {
+ background: var(--primary);
+ border-style: inset;
+}
+
+label {
+ display: block;
+ margin-bottom: var(--space-xs);
+ font-weight: bold;
+ color: var(--fg);
+}
+
+input[type="checkbox"] + label,
+input[type="radio"] + label {
+ display: inline;
+ margin: 0;
+ font-weight: normal;
+}
+
+/* toggle switches */
+
+input[type="checkbox"].toggle {
+ appearance: none;
+ width: 2.8rem;
+ height: 1.6rem;
+ padding: 0;
+ margin: 0 0.5rem 0 0;
+ border: 2px outset var(--border-light);
+ background: var(--muted);
+ cursor: pointer;
+ position: relative;
+ vertical-align: middle;
+ box-shadow:
+ inset 1px 1px 0 rgba(255, 255, 255, 0.3),
+ inset -1px -1px 0 rgba(0, 0, 0, 0.6);
+ transition: background 0.2s;
+}
+
+input[type="checkbox"].toggle:checked {
+ background: var(--primary);
+}
+
+input[type="checkbox"].toggle::after {
+ content: "";
+ position: absolute;
+ width: 0.6rem;
+ height: 0.6rem;
+ background: var(--surface);
+ border: 2px outset var(--border-light);
+ top: 50%;
+ transform: translateY(-50%);
+ left: 0.2rem;
+ transition: left 0.2s;
+ box-shadow:
+ inset 1px 1px 0 var(--highlight),
+ inset -1px -1px 0 var(--lowlight);
+}
+
+input[type="checkbox"].toggle:checked::after {
+ left: 1.5rem;
+}
+
+[data-theme="dark"] input[type="checkbox"].toggle {
+ background: var(--secondary);
+}
+
+[data-theme="dark"] input[type="checkbox"].toggle:checked {
+ background: var(--primary);
+}
+
+[data-theme="dark"] input[type="checkbox"].toggle::after {
+ background: var(--accent-brown-light);
+}
+
+#theme-toggle::before {
+ content: "☾";
+ position: absolute;
+ right: 0.4rem;
+ top: 50%;
+ transform: translateY(-50%);
+ font-size: 0.9rem;
+ line-height: 1;
+ color: var(--titlebar-fg);
+ transition: opacity 0.2s;
+}
+
+#theme-toggle:checked::before {
+ content: "☀";
+ right: auto;
+ left: 0.4rem;
+}
+
+/* range sliders */
+
+input[type="range"] {
+ width: 100%;
+ height: 2.2rem;
+ background: transparent;
+ cursor: pointer;
+ appearance: none;
+ vertical-align: middle;
+}
+
+input[type="range"]::-webkit-slider-thumb {
+ appearance: none;
+ width: 1.5rem;
+ height: 1rem;
+ margin-top: -0.25rem;
+ background: linear-gradient(135deg, var(--primary-light) 0%, var(--primary) 50%, var(--primary-dark) 100%);
+ border: 2px outset var(--border-light);
+ cursor: pointer;
+ box-shadow:
+ inset 1px 1px 0 var(--highlight),
+ inset -1px -1px 0 var(--lowlight),
+ 2px 2px 0 rgba(0, 0, 0, 0.3),
+ 3px 3px 0 rgba(0, 0, 0, 0.1);
+}
+
+input[type="range"]::-webkit-slider-thumb:active {
+ box-shadow:
+ inset 1px 1px 0 var(--lowlight),
+ inset -1px -1px 0 var(--highlight),
+ 1px 1px 0 rgba(0, 0, 0, 0.2);
+}
+
+input[type="range"]::-moz-range-thumb {
+ width: 1.5rem;
+ height: 0.8rem;
+ margin-top: -0.15rem;
+ background: linear-gradient(135deg, var(--primary-light) 0%, var(--primary) 50%, var(--primary-dark) 100%);
+ border: 2px outset var(--border-light);
+ cursor: pointer;
+ box-shadow:
+ inset 1px 1px 0 var(--highlight),
+ inset -1px -1px 0 var(--lowlight),
+ 2px 2px 0 rgba(0, 0, 0, 0.3),
+ 3px 3px 0 rgba(0, 0, 0, 0.1);
+ border-radius: 0.3rem;
+}
+
+input[type="range"]::-moz-range-thumb:active {
+ box-shadow:
+ inset 1px 1px 0 var(--lowlight),
+ inset -1px -1px 0 var(--highlight),
+ 1px 1px 0 rgba(0, 0, 0, 0.2);
+}
+
+input[type="range"]::-webkit-slider-runnable-track {
+ background: linear-gradient(180deg,
+ #c0c0c0 0%,
+ #e8e8e8 1px,
+ #dfdfdf 2px,
+ #d0d0d0 100%);
+ border: 2px inset var(--border-light);
+ height: 0.8rem;
+ box-shadow:
+ inset 2px 2px 0 rgba(255, 255, 255, 0.8),
+ inset -2px -2px 0 rgba(0, 0, 0, 0.4),
+ inset 1px 1px 0 rgba(0, 0, 0, 0.1);
+}
+
+input[type="range"]::-moz-range-track {
+ background: transparent;
+ border: none;
+}
+
+input[type="range"]::-moz-range-progress {
+ background: linear-gradient(180deg,
+ var(--secondary-light) 0%,
+ var(--secondary) 50%,
+ var(--secondary-dark) 100%);
+ height: 0.8rem;
+ border: 2px inset var(--border-light);
+ box-shadow:
+ inset 2px 2px 0 rgba(255, 255, 255, 0.6),
+ inset -2px -2px 0 rgba(0, 0, 0, 0.3);
+}
+
+fieldset {
+ border: 2px solid var(--border-light);
+ padding: var(--space-md);
+ margin: var(--space-md) 0;
+ background: var(--surface);
+ box-shadow:
+ inset 1px 1px 0 rgba(255, 255, 255, 0.3),
+ inset -1px -1px 0 rgba(0, 0, 0, 0.6);
+}
+
+fieldset > :last-child {
+ margin-bottom: 0;
+}
+
+legend {
+ padding: 0 var(--space-xs);
+ margin-left: calc(var(--space-xs) * -1);
+ font-weight: bold;
+ color: var(--fg);
+ background: var(--surface);
+}
+
+/* buttons */
+
+button {
+ font-family: var(--font-mono);
+ font-weight: 700;
+ padding: var(--space-xs) var(--space-sm);
+ border: 2px outset var(--border-light);
+ background: var(--surface);
+ color: var(--fg);
+ font-size: 0.875rem;
+ box-shadow:
+ inset 1px 1px 0 var(--highlight),
+ inset -1px -1px 0 var(--lowlight),
+ 2px 2px 0 rgba(0, 0, 0, 0.18);
+ transition:
+ transform 0.05s,
+ box-shadow 0.05s,
+ background 0.1s;
+ cursor: pointer;
+}
+
+button:hover {
+ background: var(--surface-alt);
+}
+
+button:active {
+ transform: translate(1px, 1px);
+ border-style: inset;
+ box-shadow:
+ inset 1px 1px 0 var(--lowlight),
+ inset -1px -1px 0 var(--highlight);
+}
+
+/* button variants */
+
+button.primary {
+ background: var(--primary);
+ color: var(--surface-alt);
+}
+
+button.primary:hover {
+ background: var(--primary-light);
+}
+
+button.primary:active {
+ background: var(--primary-dark);
+}
+
+button.secondary {
+ background: var(--secondary);
+ color: var(--fg);
+}
+
+button.secondary:hover {
+ background: var(--secondary-light);
+}
+
+button.secondary:active {
+ background: var(--secondary-dark);
+}
+
+button.success,
+button.error,
+button.warning,
+button.info {
+ color: var(--surface-alt);
+}
+
+button.success {
+ background: var(--success);
+}
+
+button.error {
+ background: var(--error);
+}
+
+button.warning {
+ background: var(--warning);
+}
+
+button.info {
+ background: var(--info);
+}
+
+button.success:hover,
+button.error:hover,
+button.warning:hover,
+button.info:hover {
+ filter: brightness(1.06);
+}
+
+button.contrast {
+ background: var(--fg);
+ color: var(--surface-alt);
+}
+
+button.contrast:hover {
+ background: var(--muted);
+}
+
+button:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+ transform: none !important;
+}
+
+/* button groups */
+
+.button-group {
+ display: inline-flex;
+ border: var(--border-width) solid var(--border);
+ box-shadow:
+ inset 1px 1px 0 var(--border-light),
+ inset -1px -1px 0 var(--border-dark),
+ 3px 3px 0 rgba(0, 0, 0, 0.12);
+}
+
+.button-group button {
+ border: none;
+ margin: 0;
+ border-radius: 0;
+ box-shadow: none;
+}
+
+.button-group button:not(:last-child) {
+ border-right: 1px solid var(--border-dark);
+}
+
+.button-group button:hover {
+ box-shadow: none;
+ transform: none;
+}
+
+.button-group button:active {
+ box-shadow: none;
+ transform: none;
+}
+
+/* alerts & messages */
+
+.alert {
+ padding: var(--space-md);
+ margin: var(--space-md) 0;
+ border: var(--border-width) solid var(--border);
+ border-left: 4px solid var(--info);
+ background: var(--surface);
+ box-shadow:
+ inset 1px 1px 0 var(--border-light),
+ inset -1px -1px 0 var(--border-dark),
+ 3px 3px 0 rgba(0, 0, 0, 0.12);
+}
+
+.alert.success {
+ border-left-color: var(--success);
+ background-color: color-mix(in srgb, var(--success) 10%, transparent);
+}
+
+.alert.error {
+ border-left-color: var(--error);
+ background-color: color-mix(in srgb, var(--error) 10%, transparent);
+}
+
+.alert.warning {
+ border-left-color: var(--warning);
+ background-color: color-mix(in srgb, var(--warning) 10%, transparent);
+}
+
+.alert.info {
+ border-left-color: var(--info);
+ background-color: color-mix(in srgb, var(--info) 10%, transparent);
+}
+
+/* badges & pills */
+
+.badge {
+ display: inline-block;
+ padding: 0.25rem 0.5rem;
+ margin: 0 0.25rem;
+ background: var(--surface-alt);
+ color: var(--fg);
+ font-size: 0.75rem;
+ font-weight: 700;
+ border: 1px solid var(--border-dark);
+ box-shadow:
+ inset 1px 1px 0 var(--border-light),
+ inset -1px -1px 0 var(--border-dark);
+}
+
+.badge.primary {
+ background: var(--primary);
+ color: var(--surface-alt);
+}
+
+.badge.success {
+ background: var(--success);
+ color: var(--surface-alt);
+}
+
+.badge.error {
+ background: var(--error);
+ color: var(--surface-alt);
+}
+
+.badge.warning {
+ background: var(--warning);
+ color: var(--surface-alt);
+}
+
+.badge.info {
+ background: var(--info);
+ color: var(--surface-alt);
+}
+
+.badge.contrast {
+ background: var(--fg);
+ color: var(--surface-alt);
+}
+
+/* helpers */
+
+.text-success {
+ color: var(--success);
+ font-weight: bold;
+}
+
+.text-error {
+ color: var(--error);
+ font-weight: bold;
+}
+
+.text-warning {
+ color: var(--warning);
+ font-weight: bold;
+}
+
+.text-info {
+ color: var(--info);
+ font-weight: bold;
+}
+
+.text-muted {
+ color: var(--muted);
+}
+
+.text-contrast {
+ color: var(--fg);
+ font-weight: bold;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.text-right {
+ text-align: right;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.mt-xs { margin-top: var(--space-xs); }
+.mt-sm { margin-top: var(--space-sm); }
+.mt-md { margin-top: var(--space-md); }
+.mt-lg { margin-top: var(--space-lg); }
+.mt-xl { margin-top: var(--space-xl); }
+
+.mb-xs { margin-bottom: var(--space-xs); }
+.mb-sm { margin-bottom: var(--space-sm); }
+.mb-md { margin-bottom: var(--space-md); }
+.mb-lg { margin-bottom: var(--space-lg); }
+.mb-xl { margin-bottom: var(--space-xl); }
+
+.mx-auto {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.py-md {
+ padding-top: var(--space-md);
+ padding-bottom: var(--space-md);
+}
+
+#theme-toggle {
+ margin-left: auto;
+ margin-bottom: 0;
+}
+
+/* fairy dust */
+
+@keyframes fairy-float {
+ 0% {
+ opacity: 1;
+ transform: translateY(0) scale(1);
+ }
+ 100% {
+ opacity: 0;
+ transform: translateY(40px) scale(0.5);
+ }
+}