From 9bc109528e2f528a58e93b430aa825073ab36337 Mon Sep 17 00:00:00 2001 From: sravan Date: Thu, 2 Jul 2026 17:39:38 +0530 Subject: [PATCH] fix(brand/ux): real brand C on header, yellow read-tick, sign-in spinner, notif DP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - #5: use the ACTUAL brand C (extracted transparent white C + gold dot from the master app-icon) on the blue headers instead of a hand-drawn mark; login card keeps the app icon. - #3: read-receipt double tick on my own (blue) bubble is now brand yellow (was blue-on-blue, invisible). - #2: Sign-in button shows a spinner + 'Signing in…' on submit. - #1: web notification uses the sender/group DP URL directly as the icon (drawing an external DP to canvas tainted it → silently fell back to initials). Co-Authored-By: Claude Opus 4.8 --- server/public/connect.html | 2 +- server/public/dashboard.html | 2 +- server/public/home.html | 36 +++++++++++++++++++---------------- server/public/index.html | 2 +- server/public/mark-light.png | Bin 0 -> 15061 bytes server/public/mark-light.svg | 5 ----- 6 files changed, 23 insertions(+), 24 deletions(-) create mode 100644 server/public/mark-light.png delete mode 100644 server/public/mark-light.svg diff --git a/server/public/connect.html b/server/public/connect.html index fd75491..9e7612d 100644 --- a/server/public/connect.html +++ b/server/public/connect.html @@ -76,7 +76,7 @@ Home
-
Biz Connect
+
Biz Connect
diff --git a/server/public/dashboard.html b/server/public/dashboard.html index 48b6950..e5f8e67 100644 --- a/server/public/dashboard.html +++ b/server/public/dashboard.html @@ -92,7 +92,7 @@
-
Biz Connect · Dashboard
+
Biz Connect · Dashboard
diff --git a/server/public/home.html b/server/public/home.html index 23e60f2..5cece71 100644 --- a/server/public/home.html +++ b/server/public/home.html @@ -301,8 +301,9 @@ .sys-msg{align-self:center;font-size:.76rem;color:var(--muted);background:rgba(0,0,0,.04);padding:.25rem .7rem;border-radius:99px;margin:.2rem 0;max-width:90%;text-align:center;} .bubble .t{display:flex;align-items:center;justify-content:flex-end;gap:.25rem;font-size:.64rem;opacity:.65;margin-top:.15rem;} .bubble .rcpt{display:inline-flex;} - .bubble.mine .rcpt{opacity:.8;} - .bubble.mine .rcpt.seen{color:#8fd3ff;opacity:1;} + .bubble.mine .rcpt{opacity:.85;} + /* Read receipt on my own (blue) bubble: brand yellow so the double tick actually stands out. */ + .bubble.mine .rcpt.seen{color:var(--brand);opacity:1;} .att-img{cursor:zoom-in;} .fmt-bar{display:flex;align-items:center;gap:.05rem;padding:.3rem .4rem .1rem;flex-wrap:wrap;border-bottom:1px dashed var(--line);} .fmt-bar button{border:none;background:transparent;color:var(--muted);cursor:pointer;width:30px;height:30px;border-radius:7px;display:grid;place-items:center;} @@ -662,6 +663,9 @@ .authcard .sub{color:var(--muted);font-size:.9rem;text-align:center;margin-bottom:1.2rem;} /* Blue card + gold CTA so the sign-in screen carries BOTH brand colours (never mono-blue). */ .authcard .gobtn{background:var(--brand);color:var(--blue-d);} + .gobtn:disabled{opacity:.9;cursor:default;} + .btn-spin{display:inline-block;width:15px;height:15px;border:2px solid rgba(22,41,79,.3);border-top-color:var(--blue-d);border-radius:50%;animation:btnspin .6s linear infinite;vertical-align:-3px;margin-right:7px;} + @keyframes btnspin{to{transform:rotate(360deg);}} .authcard .gobtn:hover{filter:brightness(.95);} .authtabs{display:flex;gap:.5rem;margin-bottom:1.1rem;} .authtabs button{flex:1;background:#eef1f6;color:var(--muted);font-weight:600;border:none;border-radius:9px;padding:.5rem;cursor:pointer;font-size:.9rem;} @@ -760,7 +764,7 @@ - @@ -769,7 +773,7 @@ function twemojify(el){ try{ if(el && window.twemoji) window.twemoji.parse(el, {
- +
Biz Connect
@@ -2015,16 +2019,14 @@ function notify(title, body, kind, id){ }).catch(()=>{}); return; } - // Web / PWA: standard Notification. Icon = the sender's/group's DP (falling back to their - // initials, then the brand app icon) — never the old wordmark. badge = brand mark. + // Web / PWA: standard Notification. Use the sender's/group's DP URL DIRECTLY as the icon — + // the browser fetches notification icons cross-origin fine, whereas drawing an external DP to a + // canvas taints it and silently fell back to initials (the bug). Brand icon only if no DP. if(!('Notification' in window) || Notification.permission!=='granted') return; - notifAvatarDataUrl(kind, id, String(title||'').replace(/^[^\p{L}\p{N}]+/u,'')).then(avatar=>{ - const n=new Notification(title, { body, icon: avatar || '/icon-192.png', badge:'/icon-192.png' }); - n.onclick=()=>{ n.close(); openFromNotif(kind, id); }; - setTimeout(()=>{ try{ n.close(); }catch(_){} }, 8000); - }).catch(()=>{ - try{ const n=new Notification(title, { body, icon:'/icon-192.png' }); n.onclick=()=>{ n.close(); openFromNotif(kind, id); }; }catch(_){} - }); + const _row=rowFor(kind,id)||{}; + const n=new Notification(title, { body, icon: _row.avatar || '/icon-192.png', badge:'/icon-192.png' }); + n.onclick=()=>{ n.close(); openFromNotif(kind, id); }; + setTimeout(()=>{ try{ n.close(); }catch(_){} }, 8000); }catch(_){} } let _audioCtx=null; @@ -2845,7 +2847,7 @@ async function renderLogin(){ const aw=document.getElementById('authwrap'); aw.style.display='flex'; let regOpen=false; try{ regOpen=(await (await fetch('/api/setup-state')).json()).registrationOpen; }catch(_){} aw.innerHTML=`
-
Biz Connect
Biz Connect
+
Biz Connect
Biz Connect

Welcome back

Sign in to access chats, screen share and connect.
${regOpen?`
@@ -2880,10 +2882,12 @@ async function renderLogin(){ } async function doLogin(){ clearErr('li_err'); + const btn=document.getElementById('li_btn'); const orig=btn?btn.innerHTML:''; + if(btn){ btn.disabled=true; btn.innerHTML='Signing in…'; } // show progress on Enter/click try{ await postJSON('/api/login',{email:document.getElementById('li_email').value,password:document.getElementById('li_pw').value,remember:document.getElementById('li_remember').checked}); - location.reload(); - }catch(e){ showErr('li_err', /invalid credentials/i.test(e.message)?'Incorrect email or password. Please try again.':e.message); } + location.reload(); // the branded splash takes over from here + }catch(e){ if(btn){ btn.disabled=false; btn.innerHTML=orig; } showErr('li_err', /invalid credentials/i.test(e.message)?'Incorrect email or password. Please try again.':e.message); } } async function doRegister(){ clearErr('rg_err'); diff --git a/server/public/index.html b/server/public/index.html index 6acc252..d2fecaf 100644 --- a/server/public/index.html +++ b/server/public/index.html @@ -55,7 +55,7 @@
- +
Biz Connect
diff --git a/server/public/mark-light.png b/server/public/mark-light.png new file mode 100644 index 0000000000000000000000000000000000000000..ae0bb463ac4a46b699c19cc77937431ceadf90c8 GIT binary patch literal 15061 zcmaibbyS?svh5&)ySoJ$+&#DjNN{)8APMd+fdIiFxCMd@?lM?#3-0dj4sU+vtb5

Xt~2U8t}GN14VQhhiGLIFrP1*8#Ak`*LB$ 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 - - - -