v0.79.0
Added
-
ThemeSelector, for choosing light, dark or the device's own setting.
Three miniatures of a screen with the chosen one ringed — which costs three
times the space a row of words would, and buysSystem. That is the option
people hesitate over, and a picture of a screen split down the middle explains
it faster than a sentence does. Two drawings:windowis an app screen split
down the middle,carda framed card cut on the diagonal.It reads the live theme instead of keeping its own copy, so changing the theme
anywhere else moves the ring. That is also the only waySystemis reportable
at all: applied, it resolves to light or dark, and the result is
indistinguishable from the same choice made by hand.useThemeSelection
is the reading, public for a settings row that reports the choice without
offering it. -
ProgressButton.Done, the drawing a completed hold lands on. A tick by
default, over the finished fill rather than beside the label, so the button
does not change width at the moment it succeeds. One is added unless you write
your own. -
Panelside.ItemIcon,Panelside.ItemLabelandPanelside.ItemBadge—
the three slots a row already had, written out. For a row that needs a
different order, a label that is not a string, or something in a slot the prop
had no argument for.icon,labelandbadgestay and stay the right
answer for the ordinary row; the two forms compose. -
variantonMarkdownEditor.Toolbar.pillis a floating capsule:
icon-only buttons grouped by hairlines, with the way out of the writing pane
as a round button beside it.barremains the default. A button whose action
is already in effect where the caret is now draws as pressed — every one of
them is a toggle, and a toggle that looks the same in both states is a toggle
nobody discovers is one. -
An
imageaction and arefhandle onMarkdownEditor. The handle
carries the same transforms the toolbar runs, so a keyboard accessory or a
control of your own does not have to reimplement any of them. -
Return continues a list in
MarkdownEditor, at the same indent and
counting on through a numbered one; on an item with nothing in it, it ends the
list. Off withcontinueLists={false}.
Changed
-
ProgressButtonvariants rest on one surface. Three of the four were
outlines, which made them four different buttons before anything had happened
— and the one thing all of them do, wait to be held, was the thing the drawing
did not say. The variant's colour is carried by the label and by the fill. -
A lone
Marqueedraws its pause control below the content, in flow, the
way aMarquee.Groupalready did. Floating in the corner it was a 48pt target
on a strip of badges half that tall: clipped by the track's own edge, and
covering the content it exists to let you read. A marquee is now as tall as its
content plus its control. -
Mapsplits its children. Layers reach the renderer; controls, and any
chrome written at the call site, are drawn as a sibling above it where layout
still applies.Map'sonPressalso hands back the press in screen
coordinates beside the geographic one.
Fixed
-
Map.Controlsno longer blanks the map on Android. Every child was handed
to the native map view, which is a realFrameLayoutthere and lays its own
children out — so an ordinary view arrived with its computed frame thrown away,
stretched over the whole surface at the top-left. The corner a control group
asked for never applied, and the map it covered never showed. Reported by
@yashDahiwale. -
Map'sonPresshands back a coordinate. It read a field the renderer
has never emitted, so the argument was alwaysundefined. It type-checked
because the props are declared by hand and the declaration carried the same
wrong name. -
hasMapLibretells the truth in Expo Go. The package resolving is not the
question — a client built without the native views has the JavaScript and none
of them.Mapskipped the panel it draws for exactly this case and tried to
mount a view nothing had registered. -
ProgressButton's fill travels back instead of vanishing. The release was
never running: a shared value animated on the UI thread does not report back to
JavaScript, so the value read in the press handler was the one from before the
hold began, andcancelAnimationwrote that stale zero back across the thread.
Both directions are started on the thread that owns the value now, and every
path to empty — a hold let go, anautoResetlanding, a controlled reset —
goes through one rewind. -
ProgressButtonkeeps taking presses after a successful hold. The release
that followed one drained the fill, so the button looked untouched while it was
in fact complete — and a complete button refuses every press. Two more
alongside it: the effect meant to empty a controlled button's fill did the
opposite and firedonCompletetwice, and the prop spread sat below the press
handlers, so a caller passingonPressInreplaced the gesture the control is. -
Pausing a
Marqueefreezes it where it is.cancelAnimationalready froze
the offset exactly where it had reached, and the line after it overwrote that
with zero on every toggle. Resuming carries on from where it stopped. -
Four caret bugs in
MarkdownEditor. A line action handed back the whole
block selected, so the next keystroke replaced the list it had just made; an
inline marker wrapped across a line break, which is emphasis in no reader at
all; the code button read only the caret's own line, so pressing it inside a
fence wrapped that fence in a second one; and the forced selection after an
edit was released before it had arrived, leaving the caret at the end of the
document.
Docs
- Previews for ColorPicker and ProgressButton, recorded on a device.
- The Alpha mark comes off AI Input: two releases without the API moving.
- Three links in the prose pointed somewhere other than where the page lives,
two of them hard 404s — Drawer to Panelside, and AI Input to a Glass page that
has never existed. - An X link in the landing page's footer.
Migration
Nothing here breaks and no code has to change. Two things look different on their own, which is
why they are written down rather than left to be noticed.
-
Every existing
Marqueeis taller. Its pause control used to float in a corner of the
track; it is drawn below the content now, in flow, the way aMarquee.Group's always was. A
marquee is therefore as tall as its content plus a 48pt control, and a container given a fixed
height spends part of that height on it — a vertical one ath-40has about sixty points less
track than it did. PassshowPauseControl={false}where an equivalent visible control already
exists elsewhere, and the old height comes back with it. -
Every
ProgressButtonvariant is drawn on the same surface.primary,destructiveand
successwere outlines and are now solid secondary grounds with the variant's colour in the
label. Nothing to change; the fill is unaffected, and a button that was distinguishable before
still is.
Fixed by report
- #201:
Map'sonPressandMap.Controlson Android, reported by
@yashDahiwale.
Reported by @yashDahiwale — #201.