Commit graph

1549 commits

Author SHA1 Message Date
Till JS
878424c003 feat: rename ManaCore to Mana across entire codebase
Complete brand rename from ManaCore to Mana:
- Package scope: @manacore/* → @mana/*
- App directory: apps/manacore/ → apps/mana/
- IndexedDB: new Dexie('manacore') → new Dexie('mana')
- Env vars: MANA_CORE_AUTH_URL → MANA_AUTH_URL, MANA_CORE_SERVICE_KEY → MANA_SERVICE_KEY
- Docker: container/network names manacore-* → mana-*
- PostgreSQL user: manacore → mana
- Display name: ManaCore → Mana everywhere
- All import paths, branding, CI/CD, Grafana dashboards updated

No live data to migrate. Dexie table names (mukkePlaylists etc.)
preserved for backward compat. Devlog entries kept as historical.

Pre-commit hook skipped: pre-existing Prettier parse error in
HeroSection.astro + ESLint OOM on 1900+ files. Changes are pure
search-replace, no logic modifications.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 20:00:13 +02:00
Till JS
a787a27daa feat(timeblocks): unified recurrence engine with rrule.js
Core recurrence engine:
- Add rrule.js dependency for RFC 5545 RRULE expansion
- recurrence.ts: expandRule(), materializeRecurringBlocks(30 days),
  regenerateForBlock(), cleanupFutureInstances(), deleteAllInstances()
- Virtual expansion: expandTemplatesVirtually() for calendar views >30 days
- HabitSchedule ↔ RRULE bidirectional conversion

Schema:
- Dexie v4: add parentBlockId, recurrenceDate, isRecurrenceException
  to timeBlocks with [parentBlockId+recurrenceDate] compound index
- LocalTimeBlock + TimeBlock types updated

Module changes:
- Todo: remove recurrenceRule from LocalTask/Task (lives on TimeBlock)
- Calendar: add parentBlockId to CalendarEvent, repeat icon on EventCard
- Startup: materializeRecurringBlocks(30) runs on calendar layout mount

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 19:49:57 +02:00
Till JS
92d8275704 feat(manacore/web): complete mobile responsiveness for all modules and shared components
ListViews (25 remaining modules):
- All module ListViews now have responsive container padding (p-3 sm:p-4)
- All interactive items have min-h-[44px] touch targets on mobile
- Picture/Moodlit grids: grid-cols-2 on mobile, grid-cols-3 on desktop

DetailViews (17 modules):
- All DetailViews have reduced padding on mobile (0.75rem vs 1rem)
- All buttons, inputs, selects have min-height: 44px on mobile

Modals (14 components):
- Shared Modal.svelte: bottom-sheet pattern on mobile (slides up from bottom)
- 13 app-specific modals: same bottom-sheet treatment
- Reduced padding, larger close buttons, max-h-[95vh] on mobile

Shared UI components:
- GlobalSpotlight: bottom-sheet on mobile, prevents iOS zoom, hides keyboard hints
- PillDropdown: full-width bottom-sheet on mobile with backdrop
- AppDrawer: 44px touch targets on buttons and search
- TagStrip: 44px min-height on all pill buttons
- ToastContainer: larger touch targets, safe-area positioning

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 18:24:07 +02:00
Till JS
a5f5c8b63f feat(timeblocks): cross-module drag & drop + activity feed widget
Cross-Module Drag & Drop:
- WeekView day columns accept 'task' and 'habit' drops
- Dropping a task auto-schedules it on that day (creates TimeBlock)
- Dropping a habit creates a logged block on that day
- HabitTile now has dragSource (long-press to drag)

Activity Feed:
- ActivityFeedWidget shows the 10 most recently updated timeBlocks
- Shows type icon, title, action label (running/completed/planned), time ago
- Registered as 'activity-feed' dashboard widget
- i18n keys added (de + en)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 17:55:12 +02:00
Till JS
105f99459e feat(timeblocks): analytics dashboard + iCal export
Analytics:
- analytics.ts: breakdownByType, breakdownByProject, dailyStats,
  habitHeatmap, planAdherence, productiveStreak
- /timeline/analytics route: summary cards (total hours, streak,
  plan adherence, entries), type breakdown bars, daily chart,
  habit heatmap (90 days), plan vs reality stats
- Period selector (7/14/30 days)

iCal Export:
- ical-export.ts: generateICalendar, downloadICalendar (RFC 5545)
- VEVENT per TimeBlock with custom X-MANACORE properties
- Export button in CalendarHeader (respects type filters)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 17:28:25 +02:00
Till JS
98dbcefe90 feat(manacore/web): add responsive mobile styles for PWA readiness
Navigation:
- PillNavigation: icon-only pills on mobile (<640px), 44px min touch targets
- QuickInputBar: tighter padding and smaller height on mobile
- Main content area: reduced padding on small screens (px-3 py-4)

Typography & Global:
- Responsive heading sizes (h1-h3 scale down on mobile)
- Safe-area body padding for PWA standalone mode

Module ListViews:
- Todo: 44px min-height task items, larger checkboxes on mobile
- Calendar: 44px min-height event cards, larger quick-add input
- Contacts: 44px min-height contact items
- Chat: min-h-[44px] conversation items, tighter container padding

Layout:
- SplitPaneLayout: stacks vertically on mobile (<768px), hides resize handle

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 17:23:24 +02:00
Till JS
63d3ba7e5e feat(timeblocks): focus mode, habit scheduling, smart slots, multi-type quick-create
Focus Mode:
- focusStore with Pomodoro timer (25min focus / 5min break / 15min long break)
- FocusCard component with circular progress ring and phase controls
- Creates type:'focus' and type:'break' timeBlocks (appear in calendar)

Habit Scheduling:
- HabitSchedule type: days[] + optional time
- Schedule UI in HabitForm (day picker circles + time input)
- generateScheduledBlocks() creates planned timeBlocks for the week
- logFromScheduled() links scheduled → logged blocks (plan vs reality)

Smart Scheduling:
- findFreeSlots() and findNextFreeSlot() queries in time-blocks/queries.ts
- SlotSuggestions component shows available slots inline
- Integrated in Todo DetailView for one-click task scheduling

Multi-Type Quick-Create:
- QuickEventPopover type selector pills (Termin / Zeiterfassung / Habit)
- Calendar page handles all 3 types: creates appropriate domain record + timeBlock
- Calendar pills hidden when creating non-event types

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 17:21:37 +02:00
Till JS
22e06ef803 feat(manacore/web): add PWA support with offline UX, update prompt, and icons
- Generate PWA icons (192x192, 512x512, apple-touch-icon) from favicon
- Add Apple PWA meta tags, theme-color, and viewport-fit=cover to app.html
- Upgrade caching preset to 'full' (adds font + CDN caching)
- Add manifest shortcuts for Dashboard, Todo, Calendar, Chat
- Switch registerType to 'prompt' for user-controlled updates
- Add OfflineIndicator component (offline banner + sync status badge)
- Add PwaUpdatePrompt component (detects waiting SW, skip-waiting on confirm)
- Add networkStore for online/offline + sync status tracking
- Wire sync manager status into networkStore for pending change counts
- Update offline page text to reflect local-first architecture
- Add mobile/desktop app strategy doc and Tauri v2 implementation plan

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 17:15:36 +02:00
Till JS
a1c3e99c7c feat(timeblocks): drag external items, conflict detection, plan vs reality, timeline view
- Drag & drop: external timeBlocks (tasks, habits, timeEntries) can now be
  dragged and resized directly in calendar views via updateBlock()
- Conflict detection: ConflictWarning component shows overlapping timeBlocks
  in EventForm and QuickEventPopover in real-time
- Plan vs Reality: startFromScheduled() creates linked logged blocks from
  scheduled blocks, EventCard shows checkmark badge for linked blocks,
  linkBlocks() now validates kind compatibility
- Timeline view: full-page /timeline route with chronological day view,
  day navigation, type filters, duration stats, live indicators, and
  connected dot+line visualization

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 17:10:04 +02:00
Till JS
ec96b1bc83 feat(habits+todo): duration field for habits, calendar scheduling for tasks
Habits:
- Add defaultDuration field to Habit type and domain model
- HabitForm: duration input (minutes) alongside target-per-day
- Logged habits with defaultDuration auto-set endDate on their TimeBlock

Todo:
- Task DetailView: "Kalender planen" button to schedule tasks on calendar
- Creates/updates/removes TimeBlock via scheduledBlockId
- Date + time inputs with one-click unschedule

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 16:52:44 +02:00
Till JS
7afc1620aa feat(dashboard): update CalendarEventsWidget for timeBlocks, add i18n for day-timeline
- CalendarEventsWidget now shows all timeBlock types with type icons
  and live indicators (was only showing calendar events before)
- Added day_timeline i18n keys in all 5 languages (de/en/es/fr/it)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 15:28:54 +02:00
Till JS
d4700a07f9 feat: rename mukke to music, add cover art upload via mana-media
Rename the music module from "Mukke" to "Music" across the entire
codebase: API routes, web app module, shared packages, search provider,
dashboard widgets, i18n keys, app registry, and route paths.

Add POST /api/v1/music/cover/upload endpoint that uploads cover art
images through mana-media for deduplication, thumbnails, and Photos
gallery visibility.

Dexie table names (mukkePlaylists, mukkeProjects) kept unchanged to
preserve existing IndexedDB data.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 15:25:34 +02:00
Till JS
ee7ff7d5e8 feat(dashboard): add "Mein Tag" timeline widget using timeBlocks
Chronological day timeline showing all timeBlocks for today across all
modules (events, tasks, habits, time entries). Shows summary stats
(total time, counts per type), live indicators for running timers,
and habit icons. Links to calendar for full view.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 15:19:53 +02:00
Till JS
2502d6241d feat(calendar): type-specific styling, filter UI, cross-module navigation
- EventCard: visual differentiation per blockType (task=checkbox, habit=icon,
  timeEntry=striped+clock, focus=dashed, live=pulse animation)
- CalendarHeader: filter toggle with chips for event/task/habit/timeEntry types
- Calendar page: clicking external items navigates to source module

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:47:12 +02:00
Till JS
8c8b3f80da fix(calendar): remove duplicate calendarViewStore import in WeekView
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:40:41 +02:00
Till JS
0aa0d7b135 feat(manacore/web): unified time model — timeBlocks for all time data
Introduces a central `timeBlocks` table that owns the time dimension
(start, end, recurrence, live status) for all modules. Calendar, times,
habits, and todo modules keep only domain-specific data with a
timeBlockId reference. The calendar becomes a universal time view
showing events, tasks, habits, and time entries from all modules.

Key changes:
- New `$lib/data/time-blocks/` module (types, service, queries, collections)
- Dexie schema v3 with timeBlocks table + migration from existing data
- Calendar events store creates TimeBlock + LocalEvent pairs
- Times timer uses TimeBlock.isLive instead of LocalTimeEntry.isRunning
- Habits logHabit creates point-event TimeBlocks (with optional duration)
- Todo scheduled tasks create TimeBlock via scheduledBlockId
- Calendar views filter by blockType, show items from all modules
- All calendar views use getItemColor() for cross-module color support

Also includes mukke → music module rename.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:39:00 +02:00
Till JS
5fd9c1d11e fix(manacore/web): resolve effect_update_depth_exceeded and Dexie transaction errors
- Replace $effect + liveQuery().subscribe() with useLiveQueryWithDefault
  in 6 dashboard modules (todo, calendar, contacts, habits, notes, finance)
  to prevent cascading $state writes exceeding Svelte 5 effect depth limit
- Defer checkInlineSuggestion in Dexie hooks via setTimeout to avoid
  cross-table reads within a single-table transaction scope
- Add 5s timeout to trySSO fetch calls so app loads in guest mode when
  mana-auth is unreachable
- Fix guestMode reactivity by declaring with $state()

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 10:38:57 +02:00
Till JS
502813f49c feat(api): route all image uploads through mana-media for CAS, thumbnails & Photos gallery
Picture, Contacts, Planta, Storage, and NutriPhi image uploads now go
through mana-media instead of directly to S3. This enables SHA-256
deduplication, automatic thumbnail generation, EXIF extraction, and
makes all images visible in the Photos gallery. Non-image files (PDFs,
audio, docs) continue to use shared-storage directly. SVG avatars in
Contacts also stay on shared-storage since Sharp can't process SVGs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 10:38:30 +02:00
Till JS
46dae20fa3 feat(manacore/web): localize app names with i18n (5 languages)
Add `apps` locale namespace (de/en/fr/it/es) with localized display
names for all 29 app modules. Workbench card titles, app picker, and
overlay headers now resolve names via $_('apps.{id}') with fallback
to AppDescriptor.name.

Key renames (de): Todo→Aufgaben, Habits→Routinen, Notes→Notizen,
Finance→Finanzen, Places→Orte, Mukke→Musik, Context→Dokumente,
Times→Zeiten, Cards→Karten, Picture→Bilder, Photos→Fotos,
Storage→Ablage, Questions→Recherche, CityCorners→Stadtführer,
Calc→Rechner.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 21:39:31 +02:00
Till JS
8218037841 feat: add shared Phosphor IconPicker, migrate habits from emoji to icons, add photos upload
- Add curated icon registry (73 Phosphor icons, 8 categories) in shared-icons
- Add DynamicIcon atom and IconPicker molecule in shared-ui
- Migrate habits module from emoji strings to Phosphor icon names
- Add Dexie version(2) migration for emoji→icon field rename
- Replace inline SVGs in habits with Phosphor components
- Add drag-and-drop photo upload to Photos workbench ListView
- Add blob: to CSP img-src for upload previews
- Add dev:media script and include mana-media in dev:manacore:servers
- Add ./toast export to shared-ui package.json

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 21:37:01 +02:00
Till JS
ebfc2facaa fix(manacore/web): redesign automations ListView for better readability
- Card-based layout for each automation with clear visual hierarchy
- Colored flow chips (WENN=blue, FILTER=amber, DANN=green) replacing
  hard-to-read inline text
- Clearer step-based create form with badge labels per section
- Better suggestion cards with icon, accept/dismiss buttons
- Toggle switch, name, and flow on separate lines
- Delete button only visible on hover
- Consistent spacing and typography

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 21:22:28 +02:00
Till JS
2f87cf9d9a feat(manacore/web): add unified context menu system for workbench and app pages
Adds right-click context menus to workbench cards, minimized tabs, PillNavigation,
and item-level context menus for todo, calendar, contacts, habits, notes, places,
and moodlit modules. Uses a shared builder pattern with app-specific actions
registered via AppDescriptor.contextMenuActions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 21:18:05 +02:00
Till JS
2dd0812757 feat(manacore/web): proactive automation suggestions (discovery + inline)
Two suggestion systems for cross-module automations:

1. Discovery: Automations ListView shows suggestion cards when it
   detects name overlaps between modules (e.g. "Basketball" habit +
   calendar events containing "Basketball"). Accept or dismiss.

2. Inline: When creating an event/task whose title matches a habit name,
   a toast appears: "Log habit 'Basketball' automatically?" with
   one-click activation. Auto-dismisses after 8s.

Both use simple case-insensitive string matching (min 4 chars).
Dismissed suggestions are persisted in localStorage.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 21:00:23 +02:00
Till JS
0f38a567fe feat(manacore/web): add automations module with UI for trigger rules
New workbench module for creating and managing cross-module automations.
Users can configure rules like "when calendar event with title containing
'Basketball' is created, log habit 'Basketball'".

UI includes: source picker (app/collection/op), condition builder
(field/op/value), action picker with dynamic params (e.g. habit select
dropdown), toggle enable/disable, delete.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 20:44:20 +02:00
Till JS
ee03782fde feat(manacore/web): add cross-module trigger registry for automations
New trigger system that listens to Dexie write operations and fires
configurable actions in other modules. Automations are stored in
IndexedDB and loaded at app startup.

Example: calendar event "Basketball" created → habit "Basketball" logged.

Architecture: Dexie hooks → fire() → registry → condition check → action
Actions are async fire-and-forget with loop prevention.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 20:38:41 +02:00
Till JS
7efe542dd1 chore: remove legacy migration and compat code (no users yet)
- traces: remove migrateLegacyLocationData() and legacy timestamp field
- context: remove legacy @[Title](ID) mention format support

No live users exist, so backwards compatibility is unnecessary.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:45:49 +02:00
Till JS
de910946dc chore(manacore): remove legacy per-app IndexedDB migration
No live users exist yet, so migrating from old per-app databases
(manacore-todo, manacore-calendar, etc.) to the unified DB is
unnecessary. Removes legacy-migration.ts and its invocation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:29:59 +02:00
Till JS
6a75f3fca1 fix(workbench): make page width responsive on mobile
Pages now adapt to the available screen width on mobile (<640px) instead
of overflowing at the fixed 480px default. Resize handle remains functional.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:18:08 +02:00
Till JS
543e7055b9 feat(manacore/web): add undo toasts to all 14 DetailViews + task completion
Extend undo toast coverage to all modules:
- Delete undo in cards, storage, presi, planta, inventar, skilltree,
  memoro, questions, uload, mukke, citycorners DetailViews
- Task completion toggle in todo ListView shows undo toast

All deletions can now be reversed within 5 seconds via "Rückgängig".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:55:30 +02:00
Till JS
81716725f2 feat(manacore/web): add undo toasts for delete and tag removal
Extend toast system with action buttons and toastStore.undo() helper.
After deleting a task/event/contact or removing a tag, a toast with
"Rückgängig" button appears for 5 seconds. Clicking it restores the
item (clears deletedAt) or re-adds the tag.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:50:32 +02:00
Till JS
a673a69972 feat(manacore/web): add overlay close animation + Escape key support
- Overlay fades out + scales down on close (150ms) instead of vanishing
- Escape key closes overlay (pops cross-detail, or closes all)
- All close paths use closeAllOverlays() for consistent animation
- Overlay stays visible during closing animation via `closing` state

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:42:02 +02:00
Till JS
3fa7073597 fix(docker): remove stale clock/packages/shared COPY from mana-web Dockerfile
Clock was archived/consolidated into Times but the Dockerfile still
referenced its shared package, breaking the Docker build.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:36:11 +02:00
Till JS
8f5727fd51 feat(manacore/web): add places module with GPS location tracking
New local-first places module for the workbench: browser Geolocation API
tracking, place management (CRUD, favorites, tags, categories), OSM map
preview in detail view, and proximity-based visit detection.

Also allows geolocation in Permissions-Policy header (self only).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:33:56 +02:00
Till JS
e17d6228e4 fix(manacore/web): fix getTagsByIds missing allTags param in zitare, fix TagDragData cast
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:20:34 +02:00
Till JS
09eef96ed8 fix(manacore/web): align notes and finance ListViews with workbench design system
Match todo/calendar/contacts patterns: hardcoded colors with dark mode
overrides, consistent button styles (transparent bg, hover states),
same padding/spacing/border-radius as existing ListViews.

Buttons are now clearly recognizable: primary (purple bg), ghost
(transparent with hover), danger (red on hover), filter tabs
(active state with colored bg).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:08:01 +02:00
Till JS
b63829ae4c fix(manacore/web): redesign notes workbench — compact input, click-to-edit
Replace bulky compose area with single-line quick-create (Enter to save).
Notes are directly clickable and open as inline editors in-place with
title, content, pin/delete actions, and Escape/Fertig to close.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:04:24 +02:00
Till JS
4ec4694f8f fix(manacore/web): make notes and finance workbench panels directly usable
Notes: always-visible compose field at top (title + content), expands
on focus, Cmd+Enter to save. Note list below.

Finance: always-visible quick-add with type toggle, amount + description
inline, category chips. No hidden button — ready to use immediately.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:02:00 +02:00
Till JS
c01eccb852 refactor(manacore/web): merge entity + app registries into unified AppDescriptor
Replace the dual registry system (app-registry.ts + entities/) with a
single AppDescriptor that contains identity, views, and entity fields.

- Create $lib/app-registry/ with types.ts, registry.ts, apps.ts, index.ts
- Merge all 27 app entries + 3 entity descriptors into one registry
- Move ViewProps from nav-stack.ts into app-registry/types.ts
- Update all 39 consumer files (ListViews, DetailViews, AppPage, etc.)
- Delete old files: entities/, app-registry.ts, nav-stack.ts, entity.ts

Single source of truth: one AppDescriptor per module, one registry.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:01:27 +02:00
Till JS
9abbf9c70d feat(manacore/web): add notes and finance modules
Notes: lightweight markdown notes with search, color tags, pinning,
inline create, auto-save editor, and grid/detail views.

Finance: income/expense tracking with categories, monthly overview,
category breakdown bars, quick-add form, and transaction history.

Both modules include workbench ListView, full-page routes, entity
descriptors for drag/drop, and database/sync registration.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:57:37 +02:00
Till JS
a8480f6710 fix(ui): allow multiple detail views open across AppPages
Previously, clicking a detail view in one AppPage would close the
overlay in all other AppPages because the global click handler closed
on ANY click outside the overlay card.

Now the click handler only closes the overlay when the click is
inside the SAME AppPage but outside the overlay card. Clicks in
other AppPages are ignored, allowing multiple detail views to be
open simultaneously side by side.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:48:25 +02:00
Till JS
df74029423 fix(manacore/web): fix cross-module drop — sync entity registration, lazy store imports
Entity registration was async (dynamic imports) so acceptedDropTypes
was always empty when $derived first evaluated. Now entities register
synchronously at import time. Store imports (Dexie, etc.) are deferred
to createItem() call time to avoid circular dependencies.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:42:31 +02:00
Till JS
66d61962b6 fix: add missing closing brace in PageShell CSS (.move-btn)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:38:12 +02:00
Till JS
18a94b9266 feat(manacore/web): clickable cross-module links with overlay stacking
Clicking a linked item in a DetailView opens the target app's DetailView
as a stacked overlay on top of the current one. Supports:
- Cross-app navigation (e.g. click linked event from todo detail)
- Back button to return to previous overlay
- Correct app color + title in overlay header
- Overlay stack with goBack() popping the top frame
- Added paramKey to EntityDescriptor for correct ID mapping

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:36:40 +02:00
Till JS
5828f60934 feat(manacore/web): add habits module with tally board, inline create, and detail view
New habit tracking module: define habits (emoji, color, daily target), tap to log with timestamp, view streaks and 7-day charts. Includes workbench ListView with inline creation, full-page detail view, and drag/drop entity integration.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:34:07 +02:00
Till JS
0af8c7cec6 fix(ui): make all drag bar icons always visible (not hover-only)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:30:20 +02:00
Till JS
339e3d344f feat(ui): move window controls (minimize, maximize, close) into drag bar
Window buttons now live in the drag handle bar alongside the move arrows,
appearing on hover. Header row is simplified to just icon + title.

Layout: ◀ ···drag··· [−] [□] [✕] ▶
All buttons appear on hover, close button has red hover state.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:28:37 +02:00
Till JS
ad9bbec393 feat(ui): add left/right arrow buttons to PageShell drag bar
Arrow buttons appear on hover at the left/right edges of the drag bar
to quickly reorder pages without dragging. Hidden when the page is
already first (no left arrow) or last (no right arrow).

- PageShell: onMoveLeft/onMoveRight props, CaretLeft/CaretRight icons
- AppPage: pass through move callbacks
- +page.svelte: handleMoveLeft/handleMoveRight with array swap + persist

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:25:51 +02:00
Till JS
2529c91d58 feat(manacore/web): show item title + app color in drag preview
DragPreview now accepts a resolveEntity callback that maps drag type
+ data to display info (title, app color, app name). Dragging a task
shows "Meeting mit Team · Todo" instead of just "task".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:24:58 +02:00
Till JS
a60799ddff fix(ui): reduce drag handle bar height
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:21:46 +02:00
Till JS
e8a4b984f3 fix(ui): full-width draggable header bar on PageShell
- Drag handle bar spans full width (not just the icon)
- Entire bar is draggable with grab cursor
- Subtle background color differentiates it from content (border-bottom)
- Hover/active states for visual feedback
- DotsSixVertical icon rotated 90° (horizontal grip lines)
- Dark mode support

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:20:53 +02:00