/* ─── RESET & BRUTALIST GEOMETRY ─── */ * { box-sizing: border-box; margin: 0; padding: 0; border-radius: 0 !important; /* Strict squared-out geometry */ scrollbar-width: none !important; -ms-overflow-style: none !important; } ::-webkit-scrollbar { display: none; } :root { --bg: #0b0b0b; --panel-bg: #0e0e0e; --border: #1c1c1c; --border-hover: #333333; --border-focus: #555555; --text: #e5e5e5; --text-muted: #888888; --text-dim: #555555; --accent: #38bdf8; --green: #10b981; --red: #ef4444; --amber: #f59e0b; --font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; } body { font-family: var(--font-mono); background: var(--bg); color: var(--text); min-height: 100vh; position: relative; overflow-x: hidden; -webkit-font-smoothing: antialiased; } /* ─── PARTICLES BACKGROUND ─── */ #particles { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 0; } /* ─── CONTAINER ─── */ .container { position: relative; z-index: 1; max-width: 620px; margin: 45px auto 60px; padding: 0 20px; } /* ─── HEADER ─── */ .header { text-align: center; margin-bottom: 25px; } .top-nav { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; font-size: 0.7rem; } .brand-tag { color: var(--text-dim); text-transform: lowercase; letter-spacing: 0.04em; } .btn-ghost { background: transparent; border: 1px solid var(--border); color: var(--text-dim); font-size: 0.68rem; padding: 3px 8px; cursor: pointer; transition: all 0.15s ease; } .btn-ghost:hover { border-color: var(--border-hover); color: var(--text); } h1 { font-size: 2.2rem; font-weight: 600; letter-spacing: -0.04em; color: #fff; margin-bottom: 4px; } .subtitle-row { display: flex; align-items: center; justify-content: center; gap: 8px; font-size: 0.78rem; letter-spacing: 0.04em; } .subtitle { color: var(--text-dim); text-transform: lowercase; } .status-sep { color: #262626; } .backend-status { display: inline-flex; align-items: center; gap: 5px; color: var(--text-dim); font-size: 0.72rem; cursor: pointer; user-select: none; transition: color 0.15s ease; } .backend-status:hover { color: var(--text-muted); } .status-dot { width: 6px; height: 6px; background: #333333; 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.4); } .backend-status.online .status-text { color: var(--text-muted); } /* ─── HEXAGONAL 3D FIGURE STAGE & VESSEL ─── */ .ball-stage { display: flex; justify-content: center; align-items: center; margin: 14px 0 32px; perspective: 1000px; } .ball-wrapper { position: relative; display: flex; flex-direction: column; align-items: center; cursor: pointer; perspective: 1000px; } /* Hexagonal 3D Prism Figure */ .hex-figure-3d { width: 210px; height: 210px; position: relative; transform-style: preserve-3d; transition: transform 0.2s cubic-bezier(0.2, 0, 0, 1); margin-bottom: 6px; } /* Hex Prism Cap - Front / Back */ .hex-cap { position: absolute; inset: 0; clip-path: polygon(50% 0%, 93.3% 25%, 93.3% 75%, 50% 100%, 6.7% 75%, 6.7% 25%); } .hex-cap-top { transform: translateZ(-28px); background: radial-gradient(circle at 50% 50%, #171717 0%, #0c0c0c 60%, #000 100%); border: 1px solid rgba(255, 255, 255, 0.08); box-shadow: inset 0 0 30px rgba(0, 0, 0, 0.9); } .hex-cap-front { transform: translateZ(28px); background: radial-gradient(circle at 35% 30%, #2a2a2a 0%, #151515 45%, #0a0a0a 75%, #020202 100%); border: 1px solid rgba(255, 255, 255, 0.15); box-shadow: 0 15px 35px rgba(0, 0, 0, 0.9), inset 0 2px 4px rgba(255, 255, 255, 0.2), inset 0 -6px 14px rgba(0, 0, 0, 0.9); display: flex; align-items: center; justify-content: center; } /* 6 Hexagonal Prism Facet Edges around the sides */ .hex-facet { position: absolute; top: 50%; left: 50%; width: 105px; height: 56px; margin-left: -52.5px; margin-top: -28px; background: linear-gradient(to bottom, #222, #0d0d0d 60%, #050505); border-top: 1px solid rgba(255, 255, 255, 0.16); border-bottom: 1px solid rgba(0, 0, 0, 0.8); box-sizing: border-box; opacity: 0.92; pointer-events: none; } .hex-facet-0 { transform: rotateZ(0deg) rotateX(90deg) translateZ(90.9px); } .hex-facet-1 { transform: rotateZ(60deg) rotateX(90deg) translateZ(90.9px); filter: brightness(0.85); } .hex-facet-2 { transform: rotateZ(120deg) rotateX(90deg) translateZ(90.9px); filter: brightness(0.65); } .hex-facet-3 { transform: rotateZ(180deg) rotateX(90deg) translateZ(90.9px); filter: brightness(0.5); } .hex-facet-4 { transform: rotateZ(240deg) rotateX(90deg) translateZ(90.9px); filter: brightness(0.7); } .hex-facet-5 { transform: rotateZ(300deg) rotateX(90deg) translateZ(90.9px); filter: brightness(0.9); } /* Hex Fluid Viewport Window */ .fluid-window { width: 142px; height: 142px; clip-path: polygon(50% 0%, 93.3% 25%, 93.3% 75%, 50% 100%, 6.7% 75%, 6.7% 25%); background: radial-gradient(circle, #08142a 0%, #040916 65%, #010308 100%); border: 1px solid rgba(56, 189, 248, 0.15); box-shadow: inset 0 4px 22px rgba(0, 0, 0, 0.95), 0 0 14px rgba(0, 0, 0, 0.8); position: relative; overflow: hidden; display: flex; align-items: center; justify-content: center; } .fluid-ambient { position: absolute; inset: 0; background: radial-gradient(circle at 50% 30%, rgba(56, 189, 248, 0.12) 0%, transparent 70%); pointer-events: none; } /* Floating Hexagonal Die Plate */ .floating-die { position: relative; width: 120px; height: 120px; display: flex; align-items: center; justify-content: center; transition: transform 0.8s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.6s ease, filter 0.6s ease; animation: dieFloat 4.2s ease-in-out infinite; } @keyframes dieFloat { 0%, 100% { transform: translateY(0) rotate(0deg); } 25% { transform: translateY(-3px) rotate(-1.5deg); } 50% { transform: translateY(2px) rotate(1deg); } 75% { transform: translateY(-2px) rotate(-0.5deg); } } .die-svg { position: absolute; width: 100%; height: 100%; } .die-face { fill: #0c1c38; stroke: #1e3a6a; stroke-width: 2; } .die-inner { fill: #08142a; stroke: rgba(56, 189, 248, 0.2); stroke-width: 1; } .die-accent-line { stroke: rgba(56, 189, 248, 0.3); stroke-width: 1; stroke-dasharray: 2 2; } .die-text-wrap { position: relative; z-index: 2; width: 82px; text-align: center; margin-top: 0; } .die-text { font-size: 0.62rem; font-weight: 700; letter-spacing: 0.04em; color: #bae6fd; text-transform: uppercase; line-height: 1.28; display: inline-block; text-shadow: 0 0 8px rgba(56, 189, 248, 0.45); transition: opacity 0.4s ease, transform 0.4s ease; } /* Submerged state */ .floating-die.submerged { transform: scale(0.28) translateY(24px) rotate(35deg) !important; opacity: 0; filter: blur(5px); animation: none; } /* Surfacing state */ .floating-die.surfacing { animation: dieSurface 1.1s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards; } @keyframes dieSurface { 0% { transform: scale(0.35) translateY(24px) rotate(-30deg); opacity: 0; filter: blur(5px); } 60% { transform: scale(1.08) translateY(-2px) rotate(2deg); opacity: 0.95; filter: blur(0); } 100% { transform: scale(1) translateY(0) rotate(0deg); opacity: 1; filter: blur(0); } } /* ─── 3D ROLL-IN-PLACE ANIMATION ─── */ .hex-figure-3d.rolling { animation: hexRollInPlace 1.25s cubic-bezier(0.45, 0.05, 0.25, 1) forwards; } @keyframes hexRollInPlace { 0% { transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg) scale(1); } 15% { transform: rotateX(70deg) rotateY(-80deg) rotateZ(-45deg) translateY(-8px) scale(1.04); } 35% { transform: rotateX(190deg) rotateY(160deg) rotateZ(120deg) translateY(-14px) scale(1.08); } 55% { transform: rotateX(310deg) rotateY(380deg) rotateZ(260deg) translateY(-8px) scale(1.05); } 75% { transform: rotateX(375deg) rotateY(560deg) rotateZ(350deg) translateY(-2px) scale(1.01); } 90% { transform: rotateX(358deg) rotateY(724deg) rotateZ(362deg) translateY(0px) scale(0.99); } 100% { transform: rotateX(360deg) rotateY(720deg) rotateZ(360deg) translateY(0px) scale(1); } } /* Synchronized Shadow Expansion / Compression during Roll */ .ball-shadow { width: 180px; height: 22px; border-radius: 50% !important; background: radial-gradient(ellipse, rgba(0, 0, 0, 0.75) 0%, transparent 70%); margin-top: 8px; transition: transform 0.2s ease, opacity 0.2s ease; } .ball-shadow.rolling-shadow { animation: shadowRollSync 1.25s cubic-bezier(0.45, 0.05, 0.25, 1) forwards; } @keyframes shadowRollSync { 0%, 100% { transform: scale(1); opacity: 0.75; } 35% { transform: scale(0.72); opacity: 0.35; } 55% { transform: scale(0.85); opacity: 0.5; } 85% { transform: scale(1.05); opacity: 0.85; } } /* ─── PROMPT FORM ─── */ .prompt-section { margin-bottom: 24px; } .prompt-form { margin-bottom: 12px; } .prompt-input-wrap { display: flex; align-items: center; background: #080808; border: 1px solid var(--border); transition: border-color 0.15s ease; } .prompt-input-wrap:focus-within { border-color: var(--border-focus); } .prompt-symbol { padding-left: 12px; color: var(--text-dim); font-size: 0.85rem; font-weight: 700; } .prompt-input { flex: 1; background: transparent; border: none; color: #fff; font-size: 0.82rem; padding: 12px 10px; outline: none; } .prompt-input::placeholder { color: #444444; } .btn { background: #141414; border: 1px solid var(--border); color: var(--text); font-size: 0.75rem; font-weight: 600; padding: 0 16px; height: 42px; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 6px; transition: all 0.15s ease; white-space: nowrap; } .btn:hover:not(:disabled) { background: #1c1c1c; border-color: var(--border-hover); color: #fff; } .btn:active:not(:disabled) { background: #242424; } .btn:disabled { opacity: 0.4; cursor: not-allowed; } .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; } @keyframes spin { to { transform: rotate(360deg); } } /* Quick Prompts */ .quick-prompts { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 0.7rem; } .quick-label { color: var(--text-dim); } .quick-pill { background: transparent; border: 1px solid var(--border); color: var(--text-muted); font-size: 0.68rem; padding: 3px 8px; cursor: pointer; transition: all 0.12s ease; } .quick-pill:hover { border-color: var(--border-hover); color: #fff; } /* ─── TELEMETRY CARD ─── */ .telemetry-card { background: var(--panel-bg); border: 1px solid var(--border); margin-bottom: 28px; transition: border-color 0.15s ease; } .telemetry-card:hover { border-color: var(--border-hover); } .telemetry-header { display: flex; justify-content: space-between; align-items: center; padding: 8px 12px; border-bottom: 1px solid var(--border); background: #080808; } .telemetry-title { font-size: 0.7rem; font-weight: 700; color: var(--text-dim); letter-spacing: 0.03em; } .telemetry-badge { font-size: 0.65rem; font-weight: 700; padding: 2px 6px; background: #141414; border: 1px solid var(--border); color: var(--text-muted); } .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-body { padding: 12px; } .telemetry-row { display: flex; justify-content: space-between; align-items: center; font-size: 0.75rem; margin-bottom: 6px; } .t-label { color: var(--text-dim); font-size: 0.68rem; font-weight: 600; } .t-val { color: #fff; font-weight: 600; } .t-val.mono { font-variant-numeric: tabular-nums; } .telemetry-meter-bar { width: 100%; height: 4px; background: #141414; margin-bottom: 14px; position: relative; overflow: hidden; } .meter-fill { height: 100%; width: 0%; background: var(--text-dim); transition: width 0.35s ease, background 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: 8px; padding-top: 10px; border-top: 1px solid #141414; margin-bottom: 10px; } @media (min-width: 480px) { .telemetry-grid { grid-template-columns: repeat(4, 1fr); } } .t-cell { display: flex; flex-direction: column; gap: 2px; } .t-cell-label { font-size: 0.62rem; color: var(--text-dim); text-transform: uppercase; } .t-cell-val { font-size: 0.75rem; font-weight: 600; color: #fff; font-variant-numeric: tabular-nums; } .telemetry-details { font-size: 0.68rem; margin-top: 6px; } .details-summary { color: var(--text-dim); cursor: pointer; outline: none; user-select: none; } .details-summary:hover { color: var(--text-muted); } .json-dump { margin-top: 8px; padding: 8px; background: #050505; border: 1px solid #161616; color: #888; font-size: 0.65rem; max-height: 140px; overflow-y: auto; line-height: 1.4; } /* ─── HISTORY LIST ─── */ .history-section { margin-bottom: 40px; } .history-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; border-bottom: 1px solid var(--border); padding-bottom: 6px; } .history-header h2 { font-size: 0.85rem; font-weight: 600; text-transform: lowercase; color: #fff; } .history-count { font-size: 0.7rem; 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: 10px 12px; display: flex; justify-content: space-between; align-items: center; gap: 12px; transition: border-color 0.12s ease; } .history-item:hover { border-color: var(--border-hover); } .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.65rem; color: var(--text-dim); } .history-pill { font-size: 0.7rem; font-weight: 600; padding: 3px 8px; border: 1px solid var(--border); background: #111; color: var(--text-muted); white-space: nowrap; flex-shrink: 0; } .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); } /* ─── TOAST NOTIFICATIONS ─── */ .toast { position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%) translateY(20px); background: #141414; border: 1px solid var(--border-focus); color: #fff; font-size: 0.75rem; padding: 8px 16px; opacity: 0; pointer-events: none; transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1); z-index: 100; } .toast.active { opacity: 1; transform: translateX(-50%) translateY(0); }