@font-face{font-family:'Outfit';font-style:normal;font-weight:300 700;font-display:swap;src:url('/ui/assets/fonts/outfit-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Outfit';font-style:normal;font-weight:300 700;font-display:swap;src:url('/ui/assets/fonts/outfit-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Playfair Display';font-style:normal;font-weight:600 800;font-display:swap;src:url('/ui/assets/fonts/playfair-display-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Playfair Display';font-style:normal;font-weight:600 800;font-display:swap;src:url('/ui/assets/fonts/playfair-display-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
:root{--ink:#1a1714;--muted:#7a7268;--line:#e6e0d5;--paper:#f7f4ef;--brand:#ff7c02;--brand-deep:#9e4d01;--tint:#fdf0e3;--accent:#c4a882;--white:#fff;--red:#a32939}*{box-sizing:border-box}body{margin:0;background:var(--paper);color:var(--ink);font-family:'Outfit',system-ui,sans-serif;font-size:14px}button,input,textarea,select{font:inherit}button,a,input,select,textarea{-webkit-tap-highlight-color:transparent}button{cursor:pointer}button:disabled{opacity:.5;cursor:not-allowed}button:focus-visible,a:focus-visible{outline:3px solid #bf9c7d;outline-offset:3px}h1,h2,h3,p{margin:0}h1,h2,h3{font-family:'Playfair Display',Georgia,serif}h1{font-size:34px;letter-spacing:-1.2px;font-weight:800}h2{font-size:23px;letter-spacing:-.6px}h3{font-size:16px}a{color:var(--brand)}.muted{color:var(--muted)}.small{font-size:12px}.eyebrow{font-size:10px;letter-spacing:1.6px;font-weight:700;text-transform:uppercase}.shell{display:grid;grid-template-columns:232px 1fr;min-height:100vh}.sidebar{background:#fff;border-right:1px solid var(--line);padding:30px 20px;display:flex;flex-direction:column;position:fixed;width:232px;height:100vh;z-index:10}.brand{display:flex;align-items:center;gap:10px}.brand-mark{width:35px;height:35px;display:grid;place-items:center;background:var(--brand);border-radius:12px;color:var(--accent);font-size:25px;font-weight:800;transform:rotate(-5deg)}.brand-name{font-family:'Playfair Display',Georgia,serif;font-size:21px;font-weight:800;letter-spacing:-.8px}.brand-name small{display:block;font-size:9px;letter-spacing:2px;text-transform:uppercase;color:var(--muted);margin-top:1px}.workspace{margin:34px 0 28px;border:1px solid var(--line);border-radius:10px;padding:12px;display:flex;gap:10px;align-items:center}.workspace-avatar{background:var(--tint);width:30px;height:30px;border-radius:8px;display:grid;place-items:center;font-weight:bold;color:var(--brand)}.workspace strong{display:block;font-size:12px}.workspace span{font-size:10px;color:var(--muted)}.nav-label{font-size:9px;font-weight:bold;letter-spacing:1.5px;color:#908881;margin:0 12px 10px}.nav{display:grid;gap:5px}.nav button{border:0;background:transparent;text-align:left;padding:12px;border-radius:8px;display:flex;gap:12px;color:var(--muted);align-items:center;font-weight:500}.nav button.active{background:var(--tint);color:var(--brand);font-weight:700}.nav svg{width:18px;height:18px}.nav .count{margin-left:auto;background:white;border:1px solid #e0d9d2;border-radius:5px;padding:1px 6px;font-size:10px}.sidebar-bottom{margin-top:auto;padding-top:40px}.help-card{background:#f6f3f0;border-radius:12px;padding:16px;font-size:12px;line-height:1.6}.help-card p{margin:5px 0 12px;color:var(--muted)}.byline{margin-top:22px;color:var(--muted);font-size:10px;display:flex;align-items:center;gap:8px}.byline img{width:65px;height:auto}.main{grid-column:2;min-width:0}.topbar{height:76px;background:rgba(255,255,255,.65);border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:center;padding:0 40px}.breadcrumb{font-size:12px;color:var(--muted)}.breadcrumb span{padding:0 10px;color:#b7b1ab}.top-actions{display:flex;align-items:center;gap:14px}.pill{font-size:10px;border:1px solid var(--line);padding:6px 9px;border-radius:20px;background:white;display:inline-flex;gap:6px;align-items:center;white-space:nowrap}.dot{width:6px;height:6px;border-radius:50%;background:#a49a91}.dot.good{background:#8a592f}.dot.amber{background:#be8a31}.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:11px 16px;border-radius:8px;border:1px solid var(--line);background:white;color:var(--ink);font-weight:600;font-size:12px;text-decoration:none}.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}.btn.lime{background:var(--accent);border-color:var(--accent);color:#372617}.btn.subtle{background:transparent}.btn.danger{color:var(--red)}.btn svg{width:15px;height:15px}.btn:hover:not(:disabled){filter:brightness(.96)}.icon-btn{background:transparent;border:0;color:var(--muted);padding:6px}.icon-btn svg{width:19px;height:19px}.content{max-width:1360px;padding:36px 40px 55px;margin:auto}.page-heading{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:28px}.page-heading p{margin-top:8px;font-size:13px;color:var(--muted)}.hero{display:grid;grid-template-columns:1.3fr 1fr;background:#eee8e2;border:1px solid #e5dcd5;border-radius:16px;overflow:hidden;min-height:226px;position:relative}.hero-copy{padding:30px 32px;z-index:1}.hero h2{font-size:28px;max-width:420px;line-height:1.25;margin:12px 0}.hero p{font-size:12px;line-height:1.7;max-width:380px;color:#6c635c;margin-bottom:18px}.hero-art{position:relative;display:grid;place-items:center;overflow:hidden;min-height:200px;background:radial-gradient(ellipse at center,#e3d6cb 0%,transparent 65%)}.orbit{position:absolute;width:285px;height:285px;border:1px solid #d8cbc0;border-radius:50%}.orbit.two{width:195px;height:195px}.voice-orb{width:118px;height:118px;border-radius:50%;background:radial-gradient(circle at 30% 25%,#c7a88c,#73573e 54%,#3c2817 94%);box-shadow:inset -12px -14px 20px #092d3655,0 20px 30px #53734826;display:flex;align-items:center;justify-content:center;gap:4px}.wave{width:4px;border-radius:4px;background:#f0dccb;opacity:.9}.float-label{position:absolute;background:#ffffffed;padding:10px 13px;border:1px solid #e3dad2;border-radius:9px;font-size:10px;box-shadow:0 5px 14px #20361d08}.float-label.a{left:5%;top:23%}.float-label.b{right:5%;bottom:22%}.float-label strong{display:block;font-size:11px;margin-bottom:3px}.section-title{display:flex;align-items:center;justify-content:space-between;margin:30px 0 15px}.section-title span{font-size:12px;color:var(--muted)}.template-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:13px}.template{padding:19px;text-align:left;border:1px solid var(--line);background:white;border-radius:12px;transition:transform .15s,border-color .15s}.template:hover{border-color:#b5a495;transform:translateY(-2px)}.template-icon{display:grid;place-items:center;background:#f3efeb;width:34px;height:34px;border-radius:9px;margin-bottom:18px;color:var(--brand)}.template-icon svg{width:18px;height:18px}.template h3{font-size:13px;margin-bottom:8px}.template p{font-size:11px;line-height:1.7;color:var(--muted)}.template .category{font-size:9px;margin-top:17px;color:#75675a;font-weight:600}.toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.search{position:relative}.search input{background:white;border:1px solid var(--line);border-radius:8px;padding:10px 12px;width:225px;font-size:12px}.agent-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.agent-card{padding:22px;border:1px solid var(--line);background:#fff;border-radius:13px;display:flex;flex-direction:column;gap:16px;min-height:196px}.agent-top{display:flex;justify-content:space-between;align-items:center}.agent-avatar{width:36px;height:36px;background:#efe9e4;color:var(--brand);border-radius:11px;display:grid;place-items:center;font-size:17px;font-weight:700}.agent-card h3{margin-bottom:7px}.agent-card p{font-size:12px;color:var(--muted);line-height:1.6}.agent-meta{display:flex;gap:10px;color:var(--muted);font-size:10px;flex-wrap:wrap}.agent-bottom{border-top:1px solid #f0eeec;padding-top:14px;display:flex;justify-content:space-between;align-items:center;margin-top:auto}.empty{border:1px dashed #d7d0c9;border-radius:12px;grid-column:1/-1;padding:30px;text-align:center;color:var(--muted);background:#ffffff60}.empty h3{color:var(--ink);margin-bottom:8px}.empty p{font-size:12px;line-height:1.8;margin-bottom:15px}.notice{padding:12px 16px;border-radius:9px;background:#f2f1e6;border:1px solid #e5e1c9;color:#706337;font-size:12px;line-height:1.6;margin-bottom:20px}.notice.error{color:#9b2839;background:#fff1f1;border-color:#f0cdd2}.notice.success{color:var(--brand);background:var(--tint);border-color:#ded4cb}.editor-layout{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:22px;align-items:start}.panel{background:#fff;border:1px solid var(--line);border-radius:13px;overflow:hidden}.panel-title{padding:20px 24px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between}.panel-body{padding:24px}.tabs{display:flex;gap:22px;border-bottom:1px solid var(--line);padding:0 24px}.tabs button{padding:17px 0;border:0;border-bottom:2px solid transparent;background:transparent;color:var(--muted);font-size:12px}.tabs button.active{color:var(--brand);border-color:var(--brand);font-weight:bold}.field{display:block;margin-bottom:20px}.field>span{display:block;font-size:12px;font-weight:600;margin-bottom:8px}.field input,.field select,.field textarea{width:100%;border:1px solid #e2ddd8;border-radius:8px;padding:11px 12px;background:#fdfcfb;color:var(--ink);outline:0}.field textarea{line-height:1.65;resize:vertical;font-size:13px}.field input:focus,.field textarea:focus,.field select:focus{border-color:#8c6f55;box-shadow:0 0 0 3px #558c7012}.field small{display:block;font-size:10px;color:var(--muted);line-height:1.6;margin-top:6px}.two-col{display:grid;grid-template-columns:1fr 1fr;gap:18px}.checklist{list-style:none;margin:20px 0 0;padding:0;display:grid;gap:15px;font-size:12px}.checklist li{display:flex;gap:9px;align-items:center}.checklist .check{color:var(--brand);font-weight:bold}.checklist .pending{color:#aaa6a2}.test-title{background:#f2ece7;padding:22px}.test-title p{font-size:11px;color:var(--muted);line-height:1.7;margin-top:8px}.chat{padding:20px;min-height:190px;max-height:330px;overflow:auto;display:flex;flex-direction:column;gap:12px}.bubble{font-size:12px;line-height:1.7;background:#f4f1ee;padding:12px;border-radius:10px;max-width:94%;white-space:pre-wrap}.bubble.user{background:var(--brand);color:white;align-self:flex-end}.chat-form{padding:15px;border-top:1px solid var(--line);display:flex;gap:7px}.chat-form input{width:100%;min-width:0;border:1px solid var(--line);border-radius:7px;padding:10px;font-size:11px}.chat-note{padding:0 17px 14px;color:var(--muted);font-size:10px;line-height:1.7}.voice-list{display:grid;gap:9px;margin-top:15px;max-height:440px;overflow:auto}.voice-choice{display:flex;gap:12px;align-items:center;border:1px solid var(--line);padding:13px;border-radius:9px}.voice-choice.selected{border-color:var(--brand);background:#f8f4f1}.voice-choice label{flex:1;cursor:pointer;font-size:12px}.voice-choice small{display:block;color:var(--muted);margin-top:5px}.voice-choice audio{max-width:140px;height:30px}.connection-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:20px}.connection{padding:26px}.connection h3{margin:15px 0 8px}.connection p{font-size:12px;color:var(--muted);line-height:1.8}.connection code{display:block;margin-top:15px;font-size:11px;background:var(--paper);padding:10px;word-break:break-word}.footnote{font-size:11px;color:var(--muted);margin-top:24px;line-height:1.8}.loading{padding:80px;text-align:center;color:var(--muted)}#toast{position:fixed;bottom:25px;left:50%;transform:translateX(-50%);z-index:1000;background:#3e2a18;color:white;padding:14px 22px;border-radius:10px;box-shadow:0 10px 30px #0002;max-width:90vw;display:none;font-size:13px}dialog{border:1px solid var(--line);border-radius:18px;padding:32px;width:min(450px,92vw);color:var(--ink);box-shadow:0 25px 100px #0003}dialog::backdrop{background:#172d2560;backdrop-filter:blur(3px)}dialog h2{margin-bottom:10px}dialog p{line-height:1.7;margin-bottom:22px}.dialog-top{display:flex;justify-content:space-between;align-items:start}.auth-switch{font-size:12px;text-align:center;margin-top:20px}.auth-switch button{border:0;background:none;color:var(--brand);font-weight:bold}.account-email{max-width:180px;overflow:hidden;text-overflow:ellipsis;font-size:11px}.mobile-brand{display:none}.export-note{font-size:11px;color:var(--muted);line-height:1.8}pre{white-space:pre-wrap;word-break:break-word;font-size:11px;line-height:1.8;background:var(--paper);padding:15px;border-radius:8px;max-height:350px;overflow:auto}.hidden{display:none!important}@media(min-width:1500px){.content{padding-top:48px}.hero{min-height:245px}}@media(max-width:1100px){.template-grid{grid-template-columns:repeat(2,1fr)}.agent-grid{grid-template-columns:repeat(2,1fr)}.content{padding:28px}.topbar{padding:0 28px}.editor-layout{grid-template-columns:1fr}.test-panel{display:grid;grid-template-columns:1fr 1fr}.test-panel .chat-form,.test-panel .chat-note{grid-column:1/-1}.hero h2{font-size:24px}}@media(max-width:760px){.shell{display:block}.sidebar{position:static;width:100%;height:auto;padding:15px 18px;border-right:0;border-bottom:1px solid var(--line);flex-direction:row;align-items:center;justify-content:space-between}.sidebar .workspace,.sidebar .nav-label,.sidebar-bottom,.nav .count{display:none}.nav{display:flex;gap:3px}.nav button{padding:9px;font-size:11px;gap:5px}.brand-name{font-size:17px}.brand-mark{width:29px;height:29px;font-size:21px}.nav svg{width:15px}.topbar{height:60px;padding:0 18px}.breadcrumb{display:none}.top-actions{width:100%;justify-content:space-between}.content{padding:25px 18px}.page-heading{align-items:start}.page-heading h1{font-size:27px}.page-heading p{font-size:12px;line-height:1.7}.hero{grid-template-columns:1fr}.hero-art{display:none}.hero-copy{padding:25px}.template-grid,.agent-grid,.connection-grid{grid-template-columns:1fr 1fr}.section-title{gap:15px;flex-wrap:wrap}.search input{width:170px}.two-col{grid-template-columns:1fr;gap:0}.panel-body{padding:19px}.test-panel{display:block}.tabs{gap:16px;padding:0 18px}.tabs button{font-size:11px}.account-email{max-width:115px}.page-heading .toolbar{justify-content:flex-end}.voice-choice audio{max-width:110px}}@media(max-width:430px){.agent-grid,.connection-grid{grid-template-columns:1fr}.template{padding:15px}.nav button span{display:none}.page-heading .btn{padding:10px}.hero h2{font-size:25px}.top-actions{gap:5px}.pill{font-size:9px}.template h3{font-size:12px}}
/* Extended SixVM platform */
.sidebar{padding:25px 16px}.sidebar .workspace{margin:22px 0 18px;padding:10px;gap:7px}.workspace-picker{min-width:0;flex:1}.workspace-picker>span{font-size:10px}.workspace-picker select{display:block;width:100%;background:transparent;border:0;font-weight:700;color:var(--ink);padding:5px 0;font-size:12px;outline-offset:2px}.workspace .icon-btn{padding:2px}.workspace .icon-btn svg{width:14px}.sidebar .nav{display:block;overflow-y:auto;scrollbar-width:thin;flex:1}.sidebar .nav button{width:100%;padding:10px 12px;font-size:12px;gap:10px;margin:2px 0}.nav-section{margin:20px 12px 7px!important;font-size:9px}.sidebar-bottom{padding-top:12px}.sidebar-bottom .byline{margin-top:5px}.metrics-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:25px}.metric{padding:24px}.metric span{font-size:11px;color:var(--muted);display:block}.metric strong{font-size:32px;letter-spacing:-1px;display:block;margin-top:14px;font-family:'Playfair Display',Georgia,serif}.home-columns{display:grid;grid-template-columns:1.2fr 1fr;gap:22px}.architecture{display:grid;gap:8px;text-align:center;padding:28px 10px}.architecture span{background:var(--tint);padding:14px;border:1px solid #e0d8d1;border-radius:8px;color:var(--brand);font-size:12px;font-weight:600}.architecture i{color:var(--muted);font-style:normal}.table-wrap{overflow:auto}.data-table{width:100%;border-collapse:collapse;text-align:left;white-space:normal}.data-table th{background:#f2eeea;color:var(--muted);font-size:10px;font-weight:600;padding:15px 18px;white-space:nowrap}.data-table td{padding:17px 18px;border-top:1px solid var(--line);font-size:12px;line-height:1.6;max-width:360px;overflow-wrap:anywhere}.data-table td .btn{padding:7px 10px;white-space:nowrap}.detail-list{display:grid;grid-template-columns:1fr auto;gap:18px;font-size:13px;margin-top:30px}.detail-list dt{color:var(--muted)}.detail-list dd{font-weight:bold;margin:0}.bar-chart{display:flex;gap:12px;align-items:flex-end;overflow:auto;min-height:200px;padding:25px 0 10px}.chart-column{display:flex;flex-direction:column;align-items:center;gap:8px;min-width:28px}.chart-column i{background:var(--brand);width:24px;border-radius:4px 4px 0 0}.chart-column span,.chart-column small{font-size:9px;color:var(--muted)}dialog.platform-modal{width:min(680px,94vw);max-height:90vh;overflow:auto}dialog .dialog-top{gap:20px;margin-bottom:15px}dialog .dialog-top h2{font-size:23px}.checkbox-field{display:flex;gap:10px;align-items:center;font-size:12px;margin:16px 0}.checkbox-field input{accent-color:var(--brand)}.platform-modal .chat{max-height:400px}.platform-modal .table-wrap{margin-top:15px}.voice-status{background:var(--tint);border-radius:12px;padding:30px;text-align:center;color:var(--brand);margin:15px 0;font-size:16px}.voice-status .voice-orb{margin:0 auto 20px;width:85px;height:85px}.page-heading>.toolbar{flex-wrap:wrap;justify-content:flex-end}.editor-layout .test-title .btn{font-size:10px}
@media(max-width:1100px){.metrics-grid{grid-template-columns:repeat(2,1fr)}.home-columns{grid-template-columns:1fr}.page-heading{align-items:start}.page-heading>.toolbar{max-width:300px}}
@media(max-width:760px){.sidebar{display:block;padding:16px 18px;position:static}.sidebar>.brand{margin-bottom:12px}.sidebar .workspace{display:flex;position:absolute;right:18px;top:14px;margin:0;max-width:180px;padding:5px 8px}.workspace-avatar{display:none}.sidebar .nav{display:flex;overflow-x:auto;gap:5px;padding-top:4px;scrollbar-width:thin}.sidebar .nav button{width:auto;flex-shrink:0;padding:9px 10px;font-size:10px}.sidebar .nav button span{display:inline}.nav-section{display:none}.sidebar .nav svg{width:14px;height:14px}.sidebar-bottom{display:none}.metrics-grid{gap:10px}.metric{padding:18px}.metric strong{font-size:27px}.home-columns{gap:15px}.connection{padding:20px}.page-heading{flex-wrap:wrap}.page-heading>.toolbar{max-width:none;justify-content:flex-start}.data-table th,.data-table td{padding:12px}.connection-grid{grid-template-columns:1fr}.workspace-picker select{font-size:11px}.workspace-picker>span{font-size:9px}dialog.platform-modal{padding:22px}.sidebar .workspace .icon-btn svg{width:12px}.sidebar .brand-name{font-size:18px}.sidebar .brand-name small{font-size:7px;letter-spacing:1px}}
.brand-logo{display:block;width:100%;max-width:186px;height:auto}@media(max-width:760px){.brand-logo{max-width:128px}}@media(max-width:430px){.brand-logo{max-width:112px}}

/* ── Mobile fixes ─────────────────────────────────────────────────────────── */
/* A definition list of label/value pairs. The base `1fr auto` cannot shrink the
   value column below its content, so one long webhook URL or agent id pushes the
   whole page sideways. Stack them and let long tokens break. */
.detail-list dd{overflow-wrap:anywhere;min-width:0}
@media(max-width:760px){
  .detail-list{grid-template-columns:1fr;gap:9px;margin-top:22px}
  .detail-list dd{font-size:12px}
  .detail-list dt{margin-top:4px}
}

/* Touch targets. Keyed off a coarse pointer rather than width, so a small laptop
   window keeps the tighter mouse-sized controls. 44px is the accessible minimum. */
@media(pointer:coarse){
  .btn{min-height:44px}
  .icon-btn{min-width:44px;min-height:44px;display:inline-grid;place-items:center}
  .nav button{min-height:44px}
  .tabs button{min-height:44px}
  .field input,.field select,.field textarea{min-height:44px;font-size:16px}
  .chat-form input,.search input{min-height:44px;font-size:16px}
}

/* Belt-and-braces against sideways scroll, but ONLY where the sidebar is
   position:static. Applying overflow-x to html at desktop widths can break the
   position:fixed sidebar in some browsers. */
@media(max-width:760px){html,body{max-width:100%;overflow-x:hidden}}
.legal-links{margin-top:14px;display:flex;gap:14px;font-size:11px}.legal-links a{color:var(--muted);text-decoration:none}.legal-links a:hover{color:var(--brand-deep);text-decoration:underline}
/* Federated sign-in buttons */.oauth-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:4px 0 18px}.btn.oauth{padding:11px 8px;gap:7px;font-size:12px;background:#fff;border-color:var(--line)}.btn.oauth svg{flex:none}.btn.oauth:hover:not(:disabled){border-color:var(--accent);background:#fffdfa}.oauth-divider{display:flex;align-items:center;gap:12px;margin:0 0 18px;color:var(--muted);font-size:11px}.oauth-divider::before,.oauth-divider::after{content:"";flex:1;height:1px;background:var(--line)}@media(max-width:430px){.oauth-grid{grid-template-columns:1fr;gap:7px}.btn.oauth{justify-content:flex-start;padding-left:16px}}@media(pointer:coarse){.btn.oauth{min-height:46px}}

/* ═══════════════════════════════════════════════════════════════════════════
   SixVM design system — tokens lifted directly from sixvm.com.au so the studio
   and the marketing site read as one product.
   ═══════════════════════════════════════════════════════════════════════════ */
:root{
  --radius:6px; --radius-lg:12px; --radius-xl:20px;
  --shadow-sm:0 1px 8px rgba(26,23,20,.06);
  --shadow:0 4px 24px rgba(26,23,20,.09);
  --shadow-hover:0 16px 48px rgba(26,23,20,.16);
  /* Their signature easing: fast out, long settle. Used on every motion. */
  --ease:cubic-bezier(.16,1,.3,1);
  --line:rgba(139,111,71,.15);
  --pale:rgba(139,111,71,.08);
  --card:#fdfbf8;
}

/* ── Surfaces ─────────────────────────────────────────────────────────────
   The old UI was flat boxes with hard borders. Theirs is layered: soft warm
   shadow, translucent border, and a lift on hover. */
.panel,.agent-card,.template,.connection,.metric{
  background:var(--card);
  border:1px solid var(--line);
  border-radius:var(--radius-lg);
  box-shadow:var(--shadow-sm);
  transition:transform .35s var(--ease),box-shadow .35s var(--ease),border-color .35s var(--ease);
}
.agent-card:hover,.template:hover,.connection:hover{
  transform:translateY(-3px);
  box-shadow:var(--shadow-hover);
  border-color:rgba(139,111,71,.3);
}
.hero{border-radius:var(--radius-xl);border-color:var(--line)}
.empty{border-radius:var(--radius-lg)}

/* ── Buttons ──────────────────────────────────────────────────────────── */
.btn{
  border-radius:var(--radius);
  transition:transform .2s var(--ease),box-shadow .3s var(--ease),
             background .3s ease,border-color .3s ease,filter .2s ease;
}
.btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:var(--shadow-sm)}
.btn:active:not(:disabled){transform:translateY(0);transition-duration:.06s}
.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}
.btn.primary:hover:not(:disabled){
  background:var(--brand-deep);border-color:var(--brand-deep);
  box-shadow:0 6px 20px rgba(255,124,2,.32);
}
.btn.lime{background:var(--accent);border-color:var(--accent);color:#2e2a26}
.icon-btn{border-radius:var(--radius);transition:background .25s ease,color .25s ease}
.icon-btn:hover{background:var(--pale);color:var(--ink)}

/* ── Navigation ───────────────────────────────────────────────────────── */
.nav button{border-radius:var(--radius);transition:background .25s var(--ease),color .25s var(--ease)}
.nav button:hover:not(.active){background:var(--pale);color:var(--ink)}
.nav button.active{background:var(--tint);color:var(--brand-deep);font-weight:700}
.tabs button{transition:color .25s ease,border-color .25s ease}
.tabs button.active{color:var(--brand-deep);border-color:var(--brand)}

/* ── Top bar: frosted, like their sticky nav ──────────────────────────── */
.topbar{
  background:rgba(253,251,248,.78);
  backdrop-filter:saturate(180%) blur(12px);
  -webkit-backdrop-filter:saturate(180%) blur(12px);
  border-bottom:1px solid var(--line);
  position:sticky;top:0;z-index:5;
}
.pill{border-radius:50px;background:var(--card);border-color:var(--line)}

/* ── Inputs ───────────────────────────────────────────────────────────── */
.field input,.field select,.field textarea{
  border-radius:var(--radius);border-color:var(--line);background:#fff;
  transition:border-color .25s ease,box-shadow .25s ease;
}
.field input:focus,.field textarea:focus,.field select:focus{
  border-color:var(--brand);box-shadow:0 0 0 3px rgba(255,124,2,.14);
}
.search input{border-radius:var(--radius);border-color:var(--line)}

/* ── Motion ───────────────────────────────────────────────────────────── */
@keyframes mellaFadeUp{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
@keyframes mellaScaleIn{from{opacity:0;transform:translateY(8px) scale(.97)}to{opacity:1;transform:none}}
@keyframes mellaPulse{0%,100%{opacity:.55;transform:scaleY(.6)}50%{opacity:1;transform:scaleY(1)}}

.content{animation:mellaFadeUp .5s var(--ease) both}
.page-heading{animation:mellaFadeUp .55s var(--ease) both}
.agent-grid>*,.template-grid>*,.metrics-grid>*{animation:mellaFadeUp .5s var(--ease) both}
/* A short stagger reads as considered rather than mechanical. */
.agent-grid>*:nth-child(2),.template-grid>*:nth-child(2),.metrics-grid>*:nth-child(2){animation-delay:.05s}
.agent-grid>*:nth-child(3),.template-grid>*:nth-child(3),.metrics-grid>*:nth-child(3){animation-delay:.1s}
.agent-grid>*:nth-child(4),.template-grid>*:nth-child(4),.metrics-grid>*:nth-child(4){animation-delay:.15s}
.agent-grid>*:nth-child(n+5),.template-grid>*:nth-child(n+5){animation-delay:.2s}

dialog{border-radius:var(--radius-xl);border-color:var(--line);box-shadow:var(--shadow-hover)}
dialog[open]{animation:mellaScaleIn .32s var(--ease) both}
dialog::backdrop{background:rgba(26,23,20,.42);backdrop-filter:blur(4px)}

#toast{border-radius:var(--radius-lg);background:var(--ink);box-shadow:var(--shadow-hover)}

/* The orb is the brand moment - let it breathe. */
.wave{animation:mellaPulse 1.4s var(--ease) infinite}
.wave:nth-child(2){animation-delay:.15s}
.wave:nth-child(3){animation-delay:.3s}
.wave:nth-child(4){animation-delay:.45s}
.wave:nth-child(5){animation-delay:.6s}

a,.auth-switch button{transition:color .2s ease}
:focus-visible{outline:3px solid var(--brand);outline-offset:3px}

/* Honour the system setting. Motion should never be mandatory. */
@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms!important;animation-iteration-count:1!important;
    transition-duration:.01ms!important;scroll-behavior:auto!important;
  }
  .agent-card:hover,.template:hover,.connection:hover,.btn:hover:not(:disabled){transform:none}
}

/* ── Toast ────────────────────────────────────────────────────────────────
   Was a bare display:block with no motion and no distinction between a save
   and a failure. Now it arrives, and it tells you which kind it is. */
#toast{
  display:none;align-items:center;gap:11px;
  padding:13px 14px 13px 16px;max-width:min(92vw,460px);
  opacity:0;transform:translate(-50%,14px);
  transition:opacity .26s var(--ease),transform .26s var(--ease);
  border:1px solid transparent;
}
#toast.toast-in{opacity:1;transform:translate(-50%,0)}
#toast .toast-icon{display:grid;place-items:center;flex:none}
#toast .toast-text{flex:1;line-height:1.5}
#toast .toast-close{
  background:none;border:0;color:inherit;opacity:.6;font-size:19px;
  line-height:1;padding:0 2px;flex:none;transition:opacity .2s ease;
}
#toast .toast-close:hover{opacity:1}
#toast.toast-info{background:var(--ink);color:#fff}
#toast.toast-success{background:#1c5c3a;color:#fff}
#toast.toast-error{background:#8d2230;color:#fff}

/* ── Copy to clipboard ────────────────────────────────────────────────── */
code,pre{cursor:pointer;position:relative;transition:background .25s ease,border-color .25s ease}
code:hover,pre:hover{background:var(--tint)}
code.copied,pre.copied{background:#e6f3ea;border-color:#b6d9c3}
code::after{
  content:"Click to copy";position:absolute;right:8px;top:50%;transform:translateY(-50%);
  font-size:9px;letter-spacing:.4px;text-transform:uppercase;color:var(--muted);
  opacity:0;transition:opacity .2s ease;pointer-events:none;
}
code:hover::after{opacity:.75}
code.copied::after{content:"Copied";opacity:1;color:#1c5c3a}

/* ── Keyboard shortcut list ───────────────────────────────────────────── */
.shortcut-list{display:grid;grid-template-columns:auto 1fr;gap:12px 18px;margin:8px 0 0;align-items:center}
.shortcut-list dt{display:flex;gap:4px}
.shortcut-list dd{margin:0;font-size:13px;color:var(--muted)}
kbd{
  display:inline-block;min-width:24px;text-align:center;
  padding:4px 7px;font-family:inherit;font-size:11px;font-weight:600;
  background:var(--card);border:1px solid var(--line);border-bottom-width:2px;
  border-radius:5px;color:var(--ink);
}

/* ── Skeletons ────────────────────────────────────────────────────────────
   A shimmer reads as "coming" where a bare "Loading…" reads as "stuck". */
@keyframes mellaShimmer{from{background-position:-320px 0}to{background-position:320px 0}}
.skeleton{
  border-radius:var(--radius);color:transparent!important;user-select:none;
  background:linear-gradient(90deg,#efe9e1 0%,#f8f4ee 45%,#efe9e1 90%);
  background-size:320px 100%;animation:mellaShimmer 1.15s linear infinite;
}
.skeleton-row{height:13px;margin:0 0 11px}
.skeleton-row:nth-child(2){width:82%}
.skeleton-row:nth-child(3){width:64%}
.skeleton-card{height:150px;border-radius:var(--radius-lg);margin-bottom:4px}

/* Busy buttons get a spinner rather than only going flat. */
@keyframes mellaSpin{to{transform:rotate(360deg)}}
.btn:disabled[data-action="save"]::before,.btn.is-busy::before{
  content:"";width:13px;height:13px;border-radius:50%;flex:none;
  /* currentColor, not white: the same spinner has to read on a dark primary
     button and on a plain white one. Hard-coded white was invisible on half
     the buttons in the app. */
  border:2px solid currentColor;border-top-color:transparent;opacity:.75;
  animation:mellaSpin .7s linear infinite;
}
@media(prefers-reduced-motion:reduce){
  .skeleton{animation:none}
  .btn:disabled[data-action="save"]::before,.btn.is-busy::before{animation:none}
}

/* ── Mobile layout corrections ────────────────────────────────────────────
   Three faults visible on a phone, all with the same root cause: elements that
   were told to fit a narrow screen instead of being allowed to overflow into a
   scroller built for them. */

/* A table that shrinks to fit has nowhere to put its columns, so the action
   buttons stack and the phone number breaks mid-digit. Give it a floor and let
   .table-wrap scroll, which is what that wrapper was always for. */
@media(max-width:760px){
  .data-table{min-width:600px}
  .table-wrap{-webkit-overflow-scrolling:touch}
  /* A hint that there is more to the right, rather than a hidden column. */
  .table-wrap{
    background:
      linear-gradient(to right,var(--card) 30%,rgba(253,251,248,0)) left center,
      linear-gradient(to left,var(--card) 30%,rgba(253,251,248,0)) right center;
    background-size:28px 100%,28px 100%;
    background-repeat:no-repeat;
    background-attachment:local,local;
  }
}

/* `anywhere` breaks inside a word when it merely could, which turns a phone
   number into three lines. `break-word` only breaks when it must. */
.data-table td{overflow-wrap:break-word}
/* Opt-in for cells that must never be split. break-word alone is enough for the
   phone-number column once the table has a min-width, and a blanket nowrap on
   first-child would stretch a description column across the screen. */
.data-table .nowrap{white-space:nowrap}
/* Row actions belong on one line; the table scrolls if that needs room. */
.data-table td .toolbar{flex-wrap:nowrap;gap:8px;justify-content:flex-end}

/* Heading and toolbar were competing for one row. Stack them. */
@media(max-width:760px){
  .page-heading{flex-direction:column;align-items:stretch;gap:14px}
  .page-heading>.toolbar{width:100%;justify-content:flex-start;max-width:none}
  .page-heading .search,.page-heading .search input{width:100%}
  .page-heading .btn{padding:11px 14px}
}

/* "Revision 3" and the open button were crushed together in narrow cards. */
@media(max-width:430px){
  .agent-bottom{flex-wrap:wrap;gap:10px}
  .agent-bottom .btn{width:100%;justify-content:center}
}

/* ═══════════════════════════════════════════════════════════════════════════
   Buttons, corrected against sixvm.com.au.

   Their primary action is DARK (#1a1714, hovering to #2e2a26) and their accent
   button is a muted brown. The orange is a small signal — the logo arch, a
   focus ring, a link — never a large fill. Filling a button with #ff7c02 shouts
   where the brand speaks quietly.
   ═══════════════════════════════════════════════════════════════════════════ */
.btn{
  padding:11px 22px;font-size:13px;font-weight:600;letter-spacing:.1px;
  border-radius:var(--radius);
}
.btn.primary{
  background:var(--ink);border-color:var(--ink);color:#fdfbf8;
}
.btn.primary:hover:not(:disabled){
  background:#2e2a26;border-color:#2e2a26;color:#fff;
  box-shadow:0 6px 18px rgba(26,23,20,.18);
}
/* The former "lime" accent, now the brand's muted tan. */
.btn.lime{
  background:transparent;border-color:var(--ink);color:var(--ink);
}
.btn.lime:hover:not(:disabled){
  background:var(--ink);border-color:var(--ink);color:var(--paper);
  box-shadow:0 6px 18px rgba(26,23,20,.16);
}
.btn.subtle{background:transparent;border-color:transparent;color:var(--muted)}
.btn.subtle:hover:not(:disabled){background:var(--pale);color:var(--ink);box-shadow:none}
.btn.danger{color:var(--red);border-color:var(--line);background:#fff}
.btn.danger:hover:not(:disabled){background:#fff1f1;border-color:#f0cdd2;box-shadow:none}
/* Orange stays where it belongs: the thing being pointed at, not the button. */
.nav button.active{background:var(--tint);color:var(--brand-deep)}
.tabs button.active{color:var(--ink);border-color:var(--brand)}
a{color:var(--brand-deep)}

/* ── Invoice figures on a phone ───────────────────────────────────────────
   A money summary must never scroll sideways: an amount you cannot see is
   worse than no table at all. The numbers table keeps its horizontal scroll
   (its row actions genuinely need the room); this one restructures instead. */
.invoice-totals{margin:0;display:grid;gap:2px}
.invoice-totals > div{
  display:flex;align-items:baseline;justify-content:space-between;gap:20px;
  padding:11px 18px;font-size:13px;
}
.invoice-totals dt{color:var(--muted);margin:0}
.invoice-totals dd{margin:0;font-variant-numeric:tabular-nums;white-space:nowrap}
.invoice-totals .grand{
  border-top:1px solid var(--line);margin-top:4px;padding-top:15px;
  font-size:15px;
}
.invoice-totals .grand dt{color:var(--ink);font-weight:600}
.invoice-totals .grand dd{font-weight:700}
.invoice-lines td.amount{font-variant-numeric:tabular-nums;white-space:nowrap;text-align:right}
.invoice-lines th:last-child{text-align:right}

@media(max-width:700px){
  /* Undo the scroller for this table only, and stack each line as a card. */
  .invoice-lines{min-width:0;width:100%}
  .table-wrap:has(.invoice-lines){overflow:visible;background:none}
  .invoice-lines thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
  .invoice-lines tr{
    display:block;padding:15px 16px;border-top:1px solid var(--line);
  }
  .invoice-lines tr:first-child{border-top:0}
  .invoice-lines td{
    display:flex;justify-content:space-between;align-items:baseline;gap:16px;
    padding:3px 0;border:0;max-width:none;font-size:13px;
  }
  /* The label that the hidden header would otherwise have carried. */
  .invoice-lines td::before{
    content:attr(data-label);color:var(--muted);font-size:11px;
    letter-spacing:.3px;text-transform:uppercase;flex:none;
  }
  .invoice-lines td[data-label="Item"]{
    display:block;padding-bottom:8px;
  }
  .invoice-lines td[data-label="Item"]::before{display:none}
  .invoice-lines td.amount{font-weight:600;color:var(--ink)}
  .invoice-totals > div{padding:11px 16px}
}

/* ── Inline field validation ──────────────────────────────────────────────
   Browser-native bubbles do not match the design system and cannot be
   localised, so invalid state is shown in the page instead. */
.field input.invalid,.field select.invalid,.field textarea.invalid,
input.invalid,select.invalid,textarea.invalid{
  border-color:var(--red);
  box-shadow:0 0 0 3px rgba(163,41,57,.10);
}
.field-error{
  display:block;margin-top:6px;font-size:11px;line-height:1.6;
  color:#8d2230;
}

/* ── 07: placeholders must not read as saved content ──────────────────────
   The knowledge field showed three realistic lines of business detail at close
   to body-text colour, in a full-width box. It was the placeholder, and it made
   an empty field look full. */
::placeholder{color:#a8a199;opacity:1}
textarea::placeholder{color:#a8a199;opacity:1;font-style:italic}

/* ── 19: the agent builder header wrapped awkwardly, dropping Save draft
   onto its own row at common widths. */
.page-heading .toolbar{row-gap:10px}
@media(min-width:761px) and (max-width:1180px){
  .page-heading .toolbar .btn{padding:10px 14px;font-size:12px}
}

/* ── 18: a raw multi-select is unusable on touch. Give it room and a hint. */
select[multiple]{min-height:132px;padding:8px}
@media(pointer:coarse){select[multiple]{min-height:168px;font-size:16px}}

/* ── 17/09: the consent row on sign-up ─────────────────────────────────── */
.consent{
  display:flex;gap:10px;align-items:flex-start;margin:4px 0 18px;
  font-size:12px;line-height:1.6;color:var(--muted);
}
.consent input{margin-top:2px;flex:none;width:16px;height:16px;accent-color:var(--brand)}
.consent a{color:var(--brand-deep)}

/* ── The voice test orb ───────────────────────────────────────────────────
   A static circle tells a caller nothing. During the pause before a reply the
   line looks dead, which is exactly when people say "hello? are you there?".
   So the orb shows which way the conversation is flowing. */
.voice-status .voice-orb{
  position:relative;display:flex;align-items:center;justify-content:center;gap:5px;
  transition:box-shadow .4s var(--ease),transform .4s var(--ease);
}
.voice-status .voice-orb .wave{
  width:4px;height:8px;border-radius:4px;background:#f6e7d5;opacity:.5;
  transition:opacity .25s ease;
}

/* Listening: a slow breath, so it reads as attentive rather than busy. */
@keyframes orbBreathe{0%,100%{transform:scale(1)}50%{transform:scale(1.035)}}
@keyframes orbHalo{0%,100%{box-shadow:0 20px 30px rgba(83,115,72,.15),0 0 0 0 rgba(255,124,2,.22)}
                   50%{box-shadow:0 20px 30px rgba(83,115,72,.15),0 0 0 14px rgba(255,124,2,0)}}
.voice-orb.is-listening{animation:orbBreathe 2.6s var(--ease) infinite,orbHalo 2.6s ease-out infinite}
.voice-orb.is-listening .wave{opacity:.35;height:7px}

/* Speaking: the bars move with the voice. Staggered so it reads as speech
   rather than a progress bar. */
@keyframes orbSpeak{
  0%,100%{height:7px;opacity:.55}
  50%{height:var(--h,28px);opacity:1}
}
.voice-orb.is-speaking .wave{animation:orbSpeak .62s var(--ease) infinite}
.voice-orb.is-speaking .wave:nth-child(1){animation-delay:0s}
.voice-orb.is-speaking .wave:nth-child(2){animation-delay:.07s}
.voice-orb.is-speaking .wave:nth-child(3){animation-delay:.14s}
.voice-orb.is-speaking .wave:nth-child(4){animation-delay:.21s}
.voice-orb.is-speaking .wave:nth-child(5){animation-delay:.28s}
.voice-orb.is-speaking .wave:nth-child(6){animation-delay:.35s}
.voice-orb.is-speaking .wave:nth-child(7){animation-delay:.42s}
.voice-orb.is-speaking .wave:nth-child(8){animation-delay:.49s}
.voice-orb.is-speaking{box-shadow:inset -12px -14px 20px #092d3655,0 0 0 10px rgba(255,124,2,.10),0 20px 34px rgba(83,115,72,.2)}

.voice-orb.is-idle .wave{opacity:.2;height:6px;animation:none}

/* A word for what the orb is showing, for anyone who cannot see it move. */
.voice-status.is-listening #voice-state::before{content:"● ";color:#2f8a5a}
.voice-status.is-speaking #voice-state::before{content:"● ";color:var(--brand)}

@media(prefers-reduced-motion:reduce){
  .voice-orb.is-listening,.voice-orb.is-speaking .wave{animation:none}
  .voice-orb.is-speaking .wave{height:var(--h,28px);opacity:.9}
}

/* ── Mobile navigation ───────────────────────────────────────────────────
   The active screen must be obvious at a glance, and reachable without
   guessing that the strip scrolls. */
@media(max-width:760px){
  .sidebar .nav{
    scroll-behavior:auto;
    /* A fade at each end so it is visibly a scroller, not a truncated list. */
    -webkit-mask-image:linear-gradient(to right,transparent 0,#000 16px,#000 calc(100% - 16px),transparent 100%);
    mask-image:linear-gradient(to right,transparent 0,#000 16px,#000 calc(100% - 16px),transparent 100%);
    padding-inline:2px;
  }
  .sidebar .nav button.active{
    /* Stronger than the desktop tint: at a glance on a small screen the
       difference between "selected" and "next to selected" must be obvious. */
    background:var(--ink);color:var(--paper);font-weight:600;
  }
  .sidebar .nav button.active svg{color:var(--brand)}
}

/* The end of the sign-up. Deliberately not a toast: confirming an address is
   the one moment someone needs telling plainly that it worked, and a message
   that fades after four seconds is the wrong shape for that. */
.verified-mark{width:62px;height:62px;border-radius:50%;background:var(--tint);color:var(--brand);display:grid;place-items:center;margin:2px 0 20px}
.verified-mark svg{width:30px;height:30px;stroke-width:2.6}
.verified-lead{font-size:15px;line-height:1.65;margin-bottom:12px}

/* Actions offered inside a message — "sign in instead", "reset your password".
   They are buttons because they do something, but they sit mid-sentence, so
   they read as the link the sentence needs rather than a second control. */
.notice button{border:0;background:none;padding:0;font:inherit;color:inherit;text-decoration:underline;text-underline-offset:2px;font-weight:600}
.notice button:hover{opacity:.75}

/* ── Guided tour ────────────────────────────────────────────────────────────
   The dim is one element, not four: a box-shadow large enough to cover any
   screen, cast outward from a transparent rectangle. That leaves a genuine
   hole rather than something drawn over the top, so the thing being pointed
   at is the real control, at full contrast, and pointer-events:none means it
   can still be clicked through the gap. */
.tour-spot{position:fixed;z-index:1400;border-radius:10px;pointer-events:none;
  box-shadow:0 0 0 9999px rgba(26,23,20,.62);outline:2px solid var(--brand);outline-offset:0;
  transition:top .32s var(--ease),left .32s var(--ease),width .32s var(--ease),height .32s var(--ease),opacity .2s}
.tour-card{position:fixed;z-index:1401;width:min(330px,calc(100vw - 24px));background:#fff;
  border:1px solid var(--line);border-radius:14px;padding:20px;box-shadow:0 22px 60px rgba(26,23,20,.28);
  transition:top .32s var(--ease),left .32s var(--ease)}
.tour-step{font-size:10px;font-weight:700;letter-spacing:1.4px;text-transform:uppercase;color:var(--brand-deep)}
.tour-card h3{font-size:17px;margin:9px 0 8px;line-height:1.3}
.tour-card p{font-size:12.5px;line-height:1.75;color:var(--muted);margin:0}
.tour-bar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:18px}
.tour-move{display:flex;gap:8px}
.tour-card .btn{padding:9px 14px;font-size:12px}
.tour-skip{border:0;background:none;color:var(--muted);font-size:11.5px;text-decoration:underline;
  text-underline-offset:2px;padding:0}
.tour-skip:hover{color:var(--ink)}
/* the page behind must not scroll away from the thing being pointed at */
body.tour-running{overflow:hidden}
@media(max-width:760px){
  .tour-card{width:calc(100vw - 24px)}
  .tour-bar{flex-wrap:wrap}
}
@media(prefers-reduced-motion:reduce){
  .tour-spot,.tour-card{transition:none}
}

/* ── Agent setup tabs ───────────────────────────────────────────────────────
   These are the spine of the editor — six screens, and the only way between
   them — but they were set in 12px (11px on a phone) in the same grey used for
   captions, sitting on white with nothing to mark them as a control. They read
   as a caption rather than navigation.

   Rebuilt as actual tabs: the strip is tinted so it reads as a bar, and the
   selected one is a white card sitting proud of it, which is what a tab is.
   The text is larger, heavier and darker. #7a7268 was passing on white at
   4.74:1 but would have dropped to 4.32:1 against the tinted strip, so it is
   #5f574e now — 6.5:1 there, 7.1:1 on the selected tab. */
.tabs{display:flex;gap:4px;padding:7px 10px 0;margin:0;
  background:var(--paper);border-bottom:1px solid var(--line);
  overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch}
.tabs::-webkit-scrollbar{display:none}
.tabs button{position:relative;flex:0 0 auto;white-space:nowrap;
  padding:12px 15px 13px;border:0;border-bottom:0;background:transparent;
  color:#5f574e;font-size:13px;font-weight:600;letter-spacing:.005em;
  border-radius:9px 9px 0 0;
  transition:color .2s ease,background-color .2s ease}
/* the marker is drawn rather than bordered, so it can slide in from the centre
   instead of appearing all at once */
.tabs button::after{content:"";position:absolute;left:12px;right:12px;bottom:0;
  height:2.5px;border-radius:3px 3px 0 0;background:var(--brand);
  transform:scaleX(0);transition:transform .25s var(--ease)}
.tabs button:hover{color:var(--ink);background:rgba(255,124,2,.07)}
.tabs button:focus-visible{outline:3px solid #bf9c7d;outline-offset:-3px}
.tabs button.active{color:var(--ink);font-weight:700;background:var(--white);
  box-shadow:0 -1px 0 var(--line) inset,1px 0 0 var(--line) inset,-1px 0 0 var(--line) inset}
.tabs button.active::after{transform:scaleX(1)}
.tabs button.active:hover{background:var(--white)}

@media(max-width:760px){
  /* still readable on a phone, and the strip scrolls instead of shrinking */
  .tabs{gap:3px;padding:6px 8px 0}
  .tabs button{font-size:12.5px;padding:11px 12px 12px;min-height:44px}
  .tabs button::after{left:9px;right:9px}
}
@media(prefers-reduced-motion:reduce){
  .tabs button,.tabs button::after{transition:none}
}

/* A screen that is fetching its data says so, and moves while it does.
   A static line of grey text is indistinguishable from a screen that has
   finished loading and simply has nothing on it. */
.notice.working{display:flex;align-items:center;gap:10px}
.notice.working::before{content:"";width:14px;height:14px;flex:none;border-radius:50%;
  border:2px solid currentColor;border-top-color:transparent;opacity:.7;
  animation:mellaSpin .7s linear infinite}
@media(prefers-reduced-motion:reduce){ .notice.working::before{animation:none} }

/* ── Free trial allowance ───────────────────────────────────────────────────
   Shown before it runs out, not after. Someone who discovers the limit by
   being stopped mid-sentence experiences it as a fault; someone who watched it
   count down experiences it as a trial. */
.allowance{padding:20px 22px;margin-bottom:22px;border-color:#e2d6c6;background:linear-gradient(180deg,#fffdfa,#fdf6ec)}
.allowance.spent{border-color:#f0cdd2;background:linear-gradient(180deg,#fffafa,#fff1f1)}
.allowance-top{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px;margin-bottom:14px}
.allowance-top strong{font-size:14px}
.allowance-top span{font-size:12px;color:var(--muted)}
.allowance-bar{height:7px;border-radius:5px;background:#eee5da;overflow:hidden}
.allowance-bar i{display:block;height:100%;border-radius:5px;background:var(--brand);
  transition:width .5s var(--ease)}
.allowance.spent .allowance-bar i{background:var(--red)}
.allowance-legend{display:flex;flex-wrap:wrap;gap:6px 20px;margin-top:11px;font-size:12px;color:var(--muted)}
.allowance-legend b{color:var(--ink)}
@media(max-width:560px){ .allowance-top{flex-direction:column;gap:2px} }

/* ── The end of the trial ───────────────────────────────────────────────────
   A 402 used to surface as a toast, which faded in four seconds and offered
   nowhere to go. This says what happened, shows what was used, and puts the
   way forward under it. */
.upgrade .lede{font-size:15px;color:var(--ink);margin:0 0 4px}
.upgrade p{color:var(--muted);line-height:1.62;margin:12px 0 0}
.upgrade .allowance-legend{padding:13px 16px;border:1px solid var(--line);
  border-radius:12px;background:#fdf9f3;margin-top:18px}

/* ── Voice profiles ─────────────────────────────────────────────────────────
   A voice is a person the caller will hear. The row shows what they would
   notice — who it sounds like and where they sound like they are from —
   instead of an id and a provider name. */
.voice-filters{display:flex;flex-direction:column;gap:9px;margin:4px 0 16px}
.vrow{display:flex;flex-wrap:wrap;align-items:center;gap:7px}
.vlabel{font-size:11px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--muted);min-width:74px}
.vchip{border:1px solid var(--line);background:#fff;color:var(--ink);
  border-radius:999px;padding:6px 13px;font-size:12.5px;font-weight:500;
  cursor:pointer;transition:all .18s var(--ease);font-family:inherit}
.vchip:hover{border-color:var(--brand);color:var(--brand)}
.vchip.on{background:var(--ink);border-color:var(--ink);color:#fff}

.voice-choice label{display:flex;align-items:center;gap:13px;flex:1;min-width:0;cursor:pointer}
/* The face is an inline SVG, so the old tinted-initial circle and its
   gender colours are gone: the drawing carries that now. */
.voice-face{flex:none;display:block;line-height:0;border-radius:50%;
  overflow:hidden;box-shadow:0 1px 3px rgba(26,23,20,.12)}
.voice-face svg{display:block}
.vbody{display:flex;flex-direction:column;gap:5px;min-width:0}
.vbody strong{font-size:14px;font-weight:600}
.vtags{display:flex;flex-wrap:wrap;gap:5px}
.vtag{font-size:11px;color:var(--muted);background:#f4efe7;border-radius:5px;
  padding:2px 7px;white-space:nowrap}
.voice-choice.selected .vtag{background:#fff}

/* One tap, big enough for a thumb — the old per-row <audio> control was both
   fiddly on a phone and pointed at an origin the page would not load. */
.vplay{flex:none;width:42px;height:42px;border-radius:50%;cursor:pointer;
  border:1px solid var(--line);background:#fff;color:var(--ink);
  font-size:13px;line-height:1;transition:all .18s var(--ease)}
.vplay:hover{border-color:var(--brand);color:var(--brand);transform:scale(1.06)}
@media(max-width:560px){
  .vlabel{min-width:100%;margin-bottom:-2px}
  .voice-face svg{width:36px;height:36px}
}

/* ── "What is it doing?" ────────────────────────────────────────────────────
   A spinner on a button says something is happening. It does not say what, and
   on a slow connection a save and a catalogue fetch look identical: a control
   that has gone quiet. People conclude it is stuck and press again.

   One bar, top centre, naming the slowest thing in flight. Above the sticky
   header so it is never hidden, and pointer-events:none so it can never
   swallow a tap meant for what is underneath. */
#busy-bar{position:fixed;top:14px;left:50%;transform:translate(-50%,-14px);
  z-index:2000;display:flex;align-items:center;gap:10px;
  background:rgba(26,23,20,.94);color:#fff;border-radius:999px;
  padding:9px 18px 9px 14px;font-size:13px;font-weight:500;
  box-shadow:0 8px 26px rgba(26,23,20,.26);pointer-events:none;
  opacity:0;transition:opacity .18s var(--ease),transform .22s var(--ease);
  max-width:calc(100vw - 32px)}
#busy-bar.on{opacity:1;transform:translate(-50%,0)}
.busy-spin{flex:none;width:14px;height:14px;border-radius:50%;
  border:2px solid rgba(255,255,255,.3);border-top-color:#fff;
  animation:busy-turn .7s linear infinite}
@keyframes busy-turn{to{transform:rotate(360deg)}}
@media(prefers-reduced-motion:reduce){
  .busy-spin{animation:none;border-top-color:rgba(255,255,255,.7)}
  #busy-bar{transition:opacity .18s}
}
@media(max-width:560px){ #busy-bar{top:10px;font-size:12.5px;padding:8px 15px 8px 12px} }

/* ── Passing calls to another system ────────────────────────────────────────
   A setting most customers have never met needs to introduce itself before it
   asks for anything. */
.handover{border:1px solid var(--line);border-radius:12px;padding:20px 22px;
  background:#fdfbf7;margin-top:26px}
.handover h4{margin:0 0 8px;font-family:'Playfair Display',Georgia,serif;
  font-size:16px;font-weight:700}
.handover>p{font-size:12.5px;line-height:1.75;color:var(--muted);margin:0 0 16px}
.switch-row{display:flex;align-items:center;gap:10px;cursor:pointer;
  font-size:13.5px;font-weight:600}
.switch-row input{width:18px;height:18px;accent-color:var(--brand);flex:none}
.handover-body{margin-top:18px;padding-top:18px;border-top:1px solid var(--line)}
.handover-body.hidden{display:none}
#handover-result{line-height:1.5}

/* ── The six setup steps ────────────────────────────────────────────────────
   Replaces the tab row. Two things it does that tabs could not: it wraps, so
   nothing is ever clipped at any width; and it says which steps are done, so
   "what else do I need to do?" is answered without opening all six. */
.steps{display:flex;flex-wrap:wrap;gap:8px}
.step{display:flex;align-items:center;gap:9px;flex:1 1 auto;min-width:145px;
  border:1px solid var(--line);background:#fff;border-radius:10px;
  padding:11px 13px;text-align:left;font-family:inherit;color:var(--muted);
  transition:border-color .18s var(--ease),background .18s var(--ease);
  min-height:48px}
.step:hover{border-color:#cdbfae;color:var(--ink)}
.step.on{border-color:var(--brand);background:var(--tint);color:var(--ink)}
.step-mark{flex:none;width:22px;height:22px;border-radius:50%;display:grid;
  place-items:center;font-size:11px;font-weight:700;
  background:#f0ebe3;color:var(--muted)}
.step.done .step-mark{background:var(--brand);color:#fff}
.step.on .step-mark{box-shadow:0 0 0 3px rgba(255,124,2,.18)}
.step-label{font-size:13px;font-weight:600;line-height:1.25}
.step.on .step-label{color:var(--ink)}
.step-note{margin-left:auto;font-size:10px;letter-spacing:.08em;
  text-transform:uppercase;color:#a89e93}
@media(max-width:560px){
  .step{flex:1 1 calc(50% - 4px);min-width:0}
  .step-label{font-size:12.5px}
  .step-note{display:none}
}

/* The fastest way to a working agent is to describe the business and let Mella
   write it, so that button should not look like one option among five. */
.btn[data-paction="generate-agent"]{border-color:var(--brand);color:var(--brand-deep);
  background:var(--tint);font-weight:700}
.btn[data-paction="generate-agent"]:hover:not(:disabled){background:#fde6cf}

/* The tour is the fastest way for someone who has never seen this before, and
   it was the third plain button in a row of three — indistinguishable from the
   two either side of it. */
.btn[data-paction="take-tour"]{border-color:var(--brand);color:var(--brand-deep);
  background:var(--tint);font-weight:700}
.btn[data-paction="take-tour"]:hover:not(:disabled){background:#fde6cf}
.btn[data-paction="take-tour"] svg{width:15px;height:15px}

/* ── Checkboxes a thumb can actually hit ────────────────────────────────────
   A QA pass at 390px found these rendering at 13px and 18px. Apple and Google
   both put the minimum touch target at around 44px, and 13px is roughly the
   size of a full stop — on a phone you miss it, hit the label, or hit the one
   below. These are the switches that decide whether a call is recorded and
   what the agent is allowed to do, so a mis-tap matters. */
.panel-body input[type="checkbox"],
.handover input[type="checkbox"]{
  width:20px;height:20px;flex:none;accent-color:var(--brand);
  margin:0 2px 0 0;cursor:pointer}
/* The label carries the rest of the target, so the whole row is tappable
   without the box itself looking oversized. */
.panel-body label:has(> input[type="checkbox"]),
.handover label:has(> input[type="checkbox"]){
  display:flex;align-items:center;gap:10px;
  min-height:44px;padding:4px 0;cursor:pointer}
@media(max-width:560px){
  .panel-body input[type="checkbox"],
  .handover input[type="checkbox"]{width:22px;height:22px}
}
