@synthigy/tooling 0.1.6 → 0.1.8
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/README.md +6 -6
- package/dist/tooling.js +53 -53
- package/package.json +1 -1
package/dist/tooling.js
CHANGED
|
@@ -1905,7 +1905,7 @@ NS.prototype.decode=function(a,b,c,d){if(null==a)return null;switch(typeof a){ca
|
|
|
1905
1905
|
this.decode(a[c+1],b,!1,!1),a);b=this.Qb.finalize(d,a)}else{d=[];for(c=1;c<a.length;c+=2)d.push(this.decode(a[c],b,!0,!1)),d.push(this.decode(a[c+1],b,!1,!1));b=JS(d,!1)}else b=vqa(this,a,b,c,d);else{c=fS(a);var e=c[0];if((d=1==c.length?this.decode(e,b,!1,!1):null)&&d instanceof MS)a=a[e],c=this.handlers[d.yb],b=null!=c?c(this.decode(a,b,!1,!0),this):vS(d.yb,this.decode(a,b,!1,!1));else if(this.Qb)if(16>c.length&&this.Qb.fromArray){var f=[];for(d=0;d<c.length;d++)e=c[d],f.push(this.decode(e,b,!0,
|
|
1906
1906
|
!1)),f.push(this.decode(a[e],b,!1,!1));b=this.Qb.fromArray(f,a)}else{f=this.Qb.init(a);for(d=0;d<c.length;d++)e=c[d],f=this.Qb.add(f,this.decode(e,b,!0,!1),this.decode(a[e],b,!1,!1),a);b=this.Qb.finalize(f,a)}else{f=[];for(d=0;d<c.length;d++)e=c[d],f.push(this.decode(e,b,!0,!1)),f.push(this.decode(a[e],b,!1,!1));b=JS(f,!1)}}return b}return a};NS.prototype.decode=NS.prototype.decode;
|
|
1907
1907
|
function vqa(a,b,c,d,e){if(e){var f=[];for(e=0;e<b.length;e++)f.push(a.decode(b[e],c,d,!1));return f}f=c&&c.La;if(2===b.length&&"string"===typeof b[0]&&(e=a.decode(b[0],c,!1,!1))&&e instanceof MS)return b=b[1],f=a.handlers[e.yb],null!=f?f=f(a.decode(b,c,d,!0),a):vS(e.yb,a.decode(b,c,d,!1));c&&f!=c.La&&(c.La=f);if(a.Kc){if(32>=b.length&&a.Kc.fromArray){f=[];for(e=0;e<b.length;e++)f.push(a.decode(b[e],c,d,!1));return a.Kc.fromArray(f,b)}f=a.Kc.init(b);for(e=0;e<b.length;e++)f=a.Kc.add(f,a.decode(b[e],
|
|
1908
|
-
c,d,!1),b);return a.Kc.finalize(f,b)}f=[];for(e=0;e<b.length;e++)f.push(a.decode(b[e],c,d,!1));return f}function OS(a,b){if("~"===b.charAt(0)){var c=b.charAt(1);if("~"===c||"^"===c||"`"===c)return b.substring(1);if("#"===c)return new MS(b.substring(2));var d=a.handlers[c];return null==d?a.ee(c,b.substring(2)):d(b.substring(2),a)}return b};function wqa(a){this.ng=new NS(a)}function PS(a,b){this.Ig=a;this.options=b||{};this.cache=this.options.cache?this.options.cache:new lS}PS.prototype.read=function(a){var b=this.cache;a=this.Ig.ng.decode(JSON.parse(a),b);this.cache.clear();return a};PS.prototype.read=PS.prototype.read;var QS=0,
|
|
1908
|
+
c,d,!1),b);return a.Kc.finalize(f,b)}f=[];for(e=0;e<b.length;e++)f.push(a.decode(b[e],c,d,!1));return f}function OS(a,b){if("~"===b.charAt(0)){var c=b.charAt(1);if("~"===c||"^"===c||"`"===c)return b.substring(1);if("#"===c)return new MS(b.substring(2));var d=a.handlers[c];return null==d?a.ee(c,b.substring(2)):d(b.substring(2),a)}return b};function wqa(a){this.ng=new NS(a)}function PS(a,b){this.Ig=a;this.options=b||{};this.cache=this.options.cache?this.options.cache:new lS}PS.prototype.read=function(a){var b=this.cache;a=this.Ig.ng.decode(JSON.parse(a),b);this.cache.clear();return a};PS.prototype.read=PS.prototype.read;var QS=0,Oma=(8|3&Math.round(14*Math.random())).toString(16),RS="transit$guid$"+(hS()+hS()+hS()+hS()+hS()+hS()+hS()+hS()+"-"+hS()+hS()+hS()+hS()+"-4"+hS()+hS()+hS()+"-"+Oma+hS()+hS()+hS()+"-"+hS()+hS()+hS()+hS()+hS()+hS()+hS()+hS()+hS()+hS()+hS()+hS());
|
|
1909
1909
|
function SS(a){if(null==a)return"null";if(a===String)return"string";if(a===Boolean)return"boolean";if(a===Number)return"number";if(a===Array)return"array";if(a===Object)return"map";var b=a[RS];null==b&&("undefined"!=typeof Object.defineProperty?(b=++QS,Object.defineProperty(a,RS,{value:b,enumerable:!1})):a[RS]=b=++QS);return b}function TS(a,b){a=a.toString();for(var c=a.length;c<b;c++)a="0"+a;return a}function US(){}US.prototype.tag=function(){return"_"};US.prototype.rep=function(){return null};
|
|
1910
1910
|
US.prototype.stringRep=function(){return"null"};function VS(){}VS.prototype.tag=function(){return"s"};VS.prototype.rep=function(a){return a};VS.prototype.stringRep=function(a){return a};function WS(){}WS.prototype.tag=function(){return"i"};WS.prototype.rep=function(a){return a};WS.prototype.stringRep=function(a){return a.toString()};function XS(){}XS.prototype.tag=function(){return"i"};XS.prototype.rep=function(a){return a.toString()};XS.prototype.stringRep=function(a){return a.toString()};
|
|
1911
1911
|
function YS(){}YS.prototype.tag=function(){return"?"};YS.prototype.rep=function(a){return a};YS.prototype.stringRep=function(a){return a.toString()};function ZS(){}ZS.prototype.tag=function(){return"array"};ZS.prototype.rep=function(a){return a};ZS.prototype.stringRep=function(){return null};function $S(){}$S.prototype.tag=function(){return"map"};$S.prototype.rep=function(a){return a};$S.prototype.stringRep=function(){return null};function aT(){}aT.prototype.tag=function(){return"t"};
|
|
@@ -1945,12 +1945,12 @@ function(w){return gR(qR(new k(null,4,[jB,b,lla,c,GG,Kj.o(I([t,e])),Lp,f],null))
|
|
|
1945
1945
|
new k(null,2,[Lk,O,DH,P],null)])),new k(null,2,[Lk,O,HI,K.body],null)):gR(qR(null),function(){return gR(qR(K.text()),function(T){return gR(qR(FT(Kv.g(a),I([y,new k(null,3,[Lk,O,Lp,T,DH,P],null)]))),function(){return qR(new k(null,3,[Lk,O,UH,T,Zta,K.headers.get("content-type")],null))})})})}),function(K){l(E)&&clearTimeout(E);FT(TF.g(a),I([y,K]));throw K;}))})})})})})})})})})})})}
|
|
1946
1946
|
function IT(a,b,c){var d=aS();return YR(VR.h(VR.h(HT(d,a,b,c),function(e){var f=(f=z.h(401,Lk.g(e)))?hG.g(d):f;return l(f)?(e=hG.g(d),l(e)&&(e.v?e.v():e.call(null)),HT(d,a,b,c)):e}),function(e){if(z.h(401,Lk.g(e)))throw TQ("Unauthorized",new k(null,2,[lx,"UNAUTHORIZED",Lk,401],null));return e}),function(e){if(e instanceof sl)throw e;throw TQ(["Transport error: ",p.g(vl(e))].join(""),new k(null,2,[lx,"TRANSPORT_ERROR",Kha,e],null));})}
|
|
1947
1947
|
function JT(a,b){var c=N(a),d=v(c,Lk);a=v(c,UH);c=v(c,Zta);if(200<=d&&299>=d)return GT(a,c);var e=GT(a,c);throw TQ(function(){var f=Bh(e,new R(null,2,5,S,[bD,bt],null));return l(f)?f:[p.g(b)," failed: HTTP ",p.g(d)].join("")}(),new k(null,3,[lx,function(){var f=Bh(e,new R(null,2,5,S,[bD,lx],null));return l(f)?f:"HTTP_ERROR"}(),Lk,d,Lp,l(e)?e:a],null));}
|
|
1948
|
-
function
|
|
1948
|
+
function Yma(a,b){var c=aS();return gR(qR(null),function(){return gR(qR(IT(Vn,[p.g(oA.g(c)),"/data"].join(""),new k(null,3,[Lp,Fqa.write(a),GG,new k(null,2,["Content-Type","application/transit+json","Accept","application/transit+json"],null),sN,l(b)?b:aH.g(c)],null))),function(d){return qR(JT(d,"Request"))})})}
|
|
1949
1949
|
function KT(a,b){return gR(qR(null),function(){return gR(qR(IT(Vn,a,new k(null,3,[Lp,JSON.stringify(NQ(b)),GG,new k(null,1,["Content-Type","application/json"],null),sN,aH.g(aS())],null))),function(c){return qR(JT(c,"POST"))})})}function LT(){return KT([p.g(oA.g(aS())),"/data/subscription/set"].join(""),oqa())};function Jqa(a,b){return console.warn("synthigy.client SSE parse error:",vl(a),"— raw:",b)}
|
|
1950
1950
|
function Kqa(a,b,c,d,e){var f=a.getReader(),h=new TextDecoder;return function w(n,r,t,u){if(l(q(e))){try{f.cancel()}catch(y){}return null}return VR.h(f.read(),function(y){if(l(y.done))return null;y=h.decode(y.value,{stream:!0});y=[p.g(n),p.g(y)].join("");var C=dP(y,/\n/,-1);y=De(C);C=Wj(C);var D=A(C);B(D);F(D);D=r;for(var E=t,G=u;;){var K=A(C);C=B(K);var O=F(K);K=C;C=O;O=D;D=G;if(null==K)return w(y,O,E,D);if(Da(K,"event:"))K=Ha(K.substring(6)),G=D,D=K;else if(Da(K,"data:"))G=O,E=Ge.h(E,Ha(K.substring(5))),
|
|
1951
1951
|
K=D,D=G,G=K;else if(Da(K,"id:"))D=O,G=K=Ha(K.substring(3));else if(z.h(K,"")){K=O;G=E;if(A(G))try{var P=Wk(JSON.parse(aP("\n",G)),I([Xk,!0]));var T=jf(P,dA)?P:M.j(P,dA,K)}catch(Z){T=null}else T=null;if(l(T)){K=T;try{b.g?b.g(K):b.call(null,K)}catch(Z){K=Z,E=aP("\n",E),c.h?c.h(K,E):c.call(null,K,E)}}l(D)&&ah(d,D);E=He;D="message";G=null}else K=O,G=D,D=K}})}("","message",He,null)}
|
|
1952
1952
|
function Lqa(a,b){function c(u){return l(q(m))?null:VR.h(iqa(u),function(){var w=2*u;return d(w<e?w:e)})}function d(u){if(l(q(m)))return null;var w=new AbortController;ah(r,w);var y=function(){var C=ug;return l(q(n))?M.j(C,"Last-Event-ID",q(n)):C}();return YR(VR.h(IT(DF,t,new k(null,3,[GG,y,NF,!0,wH,w.signal],null)),function(C){var D=Lk.g(C);if(200<=D&&299>=D){if(l(h))try{h.v?h.v():h.call(null)}catch(E){}return VR.h(Kqa(HI.g(C),a,f,n,m),function(){return l(q(m))?null:c(1E3)})}throw TQ(["SSE connect failed: HTTP ",
|
|
1953
|
-
p.g(D)].join(""),new k(null,2,[lx,"HTTP_ERROR",Lk,D],null));}),function(C){if(l(q(m)))return null;if(jf(new Pj(null,new k(null,2,["UNAUTHORIZED",null,"FORBIDDEN",null],null),null),lx.g(ul(C))))throw C;return c(u)})}b=N(b);var e=Od(b,bda,3E4),f=Od(b,dna,Jqa),h=v(b,Ry),m=$g(!1),n=$g(null),r=$g(null),t=[p.g(oA.g(aS())),"/data/events"].join("");d(1E3);return function(){ah(m,!0);var u=q(r);if(l(u))try{return u.abort()}catch(w){return null}else return null}};function MT(a){NT.v?NT.v():NT.call(null);$R=mqa(a)}function Mqa(a,b){var c=nqa(aS(),a,b);return gR(qR(null),function(){return gR(qR(
|
|
1953
|
+
p.g(D)].join(""),new k(null,2,[lx,"HTTP_ERROR",Lk,D],null));}),function(C){if(l(q(m)))return null;if(jf(new Pj(null,new k(null,2,["UNAUTHORIZED",null,"FORBIDDEN",null],null),null),lx.g(ul(C))))throw C;return c(u)})}b=N(b);var e=Od(b,bda,3E4),f=Od(b,dna,Jqa),h=v(b,Ry),m=$g(!1),n=$g(null),r=$g(null),t=[p.g(oA.g(aS())),"/data/events"].join("");d(1E3);return function(){ah(m,!0);var u=q(r);if(l(u))try{return u.abort()}catch(w){return null}else return null}};function MT(a){NT.v?NT.v():NT.call(null);$R=mqa(a)}function Mqa(a,b){var c=nqa(aS(),a,b);return gR(qR(null),function(){return gR(qR(Yma(c,sN.g(b))),function(d){return qR(wo.g(d))})})}function OT(a){for(var b=[],c=arguments.length,d=0;;)if(d<c)b.push(arguments[d]),d+=1;else break;return DV(arguments[0],1<b.length?new Sd(b.slice(1),0,null):null)}function DV(a,b){b=N(b);return Mqa(a,b)}
|
|
1954
1954
|
function PT(a){if(l(Gt.g(q(a))))return null;Q.l(a,M,Gt,!0);return queueMicrotask(function(){Q.l(a,M,Gt,!1);var b=kz.g(q(a)),c=VR.h(l(b)?hqa(b,function(){return null}):MR(null),function(){var d=pqa(nt.g(q(a))),e=N(d),f=v(e,hr);d=v(e,tF);var h=v(e,tB),m=v(e,pn),n=v(e,Ls);e=Fq.g(aS());if(A(f)){n=N(new k(null,2,[hr,f,Ls,n],null));f=v(n,hr);n=v(n,Ls);if(Ue(f))throw TQ("subscribe: records must be a non-empty seq of xid strings",new k(null,1,[lx,"EMPTY_RECORDS"],null));f=new k(null,1,[hr,Uj(eh.h(p,f))],
|
|
1955
1955
|
null);f=A(n)?M.j(f,Ls,Uj(eh.h(Vf,n))):f;n=zk.o;var r=S,t=nf(hr.g(f));var u=Ls.g(f);u=null==u?null:nf(u);n=n.call(zk,I([new R(null,2,5,r,[t,u],null)]));f=Ke([n,f])}else f=ug;ah(e,new k(null,4,[rB,f,tF,Uj(d),tB,Uj(h),pn,Uj(m)],null));return LT()});Q.l(a,M,kz,c);return WR(c,function(){return c===kz.g(q(a))?Q.l(a,M,kz,null):null})})}
|
|
1956
1956
|
function Nqa(a){if(!l(Dl.g(q(a)))){var b=Lqa(function(c){a:for(var d=A(Ii(nt.g(q(a)))),e=null,f=0,h=0;;)if(h<f){var m=e.P(null,h),n=N(m);m=v(n,JE);n=v(n,Tz);if(bS(m,c))try{n.g?n.g(c):n.call(null,c)}catch(r){console.warn("synthigy.client watch sink threw:",vl(r))}h+=1}else if(d=A(d)){if(af(d))m=fd(d),d=gd(d),e=m,f=m=H(m);else{e=B(d);e=N(e);m=v(e,JE);n=v(e,Tz);if(bS(m,c))try{n.g?n.g(c):n.call(null,c)}catch(r){console.warn("synthigy.client watch sink threw:",vl(r))}d=F(d);e=null;f=0}h=0}else break a;
|
|
@@ -1988,16 +1988,16 @@ var vV=function(){var a=$g(ug),b=$g(ug),c=$g(ug),d=$g(ug),e=Od(ug,Yx,al.v?al.v()
|
|
|
1988
1988
|
al.call(null));return new ml(Pd.h("synthigy.dataset.id","-data-"),function(f,h){return new R(null,2,5,S,[f,h],null)},e,a,b,c,d)}(),Dra=Yk(function(a,b){return vV.h(a,b)});function yV(a){return a instanceof x?Dra(a,bF):a};function zV(a,b){if(null!=a&&null!=a.Kf)a=a.Kf(a,b);else{var c=zV[da(null==a?null:a)];if(null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else if(c=zV._,null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else throw rb("EntityConstraintProtocol.set-entity-unique-constraints",a);}return a}
|
|
1989
1989
|
function AV(a){if(null!=a&&null!=a.Jf)a=a.Jf(a);else{var b=AV[da(null==a?null:a)];if(null!=b)a=b.g?b.g(a):b.call(null,a);else if(b=AV._,null!=b)a=b.g?b.g(a):b.call(null,a);else throw rb("EntityConstraintProtocol.get-entity-unique-constraints",a);}return a}
|
|
1990
1990
|
function BV(a,b){if(null!=a&&null!=a.le)a=a.le(a,b);else{var c=BV[da(null==a?null:a)];if(null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else if(c=BV._,null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else throw rb("ERDEntityAttributeProtocol.get-attribute",a);}return a}
|
|
1991
|
-
var
|
|
1992
|
-
arguments.length);};c.g=b;c.h=a;return c}(),CV=function CV(a){switch(arguments.length){case 1:return CV.g(arguments[0]);case 2:return CV.h(arguments[0],arguments[1]);default:throw Error(["Invalid arity: ",p.g(arguments.length)].join(""));}};CV.g=function(a){return null!=a&&null!=a.Hg?a.Hg(a):
|
|
1991
|
+
var NV=function(){function a(d,e){var f=CV[da(null==d?null:d)];if(null!=f)return f.h?f.h(d,e):f.call(null,d,e);f=CV._;if(null!=f)return f.h?f.h(d,e):f.call(null,d,e);throw rb("ERDModelActions.get-entity",d);}function b(d){var e=CV[da(null==d?null:d)];if(null!=e)return e.g?e.g(d):e.call(null,d);e=CV._;if(null!=e)return e.g?e.g(d):e.call(null,d);throw rb("ERDModelActions.get-entity",d);}var c=null;c=function(d,e){switch(arguments.length){case 1:return b.call(this,d);case 2:return a.call(this,d,e)}throw Error("Invalid arity: "+
|
|
1992
|
+
arguments.length);};c.g=b;c.h=a;return c}(),CV=function CV(a){switch(arguments.length){case 1:return CV.g(arguments[0]);case 2:return CV.h(arguments[0],arguments[1]);default:throw Error(["Invalid arity: ",p.g(arguments.length)].join(""));}};CV.g=function(a){return null!=a&&null!=a.Hg?a.Hg(a):NV(a)};CV.h=function(a,b){return null!=a&&null!=a.zf?a.zf(a,b):NV(a,b)};CV.J=2;
|
|
1993
1993
|
function EV(a){if(null!=a&&null!=a.yf)a=a.yf(a);else{var b=EV[da(null==a?null:a)];if(null!=b)a=b.g?b.g(a):b.call(null,a);else if(b=EV._,null!=b)a=b.g?b.g(a):b.call(null,a);else throw rb("ERDModelActions.get-entities",a);}return a}function FV(a,b){if(null!=a&&null!=a.uf)a=a.uf(a,b);else{var c=FV[da(null==a?null:a)];if(null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else if(c=FV._,null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else throw rb("ERDModelActions.add-entity",a);}return a}
|
|
1994
1994
|
function GV(a,b){if(null!=a&&null!=a.Ff)a=a.Ff(a,b);else{var c=GV[da(null==a?null:a)];if(null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else if(c=GV._,null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else throw rb("ERDModelActions.set-entity",a);}return a}function HV(a,b,c){if(null!=a&&null!=a.Hf)a=a.Hf(a,b,c);else{var d=HV[da(null==a?null:a)];if(null!=d)a=d.j?d.j(a,b,c):d.call(null,a,b,c);else if(d=HV._,null!=d)a=d.j?d.j(a,b,c):d.call(null,a,b,c);else throw rb("ERDModelActions.update-entity",a);}return a}
|
|
1995
1995
|
function IV(a,b){if(null!=a&&null!=a.Df)a=a.Df(a,b);else{var c=IV[da(null==a?null:a)];if(null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else if(c=IV._,null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else throw rb("ERDModelActions.remove-entity",a);}return a}function JV(a,b){if(null!=a&&null!=a.Af)a=a.Af(a,b);else{var c=JV[da(null==a?null:a)];if(null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else if(c=JV._,null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else throw rb("ERDModelActions.get-entity-relations",a);}return a}
|
|
1996
1996
|
function KV(a,b){if(null!=a&&null!=a.Bf)a=a.Bf(a,b);else{var c=KV[da(null==a?null:a)];if(null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else if(c=KV._,null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else throw rb("ERDModelActions.get-relation",a);}return a}function LV(a){if(null!=a&&null!=a.Cf)a=a.Cf(a);else{var b=LV[da(null==a?null:a)];if(null!=b)a=b.g?b.g(a):b.call(null,a);else if(b=LV._,null!=b)a=b.g?b.g(a):b.call(null,a);else throw rb("ERDModelActions.get-relations",a);}return a}
|
|
1997
|
-
var
|
|
1997
|
+
var UW=function(){function a(f,h,m,n,r,t){var u=MV[da(null==f?null:f)];if(null!=u)return u.ya?u.ya(f,h,m,n,r,t):u.call(null,f,h,m,n,r,t);u=MV._;if(null!=u)return u.ya?u.ya(f,h,m,n,r,t):u.call(null,f,h,m,n,r,t);throw rb("ERDModelActions.create-relation",f);}function b(f,h,m,n,r){var t=MV[da(null==f?null:f)];if(null!=t)return t.S?t.S(f,h,m,n,r):t.call(null,f,h,m,n,r);t=MV._;if(null!=t)return t.S?t.S(f,h,m,n,r):t.call(null,f,h,m,n,r);throw rb("ERDModelActions.create-relation",f);}function c(f,h,m,n){var r=
|
|
1998
1998
|
MV[da(null==f?null:f)];if(null!=r)return r.l?r.l(f,h,m,n):r.call(null,f,h,m,n);r=MV._;if(null!=r)return r.l?r.l(f,h,m,n):r.call(null,f,h,m,n);throw rb("ERDModelActions.create-relation",f);}function d(f,h,m){var n=MV[da(null==f?null:f)];if(null!=n)return n.j?n.j(f,h,m):n.call(null,f,h,m);n=MV._;if(null!=n)return n.j?n.j(f,h,m):n.call(null,f,h,m);throw rb("ERDModelActions.create-relation",f);}var e=null;e=function(f,h,m,n,r,t){switch(arguments.length){case 3:return d.call(this,f,h,m);case 4:return c.call(this,
|
|
1999
1999
|
f,h,m,n);case 5:return b.call(this,f,h,m,n,r);case 6:return a.call(this,f,h,m,n,r,t)}throw Error("Invalid arity: "+arguments.length);};e.j=d;e.l=c;e.S=b;e.ya=a;return e}(),MV=function MV(a){switch(arguments.length){case 3:return MV.j(arguments[0],arguments[1],arguments[2]);case 4:return MV.l(arguments[0],arguments[1],arguments[2],arguments[3]);case 5:return MV.S(arguments[0],arguments[1],arguments[2],arguments[3],arguments[4]);case 6:return MV.ya(arguments[0],arguments[1],arguments[2],arguments[3],
|
|
2000
|
-
arguments[4],arguments[5]);default:throw Error(["Invalid arity: ",p.g(arguments.length)].join(""));}};MV.j=function(a,b,c){return null!=a&&null!=a.vf?a.vf(a,b,c):
|
|
2000
|
+
arguments[4],arguments[5]);default:throw Error(["Invalid arity: ",p.g(arguments.length)].join(""));}};MV.j=function(a,b,c){return null!=a&&null!=a.vf?a.vf(a,b,c):UW(a,b,c)};MV.l=function(a,b,c,d){return null!=a&&null!=a.wf?a.wf(a,b,c,d):UW(a,b,c,d)};MV.S=function(a,b,c,d,e){return null!=a&&null!=a.xf?a.xf(a,b,c,d,e):UW(a,b,c,d,e)};MV.ya=function(a,b,c,d,e,f){return null!=a&&null!=a.Gg?a.Gg(a,b,c,d,e,f):UW(a,b,c,d,e,f)};MV.J=6;
|
|
2001
2001
|
function OV(a,b){if(null!=a&&null!=a.Gf)a=a.Gf(a,b);else{var c=OV[da(null==a?null:a)];if(null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else if(c=OV._,null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else throw rb("ERDModelActions.set-relation",a);}return a}function PV(a,b,c){if(null!=a&&null!=a.If)a=a.If(a,b,c);else{var d=PV[da(null==a?null:a)];if(null!=d)a=d.j?d.j(a,b,c):d.call(null,a,b,c);else if(d=PV._,null!=d)a=d.j?d.j(a,b,c):d.call(null,a,b,c);else throw rb("ERDModelActions.update-relation",a);}return a}
|
|
2002
2002
|
function QV(a,b){if(null!=a&&null!=a.Ef)a=a.Ef(a,b);else{var c=QV[da(null==a?null:a)];if(null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else if(c=QV._,null!=c)a=c.h?c.h(a,b):c.call(null,a,b);else throw rb("ERDModelActions.remove-relation",a);}return a}function RV(a){if(null!=a&&null!=a.Cd)a=a.Cd(a);else{var b=RV[da(null==a?null:a)];if(null!=b)a=b.g?b.g(a):b.call(null,a);else if(b=RV._,null!=b)a=b.g?b.g(a):b.call(null,a);else throw rb("ERDModelProjectionProtocol.added?",a);}return a}
|
|
2003
2003
|
function SV(a){if(null!=a&&null!=a.Id)a=a.Id(a);else{var b=SV[da(null==a?null:a)];if(null!=b)a=b.g?b.g(a):b.call(null,a);else if(b=SV._,null!=b)a=b.g?b.g(a):b.call(null,a);else throw rb("ERDModelProjectionProtocol.removed?",a);}return a}function TV(a){if(null!=a&&null!=a.Ed)a=a.Ed(a);else{var b=TV[da(null==a?null:a)];if(null!=b)a=b.g?b.g(a):b.call(null,a);else if(b=TV._,null!=b)a=b.g?b.g(a):b.call(null,a);else throw rb("ERDModelProjectionProtocol.diff?",a);}return a}
|
|
@@ -2077,12 +2077,12 @@ bg(dg(r),d(gd(h))):bg(dg(r),null)}var t=B(h),u=l(sW(t))?uf(zf,eh.h(function(y,C)
|
|
|
2077
2077
|
function Kra(a,b){var c=tW(a);c=Pg(function(d){return xW(d,b)},c);if(l(c))return null;c=new k(null,3,[lk,jV(),bI,new Pj(null,new k(null,1,[Up,null],null),null),LM,xh(wW,b)],null);return Fh.l(a,new R(null,3,5,S,[WH,Km,BN],null),Vg(Ge,He),c)}function Lra(a,b,c){var d=tW(a),e=vW(d,b);d=Pg(function(f){return xW(f,c)},th(function(f){return z.h(lk.g(f),b)},d));return l(l(e)?mb(d):e)?xg(a,new R(null,5,5,S,[WH,Km,BN,e,LM],null),xh(wW,c)):null}
|
|
2078
2078
|
function BW(a){for(var b="";;){var c=se("ABCDEFGHIJKLMNOPQRSTUVWXYZ",nl(a,26));b=[p.g(c),b].join("");a=Ff(a,26);if(0===a)return b;--a}}function Mra(a,b){return z.h(a,gt.g(b))?gt:z.h(a,vv.g(b))?vv:z.h(a,cC.g(b))?cC:null}
|
|
2079
2079
|
function Nra(a,b){var c=new Pj(null,new k(null,3,["role",null,"group",null,"user",null],null),null),d=function(){var e=gN.g(a);return l(e)?e:He}();return fi(Wg(function(e,f){var h=dA.g(f),m=Uf.g(h);h=v(b,m);return new k(null,8,[lk,BW(0+e),dA,Yn,HO,m,xq,function(){var n=m instanceof x?m.H:null;switch(n){case "user":return"User";case "group":return"UserGroup";case "role":return"UserRole";default:throw Error(["No matching clause: ",p.g(n)].join(""));}}(),Un,h,XE,mV(f),wA,U.g(f),zM,0],null)},sh(function(e){var f=
|
|
2080
|
-
BF.g(e);return l(f)?jf(c,dA.g(e)):f},d)))}
|
|
2081
|
-
function Ora(a,b,c,d){var e=
|
|
2082
|
-
null),
|
|
2083
|
-
|
|
2084
|
-
3,[TB,
|
|
2085
|
-
function DW(a,b){return z.h(Uj(a),Uj(b))}function EW(a,b){return yg(bI.g(a),bI.g(b))||!DW(LM.g(a),LM.g(b))}function FW(a,b){var c=ug;c=yg(bI.g(a),bI.g(b))?M.j(c,bI,bI.g(a)):c;return DW(LM.g(a),LM.g(b))?c:M.j(c,LM,LM.g(a))}
|
|
2080
|
+
BF.g(e);return l(f)?jf(c,dA.g(e)):f},d)))}function Y0(a){var b=wB.g(a);return l(b)?b:mV(a)}
|
|
2081
|
+
function Ora(a,b,c,d){var e=Uj(Ii(c));b=new R(null,1,5,S,[new k(null,3,[TB,b,rz,He,Tt,Sj([Y0(b)])],null)],null);for(var f=He;;){if(Ue(b)||200<=H(f))return fi(fh(200,f));var h=B(b),m=N(h),n=v(m,TB),r=v(m,rz),t=v(m,Tt),u=Vd(b),w=H(r);if(10<=w)b=u;else{var y=function(){var C=fi(jW(n,JV(a,n)));if(l(wB.g(n))){var D=wh.h;var E=CV(a,wB.g(n));E=jW(E,JV(a,E));C=D.call(wh,C,E)}return C}();b=yb(function(C,D,E,G,K,O,P,T,Z,Y,aa,V){return function(W,ma){var ia=vy.g(ma),oa=mV(ia),ra=Y0(ia),Ba=function(){var Lb=
|
|
2082
|
+
AN.g(ma);if(l(Lb))return Lb;Lb=Ql.g(ma);return l(Lb)?Lb:""}();if(jf(Z,ra)||!1===BF.g(ma)||!1===BF.g(ia))return W;var Ea=new k(null,4,[ep,mV(ma),gF,Ba,yn,oa,xx,U.g(ia)],null),Pa=Ge.h(T,Ea),Ca=Ge.h(Z,ra),Qa=new Pj(null,new k(null,3,["role",null,"group",null,"user",null],null),null),$a=jf(V,ra),db=$a?null:sh(function(Lb,ub,Bb,Sb,Zb,Ib,Mb){return function(vb){var bc=BF.g(vb);return l(bc)?jf(Mb,dA.g(vb)):bc}}(C,D,E,Ea,Pa,Ca,Qa,$a,ia,oa,ra,Ba,G,K,O,P,T,Z,Y,aa,V),gN.g(ia)),bb=$a?new k(null,7,[lk,BW(E+H(rD.g(W))),
|
|
2083
|
+
dA,su,HO,Mra(ra,c),xq,U.g(ia),Un,ra,rz,Pa,zM,H(Pa)],null):null,nb=E+H(rD.g(W))+(l(bb)?1:0),qb=fi(Wg(function(Lb,ub,Bb,Sb,Zb,Ib,Mb,vb,bc,Tb,Dc){return function(Oc,Pc){var Qb=Uf.g(dA.g(Pc));return pj([wA,rz,dA,XE,Un,lk,zM,HO,xq],[U.g(Pc),Zb,Nm,mV(Pc),v(c,Qb),BW(Dc+Oc),H(Zb),Qb,function(){var zc=Qb instanceof x?Qb.H:null;switch(zc){case "user":return"User";case "group":return"UserGroup";case "role":return"UserRole";default:throw Error(["No matching clause: ",p.g(zc)].join(""));}}()])}}(C,D,E,Ea,Pa,Ca,
|
|
2084
|
+
Qa,$a,db,bb,nb,ia,oa,ra,Ba,G,K,O,P,T,Z,Y,aa,V),db));oa=function(){var Lb=rD.g(W);Lb=l(bb)?Ge.h(Lb,bb):Lb;return A(qb)?wh.h(Lb,qb):Lb}();ra=function(){var Lb=In.g(W);return $a?Lb:Ge.h(Lb,new k(null,3,[TB,ia,rz,Pa,Tt,Ca],null))}();return M.o(W,rD,oa,I([In,ra]))}}(b,f,d,y,h,m,n,r,t,u,w,e),new k(null,2,[rD,He,In,He],null),y);u=wh.h(fi(u),In.g(b));f=wh.h(f,rD.g(b));d+=H(rD.g(b));b=u}}}function Z0(a,b){var c=new k(null,3,[gt,yV(fn),vv,yV(yL),cC,yV(CF)],null);return CW(a,b,c)}
|
|
2085
|
+
function CW(a,b,c){if(l(l(a)?b:a)){var d=Nra(b,c);a=Ora(a,b,c,H(d));return fi(Wg(function(e,f){return M.j(f,lk,BW(e))},qf(function(e){var f=N(e);e=v(f,dA);f=v(f,rz);return H(f)+(z.h(Nm,e)?.5:0)},wh.h(d,a))))}return null}function DW(a,b){return z.h(Uj(a),Uj(b))}function EW(a,b){return yg(bI.g(a),bI.g(b))||!DW(LM.g(a),LM.g(b))}function FW(a,b){var c=ug;c=yg(bI.g(a),bI.g(b))?M.j(c,bI,bI.g(a)):c;return DW(LM.g(a),LM.g(b))?c:M.j(c,LM,LM.g(a))}
|
|
2086
2086
|
function GW(a,b){var c=function(){var r=BN.g(a);return l(r)?r:He}(),d=function(){var r=BN.g(b);return l(r)?r:He}(),e=wh.h(ug,eh.h(kk(lk,wf),c)),f=wh.h(ug,eh.h(kk(lk,wf),d));c=Uj(Hi(e));d=Uj(Hi(f));var h=dS.h(d,c),m=dS.h(c,d),n=cS.h(c,d);c=gg.o(function(){return function u(t){return new Wf(null,function(){for(;;){var w=A(t);if(w){if(af(w)){var y=fd(w),C=H(y),D=$f(C);a:for(var E=0;;)if(E<C){var G=Ob(y,E),K=v(f,G);G=D;K=vg(K,new R(null,2,5,S,[lJ,pK],null),!0);G.add(K);E+=1}else{y=!0;break a}return y?
|
|
2087
2087
|
bg(dg(D),u(gd(w))):bg(dg(D),null)}D=B(w);D=v(f,D);return ye(vg(D,new R(null,2,5,S,[lJ,pK],null),!0),u(Vd(w)))}return null}},null,null)}(h)}(),function(){return function u(t){return new Wf(null,function(){for(;;){var w=A(t);if(w){if(af(w)){var y=fd(w),C=H(y),D=$f(C);a:for(var E=0;;)if(E<C){var G=Ob(y,E),K=v(e,G);G=D;K=vg(K,new R(null,2,5,S,[lJ,bz],null),!0);G.add(K);E+=1}else{y=!0;break a}return y?bg(dg(D),u(gd(w))):bg(dg(D),null)}D=B(w);D=v(e,D);return ye(vg(D,new R(null,2,5,S,[lJ,bz],null),!0),u(Vd(w)))}return null}},
|
|
2088
2088
|
null,null)}(m)}(),I([function(){return function u(t){return new Wf(null,function(){for(;;){var w=A(t);if(w){if(af(w)){var y=fd(w),C=H(y),D=$f(C);a:for(var E=0;;)if(E<C){var G=Ob(y,E),K=v(e,G),O=v(f,G);G=D;K=EW(K,O)?vg(O,new R(null,2,5,S,[lJ,Es],null),FW(K,O)):O;G.add(K);E+=1}else{y=!0;break a}return y?bg(dg(D),u(gd(w))):bg(dg(D),null)}y=B(w);D=v(e,y);y=v(f,y);return ye(EW(D,y)?vg(y,new R(null,2,5,S,[lJ,Es],null),FW(D,y)):y,u(Vd(w)))}return null}},null,null)}(n)}()]));return new k(null,2,[kA,Od(b,
|
|
@@ -2106,8 +2106,8 @@ wV.B(null,new R(null,2,5,S,[YD,ym],null),function(){return new pl("1deeb442-5bd2
|
|
|
2106
2106
|
wV.B(null,new R(null,2,5,S,[dw,ym],null),function(){return new pl("4f4cd8f9-e76a-45c0-8bcd-33b13a20e5fe",-1961561189)});wV.B(null,new R(null,2,5,S,[dw,bF],null),function(){return"AnxP7t9R6WmFic7piVxmYH"});wV.B(null,new R(null,2,5,S,[Cq,ym],null),function(){return new pl("1c7b9658-aaae-409a-821a-f0bf31dd44d6",819057642)});wV.B(null,new R(null,2,5,S,[Cq,bF],null),function(){return"4Wzmf2NFacsaQo9vZi6MeD"});
|
|
2107
2107
|
wV.B(null,new R(null,2,5,S,[mn,ym],null),function(){return new pl("9fd134da-ac87-4f48-aa7a-d94ae6ba18be",-1740720575)});wV.B(null,new R(null,2,5,S,[mn,bF],null),function(){return"LjdEukYQUMdPduAcspH1kH"});xV.B(null,new R(null,2,5,S,[Gy,ym],null),function(){return new pl("c5c85417-0aef-4c44-9e86-8090647d6378",205239120)});xV.B(null,new R(null,2,5,S,[Gy,bF],null),function(){return"RRY5JcXr8MwppjvK9bhp7Z"});
|
|
2108
2108
|
xV.B(null,new R(null,2,5,S,[DI,ym],null),function(){return new pl("2c5684ac-d8e1-40a9-8a4b-db602052907f",441910741)});xV.B(null,new R(null,2,5,S,[DI,bF],null),function(){return"6UZ37fazSUWp4XwqA2CiFg"});wV.B(null,new R(null,2,5,S,[Pca,bF],null),function(){return"BfRjYxqSLbdbGXJNRAnyfH"});wV.B(null,new R(null,2,5,S,[qia,bF],null),function(){return"Bopx5916jrSf7HVxipaiat"});var W7=$g(ug);function zAa(a){Q.h(W7,function(b){return vf(function(c,d,e){return M.j(c,Uf.g(Vf(d)),e)},b,a)})}
|
|
2109
|
-
function X7(a){var b=N(a),c=v(b,U),d=v(b,QB);a=v(b,xm);b=v(b,RF);c=v(q(W7),Uf.g(c));d=null==d?"16px":"number"===typeof d?[p.g(d),"px"].join(""):"string"===typeof d?l(nk(/^\d+(\.\d+)?$/,d))?[d,"px"].join(""):d:"16px";b=l(b)?"sy-icon sy-anim-spin":"sy-icon";return new R(null,2,5,S,[Q_,new k(null,3,[xm,"string"===typeof a?[b," ",a].join(""):b,FH,new k(null,2,[uI,d,qr,d],null),Js,l(c)?c:""],null)],null)};function z2(a,b,c){if(b instanceof CSSStyleSheet)c=a.adoptedStyleSheets,l(Pg(function(e){return e===b},c))||(a.adoptedStyleSheets=c.concat([b]));else if("string"===typeof b){var d=a.querySelector(["style#",p.g(c)].join(""));l(d)?yg(d.textContent,b)&&(d.textContent=b):(d=document.createElement("style"),d.id=c,d.textContent=b,a.appendChild(d))}else console.error("ensure-styles!: styles must be CSSStyleSheet or string",b)};var
|
|
2110
|
-
function pX(a){z2(a,
|
|
2109
|
+
function X7(a){var b=N(a),c=v(b,U),d=v(b,QB);a=v(b,xm);b=v(b,RF);c=v(q(W7),Uf.g(c));d=null==d?"16px":"number"===typeof d?[p.g(d),"px"].join(""):"string"===typeof d?l(nk(/^\d+(\.\d+)?$/,d))?[d,"px"].join(""):d:"16px";b=l(b)?"sy-icon sy-anim-spin":"sy-icon";return new R(null,2,5,S,[Q_,new k(null,3,[xm,"string"===typeof a?[b," ",a].join(""):b,FH,new k(null,2,[uI,d,qr,d],null),Js,l(c)?c:""],null)],null)};function z2(a,b,c){if(b instanceof CSSStyleSheet)c=a.adoptedStyleSheets,l(Pg(function(e){return e===b},c))||(a.adoptedStyleSheets=c.concat([b]));else if("string"===typeof b){var d=a.querySelector(["style#",p.g(c)].join(""));l(d)?yg(d.textContent,b)&&(d.textContent=b):(d=document.createElement("style"),d.id=c,d.textContent=b,a.appendChild(d))}else console.error("ensure-styles!: styles must be CSSStyleSheet or string",b)};var a1=new CSSStyleSheet;a1.replaceSync("/* Notification stack — bottom-left, compact, one style for every severity. */\n\n.sy-notify-stack {\n position: fixed;\n bottom: 36px;\n left: 8px;\n width: 360px;\n z-index: 10500;\n display: flex;\n flex-direction: column-reverse;\n align-items: stretch;\n gap: 4px;\n pointer-events: none;\n font-family: 'Inter', sans-serif;\n}\n\n.sy-notify-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 5px 6px 5px 8px;\n border-radius: 6px;\n font-size: 12px;\n line-height: 1.3;\n background: var(--modeling-overlay-bg);\n color: var(--sy-text-primary);\n border: 2px solid color-mix(in srgb, var(--sy-notify-edge) 22%, transparent);\n box-shadow: var(--modeling-shadow-popover);\n pointer-events: auto;\n animation: sy-notify-in 0.16s ease-out;\n transition: opacity 0.16s, transform 0.16s;\n min-width: 0;\n}\n\n.sy-notify-leaving {\n opacity: 0;\n transform: translateX(-8px);\n}\n\n.sy-notify-success { --sy-notify-edge: var(--sy-success); }\n.sy-notify-info { --sy-notify-edge: var(--sy-info); }\n.sy-notify-warning { --sy-notify-edge: var(--sy-warn); }\n.sy-notify-error { --sy-notify-edge: var(--sy-danger); }\n\n.sy-notify-row {\n display: flex;\n align-items: flex-start;\n gap: 7px;\n min-width: 0;\n}\n\n.sy-notify-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n border-radius: 5px;\n background: color-mix(in srgb, var(--sy-notify-edge) 16%, transparent);\n color: var(--sy-notify-edge);\n}\n\n.sy-notify-text {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 1px;\n /* Matches the icon chip, so a single line sits on the chip's centre.\n No-op once the text wraps — the row then grows past it and the chip\n stays on the first line. */\n min-height: 20px;\n overflow-wrap: anywhere;\n}\n\n.sy-notify-title {\n font-weight: 500;\n}\n\n.sy-notify-message {\n color: var(--sy-text-secondary);\n}\n\n.sy-notify-code {\n display: inline-block;\n margin-left: 6px;\n vertical-align: 1px;\n font-size: 10px;\n font-weight: 700;\n letter-spacing: .06em;\n text-transform: uppercase;\n padding: 1px 5px;\n border-radius: 3px;\n color: var(--sy-notify-edge);\n background: color-mix(in srgb, var(--sy-notify-edge) 16%, transparent);\n}\n\n.sy-notify-hint {\n padding-left: 27px;\n font-size: 11px;\n color: var(--sy-text-muted);\n white-space: normal;\n}\n\n.sy-notify-dismiss {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: 2px;\n margin-top: 2px;\n padding: 0;\n border: none;\n border-radius: 3px;\n background: transparent;\n color: var(--sy-text-muted);\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.sy-notify-dismiss:hover {\n color: var(--sy-text-primary);\n background: var(--modeling-hover-overlay);\n}\n\n/* Ripple on the icon chip — same shape/tempo as the cockpit's live and\n critical dots (cockpit.css lens-live-pulse / lens-crit-pulse): a ring that\n expands and fades, ease-out. Sticky items only, so a pulse in this product\n always means \"still here, needs you\". */\n@keyframes sy-notify-ripple {\n 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--sy-notify-edge) 50%, transparent); }\n 70% { box-shadow: 0 0 0 7px color-mix(in srgb, var(--sy-notify-edge) 0%, transparent); }\n 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--sy-notify-edge) 0%, transparent); }\n}\n\n.sy-notify-sticky .sy-notify-icon {\n animation: sy-notify-ripple 1.6s ease-out infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sy-notify-item,\n .sy-notify-sticky .sy-notify-icon { animation: none; }\n}\n\n@keyframes sy-notify-in {\n from { opacity: 0; transform: translateX(-8px); }\n to { opacity: 1; transform: translateX(0); }\n}\n");
|
|
2110
|
+
function pX(a){z2(a,a1,"synthigy-notify")}
|
|
2111
2111
|
zAa(new k(null,5,[Mt,"\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M20 6 9 17l-5-5'/\x3e\n\x3c/svg\x3e\n",BK,"\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3ccircle r\x3d'10' cy\x3d'12' cx\x3d'12'/\x3e\n\x3cpath d\x3d'M12 16v-4'/\x3e\n\x3cpath d\x3d'M12 8h.01'/\x3e\n\x3c/svg\x3e\n",Ep,
|
|
2112
2112
|
"\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'm21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3'/\x3e\n\x3cpath d\x3d'M12 9v4'/\x3e\n\x3cpath d\x3d'M12 17h.01'/\x3e\n\x3c/svg\x3e\n",hF,"\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M18.2 12.27 20 6H4l1.8 6.27a1 1 0 0 0 .95.73h10.5a1 1 0 0 0 .96-.73Z'/\x3e\n\x3cpath d\x3d'M8 13v9'/\x3e\n\x3cpath d\x3d'M16 22v-9'/\x3e\n\x3cpath d\x3d'm9 6 1 7'/\x3e\n\x3cpath d\x3d'm15 6-1 7'/\x3e\n\x3cpath d\x3d'M12 6V2'/\x3e\n\x3cpath d\x3d'M13 2h-2'/\x3e\n\x3c/svg\x3e\n",
|
|
2113
2113
|
WL,"\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M18 6 6 18'/\x3e\n\x3cpath d\x3d'm6 6 12 12'/\x3e\n\x3c/svg\x3e\n"],null));
|
|
@@ -2134,12 +2134,12 @@ g.Qa=function(a,b){return jf(new Pj(null,new k(null,1,[EB,null],null),null),b)?L
|
|
|
2134
2134
|
g.Z=function(a,b){return new LW(this.kc,b,this.s,this.C)};g.ha=function(a,b){return $e(b)?this.ja(null,Ob(b,0),Ob(b,1)):yb(Kb,this,b)};function MW(a){var b=Le.h(a,EB);b=Ze(a)?wh.h(ug,b):b;return new LW(EB.g(a),null,zg(b),null)};var NW=Sg(null),OW=Sg(null);function PW(a){return OW.call(null,a)}function QW(a){return NW.call(null,a)}
|
|
2135
2135
|
function RW(){var a=new k(null,2,[wp,Ke([ZV,SW("synthigy.dataset.core.ERDRelation",Hi($V(null))),aW,SW("synthigy.dataset.core.ERDEntityAttribute",Hi(bW(null))),dW,SW("synthigy.dataset.core.ERDEntity",Hi(eW(null))),fW,SW("synthigy.dataset.core.ERDModel",Hi(gW(null))),HW,SW("synthigy.modeling.core.Coordinate",Hi(IW(null))),JW,SW("synthigy.modeling.core.PathSegment",Hi(KW(null))),LW,SW("synthigy.modeling.core.Path",Hi(MW(null)))]),Up,Kj.o(I([new k(null,7,["synthigy.dataset.core.ERDRelation",TW($V),"synthigy.dataset.core.ERDEntityAttribute",
|
|
2136
2136
|
TW(bW),"synthigy.dataset.core.ERDEntity",TW(eW),"synthigy.dataset.core.ERDModel",TW(gW),"synthigy.modeling.core.Coordinate",TW(IW),"synthigy.modeling.core.PathSegment",TW(KW),"synthigy.modeling.core.Path",TW(MW)],null),new k(null,7,["neyho.eywa.dataset.core.ERDRelation",TW($V),"neyho.eywa.dataset.core.ERDEntityAttribute",TW(bW),"neyho.eywa.dataset.core.ERDEntity",TW(eW),"neyho.eywa.dataset.core.ERDModel",TW(gW),"neyho.eywa.modeling.core.Coordinate",TW(IW),"neyho.eywa.modeling.core.PathSegment",TW(KW),
|
|
2137
|
-
"neyho.eywa.modeling.core.Path",TW(MW)],null)]))],null);a=N(a);var b=v(a,wp),c=v(a,Up);OW=function(d){return l(d)?ET(hL,new k(null,1,[Zq,b],null)).write(d):null};NW=function(d){return l(d)?vT(hL,new k(null,1,[Zq,c],null)).read(d):null}}function
|
|
2138
|
-
g.stringRep=function(){return null};g.getVerboseHandler=function(){return null};function SW(a,b){return new
|
|
2137
|
+
"neyho.eywa.modeling.core.Path",TW(MW)],null)]))],null);a=N(a);var b=v(a,wp),c=v(a,Up);OW=function(d){return l(d)?ET(hL,new k(null,1,[Zq,b],null)).write(d):null};NW=function(d){return l(d)?vT(hL,new k(null,1,[Zq,c],null)).read(d):null}}function d1(a,b,c){this.type=a;this.De=b;this.sg=c;this.G=393216;this.N=0}g=d1.prototype;g.Z=function(a,b){return new d1(this.type,this.De,b)};g.Y=function(){return this.sg};g.tag=function(){return this.type};g.rep=function(a){a=Mj(a,this.De);return vS("map",a)};
|
|
2138
|
+
g.stringRep=function(){return null};g.getVerboseHandler=function(){return null};function SW(a,b){return new d1(a,b,ug)}function TW(a){return function(b){return a.g?a.g(b):a.call(null,b)}};var K7=$g(new k(null,4,[oA,null,Av,Sg(null),SK,Sg(!1),Gr,Sg(null)],null));function i2(a){return Q.j(K7,Kj,a)}function nAa(){var a=Av.g(q(K7));return a.v?a.v():a.call(null)}function L7(a){var b=SK.g(q(K7));return!0===(b.v?b.v():b.call(null))?new k(null,1,[n0,new R(null,1,5,S,[new k(null,2,[lD,new k(null,1,[Yw,PB],null),sm,Ke([a,null,U,null])],null)],null)],null):null}
|
|
2139
2139
|
function oAa(a){var b=H(a);return 0===b?null:z.h(1,b)?(a=B(a),b=N(a),a=v(b,dv),b=v(b,TB),l(l(a)?b:a)?[p.g(a)," on ",p.g(b)].join(""):l(a)?p.g(a):null):[p.g(b)," operations"].join("")}function gua(a){for(var b=[],c=arguments.length,d=0;;)if(d<c)b.push(arguments[d]),d+=1;else break;fEa(arguments[0],arguments[1],arguments[2],3<b.length?new Sd(b.slice(3),0,null):null)}
|
|
2140
2140
|
function fEa(a,b,c,d){d=J(d,0,null);z.h("UNAUTHORIZED",b)?oX(Rea,b):z.h("NETWORK",b)?K8(l(c)?c:"Request failed",new k(null,3,[SH,er,lx,b,bt,a],null)):K8(l(c)?c:"Request failed",new k(null,4,[SH,l(c)?c:I_,lx,b,bt,a,az,d],null))}
|
|
2141
|
-
function pAa(a,b){
|
|
2142
|
-
function(
|
|
2141
|
+
function pAa(a,b){var c=N(b),d=v(c,Qx),e=v(c,TF);b=v(c,Kr);c=v(c,sN);var f=l(b)?b:oAa(a);if(!l(oA.g(q(K7))))throw Error("[data] No endpoint configured. Set endpoint attribute.");return YR(VR.h(DV(a,I([sN,c])),function(h){if(Og(Pu,h)){L8(Dy);L8(er);if(l(d)){var m=xh(rB,h);d.g?d.g(m):d.call(null,m)}return h}var n=th(Pu,h),r=function(){var t=null==n?null:B(n);return null==t?null:bD.g(t)}();h=function(){var t=bt.g(r);return l(t)?t:zk.o(I([n]))}();m=lx.g(r);fEa(h,m,f,I([az.g(r)]));return l(e)?e.g?e.g(h):
|
|
2142
|
+
e.call(null,h):null}),function(h){console.error("[data] Request error:",h);var m=lx.g(ul(h));h=vl(h);gua(h,l(m)?m:"NETWORK",f);return l(e)?e.g?e.g(h):e.call(null,h):null})}function N7(a,b){var c=N(b),d=v(c,Qx);b=v(c,TF);var e=v(c,Kr);c=v(c,sN);return pAa(new R(null,1,5,S,[a],null),I([Qx,function(f){return l(d)?(f=B(f),d.g?d.g(f):d.call(null,f)):null},TF,b,Kr,e,sN,c]))}
|
|
2143
2143
|
function O7(a){var b=N(a),c=v(b,ir);a=v(b,Qx);var d=v(b,TF);b=v(b,Kr);var e=lV(),f=new k(null,1,[Bw,new k(null,1,[U,$A],null)],null);c=l(zg(c))?M.j(f,rq,new k(null,1,[U,new k(null,1,[rK,["%",p.g(c),"%"].join("")],null)],null)):f;return N7(new k(null,4,[dv,"search",TB,"Dataset",lD,c,sm,Ke([e,null,U,null,FF,new R(null,1,5,S,[new k(null,2,[lD,new k(null,3,[Yw,PB,Bw,new k(null,1,[xI,$y],null),Dx,1],null),sm,Kj.o(I([Ke([e,null,U,null,xI,null]),L7(e)]))],null)],null)])],null),I([Qx,a,TF,d,Kr,b]))}
|
|
2144
2144
|
function P7(a,b){var c=N(b);b=v(c,Qx);var d=v(c,TF);c=v(c,Kr);var e=lV();return N7(new k(null,4,[dv,"get",TB,"Dataset Version",lD,Ke([e,a]),sm,Ke([e,null,U,null,JM,null,xE,null,Lv,new R(null,1,5,S,[new k(null,1,[sm,Ke([e,null,U,null])],null)],null)])],null),I([Qx,b,TF,d,Kr,c]))}
|
|
2145
2145
|
function qAa(a,b){var c=N(b),d=v(c,Qx);b=v(c,TF);c=v(c,Kr);var e=lV();return N7(new k(null,4,[dv,"get",TB,"Dataset",lD,Ke([e,a]),sm,Ke([e,null,U,null,FF,new R(null,1,5,S,[new k(null,2,[lD,new k(null,1,[Bw,new k(null,1,[xI,$y],null)],null),sm,Kj.o(I([Ke([e,null,U,null,xE,null,xI,null]),L7(e)]))],null)],null)])],null),I([Qx,function(f){return l(d)?(f=FF.g(f),d.g?d.g(f):d.call(null,f)):null},TF,b,Kr,c]))}
|
|
@@ -2160,8 +2160,8 @@ kk(Tf,Vf)(r),u=J(t,0,null);t=J(t,1,null);var w=r instanceof Jd?Pd:Uf;return null
|
|
|
2160
2160
|
function iU(a,b){if(null!=a&&null!=a.Be)a.Be(a,b);else{var c=iU[da(null==a?null:a)];if(null!=c)c.h?c.h(a,b):c.call(null,a,b);else if(c=iU._,null!=c)c.h?c.h(a,b):c.call(null,a,b);else throw rb("IPushbackReader.unread",a);}}function jU(a){if(null!=a&&null!=a.kg)a=a.kg(a);else{var b=jU[da(null==a?null:a)];if(null!=b)a=b.g?b.g(a):b.call(null,a);else if(b=jU._,null!=b)a=b.g?b.g(a):b.call(null,a);else throw rb("IndexingReader.get-line-number",a);}return a}
|
|
2161
2161
|
function kU(a){if(null!=a&&null!=a.ig)a=a.ig(a);else{var b=kU[da(null==a?null:a)];if(null!=b)a=b.g?b.g(a):b.call(null,a);else if(b=kU._,null!=b)a=b.g?b.g(a):b.call(null,a);else throw rb("IndexingReader.get-column-number",a);}return a}function lU(a){if(null!=a&&null!=a.jg)a=a.jg(a);else{var b=lU[da(null==a?null:a)];if(null!=b)a=b.g?b.g(a):b.call(null,a);else if(b=lU._,null!=b)a=b.g?b.g(a):b.call(null,a);else throw rb("IndexingReader.get-file-name",a);}return a}
|
|
2162
2162
|
function mU(a,b){this.la=a;this.tf=b;this.Pc=0}mU.prototype.Bc=function(){if(this.tf>this.Pc){var a=this.la.charAt(this.Pc);this.Pc+=1;return a}return null};mU.prototype.dd=function(){return this.tf>this.Pc?this.la.charAt(this.Pc):null};function nU(a,b){this.Ve=a;this.zc=b;this.Sb=this.Qd=1}nU.prototype.Bc=function(){var a=this.Sb<this.Qd?this.zc[this.Sb]:this.Ve.Bc(null);this.Sb<this.Qd&&(this.Sb+=1);return null==a?null:Df(a)};
|
|
2163
|
-
nU.prototype.dd=function(){var a=this.Sb<this.Qd?this.zc[this.Sb]:this.Ve.dd(null);return null==a?null:Df(a)};nU.prototype.Be=function(a,b){if(l(b)){if(0===this.Sb)throw Error("Pushback buffer is full");--this.Sb;return this.zc[this.Sb]=b}return null};function oU(a){return null!=a?Va===a.$g?!0:!1:!1};function pU(a,b,c,d){var e=H(b);a=l(a)?0:10<e?10:e;b=eh.h(Ug(qU,!0),fh(a,b));b=pg(p,ph(" ",b));e=a<e?"...":null;return[p.g(c),p.g(b),e,p.g(d)].join("")}var qU,
|
|
2164
|
-
qU=new ml(Pd.h("cljs.tools.reader.impl.inspect","inspect*"),function(a,b){return null==b?Fa:"string"===typeof b?pI:b instanceof x?KC:"number"===typeof b?KC:b instanceof Jd?KC:$e(b)?DG:Mf(b)?WD:Ye(b)?jJ:We(b)?Jw:z.h(b,!0)?KC:z.h(b,!1)?KC:pb(b)},
|
|
2163
|
+
nU.prototype.dd=function(){var a=this.Sb<this.Qd?this.zc[this.Sb]:this.Ve.dd(null);return null==a?null:Df(a)};nU.prototype.Be=function(a,b){if(l(b)){if(0===this.Sb)throw Error("Pushback buffer is full");--this.Sb;return this.zc[this.Sb]=b}return null};function oU(a){return null!=a?Va===a.$g?!0:!1:!1};function pU(a,b,c,d){var e=H(b);a=l(a)?0:10<e?10:e;b=eh.h(Ug(qU,!0),fh(a,b));b=pg(p,ph(" ",b));e=a<e?"...":null;return[p.g(c),p.g(b),e,p.g(d)].join("")}var qU,lna=$g(ug),ona=$g(ug),xna=$g(ug),yna=$g(ug),zna=Od(ug,Yx,al.v?al.v():al.call(null));
|
|
2164
|
+
qU=new ml(Pd.h("cljs.tools.reader.impl.inspect","inspect*"),function(a,b){return null==b?Fa:"string"===typeof b?pI:b instanceof x?KC:"number"===typeof b?KC:b instanceof Jd?KC:$e(b)?DG:Mf(b)?WD:Ye(b)?jJ:We(b)?Jw:z.h(b,!0)?KC:z.h(b,!1)?KC:pb(b)},zna,lna,ona,xna,yna);qU.B(null,pI,function(a,b){a=l(a)?5:20;var c=b.length>a?'..."':'"',d=b.length;return['"',p.g(b.substring(0,a<d?a:d)),c].join("")});qU.B(null,KC,function(a,b){return p.g(b)});qU.B(null,Sd,function(){return"\x3cindexed seq\x3e"});
|
|
2165
2165
|
qU.B(null,Fi,function(){return"\x3cmap seq\x3e"});qU.B(null,ij,function(){return"\x3cmap seq\x3e"});qU.B(null,Rf,function(){return"\x3ccons\x3e"});qU.B(null,Wf,function(){return"\x3clazy seq\x3e"});qU.B(null,Fa,function(){return"nil"});qU.B(null,WD,function(a,b){return pU(a,b,"(",")")});qU.B(null,jJ,function(a,b){var c=H(b),d=l(a)?0:c;b=pg(gg,fh(d,b));return pU(a,b,"{",c>d?"...}":"}")});qU.B(null,Jw,function(a,b){return pU(a,b,"#{","}")});qU.B(null,DG,function(a,b){return pU(a,b,"[","]")});
|
|
2166
2166
|
qU.B(null,zl,function(a,b){return zk.o(I([pb(b)]))});function rU(a,b,c){b=new k(null,2,[dA,Ll,on,b],null);a=oU(a)?M.o(b,QK,lU(a),I([SB,jU(a),NC,kU(a)])):b;var d=QK.g(a);b=SB.g(a);var e=NC.g(a);d=l(d)?[p.g(d)," "].join(""):null;b=l(b)?["[line ",p.g(b),", col ",p.g(e),"]"].join(""):null;c=sg(p,d,b,l(l(d)?d:b)?" ":null,c);throw tl(c,a);}function sU(a,b){return rU(a,uca,I([pg(p,b)]))}function tU(a,b){return rU(a,Nba,I([pg(p,b)]))}function uU(a,b){return rU(a,Do,I([pg(p,b)]))}
|
|
2167
2167
|
function vU(a,b,c,d){sU(a,I(["The map literal starting with ",qU.h(!1,B(d)),l(b)?[" on line ",p.g(b)," column ",p.g(c)].join(""):null," contains ",H(d)," form(s). Map literals must contain an even number of forms."]))}function wU(a,b,c){return sU(a,I(["Invalid ",Vf(b),": ",c,"."]))}function xU(a,b,c){return sU(a,I(["Invalid character: ",c," found while reading ",Vf(b),"."]))}
|
|
@@ -2533,10 +2533,10 @@ function G0(a,b){return ef(function(){var c=A(a);return c?Pg(function(d){return
|
|
|
2533
2533
|
function Uta(a){var b=a.state.doc.toString();a=a.pos;var c=B0();if(l(c))try{var d=vta(new k(null,3,[aw,b,UC,a,zK,c],null)),e=fm.g(d),f="number"===typeof e&&0<=e&&e<=a?b.substring(e,a):null;if(G0(f,xy.g(d)))return null;var h=function(){var m=xy.g(d);return A(f)?th(function(n){return z.h(bP(p.g(gF.g(n))),bP(f))},m):m}();return A(h)?{from:e,options:pf(xh(Tta,h))}:null}catch(m){return console.error("[xsql] completion-source threw",m,"source:",b,"offset:",a),null}else return null}
|
|
2534
2534
|
function Vta(a){a=a.state.doc.toString();var b=B0(),c=[];try{var d=A(j_(a,b));b=null;for(var e=0,f=0;;)if(f<e){var h=b.P(null,f);c.push({from:fm.g(h),to:function(){var y=fm.g(h)+1,C=vy.g(h);return y>C?y:C}(),severity:Vf(aJ.g(h)),message:bt.g(h)});f+=1}else{var m=A(d);if(m){var n=m;if(af(n)){var r=fd(n),t=gd(n);n=r;var u=H(r);d=t;b=n;e=u}else{var w=B(n);c.push({from:fm.g(w),to:function(){var y=fm.g(w)+1,C=vy.g(w);return y>C?y:C}(),severity:Vf(aJ.g(w)),message:bt.g(w)});d=F(n);b=null;e=0}f=0}else break}}catch(y){console.error("[xsql] lint-source threw",
|
|
2535
2535
|
y,"source:",a)}return c}function Wta(a){return $T.linter(function(b){b=Vta(b);if(l(a)){a:{var c=b.length;for(var d=0,e=0;;){if(d>=c){c=e;break a}var f=d+1;e=z.h("error",b[d].severity)?e+1:e;d=f}}a.g?a.g(c):a.call(null,c)}return b},{delay:150})};var H0=VT.EditorView.theme({".cm-scroller":{overflow:"auto",fontFamily:"'JetBrains Mono','Fira Code','Cascadia Code',monospace",fontSize:"13px",lineHeight:"1.6"},".cm-activeLineGutter":{backgroundColor:"var(--sy-hover-overlay)",color:"var(--sy-text-secondary)"},".cm-gutters":{backgroundColor:"transparent",color:"var(--sy-text-faint)",border:"none"},".cm-activeLine":{backgroundColor:"var(--sy-hover-overlay)"},".cm-lineNumbers .cm-gutterElement":{padding:"0 8px 0 4px"},"\x26.cm-focused .cm-selectionBackground, ::selection, .cm-selectionBackground":{backgroundColor:"var(--sy-selection-bg)"},
|
|
2536
|
-
".cm-cursor, .cm-dropCursor":{borderLeftColor:"var(--sy-accent)"},".cm-content":{padding:"12px 0",caretColor:"var(--sy-accent)"},"\x26":{height:"100%",backgroundColor:"var(--sy-bg-surface)",color:"var(--sy-text-primary)"}}),
|
|
2537
|
-
fontWeight:"600"},
|
|
2538
|
-
|
|
2539
|
-
var M0=
|
|
2536
|
+
".cm-cursor, .cm-dropCursor":{borderLeftColor:"var(--sy-accent)"},".cm-content":{padding:"12px 0",caretColor:"var(--sy-accent)"},"\x26":{height:"100%",backgroundColor:"var(--sy-bg-surface)",color:"var(--sy-text-primary)"}}),K1=XT.HighlightStyle,Ana=K1.define,Bna={tag:WT.tags.comment,color:"var(--sy-text-faint)",fontStyle:"italic"},UEa={tag:WT.tags.lineComment,color:"var(--sy-text-faint)",fontStyle:"italic"},mEa={tag:WT.tags.keyword,color:"var(--sy-syntax-keyword)"},nEa={tag:WT.tags.annotation,color:"var(--sy-syntax-directive)",
|
|
2537
|
+
fontWeight:"600"},oEa={tag:WT.tags.docString,color:"var(--sy-syntax-doc)",fontStyle:"italic"},pEa={tag:WT.tags.string,color:"var(--sy-syntax-string)"},qEa={tag:WT.tags.number,color:"var(--sy-syntax-number)"},rEa={tag:WT.tags.bool,color:"var(--sy-syntax-literal)"},sEa={tag:WT.tags.null,color:"var(--sy-syntax-literal)"},uEa={tag:WT.tags.operator,color:"var(--sy-syntax-literal)"},sDa={tag:WT.tags.propertyName,color:"var(--sy-syntax-key)"},S1,V1=WT.tags.propertyName,Z1=WT.tags.definition;
|
|
2538
|
+
S1=Z1.g?Z1.g(V1):Z1.call(null,V1);
|
|
2539
|
+
var M0=Ana.call(K1,[Bna,UEa,mEa,nEa,oEa,pEa,qEa,rEa,sEa,uEa,sDa,{tag:S1,color:"var(--sy-syntax-key)",fontWeight:"600"},{tag:WT.tags.variableName,color:"var(--sy-syntax-key)"},{tag:WT.tags.typeName,color:"var(--sy-syntax-relation)"},{tag:WT.tags.punctuation,color:"var(--sy-syntax-punct)"},{tag:WT.tags.brace,color:"var(--sy-syntax-punct)"},{tag:WT.tags.bracket,color:"var(--sy-syntax-punct)"},{tag:WT.tags.separator,color:"var(--sy-syntax-punct)"},{tag:WT.tags.meta,color:"var(--sy-text-muted)"},{tag:WT.tags.invalid,
|
|
2540
2540
|
color:"var(--sy-error)"}]),N0=[{key:"Tab",run:ZT.acceptCompletion}].concat(ZT.completionKeymap.filter(function(a){return yg("Enter",a.key)}));
|
|
2541
2541
|
function iua(a,b,c){return new R(null,11,5,S,[VT.tooltips({parent:a}),VT.lineNumbers(),VT.highlightActiveLine(),VT.highlightActiveLineGutter(),YT.history(),ZT.closeBrackets(),VT.keymap.of([{key:"Ctrl-Space",run:function(d){return ZT.startCompletion(d)}},{key:"Mod-Space",run:function(d){return ZT.startCompletion(d)}},{key:"Ctrl-Enter",run:function(d){d=d.state.selection.main.head;c.g?c.g(d):c.call(null,d);return!0}},{key:"Mod-Enter",run:function(d){d=d.state.selection.main.head;c.g?c.g(d):c.call(null,
|
|
2542
2542
|
d);return!0}},{key:"Shift-Ctrl-Enter",run:function(){c.g?c.g($m):c.call(null,$m);return!0}},{key:"Shift-Mod-Enter",run:function(){c.g?c.g($m):c.call(null,$m);return!0}}].concat(ZT.closeBracketsKeymap,YT.defaultKeymap,YT.historyKeymap,N0)),$T.lintGutter(),H0,XT.syntaxHighlighting(M0),VT.EditorView.updateListener.of(function(d){return l(d.docChanged)?(d=d.state.doc.toString(),b.g?b.g(d):b.call(null,d)):null})],null)}
|
|
@@ -2669,7 +2669,7 @@ function h2(a,b,c,d,e){return["radial-gradient(",p.g(a),"% ",p.g(b),"% at ",p.g(
|
|
|
2669
2669
|
var Eva=xh(function(a){var b=N(a);var c=v(b,Zu);var d=v(b,Yu),e=v(b,lm),f=v(b,KB);b=v(b,py);c=new R(null,3,5,S,[XJ,new k(null,2,[CC,"true",FH,new k(null,7,[RA,"absolute",PB,[p.g(c),"%"].join(""),SC,[p.g(d),"%"].join(""),uI,[p.g(5.5*f),"%"].join(""),qr,[p.g(9*b),"%"].join(""),CL,["translate(-50%,-50%) rotate(",p.g(e),"deg)"].join(""),YB,"var(--modeling-nebula-opacity, .55)"],null)],null),new R(null,2,5,S,[XJ,new k(null,1,[FH,new k(null,7,[uI,"100%",qr,"100%",to,aP(", ",new R(null,6,5,S,[h2(38,45,32,
|
|
2670
2670
|
44,.1),h2(28,38,55,34,.08),h2(45,55,62,60,.07),h2(22,30,42,64,.09),h2(16,22,70,42,.08),h2(60,70,48,48,.05)],null)),Kp,"url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' width\x3d'900' height\x3d'500'\x3e\x3cfilter id\x3d'n'\x3e\x3cfeTurbulence type\x3d'fractalNoise' baseFrequency\x3d'0.005 0.011' numOctaves\x3d'3' seed\x3d'7' stitchTiles\x3d'stitch'/\x3e\x3cfeColorMatrix type\x3d'matrix' values\x3d'0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1.9 -0.5'/\x3e\x3cfeGaussianBlur stdDeviation\x3d'5'/\x3e\x3c/filter\x3e\x3crect width\x3d'100%25' height\x3d'100%25' filter\x3d'url(%23n)'/\x3e\x3c/svg\x3e\")",
|
|
2671
2671
|
qG,"url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' width\x3d'900' height\x3d'500'\x3e\x3cfilter id\x3d'n'\x3e\x3cfeTurbulence type\x3d'fractalNoise' baseFrequency\x3d'0.005 0.011' numOctaves\x3d'3' seed\x3d'7' stitchTiles\x3d'stitch'/\x3e\x3cfeColorMatrix type\x3d'matrix' values\x3d'0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1.9 -0.5'/\x3e\x3cfeGaussianBlur stdDeviation\x3d'5'/\x3e\x3c/filter\x3e\x3crect width\x3d'100%25' height\x3d'100%25' filter\x3d'url(%23n)'/\x3e\x3c/svg\x3e\")",
|
|
2672
|
-
Zha,"cover",Hma,"cover"],null)],null)],null)],null);return new k(null,3,[zn,a,UG,c,tK,wh.h(new R(null,2,5,S,[XJ,new k(null,1,[FH,new k(null,2,[RA,"absolute",gD,"0"],null)],null)],null),Cva(a))],null)},Ow.g(d2))
|
|
2672
|
+
Zha,"cover",Hma,"cover"],null)],null)],null)],null);return new k(null,3,[zn,a,UG,c,tK,wh.h(new R(null,2,5,S,[XJ,new k(null,1,[FH,new k(null,2,[RA,"absolute",gD,"0"],null)],null)],null),Cva(a))],null)},Ow.g(d2)),$1=z,Cna=$1.h,a2;try{a2=localStorage.getItem("synthigy-modeling-black-hole")}catch(a){a2=null}var Gva=$g(Cna.call($1,"on",a2));
|
|
2673
2673
|
function Hva(a,b,c){var d=vK.g(d2),e=N(d);d=v(e,WL);var f=v(e,VL);e=v(e,QB);c=Math.round(.47*e*c);return["radial-gradient(circle at calc(",p.g(d),"% + ",p.g(a),"px) calc(",p.g(f),"% + ",p.g(b),"px), transparent 0 ",p.g(c),"px, #000 ",p.g(c+15),"px)"].join("")}
|
|
2674
2674
|
function Iva(a,b,c){var d=vK.g(d2),e=N(d);d=v(e,WL);var f=v(e,VL);e=v(e,QB);return new R(null,5,5,S,[XJ,new k(null,2,[CC,"true",FH,new k(null,7,[RA,"absolute",PB,[p.g(d),"%"].join(""),SC,[p.g(f),"%"].join(""),uI,[p.g(e),"px"].join(""),qr,[p.g(e),"px"].join(""),CL,["translate(-50%,-50%) translate(",p.g(a),"px, ",p.g(b),"px) scale(",p.g(c.toFixed(3)),")"].join(""),YB,"var(--modeling-hole-opacity, 1)"],null)],null),new R(null,2,5,S,[XJ,new k(null,1,[FH,new k(null,5,[RA,"absolute",gD,"0",ED,"50%",to,
|
|
2675
2675
|
"radial-gradient(circle, transparent 44%, rgba(var(--modeling-star-rgb, 255, 255, 255), .28) 49%, rgba(var(--modeling-star-rgb, 255, 255, 255), .05) 55%, transparent 66%)",Tq,"blur(2px)"],null)],null)],null),new R(null,2,5,S,[XJ,new k(null,1,[FH,new k(null,4,[RA,"absolute",gD,"0",ED,"50%",RL,"0 0 120px 30px rgba(var(--modeling-star-rgb, 255, 255, 255), .06)"],null)],null)],null),new R(null,2,5,S,[XJ,new k(null,1,[FH,new k(null,4,[RA,"absolute",gD,"14%",ED,"50%",to,"radial-gradient(circle, #000 58%, rgba(5,6,9,.6) 78%, transparent 100%)"],
|
|
@@ -2680,8 +2680,8 @@ function k2(a){a=N(a);var b=v(a,oq);a=v(a,Py);var c=null!=a?a:q(Gva);a=vK.g(d2);
|
|
|
2680
2680
|
2,5,S,[wJ,new k(null,1,[AM,"M18 6 6 18M6 6l12 12"],null)],null)],null),Lva=new R(null,3,5,S,[VH,new k(null,8,[uI,"13",qr,"13",zG,"0 0 24 24",HK,"none",kt,"currentColor",jG,"2",Np,"round",QD,"round"],null),new R(null,2,5,S,[wJ,new k(null,1,[AM,"M12 15V3m0 0l-4 4m4-4l4 4M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2"],null)],null)],null),Mva=new R(null,3,5,S,[VH,new k(null,8,[uI,"13",qr,"13",zG,"0 0 24 24",HK,"none",kt,"currentColor",jG,"2",Np,"round",QD,"round"],null),new R(null,2,5,S,[wJ,new k(null,1,
|
|
2681
2681
|
[AM,"M12 3v12m0 0l-4-4m4 4l4-4M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2"],null)],null)],null),tEa=new R(null,4,5,S,[Hla,new k(null,7,[uI,"10",qr,"10",zG,"0 0 24 24",HK,"none",kt,"currentColor",jG,"3",Np,"round"],null),new R(null,2,5,S,[mK,new k(null,4,[Zu,"12",Yu,"12",$L,"9",YB,".25"],null)],null),new R(null,2,5,S,[wJ,new k(null,1,[AM,"M21 12a9 9 0 0 0-9-9"],null)],null)],null),m2=new R(null,4,5,S,[VH,new k(null,7,[uI,"11",qr,"11",zG,"0 0 24 24",HK,"none",kt,"currentColor",jG,"2.4",Np,"round"],null),
|
|
2682
2682
|
new R(null,2,5,S,[mK,new k(null,5,[Zu,"12",Yu,"12",$L,"2",HK,"currentColor",kt,"none"],null)],null),new R(null,2,5,S,[wJ,new k(null,1,[AM,"M16.24 7.76a6 6 0 0 1 0 8.49M7.76 16.24a6 6 0 0 1 0-8.49"],null)],null)],null),n2=new R(null,3,5,S,[VH,new k(null,8,[uI,"13",qr,"13",zG,"0 0 24 24",HK,"none",kt,"currentColor",jG,"2.4",Np,"round",QD,"round"],null),new R(null,2,5,S,[wJ,new k(null,1,[AM,"M6 15l6-6 6 6"],null)],null)],null),o2=new R(null,3,5,S,[VH,new k(null,8,[uI,"13",qr,"13",zG,"0 0 24 24",HK,"none",
|
|
2683
|
-
kt,"currentColor",jG,"2.4",Np,"round",QD,"round"],null),new R(null,2,5,S,[wJ,new k(null,1,[AM,"M6 9l6 6 6-6"],null)],null)],null),p2=wh.h(ug,function
|
|
2684
|
-
Z],null));ma+=1}else{aa=!0;break a}return aa?bg(dg(W),K(gd(Y))):bg(dg(W),null)}W=B(Y);return ye(new R(null,2,5,S,[W,Z],null),K(Vd(Y)))}return null}}}(r,t,u,w,y,C,D),null,null)}}(c,f,h,m,n,e,d)(n)))return gg.h(d,
|
|
2683
|
+
kt,"currentColor",jG,"2.4",Np,"round",QD,"round"],null),new R(null,2,5,S,[wJ,new k(null,1,[AM,"M6 9l6 6 6-6"],null)],null)],null),p2=wh.h(ug,function Dna(a){return new Wf(null,function(){for(var c=a;;){var d=A(c);if(d){var e=d,f=B(e),h=N(f),m=v(h,Pq),n=v(h,nH);if(d=A(function(r,t,u,w,y,C,D){return function K(G){return new Wf(null,function(O,P,T,Z){return function(){for(;;){var Y=A(G);if(Y){if(af(Y)){var aa=fd(Y),V=H(aa),W=$f(V);a:for(var ma=0;;)if(ma<V){var ia=Ob(aa,ma);W.add(new R(null,2,5,S,[ia,
|
|
2684
|
+
Z],null));ma+=1}else{aa=!0;break a}return aa?bg(dg(W),K(gd(Y))):bg(dg(W),null)}W=B(Y);return ye(new R(null,2,5,S,[W,Z],null),K(Vd(Y)))}return null}}}(r,t,u,w,y,C,D),null,null)}}(c,f,h,m,n,e,d)(n)))return gg.h(d,Dna(Vd(c)));c=Vd(c)}else return null}},null,null)}(new R(null,3,5,S,[new k(null,3,[Pq,Up,gF,"read",nH,new R(null,5,5,S,[ir,DF,ft,uN,vn],null)],null),new k(null,3,[Pq,AF,gF,"mutate",nH,new R(null,2,5,S,[Gs,FC],null)],null),new k(null,3,[Pq,PC,gF,"destroy",nH,new R(null,3,5,S,[xL,mG,Rv],null)],
|
|
2685
2685
|
null)],null))),q2=pj([DF,Rv,ir,Gs,vn,xL,mG,FC,ft,uN],[new Ie(null,"identity required — ",new Ie(null,new R(null,2,5,S,[xM,'xid \x3d "…"'],null),new Ie(null," (or another unique attr) at root, ",new Ie(null,new R(null,2,5,S,[xM,"\x3d"],null),new Ie(null," only",null,1,null),2,null),3,null),4,null),5,null),new Ie(null,new R(null,2,5,S,[xM,"xid"],null),new Ie(null," list, or one record by a unique key",new Ie(null," — for search-shape deletion, switch to ",new Ie(null,new R(null,2,5,S,[xM,"purge"],null),
|
|
2686
2686
|
null,1,null),2,null),3,null),4,null),new Ie(null,"filter via root parens ",new Ie(null,new R(null,2,5,S,[xM,"entity (…)"],null),new Ie(null,", project fields below — ",new Ie(null,new R(null,2,5,S,[xM,"_count"],null),new Ie(null," / ",new Ie(null,new R(null,2,5,S,[xM,"_agg"],null),new Ie(null," allowed",null,1,null),2,null),3,null),4,null),5,null),6,null),7,null),new Ie(null,new R(null,2,5,S,[xM,"upsert"],null),new Ie(null," — match by ",new Ie(null,new R(null,2,5,S,[xM,"xid"],null),new Ie(null," or unique attr; existing rows update, new ones insert",
|
|
2687
2687
|
null,1,null),2,null),3,null),4,null),new Ie(null,new R(null,2,5,S,[xM,"count"],null),new Ie(null," / ",new Ie(null,new R(null,2,5,S,[xM,"sum"],null),new Ie(null," / ",new Ie(null,new R(null,2,5,S,[xM,"min"],null),new Ie(null," / ",new Ie(null,new R(null,2,5,S,[xM,"max"],null),new Ie(null," / ",new Ie(null,new R(null,2,5,S,[xM,"avg"],null),new Ie(null," — uses ",new Ie(null,new R(null,2,5,S,[xM,"sql-template"],null),new Ie(null," for true entity-wide aggregation",null,1,null),2,null),3,null),4,null),
|
|
@@ -2743,8 +2743,8 @@ $va(new k(null,6,[eH,d,os,os.g(b),Oq,e,Zr,Zr.g(b),HN,f,zq,b],null))],null),ef(tz
|
|
|
2743
2743
|
function Z$(a){a=N(a);a=v(a,vw);var b=oA.g(q(XQ));return new R(null,8,5,S,[XJ,new k(null,1,[FH,pj([mH,DE,rw,uI,to,Sv,VG,Cz,RA,ks,qr],"center;isolate;hidden;100%;var(--modeling-canvas-vignette, none), var(--modeling-canvas-bg);center;22px;flex;relative;column;100%".split(";"))],null),k2(new k(null,1,[Py,!1],null)),l(a)?new R(null,3,5,S,[mB,new k(null,3,[Lu,new k(null,1,[Iu,a],null),nC,"Close",FH,pj([mH,RL,kG,SC,to,Ex,IA,Sv,iC,Cz,RA,ar,ED],"center;var(--modeling-overlay-shadow);var(--modeling-overlay-text);10px;var(--modeling-overlay-bg);pointer;6px;center;10px;flex;absolute;1px solid var(--modeling-overlay-border);6px".split(";"))],
|
|
2744
2744
|
null),X7(new k(null,2,[U,"x",QB,"18"],null))],null):null,new R(null,2,5,S,[xma,new k(null,1,[Js,'\x3csvg width\x3d"99" height\x3d"70" viewBox\x3d"0 0 99 70" fill\x3d"none" xmlns\x3d"http://www.w3.org/2000/svg"\x3e\n \x3cpath d\x3d"M0,69.7962646484375L14.36962890625,69.7962646484375C20.5177001953125,36.80072021484375,32.24310302734375,17.02093505859375,52.9482421875,0.876220703125C30.90264892578125,11.5047607421875,15.875,32.756988525390625,0,69.7962646484375Z" fill\x3d"var(--logo-secondary)" fill-opacity\x3d".4"/\x3e\n \x3cpath d\x3d"M21.54217529296875,69.79681396484375L36.0450439453125,69.79681396484375C32.64337158203125,43.39764404296875,36.0130615234375,27.43890380859375,49.25872802734375,3.773773193359375C31.744140625,25.1134033203125,25.71942138671875,41.449005126953125,21.54217529296875,69.79681396484375Z" fill\x3d"var(--logo-secondary)" fill-opacity\x3d".66"/\x3e\n \x3cpath d\x3d"M41.78265380859375,69.8131103515625L54.05462646484375,69.8131103515625C46.82916259765625,53.73529052734375,43.4232177734375,38.45916748046875,47.92523193359375,5.4915771484375C39.932373046875,28.653900146484375,37.7845458984375,42.29022216796875,41.78265380859375,69.8131103515625Z" fill\x3d"var(--logo-secondary)"/\x3e\n \x3cpath d\x3d"M75.34210205078125,70L60.3604736328125,70C49.4013671875,49.186553955078125,47.29559326171875,34.701751708984375,47.69744873046875,5.81005859375C50.51751708984375,37.29168701171875,55.4427490234375,52.662506103515625,75.34210205078125,70Z" fill\x3d"var(--logo-secondary)" fill-opacity\x3d".66"/\x3e\n \x3cpath d\x3d"M99,69.84271240234375L80.5986328125,69.84271240234375C58.93267822265625,47.84429931640625,54.936767578125,37.289825439453125,48.396240234375,8.708251953125C57.86480712890625,40.34039306640625,72.16845703125,54.63079833984375,99,69.84271240234375Z" fill\x3d"var(--logo-secondary)" fill-opacity\x3d".4"/\x3e\n \x3cpath d\x3d"M68.71710205078125,11.583251953125C68.71710205078125,5.18597412109375,63.57958984375,0,57.24212646484375,0C50.904541015625,0,45.76708984375,5.18597412109375,45.76708984375,11.583251953125C45.76708984375,17.98046875,50.904541015625,23.16644287109375,57.24212646484375,23.16644287109375C63.57958984375,23.16644287109375,68.71710205078125,17.98046875,68.71710205078125,11.583251953125Z" fill\x3d"var(--logo-primary)"/\x3e\n\x3c/svg\x3e\n'],
|
|
2745
2745
|
null)],null),new R(null,2,5,S,[Ega,new k(null,1,[Js,'\x3csvg width\x3d"247" xmlns\x3d"http://www.w3.org/2000/svg" height\x3d"64" id\x3d"screenshot-47747328-d189-80fe-8008-5b0619d1c872" viewBox\x3d"0 0 247 64" xmlns:xlink\x3d"http://www.w3.org/1999/xlink" fill\x3d"none" version\x3d"1.1"\x3e\x3cg id\x3d"shape-47747328-d189-80fe-8008-5b0619d1c872" rx\x3d"0" ry\x3d"0"\x3e\x3cg id\x3d"shape-47747328-d189-80fe-8008-5b0614b99019"\x3e\x3cg class\x3d"fills" id\x3d"fills-47747328-d189-80fe-8008-5b0614b99019"\x3e\x3cpath d\x3d"M215,15L220.90939331054688,15L228.20217895507812,34.25909423828125C228.62155151367188,35.395660400390625,228.998779296875,36.490203857421875,229.33404541015625,37.5426025390625C229.71131896972656,38.59490966796875,230.04652404785156,39.626556396484375,230.34011840820312,40.6365966796875C230.63323974609375,41.604827880859375,230.86370849609375,42.551971435546875,231.03155517578125,43.478424072265625L231.28311157226562,43.478424072265625C231.53460693359375,42.4256591796875,231.93246459960938,41.05780029296875,232.47760009765625,39.3739013671875C233.0222625732422,37.6478271484375,233.58795166015625,35.921875,234.1746826171875,34.1959228515625L241.02749633789062,15L247,15L232.47760009765625,53.518280029296875C231.68093872070312,55.622894287109375,230.7379608154297,57.4542236328125,229.648193359375,59.01177978515625C228.60047912597656,60.611572265625,227.30126953125,61.832000732421875,225.75051879882812,62.6739501953125C224.24139404296875,63.55816650390625,222.39749145507812,64,220.21795654296875,64C219.21231079101562,64,218.3319854736328,63.93707275390625,217.57740783691406,63.810760498046875C216.8233184814453,63.726715087890625,216.17349243164062,63.621063232421875,215.6283416748047,63.495208740234375L215.6283416748047,59.074676513671875C216.08978271484375,59.159210205078125,216.6344757080078,59.243255615234375,217.26324462890625,59.32733154296875C217.93368530273438,59.411865234375,218.6251220703125,59.45361328125,219.33758544921875,59.45361328125C220.63731384277344,59.45361328125,221.7476806640625,59.20098876953125,222.67005920410156,58.69622802734375C223.63406372070312,58.232757568359375,224.45130920410156,57.53826904296875,225.12171936035156,56.612274169921875C225.7926025390625,55.72808837890625,226.35830688476562,54.67578125,226.8192596435547,53.45489501953125L228.57943725585938,48.971893310546875L215,15Z" style\x3d"fill: var(--logo-primary);"/\x3e\x3c/g\x3e\x3c/g\x3e\x3cg id\x3d"shape-47747328-d189-80fe-8008-5b0614b9901a"\x3e\x3cg class\x3d"fills" id\x3d"fills-47747328-d189-80fe-8008-5b0614b9901a"\x3e\x3cpath d\x3d"M193.89463806152344,14C196.12649536132812,14,198.12635803222656,14.424102783203125,199.89511108398438,15.27227783203125C201.7052001953125,16.1204833984375,203.242431640625,17.413909912109375,204.50538635253906,19.1527099609375L204.8214569091797,19.1527099609375L205.57904052734375,14.63616943359375L210,14.63616943359375L210,49.30548095703125C210,52.52838134765625,209.4528350830078,55.22149658203125,208.35806274414062,57.384307861328125C207.26327514648438,59.589691162109375,205.6001739501953,61.243499755859375,203.36875915527344,62.34619140625C201.13693237304688,63.448883056640625,198.29498291015625,64,194.84243774414062,64C192.40013122558594,64,190.14767456054688,63.809356689453125,188.08436584472656,63.4276123046875C186.0634307861328,63.08843994140625,184.25283813476562,62.558135986328125,182.65267944335938,61.837188720703125L182.65267944335938,56.684661865234375C183.7474822998047,57.235748291015625,184.9474639892578,57.70220947265625,186.252685546875,58.083953857421875C187.557861328125,58.50830078125,188.9683074951172,58.826171875,190.48439025878906,59.038116455078125C192.00003051757812,59.250518798828125,193.55789184570312,59.356475830078125,195.15802001953125,59.356475830078125C198.0634307861328,59.356475830078125,200.3370819091797,58.48699951171875,201.97901916503906,56.748046875C203.66323852539062,55.051666259765625,204.50538635253906,52.719512939453125,204.50538635253906,49.750579833984375L204.50538635253906,48.414703369140625C204.50538635253906,47.906158447265625,204.52651977539062,47.18524169921875,204.5687713623047,46.251861572265625C204.61058044433594,45.27642822265625,204.65283203125,44.59808349609375,204.69512939453125,44.21630859375L204.44241333007812,44.21630859375C203.26356506347656,45.955291748046875,201.78973388671875,47.24859619140625,200.02098083496094,48.0968017578125C198.29498291015625,48.944976806640625,196.27401733398438,49.36883544921875,193.95806884765625,49.36883544921875C189.57888793945312,49.36883544921875,186.1474609375,47.821014404296875,183.66339111328125,44.725341796875C181.2211456298828,41.629638671875,179.99998474121094,37.303741455078125,179.99998474121094,31.7481689453125C179.99998474121094,28.100982666015625,180.5476531982422,24.962738037109375,181.64198303222656,22.3333740234375C182.7790069580078,19.661590576171875,184.3791961669922,17.604766845703125,186.4419403076172,16.162872314453125C188.50521850585938,14.72100830078125,190.98974609375,14,193.89463806152344,14ZM194.65267944335938,18.707366943359375C192.75804138183594,18.707366943359375,191.13677978515625,19.21630859375,189.78976440429688,20.234130859375C188.48406982421875,21.251953125,187.4738006591797,22.73626708984375,186.758056640625,24.687042236328125C186.0840606689453,26.63787841796875,185.747314453125,29.012786865234375,185.747314453125,31.811767578125C185.747314453125,36.01025390625,186.50537109375,39.233154296875,188.02096557617188,41.481109619140625C189.57888793945312,43.686492919921875,191.83189392089844,44.788726806640625,194.7790069580078,44.788726806640625C196.50552368164062,44.788726806640625,197.97891235351562,44.5767822265625,199.2000274658203,44.152923583984375C200.421142578125,43.686492919921875,201.431884765625,42.986358642578125,202.23171997070312,42.053497314453125C203.03158569335938,41.07806396484375,203.6214599609375,39.848114013671875,204.00001525878906,38.3641357421875C204.3790283203125,36.879638671875,204.5687713623047,35.11968994140625,204.5687713623047,33.08404541015625L204.5687713623047,31.7481689453125C204.5687713623047,28.652313232421875,204.21090698242188,26.150146484375,203.4951171875,24.24176025390625C202.8211669921875,22.3333740234375,201.74749755859375,20.933868408203125,200.273681640625,20.04327392578125C198.80032348632812,19.1527099609375,196.9263458251953,18.707366943359375,194.65267944335938,18.707366943359375Z" style\x3d"fill: var(--logo-primary);"/\x3e\x3c/g\x3e\x3c/g\x3e\x3cg id\x3d"shape-47747328-d189-80fe-8008-5b0614b9901b"\x3e\x3cg class\x3d"fills" id\x3d"fills-47747328-d189-80fe-8008-5b0614b9901b"\x3e\x3cpath d\x3d"M170.53390502929688,14.81817626953125L170.53390502929688,49L165.40760803222656,49L165.40760803222656,14.81817626953125L170.53390502929688,14.81817626953125ZM168.02923583984375,2C168.80592346191406,2,169.48516845703125,2.297637939453125,170.06776428222656,2.892852783203125C170.68939208984375,3.4455108642578125,171,4.3383026123046875,171,5.5712127685546875C171,6.761627197265625,170.68939208984375,7.6544189453125,170.06776428222656,8.2496337890625C169.48516845703125,8.8448486328125,168.80592346191406,9.142425537109375,168.02923583984375,9.142425537109375C167.17459106445312,9.142425537109375,166.45635986328125,8.8448486328125,165.87371826171875,8.2496337890625C165.2910919189453,7.6544189453125,165,6.761627197265625,165,5.5712127685546875C165,4.3383026123046875,165.2910919189453,3.4455108642578125,165.87371826171875,2.892852783203125C166.45635986328125,2.297637939453125,167.17459106445312,2,168.02923583984375,2Z" style\x3d"fill: var(--logo-primary);"/\x3e\x3c/g\x3e\x3c/g\x3e\x3cg id\x3d"shape-47747328-d189-80fe-8008-5b0614b9901c"\x3e\x3cg class\x3d"fills" id\x3d"fills-47747328-d189-80fe-8008-5b0614b9901c"\x3e\x3cpath d\x3d"M132.45138549804688,14.084136962890625C132.45138549804688,14.8841552734375,132.40994262695312,15.7052001953125,132.32745361328125,16.54730224609375C132.2864990234375,17.389434814453125,132.2242889404297,18.147308349609375,132.14183044433594,18.82098388671875L132.51358032226562,18.82098388671875C133.2156219482422,17.642059326171875,134.10330200195312,16.673614501953125,135.17709350585938,15.915771484375C136.25088500976562,15.157867431640625,137.4485626220703,14.58941650390625,138.7702178955078,14.21051025390625C140.0913543701172,13.7894287109375,141.45443725585938,13.578887939453125,142.85853576660156,13.578887939453125C145.54275512695312,13.578887939453125,147.77276611328125,14.021026611328125,149.54861450195312,14.90521240234375C151.36587524414062,15.747314453125,152.72848510742188,17.073638916015625,153.63693237304688,18.8841552734375C154.5457763671875,20.694671630859375,155,23.05255126953125,155,25.95782470703125L155,48L149.61077880859375,48L149.61077880859375,26.33673095703125C149.61077880859375,23.599945068359375,149.01193237304688,21.557830810546875,147.8142547607422,20.21044921875C146.6165313720703,18.86309814453125,144.73751831054688,18.189422607421875,142.17721557617188,18.189422607421875C139.6993408203125,18.189422607421875,137.75811767578125,18.67364501953125,136.3540802001953,19.642059326171875C134.94998168945312,20.568389892578125,133.9384002685547,21.95782470703125,133.3188018798828,23.8104248046875C132.7406768798828,25.6209716796875,132.45138549804688,27.8525390625,132.45138549804688,30.505157470703125L132.45138549804688,48L127.00000762939453,48L127.00000762939453,0L132.45138549804688,0L132.45138549804688,14.084136962890625Z" style\x3d"fill: var(--logo-primary);"/\x3e\x3c/g\x3e\x3c/g\x3e\x3cg id\x3d"shape-47747328-d189-80fe-8008-5b0614b9901d"\x3e\x3cg class\x3d"fills" id\x3d"fills-47747328-d189-80fe-8008-5b0614b9901d"\x3e\x3cpath d\x3d"M115.35627746582031,44.479888916015625C116.181884765625,44.479888916015625,117.0281982421875,44.4168701171875,117.89478302001953,44.291259765625C118.76181030273438,44.1241455078125,119.46356201171875,43.956512451171875,120,43.788909912109375L120,47.99530029296875C119.42213439941406,48.28851318359375,118.59652709960938,48.5186767578125,117.52365112304688,48.685791015625C116.45032501220703,48.895416259765625,115.41798400878906,49,114.42752075195312,49C112.69345092773438,49,111.08367919921875,48.706817626953125,109.59779357910156,48.12091064453125C108.15286254882812,47.49298095703125,106.97639465332031,46.425750732421875,106.06837463378906,44.919189453125C105.15988159179688,43.412628173828125,104.70588684082031,41.2987060546875,104.70588684082031,38.57830810546875L104.70588684082031,18.990997314453125L99.99998474121094,18.990997314453125L99.99998474121094,16.354217529296875L104.76803588867188,14.15692138671875L106.9349365234375,7L110.15495300292969,7L110.15495300292969,14.721923828125L119.75273132324219,14.721923828125L119.75273132324219,18.990997314453125L110.15495300292969,18.990997314453125L110.15495300292969,38.452728271484375C110.15495300292969,40.503631591796875,110.62965393066406,42.031219482421875,111.57913970947266,43.035888671875C112.57005310058594,43.99853515625,113.82893371582031,44.479888916015625,115.35627746582031,44.479888916015625Z" style\x3d"fill: var(--logo-primary);"/\x3e\x3c/g\x3e\x3c/g\x3e\x3cg id\x3d"shape-47747328-d189-80fe-8008-5b0614b9901e"\x3e\x3cg class\x3d"fills" id\x3d"fills-47747328-d189-80fe-8008-5b0614b9901e"\x3e\x3cpath d\x3d"M80.98223876953125,14C84.94670867919922,14,87.94100952148438,15.004302978515625,89.96468353271484,17.012847900390625C91.98838806152344,18.978607177734375,92.99998474121094,22.183746337890625,92.99998474121094,26.628173828125L92.99998474121094,49L87.6107177734375,49L87.6107177734375,27.012786865234375C87.6107177734375,24.235015869140625,87.0118637084961,22.162384033203125,85.81412506103516,20.79486083984375C84.61638641357422,19.427337646484375,82.73733520507812,18.743560791015625,80.17698669433594,18.743560791015625C76.50137329101562,18.743560791015625,73.96174621582031,19.81195068359375,72.55717468261719,21.948699951171875C71.153076171875,24.085479736328125,70.45101928710938,27.162384033203125,70.45101928710938,31.179443359375L70.45101928710938,49L65.00001525878906,49L65.00001525878906,14.64105224609375L69.39793395996094,14.64105224609375L70.20320129394531,19.32049560546875L70.51321411132812,19.32049560546875C71.25628662109375,18.1239013671875,72.1651611328125,17.141021728515625,73.23895263671875,16.37176513671875C74.353759765625,15.559844970703125,75.57220458984375,14.9615478515625,76.89384460449219,14.57696533203125C78.21502685546875,14.19232177734375,79.578125,14,80.98223876953125,14Z" style\x3d"fill: var(--logo-primary);"/\x3e\x3c/g\x3e\x3c/g\x3e\x3cg id\x3d"shape-47747328-d189-80fe-8008-5b0614b9901f"\x3e\x3cg class\x3d"fills" id\x3d"fills-47747328-d189-80fe-8008-5b0614b9901f"\x3e\x3cpath d\x3d"M28,15L33.909393310546875,15L41.202606201171875,34.25909423828125C41.62152099609375,35.395660400390625,41.99879455566406,36.490203857421875,42.33403015136719,37.5426025390625C42.7113037109375,38.59490966796875,43.0465087890625,39.626556396484375,43.340087890625,40.6365966796875C43.63323974609375,41.604827880859375,43.86372375488281,42.551971435546875,44.03153991699219,43.478424072265625L44.28309631347656,43.478424072265625C44.53462219238281,42.4256591796875,44.932464599609375,41.05780029296875,45.47758483886719,39.3739013671875C46.022216796875,37.6478271484375,46.58839416503906,35.921875,47.17512512207031,34.1959228515625L54.02751159667969,15L60,15L45.47758483886719,53.518280029296875C44.680938720703125,55.622894287109375,43.737945556640625,57.4542236328125,42.648193359375,59.01177978515625C41.600494384765625,60.611572265625,40.30125427246094,61.832000732421875,38.75048828125,62.6739501953125C37.2418212890625,63.55816650390625,35.39747619628906,64,33.217926025390625,64C32.212310791015625,64,31.33197021484375,63.93707275390625,30.577423095703125,63.810760498046875C29.82330322265625,63.726715087890625,29.1734619140625,63.621063232421875,28.628814697265625,63.495208740234375L28.628814697265625,59.074676513671875C29.08978271484375,59.159210205078125,29.634445190429688,59.243255615234375,30.26324462890625,59.32733154296875C30.93365478515625,59.411865234375,31.625579833984375,59.45361328125,32.33805847167969,59.45361328125C33.637298583984375,59.45361328125,34.747650146484375,59.20098876953125,35.670074462890625,58.69622802734375C36.634063720703125,58.232757568359375,37.4512939453125,57.53826904296875,38.1217041015625,56.612274169921875C38.7926025390625,55.72808837890625,39.3582763671875,54.67578125,39.819244384765625,53.45489501953125L41.57942199707031,48.971893310546875L28,15Z" style\x3d"fill: var(--logo-primary);"/\x3e\x3c/g\x3e\x3c/g\x3e\x3cg id\x3d"shape-47747328-d189-80fe-8008-5b0614b99020"\x3e\x3cg class\x3d"fills" id\x3d"fills-47747328-d189-80fe-8008-5b0614b99020"\x3e\x3cpath d\x3d"M24,39.05426025390625C24,41.236175537109375,23.456680297851562,43.061859130859375,22.370437622070312,44.53082275390625C21.284713745117188,45.999786376953125,19.739028930664062,47.111602783203125,17.73345947265625,47.867156982421875C15.728317260742188,48.622711181640625,13.347152709960938,49,10.589935302734375,49C8.250686645507812,49,6.2245941162109375,48.81134033203125,4.51165771484375,48.433563232421875C2.84063720703125,48.0557861328125,1.357879638671875,47.531494140625,0.0624542236328125,46.8597412109375L0.0624542236328125,41.82415771484375C1.399322509765625,42.49542236328125,3.0079345703125,43.12506103515625,4.8877105712890625,43.712554931640625C6.8094024658203125,44.2579345703125,8.7520751953125,44.53082275390625,10.71527099609375,44.53082275390625C13.514450073242188,44.53082275390625,15.540542602539062,44.09033203125,16.793548583984375,43.2088623046875C18.04705810546875,42.285736083984375,18.67333984375,41.068572998046875,18.67333984375,39.5574951171875C18.67333984375,38.7186279296875,18.443603515625,37.962982177734375,17.984161376953125,37.29156494140625C17.524688720703125,36.62005615234375,16.689178466796875,35.9486083984375,15.477645874023438,35.277130126953125C14.308029174804688,34.60565185546875,12.61602783203125,33.8502197265625,10.402130126953125,33.01092529296875C8.229751586914062,32.171600341796875,6.3709259033203125,31.332244873046875,4.8252410888671875,30.492889404296875C3.27960205078125,29.65362548828125,2.088531494140625,28.646392822265625,1.2530364990234375,27.4713134765625C0.4175262451171875,26.296234130859375,0.0000152587890625,24.78546142578125,0.0000152587890625,22.93890380859375C0.0000152587890625,20.085174560546875,1.1486663818359375,17.88189697265625,3.4464111328125,16.329132080078125C5.7856597900390625,14.7763671875,8.83551025390625,14,12.595062255859375,14C14.642135620117188,14,16.542877197265625,14.2098388671875,18.297760009765625,14.6295166015625C20.094131469726562,15.0072021484375,21.765151977539062,15.552764892578125,23.310806274414062,16.2662353515625L21.430557250976562,20.6727294921875C20.511642456054688,20.2530517578125,19.52984619140625,19.896331787109375,18.485565185546875,19.6025390625C17.482757568359375,19.266845703125,16.459442138671875,19.015045166015625,15.415206909179688,18.84716796875C14.370925903320312,18.6373291015625,13.305191040039062,18.53240966796875,12.219467163085938,18.53240966796875C9.963165283203125,18.53240966796875,8.229751586914062,18.91009521484375,7.0181732177734375,19.665496826171875C5.8485565185546875,20.378936767578125,5.2637481689453125,21.36517333984375,5.2637481689453125,22.624176025390625C5.2637481689453125,23.54742431640625,5.5354156494140625,24.344818115234375,6.0782928466796875,25.0162353515625C6.6211395263671875,25.645751953125,7.5195770263671875,26.2752685546875,8.772598266601562,26.90478515625C10.06805419921875,27.492279052734375,11.780517578125,28.20574951171875,13.910995483398438,29.0450439453125C16.041458129882812,29.842437744140625,17.85882568359375,30.6607666015625,19.363006591796875,31.5001220703125C20.866714477539062,32.3394775390625,22.015365600585938,33.367645263671875,22.809432983398438,34.584686279296875C23.602981567382812,35.759735107421875,24,37.249542236328125,24,39.05426025390625Z" style\x3d"fill: var(--logo-primary);"/\x3e\x3c/g\x3e\x3c/g\x3e\x3c/g\x3e\x3c/svg\x3e'],
|
|
2746
|
-
null)],null),new R(null,3,5,S,[fM,new k(null,1,[FH,new k(null,6,[lA,"10px",XG,"600",Iq,".22em",Kma,"uppercase",kG,"var(--sy-text-m)",Oz,"0"],null)],null),"sign in to access the data universe"],null),new R(null,3,5,S,[mB,new k(null,2,[Lu,new k(null,1,[Iu,function(){SDa(b);return NDa()}],null),FH,pj([kG,lA,XG,to,Ex,IA,Iq,ar,ED],"var(--modeling-button-text);14px;600;var(--sy-accent);pointer;10px 36px;.04em;1px solid var(--sy-accent-border);8px".split(";"))],null),"Sign In"],null)],null)};var Z1=new CSSStyleSheet;Z1.replaceSync("/* Synthigy design tokens — the single definition of every --sy-* custom\n property, in both themes.\n\n Adopted by EVERY component's shadow root, not just the modeler's. These\n used to live in erd.css alone, which meant they only existed inside\n \x3csynthigy-data-modeling\x3e; a console or cockpit mounted on its own inherited\n nothing. Most of the chrome survived that on inline var() fallbacks, but\n the CodeMirror HighlightStyle (data/console/editor.cljs) writes\n var(--sy-syntax-*) with NO fallback — an undefined custom property there is\n an invalid color, so the XSQL buffer rendered in one flat colour. */\n\n:root,\n:host {\n color-scheme: light;\n\n /* Brand logo tokens (two-tone: circle\x3dprimary, wings/text\x3dsecondary).\n The mark/wordmark SVGs fill with var(--logo-*); console + cockpit\n inherit these from here, same as --sy-* below. Dark values in the\n dark-mode block further down. */\n --logo-primary: #000000; /* black hole + wordmark: fully black */\n --logo-secondary: #a8a8a8; /* trails: the per-wing fade in the SVG supplies the subtlety */\n\n /* ---------------------------------------------------------------------------\n Text intensity scale (single source of truth for all text colors)\n --------------------------------------------------------------------------- */\n --sy-text-pp: #000000;\n --sy-text-p: #1f2937;\n --sy-text: #374151;\n --sy-text-m: #6b7280;\n --sy-text-mm: #9ca3af;\n\n /* ---------------------------------------------------------------------------\n UI surface tokens — used by data-console, drawers, modals, popovers.\n Distinct from --modeling-* (which are diagram-specific).\n\n Surface scale (light): off-white base, white panels, faint banded headers.\n --------------------------------------------------------------------------- */\n --sy-bg-app: #f4f5f7;\n --sy-bg-panel: #ffffff;\n --sy-bg-surface: #ffffff;\n --sy-bg-band: #f0f1f4;\n\n --sy-border: rgba(0, 0, 0, 0.1);\n --sy-border-subtle: rgba(0, 0, 0, 0.06);\n\n --sy-text-primary: #1f2937;\n --sy-text-secondary: #4b5563;\n --sy-text-muted: #6b7280;\n --sy-text-faint: #9ca3af;\n --sy-text-on-accent: #ffffff;\n\n --sy-accent: #1f2937;\n --sy-accent-hover: #000000;\n --sy-accent-tint: rgba(0, 0, 0, 0.07);\n\n --sy-selection-bg: rgba(31, 41, 55, 0.18);\n --sy-selection-text: #111827;\n\n --sy-hover-overlay: rgba(0, 0, 0, 0.04);\n\n /* Semantic op colors — monochrome intensity steps (write \x3d darkest \x3d\n mutation); destroy keeps red (danger carries meaning). */\n --sy-op-write: #111827;\n --sy-op-write-muted: #6b7280;\n --sy-op-write-tint: rgba(0, 0, 0, 0.08);\n --sy-op-sql: #6b7280;\n --sy-op-sql-muted: #9ca3af;\n --sy-op-sql-tint: rgba(0, 0, 0, 0.05);\n --sy-op-read: #374151;\n --sy-op-read-muted: #9ca3af;\n --sy-op-read-tint: rgba(0, 0, 0, 0.06);\n --sy-op-destroy: #d34c5e;\n --sy-op-destroy-muted: #bd7078;\n --sy-op-destroy-tint: rgba(211, 76, 94, 0.1);\n\n /* Buffer op chips — the one place ops are colored, not monochrome. */\n --sy-chip-read: #2563eb;\n --sy-chip-write: #c2410c;\n --sy-chip-destroy: #d34c5e;\n\n /* Recursive / tree pill */\n --sy-recur: #4b5563;\n --sy-recur-strong: #1f2937;\n --sy-recur-tint: rgba(0, 0, 0, 0.06);\n --sy-recur-border: rgba(0, 0, 0, 0.3);\n\n --sy-error: #c8443a;\n --sy-error-tint: rgba(200, 68, 58, 0.12);\n\n /* Status + misc semantic tokens — hoisted from console/cockpit inline\n fallbacks so the WHOLE palette is single-sourced here. danger is a\n synonym of error (aliased, resolves per-theme automatically). */\n --sy-danger: var(--sy-error);\n --sy-danger-tint: var(--sy-error-tint);\n --sy-danger-tint-strong: rgba(200, 68, 58, 0.2);\n --sy-warn: #b7791f;\n --sy-warn-tint: rgba(183, 121, 31, 0.12);\n --sy-success: #4f8b3a;\n --sy-info: #6b7280;\n --sy-key: #2e7de9;\n --sy-border-strong: rgba(0, 0, 0, 0.18);\n --sy-accent-border: rgba(0, 0, 0, 0.35);\n --sy-active-overlay: rgba(0, 0, 0, 0.08);\n\n /* Syntax (light) — black/gray/green/red: black \x3d keys (the substance),\n red \x3d relations (the edges), green \x3d control + directives,\n gray \x3d data values. Mirrors the dark block's white/gray/yellow/red. */\n --sy-syntax-key: #111827; /* attributes / property names / JSON keys */\n --sy-syntax-relation: #b3452f; /* relation types — red */\n --sy-syntax-keyword: #4f8b3a; /* control words — green */\n --sy-syntax-directive: #3e6e2e; /* @-directives — deep green */\n --sy-syntax-doc: #9ca3af; /* @description prose text */\n --sy-syntax-string: #6b7280;\n --sy-syntax-number: #6b7280;\n --sy-syntax-literal: #6f9861; /* bool / null / operators — muted green */\n --sy-syntax-punct: #9ca3af;\n --sy-result-value: #b3452f; /* result-panel values — brick red on light */\n\n /* ---------------------------------------------------------------------------\n Starfield \x26 Canvas\n --------------------------------------------------------------------------- */\n --modeling-star-rgb: 0, 0, 0;\n --modeling-stars-dim: 1; /* star alphas are light-tuned; dark dims the layer */\n --modeling-nebula-opacity: 0.35; /* faint haze — big gray gas on white reads as stains; clusters carry the shape */\n --modeling-hole-opacity: 0.3; /* light mode: a distant shadow, not a void — full black is threatening on white */\n --modeling-grid-color: rgba(0, 0, 0, 0.13); /* light-only — dark keeps the starfield instead of a grid */\n --modeling-grid-color-major: rgba(0, 0, 0, 0.08);\n --modeling-canvas-vignette: radial-gradient(\n 120% 90% at 50% 40%,\n rgba(0, 0, 0, 0) 55%,\n rgba(0, 0, 0, 0.045) 100%\n );\n --modeling-canvas-bg: #fcfcfc;\n\n /* Theme-INVARIANT \"always dark space\" backdrop — same value in both\n theme blocks (declared once here, not overridden in dark). Lets the\n canvas backdrop stay dark space regardless of light/dark UI theme\n without recoloring entities/panels. surface.cljs opts in via\n `always-dark-space?`; ui/grid.cljs stays as the light-theme fallback\n if that look gets reverted. */\n --modeling-space-bg: #0f0f10;\n --modeling-space-vignette: radial-gradient(\n 120% 90% at 50% 40%,\n rgba(255, 255, 255, 0.035),\n rgba(255, 255, 255, 0) 60%\n );\n --modeling-space-star-rgb: 255, 255, 255;\n --modeling-space-stars-dim: 0.72;\n --modeling-space-nebula-opacity: 0.76;\n --modeling-space-hole-opacity: 1;\n\n /* ---------------------------------------------------------------------------\n Entity Box\n --------------------------------------------------------------------------- */\n --modeling-entity-fill: #fcfcfc; /* was var(--modeling-canvas-bg) — decoupled so the\n canvas backdrop can go always-dark without recoloring entity boxes */\n --modeling-entity-stroke: #b4b4b4;\n --modeling-entity-header-fill: #fcfcfc;\n --modeling-entity-text: var(--sy-text-p);\n --modeling-entity-shadow: rgba(0, 0, 0, 0.08);\n\n /* Entity States — monochrome */\n --modeling-entity-selected-stroke: #111827;\n --modeling-entity-selected-header: #f3f4f6; /* soft — full gray band was too strong on light */\n --modeling-entity-hover-stroke: #9ca3af;\n\n /* ---------------------------------------------------------------------------\n Projection States (diff highlighting) — semantic hues preserved,\n chroma reduced ~15% so they don't burn on white.\n --------------------------------------------------------------------------- */\n /* Added state — light twin of the dark sage palette (#162421/#799386/#2d3c36) */\n --modeling-added-fill: #eef4f0;\n --modeling-added-stroke: #799386;\n --modeling-added-header: #dbe7e0;\n --modeling-added-text: #44604f;\n\n /* Removed/modified — muted twins of the sage added-set (same formula) */\n --modeling-removed-fill: #f4eeee;\n --modeling-removed-stroke: #937979;\n --modeling-removed-header: #e7dbdb;\n --modeling-removed-text: #604444;\n\n /* Configuration rot (broken rule references) — needs more contrast than\n the diff palette: it flags a SECURITY hazard, not a diff state. */\n --modeling-rot-text: #b3261e;\n --modeling-rot-border: #e4a9a5;\n --modeling-rot-fill: #fdf6f5;\n\n --modeling-modified-fill: #f4f1ee;\n --modeling-modified-stroke: #938879;\n --modeling-modified-header: #e7e1db;\n --modeling-modified-text: #605444;\n\n /* ---------------------------------------------------------------------------\n Relations (edges/connections)\n --------------------------------------------------------------------------- */\n --modeling-relation-stroke: var(--sy-text-mm);\n --modeling-relation-stroke-hover: var(--sy-text-m);\n --modeling-relation-stroke-selected: var(--sy-text);\n --modeling-relation-label-bg: #ffffff;\n --modeling-relation-label-text: var(--sy-text-m);\n\n /* ---------------------------------------------------------------------------\n Selection \x26 Handles — monochrome\n --------------------------------------------------------------------------- */\n --modeling-handle-fill: #111827;\n --modeling-handle-stroke: #ffffff;\n --modeling-selection-box: rgba(0, 0, 0, 0.06);\n --modeling-selection-border: #111827;\n\n /* ---------------------------------------------------------------------------\n Toolbar \x26 Overlay\n --------------------------------------------------------------------------- */\n --modeling-overlay-bg: rgba(255, 255, 255, 1);\n --modeling-overlay-bg-hover: rgba(0, 0, 0, 0.03);\n --modeling-overlay-border: rgba(0, 0, 0, 0.1);\n --modeling-overlay-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n --modeling-overlay-text: var(--sy-text);\n --modeling-overlay-text-muted: var(--sy-text-m);\n\n /* ---------------------------------------------------------------------------\n Shadows (elevation scale)\n --------------------------------------------------------------------------- */\n --modeling-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.08);\n --modeling-shadow-md: 0 1px 3px rgba(0, 0, 0, 0.08);\n --modeling-shadow-lg: 0 4px 16px rgba(0, 0, 0, 0.15);\n --modeling-shadow-xl: 0 4px 24px rgba(0, 0, 0, 0.08);\n --modeling-shadow-2xl: 0 8px 32px rgba(0, 0, 0, 0.15);\n --modeling-shadow-popover: 0 4px 20px rgba(0, 0, 0, 0.12);\n --modeling-shadow-modal: 0 16px 48px rgba(0, 0, 0, 0.2);\n\n /* ---------------------------------------------------------------------------\n Semantic surfaces (button text, modal backdrop, hover overlays, focus ring)\n --------------------------------------------------------------------------- */\n --modeling-button-text: #ffffff;\n --modeling-modal-backdrop: rgba(0, 0, 0, 0.4);\n --modeling-hover-overlay: rgba(0, 0, 0, 0.05);\n --modeling-hover-overlay-strong: rgba(0, 0, 0, 0.06);\n --modeling-press-overlay: rgba(0, 0, 0, 0.08);\n --modeling-press-overlay-strong: rgba(0, 0, 0, 0.12);\n\n /* Tinted variants — derived from text hues so banners/chips match */\n --modeling-entity-selected-tint: rgba(0, 0, 0, 0.06);\n --modeling-entity-selected-tint-strong: rgba(0, 0, 0, 0.12);\n --modeling-entity-selected-stroke-hover: #000000;\n --modeling-added-tint: rgba(6, 95, 70, 0.08);\n --modeling-removed-tint: rgba(200, 59, 59, 0.06);\n --modeling-removed-tint-strong: rgba(200, 59, 59, 0.12);\n --modeling-removed-stroke-hover: #a82d2d;\n\n /* Destructive-action buttons (delete confirm) — a solid, saturated red\n regardless of theme. Deliberately NOT the removed-stroke-hover/\n button-text tokens above: those are tuned for diff tints and an\n accent-matched label, and reusing them here washed the button out\n in dark mode (a pale tint used as a fill, dark text on top of it). */\n --modeling-danger-bg: #a82d2d;\n --modeling-danger-bg-hover: #8f2521;\n --modeling-danger-text: #ffffff;\n}\n\nhtml.dark,\nhtml[data-theme\x3d\"dark\"],\n:host([data-theme\x3d\"dark\"]) {\n color-scheme: dark;\n\n /* Brand logo tokens — dark theme */\n --logo-primary: #ffffff; /* black hole + wordmark: fully white on dark */\n --logo-secondary: #5b5b5b; /* trails: subtle on dark */\n\n /* Text intensity scale */\n --sy-text-pp: #ffffff;\n --sy-text-p: #f0f0f0;\n --sy-text: #d6d6d6;\n --sy-text-m: #7f8590;\n --sy-text-mm: #555a63;\n\n /* UI surface tokens (dark) — exact data-console palette */\n --sy-bg-app: #161616;\n --sy-bg-panel: #1a1a1a;\n --sy-bg-surface: #1e1e1e;\n --sy-bg-band: #181818;\n\n --sy-border: #2a2a2a;\n --sy-border-subtle: #222;\n\n --sy-text-primary: #d4d4d4;\n --sy-text-secondary: #999;\n --sy-text-muted: #666;\n --sy-text-faint: #4a4a4a;\n --sy-text-on-accent: #1a1a1a;\n\n --sy-accent: #e2e2e2;\n --sy-accent-hover: #ffffff;\n --sy-accent-tint: rgba(255, 255, 255, 0.1);\n\n --sy-selection-bg: rgba(255, 255, 255, 0.24);\n --sy-selection-text: #ffffff;\n\n --sy-hover-overlay: rgba(255, 255, 255, 0.05);\n\n --sy-op-write: #f0f0f0;\n --sy-op-write-muted: #9a9a9a;\n --sy-op-write-tint: rgba(255, 255, 255, 0.12);\n --sy-op-sql: #a8adb5;\n --sy-op-sql-muted: #6e737b;\n --sy-op-sql-tint: rgba(255, 255, 255, 0.08);\n --sy-op-read: #c6cad1;\n --sy-op-read-muted: #8a8f98;\n --sy-op-read-tint: rgba(255, 255, 255, 0.1);\n --sy-op-destroy: #c66d7a;\n --sy-op-destroy-muted: #9c5762;\n --sy-op-destroy-tint: rgba(198, 109, 122, 0.14);\n\n --sy-chip-read: #7aa2f7;\n --sy-chip-write: #e0a458;\n --sy-chip-destroy: #f7768e;\n\n --sy-recur: #c6cad1;\n --sy-recur-strong: #e2e2e2;\n --sy-recur-tint: rgba(255, 255, 255, 0.12);\n --sy-recur-border: rgba(255, 255, 255, 0.4);\n\n --sy-error: #f7768e;\n --sy-error-tint: rgba(247, 118, 142, 0.15);\n\n /* Status + misc semantic tokens — dark. (danger aliases error in the base\n block; resolves to the dark error value here automatically.) */\n --sy-danger-tint-strong: rgba(247, 118, 142, 0.22);\n --sy-warn: #e0af68;\n --sy-warn-tint: rgba(224, 175, 104, 0.14);\n --sy-success: #9ece6a;\n --sy-info: #9aa0a8;\n --sy-key: #7aa2f7;\n --sy-border-strong: #3a3a3a;\n --sy-accent-border: rgba(255, 255, 255, 0.35);\n --sy-active-overlay: rgba(255, 255, 255, 0.1);\n\n /* Syntax (dark) — white/gray/yellow/red: white \x3d keys (the substance),\n red \x3d relations (the edges), amber/gold \x3d control + directives,\n gray \x3d data values. Light mode stays pure monochrome. */\n --sy-syntax-key: #eaeaea; /* attributes / property names / JSON keys */\n --sy-syntax-relation: #e08e98; /* relation types — soft red */\n --sy-syntax-keyword: #e0af68; /* control words — amber */\n --sy-syntax-directive: #d4a017; /* @-directives — deep gold */\n --sy-syntax-doc: #868686; /* @description prose text */\n --sy-syntax-string: #c0c5cc;\n --sy-syntax-number: #c0c5cc;\n --sy-syntax-literal: #c39a5e; /* bool / null / operators — muted amber */\n --sy-syntax-punct: #5c6068;\n --sy-result-value: #e0af68; /* result-panel values — amber on dark */\n\n /* Starfield \x26 Canvas */\n --modeling-star-rgb: 255, 255, 255;\n --modeling-stars-dim: 0.72; /* compensates the light-tuned alphas — dark look unchanged */\n --modeling-nebula-opacity: 0.76; /* × stars-dim ≈ the approved .55 */\n --modeling-hole-opacity: 1;\n --modeling-canvas-vignette: radial-gradient(\n 120% 90% at 50% 40%,\n rgba(255, 255, 255, 0.035),\n rgba(255, 255, 255, 0) 60%\n );\n --modeling-canvas-bg: #0f0f10;\n\n /* Entity Box */\n --modeling-entity-fill: #0f0f10; /* was var(--modeling-canvas-bg) — decoupled, see light block */\n --modeling-entity-stroke: #3b3b3b;\n --modeling-entity-header-fill: #0f0f10;\n --modeling-entity-text: var(--sy-text-p);\n --modeling-entity-shadow: rgba(0, 0, 0, 0.3);\n\n /* Entity States — monochrome */\n --modeling-entity-selected-stroke: #555555;\n --modeling-entity-selected-header: #1d1d1d;\n --modeling-entity-hover-stroke: #b0b0b5;\n\n /* Projection States — muted greens/reds/ambers, ~30% chroma reduction */\n --modeling-added-fill: #162421;\n --modeling-added-stroke: #799386;\n --modeling-added-header: #2d3c36;\n --modeling-added-text: #9bc7af;\n\n --modeling-removed-fill: #241616;\n --modeling-removed-stroke: #937979;\n --modeling-removed-header: #3c2d2d;\n --modeling-removed-text: #c79b9b;\n\n --modeling-rot-text: #f2837b;\n --modeling-rot-border: #7a3d38;\n --modeling-rot-fill: #2e1c1a;\n\n --modeling-modified-fill: #241f16;\n --modeling-modified-stroke: #938879;\n --modeling-modified-header: #3c362d;\n --modeling-modified-text: #c7b89b;\n\n /* Relations */\n --modeling-relation-stroke: var(--modeling-entity-stroke);\n --modeling-relation-stroke-hover: var(--sy-text-m);\n --modeling-relation-stroke-selected: var(--sy-text);\n --modeling-relation-label-bg: var(--modeling-canvas-bg);\n --modeling-relation-label-text: var(--sy-text-m);\n --modeling-relation-label-text-selected: var(--sy-text);\n\n /* Selection \x26 Handles — monochrome */\n --modeling-handle-fill: #e2e2e2;\n --modeling-handle-stroke: #0f0f10;\n --modeling-selection-box: rgba(255, 255, 255, 0.08);\n --modeling-selection-border: #e2e2e2;\n\n /* Toolbar \x26 Overlay */\n --modeling-overlay-bg: rgba(45, 45, 45, 1);\n --modeling-overlay-bg-hover: rgba(255, 255, 255, 0.06);\n --modeling-overlay-border: rgba(255, 255, 255, 0.12);\n --modeling-overlay-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\n --modeling-overlay-text: var(--sy-text);\n --modeling-overlay-text-muted: var(--sy-text-m);\n\n /* Shadows */\n --modeling-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);\n --modeling-shadow-md: 0 1px 3px rgba(0, 0, 0, 0.3);\n --modeling-shadow-lg: 0 4px 16px rgba(0, 0, 0, 0.4);\n --modeling-shadow-xl: 0 4px 24px rgba(0, 0, 0, 0.4);\n --modeling-shadow-2xl: 0 8px 32px rgba(0, 0, 0, 0.4);\n --modeling-shadow-popover: 0 4px 20px rgba(0, 0, 0, 0.4);\n --modeling-shadow-modal: 0 16px 48px rgba(0, 0, 0, 0.5);\n\n /* Semantic surfaces */\n --modeling-button-text: #1a1a1a; /* accent is near-WHITE in dark — white text vanished */\n --modeling-modal-backdrop: rgba(0, 0, 0, 0.6);\n --modeling-hover-overlay: rgba(255, 255, 255, 0.08);\n --modeling-hover-overlay-strong: rgba(255, 255, 255, 0.1);\n --modeling-press-overlay: rgba(255, 255, 255, 0.12);\n --modeling-press-overlay-strong: rgba(255, 255, 255, 0.15);\n\n /* Tinted variants — match monochrome palette above */\n --modeling-entity-selected-tint: rgba(255, 255, 255, 0.1);\n --modeling-entity-selected-tint-strong: rgba(255, 255, 255, 0.18);\n --modeling-entity-selected-stroke-hover: #ffffff;\n --modeling-added-tint: rgba(95, 160, 127, 0.12);\n --modeling-removed-tint: rgba(201, 128, 128, 0.12);\n --modeling-removed-tint-strong: rgba(201, 128, 128, 0.18);\n --modeling-removed-stroke-hover: #d4a8a8;\n\n /* Destructive-action buttons — solid red, not the pale removed-stroke-hover\n tint above (that's sized for on-dark diff chips, not a button fill), and\n a fixed white label rather than --modeling-button-text (which flips dark\n for the near-white accent buttons and would sit unreadable on red).\n Hover lightens, matching this theme's hover convention elsewhere. */\n --modeling-danger-bg: #a8433c;\n --modeling-danger-bg-hover: #c25850;\n --modeling-danger-text: #ffffff;\n}\n\n::selection {\n background: var(--sy-selection-bg);\n color: var(--sy-selection-text);\n}\n");function xDa(){try{var a=localStorage.getItem("synthigy-modeling-theme");return l(a)?a:"light"}catch(b){return"light"}}function HDa(a){try{localStorage.setItem("synthigy-modeling-theme",a)}catch(b){}}function LDa(a,b){return l(a)?z.h(b,"dark")?a.setAttribute("data-theme","dark"):a.removeAttribute("data-theme"):null}
|
|
2747
|
-
function lEa(a){if(l(a)){var b=new MutationObserver(function(){var c=xDa();return yg(c,l(a.hasAttribute("data-theme"))?"dark":"light")?LDa(a,c):null});b.observe(a,{attributes:!0,attributeFilter:["data-theme"]});return b}return null}function MDa(a,b){z2(a,
|
|
2746
|
+
null)],null),new R(null,3,5,S,[fM,new k(null,1,[FH,new k(null,6,[lA,"10px",XG,"600",Iq,".22em",Kma,"uppercase",kG,"var(--sy-text-m)",Oz,"0"],null)],null),"sign in to access the data universe"],null),new R(null,3,5,S,[mB,new k(null,2,[Lu,new k(null,1,[Iu,function(){SDa(b);return NDa()}],null),FH,pj([kG,lA,XG,to,Ex,IA,Iq,ar,ED],"var(--modeling-button-text);14px;600;var(--sy-accent);pointer;10px 36px;.04em;1px solid var(--sy-accent-border);8px".split(";"))],null),"Sign In"],null)],null)};var b2=new CSSStyleSheet;b2.replaceSync("/* Synthigy design tokens — the single definition of every --sy-* custom\n property, in both themes.\n\n Adopted by EVERY component's shadow root, not just the modeler's. These\n used to live in erd.css alone, which meant they only existed inside\n \x3csynthigy-data-modeling\x3e; a console or cockpit mounted on its own inherited\n nothing. Most of the chrome survived that on inline var() fallbacks, but\n the CodeMirror HighlightStyle (data/console/editor.cljs) writes\n var(--sy-syntax-*) with NO fallback — an undefined custom property there is\n an invalid color, so the XSQL buffer rendered in one flat colour. */\n\n:root,\n:host {\n color-scheme: light;\n\n /* Brand logo tokens (two-tone: circle\x3dprimary, wings/text\x3dsecondary).\n The mark/wordmark SVGs fill with var(--logo-*); console + cockpit\n inherit these from here, same as --sy-* below. Dark values in the\n dark-mode block further down. */\n --logo-primary: #000000; /* black hole + wordmark: fully black */\n --logo-secondary: #a8a8a8; /* trails: the per-wing fade in the SVG supplies the subtlety */\n\n /* ---------------------------------------------------------------------------\n Text intensity scale (single source of truth for all text colors)\n --------------------------------------------------------------------------- */\n --sy-text-pp: #000000;\n --sy-text-p: #1f2937;\n --sy-text: #374151;\n --sy-text-m: #6b7280;\n --sy-text-mm: #9ca3af;\n\n /* ---------------------------------------------------------------------------\n UI surface tokens — used by data-console, drawers, modals, popovers.\n Distinct from --modeling-* (which are diagram-specific).\n\n Surface scale (light): off-white base, white panels, faint banded headers.\n --------------------------------------------------------------------------- */\n --sy-bg-app: #f4f5f7;\n --sy-bg-panel: #ffffff;\n --sy-bg-surface: #ffffff;\n --sy-bg-band: #f0f1f4;\n\n --sy-border: rgba(0, 0, 0, 0.1);\n --sy-border-subtle: rgba(0, 0, 0, 0.06);\n\n --sy-text-primary: #1f2937;\n --sy-text-secondary: #4b5563;\n --sy-text-muted: #6b7280;\n --sy-text-faint: #9ca3af;\n --sy-text-on-accent: #ffffff;\n\n --sy-accent: #1f2937;\n --sy-accent-hover: #000000;\n --sy-accent-tint: rgba(0, 0, 0, 0.07);\n\n --sy-selection-bg: rgba(31, 41, 55, 0.18);\n --sy-selection-text: #111827;\n\n --sy-hover-overlay: rgba(0, 0, 0, 0.04);\n\n /* Semantic op colors — monochrome intensity steps (write \x3d darkest \x3d\n mutation); destroy keeps red (danger carries meaning). */\n --sy-op-write: #111827;\n --sy-op-write-muted: #6b7280;\n --sy-op-write-tint: rgba(0, 0, 0, 0.08);\n --sy-op-sql: #6b7280;\n --sy-op-sql-muted: #9ca3af;\n --sy-op-sql-tint: rgba(0, 0, 0, 0.05);\n --sy-op-read: #374151;\n --sy-op-read-muted: #9ca3af;\n --sy-op-read-tint: rgba(0, 0, 0, 0.06);\n --sy-op-destroy: #d34c5e;\n --sy-op-destroy-muted: #bd7078;\n --sy-op-destroy-tint: rgba(211, 76, 94, 0.1);\n\n /* Buffer op chips — the one place ops are colored, not monochrome. */\n --sy-chip-read: #2563eb;\n --sy-chip-write: #c2410c;\n --sy-chip-destroy: #d34c5e;\n\n /* Recursive / tree pill */\n --sy-recur: #4b5563;\n --sy-recur-strong: #1f2937;\n --sy-recur-tint: rgba(0, 0, 0, 0.06);\n --sy-recur-border: rgba(0, 0, 0, 0.3);\n\n --sy-error: #c8443a;\n --sy-error-tint: rgba(200, 68, 58, 0.12);\n\n /* Status + misc semantic tokens — hoisted from console/cockpit inline\n fallbacks so the WHOLE palette is single-sourced here. danger is a\n synonym of error (aliased, resolves per-theme automatically). */\n --sy-danger: var(--sy-error);\n --sy-danger-tint: var(--sy-error-tint);\n --sy-danger-tint-strong: rgba(200, 68, 58, 0.2);\n --sy-warn: #b7791f;\n --sy-warn-tint: rgba(183, 121, 31, 0.12);\n --sy-success: #4f8b3a;\n --sy-info: #6b7280;\n --sy-key: #6682bc;\n --sy-border-strong: rgba(0, 0, 0, 0.18);\n --sy-accent-border: rgba(0, 0, 0, 0.35);\n --sy-active-overlay: rgba(0, 0, 0, 0.08);\n\n /* Syntax (light) — black/gray/green/red: black \x3d keys (the substance),\n red \x3d relations (the edges), green \x3d control + directives,\n gray \x3d data values. Mirrors the dark block's white/gray/yellow/red. */\n --sy-syntax-key: #111827; /* attributes / property names / JSON keys */\n --sy-syntax-relation: #b3452f; /* relation types — red */\n --sy-syntax-keyword: #4f8b3a; /* control words — green */\n --sy-syntax-directive: #3e6e2e; /* @-directives — deep green */\n --sy-syntax-doc: #9ca3af; /* @description prose text */\n --sy-syntax-string: #6b7280;\n --sy-syntax-number: #6b7280;\n --sy-syntax-literal: #6f9861; /* bool / null / operators — muted green */\n --sy-syntax-punct: #9ca3af;\n --sy-result-value: #b3452f; /* result-panel values — brick red on light */\n\n /* ---------------------------------------------------------------------------\n Starfield \x26 Canvas\n --------------------------------------------------------------------------- */\n --modeling-star-rgb: 0, 0, 0;\n --modeling-stars-dim: 1; /* star alphas are light-tuned; dark dims the layer */\n --modeling-nebula-opacity: 0.35; /* faint haze — big gray gas on white reads as stains; clusters carry the shape */\n --modeling-hole-opacity: 0.3; /* light mode: a distant shadow, not a void — full black is threatening on white */\n --modeling-grid-color: rgba(\n 0,\n 0,\n 0,\n 0.13\n ); /* light-only — dark keeps the starfield instead of a grid */\n --modeling-grid-color-major: rgba(0, 0, 0, 0.08);\n --modeling-canvas-vignette: radial-gradient(\n 120% 90% at 50% 40%,\n rgba(0, 0, 0, 0) 55%,\n rgba(0, 0, 0, 0.045) 100%\n );\n --modeling-canvas-bg: #fcfcfc;\n\n /* Theme-INVARIANT \"always dark space\" backdrop — same value in both\n theme blocks (declared once here, not overridden in dark). Lets the\n canvas backdrop stay dark space regardless of light/dark UI theme\n without recoloring entities/panels. surface.cljs opts in via\n `always-dark-space?`; ui/grid.cljs stays as the light-theme fallback\n if that look gets reverted. */\n --modeling-space-bg: #0f0f10;\n --modeling-space-vignette: radial-gradient(\n 120% 90% at 50% 40%,\n rgba(255, 255, 255, 0.035),\n rgba(255, 255, 255, 0) 60%\n );\n --modeling-space-star-rgb: 255, 255, 255;\n --modeling-space-stars-dim: 0.72;\n --modeling-space-nebula-opacity: 0.76;\n --modeling-space-hole-opacity: 1;\n\n /* ---------------------------------------------------------------------------\n Entity Box\n --------------------------------------------------------------------------- */\n --modeling-entity-fill: #fcfcfc; /* was var(--modeling-canvas-bg) — decoupled so the\n canvas backdrop can go always-dark without recoloring entity boxes */\n --modeling-entity-stroke: #b4b4b4;\n --modeling-entity-header-fill: #fcfcfc;\n --modeling-entity-text: var(--sy-text-p);\n --modeling-entity-shadow: rgba(0, 0, 0, 0.08);\n\n /* Entity States — monochrome */\n --modeling-entity-selected-stroke: #111827;\n --modeling-entity-selected-header: #f3f4f6; /* soft — full gray band was too strong on light */\n --modeling-entity-hover-stroke: #9ca3af;\n\n /* ---------------------------------------------------------------------------\n Projection States (diff highlighting) — semantic hues preserved,\n chroma reduced ~15% so they don't burn on white.\n --------------------------------------------------------------------------- */\n /* Added state — light twin of the dark sage palette (#162421/#799386/#2d3c36) */\n --modeling-added-fill: #eef4f0;\n --modeling-added-stroke: #799386;\n --modeling-added-header: #dbe7e0;\n --modeling-added-text: #44604f;\n\n /* Removed/modified — muted twins of the sage added-set (same formula) */\n --modeling-removed-fill: #f4eeee;\n --modeling-removed-stroke: #937979;\n --modeling-removed-header: #e7dbdb;\n --modeling-removed-text: #604444;\n\n /* Configuration rot (broken rule references) — needs more contrast than\n the diff palette: it flags a SECURITY hazard, not a diff state. */\n --modeling-rot-text: #b3261e;\n --modeling-rot-border: #e4a9a5;\n --modeling-rot-fill: #fdf6f5;\n\n --modeling-modified-fill: #f4f1ee;\n --modeling-modified-stroke: #938879;\n --modeling-modified-header: #e7e1db;\n --modeling-modified-text: #605444;\n\n /* ---------------------------------------------------------------------------\n Relations (edges/connections)\n --------------------------------------------------------------------------- */\n --modeling-relation-stroke: var(--sy-text-mm);\n --modeling-relation-stroke-hover: var(--sy-text-m);\n --modeling-relation-stroke-selected: var(--sy-text);\n --modeling-relation-label-bg: #ffffff;\n --modeling-relation-label-text: var(--sy-text-m);\n\n /* ---------------------------------------------------------------------------\n Selection \x26 Handles — monochrome\n --------------------------------------------------------------------------- */\n --modeling-handle-fill: #111827;\n --modeling-handle-stroke: #ffffff;\n --modeling-selection-box: rgba(0, 0, 0, 0.06);\n --modeling-selection-border: #111827;\n\n /* ---------------------------------------------------------------------------\n Toolbar \x26 Overlay\n --------------------------------------------------------------------------- */\n --modeling-overlay-bg: rgba(255, 255, 255, 1);\n --modeling-overlay-bg-hover: rgba(0, 0, 0, 0.03);\n --modeling-overlay-border: rgba(0, 0, 0, 0.1);\n --modeling-overlay-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n --modeling-overlay-text: var(--sy-text);\n --modeling-overlay-text-muted: var(--sy-text-m);\n\n /* ---------------------------------------------------------------------------\n Shadows (elevation scale)\n --------------------------------------------------------------------------- */\n --modeling-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.08);\n --modeling-shadow-md: 0 1px 3px rgba(0, 0, 0, 0.08);\n --modeling-shadow-lg: 0 4px 16px rgba(0, 0, 0, 0.15);\n --modeling-shadow-xl: 0 4px 24px rgba(0, 0, 0, 0.08);\n --modeling-shadow-2xl: 0 8px 32px rgba(0, 0, 0, 0.15);\n --modeling-shadow-popover: 0 4px 20px rgba(0, 0, 0, 0.12);\n --modeling-shadow-modal: 0 16px 48px rgba(0, 0, 0, 0.2);\n\n /* ---------------------------------------------------------------------------\n Semantic surfaces (button text, modal backdrop, hover overlays, focus ring)\n --------------------------------------------------------------------------- */\n --modeling-button-text: #ffffff;\n --modeling-modal-backdrop: rgba(0, 0, 0, 0.4);\n --modeling-hover-overlay: rgba(0, 0, 0, 0.05);\n --modeling-hover-overlay-strong: rgba(0, 0, 0, 0.06);\n --modeling-press-overlay: rgba(0, 0, 0, 0.08);\n --modeling-press-overlay-strong: rgba(0, 0, 0, 0.12);\n\n /* Tinted variants — derived from text hues so banners/chips match */\n --modeling-entity-selected-tint: rgba(0, 0, 0, 0.06);\n --modeling-entity-selected-tint-strong: rgba(0, 0, 0, 0.12);\n --modeling-entity-selected-stroke-hover: #000000;\n --modeling-added-tint: rgba(6, 95, 70, 0.08);\n --modeling-removed-tint: rgba(200, 59, 59, 0.06);\n --modeling-removed-tint-strong: rgba(200, 59, 59, 0.12);\n --modeling-removed-stroke-hover: #a82d2d;\n\n /* Destructive-action buttons (delete confirm) — a solid, saturated red\n regardless of theme. Deliberately NOT the removed-stroke-hover/\n button-text tokens above: those are tuned for diff tints and an\n accent-matched label, and reusing them here washed the button out\n in dark mode (a pale tint used as a fill, dark text on top of it). */\n --modeling-danger-bg: #a82d2d;\n --modeling-danger-bg-hover: #8f2521;\n --modeling-danger-text: #ffffff;\n}\n\nhtml.dark,\nhtml[data-theme\x3d\"dark\"],\n:host([data-theme\x3d\"dark\"]) {\n color-scheme: dark;\n\n /* Brand logo tokens — dark theme */\n --logo-primary: #ffffff; /* black hole + wordmark: fully white on dark */\n --logo-secondary: #5b5b5b; /* trails: subtle on dark */\n\n /* Text intensity scale */\n --sy-text-pp: #ffffff;\n --sy-text-p: #f0f0f0;\n --sy-text: #d6d6d6;\n --sy-text-m: #7f8590;\n --sy-text-mm: #555a63;\n\n /* UI surface tokens (dark) — exact data-console palette */\n --sy-bg-app: #161616;\n --sy-bg-panel: #1a1a1a;\n --sy-bg-surface: #1e1e1e;\n --sy-bg-band: #181818;\n\n --sy-border: #2a2a2a;\n --sy-border-subtle: #222;\n\n --sy-text-primary: #d4d4d4;\n --sy-text-secondary: #999;\n --sy-text-muted: #666;\n --sy-text-faint: #4a4a4a;\n --sy-text-on-accent: #1a1a1a;\n\n --sy-accent: #e2e2e2;\n --sy-accent-hover: #ffffff;\n --sy-accent-tint: rgba(255, 255, 255, 0.1);\n\n --sy-selection-bg: rgba(255, 255, 255, 0.24);\n --sy-selection-text: #ffffff;\n\n --sy-hover-overlay: rgba(255, 255, 255, 0.05);\n\n --sy-op-write: #f0f0f0;\n --sy-op-write-muted: #9a9a9a;\n --sy-op-write-tint: rgba(255, 255, 255, 0.12);\n --sy-op-sql: #a8adb5;\n --sy-op-sql-muted: #6e737b;\n --sy-op-sql-tint: rgba(255, 255, 255, 0.08);\n --sy-op-read: #c6cad1;\n --sy-op-read-muted: #8a8f98;\n --sy-op-read-tint: rgba(255, 255, 255, 0.1);\n --sy-op-destroy: #c66d7a;\n --sy-op-destroy-muted: #9c5762;\n --sy-op-destroy-tint: rgba(198, 109, 122, 0.14);\n\n --sy-chip-read: #7aa2f7;\n --sy-chip-write: #e0a458;\n --sy-chip-destroy: #f7768e;\n\n --sy-recur: #c6cad1;\n --sy-recur-strong: #e2e2e2;\n --sy-recur-tint: rgba(255, 255, 255, 0.12);\n --sy-recur-border: rgba(255, 255, 255, 0.4);\n\n --sy-error: #f7768e;\n --sy-error-tint: rgba(247, 118, 142, 0.15);\n\n /* Status + misc semantic tokens — dark. (danger aliases error in the base\n block; resolves to the dark error value here automatically.) */\n --sy-danger-tint-strong: rgba(247, 118, 142, 0.22);\n --sy-warn: #e0af68;\n --sy-warn-tint: rgba(224, 175, 104, 0.14);\n --sy-success: #9ece6a;\n --sy-info: #9aa0a8;\n --sy-key: #6891c8;\n --sy-border-strong: #3a3a3a;\n --sy-accent-border: rgba(255, 255, 255, 0.35);\n --sy-active-overlay: rgba(255, 255, 255, 0.1);\n\n /* Syntax (dark) — white/gray/yellow/red: white \x3d keys (the substance),\n red \x3d relations (the edges), amber/gold \x3d control + directives,\n gray \x3d data values. Light mode stays pure monochrome. */\n --sy-syntax-key: #eaeaea; /* attributes / property names / JSON keys */\n --sy-syntax-relation: #e08e98; /* relation types — soft red */\n --sy-syntax-keyword: #e0af68; /* control words — amber */\n --sy-syntax-directive: #d4a017; /* @-directives — deep gold */\n --sy-syntax-doc: #868686; /* @description prose text */\n --sy-syntax-string: #c0c5cc;\n --sy-syntax-number: #c0c5cc;\n --sy-syntax-literal: #c39a5e; /* bool / null / operators — muted amber */\n --sy-syntax-punct: #5c6068;\n --sy-result-value: #e0af68; /* result-panel values — amber on dark */\n\n /* Starfield \x26 Canvas */\n --modeling-star-rgb: 255, 255, 255;\n --modeling-stars-dim: 0.72; /* compensates the light-tuned alphas — dark look unchanged */\n --modeling-nebula-opacity: 0.76; /* × stars-dim ≈ the approved .55 */\n --modeling-hole-opacity: 1;\n --modeling-canvas-vignette: radial-gradient(\n 120% 90% at 50% 40%,\n rgba(255, 255, 255, 0.035),\n rgba(255, 255, 255, 0) 60%\n );\n --modeling-canvas-bg: #0f0f10;\n\n /* Entity Box */\n --modeling-entity-fill: #0f0f10; /* was var(--modeling-canvas-bg) — decoupled, see light block */\n --modeling-entity-stroke: #3b3b3b;\n --modeling-entity-header-fill: #0f0f10;\n --modeling-entity-text: var(--sy-text-p);\n --modeling-entity-shadow: rgba(0, 0, 0, 0.3);\n\n /* Entity States — monochrome */\n --modeling-entity-selected-stroke: #555555;\n --modeling-entity-selected-header: #1d1d1d;\n --modeling-entity-hover-stroke: #b0b0b5;\n\n /* Projection States — muted greens/reds/ambers, ~30% chroma reduction */\n --modeling-added-fill: #162421;\n --modeling-added-stroke: #799386;\n --modeling-added-header: #2d3c36;\n --modeling-added-text: #9bc7af;\n\n --modeling-removed-fill: #241616;\n --modeling-removed-stroke: #937979;\n --modeling-removed-header: #3c2d2d;\n --modeling-removed-text: #c79b9b;\n\n --modeling-rot-text: #f2837b;\n --modeling-rot-border: #7a3d38;\n --modeling-rot-fill: #2e1c1a;\n\n --modeling-modified-fill: #241f16;\n --modeling-modified-stroke: #938879;\n --modeling-modified-header: #3c362d;\n --modeling-modified-text: #c7b89b;\n\n /* Relations */\n --modeling-relation-stroke: var(--modeling-entity-stroke);\n --modeling-relation-stroke-hover: var(--sy-text-m);\n --modeling-relation-stroke-selected: var(--sy-text);\n --modeling-relation-label-bg: var(--modeling-canvas-bg);\n --modeling-relation-label-text: var(--sy-text-m);\n --modeling-relation-label-text-selected: var(--sy-text);\n\n /* Selection \x26 Handles — monochrome */\n --modeling-handle-fill: #e2e2e2;\n --modeling-handle-stroke: #0f0f10;\n --modeling-selection-box: rgba(255, 255, 255, 0.08);\n --modeling-selection-border: #e2e2e2;\n\n /* Toolbar \x26 Overlay */\n --modeling-overlay-bg: rgba(45, 45, 45, 1);\n --modeling-overlay-bg-hover: rgba(255, 255, 255, 0.06);\n --modeling-overlay-border: rgba(255, 255, 255, 0.12);\n --modeling-overlay-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\n --modeling-overlay-text: var(--sy-text);\n --modeling-overlay-text-muted: var(--sy-text-m);\n\n /* Shadows */\n --modeling-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);\n --modeling-shadow-md: 0 1px 3px rgba(0, 0, 0, 0.3);\n --modeling-shadow-lg: 0 4px 16px rgba(0, 0, 0, 0.4);\n --modeling-shadow-xl: 0 4px 24px rgba(0, 0, 0, 0.4);\n --modeling-shadow-2xl: 0 8px 32px rgba(0, 0, 0, 0.4);\n --modeling-shadow-popover: 0 4px 20px rgba(0, 0, 0, 0.4);\n --modeling-shadow-modal: 0 16px 48px rgba(0, 0, 0, 0.5);\n\n /* Semantic surfaces */\n --modeling-button-text: #1a1a1a; /* accent is near-WHITE in dark — white text vanished */\n --modeling-modal-backdrop: rgba(0, 0, 0, 0.6);\n --modeling-hover-overlay: rgba(255, 255, 255, 0.08);\n --modeling-hover-overlay-strong: rgba(255, 255, 255, 0.1);\n --modeling-press-overlay: rgba(255, 255, 255, 0.12);\n --modeling-press-overlay-strong: rgba(255, 255, 255, 0.15);\n\n /* Tinted variants — match monochrome palette above */\n --modeling-entity-selected-tint: rgba(255, 255, 255, 0.1);\n --modeling-entity-selected-tint-strong: rgba(255, 255, 255, 0.18);\n --modeling-entity-selected-stroke-hover: #ffffff;\n --modeling-added-tint: rgba(95, 160, 127, 0.12);\n --modeling-removed-tint: rgba(201, 128, 128, 0.12);\n --modeling-removed-tint-strong: rgba(201, 128, 128, 0.18);\n --modeling-removed-stroke-hover: #d4a8a8;\n\n /* Destructive-action buttons — solid red, not the pale removed-stroke-hover\n tint above (that's sized for on-dark diff chips, not a button fill), and\n a fixed white label rather than --modeling-button-text (which flips dark\n for the near-white accent buttons and would sit unreadable on red).\n Hover lightens, matching this theme's hover convention elsewhere. */\n --modeling-danger-bg: #a8433c;\n --modeling-danger-bg-hover: #c25850;\n --modeling-danger-text: #ffffff;\n}\n\n::selection {\n background: var(--sy-selection-bg);\n color: var(--sy-selection-text);\n}\n");function xDa(){try{var a=localStorage.getItem("synthigy-modeling-theme");return l(a)?a:"light"}catch(b){return"light"}}function HDa(a){try{localStorage.setItem("synthigy-modeling-theme",a)}catch(b){}}function LDa(a,b){return l(a)?z.h(b,"dark")?a.setAttribute("data-theme","dark"):a.removeAttribute("data-theme"):null}
|
|
2747
|
+
function lEa(a){if(l(a)){var b=new MutationObserver(function(){var c=xDa();return yg(c,l(a.hasAttribute("data-theme"))?"dark":"light")?LDa(a,c):null});b.observe(a,{attributes:!0,attributeFilter:["data-theme"]});return b}return null}function MDa(a,b){z2(a,b2,"synthigy-tokens");LDa(b,xDa());l(l(b)?mb(b._themeObserver):b)&&(b._themeObserver=lEa(b))};var Ova=new Pj(null,new k(null,3,["SYNTHIGY-DATA-MODELING",null,"SYNTHIGY-LOG-COCKPIT",null,"SYNTHIGY-DATA-CONSOLE",null],null),null),o9=$g(0),t9=$g(null);function Kxa(){var a=q(t9),b=N(a);a=v(b,jm);var c=v(b,Lp),d=v(b,WL);b=v(b,VL);document.documentElement.style.overflow=l(a)?a:"";document.body.style.overflow=l(c)?c:"";ah(t9,null);return l(l(d)?b:d)?window.scrollTo(d,b):null}
|
|
2748
2748
|
function v9(a){var b=a._scrollLocked;if(!l(b))a:for(b=a;;){b=b.getRootNode().host;if(null==b){b=!1;break a}var c=jf(Ova,b.tagName);if(c){b=c;break a}}l(b)||(a._scrollLocked=!0,0===q(o9)&&(ah(t9,new k(null,4,[jm,document.documentElement.style.overflow,Lp,document.body.style.overflow,WL,window.scrollX,VL,window.scrollY],null)),document.documentElement.style.overflow="hidden",document.body.style.overflow="hidden"),Q.h(o9,fe))}
|
|
2749
2749
|
function w9(a){return l(a._scrollLocked)?(a._scrollLocked=!1,0===Q.h(o9,function(b){--b;return 0>b?0:b})?Kxa():null):null};function gwa(a,b){b&&Object.keys(b).forEach(c=>{Object.defineProperty(a,c,{get(){return(this._props||{})[c]},set(d){this._props||(this._props={});const e=this._props[c];this._props[c]=d;this.Na&&this.Na.prop&&this.Na.prop(this,c,e,d)}})})}
|
|
2750
2750
|
function hwa(a,b){b&&b.formAssociated&&["name","type","disabled","required"].forEach(c=>{Object.defineProperty(a,c,{get(){var d=this._props&&this._props[c];if(void 0!==d)return d;d=this.getAttribute(c);return"disabled"===c||"required"===c?null!==d:d},set(d){this._props||(this._props={});const e=this._props[c];this._props[c]=d;"disabled"===c||"required"===c?d?this.setAttribute(c,""):this.removeAttribute(c):null!==d&&void 0!==d?this.setAttribute(c,String(d)):this.removeAttribute(c);this.Na&&this.Na.prop&&
|
|
@@ -2758,10 +2758,10 @@ function jwa(a){var b=N(a),c=v(b,Dia),d=v(b,Saa);a=v(b,Rp);var e=v(b,cp),f=v(b,v
|
|
|
2758
2758
|
d.g(r):d.call(null,r)}:null,props:l(a)?NQ(Xj(eh.h(Vf,Hi(a)),kh(!0))):null,attr:l(e)?function(r,t,u,w){t=Uf.g(t);return e.l?e.l(r,t,u,w):e.call(null,r,t,u,w)}:null}}function E2(a){var b=a.tyUnifiedBatch;return l(b)?b:a.tyUnifiedBatch=new k(null,3,[ly,ug,zF,ug,cL,!1],null)}
|
|
2759
2759
|
function F2(a,b,c){var d=E2(a);if(l(d.scheduled))return null;d.scheduled=!0;return requestAnimationFrame(function(){var e=a.tyUnifiedBatch;if(l(e)){if(l(l(b)?A(ly.g(e)):b)){var f=ly.g(e);b.h?b.h(a,f):b.call(null,a,f)}l(l(c)?A(zF.g(e)):c)&&(e=zF.g(e),c.h?c.h(a,e):c.call(null,a,e));e=a.tyUnifiedBatch=new k(null,3,[ly,ug,zF,ug,cL,!1],null)}else e=null;return e})}
|
|
2760
2760
|
function G2(a,b){var c=window.customElements.get(a),d=cp.g(b),e=KH.g(b),f=function(){var h=Le.o(b,cp,I([KH]));h=l(d)?M.j(h,cp,function(m,n,r,t){r=E2(m);m.tyUnifiedBatch=Gh.S(r,ly,M,Vf(n),t);return F2(m,d,e)}):h;return l(e)?M.j(h,KH,function(m,n,r,t){r=E2(m);m.tyUnifiedBatch=Gh.S(r,zF,M,Vf(n),t);return F2(m,d,e)}):h}();mb(!1)||mb(c)?(ba.define(a,jwa(f)),Q.l(B2,M,a,b),c=Pz.g(b),l(c)&&Q.l(C2,M,a,c)):(Q.l(B2,M,a,b),c=Pz.g(b),l(c)&&Q.l(C2,M,a,c),console.log(["[Ty] Hot reloading component: ",p.g(a)].join("")),
|
|
2761
|
-
iwa(a),window.customElements.get(a))};var $1=new CSSStyleSheet;$1.replaceSync("/* ── Host ───────────────────────────────────────────────────────────────────── */\n:host {\n display: none;\n position: fixed;\n inset: 0;\n z-index: 9998;\n font-family: 'Inter', system-ui, -apple-system, sans-serif;\n font-size: 13px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n /* NOTE: ALL tooltip CSS (tokens + [data-tooltip] + CM lint) lives in\n component.cljs `tooltip-css` — defstyles drops custom-prop defs AND the\n cm-lint rule block, so tooltips must be applied natively, not from here. */\n}\n:host([open]) { display: block; }\n\n/* CodeMirror lint tooltip + diagnostic + lintRange styling lives in\n component.cljs `tooltip-css` (native string) — defstyles drops the whole\n block from this file, so it MUST NOT live here. See that def. */\n/* Gutter markers. */\n.cm-lint-marker-error { color: #f7768e; }\n.cm-lint-marker-warning { color: #e0af68; }\n\n*, *::before, *::after { box-sizing: border-box; }\n\n/* ── Root layout ────────────────────────────────────────────────────────────── */\n.console {\n position: relative; /* containing block for .confirm-backdrop */\n isolation: isolate; /* keeps z-index:-1 starfield above .console bg */\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background: var(--sy-bg-app, #161616);\n color: var(--sy-text-primary, #d4d4d4);\n}\n\n/* Inline variable chips (var_chips.cljs) — plain editor-content decorations,\n not CM tooltips (the fill-in POPUP is a tooltip and lives in\n component.cljs's native `tooltip-css` for that reason — see the comment\n there). Chips have no opaque background of their own, just a translucent\n tint, so they must stay theme-reactive: var(--sy-hover-overlay) etc. flip\n tint direction per theme (white-on-dark / black-on-light) — a fixed\n always-white tint was tried and went invisible on a light background. */\n.cm-var-chip {\n display: inline-block;\n margin-left: 5px;\n padding: 0 6px;\n border-radius: 4px;\n font-size: 10px;\n line-height: 15px;\n vertical-align: baseline;\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n border: 1px solid transparent;\n transition: border-color .12s, background .12s;\n}\n.cm-var-chip--set {\n color: var(--sy-accent, #e2e2e2);\n background: var(--sy-accent-tint, rgba(255, 255, 255,.14));\n}\n.cm-var-chip--set:hover { border-color: var(--sy-accent, #e2e2e2); }\n.cm-var-chip--default {\n /* --sy-text-muted fails AA contrast on the light popup/chip background\n (~4:1, needs 4.5:1) — text-secondary is the next step up the scale\n and passes comfortably in both themes. */\n color: var(--sy-text-secondary, #999);\n background: var(--sy-hover-overlay, rgba(255,255,255,.05));\n font-style: italic;\n}\n.cm-var-chip--default:hover { border-color: var(--sy-text-secondary, #999); }\n.cm-var-chip--unset {\n color: var(--sy-op-write, #f0f0f0);\n background: var(--sy-op-write-tint, rgba(255, 255, 255,.12));\n}\n.cm-var-chip--unset:hover { border-color: var(--sy-op-write, #f0f0f0); }\n.cm-var-chip--invalid {\n color: var(--sy-chip-destroy);\n background: var(--sy-op-destroy-tint, rgba(247,118,142,.14));\n}\n.cm-var-chip--invalid:hover { border-color: var(--sy-chip-destroy); }\n\n/* ── Confirm modal (replaces js/confirm) ────────────────────────────────────── */\n.confirm-backdrop {\n position: absolute;\n inset: 0;\n z-index: 10001; /* above everything in the console */\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, .55);\n}\n.confirm-card {\n min-width: 320px;\n max-width: 480px;\n padding: 18px 20px 16px;\n background: var(--sy-bg-app, #161616);\n border: 1px solid var(--sy-border, rgba(255,255,255,.14));\n border-radius: 8px;\n box-shadow: 0 12px 40px rgba(0,0,0,.5);\n outline: none;\n}\n.confirm-message {\n font-size: 13px;\n line-height: 1.5;\n color: var(--sy-text-primary, #d4d4d4);\n margin-bottom: 16px;\n word-break: break-word;\n}\n.confirm-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n}\n.confirm-btn {\n padding: 5px 14px;\n font-size: 12px;\n border-radius: 5px;\n cursor: pointer;\n background: var(--sy-hover-overlay, rgba(255,255,255,.06));\n border: 1px solid var(--sy-border, rgba(255,255,255,.14));\n color: var(--sy-text-primary, #d4d4d4);\n}\n.confirm-btn:hover { background: var(--sy-active-overlay, rgba(255,255,255,.1)); }\n.confirm-btn--danger {\n background: var(--sy-danger-tint, rgba(247,118,142,.12));\n border-color: var(--sy-danger, #f7768e);\n color: var(--sy-danger, #f7768e);\n}\n.confirm-btn--danger:hover { background: var(--sy-danger-tint-strong, rgba(247,118,142,.22)); }\n\n/* Console-wide scrollbars: thin, dark, and crucially NO arrow buttons. The OS\n (GTK on Linux) otherwise paints up/down (or left/right) arrow buttons on any\n overflowing container — tiny, hard to click, easy to mistake for real UI. */\n.console *::-webkit-scrollbar { width: 10px; height: 10px; }\n.console *::-webkit-scrollbar-button { display: none; width: 0; height: 0; }\n.console *::-webkit-scrollbar-track { background: transparent; }\n.console *::-webkit-scrollbar-thumb {\n background: var(--sy-border, #2a2a2a);\n border-radius: 6px;\n}\n.console *::-webkit-scrollbar-thumb:hover { background: var(--sy-text-muted, #555); }\n.console * { scrollbar-width: thin; scrollbar-color: var(--sy-border, #2a2a2a) transparent; }\n\n/* ── Toolbar ────────────────────────────────────────────────────────────────── */\n.toolbar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 12px;\n height: 38px;\n background: var(--sy-bg-surface, #1e1e1e);\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n flex-shrink: 0;\n}\n.toolbar-brand {\n display: flex;\n align-items: center;\n margin-top: 10px;\n margin-left: -10px;\n pointer-events: none;\n}\n.toolbar-brand svg { height: 28px; width: auto; display: block; }\n.toolbar-title {\n margin-top: 4px;\n font-size: 11px;\n font-weight: 600;\n color: var(--sy-text-muted, #666);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n}\n\n/* ── Op tabs (in toolbar) ───────────────────────────────────────────────────── */\n\n/* Buffer operations — the @-ops defined in the current XSQL buffer, as\n verb-colored chips in the toolbar. Click to run one. The op color follows\n its view (read\x3dblue, mutate\x3damber, destroy\x3dred) via .op-label--*. */\n.buffer-ops {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-right: 6px;\n overflow-x: auto;\n max-width: 60%;\n}\n.buffer-op {\n display: inline-flex;\n align-items: baseline;\n gap: 5px;\n background: var(--sy-hover-overlay, rgba(255,255,255,.04));\n border: 1px solid transparent;\n padding: 2px 9px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 11px;\n border-radius: 4px;\n cursor: pointer;\n white-space: nowrap;\n transition: background .12s, border-color .12s;\n}\n.buffer-op:hover { background: var(--sy-active-overlay, rgba(255,255,255,.08)); border-color: currentColor; }\n.buffer-op-run { display: inline-flex; align-self: center; opacity: .45; transition: opacity .12s; }\n.buffer-op-run svg { width: 9px; height: 9px; }\n.buffer-op:hover .buffer-op-run { opacity: .9; }\n.buffer-op:disabled { cursor: default; opacity: .4; }\n.buffer-op:disabled:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.04)); border-color: transparent; }\n.buffer-op--running,\n.buffer-op--running:disabled { opacity: 1; border-color: currentColor; }\n.buffer-op--running .buffer-op-run { opacity: 1; }\n.buffer-op-spinner { animation: buffer-op-spin .8s linear infinite; }\n@keyframes buffer-op-spin { to { transform: rotate(360deg); } }\n.buffer-op-verb { font-size: 9.5px; font-weight: 600; opacity: .85; } /* inherits op-label--* color */\n.buffer-op.op-label--read { color: var(--sy-chip-read) !important; }\n.buffer-op.op-label--mutate { color: var(--sy-chip-write) !important; }\n.buffer-op.op-label--destroy { color: var(--sy-chip-destroy) !important; }\n.buffer-op.op-label--read .buffer-op-verb,\n.buffer-op.op-label--mutate .buffer-op-verb,\n.buffer-op.op-label--destroy .buffer-op-verb { opacity: 1; }\n.buffer-op-ns { color: var(--sy-text-muted, #8a8a8a); } /* namespace qualifier, dimmed */\n.buffer-op-name { color: var(--sy-text-primary, #d4d4d4); }\n/* @watch toggle — edits the op's @watch header line (live intent lives in the\n buffer, not UI state). Ghosted until hover; accent when on. */\n.buffer-op-watch { display: inline-flex; align-self: center; opacity: .22; transition: opacity .12s; }\n.buffer-op:hover .buffer-op-watch { opacity: .55; }\n.buffer-op .buffer-op-watch:hover { opacity: .9; }\n.buffer-op-watch.on,\n.buffer-op:hover .buffer-op-watch.on { opacity: 1; color: var(--sy-accent, #e2e2e2); }\n/* @batch chip — distinct accent so compositions read apart from single ops. */\n.buffer-op--batch { color: var(--sy-accent, #e2e2e2); background: var(--sy-accent-tint, rgba(255, 255, 255,.10)); }\n.buffer-op--batch .buffer-op-verb { opacity: 1; }\n/* op with lint errors — red, matching the editor's error color */\n.buffer-op--error { border-color: rgba(247,118,142,.55) !important; }\n.buffer-op--error .buffer-op-name,\n.buffer-op--error .buffer-op-verb { color: #f7768e; }\n/* Run-chips now live at the top of the results pane (moved out of the toolbar).\n Full-width runbar with a divider, not the toolbar's 60% cap. Hidden when the\n buffer declares no named ops. */\n.panel-right \x3e .buffer-ops {\n max-width: none;\n margin: 0;\n padding: 8px 12px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n flex-shrink: 0;\n /* Wrap chips to a new line instead of scrolling — a scrolling container\n gets the OS scrollbar's arrow buttons (tiny, hard to click), which is\n what looked like stray up/down buttons in the runbar. */\n overflow-x: visible;\n flex-wrap: wrap;\n row-gap: 4px;\n}\n.panel-right \x3e .buffer-ops:empty { display: none; }\n\n/* Verb chips in the XSQL buffer hint — colored @search/@get/… */\n.verb-chip { font-family: 'JetBrains Mono','Fira Code',monospace; font-weight: 600; }\n\n/* op-label tint follows the mode (read/mutate/destroy). */\n.op-label--read { color: var(--sy-op-read, #c6cad1) !important; }\n.op-label--mutate { color: var(--sy-op-write, #f0f0f0) !important; }\n.op-label--destroy { color: var(--sy-op-destroy, #f7768e) !important; }\n\n.toolbar-btn {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--sy-text-muted, #666);\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: color .12s, background .12s;\n}\n.toolbar-btn:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.06)); color: var(--sy-text-primary, #d4d4d4); }\n\n/* ── Saved-query tabs (in toolbar) ──────────────────────────────────────────── */\n.query-tabs {\n display: flex;\n align-items: center;\n gap: 3px;\n margin-left: 10px;\n /* Fill the toolbar row so the measured width is stable regardless of how\n many tabs render (the JS truncates to fit; it does not rely on scroll). */\n flex: 1 1 0;\n min-width: 0;\n overflow-x: clip;\n overflow-y: visible;\n}\n.query-tab {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n max-width: 160px;\n padding: 3px 6px 3px 9px;\n border-radius: 4px;\n border: 1px solid transparent;\n background: var(--sy-bg-band, #1f1f1f);\n cursor: grab;\n user-select: none;\n -webkit-user-select: none;\n transition: background .12s, border-color .12s, color .12s;\n}\n.query-tab:active { cursor: grabbing; }\n.query-tab.dragging { opacity: .4; }\n.query-tab.drop-before { box-shadow: inset 2px 0 0 var(--sy-accent, #e2e2e2); }\n.query-tab.drop-after { box-shadow: inset -2px 0 0 var(--sy-accent, #e2e2e2); }\n.query-tab:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.06)); }\n.query-tab.active {\n background: var(--sy-accent-tint, rgba(255, 255, 255,.14));\n border-color: var(--sy-accent-border, rgba(255, 255, 255,.4));\n}\n.query-tab-name {\n font-family: 'Inter', sans-serif;\n font-size: 11px;\n font-weight: 500;\n color: var(--sy-text-secondary, #9a9a9a);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.query-tab.active .query-tab-name { color: var(--sy-accent, #e2e2e2); }\n\n.query-tab-close {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 14px;\n height: 14px;\n padding: 0;\n border: none;\n border-radius: 3px;\n background: none;\n cursor: pointer;\n color: var(--sy-text-faint, #555);\n opacity: 0;\n transition: opacity .12s, color .12s, background .12s;\n}\n.query-tab:hover .query-tab-close { opacity: 1; }\n.query-tab-close:hover {\n color: var(--sy-error, #f7768e);\n background: var(--sy-hover-overlay, rgba(255,255,255,.08));\n}\n.query-tab-add {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 22px;\n height: 22px;\n padding: 0;\n border: 1px dashed var(--sy-border, #3a3a3a);\n border-radius: 4px;\n background: none;\n cursor: pointer;\n color: var(--sy-text-muted, #666);\n transition: color .12s, border-color .12s, background .12s;\n}\n.query-tab-add:hover {\n color: var(--sy-accent, #e2e2e2);\n border-color: var(--sy-accent, #e2e2e2);\n background: var(--sy-accent-tint, rgba(255, 255, 255,.1));\n}\n\n/* Overflow chip — how many tabs didn't fit; opens the workspace picker. */\n.query-tab-overflow {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n height: 22px;\n padding: 0 8px;\n font-family: 'JetBrains Mono','Fira Code',monospace;\n font-size: 11px;\n font-weight: 600;\n border: 1px solid var(--sy-border, #3a3a3a);\n border-radius: 4px;\n background: var(--sy-bg-band, #1f1f1f);\n cursor: pointer;\n color: var(--sy-text-secondary, #9a9a9a);\n transition: color .12s, border-color .12s, background .12s;\n}\n.query-tab-overflow:hover {\n color: var(--sy-accent, #e2e2e2);\n border-color: var(--sy-accent-border, rgba(255, 255, 255,.4));\n background: var(--sy-accent-tint, rgba(255, 255, 255,.1));\n}\n\n/* ── Workspace picker modal ─────────────────────────────────────────────────── */\n.ws-picker-card {\n min-width: 320px;\n max-width: 420px;\n max-height: 70vh;\n display: flex;\n flex-direction: column;\n padding: 14px 16px;\n background: var(--sy-bg-app, #161616);\n border: 1px solid var(--sy-border, rgba(255,255,255,.14));\n border-radius: 8px;\n box-shadow: 0 12px 40px rgba(0,0,0,.5);\n outline: none;\n}\n.ws-picker-title {\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: .04em;\n color: var(--sy-text-muted, #888);\n margin-bottom: 10px;\n}\n.ws-picker-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n}\n.ws-picker-row {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 2px 4px 2px 6px;\n border-radius: 5px;\n border: 1px solid transparent;\n}\n.ws-picker-row.active {\n background: var(--sy-accent-tint, rgba(255, 255, 255,.14));\n border-color: var(--sy-accent-border, rgba(255, 255, 255,.4));\n}\n.ws-picker-name {\n flex: 1 1 auto;\n min-width: 0;\n text-align: left;\n font-family: 'Inter', sans-serif;\n font-size: 12px;\n padding: 5px 4px;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--sy-text-primary, #d4d4d4);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.ws-picker-row.active .ws-picker-name { color: var(--sy-accent, #e2e2e2); }\n.ws-picker-move { display: flex; gap: 2px; flex-shrink: 0; }\n.ws-picker-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n padding: 0;\n border: 1px solid transparent;\n border-radius: 4px;\n background: none;\n cursor: pointer;\n color: var(--sy-text-muted, #888);\n transition: color .12s, background .12s;\n}\n.ws-picker-btn:hover:not(:disabled) {\n color: var(--sy-accent, #e2e2e2);\n background: var(--sy-hover-overlay, rgba(255,255,255,.06));\n}\n.ws-picker-btn:disabled { opacity: .3; cursor: default; }\n\n/* ── Panels ─────────────────────────────────────────────────────────────────── */\n.panels {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n.panel {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-width: 0;\n}\n.panel-left { flex-shrink: 0; border-right: 1px solid var(--sy-border, #2a2a2a); background: var(--sy-bg-panel, #1a1a1a); }\n.panel-mid { flex: 1; min-width: 200px; background: var(--sy-bg-surface, #1e1e1e); }\n.panel-right { flex-shrink: 0; border-left: 1px solid var(--sy-border, #2a2a2a); display: flex; flex-direction: column; background: var(--sy-bg-panel, #1a1a1a); }\n\n/* ── Drag handles ───────────────────────────────────────────────────────────── */\n.drag-handle {\n width: 5px;\n flex-shrink: 0;\n background: var(--sy-border, #2a2a2a);\n cursor: col-resize;\n transition: background .15s;\n}\n.drag-handle:hover, .drag-handle.dragging { background: var(--sy-accent, #e2e2e2); }\n\n/* ── Left panel (cursor-context) ────────────────────────────────────────────\n Replaces the old flat entity list — reflects the cursor's scope in the\n XSQL buffer instead. See synthigy.data.console.context-panel; STUB DATA\n until real cursor-position resolution lands (complete.cljc context-at). */\n.ctx-panel {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n min-width: 0;\n}\n\n.ctx-breadcrumb {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n padding: 10px 12px 8px;\n border-bottom: 1px solid var(--sy-border-subtle, #222);\n min-height: 34px;\n flex-shrink: 0;\n}\n.ctx-crumb {\n appearance: none;\n background: transparent;\n border: none;\n padding: 0;\n margin: 0;\n cursor: pointer;\n font-family: 'Inter', sans-serif;\n font-size: 12px;\n font-weight: 600;\n color: var(--sy-text-secondary, #999);\n}\n.ctx-crumb:hover { color: var(--sy-text-primary, #d4d4d4); }\n.ctx-crumb.leaf { color: var(--sy-accent, #e2e2e2); cursor: default; font-family: 'JetBrains Mono', monospace; }\n\n.ctx-crumb-kind {\n margin-left: auto;\n font-size: 9px;\n font-weight: 700;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n padding: 2px 6px;\n border-radius: 4px;\n color: var(--sy-accent, #e2e2e2);\n background: var(--sy-accent-tint, rgba(255, 255, 255,.14));\n white-space: nowrap;\n transition: color .15s, background .15s;\n}\n\n.ctx-path {\n display: flex; flex-wrap: wrap; align-items: center;\n padding: 5px 12px;\n font-family: 'JetBrains Mono', monospace;\n font-size: 11px;\n color: var(--sy-text-secondary, #999);\n border-bottom: 1px solid var(--sy-border-subtle, rgba(255,255,255,.06));\n user-select: none;\n}\n.ctx-path-seg { white-space: nowrap; }\n.ctx-path-seg.leaf { color: var(--sy-accent, #e2e2e2); font-weight: 600; }\n.ctx-path-sep { color: var(--sy-text-faint, #4a4a4a); margin: 0 5px; }\n\n.ctx-scroll { flex: 1; min-height: 0; overflow-y: auto; padding: 4px 0 8px; }\n\n.ctx-empty {\n padding: 16px 12px;\n font-size: 11px;\n font-style: italic;\n color: var(--sy-text-faint, #4a4a4a);\n text-align: center;\n}\n\n.ctx-section-label {\n padding: 10px 12px 4px;\n font-size: 9px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--sy-text-muted, #4a4a4a);\n font-family: 'Inter', sans-serif;\n user-select: none;\n}\n\n.ctx-row {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 3px 12px;\n border: none;\n background: transparent;\n font: inherit;\n font-size: 12px;\n color: var(--sy-text-secondary, #999);\n text-align: left;\n cursor: pointer;\n}\n.ctx-row:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.05)); }\n\n.ctx-check {\n width: 13px; height: 13px; flex-shrink: 0;\n border: 1.5px solid var(--sy-text-faint, #4a4a4a);\n border-radius: 3px;\n display: flex; align-items: center; justify-content: center;\n color: transparent;\n}\n.ctx-row.picked .ctx-check {\n background: var(--sy-accent, #e2e2e2);\n border-color: var(--sy-accent, #e2e2e2);\n color: var(--sy-text-on-accent, #1a1a1a);\n}\n.ctx-check svg { width: 9px; height: 9px; }\n\n.ctx-row-name {\n flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n font-family: 'JetBrains Mono', monospace;\n color: var(--sy-text-primary, #d4d4d4);\n}\n.ctx-row-name.ctx-row--attr { color: var(--sy-syntax-key, #eaeaea); }\n.ctx-row-name.ctx-row--rel { color: var(--sy-syntax-relation, #c0c5cc); }\n.ctx-row-name.ctx-row--agg { color: var(--sy-syntax-keyword, #d0d4da); }\n.ctx-row.picked .ctx-row-name { opacity: .55; }\n\n/* \"+ aliased copy\" affordance on picked relation rows — the toggle can\n only REMOVE a used relation; this adds an `alias:rel` second line. */\n.ctx-row-alias {\n flex-shrink: 0;\n width: 15px; height: 15px;\n display: flex; align-items: center; justify-content: center;\n border-radius: 3px;\n font-size: 12px; font-weight: 600; line-height: 1;\n color: var(--sy-text-faint, #4a4a4a);\n opacity: 0;\n}\n.ctx-row:hover .ctx-row-alias { opacity: 1; }\n.ctx-row-alias:hover {\n color: var(--sy-accent, #e2e2e2);\n background: var(--sy-hover-overlay, rgba(255,255,255,.08));\n}\n\n.ctx-row-type {\n font-size: 10px; color: var(--sy-text-faint, #4a4a4a);\n font-family: 'Inter', sans-serif; flex-shrink: 0;\n}\n\n/* ── Middle panel ───────────────────────────────────────────────────────────── */\n.editor-stack {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.editor-pane {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n}\n/* Op-colored left-edge stripe — peripheral reminder of which op is\n bound to this pane. Same hue family as the title text + the toolbar\n op chip; muted so it doesn't compete with the chip strip up top. */\n.editor-pane::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: transparent;\n pointer-events: none;\n z-index: 1;\n}\n/* Gutter stripe kept transparent for now (op is declared by the @verb in\n the buffer, not by a pane color). Re-introduce per-mode tint later if it\n helps; transparent avoids a stale per-op color while the model lands. */\n\n/* The only two-pane op is SQL ([:sql :params]). The vertical drag handle\n pins the TOP pane (SQL) to an explicit height, so the BOTTOM pane\n (params) must be the flexible filler — it absorbs whatever height the\n drag leaves. flex-basis:0 + grow 2:1 gives a ~66/33 default split;\n after a drag the params pane grows/shrinks to fill the remainder. */\n.editor-pane:first-child:not(:only-child) { flex: 2 1 0; min-height: 120px; }\n.editor-pane:last-child:not(:only-child) { flex: 1 1 0; min-height: 90px; }\n.editor-label {\n padding: 0 12px;\n height: 36px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--sy-text-muted, #666);\n background: var(--sy-bg-surface, #1e1e1e);\n border-bottom: 1px solid var(--sy-border-subtle, #222);\n flex-shrink: 0;\n font-family: 'Inter', sans-serif;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n.editor-label-text { flex: 0 0 auto; }\n/* Op-specific accent on the :query role label. Visual link to the op-tabs\n pill in the top bar so the user always knows which op is bound to the\n editor below. Read ops borrow the read accent, writes the write accent;\n sql falls back to the generic accent. */\n.op-label { color: var(--sy-text-primary, #d4d4d4); }\n.op-label--search,\n.op-label--get,\n.op-label--aggregate,\n.op-label--search-tree,\n.op-label--get-tree { color: var(--sy-op-read, #c6cad1); }\n.op-label--sync,\n.op-label--stack,\n.op-label--delete,\n.op-label--slice,\n.op-label--purge { color: var(--sy-op-write, #f0f0f0); }\n.op-label--sql-template,\n.op-label--sql { color: var(--sy-accent, #e2e2e2); }\n/* Role hint — quiet helper text after the role name (SQL / params). */\n.editor-label-hint {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: 'JetBrains Mono','Fira Code',monospace;\n font-size: 10px;\n font-weight: 400;\n letter-spacing: 0;\n text-transform: none;\n color: var(--sy-text-faint, #555);\n}\n.editor-label-hint b {\n color: var(--sy-accent, #e2e2e2);\n font-weight: 700;\n}\n/* Help (?) button — small circular badge anchored at the right edge of\n the editor-label. Opens the XSQL quick-reference modal. Sits inside\n the label row so users see it next to \"PURGE · Project\" while\n composing, not buried in the top toolbar. */\n.editor-label-help {\n width: 19px;\n height: 19px;\n flex-shrink: 0;\n border-radius: 50%;\n border: 1px solid var(--sy-border, #2a2a2a);\n background: var(--sy-bg-app, #161616);\n color: var(--sy-text-muted, #888);\n font-family: 'Inter', sans-serif;\n font-size: 11px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: 0;\n text-transform: none;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: relative;\n transition: color .12s, background .12s, border-color .12s;\n}\n.editor-label-help:hover {\n color: var(--sy-accent, #e2e2e2);\n border-color: var(--sy-accent, #e2e2e2);\n background: var(--sy-accent-tint, rgba(255, 255, 255,.14));\n}\n\n.editor-container { flex: 1; min-height: 0; overflow: hidden; position: relative; }\n\n/* ── Insert-example overlay ─────────────────────────────────────────────────\n Shown over an empty editor pane. Full-pane container is transparent\n to mouse events so CM clicks/keyboard still reach the editor; the\n pill button in the middle re-opts into pointer events. Once the\n user inserts (or starts typing), the overlay unmounts and the CM\n host is the only thing left in the container. */\n\n/* ── SQL-template params form ──────────────────────────────────────────\n The :sql op's params pane is a typed form (one labelled input per\n `?name` placeholder), not a CodeMirror editor. */\n\n/* Data variable — a mutation's record data, edited via a JSON panel. */\n.data-var { display: flex; flex-direction: column; gap: 8px; }\n\n.editor-footer {\n border-top: 1px solid var(--sy-border, #2a2a2a);\n padding: 8px 12px;\n display: flex;\n align-items: center;\n gap: 10px;\n flex-shrink: 0;\n background: var(--sy-bg-panel, #1a1a1a);\n}\n.execute-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--sy-accent, #e2e2e2);\n color: var(--sy-text-on-accent, #1a1a1a);\n border: none;\n border-radius: 5px;\n padding: 5px 14px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n font-family: 'Inter', sans-serif;\n transition: background .15s;\n}\n.execute-btn:hover { background: var(--sy-accent-hover, #ffffff); }\n.execute-btn:disabled { background: var(--sy-border, #2a2a2a); color: var(--sy-text-muted, #555); cursor: not-allowed; }\n.execute-hint { font-size: 11px; color: var(--sy-text-faint, #3a3a3a); font-family: 'JetBrains Mono', monospace; }\n\n.lint-err-badge {\n font-size: 10px; font-weight: 600;\n background: var(--sy-error-tint, rgba(247,118,142,.15));\n color: var(--sy-error, #f7768e);\n padding: 2px 8px; border-radius: 3px;\n font-family: 'Inter', sans-serif;\n}\n\n/* ── Right panel ────────────────────────────────────────────────────────────── */\n.result-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0 12px;\n height: 36px;\n border-bottom: 1px solid var(--sy-border-subtle, #222);\n flex-shrink: 0;\n background: var(--sy-bg-panel, #1a1a1a);\n}\n.result-label { font-size: 11px; font-weight: 600; color: var(--sy-text-muted, #555); }\n\n/* Batch result tabs: raw | alias | alias … */\n.result-tabs {\n display: flex;\n align-items: center;\n gap: 2px;\n flex: 1;\n overflow-x: auto;\n}\n.result-tab {\n background: none;\n border: none;\n padding: 2px 8px;\n font-family: 'JetBrains Mono','Fira Code',monospace;\n font-size: 10px;\n color: var(--sy-text-muted, #666);\n border-radius: 3px;\n cursor: pointer;\n white-space: nowrap;\n transition: background .12s, color .12s;\n}\n.result-tab:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.05)); color: var(--sy-text-primary, #d4d4d4); }\n.result-tab.active { background: var(--sy-accent-tint, rgba(255, 255, 255,.14)); color: var(--sy-accent, #e2e2e2); }\n.result-stats {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n}\n.result-count { font-size: 11px; color: var(--sy-accent, #e2e2e2); font-weight: 600; }\n.result-timing { font-size: 11px; color: var(--sy-text-faint, #3a3a3a); }\n.result-err-badge {\n font-size: 10px; font-weight: 600;\n background: var(--sy-error-tint, rgba(247,118,142,.15));\n color: var(--sy-error, #f7768e);\n padding: 1px 6px; border-radius: 3px;\n}\n.tree-view-toggle {\n appearance: none;\n background: var(--sy-bg-band, #1f1f1f);\n border: 1px solid var(--sy-border, #2a2a2a);\n color: var(--sy-text-secondary, #6a6a6a);\n font-family: 'JetBrains Mono','Fira Code','Cascadia Code',monospace;\n font-size: 10px;\n font-weight: 500;\n padding: 1px 8px;\n border-radius: 10px;\n cursor: pointer;\n line-height: 1.5;\n transition: color 0.1s, background 0.1s, border-color 0.1s;\n}\n.tree-view-toggle:hover { color: var(--sy-text-primary, #c0c0c0); border-color: var(--sy-border, #3a3a3a); }\n.tree-view-toggle.active {\n background: var(--sy-recur-tint, rgba(99, 102, 241, 0.18));\n border-color: var(--sy-recur-border, rgba(99, 102, 241, 0.55));\n color: var(--sy-recur, #c6cad1);\n}\n.tree-view-toggle.active:hover {\n background: var(--sy-recur-tint, rgba(99, 102, 241, 0.28));\n color: var(--sy-recur-strong, #e2e2e2);\n}\n/* Result body: stable wrapper holding three mutually exclusive panes\n (CM editor / error text / placeholder). CSS-driven visibility keeps the\n CM host mounted across state changes — see ui.cljs `result-panel`. */\n.result-body {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n.result-cm-host { flex: 1; min-height: 0; overflow: hidden; }\n.result-cm-host .cm-editor { height: 100%; }\n.result-err {\n flex: 1;\n overflow: auto;\n padding: 12px;\n margin: 0;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 12px;\n line-height: 1.7;\n color: var(--sy-error, #f7768e);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n.result-placeholder {\n padding: 12px;\n color: var(--sy-text-faint, #333);\n font-style: italic;\n font-family: 'Inter', sans-serif;\n}\n\n/* All [data-tooltip] tooltip styling lives in component.cljs `tooltip-css`\n (native string, defstyles-proof) — single source for every tooltip. */\n\n/* ── Login gate ─────────────────────────────────────────────────────────────── */\n\n/* ── Spinner ────────────────────────────────────────────────────────────────── */\n.spinner {\n display: inline-block;\n width: 10px; height: 10px;\n /* Sits on the accent button — color tracks the button text token so\n the spinner contrasts no matter the theme. */\n border: 2px solid color-mix(in srgb, var(--sy-text-on-accent, #1a1a1a) 30%, transparent);\n border-top-color: var(--sy-text-on-accent, #1a1a1a);\n border-radius: 50%;\n animation: spin .6s linear infinite;\n}\n@keyframes spin { to { transform: rotate(360deg); } }\n\n/* ── CodeMirror tooltip (autocomplete + lint) ────────────────────────────────\n Tooltips are appended to shadow-root via tooltips({parent}) to escape\n overflow:hidden on .panel-mid. They need position:fixed to stay in view. */\n.cm-tooltip {\n z-index: 10000;\n}\n.cm-tooltip.cm-tooltip-autocomplete {\n background: var(--sy-bg-surface, #1e1e1e);\n border: 1px solid var(--sy-border, #3a3a3a);\n border-radius: 6px;\n box-shadow: 0 4px 16px rgba(0,0,0,.5);\n padding: 4px 0;\n}\n/* Selector specificity (0,3,1) bumped via doubled .cm-tooltip class so\n our sizing wins over @codemirror/autocomplete's default theme rule\n `.ͼ1 .cm-tooltip.cm-tooltip-autocomplete \x3e ul` (also 0,3,1, but loaded\n first — equal specificity, later sheet wins). */\n.cm-tooltip.cm-tooltip.cm-tooltip-autocomplete \x3e ul {\n font-family: 'JetBrains Mono', monospace;\n font-size: 13px;\n max-height: 440px;\n min-width: 360px;\n max-width: 600px;\n}\n.cm-tooltip.cm-tooltip.cm-tooltip-autocomplete \x3e ul \x3e li {\n display: flex;\n align-items: center;\n gap: 10px;\n /* 2px transparent border reserves the accent slot — selecting a row\n swaps the colour in without shifting layout. */\n border-left: 2px solid transparent;\n padding: 8px 14px 8px 12px;\n margin-bottom: 2px;\n line-height: 1.5;\n}\n.cm-tooltip-autocomplete \x3e ul \x3e li:last-child { margin-bottom: 0; }\n/* Selector specificity bumped via doubled .cm-tooltip class so our overrides\n beat the @codemirror/autocomplete default theme (which uses solid blue +\n white text for the selected row and is loaded after console.css). */\n.cm-tooltip.cm-tooltip-autocomplete \x3e ul \x3e li[aria-selected] {\n background: var(--sy-accent-tint, rgba(255, 255, 255,.18));\n color: var(--sy-text-primary, #d4d4d4);\n border-left-color: var(--sy-accent, #e2e2e2);\n}\n.cm-tooltip.cm-tooltip-autocomplete \x3e ul \x3e li .cm-completionLabel { color: var(--sy-text-primary, #d4d4d4); }\n.cm-tooltip.cm-tooltip-autocomplete \x3e ul \x3e li .cm-completionMatchedText { color: var(--sy-accent, #e2e2e2); font-weight: 600; text-decoration: none; }\n.cm-tooltip.cm-tooltip-autocomplete \x3e ul \x3e li .cm-completionDetail { color: var(--sy-text-muted, #555); margin-left: auto; padding-left: 16px;\n font-style: normal; font-size: 11px; }\n\n/* Section headers — small caps label + faint divider above each group. */\n.cm-completionSectionHeader {\n padding: 6px 12px 3px;\n font-size: 10px;\n font-weight: 600;\n letter-spacing: .08em;\n text-transform: uppercase;\n color: var(--sy-text-muted, #555);\n border-top: 1px solid var(--sy-border, #2a2a2a);\n margin-top: 2px;\n}\n.cm-tooltip-autocomplete \x3e ul \x3e .cm-completionSectionHeader:first-child {\n border-top: none;\n margin-top: 0;\n}\n\n/* Lucide icons via mask-image so colour stays theme-driven. The default\n ::after glyphs are suppressed; each `-type` variant supplies its own\n SVG mask and tint. */\n.cm-completionIcon {\n width: 14px;\n height: 14px;\n flex-shrink: 0;\n font-size: 0; /* hide CM's default text glyph */\n padding: 0;\n opacity: 1;\n -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;\n -webkit-mask-position: center; mask-position: center;\n -webkit-mask-size: 14px 14px; mask-size: 14px 14px;\n background-color: var(--sy-syntax-punct, #5c6068); /* fallback tint */\n}\n.cm-completionIcon::after { content: none !important; }\n\n/* database — root ENTITY (XSQL `:type \"class\"`). Without this rule entities\n had no icon, since the per-type masks below don't cover `class`. */\n.cm-completionIcon-class {\n background-color: var(--sy-syntax-keyword, #e2e2e2);\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cellipse cx\x3d'12' cy\x3d'5' rx\x3d'9' ry\x3d'3'/\x3e\x3cpath d\x3d'M3 5v14a9 3 0 0 0 18 0V5'/\x3e\x3cpath d\x3d'M3 12a9 3 0 0 0 18 0'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cellipse cx\x3d'12' cy\x3d'5' rx\x3d'9' ry\x3d'3'/\x3e\x3cpath d\x3d'M3 5v14a9 3 0 0 0 18 0V5'/\x3e\x3cpath d\x3d'M3 12a9 3 0 0 0 18 0'/\x3e\x3c/svg\x3e\");\n}\n\n/* box — entity (table) reference, used by SQL {…} placeholder completion */\n.cm-completionIcon-type {\n background-color: var(--sy-syntax-keyword, #e2e2e2);\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z'/\x3e\x3cpath d\x3d'm3.3 7 8.7 5 8.7-5'/\x3e\x3cpath d\x3d'M12 22V12'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z'/\x3e\x3cpath d\x3d'm3.3 7 8.7 5 8.7-5'/\x3e\x3cpath d\x3d'M12 22V12'/\x3e\x3c/svg\x3e\");\n}\n\n/* circle-dot — attribute (entity scalar) */\n.cm-completionIcon-attribute,\n.cm-completionIcon-variable {\n background-color: var(--sy-syntax-key, #a8adb5);\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3ccircle cx\x3d'12' cy\x3d'12' r\x3d'10'/\x3e\x3ccircle cx\x3d'12' cy\x3d'12' r\x3d'1'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3ccircle cx\x3d'12' cy\x3d'12' r\x3d'10'/\x3e\x3ccircle cx\x3d'12' cy\x3d'12' r\x3d'1'/\x3e\x3c/svg\x3e\");\n}\n\n/* arrow-right — relation; matches the → in the editor */\n.cm-completionIcon-relation,\n.cm-completionIcon-property {\n background-color: var(--sy-syntax-relation, #f0f0f0);\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'M5 12h14'/\x3e\x3cpath d\x3d'm12 5 7 7-7 7'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'M5 12h14'/\x3e\x3cpath d\x3d'm12 5 7 7-7 7'/\x3e\x3c/svg\x3e\");\n}\n\n/* sliders-horizontal — structural operators (_args, _count, _agg, _limit, …) */\n.cm-completionIcon-keyword {\n background-color: var(--sy-syntax-keyword, #e2e2e2);\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cline x1\x3d'21' y1\x3d'4' x2\x3d'14' y2\x3d'4'/\x3e\x3cline x1\x3d'10' y1\x3d'4' x2\x3d'3' y2\x3d'4'/\x3e\x3cline x1\x3d'21' y1\x3d'12' x2\x3d'12' y2\x3d'12'/\x3e\x3cline x1\x3d'8' y1\x3d'12' x2\x3d'3' y2\x3d'12'/\x3e\x3cline x1\x3d'21' y1\x3d'20' x2\x3d'16' y2\x3d'20'/\x3e\x3cline x1\x3d'12' y1\x3d'20' x2\x3d'3' y2\x3d'20'/\x3e\x3cline x1\x3d'14' y1\x3d'2' x2\x3d'14' y2\x3d'6'/\x3e\x3cline x1\x3d'8' y1\x3d'10' x2\x3d'8' y2\x3d'14'/\x3e\x3cline x1\x3d'16' y1\x3d'18' x2\x3d'16' y2\x3d'22'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cline x1\x3d'21' y1\x3d'4' x2\x3d'14' y2\x3d'4'/\x3e\x3cline x1\x3d'10' y1\x3d'4' x2\x3d'3' y2\x3d'4'/\x3e\x3cline x1\x3d'21' y1\x3d'12' x2\x3d'12' y2\x3d'12'/\x3e\x3cline x1\x3d'8' y1\x3d'12' x2\x3d'3' y2\x3d'12'/\x3e\x3cline x1\x3d'21' y1\x3d'20' x2\x3d'16' y2\x3d'20'/\x3e\x3cline x1\x3d'12' y1\x3d'20' x2\x3d'3' y2\x3d'20'/\x3e\x3cline x1\x3d'14' y1\x3d'2' x2\x3d'14' y2\x3d'6'/\x3e\x3cline x1\x3d'8' y1\x3d'10' x2\x3d'8' y2\x3d'14'/\x3e\x3cline x1\x3d'16' y1\x3d'18' x2\x3d'16' y2\x3d'22'/\x3e\x3c/svg\x3e\");\n}\n\n/* equal — comparison operators (\x3d, !\x3d, like, ilike, in, …) */\n.cm-completionIcon-operator {\n background-color: var(--sy-syntax-literal, #d0d4da);\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cline x1\x3d'5' y1\x3d'9' x2\x3d'19' y2\x3d'9'/\x3e\x3cline x1\x3d'5' y1\x3d'15' x2\x3d'19' y2\x3d'15'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cline x1\x3d'5' y1\x3d'9' x2\x3d'19' y2\x3d'9'/\x3e\x3cline x1\x3d'5' y1\x3d'15' x2\x3d'19' y2\x3d'15'/\x3e\x3c/svg\x3e\");\n}\n\n/* sigma — aggregate functions (avg, sum, min, max) */\n.cm-completionIcon-function,\n.cm-completionIcon-method {\n background-color: #e0af68;\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'M18 7V5a1 1 0 0 0-1-1H6.5a.5.5 0 0 0-.4.8l4.5 6a2 2 0 0 1 0 2.4l-4.5 6a.5.5 0 0 0 .4.8H17a1 1 0 0 0 1-1v-2'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'M18 7V5a1 1 0 0 0-1-1H6.5a.5.5 0 0 0-.4.8l4.5 6a2 2 0 0 1 0 2.4l-4.5 6a.5.5 0 0 0 .4.8H17a1 1 0 0 0 1-1v-2'/\x3e\x3c/svg\x3e\");\n}\n\n/* hash — literals/constants (true, false, null, asc, desc) */\n.cm-completionIcon-constant,\n.cm-completionIcon-enum {\n background-color: var(--sy-error, #f7768e);\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cline x1\x3d'4' y1\x3d'9' x2\x3d'20' y2\x3d'9'/\x3e\x3cline x1\x3d'4' y1\x3d'15' x2\x3d'20' y2\x3d'15'/\x3e\x3cline x1\x3d'10' y1\x3d'3' x2\x3d'8' y2\x3d'21'/\x3e\x3cline x1\x3d'16' y1\x3d'3' x2\x3d'14' y2\x3d'21'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cline x1\x3d'4' y1\x3d'9' x2\x3d'20' y2\x3d'9'/\x3e\x3cline x1\x3d'4' y1\x3d'15' x2\x3d'20' y2\x3d'15'/\x3e\x3cline x1\x3d'10' y1\x3d'3' x2\x3d'8' y2\x3d'21'/\x3e\x3cline x1\x3d'16' y1\x3d'3' x2\x3d'14' y2\x3d'21'/\x3e\x3c/svg\x3e\");\n}\n\n/* code — snippet templates (LIKE patterns, in() lists) */\n.cm-completionIcon-text {\n background-color: #9aa0a8;\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'm16 18 6-6-6-6'/\x3e\x3cpath d\x3d'm8 6-6 6 6 6'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'm16 18 6-6-6-6'/\x3e\x3cpath d\x3d'm8 6-6 6 6 6'/\x3e\x3c/svg\x3e\");\n}\n\n/* ── XSQL help modal ─────────────────────────────────────────────────────────\n Centered modal with a dark backdrop. The backdrop sits above .panels\n (z\x3d200) but below CodeMirror autocomplete tooltips (z\x3d1000+). Body\n scrolls inside the modal; the backdrop never scrolls. */\n.help-backdrop {\n position: absolute;\n inset: 0;\n background: rgba(8, 10, 16, 0.66);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 500;\n outline: none;\n animation: help-backdrop-in .12s ease;\n}\n@keyframes help-backdrop-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.help-modal {\n background: var(--sy-bg-surface, #1e1e1e);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 10px;\n width: min(960px, 94vw);\n height: min(720px, 88vh);\n display: flex;\n overflow: hidden;\n box-shadow: 0 22px 60px rgba(0, 0, 0, 0.55);\n animation: help-modal-in .14s ease;\n}\n@keyframes help-modal-in {\n from { opacity: 0; transform: translateY(8px) scale(.985); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n\n.help-nav {\n flex: 0 0 188px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 16px 10px;\n background: var(--sy-bg-band, #181818);\n border-right: 1px solid var(--sy-border, #2a2a2a);\n overflow-y: auto;\n}\n.help-nav-title {\n font-family: 'JetBrains Mono', monospace;\n font-size: 11px;\n font-weight: 700;\n letter-spacing: .14em;\n color: var(--sy-text-faint, #666);\n padding: 0 10px 12px;\n}\n.help-nav-tab {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 1px;\n width: 100%;\n padding: 8px 10px 8px 12px;\n border: none;\n border-radius: 6px;\n background: none;\n text-align: left;\n cursor: pointer;\n position: relative;\n transition: background .12s;\n}\n.help-nav-tab:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.05)); }\n.help-nav-tab.active { background: var(--sy-accent-tint, rgba(255,255,255,.08)); }\n.help-nav-tab.active::before {\n content: \"\";\n position: absolute;\n left: 0; top: 8px; bottom: 8px;\n width: 3px;\n border-radius: 2px;\n background: var(--sy-chip-read);\n}\n.help-nav-label {\n font-family: 'Inter', sans-serif;\n font-size: 13px;\n font-weight: 600;\n color: var(--sy-text-secondary, #aaa);\n}\n.help-nav-tab.active .help-nav-label { color: var(--sy-text-primary, #e8e8e8); }\n.help-nav-sub {\n font-family: 'Inter', sans-serif;\n font-size: 11px;\n color: var(--sy-text-faint, #666);\n}\n.help-main {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n.help-body { flex: 1; min-height: 0; animation: help-tab-in .14s ease; }\n@keyframes help-tab-in {\n from { opacity: 0; transform: translateX(6px); }\n to { opacity: 1; transform: none; }\n}\n.help-lede {\n font-size: 14px;\n line-height: 1.6;\n color: var(--sy-text-secondary, #bbb);\n margin: 0 0 14px;\n}\n.help-op {\n font-family: 'JetBrains Mono', monospace;\n font-size: 12px;\n font-weight: 600;\n}\n.help-op--read { color: var(--sy-chip-read); }\n.help-op--write { color: var(--sy-chip-write); }\n.help-op--destroy { color: var(--sy-chip-destroy); }\n.help-table td code.help-op,\n.help-section-title .help-op { background: none; padding: 0; }\n.help-kbd {\n font-family: 'JetBrains Mono', monospace;\n font-size: 11px;\n padding: 1px 6px;\n margin: 0 2px;\n border-radius: 4px;\n border: 1px solid var(--sy-border, #333);\n border-bottom-width: 2px;\n background: var(--sy-bg-band, #1a1a1a);\n color: var(--sy-text-primary, #e8e8e8);\n}\n.help-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px 12px 20px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n flex-shrink: 0;\n}\n.help-title {\n margin: 0;\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: var(--sy-text-primary, #d4d4d4);\n letter-spacing: 0.01em;\n}\n.help-close {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--sy-text-muted, #666);\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n transition: color .12s, background .12s;\n}\n.help-close:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.06)); color: var(--sy-text-primary, #d4d4d4); }\n.help-body {\n padding: 16px 22px 22px;\n overflow-y: auto;\n font-family: 'Inter', sans-serif;\n font-size: 13px;\n line-height: 1.55;\n color: var(--sy-text-primary, #d4d4d4);\n}\n.help-body::-webkit-scrollbar { width: 8px; }\n.help-body::-webkit-scrollbar-thumb {\n background: var(--sy-border, #2a2a2a);\n border-radius: 4px;\n}\n\n.help-section {\n margin-bottom: 22px;\n}\n.help-section:last-child { margin-bottom: 4px; }\n.help-section-title {\n margin: 0 0 8px;\n font-family: 'Inter', sans-serif;\n font-size: 12px;\n font-weight: 600;\n color: var(--sy-text-muted, #888);\n text-transform: uppercase;\n letter-spacing: 0.08em;\n}\n\n.help-section-title {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n.help-title {\n display: flex;\n align-items: center;\n gap: 7px;\n}\n\n.help-prose {\n margin: 0 0 10px;\n color: var(--sy-text-primary, #d4d4d4);\n}\n.help-prose:last-child { margin-bottom: 0; }\n.help-prose b { color: var(--sy-text-primary, #e8e8e8); font-weight: 600; }\n\n.help-list {\n margin: 0 0 10px;\n padding-left: 18px;\n}\n.help-list li {\n margin-bottom: 4px;\n color: var(--sy-text-primary, #cccccc);\n}\n.help-list li::marker { color: var(--sy-text-faint, #555); }\n.help-list b { color: var(--sy-text-primary, #e8e8e8); font-weight: 600; }\n\n.help-code {\n background: var(--sy-bg-app, #161616);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 6px;\n padding: 10px 12px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 12px;\n line-height: 1.5;\n color: var(--sy-text-primary, #d4d4d4);\n overflow-x: auto;\n margin: 0 0 10px;\n white-space: pre;\n}\n\n.help-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n margin-bottom: 6px;\n}\n.help-table th,\n.help-table td {\n text-align: left;\n padding: 5px 10px 5px 0;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n}\n.help-table th {\n font-size: 11px;\n font-weight: 600;\n color: var(--sy-text-muted, #888);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n.help-table td code,\n.help-list code,\n.help-prose code {\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 12px;\n background: var(--sy-hover-overlay, rgba(255,255,255,.05));\n padding: 1px 6px;\n border-radius: 3px;\n color: var(--sy-text-primary, #e8e8e8);\n}\n");
|
|
2761
|
+
iwa(a),window.customElements.get(a))};var c2=new CSSStyleSheet;c2.replaceSync("/* ── Host ───────────────────────────────────────────────────────────────────── */\n:host {\n display: none;\n position: fixed;\n inset: 0;\n z-index: 9998;\n font-family: 'Inter', system-ui, -apple-system, sans-serif;\n font-size: 13px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n /* NOTE: ALL tooltip CSS (tokens + [data-tooltip] + CM lint) lives in\n component.cljs `tooltip-css` — defstyles drops custom-prop defs AND the\n cm-lint rule block, so tooltips must be applied natively, not from here. */\n}\n:host([open]) { display: block; }\n\n/* CodeMirror lint tooltip + diagnostic + lintRange styling lives in\n component.cljs `tooltip-css` (native string) — defstyles drops the whole\n block from this file, so it MUST NOT live here. See that def. */\n/* Gutter markers. */\n.cm-lint-marker-error { color: #f7768e; }\n.cm-lint-marker-warning { color: #e0af68; }\n\n*, *::before, *::after { box-sizing: border-box; }\n\n/* ── Root layout ────────────────────────────────────────────────────────────── */\n.console {\n position: relative; /* containing block for .confirm-backdrop */\n isolation: isolate; /* keeps z-index:-1 starfield above .console bg */\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background: var(--sy-bg-app, #161616);\n color: var(--sy-text-primary, #d4d4d4);\n}\n\n/* Inline variable chips (var_chips.cljs) — plain editor-content decorations,\n not CM tooltips (the fill-in POPUP is a tooltip and lives in\n component.cljs's native `tooltip-css` for that reason — see the comment\n there). Chips have no opaque background of their own, just a translucent\n tint, so they must stay theme-reactive: var(--sy-hover-overlay) etc. flip\n tint direction per theme (white-on-dark / black-on-light) — a fixed\n always-white tint was tried and went invisible on a light background. */\n.cm-var-chip {\n display: inline-block;\n margin-left: 5px;\n padding: 0 6px;\n border-radius: 4px;\n font-size: 10px;\n line-height: 15px;\n vertical-align: baseline;\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n border: 1px solid transparent;\n transition: border-color .12s, background .12s;\n}\n.cm-var-chip--set {\n color: var(--sy-accent, #e2e2e2);\n background: var(--sy-accent-tint, rgba(255, 255, 255,.14));\n}\n.cm-var-chip--set:hover { border-color: var(--sy-accent, #e2e2e2); }\n.cm-var-chip--default {\n /* --sy-text-muted fails AA contrast on the light popup/chip background\n (~4:1, needs 4.5:1) — text-secondary is the next step up the scale\n and passes comfortably in both themes. */\n color: var(--sy-text-secondary, #999);\n background: var(--sy-hover-overlay, rgba(255,255,255,.05));\n font-style: italic;\n}\n.cm-var-chip--default:hover { border-color: var(--sy-text-secondary, #999); }\n.cm-var-chip--unset {\n color: var(--sy-op-write, #f0f0f0);\n background: var(--sy-op-write-tint, rgba(255, 255, 255,.12));\n}\n.cm-var-chip--unset:hover { border-color: var(--sy-op-write, #f0f0f0); }\n.cm-var-chip--invalid {\n color: var(--sy-chip-destroy);\n background: var(--sy-op-destroy-tint, rgba(247,118,142,.14));\n}\n.cm-var-chip--invalid:hover { border-color: var(--sy-chip-destroy); }\n\n/* ── Confirm modal (replaces js/confirm) ────────────────────────────────────── */\n.confirm-backdrop {\n position: absolute;\n inset: 0;\n z-index: 10001; /* above everything in the console */\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, .55);\n}\n.confirm-card {\n min-width: 320px;\n max-width: 480px;\n padding: 18px 20px 16px;\n background: var(--sy-bg-app, #161616);\n border: 1px solid var(--sy-border, rgba(255,255,255,.14));\n border-radius: 8px;\n box-shadow: 0 12px 40px rgba(0,0,0,.5);\n outline: none;\n}\n.confirm-message {\n font-size: 13px;\n line-height: 1.5;\n color: var(--sy-text-primary, #d4d4d4);\n margin-bottom: 16px;\n word-break: break-word;\n}\n.confirm-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n}\n.confirm-btn {\n padding: 5px 14px;\n font-size: 12px;\n border-radius: 5px;\n cursor: pointer;\n background: var(--sy-hover-overlay, rgba(255,255,255,.06));\n border: 1px solid var(--sy-border, rgba(255,255,255,.14));\n color: var(--sy-text-primary, #d4d4d4);\n}\n.confirm-btn:hover { background: var(--sy-active-overlay, rgba(255,255,255,.1)); }\n.confirm-btn--danger {\n background: var(--sy-danger-tint, rgba(247,118,142,.12));\n border-color: var(--sy-danger, #f7768e);\n color: var(--sy-danger, #f7768e);\n}\n.confirm-btn--danger:hover { background: var(--sy-danger-tint-strong, rgba(247,118,142,.22)); }\n\n/* Console-wide scrollbars: thin, dark, and crucially NO arrow buttons. The OS\n (GTK on Linux) otherwise paints up/down (or left/right) arrow buttons on any\n overflowing container — tiny, hard to click, easy to mistake for real UI. */\n.console *::-webkit-scrollbar { width: 10px; height: 10px; }\n.console *::-webkit-scrollbar-button { display: none; width: 0; height: 0; }\n.console *::-webkit-scrollbar-track { background: transparent; }\n.console *::-webkit-scrollbar-thumb {\n background: var(--sy-border, #2a2a2a);\n border-radius: 6px;\n}\n.console *::-webkit-scrollbar-thumb:hover { background: var(--sy-text-muted, #555); }\n.console * { scrollbar-width: thin; scrollbar-color: var(--sy-border, #2a2a2a) transparent; }\n\n/* ── Toolbar ────────────────────────────────────────────────────────────────── */\n.toolbar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 12px;\n height: 38px;\n background: var(--sy-bg-surface, #1e1e1e);\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n flex-shrink: 0;\n}\n.toolbar-brand {\n display: flex;\n align-items: center;\n margin-top: 10px;\n margin-left: -10px;\n pointer-events: none;\n}\n.toolbar-brand svg { height: 28px; width: auto; display: block; }\n.toolbar-title {\n margin-top: 4px;\n font-size: 11px;\n font-weight: 600;\n color: var(--sy-text-muted, #666);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n}\n\n/* ── Op tabs (in toolbar) ───────────────────────────────────────────────────── */\n\n/* Buffer operations — the @-ops defined in the current XSQL buffer, as\n verb-colored chips in the toolbar. Click to run one. The op color follows\n its view (read\x3dblue, mutate\x3damber, destroy\x3dred) via .op-label--*. */\n.buffer-ops {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-right: 6px;\n overflow-x: auto;\n max-width: 60%;\n}\n.buffer-op {\n display: inline-flex;\n align-items: baseline;\n gap: 5px;\n background: var(--sy-hover-overlay, rgba(255,255,255,.04));\n border: 1px solid transparent;\n padding: 2px 9px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 11px;\n border-radius: 4px;\n cursor: pointer;\n white-space: nowrap;\n transition: background .12s, border-color .12s;\n}\n.buffer-op:hover { background: var(--sy-active-overlay, rgba(255,255,255,.08)); border-color: currentColor; }\n.buffer-op-run { display: inline-flex; align-self: center; opacity: .45; transition: opacity .12s; }\n.buffer-op-run svg { width: 9px; height: 9px; }\n.buffer-op:hover .buffer-op-run { opacity: .9; }\n.buffer-op:disabled { cursor: default; opacity: .4; }\n.buffer-op:disabled:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.04)); border-color: transparent; }\n.buffer-op--running,\n.buffer-op--running:disabled { opacity: 1; border-color: currentColor; }\n.buffer-op--running .buffer-op-run { opacity: 1; }\n.buffer-op-spinner { animation: buffer-op-spin .8s linear infinite; }\n@keyframes buffer-op-spin { to { transform: rotate(360deg); } }\n.buffer-op-verb { font-size: 9.5px; font-weight: 600; opacity: .85; } /* inherits op-label--* color */\n.buffer-op.op-label--read { color: var(--sy-chip-read) !important; }\n.buffer-op.op-label--mutate { color: var(--sy-chip-write) !important; }\n.buffer-op.op-label--destroy { color: var(--sy-chip-destroy) !important; }\n.buffer-op.op-label--read .buffer-op-verb,\n.buffer-op.op-label--mutate .buffer-op-verb,\n.buffer-op.op-label--destroy .buffer-op-verb { opacity: 1; }\n.buffer-op-ns { color: var(--sy-text-muted, #8a8a8a); } /* namespace qualifier, dimmed */\n.buffer-op-name { color: var(--sy-text-primary, #d4d4d4); }\n/* @watch toggle — edits the op's @watch header line (live intent lives in the\n buffer, not UI state). Ghosted until hover; accent when on. */\n.buffer-op-watch { display: inline-flex; align-self: center; opacity: .22; transition: opacity .12s; }\n.buffer-op:hover .buffer-op-watch { opacity: .55; }\n.buffer-op .buffer-op-watch:hover { opacity: .9; }\n.buffer-op-watch.on,\n.buffer-op:hover .buffer-op-watch.on { opacity: 1; color: var(--sy-accent, #e2e2e2); }\n/* @batch chip — distinct accent so compositions read apart from single ops. */\n.buffer-op--batch { color: var(--sy-accent, #e2e2e2); background: var(--sy-accent-tint, rgba(255, 255, 255,.10)); }\n.buffer-op--batch .buffer-op-verb { opacity: 1; }\n/* op with lint errors — red, matching the editor's error color */\n.buffer-op--error { border-color: rgba(247,118,142,.55) !important; }\n.buffer-op--error .buffer-op-name,\n.buffer-op--error .buffer-op-verb { color: #f7768e; }\n/* Run-chips now live at the top of the results pane (moved out of the toolbar).\n Full-width runbar with a divider, not the toolbar's 60% cap. Hidden when the\n buffer declares no named ops. */\n.panel-right \x3e .buffer-ops {\n max-width: none;\n margin: 0;\n padding: 8px 12px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n flex-shrink: 0;\n /* Wrap chips to a new line instead of scrolling — a scrolling container\n gets the OS scrollbar's arrow buttons (tiny, hard to click), which is\n what looked like stray up/down buttons in the runbar. */\n overflow-x: visible;\n flex-wrap: wrap;\n row-gap: 4px;\n}\n.panel-right \x3e .buffer-ops:empty { display: none; }\n\n/* Verb chips in the XSQL buffer hint — colored @search/@get/… */\n.verb-chip { font-family: 'JetBrains Mono','Fira Code',monospace; font-weight: 600; }\n\n/* op-label tint follows the mode (read/mutate/destroy). */\n.op-label--read { color: var(--sy-op-read, #c6cad1) !important; }\n.op-label--mutate { color: var(--sy-op-write, #f0f0f0) !important; }\n.op-label--destroy { color: var(--sy-op-destroy, #f7768e) !important; }\n\n.toolbar-btn {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--sy-text-muted, #666);\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: color .12s, background .12s;\n}\n.toolbar-btn:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.06)); color: var(--sy-text-primary, #d4d4d4); }\n\n/* ── Saved-query tabs (in toolbar) ──────────────────────────────────────────── */\n.query-tabs {\n display: flex;\n align-items: center;\n gap: 3px;\n margin-left: 10px;\n /* Fill the toolbar row so the measured width is stable regardless of how\n many tabs render (the JS truncates to fit; it does not rely on scroll). */\n flex: 1 1 0;\n min-width: 0;\n overflow-x: clip;\n overflow-y: visible;\n}\n.query-tab {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n max-width: 160px;\n padding: 3px 6px 3px 9px;\n border-radius: 4px;\n border: 1px solid transparent;\n background: var(--sy-bg-band, #1f1f1f);\n cursor: grab;\n user-select: none;\n -webkit-user-select: none;\n transition: background .12s, border-color .12s, color .12s;\n}\n.query-tab:active { cursor: grabbing; }\n.query-tab.dragging { opacity: .4; }\n.query-tab.drop-before { box-shadow: inset 2px 0 0 var(--sy-accent, #e2e2e2); }\n.query-tab.drop-after { box-shadow: inset -2px 0 0 var(--sy-accent, #e2e2e2); }\n.query-tab:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.06)); }\n.query-tab.active {\n background: var(--sy-accent-tint, rgba(255, 255, 255,.14));\n border-color: var(--sy-accent-border, rgba(255, 255, 255,.4));\n}\n.query-tab-name {\n font-family: 'Inter', sans-serif;\n font-size: 11px;\n font-weight: 500;\n color: var(--sy-text-secondary, #9a9a9a);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.query-tab.active .query-tab-name { color: var(--sy-accent, #e2e2e2); }\n\n.query-tab-close {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 14px;\n height: 14px;\n padding: 0;\n border: none;\n border-radius: 3px;\n background: none;\n cursor: pointer;\n color: var(--sy-text-faint, #555);\n opacity: 0;\n transition: opacity .12s, color .12s, background .12s;\n}\n.query-tab:hover .query-tab-close { opacity: 1; }\n.query-tab-close:hover {\n color: var(--sy-error, #f7768e);\n background: var(--sy-hover-overlay, rgba(255,255,255,.08));\n}\n.query-tab-add {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 22px;\n height: 22px;\n padding: 0;\n border: 1px dashed var(--sy-border, #3a3a3a);\n border-radius: 4px;\n background: none;\n cursor: pointer;\n color: var(--sy-text-muted, #666);\n transition: color .12s, border-color .12s, background .12s;\n}\n.query-tab-add:hover {\n color: var(--sy-accent, #e2e2e2);\n border-color: var(--sy-accent, #e2e2e2);\n background: var(--sy-accent-tint, rgba(255, 255, 255,.1));\n}\n\n/* Overflow chip — how many tabs didn't fit; opens the workspace picker. */\n.query-tab-overflow {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n height: 22px;\n padding: 0 8px;\n font-family: 'JetBrains Mono','Fira Code',monospace;\n font-size: 11px;\n font-weight: 600;\n border: 1px solid var(--sy-border, #3a3a3a);\n border-radius: 4px;\n background: var(--sy-bg-band, #1f1f1f);\n cursor: pointer;\n color: var(--sy-text-secondary, #9a9a9a);\n transition: color .12s, border-color .12s, background .12s;\n}\n.query-tab-overflow:hover {\n color: var(--sy-accent, #e2e2e2);\n border-color: var(--sy-accent-border, rgba(255, 255, 255,.4));\n background: var(--sy-accent-tint, rgba(255, 255, 255,.1));\n}\n\n/* ── Workspace picker modal ─────────────────────────────────────────────────── */\n.ws-picker-card {\n min-width: 320px;\n max-width: 420px;\n max-height: 70vh;\n display: flex;\n flex-direction: column;\n padding: 14px 16px;\n background: var(--sy-bg-app, #161616);\n border: 1px solid var(--sy-border, rgba(255,255,255,.14));\n border-radius: 8px;\n box-shadow: 0 12px 40px rgba(0,0,0,.5);\n outline: none;\n}\n.ws-picker-title {\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: .04em;\n color: var(--sy-text-muted, #888);\n margin-bottom: 10px;\n}\n.ws-picker-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n}\n.ws-picker-row {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 2px 4px 2px 6px;\n border-radius: 5px;\n border: 1px solid transparent;\n}\n.ws-picker-row.active {\n background: var(--sy-accent-tint, rgba(255, 255, 255,.14));\n border-color: var(--sy-accent-border, rgba(255, 255, 255,.4));\n}\n.ws-picker-name {\n flex: 1 1 auto;\n min-width: 0;\n text-align: left;\n font-family: 'Inter', sans-serif;\n font-size: 12px;\n padding: 5px 4px;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--sy-text-primary, #d4d4d4);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.ws-picker-row.active .ws-picker-name { color: var(--sy-accent, #e2e2e2); }\n.ws-picker-move { display: flex; gap: 2px; flex-shrink: 0; }\n.ws-picker-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n padding: 0;\n border: 1px solid transparent;\n border-radius: 4px;\n background: none;\n cursor: pointer;\n color: var(--sy-text-muted, #888);\n transition: color .12s, background .12s;\n}\n.ws-picker-btn:hover:not(:disabled) {\n color: var(--sy-accent, #e2e2e2);\n background: var(--sy-hover-overlay, rgba(255,255,255,.06));\n}\n.ws-picker-btn:disabled { opacity: .3; cursor: default; }\n\n/* ── Panels ─────────────────────────────────────────────────────────────────── */\n.panels {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n.panel {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-width: 0;\n}\n.panel-left { flex-shrink: 0; border-right: 1px solid var(--sy-border, #2a2a2a); background: var(--sy-bg-panel, #1a1a1a); }\n.panel-mid { flex: 1; min-width: 200px; background: var(--sy-bg-surface, #1e1e1e); }\n.panel-right { flex-shrink: 0; border-left: 1px solid var(--sy-border, #2a2a2a); display: flex; flex-direction: column; background: var(--sy-bg-panel, #1a1a1a); }\n\n/* ── Drag handles ───────────────────────────────────────────────────────────── */\n.drag-handle {\n width: 5px;\n flex-shrink: 0;\n background: var(--sy-border, #2a2a2a);\n cursor: col-resize;\n transition: background .15s;\n}\n.drag-handle:hover, .drag-handle.dragging { background: var(--sy-accent, #e2e2e2); }\n\n/* ── Left panel (cursor-context) ────────────────────────────────────────────\n Replaces the old flat entity list — reflects the cursor's scope in the\n XSQL buffer instead. See synthigy.data.console.context-panel; STUB DATA\n until real cursor-position resolution lands (complete.cljc context-at). */\n.ctx-panel {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n min-width: 0;\n}\n\n.ctx-breadcrumb {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n padding: 10px 12px 8px;\n border-bottom: 1px solid var(--sy-border-subtle, #222);\n min-height: 34px;\n flex-shrink: 0;\n}\n.ctx-crumb {\n appearance: none;\n background: transparent;\n border: none;\n padding: 0;\n margin: 0;\n cursor: pointer;\n font-family: 'Inter', sans-serif;\n font-size: 12px;\n font-weight: 600;\n color: var(--sy-text-secondary, #999);\n}\n.ctx-crumb:hover { color: var(--sy-text-primary, #d4d4d4); }\n.ctx-crumb.leaf { color: var(--sy-accent, #e2e2e2); cursor: default; font-family: 'JetBrains Mono', monospace; }\n\n.ctx-crumb-kind {\n margin-left: auto;\n font-size: 9px;\n font-weight: 700;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n padding: 2px 6px;\n border-radius: 4px;\n color: var(--sy-accent, #e2e2e2);\n background: var(--sy-accent-tint, rgba(255, 255, 255,.14));\n white-space: nowrap;\n transition: color .15s, background .15s;\n}\n\n.ctx-path {\n display: flex; flex-wrap: wrap; align-items: center;\n padding: 5px 12px;\n font-family: 'JetBrains Mono', monospace;\n font-size: 11px;\n color: var(--sy-text-secondary, #999);\n border-bottom: 1px solid var(--sy-border-subtle, rgba(255,255,255,.06));\n user-select: none;\n}\n.ctx-path-seg { white-space: nowrap; }\n.ctx-path-seg.leaf { color: var(--sy-accent, #e2e2e2); font-weight: 600; }\n.ctx-path-sep { color: var(--sy-text-faint, #4a4a4a); margin: 0 5px; }\n\n.ctx-scroll { flex: 1; min-height: 0; overflow-y: auto; padding: 4px 0 8px; }\n\n.ctx-empty {\n padding: 16px 12px;\n font-size: 11px;\n font-style: italic;\n color: var(--sy-text-faint, #4a4a4a);\n text-align: center;\n}\n\n.ctx-section-label {\n padding: 10px 12px 4px;\n font-size: 9px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--sy-text-muted, #4a4a4a);\n font-family: 'Inter', sans-serif;\n user-select: none;\n}\n\n.ctx-row {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 3px 12px;\n border: none;\n background: transparent;\n font: inherit;\n font-size: 12px;\n color: var(--sy-text-secondary, #999);\n text-align: left;\n cursor: pointer;\n}\n.ctx-row:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.05)); }\n\n.ctx-check {\n width: 13px; height: 13px; flex-shrink: 0;\n border: 1.5px solid var(--sy-text-faint, #4a4a4a);\n border-radius: 3px;\n display: flex; align-items: center; justify-content: center;\n color: transparent;\n}\n.ctx-row.picked .ctx-check {\n background: var(--sy-accent, #e2e2e2);\n border-color: var(--sy-accent, #e2e2e2);\n color: var(--sy-text-on-accent, #1a1a1a);\n}\n.ctx-check svg { width: 9px; height: 9px; }\n\n.ctx-row-name {\n flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n font-family: 'JetBrains Mono', monospace;\n color: var(--sy-text-primary, #d4d4d4);\n}\n.ctx-row-name.ctx-row--attr { color: var(--sy-syntax-key, #eaeaea); }\n.ctx-row-name.ctx-row--rel { color: var(--sy-syntax-relation, #c0c5cc); }\n.ctx-row-name.ctx-row--agg { color: var(--sy-syntax-keyword, #d0d4da); }\n.ctx-row.picked .ctx-row-name { opacity: .55; }\n\n/* \"+ aliased copy\" affordance on picked relation rows — the toggle can\n only REMOVE a used relation; this adds an `alias:rel` second line. */\n.ctx-row-alias {\n flex-shrink: 0;\n width: 15px; height: 15px;\n display: flex; align-items: center; justify-content: center;\n border-radius: 3px;\n font-size: 12px; font-weight: 600; line-height: 1;\n color: var(--sy-text-faint, #4a4a4a);\n opacity: 0;\n}\n.ctx-row:hover .ctx-row-alias { opacity: 1; }\n.ctx-row-alias:hover {\n color: var(--sy-accent, #e2e2e2);\n background: var(--sy-hover-overlay, rgba(255,255,255,.08));\n}\n\n.ctx-row-type {\n font-size: 10px; color: var(--sy-text-faint, #4a4a4a);\n font-family: 'Inter', sans-serif; flex-shrink: 0;\n}\n\n/* ── Middle panel ───────────────────────────────────────────────────────────── */\n.editor-stack {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.editor-pane {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n}\n/* Op-colored left-edge stripe — peripheral reminder of which op is\n bound to this pane. Same hue family as the title text + the toolbar\n op chip; muted so it doesn't compete with the chip strip up top. */\n.editor-pane::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: transparent;\n pointer-events: none;\n z-index: 1;\n}\n/* Gutter stripe kept transparent for now (op is declared by the @verb in\n the buffer, not by a pane color). Re-introduce per-mode tint later if it\n helps; transparent avoids a stale per-op color while the model lands. */\n\n/* The only two-pane op is SQL ([:sql :params]). The vertical drag handle\n pins the TOP pane (SQL) to an explicit height, so the BOTTOM pane\n (params) must be the flexible filler — it absorbs whatever height the\n drag leaves. flex-basis:0 + grow 2:1 gives a ~66/33 default split;\n after a drag the params pane grows/shrinks to fill the remainder. */\n.editor-pane:first-child:not(:only-child) { flex: 2 1 0; min-height: 120px; }\n.editor-pane:last-child:not(:only-child) { flex: 1 1 0; min-height: 90px; }\n.editor-label {\n padding: 0 12px;\n height: 36px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--sy-text-muted, #666);\n background: var(--sy-bg-surface, #1e1e1e);\n border-bottom: 1px solid var(--sy-border-subtle, #222);\n flex-shrink: 0;\n font-family: 'Inter', sans-serif;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n.editor-label-text { flex: 0 0 auto; }\n/* Op-specific accent on the :query role label. Visual link to the op-tabs\n pill in the top bar so the user always knows which op is bound to the\n editor below. Read ops borrow the read accent, writes the write accent;\n sql falls back to the generic accent. */\n.op-label { color: var(--sy-text-primary, #d4d4d4); }\n.op-label--search,\n.op-label--get,\n.op-label--aggregate,\n.op-label--search-tree,\n.op-label--get-tree { color: var(--sy-op-read, #c6cad1); }\n.op-label--sync,\n.op-label--stack,\n.op-label--delete,\n.op-label--slice,\n.op-label--purge { color: var(--sy-op-write, #f0f0f0); }\n.op-label--sql-template,\n.op-label--sql { color: var(--sy-accent, #e2e2e2); }\n/* Role hint — quiet helper text after the role name (SQL / params). */\n.editor-label-hint {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: 'JetBrains Mono','Fira Code',monospace;\n font-size: 10px;\n font-weight: 400;\n letter-spacing: 0;\n text-transform: none;\n color: var(--sy-text-faint, #555);\n}\n.editor-label-hint b {\n color: var(--sy-accent, #e2e2e2);\n font-weight: 700;\n}\n/* Help (?) button — small circular badge anchored at the right edge of\n the editor-label. Opens the XSQL quick-reference modal. Sits inside\n the label row so users see it next to \"PURGE · Project\" while\n composing, not buried in the top toolbar. */\n.editor-label-help {\n width: 19px;\n height: 19px;\n flex-shrink: 0;\n border-radius: 50%;\n border: 1px solid var(--sy-border, #2a2a2a);\n background: var(--sy-bg-app, #161616);\n color: var(--sy-text-muted, #888);\n font-family: 'Inter', sans-serif;\n font-size: 11px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: 0;\n text-transform: none;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: relative;\n transition: color .12s, background .12s, border-color .12s;\n}\n.editor-label-help:hover {\n color: var(--sy-accent, #e2e2e2);\n border-color: var(--sy-accent, #e2e2e2);\n background: var(--sy-accent-tint, rgba(255, 255, 255,.14));\n}\n\n.editor-container { flex: 1; min-height: 0; overflow: hidden; position: relative; }\n\n/* ── Insert-example overlay ─────────────────────────────────────────────────\n Shown over an empty editor pane. Full-pane container is transparent\n to mouse events so CM clicks/keyboard still reach the editor; the\n pill button in the middle re-opts into pointer events. Once the\n user inserts (or starts typing), the overlay unmounts and the CM\n host is the only thing left in the container. */\n\n/* ── SQL-template params form ──────────────────────────────────────────\n The :sql op's params pane is a typed form (one labelled input per\n `?name` placeholder), not a CodeMirror editor. */\n\n/* Data variable — a mutation's record data, edited via a JSON panel. */\n.data-var { display: flex; flex-direction: column; gap: 8px; }\n\n.editor-footer {\n border-top: 1px solid var(--sy-border, #2a2a2a);\n padding: 8px 12px;\n display: flex;\n align-items: center;\n gap: 10px;\n flex-shrink: 0;\n background: var(--sy-bg-panel, #1a1a1a);\n}\n.execute-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--sy-accent, #e2e2e2);\n color: var(--sy-text-on-accent, #1a1a1a);\n border: none;\n border-radius: 5px;\n padding: 5px 14px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n font-family: 'Inter', sans-serif;\n transition: background .15s;\n}\n.execute-btn:hover { background: var(--sy-accent-hover, #ffffff); }\n.execute-btn:disabled { background: var(--sy-border, #2a2a2a); color: var(--sy-text-muted, #555); cursor: not-allowed; }\n.execute-hint { font-size: 11px; color: var(--sy-text-faint, #3a3a3a); font-family: 'JetBrains Mono', monospace; }\n\n.lint-err-badge {\n font-size: 10px; font-weight: 600;\n background: var(--sy-error-tint, rgba(247,118,142,.15));\n color: var(--sy-error, #f7768e);\n padding: 2px 8px; border-radius: 3px;\n font-family: 'Inter', sans-serif;\n}\n\n/* ── Right panel ────────────────────────────────────────────────────────────── */\n.result-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0 12px;\n height: 36px;\n border-bottom: 1px solid var(--sy-border-subtle, #222);\n flex-shrink: 0;\n background: var(--sy-bg-panel, #1a1a1a);\n}\n.result-label { font-size: 11px; font-weight: 600; color: var(--sy-text-muted, #555); }\n\n/* Batch result tabs: raw | alias | alias … */\n.result-tabs {\n display: flex;\n align-items: center;\n gap: 2px;\n flex: 1;\n overflow-x: auto;\n}\n.result-tab {\n background: none;\n border: none;\n padding: 2px 8px;\n font-family: 'JetBrains Mono','Fira Code',monospace;\n font-size: 10px;\n color: var(--sy-text-muted, #666);\n border-radius: 3px;\n cursor: pointer;\n white-space: nowrap;\n transition: background .12s, color .12s;\n}\n.result-tab:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.05)); color: var(--sy-text-primary, #d4d4d4); }\n.result-tab.active { background: var(--sy-accent-tint, rgba(255, 255, 255,.14)); color: var(--sy-accent, #e2e2e2); }\n.result-stats {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n}\n.result-count { font-size: 11px; color: var(--sy-accent, #e2e2e2); font-weight: 600; }\n.result-timing { font-size: 11px; color: var(--sy-text-faint, #3a3a3a); }\n.result-err-badge {\n font-size: 10px; font-weight: 600;\n background: var(--sy-error-tint, rgba(247,118,142,.15));\n color: var(--sy-error, #f7768e);\n padding: 1px 6px; border-radius: 3px;\n}\n.tree-view-toggle {\n appearance: none;\n background: var(--sy-bg-band, #1f1f1f);\n border: 1px solid var(--sy-border, #2a2a2a);\n color: var(--sy-text-secondary, #6a6a6a);\n font-family: 'JetBrains Mono','Fira Code','Cascadia Code',monospace;\n font-size: 10px;\n font-weight: 500;\n padding: 1px 8px;\n border-radius: 10px;\n cursor: pointer;\n line-height: 1.5;\n transition: color 0.1s, background 0.1s, border-color 0.1s;\n}\n.tree-view-toggle:hover { color: var(--sy-text-primary, #c0c0c0); border-color: var(--sy-border, #3a3a3a); }\n.tree-view-toggle.active {\n background: var(--sy-recur-tint, rgba(99, 102, 241, 0.18));\n border-color: var(--sy-recur-border, rgba(99, 102, 241, 0.55));\n color: var(--sy-recur, #c6cad1);\n}\n.tree-view-toggle.active:hover {\n background: var(--sy-recur-tint, rgba(99, 102, 241, 0.28));\n color: var(--sy-recur-strong, #e2e2e2);\n}\n/* Result body: stable wrapper holding three mutually exclusive panes\n (CM editor / error text / placeholder). CSS-driven visibility keeps the\n CM host mounted across state changes — see ui.cljs `result-panel`. */\n.result-body {\n position: relative;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n.result-cm-host { flex: 1; min-height: 0; overflow: hidden; }\n.result-cm-host .cm-editor { height: 100%; }\n.result-err {\n flex: 1;\n overflow: auto;\n padding: 12px;\n margin: 0;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 12px;\n line-height: 1.7;\n color: var(--sy-error, #f7768e);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n.result-placeholder {\n padding: 12px;\n color: var(--sy-text-faint, #333);\n font-style: italic;\n font-family: 'Inter', sans-serif;\n}\n\n/* All [data-tooltip] tooltip styling lives in component.cljs `tooltip-css`\n (native string, defstyles-proof) — single source for every tooltip. */\n\n/* ── Login gate ─────────────────────────────────────────────────────────────── */\n\n/* ── Spinner ────────────────────────────────────────────────────────────────── */\n.spinner {\n display: inline-block;\n width: 10px; height: 10px;\n /* Sits on the accent button — color tracks the button text token so\n the spinner contrasts no matter the theme. */\n border: 2px solid color-mix(in srgb, var(--sy-text-on-accent, #1a1a1a) 30%, transparent);\n border-top-color: var(--sy-text-on-accent, #1a1a1a);\n border-radius: 50%;\n animation: spin .6s linear infinite;\n}\n@keyframes spin { to { transform: rotate(360deg); } }\n\n/* ── CodeMirror tooltip (autocomplete + lint) ────────────────────────────────\n Tooltips are appended to shadow-root via tooltips({parent}) to escape\n overflow:hidden on .panel-mid. They need position:fixed to stay in view. */\n.cm-tooltip {\n z-index: 10000;\n}\n.cm-tooltip.cm-tooltip-autocomplete {\n background: var(--sy-bg-surface, #1e1e1e);\n border: 1px solid var(--sy-border, #3a3a3a);\n border-radius: 6px;\n box-shadow: 0 4px 16px rgba(0,0,0,.5);\n padding: 4px 0;\n}\n/* Selector specificity (0,3,1) bumped via doubled .cm-tooltip class so\n our sizing wins over @codemirror/autocomplete's default theme rule\n `.ͼ1 .cm-tooltip.cm-tooltip-autocomplete \x3e ul` (also 0,3,1, but loaded\n first — equal specificity, later sheet wins). */\n.cm-tooltip.cm-tooltip.cm-tooltip-autocomplete \x3e ul {\n font-family: 'JetBrains Mono', monospace;\n font-size: 13px;\n max-height: 440px;\n min-width: 360px;\n max-width: 600px;\n}\n.cm-tooltip.cm-tooltip.cm-tooltip-autocomplete \x3e ul \x3e li {\n display: flex;\n align-items: center;\n gap: 10px;\n /* 2px transparent border reserves the accent slot — selecting a row\n swaps the colour in without shifting layout. */\n border-left: 2px solid transparent;\n padding: 8px 14px 8px 12px;\n margin-bottom: 2px;\n line-height: 1.5;\n}\n.cm-tooltip-autocomplete \x3e ul \x3e li:last-child { margin-bottom: 0; }\n/* Selector specificity bumped via doubled .cm-tooltip class so our overrides\n beat the @codemirror/autocomplete default theme (which uses solid blue +\n white text for the selected row and is loaded after console.css). */\n.cm-tooltip.cm-tooltip-autocomplete \x3e ul \x3e li[aria-selected] {\n background: var(--sy-accent-tint, rgba(255, 255, 255,.18));\n color: var(--sy-text-primary, #d4d4d4);\n border-left-color: var(--sy-accent, #e2e2e2);\n}\n.cm-tooltip.cm-tooltip-autocomplete \x3e ul \x3e li .cm-completionLabel { color: var(--sy-text-primary, #d4d4d4); }\n.cm-tooltip.cm-tooltip-autocomplete \x3e ul \x3e li .cm-completionMatchedText { color: var(--sy-accent, #e2e2e2); font-weight: 600; text-decoration: none; }\n.cm-tooltip.cm-tooltip-autocomplete \x3e ul \x3e li .cm-completionDetail { color: var(--sy-text-muted, #555); margin-left: auto; padding-left: 16px;\n font-style: normal; font-size: 11px; }\n\n/* Section headers — small caps label + faint divider above each group. */\n.cm-completionSectionHeader {\n padding: 6px 12px 3px;\n font-size: 10px;\n font-weight: 600;\n letter-spacing: .08em;\n text-transform: uppercase;\n color: var(--sy-text-muted, #555);\n border-top: 1px solid var(--sy-border, #2a2a2a);\n margin-top: 2px;\n}\n.cm-tooltip-autocomplete \x3e ul \x3e .cm-completionSectionHeader:first-child {\n border-top: none;\n margin-top: 0;\n}\n\n/* Lucide icons via mask-image so colour stays theme-driven. The default\n ::after glyphs are suppressed; each `-type` variant supplies its own\n SVG mask and tint. */\n.cm-completionIcon {\n width: 14px;\n height: 14px;\n flex-shrink: 0;\n font-size: 0; /* hide CM's default text glyph */\n padding: 0;\n opacity: 1;\n -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;\n -webkit-mask-position: center; mask-position: center;\n -webkit-mask-size: 14px 14px; mask-size: 14px 14px;\n background-color: var(--sy-syntax-punct, #5c6068); /* fallback tint */\n}\n.cm-completionIcon::after { content: none !important; }\n\n/* database — root ENTITY (XSQL `:type \"class\"`). Without this rule entities\n had no icon, since the per-type masks below don't cover `class`. */\n.cm-completionIcon-class {\n background-color: var(--sy-syntax-keyword, #e2e2e2);\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cellipse cx\x3d'12' cy\x3d'5' rx\x3d'9' ry\x3d'3'/\x3e\x3cpath d\x3d'M3 5v14a9 3 0 0 0 18 0V5'/\x3e\x3cpath d\x3d'M3 12a9 3 0 0 0 18 0'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cellipse cx\x3d'12' cy\x3d'5' rx\x3d'9' ry\x3d'3'/\x3e\x3cpath d\x3d'M3 5v14a9 3 0 0 0 18 0V5'/\x3e\x3cpath d\x3d'M3 12a9 3 0 0 0 18 0'/\x3e\x3c/svg\x3e\");\n}\n\n/* box — entity (table) reference, used by SQL {…} placeholder completion */\n.cm-completionIcon-type {\n background-color: var(--sy-syntax-keyword, #e2e2e2);\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z'/\x3e\x3cpath d\x3d'm3.3 7 8.7 5 8.7-5'/\x3e\x3cpath d\x3d'M12 22V12'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z'/\x3e\x3cpath d\x3d'm3.3 7 8.7 5 8.7-5'/\x3e\x3cpath d\x3d'M12 22V12'/\x3e\x3c/svg\x3e\");\n}\n\n/* circle-dot — attribute (entity scalar) */\n.cm-completionIcon-attribute,\n.cm-completionIcon-variable {\n background-color: var(--sy-syntax-key, #a8adb5);\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3ccircle cx\x3d'12' cy\x3d'12' r\x3d'10'/\x3e\x3ccircle cx\x3d'12' cy\x3d'12' r\x3d'1'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3ccircle cx\x3d'12' cy\x3d'12' r\x3d'10'/\x3e\x3ccircle cx\x3d'12' cy\x3d'12' r\x3d'1'/\x3e\x3c/svg\x3e\");\n}\n\n/* arrow-right — relation; matches the → in the editor */\n.cm-completionIcon-relation,\n.cm-completionIcon-property {\n background-color: var(--sy-syntax-relation, #f0f0f0);\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'M5 12h14'/\x3e\x3cpath d\x3d'm12 5 7 7-7 7'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'M5 12h14'/\x3e\x3cpath d\x3d'm12 5 7 7-7 7'/\x3e\x3c/svg\x3e\");\n}\n\n/* sliders-horizontal — structural operators (_args, _count, _agg, _limit, …) */\n.cm-completionIcon-keyword {\n background-color: var(--sy-syntax-keyword, #e2e2e2);\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cline x1\x3d'21' y1\x3d'4' x2\x3d'14' y2\x3d'4'/\x3e\x3cline x1\x3d'10' y1\x3d'4' x2\x3d'3' y2\x3d'4'/\x3e\x3cline x1\x3d'21' y1\x3d'12' x2\x3d'12' y2\x3d'12'/\x3e\x3cline x1\x3d'8' y1\x3d'12' x2\x3d'3' y2\x3d'12'/\x3e\x3cline x1\x3d'21' y1\x3d'20' x2\x3d'16' y2\x3d'20'/\x3e\x3cline x1\x3d'12' y1\x3d'20' x2\x3d'3' y2\x3d'20'/\x3e\x3cline x1\x3d'14' y1\x3d'2' x2\x3d'14' y2\x3d'6'/\x3e\x3cline x1\x3d'8' y1\x3d'10' x2\x3d'8' y2\x3d'14'/\x3e\x3cline x1\x3d'16' y1\x3d'18' x2\x3d'16' y2\x3d'22'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cline x1\x3d'21' y1\x3d'4' x2\x3d'14' y2\x3d'4'/\x3e\x3cline x1\x3d'10' y1\x3d'4' x2\x3d'3' y2\x3d'4'/\x3e\x3cline x1\x3d'21' y1\x3d'12' x2\x3d'12' y2\x3d'12'/\x3e\x3cline x1\x3d'8' y1\x3d'12' x2\x3d'3' y2\x3d'12'/\x3e\x3cline x1\x3d'21' y1\x3d'20' x2\x3d'16' y2\x3d'20'/\x3e\x3cline x1\x3d'12' y1\x3d'20' x2\x3d'3' y2\x3d'20'/\x3e\x3cline x1\x3d'14' y1\x3d'2' x2\x3d'14' y2\x3d'6'/\x3e\x3cline x1\x3d'8' y1\x3d'10' x2\x3d'8' y2\x3d'14'/\x3e\x3cline x1\x3d'16' y1\x3d'18' x2\x3d'16' y2\x3d'22'/\x3e\x3c/svg\x3e\");\n}\n\n/* equal — comparison operators (\x3d, !\x3d, like, ilike, in, …) */\n.cm-completionIcon-operator {\n background-color: var(--sy-syntax-literal, #d0d4da);\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cline x1\x3d'5' y1\x3d'9' x2\x3d'19' y2\x3d'9'/\x3e\x3cline x1\x3d'5' y1\x3d'15' x2\x3d'19' y2\x3d'15'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cline x1\x3d'5' y1\x3d'9' x2\x3d'19' y2\x3d'9'/\x3e\x3cline x1\x3d'5' y1\x3d'15' x2\x3d'19' y2\x3d'15'/\x3e\x3c/svg\x3e\");\n}\n\n/* sigma — aggregate functions (avg, sum, min, max) */\n.cm-completionIcon-function,\n.cm-completionIcon-method {\n background-color: #e0af68;\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'M18 7V5a1 1 0 0 0-1-1H6.5a.5.5 0 0 0-.4.8l4.5 6a2 2 0 0 1 0 2.4l-4.5 6a.5.5 0 0 0 .4.8H17a1 1 0 0 0 1-1v-2'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'M18 7V5a1 1 0 0 0-1-1H6.5a.5.5 0 0 0-.4.8l4.5 6a2 2 0 0 1 0 2.4l-4.5 6a.5.5 0 0 0 .4.8H17a1 1 0 0 0 1-1v-2'/\x3e\x3c/svg\x3e\");\n}\n\n/* hash — literals/constants (true, false, null, asc, desc) */\n.cm-completionIcon-constant,\n.cm-completionIcon-enum {\n background-color: var(--sy-error, #f7768e);\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cline x1\x3d'4' y1\x3d'9' x2\x3d'20' y2\x3d'9'/\x3e\x3cline x1\x3d'4' y1\x3d'15' x2\x3d'20' y2\x3d'15'/\x3e\x3cline x1\x3d'10' y1\x3d'3' x2\x3d'8' y2\x3d'21'/\x3e\x3cline x1\x3d'16' y1\x3d'3' x2\x3d'14' y2\x3d'21'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cline x1\x3d'4' y1\x3d'9' x2\x3d'20' y2\x3d'9'/\x3e\x3cline x1\x3d'4' y1\x3d'15' x2\x3d'20' y2\x3d'15'/\x3e\x3cline x1\x3d'10' y1\x3d'3' x2\x3d'8' y2\x3d'21'/\x3e\x3cline x1\x3d'16' y1\x3d'3' x2\x3d'14' y2\x3d'21'/\x3e\x3c/svg\x3e\");\n}\n\n/* code — snippet templates (LIKE patterns, in() lists) */\n.cm-completionIcon-text {\n background-color: #9aa0a8;\n -webkit-mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'm16 18 6-6-6-6'/\x3e\x3cpath d\x3d'm8 6-6 6 6 6'/\x3e\x3c/svg\x3e\");\n mask-image: url(\"data:image/svg+xml;utf8,\x3csvg xmlns\x3d'http://www.w3.org/2000/svg' viewBox\x3d'0 0 24 24' fill\x3d'none' stroke\x3d'black' stroke-width\x3d'2' stroke-linecap\x3d'round' stroke-linejoin\x3d'round'\x3e\x3cpath d\x3d'm16 18 6-6-6-6'/\x3e\x3cpath d\x3d'm8 6-6 6 6 6'/\x3e\x3c/svg\x3e\");\n}\n\n/* ── XSQL help modal ─────────────────────────────────────────────────────────\n Centered modal with a dark backdrop. The backdrop sits above .panels\n (z\x3d200) but below CodeMirror autocomplete tooltips (z\x3d1000+). Body\n scrolls inside the modal; the backdrop never scrolls. */\n.help-backdrop {\n position: absolute;\n inset: 0;\n background: rgba(8, 10, 16, 0.66);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 500;\n outline: none;\n animation: help-backdrop-in .12s ease;\n}\n@keyframes help-backdrop-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.help-modal {\n background: var(--sy-bg-surface, #1e1e1e);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 10px;\n width: min(960px, 94vw);\n height: min(720px, 88vh);\n display: flex;\n overflow: hidden;\n box-shadow: 0 22px 60px rgba(0, 0, 0, 0.55);\n animation: help-modal-in .14s ease;\n}\n@keyframes help-modal-in {\n from { opacity: 0; transform: translateY(8px) scale(.985); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n\n.help-nav {\n flex: 0 0 188px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 16px 10px;\n background: var(--sy-bg-band, #181818);\n border-right: 1px solid var(--sy-border, #2a2a2a);\n overflow-y: auto;\n}\n.help-nav-title {\n font-family: 'JetBrains Mono', monospace;\n font-size: 11px;\n font-weight: 700;\n letter-spacing: .14em;\n color: var(--sy-text-faint, #666);\n padding: 0 10px 12px;\n}\n.help-nav-tab {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 1px;\n width: 100%;\n padding: 8px 10px 8px 12px;\n border: none;\n border-radius: 6px;\n background: none;\n text-align: left;\n cursor: pointer;\n position: relative;\n transition: background .12s;\n}\n.help-nav-tab:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.05)); }\n.help-nav-tab.active { background: var(--sy-accent-tint, rgba(255,255,255,.08)); }\n.help-nav-tab.active::before {\n content: \"\";\n position: absolute;\n left: 0; top: 8px; bottom: 8px;\n width: 3px;\n border-radius: 2px;\n background: var(--sy-chip-read);\n}\n.help-nav-label {\n font-family: 'Inter', sans-serif;\n font-size: 13px;\n font-weight: 600;\n color: var(--sy-text-secondary, #aaa);\n}\n.help-nav-tab.active .help-nav-label { color: var(--sy-text-primary, #e8e8e8); }\n.help-nav-sub {\n font-family: 'Inter', sans-serif;\n font-size: 11px;\n color: var(--sy-text-faint, #666);\n}\n.help-main {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n.help-body { flex: 1; min-height: 0; animation: help-tab-in .14s ease; }\n@keyframes help-tab-in {\n from { opacity: 0; transform: translateX(6px); }\n to { opacity: 1; transform: none; }\n}\n.help-lede {\n font-size: 14px;\n line-height: 1.6;\n color: var(--sy-text-secondary, #bbb);\n margin: 0 0 14px;\n}\n.help-op {\n font-family: 'JetBrains Mono', monospace;\n font-size: 12px;\n font-weight: 600;\n}\n.help-op--read { color: var(--sy-chip-read); }\n.help-op--write { color: var(--sy-chip-write); }\n.help-op--destroy { color: var(--sy-chip-destroy); }\n.help-table td code.help-op,\n.help-section-title .help-op { background: none; padding: 0; }\n.help-kbd {\n font-family: 'JetBrains Mono', monospace;\n font-size: 11px;\n padding: 1px 6px;\n margin: 0 2px;\n border-radius: 4px;\n border: 1px solid var(--sy-border, #333);\n border-bottom-width: 2px;\n background: var(--sy-bg-band, #1a1a1a);\n color: var(--sy-text-primary, #e8e8e8);\n}\n.help-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px 12px 20px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n flex-shrink: 0;\n}\n.help-title {\n margin: 0;\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n font-weight: 600;\n color: var(--sy-text-primary, #d4d4d4);\n letter-spacing: 0.01em;\n}\n.help-close {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--sy-text-muted, #666);\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n transition: color .12s, background .12s;\n}\n.help-close:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.06)); color: var(--sy-text-primary, #d4d4d4); }\n.help-body {\n padding: 16px 22px 22px;\n overflow-y: auto;\n font-family: 'Inter', sans-serif;\n font-size: 13px;\n line-height: 1.55;\n color: var(--sy-text-primary, #d4d4d4);\n}\n.help-body::-webkit-scrollbar { width: 8px; }\n.help-body::-webkit-scrollbar-thumb {\n background: var(--sy-border, #2a2a2a);\n border-radius: 4px;\n}\n\n.help-section {\n margin-bottom: 22px;\n}\n.help-section:last-child { margin-bottom: 4px; }\n.help-section-title {\n margin: 0 0 8px;\n font-family: 'Inter', sans-serif;\n font-size: 12px;\n font-weight: 600;\n color: var(--sy-text-muted, #888);\n text-transform: uppercase;\n letter-spacing: 0.08em;\n}\n\n.help-section-title {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n.help-title {\n display: flex;\n align-items: center;\n gap: 7px;\n}\n\n.help-prose {\n margin: 0 0 10px;\n color: var(--sy-text-primary, #d4d4d4);\n}\n.help-prose:last-child { margin-bottom: 0; }\n.help-prose b { color: var(--sy-text-primary, #e8e8e8); font-weight: 600; }\n\n.help-list {\n margin: 0 0 10px;\n padding-left: 18px;\n}\n.help-list li {\n margin-bottom: 4px;\n color: var(--sy-text-primary, #cccccc);\n}\n.help-list li::marker { color: var(--sy-text-faint, #555); }\n.help-list b { color: var(--sy-text-primary, #e8e8e8); font-weight: 600; }\n\n.help-code {\n background: var(--sy-bg-app, #161616);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 6px;\n padding: 10px 12px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 12px;\n line-height: 1.5;\n color: var(--sy-text-primary, #d4d4d4);\n overflow-x: auto;\n margin: 0 0 10px;\n white-space: pre;\n}\n\n.help-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n margin-bottom: 6px;\n}\n.help-table th,\n.help-table td {\n text-align: left;\n padding: 5px 10px 5px 0;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n}\n.help-table th {\n font-size: 11px;\n font-weight: 600;\n color: var(--sy-text-muted, #888);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n.help-table td code,\n.help-list code,\n.help-prose code {\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 12px;\n background: var(--sy-hover-overlay, rgba(255,255,255,.05));\n padding: 1px 6px;\n border-radius: 3px;\n color: var(--sy-text-primary, #e8e8e8);\n}\n");
|
|
2762
2762
|
var I2=new CSSStyleSheet;
|
|
2763
2763
|
I2.replaceSync([":host {\n --tt-bg: rgba(8, 8, 9, 0.96);\n --tt-fg: rgba(255, 255, 255, 0.95);\n --tt-fg-dim: rgba(255, 255, 255, 0.62);\n --tt-border: rgba(255, 255, 255, 0.12);\n --tt-radius: 6px;\n --tt-shadow: 0 6px 18px rgba(0, 0, 0, 0.45);\n --tt-pad: 6px 10px;\n --tt-font-size: 11px;\n --tt-max-width: 280px;\n --tt-z: 10000;\n }\n\n /* Custom hover tooltips (replace native :title). Default anchor: below,\n centered. Overrides further down adjust ONLY position. */\n [data-tooltip] { position: relative; }\n [data-tooltip]::before {\n content: attr(data-tooltip);\n position: absolute;\n top: calc(100% + 7px);\n left: 50%;\n transform: translateX(-50%);\n background: var(--tt-bg);\n color: var(--tt-fg);\n border: 1px solid var(--tt-border);\n box-shadow: var(--tt-shadow);\n padding: var(--tt-pad);\n border-radius: var(--tt-radius);\n font-family: 'Inter', system-ui, sans-serif;\n font-size: var(--tt-font-size);\n font-weight: 600;\n line-height: 1.4;\n letter-spacing: 0.01em;\n text-align: center;\n white-space: normal;\n width: max-content;\n max-width: var(--tt-max-width);\n pointer-events: none;\n opacity: 0;\n visibility: hidden;\n transition: opacity .12s ease, visibility .12s ease;\n z-index: var(--tt-z);\n }\n [data-tooltip]:hover::before { opacity: 1; visibility: visible; }\n /* Nested tooltip targets (e.g. the @watch toggle inside an op chip):\n hovering the child keeps the parent :hover — show ONLY the child's. */\n [data-tooltip]:has([data-tooltip]:hover)::before { opacity: 0; visibility: hidden; }\n .editor-label-help[data-tooltip]::before,\n .help-close[data-tooltip]::before,\n .tree-view-toggle[data-tooltip]::before { left: auto; right: 0; transform: none; }\n /* Trailing toolbar controls sit at the console's right edge — a centered\n tooltip overhangs the boundary and clips. Right-align them. */\n .toolbar-btn[data-tooltip]::before,\n .query-tab-add[data-tooltip]::before,\n .query-tab-overflow[data-tooltip]::before { left: auto; right: 0; transform: none; text-align: left; }\n .execute-btn[data-tooltip]::before { top: auto; bottom: calc(100% + 7px); }\n /* Runbar op chips sit at the panel's left edge — a centered tooltip\n overhangs the panel boundary and gets clipped. Left-align instead. */\n .buffer-op[data-tooltip]::before { left: 0; transform: none; text-align: left; }\n /* Error chips get an error-colored tooltip. */\n .buffer-op--error[data-tooltip]::before {\n border-color: rgba(247, 118, 142, 0.6);\n color: #f7768e;\n }\n\n /* CodeMirror lint tooltip — dark (CM6 ships a light default). Two shapes:\n the GUTTER tooltip wrapper is `.cm-tooltip.cm-tooltip-lint` (both classes);\n the BODY hover tooltip wrapper is `.cm-tooltip.cm-tooltip-hover` with a\n separate `ul.cm-tooltip-lint` inside it — so we must style that wrapper\n too (scoped via :has so other hover tooltips are unaffected). The doubled\n .cm-tooltip class out-specifies CM's baseTheme .cm-tooltip. */\n .cm-tooltip.cm-tooltip.cm-tooltip-lint,\n .cm-tooltip.cm-tooltip.cm-tooltip-hover:has(.cm-tooltip-lint) {\n background: var(--tt-bg);\n color: var(--tt-fg);\n border: 1px solid var(--tt-border);\n border-radius: var(--tt-radius);\n box-shadow: var(--tt-shadow);\n overflow: hidden;\n }\n .cm-diagnostic {\n padding: var(--tt-pad);\n font-family: 'Inter', system-ui, sans-serif;\n font-size: 12px;\n line-height: 1.45;\n color: var(--tt-fg);\n border-left: 3px solid transparent;\n }\n .cm-diagnostic-error { border-left-color: #f7768e; background: rgba(247,118,142,.07); }\n .cm-diagnostic-warning { border-left-color: #e0af68; background: rgba(224,175,104,.07); }\n .cm-diagnostic-info { border-left-color: var(--sy-accent, #7aa2f7); }\n .cm-diagnostic code, .cm-diagnosticText code { font-family: 'JetBrains Mono', monospace; color: var(--sy-accent, #7aa2f7); }\n .cm-lintRange-error { text-decoration: underline wavy #f7768e; }\n .cm-lintRange-warning { text-decoration: underline wavy #e0af68; }\n\n /* Fill-in popup (var_chips.cljs) — this specific piece renders through\n CM's showTooltip system, which needed the native-text treatment (see\n below). The inline value CHIPS are plain editor-content decorations,\n not tooltips — they style fine through console.css's normal\n var(--sy-*) cascade and stay THERE, theme-reactive (see\n .cm-var-chip* there). Don't move them here: they were tried here\n once and went invisible on light theme — a translucent white tint\n (right for an always-dark floating popup with its own opaque\n background) reads as nothing on a light page; the chip has no\n opaque backing of its own, so it needs the light/dark-flipped tint\n direction var(--sy-hover-overlay) etc. already provide per theme.\n\n `wrap` (var_chips.cljs popup-dom) IS the tooltip element — CM adds\n cm-tooltip to the SAME dom node returned by `create`, it doesn't\n wrap it in a parent. So this is `.cm-var-popup` itself carrying\n BOTH classes, never a `.cm-tooltip:has(\x3e .cm-var-popup)` ancestor —\n that selector can never match (an element isn't its own child) and\n silently left the tooltip on CM's light baseTheme default the\n entire time, which is why the popup looked washed out in every\n theme regardless of the --tt-* fix above. Doubled .cm-tooltip\n mirrors the lint-tooltip pattern above (out-specifies baseTheme). */\n .cm-tooltip.cm-tooltip.cm-var-popup {\n background: var(--tt-bg);\n border: 1px solid var(--tt-border);\n border-radius: var(--tt-radius);\n box-shadow: var(--tt-shadow);\n }\n .cm-var-popup {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 10px 12px;\n min-width: 220px;\n }\n .cm-var-popup-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n }\n .cm-var-popup-label {\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 11px;\n color: var(--tt-fg);\n }\n .cm-var-popup-close {\n background: none;\n border: none;\n padding: 0 2px;\n font-size: 14px;\n line-height: 1;\n cursor: pointer;\n color: var(--tt-fg-dim);\n }\n .cm-var-popup-close:hover { color: var(--tt-fg); }\n .cm-var-popup-input {\n padding: 4px 8px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 12px;\n color: var(--tt-fg);\n background: rgba(255,255,255,.05);\n border: 1px solid var(--tt-border);\n border-radius: 4px;\n outline: none;\n }\n .cm-var-popup-input:focus { border-color: var(--tt-fg); }\n .cm-var-popup-input::placeholder { color: var(--tt-fg-dim); opacity: 1; }\n .cm-var-popup-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n .cm-var-popup-hint { font-size: 10px; color: var(--tt-fg-dim); }\n .cm-var-popup--data { width: min(520px, 80vw); }\n .cm-var-popup-data {\n height: 260px;\n border: 1px solid var(--tt-border);\n border-radius: 4px;\n overflow: hidden;\n }\n .cm-var-popup-data .cm-editor { height: 100%; }\n",aP("\n",
|
|
2764
|
-
eh.h(function(a){return a.cssText},I(
|
|
2764
|
+
eh.h(function(a){return a.cssText},I(c2.cssRules)))].join(""));function GDa(a){a.removeAttribute("open");a.dispatchEvent(new CustomEvent("close",{bubbles:!0}));a=a.onClose;return l(a)?a.v?a.v():a.call(null):null}
|
|
2765
2765
|
function J2(a,b,c){b=b.querySelector(".dc-root");return l(b)?mQ(b,function(){var d=h$(a);d=d instanceof x?d.H:null;switch(d){case "login":return Z$(new k(null,1,[vw,function(){return GDa(a)}],null));case "pending":return null;case "ready":return fwa(new k(null,2,[vw,function(){return GDa(a)},nx,a.hasAttribute("embedded")],null),c);default:throw Error(["No matching clause: ",p.g(d)].join(""));}}()):null}
|
|
2766
2766
|
function K2(a){function b(f){var h;if(h=z.h("Escape",f.key))h=(h=mb(f.defaultPrevented))?a.hasAttribute("open"):h;return l(h)?(f.preventDefault(),GDa(a)):null}function c(f){return l(function(){var h=function(){var m=f.metaKey;return l(m)?m:f.ctrlKey}();return l(h)?z.h("s",function(){var m=f.key;return l(m)?m:""}().toLowerCase()):h}())?f.preventDefault():null}a._ownsConnection=cua(a);var d=ba.wd(a,"open");zta();hua();Hk(lX,new R(null,2,5,S,[AL,a],null),function(f,h,m,n){J2(a,d,q(r_));if(yg(zK.g(m),
|
|
2767
2767
|
zK.g(n)))for(f=A(I(d.querySelectorAll(".cm-host"))),h=null,n=m=0;;)if(n<m){var r=h.P(null,n);r=r._cmView;l(r)&&l(r)&&$T.forceLinting(r);n+=1}else if(f=A(f))af(f)?(m=fd(f),f=gd(f),h=m,m=H(m)):(r=B(f),h=r._cmView,l(h)&&l(h)&&$T.forceLinting(h),f=F(f),h=null,m=0),n=0;else return null;else return null});Hk(r_,new R(null,2,5,S,[uq,a],null),function(f,h,m,n){return J2(a,d,n)});l(a.hasAttribute("embedded"))||Hk(j2,new R(null,2,5,S,[qy,a],null),function(){return J2(a,d,q(r_))});Iua(function(){return J2(a,
|
|
@@ -2984,8 +2984,8 @@ var J5=Yk(Y4),K5=new k(null,6,[xG,"'",fH,"#'",lja,"@",aka,"~",Gfa,"@",Afa,"~"],n
|
|
|
2984
2984
|
function N5(a){var b=Ze(a)?null:function(){var n=new Qd(function(){return Dk},$ha,pj([Jla,yv,U,QK,nba,jw,SB,fna,kba,LJ,tka],[!0,rm,jha,"cljs/core.cljs",15,1,10696,10696,Pf(new R(null,1,5,S,[Eea],null)),"Returns [lifted-ns lifted-map] or nil if m can't be lifted.",l(Dk)?Dk.Zg:null]));return n.g?n.g(a):n.call(null,a)}(),c=J(b,0,null);b=J(b,1,null);var d=l(b)?b:a,e=l(c)?["#:",p.g(c),"{"].join(""):"{";if(l(U4()))Jc(Wa,"#");else{c=O4;b=P4;O4+=1;P4=0;try{F4(e,"}");e=0;for(var f=A(d);;){if(mb(ab)||e<ab){if(f){if(l(U4()))Jc(Wa,
|
|
2985
2985
|
"#");else{d=O4;var h=P4;O4+=1;P4=0;try{F4(null,null),R4(B(B(f))),Jc(Wa," "),V4(jC),P4=0,R4(B(F(B(f)))),G4()}finally{P4=h,O4=d}}if(F(f)){Jc(Wa,", ");V4(jC);d=e+1;var m=F(f);e=d;f=m;continue}}}else Jc(Wa,"...");break}G4()}finally{P4=b,O4=c}}return null}function O5(a){return Jc(Wa,zk.o(I([a])))}
|
|
2986
2986
|
var P5=function(){var a=J5("~\x3c#{~;~@{~w~^ ~:_~}~;}~:\x3e");return function(){function b(d){var e=null;if(0<arguments.length){e=0;for(var f=Array(arguments.length-0);e<f.length;)f[e]=arguments[e+0],++e;e=new Sd(f,0,null)}return c.call(this,e)}function c(d){d=Z4(d);return a5(a,d)}b.J=0;b.K=function(d){d=A(d);return c(d)};b.o=c;return b}()}(),Q5=new k(null,2,["core$future_call","Future","core$promise","Promise"],null),Jxa=function(){var a=J5("~\x3c\x3c-(~;~@{~w~^ ~_~}~;)-\x3c~:\x3e");return function(){function b(d){var e=
|
|
2987
|
-
null;if(0<arguments.length){e=0;for(var f=Array(arguments.length-0);e<f.length;)f[e]=arguments[e+0],++e;e=new Sd(f,0,null)}return c.call(this,e)}function c(d){d=Z4(d);return a5(a,d)}b.J=0;b.K=function(d){d=A(d);return c(d)};b.o=c;return b}()}();function R5(a){return a instanceof wi?In:(null!=a?a.G&32768||Va===a.Ud||(a.G?0:ob(pc,a)):ob(pc,a))?HH:a instanceof Jd?$s:df(a)?WD:Ye(a)?jJ:$e(a)?DG:We(a)?Jw:null==a?null:zl}var S5,
|
|
2988
|
-
S5=new ml(Pd.h("cljs.pprint","simple-dispatch"),R5,
|
|
2987
|
+
null;if(0<arguments.length){e=0;for(var f=Array(arguments.length-0);e<f.length;)f[e]=arguments[e+0],++e;e=new Sd(f,0,null)}return c.call(this,e)}function c(d){d=Z4(d);return a5(a,d)}b.J=0;b.K=function(d){d=A(d);return c(d)};b.o=c;return b}()}();function R5(a){return a instanceof wi?In:(null!=a?a.G&32768||Va===a.Ud||(a.G?0:ob(pc,a)):ob(pc,a))?HH:a instanceof Jd?$s:df(a)?WD:Ye(a)?jJ:$e(a)?DG:We(a)?Jw:null==a?null:zl}var S5,Ena=$g(ug),Fna=$g(ug),Gna=$g(ug),Hna=$g(ug),Jna=Od(ug,Yx,al.v?al.v():al.call(null));
|
|
2988
|
+
S5=new ml(Pd.h("cljs.pprint","simple-dispatch"),R5,Jna,Ena,Fna,Gna,Hna);jl(S5,WD,function(a){if(mb(L5(a)))if(l(U4()))Jc(Wa,"#");else{var b=O4,c=P4;O4+=1;P4=0;try{F4("(",")");for(var d=0,e=A(a);;){if(mb(ab)||d<ab){if(e&&(R4(B(e)),F(e))){Jc(Wa," ");V4(jC);a=d+1;var f=F(e);d=a;e=f;continue}}else Jc(Wa,"...");break}G4()}finally{P4=c,O4=b}}return null});jl(S5,DG,M5);jl(S5,jJ,N5);jl(S5,Jw,P5);jl(S5,null,function(){return Jc(Wa,zk.o(I([null])))});jl(S5,zl,O5);I4=S5;
|
|
2989
2989
|
function T5(a){return $e(a)?new R(null,2,5,S,["[","]"],null):new R(null,2,5,S,["(",")"],null)}
|
|
2990
2990
|
function Pxa(a){if(Xe(a)){var b=T5(a),c=J(b,0,null),d=J(b,1,null),e=A(a),f=B(e),h=F(e);if(l(U4()))Jc(Wa,"#");else{var m=O4,n=P4,r=O4+1;O4=r;P4=0;try{F4(c,d);(function(){var Z=J5("~w~:i");return function(){function Y(V){var W=null;if(0<arguments.length){W=0;for(var ma=Array(arguments.length-0);W<ma.length;)ma[W]=arguments[W+0],++W;W=new Sd(ma,0,null)}return aa.call(this,W)}function aa(V){V=Z4(V);return a5(Z,V)}Y.J=0;Y.K=function(V){V=A(V);return aa(V)};Y.o=aa;return Y}()})()(f);for(var t=h;;)if(A(t)){(function(){var Z=
|
|
2991
2991
|
J5(" ");return function(Y,aa,V){return function(){function W(ia){var oa=null;if(0<arguments.length){oa=0;for(var ra=Array(arguments.length-0);oa<ra.length;)ra[oa]=arguments[oa+0],++oa;oa=new Sd(ra,0,null)}return ma.call(this,oa)}function ma(ia){ia=Z4(ia);return a5(V,ia)}W.J=0;W.K=function(ia){ia=A(ia);return ma(ia)};W.o=ma;return W}()}(t," ",Z,m,n,r,0,b,c,d,a,e,f,h,f,h)})()();var u=B(t);if(Xe(u)){var w=T5(u),y=J(w,0,null),C=J(w,1,null);if(l(U4()))Jc(Wa,"#");else{var D=O4,E=P4,G=O4+1;O4=G;P4=0;try{F4(y,
|
|
@@ -3014,8 +3014,8 @@ A(t);return r(t)};n.o=r;return n}()}(),a);for(var d=0,e=A(gh(3,a));;){if(mb(ab)|
|
|
|
3014
3014
|
new R(null,2,5,S,[B(c),F(c)],null):new R(null,2,5,S,[null,c],null);c=J(d,0,null);d=J(d,1,null);d=Ye(B(d))?new R(null,2,5,S,[B(d),F(d)],null):new R(null,2,5,S,[null,d],null);var e=J(d,0,null),f=J(d,1,null);if(l(U4()))Jc(Wa,"#");else{d=O4;var h=P4;O4+=1;P4=0;try{F4("(",")");(function(){var n=J5("~w ~1I~@_~w");return function(){function r(u){var w=null;if(0<arguments.length){w=0;for(var y=Array(arguments.length-0);w<y.length;)y[w]=arguments[w+0],++w;w=new Sd(y,0,null)}return t.call(this,w)}function t(u){u=
|
|
3015
3015
|
Z4(u);return a5(n,u)}r.J=0;r.K=function(u){u=A(u);return t(u)};r.o=t;return r}()})()(a,b);l(l(c)?c:l(e)?e:A(f))&&function(){var n=J5("~@:_");return function(){function r(u){var w=null;if(0<arguments.length){w=0;for(var y=Array(arguments.length-0);w<y.length;)y[w]=arguments[w+0],++w;w=new Sd(y,0,null)}return t.call(this,w)}function t(u){u=Z4(u);return a5(n,u)}r.J=0;r.K=function(u){u=A(u);return t(u)};r.o=t;return r}()}()();l(c)&&X4(!0,'"~a"~:[~;~:@_~]',I([c,l(e)?e:A(f)]));l(e)&&function(){var n=J5("~w~:[~;~:@_~]");
|
|
3016
3016
|
return function(){function r(u){var w=null;if(0<arguments.length){w=0;for(var y=Array(arguments.length-0);w<y.length;)y[w]=arguments[w+0],++w;w=new Sd(y,0,null)}return t.call(this,w)}function t(u){u=Z4(u);return a5(n,u)}r.J=0;r.K=function(u){u=A(u);return t(u)};r.o=t;return r}()}()(e,A(f));for(a=f;;){Pxa(B(a));var m=F(a);if(m)b=m,V4(jC),a=b;else break}G4()}finally{P4=h,O4=d}}return null}return R4(a)},X5,function(a){if(l(U4()))Jc(Wa,"#");else{var b=O4,c=P4;O4+=1;P4=0;try{F4("(",")");W4(TA,1);R4(B(a));
|
|
3017
|
-
if(F(a)){Jc(Wa," ");V4(jC);for(var d=0,e=F(a);;){if(mb(ab)||d<ab){if(e){if(l(U4()))Jc(Wa,"#");else{a=O4;var f=P4;O4+=1;P4=0;try{F4(null,null),R4(B(e)),F(e)&&(Jc(Wa," "),V4(tm),R4(Ce(e))),G4()}finally{P4=f,O4=a}}if(F(Vd(e))){Jc(Wa," ");V4(jC);a=d+1;var h=F(Vd(e));d=a;e=h;continue}}}else Jc(Wa,"...");break}}G4()}finally{P4=c,O4=b}}return null},X5,V5,V5,U5,U5,X5,X5,U5]))),$5,
|
|
3018
|
-
$5=new ml(Pd.h("cljs.pprint","code-dispatch"),R5,
|
|
3017
|
+
if(F(a)){Jc(Wa," ");V4(jC);for(var d=0,e=F(a);;){if(mb(ab)||d<ab){if(e){if(l(U4()))Jc(Wa,"#");else{a=O4;var f=P4;O4+=1;P4=0;try{F4(null,null),R4(B(e)),F(e)&&(Jc(Wa," "),V4(tm),R4(Ce(e))),G4()}finally{P4=f,O4=a}}if(F(Vd(e))){Jc(Wa," ");V4(jC);a=d+1;var h=F(Vd(e));d=a;e=h;continue}}}else Jc(Wa,"...");break}}G4()}finally{P4=c,O4=b}}return null},X5,V5,V5,U5,U5,X5,X5,U5]))),$5,Kna=$g(ug),Lna=$g(ug),Mna=$g(ug),Nna=$g(ug),Ona=Od(ug,Yx,al.v?al.v():al.call(null));
|
|
3018
|
+
$5=new ml(Pd.h("cljs.pprint","code-dispatch"),R5,Ona,Kna,Lna,Mna,Nna);jl($5,WD,function(a){if(mb(L5(a))){var b=Txa.call(null,B(a));return l(b)?b.g?b.g(a):b.call(null,a):W5(a)}return null});jl($5,$s,function(a){var b=a.g?a.g(Z5):a.call(null,Z5);return l(b)?Q3.o(I([b])):l(L4)?Q3.o(I([Vf(a)])):R3.call(null,a)});jl($5,DG,M5);jl($5,jJ,N5);jl($5,Jw,P5);jl($5,In,Jxa);
|
|
3019
3019
|
jl($5,HH,function(a){var b=p,c=b.g,d=pb(a).name;var e=ok(/^[^$]+\$[^$]+/,d);e=l(e)?Q5.g?Q5.g(e):Q5.call(null,e):null;b=["#\x3c",c.call(b,l(e)?e:d),"@",p.g(fa(a)),": "].join("");if(l(U4()))Jc(Wa,"#");else{c=O4;d=P4;O4+=1;P4=0;try{F4(b,"\x3e");W4(TA,-(b.length-2));V4(jC);var f=null!=a?a.N&1||Va===a.Ug?!0:a.N?!1:ob(Rc,a):ob(Rc,a);var h=f?!Sc(a):f;R4(h?Pga:q(a));G4()}finally{P4=d,O4=c}}return null});jl($5,null,R3);jl($5,zl,O5);I4=S5;var Zxa=new R(null,3,5,S,[VH,new k(null,8,[uI,"10",qr,"10",zG,"0 0 24 24",HK,"none",kt,"currentColor",jG,"2.4",Np,"round",QD,"round"],null),new R(null,2,5,S,[wJ,new k(null,1,[AM,"M9 6l6 6-6 6"],null)],null)],null),$xa=new R(null,5,5,S,[VH,new k(null,8,[uI,"12",qr,"12",zG,"0 0 24 24",HK,"none",kt,"currentColor",jG,"2",Np,"round",QD,"round"],null),new R(null,2,5,S,[wJ,new k(null,1,[AM,"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"],null)],null),new R(null,
|
|
3020
3020
|
2,5,S,[SB,new k(null,4,[Cy,"12",Ox,"9",My,"12",Nx,"13"],null)],null),new R(null,2,5,S,[SB,new k(null,4,[Cy,"12",Ox,"17",My,"12.01",Nx,"17"],null)],null)],null);function a6(a){return null==a?!1:"string"===typeof a?!fP(a):Ye(a)?A(a):Ve(a)?A(a):!0}function b6(a){return Ha(function(){var b=new Sa,c=Ya,d=Xa;Ya=!0;Xa=function(e){return b.append(e)};try{Twa(a)}finally{Xa=d,Ya=c}return p.g(b)}())}
|
|
3021
3021
|
function c6(a){return null==a?"":"string"===typeof a?a:a instanceof x?Vf(a):"number"===typeof a||!0===a||!1===a?p.g(a):b6(a)}function d6(a){return new Date(l(function(){var b="string"===typeof a;return b?ok(/\d\d:\d\d/,a):b}())?function(){var b=$O(a," ","T");return l(ok(/(?:Z|[+-]\d\d:?\d\d)$/,b))?b:[b,"Z"].join("")}():a)}
|
|
@@ -3219,7 +3219,7 @@ oa,ra,Ba,Ea,Pa,Ca,Qa,$a){return function(){return K3(new k(null,2,[kw,l(Ea)?Ea:"
|
|
|
3219
3219
|
5,S,[$E,[":",Vf(G)].join("")],null),new R(null,3,5,S,[Ms,new k(null,2,[nC,"Remove this override",Lu,new k(null,1,[Iu,function(K,O,P,T,Z,Y,aa,V){return function(){return K3(new k(null,2,[kw,l(aa)?aa:"info",zJ,v7(zh(function(W){var ma=J(W,0,null);J(W,1,null);return yg(ma,O)},V))],null))}}(D,E,G,u,t,b,c,d,e,f,h)],null)],null),"×"],null)],null),r(Vd(u)))}return null}},null,null)}(d)}()],null)],null):null,new R(null,3,5,S,[o0,new R(null,3,5,S,[qca,"Source: ",new R(null,2,5,S,[bba,function(){var m=null==
|
|
3220
3220
|
b?null:aw.g(b);m=null==m?null:Vf(m);return l(m)?m:"env"}()],null)],null),z.h(tda,aw.g(b))?new R(null,3,5,S,[iba,new k(null,2,[nC,"Clear DB overlay and revert to env-var defaults",Lu,new k(null,1,[Iu,function(){return YR(VR.h(G3({op:"log-config",action:"clear"}),H3),I3)}],null)],null),"revert to env defaults"],null):null],null),l(h)?new R(null,2,5,S,[nka,h],null):null],null)}
|
|
3221
3221
|
var w7=function(){var a=$g(ug),b=$g(ug),c=$g(ug),d=$g(ug),e=Od(ug,Yx,al.v?al.v():al.call(null));return new ml(Pd.h("synthigy.log.cockpit.ui","lens-view"),function(f){return no.g(R2(f))},e,a,b,c,d)}();w7.B(null,zl,function(a){return new R(null,3,5,S,[Oia,Zza(a),new R(null,3,5,S,[rfa,eAa(a),aAa(a)],null)],null)});w7.B(null,Lv,function(a){return gza(a)});w7.B(null,iM,function(a){return sza(a)});w7.B(null,Dy,function(a){return Pya(a)});w7.B(null,qN,function(){return Nza()});
|
|
3222
|
-
function hAa(a,b){return new R(null,6,5,S,[rba,k2(null),l(nx.g(a))?null:M8(),Xza(M.j(a,zq,b)),l(Jm.g(b))?gAa(b):null,w7.g(b)],null)};var a2=new CSSStyleSheet;a2.replaceSync("/* Synthigy Log Cockpit — Phase 1 skeleton.\n * Variable conventions mirror data/console/console.css:\n * --sy-* Synthigy semantic colors (text, background, accents)\n * --modeling-* Modeler chrome (overlays, handles)\n * Never hardcode colors — always var() with a sensible fallback.\n *\n * Class prefix: .lc- (log cockpit).\n *\n * After editing this file, ALSO save component.cljs to re-run the\n * defstyles macro — bare .css edits are not seen by shadow-cljs.\n */\n\n/* ── Host ───────────────────────────────────────────────────────────────────── */\n:host {\n display: none;\n position: fixed;\n inset: 0;\n z-index: 9998;\n font-family: 'Inter', system-ui, -apple-system, sans-serif;\n font-size: 13px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n:host([open]) { display: block; }\n\n*, *::before, *::after { box-sizing: border-box; }\n\n/* ── Root layout ────────────────────────────────────────────────────────────── */\n.lc-root {\n position: relative; /* containing block for the starfield */\n isolation: isolate; /* keeps z-index:-1 starfield above .lc-root bg */\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background: var(--sy-bg-app, #161616);\n color: var(--sy-text-primary, #d4d4d4);\n}\n\n/* ── Toolbar ────────────────────────────────────────────────────────────────── */\n.lc-toolbar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 12px;\n height: 38px;\n background: var(--sy-bg-surface, #1e1e1e);\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n flex-shrink: 0;\n}\n.lc-toolbar-brand {\n display: flex;\n align-items: center;\n margin-top: 10px;\n margin-left: -10px;\n pointer-events: none;\n}\n.lc-toolbar-brand svg { height: 28px; width: auto; display: block; }\n.lc-toolbar-title {\n margin-top: 4px;\n font-size: 11px;\n font-weight: 600;\n color: var(--sy-text-muted, #666);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n}\n.lc-toolbar-spacer { flex: 1; }\n\n.lc-toolbar-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n background: none;\n border: 1px solid transparent;\n padding: 3px 8px;\n font-size: 11px;\n color: var(--sy-text-muted, #666);\n border-radius: 3px;\n cursor: pointer;\n transition: background .12s, color .12s, border-color .12s;\n}\n.lc-toolbar-btn:hover {\n background: var(--sy-hover-overlay, rgba(255,255,255,.05));\n color: var(--sy-text-primary, #d4d4d4);\n}\n.lc-toolbar-btn:disabled { opacity: 0.5; cursor: wait; }\n.lc-toolbar-btn.live {\n color: var(--sy-op-sql, #a8adb5);\n border-color: var(--sy-op-sql, #a8adb5);\n}\n.lc-toolbar-btn.live.paused {\n color: var(--sy-op-write, #f0f0f0);\n border-color: var(--sy-op-write, #f0f0f0);\n}\n\n.lc-since-select {\n appearance: none;\n -webkit-appearance: none;\n background: var(--sy-bg-band, #252525);\n color: var(--sy-text-primary, #d4d4d4);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n padding: 3px 22px 3px 8px;\n font-size: 11px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n cursor: pointer;\n /* Inline chevron — no native one when appearance is reset. */\n background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),\n linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position: calc(100% - 12px) 50%, calc(100% - 8px) 50%;\n background-size: 4px 4px, 4px 4px;\n background-repeat: no-repeat;\n}\n\n/* ── Lens tabs (in toolbar) ─────────────────────────────────────────────────── */\n.lc-lens-tabs {\n display: flex;\n align-items: center;\n gap: 2px;\n margin-left: 8px;\n}\n.lc-lens-tab {\n background: none;\n border: none;\n padding: 4px 10px;\n font-size: 12px;\n font-weight: 500;\n color: var(--sy-text-muted, #666);\n border-radius: 3px;\n cursor: pointer;\n transition: background .12s, color .12s;\n}\n.lc-lens-tab:hover {\n background: var(--sy-hover-overlay, rgba(255,255,255,.05));\n color: var(--sy-text-primary, #d4d4d4);\n}\n.lc-lens-tab.selected {\n background: var(--sy-accent-tint, rgba(255, 255, 255,.14));\n color: var(--sy-accent, #e2e2e2);\n}\n.lc-lens-tab.pro {\n color: var(--sy-text-faint, #3a3a3a);\n}\n.lc-lens-tab.pro::after {\n content: \" ★\";\n color: var(--sy-op-write, #f0f0f0);\n}\n.lc-lens-tab.locked {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ── Body (form sidebar + main) ─────────────────────────────────────────────── */\n.lc-body {\n display: flex;\n flex: 1;\n overflow: hidden;\n position: relative;\n}\n\n/* ── Per-lens filter form sidebar ───────────────────────────────────────────── */\n.lc-form-sidebar {\n flex: 0 0 240px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 14px 14px 12px;\n border-right: 1px solid var(--sy-border, #2a2a2a);\n background: var(--sy-bg-surface, #1e1e1e);\n overflow-y: auto;\n}\n.lc-form-title {\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--sy-text-primary, #d4d4d4);\n padding-bottom: 2px;\n}\n.lc-form-desc {\n font-size: 11px;\n color: var(--sy-text-muted, #666);\n line-height: 1.4;\n padding-bottom: 4px;\n border-bottom: 1px solid var(--sy-border-subtle, rgba(255,255,255,.04));\n}\n.lc-form-fields {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.lc-form-field {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n.lc-form-label {\n font-size: 10px;\n color: var(--sy-text-faint, #3a3a3a);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n}\n.lc-form-input,\n.lc-form-select {\n width: 100%;\n padding: 5px 8px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 12px;\n color: var(--sy-text-primary, #d4d4d4);\n background: var(--sy-bg-band, #252525);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n outline: none;\n transition: border-color .12s ease;\n}\n.lc-form-input::placeholder { color: var(--sy-text-faint, #3a3a3a); }\n.lc-form-input:focus,\n.lc-form-select:focus { border-color: var(--sy-accent, #e2e2e2); }\n.lc-form-select {\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns\x3d'http://www.w3.org/2000/svg' width\x3d'10' height\x3d'6' viewBox\x3d'0 0 10 6'%3E%3Cpath fill\x3d'none' stroke\x3d'%23666' stroke-width\x3d'1.4' stroke-linecap\x3d'round' stroke-linejoin\x3d'round' d\x3d'M1 1l4 4 4-4'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 8px center;\n padding-right: 24px;\n}\n.lc-form-clear {\n align-self: flex-start;\n margin-top: 4px;\n padding: 4px 10px;\n font-size: 11px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n color: var(--sy-text-muted, #666);\n background: none;\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n cursor: pointer;\n transition: color .12s ease, border-color .12s ease;\n}\n.lc-form-clear:hover {\n color: var(--sy-op-write, #f0f0f0);\n border-color: var(--sy-op-write, #f0f0f0);\n}\n\n/* ── Stats bar — floating badges in the bottom-right of the stream ──────────── */\n.lc-stats {\n position: absolute;\n right: 16px;\n bottom: 16px;\n z-index: 5;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 8px;\n background: var(--sy-bg-surface, rgba(255,255,255,.95));\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 18px;\n box-shadow: 0 2px 8px rgba(0,0,0,.08);\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 11px;\n backdrop-filter: blur(8px);\n}\n.lc-stat {\n display: inline-flex;\n align-items: baseline;\n gap: 4px;\n padding: 2px 8px;\n border-radius: 10px;\n background: var(--sy-bg-band, #252525);\n border: 1px solid var(--sy-border-subtle, rgba(0,0,0,.08));\n color: var(--sy-text-muted, #666);\n cursor: pointer;\n transition: background .12s, color .12s, border-color .12s;\n}\n.lc-stat:hover {\n background: var(--sy-hover-overlay, rgba(0,0,0,.04));\n color: var(--sy-text-primary, #d4d4d4);\n}\n.lc-stat-count {\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n color: var(--sy-text-primary, #d4d4d4);\n}\n.lc-stat-unit { color: var(--sy-text-muted, #666); }\n\n.lc-stat.lc-stat-rows { border-color: var(--sy-accent, #e2e2e2); }\n.lc-stat.lc-stat-rows .lc-stat-count { color: var(--sy-accent, #e2e2e2); }\n\n.lc-stat-lvl.lvl-info .lc-stat-count { color: var(--sy-accent, #e2e2e2); }\n.lc-stat-lvl.lvl-warn .lc-stat-count { color: var(--sy-op-write, #f0f0f0); }\n.lc-stat-lvl.lvl-error .lc-stat-count { color: var(--sy-error, #f7768e); }\n.lc-stat-lvl.lvl-fatal .lc-stat-count { color: var(--sy-error, #f7768e); }\n.lc-stat-lvl.lvl-debug .lc-stat-count { color: var(--sy-text-muted, #666); }\n.lc-stat-lvl.lvl-trace .lc-stat-count { color: var(--sy-text-faint, #3a3a3a); }\n\n.lc-stat.lc-stat-timing { cursor: default; }\n.lc-stat.lc-stat-timing:hover { background: var(--sy-bg-band, #252525); }\n\n/* ── Settings drawer (toolbar gear opens this overlay) ─────────────────────── */\n.lc-settings-drawer {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 20;\n width: 360px;\n max-height: calc(100% - 12px);\n padding: 14px 16px 16px;\n background: var(--sy-bg-surface, #1e1e1e);\n border-left: 1px solid var(--sy-border, #2a2a2a);\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n border-bottom-left-radius: 6px;\n box-shadow: -4px 8px 24px rgba(0,0,0,.32);\n overflow-y: auto;\n font-size: 12px;\n}\n.lc-toolbar-btn.active {\n background: var(--sy-accent-tint, rgba(255, 255, 255,.14));\n color: var(--sy-accent, #e2e2e2);\n}\n\n/* ── Settings panel (log-level control — content of the drawer) ────────────── */\n.lc-settings-section { margin-bottom: 16px; }\n.lc-settings-title {\n font-size: 10px;\n font-weight: 600;\n color: var(--sy-text-muted, #666);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n margin-bottom: 6px;\n}\n.lc-settings-select {\n appearance: none;\n -webkit-appearance: none;\n width: 100%;\n background: var(--sy-bg-band, #252525);\n color: var(--sy-text-primary, #d4d4d4);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n padding: 4px 22px 4px 8px;\n font-size: 12px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n cursor: pointer;\n background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),\n linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position: calc(100% - 12px) 50%, calc(100% - 8px) 50%;\n background-size: 4px 4px, 4px 4px;\n background-repeat: no-repeat;\n}\n\n/* ── Add-override row ──────────────────────────────────────────────────────── */\n.lc-ns-add {\n display: flex;\n gap: 4px;\n align-items: center;\n}\n.lc-ns-input {\n flex: 1;\n min-width: 0;\n background: var(--sy-bg-band, #252525);\n color: var(--sy-text-primary, #d4d4d4);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n padding: 4px 6px;\n font-size: 11px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n}\n.lc-ns-input:focus {\n outline: none;\n border-color: var(--sy-accent, #e2e2e2);\n}\n.lc-ns-level-select {\n appearance: none;\n -webkit-appearance: none;\n background: var(--sy-bg-band, #252525);\n color: var(--sy-text-primary, #d4d4d4);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n padding: 4px 20px 4px 6px;\n font-size: 11px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n cursor: pointer;\n background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),\n linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position: calc(100% - 10px) 50%, calc(100% - 6px) 50%;\n background-size: 4px 4px, 4px 4px;\n background-repeat: no-repeat;\n}\n.lc-ns-add-btn {\n background: var(--sy-bg-band, #252525);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-primary, #d4d4d4);\n padding: 4px 10px;\n font-size: 11px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n cursor: pointer;\n}\n.lc-ns-add-btn:hover:not(:disabled) {\n border-color: var(--sy-accent, #e2e2e2);\n color: var(--sy-accent, #e2e2e2);\n}\n.lc-ns-add-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.lc-settings-hint {\n font-size: 10px;\n color: var(--sy-text-muted, #666);\n margin-top: 4px;\n line-height: 1.4;\n}\n.lc-settings-hint code {\n background: var(--sy-bg-band, #252525);\n padding: 0 4px;\n border-radius: 2px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n color: var(--sy-text-primary, #d4d4d4);\n}\n\n.lc-ns-list {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n.lc-ns-row {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 3px 6px;\n background: var(--sy-bg-band, #252525);\n border: 1px solid var(--sy-border-subtle, rgba(0,0,0,.06));\n border-radius: 3px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 11px;\n}\n.lc-ns-pattern {\n flex: 1;\n color: var(--sy-text-primary, #d4d4d4);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.lc-ns-level {\n color: var(--sy-accent, #e2e2e2);\n font-weight: 500;\n}\n.lc-ns-x {\n background: none;\n border: none;\n color: var(--sy-text-muted, #666);\n cursor: pointer;\n padding: 0 4px;\n}\n.lc-ns-x:hover { color: var(--sy-op-write, #f0f0f0); }\n\n.lc-settings-source {\n font-size: 11px;\n color: var(--sy-text-muted, #666);\n margin-bottom: 6px;\n}\n.lc-settings-source-tag {\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n color: var(--sy-accent, #e2e2e2);\n}\n.lc-settings-revert {\n background: none;\n border: 1px dashed var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-muted, #666);\n padding: 4px 8px;\n font-size: 11px;\n cursor: pointer;\n width: 100%;\n}\n.lc-settings-revert:hover {\n color: var(--sy-op-write, #f0f0f0);\n border-color: var(--sy-op-write, #f0f0f0);\n}\n.lc-settings-error {\n font-size: 11px;\n color: var(--sy-error, #f7768e);\n padding: 6px 8px;\n border: 1px solid var(--sy-error, #f7768e);\n border-radius: 3px;\n margin-top: 8px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n}\n.lc-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative; /* anchor for floating .lc-stats overlay */\n}\n\n/* ── Stream ─────────────────────────────────────────────────────────────────── */\n.lc-stream {\n flex: 1;\n overflow-y: auto;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 12px;\n}\n.lc-row {\n display: grid;\n grid-template-columns: 72px 56px 240px 1fr;\n gap: 12px;\n padding: 8px 14px;\n align-items: flex-start;\n border-bottom: 1px solid var(--sy-border-subtle, rgba(255,255,255,.03));\n cursor: pointer;\n}\n.lc-row:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.04)); }\n.lc-row.selected { background: var(--sy-accent-tint, rgba(255, 255, 255,.08)); }\n\n.lc-row-ts {\n color: var(--sy-text-muted, #666);\n font-variant-numeric: tabular-nums;\n padding-top: 1px;\n}\n.lc-row-id {\n color: var(--sy-text-muted, #666);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n padding-top: 1px;\n}\n.lc-row-msg {\n color: var(--sy-text-primary, #d4d4d4);\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 12px;\n min-width: 0;\n}\n.lc-row-msg-text {\n flex: 1 1 auto;\n min-width: 0;\n padding-top: 1px;\n word-break: break-word;\n white-space: normal;\n line-height: 1.45;\n}\n.lc-row-actions {\n flex: 0 0 auto;\n display: flex;\n gap: 6px;\n}\n\n/* Right-aligned action buttons on each row. Click → filters the lens\n form by the row's user_xid / request_id. Distinct from a \"pill\" — these\n read as buttons: icon + value, accent on hover. */\n.lc-row-action {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n height: 20px;\n padding: 0 8px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 11px;\n color: var(--sy-text-primary, #d4d4d4);\n background: var(--sy-bg-band, #252525);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 4px;\n cursor: pointer;\n line-height: 1;\n transition: background .12s ease, border-color .12s ease, color .12s ease;\n}\n.lc-row-action:hover {\n background: var(--sy-accent, #e2e2e2);\n border-color: var(--sy-accent, #e2e2e2);\n color: var(--sy-bg-app, #161616);\n}\n.lc-row-action-icon { opacity: 0.7; }\n.lc-row-action:hover .lc-row-action-icon { opacity: 1; }\n.lc-row-action-value {\n font-variant-numeric: tabular-nums;\n margin-top: 3px;\n}\n\n.lc-row-lvl { font-weight: 600; text-transform: uppercase; font-size: 10px; }\n.lc-row-lvl.lvl-trace { color: var(--sy-text-faint, #3a3a3a); }\n.lc-row-lvl.lvl-debug { color: var(--sy-text-muted, #666); }\n.lc-row-lvl.lvl-info { color: var(--sy-accent, #e2e2e2); }\n.lc-row-lvl.lvl-warn { color: var(--sy-op-write, #f0f0f0); }\n.lc-row-lvl.lvl-error { color: var(--sy-error, #f7768e); }\n.lc-row-lvl.lvl-fatal { color: var(--sy-error, #f7768e); background: rgba(247,118,142,.1); }\n\n.lc-row-expanded {\n padding: 8px 12px 12px 102px;\n color: var(--sy-text-muted, #666);\n font-size: 11px;\n background: var(--sy-bg-surface, #1e1e1e);\n}\n.lc-row-expanded .k {\n color: var(--sy-text-muted, #666);\n white-space: pre;\n}\n.lc-row-expanded .v {\n color: var(--sy-text-primary, #d4d4d4);\n word-break: break-word;\n white-space: pre-wrap;\n}\n.lc-row-expanded .v.pivot {\n cursor: pointer;\n border-bottom: 1px dashed transparent;\n transition: border-color .12s ease, color .12s ease;\n}\n.lc-row-expanded .v.pivot:hover {\n color: var(--sy-accent, #e2e2e2);\n border-bottom-color: var(--sy-accent, #e2e2e2);\n}\n.lc-row-expanded .lc-kv-section {\n margin-top: 6px;\n}\n.lc-row-expanded .lc-kv-section .k {\n color: var(--sy-text-primary, #d4d4d4);\n text-transform: uppercase;\n font-size: 10px;\n letter-spacing: 0.05em;\n}\n.lc-row-expanded .lc-error-trace {\n margin: 6px 0 0;\n padding: 8px 10px;\n background: var(--sy-bg-band, rgba(0,0,0,.18));\n color: var(--sy-error, #f7768e);\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 10.5px;\n line-height: 1.5;\n white-space: pre;\n overflow-x: auto;\n border-left: 2px solid var(--sy-error, #f7768e);\n border-radius: 2px;\n}\n.lc-row-kv {\n color: var(--sy-text-muted, #666);\n font-size: 11px;\n}\n.lc-kv {\n display: grid;\n grid-template-columns: 110px minmax(0, 1fr);\n gap: 8px;\n align-items: baseline;\n padding: 1px 0;\n}\n\n.lc-empty-hint {\n font-size: 11px;\n color: var(--sy-text-faint, #3a3a3a);\n}\n\n/* ── Empty + loading states ─────────────────────────────────────────────────── */\n.lc-empty,\n.lc-loading,\n.lc-error {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--sy-text-muted, #666);\n font-size: 12px;\n gap: 8px;\n}\n.lc-error { color: var(--sy-error, #f7768e); }\n\n/* ── Pro overlay (for locked lenses) ────────────────────────────────────────── */\n.lc-pro-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(22, 22, 22, 0.92);\n z-index: 10;\n}\n.lc-pro-card {\n max-width: 420px;\n padding: 24px;\n border: 1px solid var(--sy-op-write, #f0f0f0);\n border-radius: 6px;\n text-align: center;\n}\n\n/* ═══════════════════════════════════════════════════════════════════════════\n * SQL lens — class prefix .lens-*. Owned by lens/sql.cljs, dispatched from\n * ui/lens-view :sql. Drops the generic form-sidebar + stream in favour of\n * a focus selector + drillable table.\n * ═════════════════════════════════════════════════════════════════════════ */\n\n.lens-lens {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0;\n}\n\n/* ── Control bar (focus selector + debug toggle) ─────────────────────────── */\n.lens-control-bar {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n background: var(--sy-bg-surface, #1e1e1e);\n flex-shrink: 0;\n}\n.lens-control-spacer { flex: 1; }\n\n/* ── Pickers (Entity / User / Operation / Request) ───────────────────────── */\n.lens-pickers {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n.lens-picker { position: relative; }\n.lens-picker-inline { display: inline-flex; align-items: center; }\n\n.lens-picker-trigger {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 26px;\n padding: 0 10px;\n font-size: 12px;\n background: transparent;\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-muted, #888);\n cursor: pointer;\n transition: color 80ms, background 80ms, border-color 80ms;\n}\n.lens-picker-trigger:hover {\n color: var(--sy-text-primary, #d4d4d4);\n border-color: var(--sy-border-strong, #3a3a3a);\n}\n.lens-picker-trigger.open,\n.lens-picker-trigger.has-values {\n color: var(--sy-accent, #e2e2e2);\n border-color: var(--sy-accent, #e2e2e2);\n background: color-mix(in srgb, var(--sy-accent, #e2e2e2) 10%, transparent);\n}\n.lens-picker-label { letter-spacing: 0.01em; }\n.lens-picker-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 16px;\n padding: 0 4px;\n font-size: 10.5px;\n font-weight: 600;\n color: var(--sy-bg-app, #161616);\n background: var(--sy-accent, #e2e2e2);\n border-radius: 8px;\n}\n.lens-picker-caret {\n display: inline-flex;\n align-items: center;\n transform: rotate(90deg);\n transition: transform 100ms;\n}\n.lens-picker-trigger.open .lens-picker-caret { transform: rotate(-90deg); }\n\n.lens-picker-text {\n height: 26px;\n width: 160px;\n padding: 0 10px;\n font-size: 12px;\n background: transparent;\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-primary, #d4d4d4);\n font-family: ui-monospace, monospace;\n}\n.lens-picker-text:focus {\n outline: none;\n border-color: var(--sy-accent, #e2e2e2);\n}\n.lens-picker-text::placeholder { color: var(--sy-text-faint, #3a3a3a); }\n\n.lens-picker-panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 50;\n min-width: 240px;\n max-width: 360px;\n background: var(--sy-bg-surface, #1e1e1e);\n border: 1px solid var(--sy-border-strong, #3a3a3a);\n border-radius: 4px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n max-height: 380px;\n}\n.lens-picker-panel-user { min-width: 280px; }\n.lens-picker-search {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 10px 6px 10px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n}\n.lens-picker-search-input {\n flex: 1;\n height: 24px;\n padding: 0 8px;\n font-size: 12px;\n background: var(--sy-bg-app, #161616);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-primary, #d4d4d4);\n}\n.lens-picker-search-input:focus {\n outline: none;\n border-color: var(--sy-accent, #e2e2e2);\n}\n.lens-picker-spin {\n color: var(--sy-text-faint, #3a3a3a);\n font-size: 11px;\n}\n.lens-picker-panel-body {\n flex: 1;\n overflow-y: auto;\n padding: 4px 0;\n}\n.lens-picker-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 10px;\n cursor: pointer;\n user-select: none;\n}\n.lens-picker-row:hover { background: color-mix(in srgb, var(--sy-accent, #e2e2e2) 10%, transparent); }\n.lens-picker-cb { cursor: pointer; }\n.lens-picker-row-label {\n font-size: 12px;\n color: var(--sy-text-primary, #d4d4d4);\n display: inline-flex;\n flex-direction: column;\n min-width: 0;\n}\n.lens-picker-row-sub {\n font-family: ui-monospace, monospace;\n font-size: 10.5px;\n color: var(--sy-text-faint, #3a3a3a);\n}\n.lens-picker-hint {\n padding: 8px 10px;\n font-size: 11px;\n color: var(--sy-text-faint, #3a3a3a);\n}\n.lens-picker-clear {\n margin: 4px 8px 8px 8px;\n height: 22px;\n padding: 0 10px;\n font-size: 11px;\n background: transparent;\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-muted, #888);\n cursor: pointer;\n align-self: flex-end;\n}\n.lens-picker-clear:hover { color: var(--sy-error, #f7768e); border-color: var(--sy-error, #f7768e); }\n\n.lens-debug-toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 26px;\n padding: 0 10px;\n font-size: 11px;\n background: transparent;\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-muted, #888);\n cursor: pointer;\n transition: color 80ms, background 80ms, border-color 80ms;\n}\n.lens-debug-toggle .lens-debug-dot {\n width: 7px; height: 7px;\n border-radius: 50%;\n background: var(--sy-text-faint, #3a3a3a);\n transition: background 80ms;\n}\n.lens-debug-toggle:hover {\n color: var(--sy-text-primary, #d4d4d4);\n border-color: var(--sy-border-strong, #3a3a3a);\n}\n.lens-debug-toggle.on {\n color: var(--sy-op-write, #f0f0f0);\n border-color: var(--sy-op-write, #f0f0f0);\n background: color-mix(in srgb, var(--sy-op-write, #f0f0f0) 14%, transparent);\n}\n.lens-debug-toggle.on .lens-debug-dot {\n background: var(--sy-op-write, #f0f0f0);\n box-shadow: 0 0 6px var(--sy-op-write, #f0f0f0);\n}\n\n/* ── Debug warning banner ────────────────────────────────────────────────── */\n.lens-debug-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n font-size: 12px;\n color: var(--sy-op-write, #f0f0f0);\n background: color-mix(in srgb, var(--sy-op-write, #f0f0f0) 10%, transparent);\n border-bottom: 1px solid color-mix(in srgb, var(--sy-op-write, #f0f0f0) 30%, transparent);\n flex-shrink: 0;\n}\n\n/* ── Crumb bar (multi-value per axis) ────────────────────────────────────── */\n.lens-crumbs {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 6px 10px;\n padding: 6px 12px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n background: var(--sy-bg-app, #161616);\n flex-shrink: 0;\n min-height: 36px;\n}\n.lens-crumb-clear {\n height: 22px;\n padding: 0 10px;\n font-size: 11px;\n background: transparent;\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-muted, #888);\n cursor: pointer;\n}\n.lens-crumb-clear:disabled { opacity: 0.4; cursor: default; }\n.lens-crumb-clear:hover:not(:disabled) {\n color: var(--sy-error, #f7768e);\n border-color: var(--sy-error, #f7768e);\n}\n.lens-crumb-group {\n display: inline-flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n}\n.lens-crumb-axis {\n font-size: 10.5px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--sy-text-faint, #3a3a3a);\n margin-right: 2px;\n}\n.lens-crumb-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n height: 22px;\n padding: 0 4px 0 8px;\n font-size: 12px;\n border-radius: 3px;\n background: color-mix(in srgb, var(--sy-accent, #e2e2e2) 12%, transparent);\n color: var(--sy-accent, #e2e2e2);\n border: 1px solid color-mix(in srgb, var(--sy-accent, #e2e2e2) 40%, transparent);\n}\n.lens-crumb-label { font-weight: 500; }\n.lens-crumb-x {\n background: transparent;\n border: 0;\n padding: 0 4px;\n font-size: 14px;\n line-height: 1;\n color: currentColor;\n cursor: pointer;\n opacity: 0.7;\n}\n.lens-crumb-x:hover { opacity: 1; }\n\n/* ── Table ───────────────────────────────────────────────────────────────── */\n.lens-table-wrap {\n flex: 1;\n min-height: 0;\n overflow: auto;\n}\n.lens-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n font-variant-numeric: tabular-nums;\n}\n.lens-th {\n position: sticky;\n top: 0;\n z-index: 1;\n text-align: left;\n padding: 6px 8px;\n font-weight: 500;\n font-size: 10.5px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--sy-text-faint, #3a3a3a);\n background: var(--sy-bg-surface, #1e1e1e);\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n white-space: nowrap;\n}\n.lens-row {\n cursor: pointer;\n border-bottom: 1px solid color-mix(in srgb, var(--sy-border, #2a2a2a) 50%, transparent);\n}\n.lens-row:hover { background: var(--sy-bg-surface, #1e1e1e); }\n.lens-row.selected { background: color-mix(in srgb, var(--sy-accent, #e2e2e2) 8%, transparent); }\n.lens-row.err { background: color-mix(in srgb, var(--sy-error, #f7768e) 8%, transparent); }\n.lens-cell {\n padding: 4px 8px;\n vertical-align: middle;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 260px;\n}\n.lens-cell-ts {\n color: var(--sy-text-muted, #888);\n font-family: ui-monospace, monospace;\n font-size: 11px;\n}\n/* System lens time column carries a date line above the time (the\n timeline can land on any day, so the date matters). */\n.lens-cell-ts-dt { line-height: 1.25; white-space: nowrap; }\n.lens-cell-ts-dt .lens-ts-date {\n display: block; font-size: 10px; color: var(--sy-text-faint, #3a3a3a);\n}\n.lens-cell-ts-dt .lens-ts-time { display: block; }\n.lens-cell-lvl {\n font-size: 10.5px;\n text-transform: uppercase;\n text-align: center;\n width: 50px;\n}\n.lens-cell-lvl.lvl-trace { color: var(--sy-text-faint, #3a3a3a); }\n.lens-cell-lvl.lvl-debug { color: var(--sy-text-muted, #888); }\n.lens-cell-lvl.lvl-info { color: var(--sy-info, #9aa0a8); }\n.lens-cell-lvl.lvl-warn { color: var(--sy-warn, #e0af68); }\n.lens-cell-lvl.lvl-error,\n.lens-cell-lvl.lvl-fatal { color: var(--sy-error, #f7768e); }\n\n.lens-cell-kind { width: 60px; }\n.lens-pill {\n display: inline-block;\n padding: 1px 6px;\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n border-radius: 2px;\n}\n.lens-pill.kind-read {\n color: var(--sy-info, #9aa0a8);\n background: color-mix(in srgb, var(--sy-info, #9aa0a8) 14%, transparent);\n}\n.lens-pill.kind-write {\n color: var(--sy-op-write, #f0f0f0);\n background: color-mix(in srgb, var(--sy-op-write, #f0f0f0) 14%, transparent);\n}\n\n.lens-cell-op,\n.lens-cell-entity,\n.lens-cell-user,\n.lens-cell-req { font-family: ui-monospace, monospace; font-size: 11.5px; }\n\n/* Auth lens action-cell color hints — green for success states\n (authenticated/issued/exchanged/refreshed/validated), red for\n rejection/failure family. Applied by `action-class` in lens/auth.cljs. */\n.lens-cell-op.ok { color: var(--sy-success, #a8adb5); }\n.lens-cell-op.err { color: var(--sy-error, #f7768e); }\n.lens-cell-op.ok .lens-cell-drill { color: inherit; }\n.lens-cell-op.err .lens-cell-drill { color: inherit; }\n\n/* Topic chips — wire-schema-v2 `:topics` classification (the signal's\n audience, orthogonal to level). Per-topic color via --topic-c so the\n base chip is shared by the detail panel (.lens-topic-chip span) and the\n stream rows (.lc-topic-chip button). */\n.lens-topics,\n.lc-row-topics { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px; }\n.lc-row-topics { margin-left: 8px; }\n\n.lens-topic-chip,\n.lc-topic-chip {\n --topic-c: var(--sy-text-muted, #6b7280);\n display: inline-block;\n padding: 1px 6px;\n font-family: ui-monospace, monospace;\n font-size: 10px;\n line-height: 1.5;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n border-radius: 2px;\n background: color-mix(in srgb, var(--topic-c) 14%, transparent);\n color: var(--topic-c);\n border: 1px solid color-mix(in srgb, var(--topic-c) 36%, transparent);\n}\n.lc-topic-chip { cursor: pointer; appearance: none; }\n.lc-topic-chip:hover { background: color-mix(in srgb, var(--topic-c) 26%, transparent); }\n\n/* ── Traffic lens — pure stats canvas. Generous padding + a consistent\n gap between sections does the spacing work; individual sections don't\n carry their own ad-hoc margins. ──────────────────────────────────────── */\n.lens-traffic {\n padding: 16px 20px 24px;\n display: flex;\n flex-direction: column;\n gap: 18px;\n overflow-y: auto;\n}\n\n/* ── Nav bar — ‹/› coarse paging + live jump. Fine navigation is\n drag-pan + wheel-zoom on the canvas itself. ─────────────────────────── */\n.lens-range-bar {\n display: flex; align-items: center; gap: 8px;\n}\n.lens-range-btn {\n appearance: none; background: none; cursor: pointer;\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 40%, transparent);\n border-radius: 4px; padding: 3px 10px;\n font-size: 11px; color: var(--sy-text-muted, #6b7280);\n}\n.lens-range-btn:hover:not(:disabled) {\n color: var(--sy-text, #e2e2e2); border-color: var(--sy-text-muted, #6b7280);\n}\n.lens-range-btn:disabled { opacity: .35; cursor: default; }\n.lens-range-window {\n flex: 1; font-size: 11px; color: var(--sy-text-muted, #6b7280);\n font-variant-numeric: tabular-nums; text-align: right;\n}\n.lens-range-live {\n display: inline-flex; align-items: center; gap: 6px;\n}\n.lens-range-live.on {\n color: var(--sy-ok, #6fae6f);\n border-color: color-mix(in srgb, var(--sy-ok, #6fae6f) 60%, transparent);\n background: color-mix(in srgb, var(--sy-ok, #6fae6f) 12%, transparent);\n}\n.lens-live-dot {\n width: 7px; height: 7px; border-radius: 50%;\n background: var(--sy-text-faint, #3a3a3a);\n}\n.lens-live-dot.on {\n background: var(--sy-ok, #6fae6f);\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--sy-ok, #6fae6f) 70%, transparent);\n animation: lens-live-pulse 1.6s ease-out infinite;\n}\n@keyframes lens-live-pulse {\n 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--sy-ok, #6fae6f) 70%, transparent); }\n 70% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--sy-ok, #6fae6f) 0%, transparent); }\n 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--sy-ok, #6fae6f) 0%, transparent); }\n}\n\n/* ── Health verdict banner — is it OK right now ────────────────────────── */\n.lens-verdict {\n display: flex; align-items: center; gap: 8px;\n padding: 8px 14px; border-radius: 8px;\n font-size: 12px;\n border: 1px solid transparent;\n}\n.lens-verdict-dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; }\n.lens-verdict-label {\n font-weight: 600; text-transform: uppercase; letter-spacing: .05em;\n font-size: 11px;\n}\n.lens-verdict-detail { color: var(--sy-text-muted, #6b7280); }\n.lens-verdict-rate {\n margin-left: auto; font-variant-numeric: tabular-nums;\n color: var(--sy-text, #e2e2e2); font-weight: 600;\n}\n.lens-verdict.healthy {\n background: color-mix(in srgb, var(--sy-ok, #6fae6f) 10%, transparent);\n border-color: color-mix(in srgb, var(--sy-ok, #6fae6f) 28%, transparent);\n}\n.lens-verdict.healthy .lens-verdict-dot { background: var(--sy-ok, #6fae6f); }\n.lens-verdict.healthy .lens-verdict-label { color: var(--sy-ok, #6fae6f); }\n.lens-verdict.degraded {\n background: color-mix(in srgb, var(--sy-warn, #e0af68) 12%, transparent);\n border-color: color-mix(in srgb, var(--sy-warn, #e0af68) 34%, transparent);\n}\n.lens-verdict.degraded .lens-verdict-dot { background: var(--sy-warn, #e0af68); }\n.lens-verdict.degraded .lens-verdict-label { color: var(--sy-warn, #e0af68); }\n.lens-verdict.critical {\n background: color-mix(in srgb, var(--sy-error, #f0a0a0) 14%, transparent);\n border-color: color-mix(in srgb, var(--sy-error, #f0a0a0) 40%, transparent);\n}\n.lens-verdict.critical .lens-verdict-dot {\n background: var(--sy-error, #f0a0a0);\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--sy-error, #f0a0a0) 70%, transparent);\n animation: lens-crit-pulse 1.3s ease-out infinite;\n}\n.lens-verdict.critical .lens-verdict-label { color: var(--sy-error, #f0a0a0); }\n@keyframes lens-crit-pulse {\n 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--sy-error, #f0a0a0) 70%, transparent); }\n 70% { box-shadow: 0 0 0 7px color-mix(in srgb, var(--sy-error, #f0a0a0) 0%, transparent); }\n 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--sy-error, #f0a0a0) 0%, transparent); }\n}\n.lens-verdict.idle {\n background: color-mix(in srgb, var(--sy-text-muted, #6b7280) 8%, transparent);\n border-color: color-mix(in srgb, var(--sy-text-muted, #6b7280) 22%, transparent);\n}\n.lens-verdict.idle .lens-verdict-dot { background: var(--sy-text-muted, #6b7280); }\n.lens-verdict.idle .lens-verdict-label { color: var(--sy-text-muted, #6b7280); }\n\n/* ── Headline tiles ─────────────────────────────────────────────────── */\n.lens-stats-head {\n display: flex; align-items: baseline; gap: 10px;\n font-size: 11px; color: var(--sy-text-muted, #6b7280);\n}\n.lens-stats-title { text-transform: uppercase; letter-spacing: .06em; }\n.lens-stats-meta { flex: 1; }\n.lens-stats-refresh {\n appearance: none; background: none; cursor: pointer;\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 40%, transparent);\n border-radius: 4px; padding: 3px 10px;\n font-size: 11px; color: var(--sy-text-muted, #6b7280);\n}\n.lens-stats-refresh:hover { color: var(--sy-text, #e2e2e2); border-color: var(--sy-text-muted, #6b7280); }\n.lens-stats-tiles {\n display: grid; gap: 12px;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n}\n.lens-stat-tile {\n appearance: none; text-align: left;\n display: flex; flex-direction: column; gap: 3px;\n padding: 12px 14px; border-radius: 8px;\n background: color-mix(in srgb, var(--sy-text-muted, #6b7280) 8%, transparent);\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 20%, transparent);\n color: inherit;\n}\n.lens-stat-tile.static { cursor: default; }\n.lens-stat-tile.err .lens-stat-value { color: var(--sy-error, #f0a0a0); }\n.lens-stat-value {\n font-size: 19px; font-weight: 600;\n font-variant-numeric: tabular-nums;\n color: var(--sy-text, #e2e2e2);\n}\n.lens-stat-label {\n font-size: 10px; text-transform: uppercase; letter-spacing: .06em;\n color: var(--sy-text-muted, #6b7280);\n}\n.lens-stat-sub { font-size: 10px; color: var(--sy-text-muted, #6b7280); }\n\n/* ── Traffic canvas card — pan/zoom time-series, the HERO ──────────────── */\n.lens-canvas-wrap {\n position: relative;\n user-select: none;\n padding: 16px 18px 12px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--sy-bg-surface, #1e1e1e) 55%, transparent);\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 18%, transparent);\n}\n.lens-canvas {\n display: block; width: 100%; height: 220px; cursor: grab;\n touch-action: none;\n}\n.lens-canvas:active { cursor: grabbing; }\n.lens-canvas-baseline {\n stroke: color-mix(in srgb, var(--sy-text-muted, #6b7280) 50%, transparent);\n stroke-width: 1; vector-effect: non-scaling-stroke;\n}\n.lens-canvas-tick {\n stroke: color-mix(in srgb, var(--sy-text-muted, #6b7280) 16%, transparent);\n stroke-width: 1; vector-effect: non-scaling-stroke;\n}\n.lens-canvas-crosshair {\n stroke: var(--sy-text, #e2e2e2);\n stroke-width: 1; vector-effect: non-scaling-stroke;\n pointer-events: none;\n}\n.lens-canvas-bar {\n fill: url(#traffic-ok);\n filter: drop-shadow(0 0 3px color-mix(in srgb, var(--sy-ok, #6fae6f) 45%, transparent));\n}\n.lens-canvas-bar.err {\n fill: url(#traffic-err);\n filter: drop-shadow(0 0 3px color-mix(in srgb, var(--sy-error, #f0a0a0) 50%, transparent));\n}\n/* ── Live 'now' edge — a bright leading line; pulses while following ────── */\n.lens-canvas-now {\n stroke: color-mix(in srgb, var(--sy-text, #e2e2e2) 40%, transparent);\n stroke-width: 1; vector-effect: non-scaling-stroke;\n stroke-dasharray: 3 3; pointer-events: none;\n}\n.lens-canvas-now.live {\n stroke: var(--sy-ok, #6fae6f);\n stroke-dasharray: none;\n}\n.lens-canvas-now-pulse {\n fill: var(--sy-ok, #6fae6f);\n transform-box: fill-box; transform-origin: center;\n animation: lens-now-pulse 1.6s ease-out infinite;\n pointer-events: none;\n}\n@keyframes lens-now-pulse {\n 0% { opacity: .9; r: 3; }\n 70% { opacity: 0; r: 9; }\n 100% { opacity: 0; r: 9; }\n}\n/* ── Health tint — the whole card takes on the verdict's mood ──────────── */\n.lens-canvas-wrap.verdict-degraded {\n border-color: color-mix(in srgb, var(--sy-warn, #e0af68) 30%, transparent);\n background: color-mix(in srgb, var(--sy-warn, #e0af68) 5%, color-mix(in srgb, var(--sy-bg-surface, #1e1e1e) 55%, transparent));\n}\n.lens-canvas-wrap.verdict-critical {\n border-color: color-mix(in srgb, var(--sy-error, #f0a0a0) 38%, transparent);\n background: color-mix(in srgb, var(--sy-error, #f0a0a0) 7%, color-mix(in srgb, var(--sy-bg-surface, #1e1e1e) 55%, transparent));\n}\n.lens-canvas-ticks { position: relative; height: 16px; margin-top: 4px; }\n.lens-canvas-tick-label {\n position: absolute; top: 0; transform: translateX(-50%);\n font-size: 10px; color: var(--sy-text-muted, #6b7280);\n font-variant-numeric: tabular-nums; white-space: nowrap;\n}\n.lens-canvas-scale {\n display: flex; justify-content: space-between;\n font-size: 10px; font-variant-numeric: tabular-nums;\n color: var(--sy-text-muted, #6b7280); margin-top: 4px;\n}\n.lens-canvas-scale .ok { color: var(--sy-ok, #6fae6f); }\n.lens-canvas-scale .err { color: var(--sy-error, #f0a0a0); }\n\n/* ── Latency lane — p50/p95 over time, its OWN y-scale under the volume\n chart (shared x-axis, not a dual-axis overlay) ──────────────────────── */\n.lens-latency-lane {\n margin-top: 10px;\n padding-top: 8px;\n border-top: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 16%, transparent);\n}\n.lens-latency-label {\n display: flex; justify-content: space-between; align-items: baseline;\n font-size: 10px; text-transform: uppercase; letter-spacing: .05em;\n color: var(--sy-text-muted, #6b7280); margin-bottom: 2px;\n}\n.lens-latency-peak { text-transform: none; letter-spacing: 0; font-variant-numeric: tabular-nums; }\n.lens-latency-svg { display: block; width: 100%; height: 64px; overflow: visible; }\n.lens-lat-p95 {\n fill: none; stroke: var(--sy-warn, #e0af68); stroke-width: 1.5;\n vector-effect: non-scaling-stroke; stroke-linejoin: round; stroke-linecap: round;\n}\n.lens-lat-p50 {\n fill: none; stroke: color-mix(in srgb, var(--sy-warn, #e0af68) 55%, transparent);\n stroke-width: 1; vector-effect: non-scaling-stroke;\n stroke-linejoin: round; stroke-linecap: round; stroke-dasharray: 3 2;\n}\n.lens-canvas-hover-lat { color: var(--sy-warn, #e0af68); font-variant-numeric: tabular-nums; }\n\n/* ── Hover tooltip — minute + error rate under the cursor ──────────────── */\n.lens-canvas-hover {\n position: absolute;\n top: 10px;\n transform: translateX(-50%);\n z-index: 4;\n pointer-events: none;\n display: flex; flex-direction: column; gap: 2px;\n padding: 6px 10px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--sy-bg-app, #161616) 90%, transparent);\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 30%, transparent);\n box-shadow: 0 4px 14px rgba(0,0,0,.35);\n font-size: 11px; white-space: nowrap;\n}\n.lens-canvas-hover-time {\n color: var(--sy-text, #e2e2e2); font-weight: 600;\n font-variant-numeric: tabular-nums;\n}\n.lens-canvas-hover-row { display: flex; gap: 8px; font-variant-numeric: tabular-nums; }\n.lens-canvas-hover-row .ok { color: var(--sy-ok, #6fae6f); }\n.lens-canvas-hover-row .err { color: var(--sy-error, #f0a0a0); }\n.lens-canvas-hover-rate { color: var(--sy-text-muted, #6b7280); }\n\n/* ── By-node breakdown card — which node serves the most traffic ───────── */\n.lens-by-node {\n padding: 14px 16px 16px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--sy-bg-surface, #1e1e1e) 55%, transparent);\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 18%, transparent);\n}\n.lens-by-node-title {\n display: flex; align-items: baseline; gap: 8px;\n font-size: 10px; text-transform: uppercase; letter-spacing: .06em;\n color: var(--sy-text-muted, #6b7280); margin-bottom: 8px;\n}\n.lens-by-node-scope {\n text-transform: none; letter-spacing: 0;\n color: var(--sy-text-faint, #3a3a3a); font-size: 10px;\n}\n.lens-by-node-row {\n display: grid; grid-template-columns: auto minmax(90px, 180px) 1fr auto;\n align-items: center; gap: 10px;\n padding: 6px 8px; border-radius: 6px;\n font-size: 11.5px; font-variant-numeric: tabular-nums;\n transition: background .12s ease;\n}\n.lens-by-node-row:hover {\n background: color-mix(in srgb, var(--sy-text-muted, #6b7280) 8%, transparent);\n}\n.lens-by-node-dot {\n width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;\n background: var(--node-c, var(--sy-accent, #e2e2e2));\n box-shadow: 0 0 6px color-mix(in srgb, var(--node-c, var(--sy-accent, #e2e2e2)) 60%, transparent);\n}\n.lens-by-node-name {\n overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n font-family: ui-monospace, monospace;\n color: var(--sy-text, #e2e2e2);\n}\n.lens-by-node-bar-wrap {\n height: 6px; border-radius: 3px; overflow: hidden;\n background: color-mix(in srgb, var(--sy-text-muted, #6b7280) 14%, transparent);\n}\n.lens-by-node-bar {\n height: 100%; border-radius: 3px; min-width: 2px;\n background: var(--sy-ok, #6fae6f);\n transition: width .2s ease, background .2s ease;\n}\n/* Load bar coloured by ERROR RATE (matches the health verdict thresholds),\n not a binary has-error flag. */\n.lens-by-node-bar.ok { background: var(--sy-ok, #6fae6f); }\n.lens-by-node-bar.degraded { background: var(--sy-warn, #e0af68); }\n.lens-by-node-bar.critical { background: var(--sy-error, #f0a0a0); }\n.lens-by-node-count { color: var(--sy-text-muted, #6b7280); white-space: nowrap; }\n\n/* ── System lens time-window navigator — pan/zoom/brush timeline ───────── */\n.lens-timeline {\n padding: 8px 12px 4px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n background: var(--sy-bg-surface, #1e1e1e);\n flex-shrink: 0;\n user-select: none;\n}\n.lens-tl-nav {\n display: flex; align-items: center; gap: 8px; margin-bottom: 6px;\n}\n.lens-tl-btn {\n appearance: none; background: none; cursor: pointer;\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 40%, transparent);\n border-radius: 4px; padding: 2px 9px;\n font-size: 11px; color: var(--sy-text-muted, #6b7280);\n}\n.lens-tl-btn:hover { color: var(--sy-text, #e2e2e2); border-color: var(--sy-text-muted, #6b7280); }\n/* Draw the eye to \"⤒ latest\" when the current window has no rows — the\n nudge to jump to where the data actually is. */\n.lens-tl-btn.nudge {\n color: var(--sy-accent, #e2e2e2);\n border-color: color-mix(in srgb, var(--sy-accent, #e2e2e2) 55%, transparent);\n background: var(--sy-accent-tint, rgba(255,255,255,.10));\n}\n/* Preset zoom levels — equal-width so the group reads as an even segmented\n control rather than ragged buttons. */\n.lens-tl-presets {\n display: inline-flex; gap: 2px;\n padding: 0 6px; margin: 0 2px;\n border-left: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 22%, transparent);\n border-right: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 22%, transparent);\n}\n.lens-tl-preset {\n appearance: none; background: none; cursor: pointer;\n border: 1px solid transparent; border-radius: 4px;\n padding: 2px 0; min-width: 38px; text-align: center;\n font-size: 11px;\n color: var(--sy-text-muted, #6b7280); font-variant-numeric: tabular-nums;\n}\n.lens-tl-preset:hover { color: var(--sy-text, #e2e2e2); }\n.lens-tl-preset.on {\n color: var(--sy-accent, #e2e2e2);\n background: var(--sy-accent-tint, rgba(255,255,255,.14));\n}\n.lens-tl-span {\n font-size: 11px; font-weight: 600; font-variant-numeric: tabular-nums;\n color: var(--sy-accent, #e2e2e2);\n min-width: 34px; text-align: center;\n}\n.lens-tl-label {\n font-size: 11px; color: var(--sy-text-muted, #6b7280);\n font-variant-numeric: tabular-nums; white-space: nowrap;\n}\n/* Pushes the row-count + live control to the right so the left cluster\n stays tightly, evenly grouped. */\n.lens-tl-spacer { flex: 1 1 auto; }\n.lens-tl-count {\n font-size: 10px; color: var(--sy-text-faint, #3a3a3a);\n font-variant-numeric: tabular-nums; white-space: nowrap;\n}\n.lens-tl-count.capped { color: var(--sy-warn, #e0af68); }\n.lens-tl-live { display: inline-flex; align-items: center; gap: 6px; }\n.lens-tl-live.on {\n color: var(--sy-ok, #6fae6f);\n border-color: color-mix(in srgb, var(--sy-ok, #6fae6f) 60%, transparent);\n background: color-mix(in srgb, var(--sy-ok, #6fae6f) 12%, transparent);\n}\n.lens-tl-live-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--sy-text-faint, #3a3a3a); }\n.lens-tl-live-dot.on { background: var(--sy-ok, #6fae6f); animation: lens-live-pulse 1.6s ease-out infinite; }\n\n.lens-tl-strip-wrap { position: relative; }\n.lens-tl-strip {\n display: block; width: 100%; height: 44px; cursor: grab;\n touch-action: none;\n background: color-mix(in srgb, var(--sy-bg-app, #161616) 60%, transparent);\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 18%, transparent);\n border-radius: 6px;\n}\n.lens-tl-strip:active { cursor: grabbing; }\n.lens-tl-tick {\n stroke: color-mix(in srgb, var(--sy-text-muted, #6b7280) 18%, transparent);\n stroke-width: 1; vector-effect: non-scaling-stroke;\n}\n/* Monochromatic density heatmap — one horizontal linearGradient (a stop\n per bin) on a single rect: smooth in X, uniform in Y, neutral ink whose\n opacity tracks the per-second rate on a constant scale. Fill + stops are\n set in window_nav; no static fill needed here. */\n/* Edge grab-handles — drag to move that bound independently */\n.lens-tl-handle {\n fill: color-mix(in srgb, var(--sy-accent, #e2e2e2) 14%, transparent);\n cursor: ew-resize;\n}\n.lens-tl-handle:hover { fill: color-mix(in srgb, var(--sy-accent, #e2e2e2) 28%, transparent); }\n.lens-tl-grip {\n stroke: color-mix(in srgb, var(--sy-accent, #e2e2e2) 55%, transparent);\n stroke-width: 2; vector-effect: non-scaling-stroke; pointer-events: none;\n}\n/* Brush preview while resizing an edge (axis frozen) */\n.lens-tl-brush { fill: color-mix(in srgb, var(--sy-accent, #e2e2e2) 16%, transparent); }\n.lens-tl-brush-edge {\n stroke: var(--sy-accent, #e2e2e2); stroke-width: 1.5;\n vector-effect: non-scaling-stroke;\n}\n.lens-tl-ticks { position: relative; height: 14px; margin-top: 2px; }\n.lens-tl-tick-label {\n position: absolute; top: 0; transform: translateX(-50%);\n font-size: 10px; color: var(--sy-text-muted, #6b7280);\n font-variant-numeric: tabular-nums; white-space: nowrap;\n}\n/* Edge ticks sit at left:0%/100% — centered transform would push half the\n label past the strip's bounds (the end one goes fully invisible against\n a clipping ancestor). Pin them inward instead. */\n.lens-tl-tick-label.edge-start { transform: translateX(0); }\n.lens-tl-tick-label.edge-end { transform: translateX(-100%); }\n\n.topic-system { --topic-c: var(--sy-accent, #e2e2e2); }\n.topic-dataset { --topic-c: var(--sy-op-sql, #a8adb5); }\n.topic-auth { --topic-c: #d0d4da; }\n.topic-traffic { --topic-c: var(--sy-text-muted, #6b7280); }\n.topic-audit { --topic-c: var(--sy-op-write, #f0f0f0); }\n.topic-diagnostic { --topic-c: #9aa0a8; }\n\n.lens-cell-shape,\n.lens-cell-pred {\n font-family: ui-monospace, monospace;\n font-size: 11px;\n color: var(--sy-text-muted, #888);\n}\n\n.lens-cell-rows,\n.lens-cell-elapsed {\n text-align: right;\n font-family: ui-monospace, monospace;\n font-size: 11px;\n color: var(--sy-text-muted, #888);\n width: 64px;\n}\n\n.lens-cell-drill {\n background: transparent;\n border: 0;\n padding: 0;\n margin: 0;\n font: inherit;\n color: var(--sy-text-primary, #d4d4d4);\n cursor: pointer;\n text-align: left;\n border-bottom: 1px dotted transparent;\n transition: border-color 60ms, color 60ms;\n}\n.lens-cell-drill:hover {\n color: var(--sy-accent, #e2e2e2);\n border-bottom-color: var(--sy-accent, #e2e2e2);\n}\n.lens-cell-empty { color: var(--sy-text-faint, #3a3a3a); }\n\n.lens-status {\n display: inline-block;\n padding: 1px 6px;\n font-size: 10px;\n text-transform: uppercase;\n border-radius: 2px;\n}\n.lens-status.status-ok {\n color: var(--sy-success, #a8adb5);\n background: color-mix(in srgb, var(--sy-success, #a8adb5) 14%, transparent);\n}\n.lens-status.status-error {\n color: var(--sy-error, #f7768e);\n background: color-mix(in srgb, var(--sy-error, #f7768e) 14%, transparent);\n}\n\n/* ── Detail panel (expanded row) ─────────────────────────────────────────── */\n.lens-detail-row { background: var(--sy-bg-surface, #1e1e1e); }\n.lens-detail-cell {\n padding: 12px 16px 16px 16px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n}\n.lens-detail {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));\n gap: 16px 24px;\n font-family: ui-monospace, monospace;\n font-size: 11.5px;\n}\n.lens-detail-section { min-width: 0; }\n.lens-detail-title {\n font-family: 'Inter', system-ui, sans-serif;\n font-size: 10.5px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--sy-text-faint, #3a3a3a);\n margin-bottom: 6px;\n padding-bottom: 4px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n}\n.lens-detail-kv {\n display: grid;\n grid-template-columns: 110px 1fr;\n gap: 8px;\n padding: 2px 0;\n align-items: baseline;\n}\n.lens-detail-k {\n color: var(--sy-text-muted, #888);\n}\n.lens-detail-v {\n color: var(--sy-text-primary, #d4d4d4);\n word-break: break-word;\n white-space: pre-wrap;\n}\n/* Error spans the whole grid — traces are wide, and it lands below signal/data. */\n.lens-detail-error { grid-column: 1 / -1; }\n.lens-detail-error .lens-detail-title { color: var(--sy-error, #f7768e); }\n.lens-detail-hint {\n font-family: 'Inter', system-ui, sans-serif;\n font-size: 10.5px;\n color: var(--sy-text-faint, #3a3a3a);\n margin-top: 4px;\n font-style: italic;\n}\n.lens-detail-audit-link .lens-detail-title { color: var(--sy-op-write, #f0f0f0); }\n.lens-audit-link {\n display: inline-block;\n height: 26px;\n padding: 0 12px;\n font-size: 12px;\n background: transparent;\n border: 1px dashed var(--sy-op-write, #f0f0f0);\n border-radius: 3px;\n color: var(--sy-op-write, #f0f0f0);\n cursor: not-allowed;\n opacity: 0.65;\n}\n.lens-detail-block {\n grid-column: 1 / -1; /* full-width row inside the grid */\n min-width: 0;\n}\n.lens-detail-block-label {\n font-family: 'Inter', system-ui, sans-serif;\n font-size: 10.5px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--sy-text-faint, #3a3a3a);\n margin-bottom: 4px;\n}\n.lens-detail-block-body {\n margin: 0;\n padding: 8px 10px;\n font-family: ui-monospace, monospace;\n font-size: 11px;\n line-height: 1.55;\n color: var(--sy-text-primary, #d4d4d4);\n background: var(--sy-bg-app, #161616);\n border-left: 2px solid var(--sy-accent, #e2e2e2);\n border-radius: 2px;\n overflow-x: auto;\n white-space: pre;\n max-height: 320px;\n overflow-y: auto;\n}\n.lens-detail-trace {\n margin-top: 6px;\n padding: 8px 10px;\n font-size: 10.5px;\n line-height: 1.5;\n color: var(--sy-text-muted, #888);\n background: var(--sy-bg-app, #161616);\n border-left: 2px solid var(--sy-error, #f7768e);\n border-radius: 2px;\n overflow-x: auto;\n white-space: pre;\n}\n\n/* ── SQL trace section (nested under op-completed row, debug mode) ──────── */\n.lens-trace {\n grid-column: 1 / -1;\n min-width: 0;\n}\n.lens-trace .lens-detail-title { color: var(--sy-op-write, #f0f0f0); }\n.lens-trace-status {\n font-family: ui-monospace, monospace;\n font-size: 10.5px;\n text-transform: none;\n letter-spacing: 0;\n color: var(--sy-text-muted, #888);\n}\n.lens-trace-table {\n /* `table-layout: fixed` locks column widths to the THEAD definitions —\n * without it, expanding a row with a long SQL string in the DATA cell\n * causes neighbouring columns to shrink and the whole table reflows.\n * Fixed layout keeps every other row at its original column widths. */\n width: 100%;\n table-layout: fixed;\n margin-top: 6px;\n border-collapse: collapse;\n font-family: ui-monospace, monospace;\n font-size: 11px;\n}\n.lens-trace-table colgroup col.lens-trace-col-time { width: 78px; }\n.lens-trace-table colgroup col.lens-trace-col-lvl { width: 56px; }\n.lens-trace-table colgroup col.lens-trace-col-ns { width: 120px; }\n.lens-trace-table colgroup col.lens-trace-col-id { width: 180px; }\n.lens-trace-table colgroup col.lens-trace-col-msg { width: 200px; }\n/* :col-data takes the rest */\n.lens-trace-table th {\n text-align: left;\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--sy-text-faint, #3a3a3a);\n padding: 4px 8px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n background: var(--sy-bg-app, #161616);\n font-weight: 500;\n}\n.lens-trace-row {\n cursor: pointer;\n}\n.lens-trace-row td {\n padding: 3px 8px;\n vertical-align: top;\n border-bottom: 1px solid color-mix(in srgb, var(--sy-border, #2a2a2a) 40%, transparent);\n color: var(--sy-text-primary, #d4d4d4);\n}\n.lens-trace-row:hover { background: color-mix(in srgb, var(--sy-accent, #e2e2e2) 6%, transparent); }\n.lens-trace-row.selected { background: color-mix(in srgb, var(--sy-accent, #e2e2e2) 12%, transparent); }\n.lens-trace-row.err {\n background: color-mix(in srgb, var(--sy-error, #f7768e) 8%, transparent);\n border-left: 2px solid var(--sy-error, #f7768e);\n}\n.lens-trace-row.err:hover { background: color-mix(in srgb, var(--sy-error, #f7768e) 14%, transparent); }\n.lens-trace-row.err.selected { background: color-mix(in srgb, var(--sy-error, #f7768e) 18%, transparent); }\n.lens-trace-ns {\n color: var(--sy-text-muted, #888);\n font-size: 10.5px;\n white-space: nowrap;\n}\n.lens-trace-detail-row { background: var(--sy-bg-app, #161616); }\n.lens-trace-detail {\n padding: 8px 14px 10px 14px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n}\n.lens-trace-detail-block { margin-bottom: 6px; }\n.lens-trace-detail-block:last-child { margin-bottom: 0; }\n.lens-trace-detail-label {\n font-family: 'Inter', system-ui, sans-serif;\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--sy-text-faint, #3a3a3a);\n margin-bottom: 2px;\n}\n.lens-trace-detail-pre {\n margin: 0;\n padding: 6px 8px;\n font-family: ui-monospace, monospace;\n font-size: 11px;\n line-height: 1.55;\n color: var(--sy-text-primary, #d4d4d4);\n background: var(--sy-bg-surface, #1e1e1e);\n border-left: 2px solid var(--sy-accent, #e2e2e2);\n border-radius: 2px;\n /* Inner scroll: the detail row is bounded so expanding doesn't jolt the\n * surrounding rows. Long SQL or stack traces scroll INSIDE this block. */\n max-height: 180px;\n overflow-x: auto;\n overflow-y: auto;\n white-space: pre-wrap;\n word-break: break-word;\n}\n.lens-trace-detail-pre.lens-trace-detail-sql {\n /* Wider scroll budget for the SQL block specifically — SQL strings often\n * need horizontal room even after format-sql injects clause-breaks. */\n max-height: 220px;\n font-size: 11.5px;\n border-left-color: var(--sy-op-write, #f0f0f0);\n}\n.lens-trace-ts {\n color: var(--sy-text-muted, #888);\n white-space: nowrap;\n}\n.lens-trace-lvl {\n font-size: 10px;\n text-transform: uppercase;\n text-align: center;\n width: 50px;\n}\n.lens-trace-lvl.lvl-trace { color: var(--sy-text-faint, #3a3a3a); }\n.lens-trace-lvl.lvl-debug { color: var(--sy-text-muted, #888); }\n.lens-trace-lvl.lvl-info { color: var(--sy-info, #9aa0a8); }\n.lens-trace-lvl.lvl-warn { color: var(--sy-warn, #e0af68); }\n.lens-trace-lvl.lvl-error,\n.lens-trace-lvl.lvl-fatal { color: var(--sy-error, #f7768e); }\n.lens-trace-id {\n color: var(--sy-accent, #e2e2e2);\n white-space: nowrap;\n}\n.lens-trace-msg { color: var(--sy-text-primary, #d4d4d4); }\n.lens-trace-data {\n color: var(--sy-text-muted, #888);\n font-size: 10.5px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.lens-trace-empty {\n padding: 12px;\n font-size: 11.5px;\n color: var(--sy-text-faint, #3a3a3a);\n}\n.lens-trace-error { color: var(--sy-error, #f7768e); }\n\n/* ── Empty state ─────────────────────────────────────────────────────────── */\n.lens-empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--sy-text-muted, #666);\n font-size: 12px;\n gap: 4px;\n}\n.lens-empty-title { font-size: 13px; color: var(--sy-text-primary, #d4d4d4); }\n.lens-empty-hint { font-size: 11px; color: var(--sy-text-faint, #3a3a3a); }\n.lens-empty-msg { color: var(--sy-error, #f7768e); }\n");
|
|
3222
|
+
function hAa(a,b){return new R(null,6,5,S,[rba,k2(null),l(nx.g(a))?null:M8(),Xza(M.j(a,zq,b)),l(Jm.g(b))?gAa(b):null,w7.g(b)],null)};var u2=new CSSStyleSheet;u2.replaceSync("/* Synthigy Log Cockpit — Phase 1 skeleton.\n * Variable conventions mirror data/console/console.css:\n * --sy-* Synthigy semantic colors (text, background, accents)\n * --modeling-* Modeler chrome (overlays, handles)\n * Never hardcode colors — always var() with a sensible fallback.\n *\n * Class prefix: .lc- (log cockpit).\n *\n * After editing this file, ALSO save component.cljs to re-run the\n * defstyles macro — bare .css edits are not seen by shadow-cljs.\n */\n\n/* ── Host ───────────────────────────────────────────────────────────────────── */\n:host {\n display: none;\n position: fixed;\n inset: 0;\n z-index: 9998;\n font-family: 'Inter', system-ui, -apple-system, sans-serif;\n font-size: 13px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n:host([open]) { display: block; }\n\n*, *::before, *::after { box-sizing: border-box; }\n\n/* ── Root layout ────────────────────────────────────────────────────────────── */\n.lc-root {\n position: relative; /* containing block for the starfield */\n isolation: isolate; /* keeps z-index:-1 starfield above .lc-root bg */\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background: var(--sy-bg-app, #161616);\n color: var(--sy-text-primary, #d4d4d4);\n}\n\n/* ── Toolbar ────────────────────────────────────────────────────────────────── */\n.lc-toolbar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 12px;\n height: 38px;\n background: var(--sy-bg-surface, #1e1e1e);\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n flex-shrink: 0;\n}\n.lc-toolbar-brand {\n display: flex;\n align-items: center;\n margin-top: 10px;\n margin-left: -10px;\n pointer-events: none;\n}\n.lc-toolbar-brand svg { height: 28px; width: auto; display: block; }\n.lc-toolbar-title {\n margin-top: 4px;\n font-size: 11px;\n font-weight: 600;\n color: var(--sy-text-muted, #666);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n}\n.lc-toolbar-spacer { flex: 1; }\n\n.lc-toolbar-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n background: none;\n border: 1px solid transparent;\n padding: 3px 8px;\n font-size: 11px;\n color: var(--sy-text-muted, #666);\n border-radius: 3px;\n cursor: pointer;\n transition: background .12s, color .12s, border-color .12s;\n}\n.lc-toolbar-btn:hover {\n background: var(--sy-hover-overlay, rgba(255,255,255,.05));\n color: var(--sy-text-primary, #d4d4d4);\n}\n.lc-toolbar-btn:disabled { opacity: 0.5; cursor: wait; }\n.lc-toolbar-btn.live {\n color: var(--sy-op-sql, #a8adb5);\n border-color: var(--sy-op-sql, #a8adb5);\n}\n.lc-toolbar-btn.live.paused {\n color: var(--sy-op-write, #f0f0f0);\n border-color: var(--sy-op-write, #f0f0f0);\n}\n\n.lc-since-select {\n appearance: none;\n -webkit-appearance: none;\n background: var(--sy-bg-band, #252525);\n color: var(--sy-text-primary, #d4d4d4);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n padding: 3px 22px 3px 8px;\n font-size: 11px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n cursor: pointer;\n /* Inline chevron — no native one when appearance is reset. */\n background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),\n linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position: calc(100% - 12px) 50%, calc(100% - 8px) 50%;\n background-size: 4px 4px, 4px 4px;\n background-repeat: no-repeat;\n}\n\n/* ── Lens tabs (in toolbar) ─────────────────────────────────────────────────── */\n.lc-lens-tabs {\n display: flex;\n align-items: center;\n gap: 2px;\n margin-left: 8px;\n}\n.lc-lens-tab {\n background: none;\n border: none;\n padding: 4px 10px;\n font-size: 12px;\n font-weight: 500;\n color: var(--sy-text-muted, #666);\n border-radius: 3px;\n cursor: pointer;\n transition: background .12s, color .12s;\n}\n.lc-lens-tab:hover {\n background: var(--sy-hover-overlay, rgba(255,255,255,.05));\n color: var(--sy-text-primary, #d4d4d4);\n}\n.lc-lens-tab.selected {\n background: var(--sy-accent-tint, rgba(255, 255, 255,.14));\n color: var(--sy-accent, #e2e2e2);\n}\n.lc-lens-tab.pro {\n color: var(--sy-text-faint, #3a3a3a);\n}\n.lc-lens-tab.pro::after {\n content: \" ★\";\n color: var(--sy-op-write, #f0f0f0);\n}\n.lc-lens-tab.locked {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ── Body (form sidebar + main) ─────────────────────────────────────────────── */\n.lc-body {\n display: flex;\n flex: 1;\n overflow: hidden;\n position: relative;\n}\n\n/* ── Per-lens filter form sidebar ───────────────────────────────────────────── */\n.lc-form-sidebar {\n flex: 0 0 240px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 14px 14px 12px;\n border-right: 1px solid var(--sy-border, #2a2a2a);\n background: var(--sy-bg-surface, #1e1e1e);\n overflow-y: auto;\n}\n.lc-form-title {\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--sy-text-primary, #d4d4d4);\n padding-bottom: 2px;\n}\n.lc-form-desc {\n font-size: 11px;\n color: var(--sy-text-muted, #666);\n line-height: 1.4;\n padding-bottom: 4px;\n border-bottom: 1px solid var(--sy-border-subtle, rgba(255,255,255,.04));\n}\n.lc-form-fields {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.lc-form-field {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n.lc-form-label {\n font-size: 10px;\n color: var(--sy-text-faint, #3a3a3a);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n}\n.lc-form-input,\n.lc-form-select {\n width: 100%;\n padding: 5px 8px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 12px;\n color: var(--sy-text-primary, #d4d4d4);\n background: var(--sy-bg-band, #252525);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n outline: none;\n transition: border-color .12s ease;\n}\n.lc-form-input::placeholder { color: var(--sy-text-faint, #3a3a3a); }\n.lc-form-input:focus,\n.lc-form-select:focus { border-color: var(--sy-accent, #e2e2e2); }\n.lc-form-select {\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns\x3d'http://www.w3.org/2000/svg' width\x3d'10' height\x3d'6' viewBox\x3d'0 0 10 6'%3E%3Cpath fill\x3d'none' stroke\x3d'%23666' stroke-width\x3d'1.4' stroke-linecap\x3d'round' stroke-linejoin\x3d'round' d\x3d'M1 1l4 4 4-4'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 8px center;\n padding-right: 24px;\n}\n.lc-form-clear {\n align-self: flex-start;\n margin-top: 4px;\n padding: 4px 10px;\n font-size: 11px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n color: var(--sy-text-muted, #666);\n background: none;\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n cursor: pointer;\n transition: color .12s ease, border-color .12s ease;\n}\n.lc-form-clear:hover {\n color: var(--sy-op-write, #f0f0f0);\n border-color: var(--sy-op-write, #f0f0f0);\n}\n\n/* ── Stats bar — floating badges in the bottom-right of the stream ──────────── */\n.lc-stats {\n position: absolute;\n right: 16px;\n bottom: 16px;\n z-index: 5;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 8px;\n background: var(--sy-bg-surface, rgba(255,255,255,.95));\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 18px;\n box-shadow: 0 2px 8px rgba(0,0,0,.08);\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 11px;\n backdrop-filter: blur(8px);\n}\n.lc-stat {\n display: inline-flex;\n align-items: baseline;\n gap: 4px;\n padding: 2px 8px;\n border-radius: 10px;\n background: var(--sy-bg-band, #252525);\n border: 1px solid var(--sy-border-subtle, rgba(0,0,0,.08));\n color: var(--sy-text-muted, #666);\n cursor: pointer;\n transition: background .12s, color .12s, border-color .12s;\n}\n.lc-stat:hover {\n background: var(--sy-hover-overlay, rgba(0,0,0,.04));\n color: var(--sy-text-primary, #d4d4d4);\n}\n.lc-stat-count {\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n color: var(--sy-text-primary, #d4d4d4);\n}\n.lc-stat-unit { color: var(--sy-text-muted, #666); }\n\n.lc-stat.lc-stat-rows { border-color: var(--sy-accent, #e2e2e2); }\n.lc-stat.lc-stat-rows .lc-stat-count { color: var(--sy-accent, #e2e2e2); }\n\n.lc-stat-lvl.lvl-info .lc-stat-count { color: var(--sy-accent, #e2e2e2); }\n.lc-stat-lvl.lvl-warn .lc-stat-count { color: var(--sy-op-write, #f0f0f0); }\n.lc-stat-lvl.lvl-error .lc-stat-count { color: var(--sy-error, #f7768e); }\n.lc-stat-lvl.lvl-fatal .lc-stat-count { color: var(--sy-error, #f7768e); }\n.lc-stat-lvl.lvl-debug .lc-stat-count { color: var(--sy-text-muted, #666); }\n.lc-stat-lvl.lvl-trace .lc-stat-count { color: var(--sy-text-faint, #3a3a3a); }\n\n.lc-stat.lc-stat-timing { cursor: default; }\n.lc-stat.lc-stat-timing:hover { background: var(--sy-bg-band, #252525); }\n\n/* ── Settings drawer (toolbar gear opens this overlay) ─────────────────────── */\n.lc-settings-drawer {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 20;\n width: 360px;\n max-height: calc(100% - 12px);\n padding: 14px 16px 16px;\n background: var(--sy-bg-surface, #1e1e1e);\n border-left: 1px solid var(--sy-border, #2a2a2a);\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n border-bottom-left-radius: 6px;\n box-shadow: -4px 8px 24px rgba(0,0,0,.32);\n overflow-y: auto;\n font-size: 12px;\n}\n.lc-toolbar-btn.active {\n background: var(--sy-accent-tint, rgba(255, 255, 255,.14));\n color: var(--sy-accent, #e2e2e2);\n}\n\n/* ── Settings panel (log-level control — content of the drawer) ────────────── */\n.lc-settings-section { margin-bottom: 16px; }\n.lc-settings-title {\n font-size: 10px;\n font-weight: 600;\n color: var(--sy-text-muted, #666);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n margin-bottom: 6px;\n}\n.lc-settings-select {\n appearance: none;\n -webkit-appearance: none;\n width: 100%;\n background: var(--sy-bg-band, #252525);\n color: var(--sy-text-primary, #d4d4d4);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n padding: 4px 22px 4px 8px;\n font-size: 12px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n cursor: pointer;\n background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),\n linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position: calc(100% - 12px) 50%, calc(100% - 8px) 50%;\n background-size: 4px 4px, 4px 4px;\n background-repeat: no-repeat;\n}\n\n/* ── Add-override row ──────────────────────────────────────────────────────── */\n.lc-ns-add {\n display: flex;\n gap: 4px;\n align-items: center;\n}\n.lc-ns-input {\n flex: 1;\n min-width: 0;\n background: var(--sy-bg-band, #252525);\n color: var(--sy-text-primary, #d4d4d4);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n padding: 4px 6px;\n font-size: 11px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n}\n.lc-ns-input:focus {\n outline: none;\n border-color: var(--sy-accent, #e2e2e2);\n}\n.lc-ns-level-select {\n appearance: none;\n -webkit-appearance: none;\n background: var(--sy-bg-band, #252525);\n color: var(--sy-text-primary, #d4d4d4);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n padding: 4px 20px 4px 6px;\n font-size: 11px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n cursor: pointer;\n background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),\n linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position: calc(100% - 10px) 50%, calc(100% - 6px) 50%;\n background-size: 4px 4px, 4px 4px;\n background-repeat: no-repeat;\n}\n.lc-ns-add-btn {\n background: var(--sy-bg-band, #252525);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-primary, #d4d4d4);\n padding: 4px 10px;\n font-size: 11px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n cursor: pointer;\n}\n.lc-ns-add-btn:hover:not(:disabled) {\n border-color: var(--sy-accent, #e2e2e2);\n color: var(--sy-accent, #e2e2e2);\n}\n.lc-ns-add-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.lc-settings-hint {\n font-size: 10px;\n color: var(--sy-text-muted, #666);\n margin-top: 4px;\n line-height: 1.4;\n}\n.lc-settings-hint code {\n background: var(--sy-bg-band, #252525);\n padding: 0 4px;\n border-radius: 2px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n color: var(--sy-text-primary, #d4d4d4);\n}\n\n.lc-ns-list {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n.lc-ns-row {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 3px 6px;\n background: var(--sy-bg-band, #252525);\n border: 1px solid var(--sy-border-subtle, rgba(0,0,0,.06));\n border-radius: 3px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 11px;\n}\n.lc-ns-pattern {\n flex: 1;\n color: var(--sy-text-primary, #d4d4d4);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.lc-ns-level {\n color: var(--sy-accent, #e2e2e2);\n font-weight: 500;\n}\n.lc-ns-x {\n background: none;\n border: none;\n color: var(--sy-text-muted, #666);\n cursor: pointer;\n padding: 0 4px;\n}\n.lc-ns-x:hover { color: var(--sy-op-write, #f0f0f0); }\n\n.lc-settings-source {\n font-size: 11px;\n color: var(--sy-text-muted, #666);\n margin-bottom: 6px;\n}\n.lc-settings-source-tag {\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n color: var(--sy-accent, #e2e2e2);\n}\n.lc-settings-revert {\n background: none;\n border: 1px dashed var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-muted, #666);\n padding: 4px 8px;\n font-size: 11px;\n cursor: pointer;\n width: 100%;\n}\n.lc-settings-revert:hover {\n color: var(--sy-op-write, #f0f0f0);\n border-color: var(--sy-op-write, #f0f0f0);\n}\n.lc-settings-error {\n font-size: 11px;\n color: var(--sy-error, #f7768e);\n padding: 6px 8px;\n border: 1px solid var(--sy-error, #f7768e);\n border-radius: 3px;\n margin-top: 8px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n}\n.lc-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative; /* anchor for floating .lc-stats overlay */\n}\n\n/* ── Stream ─────────────────────────────────────────────────────────────────── */\n.lc-stream {\n flex: 1;\n overflow-y: auto;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 12px;\n}\n.lc-row {\n display: grid;\n grid-template-columns: 72px 56px 240px 1fr;\n gap: 12px;\n padding: 8px 14px;\n align-items: flex-start;\n border-bottom: 1px solid var(--sy-border-subtle, rgba(255,255,255,.03));\n cursor: pointer;\n}\n.lc-row:hover { background: var(--sy-hover-overlay, rgba(255,255,255,.04)); }\n.lc-row.selected { background: var(--sy-accent-tint, rgba(255, 255, 255,.08)); }\n\n.lc-row-ts {\n color: var(--sy-text-muted, #666);\n font-variant-numeric: tabular-nums;\n padding-top: 1px;\n}\n.lc-row-id {\n color: var(--sy-text-muted, #666);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n padding-top: 1px;\n}\n.lc-row-msg {\n color: var(--sy-text-primary, #d4d4d4);\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 12px;\n min-width: 0;\n}\n.lc-row-msg-text {\n flex: 1 1 auto;\n min-width: 0;\n padding-top: 1px;\n word-break: break-word;\n white-space: normal;\n line-height: 1.45;\n}\n.lc-row-actions {\n flex: 0 0 auto;\n display: flex;\n gap: 6px;\n}\n\n/* Right-aligned action buttons on each row. Click → filters the lens\n form by the row's user_xid / request_id. Distinct from a \"pill\" — these\n read as buttons: icon + value, accent on hover. */\n.lc-row-action {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n height: 20px;\n padding: 0 8px;\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 11px;\n color: var(--sy-text-primary, #d4d4d4);\n background: var(--sy-bg-band, #252525);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 4px;\n cursor: pointer;\n line-height: 1;\n transition: background .12s ease, border-color .12s ease, color .12s ease;\n}\n.lc-row-action:hover {\n background: var(--sy-accent, #e2e2e2);\n border-color: var(--sy-accent, #e2e2e2);\n color: var(--sy-bg-app, #161616);\n}\n.lc-row-action-icon { opacity: 0.7; }\n.lc-row-action:hover .lc-row-action-icon { opacity: 1; }\n.lc-row-action-value {\n font-variant-numeric: tabular-nums;\n margin-top: 3px;\n}\n\n.lc-row-lvl { font-weight: 600; text-transform: uppercase; font-size: 10px; }\n.lc-row-lvl.lvl-trace { color: var(--sy-text-faint, #3a3a3a); }\n.lc-row-lvl.lvl-debug { color: var(--sy-text-muted, #666); }\n.lc-row-lvl.lvl-info { color: var(--sy-accent, #e2e2e2); }\n.lc-row-lvl.lvl-warn { color: var(--sy-op-write, #f0f0f0); }\n.lc-row-lvl.lvl-error { color: var(--sy-error, #f7768e); }\n.lc-row-lvl.lvl-fatal { color: var(--sy-error, #f7768e); background: rgba(247,118,142,.1); }\n\n.lc-row-expanded {\n padding: 8px 12px 12px 102px;\n color: var(--sy-text-muted, #666);\n font-size: 11px;\n background: var(--sy-bg-surface, #1e1e1e);\n}\n.lc-row-expanded .k {\n color: var(--sy-text-muted, #666);\n white-space: pre;\n}\n.lc-row-expanded .v {\n color: var(--sy-text-primary, #d4d4d4);\n word-break: break-word;\n white-space: pre-wrap;\n}\n.lc-row-expanded .v.pivot {\n cursor: pointer;\n border-bottom: 1px dashed transparent;\n transition: border-color .12s ease, color .12s ease;\n}\n.lc-row-expanded .v.pivot:hover {\n color: var(--sy-accent, #e2e2e2);\n border-bottom-color: var(--sy-accent, #e2e2e2);\n}\n.lc-row-expanded .lc-kv-section {\n margin-top: 6px;\n}\n.lc-row-expanded .lc-kv-section .k {\n color: var(--sy-text-primary, #d4d4d4);\n text-transform: uppercase;\n font-size: 10px;\n letter-spacing: 0.05em;\n}\n.lc-row-expanded .lc-error-trace {\n margin: 6px 0 0;\n padding: 8px 10px;\n background: var(--sy-bg-band, rgba(0,0,0,.18));\n color: var(--sy-error, #f7768e);\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 10.5px;\n line-height: 1.5;\n white-space: pre;\n overflow-x: auto;\n border-left: 2px solid var(--sy-error, #f7768e);\n border-radius: 2px;\n}\n.lc-row-kv {\n color: var(--sy-text-muted, #666);\n font-size: 11px;\n}\n.lc-kv {\n display: grid;\n grid-template-columns: 110px minmax(0, 1fr);\n gap: 8px;\n align-items: baseline;\n padding: 1px 0;\n}\n\n.lc-empty-hint {\n font-size: 11px;\n color: var(--sy-text-faint, #3a3a3a);\n}\n\n/* ── Empty + loading states ─────────────────────────────────────────────────── */\n.lc-empty,\n.lc-loading,\n.lc-error {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--sy-text-muted, #666);\n font-size: 12px;\n gap: 8px;\n}\n.lc-error { color: var(--sy-error, #f7768e); }\n\n/* ── Pro overlay (for locked lenses) ────────────────────────────────────────── */\n.lc-pro-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(22, 22, 22, 0.92);\n z-index: 10;\n}\n.lc-pro-card {\n max-width: 420px;\n padding: 24px;\n border: 1px solid var(--sy-op-write, #f0f0f0);\n border-radius: 6px;\n text-align: center;\n}\n\n/* ═══════════════════════════════════════════════════════════════════════════\n * SQL lens — class prefix .lens-*. Owned by lens/sql.cljs, dispatched from\n * ui/lens-view :sql. Drops the generic form-sidebar + stream in favour of\n * a focus selector + drillable table.\n * ═════════════════════════════════════════════════════════════════════════ */\n\n.lens-lens {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0;\n}\n\n/* ── Control bar (focus selector + debug toggle) ─────────────────────────── */\n.lens-control-bar {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n background: var(--sy-bg-surface, #1e1e1e);\n flex-shrink: 0;\n}\n.lens-control-spacer { flex: 1; }\n\n/* ── Pickers (Entity / User / Operation / Request) ───────────────────────── */\n.lens-pickers {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n.lens-picker { position: relative; }\n.lens-picker-inline { display: inline-flex; align-items: center; }\n\n.lens-picker-trigger {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 26px;\n padding: 0 10px;\n font-size: 12px;\n background: transparent;\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-muted, #888);\n cursor: pointer;\n transition: color 80ms, background 80ms, border-color 80ms;\n}\n.lens-picker-trigger:hover {\n color: var(--sy-text-primary, #d4d4d4);\n border-color: var(--sy-border-strong, #3a3a3a);\n}\n.lens-picker-trigger.open,\n.lens-picker-trigger.has-values {\n color: var(--sy-accent, #e2e2e2);\n border-color: var(--sy-accent, #e2e2e2);\n background: color-mix(in srgb, var(--sy-accent, #e2e2e2) 10%, transparent);\n}\n.lens-picker-label { letter-spacing: 0.01em; }\n.lens-picker-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 16px;\n padding: 0 4px;\n font-size: 10.5px;\n font-weight: 600;\n color: var(--sy-bg-app, #161616);\n background: var(--sy-accent, #e2e2e2);\n border-radius: 8px;\n}\n.lens-picker-caret {\n display: inline-flex;\n align-items: center;\n transform: rotate(90deg);\n transition: transform 100ms;\n}\n.lens-picker-trigger.open .lens-picker-caret { transform: rotate(-90deg); }\n\n.lens-picker-text {\n height: 26px;\n width: 160px;\n padding: 0 10px;\n font-size: 12px;\n background: transparent;\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-primary, #d4d4d4);\n font-family: ui-monospace, monospace;\n}\n.lens-picker-text:focus {\n outline: none;\n border-color: var(--sy-accent, #e2e2e2);\n}\n.lens-picker-text::placeholder { color: var(--sy-text-faint, #3a3a3a); }\n\n.lens-picker-panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 50;\n min-width: 240px;\n max-width: 360px;\n background: var(--sy-bg-surface, #1e1e1e);\n border: 1px solid var(--sy-border-strong, #3a3a3a);\n border-radius: 4px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n max-height: 380px;\n}\n.lens-picker-panel-user { min-width: 280px; }\n.lens-picker-search {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 10px 6px 10px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n}\n.lens-picker-search-input {\n flex: 1;\n height: 24px;\n padding: 0 8px;\n font-size: 12px;\n background: var(--sy-bg-app, #161616);\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-primary, #d4d4d4);\n}\n.lens-picker-search-input:focus {\n outline: none;\n border-color: var(--sy-accent, #e2e2e2);\n}\n.lens-picker-spin {\n color: var(--sy-text-faint, #3a3a3a);\n font-size: 11px;\n}\n.lens-picker-panel-body {\n flex: 1;\n overflow-y: auto;\n padding: 4px 0;\n}\n.lens-picker-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 10px;\n cursor: pointer;\n user-select: none;\n}\n.lens-picker-row:hover { background: color-mix(in srgb, var(--sy-accent, #e2e2e2) 10%, transparent); }\n.lens-picker-cb { cursor: pointer; }\n.lens-picker-row-label {\n font-size: 12px;\n color: var(--sy-text-primary, #d4d4d4);\n display: inline-flex;\n flex-direction: column;\n min-width: 0;\n}\n.lens-picker-row-sub {\n font-family: ui-monospace, monospace;\n font-size: 10.5px;\n color: var(--sy-text-faint, #3a3a3a);\n}\n.lens-picker-hint {\n padding: 8px 10px;\n font-size: 11px;\n color: var(--sy-text-faint, #3a3a3a);\n}\n.lens-picker-clear {\n margin: 4px 8px 8px 8px;\n height: 22px;\n padding: 0 10px;\n font-size: 11px;\n background: transparent;\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-muted, #888);\n cursor: pointer;\n align-self: flex-end;\n}\n.lens-picker-clear:hover { color: var(--sy-error, #f7768e); border-color: var(--sy-error, #f7768e); }\n\n.lens-debug-toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 26px;\n padding: 0 10px;\n font-size: 11px;\n background: transparent;\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-muted, #888);\n cursor: pointer;\n transition: color 80ms, background 80ms, border-color 80ms;\n}\n.lens-debug-toggle .lens-debug-dot {\n width: 7px; height: 7px;\n border-radius: 50%;\n background: var(--sy-text-faint, #3a3a3a);\n transition: background 80ms;\n}\n.lens-debug-toggle:hover {\n color: var(--sy-text-primary, #d4d4d4);\n border-color: var(--sy-border-strong, #3a3a3a);\n}\n.lens-debug-toggle.on {\n color: var(--sy-op-write, #f0f0f0);\n border-color: var(--sy-op-write, #f0f0f0);\n background: color-mix(in srgb, var(--sy-op-write, #f0f0f0) 14%, transparent);\n}\n.lens-debug-toggle.on .lens-debug-dot {\n background: var(--sy-op-write, #f0f0f0);\n box-shadow: 0 0 6px var(--sy-op-write, #f0f0f0);\n}\n\n/* ── Debug warning banner ────────────────────────────────────────────────── */\n.lens-debug-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n font-size: 12px;\n color: var(--sy-op-write, #f0f0f0);\n background: color-mix(in srgb, var(--sy-op-write, #f0f0f0) 10%, transparent);\n border-bottom: 1px solid color-mix(in srgb, var(--sy-op-write, #f0f0f0) 30%, transparent);\n flex-shrink: 0;\n}\n\n/* ── Crumb bar (multi-value per axis) ────────────────────────────────────── */\n.lens-crumbs {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 6px 10px;\n padding: 6px 12px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n background: var(--sy-bg-app, #161616);\n flex-shrink: 0;\n min-height: 36px;\n}\n.lens-crumb-clear {\n height: 22px;\n padding: 0 10px;\n font-size: 11px;\n background: transparent;\n border: 1px solid var(--sy-border, #2a2a2a);\n border-radius: 3px;\n color: var(--sy-text-muted, #888);\n cursor: pointer;\n}\n.lens-crumb-clear:disabled { opacity: 0.4; cursor: default; }\n.lens-crumb-clear:hover:not(:disabled) {\n color: var(--sy-error, #f7768e);\n border-color: var(--sy-error, #f7768e);\n}\n.lens-crumb-group {\n display: inline-flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n}\n.lens-crumb-axis {\n font-size: 10.5px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--sy-text-faint, #3a3a3a);\n margin-right: 2px;\n}\n.lens-crumb-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n height: 22px;\n padding: 0 4px 0 8px;\n font-size: 12px;\n border-radius: 3px;\n background: color-mix(in srgb, var(--sy-accent, #e2e2e2) 12%, transparent);\n color: var(--sy-accent, #e2e2e2);\n border: 1px solid color-mix(in srgb, var(--sy-accent, #e2e2e2) 40%, transparent);\n}\n.lens-crumb-label { font-weight: 500; }\n.lens-crumb-x {\n background: transparent;\n border: 0;\n padding: 0 4px;\n font-size: 14px;\n line-height: 1;\n color: currentColor;\n cursor: pointer;\n opacity: 0.7;\n}\n.lens-crumb-x:hover { opacity: 1; }\n\n/* ── Table ───────────────────────────────────────────────────────────────── */\n.lens-table-wrap {\n flex: 1;\n min-height: 0;\n overflow: auto;\n}\n.lens-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n font-variant-numeric: tabular-nums;\n}\n.lens-th {\n position: sticky;\n top: 0;\n z-index: 1;\n text-align: left;\n padding: 6px 8px;\n font-weight: 500;\n font-size: 10.5px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--sy-text-faint, #3a3a3a);\n background: var(--sy-bg-surface, #1e1e1e);\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n white-space: nowrap;\n}\n.lens-row {\n cursor: pointer;\n border-bottom: 1px solid color-mix(in srgb, var(--sy-border, #2a2a2a) 50%, transparent);\n}\n.lens-row:hover { background: var(--sy-bg-surface, #1e1e1e); }\n.lens-row.selected { background: color-mix(in srgb, var(--sy-accent, #e2e2e2) 8%, transparent); }\n.lens-row.err { background: color-mix(in srgb, var(--sy-error, #f7768e) 8%, transparent); }\n.lens-cell {\n padding: 4px 8px;\n vertical-align: middle;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 260px;\n}\n.lens-cell-ts {\n color: var(--sy-text-muted, #888);\n font-family: ui-monospace, monospace;\n font-size: 11px;\n}\n/* System lens time column carries a date line above the time (the\n timeline can land on any day, so the date matters). */\n.lens-cell-ts-dt { line-height: 1.25; white-space: nowrap; }\n.lens-cell-ts-dt .lens-ts-date {\n display: block; font-size: 10px; color: var(--sy-text-faint, #3a3a3a);\n}\n.lens-cell-ts-dt .lens-ts-time { display: block; }\n.lens-cell-lvl {\n font-size: 10.5px;\n text-transform: uppercase;\n text-align: center;\n width: 50px;\n}\n.lens-cell-lvl.lvl-trace { color: var(--sy-text-faint, #3a3a3a); }\n.lens-cell-lvl.lvl-debug { color: var(--sy-text-muted, #888); }\n.lens-cell-lvl.lvl-info { color: var(--sy-info, #9aa0a8); }\n.lens-cell-lvl.lvl-warn { color: var(--sy-warn, #e0af68); }\n.lens-cell-lvl.lvl-error,\n.lens-cell-lvl.lvl-fatal { color: var(--sy-error, #f7768e); }\n\n.lens-cell-kind { width: 60px; }\n.lens-pill {\n display: inline-block;\n padding: 1px 6px;\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n border-radius: 2px;\n}\n.lens-pill.kind-read {\n color: var(--sy-info, #9aa0a8);\n background: color-mix(in srgb, var(--sy-info, #9aa0a8) 14%, transparent);\n}\n.lens-pill.kind-write {\n color: var(--sy-op-write, #f0f0f0);\n background: color-mix(in srgb, var(--sy-op-write, #f0f0f0) 14%, transparent);\n}\n\n.lens-cell-op,\n.lens-cell-entity,\n.lens-cell-user,\n.lens-cell-req { font-family: ui-monospace, monospace; font-size: 11.5px; }\n\n/* Auth lens action-cell color hints — green for success states\n (authenticated/issued/exchanged/refreshed/validated), red for\n rejection/failure family. Applied by `action-class` in lens/auth.cljs. */\n.lens-cell-op.ok { color: var(--sy-success, #a8adb5); }\n.lens-cell-op.err { color: var(--sy-error, #f7768e); }\n.lens-cell-op.ok .lens-cell-drill { color: inherit; }\n.lens-cell-op.err .lens-cell-drill { color: inherit; }\n\n/* Topic chips — wire-schema-v2 `:topics` classification (the signal's\n audience, orthogonal to level). Per-topic color via --topic-c so the\n base chip is shared by the detail panel (.lens-topic-chip span) and the\n stream rows (.lc-topic-chip button). */\n.lens-topics,\n.lc-row-topics { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px; }\n.lc-row-topics { margin-left: 8px; }\n\n.lens-topic-chip,\n.lc-topic-chip {\n --topic-c: var(--sy-text-muted, #6b7280);\n display: inline-block;\n padding: 1px 6px;\n font-family: ui-monospace, monospace;\n font-size: 10px;\n line-height: 1.5;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n border-radius: 2px;\n background: color-mix(in srgb, var(--topic-c) 14%, transparent);\n color: var(--topic-c);\n border: 1px solid color-mix(in srgb, var(--topic-c) 36%, transparent);\n}\n.lc-topic-chip { cursor: pointer; appearance: none; }\n.lc-topic-chip:hover { background: color-mix(in srgb, var(--topic-c) 26%, transparent); }\n\n/* ── Traffic lens — pure stats canvas. Generous padding + a consistent\n gap between sections does the spacing work; individual sections don't\n carry their own ad-hoc margins. ──────────────────────────────────────── */\n.lens-traffic {\n padding: 16px 20px 24px;\n display: flex;\n flex-direction: column;\n gap: 18px;\n overflow-y: auto;\n}\n\n/* ── Nav bar — ‹/› coarse paging + live jump. Fine navigation is\n drag-pan + wheel-zoom on the canvas itself. ─────────────────────────── */\n.lens-range-bar {\n display: flex; align-items: center; gap: 8px;\n}\n.lens-range-btn {\n appearance: none; background: none; cursor: pointer;\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 40%, transparent);\n border-radius: 4px; padding: 3px 10px;\n font-size: 11px; color: var(--sy-text-muted, #6b7280);\n}\n.lens-range-btn:hover:not(:disabled) {\n color: var(--sy-text, #e2e2e2); border-color: var(--sy-text-muted, #6b7280);\n}\n.lens-range-btn:disabled { opacity: .35; cursor: default; }\n.lens-range-window {\n flex: 1; font-size: 11px; color: var(--sy-text-muted, #6b7280);\n font-variant-numeric: tabular-nums; text-align: right;\n}\n.lens-range-live {\n display: inline-flex; align-items: center; gap: 6px;\n}\n.lens-range-live.on {\n color: var(--sy-ok, #6fae6f);\n border-color: color-mix(in srgb, var(--sy-ok, #6fae6f) 60%, transparent);\n background: color-mix(in srgb, var(--sy-ok, #6fae6f) 12%, transparent);\n}\n.lens-live-dot {\n width: 7px; height: 7px; border-radius: 50%;\n background: var(--sy-text-faint, #3a3a3a);\n}\n.lens-live-dot.on {\n background: var(--sy-ok, #6fae6f);\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--sy-ok, #6fae6f) 70%, transparent);\n animation: lens-live-pulse 1.6s ease-out infinite;\n}\n@keyframes lens-live-pulse {\n 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--sy-ok, #6fae6f) 70%, transparent); }\n 70% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--sy-ok, #6fae6f) 0%, transparent); }\n 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--sy-ok, #6fae6f) 0%, transparent); }\n}\n\n/* ── Health verdict banner — is it OK right now ────────────────────────── */\n.lens-verdict {\n display: flex; align-items: center; gap: 8px;\n padding: 8px 14px; border-radius: 8px;\n font-size: 12px;\n border: 1px solid transparent;\n}\n.lens-verdict-dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; }\n.lens-verdict-label {\n font-weight: 600; text-transform: uppercase; letter-spacing: .05em;\n font-size: 11px;\n}\n.lens-verdict-detail { color: var(--sy-text-muted, #6b7280); }\n.lens-verdict-rate {\n margin-left: auto; font-variant-numeric: tabular-nums;\n color: var(--sy-text, #e2e2e2); font-weight: 600;\n}\n.lens-verdict.healthy {\n background: color-mix(in srgb, var(--sy-ok, #6fae6f) 10%, transparent);\n border-color: color-mix(in srgb, var(--sy-ok, #6fae6f) 28%, transparent);\n}\n.lens-verdict.healthy .lens-verdict-dot { background: var(--sy-ok, #6fae6f); }\n.lens-verdict.healthy .lens-verdict-label { color: var(--sy-ok, #6fae6f); }\n.lens-verdict.degraded {\n background: color-mix(in srgb, var(--sy-warn, #e0af68) 12%, transparent);\n border-color: color-mix(in srgb, var(--sy-warn, #e0af68) 34%, transparent);\n}\n.lens-verdict.degraded .lens-verdict-dot { background: var(--sy-warn, #e0af68); }\n.lens-verdict.degraded .lens-verdict-label { color: var(--sy-warn, #e0af68); }\n.lens-verdict.critical {\n background: color-mix(in srgb, var(--sy-error, #f0a0a0) 14%, transparent);\n border-color: color-mix(in srgb, var(--sy-error, #f0a0a0) 40%, transparent);\n}\n.lens-verdict.critical .lens-verdict-dot {\n background: var(--sy-error, #f0a0a0);\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--sy-error, #f0a0a0) 70%, transparent);\n animation: lens-crit-pulse 1.3s ease-out infinite;\n}\n.lens-verdict.critical .lens-verdict-label { color: var(--sy-error, #f0a0a0); }\n@keyframes lens-crit-pulse {\n 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--sy-error, #f0a0a0) 70%, transparent); }\n 70% { box-shadow: 0 0 0 7px color-mix(in srgb, var(--sy-error, #f0a0a0) 0%, transparent); }\n 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--sy-error, #f0a0a0) 0%, transparent); }\n}\n.lens-verdict.idle {\n background: color-mix(in srgb, var(--sy-text-muted, #6b7280) 8%, transparent);\n border-color: color-mix(in srgb, var(--sy-text-muted, #6b7280) 22%, transparent);\n}\n.lens-verdict.idle .lens-verdict-dot { background: var(--sy-text-muted, #6b7280); }\n.lens-verdict.idle .lens-verdict-label { color: var(--sy-text-muted, #6b7280); }\n\n/* ── Headline tiles ─────────────────────────────────────────────────── */\n.lens-stats-head {\n display: flex; align-items: baseline; gap: 10px;\n font-size: 11px; color: var(--sy-text-muted, #6b7280);\n}\n.lens-stats-title { text-transform: uppercase; letter-spacing: .06em; }\n.lens-stats-meta { flex: 1; }\n.lens-stats-refresh {\n appearance: none; background: none; cursor: pointer;\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 40%, transparent);\n border-radius: 4px; padding: 3px 10px;\n font-size: 11px; color: var(--sy-text-muted, #6b7280);\n}\n.lens-stats-refresh:hover { color: var(--sy-text, #e2e2e2); border-color: var(--sy-text-muted, #6b7280); }\n.lens-stats-tiles {\n display: grid; gap: 12px;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n}\n.lens-stat-tile {\n appearance: none; text-align: left;\n display: flex; flex-direction: column; gap: 3px;\n padding: 12px 14px; border-radius: 8px;\n background: color-mix(in srgb, var(--sy-text-muted, #6b7280) 8%, transparent);\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 20%, transparent);\n color: inherit;\n}\n.lens-stat-tile.static { cursor: default; }\n.lens-stat-tile.err .lens-stat-value { color: var(--sy-error, #f0a0a0); }\n.lens-stat-value {\n font-size: 19px; font-weight: 600;\n font-variant-numeric: tabular-nums;\n color: var(--sy-text, #e2e2e2);\n}\n.lens-stat-label {\n font-size: 10px; text-transform: uppercase; letter-spacing: .06em;\n color: var(--sy-text-muted, #6b7280);\n}\n.lens-stat-sub { font-size: 10px; color: var(--sy-text-muted, #6b7280); }\n\n/* ── Traffic canvas card — pan/zoom time-series, the HERO ──────────────── */\n.lens-canvas-wrap {\n position: relative;\n user-select: none;\n padding: 16px 18px 12px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--sy-bg-surface, #1e1e1e) 55%, transparent);\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 18%, transparent);\n}\n.lens-canvas {\n display: block; width: 100%; height: 220px; cursor: grab;\n touch-action: none;\n}\n.lens-canvas:active { cursor: grabbing; }\n.lens-canvas-baseline {\n stroke: color-mix(in srgb, var(--sy-text-muted, #6b7280) 50%, transparent);\n stroke-width: 1; vector-effect: non-scaling-stroke;\n}\n.lens-canvas-tick {\n stroke: color-mix(in srgb, var(--sy-text-muted, #6b7280) 16%, transparent);\n stroke-width: 1; vector-effect: non-scaling-stroke;\n}\n.lens-canvas-crosshair {\n stroke: var(--sy-text, #e2e2e2);\n stroke-width: 1; vector-effect: non-scaling-stroke;\n pointer-events: none;\n}\n.lens-canvas-bar {\n fill: url(#traffic-ok);\n filter: drop-shadow(0 0 3px color-mix(in srgb, var(--sy-ok, #6fae6f) 45%, transparent));\n}\n.lens-canvas-bar.err {\n fill: url(#traffic-err);\n filter: drop-shadow(0 0 3px color-mix(in srgb, var(--sy-error, #f0a0a0) 50%, transparent));\n}\n/* ── Live 'now' edge — a bright leading line; pulses while following ────── */\n.lens-canvas-now {\n stroke: color-mix(in srgb, var(--sy-text, #e2e2e2) 40%, transparent);\n stroke-width: 1; vector-effect: non-scaling-stroke;\n stroke-dasharray: 3 3; pointer-events: none;\n}\n.lens-canvas-now.live {\n stroke: var(--sy-ok, #6fae6f);\n stroke-dasharray: none;\n}\n.lens-canvas-now-pulse {\n fill: var(--sy-ok, #6fae6f);\n transform-box: fill-box; transform-origin: center;\n animation: lens-now-pulse 1.6s ease-out infinite;\n pointer-events: none;\n}\n@keyframes lens-now-pulse {\n 0% { opacity: .9; r: 3; }\n 70% { opacity: 0; r: 9; }\n 100% { opacity: 0; r: 9; }\n}\n/* ── Health tint — the whole card takes on the verdict's mood ──────────── */\n.lens-canvas-wrap.verdict-degraded {\n border-color: color-mix(in srgb, var(--sy-warn, #e0af68) 30%, transparent);\n background: color-mix(in srgb, var(--sy-warn, #e0af68) 5%, color-mix(in srgb, var(--sy-bg-surface, #1e1e1e) 55%, transparent));\n}\n.lens-canvas-wrap.verdict-critical {\n border-color: color-mix(in srgb, var(--sy-error, #f0a0a0) 38%, transparent);\n background: color-mix(in srgb, var(--sy-error, #f0a0a0) 7%, color-mix(in srgb, var(--sy-bg-surface, #1e1e1e) 55%, transparent));\n}\n.lens-canvas-ticks { position: relative; height: 16px; margin-top: 4px; }\n.lens-canvas-tick-label {\n position: absolute; top: 0; transform: translateX(-50%);\n font-size: 10px; color: var(--sy-text-muted, #6b7280);\n font-variant-numeric: tabular-nums; white-space: nowrap;\n}\n.lens-canvas-scale {\n display: flex; justify-content: space-between;\n font-size: 10px; font-variant-numeric: tabular-nums;\n color: var(--sy-text-muted, #6b7280); margin-top: 4px;\n}\n.lens-canvas-scale .ok { color: var(--sy-ok, #6fae6f); }\n.lens-canvas-scale .err { color: var(--sy-error, #f0a0a0); }\n\n/* ── Latency lane — p50/p95 over time, its OWN y-scale under the volume\n chart (shared x-axis, not a dual-axis overlay) ──────────────────────── */\n.lens-latency-lane {\n margin-top: 10px;\n padding-top: 8px;\n border-top: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 16%, transparent);\n}\n.lens-latency-label {\n display: flex; justify-content: space-between; align-items: baseline;\n font-size: 10px; text-transform: uppercase; letter-spacing: .05em;\n color: var(--sy-text-muted, #6b7280); margin-bottom: 2px;\n}\n.lens-latency-peak { text-transform: none; letter-spacing: 0; font-variant-numeric: tabular-nums; }\n.lens-latency-svg { display: block; width: 100%; height: 64px; overflow: visible; }\n.lens-lat-p95 {\n fill: none; stroke: var(--sy-warn, #e0af68); stroke-width: 1.5;\n vector-effect: non-scaling-stroke; stroke-linejoin: round; stroke-linecap: round;\n}\n.lens-lat-p50 {\n fill: none; stroke: color-mix(in srgb, var(--sy-warn, #e0af68) 55%, transparent);\n stroke-width: 1; vector-effect: non-scaling-stroke;\n stroke-linejoin: round; stroke-linecap: round; stroke-dasharray: 3 2;\n}\n.lens-canvas-hover-lat { color: var(--sy-warn, #e0af68); font-variant-numeric: tabular-nums; }\n\n/* ── Hover tooltip — minute + error rate under the cursor ──────────────── */\n.lens-canvas-hover {\n position: absolute;\n top: 10px;\n transform: translateX(-50%);\n z-index: 4;\n pointer-events: none;\n display: flex; flex-direction: column; gap: 2px;\n padding: 6px 10px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--sy-bg-app, #161616) 90%, transparent);\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 30%, transparent);\n box-shadow: 0 4px 14px rgba(0,0,0,.35);\n font-size: 11px; white-space: nowrap;\n}\n.lens-canvas-hover-time {\n color: var(--sy-text, #e2e2e2); font-weight: 600;\n font-variant-numeric: tabular-nums;\n}\n.lens-canvas-hover-row { display: flex; gap: 8px; font-variant-numeric: tabular-nums; }\n.lens-canvas-hover-row .ok { color: var(--sy-ok, #6fae6f); }\n.lens-canvas-hover-row .err { color: var(--sy-error, #f0a0a0); }\n.lens-canvas-hover-rate { color: var(--sy-text-muted, #6b7280); }\n\n/* ── By-node breakdown card — which node serves the most traffic ───────── */\n.lens-by-node {\n padding: 14px 16px 16px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--sy-bg-surface, #1e1e1e) 55%, transparent);\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 18%, transparent);\n}\n.lens-by-node-title {\n display: flex; align-items: baseline; gap: 8px;\n font-size: 10px; text-transform: uppercase; letter-spacing: .06em;\n color: var(--sy-text-muted, #6b7280); margin-bottom: 8px;\n}\n.lens-by-node-scope {\n text-transform: none; letter-spacing: 0;\n color: var(--sy-text-faint, #3a3a3a); font-size: 10px;\n}\n.lens-by-node-row {\n display: grid; grid-template-columns: auto minmax(90px, 180px) 1fr auto;\n align-items: center; gap: 10px;\n padding: 6px 8px; border-radius: 6px;\n font-size: 11.5px; font-variant-numeric: tabular-nums;\n transition: background .12s ease;\n}\n.lens-by-node-row:hover {\n background: color-mix(in srgb, var(--sy-text-muted, #6b7280) 8%, transparent);\n}\n.lens-by-node-dot {\n width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;\n background: var(--node-c, var(--sy-accent, #e2e2e2));\n box-shadow: 0 0 6px color-mix(in srgb, var(--node-c, var(--sy-accent, #e2e2e2)) 60%, transparent);\n}\n.lens-by-node-name {\n overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n font-family: ui-monospace, monospace;\n color: var(--sy-text, #e2e2e2);\n}\n.lens-by-node-bar-wrap {\n height: 6px; border-radius: 3px; overflow: hidden;\n background: color-mix(in srgb, var(--sy-text-muted, #6b7280) 14%, transparent);\n}\n.lens-by-node-bar {\n height: 100%; border-radius: 3px; min-width: 2px;\n background: var(--sy-ok, #6fae6f);\n transition: width .2s ease, background .2s ease;\n}\n/* Load bar coloured by ERROR RATE (matches the health verdict thresholds),\n not a binary has-error flag. */\n.lens-by-node-bar.ok { background: var(--sy-ok, #6fae6f); }\n.lens-by-node-bar.degraded { background: var(--sy-warn, #e0af68); }\n.lens-by-node-bar.critical { background: var(--sy-error, #f0a0a0); }\n.lens-by-node-count { color: var(--sy-text-muted, #6b7280); white-space: nowrap; }\n\n/* ── System lens time-window navigator — pan/zoom/brush timeline ───────── */\n.lens-timeline {\n padding: 8px 12px 4px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n background: var(--sy-bg-surface, #1e1e1e);\n flex-shrink: 0;\n user-select: none;\n}\n.lens-tl-nav {\n display: flex; align-items: center; gap: 8px; margin-bottom: 6px;\n}\n.lens-tl-btn {\n appearance: none; background: none; cursor: pointer;\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 40%, transparent);\n border-radius: 4px; padding: 2px 9px;\n font-size: 11px; color: var(--sy-text-muted, #6b7280);\n}\n.lens-tl-btn:hover { color: var(--sy-text, #e2e2e2); border-color: var(--sy-text-muted, #6b7280); }\n/* Draw the eye to \"⤒ latest\" when the current window has no rows — the\n nudge to jump to where the data actually is. */\n.lens-tl-btn.nudge {\n color: var(--sy-accent, #e2e2e2);\n border-color: color-mix(in srgb, var(--sy-accent, #e2e2e2) 55%, transparent);\n background: var(--sy-accent-tint, rgba(255,255,255,.10));\n}\n/* Preset zoom levels — equal-width so the group reads as an even segmented\n control rather than ragged buttons. */\n.lens-tl-presets {\n display: inline-flex; gap: 2px;\n padding: 0 6px; margin: 0 2px;\n border-left: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 22%, transparent);\n border-right: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 22%, transparent);\n}\n.lens-tl-preset {\n appearance: none; background: none; cursor: pointer;\n border: 1px solid transparent; border-radius: 4px;\n padding: 2px 0; min-width: 38px; text-align: center;\n font-size: 11px;\n color: var(--sy-text-muted, #6b7280); font-variant-numeric: tabular-nums;\n}\n.lens-tl-preset:hover { color: var(--sy-text, #e2e2e2); }\n.lens-tl-preset.on {\n color: var(--sy-accent, #e2e2e2);\n background: var(--sy-accent-tint, rgba(255,255,255,.14));\n}\n.lens-tl-span {\n font-size: 11px; font-weight: 600; font-variant-numeric: tabular-nums;\n color: var(--sy-accent, #e2e2e2);\n min-width: 34px; text-align: center;\n}\n.lens-tl-label {\n font-size: 11px; color: var(--sy-text-muted, #6b7280);\n font-variant-numeric: tabular-nums; white-space: nowrap;\n}\n/* Pushes the row-count + live control to the right so the left cluster\n stays tightly, evenly grouped. */\n.lens-tl-spacer { flex: 1 1 auto; }\n.lens-tl-count {\n font-size: 10px; color: var(--sy-text-faint, #3a3a3a);\n font-variant-numeric: tabular-nums; white-space: nowrap;\n}\n.lens-tl-count.capped { color: var(--sy-warn, #e0af68); }\n.lens-tl-live { display: inline-flex; align-items: center; gap: 6px; }\n.lens-tl-live.on {\n color: var(--sy-ok, #6fae6f);\n border-color: color-mix(in srgb, var(--sy-ok, #6fae6f) 60%, transparent);\n background: color-mix(in srgb, var(--sy-ok, #6fae6f) 12%, transparent);\n}\n.lens-tl-live-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--sy-text-faint, #3a3a3a); }\n.lens-tl-live-dot.on { background: var(--sy-ok, #6fae6f); animation: lens-live-pulse 1.6s ease-out infinite; }\n\n.lens-tl-strip-wrap { position: relative; }\n.lens-tl-strip {\n display: block; width: 100%; height: 44px; cursor: grab;\n touch-action: none;\n background: color-mix(in srgb, var(--sy-bg-app, #161616) 60%, transparent);\n border: 1px solid color-mix(in srgb, var(--sy-text-muted, #6b7280) 18%, transparent);\n border-radius: 6px;\n}\n.lens-tl-strip:active { cursor: grabbing; }\n.lens-tl-tick {\n stroke: color-mix(in srgb, var(--sy-text-muted, #6b7280) 18%, transparent);\n stroke-width: 1; vector-effect: non-scaling-stroke;\n}\n/* Monochromatic density heatmap — one horizontal linearGradient (a stop\n per bin) on a single rect: smooth in X, uniform in Y, neutral ink whose\n opacity tracks the per-second rate on a constant scale. Fill + stops are\n set in window_nav; no static fill needed here. */\n/* Edge grab-handles — drag to move that bound independently */\n.lens-tl-handle {\n fill: color-mix(in srgb, var(--sy-accent, #e2e2e2) 14%, transparent);\n cursor: ew-resize;\n}\n.lens-tl-handle:hover { fill: color-mix(in srgb, var(--sy-accent, #e2e2e2) 28%, transparent); }\n.lens-tl-grip {\n stroke: color-mix(in srgb, var(--sy-accent, #e2e2e2) 55%, transparent);\n stroke-width: 2; vector-effect: non-scaling-stroke; pointer-events: none;\n}\n/* Brush preview while resizing an edge (axis frozen) */\n.lens-tl-brush { fill: color-mix(in srgb, var(--sy-accent, #e2e2e2) 16%, transparent); }\n.lens-tl-brush-edge {\n stroke: var(--sy-accent, #e2e2e2); stroke-width: 1.5;\n vector-effect: non-scaling-stroke;\n}\n.lens-tl-ticks { position: relative; height: 14px; margin-top: 2px; }\n.lens-tl-tick-label {\n position: absolute; top: 0; transform: translateX(-50%);\n font-size: 10px; color: var(--sy-text-muted, #6b7280);\n font-variant-numeric: tabular-nums; white-space: nowrap;\n}\n/* Edge ticks sit at left:0%/100% — centered transform would push half the\n label past the strip's bounds (the end one goes fully invisible against\n a clipping ancestor). Pin them inward instead. */\n.lens-tl-tick-label.edge-start { transform: translateX(0); }\n.lens-tl-tick-label.edge-end { transform: translateX(-100%); }\n\n.topic-system { --topic-c: var(--sy-accent, #e2e2e2); }\n.topic-dataset { --topic-c: var(--sy-op-sql, #a8adb5); }\n.topic-auth { --topic-c: #d0d4da; }\n.topic-traffic { --topic-c: var(--sy-text-muted, #6b7280); }\n.topic-audit { --topic-c: var(--sy-op-write, #f0f0f0); }\n.topic-diagnostic { --topic-c: #9aa0a8; }\n\n.lens-cell-shape,\n.lens-cell-pred {\n font-family: ui-monospace, monospace;\n font-size: 11px;\n color: var(--sy-text-muted, #888);\n}\n\n.lens-cell-rows,\n.lens-cell-elapsed {\n text-align: right;\n font-family: ui-monospace, monospace;\n font-size: 11px;\n color: var(--sy-text-muted, #888);\n width: 64px;\n}\n\n.lens-cell-drill {\n background: transparent;\n border: 0;\n padding: 0;\n margin: 0;\n font: inherit;\n color: var(--sy-text-primary, #d4d4d4);\n cursor: pointer;\n text-align: left;\n border-bottom: 1px dotted transparent;\n transition: border-color 60ms, color 60ms;\n}\n.lens-cell-drill:hover {\n color: var(--sy-accent, #e2e2e2);\n border-bottom-color: var(--sy-accent, #e2e2e2);\n}\n.lens-cell-empty { color: var(--sy-text-faint, #3a3a3a); }\n\n.lens-status {\n display: inline-block;\n padding: 1px 6px;\n font-size: 10px;\n text-transform: uppercase;\n border-radius: 2px;\n}\n.lens-status.status-ok {\n color: var(--sy-success, #a8adb5);\n background: color-mix(in srgb, var(--sy-success, #a8adb5) 14%, transparent);\n}\n.lens-status.status-error {\n color: var(--sy-error, #f7768e);\n background: color-mix(in srgb, var(--sy-error, #f7768e) 14%, transparent);\n}\n\n/* ── Detail panel (expanded row) ─────────────────────────────────────────── */\n.lens-detail-row { background: var(--sy-bg-surface, #1e1e1e); }\n.lens-detail-cell {\n padding: 12px 16px 16px 16px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n}\n.lens-detail {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));\n gap: 16px 24px;\n font-family: ui-monospace, monospace;\n font-size: 11.5px;\n}\n.lens-detail-section { min-width: 0; }\n.lens-detail-title {\n font-family: 'Inter', system-ui, sans-serif;\n font-size: 10.5px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--sy-text-faint, #3a3a3a);\n margin-bottom: 6px;\n padding-bottom: 4px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n}\n.lens-detail-kv {\n display: grid;\n grid-template-columns: 110px 1fr;\n gap: 8px;\n padding: 2px 0;\n align-items: baseline;\n}\n.lens-detail-k {\n color: var(--sy-text-muted, #888);\n}\n.lens-detail-v {\n color: var(--sy-text-primary, #d4d4d4);\n word-break: break-word;\n white-space: pre-wrap;\n}\n/* Error spans the whole grid — traces are wide, and it lands below signal/data. */\n.lens-detail-error { grid-column: 1 / -1; }\n.lens-detail-error .lens-detail-title { color: var(--sy-error, #f7768e); }\n.lens-detail-hint {\n font-family: 'Inter', system-ui, sans-serif;\n font-size: 10.5px;\n color: var(--sy-text-faint, #3a3a3a);\n margin-top: 4px;\n font-style: italic;\n}\n.lens-detail-audit-link .lens-detail-title { color: var(--sy-op-write, #f0f0f0); }\n.lens-audit-link {\n display: inline-block;\n height: 26px;\n padding: 0 12px;\n font-size: 12px;\n background: transparent;\n border: 1px dashed var(--sy-op-write, #f0f0f0);\n border-radius: 3px;\n color: var(--sy-op-write, #f0f0f0);\n cursor: not-allowed;\n opacity: 0.65;\n}\n.lens-detail-block {\n grid-column: 1 / -1; /* full-width row inside the grid */\n min-width: 0;\n}\n.lens-detail-block-label {\n font-family: 'Inter', system-ui, sans-serif;\n font-size: 10.5px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--sy-text-faint, #3a3a3a);\n margin-bottom: 4px;\n}\n.lens-detail-block-body {\n margin: 0;\n padding: 8px 10px;\n font-family: ui-monospace, monospace;\n font-size: 11px;\n line-height: 1.55;\n color: var(--sy-text-primary, #d4d4d4);\n background: var(--sy-bg-app, #161616);\n border-left: 2px solid var(--sy-accent, #e2e2e2);\n border-radius: 2px;\n overflow-x: auto;\n white-space: pre;\n max-height: 320px;\n overflow-y: auto;\n}\n.lens-detail-trace {\n margin-top: 6px;\n padding: 8px 10px;\n font-size: 10.5px;\n line-height: 1.5;\n color: var(--sy-text-muted, #888);\n background: var(--sy-bg-app, #161616);\n border-left: 2px solid var(--sy-error, #f7768e);\n border-radius: 2px;\n overflow-x: auto;\n white-space: pre;\n}\n\n/* ── SQL trace section (nested under op-completed row, debug mode) ──────── */\n.lens-trace {\n grid-column: 1 / -1;\n min-width: 0;\n}\n.lens-trace .lens-detail-title { color: var(--sy-op-write, #f0f0f0); }\n.lens-trace-status {\n font-family: ui-monospace, monospace;\n font-size: 10.5px;\n text-transform: none;\n letter-spacing: 0;\n color: var(--sy-text-muted, #888);\n}\n.lens-trace-table {\n /* `table-layout: fixed` locks column widths to the THEAD definitions —\n * without it, expanding a row with a long SQL string in the DATA cell\n * causes neighbouring columns to shrink and the whole table reflows.\n * Fixed layout keeps every other row at its original column widths. */\n width: 100%;\n table-layout: fixed;\n margin-top: 6px;\n border-collapse: collapse;\n font-family: ui-monospace, monospace;\n font-size: 11px;\n}\n.lens-trace-table colgroup col.lens-trace-col-time { width: 78px; }\n.lens-trace-table colgroup col.lens-trace-col-lvl { width: 56px; }\n.lens-trace-table colgroup col.lens-trace-col-ns { width: 120px; }\n.lens-trace-table colgroup col.lens-trace-col-id { width: 180px; }\n.lens-trace-table colgroup col.lens-trace-col-msg { width: 200px; }\n/* :col-data takes the rest */\n.lens-trace-table th {\n text-align: left;\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--sy-text-faint, #3a3a3a);\n padding: 4px 8px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n background: var(--sy-bg-app, #161616);\n font-weight: 500;\n}\n.lens-trace-row {\n cursor: pointer;\n}\n.lens-trace-row td {\n padding: 3px 8px;\n vertical-align: top;\n border-bottom: 1px solid color-mix(in srgb, var(--sy-border, #2a2a2a) 40%, transparent);\n color: var(--sy-text-primary, #d4d4d4);\n}\n.lens-trace-row:hover { background: color-mix(in srgb, var(--sy-accent, #e2e2e2) 6%, transparent); }\n.lens-trace-row.selected { background: color-mix(in srgb, var(--sy-accent, #e2e2e2) 12%, transparent); }\n.lens-trace-row.err {\n background: color-mix(in srgb, var(--sy-error, #f7768e) 8%, transparent);\n border-left: 2px solid var(--sy-error, #f7768e);\n}\n.lens-trace-row.err:hover { background: color-mix(in srgb, var(--sy-error, #f7768e) 14%, transparent); }\n.lens-trace-row.err.selected { background: color-mix(in srgb, var(--sy-error, #f7768e) 18%, transparent); }\n.lens-trace-ns {\n color: var(--sy-text-muted, #888);\n font-size: 10.5px;\n white-space: nowrap;\n}\n.lens-trace-detail-row { background: var(--sy-bg-app, #161616); }\n.lens-trace-detail {\n padding: 8px 14px 10px 14px;\n border-bottom: 1px solid var(--sy-border, #2a2a2a);\n}\n.lens-trace-detail-block { margin-bottom: 6px; }\n.lens-trace-detail-block:last-child { margin-bottom: 0; }\n.lens-trace-detail-label {\n font-family: 'Inter', system-ui, sans-serif;\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--sy-text-faint, #3a3a3a);\n margin-bottom: 2px;\n}\n.lens-trace-detail-pre {\n margin: 0;\n padding: 6px 8px;\n font-family: ui-monospace, monospace;\n font-size: 11px;\n line-height: 1.55;\n color: var(--sy-text-primary, #d4d4d4);\n background: var(--sy-bg-surface, #1e1e1e);\n border-left: 2px solid var(--sy-accent, #e2e2e2);\n border-radius: 2px;\n /* Inner scroll: the detail row is bounded so expanding doesn't jolt the\n * surrounding rows. Long SQL or stack traces scroll INSIDE this block. */\n max-height: 180px;\n overflow-x: auto;\n overflow-y: auto;\n white-space: pre-wrap;\n word-break: break-word;\n}\n.lens-trace-detail-pre.lens-trace-detail-sql {\n /* Wider scroll budget for the SQL block specifically — SQL strings often\n * need horizontal room even after format-sql injects clause-breaks. */\n max-height: 220px;\n font-size: 11.5px;\n border-left-color: var(--sy-op-write, #f0f0f0);\n}\n.lens-trace-ts {\n color: var(--sy-text-muted, #888);\n white-space: nowrap;\n}\n.lens-trace-lvl {\n font-size: 10px;\n text-transform: uppercase;\n text-align: center;\n width: 50px;\n}\n.lens-trace-lvl.lvl-trace { color: var(--sy-text-faint, #3a3a3a); }\n.lens-trace-lvl.lvl-debug { color: var(--sy-text-muted, #888); }\n.lens-trace-lvl.lvl-info { color: var(--sy-info, #9aa0a8); }\n.lens-trace-lvl.lvl-warn { color: var(--sy-warn, #e0af68); }\n.lens-trace-lvl.lvl-error,\n.lens-trace-lvl.lvl-fatal { color: var(--sy-error, #f7768e); }\n.lens-trace-id {\n color: var(--sy-accent, #e2e2e2);\n white-space: nowrap;\n}\n.lens-trace-msg { color: var(--sy-text-primary, #d4d4d4); }\n.lens-trace-data {\n color: var(--sy-text-muted, #888);\n font-size: 10.5px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.lens-trace-empty {\n padding: 12px;\n font-size: 11.5px;\n color: var(--sy-text-faint, #3a3a3a);\n}\n.lens-trace-error { color: var(--sy-error, #f7768e); }\n\n/* ── Empty state ─────────────────────────────────────────────────────────── */\n.lens-empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--sy-text-muted, #666);\n font-size: 12px;\n gap: 4px;\n}\n.lens-empty-title { font-size: 13px; color: var(--sy-text-primary, #d4d4d4); }\n.lens-empty-hint { font-size: 11px; color: var(--sy-text-faint, #3a3a3a); }\n.lens-empty-msg { color: var(--sy-error, #f7768e); }\n");
|
|
3223
3223
|
function VDa(a){a.removeAttribute("open");a.dispatchEvent(new CustomEvent("close",{bubbles:!0}));a=a.onClose;return l(a)?a.v?a.v():a.call(null):null}
|
|
3224
3224
|
function y7(a,b,c){b=b.querySelector(".lc-root-host");return l(b)?mQ(b,function(){var d=h$(a);d=d instanceof x?d.H:null;switch(d){case "login":return Z$(new k(null,1,[vw,function(){return VDa(a)}],null));case "pending":return null;case "ready":return hAa(new k(null,2,[vw,function(){return VDa(a)},nx,a.hasAttribute("embedded")],null),c);default:throw Error(["No matching clause: ",p.g(d)].join(""));}}()):null}
|
|
3225
3225
|
function z7(a,b){for(var c=function(){var h=null==a?null:a.composedPath();return l(h)?h:[]}(),d=c.length,e=0;;){if(e>=d)return!1;var f=c[e];if(l(function(){var h=f;return l(h)?(h=f.classList,l(h)?f.classList.contains(b):h):h}()))return!0;e+=1}}
|
|
@@ -3228,7 +3228,7 @@ function A7(a){function b(){return z.h("visible",document.visibilityState)&&cR()
|
|
|
3228
3228
|
function B7(a,b){Hk(N2,new R(null,2,5,S,[es,a],null),function(c,d,e,f){c=x3(e);f=x3(f);if(yg(c,f)&&l(b)){Q.l(P3,M,b,f);c=q(N3);if(l(c))try{c.transaction(["ui_state"],"readwrite").objectStore("ui_state").put(PW(f),b)}catch(h){console.warn("[cockpit.storage] put failed:",h)}f=new k(null,2,[oA,b,rB,PW(f)],null);c=q(O3);if(l(c))try{c.postMessage(Sk(f))}catch(h){console.warn("[cockpit.storage] postMessage failed:",h)}}return null})}
|
|
3229
3229
|
function C7(a){function b(){var f=(f=mb(q(d)))?c():f;return l(f)?(ah(d,!0),f=q(e),l(f)&&(f.v?f.v():f.call(null)),Ik(lX,EJ),a.v?a.v():a.call(null)):null}function c(){var f=null!=oA.g(q(lX));return f?nX():f}if(l(c()))return a.v?a.v():a.call(null);var d=$g(!1),e=$g(null);ah(e,YQ(function(){return b()}));return Hk(lX,EJ,function(){return b()})}
|
|
3230
3230
|
function D7(a){function b(f){var h;if(h=z.h("Escape",f.key))h=(h=mb(f.defaultPrevented))?a.hasAttribute("open"):h;return l(h)?(f.preventDefault(),VDa(a)):null}a._ownsConnection=cua(a);var c=ba.wd(a,"open"),d=oA.g(q(lX));Q.o(N2,M,eH,null,I([xz,!1,HN,null,LB,null,QJ,!1,ZI,!1]));Hk(N2,new R(null,2,5,S,[Qm,a],null),function(f,h,m,n){return y7(a,c,n)});l(a.hasAttribute("embedded"))||Hk(j2,new R(null,2,5,S,[YW,a],null),function(){return y7(a,c,q(N2))});document.addEventListener("keydown",b);a._escHandler=
|
|
3231
|
-
b;Hk(lX,new R(null,2,5,S,[$q,a],null),function(f,h,m,n){yg(Xy.g(m),Xy.g(n))?(f=Q.l,n=Xy.g(n),n=f.call(Q,N2,M,Xy,l(n)?n:Rj)):n=null;return n});l(a.hasAttribute("embedded"))||(MDa(c,a),pX(c));z2(c,
|
|
3231
|
+
b;Hk(lX,new R(null,2,5,S,[$q,a],null),function(f,h,m,n){yg(Xy.g(m),Xy.g(n))?(f=Q.l,n=Xy.g(n),n=f.call(Q,N2,M,Xy,l(n)?n:Rj)):n=null;return n});l(a.hasAttribute("embedded"))||(MDa(c,a),pX(c));z2(c,u2,"synthigy-log-cockpit");z2(c,":host {\n display: none;\n position: fixed;\n inset: 0;\n z-index: 9998;\n overscroll-behavior: contain;\n font-family: 'Inter', sans-serif;\n font-size: 13px;\n line-height: 1.5;\n color: var(--sy-text-primary, #d4d4d4);\n background: var(--sy-bg-app, #161616);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n :host([open]) {\n display: block;\n }",
|
|
3232
3232
|
"synthigy-lc-host");if(!l(c.querySelector(".lc-root-host"))){var e=document.createElement("div");e.className="lc-root-host";e.style.width="100%";e.style.height="100%";c.appendChild(e)}iAa(a,c);y7(a,c,q(N2));return Nwa(d).then(function(f){l(f)&&wwa(f);B7(a,d);return C7(function(){J3();F3();return A7(a)})}).catch(function(){B7(a,d);return C7(function(){J3();F3();return A7(a)})})};function E7(){return new k(null,5,[CJ,new R(null,2,5,S,[0,0],null),Ap,1,uI,null,qr,null,zt,null],null)}function jAa(a,b,c){var d=J(c,0,null);c=J(c,1,null);var e=Ap.g(a),f=function(){var u=e*b;u=.1<u?u:.1;return 10>u?u:10}(),h=f/e,m=CJ.g(a),n=J(m,0,null);m=J(m,1,null);h=1-1/h;var r=(d-n)*h,t=(c-m)*h;return Gh.j(M.j(a,Ap,f),CJ,function(u){var w=J(u,0,null);u=J(u,1,null);return new R(null,2,5,S,[w+r,u+t],null)})}function kAa(a,b,c){return M.j(a,zt,new k(null,3,[jt,b,it,c,tn,CJ.g(a)],null))}
|
|
3233
3233
|
function lAa(a,b,c){var d=zt.g(a);if(l(d)){d=N(d);var e=v(d,jt),f=v(d,it);d=v(d,tn);var h=Ap.g(a);b=(b-e)/h;c=(c-f)/h;f=J(d,0,null);d=J(d,1,null);return M.j(a,CJ,new R(null,2,5,S,[f-b,d-c],null))}return a}function mAa(a){return M.j(a,zt,null)};var X=$g(pj([Ft,qi,Tl,VF,iH,sp,ZD,oq,JM],[null,null,null,null,!1,!1,ug,E7(),null]));function F7(){return ef(xE.g(eI.g(q(X))))}var G7=ch(!1);Hk(X,wha,function(a,b,c,d){(a=mb(q(G7)))?(a=xE.g(eI.g(d)),d=l(a)?JM.g(c)!==JM.g(d):a):d=a;return l(d)?(pd(G7,!0),Q.l(X,M,JM,JM.g(c)),pd(G7,!1)):null});
|
|
3234
3234
|
var H7=function(){var a=$g(ug),b=$g(ug),c=$g(ug),d=$g(ug),e=Od(ug,Yx,al.v?al.v():al.call(null));return new ml(Pd.h("synthigy.modeling.state","read"),function(){var f=null;f=function(h,m){switch(arguments.length){case 1:return h;case 2:return h}throw Error("Invalid arity: "+arguments.length);};f.g=function(h){return h};f.h=function(h){return h};return f}(),e,a,b,c,d)}(),I7=function(){var a=$g(ug),b=$g(ug),c=$g(ug),d=$g(ug),e=Od(ug,Yx,al.v?al.v():al.call(null));return new ml(Pd.h("synthigy.modeling.state",
|
|
@@ -3291,7 +3291,7 @@ I7.B(null,nr,function(a,b){a=N(b);var c=v(a,WL),d=v(a,VL);return Q.h(X,function(
|
|
|
3291
3291
|
I7.B(null,ZJ,function(a,b){var c=N(b);a=v(c,MO);b=v(c,MI);var d=v(c,KI),e=v(c,Sr);c=v(c,lB);if(l(Bh(q(X),new R(null,2,5,S,[oq,zt],null))))return null;I7.h(BI,null);Q.o(X,Gh,oq,M,I([uI,e,qr,c]));e=oq.g(q(X));a=0<a?.95:1.05;var f=new R(null,2,5,S,[b,d],null);e=N(e);var h=v(e,CJ);d=v(e,Ap);b=v(e,uI);e=v(e,qr);c=J(f,0,null);f=J(f,1,null);var m=J(h,0,null);h=J(h,1,null);var n=b/d;d=e/d;Q.o(X,Gh,oq,jAa,I([a,new R(null,2,5,S,[m-n/2+c/b*n,h-d/2+f/e*d],null)]));return F8()});
|
|
3292
3292
|
I7.B(null,a0,function(){Q.h(X,function(a){return Le.h(Gh.j(a,oq,mAa),BJ)});return F8()});I7.B(null,hJ,function(){var a=oq.g(q(X)),b=N(a);a=v(b,uI);b=v(b,qr);Q.l(X,M,oq,M.o(E7(),uI,a,I([qr,b])));return F8()});
|
|
3293
3293
|
function NAa(a){if(A(a)){a=Yg(function(c){var d=RA.g(c);return l(d)?new R(null,2,5,S,[function(){var e=WL.g(d);return l(e)?e:0}(),function(){var e=VL.g(d);return l(e)?e:0}()],null):null},a);var b=H(a);return 0<b?new R(null,2,5,S,[uf(zf,eh.h(B,a))/b,uf(zf,eh.h(Ce,a))/b],null):null}return null}
|
|
3294
|
-
function H8(){var a=JM.g(q(X));if(l(a)&&(a=A(Ii(tF.g(a))))){var b=NAa(a);if(l(b))return Q.l(X,Gh,oq,function(c){var d=M.j,e=J(b,0,null),f=J(b,1,null);c=M.j(c,CJ,new R(null,2,5,S,[e,f],null));return d.call(M,c,Ap,1)}),F8()}return null};var
|
|
3294
|
+
function H8(){var a=JM.g(q(X));if(l(a)&&(a=A(Ii(tF.g(a))))){var b=NAa(a);if(l(b))return Q.l(X,Gh,oq,function(c){var d=M.j,e=J(b,0,null),f=J(b,1,null);c=M.j(c,CJ,new R(null,2,5,S,[e,f],null));return d.call(M,c,Ap,1)}),F8()}return null};var v2=new CSSStyleSheet;v2.replaceSync("/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Entity Context Menu\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Floating menu that appears when clicking on an entity.\n Uses 8-position smart placement to stay within viewport.\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n.entity-menu {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 6px;\n background: var(--modeling-canvas-bg);\n border: 1.5px solid var(--modeling-entity-stroke);\n border-radius: 3px;\n}\n\n.entity-menu .menu-action {\n position: relative;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 3px;\n background: transparent;\n color: var(--modeling-overlay-text);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.entity-menu .menu-action[data-tooltip]::before {\n content: attr(data-tooltip);\n position: absolute;\n left: calc(100% + 7px);\n top: 50%;\n transform: translateY(-50%);\n background: rgba(18, 20, 28, 0.92);\n color: rgba(255, 255, 255, 0.95);\n padding: 5px 10px;\n border-radius: 5px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n pointer-events: none;\n letter-spacing: 0.01em;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.12s ease, visibility 0.12s ease;\n z-index: 100;\n}\n\n.entity-menu .menu-action[data-tooltip]:hover::before {\n opacity: 1;\n visibility: visible;\n}\n\n.entity-menu .menu-action:hover {\n background: var(--modeling-hover-overlay-strong);\n color: var(--modeling-entity-text);\n}\n\n.entity-menu .menu-action:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* Delete button - red on hover */\n.entity-menu .menu-action:last-child:hover:not(:disabled) {\n background: var(--modeling-removed-tint);\n color: var(--modeling-removed-text);\n}\n");
|
|
3295
3295
|
function OAa(a,b){var c=H7.g(QL);if(l(c)){c=c.getBoundingClientRect();var d=H7.g(XC);d=M.o(d,uI,c.width,I([qr,c.height]));var e=new R(null,2,5,S,[a,b],null);d=N(d);var f=v(d,CJ);b=v(d,Ap);a=v(d,uI);d=v(d,qr);var h=J(e,0,null);e=J(e,1,null);var m=J(f,0,null);f=J(f,1,null);var n=a/b;b=d/b;b=new R(null,2,5,S,[(h-(m-n/2))/n*a,(e-(f-b/2))/b*d],null);a=J(b,0,null);b=J(b,1,null);return new k(null,2,[WL,c.left+a,VL,c.top+b],null)}return null}
|
|
3296
3296
|
function PAa(a){function b(t){var u=J(t,0,null);t=J(t,1,null);u=e+u;t=f+t;return 0<=u&&0<=t&&u+48<=m&&t+208<=n}var c=N(a),d=v(c,EL);a=v(c,VB);c=v(c,WF);d=N(d);var e=v(d,WL),f=v(d,VL),h=H7.g(XC);d=function(){var t=Ap.g(h);return l(t)?t:1}();a=a*d*.5;c=c*d*.5;var m=window.innerWidth,n=window.innerHeight,r=new R(null,8,5,S,[new R(null,2,5,S,[a+8,-104],null),new R(null,2,5,S,[-(a+48+8),-104],null),new R(null,2,5,S,[-24,c+8],null),new R(null,2,5,S,[-24,-(c+208+8)],null),new R(null,2,5,S,[a+8,c+8],null),
|
|
3297
3297
|
new R(null,2,5,S,[-(a+48+8),c+8],null),new R(null,2,5,S,[a+8,-(c+208+8)],null),new R(null,2,5,S,[-(a+48+8),-(c+208+8)],null)],null);c=function(){var t=B(sh(b,r));return l(t)?t:B(r)}();a=J(c,0,null);c=J(c,1,null);return new k(null,2,[PB,e+a,SC,f+c],null)}
|
|
@@ -3308,7 +3308,7 @@ I7.B(null,GE,function(){var a=eI.g(q(X)),b=Bh(q(X),new R(null,2,5,S,[FF,WD],null
|
|
|
3308
3308
|
5,S,[FF,Wx],null),!0),sAa(M.j(a,JM,c),I([Qx,function(){Q.l(X,xg,new R(null,2,5,S,[FF,Wx],null),!1);I8(["Version '",p.g(d),"' saved"].join(""));return P7(m,I([Qx,function(r){l(r)&&Q.l(X,M,eI,Le.h(r,JM));return I7.h(PI,null)},Kr,"Failed to load saved version"]))},TF,function(){return Q.l(X,xg,new R(null,2,5,S,[FF,Wx],null),!1)},Kr,"Failed to save version"]))):null});
|
|
3309
3309
|
I7.B(null,BM,function(a,b){a=N(b);a=v(a,xp);return P7(a,I([Qx,function(c){var d=JM.g(c),e="string"===typeof d?QW(d):null;d=mJ.g(q(X));return l(e)&&(Q.l(X,M,eI,Le.o(c,JM,I([lk]))),I7.h(yp,new k(null,1,[JM,e],null)),e=A(Jra(e)))?(e=["Model has broken rules on ",p.g(H(e))," ",z.h(1,H(e))?"entity":"entities",": ",aP(", ",eh.h(TB,e))," — open the entity's Guard/Constraints tab to fix."].join(""),M7(M.o(null,aJ,XM,I([nC,e]))),I7.h(oD,new k(null,1,[SJ,Le.o(c,JM,I([lk]))],null)),l8(),l(d)?I7.h(ct,null):null):
|
|
3310
3310
|
null},Kr,"Failed to load version"]))});I7.B(null,l0,function(){var a=FF.g(q(X));a=N(a);var b=v(a,WD),c=v(a,$G);a=v(a,ev);b=J(b,l(c)?c:0,null);b=null==b?null:mV(b);return l(b)?l(a)?null:I7.h(BM,new k(null,1,[xp,b],null)):null});I7.B(null,KM,function(a,b){a=N(b);a=v(a,xp);return Q.l(X,xg,new R(null,2,5,S,[FF,ev],null),a)});I7.B(null,vD,function(){return Q.l(X,xg,new R(null,2,5,S,[FF,ev],null),null)});
|
|
3311
|
-
I7.B(null,VJ,function(){var a=Bh(q(X),new R(null,2,5,S,[FF,ev],null)),b=eI.g(q(X)),c=z.h(a,mV(b));return l(a)?tAa(a,I([Qx,function(){Q.l(X,xg,new R(null,2,5,S,[FF,ev],null),null);c&&(Q.l(X,M,JM,null),Q.l(X,M,eI,null));return I7.h(PI,null)},TF,function(){return Q.l(X,xg,new R(null,2,5,S,[FF,ev],null),null)},Kr,"Failed to delete version"])):null});var c2=new CSSStyleSheet;c2.replaceSync("/* Dataset Modal Styles */\n\n.dataset-modal-backdrop {\n position: absolute;\n inset: 0;\n background: var(--modeling-modal-backdrop);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: 80px;\n z-index: 1200;\n}\n\n.dataset-modal {\n background: var(--modeling-overlay-bg);\n border: none;\n border-radius: 8px;\n width: 100%;\n max-width: 500px;\n max-height: calc(100% - 160px);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n box-shadow: var(--modeling-shadow-xl);\n}\n\n/* Search bar */\n.dataset-modal-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.dataset-modal-search .sy-icon {\n color: var(--sy-text-mm);\n}\n\n.dataset-modal-search input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 14px;\n background: transparent;\n color: var(--sy-text-p);\n}\n\n.dataset-modal-search input::placeholder {\n color: var(--sy-text-mm);\n}\n\n/* Content wrapper - fixed height container */\n.dataset-modal-content {\n flex: 0 0 350px;\n overflow-y: auto;\n}\n\n/* Dataset list */\n.dataset-item {\n display: flex;\n align-items: center;\n padding: 12px 16px;\n cursor: pointer;\n border-bottom: 1px solid var(--modeling-overlay-border);\n transition: background 0.15s ease;\n}\n\n.dataset-item:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n/* Keyboard cursor (arrow keys / Enter from the search field). Distinct from\n :hover by the accent rail so a mouse resting on the list can't be mistaken\n for the row Enter would open. */\n.dataset-item.highlighted {\n background: var(--modeling-overlay-bg-hover);\n box-shadow: inset 2px 0 0 var(--sy-accent);\n}\n\n.dataset-item.highlighted .dataset-item-name {\n color: var(--sy-accent);\n}\n\n.dataset-item:last-child {\n border-bottom: none;\n}\n\n.dataset-item-info {\n flex: 1;\n min-width: 0;\n}\n\n.dataset-item-actions {\n display: flex;\n align-items: center;\n gap: 2px;\n flex-shrink: 0;\n}\n\n.dataset-delete-btn,\n.dataset-access-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: var(--sy-text-mm);\n opacity: 0;\n transition:\n opacity 0.15s,\n color 0.15s;\n flex-shrink: 0;\n}\n\n.dataset-item:hover .dataset-delete-btn,\n.dataset-item:hover .dataset-access-btn {\n opacity: 0.5;\n}\n\n.dataset-delete-btn:hover {\n opacity: 1 !important;\n color: var(--modeling-removed-text);\n}\n\n.dataset-access-btn:hover {\n opacity: 1 !important;\n color: var(--sy-text-p);\n}\n\n.dataset-delete-confirm {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n/* Destructive action — confirm Delete. --modeling-danger-* is its own\n token pair, not the removed-stroke/button-text tokens: those are tuned\n for diff tints and an accent-matched label, both of which washed this\n button out in dark mode. */\n.dataset-delete-confirm .confirm-yes {\n padding: 4px 12px;\n border-radius: 4px;\n border: none;\n background: var(--modeling-danger-bg);\n color: var(--modeling-danger-text);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: background .15s, transform .05s;\n}\n.dataset-delete-confirm .confirm-yes:hover {\n background: var(--modeling-danger-bg-hover);\n}\n.dataset-delete-confirm .confirm-yes:active {\n transform: translateY(1px);\n}\n.dataset-delete-confirm .confirm-yes:disabled {\n background: var(--modeling-removed-stroke, #fadada);\n cursor: not-allowed;\n opacity: .6;\n}\n\n.dataset-delete-confirm .confirm-no {\n padding: 4px 12px;\n border-radius: 4px;\n border: 1px solid var(--modeling-overlay-border);\n background: transparent;\n color: var(--sy-text);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n}\n\n.dataset-item-name {\n font-weight: 500;\n font-size: 14px;\n color: var(--sy-text-p);\n margin-bottom: 4px;\n}\n\n.dataset-item-meta {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: var(--sy-text-m);\n}\n\n.dataset-item-meta span {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n/* Empty state */\n.dataset-modal-empty {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n color: var(--sy-text-m);\n}\n\n/* Footer */\n.dataset-modal-footer {\n border-top: 1px solid var(--modeling-overlay-border);\n}\n\n/* Primary-action pattern (shared with versions Save + deploy): accent bg,\n hover shifts to accent-hover (brighter in dark / deeper in light) —\n never opacity tricks, they turn near-white buttons muddy on dark. */\n.dataset-modal-footer button {\n width: 100%;\n padding: 14px 16px;\n border: none;\n background: var(--sy-accent);\n color: var(--modeling-button-text);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.dataset-modal-footer button:hover {\n background: var(--sy-accent-hover);\n}\n\n.dataset-modal-footer button:disabled {\n background: var(--sy-accent-tint);\n color: var(--sy-text-m);\n cursor: not-allowed;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Access view (owners + access groups)\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n.dataset-access-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.dataset-access-close {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n margin-left: auto;\n border-radius: 4px;\n color: var(--sy-text-m);\n transition: background 0.15s, color 0.15s;\n}\n\n.dataset-access-close:hover {\n background: var(--modeling-hover-overlay);\n color: var(--sy-text-p);\n}\n\n.dataset-access-title {\n display: flex;\n align-items: baseline;\n gap: 8px;\n min-width: 0;\n}\n\n.dataset-access-title-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--sy-text-m);\n}\n\n.dataset-access-title-name {\n font-size: 14px;\n font-weight: 500;\n color: var(--sy-text-p);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Owners / Access groups tabs — same idiom as the import popover */\n.dataset-access-tabs {\n display: flex;\n gap: 4px;\n padding: 10px 16px 0;\n}\n\n/* Fixed height — the count badge is taller than the label, so letting the\n tab size to its content made it grow the moment a binding appeared. */\n.dataset-access-tab {\n flex: 1;\n height: 36px;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 0 10px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--sy-text-m);\n font-size: 12px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.dataset-access-tab .sy-icon {\n color: currentColor;\n}\n\n.dataset-access-tab:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.dataset-access-tab.active {\n background: var(--sy-accent);\n color: var(--modeling-button-text);\n}\n\n/* Bound-count badge — reads at a glance which tab actually has bindings */\n.dataset-access-count {\n min-width: 17px;\n padding: 0 5px;\n border-radius: 9px;\n background: var(--sy-accent-tint);\n color: var(--sy-text-p);\n font-size: 10px;\n font-weight: 700;\n line-height: 17px;\n text-align: center;\n}\n\n.dataset-access-tab.active .dataset-access-count {\n background: var(--modeling-hover-overlay-strong);\n color: var(--modeling-button-text);\n}\n\n/* Zero count keeps its box (no reflow), just goes invisible. */\n.dataset-access-count.empty {\n visibility: hidden;\n}\n\n/* box-sizing so the border/padding stay inside the 100% width — without it\n the input overflowed its container and the right edge clipped. */\n.dataset-access-search-wrap {\n padding: 12px 16px 8px;\n}\n\n.dataset-access-search-wrap input {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 10px;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n background: transparent;\n color: var(--sy-text-p);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n}\n\n.dataset-access-search-wrap input::placeholder {\n color: var(--sy-text-mm);\n}\n\n.dataset-access-search-wrap input:focus {\n border-color: var(--sy-accent);\n}\n\n.dataset-access-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 16px;\n cursor: pointer;\n color: var(--sy-text);\n transition: background 0.15s;\n}\n\n.dataset-access-row:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.dataset-access-row .sy-icon {\n color: var(--sy-text-mm);\n flex-shrink: 0;\n}\n\n.dataset-access-row.selected {\n color: var(--sy-text-p);\n}\n\n.dataset-access-row.selected .sy-icon {\n color: var(--sy-text-p);\n}\n\n.dataset-access-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 4px;\n flex-shrink: 0;\n color: var(--modeling-button-text);\n}\n\n.dataset-access-row.selected .dataset-access-check {\n background: var(--sy-accent);\n border-color: var(--sy-accent);\n}\n\n.dataset-access-row.selected .dataset-access-check .sy-icon {\n color: var(--modeling-button-text);\n}\n\n.dataset-access-label {\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.dataset-access-empty {\n padding: 4px 16px 12px;\n font-size: 12px;\n color: var(--sy-text-mm);\n}\n\n/* Unbound dataset warning — sits above the save button in the footer.\n Fixed height and faded (not removed) when irrelevant, so toggling the\n last binding never resizes the modal. */\n.dataset-access-warning {\n display: flex;\n align-items: center;\n gap: 6px;\n height: 32px;\n box-sizing: border-box;\n padding: 0 16px;\n font-size: 11.5px;\n color: var(--sy-warn);\n background: var(--sy-warn-tint);\n transition: opacity 0.15s ease;\n}\n\n.dataset-access-warning.hidden {\n opacity: 0;\n pointer-events: none;\n}\n");
|
|
3311
|
+
I7.B(null,VJ,function(){var a=Bh(q(X),new R(null,2,5,S,[FF,ev],null)),b=eI.g(q(X)),c=z.h(a,mV(b));return l(a)?tAa(a,I([Qx,function(){Q.l(X,xg,new R(null,2,5,S,[FF,ev],null),null);c&&(Q.l(X,M,JM,null),Q.l(X,M,eI,null));return I7.h(PI,null)},TF,function(){return Q.l(X,xg,new R(null,2,5,S,[FF,ev],null),null)},Kr,"Failed to delete version"])):null});var w2=new CSSStyleSheet;w2.replaceSync("/* Dataset Modal Styles */\n\n.dataset-modal-backdrop {\n position: absolute;\n inset: 0;\n background: var(--modeling-modal-backdrop);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: 80px;\n z-index: 1200;\n}\n\n.dataset-modal {\n background: var(--modeling-overlay-bg);\n border: none;\n border-radius: 8px;\n width: 100%;\n max-width: 500px;\n max-height: calc(100% - 160px);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n box-shadow: var(--modeling-shadow-xl);\n}\n\n/* Search bar */\n.dataset-modal-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.dataset-modal-search .sy-icon {\n color: var(--sy-text-mm);\n}\n\n.dataset-modal-search input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 14px;\n background: transparent;\n color: var(--sy-text-p);\n}\n\n.dataset-modal-search input::placeholder {\n color: var(--sy-text-mm);\n}\n\n/* Content wrapper - fixed height container */\n.dataset-modal-content {\n flex: 0 0 350px;\n overflow-y: auto;\n}\n\n/* Dataset list */\n.dataset-item {\n display: flex;\n align-items: center;\n padding: 12px 16px;\n cursor: pointer;\n border-bottom: 1px solid var(--modeling-overlay-border);\n transition: background 0.15s ease;\n}\n\n.dataset-item:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n/* Keyboard cursor (arrow keys / Enter from the search field). Distinct from\n :hover by the accent rail so a mouse resting on the list can't be mistaken\n for the row Enter would open. */\n.dataset-item.highlighted {\n background: var(--modeling-overlay-bg-hover);\n box-shadow: inset 2px 0 0 var(--sy-accent);\n}\n\n.dataset-item.highlighted .dataset-item-name {\n color: var(--sy-accent);\n}\n\n.dataset-item:last-child {\n border-bottom: none;\n}\n\n.dataset-item-info {\n flex: 1;\n min-width: 0;\n}\n\n.dataset-item-actions {\n display: flex;\n align-items: center;\n gap: 2px;\n flex-shrink: 0;\n}\n\n.dataset-delete-btn,\n.dataset-access-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: var(--sy-text-mm);\n opacity: 0;\n transition:\n opacity 0.15s,\n color 0.15s;\n flex-shrink: 0;\n}\n\n.dataset-item:hover .dataset-delete-btn,\n.dataset-item:hover .dataset-access-btn {\n opacity: 0.5;\n}\n\n.dataset-delete-btn:hover {\n opacity: 1 !important;\n color: var(--modeling-removed-text);\n}\n\n.dataset-access-btn:hover {\n opacity: 1 !important;\n color: var(--sy-text-p);\n}\n\n.dataset-delete-confirm {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n/* Destructive action — confirm Delete. --modeling-danger-* is its own\n token pair, not the removed-stroke/button-text tokens: those are tuned\n for diff tints and an accent-matched label, both of which washed this\n button out in dark mode. */\n.dataset-delete-confirm .confirm-yes {\n padding: 4px 12px;\n border-radius: 4px;\n border: none;\n background: var(--modeling-danger-bg);\n color: var(--modeling-danger-text);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: background .15s, transform .05s;\n}\n.dataset-delete-confirm .confirm-yes:hover {\n background: var(--modeling-danger-bg-hover);\n}\n.dataset-delete-confirm .confirm-yes:active {\n transform: translateY(1px);\n}\n.dataset-delete-confirm .confirm-yes:disabled {\n background: var(--modeling-removed-stroke, #fadada);\n cursor: not-allowed;\n opacity: .6;\n}\n\n.dataset-delete-confirm .confirm-no {\n padding: 4px 12px;\n border-radius: 4px;\n border: 1px solid var(--modeling-overlay-border);\n background: transparent;\n color: var(--sy-text);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n}\n\n.dataset-item-name {\n font-weight: 500;\n font-size: 14px;\n color: var(--sy-text-p);\n margin-bottom: 4px;\n}\n\n.dataset-item-meta {\n display: flex;\n gap: 16px;\n font-size: 12px;\n color: var(--sy-text-m);\n}\n\n.dataset-item-meta span {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n/* Empty state */\n.dataset-modal-empty {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n color: var(--sy-text-m);\n}\n\n/* Footer */\n.dataset-modal-footer {\n border-top: 1px solid var(--modeling-overlay-border);\n}\n\n/* Primary-action pattern (shared with versions Save + deploy): accent bg,\n hover shifts to accent-hover (brighter in dark / deeper in light) —\n never opacity tricks, they turn near-white buttons muddy on dark. */\n.dataset-modal-footer button {\n width: 100%;\n padding: 14px 16px;\n border: none;\n background: var(--sy-accent);\n color: var(--modeling-button-text);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.dataset-modal-footer button:hover {\n background: var(--sy-accent-hover);\n}\n\n.dataset-modal-footer button:disabled {\n background: var(--sy-accent-tint);\n color: var(--sy-text-m);\n cursor: not-allowed;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Access view (owners + access groups)\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n.dataset-access-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.dataset-access-close {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n margin-left: auto;\n border-radius: 4px;\n color: var(--sy-text-m);\n transition: background 0.15s, color 0.15s;\n}\n\n.dataset-access-close:hover {\n background: var(--modeling-hover-overlay);\n color: var(--sy-text-p);\n}\n\n.dataset-access-title {\n display: flex;\n align-items: baseline;\n gap: 8px;\n min-width: 0;\n}\n\n.dataset-access-title-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--sy-text-m);\n}\n\n.dataset-access-title-name {\n font-size: 14px;\n font-weight: 500;\n color: var(--sy-text-p);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Owners / Access groups tabs — same idiom as the import popover */\n.dataset-access-tabs {\n display: flex;\n gap: 4px;\n padding: 10px 16px 0;\n}\n\n/* Fixed height — the count badge is taller than the label, so letting the\n tab size to its content made it grow the moment a binding appeared. */\n.dataset-access-tab {\n flex: 1;\n height: 36px;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 0 10px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--sy-text-m);\n font-size: 12px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.dataset-access-tab .sy-icon {\n color: currentColor;\n}\n\n.dataset-access-tab:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.dataset-access-tab.active {\n background: var(--sy-accent);\n color: var(--modeling-button-text);\n}\n\n/* Bound-count badge — reads at a glance which tab actually has bindings */\n.dataset-access-count {\n min-width: 17px;\n padding: 0 5px;\n border-radius: 9px;\n background: var(--sy-accent-tint);\n color: var(--sy-text-p);\n font-size: 10px;\n font-weight: 700;\n line-height: 17px;\n text-align: center;\n}\n\n.dataset-access-tab.active .dataset-access-count {\n background: var(--modeling-hover-overlay-strong);\n color: var(--modeling-button-text);\n}\n\n/* Zero count keeps its box (no reflow), just goes invisible. */\n.dataset-access-count.empty {\n visibility: hidden;\n}\n\n/* box-sizing so the border/padding stay inside the 100% width — without it\n the input overflowed its container and the right edge clipped. */\n.dataset-access-search-wrap {\n padding: 12px 16px 8px;\n}\n\n.dataset-access-search-wrap input {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 10px;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n background: transparent;\n color: var(--sy-text-p);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n}\n\n.dataset-access-search-wrap input::placeholder {\n color: var(--sy-text-mm);\n}\n\n.dataset-access-search-wrap input:focus {\n border-color: var(--sy-accent);\n}\n\n.dataset-access-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 16px;\n cursor: pointer;\n color: var(--sy-text);\n transition: background 0.15s;\n}\n\n.dataset-access-row:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.dataset-access-row .sy-icon {\n color: var(--sy-text-mm);\n flex-shrink: 0;\n}\n\n.dataset-access-row.selected {\n color: var(--sy-text-p);\n}\n\n.dataset-access-row.selected .sy-icon {\n color: var(--sy-text-p);\n}\n\n.dataset-access-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 4px;\n flex-shrink: 0;\n color: var(--modeling-button-text);\n}\n\n.dataset-access-row.selected .dataset-access-check {\n background: var(--sy-accent);\n border-color: var(--sy-accent);\n}\n\n.dataset-access-row.selected .dataset-access-check .sy-icon {\n color: var(--modeling-button-text);\n}\n\n.dataset-access-label {\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.dataset-access-empty {\n padding: 4px 16px 12px;\n font-size: 12px;\n color: var(--sy-text-mm);\n}\n\n/* Unbound dataset warning — sits above the save button in the footer.\n Fixed height and faded (not removed) when irrelevant, so toggling the\n last binding never resizes the modal. */\n.dataset-access-warning {\n display: flex;\n align-items: center;\n gap: 6px;\n height: 32px;\n box-sizing: border-box;\n padding: 0 16px;\n font-size: 11.5px;\n color: var(--sy-warn);\n background: var(--sy-warn-tint);\n transition: opacity 0.15s ease;\n}\n\n.dataset-access-warning.hidden {\n opacity: 0;\n pointer-events: none;\n}\n");
|
|
3312
3312
|
H7.B(null,OG,function(){return Ch(q(X),new R(null,2,5,S,[NI,Ul],null),!1)});H7.B(null,uE,function(){return Ch(q(X),new R(null,2,5,S,[NI,DB],null),He)});H7.B(null,MD,function(){return Ch(q(X),new R(null,2,5,S,[NI,ir],null),"")});H7.B(null,Al,function(){return Ch(q(X),new R(null,2,5,S,[NI,DD],null),!1)});H7.B(null,yt,function(){return Ch(q(X),new R(null,2,5,S,[NI,$G],null),0)});var Q8=$g(null);function R8(){var a=q(Q8);l(a)&&(clearTimeout(a),ah(Q8,null))}
|
|
3313
3313
|
I7.B(null,sC,function(){Q.l(X,M,gH,null);Q.l(X,Le,lC,YP);l(mJ.g(q(X)))&&I7.h(PF,null);R8();Q.l(X,xg,new R(null,2,5,S,[NI,Ul],null),!0);Q.l(X,xg,new R(null,2,5,S,[NI,DD],null),!0);Q.l(X,xg,new R(null,2,5,S,[NI,ir],null),"");Q.l(X,xg,new R(null,2,5,S,[NI,$G],null),0);return O7(I([Qx,function(a){Q.l(X,xg,new R(null,2,5,S,[NI,DB],null),a);Q.l(X,xg,new R(null,2,5,S,[NI,$G],null),0);return Q.l(X,xg,new R(null,2,5,S,[NI,DD],null),!1)},TF,function(){return Q.l(X,xg,new R(null,2,5,S,[NI,DD],null),!1)},Kr,
|
|
3314
3314
|
"Failed to load datasets"]))});I7.B(null,ho,function(){R8();return Q.l(X,xg,new R(null,2,5,S,[NI,Ul],null),!1)});
|
|
@@ -3366,7 +3366,7 @@ function l9(a){Q.h(X,function(b){return Gh.j(Gh.j(b,Yp,a),JM,a)});return k9()}I7
|
|
|
3366
3366
|
I7.B(null,hM,function(a,b){a=N(b);a=v(a,ep);b=eE.g(q(X));var c=l(b)?KV(b,a):null;return l(c)?l9(function(d){return OV(d,c)}):null});
|
|
3367
3367
|
I7.B(null,FG,function(a,b){a=N(b);var c=v(a,yn),d=v(a,WB),e=v(a,dA);a=eE.g(q(X));a=l(a)?CV(a,c):null;var f=l(a)?BV(a,d):null;return l9(function(h){return HV(h,c,function(m){return Gh.j(m,gN,function(n){switch(e instanceof x?e.H:null){case "added":return fi(th(function(r){return z.h(mV(r),d)},n));case "removed":return l(Pg(function(r){return z.h(mV(r),d)},n))?xh(function(r){return z.h(mV(r),d)?M.j(r,BF,!0):r},n):l(f)?Ge.h(fi(n),f):n;case "modified":return l(f)?xh(function(r){return z.h(mV(r),d)?f:
|
|
3368
3368
|
r},n):n;default:return n}})})})});I7.B(null,uG,function(a,b){a=N(b);var c=v(a,yn),d=v(a,tM);a=function(){var f=eE.g(q(X));return null==f?null:CV(f,c)}();var e=Bh(a,new R(null,2,5,S,[WH,d],null));return l9(function(f){return HV(f,c,function(h){return null!=e?xg(h,new R(null,2,5,S,[WH,d],null),e):Gh.l(h,WH,Le,d)})})});
|
|
3369
|
-
I7.B(null,By,function(){var a=Yp.g(q(X)),b=eI.g(q(X));return l(l(a)?l(b)?mb(Mr.g(q(X))):b:a)?(Q.l(X,M,Mr,!0),RW(),b=Gh.j(M.j(b,JM,a),JM,PW),N7(new k(null,3,[dv,"deploy",TB,"Dataset Version",rB,b],null),I([Qx,function(){Q.l(X,M,JM,a);Q.l(X,xg,new R(null,2,5,S,[eI,xE],null),!0);I7.h(PF,null);Q.l(X,M,Mr,!1);I7.h(PI,null);e9();f9();return I8("Deployed successfully")},TF,function(){return Q.l(X,M,Mr,!1)},Kr,"Deploy failed"]))):null});function fBa(){try{var a=sessionStorage.getItem("synthigy.modeling.erd");if(l(a)){var b=Wk(JSON.parse(a),I([Xk,!0])),c=Ft.g(b);if(l(c)){var d=N(c),e=v(d,dA),f=v(d,lk);l(l(e)?f:e)&&Q.l(X,M,Ft,new k(null,2,[dA,Uf.g(e),lk,f],null))}var h=lC.g(b);l(h)&&Q.l(X,M,lC,h);var m=YP.g(b);l(m)&&Q.l(X,M,YP,Uf.g(m));var n=ds.g(b);l(n)&&Q.l(X,M,ds,n);var r=$t.g(b);l(r)&&Q.l(X,M,$t,Uf.g(r))}}catch(t){console.warn("[erd-session] Failed to restore:",t)}}
|
|
3369
|
+
I7.B(null,By,function(){var a=Yp.g(q(X)),b=eI.g(q(X));return l(l(a)?l(b)?mb(Mr.g(q(X))):b:a)?(Q.l(X,M,Mr,!0),RW(),b=Gh.j(M.j(b,JM,a),JM,PW),N7(new k(null,3,[dv,"deploy",TB,"Dataset Version",rB,b],null),I([Qx,function(){Q.l(X,M,JM,a);Q.l(X,xg,new R(null,2,5,S,[eI,xE],null),!0);I7.h(PF,null);Q.l(X,M,Mr,!1);I7.h(PI,null);e9();f9();return I8("Deployed successfully")},TF,function(){return Q.l(X,M,Mr,!1)},Kr,"Deploy failed",sN,9E4]))):null});function fBa(){try{var a=sessionStorage.getItem("synthigy.modeling.erd");if(l(a)){var b=Wk(JSON.parse(a),I([Xk,!0])),c=Ft.g(b);if(l(c)){var d=N(c),e=v(d,dA),f=v(d,lk);l(l(e)?f:e)&&Q.l(X,M,Ft,new k(null,2,[dA,Uf.g(e),lk,f],null))}var h=lC.g(b);l(h)&&Q.l(X,M,lC,h);var m=YP.g(b);l(m)&&Q.l(X,M,YP,Uf.g(m));var n=ds.g(b);l(n)&&Q.l(X,M,ds,n);var r=$t.g(b);l(r)&&Q.l(X,M,$t,Uf.g(r))}}catch(t){console.warn("[erd-session] Failed to restore:",t)}}
|
|
3370
3370
|
function gBa(){Hk(X,cy,function(a,b,c,d){if(yg(Ft.g(c),Ft.g(d))||yg(lC.g(c),lC.g(d))||yg(YP.g(c),YP.g(d))||yg(ds.g(c),ds.g(d))||yg($t.g(c),$t.g(d))){a=q(X);b=N(a);var e=v(b,Ft);d=v(b,lC);c=v(b,YP);a=v(b,ds);b=v(b,$t);var f=ug;e=l(e)?M.j(f,Ft,new k(null,2,[dA,Vf(dA.g(e)),lk,lk.g(e)],null)):f;d=l(d)?M.j(e,lC,d):e;c=l(c)?M.j(d,YP,Vf(c)):d;a=l(a)?M.j(c,ds,a):c;a=l(b)?M.j(a,$t,Vf(b)):a;try{var h=sessionStorage.setItem("synthigy.modeling.erd",JSON.stringify(Sk(a)))}catch(m){h=console.warn("[erd-session] Failed to save:",
|
|
3371
3371
|
m)}}else h=null;return h})};H7.B(null,Bx,function(){return null!=ds.g(q(X))});H7.B(null,Xea,function(){return ds.g(q(X))});H7.B(null,XA,function(){var a=ds.g(q(X));return l(a)?KV(JM.g(q(X)),a):null});H7.B(null,qw,function(){var a=$t.g(q(X));return l(a)?a:fm});H7.B(null,nM,function(){return jL.g(q(X))});H7.B(null,bx,function(){return ef(ZE.g(q(X)))});H7.B(null,oz,function(){var a=ds.g(q(X));return l(a)?null!=KV(eE.g(q(X)),a):null});H7.B(null,Dq,function(){var a=nw.g(q(X));return l(a)?a:""});
|
|
3372
3372
|
I7.B(null,Iha,function(a,b){a=N(b);a=v(a,ep);if(l(mJ.g(q(X))))return null;K$.v?K$.v():K$.call(null);I7.h(xK,new k(null,1,[lk,a],null));Q.o(X,M,$t,fm,I([YP,null]));Q.o(X,Le,jL,ZE,I([nw]));return null!=KV(eE.g(q(X)),a)?L$.v?L$.v():L$.call(null):null});I7.B(null,k0,function(){K$.v?K$.v():K$.call(null);return Q.o(X,Le,ds,$t,I([jL,ZE,nw]))});I7.B(null,mu,function(a,b){a=N(b);a=v(a,EF);return Q.l(X,M,$t,a)});
|
|
@@ -3375,7 +3375,7 @@ var M$=$g(ug),N$=Ke([new R(null,2,5,S,[fm,Up],null),oJ,new R(null,2,5,S,[fm,wp],
|
|
|
3375
3375
|
function JCa(a){var b=Pg(function(d){return z.h(mV(d),a)?d:null},jL.g(q(X))),c=lV();return l(b)?Ke([c,v(b,c),AB,yH.g(b),yl,rH.g(b),JL,Ww.g(b),aG,oJ.g(b),nI,FJ.g(b),uw,Zp.g(b)]):null}function O$(a){a=JCa(a);return l(a)?U7(a,I([TF,function(b){return console.warn("[relation-drawer] Role access sync failed:",b)}])):null}function KCa(a){var b=v(q(M$),a);l(b)&&clearTimeout(b);b=setTimeout(function(){Q.j(M$,Le,a);return O$(a)},1600);return Q.l(M$,M,a,b)}
|
|
3376
3376
|
function K$(){var a=q(M$);ah(M$,ug);a=A(a);for(var b=null,c=0,d=0;;)if(d<c){var e=b.P(null,d),f=J(e,0,null);e=J(e,1,null);clearTimeout(e);O$(f);d+=1}else if(a=A(a))af(a)?(b=fd(a),a=gd(a),f=b,c=H(b),b=f):(b=B(a),f=J(b,0,null),e=J(b,1,null),clearTimeout(e),O$(f),a=F(a),b=null,c=0),d=0;else return null}
|
|
3377
3377
|
I7.B(null,nF,function(a,b){a=N(b);var c=v(a,Rz),d=v(a,Eq),e=v(a,dv),f=v(a,vu),h=ds.g(q(X)),m=function(){var n=new R(null,2,5,S,[d,e],null);return N$.g?N$.g(n):N$.call(null,n)}();return l(l(h)?m:h)?(Q.l(X,Gh,jL,function(n){return xh(function(r){return z.h(mV(r),c)?Gh.S(r,m,ICa,h,f):r},n)}),KCa(c)):null});function m9(a){return LDa(QH.g(q(X)),a)}H7.B(null,oba,function(){var a=qu.g(q(X));return l(a)?a:"light"});H7.B(null,AD,function(){return z.h("dark",qu.g(q(X)))});I7.B(null,VA,function(){var a=xDa(),b=QH.g(q(X));Q.l(X,M,qu,a);m9(a);return l(l(b)?mb(PL.g(q(X))):b)?Q.l(X,M,PL,lEa(b)):null});I7.B(null,GH,function(){var a=PL.g(q(X));return l(a)?(l(a)&&a.disconnect(),Q.j(X,Le,PL)):null});I7.B(null,iw,function(){var a=qu.g(q(X));a=z.h(l(a)?a:"light","dark")?"light":"dark";Q.l(X,M,qu,a);HDa(a);return m9(a)});
|
|
3378
|
-
I7.B(null,Sca,function(a,b){a=N(b);a=v(a,qu);a=z.h(a,"dark")?"dark":"light";Q.l(X,M,qu,a);HDa(a);return m9(a)});var u2=new CSSStyleSheet;u2.replaceSync('/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Synthigy Modeling Theme\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Modeling-specific CSS variables for ERD/Process diagrams.\n Separate from Ty - modeling has its own visual identity.\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n/* Brand lockup watermark (bottom-left) — figurative mark + verbal wordmark,\n each sized independently so the proportions are tunable (the split can\'t\n recover the old combined file\'s exact kerning). Width follows each SVG\'s\n own aspect ratio; fills are var(--logo-*), so it themes automatically. */\n.sy-brand-wordmark svg {\n height: auto;\n display: block;\n}\n.sy-brand-figurative svg {\n width: 38px;\n}\n.sy-brand-verbal svg {\n width: 78px;\n}\n\n/* Login overlay lockup — splash-sized */\n.sy-login-mark svg { width: 72px; height: auto; display: block; }\n.sy-login-verbal svg { width: 150px; height: auto; display: block; }\n\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Dark Mode\n - html.dark/html[data-theme\x3d"dark"] for document-level CSS\n - :host([data-theme\x3d"dark"]) for component self-theme (scoped, no page leak)\n - :host-context() for Shadow DOM components under a themed ancestor\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Entity Box (HTML via foreignObject)\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n.entity-box {\n display: inline-flex;\n flex-direction: column;\n min-width: 140px;\n background: var(--modeling-entity-fill);\n border: 1px solid var(--modeling-entity-stroke);\n border-radius: 3px;\n overflow: hidden;\n box-sizing: border-box;\n font-family: inherit;\n font-size: 12px;\n color: var(--modeling-entity-text);\n user-select: none;\n pointer-events: none;\n}\n\n.entity-box.selected,\n.entity-box.connected {\n border-color: var(--modeling-entity-selected-stroke);\n}\n\n/* Clones are position-overlays of originals — dashed border + muted text\n so they read as "same entity, different place" rather than a duplicate. */\n.entity-box.clone {\n border-style: dashed;\n}\n\n.entity-box.clone .entity-name,\n.entity-box.clone .attribute-name,\n.entity-box.clone .attribute-constraint,\n.entity-box.clone .attribute-type {\n color: var(--sy-text-m);\n}\n\n.entity-box.added {\n background: var(--modeling-added-fill);\n border-color: var(--modeling-added-stroke);\n}\n\n.entity-box.removed {\n background: var(--modeling-removed-fill);\n border-color: var(--modeling-removed-stroke);\n}\n\n.entity-box.modified {\n background: var(--modeling-modified-fill);\n border-color: var(--modeling-modified-stroke);\n}\n\n/* Entity Header */\n.entity-box .entity-header {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 38px;\n min-height: 38px;\n padding: 0 16px;\n background: var(--modeling-entity-header-fill);\n border-bottom: 1px solid var(--modeling-entity-stroke);\n}\n\n/* RLS/RBAC flags — normal flex flow next to the name (NOT absolutely\n positioned — that let long names run text under the icons with no gap\n and no truncation). The name+flags pair centers together; the name\n itself shrinks/ellipsizes before ever touching the flags. */\n.entity-flags {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: 8px;\n flex-shrink: 0;\n}\n.entity-flag {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border-radius: 4px;\n background: color-mix(in srgb, currentColor 14%, transparent);\n /* One colour for both badges — they carry the same kind of fact (an access\n control is configured). Deliberately NOT amber/red: those two are spoken\n for by the attribute constraint code (unique / natural key) in the box\n right below. */\n color: var(--sy-text-primary, #1f2937);\n}\n\n.entity-box.selected .entity-header {\n background: var(--modeling-entity-selected-header);\n}\n\n.entity-box.added .entity-header {\n background: var(--modeling-added-header);\n border-color: var(--modeling-added-stroke);\n}\n\n.entity-box.removed .entity-header {\n background: var(--modeling-removed-header);\n border-color: var(--modeling-removed-stroke);\n}\n\n.entity-box.modified .entity-header {\n background: var(--modeling-modified-header);\n border-color: var(--modeling-modified-stroke);\n}\n\n.entity-box .entity-name {\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.03em; /* space-tech: let the name breathe */\n color: var(--modeling-entity-text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n /* flex items don\'t shrink below content size by default — without this\n a long name ignores the ellipsis and runs straight under .entity-flags */\n min-width: 0;\n}\n\n.entity-box.added .entity-name {\n color: var(--modeling-added-text);\n}\n\n.entity-box.removed .entity-name {\n color: var(--modeling-removed-text);\n}\n\n.entity-box.modified .entity-name {\n color: var(--modeling-modified-text);\n}\n\n/* Entity Attributes */\n.entity-box .entity-attributes {\n flex: 1;\n padding: 9px 0;\n}\n\n.entity-attribute {\n display: grid;\n grid-template-columns: 16px 1fr auto;\n align-items: center;\n height: 24px;\n min-height: 24px;\n max-height: 24px;\n padding: 0 14px 0 6px;\n}\n\n.entity-attribute .attribute-constraint {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n font-weight: 600;\n color: var(--modeling-entity-text);\n}\n\n/* Constraint color code: blue \x3d natural key, amber \x3d unique,\n strong text \x3d mandatory, faint \x3d optional (nothing special). */\n.entity-attribute .attribute-constraint.natural-key {\n color: var(--sy-key);\n font-weight: 700;\n}\n.entity-attribute .attribute-constraint.unique {\n color: var(--sy-warn);\n font-weight: 700;\n}\n.entity-attribute .attribute-constraint.mandatory {\n color: var(--sy-text-pp);\n}\n.entity-attribute .attribute-constraint.optional {\n color: var(--sy-text-mm);\n font-weight: 400;\n}\n\n.entity-attribute .attribute-name {\n font-size: 11px;\n color: var(--modeling-entity-text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-left: 4px;\n}\n\n.entity-attribute .attribute-type {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: 36px;\n color: var(--modeling-entity-text);\n opacity: 0.65;\n}\n\n/* Projection states for attributes */\n.entity-box.added .entity-attribute .attribute-name,\n.entity-box.added .entity-attribute .attribute-constraint,\n.entity-box.added .entity-attribute .attribute-type {\n color: var(--modeling-added-text);\n}\n\n.entity-box.removed .entity-attribute .attribute-name,\n.entity-box.removed .entity-attribute .attribute-constraint,\n.entity-box.removed .entity-attribute .attribute-type {\n color: var(--modeling-removed-text);\n}\n\n.entity-box.modified .entity-attribute .attribute-name,\n.entity-box.modified .entity-attribute .attribute-constraint,\n.entity-box.modified .entity-attribute .attribute-type {\n color: var(--modeling-modified-text);\n}\n\n/* Per-attribute diff during a deploy preview: green \x3d added, red \x3d removed.\n Scoped under .entity-box so they match the specificity of the whole-box\n rules above and win on source order — a `modified` box must still be able\n to paint one attribute green and another red. */\n.entity-box .entity-attribute.added {\n background: var(--modeling-added-tint);\n}\n.entity-box .entity-attribute.added .attribute-name,\n.entity-box .entity-attribute.added .attribute-constraint,\n.entity-box .entity-attribute.added .attribute-type {\n color: var(--modeling-added-text);\n}\n\n.entity-box .entity-attribute.removed {\n background: var(--modeling-removed-tint-strong);\n}\n.entity-box .entity-attribute.removed .attribute-name,\n.entity-box .entity-attribute.removed .attribute-constraint,\n.entity-box .entity-attribute.removed .attribute-type {\n color: var(--modeling-removed-text);\n}\n.entity-box .entity-attribute.removed .attribute-name {\n text-decoration: line-through;\n}\n');H7.B(null,LG,function(){var a=uy.g(q(X));return l(a)?a:""});I7.B(null,Xz,function(a,b){a=N(b);a=v(a,sD);return Q.l(X,M,uy,a)});H7.B(null,lE,function(){var a=Fx.g(q(X));return l(a)?a:tF});I7.B(null,jE,function(a,b){a=N(b);a=v(a,Pq);return Q.l(X,M,Fx,a)});function hBa(){var a=eE.g(q(X));return l(a)?EV(a):null}function p9(){var a=JM.g(q(X));return l(a)?Uj(eh.h(sV,EV(a))):null}
|
|
3378
|
+
I7.B(null,Sca,function(a,b){a=N(b);a=v(a,qu);a=z.h(a,"dark")?"dark":"light";Q.l(X,M,qu,a);HDa(a);return m9(a)});var x2=new CSSStyleSheet;x2.replaceSync('/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Synthigy Modeling Theme\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Modeling-specific CSS variables for ERD/Process diagrams.\n Separate from Ty - modeling has its own visual identity.\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n/* Brand lockup watermark (bottom-left) — figurative mark + verbal wordmark,\n each sized independently so the proportions are tunable (the split can\'t\n recover the old combined file\'s exact kerning). Width follows each SVG\'s\n own aspect ratio; fills are var(--logo-*), so it themes automatically. */\n.sy-brand-wordmark svg {\n height: auto;\n display: block;\n}\n.sy-brand-figurative svg {\n width: 38px;\n}\n.sy-brand-verbal svg {\n width: 78px;\n}\n\n/* Login overlay lockup — splash-sized */\n.sy-login-mark svg { width: 72px; height: auto; display: block; }\n.sy-login-verbal svg { width: 150px; height: auto; display: block; }\n\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Dark Mode\n - html.dark/html[data-theme\x3d"dark"] for document-level CSS\n - :host([data-theme\x3d"dark"]) for component self-theme (scoped, no page leak)\n - :host-context() for Shadow DOM components under a themed ancestor\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Entity Box (HTML via foreignObject)\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n.entity-box {\n display: inline-flex;\n flex-direction: column;\n min-width: 140px;\n background: var(--modeling-entity-fill);\n border: 1px solid var(--modeling-entity-stroke);\n border-radius: 3px;\n overflow: hidden;\n box-sizing: border-box;\n font-family: inherit;\n font-size: 12px;\n color: var(--modeling-entity-text);\n user-select: none;\n pointer-events: none;\n}\n\n.entity-box.selected,\n.entity-box.connected {\n border-color: var(--modeling-entity-selected-stroke);\n}\n\n/* Clones are position-overlays of originals — dashed border + muted text\n so they read as "same entity, different place" rather than a duplicate. */\n.entity-box.clone {\n border-style: dashed;\n}\n\n.entity-box.clone .entity-name,\n.entity-box.clone .attribute-name,\n.entity-box.clone .attribute-constraint,\n.entity-box.clone .attribute-type {\n color: var(--sy-text-m);\n}\n\n.entity-box.added {\n background: var(--modeling-added-fill);\n border-color: var(--modeling-added-stroke);\n}\n\n.entity-box.removed {\n background: var(--modeling-removed-fill);\n border-color: var(--modeling-removed-stroke);\n}\n\n.entity-box.modified {\n background: var(--modeling-modified-fill);\n border-color: var(--modeling-modified-stroke);\n}\n\n/* Entity Header */\n.entity-box .entity-header {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 38px;\n min-height: 38px;\n padding: 0 16px;\n background: var(--modeling-entity-header-fill);\n border-bottom: 1px solid var(--modeling-entity-stroke);\n}\n\n/* RLS/RBAC flags — normal flex flow next to the name (NOT absolutely\n positioned — that let long names run text under the icons with no gap\n and no truncation). The name+flags pair centers together; the name\n itself shrinks/ellipsizes before ever touching the flags. */\n.entity-flags {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: 8px;\n flex-shrink: 0;\n}\n.entity-flag {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border-radius: 4px;\n background: color-mix(in srgb, currentColor 14%, transparent);\n /* One colour for both badges — they carry the same kind of fact (an access\n control is configured). Deliberately NOT amber/red: those two are spoken\n for by the attribute constraint code (unique / natural key) in the box\n right below. */\n color: var(--sy-text-primary, #1f2937);\n}\n\n.entity-box.selected .entity-header {\n background: var(--modeling-entity-selected-header);\n}\n\n.entity-box.added .entity-header {\n background: var(--modeling-added-header);\n border-color: var(--modeling-added-stroke);\n}\n\n.entity-box.removed .entity-header {\n background: var(--modeling-removed-header);\n border-color: var(--modeling-removed-stroke);\n}\n\n.entity-box.modified .entity-header {\n background: var(--modeling-modified-header);\n border-color: var(--modeling-modified-stroke);\n}\n\n.entity-box .entity-name {\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.03em; /* space-tech: let the name breathe */\n color: var(--modeling-entity-text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n /* flex items don\'t shrink below content size by default — without this\n a long name ignores the ellipsis and runs straight under .entity-flags */\n min-width: 0;\n}\n\n.entity-box.added .entity-name {\n color: var(--modeling-added-text);\n}\n\n.entity-box.removed .entity-name {\n color: var(--modeling-removed-text);\n}\n\n.entity-box.modified .entity-name {\n color: var(--modeling-modified-text);\n}\n\n/* Entity Attributes */\n.entity-box .entity-attributes {\n flex: 1;\n padding: 9px 0;\n}\n\n.entity-attribute {\n display: grid;\n grid-template-columns: 16px 1fr auto;\n align-items: center;\n height: 24px;\n min-height: 24px;\n max-height: 24px;\n padding: 0 14px 0 6px;\n}\n\n.entity-attribute .attribute-constraint {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n font-weight: 600;\n color: var(--modeling-entity-text);\n}\n\n/* Constraint color code: blue \x3d natural key, amber \x3d unique,\n strong text \x3d mandatory, faint \x3d optional (nothing special). */\n.entity-attribute .attribute-constraint.natural-key {\n color: var(--sy-key);\n font-weight: 700;\n}\n.entity-attribute .attribute-constraint.unique {\n color: var(--sy-warn);\n font-weight: 700;\n}\n.entity-attribute .attribute-constraint.mandatory {\n color: var(--sy-text-pp);\n}\n.entity-attribute .attribute-constraint.optional {\n color: var(--sy-text-mm);\n font-weight: 400;\n}\n\n.entity-attribute .attribute-name {\n font-size: 11px;\n color: var(--modeling-entity-text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-left: 4px;\n}\n\n.entity-attribute .attribute-type {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: 36px;\n color: var(--modeling-entity-text);\n opacity: 0.65;\n}\n\n/* Projection states for attributes */\n.entity-box.added .entity-attribute .attribute-name,\n.entity-box.added .entity-attribute .attribute-constraint,\n.entity-box.added .entity-attribute .attribute-type {\n color: var(--modeling-added-text);\n}\n\n.entity-box.removed .entity-attribute .attribute-name,\n.entity-box.removed .entity-attribute .attribute-constraint,\n.entity-box.removed .entity-attribute .attribute-type {\n color: var(--modeling-removed-text);\n}\n\n.entity-box.modified .entity-attribute .attribute-name,\n.entity-box.modified .entity-attribute .attribute-constraint,\n.entity-box.modified .entity-attribute .attribute-type {\n color: var(--modeling-modified-text);\n}\n\n/* Per-attribute diff during a deploy preview: green \x3d added, red \x3d removed.\n Scoped under .entity-box so they match the specificity of the whole-box\n rules above and win on source order — a `modified` box must still be able\n to paint one attribute green and another red. */\n.entity-box .entity-attribute.added {\n background: var(--modeling-added-tint);\n}\n.entity-box .entity-attribute.added .attribute-name,\n.entity-box .entity-attribute.added .attribute-constraint,\n.entity-box .entity-attribute.added .attribute-type {\n color: var(--modeling-added-text);\n}\n\n.entity-box .entity-attribute.removed {\n background: var(--modeling-removed-tint-strong);\n}\n.entity-box .entity-attribute.removed .attribute-name,\n.entity-box .entity-attribute.removed .attribute-constraint,\n.entity-box .entity-attribute.removed .attribute-type {\n color: var(--modeling-removed-text);\n}\n.entity-box .entity-attribute.removed .attribute-name {\n text-decoration: line-through;\n}\n');H7.B(null,LG,function(){var a=uy.g(q(X));return l(a)?a:""});I7.B(null,Xz,function(a,b){a=N(b);a=v(a,sD);return Q.l(X,M,uy,a)});H7.B(null,lE,function(){var a=Fx.g(q(X));return l(a)?a:tF});I7.B(null,jE,function(a,b){a=N(b);a=v(a,Pq);return Q.l(X,M,Fx,a)});function hBa(){var a=eE.g(q(X));return l(a)?EV(a):null}function p9(){var a=JM.g(q(X));return l(a)?Uj(eh.h(sV,EV(a))):null}
|
|
3379
3379
|
function iBa(a){i8();var b=oq.g(q(X)),c=CJ.g(b);b=J(c,0,null);c=J(c,1,null);var d=M.j(Gh.l(a,WH,Le,Km),RA,new k(null,2,[WL,b,VL,c],null));Q.l(X,Gh,JM,function(e){e=l(e)?e:gW(null);return FV(e,d)});I7.h(zu,new k(null,1,[lk,mV(d)],null));I7.h(Xz,new k(null,1,[sD,""],null));return I7.h(aD,null)}function jBa(){var a=eE.g(q(X));return l(a)?LV(a):null}function kBa(){var a=JM.g(q(X));return l(a)?Uj(eh.h(sV,LV(a))):null}
|
|
3380
3380
|
function lBa(){var a=p9(),b=kBa();return qf(function(c){return new R(null,2,5,S,[function(){var d=U.g(fm.g(c));return l(d)?d:""}(),function(){var d=U.g(vy.g(c));return l(d)?d:""}()],null)},sh(function(c){return!jf(b,mV(c))&&jf(a,mV(fm.g(c)))&&jf(a,mV(vy.g(c)))},jBa()))}
|
|
3381
3381
|
function mBa(a){i8();var b=mV(a),c=M.o(a,fm,mV(fm.g(a)),I([vy,mV(vy.g(a)),wJ,null]));Q.l(X,Gh,JM,function(d){return xg(l(d)?d:gW(null),new R(null,2,5,S,[tB,b],null),c)});I7.h(xK,new k(null,1,[lk,b],null));I7.h(Xz,new k(null,1,[sD,""],null));return I7.h(aD,null)}
|
|
@@ -3402,13 +3402,13 @@ h?"Nothing to save":l(t)?["Version '",p.g(n),"' is deployed — change the name
|
|
|
3402
3402
|
I7.h(MH,new k(null,1,[MO,1],null));case "ArrowUp":return w.preventDefault(),I7.h(MH,new k(null,1,[MO,-1],null));case "Enter":return w.preventDefault(),I7.h(l0,null);default:return null}}],null)],null),new R(null,3,5,S,[Bla,new R(null,2,5,S,[Ria,"Edit"],null),new R(null,2,5,S,[Dea,r],null)],null),new R(null,1,5,S,[qH],null),new R(null,3,5,S,[jla,new R(null,3,5,S,[RK,new R(null,2,5,S,[QG,"Dataset"],null),new R(null,2,5,S,[dt,new k(null,4,[dA,"text",Sz,"Dataset name",sD,m,Lu,new k(null,2,[dt,function(w){return I7.h(Uq,
|
|
3403
3403
|
new k(null,1,[sD,w.target.value],null))},cA,a],null)],null)],null)],null),new R(null,3,5,S,[RK,new R(null,2,5,S,[QG,"Version"],null),new R(null,2,5,S,[dt,new k(null,4,[dA,"text",Sz,"Version name",sD,n,Lu,new k(null,2,[dt,function(w){return I7.h(Vw,new k(null,1,[sD,w.target.value],null))},cA,a],null)],null)],null)],null)],null),new R(null,4,5,S,[Pfa,new R(null,4,5,S,[Kja,new k(null,3,[pG,u,nC,t,Lu,new k(null,1,[Iu,function(){return I7.h(GE,null)}],null)],null),X7(new k(null,3,[U,l(c)?"loader-2":"save",
|
|
3404
3404
|
QB,"14",RF,c],null)),l(c)?"Saving...":"Save"],null),new R(null,4,5,S,[Dga,new k(null,2,[pG,h,Lu,new k(null,1,[Iu,rBa],null)],null),X7(new k(null,2,[U,"download",QB,"14"],null)),"Export"],null),new R(null,4,5,S,[Vfa,X7(new k(null,2,[U,"upload",QB,"14"],null)),"Import",new R(null,2,5,S,[ro,new k(null,3,[dA,"file",En,".json",Lu,new k(null,1,[Eu,tBa],null)],null)],null)],null)],null),new R(null,1,5,S,[qH],null),new R(null,2,5,S,[xba,"Versions"],null),uBa(new k(null,7,[FF,e,DD,d,Wx,c,iA,mV(b),ev,f,qD,
|
|
3405
|
-
lV(),$G,H7.g(WN)],null))],null)};var v2=new CSSStyleSheet;v2.replaceSync('/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Action Bar - Bottom-center floating toolbar\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Excalidraw/Figma-style floating action bar with popover support.\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n/* Action Bar Container - positions everything */\n.action-bar-container {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n}\n\n/* Floating Action Bar */\n.action-bar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 8px;\n background: var(--modeling-overlay-bg);\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 12px;\n box-shadow: var(--modeling-shadow-popover);\n}\n\n.action-group {\n display: flex;\n gap: 2px;\n}\n\n.action-divider {\n width: 1px;\n height: 24px;\n background: var(--modeling-overlay-border);\n margin: 0 6px;\n}\n\n/* Action Button */\n.action-btn {\n position: relative;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: var(--modeling-overlay-text);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.action-btn[data-tooltip]::before {\n content: attr(data-tooltip);\n position: absolute;\n bottom: calc(100% + 7px);\n left: 50%;\n transform: translateX(-50%);\n background: rgba(18, 20, 28, 0.92);\n color: rgba(255, 255, 255, 0.95);\n padding: 5px 10px;\n border-radius: 5px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n pointer-events: none;\n letter-spacing: 0.01em;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.12s ease, visibility 0.12s ease;\n z-index: 100;\n}\n\n.action-btn[data-tooltip]:hover::before {\n opacity: 1;\n visibility: visible;\n}\n\n/* Key-hint bubble — only while ⌘/Ctrl is held (.hints on the bar). The\n modifier is in the user\'s hand, so the bubble carries just the second key. */\n.action-bar.hints .action-btn[data-hint]::after {\n content: attr(data-hint);\n position: absolute;\n top: -5px;\n right: -5px;\n min-width: 9px;\n padding: 1px 4px;\n border-radius: 5px;\n background: var(--sy-accent);\n color: var(--modeling-overlay-bg);\n font-family: \'JetBrains Mono\', \'Fira Code\', monospace;\n font-size: 9px;\n font-weight: 700;\n line-height: 1.45;\n text-align: center;\n pointer-events: none;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n animation: sy-hint-pop 0.12s ease-out;\n}\n\n/* The tooltip would otherwise cover the bubbles of every neighbouring\n button the moment the pointer rests anywhere on the bar. */\n.action-bar.hints .action-btn[data-tooltip]:hover::before {\n opacity: 0;\n visibility: hidden;\n}\n\n@keyframes sy-hint-pop {\n from {\n opacity: 0;\n transform: scale(0.7);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n.action-btn:hover:not(.disabled) {\n background: var(--modeling-hover-overlay);\n color: var(--modeling-entity-text);\n}\n\n.action-btn:focus-visible {\n outline: none;\n}\n\n.action-btn.selected {\n background: var(--modeling-entity-selected-header);\n color: var(--sy-accent);\n}\n\n.action-btn.disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.action-btn.positive {\n color: var(--modeling-added-text);\n}\n\n.action-btn.positive:hover:not(.disabled) {\n background: var(--modeling-added-tint);\n}\n\n/* Popover - opens above action bar. */\n.action-popover {\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-bottom: 8px;\n width: 320px;\n background: var(--modeling-overlay-bg);\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 12px;\n box-shadow: var(--modeling-shadow-2xl);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: sy-fade-up-centered 0.15s ease-out;\n}\n\n.popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.popover-title {\n font-weight: 600;\n font-size: 13px;\n text-transform: capitalize;\n color: var(--modeling-overlay-text);\n}\n\n.popover-close {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--modeling-overlay-text);\n cursor: pointer;\n}\n\n.popover-close:hover {\n background: var(--modeling-hover-overlay);\n}\n\n.popover-body {\n flex: 1;\n overflow: visible;\n color: var(--modeling-overlay-text);\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Versions Popover\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n.versions-content {\n display: flex;\n flex-direction: column;\n}\n\n.versions-header {\n padding: 16px 16px 12px;\n}\n\n/* While saving: dim + block pointer events on inputs and secondary actions\n so the user can\'t edit mid-save or trigger export/import. The versions list\n gets its own scrim overlay (.versions-list-overlay) rather than being\n dimmed, so the list stays readable underneath. */\n.versions-content.is-saving .versions-form,\n.versions-content.is-saving .versions-actions .versions-action-btn:not(.primary),\n.versions-content.is-saving .versions-empty {\n pointer-events: none;\n opacity: 0.5;\n}\n\n.versions-header-label {\n display: block;\n text-transform: uppercase;\n font-weight: 600;\n font-size: 10px;\n letter-spacing: 0.5px;\n color: var(--modeling-overlay-text);\n opacity: 0.6;\n margin-bottom: 6px;\n}\n\n.versions-header-title {\n display: block;\n font-weight: 600;\n font-size: 15px;\n line-height: 22px;\n /* Pin height: 1 line @22px, prevents wrap from bumping popover height during save */\n height: 22px;\n color: var(--modeling-entity-text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.versions-form {\n padding: 8px 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.versions-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.versions-field-label {\n display: block;\n text-transform: uppercase;\n font-weight: 600;\n font-size: 10px;\n letter-spacing: 0.5px;\n color: var(--modeling-overlay-text);\n opacity: 0.6;\n}\n\n.versions-field input[type\x3d"text"] {\n display: block;\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n font-size: 13px;\n font-family: inherit;\n background: transparent;\n color: var(--modeling-entity-text);\n outline: none;\n transition:\n border-color 0.15s ease,\n box-shadow 0.15s ease;\n box-sizing: border-box;\n}\n\n.versions-field input[type\x3d"text"]:focus {\n border-color: var(--sy-accent);\n box-shadow: 0 0 0 3px var(--modeling-entity-selected-tint);\n}\n\n.versions-field input[type\x3d"text"]::placeholder {\n color: var(--modeling-overlay-text);\n opacity: 0.5;\n}\n\n.versions-actions {\n display: flex;\n gap: 8px;\n padding: 0 16px 16px;\n}\n\n.versions-action-btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 12px;\n /* Pin height so icon/text swap (save ↔ loader-2, "Save" ↔ "Saving...") can\'t cause row to shift */\n height: 38px;\n min-height: 38px;\n max-height: 38px;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n font-family: inherit;\n background: transparent;\n color: var(--modeling-entity-text);\n cursor: pointer;\n transition:\n background 0.15s ease,\n border-color 0.15s ease,\n color 0.15s ease;\n box-sizing: border-box;\n position: relative;\n /* Keep label on one line even when it grows ("Save" → "Saving...") */\n white-space: nowrap;\n}\n\n.versions-action-btn \x3e .sy-icon {\n flex-shrink: 0;\n}\n\n.versions-action-btn:hover:not(:disabled) {\n background: var(--modeling-overlay-bg-hover);\n border-color: var(--modeling-press-overlay);\n}\n\n.versions-action-btn:active:not(:disabled) {\n transform: scale(0.98);\n}\n\n.versions-action-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.versions-action-btn.primary {\n background: var(--sy-accent);\n border-color: var(--sy-accent);\n color: var(--modeling-button-text);\n}\n\n.versions-action-btn.primary:hover:not(:disabled) {\n background: var(--sy-accent-hover);\n border-color: var(--sy-accent-hover);\n}\n\n/* Disabled primary: tinted ghost, not a faded white blob */\n.versions-action-btn.primary:disabled {\n opacity: 1;\n background: var(--sy-accent-tint);\n border-color: transparent;\n color: var(--sy-text-muted);\n}\n\n.versions-file-input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.versions-divider {\n height: 1px;\n background: var(--modeling-overlay-border);\n margin: 4px 16px;\n}\n\n.versions-list-header {\n padding: 12px 16px 8px;\n text-transform: uppercase;\n font-weight: 600;\n font-size: 10px;\n letter-spacing: 0.5px;\n color: var(--modeling-overlay-text);\n opacity: 0.6;\n}\n\n/* Wrapper creates the positioning context for the scrim overlay. */\n.versions-list-wrap {\n position: relative;\n height: 280px;\n min-height: 280px;\n max-height: 280px;\n}\n\n.versions-list {\n height: 100%;\n overflow-y: auto;\n padding-bottom: 8px;\n}\n\n/* Scrim over the list while saving/reloading. List stays readable underneath;\n this just tints + blocks clicks and shows a small spinner in the center. */\n.versions-list-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--modeling-overlay-bg);\n color: var(--modeling-overlay-text);\n pointer-events: auto;\n opacity: 0;\n animation: sy-fade-scrim 0.18s ease-out forwards;\n border-radius: 6px;\n}\n\n.version-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 16px;\n cursor: pointer;\n transition: background 0.15s ease;\n margin: 0 8px;\n border-radius: 6px;\n}\n\n.version-item:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.version-item.selected {\n background: var(--modeling-entity-selected-header);\n}\n\n/* Keyboard cursor. .selected means "currently loaded" and the two coincide on\n open, so the ring — not the fill — is what says "Enter opens this one". */\n.version-item.highlighted {\n background: var(--modeling-overlay-bg-hover);\n box-shadow: inset 0 0 0 1px var(--sy-accent);\n}\n\n.version-item.selected.highlighted {\n background: var(--modeling-entity-selected-header);\n}\n\n.versions-content:focus,\n.versions-content:focus-visible {\n outline: none;\n}\n\n.version-item.selected .version-name {\n color: var(--sy-accent);\n font-weight: 500;\n}\n\n.version-item-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n opacity: 0.4;\n flex-shrink: 0;\n}\n\n.version-item.selected .version-item-icon {\n opacity: 1;\n color: var(--sy-accent);\n}\n\n.version-name {\n flex: 1;\n font-size: 13px;\n color: var(--modeling-entity-text);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.version-deployed {\n font-size: 9px;\n text-transform: uppercase;\n padding: 3px 6px;\n border-radius: 4px;\n background: var(--modeling-added-fill);\n color: var(--modeling-added-text);\n font-weight: 600;\n letter-spacing: 0.3px;\n flex-shrink: 0;\n}\n\n.version-delete-btn {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--modeling-overlay-text);\n cursor: pointer;\n opacity: 0;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.version-item:hover .version-delete-btn {\n opacity: 0.6;\n}\n\n.version-item:hover .version-delete-btn:hover {\n opacity: 1;\n background: var(--modeling-removed-tint);\n color: var(--modeling-removed-text);\n}\n\n.version-delete-confirm {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.version-delete-confirm button {\n padding: 5px 10px;\n border: none;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.version-delete-confirm .confirm-yes {\n background: var(--modeling-danger-bg);\n color: var(--modeling-danger-text);\n}\n\n.version-delete-confirm .confirm-yes:hover {\n background: var(--modeling-danger-bg-hover);\n}\n\n.version-delete-confirm .confirm-no {\n background: var(--modeling-press-overlay);\n color: var(--modeling-entity-text);\n}\n\n.version-delete-confirm .confirm-no:hover {\n background: var(--modeling-press-overlay-strong);\n}\n\n.versions-empty,\n.versions-loading {\n height: 288px;\n min-height: 288px;\n max-height: 288px;\n padding: 16px;\n text-align: center;\n color: var(--modeling-overlay-text);\n font-size: 13px;\n opacity: 0.7;\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n}\n\n.versions-loading {\n flex-direction: row;\n gap: 10px;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Import Entity Popover\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.import-content {\n display: flex;\n flex-direction: column;\n}\n\n/* Entities / Relations mode toggle */\n.import-tabs {\n display: flex;\n gap: 4px;\n padding: 10px 16px 0;\n}\n\n.import-tab {\n flex: 1;\n padding: 6px 10px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--modeling-overlay-text);\n font-size: 12px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.import-tab:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.import-tab.active {\n background: var(--modeling-entity-header-fill);\n color: var(--modeling-entity-text);\n}\n\n.import-search {\n padding: 12px 16px;\n}\n\n.import-search input {\n width: 100%;\n padding: 8px 10px;\n border-radius: 6px;\n border: 1px solid var(--modeling-overlay-border);\n background: transparent;\n color: var(--modeling-entity-text);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n box-sizing: border-box;\n}\n\n.import-search input:focus {\n border-color: var(--sy-accent);\n}\n\n.import-list {\n height: 240px;\n min-height: 240px;\n max-height: 240px;\n overflow-y: auto;\n padding-bottom: 8px;\n}\n\n.import-entity-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 16px;\n cursor: pointer;\n transition: background 0.15s ease;\n margin: 0 8px;\n border-radius: 6px;\n}\n\n.import-entity-item:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.import-entity-item.imported {\n opacity: 0.4;\n cursor: default;\n}\n\n.import-entity-item.imported:hover {\n background: transparent;\n}\n\n.import-entity-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: 6px;\n background: var(--modeling-entity-header-fill);\n border: 1px solid var(--modeling-overlay-border);\n color: var(--modeling-entity-text);\n}\n\n.import-entity-name {\n flex: 1;\n font-size: 13px;\n font-weight: 500;\n color: var(--modeling-entity-text);\n}\n\n.import-entity-badge {\n font-size: 10px;\n padding: 2px 8px;\n border-radius: 10px;\n background: var(--modeling-overlay-border);\n color: var(--modeling-overlay-text);\n font-weight: 500;\n}\n\n/* Relation rows in the import list — two lines: endpoints + labels */\n.import-relation-item {\n align-items: flex-start;\n}\n\n.import-relation-body {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n flex: 1;\n}\n\n.import-relation-title {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--modeling-entity-text);\n}\n\n.import-relation-arrow {\n color: var(--modeling-overlay-text);\n opacity: 0.7;\n}\n\n.import-relation-labels {\n font-size: 11px;\n color: var(--modeling-overlay-text);\n opacity: 0.7;\n}\n\n.import-empty {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 0 24px;\n text-align: center;\n font-size: 13px;\n color: var(--modeling-overlay-text);\n opacity: 0.6;\n}\n');
|
|
3405
|
+
lV(),$G,H7.g(WN)],null))],null)};var y2=new CSSStyleSheet;y2.replaceSync('/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Action Bar - Bottom-center floating toolbar\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Excalidraw/Figma-style floating action bar with popover support.\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n/* Action Bar Container - positions everything */\n.action-bar-container {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n}\n\n/* Floating Action Bar */\n.action-bar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 8px;\n background: var(--modeling-overlay-bg);\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 12px;\n box-shadow: var(--modeling-shadow-popover);\n}\n\n.action-group {\n display: flex;\n gap: 2px;\n}\n\n.action-divider {\n width: 1px;\n height: 24px;\n background: var(--modeling-overlay-border);\n margin: 0 6px;\n}\n\n/* Action Button */\n.action-btn {\n position: relative;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 8px;\n background: transparent;\n color: var(--modeling-overlay-text);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.action-btn[data-tooltip]::before {\n content: attr(data-tooltip);\n position: absolute;\n bottom: calc(100% + 7px);\n left: 50%;\n transform: translateX(-50%);\n background: rgba(18, 20, 28, 0.92);\n color: rgba(255, 255, 255, 0.95);\n padding: 5px 10px;\n border-radius: 5px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n pointer-events: none;\n letter-spacing: 0.01em;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.12s ease, visibility 0.12s ease;\n z-index: 100;\n}\n\n.action-btn[data-tooltip]:hover::before {\n opacity: 1;\n visibility: visible;\n}\n\n/* Key-hint bubble — only while ⌘/Ctrl is held (.hints on the bar). The\n modifier is in the user\'s hand, so the bubble carries just the second key. */\n.action-bar.hints .action-btn[data-hint]::after {\n content: attr(data-hint);\n position: absolute;\n top: -5px;\n right: -5px;\n min-width: 9px;\n padding: 1px 4px;\n border-radius: 5px;\n background: var(--sy-accent);\n color: var(--modeling-overlay-bg);\n font-family: \'JetBrains Mono\', \'Fira Code\', monospace;\n font-size: 9px;\n font-weight: 700;\n line-height: 1.45;\n text-align: center;\n pointer-events: none;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n animation: sy-hint-pop 0.12s ease-out;\n}\n\n/* The tooltip would otherwise cover the bubbles of every neighbouring\n button the moment the pointer rests anywhere on the bar. */\n.action-bar.hints .action-btn[data-tooltip]:hover::before {\n opacity: 0;\n visibility: hidden;\n}\n\n@keyframes sy-hint-pop {\n from {\n opacity: 0;\n transform: scale(0.7);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n.action-btn:hover:not(.disabled) {\n background: var(--modeling-hover-overlay);\n color: var(--modeling-entity-text);\n}\n\n.action-btn:focus-visible {\n outline: none;\n}\n\n.action-btn.selected {\n background: var(--modeling-entity-selected-header);\n color: var(--sy-accent);\n}\n\n.action-btn.disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.action-btn.positive {\n color: var(--modeling-added-text);\n}\n\n.action-btn.positive:hover:not(.disabled) {\n background: var(--modeling-added-tint);\n}\n\n/* Popover - opens above action bar. */\n.action-popover {\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-bottom: 8px;\n width: 320px;\n background: var(--modeling-overlay-bg);\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 12px;\n box-shadow: var(--modeling-shadow-2xl);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: sy-fade-up-centered 0.15s ease-out;\n}\n\n.popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.popover-title {\n font-weight: 600;\n font-size: 13px;\n text-transform: capitalize;\n color: var(--modeling-overlay-text);\n}\n\n.popover-close {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--modeling-overlay-text);\n cursor: pointer;\n}\n\n.popover-close:hover {\n background: var(--modeling-hover-overlay);\n}\n\n.popover-body {\n flex: 1;\n overflow: visible;\n color: var(--modeling-overlay-text);\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Versions Popover\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n.versions-content {\n display: flex;\n flex-direction: column;\n}\n\n.versions-header {\n padding: 16px 16px 12px;\n}\n\n/* While saving: dim + block pointer events on inputs and secondary actions\n so the user can\'t edit mid-save or trigger export/import. The versions list\n gets its own scrim overlay (.versions-list-overlay) rather than being\n dimmed, so the list stays readable underneath. */\n.versions-content.is-saving .versions-form,\n.versions-content.is-saving .versions-actions .versions-action-btn:not(.primary),\n.versions-content.is-saving .versions-empty {\n pointer-events: none;\n opacity: 0.5;\n}\n\n.versions-header-label {\n display: block;\n text-transform: uppercase;\n font-weight: 600;\n font-size: 10px;\n letter-spacing: 0.5px;\n color: var(--modeling-overlay-text);\n opacity: 0.6;\n margin-bottom: 6px;\n}\n\n.versions-header-title {\n display: block;\n font-weight: 600;\n font-size: 15px;\n line-height: 22px;\n /* Pin height: 1 line @22px, prevents wrap from bumping popover height during save */\n height: 22px;\n color: var(--modeling-entity-text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.versions-form {\n padding: 8px 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.versions-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.versions-field-label {\n display: block;\n text-transform: uppercase;\n font-weight: 600;\n font-size: 10px;\n letter-spacing: 0.5px;\n color: var(--modeling-overlay-text);\n opacity: 0.6;\n}\n\n.versions-field input[type\x3d"text"] {\n display: block;\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n font-size: 13px;\n font-family: inherit;\n background: transparent;\n color: var(--modeling-entity-text);\n outline: none;\n transition:\n border-color 0.15s ease,\n box-shadow 0.15s ease;\n box-sizing: border-box;\n}\n\n.versions-field input[type\x3d"text"]:focus {\n border-color: var(--sy-accent);\n box-shadow: 0 0 0 3px var(--modeling-entity-selected-tint);\n}\n\n.versions-field input[type\x3d"text"]::placeholder {\n color: var(--modeling-overlay-text);\n opacity: 0.5;\n}\n\n.versions-actions {\n display: flex;\n gap: 8px;\n padding: 0 16px 16px;\n}\n\n.versions-action-btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 12px;\n /* Pin height so icon/text swap (save ↔ loader-2, "Save" ↔ "Saving...") can\'t cause row to shift */\n height: 38px;\n min-height: 38px;\n max-height: 38px;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n font-family: inherit;\n background: transparent;\n color: var(--modeling-entity-text);\n cursor: pointer;\n transition:\n background 0.15s ease,\n border-color 0.15s ease,\n color 0.15s ease;\n box-sizing: border-box;\n position: relative;\n /* Keep label on one line even when it grows ("Save" → "Saving...") */\n white-space: nowrap;\n}\n\n.versions-action-btn \x3e .sy-icon {\n flex-shrink: 0;\n}\n\n.versions-action-btn:hover:not(:disabled) {\n background: var(--modeling-overlay-bg-hover);\n border-color: var(--modeling-press-overlay);\n}\n\n.versions-action-btn:active:not(:disabled) {\n transform: scale(0.98);\n}\n\n.versions-action-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.versions-action-btn.primary {\n background: var(--sy-accent);\n border-color: var(--sy-accent);\n color: var(--modeling-button-text);\n}\n\n.versions-action-btn.primary:hover:not(:disabled) {\n background: var(--sy-accent-hover);\n border-color: var(--sy-accent-hover);\n}\n\n/* Disabled primary: tinted ghost, not a faded white blob */\n.versions-action-btn.primary:disabled {\n opacity: 1;\n background: var(--sy-accent-tint);\n border-color: transparent;\n color: var(--sy-text-muted);\n}\n\n.versions-file-input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.versions-divider {\n height: 1px;\n background: var(--modeling-overlay-border);\n margin: 4px 16px;\n}\n\n.versions-list-header {\n padding: 12px 16px 8px;\n text-transform: uppercase;\n font-weight: 600;\n font-size: 10px;\n letter-spacing: 0.5px;\n color: var(--modeling-overlay-text);\n opacity: 0.6;\n}\n\n/* Wrapper creates the positioning context for the scrim overlay. */\n.versions-list-wrap {\n position: relative;\n height: 280px;\n min-height: 280px;\n max-height: 280px;\n}\n\n.versions-list {\n height: 100%;\n overflow-y: auto;\n padding-bottom: 8px;\n}\n\n/* Scrim over the list while saving/reloading. List stays readable underneath;\n this just tints + blocks clicks and shows a small spinner in the center. */\n.versions-list-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--modeling-overlay-bg);\n color: var(--modeling-overlay-text);\n pointer-events: auto;\n opacity: 0;\n animation: sy-fade-scrim 0.18s ease-out forwards;\n border-radius: 6px;\n}\n\n.version-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 16px;\n cursor: pointer;\n transition: background 0.15s ease;\n margin: 0 8px;\n border-radius: 6px;\n}\n\n.version-item:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.version-item.selected {\n background: var(--modeling-entity-selected-header);\n}\n\n/* Keyboard cursor. .selected means "currently loaded" and the two coincide on\n open, so the ring — not the fill — is what says "Enter opens this one". */\n.version-item.highlighted {\n background: var(--modeling-overlay-bg-hover);\n box-shadow: inset 0 0 0 1px var(--sy-accent);\n}\n\n.version-item.selected.highlighted {\n background: var(--modeling-entity-selected-header);\n}\n\n.versions-content:focus,\n.versions-content:focus-visible {\n outline: none;\n}\n\n.version-item.selected .version-name {\n color: var(--sy-accent);\n font-weight: 500;\n}\n\n.version-item-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n opacity: 0.4;\n flex-shrink: 0;\n}\n\n.version-item.selected .version-item-icon {\n opacity: 1;\n color: var(--sy-accent);\n}\n\n.version-name {\n flex: 1;\n font-size: 13px;\n color: var(--modeling-entity-text);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.version-deployed {\n font-size: 9px;\n text-transform: uppercase;\n padding: 3px 6px;\n border-radius: 4px;\n background: var(--modeling-added-fill);\n color: var(--modeling-added-text);\n font-weight: 600;\n letter-spacing: 0.3px;\n flex-shrink: 0;\n}\n\n.version-delete-btn {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--modeling-overlay-text);\n cursor: pointer;\n opacity: 0;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.version-item:hover .version-delete-btn {\n opacity: 0.6;\n}\n\n.version-item:hover .version-delete-btn:hover {\n opacity: 1;\n background: var(--modeling-removed-tint);\n color: var(--modeling-removed-text);\n}\n\n.version-delete-confirm {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.version-delete-confirm button {\n padding: 5px 10px;\n border: none;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.version-delete-confirm .confirm-yes {\n background: var(--modeling-danger-bg);\n color: var(--modeling-danger-text);\n}\n\n.version-delete-confirm .confirm-yes:hover {\n background: var(--modeling-danger-bg-hover);\n}\n\n.version-delete-confirm .confirm-no {\n background: var(--modeling-press-overlay);\n color: var(--modeling-entity-text);\n}\n\n.version-delete-confirm .confirm-no:hover {\n background: var(--modeling-press-overlay-strong);\n}\n\n.versions-empty,\n.versions-loading {\n height: 288px;\n min-height: 288px;\n max-height: 288px;\n padding: 16px;\n text-align: center;\n color: var(--modeling-overlay-text);\n font-size: 13px;\n opacity: 0.7;\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n}\n\n.versions-loading {\n flex-direction: row;\n gap: 10px;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Import Entity Popover\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.import-content {\n display: flex;\n flex-direction: column;\n}\n\n/* Entities / Relations mode toggle */\n.import-tabs {\n display: flex;\n gap: 4px;\n padding: 10px 16px 0;\n}\n\n.import-tab {\n flex: 1;\n padding: 6px 10px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--modeling-overlay-text);\n font-size: 12px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.import-tab:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.import-tab.active {\n background: var(--modeling-entity-header-fill);\n color: var(--modeling-entity-text);\n}\n\n.import-search {\n padding: 12px 16px;\n}\n\n.import-search input {\n width: 100%;\n padding: 8px 10px;\n border-radius: 6px;\n border: 1px solid var(--modeling-overlay-border);\n background: transparent;\n color: var(--modeling-entity-text);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n box-sizing: border-box;\n}\n\n.import-search input:focus {\n border-color: var(--sy-accent);\n}\n\n.import-list {\n height: 240px;\n min-height: 240px;\n max-height: 240px;\n overflow-y: auto;\n padding-bottom: 8px;\n}\n\n.import-entity-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 16px;\n cursor: pointer;\n transition: background 0.15s ease;\n margin: 0 8px;\n border-radius: 6px;\n}\n\n.import-entity-item:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.import-entity-item.imported {\n opacity: 0.4;\n cursor: default;\n}\n\n.import-entity-item.imported:hover {\n background: transparent;\n}\n\n.import-entity-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: 6px;\n background: var(--modeling-entity-header-fill);\n border: 1px solid var(--modeling-overlay-border);\n color: var(--modeling-entity-text);\n}\n\n.import-entity-name {\n flex: 1;\n font-size: 13px;\n font-weight: 500;\n color: var(--modeling-entity-text);\n}\n\n.import-entity-badge {\n font-size: 10px;\n padding: 2px 8px;\n border-radius: 10px;\n background: var(--modeling-overlay-border);\n color: var(--modeling-overlay-text);\n font-weight: 500;\n}\n\n/* Relation rows in the import list — two lines: endpoints + labels */\n.import-relation-item {\n align-items: flex-start;\n}\n\n.import-relation-body {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n flex: 1;\n}\n\n.import-relation-title {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--modeling-entity-text);\n}\n\n.import-relation-arrow {\n color: var(--modeling-overlay-text);\n opacity: 0.7;\n}\n\n.import-relation-labels {\n font-size: 11px;\n color: var(--modeling-overlay-text);\n opacity: 0.7;\n}\n\n.import-empty {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 0 24px;\n text-align: center;\n font-size: 13px;\n color: var(--modeling-overlay-text);\n opacity: 0.6;\n}\n');
|
|
3406
3406
|
function u9(a){var b=N(a);a=v(b,Vu);var c=v(b,lk),d=v(b,tE),e=v(b,OL),f=v(b,xm),h=v(b,uK),m=v(b,JA);b=v(b,az);var n=S,r=He;d=l(d)?Ge.h(r,"selected"):r;d=l(e)?Ge.h(d,"disabled"):d;d="string"===typeof f?Ge.h(d,f):d;f=Xe(f)?wh.h(d,f):d;return new R(null,3,5,n,[zba,new k(null,5,[xm,f,pG,e,Ht,l(m)?m:Vf(c),Sw,b,Lu,new k(null,1,[Iu,l(l(h)?mb(e):h)?h:null],null)],null),X7(new k(null,2,[U,Vf(a),QB,"18"],null))],null)}
|
|
3407
3407
|
function wBa(){var a=H7.g(en),b=H7.g(Xu),c=H7.g(MG);return new Ie(null,l(a)?new R(null,2,5,S,[XJ,new k(null,3,[iK,"backdrop",FH,new k(null,3,[RA,"fixed",gD,"0",qM,"29"],null),Lu,new k(null,1,[Iu,function(){return I7.h(aD,null)}],null)],null)],null):null,new Ie(null,new R(null,4,5,S,[Iea,new k(null,1,[iK,"action-bar"],null),l(a)?new R(null,3,5,S,[hha,new R(null,3,5,S,[Sda,new R(null,2,5,S,[Eca,Vf(a)],null),new R(null,3,5,S,[cfa,new k(null,1,[Lu,new k(null,1,[Iu,function(){return I7.h(aD,null)}],null)],
|
|
3408
3408
|
null),X7(new k(null,2,[U,"x",QB,"14"],null))],null)],null),new R(null,2,5,S,[Cda,function(){switch(a instanceof x?a.H:null){case "versions":return vBa();case "import":return qBa();default:return null}}()],null)],null):null,new R(null,7,5,S,[tma,new k(null,1,[xm,l(c)?"hints":null],null),new R(null,4,5,S,[MK,u9(new k(null,5,[lk,Lv,Vu,Hu,JA,"Open Dataset",az,"O",uK,function(){return I7.h(sC,null)}],null)),u9(new k(null,6,[lk,FF,Vu,kr,JA,"Versions",az,"H",tE,z.h(a,FF),uK,function(){return I7.h(Ss,new k(null,
|
|
3409
3409
|
1,[gH,FF],null))}],null)),u9(new k(null,6,[lk,Xia,Vu,qJ,JA,"Deploy",az,"D",tE,H7.g(jy),uK,function(){if(l(H7.g(jy)))return I7.h(PF,null);I7.h(aD,null);return I7.h(ct,null)}],null))],null),new R(null,1,5,S,[Cp],null),new R(null,3,5,S,[MK,u9(new k(null,7,[lk,lca,Vu,Ty,JA,"Add Entity",az,"E",xm,"positive",OL,b,uK,function(){return I7.h(aA,null)}],null)),u9(new k(null,7,[lk,m0,Vu,mI,JA,"Import from deployed",az,"I",tE,z.h(a,m0),OL,b,uK,function(){return I7.h(Ss,new k(null,1,[gH,m0],null))}],null))],null),
|
|
3410
3410
|
new R(null,1,5,S,[Cp],null),new R(null,5,5,S,[MK,function(){var d=H7.g(AD);return u9(new k(null,5,[lk,qu,Vu,l(d)?jI:Yr,JA,l(d)?"Switch to light mode":"Switch to dark mode",az,"B",uK,function(){return I7.h(iw,null)}],null))}(),u9(new k(null,6,[lk,gI,Vu,gI,JA,"Dataset access — owners \x26 groups",OL,null==Bh(q(X),new R(null,2,5,S,[eI,Lv],null)),tE,null!=H7.g(IH),uK,function(){return I7.h(UM,null)}],null)),u9(new k(null,6,[lk,Vq,Vu,dC,JA,"Data Console — ⌘/Ctrl+K",az,"K",tE,H7.g(mD),uK,function(){return I7.h(ME,
|
|
3411
|
-
null)}],null)),u9(new k(null,6,[lk,bB,Vu,TC,JA,"Log Cockpit — ⌘/Ctrl+L",az,"L",tE,H7.g(JJ),uK,function(){return I7.h(eX,null)}],null))],null)],null)],null),null,1,null),2,null)};var w2=new CSSStyleSheet;w2.replaceSync('/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Synthigy Modeling — Shared Animations\n -----------------------------------------------------------------------------\n All @keyframes for modeling UI live here. Per-component CSS files should\n only reference these (animation: \x3cname\x3e ...) rather than redefining them.\n\n Two ways to use:\n 1. Via animation shorthand on a component class (same as before):\n .my-thing { animation: sy-fade-up 0.2s ease-out; }\n 2. Via utility class for one-off use (no custom CSS needed):\n \x3cdiv class\x3d"sy-anim-spin"\x3e ... \x3c/div\x3e\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n\n/* -----------------------------------------------------------------------------\n Keyframes\n ----------------------------------------------------------------------------- */\n\n/* Spin: infinite rotation. Use for loading indicators. */\n@keyframes sy-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/* Fade + rise: element fades in while translating 8px up. Popovers, menus. */\n@keyframes sy-fade-up {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* Fade + rise for elements that also have translateX(-50%) (centered popovers). */\n@keyframes sy-fade-up-centered {\n from { opacity: 0; transform: translate(-50%, 8px); }\n to { opacity: 1; transform: translate(-50%, 0); }\n}\n\n/* Slide in from right: drawers anchored on the right edge. */\n@keyframes sy-slide-in-right {\n from { opacity: 0; transform: translateX(20px); }\n to { opacity: 1; transform: translateX(0); }\n}\n\n/* Slide in from left: toasts, side-panels anchored on the left. */\n@keyframes sy-slide-in-left {\n from { opacity: 0; transform: translateX(-20px); }\n to { opacity: 1; transform: translateX(0); }\n}\n\n/* Simple fade-in, no translation. */\n@keyframes sy-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Scrim fade: fades to a partial opacity, suitable for loading/busy overlays. */\n@keyframes sy-fade-scrim {\n from { opacity: 0; }\n to { opacity: 0.7; }\n}\n\n\n/* -----------------------------------------------------------------------------\n Utility classes — drop-in, no custom CSS required\n ----------------------------------------------------------------------------- */\n\n.sy-anim-spin { animation: sy-spin 1s linear infinite; }\n.sy-anim-fade-up { animation: sy-fade-up 0.2s ease-out; }\n.sy-anim-slide-right { animation: sy-slide-in-right 0.2s ease-out; }\n.sy-anim-slide-left { animation: sy-slide-in-left 0.2s ease-out; }\n.sy-anim-fade-in { animation: sy-fade-in 0.15s ease-out; }\n\n\n/* -----------------------------------------------------------------------------\n .sy-icon — inline-SVG icon wrapper\n -----------------------------------------------------------------------------\n The registered Lucide SVGs have stroke\x3d"currentColor", so icons pick up\n color from the parent\'s `color` CSS (our --sy-text-* variables).\n The inner \x3csvg\x3e fills the wrapper\'s box.\n ----------------------------------------------------------------------------- */\n\n.sy-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n line-height: 0;\n color: inherit;\n}\n\n.sy-icon svg {\n width: 100%;\n height: 100%;\n display: block;\n stroke: currentColor;\n fill: none;\n}\n');var x2=new CSSStyleSheet;x2.replaceSync("/* Deploy Drawer - floating right panel (same style as entity drawer) */\n\n.deploy-drawer {\n position: absolute;\n top: 12px;\n right: 12px;\n bottom: 12px;\n width: 560px;\n max-width: calc(100% - 24px);\n z-index: 1101;\n display: flex;\n flex-direction: column;\n background: var(--modeling-overlay-bg);\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 12px;\n box-shadow: var(--modeling-shadow-xl);\n color: var(--sy-text);\n overflow: hidden;\n animation: sy-slide-in-right 0.2s ease-out;\n}\n\n/* Header */\n.deploy-drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.deploy-drawer-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n font-size: 16px;\n}\n\n.deploy-drawer-actions button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--sy-text-m);\n cursor: pointer;\n}\n\n.deploy-drawer-actions button:hover {\n background: var(--modeling-overlay-bg-hover);\n color: var(--sy-text);\n}\n\n/* Summary bar */\n.deploy-summary {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 12px 24px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n font-size: 12px;\n color: var(--sy-text-m);\n flex-shrink: 0;\n}\n\n.deploy-summary-item {\n display: flex;\n align-items: center;\n gap: 5px;\n}\n\n.deploy-summary-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n}\n\n.deploy-summary-dot.added {\n background: var(--modeling-added-stroke);\n}\n\n.deploy-summary-dot.removed {\n background: var(--modeling-removed-stroke);\n}\n\n.deploy-summary-dot.modified {\n background: var(--modeling-modified-stroke);\n}\n\n/* Content - scrollable changes list */\n.deploy-drawer-content {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n/* Section headers */\n.deploy-section-header {\n padding: 8px 24px 4px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--sy-text-mm);\n}\n\n/* Change item */\n.deploy-change-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 24px;\n cursor: default;\n}\n\n.deploy-change-item:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.deploy-change-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n/* Expand chevron on a changed entity — animates and points DOWN when the\n entity's details (attribute/RLS/audit diffs) are open. */\n.deploy-chevron {\n display: inline-flex;\n transform-origin: center;\n transition: transform 0.18s ease;\n color: var(--modeling-overlay-text);\n}\n\n.deploy-chevron.expanded {\n transform: rotate(90deg);\n}\n\n.deploy-change-icon.added {\n background: var(--modeling-added-fill);\n color: var(--modeling-added-text);\n}\n\n.deploy-change-icon.removed {\n background: var(--modeling-removed-fill);\n color: var(--modeling-removed-text);\n}\n\n.deploy-change-icon.modified {\n background: var(--modeling-modified-fill);\n color: var(--modeling-modified-text);\n}\n\n.deploy-change-name {\n flex: 1;\n font-size: 13px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.deploy-change-action {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--sy-text-m);\n cursor: pointer;\n /* always faintly visible — hidden-until-hover made undo undiscoverable */\n opacity: 0.45;\n transition: opacity 0.15s;\n flex-shrink: 0;\n}\n\n.deploy-change-item:hover .deploy-change-action {\n opacity: 0.9;\n}\n\n.deploy-change-action:hover {\n opacity: 1 !important;\n background: var(--modeling-overlay-bg-hover);\n color: var(--sy-text);\n}\n\n/* Attribute diffs (expandable under modified entities) */\n.deploy-attr-diffs {\n padding: 0 24px 0 54px;\n}\n\n.deploy-attr-diff {\n display: flex;\n align-items: baseline;\n flex-wrap: wrap;\n gap: 4px 8px;\n padding: 4px 8px;\n font-size: 11px;\n color: var(--sy-text-m);\n border-radius: 4px;\n}\n\n.deploy-attr-diff:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.deploy-attr-diff:hover .deploy-change-action {\n opacity: 0.9;\n}\n\n.deploy-attr-diff-field {\n font-weight: 500;\n}\n\n.deploy-attr-diff-details {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 4px 12px;\n font-size: 10px;\n color: var(--sy-text-mm);\n}\n\n.deploy-field-change {\n white-space: nowrap;\n}\n\n.deploy-field-label {\n color: var(--sy-text-mm);\n}\n\n.deploy-attr-diff-old {\n text-decoration: line-through;\n opacity: 0.6;\n color: var(--modeling-removed-text);\n}\n\n.deploy-attr-diff-arrow {\n color: var(--sy-text-mm);\n}\n\n.deploy-attr-diff-new {\n font-weight: 500;\n color: var(--modeling-added-text);\n}\n\n/* Configuration diff (enum values) */\n.deploy-config-diff {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0 4px 54px;\n font-size: 11px;\n}\n\n.deploy-config-diff .deploy-field-label {\n font-size: 10px;\n color: var(--sy-text-mm);\n margin-bottom: 2px;\n}\n\n.deploy-config-item {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border-radius: 3px;\n font-size: 11px;\n}\n\n.deploy-config-item.added {\n color: var(--modeling-added-text);\n}\n\n.deploy-config-item.removed {\n color: var(--modeling-removed-text);\n text-decoration: line-through;\n opacity: 0.6;\n}\n\n/* Deploy button - pinned at bottom */\n.deploy-drawer-footer {\n flex-shrink: 0;\n padding: 16px 24px;\n border-top: 1px solid var(--modeling-overlay-border);\n margin-top: auto;\n}\n\n.deploy-btn {\n width: 100%;\n padding: 10px;\n border: none;\n border-radius: 8px;\n background: var(--sy-accent);\n color: var(--modeling-button-text);\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: background 0.15s;\n}\n\n.deploy-btn:hover:not(:disabled) {\n background: var(--sy-accent-hover);\n}\n\n/* Disabled primary: tinted ghost, not a faded white blob */\n.deploy-btn:disabled {\n background: var(--sy-accent-tint);\n color: var(--sy-text-muted);\n cursor: not-allowed;\n}\n\n/* Empty state */\n.deploy-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 24px;\n color: var(--sy-text-mm);\n font-size: 13px;\n gap: 8px;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Name Conflict Banner\n -----------------------------------------------------------------------------\n Shown when the deploy candidate has entities whose normalized names collide.\n Blocks deploy (the button is disabled) and lists the offenders.\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.deploy-error-banner {\n margin: 12px 16px 0;\n padding: 12px 14px;\n border: 1px solid var(--modeling-removed-tint-strong);\n background: var(--modeling-removed-tint);\n color: var(--sy-text);\n border-radius: 8px;\n font-size: 12px;\n animation: sy-fade-in 0.15s ease-out;\n}\n\n/* Title + icon stay red to carry the semantic weight — body is normal text. */\n.deploy-error-banner-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n font-size: 13px;\n margin-bottom: 6px;\n color: var(--modeling-removed-text);\n}\n\n.deploy-error-banner-body p {\n margin: 0 0 8px;\n}\n\n.deploy-conflict-list {\n margin: 0;\n padding: 0 0 0 18px;\n list-style: disc;\n}\n\n.deploy-conflict-list li {\n margin: 4px 0;\n line-height: 1.5;\n}\n\n.deploy-conflict-list code {\n padding: 1px 5px;\n border-radius: 3px;\n background: var(--modeling-hover-overlay-strong);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11.5px;\n}\n");
|
|
3411
|
+
null)}],null)),u9(new k(null,6,[lk,bB,Vu,TC,JA,"Log Cockpit — ⌘/Ctrl+L",az,"L",tE,H7.g(JJ),uK,function(){return I7.h(eX,null)}],null))],null)],null)],null),null,1,null),2,null)};var P8=new CSSStyleSheet;P8.replaceSync('/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Synthigy Modeling — Shared Animations\n -----------------------------------------------------------------------------\n All @keyframes for modeling UI live here. Per-component CSS files should\n only reference these (animation: \x3cname\x3e ...) rather than redefining them.\n\n Two ways to use:\n 1. Via animation shorthand on a component class (same as before):\n .my-thing { animation: sy-fade-up 0.2s ease-out; }\n 2. Via utility class for one-off use (no custom CSS needed):\n \x3cdiv class\x3d"sy-anim-spin"\x3e ... \x3c/div\x3e\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n\n/* -----------------------------------------------------------------------------\n Keyframes\n ----------------------------------------------------------------------------- */\n\n/* Spin: infinite rotation. Use for loading indicators. */\n@keyframes sy-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/* Fade + rise: element fades in while translating 8px up. Popovers, menus. */\n@keyframes sy-fade-up {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* Fade + rise for elements that also have translateX(-50%) (centered popovers). */\n@keyframes sy-fade-up-centered {\n from { opacity: 0; transform: translate(-50%, 8px); }\n to { opacity: 1; transform: translate(-50%, 0); }\n}\n\n/* Slide in from right: drawers anchored on the right edge. */\n@keyframes sy-slide-in-right {\n from { opacity: 0; transform: translateX(20px); }\n to { opacity: 1; transform: translateX(0); }\n}\n\n/* Slide in from left: toasts, side-panels anchored on the left. */\n@keyframes sy-slide-in-left {\n from { opacity: 0; transform: translateX(-20px); }\n to { opacity: 1; transform: translateX(0); }\n}\n\n/* Simple fade-in, no translation. */\n@keyframes sy-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Scrim fade: fades to a partial opacity, suitable for loading/busy overlays. */\n@keyframes sy-fade-scrim {\n from { opacity: 0; }\n to { opacity: 0.7; }\n}\n\n\n/* -----------------------------------------------------------------------------\n Utility classes — drop-in, no custom CSS required\n ----------------------------------------------------------------------------- */\n\n.sy-anim-spin { animation: sy-spin 1s linear infinite; }\n.sy-anim-fade-up { animation: sy-fade-up 0.2s ease-out; }\n.sy-anim-slide-right { animation: sy-slide-in-right 0.2s ease-out; }\n.sy-anim-slide-left { animation: sy-slide-in-left 0.2s ease-out; }\n.sy-anim-fade-in { animation: sy-fade-in 0.15s ease-out; }\n\n\n/* -----------------------------------------------------------------------------\n .sy-icon — inline-SVG icon wrapper\n -----------------------------------------------------------------------------\n The registered Lucide SVGs have stroke\x3d"currentColor", so icons pick up\n color from the parent\'s `color` CSS (our --sy-text-* variables).\n The inner \x3csvg\x3e fills the wrapper\'s box.\n ----------------------------------------------------------------------------- */\n\n.sy-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n line-height: 0;\n color: inherit;\n}\n\n.sy-icon svg {\n width: 100%;\n height: 100%;\n display: block;\n stroke: currentColor;\n fill: none;\n}\n');var n9=new CSSStyleSheet;n9.replaceSync("/* Deploy Drawer - floating right panel (same style as entity drawer) */\n\n.deploy-drawer {\n position: absolute;\n top: 12px;\n right: 12px;\n bottom: 12px;\n width: 560px;\n max-width: calc(100% - 24px);\n z-index: 1101;\n display: flex;\n flex-direction: column;\n background: var(--modeling-overlay-bg);\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 12px;\n box-shadow: var(--modeling-shadow-xl);\n color: var(--sy-text);\n overflow: hidden;\n animation: sy-slide-in-right 0.2s ease-out;\n}\n\n/* Header */\n.deploy-drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.deploy-drawer-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n font-size: 16px;\n}\n\n.deploy-drawer-actions button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--sy-text-m);\n cursor: pointer;\n}\n\n.deploy-drawer-actions button:hover {\n background: var(--modeling-overlay-bg-hover);\n color: var(--sy-text);\n}\n\n/* Summary bar */\n.deploy-summary {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 12px 24px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n font-size: 12px;\n color: var(--sy-text-m);\n flex-shrink: 0;\n}\n\n.deploy-summary-item {\n display: flex;\n align-items: center;\n gap: 5px;\n}\n\n.deploy-summary-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n}\n\n.deploy-summary-dot.added {\n background: var(--modeling-added-stroke);\n}\n\n.deploy-summary-dot.removed {\n background: var(--modeling-removed-stroke);\n}\n\n.deploy-summary-dot.modified {\n background: var(--modeling-modified-stroke);\n}\n\n/* Content - scrollable changes list */\n.deploy-drawer-content {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n/* Section headers */\n.deploy-section-header {\n padding: 8px 24px 4px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--sy-text-mm);\n}\n\n/* Change item */\n.deploy-change-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 24px;\n cursor: default;\n}\n\n.deploy-change-item:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.deploy-change-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n/* Expand chevron on a changed entity — animates and points DOWN when the\n entity's details (attribute/RLS/audit diffs) are open. */\n.deploy-chevron {\n display: inline-flex;\n transform-origin: center;\n transition: transform 0.18s ease;\n color: var(--modeling-overlay-text);\n}\n\n.deploy-chevron.expanded {\n transform: rotate(90deg);\n}\n\n.deploy-change-icon.added {\n background: var(--modeling-added-fill);\n color: var(--modeling-added-text);\n}\n\n.deploy-change-icon.removed {\n background: var(--modeling-removed-fill);\n color: var(--modeling-removed-text);\n}\n\n.deploy-change-icon.modified {\n background: var(--modeling-modified-fill);\n color: var(--modeling-modified-text);\n}\n\n.deploy-change-name {\n flex: 1;\n font-size: 13px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.deploy-change-action {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--sy-text-m);\n cursor: pointer;\n /* always faintly visible — hidden-until-hover made undo undiscoverable */\n opacity: 0.45;\n transition: opacity 0.15s;\n flex-shrink: 0;\n}\n\n.deploy-change-item:hover .deploy-change-action {\n opacity: 0.9;\n}\n\n.deploy-change-action:hover {\n opacity: 1 !important;\n background: var(--modeling-overlay-bg-hover);\n color: var(--sy-text);\n}\n\n/* Attribute diffs (expandable under modified entities) */\n.deploy-attr-diffs {\n padding: 0 24px 0 54px;\n}\n\n.deploy-attr-diff {\n display: flex;\n align-items: baseline;\n flex-wrap: wrap;\n gap: 4px 8px;\n padding: 4px 8px;\n font-size: 11px;\n color: var(--sy-text-m);\n border-radius: 4px;\n}\n\n.deploy-attr-diff:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.deploy-attr-diff:hover .deploy-change-action {\n opacity: 0.9;\n}\n\n.deploy-attr-diff-field {\n font-weight: 500;\n}\n\n.deploy-attr-diff-details {\n flex: 1;\n display: flex;\n flex-wrap: wrap;\n gap: 4px 12px;\n font-size: 10px;\n color: var(--sy-text-mm);\n}\n\n.deploy-field-change {\n white-space: nowrap;\n}\n\n.deploy-field-label {\n color: var(--sy-text-mm);\n}\n\n.deploy-attr-diff-old {\n text-decoration: line-through;\n opacity: 0.6;\n color: var(--modeling-removed-text);\n}\n\n.deploy-attr-diff-arrow {\n color: var(--sy-text-mm);\n}\n\n.deploy-attr-diff-new {\n font-weight: 500;\n color: var(--modeling-added-text);\n}\n\n/* Configuration diff (enum values) */\n.deploy-config-diff {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0 4px 54px;\n font-size: 11px;\n}\n\n.deploy-config-diff .deploy-field-label {\n font-size: 10px;\n color: var(--sy-text-mm);\n margin-bottom: 2px;\n}\n\n.deploy-config-item {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 2px 8px;\n border-radius: 3px;\n font-size: 11px;\n}\n\n.deploy-config-item.added {\n color: var(--modeling-added-text);\n}\n\n.deploy-config-item.removed {\n color: var(--modeling-removed-text);\n text-decoration: line-through;\n opacity: 0.6;\n}\n\n/* Deploy button - pinned at bottom */\n.deploy-drawer-footer {\n flex-shrink: 0;\n padding: 16px 24px;\n border-top: 1px solid var(--modeling-overlay-border);\n margin-top: auto;\n}\n\n.deploy-btn {\n width: 100%;\n padding: 10px;\n border: none;\n border-radius: 8px;\n background: var(--sy-accent);\n color: var(--modeling-button-text);\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: background 0.15s;\n}\n\n.deploy-btn:hover:not(:disabled) {\n background: var(--sy-accent-hover);\n}\n\n/* Disabled primary: tinted ghost, not a faded white blob */\n.deploy-btn:disabled {\n background: var(--sy-accent-tint);\n color: var(--sy-text-muted);\n cursor: not-allowed;\n}\n\n/* Empty state */\n.deploy-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 24px;\n color: var(--sy-text-mm);\n font-size: 13px;\n gap: 8px;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Name Conflict Banner\n -----------------------------------------------------------------------------\n Shown when the deploy candidate has entities whose normalized names collide.\n Blocks deploy (the button is disabled) and lists the offenders.\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.deploy-error-banner {\n margin: 12px 16px 0;\n padding: 12px 14px;\n border: 1px solid var(--modeling-removed-tint-strong);\n background: var(--modeling-removed-tint);\n color: var(--sy-text);\n border-radius: 8px;\n font-size: 12px;\n animation: sy-fade-in 0.15s ease-out;\n}\n\n/* Title + icon stay red to carry the semantic weight — body is normal text. */\n.deploy-error-banner-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n font-size: 13px;\n margin-bottom: 6px;\n color: var(--modeling-removed-text);\n}\n\n.deploy-error-banner-body p {\n margin: 0 0 8px;\n}\n\n.deploy-conflict-list {\n margin: 0;\n padding: 0 0 0 18px;\n list-style: disc;\n}\n\n.deploy-conflict-list li {\n margin: 4px 0;\n line-height: 1.5;\n}\n\n.deploy-conflict-list code {\n padding: 1px 5px;\n border-radius: 3px;\n background: var(--modeling-hover-overlay-strong);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11.5px;\n}\n");
|
|
3412
3412
|
function x9(a){return new R(null,3,5,S,[kq,new k(null,1,[xm,Vf(a)],null),function(){var b=a instanceof x?a.H:null;switch(b){case "added":return"+";case "removed":return"-";case "modified":return"~";default:throw Error(["No matching clause: ",p.g(b)].join(""));}}()],null)}function y9(a,b,c){return l(l(b)?yg(b,c):b)?new R(null,5,5,S,[Iv,new R(null,3,5,S,[Kx,a,": "],null),new R(null,2,5,S,[HE,p.g(b)],null),new R(null,2,5,S,[Oaa," → "],null),new R(null,2,5,S,[AK,p.g(c)],null)],null):null}
|
|
3413
3413
|
function xBa(a,b){var c=Bh(b,new R(null,2,5,S,[WH,fN],null)),d=fN.g(a),e=wh.j(ug,eh.g(function(t){return new R(null,2,5,S,[mV(t),U.g(t)],null)}),c),f=wh.j(ug,eh.g(function(t){return new R(null,2,5,S,[mV(t),U.g(t)],null)}),d);c=Uj(Hi(e));d=Uj(Hi(f));var h=dS.h(d,c),m=dS.h(c,d);c=function(){var t=Bh(b,new R(null,2,5,S,[WH,Nz],null));return l(t)?t:Rj}();d=function(){var t=Nz.g(a);return l(t)?t:Rj}();var n=dS.h(d,c),r=dS.h(c,d);return new Ie(null,A(h)||A(m)?new R(null,4,5,S,[XF,new R(null,2,5,S,[Kx,"enum values:"],
|
|
3414
3414
|
null),function(){return function w(u){return new Wf(null,function(){for(;;){var y=A(u);if(y){if(af(y)){var C=fd(y),D=H(C),E=$f(D);a:for(var G=0;;)if(G<D){var K=Ob(C,G),O=Od(e,K,p.g(K)),P=E;K=Pe(new R(null,3,5,S,[up,new R(null,2,5,S,[Q_,"−"],null),new R(null,2,5,S,[Q_,O],null)],null),new k(null,1,[SH,["r-",p.g(K)].join("")],null));P.add(K);G+=1}else{C=!0;break a}return C?bg(dg(E),w(gd(y))):bg(dg(E),null)}E=B(y);C=Od(e,E,p.g(E));return ye(Pe(new R(null,3,5,S,[up,new R(null,2,5,S,[Q_,"−"],null),new R(null,
|
|
@@ -3460,7 +3460,7 @@ function HBa(a){return new R(null,3,5,S,[Sp,new R(null,3,5,S,[iD,X7(new k(null,2
|
|
|
3460
3460
|
fd(f),m=H(h),n=$f(m);return function(){for(var C=0;;)if(C<m){var D=Ob(h,C),E=N(D),G=v(E,TB),K=v(E,U),O=v(E,aO);cg(n,Pe(new R(null,6,5,S,[ox,new R(null,2,5,S,[ws,U.g(G)],null)," · ",new R(null,2,5,S,[lx,K],null)," ← ",aP(", ",eh.h(function(){return function(P){var T=N(P);P=v(T,Du);T=v(T,Cz);return[p.g(T),z.h(su,P)?" (relation)":null].join("")}}(C,D,E,G,K,O,h,m,n,f,e),O))],null),new k(null,1,[SH,[p.g(U.g(G)),"/",p.g(K)].join("")],null)));C+=1}else return!0}()?bg(dg(n),d(gd(f))):bg(dg(n),null)}var r=
|
|
3461
3461
|
B(f),t=N(r),u=v(t,TB),w=v(t,U),y=v(t,aO);return ye(Pe(new R(null,6,5,S,[ox,new R(null,2,5,S,[ws,U.g(u)],null)," · ",new R(null,2,5,S,[lx,w],null)," ← ",aP(", ",eh.h(function(){return function(C){var D=N(C);C=v(D,Du);D=v(D,Cz);return[p.g(D),z.h(su,C)?" (relation)":null].join("")}}(r,t,u,w,y,f,e),y))],null),new k(null,1,[SH,[p.g(U.g(u)),"/",p.g(w)].join("")],null)),d(Vd(f)))}return null}},null,null)}(a)}()],null)],null)],null)}
|
|
3462
3462
|
function IBa(){var a=H7.g(jy),b=H7.g(Bt),c=H7.g(gK),d=H7.g(sq),e=H7.g(cF),f=eI.g(q(X));return l(a)?new R(null,7,5,S,[Pka,new R(null,3,5,S,[Yda,new R(null,3,5,S,[$da,X7(new k(null,2,[U,"rocket",QB,"16"],null)),new R(null,2,5,S,[Q_,"Deploy"],null)],null),new R(null,2,5,S,[Nda,new R(null,3,5,S,[mB,new k(null,2,[Lu,new k(null,1,[Iu,function(){return I7.h(PF,null)}],null),nC,"Close"],null),X7(new k(null,2,[U,"x",QB,"14"],null))],null)],null)],null),EBa(),A(d)?GBa(d):null,A(e)?HBa(e):null,FBa(),new R(null,
|
|
3463
|
-
2,5,S,[nea,new R(null,4,5,S,[Mja,new k(null,2,[pG,l(b)?b:mb(c)||A(d)||A(e)||null==f||null==mV(f),Lu,new k(null,1,[Iu,function(){return I7.h(By,null)}],null)],null),X7(new k(null,3,[U,l(b)?"loader-2":"rocket",QB,"14",RF,b],null)),l(b)?"Deploying...":"Deploy"],null)],null)],null):null};var K9=new k(null,4,[xC,"Personally identifiable — identifies a natural person alone or in combination (name, email, phone, national id, date of birth).",GC,"Protected health information — health data linked to an identifiable person. HIPAA scope.",zH,"Credential or key material — tokens, passwords, private keys, API secrets.",Eia,"Confidential but not personal — commercially sensitive, not subject to personal-data regimes."],null),L9=new Pj(null,new k(null,
|
|
3463
|
+
2,5,S,[nea,new R(null,4,5,S,[Mja,new k(null,2,[pG,l(b)?b:mb(c)||A(d)||A(e)||null==f||null==mV(f),Lu,new k(null,1,[Iu,function(){return I7.h(By,null)}],null)],null),X7(new k(null,3,[U,l(b)?"loader-2":"rocket",QB,"14",RF,b],null)),l(b)?"Deploying...":"Deploy"],null)],null)],null):null};var K9=new k(null,4,[xC,"Personally identifiable — identifies a natural person alone or in combination (name, email, phone, national id, date of birth).",GC,"Protected health information — health data linked to an identifiable person. HIPAA scope.",zH,"Credential or key material — tokens, passwords, private keys, API secrets.",Eia,"Confidential but not personal — commercially sensitive, not subject to personal-data regimes."],null),L9=new Pj(null,new k(null,1,[zH,null],null),null);
|
|
3464
3464
|
function M9(a){a=Bh(a,new R(null,2,5,S,[WH,Nz],null));return l(a)?a:Rj};var N9=new k(null,6,[wG,140,qE,70,sga,32,hfa,26,IA,12,So,6],null);function O9(a){return z.h(dH,a)?"#":z.h("unique+mandatory",a)?"#":z.h(yG,a)?"#":z.h("unique",a)?"#":z.h(Nw,a)?"*":z.h("mandatory",a)?"*":"○"}var P9=new Pj(null,new k(null,13,["float",null,"json",null,"boolean",null,"int",null,"role",null,"hashed",null,"string",null,"group",null,"user",null,"timestamp",null,"uuid",null,"encrypted",null,"enum",null],null),null);
|
|
3465
3465
|
function Q9(a){a=a instanceof x?Vf(a):p.g(a);return l(P9.g?P9.g(a):P9.call(null,a))?a:"unknown"}function R9(a){return X7(new k(null,2,[U,Q9(a),QB,"12"],null))}
|
|
3466
3466
|
function JBa(a){var b=function(){var e=eE.g(q(X));return null==e?null:CV(e,mV(a))}();if(l(b)){var c=Uj(eh.h(sV,gN.g(b))),d=Uj(eh.h(sV,sh(BF,gN.g(b))));return wh.j(ug,Xg(function(e){var f=mV(e);if(mb(c.g?c.g(f):c.call(null,f)))f=new R(null,2,5,S,[f,rC],null);else{var h=d.g?d.g(f):d.call(null,f);e=l(h)?!1===BF.g(e):h;f=l(e)?new R(null,2,5,S,[f,ax],null):null}return f}),gN.g(a))}return null}
|
|
@@ -3515,7 +3515,7 @@ E>e?E:e,K=w-t-e;return G<K?G:K}()],null)}function UBa(a,b,c,d,e){var f=N(c$()),h
|
|
|
3515
3515
|
function e$(a,b){b=b.currentTarget.getBoundingClientRect();return I7.h(nG,new k(null,2,[lk,a,NL,new k(null,4,[WL,b.left,VL,b.top,uI,b.width,qr,b.height],null)],null))}function f$(){return I7.h(rv,null)}
|
|
3516
3516
|
function g$(a,b){a=N(a);var c=v(a,lk),d=Od(a,tG,fJ),e=Od(a,UC,4),f=Od(a,IA,8);if(z.h(c,H7.g(Yo))){var h=Hp.g(q(X));return new Ie(null,new R(null,2,5,S,[XJ,new k(null,3,[iK,["sy-popup-backdrop-",Vf(c)].join(""),FH,new k(null,3,[RA,"fixed",gD,"0",qM,"1200"],null),Lu,new k(null,1,[un,function(m){m.stopPropagation();return f$()}],null)],null)],null),new Ie(null,new R(null,3,5,S,[XJ,new k(null,3,[iK,["sy-popup-",Vf(c)].join(""),FH,new k(null,6,[RA,"fixed",qM,"1201",YB,"0",CL,"scale(0.95)",pba,"opacity 120ms ease-out, transform 120ms ease-out",
|
|
3517
3517
|
jo,"none"],null),oF,function(m){m=N(m);var n=v(m,eD);return requestAnimationFrame(function(){var r=UBa(h,new k(null,2,[uI,n.offsetWidth,qr,n.offsetHeight],null),function(){switch(d instanceof x?d.H:null){case "bottom-start":return new R(null,4,5,S,[fJ,Xv,cN,KF],null);case "bottom":return new R(null,4,5,S,[Ju,SC,fJ,cN],null);case "bottom-end":return new R(null,4,5,S,[Xv,fJ,KF,cN],null);case "top-start":return new R(null,4,5,S,[cN,KF,fJ,Xv],null);case "top":return new R(null,4,5,S,[SC,Ju,cN,fJ],null);
|
|
3518
|
-
case "top-end":return new R(null,4,5,S,[KF,cN,Xv,fJ],null);default:return new R(null,4,5,S,[fJ,Xv,cN,KF],null)}}(),e,f),t=N(r);r=v(t,WL);t=v(t,VL);n.style.left=[p.g(r),"px"].join("");n.style.top=[p.g(t),"px"].join("");n.style.opacity="1";n.style.transform="scale(1)";return n.style.pointerEvents="auto"})}],null),b],null),null,1,null),2,null)}return null};var y2=new CSSStyleSheet;y2.replaceSync('/* Entity Edit Drawer - floating right panel */\n\n.entity-drawer {\n position: absolute;\n top: 12px;\n right: 12px;\n bottom: 12px;\n width: 520px;\n max-width: calc(100% - 24px);\n z-index: 1101;\n display: flex;\n flex-direction: column;\n background: var(--modeling-overlay-bg);\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 12px;\n box-shadow: var(--modeling-shadow-xl);\n color: var(--sy-text);\n overflow: hidden;\n}\n\n/* Header - blipkit style: title bar + name */\n.entity-drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.entity-drawer-title {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--sy-text-m);\n}\n\n.entity-drawer-title .title-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: var(--sy-text-mm);\n transition: color 0.2s;\n}\n\n.entity-drawer-title .title-icon:hover {\n color: var(--sy-text-p);\n}\n\n.entity-drawer-actions {\n display: flex;\n gap: 16px;\n align-items: center;\n}\n\n.entity-drawer-actions button {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: var(--sy-text-mm);\n transition: color 0.15s;\n}\n\n.entity-drawer-actions button:hover {\n color: var(--sy-text-pp);\n}\n\n.entity-drawer-actions button.action-danger:hover {\n color: var(--modeling-removed-text);\n}\n\n/* Entity name below header */\n.entity-drawer-name {\n font-size: 22px;\n font-weight: 800;\n color: var(--sy-text-pp);\n border: none;\n outline: none;\n background: transparent;\n padding: 16px 24px 12px;\n width: 100%;\n font-family: inherit;\n line-height: 1.2;\n box-sizing: border-box;\n}\n\n.entity-drawer-name::placeholder {\n color: var(--sy-text-mm);\n}\n\n.entity-drawer-name.has-conflict {\n color: var(--modeling-removed-text);\n}\n\n.entity-drawer-name-error {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 24px 8px;\n font-size: 11.5px;\n color: var(--modeling-removed-text);\n flex-wrap: wrap;\n}\n\n.entity-drawer-name-error code {\n padding: 1px 5px;\n border-radius: 3px;\n background: var(--modeling-removed-tint-strong);\n color: var(--modeling-removed-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n}\n\n.entity-drawer-name-error strong {\n font-weight: 600;\n}\n\n/* Tabs — HUD style: uppercase micro-labels over a hairline rail, the\n active tab lit by a luminous beam (::after) that slides in on scaleX.\n Hover previews a half-length dim beam. */\n.entity-drawer-tabs {\n display: flex;\n justify-content: space-between;\n margin: 0 12px 12px;\n border-bottom: 1px solid var(--sy-border-subtle);\n}\n\n.entity-drawer-tab {\n position: relative;\n padding: 6px 10px 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n cursor: pointer;\n border: none;\n background: transparent;\n color: var(--sy-text-mm);\n transition: color 0.18s;\n white-space: nowrap;\n}\n\n.entity-drawer-tab::after {\n content: "";\n position: absolute;\n left: 10px;\n right: 10px;\n bottom: -1px;\n height: 2px;\n border-radius: 1px;\n background: var(--sy-accent);\n transform: scaleX(0);\n transform-origin: center;\n opacity: 0;\n transition: transform 0.22s ease, opacity 0.22s ease;\n}\n\n.entity-drawer-tab:hover {\n color: var(--sy-text);\n}\n\n.entity-drawer-tab:hover::after {\n transform: scaleX(0.45);\n opacity: 0.45;\n}\n\n.entity-drawer-tab.active {\n color: var(--sy-text-pp);\n}\n\n.entity-drawer-tab.active::after {\n transform: scaleX(1);\n opacity: 1;\n box-shadow: 0 0 8px var(--sy-accent-border);\n}\n\n/* Tab content area */\n.entity-drawer-content {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n padding: 0 24px 24px;\n}\n\n/* Attributes tab: tight 2px horizontal padding so the grid uses max width */\n.entity-drawer-content.tab-attributes {\n padding: 0 2px 24px;\n}\n\n/* Attribute rows - blipkit compact style */\n.attr-row {\n display: grid;\n grid-template-columns: 20px 100px 1fr 100px 20px 24px;\n gap: 0;\n height: 28px;\n font-size: 11px;\n color: var(--sy-text);\n align-items: center;\n border: none;\n}\n\n/* Attr group wraps row + enum expansion */\n.attr-group {\n position: relative;\n}\n\n.attr-row[draggable] {\n cursor: grab;\n}\n\n.attr-row:hover {\n background: var(--modeling-overlay-bg-hover);\n border-radius: 2px;\n}\n\n.attr-row.attr-dragging {\n opacity: 0.3;\n}\n\n.attr-row.attr-drag-over {\n border-top: 2px solid var(--sy-accent);\n margin-top: -2px;\n}\n\n.attr-row:focus-within {\n background: var(--modeling-overlay-bg-hover);\n border-radius: 2px;\n}\n\n.attr-header {\n height: 28px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--sy-text-m);\n border-bottom: none;\n}\n\n.attr-header:hover {\n background: none;\n margin: 0;\n padding: 0;\n}\n\n.attr-constraint {\n font-size: 11px;\n color: var(--sy-text-p);\n}\n\n/* unique+mandatory (natural key) — same # glyph as unique, key-tinted */\n.constraint-natural-key {\n color: var(--sy-key);\n}\n\n.attr-row:hover .attr-name {\n color: var(--sy-text-pp);\n}\n\n.attr-name {\n font-weight: 500;\n font-size: 11px;\n color: var(--sy-text-p);\n}\n\n.attr-type {\n font-size: 11px;\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--sy-text-p);\n}\n\n.attr-delete {\n background: none;\n border: none;\n cursor: pointer;\n opacity: 0;\n color: var(--sy-text-m);\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: opacity 0.2s ease-in-out;\n}\n\n.attr-row:hover .attr-delete {\n opacity: 0.5;\n}\n\n.attr-delete:hover {\n opacity: 1 !important;\n color: var(--modeling-removed-text);\n}\n\n/* Attribute guard — deny-list toggle (see guard-cell). Hover-reveal like\n .attr-delete when unguarded; stays visible + tinted once a role is\n actually denied so guarded attributes are scannable at a glance. */\n.attr-guard {\n background: none;\n border: none;\n cursor: pointer;\n opacity: 0;\n color: var(--sy-text-m);\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: opacity 0.2s ease-in-out;\n}\n\n.attr-row:hover .attr-guard {\n opacity: 0.5;\n}\n\n.attr-guard:hover {\n opacity: 1 !important;\n}\n\n.attr-guard.active {\n opacity: 1;\n color: var(--sy-warn, #b7791f);\n}\n\n.attr-guard:disabled {\n cursor: not-allowed;\n}\n\n.attr-row:hover .attr-guard:disabled {\n opacity: 0.2;\n}\n\n/* Attribute access-policy modal — reuses .guard-modal chrome (backdrop,\n header, search, footer) from the RLS path selector; only the Role x\n {Read, Write} grid below is specific. Narrower than the path selector:\n three columns, not path visualizations. */\n.attr-policy-modal {\n width: 460px;\n}\n\n/* Shared grid so the fixed header lines up with the scrolling rows */\n.attr-policy-head,\n.attr-policy-row {\n display: grid;\n grid-template-columns: 1fr 56px 56px;\n align-items: center;\n gap: 0;\n}\n\n.attr-policy-head {\n padding: 0 24px 6px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--sy-text-m);\n}\n\n.attr-policy-head span:not(:first-child) {\n text-align: center;\n}\n\n/* Constant height (~6 rows) so the modal doesn\'t resize as you filter */\n.attr-policy-list {\n overflow-y: auto;\n padding: 0 24px 16px;\n height: 240px;\n flex: none;\n}\n\n.attr-policy-row {\n height: 34px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.attr-policy-row:last-child {\n border-bottom: none;\n}\n\n.attr-policy-role {\n font-size: 12px;\n color: var(--sy-text-p);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.attr-policy-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n}\n\n.attr-policy-hint {\n font-size: 11px;\n color: var(--sy-text-mm);\n}\n\n/* Classification — metadata, not enforcement. Fixed strip above the\n access grid; tags that also drive audit redaction are marked. */\n.attr-class-section {\n padding: 0 24px 12px;\n}\n\n.attr-class-label {\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--sy-text-m);\n padding-bottom: 6px;\n}\n\n.attr-class-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.attr-class-chip {\n padding: 4px 10px;\n border-radius: 999px;\n border: 1px solid var(--modeling-overlay-border);\n background: transparent;\n color: var(--sy-text-m);\n font-size: 11px;\n font-family: inherit;\n cursor: pointer;\n transition:\n border-color 0.15s,\n color 0.15s,\n background 0.15s;\n}\n\n.attr-class-chip:hover {\n border-color: var(--sy-text-mm);\n color: var(--sy-text);\n}\n\n.attr-class-chip.on {\n border-color: var(--sy-accent);\n color: var(--sy-text-pp);\n background: var(--sy-accent-tint);\n}\n\n/* Tags that withhold values from the audit trail read as a warning, not\n a neutral selection — the consequence is data NOT being recorded. */\n.attr-class-chip.on.redacting {\n border-color: var(--sy-warn, #b7791f);\n color: var(--sy-warn, #b7791f);\n background: color-mix(in srgb, var(--sy-warn, #b7791f) 12%, transparent);\n}\n\n.attr-class-hint {\n font-size: 11px;\n color: var(--sy-text-mm);\n padding-top: 8px;\n line-height: 1.4;\n}\n\n/* Row indicator — a classified attribute is scannable without opening\n the modal, same idea as the amber guard shield. */\n.attr-class-dot {\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: var(--sy-warn, #b7791f);\n margin-left: 4px;\n flex-shrink: 0;\n}\n\n/* Enum chevron */\n.enum-chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: var(--sy-text-m);\n transition:\n transform 0.25s ease-in-out,\n color 0.15s;\n transform: rotate(0deg);\n}\n\n.enum-chevron:hover {\n color: var(--sy-text-pp);\n}\n\n.enum-chevron.expanded {\n transform: rotate(90deg);\n}\n\n/* Enum values list — animated wrapper */\n.enum-wrapper {\n height: 0;\n overflow: hidden;\n transition: height 0.25s ease-in-out;\n}\n\n.enum-inner {\n padding: 8px 24px 8px 20px;\n}\n\n.enum-box {\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n padding: 6px 8px;\n}\n\n.enum-row {\n display: flex;\n align-items: center;\n gap: 8px;\n height: 28px;\n font-size: 12px;\n font-weight: 500;\n color: var(--sy-text-p);\n}\n\n.enum-toggle {\n cursor: pointer;\n display: flex;\n align-items: center;\n color: var(--sy-text-mm);\n transition: color 0.15s;\n}\n\n.enum-toggle.active {\n color: var(--sy-accent);\n}\n\n.enum-name {\n flex: 1;\n background: transparent;\n border: none;\n outline: none;\n font-size: 12px;\n font-weight: 500;\n color: var(--sy-text-p);\n font-family: inherit;\n padding: 0;\n user-select: none;\n}\n\n.enum-row.inactive .enum-name {\n color: var(--sy-text-mm);\n}\n\n.enum-name::placeholder {\n color: var(--sy-text-mm);\n font-weight: 400;\n}\n\n.enum-delete {\n cursor: pointer;\n opacity: 0;\n color: var(--sy-text-m);\n display: flex;\n align-items: center;\n transition: opacity 0.2s;\n}\n\n.enum-row:hover .enum-delete {\n opacity: 0.5;\n}\n\n.enum-delete:hover {\n opacity: 1 !important;\n color: var(--modeling-removed-text);\n}\n\n/* Constraints tab: empty state when no attributes are marked unique */\n.constraints-empty {\n margin-top: 8px;\n padding: 16px;\n border: 1px dashed var(--modeling-overlay-border);\n border-radius: 6px;\n text-align: center;\n}\n\n.constraints-empty-title {\n margin: 0 0 6px;\n font-size: 13px;\n font-weight: 600;\n color: var(--sy-text-p);\n}\n\n.constraints-empty-hint {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--sy-text-mm);\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Constraint Groups (unique constraint DnD)\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.constraint-groups {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding-top: 8px;\n}\n\n.constraint-group {\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n padding: 10px;\n min-height: 44px;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n transition:\n border-color 0.15s,\n background 0.15s;\n}\n\n.constraint-group.empty {\n border-style: dashed;\n justify-content: center;\n}\n\n.constraint-group.drag-over {\n border-color: var(--sy-accent);\n background: var(--modeling-overlay-bg-hover);\n}\n\n.constraint-group.drag-over .constraint-empty {\n display: none;\n}\n\n.constraint-empty {\n font-size: 11px;\n color: var(--sy-text-mm);\n user-select: none;\n pointer-events: none;\n}\n\n.constraint-chip {\n background: var(--modeling-overlay-bg-hover);\n border: 1px solid var(--modeling-overlay-border);\n padding: 4px 10px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n color: var(--sy-text-p);\n cursor: grab;\n user-select: none;\n transition:\n opacity 0.15s,\n box-shadow 0.15s;\n}\n\n.constraint-chip:hover {\n box-shadow: var(--modeling-shadow-md);\n}\n\n.constraint-chip.dragging {\n opacity: 0.3;\n}\n\n/* During drag, chips in target group shouldn\'t steal events */\n.constraint-group.drag-over .constraint-chip {\n pointer-events: none;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Toggle Switch\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.sy-toggle {\n position: relative;\n width: 40px;\n height: 22px;\n min-width: 40px;\n border-radius: 12px;\n border: none;\n padding: 0;\n cursor: pointer;\n background: var(--modeling-overlay-border);\n transition: background 0.2s;\n flex-shrink: 0;\n}\n\n.sy-toggle.active {\n background: var(--sy-accent);\n}\n\n.sy-toggle-thumb {\n position: absolute;\n top: 3px;\n left: 3px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--modeling-button-text);\n box-shadow: var(--modeling-shadow-sm);\n transition: left 0.2s;\n pointer-events: none;\n}\n\n.sy-toggle.active .sy-toggle-thumb {\n left: 20px;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Guard Tab\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.guard-card {\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n padding: 16px;\n margin: 8px 0 12px;\n}\n\n.guard-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.guard-status {\n font-size: 15px;\n font-weight: 600;\n color: var(--sy-text-m);\n}\n\n.guard-status.active {\n color: var(--sy-accent);\n}\n\n.guard-description {\n font-size: 12px;\n line-height: 1.6;\n color: var(--sy-text-m);\n margin: 10px 0 0;\n}\n\n/* Guard rows container */\n.guard-rows {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding-top: 4px;\n}\n\n/* Individual guard row */\n.guard-row {\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n transition: border-color 0.15s;\n}\n\n.guard-row:hover {\n border-color: var(--sy-text-mm);\n}\n\n/* Guard row header: edit + ops + delete */\n.guard-row-header {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 10px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.guard-row-spacer {\n flex: 1;\n}\n\n.guard-edit-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: var(--sy-text-mm);\n border-radius: 4px;\n transition: color 0.15s;\n}\n\n.guard-edit-btn:hover {\n color: var(--sy-text);\n}\n\n/* Operation pill */\n.guard-op {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px 8px;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n color: var(--sy-text-mm);\n background: transparent;\n border: 1px solid var(--modeling-overlay-border);\n transition: all 0.15s;\n user-select: none;\n}\n\n.guard-op:hover {\n border-color: var(--sy-text-m);\n color: var(--sy-text);\n}\n\n.guard-op.active {\n background: var(--sy-accent);\n border-color: var(--sy-accent);\n color: var(--modeling-button-text);\n}\n\n/* Guard delete button */\n.guard-delete {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: var(--sy-text-mm);\n opacity: 0;\n transition:\n opacity 0.15s,\n color 0.15s;\n}\n\n.guard-row:hover .guard-delete {\n opacity: 0.6;\n}\n\n.guard-delete:hover {\n opacity: 1 !important;\n color: var(--modeling-removed-text);\n}\n\n/* Guard row paths area */\n.guard-row-paths {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 10px 12px;\n}\n\n/* Path display wrapper */\n.guard-path-display {\n padding: 6px 8px;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 4px;\n}\n\n/* AND/OR separators */\n.guard-and-separator {\n display: flex;\n justify-content: center;\n padding: 2px 0;\n}\n\n.guard-and-separator span {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--sy-accent);\n}\n\n.guard-or-separator {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 6px 0;\n}\n\n.guard-or-line {\n flex: 1;\n height: 1px;\n background: var(--modeling-overlay-border);\n}\n\n.guard-or-text {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--sy-accent);\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Path Visual Components\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n/* Path content: horizontal flow of steps + arrows */\n.guard-path-content {\n display: flex;\n align-items: flex-end;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.guard-path-steps-group {\n display: flex;\n align-items: flex-end;\n gap: 6px;\n}\n\n/* Path step: relation label on top, entity chip below */\n.guard-path-step {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n}\n\n.guard-path-step-label {\n font-size: 10px;\n color: var(--sy-text-mm);\n font-style: italic;\n text-align: center;\n white-space: nowrap;\n}\n\n.guard-path-step-chip {\n padding: 3px 8px;\n border-radius: 4px;\n background: var(--modeling-overlay-bg-hover);\n border: 1px solid var(--modeling-overlay-border);\n color: var(--sy-text-p);\n font-size: 11px;\n font-weight: 500;\n text-align: center;\n white-space: nowrap;\n}\n\n.guard-path-step-chip.ref {\n border-color: var(--sy-accent);\n}\n\n/* Arrow between steps */\n.guard-path-arrow {\n display: flex;\n align-items: flex-end;\n padding-bottom: 4px;\n color: var(--sy-text-mm);\n font-size: 13px;\n}\n\n/* Target icon (user/group/role) */\n.guard-target-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n margin-left: auto;\n color: var(--sy-accent);\n}\n\n/* Path ID label */\n.guard-path-id {\n font-size: 10px;\n font-weight: 700;\n color: var(--sy-text-mm);\n min-width: 16px;\n text-align: center;\n padding-bottom: 4px;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Path Selector Modal\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n/* Modal backdrop - covers entire modeling area */\n.guard-modal-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 2000;\n background: var(--modeling-modal-backdrop);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Modal dialog */\n.guard-modal {\n width: 620px;\n max-width: calc(100vw - 48px);\n max-height: calc(100vh - 80px);\n background: var(--modeling-overlay-bg);\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 12px;\n box-shadow: var(--modeling-shadow-modal);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.guard-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px 16px;\n font-size: 18px;\n font-weight: 600;\n color: var(--sy-text-pp);\n}\n\n.guard-modal-close {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--sy-text-mm);\n padding: 4px;\n border-radius: 4px;\n transition: color 0.15s;\n}\n\n.guard-modal-close:hover {\n color: var(--sy-text);\n}\n\n.guard-modal-search {\n padding: 0 24px 12px;\n}\n\n.guard-modal-search input {\n width: 100%;\n padding: 10px 14px;\n border-radius: 6px;\n border: 1px solid var(--modeling-overlay-border);\n background: transparent;\n color: var(--sy-text);\n font-size: 14px;\n font-family: inherit;\n outline: none;\n box-sizing: border-box;\n}\n\n.guard-modal-search input:focus {\n border-color: var(--sy-accent);\n}\n\n.guard-modal-count {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n color: var(--sy-accent);\n padding: 0 24px 8px;\n min-height: 14px; /* always occupies one line — no layout jump on select */\n}\n\n.guard-modal-count.none {\n color: var(--sy-text-mm);\n font-weight: 400;\n font-style: italic;\n text-transform: none;\n}\n\n/* Scrollable path list — CONSTANT height (~5 items) regardless of option\n count, with breathing room at the bottom of the scroll run. */\n.guard-modal-list {\n overflow-y: auto;\n padding: 0 24px 16px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n /* 5 × item (2px borders + 10px padding ×2 + ~44px content) + 4 gaps */\n height: 364px;\n flex: none;\n}\n\n/* Selectable path item in modal */\n.guard-modal-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n border: 2px solid var(--modeling-overlay-border);\n border-radius: 6px;\n cursor: pointer;\n transition:\n border-color 0.15s,\n background 0.15s;\n}\n\n.guard-modal-item:hover {\n border-color: var(--sy-text-mm);\n background: var(--modeling-overlay-bg-hover);\n}\n\n.guard-modal-item.selected {\n border-color: var(--sy-accent);\n}\n\n/* Selection check circle */\n.guard-selector-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n min-width: 20px;\n border-radius: 50%;\n border: 2px solid var(--modeling-overlay-border);\n color: transparent;\n transition: all 0.15s;\n flex-shrink: 0;\n}\n\n.guard-selector-check.active {\n background: var(--sy-accent);\n border-color: var(--sy-accent);\n color: var(--modeling-button-text);\n}\n\n/* Modal footer */\n.guard-modal-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-top: 1px solid var(--modeling-overlay-border);\n}\n\n.guard-modal-warnings {\n flex: 1;\n min-height: 15px; /* reserve the warning line — footer never jumps */\n}\n\n.guard-selector-warning {\n font-size: 12px;\n font-weight: 500;\n color: var(--modeling-removed-text);\n}\n\n.guard-modal-buttons {\n display: flex;\n gap: 8px;\n margin-left: 16px;\n}\n\n.guard-modal-cancel,\n.guard-modal-save {\n padding: 8px 20px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n border: 1px solid var(--modeling-overlay-border);\n background: transparent;\n color: var(--sy-text);\n transition: all 0.15s;\n}\n\n.guard-modal-cancel:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.guard-modal-save {\n background: var(--sy-accent);\n border-color: var(--sy-accent);\n color: var(--modeling-button-text);\n}\n\n.guard-modal-save:hover {\n opacity: 0.9;\n}\n\n.guard-modal-save.disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* No paths message */\n.guard-no-paths {\n font-size: 12px;\n color: var(--sy-text-mm);\n padding: 12px 0;\n text-align: center;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Access Tab\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.access-section {\n margin-bottom: 20px;\n padding-top: 8px;\n}\n\n.access-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.access-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--sy-text-p);\n}\n\n.audit-option {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n cursor: pointer;\n}\n\n.audit-option span {\n color: var(--sy-text-mm);\n transition: color 0.15s;\n}\n\n.audit-option.active span {\n color: var(--sy-text);\n}\n\n/* Access tab: scoped scroll — tab body stays fixed, matrix scrolls */\n.entity-drawer-content.tab-access {\n overflow: hidden;\n}\n\n.access-tab-body {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n}\n\n/* Role filter input */\n.access-filter {\n margin-bottom: 8px;\n}\n\n.access-filter input {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n background: transparent;\n color: var(--sy-text);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n box-sizing: border-box;\n transition: border-color 0.15s;\n}\n\n.access-filter input:focus {\n border-color: var(--sy-accent);\n}\n\n.access-filter input::placeholder {\n color: var(--sy-text-mm);\n}\n\n/* Header + scroll wrapper — the header sits OUTSIDE the scrolling area (its\n own fixed row) rather than `position: sticky` inside it. Sticky-in-overflow\n made the header\'s own right-edge padding (for the scrollbar gutter, below)\n piggyback on the scroll container\'s box model, which is fragile; a plain\n non-scrolling header row sidesteps that entirely. This box owns the border\n + rounded corners for the whole table; .access-scroll below is just the\n clipped, scrolling body. */\n.access-table {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.access-scroll {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Role access matrix */\n.access-matrix {\n display: flex;\n flex-direction: column;\n}\n\n/* Flex, not grid — a fixed grid-template-columns can\'t adapt to the actual\n op count (6 for entities since CRUDOB, 3 for relations); flex anchors\n whatever .access-col\n slots are present flush to the right, with .access-role-name eating the\n rest. Each row (not the scroll wrapper) carries its own right padding, so\n the columns clear the scrollbar gutter regardless of what wraps them. */\n.access-matrix-header,\n.access-matrix-row {\n display: flex;\n align-items: center;\n padding-right: 8px;\n}\n\n.access-matrix-header {\n flex: none;\n background: var(--sy-bg-band);\n border-bottom: 1px solid var(--modeling-overlay-border);\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--sy-text-mm);\n}\n\n.access-matrix-row {\n border-bottom: 1px solid var(--modeling-overlay-border);\n transition: background 0.15s;\n}\n\n.access-matrix-row:last-child {\n border-bottom: none;\n}\n\n.access-matrix-row:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.access-role-name {\n flex: 1 1 auto;\n min-width: 0;\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--sy-text-p);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.access-matrix-header .access-role-name {\n font-size: 10px;\n font-weight: 700;\n color: var(--sy-text-mm);\n}\n\n/* Fixed-width column slot — anchors headers and row cells to the same\n 36px track regardless of how many op columns the drawer defines. */\n.access-col {\n flex: 0 0 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.access-col-header {\n padding: 8px 0;\n cursor: default;\n}\n\n.access-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 4px;\n background: transparent;\n color: transparent;\n cursor: pointer;\n transition: all 0.15s;\n padding: 0;\n}\n\n.access-cell:hover {\n border-color: var(--sy-text-mm);\n}\n\n.access-cell.granted {\n background: var(--sy-accent);\n border-color: var(--sy-accent);\n color: var(--modeling-button-text);\n}\n\n/* Implied, not held: O grants every op, B grants read — the cell is already\n effectively on, so show it lit but hollow (dashed, tinted) to distinguish\n "you granted this" from "this comes for free". Still clickable: clicking\n adds the explicit grant, which is a no-op access-wise but harmless. */\n.access-cell.implied {\n background: var(--sy-accent-soft, transparent);\n border-style: dashed;\n border-color: var(--sy-accent-border, var(--sy-accent));\n color: var(--sy-accent);\n opacity: 0.65;\n}\n\n.access-cell.granted:hover {\n opacity: 0.85;\n}\n\n.access-empty,\n.access-deploy-gate {\n font-size: 12px;\n color: var(--sy-text-mm);\n padding: 12px;\n text-align: center;\n border: 1px dashed var(--modeling-overlay-border);\n border-radius: 6px;\n}\n\n/* Add action - ghost button */\n.add-action {\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n background: transparent;\n border: none;\n padding: 4px 0;\n color: var(--sy-text-m);\n transition: color 0.15s;\n}\n\n.add-action:hover {\n color: var(--sy-text-p);\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Attribute name conflict / reactivation hints\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.attr-row.attr-has-conflict .attr-name {\n color: var(--modeling-removed-text);\n}\n\n.attr-conflict-error {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n margin: 2px 0 6px 28px;\n font-size: 11px;\n color: var(--modeling-removed-text);\n}\n\n.attr-conflict-error code {\n padding: 0 4px;\n border-radius: 3px;\n background: var(--modeling-removed-tint-strong);\n color: var(--modeling-removed-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 10.5px;\n}\n\n.attr-reactivate-hint {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n margin: 2px 0 6px 28px;\n font-size: 11px;\n color: var(--sy-text-m);\n}\n\n.attr-reactivate-hint strong {\n font-weight: 600;\n color: var(--sy-text);\n}\n\n.attr-reactivate-btn {\n margin-left: 4px;\n padding: 2px 8px;\n border: 1px solid var(--sy-accent);\n border-radius: 4px;\n background: transparent;\n color: var(--sy-accent);\n font-size: 10.5px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.attr-reactivate-btn:hover {\n background: var(--modeling-entity-selected-header);\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Configuration rot — broken rule diagnostics\n A quiet-but-unmistakable hazard surface: gutter\n accent + faint diagonal hazard stripes, ghost\n chip for the dead reference, verdict note.\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n@keyframes rot-reveal {\n from { opacity: 0; transform: translateY(-2px); }\n to { opacity: 1; transform: none; }\n}\n\n.guard-rot {\n position: relative;\n padding: 7px 10px 8px 12px;\n border: 1px solid var(--modeling-rot-border);\n border-left: 3px solid var(--modeling-rot-text);\n border-radius: 4px;\n background:\n repeating-linear-gradient(\n -45deg,\n transparent 0 7px,\n color-mix(in srgb, var(--modeling-rot-text) 4%, transparent) 7px 8px),\n var(--modeling-rot-fill);\n animation: rot-reveal 160ms ease-out;\n}\n\n/* header: icon · title · kind ─────────── remove */\n.guard-rot-header {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.guard-rot-icon {\n display: flex;\n align-items: center;\n color: var(--modeling-rot-text);\n flex: none;\n}\n\n.guard-rot-title {\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--modeling-rot-text);\n white-space: nowrap;\n}\n\n.guard-rot-kind {\n font-size: 10px;\n font-style: italic;\n color: var(--sy-text-m);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.guard-rot-remove {\n margin-left: auto;\n flex: none;\n padding: 2px 9px;\n border: 1px solid var(--modeling-rot-border);\n border-radius: 3px;\n background: transparent;\n color: var(--modeling-rot-text);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.02em;\n cursor: pointer;\n transition: background 120ms ease, color 120ms ease, border-color 120ms ease;\n}\n\n.guard-rot-remove:hover {\n background: var(--modeling-rot-text);\n border-color: var(--modeling-rot-text);\n color: var(--modeling-rot-fill);\n}\n\n/* body: the dead reference, rendered as a ghost chip */\n.guard-rot-body {\n display: flex;\n align-items: baseline;\n gap: 8px;\n margin-top: 6px;\n flex-wrap: wrap;\n}\n\n.guard-rot-ghost {\n padding: 2px 8px;\n border: 1px dashed var(--modeling-rot-border);\n border-radius: 4px;\n background: color-mix(in srgb, var(--modeling-rot-text) 6%, transparent);\n color: var(--modeling-rot-text);\n font-family: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;\n font-size: 10px;\n letter-spacing: 0.01em;\n opacity: 0.85;\n}\n\n.guard-rot-ghost-label {\n font-size: 10px;\n font-style: italic;\n color: var(--sy-text-m);\n}\n\n/* verdict note */\n.guard-rot-note {\n margin: 6px 0 0;\n font-size: 10px;\n line-height: 1.45;\n color: var(--sy-text-m);\n}\n\n.guard-rot-note strong {\n color: var(--modeling-rot-text);\n font-weight: 600;\n}\n\n/* constraints-tab variant: banner spacing above the groups */\n.constraint-rot {\n margin-bottom: 10px;\n}\n\n.constraint-rot-groups {\n gap: 6px;\n}\n');
|
|
3518
|
+
case "top-end":return new R(null,4,5,S,[KF,cN,Xv,fJ],null);default:return new R(null,4,5,S,[fJ,Xv,cN,KF],null)}}(),e,f),t=N(r);r=v(t,WL);t=v(t,VL);n.style.left=[p.g(r),"px"].join("");n.style.top=[p.g(t),"px"].join("");n.style.opacity="1";n.style.transform="scale(1)";return n.style.pointerEvents="auto"})}],null),b],null),null,1,null),2,null)}return null};var Pna=new CSSStyleSheet;Pna.replaceSync('/* Entity Edit Drawer - floating right panel */\n\n.entity-drawer {\n position: absolute;\n top: 12px;\n right: 12px;\n bottom: 12px;\n width: 520px;\n max-width: calc(100% - 24px);\n z-index: 1101;\n display: flex;\n flex-direction: column;\n background: var(--modeling-overlay-bg);\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 12px;\n box-shadow: var(--modeling-shadow-xl);\n color: var(--sy-text);\n overflow: hidden;\n}\n\n/* Header - blipkit style: title bar + name */\n.entity-drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.entity-drawer-title {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--sy-text-m);\n}\n\n.entity-drawer-title .title-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: var(--sy-text-mm);\n transition: color 0.2s;\n}\n\n.entity-drawer-title .title-icon:hover {\n color: var(--sy-text-p);\n}\n\n.entity-drawer-actions {\n display: flex;\n gap: 16px;\n align-items: center;\n}\n\n.entity-drawer-actions button {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: var(--sy-text-mm);\n transition: color 0.15s;\n}\n\n.entity-drawer-actions button:hover {\n color: var(--sy-text-pp);\n}\n\n.entity-drawer-actions button.action-danger:hover {\n color: var(--modeling-removed-text);\n}\n\n/* Entity name below header */\n.entity-drawer-name {\n font-size: 22px;\n font-weight: 800;\n color: var(--sy-text-pp);\n border: none;\n outline: none;\n background: transparent;\n padding: 16px 24px 12px;\n width: 100%;\n font-family: inherit;\n line-height: 1.2;\n box-sizing: border-box;\n}\n\n.entity-drawer-name::placeholder {\n color: var(--sy-text-mm);\n}\n\n.entity-drawer-name.has-conflict {\n color: var(--modeling-removed-text);\n}\n\n.entity-drawer-name-error {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 24px 8px;\n font-size: 11.5px;\n color: var(--modeling-removed-text);\n flex-wrap: wrap;\n}\n\n.entity-drawer-name-error code {\n padding: 1px 5px;\n border-radius: 3px;\n background: var(--modeling-removed-tint-strong);\n color: var(--modeling-removed-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n}\n\n.entity-drawer-name-error strong {\n font-weight: 600;\n}\n\n/* Tabs — HUD style: uppercase micro-labels over a hairline rail, the\n active tab lit by a luminous beam (::after) that slides in on scaleX.\n Hover previews a half-length dim beam. */\n.entity-drawer-tabs {\n display: flex;\n justify-content: space-between;\n margin: 0 12px 12px;\n border-bottom: 1px solid var(--sy-border-subtle);\n}\n\n.entity-drawer-tab {\n position: relative;\n padding: 6px 10px 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n cursor: pointer;\n border: none;\n background: transparent;\n color: var(--sy-text-mm);\n transition: color 0.18s;\n white-space: nowrap;\n}\n\n.entity-drawer-tab::after {\n content: "";\n position: absolute;\n left: 10px;\n right: 10px;\n bottom: -1px;\n height: 2px;\n border-radius: 1px;\n background: var(--sy-accent);\n transform: scaleX(0);\n transform-origin: center;\n opacity: 0;\n transition: transform 0.22s ease, opacity 0.22s ease;\n}\n\n.entity-drawer-tab:hover {\n color: var(--sy-text);\n}\n\n.entity-drawer-tab:hover::after {\n transform: scaleX(0.45);\n opacity: 0.45;\n}\n\n.entity-drawer-tab.active {\n color: var(--sy-text-pp);\n}\n\n.entity-drawer-tab.active::after {\n transform: scaleX(1);\n opacity: 1;\n box-shadow: 0 0 8px var(--sy-accent-border);\n}\n\n/* Tab content area */\n.entity-drawer-content {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n padding: 0 24px 24px;\n}\n\n/* Attributes tab: tight 2px horizontal padding so the grid uses max width */\n.entity-drawer-content.tab-attributes {\n padding: 0 2px 24px;\n}\n\n/* Attribute rows - blipkit compact style */\n.attr-row {\n display: grid;\n grid-template-columns: 20px 100px 1fr 100px 20px 24px;\n gap: 0;\n height: 28px;\n font-size: 11px;\n color: var(--sy-text);\n align-items: center;\n border: none;\n}\n\n/* Attr group wraps row + enum expansion */\n.attr-group {\n position: relative;\n}\n\n.attr-row[draggable] {\n cursor: grab;\n}\n\n.attr-row:hover {\n background: var(--modeling-overlay-bg-hover);\n border-radius: 2px;\n}\n\n.attr-row.attr-dragging {\n opacity: 0.3;\n}\n\n.attr-row.attr-drag-over {\n border-top: 2px solid var(--sy-accent);\n margin-top: -2px;\n}\n\n.attr-row:focus-within {\n background: var(--modeling-overlay-bg-hover);\n border-radius: 2px;\n}\n\n.attr-header {\n height: 28px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--sy-text-m);\n border-bottom: none;\n}\n\n.attr-header:hover {\n background: none;\n margin: 0;\n padding: 0;\n}\n\n.attr-constraint {\n font-size: 11px;\n color: var(--sy-text-p);\n}\n\n/* unique+mandatory (natural key) — same # glyph as unique, key-tinted */\n.constraint-natural-key {\n color: var(--sy-key);\n}\n\n.attr-row:hover .attr-name {\n color: var(--sy-text-pp);\n}\n\n.attr-name {\n font-weight: 500;\n font-size: 11px;\n color: var(--sy-text-p);\n}\n\n.attr-type {\n font-size: 11px;\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--sy-text-p);\n}\n\n.attr-delete {\n background: none;\n border: none;\n cursor: pointer;\n opacity: 0;\n color: var(--sy-text-m);\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: opacity 0.2s ease-in-out;\n}\n\n.attr-row:hover .attr-delete {\n opacity: 0.5;\n}\n\n.attr-delete:hover {\n opacity: 1 !important;\n color: var(--modeling-removed-text);\n}\n\n/* Attribute guard — deny-list toggle (see guard-cell). Hover-reveal like\n .attr-delete when unguarded; stays visible + tinted once a role is\n actually denied so guarded attributes are scannable at a glance. */\n.attr-guard {\n background: none;\n border: none;\n cursor: pointer;\n opacity: 0;\n color: var(--sy-text-m);\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: opacity 0.2s ease-in-out;\n}\n\n.attr-row:hover .attr-guard {\n opacity: 0.5;\n}\n\n.attr-guard:hover {\n opacity: 1 !important;\n}\n\n.attr-guard.active {\n opacity: 1;\n color: var(--sy-warn, #b7791f);\n}\n\n.attr-guard:disabled {\n cursor: not-allowed;\n}\n\n.attr-row:hover .attr-guard:disabled {\n opacity: 0.2;\n}\n\n/* Attribute access-policy modal — reuses .guard-modal chrome (backdrop,\n header, search, footer) from the RLS path selector; only the Role x\n {Read, Write} grid below is specific. Narrower than the path selector:\n three columns, not path visualizations. */\n.attr-policy-modal {\n width: 460px;\n}\n\n/* Shared grid so the fixed header lines up with the scrolling rows */\n.attr-policy-head,\n.attr-policy-row {\n display: grid;\n grid-template-columns: 1fr 56px 56px;\n align-items: center;\n gap: 0;\n}\n\n.attr-policy-head {\n padding: 0 24px 6px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--sy-text-m);\n}\n\n.attr-policy-head span:not(:first-child) {\n text-align: center;\n}\n\n/* Constant height (~6 rows) so the modal doesn\'t resize as you filter */\n.attr-policy-list {\n overflow-y: auto;\n padding: 0 24px 16px;\n height: 240px;\n flex: none;\n}\n\n.attr-policy-row {\n height: 34px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.attr-policy-row:last-child {\n border-bottom: none;\n}\n\n.attr-policy-role {\n font-size: 12px;\n color: var(--sy-text-p);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.attr-policy-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n}\n\n.attr-policy-hint {\n font-size: 11px;\n color: var(--sy-text-mm);\n}\n\n/* Classification — metadata, not enforcement. Fixed strip above the\n access grid; tags that also drive audit redaction are marked. */\n.attr-class-section {\n padding: 0 24px 12px;\n}\n\n.attr-class-label {\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--sy-text-m);\n padding-bottom: 6px;\n}\n\n.attr-class-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.attr-class-chip {\n padding: 4px 10px;\n border-radius: 999px;\n border: 1px solid var(--modeling-overlay-border);\n background: transparent;\n color: var(--sy-text-m);\n font-size: 11px;\n font-family: inherit;\n cursor: pointer;\n transition:\n border-color 0.15s,\n color 0.15s,\n background 0.15s;\n}\n\n.attr-class-chip:hover {\n border-color: var(--sy-text-mm);\n color: var(--sy-text);\n}\n\n.attr-class-chip.on {\n border-color: var(--sy-accent);\n color: var(--sy-text-pp);\n background: var(--sy-accent-tint);\n}\n\n/* Tags that withhold values from the audit trail read as a warning, not\n a neutral selection — the consequence is data NOT being recorded. */\n.attr-class-chip.on.redacting {\n border-color: var(--sy-warn, #b7791f);\n color: var(--sy-warn, #b7791f);\n background: color-mix(in srgb, var(--sy-warn, #b7791f) 12%, transparent);\n}\n\n.attr-class-hint {\n font-size: 11px;\n color: var(--sy-text-mm);\n padding-top: 8px;\n line-height: 1.4;\n}\n\n/* Row indicator — a classified attribute is scannable without opening\n the modal, same idea as the amber guard shield. */\n.attr-class-dot {\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: var(--sy-warn, #b7791f);\n margin-left: 4px;\n flex-shrink: 0;\n}\n\n/* Enum chevron */\n.enum-chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: var(--sy-text-m);\n transition:\n transform 0.25s ease-in-out,\n color 0.15s;\n transform: rotate(0deg);\n}\n\n.enum-chevron:hover {\n color: var(--sy-text-pp);\n}\n\n.enum-chevron.expanded {\n transform: rotate(90deg);\n}\n\n/* Enum values list — animated wrapper */\n.enum-wrapper {\n height: 0;\n overflow: hidden;\n transition: height 0.25s ease-in-out;\n}\n\n.enum-inner {\n padding: 8px 24px 8px 20px;\n}\n\n.enum-box {\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n padding: 6px 8px;\n}\n\n.enum-row {\n display: flex;\n align-items: center;\n gap: 8px;\n height: 28px;\n font-size: 12px;\n font-weight: 500;\n color: var(--sy-text-p);\n}\n\n.enum-toggle {\n cursor: pointer;\n display: flex;\n align-items: center;\n color: var(--sy-text-mm);\n transition: color 0.15s;\n}\n\n.enum-toggle.active {\n color: var(--sy-accent);\n}\n\n.enum-name {\n flex: 1;\n background: transparent;\n border: none;\n outline: none;\n font-size: 12px;\n font-weight: 500;\n color: var(--sy-text-p);\n font-family: inherit;\n padding: 0;\n user-select: none;\n}\n\n.enum-row.inactive .enum-name {\n color: var(--sy-text-mm);\n}\n\n.enum-name::placeholder {\n color: var(--sy-text-mm);\n font-weight: 400;\n}\n\n.enum-delete {\n cursor: pointer;\n opacity: 0;\n color: var(--sy-text-m);\n display: flex;\n align-items: center;\n transition: opacity 0.2s;\n}\n\n.enum-row:hover .enum-delete {\n opacity: 0.5;\n}\n\n.enum-delete:hover {\n opacity: 1 !important;\n color: var(--modeling-removed-text);\n}\n\n/* Constraints tab: empty state when no attributes are marked unique */\n.constraints-empty {\n margin-top: 8px;\n padding: 16px;\n border: 1px dashed var(--modeling-overlay-border);\n border-radius: 6px;\n text-align: center;\n}\n\n.constraints-empty-title {\n margin: 0 0 6px;\n font-size: 13px;\n font-weight: 600;\n color: var(--sy-text-p);\n}\n\n.constraints-empty-hint {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--sy-text-mm);\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Constraint Groups (unique constraint DnD)\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.constraint-groups {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding-top: 8px;\n}\n\n.constraint-group {\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n padding: 10px;\n min-height: 44px;\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n transition:\n border-color 0.15s,\n background 0.15s;\n}\n\n.constraint-group.empty {\n border-style: dashed;\n justify-content: center;\n}\n\n.constraint-group.drag-over {\n border-color: var(--sy-accent);\n background: var(--modeling-overlay-bg-hover);\n}\n\n.constraint-group.drag-over .constraint-empty {\n display: none;\n}\n\n.constraint-empty {\n font-size: 11px;\n color: var(--sy-text-mm);\n user-select: none;\n pointer-events: none;\n}\n\n.constraint-chip {\n background: var(--modeling-overlay-bg-hover);\n border: 1px solid var(--modeling-overlay-border);\n padding: 4px 10px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n color: var(--sy-text-p);\n cursor: grab;\n user-select: none;\n transition:\n opacity 0.15s,\n box-shadow 0.15s;\n}\n\n.constraint-chip:hover {\n box-shadow: var(--modeling-shadow-md);\n}\n\n.constraint-chip.dragging {\n opacity: 0.3;\n}\n\n/* During drag, chips in target group shouldn\'t steal events */\n.constraint-group.drag-over .constraint-chip {\n pointer-events: none;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Toggle Switch\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.sy-toggle {\n position: relative;\n width: 40px;\n height: 22px;\n min-width: 40px;\n border-radius: 12px;\n border: none;\n padding: 0;\n cursor: pointer;\n background: var(--modeling-overlay-border);\n transition: background 0.2s;\n flex-shrink: 0;\n}\n\n.sy-toggle.active {\n background: var(--sy-accent);\n}\n\n.sy-toggle-thumb {\n position: absolute;\n top: 3px;\n left: 3px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: var(--modeling-button-text);\n box-shadow: var(--modeling-shadow-sm);\n transition: left 0.2s;\n pointer-events: none;\n}\n\n.sy-toggle.active .sy-toggle-thumb {\n left: 20px;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Guard Tab\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.guard-card {\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n padding: 16px;\n margin: 8px 0 12px;\n}\n\n.guard-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.guard-status {\n font-size: 15px;\n font-weight: 600;\n color: var(--sy-text-m);\n}\n\n.guard-status.active {\n color: var(--sy-accent);\n}\n\n.guard-description {\n font-size: 12px;\n line-height: 1.6;\n color: var(--sy-text-m);\n margin: 10px 0 0;\n}\n\n/* Guard rows container */\n.guard-rows {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding-top: 4px;\n}\n\n/* Individual guard row */\n.guard-row {\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n transition: border-color 0.15s;\n}\n\n.guard-row:hover {\n border-color: var(--sy-text-mm);\n}\n\n/* Guard row header: edit + ops + delete */\n.guard-row-header {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 10px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.guard-row-spacer {\n flex: 1;\n}\n\n.guard-edit-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: var(--sy-text-mm);\n border-radius: 4px;\n transition: color 0.15s;\n}\n\n.guard-edit-btn:hover {\n color: var(--sy-text);\n}\n\n/* Operation pill */\n.guard-op {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px 8px;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n color: var(--sy-text-mm);\n background: transparent;\n border: 1px solid var(--modeling-overlay-border);\n transition: all 0.15s;\n user-select: none;\n}\n\n.guard-op:hover {\n border-color: var(--sy-text-m);\n color: var(--sy-text);\n}\n\n.guard-op.active {\n background: var(--sy-accent);\n border-color: var(--sy-accent);\n color: var(--modeling-button-text);\n}\n\n/* Guard delete button */\n.guard-delete {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: var(--sy-text-mm);\n opacity: 0;\n transition:\n opacity 0.15s,\n color 0.15s;\n}\n\n.guard-row:hover .guard-delete {\n opacity: 0.6;\n}\n\n.guard-delete:hover {\n opacity: 1 !important;\n color: var(--modeling-removed-text);\n}\n\n/* Guard row paths area */\n.guard-row-paths {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 10px 12px;\n}\n\n/* Path display wrapper */\n.guard-path-display {\n padding: 6px 8px;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 4px;\n}\n\n/* AND/OR separators */\n.guard-and-separator {\n display: flex;\n justify-content: center;\n padding: 2px 0;\n}\n\n.guard-and-separator span {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--sy-accent);\n}\n\n.guard-or-separator {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 6px 0;\n}\n\n.guard-or-line {\n flex: 1;\n height: 1px;\n background: var(--modeling-overlay-border);\n}\n\n.guard-or-text {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--sy-accent);\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Path Visual Components\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n/* Path content: horizontal flow of steps + arrows */\n.guard-path-content {\n display: flex;\n align-items: flex-end;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.guard-path-steps-group {\n display: flex;\n align-items: flex-end;\n gap: 6px;\n}\n\n/* Path step: relation label on top, entity chip below */\n.guard-path-step {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n}\n\n.guard-path-step-label {\n font-size: 10px;\n color: var(--sy-text-mm);\n font-style: italic;\n text-align: center;\n white-space: nowrap;\n}\n\n.guard-path-step-chip {\n padding: 3px 8px;\n border-radius: 4px;\n background: var(--modeling-overlay-bg-hover);\n border: 1px solid var(--modeling-overlay-border);\n color: var(--sy-text-p);\n font-size: 11px;\n font-weight: 500;\n text-align: center;\n white-space: nowrap;\n}\n\n.guard-path-step-chip.ref {\n border-color: var(--sy-accent);\n}\n\n/* Arrow between steps */\n.guard-path-arrow {\n display: flex;\n align-items: flex-end;\n padding-bottom: 4px;\n color: var(--sy-text-mm);\n font-size: 13px;\n}\n\n/* Target icon (user/group/role) */\n.guard-target-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n margin-left: auto;\n color: var(--sy-accent);\n}\n\n/* Path ID label */\n.guard-path-id {\n font-size: 10px;\n font-weight: 700;\n color: var(--sy-text-mm);\n min-width: 16px;\n text-align: center;\n padding-bottom: 4px;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Path Selector Modal\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n/* Modal backdrop - covers entire modeling area */\n.guard-modal-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 2000;\n background: var(--modeling-modal-backdrop);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Modal dialog */\n.guard-modal {\n width: 620px;\n max-width: calc(100vw - 48px);\n max-height: calc(100vh - 80px);\n background: var(--modeling-overlay-bg);\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 12px;\n box-shadow: var(--modeling-shadow-modal);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.guard-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px 16px;\n font-size: 18px;\n font-weight: 600;\n color: var(--sy-text-pp);\n}\n\n.guard-modal-close {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--sy-text-mm);\n padding: 4px;\n border-radius: 4px;\n transition: color 0.15s;\n}\n\n.guard-modal-close:hover {\n color: var(--sy-text);\n}\n\n.guard-modal-search {\n padding: 0 24px 12px;\n}\n\n.guard-modal-search input {\n width: 100%;\n padding: 10px 14px;\n border-radius: 6px;\n border: 1px solid var(--modeling-overlay-border);\n background: transparent;\n color: var(--sy-text);\n font-size: 14px;\n font-family: inherit;\n outline: none;\n box-sizing: border-box;\n}\n\n.guard-modal-search input:focus {\n border-color: var(--sy-accent);\n}\n\n.guard-modal-count {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n color: var(--sy-accent);\n padding: 0 24px 8px;\n min-height: 14px; /* always occupies one line — no layout jump on select */\n}\n\n.guard-modal-count.none {\n color: var(--sy-text-mm);\n font-weight: 400;\n font-style: italic;\n text-transform: none;\n}\n\n/* Scrollable path list — CONSTANT height (~5 items) regardless of option\n count, with breathing room at the bottom of the scroll run. */\n.guard-modal-list {\n overflow-y: auto;\n padding: 0 24px 16px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n /* 5 × item (2px borders + 10px padding ×2 + ~44px content) + 4 gaps */\n height: 364px;\n flex: none;\n}\n\n/* Selectable path item in modal */\n.guard-modal-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n border: 2px solid var(--modeling-overlay-border);\n border-radius: 6px;\n cursor: pointer;\n transition:\n border-color 0.15s,\n background 0.15s;\n}\n\n.guard-modal-item:hover {\n border-color: var(--sy-text-mm);\n background: var(--modeling-overlay-bg-hover);\n}\n\n.guard-modal-item.selected {\n border-color: var(--sy-accent);\n}\n\n/* Selection check circle */\n.guard-selector-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n min-width: 20px;\n border-radius: 50%;\n border: 2px solid var(--modeling-overlay-border);\n color: transparent;\n transition: all 0.15s;\n flex-shrink: 0;\n}\n\n.guard-selector-check.active {\n background: var(--sy-accent);\n border-color: var(--sy-accent);\n color: var(--modeling-button-text);\n}\n\n/* Modal footer */\n.guard-modal-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-top: 1px solid var(--modeling-overlay-border);\n}\n\n.guard-modal-warnings {\n flex: 1;\n min-height: 15px; /* reserve the warning line — footer never jumps */\n}\n\n.guard-selector-warning {\n font-size: 12px;\n font-weight: 500;\n color: var(--modeling-removed-text);\n}\n\n.guard-modal-buttons {\n display: flex;\n gap: 8px;\n margin-left: 16px;\n}\n\n.guard-modal-cancel,\n.guard-modal-save {\n padding: 8px 20px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n border: 1px solid var(--modeling-overlay-border);\n background: transparent;\n color: var(--sy-text);\n transition: all 0.15s;\n}\n\n.guard-modal-cancel:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.guard-modal-save {\n background: var(--sy-accent);\n border-color: var(--sy-accent);\n color: var(--modeling-button-text);\n}\n\n.guard-modal-save:hover {\n opacity: 0.9;\n}\n\n.guard-modal-save.disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* No paths message */\n.guard-no-paths {\n font-size: 12px;\n color: var(--sy-text-mm);\n padding: 12px 0;\n text-align: center;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Access Tab\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.access-section {\n margin-bottom: 20px;\n padding-top: 8px;\n}\n\n.access-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.access-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--sy-text-p);\n}\n\n.audit-option {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n cursor: pointer;\n}\n\n.audit-option span {\n color: var(--sy-text-mm);\n transition: color 0.15s;\n}\n\n.audit-option.active span {\n color: var(--sy-text);\n}\n\n/* Access tab: scoped scroll — tab body stays fixed, matrix scrolls */\n.entity-drawer-content.tab-access {\n overflow: hidden;\n}\n\n.access-tab-body {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n}\n\n/* Role filter input */\n.access-filter {\n margin-bottom: 8px;\n}\n\n.access-filter input {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n background: transparent;\n color: var(--sy-text);\n font-size: 13px;\n font-family: inherit;\n outline: none;\n box-sizing: border-box;\n transition: border-color 0.15s;\n}\n\n.access-filter input:focus {\n border-color: var(--sy-accent);\n}\n\n.access-filter input::placeholder {\n color: var(--sy-text-mm);\n}\n\n/* Header + scroll wrapper — the header sits OUTSIDE the scrolling area (its\n own fixed row) rather than `position: sticky` inside it. Sticky-in-overflow\n made the header\'s own right-edge padding (for the scrollbar gutter, below)\n piggyback on the scroll container\'s box model, which is fragile; a plain\n non-scrolling header row sidesteps that entirely. This box owns the border\n + rounded corners for the whole table; .access-scroll below is just the\n clipped, scrolling body. */\n.access-table {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.access-scroll {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Role access matrix */\n.access-matrix {\n display: flex;\n flex-direction: column;\n}\n\n/* Flex, not grid — a fixed grid-template-columns can\'t adapt to the actual\n op count (6 for entities since CRUDOB, 3 for relations); flex anchors\n whatever .access-col\n slots are present flush to the right, with .access-role-name eating the\n rest. Each row (not the scroll wrapper) carries its own right padding, so\n the columns clear the scrollbar gutter regardless of what wraps them. */\n.access-matrix-header,\n.access-matrix-row {\n display: flex;\n align-items: center;\n padding-right: 8px;\n}\n\n.access-matrix-header {\n flex: none;\n background: var(--sy-bg-band);\n border-bottom: 1px solid var(--modeling-overlay-border);\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--sy-text-mm);\n}\n\n.access-matrix-row {\n border-bottom: 1px solid var(--modeling-overlay-border);\n transition: background 0.15s;\n}\n\n.access-matrix-row:last-child {\n border-bottom: none;\n}\n\n.access-matrix-row:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.access-role-name {\n flex: 1 1 auto;\n min-width: 0;\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--sy-text-p);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.access-matrix-header .access-role-name {\n font-size: 10px;\n font-weight: 700;\n color: var(--sy-text-mm);\n}\n\n/* Fixed-width column slot — anchors headers and row cells to the same\n 36px track regardless of how many op columns the drawer defines. */\n.access-col {\n flex: 0 0 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.access-col-header {\n padding: 8px 0;\n cursor: default;\n}\n\n.access-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 4px;\n background: transparent;\n color: transparent;\n cursor: pointer;\n transition: all 0.15s;\n padding: 0;\n}\n\n.access-cell:hover {\n border-color: var(--sy-text-mm);\n}\n\n.access-cell.granted {\n background: var(--sy-accent);\n border-color: var(--sy-accent);\n color: var(--modeling-button-text);\n}\n\n/* Implied, not held: O grants every op, B grants read — the cell is already\n effectively on, so show it lit but hollow (dashed, tinted) to distinguish\n "you granted this" from "this comes for free". Still clickable: clicking\n adds the explicit grant, which is a no-op access-wise but harmless. */\n.access-cell.implied {\n background: var(--sy-accent-soft, transparent);\n border-style: dashed;\n border-color: var(--sy-accent-border, var(--sy-accent));\n color: var(--sy-accent);\n opacity: 0.65;\n}\n\n.access-cell.granted:hover {\n opacity: 0.85;\n}\n\n.access-empty,\n.access-deploy-gate {\n font-size: 12px;\n color: var(--sy-text-mm);\n padding: 12px;\n text-align: center;\n border: 1px dashed var(--modeling-overlay-border);\n border-radius: 6px;\n}\n\n/* Add action - ghost button */\n.add-action {\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n background: transparent;\n border: none;\n padding: 4px 0;\n color: var(--sy-text-m);\n transition: color 0.15s;\n}\n\n.add-action:hover {\n color: var(--sy-text-p);\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Attribute name conflict / reactivation hints\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.attr-row.attr-has-conflict .attr-name {\n color: var(--modeling-removed-text);\n}\n\n.attr-conflict-error {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n margin: 2px 0 6px 28px;\n font-size: 11px;\n color: var(--modeling-removed-text);\n}\n\n.attr-conflict-error code {\n padding: 0 4px;\n border-radius: 3px;\n background: var(--modeling-removed-tint-strong);\n color: var(--modeling-removed-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 10.5px;\n}\n\n.attr-reactivate-hint {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n margin: 2px 0 6px 28px;\n font-size: 11px;\n color: var(--sy-text-m);\n}\n\n.attr-reactivate-hint strong {\n font-weight: 600;\n color: var(--sy-text);\n}\n\n.attr-reactivate-btn {\n margin-left: 4px;\n padding: 2px 8px;\n border: 1px solid var(--sy-accent);\n border-radius: 4px;\n background: transparent;\n color: var(--sy-accent);\n font-size: 10.5px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.attr-reactivate-btn:hover {\n background: var(--modeling-entity-selected-header);\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Configuration rot — broken rule diagnostics\n A quiet-but-unmistakable hazard surface: gutter\n accent + faint diagonal hazard stripes, ghost\n chip for the dead reference, verdict note.\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n\n@keyframes rot-reveal {\n from { opacity: 0; transform: translateY(-2px); }\n to { opacity: 1; transform: none; }\n}\n\n.guard-rot {\n position: relative;\n padding: 7px 10px 8px 12px;\n border: 1px solid var(--modeling-rot-border);\n border-left: 3px solid var(--modeling-rot-text);\n border-radius: 4px;\n background:\n repeating-linear-gradient(\n -45deg,\n transparent 0 7px,\n color-mix(in srgb, var(--modeling-rot-text) 4%, transparent) 7px 8px),\n var(--modeling-rot-fill);\n animation: rot-reveal 160ms ease-out;\n}\n\n/* header: icon · title · kind ─────────── remove */\n.guard-rot-header {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.guard-rot-icon {\n display: flex;\n align-items: center;\n color: var(--modeling-rot-text);\n flex: none;\n}\n\n.guard-rot-title {\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--modeling-rot-text);\n white-space: nowrap;\n}\n\n.guard-rot-kind {\n font-size: 10px;\n font-style: italic;\n color: var(--sy-text-m);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.guard-rot-remove {\n margin-left: auto;\n flex: none;\n padding: 2px 9px;\n border: 1px solid var(--modeling-rot-border);\n border-radius: 3px;\n background: transparent;\n color: var(--modeling-rot-text);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.02em;\n cursor: pointer;\n transition: background 120ms ease, color 120ms ease, border-color 120ms ease;\n}\n\n.guard-rot-remove:hover {\n background: var(--modeling-rot-text);\n border-color: var(--modeling-rot-text);\n color: var(--modeling-rot-fill);\n}\n\n/* body: the dead reference, rendered as a ghost chip */\n.guard-rot-body {\n display: flex;\n align-items: baseline;\n gap: 8px;\n margin-top: 6px;\n flex-wrap: wrap;\n}\n\n.guard-rot-ghost {\n padding: 2px 8px;\n border: 1px dashed var(--modeling-rot-border);\n border-radius: 4px;\n background: color-mix(in srgb, var(--modeling-rot-text) 6%, transparent);\n color: var(--modeling-rot-text);\n font-family: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;\n font-size: 10px;\n letter-spacing: 0.01em;\n opacity: 0.85;\n}\n\n.guard-rot-ghost-label {\n font-size: 10px;\n font-style: italic;\n color: var(--sy-text-m);\n}\n\n/* verdict note */\n.guard-rot-note {\n margin: 6px 0 0;\n font-size: 10px;\n line-height: 1.45;\n color: var(--sy-text-m);\n}\n\n.guard-rot-note strong {\n color: var(--modeling-rot-text);\n font-weight: 600;\n}\n\n/* constraints-tab variant: banner spacing above the groups */\n.constraint-rot {\n margin-bottom: 10px;\n}\n\n.constraint-rot-groups {\n gap: 6px;\n}\n');
|
|
3519
3519
|
var VBa=new R(null,13,5,S,"string int float boolean timestamp transit json enum encrypted hashed user group role".split(" "),null),WBa=new R(null,4,5,S,["optional","mandatory","unique","unique+mandatory"],null),XBa=new R(null,5,5,S,[new k(null,2,[lk,gN,gF,"Attributes"],null),new k(null,2,[lk,MC,gF,"Constraints"],null),new k(null,2,[lk,lka,gF,"Guard"],null),new k(null,2,[lk,xs,gF,"Access"],null),new k(null,2,[lk,NN,gF,"Audit"],null)],null);
|
|
3520
3520
|
function YBa(){var a=H7.g(Gw);return new R(null,2,5,S,[zN,function(){return function d(c){return new Wf(null,function(){for(;;){var e=A(c);if(e){var f=e;if(af(f)){var h=fd(f),m=H(h),n=$f(m);return function(){for(var y=0;;)if(y<m){var C=Ob(h,y),D=N(C),E=v(D,lk),G=v(D,gF);cg(n,Pe(new R(null,3,5,S,[nB,new k(null,2,[xm,z.h(E,a)?"active":null,Lu,new k(null,1,[Iu,function(K,O,P,T){return function(){return I7.h(hK,new k(null,1,[EF,T],null))}}(y,C,D,E,G,h,m,n,f,e,a)],null)],null),G],null),new k(null,1,[SH,
|
|
3521
3521
|
E],null)));y+=1}else return!0}()?bg(dg(n),d(gd(f))):bg(dg(n),null)}var r=B(f),t=N(r),u=v(t,lk),w=v(t,gF);return ye(Pe(new R(null,3,5,S,[nB,new k(null,2,[xm,z.h(u,a)?"active":null,Lu,new k(null,1,[Iu,function(y,C,D){return function(){return I7.h(hK,new k(null,1,[EF,D],null))}}(r,t,u,w,f,e,a)],null)],null),w],null),new k(null,1,[SH,u],null)),d(Vd(f)))}return null}},null,null)}(XBa)}()],null)}
|
|
@@ -3534,7 +3534,7 @@ return ye(Pe(new R(null,4,5,S,[Jr,new k(null,2,[xm,z.h(w,c)?"selected":null,Lu,n
|
|
|
3534
3534
|
function u$(a,b,c){i8();return I7.h(Ku,new k(null,1,[wM,function(d){return Gh.j(d,gN,function(e){return xh(function(f){if(z.h(mV(f),a)){var h=pW(f,b);h=jf(h,c)?Te.h(h,c):Ge.h(h,c);return xg(f,new R(null,4,5,S,[WH,Ey,ON,b],null),h)}return f},e)})}],null))}function v$(a,b){i8();return I7.h(Ku,new k(null,1,[wM,function(c){return Gh.j(c,gN,function(d){return xh(function(e){if(z.h(mV(e),a)){var f=M9(e);f=jf(f,b)?Te.h(f,b):Ge.h(f,b);e=xg(e,new R(null,2,5,S,[WH,Nz],null),Uj(f))}return e},d)})}],null))}
|
|
3535
3535
|
function bCa(a,b){var c=M9(a);return new R(null,4,5,S,[eea,new R(null,2,5,S,[UD,"Classification"],null),new R(null,2,5,S,[qea,function(){return function f(e){return new Wf(null,function(){for(;;){var h=A(e);if(h){var m=h;if(af(m)){var n=fd(m),r=H(n),t=$f(r);return function(){for(var y=0;;)if(y<r){var C=Ob(n,y),D=jf(c,C);cg(t,Pe(new R(null,3,5,S,[OH,new k(null,3,[xm,[D?"on":null,l(function(){var E=D;return E?L9.g?L9.g(C):L9.call(null,C):E}())?" redacting":null].join(""),nC,v(K9,C),Lu,new k(null,1,
|
|
3536
3536
|
[Iu,function(E,G,K){return function(){return v$(b,K)}}(y,D,C,n,r,t,m,h,c)],null)],null),Vf(C)],null),new k(null,1,[SH,C],null)));y+=1}else return!0}()?bg(dg(t),f(gd(m))):bg(dg(t),null)}var u=B(m),w=jf(c,u);return ye(Pe(new R(null,3,5,S,[OH,new k(null,3,[xm,[w?"on":null,l(function(){var y=w;return y?L9.g?L9.g(u):L9.call(null,u):y}())?" redacting":null].join(""),nC,v(K9,u),Lu,new k(null,1,[Iu,function(y,C){return function(){return v$(b,C)}}(w,u,m,h,c)],null)],null),Vf(u)],null),new k(null,1,[SH,u],
|
|
3537
|
-
null)),f(Vd(m)))}return null}},null,null)}(nf(Hi(K9)))}()],null),new R(null,2,5,S,[kla,ef(A(sh(L9,M9(a))))?"Values withheld from the audit trail — /history records that this attribute changed, not what it changed to.":"Metadata only. Tagging
|
|
3537
|
+
null)),f(Vd(m)))}return null}},null,null)}(nf(Hi(K9)))}()],null),new R(null,2,5,S,[kla,ef(A(sh(L9,M9(a))))?"Values withheld from the audit trail — /history records that this attribute changed, not what it changed to.":"Metadata only. Tagging secret also withholds values from the audit trail."],null)],null)}
|
|
3538
3538
|
function cCa(a){var b=mE.g(q(X));if(l(b)){var c=N(b),d=v(c,WB),e=v(c,ir),f=Pg(function(u){return z.h(mV(u),d)?u:null},gN.g(a)),h=th(function(u){return z.h("SUPERUSER",U.g(u))},H7.g(oK)),m=H7.g(IG),n=bP(l(e)?e:""),r=fP(n)?h:sh(function(u){u=U.g(u);return Ia(bP(l(u)?u:""),n)},h),t=H(oW(f));return new R(null,3,5,S,[sJ,new k(null,1,[Lu,new k(null,1,[Iu,function(u){return z.h(u.target,u.currentTarget)?t$():null}],null)],null),new R(null,9,5,S,[tha,new R(null,3,5,S,[CB,new R(null,3,5,S,[Q_,"Attribute policy — ",
|
|
3539
3539
|
new R(null,2,5,S,[dda,function(){var u=U.g(f);return l(u)?u:"attribute"}()],null)],null),new R(null,3,5,S,[DL,new k(null,1,[Lu,new k(null,1,[Iu,t$],null)],null),X7(new k(null,2,[U,"x",QB,"14"],null))],null)],null),bCa(f,d),new R(null,3,5,S,[UD,new k(null,1,[FH,new k(null,1,[IA,"4px 24px 0"],null)],null),"Access"],null),new R(null,2,5,S,[jK,new R(null,2,5,S,[dt,new k(null,4,[dA,"text",sD,l(e)?e:"",Sz,"Search roles...",Lu,new k(null,1,[dt,function(u){return Q.l(X,xg,new R(null,2,5,S,[mE,ir],null),u.target.value)}],
|
|
3540
3540
|
null)],null)],null)],null),new R(null,3,5,S,[$u,new k(null,1,[xm,0===t?"none":null],null),mb(mW(a))?"entity RBAC is off — restrictions below are stored but not enforced":0<t?[p.g(t)," denial",yg(1,t)?"s":null].join(""):"no restrictions — all roles may read and write"],null),new R(null,4,5,S,[Zaa,new R(null,2,5,S,[Q_,"Role"],null),new R(null,2,5,S,[Q_,"Read"],null),new R(null,2,5,S,[Q_,"Write"],null)],null),new R(null,2,5,S,[xda,l(m)?new R(null,2,5,S,[KA,"Loading roles…"],null):Ue(r)?new R(null,2,
|
|
@@ -3605,7 +3605,7 @@ null)),G$(new k(null,3,[gF,"Write",fv,jf(l(h)?h:Rj,wp),uK,function(){return C$(f
|
|
|
3605
3605
|
0;;)if(T<E){var Z=Ob(D,T),Y=J(Z,0,null),aa=J(Z,1,null),V=G;Z=new R(null,3,5,S,[XJ,0<Y?new R(null,2,5,S,[uu,new R(null,2,5,S,[Q_,"and"],null)],null):null,new R(null,2,5,S,[PK,E$(aa)],null)],null);aa=lk.g(aa);Y=Pe(Z,new k(null,1,[SH,l(aa)?aa:Y],null));V.add(Y);T+=1}else return!0}()?bg(dg(G),y(gd(C))):bg(dg(G),null)}var K=B(C),O=J(K,0,null),P=J(K,1,null);return ye(Pe(new R(null,3,5,S,[XJ,0<O?new R(null,2,5,S,[uu,new R(null,2,5,S,[Q_,"and"],null)],null):null,new R(null,2,5,S,[PK,E$(P)],null)],null),new k(null,
|
|
3606
3606
|
1,[SH,function(){var T=lk.g(P);return l(T)?T:O}()],null)),y(Vd(C)))}return null}},null,null)}(Wg(ji,t))}(),function(){return function y(w){return new Wf(null,function(){for(;;){var C=A(w);if(C){if(af(C)){var D=fd(C),E=H(D),G=$f(E);a:for(var K=0;;)if(K<E){var O=Ob(D,K),P=J(O,0,null),T=J(O,1,null);O=G;P=Pe(new R(null,3,5,S,[XJ,A(t)||0<P?new R(null,2,5,S,[uu,new R(null,2,5,S,[Q_,"and"],null)],null):null,vCa(f,T)],null),new k(null,1,[SH,["invalid-",p.g(P)].join("")],null));O.add(P);K+=1}else{D=!0;break a}return D?
|
|
3607
3607
|
bg(dg(G),y(gd(C))):bg(dg(G),null)}D=B(C);G=J(D,0,null);D=J(D,1,null);return ye(Pe(new R(null,3,5,S,[XJ,A(t)||0<G?new R(null,2,5,S,[uu,new R(null,2,5,S,[Q_,"and"],null)],null):null,vCa(f,D)],null),new k(null,1,[SH,["invalid-",p.g(G)].join("")],null)),y(Vd(C)))}return null}},null,null)}(Wg(ji,n))}()],null)],null)}
|
|
3608
|
-
function xCa(a){var b=sW(a),c=JM.g(q(X)),d=l(b)?tW(a):null,e=l(b)?
|
|
3608
|
+
function xCa(a){var b=sW(a),c=JM.g(q(X)),d=l(b)?tW(a):null,e=l(b)?Z0(c,a):null;return new R(null,3,5,S,[XJ,new R(null,3,5,S,[oI,new R(null,3,5,S,[du,new R(null,3,5,S,[Zs,new k(null,1,[xm,l(b)?"active":null],null),l(b)?"RLS Enabled":"RLS Disabled"],null),B$(new k(null,2,[fI,b,hH,function(){i8();return I7.h(Ku,new k(null,1,[wM,function(f){return xg(f,new R(null,3,5,S,[WH,Km,kA],null),mb(b))}],null))}],null))],null),new R(null,2,5,S,[Xw,"Row-Level Security restricts row access based on user identity. Guard rows use OR logic (any match grants access). Conditions within a row use AND logic."],
|
|
3609
3609
|
null)],null),l(b)?new R(null,4,5,S,[iea,function(){return function m(h){return new Wf(null,function(){for(;;){var n=A(h);if(n){if(af(n)){var r=fd(n),t=H(r),u=$f(t);return function(){for(var D=0;;)if(D<t){var E=Ob(r,D),G=J(E,0,null),K=J(E,1,null),O=u;E=new R(null,3,5,S,[XJ,0<G?new R(null,4,5,S,[Su,new R(null,1,5,S,[Kl],null),new R(null,2,5,S,[JD,"or"],null),new R(null,1,5,S,[Kl],null)],null):null,wCa(K,e,c,a)],null);K=lk.g(K);G=Pe(E,new k(null,1,[SH,l(K)?K:G],null));O.add(G);D+=1}else return!0}()?
|
|
3610
3610
|
bg(dg(u),m(gd(n))):bg(dg(u),null)}var w=B(n),y=J(w,0,null),C=J(w,1,null);return ye(Pe(new R(null,3,5,S,[XJ,0<y?new R(null,4,5,S,[Su,new R(null,1,5,S,[Kl],null),new R(null,2,5,S,[JD,"or"],null),new R(null,1,5,S,[Kl],null)],null):null,wCa(C,e,c,a)],null),new k(null,1,[SH,function(){var D=lk.g(C);return l(D)?D:y}()],null)),m(Vd(n)))}return null}},null,null)}(Wg(ji,d))}(),A(e)?new R(null,3,5,S,[xD,new k(null,2,[Lu,new k(null,1,[Iu,function(){return sCa(fca,null,null)}],null),FH,new k(null,1,[nu,"8px"],
|
|
3611
3611
|
null)],null),"+ Add Guard Row"],null):null,Ue(e)?new R(null,2,5,S,[Fia,"No paths to IAM entities found. Connect this entity to User, User Group, or User Role through relations."],null):null],null):null],null)}
|
|
@@ -3626,11 +3626,11 @@ null)],null),new R(null,3,5,S,[Cja,new k(null,1,[FH,new k(null,1,[Oz,"8px 0 4px"
|
|
|
3626
3626
|
function ECa(a){var b=ef(Bh(a,new R(null,2,5,S,[WH,Tr],null)));return new R(null,3,5,S,[XJ,new R(null,3,5,S,[oI,new R(null,3,5,S,[du,new R(null,3,5,S,[Zs,new k(null,1,[xm,b?"active":null],null),b?"History Enabled":"History Disabled"],null),B$(new k(null,2,[fI,b,hH,function(){i8();return I7.h(Ku,new k(null,1,[wM,function(c){return xg(c,new R(null,2,5,S,[WH,Tr],null),ef(!b))}],null))}],null))],null),new R(null,2,5,S,[Xw,"When enabled, every create, update, and delete to this entity is recorded into the audit plug. You'll be able to query the full change history via the /history endpoint — who changed what, when, in which request, and the before/after values of each attribute. Disable this for high-volume entities where keeping a permanent record would inflate database writes without paying for itself."],
|
|
3627
3627
|
null)],null),new R(null,5,5,S,[oI,new k(null,1,[FH,new k(null,1,[nu,"12px"],null)],null),new R(null,2,5,S,[du,new R(null,2,5,S,[ama,"Audit Fields"],null)],null),new R(null,2,5,S,[Xw,"Add managed columns to this entity that capture when each record was created or modified. With IAM enabled, the modifying user is captured too; without IAM, you get the timestamps. Separate from the change history above — these live on the entity's own table."],null),new R(null,4,5,S,[$ma,new k(null,1,[FH,new k(null,
|
|
3628
3628
|
1,[nu,"12px"],null)],null),yCa(new k(null,3,[gF,"Modified",SE,hB,TB,a],null)),yCa(new k(null,3,[gF,"Created",SE,yz,TB,a],null))],null)],null)],null)}function FCa(a){var b=H7.g(Gw);switch(b instanceof x?b.H:null){case "attributes":return hCa(a);case "constraints":return mCa(a);case "guard":return xCa(a);case "access":return DCa(a);case "audit":return ECa(a);default:return null}}function GCa(){return I7.h(QC,null)}
|
|
3629
|
-
function HCa(){var a=H7.g(Nt),b=l(a)?H7.g(xJ):null;a=yE.g(q(X));var c=l(a)?JM.g(q(X)):null,d=l(l(a)?b:a)?tW(b):null;c=l(l(a)?l(b)?c:b:a)?
|
|
3629
|
+
function HCa(){var a=H7.g(Nt),b=l(a)?H7.g(xJ):null;a=yE.g(q(X));var c=l(a)?JM.g(q(X)):null,d=l(l(a)?b:a)?tW(b):null;c=l(l(a)?l(b)?c:b:a)?Z0(c,b):null;return new Ie(null,l(b)?new R(null,6,5,S,[mda,new R(null,3,5,S,[AI,new R(null,3,5,S,[mF,new R(null,3,5,S,[HD,new k(null,2,[Lu,new k(null,1,[Iu,function(){var e=mV(b);return l(e)?navigator.clipboard.writeText(p.g(e)):null}],null),nC,"Copy ID"],null),X7(new k(null,2,[U,"copy",QB,"12"],null))],null),new R(null,2,5,S,[Q_,"Entity"],null)],null),new R(null,
|
|
3630
3630
|
2,5,S,[kv,new R(null,3,5,S,[mB,new k(null,2,[Lu,new k(null,1,[Iu,GCa],null),nC,"Close"],null),X7(new k(null,2,[U,"x",QB,"14"],null))],null)],null)],null),l(F7.v?F7.v():F7.call(null))?new R(null,4,5,S,[XJ,new k(null,1,[FH,pj([mH,kG,lA,to,IA,VG,Cz,ED,Oz],"center;var(--sy-text-m);12px;var(--sy-bg-2, rgba(128,128,128,0.12));6px 10px;6px;flex;6px;12px 12px 8px".split(";"))],null),X7(new k(null,2,[U,"lock",QB,"12"],null)),new R(null,2,5,S,[Q_,"Deployed — read only. Create a new version to edit."],null)],
|
|
3631
3631
|
null):null,function(){var e=ZAa(JM.g(q(X)),mV(b),U.g(b));return new Ie(null,new R(null,2,5,S,[ina,new k(null,8,[dA,"text",iK,["entity-name-",p.g(mV(b))].join(""),oF,function(f){f=N(f);f=v(f,eD);return l(Uv.g(q(X)))?(Q.j(X,Le,Uv),f.focus(),f.select()):null},xm,l(e)?"has-conflict":null,pG,F7.v?F7.v():F7.call(null),sD,function(){var f=U.g(b);return l(f)?f:""}(),Sz,"Entity name",Lu,new k(null,2,[bv,function(){return i8()},dt,function(f){var h=f.target.value;return I7.h(Ku,new k(null,1,[wM,function(m){return M.j(m,
|
|
3632
3632
|
U,h)}],null))}],null)],null)],null),new Ie(null,l(e)?new R(null,6,5,S,[kka,X7(new k(null,2,[U,"triangle-alert",QB,"12"],null)),new R(null,2,5,S,[Q_,"Normalizes to "],null),new R(null,2,5,S,[lx,X8(U.g(b))],null),new R(null,2,5,S,[Q_," — already used by "],null),new R(null,2,5,S,[ws,U.g(e)],null)],null):null,null,1,null),2,null)}(),YBa(),new R(null,3,5,S,[gba,new k(null,1,[xm,["tab-",Vf(H7.g(Gw))].join("")],null),FCa(b)],null)],null):null,new Ie(null,l(a)?uCa(c,d):null,new Ie(null,cCa(b),null,1,null),
|
|
3633
|
-
2,null),3,null)};var
|
|
3633
|
+
2,null),3,null)};var Qna=new CSSStyleSheet;Qna.replaceSync("/* Relation drawer - reuses entity_drawer layout where possible */\n\n/* Two-tab layout: flex-start + gap (space-between looks bad with only 2 tabs) */\n.relation-drawer .entity-drawer-tabs {\n justify-content: flex-start;\n gap: 6px;\n padding: 16px 12px 12px;\n}\n\n/* Content area — NO global padding. Each section owns its own gutter. */\n.entity-drawer-content.rel-content {\n padding: 0;\n}\n\n/* Side-tab body — flex column so access matrix can flex-grow/scroll.\n No horizontal padding: each child section owns its own gutter. */\n.rel-side-body {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n gap: 12px;\n padding-top: 4px;\n}\n\n/* Section gutters — every child section gets the same 12px horizontal inset */\n.rel-side-body \x3e .guard-card,\n.rel-side-body \x3e .rel-access-heading,\n.rel-side-body \x3e .access-deploy-gate,\n.rel-side-body \x3e .access-empty,\n.rel-side-body \x3e .access-filter,\n.rel-side-body \x3e .access-table {\n margin-left: 12px;\n margin-right: 12px;\n}\n\n.rel-side-body \x3e .guard-card {\n margin-top: 0;\n margin-bottom: 0;\n}\n\n.rel-side-body \x3e .access-table {\n margin-bottom: 12px;\n}\n\n/* Role Access heading — consistent with other section labels */\n.rel-access-heading {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--sy-text-mm);\n margin-top: 4px;\n margin-bottom: -4px;\n}\n\n/* Details: one-line sentence + label input.\n Matches .guard-card: 6px radius, 16px padding — consistency across cards. */\n.rel-details {\n margin: 0 12px;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* Sentence: \"\x3centity\x3e has [pill] \x3centity\x3e\"\n ONE size (14px), ONE weight (600 for entities, 400 for connector).\n Only color variation: entities \x3d text-pp, connector \x3d text-mm, pill \x3d accent. */\n.rel-sentence {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n font-size: 14px;\n line-height: 1.3;\n}\n\n.rel-entity,\n.rel-has {\n font-weight: 600;\n color: var(--sy-text-pp);\n}\n\n/* Label + input field group — label sits close to its input */\n.rel-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.rel-field-label {\n font-size: 11px;\n font-weight: 500;\n color: var(--sy-text-mm);\n}\n\n/* Cardinality toggle — fixed 36px width so ONE and MANY occupy the same slot.\n Click flips between states; both use the same filled-accent look. */\n.rel-cardinality-toggle {\n width: 48px;\n min-width: 48px;\n padding: 4px 0;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n text-transform: uppercase;\n border-radius: 16px;\n cursor: pointer;\n transition: all 0.15s;\n font-family: inherit;\n white-space: nowrap;\n border: 1px solid transparent;\n text-align: center;\n}\n\n/* Both states share the SAME tag look — ONE is not worth less than MANY.\n Only the label text changes. */\n.rel-cardinality-toggle.one,\n.rel-cardinality-toggle.many {\n background: var(--sy-accent);\n border-color: var(--sy-accent);\n color: var(--modeling-button-text);\n}\n\n.rel-cardinality-toggle:hover {\n opacity: 0.9;\n}\n\n/* Label input */\n.rel-label-input {\n width: 100%;\n padding: 8px 10px;\n font-size: 13px;\n font-family: inherit;\n color: var(--sy-text);\n background: transparent;\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 6px;\n outline: none;\n box-sizing: border-box;\n transition: border-color 0.15s;\n}\n\n.rel-label-input:focus {\n border-color: var(--sy-accent);\n}\n\n.rel-label-input::placeholder {\n color: var(--sy-text-mm);\n}\n\n/* Recursive relation hint under the label input */\n.rel-tree-hint {\n margin: 0;\n font-size: 11px;\n line-height: 1.5;\n color: var(--sy-text-mm);\n}\n\n.rel-tree-hint code {\n font-family: ui-monospace, SFMono-Regular, monospace;\n font-size: 10px;\n padding: 1px 4px;\n border-radius: 3px;\n background: var(--modeling-overlay-bg-hover);\n color: var(--sy-text-p);\n}\n\n.rel-tree-hint strong {\n color: var(--sy-text-p);\n font-weight: 600;\n}\n\n/* Side picker — 3×3 spatial grid representing entity corners + edges */\n.rel-side-grid {\n display: grid;\n grid-template-columns: repeat(3, 28px);\n grid-template-rows: repeat(3, 28px);\n gap: 3px;\n justify-content: start;\n}\n\n.rel-side-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n border: 1px solid var(--modeling-overlay-border);\n background: transparent;\n color: var(--sy-text-mm);\n font-size: 13px;\n cursor: pointer;\n padding: 0;\n transition: all 0.15s;\n font-family: inherit;\n}\n\n.rel-side-cell:hover {\n border-color: var(--sy-text-mm);\n color: var(--sy-text);\n}\n\n.rel-side-cell.active {\n background: var(--sy-accent);\n border-color: var(--sy-accent);\n color: var(--modeling-button-text);\n}\n\n.rel-side-center {\n width: 28px;\n height: 28px;\n border-radius: 4px;\n border: 1px dashed var(--modeling-overlay-border);\n}\n\n/* Invalid label — empty tree label blocks deploy. Uses -text (not -stroke) so\n the red is saturated enough to read as an error cue, since an input's\n bg is transparent — unlike a removed-entity box where the pale stroke\n sits against a pale fill by design. */\n.rel-label-input--invalid {\n border-color: var(--modeling-removed-text);\n}\n\n.rel-label-input--invalid:focus {\n border-color: var(--modeling-removed-text);\n}\n\n/* Duplicate field-name warning under a relation label — a label shares the\n entity's field namespace with attributes + other relation labels. Mirrors\n .attr-conflict-error in the entity drawer. */\n.rel-label-conflict {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n margin: 4px 0 0;\n font-size: 11px;\n color: var(--modeling-removed-text);\n}\n\n.rel-label-conflict code {\n padding: 0 4px;\n border-radius: 3px;\n background: var(--modeling-removed-tint-strong);\n color: var(--modeling-removed-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 10.5px;\n}\n");
|
|
3634
3634
|
var P$=new k(null,4,["o2o",new k(null,2,[fm,"one",vy,"one"],null),"o2m",new k(null,2,[fm,"one",vy,"many"],null),"m2o",new k(null,2,[fm,"many",vy,"one"],null),"m2m",new k(null,2,[fm,"many",vy,"many"],null)],null);
|
|
3635
3635
|
function MCa(a){var b=N(a);a=v(b,fm);b=v(b,vy);a=new R(null,2,5,S,[a,b],null);return z.h(new R(null,2,5,S,["one","one"],null),a)?"o2o":z.h(new R(null,2,5,S,["one","many"],null),a)?"o2m":z.h(new R(null,2,5,S,["many","one"],null),a)?"m2o":z.h(new R(null,2,5,S,["many","many"],null),a)?"m2m":"o2m"}function NCa(a,b){b=b instanceof x?b.H:null;switch(b){case "from":return fm.g(a);case "to":return vy.g(a);default:throw Error(["No matching clause: ",p.g(b)].join(""));}}
|
|
3636
3636
|
function OCa(a,b){b=b instanceof x?b.H:null;switch(b){case "from":return vy.g(a);case "to":return fm.g(a);default:throw Error(["No matching clause: ",p.g(b)].join(""));}}function PCa(a){a=a instanceof x?a.H:null;switch(a){case "from":return AN;case "to":return Ql;default:throw Error(["No matching clause: ",p.g(a)].join(""));}}function QCa(a){a=a instanceof x?a.H:null;switch(a){case "from":return vy;case "to":return fm;default:throw Error(["No matching clause: ",p.g(a)].join(""));}}
|
|
@@ -3675,7 +3675,7 @@ function pDa(){var a=H7.g(hA),b=H7.g(Az),c=H7.g(OF),d=H7.g(Fu),e=H7.g(AD);e=l(e)
|
|
|
3675
3675
|
null)],null),l(e)?k2(new k(null,1,[oq,new k(null,5,[Uy,r,Sy,u,ZL,w,Ky,y,Hy,t],null)],null)):null,jDa(),new R(null,4,5,S,[Nea,new k(null,6,[zG,[p.g(h)," ",p.g(m)," ",p.g(n)," ",p.g(f)].join(""),mfa,"http://www.w3.org/2000/svg",FH,new k(null,3,[uI,"100%",qr,"100%",Ex,a],null),oF,function(C){C=N(C);C=v(C,eD);I7.h(br,new k(null,1,[mA,C],null));var D=new ResizeObserver(function(E){E=E[0].contentRect;return Q.o(X,Gh,oq,M,I([uI,E.width,qr,E.height]))});D.observe(C);return C._resizeObserver=D},Mn,function(C){C=
|
|
3676
3676
|
N(C);C=v(C,eD)._resizeObserver;return l(C)?C.disconnect():null},Lu,new k(null,6,[nN,kDa,cB,lDa,pca,mDa,fp,mDa,Iu,oDa,c0,nDa],null)],null),l(e)?null:new Ie(null,new R(null,3,5,S,[mw,new R(null,3,5,S,[Jl,new k(null,6,[lk,"grid-small",WL,-10,VL,-10,uI,20,qr,20,qF,"userSpaceOnUse"],null),new R(null,2,5,S,[mK,new k(null,4,[Zu,10,Yu,10,$L,1,FH,new k(null,1,[HK,"var(--modeling-grid-color)"],null)],null)],null)],null),new R(null,3,5,S,[Jl,new k(null,6,[lk,"grid-large",WL,-50,VL,-50,uI,100,qr,100,qF,"userSpaceOnUse"],
|
|
3677
3677
|
null),new R(null,2,5,S,[mK,new k(null,4,[Zu,50,Yu,50,$L,1.5,FH,new k(null,1,[HK,"var(--modeling-grid-color-major)"],null)],null)],null)],null)],null),new Ie(null,new R(null,3,5,S,[Tba,new R(null,2,5,S,[qq,new k(null,5,[WL,-5E4,VL,-5E4,uI,1E5,qr,1E5,HK,"url(#grid-small)"],null)],null),new R(null,2,5,S,[qq,new k(null,5,[WL,-5E4,VL,-5E4,uI,1E5,qr,1E5,HK,"url(#grid-large)"],null)],null)],null),null,1,null),2,null),new R(null,5,5,S,[Fma,new k(null,1,[FH,new k(null,1,[jo,l(l(c)?c:b)?"none":"auto"],null)],
|
|
3678
|
-
null),SBa(),TBa(),LBa()],null)],null)],null)};var n9=new CSSStyleSheet;n9.replaceSync("/* Synthigy Modeling Utilities\n Lightweight layout/spacing/typography helpers for shadow DOM components.\n Shared across all modeling UI (drawer, menus, action bar, etc.) */\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Display \x26 Flex\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.flex { display: flex; }\n.inline-flex { display: inline-flex; }\n.flex-col { flex-direction: column; }\n.flex-row { flex-direction: row; }\n.flex-wrap { flex-wrap: wrap; }\n.flex-1 { flex: 1; }\n.flex-none { flex: none; }\n\n.items-start { align-items: flex-start; }\n.items-center { align-items: center; }\n.items-end { align-items: flex-end; }\n.items-stretch { align-items: stretch; }\n\n.justify-start { justify-content: flex-start; }\n.justify-center { justify-content: center; }\n.justify-end { justify-content: flex-end; }\n.justify-between { justify-content: space-between; }\n\n.self-start { align-self: flex-start; }\n.self-center { align-self: center; }\n.self-end { align-self: flex-end; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Gap\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.gap-1 { gap: 4px; }\n.gap-2 { gap: 8px; }\n.gap-3 { gap: 12px; }\n.gap-4 { gap: 16px; }\n.gap-6 { gap: 24px; }\n.gap-8 { gap: 32px; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Padding\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.p-0 { padding: 0; }\n.p-1 { padding: 4px; }\n.p-2 { padding: 8px; }\n.p-3 { padding: 12px; }\n.p-4 { padding: 16px; }\n.p-6 { padding: 24px; }\n.p-8 { padding: 32px; }\n\n.px-1 { padding-left: 4px; padding-right: 4px; }\n.px-2 { padding-left: 8px; padding-right: 8px; }\n.px-3 { padding-left: 12px; padding-right: 12px; }\n.px-4 { padding-left: 16px; padding-right: 16px; }\n.px-6 { padding-left: 24px; padding-right: 24px; }\n.px-8 { padding-left: 32px; padding-right: 32px; }\n\n.py-1 { padding-top: 4px; padding-bottom: 4px; }\n.py-2 { padding-top: 8px; padding-bottom: 8px; }\n.py-3 { padding-top: 12px; padding-bottom: 12px; }\n.py-4 { padding-top: 16px; padding-bottom: 16px; }\n.py-6 { padding-top: 24px; padding-bottom: 24px; }\n\n.pt-1 { padding-top: 4px; }\n.pt-2 { padding-top: 8px; }\n.pt-4 { padding-top: 16px; }\n.pb-1 { padding-bottom: 4px; }\n.pb-2 { padding-bottom: 8px; }\n.pb-4 { padding-bottom: 16px; }\n.pl-2 { padding-left: 8px; }\n.pr-2 { padding-right: 8px; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Margin\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.m-0 { margin: 0; }\n.m-1 { margin: 4px; }\n.m-2 { margin: 8px; }\n\n.mx-auto { margin-left: auto; margin-right: auto; }\n.ml-auto { margin-left: auto; }\n.mr-auto { margin-right: auto; }\n\n.mb-1 { margin-bottom: 4px; }\n.mb-2 { margin-bottom: 8px; }\n.mb-3 { margin-bottom: 12px; }\n.mb-4 { margin-bottom: 16px; }\n.mt-1 { margin-top: 4px; }\n.mt-2 { margin-top: 8px; }\n.mt-4 { margin-top: 16px; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Width \x26 Height\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.w-full { width: 100%; }\n.h-full { height: 100%; }\n.min-w-0 { min-width: 0; }\n.min-h-0 { min-height: 0; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Position\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.relative { position: relative; }\n.absolute { position: absolute; }\n.fixed { position: fixed; }\n.inset-0 { inset: 0; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Typography\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.text-xxs { font-size: 10px; }\n.text-xs { font-size: 11px; }\n.text-sm { font-size: 12px; }\n.text-base { font-size: 14px; }\n.text-lg { font-size: 16px; }\n.text-xl { font-size: 20px; }\n.text-2xl { font-size: 24px; }\n\n.font-normal { font-weight: 400; }\n.font-medium { font-weight: 500; }\n.font-semibold { font-weight: 600; }\n.font-bold { font-weight: 700; }\n.font-extrabold { font-weight: 800; }\n\n.uppercase { text-transform: uppercase; }\n.lowercase { text-transform: lowercase; }\n.capitalize { text-transform: capitalize; }\n.normal-case { text-transform: none; }\n\n.tracking-tight { letter-spacing: -0.02em; }\n.tracking-normal { letter-spacing: 0; }\n.tracking-wide { letter-spacing: 0.04em; }\n.tracking-wider { letter-spacing: 0.08em; }\n\n.leading-tight { line-height: 1.2; }\n.leading-normal { line-height: 1.5; }\n.leading-relaxed { line-height: 1.7; }\n\n.text-left { text-align: left; }\n.text-center { text-align: center; }\n.text-right { text-align: right; }\n\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.whitespace-nowrap { white-space: nowrap; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Border \x26 Rounded\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.rounded { border-radius: 4px; }\n.rounded-sm { border-radius: 2px; }\n.rounded-md { border-radius: 6px; }\n.rounded-lg { border-radius: 8px; }\n.rounded-xl { border-radius: 12px; }\n.rounded-full { border-radius: 9999px; }\n\n.border { border: 1px solid var(--modeling-overlay-border); }\n.border-b { border-bottom: 1px solid var(--modeling-overlay-border); }\n.border-t { border-top: 1px solid var(--modeling-overlay-border); }\n.border-0 { border: none; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Interaction\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.cursor-pointer { cursor: pointer; }\n.cursor-move { cursor: move; }\n.cursor-default { cursor: default; }\n.select-none { user-select: none; }\n.pointer-events-none { pointer-events: none; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Overflow\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.overflow-hidden { overflow: hidden; }\n.overflow-auto { overflow: auto; }\n.overflow-y-auto { overflow-y: auto; }\n.overflow-x-hidden { overflow-x: hidden; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Opacity \x26 Visibility\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.opacity-0 { opacity: 0; }\n.opacity-25 { opacity: 0.25; }\n.opacity-50 { opacity: 0.5; }\n.opacity-75 { opacity: 0.75; }\n.opacity-100 { opacity: 1; }\n.invisible { visibility: hidden; }\n.visible { visibility: visible; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Transitions\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.transition { transition: all 0.15s ease; }\n.transition-opacity { transition: opacity 0.15s ease; }\n.transition-colors { transition: color 0.15s ease, background-color 0.15s ease; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Popup / Floating Menu\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.sy-popup-menu {\n background: var(--modeling-overlay-bg);\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 8px;\n box-shadow: var(--modeling-overlay-shadow);\n color: var(--sy-text);\n padding: 4px 0;\n}\n\n.sy-popup-option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n cursor: pointer;\n font-size: 12px;\n transition: background 0.1s;\n}\n\n.sy-popup-option:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.sy-popup-option.selected {\n font-weight: 600;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Panel / Drawer shared\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.sy-panel {\n background: var(--modeling-overlay-bg);\n border: 1px solid var(--modeling-overlay-border);\n box-shadow: var(--modeling-overlay-shadow);\n color: var(--sy-text);\n}\n\n.sy-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.sy-panel-title {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--sy-text-p);\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Text color intensity: text++ text+ text text- text--\n Actual color values, no opacity stacking.\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.text { color: var(--sy-text); }\n.text\\+\\+ { color: var(--sy-text-pp); }\n.text\\+ { color: var(--sy-text-p); }\n.text\\- { color: var(--sy-text-m); }\n.text\\-\\- { color: var(--sy-text-mm); }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Toolbar button (undo/redo etc.)\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.sy-toolbar-btn {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n border-radius: 4px;\n padding: 4px;\n cursor: pointer;\n color: var(--sy-text-m);\n transition: color 0.15s, background 0.15s;\n}\n\n.sy-toolbar-btn:hover {\n color: var(--sy-text-pp);\n background: var(--modeling-overlay-bg-hover);\n}\n\n.sy-toolbar-btn.disabled {\n color: var(--sy-text-mm);\n cursor: default;\n pointer-events: none;\n}\n\n/* Key-hint bubble — mirrors .action-btn's in action_bar.css, shown while\n ⌘/Ctrl is held. */\n.hints .sy-toolbar-btn[data-hint]::after {\n content: attr(data-hint);\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 9px;\n padding: 1px 4px;\n border-radius: 5px;\n background: var(--sy-accent);\n color: var(--modeling-overlay-bg);\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 9px;\n font-weight: 700;\n line-height: 1.45;\n text-align: center;\n pointer-events: none;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n}\n\n.sy-ghost-action {\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n background: transparent;\n border: none;\n padding: 4px 0;\n color: var(--sy-text-m);\n transition: color 0.15s;\n}\n\n.sy-ghost-action:hover {\n color: var(--sy-text-p);\n}\n");function wDa(){var a=QH.g(q(X));return l(a)?(a.removeAttribute("open"),a.dispatchEvent(new CustomEvent("close",{bubbles:!0})),a=a.onClose,l(a)?a.v?a.v():a.call(null):null):null}
|
|
3678
|
+
null),SBa(),TBa(),LBa()],null)],null)],null)};var Rna=new CSSStyleSheet;Rna.replaceSync("/* Synthigy Modeling Utilities\n Lightweight layout/spacing/typography helpers for shadow DOM components.\n Shared across all modeling UI (drawer, menus, action bar, etc.) */\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Display \x26 Flex\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.flex { display: flex; }\n.inline-flex { display: inline-flex; }\n.flex-col { flex-direction: column; }\n.flex-row { flex-direction: row; }\n.flex-wrap { flex-wrap: wrap; }\n.flex-1 { flex: 1; }\n.flex-none { flex: none; }\n\n.items-start { align-items: flex-start; }\n.items-center { align-items: center; }\n.items-end { align-items: flex-end; }\n.items-stretch { align-items: stretch; }\n\n.justify-start { justify-content: flex-start; }\n.justify-center { justify-content: center; }\n.justify-end { justify-content: flex-end; }\n.justify-between { justify-content: space-between; }\n\n.self-start { align-self: flex-start; }\n.self-center { align-self: center; }\n.self-end { align-self: flex-end; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Gap\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.gap-1 { gap: 4px; }\n.gap-2 { gap: 8px; }\n.gap-3 { gap: 12px; }\n.gap-4 { gap: 16px; }\n.gap-6 { gap: 24px; }\n.gap-8 { gap: 32px; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Padding\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.p-0 { padding: 0; }\n.p-1 { padding: 4px; }\n.p-2 { padding: 8px; }\n.p-3 { padding: 12px; }\n.p-4 { padding: 16px; }\n.p-6 { padding: 24px; }\n.p-8 { padding: 32px; }\n\n.px-1 { padding-left: 4px; padding-right: 4px; }\n.px-2 { padding-left: 8px; padding-right: 8px; }\n.px-3 { padding-left: 12px; padding-right: 12px; }\n.px-4 { padding-left: 16px; padding-right: 16px; }\n.px-6 { padding-left: 24px; padding-right: 24px; }\n.px-8 { padding-left: 32px; padding-right: 32px; }\n\n.py-1 { padding-top: 4px; padding-bottom: 4px; }\n.py-2 { padding-top: 8px; padding-bottom: 8px; }\n.py-3 { padding-top: 12px; padding-bottom: 12px; }\n.py-4 { padding-top: 16px; padding-bottom: 16px; }\n.py-6 { padding-top: 24px; padding-bottom: 24px; }\n\n.pt-1 { padding-top: 4px; }\n.pt-2 { padding-top: 8px; }\n.pt-4 { padding-top: 16px; }\n.pb-1 { padding-bottom: 4px; }\n.pb-2 { padding-bottom: 8px; }\n.pb-4 { padding-bottom: 16px; }\n.pl-2 { padding-left: 8px; }\n.pr-2 { padding-right: 8px; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Margin\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.m-0 { margin: 0; }\n.m-1 { margin: 4px; }\n.m-2 { margin: 8px; }\n\n.mx-auto { margin-left: auto; margin-right: auto; }\n.ml-auto { margin-left: auto; }\n.mr-auto { margin-right: auto; }\n\n.mb-1 { margin-bottom: 4px; }\n.mb-2 { margin-bottom: 8px; }\n.mb-3 { margin-bottom: 12px; }\n.mb-4 { margin-bottom: 16px; }\n.mt-1 { margin-top: 4px; }\n.mt-2 { margin-top: 8px; }\n.mt-4 { margin-top: 16px; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Width \x26 Height\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.w-full { width: 100%; }\n.h-full { height: 100%; }\n.min-w-0 { min-width: 0; }\n.min-h-0 { min-height: 0; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Position\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.relative { position: relative; }\n.absolute { position: absolute; }\n.fixed { position: fixed; }\n.inset-0 { inset: 0; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Typography\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.text-xxs { font-size: 10px; }\n.text-xs { font-size: 11px; }\n.text-sm { font-size: 12px; }\n.text-base { font-size: 14px; }\n.text-lg { font-size: 16px; }\n.text-xl { font-size: 20px; }\n.text-2xl { font-size: 24px; }\n\n.font-normal { font-weight: 400; }\n.font-medium { font-weight: 500; }\n.font-semibold { font-weight: 600; }\n.font-bold { font-weight: 700; }\n.font-extrabold { font-weight: 800; }\n\n.uppercase { text-transform: uppercase; }\n.lowercase { text-transform: lowercase; }\n.capitalize { text-transform: capitalize; }\n.normal-case { text-transform: none; }\n\n.tracking-tight { letter-spacing: -0.02em; }\n.tracking-normal { letter-spacing: 0; }\n.tracking-wide { letter-spacing: 0.04em; }\n.tracking-wider { letter-spacing: 0.08em; }\n\n.leading-tight { line-height: 1.2; }\n.leading-normal { line-height: 1.5; }\n.leading-relaxed { line-height: 1.7; }\n\n.text-left { text-align: left; }\n.text-center { text-align: center; }\n.text-right { text-align: right; }\n\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.whitespace-nowrap { white-space: nowrap; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Border \x26 Rounded\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.rounded { border-radius: 4px; }\n.rounded-sm { border-radius: 2px; }\n.rounded-md { border-radius: 6px; }\n.rounded-lg { border-radius: 8px; }\n.rounded-xl { border-radius: 12px; }\n.rounded-full { border-radius: 9999px; }\n\n.border { border: 1px solid var(--modeling-overlay-border); }\n.border-b { border-bottom: 1px solid var(--modeling-overlay-border); }\n.border-t { border-top: 1px solid var(--modeling-overlay-border); }\n.border-0 { border: none; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Interaction\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.cursor-pointer { cursor: pointer; }\n.cursor-move { cursor: move; }\n.cursor-default { cursor: default; }\n.select-none { user-select: none; }\n.pointer-events-none { pointer-events: none; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Overflow\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.overflow-hidden { overflow: hidden; }\n.overflow-auto { overflow: auto; }\n.overflow-y-auto { overflow-y: auto; }\n.overflow-x-hidden { overflow-x: hidden; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Opacity \x26 Visibility\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.opacity-0 { opacity: 0; }\n.opacity-25 { opacity: 0.25; }\n.opacity-50 { opacity: 0.5; }\n.opacity-75 { opacity: 0.75; }\n.opacity-100 { opacity: 1; }\n.invisible { visibility: hidden; }\n.visible { visibility: visible; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Transitions\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.transition { transition: all 0.15s ease; }\n.transition-opacity { transition: opacity 0.15s ease; }\n.transition-colors { transition: color 0.15s ease, background-color 0.15s ease; }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Popup / Floating Menu\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.sy-popup-menu {\n background: var(--modeling-overlay-bg);\n border: 1px solid var(--modeling-overlay-border);\n border-radius: 8px;\n box-shadow: var(--modeling-overlay-shadow);\n color: var(--sy-text);\n padding: 4px 0;\n}\n\n.sy-popup-option {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n cursor: pointer;\n font-size: 12px;\n transition: background 0.1s;\n}\n\n.sy-popup-option:hover {\n background: var(--modeling-overlay-bg-hover);\n}\n\n.sy-popup-option.selected {\n font-weight: 600;\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Panel / Drawer shared\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.sy-panel {\n background: var(--modeling-overlay-bg);\n border: 1px solid var(--modeling-overlay-border);\n box-shadow: var(--modeling-overlay-shadow);\n color: var(--sy-text);\n}\n\n.sy-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-bottom: 1px solid var(--modeling-overlay-border);\n}\n\n.sy-panel-title {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--sy-text-p);\n}\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Text color intensity: text++ text+ text text- text--\n Actual color values, no opacity stacking.\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.text { color: var(--sy-text); }\n.text\\+\\+ { color: var(--sy-text-pp); }\n.text\\+ { color: var(--sy-text-p); }\n.text\\- { color: var(--sy-text-m); }\n.text\\-\\- { color: var(--sy-text-mm); }\n\n/* \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n Toolbar button (undo/redo etc.)\n \x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d */\n.sy-toolbar-btn {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n border-radius: 4px;\n padding: 4px;\n cursor: pointer;\n color: var(--sy-text-m);\n transition: color 0.15s, background 0.15s;\n}\n\n.sy-toolbar-btn:hover {\n color: var(--sy-text-pp);\n background: var(--modeling-overlay-bg-hover);\n}\n\n.sy-toolbar-btn.disabled {\n color: var(--sy-text-mm);\n cursor: default;\n pointer-events: none;\n}\n\n/* Key-hint bubble — mirrors .action-btn's in action_bar.css, shown while\n ⌘/Ctrl is held. */\n.hints .sy-toolbar-btn[data-hint]::after {\n content: attr(data-hint);\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 9px;\n padding: 1px 4px;\n border-radius: 5px;\n background: var(--sy-accent);\n color: var(--modeling-overlay-bg);\n font-family: 'JetBrains Mono', 'Fira Code', monospace;\n font-size: 9px;\n font-weight: 700;\n line-height: 1.45;\n text-align: center;\n pointer-events: none;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n}\n\n.sy-ghost-action {\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n background: transparent;\n border: none;\n padding: 4px 0;\n color: var(--sy-text-m);\n transition: color 0.15s;\n}\n\n.sy-ghost-action:hover {\n color: var(--sy-text-p);\n}\n");function wDa(){var a=QH.g(q(X));return l(a)?(a.removeAttribute("open"),a.dispatchEvent(new CustomEvent("close",{bubbles:!0})),a=a.onClose,l(a)?a.v?a.v():a.call(null):null):null}
|
|
3679
3679
|
var BDa=new R(null,17,5,S,[new k(null,2,[$x,new R(null,2,5,S,["⌘/Ctrl","K"],null),gF,"Toggle Data Console"],null),new k(null,2,[$x,new R(null,2,5,S,["⌘/Ctrl","L"],null),gF,"Toggle Log Cockpit"],null),new k(null,2,[$x,new R(null,2,5,S,["⌘/Ctrl","]"],null),gF,"Next tab (console workspace / cockpit lens)"],null),new k(null,2,[$x,new R(null,2,5,S,["⌘/Ctrl","["],null),gF,"Previous tab"],null),new k(null,2,[$x,new R(null,2,5,S,["⌘/Ctrl","E"],null),gF,"Add Entity"],null),new k(null,2,[$x,new R(null,2,5,
|
|
3680
3680
|
S,["⌘/Ctrl","I"],null),gF,"Import Entity"],null),new k(null,2,[$x,new R(null,2,5,S,["⌘/Ctrl","D"],null),gF,"Toggle Deploy drawer"],null),new k(null,2,[$x,new R(null,2,5,S,["⌘/Ctrl","H"],null),gF,"Versions"],null),new k(null,2,[$x,new R(null,2,5,S,["⌘/Ctrl","O"],null),gF,"Open Dataset"],null),new k(null,2,[$x,new R(null,2,5,S,["⌘/Ctrl","B"],null),gF,"Toggle light/dark theme"],null),new k(null,2,[$x,new R(null,2,5,S,["⌘/Ctrl","Z"],null),gF,"Undo"],null),new k(null,3,[$x,new R(null,3,5,S,["⌘/Ctrl","Shift",
|
|
3681
3681
|
"Z"],null),f0,new R(null,2,5,S,["⌘/Ctrl","Y"],null),gF,"Redo"],null),new k(null,2,[$x,new R(null,2,5,S,["↑","↓"],null),gF,"Move through the dataset / versions list"],null),new k(null,2,[$x,new R(null,1,5,S,["Enter"],null),gF,"Open the highlighted dataset or version (saves in the name fields)"],null),new k(null,2,[$x,new R(null,1,5,S,["Esc"],null),gF,"Close an open drawer/popover/console/cockpit, or cancel a relation drag"],null),new k(null,2,[$x,new R(null,1,5,S,["?"],null),gF,"Toggle this help"],
|
|
@@ -3710,8 +3710,8 @@ Gh,Fr,mb);if(l(function(){if(l(u)){var D=t.code,E=new Pj(null,new k(null,2,["Bra
|
|
|
3710
3710
|
I7.h(ME,null);if(mb(t.shiftKey)&&z.h(t.code,"KeyL"))return t.preventDefault(),I7.h(eX,null);if(mb(t.shiftKey)&&z.h(t.code,"KeyE"))return t.preventDefault(),I7.h(aA,null);if(mb(t.shiftKey)&&z.h(t.code,"KeyI"))return t.preventDefault(),l(H7.g(Xu))?null:I7.h(Ss,new k(null,1,[gH,m0],null));if(mb(t.shiftKey)&&z.h(t.code,"KeyD")){t.preventDefault();if(l(H7.g(jy)))return I7.h(PF,null);I7.h(aD,null);return I7.h(ct,null)}if(mb(t.shiftKey)&&z.h(t.code,"KeyH"))return t.preventDefault(),I7.h(Ss,new k(null,1,
|
|
3711
3711
|
[gH,FF],null));if(mb(t.shiftKey)&&z.h(t.code,"KeyO"))return t.preventDefault(),I7.h(sC,null);if(mb(t.shiftKey)&&z.h(t.code,"KeyB"))return t.preventDefault(),I7.h(iw,null)}}return null}var e=ba.wd(a,"open"),f=IDa(a),h=a.tokenResolver;Bk(I(["[synthigy-data-modeling] Initializing..."]));Q.l(X,M,QH,a);I7.h(VA,null);RW();zAa(pj([cC,Ila,Yr,zla,uda,Gha,UA,bla,Ep,Sga,vv,dC,Sha,hF,TC,nq,fy,sA,mia,sba,Mt,FD,Fca,bga,Vx,Hu,mK,oia,ada,gI,$ba,qha,pI,ir,yba,nma,gda,Ica,qJ,kr,nja,uka,Eo,wia,Aba,RB,Ey,Tea,Jia,Ty,
|
|
3712
3712
|
jI,Wfa,BK,qba,hba,WL,GI,qv,Vja,Sja,TG,hga,mI,Hr,gt,Im,iB,cma,Rka],"\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z'/\x3e\n\x3cpath d\x3d'm9 12 2 2 4-4'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'm12 19-7-7 7-7'/\x3e\n\x3cpath d\x3d'M19 12H5'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M3 12h.01'/\x3e\n\x3cpath d\x3d'M3 18h.01'/\x3e\n\x3cpath d\x3d'M3 6h.01'/\x3e\n\x3cpath d\x3d'M8 12h13'/\x3e\n\x3cpath d\x3d'M8 18h13'/\x3e\n\x3cpath d\x3d'M8 6h13'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M12 6v12'/\x3e\n\x3cpath d\x3d'M17.196 9 6.804 15'/\x3e\n\x3cpath d\x3d'm6.804 9 10.392 6'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'm16 17 5-5-5-5'/\x3e\n\x3cpath d\x3d'M21 12H9'/\x3e\n\x3cpath d\x3d'M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3crect ry\x3d'2' rx\x3d'2' y\x3d'8' x\x3d'8' height\x3d'14' width\x3d'14'/\x3e\n\x3cpath d\x3d'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'm21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3'/\x3e\n\x3cpath d\x3d'M12 9v4'/\x3e\n\x3cpath d\x3d'M12 17h.01'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cline y2\x3d'9' y1\x3d'9' x2\x3d'20' x1\x3d'4'/\x3e\n\x3cline y2\x3d'15' y1\x3d'15' x2\x3d'20' x1\x3d'4'/\x3e\n\x3cline y2\x3d'21' y1\x3d'3' x2\x3d'8' x1\x3d'10'/\x3e\n\x3cline y2\x3d'21' y1\x3d'3' x2\x3d'14' x1\x3d'16'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M18 21a8 8 0 0 0-16 0'/\x3e\n\x3ccircle r\x3d'5' cy\x3d'8' cx\x3d'10'/\x3e\n\x3cpath d\x3d'M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'm7 11 2-2-2-2'/\x3e\n\x3cpath d\x3d'M11 13h4'/\x3e\n\x3crect ry\x3d'2' rx\x3d'2' y\x3d'3' x\x3d'3' height\x3d'18' width\x3d'18'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'm9 18 6-6-6-6'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M18.2 12.27 20 6H4l1.8 6.27a1 1 0 0 0 .95.73h10.5a1 1 0 0 0 .96-.73Z'/\x3e\n\x3cpath d\x3d'M8 13v9'/\x3e\n\x3cpath d\x3d'M16 22v-9'/\x3e\n\x3cpath d\x3d'm9 6 1 7'/\x3e\n\x3cpath d\x3d'm15 6-1 7'/\x3e\n\x3cpath d\x3d'M12 6V2'/\x3e\n\x3cpath d\x3d'M13 2h-2'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'm12 14 4-4'/\x3e\n\x3cpath d\x3d'M3.34 19a10 10 0 1 1 17.32 0'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3crect rx\x3d'2' y\x3d'2' x\x3d'4' height\x3d'20' width\x3d'16'/\x3e\n\x3cline y2\x3d'6' y1\x3d'6' x2\x3d'16' x1\x3d'8'/\x3e\n\x3cline y2\x3d'18' y1\x3d'14' x2\x3d'16' x1\x3d'16'/\x3e\n\x3cpath d\x3d'M16 10h.01'/\x3e\n\x3cpath d\x3d'M12 10h.01'/\x3e\n\x3cpath d\x3d'M8 10h.01'/\x3e\n\x3cpath d\x3d'M12 14h.01'/\x3e\n\x3cpath d\x3d'M8 14h.01'/\x3e\n\x3cpath d\x3d'M12 18h.01'/\x3e\n\x3cpath d\x3d'M8 18h.01'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8'/\x3e\n\x3cpath d\x3d'M3 3v5h5'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3ccircle r\x3d'10' cy\x3d'12' cx\x3d'12'/\x3e\n\x3cpath d\x3d'M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3'/\x3e\n\x3cpath d\x3d'M12 17h.01'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M20.341 6.484A10 10 0 0 1 10.266 21.85'/\x3e\n\x3cpath d\x3d'M3.659 17.516A10 10 0 0 1 13.74 2.152'/\x3e\n\x3ccircle r\x3d'3' cy\x3d'12' cx\x3d'12'/\x3e\n\x3ccircle r\x3d'2' cy\x3d'5' cx\x3d'19'/\x3e\n\x3ccircle r\x3d'2' cy\x3d'19' cx\x3d'5'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M21 7v6h-6'/\x3e\n\x3cpath d\x3d'M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3l3 2.7'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M20 6 9 17l-5-5'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3crect rx\x3d'2' y\x3d'2' x\x3d'4' height\x3d'20' width\x3d'16'/\x3e\n\x3cline y2\x3d'6' y1\x3d'6' x2\x3d'16' x1\x3d'8'/\x3e\n\x3cline y2\x3d'18' y1\x3d'14' x2\x3d'16' x1\x3d'16'/\x3e\n\x3cpath d\x3d'M16 10h.01'/\x3e\n\x3cpath d\x3d'M12 10h.01'/\x3e\n\x3cpath d\x3d'M8 10h.01'/\x3e\n\x3cpath d\x3d'M12 14h.01'/\x3e\n\x3cpath d\x3d'M8 14h.01'/\x3e\n\x3cpath d\x3d'M12 18h.01'/\x3e\n\x3cpath d\x3d'M8 18h.01'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3crect rx\x3d'2' y\x3d'3' x\x3d'3' height\x3d'18' width\x3d'18'/\x3e\n\x3cpath d\x3d'M3 9h18'/\x3e\n\x3cpath d\x3d'M3 15h18'/\x3e\n\x3cpath d\x3d'M9 3v18'/\x3e\n\x3cpath d\x3d'M15 3v18'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0'/\x3e\n\x3ccircle r\x3d'3' cy\x3d'12' cx\x3d'12'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/\x3e\n\x3cpath d\x3d'M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z'/\x3e\n\x3cpath d\x3d'm3.3 7 8.7 5 8.7-5'/\x3e\n\x3cpath d\x3d'M12 22V12'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3ccircle r\x3d'10' cy\x3d'12' cx\x3d'12'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cline y2\x3d'15' y1\x3d'3' x2\x3d'6' x1\x3d'6'/\x3e\n\x3ccircle r\x3d'3' cy\x3d'6' cx\x3d'18'/\x3e\n\x3ccircle r\x3d'3' cy\x3d'18' cx\x3d'6'/\x3e\n\x3cpath d\x3d'M18 9a9 9 0 0 1-9 9'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M12 2v20'/\x3e\n\x3cpath d\x3d'm15 19-3 3-3-3'/\x3e\n\x3cpath d\x3d'm19 9 3 3-3 3'/\x3e\n\x3cpath d\x3d'M2 12h20'/\x3e\n\x3cpath d\x3d'm5 9-3 3 3 3'/\x3e\n\x3cpath d\x3d'm9 5 3-3 3 3'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915'/\x3e\n\x3ccircle r\x3d'3' cy\x3d'12' cx\x3d'12'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M5 12h14'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z'/\x3e\n\x3cpath d\x3d'M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7'/\x3e\n\x3cpath d\x3d'M7 3v4a1 1 0 0 0 1 1h7'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'm2 16 4.039-9.69a.5.5 0 0 1 .923 0L11 16'/\x3e\n\x3cpath d\x3d'M22 9v7'/\x3e\n\x3cpath d\x3d'M3.304 13h6.392'/\x3e\n\x3ccircle r\x3d'3.5' cy\x3d'12.5' cx\x3d'18.5'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'm21 21-4.34-4.34'/\x3e\n\x3ccircle r\x3d'8' cy\x3d'11' cx\x3d'11'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49'/\x3e\n\x3cpath d\x3d'M14.084 14.158a3 3 0 0 1-4.242-4.242'/\x3e\n\x3cpath d\x3d'M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143'/\x3e\n\x3cpath d\x3d'm2 2 20 20'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3crect rx\x3d'2' y\x3d'3' x\x3d'3' height\x3d'18' width\x3d'18'/\x3e\n\x3cpath d\x3d'M3 9h18'/\x3e\n\x3cpath d\x3d'M3 15h18'/\x3e\n\x3cpath d\x3d'M9 3v18'/\x3e\n\x3cpath d\x3d'M15 3v18'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M12.586 12.586 19 19'/\x3e\n\x3cpath d\x3d'M3.688 3.037a.497.497 0 0 0-.651.651l6.5 15.999a.501.501 0 0 0 .947-.062l1.569-6.083a2 2 0 0 1 1.448-1.479l6.124-1.579a.5.5 0 0 0 .063-.947z'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M18 21a8 8 0 0 0-16 0'/\x3e\n\x3ccircle r\x3d'5' cy\x3d'8' cx\x3d'10'/\x3e\n\x3cpath d\x3d'M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3ccircle r\x3d'1' cy\x3d'7' cx\x3d'10'/\x3e\n\x3ccircle r\x3d'1' cy\x3d'20' cx\x3d'4'/\x3e\n\x3cpath d\x3d'M4.7 19.3 19 5'/\x3e\n\x3cpath d\x3d'm21 3-3 1 2 2Z'/\x3e\n\x3cpath d\x3d'M9.26 7.68 5 12l2 5'/\x3e\n\x3cpath d\x3d'm10 14 5 2 3.5-3.5'/\x3e\n\x3cpath d\x3d'm18 12 1-1 1 1-1 1Z'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'm6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3ccircle r\x3d'10' cy\x3d'12' cx\x3d'12'/\x3e\n\x3cpath d\x3d'M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3'/\x3e\n\x3cpath d\x3d'M12 17h.01'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M8 3H5a2 2 0 0 0-2 2v3'/\x3e\n\x3cpath d\x3d'M21 8V5a2 2 0 0 0-2-2h-3'/\x3e\n\x3cpath d\x3d'M3 16v3a2 2 0 0 0 2 2h3'/\x3e\n\x3cpath d\x3d'M16 21h3a2 2 0 0 0 2-2v-3'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M3 7v6h6'/\x3e\n\x3cpath d\x3d'M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1'/\x3e\n\x3cpath d\x3d'M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3ccircle r\x3d'8' cy\x3d'11' cx\x3d'11'/\x3e\n\x3cline y2\x3d'16.65' y1\x3d'21' x2\x3d'16.65' x1\x3d'21'/\x3e\n\x3cline y2\x3d'11' y1\x3d'11' x2\x3d'14' x1\x3d'8'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/\x3e\n\x3cpath d\x3d'M14 15H9v-5'/\x3e\n\x3cpath d\x3d'M16 3h5v5'/\x3e\n\x3cpath d\x3d'M21 3 9 15'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3crect rx\x3d'2' y\x3d'3' x\x3d'3' height\x3d'18' width\x3d'18'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3ccircle r\x3d'8' cy\x3d'11' cx\x3d'11'/\x3e\n\x3cline y2\x3d'16.65' y1\x3d'21' x2\x3d'16.65' x1\x3d'21'/\x3e\n\x3cline y2\x3d'14' y1\x3d'8' x2\x3d'11' x1\x3d'11'/\x3e\n\x3cline y2\x3d'11' y1\x3d'11' x2\x3d'14' x1\x3d'8'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M5 12h14'/\x3e\n\x3cpath d\x3d'M12 5v14'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3ccircle r\x3d'4' cy\x3d'12' cx\x3d'12'/\x3e\n\x3cpath d\x3d'M12 2v2'/\x3e\n\x3cpath d\x3d'M12 20v2'/\x3e\n\x3cpath d\x3d'm4.93 4.93 1.41 1.41'/\x3e\n\x3cpath d\x3d'm17.66 17.66 1.41 1.41'/\x3e\n\x3cpath d\x3d'M2 12h2'/\x3e\n\x3cpath d\x3d'M20 12h2'/\x3e\n\x3cpath d\x3d'm6.34 17.66-1.41 1.41'/\x3e\n\x3cpath d\x3d'm19.07 4.93-1.41 1.41'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M8 3v3a2 2 0 0 1-2 2H3'/\x3e\n\x3cpath d\x3d'M21 8h-3a2 2 0 0 1-2-2V3'/\x3e\n\x3cpath d\x3d'M3 16h3a2 2 0 0 1 2 2v3'/\x3e\n\x3cpath d\x3d'M16 21v-3a2 2 0 0 1 2-2h3'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3ccircle r\x3d'10' cy\x3d'12' cx\x3d'12'/\x3e\n\x3cpath d\x3d'M12 16v-4'/\x3e\n\x3cpath d\x3d'M12 8h.01'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z'/\x3e\n\x3ccircle fill\x3d'currentColor' r\x3d'.5' cy\x3d'7.5' cx\x3d'16.5'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z'/\x3e\n\x3cpath d\x3d'M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12'/\x3e\n\x3cpath d\x3d'M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M18 6 6 18'/\x3e\n\x3cpath d\x3d'm6 6 12 12'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4'/\x3e\n\x3cpath d\x3d'M14 13.12c0 2.38 0 6.38-1 8.88'/\x3e\n\x3cpath d\x3d'M17.29 21.02c.12-.6.43-2.3.5-3.02'/\x3e\n\x3cpath d\x3d'M2 12a10 10 0 0 1 18-6'/\x3e\n\x3cpath d\x3d'M2 16h.01'/\x3e\n\x3cpath d\x3d'M21.8 16c.2-2 .131-5.354 0-6'/\x3e\n\x3cpath d\x3d'M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2'/\x3e\n\x3cpath d\x3d'M8.65 22c.21-.66.45-1.32.57-2'/\x3e\n\x3cpath d\x3d'M9 6.8a6 6 0 0 1 9 5.2v2'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1'/\x3e\n\x3cpath d\x3d'M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z'/\x3e\n\x3cpath d\x3d'm12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z'/\x3e\n\x3cpath d\x3d'M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0'/\x3e\n\x3cpath d\x3d'M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3crect ry\x3d'2' rx\x3d'2' y\x3d'11' x\x3d'3' height\x3d'11' width\x3d'18'/\x3e\n\x3cpath d\x3d'M7 11V7a5 5 0 0 1 10 0v4'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cline y2\x3d'2' y1\x3d'2' x2\x3d'14' x1\x3d'10'/\x3e\n\x3cline y2\x3d'11' y1\x3d'14' x2\x3d'15' x1\x3d'12'/\x3e\n\x3ccircle r\x3d'8' cy\x3d'14' cx\x3d'12'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M22 5V2l-5.89 5.89'/\x3e\n\x3ccircle r\x3d'3' cy\x3d'15.89' cx\x3d'16.6'/\x3e\n\x3ccircle r\x3d'3' cy\x3d'7.4' cx\x3d'8.11'/\x3e\n\x3ccircle r\x3d'3' cy\x3d'11.65' cx\x3d'12.35'/\x3e\n\x3ccircle r\x3d'3' cy\x3d'5.85' cx\x3d'13.91'/\x3e\n\x3ccircle r\x3d'3' cy\x3d'10.09' cx\x3d'18.15'/\x3e\n\x3ccircle r\x3d'3' cy\x3d'13.2' cx\x3d'6.56'/\x3e\n\x3ccircle r\x3d'3' cy\x3d'17.44' cx\x3d'10.8'/\x3e\n\x3ccircle r\x3d'3' cy\x3d'19' cx\x3d'5'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M12 15V3'/\x3e\n\x3cpath d\x3d'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4'/\x3e\n\x3cpath d\x3d'm7 10 5 5 5-5'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M18 6 7 17l-5-5'/\x3e\n\x3cpath d\x3d'm22 10-7.5 7.5L13 16'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M18 20a6 6 0 0 0-12 0'/\x3e\n\x3ccircle r\x3d'4' cy\x3d'10' cx\x3d'12'/\x3e\n\x3ccircle r\x3d'10' cy\x3d'12' cx\x3d'12'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M21 12a9 9 0 1 1-6.219-8.56'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6'/\x3e\n\x3cpath d\x3d'M3 6h18'/\x3e\n\x3cpath d\x3d'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3cpath d\x3d'M12 3v12'/\x3e\n\x3cpath d\x3d'm17 8-5-5-5 5'/\x3e\n\x3cpath d\x3d'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4'/\x3e\n\x3c/svg\x3e\n;\x3c?xml version\x3d'1.0' encoding\x3d'UTF-8'?\x3e\n\x3csvg stroke\x3d'currentColor' fill\x3d'none' stroke-linejoin\x3d'round' width\x3d'24' xmlns\x3d'http://www.w3.org/2000/svg' stroke-linecap\x3d'round' stroke-width\x3d'2' viewBox\x3d'0 0 24 24' height\x3d'24'\x3e\n\x3crect ry\x3d'2' rx\x3d'2' y\x3d'11' x\x3d'3' height\x3d'11' width\x3d'18'/\x3e\n\x3cpath d\x3d'M7 11V7a5 5 0 0 1 10 0v4'/\x3e\n\x3c/svg\x3e\n".split(";")));
|
|
3713
|
-
if(!l(e.querySelector("#synthigy-font"))){var m=document.createElement("link");m.id="synthigy-font";m.rel="stylesheet";m.href="https://fonts.googleapis.com/css2?family\x3dInter:wght@400;500;600;700;800\x26display\x3dswap";e.appendChild(m)}z2(e,
|
|
3714
|
-
z2(e,
|
|
3713
|
+
if(!l(e.querySelector("#synthigy-font"))){var m=document.createElement("link");m.id="synthigy-font";m.rel="stylesheet";m.href="https://fonts.googleapis.com/css2?family\x3dInter:wght@400;500;600;700;800\x26display\x3dswap";e.appendChild(m)}z2(e,Rna,"synthigy-util");z2(e,b2,"synthigy-tokens");z2(e,x2,"synthigy-theme");z2(e,P8,"synthigy-animations");z2(e,y2,"synthigy-action-bar");z2(e,w2,"synthigy-dataset-modal");z2(e,v2,"synthigy-entity-menu");z2(e,Pna,"synthigy-entity-drawer");z2(e,Qna,"synthigy-relation-drawer");
|
|
3714
|
+
z2(e,n9,"synthigy-deploy-drawer");pX(e);z2(e,":host {\n display: none;\n position: fixed;\n inset: 0;\n z-index: 9999;\n overscroll-behavior: contain;\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n :host([open]) {\n display: block;\n }","synthigy-host");m=document.createElement("div");m.className="modeling-container";m.style.width="100%";
|
|
3715
3715
|
m.style.height="100%";e.appendChild(m);m=document.createElement("synthigy-data-console");l(f)&&m.setAttribute("endpoint",[p.g(f),"/data"].join(""));m.setAttribute("embedded","");bsa(new k(null,3,[oA,l(f)?[p.g(f),"/data"].join(""):null,sw,function(){return l(h)?h:function(){var t=RO();return l(t)?["Bearer ",p.g(t)].join(""):null}}(),tp,function(){var t=La(a,"xsql");return null==t?null:fi(t)}()],null));m.addEventListener("close",function(){return I7.h(mL,null)});e.appendChild(m);Q.l(X,M,PA,m);m=document.createElement("synthigy-log-cockpit");
|
|
3716
3716
|
l(f)&&m.setAttribute("endpoint",[p.g(f),"/data"].join(""));m.setAttribute("embedded","");m.addEventListener("close",function(){return I7.h(GJ,null)});e.appendChild(m);Q.l(X,M,dy,m);SAa();fBa();TAa();gBa();CAa();l(f)&&(Sqa(f),i2(new k(null,4,[oA,f,SK,bR,Gr,Apa,Av,function(){return RO()}],null)));l(h)&&$$(h,function(t){return l(t)?(i2(new k(null,1,[Av,Sg(t)],null)),MT(new k(null,2,[oA,f,io,Sg(t)],null)),g9(),ara(),X$()):null});YQ(function(t){t=N(t);t=v(t,FA);l(t)?(g9(),X$()):(h9(),l8());return Y$(e)});
|
|
3717
3717
|
MAa();document.addEventListener("keydown",d);Q.l(X,M,HG,d);document.addEventListener("keyup",c);window.addEventListener("blur",b);Q.o(X,M,Zx,c,I([km,b]));Hk(j2,new R(null,2,5,S,[YG,a],null),function(){return Y$(e)});Hk(X,new R(null,2,5,S,[Ir,a],null),function(t,u,w,y){Y$(e);t=PA.g(y);if(l(t)){u=iH.g(w);var C=iH.g(y);yg(u,C)&&(l(C)?t.setAttribute("open",""):t.removeAttribute("open"))}t=dy.g(y);l(t)&&(u=SG.g(w),C=SG.g(y),yg(u,C)&&(l(C)?t.setAttribute("open",""):t.removeAttribute("open")));if(yg(lu.g(w),
|