/* Component styles - must come first */
@import './primitives.css';
@import './components.css';
@import './responsive.css';
/* Typeface — Schibsted Grotesk (OFL), self-hosted from /public/fonts so no
* request ever leaves for a font CDN. Two subsets with Google's own
* unicode-ranges: the browser only fetches latin-ext when a glyph needs it.
* Variable weight axis 400–900; `swap` so text is never invisible while the
* file loads (index.html preloads the latin file to keep that swap short). */
@font-face {
font-family: 'Schibsted Grotesk';
font-style: normal;
font-weight: 400 900;
font-display: swap;
src: url('/fonts/SchibstedGrotesk-latin-ext-v7.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304,
U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Schibsted Grotesk';
font-style: normal;
font-weight: 400 900;
font-display: swap;
src: url('/fonts/SchibstedGrotesk-latin-v7.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304,
U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Design Tokens
*
* One neutral ground, one accent. Hierarchy comes from type and whitespace;
* hairlines only where a boundary is unavoidable; one shadow, only on
* floating layers. Leave types are told apart by fill / ink / outline, not
* by hue, and day states by the numeral, not by a cell fill.
*
* Four names are load-bearing for e2e, which resolves them by name and
* compares against painted elements: --c-danger-weak (red-day cell),
* --c-weekend-bg (plain Saturday), --c-accent-hover and --c-surface
* (header-nav-hover). Do not repurpose any of them.
*/
:root {
--font-sans: 'Schibsted Grotesk', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
/* Neutrals */
--c-bg: #fcfcfd;
--c-surface: #fff;
--c-border: #ececf0;
--c-text: #111318;
--c-text-muted: #5e6472;
--c-text-faint: #9297a3;
/* The one accent — CTA, focus, active nav, today, selection */
--c-accent: #2f5bea;
--c-accent-weak: #eef2fe;
--c-accent-hover: #2549c4;
--c-accent-active: #1d3ca3;
/* Semantic */
--c-danger: #d03a2f;
--c-danger-weak: #fbeceb;
--c-danger-hover: #b02f26;
--c-warning: #b26a00;
--c-warning-weak: #fdf3e3;
--c-success: var(--c-accent);
--c-success-weak: var(--c-accent-weak);
--c-success-hover: var(--c-accent-hover);
/* Day states — a colour on the numeral, never a cell fill */
--c-day-red: var(--c-danger);
--c-day-klamdag: var(--c-warning);
--c-day-saturday: var(--c-text-faint);
--c-weekend-bg: var(--c-surface); /* legacy name; Saturday has no fill */
/* Leave types: fill / ink / outline */
--c-leave-vacation: #eef2fe;
--c-leave-vacation-ink: #2f5bea;
/* Stronger vacation step for thin (8px) timeline tracks only — the tint
* above vanishes on white at that height. Calendar bands keep the tint. */
--c-leave-vacation-bar: #b9c9f7;
--c-leave-sjukpenning: #2a2d35;
--c-leave-sjukpenning-ink: #fff;
--c-leave-lagsta: #fff;
--c-leave-lagsta-ink: #2a2d35;
--c-leave-lagsta-outline: #2a2d35;
--c-leave-lagsta-hatch: rgba(42, 45, 53, 0.35);
--c-band-gap: #f1f2f5;
--c-band-cap-self: var(--c-accent);
--c-band-cap-partner: #9297a3;
/* Interaction chrome */
--c-flash: var(--c-accent);
--overlay: rgba(17, 19, 24, 0.4);
--c-focus-ring: rgba(47, 91, 234, 0.35);
--c-row-hover: rgba(47, 91, 234, 0.04);
/* Spacing */
--sp-1: 4px;
--sp-2: 8px;
--sp-3: 12px;
--sp-4: 16px;
--sp-5: 24px;
--sp-6: 32px;
--sp-7: 48px;
--sp-8: 64px;
/* Type scale 12/14/16/20/28/40 — nothing below 12px anywhere */
--fs-xs: 0.75rem;
--fs-sm: 0.875rem;
--fs-base: 1rem;
--fs-lg: 1.25rem;
--fs-xl: 1.75rem;
--fs-2xl: 2.5rem;
--lh: 1.5;
--lh-tight: 1.15;
/* Shape & depth */
--radius-sm: 4px;
--radius: 8px;
--radius-lg: 12px;
--radius-full: 999px;
/* Matches frontend/e2e/tests/calendar-band.spec.ts's literal 4px/0px
* assertions on band corners — kept as its own token so a future radius
* change elsewhere can't silently break it. */
--radius-band: 4px;
--shadow-float: 0 8px 24px rgba(17, 19, 24, 0.1);
/* Sizes */
--maxw: 960px;
--control-h: 40px;
--control-h-sm: 32px;
--icon-sm: 16px;
--icon-md: 20px;
--icon-lg: 24px;
/* Layers */
--z-header: 100;
--z-popover: 900;
--z-modal: 1000;
/* The one inline image in the system: a 1.5px chevron for native selects.
* Lives here (not in a feature file) so the style guard can keep `url(`
* and hex out of everything else. Colour = --c-text-muted. */
--icon-chevron-down: url('data:image/svg+xml;utf8,');
color-scheme: light;
}
/* Reset & Base */
*,
*::before,
*::after {
box-sizing: border-box;
}
html,
body,
div,
span,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
address,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strong,
sub,
sup,
b,
u,
i,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
details,
figure,
figcaption,
footer,
header,
hgroup,
main,
mark,
nav,
output,
section,
summary,
time {
margin: 0;
padding: 0;
border: 0;
}
html {
-webkit-text-size-adjust: 100%;
text-size-adjust: 100%;
}
body {
font-family: var(--font-sans);
font-size: var(--fs-base);
line-height: var(--lh);
background: var(--c-bg);
color: var(--c-text);
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
/* Headings — tighter leading and a touch of negative tracking at 28px+ is
* what makes a line read as a heading, not a heavier weight. */
h1 {
font-size: var(--fs-xl);
font-weight: 600;
line-height: var(--lh-tight);
letter-spacing: -0.02em;
margin-bottom: var(--sp-4);
}
h2 {
font-size: var(--fs-lg);
font-weight: 600;
line-height: 1.25;
letter-spacing: -0.01em;
margin-bottom: var(--sp-3);
}
h3 {
font-size: var(--fs-base);
font-weight: 600;
line-height: 1.3;
margin-bottom: var(--sp-2);
}
/* Text */
p {
margin-bottom: var(--sp-3);
}
small {
font-size: var(--fs-sm);
color: var(--c-text-muted);
}
/* Lists */
ul,
ol {
margin-left: var(--sp-5);
margin-bottom: var(--sp-3);
}
li {
margin-bottom: var(--sp-2);
}
/* Links */
a {
color: var(--c-accent);
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
a:focus-visible {
outline: 2px solid var(--c-accent);
outline-offset: 2px;
border-radius: 2px;
}
/* Buttons - base
*
* A plain reset only — no color, no padding beyond zero. Every visible
* button opts into a look via a `.btn` variant (see primitives.css) so a
* semantic element that happens to be a `