diff --git a/assets/about.css b/assets/about.css index 28bff0d..c9d52b7 100644 --- a/assets/about.css +++ b/assets/about.css @@ -23,9 +23,10 @@ header { } header a { - font-family: 'JetBrains Mono', monospace; + font-family: 'Manrope', sans-serif; font-size: 16px; - letter-spacing: 0.10em; + font-weight: 700; + letter-spacing: 0.06em; text-transform: uppercase; color: #b09870; text-decoration: none; diff --git a/assets/css/base.css b/assets/css/base.css index 88cdf4a..8b6add8 100644 --- a/assets/css/base.css +++ b/assets/css/base.css @@ -27,8 +27,8 @@ FONTS ────────────────────────────────────────────────────────────────────── Fraunces serif display titles, day labels, hour cell - Manrope body sans-serif paragraphs - JetBrains Mono numeric monospace table data, small labels + Manrope body sans-serif paragraphs, small labels + JetBrains Mono numeric monospace table data ════════════════════════════════════════════════════════════════════════ */ @@ -92,9 +92,10 @@ body { } .utci-topnav a { - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 16px; - letter-spacing: 0.1em; + font-weight: 700; + letter-spacing: 0.06em; text-transform: uppercase; color: #b09870; text-decoration: none; diff --git a/assets/css/header.css b/assets/css/header.css index 2937320..f122bf9 100644 --- a/assets/css/header.css +++ b/assets/css/header.css @@ -65,10 +65,11 @@ /* The credits line under the tagline */ .utci-subtitle { - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 11px; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.18em; + letter-spacing: 0.08em; margin-top: 10px; color: #b09870; } @@ -121,10 +122,11 @@ } .utci-search-label { - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 10px; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.18em; + letter-spacing: 0.08em; color: #b09870; display: block; margin-bottom: 7px; @@ -193,8 +195,9 @@ margin-top: 7px; font-size: 10px; color: #b09870; - font-family: JetBrains Mono, monospace; - letter-spacing: 0.14em; + font-family: Manrope, sans-serif; + font-weight: 700; + letter-spacing: 0.08em; text-transform: uppercase; } diff --git a/assets/css/table.css b/assets/css/table.css index 5bb9593..7c82275 100644 --- a/assets/css/table.css +++ b/assets/css/table.css @@ -88,10 +88,11 @@ flex-shrink: 0; padding: 12px 24px; cursor: pointer; - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 10px; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.14em; + letter-spacing: 0.08em; background: transparent; border: none; color: #b09870; @@ -137,10 +138,11 @@ } .filter-profiles-label { - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 12px; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.18em; + letter-spacing: 0.08em; color: #7a5c2a; margin-right: 4px; white-space: nowrap; @@ -162,10 +164,11 @@ border: 1.5px solid #c9b08a; background: #f5edd6; color: #6b4228; - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 13px; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.1em; + letter-spacing: 0.06em; transition: all 0.15s; -webkit-user-select: none; user-select: none; @@ -198,10 +201,11 @@ } .col-toggles-label { - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 12px; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.18em; + letter-spacing: 0.08em; color: #7a5c2a; margin-right: 4px; white-space: nowrap; @@ -214,10 +218,11 @@ border: 1.5px solid #c9b08a; background: #f5edd6; color: #6b4228; - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 12px; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.1em; + letter-spacing: 0.06em; transition: all 0.15s; -webkit-user-select: none; user-select: none; @@ -297,8 +302,9 @@ gap: 5px; padding: 5px 12px 5px 10px; font-size: 12px; - font-family: JetBrains Mono, monospace; - letter-spacing: 0.08em; + font-family: Manrope, sans-serif; + font-weight: 700; + letter-spacing: 0.05em; text-transform: uppercase; cursor: pointer; border: 1.5px solid #c9b08a; @@ -465,11 +471,11 @@ .utci-table th { background: #f0e4c4; color: #6b4f2a; - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 12px; text-transform: uppercase; - letter-spacing: 0.12em; - font-weight: 600; + letter-spacing: 0.07em; + font-weight: 700; padding: 14px 12px; text-align: right; white-space: nowrap; @@ -478,7 +484,7 @@ @media (max-width: 800px) { .utci-table th { font-size: 10px; - letter-spacing: 0.14em; + letter-spacing: 0.08em; } } @@ -703,8 +709,9 @@ } .utci-band-label { - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 10px; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.08em; + letter-spacing: 0.06em; } diff --git a/assets/css/ui.css b/assets/css/ui.css index 0c97a42..2a08ef3 100644 --- a/assets/css/ui.css +++ b/assets/css/ui.css @@ -128,10 +128,11 @@ letter-spacing: 0; } .almanac-subtitle { - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 10px; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.12em; + letter-spacing: 0.07em; color: #9a7d5a; } .almanac-list { @@ -177,16 +178,18 @@ line-height: 1.2; } .almanac-entry-date { - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 10px; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.1em; + letter-spacing: 0.06em; color: #c8922a; white-space: nowrap; } .almanac-entry-countdown { - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 10px; + font-weight: 700; color: #9a7d5a; white-space: nowrap; } @@ -200,10 +203,11 @@ .almanac-entry-visibility { display: inline-block; margin-top: 5px; - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 10px; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.1em; + letter-spacing: 0.06em; color: #7a9a6a; background: #eef4e8; border: 1px solid #c0d8b0; @@ -250,10 +254,11 @@ border: 1.5px solid #c9b08a; background: #f5edd6; color: #6b4228; - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 13px; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.1em; + letter-spacing: 0.06em; transition: all 0.15s; user-select: none; white-space: nowrap; @@ -328,10 +333,11 @@ .cs-option { display: block; padding: 8px 14px; - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 12px; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.08em; + letter-spacing: 0.05em; color: #4a3420; cursor: pointer; transition: background 0.1s, color 0.1s; @@ -369,8 +375,9 @@ gap: 6px; padding: 5px 12px 5px 10px; font-size: 12px; - font-family: JetBrains Mono, monospace; - letter-spacing: 0.08em; + font-family: Manrope, sans-serif; + font-weight: 700; + letter-spacing: 0.05em; text-transform: uppercase; cursor: pointer; border: 1.5px solid #c9b08a; @@ -430,10 +437,11 @@ padding: 14px 18px; background: #f0e4c4; color: #7a5c2a; - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 11px; + font-weight: 700; text-align: center; - letter-spacing: 0.12em; + letter-spacing: 0.07em; text-transform: uppercase; border: 1.5px solid #c9b08a; margin-bottom: 18px; @@ -450,10 +458,10 @@ } .utci-legend-label { - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 10px; text-transform: uppercase; - letter-spacing: 0.18em; + letter-spacing: 0.08em; color: #7a5c2a; margin-bottom: 12px; display: block; @@ -468,10 +476,11 @@ .utci-legend-item { padding: 6px 12px; - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 10px; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.06em; + letter-spacing: 0.04em; flex: 1; min-width: 110px; text-align: center; @@ -536,10 +545,11 @@ margin-top: 36px; padding-top: 20px; border-top: 1px solid #d4c0a0; - font-family: JetBrains Mono, monospace; + font-family: Manrope, sans-serif; font-size: 10px; + font-weight: 700; text-transform: uppercase; - letter-spacing: 0.12em; + letter-spacing: 0.07em; color: #9a7d5a; line-height: 2.2; } diff --git a/assets/js/app.js b/assets/js/app.js index c0fad3d..f5d444c 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -223,6 +223,60 @@ export function UTCIForecast() { const [indoorMode, setIndoorMode] = useState('off'); const searchTimeout = useRef(null); + const activateProfile = (key) => { + const profile = FILTER_PROFILES[key]; + setActiveProfile(key); + if (key !== 'custom') { + setVisibleCols({ ...profile.cols }); + const hasIndoor = profile.cols['indoorT'] || profile.cols['managedT']; + setIndoorMode(hasIndoor ? 'on' : 'off'); + setIndoorManaged(false); + } + }; + + const profileButtonOrder = ['basic', 'home', 'vehicle', 'alltemps', 'custom']; + const variantIcons = { + urban: '🏙️', + beach: '🏖️', + events: '🎪', + festival: '⛺', + sailing: '⛵', + wintersports: '🎿', + naturist: '☀️', + }; + const activityVariantKeys = ['sailing', 'wintersports', 'naturist']; + const placeVariantKeys = ['urban', 'beach', 'events', 'festival']; + const activityOptions = [ + { + value: 'farming', + label: `${FILTER_PROFILES.farming.icon} ${FILTER_PROFILES.farming.label}`, + }, + ...activityVariantKeys.map((k) => { + const v = OUTDOORS_VARIANTS[k]; + return { + value: k, + label: `${variantIcons[k]} ${v.name}${v.proOnly && !isPro ? ' 🔒' : ''}`, + }; + }), + ]; + const placeOptions = placeVariantKeys.map((k) => { + const v = OUTDOORS_VARIANTS[k]; + return { + value: k, + label: `${variantIcons[k]} ${v.name}${v.proOnly && !isPro ? ' 🔒' : ''}`, + }; + }); + const activityValue = activeProfile === 'farming' + ? 'farming' + : activeProfile === 'outdoors' && activityVariantKeys.includes(outdoorsVariant) + ? outdoorsVariant + : 'off'; + const activityLabel = activityOptions.find((option) => option.value === activityValue)?.label; + const placeValue = activeProfile === 'outdoors' && placeVariantKeys.includes(outdoorsVariant) + ? outdoorsVariant + : 'off'; + const placeLabel = placeOptions.find((option) => option.value === placeValue)?.label; + // Refs for the two-scroller table layout (sticky-to-viewport header + // horizontally-scrolling body). The header is clipped (overflow:hidden) // and its inner "track" gets translateX'd via JS to follow the body's @@ -874,7 +928,7 @@ export function UTCIForecast() {
${ev.title}
${ev.message}
${dateLine && html` -
+
${dateLine}
`} @@ -1072,7 +1126,7 @@ export function UTCIForecast() { const dayName = promptDate.toLocaleDateString('en-GB', { weekday: 'long', timeZone: 'UTC' }); const dayLong = promptDate.toLocaleDateString('en-GB', { weekday: 'long', day: 'numeric', month: 'short', timeZone: 'UTC' }); const extraPromptCopy = { - 'profile:sailing': { + 'variant:sailing': { title: 'Sailing is part of SunScope Extra', detail: 'Extra adds specialist planning views for higher-commitment trips, including wind, exposure, UV, and wet-weather comfort for water conditions.', }, @@ -1136,10 +1190,11 @@ export function UTCIForecast() { ${promptCopy.detail}
@@ -1162,10 +1217,11 @@ export function UTCIForecast() { background: '#c8922a', color: '#fff', textDecoration: 'none', - fontFamily: 'JetBrains Mono, monospace', + fontFamily: 'Manrope, sans-serif', + fontWeight: 700, fontSize: '11px', textTransform: 'uppercase', - letterSpacing: '0.14em', + letterSpacing: '0.07em', borderRadius: '3px', whiteSpace: 'nowrap', }} @@ -1175,10 +1231,11 @@ export function UTCIForecast() { - + Day ${selectedDay + 1} of 14 · Forecast clarity: ${band.label} ${isOutlook && html` @@ -1261,45 +1321,10 @@ export function UTCIForecast() { -->
Profile: - ${Object.entries(FILTER_PROFILES).map(([key, profile]) => { + ${profileButtonOrder.slice(0, 3).map((key) => { + const profile = FILTER_PROFILES[key]; const locked = profile.proOnly && !isPro; - // The 'outdoors' profile becomes a CustomSelect dropdown, - // followed by a separator dividing general-use from technical profiles. - if (key === 'outdoors') { - return html` - <${CustomSelect} - key="outdoors" - value=${activeProfile === 'outdoors' ? outdoorsVariant : 'off'} - isOn=${activeProfile === 'outdoors'} - noHide=${true} - hideLabel=${`${profile.icon} ${profile.label}`} - options=${Object.entries(OUTDOORS_VARIANTS).map(([k, v]) => ({ - value: k, - label: v.name + (v.proOnly && !isPro ? ' 🔒' : ''), - disabled: false, - }))} - onChange=${(v) => { - if (v === 'off') { - setActiveProfile('basic'); - setVisibleCols({ ...FILTER_PROFILES.basic.cols }); - setIndoorMode('off'); - return; - } - if (OUTDOORS_VARIANTS[v]?.proOnly && !isPro) { - setProPromptSource(`variant:${v}`); - setProPromptDay(0); - return; - } - setActiveProfile('outdoors'); - setOutdoorsVariant(v); - setVisibleCols({ ...OUTDOORS_VARIANTS[v].cols }); - setIndoorMode('off'); - }} - /> - `; - } - return html` `; + })} + <${CustomSelect} + key="activities" + value=${activityValue} + isOn=${activeProfile === 'farming' || (activeProfile === 'outdoors' && activityVariantKeys.includes(outdoorsVariant))} + noHide=${true} + hideLabel="🎯 Activities" + buttonLabel=${activityValue === 'off' ? '🎯 Activities' : `🎯 Activities: ${activityLabel}`} + options=${activityOptions} + onChange=${(v) => { + if (v === 'off') { + activateProfile('basic'); + return; + } + if (v === 'farming') { + activateProfile('farming'); + return; + } + if (OUTDOORS_VARIANTS[v]?.proOnly && !isPro) { + setProPromptSource(`variant:${v}`); + setProPromptDay(0); + return; + } + setActiveProfile('outdoors'); + setOutdoorsVariant(v); + setVisibleCols({ ...OUTDOORS_VARIANTS[v].cols }); + setIndoorMode('off'); + setIndoorManaged(false); + }} + /> + <${CustomSelect} + key="places" + value=${placeValue} + isOn=${activeProfile === 'outdoors' && placeVariantKeys.includes(outdoorsVariant)} + noHide=${true} + hideLabel="🌤️ Places" + buttonLabel=${placeValue === 'off' ? '🌤️ Places' : `🌤️ Places: ${placeLabel}`} + options=${placeOptions} + onChange=${(v) => { + if (v === 'off') { + activateProfile('basic'); + return; + } + if (OUTDOORS_VARIANTS[v]?.proOnly && !isPro) { + setProPromptSource(`variant:${v}`); + setProPromptDay(0); + return; + } + setActiveProfile('outdoors'); + setOutdoorsVariant(v); + setVisibleCols({ ...OUTDOORS_VARIANTS[v].cols }); + setIndoorMode('off'); + setIndoorManaged(false); + }} + /> + + ${profileButtonOrder.slice(3).map((key) => { + const profile = FILTER_PROFILES[key]; + const locked = profile.proOnly && !isPro; + + return html` + `; })} @@ -1601,7 +1691,7 @@ ${isPro && (activeProfile === 'custom' || FILTER_PROFILES[activeProfile].cols['a ${visibleCols.dir && html` <${WindVane} bearing=${r.wd} size=${28} /> - ${r.compass.label} + ${r.compass.label} `} ${visibleCols.cloud && html` diff --git a/assets/js/components.js b/assets/js/components.js index e8e08b8..619eb65 100644 --- a/assets/js/components.js +++ b/assets/js/components.js @@ -37,7 +37,7 @@ const html = htm.bind(h); // groupedLeft — bool — fuse right side with a VentPill // isLastChild — bool — restore right border-radius when no sibling follows // ═══════════════════════════════════════════════════════════════════ -export function CustomSelect({ value, options, onChange, hideLabel, hidingLabel, isOn, noHide, groupedLeft, isLastChild }) { +export function CustomSelect({ value, options, onChange, hideLabel, hidingLabel, buttonLabel, isOn, noHide, groupedLeft, isLastChild }) { const [open, setOpen] = useState(false); const wrapRef = useRef(null); @@ -60,9 +60,9 @@ export function CustomSelect({ value, options, onChange, hideLabel, hidingLabel, // Build the label shown on the button const activeOpt = options.find(o => o.value === value); - const btnLabel = isOn + const btnLabel = buttonLabel || (isOn ? (activeOpt ? activeOpt.label : hideLabel) - : hideLabel; + : hideLabel); const btnClass = [ 'cs-btn', @@ -157,8 +157,6 @@ export function SkyScope({ elev, dt, glob = 0, size = 26 }) { const isRising = localHour < 12; const skyGrad = skyGradientForElev(elev, isRising); - // Flat horizon colour used for moon shadow fill - const skyHorizon = skyGrad.bot; const isDay = elev > 0; // sun only drawn when actually above horizon const isTwil = elev > -8 && !isDay; // moon shown in twilight too @@ -173,7 +171,6 @@ export function SkyScope({ elev, dt, glob = 0, size = 26 }) { // so it's intense at the sun centre and fades smoothly to transparent. const radFrac = Math.min(1, (glob || 0) / 900); // 0 (dark) → 1 (blazing) const horizFrac = Math.max(0, 1 - elev / 20); // extra warmth near horizon - const glowColor = isRising ? '#ffb040' : '#ffc060'; const glowR = sunR + 4 + radFrac * 6; // total glow radius const glowPeak = 0.35 + radFrac * 0.45 + horizFrac * 0.15; // centre opacity @@ -291,7 +288,7 @@ export function WindVane({ bearing, size = 30 }) { style=${{ flexShrink: 0, display: 'inline-block', verticalAlign: 'middle', overflow: 'visible' }}> N - ${renderMoon(r, r, u*0.50)}` - : html` - - ${[0,45,90,135,180,225,270,315].map(a => { - const x1 = r + Math.sin(a*Math.PI/180) * u*0.65; - const y1 = r - Math.cos(a*Math.PI/180) * u*0.65; - const x2 = r + Math.sin(a*Math.PI/180) * u*0.95; - const y2 = r - Math.cos(a*Math.PI/180) * u*0.95; - return html``; - })} - - `)} + ${category === 'clear' && html` + ${line(size * 0.26, size * 0.50, size * 0.74, size * 0.50, brass, sw, 0.9)} + ${line(size * 0.38, size * 0.64, size * 0.62, size * 0.64, muted, sw * 0.75, 0.7)}`} ${category === 'wispy' && html` - - ${isNight - ? renderMoon(r, r*0.95, u*0.42) - : html``} - - `} + ${mist(size * 0.38, brass)} + ${line(size * 0.18, size * 0.78, size * 0.60, size * 0.78, muted, sw * 0.7, 0.6)}`} ${category === 'scattered' && html` - - ${isNight - ? renderMoon(r+u*0.45, r-u*0.40, u*0.32) - : html``} - - - - - - - `} + + ${line(size * 0.20, size * 0.78, size * 0.48, size * 0.78, brass, sw * 0.75, 0.78)}`} ${category === 'overcast' && html` - - - - - - - `} + + `} `; } @@ -626,18 +592,18 @@ export function ScopeReticle({ value, cat, loading, elev = 0, dt = new Date(), g + font-family="Manrope, sans-serif" font-weight="700" letter-spacing="1.2"> UTCI NOW + font-family="Manrope, sans-serif" font-weight="700" letter-spacing="0.5"> ${cat.label.toUpperCase()} ` : html` + font-family="Manrope, sans-serif" font-weight="700" letter-spacing="0.8"> AWAITING `} `; @@ -664,25 +630,28 @@ export function PrecipIcon({ precip = 0, snow = 0, size = 28 }) { const hasRain = precip > 0; const hasSnow = snow > 0; const mixed = hasRain && hasSnow; - - // Drop shape: teardrop path centred on (cx, cy), radius dr - const drop = (cx, cy, dr) => { - const tip = cy + dr * 1.55; - const cw = dr * 0.72; - return `M ${cx} ${tip} C ${cx - cw} ${cy + dr * 0.6}, ${cx - dr} ${cy - dr * 0.3}, ${cx} ${cy - dr} C ${cx + dr} ${cy - dr * 0.3}, ${cx + cw} ${cy + dr * 0.6}, ${cx} ${tip} Z`; - }; - - // Six-pointed snowflake: centre lines + diagonal lines + const brass = '#c8922a'; + const ink = '#2a1a08'; + const rain = '#2a6a90'; + const snowBlue = '#3f73c4'; + const sw = Math.max(1.25, size * 0.055); + const cloud = html` + `; + const rainStroke = (cx, cy, heavy = false) => html` + `; const flake = (cx, cy, fr) => html` - + - - - ${[-1, 1].map(sx => [-1, 1].map(sy => html` - `))} + + `; // Dry — just a faint dash @@ -691,7 +660,7 @@ export function PrecipIcon({ precip = 0, snow = 0, size = 28 }) { + stroke=${brass} stroke-width="1.5" stroke-linecap="round" opacity="0.75" /> `; } @@ -699,9 +668,7 @@ export function PrecipIcon({ precip = 0, snow = 0, size = 28 }) { const rainDrops = !hasRain ? 0 : precip < 1 ? 1 : precip < 4 ? 2 : 3; // Snow intensity → number of flakes const snowFlakes = !hasSnow ? 0 : snow < 0.5 ? 1 : 2; - const dropColor = '#5090b0'; - const dr = size * 0.13; // drop radius - const fr = size * 0.18; // flake arm length + const fr = size * 0.08; // flake arm length // Layout: spread items evenly across the icon width const items = (mixed ? rainDrops + snowFlakes : hasRain ? rainDrops : snowFlakes); @@ -710,20 +677,23 @@ export function PrecipIcon({ precip = 0, snow = 0, size = 28 }) { return html` + ${cloud} ${mixed ? html` ${Array.from({ length: rainDrops }, (_, i) => html` - `)} + <${Fragment} key=${'d' + i}> + ${rainStroke(spacing * (i + 1), size * 0.52, false)} + `)} ${Array.from({ length: snowFlakes }, (_, i) => - flake(spacing * (rainDrops + i + 1), r, fr) + flake(spacing * (rainDrops + i + 1), size * 0.68, fr) )}` : hasRain ? Array.from({ length: rainDrops }, (_, i) => html` - `) + <${Fragment} key=${i}> + ${rainStroke(spacing * (i + 1), size * 0.53, precip >= 4)} + `) : Array.from({ length: snowFlakes }, (_, i) => - flake(spacing * (i + 1), r, fr) + flake(spacing * (i + 1), size * 0.66, fr) )} `; } diff --git a/restore.php b/restore.php index 4477f02..e21ada8 100644 --- a/restore.php +++ b/restore.php @@ -133,10 +133,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { color: #fff; border: none; border-radius: 4px; - font-family: 'JetBrains Mono', monospace; + font-family: 'Manrope', sans-serif; + font-weight: 700; font-size: 0.75rem; text-transform: uppercase; - letter-spacing: 0.12em; + letter-spacing: 0.07em; cursor: pointer; } button:hover { background: #a06e18; } @@ -153,10 +154,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { } .back { margin-top: 1.5rem; - font-family: 'JetBrains Mono', monospace; + font-family: 'Manrope', sans-serif; + font-weight: 700; font-size: 0.7rem; text-transform: uppercase; - letter-spacing: 0.1em; + letter-spacing: 0.06em; } .back a { color: #b09870; text-decoration: none; } .back a:hover { color: #c8922a; }