Spaces:
Running
Running
File size: 7,668 Bytes
3cc2706 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | /* embodied-efficiency design system: the "Deploy Console" identity.
This is a robotics deploy tool, so it should read like an instrument panel:
a cool slate canvas, an electric indigo -> cyan signal, monospace telemetry
readouts, and three honest status colors (go / caution / hold). Distinct on
purpose from my warmer projects. Built on Tailwind utilities; this file holds
the few bespoke pieces (washes, panels, status lights, meters) utilities can't
express well. Light + dark, gentle motion, reduced-motion respected. */
:root {
--ee-signal: 99 102 241; /* indigo-500, primary signal */
--ee-signal-deep: 79 70 229; /* indigo-600, deep */
--ee-cyan: 34 211 238; /* cyan-400, accent */
/* Honest status bands for the safety layer: go / caution / hold. */
--ee-go: 16 185 129; /* emerald -> passed, action sent */
--ee-warn: 217 160 60; /* warm amber -> staleness / caution */
--ee-hold: 244 100 110; /* soft rose -> intervention, held a safe action */
}
html { scroll-behavior: smooth; }
body {
font-family: "Inter var", Inter, ui-sans-serif, system-ui, -apple-system,
"Segoe UI", Roboto, Helvetica, Arial, sans-serif;
font-feature-settings: "cv02", "cv03", "cv04", "cv11";
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
h1, h2, h3 { letter-spacing: -0.012em; }
/* Telemetry numerals: monospace, tabular, so readouts don't jitter as they
update. Every latency / footprint / score number on the page wears this. */
.ee-mono {
font-family: "JetBrains Mono", "SFMono-Regular", ui-monospace, "SF Mono",
Menlo, Consolas, monospace;
font-variant-numeric: tabular-nums;
letter-spacing: -0.01em;
}
/* Page wash: a cool signal glow from the corners over a faint blueprint grid.
Quiet enough to read over, present enough to feel like a console. */
.ee-bg {
background-color: rgb(248 250 252); /* slate-50 */
background-image:
radial-gradient(60rem 60rem at 112% -10%, rgb(var(--ee-cyan) / 0.10), transparent 56%),
radial-gradient(54rem 54rem at -12% -6%, rgb(var(--ee-signal) / 0.10), transparent 52%),
linear-gradient(to right, rgb(15 23 42 / 0.035) 1px, transparent 1px),
linear-gradient(to bottom, rgb(15 23 42 / 0.035) 1px, transparent 1px);
background-size: auto, auto, 2.25rem 2.25rem, 2.25rem 2.25rem;
}
.dark .ee-bg {
background-color: rgb(8 11 20);
background-image:
radial-gradient(60rem 60rem at 112% -10%, rgb(var(--ee-cyan) / 0.14), transparent 56%),
radial-gradient(54rem 54rem at -12% -6%, rgb(var(--ee-signal) / 0.16), transparent 52%),
linear-gradient(to right, rgb(148 163 184 / 0.06) 1px, transparent 1px),
linear-gradient(to bottom, rgb(148 163 184 / 0.06) 1px, transparent 1px);
}
/* Brand text: an electric indigo -> cyan signal. */
.ee-gradient-text {
background-image: linear-gradient(100deg, rgb(var(--ee-signal-deep)), rgb(var(--ee-cyan)));
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
/* Card: an instrument panel. Crisp edge, soft depth, subtle blur. */
.ee-card {
border-radius: 1rem;
border: 1px solid rgb(226 232 240); /* slate-200 */
background: rgb(255 255 255 / 0.85);
backdrop-filter: blur(7px);
box-shadow: 0 1px 2px rgb(15 23 42 / 0.05), 0 16px 34px -20px rgb(30 41 120 / 0.28);
}
.dark .ee-card {
border-color: rgb(40 51 74 / 0.8);
background: rgb(15 20 33 / 0.62);
box-shadow: 0 1px 2px rgb(0 0 0 / 0.35), 0 16px 38px -20px rgb(0 0 0 / 0.7);
}
/* Quiet grouped panel (readout strips, log). */
.ee-panel { background: rgb(241 245 249 / 0.7); }
.dark .ee-panel { background: rgb(13 19 33 / 0.55); }
/* Status pill / chip. */
.ee-chip {
display: inline-flex;
align-items: center;
gap: 0.4rem;
border-radius: 999px;
padding: 0.2rem 0.7rem;
font-size: 0.72rem;
font-weight: 600;
}
/* Status light: a glowing console indicator. Colour says go / caution / hold. */
.ee-light {
display: inline-block;
width: 0.7rem;
height: 0.7rem;
border-radius: 999px;
position: relative;
}
.ee-light--go { background: rgb(var(--ee-go)); box-shadow: 0 0 0 3px rgb(var(--ee-go) / 0.18), 0 0 14px rgb(var(--ee-go) / 0.6); }
.ee-light--warn { background: rgb(var(--ee-warn)); box-shadow: 0 0 0 3px rgb(var(--ee-warn) / 0.18), 0 0 14px rgb(var(--ee-warn) / 0.6); }
.ee-light--hold { background: rgb(var(--ee-hold)); box-shadow: 0 0 0 3px rgb(var(--ee-hold) / 0.18), 0 0 14px rgb(var(--ee-hold) / 0.6); }
/* Meter: a slim readout bar (used for the Hz gap + budget fill). */
.ee-meter {
height: 0.5rem;
border-radius: 999px;
background: rgb(226 232 240);
overflow: hidden;
}
.dark .ee-meter { background: rgb(30 41 59); }
.ee-meter > span {
display: block;
height: 100%;
border-radius: 999px;
background: linear-gradient(90deg, rgb(var(--ee-signal)), rgb(var(--ee-cyan)));
transition: width .6s cubic-bezier(.22,.61,.36,1);
}
.ee-meter--go > span { background: linear-gradient(90deg, rgb(var(--ee-go) / 0.85), rgb(var(--ee-go))); }
.ee-meter--warn > span { background: linear-gradient(90deg, rgb(var(--ee-warn) / 0.85), rgb(var(--ee-warn))); }
.ee-meter--hold > span { background: linear-gradient(90deg, rgb(var(--ee-hold) / 0.85), rgb(var(--ee-hold))); }
/* Gentle lift on interactive cards. */
.ee-lift { transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease; }
.ee-lift:hover { transform: translateY(-2px); }
/* Range sliders, styled to the console (the compiler budget knobs). */
.ee-range {
-webkit-appearance: none;
appearance: none;
width: 100%;
height: 0.4rem;
border-radius: 999px;
background: rgb(226 232 240);
outline: none;
}
.dark .ee-range { background: rgb(30 41 59); }
.ee-range::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 1.05rem;
height: 1.05rem;
border-radius: 999px;
background: rgb(var(--ee-signal));
border: 2px solid rgb(255 255 255);
box-shadow: 0 1px 3px rgb(30 41 120 / 0.4);
cursor: pointer;
transition: transform .12s ease;
}
.ee-range::-webkit-slider-thumb:hover { transform: scale(1.12); }
.ee-range::-moz-range-thumb {
width: 1.05rem;
height: 1.05rem;
border-radius: 999px;
background: rgb(var(--ee-signal));
border: 2px solid rgb(255 255 255);
cursor: pointer;
}
.dark .ee-range::-webkit-slider-thumb { border-color: rgb(15 20 33); }
.dark .ee-range::-moz-range-thumb { border-color: rgb(15 20 33); }
/* htmx loading affordance. */
.htmx-indicator { opacity: 0; transition: opacity .15s ease; }
.htmx-request .htmx-indicator { opacity: 1; }
.htmx-request.htmx-indicator { opacity: 1; }
.htmx-request button[type="submit"] { opacity: .65; pointer-events: none; }
/* Fade-in for swapped / new content. */
@keyframes ee-fade-in {
from { opacity: 0; transform: translateY(6px); }
to { opacity: 1; transform: translateY(0); }
}
.ee-fade { animation: ee-fade-in .28s cubic-bezier(.22,.61,.36,1) both; }
/* Slow pulse for the "live" dot: a steady heartbeat. */
@keyframes ee-breathe {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.5; transform: scale(0.82); }
}
.ee-breathe { animation: ee-breathe 3s ease-in-out infinite; }
/* Focus ring: signal indigo, clearly visible. */
.ee-focus:focus-visible {
outline: none;
box-shadow: 0 0 0 3px rgb(var(--ee-signal) / 0.45);
}
/* Pareto plot points: a soft hover grow. */
.ee-dot { transition: r .12s ease, opacity .12s ease; cursor: pointer; }
.ee-dot:hover { opacity: 1 !important; }
@media (prefers-reduced-motion: reduce) {
.ee-fade, .ee-breathe, .ee-meter > span, .ee-lift, .ee-dot { animation: none; transition: none; }
}
|