@javierfrancoleal/dsh-supervisor 1.0.32 → 1.0.34
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/dashboard.html +15 -16
- package/package.json +1 -1
package/dashboard.html
CHANGED
|
@@ -116,7 +116,8 @@ td,th{border-bottom:1px solid var(--line);padding:9px 6px;text-align:left}
|
|
|
116
116
|
#langStep.done{opacity:0;visibility:hidden}
|
|
117
117
|
.langstep-inner{text-align:center}
|
|
118
118
|
.langstep-hint{color:rgba(255,255,255,.9);font-size:14px;margin:18px 0 4px}
|
|
119
|
-
.langstep-inner .langreel{width:min(340px,86vw)}
|
|
119
|
+
.langstep-inner .langreel{width:min(340px,86vw);background:rgba(167,139,250,.55)!important;border:1px solid rgba(255,255,255,.6)!important;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}
|
|
120
|
+
.langstep-inner svg{width:150px;height:150px}
|
|
120
121
|
.langstep-inner svg path.draw{stroke-dasharray:100;animation:drawStroke 1.2s cubic-bezier(.4,0,.2,1) forwards}
|
|
121
122
|
@media (prefers-reduced-motion: reduce){.langstep-inner svg path.draw{animation:none}}
|
|
122
123
|
#loginView{background:transparent;backdrop-filter:none;-webkit-backdrop-filter:none;border:none;box-shadow:none;text-align:center}
|
|
@@ -127,7 +128,7 @@ td,th{border-bottom:1px solid var(--line);padding:9px 6px;text-align:left}
|
|
|
127
128
|
#loginView .loginerr{background:rgba(239,68,68,.25);color:#fff;border:1px solid rgba(255,255,255,.3)}
|
|
128
129
|
#loginView .eye{color:#fff}
|
|
129
130
|
#loginView .btn.gray{background:rgba(255,255,255,.16);color:#fff;border:1px solid rgba(255,255,255,.3)}
|
|
130
|
-
.langreel{width:min(340px,86vw);height:58px;margin:10px auto;background:rgba(
|
|
131
|
+
.langreel{width:min(340px,86vw);height:58px;margin:10px auto;background:rgba(167,139,250,.45);border:1px solid rgba(255,255,255,.55);border-radius:10px;backdrop-filter:blur(14px);overflow:hidden;cursor:pointer;position:relative;box-shadow:0 10px 30px rgba(76,29,149,.20)}
|
|
131
132
|
body.dark .langreel{background:rgba(124,92,255,.35)}
|
|
132
133
|
.ticks{display:flex;flex-direction:column;will-change:transform}
|
|
133
134
|
.tick{height:58px;display:flex;align-items:center;justify-content:center;font-size:18px;font-weight:600;opacity:.85;color:#fff}
|
|
@@ -180,7 +181,6 @@ body.wall pre{max-height:40vh}
|
|
|
180
181
|
<div id="langStep" class="hidden" style="display:none">
|
|
181
182
|
<div class="langstep-inner">
|
|
182
183
|
<svg width="110" height="110" viewBox="0 0 64 64" aria-hidden="true"><path class="draw" pathLength="100" d="M10 32 C10 22 16 14 32 14 C48 14 54 22 54 32 C54 42 48 50 32 50 C20 50 12.5 45.2 10.5 38.5 C14 42.5 20 41 25.4 34.8 A6.6 6.6 0 0 1 38.6 34.8 C38.6 31.4 36.6 28.2 32 22.5 C27.4 28.2 25.4 31.4 25.4 34.8" fill="none" stroke="#fff" stroke-width="5" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
|
183
|
-
<p id="langStepHint" class="langstep-hint">Choose your language</p>
|
|
184
184
|
<div class="langreel" id="langStepReel"><div class="ticks" id="langStepTicks"></div></div>
|
|
185
185
|
</div>
|
|
186
186
|
</div>
|
|
@@ -208,7 +208,6 @@ body.wall pre{max-height:40vh}
|
|
|
208
208
|
<p id="tagline">The AI works. The human decides.</p>
|
|
209
209
|
</div>
|
|
210
210
|
<h2 id="loginTitle" style="font-size:14px;color:var(--muted);text-align:center">Log in</h2>
|
|
211
|
-
<div class="langreel" id="langReel"><div class="ticks" id="langTicks"></div></div>
|
|
212
211
|
<input id="loginUser" placeholder="User" autocomplete="username">
|
|
213
212
|
<div class="passwrap">
|
|
214
213
|
<input id="loginPass" type="password" placeholder="Password" autocomplete="current-password">
|
|
@@ -416,7 +415,13 @@ $("soundBtn").onclick=()=>{soundOn=!soundOn;try{localStorage.setItem("dsh-sound"
|
|
|
416
415
|
try{darkOn=localStorage.getItem("dsh-dark")==="1";soundOn=localStorage.getItem("dsh-sound")!=="0";}catch(e){}
|
|
417
416
|
applyToggles();
|
|
418
417
|
document.body.classList.add("loginpage");
|
|
419
|
-
|
|
418
|
+
const firstRun=(()=>{try{return !localStorage.getItem("dsh-lang");}catch(e){return true;}})();
|
|
419
|
+
if(firstRun){
|
|
420
|
+
$("splash").style.display="none";
|
|
421
|
+
setTimeout(()=>{$("langStep").style.display="flex";},150);
|
|
422
|
+
}else{
|
|
423
|
+
setTimeout(()=>{$("splash").classList.add("done");},1300);
|
|
424
|
+
}
|
|
420
425
|
async function reRenderDynamic(){
|
|
421
426
|
if(!me)return;
|
|
422
427
|
if(me.role==="owner"){loadMetrics($("ownerMetrics"));loadUsers();loadUsage();loadField();renderOrders();renderSuggest();}
|
|
@@ -501,7 +506,7 @@ $("exportBtn").onclick=()=>doExport("reports");
|
|
|
501
506
|
$("exportOrdersBtn").onclick=()=>doExport("orders");
|
|
502
507
|
function panelLinks(){const u=me?encodeURIComponent(me.name):"",r=me?encodeURIComponent(me.role):"",lb=me?encodeURIComponent(me.label||me.name):"";$("openPanelLink").setAttribute("href","/panel?user="+u+"&role="+r+"&label="+lb+"&lang="+cur);$("leadOpenPanelLink").setAttribute("href","/panel?user="+u+"&role="+r+"&label="+lb+"&lang="+cur);}
|
|
503
508
|
function applyLang(){
|
|
504
|
-
|
|
509
|
+
// (the language is persisted only on an explicit human choice)
|
|
505
510
|
$("welcomeClose").onclick=()=>{$("welcomeCard").style.display="none";try{localStorage.setItem("lv-welcome","1");}catch(e){}};
|
|
506
511
|
$("splashTag").textContent=t("tagline");
|
|
507
512
|
$("welcomeTitle").textContent=t("welcomeTitle");$("welcomeBody").textContent=t("welcomeBody");$("wallNote").textContent=t("wallNote");
|
|
@@ -545,12 +550,12 @@ function buildLangMenu(){
|
|
|
545
550
|
const r=document.createElement("div");
|
|
546
551
|
r.className="orow"+(l==="en"?" center":"");
|
|
547
552
|
r.innerHTML='<span>'+LANGNAMES[l]+'</span><span class="sub">'+l.toUpperCase()+'</span>';
|
|
548
|
-
r.onclick=()=>{cur=l;applyLang();$("langOverlay").style.display="none";markReel();$("langStep").classList.add("done");};
|
|
553
|
+
r.onclick=()=>{cur=l;try{localStorage.setItem("dsh-lang",cur);}catch(e){}applyLang();$("langOverlay").style.display="none";markReel();$("langStep").classList.add("done");const sp=$("splash");sp.classList.remove("done");const p=sp.querySelector(".draw");if(p){p.style.animation="none";void p.offsetWidth;p.style.animation="";}setTimeout(()=>{sp.classList.add("done");},2600);};
|
|
549
554
|
rows.appendChild(r);
|
|
550
555
|
}
|
|
551
556
|
}
|
|
552
557
|
function markReel(){
|
|
553
|
-
document.querySelectorAll("#
|
|
558
|
+
document.querySelectorAll("#langStepTicks .tick").forEach(t=>t.classList.toggle("active",t.dataset.l===cur));
|
|
554
559
|
}
|
|
555
560
|
function buildReel(ticksId){
|
|
556
561
|
for(let pass=0;pass<2;pass++){
|
|
@@ -569,19 +574,13 @@ function buildReel(ticksId){
|
|
|
569
574
|
})(t0);
|
|
570
575
|
}
|
|
571
576
|
buildLangMenu();
|
|
572
|
-
buildReel("langTicks");
|
|
573
577
|
buildReel("langStepTicks");
|
|
574
578
|
markReel();
|
|
575
|
-
$("langReel").onclick=()=>{$("langOverlay").style.display="flex";const en=document.querySelector("#langRows .center");if(en)en.scrollIntoView({block:"center"});};
|
|
576
579
|
$("langStepReel").onclick=()=>{$("langOverlay").style.display="flex";const en=document.querySelector("#langRows .center");if(en)en.scrollIntoView({block:"center"});};
|
|
577
580
|
$("closeOverlay").onclick=()=>{$("langOverlay").style.display="none";};
|
|
578
581
|
// The Apple flow: after the splash, the language menu opens once (until chosen).
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
if(!localStorage.getItem("dsh-lang")){$("langStep").style.display="flex";}
|
|
582
|
-
}catch(e){}
|
|
583
|
-
},1900);
|
|
584
|
-
function pill(l){for(const host of ["footLangs"]){const el=$(host);if(!el)continue;const b=document.createElement("button");b.className="pill";b.dataset.l=l;b.textContent=LANG[l];b.onclick=()=>{cur=l;applyLang();};$(host).appendChild(b);}}
|
|
582
|
+
|
|
583
|
+
function pill(l){for(const host of ["footLangs"]){const el=$(host);if(!el)continue;const b=document.createElement("button");b.className="pill";b.dataset.l=l;b.textContent=LANG[l];b.onclick=()=>{cur=l;try{localStorage.setItem("dsh-lang",cur);}catch(e){}applyLang();};$(host).appendChild(b);}}
|
|
585
584
|
for(const l of Object.keys(LANG))pill(l);
|
|
586
585
|
try{const q=new URLSearchParams(location.search);const ql=q.get("lang");if(ql&&S[ql])cur=ql;}catch(e){}
|
|
587
586
|
try{const saved=localStorage.getItem("dsh-lang");if(saved&&S[saved])cur=saved;}catch(e){}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@javierfrancoleal/dsh-supervisor",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.34",
|
|
4
4
|
"description": "The Veilleux central control plane of the J.Franco agentic workflow suite: user accounts, the live conversation flow (listen → per-person summary → confirm → orders), telemetry, and the universal sector dashboard with 10 languages. Created by J.Franco.",
|
|
5
5
|
"author": "J.Franco",
|
|
6
6
|
"license": "MIT",
|