v0.4.7
Astryx 0.4.7 — all @astryxdesign/* packages ship at this version.
npx astryx upgrade --apply@astryxdesign/core
Fixes
-
BottomSheet: a non-modal sheet now colours the iOS 26 Safari toolbar strip with its own surface instead of letting the page show through behind the address bar (#5342).
-
BottomSheet: a tap inside the sheet is a tap, and the sheet leaves on an exit curve (#5326).
Two defects, both of which read as "the sheet closes with no animation" — reported against the touch DateInput picker, which is a Bottom Sheet.A tap inside the sheet started a one-pixel drag. The sheet body carries the pull-to-dismiss handlers, and they promoted to a sheet drag on any downward movement. A finger is never still, so the pixel or two a tap drifts began a drag — and a live drag suppresses the panel's transition, correctly, because a dragged sheet must track the finger rather than lag it. The close that the tap triggered landed inside that window, so the sheet jumped to its closed position with no transition. Tapping the picker's Save button hit this every time; tapping the scrim never did, because the scrim is the dialog itself and arms no gesture. Promotion now needs 8px of travel — the conventional tap slop, well under what a deliberate pull covers in its first frames — in both the pointer and touch paths. The gesture's transition suppression is also scoped to a sheet that is open, so it cannot straddle an exit.
The exit ran on the entrance's curve.
--ease-standardiscubic-bezier(0.24, 1, 0.4, 1), a decelerate curve: it spends its speed immediately and coasts. Right for an entrance, wrong for an exit. Measured on device (iPhone, real Safari), a scrim tap put the sheet half off-screen in 59ms of the 410ms transition and 90% off in 163ms, with the dim gone before it — so the close was over before the eye could follow it. The closing state now carries an accelerating curve of its own,cubic-bezier(0.3, 0, 0.6, 0.6): away from rest, gathering speed, quickest as it leaves the screen, and moving within ~50ms so it reads as one departure rather than a hesitation and a snap. Only the curve changes — the exit keeps--duration-medium, the entrance's band, which is what keeps it legible under a theme that scales the motion scale down (neutral's medium is 300ms against the base 410ms).The scrim leaves with the sheet: while closing, the dim runs
linearrather than the decelerate token. A fade covers no distance, so front-loading its progress just ends it early — the reasoning the touch date picker's surface swap already carries.BottomSheetSwitchergets the same treatment when its flow closes; a handoff between two sheets is not a close and is unchanged. -
useListFocusno longer swallows Escape when noonEscapewas supplied. The hook calledpreventDefault()on every Escape — a habit inherited from the arrow keys, which share the handler and need it to suppress page scroll — so a list with nothing to dismiss still marked the key handled, and a surrounding layer that defers todefaultPrevented(a focus trap, a native popover) never got its turn. Escape is now consumed only when anonEscapeis passed. Arrow, Home and End handling is unchanged (#5346).
Behaviour change:AvatarGroup,ButtonGroup,Outline,Pagination,SegmentedControl,TabListandToolbarpass noonEscape, so an Escape pressed inside one of them now reaches the surrounding layer and can dismiss it — the point of the fix, but a host that counted on the key stopping there will notice.NavHeadingMenudoes the same when it renders without a menu close handler. Menus and flyouts that do passonEscapeare unaffected.patch, not[breaking]: the swallowing was never a contract — the hook documented Escape only as "custom callback", and no component advertised consuming the key. -
TabList: the selected tab now carries
aria-current="true"— ARIA's generic "current item within a set" — instead ofaria-current="page". The strip is a<nav>and stays one, but it is used to switch views in place at least as often as it is used to navigate, and on those usespageasserted a page change that never happened. Assistive tech announced the selected tab as the current page even when nothing had navigated; it now announces it as the current item, which is true either way. A tab given anhrefstill renders an anchor and still reads as a link — its current marker is just less specific than it was. No role changes and no new props. (#5347)
Contributors
Thanks to everyone who contributed to this release:
Full Changelog: v0.4.6...v0.4.7