OTFotf

Patterns

48 high-level UX patterns — bottom sheets, onboarding, paywalls, chips, search bars, and more.

Patterns are finished UX flows or UI shapes. They're the largest pieces in @otfdashkit/ui-native — where you'd otherwise pull in five hooks and a third-party library and tune for two days.

Sheets + dialogs

PatternWhat it is
BottomSheetBottom-anchored sheet with snap points, drag-to-close, backdrop dim
ActionSheetiOS-style bottom action picker — title + description + ordered actions + cancel
ConfirmDialogModal confirmation with destructive variant
OtfDialogCentered dialog (overrides Tamagui's default styling with kit tokens)
OtfPopoverAnchored popover with auto-positioning
OtfSelectNative select bottom-sheet — long list, search, single/multi
NotificationBannerIn-app toast banner, dismiss-on-swipe
<BottomSheet
  open={open}
  onOpenChange={setOpen}
  snapPoints={['33%', '66%']}
>
  <H2>Choose a workout</H2>
  <List>...</List>
</BottomSheet>

Tabs + bars

PatternWhat it is
ChipsTabBarTop-of-screen filter chips that act as tab nav
TabBarBottom tab bar — 5 tabs, icon + label, active accent, hairline top border
SearchBarSearch input with clear button + cancel transition
AppHeaderTop header that pairs with useCollapsibleHeader for shrink-on-scroll
FloatingActionButtonBottom-right FAB — fitness-kit's theme switcher uses this

Onboarding + auth

PatternWhat it is
OnboardingCarouselFull-screen swipeable intro with dot indicators
MultiStepWizard orchestrator wrapping StepPageLayout + ProgressSteps
ProgressStepsTop dot/bar indicator for wizards
LoginScreenPre-built sign-in page (email + password + OAuth + demo button) — drop-in for kits
OTPInputOne-time-passcode input row
PasswordInputPassword input with reveal-toggle eye icon

Lists + cards

PatternWhat it is
CarouselHorizontal swipeable cards (paginated)
CardScrollerHorizontal-scroll list of cards
EventCardCalendar-event card with date stripe + time + venue
MediaCardCover-image card with title overlay
ProductCardE-commerce card — image, name, price, rating
TestimonialCardQuote + author + role + avatar
ChipSingle chip (filter, tag, removable)
AvatarGroupStacked overlapping avatars (+N more)
SelectableTappable card row with checked/selected state
ExpandableCard row that expands to show more content on tap
SwipeableRowRow with reveal actions on swipe (archive / delete / etc.)
SwipeCardsTinder-style swipeable card stack
DataTableNative data table with sort + scroll
ChatBubbleSingle chat message bubble (mine vs theirs)

Inputs + pickers

PatternWhat it is
DatePickeriOS/Android-styled date picker bottom sheet
WheelPickeriOS-style spinning wheel picker
RulerScrubberHorizontal "ruler" picker for height/weight (the fitness kit uses it for body measurements)

Special-purpose

PatternWhat it is
PaywallScreenDrop-in paywall — feature list, pricing toggle, primary CTA, fine print
PricingTableMulti-tier pricing comparison cards
ProfileHeaderAvatar + name + email + stats — pre-baked profile-screen header
SettingsScreenPre-built settings layout — sections + rows + dividers
UserPreferencesToggle group for common app prefs (notifications, units, language)
ImmersiveMediaScreenFull-bleed media-first screen layout
FinanceDashboardKPI grid + chart + recent-transactions list — finance-kit-shaped
CountdownBannerTime-bounded promo banner (red when expired)
EmptyStateNative empty-state with icon + title + description + CTA
SkeletonLoading placeholder (matches the web Skeleton API)
GlassCardFrosted-glass card (BlurView-backed)
AnimatedViewReanimated wrapper with fade/slide presets
PullToRefreshPull-to-refresh wrapper with branded spinner

A small example: BottomSheet + DatePicker

import { BottomSheet, DatePicker, Button, H2 } from '@otfdashkit/ui-native'

const [open, setOpen] = useState(false)
const [date, setDate] = useState<Date | null>(null)

<>
  <Button onPress={() => setOpen(true)}>
    {date ? date.toLocaleDateString() : 'Pick a date'}
  </Button>

  <BottomSheet open={open} onOpenChange={setOpen} snapPoints={['50%']}>
    <H2>When?</H2>
    <DatePicker value={date} onChange={(d) => { setDate(d); setOpen(false) }} />
  </BottomSheet>
</>

See also

  • Layouts — screen-shape components patterns plug into
  • Interface — smaller, single-purpose components

On this page