- render.test.mjs drives the real UI under jsdom: employees tab renders and
add works, planning tab renders the calendar grid (makeDayCell), generate
fills slots, a manual slot change updates history, and a beforeunload flush
persists state to localStorage; data tab renders the history view.
- persistence.test.mjs seeds malformed persisted state (employee without
constraints, out-of-range moderatorsPerDay) and asserts the startup load
normalizes it without crashing.
- jsdom added as the single devDependency; node_modules gitignored; both
suites wired into npm test.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Canonical name "Meeting Mixer" everywhere: <title>, README, .vch-description
(now non-technical per convention) and package.json (meeting-mixer).
- README gains a Tech-Stack section and an accurate, non-misleading port note.
- Magic numbers replaced by named constants: LOW_PRIORITY_PENALTY in
algorithm.js; MIN/MAX_MODERATORS_PER_DAY in utils.js, used by data.js,
calendar.js and app.js.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- README gains a "Datenschutz & Speicherung" section: local single-user tool,
unencrypted localStorage, avoid shared devices, export JSON to back up.
- Comments the generateId Math.random fallback as a non-crypto last resort,
acceptable for local employee ids.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Move inline style.cssText to semantic classes (cal-legend, cal-header-cell,
cal-day-tag-label, cal-btn-row) in calendar.js
- Buttons "FT"/"BU" → "Feiertag"/"Betriebsurl." for clarity
- Decorative turntable/mixer SVG header art in index.html
- style.css build-out for the new classes
- Initial README content
- Dev port 3000 → 3001
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>