feat(quick-260916-bwo): Dashboard-Raster verdoppelt (24 Spalten, 20 px, 8 px Abstand), Konstanten x2, einmalige Umrechnung gespeicherter Anordnungen mit Marker __gridVersion

- dashboard-grid.tsx: COLS 24/20/12/8/2, rowHeight 20, margin 8 (containerPadding folgt), Rueckfallwerte 4
- widget-registry.tsx: alle 32 Werte in WIDGET_CONSTRAINTS verdoppelt
- grid-layout-migration.ts (neu): migrateGridLayouts/withGridVersion, Marker nur im JSON, Idempotenz (T-BWO-02)
- dashboard-store.ts: Umrechnung beim Laden, Sofort-Speichern mit Marker, withGridVersion bei jedem saveLayout
- Tests: Migration 7 (neu), Store 6 (neu), Registry +1 (Tabelle), Grid +2 (Props ueber Mock), API-Spec +2 (Durchreichung __gridVersion, timeFontSizePt)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018N9CD3ebPKm1b32bPpBknY
This commit is contained in:
2026-09-16 09:09:00 +02:00
parent 50f201ecc1
commit 3f5afb0f54
9 changed files with 511 additions and 25 deletions
@@ -52,4 +52,28 @@ describe('WIDGET_CONSTRAINTS (DASH-11)', () => {
expect(Object.keys(WIDGET_CONSTRAINTS)).toContain('link');
expect(Object.keys(WIDGET_CONSTRAINTS)).toContain('stopwatch');
});
it('quick-260916-bwo: jede Groesse ist exakt das Doppelte der alten 12-Spalten-Werte', () => {
// Raster seit quick-260916-bwo 24 Spalten / 20 px statt 12 / 40 — jeder Wert
// ist das Doppelte, damit Widgets optisch gleich gross bleiben.
expect(WIDGET_CONSTRAINTS).toEqual({
clock: { minW: 4, minH: 4, defaultW: 4, defaultH: 4 },
search: { minW: 6, minH: 4, defaultW: 12, defaultH: 4 },
calendar: { minW: 6, minH: 6, defaultW: 8, defaultH: 12 },
note: { minW: 4, minH: 6, defaultW: 6, defaultH: 8 },
calculator: { minW: 4, minH: 8, defaultW: 6, defaultH: 10 },
favorites: { minW: 4, minH: 6, defaultW: 6, defaultH: 10 },
link: { minW: 4, minH: 4, defaultW: 4, defaultH: 4 },
stopwatch: { minW: 4, minH: 4, defaultW: 6, defaultH: 6 },
});
let counted = 0;
for (const type of ALL_WIDGET_TYPES) {
for (const field of ['minW', 'minH', 'defaultW', 'defaultH'] as const) {
expect(WIDGET_CONSTRAINTS[type][field] % 2, `${type}.${field} muss gerade sein`).toBe(0);
counted++;
}
}
expect(counted).toBe(32);
});
});