Commit graph

397 commits

Author SHA1 Message Date
Wuesteon
a150a82c11 Merge main into dev - sync with latest Docker/CI fixes 2025-12-25 21:19:02 +01:00
Wuesteon
7b365ed05c 🐛 fix(docker): remove unnecessary build step for todo shared package
The @todo/shared package exports TypeScript source files directly
(no build script). The backend's build process handles compiling
these TypeScript files, so we don't need a separate build step.

Fixes Docker error:
ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL  Command "build" not found

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-25 21:09:27 +01:00
Wuesteon
8a6fe7ebb0 🔧 fix(ci): fix todo-backend build and remove obsolete clock app
- Fix todo-backend Dockerfile to build shared packages inline instead of
  using non-existent docker/shared/build-shared-packages.sh script
- Remove clock-backend and clock-web from all CI/CD workflows (app no
  longer exists in the monorepo)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-25 19:35:41 +01:00
Wuesteon
304897261d test: implement comprehensive automated testing system with daily CI/CD
Implement rock-solid automated testing infrastructure for mana-core-auth
with daily execution, notifications, and comprehensive monitoring.

Test Suite Improvements:
- Fix all 36 failing BetterAuthService tests (missing service mocks)
- Add 21 JwtAuthGuard tests achieving 100% statement coverage
- Create silentError helper to suppress intentional error logs
- Fix Todo backend TaskService test structure
- Add jose mock for JWT testing
- Configure jest collectCoverageFrom for mana-core-auth

GitHub Actions Workflow:
- Daily automated test execution (2 AM UTC + manual trigger)
- Matrix parallelization across 6 backend services
- PostgreSQL and Redis service containers
- Coverage enforcement (80% threshold)
- Multi-channel notifications (Discord, Slack, GitHub Issues)
- Support for success notifications (opt-in)

Test Infrastructure:
- Coverage aggregation across multiple services
- Flaky test detection with 30-run history tracking
- Performance metrics tracking with regression detection
- Test data seeding and cleanup scripts
- Comprehensive test reporting with formatted metrics

Documentation:
- TESTING_GUIDE.md (4000+ words) - Complete testing documentation
- AUTOMATED_TESTING_SYSTEM.md - System architecture and workflows
- DISCORD_NOTIFICATIONS_SETUP.md - Discord webhook setup guide
- TESTING_DEPLOYMENT_CHECKLIST.md - Pre-deployment verification
- TESTING_QUICK_REFERENCE.md - Quick command reference

Final Result:
- 180/180 tests passing (100% pass rate)
- Zero console errors in test output
- Automated daily testing with rich notifications
- Production-ready test infrastructure
2025-12-25 19:12:27 +01:00
Wuesteon
5b7d3c649b 🔧 chore: enforce monorepo best practices with automated validation
Fix critical issues and add validation to prevent future violations:

**Fixes:**
- Remove turbo recursion in 5 app packages (infinite loop risk)
- Add "private": true to 11 packages (prevent accidental publishing)
- Rename @mana-core/nestjs-integration → @manacore/nestjs-integration
- Remove prepublishOnly scripts from 3 private packages

**New:**
- Add scripts/validate-monorepo.mjs with 4 critical checks
- Add validate:monorepo command to package.json
- Integrate validation into CI pipeline (.github/workflows/ci.yml)
- Document validation in CLAUDE.md

All 80 package.json files now pass validation 

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-25 17:57:00 +01:00
Wuesteon
079b55a796 delete old apps due to context pollution 2025-12-25 17:23:14 +01:00
Wuesteon
9bba76133b fix todo backend docker file 2025-12-25 17:07:55 +01:00
Wuesteon
42bb44b747 Merge branch 'till-dev' into dev 2025-12-24 22:49:01 +01:00
Wuesteon
bb4189f942 Merge branch 'dev' into till-dev 2025-12-19 19:29:29 +01:00
Wuesteon
834b11d1d1 🐛 fix(staging): add missing PUBLIC_*_CLIENT env vars for runtime config
Web apps use hooks.server.ts to inject window.__PUBLIC_*__ variables at
runtime, but docker-compose.staging.yml was only setting vars for
docker-entrypoint.sh config.json. This caused web apps to fall back to
localhost URLs in production.

Changes:
- Add PUBLIC_*_CLIENT env vars for all staging web apps
- Update calendar-web hooks.server.ts to inject contacts API URL
2025-12-19 03:26:59 +01:00
Wuesteon
4d15d9e764 🔒 security(auth): migrate to EdDSA JWT and add automated monitoring
BREAKING: JWT keys are now auto-managed by Better Auth (EdDSA/Ed25519)
- Remove all JWT_PRIVATE_KEY, JWT_PUBLIC_KEY, JWT_SECRET references
- Keys stored in auth.jwks database table (auto-generated on first run)
- Delete obsolete generate-keys.sh and generate-staging-secrets.sh scripts
- Clean up legacy AUTH_*.md analysis files from root

Security Improvements:
- Add security_events table for audit logging
- Add SecurityEventsService for tracking auth events
- Enhanced security headers (HSTS, CSP, X-Frame-Options)
- Rate limiting configuration

Monitoring Setup:
- Add auth-health-check.sh for automated testing
- Add generate-dashboard.sh for HTML status dashboard
- Tests: health endpoint, JWKS (EdDSA), security headers, response time
- Ready for Hetzner cron deployment

Documentation:
- Update deployment docs with Better Auth notes
- Update environment variable references
- Add security improvements documentation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 21:42:47 +01:00
Wuesteon
1214c78a3c 🐛 fix(picture-backend): fix TypeScript output path for Docker
Added rootDir: "./src" to tsconfig.json so that main.ts compiles to
dist/main.js instead of dist/src/main.js. This matches the CMD path
in the Dockerfile.

Also added include/exclude and moduleResolution to match other backends.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-17 19:49:37 +01:00
Wuesteon
05ad5f1ed8 🔧 fix(picture-web): switch from adapter-netlify to adapter-node
The Docker build was failing because adapter-netlify outputs to .netlify/
directory but the Dockerfile expected build output in build/ directory.

Switched to adapter-node with explicit `out: 'build'` configuration
which matches the Dockerfile expectations.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-17 19:13:29 +01:00
Wuesteon
71cbca07d5 🐛 fix(picture-web): fix Docker build and auth pages
- Remove unused Google/Apple OAuth imports from login page
- Add missing shared-types package to Dockerfile
- Fix signup page to pass name parameter to signUp
- Add confirmResetPassword method to auth store
- Add reset-password page for completing password reset flow
2025-12-17 18:58:31 +01:00
Wuesteon
dcdc15f154 🚀 ci(picture): add picture app to CI/CD deployment pipeline
- Add picture-backend and picture-web to CI Docker build matrix
- Add picture services to staging deployment workflow
- Add picture-backend to production deployment workflow
- Create Dockerfile and docker-entrypoint.sh for picture-web
- Fix picture-backend Dockerfile port (3003→3006) and health endpoint
- Add picture routes to Caddyfile.staging
- Add REPLICATE_API_TOKEN and MANA_CORE_SERVICE_KEY env vars
2025-12-17 18:47:42 +01:00
Wuesteon
74654e652a 🐛 fix(cors): compile shared-nestjs-cors to JavaScript for production
The shared-nestjs-cors package was exporting raw TypeScript files, which caused
runtime errors in production Docker containers:
  SyntaxError: Unexpected token 'export'

Changes:
- Add build script to compile TypeScript to JavaScript
- Update package.json to export compiled dist files instead of src
- Add build step to all backend Dockerfiles that use this package
- Package now builds to CommonJS in dist/ folder

Fixes staging deployment failures for mana-core-auth and other backends.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-17 18:42:47 +01:00
Wuesteon
1be3d7a3ae 🐛 fix(docker): add missing workspace dependencies to all Dockerfiles
Ensure all backend Dockerfiles copy and build ALL workspace dependencies
they need. This fixes Docker build failures where packages couldn't find
their @manacore/* dependencies.

**Changes:**

**Picture Backend:**
- Added better-auth-types (with build)
- Added mana-core-nestjs-integration (with build)
- Added shared-nestjs-auth (with build)
- Added shared-storage (with build)

**Chat Backend:**
- Added mana-core-nestjs-integration (with build)

**Calendar, Clock, Todo Backends:**
- Added shared-nestjs-cors (already had other deps)

**Mana Core Auth:**
- Restructured for monorepo workspace support
- Added shared-nestjs-cors

**Key Improvements:**
- All packages in alphabetical order
- Build steps for compiled packages
- Source-only packages (shared-nestjs-cors) skip build
- Proper dependency ordering in build steps

This ensures Docker builds work correctly after the CORS package addition.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-17 18:19:29 +01:00
Wuesteon
4c44764838 1. Brevo email integration (API key, sender settings)
2. URL configuration fix (BASE_URL, FRONTEND_URL)
  3. Password reset URL pointing to frontend instead of API
2025-12-17 18:11:13 +01:00
Wuesteon
d3e11b320a 🐛 fix(auth): require name field in registration forms
Add required name field (min 2 chars) to all registration forms to fix
Better Auth validation error. Updates backend DTO, shared-auth service,
shared-auth-ui RegisterPage component, i18n translations, and all app
auth stores and register pages.
2025-12-16 20:28:28 +01:00
Wuesteon
285e142970 Merge branch 'dev' into till-dev 2025-12-16 19:17:07 +01:00
Till-JS
6035994972 feat(calendar): add stats sidebar section and heatmap support in year view
- Add StatsSidebarSection component with event statistics, weekly trend chart, and calendar activity
- Show stats sidebar when heatmap mode is enabled instead of todo section
- Add heatmap level classes (1-5) to YearView with GitHub-style coloring
- Only show StatsOverlay when sidebar is collapsed

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 18:39:59 +01:00
Till-JS
ea856214fe feat(calendar): show settings as modal on homepage
- Create SettingsModal component with all settings sections
- Update layout to show settings modal when clicking Settings in PillNav
- Modal appears above the input bar with glassmorphism styling
- Settings changes are saved immediately via settingsStore

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 18:37:11 +01:00
Till-JS
31f187b816 feat(calendar): integrate network view into homepage with heatmap stats
- Add network view as "N" option in view switcher (like contacts app pattern)
- Create view-mode store to switch between calendar/network modes
- Move NetworkView from /network route to embedded component
- Add heatmap mode with StatsOverlay for event density visualization
- Extend network service to create connections by:
  - Shared tags (highest priority, variable strength)
  - Same calendar (strength 50%)
  - Same date (strength 40%)
  - Same location (strength 60%)
- Fix network controller route prefix (was /api/v1/api/v1/network)
- Remove separate /network and /statistics pages

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 18:35:03 +01:00
Till-JS
484efccb45 style(calendar): use neutral colors for TagStrip action buttons
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 18:08:11 +01:00
Till-JS
c7c451e439 feat(calendar): add tag filtering to calendar views
- Add selectedTagIds to settings store with toggle/clear methods
- Update TagStrip to select tags for filtering instead of navigation
- Add filterByTags function to eventFiltering utils
- Apply tag filtering across all calendar views:
  - MultiDayView (timed & all-day events)
  - AgendaView (with empty group removal)
  - MonthView
  - YearView (event counts)
- Add "Filter löschen" button (hidden when no tags selected)
- Rename buttons: "Mehr" → "Alle Tags", "Neu" → "Neuer Tag"

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 17:59:28 +01:00
Till-JS
781bc529ba fix(calendar): equal cell heights in month view on smaller screens
Fix flexbox layout for month view grid cells by:
- Adding height: 100% and min-height: 0 to .month-view container
- Using flex: 1 1 0 on week rows for equal distribution
- Adding overflow: hidden on day cells to prevent content overflow

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 17:43:38 +01:00
Wuesteon
d2c2326ed7 🐛 fix(calendar): use runtime config for cross-app service URLs
Calendar app was using $env/dynamic/public for TODO and Contacts API
URLs, which doesn't work in SPA mode. Updated to use runtime config:

- Add TODO_API_URL and CONTACTS_API_URL to runtime config
- Update docker-entrypoint.sh to include new env vars
- Refactor todos.ts and birthdays.ts to use lazy-loaded clients
- Refactor user-settings.svelte.ts with lazy store initialization
- Add env vars to docker-compose.staging.yml

This fixes staging deployment where cross-app integrations were
calling localhost instead of staging URLs.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 05:10:01 +01:00
Wuesteon
bdbe66d2df 🐛 fix(docker): remove pre-compressed config files at runtime
SvelteKit pre-compresses static files (config.json.br, config.json.gz)
during build. When docker-entrypoint.sh regenerates config.json at
runtime, the server still serves the stale compressed versions.

This fix removes the .br and .gz files after generating the fresh
config.json, ensuring browsers receive the correct runtime configuration.

Affected apps: calendar, chat, clock, contacts, manacore

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 04:43:11 +01:00
Wuesteon
f37f85eded 🐛 fix(docker): add better-auth-types to backend Dockerfiles
Add missing @manacore/better-auth-types package to backend Docker builds.
The shared-nestjs-auth package depends on this new types package.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 03:14:45 +01:00
Wuesteon
cd19106857 🐛 fix(docker): add better-auth-types to web app Dockerfiles
Add missing @manacore/better-auth-types package to Docker builds.
The shared-auth package now depends on this new types package.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 02:59:51 +01:00
Wuesteon
78cd59a77a feat(storage): unified single-bucket architecture with Hetzner S3
- Refactor @manacore/shared-storage to use single `manacore-storage` bucket
- Add generateStorageKey() for path structure: {userId}/{appName}/...
- Update docker-compose.dev.yml for unified MinIO bucket
- Migrate CD workflow to use GitHub Environment Secrets
- Update picture and contacts backends to use unified storage
- Remove per-app bucket configuration (cleaner architecture)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 01:29:11 +01:00
Wuesteon
b2a8ffa6d9 fix(manacore-web): await getAuthUrl() and use runtime config in user-settings
Critical fixes for runtime configuration:
- auth.svelte.ts: Added missing await on getAuthUrl() in validateReferralCode()
- user-settings.svelte.ts: Replaced window injection with runtime config loading

This fixes ERR_CONNECTION_REFUSED on staging by ensuring auth URL is properly loaded from config.json before making API calls.
2025-12-16 00:21:23 +01:00
Wuesteon
9b55f10c28 fix(manacore-web): fix Docker entrypoint path for config.json
The entrypoint was trying to write to /app/build/client/config.json with an
absolute path, but since WORKDIR is /app/apps/manacore/apps/web, it should
use relative paths instead.

Changes:
- Use relative path 'build/client/config.json' instead of '/app/build/client/config.json'
- Add 'mkdir -p build/client' to ensure directory exists
- Update cat command to use relative path

This fixes the "nonexistent directory" error causing manacore-web to crash
in staging environment.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 00:00:53 +01:00
Wuesteon
5c594a4b23 fix(deps): add missing zod dependency to Calendar and Chat web apps for CI
Fixes CI/CD frozen-lockfile failure. The pnpm-lock.yaml had zod entries for
Calendar and Chat web apps, but their package.json files were missing the
dependency. This mismatch caused CI builds to fail.

Added zod@^3.25.76 to:
- apps/calendar/apps/web/package.json
- apps/chat/apps/web/package.json

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-15 23:41:37 +01:00
Wuesteon
22af71883e fix(runtime-config): add missing zod dependency to Clock and Contacts web apps
Added zod ^3.25.76 to package.json dependencies for:
- @clock/web
- @contacts/web

This fixes build failures in pre-push hook where runtime.ts config validation
required zod but it wasn't listed as a dependency.

Calendar and Chat apps already had zod installed (^4.2.0).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-15 22:44:24 +01:00
Wuesteon
b8d1067414 🐛 fix: use dynamic env for MIDDLEWARE_URL in server middleware
- Replace static private env import with dynamic env
- Add default value for MIDDLEWARE_URL
- Fixes build error where MIDDLEWARE_URL wasn't defined
2025-12-15 22:33:23 +01:00
Wuesteon
2c30867251 🔧 refactor: implement 12-factor runtime config for all web apps
Replace window injection and build-time env vars with runtime config
loaded from /config.json (generated by Docker entrypoint). This fixes
the staging deployment issue where apps were requesting localhost URLs
instead of production URLs.

Changes:
- Add runtime.ts config loader with Zod validation (fail-hard in prod)
- Disable SSR via +layout.ts (apps are client-only SPAs)
- Update API clients and auth stores to use async config getters
- Add docker-entrypoint.sh scripts to generate config.json at startup
- Update Dockerfiles with ENTRYPOINT for config generation
- Simplify docker-compose.staging.yml env vars (12-factor pattern)
- Add static/config.json as dev fallback (localhost defaults)
- Fix onMount return type (Svelte 5 compatibility)
- Add zod dependency to Picture app
- Add backward compat exports for Contacts app

Apps updated:
- Clock (port 3017)
- Chat (port 3002)
- Picture (port 3006)
- Contacts (port 3015)
- Calendar (port 3016)
- Manacore (multi-app platform)

Benefits:
- Build once, deploy anywhere (same Docker image for all envs)
- Configuration in environment, not code (12-factor compliance)
- Fail-hard on missing/invalid config in production
- No accidental SSR localhost fallbacks
- Schema validation ensures all required URLs are present
2025-12-15 21:33:50 +01:00
Wuesteon
263d779436 🐛 fix: resolve CI/CD build failures for manacore-web and todo-web
- Replace lucide-svelte with @lucide/svelte (Svelte 5 runes compatible)
- Add shared-splitscreen and shared-types to todo-web Dockerfile
- Update pnpm-lock.yaml with new dependencies

The old lucide-svelte package used $$props (Svelte 4 syntax) which
fails in Svelte 5 runes mode. The new @lucide/svelte package is
built specifically for Svelte 5.
2025-12-15 19:40:19 +01:00
Wuesteon
42e5e97390 ️ fix: resolve all svelte-check a11y warnings across web apps
- Fix 121 accessibility warnings across 9 web apps (manacore, clock, chat,
  manadeck, calendar, zitare, contacts, picture, todo)
- Add proper ARIA attributes (role, tabindex, aria-label) to interactive elements
- Add onkeydown handlers alongside onclick for keyboard accessibility
- Add svelte-ignore comments for intentional patterns (modals, dropdowns)
- Update svelte-check threshold from error to warning in pre-commit hook
- Fix script compatibility for bash 3.x (remove associative arrays)
- Add comprehensive documentation for svelte-check patterns and fixes

All web apps now pass svelte-check with 0 errors and 0 warnings.
Pre-commit hooks will block any future commits with warnings.
2025-12-15 19:09:01 +01:00
Wuesteon
3011d77caf ♻️ refactor(contacts,zitare): use dynamic runtime URLs in auth stores
Replace hardcoded localhost URLs with dynamic getAuthUrl() and
getBackendUrl() functions that:
- Read from injected window variables in client-side code
- Fall back to process.env for SSR
- Default to localhost for local development

This ensures proper URL resolution in Docker/production environments.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-15 14:13:00 +01:00
Wuesteon
660cbd654f Merge branch 'dev' into till-dev 2025-12-15 14:10:34 +01:00
Till-JS
bc0eecac95 Feat: Tagmodal, fullscreenmode, tag groups, onepage design philosophy 2025-12-15 03:37:01 +01:00
Till-JS
893c6ef0fb feat(shared-ui): unify ImmersiveModeToggle across Calendar, Contacts, and Todo apps
- Move ImmersiveModeToggle component from Calendar to shared-ui package
- Add immersiveModeEnabled setting to Contacts and Todo settings stores
- Update all three app layouts with F-key shortcut and conditional UI rendering
- Consistent glass-pill styling on hover for toggle button

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 03:34:15 +01:00
Till-JS
a6d439360f feat(calendar): add immersive/fullscreen mode toggle
- Add ImmersiveModeToggle component with glass-pill styling
- Toggle hides all UI elements (PillNav, DateStrip, TagStrip, InputBar)
- Press F key to toggle immersive mode
- Button positioned at bottom center, transparent until hovered
- Semi-transparent in immersive mode for minimal distraction

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 03:22:30 +01:00
Till-JS
3edb65c2c3 feat(calendar): add number labels to ViewSwitcher and extended day views
- Replace icons with number labels (1, 3, 5, 7, 10, 14, 30, 60, 90, 365, M, Y, L)
- Add new standard view types: 30day, 60day, 90day, 365day
- Add 3day view as standard option
- Add custom day range input (1-365 days) in context menu
- Update PillTabGroup to show labels when no icon is provided
- Change MultiDayView dayCount prop from union to number type
- Add ultra-compact class for views with 14+ days

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 02:54:10 +01:00
Till-JS
1395291b49 feat(calendar): combine calendar/tasks pill with sidebar toggle and mobile splitscreen
- Combine separate Kalender and Aufgaben pills into single tab group
- Add prependElements prop to PillNavigation for tab groups at start
- Clicking Aufgaben tab toggles todo sidebar instead of navigating
- Remove separate /tasks route (no longer needed)
- Implement 50/50 splitscreen layout on mobile (calendar top, todos bottom)
- Add proper flex container hierarchy for mobile layout
- Make TodoSidebarSection fill container on mobile with clean edges
- Add calendar and check-square icons to PillTabGroup
- Export PillTabGroupConfig type from shared-ui

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 02:35:35 +01:00
Till-JS
c712cc7995 feat(shared-ui): add reusable HelpModal system with keyboard shortcuts and syntax panels
- Create new help module with HelpModal, KeyboardShortcutsPanel, and SyntaxHelpPanel components
- Add common shortcuts and syntax constants for reusability
- Refactor InputBarHelpModal to use new HelpModal component
- Fix ContextMenu event handling with stopPropagation and pointer-events
- Fix Modal z-index for proper stacking context
- Add CalendarHeaderContextMenu import to WeekView

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 23:43:19 +01:00
Till-JS
5ac8de722d revert(calendar): restore animated swipe navigation
Revert to the full-featured animated version with:
- Smooth linear JS animation (requestAnimationFrame)
- Velocity tracking for momentum-based navigation
- Chain navigation for fast multi-page scrolling
- Visual feedback during swipe gestures

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 23:30:55 +01:00
Till-JS
20bc954d6b fix(calendar): prevent double navigation with lock mechanism
Add 150ms lock after each page navigation to prevent:
- Wheel events continuing to fire and triggering multiple navigations
- Rapid swipes causing double-jumps

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 23:25:43 +01:00
Till-JS
1f7b93af21 feat(calendar): add context menu to CalendarHeader with display settings
Add right-click context menu to the calendar header for customizing:
- Compact view toggle
- Weekday format (full/short/hidden)
- Date visibility toggle
- Month display toggle (e.g., "13.12.")

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 23:25:29 +01:00