3.8
Improved 'Sow' and 'Harvest' calcs Better background on the event banners
This commit is contained in:
@@ -33,7 +33,7 @@
|
||||
|
||||
import { h, Fragment } from '../../vendor/preact.js';
|
||||
import htm from '../../vendor/htm.js';
|
||||
import { confidenceBand, utciCategory, petCategory, VEHICLE_SPEEDS, VEHICLE_TYPES, BUILDING_TYPES, FUR_COLORS } from '../utils.js';
|
||||
import { confidenceBand, utciCategory, petCategory, hexToRgb, mixRgb, rainTint, cloudTint, snowTint, VEHICLE_SPEEDS, VEHICLE_TYPES, BUILDING_TYPES, FUR_COLORS } from '../utils.js';
|
||||
import { FREE_DAYS, UTCI_ENVIRONMENTS, deriveProfileMain, FILTER_PROFILES, variantIcons } from '../config.js';
|
||||
import { calcVehicleInteriorTempPass } from '../physics.js';
|
||||
import { CloudIcon, PrecipIcon, HouseIcon, CarIcon, FogIcon, IceIcon } from '../components.js';
|
||||
@@ -300,8 +300,8 @@ export function DayTabs({
|
||||
// only vary its shade: heat → snow → rain → cloud → sun (first wins).
|
||||
// • Hot/extreme days always keep their heat colour (a safety signal).
|
||||
// • Otherwise rain wins, then cloud, then a clear "sunny"/cold colour.
|
||||
const mix = (a, b, t) => a.map((v, i) => Math.round(v + (b[i] - v) * Math.max(0, Math.min(1, t))));
|
||||
const hex2rgb = (hx) => { const n = parseInt(hx.replace('#', ''), 16); return [(n >> 16) & 255, (n >> 8) & 255, n & 255]; };
|
||||
// Shade ramps live in utils.js (WEATHER TINT PALETTE) so the warning
|
||||
// event banner can colour itself from exactly the same source.
|
||||
const catFn = isPetsProfile ? petCategory : utciCategory;
|
||||
const tBand = dayHi !== null ? catFn(dayHi) : { bg: '#f8e554' };
|
||||
|
||||
@@ -323,7 +323,7 @@ export function DayTabs({
|
||||
|
||||
let rgb;
|
||||
if (tempOnly) {
|
||||
rgb = hex2rgb(tBand.bg);
|
||||
rgb = hexToRgb(tBand.bg);
|
||||
} else if (isHot) {
|
||||
// Keep the heat hue; cloud only mutes it a touch (orange/red never
|
||||
// greens) and rain does not override heat.
|
||||
@@ -331,22 +331,22 @@ export function DayTabs({
|
||||
? (dayHi >= 49 ? 0.15 : dayHi >= 43 ? 0.30 : 0.45)
|
||||
: (dayHi >= 39 ? 0.15 : dayHi >= 34 ? 0.30 : 0.45);
|
||||
const t = Math.max(0, Math.min(1, (avgCloud - 30) / 70)) * heatFactor;
|
||||
rgb = mix(hex2rgb(tBand.bg), [170, 162, 152], t);
|
||||
rgb = mixRgb(hexToRgb(tBand.bg), [170, 162, 152], t);
|
||||
} else if (daySnow >= 0.1) {
|
||||
// Snow: pale → icy blue with depth.
|
||||
rgb = mix([226, 234, 244], [176, 202, 232], Math.max(0, Math.min(1, daySnow / 1.5)));
|
||||
rgb = snowTint(daySnow);
|
||||
} else if (showPrecip) {
|
||||
// Rain: light → deep blue with amount (pure blue, no temperature hue).
|
||||
rgb = mix([150, 176, 212], [44, 84, 150], Math.max(0, Math.min(1, dayPrecip / 8)));
|
||||
rgb = rainTint(dayPrecip);
|
||||
} else if (avgCloud >= 30) {
|
||||
// Cloud: light → dark grey with cover (pure grey, no temperature hue).
|
||||
rgb = mix([205, 206, 208], [110, 115, 122], Math.max(0, Math.min(1, (avgCloud - 30) / 70)));
|
||||
rgb = cloudTint(avgCloud);
|
||||
} else if (dayHi !== null && dayHi < (isPetsProfile ? 2 : 10)) {
|
||||
// Clear & cold: keep the cold temperature blue.
|
||||
rgb = hex2rgb(tBand.bg);
|
||||
rgb = hexToRgb(tBand.bg);
|
||||
} else {
|
||||
// Clear & mild/warm: a plain sunny yellow.
|
||||
rgb = hex2rgb('#f8e554');
|
||||
rgb = hexToRgb('#f8e554');
|
||||
}
|
||||
const [wR, wG, wB] = rgb;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user