/* Blue Sail Clients — client dashboard. Uses the bluesail theme's tokens where present,
   with its own fallbacks so the plugin still looks right on any theme. */
/* The palette is declared on both: the dialog is moved to <body> at runtime, out of
   .bsc and therefore out of scope for tokens declared only there — which left it with
   no background at all and the page showing through it. */
.bsc, .bsc-modal{
  --bsc-bg:#05070a; --bsc-panel:#0b0f14; --bsc-panel2:#0e141b;
  --bsc-blue:#19c8e0; --bsc-aqua:#7fe9f5; --bsc-dark:#03151a;
  --bsc-line:rgba(25,200,224,.30); --bsc-soft:rgba(25,200,224,.13);
  --bsc-txt:#e8f4f6; --bsc-dim:#8fa6ac; --bsc-body:#cfdde0;
  --bsc-ok:#9df29b; --bsc-warn:#ffd479; --bsc-bad:#ff9b9b;
}
.bsc{
  max-width:780px;margin:0 auto;color:var(--bsc-txt);font-size:17px;line-height:1.6;
}
.bsc *{box-sizing:border-box}
.bsc h1{font-size:clamp(28px,4vw,40px);font-weight:800;letter-spacing:-.02em;margin:8px 0 0}
.bsc h2{font-size:22px;font-weight:800;margin:0}
.bsc h3{font-size:19px;font-weight:700;margin:0 0 6px}
.bsc p{margin:0 0 12px}
.bsc a{color:var(--bsc-aqua)}
.bsc-dim{color:var(--bsc-dim)}
/* a blank line typed into the Wording tab becomes a paragraph gap, not two cramped
   breaks — sits inside an existing <p>, so it spaces rather than nests */
.bsc-para-gap{display:block;height:14px}
.bsc-small{font-size:14px}
.bsc-head{margin:0 0 26px}
.bsc-kicker{font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:11px;letter-spacing:.24em;
  text-transform:uppercase;color:var(--bsc-blue);margin-bottom:6px}

/* cards */
.bsc-card{position:relative;background:var(--bsc-panel);border:1px solid var(--bsc-line);
  padding:24px;margin:0 0 16px;overflow:hidden}
.bsc-card::before{content:"";position:absolute;top:0;left:0;width:34px;height:1px;
  background:var(--bsc-aqua);box-shadow:0 0 10px var(--bsc-aqua)}

/* Hub — the landing grid. Everything the client can do is a destination here rather
   than one long scroll, so the width opens up past reading measure for the tiles. */
/* The theme wraps page content at reading width, which is right for the section
   screens and wrong for a launcher — four tiles across need more room than a
   paragraph does, so the landing steps outside the container and re-centres. */
.bsc-wide{max-width:none;width:min(1140px,calc(100vw - 32px));position:relative;left:50%;
  transform:translateX(-50%)}
/* 240px against the 1140px cap lands exactly four across, and steps down to three
   and two on its own as the screen narrows — no breakpoint list to keep in step. */
.bsc-hub{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;margin:26px 0 0;
  grid-auto-rows:1fr}   /* one two-line description must not make its whole row taller than the rest */
.bsc-tile{position:relative;display:flex;flex-direction:column;align-items:center;
  text-align:center;gap:12px;padding:30px 20px 26px;background:var(--bsc-panel);border:1px solid var(--bsc-line);
  overflow:hidden;transition:border-color .18s ease,box-shadow .18s ease,transform .18s ease}
.bsc .bsc-tile{color:var(--bsc-txt);text-decoration:none}
.bsc .bsc-tile:hover,.bsc .bsc-tile:focus-visible{border-color:var(--bsc-blue);transform:translateY(-2px);
  box-shadow:0 0 26px rgba(25,200,224,.18);color:var(--bsc-txt)}
/* the card family's corner accent, held back until hover so eight of them don't shout */
.bsc-tile::before{content:"";position:absolute;top:0;left:0;width:34px;height:1px;background:var(--bsc-aqua);
  box-shadow:0 0 10px var(--bsc-aqua);opacity:0;transition:opacity .18s ease}
.bsc-tile:hover::before,.bsc-tile:focus-visible::before{opacity:1}
.bsc-tile-ico{display:block;line-height:0}
.bsc-tile-ico svg{display:block}
.bsc-tile-title{font-size:19px;font-weight:800;letter-spacing:-.01em;color:var(--bsc-aqua)}
.bsc-tile-desc{font-size:15px;line-height:1.45;color:var(--bsc-dim)}
/* In the flow under the description, not pinned to the corner: this wording is
   editable, so a corner box collides with the icon the moment anyone writes a badge
   longer than a word or two — which "Active to 11 Sep 27" promptly did. */
/* pushed to the bottom of the tile, so icons, titles and descriptions line up across
   a row whether or not a tile has a badge, and every badge sits on one baseline */
.bsc-tile-badge{margin-top:auto;font-family:"SF Mono",ui-monospace,Menlo,monospace;
  font-size:10px;letter-spacing:.13em;text-transform:uppercase;padding:4px 10px;
  border-radius:999px;background:var(--bsc-soft);color:var(--bsc-aqua);line-height:1.5}
.bsc-tile-badge.warn{color:var(--bsc-warn);background:rgba(255,212,121,.12)}
.bsc-tile-badge.ok{color:var(--bsc-ok);background:rgba(157,242,155,.12)}
.bsc-tile-badge.bad{color:var(--bsc-bad);background:rgba(255,155,155,.12)}
/* a tile that leaves the site says so, rather than surprising them with a new tab */
.bsc-tile.is-external::after{content:"↗";position:absolute;bottom:10px;right:12px;
  font-size:13px;color:var(--bsc-dim)}
.bsc-tile.is-external:hover::after{color:var(--bsc-aqua)}
.bsc-hub-alert{display:flex;gap:14px;align-items:center;justify-content:space-between;flex-wrap:wrap}
/* admin-only, and quiet: Chris needs the route in, the client never sees it */
.bsc-hub-edit{display:flex;gap:16px;justify-content:flex-end;margin:22px 0 -10px}
.bsc .bsc-hub-edit a{font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:10px;
  letter-spacing:.16em;text-transform:uppercase;color:var(--bsc-dim);text-decoration:none;
  border:1px solid var(--bsc-soft);padding:3px 8px}
.bsc .bsc-hub-edit a:hover{color:var(--bsc-aqua);border-color:var(--bsc-line)}
.bsc-back{margin:0 0 18px;font-size:14px}
.bsc .bsc-back a{color:var(--bsc-dim);text-decoration:none}
.bsc .bsc-back a:hover{color:var(--bsc-aqua)}
.bsc-section-stub{text-align:center;padding:56px 24px}
.bsc-section-stub .bsc-tile-ico{margin:0 0 14px;display:flex;justify-content:center}
.bsc-section-stub h2{margin-bottom:8px}
/* On a phone a launcher wants to stay a grid — a single column turns eight tiles
   into the long scroll the grid replaced. */
@media (max-width:560px){
  .bsc-hub{grid-template-columns:repeat(2,1fr);gap:12px}
  .bsc-tile{padding:22px 12px 18px;gap:8px}
  .bsc-tile-title{font-size:16px}
  .bsc-tile-desc{font-size:13px}
  .bsc-tile-ico svg{width:38px;height:38px}
  /* a dated badge like "Active to 11 Sep 27" wraps in a 166px tile otherwise */
  .bsc-tile-badge{font-size:9px;padding:3px 7px;letter-spacing:.05em}
}

/* plan */
.bsc-plan-top{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap}
.bsc-plan-state{text-align:right;font-size:14px}
.bsc-badge{display:inline-flex;align-items:center;justify-content:center;
  font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:10.5px;
  letter-spacing:.18em;text-transform:uppercase;padding:4px 10px;border:1px solid var(--bsc-line);
  color:var(--bsc-aqua);margin-bottom:4px}
/* inside a list row, the status badge matches the button beside it exactly */
/* One width for every trailing column so the rows line up. 124px, not 104px: the
   longest label in there is "View & pay", which needs 87px of text plus padding —
   at 104px it spilled straight out of its own border. */
.bsc-list .bsc-badge{margin-bottom:0;height:42px;width:124px;padding:0 14px;
  line-height:1;box-sizing:border-box}
.bsc-badge.ok{color:var(--bsc-ok);border-color:rgba(157,242,155,.45)}
.bsc-badge.warn{color:var(--bsc-warn);border-color:rgba(255,212,121,.45)}
.bsc-badge.bad{color:var(--bsc-bad);border-color:rgba(255,155,155,.45)}
.bsc-includes{list-style:none;margin:16px 0 0;padding:0}
.bsc-includes li{position:relative;padding:9px 0 9px 28px;border-top:1px solid var(--bsc-soft);
  font-size:16px;color:var(--bsc-body)}
.bsc-includes li:first-child{border-top:0}
.bsc-includes li::before{content:"";position:absolute;left:3px;top:16px;width:11px;height:6px;
  border-left:2px solid var(--bsc-blue);border-bottom:2px solid var(--bsc-blue);transform:rotate(-45deg)}
.bsc-plan--expired{border-color:rgba(255,155,155,.4)}
.bsc-plan--expiring{border-color:rgba(255,212,121,.4)}
/* Invoices as a ledger. Ruled rows and right-aligned figures, because money in a
   column is read by comparing it, and a part payment only makes sense next to the
   total it is part of. */
.bsc-sheet-wrap{overflow-x:auto;margin:18px -4px 0;padding:0 4px}
.bsc-sheet{width:100%;border-collapse:collapse;font-size:15px;min-width:660px}
.bsc-sheet th{text-align:left;padding:0 12px 10px 0;font-family:"SF Mono",ui-monospace,Menlo,monospace;
  font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--bsc-dim);font-weight:600;
  border-bottom:1px solid var(--bsc-line);white-space:nowrap}
.bsc-sheet td{padding:13px 12px 13px 0;border-bottom:1px solid var(--bsc-soft);color:var(--bsc-body);
  white-space:nowrap}
.bsc-sheet tr:last-child td{border-bottom:0}
.bsc-sheet .num{text-align:right;font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:14px;
  padding-right:20px}
.bsc-sheet th.num{padding-right:20px}
.bsc-sheet-no{color:var(--bsc-txt);font-weight:700}
.bsc-sheet .is-paid{color:var(--bsc-ok)}
.bsc-sheet .is-owing{color:var(--bsc-warn)}
.bsc-sheet tr.is-void td{opacity:.5}
.bsc-sheet tr.is-paid td{color:var(--bsc-dim)}
/* the queue sheet: a second line under a cell, and the caveat under the table.
   The request title is the one cell allowed to wrap — nowrap on a long episode name
   pushed the delivery date clean off the side of the card. */
.bsc-sheet-what{white-space:normal}
.bsc-sheet-what strong{display:block;max-width:420px}
.bsc-sheet-due{white-space:nowrap}
.bsc-sheet-sub{display:block;margin-top:3px;font-size:12.5px;line-height:1.4}
/* images already sent, shown so they can be taken out */
.bsc-thumbs-kept{margin-bottom:6px}
.bsc-th-kept{position:relative}
.bsc-editing{margin-bottom:18px}
.bsc-kb-intro{margin:0 0 14px;font-size:16.5px;color:var(--bsc-txt)}
.bsc-kb-body{font-size:15.5px;line-height:1.75;color:var(--bsc-body);max-width:62ch}
.bsc-sheet-note{margin:14px 0 0;padding:12px 14px;border-left:3px solid var(--bsc-line);
  background:var(--bsc-soft);font-size:13.5px;line-height:1.6;color:var(--bsc-body)}
.bsc-sheet-act{text-align:right;padding-right:0}
/* Three fixed slots rather than a flow, so View sits in the same place on every row.
   With a flex row, a locked job's explanation is wider than the Edit button it stands
   in for, and View shifted left on that row alone. */
.bsc-rowacts{display:grid;grid-template-columns:minmax(0,1fr) 104px 104px;gap:10px;
  align-items:center;width:100%}
/* grid-row:1 on all three. Naming a column without a row lets auto-placement drop a
   later item onto a second row rather than back-filling column 1 — which is what put
   the lock sentence underneath the View button instead of beside it. */
.bsc-lockword{grid-column:1;grid-row:1;text-align:right;font-size:12.5px;line-height:1.4;white-space:normal}
.bsc-act-view{grid-column:2;grid-row:1}
.bsc-act-edit{grid-column:3;grid-row:1}
.bsc-pill{display:inline-block;padding:3px 10px;border-radius:999px;font-family:"SF Mono",ui-monospace,Menlo,monospace;
  font-size:10px;letter-spacing:.12em;text-transform:uppercase}
.bsc-pill--ok{background:rgba(157,242,155,.12);color:var(--bsc-ok)}
.bsc-pill--warn{background:rgba(255,212,121,.12);color:var(--bsc-warn)}
.bsc-pill--bad{background:rgba(255,155,155,.12);color:var(--bsc-bad)}
.bsc-pill--off{background:var(--bsc-soft);color:var(--bsc-dim)}
.bsc-inv-owed{margin:14px 0 0;color:var(--bsc-warn);font-size:16px}
/* The ledger stops being a table wherever it does not comfortably fit. Eight columns
   need ~741px and the card gives back roughly 80px of page width, so anything under
   about 820px clips — a sideways-scrolling table cuts the button mid-word with
   nothing on screen to say it scrolls, which reads as broken rather than swipeable.
   900px leaves margin rather than sitting on the exact figure. */
@media (max-width:900px){
  .bsc-sheet-wrap{overflow-x:visible;margin:18px 0 0;padding:0}
  .bsc-sheet{min-width:0;display:block}
  .bsc-sheet thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
  .bsc-sheet tbody,.bsc-sheet tr,.bsc-sheet td{display:block;width:auto}
  .bsc-sheet tr{border:1px solid var(--bsc-line);padding:14px 16px;margin:0 0 12px}
  .bsc-sheet tr:last-child{margin-bottom:0}
  .bsc-sheet td{border-bottom:0;padding:5px 0;display:flex;justify-content:space-between;
    align-items:baseline;gap:16px;white-space:normal;text-align:right}
  .bsc-sheet td::before{content:attr(data-l);flex:0 0 auto;text-align:left;
    font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.14em;
    text-transform:uppercase;color:var(--bsc-dim)}
  .bsc-sheet .num{padding-right:0}
  /* the invoice number leads the block, so it gets no label and full weight */
  .bsc-sheet .bsc-sheet-no{display:block;text-align:left;font-size:17px;padding-bottom:10px;
    margin-bottom:6px;border-bottom:1px solid var(--bsc-soft)}
  .bsc-sheet .bsc-sheet-no::before{content:none}
  .bsc-sheet-act{display:block;padding-top:12px}
  .bsc-sheet-act::before{content:none}
  .bsc-sheet-act .bsc-btn-sm{display:block;width:100%;text-align:center}
}

/* plan page */
.bsc-plan-when{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:14px 0 4px}
.bsc-plan-when .bsc-badge{margin-bottom:0}
.bsc-plan-h{margin:26px 0 4px;font-size:15px;letter-spacing:.02em;color:var(--bsc-aqua)}
/* what the plan does NOT cover, marked so it cannot be mistaken for an inclusion */
.bsc-excludes{list-style:none;margin:10px 0 0;padding:0}
.bsc-excludes li{position:relative;padding:9px 0 9px 28px;border-top:1px solid var(--bsc-soft);
  font-size:16px;color:var(--bsc-dim)}
.bsc-excludes li:first-child{border-top:0}
.bsc-excludes li::before{content:"";position:absolute;left:4px;top:19px;width:11px;height:1px;
  background:var(--bsc-dim)}
.bsc-plan-quote{margin:14px 0 0}

/* the ask */
.bsc-ask{margin:40px 0 38px;text-align:center}
.bsc-ask .bsc-btn{margin-bottom:26px}
.bsc-rule{font-size:15px;color:var(--bsc-dim);margin:0;line-height:1.75;max-width:560px;
  margin-left:auto;margin-right:auto}
.bsc-rule a{display:inline-block;margin-top:10px}
.bsc-rule-big{font-size:19px;font-weight:700;color:var(--bsc-aqua);margin-bottom:20px;line-height:1.5}
.bsc-how p{margin-bottom:16px}

/* Admin-only inline edit links — visible to Chris, never to the client.
   Absolutely positioned, NOT floated: a float shrinks any sibling that establishes
   its own formatting context, which silently squeezed the first row of every list
   and threw the columns out of line. */
.bsc-edit{position:absolute;top:16px;right:16px;z-index:2;
  font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:10px;
  letter-spacing:.16em;text-transform:uppercase;color:var(--bsc-dim);text-decoration:none;
  border:1px solid var(--bsc-soft);padding:3px 8px}
.bsc-edit:hover{color:var(--bsc-aqua);border-color:var(--bsc-line)}

/* buttons */
/* inline-flex with no vertical padding: the label is centred by the box rather than by
   padding maths, so the same button is the same height wherever it appears — the plan
   page's Renew came out a pixel taller than the dialog's View invoice on the old rule */
.bsc-btn{display:inline-flex;align-items:center;justify-content:center;
  background:var(--bsc-blue);color:var(--bsc-dark);border:none;
  font:inherit;font-weight:800;font-size:14px;letter-spacing:.12em;text-transform:uppercase;
  padding:0 28px;min-height:52px;line-height:1;cursor:pointer;text-decoration:none;border-radius:2px;
  box-shadow:0 0 22px rgba(25,200,224,.28);transition:.15s}
.bsc-btn:hover{background:var(--bsc-aqua);color:var(--bsc-dark)}
/* ".bsc a" sets the link colour and outranks ".bsc-btn", so an anchor styled as a
   primary button came out aqua on aqua — the label all but vanished. Anchors and
   buttons are the same control and must read the same. */
.bsc a.bsc-btn,
.bsc a.bsc-btn:hover,
.bsc a.bsc-btn:visited{color:var(--bsc-dark);text-decoration:none}
.bsc-btn-lg{font-size:15px;padding:0 34px;min-height:58px}
.bsc-back{display:inline-block;font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:11px;
  letter-spacing:.2em;text-transform:uppercase;color:var(--bsc-dim);margin-bottom:26px;text-decoration:none}

/* states */
.bsc-active{border-color:rgba(25,200,224,.55);box-shadow:0 0 30px rgba(25,200,224,.12)}
.bsc-needs{border-color:rgba(255,212,121,.5);background:rgba(255,212,121,.05)}
.bsc-needs::before{background:var(--bsc-warn);box-shadow:0 0 10px var(--bsc-warn)}
.bsc-ready{border-color:rgba(157,242,155,.5);background:rgba(157,242,155,.05)}
.bsc-ready::before{background:var(--bsc-ok);box-shadow:0 0 10px var(--bsc-ok)}
.bsc-q{background:rgba(255,212,121,.09);border-left:3px solid var(--bsc-warn);padding:12px 16px}
.bsc-due{font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:13px;color:var(--bsc-aqua)}

/* List rows share one column rhythm across every card, so statuses, dates and
   actions line up vertically whichever card you are looking at.
   `.bsc` beats the theme's `.prose ul/li` rules on specificity. */
.bsc .bsc-list{list-style:none;margin:14px 0 0;padding:0}
.bsc .bsc-list li{display:flex;align-items:center;gap:12px;padding:14px 0;
  border-top:1px solid var(--bsc-soft);flex-wrap:nowrap;width:100%}
.bsc .bsc-list li:first-child{border-top:0}
.bsc-li-main{flex:1 1 0;min-width:0;display:flex;flex-direction:column}
.bsc-li-main strong{overflow:hidden;text-overflow:ellipsis}
.bsc-li-main .bsc-dim{font-size:14px}
/* the three trailing columns — fixed so they cannot drift row to row */
.bsc-list li > .bsc-badge{flex:0 0 124px}
.bsc-list li > .bsc-btn-sm,
.bsc-list li > .bsc-btn-ghost{flex:0 0 124px}
.bsc-list li > .bsc-dim.bsc-small{flex:0 0 124px;text-align:right}
.bsc-list li > .bsc-pos{flex:0 0 124px;text-align:center}
/* a row with no action still reserves that column, so the status chip stays in
   the status column instead of sliding to the far right */
.bsc-list li > .bsc-badge:last-child,
.bsc-list li > .bsc-pos:last-child{margin-right:136px}
.bsc-pos{font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:11px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--bsc-blue);border:1px solid var(--bsc-line);padding:4px 10px;
  height:42px;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box}
@media (max-width:560px){
  .bsc .bsc-list li{flex-wrap:wrap}
  .bsc-list li > .bsc-dim.bsc-small{text-align:left}
}
.bsc-moves{display:flex;gap:6px}
.bsc-moves form{margin:0}
.bsc-moves button{width:44px;height:44px;background:var(--bsc-panel2);border:1px solid var(--bsc-line);
  color:var(--bsc-aqua);font-size:14px;cursor:pointer}
.bsc-moves button:disabled{opacity:.25;cursor:not-allowed}
.bsc-inline{margin:12px 0 0}

/* notices */
.bsc-note{padding:18px 22px;margin:0 0 20px;font-size:16px;border:1px solid var(--bsc-line)}
.bsc-note.ok{border-color:rgba(157,242,155,.5);background:rgba(157,242,155,.08);color:#ccf3cb}
.bsc-note.warn{border-color:rgba(255,212,121,.5);background:rgba(255,212,121,.08);color:#ffe1a1}

/* how it works */
.bsc-how p{font-size:16px;color:var(--bsc-body)}
.bsc-emergency{margin-top:18px;padding-top:16px;border-top:1px solid var(--bsc-soft);color:var(--bsc-warn)}

/* ---------------- form ---------------- */
.bsc-scope{border:1px solid var(--bsc-line);border-left:3px solid var(--bsc-blue);
  background:rgba(25,200,224,.06);padding:16px 20px;margin:0 0 26px;font-size:16px;color:var(--bsc-body)}
.bsc-step{margin:26px 0 0}
.bsc-step-h{font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:11px;letter-spacing:.22em;
  text-transform:uppercase;color:var(--bsc-blue);margin-bottom:12px}
.bsc-step-h span{color:var(--bsc-dim)}
/* Side by side, sized so the words stay on one line. Three across a 684px column give
   boxes of 222px; at 12px padding, an 18px radio and a 9px gap that leaves 172px for
   the text, and the longest label — "Amend existing products" — measures 164px at
   13.5px. It wrapped at 15px, which is what made the row look ragged. */
.bsc-modes{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:8px}
/* .bsc-modes .bsc-mode, not .bsc-mode: these are <label>s, and ".bsc label" further
   down sets display:block with its own margins. It outranked the flex rule, so the
   radio and the words sat at the top of the box with dead space beneath them. */
.bsc-modes .bsc-mode{border:1px solid var(--bsc-line);background:var(--bsc-panel);
  padding:0 12px;min-height:56px;margin:0;
  display:flex;align-items:center;justify-content:center;text-align:center;
  gap:9px;cursor:pointer;font-weight:600;font-size:13.5px}
.bsc-modes .bsc-mode input{accent-color:var(--bsc-blue);width:18px;height:18px;flex:none;margin:0}
.bsc-modes .bsc-mode.on{border-color:var(--bsc-aqua);background:rgba(25,200,224,.1)}

@media (max-width:700px){ .bsc-modes{grid-template-columns:1fr} .bsc-modes .bsc-mode{justify-content:flex-start} }

.bsc-prod{position:relative;border:1px solid var(--bsc-line);background:var(--bsc-panel);
  padding:18px;margin-bottom:14px;scroll-margin-top:90px}
.bsc-prod::before{content:"";position:absolute;top:0;left:0;width:34px;height:1px;
  background:var(--bsc-aqua);box-shadow:0 0 10px var(--bsc-aqua)}
.bsc-prod.is-missing{border-color:var(--bsc-warn)}
/* the row changes shape with the mode: adding asks for an SKU, amending asks which
   product on the site is being changed, deleting asks only that */
.bsc-prod .bsc-url-row{display:none}
.bsc-prod.is-amend .bsc-url-row,
.bsc-prod.is-delete .bsc-url-row{display:block}
.bsc-prod.is-amend .bsc-add-only{display:none}
.bsc-help{margin:-4px 0 14px;font-size:13.5px;line-height:1.5;color:var(--bsc-dim)}

/* deleting: everything except the header, the address and the confirmation goes away —
   leaving a price box on screen would imply the answer still mattered */
.bsc-prod.is-delete > *{display:none}
.bsc-prod.is-delete > .bsc-prod-h,
.bsc-prod.is-delete > .bsc-prod-miss,
.bsc-prod.is-delete > .bsc-url-row,
/* :not([hidden]) because this selector outranks the browser's own [hidden] rule, and
   without it the confirmation card shows before an address has been pasted */
.bsc-prod.is-delete > .bsc-confirm:not([hidden]){display:block}
.bsc-prod.is-delete{border-color:rgba(255,155,155,.45)}

.bsc-mode-del{--bsc-blue:#ff9b9b}
.bsc-modes .bsc-mode-del.on{border-color:var(--bsc-bad);background:rgba(255,155,155,.08)}
.bsc-del-scope{margin:14px 0 0;padding:12px 14px;border-left:3px solid var(--bsc-warn);
  background:rgba(255,212,121,.07);font-size:14px;line-height:1.6;color:var(--bsc-body)}
.bsc-btn-danger{background:var(--bsc-bad);color:#2b0b0b}
.bsc-btn-danger:hover{background:#ffb6b6}

/* the confirmation card: what the address actually points at */
.bsc-confirm{margin:2px 0 16px;border:1px solid var(--bsc-line);border-radius:3px;
  background:var(--bsc-panel2);overflow:hidden}
.bsc-confirm.is-found{border-color:rgba(157,242,155,.45)}
.bsc-confirm.is-failed{border-color:rgba(255,212,121,.5)}
.bsc-confirm.is-missing{border-color:var(--bsc-bad);box-shadow:0 0 0 2px rgba(255,155,155,.18)}
.bsc-confirm-body{padding:14px 16px}
.bsc-confirm-head{font-size:11px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--bsc-dim);margin-bottom:10px}
.bsc-confirm-row{display:flex;gap:14px;align-items:flex-start}
.bsc-confirm-img{flex:0 0 64px;width:64px;height:64px;border-radius:3px;
  background:#0b0f14 center/cover no-repeat;border:1px solid var(--bsc-line)}
.bsc-confirm-txt{display:flex;flex-direction:column;gap:3px;min-width:0}
.bsc-confirm-txt strong{font-size:15px;color:var(--bsc-txt)}
.bsc-confirm-price{font-size:13px;color:var(--bsc-aqua)}
.bsc-confirm-txt a{font-size:12.5px;color:var(--bsc-dim);word-break:break-all}
.bsc-confirm-wait{margin:0;color:var(--bsc-dim);font-size:14px}
.bsc-confirm-warn{margin:0;color:var(--bsc-warn);font-size:14px;line-height:1.6}
.bsc-confirm-tick{display:flex;gap:10px;align-items:center;margin:0;padding:12px 16px;
  border-top:1px solid var(--bsc-line);background:rgba(255,155,155,.06);
  font-size:14.5px;color:var(--bsc-txt);cursor:pointer}
.bsc-confirm-tick input{width:18px;height:18px;accent-color:#ff9b9b;flex:0 0 auto}

/* the general form only shows its card once deleting is chosen */
#bsc-gen-confirm .bsc-confirm{margin-top:10px}
/* deleting a page asks for the address and nothing else */
.bsc-change-only[hidden]{display:none}
.bsc-prod-miss{display:none;margin:0 0 12px;color:var(--bsc-warn);font-size:14px}
.bsc-prod.is-missing .bsc-prod-miss{display:block}
.bsc-prod-h{display:flex;align-items:center;gap:12px;margin-bottom:10px;cursor:pointer;
  font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:11px;letter-spacing:.16em;
  text-transform:uppercase;color:var(--bsc-dim)}
.bsc-prod-n{flex:0 0 auto;font-weight:700;color:var(--bsc-aqua)}
.bsc-prod-sum{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-family:inherit;font-size:14px;letter-spacing:0;text-transform:none;font-weight:600;
  color:var(--bsc-txt)}
.bsc-prod-act{flex:0 0 auto;display:flex;align-items:center;gap:8px}
/* reads as a control, not a caption: the folded bars stay editable right up to
   sending, and nothing about a flat word says "you can still open this" */
.bsc-prod-edit{display:none;font-size:11px;letter-spacing:.12em;color:var(--bsc-dark);
  background:var(--bsc-blue);font-weight:700;padding:7px 12px;border-radius:2px}
.bsc-prod.is-folded:hover .bsc-prod-edit{background:var(--bsc-aqua)}

/* A finished product folds to its bar, so the open one is the only box on screen and
   the list above it reads as a list. The neon edge is the same language as the
   "add another" button, which is where the eye has just been. */
.bsc-prod.is-folded{padding:0;border-color:var(--bsc-blue);background:rgba(25,200,224,.07);
  box-shadow:0 0 0 1px rgba(25,200,224,.25),0 0 14px rgba(25,200,224,.13)}
/* two class names, so this outranks the delete-mode rules above that re-show the
   address row — a folded row shows its bar and nothing else, in every mode */
.bsc-prod.is-folded > *,
.bsc-prod.is-folded.is-delete > *{display:none}
/* The delete card's own rule carries :not([hidden]) and so outranked the fold, leaving
   a collapsed row with its whole "this is the page you are deleting" card hanging
   under the bar. One more class than that rule, and after it. */
.bsc-prod.is-folded.is-delete > .bsc-confirm:not([hidden]){display:none}
.bsc-prod.is-folded > .bsc-prod-h,
.bsc-prod.is-folded.is-delete > .bsc-prod-h{display:flex;margin:0;padding:16px 16px 16px 18px}
.bsc-prod.is-folded .bsc-prod-edit{display:inline}
.bsc-prod.is-folded::before{display:none}
.bsc-prod.is-folded:hover{background:rgba(25,200,224,.12)}
/* filled in and ready goes green at the tip; still missing something stays amber */
.bsc-prod.is-folded .bsc-prod-n::after{content:" ●";color:var(--bsc-warn)}
.bsc-prod.is-folded.is-ready .bsc-prod-n::after{color:var(--bsc-ok)}
.bsc-prod.is-folded.is-missing{border-color:var(--bsc-warn);
  box-shadow:0 0 0 1px rgba(255,212,121,.3)}

/* the open one is the only thing with a lit edge, so it reads as the live box —
   except where the mode or a missing field has already claimed the border colour */
.bsc-prod:not(.is-folded):not(.is-delete):not(.is-missing){border-color:var(--bsc-aqua)}
.bsc-rm{background:none;border:1px solid var(--bsc-line);color:var(--bsc-dim);
  min-width:38px;min-height:38px;font-size:16px;cursor:pointer}
.bsc label{display:block;font-weight:700;font-size:14px;margin:14px 0 6px}
.bsc .bsc-opt{font-weight:400;color:var(--bsc-dim);font-size:13px}
.bsc input[type=text],.bsc input[type=email],.bsc input[type=tel],.bsc input[type=url],
.bsc input[type=number],.bsc input[type=date],.bsc textarea,.bsc select{
  width:100%;font:inherit;font-size:17px;padding:14px;min-height:52px;background:var(--bsc-panel2);
  border:1px solid var(--bsc-line);color:var(--bsc-txt);border-radius:2px;
  -webkit-appearance:none;appearance:none;color-scheme:dark}
/* the native date picker renders light unless told otherwise */
.bsc input[type=date]::-webkit-calendar-picker-indicator{filter:invert(1);opacity:.65;cursor:pointer}
.bsc input[type=date]::-webkit-datetime-edit{color:var(--bsc-txt)}
.bsc textarea{min-height:96px;resize:vertical}
.bsc input:focus,.bsc textarea:focus,.bsc select:focus{outline:none;border-color:var(--bsc-aqua);
  box-shadow:0 0 16px rgba(25,200,224,.22)}
.bsc-price{position:relative}
.bsc-price span{position:absolute;left:14px;top:50%;transform:translateY(-50%);color:var(--bsc-aqua);font-weight:700}
.bsc-price input{padding-left:32px}

.bsc-chips{display:flex;flex-wrap:wrap;gap:8px}
.bsc-chip{min-height:44px;min-width:52px;padding:0 14px;display:inline-flex;align-items:center;
  justify-content:center;border:1px solid var(--bsc-line);background:var(--bsc-panel2);
  color:var(--bsc-dim);font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:13px;
  font-weight:700;cursor:pointer;user-select:none}
.bsc-chip.on{background:var(--bsc-blue);border-color:var(--bsc-blue);color:var(--bsc-dark);
  box-shadow:0 0 14px rgba(25,200,224,.3)}

.bsc-drop{border:1px dashed var(--bsc-line);background:var(--bsc-panel2);padding:20px;
  text-align:center;cursor:pointer;color:var(--bsc-aqua);font-weight:600}
.bsc-drop small{display:block;color:var(--bsc-dim);font-weight:400;font-size:13px;margin-top:4px}
.bsc-thumbs{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}
.bsc-th{position:relative;width:74px;height:74px;border:1px solid var(--bsc-line);
  background:#000 center/cover no-repeat}
.bsc-th .bsc-main{position:absolute;left:0;right:0;bottom:0;background:var(--bsc-blue);
  color:var(--bsc-dark);font-size:9px;font-weight:800;text-align:center;letter-spacing:.1em}
.bsc-x{position:absolute;top:2px;right:2px;width:24px;height:24px;border-radius:50%;border:none;
  background:rgba(0,0,0,.78);color:#fff;font-size:13px;cursor:pointer;line-height:1}
.bsc-shrink{font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:11px;color:var(--bsc-dim);margin-top:8px}

.bsc details{margin-top:14px;border-top:1px solid var(--bsc-soft);padding-top:10px}
.bsc summary{cursor:pointer;font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:12px;
  letter-spacing:.16em;text-transform:uppercase;color:var(--bsc-blue);min-height:44px;display:flex;align-items:center}
.bsc summary::-webkit-details-marker{display:none}
.bsc summary::before{content:"+ ";font-weight:700}
.bsc details[open] summary::before{content:"\2212 "}

/* Adding the next product is the action that keeps five products in one request
   instead of five emails, so it is given room and made unmistakable: a solid neon
   edge with a single bright dot tracing it, like a laser running the perimeter. */
.bsc-addrow{position:relative;width:100%;min-height:76px;margin:30px 0 10px;
  background:rgba(25,200,224,.07);border:2px solid var(--bsc-blue);border-radius:3px;
  box-shadow:0 0 18px rgba(25,200,224,.22),inset 0 0 22px rgba(25,200,224,.07);
  color:var(--bsc-aqua);font:inherit;font-weight:800;font-size:16px;letter-spacing:.04em;
  cursor:pointer;transition:background .18s ease,color .18s ease,box-shadow .18s ease}
.bsc-addrow:hover{background:rgba(25,200,224,.14);color:var(--bsc-txt);
  box-shadow:0 0 26px rgba(25,200,224,.38),inset 0 0 22px rgba(25,200,224,.1)}
/* white core, blue halo — the dot itself is the light source */
.bsc-addrow::after{content:"";position:absolute;top:0;left:0;width:9px;height:9px;
  border-radius:50%;background:#fff;transform:translate(-50%,-50%);pointer-events:none;
  box-shadow:0 0 6px 2px var(--bsc-aqua),0 0 18px 6px rgba(25,200,224,.75);
  animation:bsc-dot 4.3s linear infinite}
/*
 * Time is split by edge length rather than evenly, or the dot crawls the long edges
 * and flicks round the short ones. Roughly 45/5/45/5 for a box this shape.
 */
@keyframes bsc-dot{
  0%   { top:0;    left:0    }
  45%  { top:0;    left:100% }
  50%  { top:100%; left:100% }
  95%  { top:100%; left:0    }
  100% { top:0;    left:0    }
}
.bsc-addrow:disabled{opacity:.3;cursor:not-allowed;box-shadow:none}
.bsc-addrow:disabled::after{display:none}
/* a travelling light is decoration; anyone who has asked for less motion gets none */
@media (prefers-reduced-motion:reduce){ .bsc-addrow::after{display:none} }
.bsc-cap{font-size:13.5px;color:var(--bsc-dim);text-align:center}

.bsc-sendbar{position:sticky;bottom:0;background:rgba(5,7,10,.96);border-top:1px solid var(--bsc-line);
  padding:14px 0;margin-top:26px;display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.bsc-count{flex:1;font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:13px;color:var(--bsc-dim);min-width:180px}
.bsc-count strong{color:var(--bsc-aqua)}

.bsc-login{max-width:460px;margin:40px auto}

/* preview mode — Chris looking at a client's view, everything inert */
.bsc-previewbar{position:sticky;top:0;z-index:60;display:flex;align-items:center;gap:16px;
  flex-wrap:wrap;justify-content:space-between;background:#f2b34b;color:#241a05;
  padding:11px 20px;font-size:14px;font-weight:700;margin-bottom:24px}
.bsc-previewbar a{color:#241a05;text-decoration:underline;font-weight:800}
/*
 * Only things that actually COMMIT something are inert in preview: submit buttons
 * (including <button> with no type, which defaults to submit) and action links.
 * Pure interface controls — the calendar, the drag grip, the edit links — stay live,
 * otherwise preview stops being a faithful view of what the client gets.
 */
.bsc-preview .bsc-btn,
.bsc-preview .bsc-btn-ghost,
.bsc-preview .bsc-ask a,
.bsc-preview form button[type="submit"],
.bsc-preview form button:not([type]){pointer-events:none;opacity:.55}

.bsc-preview .bsc-edit{pointer-events:auto;opacity:1}
/* Navigation is not an action. A link styled as a button — Renew now, View invoice —
   only moves between screens, and blocking it means the client's journey cannot be
   walked in preview, which is the one thing preview is for. Buttons that submit or
   change something stay inert above. */
.bsc-preview a.bsc-btn,
.bsc-preview a.bsc-btn-ghost{pointer-events:auto;opacity:1}

/* invoices */
/* Status badge and action button in a list row are deliberately identical boxes —
   but that 104px belongs to the list row, not to every small button. As a fixed
   width it silently cropped any longer label: "View & pay" needs ~120px and spilled
   straight out of its own border. min-width keeps the rows uniform where that
   matters and lets the button grow to its text everywhere else. */
/* an author display rule beats the browser's own [hidden] whatever its specificity,
   so every button that gets hidden from script has to say so itself */
.bsc-btn[hidden],.bsc-btn-sm[hidden],.bsc-btn-ghost[hidden]{display:none}
.bsc-btn-sm{display:inline-flex;align-items:center;justify-content:center;
  padding:0 16px;height:42px;min-height:42px;min-width:104px;font-size:12px;
  box-shadow:none;line-height:1;box-sizing:border-box;white-space:nowrap}
.bsc-svc-list li{gap:10px}
.bsc-btn-ghost{display:inline-block;background:none;border:1px solid var(--bsc-line);color:var(--bsc-aqua);
  font:inherit;font-weight:700;font-size:13px;letter-spacing:.12em;text-transform:uppercase;
  padding:13px 22px;cursor:pointer;text-decoration:none}
.bsc-btn-ghost:hover{border-color:var(--bsc-aqua)}
.bsc-invoice{max-width:680px;margin:0 auto}
/* masthead — the same sail mark as the site header, so a printed invoice is
   recognisably ours rather than an anonymous table of numbers */
.bsc-inv-brand{display:flex;align-items:center;gap:10px;padding-bottom:18px;margin-bottom:22px;
  border-bottom:1px solid var(--bsc-line)}
.bsc-inv-mark{width:26px;height:26px;flex:none}
.bsc-inv-brandname{font-size:15px;font-weight:600;letter-spacing:.12em;color:var(--bsc-txt)}
.bsc-inv-brandname b{color:var(--bsc-blue);font-weight:800}
/* payments deducted beneath the total, so the balance is shown being arrived at */
.bsc-inv-table .paid-line td{color:var(--bsc-dim);font-size:15px}
/* a negative line is a credit, so it reads like one rather than another charge */
.bsc-inv-table .is-credit .amt{color:var(--bsc-ok)}
/* every way to pay gets equal weight; they wrap rather than squeeze on a phone */
.bsc-pay-links{display:flex;flex-wrap:wrap;gap:10px;margin:0 0 18px}
.bsc-inv-table .paid-line .amt{color:var(--bsc-ok)}
.bsc-inv-table .balance td{border-top:2px solid var(--bsc-line);font-weight:800;color:var(--bsc-txt);font-size:18px}
/* margin-left:auto rather than space-between: the badge then sits hard right no
   matter what else ends up in this row, instead of being spaced against it. */
.bsc-inv-top{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}
.bsc-inv-state{margin-left:auto;text-align:right}
.bsc .bsc-inv-top > p:empty{display:none}
.bsc-inv-parties{display:grid;grid-template-columns:1fr 1fr;gap:22px;margin:26px 0;
  padding:20px 0;border-top:1px solid var(--bsc-soft);border-bottom:1px solid var(--bsc-soft)}
.bsc-inv-table{width:100%;border-collapse:collapse;margin:8px 0 20px}
.bsc-inv-table td{padding:12px 0;border-top:1px solid var(--bsc-soft);color:var(--bsc-body);font-size:16px}
.bsc-inv-table .amt{text-align:right;white-space:nowrap;font-family:"SF Mono",ui-monospace,Menlo,monospace}
.bsc-inv-table .total td{border-top:2px solid var(--bsc-line);font-weight:800;color:var(--bsc-txt);font-size:18px}
.bsc-pay{margin-top:26px;padding-top:22px;border-top:1px solid var(--bsc-soft)}
.bsc-pay .bsc-btn{margin:10px 0 18px}
.bsc-bank{border:1px solid var(--bsc-line);border-left:3px solid var(--bsc-blue);
  background:rgba(25,200,224,.05);padding:16px 20px;margin:0 0 14px}
.bsc-bank-h{font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:10.5px;letter-spacing:.18em;
  text-transform:uppercase;color:var(--bsc-blue);margin-bottom:10px}
.bsc-bank div{display:flex;justify-content:space-between;gap:16px;padding:5px 0;font-size:15px}
.bsc-bank div span{color:var(--bsc-dim)}
.bsc-bank div strong{font-family:"SF Mono",ui-monospace,Menlo,monospace;color:var(--bsc-txt)}
.bsc-inv-print{margin:24px 0 0;text-align:right}
@media print{
  .site-nav,.site-footer,.bsc-back,.bsc-inv-print,.bsc-previewbar,.bsc-edit{display:none!important}
  body{background:#fff!important;color:#111!important}
  .bsc,.bsc-card,.bsc-invoice{background:#fff!important;color:#111!important;border-color:#ccc!important;
    box-shadow:none!important}
  .bsc-card::before{display:none!important}
  .bsc-inv-table td,.bsc-bank div strong,.bsc-inv-brandname,.bsc-inv-table .balance td{color:#111!important}
  .bsc-inv-brandname b{color:#0a7f92!important}
  .bsc-inv-table .paid-line td{color:#555!important}
  .bsc-inv-table .paid-line .amt{color:#0a6b2e!important}
  .bsc-kicker{color:#555!important}
  .bsc-bank{border-color:#bbb!important;border-left-color:#0a7f92!important;background:#fafafa!important}
  .bsc-badge{color:#111!important;border-color:#999!important}
}

/* minutes */
.bsc-min-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:12px;margin:16px 0 6px}
.bsc-min-stat{border:1px solid var(--bsc-line);background:var(--bsc-panel2);padding:16px 18px}
.bsc-min-stat b{display:block;font-size:28px;font-weight:800;color:var(--bsc-aqua);line-height:1.1}
.bsc-min-stat span{font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.16em;
  text-transform:uppercase;color:var(--bsc-dim)}
.bsc-min-stat.is-low{border-color:rgba(255,212,121,.5);background:rgba(255,212,121,.07)}
.bsc-min-stat.is-low b{color:var(--bsc-warn)}
.bsc-min-low{color:var(--bsc-warn);font-size:15px;margin:10px 0 0}
.bsc-min-table{width:100%;border-collapse:collapse;margin:16px 0 0;font-size:15px}
.bsc-min-table td{padding:9px 0;border-top:1px solid var(--bsc-soft);color:var(--bsc-body)}
.bsc-min-date{color:var(--bsc-dim);white-space:nowrap;width:110px;
  font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:12.5px}
.bsc-min-num{text-align:right;white-space:nowrap;font-family:"SF Mono",ui-monospace,Menlo,monospace}
.bsc-min-num .up{color:var(--bsc-ok)}
.bsc-min-num .dn{color:var(--bsc-dim);margin-left:8px}
.bsc-min-link{margin:16px 0 0;font-size:15px}
/* request type picker */
.bsc-types{display:flex;flex-direction:column;gap:12px}
.bsc-type{display:flex;align-items:center;gap:18px;padding:20px 22px;text-decoration:none;
  background:var(--bsc-panel);border:1px solid var(--bsc-line);color:var(--bsc-txt);
  position:relative;transition:.18s}
.bsc-type::before{content:"";position:absolute;top:0;left:0;width:0;height:1px;
  background:var(--bsc-aqua);box-shadow:0 0 10px var(--bsc-aqua);transition:.3s}
.bsc-type:hover{border-color:rgba(127,233,245,.6);background:var(--bsc-panel2)}
.bsc-type:hover::before{width:100%}
.bsc-type-ico{flex:none;width:48px;height:48px;border:1px solid var(--bsc-line);
  display:flex;align-items:center;justify-content:center;color:var(--bsc-blue);font-size:19px;
  background:rgba(25,200,224,.07)}
.bsc-type-body{flex:1;display:flex;flex-direction:column;gap:3px}
.bsc-type-body strong{font-size:18px;font-weight:700}
.bsc-type-body .bsc-dim{font-size:14.5px;line-height:1.45}
.bsc-type-tag{align-self:flex-start;margin-top:5px;font-family:"SF Mono",ui-monospace,Menlo,monospace;
  font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--bsc-aqua);
  border:1px solid var(--bsc-line);padding:3px 8px}
.bsc-type-go{flex:none;color:var(--bsc-blue);font-size:18px}
.bsc-emergency-note{margin-top:26px;padding-top:18px;border-top:1px solid var(--bsc-soft);
  color:var(--bsc-dim);font-size:14.5px}

@media (max-width:600px){
  .bsc{font-size:16px}
  .bsc-card{padding:18px}
  .bsc-sendbar .bsc-btn{width:100%}
}

/* One job at a time — the dialog on the request tile */
/* quiet, but always there — a shared machine needs a way out of the session */
.bsc-signout{margin:38px 0 4px;text-align:center}
.bsc-signout a{color:var(--bsc-dim);font-size:12.5px;letter-spacing:.14em;text-transform:uppercase;
  text-decoration:none;border-bottom:1px solid var(--bsc-soft);padding-bottom:2px}
.bsc-signout a:hover{color:var(--bsc-aqua);border-bottom-color:var(--bsc-line)}
.bsc-modal{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;
  padding:20px;background:rgba(3,10,14,.88);color:var(--bsc-txt);font-size:17px;line-height:1.6}
.bsc-modal *{box-sizing:border-box}
.bsc-modal[hidden]{display:none}
body.bsc-modal-open{overflow:hidden}
.bsc-modal-box{width:min(560px,100%);max-height:88vh;overflow:auto;background:var(--bsc-panel);
  border:1px solid var(--bsc-blue);border-radius:3px;padding:26px 26px 22px;
  box-shadow:0 0 0 1px rgba(25,200,224,.2),0 18px 60px rgba(0,0,0,.6)}
.bsc-modal-box{position:relative}
.bsc-modal-x{position:absolute;top:10px;right:10px;width:40px;height:40px;line-height:1;
  display:flex;align-items:center;justify-content:center;
  background:none;border:1px solid transparent;border-radius:3px;
  color:var(--bsc-dim);font-size:26px;cursor:pointer}
.bsc-modal-x:hover{color:var(--bsc-txt);border-color:var(--bsc-line);background:var(--bsc-panel2)}
.bsc-modal-x:focus-visible{outline:2px solid var(--bsc-aqua);outline-offset:2px}
/* room for the cross, so a long heading never runs under it */
.bsc-modal-box h2{margin:0 48px 12px 0;font-size:22px;line-height:1.25;color:var(--bsc-txt)}
.bsc-modal-body{font-size:15.5px;line-height:1.7;color:var(--bsc-body)}
.bsc-modal-acts{display:flex;flex-wrap:wrap;gap:12px;align-items:stretch;margin-top:22px}
/* the outline button carries the small-button class elsewhere; in here it matches the
   primary one, which is what stopped the row looking ragged */
.bsc-modal-acts .bsc-btn-ghost{display:inline-flex;align-items:center;justify-content:center;
  min-height:52px;padding:0 26px;font-size:14px;letter-spacing:.12em;line-height:1}
.bsc-modal-anyway{margin-left:auto;font-size:13px;color:var(--bsc-dim);text-decoration:underline}
.bsc-modal-anyway:hover{color:var(--bsc-aqua)}
.bsc-tile.is-guarded{border-color:var(--bsc-warn)}
@media (max-width:560px){
  .bsc-modal-acts{flex-direction:column;align-items:stretch}
  .bsc-modal-anyway{margin:4px 0 0;text-align:center}
}

/* Dragging the queue into a different order */
.bsc-grip-col{width:52px}
.bsc-grip{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;
  border:1px solid var(--bsc-line);border-radius:3px;background:var(--bsc-panel2);
  color:var(--bsc-blue);font-size:15px;cursor:grab;touch-action:none;user-select:none}
.bsc-grip:hover{border-color:var(--bsc-aqua);color:var(--bsc-aqua)}
.bsc-grip:focus-visible{outline:2px solid var(--bsc-aqua);outline-offset:2px}
.bsc-grip.is-off{cursor:default;color:var(--bsc-dim);border-style:dashed;opacity:.55}
.bsc-sheet tr.is-dragging{background:rgba(25,200,224,.10)}
.bsc-sheet tr.is-dragging .bsc-grip{cursor:grabbing;border-color:var(--bsc-aqua)}
.bsc-sheet tr.is-pinned .bsc-sheet-no{opacity:.75}
.bsc-queue-bar{display:flex;gap:10px;align-items:center;margin-top:16px;padding:12px 14px;
  border:1px solid var(--bsc-blue);border-radius:3px;background:rgba(25,200,224,.08)}
.bsc-queue-bar[hidden]{display:none}
.bsc-reorder-hint{border-left-color:var(--bsc-line)}
.bsc-queue-note{font-size:13px;color:var(--bsc-dim)}
.bsc-queue-status{font-size:14px;font-weight:600;color:var(--bsc-dim)}
.bsc-queue-status.is-ok{color:var(--bsc-ok)}
.bsc-queue-status.is-bad{color:var(--bsc-bad)}
.bsc-sheet.is-reordering .bsc-sheet-due{opacity:.38}
@media (max-width:900px){
  /* stacked rows: the handle sits at the top of the block rather than in a column */
  .bsc-sheet .bsc-grip-col{display:flex;justify-content:flex-end;padding:0 0 8px}
  .bsc-sheet .bsc-grip-col::before{content:none}
}

/* One job, read only */
.bsc-job-head{display:flex;align-items:flex-start;gap:16px;margin-bottom:18px}
.bsc-job-title{margin:2px 0 0;font-size:24px;line-height:1.25;color:var(--bsc-txt)}
.bsc-job-head .bsc-pill{margin-left:auto;flex:0 0 auto}
.bsc-job-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px 22px;margin:0 0 6px}
.bsc-job-facts div{min-width:0}
.bsc-job-facts dt{font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.16em;
  text-transform:uppercase;color:var(--bsc-dim);margin-bottom:4px}
.bsc-job-facts dd{margin:0;font-size:15.5px;color:var(--bsc-txt);word-break:break-word}
.bsc-job-item{border-top:1px solid var(--bsc-soft);margin-top:20px;padding-top:18px}
.bsc-job-item-h{font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.16em;
  text-transform:uppercase;color:var(--bsc-blue);margin-bottom:8px}
.bsc-job-item h3{margin:0 0 12px;font-size:18px;color:var(--bsc-txt)}
.bsc-job-url{margin:10px 0 0;font-size:13.5px;word-break:break-all}
.bsc-job-url a{color:var(--bsc-blue)}
.bsc-job-desc{margin:12px 0 0;font-size:15px;line-height:1.7;color:var(--bsc-body);max-width:64ch}
.bsc-job-item .bsc-thumbs{margin-top:14px}
.bsc-job-acts{display:flex;align-items:center;gap:12px;margin-top:24px;padding-top:18px;
  border-top:1px solid var(--bsc-soft)}

/* ============================================================= My offers
   The card is the title and a prompt. Everything that sells the thing waits behind
   the reveal, so the list reads as a list and opening one feels like an event. */
.bsc-kicker-ok{color:var(--bsc-ok)}
.bsc-offers .bsc-kicker{margin-bottom:16px}
.bsc-offer-card{display:flex;align-items:center;gap:18px;width:100%;text-align:left;
  border:1px solid var(--bsc-line);border-radius:3px;background:var(--bsc-panel2);
  padding:22px 24px;margin-bottom:12px;cursor:pointer;font:inherit;color:inherit;
  transition:border-color .18s, background .18s, transform .18s}
.bsc-offer-card:last-child{margin-bottom:0}
.bsc-offer-card:hover{border-color:var(--bsc-aqua);background:rgba(25,200,224,.07);transform:translateY(-1px)}
.bsc-offer-card:focus-visible{outline:2px solid var(--bsc-aqua);outline-offset:3px}
.bsc-offer-title{flex:1 1 auto;font-size:19px;font-weight:700;color:var(--bsc-txt)}
.bsc-offer-open{flex:0 0 auto;font-family:"SF Mono",ui-monospace,Menlo,monospace;
  font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--bsc-blue)}

.bsc-offer.is-taken{border:1px solid rgba(157,242,155,.4);border-radius:3px;
  background:var(--bsc-panel2);padding:20px 24px;margin-bottom:12px}
.bsc-offer.is-taken h3{margin:0;font-size:18px;color:var(--bsc-txt)}
.bsc-offer-taken{margin:8px 0 0;font-size:14px;color:var(--bsc-ok)}

/* ---- the wait, then the arrival */
/* Hidden while the rocket is flying, so its dust stays inside the box. Restored the
   moment the offer lands, or the text below the fold cannot be reached — this rule
   sits after .bsc-modal-box{overflow:auto} and was quietly beating it. */
.bsc-offer-box{position:relative;overflow:hidden}
.bsc-offer-modal.is-ready .bsc-offer-box{overflow:auto}
/* An offer now runs to several screens, so the way out travels with the reader
   instead of scrolling off the top. Sticky rather than absolute, and floated so the
   heading beside it keeps its line. (A negative right margin has no effect on a
   sticky float — it comes to rest just inside the scrollbar, which is where it
   reads correctly on a phone as well.) */
/* z-index matters here: .bsc-offer-reveal comes later in the DOM and its landing
   animation gives it a stacking context, so a sticky cross at z-index:auto ended up
   painted underneath it and the click landed on the panel instead of the button.
   Absolute positioning had hidden this — it won on document order. */
.bsc-offer-modal .bsc-modal-x{position:sticky;float:right;top:-16px;margin:-16px 0 0 10px;z-index:3}
.bsc-offer-auth{display:flex;flex-direction:column;align-items:center;justify-content:center;
  min-height:280px;padding:20px 0;position:relative}
.bsc-offer-modal.is-ready .bsc-offer-auth{display:none}

.bsc-rocket{position:relative;width:34px;height:50px;
  animation:bsc-launch 2.2s cubic-bezier(.5,0,.6,1) forwards}
.bsc-rocket svg{width:100%;height:100%;filter:drop-shadow(0 0 10px rgba(25,200,224,.7))}
.bsc-rocket-flame{position:absolute;left:50%;bottom:-14px;width:12px;height:20px;
  transform:translateX(-50%);border-radius:50% 50% 60% 60%;
  background:linear-gradient(180deg,#eafcff,var(--bsc-blue) 45%,transparent);
  filter:blur(1px);animation:bsc-flame .16s ease-in-out infinite alternate}
@keyframes bsc-launch{
  0%{transform:translateY(34px) scale(.92);opacity:0}
  18%{opacity:1}
  100%{transform:translateY(-70px) scale(1.04);opacity:1}
}
@keyframes bsc-flame{from{height:16px;opacity:.85}to{height:26px;opacity:1}}

/* the dust it climbs through */
.bsc-dust{position:absolute;top:56%;left:50%;width:4px;height:4px;border-radius:50%;
  background:var(--bsc-aqua);opacity:0;filter:blur(.4px);
  animation:bsc-dust 2.2s ease-out infinite}
.bsc-dust:nth-child(2){--dx:-70px;--dy:46px;animation-delay:.05s;width:3px;height:3px}
.bsc-dust:nth-child(3){--dx:64px;--dy:52px;animation-delay:.28s}
.bsc-dust:nth-child(4){--dx:-38px;--dy:72px;animation-delay:.5s;width:2.5px;height:2.5px}
.bsc-dust:nth-child(5){--dx:44px;--dy:80px;animation-delay:.74s;width:3px;height:3px}
.bsc-dust:nth-child(6){--dx:-88px;--dy:30px;animation-delay:.98s;width:2px;height:2px}
.bsc-dust:nth-child(7){--dx:86px;--dy:26px;animation-delay:1.2s}
@keyframes bsc-dust{
  0%{opacity:0;transform:translate(0,0) scale(.5)}
  22%{opacity:.9}
  100%{opacity:0;transform:translate(var(--dx,40px),var(--dy,60px)) scale(1)}
}

.bsc-offer-authtext{margin:26px 0 0;font-family:"SF Mono",ui-monospace,Menlo,monospace;
  font-size:12px;letter-spacing:.24em;text-transform:uppercase;color:var(--bsc-blue)}
.bsc-offer-authtext span{animation:bsc-ellip 1.1s steps(4) infinite}
@keyframes bsc-ellip{0%{opacity:.2}50%{opacity:1}100%{opacity:.2}}
.bsc-offer-bar{width:190px;height:2px;margin:16px auto 0;background:var(--bsc-soft);overflow:hidden}
.bsc-offer-bar i{display:block;height:100%;width:0;background:var(--bsc-blue);
  box-shadow:0 0 10px var(--bsc-blue);animation:bsc-fill 2.2s linear forwards}
@keyframes bsc-fill{to{width:100%}}

/* ---- the offer itself */
.bsc-offer-reveal{display:none}
.bsc-offer-modal.is-ready .bsc-offer-reveal{display:block;animation:bsc-land .45s ease-out both}
@keyframes bsc-land{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}

/* one burst of dust as it lands */
.bsc-burst{position:absolute;top:34px;left:50%;width:0;height:0;pointer-events:none}
.bsc-burst i{position:absolute;width:5px;height:5px;margin:-2.5px;border-radius:50%;
  background:#eafcff;box-shadow:0 0 8px var(--bsc-aqua);opacity:0}
.bsc-offer-modal.is-ready .bsc-burst i{animation:bsc-burst .8s ease-out forwards}
.bsc-burst i:nth-child(1){--bx:0;--by:-62px}
.bsc-burst i:nth-child(2){--bx:46px;--by:-44px;animation-delay:.03s}
.bsc-burst i:nth-child(3){--bx:64px;--by:2px;animation-delay:.06s}
.bsc-burst i:nth-child(4){--bx:44px;--by:46px;animation-delay:.02s}
.bsc-burst i:nth-child(5){--bx:0;--by:62px;animation-delay:.05s}
.bsc-burst i:nth-child(6){--bx:-44px;--by:44px;animation-delay:.04s}
.bsc-burst i:nth-child(7){--bx:-64px;--by:0;animation-delay:.07s}
.bsc-burst i:nth-child(8){--bx:-46px;--by:-44px;animation-delay:.01s}
@keyframes bsc-burst{
  0%{opacity:1;transform:translate(0,0) scale(1)}
  100%{opacity:0;transform:translate(var(--bx),var(--by)) scale(.35)}
}

.bsc-offer-sum{margin:0 0 14px;font-size:16.5px;line-height:1.55;color:var(--bsc-txt)}
.bsc-offer-detail{font-size:15px;line-height:1.7;color:var(--bsc-body)}
.bsc-offer-stage{margin:6px 0 0;font-size:14px;color:var(--bsc-warn)}
.bsc-offer-detail p{margin:0 0 12px}
.bsc-offer-money{margin:20px 0 0;font-size:28px;line-height:1.1;color:var(--bsc-aqua)}
.bsc-offer-money span{font-size:13px;margin-left:8px;letter-spacing:.02em}
.bsc-offer-valid{margin:8px 0 0;font-size:13.5px;color:var(--bsc-warn)}
.bsc-offer-banknote{margin-top:16px;font-size:13.5px;line-height:1.6}
.bsc-offer-modal .bsc-modal-acts{flex-wrap:wrap}
.bsc-offer-modal .bsc-modal-acts form{margin:0}

/* ============================================================ the login page
   A drawn backdrop rather than an image: layered radial-gradients make the stars,
   one more makes the glow on the horizon, and a slow sweep passes over the top. No
   requests, no assets to lose, and it scales to any screen. */
.bsc-gate{--bsc-lap:18s;position:relative;max-width:none;width:min(1140px,calc(100vw - 32px));
  left:50%;transform:translateX(-50%);margin:0 auto;padding:0;
  min-height:min(76vh,720px);display:flex;align-items:center;justify-content:center;
  border:1px solid var(--bsc-line);border-radius:4px;overflow:hidden;background:var(--bsc-bg)}

.bsc-gate-sky{position:absolute;inset:0;overflow:hidden;pointer-events:none}
.bsc-gate-stars,
.bsc-gate-stars--far{position:absolute;inset:-20%;opacity:.75;
  background-repeat:repeat;background-size:340px 340px;
  background-image:
    radial-gradient(1.4px 1.4px at 40px 60px, rgba(232,244,246,.85), transparent 60%),
    radial-gradient(1.2px 1.2px at 180px 30px, rgba(127,233,245,.75), transparent 60%),
    radial-gradient(1.6px 1.6px at 250px 210px, rgba(232,244,246,.7), transparent 60%),
    radial-gradient(1px 1px at 90px 260px, rgba(232,244,246,.6), transparent 60%),
    radial-gradient(1.3px 1.3px at 300px 120px, rgba(25,200,224,.7), transparent 60%);
  animation:bsc-drift 140s linear infinite}
.bsc-gate-stars--far{background-size:210px 210px;opacity:.4;animation-duration:230s;
  animation-direction:reverse}
@keyframes bsc-drift{from{transform:translate3d(0,0,0)}to{transform:translate3d(-340px,170px,0)}}

/* the horizon the sail sits on */
.bsc-gate-glow{position:absolute;left:50%;bottom:-42%;width:150%;height:88%;
  transform:translateX(-50%);
  background:radial-gradient(50% 50% at 50% 50%, rgba(25,200,224,.22), rgba(25,200,224,.05) 45%, transparent 70%)}

/* one slow pass, the way a scope sweeps */
.bsc-gate-scan{position:absolute;inset:0;
  background:linear-gradient(100deg, transparent 42%, rgba(127,233,245,.07) 50%, transparent 58%);
  animation:bsc-sweep 9s ease-in-out infinite}
@keyframes bsc-sweep{0%{transform:translateX(-60%)}50%{transform:translateX(60%)}100%{transform:translateX(-60%)}}

/* Shooting stars. Each one is a tapered streak with a bright head, and each spends
   most of its cycle invisible and parked — the whole charm is that you catch one now
   and then rather than watching a shower. The head leads because the gradient runs
   bright-to-transparent along the direction of travel. */
.bsc-gate-shoot{position:absolute;width:190px;height:2px;opacity:0;border-radius:2px;
  background:linear-gradient(90deg, rgba(127,233,245,0), rgba(127,233,245,.22) 45%, #eafcff 100%);
  filter:drop-shadow(0 0 6px rgba(127,233,245,.85));
  animation:bsc-shoot 10s cubic-bezier(.3,.5,.4,1) infinite}
.bsc-gate-shoot::after{content:"";position:absolute;right:-2px;top:-2px;width:6px;height:6px;
  border-radius:50%;background:#fff;box-shadow:0 0 8px 2px rgba(234,252,255,.95)}

/* 9, 13 and 17 seconds — no common factor, so they never settle into a rhythm and
   start arriving together. The short cycles keep them turning up; the narrow visible
   window in the keyframes keeps each crossing quick, which is what makes one read as a
   shooting star rather than a light left on. */
.bsc-gate-shoot--1{top:14%;left:-20%;--bsc-tilt:19deg;animation-delay:1s}
.bsc-gate-shoot--2{top:52%;left:-26%;--bsc-tilt:27deg;--bsc-dash:118vw;animation-delay:4.5s;animation-duration:13s;width:150px}
.bsc-gate-shoot--3{top:32%;left:-16%;--bsc-tilt:13deg;--bsc-dash:96vw;animation-delay:8s;animation-duration:17s;width:230px}
/* the window is a share of each lap, so the longer cycles also cross more slowly —
   between about 1.6 and 2.7 seconds, which varies them without any of them dawdling */

@keyframes bsc-shoot{
  0%      {opacity:0;transform:rotate(var(--bsc-tilt)) translateX(0)}
  2%      {opacity:1}
  13%     {opacity:.9}
  /* travel is viewport-relative, not element-relative: 140% of a 190px streak is
     266px and would die a third of the way across the panel */
  18%     {opacity:0;transform:rotate(var(--bsc-tilt)) translateX(var(--bsc-dash,102vw))}
  /* parked and unseen for the rest of the lap */
  18.01%,
  100%    {opacity:0;transform:rotate(var(--bsc-tilt)) translateX(0)}
}

.bsc-gate-inner{position:relative;z-index:1;width:min(460px,100%);padding:54px 28px;text-align:center}

.bsc-gate-mark{width:104px;height:104px;margin:0 auto 26px;
  display:flex;align-items:center;justify-content:center;
  filter:drop-shadow(0 0 18px rgba(25,200,224,.55))}
.bsc-gate-mark svg{width:100%;height:100%;overflow:visible}
/* the dots are drawn in viewBox units, so they scale with the mark — at 24 units wide
   a radius under about .7 disappears entirely once it is painted at 100px */
.bsc-sail-dot{filter:drop-shadow(0 0 .6px #fff) drop-shadow(0 0 2px var(--bsc-aqua))}

/* A reusable travelling dot for any bordered box. Percentages trace the border at
   whatever size the box happens to be; --bsc-run is the share of the lap spent on the
   long edges, so a wide panel and a narrow one can each be given an even pace. */
.bsc-laser{position:relative}
.bsc-laser::after{content:"";position:absolute;top:0;left:0;width:8px;height:8px;
  margin:-4px 0 0 -4px;border-radius:50%;background:#fff;
  box-shadow:0 0 6px 2px var(--bsc-aqua),0 0 18px 6px rgba(25,200,224,.6);
  animation:bsc-lap var(--bsc-lap,14s) linear infinite;pointer-events:none}
@keyframes bsc-lap{
  0%{top:0;left:0}
  35%{top:0;left:100%}
  50%{top:100%;left:100%}
  85%{top:100%;left:0}
  100%{top:0;left:0}
}

.bsc-gate-welcome{margin:0 0 10px;font-family:"SF Mono",ui-monospace,Menlo,Consolas,monospace;
  font-size:12px;letter-spacing:.28em;text-transform:uppercase;color:var(--bsc-blue)}
/* ".article h1" in the theme sets Georgia and a size, and beats a single class — the
   heading has to out-specify it or it comes out serif in the middle of a mono panel */
.bsc-gate .bsc-gate-title,
.bsc-gate h1.bsc-gate-title{margin:0;font-family:"SF Mono",ui-monospace,Menlo,Consolas,monospace;
  font-size:clamp(30px,5vw,42px);font-weight:700;letter-spacing:.16em;line-height:1.1;
  text-transform:uppercase;color:var(--bsc-txt);text-shadow:0 0 26px rgba(25,200,224,.35)}
.bsc-gate-rule{width:52px;height:2px;margin:20px auto 22px;background:var(--bsc-blue);
  box-shadow:0 0 14px var(--bsc-blue)}

.bsc-gate-lede{margin:0 0 26px;font-size:15.5px;line-height:1.65;color:var(--bsc-body)}
.bsc-gate .bsc-note{text-align:left;margin-bottom:22px}

.bsc-gate-form{text-align:left}
.bsc-gate-form label{font-family:"SF Mono",ui-monospace,Menlo,Consolas,monospace;
  font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--bsc-dim);
  font-weight:600;margin:0 0 8px}
.bsc-gate-form input[type=email]{background:rgba(11,15,20,.82);border-color:var(--bsc-line)}
.bsc-gate-form input[type=email]:focus{border-color:var(--bsc-aqua);outline:none;
  box-shadow:0 0 0 3px rgba(25,200,224,.16)}
.bsc-gate-form .bsc-btn{width:100%;margin-top:16px}


@media (max-width:600px){
  .bsc-gate{min-height:auto;border-radius:0;width:100vw}
  .bsc-gate-inner{padding:44px 22px}
  .bsc-gate-title{font-size:30px;letter-spacing:.12em}
  .bsc-gate-welcome{font-size:10.5px;letter-spacing:.2em}
}
/* movement is decoration here, so it goes when it is not wanted */
@media (prefers-reduced-motion:reduce){
  .bsc-gate-stars,.bsc-gate-stars--far,.bsc-gate-scan{animation:none}
  .bsc-gate-scan{display:none}
  /* SVG motion cannot be stopped from CSS, so the dots are taken off the stage */
  .bsc-sail-dot,.bsc-laser::after,.bsc-gate-shoot{display:none}
}

/* ============================================== the knowledge base
   Sections reuse the dashboard tiles, so a shelf looks like a shelf wherever it is. */
.bsc-kb-sub{margin:0 0 18px;font-size:15px}

.bsc-vids{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:18px;margin-top:18px}
.bsc-vid{display:flex;flex-direction:column;gap:10px;padding:0;border:1px solid var(--bsc-line);
  border-radius:3px;background:var(--bsc-panel2);text-align:left;cursor:pointer;font:inherit;color:inherit;
  overflow:hidden;transition:border-color .18s, transform .18s}
.bsc-vid:hover{border-color:var(--bsc-aqua);transform:translateY(-2px)}
.bsc-vid:focus-visible{outline:2px solid var(--bsc-aqua);outline-offset:3px}
.bsc-vid-thumb{position:relative;display:block;aspect-ratio:16/9;background:#000 center/cover no-repeat}
.bsc-vid-play{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  color:#fff;opacity:.92;transition:transform .18s}
.bsc-vid-play svg{width:58px;height:58px;filter:drop-shadow(0 0 12px rgba(0,0,0,.7))}
.bsc-vid:hover .bsc-vid-play{transform:scale(1.08);color:var(--bsc-aqua)}
.bsc-vid-name{padding:0 14px;font-size:15.5px;font-weight:700;line-height:1.35;color:var(--bsc-txt)}
.bsc-vid-blurb{padding:0 14px 14px;font-size:13.5px;line-height:1.5;color:var(--bsc-dim)}
.bsc-vid-name:last-child{padding-bottom:16px}

/* the player: wide, because a guide is no use postage-stamp sized */
.bsc-vid-box{width:min(920px,100%)}
.bsc-vid-frame{margin-top:14px;aspect-ratio:16/9;background:#000;border:1px solid var(--bsc-line)}
.bsc-vid-frame iframe{display:block;width:100%;height:100%;border:0}

/* knowledge articles */
.bsc-arts{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px;margin-top:18px}
.bsc-art{display:flex;flex-direction:column;gap:8px;padding:20px;border:1px solid var(--bsc-line);
  border-radius:3px;background:var(--bsc-panel2);text-decoration:none;
  transition:border-color .18s, transform .18s}
.bsc-art:hover{border-color:var(--bsc-aqua);transform:translateY(-2px)}
.bsc-art-title{font-size:16.5px;font-weight:700;line-height:1.35;color:var(--bsc-txt)}
.bsc-art-blurb{font-size:13.5px;line-height:1.55;color:var(--bsc-dim)}
.bsc-art-go{margin-top:4px;font-family:"SF Mono",ui-monospace,Menlo,monospace;font-size:11px;
  letter-spacing:.14em;text-transform:uppercase;color:var(--bsc-blue)}

.bsc-article h2{margin:0 0 10px;font-size:26px;line-height:1.25;color:var(--bsc-txt)}
.bsc-article-lede{margin:0 0 22px;font-size:16.5px;line-height:1.6;color:var(--bsc-body)}
.bsc-article-body{font-size:16px;line-height:1.75;color:var(--bsc-body);max-width:66ch}
.bsc-article-body p{margin:0 0 16px}
.bsc-article-body h3{margin:28px 0 10px;font-size:18px;color:var(--bsc-txt)}
.bsc-article-body ul{margin:0 0 16px;padding-left:22px}
.bsc-article-body li{margin:0 0 8px}
.bsc-article-body strong{color:var(--bsc-txt)}
