Phase 9d · Tier B (final)

RN-universal Resizable pilot — closes Tier B 10/10

Scaffolded

Two-panel resizable layout with draggable divider. PanResponder-driven (same as RnSlider). With this primitive, every Tier B PR shipped with zero new runtime dependencies.

Horizontal — sidebar + main

Drag the divider left or right. The first panel constrained to 20–60 % width.

Sidebar
Main content

Vertical — header + body

Drag the divider up or down.

Header
Body

Library decision

Per Phase 9 Q2, every Tier B primitive must record its library choice. RnResizable ships with no new runtime dependency.

  • react-resizable-panels (~3 M/wk, MIT) — shadcn's choice; web-only. Same .web/.native blocker as cmdk / sonner / react-day-picker.
  • react-native-reanimated@4.3.0 (~3.96 M/wk, MIT) — 9a inventory's recommendation. Rejected for the same reason as RnSlider (uses PanResponder) and RnCarousel (uses pagingEnabled): we've consistently avoided pulling reanimated for primitives where the RN-core gesture API suffices.
  • This implementation — pure RN core. View + PanResponder drag tracking + flex-based layout. ~250 LOC.

Phase 9d Tier B — complete

With this primitive, all 10 Tier B primitives are shipped:

#PrimitiveVersionLibrary decision
1RnCommand0.2.3cmdk rejected (web-only)
2RnCombobox0.2.4composes RnPopover + RnCommand
3RnToaster0.2.5sonner / RNTM / burnt rejected
4RnInputOTP0.2.6input-otp / RNCCF rejected
5RnPhoneInput0.3.1libphonenumber-js rejected (140 KB)
6RnFileUpload0.3.2expo-document-picker rejected (peer dep)
7RnCalendar0.3.3react-day-picker / RN-calendars rejected
8RnCarousel0.3.4embla / RN-reanimated-carousel rejected
9RnChart0.3.5recharts / victory-native rejected
10RnResizable0.3.6react-resizable-panels / reanimated rejected

Zero new runtime dependencies across the entire phase. Phase 9 next steps: Phase 9e (Tier C pattern compositions), then Phase 10 (sunset @radix-ui/* from the web bundle).