Constellation Journal

A mood-and-moment journal where each entry becomes a “star” on an interactive night-sky canvas, positioned by mood (y-axis) and energy (x-axis), with color representing emotion. Users can add/edit entries, filter by tags/date, and click stars to open a shadcn/ui drawer with the full note, plus simple stats like streaks and mood distribution—all saved to localStorage in a single React + Vite SPA.

To Do30
Scaffold app stack

Run: npm create vite@latest . -- --template react-ts && npm i && npm i -D tailwindcss postcss autoprefixer && npx tailwindcss init -p && npm i class-variance-authority clsx tailwind-merge lucide-react && npx shadcn@latest init

by system

Add Tailwind globals

Configure Tailwind content and add base styles in src/index.css (tailwind directives + CSS variables for shadcn).

by system

Add shadcn primitives

Install shadcn/ui components needed (button, input, textarea, label, badge, card, drawer, dialog, popover, tabs, separator, toast).

by system

Create app shell

Build src/App.tsx layout with header, main area, and responsive two-pane structure (canvas + sidebar).

by system

Define journal types

Create src/types/journal.ts defining Entry, Mood, Energy, Tag, and derived stat shapes.

by system

LocalStorage helpers

Create src/lib/storage.ts with load/save utilities and schema versioning key.

by system

Entries state hook

Create src/hooks/useEntries.ts to manage CRUD + persistence to localStorage.

by system

Mood color mapping

Create src/lib/moodColors.ts to map mood/emotion to star color and UI accents.

by system

Tag parsing utility

Create src/lib/tags.ts for parsing, normalizing, and deduplicating tag strings.

by system

Seed demo entries

Add optional dev-only seed data helper in src/lib/seed.ts to populate entries when storage empty.

by system

Entry form component

Create src/components/EntryForm.tsx with inputs for title, note, mood, energy, tags, and date.

by system

Add entry dialog

Create src/components/AddEntryDialog.tsx wrapping EntryForm in a shadcn Dialog and calling createEntry.

by system

Edit entry dialog

Create src/components/EditEntryDialog.tsx to edit an existing entry and call updateEntry.

by system

Delete entry confirm

Create src/components/DeleteEntryDialog.tsx to confirm deletion and call deleteEntry.

by system

Filters state hook

Create src/hooks/useFilters.ts managing tag selection, date range, and search query.

by system

Filter bar UI

Create src/components/FilterBar.tsx with tag chips, date inputs, and search field bound to useFilters.

by system

Entry list sidebar

Create src/components/EntryList.tsx showing filtered entries with quick actions (edit/delete).

by system

Stats computation util

Create src/lib/stats.ts to compute streaks, mood distribution, and counts from entries.

by system

Stats panel component

Create src/components/StatsPanel.tsx to render streaks and mood distribution using computed stats.

by system

Canvas coordinate mapping

Create src/lib/skyCoords.ts mapping mood/energy values to canvas x/y with padding and scaling.

by system

Night sky canvas component

Create src/components/SkyCanvas.tsx rendering stars on an HTML canvas with pan/zoom disabled initially.

by system

Star hover tooltip

Add lightweight hover hit-testing + tooltip rendering inside SkyCanvas for entry title/date.

by system

Star click selection

Implement click hit-testing in SkyCanvas to set selectedEntryId when a star is clicked.

by system

Entry drawer component

Create src/components/EntryDrawer.tsx using shadcn Drawer to show selected entry details.

by system

Drawer edit action

Add an Edit button inside EntryDrawer that opens EditEntryDialog for the selected entry.

by system

Drawer delete action

Add a Delete button inside EntryDrawer that opens DeleteEntryDialog for the selected entry.

by system

Filter integration glue

Wire App.tsx to combine useEntries + useFilters to produce filteredEntries for list and canvas.

by system

Toasts for actions

Add success/error toasts for create/update/delete using shadcn toast primitives.

by system

Empty and loading states

Add friendly empty-state UI for no entries and no filter matches in canvas and list.

by system

Export and import JSON

Create src/components/ImportExportPanel.tsx to export entries to JSON and import/merge from a file.

by system

In Progress0
In Review0
Done0