Commit graph

2195 commits

Author SHA1 Message Date
Till JS
d044afec2f feat(status-page): add public status page at status.mana.how
- scripts/generate-status-page.sh: Shell-Script das VictoriaMetrics abfragt
  und eine statische HTML-Statusseite generiert (probe_success + response times)
- docker-compose.macmini.yml: mana-status-gen Container (Alpine, jq, curl)
  schreibt alle 60s nach /Volumes/ManaData/landings/status/
- docker/nginx/landings.conf: status.mana.how vHost mit Cache-Control: no-store
- cloudflared-config.yml: status.mana.how → localhost:4400

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 18:07:07 +02:00
Till JS
504f77a60c debug: log login error shape 2026-03-31 18:05:41 +02:00
Till JS
36922cc946 fix(mana-auth): robust email-not-verified detection
Better Auth throws APIError.from(FORBIDDEN, EMAIL_NOT_VERIFIED).
Check status 403, body.code, and lowercased message.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 18:01:24 +02:00
Till JS
38135ca8b9 fix(uload-web): add missing @tailwindcss/typography dependency
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:59:59 +02:00
Till JS
b1af506b99 fix(auth): surface email-not-verified error and detect needsVerification on signup
- mana-auth login route: catch Better Auth's email verification error and
  return 403 EMAIL_NOT_VERIFIED instead of 401 Invalid credentials
- shared-auth signUp: detect emailVerified:false in register response and
  return needsVerification:true so the UI shows the verification prompt
- shared-auth-ui LoginPage: map INVALID_CREDENTIALS error code to friendly message
- shared-i18n: add invalidCredentials translation (de/en)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:52:47 +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
23aa5e26ab fix(uload-web): add missing @tailwindcss/forms dependency
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:48:43 +02:00
Till JS
31d661cc61 docs(mac-mini): document uptime monitoring tools and Grafana dashboard
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:46:10 +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
402baf7c7f feat(monitoring): add uptime monitoring via Blackbox Exporter
- scripts/check-status.sh: parallel HTTP check aller mana.how Domains aus cloudflared-config.yml
- docker/blackbox/blackbox.yml: Blackbox Exporter Config (http_2xx, http_health Module)
- docker-compose.macmini.yml: blackbox-exporter Container (Port 9115, 32MB RAM)
- docker/prometheus/prometheus.yml: 4 Scrape-Jobs (blackbox-web, blackbox-api, blackbox-infra, blackbox-gpu)
- docker/prometheus/alerts.yml: 5 Alert-Regeln (WebAppDown, APIDown, InfraToolDown, GPUServiceDown, SlowHTTPResponse)
- docker/grafana/dashboards/uptime.json: Grafana Uptime-Dashboard mit Status-Tables und Verlauf
- package.json: check:status Script

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:43:25 +02:00
Till JS
bce533ca8b fix(uload-web): add missing svelte-i18n dependency
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:38:12 +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
03989976f2 fix(compose): change calc-web port from 5026 to 5031 (port conflict with zitare-web)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:30:00 +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
111a7e8cde fix(contacts): use elevated surface background for contact detail modal
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
d8a2b37126 chore(memoro): import legacy backend, mobile, and landing apps
Adds the original NestJS backends (backend, audio-backend), Expo mobile app,
and Astro landing page as-is from the standalone memoro repo. These are
not yet migrated to monorepo standards (migration tracked in memory/CLAUDE.md).

Also adds eslint.config.mjs ignore for apps/*/apps/audio-backend/**
and .prettierignore entries for legacy memoro dirs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:30:00 +02:00
Till JS
09d5576f2a feat(memoro): integrate memoro web app into monorepo (phases 1-6)
Structure: apps/memoro/apps/web, package name @memoro/web
Web tooling: adapter-node, Tailwind v4 + @manacore/shared-tailwind, Vite v6, shared PWA/vite-config
Auth: createManaAuthStore() from @manacore/shared-auth-stores, removed Google/Apple OAuth
Local-first: memoroStore with 7 collections + guest seed data (memos, tags, spaces, etc.)
Service layer: memoService + tagService migrated from Supabase direct to local-store collections
Workspace: dev:memoro:* scripts in root package.json, memoro added to CLAUDE.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 17:19:20 +02:00
Till JS
019ad557d4 fix(shared-pwa): remove favicon.png from default include assets
No ManaCore app provides favicon.png (all use favicon.svg). The default
caused prerender 404 errors for any app with an /offline page.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:19:04 +02:00
Till JS
1b0c46e7a2 fix(inventar-web): suppress prerender 404 for missing favicon.png
App only provides favicon.svg; the PWA plugin's default includeAssets
list also includes favicon.png which triggers a prerender error.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:04:49 +02:00
Till JS
6e75718cfa feat(arcade): migrate backend from NestJS to Hono/Bun
Replace @arcade/backend (NestJS) with @arcade/server (Hono/Bun).
Same two endpoints, no auth required (public game generator):
- POST /api/games/generate — AI game generation (Gemini, Claude, GPT)
- POST /api/games/submit  — Community game submission via GitHub PR
- GET  /health            — Health check

This removes the last remaining NestJS backend from the monorepo.
NestJS is now completely gone — all servers use Hono + Bun.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:02:14 +02:00
Till JS
7bc4db7e63 fix(builds): repair inventar settings import and add skilltree storage service
- inventar-web: fix mangled icon import in settings page
- skilltree-web: create missing lib/services/storage.ts for export/import
- startup.sh: add umami/synapse DB creation + synapse user setup with C locale

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 16:56:37 +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
708299b35e fix(startup): add Colima datadisk symlink safety check on boot
Prevents the internal SSD from filling up if the external SSD is not
mounted or if `colima delete` wiped the datadisk symlink.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 16:39:51 +02:00
Till JS
4fb851947e test(auth): add 68 unit tests for auth-ui, shared-auth, and shared-branding
- userAgent utils: parseUserAgent, getDeviceType, formatUserAgent (17 tests)
- guestWelcome utils: shouldShow, markSeen, reset (8 tests)
- jwtUtils: decodeToken, isTokenValid, getUserFromToken, B2B (27 tests)
- mana-apps: hasAppAccess, getTierLevel, getAccessibleManaApps (16 tests)

Also fixes iOS detection bug in userAgent parser (iPhone UA contains
"Mac OS X" — mobile check must come before desktop OS check).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 16:35:16 +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
d460c9ec07 feat(ecosystem-audit): add Tier 3 metrics (git activity, a11y, auth guard, docker)
Adds 4 new Tier 3 metrics to the ecosystem health audit script:
- Git Activity: % of apps with commits in the last 30 days (97%)
- A11y Indicators: alt-text coverage, role=dialog, focusTrap (36%)
- Auth Guard Coverage: AuthGate/authGuard presence per app (83%)
- Docker Readiness: Dockerfile present per app (80%)

Overall score updated from 74 → 72 (23 metrics, 135 total weight).
Dashboard at /manascore/ecosystem updated with new category rows.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 16:32:56 +02:00
Till JS
df1cd4bfa0 chore(calendar): remove showTasksInCalendar from localStorage migration
No existing users, so no need to clean up old localStorage keys.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 16:30:53 +02:00
Till JS
cea0c97889 fix(contacts): fix CSP blocking auth, broken contact detail modal, and missing click handler
- Add fallback URLs for connect-src in CSP (localhost:3001, :3015, :3050)
- Switch ContactDetailModal from HTTP API to IndexedDB (local-first)
- Add onclick handler to alphabet view contact cards
- Add stopPropagation on phone/email action links
- Accept non-UUID contact IDs in route regex for seed data

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 16:29:18 +02:00
Till JS
750a0c77ff refactor(calendar): remove todo integration entirely
Remove all todo/task-related code from the calendar web app:
- Delete todo API client, store, and all todo components
- Remove TodoSidebarSection, TodoDayCell, TodoRow, TaskBlock
- Remove useTaskDragDrop and useSidebarDrop composables
- Remove "Aufgaben" tab from PillNav and keyboard shortcuts
- Remove "Todo-Service ist nicht erreichbar" error banner
- Remove todo toggle from AgendaFilters, todo type from AgendaItem
- Remove PUBLIC_TODO_BACKEND_URL from server hooks
- Remove showTasksInCalendar from settings store
- Clean up i18n keys (priority, todo sections)
- Clean up help config (task shortcuts section)

Build passes successfully.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:25:34 +02:00
Till JS
e5c63f65fb fix(auth-ui): add focus traps to modals + aria-disabled on all buttons
- Add focus trap (Tab/Shift+Tab cycling) to AuthGateModal and
  GuestWelcomeModal with auto-focus on primary action
- Add aria-disabled to all disabled buttons across 8 components
  for proper screen reader announcements

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:22:25 +02:00
Till JS
201819280e feat(manascore): add Tier 2 ecosystem metrics
5 new metrics:
- Toast Consistency (100%) — all apps use shared toastStore
- Store Pattern (95%) — 176 Runes stores vs 9 old writable/readable
- Shared Types (62%) — shared-types imports vs local type files
- Dep Freshness (80%) — avg 37 deps per app
- Bundle Config (100%) — all apps have SvelteKit adapter

Ecosystem Health Score: 74/100 (19 metrics total)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:20:20 +02:00
Till JS
3b7b6c9761 refactor(auth-ui): SessionManager i18n, shared userAgent util, a11y fixes
- Add locale prop (de/en) to SessionManager with full English translations
- Extract duplicated parseUserAgent/getDeviceType to utils/userAgent.ts
- Fix hardcoded aria-label in SessionManager refresh button
- Add prefers-reduced-motion to PasskeyManager, TwoFactorSetup,
  SessionExpiredBanner

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:14:16 +02:00
Till JS
3fb1eddc04 feat(manascore): add security headers, skeleton loading, TODO count metrics
New metrics:
- Security Headers (76%) — apps with setSecurityHeaders() in hooks
- Skeleton Loading (76%) — apps with skeleton/loading state components
- TODO/FIXME Count (22 total) — technical debt info metric (not weighted)

Ecosystem Health Score: 72/100 (15 metrics total)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:13:04 +02:00
Till JS
f58a6d1d70 docs: document Ecosystem Health Score in about.md and CLAUDE.md
Add comprehensive documentation for the Ecosystem Health Score:
- 12 metrics explained with weights and measurement methods
- How each score is calculated
- How to improve each metric
- Script usage: node scripts/ecosystem-audit.mjs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:09:14 +02:00
Till JS
0c89400b5b feat(manascore): add 5 new ecosystem metrics
Expand ecosystem-audit with:
- Error Boundaries (54%) — +error.svelte + offline page per app
- TypeScript Strict (100%) — strict mode in all apps
- Test Coverage (72%) — apps with at least one test (111 files total)
- PWA Support (2%) — manifest + service worker
- Maintainability (0%) — files under 500 lines (38 files exceed limit)

Dashboard shows file size top offenders and apps without tests.
Overall score adjusted from 76 to 70 with rebalanced weights.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:06:29 +02:00
Till JS
5fa773d400 refactor(auth-ui): unify dark mode to CSS variables + .dark class pattern
Replace hardcoded colors and inconsistent dark mode patterns across
7 auth-ui components with semantic CSS variables (--theme-*).

- PasskeyManager: 24 :global(.dark) rules → CSS vars (kept semantic amber/red)
- TwoFactorSetup: flip from dark-default + :global(.light) → light-default + CSS vars
- ChangePassword: flip from :global(.light) → CSS vars, zero :global(.dark) rules
- SecurityOnboarding: flip from :global(.light) → CSS vars
- GuestWelcomeModal: convert @media prefers-color-scheme → :global(.dark) pattern
- SessionManager: replace hardcoded fallbacks with CSS vars
- AuditLog: replace all fallback patterns with CSS vars

Net: -451 lines / +180 lines of CSS

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:06:25 +02:00
Till JS
8437a4178f refactor: replace stale NestJS backend scripts with Hono server scripts
All app backends have been migrated to Hono/Bun servers — only
@arcade/backend remains on NestJS. This commit adds dev:*:local and
dev:*:server scripts for all apps, removes 15 stale :backend scripts,
25+ broken db:push/studio/seed aliases, and updates :full/:app commands
to use the new server + sync architecture.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 14:03:40 +02:00
Till JS
e6e8d42d0b feat(manascore): add ecosystem-audit script
Script scans the monorepo and generates ecosystem-wide consistency
metrics (icon adoption, modal usage, shared packages, etc.).
Outputs ecosystem-health.json for the Ecosystem Health dashboard.

Run: node scripts/ecosystem-audit.mjs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:59:09 +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
3b54d4d48e refactor(auth-ui): i18n, security fixes, type safety across auth components
- Add locale prop (de/en) to PasswordStrength, ChangePassword,
  SecurityOnboarding, AuditLog, AuthGate tier screen
- Add 13 new i18n keys to LoginTranslations for 2FA, lockout, magic link
- Fix date formatting to use locale in AuditLog
- Rewrite ForgotPasswordPage to Tailwind (matching Login/Register)
- Fix HTML injection in ForgotPasswordPage (remove @html with email)
- Guard DEV credentials behind isDevMode check in LoginPage
- Extend AuthResult type with twoFactorRedirect and retryAfter
- Remove as any casts in LoginPage
- Replace scoped CSS with Tailwind in AuthGate tier-denied screen

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 13:41:53 +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