/** * FamilySync global styles entry point. * * Import order matters — tokens.css must be imported AFTER * @schedule-x/theme-default/dist/index.css (handled in main.tsx) * so the --sx-color-* overrides win the cascade. */ @import './tokens.css'; /* ── Schedule-X calendar sizing ───────────────────────────────────────────── */ /* * Schedule-X renders .sx__calendar-wrapper (height:100%) inside a
that * the React adapter emits without an explicit height. The parent container in * CalendarShell is a flex item (flex:1; minHeight:0; height:100%) so we must * propagate that height down through the React wrapper element to the * .sx__calendar-wrapper so the week/day time-grid (.sx__view-container) can * scroll correctly. * * Class names confirmed from @schedule-x/theme-default@4.6.0 dist/index.css: * .sx__calendar-wrapper – outer wrapper emitted by the React adapter * .sx__calendar – inner flex-column container (flex:1; height:100%) * .sx__view-container – scrollable time-grid body (flex:1; overflow-y:auto) * * The React adapter (@schedule-x/react) wraps the calendar in a div with class * `.sx-react-calendar-wrapper`. That element had no height, so .sx__calendar-wrapper's * height:100% resolved against an auto-height parent and collapsed — killing the * time-grid's internal scroll. Give the adapter wrapper height:100% too so the full * chain (container → .sx-react-calendar-wrapper → .sx__calendar-wrapper → .sx__calendar * → .sx__view-container[overflow-y:auto]) has a resolvable height end-to-end. */ .sx-react-calendar-wrapper, .sx__calendar-wrapper { height: 100%; } /* ── Minimal Global Reset ─────────────────────────────────────────────────── */ *, *::before, *::after { box-sizing: border-box; } body { margin: 0; font-family: var(--font-family-base); font-size: var(--text-body-size); font-weight: var(--text-body-weight); line-height: var(--text-body-line-height); color: var(--color-text-primary); background-color: var(--color-surface); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* ── Schedule-X overrides ──────────────────────────────────────────────────── */ /* * 999.6 / D-12: All-day event visual distinction. * * All-day events render as full-width filled rounded pills so they are immediately * distinct from timed event chips (partial-fill with colored left border accent). * * Contract (Surface 3 — UI-SPEC): * all-day = solid filled pill → this override * timed = partial-fill chip with colored border accent (Schedule-X default) * * Confirmed from @schedule-x/calendar@4.6.0 dist/core.js source inspection: * * Week/Day all-day row: events use class `.sx__date-grid-event` (exclusively for * all-day events — timed events in week/day go to `.sx__time-grid-event`, a * separate class; no overlap). * * Month grid: both timed and all-day share `.sx__month-grid-event`. Timed events * also render a child `.sx__month-grid-event-time` element (when * `calendarEvent.start instanceof Temporal.ZonedDateTime`). All-day events have * a PlainDate start and never render that child. So * `.sx__month-grid-event:not(:has(.sx__month-grid-event-time))` selects only * all-day cells in month view. * * Color source: the member's `_familySync.color` propagates via `calendarId` color * config in buildCalendarConfig() — no per-event inline override needed. The solid * `background-color` override wins over the default `-container` tint; the * `border-inline-start` override removes the left accent border so the pill reads * as uniformly filled. */ /* * In the date-grid (all-day row at top of week/day views) and in the month-grid * all-day cell area, remap the Schedule-X *-container CSS variables to their * corresponding solid main colors. This causes the event's inline * `background-color: var(--sx-color-${colorName}-container)` to resolve to the * solid main color instead of the 15%-opacity tint. The `-on-*-container` * variable is set to #FFFFFF for white label text. * * Calendar colorNames used by this app (from buildCalendarConfig): * shared — rose family calendar * member-{N} — per-member personal calendars (N = users.id) * * Note: CSS custom properties cascade — these overrides on the container element * apply to all descendants without affecting the rest of the document. */ .sx__date-grid, .sx__month-grid-day__events { /* Fallback: Schedule-X uses the built-in `primary` family for any event whose * calendar colorName is not registered (e.g. a member calendar absent from the * current /api/me members list). Remapping it keeps all-day events solid-filled * even in that fallback case, so the pill never degrades to the light tint. */ --sx-color-primary-container: var(--sx-color-primary); --sx-color-on-primary-container: #FFFFFF; --sx-color-shared-container: var(--sx-color-shared); --sx-color-on-shared-container: #FFFFFF; --sx-color-member-1-container: var(--sx-color-member-1); --sx-color-on-member-1-container: #FFFFFF; --sx-color-member-2-container: var(--sx-color-member-2); --sx-color-on-member-2-container: #FFFFFF; --sx-color-member-3-container: var(--sx-color-member-3); --sx-color-on-member-3-container: #FFFFFF; --sx-color-member-4-container: var(--sx-color-member-4); --sx-color-on-member-4-container: #FFFFFF; } /* Week/Day all-day row — .sx__date-grid-event is exclusively all-day in this view */ .sx__date-grid .sx__date-grid-event { border-radius: 4px !important; border-inline-start: none !important; font-weight: 600 !important; font-size: var(--text-label-size) !important; /* background-color and color are driven by the container-var remapping above */ } /* Month grid — exclude timed events (which have a child .sx__month-grid-event-time) */ .sx__month-grid-day__events .sx__month-grid-event:not(:has(.sx__month-grid-event-time)) { border-radius: 4px !important; border-inline-start: none !important; font-weight: 600 !important; font-size: var(--text-label-size) !important; /* background-color and color are driven by the container-var remapping above */ }