/* Typeface: IBM Plex Sans, self-hosted (SIL Open Font License 1.1). Chosen 11 September 2026 to
   replace Poppins, which read as playful; Plex is engineered and calm. Latin and Latin Extended
   subsets only; Norwegian æøå are in the Latin block. Files in site/assets/fonts/: one variable file per
   subset (wght 100–700), so every weight shares one download. */
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:100 700;font-display:swap;src:url(fonts/ibm-plex-sans-latin-ext.woff2?v=d160e20920) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:100 700;font-display:swap;src:url(fonts/ibm-plex-sans-latin.woff2?v=e2291e842c) 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}
/* Storevik design system, stage 1. Tokens are global; every rule is scoped to
   body.v2 so pages not yet converted are untouched. */
:root{--ground:#0B0F14;--surface:#121821;--line:#1E2631;--tx:#F2F4F7;--tx2:#98A1AD;
 --accent:#F2F4F7;--action:#F2F4F7;--on-action:#0B0F14;--glass:rgba(11,15,20,.72);--outline:#1E2631;
 --connect:#0BBFDD;--workspace:#FD741E;--secure:#00BF64;--error:#FF7A70}
[data-mode=light]{--ground:#ffffff;--surface:#F4F5F7;--line:#E0E0E0;--tx:#060610;--tx2:#555560;
 --accent:#060610;--action:#060610;--on-action:#ffffff;--glass:rgba(255,255,255,.72);--outline:#C9CDD3;
 --connect:#0A7080;--workspace:#B54A09;--secure:#007A44;--error:#B3261E}
body.v2{background:var(--ground);color:var(--tx);font-family:'IBM Plex Sans',system-ui,sans-serif;
 font-weight:400;line-height:1.65;font-size:15px}
body.v2 .w{max-width:1220px;margin:0 auto;padding-inline:var(--gutter)}
body.v2 .label{font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--tx2);font-weight:500;margin:0}
/* header, restyled in place */
body.v2 .site-header{position:fixed;top:12px;left:50%;transform:translateX(-50%);width:min(1240px,calc(100% - var(--gutter)*2));
 height:64px;padding-inline:20px 12px;gap:28px;border-radius:14px;border:1px solid var(--line);
 background:var(--glass);-webkit-backdrop-filter:blur(18px) saturate(1.3);backdrop-filter:blur(18px) saturate(1.3);
 box-shadow:0 10px 40px rgba(0,0,0,.18);transition:transform .3s var(--ease)}
body.v2 .site-header.is-scrolled{box-shadow:0 12px 40px rgba(0,0,0,.24)}   /* same height and logo once scrolled (owner, 9 October 2026); only the shadow deepens */
body.v2 .site-header.is-hidden{transform:translate(-50%,calc(-100% - 16px))}
/* While a menu is open the bar is solid, so the page or the scrolled menu never shows through the glass (cowboy report 1.1),
   and so it is for readers who ask for less transparency or more contrast (2.3). */
body.v2 .site-header.menu-is-open,body.v2 .site-header.search-is-open,body.v2 .site-header:has(.services-dropdown[open]){background:var(--surface);-webkit-backdrop-filter:none;backdrop-filter:none}
@media(prefers-reduced-transparency:reduce),(prefers-contrast:more){
 body.v2 .site-header{background:var(--surface);-webkit-backdrop-filter:none;backdrop-filter:none}
}
body.v2 .site-header .nav-main{margin-inline:auto}
body.v2 .site-header .brand img{width:150px}
body.v2 main{padding-top:88px}
body.v2 .media-hero{margin-top:-88px}
@media(max-width:800px){body.v2 .site-header{top:10px;height:56px;padding-inline:14px 8px;gap:12px;border-radius:12px}
 body.v2 main{padding-top:78px}body.v2 .media-hero{margin-top:-78px}
 body.v2 .site-header .brand img{width:132px}}
@media(prefers-reduced-motion:reduce){body.v2 .site-header{transition:none}body.v2 .site-header.is-hidden{transform:translateX(-50%)}}
body.v2 .brand img{filter:none}
body.v2 .nav-main a,body.v2 .services-dropdown summary{font-size:12px;font-weight:400;letter-spacing:.02em;
 text-transform:none;color:var(--tx2)}
body.v2 .nav-main a:hover,body.v2 .services-dropdown summary:hover{color:var(--tx)}
body.v2 .nav-main a::after{display:none}
body.v2 .header-contact{background:var(--action);color:var(--on-action);border:0;font-weight:600;font-size:13px}
/* The services menu, option A (owner, 28 October 2026): IT as a service with its three parts as cards with a coloured top line,
   then Projects and consulting (Advice and projects until 5 November 2026) with the six areas as short links. The panel is opaque from the first frame (cowboy report, top 1). */
body.v2 .mega-menu{background:var(--surface);border:1px solid var(--line);top:calc(100% + 10px);left:0;right:0;border-radius:12px;box-shadow:0 30px 60px rgba(0,0,0,.28);padding:22px 26px 24px;overscroll-behavior:contain}
body.v2 .mega-menu a{color:var(--tx)}
body.v2 .mega-menu small{color:var(--tx2)}
body.v2 .mega-section+.mega-section{margin-top:20px;padding-top:18px;border-top:1px solid var(--line)}
body.v2 .mega-section-head{display:flex;justify-content:space-between;align-items:center;gap:20px}
body.v2 .nav-main .mega-title{display:inline-flex;align-items:center;gap:10px;min-height:32px;font-size:16px;font-weight:600}
body.v2 .nav-main .mega-all{display:inline-flex;align-items:center;gap:10px;min-height:32px;font-size:13px;color:var(--tx2)}
body.v2 .nav-main .mega-all:hover{color:var(--tx)}
body.v2 .mega-parts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:12px}
body.v2 .nav-main a.mega-part{display:block;min-height:0;padding:14px 16px 15px;border:1px solid var(--line);border-top:2px solid var(--part);border-radius:8px;background:var(--ground)}
body.v2 .nav-main a.mega-part:hover,body.v2 .nav-main a.mega-part[aria-current]{border-color:var(--tx2);border-top-color:var(--part)}
body.v2 .mega-part.part-connect{--part:var(--connect)}body.v2 .mega-part.part-workspace{--part:var(--workspace)}body.v2 .mega-part.part-secure{--part:var(--secure)}
body.v2 .mega-part strong{display:block;font-size:16px;font-weight:600}
body.v2 .mega-part small{display:block;margin-top:4px;font-size:12.5px;line-height:1.45;font-weight:400}
body.v2 .mega-areas{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0 12px;margin-top:8px}   /* the cards' gap, so the columns line up; five areas, three and two */
/* The Cybersecurity menu (10 November 2026): Secure as a card in the first of the parts' three columns, the family's pages beside it. */
body.v2 .mega-security{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
body.v2 .mega-security .mega-part{align-self:start}
body.v2 .mega-links{grid-column:2/-1;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2px 12px;align-content:start}
body.v2 .nav-main .mega-links a{display:block;min-height:0;padding:9px 16px 10px}
body.v2 .mega-links strong{display:block;font-size:14px;font-weight:500}
body.v2 .mega-links small{display:block;margin-top:2px;font-size:12.5px;line-height:1.45;font-weight:400}
body.v2 .nav-main .mega-links a:hover strong{text-decoration:underline;text-underline-offset:5px;text-decoration-color:var(--line)}
body.v2 .nav-main .mega-links a[aria-current] strong{text-decoration:underline;text-decoration-thickness:1.5px;text-underline-offset:7px}
body.v2 .nav-main .mega-areas a{display:block;min-height:0;padding:8px 0;font-size:14px;font-weight:500}
body.v2 .nav-main .mega-areas a:hover{text-decoration:underline;text-underline-offset:5px;text-decoration-color:var(--line)}
/* The current page (cowboy report 3.3): underlined in the bar, in the menu and in the phone menu, Services when the page is in its menu,
   and in the phone menu the group that holds it (its words, not the + beside them). */
body.v2 .nav-main>a[aria-current],body.v2 .services-dropdown>summary.is-current,body.v2 .nav-main .mega-title[aria-current],
body.v2 .nav-main .mega-all[aria-current],body.v2 .nav-main .mega-areas a[aria-current]{color:var(--tx);text-decoration:underline;text-decoration-thickness:1.5px;text-underline-offset:7px}
body.v2 .mobile-nav-links a[aria-current],body.v2 .mobile-services>summary.is-current>span{text-decoration:underline;text-decoration-thickness:1.5px;text-underline-offset:7px}
/* body sections */
body.v2 main section{padding-block:clamp(52px,8vh,96px);border-top:1px solid var(--line)}
body.v2 main section:first-child{border-top:0}
body.v2 h1{font-size:clamp(36px,4.4vw,60px);line-height:1.06;letter-spacing:-.035em;font-weight:600;margin:16px 0 0;text-transform:none}
body.v2 h2{font-size:clamp(27px,3.3vw,44px);line-height:1.12;letter-spacing:-.03em;font-weight:600;margin:14px 0 0;text-transform:none}
body.v2 em.a{font-style:normal;color:inherit}
body.v2 .meta{display:flex;flex-wrap:wrap;gap:4px 24px;justify-content:space-between;font-size:12px;color:var(--tx2);padding-block:16px;border-bottom:1px solid var(--line)}
body.v2 .hero{display:grid;grid-template-columns:1.35fr 1fr;gap:clamp(32px,6vw,88px);align-items:end;
 padding-block:clamp(64px,11vh,124px) clamp(56px,9vh,96px)}
body.v2 .hero p.intro{font-size:clamp(15px,1.35vw,18px);color:var(--tx2);margin:0 0 26px;max-width:46ch}
body.v2 .hero p.intro a{color:var(--tx);text-decoration:underline;text-underline-offset:3px}
body.v2 .btn{display:inline-flex;align-items:center;gap:10px;background:var(--action);color:var(--on-action);
 font-weight:600;font-size:14px;padding:15px 26px;text-decoration:none;border:0}
body.v2 .btn:hover{opacity:.88}


body.v2 .quote{display:grid;grid-template-columns:250px 1fr;gap:clamp(26px,5vw,70px)}
body.v2 blockquote{margin:0;font-size:clamp(20px,2.5vw,32px);line-height:1.32;letter-spacing:-.02em;font-weight:400}

body.v2 .two{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:38px}
body.v2 .card{background:var(--surface);border:1px solid var(--line);padding:clamp(22px,2.6vw,34px)}
body.v2 .card .num{font-size:11px;letter-spacing:.2em;color:var(--tx2);font-weight:500;margin:0}
body.v2 .card h3{font-size:clamp(18px,1.9vw,23px);font-weight:600;letter-spacing:-.015em;margin:12px 0}
body.v2 .card p{margin:0;color:var(--tx2);font-size:14px}
body.v2 .three{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:38px}

body.v2 .layer h3{font-size:19px;font-weight:600;margin:10px 0 14px}
body.v2 .layer ul{margin:0;padding:0;list-style:none}
body.v2 .layer li{font-size:13.5px;color:var(--tx2);padding:7px 0;border-top:1px solid var(--line)}
body.v2 .four{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(18px,2.4vw,34px);margin-top:38px}
body.v2 .pillar{border-top:2px solid var(--tx2);padding-top:16px}
body.v2 .pillar h3{font-size:16px;font-weight:600;margin:0 0 9px}
body.v2 .pillar p{margin:0;font-size:13.5px;color:var(--tx2)}
/* A two-line heading no longer pushes its body text down: the pillars share the heading and body row tracks of the .four grid. */
@supports (grid-template-rows:subgrid){@media(min-width:901px){body.v2 .four>.pillar{display:grid;grid-template-rows:subgrid;grid-row:span 2;row-gap:0}}}
body.v2 .marks{display:flex;align-items:center;gap:34px;flex-wrap:wrap;margin-top:26px}
body.v2 .marks img{max-height:44px;width:auto}
body.v2 .inline-link{color:var(--accent);font-size:13px;font-weight:500}
body.v2 .footer{background:var(--ground);border-top:1px solid var(--line)}
body.v2 .footer a,body.v2 .footer p,body.v2 .footer span{color:var(--tx2)}
body.v2 .footer a:hover{color:var(--tx)}
body.v2 .mode{border:1px solid var(--line);background:transparent;color:var(--tx2);font-family:inherit;width:40px;height:40px;padding:0;border-radius:50%;
 display:inline-flex;align-items:center;justify-content:center;cursor:pointer;margin-left:6px;transition:color .2s,border-color .2s,background .2s}
body.v2 .mode svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
body.v2 .mode:hover{color:var(--tx);border-color:var(--tx2)}
/* Appearance switch (13 October 2026): the round button opens a small menu with Light, Dark and Match device (build.py MODE_TOGGLE). */
body.v2 .mode-switch{position:relative;display:inline-flex}
body.v2 .mode-menu{position:absolute;top:calc(100% + 10px);right:0;z-index:70;display:grid;gap:2px;min-width:200px;padding:6px;
 background:var(--surface);border:1px solid var(--line);border-radius:12px;box-shadow:0 18px 40px rgba(0,0,0,.28)}
body.v2 .mode-menu[hidden]{display:none}
body.v2 .mode-option{display:flex;align-items:center;gap:10px;width:100%;min-height:40px;padding:8px 10px;border:0;border-radius:8px;background:transparent;
 color:var(--tx2);font:inherit;font-size:14px;line-height:1.3;text-align:left;cursor:pointer;transition:color .2s,background .2s}
body.v2 .mode-option:hover{color:var(--tx);background:var(--line)}
body.v2 .mode-option:focus-visible{outline:2px solid var(--tx);outline-offset:-2px;color:var(--tx)}
body.v2 .mode-option[aria-pressed=true]{color:var(--tx)}
body.v2 .mode-option svg{flex:none;width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
body.v2 .mode-option .mode-check{margin-left:auto;visibility:hidden}
body.v2 .mode-option[aria-pressed=true] .mode-check{visibility:visible}
body.v2 .mode-float{position:fixed;right:22px;bottom:22px;z-index:60}
body.v2 .mode-float .mode{width:46px;height:46px;margin:0;background:var(--glass);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);
 color:var(--tx);border-color:var(--line);box-shadow:0 10px 30px rgba(0,0,0,.22)}
body.v2 .mode-float .mode-menu{top:auto;bottom:calc(100% + 10px)}
body.v2 .mode-float[hidden]{display:none}
@media(prefers-reduced-transparency:reduce),(prefers-contrast:more){body.v2 .mode-float .mode{background:var(--surface);-webkit-backdrop-filter:none;backdrop-filter:none}}   /* after its glass, so it wins (PR 5 review) */
/* Draft pages (owner, 10 November 2026): a note fixed in the corner opposite the appearance switch, on every build that includes
   drafts, so a reader of preview does not take one for a finished page. Monochrome and inverted so it is seen; under the header
   and the open menu; it never takes a click. The footer that follows it ends with room for it, so the note covers none of
   the footer's last row (Privacy, Back to top) at the end of the page (review of PR 105). */
body.v2 .draft-note{position:fixed;left:22px;bottom:22px;z-index:48;display:flex;align-items:center;height:46px;margin:0;padding:0 18px;border-radius:23px;
 background:var(--tx);color:var(--ground);border:1px solid transparent;font-size:14px;font-weight:600;line-height:1;white-space:nowrap;pointer-events:none;box-shadow:0 10px 30px rgba(0,0,0,.22)}   /* the border is its edge in forced colours */
body.v2 .draft-note+.footer::after{content:"";display:block;height:56px}
@media print{body.v2 .mode-float,body.v2 .draft-note,body.v2 .draft-note+.footer::after{display:none}}
/* Site search (owner, 28 October 2026: in the top menu, in the menu's own style, as on apple.com). The magnifier stands in the bar
   in the links' colour, before Contact. Its panel is the services menu's panel: the same surface, edge, corners, shadow and
   opening, under the bar at its full width. A large field, a hairline, then a small caption over the quick links or the
   results; each row has the menu's arrow and fills on hover (refinement.py search_panel, site.js 'site search'). */
body.v2 .search-toggle{display:none;align-items:center;justify-content:center;flex:none;width:40px;height:40px;margin:0 -12px 0 -6px;padding:0;
 border:0;border-radius:50%;background:transparent;color:var(--tx2);font:inherit;cursor:pointer}
.js body.v2 .search-toggle{display:inline-flex}   /* html.js is set in <head>: no button without the script, and no shift when it runs */
body.v2 .search-toggle:hover,body.v2 .search-toggle[aria-expanded=true]{color:var(--tx)}
body.v2 .search-glass{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round}
body.v2 .search-panel{position:absolute;top:calc(100% + 10px);left:0;right:0;max-height:calc(100dvh - 104px);overflow:auto;overscroll-behavior:contain;
 padding:22px 26px 24px;background:var(--surface);color:var(--tx);border:1px solid var(--line);border-radius:12px;box-shadow:0 30px 60px rgba(0,0,0,.28);text-align:left}
body.v2 .search-panel[hidden]{display:none}
body.v2 .search-field{display:flex;align-items:center;gap:14px;padding-bottom:14px;border-bottom:1px solid var(--line)}
body.v2 .search-field:focus-within{border-bottom-color:var(--tx2)}   /* the field's focus mark, with the caret */
body.v2 .search-field .search-glass{flex:none;width:22px;height:22px;color:var(--tx2)}
body.v2 .search-input{flex:1;min-width:0;height:44px;margin:0;padding:0;border:0;border-radius:0;background:transparent;color:var(--tx);
 font:inherit;font-size:24px;font-weight:500;line-height:normal;letter-spacing:-.01em;-webkit-appearance:none;appearance:none}
body.v2 .search-input:focus,body.v2 .search-input:focus-visible{outline:0}
body.v2 .search-input::placeholder{color:var(--tx2);opacity:1}
body.v2 .search-input::-webkit-search-cancel-button,body.v2 .search-input::-webkit-search-decoration{-webkit-appearance:none;appearance:none}
body.v2 .search-clear{flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;border-radius:50%;
 background:var(--line);color:var(--tx2);cursor:pointer}
body.v2 .search-clear[hidden]{display:none}
body.v2 .search-clear:hover{color:var(--tx)}
body.v2 .search-clear:focus-visible{outline:2px solid var(--tx);outline-offset:2px}
body.v2 .search-clear svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}
body.v2 .search-body{max-width:780px;padding-top:14px}
body.v2 .search-message{margin:0 0 12px;font-size:15px;font-weight:500;line-height:1.45;color:var(--tx)}   /* «No results for …» over the quick links */
body.v2 .search-message[hidden]{display:none}
body.v2 .search-caption{margin:0 0 6px;font-size:12px;line-height:1.5;color:var(--tx2)}
body.v2 .search-results{display:grid;gap:2px;margin:0 -12px;padding:0;list-style:none}
body.v2 .search-results li{margin:0;padding:0}
body.v2 .search-link{display:flex;align-items:flex-start;gap:12px;padding:9px 12px;border-radius:8px;color:var(--tx);font-size:15px;font-weight:500;line-height:1.45;text-decoration:none}
body.v2 .search-link[aria-current]>span{text-decoration:underline;text-decoration-thickness:1.5px;text-underline-offset:5px}   /* the current page, as the menu marks it */
body.v2 .search-link:hover{background:var(--line)}
body.v2 .search-link:focus-visible{background:var(--line);outline:2px solid var(--tx);outline-offset:-2px}
body.v2 .search-link .icon{flex:none;width:16px;height:16px;margin-top:3px;color:var(--tx2);transition:transform .25s var(--ease)}   /* colours never transition (Appearance change, below) */
body.v2 .search-link:hover .icon,body.v2 .search-link:focus-visible .icon{color:var(--tx);transform:translateX(3px)}
body.v2 .search-link>span{min-width:0}
body.v2 .search-title{display:block}
body.v2 .search-where{color:var(--tx2);font-weight:400}
body.v2 .search-snippet{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;margin-top:2px;color:var(--tx2);font-size:13px;font-weight:400;line-height:1.55}
body.v2 .search-results mark{background:none;color:var(--tx);font-weight:600}
@media(forced-colors:active){
 body.v2 .search-results mark{color:CanvasText}   /* the system's mark colour on no background vanished on a dark contrast theme */
 body.v2 .search-field:focus-within{outline:2px solid transparent;outline-offset:4px}   /* a contrast theme draws it; the hairline's change is flattened */
}
@media(max-width:800px){
 body.v2 .search-panel{max-height:calc(100dvh - 92px);padding:14px 18px 18px}
 body.v2 .search-input{font-size:19px}   /* 16 px or more, so a phone does not zoom in on the field */
 body.v2 .search-field .search-glass{width:20px;height:20px}
}
@media(max-width:900px){body.v2 .hero{grid-template-columns:1fr;gap:34px;align-items:start}
 body.v2 .quote{grid-template-columns:1fr;gap:16px}
 body.v2 .two,body.v2 .three{grid-template-columns:1fr}
 body.v2 .four{grid-template-columns:1fr 1fr}}
@media(max-width:560px){body.v2 .four{grid-template-columns:1fr}}
/* Reset inherited rules from site.css that the converted page must not pick up. */
body.v2 .hero{min-height:0;height:auto;max-height:none;overflow:visible;background:transparent;
 isolation:auto;position:static;display:grid;text-align:left}
body.v2 .hero h1{text-shadow:none}
body.v2 .quote{min-height:0;height:auto;background:transparent;position:static}
body.v2 main section{position:static;overflow:visible;min-height:0;height:auto;background:transparent}
/* The shipped logo is a white monochrome raster, so it disappears on a light
   ground. Inverting a monochrome white mark yields the black variant exactly.
   Interim: the brand pack has proper SVGs (katrine-deling/Sort og hvitt/Logo
   Source) which should replace this raster and use currentColor. */
[data-mode=light] body.v2 .brand img{filter:invert(1)}

/* ---- Converted pages: shared furniture ------------------------------- */
body.v2 .content-width{max-width:1220px;margin:0 auto;padding-inline:var(--gutter)}

body.v2 h3{font-weight:600;letter-spacing:-.015em}
body.v2 .button{display:inline-flex;align-items:center;gap:10px;background:transparent;color:var(--tx);
 border:1px solid var(--line);font-weight:500;font-size:14px;padding:14px 24px;min-width:0}
body.v2 .button:hover{border-color:var(--tx2)}
body.v2 .button.solid{background:var(--action);color:var(--on-action);border-color:var(--action)}
body.v2 .button.solid:hover{opacity:.88}
body.v2 .inline-link{color:var(--accent);font-size:13px;font-weight:500}

/* Subheroes become typographic. No text over photographs anywhere. */







/* The subhero is static in .v2, so the legacy absolute breadcrumb lost its anchor and floated into the next section. */


/* Panels and groups */











body.v2 .faq{border-top:1px solid var(--line)}
body.v2 .faq summary{font-weight:500;padding-block:18px}
body.v2 .faq p{color:var(--tx2);font-size:14px}


/* Contact */
body.v2 .contact{background:transparent;text-align:left}
body.v2 .contact::before{display:none}
body.v2 .contact h1,body.v2 .contact h2{text-transform:none;letter-spacing:-.03em}

body.v2 .contact p{color:var(--tx2)}
body.v2 .contact-form{background:var(--surface);border:1px solid var(--line)}
body.v2 .field input,body.v2 .field select,body.v2 .field textarea{background:var(--ground);
 color:var(--tx);border:1px solid var(--line);font-family:inherit}
body.v2 .field label{color:var(--tx2);font-size:13px}
/* A field the page or the server found wrong (Q-B05, site.js mark()) stays visibly marked after focus leaves it. */
body.v2 .field [aria-invalid="true"]{border-color:var(--error);box-shadow:0 0 0 1px var(--error)}
@media(forced-colors:active){body.v2 .field [aria-invalid="true"]:not(:focus){outline:2px dashed CanvasText;outline-offset:2px}}

/* Footer */
body.v2 .footer-bottom,body.v2 .footer-meta,body.v2 .footer-meta a{color:var(--tx2);font-size:12px}
body.v2 .footer-bottom{border-top:1px solid var(--line)}   /* site.css draws it in translucent white, invisible in light mode */



/* ---- P0: mobile navigation must obey the theme -----------------------
   site.css hardcodes a near-black overlay and white icon strokes. In light
   mode that produced dark text on a dark overlay (~1.01:1) and an invisible
   menu button. Everything below is tokenised. */
/* The root carries the ground and the colour scheme: only the root's reaches the canvas, scrollbars and first paint. HEAD_APPEARANCE (build.py)
   paints the same two values before this file has loaded, so they must equal --ground above (checked in qa/check_r8_static.py). */
html{background:var(--ground);color-scheme:dark}
[data-mode=light]{color-scheme:light}
body.v2 .menu-toggle span{background:var(--tx)}
body.v2 .mobile-nav{background:var(--ground);color:var(--tx)}

body.v2 .mobile-nav a,body.v2 .mobile-nav-links a{color:var(--tx)}
body.v2 .mobile-nav small,body.v2 .mobile-nav-bottom a,body.v2 .mobile-nav .slogan{color:var(--tx2)}



body.v2 .mobile-services summary{color:var(--tx)}
body.v2 .mobile-fallback summary{color:var(--tx2)}
body.v2 :focus-visible{outline:2px solid var(--accent);outline-offset:3px}

/* The appearance control belongs in the header at every width, not inside a
   menu the visitor must first find. */
@media(max-width:800px){body.v2 .site-header .mode{width:40px;height:40px;margin-right:2px}}
body.v2 .h1-sub{display:block;font-size:.42em;line-height:1.2;font-weight:400;color:var(--tx2);
 letter-spacing:-.02em;margin-top:.42em}
body.v2 .hero-actions{display:flex;align-items:center;justify-content:flex-start;gap:26px;flex-wrap:wrap}   /* site.css centres .hero-actions for the old homepage hero; text-aligned heroes read left (8 October 2026) */
@media(max-width:650px){body.v2 .hero:not(.media-hero) .hero-actions{align-items:flex-start}}   /* site.css stacks them in a column and centres each item */
body.v2 figure{margin:0}



body.v2 #compliance .layer li{padding:12px 0;font-size:14px}
body.v2 #compliance .layer li strong{color:var(--tx);font-weight:600}
/* Review: badges rendered at 44px made their wording unreadable. */
body.v2 .marks{gap:clamp(26px,3.4vw,46px);margin-top:30px;align-items:center}
body.v2 .marks img{max-height:64px;max-width:190px;object-fit:contain}
@media(max-width:800px){body.v2 .marks{gap:24px}body.v2 .marks img{max-height:50px}}

/* ---- Bundle pages (Connect, Workspace, Secure) and the four-family block --
   Brochure patterns: labelled sections, hairline cards, technology chips,
   before/after scenario blocks. New body copy is 15px weight 400. */
body.v2 .lede{color:var(--tx2);font-size:clamp(15px,1.25vw,17px);font-weight:400;max-width:58ch;margin:20px 0 0}
body.v2 .after-grid{margin-top:32px}
body.v2 .after-grid a:not(.inline-link){color:var(--tx);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:3px}   /* a link inside the sentence shows itself (Claude Code Review on PR 94) */
body.v2 .after-grid a:not(.inline-link):hover{text-decoration-thickness:2px}
body.v2 .meta a{color:var(--tx2)}
body.v2 .meta a:hover{color:var(--tx)}
body.v2 .chips{display:flex;flex-wrap:wrap;gap:9px;margin:30px 0 0;padding:0;list-style:none}

body.v2 .callout{background:var(--surface);border:1px solid var(--line);border-left:2px solid var(--tx2);padding:clamp(20px,2.4vw,30px)}
body.v2 .callout h3{color:var(--tx);font-size:16px;margin:0 0 9px}
body.v2 .callout p{margin:0;font-size:15px;font-weight:400;color:var(--tx2)}
body.v2 h2+.callout,body.v2 .lede+.callout{margin-top:clamp(24px,3vw,36px)}   /* a callout straight under a section heading sat flush against it (7 October 2026) */
body.v2 .scenarios{display:grid;gap:20px;margin-top:38px}
body.v2 .scenario{display:grid;grid-template-columns:1fr 1fr;border:1px solid var(--line);background:var(--surface)}
body.v2 .scenario>h3{grid-column:1/-1;font-size:clamp(19px,2vw,24px);margin:0;padding:clamp(20px,2.4vw,30px) clamp(20px,2.4vw,30px) 0}
body.v2 .scenario>div{padding:clamp(20px,2.4vw,30px);min-width:0}
body.v2 .scenario .label{margin-bottom:12px}
body.v2 .scenario p{margin:0;font-size:15px;font-weight:400;color:var(--tx2)}
body.v2 .scenario .after{border-left:2px solid var(--tx)}
body.v2 .scenario .after .label,body.v2 .scenario .after p{color:var(--tx)}
body.v2 .scenario .after .label{color:var(--tx)}
body.v2 .bundle-strip .layer{display:block;background:var(--surface);border:1px solid var(--line);padding:clamp(20px,2.4vw,30px);color:var(--tx);text-decoration:none}
body.v2 .bundle-strip .layer:hover{border-color:var(--tx2)}
body.v2 .bundle-strip .layer.is-current{border-color:var(--layer,var(--tx2))}
body.v2 .bundle-strip .layer>p:not(.tag){margin:0;font-size:14px;font-weight:400;color:var(--tx2)}
body.v2 .bundle-strip .inline-link{display:inline-flex;align-items:center;gap:8px;margin-top:16px}
body.v2 .card p,body.v2 .pillar p{font-size:15px;font-weight:400}
body.v2 .hero .marks{margin-top:34px}




body.v2 .family-rows{list-style:none;margin:18px 0 0;padding:0}
body.v2 .family-rows li{border-top:1px solid var(--line)}
body.v2 .family-rows a{display:block;padding:10px 0;font-size:15px;font-weight:400;color:var(--tx);text-decoration:none}
body.v2 .family-rows a:hover{color:var(--accent)}
body.v2 .family-rows small{display:block;font-size:12.5px;color:var(--tx2)}

@media(max-width:900px){
 body.v2 .scenario{grid-template-columns:1fr}
 body.v2 .scenario .after{border-left:0;border-top:2px solid var(--tx)}
 body.v2 .bundle-strip{grid-template-columns:1fr}
}

/* ---- Edition 09: every page in the brochure system ---------------------- */
body.v2 .card .inline-link{display:inline-flex;align-items:center;gap:8px;margin-top:14px}
body.v2 .card p a{color:var(--accent)}
body.v2 .split{display:grid;grid-template-columns:1.1fr 1fr;gap:clamp(26px,5vw,64px);align-items:center;margin-top:38px}

body.v2 .split h2{font-size:clamp(22px,2.4vw,32px)}
body.v2 .split p:not(.label){color:var(--tx2);font-size:15px;font-weight:400;max-width:52ch;margin:16px 0 0}
body.v2 .split .inline-link{display:inline-flex;align-items:center;gap:8px;margin-top:20px}
body.v2 .split .marks{margin-top:28px}
body.v2 .split-photo img{width:100%;height:auto;display:block;aspect-ratio:3/2;object-fit:cover;object-position:var(--pos,50% 50%);border:1px solid var(--line)}
body.v2 .steps{list-style:none;margin:38px 0 0;padding:0;display:grid;grid-template-columns:repeat(3,1fr);gap:20px}
body.v2 .steps li{border-top:2px solid var(--tx2);padding-top:16px;scroll-margin-top:96px}
body.v2 .steps .num{font-size:11px;letter-spacing:.2em;color:var(--tx2);font-weight:500}
body.v2 .steps h3{font-size:19px;margin:10px 0 8px}
body.v2 .steps p{margin:0;font-size:15px;font-weight:400;color:var(--tx2)}
@media(min-width:901px){body.v2 .steps:has(>li:nth-child(4):last-child){grid-template-columns:repeat(2,1fr)}}   /* four steps: 2 x 2, not 3 + 1 */
body.v2 .faqs{margin-top:30px;border-top:1px solid var(--line)}
body.v2 .faq-item{border-bottom:1px solid var(--line)}
body.v2 .faq-item summary{display:flex;justify-content:space-between;gap:20px;padding:18px 0;font-weight:500;font-size:16px;cursor:pointer;list-style:none}
body.v2 .faq-item summary::-webkit-details-marker{display:none}
body.v2 .faq-item summary span{color:var(--tx2)}
body.v2 .faq-item[open] summary span{transform:rotate(45deg)}
body.v2 .faq-item p{margin:0 0 20px;font-size:15px;font-weight:400;color:var(--tx2);max-width:64ch}
body.v2 .more-links{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:30px}
body.v2 .more-card{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;color:var(--tx);text-decoration:none}
body.v2 .more-card:hover{border-color:var(--tx2)}
body.v2 .more-card strong{display:block;font-weight:600}
body.v2 .more-card small{display:block;color:var(--tx2);font-size:13px;text-wrap:balance}
body.v2 .more-card>span,body.v2 .ai-flow small{text-wrap:pretty}
body.v2 .more-card .icon{flex-shrink:0;align-self:center;color:var(--tx)}
@media(min-width:901px){body.v2 .more-links:has(>.more-card:nth-child(4):last-child){grid-template-columns:repeat(2,1fr)}}   /* four cards: 2 x 2, not 3 + 1 */
body.v2 .section-anchors{display:flex;flex-wrap:wrap;gap:9px;margin-top:-20px;padding-bottom:30px}
body.v2 .section-anchors a{font-size:12px;color:var(--tx2);border:1px solid var(--line);padding:7px 13px;background:var(--surface)}
body.v2 .section-anchors a:hover{color:var(--tx);border-color:var(--tx2)}
body.v2 .family-grid{align-items:start}
body.v2 .family-block{background:var(--surface);border:1px solid var(--line);padding:clamp(22px,2.6vw,34px);scroll-margin-top:96px}
body.v2 .family-block h2{font-size:clamp(20px,2vw,26px);line-height:inherit;letter-spacing:-.015em;margin:12px 0}
body.v2 .family-block>div>p:not(.label){color:var(--tx2);font-size:15px;font-weight:400;margin:0}
body.v2 .contact-grid{display:grid;grid-template-columns:.9fr 1.1fr;gap:clamp(26px,4vw,56px);align-items:start;margin-top:38px}
body.v2 .channels{display:grid;gap:20px}
body.v2 .channel a{color:var(--tx);font-size:18px;font-weight:500;text-decoration:none;display:inline-block;margin-top:10px}
body.v2 .channel a:hover{color:var(--accent)}
body.v2 .card.channel p a{font-size:inherit;font-weight:inherit;margin-top:0;text-decoration:underline;text-underline-offset:4px}   /* .card .inline-link would otherwise keep its 14px margin */
body.v2 .channel p{margin:8px 0 0}
body.v2 .contact-form{padding:clamp(22px,2.6vw,34px);color:var(--tx)}
body.v2 .contact-form h2{font-size:clamp(22px,2.2vw,30px);margin:0}
body.v2 .contact-form>p{color:var(--tx2);font-size:15px;font-weight:400;margin:12px 0 0}
body.v2 .contact-form fieldset{border:0;padding:0;margin:0;min-width:0}
body.v2 .form-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:26px}
body.v2 .field.full{grid-column:1/-1}
body.v2 .field label{display:block;margin-bottom:8px;font-size:13px;color:var(--tx2);font-weight:500}
body.v2 .field label span{font-weight:400;color:inherit}   /* «(optional)»: site.css's old #666 gave 3.1:1 on the dark card (axe, 9 October 2026) */
body.v2 .field input,body.v2 .field select,body.v2 .field textarea{width:100%;min-height:48px;padding:12px;font-size:15px;box-shadow:none}
body.v2 .form-actions{display:flex;gap:16px;flex-wrap:wrap;align-items:center;margin-top:24px}
body.v2 .form-actions .btn{font-family:inherit;cursor:pointer}
body.v2 .copy-button{background:transparent;border:1px solid var(--line);color:var(--tx);font-family:inherit;font-size:14px;font-weight:500;padding:14px 24px;cursor:pointer}
body.v2 .copy-button:hover{border-color:var(--tx2)}
body.v2 .form-note,body.v2 .form-status{font-size:13px;color:var(--tx2);margin:16px 0 0}
body.v2 .copy-fallback{width:100%;min-height:140px;margin-top:12px}
body.v2 .prose h2{font-size:clamp(20px,2vw,26px);margin-top:36px}
body.v2 .prose p{color:var(--tx2);font-size:15px;font-weight:400;max-width:66ch;margin:14px 0 0}
body.v2 .prose a{color:var(--accent)}
/* Links inside running text are underlined, like .hero p.intro a: colour alone told them apart from the grey text at under 3:1 (axe link-in-text-block, WCAG 1.4.1, 9 October 2026). */
body.v2 .prose a,body.v2 .form-note a{text-decoration:underline;text-underline-offset:3px}
body.v2 .scenarios .scenario .label{margin-bottom:12px}
/* The AI flow, carried over from the earlier edition, tokenised. */
body.v2 .ai-flow{align-items:stretch}
body.v2 .ai-flow>i{align-self:center}
body.v2 .ai-flow>div{background:var(--surface);border:1px solid var(--line);color:var(--tx)}
body.v2 .ai-flow span{color:var(--tx2);font-size:11px;letter-spacing:.2em}
body.v2 .ai-flow strong{color:var(--tx)}
body.v2 .ai-flow small{color:var(--tx2)}
body.v2 .ai-flow i{color:var(--tx2)}
@media(max-width:900px){
 body.v2 .split,body.v2 .steps,body.v2 .more-links,body.v2 .contact-grid,body.v2 .form-grid{grid-template-columns:1fr}
 body.v2 .section-anchors{margin-top:0}
}
body.v2 .field.hp{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}
body.v2 .cf-turnstile{margin-top:20px}
/* A long word can exceed a phone width at display sizes; break only when a word cannot fit. */
body.v2 h1,body.v2 h2,body.v2 h3{overflow-wrap:break-word}

/* ---- Colour code (owner decision, 11 September 2026) --------------------------
   The three brand accents belong to the three bundles and nothing else:
   cyan = Connect, orange = Workspace, green = Secure. Everything else on the site
   is monochrome: white on the dark ground, blue-black on the light one. */
body.v2.bundle-connect{--layer:var(--connect)}
body.v2.bundle-workspace{--layer:var(--workspace)}
body.v2.bundle-secure{--layer:var(--secure)}
body.v2.bundle-page .hero .label,body.v2.bundle-page em.a,body.v2.bundle-page .card .num,body.v2.bundle-page .scenario .after .label{color:var(--layer)}

body.v2.bundle-page .pillar,body.v2.bundle-page .scenario .after{border-color:var(--layer)}
body.v2 .bundle-strip .layer-connect{--layer:var(--connect)}
body.v2 .bundle-strip .layer-workspace{--layer:var(--workspace)}
body.v2 .bundle-strip .layer-secure{--layer:var(--secure)}
body.v2 .bundle-strip .layer{border-top:2px solid var(--layer)}




   /* the bundle names in a sentence (Services, Ways to work): same rule as above */

/* Six service families: three columns on desktop, two on tablet, one on phones. */
body.v2 .family-grid{grid-template-columns:repeat(3,1fr)}
@media(max-width:1000px){body.v2 .family-grid{grid-template-columns:1fr 1fr}}
@media(max-width:640px){body.v2 .family-grid{grid-template-columns:1fr}}


/* ---- Quieter controls (owner feedback, 14 September 2026) ----------------------
   Buttons, navigation and inline links in sentence case, 14px, weight 500, 3px radius.
   Labels keep the small caps. */
body.v2 .btn,body.v2 .button{font-size:14px;font-weight:500;letter-spacing:0;text-transform:none;border-radius:3px;padding:13px 22px;min-height:48px;line-height:1.2}
body.v2 .btn .icon,body.v2 .button .icon{width:16px;height:16px}
body.v2 .inline-link{font-size:14px;font-weight:500;letter-spacing:0;text-transform:none;gap:10px;min-height:40px;padding-block:6px;line-height:1.3}
body.v2 .inline-link .icon{width:16px;height:16px}
body.v2 .inline-link:hover{text-decoration:underline;text-underline-offset:5px}
body.v2 .nav-main a,body.v2 .services-dropdown summary{font-size:14px;font-weight:500;letter-spacing:0;text-transform:none}
body.v2 .header-contact{font-size:14px;font-weight:500;letter-spacing:0;text-transform:none;border-radius:3px;padding:10px 16px;min-height:40px}
body.v2 .header-contact .icon{width:14px;height:14px}
body.v2 .mobile-nav-links a,body.v2 .mobile-nav-links>a{font-size:clamp(24px,6vw,34px);font-weight:500;text-transform:none;letter-spacing:-.02em}
/* The mobile menu mirrors option A (28 October 2026): the two groups read at the size of the other items, with no rules between. */
body.v2 .mobile-services{border-bottom:0}
body.v2 .mobile-services>summary{font-size:clamp(24px,6vw,34px);font-weight:500;text-transform:none;letter-spacing:-.02em;line-height:1.3;padding:12px 0}
body.v2 .mobile-services>summary::after{font-weight:400;color:var(--tx2)}
body.v2 .mobile-services>div{padding:0 0 10px 2px}
body.v2 .mobile-nav-links>a{padding:12px 0;margin-bottom:0}   /* the same step as the two groups (PR 5 review) */


/* ---- Homepage (14 September 2026): the two landing-page tracks merged ------------
   Owner-supplied hero media in a split hero, six families in a calm grid, the customer and
   partner strip, the day/night bridge band, the drawing of the three parts, the editorial closing.
   site.css still carries the geometry of the R8 components used here; these rules undo the
   body.v2 resets for them and put their colours on the theme tokens. */
body.v2 .hero.media-hero{position:relative;display:block;min-height:560px;height:84svh;max-height:900px;overflow:hidden;isolation:isolate;
 background:#11181e;color:#fff;padding:0;text-align:center;grid-template-columns:none}
body.v2 .hero-stage{display:contents}
body.v2 .hero-media{position:absolute;inset:0;z-index:-3;background:#26333a;overflow:hidden}
body.v2 .hero-poster{position:absolute;inset:0;width:100%;height:100%;max-width:none;object-fit:cover;object-position:44% 50%;border:0}
/* Hero motion (owner, 9 October 2026): the still drifts slowly sideways instead of the 12 s video loop. Lateral only, 30 s
   period (design-direction: no zoom or vertical sway); the fixed 1.05 scale gives the drift room. site.js sets is-moving
   (not under reduced motion) and is-paused (the hero button, off screen, background tab). will-change (26 October 2026)
   gives each still its own compositor layer before the drift starts and while it is paused, so pausing and resuming never
   re-rasterise it (see build.py, hero_poster). */
@keyframes hero-drift{from{transform:scale(1.05) translateX(-1.5%)}to{transform:scale(1.05) translateX(1.5%)}}
body.v2 .hero-media .hero-poster{transform:scale(1.05)}
body.v2 .hero.is-moving .hero-poster{animation:hero-drift 15s ease-in-out infinite alternate;will-change:transform;backface-visibility:hidden}
/* Firefox shimmer (A10, 27 October 2026): on a DPR-1 screen 1920 px or wider Firefox swapped two renderings of different sharpness
   several times a second while the drift ran, because it downscaled the 960 px file into the ~640 px frame (Gecko's
   downscale-during-decode). The fix is the file: srcset now offers 640/800/1280 px, no larger than the drawn picture (build.py
   hero_set). backface-visibility keeps the still on its own layer (owner's step 3; measured, it changes nothing on its own), and
   on screens wider than 2560 px the still holds still, as under reduced motion (site.js does the same and hides the button). */
@media(min-width:2561px){body.v2 .hero.is-moving .hero-poster{animation:none}}
body.v2 .hero.is-moving.is-paused .hero-poster{animation-play-state:paused}
body.v2 .media-hero .hero-shade{position:absolute;inset:0;z-index:-1;background:linear-gradient(180deg,#000a 0%,#0006 28%,#0007 52%,#0005 74%,#000c 100%),radial-gradient(ellipse at 50% 48%,#0008,transparent 68%)}
body.v2 .media-hero .hero-content{position:relative;z-index:2;width:min(1040px,calc(100% - var(--gutter)*2));margin:auto;padding:clamp(110px,16vh,170px) 0 110px}
body.v2 .media-hero .label{color:#e6e6e6;margin-bottom:20px}
body.v2 .media-hero h1{color:#fff;font-size:clamp(38px,5vw,68px);font-weight:600;line-height:1.06;letter-spacing:-.035em;text-transform:none;text-wrap:balance;margin:0 auto;max-width:16ch;text-shadow:0 2px 24px #0006}
body.v2 .media-hero .hero-intro{color:#f1f1f1;font-size:clamp(16px,1.25vw,19px);line-height:1.6;max-width:560px;margin:22px auto 0;text-shadow:0 1px 12px #0007}
body.v2 .media-hero .hero-actions{justify-content:center;margin-top:30px;gap:14px}
body.v2 .media-hero .btn{background:#fff;color:#060610}
body.v2 .media-hero .btn:hover{background:#e6e6e6;opacity:1}



body.v2 .media-hero .hero-toolbar{position:absolute;left:auto;right:var(--gutter);bottom:24px;top:auto;z-index:3;display:flex;justify-content:flex-end}
body.v2 .media-hero #hero-motion{width:40px;height:40px;min-width:40px;color:#fff;border:1px solid #ffffff55;background:#0003;opacity:.8;cursor:pointer;border-radius:3px}
body.v2 .media-hero #hero-motion:hover,body.v2 .media-hero #hero-motion:focus-visible{opacity:1}
@media(min-width:1100px){
 body.v2 .hero.media-hero{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.15fr);align-items:center;gap:clamp(40px,5vw,96px);overflow:visible;
  height:auto;min-height:0;max-height:none;padding:calc(88px + clamp(48px,7vh,104px)) max(var(--gutter),calc((100% - 1240px)/2)) clamp(56px,7vh,96px);background:var(--ground);color:var(--tx);text-align:left}   /* inside the header's 1240 px frame on wide screens (owner, 9 October 2026) */
 body.v2 .media-hero .hero-content{order:1;grid-area:1/1;margin:0;padding:0;width:auto;max-width:560px;justify-self:start;text-align:left}
 body.v2 .media-hero h1{margin-inline:0}
 body.v2 .media-hero .hero-intro{margin-inline:0}
 body.v2 .media-hero .label{color:var(--tx2)}
 body.v2 .media-hero h1{color:var(--tx);font-size:clamp(38px,3.4vw,58px);margin:0;text-shadow:none}
 body.v2 .media-hero .hero-intro{color:var(--tx2);margin:20px 0 0;max-width:520px;text-shadow:none}
 body.v2 .media-hero .hero-actions{justify-content:flex-start;margin-top:28px}
 body.v2 .media-hero .btn{background:var(--action);color:var(--on-action)}
 body.v2 .media-hero .btn:hover{opacity:.88;background:var(--action)}


 body.v2 .hero-stage{display:block;position:relative;order:2;grid-area:1/2;width:100%;max-width:960px;justify-self:end}
 body.v2 .hero-media{position:relative;inset:auto;z-index:0;aspect-ratio:16/9;width:100%;height:auto;border-radius:6px;overflow:hidden;box-shadow:0 30px 80px #0006}
 body.v2 .hero-poster{object-position:50% 50%}
 body.v2 .media-hero .hero-shade{display:none}
 body.v2 .media-hero .hero-toolbar{position:absolute;left:auto;right:14px;bottom:14px}}
@media(max-width:650px){body.v2 .hero.media-hero{height:100svh;min-height:600px;max-height:860px}
 body.v2 .media-hero .hero-content{padding:90px 0 110px}
 body.v2 .media-hero h1{font-size:clamp(31px,8.6vw,44px);line-height:1.12}
 body.v2 .media-hero .hero-intro{font-size:15px}
 body.v2 .hero-poster{object-position:40% 50%}}
/* A portrait phone (build.py HERO_PHONE) shows the hero as a framed 4:5 picture with the copy below it, like the framed desktop
   hero, so the office and the harbour are both in view (owner, 27 October 2026: «4:5-utsnitt på telefon … ikke et beskåret
   bredformat»). The <picture> serves the 4:5 crop (render_assets.cjs CROPS); the <noscript> still keeps the 40 % framing. */
@media(max-width:650px) and (max-aspect-ratio:3/4){
 body.v2 .hero.media-hero{display:flex;flex-direction:column;height:auto;min-height:0;max-height:none;padding:88px 0 0;background:var(--ground);color:var(--tx);text-align:left}
 body.v2 .hero-stage{display:block;position:relative;width:calc(100% - var(--gutter)*2);margin:0 auto}
 body.v2 .hero-media{position:relative;inset:auto;z-index:0;aspect-ratio:4/5;width:100%;height:auto;border-radius:6px;overflow:hidden}
 body.v2 picture>.hero-poster{object-position:50% 50%}
 body.v2 .media-hero .hero-shade{display:none}
 body.v2 .media-hero .hero-toolbar{position:absolute;left:auto;right:12px;bottom:12px}
 body.v2 .media-hero .hero-content{width:calc(100% - var(--gutter)*2);margin:0 auto;padding:28px 0 56px}
 body.v2 .media-hero .label{color:var(--tx2)}
 body.v2 .media-hero h1{color:var(--tx);margin:0;text-shadow:none}
 body.v2 .media-hero .hero-intro{color:var(--tx2);margin:16px 0 0;text-shadow:none}
 body.v2 .media-hero .hero-actions{justify-content:flex-start;margin-top:24px}
 body.v2 .media-hero .btn{background:var(--action);color:var(--on-action)}
}
@media(prefers-reduced-motion:reduce){body.v2 .hero.is-moving .hero-poster{animation:none}}

/* Customer and partner strip: white in both modes so the colour logos read. */
body.v2 .customer-strip{display:block;background:#fff;color:#161616;border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:38px var(--gutter) 40px;min-height:0}
body.v2 .customer-strip .content-width{width:auto;max-width:none;margin:0;padding-inline:0}   /* the strip's own gutter is enough; .content-width added a second and third one */
body.v2 .customer-label{max-width:none;margin:0 0 22px;font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:#4a4a4a;font-weight:500;flex:none}
body.v2 .customer-strip .customer-logo{width:auto;height:auto;min-width:0;padding:0;display:flex;align-items:center}
body.v2 .customer-strip .customer-logo img{width:auto;height:auto;max-height:56px;max-width:200px;object-fit:contain}
body.v2 .customer-strip .customer-logo.midtfjellet img{max-height:64px}
body.v2 .customer-strip .customer-logo.bergenpersonal img{max-height:82px}
body.v2 .customer-strip .customer-logo.osmaskinering img{max-height:42px}
body.v2 .customer-strip .customer-logo.engevik img{max-height:50px}
body.v2 .customer-strip .customer-logo.allmaritim img{max-height:60px}
body.v2 .customer-strip .customer-logo.gb img{max-height:54px}
body.v2 .customer-strip .customer-logo.oma img{max-height:44px}
body.v2 .customer-strip .customer-logo.engelsen img{height:52px}   /* the file has a viewBox and no size of its own, so with height:auto it is drawn 0 px wide: a set height gives it one */
body.v2 .partner-row{margin-top:34px;padding-top:28px;border-top:1px solid #e3e3e3;text-align:center}
body.v2 .partner-row .customer-label{margin-bottom:8px;text-align:center}
body.v2 .mark-chip{display:inline-flex;align-items:center;justify-content:center;padding:10px 14px;border-radius:8px;line-height:0}
body.v2 .mark-chip.dark{background:#111}
body.v2 .mark-chip.award{background:#e8f6ee;padding:0;overflow:hidden}
body.v2 .marks{display:flex;align-items:center;gap:clamp(14px,2vw,24px);flex-wrap:wrap;margin-top:26px}
body.v2 .marks img,body.v2 .hero .marks img,body.v2 .split .marks img{max-height:56px;max-width:180px;width:auto;height:auto;object-fit:contain}
body.v2 .mark-chip.award img{max-height:72px;max-width:72px}
/* Check Point's specialisation badges (26 October 2026) are a ring with dark lettering on a transparent ground: a white disc behind them, like the Advanced Partner badge. */

/* Four badges (managed-it): one row from 1140px, where the copy column is 460px or wider (the row needs 440px), and an even 2 x 2 grid below it, not 3 + 1 (8 October 2026). */
body.v2 .hero .marks-4{gap:10px 12px}
body.v2 .hero .marks-4 img{max-height:48px}
body.v2 .hero .marks-4 .mark-chip{padding:6px 9px}
@media(max-width:1139px){body.v2 .hero .marks-4{display:grid;grid-template-columns:repeat(2,max-content)}}
body.v2 .people-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;background:var(--line);list-style:none;margin:36px 0 0;padding:0}
body.v2 .people-grid .person{background:var(--ground);margin:0;padding:28px 26px 32px;min-height:148px}
body.v2 .person-photo{display:block;width:96px;height:96px;border-radius:50%;object-fit:cover;margin:0 0 18px;border:1px solid var(--line)}
body.v2 .person-name{margin:0;font-size:18px;font-weight:600;letter-spacing:-.02em;line-height:1.3}
body.v2 .person-role{margin:8px 0 0;color:var(--tx2);font-size:15px;line-height:1.5}

body.v2 .person a{display:inline-block;margin-top:14px;color:var(--tx);font-size:14px;font-weight:500}
body.v2 .person-note{margin:10px 0 0;color:var(--tx2);font-size:14px;line-height:1.6}   /* the owner's line per person (editorial.py, TEAM), empty for now */
body.v2 img.badge-disc{background:#fff;border-radius:50%}   /* Check Point's specialisation badges, off every page for now (build.py) */
@media(max-width:900px){body.v2 .people-grid{grid-template-columns:1fr 1fr}}
@media(max-width:560px){body.v2 .people-grid{grid-template-columns:1fr}}
@media(max-width:650px){body.v2 .customer-strip .customer-logo img{max-height:48px}
 body.v2 .customer-strip .customer-logo.bergenpersonal img{max-height:70px}}

/* Day/night bridge band. The image is swapped by the appearance script, never crossfaded. */
body.v2 .anchor-band{position:relative;isolation:isolate;overflow:hidden;height:60svh;min-height:420px;max-height:720px;display:flex;align-items:center;justify-content:center;text-align:center;padding:80px var(--gutter);background:#171717;color:#fff}
body.v2 .anchor-band .theme-image{position:absolute;inset:0;width:100%;height:100%;max-width:none;object-fit:cover;object-position:50% 50%;z-index:-2;border:0}
body.v2 .anchor-band::before{content:'';position:absolute;inset:0;z-index:-1;background:linear-gradient(180deg,#0006,#0003 40%,#0007)}
[data-mode=light] body.v2 .anchor-band::before{background:rgba(0,0,0,.6)}   /* flat: the light day photo needs 4.5:1 under the #ececec paragraph at every point */
body.v2 .anchor-copy{position:relative;z-index:1;min-width:0}   /* a grid item: without it the industry cards set its width and overflowed on phones (PR 5 review) */
body.v2 .anchor-band h2{color:#fff;font-size:clamp(28px,3.1vw,50px);font-weight:500;line-height:1.15;letter-spacing:-.03em;max-width:900px;margin:auto;text-wrap:balance;text-shadow:0 2px 20px #0008;text-transform:none}
@media(max-width:650px){body.v2 .anchor-band{height:auto;min-height:0;padding:72px var(--gutter)}}

/* The front page's «How Connect, Workspace and Secure fit together», on the theme tokens. */
body.v2 .connections{position:relative;background:var(--ground);color:var(--tx);border-top:1px solid var(--line);padding:clamp(56px,6vw,84px) var(--gutter) clamp(52px,5.4vw,76px)}
body.v2 .connections h2{font-size:clamp(28px,3.1vw,44px);font-weight:600;letter-spacing:-.03em;line-height:1.1;text-transform:none}

/* One business, three layers (owner, 11 November 2026, on trial; docs/DESIGN-BRIEF-diagram.md). A drawing of a business
   (layers_scene.py) with Connect, Workspace and Secure as layers in their own colours, and beside it the three parts as rows
   that open one at a time. With no row open all three layers show, a little fainter; an open row shows its layer at full
   strength and the other two step back. :has() does that without the script, and [data-open] is site.js's for browsers
   without :has(). Only opacity changes, and under reduced motion it changes at once. */
body.v2 .layers{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(0,1fr);gap:clamp(28px,4.4vw,64px);align-items:start;max-width:1320px;margin:clamp(22px,2.6vw,36px) auto 0}
body.v2 .layers-figure{position:relative;margin:0}
body.v2 .layers-art{display:block;width:100%;height:auto}
body.v2 .layers-art .lay-connect,body.v2 .layer-row.part-connect{--part:var(--connect)}
body.v2 .layers-art .lay-workspace,body.v2 .layer-row.part-workspace{--part:var(--workspace)}
body.v2 .layers-art .lay-secure,body.v2 .layer-row.part-secure{--part:var(--secure)}
body.v2 .layers-art .lay{stroke:var(--part);stroke-width:1.75;opacity:.8;transition:opacity .25s var(--ease)}
body.v2 .layers-art .lay .mask{fill:var(--ground)}
body.v2 .layers-art .lay .dot{fill:var(--part);stroke:none}
body.v2 .layers[data-open] .lay{opacity:.24}
body.v2 .layers[data-open=connect] .lay-connect,body.v2 .layers[data-open=workspace] .lay-workspace,body.v2 .layers[data-open=secure] .lay-secure{opacity:1}
body.v2 .layers:has(.layer-row[open]) .lay{opacity:.24}
body.v2 .layers:has(.part-connect[open]) .lay-connect,body.v2 .layers:has(.part-workspace[open]) .lay-workspace,body.v2 .layers:has(.part-secure[open]) .lay-secure{opacity:1}
/* The rows: the menu's cards (the part's colour as a 2 px top line), stacked. The name and the subtitle are the control. */
body.v2 .layer-rows{display:grid;gap:10px}
body.v2 .layer-row{border:1px solid var(--line);border-top:2px solid var(--part);border-radius:8px;background:var(--surface)}
body.v2 .layer-row[open],body.v2 .layer-row:has(summary:hover){border-color:var(--tx2);border-top-color:var(--part)}
body.v2 .layer-row summary{display:grid;grid-template-columns:minmax(0,1fr) auto;column-gap:16px;align-items:center;min-height:48px;padding:12px 18px 13px;border-radius:6px;cursor:pointer;list-style:none}
body.v2 .layer-row summary::-webkit-details-marker{display:none}
body.v2 .layer-row summary strong{grid-column:1;font-size:17px;font-weight:600;line-height:1.3;letter-spacing:-.01em}
body.v2 .layer-mark{display:inline-block;width:18px;height:18px;margin-right:9px;vertical-align:-3px;fill:none;stroke:var(--part);stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
body.v2 .layer-row summary small{grid-column:1;margin-top:3px;color:var(--tx2);font-size:14px;line-height:1.5}
body.v2 .layer-plus{grid-column:2;grid-row:1/span 2;color:var(--tx2);font-size:22px;font-weight:300;line-height:1;transition:transform .25s var(--ease)}
body.v2 .layer-row summary:hover .layer-plus{color:var(--tx)}
body.v2 .layer-row[open] .layer-plus{transform:rotate(45deg)}
body.v2 .layer-row summary:focus-visible{outline:2px solid var(--tx);outline-offset:2px}
body.v2 .layer-detail{padding:0 18px 10px}
body.v2 .layer-detail ul{display:grid;gap:8px;margin:0;padding:13px 0 6px;border-top:1px solid var(--line);list-style:none}
body.v2 .layer-detail li{position:relative;padding-left:20px;color:var(--tx);font-size:14px;line-height:1.55}
body.v2 .layer-detail li::before{content:'';position:absolute;left:0;top:.72em;width:10px;height:2px;border-radius:1px;background:var(--part)}
body.v2 .layer-row[open] .layer-detail{animation:layer-in .3s var(--ease)}
@keyframes layer-in{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
/* With a mouse, resting on a row shows its layer before the click; the click is what keeps it. */
@media(hover:hover){body.v2 .layers:has(.layer-row summary:hover) .lay{opacity:.24}
 body.v2 .layers:has(.part-connect summary:hover) .lay-connect,body.v2 .layers:has(.part-workspace summary:hover) .lay-workspace,body.v2 .layers:has(.part-secure summary:hover) .lay-secure{opacity:1}}
@media(max-width:900px){body.v2 .layers{grid-template-columns:minmax(0,1fr);gap:18px}body.v2 .layers-figure{width:100%;max-width:620px;margin-inline:auto}}
@media(max-width:650px){body.v2 .layer-rows{gap:8px}body.v2 .layer-row summary{padding:11px 16px 12px}body.v2 .layer-detail{padding:0 16px 8px}}
@media(max-width:380px){body.v2 .layers-figure .net-name{padding:2px 7px;font-size:10px}}   /* six names on a drawing under 300 px wide */
@media(prefers-reduced-motion:reduce){body.v2 .layers-art .lay,body.v2 .layer-plus{transition:none}body.v2 .layer-row[open] .layer-detail{animation:none}}
@media(forced-colors:active){body.v2 .layers-art .lay{stroke:CanvasText}body.v2 .layers-art .lay .dot{fill:CanvasText}body.v2 .layers-art .lay .mask{fill:Canvas}}
@media print{body.v2 .layers-art .lay{opacity:1}}

/* Compact risk-and-maturity row and the quiet contact line that ends every page. */



/* The quiet contact line (owner, 28 October 2026): a heading, one sentence, e-mail and phone as plain links; no button. */
body.v2 .closing{border-top:1px solid var(--line);padding-top:clamp(48px,6vw,80px)}
body.v2 .closing h2{margin:0}
body.v2 .closing p{margin:14px 0 0;max-width:56ch;color:var(--tx2);font-size:16px;line-height:1.7}
body.v2 .closing .closing-links{display:flex;flex-wrap:wrap;gap:6px 28px;margin-top:18px}
body.v2 .closing-links a{color:var(--tx);font-size:clamp(17px,1.3vw,20px);letter-spacing:-.01em;text-decoration:underline;text-decoration-color:var(--line);text-underline-offset:5px}
body.v2 .closing-links a:hover{text-decoration-color:currentColor}
   /* phone and mailbox under the Support button (8 October 2026) */



/* ---- CTA system (owner feedback, 14 September 2026) --------------------------------
   One solid button (.btn, .button.solid), one outline button (.button, .copy-button),
   one text link (.inline-link). Same radius, height and
   focus ring in both modes; outline buttons keep a visible border on light surfaces. */
body.v2 .btn,body.v2 .button.solid,body.v2 .form-actions .btn{background:var(--action);color:var(--on-action);border:1px solid var(--action);border-radius:3px;min-height:48px;padding:13px 22px;font-size:14px;font-weight:500;letter-spacing:0;text-transform:none;line-height:1.2;text-decoration:none}
body.v2 .btn:hover,body.v2 .button.solid:hover{opacity:.88}
body.v2 .button,body.v2 .copy-button{background:transparent;color:var(--tx);border:1px solid var(--outline);border-radius:3px;min-height:48px;padding:13px 22px;font-size:14px;font-weight:500;letter-spacing:0;text-transform:none;line-height:1.2;text-decoration:none;display:inline-flex;align-items:center;gap:10px;cursor:pointer;font-family:inherit}
body.v2 .button:hover,body.v2 .copy-button:hover{border-color:var(--tx2);background:var(--surface)}
body.v2 .button.solid{border-color:var(--action)}
body.v2 .header-contact,body.v2 .site-header .header-contact{background:var(--action);color:var(--on-action);border:0;border-radius:20px;min-height:38px;padding:9px 16px;font-size:13px;font-weight:500}
body.v2 .btn:focus-visible,body.v2 .button:focus-visible,body.v2 .copy-button:focus-visible,body.v2 .inline-link:focus-visible,body.v2 .mode:focus-visible{outline:2px solid var(--tx);outline-offset:3px}
body.v2 .media-hero .btn:focus-visible{outline-color:#fff}

/* Bridge band split from 1100px, like the hero: copy left, framed image right. */
@media(min-width:1100px){
 body.v2 .anchor-band{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.15fr);align-items:center;gap:clamp(40px,5vw,96px);
  height:auto;min-height:0;max-height:none;padding:clamp(64px,8vw,110px) var(--gutter);background:var(--surface);color:var(--tx);text-align:left;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
 body.v2 .anchor-band::before{display:none}
 body.v2 .anchor-band .anchor-copy{order:1;max-width:560px}
 body.v2 .anchor-band h2{color:var(--tx);margin:0;text-shadow:none;max-width:none;font-size:clamp(30px,2.8vw,44px);font-weight:600}
 body.v2 .anchor-copy p{color:var(--tx2);font-size:16px;line-height:1.7;margin:20px 0 0;max-width:48ch}
 body.v2 .anchor-copy .inline-link{margin-top:22px}
 body.v2 .anchor-media{order:2;position:relative;width:100%;max-width:960px;justify-self:end;aspect-ratio:2/1;border-radius:6px;overflow:hidden;box-shadow:0 30px 80px rgba(0,0,0,.35)}
 body.v2 .anchor-band .theme-image{position:absolute;inset:0;width:100%;height:100%;z-index:0}}
@media(max-width:1099px){body.v2 .anchor-copy p{color:#ececec;font-size:15px;max-width:52ch;margin:16px auto 0;text-shadow:0 1px 10px #0008}
 body.v2 .anchor-copy .inline-link{margin-top:18px;color:#fff}}
body.v2 .customer-strip,body.v2 .anchor-band,body.v2 .connections{padding-inline:max(var(--gutter),calc((100% - 1240px)/2))}   /* content inside the header's 1240 px frame on wide screens, as the hero (owner, 9 October 2026) */

/* ---- Sub-page heroes (14 September 2026): the same scale as the homepage. Where a
   photograph exists the hero splits, copy left and a framed photograph right; the figure
   drops below the copy under 900px. Text-only heroes keep the two-column typographic layout. */
body.v2 .hero.hero-split{grid-template-columns:minmax(0,1fr) minmax(0,1.1fr);align-items:center;gap:clamp(36px,5vw,88px);padding-block:clamp(40px,6vh,72px) clamp(56px,9vh,96px)}
body.v2 .hero-split p.intro{margin:22px 0 26px;max-width:50ch}
body.v2 .hero-split .h1-sub{max-width:36ch}
body.v2 .hero-figure{margin:0;position:relative;width:100%;max-width:760px;justify-self:end;aspect-ratio:3/2;overflow:hidden;border-radius:6px;border:1px solid var(--line);box-shadow:0 30px 80px rgba(0,0,0,.28)}
body.v2 .hero-figure img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:var(--pos,50% 50%);max-width:none;border:0;display:block}
@media(max-width:900px){body.v2 .hero.hero-split{grid-template-columns:1fr;gap:28px;align-items:start}
 body.v2 .hero-figure{max-width:none;aspect-ratio:16/10;justify-self:stretch}
 body.v2 .hero-figure img{object-position:var(--mobile-pos,50% 50%)}}
body.v2 .hero .h1-sub{font-size:.46em}

/* ---- Controls as pills, matching the header (owner feedback, 14 September 2026) --------
   Only controls are pills; cards, figures and panels keep 6px corners. */
body.v2 .btn,body.v2 .button,body.v2 .button.solid,body.v2 .copy-button,body.v2 .form-actions .btn{border-radius:999px;min-height:46px;padding:12px 22px}
body.v2 .header-contact,body.v2 .site-header .header-contact{border-radius:999px}
body.v2 .section-anchors a{border-radius:999px}

body.v2 .section-anchors a{padding:8px 15px}
body.v2 .control-btn,body.v2 .media-hero #hero-motion{border-radius:50%}

/* ---- Appearance change (28 October 2026): the page switches at once. No colour transitions: easing background, border and
   colour on every element at the same time dropped frames under load (cowboy report 2.4), and a view-transition cross-fade
   measured worse (build.py HEAD_APPEARANCE). A day/night still that arrives late fades in. */
body.v2 .anchor-band .theme-image{transition:opacity .3s var(--ease)}
body.v2 .anchor-band .theme-night{opacity:1}
body.v2 .anchor-band .theme-day{opacity:0}
[data-mode=light] body.v2 .anchor-band .theme-night{opacity:0}
[data-mode=light] body.v2 .anchor-band .theme-day{opacity:1}
body.v2 .button,body.v2 .control-btn,body.v2 .mode,body.v2 .mode-option{transition:none}   /* site.css eased their colours */
@media(prefers-reduced-motion:reduce){body.v2,body.v2 *{transition-duration:0s!important}}

/* Line illustrations (14 September 2026): pages without a photograph get a motif in the circuit-diagram idiom. */
body.v2 .hero-figure.hero-figure-art{aspect-ratio:3/2;max-width:560px;border:0;box-shadow:none;background:transparent;overflow:visible;color:var(--tx);border-radius:0}
body.v2 .hero-figure-art svg{display:block;width:100%;height:100%}
body.v2 .art .l1{stroke-opacity:.9}
body.v2 .art .l2{stroke-opacity:.5}
body.v2 .art .l3{stroke-opacity:.22}
body.v2 .art .fill{fill:var(--art,currentColor);stroke:none}
body.v2 .art .fill-soft{fill:currentColor;fill-opacity:.35;stroke:none}
body.v2.bundle-connect .hero-figure-art{--art:var(--connect)}
body.v2.bundle-workspace .hero-figure-art{--art:var(--workspace)}
body.v2.bundle-secure .hero-figure-art{--art:var(--secure)}
/* Connect's hero (owner, 5 November 2026): one network with four zones behind their gates, names in HTML over the drawing, points
   of light that stop at the gates (source/connect_scene.py). Motion as on Secure: on screen only, a pause button, none under reduced motion. */
body.v2 .net-scene{position:relative}
body.v2 .net-art .net-fw{stroke:var(--art)}
body.v2 .net-art .net-gate{stroke:var(--art);fill:var(--ground)}
body.v2 .hero-figure-art .net-flow{position:absolute;inset:0;pointer-events:none}
body.v2 .net-pt{opacity:0}
body.v2 .net-pt circle{fill:var(--tx)}
body.v2 .net-pt .net-halo{fill-opacity:.16}
[data-mode=light] body.v2 .net-pt .net-halo{display:none}
body.v2 .net-scene.is-live .net-pt{animation:net-run var(--t) linear var(--d) infinite}
body.v2 .net-scene.is-paused .net-pt{animation-play-state:paused}
@keyframes net-run{0%{opacity:0;transform:none}8%{opacity:1;transform:translate(calc(var(--dx)*.05),calc(var(--dy)*.05));animation-timing-function:cubic-bezier(.2,.7,.2,1)}
 70%,76%{opacity:1;transform:translate(var(--dx),var(--dy))}86%,100%{opacity:0;transform:translate(var(--dx),var(--dy))}}
body.v2 .net-names{position:absolute;inset:0;pointer-events:none}
body.v2 .net-name{position:absolute;left:var(--x);top:var(--y);transform:translate(-50%,-50%);padding:4px 11px;border:1px solid var(--line);border-radius:999px;background:var(--ground);color:var(--tx);font-size:13px;font-weight:500;line-height:1.3;white-space:nowrap}
body.v2 .net-name.is-start{transform:translate(0,-50%)}
@media(max-width:600px){body.v2 .net-name{padding:3px 8px;font-size:11px}body.v2 .net-art{stroke-width:2}}
body.v2 .net-pause{position:absolute;right:0;top:0;display:inline-grid;place-items:center;width:36px;height:36px;padding:0;border:1px solid var(--line);border-radius:50%;background:var(--ground);color:var(--tx);cursor:pointer}
body.v2 .net-pause[hidden]{display:none}
body.v2 .net-pause:hover{border-color:var(--tx2)}
body.v2 .net-pause:focus-visible{outline:2px solid var(--tx);outline-offset:2px}
body.v2 .net-pause .icon{width:16px;height:16px}
@media print{body.v2 .net-flow,body.v2 .net-pause{display:none}}
@media(max-width:900px){body.v2 .hero-figure.hero-figure-art{max-width:440px;aspect-ratio:3/2;justify-self:start}}

/* ---- Motion pass (15 September 2026): one easing, short durations, nothing that moves layout. Off under reduced motion. */
:root{--ease:cubic-bezier(.2,.7,.2,1)}
@keyframes rise{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
/* Menus (28 October 2026, cowboy report top 1 and appendix C): the panel is opaque from its first frame and only moves; its
   content fades in over it. Open in 0.2 s, close at once. Transform and opacity only. */
@keyframes panel-in{from{transform:translateY(-6px)}to{transform:none}}
@keyframes content-in{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
body.v2 .reveal{opacity:0;transform:translateY(10px)}
body.v2 .reveal.is-in{opacity:1;transform:none}
body.v2 .hero-split>div>*,body.v2 .media-hero .hero-content>*{animation:rise .5s var(--ease) both}
body.v2 .hero-split>div>:nth-child(2),body.v2 .media-hero .hero-content>:nth-child(2){animation-delay:.06s}
body.v2 .hero-split>div>:nth-child(3),body.v2 .media-hero .hero-content>:nth-child(3){animation-delay:.12s}
body.v2 .hero-split>div>:nth-child(4),body.v2 .media-hero .hero-content>:nth-child(4){animation-delay:.18s}
body.v2 .hero-split>div>:nth-child(5){animation-delay:.24s}
body.v2 .hero-figure{animation:rise .6s .12s var(--ease) both}
body.v2 .card,body.v2 .more-card,body.v2 .layer{transition:transform .25s var(--ease)}
body.v2 a.card:hover,body.v2 .more-card:hover,body.v2 .layer:hover{transform:translateY(-2px);border-color:var(--tx2)}
/* After the lifts, so a card fades in like the rest; once it is in, site.js marks it done and the lift's timing is back (PR 5 review). */
body.v2 .reveal:not(.is-done){transition:opacity .45s var(--ease),transform .45s var(--ease);transition-delay:calc(var(--d,0)*60ms)}
body.v2 .inline-link .icon,body.v2 .btn .icon,body.v2 .button .icon,body.v2 .header-contact .icon{transition:transform .25s var(--ease)}
body.v2 .inline-link:hover .icon{transform:translateX(4px)}
body.v2 .btn:hover .icon,body.v2 .button:hover .icon,body.v2 .header-contact:hover .icon{transform:translate(2px,-2px)}

body.v2 .faq-item summary span{display:inline-block;transition:transform .25s var(--ease)}
body.v2 .faq-item[open] summary span{transform:rotate(45deg)}
body.v2 .services-dropdown[open] .mega-menu{animation:panel-in .2s var(--ease) both}
body.v2 .services-dropdown[open] .mega-section{animation:content-in .2s var(--ease) both}
body.v2 .services-dropdown[open] .mega-section+.mega-section{animation-delay:.04s}
body.v2 .mobile-nav:not([hidden]) .mobile-nav-links,body.v2 .mobile-nav:not([hidden]) .mobile-nav-bottom{animation:content-in .2s var(--ease) both}
body.v2 .search-panel:not([hidden]){animation:panel-in .2s var(--ease) both}
body.v2 .search-panel:not([hidden])>*{animation:content-in .2s var(--ease) both}
body.v2 .search-panel:not([hidden])>.search-body{animation-delay:.04s}
body.v2 .mode svg{transition:transform .25s var(--ease)}
body.v2 .mode:hover svg{transform:rotate(20deg)}
@view-transition{navigation:auto}
::view-transition-old(root),::view-transition-new(root){animation-duration:.22s;animation-timing-function:var(--ease)}
@media(prefers-reduced-motion:reduce){
 body.v2 .reveal{opacity:1;transform:none;transition:none}
 body.v2 .hero-split>div>*,body.v2 .media-hero .hero-content>*,body.v2 .hero-figure,body.v2 .services-dropdown[open] .mega-menu,
 body.v2 .services-dropdown[open] .mega-section,body.v2 .mobile-nav:not([hidden]) .mobile-nav-links,body.v2 .mobile-nav:not([hidden]) .mobile-nav-bottom,
 body.v2 .search-panel:not([hidden]),body.v2 .search-panel:not([hidden])>*{animation:none}
 body.v2 .search-link .icon,body.v2 .search-link:hover .icon,body.v2 .search-link:focus-visible .icon{transition:none;transform:none}
 body.v2 a.card:hover,body.v2 .more-card:hover,body.v2 .layer:hover{transform:none}
 @view-transition{navigation:none}
}

/* Day/night hero (15 September 2026): both posters in the markup cross-fade with the appearance. */
body.v2 .hero-media .hero-poster{transition:opacity .3s var(--ease)}
body.v2 .hero-media .theme-night{opacity:1}
body.v2 .hero-media .theme-day{opacity:0}
[data-mode=light] body.v2 .hero-media .theme-night{opacity:0}
[data-mode=light] body.v2 .hero-media .theme-day{opacity:1}
/* Only the poster for the current appearance is fetched; the other one is requested when the reader switches (site.js). Until it has loaded the old one stays up. */
html body.v2 .hero-media .hero-poster.is-pending{opacity:0}
html body.v2 .hero-media .hero-poster.is-held{opacity:1}

body.v2 .privacy-page .hero{padding-bottom:10px}

/* Contact form (16 September 2026 review): the three required fields are marked for the eye; the
   `required` attribute already carries the meaning for assistive technology, so the marker is
   decorative and lives in CSS, which keeps the label strings unchanged. */
body.v2 .field.required>label::after{content:' *';color:var(--tx2)}
body.v2 .form-req{font-size:12px;color:var(--tx2);margin:18px 0 0}
/* Security blog (26 September 2026): the articles moved from the old site, set in the same prose measure as the
   privacy notice. Lists get their markers back (the v2 reset removes them elsewhere). */
body.v2 .blog-post .hero{padding-bottom:10px}
body.v2 .blog-post .hero h1{font-size:clamp(30px,4.2vw,52px)}
body.v2 .blog-meta{display:flex;flex-wrap:wrap;gap:12px 32px;margin:0}
body.v2 .blog-meta dt{font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--tx2);font-weight:500}
body.v2 .blog-meta dd{margin:6px 0 0;font-size:15px;color:var(--tx)}
body.v2 .blog-lang-note{font-size:14px;color:var(--tx2);margin:18px 0 0}
body.v2 .blog-article ul,body.v2 .blog-article ol{color:var(--tx2);font-size:15px;font-weight:400;line-height:1.7;max-width:66ch;margin:14px 0 0;padding-left:1.4em}
body.v2 .blog-article li{margin:10px 0 0}
body.v2 .blog-article li>p{margin:10px 0 0}
body.v2 .blog-article li>ul{margin-top:8px}
body.v2 .blog-article strong{color:var(--tx);font-weight:600}
body.v2 .blog-pager{grid-template-columns:repeat(2,1fr);margin-top:56px}
body.v2 .blog-pager small{display:block;margin-bottom:4px}
body.v2 .blog-card .blog-date{font-size:13px;color:var(--tx2);margin:0}
body.v2 .blog-card h3 a{color:var(--tx);text-decoration:none}
body.v2 .blog-card h3 a:hover{text-decoration:underline;text-underline-offset:3px}
@media(max-width:700px){body.v2 .blog-pager{grid-template-columns:1fr}}
/* Technology partners page (30 September 2026): one card per partner, badge on the same dark chip as the homepage row. */
body.v2 .partner-grid{margin-top:36px}
body.v2 .partner-card{display:flex;flex-direction:column;gap:14px}
body.v2 .partner-card .partner-badge{height:92px;display:flex;align-items:center}
body.v2 .partner-card .partner-badge .mark-chip{display:inline-flex;height:92px;box-sizing:border-box}
body.v2 .partner-card .partner-badge img{max-height:72px;max-width:220px;width:auto;object-fit:contain}
body.v2 .partner-card h2{font-size:clamp(18px,1.9vw,23px);line-height:inherit;letter-spacing:-.015em;margin:6px 0 0;display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px}
body.v2 .partner-card h2 small{font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--tx2);font-weight:500}
body.v2 .partner-card>p{margin:0}
/* Check Point's specialisations: one discreet row of small badges under the card text (B3, 26 October 2026). */
   /* beats .card p (15 px / 400) */



body.v2 .customer-label a{color:inherit;text-decoration:underline;text-underline-offset:3px;text-decoration-color:var(--line)}
/* Header collapse at 960px (28 October 2026). Between 801 and 1100px the full navigation once wrapped onto two or three lines
   and squeezed the contact button (7 October 2026), and the wider Norwegian bar needed 1130px, so the collapse sat at 1160px.
   The English bar collapses only below 961px: tablets in landscape and small laptops get the full bar. With IT services,
   Cybersecurity and About (10 November 2026) and the Contact button it fits there beside a classic scroll bar, with about
   28px to spare; a fourth item needs the logo's margin cut (16px held AI there for a day) or a higher collapse width.
   site.js uses the same width to close the panel and the bar's menus on resize. */
@media(max-width:960px){
 body.v2 .nav-main,body.v2 .header-contact{display:none!important}
 .js body.v2 .menu-toggle{display:block;margin-left:auto}
 body.v2 .mobile-fallback{display:block}
 .js body.v2 .mobile-fallback{display:none}
 /* The menu without JavaScript is a small panel under «Menu» at every width where the bar's links are away, in the page's own
    colours. Between 651 and 960 px it was a run of links inside the bar, which broke onto two lines (12 November 2026). */
 body.v2 .mobile-fallback{position:relative;margin-left:auto;font-size:14px}
 body.v2 .mobile-fallback summary{padding:12px;cursor:pointer}
 body.v2 .mobile-fallback nav{position:absolute;right:0;top:calc(100% + 10px);display:grid;gap:2px;width:max-content;min-width:220px;padding:10px;border:1px solid var(--line);border-radius:12px;background:var(--surface)}
 body.v2 .mobile-fallback nav a{padding:10px 12px;color:var(--tx);white-space:nowrap}
 body.v2 .mega-menu{display:none}
 /* The magnifier leads the right-hand group once the links have collapsed, and steps aside while the phone menu is open. */
 body.v2 .search-toggle{margin:0 -4px 0 auto}
 .js body.v2 .search-toggle~.menu-toggle{margin-left:0}
 body.v2 .site-header.menu-is-open .search-toggle{visibility:hidden}
 body.v2 .menu-toggle{flex:none}   /* it was squeezed to nothing below 360px once the magnifier joined the bar */
}
/* The collapsed bar holds the logo and three buttons. Up to 420px (a phone, or a narrow window that also has a scroll bar) the
   gaps and the appearance switch's own margins close up; below 360px (a small phone with display zoom, or 400% zoom) the logo
   and the bar's padding give the rest. */
@media(max-width:420px){body.v2 .site-header{gap:8px}body.v2 .site-header .mode{margin:0}body.v2 .search-toggle{width:36px}}
@media(max-width:359px){body.v2 .site-header{gap:6px;padding-inline:12px 4px}body.v2 .site-header .brand img{width:112px}}
/* The magnifier made the right-hand group wider; the logo's margin puts the links back where they were, 10px left of centre. */
@media(min-width:961px){body.v2 .site-header .brand{margin-right:48px}}
/* A fourth item in the bar, Customer stories (owner, 12 November 2026): no item breaks onto two lines and the Contact button
   keeps its width. Just above the phone menu's width the bar stands closer, so the four fit on one line with room to spare;
   a bar without the fourth item (a production build, while the page is a draft) keeps its spacing. */
body.v2 .nav-main>a,body.v2 .services-dropdown>summary{white-space:nowrap}
body.v2 .site-header .header-contact{flex:none}
@media(min-width:961px) and (max-width:1099px){body.v2 .site-header:has(.nav-main>a+a){gap:14px}
 body.v2 .site-header:has(.nav-main>a+a) .brand{margin-right:12px}body.v2 .site-header:has(.nav-main>a+a) .nav-main{gap:16px}}

/* Day/night pair in a split hero (contact page, 8 October 2026): both stills in the frame, the one for the current appearance on top. */
body.v2 .hero-figure.theme-pair img{transition:opacity .3s var(--ease)}
body.v2 .hero-figure.theme-pair .theme-night{opacity:1}
body.v2 .hero-figure.theme-pair .theme-day{opacity:0}
[data-mode=light] body.v2 .hero-figure.theme-pair .theme-night{opacity:0}
[data-mode=light] body.v2 .hero-figure.theme-pair .theme-day{opacity:1}
/* Sub-headings inside a section (the merged About page, 27 October 2026). */

/* Partner badges shown large (owner, 27 October 2026, A10): 120 px high in rows (hero marks, the specialisation row) and 200 px
   on the /partners cards. A wide badge keeps that height unless the screen is narrower than the badge. */
body.v2 .marks img,body.v2 .hero .marks img,body.v2 .split .marks img,body.v2 .hero .marks-4 img,body.v2 .mark-chip.award img{height:120px;max-height:none;width:auto;max-width:100%;object-fit:contain}
body.v2 .hero .marks-4 .mark-chip{padding:10px 14px}
body.v2 .hero .marks-4{display:flex;flex-wrap:wrap}   /* the two-column grid of the small badges no longer fits a phone */
body.v2 .mark-chip{max-width:100%;box-sizing:border-box}
body.v2 .mark-chip.plain{background:transparent;padding:0}

body.v2 .partner-card .partner-badge,body.v2 .partner-card .partner-badge .mark-chip{height:auto}
body.v2 .partner-card .partner-badge img{height:200px;max-height:none;max-width:100%}
/* Cisco's badges come in pairs: the white knockout (or the colour version with white lettering) in dark mode, the black one (or
   the colour version with dark lettering) in light mode. */
body.v2 img.badge-on-light{display:none}
html[data-mode=light] body.v2 img.badge-on-dark{display:none}
html[data-mode=light] body.v2 img.badge-on-light{display:block}

/* Voice pass, 27 October 2026 (docs/APPROVED-COPY-2026-10-27.md, docs/CONTENT-RULES.md §2): no labels or numbered cards,
   calmer headings, one left edge for every section, and the new blocks (quotes, the small partner row, the shared «Connect,
   Workspace og Secure» block, Om oss, Secure version 1). */
/* One left edge: the content column of every page now lines up with the header frame, the customer strip and the homepage
   bands (all 1240 px wide); until today .w sat about 80 px further in at 1440 px. */
body.v2 .w{max-width:none;padding-inline:max(var(--gutter),calc((100% - 1240px)/2))}
body.v2 .footer{padding-inline:max(var(--gutter),calc((100% - 1240px)/2))}
/* Calmer headings where they shouted. */
body.v2 h2{font-size:clamp(24px,2.5vw,34px)}
body.v2 .connections h2,body.v2 .anchor-band h2{font-size:clamp(24px,2.5vw,34px)}
/* Footer column headings: plain headings, not labels. */
body.v2 .footer-heading{margin:0 0 6px;font-size:13px;line-height:1.5;font-weight:600;letter-spacing:0;text-transform:none;color:var(--tx)}
/* Scenario halves and contact cards: headings in sentence case. */
body.v2 .scenario h4{margin:0 0 10px;font-size:14px;line-height:1.4;font-weight:600;letter-spacing:0;color:var(--tx2)}
body.v2 .scenario .after h4{color:var(--tx)}
body.v2.bundle-page .scenario .after h4{color:var(--layer)}
body.v2 .channel h2{margin:0;font-size:14px;line-height:1.4;font-weight:600;letter-spacing:0;color:var(--tx2)}
body.v2 .bundle-strip .layer h3{margin-top:0}
/* The homepage partner row (owner, 28 October 2026: larger, and better looking than the black chips of 27 October): the four
   marks on the white strip, each centred in a cell of the same width with a hairline between, as calm as the customer logos
   above. Each mark has its own height so the four weigh the same, and Veeam stays at least 100 px wide, the smallest size its
   guide gives for the logo with the bounce mark. Two by two where four cells would squeeze the Microsoft logo. */
body.v2 .partner-marks{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));width:min(100%,960px);margin:0 auto;padding:0;list-style:none}
body.v2 .partner-mark{position:relative;display:flex;align-items:center;justify-content:center;height:116px;margin:0}
body.v2 .partner-mark+.partner-mark::before{content:'';position:absolute;left:0;top:24px;bottom:24px;width:1px;background:#e3e3e3}
body.v2 .partner-mark img{display:block;width:auto;max-width:100%;height:76px;object-fit:contain}
body.v2 .partner-mark.microsoft img{height:36px}
body.v2 .partner-mark.veeam img{height:40px}
@media(max-width:860px){body.v2 .partner-marks{grid-template-columns:repeat(2,minmax(0,1fr))}
 body.v2 .partner-mark{height:96px}
 body.v2 .partner-mark:nth-child(3)::before{display:none}
 body.v2 .partner-mark:nth-child(n+3)::after{content:'';position:absolute;top:0;left:16px;right:16px;height:1px;background:#e3e3e3}
 body.v2 .partner-mark img{height:60px}
 body.v2 .partner-mark.microsoft img{height:26px}
 body.v2 .partner-mark.veeam img{height:30px}}
/* The customer quotes, and the DN Gaselle badge on its own beside them (owner, 28 October 2026): one centred group between the
   logos and the partner row. The strip is white in both modes, so they use its own ink, not the theme tokens. */
body.v2 .proof{display:grid;grid-template-columns:minmax(0,46rem) auto;justify-content:center;align-items:center;gap:28px clamp(40px,6vw,96px);margin-top:34px;padding-top:34px;border-top:1px solid #e3e3e3}
body.v2 .customer-quote blockquote p{margin:0;font-size:clamp(18px,1.6vw,22px);line-height:1.5;letter-spacing:-.01em;color:#161616;text-wrap:pretty}
body.v2 .customer-quote figcaption{display:flex;align-items:center;gap:10px;margin-top:16px;font-size:14px;font-weight:500;color:#4a4a4a}
body.v2 .customer-quote figcaption img{height:30px;width:auto}
body.v2 .award-mark{margin:0}
body.v2 .award-mark img{display:block;width:136px;height:auto;border-radius:10px}
@media(max-width:700px){body.v2 .proof{grid-template-columns:minmax(0,1fr)}body.v2 .award-mark img{width:112px}}
/* One quote at a time, cross-fading in place (site.js 'quote rotation'): the slides share one grid cell, so the block keeps the
   height of the longest quote and nothing below it moves. A list without JavaScript and under reduced motion. The dots keep 3:1
   against the white strip. */
body.v2 .quote-slides{display:grid;gap:28px}
body.v2 .quote-rotator.is-rotating .quote-slides{gap:0}
body.v2 .quote-rotator.is-rotating .quote-slide{grid-area:1/1;align-self:center;opacity:0;visibility:hidden;transition:opacity .6s var(--ease),visibility 0s linear .6s}
body.v2 .quote-rotator.is-rotating .quote-slide.is-active{opacity:1;visibility:visible;transition:opacity .6s var(--ease),visibility 0s}
body.v2 .quote-controls{display:flex;align-items:center;gap:2px;margin-top:20px}
body.v2 .quote-controls[hidden]{display:none}
body.v2 .quote-controls button{display:inline-grid;place-items:center;width:32px;height:32px;padding:0;border:0;border-radius:50%;background:transparent;color:#161616;cursor:pointer}
body.v2 .quote-controls button:focus-visible{outline:2px solid #161616;outline-offset:1px}
body.v2 .quote-controls .quote-pause{margin-right:6px;border:1px solid #c9cdd3}
body.v2 .quote-pause .icon{width:14px;height:14px}
body.v2 .quote-dot::before{content:'';width:8px;height:8px;border-radius:50%;background:#8a8a8a}
body.v2 .quote-dot[aria-current=true]::before{background:#161616}
@media(forced-colors:active){body.v2 .quote-dot::before{background:GrayText}body.v2 .quote-dot[aria-current=true]::before{background:CanvasText}}   /* a forced background would hide the dots */
/* The shared block on Connect, Workspace and Secure: the three names, one line each, the current page marked. */
body.v2 .three-parts{list-style:none;margin:28px 0 0;padding:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}
body.v2 .three-parts li{margin:0}
body.v2 .three-parts a{display:block;height:100%;box-sizing:border-box;padding:22px 24px;border:1px solid var(--line);border-top:2px solid var(--layer);background:var(--surface);color:var(--tx);text-decoration:none}
body.v2 .three-parts li:nth-child(1) a{--layer:var(--connect)}
body.v2 .three-parts li:nth-child(2) a{--layer:var(--workspace)}
body.v2 .three-parts li:nth-child(3) a{--layer:var(--secure)}
body.v2 .three-parts a:hover{border-color:var(--tx2);border-top-color:var(--layer)}
body.v2 .three-parts a[aria-current=page]{border-color:var(--layer);box-shadow:inset 0 0 0 1px var(--layer)}
body.v2 .three-parts strong{display:block;font-size:18px;font-weight:600}
body.v2 .three-parts span{display:block;margin-top:8px;font-size:14px;line-height:1.6;color:var(--tx2)}
@media(max-width:800px){body.v2 .three-parts{grid-template-columns:1fr}}
/* Om oss */
body.v2 main .about-hero{display:block}
body.v2 main .about-hero .intro{max-width:62ch;margin:28px 0 0}
body.v2 main .about-hero .intro+.intro{margin-top:16px}
body.v2 .about-steps{max-width:62ch;display:grid;gap:14px;margin-top:20px}
body.v2 .about-steps p{margin:0;color:var(--tx2);font-size:16px;line-height:1.6}
body.v2 .about-contact{font-style:normal;margin-top:20px;display:grid;gap:4px;font-size:16px}
body.v2 .about-contact p{margin:0}
body.v2 .about-contact a{color:var(--tx)}
/* Secure (source/secure.py has the page's own style): the chart's table, the explorer's tabs and panels, the partner chips. */
body.v2 .chart-table{margin-top:14px;font-size:13px;color:var(--tx2)}
body.v2 .chart-table summary{cursor:pointer;width:fit-content}
body.v2 .chart-table table{margin-top:10px;border-collapse:collapse;font-variant-numeric:tabular-nums}
body.v2 .chart-table th,body.v2 .chart-table td{padding:5px 18px 5px 0;border-bottom:1px solid var(--line);text-align:left;font-weight:400}
body.v2 .chart-table thead th{color:var(--tx);font-weight:600}
body.v2 .chart-table td{text-align:right}
body.v2 .explorer{margin-top:28px}
body.v2 main .explorer-panel{padding-block:24px;border-top:1px solid var(--line)}
body.v2 main .explorer.is-tabbed .explorer-panel{border-top:0;padding-top:16px}
body.v2 .explorer-panel>h3{margin:0;font-size:19px}
body.v2 .explorer.is-tabbed .explorer-panel>h3{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
body.v2 .explorer-panel ul{margin:0;padding-left:18px}
body.v2 .explorer-panel li{margin:0 0 4px}
body.v2.secure-page #partners .marks{display:flex;flex-wrap:wrap;gap:12px;margin-top:24px}
body.v2.secure-page #partners .mark-chip{padding:7px 10px;border-radius:6px;background:#111}
body.v2.secure-page #partners .mark-chip img{height:40px;max-height:none;width:auto;max-width:none}
/* The level under a partner's name («Partner», «Advanced Partner») in sentence case, not as a label. */
/* The partners page shows the front page's row of marks (5 November 2026) on the same white ground, in both appearances. */
body.v2 .partner-panel{background:#fff;border:1px solid var(--line);border-radius:12px;padding:12px 16px}
body.v2 h2+.partner-panel{margin-top:24px}   /* under a section heading, on /partners and Secure */
/* The partner strip under a hero (10 November 2026): the front page's marks, smaller, on the same white panel, in cells of the
   same width. Three or four marks stand two by two on a phone. */
body.v2 .partner-strip{display:inline-grid;width:auto;max-width:100%;margin:30px 0 0;padding:4px 6px;background:#fff;border:1px solid var(--line);border-radius:12px}
body.v2 .partner-strip.n1{grid-template-columns:minmax(0,1fr)}body.v2 .partner-strip.n2{grid-template-columns:repeat(2,minmax(0,1fr))}
body.v2 .partner-strip.n3{grid-template-columns:repeat(3,minmax(0,1fr))}body.v2 .partner-strip.n4{grid-template-columns:repeat(4,minmax(0,1fr))}
body.v2 .partner-strip .partner-mark{height:84px;padding-inline:clamp(14px,2vw,26px)}
body.v2 .partner-strip .partner-mark img{height:54px}
body.v2 .partner-strip .partner-mark.microsoft img{height:25px}
body.v2 .partner-strip .partner-mark.veeam img{height:28px}
body.v2 .partner-strip.n4 .partner-mark{padding-inline:12px}   /* four in the hero's column: the wide logos keep their size */
/* Between 561 and 860px the strip is still one row, so the front page's two-by-two rules above do not apply to it. */
@media(min-width:561px) and (max-width:860px){
 body.v2 .partner-strip .partner-mark:nth-child(3)::before{display:block}
 body.v2 .partner-strip .partner-mark:nth-child(n+3)::after{content:none}}
@media(max-width:560px){
 body.v2 .partner-strip.n3,body.v2 .partner-strip.n4{grid-template-columns:repeat(2,minmax(0,1fr))}
 body.v2 .partner-strip.n3 .partner-mark:nth-child(odd)::before,body.v2 .partner-strip.n4 .partner-mark:nth-child(odd)::before{display:none}
 body.v2 .partner-strip .partner-mark{height:72px}}
body.v2 .partner-card h2 small{font-size:13px;letter-spacing:0;text-transform:none;font-weight:400}

/* ---- Homepage, 28 October 2026 (owner, option A of the landing-page proposal), in the services menu's design language ---- */
/* «What we deliver»: two panels, IT as a service with its three parts as cards with a coloured top line, and Security; Advice
   and projects as one line; the six service areas as a quiet list. */
body.v2 main #what-we-deliver{padding-top:clamp(56px,7vw,96px)}
body.v2 .deliver-blocks{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin-top:30px}
body.v2 .deliver-service{grid-column:1/-1}   /* IT as a service across the width, Cybersecurity and AI under it (10 November 2026) */
body.v2 .deliver-block{display:flex;flex-direction:column;align-items:flex-start;min-width:0;padding:clamp(22px,2.4vw,32px);background:var(--surface);border:1px solid var(--line);border-radius:12px}
body.v2 .deliver-block h3{margin:0;font-size:clamp(20px,1.6vw,24px);font-weight:600;line-height:1.2;letter-spacing:-.02em}
body.v2 .deliver-block>p{margin:12px 0 0;max-width:62ch;color:var(--tx2);font-size:15px;line-height:1.7}
body.v2 .deliver-parts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;width:100%;margin-top:22px}
body.v2 a.deliver-part{display:block;padding:14px 16px 15px;border:1px solid var(--line);border-top:2px solid var(--part);border-radius:8px;background:var(--ground);color:var(--tx);text-decoration:none;transition:transform .25s var(--ease)}
body.v2 a.deliver-part:hover{transform:translateY(-2px);border-color:var(--tx2);border-top-color:var(--part)}
body.v2 .deliver-part.part-connect{--part:var(--connect)}body.v2 .deliver-part.part-workspace{--part:var(--workspace)}body.v2 .deliver-part.part-secure{--part:var(--secure)}
body.v2 .deliver-part strong{display:block;font-size:16px;font-weight:600}
body.v2 .deliver-part small{display:block;margin-top:4px;color:var(--tx2);font-size:13px;line-height:1.5;font-weight:400}
body.v2 .deliver-block>p.deliver-after{margin-top:16px;font-size:14px}
body.v2 .deliver-block>.inline-link{margin-top:10px}
body.v2 .deliver-block>p.deliver-links{display:flex;flex-direction:column;align-items:flex-start;gap:2px;margin-top:auto;padding-top:18px}
body.v2 .deliver-links .inline-link{display:block}body.v2 .deliver-links .inline-link .icon{display:inline-block;vertical-align:-3px;margin-left:6px}   /* the arrow stays with the words when they wrap */
body.v2 .deliver-line{margin:26px 0 0;max-width:none;color:var(--tx2);font-size:15px;line-height:1.7}
body.v2 .deliver-line .inline-link{display:inline-flex;margin-left:4px;color:var(--tx);min-height:0;padding-block:0;vertical-align:baseline}
@media(max-width:700px){body.v2 .deliver-line .inline-link{display:flex;width:fit-content;min-height:40px;margin-left:0}}   /* on its own line on phones: a full-size target */
body.v2 .deliver-areas{margin-top:26px;padding-top:22px;border-top:1px solid var(--line)}
body.v2 .deliver-areas h3{margin:0;font-size:16px;font-weight:600;letter-spacing:-.01em}
body.v2 .deliver-areas ul{list-style:none;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0 24px;margin:8px 0 0;padding:0}
body.v2 .deliver-areas a{display:block;padding:8px 0;color:var(--tx);font-size:15px;font-weight:500;text-decoration:none}
body.v2 .deliver-areas a:hover{text-decoration:underline;text-decoration-color:var(--line);text-underline-offset:5px}
@media(max-width:1000px){body.v2 .deliver-blocks{grid-template-columns:1fr}}
@media(max-width:700px){body.v2 .deliver-parts{grid-template-columns:1fr}body.v2 .deliver-areas ul{grid-template-columns:1fr 1fr}}
@media(max-width:440px){body.v2 .deliver-areas ul{grid-template-columns:1fr}}
@media(prefers-reduced-motion:reduce){body.v2 a.deliver-part:hover{transform:none}}

/* The logo strip: one row that moves sideways in a loop at a steady speed at every width (site.js 'logo strip'), transform
   only; the second copy closes the loop, and each copy is at least as wide as the strip, the logos spread over it. It holds
   under a mouse pointer, and stands still under reduced motion. */
body.v2 .logo-strip{display:flex;align-items:center;gap:12px}
body.v2 .logo-viewport{display:flex;flex:1;min-width:0;overflow:hidden}
body.v2 .logo-track{list-style:none;display:flex;flex:1;flex-wrap:wrap;align-items:center;justify-content:center;gap:22px clamp(28px,3.4vw,48px);margin:0;padding:0}
body.v2 .logo-copy{display:none}
body.v2 .logo-strip.is-moving .logo-viewport{-webkit-mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent);mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent)}
body.v2 .logo-strip.is-moving .logo-track{flex:none;flex-wrap:nowrap;min-width:100%;justify-content:space-around;padding-right:clamp(28px,3.4vw,48px);animation:logo-loop var(--logo-seconds,40s) linear infinite}
body.v2 .logo-strip.is-moving .logo-copy{display:flex}
body.v2 .logo-strip.is-moving .customer-logo{flex:none}
body.v2 .logo-strip.is-paused .logo-track{animation-play-state:paused}
@media(hover:hover){body.v2 .logo-viewport:hover .logo-track{animation-play-state:paused}}   /* the logos, not the button, so Play works under the pointer; not on touch, where a tap leaves a sticky hover; not on focus, which the button keeps after Play (PR 5 review) */
@keyframes logo-loop{to{transform:translateX(-100%)}}
body.v2 .logo-pause{display:inline-grid;place-items:center;flex:none;width:40px;height:40px;min-width:40px;padding:0;border:1px solid #c9cdd3;border-radius:50%;background:#fff;color:#161616;cursor:pointer}
body.v2 .logo-pause[hidden]{display:none}
body.v2 .logo-pause .icon{width:16px;height:16px}
body.v2 .logo-pause:focus-visible{outline:2px solid #161616;outline-offset:2px}
@media(prefers-reduced-motion:reduce){body.v2 .logo-strip .logo-track{animation:none}}

/* The industries on the bridge band: five cards with a line icon each, in the band's copy. */
/* The industries (owner, 9 November 2026): an icon over one word, five in a row, no boxes; three over two on a phone. */
body.v2 .industry-cards{list-style:none;display:flex;flex-wrap:nowrap;justify-content:space-between;gap:28px clamp(10px,1.4vw,24px);margin:32px 0 0;padding:0}   /* one row from 1100 px: the copy column is about 435 px there (Claude Code Review on PR 93) */
body.v2 .industry-card{flex:0 0 auto;display:flex;flex-direction:column;align-items:center;gap:10px;min-width:0;color:var(--tx);font-size:clamp(13px,1.05vw,15px);font-weight:500;line-height:1.3;text-align:center}
body.v2 .industry-icon{flex:none;width:32px;height:32px;color:var(--tx2)}
@media screen and (max-width:1099px){body.v2 .industry-cards{flex-wrap:wrap;max-width:560px;margin:28px auto 0;justify-content:center;gap:28px 24px}
 body.v2 .industry-card{color:#fff;font-size:15px;text-shadow:0 1px 10px #000c}   /* on the photograph, as the heading: a shadow keeps the words readable over the lights */
 body.v2 .industry-card .industry-icon{color:#ececec;filter:drop-shadow(0 1px 6px #000c)}}
@media screen and (max-width:520px){body.v2 .industry-cards{gap:28px 8px}body.v2 .industry-card{flex:0 0 calc((100% - 16px)/3);font-size:clamp(12.5px,3.9vw,15px)}}

/* «Know where you stand»: about 50 words in a panel, with the risk-assessment motif beside it on wide screens. */
body.v2 main #compliance.compliance-panel{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(0,1fr);gap:clamp(24px,4vw,64px);align-items:center;
 margin-top:clamp(48px,6vw,80px);padding:clamp(24px,3vw,40px);background:var(--surface);border:1px solid var(--line);border-radius:12px}
body.v2 .compliance-panel h2{margin:0}
body.v2 .compliance-panel p{max-width:60ch;margin:16px 0 0;color:var(--tx2);font-size:15px;line-height:1.7}
body.v2 .compliance-panel p:last-child{margin-top:18px}
body.v2 .compliance-art{justify-self:end;width:100%;max-width:340px;margin:0;color:var(--tx)}
body.v2 .compliance-art .art{display:block;width:100%;height:auto}
@media(max-width:800px){body.v2 main #compliance.compliance-panel{grid-template-columns:1fr}body.v2 .compliance-art{display:none}}
body.v2 .compliance-panel+.closing{border-top:0}   /* the panel's own edge separates them; a hairline under it doubled the edge */

/* The footer's page links stand without a heading (owner, 28 October 2026: «Contents» goes). */
body.v2 nav.footer-col{padding-top:0}
body.v2 nav.footer-col::before{content:"";height:19.5px;margin-bottom:6px}   /* the height of a column heading, so its links line up with the next column's (PR 5 review) */

/* Customer stories and industries (drafts, 28 October 2026). A film is a 16:9 frame with a play button until the reader asks for it;
   then Vimeo's player takes its place (site.js 'films'). A quote that waits for the customer's approval is marked as such. */
body.v2 .film{position:relative;aspect-ratio:16/9;max-width:880px;margin-top:24px;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--surface)}
body.v2 .film-play{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;gap:16px;width:100%;border:0;background:radial-gradient(circle at 50% 50%,var(--ground),var(--surface) 70%);color:var(--tx);font:inherit;cursor:pointer}
body.v2 .film-icon{display:grid;place-items:center;width:64px;height:64px;border-radius:50%;background:var(--tx);color:var(--ground);transition:transform .25s var(--ease)}
body.v2 .film-icon .icon{width:24px;height:24px;margin-left:3px;fill:currentColor}
body.v2 .film-play:hover .film-icon{transform:scale(1.06)}
body.v2 .film-text{display:flex;flex-direction:column;align-items:flex-start;font-size:16px;font-weight:600;text-align:left}
body.v2 .film-text small{margin-top:2px;color:var(--tx2);font-size:13px;font-weight:400}
body.v2 .film iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
/* With a poster frame (10 November 2026) the button lies over the picture: a light scrim, a white disc, and the words on a dark
   plate so they hold their contrast whatever the frame shows. */
body.v2 .film-poster{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
body.v2 .film.has-poster .film-play{background:linear-gradient(rgba(8,11,16,.08),rgba(8,11,16,.32));color:#fff}
body.v2 .film.has-poster .film-icon{background:#fff;color:#0b0f14}
body.v2 .film.has-poster .film-text{padding:9px 14px 10px;border-radius:10px;background:rgba(8,11,16,.82)}
body.v2 .film.has-poster .film-text small{color:rgba(255,255,255,.86)}
body.v2 .film.has-poster .film-play:focus-visible{outline-color:#fff}
body.v2 .film-play:focus-visible{outline:2px solid var(--tx);outline-offset:-6px}
/* Without JavaScript the play button does nothing, so it is not shown: the film is the plain link to Vimeo in a quiet panel (PR 3 review). */
html:not(.js) body.v2 .film{aspect-ratio:auto;padding:18px 20px}
html:not(.js) body.v2 .film-play,html:not(.js) body.v2 .film-poster{display:none}
html:not(.js) body.v2 .film p{margin:0}
html:not(.js) body.v2 .film a{text-decoration:underline;text-underline-offset:4px}
/* Customer stories (Layout A, 5 November 2026): the logo strip on its white band, the quotes in the page's own colours, two films. */
body.v2 .story-logos{margin-block:8px 40px}
body.v2 .story-quotes{display:grid;gap:24px;max-width:780px;margin-top:24px}
body.v2 .story-quotes .customer-quote blockquote p{color:var(--tx)}
body.v2 .story-films{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:28px;margin-top:24px}
body.v2 .story-films h3{margin:0 0 6px}
body.v2 .story-films p{margin:0 0 14px;color:var(--tx2)}
@media(max-width:860px){body.v2 .story-films{grid-template-columns:1fr}}
body.v2 .industry-list{list-style:none;display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;margin:24px 0 0;padding:0}
body.v2 .industry-item{padding:18px 18px 20px;border:1px solid var(--line);border-radius:12px;background:var(--surface)}
body.v2 .industry-item .industry-icon{width:26px;height:26px;color:var(--tx2)}
body.v2 .industry-item h3{margin:12px 0 0;font-size:18px}
body.v2 .industry-item p{margin:8px 0 0;color:var(--tx2);font-size:14px;line-height:1.6}
@media(prefers-reduced-motion:reduce){body.v2 .film-play:hover .film-icon{transform:none}}

/* ---- The menu's design language on every page (owner, 28 October 2026, step 7) ----------------------------------------------
   Every panel is one of the services menu's: the surface colour, a 1px line and a 12px radius; a card that is a link lifts 2px on
   hover (the motion pass above: transform only, nothing under reduced motion). The three parts are the menu's cards, with an 8px
   radius and their colour as a 2px top line; the bundle colours stay on bundle things. */
body.v2 .card,body.v2 .family-block,body.v2 .scenario,body.v2 .contact-form{border-radius:12px}
body.v2 .callout{border-radius:12px;border-left:1px solid var(--line)}   /* a panel like the others; its 2px side rule does not round */
body.v2 .scenario{overflow:hidden}   /* the «With …» column's rule ends at the rounded corner */
body.v2 .three-parts a,body.v2 .bundle-strip .layer{border-radius:8px}
body.v2 .three-parts a{transition:transform .25s var(--ease)}
body.v2 .three-parts a:hover{transform:translateY(-2px)}
@media(prefers-reduced-motion:reduce){body.v2 .three-parts a:hover{transform:none}}
/* The team on About: one panel per person, as the menu's cards, instead of a table of hairlines. */
body.v2 .people-grid{gap:16px;background:none}
body.v2 .people-grid .person{background:var(--surface);border:1px solid var(--line);border-radius:12px}
/* The form's fields as the menu's cards: an 8px radius inside the 12px panel. */
body.v2 .field input,body.v2 .field select,body.v2 .field textarea{border-radius:8px}

/* ---- Print (cowboy report, top 9, 10.1 and 10.2) ------------------------------------------------------------------------------
   A printout is light whatever the appearance, with the light marks (the black logo, Cisco's dark badge),
   and has no bar, menus, skip link or controls. It shows the whole page: every section that waits to rise into view, every answer
   and table behind a «+», and every panel of the Secure explorer with its own title, as without JavaScript. A photograph prints
   only if it has loaded (a page in dark mode has fetched the night ones); the front page's hero and bridge band print their words
   without the photograph behind them, and the logo row prints whole and still (PR 7 review). */
@media print{
 :root,[data-mode]{--ground:#fff;--surface:#fff;--line:#C9CDD3;--tx:#000;--tx2:#333;--accent:#000;--action:#000;--on-action:#fff;
  --glass:#fff;--outline:#C9CDD3;--connect:#0A7080;--workspace:#B54A09;--secure:#007A44;--error:#B3261E;color-scheme:light}
 body.v2{background:#fff;color:#000}
 body.v2 main{padding-top:0}
 body.v2 .skip-link,body.v2 .site-header,body.v2 .mobile-nav,body.v2 .mode-float,body.v2 .hero-toolbar,body.v2 .control-btn,
 body.v2 .hero-actions,body.v2 .form-actions,body.v2 .copy-button,body.v2 .explorer-tabs,body.v2 .film{display:none!important}
 body.v2 .reveal,body.v2 .hero-split>div>*,body.v2 .media-hero .hero-content>*,body.v2 .hero-figure{opacity:1!important;transform:none!important;animation:none!important;transition:none!important}
 body.v2 .brand img{filter:invert(1)}
 body.v2 img.badge-on-dark{display:none!important}
 body.v2 img.badge-on-light{display:block!important}
 body.v2 .theme-image:not([src]){display:none!important}
 body.v2 .theme-image[src]{opacity:1!important;transition:none!important}
 body.v2 .media-hero .hero-stage,body.v2 .media-hero .hero-shade,body.v2 .anchor-media,body.v2 .anchor-band::before{display:none!important}
 body.v2 .hero.media-hero,body.v2 .anchor-band{display:block;height:auto;min-height:0;max-height:none;margin-top:0;overflow:visible;padding:24px 0;text-align:left;background:none;color:#000}
 body.v2 .media-hero .hero-content{width:auto;margin:0;padding:0}
 body.v2 .media-hero h1,body.v2 .anchor-band h2{color:#000;text-shadow:none;margin:0;max-width:none}
 body.v2 .media-hero .hero-intro,body.v2 .anchor-copy p{color:#333;text-shadow:none;margin:12px 0 0;max-width:none}
 body.v2 .anchor-copy .inline-link{color:#000}
 body.v2 .industry-cards{margin:16px 0 0;max-width:none;justify-content:flex-start;flex-wrap:wrap}
 body.v2 .industry-card{color:#000;text-shadow:none}
 body.v2 .industry-card .industry-icon{color:#333;filter:none}
 body.v2 .hero-figure{box-shadow:none}
 body.v2 .hero-figure img,body.v2 .split-photo img,body.v2 .person-photo{max-height:none;object-fit:cover!important}   /* site.css's old print rule contains them */
 body.v2 .logo-strip .logo-viewport{-webkit-mask-image:none!important;mask-image:none!important;overflow:visible!important}   /* beats .is-moving */
 body.v2 .logo-strip .logo-track{animation:none!important;transform:none!important;flex:1!important;flex-wrap:wrap!important;justify-content:center!important;padding-right:0!important}
 body.v2 .logo-strip .logo-copy{display:none!important}
 body.v2 main details::details-content{content-visibility:visible}
 body.v2 .faq-item summary span{display:none}
 body.v2 [data-explorer] .explorer-panel[hidden]{display:block!important}
 body.v2 main .explorer.is-tabbed .explorer-panel{border-top:1px solid var(--line);padding-top:24px}
 body.v2 .explorer.is-tabbed .explorer-panel>h3{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto;white-space:normal}
 body.v2 .card,body.v2 .family-block,body.v2 .scenario,body.v2 .three-parts li,body.v2 .faq-item,body.v2 .deliver-block,body.v2 .contact-form{break-inside:avoid}
 body.v2 h2,body.v2 h3{break-after:avoid}
 body.v2 a{color:inherit}
}
