/*
 * public-portal.css
 * Components for the redesigned public patient flow. Load AFTER public-tokens.css,
 * both from <head>. Every rule is scoped under `.pf`.
 *
 * Two constraints shape this file:
 *
 * 1. Two of the three chrome variants still extend templates/base.html, which loads
 *    Bootstrap 3. `{% block extra_css %}` sits after those <link>s, so equal
 *    specificity wins -- but only if component selectors stay at ONE class. Bootstrap
 *    sets body font, `a` colour, `label` weight and heading sizes globally, so
 *    anything it would otherwise win is restated here rather than assumed.
 * 2. Mobile-first. The portal and clinic pages switch between the phone and the
 *    desktop artboard at 720px, the boundary the v3 handoff recommends; the order
 *    forms keep their 640px, and the booking frame's fallback its 1024px (tied to the
 *    SPA's own layout). NOT Bootstrap's 767/991, and no hidden-xs/visible-xs in new
 *    markup -- those helpers do not exist on the standalone shell.
 *
 * Interactive borders use --pf-line-strong (3:1+), decorative rules use --pf-line.
 * See the token file for why those are two tokens.
 */

/* ---------- Shell ---------- */

/* `overflow: clip`, NOT `hidden`, and the directory's pickers depend on it. `overflow: hidden` makes
   the shell a scroll container, and a `position: sticky` descendant sticks to its nearest scroll
   container -- which for the shell never scrolls, so the two pickers simply scrolled away with the
   page. `clip` clips to the rounded corners exactly as `hidden` did without creating one. The
   `hidden` line stays first as the fallback for an engine that predates `clip` (Safari < 16): there
   the declaration below is dropped, the corners are still clipped, and the pickers merely do not
   stick. */
.pf-shell {
    max-width: var(--pf-shell);
    margin: 0 auto;
    background: var(--pf-card);
    border: 1px solid var(--pf-card-line);
    border-radius: 22px;
    overflow: hidden;
    overflow: clip;
    box-shadow: 0 20px 60px rgba(5, 60, 62, 0.12);
}

/* The brand strip across the top of the frame; the footer carries its mirror image. */
.pf-shell::before {
    content: "";
    display: block;
    height: 4px;
    background: linear-gradient(90deg, var(--pf-p700) 0%, var(--pf-p500) 55%, var(--pf-p200) 100%);
}

.pf-body {
    margin: 0;
    /* Unconditional, as in the mockup: ~11px of ground around the card at 375px. */
    padding: clamp(0px, 3vw, 40px);
    background: var(--pf-ground);
}

@media (min-width: 720px) {
    .pf-shell {
        border-radius: var(--pf-radius);
        box-shadow: var(--pf-shadow);
    }

    .pf-shell::before {
        height: 5px;
    }
}

/* ---------- Header ----------
 * The phone artboard is two rows -- identity, then "Kontakt" and the language box side by side --
 * and the desktop one is a single row with the name on the left and the language box and "Kontakt"
 * pushed to the right. Mobile-first: the base rules are the phone, 720px switches to desktop, the
 * boundary the handoff recommends ("prelom pri ~720 px").
 */

.pf-header {
    display: flex;
    flex-direction: column;
    gap: 10px;
    padding: 12px 16px;
    border-bottom: 2px solid var(--pf-line);
    background: var(--pf-card);
}

.pf-header__identity {
    display: flex;
    align-items: center;
    gap: 10px;
    min-width: 0;
}

/* The logo's home link. It wraps only the logo/initial box, so it must not pick up the header's
   own spacing or the underline `.pf a:hover` adds -- there is no text here to underline, and a rule
   under a 44px image reads as a rendering fault. `flex: none` keeps it from being squeezed when the
   organisation name is long. */
.pf-header__home {
    display: inline-flex;
    align-items: center;
    flex: none;
    border-radius: var(--pf-radius-s);
}

.pf-header__logo {
    max-height: 42px;
    max-width: 180px;
    width: auto;
    object-fit: contain;
    flex: none;
}

/* 2 of 2 359 providers have a logo, so this initial box is the DEFAULT state of the
   header, not a fallback for an edge case. Sized to match the logo slot, and drawn like the
   artboards' LOGO tile: a soft gradient tile on the phone, a flat --pf-p100 one on desktop. */
.pf-header__mark {
    width: 42px;
    height: 42px;
    flex: none;
    border-radius: var(--pf-radius-s);
    background: linear-gradient(150deg, var(--pf-p100) 0%, var(--pf-p50) 100%);
    color: var(--pf-p700);
    display: grid;
    place-items: center;
    font: 800 18px/1 var(--pf-font);
}

.pf-header__name {
    /* `normal`, as the artboards' `font` shorthand leaves it. */
    font: 800 17px/normal var(--pf-font);
    letter-spacing: -0.02em;
    margin: 0;
    min-width: 0;
}

/* Phone row two: "Kontakt" fills the row and the language box sits at its end. The DOM order is
   the DESKTOP order (language, then "Kontakt" -- see _site_header.html), so `order` puts the nav
   first here. `flex-wrap` stays as the failure mode for a very narrow screen: `.pf-shell` clips,
   so `nowrap` would push the language box off the side with no way to reach it. */
.pf-header__tools {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
}

.pf-header__tools .pf-nav {
    order: -1;
}

.pf-nav {
    display: flex;
    align-items: center;
    gap: 8px;
    flex: 1 1 auto;
    min-width: 0;
}

.pf-nav__link {
    position: relative;
    flex: 1 1 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: var(--pf-tap);
    padding: 0 12px;
    border-radius: 10px;
    /* --pf-line, the artboards' own border. The pill is a link with a visible text label, and
       WCAG 1.4.11 does not ask for a 3:1 boundary on a control its text already identifies. */
    border: 2px solid var(--pf-line);
    background: var(--pf-card);
    color: var(--pf-ink);
    font: 600 17px/1.2 var(--pf-font);
    text-align: center;
    transition: background-color 0.16s;
}

/* The desktop hover underline: a 3px bar that grows in from the left. Drawn here so the rule
   exists at every width, and switched on only in the 720px block -- the phone pill has no bar. */
.pf-nav__link::after {
    content: "";
    position: absolute;
    left: 16px;
    right: 16px;
    bottom: 7px;
    height: 3px;
    border-radius: 999px;
    background: var(--pf-p500);
    transform: scaleX(0);
    transform-origin: left;
    transition: transform 0.18s;
}

@media (min-width: 720px) {
    .pf-header {
        flex-direction: row;
        align-items: center;
        flex-wrap: wrap;
        gap: 16px;
        padding: 14px clamp(16px, 4vw, 44px);
    }

    .pf-header__identity {
        gap: 12px;
    }

    .pf-header__logo {
        max-height: 44px;
    }

    .pf-header__mark {
        width: 44px;
        height: 44px;
        background: var(--pf-p100);
    }

    .pf-header__name {
        font-size: clamp(18px, 2.4vw, 21px);
    }

    .pf-header__tools {
        margin-left: auto;
        gap: 16px;
    }

    .pf-header__tools .pf-nav {
        order: 0;
    }

    .pf-nav {
        flex: none;
    }

    /* The desktop artboard's nav is a plain padded anchor -- the bordered pill is the phone's. */
    .pf-nav__link {
        flex: none;
        padding: 12px 16px;
        border-color: transparent;
        background: transparent;
        font-size: 18px;
    }

    .pf-nav__link:hover {
        background: var(--pf-p50);
    }

    .pf-nav__link:hover::after {
        transform: scaleX(1);
    }
}

/* ---------- Language selector ----------
 * The two artboards differ MORE here than anywhere else in the header, and the base
 * rules below are the MOBILE control (icon only, tight): gap 6, padding 0 8px, a 20px
 * globe, a 44px 16px select, radius 10. The 720px block swaps in the desktop control:
 * a wider pill, the word "Jezik", a 22px globe and a 40px 18px select.
 *
 * The BORDER is on .pf-lang__box (the <label>), not on .pf-lang (the <form>). See the
 * comment in _lang_select.html: as a label the whole pill is the select's click target,
 * which is what both artboards draw and what a 2px box around a control implies.
 */

.pf-lang {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    /* Never the control that gives way when the header row is tight: it is the smaller of the
       two, and shrinking a <select> makes its label unreadable before it makes the row fit.
       `.pf-nav` carries `min-width: 0` and absorbs the squeeze instead. */
    flex: none;
}

.pf-lang__box {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 0 8px;
    min-height: var(--pf-tap);
    /* --pf-line, as both artboards draw it. The box holds a native select showing its current
       value and a chevron, which is what identifies it -- the same reading as the nav pill. */
    border: 2px solid var(--pf-line);
    border-radius: 10px;
    background: var(--pf-card);
    margin: 0;
    font-weight: inherit;
    cursor: pointer;
}

.pf-lang__box:hover {
    border-color: var(--pf-p700);
}

/* The ring goes on the BOX. The select carries no border of its own, so
   :focus-visible on the select drew a small rectangle inside the pill -- a focus
   indicator has to surround the control a keyboard user can see, and that is the pill. */
.pf-lang__box:focus-within {
    outline: 3px solid var(--pf-p700);
    outline-offset: 3px;
}

.pf-lang__globe {
    flex: none;
    width: 20px;
    height: 20px;
    color: var(--pf-p700);
}

.pf-lang__select {
    min-height: 44px;
    border: 0;
    background: transparent;
    color: var(--pf-p700);
    font: 700 16px/1.2 var(--pf-font);
    cursor: pointer;
}

/* Suppressed because .pf-lang__box:focus-within already draws the ring around the whole
   control. Without this the two indicators nest -- and they DID: written as
   `.pf-lang__select:focus-visible` this was (0,2,0) against the token file's
   `.pf select:focus-visible` at (0,2,1), so the primitive won on specificity whatever the load
   order, and the select kept its own 3px ring inset well inside the pill. Including the type
   selector makes this (0,3,1). */
.pf select.pf-lang__select:focus-visible {
    outline: none;
}

/* Text label on desktop, icon-only on mobile -- the two artboards differ here. The
   select keeps an aria-label so hiding this does not leave it unnamed on a phone. */
.pf-lang__label {
    display: none;
    font-size: 17px;
    font-weight: 600;
    margin: 0;
}

@media (min-width: 720px) {
    .pf-lang__box {
        gap: 10px;
        padding: 6px 14px 6px 12px;
        border-radius: var(--pf-radius-s);
    }

    .pf-lang__globe {
        width: 22px;
        height: 22px;
    }

    .pf-lang__label {
        display: inline;
    }

    .pf-lang__select {
        min-height: 40px;
        padding: 6px 8px;
        font: 700 18px/1.2 var(--pf-font);
    }
}

/* Hidden by public-portal.js once auto-submit is wired. Do NOT display:none it in CSS --
   a visitor without JS needs it. */
.pf-lang__go {
    min-height: 40px;
    padding: 0 10px;
    border: 0;
    border-radius: var(--pf-radius-s);
    background: var(--pf-p50);
    color: var(--pf-p700);
    font: 700 15px/1.2 var(--pf-font);
    cursor: pointer;
}

/* ---------- Back link ---------- */

/* `.pf-crumbs` lived here. The breadcrumb is gone from all three chromes, along with the
   `back_link` block and every fill of it -- see the note in booking/public/base.html.
   `.pf-back` below is a DIFFERENT control and stays: it is the clinic page's own
   "Nazaj na vse ambulante" link in public/_clinic_identity.html. */

.pf-back {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    min-height: var(--pf-tap);
    font: 700 18px/1.2 var(--pf-font);
}

@media (min-width: 720px) {
    .pf-back {
        gap: 10px;
    }
}

/* ---------- Two layouts, one element ----------
 * A few strings exist only in one artboard -- the picker eyebrows and the toggles' short labels --
 * so the markup carries both and this pair shows one. The hidden one is `display: none`, which
 * removes it from the accessibility tree as well, so a control's accessible name is always the
 * label on screen. For SPANS only: an element with a `display` of its own would beat this pair on
 * source order, which is why the two "Počisti filter" copies have their own modifiers instead.
 */
.pf-wide {
    display: none;
}

@media (min-width: 720px) {
    .pf-wide {
        display: inline;
    }

    .pf-narrow {
        display: none;
    }
}

/* ---------- Messages ----------
 * There is no thank-you page in this flow: an order's success flash IS the
 * confirmation, rendered on the clinic page the patient is redirected to. So this
 * region has to be prominent and above the fold -- not a quiet strip. */

/* `:not(:empty)` CANNOT gate this, so the wrapper is gated in the template instead.
   A rendered Django include leaves whitespace text nodes behind -- measured on a page with no
   flash message, the element's innerHTML is "\A  \A \A \A \A " -- and `:empty` does not match an
   element containing whitespace. So `:not(:empty)` was always true and every page in the flow
   carried 16px of padding above a band with nothing in it. booking/public/base.html now renders
   the wrapper only when there is something to put in it, which also keeps an empty
   `id="messages"` container out of the DOM, where the pre-redesign chrome's selectors look. */
.pf-messages {
    padding: 16px clamp(16px, 4vw, 44px) 0;
}

.pf-alert {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    padding: 16px 18px;
    margin: 0 0 12px;
    border: 2px solid var(--pf-line);
    border-radius: var(--pf-radius-m);
    background: var(--pf-card);
    font-size: 17px;
    line-height: 1.55;
}

/* Success and error are the two outcomes a patient must not miss -- an order's success flash is
   its only confirmation -- and the teal success box read as one more pale notice beside the
   clinic's own (review 2026-09). So both get a colour of their own, a heavy left edge, semibold
   text and an icon (booking/public/_icon.html, included by _messages_public.html).
   Literals, like the red, because public-tokens.css is re-derived for WCAG contrast by
   booking/tests/test_public_tokens.py and these are not part of either theme's ramp. Measured:
   #1e6e3e on #e3f2e8 is 5.40:1 and --pf-ink on it 14.92:1; #a3242b on #fce8e6 is 6.27:1 and
   --pf-ink on it 14.66:1. */
.pf-alert--success {
    border-color: #1e6e3e;
    border-left-width: 8px;
    background: #e3f2e8;
    font-weight: 600;
}

/* The BASE alert is white on white -- `background: var(--pf-card)` is the shell's own colour --
   with only a 1.44:1 outline to find it by, and `messages.info(...)` reaches it in production (the
   referral-company route and the existing-patients-only notice both use it). Tinted as its own
   modifier rather than by retinting the base: the base is also where an untagged and a
   `debug`-tagged message land, and giving those a wash would make a neutral notice read as a
   success. Matches `.pf-notice`, which carries the same shape of information. */
.pf-alert--info {
    border-color: var(--pf-p200);
    background: var(--pf-p50);
}

.pf-alert--error {
    border-color: #a3242b;
    border-left-width: 8px;
    background: #fce8e6;
    font-weight: 600;
}

.pf-alert--warning {
    border-color: #8a5a00;
    background: #fff8e6;
}

/* 24px on the text's first line: 17px at 1.55 is a ~26px line box. */
.pf-alert__icon {
    flex: none;
    width: 24px;
    height: 24px;
    margin-top: 1px;
}

.pf-alert--success .pf-alert__icon {
    color: #1e6e3e;
}

.pf-alert--error .pf-alert__icon {
    color: #a3242b;
}

.pf-alert__close {
    margin-left: auto;
    flex: none;
    min-width: var(--pf-tap);
    min-height: var(--pf-tap);
    border: 0;
    background: transparent;
    color: inherit;
    font-size: 20px;
    line-height: 1;
    cursor: pointer;
}

/* ---------- Sections ----------
 *
 * HEADINGS AND PARAGRAPHS ARE ADDRESSED AS `.pf .pf-x`, (0,2,0), wherever a rule sets their margin.
 * public-tokens.css resets `.pf h1..h4 { margin: 0 0 .5em }` and `.pf p { margin: 0 0 .75em }` at
 * (0,1,1), which beats any single-class component rule whatever the load order -- so the margins
 * those rules declared for the section heads, the intros and the group headings were never
 * applied. Colour and size are unaffected (the reset sets neither), so they stay at one class.
 */

.pf-section {
    padding: clamp(22px, 3.4vw, 32px) clamp(16px, 4vw, 44px);
}

/* The hero band: the portal's organisation hero and the clinic page's identity band. A soft
   radial glow of the brand colour in the top-right corner over a --pf-p50-to-white wash. The phone
   artboard's glow is a little wider and stronger than the desktop one. */
.pf-band {
    background:
        radial-gradient(64% 90% at 92% 0%, color-mix(in srgb, var(--pf-p500) 18%, transparent) 0%, transparent 64%),
        linear-gradient(180deg, var(--pf-p50) 0%, #ffffff 100%);
    border-bottom: 1px solid var(--pf-line);
}

.pf-section__head {
    font-size: 25px;
    font-weight: 800;
}

/* Scoped to the portal's ruled heads (Ambulante, Kontakt). The provider directory and the
   personal-data notice use `.pf-section__head` for their <h1> too, and rely on the reset's 0.5em
   under it. */
.pf .pf-section__head--rule {
    margin: 0;
}

/* The short brand-coloured rule under a section head (Ambulante, Kontakt). Part of the heading's
   box rather than a sibling, so no page can render one without the other. */
.pf-section__head--rule::after {
    content: "";
    display: block;
    width: 48px;
    height: 5px;
    margin-top: 12px;
    border-radius: 999px;
    background: var(--pf-p500);
}

.pf-section__intro {
    font-size: 19px;
    line-height: 1.55;
    color: var(--pf-ink2);
    /* The mockup's measure. It keeps the directory's two-sentence intros readable rather than
       letting them run the full 1180px of the shell. */
    max-width: 52ch;
}

/* The directory's intro, drawn by both artboards; the provider-directory page keeps the reset's
   paragraph margins. */
.pf-directory .pf-section__intro {
    font-size: 18px;
}

.pf .pf-directory .pf-section__intro {
    margin: 12px 0 0;
}

/* The one intro that opts OUT of the measure. A modifier rather than dropping `max-width` from the
   shared rule: the other intros keep the measure the mockup gives them. */
.pf-section__intro--full {
    max-width: none;
}

@media (min-width: 720px) {
    .pf-section__head {
        font-size: clamp(24px, 3.6vw, 30px);
    }

    .pf-section__head--rule::after {
        width: 54px;
    }

    .pf-directory .pf-section__intro {
        font-size: 19px;
    }

    .pf .pf-directory .pf-section__intro {
        margin-top: 14px;
    }
}

/* The phone artboard sets its headings at 1.2, the desktop one at the token's 1.15. */
@media (max-width: 719px) {
    .pf h1,
    .pf h2,
    .pf h3 {
        line-height: 1.2;
    }
}

/* ---------- Hero ---------- */

.pf-section.pf-band {
    padding: 22px 16px 24px;
}

.pf-hero {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

/* The column flex lives HERE, not only in the desktop block, and that is what makes
   `.pf-hero__cta { align-self: stretch }` below do anything: `align-self` is a flex ITEM property,
   and the phone artboard's primary CTA is edge to edge. */
.pf-hero__main {
    display: flex;
    flex-direction: column;
    gap: 14px;
    min-width: 0;
}

/* Phone only: the pill above the title. */
.pf-hero__eyebrow {
    align-self: flex-start;
    padding: 6px 13px;
    border-radius: 999px;
    background: var(--pf-p100);
    color: var(--pf-p700);
    font: 800 14px/1.6 var(--pf-font);
    letter-spacing: 0.07em;
    text-transform: uppercase;
}

.pf-hero__title {
    font-size: 28px;
    font-weight: 800;
}

.pf .pf-hero__title {
    margin: 0;
}

.pf-hero__tagline {
    font-size: 19px;
    line-height: 1.5;
    color: var(--pf-ink2);
    max-width: 34ch;
}

.pf .pf-hero__tagline {
    margin: 0;
}

.pf-hero__cta {
    align-self: stretch;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    min-height: 60px;
    padding: 0 24px;
    border-radius: 14px;
    background: var(--pf-p700);
    color: var(--pf-onp);
    font: 700 20px/1.6 var(--pf-font);
    box-shadow: 0 10px 22px rgba(5, 60, 62, 0.22);
    transition: box-shadow 0.18s, transform 0.14s;
}

.pf-hero__cta:active {
    transform: scale(0.985);
}

/* The arrow that closes the hero CTA, the card CTAs and the tiles. A span so the hovers can nudge
   it without moving the label. */
.pf-arr {
    display: inline-block;
    transition: transform 0.18s;
}

/* The contact details beside the title. On the phone they are plain rows in the hero column --
   the address, then the phone number as an outlined button -- and the e-mail is left to "Pišite
   nam" in #kontakt, as the phone artboard has it. Desktop turns the block into the white card. */
.pf-meta {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

.pf-meta__item {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    font-size: 18px;
    color: var(--pf-ink);
}

a.pf-meta__item {
    align-items: center;
}

.pf-meta__item--phone {
    min-height: 52px;
    padding: 12px 16px;
    border: 2px solid var(--pf-p700);
    border-radius: var(--pf-radius-s);
    background: var(--pf-card);
    font-size: 19px;
    font-weight: 700;
}

.pf-meta__item--email {
    display: none;
}

.pf-icon {
    flex: none;
    width: 21px;
    height: 21px;
    margin-top: 3px;
    color: var(--pf-p700);
}

a.pf-meta__item .pf-icon {
    margin-top: 0;
    color: currentColor;
}

@media (min-width: 720px) {
    .pf-section.pf-band {
        padding: clamp(26px, 3.8vw, 40px) clamp(16px, 4vw, 44px);
        background:
            radial-gradient(58% 120% at 88% 0%, color-mix(in srgb, var(--pf-p500) 16%, transparent) 0%, transparent 62%),
            linear-gradient(180deg, var(--pf-p50) 0%, #ffffff 100%);
    }

    .pf-hero {
        flex-direction: row;
        flex-wrap: wrap;
        align-items: center;
        gap: clamp(18px, 3vw, 40px);
    }

    .pf-hero__main {
        flex: 1 1 380px;
    }

    .pf-hero__eyebrow {
        display: none;
    }

    .pf-hero__title {
        font-size: clamp(28px, 4.4vw, 38px);
    }

    .pf-hero__tagline {
        font-size: clamp(18px, 2.4vw, 21px);
    }

    .pf-hero__cta {
        align-self: flex-start;
        display: inline-flex;
        min-height: 56px;
        padding: 16px 30px;
        border-radius: var(--pf-radius-s);
        box-shadow: 0 8px 20px rgba(5, 60, 62, 0.20);
        transition: box-shadow 0.18s, transform 0.18s;
    }

    .pf-hero__cta:hover {
        box-shadow: 0 12px 26px rgba(5, 60, 62, 0.26);
        transform: translateY(-2px);
    }

    .pf-hero__cta:active {
        transform: translateY(-2px);
    }

    .pf-meta {
        flex: 0 1 320px;
        gap: 10px;
        padding: 20px 22px;
        background: var(--pf-card);
        border: 2px solid var(--pf-p200);
        border-radius: var(--pf-radius-m);
        box-shadow: 0 10px 26px rgba(5, 60, 62, 0.08);
    }

    .pf-meta__item {
        gap: 12px;
    }

    a.pf-meta__item {
        min-height: var(--pf-tap);
    }

    .pf-meta__item--phone {
        min-height: var(--pf-tap);
        padding: 0;
        border: 0;
        background: transparent;
    }

    .pf-meta__item--email {
        display: flex;
    }

    .pf-icon {
        width: 22px;
        height: 22px;
    }
}

/* ---------- Directory: pickers ----------
 *
 * "Področja" and "Lokacije" -- the selected value and a button that opens the list under it, both
 * inside one bordered frame (the v3 pattern that replaced the grid of location cards). Driven by
 * public-portal.js (wireDirectory); the markup's own comment says what works without it.
 *
 * BOTH PICKERS STICK -- where that helps. The area picker to the top of the viewport, the location
 * picker directly under it: `--pf-area-h` is the area picker's current height, measured by a
 * ResizeObserver in the script, so the location picker moves down when the area list opens.
 * `pf-picker--solo` is the location picker with no area picker above it. Sticking needs `.pf-shell`
 * to be `overflow: clip` rather than `hidden` -- see the Shell rules.
 *
 * THREE CONDITIONS, all in the one rule that turns it on (under "Directory: sticky stack" below):
 *   - the anonymous shell (`.pf-body`). The logged-in patient's chrome has Bootstrap's fixed navbar
 *     at the top of the viewport, and a picker stuck at `top: 0` slid underneath it;
 *   - the script running (`.is-enhanced`, set by wireDirectory). Without it a picker cannot do
 *     anything, and a control that follows the visitor down the page doing nothing is noise;
 *   - a screen at least 640px tall. The stuck stack is ~205px on desktop and up to ~260px on a phone
 *     with both "Počisti filter" rows showing, which is most of a landscape phone or of a desktop at
 *     400% zoom.
 * And while it sticks, the focusable things below it get a `scroll-margin-top` of the stack's
 * height (`--pf-stack-h`, measured by the same observer), so keyboard focus moving back up the list
 * lands below the stack instead of under it (WCAG 2.4.11).
 */

.pf-directory {
    padding: 24px 16px 0;
}

/* Where a pick scrolls back to. Zero-height; it only has to be in the flow -- and on the phone
   12px below the intro, where the phone artboard's column gap puts it, so a pick scrolls to the
   same place. */
.pf-directory__anchor {
    height: 0;
    margin-top: 12px;
}

.pf-filterhead {
    font-size: 19px;
    font-weight: 700;
}

/* The phone artboard stacks the section as a column with 12px gaps and gives the heading 6px of its
   own, so a heading sits 18px below whatever precedes it -- for the first one that is the #filtri
   anchor, itself 12px below the intro. The results line sits the same 18px below the anchor when
   there is no picker at all. */
.pf .pf-filterhead {
    margin: 18px 0 12px;
}

.pf .pf-directory__anchor + .pf-results {
    margin-top: 18px;
}

.pf-filterhead__count {
    font-weight: 500;
    color: var(--pf-ink2);
}

.pf-picker {
    top: 0;
    z-index: 6;
    background: var(--pf-card);
    border: 2px solid var(--pf-p700);
    border-radius: 14px;
    box-shadow: 0 8px 20px rgba(5, 60, 62, 0.10);
}

.pf-picker--location {
    top: calc(var(--pf-area-h, 74px) + 6px);
    z-index: 5;
}

.pf-picker--solo {
    top: 0;
}

.pf-picker__row {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 10px 10px 14px;
    background: var(--pf-p50);
    border-radius: var(--pf-radius-s);
}

/* The phone artboard has no icon in the row. */
.pf-picker__icon {
    display: none;
    flex: none;
    width: 24px;
    height: 24px;
    color: var(--pf-p700);
}

.pf-picker__text {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
}

.pf-picker__eyebrow {
    font-size: 14px;
    font-weight: 800;
    line-height: 1.6;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--pf-p700);
}

.pf-picker__value {
    font-size: 18px;
    font-weight: 800;
    line-height: 1.3;
}

.pf-picker__meta {
    font-size: 16px;
    line-height: 1.4;
    color: var(--pf-ink2);
}

/* "Zamenjaj" / "Zapri ✕": the secondary button. Its label follows `aria-expanded`, so it can never
   disagree with the panel -- the script flips the attribute and nothing else. */
.pf-picker__toggle {
    flex: none;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    min-height: var(--pf-tap);
    padding: 10px 14px;
    border: 2px solid var(--pf-p700);
    border-radius: var(--pf-radius-s);
    background: var(--pf-card);
    color: var(--pf-p700);
    font: 700 17px/1.2 var(--pf-font);
    cursor: pointer;
}

.pf-picker__toggle[aria-expanded="true"] .pf-picker__closed,
.pf-picker__toggle[aria-expanded="false"] .pf-picker__opened {
    display: none;
}

/* "✕   Počisti filter". Rendered twice -- inside the row on desktop, as a full-width row of its own
   under it on the phone -- see _clinic_directory.html. The three spaces and the unbroken underline
   are the design's: `white-space: pre` keeps the spaces, and the underline runs under them. */
.pf-picker__clear {
    align-items: center;
    border: 0;
    background: transparent;
    color: var(--pf-p700);
    font: 400 17px/1.2 var(--pf-font);
    text-decoration: underline;
    text-underline-offset: 4px;
    white-space: pre;
    cursor: pointer;
}

.pf-picker__clear--inline {
    display: none;
}

.pf-picker__clear--row {
    display: flex;
    width: 100%;
    min-height: 44px;
    padding: 0 14px;
    border-top: 1px solid var(--pf-line);
    border-radius: 0 0 var(--pf-radius-s) var(--pf-radius-s);
    background: var(--pf-card);
}

/* The list under the row. The panel itself carries no box of its own -- padding and the rule live
   on `.pf-picker__inner` -- because the script animates the panel's height to and from 0 when it
   opens and closes, and padding would keep a border-box element from ever reaching 0. */
.pf-picker__inner {
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 12px;
    border-top: 2px solid var(--pf-line);
}

.pf-picker__options {
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 2px;
}

.pf-picker--area .pf-picker__options {
    max-height: 55vh;
    overflow: auto;
}

.pf-picker__options--scroll {
    max-height: 45vh;
    overflow: auto;
}

.pf .pf-picker__search {
    display: flex;
    flex-direction: column;
    gap: 6px;
    margin: 0;
    font-weight: inherit;
}

.pf-picker__search-label {
    font-size: 16px;
    font-weight: 700;
}

/* A bare text field: its border IS the only thing marking it, so this is one of the few places the
   design's --pf-line gives way to --pf-line-strong (WCAG 1.4.11; see the token file). The type
   selector is for the patient chrome, where Bootstrap's normalize gives `input[type=search]` a
   `content-box` sizing at (0,1,1) that would push the field out of the panel. */
.pf input.pf-picker__input {
    box-sizing: border-box;
    width: 100%;
    min-height: 52px;
    padding: 12px 14px;
    border: 2px solid var(--pf-line-strong);
    border-radius: var(--pf-radius-s);
    background: var(--pf-card);
    color: var(--pf-ink);
    font: 500 17px/1.3 var(--pf-font);
    -webkit-appearance: none;
    appearance: none;
}

.pf input.pf-picker__input:focus {
    border-color: var(--pf-p700);
    outline: 3px solid var(--pf-p700);
    outline-offset: 1px;
}

.pf-picker__status {
    font-size: 16px;
    color: var(--pf-ink2);
}

.pf .pf-picker__status {
    margin: 0;
}

/* One option: a check column, then the name over its count (and, for a location, its address).
   `flex: none` on the phone, where the list is a scrolling column: flex items shrink by default
   and a long list would squash every option instead of scrolling. */
.pf-option {
    flex: none;
    display: flex;
    align-items: center;
    gap: 10px;
    min-height: 60px;
    padding: 12px;
    border: 2px solid var(--pf-line);
    border-radius: var(--pf-radius-s);
    background: var(--pf-card);
    color: var(--pf-ink);
    font-family: var(--pf-font);
    line-height: 1.35;
    text-align: left;
    cursor: pointer;
}

.pf-option.is-selected {
    border-color: var(--pf-p700);
    background: var(--pf-p50);
}

/* THE RING IS DRAWN INSIDE the option. The lists scroll, and a scroll container clips an outline:
   the token file's ring sits 3-6px outside the element while the lists keep only the design's 2-3px
   of padding, so the ring vanished at the list's edges. -5px puts it just inside the 2px border --
   a 3px --pf-p700 band on an unselected option, and a visibly heavier edge on the selected one.
   (0,3,0), to beat the token primitives' (0,2,1). */
.pf .pf-option:focus-visible {
    outline-offset: -5px;
}

.pf-picker--location .pf-option {
    min-height: 64px;
}

.pf-option__check {
    width: 20px;
    flex: none;
    font: 800 18px/1 var(--pf-font);
    color: var(--pf-p700);
}

.pf-option__body {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
}

.pf-option__name {
    font-size: 17px;
    font-weight: 700;
}

/* The phone artboard sets the option at 1.35 and a location's two meta lines at 1.4. */
.pf-option__meta {
    font-size: 16px;
    color: var(--pf-ink2);
}

.pf-picker--location .pf-option__meta {
    line-height: 1.4;
}

/* Address and count: two lines on the phone; on desktop ONE run of text joined by " · ", which
   wraps wherever it has to, as the design's single string does ("... Ljubljana · 4 / ambulante").
   The separator's spaces are ordinary ones for the same reason: non-breaking ones glued the count
   to the town and moved both to a line of their own. `\20` is the trailing space -- a literal one
   after `\B7` would be eaten as the escape's terminator. */
.pf-option__metas {
    display: flex;
    flex-direction: column;
}

@media (min-width: 720px) {
    .pf-directory {
        padding: clamp(26px, 4vw, 38px) clamp(16px, 4vw, 44px) 0;
    }

    .pf-filterhead {
        font-size: 20px;
    }

    /* Desktop has no column gap: the anchor sits right under the intro. */
    .pf-directory__anchor {
        margin-top: 0;
    }

    .pf .pf-filterhead {
        margin: 26px 0 12px;
    }

    .pf .pf-directory__anchor + .pf-results {
        margin-top: 20px;
    }

    /* "Lokacije" directly under the area picker sits 22px below it, not 26. */
    .pf .pf-picker + .pf-filterhead {
        margin-top: 22px;
    }

    .pf-picker {
        box-shadow: 0 10px 26px rgba(5, 60, 62, 0.10);
    }

    .pf-picker--location {
        top: calc(var(--pf-area-h, 84px) + 8px);
    }

    .pf-picker--solo {
        top: 0;
    }

    .pf-picker__row {
        flex-wrap: wrap;
        gap: 14px;
        padding: 14px 16px 14px 18px;
    }

    .pf-picker__icon {
        display: block;
    }

    .pf-picker__text {
        flex: 1 1 260px;
        gap: 2px;
    }

    .pf-picker__eyebrow {
        font-size: 15px;
    }

    .pf-picker__value {
        font-size: 20px;
    }

    .pf-picker__meta {
        font-size: 17px;
        line-height: 1.6;
    }

    .pf-picker__toggle {
        gap: 10px;
        min-height: 52px;
        padding: 12px 20px;
        font-size: 18px;
    }

    .pf-picker__clear {
        font-size: 18px;
    }

    .pf-picker__clear--inline {
        display: inline-flex;
        gap: 8px;
        min-height: 52px;
        margin-right: 14px;
        padding: 12px 16px;
        border-radius: var(--pf-radius-s);
    }

    .pf-picker__clear--row {
        display: none;
    }

    .pf-picker__inner {
        gap: 10px;
        padding: 16px 18px 18px;
    }

    /* `max-content` rows, not the default `auto`. The list is a scroller capped at the max-height
       below, and every option has a 64px min-height -- and when a grid's auto rows add up to more
       than its max-height, CSS Grid 12.6 re-runs "maximize tracks" against that cap: each row gets
       its 64px floor plus an equal share of what is left, however much text the row holds. Firefox
       does exactly that (Chromium only once the height is definite), so on a provider with a
       dozen locations every row came out ~78px and a two-line name spilled out of its card top
       and bottom. A max-content row is as tall as its tallest option, so nothing is clipped and
       the list scrolls instead; the other options in the row stretch to match and keep their text
       centred (`align-items: center` on the option). */
    .pf-picker__options {
        display: grid;
        grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
        grid-auto-rows: max-content;
        gap: 8px;
        padding: 3px;
    }

    /* The design leaves the area list unbounded -- it draws four areas. Bounded like the location
       list here, so a provider with many groups cannot grow a stuck picker past the viewport,
       where its last options could never be scrolled to. */
    .pf-picker--area .pf-picker__options,
    .pf-picker__options--scroll {
        max-height: min(340px, 48vh);
    }

    .pf-picker__search-label {
        font-size: 17px;
    }

    .pf input.pf-picker__input {
        padding: 12px 16px;
        font-size: 18px;
    }

    .pf-picker__status {
        font-size: 17px;
    }

    /* `normal`, not the body's 1.6: the desktop artboard's options are <button>s, which do not
       inherit line-height, so their text sits at the font's own. */
    .pf-option,
    .pf-picker--location .pf-option {
        min-height: 64px;
        padding: 12px 14px;
        line-height: normal;
    }

    .pf-option__check {
        width: 22px;
        font-size: 19px;
    }

    .pf-option__body {
        gap: 1px;
    }

    .pf-option__name {
        font-size: 18px;
    }

    .pf-option__meta,
    .pf-picker--location .pf-option__meta {
        font-size: 17px;
        line-height: normal;
    }

    .pf-option__metas {
        display: block;
        font-size: 17px;
        line-height: normal;
        color: var(--pf-ink2);
    }

    .pf-option__metas .pf-option__meta {
        display: inline;
    }

    .pf-option__meta + .pf-option__meta::before {
        content: " \B7\20";
    }
}

/* ---------- Directory: sticky stack ----------
 * See the note at the top of the pickers section for the three conditions. `position: sticky` is the
 * only thing this adds: the `top` offsets are declared on the pickers themselves and do nothing while
 * they are static.
 */
@media (min-height: 640px) {
    .pf-body .pf-directory.is-enhanced .pf-picker {
        position: sticky;
    }

    .pf-body .pf-directory.is-enhanced .pf-results,
    .pf-body .pf-directory.is-enhanced .pf-grouphead,
    .pf-body .pf-directory.is-enhanced .pf-cliniccard,
    .pf-body .pf-directory.is-enhanced .pf-promo a {
        scroll-margin-top: calc(var(--pf-stack-h, 220px) + 16px);
    }
}

/* ---------- Directory: results line ---------- */

/* "Prikazanih je N ambulant ... na vseh lokacijah." After a pick it takes focus and glows
   --pf-p100 for 1.4s (`is-flash`, set and cleared by the script) so the eye lands on what changed;
   the fade is the 0.6s transition. */
.pf-results {
    padding: 10px 12px;
    border-radius: var(--pf-radius-s);
    font-size: 17px;
    color: var(--pf-ink2);
    background: transparent;
    transition: background-color 0.6s;
}

.pf .pf-results {
    margin: 18px 0 0;
}

.pf-results strong {
    color: var(--pf-ink);
}

.pf-results.is-flash {
    background: var(--pf-p100);
}

/* It receives focus from script only (tabindex -1), after a pick. The ring is drawn at its own
   edge, so it outlines the sentence the visitor is being pointed at. */
.pf-results:focus-visible {
    outline: 3px solid var(--pf-p700);
    outline-offset: 0;
}

@media (min-width: 720px) {
    .pf-results {
        padding: 12px 16px;
        font-size: 18px;
    }

    .pf .pf-results {
        margin-top: 20px;
    }
}

/* ---------- Clinic cards ---------- */

/* 28px: the phone artboard's 12px column gap plus the group's own 16px. */
.pf-group {
    padding-top: 28px;
}

.pf-grouphead {
    font-size: 21px;
    font-weight: 800;
    padding-bottom: 10px;
    border-bottom: 2px solid var(--pf-line);
}

.pf .pf-grouphead {
    margin: 0 0 12px;
}

.pf-clinicgrid {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 12px;
}

/* The whole card is one link. --pf-line, the design's border: the card is identified by its
   heading and its "Vstopite v ambulanto" call to action, not by its outline, which is the reading
   of WCAG 1.4.11 the token file records. */
.pf-cliniccard {
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 18px;
    border: 2px solid var(--pf-line);
    border-radius: var(--pf-radius-m);
    background: var(--pf-card);
    color: inherit;
    transition: border-color 0.18s, box-shadow 0.18s, transform 0.14s;
}

.pf-cliniccard:hover {
    border-color: var(--pf-p500);
    box-shadow: 0 10px 22px rgba(5, 60, 62, 0.12);
    color: inherit;
}

.pf-cliniccard:active {
    transform: scale(0.985);
}

.pf-cliniccard:hover .pf-arr {
    transform: translateX(4px);
}

.pf-cliniccard__name {
    font-size: 20px;
    font-weight: 700;
    line-height: 1.25;
}

.pf-cliniccard__doctor {
    font-size: 16.5px;
    color: var(--pf-ink2);
}

.pf-cliniccard__cta {
    margin-top: auto;
    padding-top: 6px;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font-size: 18px;
    font-weight: 700;
    color: var(--pf-p700);
}

@media (min-width: 720px) {
    .pf-group {
        padding-top: 30px;
    }

    .pf-grouphead {
        font-size: clamp(20px, 3vw, 24px);
        padding-bottom: 12px;
    }

    .pf .pf-grouphead {
        margin-bottom: 16px;
    }

    .pf-clinicgrid {
        grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
        gap: 14px;
    }

    .pf-cliniccard {
        gap: 10px;
        padding: 22px;
        min-height: 150px;
        transition: border-color 0.18s, box-shadow 0.18s, transform 0.18s;
    }

    .pf-cliniccard:hover,
    .pf-cliniccard:active {
        box-shadow: 0 14px 30px rgba(5, 60, 62, 0.14);
        transform: translateY(-3px);
    }

    .pf-cliniccard__name {
        font-size: 21px;
    }

    .pf-cliniccard__doctor {
        font-size: 17px;
    }

    .pf-cliniccard__cta {
        padding-top: 8px;
    }
}

/* ---------- Gospodar zdravja promo band ---------- */

.pf-promo {
    display: flex;
    flex-direction: column;
    gap: 12px;
    margin-top: 20px;
    padding: 18px;
    border: 2px solid var(--pf-p200);
    border-radius: var(--pf-radius-m);
    background: var(--pf-p50);
}

/* The logo's link hugs the logo, so it must not stretch across the column. */
.pf-promo__home {
    align-self: flex-start;
    display: inline-flex;
}

.pf-promo__logo {
    height: 28px;
    width: auto;
    display: block;
}

.pf-promo__body {
    display: flex;
    flex-direction: column;
    gap: 12px;
    min-width: 0;
}

.pf-promo__title {
    font-size: 19px;
    font-weight: 700;
}

.pf-promo__text {
    font-size: 17.5px;
    line-height: 1.55;
    color: var(--pf-ink2);
}

.pf-promo__cta {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 56px;
    padding: 0 28px;
    border-radius: var(--pf-radius-s);
    background: var(--pf-p700);
    color: var(--pf-onp);
    font: 700 19px/1.6 var(--pf-font);
}

.pf-promo__cta:hover {
    text-decoration: underline;
}

/* In the directory the phone artboard puts 32px above the band -- its 12px column gap plus the
   band's own 20px. On the clinic page it follows the schedule frame inside the same section. */
.pf-directory .pf-promo {
    margin-top: 32px;
}

.pf-duo + .pf-promo {
    margin-top: 20px;
}

@media (min-width: 720px) {
    .pf-promo,
    .pf-directory .pf-promo {
        flex-direction: row;
        align-items: center;
        flex-wrap: wrap;
        gap: 16px;
        margin-top: 30px;
        padding: 20px 22px;
    }

    .pf-promo__home {
        align-self: center;
        flex: none;
    }

    .pf-promo__logo {
        height: 30px;
    }

    .pf-promo__body {
        flex: 1 1 320px;
        gap: 4px;
    }

    .pf-promo__text {
        font-size: 18px;
    }

    .pf-promo__cta {
        display: inline-flex;
        padding: 16px 28px;
    }

    .pf-duo + .pf-promo {
        margin-top: 18px;
    }
}

/* ---------- Buttons ---------- */

/* The body's 1.6 line-height, as the artboards' buttons inherit it, and NO border on the filled
   variant -- only the outlined ones draw one. A transparent 2px border on every button made each
   filled one 4px larger than drawn in both directions. */
.pf-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    min-height: 52px;
    padding: 0 22px;
    border: 0;
    border-radius: var(--pf-radius-s);
    font: 700 18px/1.6 var(--pf-font);
    text-align: center;
    cursor: pointer;
}

/* The 20px icon the design puts in its buttons. */
.pf-btn__icon {
    flex: none;
    width: 20px;
    height: 20px;
}

.pf-btn--primary {
    background: var(--pf-p700);
    color: var(--pf-onp);
}

.pf-btn--primary:hover {
    text-decoration: underline;
}

.pf-btn--ghost {
    border: 2px solid var(--pf-p700);
    background: var(--pf-card);
    color: var(--pf-p700);
}

.pf-btn--ghost:hover {
    text-decoration: underline;
}

.pf-btn--muted {
    border: 2px solid var(--pf-line-strong);
    background: var(--pf-card);
    color: var(--pf-ink);
}

.pf-btn--muted:hover {
    text-decoration: underline;
}

/* ---------- Contact block ----------
 *
 * Three grid areas -- body, map, foot -- see _org_contact.html. The phone: no frame, one column in
 * DOM order (text, map, then the full-width buttons). Desktop: one bordered frame, body over foot in
 * the left column and the map filling the right one; `auto 1fr` rows keep the foot directly under
 * the body however tall the map grows.
 */

.pf-section--contact {
    padding: 26px 16px 30px;
}

/* The phone artboard's Kontakt column has 14px gaps where the directory's has 12. */
.pf-section--contact .pf-section__head--rule::after {
    margin-top: 14px;
}

.pf-contact {
    display: flex;
    flex-direction: column;
    gap: 14px;
    margin-top: 14px;
}

.pf-contact__body {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

.pf-contact__group {
    display: flex;
    flex-direction: column;
    gap: 8px;
}

.pf-contact__group + .pf-contact__group {
    padding-top: 14px;
    border-top: 2px solid var(--pf-line);
}

.pf-contact__group--intro {
    gap: 14px;
}

.pf-contact__name {
    font-size: 19px;
    font-weight: 800;
}

.pf-contact__head {
    font-size: 18px;
    font-weight: 700;
}

.pf-contact__desc {
    font-size: 17.5px;
    line-height: 1.6;
    color: var(--pf-ink2);
}

.pf .pf-contact__desc {
    margin: 0;
}

/* "Naše lokacije": one location per row on the phone, a multi-column grid on desktop. */
.pf-loclist {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 8px 20px;
    font-size: 17px;
    line-height: 1.5;
    color: var(--pf-ink2);
}

.pf-loclist strong {
    color: var(--pf-ink);
    font-weight: 700;
}

.pf-contact__foot {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

/* ONE COLUMN on the phone, full-width 56px buttons, as the phone artboard draws them. Desktop puts
   them side by side and lets them wrap. */
.pf-contact__actions {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

.pf-contact__actions .pf-btn {
    min-height: 56px;
}

.pf-contact__web {
    font-size: 18px;
}

@media (min-width: 720px) {
    .pf-section--contact {
        padding: clamp(26px, 4vw, 38px) clamp(16px, 4vw, 44px) clamp(34px, 5vw, 52px);
    }

    .pf-section--contact .pf-section__head--rule::after {
        margin-top: 12px;
    }

    .pf-contact {
        display: grid;
        grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
        grid-template-rows: auto 1fr;
        grid-template-areas:
            "body map"
            "foot map";
        gap: 0;
        margin-top: 18px;
        border: 2px solid var(--pf-line);
        border-radius: 18px;
        overflow: hidden;
    }

    .pf-contact__body {
        grid-area: body;
        gap: 20px;
        padding: clamp(20px, 3vw, 30px) clamp(20px, 3vw, 30px) 0;
    }

    .pf-contact > .pf-map {
        grid-area: map;
    }

    .pf-contact__foot {
        grid-area: foot;
        gap: 20px;
        padding: 20px clamp(20px, 3vw, 30px) clamp(20px, 3vw, 30px);
    }

    .pf-contact__group + .pf-contact__group {
        padding-top: 18px;
    }

    .pf-contact__group--intro {
        gap: 8px;
    }

    .pf-contact__name {
        font-size: 20px;
    }

    .pf-contact__head {
        font-size: 19px;
    }

    .pf-contact__desc {
        font-size: 18px;
    }

    .pf-loclist {
        grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    }

    .pf-loclist--stack {
        grid-template-columns: minmax(0, 1fr);
    }

    .pf-contact__actions {
        flex-direction: row;
        flex-wrap: wrap;
        gap: 12px;
        padding-top: 18px;
        border-top: 2px solid var(--pf-line);
    }

    .pf-contact__actions .pf-btn {
        min-height: 52px;
        padding: 14px 22px;
    }

    /* Nothing above the actions to separate them from when the body is empty of groups beyond the
       intro -- the rule is the design's, and it stays. The SOS link sits on its own line. */
    .pf-contact__foot .pf-sos {
        align-self: flex-start;
    }
}

/* ---------- Map panel ---------- */

/* THE UNLOADED MAP, drawn to the v3 design's `.mapoff`: a faint street grid in two weights, a
   diagonal road, two soft park discs, and a white vignette in the middle so the button and its
   caption sit on near-white. All tints are `color-mix` off --pf-p500, so the SoaPrevent scope
   re-tints the illustration with the rest of the palette.

   The phone's grid is a little tighter (44/50 and 16/18px against 54/62 and 18/21px).

   On the phone the panel is a rounded, bordered box of its own between the text and the buttons;
   on desktop it fills the frame's right column with a rule down its left edge. */
.pf-map {
    position: relative;
    display: flex;
    flex-direction: column;
    min-height: 190px;
    border: 2px solid var(--pf-line);
    border-radius: 14px;
    overflow: hidden;
    background:
        linear-gradient(115deg, transparent 46.4%, color-mix(in srgb, var(--pf-p500) 22%, #e9eeee) 46.4% 52%, transparent 52%),
        repeating-linear-gradient(0deg, rgba(16, 29, 29, 0.10) 0 1px, transparent 1px 44px),
        repeating-linear-gradient(90deg, rgba(16, 29, 29, 0.10) 0 1px, transparent 1px 50px),
        repeating-linear-gradient(0deg, rgba(16, 29, 29, 0.05) 0 1px, transparent 1px 16px),
        repeating-linear-gradient(90deg, rgba(16, 29, 29, 0.05) 0 1px, transparent 1px 18px),
        radial-gradient(38% 34% at 78% 22%, color-mix(in srgb, var(--pf-p500) 16%, #eef2f1) 0 70%, transparent 71%),
        radial-gradient(30% 26% at 16% 76%, color-mix(in srgb, var(--pf-p500) 12%, #eef2f1) 0 70%, transparent 71%),
        #f4f6f6;
}

.pf-map::after {
    content: "";
    position: absolute;
    inset: 0;
    background: radial-gradient(72% 62% at 50% 50%, rgba(255, 255, 255, 0.88) 0%, rgba(255, 255, 255, 0.58) 55%, rgba(255, 255, 255, 0.22) 100%);
    pointer-events: none;
}

.pf-map > * {
    position: relative;
    z-index: 1;
}

/* The clinic page's map is a touch shorter than the portal's on the phone. */
.pf-duo > .pf-map {
    min-height: 180px;
}

.pf-map__frame {
    flex: 1 1 auto;
    min-height: 240px;
    border: 0;
    width: 100%;
    display: block;
}

/* The click-to-load placeholder: pin, button, caption, centred on the illustration. */
.pf-map__consent {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 9px;
    text-align: center;
    padding: 16px;
}

.pf-map__consent .pf-btn {
    padding: 12px 22px;
}

/* Decorative: a quiet marker above the button, not a second focal point beside it. */
.pf-map__pin {
    width: 26px;
    height: 26px;
    flex: none;
    color: var(--pf-muted);
}

/* The caption naming the third party, which is what makes pressing the button an informed choice.
   --pf-muted is the design's note colour, 5.6:1 on white and kept at 14px, its floor. */
.pf-map__note {
    max-width: 40ch;
    font-size: 14px;
    line-height: 1.5;
    color: var(--pf-muted);
}

.pf .pf-map__note {
    margin: 0;
}

@media (min-width: 720px) {
    .pf-map {
        min-height: 320px;
        border: 0;
        border-left: 2px solid var(--pf-line);
        border-radius: 0;
        background:
            linear-gradient(115deg, transparent 46.4%, color-mix(in srgb, var(--pf-p500) 22%, #e9eeee) 46.4% 52%, transparent 52%),
            repeating-linear-gradient(0deg, rgba(16, 29, 29, 0.10) 0 1px, transparent 1px 54px),
            repeating-linear-gradient(90deg, rgba(16, 29, 29, 0.10) 0 1px, transparent 1px 62px),
            repeating-linear-gradient(0deg, rgba(16, 29, 29, 0.05) 0 1px, transparent 1px 18px),
            repeating-linear-gradient(90deg, rgba(16, 29, 29, 0.05) 0 1px, transparent 1px 21px),
            radial-gradient(38% 34% at 78% 22%, color-mix(in srgb, var(--pf-p500) 16%, #eef2f1) 0 70%, transparent 71%),
            radial-gradient(30% 26% at 16% 76%, color-mix(in srgb, var(--pf-p500) 12%, #eef2f1) 0 70%, transparent 71%),
            #f4f6f6;
    }

    .pf-duo > .pf-map {
        min-height: 320px;
    }

    .pf-map__consent {
        gap: 10px;
        padding: 20px;
    }

    .pf-map__consent .pf-btn {
        padding: 14px 24px;
    }

    .pf-map__pin {
        width: 30px;
        height: 30px;
    }
}

/* ---------- 112 ---------- */

.pf-sos {
    display: inline-flex;
    align-items: center;
    /* Centred, not leading. `.pf-sos` is blockified to `display: flex` by its column-flex parent,
       so it stretches the full column width while its one line of text is much narrower -- which
       left the sentence hugging the left edge of a full-width red box. `text-align` as well as
       `justify-content`, so the second line is centred too when the sentence wraps on a phone. */
    justify-content: center;
    text-align: center;
    gap: 10px;
    min-height: var(--pf-tap);
    padding: 8px 14px;
    border: 2px solid #a3242b;
    border-radius: var(--pf-radius-s);
    background: var(--pf-card);
    color: #a3242b;
    font: 700 17px/1.3 var(--pf-font);
}

.pf-sos:hover {
    color: #a3242b;
    background: #fdf1f0;
    text-decoration: none;
}

/* ---------- Footer ---------- */

/* The mirrored brand strip over the footer is its top border, painted with the gradient. */
.pf-footer {
    background: var(--pf-p900);
    color: #fff;
    padding: 22px 16px;
    display: flex;
    flex-direction: column;
    gap: 14px;
    border-top: 4px solid transparent;
    border-image: linear-gradient(90deg, var(--pf-p200) 0%, var(--pf-p500) 45%, var(--pf-p700) 100%) 1;
}

/* `:hover` and `:focus` are not optional companions here. `.pf a:hover` in the token file is
   (0,2,1) and this rule is (0,1,1), so without them every link in the p900 footer turned
   --pf-p600 on hover: 1.85:1, i.e. near-invisible against the band. The artboards do not hit this
   because their footer links carry an inline `color:#fff`, which no selector can beat. */
.pf-footer a,
.pf-footer a:hover,
.pf-footer a:focus {
    color: #fff;
}

.pf-footer__brand {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 14px;
}

.pf-footer__mark {
    width: 42px;
    height: 42px;
    flex: none;
    border-radius: var(--pf-radius-s);
    background: rgba(255, 255, 255, 0.16);
    display: grid;
    place-items: center;
    font: 800 16px/1 var(--pf-font);
    color: #fff;
}

.pf-footer__name {
    font: 800 18px/1.2 var(--pf-font);
}

.pf-footer__nav {
    display: flex;
    flex-direction: column;
    align-self: stretch;
}

/* Every footer link is a 48px row with a soft hover wash, as the artboards' `.flink`. */
.pf-footer__nav a {
    display: inline-flex;
    align-items: center;
    min-height: var(--pf-tap);
    padding: 0 10px;
    margin-left: -10px;
    border-radius: 10px;
    font-size: 17px;
    transition: background-color 0.16s;
}

.pf-footer__nav a:hover {
    background: rgba(255, 255, 255, 0.14);
    text-decoration: none;
}

/* The "Želim brezplačno urejati podatke izvajalca" link. It had no class at all, so it inherited
   nothing but a colour: a ~29px inline target in a column where every sibling is 48px, and the
   acquisition funnel for the ~2 357 providers nobody manages. */
.pf-footer__cta {
    display: inline-flex;
    align-items: center;
    min-height: var(--pf-tap);
    font-size: 17px;
}

.pf-footer__powered {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 10px;
    padding-top: 14px;
    border-top: 1px solid rgba(255, 255, 255, 0.24);
    font-size: 16.5px;
    color: rgba(255, 255, 255, 0.92);
}

/* The organisation's own logo. Was sharing .pf-footer__gz with the Gospodar zdravja
   pill below, which gave it that pill's flex box and padding and forced an inline
   style in the template to undo them. */
.pf-footer__logo {
    height: 34px;
    width: auto;
    display: block;
    padding: 4px 8px;
    border-radius: 8px;
    background: #fff;
    flex: none;
}

.pf-footer__gz {
    display: inline-flex;
    align-items: center;
    margin-left: auto;
    border-radius: 8px;
    background: #fff;
}

/* The PILL is the link, not a box around it. With the padding on the wrapping <span>
   the <a> was only as tall as the logo inside it -- under WCAG 2.5.8's 24px minimum. */
.pf-footer__gz a {
    display: inline-flex;
    align-items: center;
    padding: 6px 10px;
    min-height: 32px;
}

.pf-footer__gz img {
    height: 20px;
    width: auto;
    display: block;
}

@media (min-width: 720px) {
    .pf-footer {
        padding: 28px clamp(16px, 4vw, 44px) 22px;
        gap: 18px;
        border-top-width: 5px;
    }

    .pf-footer__brand {
        flex-direction: row;
        flex-wrap: wrap;
        align-items: center;
        gap: 14px 20px;
    }

    .pf-footer__mark {
        width: 44px;
        height: 44px;
    }

    .pf-footer__name {
        font-size: 19px;
    }

    .pf-footer__nav {
        flex-direction: row;
        flex-wrap: wrap;
        align-self: auto;
        gap: 4px 8px;
        margin-left: auto;
    }

    .pf-footer__nav a {
        padding: 12px 14px;
        margin-left: 0;
    }

    .pf-footer__powered {
        gap: 12px;
        padding-top: 16px;
        font-size: 17px;
    }

    /* "Omogoča Gospodar zdravja" and the logo pill, both at the right. */
    .pf-footer__powered span:first-child {
        margin-left: auto;
    }

    .pf-footer__gz {
        margin-left: 0;
    }

    .pf-footer__gz a {
        min-height: 34px;
    }

    .pf-footer__gz img {
        height: 22px;
    }
}

/* ---------- Clinic identity band ---------- */

.pf-section.pf-band--clinic {
    display: flex;
    flex-direction: column;
    gap: 12px;
    padding: 16px 16px 20px;
}

.pf-clinicid {
    display: flex;
    flex-direction: column;
    gap: 12px;
    min-width: 0;
}

.pf-clinicid__name {
    font-size: 26px;
    font-weight: 800;
}

.pf .pf-clinicid__name {
    margin: 0;
}

.pf-clinicid__line {
    font-size: 18px;
    line-height: 1.5;
    color: var(--pf-ink2);
}

.pf .pf-clinicid__line {
    margin: 0;
}

/* doctor · unit on one line on desktop; the phone artboard breaks it into two. */
.pf-clinicid__sep {
    display: none;
}

.pf-clinicid__where {
    display: block;
}

@media (min-width: 720px) {
    .pf-section.pf-band--clinic {
        display: block;
        padding: clamp(18px, 3vw, 26px) clamp(16px, 4vw, 44px) clamp(22px, 3.4vw, 30px);
    }

    .pf-clinicid {
        gap: 8px;
        margin-top: 8px;
    }

    .pf-clinicid__name {
        font-size: clamp(26px, 4.2vw, 34px);
    }

    .pf-clinicid__line {
        font-size: 19px;
    }

    .pf-clinicid__sep {
        display: inline;
    }

    .pf-clinicid__where {
        display: inline;
    }
}

/* ---------- Clinic notice ---------- */

.pf-section--notice {
    padding: 20px 16px 0;
}

.pf-notice {
    display: flex;
    align-items: flex-start;
    gap: 14px;
    padding: 18px;
    border: 2px solid var(--pf-p200);
    border-radius: var(--pf-radius-m);
    background: var(--pf-p50);
}

.pf-notice__icon {
    flex: none;
    width: 22px;
    height: 22px;
    margin-top: 3px;
    color: var(--pf-p700);
}

.pf-notice__body {
    display: flex;
    flex-direction: column;
    gap: 6px;
    min-width: 0;
}

.pf-notice__title {
    font-size: 19px;
    font-weight: 800;
}

.pf-notice__text {
    font-size: 17.5px;
    line-height: 1.6;
    color: var(--pf-ink);
}

/* Provider-authored HTML lands here via |safe. Keep the reset narrow. */
.pf-notice__body p {
    margin: 0 0 0.5em;
}

.pf-notice__body p:last-child {
    margin-bottom: 0;
}

/* `pf-notice--stack`, the phone layout of the clinic's own notices: icon and title on one row, the
   message under both at the card's full width. `display: contents` lifts the body's children into
   the card's grid; that is why the message has to be ONE element (`.pf-notice__text`) -- a bare text
   node cannot be placed. The other notices in the flow (the company referral well, the status
   pages) keep the plain row layout, because their bodies hold bare text. */
@media (max-width: 719px) {
    .pf-notice--stack {
        display: grid;
        grid-template-columns: auto minmax(0, 1fr);
        align-items: center;
        column-gap: 10px;
        row-gap: 8px;
    }

    .pf-notice--stack .pf-notice__body {
        display: contents;
    }

    .pf-notice--stack .pf-notice__icon {
        margin-top: 0;
    }

    .pf-notice--stack .pf-notice__text {
        grid-column: 1 / -1;
    }
}

@media (min-width: 720px) {
    .pf-section--notice {
        padding: clamp(24px, 4vw, 34px) clamp(16px, 4vw, 44px) 0;
    }

    .pf-notice {
        gap: 16px;
        padding: 20px 22px;
    }

    .pf-notice__icon {
        width: 24px;
        height: 24px;
    }

    .pf-notice__title {
        font-size: 20px;
    }

    .pf-notice__text {
        font-size: 18px;
    }
}

/* ---------- Service cards ---------- */

.pf-section--services {
    padding: 20px 16px 0;
}

.pf-svcgrid {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 12px;
}

/* One tile, one link. --pf-line, as for the clinic cards: a tile is identified by its title and
   its arrow, not by its outline. */
.pf-svccard {
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 18px;
    min-height: 88px;
    border: 2px solid var(--pf-line);
    border-radius: var(--pf-radius-m);
    background: var(--pf-card);
    color: inherit;
    transition: border-color 0.18s, box-shadow 0.18s, transform 0.14s;
}

.pf-svccard:hover {
    border-color: var(--pf-p500);
    box-shadow: 0 10px 22px rgba(5, 60, 62, 0.12);
    color: inherit;
}

.pf-svccard:active {
    transform: scale(0.985);
}

.pf-svccard:hover .pf-arr {
    transform: translateX(4px);
}

.pf-svccard__icon {
    flex: none;
    width: 25px;
    height: 25px;
    color: var(--pf-p700);
}

.pf-svccard__body {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.pf-svccard__title {
    font-size: 19px;
    font-weight: 700;
}

.pf-svccard__sub {
    font-size: 16.5px;
    color: var(--pf-ink2);
}

.pf-svccard__chev {
    flex: none;
    font-size: 22px;
    font-weight: 700;
    color: var(--pf-p700);
}

/* No service enabled at all is a real state (dispensaries 21 and 22 on the dev DB
   rendered an empty container before this existed). */
.pf-svcempty {
    display: flex;
    flex-direction: column;
    gap: 12px;
    padding: 20px 22px;
    border: 2px dashed var(--pf-line-strong);
    border-radius: var(--pf-radius-m);
    font-size: 18px;
    line-height: 1.55;
    color: var(--pf-ink2);
}

@media (min-width: 720px) {
    .pf-section--services {
        padding: clamp(26px, 4vw, 36px) clamp(16px, 4vw, 44px) 0;
    }

    .pf-svcgrid {
        grid-template-columns: repeat(auto-fit, minmax(330px, 1fr));
        gap: 14px;
    }

    .pf-svccard {
        gap: 16px;
        padding: 20px 22px;
        transition: border-color 0.18s, box-shadow 0.18s, transform 0.18s;
    }

    .pf-svccard:hover,
    .pf-svccard:active {
        box-shadow: 0 14px 30px rgba(5, 60, 62, 0.14);
        transform: translateY(-3px);
    }

    .pf-svccard__icon {
        width: 26px;
        height: 26px;
    }

    .pf-svccard__title {
        font-size: 20px;
    }

    .pf-svccard__sub {
        font-size: 17px;
    }
}

/* ---------- Booking tile / panel ----------
 *
 * ONE <details> that is the first item of .pf-svcgrid. Closed it is an ordinary service tile --
 * its <summary> carries `.pf-svccard`, so every rule above styles it and there is no second copy
 * of the tile's look to keep in step. Open it spans the row and becomes the booking window: a
 * --pf-p700 frame whose header bar is the summary itself, flattened, with "Zapri ✕" at its right.
 *
 * The `grid-column: 1 / -1` is what pushes the other tiles down: the panel is the first grid item,
 * so taking the full row reflows the rest beneath it at every breakpoint.
 *
 * WHAT ANIMATES AND WHAT CANNOT. The height of the body is animated by public-portal.js (see
 * wireBookingPanel). `grid-column` is NOT an animatable property, so the width change from one cell
 * to the full row is a step -- unavoidable in grid, and it lands at the start of the open (before
 * the height grows) and at the end of the close (after it shrinks), which is the order that reads
 * best. */

.pf-svcpanel {
    /* No border of its own while closed: the <summary>'s `.pf-svccard` draws the tile. */
    min-width: 0;
    border-radius: var(--pf-radius-m);
}

.pf-svcpanel[open] {
    grid-column: 1 / -1;
    border: 2px solid var(--pf-p700);
    overflow: hidden;
}

.pf-svcpanel__head {
    cursor: pointer;
    list-style: none;
}

/* Closed, the tile's text sits at `normal` rather than the body's 1.6: the design builds this one
   tile as a <button>, which does not inherit line-height, so on the phone it is 8px shorter than
   its link neighbours. (In a desktop grid row the neighbour stretches it back to the row height.) */
.pf-svcpanel:not([open]) .pf-svcpanel__head {
    line-height: normal;
}

/* Hide the native disclosure triangle; the chevron carries the state visually and <summary>
   carries it semantically. */
.pf-svcpanel__head::-webkit-details-marker {
    display: none;
}

.pf-svcpanel__head::marker {
    content: '';
}

/* Open: the tile flattens into the window's header bar. Its own border goes, because the
   <details> now draws the outline, and the bottom rule separates head from body. The hover lift
   and shadow are the TILE's; the bar keeps still. */
.pf-svcpanel[open] .pf-svcpanel__head {
    gap: 10px;
    min-height: 0;
    padding: 10px 8px 10px 16px;
    border: 0;
    border-bottom: 2px solid var(--pf-p700);
    border-radius: 0;
    background: var(--pf-p50);
}

.pf-svcpanel[open] .pf-svcpanel__head:hover,
.pf-svcpanel[open] .pf-svcpanel__head:active {
    box-shadow: none;
    transform: none;
}

.pf-svcpanel[open] .pf-svccard__icon {
    width: 22px;
    height: 22px;
}

.pf-svcpanel[open] .pf-svccard__title {
    font-size: 19px;
    font-weight: 800;
}

/* "Zapri ✕" -- the design's close button, drawn in the bar's right end. One run of text, as the
   design writes it, so the space between the word and the cross is an ordinary space. */
.pf-svcpanel__close {
    display: inline-flex;
    align-items: center;
    min-height: var(--pf-tap);
    padding: 0 10px;
    font: 700 17px/normal var(--pf-font);
    color: var(--pf-p700);
    white-space: nowrap;
}

.pf-svcpanel[open] .pf-svcpanel__head:hover .pf-svcpanel__close {
    text-decoration: underline;
}

/* One control, two labels, driven by the element's own state, so the label can never disagree with
   whether the panel is open. `display: none` also removes the inactive one from the accessibility
   tree, so the summary has exactly one accessible name at a time. */
.pf-svcpanel[open] .pf-svcpanel__closed,
.pf-svcpanel:not([open]) .pf-svcpanel__open {
    display: none;
}

/* THE RING IS DRAWN INSIDE, and the negative offset is the whole point.
   An outline is painted OUTSIDE the border box and IS clipped by an ancestor's `overflow`.
   `.pf-svcpanel[open]` carries `overflow: hidden` for its radius and the head fills that padding
   box exactly, so the default `outline-offset: 3px` from public-tokens.css survived as a single 3px
   line under a header that already has a 2px bottom rule. A negative offset is painted inside the
   border box, so nothing can clip it. Applied ONLY while open: closed, the tile is not inside an
   overflow container and gets the normal outset ring like its neighbours.

   THE TYPE SELECTOR AND THE `.pf` ARE LOAD-BEARING: public-tokens.css's primitive is
   `.pf summary:focus-visible`, i.e. (0,2,1); this is (0,4,1). */
.pf .pf-svcpanel[open] summary.pf-svcpanel__head:focus-visible {
    outline-offset: -3px;
}

.pf-svcpanel__body {
    background: var(--pf-card);
    /* The height animation writes an inline `height` here, so the content has to be clipped to it
       while it runs. wireBookingPanel clears both when the transition ends. */
    overflow: hidden;
}

@media (min-width: 720px) {
    .pf-svcpanel[open] .pf-svcpanel__head {
        gap: 12px;
        padding: 16px 20px;
    }

    .pf-svcpanel[open] .pf-svccard__icon {
        width: 24px;
        height: 24px;
    }

    .pf-svcpanel[open] .pf-svccard__title {
        font-size: 20px;
    }

    .pf-svcpanel__close {
        padding: 0 14px;
    }
}

/* FALLBACK GEOMETRY ONLY. The frame's real height is pushed in by the SPA over postMessage and
   applied as an inline `height` by booking-iframe-autosize.js, which also adds
   .pf-bookingframe--autosized below. Everything in this block and the media query under it is what
   renders BEFORE that first message -- and permanently against a SPA build that sends none, which
   is a live case because the two halves deploy on separate pipelines.

   Height from WIDTH, because a cross-origin child cannot be measured from here. The design draws a
   square; min-height keeps it usable on a phone, where a true 1:1 box would give a multi-step
   third-party form ~375px of viewport. */
.pf-bookingframe {
    display: block;
    width: 100%;
    aspect-ratio: 1 / 1;
    min-height: 700px;
    border: 0;
}

/* DESKTOP'S FALLBACK CAPS THE FRAME AT 65% OF ITS SQUARE HEIGHT, by request. A cap only for as long
   as the fallback is in force: once a height message arrives the rule below releases it.
   Expressed as an aspect-ratio rather than a `max-height`, because the height here is derived from
   the width: a percentage `max-height` resolves against the containing block's height, which is
   `auto`, so `max-height: 65%` computes to `none` and would do nothing at all.
   The 872px floor is the SPA's own `--hl-flow-min-height` -- the measured height of the
   reservation form, and the height every step of the flow reports from `sm` up -- so the frame is
   already the right size before the first postMessage arrives. The two repos deploy separately and
   cannot share a constant; if one moves, move the other.
   The breakpoint stays 1024px, not the layout's 720px: it is tied to the SPA's own `sm` layout,
   not to this page's. */
@media (min-width: 1024px) {
    .pf-bookingframe {
        aspect-ratio: 20 / 13;
        min-height: 872px;
    }
}

/* Added by booking-iframe-autosize.js on the first valid height message, and never removed.
   Both declarations are load-bearing: `aspect-ratio` keeps deriving a height from the width no
   matter what the inline `height` says, and the `min-height` floor wins outright over any reported
   height below it -- which is exactly the short-step case the handoff exists to fix.

   IT MUST STAY BELOW THE MEDIA QUERY. Same specificity (0,1,0), and a media query adds none, so
   source order is the whole of the tie-break. */
.pf-bookingframe--autosized {
    aspect-ratio: auto;
    min-height: 0;
}

/* ---------- Schedule + contact duo ----------
 *
 * The clinic page's "Urnik ambulante" + "Lokacija in kontakt" with the map: three grid areas like
 * #kontakt, see _clinic_schedule.html. The phone: no frame, the map between the address and the
 * full-width call button. Desktop: the bordered frame, the map filling the right column.
 */

.pf-section--schedule {
    padding: 26px 16px 30px;
}

.pf-duo {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

.pf-duo__body {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

/* 10px, as before, for the status page that borrows this group; the clinic's schedule panel takes
   the phone artboard's 14px. */
.pf-duo__group {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

.pf-duo .pf-duo__group {
    gap: 14px;
}

.pf-duo__group + .pf-duo__group {
    padding-top: 8px;
}

.pf-duo__head {
    font-size: 22px;
    font-weight: 800;
}

.pf .pf-duo__head {
    margin: 0;
}

.pf-duo__foot {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

.pf-duo__foot .pf-btn {
    min-height: 56px;
}

@media (min-width: 720px) {
    .pf-section--schedule {
        padding: clamp(26px, 4vw, 36px) clamp(16px, 4vw, 44px) clamp(34px, 5vw, 52px);
    }

    .pf-duo {
        display: grid;
        grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
        grid-template-rows: auto 1fr;
        grid-template-areas:
            "body map"
            "foot map";
        gap: 0;
        border: 2px solid var(--pf-line);
        border-radius: 18px;
        overflow: hidden;
    }

    .pf-duo__body {
        grid-area: body;
        gap: 22px;
        padding: clamp(20px, 3vw, 30px) clamp(20px, 3vw, 30px) 0;
    }

    .pf-duo > .pf-map {
        grid-area: map;
    }

    .pf-duo__foot {
        grid-area: foot;
        align-items: flex-start;
        gap: 12px;
        /* 14px, not the groups' 10px gap plus the button's 4px margin, which is what the design
           puts between the address and the call button. */
        padding: 14px clamp(20px, 3vw, 30px) clamp(20px, 3vw, 30px);
    }

    .pf-duo__foot .pf-btn {
        min-height: 52px;
        padding: 14px 22px;
    }

    .pf-duo .pf-duo__group {
        gap: 10px;
    }

    .pf-duo__group + .pf-duo__group {
        padding-top: 20px;
        border-top: 2px solid var(--pf-line);
    }
}

/* The opening hours, one row per published day: the day in --pf-ink2 on the left, the time in bold
   on the right, a hairline between rows (booking.helpers.portal.public_working_hours). A <dl>, with
   each dt/dd pair in its own row <div>, which HTML allows and which is what lets a row be a flex
   line. A day with two halves gets one line per half, and a half's comment the line under it. */
.pf-hours {
    display: flex;
    flex-direction: column;
    margin: 0;
    font-size: 17.5px;
}

.pf-hours__row {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    gap: 12px;
    padding: 12px 0;
    border-bottom: 1px solid var(--pf-line);
}

.pf-hours__row:last-child {
    border-bottom: 0;
}

.pf-hours__day {
    margin: 0;
    color: var(--pf-ink2);
    font-weight: 400;
}

.pf-hours__time {
    margin: 0;
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    text-align: right;
}

.pf-hours__time strong {
    font-weight: 700;
}

/* A half's comment ("Deluje vsak drugi teden po razporedu.") starts on the line under its time
   rather than running on after it, so the bold time stays a clean column down the right edge. */
.pf-hours__comment {
    display: block;
    color: var(--pf-ink2);
}

.pf-hours__note {
    font-size: 17px;
    line-height: 1.55;
    color: var(--pf-ink2);
}

.pf .pf-hours__note {
    margin: 0;
}

.pf-addr {
    font-size: 17.5px;
    line-height: 1.6;
    color: var(--pf-ink2);
}

.pf .pf-addr {
    margin: 0;
}

@media (min-width: 720px) {
    .pf-hours {
        font-size: 18px;
    }

    .pf-hours__row {
        gap: 16px;
        padding: 11px 0;
    }

    .pf-addr {
        font-size: 18px;
    }
}

/* ---------- Utilities ---------- */

.pf-muted {
    color: var(--pf-ink2);
}

/* A phone number is one token even though it is written with spaces. Slovenian numbers are spaced
   ("01 123 45 67"), and every one of those spaces was a break opportunity -- so a narrow "Pokličite:
   01 123 45 67" button split the NUMBER across two lines. With this, the only break opportunity
   left in the label is the space after the colon, so a tight button breaks before the number and
   keeps it whole. */
.pf-phone {
    white-space: nowrap;
}

/* ---------- Cookie notice ----------
 * Replaces cookieCuttr, which needs jQuery + jquery.cookie. Built by
 * public-portal.js and appended to <body>, so it sits outside .pf-shell. */

.pf-cookiebar {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 50;
    display: flex;
    flex-direction: column;
    gap: 12px;
    padding: 16px clamp(16px, 4vw, 44px);
    background: var(--pf-p900);
    color: #fff;
    font-size: 17px;
    line-height: 1.55;
}

.pf-cookiebar__text {
    margin: 0;
    max-width: 80ch;
}

.pf-cookiebar a,
.pf-cookiebar a:hover,
.pf-cookiebar a:focus {
    color: #fff;
    text-decoration: underline;
}

.pf-cookiebar__actions {
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
}

.pf-cookiebar .pf-btn--muted {
    background: transparent;
    border-color: #fff;
    color: #fff;
}

.pf-cookiebar .pf-btn--primary {
    background: #fff;
    color: var(--pf-p900);
}

@media (min-width: 640px) {
    .pf-cookiebar {
        flex-direction: row;
        align-items: center;
    }

    .pf-cookiebar__actions {
        margin-left: auto;
        flex: none;
    }
}

/* ---------- Prose (legal / notice pages) ---------- */

.pf-prose {
    max-width: 72ch;
    font-size: 18px;
    line-height: 1.65;
}

.pf-prose h2 {
    margin-top: 1.4em;
}

/* ---------- Anchor-component colour overrides ----------
 * `.pf a { color }` is (0,1,1) and beats every single-class component rule, so an
 * <a> styled as a button or a card renders in the link colour -- which made the
 * hero CTA dark-on-dark and invisible. Same cascade trap public-modern.css
 * documents for `.rp-page a`, hit again here.
 *
 * These selectors are `.pf a.pf-…`, (0,2,1), which outranks `.pf a`; their `:hover`
 * forms are (0,3,1) and outrank `.pf a:hover` (0,2,1). Any new anchor component needs
 * an entry here; a component that inherits its colour needs one too, because
 * `inherit` at (0,1,0) also loses.
 */

/* The logo home link holds an image or an initial box, never text, so the only thing `.pf a:hover`
   can do to it is draw an underline under a 44px graphic. */
.pf a.pf-header__home:hover {
    text-decoration: none;
}

.pf a.pf-hero__cta,
.pf a.pf-promo__cta,
.pf a.pf-btn--primary {
    color: var(--pf-onp);
}

.pf a.pf-hero__cta:hover,
.pf a.pf-promo__cta:hover,
.pf a.pf-btn--primary:hover {
    color: var(--pf-onp);
}

/* The hero CTA lifts on hover instead of underlining, as the design's `.cta:hover`. */
.pf a.pf-hero__cta:hover {
    text-decoration: none;
}

.pf a.pf-btn--ghost,
.pf a.pf-btn--ghost:hover {
    color: var(--pf-p700);
}

/* Cards cancel the global underline; the mockup's `.card:hover` does exactly this.
   `.pf-sos` belongs here too: its own :hover sets text-decoration:none at (0,1,0) and
   was losing, so the 112 button underlined on hover. */
.pf a.pf-cliniccard:hover,
.pf a.pf-svccard:hover,
.pf a.pf-option:hover,
.pf a.pf-providercard:hover,
.pf a.pf-sos:hover {
    text-decoration: none;
}

.pf a.pf-btn--muted,
.pf a.pf-btn--muted:hover,
.pf a.pf-nav__link,
.pf a.pf-nav__link:hover,
.pf a.pf-cliniccard,
.pf a.pf-cliniccard:hover,
.pf a.pf-svccard,
.pf a.pf-svccard:hover,
.pf a.pf-option,
.pf a.pf-option:hover,
.pf a.pf-providercard,
.pf a.pf-providercard:hover {
    color: var(--pf-ink);
}

/* The desktop nav link shows the growing bar on hover, not an underline; the phone pill keeps the
   ordinary link underline, which is what the phone artboard's pill inherits. */
@media (min-width: 720px) {
    .pf a.pf-nav__link:hover {
        text-decoration: none;
    }
}

/* "Počisti filter" is underlined and --pf-p700 in every state, like its <button> twin on the
   area picker -- the link hover would otherwise lighten it to --pf-p600. */
.pf a.pf-picker__clear,
.pf a.pf-picker__clear:hover {
    color: var(--pf-p700);
    text-decoration: underline;
}

.pf a.pf-back,
.pf a.pf-meta__item {
    color: var(--pf-p700);
}

.pf a.pf-sos,
.pf a.pf-sos:hover {
    color: #a3242b;
}

/* ---------- Forms ----------
 * Vertical, not Bootstrap's col-sm-3 / col-sm-8 horizontal grid: the standalone
 * shell loads no Bootstrap, and a label above its field is what reflows to 375px
 * without a second layout. */

/* No max-width. The card used to stop at 760px inside an 1178px section while the clinic notice
   directly above it spans the full width, so on a desktop the form read as a narrow column with
   ~400px of nothing beside it. The short identity fields use that width through .pf-field-row
   below rather than by stretching each input to a metre. */
.pf-formcard {
    background: var(--pf-card);
    border: 2px solid var(--pf-line);
    border-radius: var(--pf-radius-m);
    padding: clamp(18px, 3vw, 28px);
}

.pf-formcard__title {
    font-size: clamp(22px, 3.2vw, 26px);
    font-weight: 800;
    margin: 0 0 6px;
}

.pf-field {
    display: flex;
    flex-direction: column;
    gap: 6px;
    margin: 0 0 18px;
    border: 0;
    padding: 0;
}

.pf-field__label {
    font-size: 17px;
    font-weight: 600;
    color: var(--pf-ink);
    /* <legend> defaults differ from <label>; normalise so a radio group's legend and a
       text field's label sit identically. */
    float: none;
    width: auto;
    padding: 0;
    margin: 0;
    line-height: 1.35;
}

.pf-field__req {
    color: #a3242b;
    font-weight: 700;
}

/* Bare inputs ARE identified by their border, so this is where --pf-line-strong
   earns its 3:1 (see the token file). */
.pf-input {
    width: 100%;
    min-height: var(--pf-tap);
    padding: 10px 14px;
    border: 2px solid var(--pf-line-strong);
    border-radius: var(--pf-radius-s);
    background: var(--pf-card);
    color: var(--pf-ink);
    font: 400 18px/1.4 var(--pf-font);
}

/* `input.pf-input` / the type selector, for the same specificity reason as the language
   select above: `.pf-input:focus` is (0,2,0) and the token file's `.pf input:focus-visible` is
   (0,2,1), so the tighter 1px offset this rule asks for was being overridden by the primitive's
   3px. Browsers match :focus-visible on a text input for both pointer and keyboard focus, so the
   two rules really do compete on every click into a field. */
.pf input.pf-input:focus,
.pf textarea.pf-input:focus,
.pf select.pf-input:focus {
    border-color: var(--pf-p700);
    outline: 3px solid var(--pf-p700);
    outline-offset: 1px;
}

textarea.pf-input {
    min-height: 120px;
    resize: vertical;
}

/* NO `appearance: none` here. It was written with the comment "native chevron only",
   which is the opposite of what the property does: it removes the native chevron, and
   with no background-image arrow to replace it a <select> renders as a plain text box.
   The provider directory's "Zdravstveno področje" and "Območna enota" were both
   indistinguishable from text inputs. The native control is drawn by the platform, is
   already 3:1 against the field, and needs no asset. */
select.pf-input {
    padding-right: 10px;
    /* The chevron is the browser's, so leave room for it and let the text truncate
       rather than run under it. */
    text-overflow: ellipsis;
}

.pf-field.has-error .pf-input {
    border-color: #a3242b;
}

/* Date fields are native <input type="date"> (patient_dispensary_orders.forms.NativeDateInput).
   Wide enough for a locale-formatted date plus the browser's picker control, and no wider: a
   full-width box for a date tells the patient the field wants more than it does. */
.pf-field--date .pf-input {
    max-width: 16em;
    min-width: 12em;
}

/* Two short fields side by side from 640px up -- first/last name, birth date/sex, GSM/e-mail.
   This is how the form card uses its full width without a first-name box a metre wide. The
   fields keep their own bottom margin, so only the column gap is set here. */
.pf-field-row {
    display: grid;
    grid-template-columns: 1fr;
    gap: 0 20px;
}

.pf-field-row > .pf-field {
    min-width: 0;
}

@media (min-width: 640px) {
    .pf-field-row {
        grid-template-columns: 1fr 1fr;
    }
}

.pf-field__hint {
    margin: 0;
    font-size: 16px;
    line-height: 1.5;
    color: var(--pf-ink2);
}

.pf-field__error {
    display: flex;
    flex-direction: column;
    gap: 4px;
    font-size: 16px;
    line-height: 1.5;
    color: #a3242b;
}

.pf-charcount {
    margin: 0;
    font-size: 15px;
    color: var(--pf-ink2);
}

.pf-charcount.is-over {
    color: #a3242b;
    font-weight: 700;
}

/* ---------- Radios and checkboxes ---------- */

.pf-radios {
    display: flex;
    flex-wrap: wrap;
    gap: 8px 20px;
}

.pf-radio,
.pf-check {
    display: flex;
    align-items: center;
    gap: 10px;
    min-height: var(--pf-tap);
    font-size: 18px;
    font-weight: 400;
    cursor: pointer;
}

.pf-check {
    align-items: flex-start;
    line-height: 1.5;
}

.pf-radio input,
.pf-check input {
    /* 24px is the smallest a native control can be and still be a comfortable target
       inside a 48px row. */
    width: 24px;
    height: 24px;
    flex: none;
    margin: 0;
    accent-color: var(--pf-p700);
}

.pf-check input {
    margin-top: 3px;
}

/* ---------- Form actions ---------- */

.pf-form-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
    margin-top: 24px;
    padding-top: 20px;
    border-top: 2px solid var(--pf-line);
}

.pf-form-actions .pf-btn {
    flex: 1 1 auto;
}

@media (min-width: 640px) {
    /* NO `flex-direction: row-reverse`. It put the primary "Naročam" button visually LAST while
       it stays first in the DOM, so the visual order and the tab order disagreed -- WCAG 2.4.3 --
       on all seven order forms, which are the only two-button action rows in the flow (the status
       and token pages have one button each). Neither artboard contains a two-button action row or
       any row-reverse, so nothing in the design asked for it. DOM order is now visual order at
       both widths, and primary-first is also where a thumb wants it on a phone. */
    .pf-form-actions {
        justify-content: flex-start;
    }

    .pf-form-actions .pf-btn {
        flex: 0 0 auto;
    }
}

/* ---------- Terminal outcome (token pages) ---------- */

/* The expired / already-cancelled end states of public/_booking_token_action.html. They replace a
   nested `.pf-status .pf-status--rejected`, which drew a second bordered card inside the card.
   Same rule and same offsets as `.pf-form-actions` directly above, on purpose: all three states of
   that card then read identically -- content, rule, then the outcome or the button. There is no
   `.pf-divider` to reuse; a top border on the element that follows is the system's idiom, as
   `.pf-contact__group + .pf-contact__group` and `.pf-duo__group + .pf-duo__group` also do. */
.pf-outcome {
    margin: 24px 0 0;
    padding-top: 20px;
    border-top: 2px solid var(--pf-line);
    font-size: 19px;
    font-weight: 700;
}

/* The pill is gone, so the colour carries the signal on its own. Same literal the rejected order
   badge uses, and it is a literal for the same reason: public-tokens.css is re-derived for WCAG
   contrast by booking/tests/test_public_tokens.py, and this is not part of either theme's ramp. */
.pf-outcome--rejected {
    color: #a3242b;
}

/* ---------- Clinic instruction panel ("NAVODILO AMBULANTE") ---------- */

.pf-help-panel {
    margin: 0 0 20px;
    padding: 16px 18px;
    border: 2px solid var(--pf-p200);
    border-radius: var(--pf-radius-m);
    background: var(--pf-p50);
    font-size: 17px;
    line-height: 1.6;
}

.pf-help-panel__label {
    display: block;
    font-weight: 700;
    margin-bottom: 4px;
}

/* Collapsed by default when long; the toggle is a real button. */
.pf-help-panel__body {
    overflow: hidden;
}

.pf-help-panel:not(.is-open) .pf-help-panel__body {
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
}

.pf-help-panel__more {
    margin-top: 8px;
    min-height: var(--pf-tap);
    padding: 0;
    border: 0;
    background: transparent;
    color: var(--pf-p700);
    font: 700 17px/1.2 var(--pf-font);
    text-decoration: underline;
    cursor: pointer;
}

/* ---------- ZZZS card illustration ---------- */

.pf-zzzs {
    display: block;
    max-width: 320px;
    margin: 0 0 18px;
    border-radius: var(--pf-radius-s);
}

/* ---------- Attachments ---------- */

.pf-attach {
    margin: 0 0 18px;
    padding: 16px 18px;
    border: 2px dashed var(--pf-line-strong);
    border-radius: var(--pf-radius-m);
}

.pf-attach__label {
    display: block;
    font-size: 17px;
    font-weight: 600;
    margin-bottom: 8px;
}

/* The prompt a visitor who is not signed in as a patient gets instead of the upload controls: the
   label and one sentence, then a "Prijavite se" button -- beside the text from 640px (the order
   forms' breakpoint), under it on a phone. It used to be a word-sized link inside the sentence,
   1.10:1 against the text around it and not underlined, so the only way in went unnoticed. */
.pf-attach--login {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 12px;
}

.pf-attach--login .pf-attach__label {
    margin-bottom: 4px;
}

/* (0,2,1): `.pf p` gives every paragraph a bottom margin at (0,1,1). */
.pf .pf-attach--login .pf-field__hint {
    margin: 0;
}

.pf-attach__cta {
    flex: none;
}

@media (min-width: 640px) {
    .pf-attach--login {
        flex-direction: row;
        align-items: center;
        justify-content: space-between;
        gap: 20px;
    }
}

/* ---------- Order status pages ---------- */

.pf-status {
    display: flex;
    flex-direction: column;
    gap: 14px;
    padding: clamp(18px, 3vw, 28px);
    border: 2px solid var(--pf-line);
    border-radius: var(--pf-radius-m);
    background: var(--pf-card);
    max-width: 760px;
}

.pf-status__badge {
    align-self: flex-start;
    display: inline-flex;
    align-items: center;
    min-height: 40px;
    padding: 0 16px;
    border-radius: 999px;
    font: 700 17px/1.2 var(--pf-font);
    border: 2px solid var(--pf-line-strong);
}

.pf-status--submitted .pf-status__badge {
    border-color: var(--pf-p700);
    background: var(--pf-p50);
    color: var(--pf-p700);
}

.pf-status--accepted .pf-status__badge {
    border-color: var(--pf-p700);
    background: var(--pf-p100);
    color: var(--pf-p700);
}

.pf-status--processed .pf-status__badge {
    border-color: var(--pf-p700);
    background: var(--pf-p700);
    color: var(--pf-onp);
}

.pf-status--rejected .pf-status__badge {
    border-color: #a3242b;
    background: #fdf1f0;
    color: #a3242b;
}

.pf-steps {
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin: 0;
    padding: 0;
    list-style: none;
}

.pf-step {
    display: flex;
    align-items: center;
    gap: 12px;
    font-size: 17px;
    color: var(--pf-ink2);
}

.pf-step__bar {
    flex: none;
    width: 26px;
    height: 26px;
    border-radius: 50%;
    border: 2px solid var(--pf-line-strong);
    display: grid;
    place-items: center;
    font: 700 15px/1 var(--pf-font);
}

.pf-step.is-done {
    color: var(--pf-ink);
    font-weight: 600;
}

.pf-step.is-done .pf-step__bar {
    border-color: var(--pf-p700);
    background: var(--pf-p700);
    color: var(--pf-onp);
}

.pf-step.is-rejected .pf-step__bar {
    border-color: #a3242b;
    background: #a3242b;
    color: #fff;
}

@media (min-width: 640px) {
    .pf-steps {
        flex-direction: row;
        flex-wrap: wrap;
        gap: 10px 24px;
    }
}

/* ---------- Provider directory (the list before a provider is chosen) ---------- */

.pf-filter {
    margin: 0 0 24px;
    padding: clamp(16px, 3vw, 22px);
    border: 2px solid var(--pf-line);
    border-radius: var(--pf-radius-m);
    background: var(--pf-card);
}

.pf-filter__row {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    gap: 0 16px;
}

.pf-filter__actions {
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
}

/* The map is a redundant shortcut, so it is collapsed by default -- <details>, so it
   costs no JavaScript. The region <select> above it is the primary control. */
.pf-mapselect {
    margin-top: 16px;
}

.pf-mapselect__summary {
    display: inline-flex;
    align-items: center;
    min-height: var(--pf-tap);
    color: var(--pf-p700);
    font: 700 17px/1.2 var(--pf-font);
    cursor: pointer;
}

/* Same clip as .pf-svcpanel__head, from the `overflow-x: auto` below: `overflow-x` on its own
   computes `overflow-y` to `auto` as well, so the summary's ring lost its top, bottom and left
   edges and survived as a 3px tick at the far right of the control. Drawn inside instead.
   (0,3,1), to beat public-tokens.css's `.pf summary:focus-visible` at (0,2,1) -- see the note on
   .pf-svcpanel__head. */
.pf summary.pf-mapselect__summary:focus-visible {
    outline-offset: -3px;
}

.pf-mapselect img {
    display: block;
    margin-top: 10px;
    /* The <area> coordinates are pixel-fixed against the raster, so the image must not
       be scaled or the hotspots drift off their regions. It scrolls instead. */
    max-width: none;
}

.pf-mapselect > img,
.pf-mapselect {
    overflow-x: auto;
}

/* "Območje: X · Počisti" under the filter. It used to sit with the portal's location picker, which
   the v3 directory replaced; this page is its only user now, and the rule is carried over as it was
   (its margin loses to `.pf p`, which is the spacing this page has always had). */
.pf-activeloc {
    margin: 20px 0 0;
    font-size: 18px;
    color: var(--pf-ink2);
}

.pf-activeloc strong {
    color: var(--pf-ink);
}

.pf-providerlist {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
    gap: 12px;
}

/* The 320px floor clips below ~390px. Measured against this sheet's own padding chain (body
   clamp(0,3vw,40px), shell 1px border, section clamp(16px,4vw,44px)), the container is 318.5px at a
   375px viewport and 266.8px at 320px, and `.pf-shell` clips rather than scrolls -- so the overhang
   is unreachable, at the width WCAG 1.4.10 is defined against. Kept here, after the rule it
   overrides, because a media query contributes no specificity. */
@media (max-width: 400px) {
    .pf-providerlist {
        grid-template-columns: 1fr;
    }
}

.pf-providercard {
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 16px 18px;
    min-height: 76px;
    /* --pf-line-strong: the whole card is one <a>; its border is its only bounds. */
    border: 2px solid var(--pf-line-strong);
    border-radius: 14px;
    background: var(--pf-card);
    color: inherit;
    transition: box-shadow 0.18s, border-color 0.18s;
}

.pf-providercard:hover {
    border-color: var(--pf-p500);
    box-shadow: var(--pf-shadow-hover);
    text-decoration: none;
    color: inherit;
}

.pf-providercard__body {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.pf-providercard__name {
    font-size: 19px;
    font-weight: 700;
}

.pf-providercard__city {
    font-size: 17px;
    color: var(--pf-ink2);
}

.pf-providercard__arrow {
    flex: none;
    font-size: 22px;
    font-weight: 700;
    color: var(--pf-p700);
}

.pf-pager {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 12px;
    margin-top: 20px;
}

.pf-pager__current {
    font-size: 17px;
    color: var(--pf-ink2);
}
