/* Measured-reference Explore layout. Dense controls, independent panel scrolling. */
.ex-page{height:calc(100dvh - var(--nav-h,49px));display:flex;flex-direction:column;background:var(--surface);color:var(--text);overflow:hidden;font-family:Roboto,Arial,sans-serif}
.ex-topbar{min-height:64px;display:flex;align-items:center;gap:16px;padding:12px 16px;border-bottom:1px solid var(--border);flex-shrink:0}
.ex-topbar h1{font:500 20px/1.3 Roboto,Arial,sans-serif;margin:0;max-width:360px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ex-topmeta{display:flex;gap:8px;align-items:center;color:var(--text-2);font-size:12px;white-space:nowrap}
.ex-topmeta svg{flex-shrink:0}
.ex-top-actions{display:flex;gap:8px;align-items:center;margin-left:auto}
.ex-save-state{font-size:12px;color:var(--text-2)}
.ex-save-state.dirty{color:#c6a85b}
.ex-layout{display:grid;grid-template-columns:280px 320px minmax(0,1fr);flex:1;min-height:0}
.ex-source,.ex-controls,.ex-output{min-width:0;min-height:0}
.ex-source{display:flex;flex-direction:column;border-right:1px solid var(--border)}
.ex-panel-title{height:44px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;font-size:12px;font-weight:500}
.ex-minor{font-size:12px;font-weight:400;color:var(--text-2)}
.ex-source-dataset{width:100%;min-height:56px;display:flex;align-items:center;gap:10px;padding:12px 16px;background:none;border:0;border-bottom:1px solid var(--border);text-align:left;color:var(--text);cursor:pointer;font-size:13px}
.ex-source-dataset span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}
.ex-source-dataset svg{flex-shrink:0}
.ex-source-dataset:hover{background:var(--hover)}
.ex-search{height:32px;display:flex;align-items:center;gap:8px;border:1px solid var(--border);border-radius:6px;padding:0 10px;background:var(--surface)}
.ex-search input{border:0;background:none;outline:none;width:100%;min-width:0;height:100%;font:400 12px Roboto;color:var(--text)}
.ex-search:focus-within{border-color:var(--link);box-shadow:0 0 0 1px var(--primary-bg)}
.ex-search>span{color:var(--text-2);display:flex}
.ex-source>.ex-search{margin:20px 16px 12px}
.ex-fields{overflow-y:auto;overscroll-behavior:contain;min-height:0;flex:1}
.ex-field-group{padding:16px;border-bottom:1px solid var(--border)}
.ex-field-group summary{font-size:13px;font-weight:500;cursor:pointer;list-style:none}
.ex-field-group summary:after{content:'⌃';float:right;color:var(--text-2)}
.ex-field-group:not([open]) summary:after{content:'⌄'}
.ex-field-count{font-size:12px;color:var(--text-2);margin:12px 0}
.ex-field{display:flex;align-items:center;gap:8px;background:var(--bg);border:1px solid transparent;border-radius:4px;width:100%;height:26px;padding:0 6px;text-align:left;font-size:12px;color:var(--text);margin:6px 0;cursor:grab}
.ex-field>span:not(.ex-type){overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}
.ex-field>svg:last-child{margin-left:auto;color:var(--text-2);flex-shrink:0}
.ex-field:hover{border-color:var(--link)}
.ex-type{display:inline-flex;align-items:center;justify-content:center;min-width:14px;color:var(--text-2);font-size:12px;flex-shrink:0}
.ex-abc{font-size:9px}
.ex-source-footer{font-size:12px;padding:12px 16px;color:var(--text-2);border-top:1px solid var(--border)}
.ex-controls{display:flex;flex-direction:column;border-right:1px solid var(--border)}
.ex-control-tabs{height:46px;flex-shrink:0;display:flex;align-items:stretch;border-bottom:1px solid var(--border);padding:0 12px;gap:8px}
.ex-control-tabs>button,.ex-results-tabs>button{border:0;border-bottom:2px solid transparent;color:var(--text-2);background:none;font:400 12px Roboto;padding:0 8px;cursor:pointer;white-space:nowrap}
.ex-control-tabs>button.active,.ex-results-tabs>button.active{color:var(--link);border-bottom-color:var(--link)}
.ex-disabled{color:var(--text-3);cursor:not-allowed;font-size:12px;display:flex;align-items:center;gap:5px}
.ex-disabled small{border:1px solid var(--border);border-radius:4px;padding:2px 5px;font-size:11px}
.ex-viz-selector{padding:12px 16px 14px;border-bottom:1px solid var(--border);flex-shrink:0}
.ex-viz-strip{display:flex;align-items:center;gap:3px}
.ex-viz-strip button{display:flex;align-items:center;gap:5px;border:1px solid transparent;background:none;color:var(--text-2);border-radius:4px;min-width:24px;height:28px;justify-content:center;padding:0 3px;cursor:pointer}
.ex-viz-strip button.active{background:var(--bg);border-color:var(--border);color:var(--text)}
.ex-viz-strip button span{font-size:12px;max-width:55px;overflow:hidden;text-overflow:ellipsis}
.ex-viz-strip button:hover{color:var(--link)}
.ex-viz-n{font-weight:500}
.ex-link{padding:0;background:none;border:0;color:var(--link);font-size:12px;text-decoration:underline;cursor:pointer}
.ex-viz-all{display:block;margin:8px 0 0 auto;color:var(--text-2)}
.ex-control-scroll{overflow-y:auto;flex:1;min-height:0;overscroll-behavior:contain}
.ex-section{padding:0 16px 16px;border-bottom:1px solid var(--border)}
.ex-section>summary{display:flex;align-items:center;justify-content:space-between;padding:20px 0 8px;font-size:13px;font-weight:400;cursor:pointer;list-style:none}
.ex-section>summary span{color:var(--text-2)}
.ex-section:not([open]){padding-bottom:12px}
.ex-section:not([open])>summary span{transform:rotate(180deg)}
.ex-control{display:block;margin-top:14px;color:var(--text)}
.ex-control>span{display:block;margin-bottom:6px;font-size:12px}
.ex-control input,.ex-control select{width:100%;min-height:34px;padding:6px 10px;background:var(--surface);border:1px solid var(--border);border-radius:5px;color:var(--text);font:400 13px Roboto}
.ex-control select{appearance:auto}
.ex-control select option{color:var(--text);background:var(--surface)}
.ex-control input:focus,.ex-control select:focus{outline:none;border-color:var(--link);box-shadow:0 0 0 1px var(--primary-bg)}
.ex-required{color:var(--danger);display:inline!important}
.ex-dropzone{background:var(--surface);border:1px dashed #4b4b4b;border-radius:4px;padding:4px;min-height:34px}
.ex-dropzone.over{border-color:var(--link);background:var(--primary-bg)}
.ex-pill{display:flex;align-items:center;gap:0;border:1px solid var(--border);border-radius:4px;background:var(--bg);height:28px;margin:0 0 3px;overflow:hidden}
.ex-pill>button{background:none;border:0;display:flex;align-items:center;color:var(--text-2);height:100%;padding:0 4px;cursor:pointer}
.ex-pill-value{flex:1;gap:6px;min-width:0;color:var(--text)!important;font:400 12px Roboto}
.ex-pill-value>span:nth-child(2){overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;flex:1}
.ex-pill-value>svg:last-child{border-left:1px solid var(--border);width:18px;height:18px;color:var(--text-2);flex-shrink:0}
.ex-pill:hover{border-color:var(--link)}
.ex-drop-add{display:flex;align-items:center;gap:5px;width:100%;border:0;padding:3px 0;background:none;color:var(--text-2);font:400 12px Roboto;text-align:left;cursor:pointer}
.ex-drop-add svg{flex-shrink:0}
.ex-drop-add:hover{color:var(--link)}
.ex-date-control{background:var(--bg);border:1px solid var(--border);border-radius:4px;display:flex;align-items:center;gap:6px;width:100%;padding:7px;font-size:12px;color:var(--text);cursor:pointer}
.ex-date-control span{flex:1;min-width:0;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ex-run-footer{padding:12px 16px;border-top:1px solid var(--border);background:var(--surface);flex-shrink:0}
.ex-run-footer>.btn{width:100%;justify-content:center;height:34px}
.ex-validation{color:#ea8b90;font-size:12px;line-height:1.4}
.ex-validation:not(:empty){margin-bottom:10px}
.ex-help{font-size:12px;color:var(--text-2);line-height:1.55;margin:12px 0 0}
.ex-check{display:flex;align-items:center;gap:8px;font-size:13px;margin-top:14px}
.ex-check input{accent-color:var(--primary);width:14px;height:14px}
.ex-palette-swatch{display:flex;gap:2px;margin-top:8px}
.ex-palette-swatch i{flex:1;height:10px}
.ex-output{display:flex;flex-direction:column;background:var(--surface);overflow:hidden;position:relative}
.ex-query-status{display:flex;align-items:center;gap:8px;min-height:40px;padding:8px 16px;flex-shrink:0}
.ex-query-status>span{font-size:12px;border:1px solid var(--border);padding:2px 8px;border-radius:4px;color:var(--text-2)}
.ex-query-status>strong{font-size:12px;font-weight:400;margin-left:auto;color:var(--text-2)}
.ex-status-sample{border:0!important}
.ex-chart-area{min-height:180px;flex:1;padding:8px 16px 0}
.ex-chart{height:100%;width:100%;min-height:160px;position:relative}
.ex-chart>div{max-width:100%}
.ex-query-footer{text-align:right;color:var(--text-2);font-size:12px;padding:8px 16px;min-height:32px}
.ex-pending{font-size:12px;color:#d8c398;padding:8px 16px;background:rgba(189,147,62,.08);border-block:1px solid rgba(189,147,62,.15)}
.ex-pending[hidden]{display:none}
.ex-pending button{background:none;border:0;color:var(--link);text-decoration:underline;font:inherit;cursor:pointer}
.ex-results{height:31%;min-height:210px;max-height:350px;display:flex;flex-direction:column;flex-shrink:0;border-top:1px solid var(--border)}
.ex-results-tabs{height:40px;display:flex;padding:0 16px;gap:12px;flex-shrink:0}
.ex-result-toolbar{display:flex;align-items:center;gap:12px;padding:8px 16px;flex-shrink:0}
.ex-result-toolbar .ex-search{max-width:200px;flex:1}
.ex-result-toolbar select{margin-left:auto;border:1px solid var(--border);background:var(--surface);padding:5px 8px;color:var(--text);font-size:12px;border-radius:5px}
.ex-result-count{font-size:12px;color:var(--text-2);white-space:nowrap}
.ex-result-grid{min-height:0;flex:1;overflow:auto;margin:0 16px;overscroll-behavior:contain}
.ex-result-grid table{width:100%;border-collapse:collapse;font:400 12px Roboto}
.ex-result-grid th{background:var(--surface-2);position:sticky;top:0;z-index:1;text-align:left;white-space:nowrap;border:1px solid var(--border);padding:0}
.ex-result-grid th button{background:none;border:0;padding:8px 10px;color:var(--text);font:500 12px Roboto;cursor:pointer;display:flex;gap:12px;align-items:center;width:100%;text-align:left;white-space:nowrap}
.ex-result-grid th button span{color:var(--text-2);margin-left:auto}
.ex-result-grid td{padding:7px 10px;border:1px solid var(--border-soft);white-space:nowrap;max-width:280px;overflow:hidden;text-overflow:ellipsis}
.ex-result-grid tr:nth-child(even){background:rgba(255,255,255,.025)}
.ex-result-grid .ex-num{
  text-align:right;
  font-variant-numeric:var(--num-variant, tabular-nums lining-nums);
  font-feature-settings:var(--num-features, "tnum" 1, "lnum" 1);
  font-weight:var(--num-weight-table, 500);
}
.ex-result-grid .ex-rownum{width:32px;color:var(--text-2);text-align:right;font-size:11px;background:var(--surface-2)}
.ex-null{color:var(--text-3)}
.ex-no-results{padding:24px;color:var(--text-2);font-size:13px;text-align:center}
.ex-result-pagination{display:flex;align-items:center;justify-content:flex-end;gap:12px;padding:6px 16px;font-size:11px;color:var(--text-2);min-height:30px}
.ex-result-pagination>span:first-child{margin-right:auto}
.ex-result-pagination button{border:0;background:none;color:var(--text);font-size:18px;cursor:pointer}
.ex-result-pagination button:disabled{opacity:.25}
.ex-query-json{font:12px/1.5 'Roboto Mono',monospace;color:var(--text-2);margin:8px;white-space:pre-wrap}
.ex-empty{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px;text-align:center}
.ex-empty h2{font:500 18px Roboto;margin:0 0 12px}
.ex-empty p{font-size:13px;color:var(--text-2);max-width:420px;line-height:1.5;margin:0 0 16px}
.ex-modal-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.65);z-index:1000;display:flex;align-items:center;justify-content:center;padding:24px}
.ex-modal{width:460px;max-width:100%;max-height:90dvh;display:flex;flex-direction:column;background:var(--surface);border:1px solid #424242;border-radius:8px;box-shadow:0 12px 50px #0007;color:var(--text)}
.ex-modal.wide{width:680px}
.ex-modal>header{display:flex;align-items:center;padding:16px 20px;border-bottom:1px solid var(--border);gap:20px}
.ex-modal>header h2{font:500 16px Roboto;margin:0}
.ex-modal>header .icon-btn{margin-left:auto}
.ex-modal>form{min-height:0;display:flex;flex-direction:column;overflow:hidden}
.ex-modal-body{padding:0 20px 20px;overflow-y:auto;overscroll-behavior:contain}
.ex-modal footer{padding:12px 20px;display:flex;justify-content:flex-end;gap:8px;border-top:1px solid var(--border);flex-shrink:0}
.ex-modal .ex-control{margin-top:18px}
.ex-modal input,.ex-modal select{height:36px}
.ex-modal-error{font-size:12px;color:#ef9499;line-height:1.4}
.ex-modal-error:not(:empty){margin-top:12px}
.ex-editor-tabs{display:flex;gap:24px;border-bottom:1px solid var(--border);margin-top:16px;font-size:12px}
.ex-editor-tabs>span{padding:8px 0}
.ex-editor-tabs .active{border-bottom:2px solid var(--link);color:var(--link)}
.ex-field-actions{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.ex-modal-intro{margin:20px 0;font-size:13px}
.ex-ratio-metric[hidden],.ex-normal-metric[hidden],.ex-filter-value[hidden]{display:none}
@media(max-width:1200px){.ex-layout{grid-template-columns:236px 290px minmax(0,1fr)}.ex-topmeta{display:none}.ex-topbar h1{max-width:440px}.ex-query-status{gap:4px}.ex-status-sample{display:none}}
@media(max-width:850px){.ex-page{height:auto;overflow:visible}.ex-layout{grid-template-columns:220px minmax(0,1fr);height:auto;overflow:visible}.ex-output{grid-column:1/-1;height:760px;border-top:1px solid var(--border)}.ex-source,.ex-controls{max-height:650px}.ex-control-scroll{max-height:450px}.ex-chart-area{min-height:280px}.ex-results{height:280px}.ex-topbar{flex-wrap:wrap;gap:8px}.ex-topbar h1{font-size:17px;max-width:65vw}.ex-top-actions{margin-left:auto}.ex-save-state{display:none}}
@media(max-width:550px){.ex-layout{display:flex;flex-direction:column}.ex-source{max-height:260px;border-right:0;border-bottom:1px solid var(--border)}.ex-source-footer{display:none}.ex-source>.ex-search{margin:8px 16px}.ex-panel-title{min-height:32px}.ex-source-dataset{min-height:38px;padding-block:8px}.ex-controls{max-height:600px;border-right:0}.ex-control-scroll{max-height:340px}.ex-output{height:720px;min-height:720px}.ex-query-status>strong{display:none}.ex-results{height:280px}.ex-modal-backdrop{padding:12px}.ex-result-toolbar{gap:5px;padding-inline:10px}.ex-result-count{display:none}.ex-topbar h1{max-width:68vw;font-size:16px}.ex-topbar{padding:10px}.ex-top-actions{gap:2px}.ex-top-actions>.icon-btn{display:none}.ex-chart-area{padding-inline:8px}}
@media(prefers-reduced-motion:reduce){.ex-page *,.ex-modal-backdrop *{animation:none!important;transition:none!important}}

/* Explore mounts as a full-screen overlay on top of the app rather than as a
   routed page, so it has to own the viewport instead of flowing in the
   document. --nav-h is 0 here because nothing sits above it. The z-index is
   above the app topbar (950) and the floating chat (1000), measured live;
   without it the Close button is covered and unclickable. */
.ex-page{position:fixed;inset:0;z-index:2500;height:100dvh;--nav-h:0px;padding:0 !important}

/* The 850px and 550px blocks above were written for an in-flow page and set
   height:auto / overflow:visible, which a fixed overlay cannot use. Re-pin the
   overlay and let it scroll internally instead. */
@media(max-width:850px){
  .ex-page{position:fixed;inset:0;height:100dvh;overflow-y:auto;overflow-x:hidden;padding:0 !important}
  /* Stacked panels must size to their content and let the overlay scroll.
     Left as flex children of a flex:1 row they collapsed to about 40px and
     the output panel drew over them. */
  .ex-layout{display:flex;flex-direction:column;flex:none;height:auto;overflow:visible}
  .ex-source,.ex-controls,.ex-output{flex:none;height:auto;max-height:none;border-right:0;border-bottom:1px solid var(--border)}
  .ex-control-scroll{max-height:none}
  .ex-output{min-height:620px}
}
