@javierfrancoleal/dsh-supervisor 1.0.27 → 1.0.28

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 +36 -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>
@@ -521,37 +543,43 @@ function buildLangMenu(){
521
543
  const r=document.createElement("div");
522
544
  r.className="orow"+(l==="en"?" center":"");
523
545
  r.innerHTML='<span>'+LANGNAMES[l]+'</span><span class="sub">'+l.toUpperCase()+'</span>';
524
- r.onclick=()=>{cur=l;applyLang();$("langOverlay").style.display="none";markReel();};
546
+ r.onclick=()=>{cur=l;applyLang();$("langOverlay").style.display="none";markReel();$("langStep").classList.add("done");};
525
547
  rows.appendChild(r);
526
548
  }
527
549
  }
528
550
  function markReel(){
529
- document.querySelectorAll("#langTicks .tick").forEach(t=>t.classList.toggle("active",t.dataset.l===cur));
551
+ document.querySelectorAll("#langTicks .tick,#langStepTicks .tick").forEach(t=>t.classList.toggle("active",t.dataset.l===cur));
530
552
  }
531
- function buildReel(){
553
+ function buildReel(ticksId){
532
554
  for(let pass=0;pass<2;pass++){
533
555
  for(const l of Object.keys(LANG)){
534
556
  const d=document.createElement("div");
535
557
  d.className="tick";d.dataset.l=l;d.textContent=LANGNAMES[l];
536
- $("langTicks").appendChild(d);
558
+ $(ticksId).appendChild(d);
537
559
  }
538
560
  }
539
561
  const N=Object.keys(LANG).length,H=58,CYCLE=20000;
540
562
  const t0=performance.now();
541
563
  (function frame(now){
542
564
  const t=(now-t0)%CYCLE;
543
- $("langTicks").style.transform="translateY(-"+((t/CYCLE)*N*H)+"px)";
565
+ $(ticksId).style.transform="translateY(-"+((t/CYCLE)*N*H)+"px)";
544
566
  requestAnimationFrame(frame);
545
567
  })(t0);
546
568
  }
547
569
  buildLangMenu();
548
- buildReel();
570
+ buildReel("langTicks");
571
+ buildReel("langStepTicks");
549
572
  markReel();
550
573
  $("langReel").onclick=()=>{$("langOverlay").style.display="flex";const en=document.querySelector("#langRows .center");if(en)en.scrollIntoView({block:"center"});};
574
+ $("langStepReel").onclick=()=>{$("langOverlay").style.display="flex";const en=document.querySelector("#langRows .center");if(en)en.scrollIntoView({block:"center"});};
551
575
  $("closeOverlay").onclick=()=>{$("langOverlay").style.display="none";};
552
576
  // The Apple flow: after the splash, the language menu opens once (until chosen).
553
577
  setTimeout(()=>{
554
- try{if(!localStorage.getItem("dsh-lang")){$("langOverlay").style.display="flex";}}catch(e){}
578
+ try{
579
+ if(!localStorage.getItem("dsh-lang")){
580
+ $("langStep").style.display="flex";
581
+ }
582
+ }catch(e){}
555
583
  },1600);
556
584
  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
585
  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.28",
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",