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() {
${dateLine && html` -