precision-dashwidgets 0.5.3 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{deflate-CPNmBnej.mjs → deflate-CWMsNaIP.mjs} +1 -1
- package/dist/{index-DVfUy50r.mjs → index-BcD1Tq3k.mjs} +9 -9
- package/dist/index-CRAkqt4--CjLuTP7R.mjs +4 -0
- package/dist/{index-Dl_ufo4v.mjs → index-DO4LFgYW.mjs} +10 -11
- package/dist/index-GF8k2nCC-YcVLrhpY.mjs +4 -0
- package/dist/{index-Oh_goZGT-DPkK2gVA.mjs → index-Oh_goZGT-D_iJ69Xa.mjs} +2 -2
- package/dist/{index-UOUUzHJY-D0LsTUPc.mjs → index-UOUUzHJY-DpZrQbKK.mjs} +1 -1
- package/dist/{index-dhOjlnSX---XHbE5y.mjs → index-dhOjlnSX-DHPvHqj-.mjs} +1 -1
- package/dist/{index-u1qleOVs-BH1yx7WW.mjs → index-u1qleOVs-tGryEws8.mjs} +2 -2
- package/dist/{jpeg-CXAyIdl8.mjs → jpeg-C3vduWz0.mjs} +1 -1
- package/dist/{lerc-DmIa8s0n.mjs → lerc-B6ruXxE8.mjs} +2 -2
- package/dist/{lerc-XufrP0FH-Cp9B8C70.mjs → lerc-XufrP0FH-Bo-XWLp5.mjs} +1 -1
- package/dist/{lzw-Bh2N3zBo.mjs → lzw-Dk1_H9yl.mjs} +1 -1
- package/dist/{packbits-DaRNs4L0.mjs → packbits-BQGUlihL.mjs} +1 -1
- package/dist/precision-dashwidgets.es.js +1 -1
- package/dist/precision-dashwidgets.umd.js +1 -1
- package/dist/{raw-CommQb0l.mjs → raw-Wz54Va6q.mjs} +1 -1
- package/dist/style.css +1 -1
- package/dist/{webimage-BKZpDwde.mjs → webimage-CogaMRxe.mjs} +1 -1
- package/package.json +1 -1
- package/dist/index-CRAkqt4--BsX7X3Wy.mjs +0 -4
- package/dist/index-GF8k2nCC-rI2ZXyL4.mjs +0 -4
|
@@ -2,7 +2,7 @@ var Ky = Object.defineProperty;
|
|
|
2
2
|
var Oy = (t, A, e) => A in t ? Ky(t, A, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[A] = e;
|
|
3
3
|
var f = (t, A, e) => Oy(t, typeof A != "symbol" ? A + "" : A, e);
|
|
4
4
|
import { defineComponent as pC, ref as ee, watch as jI, onMounted as Hf, onUnmounted as Yf, openBlock as Ne, createElementBlock as ve, unref as Bo, createElementVNode as _A, createCommentVNode as vt, toDisplayString as Mo, Fragment as Wy, createVNode as Vy, nextTick as zy, normalizeStyle as Xy, computed as ll, createTextVNode as El, normalizeClass as jy } from "vue";
|
|
5
|
-
import { g as Zy } from "./index-
|
|
5
|
+
import { g as Zy } from "./index-DO4LFgYW.mjs";
|
|
6
6
|
function sa(t, A) {
|
|
7
7
|
if (!t)
|
|
8
8
|
throw new Error(A || "loader assertion failed.");
|
|
@@ -28949,19 +28949,19 @@ const U0 = {
|
|
|
28949
28949
|
function Ht(t, A) {
|
|
28950
28950
|
Array.isArray(t) || (t = [t]), t.forEach((e) => Jk.set(e, A));
|
|
28951
28951
|
}
|
|
28952
|
-
Ht([void 0, 1], () => import("./raw-
|
|
28953
|
-
Ht(5, () => import("./lzw-
|
|
28952
|
+
Ht([void 0, 1], () => import("./raw-Wz54Va6q.mjs").then((t) => t.default));
|
|
28953
|
+
Ht(5, () => import("./lzw-Dk1_H9yl.mjs").then((t) => t.default));
|
|
28954
28954
|
Ht(6, () => {
|
|
28955
28955
|
throw new Error("old style JPEG compression is not supported.");
|
|
28956
28956
|
});
|
|
28957
|
-
Ht(7, () => import("./jpeg-
|
|
28958
|
-
Ht([8, 32946], () => import("./deflate-
|
|
28959
|
-
Ht(32773, () => import("./packbits-
|
|
28957
|
+
Ht(7, () => import("./jpeg-C3vduWz0.mjs").then((t) => t.default));
|
|
28958
|
+
Ht([8, 32946], () => import("./deflate-CWMsNaIP.mjs").then((t) => t.default));
|
|
28959
|
+
Ht(32773, () => import("./packbits-BQGUlihL.mjs").then((t) => t.default));
|
|
28960
28960
|
Ht(
|
|
28961
28961
|
34887,
|
|
28962
|
-
() => import("./lerc-
|
|
28962
|
+
() => import("./lerc-B6ruXxE8.mjs").then(async (t) => (await t.zstd.init(), t)).then((t) => t.default)
|
|
28963
28963
|
);
|
|
28964
|
-
Ht(50001, () => import("./webimage-
|
|
28964
|
+
Ht(50001, () => import("./webimage-CogaMRxe.mjs").then((t) => t.default));
|
|
28965
28965
|
function Hk(t, A) {
|
|
28966
28966
|
let e = t.length - A, i = 0;
|
|
28967
28967
|
do {
|
|
@@ -44756,7 +44756,7 @@ Si([8, 32946], () => import("./deflate-DbhbvOaP-D8NSBt31.mjs").then((t) => t.def
|
|
|
44756
44756
|
Si(32773, () => import("./packbits-BuzK6gM3-6Um4hupZ.mjs").then((t) => t.default));
|
|
44757
44757
|
Si(
|
|
44758
44758
|
34887,
|
|
44759
|
-
() => import("./lerc-XufrP0FH-
|
|
44759
|
+
() => import("./lerc-XufrP0FH-Bo-XWLp5.mjs").then(async (t) => (await t.zstd.init(), t)).then((t) => t.default)
|
|
44760
44760
|
);
|
|
44761
44761
|
Si(50001, () => import("./webimage--SJddlky-F_hESl4q.mjs").then((t) => t.default));
|
|
44762
44762
|
function xg(t, A, e, i = 1) {
|
|
@@ -5750,31 +5750,31 @@ const nR = { class: "markdown-header" }, rR = {
|
|
|
5750
5750
|
}
|
|
5751
5751
|
}), T6 = /* @__PURE__ */ Gs(vR, [["__scopeId", "data-v-4007de4f"]]);
|
|
5752
5752
|
Ga(
|
|
5753
|
-
() => import("./index-u1qleOVs-
|
|
5753
|
+
() => import("./index-u1qleOVs-tGryEws8.mjs").then((e) => e.DataExplorer)
|
|
5754
5754
|
);
|
|
5755
5755
|
Ga(
|
|
5756
|
-
() => import("./index-Oh_goZGT-
|
|
5756
|
+
() => import("./index-Oh_goZGT-D_iJ69Xa.mjs").then((e) => e.UMAP)
|
|
5757
5757
|
);
|
|
5758
5758
|
Ga(
|
|
5759
|
-
() => import("./index-GF8k2nCC-
|
|
5759
|
+
() => import("./index-GF8k2nCC-YcVLrhpY.mjs").then((e) => e.Markdown)
|
|
5760
5760
|
);
|
|
5761
5761
|
Ga(
|
|
5762
|
-
() => import("./index-CRAkqt4--
|
|
5762
|
+
() => import("./index-CRAkqt4--CjLuTP7R.mjs").then((e) => e.TextViewer)
|
|
5763
5763
|
);
|
|
5764
5764
|
Ga(
|
|
5765
|
-
() => import("./index-dhOjlnSX
|
|
5765
|
+
() => import("./index-dhOjlnSX-DHPvHqj-.mjs").then((e) => e.ProportionPlot)
|
|
5766
5766
|
);
|
|
5767
5767
|
Ga(
|
|
5768
|
-
() => import("./index-UOUUzHJY-
|
|
5768
|
+
() => import("./index-UOUUzHJY-DpZrQbKK.mjs").then((e) => e.AiPlotly)
|
|
5769
5769
|
);
|
|
5770
5770
|
Ga(
|
|
5771
5771
|
() => import("./core-l0sNRNKZ.mjs").then((e) => e.TSViewer)
|
|
5772
5772
|
);
|
|
5773
5773
|
Ga(
|
|
5774
|
-
() => import("./index-
|
|
5774
|
+
() => import("./index-BcD1Tq3k.mjs").then((e) => e.i).then((e) => e.OmeViewer)
|
|
5775
5775
|
);
|
|
5776
5776
|
Ga(
|
|
5777
|
-
() => import("./index-
|
|
5777
|
+
() => import("./index-BcD1Tq3k.mjs").then((e) => e.i).then((e) => e.TiffViewer)
|
|
5778
5778
|
);
|
|
5779
5779
|
const yR = "dashboard:globalVars";
|
|
5780
5780
|
function jo(e = !1) {
|
|
@@ -27291,8 +27291,7 @@ const a5 = { class: "gene-coexpression-viewer" }, s5 = { class: "viewer-left" },
|
|
|
27291
27291
|
"color",
|
|
27292
27292
|
"opacity",
|
|
27293
27293
|
"expr",
|
|
27294
|
-
"norm"
|
|
27295
|
-
"Donor_ID"
|
|
27294
|
+
"norm"
|
|
27296
27295
|
]);
|
|
27297
27296
|
return Object.keys(W).forEach((Qt) => {
|
|
27298
27297
|
!It.has(Qt) && W[Qt] !== null && W[Qt] !== void 0 && (xt[Qt] = W[Qt]);
|
|
@@ -27464,7 +27463,7 @@ const a5 = { class: "gene-coexpression-viewer" }, s5 = { class: "viewer-left" },
|
|
|
27464
27463
|
]))
|
|
27465
27464
|
]));
|
|
27466
27465
|
}
|
|
27467
|
-
}, H4 = /* @__PURE__ */ Va(q4, [["__scopeId", "data-v-
|
|
27466
|
+
}, H4 = /* @__PURE__ */ Va(q4, [["__scopeId", "data-v-7ea6fa01"]]), Y4 = { class: "side-by-side-wrap" }, W4 = "https://temp-precision-dashboard-data.s3.us-east-1.amazonaws.com/humandrg/v2", X4 = /* @__PURE__ */ Qr({
|
|
27468
27467
|
inheritAttrs: !1,
|
|
27469
27468
|
__name: "SideBySide",
|
|
27470
27469
|
props: {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { M as a } from "./index-
|
|
2
|
-
import { j as e, q as M, K as s, r as P } from "./index-
|
|
1
|
+
import { M as a } from "./index-DO4LFgYW.mjs";
|
|
2
|
+
import { j as e, q as M, K as s, r as P } from "./index-DO4LFgYW.mjs";
|
|
3
3
|
export {
|
|
4
4
|
a as UMAP,
|
|
5
5
|
e as UMAPControlPanel,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineComponent as y, ref as t, openBlock as u, createElementBlock as c, createElementVNode as l, withDirectives as p, vModelText as r, withKeys as b, createCommentVNode as k } from "vue";
|
|
2
|
-
import { k as U } from "./index-
|
|
2
|
+
import { k as U } from "./index-DO4LFgYW.mjs";
|
|
3
3
|
const g = { class: "ai-plot-widget" }, h = { class: "ai-plot-field" }, x = {
|
|
4
4
|
key: 0,
|
|
5
5
|
class: "ai-plot-field"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineComponent as le, inject as te, ref as g, computed as F, watch as ne, onMounted as oe, onBeforeUnmount as re, openBlock as w, createElementBlock as E, createElementVNode as r, withDirectives as D, vModelText as ie, Fragment as M, renderList as N, toDisplayString as $, vModelSelect as W, createCommentVNode as ue } from "vue";
|
|
2
|
-
import { k as se, b as z } from "./index-
|
|
2
|
+
import { k as se, b as z } from "./index-DO4LFgYW.mjs";
|
|
3
3
|
const ce = { class: "pp-container" }, pe = { class: "pp-header" }, ve = { class: "pp-controls" }, de = { class: "pp-field" }, me = ["disabled"], fe = { class: "pp-field" }, ye = ["disabled"], Se = ["value"], ge = ["value"], we = ["disabled"], Ee = ["value"], $e = { class: "pp-field" }, he = ["disabled"], Ae = {
|
|
4
4
|
key: 0,
|
|
5
5
|
class: "pp-message"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { E as a } from "./index-
|
|
2
|
-
import { f as t, H as p, I as x } from "./index-
|
|
1
|
+
import { E as a } from "./index-DO4LFgYW.mjs";
|
|
2
|
+
import { f as t, H as p, I as x } from "./index-DO4LFgYW.mjs";
|
|
3
3
|
export {
|
|
4
4
|
a as DataExplorer,
|
|
5
5
|
t as DataExplorerCore,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { i as rA } from "./pako.esm-D_m2s4NW.mjs";
|
|
2
|
-
import { g as sA } from "./index-
|
|
3
|
-
import { B as DA } from "./index-
|
|
2
|
+
import { g as sA } from "./index-DO4LFgYW.mjs";
|
|
3
|
+
import { B as DA } from "./index-BcD1Tq3k.mjs";
|
|
4
4
|
const nA = {
|
|
5
5
|
AddCompression: 1
|
|
6
6
|
}, gA = {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { w as sA } from "./pako.esm-Bx5X36Wo-CzWah3nf.mjs";
|
|
2
|
-
import { w as rA, x as gA, S as DA } from "./index-
|
|
2
|
+
import { w as rA, x as gA, S as DA } from "./index-BcD1Tq3k.mjs";
|
|
3
3
|
import { g as nA } from "./basedecoder-PoXbLGBV-BL0bCGZI.mjs";
|
|
4
4
|
var EA = { exports: {} }, iA;
|
|
5
5
|
function wA() {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { D as o, c as e, G as r, d as i, P as t, S as n, U as l, d as D, u as P, e as S } from "./index-
|
|
1
|
+
import { D as o, c as e, G as r, d as i, P as t, S as n, U as l, d as D, u as P, e as S } from "./index-DO4LFgYW.mjs";
|
|
2
2
|
export {
|
|
3
3
|
o as DASHBOARD_GLOBAL_VARS_KEY,
|
|
4
4
|
e as DataExplorer,
|
|
@@ -387,7 +387,7 @@ Please report this to https://github.com/markedjs/marked.`,A){const i="<p>An err
|
|
|
387
387
|
gl_Position = vec4(pos, 0, 1);
|
|
388
388
|
gl_PointSize = pointSize;
|
|
389
389
|
vColor = color;
|
|
390
|
-
}`,attributes:{position:xA,color:Qi},uniforms:{pointSize:HA.prop("pointSize"),scale:HA.prop("scale"),translate:HA.prop("translate")},count:xA.length/2,primitive:"points",depth:{enable:!1},blend:{enable:!0,func:{srcRGB:"src alpha",srcAlpha:"src alpha",dstRGB:"one minus src alpha",dstAlpha:"one minus src alpha"},equation:"add"}});const LA=dS().scaleExtent([.5,10]).filter(ee=>ee.type!=="wheel").on("zoom",ee=>{ee.sourceEvent&&ee.sourceEvent.type!=="wheel"&&(a.value=ee.transform,zA(),o.value&&m.value&&(Kn(n.value).property("__zoom",ee.transform),Nt()))});Kn(ye).call(LA);let gi=0;const bi=16,fn=ee=>{ee.preventDefault();const ce=ye.getBoundingClientRect(),xe=ee.clientX-ce.left,ke=ee.clientY-ce.top,Pe=a.value||ts,Mt=xe/ye.width*2-1,bt=-(ke/ye.height*2-1),z=2*Pe.x/ye.width,He=-(2*Pe.y)/ye.height,Ge=(Mt-z)/Pe.k,St=(bt-He)/Pe.k,dA=-ee.deltaY*.002,nA=Math.max(.5,Math.min(10,Pe.k*Math.pow(2,dA))),Ot=Mt-Ge*nA,Ui=bt-St*nA,si=Ot*ye.width/2,Ki=-(Ui*ye.height)/2,mi=ts.translate(si,Ki).scale(nA);a.value=mi,zA(),Kn(ye).property("__zoom",mi),n.value&&o.value&&m.value&&(Kn(n.value).property("__zoom",mi),Nt())},wn=ee=>{const ce=Date.now();if(ce-gi<bi)return;gi=ce;const xe=ye.getBoundingClientRect(),ke=ee.clientX-xe.left,Pe=ee.clientY-xe.top,Mt=a.value||ts,bt=ke/ye.width*2-1,z=-(Pe/ye.height*2-1),He=.02;let Ge=null,St=He,dA=-1;if(h.value.forEach((nA,Ot)=>{const Ui=yi(nA.x),si=dt(nA.y),Ki=2*Mt.x/ye.width,mi=-(2*Mt.y)/ye.height,Ms=Ui*Mt.k+Ki,Is=si*Mt.k+mi,Bo=Ms-bt,Xm=Is-z,Zm=Math.sqrt(Bo*Bo+Xm*Xm);Zm<St&&(St=Zm,Ge=nA,dA=Ot)}),Ge){u.value=Ge.cell_id,C.value=!1;const nA=yi(Ge.x),Ot=dt(Ge.y),Ui=2*Mt.x/ye.width,si=-(2*Mt.y)/ye.height,Ki=(nA*Mt.k+Ui+1)/2*ye.width,mi=(1-(Ot*Mt.k+si))/2*ye.height,Ms=ye.getBoundingClientRect()}else u.value=null;zA(),o.value&&m.value&&Nt()},Y=()=>{u.value=null,zA(),o.value&&m.value&&Nt()};ye.addEventListener("wheel",fn,{passive:!1}),ye.addEventListener("mousemove",wn),ye.addEventListener("mouseleave",Y),st=[{event:"wheel",handler:fn},{event:"mousemove",handler:wn},{event:"mouseleave",handler:Y}],zA()}catch(Zt){console.error("Failed to render gene UMAP:",Zt),R.value=!1}}function on(ye){const We={},ze=new Set(["cell_id","umap_1","umap_2","tsne_1","tsne_2","x","y","color","opacity","expr","norm","Donor_ID"]);return Object.keys(ye).forEach(lt=>{!ze.has(lt)&&ye[lt]!==null&&ye[lt]!==void 0&&(We[lt]=ye[lt])}),We}function Xt(ye){return{}}function vi(ye){return ye.split("_").map(We=>We.charAt(0).toUpperCase()+We.slice(1)).join(" ")}f.ref("#ff0000"),f.ref("#0000ff");function an(ye,We){return typeof We=="number"?ye===N.value||ye===m.value?We.toFixed(3):We<.01&&We>0?We.toExponential(2):Math.abs(We)>1e3?We.toLocaleString():We.toFixed(2):We}return(ye,We)=>(f.openBlock(),f.createElementBlock("div",QIe,[Q.value?(f.openBlock(),f.createElementBlock("div",pIe,[...We[2]||(We[2]=[f.createElementVNode("div",{class:"spinner"},null,-1),f.createElementVNode("p",{class:"loading-text"},"Loading UMAP data...",-1)])])):E.value?(f.openBlock(),f.createElementBlock("div",yIe,[We[3]||(We[3]=f.createElementVNode("strong",null,"⚠️ Error:",-1)),f.createTextVNode(" "+f.toDisplayString(E.value),1)])):(f.openBlock(),f.createElementBlock("div",mIe,[We[11]||(We[11]=f.createElementVNode("div",{class:"filter-placeholder"},null,-1)),f.createElementVNode("div",wIe,[f.createElementVNode("div",_Ie,[We[6]||(We[6]=f.createElementVNode("div",{class:"header"},[f.createElementVNode("h3",{class:"title"},"Cell Metadata")],-1)),f.createElementVNode("div",SIe,[f.createElementVNode("label",DIe,[We[4]||(We[4]=f.createTextVNode(" Select metadata: ",-1)),f.withDirectives(f.createElementVNode("select",{"onUpdate:modelValue":We[0]||(We[0]=ze=>m.value=ze),onChange:U,class:"select"},[(f.openBlock(!0),f.createElementBlock(f.Fragment,null,f.renderList(y.value,ze=>(f.openBlock(),f.createElementBlock("option",{key:ze,value:ze},f.toDisplayString(ze),9,vIe))),128))],544),[[f.vModelSelect,m.value]])])]),f.createElementVNode("div",bIe,[f.createElementVNode("canvas",{ref_key:"leftCanvas",ref:n},null,512)]),_.value.length>0?(f.openBlock(),f.createElementBlock("div",{key:0,class:f.normalizeClass(["legend",{"legend-expanded":d.value}])},[f.createElementVNode("div",RIe,[We[5]||(We[5]=f.createElementVNode("div",{class:"legend-title"},"Legend",-1)),f.createElementVNode("button",{class:"legend-toggle",onClick:f.withModifiers(nt,["stop"]),title:d.value?"Collapse":"Expand"},[d.value?(f.openBlock(),f.createElementBlock("span",FIe,"▼")):(f.openBlock(),f.createElementBlock("span",NIe,"▲"))],8,xIe)]),f.createElementVNode("div",kIe,[(f.openBlock(!0),f.createElementBlock(f.Fragment,null,f.renderList(_.value,(ze,lt)=>(f.openBlock(),f.createElementBlock("div",{key:lt,class:"legend-item"},[f.createElementVNode("div",{class:f.normalizeClass(["legend-color",{"legend-color-hidden":!F.value.has(ze.label)}]),style:f.normalizeStyle({background:ze.color,borderColor:ze.color}),onClick:Ht=>Ee(ze.label)},[F.value.has(ze.label)?f.createCommentVNode("",!0):(f.openBlock(),f.createElementBlock("span",TIe,"✕"))],14,MIe),m.value.toLowerCase()==="atlas_annotation"?(f.openBlock(),f.createElementBlock("a",{key:0,class:"legend-label legend-link",href:`https://nervosensus.netlify.app/?view=cards&atlasannotation=${ze.label}`,target:"_blank",rel:"noopener noreferrer"},f.toDisplayString(ze.label),9,LIe)):(f.openBlock(),f.createElementBlock("span",UIe,f.toDisplayString(ze.label),1))]))),128))])],2)):f.createCommentVNode("",!0),Qt.value?(f.openBlock(),f.createElementBlock("div",{key:1,class:"tooltip",style:f.normalizeStyle({left:B.value.x+"px",top:B.value.y+"px"})},[f.createElementVNode("div",GIe,f.toDisplayString(Qt.value.cell_id),1),(f.openBlock(!0),f.createElementBlock(f.Fragment,null,f.renderList(on(Qt.value),(ze,lt)=>(f.openBlock(),f.createElementBlock("div",{key:lt,class:"tooltip-row"},[f.createElementVNode("span",{class:"tooltip-label",style:f.normalizeStyle(Xt())},f.toDisplayString(vi(lt))+":",5),f.createElementVNode("span",OIe,f.toDisplayString(an(lt,ze)),1)]))),128))],4)):f.createCommentVNode("",!0)]),f.createElementVNode("div",PIe,[We[10]||(We[10]=f.createElementVNode("div",{class:"header"},[f.createElementVNode("h3",{class:"title"},"Assay RNA (Gene Expression)")],-1)),f.createElementVNode("div",qIe,[f.createElementVNode("label",HIe,[We[7]||(We[7]=f.createTextVNode(" Select gene: ",-1)),f.createElementVNode("div",JIe,[f.withDirectives(f.createElementVNode("input",{"onUpdate:modelValue":We[1]||(We[1]=ze=>M.value=ze),type:"text",placeholder:"Gene name (e.g., CDH9)",class:"gene-input",list:"gene-suggestions",onInput:Pt},null,544),[[f.vModelText,M.value]]),f.createElementVNode("datalist",YIe,[(f.openBlock(!0),f.createElementBlock(f.Fragment,null,f.renderList(x.value,ze=>(f.openBlock(),f.createElementBlock("option",{key:ze,value:ze},null,8,KIe))),128))]),f.createElementVNode("button",{onClick:Lt,disabled:!M.value.trim()||R.value,class:"visualize-btn"},f.toDisplayString(R.value?"Loading...":"Visualize"),9,VIe)])])]),f.createElementVNode("div",WIe,[R.value?(f.openBlock(),f.createElementBlock("div",$Ie,[...We[8]||(We[8]=[f.createElementVNode("div",{class:"small-spinner"},null,-1),f.createElementVNode("p",null,"Loading gene expression...",-1)])])):f.createCommentVNode("",!0),f.createElementVNode("canvas",{ref_key:"rightCanvas",ref:r},null,512)]),N.value&&!R.value?(f.openBlock(),f.createElementBlock("div",zIe,[...We[9]||(We[9]=[f.createElementVNode("div",{class:"legend-title"},"Expression Level",-1),f.createElementVNode("div",{class:"gradient-bar"},[f.createElementVNode("div",{class:"gradient-fill"}),f.createElementVNode("div",{class:"gradient-labels"},[f.createElementVNode("span",null,"Low"),f.createElementVNode("span",null,"High")])],-1)])])):f.createCommentVNode("",!0)])])]))]))}},[["__scopeId","data-v-e6bb4908"]]),XIe={class:"side-by-side-wrap"},ZIe="https://temp-precision-dashboard-data.s3.us-east-1.amazonaws.com/humandrg/v2",ehe=_a(f.defineComponent({inheritAttrs:!1,__name:"SideBySide",props:{dataPath:{},initialGene:{},initialMetadataColumn:{}},setup(A){const e=A,t=Yc(),i=EE(),n=f.computed(()=>e.dataPath??(t?f.unref(t.s3Url):null)??ZIe);return f.onMounted(()=>{e.initialGene&&i.selectedGene===null&&i.setSelectedGene(e.initialGene),e.initialMetadataColumn&&i.selectedMetadataColumn===null&&i.setSelectedMetadataColumn(e.initialMetadataColumn)}),(r,s)=>(f.openBlock(),f.createElementBlock(f.Fragment,null,[f.renderSlot(r.$slots,"default",{},void 0,!0),f.createElementVNode("div",XIe,[f.createVNode(jIe,{gene:f.unref(i).selectedGene??void 0,metadataColumn:f.unref(i).selectedMetadataColumn??void 0,"onUpdate:Vars":s[0]||(s[0]=(o,g)=>f.unref(i).setSelection(o,g)),"data-path":n.value},null,8,["gene","metadataColumn","data-path"])])],64))}}),[["__scopeId","data-v-79a2dcfe"]]),the={class:"violin-plot-container"},Ahe={key:0,class:"loading-container"},ihe={key:1,class:"error-container"},nhe={key:2,class:"dashboard"},rhe={class:"content-layout"},she={class:"controls"},ohe={class:"label"},ahe=["value"],ghe={class:"label gene-expression-label"},che={class:"gene-input-wrapper"},lhe={id:"gene-suggestions"},Ihe=["value"],hhe=["disabled"],uhe={class:"label"},fhe={class:"plot-type-toggle"},Bhe={class:"checkbox-label"},Che={class:"plot-container"},dhe={key:0,class:"loading-overlay"},Ehe=_a({__name:"ViolinPlot",props:{dataPath:{type:String,default:"/data"},metadataColumn:{type:String,default:null},gene:{type:String,default:null}},emits:["update:Vars"],setup(A,{emit:e}){const t=A,i=e,n=f.ref(null),r=f.ref(null),s=f.ref(null),o=f.ref(!0),g=f.ref(null),a=f.ref(!1),c=f.ref([]),l=f.ref([]),I=f.ref(t.metadataColumn||""),h=f.ref("gene"),u=f.ref(t.gene||""),C=f.ref(t.gene||""),B=f.ref([]),d=f.ref("violin"),p=f.ref(!1),Q=f.ref([]);let E=null;f.watch(()=>t.metadataColumn,S=>{S&&S!==I.value&&(I.value=S,c.value.length>0&&F())}),f.watch(()=>t.gene,S=>{S&&S!==C.value&&(C.value=S,u.value=S,c.value.length>0&&M())}),f.watch(I,S=>{S&&i("update:Vars","selectedMetadataColumn",S)}),f.watch(C,S=>{S&&i("update:Vars","selectedGene",S)}),f.watch(d,()=>{Q.value.length>0&&(N(Q.value),p.value&&x(Q.value))});let w=null;const y=()=>{clearTimeout(w),w=setTimeout(()=>{Q.value.length>0&&(N(Q.value),p.value&&x(Q.value))},100)};f.onMounted(async()=>{window.addEventListener("resize",y);try{s.value=new dD(t.dataPath),await s.value.initialize();const S=await s.value.getReductionData("umap");if(c.value=S,S.length>0){const b=S[0],D=Object.keys(b).filter(T=>!["cell_id","umap_1","umap_2","tsne_1","tsne_2"].includes(T));l.value=D,D.length>0&&(t.metadataColumn&&D.includes(t.metadataColumn)?I.value=t.metadataColumn:I.value||(I.value=D.includes("Atlas_annotation")?"Atlas_annotation":D[0]))}o.value=!1,await f.nextTick(),t.gene&&(C.value=t.gene,u.value=t.gene,h.value="gene",await M())}catch(S){console.error("Failed to initialize:",S),g.value=`Failed to load data: ${S.message}`,o.value=!1}}),f.onBeforeUnmount(()=>{E&&clearTimeout(E),w&&clearTimeout(w),window.removeEventListener("resize",y);const S=r.value;S&&S.getContext("2d").clearRect(0,0,S.width,S.height)});function m(){clearTimeout(E),E=setTimeout(async()=>{if(u.value.length<1){B.value=[];return}try{const S=await s.value.searchGenes(u.value);B.value=S.map(b=>b.gene_name).slice(0,20)}catch(S){console.error("Gene search failed:",S)}},300)}async function _(){u.value.trim()&&(C.value=u.value.trim().toUpperCase(),await M())}async function F(){C.value&&await M()}async function M(){if(!(!C.value||!I.value))try{a.value=!0;const S=await s.value.getGeneExpression(C.value);a.value=!1;const b=new Map(S.map(O=>[O.cell_id,O.expression])),D=new Map;c.value.forEach(O=>{const H=O[I.value],k=b.get(O.cell_id)||0;D.has(H)||D.set(H,[]),D.get(H).push(k)});const T=Array.from(D.entries()).map(([O,H])=>({category:String(O),values:H}));Q.value=T,await f.nextTick(),N(T),p.value&&x(T)}catch(S){console.error("Failed to render violin plot:",S),g.value=`Failed to load gene data: ${S.message}`,a.value=!1}}function N(S){const b=Kn(n.value);if(b.selectAll("*").remove(),!S||S.length===0)return;const D=b.node();if(!D||!D.parentElement)return;const O=D.parentElement.getBoundingClientRect(),H=O.width,k=O.height,$=Math.max(...S.map(Ve=>Ve.category.length)),re=Math.min($*5.5,200)+40,ue={top:40,right:40,bottom:Math.max(80,re),left:80},j=H-ue.left-ue.right,ne=k-ue.top-ue.bottom;b.attr("width",H).attr("height",k).attr("viewBox",null).attr("preserveAspectRatio",null);const ge=b.append("g").attr("transform",`translate(${ue.left},${ue.top})`),we=Y3().domain(S.map(Ve=>Ve.category)).range([0,j]).padding(.2),Se=S.flatMap(Ve=>Ve.values),$e=va(Se),Le=zs().domain($e).range([ne,0]).nice(),st=Of(fS);function Qt(Ve,Ee){return function(nt){return Ee.map(qt=>[qt,kie(nt,iA=>Ve(qt-iA))])}}function jt(Ve){return function(Ee){return Math.abs(Ee/=Ve)<=1?.75*(1-Ee*Ee)/Ve:0}}S.forEach(Ve=>{const Ee=Ve.category,nt=Ve.values.filter(KA=>KA!=null&&!isNaN(KA));if(nt.length===0)return;const qt=nt.slice().sort($c),iA=Mie(qt),Li=O_(qt,.25),U=O_(qt,.75),zA=G_(qt),Ei=pE(qt),Nt=we(Ee)+we.bandwidth()/2;if(d.value==="violin"){const KA=wie(nt),rA=nt.length,on=1.06*KA*Math.pow(rA,-1/5),Xt=Le.ticks(50),vi=Qt(jt(on),Xt)(nt),an=pE(vi,ze=>ze[1]),ye=zs().domain([0,an]).range([0,we.bandwidth()/2]);b.property("__scales__",{xScale:we,yScale:Le,margin:ue,width:H,height:k});const We=Hoe().x0(ze=>we(Ee)+we.bandwidth()/2-ye(ze[1])).x1(ze=>we(Ee)+we.bandwidth()/2+ye(ze[1])).y(ze=>Le(ze[0])).curve(Yoe);ge.append("path").datum(vi).attr("d",We).attr("fill",st(Ee)).attr("opacity",.7).attr("stroke",st(Ee)).attr("stroke-width",1.5),ge.append("line").attr("x1",Nt-5).attr("x2",Nt+5).attr("y1",Le(iA)).attr("y2",Le(iA)).attr("stroke","white").attr("stroke-width",3),ge.append("rect").attr("x",Nt-3).attr("y",Le(U)).attr("width",6).attr("height",Le(Li)-Le(U)).attr("fill","white").attr("stroke","#333").attr("stroke-width",1)}else{const KA=Math.min(we.bandwidth()*.6,80),rA=KA*.5;b.property("__scales__",{xScale:we,yScale:Le,margin:ue,width:H,height:k}),ge.append("line").attr("x1",Nt).attr("x2",Nt).attr("y1",Le(zA)).attr("y2",Le(Li)).attr("stroke",st(Ee)).attr("stroke-width",2),ge.append("line").attr("x1",Nt).attr("x2",Nt).attr("y1",Le(U)).attr("y2",Le(Ei)).attr("stroke",st(Ee)).attr("stroke-width",2),ge.append("line").attr("x1",Nt-rA/2).attr("x2",Nt+rA/2).attr("y1",Le(zA)).attr("y2",Le(zA)).attr("stroke",st(Ee)).attr("stroke-width",2),ge.append("line").attr("x1",Nt-rA/2).attr("x2",Nt+rA/2).attr("y1",Le(Ei)).attr("y2",Le(Ei)).attr("stroke",st(Ee)).attr("stroke-width",2),ge.append("rect").attr("x",Nt-KA/2).attr("y",Le(U)).attr("width",KA).attr("height",Le(Li)-Le(U)).attr("fill",st(Ee)).attr("opacity",.7).attr("stroke",st(Ee)).attr("stroke-width",2),ge.append("line").attr("x1",Nt-KA/2).attr("x2",Nt+KA/2).attr("y1",Le(iA)).attr("y2",Le(iA)).attr("stroke","white").attr("stroke-width",2.5)}});const Pt=ge.append("g").attr("transform",`translate(0,${ne})`).call(Hie(we));I.value.toLowerCase()==="atlas_annotation"?Pt.selectAll(".tick").each(function(){const Ve=Kn(this),Ee=Ve.select("text"),qt=`https://nervosensus.netlify.app/?view=cards&atlasannotation=${Ee.text()}`;Ve.append("a").attr("href",qt).attr("target","_blank").node().appendChild(Ee.node()),Ee.attr("transform","rotate(-45)").style("text-anchor","end").style("font-size","12px").style("fill","#667eea").style("cursor","pointer")}):Pt.selectAll("text").attr("transform","rotate(-45)").style("text-anchor","end").style("font-size","12px"),ge.append("g").call(Jie(Le)).selectAll("text").style("font-size","12px"),ge.append("text").attr("x",j/2).attr("y",ne+ue.bottom-10).attr("text-anchor","middle").style("font-size","14px").style("font-weight","600").text(I.value);const Kt=`${C.value} Expression`;ge.append("text").attr("transform","rotate(-90)").attr("x",-ne/2).attr("y",-ue.left+20).attr("text-anchor","middle").style("font-size","14px").style("font-weight","600").text(Kt),b.append("text").attr("x",H/2).attr("y",20).attr("text-anchor","middle").style("font-size","16px").style("font-weight","700").text(`Violin Plot: ${Kt} by ${I.value}`)}function x(S){if(!S||S.length===0)return;const b=r.value;if(!b)return;const T=Kn(n.value).property("__scales__");if(!T){console.warn("Scales not found on SVG");return}const{xScale:O,yScale:H,margin:k,width:$,height:re}=T,ue=window.devicePixelRatio||1;b.width=$*ue,b.height=re*ue,b.style.width=`${$}px`,b.style.height=`${re}px`;const j=b.getContext("2d");j.scale(ue,ue),j.clearRect(0,0,$,re),j.save(),j.translate(k.left,k.top);const ne=Of(fS);S.forEach(ge=>{const we=ge.category,Se=ge.values.filter(Qt=>Qt!=null&&!isNaN(Qt));if(Se.length===0)return;const $e=O(we)+O.bandwidth()/2,Le=O.bandwidth()*.35,st=ne(we);j.fillStyle=st,j.strokeStyle="white",j.lineWidth=.3,j.globalAlpha=.4,Se.forEach(Qt=>{const jt=$e+(Math.random()-.5)*Le,Pt=H(Qt);j.beginPath(),j.arc(jt,Pt,1.5,0,Math.PI*2),j.fill(),j.stroke()})}),j.restore()}function R(){if(Q.value.length>0)if(p.value)x(Q.value);else{const S=r.value;S&&S.getContext("2d").clearRect(0,0,S.width,S.height)}}return(S,b)=>(f.openBlock(),f.createElementBlock("div",the,[o.value?(f.openBlock(),f.createElementBlock("div",Ahe,[...b[5]||(b[5]=[f.createElementVNode("div",{class:"spinner"},null,-1),f.createElementVNode("p",{class:"loading-text"},"Loading data...",-1)])])):g.value?(f.openBlock(),f.createElementBlock("div",ihe,[b[6]||(b[6]=f.createElementVNode("strong",null,"� Error:",-1)),f.createTextVNode(" "+f.toDisplayString(g.value),1)])):(f.openBlock(),f.createElementBlock("div",nhe,[b[12]||(b[12]=f.createElementVNode("div",{class:"header"},[f.createElementVNode("h3",{class:"title"},"Gene Expression Distribution")],-1)),f.createElementVNode("div",rhe,[f.createElementVNode("div",she,[f.createElementVNode("label",ohe,[b[7]||(b[7]=f.createTextVNode(" X-axis (Metadata): ",-1)),f.withDirectives(f.createElementVNode("select",{"onUpdate:modelValue":b[0]||(b[0]=D=>I.value=D),onChange:F,class:"select"},[(f.openBlock(!0),f.createElementBlock(f.Fragment,null,f.renderList(l.value,D=>(f.openBlock(),f.createElementBlock("option",{key:D,value:D},f.toDisplayString(D),9,ahe))),128))],544),[[f.vModelSelect,I.value]])]),f.createElementVNode("label",ghe,[b[8]||(b[8]=f.createTextVNode(" Gene Expression ",-1)),f.createElementVNode("div",che,[f.withDirectives(f.createElementVNode("input",{"onUpdate:modelValue":b[1]||(b[1]=D=>u.value=D),type:"text",placeholder:"Gene name (e.g., CDH9)",class:"gene-input",list:"gene-suggestions",onInput:m},null,544),[[f.vModelText,u.value]]),f.createElementVNode("datalist",lhe,[(f.openBlock(!0),f.createElementBlock(f.Fragment,null,f.renderList(B.value,D=>(f.openBlock(),f.createElementBlock("option",{key:D,value:D},null,8,Ihe))),128))]),f.createElementVNode("button",{onClick:_,disabled:!u.value.trim()||a.value,class:"visualize-btn"},f.toDisplayString(a.value?"Loading...":"Visualize"),9,hhe)])]),f.createElementVNode("label",uhe,[b[9]||(b[9]=f.createTextVNode(" Plot Type: ",-1)),f.createElementVNode("div",fhe,[f.createElementVNode("button",{onClick:b[2]||(b[2]=D=>d.value="violin"),class:f.normalizeClass([{active:d.value==="violin"},"toggle-btn"])}," Violin ",2),f.createElementVNode("button",{onClick:b[3]||(b[3]=D=>d.value="box"),class:f.normalizeClass([{active:d.value==="box"},"toggle-btn"])}," Box ",2)])]),f.createElementVNode("label",Bhe,[f.withDirectives(f.createElementVNode("input",{"onUpdate:modelValue":b[4]||(b[4]=D=>p.value=D),type:"checkbox",class:"checkbox",onChange:R},null,544),[[f.vModelCheckbox,p.value]]),b[10]||(b[10]=f.createTextVNode(" Show data points ",-1))])]),f.createElementVNode("div",Che,[a.value?(f.openBlock(),f.createElementBlock("div",dhe,[...b[11]||(b[11]=[f.createElementVNode("div",{class:"small-spinner"},null,-1),f.createElementVNode("p",null,"Loading data...",-1)])])):f.createCommentVNode("",!0),(f.openBlock(),f.createElementBlock("svg",{ref_key:"violinSvg",ref:n,class:"violin-svg"},null,512)),f.createElementVNode("canvas",{ref_key:"dataPointsCanvas",ref:r,class:"data-points-canvas"},null,512)])])]))]))}},[["__scopeId","data-v-fe87f25d"]]),Qhe={class:"gene-x-expression-wrap"},phe="https://temp-precision-dashboard-data.s3.us-east-1.amazonaws.com/humandrg/v2",kL=_a(f.defineComponent({inheritAttrs:!1,__name:"GeneXDistribution",props:{dataPath:{},initialGene:{},initialMetadataColumn:{}},setup(A){const e=A,t=Yc(),i=EE(),n=f.computed(()=>e.dataPath??(t?f.unref(t.s3Url):null)??phe);f.onMounted(()=>{e.initialGene&&i.selectedGeneX===null&&i.setSelectedGeneX(e.initialGene),e.initialMetadataColumn&&i.selectedMetadataColumn===null&&i.setSelectedMetadataColumn(e.initialMetadataColumn)});function r(s,o){s==="selectedGene"?i.setSelection("selectedGeneX",o):i.setSelection(s,o)}return(s,o)=>(f.openBlock(),f.createElementBlock(f.Fragment,null,[f.renderSlot(s.$slots,"default",{},void 0,!0),f.createElementVNode("div",Qhe,[f.createVNode(Ehe,{gene:f.unref(i).selectedGeneX??void 0,metadataColumn:f.unref(i).selectedMetadataColumn??void 0,"onUpdate:Vars":r,"data-path":n.value},null,8,["gene","metadataColumn","data-path"])])],64))}}),[["__scopeId","data-v-3180d386"]]),yhe=Object.freeze(Object.defineProperty({__proto__:null,DataExplorer:DF,DataExplorerCore:SF,clearDataExplorerStore:_F,createDataExplorerStore:wF},Symbol.toStringTag,{value:"Module"})),mhe=Object.freeze(Object.defineProperty({__proto__:null,UMAP:mN,UMAPControlPanel:EN,UMAPScatterplot:dN,clearUMAPStore:yN,createUMAPStore:pN},Symbol.toStringTag,{value:"Module"})),whe=Object.freeze(Object.defineProperty({__proto__:null,Markdown:BZ},Symbol.toStringTag,{value:"Module"})),_he=Object.freeze(Object.defineProperty({__proto__:null,TextViewer:SZ},Symbol.toStringTag,{value:"Module"})),She={class:"pp-container"},Dhe={class:"pp-header"},vhe={class:"pp-controls"},bhe={class:"pp-field"},Rhe=["disabled"],xhe={class:"pp-field"},Fhe=["disabled"],Nhe=["value"],khe=["value"],Mhe=["disabled"],The=["value"],Lhe={class:"pp-field"},Uhe=["disabled"],Ghe={key:0,class:"pp-message"},ED=100,QD=12,pD="(other)",Ohe=Object.freeze(Object.defineProperty({__proto__:null,ProportionPlot:Ea(f.defineComponent({__name:"ProportionPlot",props:{apiUrl:{},pkg:{},srcUrl:{},srcFileType:{},srcFileId:{},tableNameOverride:{}},setup(A){const e=A;let t;const i=f.inject("duckdb");if(!i)throw new Error('[@pennsieve-viz/core] DuckDB store not provided. Please provide a DuckDB store via app.provide("duckdb", store)');const n=i,r=f.ref(null),s=f.ref(null),o=f.ref(e.srcUrl||"https://temp-precision-dashboard-data.s3.us-east-1.amazonaws.com/precision_human_drg_data.parquet"),g=f.computed(()=>n.formatIdFromUrl(o.value)),a=f.ref(!1),c=f.ref(""),l=f.ref([]),I=f.ref(""),h=f.ref(""),u=`proportion-plot-${Math.random().toString(36).slice(2)}`;f.watch(()=>({srcUrl:e.srcUrl,srcFileType:e.srcFileType,srcFileId:e.srcFileId,pkg:e.pkg,apiUrl:e.apiUrl}),async({srcUrl:x,srcFileType:R,srcFileId:S,pkg:b,apiUrl:D})=>{var T,O;try{if(x&&(o.value=x),await p(),o.value){const $=R??(o.value.toLowerCase().endsWith(".csv")?"csv":"parquet");await E($,g.value);return}const H=(T=b==null?void 0:b.content)==null?void 0:T.id,k=(O=b==null?void 0:b.content)==null?void 0:O.packageType;if(H&&D){const $=await _(H,D);if(!$)return;const re=await F(H,$,D),ue=k==="CSV"?"csv":"parquet",j=$.replace(/[^a-zA-Z0-9_.-]/g,"_");o.value=re,await E(ue,j)}}catch(H){console.error("[ProportionPlot] Load failed:",(H==null?void 0:H.message)||H),c.value=`Load failed: ${(H==null?void 0:H.message)||H}`}},{immediate:!0});const C=new Set(["VARCHAR","STRING","TEXT","BOOL","BOOLEAN","DATE","TIMESTAMP"]),B=f.computed(()=>l.value.filter(x=>C.has(x.type)||x.type.startsWith("VARCHAR"))),d=f.computed(()=>l.value.filter(x=>!C.has(x.type)));async function p(){if(r.value)return;const{connectionId:x}=await n.createConnection(`prop_${Date.now()}`);r.value=x}function Q(x){const R=String(x).replace(/[^A-Za-z0-9_]/g,"_");return(/^[A-Za-z_]/.test(R)?R:`t_${R}`).slice(0,63)}async function E(x,R){r.value||await p();const S=(R||e.srcFileId||o.value||"file").replace(/[^A-Za-z0-9]/g,"_");a.value=!0,c.value="Loading file into DuckDB…";try{const b=x??(o.value.toLowerCase().endsWith(".csv")?"csv":"parquet"),D=e.tableNameOverride||Q(`file_${S.slice(0,48)}`),T=await n.loadFile(o.value,b,D,{},r.value,S);s.value=T,await y(!0)}finally{a.value=!1}}function w(x){return'"'+String(x).replace(/"/g,'""')+'"'}async function y(x=!1){var R,S,b,D;if(!s.value||!r.value)return;const T=`PRAGMA table_info(${w(s.value)})`,O=await n.executeQuery(T,r.value);if(l.value=O.map(H=>({name:String(H.name),type:String(H.type).toUpperCase()})),x||!I.value||!h.value){const H=l.value.filter(k=>C.has(k.type)||k.type.startsWith("VARCHAR"));I.value=((R=H[0])==null?void 0:R.name)||((S=l.value[0])==null?void 0:S.name)||"",h.value=((b=H[1])==null?void 0:b.name)||((D=H[0])==null?void 0:D.name)||""}c.value=`Columns: ${l.value.length}.`}async function m(){if(!(!s.value||!r.value)){if(!I.value||!h.value){c.value="Pick both X and Y";return}a.value=!0,c.value="Computing proportions…";try{const x=w(s.value),R=w(I.value),S=w(h.value),b=`
|
|
390
|
+
}`,attributes:{position:xA,color:Qi},uniforms:{pointSize:HA.prop("pointSize"),scale:HA.prop("scale"),translate:HA.prop("translate")},count:xA.length/2,primitive:"points",depth:{enable:!1},blend:{enable:!0,func:{srcRGB:"src alpha",srcAlpha:"src alpha",dstRGB:"one minus src alpha",dstAlpha:"one minus src alpha"},equation:"add"}});const LA=dS().scaleExtent([.5,10]).filter(ee=>ee.type!=="wheel").on("zoom",ee=>{ee.sourceEvent&&ee.sourceEvent.type!=="wheel"&&(a.value=ee.transform,zA(),o.value&&m.value&&(Kn(n.value).property("__zoom",ee.transform),Nt()))});Kn(ye).call(LA);let gi=0;const bi=16,fn=ee=>{ee.preventDefault();const ce=ye.getBoundingClientRect(),xe=ee.clientX-ce.left,ke=ee.clientY-ce.top,Pe=a.value||ts,Mt=xe/ye.width*2-1,bt=-(ke/ye.height*2-1),z=2*Pe.x/ye.width,He=-(2*Pe.y)/ye.height,Ge=(Mt-z)/Pe.k,St=(bt-He)/Pe.k,dA=-ee.deltaY*.002,nA=Math.max(.5,Math.min(10,Pe.k*Math.pow(2,dA))),Ot=Mt-Ge*nA,Ui=bt-St*nA,si=Ot*ye.width/2,Ki=-(Ui*ye.height)/2,mi=ts.translate(si,Ki).scale(nA);a.value=mi,zA(),Kn(ye).property("__zoom",mi),n.value&&o.value&&m.value&&(Kn(n.value).property("__zoom",mi),Nt())},wn=ee=>{const ce=Date.now();if(ce-gi<bi)return;gi=ce;const xe=ye.getBoundingClientRect(),ke=ee.clientX-xe.left,Pe=ee.clientY-xe.top,Mt=a.value||ts,bt=ke/ye.width*2-1,z=-(Pe/ye.height*2-1),He=.02;let Ge=null,St=He,dA=-1;if(h.value.forEach((nA,Ot)=>{const Ui=yi(nA.x),si=dt(nA.y),Ki=2*Mt.x/ye.width,mi=-(2*Mt.y)/ye.height,Ms=Ui*Mt.k+Ki,Is=si*Mt.k+mi,Bo=Ms-bt,Xm=Is-z,Zm=Math.sqrt(Bo*Bo+Xm*Xm);Zm<St&&(St=Zm,Ge=nA,dA=Ot)}),Ge){u.value=Ge.cell_id,C.value=!1;const nA=yi(Ge.x),Ot=dt(Ge.y),Ui=2*Mt.x/ye.width,si=-(2*Mt.y)/ye.height,Ki=(nA*Mt.k+Ui+1)/2*ye.width,mi=(1-(Ot*Mt.k+si))/2*ye.height,Ms=ye.getBoundingClientRect()}else u.value=null;zA(),o.value&&m.value&&Nt()},Y=()=>{u.value=null,zA(),o.value&&m.value&&Nt()};ye.addEventListener("wheel",fn,{passive:!1}),ye.addEventListener("mousemove",wn),ye.addEventListener("mouseleave",Y),st=[{event:"wheel",handler:fn},{event:"mousemove",handler:wn},{event:"mouseleave",handler:Y}],zA()}catch(Zt){console.error("Failed to render gene UMAP:",Zt),R.value=!1}}function on(ye){const We={},ze=new Set(["cell_id","umap_1","umap_2","tsne_1","tsne_2","x","y","color","opacity","expr","norm"]);return Object.keys(ye).forEach(lt=>{!ze.has(lt)&&ye[lt]!==null&&ye[lt]!==void 0&&(We[lt]=ye[lt])}),We}function Xt(ye){return{}}function vi(ye){return ye.split("_").map(We=>We.charAt(0).toUpperCase()+We.slice(1)).join(" ")}f.ref("#ff0000"),f.ref("#0000ff");function an(ye,We){return typeof We=="number"?ye===N.value||ye===m.value?We.toFixed(3):We<.01&&We>0?We.toExponential(2):Math.abs(We)>1e3?We.toLocaleString():We.toFixed(2):We}return(ye,We)=>(f.openBlock(),f.createElementBlock("div",QIe,[Q.value?(f.openBlock(),f.createElementBlock("div",pIe,[...We[2]||(We[2]=[f.createElementVNode("div",{class:"spinner"},null,-1),f.createElementVNode("p",{class:"loading-text"},"Loading UMAP data...",-1)])])):E.value?(f.openBlock(),f.createElementBlock("div",yIe,[We[3]||(We[3]=f.createElementVNode("strong",null,"⚠️ Error:",-1)),f.createTextVNode(" "+f.toDisplayString(E.value),1)])):(f.openBlock(),f.createElementBlock("div",mIe,[We[11]||(We[11]=f.createElementVNode("div",{class:"filter-placeholder"},null,-1)),f.createElementVNode("div",wIe,[f.createElementVNode("div",_Ie,[We[6]||(We[6]=f.createElementVNode("div",{class:"header"},[f.createElementVNode("h3",{class:"title"},"Cell Metadata")],-1)),f.createElementVNode("div",SIe,[f.createElementVNode("label",DIe,[We[4]||(We[4]=f.createTextVNode(" Select metadata: ",-1)),f.withDirectives(f.createElementVNode("select",{"onUpdate:modelValue":We[0]||(We[0]=ze=>m.value=ze),onChange:U,class:"select"},[(f.openBlock(!0),f.createElementBlock(f.Fragment,null,f.renderList(y.value,ze=>(f.openBlock(),f.createElementBlock("option",{key:ze,value:ze},f.toDisplayString(ze),9,vIe))),128))],544),[[f.vModelSelect,m.value]])])]),f.createElementVNode("div",bIe,[f.createElementVNode("canvas",{ref_key:"leftCanvas",ref:n},null,512)]),_.value.length>0?(f.openBlock(),f.createElementBlock("div",{key:0,class:f.normalizeClass(["legend",{"legend-expanded":d.value}])},[f.createElementVNode("div",RIe,[We[5]||(We[5]=f.createElementVNode("div",{class:"legend-title"},"Legend",-1)),f.createElementVNode("button",{class:"legend-toggle",onClick:f.withModifiers(nt,["stop"]),title:d.value?"Collapse":"Expand"},[d.value?(f.openBlock(),f.createElementBlock("span",FIe,"▼")):(f.openBlock(),f.createElementBlock("span",NIe,"▲"))],8,xIe)]),f.createElementVNode("div",kIe,[(f.openBlock(!0),f.createElementBlock(f.Fragment,null,f.renderList(_.value,(ze,lt)=>(f.openBlock(),f.createElementBlock("div",{key:lt,class:"legend-item"},[f.createElementVNode("div",{class:f.normalizeClass(["legend-color",{"legend-color-hidden":!F.value.has(ze.label)}]),style:f.normalizeStyle({background:ze.color,borderColor:ze.color}),onClick:Ht=>Ee(ze.label)},[F.value.has(ze.label)?f.createCommentVNode("",!0):(f.openBlock(),f.createElementBlock("span",TIe,"✕"))],14,MIe),m.value.toLowerCase()==="atlas_annotation"?(f.openBlock(),f.createElementBlock("a",{key:0,class:"legend-label legend-link",href:`https://nervosensus.netlify.app/?view=cards&atlasannotation=${ze.label}`,target:"_blank",rel:"noopener noreferrer"},f.toDisplayString(ze.label),9,LIe)):(f.openBlock(),f.createElementBlock("span",UIe,f.toDisplayString(ze.label),1))]))),128))])],2)):f.createCommentVNode("",!0),Qt.value?(f.openBlock(),f.createElementBlock("div",{key:1,class:"tooltip",style:f.normalizeStyle({left:B.value.x+"px",top:B.value.y+"px"})},[f.createElementVNode("div",GIe,f.toDisplayString(Qt.value.cell_id),1),(f.openBlock(!0),f.createElementBlock(f.Fragment,null,f.renderList(on(Qt.value),(ze,lt)=>(f.openBlock(),f.createElementBlock("div",{key:lt,class:"tooltip-row"},[f.createElementVNode("span",{class:"tooltip-label",style:f.normalizeStyle(Xt())},f.toDisplayString(vi(lt))+":",5),f.createElementVNode("span",OIe,f.toDisplayString(an(lt,ze)),1)]))),128))],4)):f.createCommentVNode("",!0)]),f.createElementVNode("div",PIe,[We[10]||(We[10]=f.createElementVNode("div",{class:"header"},[f.createElementVNode("h3",{class:"title"},"Assay RNA (Gene Expression)")],-1)),f.createElementVNode("div",qIe,[f.createElementVNode("label",HIe,[We[7]||(We[7]=f.createTextVNode(" Select gene: ",-1)),f.createElementVNode("div",JIe,[f.withDirectives(f.createElementVNode("input",{"onUpdate:modelValue":We[1]||(We[1]=ze=>M.value=ze),type:"text",placeholder:"Gene name (e.g., CDH9)",class:"gene-input",list:"gene-suggestions",onInput:Pt},null,544),[[f.vModelText,M.value]]),f.createElementVNode("datalist",YIe,[(f.openBlock(!0),f.createElementBlock(f.Fragment,null,f.renderList(x.value,ze=>(f.openBlock(),f.createElementBlock("option",{key:ze,value:ze},null,8,KIe))),128))]),f.createElementVNode("button",{onClick:Lt,disabled:!M.value.trim()||R.value,class:"visualize-btn"},f.toDisplayString(R.value?"Loading...":"Visualize"),9,VIe)])])]),f.createElementVNode("div",WIe,[R.value?(f.openBlock(),f.createElementBlock("div",$Ie,[...We[8]||(We[8]=[f.createElementVNode("div",{class:"small-spinner"},null,-1),f.createElementVNode("p",null,"Loading gene expression...",-1)])])):f.createCommentVNode("",!0),f.createElementVNode("canvas",{ref_key:"rightCanvas",ref:r},null,512)]),N.value&&!R.value?(f.openBlock(),f.createElementBlock("div",zIe,[...We[9]||(We[9]=[f.createElementVNode("div",{class:"legend-title"},"Expression Level",-1),f.createElementVNode("div",{class:"gradient-bar"},[f.createElementVNode("div",{class:"gradient-fill"}),f.createElementVNode("div",{class:"gradient-labels"},[f.createElementVNode("span",null,"Low"),f.createElementVNode("span",null,"High")])],-1)])])):f.createCommentVNode("",!0)])])]))]))}},[["__scopeId","data-v-7ea6fa01"]]),XIe={class:"side-by-side-wrap"},ZIe="https://temp-precision-dashboard-data.s3.us-east-1.amazonaws.com/humandrg/v2",ehe=_a(f.defineComponent({inheritAttrs:!1,__name:"SideBySide",props:{dataPath:{},initialGene:{},initialMetadataColumn:{}},setup(A){const e=A,t=Yc(),i=EE(),n=f.computed(()=>e.dataPath??(t?f.unref(t.s3Url):null)??ZIe);return f.onMounted(()=>{e.initialGene&&i.selectedGene===null&&i.setSelectedGene(e.initialGene),e.initialMetadataColumn&&i.selectedMetadataColumn===null&&i.setSelectedMetadataColumn(e.initialMetadataColumn)}),(r,s)=>(f.openBlock(),f.createElementBlock(f.Fragment,null,[f.renderSlot(r.$slots,"default",{},void 0,!0),f.createElementVNode("div",XIe,[f.createVNode(jIe,{gene:f.unref(i).selectedGene??void 0,metadataColumn:f.unref(i).selectedMetadataColumn??void 0,"onUpdate:Vars":s[0]||(s[0]=(o,g)=>f.unref(i).setSelection(o,g)),"data-path":n.value},null,8,["gene","metadataColumn","data-path"])])],64))}}),[["__scopeId","data-v-79a2dcfe"]]),the={class:"violin-plot-container"},Ahe={key:0,class:"loading-container"},ihe={key:1,class:"error-container"},nhe={key:2,class:"dashboard"},rhe={class:"content-layout"},she={class:"controls"},ohe={class:"label"},ahe=["value"],ghe={class:"label gene-expression-label"},che={class:"gene-input-wrapper"},lhe={id:"gene-suggestions"},Ihe=["value"],hhe=["disabled"],uhe={class:"label"},fhe={class:"plot-type-toggle"},Bhe={class:"checkbox-label"},Che={class:"plot-container"},dhe={key:0,class:"loading-overlay"},Ehe=_a({__name:"ViolinPlot",props:{dataPath:{type:String,default:"/data"},metadataColumn:{type:String,default:null},gene:{type:String,default:null}},emits:["update:Vars"],setup(A,{emit:e}){const t=A,i=e,n=f.ref(null),r=f.ref(null),s=f.ref(null),o=f.ref(!0),g=f.ref(null),a=f.ref(!1),c=f.ref([]),l=f.ref([]),I=f.ref(t.metadataColumn||""),h=f.ref("gene"),u=f.ref(t.gene||""),C=f.ref(t.gene||""),B=f.ref([]),d=f.ref("violin"),p=f.ref(!1),Q=f.ref([]);let E=null;f.watch(()=>t.metadataColumn,S=>{S&&S!==I.value&&(I.value=S,c.value.length>0&&F())}),f.watch(()=>t.gene,S=>{S&&S!==C.value&&(C.value=S,u.value=S,c.value.length>0&&M())}),f.watch(I,S=>{S&&i("update:Vars","selectedMetadataColumn",S)}),f.watch(C,S=>{S&&i("update:Vars","selectedGene",S)}),f.watch(d,()=>{Q.value.length>0&&(N(Q.value),p.value&&x(Q.value))});let w=null;const y=()=>{clearTimeout(w),w=setTimeout(()=>{Q.value.length>0&&(N(Q.value),p.value&&x(Q.value))},100)};f.onMounted(async()=>{window.addEventListener("resize",y);try{s.value=new dD(t.dataPath),await s.value.initialize();const S=await s.value.getReductionData("umap");if(c.value=S,S.length>0){const b=S[0],D=Object.keys(b).filter(T=>!["cell_id","umap_1","umap_2","tsne_1","tsne_2"].includes(T));l.value=D,D.length>0&&(t.metadataColumn&&D.includes(t.metadataColumn)?I.value=t.metadataColumn:I.value||(I.value=D.includes("Atlas_annotation")?"Atlas_annotation":D[0]))}o.value=!1,await f.nextTick(),t.gene&&(C.value=t.gene,u.value=t.gene,h.value="gene",await M())}catch(S){console.error("Failed to initialize:",S),g.value=`Failed to load data: ${S.message}`,o.value=!1}}),f.onBeforeUnmount(()=>{E&&clearTimeout(E),w&&clearTimeout(w),window.removeEventListener("resize",y);const S=r.value;S&&S.getContext("2d").clearRect(0,0,S.width,S.height)});function m(){clearTimeout(E),E=setTimeout(async()=>{if(u.value.length<1){B.value=[];return}try{const S=await s.value.searchGenes(u.value);B.value=S.map(b=>b.gene_name).slice(0,20)}catch(S){console.error("Gene search failed:",S)}},300)}async function _(){u.value.trim()&&(C.value=u.value.trim().toUpperCase(),await M())}async function F(){C.value&&await M()}async function M(){if(!(!C.value||!I.value))try{a.value=!0;const S=await s.value.getGeneExpression(C.value);a.value=!1;const b=new Map(S.map(O=>[O.cell_id,O.expression])),D=new Map;c.value.forEach(O=>{const H=O[I.value],k=b.get(O.cell_id)||0;D.has(H)||D.set(H,[]),D.get(H).push(k)});const T=Array.from(D.entries()).map(([O,H])=>({category:String(O),values:H}));Q.value=T,await f.nextTick(),N(T),p.value&&x(T)}catch(S){console.error("Failed to render violin plot:",S),g.value=`Failed to load gene data: ${S.message}`,a.value=!1}}function N(S){const b=Kn(n.value);if(b.selectAll("*").remove(),!S||S.length===0)return;const D=b.node();if(!D||!D.parentElement)return;const O=D.parentElement.getBoundingClientRect(),H=O.width,k=O.height,$=Math.max(...S.map(Ve=>Ve.category.length)),re=Math.min($*5.5,200)+40,ue={top:40,right:40,bottom:Math.max(80,re),left:80},j=H-ue.left-ue.right,ne=k-ue.top-ue.bottom;b.attr("width",H).attr("height",k).attr("viewBox",null).attr("preserveAspectRatio",null);const ge=b.append("g").attr("transform",`translate(${ue.left},${ue.top})`),we=Y3().domain(S.map(Ve=>Ve.category)).range([0,j]).padding(.2),Se=S.flatMap(Ve=>Ve.values),$e=va(Se),Le=zs().domain($e).range([ne,0]).nice(),st=Of(fS);function Qt(Ve,Ee){return function(nt){return Ee.map(qt=>[qt,kie(nt,iA=>Ve(qt-iA))])}}function jt(Ve){return function(Ee){return Math.abs(Ee/=Ve)<=1?.75*(1-Ee*Ee)/Ve:0}}S.forEach(Ve=>{const Ee=Ve.category,nt=Ve.values.filter(KA=>KA!=null&&!isNaN(KA));if(nt.length===0)return;const qt=nt.slice().sort($c),iA=Mie(qt),Li=O_(qt,.25),U=O_(qt,.75),zA=G_(qt),Ei=pE(qt),Nt=we(Ee)+we.bandwidth()/2;if(d.value==="violin"){const KA=wie(nt),rA=nt.length,on=1.06*KA*Math.pow(rA,-1/5),Xt=Le.ticks(50),vi=Qt(jt(on),Xt)(nt),an=pE(vi,ze=>ze[1]),ye=zs().domain([0,an]).range([0,we.bandwidth()/2]);b.property("__scales__",{xScale:we,yScale:Le,margin:ue,width:H,height:k});const We=Hoe().x0(ze=>we(Ee)+we.bandwidth()/2-ye(ze[1])).x1(ze=>we(Ee)+we.bandwidth()/2+ye(ze[1])).y(ze=>Le(ze[0])).curve(Yoe);ge.append("path").datum(vi).attr("d",We).attr("fill",st(Ee)).attr("opacity",.7).attr("stroke",st(Ee)).attr("stroke-width",1.5),ge.append("line").attr("x1",Nt-5).attr("x2",Nt+5).attr("y1",Le(iA)).attr("y2",Le(iA)).attr("stroke","white").attr("stroke-width",3),ge.append("rect").attr("x",Nt-3).attr("y",Le(U)).attr("width",6).attr("height",Le(Li)-Le(U)).attr("fill","white").attr("stroke","#333").attr("stroke-width",1)}else{const KA=Math.min(we.bandwidth()*.6,80),rA=KA*.5;b.property("__scales__",{xScale:we,yScale:Le,margin:ue,width:H,height:k}),ge.append("line").attr("x1",Nt).attr("x2",Nt).attr("y1",Le(zA)).attr("y2",Le(Li)).attr("stroke",st(Ee)).attr("stroke-width",2),ge.append("line").attr("x1",Nt).attr("x2",Nt).attr("y1",Le(U)).attr("y2",Le(Ei)).attr("stroke",st(Ee)).attr("stroke-width",2),ge.append("line").attr("x1",Nt-rA/2).attr("x2",Nt+rA/2).attr("y1",Le(zA)).attr("y2",Le(zA)).attr("stroke",st(Ee)).attr("stroke-width",2),ge.append("line").attr("x1",Nt-rA/2).attr("x2",Nt+rA/2).attr("y1",Le(Ei)).attr("y2",Le(Ei)).attr("stroke",st(Ee)).attr("stroke-width",2),ge.append("rect").attr("x",Nt-KA/2).attr("y",Le(U)).attr("width",KA).attr("height",Le(Li)-Le(U)).attr("fill",st(Ee)).attr("opacity",.7).attr("stroke",st(Ee)).attr("stroke-width",2),ge.append("line").attr("x1",Nt-KA/2).attr("x2",Nt+KA/2).attr("y1",Le(iA)).attr("y2",Le(iA)).attr("stroke","white").attr("stroke-width",2.5)}});const Pt=ge.append("g").attr("transform",`translate(0,${ne})`).call(Hie(we));I.value.toLowerCase()==="atlas_annotation"?Pt.selectAll(".tick").each(function(){const Ve=Kn(this),Ee=Ve.select("text"),qt=`https://nervosensus.netlify.app/?view=cards&atlasannotation=${Ee.text()}`;Ve.append("a").attr("href",qt).attr("target","_blank").node().appendChild(Ee.node()),Ee.attr("transform","rotate(-45)").style("text-anchor","end").style("font-size","12px").style("fill","#667eea").style("cursor","pointer")}):Pt.selectAll("text").attr("transform","rotate(-45)").style("text-anchor","end").style("font-size","12px"),ge.append("g").call(Jie(Le)).selectAll("text").style("font-size","12px"),ge.append("text").attr("x",j/2).attr("y",ne+ue.bottom-10).attr("text-anchor","middle").style("font-size","14px").style("font-weight","600").text(I.value);const Kt=`${C.value} Expression`;ge.append("text").attr("transform","rotate(-90)").attr("x",-ne/2).attr("y",-ue.left+20).attr("text-anchor","middle").style("font-size","14px").style("font-weight","600").text(Kt),b.append("text").attr("x",H/2).attr("y",20).attr("text-anchor","middle").style("font-size","16px").style("font-weight","700").text(`Violin Plot: ${Kt} by ${I.value}`)}function x(S){if(!S||S.length===0)return;const b=r.value;if(!b)return;const T=Kn(n.value).property("__scales__");if(!T){console.warn("Scales not found on SVG");return}const{xScale:O,yScale:H,margin:k,width:$,height:re}=T,ue=window.devicePixelRatio||1;b.width=$*ue,b.height=re*ue,b.style.width=`${$}px`,b.style.height=`${re}px`;const j=b.getContext("2d");j.scale(ue,ue),j.clearRect(0,0,$,re),j.save(),j.translate(k.left,k.top);const ne=Of(fS);S.forEach(ge=>{const we=ge.category,Se=ge.values.filter(Qt=>Qt!=null&&!isNaN(Qt));if(Se.length===0)return;const $e=O(we)+O.bandwidth()/2,Le=O.bandwidth()*.35,st=ne(we);j.fillStyle=st,j.strokeStyle="white",j.lineWidth=.3,j.globalAlpha=.4,Se.forEach(Qt=>{const jt=$e+(Math.random()-.5)*Le,Pt=H(Qt);j.beginPath(),j.arc(jt,Pt,1.5,0,Math.PI*2),j.fill(),j.stroke()})}),j.restore()}function R(){if(Q.value.length>0)if(p.value)x(Q.value);else{const S=r.value;S&&S.getContext("2d").clearRect(0,0,S.width,S.height)}}return(S,b)=>(f.openBlock(),f.createElementBlock("div",the,[o.value?(f.openBlock(),f.createElementBlock("div",Ahe,[...b[5]||(b[5]=[f.createElementVNode("div",{class:"spinner"},null,-1),f.createElementVNode("p",{class:"loading-text"},"Loading data...",-1)])])):g.value?(f.openBlock(),f.createElementBlock("div",ihe,[b[6]||(b[6]=f.createElementVNode("strong",null,"� Error:",-1)),f.createTextVNode(" "+f.toDisplayString(g.value),1)])):(f.openBlock(),f.createElementBlock("div",nhe,[b[12]||(b[12]=f.createElementVNode("div",{class:"header"},[f.createElementVNode("h3",{class:"title"},"Gene Expression Distribution")],-1)),f.createElementVNode("div",rhe,[f.createElementVNode("div",she,[f.createElementVNode("label",ohe,[b[7]||(b[7]=f.createTextVNode(" X-axis (Metadata): ",-1)),f.withDirectives(f.createElementVNode("select",{"onUpdate:modelValue":b[0]||(b[0]=D=>I.value=D),onChange:F,class:"select"},[(f.openBlock(!0),f.createElementBlock(f.Fragment,null,f.renderList(l.value,D=>(f.openBlock(),f.createElementBlock("option",{key:D,value:D},f.toDisplayString(D),9,ahe))),128))],544),[[f.vModelSelect,I.value]])]),f.createElementVNode("label",ghe,[b[8]||(b[8]=f.createTextVNode(" Gene Expression ",-1)),f.createElementVNode("div",che,[f.withDirectives(f.createElementVNode("input",{"onUpdate:modelValue":b[1]||(b[1]=D=>u.value=D),type:"text",placeholder:"Gene name (e.g., CDH9)",class:"gene-input",list:"gene-suggestions",onInput:m},null,544),[[f.vModelText,u.value]]),f.createElementVNode("datalist",lhe,[(f.openBlock(!0),f.createElementBlock(f.Fragment,null,f.renderList(B.value,D=>(f.openBlock(),f.createElementBlock("option",{key:D,value:D},null,8,Ihe))),128))]),f.createElementVNode("button",{onClick:_,disabled:!u.value.trim()||a.value,class:"visualize-btn"},f.toDisplayString(a.value?"Loading...":"Visualize"),9,hhe)])]),f.createElementVNode("label",uhe,[b[9]||(b[9]=f.createTextVNode(" Plot Type: ",-1)),f.createElementVNode("div",fhe,[f.createElementVNode("button",{onClick:b[2]||(b[2]=D=>d.value="violin"),class:f.normalizeClass([{active:d.value==="violin"},"toggle-btn"])}," Violin ",2),f.createElementVNode("button",{onClick:b[3]||(b[3]=D=>d.value="box"),class:f.normalizeClass([{active:d.value==="box"},"toggle-btn"])}," Box ",2)])]),f.createElementVNode("label",Bhe,[f.withDirectives(f.createElementVNode("input",{"onUpdate:modelValue":b[4]||(b[4]=D=>p.value=D),type:"checkbox",class:"checkbox",onChange:R},null,544),[[f.vModelCheckbox,p.value]]),b[10]||(b[10]=f.createTextVNode(" Show data points ",-1))])]),f.createElementVNode("div",Che,[a.value?(f.openBlock(),f.createElementBlock("div",dhe,[...b[11]||(b[11]=[f.createElementVNode("div",{class:"small-spinner"},null,-1),f.createElementVNode("p",null,"Loading data...",-1)])])):f.createCommentVNode("",!0),(f.openBlock(),f.createElementBlock("svg",{ref_key:"violinSvg",ref:n,class:"violin-svg"},null,512)),f.createElementVNode("canvas",{ref_key:"dataPointsCanvas",ref:r,class:"data-points-canvas"},null,512)])])]))]))}},[["__scopeId","data-v-fe87f25d"]]),Qhe={class:"gene-x-expression-wrap"},phe="https://temp-precision-dashboard-data.s3.us-east-1.amazonaws.com/humandrg/v2",kL=_a(f.defineComponent({inheritAttrs:!1,__name:"GeneXDistribution",props:{dataPath:{},initialGene:{},initialMetadataColumn:{}},setup(A){const e=A,t=Yc(),i=EE(),n=f.computed(()=>e.dataPath??(t?f.unref(t.s3Url):null)??phe);f.onMounted(()=>{e.initialGene&&i.selectedGeneX===null&&i.setSelectedGeneX(e.initialGene),e.initialMetadataColumn&&i.selectedMetadataColumn===null&&i.setSelectedMetadataColumn(e.initialMetadataColumn)});function r(s,o){s==="selectedGene"?i.setSelection("selectedGeneX",o):i.setSelection(s,o)}return(s,o)=>(f.openBlock(),f.createElementBlock(f.Fragment,null,[f.renderSlot(s.$slots,"default",{},void 0,!0),f.createElementVNode("div",Qhe,[f.createVNode(Ehe,{gene:f.unref(i).selectedGeneX??void 0,metadataColumn:f.unref(i).selectedMetadataColumn??void 0,"onUpdate:Vars":r,"data-path":n.value},null,8,["gene","metadataColumn","data-path"])])],64))}}),[["__scopeId","data-v-3180d386"]]),yhe=Object.freeze(Object.defineProperty({__proto__:null,DataExplorer:DF,DataExplorerCore:SF,clearDataExplorerStore:_F,createDataExplorerStore:wF},Symbol.toStringTag,{value:"Module"})),mhe=Object.freeze(Object.defineProperty({__proto__:null,UMAP:mN,UMAPControlPanel:EN,UMAPScatterplot:dN,clearUMAPStore:yN,createUMAPStore:pN},Symbol.toStringTag,{value:"Module"})),whe=Object.freeze(Object.defineProperty({__proto__:null,Markdown:BZ},Symbol.toStringTag,{value:"Module"})),_he=Object.freeze(Object.defineProperty({__proto__:null,TextViewer:SZ},Symbol.toStringTag,{value:"Module"})),She={class:"pp-container"},Dhe={class:"pp-header"},vhe={class:"pp-controls"},bhe={class:"pp-field"},Rhe=["disabled"],xhe={class:"pp-field"},Fhe=["disabled"],Nhe=["value"],khe=["value"],Mhe=["disabled"],The=["value"],Lhe={class:"pp-field"},Uhe=["disabled"],Ghe={key:0,class:"pp-message"},ED=100,QD=12,pD="(other)",Ohe=Object.freeze(Object.defineProperty({__proto__:null,ProportionPlot:Ea(f.defineComponent({__name:"ProportionPlot",props:{apiUrl:{},pkg:{},srcUrl:{},srcFileType:{},srcFileId:{},tableNameOverride:{}},setup(A){const e=A;let t;const i=f.inject("duckdb");if(!i)throw new Error('[@pennsieve-viz/core] DuckDB store not provided. Please provide a DuckDB store via app.provide("duckdb", store)');const n=i,r=f.ref(null),s=f.ref(null),o=f.ref(e.srcUrl||"https://temp-precision-dashboard-data.s3.us-east-1.amazonaws.com/precision_human_drg_data.parquet"),g=f.computed(()=>n.formatIdFromUrl(o.value)),a=f.ref(!1),c=f.ref(""),l=f.ref([]),I=f.ref(""),h=f.ref(""),u=`proportion-plot-${Math.random().toString(36).slice(2)}`;f.watch(()=>({srcUrl:e.srcUrl,srcFileType:e.srcFileType,srcFileId:e.srcFileId,pkg:e.pkg,apiUrl:e.apiUrl}),async({srcUrl:x,srcFileType:R,srcFileId:S,pkg:b,apiUrl:D})=>{var T,O;try{if(x&&(o.value=x),await p(),o.value){const $=R??(o.value.toLowerCase().endsWith(".csv")?"csv":"parquet");await E($,g.value);return}const H=(T=b==null?void 0:b.content)==null?void 0:T.id,k=(O=b==null?void 0:b.content)==null?void 0:O.packageType;if(H&&D){const $=await _(H,D);if(!$)return;const re=await F(H,$,D),ue=k==="CSV"?"csv":"parquet",j=$.replace(/[^a-zA-Z0-9_.-]/g,"_");o.value=re,await E(ue,j)}}catch(H){console.error("[ProportionPlot] Load failed:",(H==null?void 0:H.message)||H),c.value=`Load failed: ${(H==null?void 0:H.message)||H}`}},{immediate:!0});const C=new Set(["VARCHAR","STRING","TEXT","BOOL","BOOLEAN","DATE","TIMESTAMP"]),B=f.computed(()=>l.value.filter(x=>C.has(x.type)||x.type.startsWith("VARCHAR"))),d=f.computed(()=>l.value.filter(x=>!C.has(x.type)));async function p(){if(r.value)return;const{connectionId:x}=await n.createConnection(`prop_${Date.now()}`);r.value=x}function Q(x){const R=String(x).replace(/[^A-Za-z0-9_]/g,"_");return(/^[A-Za-z_]/.test(R)?R:`t_${R}`).slice(0,63)}async function E(x,R){r.value||await p();const S=(R||e.srcFileId||o.value||"file").replace(/[^A-Za-z0-9]/g,"_");a.value=!0,c.value="Loading file into DuckDB…";try{const b=x??(o.value.toLowerCase().endsWith(".csv")?"csv":"parquet"),D=e.tableNameOverride||Q(`file_${S.slice(0,48)}`),T=await n.loadFile(o.value,b,D,{},r.value,S);s.value=T,await y(!0)}finally{a.value=!1}}function w(x){return'"'+String(x).replace(/"/g,'""')+'"'}async function y(x=!1){var R,S,b,D;if(!s.value||!r.value)return;const T=`PRAGMA table_info(${w(s.value)})`,O=await n.executeQuery(T,r.value);if(l.value=O.map(H=>({name:String(H.name),type:String(H.type).toUpperCase()})),x||!I.value||!h.value){const H=l.value.filter(k=>C.has(k.type)||k.type.startsWith("VARCHAR"));I.value=((R=H[0])==null?void 0:R.name)||((S=l.value[0])==null?void 0:S.name)||"",h.value=((b=H[1])==null?void 0:b.name)||((D=H[0])==null?void 0:D.name)||""}c.value=`Columns: ${l.value.length}.`}async function m(){if(!(!s.value||!r.value)){if(!I.value||!h.value){c.value="Pick both X and Y";return}a.value=!0,c.value="Computing proportions…";try{const x=w(s.value),R=w(I.value),S=w(h.value),b=`
|
|
391
391
|
WITH xf AS (
|
|
392
392
|
SELECT ${R} AS x, COUNT(*) AS c
|
|
393
393
|
FROM ${x}
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.data-explorer-wrap[data-v-c63ff2cc]{overflow:auto;margin:0 10px}.data-explorer-wrap .data-explorer-info[data-v-c63ff2cc]{line-height:20px;position:absolute;right:0;margin-right:30px}[data-v-c63ff2cc] .dashboard-header h1{display:none}.umap-wrap[data-v-78e97b02]{height:100%;margin:0 10px;overflow:none}.umap-wrap .umap-info[data-v-78e97b02]{line-height:20px;position:absolute;right:0;margin-right:6px}.umap-wrap[data-v-78e97b02] .control-panel{top:44px}.proportion-plot-wrap[data-v-96c1c44d]{width:100%;height:100%;margin:0 10px;overflow:hidden}[data-v-96c1c44d] .dashboard-header h1{display:none}[data-v-96c1c44d] .pp-container{height:100%}.gene-coexpression-viewer[data-v-4a0fb898]{display:flex;flex-direction:row;max-width:1600px;margin:0 auto;padding:0;height:100%;gap:16px}.viewer-left[data-v-4a0fb898]{display:flex;flex-direction:column;height:100%;min-height:0;flex:0 0 auto;gap:16px;overflow:hidden}.viewer-right[data-v-4a0fb898]{display:flex;flex-direction:column;height:100%;min-height:0;gap:16px;flex:1}.controls-panel[data-v-4a0fb898]{background:#fff;border:1px solid #e2e8f0;border-radius:2px;padding:0;flex:1;min-height:0}.stats-panel[data-v-4a0fb898]{background:linear-gradient(135deg,#667eea0d,#764ba20d);border:1px solid var(--border-color);border-radius:2px;padding:12px;display:grid;grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(2,1fr);gap:12px;flex:1;min-height:0}.controls-header[data-v-4a0fb898]{display:flex;justify-content:space-between;align-items:center;padding:8px 24px;gap:4px;border-bottom:1px solid #e2e8f0;background:linear-gradient(180deg,#fafbfc,#fff)}.controls-header h3[data-v-4a0fb898]{margin:0;font-size:18px;font-weight:600;color:#1a202c}.reduction-selector[data-v-4a0fb898]{display:flex;align-items:center;gap:12px}.reduction-selector label[data-v-4a0fb898]{font-size:13px;font-weight:500;color:#64748b}.reduction-selector select[data-v-4a0fb898]{padding:6px 12px;border:1px solid #e2e8f0;border-radius:2px;font-size:13px;background:#fff;color:#1a202c;cursor:pointer;transition:all .2s}.reduction-selector select[data-v-4a0fb898]:hover{border-color:#cbd5e1}.reduction-selector select[data-v-4a0fb898]:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.genes-section[data-v-4a0fb898]{padding:8px}.genes-input-group[data-v-4a0fb898]{grid-template-columns:1fr auto 1fr;display:grid;align-items:end;gap:16px;margin-bottom:20px}.gene-input-wrapper[data-v-4a0fb898]{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px}.gene-input-wrapper label[data-v-4a0fb898]{display:flex;align-items:center;gap:12px;font-size:13px;font-weight:500;color:#64748b;min-height:20px}.gene-number[data-v-4a0fb898]{font-weight:600;color:#1a202c}.selected-gene[data-v-4a0fb898]{font-weight:600;font-size:14px}.gene-input[data-v-4a0fb898]{padding:10px 14px;border:2px solid #e2e8f0;border-radius:2px;font-size:14px;transition:all .2s;background:#fff;color:#1a202c;min-width:0;box-sizing:border-box}.gene-input[data-v-4a0fb898]:hover{border-color:#cbd5e1}.gene-input[data-v-4a0fb898]:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.gene-input[data-v-4a0fb898]:disabled{background-color:#f8fafc;cursor:not-allowed;opacity:.6}.gene-input[data-v-4a0fb898]::placeholder{color:#94a3b8;font-size:13px}.vs-separator[data-v-4a0fb898]{display:flex;align-items:center;justify-content:center;padding:0 8px;flex-shrink:0;color:#cbd5e1;font-size:14px;font-weight:600;text-transform:uppercase;letter-spacing:1px}.visualize-btn[data-v-4a0fb898]{display:flex;align-items:center;justify-content:center;padding:12px 24px;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:2px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s;min-height:44px;box-shadow:0 2px 4px #667eea33}.visualize-btn[data-v-4a0fb898]:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 8px #667eea4d}.visualize-btn[data-v-4a0fb898]:disabled{background:#94a3b8;cursor:not-allowed;transform:none;opacity:.7;box-shadow:none}.loading-overlay[data-v-4a0fb898]{position:fixed;top:0;right:0;bottom:0;left:0;background:#fffffff2;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:1000}.spinner[data-v-4a0fb898]{width:60px;height:60px;border:5px solid #f3f3f3;border-top:5px solid var(--primary-color);border-radius:2px;animation:spin-4a0fb898 1s linear infinite}@keyframes spin-4a0fb898{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.error-panel[data-v-4a0fb898]{background:#fff3cd;border:1px solid #ffc107;border-radius:2px;padding:16px;margin-bottom:20px;color:#856404;display:flex;justify-content:space-between;align-items:center}.dismiss-btn[data-v-4a0fb898]{padding:4px 12px;background:transparent;border:1px solid #856404;border-radius:2px;color:#856404;cursor:pointer;font-size:12px;transition:all .2s}.dismiss-btn[data-v-4a0fb898]:hover{background:#856404;color:#fff}.stat-item[data-v-4a0fb898]{display:flex;flex-direction:column;padding:8px;background:#fff;border-radius:2px}.stat-label[data-v-4a0fb898]{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-secondary)}.stat-value[data-v-4a0fb898]{font-size:28px;font-weight:700;color:var(--text-primary)}.chart-container[data-v-4a0fb898]{min-height:0;display:flex;background:#fff;border:1px solid var(--border-color);border-radius:2px;padding:24px;flex:1;position:relative}.chart-container canvas[data-v-4a0fb898]{width:auto;height:auto;display:block}.chart-loading[data-v-4a0fb898]{display:flex;flex-direction:column;justify-content:center;align-items:center;height:400px;color:var(--text-secondary)}.small-spinner[data-v-4a0fb898]{width:40px;height:40px;border:3px solid #f3f3f3;border-top:3px solid var(--primary-color);border-radius:50%;animation:spin-4a0fb898 1s linear infinite;margin-bottom:16px}.tooltip[data-v-4a0fb898]{position:fixed;background:#fff;border:2px solid #667eea;border-radius:6px;padding:12px;pointer-events:none;z-index:10000;box-shadow:0 4px 12px #00000026;min-width:200px;max-width:300px;font-size:13px;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#fffffffa;line-height:1.2}.tooltip-header[data-v-4a0fb898]{font-weight:700;font-size:14px;color:#1a202c;margin-bottom:6px;padding-bottom:6px;border-bottom:1px solid #e2e8f0}.tooltip-row[data-v-4a0fb898]{display:flex;justify-content:space-between;align-items:center;padding:2px 0;gap:8px}.tooltip-label[data-v-4a0fb898]{font-weight:600;color:#64748b;margin:0}.tooltip-value[data-v-4a0fb898]{font-weight:500;color:#1a202c}.legend-container[data-v-4a0fb898]{flex-direction:column;align-items:center}.legend[data-v-4a0fb898]{flex-direction:row;align-items:flex-start;min-width:unset;width:100%;display:flex;gap:12px;background:#fff;border:1px solid var(--border-color);border-radius:2px;padding:16px}.legend-item[data-v-4a0fb898]{display:flex;align-items:center;gap:10px;font-size:14px;font-weight:500;flex-shrink:0;min-width:0}.color-picker[data-v-4a0fb898]{width:28px;height:28px;border:2px solid rgba(0,0,0,.1);border-radius:2px;cursor:pointer;padding:0;background:none;outline:none;transition:all .2s;box-shadow:0 1px 3px #0000001a}.color-picker[data-v-4a0fb898]:hover{transform:scale(1.05);border-color:#0003;box-shadow:0 2px 6px #00000026}.color-picker[data-v-4a0fb898]:focus{border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.floating-mixer-toggle[data-v-4a0fb898]{position:absolute;bottom:16px;right:16px;width:48px;height:48px;background:#fff;border:2px solid #e2e8f0;border-radius:12px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease;z-index:10;color:#64748b}.floating-mixer-toggle[data-v-4a0fb898]:hover{background:#f8fafc;border-color:#cbd5e1;color:#1a202c;transform:translateY(-2px)}.floating-mixer-panel[data-v-4a0fb898]{position:absolute;bottom:51px;right:16px;background:#fff;border:2px solid #e2e8f0;z-index:10;min-width:250px;overflow:hidden}.floating-mixer-header[data-v-4a0fb898]{display:flex;justify-content:space-between;align-items:center;padding:4px;background:linear-gradient(135deg,#f8fafc,#e2e8f0);border-bottom:1px solid #e2e8f0;font-size:14px;font-weight:600;color:#1a202c}.floating-mixer-close[data-v-4a0fb898]{background:none;border:none;padding:4px;border-radius:4px;cursor:pointer;color:#64748b;transition:all .2s;display:flex;align-items:center;justify-content:center}.floating-mixer-close[data-v-4a0fb898]:hover{background:#64748b1a;color:#1a202c}.floating-gradient-container[data-v-4a0fb898]{position:relative;display:inline-flex;align-items:flex-start;gap:16px;padding:16px}.gradient-canvas[data-v-4a0fb898]{border:2px solid #e2e8f0;border-radius:2px}.gradient-labels[data-v-4a0fb898]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;font-size:10px;font-weight:500;color:#64748b}.y-axis-label[data-v-4a0fb898]{position:absolute;left:-38px;bottom:60px;transform:rotate(-90deg);transform-origin:center;white-space:nowrap;z-index:10;background:#fff;padding:2px 4px;border-radius:2px;font-size:9px}.x-axis-label[data-v-4a0fb898]{position:absolute;bottom:5px;left:60px;transform:translate(-50%);white-space:nowrap;z-index:10;background:#fff;padding:2px 4px;border-radius:2px;font-size:9px}.axis-arrow[data-v-4a0fb898]{position:absolute;font-size:12px;font-weight:700;color:#94a3b8;z-index:5}.x-arrow-right[data-v-4a0fb898]{bottom:5px;right:60px}.y-arrow-top[data-v-4a0fb898]{left:5px;top:20px}.empty-state[data-v-4a0fb898]{text-align:center;padding:80px 20px;color:var(--text-secondary)}.empty-icon[data-v-4a0fb898]{font-size:64px;margin-bottom:20px;opacity:.5}.empty-state h3[data-v-4a0fb898]{font-size:24px;margin-bottom:12px;color:var(--text-primary)}.empty-state p[data-v-4a0fb898]{font-size:16px}@media (max-width: 768px){.controls-header[data-v-4a0fb898]{flex-direction:column;align-items:flex-start;padding:8px 20px}.genes-input-group[data-v-4a0fb898]{grid-template-columns:1fr}.vs-separator[data-v-4a0fb898]{order:2;padding:8px 0}.genes-section[data-v-4a0fb898]{padding:8px}}.gene-coexpression-wrap[data-v-2eeb7a01]{height:100%;width:100%;padding:20px;background:#fff;box-sizing:border-box;overflow:hidden}.umap-comparison-dashboard[data-v-e6bb4908]{height:100%}.both-pannels[data-v-e6bb4908]{display:flex;flex-direction:row;gap:24px;height:100%;width:100%;background:#f8fafc}.dashboard[data-v-e6bb4908]{display:flex;flex-direction:column;height:100%;width:100%}.panel[data-v-e6bb4908]{flex:1;display:flex;flex-direction:column;gap:0;background:#fff;border:1px solid #e2e8f0;border-radius:2px;padding:24px;min-height:0;width:50%;height:auto;position:relative}.header[data-v-e6bb4908]{display:flex;flex-direction:column;gap:12px;padding-bottom:16px;border-bottom:1px solid #e2e8f0;height:20px;flex-shrink:0}.title[data-v-e6bb4908]{margin:0;font-size:18px;font-weight:600;color:#1a202c}.filter-placeholder[data-v-e6bb4908]{height:0;display:flex;align-items:center;justify-content:center;color:#94a3b8;font-size:13px;font-style:italic;width:100%}.controls[data-v-e6bb4908]{display:flex;flex-direction:column;height:72px;flex-shrink:0;margin-top:16px}.label[data-v-e6bb4908]{display:flex;flex-direction:column;gap:8px;font-size:13px;font-weight:500;color:#64748b}.select[data-v-e6bb4908]{padding:10px 14px;border:2px solid #e2e8f0;border-radius:2px;font-size:14px;background:#fff;color:#1a202c;cursor:pointer;transition:all .2s}.select[data-v-e6bb4908]:hover{border-color:#cbd5e1}.select[data-v-e6bb4908]:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.gene-input-wrapper[data-v-e6bb4908]{display:flex;gap:12px}.gene-input[data-v-e6bb4908]{flex:1;padding:10px 14px;border:2px solid #e2e8f0;border-radius:2px;font-size:14px;background:#fff;color:#1a202c;transition:all .2s;min-width:0;box-sizing:border-box}.gene-input[data-v-e6bb4908]::placeholder{font-size:13px}.gene-input[data-v-e6bb4908]:hover{border-color:#cbd5e1}.gene-input[data-v-e6bb4908]:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.visualize-btn[data-v-e6bb4908]{padding:10px 24px;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:2px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s;box-shadow:0 2px 4px #667eea33}.visualize-btn[data-v-e6bb4908]:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 8px #667eea4d}.visualize-btn[data-v-e6bb4908]:disabled{background:#94a3b8;cursor:not-allowed;opacity:.7;transform:none;box-shadow:none}.canvas-container[data-v-e6bb4908]{flex:1;position:relative;background:#fff;border:1px solid #e2e8f0;border-radius:2px;min-height:0;display:flex;align-items:center;justify-content:center;margin-top:16px;height:89%}.canvas-container canvas[data-v-e6bb4908]{display:block;max-width:100%;max-height:100%;cursor:pointer}.canvas-container canvas[data-v-e6bb4908]:active{cursor:grabbing}.legend[data-v-e6bb4908]{background:#fff;border:1px solid #e2e8f0;border-radius:2px;padding:16px;height:10%;min-height:80px;flex-shrink:0;margin-top:16px;overflow-y:auto;transition:all .3s ease;position:relative;z-index:5}.legend-expanded[data-v-e6bb4908]{position:absolute;bottom:24px;left:24px;right:24px;height:60%;max-height:calc(100% - 200px);box-shadow:0 -4px 12px #00000026;z-index:10}.legend-header[data-v-e6bb4908]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.legend-title[data-v-e6bb4908]{font-size:13px;font-weight:600;color:#1a202c;text-transform:uppercase;letter-spacing:.5px;margin:0}.legend-toggle[data-v-e6bb4908]{background:transparent;border:1px solid #e2e8f0;border-radius:4px;padding:4px 8px;cursor:pointer;color:#64748b;font-size:12px;transition:all .2s;display:flex;align-items:center;justify-content:center;min-width:30px;height:24px}.legend-toggle[data-v-e6bb4908]:hover{background:#f8fafc;border-color:#667eea;color:#667eea}.legend-item[data-v-e6bb4908]{display:flex;align-items:center;gap:8px;font-size:13px;color:#64748b;cursor:pointer;padding:4px;border-radius:4px;transition:background .2s}.legend-items[data-v-e6bb4908]{display:flex;flex-wrap:wrap}.legend-item[data-v-e6bb4908]:hover{background:#f8fafc}.legend-color[data-v-e6bb4908]{width:20px;height:20px;border-radius:2px;border:2px solid;flex-shrink:0;position:relative;display:flex;align-items:center;justify-content:center;transition:all .2s;cursor:pointer}.legend-color-hidden[data-v-e6bb4908]{background:#fff!important;opacity:.6}.legend-x[data-v-e6bb4908]{color:#64748b;font-size:14px;font-weight:700;line-height:1}.legend-label[data-v-e6bb4908]{font-weight:500}.legend-link[data-v-e6bb4908]{color:inherit;text-decoration:none}.legend-link[data-v-e6bb4908]:hover{text-decoration:underline;color:#667eea}.tooltip[data-v-e6bb4908]{position:fixed;background:#fff;border:2px solid #667eea;border-radius:6px;padding:12px;pointer-events:none;z-index:10000;box-shadow:0 4px 12px #00000026;min-width:200px;max-width:300px;font-size:13px;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#fffffffa;line-height:1.2}.tooltip-header[data-v-e6bb4908]{font-weight:700;font-size:14px;color:#1a202c;margin-bottom:6px;padding-bottom:6px;border-bottom:1px solid #e2e8f0}.tooltip-row[data-v-e6bb4908]{display:flex;justify-content:space-between;align-items:center;padding:2px 0;gap:8px}.tooltip-label[data-v-e6bb4908]{font-weight:600;color:#64748b;margin:0}.tooltip-value[data-v-e6bb4908]{font-weight:500;color:#1a202c}.tooltip-gene[data-v-e6bb4908]{border-color:#00f}.gradient-bar[data-v-e6bb4908]{display:flex;flex-direction:column;gap:8px}.gradient-fill[data-v-e6bb4908]{height:20px;background:linear-gradient(to right,#c8c8c8,#00f);border-radius:2px;border:1px solid #e2e8f0}.gradient-labels[data-v-e6bb4908]{display:flex;justify-content:space-between;font-size:12px;color:#64748b;font-weight:500}.loading-container[data-v-e6bb4908]{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100vh;background:#fffffff2}.spinner[data-v-e6bb4908]{width:60px;height:60px;border:5px solid #f3f3f3;border-top:5px solid #667eea;border-radius:50%;animation:spin-e6bb4908 1s linear infinite}.loading-text[data-v-e6bb4908]{margin-top:20px;font-size:16px;color:#64748b}.loading-overlay[data-v-e6bb4908]{position:absolute;top:0;right:0;bottom:0;left:0;background:#ffffffe6;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:10}.small-spinner[data-v-e6bb4908]{width:40px;height:40px;border:3px solid #f3f3f3;border-top:3px solid #667eea;border-radius:50%;animation:spin-e6bb4908 1s linear infinite;margin-bottom:16px}.error-container[data-v-e6bb4908]{display:flex;justify-content:center;align-items:center;height:100vh;background:#fff3cd;border:1px solid #ffc107;padding:20px;color:#856404}@keyframes spin-e6bb4908{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.side-by-side-wrap[data-v-79a2dcfe]{height:100%;width:100%;padding:20px;background:#fff;box-sizing:border-box;overflow:hidden}.violin-plot-container[data-v-fe87f25d]{height:100%;width:100%;display:flex;flex-direction:column}.dashboard[data-v-fe87f25d]{display:flex;flex-direction:column;height:100%;width:100%;background:#fff;border:1px solid #e2e8f0;border-radius:2px;padding:24px}.header[data-v-fe87f25d]{padding-bottom:16px;border-bottom:1px solid #e2e8f0;flex-shrink:0}.title[data-v-fe87f25d]{margin:0;font-size:18px;font-weight:600;color:#1a202c}.content-layout[data-v-fe87f25d]{display:flex;gap:24px;flex:1;min-height:0}.controls[data-v-fe87f25d]{width:20%;min-width:250px;display:flex;flex-direction:column;padding:16px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:2px;flex-shrink:0;overflow-y:auto}.label[data-v-fe87f25d]{display:flex;flex-direction:column;gap:8px;font-size:13px;font-weight:500;color:#64748b;flex:1}.gene-expression-label[data-v-fe87f25d]{font-size:14px;font-weight:600;color:#1a202c}.select[data-v-fe87f25d]{padding:10px 14px;border:2px solid #e2e8f0;border-radius:2px;font-size:14px;background:#fff;color:#1a202c;cursor:pointer;transition:all .2s}.select[data-v-fe87f25d]:hover{border-color:#cbd5e1}.select[data-v-fe87f25d]:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.gene-input-wrapper[data-v-fe87f25d]{display:flex;flex-direction:column;gap:12px}.gene-input[data-v-fe87f25d]{flex:1;padding:10px 14px;border:2px solid #e2e8f0;border-radius:2px;font-size:14px;background:#fff;color:#1a202c;transition:all .2s;min-width:0;box-sizing:border-box}.gene-input[data-v-fe87f25d]::placeholder{font-size:13px}.gene-input[data-v-fe87f25d]:hover{border-color:#cbd5e1}.gene-input[data-v-fe87f25d]:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.visualize-btn[data-v-fe87f25d]{padding:10px 24px;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:2px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s;box-shadow:0 2px 4px #667eea33}.visualize-btn[data-v-fe87f25d]:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 8px #667eea4d}.visualize-btn[data-v-fe87f25d]:disabled{background:#94a3b8;cursor:not-allowed;opacity:.7;transform:none;box-shadow:none}.plot-type-toggle[data-v-fe87f25d]{display:flex;gap:8px}.toggle-btn[data-v-fe87f25d]{flex:1;padding:8px 16px;background:#fff;border:2px solid #e2e8f0;border-radius:2px;font-size:13px;font-weight:500;color:#64748b;cursor:pointer;transition:all .2s}.toggle-btn[data-v-fe87f25d]:hover{border-color:#cbd5e1;background:#f8fafc}.toggle-btn.active[data-v-fe87f25d]{background:linear-gradient(135deg,#667eea,#764ba2);border-color:#667eea;color:#fff}.checkbox-label[data-v-fe87f25d]{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:500;color:#64748b;cursor:pointer}.checkbox[data-v-fe87f25d]{width:18px;height:18px;cursor:pointer;accent-color:#667eea}.plot-container[data-v-fe87f25d]{flex:1;width:80%;position:relative;background:#fff;border:1px solid #e2e8f0;border-radius:2px;min-height:0;display:flex;align-items:center;justify-content:center}.violin-svg[data-v-fe87f25d]{width:100%;height:100%;display:block}.data-points-canvas[data-v-fe87f25d]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.loading-container[data-v-fe87f25d]{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;background:#fffffff2}.spinner[data-v-fe87f25d]{width:60px;height:60px;border:5px solid #f3f3f3;border-top:5px solid #667eea;border-radius:50%;animation:spin-fe87f25d 1s linear infinite}.loading-text[data-v-fe87f25d]{margin-top:20px;font-size:16px;color:#64748b}.loading-overlay[data-v-fe87f25d]{position:absolute;top:0;right:0;bottom:0;left:0;background:#ffffffe6;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:10}.small-spinner[data-v-fe87f25d]{width:40px;height:40px;border:3px solid #f3f3f3;border-top:3px solid #667eea;border-radius:50%;animation:spin-fe87f25d 1s linear infinite;margin-bottom:16px}.error-container[data-v-fe87f25d]{display:flex;justify-content:center;align-items:center;height:100%;background:#fff3cd;border:1px solid #ffc107;padding:20px;color:#856404}@keyframes spin-fe87f25d{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.gene-x-expression-wrap[data-v-3180d386]{height:100%;width:100%;padding:20px;background:#fff;box-sizing:border-box;overflow:hidden}.dashboard-container[data-v-b5de149e]{display:flex;flex-direction:column;margin:0 auto;padding:20px}.dashboard-header[data-v-b5de149e]{display:flex;justify-content:space-between;align-items:center;margin-bottom:30px;padding-bottom:15px;border-bottom:2px solid #e0e0e0}.dashboard-header h1[data-v-b5de149e]{margin:0;color:#333}.status-indicator[data-v-b5de149e]{padding:8px 16px;border-radius:20px;font-weight:500;color:#fff;background-color:#666}.status-indicator.loading[data-v-b5de149e]{background-color:#ff9800}.status-indicator.connected[data-v-b5de149e]{background-color:#14a758}.dashboard-content[data-v-b5de149e]{display:grid;gap:25px}.config-panel[data-v-b5de149e],.query-panel[data-v-b5de149e],.results-panel[data-v-b5de149e],.error-panel[data-v-b5de149e]{background:#fff;width:inherit;border:1px solid #ddd;padding:20px;overflow:scroll}.config-panel h3[data-v-b5de149e],.query-panel h3[data-v-b5de149e],.results-panel h3[data-v-b5de149e],.error-panel h3[data-v-b5de149e]{margin-top:0;color:#333;border-bottom:1px solid #eee;padding-bottom:10px}.query-info[data-v-b5de149e]{background:#e8f4fd;border:1px solid #bee5eb;border-radius:6px;padding:12px;margin-bottom:15px}.query-info .info-text[data-v-b5de149e]{color:#0c5460;font-size:14px;font-weight:500}.pagination-wrapper[data-v-b5de149e]{display:flex;flex-direction:row;justify-content:flex-end}.query-info .info-text code[data-v-b5de149e]{background:#d1ecf1;color:#0c5460;padding:2px 6px;border-radius:3px;font-family:Courier New,monospace;font-weight:600}.form-group[data-v-b5de149e]{margin-bottom:15px}.form-group label[data-v-b5de149e]{display:block;margin-bottom:5px;font-weight:500;color:#555}.url-input[data-v-b5de149e],.table-input[data-v-b5de149e],.query-textarea[data-v-b5de149e],.display-mode[data-v-b5de149e]{width:calc(100% - 16px);padding:10px;border:1px solid #ddd;border-radius:4px;font-size:14px;margin:8px 0}.query-textarea[data-v-b5de149e]{font-family:Courier New,monospace;resize:vertical;min-height:100px}.url-input[data-v-b5de149e]:focus,.table-input[data-v-b5de149e]:focus,.query-textarea[data-v-b5de149e]:focus{outline:none;border-color:#2196f3}.load-btn[data-v-b5de149e],.execute-btn[data-v-b5de149e],.example-btn[data-v-b5de149e],.export-btn[data-v-b5de149e],.clear-error-btn[data-v-b5de149e],.page-btn[data-v-b5de149e]{background:#2196f3;color:#fff;border:none;padding:10px 20px;border-radius:4px;cursor:pointer;font-size:14px;transition:background-color .2s}.load-btn[data-v-b5de149e]:hover,.execute-btn[data-v-b5de149e]:hover,.export-btn[data-v-b5de149e]:hover,.clear-error-btn[data-v-b5de149e]:hover,.page-btn[data-v-b5de149e]:hover{background:#1976d2}.load-btn[data-v-b5de149e]:disabled,.execute-btn[data-v-b5de149e]:disabled,.page-btn[data-v-b5de149e]:disabled{background:#ccc;cursor:not-allowed}.query-examples[data-v-b5de149e]{margin-bottom:15px;display:flex;gap:10px;flex-wrap:wrap;align-items:center}.query-examples span[data-v-b5de149e]{font-weight:500;color:#666}.example-btn[data-v-b5de149e]{background:#f5f5f5;color:#333;padding:6px 12px;font-size:12px}.example-btn[data-v-b5de149e]:hover{background:#e0e0e0}.results-controls[data-v-b5de149e]{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.left-controls[data-v-b5de149e]{display:flex;align-items:center}.right-controls[data-v-b5de149e]{display:flex;align-items:center;gap:15px}.results-pagination[data-v-b5de149e]{margin-right:20px}.table-container[data-v-b5de149e]{overflow-x:auto}.results-table[data-v-b5de149e]{width:100%;border-collapse:collapse;font-size:13px}.results-table th[data-v-b5de149e],.results-table td[data-v-b5de149e]{border:1px solid #ddd;padding:8px;text-align:left}.results-table th[data-v-b5de149e]{background:#f8f9fa;font-weight:600;position:sticky;top:0}.results-table tbody tr[data-v-b5de149e]:hover{background:#f5f5f5}.bottom-pagination[data-v-b5de149e]{display:flex;justify-content:center;align-items:center;padding:20px 0;margin-top:20px;border-top:1px solid #e9ecef}.page-info[data-v-b5de149e]{font-weight:500;color:#666}.json-container[data-v-b5de149e]{background:#f8f9fa;border:1px solid #e9ecef;border-radius:4px;padding:15px;max-height:400px;overflow:auto}.json-container pre[data-v-b5de149e]{margin:0;font-size:12px;white-space:pre-wrap}.error-panel[data-v-b5de149e]{border-color:#f44336;background:#ffebee}.error-panel h3[data-v-b5de149e]{color:#d32f2f}.error-panel p[data-v-b5de149e]{color:#c62828;margin:10px 0}.clear-error-btn[data-v-b5de149e]{background:#f44336}.clear-error-btn[data-v-b5de149e]:hover{background:#d32f2f}.execute-query-button[data-v-b5de149e]{cursor:pointer;background:#f5f5f5;color:#333;padding:6px 12px;border:solid 1px #cbcbcb}.app-container[data-v-7298e5bf]{color:#000}.scatterplot-container[data-v-aa7d57bd]{width:100%;height:100%;background:#f0f0f0}canvas[data-v-aa7d57bd]{display:block;cursor:crosshair;width:100%;height:100%}#tooltip[data-v-aa7d57bd]{position:absolute;background:#000c;color:#fff;padding:8px 12px;border-radius:4px;font-size:14px;pointer-events:none;opacity:0;transition:opacity .2s;z-index:200;white-space:nowrap}#debug[data-v-aa7d57bd]{position:absolute;bottom:20px;right:20px;background:#fffc;padding:10px;border-radius:5px;font-family:monospace}.control-panel[data-v-832c88a6]{position:absolute;top:20px;left:20px;background:#ffffffd9;padding:15px;border-radius:5px;box-shadow:0 2px 10px #0003;z-index:100;max-width:320px}.color-option[data-v-832c88a6]{margin-bottom:15px}.legend-item[data-v-832c88a6]{display:flex;align-items:center;gap:10px;margin:4px 0}.legend-color[data-v-832c88a6]{width:18px;height:18px;border-radius:3px}.legend-label[data-v-832c88a6]{font-size:14px}.app-container[data-v-1515ae28]{height:100%}.pp-container[data-v-1e3cf8a1]{padding:16px;height:100%;display:flex;flex-direction:column;overflow:hidden}.pp-header[data-v-1e3cf8a1]{flex:0 0 auto;overflow:scroll}.pp-controls[data-v-1e3cf8a1]{display:flex;flex-wrap:wrap;align-items:flex-end;gap:2px}.pp-field[data-v-1e3cf8a1]{display:flex;gap:6px}.pp-field label[data-v-1e3cf8a1]{font-size:14px;font-weight:600;align-content:center}.pp-input[data-v-1e3cf8a1],.pp-select[data-v-1e3cf8a1]{border:1px solid #d1d5db;border-radius:4px;padding:4px;min-width:12rem;font-size:14px}.pp-btn[data-v-1e3cf8a1]{background:#f3f4f6;color:#374151;border:1px solid #d1d5db;padding:6px 8px;border-radius:4px;cursor:pointer}.pp-btn[data-v-1e3cf8a1]:hover{background:#e5e7eb}.pp-btn--primary[data-v-1e3cf8a1]{background:#243d8e;border-color:#243d8e;color:#fff}.pp-btn--primary[data-v-1e3cf8a1]:hover{background:#4338ca}.pp-btn[data-v-1e3cf8a1]:disabled,.pp-input[data-v-1e3cf8a1]:disabled,.pp-select[data-v-1e3cf8a1]:disabled{opacity:.5;cursor:not-allowed}.pp-message[data-v-1e3cf8a1]{font-size:13px;color:#4b5563;margin-top:4px}.pp-plot[data-v-1e3cf8a1]{flex:1 1 auto;min-height:0;width:100%;height:80%}.dashboard-container[data-v-04bcbc5e]{display:flex;flex-direction:column;margin:0 auto;padding:20px}.dashboard-header[data-v-04bcbc5e]{display:flex;justify-content:space-between;align-items:center;margin-bottom:30px;padding-bottom:15px;border-bottom:2px solid #e0e0e0}.dashboard-header h1[data-v-04bcbc5e]{margin:0;color:#333}.status-indicator[data-v-04bcbc5e]{padding:8px 16px;border-radius:20px;font-weight:500;color:#fff;background-color:#666}.status-indicator.loading[data-v-04bcbc5e]{background-color:#ff9800}.status-indicator.connected[data-v-04bcbc5e]{background-color:#14a758}.dashboard-content[data-v-04bcbc5e]{display:grid;gap:25px}.config-panel[data-v-04bcbc5e],.query-panel[data-v-04bcbc5e],.results-panel[data-v-04bcbc5e],.error-panel[data-v-04bcbc5e]{background:#fff;width:inherit;border:1px solid #ddd;padding:20px;overflow:scroll}.config-panel h3[data-v-04bcbc5e],.query-panel h3[data-v-04bcbc5e],.results-panel h3[data-v-04bcbc5e],.error-panel h3[data-v-04bcbc5e]{margin-top:0;color:#333;border-bottom:1px solid #eee;padding-bottom:10px}.query-info[data-v-04bcbc5e]{background:#e8f4fd;border:1px solid #bee5eb;border-radius:6px;padding:12px;margin-bottom:15px}.query-info .info-text[data-v-04bcbc5e]{color:#0c5460;font-size:14px;font-weight:500}.pagination-wrapper[data-v-04bcbc5e]{display:flex;flex-direction:row;justify-content:flex-end}.query-info .info-text code[data-v-04bcbc5e]{background:#d1ecf1;color:#0c5460;padding:2px 6px;border-radius:3px;font-family:Courier New,monospace;font-weight:600}.form-group[data-v-04bcbc5e]{margin-bottom:15px}.form-group label[data-v-04bcbc5e]{display:block;margin-bottom:5px;font-weight:500;color:#555}.url-input[data-v-04bcbc5e],.table-input[data-v-04bcbc5e],.query-textarea[data-v-04bcbc5e],.display-mode[data-v-04bcbc5e]{width:calc(100% - 16px);padding:10px;border:1px solid #ddd;border-radius:4px;font-size:14px;margin:8px 0}.query-textarea[data-v-04bcbc5e]{font-family:Courier New,monospace;resize:vertical;min-height:100px}.url-input[data-v-04bcbc5e]:focus,.table-input[data-v-04bcbc5e]:focus,.query-textarea[data-v-04bcbc5e]:focus{outline:none;border-color:#2196f3}.load-btn[data-v-04bcbc5e],.execute-btn[data-v-04bcbc5e],.example-btn[data-v-04bcbc5e],.export-btn[data-v-04bcbc5e],.clear-error-btn[data-v-04bcbc5e],.page-btn[data-v-04bcbc5e]{background:#2196f3;color:#fff;border:none;padding:10px 20px;border-radius:4px;cursor:pointer;font-size:14px;transition:background-color .2s}.load-btn[data-v-04bcbc5e]:hover,.execute-btn[data-v-04bcbc5e]:hover,.export-btn[data-v-04bcbc5e]:hover,.clear-error-btn[data-v-04bcbc5e]:hover,.page-btn[data-v-04bcbc5e]:hover{background:#1976d2}.load-btn[data-v-04bcbc5e]:disabled,.execute-btn[data-v-04bcbc5e]:disabled,.page-btn[data-v-04bcbc5e]:disabled{background:#ccc;cursor:not-allowed}.query-examples[data-v-04bcbc5e]{margin-bottom:15px;display:flex;gap:10px;flex-wrap:wrap;align-items:center}.query-examples span[data-v-04bcbc5e]{font-weight:500;color:#666}.example-btn[data-v-04bcbc5e]{background:#f5f5f5;color:#333;padding:6px 12px;font-size:12px}.example-btn[data-v-04bcbc5e]:hover{background:#e0e0e0}.results-controls[data-v-04bcbc5e]{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.left-controls[data-v-04bcbc5e]{display:flex;align-items:center}.right-controls[data-v-04bcbc5e]{display:flex;align-items:center;gap:15px}.pagination[data-v-04bcbc5e]{display:flex;align-items:center;gap:10px}.table-container[data-v-04bcbc5e]{overflow-x:auto}.results-table[data-v-04bcbc5e]{width:100%;border-collapse:collapse;font-size:13px}.results-table th[data-v-04bcbc5e],.results-table td[data-v-04bcbc5e]{border:1px solid #ddd;padding:8px;text-align:left}.results-table th[data-v-04bcbc5e]{background:#f8f9fa;font-weight:600;position:sticky;top:0}.results-table tbody tr[data-v-04bcbc5e]:hover{background:#f5f5f5}.bottom-pagination[data-v-04bcbc5e]{display:flex;justify-content:center;align-items:center;padding:20px 0;margin-top:20px;border-top:1px solid #e9ecef;gap:10px}.page-info[data-v-04bcbc5e]{font-weight:500;color:#666}.json-container[data-v-04bcbc5e]{background:#f8f9fa;border:1px solid #e9ecef;border-radius:4px;padding:15px;max-height:400px;overflow:auto}.json-container pre[data-v-04bcbc5e]{margin:0;font-size:12px;white-space:pre-wrap}.error-panel[data-v-04bcbc5e]{border-color:#f44336;background:#ffebee}.error-panel h3[data-v-04bcbc5e]{color:#d32f2f}.error-panel p[data-v-04bcbc5e]{color:#c62828;margin:10px 0}.clear-error-btn[data-v-04bcbc5e]{background:#f44336}.clear-error-btn[data-v-04bcbc5e]:hover{background:#d32f2f}.execute-query-button[data-v-04bcbc5e]{cursor:pointer;background:#f5f5f5;color:#333;padding:6px 12px;border:solid 1px #cbcbcb}.secondary-btn[data-v-04bcbc5e]{background:#f5f5f5;color:#333;padding:6px 12px;border:solid 1px #cbcbcb;border-radius:4px;cursor:pointer}.secondary-btn[data-v-04bcbc5e]:hover{background:#e0e0e0}.app-container[data-v-64888be0]{color:#000}.scatterplot-container[data-v-eabf0f4b]{width:100%;height:100%;background:#f0f0f0}canvas[data-v-eabf0f4b]{touch-action:none;display:block;cursor:crosshair;width:100%;height:100%}#tooltip[data-v-eabf0f4b]{position:absolute;background:#000c;color:#fff;padding:8px 12px;border-radius:4px;font-size:14px;pointer-events:none;opacity:0;transition:opacity .2s;z-index:200;white-space:nowrap}#debug[data-v-eabf0f4b]{position:absolute;bottom:20px;right:20px;background:#fffc;padding:10px;border-radius:5px;font-family:monospace}.control-panel[data-v-b60e60ab]{position:absolute;top:20px;bottom:20px;left:20px;background:#ffffffd9;padding:15px;border-radius:5px;box-shadow:0 2px 10px #0003;z-index:100;max-width:320px;display:flex;flex-direction:column;gap:12px;overflow:hidden}.color-option[data-v-b60e60ab]{flex:0 0 auto}.legend-scroll[data-v-b60e60ab]{flex:1 1 auto;min-height:0;overflow:auto}.legend[data-v-b60e60ab]{padding-right:6px}.legend-item[data-v-b60e60ab]{display:flex;align-items:center;gap:8px;margin:6px 0}.legend-color[data-v-b60e60ab]{width:14px;height:14px;border-radius:3px;border:1px solid rgba(0,0,0,.15)}.legend-label[data-v-b60e60ab]{line-height:1.2;word-break:break-word}.app-container[data-v-609c9c94]{position:relative;height:100%;overflow:hidden}.markdown-widget-wrap[data-v-165dbe2e]{max-width:none;width:100%;min-width:0;height:100%;display:flex;flex-direction:column;box-sizing:border-box;border:1px solid #e0e0e0;border-radius:.5rem;background-color:#fff;overflow:hidden}.markdown-header[data-v-165dbe2e]{display:flex;justify-content:space-between;align-items:center;padding:.75rem 1rem;background-color:#f5f5f5;border-bottom:1px solid #e0e0e0}.markdown-title[data-v-165dbe2e]{font-size:.95rem;font-weight:600;color:#333}.edit-icon[data-v-165dbe2e]{cursor:pointer;flex-shrink:0}.markdown-placeholder[data-v-165dbe2e]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;border:2px dashed #d0d0d0;border-radius:.5rem;background-color:#fafafa;min-height:150px;margin:1rem}.placeholder-title[data-v-165dbe2e]{font-size:1.1rem;font-weight:600;color:#333;margin-bottom:.5rem}.placeholder-text[data-v-165dbe2e]{color:#666;font-size:.9rem}.markdown-input[data-v-165dbe2e],.markdown-output[data-v-165dbe2e]{flex:1 1 auto;width:100%;height:100%;min-height:0;box-sizing:border-box}.markdown-input[data-v-165dbe2e]{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.95rem;line-height:1.5;padding:1rem;border:none;resize:none;outline:none}.markdown-output[data-v-165dbe2e]{overflow:auto;padding:1rem}.markdown-output[data-v-165dbe2e] *{line-height:1.6}.markdown-output[data-v-165dbe2e] h1{font-size:2rem;font-weight:600;margin-top:1.5rem;margin-bottom:1rem;line-height:1.25;border-bottom:1px solid #e0e0e0;padding-bottom:.5rem}.markdown-output[data-v-165dbe2e] h1:first-child{margin-top:0}.markdown-output[data-v-165dbe2e] h2{font-size:1.5rem;font-weight:600;margin-top:1.5rem;margin-bottom:.75rem;line-height:1.25;border-bottom:1px solid #e0e0e0;padding-bottom:.5rem}.markdown-output[data-v-165dbe2e] h3{font-size:1.25rem;font-weight:600;margin-top:1.25rem;margin-bottom:.5rem;line-height:1.25}.markdown-output[data-v-165dbe2e] h4{font-size:1.1rem;font-weight:600;margin-top:1rem;margin-bottom:.5rem;line-height:1.25}.markdown-output[data-v-165dbe2e] h5{font-size:1rem;font-weight:600;margin-top:1rem;margin-bottom:.5rem;line-height:1.25}.markdown-output[data-v-165dbe2e] h6{font-size:.9rem;font-weight:600;margin-top:1rem;margin-bottom:.5rem;line-height:1.25;color:#666}.markdown-output[data-v-165dbe2e] p{margin-top:0;margin-bottom:1rem}.markdown-output[data-v-165dbe2e] ul,.markdown-output[data-v-165dbe2e] ol{margin-top:0;margin-bottom:1rem;padding-left:2rem}.markdown-output[data-v-165dbe2e] li{margin-bottom:.25rem}.markdown-output[data-v-165dbe2e] li>p{margin-bottom:.5rem}.markdown-output[data-v-165dbe2e] ul ul,.markdown-output[data-v-165dbe2e] ul ol,.markdown-output[data-v-165dbe2e] ol ul,.markdown-output[data-v-165dbe2e] ol ol{margin-top:.25rem;margin-bottom:.25rem}.markdown-output[data-v-165dbe2e] a{color:#0969da;text-decoration:none}.markdown-output[data-v-165dbe2e] a:hover{text-decoration:underline}.markdown-output[data-v-165dbe2e] code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.85em;background-color:#afb8c133;padding:.2em .4em;border-radius:3px}.markdown-output[data-v-165dbe2e] pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.85rem;line-height:1.45;background-color:#f6f8fa;border-radius:6px;padding:1rem;overflow:auto;margin-top:0;margin-bottom:1rem}.markdown-output[data-v-165dbe2e] pre code{background-color:transparent;padding:0;font-size:inherit;border-radius:0}.markdown-output[data-v-165dbe2e] blockquote{margin:0 0 1rem;padding:0 1rem;border-left:.25rem solid #d0d7de;color:#57606a}.markdown-output[data-v-165dbe2e] blockquote>:first-child{margin-top:0}.markdown-output[data-v-165dbe2e] blockquote>:last-child{margin-bottom:0}.markdown-output[data-v-165dbe2e] hr{height:.25rem;padding:0;margin:1.5rem 0;background-color:#d0d7de;border:0}.markdown-output[data-v-165dbe2e] table{border-spacing:0;border-collapse:collapse;margin-top:0;margin-bottom:1rem;width:100%;overflow:auto}.markdown-output[data-v-165dbe2e] table th,.markdown-output[data-v-165dbe2e] table td{padding:.5rem .75rem;border:1px solid #d0d7de}.markdown-output[data-v-165dbe2e] table th{font-weight:600;background-color:#f6f8fa}.markdown-output[data-v-165dbe2e] table tr{background-color:#fff;border-top:1px solid #d0d7de}.markdown-output[data-v-165dbe2e] table tr:nth-child(2n){background-color:#f6f8fa}.markdown-output[data-v-165dbe2e] img{max-width:100%;height:auto;margin-top:.5rem;margin-bottom:.5rem}.markdown-output[data-v-165dbe2e] strong{font-weight:600}.markdown-output[data-v-165dbe2e] em{font-style:italic}.markdown-output[data-v-165dbe2e] input[type=checkbox]{margin-right:.5rem}.markdown-output[data-v-165dbe2e]>*:first-child{margin-top:0!important}.markdown-output[data-v-165dbe2e]>*:last-child{margin-bottom:0!important}.text-viewer[data-v-4007de4f]{display:flex;flex-direction:column;border:1px solid #e1e4e8;border-radius:6px;background-color:#fff;font-family:system-ui,-apple-system,sans-serif;overflow:hidden}.text-viewer__content[data-v-4007de4f]{overflow:auto;background-color:#f6f8fa;padding:16px 0}.text-viewer__code-wrapper[data-v-4007de4f]{display:flex;min-width:fit-content}.text-viewer__line-numbers[data-v-4007de4f]{-webkit-user-select:none;user-select:none;text-align:right;padding-right:16px;padding-left:16px;color:#6e7781;font-size:12px;line-height:20px;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;border-right:1px solid #d0d7de}.text-viewer__line-number[data-v-4007de4f]{min-height:20px}.text-viewer__code-block[data-v-4007de4f]{margin:0;padding:0 16px;font-size:12px;line-height:20px;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;color:#24292f;background-color:transparent;overflow:visible}.text-viewer__footer[data-v-4007de4f]{display:flex;justify-content:space-between;align-items:center;padding:8px 16px;background-color:#fff;border-top:1px solid #e1e4e8;font-size:12px}.text-viewer__file-info[data-v-4007de4f]{color:#6e7781}.text-viewer__copy-button[data-v-4007de4f]{padding:4px 12px;font-size:12px;font-weight:500;color:#24292f;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;cursor:pointer;transition:background-color .2s}.text-viewer__copy-button[data-v-4007de4f]:hover{background-color:#eaeef2}.text-viewer__copy-button[data-v-4007de4f]:active{background-color:#dde2e8}.text-viewer__loading[data-v-4007de4f],.text-viewer__error[data-v-4007de4f],.text-viewer__empty[data-v-4007de4f]{padding:48px;text-align:center}.text-viewer__loading[data-v-4007de4f],.text-viewer__empty[data-v-4007de4f]{color:#6e7781}.text-viewer__error[data-v-4007de4f]{color:#cf222e;background-color:#ffebe9}.pp-container[data-v-811dd84d]{padding:16px;height:100%;display:flex;flex-direction:column;overflow:hidden}.pp-header[data-v-811dd84d]{flex:0 0 auto;overflow:scroll}.pp-controls[data-v-811dd84d]{display:flex;flex-wrap:wrap;align-items:flex-end;gap:2px}.pp-field[data-v-811dd84d]{display:flex;gap:6px}.pp-field label[data-v-811dd84d]{font-size:14px;font-weight:600;align-content:center}.pp-input[data-v-811dd84d],.pp-select[data-v-811dd84d]{border:1px solid #d1d5db;border-radius:4px;padding:4px;min-width:12rem;font-size:14px}.pp-btn[data-v-811dd84d]{background:#f3f4f6;color:#374151;border:1px solid #d1d5db;padding:6px 8px;border-radius:4px;cursor:pointer}.pp-btn[data-v-811dd84d]:hover{background:#e5e7eb}.pp-btn--primary[data-v-811dd84d]{background:#243d8e;border-color:#243d8e;color:#fff}.pp-btn--primary[data-v-811dd84d]:hover{background:#4338ca}.pp-btn[data-v-811dd84d]:disabled,.pp-input[data-v-811dd84d]:disabled,.pp-select[data-v-811dd84d]:disabled{opacity:.5;cursor:not-allowed}.pp-message[data-v-811dd84d]{font-size:13px;color:#4b5563;margin-top:4px}.pp-plot[data-v-811dd84d]{flex:1 1 auto;min-height:0;width:100%;height:80%}.ai-plot-widget[data-v-a1b59c7a]{padding:16px;display:flex;flex-direction:column;gap:16px}.ai-plot-field[data-v-a1b59c7a]{display:flex;flex-direction:column;gap:4px}.ai-plot-field label[data-v-a1b59c7a]{font-size:14px;font-weight:600;color:#333}.ai-plot-input[data-v-a1b59c7a]{border:1px solid #d1d5db;border-radius:4px;padding:8px 12px;font-size:14px}.ai-plot-input[data-v-a1b59c7a]:focus{outline:none;border-color:#2196f3}.plot-container[data-v-a1b59c7a]{min-height:300px;border:1px dashed #d1d5db;border-radius:4px;background:#f9fafb}.ai-plot-btn[data-v-a1b59c7a]{background:#243d8e;color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:14px;align-self:flex-start}.ai-plot-btn[data-v-a1b59c7a]:hover{background:#4338ca}
|
|
1
|
+
.data-explorer-wrap[data-v-c63ff2cc]{overflow:auto;margin:0 10px}.data-explorer-wrap .data-explorer-info[data-v-c63ff2cc]{line-height:20px;position:absolute;right:0;margin-right:30px}[data-v-c63ff2cc] .dashboard-header h1{display:none}.umap-wrap[data-v-78e97b02]{height:100%;margin:0 10px;overflow:none}.umap-wrap .umap-info[data-v-78e97b02]{line-height:20px;position:absolute;right:0;margin-right:6px}.umap-wrap[data-v-78e97b02] .control-panel{top:44px}.proportion-plot-wrap[data-v-96c1c44d]{width:100%;height:100%;margin:0 10px;overflow:hidden}[data-v-96c1c44d] .dashboard-header h1{display:none}[data-v-96c1c44d] .pp-container{height:100%}.gene-coexpression-viewer[data-v-4a0fb898]{display:flex;flex-direction:row;max-width:1600px;margin:0 auto;padding:0;height:100%;gap:16px}.viewer-left[data-v-4a0fb898]{display:flex;flex-direction:column;height:100%;min-height:0;flex:0 0 auto;gap:16px;overflow:hidden}.viewer-right[data-v-4a0fb898]{display:flex;flex-direction:column;height:100%;min-height:0;gap:16px;flex:1}.controls-panel[data-v-4a0fb898]{background:#fff;border:1px solid #e2e8f0;border-radius:2px;padding:0;flex:1;min-height:0}.stats-panel[data-v-4a0fb898]{background:linear-gradient(135deg,#667eea0d,#764ba20d);border:1px solid var(--border-color);border-radius:2px;padding:12px;display:grid;grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(2,1fr);gap:12px;flex:1;min-height:0}.controls-header[data-v-4a0fb898]{display:flex;justify-content:space-between;align-items:center;padding:8px 24px;gap:4px;border-bottom:1px solid #e2e8f0;background:linear-gradient(180deg,#fafbfc,#fff)}.controls-header h3[data-v-4a0fb898]{margin:0;font-size:18px;font-weight:600;color:#1a202c}.reduction-selector[data-v-4a0fb898]{display:flex;align-items:center;gap:12px}.reduction-selector label[data-v-4a0fb898]{font-size:13px;font-weight:500;color:#64748b}.reduction-selector select[data-v-4a0fb898]{padding:6px 12px;border:1px solid #e2e8f0;border-radius:2px;font-size:13px;background:#fff;color:#1a202c;cursor:pointer;transition:all .2s}.reduction-selector select[data-v-4a0fb898]:hover{border-color:#cbd5e1}.reduction-selector select[data-v-4a0fb898]:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.genes-section[data-v-4a0fb898]{padding:8px}.genes-input-group[data-v-4a0fb898]{grid-template-columns:1fr auto 1fr;display:grid;align-items:end;gap:16px;margin-bottom:20px}.gene-input-wrapper[data-v-4a0fb898]{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px}.gene-input-wrapper label[data-v-4a0fb898]{display:flex;align-items:center;gap:12px;font-size:13px;font-weight:500;color:#64748b;min-height:20px}.gene-number[data-v-4a0fb898]{font-weight:600;color:#1a202c}.selected-gene[data-v-4a0fb898]{font-weight:600;font-size:14px}.gene-input[data-v-4a0fb898]{padding:10px 14px;border:2px solid #e2e8f0;border-radius:2px;font-size:14px;transition:all .2s;background:#fff;color:#1a202c;min-width:0;box-sizing:border-box}.gene-input[data-v-4a0fb898]:hover{border-color:#cbd5e1}.gene-input[data-v-4a0fb898]:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.gene-input[data-v-4a0fb898]:disabled{background-color:#f8fafc;cursor:not-allowed;opacity:.6}.gene-input[data-v-4a0fb898]::placeholder{color:#94a3b8;font-size:13px}.vs-separator[data-v-4a0fb898]{display:flex;align-items:center;justify-content:center;padding:0 8px;flex-shrink:0;color:#cbd5e1;font-size:14px;font-weight:600;text-transform:uppercase;letter-spacing:1px}.visualize-btn[data-v-4a0fb898]{display:flex;align-items:center;justify-content:center;padding:12px 24px;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:2px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s;min-height:44px;box-shadow:0 2px 4px #667eea33}.visualize-btn[data-v-4a0fb898]:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 8px #667eea4d}.visualize-btn[data-v-4a0fb898]:disabled{background:#94a3b8;cursor:not-allowed;transform:none;opacity:.7;box-shadow:none}.loading-overlay[data-v-4a0fb898]{position:fixed;top:0;right:0;bottom:0;left:0;background:#fffffff2;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:1000}.spinner[data-v-4a0fb898]{width:60px;height:60px;border:5px solid #f3f3f3;border-top:5px solid var(--primary-color);border-radius:2px;animation:spin-4a0fb898 1s linear infinite}@keyframes spin-4a0fb898{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.error-panel[data-v-4a0fb898]{background:#fff3cd;border:1px solid #ffc107;border-radius:2px;padding:16px;margin-bottom:20px;color:#856404;display:flex;justify-content:space-between;align-items:center}.dismiss-btn[data-v-4a0fb898]{padding:4px 12px;background:transparent;border:1px solid #856404;border-radius:2px;color:#856404;cursor:pointer;font-size:12px;transition:all .2s}.dismiss-btn[data-v-4a0fb898]:hover{background:#856404;color:#fff}.stat-item[data-v-4a0fb898]{display:flex;flex-direction:column;padding:8px;background:#fff;border-radius:2px}.stat-label[data-v-4a0fb898]{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-secondary)}.stat-value[data-v-4a0fb898]{font-size:28px;font-weight:700;color:var(--text-primary)}.chart-container[data-v-4a0fb898]{min-height:0;display:flex;background:#fff;border:1px solid var(--border-color);border-radius:2px;padding:24px;flex:1;position:relative}.chart-container canvas[data-v-4a0fb898]{width:auto;height:auto;display:block}.chart-loading[data-v-4a0fb898]{display:flex;flex-direction:column;justify-content:center;align-items:center;height:400px;color:var(--text-secondary)}.small-spinner[data-v-4a0fb898]{width:40px;height:40px;border:3px solid #f3f3f3;border-top:3px solid var(--primary-color);border-radius:50%;animation:spin-4a0fb898 1s linear infinite;margin-bottom:16px}.tooltip[data-v-4a0fb898]{position:fixed;background:#fff;border:2px solid #667eea;border-radius:6px;padding:12px;pointer-events:none;z-index:10000;box-shadow:0 4px 12px #00000026;min-width:200px;max-width:300px;font-size:13px;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#fffffffa;line-height:1.2}.tooltip-header[data-v-4a0fb898]{font-weight:700;font-size:14px;color:#1a202c;margin-bottom:6px;padding-bottom:6px;border-bottom:1px solid #e2e8f0}.tooltip-row[data-v-4a0fb898]{display:flex;justify-content:space-between;align-items:center;padding:2px 0;gap:8px}.tooltip-label[data-v-4a0fb898]{font-weight:600;color:#64748b;margin:0}.tooltip-value[data-v-4a0fb898]{font-weight:500;color:#1a202c}.legend-container[data-v-4a0fb898]{flex-direction:column;align-items:center}.legend[data-v-4a0fb898]{flex-direction:row;align-items:flex-start;min-width:unset;width:100%;display:flex;gap:12px;background:#fff;border:1px solid var(--border-color);border-radius:2px;padding:16px}.legend-item[data-v-4a0fb898]{display:flex;align-items:center;gap:10px;font-size:14px;font-weight:500;flex-shrink:0;min-width:0}.color-picker[data-v-4a0fb898]{width:28px;height:28px;border:2px solid rgba(0,0,0,.1);border-radius:2px;cursor:pointer;padding:0;background:none;outline:none;transition:all .2s;box-shadow:0 1px 3px #0000001a}.color-picker[data-v-4a0fb898]:hover{transform:scale(1.05);border-color:#0003;box-shadow:0 2px 6px #00000026}.color-picker[data-v-4a0fb898]:focus{border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.floating-mixer-toggle[data-v-4a0fb898]{position:absolute;bottom:16px;right:16px;width:48px;height:48px;background:#fff;border:2px solid #e2e8f0;border-radius:12px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease;z-index:10;color:#64748b}.floating-mixer-toggle[data-v-4a0fb898]:hover{background:#f8fafc;border-color:#cbd5e1;color:#1a202c;transform:translateY(-2px)}.floating-mixer-panel[data-v-4a0fb898]{position:absolute;bottom:51px;right:16px;background:#fff;border:2px solid #e2e8f0;z-index:10;min-width:250px;overflow:hidden}.floating-mixer-header[data-v-4a0fb898]{display:flex;justify-content:space-between;align-items:center;padding:4px;background:linear-gradient(135deg,#f8fafc,#e2e8f0);border-bottom:1px solid #e2e8f0;font-size:14px;font-weight:600;color:#1a202c}.floating-mixer-close[data-v-4a0fb898]{background:none;border:none;padding:4px;border-radius:4px;cursor:pointer;color:#64748b;transition:all .2s;display:flex;align-items:center;justify-content:center}.floating-mixer-close[data-v-4a0fb898]:hover{background:#64748b1a;color:#1a202c}.floating-gradient-container[data-v-4a0fb898]{position:relative;display:inline-flex;align-items:flex-start;gap:16px;padding:16px}.gradient-canvas[data-v-4a0fb898]{border:2px solid #e2e8f0;border-radius:2px}.gradient-labels[data-v-4a0fb898]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;font-size:10px;font-weight:500;color:#64748b}.y-axis-label[data-v-4a0fb898]{position:absolute;left:-38px;bottom:60px;transform:rotate(-90deg);transform-origin:center;white-space:nowrap;z-index:10;background:#fff;padding:2px 4px;border-radius:2px;font-size:9px}.x-axis-label[data-v-4a0fb898]{position:absolute;bottom:5px;left:60px;transform:translate(-50%);white-space:nowrap;z-index:10;background:#fff;padding:2px 4px;border-radius:2px;font-size:9px}.axis-arrow[data-v-4a0fb898]{position:absolute;font-size:12px;font-weight:700;color:#94a3b8;z-index:5}.x-arrow-right[data-v-4a0fb898]{bottom:5px;right:60px}.y-arrow-top[data-v-4a0fb898]{left:5px;top:20px}.empty-state[data-v-4a0fb898]{text-align:center;padding:80px 20px;color:var(--text-secondary)}.empty-icon[data-v-4a0fb898]{font-size:64px;margin-bottom:20px;opacity:.5}.empty-state h3[data-v-4a0fb898]{font-size:24px;margin-bottom:12px;color:var(--text-primary)}.empty-state p[data-v-4a0fb898]{font-size:16px}@media (max-width: 768px){.controls-header[data-v-4a0fb898]{flex-direction:column;align-items:flex-start;padding:8px 20px}.genes-input-group[data-v-4a0fb898]{grid-template-columns:1fr}.vs-separator[data-v-4a0fb898]{order:2;padding:8px 0}.genes-section[data-v-4a0fb898]{padding:8px}}.gene-coexpression-wrap[data-v-2eeb7a01]{height:100%;width:100%;padding:20px;background:#fff;box-sizing:border-box;overflow:hidden}.umap-comparison-dashboard[data-v-7ea6fa01]{height:100%}.both-pannels[data-v-7ea6fa01]{display:flex;flex-direction:row;gap:24px;height:100%;width:100%;background:#f8fafc}.dashboard[data-v-7ea6fa01]{display:flex;flex-direction:column;height:100%;width:100%}.panel[data-v-7ea6fa01]{flex:1;display:flex;flex-direction:column;gap:0;background:#fff;border:1px solid #e2e8f0;border-radius:2px;padding:24px;min-height:0;width:50%;height:auto;position:relative}.header[data-v-7ea6fa01]{display:flex;flex-direction:column;gap:12px;padding-bottom:16px;border-bottom:1px solid #e2e8f0;height:20px;flex-shrink:0}.title[data-v-7ea6fa01]{margin:0;font-size:18px;font-weight:600;color:#1a202c}.filter-placeholder[data-v-7ea6fa01]{height:0;display:flex;align-items:center;justify-content:center;color:#94a3b8;font-size:13px;font-style:italic;width:100%}.controls[data-v-7ea6fa01]{display:flex;flex-direction:column;height:72px;flex-shrink:0;margin-top:16px}.label[data-v-7ea6fa01]{display:flex;flex-direction:column;gap:8px;font-size:13px;font-weight:500;color:#64748b}.select[data-v-7ea6fa01]{padding:10px 14px;border:2px solid #e2e8f0;border-radius:2px;font-size:14px;background:#fff;color:#1a202c;cursor:pointer;transition:all .2s}.select[data-v-7ea6fa01]:hover{border-color:#cbd5e1}.select[data-v-7ea6fa01]:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.gene-input-wrapper[data-v-7ea6fa01]{display:flex;gap:12px}.gene-input[data-v-7ea6fa01]{flex:1;padding:10px 14px;border:2px solid #e2e8f0;border-radius:2px;font-size:14px;background:#fff;color:#1a202c;transition:all .2s;min-width:0;box-sizing:border-box}.gene-input[data-v-7ea6fa01]::placeholder{font-size:13px}.gene-input[data-v-7ea6fa01]:hover{border-color:#cbd5e1}.gene-input[data-v-7ea6fa01]:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.visualize-btn[data-v-7ea6fa01]{padding:10px 24px;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:2px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s;box-shadow:0 2px 4px #667eea33}.visualize-btn[data-v-7ea6fa01]:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 8px #667eea4d}.visualize-btn[data-v-7ea6fa01]:disabled{background:#94a3b8;cursor:not-allowed;opacity:.7;transform:none;box-shadow:none}.canvas-container[data-v-7ea6fa01]{flex:1;position:relative;background:#fff;border:1px solid #e2e8f0;border-radius:2px;min-height:0;display:flex;align-items:center;justify-content:center;margin-top:16px;height:89%}.canvas-container canvas[data-v-7ea6fa01]{display:block;max-width:100%;max-height:100%;cursor:pointer}.canvas-container canvas[data-v-7ea6fa01]:active{cursor:grabbing}.legend[data-v-7ea6fa01]{background:#fff;border:1px solid #e2e8f0;border-radius:2px;padding:16px;height:10%;min-height:80px;flex-shrink:0;margin-top:16px;overflow-y:auto;transition:all .3s ease;position:relative;z-index:5}.legend-expanded[data-v-7ea6fa01]{position:absolute;bottom:24px;left:24px;right:24px;height:60%;max-height:calc(100% - 200px);box-shadow:0 -4px 12px #00000026;z-index:10}.legend-header[data-v-7ea6fa01]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.legend-title[data-v-7ea6fa01]{font-size:13px;font-weight:600;color:#1a202c;text-transform:uppercase;letter-spacing:.5px;margin:0}.legend-toggle[data-v-7ea6fa01]{background:transparent;border:1px solid #e2e8f0;border-radius:4px;padding:4px 8px;cursor:pointer;color:#64748b;font-size:12px;transition:all .2s;display:flex;align-items:center;justify-content:center;min-width:30px;height:24px}.legend-toggle[data-v-7ea6fa01]:hover{background:#f8fafc;border-color:#667eea;color:#667eea}.legend-item[data-v-7ea6fa01]{display:flex;align-items:center;gap:8px;font-size:13px;color:#64748b;cursor:pointer;padding:4px;border-radius:4px;transition:background .2s}.legend-items[data-v-7ea6fa01]{display:flex;flex-wrap:wrap}.legend-item[data-v-7ea6fa01]:hover{background:#f8fafc}.legend-color[data-v-7ea6fa01]{width:20px;height:20px;border-radius:2px;border:2px solid;flex-shrink:0;position:relative;display:flex;align-items:center;justify-content:center;transition:all .2s;cursor:pointer}.legend-color-hidden[data-v-7ea6fa01]{background:#fff!important;opacity:.6}.legend-x[data-v-7ea6fa01]{color:#64748b;font-size:14px;font-weight:700;line-height:1}.legend-label[data-v-7ea6fa01]{font-weight:500}.legend-link[data-v-7ea6fa01]{color:inherit;text-decoration:none}.legend-link[data-v-7ea6fa01]:hover{text-decoration:underline;color:#667eea}.tooltip[data-v-7ea6fa01]{position:fixed;background:#fff;border:2px solid #667eea;border-radius:6px;padding:12px;pointer-events:none;z-index:10000;box-shadow:0 4px 12px #00000026;min-width:200px;max-width:300px;font-size:13px;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#fffffffa;line-height:1.2}.tooltip-header[data-v-7ea6fa01]{font-weight:700;font-size:14px;color:#1a202c;margin-bottom:6px;padding-bottom:6px;border-bottom:1px solid #e2e8f0}.tooltip-row[data-v-7ea6fa01]{display:flex;justify-content:space-between;align-items:center;padding:2px 0;gap:8px}.tooltip-label[data-v-7ea6fa01]{font-weight:600;color:#64748b;margin:0}.tooltip-value[data-v-7ea6fa01]{font-weight:500;color:#1a202c}.tooltip-gene[data-v-7ea6fa01]{border-color:#00f}.gradient-bar[data-v-7ea6fa01]{display:flex;flex-direction:column;gap:8px}.gradient-fill[data-v-7ea6fa01]{height:20px;background:linear-gradient(to right,#c8c8c8,#00f);border-radius:2px;border:1px solid #e2e8f0}.gradient-labels[data-v-7ea6fa01]{display:flex;justify-content:space-between;font-size:12px;color:#64748b;font-weight:500}.loading-container[data-v-7ea6fa01]{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100vh;background:#fffffff2}.spinner[data-v-7ea6fa01]{width:60px;height:60px;border:5px solid #f3f3f3;border-top:5px solid #667eea;border-radius:50%;animation:spin-7ea6fa01 1s linear infinite}.loading-text[data-v-7ea6fa01]{margin-top:20px;font-size:16px;color:#64748b}.loading-overlay[data-v-7ea6fa01]{position:absolute;top:0;right:0;bottom:0;left:0;background:#ffffffe6;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:10}.small-spinner[data-v-7ea6fa01]{width:40px;height:40px;border:3px solid #f3f3f3;border-top:3px solid #667eea;border-radius:50%;animation:spin-7ea6fa01 1s linear infinite;margin-bottom:16px}.error-container[data-v-7ea6fa01]{display:flex;justify-content:center;align-items:center;height:100vh;background:#fff3cd;border:1px solid #ffc107;padding:20px;color:#856404}@keyframes spin-7ea6fa01{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.side-by-side-wrap[data-v-79a2dcfe]{height:100%;width:100%;padding:20px;background:#fff;box-sizing:border-box;overflow:hidden}.violin-plot-container[data-v-fe87f25d]{height:100%;width:100%;display:flex;flex-direction:column}.dashboard[data-v-fe87f25d]{display:flex;flex-direction:column;height:100%;width:100%;background:#fff;border:1px solid #e2e8f0;border-radius:2px;padding:24px}.header[data-v-fe87f25d]{padding-bottom:16px;border-bottom:1px solid #e2e8f0;flex-shrink:0}.title[data-v-fe87f25d]{margin:0;font-size:18px;font-weight:600;color:#1a202c}.content-layout[data-v-fe87f25d]{display:flex;gap:24px;flex:1;min-height:0}.controls[data-v-fe87f25d]{width:20%;min-width:250px;display:flex;flex-direction:column;padding:16px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:2px;flex-shrink:0;overflow-y:auto}.label[data-v-fe87f25d]{display:flex;flex-direction:column;gap:8px;font-size:13px;font-weight:500;color:#64748b;flex:1}.gene-expression-label[data-v-fe87f25d]{font-size:14px;font-weight:600;color:#1a202c}.select[data-v-fe87f25d]{padding:10px 14px;border:2px solid #e2e8f0;border-radius:2px;font-size:14px;background:#fff;color:#1a202c;cursor:pointer;transition:all .2s}.select[data-v-fe87f25d]:hover{border-color:#cbd5e1}.select[data-v-fe87f25d]:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.gene-input-wrapper[data-v-fe87f25d]{display:flex;flex-direction:column;gap:12px}.gene-input[data-v-fe87f25d]{flex:1;padding:10px 14px;border:2px solid #e2e8f0;border-radius:2px;font-size:14px;background:#fff;color:#1a202c;transition:all .2s;min-width:0;box-sizing:border-box}.gene-input[data-v-fe87f25d]::placeholder{font-size:13px}.gene-input[data-v-fe87f25d]:hover{border-color:#cbd5e1}.gene-input[data-v-fe87f25d]:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.visualize-btn[data-v-fe87f25d]{padding:10px 24px;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:2px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s;box-shadow:0 2px 4px #667eea33}.visualize-btn[data-v-fe87f25d]:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 8px #667eea4d}.visualize-btn[data-v-fe87f25d]:disabled{background:#94a3b8;cursor:not-allowed;opacity:.7;transform:none;box-shadow:none}.plot-type-toggle[data-v-fe87f25d]{display:flex;gap:8px}.toggle-btn[data-v-fe87f25d]{flex:1;padding:8px 16px;background:#fff;border:2px solid #e2e8f0;border-radius:2px;font-size:13px;font-weight:500;color:#64748b;cursor:pointer;transition:all .2s}.toggle-btn[data-v-fe87f25d]:hover{border-color:#cbd5e1;background:#f8fafc}.toggle-btn.active[data-v-fe87f25d]{background:linear-gradient(135deg,#667eea,#764ba2);border-color:#667eea;color:#fff}.checkbox-label[data-v-fe87f25d]{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:500;color:#64748b;cursor:pointer}.checkbox[data-v-fe87f25d]{width:18px;height:18px;cursor:pointer;accent-color:#667eea}.plot-container[data-v-fe87f25d]{flex:1;width:80%;position:relative;background:#fff;border:1px solid #e2e8f0;border-radius:2px;min-height:0;display:flex;align-items:center;justify-content:center}.violin-svg[data-v-fe87f25d]{width:100%;height:100%;display:block}.data-points-canvas[data-v-fe87f25d]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.loading-container[data-v-fe87f25d]{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;background:#fffffff2}.spinner[data-v-fe87f25d]{width:60px;height:60px;border:5px solid #f3f3f3;border-top:5px solid #667eea;border-radius:50%;animation:spin-fe87f25d 1s linear infinite}.loading-text[data-v-fe87f25d]{margin-top:20px;font-size:16px;color:#64748b}.loading-overlay[data-v-fe87f25d]{position:absolute;top:0;right:0;bottom:0;left:0;background:#ffffffe6;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:10}.small-spinner[data-v-fe87f25d]{width:40px;height:40px;border:3px solid #f3f3f3;border-top:3px solid #667eea;border-radius:50%;animation:spin-fe87f25d 1s linear infinite;margin-bottom:16px}.error-container[data-v-fe87f25d]{display:flex;justify-content:center;align-items:center;height:100%;background:#fff3cd;border:1px solid #ffc107;padding:20px;color:#856404}@keyframes spin-fe87f25d{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.gene-x-expression-wrap[data-v-3180d386]{height:100%;width:100%;padding:20px;background:#fff;box-sizing:border-box;overflow:hidden}.dashboard-container[data-v-b5de149e]{display:flex;flex-direction:column;margin:0 auto;padding:20px}.dashboard-header[data-v-b5de149e]{display:flex;justify-content:space-between;align-items:center;margin-bottom:30px;padding-bottom:15px;border-bottom:2px solid #e0e0e0}.dashboard-header h1[data-v-b5de149e]{margin:0;color:#333}.status-indicator[data-v-b5de149e]{padding:8px 16px;border-radius:20px;font-weight:500;color:#fff;background-color:#666}.status-indicator.loading[data-v-b5de149e]{background-color:#ff9800}.status-indicator.connected[data-v-b5de149e]{background-color:#14a758}.dashboard-content[data-v-b5de149e]{display:grid;gap:25px}.config-panel[data-v-b5de149e],.query-panel[data-v-b5de149e],.results-panel[data-v-b5de149e],.error-panel[data-v-b5de149e]{background:#fff;width:inherit;border:1px solid #ddd;padding:20px;overflow:scroll}.config-panel h3[data-v-b5de149e],.query-panel h3[data-v-b5de149e],.results-panel h3[data-v-b5de149e],.error-panel h3[data-v-b5de149e]{margin-top:0;color:#333;border-bottom:1px solid #eee;padding-bottom:10px}.query-info[data-v-b5de149e]{background:#e8f4fd;border:1px solid #bee5eb;border-radius:6px;padding:12px;margin-bottom:15px}.query-info .info-text[data-v-b5de149e]{color:#0c5460;font-size:14px;font-weight:500}.pagination-wrapper[data-v-b5de149e]{display:flex;flex-direction:row;justify-content:flex-end}.query-info .info-text code[data-v-b5de149e]{background:#d1ecf1;color:#0c5460;padding:2px 6px;border-radius:3px;font-family:Courier New,monospace;font-weight:600}.form-group[data-v-b5de149e]{margin-bottom:15px}.form-group label[data-v-b5de149e]{display:block;margin-bottom:5px;font-weight:500;color:#555}.url-input[data-v-b5de149e],.table-input[data-v-b5de149e],.query-textarea[data-v-b5de149e],.display-mode[data-v-b5de149e]{width:calc(100% - 16px);padding:10px;border:1px solid #ddd;border-radius:4px;font-size:14px;margin:8px 0}.query-textarea[data-v-b5de149e]{font-family:Courier New,monospace;resize:vertical;min-height:100px}.url-input[data-v-b5de149e]:focus,.table-input[data-v-b5de149e]:focus,.query-textarea[data-v-b5de149e]:focus{outline:none;border-color:#2196f3}.load-btn[data-v-b5de149e],.execute-btn[data-v-b5de149e],.example-btn[data-v-b5de149e],.export-btn[data-v-b5de149e],.clear-error-btn[data-v-b5de149e],.page-btn[data-v-b5de149e]{background:#2196f3;color:#fff;border:none;padding:10px 20px;border-radius:4px;cursor:pointer;font-size:14px;transition:background-color .2s}.load-btn[data-v-b5de149e]:hover,.execute-btn[data-v-b5de149e]:hover,.export-btn[data-v-b5de149e]:hover,.clear-error-btn[data-v-b5de149e]:hover,.page-btn[data-v-b5de149e]:hover{background:#1976d2}.load-btn[data-v-b5de149e]:disabled,.execute-btn[data-v-b5de149e]:disabled,.page-btn[data-v-b5de149e]:disabled{background:#ccc;cursor:not-allowed}.query-examples[data-v-b5de149e]{margin-bottom:15px;display:flex;gap:10px;flex-wrap:wrap;align-items:center}.query-examples span[data-v-b5de149e]{font-weight:500;color:#666}.example-btn[data-v-b5de149e]{background:#f5f5f5;color:#333;padding:6px 12px;font-size:12px}.example-btn[data-v-b5de149e]:hover{background:#e0e0e0}.results-controls[data-v-b5de149e]{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.left-controls[data-v-b5de149e]{display:flex;align-items:center}.right-controls[data-v-b5de149e]{display:flex;align-items:center;gap:15px}.results-pagination[data-v-b5de149e]{margin-right:20px}.table-container[data-v-b5de149e]{overflow-x:auto}.results-table[data-v-b5de149e]{width:100%;border-collapse:collapse;font-size:13px}.results-table th[data-v-b5de149e],.results-table td[data-v-b5de149e]{border:1px solid #ddd;padding:8px;text-align:left}.results-table th[data-v-b5de149e]{background:#f8f9fa;font-weight:600;position:sticky;top:0}.results-table tbody tr[data-v-b5de149e]:hover{background:#f5f5f5}.bottom-pagination[data-v-b5de149e]{display:flex;justify-content:center;align-items:center;padding:20px 0;margin-top:20px;border-top:1px solid #e9ecef}.page-info[data-v-b5de149e]{font-weight:500;color:#666}.json-container[data-v-b5de149e]{background:#f8f9fa;border:1px solid #e9ecef;border-radius:4px;padding:15px;max-height:400px;overflow:auto}.json-container pre[data-v-b5de149e]{margin:0;font-size:12px;white-space:pre-wrap}.error-panel[data-v-b5de149e]{border-color:#f44336;background:#ffebee}.error-panel h3[data-v-b5de149e]{color:#d32f2f}.error-panel p[data-v-b5de149e]{color:#c62828;margin:10px 0}.clear-error-btn[data-v-b5de149e]{background:#f44336}.clear-error-btn[data-v-b5de149e]:hover{background:#d32f2f}.execute-query-button[data-v-b5de149e]{cursor:pointer;background:#f5f5f5;color:#333;padding:6px 12px;border:solid 1px #cbcbcb}.app-container[data-v-7298e5bf]{color:#000}.scatterplot-container[data-v-aa7d57bd]{width:100%;height:100%;background:#f0f0f0}canvas[data-v-aa7d57bd]{display:block;cursor:crosshair;width:100%;height:100%}#tooltip[data-v-aa7d57bd]{position:absolute;background:#000c;color:#fff;padding:8px 12px;border-radius:4px;font-size:14px;pointer-events:none;opacity:0;transition:opacity .2s;z-index:200;white-space:nowrap}#debug[data-v-aa7d57bd]{position:absolute;bottom:20px;right:20px;background:#fffc;padding:10px;border-radius:5px;font-family:monospace}.control-panel[data-v-832c88a6]{position:absolute;top:20px;left:20px;background:#ffffffd9;padding:15px;border-radius:5px;box-shadow:0 2px 10px #0003;z-index:100;max-width:320px}.color-option[data-v-832c88a6]{margin-bottom:15px}.legend-item[data-v-832c88a6]{display:flex;align-items:center;gap:10px;margin:4px 0}.legend-color[data-v-832c88a6]{width:18px;height:18px;border-radius:3px}.legend-label[data-v-832c88a6]{font-size:14px}.app-container[data-v-1515ae28]{height:100%}.pp-container[data-v-1e3cf8a1]{padding:16px;height:100%;display:flex;flex-direction:column;overflow:hidden}.pp-header[data-v-1e3cf8a1]{flex:0 0 auto;overflow:scroll}.pp-controls[data-v-1e3cf8a1]{display:flex;flex-wrap:wrap;align-items:flex-end;gap:2px}.pp-field[data-v-1e3cf8a1]{display:flex;gap:6px}.pp-field label[data-v-1e3cf8a1]{font-size:14px;font-weight:600;align-content:center}.pp-input[data-v-1e3cf8a1],.pp-select[data-v-1e3cf8a1]{border:1px solid #d1d5db;border-radius:4px;padding:4px;min-width:12rem;font-size:14px}.pp-btn[data-v-1e3cf8a1]{background:#f3f4f6;color:#374151;border:1px solid #d1d5db;padding:6px 8px;border-radius:4px;cursor:pointer}.pp-btn[data-v-1e3cf8a1]:hover{background:#e5e7eb}.pp-btn--primary[data-v-1e3cf8a1]{background:#243d8e;border-color:#243d8e;color:#fff}.pp-btn--primary[data-v-1e3cf8a1]:hover{background:#4338ca}.pp-btn[data-v-1e3cf8a1]:disabled,.pp-input[data-v-1e3cf8a1]:disabled,.pp-select[data-v-1e3cf8a1]:disabled{opacity:.5;cursor:not-allowed}.pp-message[data-v-1e3cf8a1]{font-size:13px;color:#4b5563;margin-top:4px}.pp-plot[data-v-1e3cf8a1]{flex:1 1 auto;min-height:0;width:100%;height:80%}.dashboard-container[data-v-04bcbc5e]{display:flex;flex-direction:column;margin:0 auto;padding:20px}.dashboard-header[data-v-04bcbc5e]{display:flex;justify-content:space-between;align-items:center;margin-bottom:30px;padding-bottom:15px;border-bottom:2px solid #e0e0e0}.dashboard-header h1[data-v-04bcbc5e]{margin:0;color:#333}.status-indicator[data-v-04bcbc5e]{padding:8px 16px;border-radius:20px;font-weight:500;color:#fff;background-color:#666}.status-indicator.loading[data-v-04bcbc5e]{background-color:#ff9800}.status-indicator.connected[data-v-04bcbc5e]{background-color:#14a758}.dashboard-content[data-v-04bcbc5e]{display:grid;gap:25px}.config-panel[data-v-04bcbc5e],.query-panel[data-v-04bcbc5e],.results-panel[data-v-04bcbc5e],.error-panel[data-v-04bcbc5e]{background:#fff;width:inherit;border:1px solid #ddd;padding:20px;overflow:scroll}.config-panel h3[data-v-04bcbc5e],.query-panel h3[data-v-04bcbc5e],.results-panel h3[data-v-04bcbc5e],.error-panel h3[data-v-04bcbc5e]{margin-top:0;color:#333;border-bottom:1px solid #eee;padding-bottom:10px}.query-info[data-v-04bcbc5e]{background:#e8f4fd;border:1px solid #bee5eb;border-radius:6px;padding:12px;margin-bottom:15px}.query-info .info-text[data-v-04bcbc5e]{color:#0c5460;font-size:14px;font-weight:500}.pagination-wrapper[data-v-04bcbc5e]{display:flex;flex-direction:row;justify-content:flex-end}.query-info .info-text code[data-v-04bcbc5e]{background:#d1ecf1;color:#0c5460;padding:2px 6px;border-radius:3px;font-family:Courier New,monospace;font-weight:600}.form-group[data-v-04bcbc5e]{margin-bottom:15px}.form-group label[data-v-04bcbc5e]{display:block;margin-bottom:5px;font-weight:500;color:#555}.url-input[data-v-04bcbc5e],.table-input[data-v-04bcbc5e],.query-textarea[data-v-04bcbc5e],.display-mode[data-v-04bcbc5e]{width:calc(100% - 16px);padding:10px;border:1px solid #ddd;border-radius:4px;font-size:14px;margin:8px 0}.query-textarea[data-v-04bcbc5e]{font-family:Courier New,monospace;resize:vertical;min-height:100px}.url-input[data-v-04bcbc5e]:focus,.table-input[data-v-04bcbc5e]:focus,.query-textarea[data-v-04bcbc5e]:focus{outline:none;border-color:#2196f3}.load-btn[data-v-04bcbc5e],.execute-btn[data-v-04bcbc5e],.example-btn[data-v-04bcbc5e],.export-btn[data-v-04bcbc5e],.clear-error-btn[data-v-04bcbc5e],.page-btn[data-v-04bcbc5e]{background:#2196f3;color:#fff;border:none;padding:10px 20px;border-radius:4px;cursor:pointer;font-size:14px;transition:background-color .2s}.load-btn[data-v-04bcbc5e]:hover,.execute-btn[data-v-04bcbc5e]:hover,.export-btn[data-v-04bcbc5e]:hover,.clear-error-btn[data-v-04bcbc5e]:hover,.page-btn[data-v-04bcbc5e]:hover{background:#1976d2}.load-btn[data-v-04bcbc5e]:disabled,.execute-btn[data-v-04bcbc5e]:disabled,.page-btn[data-v-04bcbc5e]:disabled{background:#ccc;cursor:not-allowed}.query-examples[data-v-04bcbc5e]{margin-bottom:15px;display:flex;gap:10px;flex-wrap:wrap;align-items:center}.query-examples span[data-v-04bcbc5e]{font-weight:500;color:#666}.example-btn[data-v-04bcbc5e]{background:#f5f5f5;color:#333;padding:6px 12px;font-size:12px}.example-btn[data-v-04bcbc5e]:hover{background:#e0e0e0}.results-controls[data-v-04bcbc5e]{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.left-controls[data-v-04bcbc5e]{display:flex;align-items:center}.right-controls[data-v-04bcbc5e]{display:flex;align-items:center;gap:15px}.pagination[data-v-04bcbc5e]{display:flex;align-items:center;gap:10px}.table-container[data-v-04bcbc5e]{overflow-x:auto}.results-table[data-v-04bcbc5e]{width:100%;border-collapse:collapse;font-size:13px}.results-table th[data-v-04bcbc5e],.results-table td[data-v-04bcbc5e]{border:1px solid #ddd;padding:8px;text-align:left}.results-table th[data-v-04bcbc5e]{background:#f8f9fa;font-weight:600;position:sticky;top:0}.results-table tbody tr[data-v-04bcbc5e]:hover{background:#f5f5f5}.bottom-pagination[data-v-04bcbc5e]{display:flex;justify-content:center;align-items:center;padding:20px 0;margin-top:20px;border-top:1px solid #e9ecef;gap:10px}.page-info[data-v-04bcbc5e]{font-weight:500;color:#666}.json-container[data-v-04bcbc5e]{background:#f8f9fa;border:1px solid #e9ecef;border-radius:4px;padding:15px;max-height:400px;overflow:auto}.json-container pre[data-v-04bcbc5e]{margin:0;font-size:12px;white-space:pre-wrap}.error-panel[data-v-04bcbc5e]{border-color:#f44336;background:#ffebee}.error-panel h3[data-v-04bcbc5e]{color:#d32f2f}.error-panel p[data-v-04bcbc5e]{color:#c62828;margin:10px 0}.clear-error-btn[data-v-04bcbc5e]{background:#f44336}.clear-error-btn[data-v-04bcbc5e]:hover{background:#d32f2f}.execute-query-button[data-v-04bcbc5e]{cursor:pointer;background:#f5f5f5;color:#333;padding:6px 12px;border:solid 1px #cbcbcb}.secondary-btn[data-v-04bcbc5e]{background:#f5f5f5;color:#333;padding:6px 12px;border:solid 1px #cbcbcb;border-radius:4px;cursor:pointer}.secondary-btn[data-v-04bcbc5e]:hover{background:#e0e0e0}.app-container[data-v-64888be0]{color:#000}.scatterplot-container[data-v-eabf0f4b]{width:100%;height:100%;background:#f0f0f0}canvas[data-v-eabf0f4b]{touch-action:none;display:block;cursor:crosshair;width:100%;height:100%}#tooltip[data-v-eabf0f4b]{position:absolute;background:#000c;color:#fff;padding:8px 12px;border-radius:4px;font-size:14px;pointer-events:none;opacity:0;transition:opacity .2s;z-index:200;white-space:nowrap}#debug[data-v-eabf0f4b]{position:absolute;bottom:20px;right:20px;background:#fffc;padding:10px;border-radius:5px;font-family:monospace}.control-panel[data-v-b60e60ab]{position:absolute;top:20px;bottom:20px;left:20px;background:#ffffffd9;padding:15px;border-radius:5px;box-shadow:0 2px 10px #0003;z-index:100;max-width:320px;display:flex;flex-direction:column;gap:12px;overflow:hidden}.color-option[data-v-b60e60ab]{flex:0 0 auto}.legend-scroll[data-v-b60e60ab]{flex:1 1 auto;min-height:0;overflow:auto}.legend[data-v-b60e60ab]{padding-right:6px}.legend-item[data-v-b60e60ab]{display:flex;align-items:center;gap:8px;margin:6px 0}.legend-color[data-v-b60e60ab]{width:14px;height:14px;border-radius:3px;border:1px solid rgba(0,0,0,.15)}.legend-label[data-v-b60e60ab]{line-height:1.2;word-break:break-word}.app-container[data-v-609c9c94]{position:relative;height:100%;overflow:hidden}.markdown-widget-wrap[data-v-165dbe2e]{max-width:none;width:100%;min-width:0;height:100%;display:flex;flex-direction:column;box-sizing:border-box;border:1px solid #e0e0e0;border-radius:.5rem;background-color:#fff;overflow:hidden}.markdown-header[data-v-165dbe2e]{display:flex;justify-content:space-between;align-items:center;padding:.75rem 1rem;background-color:#f5f5f5;border-bottom:1px solid #e0e0e0}.markdown-title[data-v-165dbe2e]{font-size:.95rem;font-weight:600;color:#333}.edit-icon[data-v-165dbe2e]{cursor:pointer;flex-shrink:0}.markdown-placeholder[data-v-165dbe2e]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;border:2px dashed #d0d0d0;border-radius:.5rem;background-color:#fafafa;min-height:150px;margin:1rem}.placeholder-title[data-v-165dbe2e]{font-size:1.1rem;font-weight:600;color:#333;margin-bottom:.5rem}.placeholder-text[data-v-165dbe2e]{color:#666;font-size:.9rem}.markdown-input[data-v-165dbe2e],.markdown-output[data-v-165dbe2e]{flex:1 1 auto;width:100%;height:100%;min-height:0;box-sizing:border-box}.markdown-input[data-v-165dbe2e]{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.95rem;line-height:1.5;padding:1rem;border:none;resize:none;outline:none}.markdown-output[data-v-165dbe2e]{overflow:auto;padding:1rem}.markdown-output[data-v-165dbe2e] *{line-height:1.6}.markdown-output[data-v-165dbe2e] h1{font-size:2rem;font-weight:600;margin-top:1.5rem;margin-bottom:1rem;line-height:1.25;border-bottom:1px solid #e0e0e0;padding-bottom:.5rem}.markdown-output[data-v-165dbe2e] h1:first-child{margin-top:0}.markdown-output[data-v-165dbe2e] h2{font-size:1.5rem;font-weight:600;margin-top:1.5rem;margin-bottom:.75rem;line-height:1.25;border-bottom:1px solid #e0e0e0;padding-bottom:.5rem}.markdown-output[data-v-165dbe2e] h3{font-size:1.25rem;font-weight:600;margin-top:1.25rem;margin-bottom:.5rem;line-height:1.25}.markdown-output[data-v-165dbe2e] h4{font-size:1.1rem;font-weight:600;margin-top:1rem;margin-bottom:.5rem;line-height:1.25}.markdown-output[data-v-165dbe2e] h5{font-size:1rem;font-weight:600;margin-top:1rem;margin-bottom:.5rem;line-height:1.25}.markdown-output[data-v-165dbe2e] h6{font-size:.9rem;font-weight:600;margin-top:1rem;margin-bottom:.5rem;line-height:1.25;color:#666}.markdown-output[data-v-165dbe2e] p{margin-top:0;margin-bottom:1rem}.markdown-output[data-v-165dbe2e] ul,.markdown-output[data-v-165dbe2e] ol{margin-top:0;margin-bottom:1rem;padding-left:2rem}.markdown-output[data-v-165dbe2e] li{margin-bottom:.25rem}.markdown-output[data-v-165dbe2e] li>p{margin-bottom:.5rem}.markdown-output[data-v-165dbe2e] ul ul,.markdown-output[data-v-165dbe2e] ul ol,.markdown-output[data-v-165dbe2e] ol ul,.markdown-output[data-v-165dbe2e] ol ol{margin-top:.25rem;margin-bottom:.25rem}.markdown-output[data-v-165dbe2e] a{color:#0969da;text-decoration:none}.markdown-output[data-v-165dbe2e] a:hover{text-decoration:underline}.markdown-output[data-v-165dbe2e] code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.85em;background-color:#afb8c133;padding:.2em .4em;border-radius:3px}.markdown-output[data-v-165dbe2e] pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.85rem;line-height:1.45;background-color:#f6f8fa;border-radius:6px;padding:1rem;overflow:auto;margin-top:0;margin-bottom:1rem}.markdown-output[data-v-165dbe2e] pre code{background-color:transparent;padding:0;font-size:inherit;border-radius:0}.markdown-output[data-v-165dbe2e] blockquote{margin:0 0 1rem;padding:0 1rem;border-left:.25rem solid #d0d7de;color:#57606a}.markdown-output[data-v-165dbe2e] blockquote>:first-child{margin-top:0}.markdown-output[data-v-165dbe2e] blockquote>:last-child{margin-bottom:0}.markdown-output[data-v-165dbe2e] hr{height:.25rem;padding:0;margin:1.5rem 0;background-color:#d0d7de;border:0}.markdown-output[data-v-165dbe2e] table{border-spacing:0;border-collapse:collapse;margin-top:0;margin-bottom:1rem;width:100%;overflow:auto}.markdown-output[data-v-165dbe2e] table th,.markdown-output[data-v-165dbe2e] table td{padding:.5rem .75rem;border:1px solid #d0d7de}.markdown-output[data-v-165dbe2e] table th{font-weight:600;background-color:#f6f8fa}.markdown-output[data-v-165dbe2e] table tr{background-color:#fff;border-top:1px solid #d0d7de}.markdown-output[data-v-165dbe2e] table tr:nth-child(2n){background-color:#f6f8fa}.markdown-output[data-v-165dbe2e] img{max-width:100%;height:auto;margin-top:.5rem;margin-bottom:.5rem}.markdown-output[data-v-165dbe2e] strong{font-weight:600}.markdown-output[data-v-165dbe2e] em{font-style:italic}.markdown-output[data-v-165dbe2e] input[type=checkbox]{margin-right:.5rem}.markdown-output[data-v-165dbe2e]>*:first-child{margin-top:0!important}.markdown-output[data-v-165dbe2e]>*:last-child{margin-bottom:0!important}.text-viewer[data-v-4007de4f]{display:flex;flex-direction:column;border:1px solid #e1e4e8;border-radius:6px;background-color:#fff;font-family:system-ui,-apple-system,sans-serif;overflow:hidden}.text-viewer__content[data-v-4007de4f]{overflow:auto;background-color:#f6f8fa;padding:16px 0}.text-viewer__code-wrapper[data-v-4007de4f]{display:flex;min-width:fit-content}.text-viewer__line-numbers[data-v-4007de4f]{-webkit-user-select:none;user-select:none;text-align:right;padding-right:16px;padding-left:16px;color:#6e7781;font-size:12px;line-height:20px;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;border-right:1px solid #d0d7de}.text-viewer__line-number[data-v-4007de4f]{min-height:20px}.text-viewer__code-block[data-v-4007de4f]{margin:0;padding:0 16px;font-size:12px;line-height:20px;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;color:#24292f;background-color:transparent;overflow:visible}.text-viewer__footer[data-v-4007de4f]{display:flex;justify-content:space-between;align-items:center;padding:8px 16px;background-color:#fff;border-top:1px solid #e1e4e8;font-size:12px}.text-viewer__file-info[data-v-4007de4f]{color:#6e7781}.text-viewer__copy-button[data-v-4007de4f]{padding:4px 12px;font-size:12px;font-weight:500;color:#24292f;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;cursor:pointer;transition:background-color .2s}.text-viewer__copy-button[data-v-4007de4f]:hover{background-color:#eaeef2}.text-viewer__copy-button[data-v-4007de4f]:active{background-color:#dde2e8}.text-viewer__loading[data-v-4007de4f],.text-viewer__error[data-v-4007de4f],.text-viewer__empty[data-v-4007de4f]{padding:48px;text-align:center}.text-viewer__loading[data-v-4007de4f],.text-viewer__empty[data-v-4007de4f]{color:#6e7781}.text-viewer__error[data-v-4007de4f]{color:#cf222e;background-color:#ffebe9}.pp-container[data-v-811dd84d]{padding:16px;height:100%;display:flex;flex-direction:column;overflow:hidden}.pp-header[data-v-811dd84d]{flex:0 0 auto;overflow:scroll}.pp-controls[data-v-811dd84d]{display:flex;flex-wrap:wrap;align-items:flex-end;gap:2px}.pp-field[data-v-811dd84d]{display:flex;gap:6px}.pp-field label[data-v-811dd84d]{font-size:14px;font-weight:600;align-content:center}.pp-input[data-v-811dd84d],.pp-select[data-v-811dd84d]{border:1px solid #d1d5db;border-radius:4px;padding:4px;min-width:12rem;font-size:14px}.pp-btn[data-v-811dd84d]{background:#f3f4f6;color:#374151;border:1px solid #d1d5db;padding:6px 8px;border-radius:4px;cursor:pointer}.pp-btn[data-v-811dd84d]:hover{background:#e5e7eb}.pp-btn--primary[data-v-811dd84d]{background:#243d8e;border-color:#243d8e;color:#fff}.pp-btn--primary[data-v-811dd84d]:hover{background:#4338ca}.pp-btn[data-v-811dd84d]:disabled,.pp-input[data-v-811dd84d]:disabled,.pp-select[data-v-811dd84d]:disabled{opacity:.5;cursor:not-allowed}.pp-message[data-v-811dd84d]{font-size:13px;color:#4b5563;margin-top:4px}.pp-plot[data-v-811dd84d]{flex:1 1 auto;min-height:0;width:100%;height:80%}.ai-plot-widget[data-v-a1b59c7a]{padding:16px;display:flex;flex-direction:column;gap:16px}.ai-plot-field[data-v-a1b59c7a]{display:flex;flex-direction:column;gap:4px}.ai-plot-field label[data-v-a1b59c7a]{font-size:14px;font-weight:600;color:#333}.ai-plot-input[data-v-a1b59c7a]{border:1px solid #d1d5db;border-radius:4px;padding:8px 12px;font-size:14px}.ai-plot-input[data-v-a1b59c7a]:focus{outline:none;border-color:#2196f3}.plot-container[data-v-a1b59c7a]{min-height:300px;border:1px dashed #d1d5db;border-radius:4px;background:#f9fafb}.ai-plot-btn[data-v-a1b59c7a]{background:#243d8e;color:#fff;border:none;padding:8px 16px;border-radius:4px;cursor:pointer;font-size:14px;align-self:flex-start}.ai-plot-btn[data-v-a1b59c7a]:hover{background:#4338ca}
|
package/package.json
CHANGED