Commit graph

303 commits

Author SHA1 Message Date
Till JS
bee8bcb234 feat(todo): add reminders with background worker and notification dispatch
Server: reminder-worker checks due reminders every 60s, dispatches via mana-notify, integrates shared-hono middleware and Zod validation for RRULE.
Web: ReminderSelector component, local-first reminder store, form integration.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 14:55:42 +02:00
Till JS
cb85fba820 feat(todo/web, shared-i18n): complete i18n for Todo web app + add missing common translations
Extract ~120 hardcoded German strings from 14 Svelte components into i18n locale
files using svelte-i18n $t() calls. Add new translation sections (taskForm, filters,
tags, subtasks, durationPicker, kanban, toolbar) across all 5 languages (de/en/fr/es/it).

Also add missing shared common translations for Spanish, French, and Italian
(150+ keys each) in packages/shared-i18n.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 14:19:48 +02:00
Till JS
1570cc0bb4 feat(shared-auth-ui): add GuestRegistrationNudge + complete feature texts + improve seed data
- Add GuestRegistrationNudge component: shows a floating banner after
  X minutes of guest usage to encourage sign-up (bottom-center, dismissible)
- Add guestNudge.ts utilities (session tracking, delay, dismiss via localStorage)
- Add feature texts for all 16 missing apps in GuestWelcomeModal
- Integrate nudge in Todo app as reference implementation (3min delay)
- Improve SkillTree seed: 3 skills across branches, 6 activities, 1 achievement
- Improve Zitare seed: 5 favorites, 2 themed lists instead of 1

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 12:16:55 +02:00
Till JS
4d0e9a6a3f feat: add Cmd+K spotlight actions to all 23 apps
Each app's PillNavigation now has spotlightActions with app-specific
quick actions (create, navigate, settings). Users can press Cmd+K / Ctrl+K
from any app to search apps, navigate, and trigger actions.

Apps: todo, calendar, contacts, chat, picture, clock, zitare, cards,
storage, manacore, mukke, presi, context, questions, photos, planta,
citycorners, guides, calc, moodlit, matrix, uload, arcade

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 12:11:34 +02:00
Till JS
3f0811043e feat(todo): refactor inline title editing + kanban subtask DnD
- TaskItem: switch title editing to <input>-based pattern (isEditingTitle
  state, single-click to start, blur/Enter saves, Escape cancels)
- KanbanTaskCard: contenteditable span for title editing (blur-to-save),
  add ArrowsOutSimple detail button (hover-only), inline subtask DnD
  with shadow placeholder handling and dropInProgress guard
- SubtaskList: fix DnD reactivity loop — use $state instead of $derived
  for items, add SHADOW_PLACEHOLDER_ITEM_ID filter, dropInProgress flag

fix(guides): remove non-existent allAppsHref prop from PillNavigation
fix(memoro): extend Memory interface with memo_id, timestamps, nullable types

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 22:23:31 +02:00
Till JS
5e4518b418 refactor(ui): unify LanguageSelector, ConfirmDialog, and AppSlider across apps
- contacts, zitare: migrate LanguageSelector to shared PillDropdown pattern
- context, times: replace local ConfirmDialog with ConfirmationModal from @manacore/shared-ui
  - delete local ConfirmDialog.svelte in both apps
  - map open→visible, onCancel→onClose, remove destructive prop (default in shared-ui)
- calendar, chat, contacts, presi, todo: switch AppSlider from static MANA_APPS
  to getActiveManaApps() to filter inactive apps consistently

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 19:10:55 +02:00
Till JS
3ea2c03ab2 feat(todo): inline title editing + detail modal button on task items
- Title already had contenteditable; now shows clear focus ring (primary tint)
  when active so it's obvious the title is being edited
- Added ArrowsOutSimple icon button at the right end of each task row
  (appears on hover) that opens the full TaskEditModal
- Modal wired up with save/delete/close handlers
- Fixed all remaining hardcoded colors in TaskItem to use CSS vars
  (checkbox checked/animating, drag handle, due date, meta, form inputs,
  expanded wrapper border, btn-danger, assignee dot)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 19:06:55 +02:00
Till JS
838b4c13de refactor(ui): apply elevation system across todo, contacts, calendar, clock apps
Replace all hardcoded hex/rgba colors with CSS custom properties throughout
the todo web app and fix modal backgrounds in contacts, calendar, and clock.
Removes all redundant :global(.dark) overrides — CSS vars handle both modes.

- todo: TaskEditModal, SubtaskList, TagStrip, TagStripModal, SyncIndicator
- todo: FokusLayout, GridLayout, KanbanLayout, ViewColumn (drop targets, add-column cards)
- todo: ViewSelector, ViewColumnHeader, ViewEditorModal, TodoToolbarContent
- todo: QuickAddTask, TagSelector, KanbanTaskCard, +layout (FAB)
- todo: DurationPicker, StorypointsSelector, FunRatingPicker, PrioritySelector
- contacts: NewContactModal background + remove Schnelleingabe quick input
- calendar: EventDetailModal, VoiceRecordingModal backgrounds
- clock: AuthGateModal background

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 19:00:24 +02:00
Till JS
f79ad1773a refactor(todo): simplify to single Fokus view, remove Übersicht/Matrix tabs
- Remove Fokus/Übersicht/Matrix view tab group from PillNavigation
- Remove /kanban redirect and activeLayoutMode switching logic
- Hardcode layoutOverride to 'fokus' in +page.svelte
- Fix currentPath reference error after redirect block removal

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 18:29:24 +02:00
Till JS
999c54a5a1 fix(todo): scrollable sheet body + subtasks animate complete with parent
FokusLayout:
- Wrap DnD zone, footer, and completed-today in .sheet-body
- .sheet-body is the scroll container (flex:1, overflow-y:auto)
- .sheet-content no longer manages scroll — allows scrolling to
  the "Heute erledigt" section below the main task list

KanbanTaskCard:
- Inline subtasks all appear as done (checked + strikethrough) during
  the parent's completing animation via isAnimatingComplete flag
- Subtask clicks blocked during animation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:50:22 +02:00
Till JS
a22f1de6d0 feat(todo): complete animation + "Heute erledigt" section on focus pages
KanbanTaskCard:
- Checkbox click animates first (checkPop 300ms, fade to 50% opacity)
- After 500ms the actual onToggleComplete fires and task moves
- Modal cannot open during animation (pointer-events: none)

FokusLayout:
- Derives completedToday from tasks context (isCompleted + completedAt today)
- Shows "Heute erledigt" section at bottom of every sheet
- New items slide in from above (slideDown 350ms animation)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:45:22 +02:00
Till JS
420bf07520 design(todo): wrap task and subtask titles instead of truncating
- Remove white-space: nowrap / overflow: hidden / text-overflow: ellipsis
- Titles wrap to multiple lines so all content is always readable
- align-items: flex-start on card and subtask rows so checkbox
  and priority dot stay aligned to the first text line (margin-top: 0.2rem)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:36:31 +02:00
Till JS
adfcc7dcee design(todo): paper-style task cards — no border/bg, text-proportional checkboxes
- Remove card border, background, shadow, backdrop-filter, border-radius
- Tasks render as plain text directly on the page background
- Priority dot: slim 3px left accent instead of round dot
- Main checkbox: 1.1rem circle matching title font size
- Title: 0.9375rem regular weight, uses CSS var for theme color
- Subtasks: same size as title (0.9375rem), same checkbox size
- Subtask indent calculated from priority-dot + gaps + checkbox width
- Vertical connecting line aligned to checkbox center

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:34:21 +02:00
Till JS
2a00310273 fix(todo): use \$state.snapshot() for subtask toggle to avoid DataCloneError
Svelte 5 \$state creates deep reactive Proxy objects. IndexedDB can't
serialize Proxies via structured clone algorithm. Using \$state.snapshot()
produces plain objects that IndexedDB can store.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:31:35 +02:00
Till JS
cbe877c3c9 fix(todo): prevent DnD from blocking subtask clicks in KanbanTaskCard
svelte-dnd-action intercepted pointerdown on .task-card-wrapper items,
which interfered with clicks on the inline subtask buttons. Stopping
pointer event propagation on the subtasks container prevents DnD from
treating subtask clicks as drag interactions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:30:01 +02:00
Till JS
6496d90097 feat(todo): add inline subtasks to KanbanTaskCard (Fokus layout)
Subtasks now show directly below each task card on the homepage,
indented with a vertical connecting line, directly checkable.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:30:00 +02:00
Till JS
b37df6facf feat(todo): redesign task detail modal + add inline subtasks
- Redesign TaskEditModal as a multi-column page-like layout:
  - Title (large, borderless textarea with autoGrow)
  - Content grid: description (left) | subtasks + links (right)
  - Props strip: all metadata as horizontal flex-wrap cells (status,
    priority, due date, recurrence, tags, assignee, story points, etc.)
  - No sidebar, no scrollable property list
- Remove redundant `notes` field from TaskMetadata (keep only `description`)
- Remove all legacy migration code from useTaskForm composable
- Add inline subtasks display to TaskItem on the homepage:
  - Shown indented under parent task when task has subtasks and is incomplete
  - Each subtask is directly checkable (toggleSubtask via onSave callback)
  - Vertical connecting line via CSS pseudo-element

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:30:00 +02:00
Till JS
e5ca208cd8 feat(contacts): add context menu to alphabet/grid views with icons, add icons to todo context menu
- Add right-click context menu to ContactAlphabetView (was missing entirely)
- Add icons to ContactGridView context menu items
- Wire up onDeleteContact through ContactList to both views
- Add icons to TaskList (todo) context menu: edit, complete, priority, delete

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 16:55:29 +02:00
Till JS
ab387b9b3d chore: remove all NestJS backend references, replace with Hono/Bun
- Delete nestjs-backend.md guideline (replaced by hono-server.md)
- Delete Dockerfile.nestjs-base and Dockerfile.nestjs templates
- Delete stale BACKEND_ARCHITECTURE.md doc (NestJS-era, obsolete)
- Update CLAUDE.md, GUIDELINES.md, authentication.md to Hono/Bun first
- Update all app CLAUDE.md files: backend/ → server/, NestJS → Hono+Bun
- Update all app package.json files: @*/backend → @*/server
- Update docs: LOCAL_DEVELOPMENT, PORT_SCHEMA, ENVIRONMENT_VARIABLES,
  DATABASE_MIGRATIONS, MAC_MINI_SERVER, PROJECT_OVERVIEW
- Update scripts: generate-env.mjs, setup-databases.sh, build-app.sh
- Update CI/CD: cd-macmini.yml backend → server paths
- Update Astro docs site: @chat/backend → @chat/server

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 16:52:25 +02:00
Till JS
ed9672ef2b refactor(todo): remove projects concept, unify views with Fokus/Übersicht/Matrix
- Remove LocalProject, projectId from all tasks, and project-related stores/queries
- Add 'fokus' layout mode to LocalBoardView; activeLayoutMode setting in settings store
- Build FokusLayout.svelte: scroll-snap paper sheets with cross-page DnD ('task-dnd')
- Inline column edit mode: ViewColumnHeader with color picker popup, rename, reorder, delete
- Add "Neues Board" placeholder as last column in all layout modes
- PillNav now state-based (Fokus/Übersicht/Matrix tabs) instead of route-based
- Unified filter strip: merge TagStrip + FilterStrip with "Tags:" and "Filter:" label pills
- Fix all 3 test files after project removal; 100/100 tests passing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 16:34:51 +02:00
Till JS
41ca11eddc feat(todo): inline "Neues Board" card as last column in all layouts
Replace the toolbar add-column button with an inline placeholder card
that appears as the last column/sheet in the board when in edit mode.
Styled with dashed border and + icon, matching each layout's aesthetic.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:58:01 +02:00
Till JS
dc4ba0a39c feat(todo): color picker popup on column dot instead of inline swatches
In edit mode, the color dot stays in its normal position but gets a
purple ring to indicate it's clickable. Clicking opens a popup with:
- 16 preset color swatches in a 4x4 grid
- Native color picker for custom colors
- Click outside to dismiss

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:49:16 +02:00
Till JS
1926c6b1f2 feat(todo): inline column editing in board headers, remove separate editor
Move column editing (color, name, reorder, delete) directly into each
column/sheet header. In edit mode, ViewColumnHeader shows color dots,
name input, and action buttons inline. Add column button in toolbar.

- ViewColumnHeader: edit mode with color picker, name input, move/delete
- Props flow: page → BoardViewRenderer → Layout → ViewColumn → Header
- Remove separate column-editor bar from page
- Narrower Fokus sheet widths (360/480/640/840px)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:43:47 +02:00
Till JS
c3bee2607b refactor(todo): extract shared useTaskForm composable
Extract 16 duplicated $state declarations, form initialization logic,
and save/buildUpdateInput from TaskItem and TaskEditModal into a shared
useTaskForm.svelte.ts composable. Uses getter/setter pattern for
Svelte 5 bind:value compatibility.

Eliminates ~200 lines of duplicated form state management.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:34:52 +02:00
Till JS
4f8209fd5a feat(todo): add inline layout editor to homepage
When the Layout pill is toggled, an inline editor appears above the board:
- View name input, groupBy selector, page width (S/M/L/XL)
- Column editor with color picker, name input, reorder, delete, add
- Changes apply live to the board below
- Escape exits edit mode

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:33:30 +02:00
Till JS
27cd84ca90 feat(todo): inline layout editor replacing ViewEditorModal
Replace the modal-based view editor with an inline editor that appears
directly on the page when the Layout pill is toggled:

- Edit toolbar: view name input, groupBy selector pills, page width (S/M/L/XL)
- Column editor: color picker, name input, reorder arrows, delete, add column
- Changes are applied live and visually reflected in the board below
- Escape key exits edit mode
- Remove ViewEditorModal from layout (no longer needed)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:31:33 +02:00
Till JS
84653837a0 refactor(todo): replace Mehr dropdown with inline project pills, add Filter label
- Add "Filter:" label pill before priority filter pills
- Replace Mehr dropdown with inline project pills (colored, toggleable)
- Add dividers between sections (tags | filter/priorities | projects | sort)
- Remove unused dropdown code and DotsThree import

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:14:57 +02:00
Till JS
3211878ae0 feat(todo): add clickable Tags label pill linking to /tags management
Add a "Tags:" label pill before tag chips in the filter strip that
navigates to the tag management page. Shows even with no tags so
users can discover the feature.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:11:57 +02:00
Till JS
bc1788941f refactor(contacts,todo): extract shared utilities, eliminate duplication
Contacts:
- Extract getDisplayName() + getInitials() to lib/utils/contact-display.ts
  (was duplicated across 7 files)
- Export UNKNOWN_CONTACT_NAME constant

Todo:
- Extract getSubtaskProgress() to lib/utils/task-helpers.ts
  (was duplicated in TaskItem + KanbanTaskCard)
- Add formatDateForInput() + dateInputToISO() to date-display.ts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:10:55 +02:00
Till JS
52e09e4ac0 refactor(todo): merge TagStrip into unified filter strip
Combine the separate TagStrip and FilterStrip into one unified filter
bar. Tag chips now appear as colored pills alongside priority filters,
sort options, and completed toggle — all toggled by a single Filter pill.

- Add showTags prop + tag chip rendering to TaskFilters strip variant
- Remove TagStrip component usage and Tags pill from PillNav
- Remove showKanbanNav (dead /kanban reference)
- One pill, one strip, no duplication

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:07:34 +02:00
Till JS
101f20ec34 refactor(todo,calendar): extract duplicated constants and utilities
Todo:
- Extract priority colors to lib/constants/priority.ts (was in TaskItem + KanbanTaskCard)
- Extract formatDueDate to lib/utils/date-display.ts (was in TaskItem + KanbanTaskCard + task-parser)
- Extract withErrorHandling to lib/stores/store-helpers.ts (was in 3 stores)

Calendar:
- Extract formatTime, snapToGrid, getDayFromX, getMinutesFromY to lib/utils/drag-helpers.ts
  (was duplicated across 4 drag/drop composables)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:01:00 +02:00
Till JS
74ff066050 simplify(todo): single view with edit mode, remove ViewSelector
Replace multi-view system with a single active board view. The Layout
pill in PillNav now opens the ViewEditorModal to edit columns/grouping
directly. No more ViewSelector strip or view switching — just one
clean view with an editable layout.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 12:51:44 +02:00
Till JS
59e535af94 refactor(todo): move ViewSelector behind Layout pill, simplify homepage
- Move board view management (ViewSelector, activeViewId, ViewEditorModal)
  from +page.svelte to +layout.svelte
- Layout pill in PillNav now toggles ViewSelector strip visibility
- +page.svelte reduced to minimal BoardViewRenderer with context-provided view
- Provide activeView via Svelte context from layout
- Fix broken import in TaskItem.svelte (linter artifact)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 12:41:28 +02:00
Till JS
504e7756a7 refactor(apps): automated SVG-to-Phosphor migration across all apps
Script-based migration of inline SVG icons to Phosphor components.
Covers todo, manacore, mukke, chat, zitare, times, citycorners,
inventar, uload, playground, presi, picture, moodlit, storage, news,
wisekeep, clock, matrix, manadeck, skilltree, and photos.

~190 SVGs replaced across 115 files. Remaining SVGs are spinners,
brand logos, or decorative/chart SVGs that don't map to Phosphor.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 12:35:17 +02:00
Till JS
f58d58ff99 refactor(apps): replace inline SVGs with Phosphor icons across 19 apps
Migrate inline SVG icon paths to Phosphor components in chat, zitare,
times, citycorners, inventar, manacore, todo, playground, presi, and
more. Part of repo-wide icon unification effort.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 12:18:20 +02:00
Till JS
3f2e6a3ee5 feat(todo): unify view modes into single route with Fokus/Übersicht/Matrix layouts
Consolidate the two separate view systems (homepage paper pages + /kanban board)
into one unified system on `/`. All three layout modes (Fokus, Übersicht, Matrix)
share the same LocalBoardView data model and BoardViewRenderer, with layout
switching via PillNav tabs instead of route navigation.

- Add FokusLayout component (scroll-snap paper sheets with DnD)
- Add activeLayoutMode setting (fokus/uebersicht/matrix)
- Add layoutOverride prop to BoardViewRenderer
- Rewrite homepage to use BoardViewRenderer + ViewSelector
- Unify DnD type to 'task-dnd' across all layouts
- Convert PillNav from route-based to state-based view switching
- Delete /kanban route (redirect to / with uebersicht mode)
- Update PWA shortcuts, settings, onboarding, help content

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 12:03:58 +02:00
Till JS
a545bb6d2f refactor(todo): move edit button from FAB to PillNav, share state via context
- Remove floating edit FAB from +page.svelte
- Add "Layout" pill (grid icon) to PillNav, only visible on homepage
- Share editMode state between layout and page via Svelte context
- Label toggles between "Layout" and "Fertig" when active
- Escape key exits edit mode

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 11:02:19 +02:00
Till JS
69915a7ca0 feat(todo): horizontal paper pages with inline edit mode
- Each section (priority/date) is its own paper sheet, scrollable horizontally
- Edit FAB (pencil icon, bottom right) toggles inline page editor
- Edit mode: rename pages, configure icon/filters/priorities per page,
  reorder with arrow buttons, add/remove pages
- Three page modes: priority (Eisenhower), date, custom
- Page width selector (S/M/L/XL) visible only in edit mode
- 10 configurable page icons
- Settings stores pageMode, pageWidth, customPages in localStorage
- Fix structuredClone error with Svelte proxies (use JSON round-trip)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 22:39:46 +02:00
Till JS
0d6005dbcc fix(inventar): import FeedbackPage from @manacore/feedback, not shared-ui
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 21:56:19 +02:00
Till JS
b737240ec1 feat(auth): add access tier system for phased app releases
Introduces a tiered access control system so apps can be released
gradually (founder → alpha → beta → public) without extra infrastructure.
Users are gated at the AuthGate level based on their tier vs the app's
requiredTier. All apps remain deployed and reachable, but only users
with sufficient tier can enter.

- Add accessTier enum + column to users schema (default: 'public')
- Add tier claim to JWT payload in better-auth config
- Add requiredTier field to ManaApp interface + all 25 apps
- Add hasAppAccess(), getAccessibleManaApps(), ACCESS_TIER_LABELS
- Update AuthGate with tier check + access denied screen
- Update getPillAppItems + Home page to filter by user tier
- Update all 22 app layouts to pass user tier to PillNav
- Add admin API: GET/PUT /api/v1/admin/users/:id/tier
- Document access tier system in CLAUDE.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 21:50:06 +02:00
Till JS
4a5fe3bee8 feat(ux): notepad design, keyboard navigation, contenteditable across todo/calendar/contacts
Todo: Notepad redesign (A4 width, lined paper, red margin), contenteditable titles,
Arrow/Tab navigation between tasks, circular navigation with QuickInputBar,
debug borders (Ctrl+Shift+D), removed hover effects, collapsed completed section.

Calendar Agenda: contenteditable event titles, Arrow/Tab navigation, circular
navigation with InputBar, removed hover effects, separate detail button.

Contacts Alphabet: contenteditable contact names, Arrow/Tab navigation, circular
navigation with InputBar, removed card hover, avatar as detail button.

Guidelines: new sections for list navigation, contenteditable patterns, debug borders.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 21:37:56 +02:00
Till JS
8049a53a2b fix(todo): fix DnD reorder flicker and remove project dot indicator
- Replace key-based sync with ID-set comparison to prevent $effect from
  reverting drag-and-drop reorders; use dropInProgress flag with 1s timeout
- Add proper dnd-shadow-placeholder div instead of filtering SHADOW_PLACEHOLDER_ITEM_ID
- Remove project dot from TaskItem (redundant visual indicator)
- Reduce content-wrapper padding (1rem → 0.5rem mobile, 1.5rem → 1rem desktop)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 19:37:42 +02:00
Till JS
7f2b9f893b docs(todo,calendar): document smart duration settings
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 15:02:53 +02:00
Till JS
fbe3c955e3 feat(shared-links): add ManaLinkPicker for cross-app search and linking
New modal component that searches across app databases (calendar events,
contacts) and creates bidirectional links with cached display data.

Integrated into Todo's TaskEditModal with "+ Verknüpfen" button.
Search uses debounced text matching against IndexedDB records with
lazy-initialized cross-app readers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 10:56:44 +02:00
Till JS
06e5d9e22b feat(todo,calendar): auto-apply smart duration, add settings toggle
Duration estimation now auto-applies without requiring a button click.
When no explicit duration is typed, the system uses history-based
estimation (weighted by project/calendar, title, labels) with the
configurable default as fallback. Both apps get a "Smarte Dauer" toggle
and default duration picker in Settings. The learned duration improves
over time as more tasks/events are completed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 10:52:51 +02:00
Till JS
2222ce25e5 feat: add @manacore/shared-links for cross-app record linking
New shared package enabling bidirectional links between records across
apps (e.g. todo→calendar, task→file). Each link creates a forward+reverse
pair sharing a pairId for efficient queries from both sides. Stored in
dedicated IndexedDB (manacore-links), synced via mana-sync.

Includes: types, store, mutations, reactive queries, cached display data
resolvers, ManaLinkBadge and ManaLinkList UI components.

Integrates into Todo app as first consumer — link store initialized in
layout, ManaLinkList rendered in TaskEditModal.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 01:02:42 +02:00
Till JS
f06c98709a feat(todo): add duration extraction, multi-task splitting, and time estimation
Extend the natural language parser with duration recognition (30min, 2h,
1.5 Stunden), multi-task splitting on keywords (danach, dann, ;) with
context inheritance (date/time/project), and a history-based time estimator
that suggests durations from similar completed tasks. QuickAdd now shows
a live parse preview and duration suggestion. All features run offline
against IndexedDB — no AI/API calls needed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 19:59:02 +02:00
Till JS
16367384c7 fix(docker): use --no-frozen-lockfile in all web Dockerfiles
After extensive package restructuring (deletions, consolidations, new
packages), the frozen lockfile causes resolution failures in Docker.
Use --no-frozen-lockfile until lockfile stabilizes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 21:12:03 +01:00
Till JS
d9e2aeff99 fix(todo): homepage loading state + completed date on task items
Homepage fixes:
- Add loading state: show TaskListSkeleton while liveQuery loads
- Fix $derived(() => ...) anti-pattern → $derived.by()
- Stabilize date calculations (compute once, not per re-render)
- Remove double error check (mutation errors shown via toast)

TaskItem improvements:
- Show completed-at date (small, 50% opacity) on right side of
  completed tasks
- Click completed date to toggle showing created-at date above it

Shared: Add `loading` field to useLiveQueryWithDefault (was missing,
prevented proper loading states in consumers)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 18:15:26 +01:00
Till JS
a81a1535f6 perf(web): disable SSR for all local-first apps
All 15 local-first apps now use CSR-only (ssr=false in +layout.ts).
Since all data comes from IndexedDB (not server), SSR adds unnecessary
roundtrip latency (~3-4s FCP improvement expected).

Apps affected: todo, calendar, clock, contacts, zitare, skilltree,
citycorners, inventar, photos, mukke, planta, presi, storage,
context, questions.

Chat and manacore keep SSR for SEO.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 18:14:57 +01:00