life-docs/features/today.md
2026-03-20 09:32:20 -07:00

4.1 KiB

Feature — Today View

Unified daily dashboard. The heart of the app — everything needed to navigate the day in one scrollable view. Aggregates from all modules.


API

Method Endpoint Description
GET /api/today Unified daily view (see response below)
GET /api/today/next-action Suggested next task (see analytics feature)

Today Response

{
  "date": "2026-02-24",
  "dailyPlan": {
    "energyLevel": "medium",
    "moodMorning": 3,
    "morningIntention": "Focus on Christine deliverables",
    "focusDomains": [...]
  },
  "timeBlocks": [...],
  "priorityTasks": [...],
  "quickWins": [...],
  "habitsDueToday": [
    { "habit": { "id": "...", "name": "Morning meditation" }, "checkedIn": false, "checkIn": null }
  ],
  "domainStats": [
    { "domain": { "id": "...", "name": "Christine's Startup", "color": "#4A90D9" }, "tasksDueToday": 2, "tasksOverdue": 1, "incomeThisWeek": "420.00", "currentStreak": 7, "sprintProgress": 60 }
  ],
  "overdueTasks": [...],
  "completedToday": 5,
  "totalToday": 12
}

Backend Module

TodayModule — read-only aggregation, imports TasksModule, HabitsModule, SchedulingModule, IncomeModule.

  • No entities of its own
  • Pulls from: DailyPlan, TimeBlocks, Tasks (filtered by today), Habits (due today), Income (this week), Sprints (active)
  • Listens to: TaskCompletedEvent, HabitCheckedInEvent to recalculate stats

Frontend

Route

  • /today — Daily dashboard (default landing page)

Components

TodayPage
├── MorningAssessmentCard
│   ├── EnergySelector (3 radio buttons: high/med/low)
│   ├── MoodRating (5 stars)
│   ├── FocusDomainPicker (multi-select domain chips)
│   └── IntentionInput (text + save)
├── QuickWinsSection
│   └── QuickWinCard[] (compact cards, checkmark to complete)
├── PriorityTaskList
│   └── TaskListItem[] (with UrgencyIndicator)
├── TimeBlockTimeline
│   ├── NowIndicator (red line at current time)
│   └── TimeBlockCard[] (domain-colored)
├── HabitsDueSection
│   └── HabitDueRow[] (name + streak + check-in button)
├── DomainQuickStats
│   └── DomainStatCard[] (domain badge + key metric)
├── NextActionButton
│   └── Expands to show suggested task + reason
├── EveningReflectionCard (visible after 18:00)
│   ├── MoodRating
│   └── ReflectionInput (textarea + save)
└── MiniChatWidget (FAB → inline chat panel)

Data

const { data: today } = useToday();
const updatePlan = useUpdateDailyPlan();
const updateReflection = useUpdateReflection();
const updateTaskStatus = useUpdateTaskStatus();
const checkIn = useCheckIn();
const { data: nextAction, refetch: getNextAction } = useNextAction();

Energy-Based Filtering

Energy Quick Wins Priority Tasks
High Normal (below tasks) All energy levels
Medium Elevated (above tasks) Medium + low energy only
Low Maximum prominence (top, green) Low energy only

No energy set → all tasks shown + prompt to complete morning assessment.

Key Interactions

Morning assessment: Save each field immediately on change. Energy selection re-filters task list.

Quick wins: Checkmark → optimistic completion → CompletionAnimation → card slides away.

Task completion: Checkbox → toggle to done → animation → row mutes.

Timeline: Auto-scrolls to current time on load. Red line at current time.

Next action: Button → calls API → expands with task title, domain, reason, "Start" button.

Evening reflection: Auto-shows after 18:00 local time. Mood + free-text, saves to daily plan.

Responsive

  • Sections stack in single column
  • Quick wins: horizontal scroll
  • Timeline: simplified list (no visual bars)
  • Domain stats: 2-column grid

Implementation Phase

Phase 2 (Core) — Full /today implementation with morning assessment, timeline, habits, quick wins. Phase 6 (Polish) — Next action button, ADHD energy filtering, animations, mini chat widget.