/* =============================================================================
   CONSOLE SKIN — the owner's chassis, brought to the ONLINE table
   =============================================================================
   He drew a play screen, we built it locally at site/overtake/_console-lab.html,
   he tested it and said «الآن انتقل إلى الأونلاين». This is that move.

   NOTHING HERE BUILDS A CONTROL. The online left column already is his column:
   `.otw-slot` (the dealt wildcard, wild.js) above `.bcword` (the word plate,
   bigcards.js — «كلمتك», the word, the score, «إزالة الكلمة», «مسح حرف»,
   «ثبّت»). Every button below is the game's OWN button with the game's OWN
   listener still on it; this file and console-skin.js only change what it looks
   like and where it stands. bigcards.js is not touched — the shared file stays
   exactly as its owner left it.

   THE ICONS AND THE MOTION ARE HIS. Lifted from the rendered DOM of the artifact
   he handed over (`GRIDROP Action Icons.html`) — three SVGs, ten keyframes, and
   the slab's whole skin: border, body gradient, four-layer glow, the hairline
   that hums inside it, the sheen that crosses it, the caption strip.

   Everything is scoped to `body.otcs`, which console-skin.js only adds once it
   has actually skinned a plate. Until then the page is byte-for-byte what it was.
   ========================================================================== */

/* ---- his ten keyframes, verbatim ---------------------------------------- */
@keyframes ai-in{0%{opacity:0;transform:translateY(20px) scale(.94)}100%{opacity:1;transform:translateY(0) scale(1)}}
@keyframes ai-hum{0%,100%{opacity:.45}50%{opacity:.95}}
@keyframes ai-flicker{0%,100%{opacity:1}42%{opacity:1}44%{opacity:.55}46%{opacity:1}
  88%{opacity:1}90%{opacity:.7}92%{opacity:1}}
@keyframes ai-sheen{0%{transform:translateX(-130%) skewX(-18deg)}100%{transform:translateX(240%) skewX(-18deg)}}
@keyframes ai-tap{0%,58%,100%{transform:translate(0,0)}68%{transform:translate(-3px,4px)}80%{transform:translate(0,0)}}
@keyframes ai-ripple{0%,58%{opacity:0;transform:scale(.35)}70%{opacity:1;transform:scale(1)}
  100%{opacity:0;transform:scale(1.9)}}
@keyframes ai-cell{0%,52%,100%{opacity:.34}66%{opacity:1}}
@keyframes ai-pull{0%,14%{opacity:0;transform:translateX(14px)}26%{opacity:1;transform:translateX(8px)}
  52%{opacity:1;transform:translateX(-16px)}70%{opacity:0;transform:translateX(-24px)}
  100%{opacity:0;transform:translateX(14px)}}
@keyframes ai-gone{0%,30%{opacity:1;transform:translate(0,0) scale(1)}
  52%{opacity:0;transform:translate(9px,-7px) scale(.55)}
  92%{opacity:0;transform:translate(9px,-7px) scale(.55)}
  100%{opacity:1;transform:translate(0,0) scale(1)}}
@keyframes ai-poof{0%,32%{opacity:0;transform:scale(.4)}44%{opacity:.9;transform:scale(1)}
  62%,100%{opacity:0;transform:scale(1.6)}}
@keyframes ai-lid{0%,18%,100%{transform:rotate(0deg)}30%,76%{transform:rotate(-32deg)}}
@keyframes ai-suck{0%,16%{opacity:1;transform:translate(0,0) rotate(0deg) scale(1)}
  38%{opacity:1;transform:translate(calc(var(--tx) * .5),-17px) rotate(calc(var(--rz) * .45)) scale(.92)}
  56%{opacity:0;transform:translate(var(--tx),var(--ty)) rotate(var(--rz)) scale(.3)}
  93%{opacity:0;transform:translate(var(--tx),var(--ty)) rotate(var(--rz)) scale(.3)}
  100%{opacity:1;transform:translate(0,0) rotate(0deg) scale(1)}}
@keyframes ai-gulp{0%,46%,100%{transform:scale(1,1)}54%{transform:scale(1.12,.88)}
  64%{transform:scale(.95,1.05)}74%{transform:scale(1,1)}}
@keyframes ai-mouth{0%,44%{opacity:0;transform:scaleX(.4)}54%{opacity:1;transform:scaleX(1)}
  72%,100%{opacity:0;transform:scaleX(1.3)}}

/* ⚠️ THE PRESS IS A FLASH, NOT A STATE — his question, in his words:
   «إذا ضغطت على الأزرار فإنها ستعمل وتضيء ... والإضاءة تكون فقط لحظية».
   So the answer is built rather than promised: one press fires ONE 340ms flare
   that brightens the whole slab, floods its glow and lets both fall back to
   exactly where they were. Nothing latches, nothing stays lit, and a second
   press fires it again from the start (console-skin.js re-arms the class). */
@keyframes otcs-press{
  0%   {filter:brightness(1)}
  12%  {filter:brightness(1.85) saturate(1.15)}
  100% {filter:brightness(1)}
}
@keyframes otcs-flare{
  0%   {opacity:0;transform:scale(.86)}
  14%  {opacity:1;transform:scale(1)}
  100% {opacity:0;transform:scale(1.04)}
}

/* =========================================================================
   1 · THE THREE SLABS
   ========================================================================= */
/* the row that holds «مسح حرف» and «إزالة الكلمة» becomes a column, and the
   order becomes his: explain, then take a letter back, then wipe the word */
body.otcs .bcword .bcwbtns{gap:clamp(4px,.7vh,8px)}
body.otcs .bcword .bcwbtns .bcwrow{display:flex;flex-direction:column;
  flex-wrap:nowrap;gap:clamp(4px,.7vh,8px)}
body.otcs .bcword .bcwbtns .bcwrow .bcwback{order:1}
body.otcs .bcword .bcwbtns .bcwrow .bcwclear{order:2}
/* HIS ORDER, TOP TO BOTTOM: the wildcard, the three slabs, then «كلمتك» and
   «ثبّت» beneath them. `.bcword` is already a flex column (bigcards.css:199),
   so this is an ordering, not a rebuild — and console-skin.js lifts «ثبّت» out
   of the button group so it can sit at the very foot where his drawing has it. */
body.otcs .bcword .bcwbtns{order:-2}
body.otcs .bcword .bcwlbl{order:-1}
body.otcs .bcword .bcwrd{order:0}
body.otcs .bcword .bcwsc{order:1}
body.otcs .bcword .bcwlock{order:2}
/* ⚠️ MOVING «ثبّت» OUT OF `.bcwbtns` DROPS FOUR RULES THAT WERE KEYED ON IT
   BEING IN THERE. They are put back here, one for one, rather than left to be
   discovered in a live race. Two are cosmetic — but the other two are not:
   `.bcword.wait .bcwbtns` and `.bcword.locked .bcwbtns` are what HIDE the
   buttons while the plate is waiting or the hand is locked, and without them
   Lock-in would have stayed on screen in states where it must not be pressable.
     bigcards.css:258  .bcword.wait   .bcwbtns{display:none}
     bigcards.css:223  .bcword.locked .bcwbtns{display:none}
     overtake-online.html:805  .bcword .bcwbtns .bcwlock{font-size:var(--otTxt)!important}
     bigcards.css:397 (@media max-height:460)  padding:3px 4px;min-height:0 */
/* ⚠️ `.wait` NO LONGER HIDES «ثبّت» — owner, 2026-08-15: the buttons stay on
   screen through the throw phase, switched off, so the plate keeps one shape
   from the deal to the buzzer (bigcards.css `.bcword.wait .bcwbtns`). It is
   `disabled` in that state, which the rule at the foot of this file paints, so
   it is unpressable exactly as it was when it was invisible. `.locked` still
   hides it: there the word is already committed and the row is finished, not
   waiting. */
body.otcs .bcword.locked > .bcwlock{display:none}
body.ot-felt.otcs .bcword > .bcwlock{font-size:var(--otTxt)}
/* ⚠️ NOT REPLICATED VERBATIM, AND DELIBERATELY SO. bigcards.css:397 is
   `padding:3px 4px;min-height:0`, and copying it faithfully reproduced its
   effect: «ثبّت» ends up a 6px box around a 17px word on every landscape phone —
   measured on the UNSKINNED page too, so it is not a regression of mine but it
   is not something to carry forward either. The phone tier below gives it back a
   thumb's worth; this keeps the tighter padding without the zero. */
@media (max-height:460px){ body.otcs .bcword > .bcwlock{padding:3px 5px;min-height:32px;line-height:24px} }
/* AND THE SHAPE WENT WITH THE RULE. Moving «ثبّت» out of `.bcwbtns` (console-skin.js)
   also dropped `border-radius:11px` and `min-height:40px` from bigcards.css:227-231,
   and only the height was put back — and only on a short screen. Measured on the live
   online table: border-radius 0px at 880x400, 844x390, 1024x768 AND 1280x800, so the
   one control that COMMITS the word is the only square thing in a column of rounded
   slabs; and 20px tall at 1024x768 / 21px at 1280x800 around a 15px label, because the
   min-height above lives inside @media(max-height:460px) and nothing replaces it higher
   up.
   ⚠️ THE HEIGHT IS A clamp, NOT A SECOND BREAKPOINT, and not a flat 36px. This rule
   comes LATER in the file than the @media above at the SAME specificity, so a flat
   min-height would WIN over it and steal 4px back out of the 400px phone this whole
   patch series is buying height for. clamp() resolves to 32px at every height <= 460
   (4.6vh = 21.2px there) — the phone keeps exactly what the tier above gives it — and
   grows the desktop/tablet slab to ~35-37px instead of 20px.
   The disabled tint is matched to the siblings' own (.otcs-act[disabled], :118) rather
   than left at bigcards' .35, which on a 12px label over the felt reads as switched off
   rather than as not-yet-valid. */
body.otcs .bcword > .bcwlock{border-radius:11px;min-height:clamp(32px,4.6vh,40px)}
body.otcs .bcword > .bcwlock:disabled{opacity:.45}

body.otcs .bcword .otcs-act{
  all:unset;box-sizing:border-box;position:relative;display:block;width:100%;
  padding:0;overflow:hidden;cursor:pointer;text-align:center;
  border-radius:clamp(10px,1.1vw,16px);
  background:linear-gradient(180deg,rgba(var(--gl),var(--a0)) 0%,var(--b1) 46%,var(--b2) 100%);
  border:2px solid var(--ac);
  box-shadow:0 0 3px rgba(var(--gl),var(--g1)),0 0 11px rgba(var(--gl),var(--g2)),
             0 0 30px rgba(var(--gl),var(--g3)),inset 0 0 18px rgba(var(--gl),var(--g4));
  animation:ai-in .6s cubic-bezier(.22,.61,.36,1) .05s both,ai-flicker 7s linear 1s infinite;
  transition:transform .12s,filter .15s}
body.otcs .bcword .otcs-act:hover{transform:translateY(-2px)}
body.otcs .bcword .otcs-act:active{transform:translateY(0) scale(.98)}
body.otcs .bcword .otcs-act[disabled]{opacity:.45;filter:saturate(.45) brightness(.85);
  cursor:default;pointer-events:none}
/* the momentary light — one shot, then gone */
body.otcs .bcword .otcs-act.otcs-hit{animation:ai-in .6s cubic-bezier(.22,.61,.36,1) .05s both,
  ai-flicker 7s linear 1s infinite,otcs-press .34s ease-out}
body.otcs .bcword .otcs-act .otcs-flare{position:absolute;inset:-2px;border-radius:inherit;
  pointer-events:none;opacity:0;
  background:radial-gradient(120% 120% at 50% 50%,rgba(var(--gl),.55),rgba(var(--gl),.12) 55%,transparent 72%);
  box-shadow:0 0 26px rgba(var(--gl),.85),inset 0 0 26px rgba(var(--gl),.55)}
body.otcs .bcword .otcs-act.otcs-hit .otcs-flare{animation:otcs-flare .34s ease-out}

body.otcs .bcword .otcs-act .otcs-hum{position:absolute;inset:4px;
  border-radius:clamp(7px,.8vw,12px);border:1px solid rgba(var(--gl),var(--gh));
  pointer-events:none;animation:ai-hum 3.6s ease-in-out infinite}
body.otcs .bcword .otcs-act .otcs-sheen{position:absolute;top:0;left:0;width:34%;height:100%;
  pointer-events:none;background:linear-gradient(90deg,transparent,rgba(200,255,252,.14),transparent);
  animation:ai-sheen 6.5s ease-in-out 1.2s infinite}
/* ⚠️ SMALLER THAN THE LAB, AND IT HAS TO BE. His mockup's column carries four
   things; the online column carries six — the wildcard's own tip plate and
   «ثبّت» are both live controls his drawing had no reason to show. Measured with
   the lab's sizes in place: `.bcword` scrolled at 1480x840, which is a HUD you
   cannot use during a 15-second race. So the slab keeps his shape and gives up
   his scale — and every number below was measured against a real table, not
   picked. */
body.otcs .bcword .otcs-act .otcs-bay{position:relative;display:flex;justify-content:center;
  padding:clamp(3px,.55vh,7px) 6px 0}
body.otcs .bcword .otcs-act .otcs-bay svg{width:min(clamp(26px,2.7vw,46px),5.4vh);
  height:auto;overflow:visible;display:block}
/* ⚠️ `display:block`, AND IT IS LOAD-BEARING. Inside a <button> these wrappers
   are spans, and a block `.otcs-p` inside an INLINE `.otcs-cap` splits the inline
   box into anonymous blocks — empty line boxes above and below, sized off the
   button's inherited 16px. Measured: the caption strip stood 81px tall around a
   13px line, and each slab 114px, which is what made the plate scroll. The lab
   never showed it because there these wrappers are divs. */
body.otcs .bcword .otcs-act{font-size:0;line-height:0}
body.otcs .bcword .otcs-act .otcs-cap{display:block;position:relative;margin-top:clamp(2px,.35vh,5px);
  padding:clamp(2px,.35vh,5px) 5px clamp(3px,.45vh,6px);
  border-top:1px solid rgba(var(--gl),var(--gc));
  background:linear-gradient(180deg,rgba(var(--gl),.12),transparent)}
/* ⚠️ THE LABEL IS A SPAN, NOT THE BUTTON. overtake-online.html:804 sizes
   `.bcword .bcwbtns button` with `!important`; the type inside the slab is a
   child, so it is sized here without out-shouting anybody's stylesheet. */
/* ⚠️ 1.5, NOT 1.25 — ARABIC NEEDS THE ROOM. Measured on six phones: the caption
   rendered a 14px line box inside an 11px element and `overflow:hidden` on the
   slab sliced it, so «إزالة الكلمة» lost its descenders on every one of them. */
body.otcs .bcword .otcs-act .otcs-p{display:block;
  font:800 clamp(9px,1.3vh,12.5px)/1.5 Cairo,system-ui,sans-serif;color:#eafcff;
  text-shadow:0 0 12px rgba(var(--gl),var(--gt))}
body:not(.ar).otcs .bcword .otcs-act .otcs-p{font-family:Inter,system-ui,sans-serif;
  letter-spacing:.03em}
/* the legend: it says what to do, it does not do it */
body.otcs .bcword .otcs-act.otcs-info{cursor:default;pointer-events:none}

/* his three tones, each with its own alphas — measured off his file */
body.otcs .otcs-a1{--ac:#1FE9DD;--ac2:#B6FFF8;--gl:31,233,221; --a0:.16;
  --b1:rgba(8,26,34,.94);--b2:rgba(5,16,22,.97);
  --g1:.95;--g2:.6; --g3:.28;--g4:.14;--gh:.34;--gc:.30;--gt:.90}
body.otcs .otcs-a2{--ac:#FFCE5C;--ac2:#FFF6E2;--gl:240,201,106;--a0:.17;
  --b1:rgba(28,20,6,.94);--b2:rgba(16,11,3,.97);
  --g1:.90;--g2:.55;--g3:.24;--g4:.12;--gh:.32;--gc:.28;--gt:.85}
body.otcs .otcs-a3{--ac:#FF6B6B;--ac2:#FFD7DB;--gl:255,77,90;  --a0:.18;
  --b1:rgba(32,8,12,.94);--b2:rgba(20,5,8,.97);
  --g1:.90;--g2:.55;--g3:.24;--g4:.13;--gh:.32;--gc:.30;--gt:.85}

/* =========================================================================
   2 · THE WILDCARD, SET INTO A FRAME
   ========================================================================= */
/* THREE DEPTHS, AND NOT ONE LINE OF DOM. `.otw-slot` is rebuilt by wild.js
   whenever the hand changes, so a wrapper element injected inside it would be
   swept away on the next deal. The rack is therefore the slot itself, the rails
   are its two pseudo-elements, and the well is the card's own `.gw-wrap`. */
body.otcs .otw-slot{position:fixed;padding:5px 10px 6px;
  border-radius:15px;background:linear-gradient(160deg,#28343d,#161f26);
  border:1px solid rgba(150,190,205,.16);
  box-shadow:0 14px 30px -18px #000,inset 0 1px 0 rgba(200,235,245,.14),
             inset 0 -2px 6px rgba(0,0,0,.5)}
body.otcs .otw-slot::before,body.otcs .otw-slot::after{content:'';position:absolute;
  top:15%;height:70%;width:3px;border-radius:3px;pointer-events:none;
  background:linear-gradient(180deg,transparent,#45eded 16%,#45eded 84%,transparent);
  box-shadow:0 0 11px rgba(69,237,237,.7);opacity:.9}
body.otcs .otw-slot::before{left:5px}
body.otcs .otw-slot::after{right:5px}
/* ⚠️ `content-box`, AND THAT IS THE WHOLE FIX FOR HIS «a bit off of its
   container». deck.js gives the wrap an INLINE `width:118px`, sized to the card
   it contains; with `border-box` the well's padding was taken OUT of that width,
   leaving a 108px content box around a 118px card. A card cannot be centred in a
   box narrower than itself, so it hung 6px past the well's edge — measured, card
   left 39.3 against wrap left 45.3, while the name and the tip beneath it sat
   dead centre. That mismatch is what read as crooked. content-box adds the
   padding AROUND the card's own width instead of taking it from it. */
body.otcs .otw-slot .gw-wrap{box-sizing:content-box;padding:6px 6px 5px;
  border-radius:12px;background:linear-gradient(180deg,#091218,#0c161d 55%,#0a141a);
  border:1px solid rgba(120,180,200,.20);
  box-shadow:inset 0 3px 13px rgba(0,0,0,.8),inset 0 -1px 0 rgba(190,240,250,.07)}
body.otcs .otw-slot .gw-card{margin-inline:auto;
  box-shadow:0 6px 14px -6px rgba(0,0,0,.85),
    0 0 24px rgba(69,237,237,.5),0 0 52px -10px rgba(69,237,237,.42),
    inset 0 1px 0 rgba(255,255,255,.7)!important}
/* the name moves off the card's face and onto the well's floor, as he drew it.
   ⚠️ THE TIP PLATE STAYS. His mockup showed a REVEAL card as an example and had
   no reason to carry one; online it is live text that changes with every card
   dealt, so removing it would cost a player information his drawing never took
   away. It sits below the well, where the plate already stood. */
body.otcs .otw-slot .gw-lab{display:none!important}
body.otcs .otw-slot .otcs-wname{display:block;margin-top:5px;text-align:center;
  color:#45eded;font:800 clamp(10px,1.5vh,14px)/1.15 Cairo,system-ui,sans-serif;
  text-shadow:0 0 12px rgba(69,237,237,.6),0 1px 0 rgba(0,0,0,.5)}
body:not(.ar).otcs .otw-slot .otcs-wname{font-family:Sora,system-ui,sans-serif;
  letter-spacing:.14em}
body.otcs .otw-slot .gw-plate{margin-top:5px!important}

/* ---- the two steps console-skin.js's budget can take, in order ----------
   step 2 · everything in the plate steps down together — the icons, the caption,
   the gaps, and «كلمتك» itself. The 25px this last one gives up is exactly what
   buys the cyan slab its place; without it the budget went straight to step 3
   on a 1480x840 desktop. */
body.otcs .bcword.otcs-tight{gap:5px}
body.otcs .bcword.otcs-tight .otcs-act .otcs-bay{padding:3px 5px 0}
body.otcs .bcword.otcs-tight .otcs-act .otcs-bay svg{width:min(clamp(20px,2vw,31px),4vh)}
body.otcs .bcword.otcs-tight .otcs-act .otcs-cap{margin-top:1px;padding:2px 4px 3px}
body.otcs .bcword.otcs-tight .otcs-act .otcs-p{font-size:clamp(8.5px,1.1vh,10.5px)}
body.otcs .bcword.otcs-tight .bcwbtns,
body.otcs .bcword.otcs-tight .bcwbtns .bcwrow{gap:4px}
body.otcs .bcword.otcs-tight .bcwlbl{font-size:clamp(9px,1.2vh,12px);line-height:1.75}
/* ---- the card's own two steps (console-skin.js fitWild) -----------------
   step 2 · the tip keeps two lines instead of three or four. This is also the
   variance that made the cyan slab come and go between deals: «درع» is a 46px
   tip and «الكمين» a 70px one. Two lines still say it. */
body.otcs.otcs-wtight .otw-slot{padding:4px 8px 5px}
body.otcs.otcs-wtight .otw-slot .gw-wrap{padding:5px 5px 4px}
/* ⚠️ NOT `-webkit-line-clamp` — IT NEVER TOOK. The element computes to
   `display:flow-root` on this page even with `display:-webkit-box !important` in
   the winning rule (measured: display flow-root, clamp 2, height 46, scrollHeight
   75), so the clamp was inert while my `overflow:hidden` was not: the tip was cut
   through the middle of a third line, which reads as broken rather than trimmed.
   A height in whole lines does not depend on any of that, and the fade at the
   foot says "there is more" instead of pretending there isn't. console-skin.js
   hangs the whole sentence on the element's title, so nothing is unreachable. */
body.otcs.otcs-wtight .otw-slot .gw-plate{line-height:1.32;
  max-height:calc(2.64em + 15px);overflow:hidden;
  -webkit-mask-image:linear-gradient(180deg,#000 68%,rgba(0,0,0,.25));
          mask-image:linear-gradient(180deg,#000 68%,rgba(0,0,0,.25))}
/* step 3 · the tip goes. Only where keeping it means the card standing on the
   word the player is building — a HUD that hides the word is worse than a card
   whose rule you have to remember. */
body.otcs.otcs-wbare .otw-slot .gw-plate{display:none}
body.otcs.otcs-wbare .otw-slot{padding:3px 7px 4px}
body.otcs.otcs-wbare .otw-slot .gw-wrap{padding:4px 4px 3px}
body.otcs.otcs-wbare .otw-slot .otcs-wname{margin-top:3px;font-size:clamp(9px,1.3vh,12px)}
/* ⚠️ ARABIC HAS BEEN LOSING THE TOPS OF ITS LETTERS ON EVERY SCREEN, AND IT IS
   NOT THE SKIN'S DOING — the unskinned page fails the same measurement. `.bcww`
   is the word the player is building, the one thing on this panel they are
   actually reading, and at 26px it renders a 40px line box inside a 33px element
   under `overflow:hidden`. Nothing spills, so nothing looks broken: the letters
   just quietly arrive decapitated. Measured at 1024x768, 1180x820, 1366x1024,
   1280x800, 1366x768, 1480x840, 1920x1080 and 2560x1080 — all eight, both with
   the skin and without it. Latin ratios do not fit Arabic, and this panel is
   Arabic first. Fixed here rather than in bigcards.css, which belongs to another
   session; the rule is scoped to `body.otcs` so it changes nothing they own. */
/* 1.75: the ink box measures about 1.69x the font size for these glyphs, so
   anything under that still clips. Verified at every size in the sweep. */
body.otcs .bcword .bcwrd .bcww{line-height:1.75}
body.otcs .bcword .bcwlbl{line-height:1.75}

/* THE LEGEND AND THE HINT ARE THE SAME SENTENCE, so only one of them is ever on
   screen. bigcards.js:451 puts «انقر بطاقات الطاولة» in the word line while the
   word is empty, and that is word for word what the cyan slab says. Showing the
   slab therefore COSTS less than it looks: the line it replaces was already
   paying for itself. And when the budget drops the slab, the sentence comes
   straight back — nothing is ever lost, whichever way it goes. */
body.otcs .bcword:not(.otcs-nolegend) .bcwrd i{display:none}
/* step 3 · the cyan slab goes */
body.otcs .bcword.otcs-nolegend .bcwlegend{display:none}
/* step 4 · and where even that is not enough — a landscape phone with a
   twelve-player rail — the two controls fall back to the compact text buttons
   the game already shipped, keeping only their new colours. Nothing is lost
   that was ever there: this is the plate as it was, and his design applies on
   every screen that can hold it. A HUD you have to scroll during a race is the
   one outcome not allowed. */
body.otcs .bcword.otcs-plain .otcs-act{border-radius:9px;animation:none;
  box-shadow:0 0 8px rgba(var(--gl),.35),inset 0 0 12px rgba(var(--gl),.10)}
body.otcs .bcword.otcs-plain .otcs-act .otcs-bay,
body.otcs .bcword.otcs-plain .otcs-act .otcs-sheen,
body.otcs .bcword.otcs-plain .otcs-act .otcs-hum{display:none}
body.otcs .bcword.otcs-plain .otcs-act .otcs-cap{margin:0;border-top:0;background:none;
  padding:5px 6px}
body.otcs .bcword.otcs-plain .otcs-act .otcs-p{font-size:clamp(9px,1.35vh,12px)}
/* ⚠️ THE PRESS SURVIVES THE FALLBACK. `.otcs-plain .otcs-act{animation:none}`
   and `.otcs-act.otcs-hit{animation:…}` carry the same specificity, and the
   fallback is written later — so it silently won and the momentary light stopped
   firing on exactly the screens where a player most needs to know the tap landed.
   Caught on the bench at 1024x600: «flare fired again=false». */
body.otcs .bcword.otcs-plain .otcs-act.otcs-hit{animation:otcs-press .34s ease-out}

/* =========================================================================
   3 · SHORT SCREENS — explanations go first, controls never
   ========================================================================= */
@media (max-height:620px){
  body.otcs .bcword .otcs-act .otcs-bay{padding:3px 6px 0}
  body.otcs .bcword .otcs-act .otcs-cap{margin-top:2px;padding:2px 5px 3px}
  body.otcs .otw-slot{padding:5px 10px 6px}
  body.otcs .otw-slot .gw-wrap{padding:6px 6px 5px}
  body.otcs .otw-slot .otcs-wname{margin-top:4px}
}
/* =========================================================================
   4 · A PHONE, HELD SIDEWAYS — measured on the owner's own screenshot
   =========================================================================
   He sent a photograph of a real landscape phone with «ثبّت» missing and «انقر
   بطاقات الطاولة» sliced through the middle, and asked for mobile to be fixed and
   kept fixed. Reproduced at six real viewports with touch and a mobile UA, and
   the numbers say the column is simply out of floor at 800x360: the plate has
   87px of usable box and 117px of content, «ثبّت» is squeezed to a 10px box
   around a 17px word, and the two controls take 55px of the 87.
   ⚠️ AND THE UNSKINNED PAGE FAILS THE SAME TEST — «ثبّت» 17px of text in a 6px
   box on every phone in the sweep, the plate scrolling at two of them. So this
   is not a matter of undoing the skin; the layout below is what a phone needs.
   THE RULE HERE: the two controls speak in ICONS ONLY and stand SIDE BY SIDE.
   His icons were drawn to be read without their captions — the board waking, the
   tile pulled back, the word swallowed — and a caption that costs a whole row is
   what was pushing the commit button off the screen. One row instead of two, and
   «ثبّت» gets its size back. */
@media (max-height:470px){
  body.otcs .bcword .bcwlegend{display:none}
  body.otcs .bcword .bcwbtns .bcwrow{flex-direction:row;gap:5px}
  body.otcs .bcword .bcwbtns .bcwrow .otcs-act{flex:1 1 0;min-width:0}
  /* the icon comes back even in the plain fallback, and the caption goes —
     stated for `.otcs-plain` too, which would otherwise out-specify this */
  body.otcs .bcword .otcs-act .otcs-bay,
  body.otcs .bcword.otcs-plain .otcs-act .otcs-bay{display:flex;padding:4px 3px}
  body.otcs .bcword .otcs-act .otcs-bay svg,
  body.otcs .bcword.otcs-plain .otcs-act .otcs-bay svg{width:min(30px,7.8vh)}
  body.otcs .bcword .otcs-act .otcs-cap,
  body.otcs .bcword.otcs-plain .otcs-act .otcs-cap{display:none}
  body.otcs .bcword .otcs-act,
  body.otcs .bcword.otcs-plain .otcs-act{border-radius:10px}
  body.otcs .bcword{padding:5px 7px!important;gap:4px}
  /* ⚠️ «ثبّت» IS THE BUTTON THAT COMMITS THE WORD, and it was the one being
     starved: 17px of text in a 6px box, on the skinned page AND the plain one.
     bigcards.css:397 zeroes its min-height at this height and my own line
     replicated that faithfully — faithful to a bug. It keeps a thumb's worth. */
  /* ⚠️ 1.7, AND IT TOOK THREE MEASUREMENTS TO GET THERE. Arabic sets a taller
     line box than the Latin ratios these numbers were chosen for, and «ثبّت»
     carries a shadda on top of that: at 1.25 the box was 6px around a 17px word,
     at 1.5 it was still 2px short. Anything short of the glyph box is a letter
     with its head cut off, and `overflow:hidden` above means nobody sees it
     spill — it just silently goes missing. */
  body.otcs .bcword > .bcwlock{min-height:34px;padding:4px 6px;line-height:24px}
  /* the word the player is building, for the same reason */
  body.otcs .bcword .bcwrd{min-height:0}
  body.otcs .bcword .bcwrd .bcww{line-height:1.7}
  /* ⚠️ AND THE FRAME COSTS NOTHING HERE. Measured against the unskinned page at
     915x412: the rack, the well and the name added 31px to a 104px card and that
     was enough to push the word plate into scrolling, which it did NOT do
     before. A landscape phone is the one screen where the frame has to be almost
     nothing — so it keeps its lit edges and gives up its padding and its name. */
  body.otcs .otw-slot{padding:2px 5px 3px}
  body.otcs .otw-slot .gw-wrap{padding:3px 3px 2px}
  body.otcs .otw-slot .otcs-wname{display:none}
}

/* ⚠️ HIS MOTION IS THE DESIGN, NOT DECORATION. Windows' «Animation effects»
   switch puts Chromium into `prefers-reduced-motion: reduce`, and a blanket
   `animation:none` there took the whole chassis from 34 running animations to 0
   in the lab — which is how he came to ask «where are they». Only what carries
   no meaning stands down: the entrance, the flicker, the sheen, the hairline.
   The three narratives keep running, and so does the press flare, because that
   flare IS the answer to «هل ستعمل». */
@media (prefers-reduced-motion:reduce){
  body.otcs .bcword .otcs-act{animation:none}
  body.otcs .bcword .otcs-act.otcs-hit{animation:otcs-press .34s ease-out}
  body.otcs .bcword .otcs-act .otcs-sheen{display:none}
  body.otcs .bcword .otcs-act .otcs-hum{animation:none;opacity:.72}
}
