
:root{--brand:#157347;--brand-dark:#0f5132;--brand-soft:#e8f5ee;--ink:#17211b;--muted:#66756d;--bg:#f4f7f5;--surface:#fff;--line:#dfe7e2;--blue:#2563eb;--danger:#c9362b;--warning:#a15c00;--radius:16px;--shadow:0 8px 28px rgba(21,51,36,.08)}
*{box-sizing:border-box}html{background:var(--bg)}body{margin:0;color:var(--ink);background:var(--bg);font-family:Inter,ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif;font-size:15px}.app-shell{min-height:100vh;display:grid;grid-template-columns:248px minmax(0,1fr)}.sidebar{position:sticky;top:0;height:100vh;background:#10281d;color:#fff;padding:22px 16px;display:flex;flex-direction:column;z-index:30}.brand{display:flex;gap:12px;align-items:center;color:#fff;text-decoration:none;padding:4px 8px 26px}.brand-mark{width:42px;height:42px;border-radius:13px;display:grid;place-items:center;background:linear-gradient(145deg,#38b875,#1c8452);font-weight:900;letter-spacing:-1px}.brand strong,.brand small{display:block}.brand strong{font-size:17px}.brand small{opacity:.67;margin-top:2px}.side-nav{display:grid;gap:6px}.side-nav a{display:flex;gap:12px;align-items:center;color:#d9e8df;text-decoration:none;padding:12px 13px;border-radius:11px;font-weight:700}.side-nav a:hover,.side-nav a.active{background:rgba(255,255,255,.1);color:#fff}.side-nav span{width:21px;text-align:center}.sidebar-footer{margin-top:auto;border-top:1px solid rgba(255,255,255,.12);padding:16px 8px 0}.sidebar-footer a{color:#d9e8df;text-decoration:none}.app-main{min-width:0}.topbar{height:78px;background:rgba(255,255,255,.92);backdrop-filter:blur(12px);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:14px;padding:0 30px;position:sticky;top:0;z-index:20}.topbar h1{font-size:21px;margin:0}.topbar p{font-size:13px;color:var(--muted);margin:3px 0 0}.topbar-actions{margin-left:auto;display:flex;align-items:center;gap:8px;color:var(--muted);font-size:13px}.live-dot{width:8px;height:8px;border-radius:50%;background:#25a55f;box-shadow:0 0 0 4px #dff4e8}.page-content{max-width:1480px;margin:auto;padding:28px}.page-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;margin-bottom:22px}.page-heading h2{font-size:28px;margin:0 0 5px}.page-heading p{margin:0;color:var(--muted)}.toolbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.card,.card2,.app-section{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:20px;margin-bottom:18px;overflow-x:auto}.card h3,.card2 h3{margin:0 0 6px}.grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.grid3,.admin-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.span-2{grid-column:span 2}label{display:block;font-size:13px;font-weight:750;margin:0 0 7px;color:#34443b}input,select,textarea{width:100%;padding:11px 12px;border:1px solid #cfdad3;border-radius:10px;background:#fff;color:var(--ink);font:inherit;transition:.15s}input:focus,select:focus,textarea:focus{outline:0;border-color:#4ca777;box-shadow:0 0 0 3px rgba(44,147,92,.13)}textarea{min-height:88px;resize:vertical}.button,button,a.button{appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:7px;border:0;border-radius:10px;padding:10px 14px;font:inherit;font-weight:750;text-decoration:none;cursor:pointer;margin:0;white-space:nowrap}.button.primary,.primary{background:var(--brand);color:#fff}.button.blue,.blue{background:var(--blue);color:#fff}.button.danger,.danger{background:var(--danger);color:#fff}.button.secondary,.gray{background:#edf2ef;color:#26372e}.button:hover,button:hover{filter:brightness(.97);transform:translateY(-1px)}button:disabled{opacity:.55;cursor:not-allowed;transform:none}.icon-button{border:1px solid var(--line);background:#fff;width:40px;height:40px;border-radius:10px;padding:0}.mobile-menu{display:none}.muted{color:var(--muted);font-size:14px}.ok{color:#13804a;font-weight:800}.warn{color:var(--warning);font-weight:800}.flag{color:var(--danger);font-weight:800}.search-panel{display:flex;gap:12px;align-items:flex-end}.search-panel .search-input{flex:1}.customer-list{display:grid;gap:12px}.customer-row{border:1px solid var(--line);border-radius:13px;background:#fff;overflow:hidden}.customer-row>summary{list-style:none;cursor:pointer;padding:16px 18px;display:flex;gap:14px;align-items:center}.customer-row>summary::-webkit-details-marker{display:none}.customer-avatar{width:42px;height:42px;border-radius:12px;background:var(--brand-soft);color:var(--brand-dark);font-weight:900;display:grid;place-items:center}.customer-summary{min-width:0;flex:1}.customer-summary strong{display:block;font-size:16px}.customer-summary small{display:block;color:var(--muted);margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-badge{border-radius:999px;padding:5px 9px;font-size:12px;font-weight:800;background:#e7f6ed;color:#137545}.status-badge.inactive{background:#fff0de;color:#945300}.customer-editor{border-top:1px solid var(--line);padding:19px;background:#fbfcfb}.section-title{font-size:13px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:20px 0 10px}.form-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:18px}.empty-state{text-align:center;padding:46px;color:var(--muted)}table{border-collapse:collapse;width:100%;font-size:14px}th,td{border-bottom:1px solid var(--line);padding:10px;text-align:left;vertical-align:top}th{background:#f5f8f6}details>summary{cursor:pointer}.toast-stack{position:fixed;right:20px;bottom:20px;z-index:100;display:grid;gap:10px}.toast{min-width:280px;max-width:420px;background:#14251c;color:#fff;padding:13px 15px;border-radius:12px;box-shadow:0 14px 40px rgba(0,0,0,.2);animation:toastIn .2s ease}.toast.error{background:#8f241d}.toast.success{background:#12633a}@keyframes toastIn{from{opacity:0;transform:translateY(8px)}}.modal-backdrop{position:fixed;inset:0;background:rgba(7,20,13,.56);display:grid;place-items:center;padding:18px;z-index:110}.modal-backdrop[hidden]{display:none}.modal{width:min(430px,100%);background:#fff;border-radius:16px;padding:22px;box-shadow:0 24px 80px rgba(0,0,0,.3)}.modal h3{margin-top:0}.modal-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}.sidebar-scrim{display:none}.loading{position:relative;pointer-events:none;opacity:.65}.loading:after{content:"";position:absolute;right:12px;top:12px;width:18px;height:18px;border:2px solid #d4e4da;border-top-color:var(--brand);border-radius:50%;animation:spin .7s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}
@media(max-width:900px){.app-shell{grid-template-columns:1fr}.sidebar{position:fixed;left:-270px;width:248px;transition:left .2s}.sidebar.open{left:0}.sidebar-scrim{display:block;position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:25;opacity:0;pointer-events:none;transition:.2s}.sidebar-scrim.open{opacity:1;pointer-events:auto}.mobile-menu{display:grid;place-items:center}.topbar{padding:0 16px}.page-content{padding:18px}.live-label{display:none}}@media(max-width:680px){.grid,.grid3,.admin-grid,.form-grid{grid-template-columns:1fr}.span-2{grid-column:auto}.page-heading{display:block}.page-heading .toolbar{margin-top:14px}.search-panel{align-items:stretch;flex-direction:column}.form-actions{flex-direction:column}.form-actions .button,.form-actions button{width:100%}.customer-row>summary{padding:14px}.customer-editor{padding:15px}.topbar h1{font-size:18px}.page-content{padding:14px}button,a.button{max-width:100%}}


/* True Vine Ops V2 unified responsive layer */
:root{--brand:#35c66b;--brand-dark:#16894a;--brand-soft:#eafff1;--blue:#55bce8;--blue-soft:#eaf8ff;--bg:#f5fbf8;--radius:18px}
body:has(.ops-shell)>.app-shell{display:block}
body:has(.ops-shell) .app-shell>.sidebar,body:has(.ops-shell) .app-main>.topbar{display:none!important}
body:has(.ops-shell) .page-content{max-width:none;padding:0}
.brand-mark{background:linear-gradient(145deg,var(--brand),var(--blue))}.sidebar{background:linear-gradient(180deg,#12372b,#102f3d)}
.crm-toolbar{display:grid;grid-template-columns:minmax(220px,1fr) 220px;gap:12px}.crm-board{display:grid;grid-template-columns:repeat(5,minmax(240px,1fr));gap:14px;overflow-x:auto;padding-bottom:10px}.crm-column{background:#eef7f3;border:1px solid var(--line);border-radius:16px;min-height:440px}.crm-column>header{display:flex;justify-content:space-between;padding:14px 15px;border-bottom:1px solid var(--line)}.crm-count{background:#fff;border-radius:999px;padding:2px 8px}.crm-list{padding:10px;display:grid;gap:10px}.crm-card{background:#fff;border:1px solid var(--line);border-radius:14px;padding:14px;box-shadow:0 5px 18px rgba(20,70,48,.06)}.crm-card h3{margin:8px 0}.crm-card p{line-height:1.5}.crm-card-top{display:flex;justify-content:space-between;color:var(--muted);font-size:12px}.crm-card dl{display:grid;gap:7px}.crm-card dl div{display:flex;justify-content:space-between;gap:8px}.crm-card dt{color:var(--muted)}.crm-card dd{margin:0;text-align:right}.crm-modal{width:min(680px,100%);position:relative}.crm-close{position:absolute;right:12px;top:10px;background:transparent;font-size:28px;padding:4px 10px}
.dispatch-layout{display:grid;grid-template-columns:280px minmax(0,1fr);gap:16px}.dispatch-pool{position:sticky;top:96px;max-height:calc(100vh - 120px);overflow:auto}.dispatch-job-list{display:grid;gap:9px;margin-top:12px}.dispatch-calendar{overflow:auto;padding:0}.dispatch-grid{min-width:1100px}.dispatch-head,.dispatch-row{display:grid;grid-template-columns:130px repeat(7,minmax(138px,1fr))}.dispatch-head{position:sticky;top:0;z-index:3;background:#fff;border-bottom:1px solid var(--line)}.dispatch-head>div{padding:12px;text-align:center;border-right:1px solid var(--line)}.dispatch-head span{display:block;color:var(--muted);font-size:12px;margin-top:3px}.dispatch-row{min-height:130px;border-bottom:1px solid var(--line)}.dispatch-crew,.dispatch-cell{padding:9px;border-right:1px solid var(--line)}.dispatch-cell{background:#fbfefd;transition:.15s}.dispatch-cell.drag-over{background:var(--blue-soft);box-shadow:inset 0 0 0 2px var(--blue)}.dispatch-job{padding:9px;border-radius:10px;background:#fff;border:1px solid var(--line);border-left:5px solid var(--brand);box-shadow:0 3px 10px rgba(0,0,0,.05);cursor:grab;margin-bottom:7px}.dispatch-job strong,.dispatch-job span,.dispatch-job small{display:block;overflow-wrap:anywhere}.dispatch-job span{font-size:12px;margin-top:3px}.dispatch-job small{color:var(--muted);font-size:11px;margin-top:4px}.crew-color-0{border-left-color:#24b36b!important}.crew-color-1{border-left-color:#49aee8!important}.crew-color-2{border-left-color:#9b6fe8!important}.crew-color-3{border-left-color:#ef9b45!important}.crew-color-4{border-left-color:#e85f83!important}.crew-color-5{border-left-color:#30b9b2!important}.crew-color-6{border-left-color:#d5b52c!important}.crew-color-7{border-left-color:#74869b!important}
@media(max-width:900px){.dispatch-layout{grid-template-columns:1fr}.dispatch-pool{position:static;max-height:none}.crm-board{grid-template-columns:repeat(5,280px)}}
@media(max-width:680px){html,body{overflow-x:hidden}.crm-toolbar{grid-template-columns:1fr}.crm-board{grid-template-columns:repeat(5,86vw)}.topbar{height:auto;min-height:68px;padding-block:10px}.topbar>div{min-width:0}.topbar h1,.topbar p,.card,.app-section,td,th,label{overflow-wrap:normal;word-break:normal}.page-content{width:100%;max-width:100%;overflow:hidden}input,select,textarea{min-width:0}.grid,.grid3,.form-grid{width:100%}.dispatch-calendar{margin-inline:-14px;border-radius:0}.modal-backdrop{align-items:end}.modal{border-radius:20px 20px 0 0;max-height:92vh;overflow:auto}}

/* 2026-07-28 authenticated workspace unification */
body:has(.ops-shell)>.app-shell{display:grid!important}
body:has(.ops-shell) .app-shell>.sidebar{display:flex!important}
body:has(.ops-shell) .app-main>.topbar{display:flex!important}
body:has(.ops-shell) .page-content{max-width:1480px!important;padding:28px!important}
body:has(.ops-shell) .ops-shell{display:block!important;min-height:0!important;background:transparent!important}
body:has(.ops-shell) .ops-sidebar{display:none!important}
body:has(.ops-shell) .ops-workspace{padding:0!important;min-width:0!important}
body:has(.ops-shell) .ops-commandbar{background:transparent!important;border:0!important;box-shadow:none!important;padding:0 0 18px!important;min-height:0!important}
body:has(.ops-shell) .ops-commandbar .ops-eyebrow{display:none!important}
body:has(.ops-shell) .ops-commandbar h1{font-size:28px!important;color:var(--ink)!important;margin:0 0 5px!important}
body:has(.ops-shell) .ops-commandbar p{color:var(--muted)!important;margin:0!important}
.admin-module-bar{position:sticky;top:92px;z-index:12;display:flex;gap:7px;overflow-x:auto;padding:8px;margin:0 0 18px;background:rgba(255,255,255,.94);backdrop-filter:blur(12px);border:1px solid var(--line);border-radius:14px;box-shadow:0 8px 24px rgba(21,51,36,.07)}
.admin-module-bar .admin-tab{flex:0 0 auto!important;display:inline-flex!important;align-items:center!important;gap:7px!important;width:auto!important;padding:9px 12px!important;border:0!important;border-radius:9px!important;background:transparent!important;color:#506158!important;font-size:13px!important;font-weight:800!important}
.admin-module-bar .admin-tab:hover{background:#edf5f0!important;color:#173b2b!important}
.admin-module-bar .admin-tab.active{background:#173b2b!important;color:#fff!important;box-shadow:none!important}
.admin-module-bar .admin-tab span{width:auto!important;font-size:14px!important}
.app-section>details:not([open]){margin-bottom:10px}
.app-section>details>summary{min-height:48px;display:flex;align-items:center;justify-content:space-between;gap:12px}
.app-section>details>summary:after{content:"Open";font-size:11px;font-weight:800;color:var(--brand-dark);background:var(--brand-soft);padding:5px 8px;border-radius:999px}
.app-section>details[open]>summary:after{content:"Close"}
@media(max-width:900px){body:has(.ops-shell) .page-content{padding:18px!important}.admin-module-bar{top:86px}}
@media(max-width:680px){body:has(.ops-shell) .page-content{padding:14px!important}.admin-module-bar{top:78px;margin-inline:-4px}.admin-module-bar .admin-tab{padding:9px 11px!important}.ops-command-actions{display:grid!important;grid-template-columns:1fr 1fr;width:100%}.ops-command-actions button{min-width:0!important}}
.save-feedback{position:sticky;top:88px;z-index:19;margin:0 0 18px;padding:14px 16px;border-radius:12px;border:1px solid;font-weight:800;box-shadow:var(--shadow)}.save-feedback.success{background:#e7f6ed;border-color:#9fd6b7;color:#12633a}.save-feedback.error{background:#fff0ee;border-color:#e6aaa4;color:#8f241d}.toast-leaving{opacity:0;transform:translateY(8px);transition:.2s}.crm-address{display:flex;gap:7px;align-items:flex-start;margin:10px 0 12px;padding:10px;border-radius:10px;background:#f4f8f5;color:#34443b;font-size:13px;line-height:1.4}.crm-address em{color:var(--muted)}.crm-lead-summary{display:grid;gap:5px;margin:-2px 0 18px;padding:13px;border-radius:11px;background:#f4f8f5;color:#34443b}.crm-lead-summary strong{font-size:16px}.crm-lead-summary span{font-size:13px;overflow-wrap:anywhere}


/* TrueVine calendar job editor drawer */
body.dispatch-editor-open{overflow:hidden}
#dispatchEditModal.dispatch-modal{display:flex;align-items:stretch;justify-content:flex-end;padding:0;pointer-events:none}
#dispatchEditModal.dispatch-modal[hidden]{display:none!important}
#dispatchEditModal .dispatch-modal-backdrop{pointer-events:auto;background:rgba(7,22,16,.5);opacity:0;transition:opacity .18s ease}
#dispatchEditModal .dispatch-edit-dialog{pointer-events:auto;width:min(560px,100%);height:100%;max-height:none;overflow:auto;border-radius:20px 0 0 20px;padding:24px;transform:translateX(100%);transition:transform .18s ease;box-shadow:-24px 0 60px rgba(7,22,16,.28)}
#dispatchEditModal.is-open .dispatch-modal-backdrop{opacity:1}
#dispatchEditModal.is-open .dispatch-edit-dialog{transform:translateX(0)}
#dispatchEditModal .dispatch-modal-header{position:sticky;top:-24px;z-index:2;background:#fff;padding:24px 0 14px;border-bottom:1px solid #e2e8f0;margin-bottom:14px}
#dispatchEditModal .dispatch-modal-summary{background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:10px 12px}
#dispatchEditModal .dispatch-modal-fields{grid-template-columns:1fr 1fr}
#dispatchEditModal .dispatch-modal-fields input,#dispatchEditModal .dispatch-modal-fields select,#dispatchEditModal .dispatch-modal-fields textarea{width:100%;box-sizing:border-box}
#dispatchEditModal .dispatch-modal-actions{position:sticky;bottom:-24px;background:#fff;padding:14px 0 24px;border-top:1px solid #e2e8f0;margin-top:20px}
@media(max-width:700px){#dispatchEditModal .dispatch-edit-dialog{width:100%;border-radius:0;padding:18px}#dispatchEditModal .dispatch-modal-header{top:-18px;padding-top:18px}#dispatchEditModal .dispatch-modal-fields{grid-template-columns:1fr}#dispatchEditModal .dispatch-modal-actions{bottom:-18px;padding-bottom:18px}.dispatch-edit-wide{grid-column:1}}
\n\n/* 2026-08-07 navigation refinement */\n.app-shell{transition:grid-template-columns .18s ease}\n.sidebar{transition:width .18s ease,left .2s ease,padding .18s ease}\n.sidebar-brand-row{display:flex;align-items:flex-start;gap:6px}\n.sidebar-brand-row .brand{flex:1;min-width:0}\n.sidebar-collapse-button{flex:0 0 30px;width:30px;height:30px;border:1px solid rgba(255,255,255,.13);border-radius:9px;background:rgba(255,255,255,.06);color:#d9e8df;font-size:22px;line-height:1;padding:0;cursor:pointer}\n.sidebar-collapse-button:hover{background:rgba(255,255,255,.13);filter:none;transform:none}\n.side-nav .nav-icon{flex:0 0 21px;width:21px;text-align:center}\n.side-nav .nav-label,.brand-copy,.sidebar-footer .nav-label{white-space:nowrap;transition:opacity .12s ease}\n.app-shell.sidebar-collapsed{grid-template-columns:76px minmax(0,1fr)}\n.sidebar.collapsed{padding-inline:10px}\n.sidebar.collapsed .sidebar-brand-row{display:block}\n.sidebar.collapsed .brand{padding:4px 7px 14px;justify-content:center}\n.sidebar.collapsed .brand-mark{width:40px;height:40px}\n.sidebar.collapsed .brand-copy,.sidebar.collapsed .side-nav .nav-label,.sidebar.collapsed .sidebar-footer .nav-label{display:none}\n.sidebar.collapsed .sidebar-collapse-button{display:block;margin:0 auto 14px}\n.sidebar.collapsed .side-nav a{justify-content:center;padding:12px 8px;gap:0}\n.sidebar.collapsed .side-nav .nav-icon{font-size:17px}\n.sidebar.collapsed .sidebar-footer{text-align:center;padding-inline:0}\n.sidebar.collapsed .sidebar-footer a:after{content:'↩';font-size:18px}\n@media(max-width:900px){.app-shell.sidebar-collapsed{grid-template-columns:1fr}.sidebar.collapsed{width:248px;padding:22px 16px}.sidebar.collapsed .brand-copy,.sidebar.collapsed .side-nav .nav-label,.sidebar.collapsed .sidebar-footer .nav-label{display:inline}.sidebar.collapsed .sidebar-brand-row{display:flex}.sidebar.collapsed .sidebar-collapse-button{display:none}.sidebar.collapsed .side-nav a{justify-content:flex-start;padding:12px 13px;gap:12px}.sidebar-collapse-button{display:none}}\n
/* Urgent job notes */
.dispatch-job.urgent-notes{border:2px solid #b42318!important;border-left:6px solid #b42318!important;background:#fff7f6;box-shadow:0 4px 14px rgba(180,35,24,.14)}
.dispatch-urgent-warning{display:inline-flex!important;width:max-content;max-width:100%;align-items:center;gap:4px;margin:0 0 5px!important;padding:3px 7px;border-radius:999px;background:#b42318;color:#fff!important;font-size:10px!important;font-weight:900;letter-spacing:.055em;line-height:1.2}
.dispatch-urgent-toggle{display:flex!important;align-items:flex-start;gap:10px;padding:12px;border:1px solid #f1b4ae;border-radius:12px;background:#fff7f6}
.dispatch-urgent-toggle input{width:20px;height:20px;margin-top:1px;accent-color:#b42318;flex:0 0 auto}
.dispatch-urgent-toggle span{display:grid;gap:2px}.dispatch-urgent-toggle strong{color:#9f1d14}.dispatch-urgent-toggle small{color:#6f514e;font-weight:500}


/* =========================================================
   TRUEVINE OPS UI V3 — GLOBAL PRODUCT SHELL
   ========================================================= */

:root {
  --tv-brand: #1f7a50;
  --tv-brand-strong: #155d3d;
  --tv-brand-deep: #0d3b29;
  --tv-brand-soft: #eaf5ef;

  --tv-sidebar: #0c2118;
  --tv-sidebar-2: #102b20;
  --tv-sidebar-line: rgba(255,255,255,.085);

  --tv-bg: #f6f8f7;
  --tv-surface: #ffffff;
  --tv-surface-subtle: #f9fbfa;

  --tv-text: #17231d;
  --tv-text-soft: #607067;
  --tv-text-faint: #88958e;

  --tv-border: #e1e7e3;
  --tv-border-strong: #ccd7d0;

  --tv-blue: #2f6fed;
  --tv-danger: #c24138;
  --tv-warning: #b66a12;
  --tv-success: #1f8a52;

  --tv-radius-sm: 8px;
  --tv-radius: 12px;
  --tv-radius-lg: 16px;

  --tv-shadow-sm:
    0 1px 2px rgba(15, 32, 23, .04),
    0 2px 8px rgba(15, 32, 23, .035);

  --tv-shadow:
    0 1px 2px rgba(15, 32, 23, .04),
    0 10px 30px rgba(15, 32, 23, .06);

  --tv-sidebar-width: 268px;
  --tv-sidebar-collapsed: 82px;

  --brand: var(--tv-brand);
  --brand-dark: var(--tv-brand-strong);
  --brand-soft: var(--tv-brand-soft);
  --ink: var(--tv-text);
  --muted: var(--tv-text-soft);
  --bg: var(--tv-bg);
  --surface: var(--tv-surface);
  --line: var(--tv-border);
  --radius: var(--tv-radius-lg);
  --shadow: var(--tv-shadow-sm);
}


html {
  background: var(--tv-bg);
}


body {
  background: var(--tv-bg);
  color: var(--tv-text);
  font-size: 14px;
  line-height: 1.45;
  letter-spacing: -.006em;
}


.app-shell {
  min-height: 100vh;
  display: grid;
  grid-template-columns:
    var(--tv-sidebar-width)
    minmax(0, 1fr);
  transition:
    grid-template-columns .18s ease;
}


/* ---------------------------------------------------------
   SIDEBAR
   --------------------------------------------------------- */

.sidebar {
  position: sticky;
  top: 0;

  width: auto;
  height: 100vh;

  padding: 14px 12px 12px;

  background:
    linear-gradient(
      180deg,
      var(--tv-sidebar) 0%,
      var(--tv-sidebar-2) 100%
    );

  color: #fff;

  display: flex;
  flex-direction: column;

  overflow: hidden;

  z-index: 40;

  border-right:
    1px solid rgba(255,255,255,.04);
}


.sidebar-brand-row {
  min-height: 64px;

  display: flex;
  align-items: center;

  gap: 7px;

  padding: 2px 2px 10px;

  border-bottom:
    1px solid var(--tv-sidebar-line);
}


.brand {
  min-width: 0;
  flex: 1;

  display: flex;
  align-items: center;

  gap: 11px;

  padding: 7px 8px;

  color: #fff;
  text-decoration: none;

  border-radius: 12px;
}


.brand:hover {
  background: rgba(255,255,255,.04);
}


.brand-mark {
  flex: 0 0 40px;

  width: 40px;
  height: 40px;

  display: grid;
  place-items: center;

  border-radius: 11px;

  background:
    linear-gradient(
      145deg,
      #267c56,
      #246e62
    );

  border:
    1px solid rgba(255,255,255,.10);

  box-shadow:
    inset 0 1px rgba(255,255,255,.10);

  color: #dff8ea;

  font-size: 13px;
  font-weight: 900;
  letter-spacing: -.02em;
}


.brand-copy {
  min-width: 0;
}


.brand-copy strong {
  display: block;

  font-size: 14px;
  font-weight: 800;
  line-height: 1.2;

  letter-spacing: -.01em;
}


.brand-copy small {
  display: block;

  margin-top: 3px;

  color: #86a798;

  font-size: 10px;
  font-weight: 600;

  letter-spacing: .02em;
}


.sidebar-collapse-button {
  flex: 0 0 32px;

  width: 32px;
  height: 32px;

  display: grid;
  place-items: center;

  padding: 0;

  border:
    1px solid rgba(255,255,255,.09);

  border-radius: 9px;

  background:
    rgba(255,255,255,.035);

  color: #9ab5a8;

  cursor: pointer;
}


.sidebar-collapse-button svg {
  pointer-events: none;
}


.sidebar-collapse-button:hover {
  background: rgba(255,255,255,.08);
  color: #fff;

  transform: none;
  filter: none;
}


.sidebar-scroll {
  flex: 1;

  min-height: 0;

  overflow-y: auto;
  overflow-x: hidden;

  padding:
    13px 2px
    10px;

  scrollbar-width: thin;
  scrollbar-color:
    rgba(255,255,255,.14)
    transparent;
}


.side-nav {
  display: block;
}


.nav-section {
  margin-bottom: 16px;
}


.nav-section-label {
  padding: 0 10px 6px;

  color: #647f73;

  font-size: 9px;
  font-weight: 800;

  letter-spacing: .105em;
  text-transform: uppercase;

  white-space: nowrap;
}


.side-nav a {
  position: relative;

  min-height: 47px;

  display: flex;
  align-items: center;

  gap: 10px;

  padding: 7px 9px;

  margin-bottom: 3px;

  border-radius: 10px;

  color: #b7cbc1;

  text-decoration: none;

  font-weight: 600;

  transition:
    color .12s ease,
    background .12s ease;
}


.side-nav a:hover {
  background:
    rgba(255,255,255,.055);

  color: #fff;
}


.side-nav a.active {
  background:
    linear-gradient(
      90deg,
      rgba(56,147,96,.23),
      rgba(56,147,96,.10)
    );

  color: #fff;

  box-shadow:
    inset 0 0 0 1px
    rgba(97,188,130,.08);
}


.side-nav a.active::before {
  content: "";

  position: absolute;

  left: -2px;
  top: 11px;
  bottom: 11px;

  width: 3px;

  border-radius: 999px;

  background: #59bc82;
}


.nav-icon {
  flex: 0 0 30px;

  width: 30px;
  height: 30px;

  display: grid;
  place-items: center;

  border-radius: 8px;

  color: #8eaa9d;
}


.side-nav a:hover .nav-icon,
.side-nav a.active .nav-icon {
  color: #d7f0e2;
}


.nav-icon svg {
  width: 18px;
  height: 18px;

  fill: none;
  stroke: currentColor;

  stroke-width: 1.7;
  stroke-linecap: round;
  stroke-linejoin: round;
}


.nav-copy {
  min-width: 0;
  flex: 1;
}


.nav-label {
  display: block;

  width: auto !important;

  color: inherit;

  font-size: 12px;
  font-weight: 750;

  line-height: 1.2;

  text-align: left !important;
}


.nav-copy small {
  display: block;

  margin-top: 3px;

  color: #708d80;

  font-size: 9px;
  font-weight: 550;

  white-space: nowrap;

  overflow: hidden;
  text-overflow: ellipsis;
}


.side-nav a.active .nav-copy small {
  color: #8fae9f;
}


.sidebar-footer {
  margin-top: auto;

  padding: 10px 2px 0;

  border-top:
    1px solid var(--tv-sidebar-line);
}


.sidebar-footer-status {
  display: flex;
  align-items: center;

  gap: 9px;

  padding:
    8px 10px
    10px;
}


.sidebar-status-dot {
  width: 7px;
  height: 7px;

  border-radius: 50%;

  background: #45b875;

  box-shadow:
    0 0 0 3px
    rgba(69,184,117,.12);
}


.sidebar-footer-copy {
  min-width: 0;
}


.sidebar-footer-copy strong,
.sidebar-footer-copy small {
  display: block;
}


.sidebar-footer-copy strong {
  color: #b8ccc2;

  font-size: 10px;
}


.sidebar-footer-copy small {
  margin-top: 2px;

  color: #668377;

  font-size: 9px;
}


.sidebar-signout {
  min-height: 40px;

  display: flex;
  align-items: center;

  gap: 10px;

  padding: 5px 9px;

  border-radius: 9px;

  color: #88a297 !important;

  text-decoration: none;
}


.sidebar-signout:hover {
  background: rgba(255,255,255,.05);

  color: #fff !important;
}


/* ---------------------------------------------------------
   COLLAPSED SIDEBAR
   --------------------------------------------------------- */

.app-shell.sidebar-collapsed {
  grid-template-columns:
    var(--tv-sidebar-collapsed)
    minmax(0,1fr);
}


.sidebar.collapsed {
  padding-inline: 10px;
}


.sidebar.collapsed .sidebar-brand-row {
  display: grid;
  justify-items: center;

  gap: 7px;

  padding-bottom: 11px;
}


.sidebar.collapsed .brand {
  width: 100%;

  justify-content: center;

  padding: 6px 0;
}


.sidebar.collapsed .brand-copy,
.sidebar.collapsed .nav-copy,
.sidebar.collapsed .nav-section-label,
.sidebar.collapsed .sidebar-footer-copy,
.sidebar.collapsed .sidebar-signout .nav-label {
  display: none;
}


.sidebar.collapsed .sidebar-collapse-button {
  margin: 0;
}


.sidebar.collapsed
.sidebar-collapse-button svg {
  transform: rotate(180deg);
}


.sidebar.collapsed .nav-section {
  margin-bottom: 11px;
}


.sidebar.collapsed .side-nav a {
  width: 46px;
  min-height: 44px;

  justify-content: center;

  margin:
    0 auto
    4px;

  padding: 7px;
}


.sidebar.collapsed .side-nav a.active::before {
  left: -8px;
}


.sidebar.collapsed .nav-icon {
  flex-basis: 30px;
}


.sidebar.collapsed .sidebar-footer-status {
  justify-content: center;

  padding-inline: 0;
}


.sidebar.collapsed .sidebar-signout {
  justify-content: center;

  padding-inline: 0;
}


/* ---------------------------------------------------------
   MAIN WORKSPACE / TOPBAR
   --------------------------------------------------------- */

.app-main {
  min-width: 0;
}


.topbar {
  position: sticky;
  top: 0;

  z-index: 30;

  min-height: 72px;
  height: 72px;

  display: flex;
  align-items: center;

  gap: 13px;

  padding:
    0 26px;

  background:
    rgba(255,255,255,.94);

  backdrop-filter: blur(16px);

  border-bottom:
    1px solid var(--tv-border);

  box-shadow:
    0 1px 2px
    rgba(15,32,23,.025);
}


.topbar-page {
  min-width: 0;
}


.topbar-context {
  display: flex;
  align-items: center;

  gap: 6px;

  color: #92a098;

  font-size: 10px;
  font-weight: 650;

  line-height: 1.2;

  white-space: nowrap;
}


.topbar-context span {
  color: #c0c9c4;
}


.topbar-context strong {
  overflow: hidden;

  color: var(--tv-text);

  font-size: 15px;
  font-weight: 800;

  text-overflow: ellipsis;
}


.topbar-page p {
  margin: 4px 0 0;

  color: var(--tv-text-soft);

  font-size: 11px;

  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}


.topbar-actions {
  margin-left: auto;

  display: flex;
  align-items: center;

  gap: 8px;
}


.connection-pill {
  min-height: 31px;

  display: inline-flex;
  align-items: center;

  gap: 7px;

  padding: 0 10px;

  border:
    1px solid #dfe8e3;

  border-radius: 999px;

  background: #f8faf9;

  color: #617268;

  font-size: 10px;
  font-weight: 650;
}


.live-dot {
  width: 7px;
  height: 7px;

  border-radius: 50%;

  background: #2d9b5e;

  box-shadow:
    0 0 0 3px
    rgba(45,155,94,.11);
}


.page-content {
  width: 100%;

  max-width: 1540px;

  margin: 0 auto;

  padding:
    24px 26px
    38px;
}


/* ---------------------------------------------------------
   COMMON COMPONENT POLISH
   --------------------------------------------------------- */

.card,
.card2,
.app-section {
  border:
    1px solid var(--tv-border);

  border-radius:
    var(--tv-radius-lg);

  background:
    var(--tv-surface);

  box-shadow:
    var(--tv-shadow-sm);

  padding: 18px;

  margin-bottom: 16px;
}


.card:hover,
.card2:hover {
  border-color:
    #d8e0db;
}


label {
  color: #405148;

  font-size: 11px;
  font-weight: 750;

  letter-spacing: .005em;
}


input,
select,
textarea {
  min-height: 40px;

  padding: 9px 11px;

  border:
    1px solid var(--tv-border-strong);

  border-radius:
    var(--tv-radius-sm);

  background: #fff;

  color: var(--tv-text);

  font-size: 13px;

  box-shadow:
    0 1px 1px
    rgba(15,32,23,.015);

  transition:
    border-color .12s ease,
    box-shadow .12s ease,
    background .12s ease;
}


textarea {
  min-height: 88px;
}


input:hover,
select:hover,
textarea:hover {
  border-color: #b8c7be;
}


input:focus,
select:focus,
textarea:focus {
  border-color: #43926a;

  outline: 0;

  box-shadow:
    0 0 0 3px
    rgba(38,132,84,.10);
}


input::placeholder,
textarea::placeholder {
  color: #a1ada6;
}


.button,
button,
a.button {
  min-height: 38px;

  border-radius: 8px;

  font-size: 12px;
  font-weight: 750;

  transition:
    background .12s ease,
    border-color .12s ease,
    color .12s ease,
    box-shadow .12s ease,
    transform .08s ease;
}


.button.primary,
.button:not(.secondary):not(.danger):not(.blue) {
  background:
    var(--tv-brand);

  color: #fff;

  box-shadow:
    0 1px 2px
    rgba(16,77,47,.13);
}


.button.secondary,
.gray {
  border:
    1px solid var(--tv-border);

  background: #fff;

  color: #3b4d43;
}


.button.secondary:hover {
  background:
    #f7f9f8;

  border-color:
    #cbd6cf;
}


.button.danger,
.danger {
  background:
    #bf3e36;

  color: #fff;
}


.button:hover,
button:hover {
  filter: none;
  transform: none;
}


.button:active,
button:active {
  transform: translateY(1px);
}


.icon-button {
  width: 38px;
  height: 38px;

  min-height: 38px;

  display: grid;
  place-items: center;

  padding: 0;

  border:
    1px solid var(--tv-border);

  border-radius: 9px;

  background: #fff;

  color: #405148;
}


.icon-button svg {
  width: 20px;
  height: 20px;

  fill: none;
  stroke: currentColor;

  stroke-width: 1.8;
  stroke-linecap: round;
}


table {
  font-size: 12px;
}


th {
  padding: 10px 11px;

  background: #f8faf9;

  color: #617168;

  font-size: 10px;
  font-weight: 800;

  letter-spacing: .04em;
  text-transform: uppercase;
}


td {
  padding: 11px;

  border-bottom:
    1px solid #edf1ee;
}


tbody tr:hover td {
  background:
    #fbfcfb;
}


.status-badge {
  display: inline-flex;
  align-items: center;

  min-height: 23px;

  padding:
    3px 8px;

  border-radius:
    999px;

  font-size: 9px;
  font-weight: 800;

  letter-spacing: .035em;
  text-transform: uppercase;
}


.page-heading {
  margin-bottom: 18px;
}


.page-heading h2 {
  margin-bottom: 4px;

  font-size: 23px;

  letter-spacing: -.025em;
}


.section-title {
  margin:
    20px 0
    9px;

  color: #77867d;

  font-size: 9px;
  font-weight: 800;

  letter-spacing: .09em;
  text-transform: uppercase;
}


.empty-state {
  padding: 42px 22px;

  color: #7c8a82;
}


/* ---------------------------------------------------------
   CONFIRM MODAL
   --------------------------------------------------------- */

.modal-backdrop {
  background:
    rgba(13,30,21,.55);

  backdrop-filter:
    blur(3px);
}


.modal {
  border:
    1px solid rgba(255,255,255,.45);

  border-radius: 16px;

  padding: 21px;

  box-shadow:
    0 24px 70px
    rgba(10,26,18,.28);
}


.modal-kicker {
  margin-bottom: 4px;

  color: var(--tv-brand);

  font-size: 9px;
  font-weight: 850;

  letter-spacing: .09em;
  text-transform: uppercase;
}


.modal h3 {
  margin:
    0 0
    8px;

  font-size: 18px;

  letter-spacing: -.018em;
}


.modal p {
  margin: 0;

  color: var(--tv-text-soft);

  line-height: 1.55;
}


/* ---------------------------------------------------------
   MOBILE
   --------------------------------------------------------- */

.mobile-menu {
  display: none;
}


@media (max-width: 900px) {

  .app-shell,
  .app-shell.sidebar-collapsed {
    grid-template-columns: 1fr;
  }


  .sidebar,
  .sidebar.collapsed {
    position: fixed;

    top: 0;
    left: -285px;

    width:
      var(--tv-sidebar-width);

    height: 100dvh;

    padding: 14px 12px 12px;

    transition:
      left .2s ease;

    box-shadow:
      18px 0 50px
      rgba(5,18,11,.20);
  }


  .sidebar.open,
  .sidebar.collapsed.open {
    left: 0;
  }


  .sidebar.collapsed .sidebar-brand-row {
    display: flex;
    justify-items: initial;
  }


  .sidebar.collapsed .brand {
    width: auto;
    justify-content: flex-start;
    padding: 7px 8px;
  }


  .sidebar.collapsed .brand-copy,
  .sidebar.collapsed .nav-copy,
  .sidebar.collapsed .nav-section-label,
  .sidebar.collapsed .sidebar-footer-copy,
  .sidebar.collapsed .sidebar-signout .nav-label {
    display: block;
  }


  .sidebar.collapsed .side-nav a {
    width: auto;

    justify-content: flex-start;

    margin:
      0 0
      3px;

    padding:
      7px 9px;
  }


  .sidebar.collapsed .sidebar-footer-status,
  .sidebar.collapsed .sidebar-signout {
    justify-content: flex-start;
  }


  .sidebar-collapse-button {
    display: none;
  }


  .sidebar-scrim {
    display: block;

    position: fixed;
    inset: 0;

    z-index: 35;

    opacity: 0;

    pointer-events: none;

    background:
      rgba(6,20,12,.42);

    backdrop-filter:
      blur(1px);

    transition:
      opacity .18s ease;
  }


  .sidebar-scrim.open {
    opacity: 1;
    pointer-events: auto;
  }


  .mobile-menu {
    display: grid;
    place-items: center;

    flex: 0 0 38px;
  }


  .topbar {
    height: 68px;
    min-height: 68px;

    padding:
      0 15px;
  }


  .page-content {
    padding:
      18px 16px
      30px;
  }

}


@media (max-width: 600px) {

  .topbar {
    gap: 10px;
  }


  .topbar-context {
    font-size: 9px;
  }


  .topbar-context > span,
  .topbar-context > :first-child {
    display: none;
  }


  .topbar-context strong {
    font-size: 14px;
  }


  .topbar-page p {
    max-width: 58vw;

    font-size: 10px;
  }


  .connection-pill {
    width: 30px;
    min-width: 30px;

    justify-content: center;

    padding: 0;
  }


  .connection-pill .live-label {
    display: none;
  }


  .page-content {
    padding:
      14px 12px
      28px;
  }


  .card,
  .card2,
  .app-section {
    padding: 14px;

    border-radius: 13px;
  }


  .grid,
  .grid3,
  .admin-grid,
  .form-grid {
    gap: 11px;
  }

}



/* =========================================================
   TRUEVINE MOBILE NAV HARDENING V1
   ========================================================= */

@media (max-width: 900px) {

  /*
   * Keep the hamburger independent from individual page
   * layouts. Dispatch and other dense screens can no longer
   * cover it or push it off-screen.
   */
  #menuButton.mobile-menu {
    display: grid !important;

    position: fixed !important;

    top: calc(
      env(safe-area-inset-top, 0px)
      + 12px
    );

    left: calc(
      env(safe-area-inset-left, 0px)
      + 12px
    );

    z-index: 10020 !important;

    width: 44px !important;
    height: 44px !important;
    min-width: 44px !important;
    min-height: 44px !important;

    margin: 0 !important;
    padding: 0 !important;

    border: 1px solid
      rgba(21, 93, 61, .18) !important;

    border-radius: 12px !important;

    background:
      rgba(255,255,255,.97) !important;

    color: #155d3d !important;

    box-shadow:
      0 5px 18px
      rgba(15, 40, 25, .16) !important;

    opacity: 1 !important;
    visibility: visible !important;

    pointer-events: auto !important;

    touch-action: manipulation;

    -webkit-tap-highlight-color:
      transparent;
  }


  #menuButton.mobile-menu svg {
    width: 22px;
    height: 22px;

    pointer-events: none;
  }


  /*
   * Leave room for the fixed menu button so the page title
   * does not sit underneath it.
   */
  .topbar {
    padding-left:
      calc(
        env(safe-area-inset-left, 0px)
        + 68px
      ) !important;
  }


  /*
   * Sidebar must live above every page-specific component,
   * calendar, drawer, map, etc.
   */
  #sidebar.sidebar {
    z-index: 10010 !important;

    left: calc(
      -1 * (
        var(--tv-sidebar-width)
        + 24px
      )
    ) !important;

    width:
      min(
        var(--tv-sidebar-width),
        calc(100vw - 42px)
      ) !important;

    padding-top:
      calc(
        env(safe-area-inset-top, 0px)
        + 14px
      ) !important;

    padding-bottom:
      calc(
        env(safe-area-inset-bottom, 0px)
        + 12px
      ) !important;

    transition:
      left .2s ease !important;
  }


  #sidebar.sidebar.open {
    left: 0 !important;
  }


  #sidebarScrim.sidebar-scrim {
    position: fixed !important;
    inset: 0 !important;

    z-index: 10000 !important;

    display: block !important;

    opacity: 0;

    pointer-events: none;
  }


  #sidebarScrim.sidebar-scrim.open {
    opacity: 1 !important;

    pointer-events: auto !important;
  }


  body.tv-mobile-menu-open {
    overflow: hidden !important;
    overscroll-behavior: none;
  }

}


@media (max-width: 480px) {

  #menuButton.mobile-menu {
    top: calc(
      env(safe-area-inset-top, 0px)
      + 10px
    );

    left: calc(
      env(safe-area-inset-left, 0px)
      + 10px
    );
  }

}

/* =========================================================
   TRUEVINE MOBILE NAV STACKING FIX V2
   ========================================================= */

@media (max-width: 900px) {

  /*
   * Remove stacking-context surprises from the shell.
   */
  .app-shell,
  .app-main,
  .page-content,
  .topbar {
    isolation: auto !important;
  }


  /*
   * Force the mobile navigation into the highest practical
   * application layer.
   */
  #sidebar.sidebar {
    position: fixed !important;

    z-index: 2147483646 !important;

    transform: none !important;
    filter: none !important;

    isolation: isolate !important;

    box-shadow:
      18px 0 60px
      rgba(0,0,0,.32) !important;
  }


  #sidebarScrim.sidebar-scrim {
    position: fixed !important;

    inset: 0 !important;

    z-index: 2147483645 !important;

    transform: none !important;

    background:
      rgba(8,20,14,.58) !important;

    backdrop-filter:
      blur(3px) !important;

    -webkit-backdrop-filter:
      blur(3px) !important;
  }


  /*
   * The hamburger remains above the scrim/sidebar edge so it
   * can still act as the menu toggle.
   */
  #menuButton.mobile-menu {
    z-index: 2147483647 !important;
  }


  /*
   * Common page-level elements that may otherwise compete
   * with the shell navigation.
   */
  .calendar-shell,
  .dispatch-shell,
  .dispatch-board,
  .calendar-grid,
  .owner-dashboard,
  .invoice-drawer,
  .invoice-modal,
  .modal-backdrop,
  .drawer,
  .sheet,
  .sticky,
  [class*="sticky"] {
    z-index: auto;
  }

}



/* ==========================================================
   TRUE VINE MOBILE NAVIGATION PORTAL
   Viewport-level mobile drawer
   ========================================================== */

@media (max-width: 900px) {

  body.tv-mobile-shell {
    position: relative;
  }

  body.tv-mobile-menu-open {
    overflow: hidden !important;
    overscroll-behavior: none;
    touch-action: none;
  }

  body.tv-mobile-shell > #sidebar {
    position: fixed !important;
    top: 0 !important;
    bottom: 0 !important;
    left: 0 !important;

    width: min(86vw, 310px) !important;
    height: 100dvh !important;
    max-height: 100dvh !important;

    margin: 0 !important;

    transform: translate3d(-105%, 0, 0) !important;
    transition:
      transform .22s cubic-bezier(.2,.8,.2,1),
      box-shadow .22s ease !important;

    z-index: 10001 !important;

    overflow: hidden !important;
    isolation: isolate !important;

    box-shadow: none !important;

    visibility: hidden;
    pointer-events: none;
  }

  body.tv-mobile-shell > #sidebar.open {
    transform: translate3d(0, 0, 0) !important;

    visibility: visible;
    pointer-events: auto;

    box-shadow:
      18px 0 55px rgba(3, 18, 10, .34) !important;
  }

  body.tv-mobile-shell > #sidebarScrim {
    display: block !important;

    position: fixed !important;
    inset: 0 !important;

    width: 100vw !important;
    height: 100dvh !important;

    margin: 0 !important;

    background: rgba(5, 18, 11, .52) !important;
    backdrop-filter: blur(2px);
    -webkit-backdrop-filter: blur(2px);

    opacity: 0 !important;
    visibility: hidden;
    pointer-events: none;

    transition:
      opacity .2s ease,
      visibility .2s ease !important;

    z-index: 10000 !important;
  }

  body.tv-mobile-shell > #sidebarScrim.open {
    opacity: 1 !important;
    visibility: visible;
    pointer-events: auto;
  }

  /*
   * The hamburger stays above the normal application UI,
   * but below the opened drawer.
   */
  #menuButton {
    position: relative !important;
    z-index: 9999 !important;
  }

  /*
   * Once the drawer opens, it owns the viewport.
   */
  body.tv-mobile-menu-open #menuButton {
    pointer-events: none;
  }

  /*
   * Keep sidebar contents usable on short screens.
   */
  body.tv-mobile-shell > #sidebar .sidebar-scroll {
    min-height: 0;
    overflow-y: auto !important;
    overflow-x: hidden !important;
    overscroll-behavior: contain;
    -webkit-overflow-scrolling: touch;
  }
}


/* =========================================================
   PIXEL / CHROMIUM MOBILE DRAWER COMPOSITING FIX
   ========================================================= */

@media (max-width: 900px) {

  /*
   * Do not use transforms for the application navigation.
   *
   * Some Android Chromium/WebView builds can composite a
   * transformed fixed element underneath other accelerated
   * page layers even with a higher z-index.
   */
  body.tv-mobile-shell > #sidebar {
    position: fixed !important;

    top: 0 !important;
    bottom: 0 !important;

    left: -320px !important;

    width: min(86vw, 310px) !important;
    height: 100dvh !important;

    transform: none !important;
    translate: none !important;

    filter: none !important;
    backdrop-filter: none !important;
    -webkit-backdrop-filter: none !important;

    contain: none !important;
    isolation: auto !important;

    will-change: auto !important;

    opacity: 1 !important;

    visibility: visible !important;
    pointer-events: none !important;

    z-index: 100001 !important;

    transition:
      left .22s cubic-bezier(.2,.8,.2,1) !important;
  }


  body.tv-mobile-shell > #sidebar.open {
    left: 0 !important;

    transform: none !important;

    pointer-events: auto !important;

    box-shadow:
      20px 0 55px
      rgba(3,18,10,.35) !important;
  }


  body.tv-mobile-shell > #sidebarScrim {
    position: fixed !important;

    inset: 0 !important;

    width: 100vw !important;
    height: 100dvh !important;

    transform: none !important;

    filter: none !important;

    /*
     * Deliberately avoid backdrop-filter here.
     * A solid translucent layer is much more reliable on
     * Android WebView and Pixel Chromium.
     */
    backdrop-filter: none !important;
    -webkit-backdrop-filter: none !important;

    contain: none !important;
    isolation: auto !important;

    background:
      rgba(5,18,11,.58) !important;

    opacity: 0 !important;
    visibility: hidden !important;

    pointer-events: none !important;

    z-index: 100000 !important;

    transition:
      opacity .18s ease,
      visibility .18s ease !important;
  }


  body.tv-mobile-shell > #sidebarScrim.open {
    opacity: 1 !important;
    visibility: visible !important;

    pointer-events: auto !important;
  }


  /*
   * Page content should never compete with the application
   * navigation layer.
   */
  body.tv-mobile-menu-open .app-shell,
  body.tv-mobile-menu-open .app-main,
  body.tv-mobile-menu-open .page-content {
    isolation: auto !important;
  }


  /*
   * Don't allow individual page components to establish a
   * ridiculous application-level z layer while the drawer
   * is open.
   */
  body.tv-mobile-menu-open
  .app-main
  :is(
    .dispatch-calendar,
    .dispatch-grid,
    .dispatch-head,
    .dispatch-layout,
    .dispatch-pool,
    .admin-module-bar,
    .save-feedback
  ) {
    z-index: auto !important;
  }

}


/* =========================================================
   DISPATCH VIEWPORT-SAFE MODALS
   Prevent long scheduling/customer forms from running
   below the visible screen.
   ========================================================= */

.dispatch-modal {
  position: fixed !important;
  inset: 0 !important;

  display: flex;
  align-items: center;
  justify-content: center;

  padding: 18px;

  overflow: hidden !important;

  z-index: 2000;
}

.dispatch-modal[hidden] {
  display: none !important;
}


/*
 * The actual dialog never grows taller than the viewport.
 */
.dispatch-modal .dispatch-modal-dialog {
  position: relative;

  width: min(620px, 100%);

  max-height: calc(100dvh - 36px) !important;

  display: flex;
  flex-direction: column;

  overflow-y: auto !important;
  overflow-x: hidden !important;

  overscroll-behavior: contain;

  -webkit-overflow-scrolling: touch;

  background: #fff;

  scrollbar-width: thin;
  scrollbar-color: #b8c8bf transparent;
}


/*
 * Keep the title accessible while scrolling through a
 * long customer/job form.
 */
.dispatch-modal .dispatch-modal-header {
  position: sticky !important;
  top: 0 !important;

  z-index: 8 !important;

  flex: 0 0 auto;

  margin: 0 !important;
  padding-top: 4px;
  padding-bottom: 13px;

  background: #fff;

  border-bottom: 1px solid #e6ebe8;
}


/*
 * Form itself may shrink inside the constrained dialog.
 */
.dispatch-modal form {
  min-height: 0;
}


/*
 * The action area stays visible at the bottom, so Save,
 * Schedule, Cancel, etc. never disappear off-screen.
 */
.dispatch-modal .dispatch-modal-actions {
  position: sticky;

  bottom: 0;

  z-index: 7;

  margin-top: 18px;

  padding-top: 13px;
  padding-bottom: 4px;

  background: #fff;

  border-top: 1px solid #e6ebe8;

  box-shadow:
    0 -8px 18px rgba(18, 40, 28, .035);
}


/* ---------------------------------------------------------
   PHONE / SHORT SCREEN
   --------------------------------------------------------- */

@media (max-width: 700px) {

  .dispatch-modal {
    align-items: flex-end;

    padding:
      10px
      10px
      max(10px, env(safe-area-inset-bottom));
  }


  .dispatch-modal .dispatch-modal-dialog {
    width: 100% !important;

    max-width: none !important;

    max-height:
      calc(
        100dvh
        - 20px
        - env(safe-area-inset-top)
      ) !important;

    border-radius: 18px 18px 12px 12px !important;
  }


  .dispatch-modal .dispatch-modal-header {
    padding-top: 10px;
  }


  .dispatch-modal-fields {
    grid-template-columns: 1fr !important;
  }


  .dispatch-modal .dispatch-modal-actions {
    gap: 8px;

    padding-bottom:
      max(
        8px,
        env(safe-area-inset-bottom)
      );
  }

}


/*
 * Also handle laptops/tablets with limited vertical space.
 */
@media (max-height: 700px) {

  .dispatch-modal {
    align-items: flex-start;

    padding-top: 10px;
    padding-bottom: 10px;
  }


  .dispatch-modal .dispatch-modal-dialog {
    max-height: calc(100dvh - 20px) !important;
  }

}


/* =========================================================
   DISPATCH MODAL — VISIBLE SCROLLBAR
   ========================================================= */

.dispatch-modal .dispatch-modal-dialog {
  overflow-y: scroll !important;
  scrollbar-gutter: stable;
}


/* Firefox */
.dispatch-modal .dispatch-modal-dialog {
  scrollbar-width: auto !important;
  scrollbar-color:
    #7f9488
    #eef3f0 !important;
}


/* Chrome / Edge / Android WebView */
.dispatch-modal .dispatch-modal-dialog::-webkit-scrollbar {
  width: 14px;
}


.dispatch-modal .dispatch-modal-dialog::-webkit-scrollbar-track {
  background: #eef3f0;

  border-left:
    1px solid #dfe7e2;

  border-radius:
    0 12px 12px 0;
}


.dispatch-modal .dispatch-modal-dialog::-webkit-scrollbar-thumb {
  background: #83988c;

  border:
    3px solid #eef3f0;

  border-radius: 999px;

  min-height: 48px;
}


.dispatch-modal .dispatch-modal-dialog::-webkit-scrollbar-thumb:hover {
  background: #60766a;
}


/*
 * Make it visually obvious that additional content exists.
 */
.dispatch-modal .dispatch-modal-dialog::after {
  content: "";

  position: sticky;

  display: block;

  bottom: 0;

  height: 1px;
}


/*
 * Mobile: keep touch scrolling smooth.
 */
@media (max-width: 700px) {

  .dispatch-modal .dispatch-modal-dialog {
    overflow-y: auto !important;

    -webkit-overflow-scrolling: touch;

    touch-action: pan-y;
  }


  .dispatch-modal .dispatch-modal-dialog::-webkit-scrollbar {
    width: 8px;
  }

}



/* =========================================================
   TRUEVINE MOBILE NAV — FINAL AUTHORITATIVE LAYER
   ========================================================= */

@media (max-width: 900px) {

  /* Sidebar is portaled directly under body by ops-shell.js */
  body.tv-mobile-shell > #sidebar.sidebar {
    position: fixed !important;

    top: 0 !important;
    bottom: 0 !important;

    left: calc(
      -1 * (
        var(--tv-sidebar-width)
        + 30px
      )
    ) !important;

    width: min(
      var(--tv-sidebar-width),
      calc(100vw - 42px)
    ) !important;

    height: 100dvh !important;

    z-index: 1002 !important;

    transform: none !important;
    isolation: auto !important;

    overflow: hidden !important;

    padding-top: max(
      14px,
      env(safe-area-inset-top)
    ) !important;

    padding-bottom: max(
      12px,
      env(safe-area-inset-bottom)
    ) !important;

    transition: left .2s ease !important;

    box-shadow:
      18px 0 50px
      rgba(0,0,0,.28) !important;
  }


  body.tv-mobile-shell > #sidebar.sidebar.open {
    left: 0 !important;
  }


  /* Overlay belongs immediately below sidebar */
  body.tv-mobile-shell > #sidebarScrim.sidebar-scrim {
    display: block !important;

    position: fixed !important;
    inset: 0 !important;

    z-index: 1001 !important;

    opacity: 0 !important;
    visibility: hidden !important;
    pointer-events: none !important;

    background: rgba(6,20,12,.44) !important;

    transform: none !important;

    transition:
      opacity .18s ease,
      visibility .18s ease !important;
  }


  body.tv-mobile-shell > #sidebarScrim.sidebar-scrim.open {
    opacity: 1 !important;
    visibility: visible !important;
    pointer-events: auto !important;
  }


  /* Hamburger stays above normal page UI but BELOW an open nav */
  #menuButton.mobile-menu {
    display: grid !important;
    place-items: center !important;

    position: fixed !important;

    top: calc(
      env(safe-area-inset-top, 0px)
      + 12px
    ) !important;

    left: calc(
      env(safe-area-inset-left, 0px)
      + 12px
    ) !important;

    width: 44px !important;
    height: 44px !important;

    z-index: 1000 !important;

    margin: 0 !important;
    padding: 0 !important;

    opacity: 1 !important;
    visibility: visible !important;

    pointer-events: auto !important;
    touch-action: manipulation;
  }


  /*
   * Once menu is open, sidebar/scrim own the interaction.
   * This prevents hamburger from floating over the menu.
   */
  body.tv-mobile-menu-open #menuButton.mobile-menu {
    pointer-events: none !important;
  }


  body.tv-mobile-menu-open {
    overflow: hidden !important;
    overscroll-behavior: none !important;
  }


  /* Prevent topbar text from sitting underneath fixed hamburger */
  .topbar {
    padding-left: calc(
      env(safe-area-inset-left, 0px)
      + 68px
    ) !important;
  }

}


/* =========================================================
   TRUEVINE MOBILE NAV — PHONE WIDTH CORRECTION
   ========================================================= */

@media (max-width: 900px) {

  body.tv-mobile-shell > #sidebar.sidebar {
    width: min(86vw, 360px) !important;
    max-width: none !important;

    left: min(-86vw, -360px) !important;

    overflow-x: hidden !important;
    overflow-y: auto !important;
  }

  body.tv-mobile-shell > #sidebar.sidebar.open {
    left: 0 !important;
  }

  /*
   * Hide the page hamburger while the drawer is open.
   * The scrim closes the drawer by tapping outside it.
   */
  body.tv-mobile-menu-open #menuButton.mobile-menu {
    opacity: 0 !important;
    visibility: hidden !important;
    pointer-events: none !important;
  }

}


/* =========================================================
   TRUEVINE WEBVIEW VIEWPORT FALLBACK
   ========================================================= */

@media (max-width: 900px) {

  body.tv-mobile-shell > #sidebar.sidebar {
    height: var(--tv-runtime-vh, 100vh) !important;
    max-height: var(--tv-runtime-vh, 100vh) !important;
    min-height: var(--tv-runtime-vh, 100vh) !important;

    display: flex !important;
    flex-direction: column !important;
  }

  body.tv-mobile-shell > #sidebar .sidebar-brand-row {
    flex: 0 0 auto !important;
  }

  body.tv-mobile-shell > #sidebar .sidebar-scroll {
    flex: 1 1 auto !important;
    min-height: 0 !important;

    overflow-y: auto !important;
    overflow-x: hidden !important;
  }

  body.tv-mobile-shell > #sidebar .sidebar-footer {
    flex: 0 0 auto !important;
  }

  body.tv-mobile-shell > #sidebarScrim.sidebar-scrim {
    height: var(--tv-runtime-vh, 100vh) !important;
  }

}
