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,HabitCheckedInEventto 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.