--- quick_id: 260929-dmx type: quick wave: 1 autonomous: true --- # Quick 260929-dmx: Widget-Raster horizontal feiner (48 Spalten), Kalender schmaler ## User requests (29.09.2026) 1. "das kalender widget soll in der breite schmäler gemacht werden können." 2. "und mache das widget raster horizontal etwas feiner." ## Measurements (orchestrator, browser, lg breakpoint, grid width 1593 px, margin 12) - Today: 24 cols → one width unit ≈ 66 px. Calendar minW 6 ≈ 383 px, default 8 ≈ 515 px. - Calendar rendered at 251 px: fully usable (month grid, header "September 2026", event list truncates titles cleanly). - Calendar at 185 px: header clipped, event titles reduced to one letter → too narrow. - Target: calendar minimum ≈ 250 px. ## Decision (locked) Double the HORIZONTAL resolution only: `COLS = { lg: 48, md: 40, sm: 24, xs: 16, xxs: 4 }` in `apps/web/src/components/dashboard/dashboard-grid.tsx`. Row height (20) and margin (12) unchanged. Every existing widget keeps its exact on-screen size and position. ## Task 1: Grid version 3 (horizontal x2) with migration - files: apps/web/src/lib/grid-layout-migration.ts (+ test), apps/web/src/components/dashboard/dashboard-grid.tsx (+ test), apps/web/src/lib/stores/dashboard-store.ts (only if needed) - action: - Bump `GRID_VERSION` to 3. Migration becomes stepwise and cumulative: v1 → v2: existing behavior (x,y,w,h,minW,minH,maxW,maxH × 2). v2 → v3: NEW, horizontal only: x, w, minW, maxW × 2 (y, h, minH, maxH unchanged). So a v1 layout gets both steps, a v2 layout only the second, a v3 layout nothing. Keep idempotence and marker semantics (marker only in persisted JSON). Update the file header comment (German, same style) to document v3. - `COLS` as above. Check every other place that depends on column count or widget width units: centering offset, `RESIZE_AXIS_FALLBACK`, `breakpointFor`, default positions when adding a widget (`dashboard-grid.tsx` ~380: `defaultW ?? 4`, `minW ?? 4` fallbacks → 8), empty-dashboard suggestions, any layout templates/seed data in apps/web or apps/api (grep `defaultW`, `w:` in dashboard code, `layouts` defaults in apps/api/src/dashboard). Anything expressed in width units gets × 2. - Tests: extend grid-layout-migration tests (v1→v3, v2→v3, v3 untouched, idempotence, marker 3 written), update dashboard-grid tests pinning cols. - verify: `pnpm --filter web exec vitest run src/lib src/components/dashboard` green. ## Task 2: Widget width constraints in new units - files: apps/web/src/components/dashboard/widget-registry.tsx (+ test) - action: In `WIDGET_CONSTRAINTS` double every `minW` and `defaultW` (same physical size as before), EXCEPT calendar: `minW: 8` (≈ 251 px at lg — the measured usable minimum), `defaultW: 16` (unchanged size). minH/defaultH unchanged. Update the comment above calendar (German): narrower on user request 29.09., 8 of 48 ≈ 250 px measured usable. Existing layouts: the existing override logic in dashboard-grid (quick-260916-dyv: stored minW/minH replaced by constants in every breakpoint) must pick up the new calendar minW so existing calendars can be shrunk — verify that path with a test. - verify: web tests green; `pnpm turbo run type-check lint --filter web` green; biome warnings for web not above baseline 55. ## Task 3: CHANGELOG, rebuild, commit - CHANGELOG.md under `## Unveröffentlicht` → `### Geändert` (section exists) add plain-German bullets (app text uses "Sie"): - Dashboard: Das Raster ist in der Breite doppelt so fein – Widgets lassen sich in kleineren Schritten breiter oder schmaler ziehen und genauer platzieren. Bestehende Anordnungen bleiben unverändert. - Dashboard: Das Kalender-Widget lässt sich deutlich schmaler ziehen als bisher. - Rebuild local stack: `docker compose up -d --build web` (plain `up` does not rebuild). - Commits per task, messages end with `Co-Authored-By: Claude Opus 5.5 (1M context) `. - NEVER git push (orchestrator pushes after browser check). - Browser check is done by the orchestrator (resize calendar to minimum, existing layout unchanged after migration, marker 3 persisted).