Restructure desktop dashboard layout

- Separate desktop and mobile layouts completely
- Desktop: Mood+Plan, Calendar, Achievements+Health, Savings+Stats
- Mobile: Keep original 4-slide swipe layout unchanged
This commit is contained in:
Avery Felts 2026-02-01 22:41:33 -07:00
parent d957f7525f
commit 371c1e4618

View File

@ -365,21 +365,85 @@ export function Dashboard({ user }: DashboardProps) {
)} )}
</div> </div>
{/* SECTION: Mobile Swipe Ecosystem */} {/* DESKTOP LAYOUT - Hidden on mobile */}
<div className="hidden sm:block space-y-8">
{/* Row 1: Mood + Quit Plan */}
<div className="grid grid-cols-2 gap-6">
<MoodTracker />
<UnifiedQuitPlanCard
preferences={preferences}
usageData={usageData}
onGeneratePlan={handleGeneratePlan}
refreshKey={refreshKey}
/>
</div>
{/* Row 2: Calendar/Quote */}
<div id="calendar-section">
<UsageCalendar
key={refreshKey}
usageData={usageData}
onDataUpdate={loadData}
userId={user.id}
religion={preferences.religion}
onReligionUpdate={async (religion: 'christian' | 'secular') => {
const updatedPrefs = { ...preferences, religion };
setPreferences(updatedPrefs);
await savePreferencesAsync(updatedPrefs);
}}
preferences={preferences}
onPreferencesUpdate={async (updatedPrefs: UserPreferences) => {
await savePreferencesAsync(updatedPrefs);
setPreferences(updatedPrefs);
}}
/>
</div>
{/* Row 3: Achievements + Health Recovery */}
<div className="grid grid-cols-2 gap-6">
<AchievementsCard
key={`achievements-${refreshKey}`}
achievements={achievements}
substance={preferences.substance}
/>
<HealthTimelineCard
key={`health-${refreshKey}`}
usageData={usageData}
preferences={preferences}
/>
</div>
{/* Row 4: Savings + Stats */}
<div className="grid grid-cols-2 gap-6">
<SavingsTrackerCard
key={`savings-${refreshKey}`}
savingsConfig={savingsConfig}
usageData={usageData}
trackingStartDate={preferences.trackingStartDate}
onSavingsConfigChange={handleSavingsConfigChange}
onModalStateChange={handleModalStateChange}
/>
<div className="grid grid-cols-2 gap-4">
<StatsCard key={`stats-nicotine-${refreshKey}`} usageData={usageData} substance="nicotine" />
<StatsCard key={`stats-weed-${refreshKey}`} usageData={usageData} substance="weed" />
</div>
</div>
</div>
{/* MOBILE SWIPE LAYOUT - Hidden on desktop */}
<div <div
ref={swipeContainerRef} ref={swipeContainerRef}
onScroll={handleScroll} onScroll={handleScroll}
className="swipe-container sm:space-y-12 sm:block" className="swipe-container sm:hidden"
> >
{/* SLIDE 1: Mindset (Mood & Personalized Plan) */} {/* SLIDE 1: Mindset (Mood & Personalized Plan) */}
<div className="swipe-item space-y-4"> <div className="swipe-item space-y-4">
<div className="sm:hidden flex items-center justify-between mb-2 px-1"> <div className="flex items-center justify-between mb-2 px-1">
<h2 className="text-[10px] font-bold uppercase tracking-[0.2em] opacity-50">Daily Mindset</h2> <h2 className="text-[10px] font-bold uppercase tracking-[0.2em] opacity-50">Daily Mindset</h2>
</div> </div>
<div className="space-y-4 sm:grid sm:grid-cols-2 sm:gap-6 sm:space-y-0"> <div className="space-y-4">
<MoodTracker /> <MoodTracker />
{/* Unified Quit Plan Placard */}
<UnifiedQuitPlanCard <UnifiedQuitPlanCard
preferences={preferences} preferences={preferences}
usageData={usageData} usageData={usageData}
@ -391,11 +455,11 @@ export function Dashboard({ user }: DashboardProps) {
{/* SLIDE 2: Stats & Recovery (Side-by-side Stats + Health) */} {/* SLIDE 2: Stats & Recovery (Side-by-side Stats + Health) */}
<div className="swipe-item space-y-4"> <div className="swipe-item space-y-4">
<div className="sm:hidden flex items-center justify-between mb-2 px-1"> <div className="flex items-center justify-between mb-2 px-1">
<h2 className="text-[10px] font-bold uppercase tracking-[0.2em] opacity-50">Usage & Recovery</h2> <h2 className="text-[10px] font-bold uppercase tracking-[0.2em] opacity-50">Usage & Recovery</h2>
</div> </div>
<div className="space-y-4"> <div className="space-y-4">
<div className="grid grid-cols-2 gap-3 sm:gap-6"> <div className="grid grid-cols-2 gap-3">
<StatsCard key={`stats-nicotine-${refreshKey}`} usageData={usageData} substance="nicotine" /> <StatsCard key={`stats-nicotine-${refreshKey}`} usageData={usageData} substance="nicotine" />
<StatsCard key={`stats-weed-${refreshKey}`} usageData={usageData} substance="weed" /> <StatsCard key={`stats-weed-${refreshKey}`} usageData={usageData} substance="weed" />
</div> </div>
@ -409,10 +473,10 @@ export function Dashboard({ user }: DashboardProps) {
{/* SLIDE 3: Achievements & Money (Insights) */} {/* SLIDE 3: Achievements & Money (Insights) */}
<div className="swipe-item space-y-4"> <div className="swipe-item space-y-4">
<div className="sm:hidden flex items-center justify-between mb-2 px-1"> <div className="flex items-center justify-between mb-2 px-1">
<h2 className="text-[10px] font-bold uppercase tracking-[0.2em] opacity-50">Achievements & Savings</h2> <h2 className="text-[10px] font-bold uppercase tracking-[0.2em] opacity-50">Achievements & Savings</h2>
</div> </div>
<div className="space-y-4 sm:grid sm:grid-cols-2 sm:gap-6 sm:space-y-0"> <div className="space-y-4">
<AchievementsCard <AchievementsCard
key={`achievements-${refreshKey}`} key={`achievements-${refreshKey}`}
achievements={achievements} achievements={achievements}
@ -430,8 +494,8 @@ export function Dashboard({ user }: DashboardProps) {
</div> </div>
{/* SLIDE 4: Calendar */} {/* SLIDE 4: Calendar */}
<div id="calendar-section" className="swipe-item"> <div id="calendar-section-mobile" className="swipe-item">
<div className="sm:hidden flex items-center justify-between mb-2 px-1"> <div className="flex items-center justify-between mb-2 px-1">
<h2 className="text-[10px] font-bold uppercase tracking-[0.2em] opacity-50">Usage Calendar</h2> <h2 className="text-[10px] font-bold uppercase tracking-[0.2em] opacity-50">Usage Calendar</h2>
</div> </div>
<UsageCalendar <UsageCalendar