Constellation Journal

A mood-and-moment journal that turns each entry into a “star” on an interactive night-sky canvas, where color reflects mood and size reflects intensity. Users can add quick entries (mood, tags, short note), filter the sky by date range or tag, and click stars to read/edit details, with all data saved to localStorage. Includes a lightweight “stargazer” mode that animates subtle twinkling and draws temporary lines to form constellations from selected tags for playful reflection without expanding scope.

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 lucide-react clsx tailwind-merge && npx shadcn@latest init -d

by system

Add Tailwind config

Configure tailwind.config.ts content paths and add global Tailwind directives in src/index.css.

by system

Set shadcn utils

Create src/lib/utils.ts with cn() helper using clsx + tailwind-merge.

by system

Define entry types

Create src/types/journal.ts defining Mood, JournalEntry, and filter types.

by system

LocalStorage helpers

Create src/lib/storage.ts to load/save entries with versioned key and JSON guards.

by system

Seed sample entries

Create src/lib/seed.ts to generate a few deterministic starter entries if storage is empty.

by system

Entries state hook

Create src/hooks/useEntries.ts to manage CRUD entries and persist to localStorage.

by system

Filter state hook

Create src/hooks/useEntryFilter.ts to store date range, tag query, and selected tags.

by system

Derive filtered entries

Create src/lib/filtering.ts to filter/sort entries by date range and tags.

by system

Mood color mapping

Create src/lib/mood.ts mapping mood values to Tailwind colors/hex for canvas rendering.

by system

Intensity size mapping

Create src/lib/intensity.ts to map intensity (1-5) to star radius and glow.

by system

Sky coordinate mapping

Create src/lib/layout.ts to map entries to stable x/y positions from entry id/date.

by system

Canvas sky renderer

Create src/components/SkyCanvas.tsx rendering stars on a <canvas> from entries.

by system

Canvas hit testing

Add click hit-testing in SkyCanvas.tsx to detect which star was clicked and emit entry id.

by system

Twinkle animation loop

Add requestAnimationFrame-based subtle twinkling option to SkyCanvas.tsx.

by system

Constellation line drawing

Add optional temporary line drawing between stars sharing selected tag(s) in SkyCanvas.tsx.

by system

Stargazer mode toggle

Create src/components/StargazerToggle.tsx to toggle twinkle/constellation overlay state.

by system

App shell layout

Create src/components/AppShell.tsx with header, sidebar panel, and main sky area.

by system

Header actions

Create src/components/HeaderBar.tsx with app title and stargazer toggle slot.

by system

Add entry form

Create src/components/AddEntryForm.tsx for mood, intensity, tags, note, and submit.

by system

Tag input control

Create src/components/TagInput.tsx to add/remove tags with chips and comma/enter support.

by system

Mood picker control

Create src/components/MoodPicker.tsx as a compact select/grid using shadcn/ui components.

by system

Intensity slider control

Create src/components/IntensitySlider.tsx using shadcn/ui Slider with 1-5 labels.

by system

Filter panel UI

Create src/components/FilterPanel.tsx with date range inputs and tag query/select.

by system

Tag suggestions list

Create src/components/TagSuggestions.tsx listing existing tags and allowing quick selection.

by system

Selected entry dialog

Create src/components/EntryDialog.tsx (shadcn Dialog) to display entry details when a star is clicked.

by system

Edit entry form

Create src/components/EditEntryForm.tsx to edit mood/intensity/tags/note and save changes.

by system

Delete entry action

Add a delete button with confirmation inside EntryDialog.tsx to remove the entry.

by system

Wire app state

Update src/App.tsx to connect hooks, filtering, and UI components into the working SPA.

by system

Polish empty states

Add simple empty/loading/invalid-filter states in AppShell.tsx and FilterPanel.tsx.

by system

In Progress0
In Review0
Done0