5.0.8
Day tab colour update Cleanup event banner and add close
This commit is contained in:
+49
-7
@@ -276,6 +276,31 @@ export function UTCIForecast() {
|
||||
setTimeout(() => { setNoteIndex(next); setNoteFading(false); }, NOTE_FADE_MS);
|
||||
};
|
||||
|
||||
// ── Dismissal ────────────────────────────────────────────────────────
|
||||
// Closing the strip hides it for the rest of the browser session, but only
|
||||
// for the events that were showing at the time: the dismissal is stored
|
||||
// against a signature of the active ids, so a new event (or a fresh weather
|
||||
// warning) brings the strip back rather than staying silently suppressed.
|
||||
const NOTE_CLOSE_KEY = 'sunscope_event_note_closed';
|
||||
const NOTE_CLOSE_MS = 260;
|
||||
const noteSig = activeEvents.map(e => e.id).sort().join('|');
|
||||
const [noteClosedSig, setNoteClosedSig] = useState(() => {
|
||||
try { return sessionStorage.getItem(NOTE_CLOSE_KEY) || ''; } catch (e) { return ''; }
|
||||
});
|
||||
// Kept mounted for the collapse animation, then dropped.
|
||||
const [noteClosing, setNoteClosing] = useState(false);
|
||||
const noteDismissed = !!noteSig && noteSig === noteClosedSig;
|
||||
|
||||
const noteClose = () => {
|
||||
if (noteClosing) return;
|
||||
setNoteClosing(true);
|
||||
setTimeout(() => {
|
||||
try { sessionStorage.setItem(NOTE_CLOSE_KEY, noteSig); } catch (e) { /* ignore */ }
|
||||
setNoteClosedSig(noteSig);
|
||||
setNoteClosing(false);
|
||||
}, NOTE_CLOSE_MS);
|
||||
};
|
||||
|
||||
// Keep the index in range if the event list shrinks between forecasts.
|
||||
useEffect(() => {
|
||||
if (noteIndex >= activeEvents.length) setNoteIndex(0);
|
||||
@@ -669,8 +694,8 @@ export function UTCIForecast() {
|
||||
// • "utci-about" — the explainer paragraphs at the bottom
|
||||
// • "utci-footer" — the "reading the table" note
|
||||
return html`
|
||||
<div class=${`utci-app${activeEvents.length > 0 ? ' has-event-note' : ''}`}>
|
||||
${activeEvents.length > 0 && (() => {
|
||||
<div class=${`utci-app${activeEvents.length > 0 && !noteDismissed ? ' has-event-note' : ''}`}>
|
||||
${activeEvents.length > 0 && !noteDismissed && (() => {
|
||||
const ev = activeEvents[noteIndex] || activeEvents[0];
|
||||
const isPriority = PRIORITY_WEATHER_IDS.has(ev.id);
|
||||
const fmtDate = (iso) => iso
|
||||
@@ -703,7 +728,7 @@ export function UTCIForecast() {
|
||||
};
|
||||
})() : undefined;
|
||||
return html`
|
||||
<div class=${`event-note${isPriority ? ' is-priority' : ''}${noteTintStyle ? ' is-tinted' : ''}`} style=${noteTintStyle}>
|
||||
<div class=${`event-note${isPriority ? ' is-priority' : ''}${noteTintStyle ? ' is-tinted' : ''}${noteClosing ? ' is-closing' : ''}`} style=${noteTintStyle}>
|
||||
<span class="event-note-accent" style=${{ background: ev.color === '#fdf8ee' ? '#c8922a' : ev.color }} />
|
||||
${/* Every slide is rendered, all stacked in one CSS grid cell, so the
|
||||
strip is always as tall as the LONGEST event's copy. Rotating to
|
||||
@@ -720,10 +745,14 @@ export function UTCIForecast() {
|
||||
class=${`event-note-slide${isActive ? ' is-active' : ''}`}
|
||||
aria-hidden=${isActive ? undefined : 'true'}
|
||||
>
|
||||
<span class="event-note-emoji">${e.emoji}</span>
|
||||
<span class="event-note-title">${e.title}</span>
|
||||
<span class="event-note-msg">${e.message}</span>
|
||||
${dateLine && html`<span class="event-note-dates">${dateLine}</span>`}
|
||||
<div class="event-note-header">
|
||||
<span class="event-note-emoji">${e.emoji}</span>
|
||||
<span class="event-note-title">${e.title}</span>
|
||||
</div>
|
||||
<div class="event-note-body">
|
||||
<span class="event-note-msg">${e.message}</span>
|
||||
${dateLine && html`<span class="event-note-dates">${dateLine}</span>`}
|
||||
</div>
|
||||
</div>`;
|
||||
})}
|
||||
</div>
|
||||
@@ -738,6 +767,19 @@ export function UTCIForecast() {
|
||||
onClick=${() => noteGoTo(i)}
|
||||
/>`)}
|
||||
</div>`}
|
||||
<button
|
||||
type="button"
|
||||
class="event-note-close"
|
||||
aria-label="Close event banner"
|
||||
title="Close"
|
||||
onClick=${noteClose}
|
||||
>
|
||||
<span class="event-note-close-label">Close</span>
|
||||
<svg viewBox="0 0 12 12" width="10" height="10" aria-hidden="true">
|
||||
<path d="M1.5 1.5 L10.5 10.5 M10.5 1.5 L1.5 10.5"
|
||||
fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>`;
|
||||
})()}
|
||||
<nav class="utci-topnav" id="site-nav">
|
||||
|
||||
Reference in New Issue
Block a user