fix: mobile-first modal layout, safe areas, and input behavior overhaul#21
fix: mobile-first modal layout, safe areas, and input behavior overhaul#21bryanfawcett wants to merge 10 commits intomainfrom
Conversation
- All modals now slide up from bottom on mobile with close button (X) and swipe-to-dismiss via drag handle - Add safe area insets (env(safe-area-inset-*)) to header, footer, fixed bottom bars, and modal content - Use dvh (dynamic viewport height) instead of vh/screen to handle browser chrome on mobile - Add viewport-fit=cover meta tag for edge-to-edge layout on notched devices - Fix drawer max-height from 80vh to 85dvh with rounded-t-[20px] for proper bottom sheet appearance - Fix responsive-modal scroll: overscroll-contain + max-h-[calc(85dvh-5rem)] prevents content hiding behind browser bars - Add inputMode, autoCapitalize, autoCorrect, enterKeyHint attributes to all form inputs for proper mobile keyboards - Force font-size: 16px on mobile inputs to prevent iOS zoom on focus - Fix create-event-form bottom button: safe area padding + z-40 layering - Fix event detail sidebar sticky offset: calc(4rem + safe-area-inset-top) - Fix manage page confirm modals: items-end on mobile for bottom-sheet-like behavior - Add scrollbar-none utility for horizontal scroll containers (tab lists) - Prevent overscroll bounce on iOS body https://claude.ai/code/session_01GBDmHPeMz4FCeN4fn5Ujnx
- EventCover: responsive aspect ratio (16/9 mobile, 2/1 tablet) instead of fixed h-100, smaller badge/stat sizing on mobile - Event detail: remove Separator lines between sections, use generous whitespace spacing instead for a cleaner feel - Date row: Luma-style calendar block (month abbreviation + day number in a bordered box) replaces the icon-only box - Host row: more compact on mobile (w-10 avatar), hide Follow button on small screens, truncate long names - Add "Featured in [City]" badge above title (Luma pattern) - Add sticky mobile RSVP bar fixed to bottom (lg:hidden) with price and RSVP button, matching the create-event fixed bar pattern - Bottom padding on mobile accounts for sticky RSVP bar height + safe area inset - All text rows use truncate to prevent overflow on narrow screens https://claude.ai/code/session_01GBDmHPeMz4FCeN4fn5Ujnx
… button - Move map below description into a dedicated "Location" section with heading, venue name, full address, and embedded map (Luma pattern) - Add "Hosted By" section with host avatar, name, Subscribe button, event count, trust badge, rating, social links, and Contact the Host - Replace inline host row with compact host link under title (small avatar + name with chevron, links to #hosted-by anchor) - Sticky mobile bar now has bookmark/interested button (filled on toggle) alongside RSVP - allows soft interest without hard commit - Sections separated by themed Separator + generous spacing (mt-10) - scroll-mt-20 on hosted-by anchor for proper sticky header offset https://claude.ai/code/session_01GBDmHPeMz4FCeN4fn5Ujnx
- Cover image upload: responsive height (h-40 mobile, h-50 desktop), always-visible overlay on mobile (no hover needed on touch), active state for touch feedback - My events: responsive padding (px-4 mobile, px-6 desktop), smaller heading on mobile, scrollable tabs with scrollbar-none, tighter grid gap on mobile https://claude.ai/code/session_01GBDmHPeMz4FCeN4fn5Ujnx
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
mukoko-nhimbe-api | b954d6b | Commit Preview URL Branch Preview URL |
Apr 09 2026, 05:25 AM |
|
Claude finished @bryanfawcett's task —— View job Reviewing PR: Mobile-first modal layout overhaul ✅Todo List:
Code Review SummaryThis PR delivers a comprehensive mobile-first modal overhaul with impressive attention to detail. The implementation is secure, performant, and follows project conventions well. Here's my analysis: ✅ Security Assessment
⚡ Performance Analysis
📱 Mobile UX Excellence
🎨 Code Quality & Conventions
🔍 Technical ImplementationResponsive Modal System ( <div className="flex-1 overflow-y-auto overscroll-contain px-4 pb-[calc(1.5rem+env(safe-area-inset-bottom,0px))] max-h-[calc(85dvh-5rem)]">This line demonstrates sophisticated mobile handling - combining safe areas, dynamic viewport height, and overflow control. CSS Enhancements ( @media (max-width: 767px) {
input[type="text"], input[type="url"], /* ... */ {
font-size: 16px !important;
}
}Prevents iOS zoom on focus - excellent mobile UX detail.
|
…ent z-index Address review feedback: 1. Remove BottomSheetModal abstraction - it was a 1-line wrapper that added no value. All 6 modal components now use ResponsiveModal directly with the same open/onOpenChange pattern. Deleted bottom-sheet-modal.tsx. 2. Move --event-* CSS custom properties to :root with sensible defaults (malachite theme) so they always resolve even if a component renders outside EventThemeWrapper context. Added light mode overrides. EventThemeWrapper inline styles still override these per-event. 3. Document z-index stacking context in globals.css: z-30 = admin sub-headers z-40 = sticky bottom bars (below modals) z-50 = header, all modals/overlays No conflicts found - the layering is intentional. https://claude.ai/code/session_01GBDmHPeMz4FCeN4fn5Ujnx
|
Claude finished @bryanfawcett's task —— View job Reviewing PR: Mobile-first modal layout overhaul ✅Todo List:
Code Review SummaryThis PR delivers a comprehensive mobile-first modal overhaul with impressive attention to detail. The implementation is secure, performant, and follows project conventions well. Here's my analysis: ✅ Security Assessment
⚡ Performance Analysis
📱 Mobile UX Excellence
🎨 Code Quality & Conventions
🔍 Technical ImplementationResponsive Modal System ( <div className="flex-1 overflow-y-auto overscroll-contain px-4 pb-[calc(1.5rem+env(safe-area-inset-bottom,0px))] max-h-[calc(85dvh-5rem)]">This line demonstrates sophisticated mobile handling - combining safe areas, dynamic viewport height, and overflow control. CSS Enhancements ( @media (max-width: 767px) {
input[type="text"], input[type="url"], /* ... */ {
font-size: 16px !important;
}
}Prevents iOS zoom on focus - excellent mobile UX detail.
|
P0 Critical: - Admin settings: type-to-confirm "DELETE" dialog for Clear All Data - Admin users: confirmation dialog before suspend/activate user - Mobile navigation: bottom tab bar (Discover, My Events, Calendar, Profile) visible on mobile, hidden md:, auto-hides on create/manage pages that have their own fixed bars - Create form: scroll-to-error on validation failure, beforeunload unsaved changes warning, AlertCircle icon on errors - Timezone: use browser Intl.DateTimeFormat timezone instead of hardcoded GMT+2, display local timezone name in UI - Date-time modal: inline "end time must be after start time" warning with red ring on invalid end time input, min date set to today - Capacity modal: Math.max(1, value) guard prevents negative numbers - Location modal: inline URL validation feedback on meeting URL input - Create form: URL validation for meeting URL and ticket URL on submit - Removed non-functional "Personal Calendar" button (dead-end state) P1 High: - Event title: text-2xl sm:text-3xl lg:text-4xl (was text-3xl sm:text-4xl) - Back button: larger hit area with bg-surface hover state - RSVP error: bg-red-500/10 container instead of tiny text - Weather widget: "unavailable" fallback instead of silent null - Manage tabs: flex-nowrap prevents wrapping on mobile - Guest status badge: visible on all screens (was hidden sm:block) - Calendar nav buttons: 44px touch targets (w-11 h-11) - Support messages: responsive indent (ml-3 sm:ml-8) https://claude.ai/code/session_01GBDmHPeMz4FCeN4fn5Ujnx
|
Claude finished @bryanfawcett's task —— View job Reviewing PR: Mobile-first modal layout overhaul ✅Todo List:
Code Review SummaryThis PR delivers a comprehensive mobile-first modal overhaul with impressive attention to detail. The implementation is secure, performant, and follows project conventions well. Here's my analysis: ✅ Security Assessment
⚡ Performance Analysis
📱 Mobile UX Excellence
🎨 Code Quality & Conventions
🔍 Technical ImplementationResponsive Modal System ( <div className="flex-1 overflow-y-auto overscroll-contain px-4 pb-[calc(1.5rem+env(safe-area-inset-bottom,0px))] max-h-[calc(85dvh-5rem)]">This line demonstrates sophisticated mobile handling - combining safe areas, dynamic viewport height, and overflow control. CSS Enhancements ( @media (max-width: 767px) {
input[type="text"], input[type="url"], /* ... */ {
font-size: 16px !important;
}
}Prevents iOS zoom on focus - excellent mobile UX detail.
|
P2 Medium: - Community stats: sr-only labels on all icons for screen readers - Sign-in: Suspense + skeleton fallback while Stytch initializes - Auth errors: friendly error messages (expired link, network error, invalid token) instead of raw Stytch error strings - Admin users: browser locale for date formatting (was hardcoded en-US) - Kiosk pairing code: responsive sizing (w-11 sm:w-16) fits 320px - Admin dashboard: full skeleton layout replaces single spinner - Admin sidebar: md: breakpoint (was lg:) so tablets get sidebar - Admin settings: impact subtitles on all feature toggles - Event detail loading: skeleton matches actual 2-column layout P3 Low: - Search: "View all events" link when trending > 3 - Short link /e/[shortCode]: loading.tsx with spinner + "Opening event..." - Event cover: hide view count on mobile to prevent badge overlap https://claude.ai/code/session_01GBDmHPeMz4FCeN4fn5Ujnx
|
Claude finished @bryanfawcett's task —— View job Claude finished reviewing the PR ✅ Todo List:
Code Review SummaryThis PR delivers a comprehensive mobile-first modal layout overhaul with excellent attention to detail. The implementation is secure, performant, and follows project conventions well. ✅ Security Assessment
⚡ Performance Analysis
📱 Mobile UX Excellence
🎨 Code Quality & Conventions
🔍 Technical Implementation DetailsResponsive Modal System ( <div className="flex-1 overflow-y-auto overscroll-contain px-4 pb-[calc(1.5rem+env(safe-area-inset-bottom,0px))] max-h-[calc(85dvh-5rem)]">This line demonstrates sophisticated mobile handling - combining safe areas, dynamic viewport height, and overflow control. Mobile Input Optimization (
|
#16: FilterBar scroll affordance - edge fade gradients that appear when content overflows left/right (ResizeObserver + scroll listener) #17: Search result images use lazy loading (img loading="lazy" instead of inline background-url CSS) #32: FAQ open state persisted to localStorage, restored on page load #35: Signage auto-refresh pause/resume toggle button (pause/play icons) #36: Calendar month/year quick-select dropdowns replace plain heading #37: Admin pagination page number buttons (up to 5 visible pages with sliding window) for both events and users tables #38: Admin sidebar shows all nav items - inaccessible ones greyed out with lock icon and "Requires X role" tooltip instead of hidden #39: Cmd+K / Ctrl+K keyboard shortcut navigates to /search from anywhere https://claude.ai/code/session_01GBDmHPeMz4FCeN4fn5Ujnx
|
Claude finished @bryanfawcett's task —— View job Claude finished reviewing the PR ✅ Todo List:
Code Review SummaryThis PR delivers a comprehensive mobile-first modal layout overhaul with excellent attention to detail. The implementation is secure, performant, and follows project conventions well. ✅ Security Assessment
⚡ Performance Analysis
📱 Mobile UX Excellence
🎨 Code Quality & Conventions
🔍 Technical Implementation DetailsResponsive Modal System ( <div className="flex-1 overflow-y-auto overscroll-contain px-4 pb-[calc(1.5rem+env(safe-area-inset-bottom,0px))] max-h-[calc(85dvh-5rem)]">This line demonstrates sophisticated mobile handling - combining safe areas, dynamic viewport height, and overflow control. Mobile Input Optimization (
|
Replace nested IIFEs with cleaner ternary - same behavior, more readable. https://claude.ai/code/session_01GBDmHPeMz4FCeN4fn5Ujnx
|
Claude finished @bryanfawcett's task —— View job Claude finished reviewing the PR ✅ Todo List:
Code Review SummaryThis PR delivers a comprehensive mobile-first modal layout overhaul with excellent attention to detail. The implementation is secure, performant, and follows project conventions well. ✅ Security Assessment
⚡ Performance Analysis
📱 Mobile UX Excellence
🎨 Code Quality & Conventions
🔍 Technical Implementation DetailsResponsive Modal System ( <div className="flex-1 overflow-y-auto overscroll-contain px-4 pb-[calc(1.5rem+env(safe-area-inset-bottom,0px))] max-h-[calc(85dvh-5rem)]">This line demonstrates sophisticated mobile handling - combining safe areas, dynamic viewport height, and overflow control. Mobile Input Optimization (
|
… to nhimbe Every external link (meeting URLs, venue directions, ticket URLs) now routes through nhimbe's /r/[code] redirect for click tracking: Backend: - Migration 011: tracked_links + link_clicks tables with indexes - New /api/links route: POST creates link (deduped by event+url+type), GET /:code records click async then 302-redirects to target - GET /event/:eventId lists links with click counts for host dashboard - Click tracking is non-blocking (waitUntil) so redirect is instant Frontend: - /r/[code] Next.js page: SSR fetches Location header from API, redirects - useTrackedLink hook: creates tracked link on mount, falls back to raw URL if API fails. Used in event detail for Join button - api.ts: createTrackedLink() + getTrackedUrl() helpers Calendar exports now link back to nhimbe: - Calendar event description includes: "View event details, RSVP, and explore more: nhimbe.com/e/[shortCode]" - The nhimbe event page is always the primary URL (not raw Zoom/venue) - Removed duplicate ICS generation in EventActions, uses calendar.ts - Users can discover other events from their calendar entry Link types tracked: meeting_url, directions, ticket, website https://claude.ai/code/session_01GBDmHPeMz4FCeN4fn5Ujnx
|
Claude finished @bryanfawcett's task —— View job Claude finished reviewing the PR ✅ Todo List:
Code Review SummaryThis PR delivers a comprehensive mobile-first modal layout overhaul with excellent attention to detail. The implementation is secure, performant, and follows project conventions well. ✅ Security Assessment
⚡ Performance Analysis
📱 Mobile UX Excellence
🎨 Code Quality & Conventions
🔍 Technical Implementation DetailsResponsive Modal System ( <div className="flex-1 overflow-y-auto overscroll-contain px-4 pb-[calc(1.5rem+env(safe-area-inset-bottom,0px))] max-h-[calc(85dvh-5rem)]">This line demonstrates sophisticated mobile handling - combining safe areas, dynamic viewport height, and overflow control. Mobile Input Optimization (
|
https://claude.ai/code/session_01GBDmHPeMz4FCeN4fn5Ujnx