Commit Graph

9 Commits

Author SHA1 Message Date
Brian Fertig f66c7731d1 Add per-project theme assignment with scoped theming
- Extract theme constants (THEMES, THEME_CLASSES, DARK_SURFACES) into a new
  framework-free lib/themes.ts so server and client code share one source of
  truth; re-export from theme-provider for backward compatibility.
- Add nullable `theme` column to Project (Prisma migration + schema), plus
  ProjectThemeSchema validation and a setProjectTheme server action.
- Introduce a ThemeScope context in the provider: a subtree can temporarily
  override the global preference via useThemeScope().setScope(name); the
  scoped theme wins for resolvedTheme/DOM while active, then lifts on cleanup.
- Render an inline no-FOUC script (themeSwitchScript) on project pages that
  applies the theme class before first paint and leaves a data-project-theme
  marker the provider reads at hydration.
- Add ProjectThemeScope component that sets/clears the scope from live
  ProjectsContext state, so picking a new theme updates instantly without
  waiting for the server re-render.
- Add ProjectThemePicker dropdown (Default + light/dark options) rendered
  beside the project title in the kanban board header.
- Wire optimistic setProjectTheme into ProjectsContext with rollback and
  error toast on failure.
- Update use-dark-theme hooks to read resolvedTheme from context instead of
  resolving locally, so they reflect scoped themes correctly.
2026-08-29 22:07:10 -06:00
Brian Fertig 7c407f49f8 Added AI Summary 2026-08-28 14:25:57 -06:00
Brian Fertig be6926c027 Two new extra-detailed themes: Cybperpunk and Blueprint 2026-08-28 11:33:57 -06:00
Brian Fertig cb52dfe545 Improve quick-add UX and fix visual clipping in board cards
- Let the quick-add dialog target any group via a new group dropdown,
  instead of always defaulting to the first group
- Only clip category lane content while it's actively collapsing, so
  it no longer crops a card's hover lift/top stroke at rest
- Raise the progress pie badge's z-index so it isn't cropped by the
  next card overlapping its corner
2026-08-25 14:24:34 -06:00
Brian Fertig b6b1690fdd Redesign UI theming, typography, and board polish
- Replace next-themes with a custom ThemeProvider supporting four
  themes (Default, Sunset, Dark, Ocean) since next-themes' no-FOUC
  script tag breaks under React 19 dev warnings
- Swap Geist fonts for Inter/Figtree/JetBrains Mono for a friendlier
  display face and add a shared isDarkTheme/colorModeFromTheme helper
  so components stop reading next-themes directly
- Add per-color "soft"/"softDark" tints in lib/colors.ts so group
  cards carry a calm hue-tinted fill instead of a generic gray
- Restyle nav, board lanes, group cards, empty states, and page
  headers with heading font, tighter spacing, and rounded-2xl surfaces
- Add lane "open to-dos" counts, board summary stats, and a quick
  "+ To-do" action targeting the first available group
- Hide the Scheduled panel below sm and give the app shell a minimum
  width with horizontal scroll instead of crushing the board
- Fix DropdownMenuLabel to self-wrap in a Menu.Group (Base UI requires
  the context) and wrap the admin role Badge trigger in a native button
2026-08-25 13:06:53 -06:00
Brian Fertig 171ec92b74 Add 3D flight world, board view switcher, and quick-add to-dos
3D scene:
- Build a procedural world from seeded waypoint segments (per-segment
  step/turn/altitude params) joined into kink-free Catmull-Rom curves,
  using ghost points so boundaries stay smooth; world and textures are
  derived from the session seed for consistency.
- Carve the flight corridor out of the terrain (gaussian dip plus a
  height floor 32u below the path) and add city districts with instanced
  buildings driven by seeded glowing-window textures, plus tunnel
  segments rendered as textured tubes with light strips.

Board UI:
- Add a ViewSwitcher to the kanban header and a board view provider.
- Compact group cards place an inline "+" on the last visible to-do row
  (shrink-0, so it sits at the row's right edge) that opens the new
  TodoCreateDialog, alongside the existing AI-assisted creation flow.

Scheduled panel:
- Collapsed rail replaces the corner overdue dot with badges stacked
  below the calendar icon: overdue (destructive, ping ring) and
  due-today (neutral, calmer pulse). Today's count is a separate filter
  that excludes already-completed occurrences, unlike the overdue count.
2026-08-19 09:23:05 -06:00
Brian Fertig eb32aee653 Add scheduled (recurring) to-dos, AI to-do generation, and in-place building upgrades
- Scheduled to-dos: new ScheduledTodo + ScheduledTodoCompletion models
  (owner-XOR-project ownership like Category, per-occurrence completion
  so a recurring to-do tracks done state per calendar date), recurrence
  built server-side from validated parts via rrule-utils, CRUD +
  occurrence-toggle server actions, add/edit dialog, and a collapsible
  Scheduled side panel (overdue / today / upcoming) with UTC-safe
  date-key formatting.
- AI to-dos: group-level AI dialog (lib/actions/todo-ai.ts) that chats
  then proposes a finalize list of to-dos; editable proposals and bulk
  add via BoardProvider.addTodos; speech recognition gains better error
  handling (network/firewall message, error logging).
- Building upgrades: new `upgradesFrom` rule — Nuclear Power Plant can
  replace a friendly Energy Generator and Advanced Metal Generator a
  Mass Generator (same tile + footprint, per TALogic.findUpgradeTarget),
  crediting a 50% refund of the replaced building's OWN cost;
  compileRules validates the references, topperFrame gets a generic
  spinning-glyph fallback in TAArt.
- Movement rework: pushOutOfObstacles replaces the hard tile-snap with a
  damped circle-vs-tile overlap push, and pathfinding routes at exact-fit
  clearance instead of +1 padding (fixes corner grinding/stalling).
- New map m06 "Annihilation" (medium, snowfields, Klaxon skill 5, seed
  90123 — pre-vetted for early-economy balance).
- Tests: upgrade placement (ownership, type match, exact footprint,
  refund, army-less fallback), obstacle routing/settling, corridor
  moves; sprites.md updated for upgradesFrom and toppers.
2026-08-17 15:03:13 -06:00
Brian Fertig 4708e00a04 feat(board): introduce Projects as isolated boards
- Add Project model with owner-based access and cascade delete
- Restructure Category to belong to either Home (userId) or a Project (projectId), enforced by DB constraints and access filters
- Scope all board operations (create, update, delete, reorder) to the correct board context using `categoryAccessFilter` and `projectAccessFilter`
- Replace hardcoded `revalidatePath("/")` with dynamic `boardPath()` for proper cache invalidation
- Add `ProjectsProvider` and `ProjectsNavSection` for project sidebar navigation
- Make KanbanBoard accept `projectId` and `title` props to render Home or Project boards
- Extract `getBoard()` utility to centralize board data fetching
- Refactor group/todo/notes actions to derive board context from category membership rather than trusting caller input
2026-08-12 12:57:41 -06:00
Brian Fertig 9a1aad6ed0 first commit 2026-08-11 13:10:00 -06:00