Redraw the calendar as an almanac: gridless cells, typed bands

Day cells lose their borders and fills; red days, klämdagar and
Saturdays are told apart by the numeral's ink with a 12px R/K mark,
today is a filled circle, overrides and exclusions mark the numeral.
Bands carry their funding type by fill, ink and hatching and their
owner by a left cap. The preset rail becomes a chip row, the legend a
help popover, the period popover's three delete buttons fold behind
one "Ta bort…", and solo users pick a type directly in the day modal.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XBRLomdLK9jF7wU7a8AA6H
This commit is contained in:
2026-09-19 19:02:02 +02:00
parent d14f86478a
commit dbef997da4
28 changed files with 1486 additions and 1109 deletions
+23 -9
View File
@@ -4,14 +4,6 @@ export const calendar = {
'calendar.selectMonthAria': 'Select month',
'calendar.selectYearAria': 'Select year',
'calendar.deleteError': 'Failed to delete the planned day',
'calendar.legendDoubleDay': 'Double day',
'calendar.legendIncomeBased': 'Income-based rate (sjukpenningnivå)',
'calendar.legendKlamdag': 'Bridge day',
'calendar.legendMinimumRate': 'Minimum rate (lägstanivå)',
'calendar.legendOverride': 'Exception (working/day off)',
'calendar.legendRedDay': 'R = public holiday',
'calendar.legendTitle': 'Legend',
'calendar.legendVacation': 'Vacation',
'calendar.loading': 'Loading calendar...',
'calendar.nextMonthAria': 'Next month',
'calendar.overrideError': 'Failed to update the exception',
@@ -30,7 +22,6 @@ export const calendar = {
'calendar.weekdayTue': 'Tue',
'calendar.weekdayWed': 'Wed',
'calendar.you': 'You',
'calendarDay.ariaWithEvents': '{date} with {count} event(s)',
'calendarDay.excludedAria': 'removed day — the planner skips it',
'calendarDay.klamdagAria': 'bridge day',
'calendarDay.overrideFreeAria': 'marked as a day off (exception)',
@@ -69,6 +60,7 @@ export const calendar = {
'plannedDayModal.savingButton': 'Saving…',
'plannedDayModal.sjukpenningOption': 'Sjukpenningnivå (income-based, 390-day tier)',
'plannedDayModal.vacationOption': 'Vacation',
'plannedDayModal.autoOption': 'Let the planner choose',
'redDaysList.effectiveFree': 'Off',
'redDaysList.effectiveWorking': 'Working day',
'redDaysList.emptyYear': 'No public holidays or exceptions this year.',
@@ -101,9 +93,30 @@ export const calendar = {
'calendar.undoError': 'Failed to undo the change',
'calendar.dismissToastAria': 'Dismiss the message',
// The "?" beside the month title — replaces the legend that used to sit
// under the grid. One line per mark the calendar draws.
'calendar.helpAria': 'What the calendar marks mean',
'calendar.helpTitle': 'Days',
'calendar.helpBandsTitle': 'Periods',
'calendar.helpRedDay': 'Public holiday (R) — a red day or a Sunday',
'calendar.helpKlamdag': 'Bridge day (K)',
'calendar.helpSaturday': 'Saturday',
'calendar.helpToday': 'Today',
'calendar.helpOverride': 'Exception — marked as a working day or a day off',
'calendar.helpExcluded': 'Removed day — the planner skips it',
'calendar.helpVacation': 'Vacation',
'calendar.helpSjukpenning': 'Income-based rate (sjukpenningnivå)',
'calendar.helpLagsta': 'Minimum rate (lägstanivå)',
'calendar.helpSelf': 'Your leave',
'calendar.helpPartner': "Your partner's leave",
'calendar.helpDubbeldag': 'Double day — both parents on the same day',
'calendar.helpPinned': 'Pinned by you — the planner leaves the day alone',
'calendar.railHeading': 'Add leave',
'calendar.railHint': 'Click to add — the calendar jumps to wherever it fits best.',
'calendar.presetAddAria': 'Add {name}',
'calendar.presetChipsLabel': 'Add leave',
'calendar.presetWeeksShort': '{count} wk',
'calendar.periodPopoverTitle': 'Edit period',
'calendar.periodAdHocTitle': 'Period',
@@ -135,6 +148,7 @@ export const calendar = {
'calendar.periodDeleteAdHocButton': 'Delete these days',
'calendar.periodCancelButton': 'Cancel',
'calendar.periodCloseAria': 'Close',
'calendar.periodDeleteMenuButton': 'Remove…',
// todo.md #9 — three-way remove: this day / this period (this year) / this
// period every year.