diff --git a/assets/css/table.css b/assets/css/table.css
index 7b73dba..4430955 100644
--- a/assets/css/table.css
+++ b/assets/css/table.css
@@ -240,6 +240,48 @@
color: #fff;
}
+/* ── COLUMN TOGGLE - group colour tints ─────────────────────────────────
+ Idle: light group tint bg + group text + group border.
+ Hover: darker tint matching th hover palette.
+ On: solid saturated group colour, white text.
+ On-hover: slightly darker solid. */
+
+.col-toggle.grp-felt { background: rgba(223,243,236,0.50); color: #075c3a; border-color: rgba(7,92,58,0.35); }
+.col-toggle.grp-surface { background: rgba(221,234,248,0.50); color: #0b3e72; border-color: rgba(11,62,114,0.30); }
+.col-toggle.grp-ambient { background: rgba(236,234,227,0.50); color: #3c3a35; border-color: rgba(60,58,53,0.30); }
+.col-toggle.grp-precip { background: rgba(247,228,238,0.50); color: #6b1e3a; border-color: rgba(107,30,58,0.30); }
+.col-toggle.grp-sky { background: rgba(234,232,252,0.50); color: #352e7a; border-color: rgba(53,46,122,0.30); }
+.col-toggle.grp-wind { background: rgba(250,230,224,0.50); color: #6a2210; border-color: rgba(106,34,16,0.30); }
+.col-toggle.grp-airqual { background: rgba(229,240,216,0.50); color: #244408; border-color: rgba(36,68,8,0.30); }
+.col-toggle.grp-solar { background: rgba(250,234,204,0.50); color: #5a3004; border-color: rgba(90,48,4,0.30); }
+
+.col-toggle.grp-felt:hover { background: rgba(213,233,226,0.80); color: #075c3a; border-color: rgba(7,92,58,0.55); }
+.col-toggle.grp-surface:hover { background: rgba(211,224,238,0.80); color: #0b3e72; border-color: rgba(11,62,114,0.50); }
+.col-toggle.grp-ambient:hover { background: rgba(226,224,217,0.80); color: #3c3a35; border-color: rgba(60,58,53,0.50); }
+.col-toggle.grp-precip:hover { background: rgba(237,218,228,0.80); color: #6b1e3a; border-color: rgba(107,30,58,0.50); }
+.col-toggle.grp-sky:hover { background: rgba(224,222,242,0.80); color: #352e7a; border-color: rgba(53,46,122,0.50); }
+.col-toggle.grp-wind:hover { background: rgba(240,220,214,0.80); color: #6a2210; border-color: rgba(106,34,16,0.50); }
+.col-toggle.grp-airqual:hover { background: rgba(219,230,206,0.80); color: #244408; border-color: rgba(36,68,8,0.50); }
+.col-toggle.grp-solar:hover { background: rgba(240,224,194,0.80); color: #5a3004; border-color: rgba(90,48,4,0.50); }
+
+.col-toggle.grp-felt.on { background: #0f9e63; border-color: #0f9e63; color: #fff; }
+.col-toggle.grp-surface.on { background: #2672c8; border-color: #2672c8; color: #fff; }
+.col-toggle.grp-ambient.on { background: #7a7870; border-color: #7a7870; color: #fff; }
+.col-toggle.grp-precip.on { background: #b03060; border-color: #b03060; color: #fff; }
+.col-toggle.grp-sky.on { background: #6058c8; border-color: #6058c8; color: #fff; }
+.col-toggle.grp-wind.on { background: #b04030; border-color: #b04030; color: #fff; }
+.col-toggle.grp-airqual.on { background: #4a8018; border-color: #4a8018; color: #fff; }
+.col-toggle.grp-solar.on { background: #b07820; border-color: #b07820; color: #fff; }
+
+.col-toggle.grp-felt.on:hover { background: #0c7d4e; border-color: #0c7d4e; color: #fff; }
+.col-toggle.grp-surface.on:hover { background: #1e5aa0; border-color: #1e5aa0; color: #fff; }
+.col-toggle.grp-ambient.on:hover { background: #5e5c56; border-color: #5e5c56; color: #fff; }
+.col-toggle.grp-precip.on:hover { background: #8c264c; border-color: #8c264c; color: #fff; }
+.col-toggle.grp-sky.on:hover { background: #4c48a8; border-color: #4c48a8; color: #fff; }
+.col-toggle.grp-wind.on:hover { background: #8c3226; border-color: #8c3226; color: #fff; }
+.col-toggle.grp-airqual.on:hover { background: #3a6412; border-color: #3a6412; color: #fff; }
+.col-toggle.grp-solar.on:hover { background: #8c5e18; border-color: #8c5e18; color: #fff; }
+
/* ── Vehicle group: select + windows-open checkbox fused together ── */
.col-toggle-group {
display: inline-flex;
@@ -426,6 +468,8 @@
margin-top: 2px;
}
+/* col-unit header spans always visible - units toggle only affects body cells */
+
@media (max-width: 800px) {
.utci-table th .col-unit {
font-size: 9px;
diff --git a/assets/css/ui.css b/assets/css/ui.css
index bb5d230..2802432 100644
--- a/assets/css/ui.css
+++ b/assets/css/ui.css
@@ -364,6 +364,59 @@
color: #fff;
}
+/* ── CUSTOM SELECT BUTTON - group colour tints ──────────────────────────
+ Mirrors the col-toggle group palette for dropdowns (Vehicle, Indoors,
+ Burn, Pollen). Same idle - hover - on - on-hover pattern. */
+
+.cs-btn.grp-felt { background: rgba(223,243,236,0.50); color: #075c3a; border-color: rgba(7,92,58,0.35); }
+.cs-btn.grp-surface { background: rgba(221,234,248,0.50); color: #0b3e72; border-color: rgba(11,62,114,0.30); }
+.cs-btn.grp-ambient { background: rgba(236,234,227,0.50); color: #3c3a35; border-color: rgba(60,58,53,0.30); }
+.cs-btn.grp-precip { background: rgba(247,228,238,0.50); color: #6b1e3a; border-color: rgba(107,30,58,0.30); }
+.cs-btn.grp-sky { background: rgba(234,232,252,0.50); color: #352e7a; border-color: rgba(53,46,122,0.30); }
+.cs-btn.grp-wind { background: rgba(250,230,224,0.50); color: #6a2210; border-color: rgba(106,34,16,0.30); }
+.cs-btn.grp-airqual { background: rgba(229,240,216,0.50); color: #244408; border-color: rgba(36,68,8,0.30); }
+.cs-btn.grp-solar { background: rgba(250,234,204,0.50); color: #5a3004; border-color: rgba(90,48,4,0.30); }
+
+.cs-btn.grp-felt:hover { background: rgba(213,233,226,0.80); color: #075c3a; border-color: rgba(7,92,58,0.55); }
+.cs-btn.grp-surface:hover { background: rgba(211,224,238,0.80); color: #0b3e72; border-color: rgba(11,62,114,0.50); }
+.cs-btn.grp-ambient:hover { background: rgba(226,224,217,0.80); color: #3c3a35; border-color: rgba(60,58,53,0.50); }
+.cs-btn.grp-precip:hover { background: rgba(237,218,228,0.80); color: #6b1e3a; border-color: rgba(107,30,58,0.50); }
+.cs-btn.grp-sky:hover { background: rgba(224,222,242,0.80); color: #352e7a; border-color: rgba(53,46,122,0.50); }
+.cs-btn.grp-wind:hover { background: rgba(240,220,214,0.80); color: #6a2210; border-color: rgba(106,34,16,0.50); }
+.cs-btn.grp-airqual:hover { background: rgba(219,230,206,0.80); color: #244408; border-color: rgba(36,68,8,0.50); }
+.cs-btn.grp-solar:hover { background: rgba(240,224,194,0.80); color: #5a3004; border-color: rgba(90,48,4,0.50); }
+
+.cs-btn.grp-felt.on { background: #0f9e63; border-color: #0f9e63; color: #fff; }
+.cs-btn.grp-surface.on { background: #2672c8; border-color: #2672c8; color: #fff; }
+.cs-btn.grp-ambient.on { background: #7a7870; border-color: #7a7870; color: #fff; }
+.cs-btn.grp-precip.on { background: #b03060; border-color: #b03060; color: #fff; }
+.cs-btn.grp-sky.on { background: #6058c8; border-color: #6058c8; color: #fff; }
+.cs-btn.grp-wind.on { background: #b04030; border-color: #b04030; color: #fff; }
+.cs-btn.grp-airqual.on { background: #4a8018; border-color: #4a8018; color: #fff; }
+.cs-btn.grp-solar.on { background: #b07820; border-color: #b07820; color: #fff; }
+
+.cs-btn.grp-felt.on:hover { background: #0c7d4e; border-color: #0c7d4e; color: #fff; }
+.cs-btn.grp-surface.on:hover { background: #1e5aa0; border-color: #1e5aa0; color: #fff; }
+.cs-btn.grp-ambient.on:hover { background: #5e5c56; border-color: #5e5c56; color: #fff; }
+.cs-btn.grp-precip.on:hover { background: #8c264c; border-color: #8c264c; color: #fff; }
+.cs-btn.grp-sky.on:hover { background: #4c48a8; border-color: #4c48a8; color: #fff; }
+.cs-btn.grp-wind.on:hover { background: #8c3226; border-color: #8c3226; color: #fff; }
+.cs-btn.grp-airqual.on:hover { background: #3a6412; border-color: #3a6412; color: #fff; }
+.cs-btn.grp-solar.on:hover { background: #8c5e18; border-color: #8c5e18; color: #fff; }
+
+/* ── VENT PILL - group colour tints ─────────────────────────────────────
+ VentPill fuses with its sibling cs-btn so needs matching group tints.
+ Only felt and surface groups currently use VentPills. */
+
+.cs-vent.grp-felt { background: rgba(223,243,236,0.50); color: #075c3a; border-color: rgba(7,92,58,0.35); }
+.cs-vent.grp-surface { background: rgba(221,234,248,0.50); color: #0b3e72; border-color: rgba(11,62,114,0.30); }
+.cs-vent.grp-felt:hover { background: rgba(213,233,226,0.80); color: #075c3a; border-color: rgba(7,92,58,0.55); }
+.cs-vent.grp-surface:hover { background: rgba(211,224,238,0.80); color: #0b3e72; border-color: rgba(11,62,114,0.50); }
+.cs-vent.grp-felt.on { border-color: #0f9e63; color: #0f9e63; }
+.cs-vent.grp-surface.on { border-color: #2672c8; color: #2672c8; }
+.cs-vent.grp-felt.on:hover { background: rgba(213,233,226,0.80); color: #0c7d4e; border-color: #0c7d4e; }
+.cs-vent.grp-surface.on:hover { background: rgba(211,224,238,0.80); color: #1e5aa0; border-color: #1e5aa0; }
+
/* The chevron arrow inside the button */
.cs-arrow {
display: inline-block;
diff --git a/assets/js/app.js b/assets/js/app.js
index 69a75ed..97650d4 100644
--- a/assets/js/app.js
+++ b/assets/js/app.js
@@ -53,7 +53,7 @@ export function UTCIForecast() {
activeProfile, setActiveProfile, activateProfile, activeCols,
visibleCols, setVisibleCols, toggleCol,
showDecimals, toggleShowDecimals,
- showDegree, toggleShowDegree,
+ showUnits, toggleShowUnits,
activityOptions, placeOptions,
activityValue, activityLabel, placeValue, placeLabel,
skinType, setSkinType,
@@ -336,12 +336,13 @@ export function UTCIForecast() {
Columns:
-${isPro && (activeProfile === 'custom' || activeCols['utciP']) && html``}
- ${(isPro ? (activeProfile === 'custom' || activeCols['vehicleT']) : activeCols['vehicleT']) && html`
+${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['utciP']) && html``}
+ ${(isPro ? (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['vehicleT']) : activeCols['vehicleT']) && html`
<${CustomSelect}
value=${vehicleType}
isOn=${visibleCols.vehicleT}
+ grpClass="grp-felt"
hideLabel="Vehicle"
hidingLabel="Hide Vehicle"
groupedLeft=${true}
@@ -364,15 +365,17 @@ ${isPro && (activeProfile === 'custom' || activeCols['utciP']) && html``}
- ${(isPro ? (activeProfile === 'custom' || activeCols['indoorT'] || activeCols['managedT']) : (activeCols['indoorT'] || activeCols['managedT'])) && html`
+ ${(isPro ? (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['indoorT'] || activeCols['managedT']) : (activeCols['indoorT'] || activeCols['managedT'])) && html`
<${CustomSelect}
value=${buildingType}
isOn=${indoorMode === 'on'}
+ grpClass="grp-felt"
hideLabel="Indoors"
hidingLabel="Hide Indoors"
groupedLeft=${true}
@@ -395,14 +398,16 @@ ${isPro && (activeProfile === 'custom' || activeCols['utciP']) && html``}
- ${(isPro ? (activeProfile === 'custom' || activeCols['burn']) : activeCols['burn']) && html`
+ ${(isPro ? (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['burn']) : activeCols['burn']) && html`
<${CustomSelect}
value=${skinType}
isOn=${visibleCols.burn}
+ grpClass="grp-felt"
hideLabel="Burn"
hidingLabel="Hide Burn"
options=${Object.entries(SKIN_TYPES).map(([k, v]) => ({
@@ -418,26 +423,27 @@ ${isPro && (activeProfile === 'custom' || activeCols['utciP']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['utci']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['delta']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['tmrt']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['concreteT']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['soilT']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['soilT6']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['soilM']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['air']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['rh']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['dew']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['precip']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['precipProb']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['cloud']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['vis']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['wind']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['dir']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['aqi']) && html``}
- ${(isPro ? (activeProfile === 'custom' || activeCols['pollen']) : activeCols['pollen']) && html`<${CustomSelect}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['utci']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['delta']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['tmrt']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['concreteT']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['soilT']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['soilT6']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['soilM']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['air']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['rh']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['dew']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['precip']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['precipProb']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['cloud']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['vis']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['wind']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['dir']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['aqi']) && html``}
+ ${(isPro ? (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['pollen']) : activeCols['pollen']) && html`<${CustomSelect}
value=${pollenType}
isOn=${visibleCols.pollen}
+ grpClass="grp-airqual"
hideLabel="Pollen"
hidingLabel="Hide Pollen"
options=${Object.entries(POLLEN_TYPES).flatMap(([k, v], i) => [
@@ -453,11 +459,11 @@ ${isPro && (activeProfile === 'custom' || activeCols['utciP']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['uvA']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['uvB']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['sun']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['direct']) && html``}
- ${isPro && (activeProfile === 'custom' || activeCols['diffuse']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['uvA']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['uvB']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['sun']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['direct']) && html``}
+ ${isPro && (activeProfile === 'custom' || activeProfile === 'showall' || activeCols['diffuse']) && html``}
`}
@@ -467,12 +473,12 @@ ${isPro && (activeProfile === 'custom' || activeCols['utciP']) && html`