Files
launcher/src/styles/base.css
T
Kelorastus b7f3061be3 ODIAN Launcher: hub, installer, local stack and remembered sign-in (M2)
- Tauri 2 + Svelte 5 hub in ODIAN dark: patch notes and roadmap, install and
  update progress, local stack status, settings with DHP and MCP addresses.
- crates/odian-packs: Rust installer for pack format v1 (signed manifests,
  resumable verified downloads from a DHP or an ODIAN drive), byte-compatible
  with ODIAN_MCP_Server's Python odian_packs.
- Local stack on 127.0.0.1: Postgres -> Engine API -> tile server -> Odian.exe,
  one Job Object, clean shutdown; database snapshot restore on a fresh PC only.
- Keycloak sign-in through the DHP's MCP, remembered until Sign out with a
  launcher session that renews the Engine token silently.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 15:23:17 +02:00

322 lines
6.3 KiB
CSS

/* Global reset and the few shared primitives (buttons, inputs, glass). */
*,
*::before,
*::after {
box-sizing: border-box;
}
html,
body,
#app {
height: 100%;
}
html {
background: var(--bg);
}
body {
margin: 0;
overflow: hidden;
background: var(--bg);
color: var(--ink);
font-family: var(--font-body);
font-size: var(--text-md);
line-height: 1.5;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
cursor: default;
user-select: none;
-webkit-user-select: none;
}
button,
input,
select,
textarea {
font: inherit;
color: inherit;
}
button {
cursor: pointer;
}
button:disabled {
cursor: not-allowed;
}
h1,
h2,
h3,
p {
margin: 0;
}
:focus {
outline: none;
}
:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
::selection {
background: rgba(91, 140, 255, 0.38);
color: var(--ink);
}
::-webkit-scrollbar {
width: 10px;
height: 10px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: var(--line-strong);
border: 3px solid transparent;
background-clip: padding-box;
border-radius: var(--radius);
}
::-webkit-scrollbar-thumb:hover {
background-color: var(--faint);
}
/* ── utilities ─────────────────────────────────────────────────────────── */
.mono {
font-family: var(--font-mono);
}
.tabular {
font-variant-numeric: tabular-nums;
}
.selectable {
user-select: text;
-webkit-user-select: text;
cursor: auto;
}
.eyebrow {
font-family: var(--font-mono);
font-size: var(--text-xs);
font-weight: 500;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--muted);
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
margin: -1px;
padding: 0;
overflow: hidden;
clip-path: inset(50%);
white-space: nowrap;
border: 0;
}
.glass {
background: var(--glass);
border: 1px solid var(--line);
border-radius: var(--radius);
backdrop-filter: blur(20px) saturate(120%);
-webkit-backdrop-filter: blur(20px) saturate(120%);
}
/* ── buttons ───────────────────────────────────────────────────────────── */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--space-2);
height: 36px;
padding: 0 14px;
border: 1px solid var(--line-strong);
border-radius: var(--radius);
background: transparent;
color: var(--ink-2);
font-size: var(--text-sm);
font-weight: 500;
white-space: nowrap;
transition:
background-color var(--dur-fast) var(--ease),
border-color var(--dur-fast) var(--ease),
color var(--dur-fast) var(--ease);
}
.btn:hover:not(:disabled) {
border-color: #4a4a52;
background: var(--surface-2);
color: var(--ink);
}
.btn:active:not(:disabled) {
background: var(--line);
}
.btn:disabled {
opacity: 0.45;
}
.btn-accent {
border-color: var(--accent);
background: var(--accent);
color: var(--accent-ink);
font-weight: 600;
}
.btn-accent:hover:not(:disabled) {
border-color: var(--accent-hover);
background: var(--accent-hover);
color: var(--accent-ink);
}
.btn-accent:active:not(:disabled) {
border-color: var(--accent-press);
background: var(--accent-press);
}
.btn-danger:hover:not(:disabled) {
border-color: rgba(248, 113, 113, 0.5);
background: var(--danger-soft);
color: var(--danger);
}
.btn-link {
display: inline;
height: auto;
padding: 0;
border: 0;
background: none;
color: var(--accent);
font-size: inherit;
font-weight: 500;
text-decoration: underline;
text-decoration-color: var(--accent-line);
text-underline-offset: 3px;
transition: color var(--dur-fast) var(--ease);
}
.btn-link:hover:not(:disabled) {
color: var(--accent-hover);
text-decoration-color: currentColor;
}
.btn-link:disabled {
color: var(--faint);
}
.icon-btn {
display: inline-grid;
place-items: center;
width: 32px;
height: 32px;
padding: 0;
border: 1px solid transparent;
border-radius: var(--radius);
background: transparent;
color: var(--muted);
transition:
background-color var(--dur-fast) var(--ease),
border-color var(--dur-fast) var(--ease),
color var(--dur-fast) var(--ease);
}
.icon-btn:hover:not(:disabled) {
border-color: var(--line);
background: var(--surface-2);
color: var(--ink);
}
.icon-btn:disabled {
opacity: 0.45;
}
/* ── form fields ───────────────────────────────────────────────────────── */
.field {
display: grid;
gap: 6px;
}
.field-label {
color: var(--ink-2);
font-size: var(--text-sm);
font-weight: 500;
}
.field-help {
color: var(--muted);
font-size: var(--text-xs);
}
.field-error {
color: var(--danger);
font-size: var(--text-xs);
}
.input {
width: 100%;
min-width: 0;
height: 36px;
padding: 0 10px;
border: 1px solid var(--line-strong);
border-radius: var(--radius);
background: var(--bg);
color: var(--ink);
font-family: var(--font-mono);
font-size: var(--text-sm);
cursor: text;
user-select: text;
-webkit-user-select: text;
transition:
border-color var(--dur-fast) var(--ease),
box-shadow var(--dur-fast) var(--ease);
}
.input::placeholder {
color: var(--faint);
}
.input:hover:not(:disabled) {
border-color: #4a4a52;
}
.input:focus-visible {
outline: none;
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--accent-soft);
}
.input[aria-invalid="true"] {
border-color: var(--danger);
}
.input:disabled {
color: var(--muted);
cursor: not-allowed;
}
/* ── motion ────────────────────────────────────────────────────────────── */
@keyframes pulse {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.35;
}
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}