Skip to content

release: v0.11.0 - #202

Merged
octalide merged 65 commits into
mainfrom
dev
Oct 1, 2026
Merged

octalide merged 65 commits into
mainfrom
dev

Conversation

@octalide

@octalide octalide commented Oct 1, 2026

Copy link
Copy Markdown
Collaborator

Integration merge of dev for 0.11.0. Release commit in #201.

a scroll region takes the wheel only when it can move the way the wheel
turns. one at its limit in that direction, or with no overflow, leaves it
for the enclosing region, so nested regions chain and the innermost one
that can move takes it.
A new slider_fill kind paints the track from its start to the handle's
middle in the slider's state, clear in the built-in themes so the look
is unchanged until a theme opts in. A slider_handle min_w of 0 leaves the
handle out for a fill alone.
The caret was as tall as the line, ascent, descent and gap, so with a larger
text style it reached past the caption it marks. It now takes the section
style's min_w (section.min_w), and with none the caption's ascent in the
current text style, centred between the line's top and the baseline. The
caption and the heading's width step over the caret's size.

The gallery and panel goldens change only in their section headings: the
caret is 7 pixels rather than 8 and the caption one pixel further left.
post_keyed names a toast by a key, copied like its text, and a later post
under the same key replaces that toast in place: it keeps its place in the
stack and restarts its clock, without fading in again if it was on screen.
withdraw fades a keyed toast out from the next show, or drops it unseen if
no frame showed it. show_in anchors the stack inside any rect, as show
anchors it inside the surface. post and show are unchanged.
central makes a space's root its central node, a leaf that keeps its share
of the layout while empty and never collapses. while it holds no live
window the space paints its background and takes its claims only around
it, so what the app draws and claims beneath the space shows through and
takes the pointer there. central_area reports its rect this frame. the
central node is saved and loaded with the layout.
…g section

a toggle draws a scene that claims its clicks, then a dock space over it
with a panel docked beside its empty central node.
feat(#164): pass the wheel up from a scroll region that cannot move
fix(#166): section caret size independent of line height
# Conflicts:
#	demo/gallery/src/bin/gallery.snap
feat(#168): a passthrough central node in a dock space
feat(#165): keyed, replaceable toasts anchored to any rect
…line

the row caret takes its side from the tree item style's min_w, or with none
the caption's ascent, through the section caret's helper, now public and
keyed by style kind
A table takes the vertical wheel only when it can move vertically the way
it turns, and the horizontal wheel only when it can move sideways that way,
leaving the rest for the enclosing region. The context tracks the horizontal
wheel apart from the vertical one (hwheel_taken), so a table at its vertical
end still scrolls sideways while the dock around it takes the vertical wheel.
A docked window's scroll region now sits within the leaf rect padded by
the theme.WINDOW style, as a floating body is, so a window's content is
laid out the same docked or floating. The gallery golden takes the
default bottom padding in its docked columns.
# Conflicts:
#	demo/gallery/src/bin/gallery.snap
…front tab

dock.insert docks a window at an index in a leaf's tab stack, renumbering
the other tabs around it and moving its tab in the bar when the bar has
placed it. dock.select brings a docked window to its leaf's front. a
default layout no longer has to write Docked.rank or Node.front.
feat(#175): tab position and front tab when adding to a dock
the golden merged with #174 lost the two value fills #167's gallery sliders
draw. regenerated from dev with #164 through #179 merged; the only change is
those two quads.
chore: regenerate the gallery golden with the slider fill
fix(#180): a pushed fill gives a solid face
theme.Style.overflow chooses whether a label too wide for its box is
clipped at the box or cut with an ellipsis at its end, ellipsis by
default. text.fit_box and text.fit_pair draw a label, or a label and a
value, unchanged when they fit and fit to the box otherwise.
buttons and their groups, segmented choices, toggles, sliders, dropdowns
and combos with their options, tabs and the tab overflow list, window and
modal titles, section headings, table headers, list rows and progress
text draw their labels through text.fit_box, so a label too wide for its
box no longer spills over its neighbours.
the gallery's closable tab label was clipped mid-glyph at its close box,
and is now cut with an ellipsis.
# Conflicts:
#	demo/gallery/src/bin/gallery.snap
add docks through insert at an index past the last tab, so a window takes
one more than the leaf's highest rank and an already placed tab moves to
the end of its bar. the draw-time sort breaks equal ranks by id, as insert's
does, so the order no longer follows the state store's walk.
fix(#177): clip labels to their box
fix(#190): keep add order for windows in a leaf before its first draw
each field table row carries lo and hi, the range a UNIT_FACTOR value
takes, and 0 for the other units. a test holds the table to it.
the hand-coded 0 to 1 cap on factors and 0 to 2 on the motion fields
give way to each field's own lo and hi.
tabs.width rebuilt every tab's width as least plus the rest times the
shrink factor. at a factor of one that sum can land a hair short of the
natural width in floating point, so the label box came out a fraction of a
pixel narrower than the label and fit_box cut it with an ellipsis. a tab the
bar has room for now takes its natural width directly. the test sweeps
paddings that do not land on whole pixels and fails without the fix.
feat(#192): theme factor fields state their own range
fix(#194): an unshrunk tab is exactly its natural width
menu.begin_main_bar carves one control row off the top of the free area
with context.carve, as a docked container takes its strip, so free_area
read after it starts below the bar and a dock space placed from it lies
beneath. begin_bar and begin_main_bar share one bar_in over the row each
takes, so headers, shortcuts, keyboard navigation and painting are the
same, closed by the same end_bar.
feat(#196): a main menu bar takes its row from the free area
…wn whole

a box sized to exactly its label, as a tab or a fit-width button builds it,
is formed from absolute coordinates, and far from the left edge their
rounding leaves it a hair narrower than the label, which fit_box then cut
with an ellipsis. the comparison is of float pixel widths, so it now allows
FIT_SLACK, a sixty-fourth of a pixel. the test draws labels in boxes sized
to them at offsets from 900 to over 5000 and fails without the fix.
a tab's body is drawn short of the separator after it (the tab style's
margin.r), but the strip measured and laid tabs out by their body width
alone, so every unshrunk tab's body came out one separator narrower than
its label and fit_box cut the label with an ellipsis. the strip now
measures, scrolls and places tabs by their room, the body and the separator,
read once into the bar's geometry. the test checks each roomy tab is drawn
its whole natural width, and fails with the old layout.
fix(#198): a tab's label is cut with room to spare
#198 lays tabs out with their separator, so the gallery's docked title tab
is one pixel wider and draws its label whole. the old golden had the bug
in it: the title cut to an ellipsis. every changed line is in the title row.
chore: regenerate the gallery golden with the whole title tab
@octalide
octalide merged commit 300f00e into main Oct 1, 2026
2 checks passed
@octalide octalide mentioned this pull request Oct 1, 2026
58 of 60 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant