Skip to main content

max / makeover-immediate

Strip historical narrative from documentation Remove what a doc used to say, when it changed, the incidents that justified a rule, finished migration narration, and counts and versions that rot. State the rules in the present tense instead. Keep every instruction, prohibition and threshold, and keep the measurements that make a rule actionable. Public-facing docs keep their explanatory voice.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session
https://claude.ai/code/session_01MptwXZ8k65v19rFmdGAyki
Author: Max Johnson <me@maxj.phd> · 2026-08-31 01:51 UTC
Signed with PGP, not checked
Commit: 6f81ce2969d45c9d785ab9a1df9a3e7a55172e8c
Parent: feaca62
3 files changed, +101 insertions, -161 deletions
M README.md +4 -10
@@ -18,10 +18,8 @@
18 18 The expression, and nothing else. Two mitred polylines for a bevel and a
19 19 `Frame` for a filled region.
20 20
21 - It no longer owns a substitution. This renderer briefly supplied the page where
22 - a theme had no `surface-well`, which was a stand-in for a token that did not
23 - exist yet; makeover derives it from 2.3.0 and every consumer reads it, so
24 - `Palette::well` is a required `Color32` rather than an `Option`.
21 + It owns no substitutions. makeover derives `surface-well` and every consumer
22 + reads it, so `Palette::well` is a required `Color32` rather than an `Option`.
25 23
26 24 It owns no colours and no sizes. `Palette` is handed in already resolved, and
27 25 every radius, margin and stroke width arrives in `FrameStyle`. That is why there
@@ -46,12 +44,8 @@
46 44
47 45 ## Status
48 46
49 - On crates.io at 0.1.0, published 2026-07-28 once three renderers had exercised
50 - the vocabulary, which was the sequencing gate: a description with one renderer
51 - is an API with extra steps.
52 -
53 - First consumer is audiofiles, the only Make Creative app that is egui and the
54 - only one with no CSS. Design lives in the wiki note `makeover-immediate`; the backlog
47 + On crates.io. First consumer is audiofiles, the only Make Creative app that is
48 + egui and the only one with no CSS. Design lives in the wiki note `makeover-immediate`; the backlog
55 49 is in GoingsOn under the project of the same name.
56 50
57 51 ## Licence
M src/lib.rs +87 -140
@@ -16,10 +16,9 @@
16 16 //! # What this crate does and does not own
17 17 //!
18 18 //! It owns the *expression*: two mitred polylines for a bevel and a `Frame`
19 - //! for a filled region. It owns no colours and no sizes, and no longer owns a
20 - //! substitution: it briefly supplied the page for a well, which was a stand-in
21 - //! for `surface-well` before makeover derived it, and every consumer reads the
22 - //! real token now. [`Palette`] is supplied by the caller,
19 + //! for a filled region. It owns no colours, no sizes and no substitutions:
20 + //! makeover derives `surface-well` and every consumer reads the real token.
21 + //! [`Palette`] is supplied by the caller,
23 22 //! already resolved, and every radius, margin and stroke width arrives in
24 23 //! [`FrameStyle`].
25 24 //!
@@ -34,45 +33,30 @@
34 33 //! every call site decides. [`makeover_layout::Depth::pressed`] is what keeps
35 34 //! the decision from being re-derived per widget.
36 35 //!
37 - //! # 0.11.0: the overlay becomes reachable
36 + //! # Overlays
38 37 //!
39 - //! 0.10.0 answered what overlaying means in immediate mode with
40 - //! [`Palette::cast`], and nothing could ask: the description had no
41 - //! `Depth::Overlay` until `makeover-layout` 0.14.0, so the answer sat beside a
42 - //! question that could not be posed. [`frame`] now hands the cast shadow to the
43 - //! `egui::Frame` for any depth whose fill is [`Fill::Overlay`], keyed off the
44 - //! fill rather than the variant.
38 + //! [`Palette::cast`] is what overlaying means in immediate mode. [`frame`] hands
39 + //! the cast shadow to the `egui::Frame` for any depth whose fill is
40 + //! [`Fill::Overlay`], keyed off the fill rather than the variant.
45 41 //!
46 - //! The same release brings `makeover_layout::CellPart`, which 0.11.0 carried
47 - //! and did not draw. [`table`] draws it, below.
42 + //! # The table
48 43 //!
49 - //! # 0.12.0: the table
44 + //! [`table`] draws `makeover_layout::CellPart`. Two things it forces, both named
45 + //! where they land:
50 46 //!
51 - //! [`table`] is the vocabulary 0.11.0 took without using. The consumer is
52 - //! audiofiles, whose file list is the only table in the tree exercising all four
53 - //! of what the description says about one at once: sortable headings with
54 - //! carets, fixed and remainder tracks, and buttons inside cells.
55 - //!
56 - //! Two things it forces, both named where they land:
57 - //!
58 - //! - **`egui_extras`**, this crate's first dependency past egui. egui has no
47 + //! - **`egui_extras`**, this crate's one dependency past egui. egui has no
59 48 //! table, and `Grid` gives no per-column sizing, no sticky header and no
60 - //! scroll sync, which is why audiofiles reached for `egui_extras` rather than
61 - //! building on `Grid`. A third answer here would reimplement that crate worse.
62 - //! - **[`Palette::action`]**, on the footing [`Palette::content`] arrived on: a
63 - //! link in a cell is the first thing here needing the action intent.
49 + //! scroll sync. A third answer here would reimplement that crate worse.
50 + //! - **[`Palette::action`]**, on the footing [`Palette::content`] sits on: a
51 + //! link in a cell needs the action intent.
64 52 //!
65 53 //! Narrowing works differently from the terminal's and the module header says
66 54 //! why: a content column cannot be measured before the app's closure has drawn
67 55 //! it, so `egui_extras` sizes it and the declared floor budgets it.
68 56 //!
69 - //! # 0.13.0: what the adoption found missing
70 - //!
71 - //! 0.12.0 shipped [`table`] before audiofiles had taken it, and taking it found
72 - //! three things the file list already did that the function could not say. All
73 - //! three are host idiom rather than description, which is why they land here and
74 - //! not in `makeover-layout`, and all three are answered on a handle the app
75 - //! never sees: the `egui_extras` row and builder this crate owns. That is
57 + //! Three things are host idiom rather than description, which is why they land
58 + //! here and not in `makeover-layout`, and all three are answered on a handle the
59 + //! app never sees: the `egui_extras` row and builder this crate owns. That is
76 60 //! [`table::cell`]'s reasoning again: what the app cannot reach, the renderer
77 61 //! owes it.
78 62 //!
@@ -82,42 +66,36 @@
82 66 //! - **Scrolling a row into view.** [`table::Body::scroll_to`], because
83 67 //! `scroll_to_row` is a method on the builder. A keyboard cursor that moves
84 68 //! off-screen and stays there is the bug this prevents.
85 - //! - **Dragging a divider.** [`table::TableStyle::resizable`], which passes the
86 - //! test `sticky_header` failed in 0.12.0: egui_extras offers two settings here
87 - //! and a renderer can honestly make either choice.
69 + //! - **Dragging a divider.** [`table::TableStyle::resizable`], which is a knob
70 + //! because egui_extras offers two settings here and a renderer can honestly
71 + //! make either choice.
88 72 //!
89 - //! A fourth was found and is not a knob. Cells are centred on the row's centre
90 - //! line, always, because there is no second honest answer and egui's own default
91 - //! (top-aligned) is the one thing it cannot be.
73 + //! Cells are centred on the row's centre line, always, because there is no
74 + //! second honest answer and egui's own default (top-aligned) is the one thing it
75 + //! cannot be. That is not a knob.
92 76 //!
93 77 //! [`table::Body`] is also what splits a table's per-frame facts from its
94 78 //! description and from its style. A row count, a selection and a scroll request
95 79 //! are none of them style, and none of them survive the frame.
96 80 //!
97 - //! # 0.18.0: the nodes that were not fields, tables or frames
81 + //! # The nodes that are not fields, tables or frames
98 82 //!
99 - //! [`widget`] draws a meter, a token, a control and a figure. `makeover-tui` has
100 - //! had all four for releases and this crate had none of them, which stayed
101 - //! invisible while the only consumer was an app calling [`field`] and [`table`]
102 - //! directly. It stopped being invisible the moment anything tried to draw a
103 - //! whole `quasi_router::Screen` in egui: the four are ordinary nodes, so a
104 - //! screen walk would have had to draw them itself, one copy per consumer.
105 - //!
106 - //! [`Palette`] grows the three status intents with it. They arrive together
107 - //! rather than one per widget for the reason [`Palette::fill`] is an `Option`:
108 - //! `Tone` is five members wide, and a resolver missing one has to invent a
109 - //! colour, which is the substitution 0.2.0 spent a release removing.
83 + //! [`widget`] draws a meter, a token, a control and a figure. The four are
84 + //! ordinary nodes, so without them a screen walk has to draw them itself, one
85 + //! copy per consumer.
110 86 //!
87 + //! [`Palette`] carries the three status intents together rather than one per
88 + //! widget, for the reason [`Palette::fill`] is an `Option`: `Tone` is five
89 + //! members wide, and a resolver missing one has to invent a colour, which is a
90 + //! substitution this crate does not make.
111 91 //! # Forms
112 92 //!
113 - //! 0.5.0 adds the field vocabulary on top of the depth vocabulary:
93 + //! The field vocabulary sits on top of the depth vocabulary:
114 94 //! [`makeover_layout::Field`] rendered to egui widgets, in [`field`], and a set
115 - //! of them laid down a column in [`group`]. Before it, a description saying
116 - //! "text field, labelled, required, with this hint" had no way to become a
117 - //! widget here, and audiofiles' forms stayed hand-rolled.
95 + //! of them laid down a column in [`group`].
118 96 //!
119 - //! `makeover-webview` got there first and its form emitter is the precedent
120 - //! followed rather than re-derived, including the parts that are bug fixes: a
97 + //! `makeover-webview`'s form emitter is the precedent, followed rather than
98 + //! re-derived, including the parts that are bug fixes: a
121 99 //! select handed a value none of its options carries keeps that value visible
122 100 //! instead of silently reading as the first option, which is a save-the-wrong-
123 101 //! thing bug goingson hit for real.
@@ -135,9 +113,8 @@
135 113 //! **focus** and the **focus ring** are this renderer's three answers and
136 114 //! egui already has all three: its own id stack decides what is reachable,
137 115 //! its own state decides what holds the keyboard, and it paints exactly one
138 - //! ring. A description states none of them — `makeover_layout` removed the
139 - //! member that used to try in 0.19.0 — and drawing a second ring on top of
140 - //! egui's would break the one-ring rule it would have come from. The terms
116 + //! ring. A description states none of them, and drawing a second ring on top
117 + //! of egui's would break the one-ring rule. The terms
141 118 //! are defined once in `makeover_layout`'s crate header, "Reach, focus and
142 119 //! the focus ring". [`makeover_layout::State::Disabled`] *is* drawn, because
143 120 //! egui has no opinion about it until told.
@@ -154,10 +131,10 @@
154 131 //! looks for it, and because the silent version reads as "egui does not need
155 132 //! a palette" rather than "nobody has built the renderer yet".
156 133
157 - //! # 0.33.0: an interval is a sixth control shape
134 + //! # An interval is a sixth control shape
158 135 //!
159 - //! `makeover-layout` 0.34.0's [`FieldKind::Interval`], drawn as `Control::Spanned`:
160 - //! two drag boxes on one row with the word `to` between them.
136 + //! [`FieldKind::Interval`] is drawn as `Control::Spanned`: two drag boxes on one
137 + //! row with the word `to` between them.
161 138 //!
162 139 //! - **Dragged rather than typed**, because that is what these controls already
163 140 //! were. audiofiles' six filter axes are `DragValue` pairs sharing an extent,
@@ -169,7 +146,7 @@
169 146 //! - **An empty end reads as the bound it stands for.** An unset minimum sits
170 147 //! on the low edge and stores no filter, which is what the shipped control
171 148 //! did; egui's `DragValue` has no empty state, and a text box in its place
172 - //! would be the regression above. With no extent to fall back on it reads
149 + //! would cost the app a control. With no extent to fall back on it reads
173 150 //! zero -- the one number this renderer invents, invented where the
174 151 //! description declined to say anything.
175 152 //! - **The word rather than a dash**, which on a signed axis is a minus sign.
@@ -179,56 +156,49 @@
179 156 //! reading `min`, `max`, `step` and `unit` once is what stops the two ends
180 157 //! drifting apart.
181 158 //!
182 - //! # 0.32.0: a number draws its unit
159 + //! # A number draws its unit
183 160 //!
184 - //! `makeover-layout` 0.33.0's [`Field::unit`], and this host is the one the
185 - //! member was argued from: egui's `Slider` already draws a suffix beside its
186 - //! readout, which is where these controls put the unit before they were
187 - //! described and is somewhere a label cannot reach.
161 + //! [`Field::unit`], and this host is the one with somewhere better than the
162 + //! label to put it: egui's `Slider` draws a suffix beside its readout.
188 163 //!
189 164 //! So a slider takes it as a suffix, inside the control. A typed number has no
190 165 //! readout of its own and takes it as a muted label after the box. Every other
191 166 //! kind ignores it, and the description says which those are --
192 167 //! `FieldKind::measurable`, rather than a `matches!` kept here.
193 168 //!
194 - //! # 0.31.0: the slider's track is a curve
169 + //! # The slider's track is a curve
195 170 //!
196 - //! `makeover-layout` 0.32.0 says what a slider is: a fraction and a function
171 + //! `makeover-layout` says what a slider is: a fraction and a function
197 172 //! taking numbers to numbers, with `min` and `max` being `f(0)` and `f(1)`
198 173 //! rather than the control's extent. This host has the easiest job of the
199 174 //! three, because egui already has the control -- `Slider::logarithmic` is a
200 175 //! constant-ratio track, so the mapping is a builder call rather than an
201 176 //! arithmetic of its own.
202 177 //!
203 - //! Two things worth knowing. The granularity moved onto the curve, so a range
204 - //! reads `Field::curve.step()` and every other kind still reads `Field::step`;
205 - //! the step is in the value's own units under either curve, so the display
206 - //! precision is derived exactly as before. And the fallback for a ratio curve
178 + //! Two things worth knowing. The granularity rides on the curve, so a range
179 + //! reads `Field::curve.step()` and every other kind reads `Field::step`; the
180 + //! step is in the value's own units under either curve, so the display
181 + //! precision derives from it directly. And the fallback for a ratio curve
207 182 //! across zero is asked of `Curve::is_ratio` rather than matched on the
208 183 //! variant, so this renderer and a terminal cannot disagree about when a
209 184 //! logarithmic request is honoured.
210 185 //!
211 - //! # 0.28.0: the slider, the unanswered chooser, and the option that is not
212 - //! offered yet
186 + //! # The slider, the unanswered chooser, and the option that is not offered
187 + //! yet
213 188 //!
214 - //! Three things `makeover-layout` 0.28.0 lets a description say, all three
215 - //! found by audiofiles' forms port hitting a wall it could not describe its way
216 - //! past.
189 + //! Three things a description can say here.
217 190 //!
218 - //! - **[`FieldKind::Range`] is a fifth control shape**, `Control::Slid`, and
219 - //! the first one added since 0.5.0. egui has `Slider` and this crate had no
220 - //! way to be asked for one, so four sliders in the only consuming app stayed
221 - //! hand-rolled against a vocabulary that could not name them. A range missing
222 - //! an end falls back to a well rather than to invented bounds, which is what
191 + //! - **[`FieldKind::Range`] is a fifth control shape**, `Control::Slid`, drawn
192 + //! with egui's `Slider`. A range missing an end falls back to a well rather
193 + //! than to invented bounds, which is what
223 194 //! `makeover_layout::Field::bounded` is for.
224 - //! - **`Field::placeholder` finally reads on a chooser.** It was sayable and
225 - //! this renderer ignored it, so a select with nothing chosen showed an empty
226 - //! box. Nothing new is described; the renderer caught up.
195 + //! - **`Field::placeholder` reads on a chooser**, so a select with nothing
196 + //! chosen does not show an empty box.
227 197 //! - **`Choice::unavailable` is drawn rather than dropped.** The option stays
228 198 //! in the list, inert, with its precondition beside it instead of behind a
229 199 //! hover — a greyed row with no reason reads as a dead end, which is the
230 200 //! whole finding.
231 - //! - **`Choice::detail` (makeover-layout 0.39.0) is drawn under the option in a
201 + //! - **`Choice::detail` is drawn under the option in a
232 202 //! radio group and inside the row in a combo.** A closed chooser hides its
233 203 //! list, so everything an option carries has to travel with its row; a group
234 204 //! has a line to spare and putting a sentence beside the control instead
@@ -270,11 +240,10 @@
270 240 pub overlay: Color32,
271 241 /// `surface-well`.
272 242 ///
273 - /// Required, not optional. makeover derives it for every theme from 2.3.0,
274 - /// so a resolved palette without a well is not a thing that exists here.
275 - /// It was an `Option` while that was untrue, and this renderer substituted
276 - /// the page; `makeover-tui` keeps its own `Option` for a different reason,
277 - /// since a terminal can have the colour and still be unable to show it.
243 + /// Required, not optional. makeover derives it for every theme, so a
244 + /// resolved palette without a well is not a thing that exists here.
245 + /// `makeover-tui` keeps its own `Option` for a different reason, since a
246 + /// terminal can have the colour and still be unable to show it.
278 247 pub well: Color32,
279 248 /// `surface-sunken`.
280 249 ///
@@ -308,17 +277,13 @@
308 277 pub elevation: Color32,
309 278 /// `content`.
310 279 ///
311 - /// Ordinary text. Added 0.5.0 with the field renderer, which is the first
312 - /// thing here that draws any: until then this crate painted surfaces and
313 - /// edges and let the caller's own egui visuals answer for text.
280 + /// Ordinary text.
314 281 pub content: Color32,
315 282 /// `content-secondary`.
316 283 ///
317 284 /// Inactive but usable: it still answers a press. The middle tone of the
318 285 /// three (wiki `three-tone-convention`), and the one an unchosen option in
319 - /// a choice field takes. Added 0.26.0 for that widget, which drew every
320 - /// option at full `content` and so said nothing about which one was
321 - /// chosen beyond the dot egui paints.
286 + /// a choice field takes.
322 287 ///
323 288 /// Not [`content_muted`](Self::content_muted), which carries a claim:
324 289 /// `State::Disabled` resolves to it, so a live control wearing it tells the
@@ -338,15 +303,11 @@
338 303 pub content_muted: Color32,
339 304 /// `action-primary`.
340 305 ///
341 - /// What a control is drawn in. Added 0.12.0 with the table renderer, for the
342 - /// reason `content` was added 0.5.0 with the field renderer: a link in a
343 - /// cell is the first thing here that needs the action intent, and a palette
344 - /// should carry what is used.
306 + /// What a control is drawn in.
345 307 ///
346 308 /// This is the intent [`CellPart`](makeover_layout::CellPart) exists to
347 - /// separate. A cell holding a control took the cell's text colour until the
348 - /// description could say otherwise, which is the drift `makeover-layout`
349 - /// 0.14.0 named and `makeover-webview` 0.25.0 fixed on its own side.
309 + /// separate. A cell holding a control that takes the cell's text colour is
310 + /// the drift `CellPart` names.
350 311 pub action: Color32,
351 312 /// `danger`.
352 313 ///
@@ -354,11 +315,9 @@
354 315 pub danger: Color32,
355 316 /// `success`.
356 317 ///
357 - /// Added 0.18.0 with [`widget`], which is the first thing here that draws a
358 - /// [`Tone`]. The three status intents arrive together and not one at a
359 - /// time: [`Tone`] is five members wide and a resolver missing one has to
360 - /// invent a colour for it, which is the substitution this crate spent
361 - /// 0.2.0 removing from [`Palette::fill`].
318 + /// The three status intents arrive together and not one at a time:
319 + /// [`Tone`] is five members wide and a resolver missing one has to invent
320 + /// a colour for it, which is the substitution [`Palette::fill`] refuses.
362 321 pub success: Color32,
363 322 /// `warning`.
364 323 pub warning: Color32,
@@ -369,16 +328,12 @@
369 328 impl Palette {
370 329 /// Resolve a surface intent, or `None` for one this renderer does not know.
371 330 ///
372 - /// A plain lookup. There is still no substitution: the old one existed only
373 - /// while `surface-well` was underived, and every consumer reads the real
374 - /// token now.
331 + /// A plain lookup, and no substitution.
375 332 ///
376 - /// `Option` since 0.3.0, because [`Fill`] became `#[non_exhaustive]` in
377 - /// `makeover-layout` 0.4.0 and a total function over an open enum can only
378 - /// stay total by inventing a colour for a member it has never heard of.
379 - /// That is the substitution this crate spent 0.2.0 removing, so the return
380 - /// type moved instead. Every member the description has today is answered
381 - /// with `Some`.
333 + /// `Option`, because [`Fill`] is `#[non_exhaustive]` and a total function
334 + /// over an open enum can only stay total by inventing a colour for a member
335 + /// it has never heard of. Every member the description has today is
336 + /// answered with `Some`.
382 337 #[must_use]
383 338 pub const fn fill(&self, fill: Fill) -> Option<Color32> {
384 339 match fill {
@@ -626,8 +581,6 @@
626 581 ///
627 582 /// Either end may be empty while the other stands. An open end is an
628 583 /// answer -- "over 120 BPM" -- rather than a half-filled box.
629 - ///
630 - /// Added 0.33.0 with makeover-layout 0.34.0.
631 584 Between {
632 585 /// The lower end's buffer.
633 586 lower: &'a mut String,
@@ -684,8 +637,6 @@
684 637 /// come from members [`Field::options`] does not have, so a shared arm
685 638 /// would be a `matches!` on the kind inside the loop rather than one arm
686 639 /// less.
687 - ///
688 - /// Added with makeover-layout 0.38.0's [`FieldKind::Theme`].
689 640 Themed,
690 641 /// Two values dragged across one axis, drawn as one question.
691 642 ///
@@ -702,23 +653,20 @@
702 653 /// description since this renderer was built degrades to a text box, which
703 654 /// accepts any value the others would, rather than to nothing drawn at all.
704 655 ///
705 - /// `FieldKind::File` lands there as of makeover-layout 0.11.0, and it is left
706 - /// there rather than grown a shape of its own. egui's honest answer is a button
707 - /// that opens a native picker, which is a fifth control and a file-dialog
708 - /// dependency; no consumer of this crate asks for a file field yet. Same
709 - /// position this crate took on `Meter` at 0.10.0: the membership test is that
710 - /// every renderer *could* answer honestly, not that each one does on the day.
711 - /// A path in a text box is not nothing, and it is what an app that needs this
712 - /// tomorrow gets today.
656 + /// `FieldKind::File` lands there rather than growing a shape of its own. egui's
657 + /// honest answer is a button that opens a native picker, which is a fifth
658 + /// control and a file-dialog dependency, and no consumer of this crate asks for
659 + /// a file field. The membership test is that every renderer *could* answer
660 + /// honestly, not that each one does on the day. A path in a text box is not
661 + /// nothing.
713 662 ///
714 - /// makeover-layout 0.31.0 added `Field::accept` and `Field::multiple`, and this
715 - /// position is what they land on: both are the picker's arguments, and this
663 + /// `Field::accept` and `Field::multiple` land on the same position: both are the picker's arguments, and this
716 664 /// renderer has no picker to give them to. They are not lost — the description
717 665 /// still carries them, and the day the native dialog arrives here it is opened
718 666 /// with them rather than with a filter written twice.
719 667 ///
720 - /// `FieldKind::Date` and `FieldKind::DateTime` land there too, as of
721 - /// makeover-layout 0.15.0, on the same footing and with one thing owed. A
668 + /// `FieldKind::Date` and `FieldKind::DateTime` land there too, on the same
669 + /// footing and with one thing owed. A
722 670 /// calendar is a sixth control and bare `egui` has none, so a typed value is
723 671 /// the honest answer here; what the app gets is the format the description
724 672 /// names, `makeover_layout::DATE_FORMAT` and `DATETIME_FORMAT`, which is why
@@ -726,7 +674,7 @@
726 674 /// of this crate and asks for neither today. A calendar popup is the upgrade
727 675 /// whenever one does.
728 676 ///
729 - /// `Field::as_instant` (makeover-layout 0.37.0) is carried and not honoured, on
677 + /// `Field::as_instant` is carried and not honoured, on
730 678 /// the same footing. It asks for the typed wall-clock value to be submitted as
731 679 /// the moment it names, and this renderer has no submission to convert on: it
732 680 /// draws the control and the app reads the value back, so the conversion would
@@ -753,8 +701,7 @@
753 701
754 702 /// How far an option's second line is inset, in points.
755 703 ///
756 - /// makeover-layout 0.39.0. The width of egui's radio button plus the gap after
757 - /// it, so the line starts under the label rather than under the control. A
704 + /// The width of egui's radio button plus the gap after it, so the line starts under the label rather than under the control. A
758 705 /// magnitude, which is `makeover-geometry`'s subject and not this crate's --
759 706 /// but this one is measured off a widget egui draws and sizes, so there is
760 707 /// nothing for a spacing scale to say about it.
M src/table.rs +10 -11
@@ -116,9 +116,9 @@
116 116 ///
117 117 /// Not every setting egui_extras has becomes a field here. A sticky heading
118 118 /// is what `TableBuilder::header` does and there is no version that does
119 - /// not, so the knob 0.12.0 briefly carried for it offered a choice this
120 - /// renderer cannot make. This one and [`resizable`](Self::resizable) are the
121 - /// two that pass that test.
119 + /// not, so a knob for it would offer a choice this renderer cannot make.
120 + /// This one and [`resizable`](Self::resizable) are the two that pass that
121 + /// test.
122 122 pub striped: bool,
123 123 /// Whether the user can drag the divider between two columns.
124 124 ///
@@ -407,10 +407,9 @@
407 407 /// is the emphasised thing; a column offering to reorder is inactive but usable,
408 408 /// because it answers a press; a column that is not a control at all is inert.
409 409 ///
410 - /// The middle one used to take `content_muted`, which is what
411 - /// [`State::Disabled`](makeover_layout::State::Disabled) resolves to, so a
412 - /// heading the user could press claimed it would not answer. The same lie the
413 - /// unchosen option in a choice field was telling before 0.26.0.
410 + /// The middle one may not take `content_muted`, which is what
411 + /// [`State::Disabled`](makeover_layout::State::Disabled) resolves to: a heading
412 + /// the user can press would be claiming it will not answer.
414 413 fn heading_color(column: &Column<'_>, palette: &Palette) -> egui::Color32 {
415 414 match (column.sorted, column.sortable) {
416 415 (Some(_), _) => palette.content,
@@ -698,10 +697,10 @@
698 697
699 698 #[test]
700 699 fn the_three_states_of_a_heading_are_three_tones() {
701 - // wiki `three-tone-convention`. The middle state used to take
702 - // content_muted, which is what `State::Disabled` resolves to, so a
703 - // heading the user could press claimed it would not answer. The arm
704 - // that keeps muted is the one where it is true.
700 + // wiki `three-tone-convention`. The middle state may not take
701 + // content_muted, which is what `State::Disabled` resolves to: a heading
702 + // the user can press would claim it will not answer. The arm that keeps
703 + // muted is the one where it is true.
705 704 let p = palette();
706 705 let cols = columns();
707 706 assert_eq!(heading_color(&cols[0], &p), p.content);