/* ══════════════════════════════════════════════════════════════ jev8ball — brutalist oracle interface Squared geometry, monospace type, one accent per verdict. ══════════════════════════════════════════════════════════════ */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; border-radius: 0 !important; scrollbar-width: none; -ms-overflow-style: none; } ::-webkit-scrollbar { display: none; } :root { --bg: #0b0b0b; --bg-deep: #050505; --panel-bg: #0e0e0e; --border: #1c1c1c; --border-hover: #333333; --border-focus: #4a4a4a; --text: #e5e5e5; --text-muted: #8a8a8a; --text-dim: #565656; --accent: #38bdf8; --green: #10b981; --red: #ef4444; --amber: #f59e0b; --grid: rgba(255, 255, 255, 0.022); --font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; --step-1: 4px; --step-2: 8px; --step-3: 12px; --step-4: 18px; --step-5: 28px; --step-6: 40px; } html { -webkit-text-size-adjust: 100%; } body { font-family: var(--font-mono); font-size: 15px; line-height: 1.5; background: var(--bg); color: var(--text); min-height: 100vh; overflow-x: hidden; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* Faint engineering grid behind everything. */ body::before { content: ''; position: fixed; inset: 0; background-image: linear-gradient(var(--grid) 1px, transparent 1px), linear-gradient(90deg, var(--grid) 1px, transparent 1px); background-size: 44px 44px; pointer-events: none; z-index: 0; } /* ─── utilities ─── */ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; } .skip-link { position: absolute; top: -60px; left: var(--step-3); z-index: 200; padding: var(--step-2) var(--step-3); background: var(--panel-bg); border: 1px solid var(--border-focus); color: var(--text); font-size: 0.75rem; text-decoration: none; transition: top 0.15s ease; } .skip-link:focus { top: var(--step-3); } kbd { font-family: inherit; font-size: 0.9em; padding: 1px 4px; border: 1px solid var(--border); background: #101010; color: var(--text-muted); } :focus-visible { outline: 1px solid var(--accent); outline-offset: 2px; } #particles { position: fixed; inset: 0; width: 100%; height: 100%; pointer-events: none; z-index: 0; opacity: 0.9; } .container { position: relative; z-index: 1; max-width: 640px; margin: 0 auto; padding: var(--step-6) var(--step-4) var(--step-6); } /* ─── header ─── */ .header { text-align: center; margin-bottom: var(--step-5); } .top-nav { display: flex; justify-content: space-between; align-items: center; gap: var(--step-2); margin-bottom: var(--step-3); font-size: 0.7rem; } .brand-tag { color: var(--text-dim); text-transform: lowercase; letter-spacing: 0.08em; } .nav-actions { display: flex; gap: var(--step-1); } .btn-ghost { background: transparent; border: 1px solid var(--border); color: var(--text-dim); font-family: inherit; font-size: 0.68rem; padding: 3px 8px; cursor: pointer; transition: color 0.15s ease, border-color 0.15s ease, background-color 0.15s ease; } .btn-ghost:hover { border-color: var(--border-hover); color: var(--text); background: #101010; } .btn-ghost[aria-pressed='true'] { color: var(--accent); border-color: rgba(56, 189, 248, 0.4); } h1 { font-size: clamp(1.9rem, 8vw, 2.5rem); font-weight: 600; letter-spacing: -0.045em; color: #fff; line-height: 1.05; margin-bottom: var(--step-1); } .subtitle-row { display: flex; align-items: center; justify-content: center; gap: var(--step-2); font-size: 0.76rem; letter-spacing: 0.03em; flex-wrap: wrap; } .subtitle { color: var(--text-dim); text-transform: lowercase; } .status-sep { color: #262626; } .backend-status { display: inline-flex; align-items: center; gap: 6px; background: transparent; border: 1px solid transparent; padding: 2px 6px; font-family: inherit; font-size: 0.72rem; color: var(--text-dim); cursor: pointer; transition: color 0.15s ease, border-color 0.15s ease; } .backend-status:hover { color: var(--text-muted); border-color: var(--border); } .status-dot { width: 6px; height: 6px; background: #333; display: inline-block; transition: background-color 0.2s ease, box-shadow 0.2s ease; } .backend-status.online .status-dot { background: var(--green); box-shadow: 0 0 8px rgba(16, 185, 129, 0.45); } .backend-status.online .status-text { color: var(--text-muted); } .backend-status.degraded .status-dot { background: var(--amber); } .backend-status.offline .status-dot { background: var(--red); } /* ─── oracle stage ─── */ .ball-stage { display: flex; flex-direction: column; align-items: center; gap: var(--step-3); margin-bottom: var(--step-5); } .ball-frame { position: relative; width: min(86vw, 344px); aspect-ratio: 1 / 1; border: 1px solid var(--border); background: radial-gradient(circle at 50% 42%, rgba(56, 189, 248, 0.05) 0%, transparent 62%), var(--bg-deep); transition: border-color 0.25s ease; } .ball-frame:hover { border-color: var(--border-hover); } .oracle-canvas { display: block; width: 100%; height: 100%; touch-action: manipulation; } /* Transparent hit target: keeps the canvas purely presentational while giving keyboard and touch users a proper button. */ .roll-trigger { position: absolute; inset: 0; width: 100%; height: 100%; background: transparent; border: 0; cursor: pointer; } .roll-trigger:disabled { cursor: progress; } .frame-corner { position: absolute; width: 10px; height: 10px; border: 1px solid rgba(56, 189, 248, 0.35); pointer-events: none; } .frame-corner-tl { top: -1px; left: -1px; border-right: 0; border-bottom: 0; } .frame-corner-tr { top: -1px; right: -1px; border-left: 0; border-bottom: 0; } .frame-corner-bl { bottom: -1px; left: -1px; border-right: 0; border-top: 0; } .frame-corner-br { bottom: -1px; right: -1px; border-left: 0; border-top: 0; } .stage-hint { font-size: 0.68rem; color: var(--text-dim); letter-spacing: 0.05em; text-transform: lowercase; } /* ─── prompt ─── */ .prompt-section { margin-bottom: var(--step-5); } .prompt-input-wrap { display: flex; align-items: stretch; border: 1px solid var(--border); background: var(--panel-bg); transition: border-color 0.15s ease; } .prompt-input-wrap:focus-within { border-color: var(--border-focus); } .prompt-symbol { display: flex; align-items: center; padding: 0 var(--step-2) 0 var(--step-3); color: var(--accent); font-size: 0.85rem; user-select: none; } .prompt-input { flex: 1; min-width: 0; background: transparent; border: 0; color: #fff; font-family: inherit; font-size: 0.85rem; padding: var(--step-3) 0; outline: none; } .prompt-input::placeholder { color: #3f3f3f; } .prompt-input:disabled { opacity: 0.5; } .btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--step-2); min-width: 104px; border: 1px solid var(--border); background: #141414; color: var(--text-muted); font-family: inherit; font-size: 0.72rem; font-weight: 600; letter-spacing: 0.06em; text-transform: lowercase; padding: var(--step-3) var(--step-3); cursor: pointer; transition: background-color 0.12s ease, border-color 0.12s ease, color 0.12s ease; } .btn:hover:not(:disabled) { background: #1d1d1d; border-color: var(--border-hover); color: #fff; } .btn:disabled { opacity: 0.45; cursor: not-allowed; } .btn-ask:not(:disabled) { color: var(--text); } .spinner { width: 12px; height: 12px; border: 2px solid rgba(255, 255, 255, 0.2); border-top-color: #fff; border-radius: 50% !important; animation: spin 0.6s linear infinite; display: none; } body[data-busy='true'] .spinner { display: inline-block; } body[data-busy='true'] #btnText { display: none; } @keyframes spin { to { transform: rotate(360deg); } } .input-hint { margin-top: var(--step-2); font-size: 0.66rem; color: var(--text-dim); letter-spacing: 0.02em; } .quick-prompts { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: var(--step-3); font-size: 0.7rem; } .quick-label { color: var(--text-dim); } .quick-pill { background: transparent; border: 1px solid var(--border); color: var(--text-muted); font-family: inherit; font-size: 0.68rem; padding: 3px 8px; cursor: pointer; transition: color 0.12s ease, border-color 0.12s ease; } .quick-pill:hover { border-color: var(--border-hover); color: #fff; } .quick-pill:disabled { opacity: 0.4; cursor: not-allowed; } /* ─── telemetry ─── */ .telemetry-card { background: var(--panel-bg); border: 1px solid var(--border); margin-bottom: var(--step-5); transition: border-color 0.2s ease; } .telemetry-card[data-tone='affirmative'] { border-color: rgba(16, 185, 129, 0.35); } .telemetry-card[data-tone='negative'] { border-color: rgba(239, 68, 68, 0.35); } .telemetry-card[data-tone='neutral'] { border-color: rgba(56, 189, 248, 0.3); } .telemetry-card[data-tone='offline'] { border-color: var(--border-hover); } .telemetry-header { display: flex; justify-content: space-between; align-items: center; padding: var(--step-2) var(--step-3); border-bottom: 1px solid var(--border); background: #080808; } .telemetry-title { font-size: 0.68rem; font-weight: 700; color: var(--text-dim); letter-spacing: 0.06em; } .telemetry-badge { font-size: 0.62rem; font-weight: 700; letter-spacing: 0.06em; padding: 2px 6px; background: #141414; border: 1px solid var(--border); color: var(--text-muted); transition: color 0.2s ease, border-color 0.2s ease, background-color 0.2s ease; } .telemetry-badge.affirmative { color: var(--green); border-color: var(--green); background: rgba(16, 185, 129, 0.08); } .telemetry-badge.neutral { color: var(--accent); border-color: var(--accent); background: rgba(56, 189, 248, 0.08); } .telemetry-badge.negative { color: var(--red); border-color: var(--red); background: rgba(239, 68, 68, 0.08); } .telemetry-badge.offline { color: var(--text-muted); border-color: var(--text-dim); background: rgba(255, 255, 255, 0.04); } .telemetry-badge.error { color: var(--amber); border-color: var(--amber); background: rgba(245, 158, 11, 0.08); } .telemetry-body { padding: var(--step-4) var(--step-3) var(--step-3); } .verdict { font-size: 1.06rem; font-weight: 600; line-height: 1.35; color: #fff; margin-bottom: var(--step-4); padding-left: var(--step-3); border-left: 2px solid var(--border-hover); transition: border-color 0.25s ease; } .telemetry-card[data-tone='affirmative'] .verdict { border-left-color: var(--green); } .telemetry-card[data-tone='negative'] .verdict { border-left-color: var(--red); } .telemetry-card[data-tone='neutral'] .verdict { border-left-color: var(--accent); } .telemetry-card[data-tone='offline'] .verdict { border-left-color: var(--text-dim); color: var(--text-muted); } .telemetry-row { display: flex; justify-content: space-between; align-items: baseline; font-size: 0.75rem; margin-bottom: 6px; } .t-label { color: var(--text-dim); font-size: 0.66rem; font-weight: 600; letter-spacing: 0.04em; } .t-val { color: #fff; font-weight: 600; } .t-val.mono { font-variant-numeric: tabular-nums; } .telemetry-meter-bar { width: 100%; height: 4px; background: #161616; margin-bottom: var(--step-4); overflow: hidden; } .meter-fill { height: 100%; width: 0%; background: var(--text-dim); transition: width 0.45s cubic-bezier(0.22, 1, 0.36, 1), background-color 0.35s ease; } .meter-fill.affirmative { background: var(--green); } .meter-fill.neutral { background: var(--accent); } .meter-fill.negative { background: var(--red); } .telemetry-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--step-3); padding-top: var(--step-3); border-top: 1px solid #161616; } @media (min-width: 480px) { .telemetry-grid { grid-template-columns: repeat(4, 1fr); } } .t-cell { display: flex; flex-direction: column; gap: 3px; min-width: 0; } .t-cell-label { font-size: 0.6rem; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.06em; } .t-cell-val { font-size: 0.78rem; font-weight: 600; color: #fff; font-variant-numeric: tabular-nums; overflow: hidden; text-overflow: ellipsis; } .telemetry-details { font-size: 0.68rem; margin-top: var(--step-3); } .details-summary { color: var(--text-dim); cursor: pointer; user-select: none; list-style: none; } .details-summary::-webkit-details-marker { display: none; } .details-summary:hover { color: var(--text-muted); } .json-dump { margin-top: var(--step-2); padding: var(--step-2); background: var(--bg-deep); border: 1px solid #161616; color: #7c7c7c; font-family: inherit; font-size: 0.64rem; line-height: 1.45; max-height: 200px; overflow: auto; white-space: pre-wrap; word-break: break-word; } /* ─── history ─── */ .history-section { margin-bottom: var(--step-5); } .history-header { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: var(--step-3); border-bottom: 1px solid var(--border); padding-bottom: 6px; } .history-header h2 { font-size: 0.82rem; font-weight: 600; text-transform: lowercase; color: #fff; letter-spacing: 0.03em; } .history-count { font-size: 0.68rem; color: var(--text-dim); } .history-list { list-style: none; display: flex; flex-direction: column; gap: 6px; } .history-item { background: #0a0a0a; border: 1px solid var(--border); padding: var(--step-2) var(--step-3); display: flex; justify-content: space-between; align-items: center; gap: var(--step-3); cursor: pointer; transition: border-color 0.12s ease, background-color 0.12s ease; } .history-item:hover { border-color: var(--border-hover); background: #0d0d0d; } .history-left { display: flex; flex-direction: column; gap: 3px; min-width: 0; } .history-q { font-size: 0.78rem; color: #fff; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .history-time { font-size: 0.62rem; color: var(--text-dim); } .history-pill { font-size: 0.66rem; font-weight: 600; padding: 3px 8px; border: 1px solid var(--border); background: #111; color: var(--text-muted); white-space: nowrap; flex-shrink: 0; max-width: 46%; overflow: hidden; text-overflow: ellipsis; } .history-pill.affirmative { color: var(--green); border-color: rgba(16, 185, 129, 0.4); } .history-pill.neutral { color: var(--accent); border-color: rgba(56, 189, 248, 0.4); } .history-pill.negative { color: var(--red); border-color: rgba(239, 68, 68, 0.4); } .history-empty { font-size: 0.7rem; color: var(--text-dim); padding: var(--step-3) 0; } .history-empty[hidden] { display: none; } /* ─── footer ─── */ .footer { display: flex; flex-direction: column; gap: var(--step-1); border-top: 1px solid var(--border); padding-top: var(--step-3); font-size: 0.66rem; color: var(--text-dim); letter-spacing: 0.02em; } .footer-note { color: #3d3d3d; } /* ─── toast ─── */ .toast { position: fixed; bottom: var(--step-5); left: 50%; transform: translateX(-50%) translateY(14px); max-width: min(90vw, 420px); background: #161616; border: 1px solid var(--border-focus); color: #fff; font-size: 0.74rem; padding: var(--step-2) var(--step-4); opacity: 0; pointer-events: none; transition: opacity 0.2s ease, transform 0.2s cubic-bezier(0.16, 1, 0.3, 1); z-index: 150; } .toast.active { opacity: 1; transform: translateX(-50%) translateY(0); } .toast[data-kind='error'] { border-color: rgba(239, 68, 68, 0.5); } .toast[data-kind='warn'] { border-color: rgba(245, 158, 11, 0.5); } /* ─── responsive ─── */ @media (max-width: 420px) { .container { padding: var(--step-5) var(--step-3) var(--step-5); } .quick-prompts { font-size: 0.66rem; } .verdict { font-size: 0.98rem; } .btn { min-width: 88px; padding: var(--step-3) var(--step-2); } .input-hint { font-size: 0.62rem; } } @media (min-width: 720px) { .header { margin-bottom: var(--step-6); } .ball-stage { margin-bottom: var(--step-6); } } /* ─── reduced motion ─── */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.001ms !important; animation-iteration-count: 1 !important; transition-duration: 0.001ms !important; } .spinner { animation: spin 0.9s linear infinite !important; } } body[data-motion='reduced'] #particles { opacity: 0.35; } /* ─── forced colours ─── */ @media (forced-colors: active) { .ball-frame, .telemetry-card, .prompt-input-wrap, .history-item { border: 1px solid CanvasText; } .frame-corner { display: none; } }