New Logo Updated cache system now 15/30mins but scope updates every minute Font update
290 lines
9.3 KiB
CSS
290 lines
9.3 KiB
CSS
/* ── SELF-HOSTED FONTS ───────────────────────────────────────────────── */
|
|
@font-face { font-family: 'Manrope'; font-style: normal; font-weight: 200 800; font-display: swap; src: url('../fonts/manrope-variable.woff2') format('woff2'); }
|
|
@font-face { font-family: 'Fraunces'; font-style: normal; font-weight: 700; font-display: swap; src: url('../fonts/fraunces-700-normal.woff2') format('woff2'); }
|
|
@font-face { font-family: 'Fraunces'; font-style: normal; font-weight: 900; font-display: swap; src: url('../fonts/fraunces-900-normal.woff2') format('woff2'); }
|
|
@font-face { font-family: 'Fraunces'; font-style: italic; font-weight: 300; font-display: swap; src: url('../fonts/fraunces-300-italic.woff2') format('woff2'); }
|
|
@font-face { font-family: 'Fraunces'; font-style: italic; font-weight: 700; font-display: swap; src: url('../fonts/fraunces-700-italic.woff2') format('woff2'); }
|
|
@font-face { font-family: 'JetBrains Mono'; font-style: normal; font-weight: 400; font-display: swap; src: url('../fonts/jetbrains-mono-400.woff2') format('woff2'); }
|
|
@font-face { font-family: 'JetBrains Mono'; font-style: normal; font-weight: 600; font-display: swap; src: url('../fonts/jetbrains-mono-600.woff2') format('woff2'); }
|
|
|
|
/* ════════════════════════════════════════════════════════════════════════
|
|
base.css — Fonts, reset, page shell, and top navigation.
|
|
════════════════════════════════════════════════════════════════════════
|
|
|
|
COLOUR PALETTE (the "warm parchment & brass" theme)
|
|
──────────────────────────────────────────────────────────────────────
|
|
#f5edd6 parchment page background
|
|
#fffcf2 soft cream cards, search box, table
|
|
#fdf8ee warm cream toolbars, legend, about block
|
|
#f0e4c4 pale honey table heading row
|
|
#fef3dc warm hover buttons on hover
|
|
#fef8ea row hover table row on hover
|
|
#fff8e4 "now" row the currently-active hour
|
|
#1e1208 espresso headings + emphasis
|
|
#4a3420 warm dark body text in the table
|
|
#6b4f2a muted bronze subtle emphasis
|
|
#7a5c2a tagline brown italic intro line
|
|
#9a7d5a soft brown column toggle text
|
|
#b09870 warm grey muted labels
|
|
#c0a880 pale dust night-row text, footer
|
|
#c8922a BRASS brand accent (links, dial, focus)
|
|
#a06e18 deep brass hover state for some links
|
|
#c9b08a warm border panel borders
|
|
#d4c0a0 soft border toolbar/legend borders
|
|
#ede4cc line table row dividers
|
|
|
|
FONTS
|
|
──────────────────────────────────────────────────────────────────────
|
|
Fraunces serif display titles, day labels, hour cell
|
|
Manrope body sans-serif paragraphs, small labels
|
|
JetBrains Mono numeric monospace table data
|
|
════════════════════════════════════════════════════════════════════════ */
|
|
|
|
/* ── 1. FONTS + RESET ───────────────────────────────────────────────── */
|
|
|
|
/* Font loading is handled in index.html via a non-blocking <link rel="preload">
|
|
to avoid render-blocking. The @import has been intentionally removed. */
|
|
|
|
*,
|
|
*:before,
|
|
*:after {
|
|
box-sizing: border-box;
|
|
margin: 0;
|
|
padding: 0;
|
|
}
|
|
|
|
|
|
/* ── 2. PAGE BACKGROUND & SHELL ─────────────────────────────────────── */
|
|
|
|
body {
|
|
background: #f5edd6; /* parchment */
|
|
}
|
|
|
|
.utci-app {
|
|
font-family: Manrope, sans-serif;
|
|
color: #1e1208;
|
|
background: #f5edd6;
|
|
min-height: 100vh;
|
|
padding: 52px 36px 32px;
|
|
position: relative;
|
|
/* overflow-x: clip (not hidden) — `clip` clips horizontal overflow
|
|
WITHOUT making this a scroll container, so `position: sticky` on
|
|
descendants (table <th>) can still stick relative to the viewport.
|
|
`hidden` would create a containing block that breaks sticky. */
|
|
overflow-x: clip;
|
|
}
|
|
|
|
|
|
/* The centred container that holds everything. */
|
|
.utci-shell {
|
|
position: relative;
|
|
z-index: 1;
|
|
max-width: 1400px;
|
|
margin: 0 auto;
|
|
}
|
|
|
|
|
|
/* ── 3. TOP NAVIGATION (Home / About links in the corner) ──────────── */
|
|
|
|
.utci-topnav {
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
right: 0;
|
|
z-index: 100;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: flex-end;
|
|
padding: 18px 32px;
|
|
gap: 28px;
|
|
}
|
|
|
|
.utci-topnav a {
|
|
font-family: Manrope, sans-serif;
|
|
font-size: 16px;
|
|
font-weight: 700;
|
|
letter-spacing: 0.06em;
|
|
text-transform: uppercase;
|
|
color: #b09870;
|
|
text-decoration: none;
|
|
border-bottom: 1px solid transparent;
|
|
padding-bottom: 2px;
|
|
transition: color 0.2s, border-color 0.2s;
|
|
}
|
|
|
|
.utci-topnav a:hover {
|
|
color: #c8922a; /* brass on hover */
|
|
border-bottom-color: #c8922a80; /* faint underline */
|
|
}
|
|
|
|
/* Desktop: nav-links renders inline as part of nav flex row */
|
|
.utci-topnav .nav-links {
|
|
display: contents; /* participates in nav's flex layout transparently */
|
|
}
|
|
|
|
/* Nav logo — hidden on desktop, shown on mobile */
|
|
.nav-logo {
|
|
display: none;
|
|
}
|
|
.nav-logo-wordmark {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.05em;
|
|
}
|
|
.nav-logo-sun,
|
|
.nav-logo-scope {
|
|
font-family: Manrope, sans-serif;
|
|
font-weight: 250;
|
|
font-size: 2.1rem;
|
|
color: #1e1208;
|
|
letter-spacing: -0.01em;
|
|
}
|
|
.nav-logo-icon {
|
|
width: 1.65rem;
|
|
height: 1.65rem;
|
|
color: #1e1208;
|
|
flex-shrink: 0;
|
|
}
|
|
.nav-logo-tag {
|
|
display: block;
|
|
font-family: Manrope, sans-serif;
|
|
font-style: normal;
|
|
font-weight: 600;
|
|
font-size: 8px;
|
|
letter-spacing: 0.12em;
|
|
text-transform: uppercase;
|
|
color: #7a5c2a;
|
|
margin-top: 3px;
|
|
}
|
|
|
|
/* Desktop: overlay hidden */
|
|
.utci-topnav .nav-overlay {
|
|
display: none;
|
|
}
|
|
|
|
/* ── Burger button (hidden on desktop) ─────────────────────────────── */
|
|
.utci-burger {
|
|
display: none;
|
|
flex-direction: column;
|
|
justify-content: center;
|
|
align-items: center;
|
|
gap: 5px;
|
|
width: 36px;
|
|
height: 36px;
|
|
background: none;
|
|
border: none;
|
|
cursor: pointer;
|
|
padding: 4px;
|
|
z-index: 110;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.utci-burger span {
|
|
display: block;
|
|
width: 22px;
|
|
height: 2px;
|
|
background: #7a5c2a;
|
|
border-radius: 2px;
|
|
transition: transform 0.25s ease, opacity 0.2s ease;
|
|
transform-origin: center;
|
|
}
|
|
|
|
/* ── Mobile nav drawer ──────────────────────────────────────────────── */
|
|
@media (max-width: 640px) {
|
|
.utci-app {
|
|
padding: 96px 16px 24px; /* 96px = 72px nav height + 24px breathing room */
|
|
}
|
|
|
|
/* Show wordmark in nav bar, hide it from main content */
|
|
.nav-logo {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
position: absolute;
|
|
left: 50%;
|
|
transform: translateX(-50%);
|
|
text-align: center;
|
|
pointer-events: none;
|
|
}
|
|
|
|
.nav-logo-wordmark {
|
|
display: block;
|
|
line-height: 1;
|
|
}
|
|
|
|
.utci-title,
|
|
.utci-tagline {
|
|
display: none;
|
|
}
|
|
|
|
.utci-topnav {
|
|
position: fixed;
|
|
padding: 10px 20px;
|
|
height: 72px;
|
|
background: #f5edd6;
|
|
border-bottom: 1px solid #e0d0a8;
|
|
}
|
|
|
|
.utci-burger {
|
|
display: flex;
|
|
}
|
|
|
|
/* Hide the links by default on mobile — shown in drawer */
|
|
.utci-topnav .nav-links {
|
|
position: fixed;
|
|
top: 0;
|
|
right: -100%;
|
|
width: 220px;
|
|
height: 100vh;
|
|
background: #f5edd6;
|
|
border-left: 1px solid #e0d0a8;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: flex-start;
|
|
justify-content: flex-start;
|
|
padding: 80px 32px 32px;
|
|
gap: 28px;
|
|
transition: right 0.28s cubic-bezier(0.4, 0, 0.2, 1);
|
|
box-shadow: -8px 0 24px rgba(100,70,20,0.08);
|
|
z-index: 105;
|
|
}
|
|
|
|
.utci-topnav .nav-links.is-open {
|
|
right: 0;
|
|
}
|
|
|
|
.utci-topnav .nav-links a {
|
|
font-size: 15px;
|
|
}
|
|
|
|
/* Burger → X animation */
|
|
.utci-topnav.nav-open .utci-burger span:nth-child(1) {
|
|
transform: translateY(7px) rotate(45deg);
|
|
}
|
|
.utci-topnav.nav-open .utci-burger span:nth-child(2) {
|
|
opacity: 0;
|
|
transform: scaleX(0);
|
|
}
|
|
.utci-topnav.nav-open .utci-burger span:nth-child(3) {
|
|
transform: translateY(-7px) rotate(-45deg);
|
|
}
|
|
|
|
/* Overlay behind drawer */
|
|
.utci-topnav .nav-overlay {
|
|
display: block;
|
|
position: fixed;
|
|
inset: 0;
|
|
background: rgba(30,18,8,0.35);
|
|
opacity: 0;
|
|
pointer-events: none;
|
|
transition: opacity 0.25s ease;
|
|
z-index: 104;
|
|
}
|
|
|
|
.utci-topnav.nav-open .nav-overlay {
|
|
opacity: 1;
|
|
pointer-events: auto;
|
|
}
|
|
}
|