Migrate ~47 hardcoded hex colors and v3 --c--theme--colors--* tokens
across 13 SCSS/TSX files to v4 --c--contextuals--* tokens. This lets
the calendar UI adapt to any runtime theme (sunbeam dark, La Suite
default, ANCT) via the integration service's theme.css. FreeBusyTimeline
rgba overlays use color-mix() for theme-aware transparency.
Add sunbeam dark theme to cunningham.ts with amber brand palette and
navy grey scale. Wire THEME_CSS_URL through Dockerfile build args and
_app.tsx <link> injection so the integration service theme CSS loads at
runtime. Regenerate Cunningham design tokens (CSS, SCSS, TS). Add
Monaspace Neon variable font-face for monospace UI elements.
Wire mobile components into the main Scheduler, adapt
useSchedulerInit for mobile viewport, update EventModal
and MiniCalendar for responsive behavior.
Add dedicated mobile components: MobileToolbar for
navigation, WeekDayBar for day selection, FloatingActionButton
for quick event creation, and MobileListView for agenda.
Also add mobile navigation hook and translations.
Adds organization-level default calendar sharing controls, "Find a Time" scheduling UI with a Free/Busy timeline showing attendee availability and conflicts, Working hours editor in Settings to manage and save availability, Autocomplete attendee search with debounced, partial name/email matching and timezone display.
Fixes#26. Fixes#25. Fixes#24.
Add multi-tenant organization model populated from OIDC claims with
org-scoped user discovery, CalDAV principal filtering, and cross-org
isolation at the SabreDAV layer.
Add bookable resource principals (rooms, equipment) with CalDAV
auto-scheduling that handles conflict detection, auto-accept/decline,
and org-scoped booking enforcement. Fixes#14.
Replace CalendarSubscriptionToken with a unified Channel model
supporting CalDAV integration tokens and iCal feed URLs, with
encrypted token storage and role-based access control. Fixes#16.
Migrate task queue from Celery to Dramatiq with async ICS import,
progress tracking, and task status polling endpoint.
Replace nginx with Caddy for both the reverse proxy and frontend
static serving. Switch frontend package manager from yarn/pnpm to
npm and upgrade Node to 24, Next.js to 16, TypeScript to 5.9.
Harden security with fail-closed entitlements, RSVP rate limiting
and token expiry, CalDAV proxy path validation blocking internal
API routes, channel path scope enforcement, and ETag-based
conflict prevention.
Add frontend pages for resource management and integration channel
CRUD, with resource booking in the event modal.
Restructure CalDAV paths to /calendars/users/ and
/calendars/resources/ with nested principal collections in SabreDAV.
- Frontend: 3 unit tests for generateVisioRoomId (format, length,
uniqueness)
- Backend: 7 tests for ICalendarParser URL extraction and email
template rendering with/without visio URL
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add visio conference URL support to invitation emails:
- Add url field to EventDetails dataclass
- Extract URL property in ICalendarParser.parse()
- Fix extract_property regex to preserve full URLs (was truncating
https:// by splitting on colon)
- Add conditional visio section to all 8 email templates
(invitation, update, cancel, reply — HTML and text)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implement the visio conference feature in the event modal:
- Add NEXT_PUBLIC_VISIO_BASE_URL env var for configurable base URL
- Create generateVisioRoomId() utility (xxx-xxxx-xxx format, a-z)
- Refactor VideoConferenceSection: button to create, link + remove
when URL exists
- Hide visio pill when env var is not configured (feature flag)
- Add removeVisio i18n key in EN/FR/NL
The visio URL is stored via the standard ICS URL property, which
is already wired through useEventForm.toIcsEvent() and CalDavService.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* 🙈(tools) remove OpenSpec skills and commands from Git tracking
Remove .claude/skills/openspec-*/ and .claude/commands/opsx/ from
Git tracking while keeping them locally. Extends the previous
cleanup (d24eed9) that handled the openspec/ directory.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* ✨(front) add EventModal section components and useEventForm hook
Extract modal sections into dedicated components (DateTimeSection,
RecurrenceSection, LocationSection, VideoConferenceSection,
AttendeesSection, DescriptionSection, InvitationResponseSection,
RemindersSection, StatusSection, AttachmentsSection) with shared
SectionRow and SectionPill layout components.
Add useEventForm hook to centralize form state management.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* ♻️(front) refactor EventModal to use extracted sections
Simplify EventModal by delegating to section components and
useEventForm hook. Replace alert() with addToast() for error
feedback, convert useCallback to useMemo for buildSummary in
RecurrenceEditor, and add missing organizer dependency in
useEventForm useEffect.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* 💄(front) update scheduler styles for new modal design
Rework SCSS for EventModal, AttendeesInput, RecurrenceEditor,
and Scheduler. Move inline styles to CSS classes. Update
globals and frontend dependencies.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Fix events displaying with +1h offset (e.g. 14h→15h) caused by
icsDateToJsDate() returning fake UTC (local.date) which then got
the browser offset applied again by dateToLocalISOString().
Changes:
- Return true UTC (icsDate.date) from icsDateToJsDate() instead of
fake UTC (local.date)
- Add getDateComponentsInTimezone() using Intl.DateTimeFormat with
formatter caching for correct cross-timezone write path
- Refactor jsDateToIcsDate() to use Intl instead of isFakeUtc flag
- Replace optimistic updates with refetchEvents() after modal save
to avoid fake UTC leaking into the display path
- Align standalone helper jsDateToIcsDate() with adapter conversion
- Narrow useCallback dependencies in useSchedulerHandlers
- Remove dead code addDurationToDate()
- Add 42 timezone conversion tests covering DST transitions,
cross-timezone round-trips, half-hour/45min offsets
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace static logo divs with DynamicCalendarLogo component in:
- Header.tsx: header variant for main navigation
- index.tsx: both header and icon variants for home page
- calendar.tsx: header variant for calendar page
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Create a React component that displays the calendar logo with
the current day number overlaid dynamically.
Features:
- Two variants: "header" (full logo) and "icon" (icon only)
- Day number positioned with CSS overlay
- Client-side rendering to avoid SSR hydration issues
- Translated alt text using i18n
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add two SVG files for the calendar logo:
- cal_logotype_text_no_number.svg: full logo with "Calendriers" text
- cal_icon_no_number.svg: icon-only version
Both versions have no day number, allowing dynamic overlay.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Enable sticky header by setting height: 100% on .ec
- Scroll to current time on calendar initialization
- Parallelize CalDAV event fetching with Promise.all
- Use event-handler-refs pattern for stable callbacks
- Import shared CalendarApi interface from types
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Display day-of-week before day-of-month in calendar column headers
for better visual hierarchy.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Integrate SchedulerToolbar component above calendar container
- Disable native headerToolbar in useSchedulerInit
- Add toolbar state (currentView, viewTitle) to Scheduler
- Use datesSet callback to sync toolbar with calendar navigation
- Update CalendarContext to use CalendarApi type for better type safety
- Pass calendarRef to toolbar for API method access
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Create custom React toolbar for EventCalendar replacing native toolbar:
- Today button to navigate to current date
- Previous/Next navigation buttons with icons
- Dynamic period title synced with calendar view
- Custom dropdown menu for view selection (Day/Week/Month/List)
- Full keyboard accessibility (Escape, Arrow keys, Enter, Tab)
- CalendarApi interface for type-safe calendar interactions
- Responsive layout with Cunningham design system
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Create scheduler-theme.scss to align @event-calendar/core with
La Suite design system (Cunningham):
- Map --ec-* CSS variables to Cunningham tokens
- Hide native toolbar (replaced by custom React toolbar)
- Style today indicator with bordered frame (no fill)
- Style events with 6px border-radius, no shadow
- Style now indicator with brand-500 color
- Remove intermediate 30-min grid lines
- Unify header zone (ec-col-head + ec-all-day)
- Add border to grid body
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Regenerate Cunningham tokens with latest design system values.
This provides updated CSS variables for theming.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove all console.log debug statements from production code
- Fix useEffect dependency arrays (remove refs, fix dependency cycles)
- Add useMemo for sharedCalendars filtering in CalendarList
- Improve error handling in handleOpenSubscriptionModal
- Add proper cleanup pattern (isMounted) in CalendarContext
- Use i18n locale instead of hardcoded French in MiniCalendar
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fix return type for respondToInvitation method to properly
wrap response in data property as expected by CalDavResponse.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add end-to-end tests for calendar functionality including
locale switching and calendar operations.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add DavClient utility for creating authenticated CalDAV
client instances with proper configuration.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove deprecated open-calendar package. Functionality has
been migrated to src/features/calendar/services/dav with
improved architecture and TypeScript support.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update calendar page to use new Scheduler and CalendarContext.
Update styles, error pages, and app wrapper for new components.
Minor updates to Header, Toaster and Feedback components.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove deprecated UI components (breadcrumbs, circular-progress,
infinite-scroll, info, responsive) and unused hooks (useCopyToClipboard,
useLayout, RhfInput) that are no longer needed.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update component index exports for new Scheduler and
CalendarList. Update Next.js config and Dockerfile for
CalDAV dependencies.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>