@javierfrancoleal/dsh-supervisor 1.0.33 → 1.0.35

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.
Files changed (2) hide show
  1. package/dashboard.html +10 -9
  2. package/package.json +1 -1
package/dashboard.html CHANGED
@@ -116,7 +116,7 @@ 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
120
  .langstep-inner svg{width:150px;height:150px}
121
121
  .langstep-inner svg path.draw{stroke-dasharray:100;animation:drawStroke 1.2s cubic-bezier(.4,0,.2,1) forwards}
122
122
  @media (prefers-reduced-motion: reduce){.langstep-inner svg path.draw{animation:none}}
@@ -164,8 +164,8 @@ body.dark .langreel{background:rgba(124,92,255,.35)}
164
164
  .wall-clock span{font-size:12px;opacity:.75}
165
165
  .live-dot{display:flex;align-items:center;gap:7px;color:#4ade80;font-weight:800;font-size:13px;letter-spacing:.08em}
166
166
  .live-dot::before{content:"";width:9px;height:9px;border-radius:50%;background:#4ade80;animation:pulse 1.6s infinite}
167
- .tick{background:#1b2436;color:#d7e3f4;border-radius:10px;padding:8px 12px;font-size:13.5px;margin:6px 0}
168
- .tick.dim{color:#64748b;background:none;border:1px dashed #334155}
167
+ .wtick{background:#1b2436;color:#d7e3f4;border-radius:10px;padding:8px 12px;font-size:13.5px;margin:6px 0}
168
+ .wtick.dim{color:#64748b;background:none;border:1px dashed #334155}
169
169
  .wall-note{color:#64748b;font-size:12px;text-align:center;margin-top:10px}
170
170
  .welcome{position:relative;border-left:4px solid var(--blue);animation:rise .4s ease}
171
171
  .welcome .wclose{position:absolute;top:10px;right:10px;background:none;border:none;font-size:16px;color:var(--muted);cursor:pointer}
@@ -417,8 +417,9 @@ applyToggles();
417
417
  document.body.classList.add("loginpage");
418
418
  const firstRun=(()=>{try{return !localStorage.getItem("dsh-lang");}catch(e){return true;}})();
419
419
  if(firstRun){
420
- $("splash").classList.add("done");
421
- setTimeout(()=>{$("langStep").style.display="flex";},300);
420
+ $("splash").style.display="none";
421
+ $("loginView").style.display="none";
422
+ $("langStep").style.display="flex";
422
423
  }else{
423
424
  setTimeout(()=>{$("splash").classList.add("done");},1300);
424
425
  }
@@ -506,7 +507,7 @@ $("exportBtn").onclick=()=>doExport("reports");
506
507
  $("exportOrdersBtn").onclick=()=>doExport("orders");
507
508
  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);}
508
509
  function applyLang(){
509
- try{localStorage.setItem("dsh-lang",cur);}catch(e){}
510
+ // (the language is persisted only on an explicit human choice)
510
511
  $("welcomeClose").onclick=()=>{$("welcomeCard").style.display="none";try{localStorage.setItem("lv-welcome","1");}catch(e){}};
511
512
  $("splashTag").textContent=t("tagline");
512
513
  $("welcomeTitle").textContent=t("welcomeTitle");$("welcomeBody").textContent=t("welcomeBody");$("wallNote").textContent=t("wallNote");
@@ -550,7 +551,7 @@ function buildLangMenu(){
550
551
  const r=document.createElement("div");
551
552
  r.className="orow"+(l==="en"?" center":"");
552
553
  r.innerHTML='<span>'+LANGNAMES[l]+'</span><span class="sub">'+l.toUpperCase()+'</span>';
553
- r.onclick=()=>{cur=l;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);};
554
+ 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(()=>{$("loginView").style.display="";},2100);setTimeout(()=>{sp.classList.add("done");},2600);};
554
555
  rows.appendChild(r);
555
556
  }
556
557
  }
@@ -580,7 +581,7 @@ $("langStepReel").onclick=()=>{$("langOverlay").style.display="flex";const en=do
580
581
  $("closeOverlay").onclick=()=>{$("langOverlay").style.display="none";};
581
582
  // The Apple flow: after the splash, the language menu opens once (until chosen).
582
583
 
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;applyLang();};$(host).appendChild(b);}}
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;try{localStorage.setItem("dsh-lang",cur);}catch(e){}applyLang();};$(host).appendChild(b);}}
584
585
  for(const l of Object.keys(LANG))pill(l);
585
586
  try{const q=new URLSearchParams(location.search);const ql=q.get("lang");if(ql&&S[ql])cur=ql;}catch(e){}
586
587
  try{const saved=localStorage.getItem("dsh-lang");if(saved&&S[saved])cur=saved;}catch(e){}
@@ -752,7 +753,7 @@ api("/api/setup-status").then((st)=>{if(st&&st.users===0){$("setupSection").clas
752
753
  const st=sessionStorage.getItem("dsh-sup-token");
753
754
  if(st){token=st;me=JSON.parse(sessionStorage.getItem("dsh-sup-me")||"null");(async()=>{const r=await api("/api/me");if(!r||!r.name){logout();return;}enter();})();}
754
755
  else setWho();
755
- async function wallTick(){try{const r=await (await fetch("/api/wall")).json();const cards=[[t("week"),r.reportsWeek],[t("ordersTitle"),r.orders],[t("feedback"),r.feedback],[t("workersActive"),r.workers],[t("reportsTotal"),r.reports]];$("wallCards").innerHTML=cards.map(c=>'<div class="wall-card"><div class="v">'+(c[1]===undefined?"–":c[1])+'</div><div class="l">'+c[0]+'</div></div>').join("");const ticks=[...(r.ordersTail||[]).map(x=>"🔔 "+esc(x)),...(r.feedbackTail||"").split("\n").filter(Boolean).slice(-4).map(esc)];$("wallFeed").innerHTML=ticks.length?ticks.map(x=>'<div class="tick">'+x+'</div>').join(""):'<div class="tick dim">'+t("noActivity")+'</div>';try{const s=await (await fetch("/api/sector")).json();$("wallSector").textContent=(s&&s.id)?s.id:"";}catch(e){}}catch(e){$("wallFeed").innerHTML='<div class="tick dim">'+t("cannotReach")+'</div>';}}
756
+ async function wallTick(){try{const r=await (await fetch("/api/wall")).json();const cards=[[t("week"),r.reportsWeek],[t("ordersTitle"),r.orders],[t("feedback"),r.feedback],[t("workersActive"),r.workers],[t("reportsTotal"),r.reports]];$("wallCards").innerHTML=cards.map(c=>'<div class="wall-card"><div class="v">'+(c[1]===undefined?"–":c[1])+'</div><div class="l">'+c[0]+'</div></div>').join("");const ticks=[...(r.ordersTail||[]).map(x=>"🔔 "+esc(x)),...(r.feedbackTail||"").split("\n").filter(Boolean).slice(-4).map(esc)];$("wallFeed").innerHTML=ticks.length?ticks.map(x=>'<div class="wtick">'+x+'</div>').join(""):'<div class="wtick dim">'+t("noActivity")+'</div>';try{const s=await (await fetch("/api/sector")).json();$("wallSector").textContent=(s&&s.id)?s.id:"";}catch(e){}}catch(e){$("wallFeed").innerHTML='<div class="wtick dim">'+t("cannotReach")+'</div>';}}
756
757
  function clockTick(){const d=new Date();$("wallClock").textContent=d.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"});$("wallDate").textContent=d.toLocaleDateString([],{weekday:"short",day:"numeric",month:"short"});}
757
758
  if(location.search.indexOf("wall=1")>=0){
758
759
  document.body.classList.add("wall");show("wallView");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@javierfrancoleal/dsh-supervisor",
3
- "version": "1.0.33",
3
+ "version": "1.0.35",
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",