Horizon / src /styles /global.css
NKessler's picture
Upload 6270 files
4083225 verified
Raw
History Blame Contribute Delete
5.83 kB
/* ============================================================
FrameVis — global reset + base
============================================================ */
*,
*::before,
*::after {
box-sizing: border-box;
}
html,
body,
#root {
height: 100%;
}
html {
background: var(--bg);
color-scheme: dark;
}
body {
margin: 0;
font-family: var(--font-mono);
font-size: var(--fs-base);
line-height: var(--lh-base);
color: var(--text);
background: var(--bg);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-feature-settings: "ss01", "ss02";
position: relative;
overflow-x: hidden;
overflow-y: auto;
}
/* Subtle film-grain overlay across the entire viewport, sits above bg
but below interactive content. Keeps dark UI from feeling plastic. */
body::before {
content: "";
position: fixed;
inset: 0;
background-image: var(--grain);
background-repeat: repeat;
opacity: 0.35;
mix-blend-mode: overlay;
pointer-events: none;
z-index: 1;
}
/* Cold blue undertone wash over the bottom of the viewport — adds depth */
body::after {
content: "";
position: fixed;
inset: 0;
background:
radial-gradient(ellipse at 20% -10%, rgba(200, 169, 110, 0.04), transparent 60%),
radial-gradient(ellipse at 110% 110%, rgba(50, 90, 130, 0.07), transparent 55%);
pointer-events: none;
z-index: 0;
}
#root {
position: relative;
z-index: 2;
}
h1, h2, h3, h4, h5, h6 {
margin: 0;
font-family: var(--font-display);
font-weight: 400;
letter-spacing: -0.01em;
color: var(--text);
}
p {
margin: 0;
}
button {
font-family: inherit;
font-size: inherit;
color: inherit;
background: transparent;
border: 1px solid var(--border);
border-radius: var(--radius);
padding: var(--sp-2) var(--sp-4);
cursor: pointer;
letter-spacing: 0.04em;
text-transform: uppercase;
transition: background var(--transition), border-color var(--transition),
color var(--transition);
}
button:hover:not(:disabled) {
border-color: var(--accent);
color: var(--accent);
}
button:disabled {
opacity: 0.4;
cursor: not-allowed;
}
button.primary {
background: var(--accent);
border-color: var(--accent);
color: #14110A;
font-weight: 500;
}
button.primary:hover:not(:disabled) {
background: #D8B97D;
border-color: #D8B97D;
color: #14110A;
}
button.ghost {
border-color: transparent;
}
input,
textarea,
select {
font-family: var(--font-mono);
font-size: inherit;
color: var(--text);
background: transparent;
border: 1px solid var(--border);
border-radius: var(--radius);
padding: var(--sp-3) var(--sp-4);
outline: none;
transition: border-color var(--transition), background var(--transition);
}
input:focus,
textarea:focus,
select:focus {
border-color: var(--accent);
background: rgba(200, 169, 110, 0.04);
}
select option {
background: var(--surface);
color: var(--text);
}
input::placeholder {
color: var(--text-faint);
}
a {
color: var(--accent);
text-decoration: none;
border-bottom: 1px dotted var(--accent-soft);
transition: color var(--transition);
}
a:hover {
color: #D8B97D;
}
::selection {
background: var(--accent-dim);
color: var(--text);
}
/* Custom scrollbars — narrow, monochrome */
* {
scrollbar-width: thin;
scrollbar-color: var(--border-strong) transparent;
}
*::-webkit-scrollbar {
width: 8px;
height: 8px;
}
*::-webkit-scrollbar-thumb {
background: var(--border-strong);
border-radius: 0;
}
*::-webkit-scrollbar-thumb:hover {
background: var(--accent-soft);
}
/* ---------- Utility classes ---------- */
.mono { font-family: var(--font-mono); }
.serif { font-family: var(--font-display); }
.muted { color: var(--text-muted); }
.faint { color: var(--text-faint); }
.accent { color: var(--accent); }
.danger { color: var(--danger); }
.label {
font-family: var(--font-mono);
font-size: var(--fs-xs);
text-transform: uppercase;
letter-spacing: 0.16em;
color: var(--text-muted);
}
.divider {
height: 1px;
background: var(--border);
border: 0;
margin: var(--sp-4) 0;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
/* ---------- App shell layout ---------- */
.app {
display: grid;
grid-template-columns: var(--sidebar-w) 1fr;
grid-template-rows: minmax(var(--topbar-h), auto) minmax(0, 1fr) auto;
grid-template-areas:
"sidebar topbar"
"sidebar main"
"sidebar footer";
min-height: 100vh;
min-height: 100dvh;
width: 100%;
max-width: 100%;
overflow: visible;
}
.app--sidebar-hidden {
grid-template-columns: 1fr;
grid-template-areas:
"topbar"
"main"
"footer";
}
.app--sidebar-hidden .app__sidebar {
display: none;
}
.app__sidebar { grid-area: sidebar; }
.app__topbar { grid-area: topbar; }
.app__main {
grid-area: main;
position: relative;
overflow: visible;
background: var(--bg);
min-height: 0;
}
.app__footer {
grid-area: footer;
border-top: 1px solid var(--border);
background: var(--bg-elevated);
padding: var(--sp-4) var(--sp-6);
}
.app__footer-text {
color: var(--text-faint);
font-size: var(--fs-xs);
letter-spacing: 0.08em;
text-transform: uppercase;
}
@media (max-width: 1200px) {
.app { grid-template-columns: var(--sidebar-w) 1fr; }
}
@media (max-width: 900px) {
.app {
grid-template-columns: 1fr;
grid-template-rows: auto minmax(0, 1fr) auto;
grid-template-areas:
"topbar"
"main"
"footer";
min-height: 100vh;
min-height: 100dvh;
}
.app__sidebar {
display: none;
}
.app--sidebar-hidden {
grid-template-areas:
"topbar"
"main"
"footer";
}
.app__footer {
padding-inline: var(--sp-4);
}
}