39282-vm/assets/css/custom.css
Flatlogic Bot ba54146f4e v6
2026-03-27 23:50:49 +00:00

750 lines
16 KiB
CSS

:root {
--bg: #0b0d10;
--surface: #12161b;
--surface-2: #171c22;
--surface-3: #1d232b;
--border: #2a3038;
--border-strong: #39414b;
--text: #edf1f5;
--muted: #9aa4af;
--accent: #d4d8de;
--accent-ink: #0f1318;
--success: #66bb8a;
--danger: #ef8c8c;
--shadow: 0 20px 48px rgba(0, 0, 0, 0.28);
--radius-sm: 8px;
--radius-md: 12px;
--radius-lg: 16px;
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px;
--space-5: 24px;
--space-6: 32px;
}
html {
scroll-behavior: smooth;
}
body {
background: var(--bg);
color: var(--text);
font-family: Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
letter-spacing: -0.01em;
}
.shell-header {
background: rgba(11, 13, 16, 0.88);
backdrop-filter: blur(12px);
}
.navbar-brand {
letter-spacing: -0.03em;
}
.panel {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
box-shadow: var(--shadow);
}
.inset-panel {
background: var(--surface-2);
box-shadow: none;
}
.hero-panel {
position: relative;
overflow: hidden;
}
.hero-panel::after {
content: "";
position: absolute;
inset: 0;
border: 1px solid rgba(255, 255, 255, 0.03);
border-radius: inherit;
pointer-events: none;
}
.display-title {
font-size: clamp(2rem, 3vw, 3.5rem);
line-height: 1.02;
font-weight: 650;
max-width: 12ch;
letter-spacing: -0.05em;
}
.eyebrow,
.small-label {
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.12em;
font-size: 0.72rem;
font-weight: 600;
}
.lead,
.text-secondary,
.form-text,
.form-label,
.form-control::placeholder,
textarea::placeholder {
color: var(--muted) !important;
}
.meta-pills,
.control-stack {
display: grid;
gap: var(--space-3);
}
.chip,
.badge-soft,
.value-pill,
.gamepad-state {
display: inline-flex;
align-items: center;
gap: var(--space-2);
border: 1px solid var(--border-strong);
background: rgba(255, 255, 255, 0.02);
color: var(--text);
border-radius: 999px;
padding: 0.5rem 0.8rem;
font-size: 0.85rem;
}
.badge-soft {
padding: 0.45rem 0.7rem;
}
.spec-list {
display: grid;
gap: var(--space-3);
}
.spec-list > div {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-4);
padding-bottom: var(--space-2);
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
}
.spec-list > div:last-child {
border-bottom: 0;
padding-bottom: 0;
}
.spec-list span,
.mini-stat span,
.preset-metrics span {
color: var(--muted);
font-size: 0.82rem;
}
.spec-list.compact {
gap: var(--space-2);
}
.status-dot {
width: 10px;
height: 10px;
border-radius: 999px;
display: inline-block;
margin-top: 4px;
}
.status-live {
background: var(--success);
box-shadow: 0 0 0 8px rgba(102, 187, 138, 0.12);
}
.status-idle {
background: #66707a;
box-shadow: 0 0 0 8px rgba(102, 112, 122, 0.12);
}
.recliner-stage {
position: relative;
background:
radial-gradient(circle at 22% 18%, rgba(255, 255, 255, 0.08), transparent 28%),
radial-gradient(circle at 78% 20%, rgba(212, 216, 222, 0.12), transparent 20%),
linear-gradient(180deg, #12171d 0%, #0d1116 100%);
border: 1px solid var(--border);
border-radius: var(--radius-md);
min-height: 420px;
overflow: hidden;
isolation: isolate;
perspective: 1600px;
}
.recliner-stage::after {
content: "";
position: absolute;
inset: auto 0 0;
height: 38%;
background: linear-gradient(180deg, transparent, rgba(0, 0, 0, 0.34));
pointer-events: none;
}
.grid-fade,
.recliner-aurora {
position: absolute;
inset: 0;
pointer-events: none;
}
.grid-fade {
background-image:
linear-gradient(to right, rgba(255, 255, 255, 0.04) 1px, transparent 1px),
linear-gradient(to bottom, rgba(255, 255, 255, 0.04) 1px, transparent 1px);
background-size: 40px 40px;
mask-image: linear-gradient(180deg, rgba(0, 0, 0, 0.72), transparent 95%);
opacity: 0.8;
}
.recliner-aurora {
background:
radial-gradient(circle at 50% 72%, rgba(212, 216, 222, 0.08), transparent 32%),
radial-gradient(circle at 58% 40%, rgba(255, 255, 255, 0.06), transparent 16%);
}
.axis-label,
.motion-indicator {
position: absolute;
top: 18px;
color: var(--muted);
font-size: 0.72rem;
text-transform: uppercase;
letter-spacing: 0.08em;
z-index: 2;
}
.axis-label-left { left: 18px; }
.axis-label-right { right: 18px; }
.motion-indicator {
left: 50%;
transform: translateX(-50%);
padding: 0.42rem 0.75rem;
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 999px;
background: rgba(10, 12, 15, 0.52);
color: var(--text);
}
.recliner-figure {
position: absolute;
left: 50%;
bottom: 26px;
width: 430px;
height: 320px;
--figure-scale: 1;
--drift-x: 0px;
--drift-y: 0px;
--shake-x: 4px;
--shake-y: 2px;
--shake-rotate: 0.7deg;
--vibe-speed: 140ms;
--glow-strength: 0.26;
--glow-opacity: 0.54;
transform: translateX(calc(-50% + var(--drift-x))) translateY(var(--drift-y)) scale(var(--figure-scale));
transform-origin: center bottom;
transition: transform 240ms ease;
z-index: 1;
}
.recliner-rig,
.recliner-motion {
position: absolute;
inset: 0;
transform-style: preserve-3d;
}
.recliner-rig {
transform: rotateX(64deg) rotateZ(-29deg);
transform-origin: center bottom;
}
.recliner-motion.is-vibrating.vibration-continuous {
animation: rumble-continuous var(--vibe-speed) steps(2, end) infinite;
}
.recliner-motion.is-vibrating.vibration-pulse {
animation: rumble-pulse 820ms cubic-bezier(0.34, 1.56, 0.64, 1) infinite;
}
.recliner-glow,
.recliner-floor,
.recliner-seat-pad,
.recliner-back-inner,
.recliner-head-pad,
.recliner-arm-top {
position: absolute;
}
.recliner-glow {
left: 76px;
bottom: 32px;
width: 270px;
height: 130px;
border-radius: 50%;
background: radial-gradient(circle, rgba(212, 216, 222, 0.42) 0%, rgba(212, 216, 222, 0) 72%);
filter: blur(18px);
opacity: var(--glow-opacity);
transform: translateZ(-42px);
transition: opacity 180ms ease, filter 180ms ease;
}
.recliner-floor {
left: 64px;
bottom: 12px;
width: 296px;
height: 162px;
border-radius: 52% 48% 44% 56% / 56% 54% 46% 44%;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.015));
border: 1px solid rgba(255, 255, 255, 0.04);
box-shadow: inset 0 -22px 44px rgba(0, 0, 0, 0.22);
transform: translateZ(-30px);
}
.recliner-block {
position: absolute;
background: linear-gradient(145deg, #353d4a 0%, #1f252d 100%);
border: 1px solid rgba(255, 255, 255, 0.12);
box-shadow: inset 0 2px 2px rgba(255, 255, 255, 0.1), 0 15px 30px rgba(0, 0, 0, 0.4);
transform-style: preserve-3d;
}
.recliner-plinth {
left: 138px;
bottom: 52px;
width: 126px;
height: 28px;
border-radius: 12px;
transform: translateZ(10px);
background: #171c22;
}
.recliner-column {
left: 182px;
bottom: 80px;
width: 38px;
height: 72px;
border-radius: 8px;
transform: translateZ(22px);
background: #1d232b;
}
.recliner-base {
left: 154px;
bottom: 106px;
width: 110px;
height: 52px;
border-radius: 20px;
transform: translateZ(40px);
}
.recliner-seat {
left: 144px;
bottom: 152px;
width: 142px;
height: 82px;
border-radius: 20px;
transform: translateZ(62px);
}
.recliner-seat-pad {
left: 150px;
bottom: 158px;
width: 130px;
height: 70px;
border-radius: 16px;
background: linear-gradient(135deg, #4a5460 0%, #2a323d 100%);
border: 1px solid rgba(255, 255, 255, 0.15);
transform: translateZ(78px);
}
.recliner-arm {
left: 124px;
bottom: 160px;
width: 28px;
height: 102px;
border-radius: 12px;
transform: translateZ(64px);
}
.recliner-arm-secondary {
left: 278px;
bottom: 154px;
height: 98px;
transform: translateZ(34px);
}
.recliner-arm-top {
left: 126px;
bottom: 240px;
width: 24px;
height: 16px;
border-radius: 8px;
background: #4a5460;
transform: translateZ(80px);
}
.recliner-back {
left: 114px;
bottom: 194px;
width: 92px;
height: 142px;
border-radius: 24px;
transform-origin: right bottom;
transform: translateZ(66px) rotate(calc(-6deg + (var(--angle) * 0.38deg) + (var(--back-angle) * 1deg)));
background: linear-gradient(145deg, #3d4652 0%, #252b34 100%);
}
.recliner-back-inner {
left: 122px;
bottom: 202px;
width: 76px;
height: 126px;
border-radius: 16px;
background: linear-gradient(135deg, #515d6a 0%, #353d4a 100%);
border: 1px solid rgba(255, 255, 255, 0.15);
transform-origin: right bottom;
transform: translateZ(82px) rotate(calc(-6deg + (var(--angle) * 0.38deg) + (var(--back-angle) * 1deg)));
}
.recliner-head {
left: 124px;
bottom: 308px;
width: 74px;
height: 38px;
border-radius: 16px;
transform-origin: right bottom;
transform: translateZ(86px) rotate(calc(-10deg + (var(--angle) * 0.14deg) + (var(--head-angle) * 1deg)));
}
.recliner-head-pad {
left: 128px;
bottom: 312px;
width: 66px;
height: 30px;
border-radius: 12px;
background: linear-gradient(135deg, #515d6a 0%, #353d4a 100%);
transform-origin: right bottom;
transform: translateZ(98px) rotate(calc(-10deg + (var(--angle) * 0.14deg) + (var(--head-angle) * 1deg)));
}
.recliner-leg {
left: 284px;
bottom: 166px;
width: 58px;
height: 118px;
border-radius: 16px;
transform-origin: left center;
transform: translateZ(46px) rotate(calc(10deg + (var(--angle) * 0.34deg) + (var(--leg-angle) * 1deg)));
background: linear-gradient(145deg, #3d4652 0%, #252b34 100%);
}
.recliner-footpad {
left: 326px;
bottom: 208px;
width: 42px;
height: 58px;
border-radius: 12px;
transform-origin: left center;
transform: translateZ(30px) rotate(calc(10deg + (var(--angle) * 0.2deg) + (var(--leg-angle) * 1deg)));
background: linear-gradient(135deg, #515d6a 0%, #353d4a 100%);
}
.recliner-figure.is-vibrating .recliner-glow {
opacity: 0.9;
filter: blur(24px);
animation: glow-pulse 760ms ease-in-out infinite;
}
.recliner-figure[data-pattern="continuous"].is-vibrating .recliner-glow {
animation-duration: 220ms;
}
.angle-indicator {
position: absolute;
right: 12px;
top: 18px;
display: inline-flex;
flex-direction: column;
align-items: flex-end;
padding: 12px 14px;
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: var(--radius-sm);
background: rgba(11, 13, 16, 0.72);
backdrop-filter: blur(10px);
z-index: 2;
}
.angle-indicator span {
font-size: 1.85rem;
font-weight: 650;
line-height: 1;
}
.angle-indicator small {
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.09em;
margin-top: 4px;
}
@keyframes rumble-continuous {
0% {
transform: translate3d(calc(var(--shake-x) * -1), calc(var(--shake-y) * -1), 0) rotate(calc(var(--shake-rotate) * -1));
}
25% {
transform: translate3d(var(--shake-x), 0, 0) rotate(calc(var(--shake-rotate) * 0.6));
}
50% {
transform: translate3d(calc(var(--shake-x) * -0.65), var(--shake-y), 0) rotate(calc(var(--shake-rotate) * -0.5));
}
75% {
transform: translate3d(calc(var(--shake-x) * 0.75), calc(var(--shake-y) * -1), 0) rotate(calc(var(--shake-rotate) * 0.3));
}
100% {
transform: translate3d(calc(var(--shake-x) * -1), calc(var(--shake-y) * -1), 0) rotate(calc(var(--shake-rotate) * -1));
}
}
@keyframes rumble-pulse {
0%, 100% {
transform: translate3d(0, 0, 0) scale(1);
}
12% {
transform: translate3d(var(--shake-x), calc(var(--shake-y) * -1), 0) rotate(var(--shake-rotate));
}
20% {
transform: translate3d(calc(var(--shake-x) * -1), var(--shake-y), 0) rotate(calc(var(--shake-rotate) * -1));
}
32% {
transform: translate3d(calc(var(--shake-x) * 0.6), calc(var(--shake-y) * -0.4), 0);
}
44% {
transform: translate3d(0, 0, 0) scale(1.015);
}
}
@keyframes glow-pulse {
0%, 100% {
transform: translateZ(-42px) scale(0.96);
}
50% {
transform: translateZ(-42px) scale(1.04);
}
}
.stat-row {
margin-top: -4px;
}
.mini-stat {
height: 100%;
background: rgba(255, 255, 255, 0.02);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
padding: 14px;
}
.mini-stat strong {
display: block;
margin-top: 6px;
font-size: 1rem;
}
.control-group {
padding-bottom: var(--space-3);
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
}
.control-group:last-child {
padding-bottom: 0;
border-bottom: 0;
}
.form-range::-webkit-slider-runnable-track {
background: #242a32;
height: 4px;
border-radius: 999px;
}
.form-range::-webkit-slider-thumb {
margin-top: -6px;
width: 16px;
height: 16px;
background: var(--accent);
border: 0;
}
.form-range::-moz-range-track {
background: #242a32;
height: 4px;
border-radius: 999px;
}
.form-range::-moz-range-thumb {
width: 16px;
height: 16px;
border: 0;
background: var(--accent);
}
.form-control,
.form-select,
textarea {
background: #0f1318 !important;
border: 1px solid var(--border-strong) !important;
color: var(--text) !important;
border-radius: 10px !important;
padding: 0.75rem 0.9rem !important;
}
.form-control:focus,
.form-select:focus,
textarea:focus,
.btn:focus,
.form-range:focus {
box-shadow: 0 0 0 0.2rem rgba(212, 216, 222, 0.12) !important;
border-color: #58616d !important;
}
.btn {
border-radius: 10px;
padding: 0.78rem 1rem;
font-weight: 600;
letter-spacing: -0.01em;
}
.btn-light {
background: var(--accent);
color: var(--accent-ink);
border-color: var(--accent);
}
.btn-light:hover,
.btn-light:focus {
background: #e3e7eb;
border-color: #e3e7eb;
color: var(--accent-ink);
}
.btn-accent {
background: #e6eaef;
color: #11151a;
border: 1px solid #e6eaef;
}
.btn-accent:hover,
.btn-accent:focus {
background: #f2f4f6;
border-color: #f2f4f6;
color: #11151a;
}
.btn-outline-light {
border-color: var(--border-strong);
}
.btn-link {
color: #cdd3db;
}
.btn-link:hover,
.btn-link:focus {
color: #f0f3f6;
}
.preset-list {
display: grid;
gap: var(--space-3);
}
.preset-card,
.empty-state {
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: 16px;
background: rgba(255, 255, 255, 0.02);
}
.preset-card.is-active {
border-color: #5c6570;
background: rgba(255, 255, 255, 0.03);
}
.preset-metrics {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
.alert-danger {
background: rgba(239, 140, 140, 0.12);
color: #ffd9d9;
}
code {
color: #f4f7fa;
}
.preset-detail-specs > div {
padding: 12px 0;
}
footer {
background: rgba(255, 255, 255, 0.01);
}
@media (max-width: 991.98px) {
.display-title {
max-width: none;
}
.recliner-stage {
min-height: 360px;
}
.recliner-figure {
--figure-scale: 0.84;
bottom: 8px;
}
}
@media (max-width: 575.98px) {
.recliner-stage {
min-height: 300px;
}
.axis-label,
.motion-indicator {
top: 14px;
}
.motion-indicator {
max-width: calc(100% - 128px);
text-align: center;
line-height: 1.25;
}
.recliner-figure {
--figure-scale: 0.66;
bottom: -18px;
}
.angle-indicator {
right: 8px;
top: 52px;
padding: 10px 12px;
}
}