Repository navigation
Releases
v1.2.0
Clear all in the Island. Nothing is removed or changed in behaviour; the new texts, prop and close
reason are additive (see API).
Features
- With two or more notifications, the open Island ends its dots row with a Clear all button. The
first press arms it: it takes the error tint and readslabels.clearAllConfirm(count)("Clear 12"),
spoken once through a status. A second press within 3 seconds closes every notification with the
close reason'clear-button'and acknowledges the missed count in the same commit, so nothing is
left; focus returns to where it was before the Island. Waiting, leaving the button or collapsing the
Island disarms it, and one double click never counts as both presses. Likeclear(), it does not
cancel tracked operations. - Missed notifications now take a row of their own under the dots, which stay centred.
API
- New
ToasterpropclearAll(defaulttrue);falsehides the button. - New close reason
'clear-button'inCloseReason. Aswitchover every reason now needs it;
clear()keeps'clear'and still leaves the missed count toacknowledgeOverflow(). - New texts
labels.clearAllandlabels.clearAllConfirm. An object typed as the full
CloudletLabelsnow needs them; TypeScript points them out. - New
classNamespartclear(button.cloudlet-clear,data-armedafter the first press).
v1.1.2
The package's code, CSS and types are the same as in 1.1.0 and 1.1.1. The README on npm opens with
the cloud wordmark from cloudlet.dev.
Documentation
- The README starts with the Cloudlet wordmark written in clouds, linking to the website.
v1.1.1
The package's code, CSS and types are the same as in 1.1.0. This is the first release published from
GitHub Actions through npm Trusted Publishing, with a provenance attestation that links the archive
to its commit and workflow run.
Documentation
- The README on npm shows the version, first-load size, CI, types and license badges, lists the
Forms and Content Security Policy guides, and says how to contribute and how to report a
vulnerability privately.
v1.1.0
Forms in the Island and a badge that passes text contrast. Nothing is removed or changed in
behaviour; the new texts and type parameters are additive (see API).
Features
- Forms in the Island. A third primary action,
{ kind: 'form', label, fields, run, validate?, errorMessage? },
puts one to three text fields ('text'or'textarea') in the open Island beside a round send button.
On send Cloudlet checksrequired, thenmaxLength, then yourvalidate, shows messages under the
fields, and runsrun({ values })with command semantics: pending, close on success, a message and
another try on failure. TypeScript takesvalues' keys from the field names. Guide:
Forms. - Drafts. Typed text stays with its notification across collapsing, swiping and remounting. While a form
holds unsent text its time stands still (pause reason'draft'), a press outside does not collapse
the Island, an auto-opening notification waits in the stack, and the pill's name addslabels.draft.
NotificationSnapshot.draftreports it.
API
- New types
FormAction,FormField,FormFieldKind,FormInputMode,FormValues,FormContextand
FormValidation;PrimaryActionincludesFormAction.showandupdatetake the field names as a
type parameter, inferred from the call. - New texts:
labels.draft,messages.fieldRequiredandmessages.fieldTooLong. An object typed as the
fullCloudletLabelsorFallbackMessagesnow needs them; TypeScript points them out. - New CSS tokens
--cloudlet-field-background,--cloudlet-field-border,--cloudlet-placeholderand
classNamespartsform,field,field-error.
Fixes
- The badge's disc is a deeper red (
--cloudlet-badge#ff3b30→#d70015): its white number now
measures 5.38:1 instead of 3.55:1 and passes the 4.5:1 text contrast.
v1.0.0
The first stable release, published to npm as latest (npm install @cloudlet/toast). The API is the
one of 1.0.0-rc.3 plus one diagnostic code; it follows semantic versioning from here. After the release the
remaining manual checks passed on this version: VoiceOver on iOS, NVDA, TalkBack, physical phones,
Windows High Contrast and the minimum browser versions (the documentation's Accessibility page).
Performance
Toasterloads its renderer (host, motion, cards, gestures, announcer) as a separate chunk through
import(), once per page, on the client after mount. The JavaScript an app pays for at start drops
from 27953 to 8602 B min+gzip; the renderer chunk follows right after. Notifications shown meanwhile
wait in the controller. NoReact.lazyorSuspenseis needed in the app, and server rendering is
unchanged: Toaster renders nothing on the server.
API
- New diagnostic
renderer-load-error: the renderer chunk failed to load (offline, for example). The
notifications wait in the controller, and the next Toaster mount loads the chunk again.
Fixes
- The Island's background no longer counts as layout shift while it morphs at the bottom edge: it is
placed with a transform instead ofbottom: 0. Pixels are unchanged. - On a slow first frame, the queue aggregate ("2 notifications queued") was spoken alone before the
newest record's title. The announcer now waits until the pill is readable and speaks the title first
and the queue after it, as on fast devices.
shadcn item
- The wrapper takes a controller that may still be
null(ReactCloudletController | null), so an app
can render it before its client owner has created the controller.