# makeover-touch The adaptation layer of the make-family design system. `makeover` answers *what colour*. `makeover-geometry` answers *how much space*, and owns the two axes an adaptation is stated against: `Density` (pointer or touch) and `SizeClass` (compact, medium, expanded). `makeover-layout` answers *what the thing is*. This crate answers one question and no other: > Does this affordance exist here? Like `makeover-layout`, it emits nothing. It is a description, rendered to CSS by `makeover-webview` and to whatever the other renderers can express. ## Why it is a crate and not a density preset Measured across the MNW server's `@media` blocks (137) and goingson's `ui-mode-*` blocks (192), bucketed by what the declarations inside actually change: | bucket | MNW | GO | retired by | |---|---|---|---| | density | 32% | 27% | a `makeover-geometry` preset | | type | 23% | 15% | the type scale | | columns | 20% | 12% | `makeover_layout::Column` | | reflow | 16% | 17% | `makeover_layout::Arrangement` | | **show/hide** | **12%** | **12%** | **this crate** | | **reposition** | **6%** | **20%** | **this crate** | | **appearance** | **1%** | **17%** | **this crate** | The bottom three are the roughly 43% no spacing scale can retire. `display: none` on a keyboard hint says the affordance does not exist on touch. No amount of gap retuning expresses that, and a scale that tried would be putting a product claim on a measurement axis. ## What is here `Affordance`, six members, drawn from what the two measured apps already gate by hand: | member | reads | rule | |---|---|---| | `Hover` | density | pointer only | | `Hint` | density | pointer only | | `Ancillary` | size | expanded only | | `Detail` | size | medium and up | | `Anchored` | size | compact only | | `Overflow` | size | compact only | `Affordance::available(density, size)` is the whole crate in one call. A renderer asks per affordance and never branches on a width. `column_cutoff(size)` closes the one seam neither neighbour could: layout defines the priority ladder and `Column::kept_at`, geometry defines the boundaries, and nothing else says which cutoff a compact window uses. Answering it with `nth-child` on an ordinal means inserting a column silently hides the wrong one. ## The rules the tests hold **Density gates only what the contact patch touches.** Hovering, and the keyboard chrome documenting shortcuts a touch surface cannot send. Not how much screen there is: a phone is small *and* touch, a tablet is big *and* touch. Putting a screen-budget claim on the input device is the failure this crate exists to prevent. **Touch never gains an affordance pointer lacks.** Touch is derived from pointer by subtracting what a fingertip cannot do, so it loses members and never gains one. **Collapsing is allowed, inverting is not.** Borrowed from `makeover-geometry`, where two gap relationships both resolve to zero cells on a terminal and stay two members. `Hover` and `Hint` have identical rules today and are still two members, because the call site names what is gated rather than the rule. **Compact compensates rather than only losing.** `Anchored` and `Overflow` are available at the narrow end and not the wide one. An adaptation that only removes things describes a degraded layout, not a different one. ## What is not here, on purpose **Boundaries.** `makeover-geometry` quotes Material 3's window size classes at 600 and 840. This crate adds no third axis, no fourth class and no breakpoint of its own. **A navigation shell fork.** goingson carries two, concentrated in `.app-header`, `.tab`, `.tab-navigation`, `.pill-nav`, `.saved-views-sidebar` and `.modal-container`. That is not one shell adapting, it is two shells, and choosing to build two is a product decision the app owns. **Which class applies.** The app decides, from a measured width and from what it already knows about the input. This crate takes both as arguments and never sniffs. **What a renderer does when an affordance is unavailable.** Hiding it, substituting it or showing it anyway is renderer policy, the same class of decision `makeover-layout` deleted `Fill::fallback` for. ## Status Unpublished. The vocabulary is six members and the intent is to stop there: guessing at an eighth is how a description becomes a framework. Design lives in the wiki note `makeover-touch`; the backlog is in GoingsOn under the project of the same name. ## Licence MIT.