@javierfrancoleal/dsh-supervisor 1.0.26 → 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 +87 -2
  2. package/package.json +1 -1
package/dashboard.html CHANGED
@@ -102,6 +102,34 @@ td,th{border-bottom:1px solid var(--line);padding:9px 6px;text-align:left}
102
102
  .row .btn{flex:1;min-width:110px}
103
103
  .switchuser{margin-top:26px;text-align:center}
104
104
  .langs{display:flex;gap:8px;flex-wrap:wrap;justify-content:center;margin:8px 0 14px}
105
+ .langov{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:90;animation:rise .3s ease}
106
+ .langov .top{position:absolute;top:22px;right:26px}
107
+ .langov .close{background:rgba(255,255,255,.15);border:1px solid rgba(255,255,255,.3);color:#fff;border-radius:999px;width:44px;height:44px;font-size:18px;cursor:pointer}
108
+ .orow{width:min(520px,92vw);display:flex;justify-content:space-between;align-items:center;padding:15px 22px;border-radius:14px;font-size:19px;color:#fff;cursor:pointer;transition:background .15s,transform .1s}
109
+ .orow:hover{background:rgba(255,255,255,.12)}
110
+ .orow:active{transform:scale(.98)}
111
+ .orow .sub{font-size:13px;opacity:.7}
112
+ .orow.center{background:rgba(255,255,255,.30);font-size:23px;font-weight:800;border:1px solid rgba(255,255,255,.45)}
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)}
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)}
130
+ body.dark .langreel{background:rgba(20,31,49,.55)}
131
+ .ticks{display:flex;flex-direction:column;will-change:transform}
132
+ .tick{height:58px;display:flex;align-items:center;justify-content:center;font-size:18px;font-weight:600;opacity:.85;color:#fff}
105
133
  .pill{background:var(--card);border:1px solid var(--line);border-radius:999px;padding:8px 13px;font-size:13px;cursor:pointer}
106
134
  .pill.active{background:var(--blue);color:#fff;border-color:var(--blue)}
107
135
  .person{background:var(--card2);border:1px solid var(--line);border-radius:16px;padding:14px;margin:10px 0}
@@ -148,7 +176,14 @@ body.wall pre{max-height:40vh}
148
176
  </style>
149
177
  </head>
150
178
  <body>
151
- <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">
152
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>
153
188
  <b>Le Veilleux</b><span id="splashTag">The AI works. The human watches, decides, reviews.</span>
154
189
  </div></div>
@@ -161,6 +196,10 @@ body.wall pre{max-height:40vh}
161
196
  <button class="btn small gray" id="logoutBtn" style="display:none">Log out</button>
162
197
  </header>
163
198
  <main>
199
+ <div id="langOverlay" class="langov hidden" style="display:none">
200
+ <div class="top"><button class="close" id="closeOverlay">✕</button></div>
201
+ <div id="langRows"></div>
202
+ </div>
164
203
  <div id="loginView" class="card" style="max-width:440px;margin:26px auto">
165
204
  <div class="loginbrand">
166
205
  <div class="mark" style="background:none;box-shadow:none"><svg width="64" height="64" viewBox="0 0 64 64" aria-hidden="true"><defs><linearGradient id="osgd" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#4D6BFE"/><stop offset="1" stop-color="#7c5cff"/></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(#osgd)" stroke-width="5" stroke-linecap="round" stroke-linejoin="round"/></svg></div>
@@ -168,7 +207,7 @@ body.wall pre{max-height:40vh}
168
207
  <p id="tagline">The AI works. The human decides.</p>
169
208
  </div>
170
209
  <h2 id="loginTitle" style="font-size:14px;color:var(--muted);text-align:center">Log in</h2>
171
- <div id="langs" class="langs"></div>
210
+ <div class="langreel" id="langReel"><div class="ticks" id="langTicks"></div></div>
172
211
  <input id="loginUser" placeholder="User" autocomplete="username">
173
212
  <div class="passwrap">
174
213
  <input id="loginPass" type="password" placeholder="Password" autocomplete="current-password">
@@ -496,6 +535,52 @@ function applyLang(){
496
535
  panelLinks();
497
536
  reRenderDynamic();
498
537
  }
538
+ const LANGNAMES={es:"Español",en:"English",fr:"Français",de:"Deutsch",it:"Italiano",pt:"Português",zh:"中文",ja:"日本語",ko:"한국어",ar:"العربية"};
539
+ const LANGORDER=["it","zh","de","es","en","fr","ja","pt","ko","ar"];
540
+ function buildLangMenu(){
541
+ const rows=$("langRows");
542
+ for(const l of LANGORDER){
543
+ const r=document.createElement("div");
544
+ r.className="orow"+(l==="en"?" center":"");
545
+ r.innerHTML='<span>'+LANGNAMES[l]+'</span><span class="sub">'+l.toUpperCase()+'</span>';
546
+ r.onclick=()=>{cur=l;applyLang();$("langOverlay").style.display="none";markReel();$("langStep").classList.add("done");};
547
+ rows.appendChild(r);
548
+ }
549
+ }
550
+ function markReel(){
551
+ document.querySelectorAll("#langTicks .tick,#langStepTicks .tick").forEach(t=>t.classList.toggle("active",t.dataset.l===cur));
552
+ }
553
+ function buildReel(ticksId){
554
+ for(let pass=0;pass<2;pass++){
555
+ for(const l of Object.keys(LANG)){
556
+ const d=document.createElement("div");
557
+ d.className="tick";d.dataset.l=l;d.textContent=LANGNAMES[l];
558
+ $(ticksId).appendChild(d);
559
+ }
560
+ }
561
+ const N=Object.keys(LANG).length,H=58,CYCLE=20000;
562
+ const t0=performance.now();
563
+ (function frame(now){
564
+ const t=(now-t0)%CYCLE;
565
+ $(ticksId).style.transform="translateY(-"+((t/CYCLE)*N*H)+"px)";
566
+ requestAnimationFrame(frame);
567
+ })(t0);
568
+ }
569
+ buildLangMenu();
570
+ buildReel("langTicks");
571
+ buildReel("langStepTicks");
572
+ markReel();
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"});};
575
+ $("closeOverlay").onclick=()=>{$("langOverlay").style.display="none";};
576
+ // The Apple flow: after the splash, the language menu opens once (until chosen).
577
+ setTimeout(()=>{
578
+ try{
579
+ if(!localStorage.getItem("dsh-lang")){
580
+ $("langStep").style.display="flex";
581
+ }
582
+ }catch(e){}
583
+ },1600);
499
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);}}
500
585
  for(const l of Object.keys(LANG))pill(l);
501
586
  try{const q=new URLSearchParams(location.search);const ql=q.get("lang");if(ql&&S[ql])cur=ql;}catch(e){}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@javierfrancoleal/dsh-supervisor",
3
- "version": "1.0.26",
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",