A responsive React Native (Expo) application that displays independent bookstores that participated in the 2025 CLT Bookstore Crawl in a modern, card-based UI. Users can browse all bookstores and filter results by county using a dropdown selector.
Built as a mobile-first, cross-platform project and deployed to the web via Expo + Vercel.
- Displays bookstores in a responsive card grid layout
- Filter by county using a dropdown selector
- “Visit Website” button for each bookstore
- Mobile-first responsive design
- Works on web and mobile via Expo
- React Native
- Expo
- TypeScript
FlatListfor performant list rendering@react-native-picker/pickerfor filteringuseWindowDimensionsfor responsive layout- Vercel for deployment
The number of columns dynamically adjusts based on screen width:
- 1 column on mobile
- 2 columns on tablet
- 3 columns on desktop
To prevent React Native’s numColumns runtime error, the FlatList key prop is updated when the column count changes to force a full re-render.
County filtering is handled via:
useStatefor selected county- A derived
filteredBookstoresarray - Conditional filtering logic (
All Countiesresets the view)
Each bookstore is displayed in a uniform-height card containing:
- Name
- Address
- County
- Website button (using
Linking.openURL())
Cards use:
- Consistent
minHeight - Flexbox layout
- Subtle shadow and rounded corners
- Even spacing in grid format