- 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>
- 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>
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>
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>
- 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>
- 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>
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>
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>
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>
- 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>
- 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>
- 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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
- 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>
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>
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>
- 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>
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>
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>
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>
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>
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>
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>
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>
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>
Created createManaAuthStore in @manacore/shared-auth-stores that replaces
~350 lines of duplicated auth.svelte.ts per app with a ~10 line factory call.
The factory handles: SSO, passkeys, 2FA, magic links, token management,
password reset, sign up/in/out — everything the old stores did.
Each app only provides devBackendPort and optional onAuthenticated callback.
Before: 21 apps × ~350 lines = 6,800 lines of duplicated auth code
After: 21 apps × ~10 lines = 182 lines total (97% reduction)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Merged shared-subscription-types + shared-subscription-ui into
@manacore/subscriptions. Updated imports in 15 web apps.
Package count: 49 → 47
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- New ViewEditorModal with form fields for name, icon, groupBy, layout,
and column configuration with inline color picker
- ViewSelector updated with "+" button to create views, three-dot menu
and right-click to edit active/any view
- Auto-generated column presets for status, priority, dueDate groupBy
- Custom columns mode for manual task grouping
- Live preview showing column layout (kanban or grid)
- Two-step delete confirmation
- Glass-morphism styling, dark mode, responsive
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>