Repository navigation
Releases
0.4.0
Reads document contract 9.33.0 (theme 4.0.1, icon set 1.0.0) and placement map 1.1.0. Folds in the entries that were prepared as 0.5.0 to 0.7.2 and never published (the last release is 0.3.0).
-
Placement schedule (placement contract 1.1.0). A place may carry promotions with a
from
and anuntil(UTC,untilexcluded) that replace its permanent content for their window; an
item without a document is a pause and the place is empty. The reader resolves the schedule by
the device clock, sets a timer for the next edge, and resolves again when the app returns to
the foreground; the map is not asked again on an edge. New:HotlayoutPlacementMap.resolve(_:at:)
andnextBoundary(_:after:), and aclock:parameter onHotlayoutPlacement.loadand
HotlayoutPlacementView. A broken item is skipped whole and spoils nothing else. -
A place with a schedule shows its promotion on time and with no network. After the first
reading the documents of every window of the place are read in the background and kept (up to 64;
a failed read keeps the last copy, a 404 removes it), so an edge of the schedule, or a return to the
foreground while offline, no longer blanks the place for want of a document that was never read. -
A carousel with
stopPathstays on the stop a person swiped to. From the second swipe on, the
row went back to the stop before about half a second after it settled. The change of the value
was handed to the carousel from the draw before the change, so each write was followed as a change
of the previous value; the carousel now takes the new value the change carries. -
A node that fades out leaves the layout when its fade ends. It could stay for good, nearly
transparent and holding its place, when the last frame of its timeline was not drawn; each
boundary of a phase now draws the node again on a timer of its own. -
A node that fades and is out of the layout takes no gap. A hidden row of a list whose template
fades, and a hidden child of a column, left an empty space of one gap: they were drawn as an empty
view, which the column counted. Out of the layout they now draw no view at all. -
The demo's contract samples carry
account.cardIndex(dictionary 1.8.0), so the carousel fixtures
open with the content of their first card. -
A carousel that follows its stop value no longer stops short when the value changes twice in
a row. While the reader was still scrolling smoothly to the first target, a second value was
compared with the stop the scroll was passing and taken for "already there". The follow now
starts from the target of the reader's own last scroll until that scroll settles, or until a
person moves the row. -
A node of a list template that fades does so apart from the other rows. An instance whose
condition stops holding stays in the list while it fades out (it used to leave at once), and the
rows of a list are keyed by their record, so a row that leaves does not hand its state to the next. -
Fading nodes in a stack and in a grid. A layer of a
Stackand a cell of aGrid(or of a list
withcolumns) that namesvisibilityTransition: 'fade'fades like a child of a column: a grid no
longer drops it from its cells the moment its condition stops holding, and while it is out of the
layout the cell takes no place, so the other cells close up without a hole. The layer that gives
a stack its size is still counted by the document. -
A node fades in and out when its condition changes. A node with
visibilityTransition: 'fade'
and avisibleIfno longer appears and disappears at once. When the condition stops holding on
a shown screen, the node keeps its place and fades out for 120 ms, then leaves the layout. When it
starts to hold, the node waits 120 ms out of the layout, then enters it transparent and fades in
for 160 ms, so two neighbours with opposite conditions are never in the layout together and the
layout changes once. A change during a transition goes to the new goal from the current opacity,
the time scaled by the distance; a node still waiting stays hidden. The times and the curves come
from the contract. A node that fades out catches no press and is not heard by VoiceOver from the
first moment; one that fades in is a control from the moment it enters the layout.
Nothing fades on the first show of a screen, when the language or the width class changes, or
under Reduce Motion: the node goes to its new state at once. The app
bar of the screen, a pinned node (pinof any value), a navigation bar and its items follow
their condition at once, and so do the tabs and the parts of a composed text. Every row of the shared tables runs in the tests. -
A carousel tells its active stop. A carousel (a scrolling
Rowor aRepeaterin a row) may
name a number data path incarousel.stopPath. When a person swipes it and the scroll settles on
a stop, the reader writes the number of that stop, counted from 0 (stops, not cards), the way an
input field writes: into the session of the screen and to the host at the same moment, under
writablePaths;onActionis not called. Nothing is written during the gesture, for a move the
reader made itself (the show, following the value), or for the number the path already holds.
When the carousel is shown it stands on the stop the value names, without animation (a number
past the last stop is the last one, anything that is not a whole number is the first); when the
number the value names changes, it scrolls there (not while a finger holds the row, without
animation under Reduce Motion). A write the host refused leaves the carousel where the person
put it. A path of a wrong shape counts as no path. The scroll counts as settled after a quiet
time of 150 ms. A gesture the system cancels counts as a finger lifted. Every row of the shared table runs in the tests. -
Bottom safe inset of a modal sheet. A sheet reaches the physical bottom of the area, and the
home indicator no longer covers its last node: the reader adds the bottom safe inset of the
window inside the box of the sheet, under its content. The background and the radius of the
sheet extend under the inset; the sheet is as tall as its content plus the inset, no taller than
the area, and a taller body scrolls above the inset. The inset is added once: with a shown
pinned block it lies under the content of that zone, otherwise under the content of the root.
A window in the centre and a sheet shown as a window in a wide place get none, and a host that
accounted for the inset itself and gives zero gets zero. A value that is not a number, not
finite or negative counts as zero. Every row of the shared table runs in the tests. -
Write on a long press. A long press may carry
setValueortoggleValue, as long as the
press of the node does not write. It runs like the action of a node that writes: the same
session andonWriteunderwritablePaths, the same "a value already held is not written
again", and the haptic request and the analytics event go before the write. The keyboard
(Shift+F10) and the named action of a screen reader do the same. Onlyactiongives a node its
role, so such a node stays a plain button, not an option or a switch. Before, a write action on
a long press was ignored. -
Node
name. The optional name a node carries for the editor's tree is not drawn, not part
of any accessible name, and not passed to actions, events or reports; a document with it draws
exactly as without it.