@charset "UTF-8";
/* ==========================================================================
   LANTEK Computers - HOME PAGE
   Written 15 September 2026, replacing the home page entirely. Every word on
   the page is the old page's; nothing else is.

   THE WORLD

   A night shift on an operations floor. Dark, but dark with depth rather than
   the flat near-black the old page used: photography carries the depth, and
   type sits on top of it at a size the old page never reached. Full-bleed
   media breaks the 1200px container on purpose. Where the eye rests, it rests
   on a picture of real equipment; where it reads, the ground is quiet.

   WHAT THIS DELIBERATELY DOES NOT DO, because the old page did all of it:

     no eyebrow or kicker above a heading   the heading carries itself
     no 01 / 02 / 03 section numbers        the order is not information
     no monospace as a costume              mono is for measurement only
     no gradient-filled text                weight and size do the emphasis
     no grid of identical icon-and-text cards as the page structure
     no entrance animation on every section

   MOTION. One authored moment: the hero. The video runs, the headline is
   already there, and nothing else on the page animates on arrival. What feels
   like movement further down is scroll position against sticky media, which
   is the browser compositing rather than a timeline, so it cannot stutter and
   it costs nothing on a phone.

   PHOTOGRAPHY. Everything is graded to one blue. The source images are a
   green-lit rack, an orange-lit patch panel, a teal circuit board and gold
   city lights; ungraded they read as four different companies. Each is
   desaturated and re-tinted through a blend layer, so the page has one
   palette and new photography drops in without a colour conversation.

   All of it is scoped .lkh-, so nothing here can reach the other 84 pages.
   ========================================================================== */

/* --------------------------------------------------------------------------
   0. SMOOTH SCROLL, and the browser surfaces nobody designs
   -------------------------------------------------------------------------- */
html{scroll-behavior:smooth}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}}

/* The parts of the page we did not draw still belong to the design. A default
   caret, a default selection and a default scrollbar are the cheapest tell
   that a page was assembled rather than built. */
.lk ::selection{background:var(--lk-blue);color:#fff}
.lkh{caret-color:var(--lk-cyan);scrollbar-color:var(--lk-blue-lo) var(--lk-void)}
.lkh :focus-visible{
  outline:2px solid var(--lk-cyan);outline-offset:3px;border-radius:2px;
}

/* --------------------------------------------------------------------------
   1. THE GRADE
   One filter and one blend layer, applied everywhere a photograph appears.
   -------------------------------------------------------------------------- */
.lkh-ph{position:relative;overflow:hidden;background:var(--lk-void);isolation:isolate}

/* The picture is a background on its own layer rather than an <img>, for the
   same reason the partner plates and the seven service heroes are: only the
   theme knows its own URI, so the url() is printed by lantek_media_css() in
   functions.php for WordPress and by mediaCss() in brand.cjs for the preview,
   both off one directory listing. Nothing in this file or in the markup knows
   a file path, and adding an image is dropping a file in the folder.

   A separate layer, not .lkh-ph itself, because `filter` on an element also
   filters its pseudo-elements, and the tint and the scrim must not be
   desaturated along with the photograph. */
.lkh-ph__i,
.lkh-ph > video{
  position:absolute;inset:0;width:100%;height:100%;
  background-size:cover;background-position:center;background-repeat:no-repeat;
  object-fit:cover;display:block;
  /* Desaturate first. Tinting a colour photograph leaves its original hue
     fighting the tint; tinting a grey one does not. */
  filter:grayscale(1) contrast(1.08) brightness(.92);
}
/* The tint. mix-blend-mode:color takes the hue and saturation of this layer
   and the luminance of the photograph underneath, which is a duotone rather
   than a blue sheet laid over the top. */
.lkh-ph::before{
  content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:linear-gradient(176deg,#1D6FB4 0%,#0A4F86 46%,#0B2038 100%);
  mix-blend-mode:color;
}
/* The scrim. Separate from the tint because legibility and colour are two
   different jobs and tuning them together is how text ends up at 3.9:1. */
.lkh-ph::after{
  content:"";position:absolute;inset:0;z-index:2;pointer-events:none;
  background:
    linear-gradient(180deg,rgba(4,6,11,.30) 0%,rgba(4,6,11,.58) 55%,rgba(4,6,11,.90) 100%),
    radial-gradient(120% 90% at 18% 50%,rgba(4,6,11,.72),transparent 68%);
}
/* Two images are brighter than the rest and need more scrim, not more tint. */
.lkh-ph--heavy::after{
  background:
    linear-gradient(180deg,rgba(4,6,11,.52) 0%,rgba(4,6,11,.72) 50%,rgba(4,6,11,.93) 100%),
    radial-gradient(120% 90% at 20% 50%,rgba(4,6,11,.80),transparent 70%);
}
/* Where a band carries no copy the scrim comes almost all the way off: the
   photograph is the content there. */
.lkh-ph--bare::after{
  background:linear-gradient(180deg,rgba(4,6,11,.55),rgba(4,6,11,.25) 40%,rgba(4,6,11,.72));
}

/* --------------------------------------------------------------------------
   2. HERO
   -------------------------------------------------------------------------- */
.lkh-hero{
  position:relative;
  /* svh, not vh. On a phone, vh is the viewport with the browser chrome
     retracted, so a 100vh hero is cropped by the address bar on arrival,
     which is exactly when it matters. */
  min-height:100svh;
  /* The column is pinned. Without grid-template-columns the single implicit
     column is sized to max-content, and the partner marquee inside the hero
     is a 3,964px track that never wraps: the whole hero laid itself out four
     times wider than the viewport and pushed the headline off the right edge.
     minmax(0,1fr) is the fix, and the 0 is the half that matters. */
  display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:1fr auto;
  padding-top:var(--lk-nav-h);
  background:var(--lk-void);overflow:clip;
}
.lkh-hero__bg{position:absolute;inset:0;z-index:0}
.lkh-hero__bg::after{
  /* LIGHTENED 15 September 2026, after measuring it. The owner asked where
     the hero video was; it was playing the whole time and the scrim had
     buried it. Two screenshots of the middle of the hero 2.2 seconds apart
     differed by ZERO bytes: 94% black over the left half and 80% at the
     38% stop meant the footage was mathematically invisible.

     It now runs 72% where the headline starts and opens to 8% across the
     right two thirds, which is where the console sits on glass anyway. The
     type keeps its own text-shadow, so legibility rides on that rather than
     on painting the picture out. */
  background:
    linear-gradient(90deg,rgba(4,6,11,.72) 0%,rgba(4,6,11,.52) 40%,rgba(4,6,11,.10) 70%,rgba(4,6,11,.08) 100%),
    linear-gradient(180deg,rgba(4,6,11,.45) 0%,transparent 22%,transparent 60%,rgba(4,6,11,.92) 100%);
}
.lkh-hero__in{
  position:relative;z-index:3;align-self:center;
  padding-block:clamp(40px,7vh,88px);
}
.lkh-hero__h{
  font-size:clamp(3.1rem,8.4vw,6rem);
  letter-spacing:-.05em;line-height:.94;font-weight:600;
  max-width:16ch;text-wrap:balance;color:#fff;
  /* The type sits on moving footage. A shadow is not decoration here, it is
     what keeps the descenders legible when a bright frame passes under them. */
  text-shadow:0 2px 40px rgba(4,6,11,.85),0 1px 3px rgba(4,6,11,.6);
}
.lkh-hero__h b{font-weight:600;color:var(--lk-sky)}
.lk .lkh-hero__p{
  margin-top:clamp(20px,2.4vw,30px);
  font-size:clamp(1.08rem,1.5vw,1.3rem);line-height:1.56;
  color:#D5E3F2;max-width:46ch;
  text-shadow:0 1px 24px rgba(4,6,11,.9);
}
.lkh-hero__act{display:flex;flex-wrap:wrap;gap:14px;margin-top:clamp(26px,3vw,38px)}
.lk .lkh-hero__note{
  margin-top:20px;font-size:13.5px;line-height:1.5;color:#9FB3CE;max-width:40ch;
  text-shadow:0 1px 18px rgba(4,6,11,.95);
}
.lkh-hero__note b{color:#D5E3F2;font-weight:600}

/* The scroll cue. A line that draws itself downward, once every three
   seconds, and stops entirely for anyone who has asked motion to stop. */
.lkh-cue{
  position:absolute;left:50%;bottom:clamp(96px,12vh,150px);z-index:3;
  transform:translateX(-50%);
  width:1px;height:56px;background:rgba(255,255,255,.16);overflow:hidden;
}
.lkh-cue::after{
  content:"";position:absolute;inset:0;background:var(--lk-cyan);
  transform:translateY(-100%);
  animation:lkh-cue 3s var(--lk-ease) infinite;
}
@keyframes lkh-cue{
  0%{transform:translateY(-100%)}
  45%{transform:translateY(0)}
  90%,100%{transform:translateY(100%)}
}
@media(prefers-reduced-motion:reduce){
  .lkh-cue::after{animation:none;transform:translateY(0);opacity:.5}
}
@media(max-height:680px){.lkh-cue{display:none}}

/* --------------------------------------------------------------------------
   3. FULL-BLEED STATEMENT BAND
   The page's punctuation. One picture, one sentence, nothing else.
   -------------------------------------------------------------------------- */
.lkh-band{
  position:relative;min-height:clamp(420px,72vh,760px);
  /* Same pinned column as the hero, and for the same reason. */
  display:grid;grid-template-columns:minmax(0,1fr);align-items:center;
  overflow:clip;background:var(--lk-void);
}
.lkh-band__bg{position:absolute;inset:0;z-index:0}
.lkh-band__in{position:relative;z-index:3;padding-block:clamp(64px,9vw,120px)}
.lk .lkh-band__h{
  font-size:clamp(2.2rem,5.6vw,4.4rem);
  letter-spacing:-.045em;line-height:1.02;font-weight:600;color:#fff;
  max-width:19ch;text-wrap:balance;
  text-shadow:0 2px 44px rgba(4,6,11,.8);
}
.lk .lkh-band__p{
  margin-top:clamp(18px,2vw,26px);
  font-size:clamp(1.02rem,1.4vw,1.2rem);line-height:1.6;
  color:#C6D6E8;max-width:52ch;text-shadow:0 1px 20px rgba(4,6,11,.9);
}
.lkh-band--center .lkh-band__h,
.lkh-band--center .lkh-band__p{margin-inline:auto;text-align:center}
.lkh-band--center .lkh-band__h{max-width:22ch}

/* The image holds still and the copy scrolls over it. position:sticky, not a
   scroll handler: the compositor owns it, so it cannot drop a frame, and it
   needs no JavaScript at all. background-attachment:fixed would do the same
   thing on a desktop and nothing whatsoever on iOS. */
.lkh-band--hold .lkh-band__bg{
  position:sticky;top:0;height:100svh;margin-bottom:-100svh;
}
.lkh-band--hold{min-height:clamp(560px,104vh,1100px);align-items:center}
@media(prefers-reduced-motion:reduce){
  .lkh-band--hold .lkh-band__bg{position:absolute;height:auto;inset:0;margin:0}
  .lkh-band--hold{min-height:clamp(420px,72vh,760px)}
}

/* --------------------------------------------------------------------------
   4. SECTION SHELL
   -------------------------------------------------------------------------- */
.lkh-sec{position:relative;padding:clamp(80px,10vw,150px) 0;background:var(--lk-black)}
.lkh-sec--void{background:var(--lk-void)}
.lkh-sec--panel{background:var(--lk-panel)}
.lkh-sec--line{border-top:1px solid var(--lk-line-2)}

/* The opening statement of a section. Bigger than .lk-h2 and allowed to run
   to three lines, because on this page a section heading is a statement
   rather than a label for what follows. */
.lkh-h{
  font-size:clamp(2rem,4.8vw,3.5rem);
  letter-spacing:-.042em;line-height:1.04;font-weight:600;
  color:#fff;max-width:17ch;text-wrap:balance;
}
.lkh-h--wide{max-width:24ch}
.lk .lkh-lead{
  margin-top:clamp(16px,1.8vw,24px);
  font-size:clamp(1.05rem,1.4vw,1.22rem);line-height:1.62;
  color:var(--lk-ink-2);max-width:62ch;
}
.lk .lkh-p{margin-top:18px;font-size:16.5px;line-height:1.66;color:var(--lk-ink-2);max-width:68ch}
.lk .lkh-p + .lkh-p{margin-top:14px}
.lkh-say{
  font-size:clamp(1.2rem,2.4vw,1.7rem);letter-spacing:-.03em;line-height:1.3;
  font-weight:600;color:#fff;max-width:26ch;
}

/* --------------------------------------------------------------------------
   5. SPLIT
   Copy on one side, media on the other, at a ratio that is not 50/50.
   -------------------------------------------------------------------------- */
.lkh-split{display:grid;gap:clamp(32px,5vw,72px);align-items:center}
@media(min-width:900px){
  .lkh-split{grid-template-columns:minmax(0,1.05fr) minmax(0,1fr)}
  .lkh-split--flip > :first-child{order:2}
}
.lkh-split__ph{
  position:relative;aspect-ratio:4/5;border:1px solid var(--lk-line);
  border-radius:var(--lk-r-lg);
}
@media(max-width:899px){.lkh-split__ph{aspect-ratio:16/10}}

/* --------------------------------------------------------------------------
   6. FINDINGS
   A numbered rule down the left, a statement, a reading. Not a card.
   -------------------------------------------------------------------------- */
.lkh-finds{display:grid;gap:0;border-top:1px solid var(--lk-line-2)}
.lkh-find{
  display:grid;gap:8px;padding:clamp(24px,3vw,34px) 0;
  border-bottom:1px solid var(--lk-line-2);
}
.lkh-find__t{font-size:clamp(1.15rem,1.9vw,1.42rem);font-weight:600;letter-spacing:-.028em;color:#fff}
.lk .lkh-find__d{font-size:16px;line-height:1.62;color:var(--lk-ink-2);max-width:64ch}

/* --------------------------------------------------------------------------
   7. LAYERS
   The six controls. A list that reads as a stack, against held media.
   -------------------------------------------------------------------------- */
.lkh-layers{display:grid;gap:1px;background:var(--lk-line-2);border:1px solid var(--lk-line-2);border-radius:var(--lk-r-lg);overflow:hidden}
.lkh-layer{
  /* No backdrop-filter. Six of these over a sticky photograph, plus four on
     the facts band and one on the hero panel, took the home page from 26
     frames in 400ms to 12: every blurred layer is a separate composited pass
     and they stack. The picture underneath is already carrying a scrim, so
     the blur was buying nothing anybody can see. Measured, not guessed. */
  background:rgba(7,10,17,.90);
  padding:clamp(20px,2.4vw,28px) clamp(20px,2.6vw,30px);
  display:grid;gap:7px;transition:background var(--lk-fast) var(--lk-ease);
}
.lkh-layer:hover{background:rgba(19,28,46,.9)}
.lkh-layer__t{font-size:clamp(1.05rem,1.6vw,1.26rem);font-weight:600;letter-spacing:-.026em;color:#fff}
.lk .lkh-layer__d{font-size:15.5px;line-height:1.58;color:var(--lk-ink-2);max-width:56ch}
.lkh-layer--key{background:rgba(10,79,134,.24)}
.lkh-layer--key:hover{background:rgba(10,79,134,.32)}
.lkh-layer--key .lkh-layer__t{color:var(--lk-ice)}

/* --------------------------------------------------------------------------
   8. STORIES
   Four real attack patterns, each led by its own frame of the same footage.
   -------------------------------------------------------------------------- */
.lkh-stories{display:grid;gap:clamp(16px,2vw,24px)}
@media(min-width:760px){.lkh-stories{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(min-width:1180px){.lkh-stories{grid-template-columns:repeat(4,minmax(0,1fr))}}
.lkh-story{
  position:relative;display:flex;flex-direction:column;justify-content:flex-end;
  min-height:clamp(320px,34vw,420px);overflow:clip;
  border:1px solid var(--lk-line-2);border-radius:var(--lk-r-lg);
  text-decoration:none;isolation:isolate;
  transition:border-color var(--lk-med) var(--lk-ease);
}
.lkh-story:hover{border-color:var(--lk-line-3)}
.lkh-story__bg{position:absolute;inset:0;z-index:0}
.lkh-story__bg .lkh-ph__i{
  transition:transform 1.1s var(--lk-ease),filter var(--lk-med) var(--lk-ease);
  transform:scale(1.02);
}
.lkh-story:hover .lkh-story__bg .lkh-ph__i{transform:scale(1.09);filter:grayscale(1) contrast(1.08) brightness(1.02)}
.lkh-story__in{position:relative;z-index:3;padding:clamp(20px,2.2vw,26px)}
.lkh-story__t{font-size:clamp(1.1rem,1.5vw,1.28rem);font-weight:600;letter-spacing:-.026em;color:#fff}
.lk .lkh-story__d{margin-top:9px;font-size:14.8px;line-height:1.55;color:#C6D6E8}
.lkh-story__go{
  margin-top:16px;display:inline-flex;align-items:center;gap:8px;
  font-size:14px;font-weight:600;color:var(--lk-sky);
}
.lkh-story__go svg{width:15px;height:15px;transition:transform var(--lk-med) var(--lk-ease)}
.lkh-story:hover .lkh-story__go svg{transform:translateX(5px)}

/* --------------------------------------------------------------------------
   9. FACTS
   Four plain facts about the business, on a photograph rather than in boxes.
   -------------------------------------------------------------------------- */
.lkh-facts{display:grid;gap:1px;background:rgba(255,255,255,.09)}
@media(min-width:680px){.lkh-facts{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(min-width:1060px){.lkh-facts{grid-template-columns:repeat(4,minmax(0,1fr))}}
.lkh-fact{
  background:rgba(4,6,11,.80);
  padding:clamp(26px,3vw,36px) clamp(22px,2.4vw,30px);
}
.lkh-fact__n{
  font-size:clamp(1.9rem,3.6vw,2.7rem);font-weight:600;letter-spacing:-.05em;
  line-height:1;color:var(--lk-ice);
  /* No tabular-nums here. These are not a column of figures to be compared,
     and a tabular full stop gets a digit-width cell of its own: "NIST CSF 2.0"
     set itself as "NIST CSF 2 . 0". */
}
.lk .lkh-fact__d{margin-top:14px;font-size:15px;line-height:1.55;color:#C6D6E8;max-width:26ch}

/* --------------------------------------------------------------------------
   10. CLOSE
   -------------------------------------------------------------------------- */
.lkh-close{position:relative;overflow:clip;background:var(--lk-void)}
.lkh-close__bg{position:absolute;inset:0;z-index:0}
/* padding-block. The same trap as .lk-foot__in: this class sits on the
   element that carries .lk-wrap, and .lk-wrap gets its side gutter from
   padding-inline. A shorthand here wrote that gutter to zero, so the closing
   line and its buttons sat against both bezels on a phone. */
.lkh-close__in{position:relative;z-index:3;padding-block:clamp(88px,11vw,170px);text-align:center}
.lk .lkh-close__h{
  font-size:clamp(2.3rem,6vw,4.6rem);letter-spacing:-.048em;line-height:1;
  font-weight:600;color:#fff;max-width:18ch;margin-inline:auto;text-wrap:balance;
  text-shadow:0 2px 40px rgba(4,6,11,.8);
}
.lk .lkh-close__p{
  margin:clamp(20px,2.4vw,30px) auto 0;font-size:clamp(1.05rem,1.4vw,1.22rem);
  line-height:1.6;color:#C6D6E8;max-width:50ch;text-shadow:0 1px 20px rgba(4,6,11,.9);
}
.lkh-close__act{display:flex;flex-wrap:wrap;gap:14px;justify-content:center;margin-top:clamp(28px,3vw,40px)}
.lk .lkh-close__fine{margin-top:22px;font-size:13.5px;color:#9FB3CE}

/* --------------------------------------------------------------------------
   11. BUTTONS on media
   The house button is built for a panel. On a photograph it needs a floor
   under it, or the wash reads as a smudge over a bright frame.
   -------------------------------------------------------------------------- */
.lkh-btn{
  display:inline-flex;align-items:center;gap:10px;
  padding:16px 26px;border-radius:var(--lk-r);
  font-size:15.5px;font-weight:600;letter-spacing:-.012em;
  text-decoration:none;border:1px solid transparent;
  transition:transform var(--lk-fast) var(--lk-ease),
             background var(--lk-fast) var(--lk-ease),
             border-color var(--lk-fast) var(--lk-ease),
             box-shadow var(--lk-fast) var(--lk-ease);
}
.lkh-btn svg{width:16px;height:16px;flex:none}
.lkh-btn:active{transform:translateY(1px)}
.lkh-btn--go{
  background:var(--lk-blue);color:#fff;
  box-shadow:0 1px 0 rgba(255,255,255,.10) inset,0 14px 34px -14px rgba(15,118,196,.9);
}
.lkh-btn--go:hover{
  background:var(--lk-blue-hover);
  box-shadow:0 1px 0 rgba(255,255,255,.16) inset,0 0 0 1px rgba(32,187,252,.42),0 20px 50px -14px rgba(32,187,252,.95);
}
.lkh-btn--ghost{
  background:rgba(7,10,17,.5);backdrop-filter:blur(12px);
  border-color:rgba(255,255,255,.22);color:#fff;
}
.lkh-btn--ghost:hover{background:rgba(19,28,46,.72);border-color:var(--lk-line-3)}

/* --------------------------------------------------------------------------
   12. THE PHOTO CAPTIONS WERE REMOVED, 15 September 2026
   They read "Stock photography. Not LANTEK premises." under every band, and
   the owner asked for them off. That is the right call and they should not
   have been there: decorative stock photography behind copy makes no claim,
   and nothing on this site captions an image as LANTEK's own or implies it.
   A disclaimer under a picture that claims nothing reads as a watermark.

   WHAT STAYS, and it is a different thing entirely: .lkh-hero__ill, the
   "Illustration of a monitored environment" line under the console. That one
   qualifies FIGURES rather than a photograph, and a console of numbers with
   no such line reads as live telemetry from a real client estate. Provenance
   for every image is still on file in assets/media/credits.json.
   -------------------------------------------------------------------------- */

/* --------------------------------------------------------------------------
   13. FULL BLEED
   The container is 1200px. Media is not.
   -------------------------------------------------------------------------- */
.lkh-bleed{
  /* Not `margin-inline:calc(50% - 50vw)`: 100vw includes the scrollbar on a
     desktop, so that trick overflows by its width and the page scrolls
     sideways. Anchoring to the padding box instead is exact. */
  width:100%;
}

/* --------------------------------------------------------------------------
   14. HERO INTERNALS
   -------------------------------------------------------------------------- */
.lkh-hero__grid{
  display:grid;
  /* One column below 1040px, and it has to be said out loud. A grid with no
     template gets an IMPLICIT track, and implicit tracks are auto, which is
     max-content: the deck inside measured 785px and the column grew to fit
     it inside a 350px container. The section clips, so nothing scrolled
     sideways and the headline simply lost its right-hand words on every
     phone. minmax(0,1fr) is the column saying it may be narrower than what
     is inside it. */
  grid-template-columns:minmax(0,1fr);
  gap:clamp(34px,5vw,64px);align-items:center;
}
@media(min-width:1040px){
  .lkh-hero__grid{grid-template-columns:minmax(0,1.08fr) minmax(0,.92fr)}
}
.lkh-hero__panel{position:relative}

/* The proof panel on glass. This is the one place on the page where blur is
   doing a job rather than decorating: the footage under it is a patch panel,
   the log on top of it is about that patch panel, and letting one read through
   the other is the whole argument. Opaque, it would be a box on a photograph. */
.lkh-hero__panel .lk-soc{
  background:rgba(7,10,17,.62);
  backdrop-filter:blur(22px) saturate(1.1);
  -webkit-backdrop-filter:blur(22px) saturate(1.1);
  border-color:rgba(143,216,255,.18);
  box-shadow:0 1px 0 rgba(255,255,255,.07) inset,0 40px 90px -40px rgba(4,6,11,.95);
}
/* Safari and Firefox without backdrop-filter get an opaque panel rather than
   an unreadable transparent one. */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .lkh-hero__panel .lk-soc{background:rgba(7,10,17,.94)}
}
.lk .lkh-hero__ill{
  margin-top:12px;text-align:right;font-size:11px;letter-spacing:.04em;
  /* Same fix as .lkh-cap: .40 measured 3.72:1 at 11px. */
  color:rgba(255,255,255,.64);text-shadow:0 1px 10px rgba(4,6,11,.9);
}
@media(max-width:1039px){
  .lkh-hero{min-height:auto}
  .lkh-hero__in{padding-block:clamp(48px,9vh,88px)}
}

/* The partner band, pinned to the hero's bottom edge and full bleed. */
.lkh-hero__band{position:relative;z-index:3;align-self:end;padding-bottom:clamp(18px,2.4vw,28px)}
.lk .lkh-parts__h{
  font-size:12px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:rgba(255,255,255,.52);margin-bottom:14px;
  text-shadow:0 1px 12px rgba(4,6,11,.95);
}

/* The hero video, inserted by heroVideo() in lantek.js over the poster. */
.lkh-hero__bg video{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:0;
  /* Brighter than the stills. A photograph behind copy can afford to sit back;
     the one moving thing on the page cannot, or nobody sees that it moves. */
  filter:grayscale(1) contrast(1.12) brightness(1.22);
  opacity:0;transition:opacity 1.1s var(--lk-ease);
}
.lkh-hero__bg video.is-on{opacity:1}

/* --------------------------------------------------------------------------
   15. THE THREE ANSWERS
   Under the close, on the same photograph. Three columns of plain text, no
   boxes: these are answers to questions, and a box around an answer is the
   thing that makes a page look like a form rather than a conversation.
   -------------------------------------------------------------------------- */
.lkh-answers{
  position:relative;z-index:3;
  display:grid;gap:clamp(28px,3.4vw,48px);
  padding-bottom:clamp(72px,9vw,130px);
  border-top:1px solid rgba(255,255,255,.12);padding-top:clamp(40px,5vw,64px);
}
@media(min-width:860px){.lkh-answers{grid-template-columns:repeat(3,minmax(0,1fr))}}
.lkh-answer__t{font-size:clamp(1.05rem,1.5vw,1.2rem);font-weight:600;letter-spacing:-.026em;color:#fff}
.lk .lkh-answer__d{margin-top:11px;font-size:15.5px;line-height:1.62;color:#C6D6E8;max-width:44ch}
.lk .lkh-answer__d a{color:var(--lk-sky);text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px}
.lk .lkh-answer__d a:hover{color:var(--lk-ice)}

/* --------------------------------------------------------------------------
   16. THE RE-SHELLED SECTIONS
   Four sections kept their drawings and took the new voice. These are the
   handful of places where the old components need to sit inside the new
   rhythm rather than the old one.
   -------------------------------------------------------------------------- */
.lkh-sec .lk-head{max-width:64ch;margin-bottom:clamp(38px,5vw,62px)}
.lkh-sec .lk-head .lkh-h{margin:0 0 18px}
.lk .lkh-sec .lk-cols{gap:clamp(32px,4.4vw,64px)}

/* The old grid of identical cards is gone from the page structure, but three
   sections still use .lk-card for a quote and a diagram frame, which is what
   a card is actually for. They keep the house treatment. */
.lkh-sec .lk-card{background:var(--lk-panel-2)}

/* The 168-hour graph and the two diagrams sit on the dark ground again. */
.lkh-sec .lk-dia,
.lkh-sec .lk-graph{background:var(--lk-panel);border-color:var(--lk-line)}

/* --------------------------------------------------------------------------
   17. LINKS INSIDE BAND COPY
   -------------------------------------------------------------------------- */
.lk .lkh-band__p a{
  color:var(--lk-sky);text-decoration:underline;
  text-underline-offset:4px;text-decoration-thickness:1px;
  text-decoration-color:rgba(79,180,245,.45);
  transition:color var(--lk-fast) var(--lk-ease),text-decoration-color var(--lk-fast) var(--lk-ease);
}
.lk .lkh-band__p a:hover{color:var(--lk-ice);text-decoration-color:var(--lk-ice)}

/* A held band that carries a list rather than one sentence needs its content
   left-aligned and given room, not centred in the viewport. */
.lkh-band--hold .lkh-band__in{padding-block:clamp(80px,10vw,150px)}

/* --------------------------------------------------------------------------
   18. BLOCKIFY THE SPANS
   The story card and the fact tile are built from <span>, because a card that
   is one big <a> cannot legally contain a <div>. A span is inline, so
   margin-top does nothing on it and the title runs straight into the
   description: "The compromised vendor A real invoice, from a real supplier".
   Flex does the stacking and the spacing, which an inline element cannot
   ignore the way it ignores a margin.
   -------------------------------------------------------------------------- */
.lkh-story__in{display:flex;flex-direction:column;align-items:flex-start;gap:10px}
.lkh-story__t,
.lk .lkh-story__d{display:block;margin:0}
.lkh-story__go{margin-top:6px}
.lkh-fact{display:flex;flex-direction:column;gap:14px;align-items:flex-start}
.lkh-fact__n{display:block}
.lk .lkh-fact__d{margin:0}
.lkh-layer__t,.lkh-find__t{display:block}

/* --------------------------------------------------------------------------
   19. LOAD COST
   The page carries about 10 MB of media, and measured on 15 September 2026 it
   reached 12 frames in 400ms while that was arriving, against 27 on
   about:blank. Half a second later it was at 26, so the frame rate is fine and
   the ARRIVAL is what costs.

   content-visibility:auto tells the browser not to lay out or paint a band
   until it is near the viewport, which is most of this page on first load.
   contain-intrinsic-size is not optional alongside it: without a guess at the
   height, every skipped band collapses to nothing, the scrollbar jumps as each
   one is reached, and an anchor link lands in the wrong place.

   Not applied to the hero, which is the one thing that must paint immediately.
   -------------------------------------------------------------------------- */
/* content-visibility:auto was here on 15 September 2026 and was REMOVED the
   same day, because it was measured and it did not earn its place.

   It was added on the theory that a 10 MB page was slow to arrive. The real
   cause turned out to be eleven stacked backdrop-filter layers, and a probe
   that was reading the load rather than the frame rate. With the blurs gone
   and the probe settled, the page runs at 25 frames in 400ms on arrival and
   26 once settled, against 27 on about:blank, WITHOUT it.

   What it cost: contain-intrinsic-size is a guess at the height of something
   that has not been laid out, and one number cannot be right for six bands.
   Every off-screen section reported 900px, the document measured 16,854px
   when it is really 19,474px, and #start reported 900px when it is 1,226px.
   That is an anchor landing in the wrong place and a scrollbar that jumps as
   you scroll, traded for a frame rate that was already fine.

   Do not put it back without measuring first, and measure after the page has
   finished arriving rather than during. */

/* --------------------------------------------------------------------------
   20. NARROW
   Two buttons of different widths stacked on top of each other read as a
   mistake rather than as a hierarchy. On one column they go full width and the
   hierarchy is carried by the fill, which is where it belongs.
   -------------------------------------------------------------------------- */
@media(max-width:560px){
  .lkh-hero__act,.lkh-close__act{flex-direction:column;align-items:stretch}
  .lkh-hero__act .lkh-btn,.lkh-close__act .lkh-btn{justify-content:center;width:100%}
  .lk .lkh-cap{position:static;text-align:left;margin-top:10px}
  .lkh-band .lkh-cap,.lkh-close .lkh-cap{display:none}
}

/* ==========================================================================
   21. THE CONSOLE
   The hero's dashboard. One blurred panel, not eleven: the backdrop-filter
   here is doing real work, because the footage underneath it is a patch panel
   and the log on top of it is about that patch panel. Everything else on the
   page that used blur had it removed after it cost half the frame rate.
   ========================================================================== */
.lkh-con{
  border:1px solid rgba(143,216,255,.20);border-radius:var(--lk-r-lg);
  background:rgba(7,10,17,.68);
  backdrop-filter:blur(24px) saturate(1.12);
  -webkit-backdrop-filter:blur(24px) saturate(1.12);
  box-shadow:0 1px 0 rgba(255,255,255,.08) inset,0 50px 110px -46px rgba(4,6,11,.98);
  overflow:hidden;
}
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .lkh-con{background:rgba(7,10,17,.95)}
}

.lkh-con__bar{
  display:flex;align-items:center;gap:10px;
  padding:13px 16px;border-bottom:1px solid var(--lk-line-2);
  background:rgba(22,35,60,.42);
}
.lkh-con__t{
  font-size:11.5px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:var(--lk-ink-2);
}
.lkh-con__bar .lk-soc__clock{margin-left:auto}

/* --- the top row: a ring beside four states --- */
.lkh-con__top{
  display:grid;gap:1px;background:var(--lk-line-2);
  border-bottom:1px solid var(--lk-line-2);
}
@media(min-width:420px){.lkh-con__top{grid-template-columns:auto minmax(0,1fr)}}

.lkh-ring{
  position:relative;display:grid;place-items:center;
  padding:18px 20px;background:var(--lk-panel);
  width:100%;aspect-ratio:auto;
}
.lkh-ring svg{width:84px;height:84px;display:block}
.lkh-ring__t{fill:none;stroke:rgba(255,255,255,.09);stroke-width:7}
.lkh-ring__v{
  fill:none;stroke:var(--lk-cyan);stroke-width:7;stroke-linecap:round;
  filter:drop-shadow(0 0 7px rgba(32,187,252,.55));
}
/* The figure sits inside the donut and the label sits under the whole thing.
   Both inside a 70px hole put "ESTATE COVERED" across the stroke: a label
   that has to be shorter than the artwork is a label in the wrong place. */
.lkh-ring{grid-template-rows:auto auto;gap:9px;place-items:center}
.lkh-ring__svgwrap{position:relative;display:grid;place-items:center}
.lkh-ring__in{position:absolute;inset:0;display:grid;place-content:center;text-align:center}
.lkh-ring__n{
  font-size:21px;font-weight:600;letter-spacing:-.04em;color:#fff;
  font-variant-numeric:tabular-nums;line-height:1;
}
.lkh-ring__l{
  font-size:9.5px;letter-spacing:.11em;text-transform:uppercase;
  color:var(--lk-ink-3);white-space:nowrap;text-align:center;
}

.lkh-tiles{display:grid;gap:1px;background:var(--lk-line-2)}
@media(min-width:340px){.lkh-tiles{grid-template-columns:repeat(2,minmax(0,1fr))}}
.lkh-tile{
  background:var(--lk-panel);padding:13px 15px;
  display:grid;grid-template-columns:auto 1fr;gap:3px 9px;align-items:center;
}
.lkh-tile__dot{
  grid-row:span 2;width:7px;height:7px;border-radius:50%;
  background:var(--lk-ok);box-shadow:0 0 0 3px rgba(31,191,143,.14);
  animation:lkh-pulse 3.4s var(--lk-ease) infinite;
}
.lkh-tile__dot--w{background:var(--lk-warn);box-shadow:0 0 0 3px rgba(242,163,60,.16)}
@keyframes lkh-pulse{
  0%,72%,100%{transform:scale(1);opacity:1}
  84%{transform:scale(1.45);opacity:.55}
}
@media(prefers-reduced-motion:reduce){.lkh-tile__dot{animation:none}}
.lkh-tile__k{font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--lk-ink-3)}
.lkh-tile__v{font-size:13px;font-weight:500;color:var(--lk-ink);line-height:1.25}

/* --- the chart --- */
.lkh-con__chart{padding:16px 16px 12px;border-bottom:1px solid var(--lk-line-2)}
.lkh-con__chead{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:9px}
.lkh-con__ct{font-size:11px;letter-spacing:.09em;text-transform:uppercase;color:var(--lk-ink-3)}
.lkh-con__cn{
  font-size:12px;font-weight:600;color:var(--lk-sky);
  font-variant-numeric:tabular-nums;white-space:nowrap;
}
/* .lk .lkh-chart, not .lkh-chart. `.lk img,.lk svg{height:auto}` in
   lantek.css is 0-1-1 and a bare component class is 0-1-0, so the 58px lost
   and the chart took its intrinsic height instead: viewBox 100x34 with
   preserveAspectRatio:none at 960px wide is 326px tall. It was hidden for as
   long as the deck was 600px wide, because 204px fitted inside the slide
   min-height of 320 and nothing looked wrong. Centring the hero widened the
   deck to 960 and the slide grew to 456px with its content in a band in the
   middle. Fourteenth instance of this trap in this codebase. */
.lk .lkh-chart{width:100%;height:58px;display:block;overflow:visible}
/* The fill no longer fades in on its own: charts() wipes the whole svg in
   with clip-path, so the line and the area arrive together. */
.lkh-chart__f{opacity:1}
/* .lkh-chart__h, the head marker, went on 16 September 2026 along with its
   pulse. Under preserveAspectRatio="none" a circle of r=2 in a 100x34
   viewBox rendered in a 407x128 box is an ELLIPSE 16px by 15px, which is a
   blob on the end of a 1.4px line rather than a marker. Nothing references
   it now; the guarded head branch in charts() is left because that helper is
   generic and a chart elsewhere may want one back. */
.lkh-con__axis{
  display:flex;justify-content:space-between;margin-top:5px;
  font-size:9.5px;letter-spacing:.06em;color:var(--lk-ink-4);
}

/* --- the feed, arriving and leaving --- */
.lkh-con .lk-soc__body{max-height:none}
.lk-soc__row{transition:opacity .4s var(--lk-ease),transform .4s var(--lk-ease)}
.lk-soc__row.is-new{opacity:0;transform:translateY(-8px)}
.lk-soc__row.is-out{opacity:0;transform:translateY(8px)}
@media(prefers-reduced-motion:reduce){
  .lk-soc__row,.lk-soc__row.is-new,.lk-soc__row.is-out{transition:none;opacity:1;transform:none}
}

@media(max-width:1039px){.lkh-con{max-width:560px}}

/* ==========================================================================
   22. THE NIST WHEEL, RUNNING
   ========================================================================== */

/* The sweep. transform-box:fill-box so the rotation origin is the circle's own
   box rather than the SVG's, which is the difference between a ring turning
   and an arc orbiting somewhere off to the left. */
.lkh-nist__sweep{
  transform-box:fill-box;transform-origin:center;
  animation:lkh-sweep 8s linear infinite;
}
@keyframes lkh-sweep{to{transform:rotate(360deg)}}

/* The readout at the centre. Both lines are replaced in place every 2.6
   seconds, so they get a transition rather than an entrance: the text changes
   under a steady shape instead of the shape rebuilding itself. */
.lkh-nist__read{pointer-events:none}
.lkh-nist__now{
  font-family:var(--lk-sans);font-size:15px;font-weight:600;letter-spacing:-.02em;
  fill:var(--lk-ice);
}
.lkh-nist__nowd{
  font-family:var(--lk-sans);font-size:10.5px;font-weight:400;
  fill:var(--lk-ink-2);
}
.lkh-nist__now,.lkh-nist__nowd{transition:fill .5s var(--lk-ease)}

/* The live segment lifts rather than just brightening. transform on a <g>
   composites; a fill change repaints the path. */
.lk-nist__seg{
  transform-box:fill-box;transform-origin:center;
  transition:transform .55s var(--lk-ease),opacity .55s var(--lk-ease);
  cursor:pointer;
}
.lk-nist__seg.is-on{transform:scale(1.035)}
.lk-nist__seg.is-on path{fill:rgba(32,187,252,.22);stroke:var(--lk-cyan);stroke-width:1.4}
.lk-nist__seg--gov.is-on circle{stroke-width:2.2;filter:drop-shadow(0 0 10px rgba(32,187,252,.5))}
/* The design detector flags this as a layout-property animation, matching
   "width" inside stroke-width. It is a false positive: on an SVG path
   stroke-width is a PAINT property and reflows nothing, and the remedy the
   rule suggests, transform and opacity, cannot express a stroke weight at all.
   Measured on 15 September 2026 with the wheel dead centre and the sequence,
   the sweep and this transition all live: 26, 25, 26, 26 frames per 400ms,
   against 27 on about:blank.

   The ignore recorded in .impeccable/config.json is scoped to this FILE rather
   than to this value, because the rule exposes no value-level ignore. It is
   the only match in the file today. If you ever animate a real width, height,
   padding or margin in here, the detector will stay silent about it, so take
   the ignore back out at the same time. */
.lk-nist__seg path,.lk-nist__seg--gov circle{transition:fill .45s var(--lk-ease),stroke .45s var(--lk-ease),stroke-width .45s var(--lk-ease)}
.lk-nist__seg:focus-visible{outline:none}
.lk-nist__seg:focus-visible path,.lk-nist__seg:focus-visible circle{stroke:var(--lk-ice);stroke-width:2.4}

@media(prefers-reduced-motion:reduce){
  .lkh-nist__sweep{animation:none;opacity:.5}
  .lk-nist__seg{transition:none}
  .lk-nist__seg.is-on{transform:none}
}

/* ==========================================================================
   24. THE WEEK, 168 HOURS
   Rebuilt 15 September 2026. It was two SVG pattern fills of 26x26 rounded
   squares, which is a UI chip repeated a hundred and sixty eight times and
   read as a calendar widget rather than as a measurement of time.

   One fine stroke per hour now, as real elements, so the lit block can be
   bracketed and counted in place and the 123 unwatched hours can be named
   where they actually are.
   ========================================================================== */
.lk-g-h{
  fill:rgba(255,255,255,.085);
  transition:fill .4s var(--lk-ease);
}
.lk-g-h.is-on{
  fill:var(--lk-sky);
}
/* The lit block carries the only glow on the diagram, because it is the only
   part of the week anybody is watching. */
.lk-g-field .is-on{filter:drop-shadow(0 0 5px rgba(79,180,245,.45))}

/* Day names in sans small caps, not monospace: a weekday is a name. */
.lk-g-day text{
  font-family:var(--lk-sans);font-size:10.5px;font-weight:600;
  letter-spacing:.09em;fill:var(--lk-ink-4);
}
/* The hour scale IS a reading, so monospace is doing a job here. */
.lk-g-hr text{
  font-family:var(--lk-mono);font-size:10px;letter-spacing:.05em;
  fill:var(--lk-ink-4);
}

.lk-g-brace path{fill:none;stroke:var(--lk-sky);stroke-width:1.2;opacity:.55}
.lk-g-brace text{
  font-family:var(--lk-sans);font-size:12.5px;font-weight:600;
  letter-spacing:-.01em;fill:var(--lk-ice);
}
.lk-g-rest text{
  font-family:var(--lk-sans);font-size:12.5px;font-weight:500;
  fill:var(--lk-ink-3);
}

/* The sweep. 168 elements, so this is opacity only and the transition is set
   per element by weekGrid() in lantek-home.js. Static without JavaScript. */
.lk-g-field .lk-g-h{opacity:1}

/* ==========================================================================
   25. THE WEEK, FULL BLEED
   Third attempt at this diagram. The first two were rejected and the marks
   were never the problem: both were a small chart inside a bordered panel, on
   a page where everything else is full bleed and photographic, so they read as
   a slide pasted in. There is no panel now and no border. The 168 hours run
   the whole width of the screen and the dark part of the week is the image.
   ========================================================================== */
.lkh-week{position:relative;padding:clamp(80px,10vw,150px) 0 clamp(72px,9vw,130px);background:var(--lk-void)}
.lkh-week__head{max-width:54ch;margin-bottom:clamp(48px,6vw,80px)}
.lkh-week__head .lkh-h b{color:var(--lk-sky);font-weight:600}

/* Edge to edge. No max-width, no padding: the field IS the bleed. */
.lkh-week__field{
  position:relative;width:100%;
  padding-block:clamp(10px,1.4vw,18px);
  /* A long horizontal wash under the lit block, so the five bands of light
     read as one shape rather than as thirty five separate cells. */
  background:radial-gradient(60% 120% at 50% 50%,rgba(15,118,196,.13),transparent 72%);
}
.lkh-week__hours{
  display:grid;
  grid-template-columns:repeat(24,1fr);
  grid-auto-rows:clamp(13px,1.5vw,20px);
  gap:clamp(2px,.28vw,4px);
  width:100%;
}
.lkh-week__h{
  border-radius:1px;
  background:rgba(255,255,255,.055);
  transition:background .5s var(--lk-ease),opacity .5s var(--lk-ease);
}
.lkh-week__h.is-on{
  background:linear-gradient(180deg,var(--lk-cyan),var(--lk-blue));
  box-shadow:0 0 12px -2px rgba(32,187,252,.65);
}
/* The Friday evening the copy keeps naming. One cell, marked, because the
   argument of the whole section is about a specific moment in that black. */
.lkh-week__h.is-mark{
  background:var(--lk-hot);
  box-shadow:0 0 14px -1px rgba(255,90,71,.8);
}

/* The readout. Display figures beside the field rather than a caption under
   it: these two numbers are the section, not a footnote to it. */
.lkh-week__read{
  display:grid;gap:clamp(28px,4vw,56px);
  margin-top:clamp(44px,5vw,72px);align-items:start;
}
@media(min-width:900px){
  .lkh-week__read{grid-template-columns:auto auto minmax(0,1fr)}
}
.lkh-week__fig{display:flex;flex-direction:column;gap:6px}
.lkh-week__n{
  font-size:clamp(3.4rem,7vw,5.6rem);font-weight:600;letter-spacing:-.055em;
  line-height:.86;color:var(--lk-sky);font-variant-numeric:tabular-nums;
}
.lkh-week__fig--dark .lkh-week__n{color:var(--lk-ink-3)}
.lkh-week__l{font-size:14px;line-height:1.45;color:var(--lk-ink-3);max-width:20ch}
.lkh-week__say{max-width:44ch}
.lk .lkh-week__say .lkh-p{margin-top:12px}

/* Visually hidden, still read. The drawing carries the argument on screen and
   this carries it everywhere else. */
.lkh-sr{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;
}

/* --- the week's scale ---------------------------------------------------- */
.lkh-week__field{position:relative}
/* The hour scale sits above the field, positioned by the same 1/24 the grid
   uses, so a label lands on the column it names at every width. */
.lkh-week__scale{position:absolute;inset:0 0 auto 0;height:0;pointer-events:none}
.lkh-week__scale span{
  position:absolute;top:-22px;
  left:calc(var(--h) * (100% / 24));
  padding-left:clamp(3px,.3vw,5px);
  font-family:var(--lk-mono);font-size:10px;letter-spacing:.06em;
  color:var(--lk-ink-4);white-space:nowrap;
}
/* The day names ride on the left of the field. Every hour they cover is one
   of the dark ones, so they read without a plate behind them. */
.lkh-week__days{
  position:absolute;inset:clamp(10px,1.4vw,18px) auto clamp(10px,1.4vw,18px) 0;
  display:grid;grid-auto-rows:1fr;gap:clamp(2px,.28vw,4px);
  padding-left:clamp(10px,1.4vw,22px);pointer-events:none;
}
.lkh-week__days span{
  display:flex;align-items:center;
  font-size:10.5px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;
  color:var(--lk-ink-4);
}
/* A hairline the full width, marking the end of Friday. Everything below it
   is the weekend, which is the half of the argument the numbers do not make. */
.lkh-week__field::after{
  content:"";position:absolute;left:0;right:0;pointer-events:none;
  top:calc(clamp(10px,1.4vw,18px) + (5 * (100% - clamp(20px,2.8vw,36px)) / 7));
  border-top:1px dashed rgba(79,180,245,.22);
}
@media(max-width:700px){
  .lkh-week__days{display:none}
  .lkh-week__scale span:nth-child(2),
  .lkh-week__scale span:nth-child(4){display:none}
}

/* ==========================================================================
   26. THE STRATA
   Defence in depth, third version. The first two were nested boxes and then a
   signal trace, and both failed for the same reason: a bordered panel of
   vector line-work on a page where everything else is full bleed reads as a
   slide somebody pasted in, whatever is drawn inside it.

   No box. Three strata the full width of the screen, and the subject is
   DEPTH: the top is nearly dark, the middle has some light, the bottom is lit
   and alive. Four threats fall from above, pass through the first two, and
   stop on the third.
   ========================================================================== */
.lkh-strata{position:relative;width:100%;isolation:isolate}

/* --- the sky the threats come out of --- */
/* z-index 3, and it is load bearing. The falling lines live in the sky but
   have to be SEEN over the two strata below it, and those come later in the
   DOM with their own backgrounds, so without this they were painted over and
   every threat stopped dead at the top of the first layer. .lkh-strata sets
   isolation:isolate so this z-index cannot leak into the rest of the page. */
.lkh-strata__sky{
  position:relative;z-index:3;height:clamp(76px,9vw,120px);
  background:linear-gradient(180deg,var(--lk-void),rgba(9,13,22,0));
}
/* The whole marker is given the exact height of sky plus the two strata it
   falls through, and the line is flex:1 so it fills whatever is left after
   the label. Calculating the LINE height instead was out by the height of the
   label, so every threat overshot the lit edge by 26px. Letting flex do the
   arithmetic means it stays correct at every size and font. */
.lkh-fall{
  position:absolute;top:0;left:var(--x);transform:translateX(-50%);
  height:calc(clamp(76px,9vw,120px) + 2 * clamp(96px,11vw,150px));
  display:flex;flex-direction:column;align-items:center;gap:6px;
  font-size:12.5px;font-weight:500;color:var(--lk-ink-3);white-space:nowrap;
}
/* The line each threat falls along. It runs down through the first two strata
   and stops dead on the third, which is the argument. */
.lkh-fall i{
  order:2;display:block;width:1px;flex:1;
  background:linear-gradient(180deg,rgba(255,90,71,.75),rgba(255,90,71,.16));
}
@media(max-width:900px){
  .lkh-fall{font-size:11px}
  .lkh-fall:nth-child(4){display:none}
}

/* --- a stratum --- */
.lkh-stratum{
  position:relative;
  min-height:clamp(96px,11vw,150px);
  display:flex;align-items:center;
  border-top:1px solid rgba(255,255,255,.07);
  background:#080B12;
}
.lkh-stratum--two{background:#0B111C}
.lkh-stratum__in{
  display:flex;flex-wrap:wrap;align-items:baseline;gap:6px clamp(14px,1.8vw,26px);
}
.lkh-stratum__t{
  font-size:clamp(1.15rem,2.4vw,1.85rem);font-weight:600;
  letter-spacing:-.03em;color:var(--lk-ink-2);
}
.lkh-stratum__n{font-size:13.5px;font-style:italic;color:var(--lk-ink-4)}

/* The one that stops things. It is the only stratum with light of its own,
   and the light comes from under it rather than from a border around it. */
.lkh-stratum--us{
  /* Above the falling lines, so they stop on this edge rather than crossing
     it. That is the entire point of the drawing. */
  position:relative;z-index:4;
  min-height:clamp(120px,14vw,190px);
  background:
    radial-gradient(120% 180% at 50% 120%,rgba(15,118,196,.42),transparent 68%),
    linear-gradient(180deg,#0C1A2B,#071019);
  border-top:1px solid var(--lk-cyan);
  box-shadow:0 -18px 60px -30px rgba(32,187,252,.9);
}
.lkh-stratum--us .lkh-stratum__t{
  color:#fff;font-size:clamp(1.5rem,3.4vw,2.6rem);letter-spacing:-.04em;
}
.lkh-stratum--us .lkh-stratum__n{color:var(--lk-ice);font-style:normal;font-size:15px}


/* ==========================================================================
   27. THE PRODUCT SHOT
   Built 15 September 2026 from a reference the owner supplied: a real console
   photographed at an angle on a saturated gradient, with a lighter card
   floating in front of it and the panel running off the edge of the frame.

   It replaces two abstract data drawings. Three earlier attempts at those were
   rejected and the note each time was the same: flat line-work reads as a
   diagram, and a diagram is not an image.

   WHAT THIS IS AND IS NOT. LANTEK does not sell a dashboard, so this is not a
   screenshot of a product and is never captioned as one. It is a drawing of
   what LANTEK watches, built in the same language as the hero console, and
   each one carries the illustration line. The reference does show a real
   product; copying the composition is fair, copying the claim is not.
   ========================================================================== */
.lkh-shot{position:relative;width:100%;overflow:clip;isolation:isolate}

/* The ground. A saturated wash rather than the page's near-black, because the
   whole effect in the reference is a dark panel lifted OFF a colour. */
.lkh-shot__ground{
  position:absolute;inset:0;z-index:0;
  background:
    radial-gradient(90% 120% at 12% 10%,rgba(32,187,252,.38),transparent 58%),
    radial-gradient(80% 110% at 88% 85%,rgba(78,66,214,.40),transparent 62%),
    linear-gradient(160deg,#0B1B33 0%,#071021 55%,#05080F 100%);
}
/* A fine rule grid over the wash, the way a technical surface reads. Masked to
   nothing at the edges so it never announces itself as a texture. */
.lkh-shot__ground::after{
  content:"";position:absolute;inset:0;
  background-image:
    linear-gradient(to right,rgba(143,216,255,.07) 1px,transparent 1px),
    linear-gradient(to bottom,rgba(143,216,255,.07) 1px,transparent 1px);
  background-size:52px 52px;
  mask-image:radial-gradient(ellipse 80% 70% at 40% 40%,#000,transparent 78%);
  -webkit-mask-image:radial-gradient(ellipse 80% 70% at 40% 40%,#000,transparent 78%);
}

.lkh-shot__in{position:relative;z-index:2;padding-top:clamp(56px,7vw,110px)}
.lkh-shot__head{max-width:48ch;margin-bottom:clamp(36px,4.5vw,64px)}
.lkh-shot__head .lkh-h{color:#fff}
.lk .lkh-shot__head .lkh-lead{color:#C6D6E8}

/* The stage. perspective lives here so the panel tips and the card in front of
   it does not have to. */
.lkh-shot__stage{position:relative;perspective:1700px;max-width:1120px;margin-inline:auto;padding-bottom:clamp(74px,7vw,120px)}

/* --- the console --------------------------------------------------------- */
.lkh-ui{
  /* rotateX only. A rotateY yaws the panel, and a yawed panel projects to a
     box that is wider on one side than the other, so it can never be visually
     centred however the margins are set: it measured 20px out at 1440 and 69px
     out on the scroll instance. The owner asked for these centred, so the yaw
     came off and the tip stayed. */
  transform:rotateX(3deg);
  transform-origin:50% 0;
  border:1px solid rgba(143,216,255,.16);
  border-radius:10px 0 0 10px;
  background:linear-gradient(180deg,#0A121F,#070D17);
  box-shadow:
    0 1px 0 rgba(255,255,255,.06) inset,
    0 60px 120px -50px rgba(0,0,0,1);
  /* CENTRED, on the owner's instruction, 15 September 2026. It used to run
     off the right edge the way the reference does; centred it reads as a
     considered object rather than a crop, and the two shots now sit on the
     same axis as every other section on the page. */
  overflow:hidden;margin-inline:auto;max-width:1120px;
}

.lkh-ui__bar{
  display:flex;align-items:center;gap:14px;
  padding:12px 18px;border-bottom:1px solid rgba(255,255,255,.07);
  background:rgba(18,28,46,.7);
}
.lkh-ui__dots{display:flex;gap:6px;flex:none}
.lkh-ui__dots i{width:9px;height:9px;border-radius:50%;background:rgba(255,255,255,.16)}
.lkh-ui__crumb{display:flex;align-items:center;gap:9px;font-size:12px;color:var(--lk-ink-3);min-width:0}
.lkh-ui__crumb b{color:var(--lk-ice);font-weight:500}
.lkh-ui__crumb span{opacity:.4}
.lkh-ui__clock{
  margin-left:auto;font-family:var(--lk-mono);font-size:11.5px;
  letter-spacing:.06em;color:var(--lk-sky);white-space:nowrap;
}

.lkh-ui__body{display:grid;grid-template-columns:auto minmax(0,1fr);min-height:clamp(280px,26vw,380px)}
@media(max-width:720px){.lkh-ui__body{grid-template-columns:minmax(0,1fr)}}

.lkh-ui__side{
  border-right:1px solid rgba(255,255,255,.06);
  padding:16px 18px;display:flex;flex-direction:column;gap:3px;min-width:176px;
  background:rgba(8,13,23,.6);
}
@media(max-width:720px){.lkh-ui__side{display:none}}
.lkh-ui__grp{
  font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--lk-ink-4);margin:14px 0 5px;
}
.lkh-ui__grp:first-child{margin-top:0}
.lkh-ui__nav{
  display:flex;align-items:center;gap:9px;padding:7px 9px;border-radius:5px;
  font-size:13px;color:var(--lk-ink-2);
}
.lkh-ui__nav i{width:5px;height:5px;border-radius:1px;background:var(--lk-ink-4);flex:none}
.lkh-ui__nav.is-on{background:rgba(15,118,196,.2);color:#fff}
.lkh-ui__nav.is-on i{background:var(--lk-cyan);box-shadow:0 0 7px rgba(32,187,252,.9)}

.lkh-ui__main{padding:18px clamp(18px,2.2vw,26px);min-width:0}
.lkh-ui__tabs{display:flex;gap:20px;border-bottom:1px solid rgba(255,255,255,.07);margin-bottom:18px;overflow:hidden}
.lkh-ui__tab{padding-bottom:10px;font-size:12.5px;color:var(--lk-ink-3);white-space:nowrap}
.lkh-ui__tab.is-on{color:#fff;box-shadow:0 1px 0 var(--lk-cyan)}
.lkh-ui__h{font-size:clamp(1.05rem,1.7vw,1.3rem);font-weight:600;letter-spacing:-.025em;color:#fff}
.lk .lkh-ui__sub{margin-top:4px;font-size:12px;color:var(--lk-ink-4)}

/* --- the card in front --------------------------------------------------- */
.lkh-card{
  position:absolute;z-index:3;
  /* Straddles the bottom edge of the console rather than sitting inside it.
     Centred on the panel it covered six of the seven day rows, which is the
     one thing the panel exists to show. Hanging it off the edge keeps the
     overlap the reference has without eating the content. */
  /* Positive, and less than the stage padding below it. A negative bottom
     hangs the card out of the stage entirely and it landed 43px on top of
     the illustration line underneath. Sitting it INSIDE the padding still
     straddles the console edge, which is the look, without overhanging into
     the next thing on the page. */
  left:clamp(8px,5vw,70px);bottom:clamp(28px,4vw,62px);
  width:min(376px,74%);
  padding:20px 22px 22px;
  border:1px solid rgba(143,216,255,.22);border-radius:12px;
  background:linear-gradient(170deg,rgba(24,38,62,.94),rgba(12,20,35,.96));
  backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);
  box-shadow:
    0 1px 0 rgba(255,255,255,.09) inset,
    0 40px 90px -30px rgba(0,0,0,.95);
}
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .lkh-card{background:#16243C}
}
.lkh-card__t{font-size:15.5px;font-weight:600;letter-spacing:-.02em;color:#fff}
.lkh-card__row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin-top:16px}
.lkh-card__cell{
  border:1px solid rgba(255,255,255,.08);border-radius:8px;
  padding:14px 14px 12px;background:rgba(6,11,20,.5);
  display:flex;flex-direction:column;align-items:center;gap:9px;
}
.lkh-card__k{font-size:11px;color:var(--lk-ink-3);text-align:center;line-height:1.3}
.lk .lkh-card__foot{margin-top:14px;font-size:10.5px;color:var(--lk-ink-4)}

/* The donuts on the card. */
.lkh-dnut{position:relative;width:74px;height:74px}
.lkh-dnut svg{width:100%;height:100%;display:block}
.lkh-dnut__t{fill:none;stroke:rgba(255,255,255,.10);stroke-width:8}
.lkh-dnut__v{
  fill:none;stroke:var(--lk-cyan);stroke-width:8;stroke-linecap:round;
  filter:drop-shadow(0 0 6px rgba(32,187,252,.6));
}
.lkh-dnut__v--warm{stroke:var(--lk-warn);filter:drop-shadow(0 0 6px rgba(242,163,60,.55))}
.lkh-dnut__n{
  position:absolute;inset:0;display:grid;place-content:center;
  font-size:15px;font-weight:600;letter-spacing:-.03em;color:#fff;
  font-variant-numeric:tabular-nums;
}

/* The illustration line. Not optional and not decoration: this composition is
   modelled on a real product's marketing, and without it the drawing borrows
   that product's implied claim. */
.lk .lkh-shot__ill{
  position:relative;z-index:2;
  padding-bottom:clamp(40px,5vw,72px);
  font-size:11.5px;letter-spacing:.04em;color:rgba(255,255,255,.52);
}

@media(max-width:720px){
  .lkh-ui{transform:none;border-radius:10px;margin-right:0}
  .lkh-card{position:static;width:auto;margin-top:18px}
}

/* --- what goes inside the console ---------------------------------------- */

/* The week view: 168 hours as a schedule inside a real UI. */
.lkh-sched{display:grid;grid-template-columns:auto minmax(0,1fr);gap:0 12px;margin-top:16px}
.lkh-sched__d{
  display:flex;align-items:center;height:clamp(13px,1.35vw,18px);
  font-size:10.5px;font-weight:600;letter-spacing:.09em;text-transform:uppercase;
  color:var(--lk-ink-4);
}
.lkh-sched__r{display:grid;grid-template-columns:repeat(24,1fr);gap:3px;height:clamp(13px,1.35vw,18px);align-items:stretch}
.lkh-sched__h{border-radius:1px;background:rgba(255,255,255,.055)}
.lkh-sched__h.is-on{background:linear-gradient(180deg,var(--lk-cyan),var(--lk-blue))}
.lkh-sched__h.is-mark{background:var(--lk-hot);box-shadow:0 0 10px -1px rgba(255,90,71,.85)}
.lkh-sched__scale{
  grid-column:2;display:flex;justify-content:space-between;margin-top:8px;
  font-family:var(--lk-mono);font-size:9.5px;color:var(--lk-ink-4);
}

/* The layers view: three rows, the third lit. */
.lkh-lay{display:flex;flex-direction:column;gap:10px;margin-top:16px}
.lkh-lay__r{
  display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:14px;align-items:center;
  padding:14px 16px;border:1px solid rgba(255,255,255,.07);border-radius:8px;
  background:rgba(255,255,255,.02);
}
.lkh-lay__r--us{
  border-color:var(--lk-cyan);
  background:linear-gradient(90deg,rgba(15,118,196,.28),rgba(15,118,196,.06));
  box-shadow:0 0 32px -12px rgba(32,187,252,.8);
}
.lkh-lay__i{width:8px;height:8px;border-radius:50%;background:var(--lk-ink-4)}
.lkh-lay__r--us .lkh-lay__i{background:var(--lk-cyan);box-shadow:0 0 9px rgba(32,187,252,1)}
.lkh-lay__n{font-size:13.5px;font-weight:600;color:var(--lk-ink-2)}
.lkh-lay__r--us .lkh-lay__n{color:#fff}
.lk .lkh-lay__d{font-size:12px;color:var(--lk-ink-4);margin-top:2px}
.lkh-lay__s{
  font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;
  color:var(--lk-ink-4);white-space:nowrap;
}
.lkh-lay__r--us .lkh-lay__s{color:var(--lk-ice)}

/* The four threats on the defence card. A list rather than a second pair of
   donuts: two identical donut cards across two sections is one idea used
   twice, and a percentage on this card would be a performance figure about
   LANTEK rather than an illustration of what it does. "3% needed action
   overnight" was exactly that, and it came out. */
.lkh-threats{
  display:flex;flex-direction:column;gap:1px;margin-top:14px;
  background:rgba(255,255,255,.07);
  border:1px solid rgba(255,255,255,.08);border-radius:8px;overflow:hidden;
}
.lkh-threat{
  display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:10px;align-items:center;
  padding:10px 13px;background:rgba(6,11,20,.72);
  font-size:12.5px;color:var(--lk-ink-2);
}
.lkh-threat i{width:5px;height:5px;border-radius:50%;background:var(--lk-hot);flex:none}
.lkh-threat b{
  font-size:10px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;
  color:var(--lk-ice);
}

/* --- the shots on a phone ------------------------------------------------ */
@media(max-width:560px){
  /* The breadcrumb wrapped to three lines at 390px and read as broken chrome.
     A console title bar is scenery; on a phone it keeps the dots and the
     clock, which are the two parts that still say "this is running". */
  .lkh-ui__crumb{display:none}
  .lkh-ui__clock{margin-left:0}
  /* The day column and the hour rows have to agree at every size, so they
     share one height token rather than each carrying its own clamp. */
  .lkh-sched{gap:0 9px}
  .lkh-sched__d{font-size:9px;letter-spacing:.06em}
  .lkh-sched__r{gap:2px}
}

/* ==========================================================================
   28. THE AMBIENT HERO
   The owner supplied a 4K plexus clip, 93 MB. There is no ffmpeg on this
   machine and the headless Chromium that runs the test suite ships without
   H.264, so it was transcoded through a canvas in the app's own browser:
   1280x720 VP9 webm, 0.83 MB. That is 112 times smaller and it is the only
   reason "fast and smooth with no lag" and "use this video" can both be true.

   This clip is NOT graded. Every photograph on the page is desaturated and
   re-tinted so the stills read as one palette; this one already IS the
   palette, so grading it would only throw away fidelity.
   ========================================================================== */
.lkh-hero__bg--plain{position:absolute;inset:0;z-index:0;overflow:hidden;background:#061024}
/* Reuses the printed url from lantek_media_css() like every other image, but
   drops the grade: .lkh-ph__i carries grayscale for the photography and this
   clip is already the palette. */
.lkh-hero__poster{filter:none}
.lkh-hero__bg--plain video{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:1;
  opacity:0;transition:opacity 1.2s var(--lk-ease);
  /* No grayscale. See the note above. */
  filter:none;
}
.lkh-hero__bg--plain video.is-on{opacity:1}

/* The slight black overlay the owner asked for, plus just enough weighting to
   the left that the headline keeps its contrast. Much lighter than the scrim
   the old photographic hero needed: this clip is mostly dark already, and the
   point of putting it there is to be seen. */
.lkh-hero__bg--plain::after{
  content:"";position:absolute;inset:0;z-index:2;pointer-events:none;
  background:
    linear-gradient(90deg,rgba(2,5,12,.72) 0%,rgba(2,5,12,.46) 42%,rgba(2,5,12,.20) 74%,rgba(2,5,12,.28) 100%),
    linear-gradient(180deg,rgba(2,5,12,.40) 0%,transparent 24%,transparent 58%,rgba(4,6,11,.90) 100%);
}

/* ==========================================================================
   29. THE AMBIENT BACKGROUND
   Replaces the hero video on 15 September 2026, on the owner's instruction.

   Four soft fields of colour drifting on long, unequal loops, over a slow grid
   pan. No video, no canvas, no JavaScript: four elements, four transforms, and
   the compositor does all of it. It costs nothing to decode, nothing to
   download, and it cannot stutter on arrival the way a video decoder can.

   The 0.83 MB plexus webm and its poster stay in assets/media/ and the loader
   in lantek.js still works, so putting the clip back is one class on the hero
   and nothing else. It is not deleted, it is not wired up.

   NOT THE OLD GLOW BLOBS. Those were eighteen decorative fields scattered over
   every section of the page and they are the reason it was rebuilt. This is
   one background, on one section, doing the job a video was doing, which is
   the difference between a texture and a scene.
   ========================================================================== */
/* THE GROUND. The owner's reference sits on pure black; asked for a colour
   that goes with the theme instead, this is the palette's own navy
   (--lk-navy #16233C) taken down to where type can live on it, easing to
   the void at the foot so the partner strip still sits on something solid.
   Deep blue rather than black also stops the blue fields above it reading
   as coloured light on a black stage, which is the look every other dark
   landing page has. */
.lkh-amb{
  position:absolute;inset:0;z-index:0;overflow:hidden;
  background:linear-gradient(180deg,#081528 0%,#060F1F 44%,#04070B 100%);
}

/* The fields. Radial gradients rather than filter:blur, because a blur on a
   moving layer is a full repaint every frame and a gradient is not. */
.lkh-amb__f{
  position:absolute;border-radius:50%;
  will-change:transform;
  animation:lkh-drift var(--d,34s) var(--lk-ease) infinite alternate;
  animation-delay:var(--t,0s);
}
.lkh-amb__f--1{
  width:78vw;height:78vw;left:-18vw;top:-28vw;--d:38s;
  background:radial-gradient(circle,rgba(32,187,252,.30),transparent 62%);
}
.lkh-amb__f--2{
  width:66vw;height:66vw;right:-14vw;top:-10vw;--d:47s;--t:-8s;
  background:radial-gradient(circle,rgba(78,66,214,.34),transparent 64%);
}
.lkh-amb__f--3{
  width:72vw;height:72vw;left:22vw;bottom:-36vw;--d:41s;--t:-17s;
  background:radial-gradient(circle,rgba(15,118,196,.34),transparent 66%);
}
.lkh-amb__f--4{
  width:48vw;height:48vw;right:6vw;bottom:-18vw;--d:53s;--t:-26s;
  background:radial-gradient(circle,rgba(143,216,255,.16),transparent 60%);
}
/* Unequal periods on purpose: four loops of the same length resynchronise
   every cycle and the whole thing starts to pulse. 38, 47, 41 and 53 seconds
   share no common factor worth noticing. */
@keyframes lkh-drift{
  from{transform:translate3d(0,0,0) scale(1)}
  to{transform:translate3d(6vw,4vw,0) scale(1.14)}
}

/* The grid, panning slowly. Masked out at the edges so it never reads as a
   texture laid over the top. */
.lkh-amb__grid{
  position:absolute;inset:-60px;
  background-image:
    linear-gradient(to right,rgba(143,216,255,.06) 1px,transparent 1px),
    linear-gradient(to bottom,rgba(143,216,255,.06) 1px,transparent 1px);
  background-size:58px 58px;
  mask-image:radial-gradient(ellipse 90% 80% at 50% 40%,#000,transparent 76%);
  -webkit-mask-image:radial-gradient(ellipse 90% 80% at 50% 40%,#000,transparent 76%);
  animation:lkh-pan 26s linear infinite;
  will-change:transform;
}
@keyframes lkh-pan{from{transform:translate3d(0,0,0)}to{transform:translate3d(58px,58px,0)}}

/* The black overlay the owner asked for, weighted left so the headline keeps
   its contrast and bottom so the partner strip sits on something solid. */
.lkh-amb::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  /* RE-WEIGHTED 16 September 2026. It used to be a horizontal ramp, 74%
     black on the left easing to 22% on the right, because the copy was on
     the left and the dashboard on the right. Centred copy on that scrim
     gets its first word darkened and its last word lit, which is exactly
     backwards. A centred vignette instead: clearest where the type is,
     closing down towards the corners, still heavy at the foot. */
  background:
    radial-gradient(ellipse 86% 70% at 50% 36%,
      rgba(2,5,12,.16) 0%,rgba(2,5,12,.50) 62%,rgba(2,5,12,.74) 100%),
    linear-gradient(180deg,rgba(2,5,12,.42) 0%,transparent 22%,
      transparent 58%,rgba(4,6,11,.92) 100%);
}

/* Motion off means the scene is still, not gone. The fields keep their final
   positions so the composition is the same picture either way. */
@media(prefers-reduced-motion:reduce){
  .lkh-amb__f,.lkh-amb__grid{animation:none}
  .lkh-amb__f{transform:translate3d(3vw,2vw,0) scale(1.07)}
}
/* A phone is painting these at device pixel ratio 3 over the whole screen.
   Two fields instead of four, and no grid: same scene, a third of the paint. */
@media(max-width:640px){
  .lkh-amb__f--2,.lkh-amb__f--4{display:none}
  .lkh-amb__grid{display:none}
}

/* Section 30 was THE HERO DASHBOARD: a four view slide deck with real
   controls, built 15 September 2026 and removed on 16 September when the
   owner supplied a console reference to replace it. Deleted rather than left
   commented out or orphaned in the file, because dead CSS is worse than no
   CSS: the next person has to work out whether anything still uses it. What
   replaced it is section 33, THE CONSOLE IN THE HERO. */

/* ==========================================================================
   31. THE PHONE LEGIBILITY FLOOR
   A 9.5px uppercase label tracked at .11em is a deliberate instrument marking
   on a 27 inch monitor, and it is an unreadable smear held at arm's length on
   a phone. Same label, same job, and on a small screen it needs a size that
   a person can actually read rather than one that looks correct in a mockup.

   Nothing here changes the desktop. It is one floor, applied once, at the
   width where these labels stop being legible.
   ========================================================================== */
@media(max-width:640px){
  .lkh-ring__l{font-size:11px;letter-spacing:.08em}
  .lkh-tile__k{font-size:11.5px;letter-spacing:.07em}
  .lkh-ui__grp{font-size:11px;letter-spacing:.1em}
  /* Right-aligned it wrapped to two ragged lines under a full width deck.
     One column, one alignment. */
  .lk .lkh-hero__ill{font-size:11.5px;text-align:left}
  .lk .lkh-cap,.lk .lkh-fine{font-size:12.5px}
  /* The day column can afford the extra six pixels: each of the 24 hour
     cells loses a third of a pixel and the label becomes readable. */
  .lkh-sched__d{font-size:10.5px;letter-spacing:.05em}
  /* Everything else a full audit at 390px found under the floor. Grouped by
     what the label does rather than by where it lives, so the next person
     reads an intention instead of a list of numbers. */
  .lk .lkh-card__foot{font-size:12px}
  .lkh-lay__s{font-size:11.5px;letter-spacing:.05em}
  .lkh-threat b{font-size:11.5px}
  /* .lkh-night__s is also styled in lantek-fx.css, which loads after this
     file, so a bare class here would lose on source order alone. One more
     class and order stops mattering. */
  .lk .lkh-night__s{font-size:12px}
  /* The hour scale under the week grid has to span 24 columns, so it gets
     half a pixel less than the rest and no more. */
  .lkh-sched__scale span{font-size:10.5px}
}

/* --------------------------------------------------------------------------
   THE ILLUSTRATION LABEL
   Was a style attribute on one paragraph in 07-darkweb.html. An inline style
   outranks every stylesheet in the cascade, so the phone legibility floor
   could not reach it and the label stayed at 10.5px on a handset no matter
   what any media query said. Same appearance, in a class, where the cascade
   can see it.
   -------------------------------------------------------------------------- */
.lk .lkh-illus{
  font-family:var(--lk-mono);font-size:10.5px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--lk-ink-4);line-height:1.5;
}
@media(max-width:768px){.lk .lkh-illus{font-size:11.5px;letter-spacing:.08em}}

/* ==========================================================================
   32. THE CENTRED HERO
   16 September 2026, on the owner's reference: a pill, a headline, one line
   of copy, the buttons, and the dashboard directly underneath on the centre
   line, over a background tuned to the palette rather than to pure black.

   WHY THE STACK IS BETTER HERE, not merely different. Side by side reads as
   "here is us, and here is a screenshot of something". Stacked on one centre
   line reads as "here is the claim, and here is the thing the claim is about",
   which is the order the rest of the page argues in. The dashboard also stops
   competing with the headline for the same horizontal space, so both get to
   be full size instead of both being three quarters of one.

   NOT REACT. The reference is a React component with Tailwind classes, a
   Poppins @import and two PNGs on a third party CDN. This is a WordPress Divi
   child theme: there is no bundler to give it, the font would be a second
   render-blocking request for a face the brand does not use, and hotlinking
   somebody's CDN puts a stranger in the critical path of the front page. So
   the LAYOUT is taken and the stack is not. The dashboard underneath is our
   own four view deck with our own content, which is what the owner asked for.
   ========================================================================== */
.lkh-hero__mid{
  display:flex;flex-direction:column;align-items:center;text-align:center;
  max-width:1120px;margin-inline:auto;
}

/* --- the pill ------------------------------------------------------------ */
.lkh-pill{
  display:inline-flex;align-items:center;justify-content:center;
  flex-wrap:wrap;gap:8px 11px;
  padding:6px 7px 6px 15px;border-radius:99px;
  border:1px solid rgba(143,216,255,.20);
  background:rgba(22,35,60,.52);
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  font-size:12.5px;line-height:1.4;color:#B9CCE4;
  max-width:100%;
  transition:border-color var(--lk-fast) var(--lk-ease),background var(--lk-fast) var(--lk-ease);
}
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .lkh-pill{background:rgba(22,35,60,.88)}
}
.lkh-pill:hover{border-color:rgba(143,216,255,.44);background:rgba(22,35,60,.72)}
.lkh-pill__dot{
  flex:none;width:6px;height:6px;border-radius:50%;
  background:var(--lk-cyan);box-shadow:0 0 9px rgba(32,187,252,.9);
}
.lkh-pill__go{
  display:inline-flex;align-items:center;gap:5px;flex:none;
  padding:4px 11px;border-radius:99px;
  background:rgba(255,255,255,.08);color:#fff;font-weight:600;
}
.lkh-pill__go svg{width:12px;height:12px;transition:transform var(--lk-med) var(--lk-ease)}
.lkh-pill:hover .lkh-pill__go svg{transform:translateX(3px)}
@media(prefers-reduced-motion:reduce){.lkh-pill__go svg{transition:none}}

/* --- the headline ------------------------------------------------------- */
.lkh-hero__h--mid{
  max-width:21ch;margin-top:clamp(22px,2.6vw,34px);
  font-size:clamp(2.6rem,6.8vw,5.1rem);
}
/* The reference fades its headline out towards the baseline. Clipping a
   gradient to the glyphs is the only way to do that, and it has one trap: the
   text-shadow the flat headline carries would then paint a SOLID silhouette
   behind transparent letters. The shadow has to go with it, which is safe
   here because there is no footage under the type any more, only the scrim. */
@supports ((-webkit-background-clip:text) or (background-clip:text)){
  .lkh-hero__h--mid{
    background:linear-gradient(180deg,#fff 0%,#fff 50%,rgba(255,255,255,.60) 100%);
    -webkit-background-clip:text;background-clip:text;
    -webkit-text-fill-color:transparent;
    text-shadow:none;
  }
  .lkh-hero__h--mid b{
    background:linear-gradient(180deg,var(--lk-cyan) 0%,var(--lk-sky) 56%,rgba(79,180,245,.70) 100%);
    -webkit-background-clip:text;background-clip:text;
    -webkit-text-fill-color:transparent;
  }
}

.lk .lkh-hero__p--mid{max-width:52ch;margin-inline:auto}
.lkh-hero__act--mid{justify-content:center}

/* --- the dashboard on the centre line ----------------------------------- */
.lkh-hero__panel--mid{
  width:100%;max-width:960px;margin-inline:auto;
  margin-top:clamp(38px,5vw,72px);
}
/* The reference stacks a blurred PNG behind its screenshot to light it. One
   radial gradient does the same job with no request, no decode, and no chance
   of being the wrong colour the next time the palette moves. */
.lkh-hero__panel--mid::before{
  content:"";position:absolute;z-index:0;pointer-events:none;
  /* Sized and placed to spill UPWARD, behind the buttons, the way a screen
     lights the air above it. Measured at the first attempt it was invisible:
     .26 of cyan over pure black reads, over the new navy ground it does not,
     and three quarters of it was hidden behind the deck it was meant to be
     lighting. Taller, wider, further up, and stronger. */
  left:50%;top:-34%;width:124%;height:96%;transform:translateX(-50%);
  background:radial-gradient(ellipse at 50% 46%,
    rgba(32,187,252,.34) 0%,rgba(15,118,196,.20) 40%,transparent 70%);
}
.lkh-hero__panel--mid > *{position:relative;z-index:1}
.lk .lkh-hero__panel--mid .lkh-hero__ill{text-align:center}

/* ==========================================================================
   33. THE CONSOLE IN THE HERO
   16 September 2026, to the owner's second reference: a rail on the left, a
   header with a search field and a bell, four figure tiles, then a wide chart
   beside a donut. It replaces the four view slide deck, whose CSS went with
   it rather than being left behind to rot.

   It is a real grid of real markup, not an image of an application, because
   an image of an application cannot be read by a screen reader, goes soft on
   a retina screen unless it is shipped at 2x, and has to be re-exported every
   time a number in it changes. The cost of doing it properly is this block;
   the cost of not doing it is a 400 KB PNG that is out of date by Friday.
   ========================================================================== */
.lkh-app{
  display:grid;grid-template-columns:186px minmax(0,1fr);
  border:1px solid rgba(143,216,255,.16);border-radius:10px;
  background:rgba(6,10,18,.82);
  backdrop-filter:blur(26px) saturate(1.1);-webkit-backdrop-filter:blur(26px) saturate(1.1);
  box-shadow:0 1px 0 rgba(255,255,255,.07) inset,0 60px 120px -50px rgba(3,5,10,.98);
  overflow:hidden;text-align:left;
}
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .lkh-app{background:rgba(6,10,18,.97)}
}

/* --- the rail ----------------------------------------------------------- */
.lkh-app__rail{
  display:flex;flex-direction:column;gap:3px;
  padding:14px 10px;border-right:1px solid var(--lk-line-2);
  background:rgba(10,16,28,.6);
}
.lkh-app__brand{
  display:flex;align-items:center;gap:8px;
  padding:4px 8px 14px;color:#fff;
  font-size:13px;font-weight:600;letter-spacing:-.01em;
}
.lk .lkh-app__brand svg{width:15px;height:15px;flex:none;color:var(--lk-cyan)}
.lkh-app__nav{display:flex;flex-direction:column;gap:2px}
.lkh-app__link{
  display:flex;align-items:center;gap:9px;
  padding:7px 9px;border-radius:6px;
  font-size:12.5px;color:#9FB3CE;
}
.lk .lkh-app__link svg{width:14px;height:14px;flex:none;opacity:.8}
.lkh-app__link.is-on{background:rgba(32,187,252,.13);color:#fff}
.lk .lkh-app__link.is-on svg{color:var(--lk-cyan);opacity:1}
.lkh-app__link--foot{
  margin-top:auto;margin-bottom:0;padding-top:12px;
  border-top:1px solid var(--lk-line-2);border-radius:0;
}

/* --- the body ----------------------------------------------------------- */
.lkh-app__main{display:flex;flex-direction:column;min-width:0}
.lkh-app__head{
  display:flex;align-items:center;gap:12px;
  padding:13px 16px;border-bottom:1px solid var(--lk-line-2);
  background:rgba(14,22,38,.42);
}
.lkh-app__title{display:flex;flex-direction:column;gap:2px;min-width:0}
.lkh-app__title b{font-size:14px;font-weight:600;color:#fff;letter-spacing:-.01em}
.lkh-app__title span{
  font-size:11.5px;color:var(--lk-ink-4);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
/* Scenery, and it has to look like a field without being one. */
.lkh-app__search{
  display:flex;align-items:center;gap:7px;margin-left:auto;flex:none;
  padding:6px 11px;border-radius:6px;
  border:1px solid var(--lk-line-2);background:rgba(255,255,255,.045);
  font-size:11.5px;color:var(--lk-ink-4);
}
.lk .lkh-app__search svg{width:13px;height:13px;flex:none;opacity:.75}
.lkh-app__bell{position:relative;flex:none;color:var(--lk-ink-3);line-height:0}
.lk .lkh-app__bell svg{width:16px;height:16px}
.lkh-app__bell i{
  position:absolute;top:-1px;right:-1px;width:6px;height:6px;border-radius:50%;
  background:var(--lk-hot);box-shadow:0 0 7px rgba(255,90,71,.95);
}

/* --- the four figures ---------------------------------------------------
   Right padding of 54px on the tile, not margin on the label: the icon chip
   is absolutely positioned in the corner the reference puts it in, and a long
   label with no reserved room would run underneath it. */
.lkh-app__kpis{
  display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  gap:1px;background:var(--lk-line-2);
  border-bottom:1px solid var(--lk-line-2);
}
.lkh-kpi{
  position:relative;padding:13px 54px 13px 14px;
  background:rgba(8,13,23,.62);
  display:flex;flex-direction:column;gap:3px;min-width:0;
}
.lkh-kpi__k{font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;color:var(--lk-ink-4)}
.lkh-kpi__n{
  font-size:clamp(1.15rem,1.5vw,1.45rem);font-weight:600;color:#fff;
  letter-spacing:-.03em;line-height:1.1;font-variant-numeric:tabular-nums;
}
.lkh-kpi__n em{font-style:normal;font-size:.62em;font-weight:500;color:var(--lk-ink-3)}
.lkh-kpi__s{font-size:11px;line-height:1.4;color:#8FA6C4}
.lkh-kpi__i{
  position:absolute;top:12px;right:12px;
  width:28px;height:28px;border-radius:7px;
  display:grid;place-items:center;
}
.lk .lkh-kpi__i svg{width:15px;height:15px}
.lkh-kpi__i--sky{background:rgba(79,180,245,.16);color:#7EC8FA}
.lkh-kpi__i--cyan{background:rgba(32,187,252,.16);color:var(--lk-cyan)}
.lkh-kpi__i--warn{background:rgba(255,176,32,.15);color:#FFC65C}
.lkh-kpi__i--ok{background:rgba(46,204,132,.15);color:#54D89E}

/* --- the two panels ----------------------------------------------------- */
.lkh-app__panes{
  display:grid;grid-template-columns:minmax(0,1.32fr) minmax(0,1fr);
  gap:1px;background:var(--lk-line-2);
}
.lkh-pane{
  padding:14px 16px 16px;background:rgba(8,13,23,.5);
  display:flex;flex-direction:column;gap:10px;min-width:0;
}
.lkh-pane__head{display:flex;align-items:center;justify-content:space-between;gap:10px}
.lk .lkh-pane__h{font-size:12.5px;font-weight:600;color:#fff;letter-spacing:-.01em}
.lkh-pane__chip{
  display:inline-flex;align-items:center;gap:5px;flex:none;
  padding:4px 9px;border-radius:5px;
  border:1px solid var(--lk-line-2);background:rgba(255,255,255,.045);
  font-size:10.5px;color:var(--lk-ink-3);white-space:nowrap;
}
.lk .lkh-pane__chip svg{width:11px;height:11px;opacity:.7}
/* .lk .lkh-chart, because .lk svg{height:auto} is 0-1-1 and would take it. */
.lk .lkh-chart--tall{height:clamp(96px,9vw,128px)}
.lkh-pane__axis{
  display:flex;justify-content:space-between;
  font-size:10px;letter-spacing:.05em;color:var(--lk-ink-4);
}
.lk .lkh-pane__note{font-size:11.5px;line-height:1.45;color:#8FA6C4;margin-top:auto}

/* --- the donut ---------------------------------------------------------- */
.lkh-pie{position:relative;width:clamp(116px,12vw,148px);margin:2px auto 0}
.lk .lkh-pie svg{width:100%;height:auto;display:block;overflow:visible}
.lkh-pie__t{fill:none;stroke:rgba(255,255,255,.055);stroke-width:15}
.lkh-pie__s{fill:none;stroke-width:15;stroke-linecap:butt}
.lkh-pie__s--on{stroke:var(--lk-cyan)}
.lkh-pie__s--eve{stroke:#3A5B8F}
.lkh-pie__s--wke{stroke:#22304C}
.lkh-pie__in{
  position:absolute;inset:0;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:1px;pointer-events:none;
}
.lkh-pie__in b{font-size:1.35rem;font-weight:600;color:#fff;letter-spacing:-.03em;line-height:1}
.lkh-pie__in i{
  font-style:normal;font-size:9.5px;letter-spacing:.07em;
  text-transform:uppercase;color:var(--lk-ink-4);
}

.lk .lkh-pie__key{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}
.lk .lkh-pie__key li{
  display:flex;align-items:center;gap:8px;
  font-size:11.5px;color:#9FB3CE;line-height:1.3;
}
.lkh-pie__key b{margin-left:auto;font-weight:600;color:#fff;font-variant-numeric:tabular-nums}
.lkh-pie__key em{
  font-style:normal;flex:none;width:44px;text-align:right;
  font-size:10.5px;color:var(--lk-ink-4);font-variant-numeric:tabular-nums;
}
.lkh-pie__sw{flex:none;width:9px;height:9px;border-radius:2px}
.lkh-pie__sw--on{background:var(--lk-cyan)}
.lkh-pie__sw--eve{background:#3A5B8F}
.lkh-pie__sw--wke{background:#22304C}

/* --- the console on a narrower screen -----------------------------------
   The rail is the first thing to go: seven menu items nobody can click are
   the least useful 186px on a phone. The header keeps its title and loses the
   field, the four tiles become two by two, and the panels stack. */
@media(max-width:900px){
  .lkh-app{grid-template-columns:minmax(0,1fr)}
  .lkh-app__rail{display:none}
  .lkh-app__panes{grid-template-columns:minmax(0,1fr)}
}
@media(max-width:640px){
  .lkh-app__kpis{grid-template-columns:repeat(2,minmax(0,1fr))}
  .lkh-app__search{display:none}
  .lkh-app__head{padding:12px 14px}
  .lkh-kpi{padding:12px 46px 12px 13px}
  .lkh-kpi__i{width:24px;height:24px;top:11px;right:10px}
  .lk .lkh-kpi__i svg{width:13px;height:13px}
  .lkh-pane{padding:13px 14px 14px}
}
@media(max-width:420px){
  /* Two columns of figures at 320px leaves 46px of text per tile. One. */
  .lkh-app__kpis{grid-template-columns:minmax(0,1fr)}
}

/* The legibility floor for this console, and it has to live HERE rather
   than with the rest of the phone floor in section 31. Section 31 is
   earlier in this file, these selectors are the same weight as the base
   rules above, and an earlier rule of equal weight loses: written up there
   the whole block silently did nothing and the axis stayed at 10px. A
   component's responsive rules belong with the component. */
@media(max-width:640px){
  .lkh-pane__axis{font-size:10.5px;letter-spacing:.03em}
  .lkh-pie__in i{font-size:10.5px;letter-spacing:.04em}
  .lkh-kpi__k{font-size:11px;letter-spacing:.07em}
  .lkh-kpi__s{font-size:11.5px}
  .lkh-app__title span{font-size:12px}
  .lk .lkh-pane__h{font-size:13px}
  .lk .lkh-pane__note{font-size:12px}
  .lk .lkh-pie__key li{font-size:12px}
  .lkh-pie__key em{font-size:11px;width:40px}
  .lkh-pane__chip{font-size:11px}
}
