Give the range's ends a row of their own, not a corner of someone else's
Build and test / Desktop (Linux) (push) Failing after 2m32s
Build and test / Layer separation (push) Successful in 25s
🐳 Android image / Build and push (push) Successful in 3s
Build and test / android-image (push) Successful in 5s
Traceability / Requirement traces (push) Failing after 1m3s
Build and test / Android (aarch64) (push) Failing after 7s

Third attempt at one control, and each failure was a different reason it could
not be seen.

It narrowed to the whole library, because it took its span from a timeline zoom
that is zero until someone zooms. The fields that fixed that went into the chip
row, which scrolls sideways, so they sat past the right-hand edge. And moving
them "below the chips" put them inside the same `Rectangle` — which stacks its
children at the origin rather than laying them out, so they were drawn over the
chips inside a strip 34px tall, unconstrained in width and clipped in height.

A `Rectangle` is not a layout. The row is a sibling of the chips' strip in the
header's `VerticalLayout` now, with a height of its own and the width of the
window: two 108px fields, a "to", and a warning when what was typed is not a
date — about 354px, against 768 on a tablet in portrait.

Left-aligned and inset by the same gap the chips use, so the two rows begin on
one vertical line instead of a few pixels apart.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-23 14:06:37 +02:00
co-authored by Claude Opus 5
parent db43d8ec8b
commit 5a9beedca6
+37 -30
View File
@@ -1760,29 +1760,44 @@ export component LibraryGrid inherits Rectangle {
}
}
// The range's ends, on their own line.
//
// Not in the chip row above, which scrolls: fourteen chips
// already do not fit across a tablet in portrait, so anything
// added there lands past the right edge, where it has to be
// panned to. That is how "limit to range" managed to look
// broken twice — first because it narrowed to everything, and
// then because the controls that fixed that were off-screen.
//
// Costs nothing when there is no range: the row does not exist
// then.
//
// Turning the chip on used to be the whole control, and it took its
// span from the timeline's zoom — which is zero until someone
// zooms, so the range came out as the entire library and the button
// appeared to do nothing. The span is shown here and can be typed,
// so "limit to range" always narrows to something a person chose.
//
// Still seeded from the timeline: zooming to a fortnight and
// pressing the chip is the fast path, and these fields say which
// fortnight it landed on.
if root.range-active: HorizontalLayout {
Rectangle {
y: parent.height - 1px;
height: 1px;
background: Theme.rule;
}
}
// --- the date range's ends ---------------------------------------
//
// Its own strip, a sibling of the chips rather than a child of them.
//
// Twice now this control has looked broken. First it narrowed to the
// whole library, because it took its span from a timeline zoom that
// is zero until someone zooms. Then the fields that fixed that went
// into the chip row — which is 34px tall and scrolls sideways, so
// they were both clipped and off past the right-hand edge.
//
// A `Rectangle` stacks its children at the origin rather than laying
// them out, which is why putting a second row inside the chips' one
// drew it over them instead of under them. This is a row of the
// header's `VerticalLayout`, so it gets a line of its own and the
// width of the window.
if root.range-active: Rectangle {
height: 40px;
background: Theme.surface;
HorizontalLayout {
width: 100%;
height: 100%;
// The same leading inset the chips above use, so the two rows
// start on one vertical line rather than a few pixels apart.
padding-left: Theme.gap;
padding-right: Theme.gap;
spacing: Theme.gap-sm;
// Fixed-width fields and a two-letter word: left-aligned, so
// they sit under the chip that turned them on instead of
// spreading across the window.
alignment: start;
Field {
width: 108px;
@@ -1805,20 +1820,12 @@ export component LibraryGrid inherits Rectangle {
accepted(t) => { root.range-edited(root.range-from, t); }
}
// Says which end is wrong is beyond a caption, but saying
// that *something* is beats an empty grid with no reason.
if root.range-invalid: Caption {
text: "not a date";
warn: true;
vertical-alignment: center;
}
}
Rectangle {
y: parent.height - 1px;
height: 1px;
background: Theme.rule;
}
}
// --- progress -----------------------------------------------------