@javierfrancoleal/dsh-supervisor 1.0.27 → 1.0.29

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 +33 -8
  2. package/package.json +1 -1
package/dashboard.html CHANGED
@@ -111,6 +111,21 @@ td,th{border-bottom:1px solid var(--line);padding:9px 6px;text-align:left}
111
111
  .orow .sub{font-size:13px;opacity:.7}
112
112
  .orow.center{background:rgba(255,255,255,.30);font-size:23px;font-weight:800;border:1px solid rgba(255,255,255,.45)}
113
113
  .orow.center .sub{opacity:.9}
114
+ #langStep{position:fixed;inset:0;background:linear-gradient(160deg,#4D6BFE,#7c5cff 60%,#a78bfa);display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:95;transition:opacity .45s,visibility .45s}
115
+ #langStep.done{opacity:0;visibility:hidden}
116
+ .langstep-inner{text-align:center}
117
+ .langstep-hint{color:rgba(255,255,255,.9);font-size:14px;margin:18px 0 4px}
118
+ .langstep-inner .langreel{width:min(340px,86vw)}
119
+ .langstep-inner svg path.draw{stroke-dasharray:100;animation:drawStroke 1.2s cubic-bezier(.4,0,.2,1) forwards}
120
+ @media (prefers-reduced-motion: reduce){.langstep-inner svg path.draw{animation:none}}
121
+ #loginView{background:transparent;backdrop-filter:none;-webkit-backdrop-filter:none;border:none;box-shadow:none;text-align:center}
122
+ #loginView h2,#loginView .loginbrand h2{color:#fff}
123
+ #loginView .loginbrand p,#loginView .hint,#loginView .note{color:rgba(255,255,255,.82)}
124
+ #loginView input,#loginView select{background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.35);color:#fff}
125
+ #loginView input::placeholder{color:rgba(255,255,255,.7)}
126
+ #loginView .loginerr{background:rgba(239,68,68,.25);color:#fff;border:1px solid rgba(255,255,255,.3)}
127
+ #loginView .eye{color:#fff}
128
+ #loginView .btn.gray{background:rgba(255,255,255,.16);color:#fff;border:1px solid rgba(255,255,255,.3)}
114
129
  .langreel{width:min(340px,86vw);height:58px;margin:10px auto;background:rgba(255,255,255,.10);border:1px solid rgba(255,255,255,.30);border-radius:10px;backdrop-filter:blur(8px);overflow:hidden;cursor:pointer;position:relative;box-shadow:0 10px 30px rgba(15,23,42,.15)}
115
130
  body.dark .langreel{background:rgba(20,31,49,.55)}
116
131
  .ticks{display:flex;flex-direction:column;will-change:transform}
@@ -161,7 +176,14 @@ body.wall pre{max-height:40vh}
161
176
  </style>
162
177
  </head>
163
178
  <body>
164
- <div id="splash"><div class="splash-inner">
179
+ <div id="langStep" class="hidden" style="display:none">
180
+ <div class="langstep-inner">
181
+ <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>
182
+ <p id="langStepHint" class="langstep-hint">Choose your language</p>
183
+ <div class="langreel" id="langStepReel"><div class="ticks" id="langStepTicks"></div></div>
184
+ </div>
185
+ </div>
186
+ <div id="splash"><div class="splash-inner">
165
187
  <svg width="96" height="96" viewBox="0 0 64 64" aria-hidden="true"><defs><linearGradient id="splg" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#ffffff"/><stop offset="1" stop-color="#e0e7ff"/></linearGradient></defs><path 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="url(#splg)" stroke-width="5" stroke-linecap="round" stroke-linejoin="round"/></svg>
166
188
  <b>Le Veilleux</b><span id="splashTag">The AI works. The human watches, decides, reviews.</span>
167
189
  </div></div>
@@ -392,6 +414,7 @@ $("darkBtn").onclick=()=>{darkOn=!darkOn;try{localStorage.setItem("dsh-dark",dar
392
414
  $("soundBtn").onclick=()=>{soundOn=!soundOn;try{localStorage.setItem("dsh-sound",soundOn?"1":"0");}catch(e){}applyToggles();};
393
415
  try{darkOn=localStorage.getItem("dsh-dark")==="1";soundOn=localStorage.getItem("dsh-sound")!=="0";}catch(e){}
394
416
  applyToggles();
417
+ document.body.classList.add("loginpage");
395
418
  setTimeout(()=>{$("splash").classList.add("done");},1500);
396
419
  async function reRenderDynamic(){
397
420
  if(!me)return;
@@ -521,37 +544,39 @@ function buildLangMenu(){
521
544
  const r=document.createElement("div");
522
545
  r.className="orow"+(l==="en"?" center":"");
523
546
  r.innerHTML='<span>'+LANGNAMES[l]+'</span><span class="sub">'+l.toUpperCase()+'</span>';
524
- r.onclick=()=>{cur=l;applyLang();$("langOverlay").style.display="none";markReel();};
547
+ r.onclick=()=>{cur=l;applyLang();$("langOverlay").style.display="none";markReel();$("langStep").classList.add("done");};
525
548
  rows.appendChild(r);
526
549
  }
527
550
  }
528
551
  function markReel(){
529
- document.querySelectorAll("#langTicks .tick").forEach(t=>t.classList.toggle("active",t.dataset.l===cur));
552
+ document.querySelectorAll("#langTicks .tick,#langStepTicks .tick").forEach(t=>t.classList.toggle("active",t.dataset.l===cur));
530
553
  }
531
- function buildReel(){
554
+ function buildReel(ticksId){
532
555
  for(let pass=0;pass<2;pass++){
533
556
  for(const l of Object.keys(LANG)){
534
557
  const d=document.createElement("div");
535
558
  d.className="tick";d.dataset.l=l;d.textContent=LANGNAMES[l];
536
- $("langTicks").appendChild(d);
559
+ $(ticksId).appendChild(d);
537
560
  }
538
561
  }
539
562
  const N=Object.keys(LANG).length,H=58,CYCLE=20000;
540
563
  const t0=performance.now();
541
564
  (function frame(now){
542
565
  const t=(now-t0)%CYCLE;
543
- $("langTicks").style.transform="translateY(-"+((t/CYCLE)*N*H)+"px)";
566
+ $(ticksId).style.transform="translateY(-"+((t/CYCLE)*N*H)+"px)";
544
567
  requestAnimationFrame(frame);
545
568
  })(t0);
546
569
  }
547
570
  buildLangMenu();
548
- buildReel();
571
+ buildReel("langTicks");
572
+ buildReel("langStepTicks");
549
573
  markReel();
550
574
  $("langReel").onclick=()=>{$("langOverlay").style.display="flex";const en=document.querySelector("#langRows .center");if(en)en.scrollIntoView({block:"center"});};
575
+ $("langStepReel").onclick=()=>{$("langOverlay").style.display="flex";const en=document.querySelector("#langRows .center");if(en)en.scrollIntoView({block:"center"});};
551
576
  $("closeOverlay").onclick=()=>{$("langOverlay").style.display="none";};
552
577
  // The Apple flow: after the splash, the language menu opens once (until chosen).
553
578
  setTimeout(()=>{
554
- try{if(!localStorage.getItem("dsh-lang")){$("langOverlay").style.display="flex";}}catch(e){}
579
+ $("langStep").style.display="flex";
555
580
  },1600);
556
581
  function pill(l){for(const host of ["langs","footLangs"]){const b=document.createElement("button");b.className="pill";b.dataset.l=l;b.textContent=LANG[l];b.onclick=()=>{cur=l;applyLang();};$(host).appendChild(b);}}
557
582
  for(const l of Object.keys(LANG))pill(l);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@javierfrancoleal/dsh-supervisor",
3
- "version": "1.0.27",
3
+ "version": "1.0.29",
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",