/*
 * ════════════════════════════════════════════════════════════════════
 *  KinetiTone — Stylesheet
 *  Neumorphic dark-panel design system built on CSS custom properties.
 *
 *  SECTION INDEX
 *  ─────────────────────────────────────────────────────────────────
 *   §1   Design Tokens & CSS Variables ............  :root
 *   §2   Base Reset & Global Styles ................  *, html, body
 *   §3   720p Fixed Screen Mode ....................  body.mode-720
 *   §4   App Layout Grid ..........................  #app
 *   §5   Top Bar ..................................  #topbar, .logo, .nbtn
 *   §6   Neumorphic Button System .................  .nbtn variants
 *   §7   Range Slider (nslider) ...................  .nslider
 *   §8   Collapsible Panels .......................  .panel, .panel-b
 *   §9   Layout Regions ..........................  #sidebar-l/r, #main
 *  §10   Tab System ..............................  .tabs, .tab-body
 *  §11   Visualizer Grid .........................  .viz-grid, .viz-box
 *  §12   Rotary Knob Component ...................  .knob-*
 *  §13   Select / Dropdown (nsel) ................  .nsel, option
 *  §14   Layer Mixer Rows ........................  .layer-row, .l-btn
 *  §15   Effects Rack ............................  .fx-row, .fx-sw
 *  §16   Instrument Selector .....................  .instr-tabs, .instr-btn
 *  §17   Bottom Bar & History Strip ..............  #bottombar, .hist-*
 *  §18   Piano Section ..........................  #piano-section, .piano-oct-ctrl
 *  §19   Custom Select Dropdowns .................  .pkr-dd-*, .csel-*
 *  §20   Piano Keys (88-key layout) ..............  .piano-88, .pk-w88, .pk-b88
 *  §21   Synth Key Highlight Animations ...........  .pk-synth-hl, @keyframes pk-*
 *  §22   Export Dialog ..........................  .export-backdrop, .export-dialog
 *  §23   Misc UI Controls ........................  .toggle3, .inline-ed, .filter-cv
 *  §24   Batch Panel ............................  .batch-grid, .batch-item
 *  §25   Settings Modal .........................  .settings-backdrop, .settings-modal
 *  §26   Hotkeys Pane ...........................  .hk-row, .hk-badge
 *  §27   Form Controls ..........................  .ncheck, number input, toggles
 *  §28   Welcome & Splash Animations .............  #welcome, @keyframes ktDot/Ring
 *  §29   Responsive — Mobile Breakpoints .........  @media (max-width: 900px)
 * ════════════════════════════════════════════════════════════════════
 */

/* ╔══════════════════════════════════════════════════════════════════
 * § 1  Design Tokens & CSS Variables
 *  All --custom-properties live here. Edit here to retheme the entire UI.
 * ╚══════════════════════════════════════════════════════════════════ */
:root{
  --base:#292D34;--base-light:#2F3339;--base-dark:#22252B;
  --accent:#FE7648;--green:#7BC678;
  --mint:#DDEEDD;--mint-dim:rgba(221,238,221,0.45);--mint-faint:rgba(221,238,221,0.15);--mint-ghost:rgba(221,238,221,0.07);
  --shadow-dark:#1C1F24;--shadow-light:#363B43;
  --neu-raised:5px 5px 10px var(--shadow-dark),-5px -5px 10px var(--shadow-light);
  --neu-raised-sm:3px 3px 6px var(--shadow-dark),-3px -3px 6px var(--shadow-light);
  --neu-inset:inset 3px 3px 6px var(--shadow-dark),inset -3px -3px 6px var(--shadow-light);
  --neu-inset-sm:inset 2px 2px 4px var(--shadow-dark),inset -2px -2px 4px var(--shadow-light);
  --radius:14px;--radius-sm:10px;--radius-xs:6px;
  --font:'Nunito',sans-serif;--mono:'IBM Plex Mono',monospace;
  --transition:150ms ease;--knob-size:54px;--glow-accent:rgba(254,118,72,0.35);
}
*{margin:0;padding:0;box-sizing:border-box;}

/* ╔══════════════════════════════════════════════════════════════════
 * § 2  Base Reset & Global Styles
 * ╚══════════════════════════════════════════════════════════════════ */
html{width:100%;height:100%;overflow:hidden;}
body{position:fixed;inset:0;overflow:hidden;background:var(--base);color:var(--mint);font-family:var(--font);font-size:12px;line-height:1.5;-webkit-font-smoothing:antialiased;-webkit-user-select:none;user-select:none;}
input,textarea,select,.inline-ed{-webkit-user-select:text;user-select:text;}
:root.theme-smooth,:root.theme-smooth *{transition:background-color .3s ease,color .3s ease,border-color .3s ease,box-shadow .3s ease,fill .3s ease,stroke .3s ease;}
::-webkit-scrollbar{width:5px;height:5px;}
::-webkit-scrollbar-track{background:transparent;}
::-webkit-scrollbar-thumb{background:var(--shadow-light);border-radius:3px;}
::selection{background:var(--accent);color:var(--base);}
button,select,input{font-family:inherit;outline:none;}
button,.nbtn,.btn-gear,.panel-collapse,.tab,.instr-btn,.l-btn,.fx-sw{touch-action:manipulation;}
/* ── KinetiTone Icon System (.kti) ────────────────────────────────
   Inline SVG icons: scale with font-size, inherit color, pixel-crisp.
   All icons are filled-path style to match the existing gear icon.   */
svg.kti{display:inline-block;width:1em;height:1em;vertical-align:-0.13em;flex-shrink:0;pointer-events:none;overflow:visible;}
.hc-fav-btn svg.kti{width:1.15em;height:1.15em;vertical-align:-0.18em;}
.exp-play-btn svg.kti,.exp-dl-btn svg.kti{width:.9em;height:.9em;vertical-align:-0.1em;margin-right:1px;}
.settings-close svg.kti{width:.85em;height:.85em;vertical-align:-0.08em;}
#tooltip svg.kti{width:.9em;height:.9em;vertical-align:-0.12em;margin-right:2px;}
.hk-conflict-toast svg.kti{width:.9em;height:.9em;vertical-align:-0.12em;margin-right:2px;}
#audio-unlock-banner svg.kti{width:1em;height:1em;vertical-align:-0.12em;margin-right:4px;}
.rrp-play-btn svg.kti,.rec-btn-inner svg.kti{width:.9em;height:.9em;vertical-align:-0.1em;margin-right:1px;}
.export-dialog-head svg.kti{width:1em;height:1em;vertical-align:-0.13em;margin-right:5px;}
.rotate-icon svg.kti{width:2.5em;height:2.5em;vertical-align:middle;}
input[type="range"],.nslider{touch-action:pan-x;}
#topbar,#piano-wrap,.hist-strip{-webkit-overflow-scrolling:touch;}
canvas{display:block;}

/* ╔══════════════════════════════════════════════════════════════════
 * § 3  720p Fixed Screen Mode
 *  Activated via body.mode-720 — locks canvas to 1280×720px.
 * ╚══════════════════════════════════════════════════════════════════ */
body.mode-720{display:flex;align-items:center;justify-content:center;background:#111;}
body.mode-720 #app{position:relative;inset:auto;width:1280px;height:720px;overflow:hidden;flex-shrink:0;padding:8px;border-radius:var(--radius);box-shadow:0 8px 40px rgba(0,0,0,0.6);grid-template-rows:52px 1fr 230px;}
body.mode-720 #topbar{border-radius:var(--radius);}
body.mode-720 #bottombar{border-radius:var(--radius);}
body.mode-720 #sidebar-l{padding:0;}
body.mode-720 #sidebar-r{padding:0;}

/* ╔══════════════════════════════════════════════════════════════════
 * § 4  App Layout Grid
 *  #app uses CSS Grid: [topbar] [sidebar-l | main | sidebar-r] [bottombar]
 * ╚══════════════════════════════════════════════════════════════════ */
#app{display:grid;grid-template-rows:52px 1fr 230px;grid-template-columns:256px 1fr 240px;position:fixed;inset:0;padding:0;gap:8px;background:var(--base);overflow:hidden;}

/* ── Top Bar (#topbar) ──────────────────────────────────────── */
#topbar{grid-column:1/-1;background:var(--base);box-shadow:var(--neu-raised);border-radius:0 0 var(--radius) var(--radius);display:flex;align-items:center;padding:0 14px;gap:6px;}
.logo{font-family:var(--mono);font-weight:700;font-size:14px;color:var(--accent);letter-spacing:1.5px;display:flex;align-items:center;gap:7px;white-space:nowrap;user-select:none;}
.logo-hex{width:26px;height:26px;background:var(--base);box-shadow:var(--neu-raised-sm);border-radius:8px;display:flex;align-items:center;justify-content:center;color:var(--accent);font-size:14px;font-weight:800;}
.divider{width:1px;height:26px;background:var(--mint-ghost);margin:0 4px;flex-shrink:0;}

/* ╔══════════════════════════════════════════════════════════════════
 * § 6  Neumorphic Button System
 *  .nbtn is the base for all interactive buttons. Variants: .primary .green .sm
 * ╚══════════════════════════════════════════════════════════════════ */
.nbtn{display:inline-flex;align-items:center;gap:4px;padding:6px 12px;background:var(--base);box-shadow:var(--neu-raised-sm);border:none;border-radius:var(--radius-xs);color:var(--mint-dim);font-size:11px;font-weight:600;cursor:pointer;transition:all var(--transition);white-space:nowrap;letter-spacing:0.3px;}
.nbtn:hover{color:var(--mint);}
.nbtn:active,.nbtn.pressed{box-shadow:var(--neu-inset-sm);color:var(--accent);}
.nbtn.primary{color:var(--accent);}
.nbtn.green{color:var(--green);}
.nbtn.sm{padding:3px 8px;font-size:10px;}
.nbtn kbd{font-family:var(--mono);font-size:8px;padding:1px 3px;background:var(--mint-ghost);border-radius:3px;color:var(--mint-dim);}
.spacer{flex:1;}
.seed-group{display:flex;align-items:center;gap:3px;padding:3px 5px 3px 10px;background:var(--base);box-shadow:var(--neu-inset-sm);border-radius:var(--radius-xs);}

/* ── Seed group / Volume wrap / Recording wrap ──────────────── */
.seed-group label{color:var(--mint-dim);font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:0.8px;}
.seed-group input{background:transparent;border:none;color:var(--accent);font-family:var(--mono);font-size:11px;font-weight:600;width:84px;text-align:center;}
#seed-mod-dot{width:5px;height:5px;border-radius:50%;background:var(--accent);flex-shrink:0;align-self:center;display:none;box-shadow:0 0 5px var(--glow-accent);animation:sdpulse 2s ease-in-out infinite;}
@keyframes sdpulse{0%,100%{opacity:.5}50%{opacity:1}}
.vol-wrap{display:flex;align-items:center;gap:5px;}
.vol-wrap label{color:var(--mint-dim);font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:0.5px;}
.rec-wrap{display:flex;align-items:center;gap:4px;flex-shrink:0;}
.rec-dur{width:48px;padding:3px 18px 3px 6px;font-size:10px;font-family:var(--mono);}
.rec-btn{min-width:62px;justify-content:center;}
.rec-btn.rec-on{color:#ff9a9a;box-shadow:var(--neu-inset-sm),0 0 0 1px rgba(255,122,122,0.35);animation:recPulse 1s ease-in-out infinite;}
@keyframes recPulse{0%,100%{opacity:1;}50%{opacity:.62;}}
#rec-flash{position:fixed;inset:0;background:#00ff88;opacity:0;pointer-events:none;z-index:9999;}
@keyframes recFlash{0%{opacity:0;}20%{opacity:.15;}100%{opacity:0;}}
#rec-timer{position:fixed;left:50%;top:56px;transform:translateX(-50%);background:var(--base-dark);box-shadow:var(--neu-raised-sm);color:#ff9a9a;padding:4px 12px;border-radius:var(--radius-xs);font-size:12px;font-weight:700;z-index:1000;pointer-events:none;letter-spacing:0.5px;display:none;}
#rec-review-backdrop{position:fixed;inset:0;background:rgba(20,23,28,0.82);backdrop-filter:blur(12px);z-index:900;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity 0.22s ease;pointer-events:none;}
#rec-review-backdrop.open{opacity:1;pointer-events:auto;}
#rec-review-dialog{background:var(--base);box-shadow:var(--neu-raised),0 20px 60px rgba(0,0,0,0.5);border-radius:var(--radius);width:340px;display:flex;flex-direction:column;overflow:hidden;transform:scale(0.94) translateY(12px);transition:transform 0.22s ease;}
#rec-review-backdrop.open #rec-review-dialog{transform:scale(1) translateY(0);}
.rrp-play-btn.playing{color:var(--accent) !important;box-shadow:var(--neu-inset-sm) !important;}

/* ╔══════════════════════════════════════════════════════════════════
 * § 7  Range Slider (.nslider)
 *  Custom-styled <input type=range>. Thumb uses neumorphic raised shadow.
 * ╚══════════════════════════════════════════════════════════════════ */
.nslider{-webkit-appearance:none;height:6px;background:var(--base);box-shadow:var(--neu-inset-sm);border-radius:3px;outline:none;width:68px;}
.nslider::-webkit-slider-thumb{-webkit-appearance:none;width:15px;height:15px;border-radius:50%;background:var(--base);box-shadow:var(--neu-raised-sm);cursor:pointer;border:2px solid var(--accent);transition:transform var(--transition);}
.nslider::-webkit-slider-thumb:hover{transform:scale(1.1);}
.preset-group{display:flex;gap:3px;align-items:center;}

/* ── Preset slot buttons ────────────────────────────────────── */
.preset-slot{width:22px;height:22px;background:var(--base);box-shadow:var(--neu-raised-sm);border:none;border-radius:4px;color:var(--mint-dim);font-size:9px;font-weight:700;cursor:pointer;transition:all var(--transition);display:flex;align-items:center;justify-content:center;font-family:var(--mono);}
.preset-slot:hover{color:var(--mint);}
.preset-slot.has-data{color:var(--accent);}
.preset-slot:active{box-shadow:var(--neu-inset-sm);}
/* Empty slots look like skeleton placeholders so users see they're fill-able */
.preset-slot:not(.has-data){background:transparent;box-shadow:inset 0 0 0 1px var(--mint-ghost);color:var(--mint-faint);}
.preset-slot:not(.has-data):hover{box-shadow:inset 0 0 0 1px var(--mint-dim);color:var(--mint-dim);}

/* ── Gear icon button (.btn-gear) ───────────────────────────── */
.btn-gear{width:30px;height:30px;background:var(--base);box-shadow:var(--neu-raised-sm);border:none;border-radius:var(--radius-xs);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--transition);}
.btn-gear:hover{box-shadow:var(--neu-raised);}
.btn-gear:active{box-shadow:var(--neu-inset-sm);}
.btn-gear svg{width:15px;height:15px;fill:var(--mint-dim);transition:fill var(--transition);}
.btn-gear:hover svg{fill:var(--accent);}

/* ╔══════════════════════════════════════════════════════════════════
 * § 8  Collapsible Panels
 *  .panel-b animates via max-height. Toggled by togglePanel(id).
 * ╚══════════════════════════════════════════════════════════════════ */
.panel{background:var(--base);box-shadow:var(--neu-raised);border-radius:var(--radius);margin-bottom:6px;overflow:hidden;}
.panel-h{display:flex;align-items:center;justify-content:space-between;padding:7px 11px;}
.panel-h h3{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:1px;color:var(--mint-dim);}
.panel-h-right{display:flex;align-items:center;gap:5px;}
.panel-h .count{font-family:var(--mono);font-size:9px;font-weight:600;padding:1px 6px;background:var(--base);box-shadow:var(--neu-inset-sm);border-radius:8px;color:var(--accent);}
.panel-collapse{width:18px;height:18px;background:transparent;border:none;cursor:pointer;color:var(--mint-dim);font-size:10px;display:flex;align-items:center;justify-content:center;transition:all var(--transition);border-radius:3px;}
.panel-collapse:hover{color:var(--accent);}
.panel-b{padding:3px 10px 8px;overflow:hidden;transition:max-height 0.3s ease,padding 0.3s ease;max-height:800px;}
/* Per-panel padding tweaks (replaces former inline styles so the collapse
   rule below can reliably override them — inline styles beat any selector). */
.panel-b-tight-b{padding-bottom:4px;}
.panel-b-tight-t{padding-top:4px;}
/* Collapse: zero out max-height AND all vertical padding. Listing every
   panel-b variant keeps specificity high enough and behaviour identical
   for Engine/Instruments and Layers/Pitch alike — no stray sliver. */
.panel.collapsed .panel-b,
.panel.collapsed .panel-b-tight-b,
.panel.collapsed .panel-b-tight-t{max-height:0;padding-top:0;padding-bottom:0;}
.panel-collapse-icon{display:inline-block;transition:transform 0.25s ease;}
.panel.collapsed .panel-collapse-icon{transform:rotate(-90deg);}

/* ╔══════════════════════════════════════════════════════════════════
 * § 9  Layout Regions
 *  Three columns of the main grid. Sidebar scrolls independently.
 * ╚══════════════════════════════════════════════════════════════════ */
#sidebar-l{overflow-y:auto;display:flex;flex-direction:column;background:var(--base);padding:0 0 0 8px;}
#sidebar-r{overflow-y:auto;display:flex;flex-direction:column;background:var(--base);padding:0 8px 0 0;}
#main{background:var(--base);box-shadow:var(--neu-raised);border-radius:var(--radius);display:flex;flex-direction:column;overflow:hidden;}

/* ╔══════════════════════════════════════════════════════════════════
 * § 10  Tab System
 *  .tab + .tab-body pairs. Active state toggled by switchTab().
 * ╚══════════════════════════════════════════════════════════════════ */
.tabs{display:flex;gap:0;padding:5px 8px 0;}
.tab{padding:7px 13px;cursor:pointer;color:var(--mint-dim);font-size:11px;font-weight:600;border-radius:var(--radius-xs) var(--radius-xs) 0 0;transition:all var(--transition);letter-spacing:0.3px;background:transparent;border:none;}
.tab:hover{color:var(--mint);}
.tab.active{color:var(--accent);background:var(--base-dark);box-shadow:var(--neu-inset-sm);border-radius:var(--radius-xs);}
.tab-body{display:none;padding:12px 14px;overflow-y:auto;flex:1;background:var(--base-dark);border-radius:0 0 var(--radius-sm) var(--radius-sm);margin:0 4px 4px;box-shadow:var(--neu-inset-sm);}
.tab-body.active{display:block;}
/* ── Two-column tab split: left = primary, right = secondary (no scroll) ── */
.tab-body.tab-2col{display:none;padding:0;overflow:hidden;flex:1;background:var(--base-dark);border-radius:0 0 var(--radius-sm) var(--radius-sm);margin:0 4px 4px;box-shadow:var(--neu-inset-sm);}
.tab-body.tab-2col.active{display:flex;flex-direction:row;align-items:stretch;}
/* M3 fix: overflow-y:auto instead of hidden so knobs scroll if they overflow */
.tab-2col-left{flex:1 1 0;min-width:0;padding:12px 10px 12px 14px;overflow-y:auto;overflow-x:hidden;display:flex;flex-direction:column;gap:0;border-right:1px solid var(--mint-ghost);}
/* N2 fix: wider right column so 5 filter-env knobs fit */
.tab-2col-right{flex:0 0 48%;max-width:240px;padding:12px 14px 12px 12px;display:flex;flex-direction:column;justify-content:center;gap:0;overflow-y:auto;overflow-x:hidden;}

/* ═══════════════════════════════════════════════════════════════
   CHORD BUILDER — professional redesign
   Available: ~387px tall × ~750px wide (1280px viewport)
   3 columns: Left(210px) | Center(flex) | Right(190px)
   No overflow anywhere — designed to fit precisely.
   ═══════════════════════════════════════════════════════════════ */
#tab-chord{padding:0!important;overflow:hidden!important;}
#tab-chord.active{
  display:grid;
  grid-template-columns:230px 1fr 190px;
  grid-template-rows:1fr;
  height:100%;overflow:hidden;
}

.cb-col{display:flex;flex-direction:column;gap:6px;overflow:hidden;padding:8px;}
.cb-col-left  {border-right:1px solid rgba(255,255,255,0.05);}
.cb-col-center{padding:8px 10px;}
.cb-col-right {border-left:1px solid rgba(255,255,255,0.05);}

.cb-section{
  background:var(--base);box-shadow:var(--neu-raised-sm);
  border-radius:var(--radius-sm);padding:9px 11px;
  display:flex;flex-direction:column;gap:7px;flex-shrink:0;
}
.cb-section.grow{flex:1;min-height:0;}

.cb-sec-label{
  font-size:9px;font-weight:800;text-transform:uppercase;
  letter-spacing:0.9px;display:flex;align-items:center;
  gap:5px;color:var(--mint-dim);flex-shrink:0;
}
.cb-sec-label::before{
  content:'';width:3px;height:9px;border-radius:1.5px;
  flex-shrink:0;background:var(--cb-col,var(--accent));
}
.cb-sec-accent {--cb-col:var(--accent);}
.cb-sec-green  {--cb-col:var(--green);}
.cb-sec-blue   {--cb-col:rgba(86,207,225,0.9);}
.cb-sec-purple {--cb-col:var(--purple);}

/* Root + Type: two inner columns inside one section */
.cb-rt-wrap{display:grid;grid-template-columns:1fr 1fr;gap:8px;align-items:start;}
.cb-rt-col{display:flex;flex-direction:column;gap:5px;}
.cb-rt-label{
  font-size:8px;font-weight:800;text-transform:uppercase;
  letter-spacing:0.6px;padding-left:1px;
}

.cb-root-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:3px;}
.cb-root-btn{
  padding:6px 1px;background:var(--base-dark);box-shadow:var(--neu-raised-sm);
  border:none;border-radius:var(--radius-xs);
  color:var(--mint-dim);font-family:var(--mono);font-size:9px;font-weight:700;
  cursor:pointer;transition:all 90ms;text-align:center;
}
.cb-root-btn:hover{color:var(--mint);}
.cb-root-btn.active{
  box-shadow:var(--neu-inset-sm);color:var(--accent);
  text-shadow:0 0 8px var(--glow-accent);
}

.cb-type-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:3px;}
.cb-type-btn{
  padding:6px 2px;background:var(--base-dark);box-shadow:var(--neu-raised-sm);
  border:none;border-radius:var(--radius-xs);
  color:var(--mint-dim);font-family:var(--mono);font-size:9px;font-weight:700;
  cursor:pointer;transition:all 90ms;text-align:center;
}
.cb-type-btn:hover{color:var(--mint);}
.cb-type-btn.active{box-shadow:var(--neu-inset-sm);color:var(--green);}

.cb-oct-row{display:flex;align-items:center;gap:4px;margin-top:1px;}
.cb-oct-row .nbtn{padding:4px 8px;font-size:10px;min-width:24px;justify-content:center;}
.cb-oct-row .cb-dim{min-width:0;font-size:8px;}
#cb-oct-display{
  font-family:var(--mono);font-size:11px;font-weight:800;
  color:var(--accent);min-width:18px;text-align:center;
}

.cb-opt-strip{display:flex;gap:4px;}
.cb-opt-btn{
  flex:1;padding:6px 3px;background:var(--base-dark);box-shadow:var(--neu-raised-sm);
  border:none;border-radius:var(--radius-xs);
  color:var(--mint-dim);font-family:var(--mono);font-size:9px;font-weight:700;
  cursor:pointer;transition:all 90ms;text-align:center;white-space:nowrap;
}
.cb-opt-btn:hover{color:var(--mint);}
.cb-opt-btn.active{box-shadow:var(--neu-inset-sm);color:rgba(86,207,225,0.9);}
.cb-opt-btn:disabled{opacity:.35;cursor:not-allowed;box-shadow:var(--neu-raised-sm);color:var(--mint-dim);}
.cb-opt-btn:disabled:hover{color:var(--mint-dim);}

#cb-voice-list{display:flex;flex-direction:column;gap:5px;}
.cb-voice-row{
  display:grid;grid-template-columns:18px 54px 1fr 1fr 24px;
  align-items:center;gap:7px;
  background:var(--base-dark);border-radius:var(--radius-sm);
  padding:7px 10px;position:relative;overflow:hidden;flex-shrink:0;
}
.cb-voice-row::before{
  content:'';position:absolute;left:0;top:0;bottom:0;
  width:3px;background:var(--vc,var(--accent));
  border-radius:3px 0 0 3px;
}
.cb-voice-row.muted{opacity:.35;}
.cb-vnum{font-family:var(--mono);font-size:10px;font-weight:700;color:var(--mint-dim);text-align:center;}
.cb-vnote{font-family:var(--mono);font-size:11px;font-weight:800;color:var(--mint);line-height:1.2;}
.cb-vint{font-family:var(--mono);font-size:8.5px;color:var(--mint-dim);}
.cb-vsl{display:flex;flex-direction:column;gap:3px;}
.cb-vsl-row{display:flex;align-items:center;gap:4px;}
.cb-vsl-lbl{font-family:var(--mono);font-size:7.5px;color:var(--mint-dim);width:20px;flex-shrink:0;letter-spacing:0.2px;}
.cb-vmute{
  width:24px;height:24px;background:var(--base);box-shadow:var(--neu-raised-sm);
  border:none;border-radius:5px;color:var(--mint-dim);font-size:8.5px;font-weight:800;
  cursor:pointer;transition:all 80ms;
  display:flex;align-items:center;justify-content:center;
  font-family:var(--mono);flex-shrink:0;
}
.cb-vmute.on{box-shadow:var(--neu-inset-sm);color:var(--accent);}

.cb-sep{height:1px;background:rgba(255,255,255,0.05);flex-shrink:0;}
.cb-global-rows{display:flex;flex-direction:column;gap:6px;}
.cb-sl-row{display:flex;align-items:center;gap:7px;}
.cb-dim{color:var(--mint-dim);font-size:8.5px;font-weight:700;font-family:var(--mono);letter-spacing:0.2px;white-space:nowrap;min-width:42px;}
.cb-val{color:var(--mint-dim);font-size:8.5px;font-weight:700;font-family:var(--mono);min-width:30px;text-align:right;white-space:nowrap;}

.cb-chord-badge{
  font-family:var(--mono);font-size:16px;font-weight:800;
  color:var(--accent);text-align:center;letter-spacing:0.5px;
  padding:2px 0 4px;flex-shrink:0;
}
#cb-diagram{display:block;margin:0 auto;flex-shrink:0;}
.cb-play-row{display:flex;gap:5px;flex-shrink:0;}
.cb-play-row .nbtn{flex:1;justify-content:center;padding:8px 6px;font-size:11px;font-weight:700;}
.cb-stagger-row{display:flex;align-items:center;gap:6px;flex-shrink:0;}
.cb-info{font-family:var(--mono);font-size:8px;color:var(--mint-faint);text-align:center;flex-shrink:0;}

/* Voice Mixer / Global slider reset — small, right-aligned, neumorphic */
.cb-mixer-reset-row{display:flex;justify-content:flex-end;margin-top:7px;flex-shrink:0;}
.cb-mixer-reset{
  font-family:var(--mono);font-size:8.5px;font-weight:700;letter-spacing:0.4px;
  text-transform:uppercase;color:var(--mint-dim);
  background:var(--base);box-shadow:var(--neu-raised-sm);
  border:none;border-radius:var(--radius-xs);padding:5px 12px;
  cursor:pointer;transition:all 90ms;
}
.cb-mixer-reset:hover{color:var(--mint);box-shadow:var(--neu-raised);}
.cb-mixer-reset:active{box-shadow:var(--neu-inset-sm);color:var(--accent);}

/* ╔══════════════════════════════════════════════════════════════════
 * § 11  Visualizer Grid
 *  2×2 grid of canvas boxes: Scope | Spectrum | Spectrogram | Level
 * ╚══════════════════════════════════════════════════════════════════ */
.viz-grid{display:grid;grid-template-columns:1fr 1fr;gap:4px;padding:5px;flex-shrink:0;}
.viz-box{background:var(--base-dark);border-radius:var(--radius-sm);box-shadow:var(--neu-inset-sm);position:relative;overflow:hidden;height:78px;}
.viz-box canvas{width:100%;height:100%;}
.viz-tag{position:absolute;top:4px;left:7px;font-family:var(--mono);font-size:8px;font-weight:600;color:var(--mint-dim);letter-spacing:0.8px;text-transform:uppercase;pointer-events:none;z-index:2;}

/* ╔══════════════════════════════════════════════════════════════════
 * § 12  Rotary Knob Component
 *  SVG-based knob. Arc drawn via arc() helper. Drag = ns-resize.
 * ╚══════════════════════════════════════════════════════════════════ */
.knob-group{display:inline-flex;flex-direction:column;align-items:center;margin:3px 4px;}
.knob-lbl{font-size:9px;font-weight:600;color:var(--mint-dim);margin-bottom:2px;text-align:center;max-width:56px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-transform:uppercase;letter-spacing:0.3px;}
.knob-body{width:var(--knob-size);height:var(--knob-size);position:relative;cursor:ns-resize;background:var(--base);border-radius:50%;box-shadow:var(--neu-raised-sm);display:flex;align-items:center;justify-content:center;}
.knob-body svg{width:42px;height:42px;}
.knob-val{font-family:var(--mono);font-size:9px;font-weight:500;color:var(--mint-dim);text-align:center;margin-top:2px;min-height:12px;}
.knob-arc-bg{fill:none;stroke:var(--base-dark);stroke-width:5;stroke-linecap:round;}
.knob-arc{fill:none;stroke:var(--accent);stroke-width:5;stroke-linecap:round;}
.knob-dot{fill:var(--accent);}
.knob-center{fill:var(--base);}

/* ╔══════════════════════════════════════════════════════════════════
 * § 13  Select / Dropdown (.nsel)
 *  Styled <select> with custom SVG arrow. Cross-browser -webkit-appearance reset.
 * ╚══════════════════════════════════════════════════════════════════ */
.nsel{background:var(--base);box-shadow:var(--neu-inset-sm);color:var(--mint);border:none;padding:5px 10px;border-radius:var(--radius-xs);font-family:var(--font);font-size:11px;font-weight:600;cursor:pointer;outline:none;-webkit-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23DDEEDD' opacity='0.4'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;padding-right:24px;}
.nsel option{background:var(--base);color:var(--mint);}

/* ╔══════════════════════════════════════════════════════════════════
 * § 14  Layer Mixer Rows
 *  .layer-row holds mute/solo buttons + layer name. Active = inset shadow.
 * ╚══════════════════════════════════════════════════════════════════ */
.layer-row{display:flex;align-items:center;gap:5px;padding:6px 9px;margin-bottom:4px;background:var(--base);box-shadow:var(--neu-raised-sm);border-radius:var(--radius-sm);cursor:pointer;transition:all var(--transition);}
.layer-row:hover{box-shadow:var(--neu-raised);}
.layer-row.active{box-shadow:var(--neu-inset-sm);}
.layer-row.active .l-num{color:var(--accent);}
.l-num{font-family:var(--mono);font-weight:700;font-size:12px;color:var(--mint-dim);width:13px;}
.l-name{font-size:11px;font-weight:600;flex:1;color:var(--mint-dim);text-transform:capitalize;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.l-btn{width:20px;height:20px;background:var(--base);box-shadow:2px 2px 4px var(--shadow-dark),-2px -2px 4px var(--shadow-light);border:none;border-radius:4px;color:var(--mint-dim);font-size:8px;font-weight:800;cursor:pointer;transition:all var(--transition);display:flex;align-items:center;justify-content:center;}
.l-btn:active{box-shadow:var(--neu-inset-sm);}
.l-btn.muted{color:var(--accent);box-shadow:var(--neu-inset-sm);}
.l-btn.soloed{color:var(--green);box-shadow:var(--neu-inset-sm);}

/* ╔══════════════════════════════════════════════════════════════════
 * § 15  Effects Rack
 *  .fx-sw is a CSS-only toggle switch. .fx-row.on lights the name green.
 * ╚══════════════════════════════════════════════════════════════════ */
.fx-row{display:flex;align-items:center;gap:7px;padding:6px 9px;margin-bottom:3px;background:var(--base);box-shadow:var(--neu-raised-sm);border-radius:var(--radius-sm);cursor:pointer;transition:all var(--transition);}
.fx-row:hover{box-shadow:var(--neu-raised);}
.fx-row.on{box-shadow:var(--neu-inset-sm);}
.fx-row.on .fx-name{color:var(--green);}
.fx-sw{width:28px;height:15px;background:var(--base);box-shadow:var(--neu-inset-sm);border:none;border-radius:8px;position:relative;cursor:pointer;flex-shrink:0;}
.fx-sw::after{content:'';position:absolute;width:11px;height:11px;border-radius:50%;background:var(--mint-dim);top:2px;left:2px;transition:all var(--transition);box-shadow:1px 1px 2px var(--shadow-dark);}
.fx-sw.on::after{left:15px;background:var(--green);}
.fx-name{font-size:11px;font-weight:600;flex:1;color:var(--mint-dim);}
/* "Edit" cue — appears on row hover so users discover the row opens params */
.fx-edit-cue{width:13px;height:13px;color:var(--mint-faint);opacity:0;transition:opacity var(--transition),color var(--transition);flex-shrink:0;display:flex;align-items:center;justify-content:center;}
.fx-edit-cue svg{width:100%;height:100%;}
.fx-row:hover .fx-edit-cue{opacity:.85;color:var(--accent);}
.fx-row.editing .fx-edit-cue{opacity:1;color:var(--accent);}

/* ╔══════════════════════════════════════════════════════════════════
 * § 16  Instrument Selector
 *  Tab group + 3-column grid of .instr-btn. Active = glow accent shadow.
 * ╚══════════════════════════════════════════════════════════════════ */
.instr-tabs{display:flex;gap:3px;margin-bottom:7px;}
.instr-tab{flex:1;padding:5px 4px;background:var(--base);box-shadow:var(--neu-raised-sm);border:none;border-radius:var(--radius-xs);color:var(--mint-dim);font-size:9px;font-weight:700;cursor:pointer;text-transform:uppercase;letter-spacing:0.5px;transition:all var(--transition);font-family:var(--font);}
.instr-tab:hover{color:var(--mint);}
.instr-tab.active{box-shadow:var(--neu-inset-sm);color:var(--accent);}
.instr-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:3px;}
/* ── Engine tab split: engine-params (left) | engine-waveviewer (right) ─ */
/* M2 fix: eng-tab-split uses min-height so operators 3-4 center properly */
.eng-tab-split{display:flex;flex-direction:row;align-items:stretch;gap:0;width:100%;min-height:100%;}
.eng-left{flex:1 1 0;min-width:0;overflow-y:auto;overflow-x:hidden;padding:0;}
/* eng-right: flex column, content centered; min-height:inherit gives it real height to center in */
.eng-right{flex:0 0 46%;max-width:240px;border-left:1px solid var(--mint-ghost);display:flex;flex-direction:column;justify-content:center;padding:8px 8px 8px 10px;overflow-y:auto;overflow-x:hidden;min-height:inherit;}
.eng-right:empty{display:none;}
/* Make the engine tab-body itself a flex column so height:100% resolves for children */
#tab-engine.active{display:flex;flex-direction:column;padding:0;overflow:hidden;}
/* ── Engine grid (2×3 tile picker) ───────────────────────────── */
.eng-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:4px;padding:1px 0 4px;}
.eng-tile{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:5px 2px 4px;background:var(--base);box-shadow:var(--neu-raised-sm);border:none;border-radius:var(--radius-sm);color:var(--mint-dim);font-family:var(--font);font-size:8px;font-weight:700;letter-spacing:0.3px;cursor:pointer;transition:all 120ms ease;user-select:none;}
.eng-tile:hover{color:var(--mint);box-shadow:var(--neu-raised);}
.eng-tile.active-eng{box-shadow:var(--neu-inset-sm),0 0 10px var(--glow-accent);color:var(--accent);}
.eng-tile svg{width:15px;height:15px;flex-shrink:0;opacity:.75;transition:opacity 120ms ease;}
.eng-tile.active-eng svg{opacity:1;}
.eng-tile-lbl{font-size:7.5px;letter-spacing:0.3px;text-transform:uppercase;}
/* ── Instrument panel — engine-linked tile grid ───────────────────
   instr-grid:  instrument tiles 3-col
   instr-tile:  individual tile — text only, no emoji               */
.instr-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:3px;}
.instr-tile{display:flex;align-items:center;justify-content:center;padding:5px 3px;background:var(--base);box-shadow:var(--neu-raised-sm);border:none;border-radius:var(--radius-sm);color:var(--mint-dim);font-family:var(--font);font-size:8px;font-weight:700;letter-spacing:0.2px;cursor:pointer;transition:all 120ms ease;text-align:center;user-select:none;min-height:26px;}
.instr-tile:hover{color:var(--mint);box-shadow:var(--neu-raised);}
.instr-tile.active-instr{box-shadow:var(--neu-inset-sm),0 0 8px var(--glow-accent);color:var(--accent);}
.instr-tile-lbl{font-size:7.5px;text-transform:uppercase;letter-spacing:0.3px;}
/* legacy compat */
.instr-btn{padding:5px 3px;background:var(--base);box-shadow:var(--neu-raised-sm);border:none;border-radius:var(--radius-xs);color:var(--mint-dim);font-size:9px;font-weight:600;cursor:pointer;transition:all var(--transition);text-align:center;letter-spacing:0.2px;}
.instr-btn:hover{color:var(--mint);}
.instr-btn.active-instr{box-shadow:var(--neu-inset-sm),0 0 8px var(--glow-accent),0 0 14px var(--glow-accent);color:var(--accent);}
.instr-tabs{display:flex;gap:3px;margin-bottom:7px;}
.instr-tab{flex:1;padding:5px 4px;background:var(--base);box-shadow:var(--neu-raised-sm);border:none;border-radius:var(--radius-xs);color:var(--mint-dim);font-size:9px;font-weight:700;cursor:pointer;text-transform:uppercase;letter-spacing:0.5px;transition:all var(--transition);font-family:var(--font);}
.instr-tab:hover{color:var(--mint);}
.instr-tab.active{box-shadow:var(--neu-inset-sm);color:var(--accent);}
.instr-btn{padding:5px 3px;background:var(--base);box-shadow:var(--neu-raised-sm);border:none;border-radius:var(--radius-xs);color:var(--mint-dim);font-size:9px;font-weight:600;cursor:pointer;transition:all var(--transition);text-align:center;letter-spacing:0.2px;}
.instr-btn:hover{color:var(--mint);}
.instr-btn:active{box-shadow:var(--neu-inset-sm);color:var(--accent);}
.instr-btn.active-instr{box-shadow:var(--neu-inset-sm),0 0 8px var(--glow-accent),0 0 14px var(--glow-accent);color:var(--accent);}

/* ── Section title (.sec-title) — accent bar + uppercase label ─ */
.sec-title{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:0.8px;color:var(--mint-dim);padding:7px 0 5px;display:flex;align-items:center;gap:7px;}
.sec-title::before{content:'';width:3px;height:11px;background:var(--accent);border-radius:2px;flex-shrink:0;}
.sec-title.green::before{background:var(--green);}

/* ── ADSR canvas container (.adsr-cv) ───────────────────────── */
.adsr-cv{width:100%;height:108px;background:var(--base);box-shadow:var(--neu-inset-sm);border-radius:var(--radius-sm);cursor:crosshair;}
.p-row{display:flex;flex-wrap:wrap;align-items:flex-start;gap:2px;}
.flex-r{display:flex;align-items:center;gap:7px;}
.mt-6{margin-top:6px;}.mt-10{margin-top:10px;}.mb-6{margin-bottom:6px;}.mb-10{margin-bottom:10px;}.w-full{width:100%;}

/* ╔══════════════════════════════════════════════════════════════════
 * § 17  Bottom Bar & History Strip
 *  #bottombar is a grid row. .hist-card has waveform canvas + metadata.
 * ╚══════════════════════════════════════════════════════════════════ */
#bottombar{grid-column:1/-1;background:var(--base);box-shadow:var(--neu-raised);border-radius:var(--radius) var(--radius) 0 0;display:flex;flex-direction:column;overflow:hidden;}
#hist-section{display:flex;flex-direction:column;overflow:hidden;flex:1;min-height:0;}
.hist-head{display:flex;align-items:center;gap:8px;padding:5px 12px;flex-shrink:0;}
.hist-head h3{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:1px;color:var(--mint-dim);}
.hist-strip{display:flex;gap:5px;padding:3px 8px 7px;overflow-x:auto;flex:1;}
.hist-card{min-width:138px;max-width:138px;background:var(--base);box-shadow:var(--neu-raised-sm);border-radius:var(--radius-sm);cursor:pointer;display:flex;flex-direction:column;padding:6px 8px;transition:all var(--transition);flex-shrink:0;}
.hist-card:hover{box-shadow:var(--neu-raised);}
.hist-card.active{box-shadow:var(--neu-inset-sm);}
.hist-card.active .hc-name{color:var(--accent);}
.hc-wave{width:100%;height:52px;background:var(--base-dark);border-radius:6px;box-shadow:var(--neu-inset-sm);margin-bottom:5px;overflow:hidden;}
.hc-wave canvas{width:100%;height:100%;}
.hc-name{font-size:11px;font-weight:700;color:var(--mint-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.4;}
.hc-seed{font-family:var(--mono);font-size:12px;color:var(--mint-faint);line-height:1.3;letter-spacing:0.3px;}
.hc-meta{display:flex;align-items:center;justify-content:space-between;margin-top:2px;}
.hc-tag{font-size:9px;font-weight:600;color:var(--green);text-transform:uppercase;letter-spacing:0.3px;}
.hc-fav-btn{background:none;border:none;cursor:pointer;color:var(--mint-faint);font-size:11px;padding:0;line-height:1;transition:color var(--transition);}
.hc-fav-btn:hover{color:var(--accent);}
.hist-card.fav .hc-fav-btn{color:var(--accent);}

/* ╔══════════════════════════════════════════════════════════════════
 * § 18  Piano Section
 *  Horizontal scrollable piano. Oct controls on left, playback options on right.
 * ╚══════════════════════════════════════════════════════════════════ */
#piano-section{display:flex;align-items:center;justify-content:center;gap:8px;padding:4px 10px;background:var(--base-dark);flex-shrink:0;height:88px;border-top:1px solid var(--mint-ghost);}
.piano-oct-ctrl{display:flex;flex-direction:column;align-items:center;gap:3px;flex-shrink:0;}
.piano-oct-lbl{font-family:var(--mono);font-size:13px;font-weight:700;color:var(--mint-dim);text-align:center;letter-spacing:0.5px;}
.piano-oct-ctrl .nbtn.sm{position:relative;}
.piano-oct-ctrl .nbtn.sm .oct-hotkey-hint{position:absolute;left:calc(100% + 6px);top:50%;transform:translateY(-50%);background:var(--base-dark);color:var(--mint-faint);font-family:var(--mono);font-size:8px;font-weight:700;letter-spacing:.3px;padding:2px 5px;border-radius:3px;white-space:nowrap;pointer-events:none;opacity:0;transition:opacity .15s;box-shadow:var(--neu-raised-sm);}
.piano-oct-ctrl:hover .nbtn.sm .oct-hotkey-hint{opacity:1;}
#piano-wrap{overflow-x:auto;flex:1;display:flex;align-items:flex-end;justify-content:center;height:80px;scrollbar-width:thin;scrollbar-color:var(--shadow-light) transparent;}
#piano-right-ctrl{display:flex;flex-direction:column;justify-content:center;gap:8px;flex-shrink:0;padding-left:4px;}
.pkr-row{display:flex;align-items:center;gap:8px;}
/* Labels — slightly brighter */
.pkr-lbl{font-family:var(--mono);font-size:9px;font-weight:700;text-transform:uppercase;color:var(--mint-dim);letter-spacing:.5px;white-space:nowrap;width:38px;}
/* Keys pill toggle */
.pkr-keys-toggle{display:flex;background:var(--base-dark);box-shadow:var(--neu-inset-sm);border-radius:var(--radius-sm);padding:2px;gap:2px;}
.pkr-keys-opt{padding:4px 10px;background:transparent;border:none;border-radius:var(--radius-xs);color:var(--mint-dim);font-size:9px;font-weight:700;cursor:pointer;text-align:center;transition:all var(--transition);font-family:var(--mono);text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;}
.pkr-keys-opt.active{background:var(--base);box-shadow:var(--neu-raised-sm);color:var(--accent);}
.pkr-keys-opt:hover:not(.active){color:var(--mint);}
/* Custom layout dropdown */
.pkr-dd-wrap{position:relative;}
.pkr-dd-btn{display:flex;align-items:center;gap:6px;padding:4px 10px;background:var(--base);box-shadow:var(--neu-raised-sm);border:none;border-radius:var(--radius-xs);color:var(--mint-dim);font-family:var(--mono);font-size:9px;font-weight:700;letter-spacing:.4px;cursor:pointer;white-space:nowrap;transition:all var(--transition);outline:none;}
.pkr-dd-btn:hover{color:var(--mint);}
.pkr-dd-btn.open{box-shadow:var(--neu-inset-sm);color:var(--accent);}
.pkr-dd-btn svg{flex-shrink:0;opacity:.45;transition:transform var(--transition);}
.pkr-dd-btn.open svg{transform:rotate(180deg);opacity:.7;}
.pkr-dd-panel{position:fixed;background:var(--base);box-shadow:var(--neu-raised),0 8px 24px rgba(0,0,0,0.35);border-radius:var(--radius-sm);padding:3px;display:flex;flex-direction:column;gap:2px;min-width:130px;z-index:9999;opacity:0;pointer-events:none;transform:translateY(6px) scale(0.97);transform-origin:bottom right;transition:opacity .15s ease,transform .15s ease;}
.pkr-dd-panel.open{opacity:1;pointer-events:auto;transform:translateY(0) scale(1);}
.pkr-dd-opt{padding:6px 10px;background:transparent;border:none;border-radius:var(--radius-xs);color:var(--mint-dim);font-family:var(--mono);font-size:9px;font-weight:700;letter-spacing:.35px;cursor:pointer;text-align:left;width:100%;transition:all var(--transition);white-space:nowrap;}
.pkr-dd-opt:hover{background:var(--base-light);color:var(--mint);}
.pkr-dd-opt.active{color:var(--accent);background:var(--base-dark);box-shadow:var(--neu-inset-sm);}

/* ── Custom Select Dropdowns (.pkr-dd-*, .csel-*) ───────────── */
/* ── Custom Select Dropdowns ─────────────────────────────────── */
.csel-wrap{position:relative;display:inline-flex;vertical-align:middle;}
.csel-wrap select{position:absolute;opacity:0;pointer-events:none;width:0;height:0;overflow:hidden;}
.csel-btn{display:inline-flex;align-items:center;gap:5px;padding:5px 8px 5px 10px;background:var(--base);box-shadow:var(--neu-inset-sm);border:none;border-radius:var(--radius-xs);color:var(--mint);font-family:var(--font);font-size:11px;font-weight:600;cursor:pointer;white-space:nowrap;transition:all var(--transition);outline:none;}
.csel-btn:hover{box-shadow:var(--neu-raised-sm);color:var(--mint);}
.csel-btn.open{color:var(--accent);}
.csel-btn .csel-arrow{flex-shrink:0;opacity:.4;transition:transform var(--transition);}
.csel-btn.open .csel-arrow{transform:rotate(180deg);opacity:.7;}
.csel-panel{position:fixed;background:var(--base);box-shadow:var(--neu-raised),0 8px 28px rgba(0,0,0,0.4);border-radius:var(--radius-sm);padding:3px;display:flex;flex-direction:column;gap:1px;min-width:110px;z-index:9998;opacity:0;pointer-events:none;transform:translateY(-4px) scale(0.97);transform-origin:top left;transition:opacity .14s ease,transform .14s ease;}
.csel-panel.open{opacity:1;pointer-events:auto;transform:translateY(0) scale(1);}
.csel-opt{padding:6px 12px;background:transparent;border:none;border-radius:var(--radius-xs);color:var(--mint-dim);font-family:var(--font);font-size:11px;font-weight:600;cursor:pointer;text-align:left;width:100%;transition:all var(--transition);white-space:nowrap;}
.csel-opt:hover{background:var(--base-light);color:var(--mint);}
.csel-opt.active{color:var(--accent);background:var(--base-dark);box-shadow:var(--neu-inset-sm);}
.csel-btn.csel-sm{font-size:10px;padding:4px 6px 4px 8px;}

/* ╔══════════════════════════════════════════════════════════════════
 * § 20  Piano Keys — 88-Key Layout
 *  .pk-w88 = white keys (gradient),  .pk-b88 = black keys. Pressed = accent fill.
 * ╚══════════════════════════════════════════════════════════════════ */
.piano-88{position:relative;height:76px;flex-shrink:0;}
.pk-w88{position:absolute;background:linear-gradient(180deg,#ccdacc 0%,#e8f2e8 60%,#f0f8f0 100%);border-radius:0 0 4px 4px;cursor:pointer;z-index:1;transition:background 60ms;box-shadow:1px 0 0 rgba(0,0,0,0.15),inset 0 -3px 6px rgba(0,0,0,0.08);}
.pk-w88:hover{background:linear-gradient(180deg,#b8ccb8 0%,#d4e6d4 100%);}
.pk-w88.pressed{background:linear-gradient(180deg,var(--accent) 0%,rgba(254,118,72,0.65) 100%) !important;}
.pk-b88{position:absolute;background:linear-gradient(180deg,#1a1d22 0%,#2d3139 70%,#3a3e46 100%);border-radius:0 0 3px 3px;cursor:pointer;z-index:2;transition:background 60ms;box-shadow:0 4px 8px rgba(0,0,0,0.6),inset 0 -2px 4px rgba(255,255,255,0.04);}
.pk-b88:hover{background:linear-gradient(180deg,#2a2e36 0%,#3d4149 100%);}
.pk-b88.pressed{background:linear-gradient(180deg,var(--accent) 0%,rgba(254,118,72,0.8) 100%) !important;}

/* ── Synth-triggered key highlight ──────────────────────────────────────────
   Identical look to .pressed but using --green (#7BC678 = rgb(123,198,120))
   instead of --accent. Holds for the note duration, then fades back to the
   key's native resting colour.
   ─────────────────────────────────────────────────────────────────────────── */
@keyframes pk-hl-w{
  0%  {background:linear-gradient(180deg,var(--green) 0%,rgba(123,198,120,.65) 100%);}
  75% {background:linear-gradient(180deg,var(--green) 0%,rgba(123,198,120,.65) 100%);}
  100%{background:linear-gradient(180deg,#ccdacc 0%,#e8f2e8 60%,#f0f8f0 100%);}
}
@keyframes pk-hl-b{
  0%  {background:linear-gradient(180deg,var(--green) 0%,rgba(123,198,120,.8) 100%);}
  75% {background:linear-gradient(180deg,var(--green) 0%,rgba(123,198,120,.8) 100%);}
  100%{background:linear-gradient(180deg,#1a1d22 0%,#2d3139 70%,#3a3e46 100%);}
}
@keyframes pk-chip-life{
  0%  {opacity:0;transform:translateX(-50%) translateY(4px);}
  8%  {opacity:1;transform:translateX(-50%) translateY(0);}
  72% {opacity:1;transform:translateX(-50%) translateY(0);}
  100%{opacity:0;transform:translateX(-50%) translateY(-3px);}
}
.pk-w88.pk-synth-hl{
  animation:pk-hl-w var(--hl-dur,0.9s) ease-in-out forwards;
}
.pk-b88.pk-synth-hl{
  animation:pk-hl-b var(--hl-dur,0.9s) ease-in-out forwards;
  z-index:3;
}
/* Note-name chip on synth-highlighted key — same visual style as .pk-kbd-hint */
.pk-note-chip{
  position:absolute;
  bottom:5px;left:50%;transform:translateX(-50%);
  display:inline-flex;align-items:center;justify-content:center;
  font-family:var(--mono);font-size:7px;font-weight:800;letter-spacing:.3px;
  color:rgba(0,0,0,0.6);
  background:rgba(255,255,255,0.76);
  border-radius:2px;padding:1px 3px;
  min-width:10px;
  pointer-events:none;line-height:1;
  white-space:nowrap;
  z-index:4;
  user-select:none;
  animation:pk-chip-life var(--hl-dur,0.9s) ease-in-out forwards;
}
.pk-b88 .pk-note-chip{
  bottom:4px;font-size:6px;padding:1px 2px;letter-spacing:0;
  color:#fff;
  background:rgba(30,30,36,0.82);
  border:1px solid rgba(255,255,255,0.22);
  border-radius:2px;
}
.pk-w88.pressed .pk-note-chip,
.pk-b88.pressed .pk-note-chip{display:none;}
/* ─────────────────────────────────────────────────────────────────────────── */
.pk-w88,.pk-b88{touch-action:none;}
/* ── Octave label (C3, C4 …) — top-left corner, clear of black keys ── */
.pk-oct-lbl{
  position:absolute;
  top:3px;left:2px;
  font-size:7px;font-family:var(--mono);font-weight:700;
  color:rgba(0,0,0,0.35);
  pointer-events:none;
  user-select:none;
  white-space:nowrap;
  z-index:3;
  line-height:1;
  transition:opacity .15s;
}
/* Bottom-position variant: mirrors kbd-hint placement, centered on key */
#piano-wrap.oct-lbl-bottom .pk-oct-lbl{
  top:auto;
  bottom:5px;
  left:50%;
  transform:translateX(-50%);
}
/* Suppressed when a kbd-hint chip occupies the same slot (bottom mode only) */
.pk-oct-lbl.conflict-hidden{
  opacity:0;
  pointer-events:none;
}
/* ── Keyboard-layout key hints — sits at the BOTTOM of each key ── */
.pk-kbd-hint{
  position:absolute;
  bottom:5px;left:50%;transform:translateX(-50%);
  display:inline-flex;align-items:center;justify-content:center;
  font-family:var(--mono);font-size:7px;font-weight:800;letter-spacing:.3px;
  color:rgba(0,0,0,0.6);
  background:rgba(255,255,255,0.76);
  border-radius:2px;padding:1px 3px;
  min-width:10px;
  pointer-events:none;line-height:1;
  white-space:nowrap;
  z-index:4;
  transition:opacity .15s;
  user-select:none;
}
/* Black keys — high-contrast chip against the dark key surface */
.pk-b88 .pk-kbd-hint{
  bottom:4px;
  font-size:6px;
  color:#fff;
  background:rgba(30,30,36,0.82);
  border:1px solid rgba(255,255,255,0.22);
  border-radius:2px;
  padding:1px 2px;
  letter-spacing:0;
}
.pk-w88.pressed .pk-kbd-hint,
.pk-b88.pressed .pk-kbd-hint,
.pk-w88.pressed .pk-oct-lbl{opacity:0;}

/* ╔══════════════════════════════════════════════════════════════════
 * § 22  Export Dialog
 *  Fullscreen backdrop + centered dialog. WAV / loop / batch export options.
 * ╚══════════════════════════════════════════════════════════════════ */
.export-backdrop{position:fixed;inset:0;background:rgba(20,23,28,0.82);backdrop-filter:blur(12px);z-index:900;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity 0.22s ease;pointer-events:none;}
.export-backdrop.open{opacity:1;pointer-events:auto;}
.export-dialog{background:var(--base);box-shadow:var(--neu-raised),0 20px 60px rgba(0,0,0,0.5);border-radius:var(--radius);width:500px;display:flex;flex-direction:column;overflow:hidden;transform:scale(0.94) translateY(12px);transition:transform 0.22s ease;}
.export-backdrop.open .export-dialog{transform:scale(1) translateY(0);}
.export-dialog-head{display:flex;align-items:center;padding:14px 18px;border-bottom:1px solid var(--mint-ghost);}
.export-dialog-head h3{font-size:13px;font-weight:700;color:var(--mint);flex:1;}
.export-dialog-body{padding:16px 18px;display:flex;flex-direction:column;gap:14px;}
.export-opts{display:grid;grid-template-columns:1fr 1fr;gap:12px;}
.export-opt{background:var(--base-dark);box-shadow:var(--neu-inset-sm);border-radius:var(--radius-sm);padding:14px;display:flex;flex-direction:column;gap:10px;}
.export-opt-title{font-size:11px;font-weight:700;color:var(--mint-dim);text-transform:uppercase;letter-spacing:0.8px;}
.export-opt-desc{font-size:9px;color:var(--mint-faint);line-height:1.5;}
.export-opt-btns{display:flex;gap:6px;}
.exp-play-btn{flex:1;padding:7px 10px;background:var(--base);box-shadow:var(--neu-raised-sm);border:none;border-radius:var(--radius-xs);color:var(--green);font-size:10px;font-weight:700;cursor:pointer;transition:all var(--transition);font-family:var(--font);}
.exp-play-btn:hover{box-shadow:var(--neu-raised);}
.exp-play-btn:active{box-shadow:var(--neu-inset-sm);}
.exp-dl-btn{flex:1;padding:7px 10px;background:var(--base);box-shadow:var(--neu-raised-sm);border:none;border-radius:var(--radius-xs);color:var(--accent);font-size:10px;font-weight:700;cursor:pointer;transition:all var(--transition);font-family:var(--font);}
.exp-dl-btn:hover{box-shadow:var(--neu-raised);}
.exp-dl-btn:active{box-shadow:var(--neu-inset-sm);}
.exp-dl-btn.loading,.nbtn.loading{opacity:.6;pointer-events:none;box-shadow:var(--neu-inset-sm)!important;cursor:wait;}
@keyframes expSpin{to{transform:rotate(360deg)}}
.exp-dl-btn.loading::before,.nbtn.loading::before{content:'';display:inline-block;width:8px;height:8px;border:1.5px solid currentColor;border-top-color:transparent;border-radius:50%;animation:expSpin .7s linear infinite;margin-right:5px;vertical-align:middle;}
.export-dialog-foot{padding:0 18px 16px;display:flex;justify-content:center;}

/* ── Toggle button group (.toggle3) ─────────────────────────── */
.toggle3{display:flex;background:var(--base-dark);box-shadow:var(--neu-inset-sm);border-radius:var(--radius-sm);padding:2px;gap:2px;}
.toggle3-opt{flex:1;padding:5px 6px;background:transparent;border:none;border-radius:var(--radius-xs);color:var(--mint-dim);font-size:9px;font-weight:700;cursor:pointer;text-align:center;transition:all var(--transition);font-family:var(--font);text-transform:uppercase;letter-spacing:0.4px;white-space:nowrap;}
.toggle3-opt.active{background:var(--base);box-shadow:var(--neu-raised-sm);color:var(--accent);}
.toggle3-opt:hover:not(.active){color:var(--mint);}

/* ── Inline editable field (.inline-ed) and Filter canvas (.filter-cv) ─ */
.inline-ed{background:var(--base-dark);box-shadow:var(--neu-inset-sm);border:none;color:var(--accent);font-family:var(--mono);font-size:10px;font-weight:600;width:44px;text-align:center;border-radius:4px;padding:2px;}
.filter-cv{width:100%;height:62px;background:var(--base);box-shadow:var(--neu-inset-sm);border-radius:var(--radius-sm);margin-bottom:7px;}

/* ╔══════════════════════════════════════════════════════════════════
 * § 24  Batch Panel
 *  Grid of .batch-item tiles showing seed + waveform preview.
 * ╚══════════════════════════════════════════════════════════════════ */
.batch-grid{display:flex;flex-wrap:wrap;gap:5px;}
.batch-item{width:88px;height:54px;background:var(--base);box-shadow:var(--neu-raised-sm);border-radius:var(--radius-sm);cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;transition:all var(--transition);}
.batch-item:hover{box-shadow:var(--neu-raised);}
.batch-item.sel{box-shadow:var(--neu-inset-sm);}
.batch-item.sel .bi-name{color:var(--green);}
.bi-name{font-size:9px;font-weight:600;color:var(--mint-dim);}
.bi-seed{font-family:var(--mono);font-size:8px;color:var(--mint-faint);}

/* ╔══════════════════════════════════════════════════════════════════
 * § 25  Settings Modal
 *  Tabbed modal with Audio / Hotkeys / App / Display panes.
 * ╚══════════════════════════════════════════════════════════════════ */
.settings-backdrop{position:fixed;inset:0;background:rgba(20,23,28,0.72);backdrop-filter:blur(10px);z-index:800;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity 0.2s ease;pointer-events:none;}
.settings-backdrop.open{opacity:1;pointer-events:auto;}
.settings-modal{background:var(--base);box-shadow:var(--neu-raised),0 20px 60px rgba(0,0,0,0.5);border-radius:var(--radius);width:620px;max-height:80vh;display:flex;flex-direction:column;overflow:hidden;transform:scale(0.94) translateY(10px);transition:transform 0.22s ease;}
.settings-backdrop.open .settings-modal{transform:scale(1) translateY(0);}
.settings-modal-head{display:flex;align-items:center;padding:14px 18px;border-bottom:1px solid var(--mint-ghost);}
.settings-modal-head h2{font-size:13px;font-weight:700;color:var(--mint);flex:1;letter-spacing:0.5px;}
.settings-close{width:26px;height:26px;background:var(--base);box-shadow:var(--neu-raised-sm);border:none;border-radius:6px;cursor:pointer;color:var(--mint-dim);font-size:14px;display:flex;align-items:center;justify-content:center;transition:all var(--transition);}
.settings-close:hover{color:var(--accent);}
.settings-tabs{display:flex;padding:10px 16px 0;gap:0;}
.settings-tab{padding:7px 14px;cursor:pointer;color:var(--mint-dim);font-size:11px;font-weight:600;border-radius:var(--radius-xs) var(--radius-xs) 0 0;transition:all var(--transition);background:transparent;border:none;}
.settings-tab.active{color:var(--accent);background:var(--base-dark);box-shadow:var(--neu-inset-sm);}
.settings-tab:hover{color:var(--mint);}
.settings-pane{display:none;padding:14px 16px;overflow-y:auto;flex:1;background:var(--base-dark);box-shadow:var(--neu-inset-sm);margin:0 6px 8px;border-radius:var(--radius-sm);max-height:400px;}
.settings-pane.active{display:block;}
.set-row{display:flex;align-items:center;gap:10px;padding:7px 0;}
.set-row+.set-row{border-top:1px solid var(--mint-ghost);}
.set-lbl{font-size:11px;font-weight:600;color:var(--mint-dim);flex:1;}
.set-desc{font-size:9px;color:var(--mint-faint);margin-top:2px;}
.set-val{font-family:var(--mono);font-size:11px;color:var(--mint-faint);}
/* ── Hotkeys pane ── */
.hk-group-title{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:1px;color:var(--mint-faint);padding:10px 0 4px;display:flex;align-items:center;gap:6px;}
.hk-group-title::before{content:'';width:2px;height:9px;background:var(--accent);border-radius:2px;flex-shrink:0;}
.hk-row{display:flex;align-items:center;gap:10px;padding:6px 0;border-bottom:1px solid var(--mint-ghost);}
.hk-row:last-child{border-bottom:none;}
.hk-label{font-size:11px;font-weight:600;color:var(--mint-dim);flex:1;min-width:0;}
.hk-badge{font-family:var(--mono);font-size:10px;font-weight:700;padding:3px 9px;background:var(--base);box-shadow:var(--neu-raised-sm);border-radius:var(--radius-xs);color:var(--mint);white-space:nowrap;min-width:68px;text-align:center;letter-spacing:.3px;}
.hk-badge.empty{color:var(--mint-faint);font-style:italic;}
.hk-cap-btn{padding:4px 10px;background:var(--base);box-shadow:var(--neu-raised-sm);border:none;border-radius:var(--radius-xs);color:var(--mint-dim);font-family:var(--mono);font-size:9px;font-weight:700;cursor:pointer;letter-spacing:.4px;transition:all var(--transition);white-space:nowrap;}
.hk-cap-btn:hover{color:var(--mint);box-shadow:var(--neu-raised);}
.hk-cap-btn.capturing{box-shadow:var(--neu-inset-sm);color:var(--accent);animation:hkPulse 1s ease-in-out infinite;}
.hk-clear-btn{width:22px;height:22px;background:transparent;border:none;cursor:pointer;color:var(--mint-faint);font-size:12px;border-radius:3px;display:flex;align-items:center;justify-content:center;transition:color var(--transition);}
.hk-clear-btn:hover{color:var(--accent);}
@keyframes hkPulse{0%,100%{opacity:1;}50%{opacity:.5;}}
.hk-conflict-toast{display:none;margin:6px 0 2px;padding:7px 10px;background:rgba(254,118,72,0.12);border:1px solid rgba(254,118,72,0.35);border-radius:var(--radius-xs);color:var(--accent);font-size:10px;font-weight:600;line-height:1.4;}
.hk-conflict-toast.visible{display:block;}
/* ── Layout Conflict Guard ── */
.pkr-dd-opt.layout-blocked{opacity:0.4;cursor:not-allowed;position:relative;}
.pkr-dd-opt.layout-blocked:hover{color:var(--mint-dim);background:transparent;}
.pkr-dd-opt.layout-blocked::after{content:'⊘';position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:10px;color:var(--accent);opacity:0.9;}
.pkr-dd-opt.layout-blocked.active{box-shadow:none;color:var(--mint-faint);}
.hk-piano-warn{display:inline-flex;align-items:center;gap:3px;font-family:var(--mono);font-size:8px;font-weight:700;color:var(--accent);background:rgba(254,118,72,0.12);border:1px solid rgba(254,118,72,0.28);border-radius:3px;padding:1px 5px;white-space:nowrap;margin-left:2px;}
.hk-piano-warn svg{flex-shrink:0;}
.hk-guard-row{padding:10px 0 6px;border-bottom:1px solid var(--mint-ghost);}
.hk-guard-row .set-lbl{font-size:11px;font-weight:600;color:var(--mint-dim);flex:1;}
.hk-guard-row .set-desc{font-size:9px;color:var(--mint-faint);margin-top:2px;line-height:1.45;}
.layout-blocked-popover{position:fixed;z-index:10000;background:var(--base);box-shadow:var(--neu-raised),0 8px 28px rgba(0,0,0,0.45);border-radius:var(--radius-sm);padding:10px 13px;min-width:200px;max-width:280px;pointer-events:none;opacity:0;transition:opacity .15s ease;transform:translateY(4px);border-left:3px solid var(--accent);}
.layout-blocked-popover.show{opacity:1;pointer-events:auto;transform:translateY(0);}
.layout-blocked-popover-title{font-size:10px;font-weight:700;color:var(--accent);text-transform:uppercase;letter-spacing:.6px;margin-bottom:6px;display:flex;align-items:center;gap:5px;}
.layout-blocked-popover-item{font-size:10px;font-weight:600;color:var(--mint-dim);padding:2px 0;display:flex;align-items:center;gap:6px;}
.layout-blocked-popover-key{font-family:var(--mono);font-size:9px;font-weight:700;background:var(--base-dark);box-shadow:var(--neu-inset-sm);border-radius:3px;padding:1px 6px;color:var(--mint);flex-shrink:0;}
.layout-blocked-popover-footer{font-size:9px;color:var(--mint-faint);margin-top:8px;padding-top:7px;border-top:1px solid var(--mint-ghost);line-height:1.45;}
.theme-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;padding:6px 0;}
.theme-card{padding:10px 8px;background:var(--base);box-shadow:var(--neu-raised-sm);border-radius:var(--radius-sm);cursor:pointer;text-align:center;transition:all var(--transition);}
.theme-card:hover{box-shadow:var(--neu-raised);}
.theme-card.active{box-shadow:var(--neu-inset-sm);}
.theme-card.active .tc-name{color:var(--accent);}
.tc-swatches{display:flex;gap:3px;justify-content:center;margin-bottom:6px;}
.tc-swatch{width:14px;height:14px;border-radius:50%;}
.tc-name{font-size:9px;font-weight:700;color:var(--mint-dim);text-transform:uppercase;letter-spacing:0.5px;}
.lang-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;padding:6px 0;}
.lang-card{padding:9px 10px;background:var(--base);box-shadow:var(--neu-raised-sm);border-radius:var(--radius-sm);cursor:pointer;display:flex;align-items:center;gap:8px;transition:all var(--transition);}
.lang-card:hover{box-shadow:var(--neu-raised);}
.lang-card.active{box-shadow:var(--neu-inset-sm);}
.lang-card.active .lc-name{color:var(--accent);}

/* ╔══════════════════════════════════════════════════════════════════
 * § 27  Form Controls — Checkbox & Number Input
 *  .ncheck is a CSS-only toggle switch. Number input resets browser spinner.
 * ╚══════════════════════════════════════════════════════════════════ */
.lc-flag{font-size:16px;}
.lc-name{font-size:11px;font-weight:600;color:var(--mint-dim);}
.module-row{display:flex;align-items:center;gap:10px;padding:8px 0;}
.module-row+.module-row{border-top:1px solid var(--mint-ghost);}
.module-lbl-wrap{flex:1;}
.module-lbl{font-size:11px;font-weight:600;color:var(--mint-dim);}
.module-desc{font-size:9px;color:var(--mint-faint);margin-top:2px;}
input[type="checkbox"].ncheck{-webkit-appearance:none;width:30px;height:16px;background:var(--base);box-shadow:var(--neu-inset-sm);border-radius:8px;position:relative;cursor:pointer;border:none;}
input[type="checkbox"].ncheck::after{content:'';position:absolute;width:12px;height:12px;border-radius:50%;background:var(--mint-dim);top:2px;left:2px;transition:all var(--transition);}
input[type="checkbox"].ncheck:checked::after{left:16px;background:var(--green);}
/* ── Persistence toggle (larger, accent-coloured) ─────────── */
.persist-sw{-webkit-appearance:none;width:42px;height:22px;background:var(--base);box-shadow:var(--neu-inset-sm);border-radius:11px;position:relative;cursor:pointer;border:none;transition:background .25s;}
.persist-sw::after{content:'';position:absolute;width:16px;height:16px;border-radius:50%;background:var(--mint-dim);top:3px;left:3px;transition:all .25s cubic-bezier(.4,0,.2,1);box-shadow:0 1px 4px rgba(0,0,0,.35);}
.persist-sw:checked{background:rgba(99,230,140,.15);}
.persist-sw:checked::after{left:23px;background:var(--green);box-shadow:0 1px 6px rgba(99,230,140,.5);}
.persist-row{border:1px solid var(--mint-ghost);border-radius:var(--radius-sm);padding:10px 12px;margin-bottom:4px;background:rgba(0,0,0,.12);}
input[type="number"].nsel{-webkit-appearance:none;-moz-appearance:textfield;width:58px;}
#welcome{position:fixed;inset:0;background:#292D34;z-index:1000;display:flex;align-items:center;justify-content:center;opacity:1;transition:opacity .6s ease;}

/* ── Persistence toggle (larger, accent-coloured) ───────────── */
#welcome.hidden{display:none;}

/* ╔══════════════════════════════════════════════════════════════════
 * § 28  Welcome & Splash Animations
 *  @keyframes ktDot / ktRing / ktTitleIn — shown on first load.
 * ╚══════════════════════════════════════════════════════════════════ */
#welcome.fading{opacity:0;pointer-events:none;}
#rotate-overlay{position:fixed;inset:0;display:none;align-items:center;justify-content:center;z-index:1100;background:radial-gradient(circle at 50% 35%,rgba(254,118,72,0.18),rgba(27,31,37,0.96));padding:20px;}
#rotate-overlay .rotate-card{max-width:320px;background:var(--base);box-shadow:var(--neu-raised),0 18px 40px rgba(0,0,0,0.45);border-radius:var(--radius);padding:20px 18px;text-align:center;}
#rotate-overlay .rotate-icon{width:58px;height:58px;margin:0 auto 10px;border-radius:14px;display:flex;align-items:center;justify-content:center;background:var(--base-dark);box-shadow:var(--neu-inset-sm);font-size:28px;color:var(--accent);}
#rotate-overlay h2{font-size:15px;font-weight:800;letter-spacing:.4px;color:var(--mint);margin-bottom:6px;}
#rotate-overlay p{font-size:11px;line-height:1.55;color:var(--mint-dim);}
#kt-dot{position:absolute;width:10px;height:10px;border-radius:50%;background:#FE7648;transform:scale(0);opacity:0;animation:ktDot 1s cubic-bezier(.34,1.56,.64,1) .2s forwards;}
@keyframes ktDot{0%{opacity:0;transform:scale(0);box-shadow:0 0 0 0 rgba(254,118,72,0);}35%{opacity:1;transform:scale(1);box-shadow:0 0 16px 6px rgba(254,118,72,.45);}70%{opacity:1;transform:scale(2);box-shadow:0 0 26px 12px rgba(254,118,72,.18);}100%{opacity:0;transform:scale(5);box-shadow:0 0 0 0 rgba(254,118,72,0);}}
.kt-ring{position:absolute;border-radius:50%;transform:scale(0);opacity:0;}
.kt-r1{width:42px;height:42px;box-shadow:0 0 0 1.5px rgba(254,118,72,.6);animation:ktRing .7s ease-out .65s forwards;}
.kt-r2{width:78px;height:78px;box-shadow:0 0 0 1px rgba(254,118,72,.32);animation:ktRing .7s ease-out .8s forwards;}
.kt-r3{width:118px;height:118px;box-shadow:0 0 0 .8px rgba(254,118,72,.15);animation:ktRing .7s ease-out .95s forwards;}

/* ╔══════════════════════════════════════════════════════════════════
 * § 29  Responsive — Mobile Breakpoints
 *  max-width: 900px + pointer: coarse = phone/tablet. Forces landscape.
 * ╚══════════════════════════════════════════════════════════════════ */
@keyframes ktRing{0%{transform:scale(0);opacity:1;}100%{transform:scale(2.8);opacity:0;}}
#kt-title{position:absolute;font-family:'Montserrat',sans-serif;font-weight:900;font-size:clamp(44px,10vw,78px);letter-spacing:-1px;color:#FE7648;text-shadow:4px 5px 10px #1a1d23,6px 7px 16px #161820,-2px -2px 6px #3e444f,-3px -3px 10px #464d5a;opacity:0;animation:ktTitleIn .7s cubic-bezier(.22,1,.36,1) 1.3s forwards;user-select:none;}
@keyframes ktTitleIn{0%{opacity:0;transform:scale(.88) translateY(8px);}100%{opacity:1;transform:scale(1) translateY(0);}}
.ctx-menu{position:fixed;background:var(--base);box-shadow:var(--neu-raised),0 8px 24px rgba(0,0,0,0.4);border-radius:var(--radius-sm);padding:4px;z-index:500;min-width:148px;}
.ctx-item{padding:6px 11px;cursor:pointer;font-size:11px;font-weight:500;color:var(--mint-dim);border-radius:var(--radius-xs);transition:all var(--transition);}
.ctx-item:hover{background:var(--mint-ghost);color:var(--accent);}
.tooltip{position:fixed;background:var(--base-dark);box-shadow:var(--neu-raised-sm);color:var(--mint);padding:4px 9px;border-radius:var(--radius-xs);font-size:10px;font-weight:500;z-index:999;pointer-events:none;max-width:200px;}
@media (max-width:900px) and (pointer:coarse){
  #app{padding:4px;gap:6px;}
  .nbtn{padding:5px 9px;font-size:10px;}
  .nbtn.sm{padding:3px 7px;font-size:9px;}
  .nbtn kbd{display:none;}
  .seed-group input{width:68px;font-size:10px;}
  .vol-wrap label,.seed-group label{font-size:8px;}
  .tab{padding:6px 8px;font-size:10px;}
  .tab-body{padding:8px 10px;margin:0 3px 3px;}
  .panel-h{padding:7px 9px;}
  .panel-h h3{font-size:9px;letter-spacing:.8px;}
  .panel-b{padding:4px 7px 8px;}
  .hist-card{min-width:112px;max-width:112px;padding:5px 6px;}
  .hc-wave{height:42px;}
  .viz-box{height:64px;}
  #topbar .logo span{display:none;}
  #topbar .logo-hex{width:23px;height:23px;font-size:12px;}
  .settings-modal{width:min(94vw,620px);}
}
@media (max-width:900px) and (pointer:coarse) and (orientation:portrait){
  #app{position:fixed;inset:0;grid-template-columns:1fr;grid-template-rows:auto 1fr auto;height:100dvh;overflow:hidden;}
  #sidebar-l,#sidebar-r{display:none;}
  #topbar{flex-wrap:wrap;height:auto;padding:8px;justify-content:center;overflow-x:auto;}
  #bottombar{height:auto;}
  #piano-section{height:70px;padding:2px 5px;}
  body.mobile-landscape-required #rotate-overlay{display:flex;}
  body.mobile-landscape-required #app{pointer-events:none;filter:blur(2px);}
}
@media (max-width:900px) and (pointer:coarse) and (orientation:landscape){
  #app{
    position:fixed;
    inset:0;
    height:100dvh;
    padding:4px;
    gap:6px;
    grid-template-columns:minmax(176px,29vw) 1fr minmax(170px,29vw);
    grid-template-rows:46px 1fr 136px;
  }
  #sidebar-l,#sidebar-r{display:flex !important;padding:0;min-width:0;}
  #topbar{padding:0 8px;gap:4px;overflow-x:auto;overflow-y:hidden;flex-wrap:nowrap;justify-content:flex-start;}
  #topbar .divider{height:18px;margin:0 2px;}
  #main{min-width:0;}
  #bottombar{min-height:0;}
  #hist-section{min-height:0;}
  #piano-section{height:64px;padding:2px 6px;gap:6px;}
  #piano-wrap{height:58px;}
  #piano-right-ctrl{gap:5px;}
  .piano-oct-lbl{font-size:11px;}
  :root{--knob-size:44px;}
  .knob-body svg{width:36px;height:36px;}
  .viz-grid{gap:3px;padding:4px;}
}

/* ╔══════════════════════════════════════════════════════════════════
 * § 30  Onboarding Coachmark (first-run only)
 *  Compact horizontal tip pill anchored under the Random button. No
 *  arrow. Shown once, dismissed on ANY click in the app or after 9s.
 *  Hidden permanently via the 'kt-onboarded' localStorage flag.
 *  Width is fixed so text never collapses into a vertical column.
 * ╚══════════════════════════════════════════════════════════════════ */
#kt-coachmark{position:fixed;z-index:950;pointer-events:none;opacity:0;transform:translateY(-6px);transition:opacity .3s ease,transform .3s ease;display:none;}
#kt-coachmark.show{opacity:1;transform:translateY(0);}
.kt-cm-card{position:fixed;display:flex;align-items:flex-start;gap:10px;width:340px;box-sizing:border-box;background:var(--base);box-shadow:var(--neu-raised),0 10px 28px rgba(0,0,0,.4);border-radius:var(--radius);padding:12px 14px;pointer-events:auto;}
.kt-cm-card::before{content:"";position:absolute;left:0;top:10px;bottom:10px;width:3px;border-radius:3px;background:var(--accent);}
.kt-cm-badge{flex-shrink:0;width:26px;height:26px;border-radius:50%;background:var(--base);box-shadow:var(--neu-raised-sm);display:flex;align-items:center;justify-content:center;color:var(--accent);margin-top:1px;}
.kt-cm-badge svg{width:14px;height:14px;}
.kt-cm-main{flex:1;min-width:0;}
.kt-cm-title{font-size:10px;font-weight:800;color:var(--accent);text-transform:uppercase;letter-spacing:.7px;margin-bottom:3px;}
.kt-cm-body{font-size:11px;line-height:1.5;color:var(--mint);font-weight:500;}
.kt-cm-body kbd{font-family:var(--mono);font-size:9px;padding:1px 5px;background:var(--mint-ghost);border-radius:3px;color:var(--mint);font-weight:600;white-space:nowrap;}
.kt-cm-dismiss{margin-top:8px;font-size:9px;color:var(--mint-faint);font-weight:600;letter-spacing:.3px;}

/* ── One-time knob interaction hint ─────────────────────────────────────
   Shown ONCE per browser, the first time the user drags any knob.
   Lives at bottom-centre; auto-fades after 6 s. Survives resetEverything
   (lives outside kt-app key). */
#kt-knob-hint{position:fixed;bottom:18px;left:50%;transform:translateX(-50%) translateY(20px);background:var(--base);box-shadow:var(--neu-raised),0 8px 24px rgba(0,0,0,.4);border-radius:var(--radius-sm);border-left:3px solid var(--accent);padding:9px 14px 9px 13px;font-family:var(--mono);font-size:10px;font-weight:600;color:var(--mint);letter-spacing:.3px;z-index:9998;pointer-events:none;opacity:0;transition:opacity .3s ease,transform .3s ease;white-space:nowrap;}
#kt-knob-hint.show{opacity:1;transform:translateX(-50%) translateY(0);}
#kt-knob-hint kbd{font-family:var(--mono);font-size:9px;padding:1px 5px;margin:0 2px;background:var(--mint-ghost);border-radius:3px;color:var(--accent);font-weight:700;}
#kt-knob-hint .kkh-sep{color:var(--mint-faint);margin:0 5px;}
