Customization
PlanningSup offers extensive customization options to tailor your calendar experience. All preferences are stored locally and optionally synced across devices when you sign in.
Event colors
You can customize the color of each event type: Lecture , Lab , Tutorial , and Other .
Open settings
Click the gear icon in the navbar
Adjust colors
Under “Couleurs des événements” (Event colors), click each color picker to choose a new color
Reset to defaults
Click “Réinitialiser” (Reset) to restore the default color scheme
Default colors
// apps/web/src/composables/useSettings.ts
const DEFAULT_COLORS : ColorMap = {
lecture: '#efd6d8' , // Soft pink
lab: '#bbe0ff' , // Light blue
tutorial: '#d4fbcc' , // Light green
other: '#EDDD6E' , // Yellow
}
These colors are optimized for both light and dark themes.
Colors are stored in localStorage and synced to the server if you’re signed in. See apps/web/src/composables/useSettings.ts:273-289 for the sync logic.
Event filtering
Blocklist (hide events)
You can hide specific courses from your calendar without deleting them:
Open settings
Navigate to “Liste de blocage” (Blocklist)
Add event titles
Type or paste event titles to hide (one per line) Example:
- "Sport"
- "Conférence optionnelle"
Save and refresh
The calendar re-fetches events with your blocklist applied server-side
// apps/web/src/composables/useSettings.ts
const blocklist = useLocalStorage < string []>( 'settings.blocklist' , [])
const queryParams = computed < Record < string , string >>(() => {
const qp : Record < string , string > = {}
if ( blocklist . value . length > 0 ) {
qp . blocklist = blocklist . value . join ( ',' )
}
return qp
})
The blocklist is sent as a query parameter to the API, so very long lists may cause performance issues. Limit to ~20-30 items.
Highlight events with teacher
Enable this option to dim events without an assigned teacher , making it easier to focus on confirmed courses.
Open settings
Find “Surligner les événements avec enseignant” (Highlight events with teacher)
Toggle the switch
Events without a teacher will appear grayed out
// apps/web/src/composables/useSettings.ts
const highlightTeacher = useLocalStorage < boolean >( 'settings.highlightTeacher' , false )
if ( highlightTeacher . value ) {
qp . highlightTeacher = 'true'
}
This is a backend-only flag that affects the server response, not client-side styling.
Merge duplicate events
When multiple plannings contain the same event (e.g., a shared lecture), PlanningSup can merge them into a single calendar entry.
Open settings
Find “Fusionner les événements dupliqués” (Merge duplicate events)
Enable the toggle
Duplicate events are merged client-side based on:
Same start and end times
Same title
Same event type
// apps/web/src/composables/usePlanningCalendar.ts
const displayedEvents = computed (() =>
settings . mergeDuplicates . value
? mergeDuplicateEvents ( planning . events . value )
: planning . events . value ,
)
See apps/web/src/utils/events.ts for the merge algorithm.
This is especially useful when combining multiple planning groups that share common courses.
Timezone conversion
If you’re traveling or studying abroad, you can convert event times to a different timezone.
Open settings
Navigate to “Fuseau horaire” (Timezone)
Select a timezone
Choose from IANA timezones like:
Europe/Paris (default)
America/New_York
Asia/Tokyo
Events are converted
All times update automatically in the calendar
// apps/web/src/composables/usePlanningCalendar.ts
function mapApiEventToCalendarEvent (
event : EventWithFullId ,
timezone : NonNullable < AllowedTimezones >,
) {
const start = event . startDate . toTemporalInstant (). toZonedDateTimeISO ( timezone )
const end = event . endDate . toTemporalInstant (). toZonedDateTimeISO ( timezone )
// ...
}
PlanningSup uses the Temporal API for accurate timezone handling.
The detected browser timezone is shown below the dropdown. If you leave the field empty, PlanningSup uses your browser’s timezone by default.
Custom planning groups
You can save frequently-used planning combinations as custom groups for quick access.
Select plannings
In the planning picker, choose the plannings you want to group
Create a group
Click “Créer un groupe” (Create group) and give it a name Example: "Master 2 - All options"
Switch groups quickly
Click the group name in the picker to load all associated plannings at once
// apps/web/src/composables/useSettings.ts
interface CustomGroup {
id : ` ${ string } - ${ string } - ${ string } - ${ string } - ${ string } ` // UUID-v4
name : string
plannings : string []
}
function addCustomGroup ({ name , plannings } : { name : string , plannings : string [] }) {
const customGroup : CustomGroup = {
id: crypto . randomUUID (),
name ,
plannings ,
}
customGroups . value . push ( customGroup )
}
Custom groups are stored in localStorage and synced across devices when you’re signed in.
You can have up to 50 custom groups, each containing up to 100 plannings.
Theme (light / dark)
PlanningSup automatically detects your system theme preference and applies it to the calendar.
Light mode : White background with soft pastel colors
Dark mode : Dark gray background with muted colors
To override the system preference:
Open settings
Find “Thème” (Theme)
Choose a theme
Select Light , Dark , or Auto (system default)
// apps/web/src/composables/useTheme.ts
const theme = useLocalStorage < 'light' | 'dark' | 'auto' >( 'theme' , 'auto' )
const isDark = computed (() => {
if ( theme . value === 'auto' ) {
return window . matchMedia ( '(prefers-color-scheme: dark)' ). matches
}
return theme . value === 'dark'
})
The calendar updates instantly when you change the theme:
// apps/web/src/composables/usePlanningCalendar.ts
watch ( uiIsDark , ( isDark ) => {
calendarApp . value ?. setTheme ( isDark ? 'dark' : 'light' )
})
Show weekends in week view
By default, the week view shows Monday to Friday (5 days). You can enable weekends to see Saturday and Sunday as well.
Open settings
Find “Afficher les week-ends” (Show weekends)
Toggle the switch
The week view expands to 7 columns
// apps/web/src/composables/useSettings.ts
const showWeekends = useLocalStorage < boolean >( 'settings.showWeekends' , false )
const weekNDays = computed (() => ( showWeekends . value ? 7 : 5 ))
This preference is synced across devices if you’re signed in.
Export settings data
All customization settings are stored in localStorage under keys like:
settings.colors
settings.blocklist
settings.highlightTeacher
settings.showWeekends
settings.mergeDuplicates
settings.customGroups
settings.targetTimezone
You can inspect or backup these values using your browser’s developer tools:
// View all settings
Object . keys ( localStorage ). filter ( k => k . startsWith ( 'settings.' ))
// Export settings as JSON
const settings = {}
for ( const key of Object . keys ( localStorage )) {
if ( key . startsWith ( 'settings.' )) {
settings [ key ] = localStorage . getItem ( key )
}
}
console . log ( JSON . stringify ( settings , null , 2 ))
Next steps
Offline mode Install the PWA for offline access
Sync preferences Learn how cross-device sync works