/* ============================================================================
   Deltra — Deluxe Transfers: the anonymous marketing site.

   Loaded ONLY by Views/Shared/_MarketingLayout.cshtml, which shares nothing with
   the eight app layouts — no bootstrap, no jQuery, no DataTables, no flatpickr,
   no sweetalert2, no site.css, no orderstyle.css.

   That omission IS the isolation, and it has to be. site.css:20-33 paints a
   fixed background photo on bare <body> and site.css/orderstyle.css both reset
   html{font-size}; none of it is scoped, so no amount of .deltra-site nesting
   could undo it from the inside. What .deltra-site buys is the OTHER direction:
   it keeps this file's reset and its shared partials (the cookie notice and
   modal) inert if they are ever pulled onto an app page.

   Every value here comes from design_handoff_deltra_site/README.md, which is
   declared high-fidelity — treat the numbers as fixed, not as suggestions.

   Two conventions that exist to protect the design, and that you should not
   "tidy":

     1. NO `font:` SHORTHAND, anywhere. The shorthand cannot carry
        letter-spacing, so the reference prototype re-declares tracking at ~40
        call sites — which is exactly where a value gets rounded off. Longhands
        throughout, with every tracking value read from a --track-* token that
        is typed once, below. "The wide tracking on small caps is the whole
        luxury signal. Do not round it away."

     2. px, NEVER rem. The design specifies 9.5px, 12.5px, 13.5px exactly. In
        rem those become 0.59375rem and friends — numbers that invite tidying,
        and that would break outright if this file ever met html{font-size:14px}.
   ============================================================================ */


/* --- fonts ---------------------------------------------------------------- */

/* Self-hosted, latin subset, Google's own unmodified woff2 files, SIL OFL 1.1
   (licences alongside them in wwwroot/fonts/). There is deliberately NO Google
   Fonts <link>: the site serves EU visitors and a third-party font request
   would fire before anyone has answered the cookie notice.

   The latin subset alone is correct here, despite the README asking for
   latin-ext. Every Icelandic character sits in Latin-1 Supplement —
   Á É Í Ó Ú Ý Þ Æ Ö Ð and their lower case are all inside U+00C0-00FF — so
   "Íslenska" and "Keflavík" render from these files and latin-ext would only
   double the payload. */

/* Archivo is a VARIABLE font: Google serves one file for weights 300, 400 and
   500 (verified — the css2 API returns the same URL for all three). Declaring
   the full axis range means font-weight:500 renders the true 500 instance
   rather than a synthesised fake bold. */
@font-face {
    font-family: 'Archivo';
    font-style: normal;
    font-weight: 100 900;
    font-stretch: 100%;
    font-display: swap;
    src: url('../fonts/Archivo-Variable.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* Cormorant Garamond ships 300 and 300-italic ONLY. Never write a Cormorant
   rule at any other weight — with no face declared there, the browser
   synthesises a fake bold, which is visibly wrong on a face this fine. */
@font-face {
    font-family: 'Cormorant Garamond';
    font-style: normal;
    font-weight: 300;
    font-display: swap;
    src: url('../fonts/CormorantGaramond-Light.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'Cormorant Garamond';
    font-style: italic;
    font-weight: 300;
    font-display: swap;
    src: url('../fonts/CormorantGaramond-LightItalic.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}


/* --- tokens --------------------------------------------------------------- */

:root {
    /* brand ------------------------------------------------------------- */
    --gold: #B69F39;          /* buttons, kickers, rules, italic emphasis     */
    --gold-light: #E3CE86;    /* hover of every gold surface; bright kicker   */
    --gold-deep: #8A7629;     /* gold on light backgrounds                    */
    --ink: #080808;           /* hero base, header, footer                    */
    --ink-2: #0B0A09;         /* About section, quote-form panel              */
    --ink-3: #0A0A0A;         /* text colour ON gold buttons                  */
    --bone: #F6F3EC;          /* primary text on dark                         */

    /* The hero headline's foil. The one place raw hex belongs in the markup
       layer of this design; kept here so it is still typed once. */
    --foil: linear-gradient(100deg, #8f7a2c 0%, #c8ae55 22%, #f4e6b4 38%, #c8ae55 54%, #8f7a2c 78%, #c8ae55 100%);
    --foil-size: 220% 100%;

    /* text opacity ladder on dark — all rgba(246, 243, 236, a) ------------ */
    --bone-78: rgba(246, 243, 236, .78);  /* ghost button label              */
    --bone-72: rgba(246, 243, 236, .72);  /* lede                            */
    --bone-70: rgba(246, 243, 236, .70);  /* footer links                    */
    --bone-66: rgba(246, 243, 236, .66);  /* nav, phone, hero sub-line       */
    --bone-62: rgba(246, 243, 236, .62);  /* list copy                       */
    --bone-60: rgba(246, 243, 236, .60);  /* panel copy                      */
    --bone-58: rgba(246, 243, 236, .58);  /* modal intro                     */
    --bone-55: rgba(246, 243, 236, .55);  /* body                            */
    --bone-50: rgba(246, 243, 236, .50);  /* modal row copy                  */
    --bone-45: rgba(246, 243, 236, .45);  /* captions                        */
    --bone-42: rgba(246, 243, 236, .42);  /* micro-labels, language strip    */
    --bone-40: rgba(246, 243, 236, .40);  /* image captions                  */
    --bone-38: rgba(246, 243, 236, .38);  /* see --label-ink below           */
    --bone-34: rgba(246, 243, 236, .34);  /* fine print                      */
    --bone-32: rgba(246, 243, 236, .32);  /* copyright                       */
    --bone-28: rgba(246, 243, 236, .28);  /* toggle knob, off                */
    --bone-24: rgba(246, 243, 236, .24);  /* ghost-button border             */
    --bone-22: rgba(246, 243, 236, .22);  /* "send another request" underline*/
    --bone-20: rgba(246, 243, 236, .20);  /* "learn more" underline          */

    /* ⚠️ DEVIATION FROM THE SPEC, flagged for the designer.
       The README puts field labels at .38 and the "optional" marker at .24. On
       #080808 those compute to about 3.1:1 and 1.9:1 — both below WCAG AA's
       4.5:1, and a form label you cannot read is a functional failure rather
       than a stylistic one. Raised to .55 and .45 respectively. Decorative
       micro-caps elsewhere (image captions, the (c) line, the language strip)
       are deliberately LEFT at their designed values: raising those would
       flatten the hierarchy the whole design is built on. */
    --label-ink: var(--bone-55);
    --optional-ink: var(--bone-45);

    /* hairlines ---------------------------------------------------------- */
    --rule-header: rgba(255, 255, 255, .08);
    --rule-inner: rgba(255, 255, 255, .10);
    --rule-tile: rgba(255, 255, 255, .12);
    --rule-input: rgba(255, 255, 255, .16);
    --tile-fill: rgba(255, 255, 255, .03);
    --toggle-track: rgba(255, 255, 255, .04);

    /* Gold hairlines. The README's table names four of these; the reference
       prototype uses ten. The six marked (ref) are lifted from
       reference/Deltra Hero.dc.html — worth confirming the table was not meant
       to be exhaustive. */
    --gold-14: rgba(182, 159, 57, .14);   /* selected tile overlay    (ref)  */
    --gold-18: rgba(182, 159, 57, .18);   /* About image borders      (ref)  */
    --gold-22: rgba(182, 159, 57, .22);   /* section rules                   */
    --gold-30: rgba(182, 159, 57, .30);   /* cookie card; quote-plate rule   */
    --gold-34: rgba(182, 159, 57, .34);   /* modal card                      */
    --gold-35: rgba(182, 159, 57, .35);   /* pull-quote top border    (ref)  */
    --gold-45: rgba(182, 159, 57, .45);   /* login underline; toggle track   */
    --gold-50: rgba(182, 159, 57, .50);   /* contact rule; tile hover (ref)  */
    --gold-75: rgba(182, 159, 57, .75);   /* language-strip dot       (ref)  */
    --gold-80: rgba(182, 159, 57, .80);   /* "Always on"              (ref)  */

    /* ⚠️ NEEDS DESIGNER SIGN-OFF. The README rejects the #B4544A family as
       off-brand and asks for "a desaturated red at the same chroma as the
       gold". Two findings: that red's chroma is already almost identical to
       the gold's (OKLCH C 0.127 vs 0.122) — what is actually wrong is its
       LIGHTNESS, 0.564 against the gold's 0.704 — and it measures 4.06:1 on
       --ink-2, i.e. below AA, so it is not merely off-brand but unreadable at
       9px. #E28076 is the gold with ONLY its hue changed: same L (0.704), same
       C (0.122), hue rotated 96 deg -> 27 deg. 7.14:1 on --ink-2, which puts an
       error line at the same optical weight as a gold kicker rather than
       shouting over it. */
    --error: #E28076;
    --error-line: rgba(226, 128, 118, .45);
    --error-focus: rgba(226, 128, 118, .70);

    /* type --------------------------------------------------------------- */
    --font-display: 'Cormorant Garamond', Georgia, 'Times New Roman', serif;
    --font-ui: 'Archivo', system-ui, -apple-system, 'Segoe UI', sans-serif;

    /* Tracking. Every value in the README's type table, typed exactly once. */
    --track-display: -.015em;    /* h1 / h2 Cormorant                        */
    --track-modal-h: -.01em;     /* cookie modal heading                     */
    --track-kicker: .52em;       /* Archivo 400 9.5px UPPERCASE              */
    --track-label: .42em;        /* Archivo 400 9px UPPERCASE                */
    --track-micro: .30em;        /* micro caps, language strip               */
    --track-nav: .28em;          /* nav, footnote caps                       */
    --track-btn: .26em;          /* buttons                                  */
    --track-copy: .24em;         /* copyright line                           */
    --track-learn: .20em;        /* "learn more"                             */
    --track-phone: .18em;        /* header phone number                      */
    --track-tile: .16em;         /* journey-type tiles; "optional"           */
    --track-link: .04em;         /* footer links                             */
    --track-panel: .02em;        /* panel copy; hero sub-line                */

    /* spacing & geometry -------------------------------------------------- */
    --pad-page-x: 64px;          /* header, hero, bottom strips              */
    --pad-page-y: 26px;
    --pad-section-x: 120px;      /* About + footer                           */
    --about-pad-t: 126px;
    --about-pad-b: 110px;
    --footer-pad-t: 112px;
    --footer-pad-b: 44px;
    /* The README's hero height, kept for reference only. The hero is now one
       viewport tall (100svh) by request — see the note on .dsite-hero. */
    --hero-h-spec: 830px;
    --grid-gap: 100px;           /* About grid gap                           */
    --col-about: 440px;          /* About image column                       */
    --col-plate: 520px;          /* Quote left plate                         */
    /* The widest a block of content may draw itself, measured across the frame
       — content plus its own --pad-section-x gutters. 1512px is the logical
       width of a 14"/16" MacBook Pro, which is the size this reads best at.
       Only the About section uses it today; see the note on .dsite-about-grid
       for why the cap is on the content and not on the section. */
    --content-max: 1512px;
    /* 48px is the handoff's figure and it holds at every width the reference
       covers: clamp's floor is what pins ≤1440 to exactly 48px, so no
       breakpoint below needs to know about this and the <768 override still
       wins on its own terms.

       ⚠️ Above 1440 the mark grows with the viewport instead of sitting alone in
       a header that keeps widening around it — by request, and knowingly past
       the handoff's "46–54px tall" for the asset. The aspect ratio is not
       touched (.dsite-logo is height + width:auto), which is the part the
       handoff calls non-negotiable. */
    --logo-h: clamp(48px, 3.3333vw, 72px);   /* header; footer is 46px       */
    --logo-h-footer: 46px;
    --field-gap: 34px;
    --field-gap-x: 44px;

    /* motion -------------------------------------------------------------- */
    --ease-d: cubic-bezier(.22, .61, .36, 1);
    --t-hover: .4s;
    --t-hover-slow: .5s;
    --t-line: .35s;
}


/* --- scoped reset and document shell -------------------------------------- */

html.deltra-site {
    font-size: 16px;
    -webkit-text-size-adjust: 100%;
    /* Darkens the native date/time pickers, scrollbars and validation bubbles,
       not only the inputs the design calls it out on. */
    color-scheme: dark;
}

body.deltra-site {
    margin: 0;
    background: var(--ink);
    color: var(--bone);
    font-family: var(--font-ui);
    font-weight: 300;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    /* No border radius anywhere in this design except circles (dots, toggle
       knobs). Square corners throughout. */
}

/* Every reset rule is wrapped in :where() so it carries ZERO specificity.

   That is not tidiness, it is correctness. Written the obvious way,
   `.deltra-site a { color: inherit }` is specificity (0,1,1) — a class plus a
   type — which OUTRANKS every single-class component rule like
   `.dsite-btn { color: var(--ink-3) }` at (0,1,0). The gold buttons rendered
   with bone text and the gold links rendered bone, because the reset was
   quietly winning. :where() drops these to (0,0,0), so any component class
   beats them and the cascade reads the way it looks like it reads. */
:where(.deltra-site) *,
:where(.deltra-site) *::before,
:where(.deltra-site) *::after {
    box-sizing: border-box;
}

:where(.deltra-site) :where(h1, h2, h3, p, blockquote, figure, fieldset, ul) {
    margin: 0;
    padding: 0;
}

/* Both list types, not just <ul>. This design draws its own markers — a gold dot
   for unordered items and a gold counter for ordered ones — so leaving the native
   <ol> marker on renders every number twice ("1. 1."). */
:where(.deltra-site) :where(ul, ol) {
    list-style: none;
}

:where(.deltra-site) :where(fieldset) {
    border: 0;
    min-width: 0;
}

:where(.deltra-site) :where(legend) {
    padding: 0;
    float: none;
}

:where(.deltra-site) :where(img, video) {
    display: block;
    max-width: 100%;
}

:where(.deltra-site) :where(a) {
    color: inherit;
    text-decoration: none;
}

:where(.deltra-site) :where(button, input, select, textarea) {
    font: inherit;
    color: inherit;
    margin: 0;
}

/* Gold focus ring, everywhere. --gold-light rather than --gold: on #080808 it
   measures about 11.5:1 against the gold's 6:1, it is unmistakable, and it is
   already the design's hover colour so it stays on-brand. */
.deltra-site :focus-visible {
    outline: 2px solid var(--gold-light);
    outline-offset: 3px;
}

.deltra-site :focus:not(:focus-visible) {
    outline: none;
}

/* Chrome paints #E8F0FE over autofilled inputs, which is very visible on a
   near-black panel. The absurd transition delay is the only reliable defeat. */
.deltra-site input:-webkit-autofill,
.deltra-site input:-webkit-autofill:hover,
.deltra-site input:-webkit-autofill:focus {
    -webkit-text-fill-color: var(--bone);
    caret-color: var(--bone);
    transition: background-color 0s 600000s, color 0s 600000s;
}

/* Windows High Contrast blanks any text painted with color:transparent, which
   would erase the foil headline entirely. */
@media (forced-colors: active) {
    .dsite-foil {
        background: none;
        color: CanvasText;
        -webkit-text-fill-color: revert;
    }
}


/* --- motion --------------------------------------------------------------- */

/* Every animation on this site is decorative, so the keyframes AND the rules
   that use them both live inside the no-preference query. That is deliberate:
   the entrance animations rely on `both` fill with from{opacity:0} to hide an
   element before they run, so binding them outside the query would leave a
   reduced-motion visitor depending on the browser dropping the declaration —
   which happens to work, but only by accident. Inside, they simply never get an
   animation and render at their natural state. */
@media (prefers-reduced-motion: no-preference) {

    @keyframes dfade {
        from { opacity: 0; transform: translateY(16px); }
        to   { opacity: 1; transform: none; }
    }

    @keyframes dsoft {
        from { opacity: 0; }
        to   { opacity: 1; }
    }

    @keyframes dvline {
        from { transform: scaleY(0); }
        to   { transform: scaleY(1); }
    }

    /* The foil sweep. background-size is 220% 100%, so 180% -> -80% travels
       260% of the box: exactly one pass. 9s linear infinite with a 1.2s delay,
       which lands it just as the headline's own dfade finishes. */
    @keyframes dsheen {
        0%   { background-position: 180% 0; }
        100% { background-position: -80% 0; }
    }

    /* The hero's entrance stagger: .12 / .24 / .40 / .52 / .64s. */
    .dsite-header--hero  { animation: dsoft 1.2s ease both; }
    .dsite-hero-kicker   { animation: dfade 1s var(--ease-d) both .12s; }
    .dsite-hero-headline { animation: dfade 1.2s var(--ease-d) both .24s,
                                      dsheen 9s linear infinite 1.2s; }
    .dsite-hero-rule     { animation: dvline 1.1s var(--ease-d) both .5s; }
    .dsite-hero-sub      { animation: dfade 1.2s var(--ease-d) both .40s; }
    .dsite-hero-ctas     { animation: dfade 1.2s var(--ease-d) both .52s; }
    .dsite-hero-lang     { animation: dfade 1.2s var(--ease-d) both .64s; }
    .dsite-cookie        { animation: dfade 1s var(--ease-d) both 1.1s; }

    .dsite-modal::backdrop { animation: dsoft .45s ease both; }
    .dsite-modal-card      { animation: dfade .5s var(--ease-d) both; }

    /* This is the entire "smooth-scroll to #about" requirement. Fragment
       navigation uses it, so the hero's About link needs no JavaScript and
       honours reduced motion for free. */
    html.deltra-site { scroll-behavior: smooth; }
}


/* --- scroll reveals -------------------------------------------------------- */

/* An extension of the hero's motion vocabulary, not a new one: the same 18px rise,
   the same --ease-d decelerating curve, the same unhurried duration. Sections
   settle into place rather than sliding, popping or bouncing — nothing overshoots,
   because overshoot reads as playful and this design is not.

   Three rules govern the whole system:

     1. CONTENT IS VISIBLE BY DEFAULT. The hiding only ever happens under
        html.dsite-js, a class marketing.js adds to <html> before first paint. With
        scripting off — or if the script fails — every element renders normally and
        nobody is left staring at a blank page waiting for an animation that will
        never come.
     2. REVEAL ONCE. The observer stops watching an element the moment it appears.
        Re-animating on scroll-back is the single clearest tell of a template.
     3. REDUCED MOTION GETS NOTHING. The whole block sits inside the no-preference
        query, so there is no state to override and no chance of a stuck element. */

@media (prefers-reduced-motion: no-preference) {

    html.dsite-js .dsite-reveal {
        opacity: 0;
        transform: translateY(18px);
        transition: opacity 1.1s var(--ease-d), transform 1.1s var(--ease-d);
        /* Promoted for the duration of the move only — leaving will-change on
           permanently would pin a layer per element for the whole session. */
        will-change: opacity, transform;
    }

    html.dsite-js .dsite-reveal.is-revealed {
        opacity: 1;
        transform: none;
        will-change: auto;
    }

    /* A gold section rule that draws itself open from the centre outward, the
       horizontal cousin of the hero's dvline hairline. The real border is made
       transparent and a pseudo-element does the drawing, because a border cannot
       be animated along its length. */
    html.dsite-js .dsite-ruledraw {
        position: relative;
        border-top-color: transparent;
    }

    html.dsite-js .dsite-ruledraw::before {
        content: "";
        position: absolute;
        top: -1px;
        left: 0;
        right: 0;
        height: 1px;
        background: var(--gold-22);
        transform: scaleX(0);
        transform-origin: center;
        transition: transform 1.5s var(--ease-d);
    }

    html.dsite-js .dsite-ruledraw.is-revealed::before {
        transform: scaleX(1);
    }

    /* The photographs settle rather than appear — a slow release from 1.04 to
       true scale, like a camera coming to rest. The frame clips it, so the image
       only ever loses the outer 4% during the move. */
    html.dsite-js .dsite-reveal--frame img {
        transform: scale(1.04);
        transition: transform 1.8s var(--ease-d);
    }

    html.dsite-js .dsite-reveal--frame.is-revealed img {
        transform: scale(1);
    }
}


/* --- page transitions ------------------------------------------------------ */

/* Moving between the pages of this site is a dissolve, not a cut: the outgoing
   page fades as it pushes gently in, the incoming one settles out of a whisper
   of a zoom, and the header does not move at all while it happens.

   It is done entirely with cross-document view transitions — no router, no
   click interception, not one line of JavaScript. The browser performs the
   navigation exactly as it always did and animates between the two renders, so
   a middle click, a new tab, a form post, the back button, a link opened from
   another app and a visitor with scripting off all keep working with no special
   case written for any of them.

   Four things about this block are load-bearing:

     1. BOTH documents must opt in, which is why this lives in the one stylesheet
        every marketing page loads and no other page loads. Leaving the site for
        the app — the header's Login link — crosses into pages that never see
        this file, so that navigation stays an ordinary cut. Which is right: the
        dispatch app is a different place, not another page of this one.
     2. The opt-in is the `navigation` descriptor, inside the no-preference
        query, rather than a pile of animations to override afterwards. A
        visitor who has asked for reduced motion gets no transition at all —
        nothing to unwind, nothing that can strand a snapshot on screen. The
        at-rule is explicitly allowed inside a conditional group rule.
     3. A browser without the feature navigates precisely as it does today.
        There is no fallback to write, because the fallback IS the plain
        navigation, and a scripted imitation would have to re-implement every
        case in the paragraph above to earn its risk.
     4. Both snapshots scale in the SAME direction (out 1 -> 1.008, in
        1.012 -> 1). Scaling either of them below 1 would open a band of bare
        canvas around the edge of the viewport for the length of the fade. */

@media (prefers-reduced-motion: no-preference) {

    @view-transition {
        navigation: auto;
    }

    /* The incoming page's release from 1.012 is the same gesture the About
       photographs make when they reveal (1.04 -> 1), an octave quieter: a
       camera coming to rest rather than a zoom. Nothing overshoots here either.

       The curves overlap on purpose. The outgoing page is still at roughly .58
       as the incoming one reaches .45, so the two never sum to much under 1 and
       the page does not blink through black; the `plus-lighter` blend the
       browser puts on both snapshots is what makes that arithmetic hold. The
       shallow dip that remains, around .32s, reads as one slow breath.

       transform-origin is stated rather than assumed: these are the only
       transforms on the site whose element is generated by the browser. */
    ::view-transition-old(root) {
        animation: dpageout .32s cubic-bezier(.4, 0, 1, 1) both;
        transform-origin: 50% 50%;
    }

    ::view-transition-new(root) {
        animation: dpagein .56s var(--ease-d) .06s both;
        transform-origin: 50% 50%;
    }

    @keyframes dpageout {
        to { opacity: 0; transform: scale(1.008); }
    }

    @keyframes dpagein {
        from { opacity: 0; transform: scale(1.012); }
    }

    /* The header is the one thing that survives the crossing. Naming it lifts it
       out of the page snapshot into a group of its own, and switching that
       group's animation off pins the group to its NEW position for the whole
       transition, leaving the two headers to cross-fade in place.

       Switching the morph off is the point, not a simplification. Left on, the
       group travels from wherever the header sat in the OUTGOING viewport — and
       the header is in normal flow on /quote and the legal pages, so it scrolls
       away. Anyone who reached /privacy by clicking a link in the footer, which
       is how nearly everyone reaches it, would watch the header fly down the
       screen from somewhere above.

       `animation: none` on the group also zeroes the duration its two snapshots
       inherit from it, so both fades are declared here in full rather than
       leaning on the browser's defaults. */
    .dsite-header {
        view-transition-name: dsite-header;
    }

    ::view-transition-group(dsite-header) {
        animation: none;
    }

    ::view-transition-old(dsite-header) {
        animation: dsoftout .42s var(--ease-d) both;
    }

    ::view-transition-new(dsite-header) {
        animation: dsoft .42s var(--ease-d) both;
    }

    @keyframes dsoftout {
        to { opacity: 0; }
    }

    /* Chrome that the transition has just carried across from the previous page
       must not then perform its own entrance on arrival: it would fade out with
       the old page and fade back in a second later, which is the exact stutter a
       page transition exists to remove. The hero header is the element being
       held still above, and the cookie notice is fixed in the same corner on
       every page — .dsite-cookie's entrance is delayed 1.1s, so without this it
       would leave a hole where the card had been for most of a second.

       html.dsite-warm marks a page reached from another page on this site; it is
       set before first paint by the inline script in _MarketingLayout. (0,2,1)
       outranks the (0,1,0) bindings in the motion block wherever they sit. */
    html.dsite-warm .dsite-header--hero,
    html.dsite-warm .dsite-cookie {
        animation: none;
    }
}


/* --- primitives ----------------------------------------------------------- */

.dsite-skip {
    position: absolute;
    left: -9999px;
    top: 0;
    z-index: 100;
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    padding: 14px 22px;
    background: var(--gold);
    color: var(--ink-3);
    font-family: var(--font-ui);
    font-weight: 500;
    font-size: 10.5px;
    line-height: 1;
    letter-spacing: var(--track-btn);
    text-transform: uppercase;
}

.dsite-skip:focus {
    left: 12px;
    top: 12px;
}

/* Archivo 400 / 9.5px / 1 / .52em UPPERCASE — the gold section kicker. */
.dsite-kicker {
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 9.5px;
    line-height: 1;
    letter-spacing: var(--track-kicker);
    text-transform: uppercase;
    color: var(--gold);
}

/* The gold italic emphasis inside every display heading — "car door",
   "already there", "why", "arrangement", "from". Cormorant has a real 300
   italic, so this is a genuine italic face, never a synthesised slant. */
.dsite-em {
    font-style: italic;
    color: var(--gold);
}

/* Archivo 400 / 9px / 1 / .42em UPPERCASE — form and column labels. */
.dsite-label {
    display: block;
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 9px;
    line-height: 1;
    letter-spacing: var(--track-label);
    text-transform: uppercase;
    color: var(--label-ink);
}

.dsite-label-optional {
    letter-spacing: var(--track-tile);
    color: var(--optional-ink);
}

/* Archivo 400 / 9.5px / 1.6 / .30em UPPERCASE — captions and micro caps. */
.dsite-micro {
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 9.5px;
    line-height: 1.6;
    letter-spacing: var(--track-micro);
    text-transform: uppercase;
    color: var(--bone-42);
}

/* Gold button. Archivo 500 / 10.5px / .26em UPPERCASE on --gold. */
.dsite-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 0;
    padding: 19px 40px;
    background: var(--gold);
    color: var(--ink-3);
    font-family: var(--font-ui);
    font-weight: 500;
    font-size: 10.5px;
    line-height: 1;
    letter-spacing: var(--track-btn);
    text-transform: uppercase;
    text-align: center;
    cursor: pointer;
    transition: background var(--t-hover-slow) ease,
                transform var(--t-hover-slow) var(--ease-d),
                box-shadow var(--t-hover-slow) ease;
}

/* Ghost button — 1px bone hairline, no fill. */
.dsite-btn--ghost {
    padding: 15px 24px;
    background: none;
    border: 1px solid var(--bone-24);
    color: var(--bone-78);
    font-weight: 400;
    font-size: 9.5px;
    transition: border-color var(--t-hover) ease, color var(--t-hover) ease;
}

/* Text button — no fill, no border, no padding. See the hit-area note below. */
.dsite-btn--text {
    padding: 0;
    background: none;
    border: 0;
    color: var(--bone-62);
    font-weight: 400;
    font-size: 9.5px;
    transition: color var(--t-hover) ease, border-color var(--t-hover) ease;
}

/* Underlined text button, e.g. "Send another request". */
.dsite-btn--underline {
    padding: 0 0 7px;
    border-bottom: 1px solid var(--bone-22);
    color: var(--bone-72);
}

@media (hover: hover) {
    .dsite-btn:hover {
        background: var(--gold-light);
        transform: translateY(-2px);
        box-shadow: 0 18px 40px rgba(182, 159, 57, .24);
    }

    .dsite-btn--ghost:hover {
        background: none;
        transform: none;
        box-shadow: none;
        border-color: var(--gold);
        color: var(--gold);
    }

    .dsite-btn--text:hover {
        background: none;
        transform: none;
        box-shadow: none;
        color: var(--bone);
    }

    .dsite-btn--underline:hover {
        color: var(--gold);
        border-color: var(--gold);
    }
}


/* --- the request-a-quote CTA ---------------------------------------------- */

/* The buttons that ask for the sale, treated as machined objects rather than
   rectangles of gold: "Request a quote" in the hero, the same words again at the
   foot of the page, and "Send the request" that closes the form they both lead
   to. One journey, one button, three places.

   Everything below is motion and shadow: the resting face is still exactly the
   flat --gold the design specifies, so a screenshot of the page at rest is
   unchanged.

   It is a modifier, not a rule on .dsite-btn, on purpose. The cookie buttons,
   "Send another request" and the error page's "back to the home page" are all
   .dsite-btn too, and none of them glint — a button that catches the light in
   the corner of the eye is a device for drawing attention to the way FORWARD,
   and it stops pointing anywhere the moment it is on everything. */
.dsite-btn--cta {
    position: relative;
    /* The glint is a child at z-index:-1, which paints above the button's own
       background but below its lettering — light travelling UNDER the type, the
       way it would across a real brass plate, instead of a white wash over the
       top of it. isolation keeps that negative index inside this button rather
       than letting it escape to an ancestor and slide behind the page. */
    isolation: isolate;
    /* Clips the glint's travel. Does NOT clip box-shadow, which is why the lift
       below is drawn with shadows and not with a second pseudo-element. */
    overflow: hidden;
    /* No transition of its own: .dsite-btn already transitions background,
       transform and box-shadow on the same slow curve, which is exactly the set
       used below. It stays inherited so that none of these three buttons can
       drift away from the others.
       That only holds because no .dsite-btn--cta carries .dsite-reveal — the
       footer one is wrapped instead. A reveal on the button takes ownership of
       `transition` at a specificity classes cannot outrank, silently narrowing
       the list to opacity and transform and leaving the shadow to snap. See the
       note in _MarketingFooter.cshtml before moving that class back. */
}

@media (prefers-reduced-motion: no-preference) {

    /* The band itself: a soft warm highlight, skewed so it rakes across the face
       rather than wiping it. Taller than the button at both ends, so the skew
       never exposes a corner. */
    .dsite-btn--cta::before {
        content: "";
        position: absolute;
        top: -30%;
        bottom: -30%;
        left: 0;
        width: 38%;
        z-index: -1;
        background: linear-gradient(90deg,
                    rgba(255, 249, 233, 0),
                    rgba(255, 249, 233, .55),
                    rgba(255, 249, 233, 0));
        transform: translateX(-160%) skewX(-14deg);
        pointer-events: none;
    }

    /* At rest it glints once every 7s and spends the rest of the cycle parked
       off the right-hand edge — a catch of light, not a sweep on a loop. The
       idle pass is the ONLY version most visitors ever see: a phone has no
       hover, so a hover-only treatment would ship this to nobody.

       Same family as the headline's dsheen, which also runs on a long infinite
       cycle inside this query. Under reduced motion neither exists. */
    .dsite-btn--cta::before {
        animation: dglint 7s var(--ease-d) 1.4s infinite;
    }

    @keyframes dglint {
        0%          { transform: translateX(-160%) skewX(-14deg); }
        16%, 100%   { transform: translateX(400%) skewX(-14deg); }
    }

    /* Hover and keyboard focus re-run it as a single, faster pass. Swapping the
       animation-name restarts the timeline, which is the whole trick: the light
       answers the pointer instead of carrying on to its own schedule. */
    .dsite-btn--cta:hover::before,
    .dsite-btn--cta:focus-visible::before {
        animation: dsweep .85s var(--ease-d);
    }

    @keyframes dsweep {
        from { transform: translateX(-160%) skewX(-14deg); }
        to   { transform: translateX(400%) skewX(-14deg); }
    }
}

/* Lifted higher and more slowly than a plain .dsite-btn, and on two shadows
   rather than one: a tight dark contact shadow under the edge plus the wide gold
   bloom. The contact shadow is what stops it reading as a flat card with a glow
   behind it — it is the only thing that says the button is off the surface.
   Both work over the hero video and over ink, which a drawn frame would not.

   Outside the reduced-motion query deliberately, matching .dsite-btn:hover above
   it: a state change under the pointer is a response, not an animation, and
   removing it would leave the button with no hover feedback at all. */
@media (hover: hover) {
    .dsite-btn--cta:hover {
        transform: translateY(-3px);
        box-shadow: 0 3px 9px rgba(0, 0, 0, .34),
                    0 26px 54px rgba(182, 159, 57, .30);
    }
}

.dsite-btn--cta:focus-visible {
    transform: translateY(-3px);
    box-shadow: 0 3px 9px rgba(0, 0, 0, .34),
                0 26px 54px rgba(182, 159, 57, .30);
}

/* Pressed: it settles most of the way back and the bloom tightens, quickly.
   A press that animates on the same slow curve as the hover feels unresponsive
   however good it looks. */
.dsite-btn--cta:active {
    transform: translateY(-1px);
    box-shadow: 0 2px 6px rgba(0, 0, 0, .38),
                0 10px 24px rgba(182, 159, 57, .22);
    transition-duration: .12s;
}

/* ⚠️ DEVIATION FROM THE SPEC, invisible by construction.
   The design's text buttons and micro links are 9.5px type with padding:0, so
   they compute to roughly 12px tall — far under the 44px minimum the brief
   asks for (and under WCAG 2.2 SC 2.5.8's 24px). Adding padding would move the
   design. Instead each carries a transparent ::after that expands only the
   POINTER target: it is a child, so it inherits the click; it is absolutely
   positioned, so it contributes nothing to layout; and the focus ring still
   hugs the text, which is correct — the ring should show the control, not its
   hit box. */
.dsite-hit {
    position: relative;
}

.dsite-hit::after {
    content: "";
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    width: 100%;
    min-width: 44px;
    height: 44px;
}

/* Where two of them sit closer than 44px apart, drop the min-width and let
   WCAG's spacing exception carry it rather than overlapping the hit boxes. */
.dsite-hit--tight::after {
    min-width: 0;
}

/* Small gold dot: the 3px language-strip separator and the 4px list markers. */
.dsite-dot {
    display: block;
    flex: none;
    width: 3px;
    height: 3px;
    border-radius: 50%;
    background: var(--gold-75);
}

.dsite-dot--list {
    width: 4px;
    height: 4px;
    background: var(--gold);
}

/* Language strip: Íslenska · English, 9.5px .30em, gold dot between.
   Rendered as <span>, not <a>: there is no Icelandic site yet, and a link to
   "#" is a broken promise to anyone using a screen reader. Swap to
   <a hreflang="is"> when /is exists. */
.dsite-lang {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 18px;
}

/* Both the inactive language (an <a>) and the active one (a <span>) share the
   type; only the colour differs. The dot is excluded — it has its own size.

   The list is wrapped in :where() to keep this rule at (0,1,0). Written the
   obvious way, `.dsite-lang > span:not(.dsite-dot)` is (0,2,1) — :not() carries
   its argument's specificity — which OUTRANKS `.dsite-lang .dsite-lang-active`
   at (0,2,0), so the active language silently rendered in the inactive grey.
   Same trap as the reset block at the top of this file. */
.dsite-lang > :where(span:not(.dsite-dot), a) {
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 9.5px;
    line-height: 1;
    letter-spacing: var(--track-micro);
    text-transform: uppercase;
    color: var(--bone-42);
    transition: color var(--t-hover) ease;
}

/* The language you are currently reading. Gold is the design's own signal — it is
   how the footer strip already marks English — plus the 1px gold underline the
   header's Login link uses, so "you are here" is unmistakable rather than a
   subtle hue difference between two small grey words. */
.dsite-lang .dsite-lang-active {
    color: var(--gold);
    padding-bottom: 5px;
    border-bottom: 1px solid var(--gold-45);
}

/* The inactive language gets a FAINT rule rather than a transparent one.

   Both boxes were already pixel-identical, but only the active word sat on a
   visible line, so the other had no floor for the eye to rest on and read as
   floating — most obviously with "Íslenska", whose Í accent carries 2px more ink
   above the baseline than "English" does. Giving both a rule anchors them to the
   same optical line; the gold one is simply brighter. */
.dsite-lang > a {
    padding-bottom: 5px;
    border-bottom: 1px solid var(--rule-inner);
}

/* The separator centres on the words' BOXES, and those boxes carry 6px of
   padding and border below the text — which left the dot sitting about 3px
   below the optical centre of the words beside it. The extra bottom margin
   gives the dot the same lower mass, lifting its centre onto the text's. */
.dsite-lang .dsite-dot {
    margin-bottom: 6px;
}

@media (hover: hover) {
    .dsite-lang > a:hover {
        color: var(--gold-light);
        border-bottom-color: var(--gold-45);
    }
}


/* --- header --------------------------------------------------------------- */

.dsite-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 24px;
    padding: var(--pad-page-y) var(--pad-page-x);
}

/* Over the hero video: transparent, and re-enables pointer events because the
   hero's content column is pointer-events:none so the video stays inert. */
.dsite-header--hero {
    background: none;
    pointer-events: auto;
}

/* On /quote and the legal pages, where there is no video behind it. */
.dsite-header--solid {
    background: var(--ink);
    border-bottom: 1px solid var(--rule-header);
}

/* The logo link. The mark itself drops to 38px on phones, which would leave the
   link under the 44px minimum; the header is 74px tall even there, so giving the
   link a 44px floor costs nothing visually. */
.dsite-header > a {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
}

/* width:auto plus the intrinsic width/height attributes keep the mark at its
   natural 1024x579 (~1.77:1) aspect at every size. It must never be stretched. */
.dsite-logo {
    display: block;
    height: var(--logo-h);
    width: auto;
}

.dsite-header-right {
    display: flex;
    align-items: center;
    gap: 28px;
}

.dsite-header-phone {
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 11px;
    line-height: 1;
    letter-spacing: var(--track-phone);
    color: var(--bone-66);
    transition: color var(--t-hover) ease;
}

.dsite-header-login {
    padding-bottom: 7px;
    border-bottom: 1px solid var(--gold-45);
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 10px;
    line-height: 1;
    letter-spacing: var(--track-nav);
    text-transform: uppercase;
    color: var(--gold);
    transition: color var(--t-hover) ease, border-color var(--t-hover) ease;
}

@media (hover: hover) {
    .dsite-header-phone:hover { color: var(--gold); }

    .dsite-header-login:hover {
        color: var(--gold-light);
        border-color: var(--gold-light);
    }
}


/* --- footer --------------------------------------------------------------- */

.dsite-footer {
    background: var(--ink);
    border-top: 1px solid var(--gold-22);
    padding: var(--footer-pad-t) var(--pad-section-x) var(--footer-pad-b);
}

.dsite-footer-close {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
}

.dsite-footer-h2 {
    margin-top: 30px;
    max-width: 18ch;
    font-family: var(--font-display);
    font-weight: 300;
    font-size: 54px;
    line-height: 1.16;
    letter-spacing: var(--track-display);
    color: var(--bone);
    text-wrap: pretty;
}

.dsite-footer-copy {
    margin-top: 26px;
    max-width: 56ch;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 15px;
    line-height: 1.9;
    color: var(--bone-60);
    text-wrap: pretty;
}

.dsite-footer-cta {
    margin-top: 38px;
}

.dsite-footer-cols {
    margin-top: 104px;
    padding-top: 44px;
    border-top: 1px solid var(--rule-inner);
    display: grid;
    grid-template-columns: 1fr 200px 260px;
    gap: 70px;
    align-items: start;
}

.dsite-footer-brand {
    display: flex;
    flex-direction: column;
    gap: 22px;
}

/* align-self keeps the mark at its natural width inside a stretch container —
   without it the flex column would stretch it edge to edge. */
.dsite-footer-brand .dsite-logo {
    height: var(--logo-h-footer);
    align-self: flex-start;
}

.dsite-footer-brand p {
    max-width: 40ch;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 13.5px;
    line-height: 1.85;
    color: var(--bone-45);
    text-wrap: pretty;
}

.dsite-footer-col {
    display: flex;
    flex-direction: column;
    gap: 16px;
}

.dsite-footer-col > span:first-child {
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 9px;
    line-height: 1;
    letter-spacing: var(--track-label);
    text-transform: uppercase;
    color: var(--bone-34);
}

.dsite-footer-link {
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 13.5px;
    line-height: 1;
    letter-spacing: var(--track-link);
    color: var(--bone-70);
    transition: color var(--t-hover) ease;
}

@media (hover: hover) {
    .dsite-footer-link:hover { color: var(--gold); }
}

.dsite-footer-note {
    font-family: var(--font-display);
    font-weight: 300;
    font-style: italic;
    font-size: 12.5px;
    line-height: 1.7;
    color: var(--bone-38);
}

.dsite-footer-note--desk {
    font-size: 13px;
    line-height: 1.6;
    color: var(--bone-42);
}

/* The © + language strip. Also used standalone on /quote and the legal pages,
   which is why it is its own partial. */
.dsite-strip {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 24px;
}

.dsite-footer .dsite-strip {
    margin-top: 56px;
}

/* The strip as a standalone page footer (_MarketingFooterBar), on the pages that
   do not carry the full footer. */
.dsite-stripbar {
    background: var(--ink);
    border-top: 1px solid var(--rule-inner);
    padding: var(--pad-page-y) var(--pad-page-x);
}

.dsite-copyright {
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 9.5px;
    line-height: 1.6;
    letter-spacing: var(--track-copy);
    text-transform: uppercase;
    color: var(--bone-32);
}


/* --- opening screen -------------------------------------------------------- */

/* Only on the landing page (ViewData["Loader"]). Dismissed by marketing.js;
   neutralised entirely by the <noscript> block in the layout. */
.dsite-loader {
    position: fixed;
    inset: 0;
    z-index: 200;
    display: grid;
    place-items: center;
    background: var(--ink);
    opacity: 1;
    transition: opacity .7s ease, visibility 0s linear .7s;
}

.dsite-loader.is-done {
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
}

.dsite-loader[hidden] {
    display: none;
}

/* A visitor arriving from another page of this site does not meet the opening
   screen again. They have already seen it, they already have the fonts and the
   poster frame it exists to wait for, and replaying it would put a black screen
   in the middle of the page transition — which is the one thing the transition
   is there to avoid. Cold arrivals — typed, bookmarked, from a search result or
   an app store listing — are unaffected.

   Kept out of the reduced-motion query deliberately: skipping the intro is not a
   motion decision, and a visitor who asked for less motion has even less reason
   to sit through it. The inline script in _MarketingLayout also takes
   `dsite-loading` off <html> in the same breath, which is what releases the
   hero's entrance animations — this rule only stops the screen being painted. */
html.dsite-warm .dsite-loader {
    display: none;
}

.dsite-loader-inner {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 34px;
    /* A whisker above centre — optically centred rather than measured. */
    transform: translateY(-4%);
}

.dsite-loader-mark {
    height: 64px;
    width: auto;
    opacity: .92;
}

/* The same 1px gold hairline language as the hero rule and the section rules,
   here as an indeterminate sweep. No percentage is shown, because none of the
   things being waited on report progress and a fake bar is a lie. */
.dsite-loader-track {
    position: relative;
    width: 160px;
    height: 1px;
    overflow: hidden;
    background: var(--rule-inner);
}

.dsite-loader-bar {
    position: absolute;
    inset: 0 auto 0 0;
    width: 40%;
    background: linear-gradient(90deg, transparent, var(--gold), transparent);
}

@media (prefers-reduced-motion: no-preference) {
    @keyframes dloadsweep {
        0%   { transform: translateX(-100%); }
        100% { transform: translateX(400%); }
    }

    .dsite-loader-mark { animation: dsoft .8s ease both; }
    .dsite-loader-bar  { animation: dloadsweep 1.5s cubic-bezier(.65, 0, .35, 1) infinite; }
}

/* Under reduced motion there is no sweep, so show a static gold hairline rather
   than a bar frozen at the left edge. */
@media (prefers-reduced-motion: reduce) {
    .dsite-loader-bar {
        width: 100%;
        background: var(--gold-45);
    }
}

/* Hold the hero's entrance stagger — and the foil sweep — until the loader has
   gone, so the reveal is one composed moment instead of an animation that
   already finished behind a black screen.

   Specificity (0,2,1) deliberately outranks the (0,1,0) bindings in the motion
   block, wherever they sit in the file. */
html.dsite-loading .dsite-header--hero,
html.dsite-loading .dsite-hero-kicker,
html.dsite-loading .dsite-hero-headline,
html.dsite-loading .dsite-hero-rule,
html.dsite-loading .dsite-hero-sub,
html.dsite-loading .dsite-hero-ctas,
html.dsite-loading .dsite-hero-lang,
html.dsite-loading .dsite-cookie {
    animation-play-state: paused;
}

/* No scrolling behind the loader — the page underneath is fully rendered and a
   trackpad flick would otherwise scroll it invisibly. */
html.dsite-loading,
html.dsite-loading body {
    overflow: hidden;
}


/* --- hero ----------------------------------------------------------------- */

/* ⚠️ DEVIATION FROM THE SPEC, requested: the README fixes the hero at 830px; it
   is now the viewport height instead.

   Expressed as a min-height on the CONTENT rather than a height on the section,
   which matters. The content column is in normal flow (the media layers behind it
   are the absolute ones), so the hero is exactly one viewport tall when the
   content fits and GROWS when it does not — a short laptop window or a large
   accessibility font size can never clip the headline against overflow:hidden.

   svh, not vh: on iOS, vh is the LARGE viewport height, so a 100vh hero sits
   partly under the URL bar until the user scrolls and then jumps. svh is the
   small-viewport height and is stable. The vh line above it is the fallback. */
.dsite-hero {
    position: relative;
    overflow: hidden;
    background: var(--ink);
}

/* The video sits in its own ink-filled box, so the fraction of a second before
   the poster paints is brand black rather than white. Together with the fixed
   hero height and inset:0 positioning, this makes layout shift structurally
   impossible here — the poster is for looks, not for CLS. */
.dsite-hero-media {
    position: absolute;
    inset: 0;
    background: var(--ink);
}

.dsite-hero-video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    /* Decorative and inert: it must not be right-clickable into a play control,
       and the pause button below is the only handle on it. */
    pointer-events: none;
}

.dsite-hero-scrim,
.dsite-hero-vignette,
.dsite-hero-grain {
    position: absolute;
    inset: 0;
    pointer-events: none;
}

.dsite-hero-scrim {
    background: linear-gradient(180deg,
        rgba(5, 5, 5, .94) 0%,
        rgba(5, 5, 5, .50) 32%,
        rgba(5, 5, 5, .60) 64%,
        rgba(5, 5, 5, .97) 100%);
    opacity: .72;
}

.dsite-hero-vignette {
    background: radial-gradient(115% 80% at 50% 50%, transparent 38%, rgba(0, 0, 0, .66) 100%);
}

/* Film grain: an inline feTurbulence SVG at its intrinsic 160x160, so it tiles
   at 160px with no background-size needed. Generated rather than shipped as an
   image because it is a handful of bytes and never needs a second request. */
.dsite-hero-grain {
    opacity: .16;
    mix-blend-mode: overlay;
    background-image: url('data:image/svg+xml;utf8,<svg xmlns=%22http://www.w3.org/2000/svg%22 width=%22160%22 height=%22160%22><filter id=%22n%22><feTurbulence type=%22fractalNoise%22 baseFrequency=%220.85%22 numOctaves=%223%22 stitchTiles=%22stitch%22/></filter><rect width=%22160%22 height=%22160%22 filter=%22url(%23n)%22/></svg>');
}

/* The content column is inert so the layers beneath stay unclickable; the
   header and the CTA row opt back in. It is in normal FLOW — it is what gives
   the section its height. See the note on .dsite-hero. */
.dsite-hero-content {
    position: relative;
    min-height: 100vh;
    min-height: 100svh;
    display: flex;
    flex-direction: column;
    pointer-events: none;
}

.dsite-hero-centre {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    padding: 0 var(--pad-page-x) 46px;
}

/* Brighter than the section kickers elsewhere: gold-light at .85, not --gold. */
.dsite-hero-kicker {
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 9.5px;
    line-height: 1;
    letter-spacing: var(--track-kicker);
    text-transform: uppercase;
    color: rgba(227, 206, 134, .85);
}

/* The foil: a gradient clipped to the glyphs. background-size 220% gives dsheen
   room to travel one full pass. Anything carrying .dsite-foil must set its own
   font — this class only paints. */
.dsite-foil {
    background-image: var(--foil);
    background-size: var(--foil-size);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
}

/* The italic inside the foil headline inherits the clip from its parent, so it
   must NOT re-declare a colour — doing so would punch an opaque hole in the
   gradient. Only the slant changes. */
.dsite-foil-em {
    font-style: italic;
}

.dsite-hero-headline {
    margin-top: 30px;
    max-width: 18ch;
    font-family: var(--font-display);
    font-weight: 300;
    font-size: 70px;
    line-height: 1.1;
    letter-spacing: var(--track-display);
    text-wrap: pretty;
}

.dsite-hero-rule {
    display: block;
    width: 1px;
    height: 46px;
    margin-top: 34px;
    background: linear-gradient(180deg, rgba(182, 159, 57, .7), transparent);
    transform-origin: top;
}

.dsite-hero-sub {
    margin-top: 26px;
    max-width: 440px;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 15px;
    line-height: 1.85;
    letter-spacing: var(--track-panel);
    color: var(--bone-66);
    text-wrap: pretty;
}

.dsite-hero-ctas {
    display: flex;
    align-items: center;
    gap: 30px;
    margin-top: 42px;
    pointer-events: auto;
}

.dsite-hero-about {
    font-size: 10.5px;
    letter-spacing: var(--track-btn);
    color: var(--bone-72);
}

@media (hover: hover) {
    .dsite-hero-about:hover { color: var(--gold); }
}

/* Hidden above 768px; the header carries the number there. See the responsive
   pass — this element exists so nothing has to move at runtime. */
.dsite-hero-phone {
    display: none;
    margin-top: 30px;
    pointer-events: auto;
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 11px;
    line-height: 1;
    letter-spacing: var(--track-phone);
    color: var(--bone-66);
}

.dsite-hero-lang {
    gap: 26px;                       /* the footer strip uses 18px */
    padding: 0 var(--pad-page-x) 34px;
    /* The hero's content column is pointer-events:none so the video beneath it
       stays inert, and every interactive thing inside has to opt back in. Without
       this the language switch renders perfectly and is completely unclickable. */
    pointer-events: auto;
}

/* ⚠️ NOT IN THE DESIGN — see the note in Views/Home/Landing.cshtml. Invisible
   until the hero is hovered or this is focused, which is what keeps it out of
   the composition while still satisfying WCAG 2.2 SC 2.2.2. */
.dsite-hero-pause {
    position: absolute;
    right: 22px;
    bottom: 22px;
    z-index: 3;
    width: 44px;
    height: 44px;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    background: none;
    border: 0;
    cursor: pointer;
    opacity: 0;
    transition: opacity var(--t-hover) ease, color var(--t-hover) ease;
    color: var(--bone-42);
}

.dsite-hero-pause[hidden] {
    display: none;
}

.dsite-hero:hover .dsite-hero-pause,
.dsite-hero-pause:focus-visible {
    opacity: 1;
}

/* The video plays on phones now (see heroMayPlay in marketing.js), and :hover
   never fires on a touch screen — so on those devices the control has to be
   standing there, or SC 2.2.2 is satisfied only on paper. It keeps its
   --bone-42, which is about as close to absent as a visible control gets. */
@media (hover: none) {
    .dsite-hero-pause { opacity: 1; }
}

/* Two bars for "pause"; one triangle-ish bar set for "play" once paused. Drawn
   in CSS so there is no icon font and no second request. */
.dsite-hero-pause-glyph,
.dsite-hero-pause-glyph::after {
    display: block;
    width: 3px;
    height: 14px;
    background: currentColor;
}

.dsite-hero-pause-glyph {
    position: relative;
}

.dsite-hero-pause-glyph::after {
    content: "";
    position: absolute;
    left: 6px;
    top: 0;
}

.dsite-hero-pause[aria-pressed="true"] .dsite-hero-pause-glyph {
    width: 0;
    height: 0;
    background: none;
    border-top: 7px solid transparent;
    border-bottom: 7px solid transparent;
    border-left: 11px solid currentColor;
}

.dsite-hero-pause[aria-pressed="true"] .dsite-hero-pause-glyph::after {
    display: none;
}

@media (hover: hover) {
    .dsite-hero-pause:hover { color: var(--gold); }
}


/* --- about ---------------------------------------------------------------- */

.dsite-about {
    background: var(--ink-2);
    border-top: 1px solid var(--gold-22);
    padding: var(--about-pad-t) var(--pad-section-x) var(--about-pad-b);
}

/* ⚠️ Beyond the reference, which is a fixed 1440px canvas and says nothing above
   it. On a 2560px monitor this section simply kept spreading — 2305px between
   its outer edges — while the copy inside stayed at its 58ch measure, so the
   text and the photographs drifted to opposite edges with a field of empty ink
   between them, and the three stat cells ended up absurdly far apart.

   The SECTION stays full-bleed: its ink field, its gold hairline and its
   vertical rhythm are the page's structure and must still reach both edges.
   Only the content inside it is capped, and centred.

   The cap is written against the FRAME rather than the content box, so
   --pad-section-x keeps reading as the minimum gutter it already is. That is
   also what makes this inert below a 1512px viewport: at 1440 the content is
   1200px and the cap is 1272px, so the design canvas is untouched. */
.dsite-about-grid,
.dsite-stats {
    max-width: calc(var(--content-max) - 2 * var(--pad-section-x));
    margin-inline: auto;
}

.dsite-about-grid {
    display: grid;
    grid-template-columns: 1fr var(--col-about);
    gap: var(--grid-gap);
    align-items: start;
}

.dsite-about-h2 {
    margin-top: 34px;
    max-width: 14ch;
    font-family: var(--font-display);
    font-weight: 300;
    font-size: 62px;
    line-height: 1.14;
    letter-spacing: var(--track-display);
    color: var(--bone);
    text-wrap: pretty;
}

.dsite-lede {
    margin-top: 34px;
    max-width: 58ch;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 17px;
    line-height: 1.9;
    color: var(--bone-72);
    text-wrap: pretty;
}

.dsite-body {
    margin-top: 26px;
    max-width: 58ch;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 15px;
    line-height: 1.95;
    color: var(--bone-55);
    text-wrap: pretty;
}

.dsite-body--afterquote { margin-top: 40px; }
.dsite-body--tight      { margin-top: 20px; }

.dsite-pullquote {
    margin-top: 40px;
    max-width: 34ch;
    padding-top: 26px;
    border-top: 1px solid var(--gold-35);
    font-family: var(--font-display);
    font-weight: 300;
    font-style: italic;
    font-size: 30px;
    line-height: 1.32;
    color: var(--gold);
    text-wrap: pretty;
}

.dsite-about-contact {
    display: flex;
    align-items: center;
    gap: 18px;
    margin-top: 44px;
    flex-wrap: wrap;
}

.dsite-about-mail {
    font-family: var(--font-display);
    font-weight: 300;
    font-style: italic;
    font-size: 22px;
    line-height: 1;
    color: var(--bone);
    transition: color var(--t-hover) ease;
}

.dsite-about-contactrule {
    display: block;
    width: 38px;
    height: 1px;
    background: var(--gold-50);
}

@media (hover: hover) {
    .dsite-about-mail:hover { color: var(--gold); }
}

.dsite-about-frames {
    display: flex;
    flex-direction: column;
    gap: 18px;
}

.dsite-frame {
    position: relative;
    overflow: hidden;
    background: var(--ink);
    border: 1px solid var(--gold-18);
}

.dsite-frame--tall  { height: 520px; }
.dsite-frame--short { height: 300px; margin-top: 10px; }

.dsite-frame img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.dsite-frame-caption {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 16px;
}

.dsite-micro--caption {
    color: var(--bone-40);
}

.dsite-caption-italic {
    font-family: var(--font-display);
    font-weight: 300;
    font-style: italic;
    font-size: 13px;
    line-height: 1.6;
    color: var(--bone-40);
}

.dsite-stats {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    margin-top: 96px;
    border-top: 1px solid var(--rule-inner);
}

/* 34px above, 40px of inner side padding, and a 1px divider between cells —
   which is why the first cell pads only on the right and the last only on the
   left: the outer edges must sit flush with the section padding. */
.dsite-stat {
    padding: 34px 40px 0;
    border-left: 1px solid var(--rule-inner);
}

.dsite-stat:first-child {
    padding: 34px 40px 0 0;
    border-left: 0;
}

.dsite-stat:last-child {
    padding: 34px 0 0 40px;
}

.dsite-stat-figure {
    display: block;
    font-family: var(--font-display);
    font-weight: 300;
    font-size: 34px;
    line-height: 1;
    color: var(--gold);
}

.dsite-stat-label {
    display: block;
    margin-top: 12px;
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 9.5px;
    line-height: 1.6;
    letter-spacing: var(--track-micro);
    text-transform: uppercase;
    color: var(--bone-45);
}


/* --- cookie notice -------------------------------------------------------- */

/* The reference pins this inside the hero; in production it is page-level, so a
   visitor who lands on /privacy from an app store listing sees it too. */
.dsite-cookie {
    position: fixed;
    left: 34px;
    bottom: 30px;
    z-index: 60;
    width: 338px;
    padding: 22px 24px 20px;
    background: rgba(12, 11, 10, .72);
    backdrop-filter: blur(16px);
    -webkit-backdrop-filter: blur(16px);
    border: 1px solid var(--gold-30);
}

.dsite-cookie[hidden] {
    display: none;
}

.dsite-cookie-label {
    display: block;
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 9px;
    line-height: 1;
    letter-spacing: var(--track-label);
    text-transform: uppercase;
    color: var(--gold);
}

.dsite-cookie-copy {
    margin-top: 14px;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 12.5px;
    line-height: 1.65;
    color: var(--bone-60);
    text-wrap: pretty;
}

.dsite-cookie-actions {
    display: flex;
    align-items: center;
    gap: 20px;
    margin-top: 18px;
}

/* The notice's Accept is smaller than the page's primary CTA. */
.dsite-btn--cookie {
    padding: 12px 20px;
    font-size: 9.5px;
}

.dsite-cookie-more {
    margin-left: auto;
    padding-bottom: 4px;
    border-bottom: 1px solid var(--bone-20);
    letter-spacing: var(--track-learn);
    color: var(--bone-45);
}

@media (hover: hover) {
    .dsite-cookie-more:hover {
        color: var(--gold);
        border-color: var(--gold);
    }
}


/* --- cookie preferences modal --------------------------------------------- */

/* The UA's default border/padding/max-width are reset and the dialog itself is
   made a full-viewport transparent box, so `event.target === dialog` is exactly
   a backdrop click and never a click on the card's own padding. */
.dsite-modal {
    width: 100%;
    height: 100%;
    max-width: none;
    max-height: none;
    padding: 0;
    border: 0;
    background: transparent;
    color: var(--bone);
    overflow: auto;
}

.dsite-modal[open] {
    display: grid;
    place-items: center;
}

.dsite-modal::backdrop {
    background: rgba(4, 4, 4, .74);
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
}

.dsite-modal-card {
    position: relative;
    width: 660px;
    max-width: calc(100vw - 32px);
    padding: 46px 52px 40px;
    background: rgba(12, 11, 10, .96);
    border: 1px solid var(--gold-34);
}

.dsite-modal-close {
    position: absolute;
    top: 22px;
    right: 24px;
    width: 30px;
    height: 30px;
    padding: 0;
    background: none;
    border: 0;
    cursor: pointer;
    font-family: var(--font-display);
    font-weight: 300;
    font-size: 22px;
    line-height: 1;
    color: var(--bone-45);
    transition: color var(--t-hover) ease;
}

.dsite-modal-title {
    margin-top: 22px;
    font-family: var(--font-display);
    font-weight: 300;
    font-size: 36px;
    line-height: 1.16;
    letter-spacing: var(--track-modal-h);
    color: var(--bone);
}

.dsite-modal-intro {
    margin-top: 18px;
    max-width: 56ch;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 13.5px;
    line-height: 1.85;
    color: var(--bone-58);
    text-wrap: pretty;
}

.dsite-modal-rows {
    margin-top: 34px;
    border-top: 1px solid var(--rule-inner);
}

.dsite-modal-row {
    display: flex;
    align-items: flex-start;
    gap: 30px;
    padding: 22px 0;
    border-bottom: 1px solid var(--rule-inner);
}

.dsite-modal-row > div {
    flex: 1;
}

.dsite-modal-rowtitle {
    display: block;
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 10px;
    line-height: 1;
    letter-spacing: var(--track-micro);
    text-transform: uppercase;
    color: var(--bone);
}

.dsite-modal-row p {
    margin-top: 10px;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 13px;
    line-height: 1.75;
    color: var(--bone-50);
    text-wrap: pretty;
}

.dsite-modal-always {
    padding-top: 4px;
    white-space: nowrap;
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 9px;
    line-height: 1;
    letter-spacing: var(--track-micro);
    text-transform: uppercase;
    color: var(--gold-80);
}

/* 46x24 pill, 16px knob inset 3px. The one place besides the dots where this
   design has a border radius. */
.dsite-toggle {
    position: relative;
    flex: none;
    width: 46px;
    height: 24px;
    margin-top: 2px;
    padding: 0;
    border: 1px solid var(--gold-45);
    border-radius: 12px;
    background: var(--toggle-track);
    cursor: pointer;
    transition: background var(--t-hover) ease;
}

.dsite-toggle-knob {
    position: absolute;
    top: 3px;
    left: 3px;
    width: 16px;
    height: 16px;
    border-radius: 50%;
    background: var(--bone-28);
    transition: left var(--t-line) var(--ease-d), background var(--t-line) ease;
}

.dsite-toggle[aria-checked="true"] .dsite-toggle-knob {
    left: 25px;               /* 46 - 3 - 16 - (1px border x2) */
    background: var(--gold);
}

.dsite-modal-actions {
    display: flex;
    align-items: center;
    gap: 24px;
    margin-top: 32px;
    flex-wrap: wrap;
}

.dsite-btn--modal {
    padding: 15px 26px;
    font-size: 9.5px;
}

.dsite-modal-necessary {
    margin-left: auto;
    color: var(--bone-50);
}

.dsite-modal-fine {
    margin-top: 26px;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 12px;
    line-height: 1.7;
    color: var(--bone-34);
}

@media (hover: hover) {
    .dsite-modal-close:hover { color: var(--gold); }
}

/* The footer's re-open control. Styled as a footer link, but it is a <button>
   because it performs an action rather than navigating. */
.dsite-footer-cookies {
    padding: 0;
    background: none;
    border: 0;
    text-align: left;
    cursor: pointer;
}

.dsite-footer-cookies[hidden] {
    display: none;
}


/* --- quote page (/quote) --------------------------------------------------- */

/* The page is three blocks inside <main>: the solid header, this split, and the
   © strip. Making <main> the flex column and giving the split whatever is left
   means it reaches the bottom of the screen at ANY header or strip height — no
   calc() that would have to be re-derived at every breakpoint.

   It is a MIN height and the split never shrinks (flex: 1 0 auto), so the usual
   case — a form taller than the window — is completely untouched. The growth
   only happens on a window tall enough that the page would otherwise stop short
   and leave a dead band under the footer, which is what a large desktop monitor
   does: the design is authored on a 1440px canvas and the form runs out first.

   svh, not vh: same reason as the hero — on iOS vh is the LARGE viewport height,
   so the strip would sit under the URL bar. The vh line is the fallback.

   :has() rather than a class on <main>, so _MarketingLayout stays exactly as it
   is for the other three pages that share it; .dsite-errorsummary:has() already
   relies on the same support. */
main:has(> .dsite-quote) {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
    min-height: 100svh;
}

.dsite-quote {
    flex: 1 0 auto;
    display: grid;
    grid-template-columns: var(--col-plate) 1fr;
    background: var(--ink-2);
}

/* left plate ---------------------------------------------------------------- */

.dsite-plate {
    position: relative;
    min-height: 100%;
    overflow: hidden;
    background: var(--ink);
}

.dsite-plate-media {
    position: absolute;
    inset: 0;
}

.dsite-plate-media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.dsite-plate-scrim {
    position: absolute;
    inset: 0;
    pointer-events: none;
    background: linear-gradient(180deg,
        rgba(5, 5, 5, .90) 0%,
        rgba(5, 5, 5, .72) 45%,
        rgba(5, 5, 5, .94) 100%);
}

.dsite-plate-body {
    position: relative;
    display: flex;
    flex-direction: column;
    height: 100%;
    padding: 86px 56px 64px;
}

.dsite-plate-h1 {
    margin-top: 30px;
    max-width: 15ch;
    font-family: var(--font-display);
    font-weight: 300;
    font-size: 52px;
    line-height: 1.14;
    letter-spacing: var(--track-display);
    color: var(--bone);
    text-wrap: pretty;
}

.dsite-plate-copy {
    margin-top: 26px;
    max-width: 40ch;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 15px;
    line-height: 1.9;
    color: var(--bone-62);
    text-wrap: pretty;
}

/* margin-top:auto pins the assurances to the bottom of the plate, however tall
   the form beside it turns out to be. */
.dsite-plate-foot {
    margin-top: auto;
    padding-top: 56px;
    display: flex;
    flex-direction: column;
    gap: 18px;
}

.dsite-plate-rule {
    display: block;
    height: 1px;
    background: var(--gold-30);
}

.dsite-assurances {
    display: flex;
    flex-direction: column;
    gap: 18px;
}

.dsite-assurances li {
    display: flex;
    gap: 14px;
    align-items: baseline;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 14px;
    line-height: 1.7;
    color: var(--bone-62);
}

.dsite-plate-mail {
    margin-top: 14px;
    align-self: flex-start;
    font-family: var(--font-display);
    font-weight: 300;
    font-style: italic;
    font-size: 20px;
    line-height: 1;
    color: var(--bone);
    transition: color var(--t-hover) ease;
}

@media (hover: hover) {
    .dsite-plate-mail:hover { color: var(--gold); }
}

/* form panel ---------------------------------------------------------------- */

/* On a window taller than the form, the leftover height belongs to the panel —
   the photograph beside it runs the full screen and the form sits centred
   against it, the way the plate's own block is pinned to the bottom of its
   column. Nothing moves at the height the design was drawn at; there is no free
   space to distribute there.

   Grid align-content rather than flex centring or margin:auto, because the
   panel's height is a floor and not a ceiling (it is a stretched grid item in a
   min-height page), so the free space here can never go negative — a form
   taller than the window keeps its top edge where it is instead of being
   centred off the top of the page, which is the classic way this breaks. */
.dsite-form-panel {
    padding: 86px 90px 78px;
    display: grid;
    align-content: center;
}

/* journey-type tiles -------------------------------------------------------- */

.dsite-tiles-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 12px;
    margin-top: 20px;
}

.dsite-tile {
    position: relative;
}

/* Clipped, NOT display:none or visibility:hidden — either of those would remove
   the input from the accessibility tree and make it unfocusable, which is the
   whole reason for using a real radio in the first place. */
.dsite-tile-input {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    border: 0;
    overflow: hidden;
    white-space: nowrap;
    clip-path: inset(50%);
}

.dsite-tile-face {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 54px;           /* already over the 44px minimum as designed */
    height: 100%;
    padding: 18px 14px;
    text-align: center;
    cursor: pointer;
    background: var(--tile-fill);
    border: 1px solid var(--rule-tile);
    color: var(--bone);
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 10px;
    line-height: 1.4;
    letter-spacing: var(--track-tile);
    text-transform: uppercase;
    transition: border-color var(--t-line) ease, background var(--t-line) ease;
}

.dsite-tile-input:checked + .dsite-tile-face {
    background: var(--gold-14);
    border-color: var(--gold);
}

/* The ring goes on the visible tile, since the input it belongs to is clipped. */
.dsite-tile-input:focus-visible + .dsite-tile-face {
    outline: 2px solid var(--gold-light);
    outline-offset: 3px;
}

@media (hover: hover) {
    .dsite-tile-face:hover { border-color: var(--gold-50); }
}

/* fields -------------------------------------------------------------------- */

.dsite-fields {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--field-gap) var(--field-gap-x);
    margin-top: 52px;
}

.dsite-fields--who { margin-top: 26px; }

.dsite-block { margin-top: 64px; }

.dsite-field {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

.dsite-field--notes { margin-top: 34px; }

/* Underline inputs: transparent, no border except a 1px bottom hairline that
   turns gold on focus. color-scheme:dark on the root already darkens the native
   date and time pickers. */
.dsite-input {
    width: 100%;
    padding: 10px 0;
    background: transparent;
    border: 0;
    border-bottom: 1px solid var(--rule-input);
    outline: none;
    color: var(--bone);
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 15px;
    line-height: 1.4;
    transition: border-color var(--t-line) ease;
}

.dsite-input::placeholder {
    /* Raised from the design's implicit level — see --optional-ink. */
    color: var(--optional-ink);
    opacity: 1;                 /* Firefox dims placeholders by default */
}

.dsite-input:focus {
    border-bottom-color: var(--gold);
}

/* The underline is the field's own affordance, so the focus ring would double
   up on it. Everything else on the site keeps the standard ring. */
.dsite-input:focus-visible {
    outline: none;
    border-bottom-color: var(--gold-light);
}

.dsite-select {
    cursor: pointer;
}

/* The dropdown list itself is painted by the OS, which does not inherit the
   panel background — set it explicitly or the options render black-on-black. */
.dsite-select option {
    background: var(--ink-2);
    color: var(--bone);
}

.dsite-textarea {
    resize: none;
    line-height: 1.7;
}

/* The honeypot. Off-screen rather than display:none, which the better bots skip.
   aria-hidden + tabindex="-1" in the markup keep it away from real users. */
.dsite-hp {
    position: absolute;
    left: -9999px;
    top: 0;
    width: 1px;
    height: 1px;
    overflow: hidden;
}

/* errors -------------------------------------------------------------------- */

.dsite-error {
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 11px;
    line-height: 1.5;
    letter-spacing: var(--track-panel);
    color: var(--error);
}

.dsite-error:empty {
    display: none;
}

.dsite-error--tiles {
    display: block;
    margin-top: 12px;
}

/* ASP.NET adds .input-validation-error to a field that failed. Switching the
   underline to the error hue keeps the field reading as the same gold hairline
   system in a different colour, which is what the README asks for. */
.dsite-input.input-validation-error {
    border-bottom-color: var(--error-line);
}

.dsite-input.input-validation-error:focus {
    border-bottom-color: var(--error-focus);
}

.dsite-errorsummary {
    margin-bottom: 28px;
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 12.5px;
    line-height: 1.7;
    color: var(--error);
}

.dsite-errorsummary ul {
    display: flex;
    flex-direction: column;
    gap: 6px;
}

.dsite-errorsummary:has(ul:empty) {
    display: none;
}

/* submit -------------------------------------------------------------------- */

.dsite-submitrow {
    display: flex;
    align-items: center;
    gap: 30px;
    margin-top: 52px;
    flex-wrap: wrap;
}

.dsite-btn--submit {
    padding: 20px 42px;
}

.dsite-submitnote {
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 13.5px;
    line-height: 1.7;
    color: var(--bone-45);
}

/* submitted state ----------------------------------------------------------- */

.dsite-received {
    padding: 70px 0;
    border-top: 1px solid var(--gold-30);
}

.dsite-received-h2 {
    margin-top: 28px;
    max-width: 20ch;
    font-family: var(--font-display);
    font-weight: 300;
    font-size: 46px;
    line-height: 1.18;
    color: var(--bone);
    text-wrap: pretty;
}

.dsite-received-copy {
    margin-top: 24px;
    max-width: 52ch;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 15px;
    line-height: 1.9;
    color: var(--bone-60);
    text-wrap: pretty;
}

.dsite-received-again {
    display: inline-block;
    margin-top: 40px;
    font-size: 10.5px;
}


/* --- legal pages (/privacy, /terms) --------------------------------------- */

.dsite-legal {
    background: var(--ink-2);
    padding: 110px var(--pad-section-x) 96px;
}

.dsite-legal-inner {
    max-width: 760px;
}

.dsite-legal h1 {
    margin-top: 30px;
    max-width: 18ch;
    font-family: var(--font-display);
    font-weight: 300;
    font-size: 54px;
    line-height: 1.16;
    letter-spacing: var(--track-display);
    color: var(--bone);
    text-wrap: pretty;
}

.dsite-legal-updated {
    margin-top: 22px;
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 9.5px;
    line-height: 1.6;
    letter-spacing: var(--track-micro);
    text-transform: uppercase;
    color: var(--bone-42);
}

.dsite-legal-lede {
    margin-top: 34px;
    max-width: 58ch;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 17px;
    line-height: 1.9;
    color: var(--bone-72);
    text-wrap: pretty;
}

/* --- the legal documents themselves ---------------------------------------

   Everything below styles the AUTHORED markup inside Data/Legal/*.html — its own
   headings, lists, tables, callouts and table of contents. Those files carry no
   stylesheet of their own (theirs was stripped, along with its Google Fonts
   links), so this is where they get their appearance.

   Element selectors are scoped under .dsite-legal-doc and wrapped in :where()
   where they could compete with a class, for the same specificity reason as the
   reset at the top of this file.
   -------------------------------------------------------------------------- */

.dsite-legal-doc {
    margin-top: 48px;
}

.dsite-legal-doc :where(h2) {
    margin-top: 64px;
    padding-top: 34px;
    border-top: 1px solid var(--gold-22);
    font-family: var(--font-display);
    font-weight: 300;
    font-size: 30px;
    line-height: 1.24;
    letter-spacing: var(--track-display);
    color: var(--bone);
    /* Section anchors are linked from the document's own contents list; without
       this the sticky-free layout still lands the heading flush to the top edge. */
    scroll-margin-top: 24px;
}

.dsite-legal-doc :where(h3) {
    margin-top: 38px;
    font-family: var(--font-ui);
    font-weight: 500;
    font-size: 13px;
    line-height: 1.5;
    letter-spacing: var(--track-tile);
    text-transform: uppercase;
    color: var(--gold);
}

.dsite-legal-doc :where(p) {
    margin-top: 20px;
    max-width: 68ch;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 15px;
    line-height: 1.95;
    color: var(--bone-72);
    text-wrap: pretty;
}

.dsite-legal-doc :where(.lede) {
    font-size: 17px;
    color: var(--bone-72);
}

.dsite-legal-doc :where(strong) {
    font-weight: 500;
    color: var(--bone);
}

.dsite-legal-doc :where(em) {
    font-style: italic;
}

.dsite-legal-doc :where(code) {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 13px;
    color: var(--gold-light);
}

.dsite-legal-doc :where(a) {
    color: var(--gold);
    border-bottom: 1px solid var(--gold-45);
    padding-bottom: 1px;
    transition: color var(--t-hover) ease, border-color var(--t-hover) ease;
}

@media (hover: hover) {
    .dsite-legal-doc a:hover {
        color: var(--gold-light);
        border-bottom-color: var(--gold-light);
    }
}

.dsite-legal-doc :where(ul, ol) {
    margin-top: 20px;
    padding-left: 0;
    max-width: 68ch;
    display: flex;
    flex-direction: column;
    gap: 12px;
}

.dsite-legal-doc :where(ol) {
    counter-reset: dsite-legal-ol;
}

.dsite-legal-doc :where(li) {
    position: relative;
    padding-left: 22px;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 15px;
    line-height: 1.8;
    color: var(--bone-72);
}

/* A gold dot for unordered items, a gold numeral for ordered ones — the same
   marker language as the quote page's assurances. */
.dsite-legal-doc :where(ul) > li::before {
    content: "";
    position: absolute;
    left: 0;
    top: .72em;
    width: 4px;
    height: 4px;
    border-radius: 50%;
    background: var(--gold);
}

.dsite-legal-doc :where(ol) > li::before {
    counter-increment: dsite-legal-ol;
    content: counter(dsite-legal-ol) ".";
    position: absolute;
    left: 0;
    top: 0;
    color: var(--gold);
    font-variant-numeric: tabular-nums;
}

/* Contents list at the top of each document.

   The block is <nav class="toc"><h2>Contents</h2><ol>…</ol></nav>, so the
   two-column treatment belongs on the LIST, not on .toc. Putting it on the nav
   made the heading column one and shoved the whole list into column two. */
.dsite-legal-doc :where(.toc) {
    margin-top: 34px;
    padding: 26px 0;
    border-top: 1px solid var(--rule-inner);
    border-bottom: 1px solid var(--rule-inner);
}

/* "Contents" is a label, not a section heading — it must not take the 30px
   Cormorant treatment with a gold rule above it that every other h2 gets. */
.dsite-legal-doc .toc h2 {
    margin-top: 0;
    padding-top: 0;
    border-top: 0;
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 9px;
    line-height: 1;
    letter-spacing: var(--track-label);
    text-transform: uppercase;
    color: var(--label-ink);
}

/* CSS columns rather than a grid: a contents list should read DOWN the first
   column and then down the second, and multicol does that without needing to
   know the item count — which differs per document (18 sections in the privacy
   policy, 23 in the terms). `display:block` undoes the flex the generic list
   rule sets, since multicol does not apply to a flex container. */
.dsite-legal-doc .toc ol {
    display: block;
    margin-top: 20px;
    max-width: none;
    columns: 2;
    column-gap: 44px;
}

.dsite-legal-doc .toc li {
    break-inside: avoid;
    margin-bottom: 9px;
}

/* The one nested sub-item ("Electronic monitoring"). Kept with its parent. */
.dsite-legal-doc .toc ul {
    display: block;
    margin-top: 6px;
    gap: 0;
}

.dsite-legal-doc .toc ul li {
    margin-bottom: 0;
}

.dsite-legal-doc .toc a {
    border-bottom: 0;
    padding-bottom: 0;
    font-size: 13.5px;
    line-height: 1.6;
    color: var(--bone-55);
}

@media (hover: hover) {
    .dsite-legal-doc .toc a:hover { color: var(--gold); }
}

/* Pulled-out notes. The "dark" variant is the document's own emphasis for the
   passages that matter most — location tracking, liability. */
.dsite-legal-doc :where(.callout) {
    margin-top: 30px;
    padding: 24px 28px;
    background: rgba(255, 255, 255, .02);
    border-left: 2px solid var(--gold-45);
}

.dsite-legal-doc :where(.callout.dark) {
    background: rgba(182, 159, 57, .07);
    border-left-color: var(--gold);
}

.dsite-legal-doc :where(.callout-title) {
    display: block;
    margin-bottom: 6px;
    font-family: var(--font-ui);
    font-weight: 400;
    font-size: 9.5px;
    line-height: 1;
    letter-spacing: var(--track-kicker);
    text-transform: uppercase;
    color: var(--gold);
}

.dsite-legal-doc .callout :where(p):first-of-type { margin-top: 0; }

.dsite-legal-doc :where(.contact-card) {
    margin-top: 30px;
    padding: 26px 28px;
    border: 1px solid var(--gold-22);
}

.dsite-legal-doc .contact-card :where(p):first-of-type { margin-top: 0; }

/* Tables — in the privacy policy these carry the data categories, purposes,
   lawful bases and retention periods, so they must stay legible rather than
   collapse. The document already wraps each one in .table-scroll; that is what
   keeps a wide table inside its own scroller instead of making the PAGE scroll
   sideways. */
.dsite-legal-doc :where(.table-scroll) {
    margin-top: 26px;
    overflow-x: auto;
    border: 1px solid var(--rule-inner);
}

.dsite-legal-doc :where(table) {
    width: 100%;
    border-collapse: collapse;
    font-family: var(--font-ui);
    font-size: 13.5px;
    line-height: 1.7;
}

.dsite-legal-doc :where(th) {
    padding: 14px 18px;
    text-align: left;
    vertical-align: top;
    white-space: nowrap;
    background: rgba(255, 255, 255, .03);
    border-bottom: 1px solid var(--gold-22);
    font-weight: 400;
    font-size: 9px;
    line-height: 1.4;
    letter-spacing: var(--track-label);
    text-transform: uppercase;
    color: var(--gold);
}

.dsite-legal-doc :where(td) {
    padding: 14px 18px;
    vertical-align: top;
    border-bottom: 1px solid var(--rule-inner);
    font-weight: 300;
    color: var(--bone-72);
}

.dsite-legal-doc :where(tbody tr:last-child td) {
    border-bottom: 0;
}

/* ⚠️ Unfilled placeholders left in the source documents — the kennitala, the
   registered address, the telephone, two retention periods and a liability cap.
   Marked in the error hue ON PURPOSE: these are legally operative blanks in a
   binding document, and they must be impossible to skim past before publishing.
   When the last one is filled in, this rule stops matching anything. */
.dsite-legal-doc :where(.todo) {
    color: var(--error);
    border-bottom: 1px dotted var(--error-line);
    font-weight: 400;
}


/* --- error page (anonymous 404 / 500) ------------------------------------- */

.dsite-status {
    min-height: 62vh;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    background: var(--ink-2);
    padding: 120px var(--pad-page-x);
}

.dsite-status h1 {
    margin-top: 30px;
    max-width: 20ch;
    font-family: var(--font-display);
    font-weight: 300;
    font-size: 46px;
    line-height: 1.18;
    letter-spacing: var(--track-display);
    color: var(--bone);
    text-wrap: pretty;
}

.dsite-status p {
    margin-top: 24px;
    max-width: 48ch;
    font-family: var(--font-ui);
    font-weight: 300;
    font-size: 15px;
    line-height: 1.9;
    color: var(--bone-60);
    text-wrap: pretty;
}

.dsite-status .dsite-btn {
    margin-top: 40px;
}


/* ============================================================================
   RESPONSIVE

   The reference is authored at a fixed 1440px canvas, so everything below is
   the one place the build is expected to design beyond it. Desktop-first
   max-width queries, because that is the direction the design travels.

   Most of each breakpoint is nothing but token overrides on .deltra-site —
   which is the payoff for putting the spacing scale in custom properties.

   ⚠️ EVERY letter-spacing value stays exactly as specified at every width.
   Only sizes shrink. The README is explicit, and the tracking is the identity.
   ============================================================================ */


/* --- 1024-1439 ------------------------------------------------------------ */

@media (max-width: 1439px) {
    .deltra-site {
        --pad-section-x: 64px;
        --about-pad-t: 96px;
        --about-pad-b: 96px;
        --footer-pad-t: 96px;
        --grid-gap: 64px;
        --col-about: 380px;
        --col-plate: 440px;
    }

    .dsite-hero-headline { font-size: 56px; }
    .dsite-about-h2 { font-size: 54px; }
    .dsite-footer-h2 { font-size: 48px; }
    .dsite-plate-h1 { font-size: 46px; }

    .dsite-frame--tall { height: 460px; }
    .dsite-frame--short { height: 260px; }

    .dsite-plate-body { padding: 72px 44px 56px; }
    .dsite-form-panel { padding: 72px 56px 64px; }
}


/* --- 768-1023 ------------------------------------------------------------- */

@media (max-width: 1023px) {
    .deltra-site {
        --pad-page-x: 40px;
        --pad-page-y: 22px;
        --pad-section-x: 48px;
    }

    /* Nothing to do for the hero height here any more — it is one viewport tall
       at every width, and grows if the content needs it. See .dsite-hero. */

    .dsite-hero-headline { font-size: 46px; }
    .dsite-about-h2 { font-size: 44px; }
    .dsite-footer-h2 { font-size: 40px; }
    .dsite-plate-h1 { font-size: 38px; }
    .dsite-received-h2 { font-size: 36px; }

    /* About stacks. Rather than dropping 840px of uninterrupted photography
       under the text, the image column becomes a 2-up row: explicit rows plus
       column flow put each frame above its own caption. */
    .dsite-about-grid {
        grid-template-columns: 1fr;
        gap: 56px;
    }

    .dsite-about-frames {
        display: grid;
        grid-template-columns: 1fr 1fr;
        grid-template-rows: auto auto;
        grid-auto-flow: column;
        column-gap: 24px;
        row-gap: 14px;
    }

    .dsite-frame--tall,
    .dsite-frame--short {
        height: auto;
        margin-top: 0;
    }

    .dsite-frame--tall { aspect-ratio: 4 / 5; }
    .dsite-frame--short { aspect-ratio: 1 / 1; }

    /* Stats stay three across; only the numerals and the inner padding give. */
    .dsite-stat-figure { font-size: 28px; }
    .dsite-stat { padding: 34px 24px 0; }
    .dsite-stat:first-child { padding: 34px 24px 0 0; }
    .dsite-stat:last-child { padding: 34px 0 0 24px; }

    /* The quote page stacks: the plate becomes a banner above the form.

       The README says the banner is 320px, but its bottom-pinned block (the
       gold rule, the three assurances, the mailto) then has nowhere to go.
       Rather than drop that content, the banner simply grows and the
       assurances lay out three across — same content, same gold-rule motif,
       a banner that is still short. */
    .dsite-quote {
        grid-template-columns: 1fr;
    }

    .dsite-plate {
        min-height: auto;
    }

    .dsite-plate-body {
        padding: 64px var(--pad-page-x) 48px;
    }

    .dsite-plate-foot {
        margin-top: 40px;
        padding-top: 32px;
    }

    .dsite-assurances {
        display: grid;
        grid-template-columns: repeat(3, 1fr);
        gap: 16px 28px;
    }

    .dsite-form-panel {
        padding: 64px var(--pad-page-x) 64px;
    }

    /* The field grid stays two columns here — the README is explicit. */

    /* Footer: the brand block takes the full first row, the two link columns
       share the second. */
    .dsite-footer-cols {
        grid-template-columns: 1fr 1fr;
        gap: 48px 40px;
    }

    .dsite-footer-brand {
        grid-column: 1 / -1;
    }
}


/* --- below 768 ------------------------------------------------------------ */

@media (max-width: 767px) {
    .deltra-site {
        --pad-page-x: 24px;
        --pad-page-y: 18px;
        --pad-section-x: 24px;
        --about-pad-t: 72px;
        --about-pad-b: 72px;
        --footer-pad-t: 72px;
        --footer-pad-b: 32px;
        --field-gap: 28px;
        --field-gap-x: 0px;
        --logo-h: 38px;
        --logo-h-footer: 38px;
    }

    /* max-width stays 18ch — the README is explicit that only sizes shrink. */
    .dsite-hero-headline { font-size: 36px; }
    .dsite-about-h2 { font-size: 34px; }
    .dsite-footer-h2 { font-size: 32px; }
    .dsite-plate-h1 { font-size: 30px; }
    .dsite-received-h2 { font-size: 28px; }
    .dsite-modal-title { font-size: 26px; }
    .dsite-pullquote { font-size: 22px; }
    .dsite-legal h1 { font-size: 34px; }
    .dsite-legal-doc :where(h2) { font-size: 24px; }

    /* The documents' contents list drops to one column, and their tables get a
       little breathing room back inside their own scroller. */
    .dsite-legal-doc .toc ol { columns: 1; }
    .dsite-legal-doc :where(.callout) { padding: 20px 18px; }
    .dsite-legal-doc :where(.contact-card) { padding: 20px 18px; }
    .dsite-legal-doc :where(th),
    .dsite-legal-doc :where(td) { padding: 12px 14px; }
    .dsite-status h1 { font-size: 32px; }
    .dsite-stat-figure { font-size: 26px; }

    /* The header keeps only the logo and Login; the number moves into the hero.
       Two elements and this switch, rather than moving a node at runtime. */
    .dsite-header-phone { display: none; }
    .dsite-hero-phone { display: inline-block; }

    .dsite-hero-centre { padding: 0 var(--pad-page-x) 32px; }

    /* Four journey tiles across a 375px screen would be unreadable at 10px with
       .16em tracking. Two by two keeps the type and the tracking intact. */
    .dsite-tiles-grid {
        grid-template-columns: 1fr 1fr;
    }

    .dsite-fields {
        grid-template-columns: 1fr;
    }

    .dsite-assurances {
        grid-template-columns: 1fr;
    }

    .dsite-plate-body { padding: 48px var(--pad-page-x) 40px; }
    .dsite-form-panel { padding: 48px var(--pad-page-x) 56px; }

    /* About returns to a single column, images at fixed heights again. */
    .dsite-about-frames {
        grid-auto-flow: row;
        grid-template-columns: 1fr;
        grid-template-rows: none;
    }

    .dsite-frame--tall,
    .dsite-frame--short {
        aspect-ratio: auto;
    }

    .dsite-frame--tall { height: 320px; }
    .dsite-frame--short { height: 220px; margin-top: 10px; }

    /* Stats stack; the vertical dividers become horizontal ones. */
    .dsite-stats {
        grid-template-columns: 1fr;
    }

    .dsite-stat,
    .dsite-stat:first-child,
    .dsite-stat:last-child {
        padding: 28px 0 0;
        border-left: 0;
        border-top: 1px solid var(--rule-inner);
    }

    .dsite-stat:first-child {
        border-top: 0;
    }

    .dsite-footer-cols {
        grid-template-columns: 1fr;
        gap: 40px;
    }

    .dsite-strip {
        flex-direction: column;
        align-items: flex-start;
        gap: 16px;
    }

    /* The cookie notice becomes a full-width bottom sheet with a 16px inset. */
    .dsite-cookie {
        left: 16px;
        right: 16px;
        bottom: 16px;
        width: auto;
    }

    .dsite-modal-card {
        width: auto;
        margin: 16px;
        padding: 32px 24px 28px;
        max-height: calc(100svh - 32px);
        overflow-y: auto;
    }

    .dsite-modal-actions {
        gap: 16px;
    }

    /* Pushing "Necessary only" to the right leaves it stranded once the row
       wraps. */
    .dsite-modal-necessary {
        margin-left: 0;
    }

    /* At 9px with .42em tracking these labels cannot fit on one line at 375px.
       Let them wrap rather than tightening the tracking. */
    .dsite-label {
        white-space: normal;
        line-height: 1.6;
    }

    .dsite-submitrow {
        gap: 20px;
    }

    .dsite-btn--submit {
        width: 100%;
    }

    /* Tap targets. The design's compact paddings compute under 44px once the
       type shrinks on a phone, and unlike the 9.5px text buttons these have a
       real box, so a transparent ::after would overlap its neighbours. Giving
       them a floor is the honest fix; it is visible only on phones. */
    .dsite-input,
    .dsite-select,
    .dsite-btn--cookie,
    .dsite-btn--modal,
    .dsite-btn--ghost {
        min-height: 44px;
    }

    .dsite-input,
    .dsite-select {
        padding: 12px 0;
    }

    .dsite-textarea {
        min-height: 96px;
    }
}
