/* ==========================================================================
   help/tutorials/_shared-craft.css
   The craft skin for the 17 guided tutorials (help/tutorials/).

   KEEP THIS NAME. The 2026-08-11 go-live sweep renamed every -craft twin
   over its real file, including this one: it took _shared.css's name, the
   base layout (the 1080 .container, nav, grid overlay) died with it, and
   every tutorial ran full-bleed and blown up until the base was restored
   later that day. This family is the one place the twin is NOT a
   replacement: it is a second sheet that needs the first. Both files stay.

   WHAT THIS IS. The twin of help/tutorials/_shared.css, and the sibling of
   help/_kb-craft.css. The KB rollout deliberately skipped this family
   because it loads a different stylesheet and a different vocabulary:
   .tut-hero, .tut-layout, .tut-side, .side-nav, .step-head / .step-num-lg /
   .step-title / .step-visual, the whole .jtek-* app-frame set, .meta-chip,
   .callout, .tut-cta-block. Bolting _kb-craft.css on landed the cream page
   and nothing else. This file is the family's own set of recipes, in the
   same craft language: cream page, ink, Newsreader on the display type,
   radius 24, hairline borders, --shadow-block, grain, 16/22.4 body, one
   jtek-blue accent.

   BACKEND, NOT MARKETING. A signed-in customer reads these. No marketing
   nav, no mega-menu, no six-column footer. Structure, links, embeds and JS
   stay byte-intact; only the surfaces change. Jesse's order, 2026-08-09:
   "almost just a refresh".

   LOADING POSITION IS DIFFERENT FROM THE KB'S. help/_kb.css already sat
   after each page's inline <style>, so _kb-craft.css simply replaced it in
   place. Here _shared.css loads BEFORE the page's own <style>, so this file
   cannot replace it: it is added as the LAST element in <head>, after the
   page's </style>. _shared.css therefore still loads and still carries the
   layout; this sheet repaints on top of both it and the page block.

   THE PRICE OF LOADING LAST. Because this sheet wins on source order, any
   property it sets unconditionally also beats _shared.css's own media
   queries. Every such property is re-declared here at _shared.css's own
   breakpoints (900, 768, 560, 520). Setting .related-grid or .jtek-frame
   once, at the top, silently un-collapses them on a phone.

   NO DARK MODE. craft is a single cream surface. _shared.css closes with a
   full @media (prefers-color-scheme: dark) block; every selector in it is
   matched here unconditionally, at equal or higher specificity, from a
   later sheet, so none of those rules ever land. Media queries add no
   specificity. There is deliberately no dark block in this file.

   TEXT FLOOR. Nothing this sheet drives goes below 12px. The per-page
   mockup markup inside .step-visual keeps its own <style> block and its own
   inherited sub-12px chrome: that is preserved content, out of scope here,
   exactly as the 73 KB twins left theirs.
   ========================================================================== */


/* -- 1. tokens ------------------------------------------------------------
   1a. craft's own set, kit section 2, identical to help/_kb-craft.css so the
       two families cannot drift.
   ------------------------------------------------------------------------ */
:root{
  --beige:#FCF9F7;
  --ink:#030302;
  --ink75:rgba(3,3,2,.75);
  --ink65:rgba(3,3,2,.65);
  --line:rgba(3,3,2,.09);
  --card-blue:#B8CAF5;
  --card-green:#9BD8A9;
  --card-yellow:#FDE99B;
  --sky-a:#9ED4EF;
  --sky-b:#D1EEF9;
  --jtek-blue:#0057FF;
  --rail:#1B1C1E;
  --chrome-1:rgba(31,34,37,.8);
  --chrome-2:rgba(31,34,37,.6);
  --chrome-3:rgba(31,34,37,.5);
  --shadow-block:0 50px 40px rgba(0,0,0,.01),0 50px 40px rgba(0,0,0,.02),0 20px 40px rgba(0,0,0,.05),0 3px 10px rgba(0,0,0,.08);
  --glass-edge:linear-gradient(rgba(255,255,255,.64) 40%,rgba(255,255,255,0) 75%,rgba(255,255,255,0) 95%,rgba(255,255,255,.64));
  --serif:"Newsreader",Georgia,"Times New Roman",serif;
  --sans:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;
  --grain:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='180' height='180'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/></filter><rect width='180' height='180' filter='url(%23n)' opacity='0.5'/></svg>");
  --kb-ease:cubic-bezier(.4,0,.2,1);
}

/* 1b. re-point the _app.css names. Every _shared.css rule that already says
       var(--surface) or var(--text) turns craft for free, and the dark-mode
       :root inside _app.css is outranked by an unconditional later one. */
:root{
  --bg:          #FCF9F7;
  --surface:     #FDFDFC;
  --surface-2:   #F4F0ED;
  --forest:      #1B1C1E;
  --hairline:    rgba(3,3,2,.09);
  --text:        #030302;
  --text-2:      rgba(3,3,2,.75);
  --muted:       rgba(3,3,2,.65);
  --green:       #2F7A4A;
  --green-dark:  #24603A;
  --green-hover: #1E5231;
  --green-bright:#9BD8A9;
  --blue:        #0057FF;
  --yellow:      #FDE99B;
  --radius-card:   24px;
  --radius-nested: 18px;
  --radius-pill:   9999px;
  --shadow-card: var(--shadow-block);
  --shadow-hero: var(--shadow-block);
  --ease: cubic-bezier(.4,0,.2,1);
  --font: "Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;
}


/* -- 2. base -------------------------------------------------------------- */
html{ background:var(--beige); }
body{
  background:var(--beige);
  color:var(--ink);
  font-family:var(--sans);
  font-size:16px;
  line-height:1.5;
  letter-spacing:normal;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
}
h1,h2,h3,h4,blockquote{ font-family:var(--serif); font-weight:400; font-optical-sizing:auto; }
a:focus-visible,button:focus-visible,input:focus-visible{ outline:3px solid var(--jtek-blue); outline-offset:3px; }

/* The animated dot grid is a pre-craft device. The element stays in the DOM
   in case anything reads it; craft's page carries no overlay. */
#grid-overlay{ display:none !important; }


/* -- 3. header. Same situation as the KB: _app.css already flattens the
       .nav-outer bar to nothing and floats the single Back control as a
       fixed glass pill, with !important on every declaration. Keep that
       structure, re-cut the pill in craft glass: re-point the six --glass-*
       tokens, then one equally-!important rule for what tokens cannot carry
       (type, padding, offset, the masked rim). ------------------------- */
:root{
  --glass-bg:           linear-gradient(rgba(255,255,255,.6),rgba(255,255,255,.59) 25%,rgba(255,255,255,.6) 50%,rgba(255,255,255,.84) 75%);
  --glass-bg-hover:     linear-gradient(rgba(255,255,255,.66),rgba(255,255,255,.65) 25%,rgba(255,255,255,.66) 50%,rgba(255,255,255,.9) 75%);
  --glass-border:       transparent;
  --glass-blur:         blur(4px);
  --glass-shadow:       0 12px 12px 2px rgba(0,0,0,.10),0 2px 4px -1px rgba(0,0,0,.06);
  --glass-shadow-hover: 0 20px 25px 4px rgba(0,0,0,.10),0 10px 10px -5px rgba(0,0,0,.04);
}
body:not(.no-glass-back) .nav-outer .btn-ghost,
body:not(.no-glass-back) .topnav .btn-ghost,
.app-header__back{
  top:24px !important; left:24px !important;
  padding:10px 24px !important;
  font-family:var(--sans) !important;
  font-size:16px !important; line-height:24px !important; font-weight:500 !important;
  letter-spacing:normal !important; color:var(--ink) !important;
  background:var(--glass-bg) !important;
  border:0 !important;
  transition:box-shadow .5s cubic-bezier(0,0,.2,1),transform .5s cubic-bezier(0,0,.2,1) !important;
}
body:not(.no-glass-back) .nav-outer .btn-ghost::before,
.app-header__back::before{
  content:""; position:absolute; inset:0; border-radius:inherit; pointer-events:none;
  padding:1px; background:var(--glass-edge);
  -webkit-mask:linear-gradient(#fff,#fff) content-box,linear-gradient(#fff,#fff);
  -webkit-mask-composite:xor;
  mask:linear-gradient(#fff,#fff) content-box,linear-gradient(#fff,#fff);
  mask-composite:exclude;
}
body:not(.no-glass-back) .nav-outer .btn-ghost:hover,
body:not(.no-glass-back) .topnav .btn-ghost:hover,
.app-header__back:hover{ transform:translateY(-2px) !important; }
body:not(.no-glass-back) .nav-outer .btn-ghost:active,
body:not(.no-glass-back) .topnav .btn-ghost:active,
.app-header__back:active{ transform:translateY(1px) !important; }
.nav-outer .nav-logo{ display:none !important; }
.nav-outer .btn-nav-primary{
  background:var(--ink); color:#fff; font-family:var(--sans);
  font-size:16px; line-height:24px; font-weight:500; letter-spacing:normal;
  padding:8px 20px; border:0; border-radius:9999px; box-shadow:none;
  transition:background-color .2s var(--kb-ease),transform .2s var(--kb-ease);
}
.nav-outer .btn-nav-primary:hover{ background:rgba(3,3,2,.75); transform:none; }


/* -- 4. hero. craft's low-chrome surface: no card, roman serif straight onto
       the beige, one uppercase eyebrow, one 18/25.2 sub.

       padding-top is 88, not _shared.css's 56, at every width. The Back pill
       is fixed at top 24 and runs about 44 tall, and the .container column
       only clears it horizontally above ~1340. 88 puts the breadcrumb below
       the pill instead of under it, and it is craft's hero rhythm anyway. */
.tut-hero{ padding:88px 20px 56px; position:relative; z-index:4; }

.breadcrumb{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
  margin-bottom:24px;
  font-family:var(--sans); font-size:14px; line-height:21px; font-weight:400;
  letter-spacing:-.28px; color:var(--ink65);
}
.breadcrumb a{
  color:var(--ink65); font-weight:400; text-decoration:none;
  transition:color .2s var(--kb-ease);
}
.breadcrumb a:hover{ color:var(--ink); }
.breadcrumb svg{ width:12px; height:12px; color:var(--ink65); opacity:.5; flex-shrink:0; }
.breadcrumb .current{ color:var(--ink); font-weight:500; }

/* The blue capsule becomes a craft eyebrow: uppercase sans, no chrome, no
   bead. Same move as the KB's .hero-pill. */
.tut-hero-badge{
  display:inline-block;
  background:none !important; border:0 !important; box-shadow:none !important;
  padding:0; margin-bottom:24px; border-radius:0;
  font-family:var(--sans); font-size:16px; line-height:24px; font-weight:500;
  letter-spacing:.16px; text-transform:uppercase; color:var(--ink65) !important;
}
.tut-hero-badge .dot{ display:none !important; }

.tut-hero h1{
  font-family:var(--serif); font-weight:400; font-optical-sizing:auto;
  font-size:54px; line-height:59.4px; letter-spacing:-.02em;
  color:var(--ink); margin-bottom:24px; max-width:800px;
}
.tut-hero-sub{
  font-family:var(--sans); font-size:18px; line-height:25.2px; letter-spacing:-.36px;
  font-weight:400; color:var(--ink65); max-width:620px;
}

.meta-row{ display:flex; flex-wrap:wrap; gap:8px; margin-top:32px; }
.meta-chip,
.meta-chip.live{
  display:inline-flex; align-items:center; gap:6px;
  font-family:var(--sans); font-size:12px; line-height:18px; font-weight:500;
  letter-spacing:.12px; text-transform:uppercase;
  color:var(--ink65);
  background:none; border:1px solid var(--line);
  padding:5px 12px; border-radius:9999px;
  box-shadow:none;
}
.meta-chip svg,
.meta-chip.live svg{ width:12px; height:12px; color:var(--ink65); opacity:.7; }


/* -- 5. layout + sidebar TOC. craft would not put a card round a table of
       contents: a hairline rule and a list, on the beige.

       min-width:0 on both tracks is load-bearing. See section 13. -------- */
.tut-layout{
  display:grid; grid-template-columns:240px minmax(0,1fr);
  gap:48px; padding-bottom:120px;
}
.tut-side{ min-width:0; position:sticky; top:96px; height:fit-content; padding-top:4px; }
.tut-main{ min-width:0; }

.side-label{
  font-family:var(--sans); font-size:14px; line-height:21px; font-weight:500;
  letter-spacing:.14px; text-transform:uppercase; color:var(--ink65);
  margin-bottom:12px; padding:0 0 12px;
  border-bottom:1px solid var(--line);
}
.side-nav{ display:flex; flex-direction:column; gap:2px; position:relative; }
/* the vertical hairline spine, retinted */
.side-nav::before{ background:var(--line) !important; left:19px; width:1px; }

.side-link{
  display:flex; align-items:center; gap:12px;
  padding:8px 12px; border-radius:10px;
  font-family:var(--sans); font-size:16px; line-height:22.4px; letter-spacing:-.32px;
  font-weight:400; color:var(--ink65); text-decoration:none;
  background:none;
  border-left:2px solid transparent;
  transition:color .2s var(--kb-ease),background-color .2s var(--kb-ease),border-color .2s var(--kb-ease);
}
.side-link:hover{ color:var(--ink); background:rgba(3,3,2,.04); }
.side-link .num{
  position:relative; z-index:1; flex-shrink:0;
  width:24px; height:24px; border-radius:9999px;
  display:flex; align-items:center; justify-content:center;
  background:#FCF9F7; border:1px solid var(--line); box-shadow:none;
  font-family:var(--sans); font-size:12px; line-height:1; font-weight:500;
  color:var(--ink65);
  transition:color .2s var(--kb-ease),border-color .2s var(--kb-ease),background-color .2s var(--kb-ease);
}
.side-link.active{
  color:var(--ink); font-weight:500;
  background:none; border-left-color:var(--jtek-blue);
}
.side-link.active .num{
  background:none; border-color:var(--ink); color:var(--ink); box-shadow:none;
}
/* .done is the scroll-spy's "already read" state. craft has no filled green
   counter; a quieter hairline reads the same. */
.side-link.done .num{ background:none; border-color:var(--line); color:var(--ink65); }


/* -- 6. the step. Serif title, hairline number square, 16/25.6 prose. ----- */
.tut-step{ padding:48px 0; border-bottom:1px solid var(--line); scroll-margin-top:96px; }
.tut-step:first-child{ padding-top:8px; }
.tut-step:last-child{ border-bottom:none; }

.step-head{ display:flex; align-items:center; gap:14px; margin-bottom:16px; }
/* craft has no gradient chips. A hairline square, ink, on the beige. */
.step-num-lg{
  width:32px; height:32px; flex-shrink:0;
  display:flex; align-items:center; justify-content:center;
  background:none; color:var(--ink);
  border:1px solid var(--line); border-radius:12px;
  box-shadow:none;
  font-family:var(--sans); font-size:14px; font-weight:500; letter-spacing:normal;
}
.step-label{
  font-family:var(--sans); font-size:14px; line-height:21px; font-weight:500;
  letter-spacing:.14px; text-transform:uppercase; color:var(--ink65);
}
.step-title{
  font-family:var(--serif); font-weight:400; font-optical-sizing:auto;
  font-size:36px; line-height:43.92px; letter-spacing:-1.08px;
  color:var(--ink); margin-bottom:16px;
}
.step-body{
  font-family:var(--sans); font-size:16px; line-height:25.6px; letter-spacing:-.32px;
  color:var(--ink75); max-width:660px;
}
.step-body p{ color:var(--ink75); margin-bottom:16px; letter-spacing:-.32px; }
.step-body p:last-child{ margin-bottom:0; }
.step-body strong{ font-weight:500; color:var(--ink); }
.step-body ul{ margin:0 0 16px 20px; padding:0; color:var(--ink75); line-height:25.6px; }
.step-body li{ margin-bottom:6px; }
.step-body code{
  background:rgba(3,3,2,.05); color:var(--ink);
  border:1px solid var(--line); border-radius:8px;
  padding:1px 6px; font-size:14px; font-weight:400;
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
}
.step-body a{
  color:var(--ink); font-weight:500; border-bottom:0;
  text-decoration:underline; text-decoration-color:rgba(3,3,2,.25);
  text-underline-offset:3px;
  transition:text-decoration-color .2s var(--kb-ease);
}
.step-body a:hover{ text-decoration-color:var(--ink); border-bottom:0; }


/* -- 7. callout. craft's pastel plate, not a tinted border box. ----------- */
.callout{
  display:flex; align-items:flex-start; gap:12px;
  background:var(--sky-b);
  border:0; border-radius:18px;
  padding:20px 24px; margin-top:24px;
  max-width:660px;
}
.callout-ic{
  width:28px; height:28px; flex-shrink:0; border-radius:10px;
  display:flex; align-items:center; justify-content:center;
  background:rgba(3,3,2,.08); color:var(--ink); box-shadow:none;
}
.callout-ic svg{ width:14px; height:14px; }
.callout-t{
  font-family:var(--sans); font-size:16px; line-height:24px; letter-spacing:-.32px;
  color:var(--ink);
}
.callout-t b{ font-weight:500; }
.callout-t code{
  background:rgba(3,3,2,.08); color:var(--ink);
  border-radius:6px; padding:1px 6px; font-size:14px; font-weight:400;
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
}
.callout-t a{
  color:var(--ink); font-weight:500; border-bottom:0;
  text-decoration:underline; text-decoration-color:rgba(3,3,2,.3);
  text-underline-offset:3px;
}


/* -- 8. the mockup well. _shared.css builds a two-tone ivory box with a
       printed dot grid inside it. craft's equivalent is one flat paper
       surface, hairline, radius 24, no grid. ------------------------------ */
.step-visual{
  margin-top:32px;
  background:#FBF8F6;
  border:1px solid var(--line); border-radius:24px;
  padding:32px 28px;
  overflow:hidden; position:relative;
  box-shadow:none;
}
.step-visual::before{ content:none !important; background-image:none !important; }


/* -- 9. the .jtek-* app frame. craft's app-window abstraction: radius 18,
       hairline, block shadow, --rail sidebar, --chrome inks, 12px floor. -- */
.jtek-frame{
  position:relative; z-index:1;
  display:grid; grid-template-columns:176px 1fr;
  min-height:360px;
  background:#FDFDFC;
  border:1px solid var(--line); border-radius:18px;
  box-shadow:var(--shadow-block);
  overflow:hidden;
}
.jtek-side{
  background:var(--rail); border-right:0;
  padding:16px 10px;
  display:flex; flex-direction:column; gap:2px;
}
.jtek-side-head{
  display:flex; align-items:center; gap:8px;
  padding:4px 8px 14px; margin-bottom:6px;
  border-bottom:1px solid rgba(255,255,255,.08);
}
.jtek-side-logo{
  width:22px; height:22px; border-radius:7px;
  background:var(--jtek-blue); color:#fff;
  display:flex; align-items:center; justify-content:center;
  font-family:var(--sans); font-size:12px; font-weight:500;
}
.jtek-side-name{ font-family:var(--sans); font-size:14px; font-weight:500; color:rgba(255,255,255,.92); }
.jtek-side-item{
  display:flex; align-items:center; gap:9px;
  padding:8px 10px; border-radius:8px;
  font-family:var(--sans); font-size:12px; line-height:18px; font-weight:400;
  color:rgba(255,255,255,.45);
}
.jtek-side-item.active{ background:rgba(255,255,255,.08); color:#fff; font-weight:500; }
/* the pulsing attention ring is not a craft device */
.jtek-side-item.highlight{
  background:rgba(255,255,255,.08); color:#fff; font-weight:500;
  box-shadow:none; animation:none !important;
}
.jtek-side-item svg{ width:13px; height:13px; flex-shrink:0; }

.jtek-main{
  background:#FDFDFC; padding:20px 22px; min-width:0;
  display:flex; flex-direction:column; gap:14px;
}
.jtek-topbar{
  display:flex; align-items:center; justify-content:space-between; gap:12px;
  padding-bottom:14px; border-bottom:1px solid var(--line);
}
.jtek-crumb{ font-family:var(--sans); font-size:12px; line-height:18px; color:var(--chrome-3); }
.jtek-crumb b{ color:var(--chrome-1); font-weight:500; }

.jtek-btn-primary{
  position:relative;
  display:inline-flex; align-items:center; gap:6px;
  background:var(--jtek-blue); color:#fff;
  padding:6px 14px; border-radius:9999px;
  font-family:var(--sans); font-size:12px; line-height:18px; font-weight:500;
  letter-spacing:normal; box-shadow:none;
}
.jtek-btn-primary.highlight::after{ content:none !important; animation:none !important; }
.jtek-btn-primary svg{ width:12px; height:12px; }
.jtek-btn-ghost{
  display:inline-flex; align-items:center; gap:5px;
  background:#FDFDFC; color:var(--chrome-1);
  border:1px solid var(--line); border-radius:9999px;
  padding:6px 13px;
  font-family:var(--sans); font-size:12px; line-height:18px; font-weight:400;
  letter-spacing:normal;
}
.jtek-btn-ghost svg{ width:11px; height:11px; }

.jtek-compose-tabs{ display:flex; gap:4px; }
.jtek-compose-tab{
  padding:5px 12px; border-radius:8px;
  font-family:var(--sans); font-size:12px; line-height:18px; font-weight:400;
  color:var(--chrome-3); background:none; box-shadow:none;
}
.jtek-compose-tab.on{
  background:#FBF8F6; color:var(--ink); font-weight:500;
  border:1px solid var(--line); padding:4px 11px; box-shadow:none;
}

.jtek-list{ display:flex; flex-direction:column; gap:6px; }
.jtek-list-row{
  display:flex; align-items:center; gap:10px;
  padding:10px 12px; border-radius:12px;
  background:#FBF8F6; border:1px solid var(--line);
}
.jtek-list-row.selected{ background:var(--sky-b); border-color:transparent; }
.jtek-list-chk{
  width:16px; height:16px; flex-shrink:0; border-radius:5px;
  border:1px solid var(--line); background:#FDFDFC;
  display:flex; align-items:center; justify-content:center;
}
.jtek-list-chk.on{ background:var(--jtek-blue); border-color:var(--jtek-blue); color:#fff; }
.jtek-list-chk svg{ width:10px; height:10px; }
.jtek-list-name{ font-family:var(--sans); font-size:12px; line-height:18px; font-weight:500; color:var(--chrome-1); flex:1; min-width:0; }
.jtek-list-meta{ font-family:var(--sans); font-size:12px; line-height:18px; color:var(--chrome-3); }

/* the five accent tags collapse onto craft's three pastel plates */
.jtek-tag{
  display:inline-flex; align-items:center;
  padding:2px 10px; border-radius:9999px;
  font-family:var(--sans); font-size:12px; line-height:18px; font-weight:500;
  letter-spacing:normal;
}
.jtek-tag.blue,.jtek-tag.purple,.jtek-tag.pink{ background:var(--card-blue); color:#16223D; }
.jtek-tag.green{ background:var(--card-green); color:#12331D; }
.jtek-tag.amber{ background:var(--card-yellow); color:#3A2E08; }

.jtek-field{ background:#FBF8F6; border:1px solid var(--line); border-radius:10px; padding:8px 12px; }
.jtek-field-lbl{
  font-family:var(--sans); font-size:12px; line-height:18px; font-weight:500;
  letter-spacing:.12px; text-transform:uppercase; color:var(--chrome-3);
  margin-bottom:2px;
}
.jtek-field-val{ font-family:var(--sans); font-size:12px; line-height:18px; font-weight:500; color:var(--chrome-1); }

/* Every pill in these mockups, ours and the per-tutorial ones. They all carry
   a 9999px or 100px radius and none declared nowrap, so on a phone a label
   that wrapped turned the stadium into an ellipse: "+ Create Calendar" came
   out 122 by 48, "Via Facebook" 87 by 54, "Get my quote" 95 by 45. A pill
   holds one line or it is not a pill. Listed rather than matched on radius so
   the round avatars, the switch and the progress tracks keep their shapes. */
.jtek-btn-primary,
.jtek-btn-ghost,
.jtek-tag,
.int-btn,
.int-badge,
.ed-hero-btn,
.tagsel,
.tag-chip,
.prov-btn,
.prov-badge,
.pipe-col-count,
.lf-list-saved,
.lf-node .nbadge,
.lc-set-pill,
.igr-chip,
.iga-reply-tag,
.ev-tag,
.ev-reg-kicker,
.em-tag-sent,
.em-tag-draft,
.em-count,
.tut-cta-btn{ white-space:nowrap; }


/* -- 10. the closing CTA. _shared.css runs a blue gradient card with a
        radial glow. craft closes on a pastel plate with ink type. -------- */
.tut-cta-block{
  position:relative; overflow:hidden;
  background:var(--sky-b) !important;
  border:0; border-radius:24px;
  padding:40px; margin-bottom:64px;
  color:var(--ink);
  box-shadow:none;
}
.tut-cta-block::before{ content:none !important; background:none !important; }
.tut-cta-block h3{
  font-family:var(--serif); font-weight:400; font-optical-sizing:auto;
  font-size:36px; line-height:43.92px; letter-spacing:-1.08px;
  color:var(--ink); margin-bottom:12px; max-width:560px;
}
.tut-cta-block p{
  font-family:var(--sans); font-size:16px; line-height:25.6px; letter-spacing:-.32px;
  color:var(--ink75); opacity:1; max-width:560px; margin-bottom:24px;
}
.tut-cta-block p:last-child{ margin-bottom:0; }
.tut-cta-btn{
  display:inline-flex; align-items:center; gap:8px;
  background:var(--ink); color:#fff;
  padding:10px 24px; border-radius:9999px;
  font-family:var(--sans); font-size:16px; line-height:24px; font-weight:500;
  letter-spacing:normal; text-decoration:none;
  border:0; box-shadow:none; cursor:pointer;
  transition:background-color .2s var(--kb-ease),transform .2s var(--kb-ease);
}
.tut-cta-btn:hover{ background:rgba(3,3,2,.78); transform:none; box-shadow:none; }
.tut-cta-btn:active{ transform:translateY(1px); }
.tut-cta-btn svg{ width:14px; height:14px; }


/* -- 11. related articles. Same recipe as help/_kb-craft.css section 10, so
        a reader crossing between the two families sees one card. The nine
        [data-acc] accent rules are (0,2,0), so the neutralisers here carry
        the attribute too. ------------------------------------------------ */
.related-h{
  font-family:var(--serif); font-weight:400; font-optical-sizing:auto;
  font-size:36px; line-height:43.92px; letter-spacing:-1.08px;
  color:var(--ink); margin-bottom:24px;
}
/* 2026-08-11: the same craft-learn card the hub now uses, ported verbatim from
   help/_kb-craft.css section 16j so a reader crossing from /help into a
   tutorial sees one card and not two. No markup edit on the 17 pages: the four
   existing children are placed into a grid whose first area is the art tile,
   and .related-steps / .related-title ride inside it. The tile art (brand chip,
   spark, torn corner, arcs) is four background layers on ::before. */
.related-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(260px,1fr)); gap:32px 24px; margin-bottom:64px; }
.related-card,
.related-card[data-acc]{
  position:relative;
  display:grid; grid-template-columns:1fr; grid-template-rows:auto auto auto;
  grid-template-areas:"tile" "sub" "arrow";
  gap:0; padding:12px 12px 20px;
  background:#F9F7F4;
  border:1px solid rgba(3,3,2,.05); border-radius:16px;
  box-shadow:none;
  text-decoration:none; color:inherit;
  transition:transform .3s var(--kb-ease);
}
.related-card:hover{ transform:translateY(-4px); box-shadow:none; }
.related-card:active{ transform:translateY(-1px); }
.related-card:focus-visible{ outline:3px solid var(--jtek-blue); outline-offset:3px; }
.related-card::before{
  content:""; grid-area:tile; position:relative; z-index:0;
  width:100%; aspect-ratio:16/9; border-radius:12px;
  background-color:var(--card-blue);
  background-repeat:no-repeat;
  background-position:right 12px top 12px,16px 14px,left bottom,center;
  background-size:28px 28px,18px 18px,72% 40%,100% 100%;
  background-image:
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 28 28'><rect width='28' height='28' rx='9' fill='%23FDFDFC'/><path d='M17.6 7.8v9.1c0 2.4-1.7 3.9-4.1 3.9-2.2 0-3.8-1.2-4.3-3.2' fill='none' stroke='%230057FF' stroke-width='2.6' stroke-linecap='round'/></svg>"),
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><g fill='none' stroke='%23030302' stroke-opacity='.85' stroke-width='1.7' stroke-linecap='round'><path d='M12 2v6M12 16v6M2 12h6M16 12h6M5.6 5.6l3.2 3.2M15.2 15.2l3.2 3.2M18.4 5.6l-3.2 3.2M8.8 15.2l-3.2 3.2'/></g></svg>"),
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 100' preserveAspectRatio='none'><path d='M0,22 L9,19 L15,27 L23,23 L31,31 L39,26 L48,35 L56,30 L63,38 L71,34 L79,43 L87,38 L95,48 L102,43 L109,54 L117,50 L123,60 L131,56 L137,66 L145,63 L151,73 L159,70 L165,80 L173,78 L179,88 L187,85 L193,96 L200,93 L200,100 L0,100 Z' fill='%23FDFDFC'/></svg>"),
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 400 225' preserveAspectRatio='none'><g fill='none' stroke='%23ffffff' stroke-width='1.4'><path d='M-12 48 C 84 4 148 76 172 225' stroke-opacity='.5'/><path d='M92 -12 C 168 56 248 100 412 124' stroke-opacity='.4'/><path d='M318 0 L318 225' stroke-opacity='.32'/></g></svg>");
}
.related-card:nth-child(2)::before{ background-color:var(--card-yellow); }
.related-card:nth-child(3)::before{ background-color:var(--sky-b); }
.related-card:nth-child(4)::before{ background-color:var(--card-green); }
.related-steps,
.related-card[data-acc] .related-steps{
  grid-area:tile; align-self:end; justify-self:start; z-index:2;
  display:block; width:auto; max-width:62%;
  margin:0 0 13px 16px;
  font-family:var(--sans); font-size:12px; line-height:18px; font-weight:600;
  letter-spacing:.06em; text-transform:uppercase; color:var(--ink);
  background:none; border:0; padding:0; border-radius:0;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.related-title{
  grid-area:tile; align-self:start; justify-self:stretch; z-index:2;
  margin:36px 50px 0 16px;
  font-family:var(--serif); font-weight:400; font-optical-sizing:auto;
  font-size:18px; line-height:21.6px; letter-spacing:-.36px; color:var(--ink);
  display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical; overflow:hidden;
}
.related-sub{
  grid-area:sub; z-index:2; padding:16px 8px 0;
  font-family:var(--sans); font-size:14px; line-height:22.75px; letter-spacing:-.14px;
  color:rgba(3,3,2,.5);
  display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical; overflow:hidden;
}
.related-arrow{
  grid-area:arrow; z-index:2; display:inline-flex; align-items:center; gap:6px;
  margin:0; padding:12px 8px 0;
  font-family:var(--sans); font-size:13px; line-height:20px; letter-spacing:normal;
  font-weight:400; color:rgba(3,3,2,.35); opacity:1;
  transition:color .2s var(--kb-ease);
}
.related-card:hover .related-arrow{ opacity:1; transform:none; color:var(--ink75); }
.related-arrow svg{ width:13px; height:13px; }


/* -- 12. video walkthrough card + footer. Both share the KB's recipe. ----- */
.kb-video{
  margin-bottom:24px;
  border:1px solid var(--line); border-radius:24px;
  background:#FDFDFC;
  box-shadow:var(--shadow-block);
  overflow:hidden;
}
.kb-video-head{
  display:flex; align-items:center; flex-wrap:wrap; gap:12px; row-gap:8px;
  padding:20px 24px; border-bottom:1px solid var(--line);
}
.kb-video-badge{
  display:inline-flex; align-items:center; gap:6px; flex-shrink:0;
  font-family:var(--sans); font-size:12px; line-height:18px; font-weight:500;
  letter-spacing:.12px; text-transform:uppercase;
  color:var(--ink65); background:none; border:1px solid var(--line);
  padding:5px 12px; border-radius:9999px;
}
.kb-video-badge svg{ width:12px; height:12px; }
.kb-video-title{
  font-family:var(--sans); font-size:16px; line-height:22.4px; letter-spacing:-.32px;
  font-weight:500; color:var(--ink); min-width:0;
}
.kb-video-read{
  margin-left:auto; flex-shrink:0;
  display:inline-flex; align-items:center; gap:4px;
  font-family:var(--sans); font-size:16px; line-height:22.4px; letter-spacing:-.32px;
  font-weight:400; color:var(--ink65); text-decoration:none;
  transition:color .2s var(--kb-ease);
}
.kb-video-read:hover{ color:var(--ink); }
.kb-video-read:focus-visible{ outline:3px solid var(--jtek-blue); outline-offset:3px; border-radius:4px; }
/* the 16/9 box is the embed's own contract; only the letterbox is retinted */
.kb-video-frame{ position:relative; aspect-ratio:16/9; background:var(--rail); }
.kb-video-frame video{
  position:absolute; inset:0; width:100%; height:100%;
  object-fit:cover; display:block; border:0;
}

.footer,
div.footer{
  text-align:center;
  padding:64px 20px 32px;
  border-top:0 !important;
  font-family:var(--sans); font-size:16px; line-height:22.4px; letter-spacing:-.32px;
  color:var(--ink65);
}
.footer a{
  color:var(--ink); font-weight:500; text-decoration:none;
  transition:color .2s var(--kb-ease);
}
.footer a:hover{ color:var(--ink65); text-decoration:none; }


/* ==========================================================================
   13. THE COLLAPSED LAYOUT, and the overflow that killed the first probe.

   At 900 and below _shared.css turns .tut-layout into a single `1fr` column
   and re-lays .side-nav as a horizontal rail of nowrap .side-link chips with
   overflow-x:auto. The scroll container is .side-nav, but the GRID ITEM is
   its parent .tut-side, and a grid item's min-width defaults to `auto`. That
   automatic minimum resolves against the rail's full unbroken width, so the
   `1fr` track was sized to the rail (595px on the 4-step pages) instead of
   to the viewport, and the document scrolled sideways: 611px against a 500px
   viewport, which is the 615-vs-500 the earlier half-craft probe reported.

   Measured on the UNTOUCHED original, so it is a pre-existing _shared.css
   bug, not something the craft skin introduced. Confirmed by isolation at
   500px: min-width:0 on .tut-side gives 500, contain:inline-size on
   .side-nav gives 500, minmax(0,1fr) on the track gives 500, and
   overflow-x:hidden on .side-nav still gives 611 (the scroll container is
   not the item being measured).

   The fix is one keyword: minmax(0,1fr) instead of 1fr, belt-and-braces with
   min-width:0 on both tracks in section 5. The rail then scrolls inside its
   own box, which is what it was always meant to do.

   Everything else in this block re-states, at _shared.css's own
   breakpoints, a property this sheet sets unconditionally above. Without
   these, loading last would silently un-collapse the layout on a phone.
   ========================================================================== */
@media (max-width:900px){
  .tut-layout{ grid-template-columns:minmax(0,1fr); gap:32px; }
  .tut-side{ position:static; padding-bottom:12px; border-bottom:1px solid var(--line); }
  .side-label{ border-bottom:0; padding-bottom:0; }
  .side-nav{ flex-direction:row; overflow-x:auto; gap:6px; padding-bottom:4px; }
  .side-nav::before{ display:none; }
  .side-link{
    flex-shrink:0; white-space:nowrap;
    border-left:0; border-bottom:2px solid transparent;
    padding:8px 12px;
  }
  .side-link.active{ border-left:0; border-bottom-color:var(--jtek-blue); }
  .jtek-frame{ grid-template-columns:1fr; min-height:auto; }
  .jtek-side{ display:none; }
  .related-grid{ grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); }
}

@media (max-width:768px){
  /* THE BACK PILL COMES OUT OF THE AIR, same move as help/_kb-craft.css.
     At 1440 it floats in the empty left gutter and never touches a word. At
     375 the reading column starts at the page edge, so a fixed opaque pill at
     top 24 / left 24 sat on the article body and hid words as it scrolled.
     Below it rejoins the flow at the top of the page and scrolls away.
     relative, not static: the ::before rim is absolutely positioned and needs
     this box to anchor it. */
  body:not(.no-glass-back) .nav-outer .btn-ghost,
  body:not(.no-glass-back) .topnav .btn-ghost,
  .app-header__back{
    position:relative !important;
    top:auto !important; left:auto !important; z-index:auto !important;
  }
  /* the pill is in the flow now, so this padding is its offset. _app.css
     flattens this bar to padding 0 with !important at (0,3,1), so the rule
     that puts a gutter back has to carry both. */
  body:not(.no-glass-back) .nav-outer > nav,
  body:not(.no-glass-back) .nav-outer nav.topnav{ padding:16px 16px 0 !important; }
  /* the hero no longer has to clear anything */
  .tut-hero{ padding:40px 20px 40px; }
  .tut-hero h1{ font-size:38px; line-height:.99; letter-spacing:-.02em; }
  .tut-hero-sub{ font-size:17px; line-height:23.8px; letter-spacing:-.34px; }
  .tut-hero-badge{ font-size:14px; line-height:21px; letter-spacing:.14px; }

  .tut-step{ padding:36px 0; }
  .step-title,.related-h,.tut-cta-block h3{ font-size:24px; line-height:29.28px; letter-spacing:-.48px; }
  .tut-layout{ padding-bottom:72px; }

  .kb-video-head{ padding:16px; gap:10px; }
  .kb-video-title{ font-size:16px; line-height:22.4px; }
  .kb-video-read{ font-size:16px; line-height:22.4px; }
}

/* Three per-tutorial rows are laid out in fixed track widths that only add up
   on a desktop pane, and .step-visual clips, so on a phone their right-hand
   end was simply gone with nothing to say so. Same defect the KB mockups had.
   The board keeps all five stages and scrolls, which is what the KB pipeline
   mockups already do; the other two wrap. */
@media (max-width:640px){
  /* create-pipeline: five 1fr stages in a 231px pane cut off at stage three */
  .pipe-board{
    grid-template-columns:none;
    grid-auto-flow:column; grid-auto-columns:132px;
    overflow-x:auto; padding-bottom:4px;
  }
  /* smart-lists: 110 + 90 + 1fr + auto pushed the remove control past the
     edge, so the row that deletes a filter had no visible way to be used */
  .filter-row{ display:flex; flex-wrap:wrap; }
  .filter-row .filter-pill{ flex:1 1 auto; min-width:0; }
  /* landing-page: four tabs on one nowrap line ran 27px past the frame */
  .jtek-compose-tabs{ flex-wrap:wrap; row-gap:4px; }
}

@media (max-width:560px){
  .tut-hero{ padding:40px 16px 32px; }
  .related-grid{ grid-template-columns:1fr; gap:20px; }
  .tut-cta-block{ padding:28px; border-radius:24px; }
  .step-visual{ padding:16px; border-radius:18px; }
  .related-card,
  .related-card[data-acc]{ padding:12px 12px 20px; }
}

@media (max-width:520px){
  .kb-video-head{ flex-direction:column; align-items:flex-start; gap:8px; }
  .kb-video-read{ margin-left:0; }
}

/* -- 9. the color pass (2026-08-11) --------------------------------------
   The refresh left these pages cream and ink only, and against the hub's
   pastel cards they read as a different site. Two color moments, both in
   the page's OWN hue: every tutorial <body> carries data-hue stamped from
   its hub card, so the tile a reader clicks is the color of the page that
   opens. The hero container becomes that pastel card (kit grain, the same
   sweep arcs as the hub hero), and the step numbers fill with the hue.
   Everything else stays the skin's cream. Source order note: these
   unconditional rules outrank every media block above, so the responsive
   paddings are re-declared at the bottom of this section. */
body[data-hue="0"]{ --th:var(--card-blue); }
body[data-hue="1"]{ --th:var(--card-yellow); }
body[data-hue="2"]{ --th:var(--sky-b); }
body[data-hue="3"]{ --th:var(--card-green); }
body[data-hue="4"]{ --th:var(--sky-a); }

/* the hero says who it is without a trail: the KB heroes never had a
   breadcrumb and Jesse cut this one for the match (2026-08-12). Structure
   stays in the DOM for anyone navigating without CSS. */
.tut-hero .breadcrumb{ display:none; }
.tut-hero{ padding:88px 20px 48px; }
.tut-hero .container{
  position:relative; border-radius:24px; overflow:hidden;
  padding:64px 48px 72px;
  background:var(--th,var(--sky-b));
  box-shadow:var(--shadow-block);
}
/* the kit grain */
.tut-hero .container::before{
  content:""; position:absolute; inset:0; z-index:0; pointer-events:none;
  opacity:.45; mix-blend-mode:overlay; background-image:var(--grain);
}
/* the hub hero's sweep arcs, same proportions */
.tut-hero .container::after{
  content:""; position:absolute; inset:0; z-index:0; pointer-events:none;
  background-repeat:no-repeat; background-size:100% 100%;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1080 480' preserveAspectRatio='none'><g fill='none' stroke='%23ffffff' stroke-width='1.6'><path d='M-30 120 C 210 10 400 180 470 500' stroke-opacity='.5'/><path d='M240 -30 C 430 140 660 240 1110 290' stroke-opacity='.4'/><path d='M868 0 L868 480' stroke-opacity='.32'/></g></svg>");
}
.tut-hero .container > *{ position:relative; z-index:1; }
/* the sub reads at full ink on a pastel field */
.tut-hero-sub{ color:var(--ink75); }

/* the step number squares fill with the page hue */
.step-num-lg{ background:var(--th,var(--sky-b)); border-color:transparent; }

/* the Back pill joins the kit (2026-08-12): kit surface, hairline, the
   block shadow, and the kit's leftward nudge instead of the glass lift.
   The !importants match the glass block's own, which this replaces; the
   glass edge ring goes so the hairline is the only ring. */
body:not(.no-glass-back) .nav-outer .btn-ghost,
body:not(.no-glass-back) .topnav .btn-ghost{
  background:#FDFDFC !important;
  border:1px solid var(--line) !important;
  border-radius:9999px !important;
  box-shadow:var(--shadow-block) !important;
  color:var(--ink) !important;
  backdrop-filter:none !important; -webkit-backdrop-filter:none !important;
  transition:transform .2s var(--kb-ease),background-color .2s var(--kb-ease) !important;
}
body:not(.no-glass-back) .nav-outer .btn-ghost::before,
body:not(.no-glass-back) .topnav .btn-ghost::before{ display:none !important; }
body:not(.no-glass-back) .nav-outer .btn-ghost:hover,
body:not(.no-glass-back) .topnav .btn-ghost:hover{
  background:#fff !important; transform:translateX(-2px) !important;
}
body:not(.no-glass-back) .nav-outer .btn-ghost:active,
body:not(.no-glass-back) .topnav .btn-ghost:active{
  transform:translateX(-2px) scale(.98) !important;
}
.nav-outer .btn-ghost:focus-visible,
.topnav .btn-ghost:focus-visible{ outline:3px solid var(--jtek-blue); outline-offset:3px; }

@media (max-width:768px){
  .tut-hero{ padding:40px 12px 32px; }
  .tut-hero .container{ padding:48px 24px 56px; border-radius:20px; }
}
@media (max-width:520px){
  .tut-hero{ padding:32px 10px 24px; }
  .tut-hero .container{ padding:40px 18px 48px; }
}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms !important; animation-iteration-count:1 !important;
    transition-duration:.01ms !important; scroll-behavior:auto !important;
  }
}
