New hour selection
Animated UI elements
This commit is contained in:
fraxle
2026-07-30 23:09:42 +01:00
parent e32a774c1e
commit 2869694634
5 changed files with 165 additions and 40 deletions
+121 -27
View File
@@ -926,13 +926,61 @@
/* Whole Columns bar (Hours + column pills) stays collapsed behind the
Edit columns / Hide Columns toggle in the toolbar row until opened.
Scoped to detailed (table) view — quick view keeps its own reduced
col-toggles bar (Hours only) visible regardless of this state. */
.table-main:not(.table-main--simple) .col-toggles {
display: none;
col-toggles bar (Hours only) visible regardless of this state.
It slides rather than snapping: the wrapper is a 1-row grid animated
0fr → 1fr, which is the only way to transition to an unknown content
height in CSS. The bar's own padding/top border have to collapse with
it, otherwise a 25px sliver of empty panel stays behind at 0fr.
Note the wrapper carries key=${forecastView} in app.js. Quick view keeps
this bar expanded and detailed view collapses it, so on a view switch the
browser would otherwise animate that difference — the panel would flash
open and slide shut. Remounting gives it no previous value to transition
from, so the collapsed state just applies. */
.col-toggles-wrap {
display: grid;
grid-template-rows: 1fr;
}
.table-main:not(.table-main--simple) .col-toggles.col-toggles--open {
display: flex;
.table-main:not(.table-main--simple) .col-toggles-wrap {
grid-template-rows: 0fr;
transition: grid-template-rows 0.28s cubic-bezier(0.4, 0, 0.2, 1);
}
.table-main:not(.table-main--simple) .col-toggles-wrap > .col-toggles {
overflow: hidden;
min-height: 0;
padding-top: 0;
padding-bottom: 0;
border-top-width: 0;
opacity: 0;
transition:
padding 0.28s cubic-bezier(0.4, 0, 0.2, 1),
border-top-width 0.28s cubic-bezier(0.4, 0, 0.2, 1),
opacity 0.18s ease;
}
.table-main:not(.table-main--simple) .col-toggles-wrap--open {
grid-template-rows: 1fr;
}
.table-main:not(.table-main--simple) .col-toggles-wrap--open > .col-toggles {
padding-top: 10px;
padding-bottom: 10px;
border-top-width: 1.5px;
opacity: 1;
transition:
padding 0.28s cubic-bezier(0.4, 0, 0.2, 1),
border-top-width 0.28s cubic-bezier(0.4, 0, 0.2, 1),
opacity 0.22s ease 0.06s;
}
@media (prefers-reduced-motion: reduce) {
.table-main:not(.table-main--simple) .col-toggles-wrap,
.table-main:not(.table-main--simple) .col-toggles-wrap > .col-toggles {
transition: none;
}
}
@@ -1392,38 +1440,94 @@
background: #e8d8a8;
}
/* ── HOUR-INTERVAL SELECTOR ──────────────────────────────────────────────
Compact 1h/2h/3h/4h segmented control inside the "Hour" header. Buckets
the table into multi-hour rows (clock-aligned from midnight). Lives in the
header so it stays put while the body scrolls. */
/* ── ROW-INTERVAL STEPPER ────────────────────────────────────────────────
"Rows [] 3h [+]" — sets how many hours each table row covers
(clock-aligned buckets from midnight). Used twice: bare inside the "Hour"
header, where it stays put while the body scrolls, and with its label in
the simple-view toggle bar (see .fvt-interval below). */
.hour-interval {
display: flex;
justify-content: flex-start;
gap: 2px;
margin-top: 4px;
}
.hour-interval-btn {
.row-stepper {
display: inline-flex;
align-items: center;
gap: 3px;
}
.row-stepper-label {
font-family: Manrope, sans-serif;
font-size: 10px;
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.07em;
color: #7a5c2a;
margin-right: 2px;
}
.row-stepper-btn {
display: flex;
align-items: center;
justify-content: center;
min-width: 26px;
min-height: 26px;
padding: 0;
font-family: Manrope, sans-serif;
font-size: 14px;
font-weight: 700;
line-height: 1;
padding: 3px 4px;
cursor: pointer;
border: 1px solid #c9b08a;
background: #f5edd6;
color: #6b4228;
border-radius: 3px;
touch-action: manipulation;
user-select: none;
transition: background 0.12s, border-color 0.12s, color 0.12s;
}
.hour-interval-btn:hover {
.row-stepper-btn:hover:not(:disabled) {
border-color: #c8922a;
background: #fef3dc;
}
.hour-interval-btn.on {
.row-stepper-btn:active:not(:disabled) {
background: #c8922a;
border-color: #c8922a;
color: #fff;
}
.row-stepper-btn:disabled {
opacity: 0.35;
cursor: default;
}
/* Fixed width so the row doesn't jitter as the value changes. */
.row-stepper-value {
min-width: 26px;
text-align: center;
font-family: Manrope, sans-serif;
font-size: 11px;
font-weight: 700;
line-height: 1;
color: #6b4228;
user-select: none;
}
/* Roomier tap targets on touch-sized screens. The simple-view stepper gets
the full bump; the one in the Hour header stays tighter because that
column is pinned and its width is taken straight off the viewport. */
@media (max-width: 640px) {
.row-stepper-btn {
min-width: 28px;
min-height: 28px;
font-size: 15px;
}
.fvt-interval .row-stepper-btn {
min-width: 34px;
min-height: 34px;
font-size: 16px;
}
.fvt-interval .row-stepper-value {
min-width: 30px;
font-size: 12px;
}
}
/* ── COLUMN DESCRIPTION POPUP ───────────────────────────────────────────
Fixed-position card that appears below a clicked column header.
@@ -2154,27 +2258,17 @@
margin-bottom: -1.5px;
}
/* Interval buttons shown in the col-toggles bar in simple mode, pushed
to the far right since Columns/Edit controls are hidden there. */
/* Row stepper shown in the col-toggles bar in simple mode, pushed to the
far right since Columns/Edit controls are hidden there. */
.fvt-interval {
display: none;
align-items: center;
gap: 2px;
margin-left: auto;
flex-shrink: 0;
}
.table-main--simple .fvt-interval {
display: inline-flex;
}
.fvt-interval-label {
font-family: Manrope, sans-serif;
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.07em;
color: #7a5c2a;
margin-right: 3px;
}
/* Hide table-mode column controls when in simple mode */
.table-main--simple .col-toggles-label,