What we shipped on 2026-08-20
Shipped 41 items (20 code, 1 docs, 1 design, 19 release).
Code
test: fix stale Button inverse assertion and de-flake ActionFeedbackModal loading testButton's TokenFillsResolve pinned the inverse label to --color-surface-1;
feat(ChoiceGroup): add variant prop and rename ToggleGroup variant to containerVariantChoiceGroup gains a variant prop ('neutral' 'info' 'outline' 'outline-info',
refactor(Button): remove GlossyButtonBREAKING CHANGE: the GlossyButton component is removed along with its
feat(ChoiceGroup): extract ToggleGroup's spaced variant into its own componentNew ChoiceGroup component — a row (or column) of flat, independent
fix(HoldMenu): skip the useAnimatedReaction on-mount fireThe reaction runs once on mount with previous === null, which drove
refactor(Text): migrate remaining font-* classes to the weight propCompletes the weight-prop sweep: every consumer of Tailwind font-
fix(MorphingFAB): trigger size follows the IconButton lg size
feat(Button): add success, warning and info status-tone variants
refactor(theme): consolidate input fill/shadow tokens into surface-contrast and floating
feat(Text): add a weight prop that resolves per-weight font tokens
fix(Button): GlossyButton inverse renders the opposite theme's neutral, and the label ramp shares text-sm past md
feat(Holdable, FileSystem): haptic feedback on holds, and a scrub tick with a checkbox pulseHoldable and HoldDraggable gain an opt-in hapticFeedback prop, backed by a new lib/haptics twin ( expo-haptics on native, a no-op on web) so the native module never enters a web bundle; HoldMenu routes through the same module. The mobile views' inert holds pass hapticFeedback="Medium" , so the long-press into multi-select cues in the hand. Dragging to select fires a distinct Selection tick each time the finger crosses into a new entry, and the checkbox under the finger squeezes then springs back
fix(HoldMenu): no lingering copy when the twin travels, and inert holds releaseWhen the menu lifts the pair the travelling twin is opaque from its first frame, so the in-place item drops out on that same frame (duration 0) instead of leaving a copy under it; the cross-fade is reserved for the twin that stays put. An inert hold (empty items — the multi-select join) now scales back to full size on completion instead of staying stuck at the squeezed size.
feat(FileSystem): mobile scrub auto-scrolls and selects past the foldThe scrub's finger→entry resolver now returns a beyond hit when the finger drags past the top/bottom of the content, and the scrub session maps that to everything on the far side of the anchor (anchor excluded) instead of null . Both mobile views feed the shared edge-scroll engine their scrub pointer stream, so dragging to multi-select scrolls the grid/list, and the content mapping adds the scroll delta since calibration so a still finger keeps the same selection.
refactor(FileSystem): extract the shared edge-scroll engineThe rAF loop that scrolls a list when a pointer rides its top/bottom edge moves out of useFileSystemDragScroll into useFileSystemAutoScroll , exposing a begin/move/end lifecycle. The drag hook becomes a thin feed — lift, pointer moves, release — over the shared engine. No behaviour change; the mobile views' selection scrub will reuse the same engine next.
feat(HoldMenu): NestedScroll story — limited-height global scroll containerGive the outer scroll view a definite height instead of flex:1, so the
refactor(IconButton): narrow variants to neutral/elevated; MorphingFAB takes a variant prop
feat(IconButton): elevated variant + 48px lg size; MorphingFAB trigger is now an IconButton
test(Tabs): relax RTL edge threshold for the 4px segment gutterThe segment inset changed from 2px (p-0.5) to 4px (p-1) to match pill
fix: bottom-sheet exit, multi-step title, tabs inset, hold-menu twinBottomSheet: slow the close spring so the exit animation is visible
Docs
chore: auto-sync README
Design
fix(HoldMenu): nested-scroll panel placement — clamp the visual left and clamp travel to the root's visible extentThe centre-anchored pop-in transform composes to a net +itemWidth offset the
Release
Staging build #183
Staging build #182
Staging build #181
Staging build #180
Staging build #177
Staging build #176
Staging build #175
Staging build #174
rn-motion-ui@6.0.0076ebf9: Remove GlossyButton
rn-motion-ui@5.7.04b03b32: feat(Button): rename primary / secondary to neutral / inverse ; fix inverse fill
Storybook build #154
Storybook build #153
Storybook build #152
Storybook build #151
Storybook build #150
Storybook build #149
Storybook build #148
chore: version packages (#32)
chore: version packages (#31)
← All shipped days