From 1bf27b747d22d3b8339ae8c5e5c354d06cd2d6a8 Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 14:06:37 +0500 Subject: [PATCH 01/21] Image change in landing page --- frontend/public/MCS_Library.jpg | Bin 0 -> 46079 bytes frontend/public/NUST_H-12.jpg | Bin 0 -> 161811 bytes frontend/src/pages/Landing.jsx | 7 ++----- frontend/src/styles/landing.css | 15 ++++++++++++--- 4 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 frontend/public/MCS_Library.jpg create mode 100644 frontend/public/NUST_H-12.jpg diff --git a/frontend/public/MCS_Library.jpg b/frontend/public/MCS_Library.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2788b7f63d355dd7691fbcba55260ec4fa0d5f9 GIT binary patch literal 46079 zcmaHS1yEfv)9AfGad$56?(R_B-QC^Y-QC??i^GLd+}+)7k)p**DW#9^``^r)dGqEa zlbmEXyV>l?WX@*y{M-C@2tb#YmXihmfdByTBLn{J03rbhuy9ydm^fHiSh%=2I5>EC zIC%K@c>l>bIRAm*;ouX~k>P`=32|`9*~zKt8Ch6Z@JKoNIGK6rm{}Nsh=_=&D5!Yo z=paU7Vq)h1CdU7H{QqiRW=39SUS?*-e}e!Fcpw!F0W^>T0EGdB#sK~s1rPxM0J#51 z`hOA-3L54UEFAm?Rv8@tg#K?A3HB2-4Di#(a-cAv$zd?rKZ&cE!D3OkrE#c-m9;Lx zVdLOZe%5eLAG)P74=+Eu+MsJOh)#Fj7TGkx;m?8YC~ZCM94FI#ih5 zvFs5_5atJ_9xa|V5bLqbC{P?&Y>p)g8$IALVgaEQ4bGo5 zT8ViIFc25u5KUL7n!0iW=U|DP@(LBFzgEej@HUAE*y;RGCl<#_z_IO!yB_uEe^D!JgGy9r0<`=)zI<&tvZ#yFs&2-KfOMxIC;Z3{@Y!TTJFV(B+a19drr=kzyO0^Qu(~t zpC(vX_Q;q>wr-0VmB+P&x~%I?^Uvp&IkeR8{9s=?NNZx*VG>2~7wEs*FD+wKQsG&F zqlS5hLGhQC*Ss3O)T3N306Z=`vOCRO%56@lchxrcT(=?sF1wI#Lt#keR`r*p`q!w; z;xq8AP#x6`g;LVOr>4ySLG)qhAp)@&JlTOvioZ?TGFFZcN~^6Xt`5+Zc;U_qboc`H zz0nBwi%xDl9IOGDP`>J!ee|uj;i#?%^=lMNiakiqMQ7EBW(Nhu`I@jB zaEg3f)Wmv_Oy}Ix8kR2=?hi^opZaNKQDOx&Re?(GFD-$X&~bf=x^9p3MGgu^nK|%l z-Fa!|+=l7~yjxN{L)%{hb~j?geXN!M#g@fW9g>VmP0@48p!FP{Yt&^K_pu{aQRP?j zhPuu#-9=jiwtS-r&R-i8rT44^TpSwmvxupys*if1oSe-h-8Bs@VPk*^PV!E!6wkB@ zKV;&wf5|-RCMQ|UG35M$eQ z?%Ua<2eUa+e0>kON+)`{-&9=&RJ~V z4l$Emc)>~yXC*O~c6m0Zh+?cQqFxED@JE`k1FU?B3x}yp{B)Q`0eVF@LDJ$L2FEkW zhBcm-&I-^8FA|N<{N-6Z8BftpyUbsNC(T6A8(Ijely16R7$Xv0Tybgl+jO`8CeN{~ zj^^{lrIVoxtrX7Qp_gt1T*q4M?l&r=WKj)5ZD(a{3sW~~R}||L7O1XgT+*e;xmkfZ ziPF&V7rE2=QZd27=>b>9d!YAB&AQl12Ot;F)^TfDq{U^QwqJhRcUoz9J>E#qiH3WA zTHk+IL3a+;iR!>t*S?5mOdz&Yc5;)lZPC$250W?LG^?cT!+#%zWKp2|1Q~eba(m z4K!spa70|}D;QQ|pZlo^QY&LD?ml!I72j=^&3n~*z7a?cp$ft>_4`b`{aAzp?B5A6 zF2*g@@CX+Wqm~V9CPsS(39{><4$

&Jn>{>u&`v%KO_3~Qaf;+@bru7abG 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

W3jX?l7jZ}&b{K}Q5&DAw$ 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 DuM5laH43Tjl3Y(_ge=3 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 literal 0 HcmV?d00001 diff --git a/frontend/src/pages/Landing.jsx b/frontend/src/pages/Landing.jsx index 8b24411..3113558 100644 --- a/frontend/src/pages/Landing.jsx +++ b/frontend/src/pages/Landing.jsx @@ -75,7 +75,7 @@ export default function Landing() {

-
+
“Every sign contributed brings the distance to an end.” signpak @@ -171,7 +171,7 @@ export default function Landing() { {user ? 'Open library' : 'Create your account'}
-
+ diff --git a/frontend/src/styles/landing.css b/frontend/src/styles/landing.css index b5d7579..40f3d63 100644 --- a/frontend/src/styles/landing.css +++ b/frontend/src/styles/landing.css @@ -14,7 +14,7 @@ .hero-art { @apply relative h-[400px] sm:h-[520px]; } .hero-photo { @apply absolute inset-0 rounded-[2rem] bg-turquoise bg-cover bg-center; - background-image: url('https://images.unsplash.com/photo-1556761175-b413da4baf72?auto=format&fit=crop&w=1000&q=85'); + background-image: url('/NUST_H-12.jpg'); background-blend-mode: multiply; box-shadow: 0 30px 60px rgb(0 0 0 / 0.35); } @@ -22,7 +22,16 @@ .hero-quote { @apply absolute -bottom-5 left-4 z-10 m-0 max-w-[15rem] rounded-2xl bg-white p-5 font-display text-2xl font-semibold leading-tight text-deep shadow-lift sm:-left-6; } .hero-quote small { @apply mt-2 block font-sans text-sm font-normal; color: #45604f; } /* card is always white, so its caption cannot use a theme colour */ - .marquee { @apply overflow-hidden whitespace-nowrap bg-turquoise py-4 text-center font-ui text-sm font-bold tracking-[.28em] text-deep; } + .marquee { @apply overflow-hidden bg-turquoise py-3 font-ui text-xs font-bold uppercase tracking-[.12em] text-deep sm:py-4 sm:text-sm sm:tracking-[.2em]; } + .marquee-track { @apply flex w-max; animation: marquee-slide 24s linear infinite; } + .marquee-content { @apply flex shrink-0 items-center gap-4 px-4 sm:gap-8 sm:px-8; } + .marquee-star { @apply text-deep; } + @keyframes marquee-slide { to { transform: translateX(-50%); } } + @media (prefers-reduced-motion: reduce) { + .marquee-track { animation: none; } + .marquee-content + .marquee-content { display: none; } + .marquee { @apply overflow-x-auto; } + } .landing-section { @apply py-20 sm:py-28; } .landing-about { @apply grid grid-cols-1 gap-10 md:grid-cols-2 md:gap-16; } @@ -51,7 +60,7 @@ .cta-band-copy .btn { @apply mt-8; } .cta-band-art { @apply min-h-[300px] bg-turquoise bg-cover bg-center; - background-image: url('https://images.unsplash.com/photo-1543269865-cbf427effbad?auto=format&fit=crop&w=900&q=85'); + background-image: url('/MCS_Library.jpg'); background-blend-mode: multiply; } From 971106c96ac3b317c5f0f1cc203043dfe01eb585 Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 14:24:29 +0500 Subject: [PATCH 02/21] refactor ui component codebase --- frontend/src/components/ui.jsx | 55 ------------------- frontend/src/components/ui/Alert..jsx | 7 +++ frontend/src/components/ui/Arrow.jsx | 5 ++ frontend/src/components/ui/Avatar.jsx | 9 +++ frontend/src/components/ui/Badge.jsx | 7 +++ frontend/src/components/ui/Brand.jsx | 12 ++++ frontend/src/components/ui/Button.jsx | 9 +++ frontend/src/components/ui/ButtonLink.jsx | 10 ++++ frontend/src/components/ui/Eyebrow.jsx | 9 +++ frontend/src/components/ui/PageState.jsx | 13 +++++ frontend/src/components/ui/ProgressBar.jsx | 15 +++++ frontend/src/components/ui/SectionHeading.jsx | 13 +++++ frontend/src/components/ui/VideoArtwork.jsx | 12 ++++ frontend/src/components/ui/index.js | 12 ++++ frontend/src/components/ui/join.js | 1 + 15 files changed, 134 insertions(+), 55 deletions(-) delete mode 100644 frontend/src/components/ui.jsx create mode 100644 frontend/src/components/ui/Alert..jsx create mode 100644 frontend/src/components/ui/Arrow.jsx create mode 100644 frontend/src/components/ui/Avatar.jsx create mode 100644 frontend/src/components/ui/Badge.jsx create mode 100644 frontend/src/components/ui/Brand.jsx create mode 100644 frontend/src/components/ui/Button.jsx create mode 100644 frontend/src/components/ui/ButtonLink.jsx create mode 100644 frontend/src/components/ui/Eyebrow.jsx create mode 100644 frontend/src/components/ui/PageState.jsx create mode 100644 frontend/src/components/ui/ProgressBar.jsx create mode 100644 frontend/src/components/ui/SectionHeading.jsx create mode 100644 frontend/src/components/ui/VideoArtwork.jsx create mode 100644 frontend/src/components/ui/index.js create mode 100644 frontend/src/components/ui/join.js diff --git a/frontend/src/components/ui.jsx b/frontend/src/components/ui.jsx deleted file mode 100644 index 963dd7d..0000000 --- a/frontend/src/components/ui.jsx +++ /dev/null @@ -1,55 +0,0 @@ -import { Link } from 'react-router-dom' -import { initialsOf } from '../utils/format' -import { paths } from '../routes/appRoutes' - -const join = (...parts) => parts.filter(Boolean).join(' ') - -export function Brand({ light = false, to = paths.home }) { - return Ssignpak -} - -export function Eyebrow({ children, light = false }) { - return

{children}

-} - -export function Arrow() { - return -} - -export function Button({ children, variant = 'dark', block = false, className = '', type = 'button', ...props }) { - return -} - -export function ButtonLink({ to, children, variant = 'dark', block = false, className = '', ...props }) { - return {children} -} - -export function SectionHeading({ eyebrow, title, action }) { - return
{eyebrow}

{title}

{action}
-} - -export function VideoArtwork({ video, className = '', children }) { - return
{children}
-} - -export function Alert({ tone = 'info', children }) { - return

{children}

-} - -export function ProgressBar({ value, label }) { - const percent = Math.min(100, Math.max(0, value)) - return
-} - -export function Avatar({ user, size = 'md' }) { - return -} - -export function Badge({ tone = 'neutral', children }) { - return {children} -} - -/** Full-page message for empty, missing or blocked states. */ -export function PageState({ eyebrow, title, children, action }) { - return
{eyebrow}

{title}

{children}

{action}
-} diff --git a/frontend/src/components/ui/Alert..jsx b/frontend/src/components/ui/Alert..jsx new file mode 100644 index 0000000..d7599ac --- /dev/null +++ b/frontend/src/components/ui/Alert..jsx @@ -0,0 +1,7 @@ +export function Alert({ tone = 'info', children }) { + return ( +

+ {children} +

+ ) +} diff --git a/frontend/src/components/ui/Arrow.jsx b/frontend/src/components/ui/Arrow.jsx new file mode 100644 index 0000000..bf77022 --- /dev/null +++ b/frontend/src/components/ui/Arrow.jsx @@ -0,0 +1,5 @@ +export function Arrow() { + return ( + + ) +} diff --git a/frontend/src/components/ui/Avatar.jsx b/frontend/src/components/ui/Avatar.jsx new file mode 100644 index 0000000..4b24628 --- /dev/null +++ b/frontend/src/components/ui/Avatar.jsx @@ -0,0 +1,9 @@ +import { initialsOf } from '../../utils/format' + +export function Avatar({ user, size = 'md' }) { + return ( + + ) +} diff --git a/frontend/src/components/ui/Badge.jsx b/frontend/src/components/ui/Badge.jsx new file mode 100644 index 0000000..cfc3446 --- /dev/null +++ b/frontend/src/components/ui/Badge.jsx @@ -0,0 +1,7 @@ +export function Badge({ tone = 'neutral', children }) { + return ( + + {children} + + ) +} diff --git a/frontend/src/components/ui/Brand.jsx b/frontend/src/components/ui/Brand.jsx new file mode 100644 index 0000000..cb874e0 --- /dev/null +++ b/frontend/src/components/ui/Brand.jsx @@ -0,0 +1,12 @@ +import { Link } from 'react-router-dom' +import { join } from './join' +import { paths } from '../../routes/appRoutes' + +export function Brand({ light = false, to = paths.home }) { + return ( + + S + signpak + + ) +} diff --git a/frontend/src/components/ui/Button.jsx b/frontend/src/components/ui/Button.jsx new file mode 100644 index 0000000..bd4985e --- /dev/null +++ b/frontend/src/components/ui/Button.jsx @@ -0,0 +1,9 @@ +import { join } from './join' + +export function Button({ children, variant = 'dark', block = false, className = '', type = 'button', ...props }) { + return ( + + ) +} diff --git a/frontend/src/components/ui/ButtonLink.jsx b/frontend/src/components/ui/ButtonLink.jsx new file mode 100644 index 0000000..e6b5b45 --- /dev/null +++ b/frontend/src/components/ui/ButtonLink.jsx @@ -0,0 +1,10 @@ +import { Link } from 'react-router-dom' +import { join } from './join' + +export function ButtonLink({ to, children, variant = 'dark', block = false, className = '', ...props }) { + return ( + + {children} + + ) +} diff --git a/frontend/src/components/ui/Eyebrow.jsx b/frontend/src/components/ui/Eyebrow.jsx new file mode 100644 index 0000000..e16dbe2 --- /dev/null +++ b/frontend/src/components/ui/Eyebrow.jsx @@ -0,0 +1,9 @@ +import { join } from './join' + +export function Eyebrow({ children, light = false }) { + return ( +

+ {children} +

+ ) +} diff --git a/frontend/src/components/ui/PageState.jsx b/frontend/src/components/ui/PageState.jsx new file mode 100644 index 0000000..34d5654 --- /dev/null +++ b/frontend/src/components/ui/PageState.jsx @@ -0,0 +1,13 @@ +import { Eyebrow } from './Eyebrow' + +/** Full-page message for empty, missing or blocked states. */ +export function PageState({ eyebrow, title, children, action }) { + return ( +
+ {eyebrow} +

{title}

+

{children}

+ {action} +
+ ) +} diff --git a/frontend/src/components/ui/ProgressBar.jsx b/frontend/src/components/ui/ProgressBar.jsx new file mode 100644 index 0000000..7123c63 --- /dev/null +++ b/frontend/src/components/ui/ProgressBar.jsx @@ -0,0 +1,15 @@ +export function ProgressBar({ value, label }) { + const percent = Math.min(100, Math.max(0, value)) + return ( +
+ +
+ ) +} diff --git a/frontend/src/components/ui/SectionHeading.jsx b/frontend/src/components/ui/SectionHeading.jsx new file mode 100644 index 0000000..2e4e99e --- /dev/null +++ b/frontend/src/components/ui/SectionHeading.jsx @@ -0,0 +1,13 @@ +import { Eyebrow } from './Eyebrow' + +export function SectionHeading({ eyebrow, title, action }) { + return ( +
+
+ {eyebrow} +

{title}

+
+ {action} +
+ ) +} diff --git a/frontend/src/components/ui/VideoArtwork.jsx b/frontend/src/components/ui/VideoArtwork.jsx new file mode 100644 index 0000000..93f2bfe --- /dev/null +++ b/frontend/src/components/ui/VideoArtwork.jsx @@ -0,0 +1,12 @@ +import { join } from './join' + +export function VideoArtwork({ video, className = '', children }) { + return ( +
+ {children} +
+ ) +} diff --git a/frontend/src/components/ui/index.js b/frontend/src/components/ui/index.js new file mode 100644 index 0000000..016e68f --- /dev/null +++ b/frontend/src/components/ui/index.js @@ -0,0 +1,12 @@ +export { Brand } from './Brand' +export { Eyebrow } from './Eyebrow' +export { Arrow } from './Arrow' +export { Button } from './Button' +export { ButtonLink } from './ButtonLink' +export { SectionHeading } from './SectionHeading' +export { VideoArtwork } from './VideoArtwork' +export { Alert } from './Alert' +export { ProgressBar } from './ProgressBar' +export { Avatar } from './Avatar' +export { Badge } from './Badge' +export { PageState } from './PageState' diff --git a/frontend/src/components/ui/join.js b/frontend/src/components/ui/join.js new file mode 100644 index 0000000..9c82f0b --- /dev/null +++ b/frontend/src/components/ui/join.js @@ -0,0 +1 @@ +export const join = (...parts) => parts.filter(Boolean).join(' ') From 3451382f70be9a8232820c640c52ee29be92d34d Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 14:25:02 +0500 Subject: [PATCH 03/21] added favicon.svg --- frontend/public/favicon.svg | 29 +++++++++++++++++++++++++++++ frontend/src/pages/Login.jsx | 13 ++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg index e69de29..0a32c28 100644 --- a/frontend/public/favicon.svg +++ b/frontend/public/favicon.svg @@ -0,0 +1,29 @@ + +AAAWgmp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAABZcanVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46YzJwYTo5ODIxMjRkZi1kNTgzLTQ4YTQtYmM0Zi05ZDZiNGRkNGY1MTEAAAADl2p1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAALxqdW1iAAAARGp1bWRjYm9yABEAEIAAAKoAOJtxE2MycGEuaW5ncmVkaWVudC52MwAAAAAYYzJzaL92+VV9vQIYtY9CZZU+l3IAAABwY2JvcqNpZGM6Zm9ybWF0bWltYWdlL3N2Zyt4bWxqaW5zdGFuY2VJRHgseG1wOmlpZDo2ODE1Y2IzNi02YWYxLTRlM2QtODFmMC04ZWM0OGQ2ZDNkOGJscmVsYXRpb25zaGlwaHBhcmVudE9mAAAB4mp1bWIAAABBanVtZGNib3IAEQAQgAAAqgA4m3ETYzJwYS5hY3Rpb25zLnYyAAAAABhjMnNo0kft0sLch+PshbLKpjwUnwAAAZljYm9yomdhY3Rpb25zgqJmYWN0aW9ua2MycGEub3BlbmVkanBhcmFtZXRlcnOha2luZ3JlZGllbnRzgaJjdXJseC1zZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmluZ3JlZGllbnQudjNkaGFzaFggCn4HygQgqrB081OBqmrCcsCoYWu3LLVx4JzebEodBImkZmFjdGlvbngdY29tLmFudGhyb3BpYy5jbGF1ZGUucHJvdmlkZWRqcGFyYW1ldGVyc6F4H2NvbS5hbnRocm9waWMub3JpZ2luLWNvbmZpZGVuY2VndW5rbm93bmtkZXNjcmlwdGlvbnhmQ2xhdWRlIHByb3ZpZGVkIHRoaXMgZmlsZSBhdCB0aGUgcmVxdWVzdCBvZiBhIHVzZXIgYW5kIG1heSBoYXZlIGNyZWF0ZWQgb3IgbW9kaWZpZWQgdGhlIGZpbGUgY29udGVudHMubXNvZnR3YXJlQWdlbnShZG5hbWVmQ2xhdWRlcmFsbEFjdGlvbnNJbmNsdWRlZPUAAADIanVtYgAAAEBqdW1kY2JvcgARABCAAACqADibcRNjMnBhLmhhc2guZGF0YQAAAAAYYzJzaJvOSElbBU+Yqj5HevVXwVcAAACAY2JvcqVjYWxnZnNoYTI1NmNwYWRNAAAAAAAAAAAAAAAAAGRoYXNoWCDrb3YH2ILFhU7atdDufZ4dn8r2ZIxuRqq3G8f6YTzaOWRuYW1lbmp1bWJmIG1hbmlmZXN0amV4Y2x1c2lvbnOBomVzdGFydBjxZmxlbmd0aBkeBAAAAj5qdW1iAAAAJ2p1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0udjIAAAACD2Nib3KlY2FsZ2ZzaGEyNTZpc2lnbmF0dXJleE1zZWxmI2p1bWJmPS9jMnBhL3VybjpjMnBhOjk4MjEyNGRmLWQ1ODMtNDhhNC1iYzRmLTlkNmI0ZGQ0ZjUxMS9jMnBhLnNpZ25hdHVyZWppbnN0YW5jZUlEeCx4bXA6aWlkOmU3ZTRjNjBjLWFmNWUtNGRhYy1iZmJmLTI2YjU0ZGJmOThjNHJjcmVhdGVkX2Fzc2VydGlvbnODomN1cmx4LXNlbGYjanVtYmY9YzJwYS5hc3NlcnRpb25zL2MycGEuaW5ncmVkaWVudC52M2RoYXNoWCAKfgfKBCCqsHTzU4GqasJywKhha7cstXHgnN5sSh0EiaJjdXJseCpzZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmFjdGlvbnMudjJkaGFzaFggrWhxTDP7n0GhPnFKp4TivRqjMvEhTzgTDrlsTbfARjSiY3VybHgpc2VsZiNqdW1iZj1jMnBhLmFzc2VydGlvbnMvYzJwYS5oYXNoLmRhdGFkaGFzaFggiOiblT1SD4TX4UMdIjrJ+pLJ0ynW+MzOTix6oCR4o6J0Y2xhaW1fZ2VuZXJhdG9yX2luZm+jZG5hbWVvQW50aHJvcGljIEZpbGVzZ3ZlcnNpb25lMS4wLjBrc3BlY1ZlcnNpb25lMi40LjAAABA4anVtYgAAAChqdW1kYzJjcwARABCAAACqADibcQNjMnBhLnNpZ25hdHVyZQAAABAIY2JvctKEWQISogEmGCFZAgowggIGMIIBjaADAgECAhRA5aAK7sI50L64g/oGQgU9Z1UTADAKBggqhkjOPQQDAzBJMRcwFQYDVQQKEw5BbnRocm9waWMsIFBCQzEuMCwGA1UEAxMlQW50aHJvcGljIENvbnRlbnQgQ3JlZGVudGlhbHMgUm9vdCBDQTAeFw0yNjA4MDcxODQzNTZaFw0yODA4MDYxOTQzNTZaMEQxFzAVBgNVBAoTDkFudGhyb3BpYywgUEJDMSkwJwYDVQQDEyBBbnRocm9waWMgQ2xhdWRlIENvbnRlbnQgU2lnbmluZzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJh6CmvLUBgFFNU0vUKlOVtE6djd17L5SuwX0LemFisBM3dkd/3cyjxFA3Qo5S46fX0/ihY0VZ7mfb9KF703t5OjWDBWMA4GA1UdDwEB/wQEAwIHgDAVBgNVHSUEDjAMBgorBgEEAYPoXgIBMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUzlHiBIFOZFsj+OPEz5o+nMHXXMIwCgYIKoZIzj0EAwMDZwAwZAIwMXMdFJ4BetLLVY7ORuE9noqbbAZOZn/aArXyTwFAZfKrPzxF2vPoJNf1+UCdg1XGAjBwX1zd9WGqYkqmL5SFqw1QySjr1zJfpJM9+1rdDwSPLMOPOjKuiXjoU/pUUeG9RwmhY3BhZFkNngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPZYQN1LS2xmfv6UwKwp4VCKMFHB0EFMwVsEgqJYZCIV/Mv4zQbFY/EVKgyirGPbP2AbUr+n1ToWOqftVQnkgpNIqVE= + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/pages/Login.jsx b/frontend/src/pages/Login.jsx index fc6b816..3076676 100644 --- a/frontend/src/pages/Login.jsx +++ b/frontend/src/pages/Login.jsx @@ -28,7 +28,18 @@ export default function Login() { } return( - New to Signpak? Create an account}> + New to Signpak? + + Create an account + + + }>
From d7e826314831af031c9a31dbe4cab6267d23b747 Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 14:34:47 +0500 Subject: [PATCH 04/21] Issue solved: related to placeholder text --- frontend/src/components/AuthShell.jsx | 35 ++++++++++++++++----------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/frontend/src/components/AuthShell.jsx b/frontend/src/components/AuthShell.jsx index 6a04f89..659f2d8 100644 --- a/frontend/src/components/AuthShell.jsx +++ b/frontend/src/components/AuthShell.jsx @@ -4,19 +4,26 @@ import { Eyebrow } from './ui' /** Split layout shared by the login and signup pages. */ export default function AuthShell({ eyebrow, title, subtitle, children, footer }) { - return
-
-
Lorem ipsum dolor sit

Make room
for connection.

-
-
-
- ← Back home - {eyebrow} -

{title}

-

{subtitle}

- {children} - {footer &&

{footer}

} + return ( +
+
+
+ SIGN PAK +

+ Help us to make
communication easier. +

+
-
-
+
+
+ Back + {eyebrow} +

{title}

+

{subtitle}

+ {children} + {footer &&

{footer}

} +
+
+ + ) } From 25b85c12ef906620a3f5b4f97feee3ea8ae18a29 Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 14:35:02 +0500 Subject: [PATCH 05/21] Brand logo adjusted --- frontend/public/favicon.svg | 9 +++++---- frontend/src/components/ui/Brand.jsx | 4 +++- frontend/src/styles/components.css | 5 ++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg index 0a32c28..1f32448 100644 --- a/frontend/public/favicon.svg +++ b/frontend/public/favicon.svg @@ -4,7 +4,8 @@ preserveAspectRatio="xMidYMid meet" xmlns:c2pa="http://c2pa.org/manifest">AAAWgmp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAABZcanVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46YzJwYTo5ODIxMjRkZi1kNTgzLTQ4YTQtYmM0Zi05ZDZiNGRkNGY1MTEAAAADl2p1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAALxqdW1iAAAARGp1bWRjYm9yABEAEIAAAKoAOJtxE2MycGEuaW5ncmVkaWVudC52MwAAAAAYYzJzaL92+VV9vQIYtY9CZZU+l3IAAABwY2JvcqNpZGM6Zm9ybWF0bWltYWdlL3N2Zyt4bWxqaW5zdGFuY2VJRHgseG1wOmlpZDo2ODE1Y2IzNi02YWYxLTRlM2QtODFmMC04ZWM0OGQ2ZDNkOGJscmVsYXRpb25zaGlwaHBhcmVudE9mAAAB4mp1bWIAAABBanVtZGNib3IAEQAQgAAAqgA4m3ETYzJwYS5hY3Rpb25zLnYyAAAAABhjMnNo0kft0sLch+PshbLKpjwUnwAAAZljYm9yomdhY3Rpb25zgqJmYWN0aW9ua2MycGEub3BlbmVkanBhcmFtZXRlcnOha2luZ3JlZGllbnRzgaJjdXJseC1zZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmluZ3JlZGllbnQudjNkaGFzaFggCn4HygQgqrB081OBqmrCcsCoYWu3LLVx4JzebEodBImkZmFjdGlvbngdY29tLmFudGhyb3BpYy5jbGF1ZGUucHJvdmlkZWRqcGFyYW1ldGVyc6F4H2NvbS5hbnRocm9waWMub3JpZ2luLWNvbmZpZGVuY2VndW5rbm93bmtkZXNjcmlwdGlvbnhmQ2xhdWRlIHByb3ZpZGVkIHRoaXMgZmlsZSBhdCB0aGUgcmVxdWVzdCBvZiBhIHVzZXIgYW5kIG1heSBoYXZlIGNyZWF0ZWQgb3IgbW9kaWZpZWQgdGhlIGZpbGUgY29udGVudHMubXNvZnR3YXJlQWdlbnShZG5hbWVmQ2xhdWRlcmFsbEFjdGlvbnNJbmNsdWRlZPUAAADIanVtYgAAAEBqdW1kY2JvcgARABCAAACqADibcRNjMnBhLmhhc2guZGF0YQAAAAAYYzJzaJvOSElbBU+Yqj5HevVXwVcAAACAY2JvcqVjYWxnZnNoYTI1NmNwYWRNAAAAAAAAAAAAAAAAAGRoYXNoWCDrb3YH2ILFhU7atdDufZ4dn8r2ZIxuRqq3G8f6YTzaOWRuYW1lbmp1bWJmIG1hbmlmZXN0amV4Y2x1c2lvbnOBomVzdGFydBjxZmxlbmd0aBkeBAAAAj5qdW1iAAAAJ2p1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0udjIAAAACD2Nib3KlY2FsZ2ZzaGEyNTZpc2lnbmF0dXJleE1zZWxmI2p1bWJmPS9jMnBhL3VybjpjMnBhOjk4MjEyNGRmLWQ1ODMtNDhhNC1iYzRmLTlkNmI0ZGQ0ZjUxMS9jMnBhLnNpZ25hdHVyZWppbnN0YW5jZUlEeCx4bXA6aWlkOmU3ZTRjNjBjLWFmNWUtNGRhYy1iZmJmLTI2YjU0ZGJmOThjNHJjcmVhdGVkX2Fzc2VydGlvbnODomN1cmx4LXNlbGYjanVtYmY9YzJwYS5hc3NlcnRpb25zL2MycGEuaW5ncmVkaWVudC52M2RoYXNoWCAKfgfKBCCqsHTzU4GqasJywKhha7cstXHgnN5sSh0EiaJjdXJseCpzZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmFjdGlvbnMudjJkaGFzaFggrWhxTDP7n0GhPnFKp4TivRqjMvEhTzgTDrlsTbfARjSiY3VybHgpc2VsZiNqdW1iZj1jMnBhLmFzc2VydGlvbnMvYzJwYS5oYXNoLmRhdGFkaGFzaFggiOiblT1SD4TX4UMdIjrJ+pLJ0ynW+MzOTix6oCR4o6J0Y2xhaW1fZ2VuZXJhdG9yX2luZm+jZG5hbWVvQW50aHJvcGljIEZpbGVzZ3ZlcnNpb25lMS4wLjBrc3BlY1ZlcnNpb25lMi40LjAAABA4anVtYgAAAChqdW1kYzJjcwARABCAAACqADibcQNjMnBhLnNpZ25hdHVyZQAAABAIY2JvctKEWQISogEmGCFZAgowggIGMIIBjaADAgECAhRA5aAK7sI50L64g/oGQgU9Z1UTADAKBggqhkjOPQQDAzBJMRcwFQYDVQQKEw5BbnRocm9waWMsIFBCQzEuMCwGA1UEAxMlQW50aHJvcGljIENvbnRlbnQgQ3JlZGVudGlhbHMgUm9vdCBDQTAeFw0yNjA4MDcxODQzNTZaFw0yODA4MDYxOTQzNTZaMEQxFzAVBgNVBAoTDkFudGhyb3BpYywgUEJDMSkwJwYDVQQDEyBBbnRocm9waWMgQ2xhdWRlIENvbnRlbnQgU2lnbmluZzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJh6CmvLUBgFFNU0vUKlOVtE6djd17L5SuwX0LemFisBM3dkd/3cyjxFA3Qo5S46fX0/ihY0VZ7mfb9KF703t5OjWDBWMA4GA1UdDwEB/wQEAwIHgDAVBgNVHSUEDjAMBgorBgEEAYPoXgIBMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUzlHiBIFOZFsj+OPEz5o+nMHXXMIwCgYIKoZIzj0EAwMDZwAwZAIwMXMdFJ4BetLLVY7ORuE9noqbbAZOZn/aArXyTwFAZfKrPzxF2vPoJNf1+UCdg1XGAjBwX1zd9WGqYkqmL5SFqw1QySjr1zJfpJM9+1rdDwSPLMOPOjKuiXjoU/pUUeG9RwmhY3BhZFkNngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPZYQN1LS2xmfv6UwKwp4VCKMFHB0EFMwVsEgqJYZCIV/Mv4zQbFY/EVKgyirGPbP2AbUr+n1ToWOqftVQnkgpNIqVE= - + - diff --git a/frontend/src/components/ui/Brand.jsx b/frontend/src/components/ui/Brand.jsx index cb874e0..fe2d1a2 100644 --- a/frontend/src/components/ui/Brand.jsx +++ b/frontend/src/components/ui/Brand.jsx @@ -5,7 +5,9 @@ import { paths } from '../../routes/appRoutes' export function Brand({ light = false, to = paths.home }) { return ( - S + signpak ) diff --git a/frontend/src/styles/components.css b/frontend/src/styles/components.css index 41cec9e..20d00e4 100644 --- a/frontend/src/styles/components.css +++ b/frontend/src/styles/components.css @@ -17,11 +17,10 @@ /* ---------- Brand ---------- */ .brand { @apply flex items-center gap-2.5 font-ui text-2xl font-bold tracking-tight text-heading; } - .brand-mark { @apply grid h-9 w-9 place-items-center rounded-full bg-deep font-display text-xl font-bold leading-none text-turquoise; } - :root[data-theme='dark'] .brand-mark { background: var(--color-turquoise); color: var(--color-deep); } + .brand-mark { @apply h-9 w-11 shrink-0; --brand-mark-color: var(--color-heading); } .brand-accent { @apply text-secondary-ink; } .brand-light { color: #fff; } - .brand-light .brand-mark { background: var(--color-turquoise); color: var(--color-deep); } + .brand-light .brand-mark { --brand-mark-color: #fff; } .brand-light .brand-accent { color: var(--color-turquoise); } /* ---------- Buttons ---------- */ From 2855bdda70c0086e43f408f28e497dd451ec343a Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 14:41:22 +0500 Subject: [PATCH 06/21] authshell adjusted for mobile view --- frontend/src/styles/auth.css | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/styles/auth.css b/frontend/src/styles/auth.css index 2f6720a..23e0fe2 100644 --- a/frontend/src/styles/auth.css +++ b/frontend/src/styles/auth.css @@ -1,15 +1,15 @@ /* Login and signup. */ @layer components { - .auth { @apply grid min-h-[calc(100vh-72px)] grid-cols-1 md:grid-cols-[42%_58%]; } + .auth { @apply grid min-h-[calc(100vh-72px)] grid-cols-1 md:grid-cols-[42%_58%]; min-height: calc(100svh - 72px); } .auth-art { - @apply relative flex min-h-[240px] items-end overflow-hidden bg-cover bg-center p-8 sm:p-12 md:min-h-0; + @apply relative hidden min-h-0 items-end overflow-hidden bg-cover bg-center p-8 sm:p-12 md:flex; background-image: url('https://images.unsplash.com/photo-1556761175-4b46a572b786?auto=format&fit=crop&w=1000&q=80'); } .auth-art::before { content: ''; @apply absolute inset-0; background: linear-gradient(160deg, rgb(0 64 26 / 0.86) 20%, rgb(0 46 18 / 0.94) 100%), radial-gradient(70% 60% at 100% 0%, rgb(64 224 208 / 0.4), transparent 70%); } .auth-art-copy { @apply relative pb-2 md:pb-10; } - .auth-panel { @apply grid place-items-center bg-page px-5 py-12 sm:py-16; } - .auth-card { @apply w-full max-w-[440px] rounded-3xl border border-line bg-surface p-7 shadow-lift sm:p-10; } - .auth-back { @apply mb-8 inline-block rounded-full text-sm font-semibold text-muted hover:text-accent-ink; } + .auth-panel { @apply grid min-w-0 place-items-center bg-page px-4 py-6 sm:px-6 sm:py-10 md:px-8 md:py-16; } + .auth-card { @apply w-full max-w-110px rounded-2xl border border-line bg-surface p-5 shadow-soft sm:rounded-3xl sm:p-8 md:p-10; } + .auth-back { @apply mb-6 inline-block rounded-full text-sm font-semibold text-muted hover:text-accent-ink sm:mb-8; } .auth-sub { @apply mt-4 text-base text-muted; } .auth-submit { @apply mt-8; } .auth-footer { @apply mt-7 text-center text-base text-muted; } From 8dcd9c91afa8115f5b9233c53f3c7d04ae4c1505 Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 14:54:01 +0500 Subject: [PATCH 07/21] Issue solved: video scrubber preview added in trim --- frontend/src/components/TrimSlider.jsx | 90 +++++++++- frontend/src/pages/RecordingEditor.jsx | 227 +++++++++++++++++++------ frontend/src/styles/player.css | 11 +- 3 files changed, 268 insertions(+), 60 deletions(-) diff --git a/frontend/src/components/TrimSlider.jsx b/frontend/src/components/TrimSlider.jsx index a161971..124c822 100644 --- a/frontend/src/components/TrimSlider.jsx +++ b/frontend/src/components/TrimSlider.jsx @@ -1,13 +1,91 @@ +import { useCallback, useEffect, useRef, useState } from 'react' import { formatTime } from '../utils/format' /** Two-handle range slider. Values are seconds; `total` is the full recording length. */ -export default function TrimSlider({ total, start, end, onChange }) { +export default function TrimSlider({ total, start, end, src, mirrored, onChange }) { + const frameVideo = useRef(null) + const frameCanvas = useRef(null) + const latestPreview = useRef(start) + const [previewTime, setPreviewTime] = useState(start) + const [showPreview, setShowPreview] = useState(false) + + const drawFrame = useCallback((video) => { + const canvas = frameCanvas.current + if (!canvas || video.readyState < 2 || !video.videoWidth || !video.videoHeight) return + const context = canvas.getContext('2d') + if (!context) return + const scale = Math.min(canvas.width / video.videoWidth, canvas.height / video.videoHeight) + const width = video.videoWidth * scale + const height = video.videoHeight * scale + context.fillStyle = '#000' + context.fillRect(0, 0, canvas.width, canvas.height) + context.drawImage(video, (canvas.width - width) / 2, (canvas.height - height) / 2, width, height) + }, []) + + useEffect(() => { + latestPreview.current = previewTime + const video = frameVideo.current + if (!video || video.readyState < 1 || !Number.isFinite(video.duration)) return + const target = Math.min(Math.max(previewTime, 0), video.duration) + if (Math.abs(video.currentTime - target) > 0.08) video.currentTime = target + else drawFrame(video) + }, [previewTime, showPreview, drawFrame]) + + const onFrameMetadata = (event) => { + const video = event.currentTarget + if (video.duration === Infinity) { + video.currentTime = 1e101 + video.addEventListener('timeupdate', () => { + video.currentTime = latestPreview.current + }, { once: true }) + return + } + video.currentTime = Math.min(Math.max(latestPreview.current, 0), video.duration) + } + + const onFrameSeeked = (event) => { + const video = event.currentTarget + const target = Math.min(Math.max(latestPreview.current, 0), video.duration) + if (Math.abs(video.currentTime - target) > 0.08) { + video.currentTime = target + return + } + drawFrame(video) + } + + const updatePreview = (event) => { + const value = Number(event.currentTarget.value) + latestPreview.current = value + setPreviewTime(value) + setShowPreview(true) + } + const gap = Math.min(0.5, total / 2) - const left = (start / total) * 100 - const right = 100 - (end / total) * 100 - return
+ const safeTotal = Math.max(total, 0.1) + const left = (start / safeTotal) * 100 + const right = 100 - (end / safeTotal) * 100 + const previewPosition = (previewTime / safeTotal) * 100 + + return
setShowPreview(false)}> +
} diff --git a/frontend/src/pages/RecordingEditor.jsx b/frontend/src/pages/RecordingEditor.jsx index 766aa0f..8016d7c 100644 --- a/frontend/src/pages/RecordingEditor.jsx +++ b/frontend/src/pages/RecordingEditor.jsx @@ -12,6 +12,7 @@ import { safeRouteId } from '../utils/validators' export default function RecordingEditor() { const [params] = useSearchParams() const videoId = safeRouteId(params.get('v')) + return } @@ -23,19 +24,48 @@ function EditScreen({ videoId }) { const video = publishedVideos.find((item) => item.id === videoId) const recording = recordings[videoId] - if (!video) return Back to library}>It may have been unpublished or removed. - if (!recording) return Back to video}>You need a recording before you can trim it. - - return updateEdit(video.id, patch)} - onSubmit={async () => { - await submitRecording(video, recording) - removeRecording(video.id) - await notify({ type: 'submission', title: 'Recording submitted', body: video.title, href: watchUrl(video.id) }).catch(() => {}) - navigate(watchUrl(video.id), { state: { justSubmitted: true } }) - }} - /> + if (!video) { + return ( + Back to library} + > + It may have been unpublished or removed. + + ) + } + + if (!recording) { + return ( + Back to video} + > + You need a recording before you can trim it. + + ) + } + + return ( + updateEdit(video.id, patch)} + onSubmit={async () => { + await submitRecording(video, recording) + removeRecording(video.id) + await notify({ + type: 'submission', + title: 'Recording submitted', + body: video.title, + href: watchUrl(video.id) + }).catch(() => {}) + navigate(watchUrl(video.id), { state: { justSubmitted: true } }) + }} + /> + ) } function Editor({ video, recording, onEdit, onSubmit }) { @@ -65,63 +95,158 @@ function Editor({ video, recording, onEdit, onSubmit }) { const togglePlay = () => { const element = preview.current - if (!element.paused) { element.pause(); return } - if (element.currentTime < trimRange.start || element.currentTime >= trimRange.end - 0.05) element.currentTime = trimRange.start + if (!element.paused) { + element.pause() + return + } + if (element.currentTime < trimRange.start || element.currentTime >= trimRange.end - 0.05) { + element.currentTime = trimRange.start + } element.play().catch(() => {}) } + const onTimeUpdate = (event) => { const element = event.currentTarget setTime(element.currentTime) - if (!element.paused && element.currentTime >= trimRange.end) { element.pause(); element.currentTime = trimRange.end } + if (!element.paused && element.currentTime >= trimRange.end) { + element.pause() + element.currentTime = trimRange.end + } } + const change = (patch) => { setTrimRange((current) => ({ ...current, ...patch })) setTrimApplied(false) - if (preview.current) preview.current.currentTime = patch.start ?? patch.end ?? trimRange.start + if (preview.current) { + preview.current.currentTime = patch.start ?? patch.end ?? trimRange.start + } } + const applyTrim = () => { onEdit(trimRange) setTrimApplied(true) - if (preview.current) preview.current.currentTime = trimRange.start + if (preview.current) { + preview.current.currentTime = trimRange.start + } } + const submit = async () => { setBusy(true) setError('') - try { await onSubmit() } catch (caught) { setError(caught.message || 'Your recording could not be submitted. Try again.'); setBusy(false) } + try { + await onSubmit() + } catch (caught) { + setError(caught.message || 'Your recording could not be submitted. Try again.') + setBusy(false) + } } - return
- -
-
- {video.title} -

Make it yours.

-

Review your recording before you submit it.

-
-
- -
-
+ + + + + + {error && {error}} + + {confirming ? ( +
+

Submit this recording? Once submitted it can't be watched, edited or deleted, but you can record this video again after a short cooldown.

+
+ + +
+
+ ) : ( + + )} + + Back to player + + + + ) } diff --git a/frontend/src/styles/player.css b/frontend/src/styles/player.css index dc98ab4..d2b3590 100644 --- a/frontend/src/styles/player.css +++ b/frontend/src/styles/player.css @@ -60,10 +60,15 @@ .editor-back { @apply mx-auto mt-5 block text-center text-sm font-semibold text-muted underline-offset-4 hover:text-accent-ink hover:underline; } /* Two overlapping range inputs form the dual-handle trim slider. Only the thumbs take pointer events. */ - .trim { @apply relative h-10; } - .trim-track { @apply absolute inset-x-0 top-1/2 h-2.5 -translate-y-1/2 rounded-full bg-line; } + .trim { @apply relative h-32; } + .trim-frame-source { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; } + .trim-preview { @apply pointer-events-none absolute top-0 z-10 -translate-x-1/2 overflow-hidden rounded-xl border border-line bg-surface p-1.5 shadow-lift; } + .trim-preview-frame { @apply block h-[4.55rem] w-32 rounded-md bg-black object-cover; } + .trim-preview-frame.is-mirrored { transform: scaleX(-1); } + .trim-preview span { @apply block pt-1 text-center font-ui text-xs font-semibold tabular-nums text-heading; } + .trim-track { @apply absolute inset-x-0 bottom-4 h-2.5 rounded-full bg-line; } .trim-fill { @apply absolute h-full rounded-full; background: var(--progress); } - .trim input { @apply pointer-events-none absolute inset-0 m-0 h-10 w-full appearance-none bg-transparent; } + .trim input { @apply pointer-events-none absolute inset-x-0 bottom-0 m-0 h-10 w-full appearance-none bg-transparent; } .trim input::-webkit-slider-runnable-track { background: transparent; } .trim input::-moz-range-track { background: transparent; } .trim input::-webkit-slider-thumb { @apply pointer-events-auto h-7 w-7 cursor-ew-resize appearance-none rounded-full border-[3px] border-surface bg-brand shadow-soft; } From eeefc66979ef33de250f84d1c0a8cc7b19ffbd6c Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 14:59:05 +0500 Subject: [PATCH 08/21] issue solved: timer count down before recording starts --- frontend/src/components/RecorderPanel.jsx | 86 +++++++++++++++++------ frontend/src/styles/player.css | 3 + 2 files changed, 69 insertions(+), 20 deletions(-) diff --git a/frontend/src/components/RecorderPanel.jsx b/frontend/src/components/RecorderPanel.jsx index b2d691b..5ff8ffa 100644 --- a/frontend/src/components/RecorderPanel.jsx +++ b/frontend/src/components/RecorderPanel.jsx @@ -1,4 +1,4 @@ -import { useEffect, useRef } from 'react' +import { useEffect, useRef, useState } from 'react' import { useRecorder } from '../hooks/useRecorder' import { formatTime } from '../utils/format' import { Alert, Arrow, Button } from './ui' @@ -7,34 +7,80 @@ import { Alert, Arrow, Button } from './ui' export default function RecorderPanel({ video, baseRef, onSaveAndEdit }) { const { recording, status, error, elapsed, stream, start, stop, discard } = useRecorder(video.id) const live = useRef(null) - useEffect(() => { if (live.current) live.current.srcObject = stream }, [stream]) + const countdownTimer = useRef(null) + const [countdown, setCountdown] = useState(null) + + useEffect(() => { + if (live.current) live.current.srcObject = stream + }, [stream]) + + useEffect(() => () => clearTimeout(countdownTimer.current), []) const isRecording = status === 'recording' - const busy = status === 'requesting' + const busy = status === 'requesting' || countdown !== null // Recording starts the base video too, so contributors can sign along while watching. - const begin = async () => { + const startCapture = async () => { const started = await start() const base = baseRef.current if (started && base && (base.paused || base.ended)) base.play().catch(() => {}) } - return
-

{isRecording ? `Recording ${formatTime(elapsed)}` : recording ? 'Recording ready' : 'Your turn'}

-

Record
yourself.

-

Watch the example, then make it yours. You can review, trim and delete your recording before you submit it.

+ const begin = () => { + if (busy) return + let remaining = 3 + setCountdown(remaining) + const tick = () => { + remaining -= 1 + if (remaining === 0) { + setCountdown(null) + startCapture() + return + } + setCountdown(remaining) + countdownTimer.current = setTimeout(tick, 1000) + } + countdownTimer.current = setTimeout(tick, 1000) + } -
-
+ return ( +
+

+ + {isRecording ? `Recording ${formatTime(elapsed)}` : countdown !== null ? `Starting in ${countdown}…` : recording ? 'Recording ready' : 'Your turn'} +

+ +

Record
yourself.

+

Watch the example, then make it yours. You can review, trim and delete your recording before you submit it.

- {isRecording - ? - : } - {error && {error}} - {recording && !isRecording && } - -
+
+
+ + {isRecording ? ( + + ) : ( + + )} + + {error && {error}} + {recording && !isRecording && } + + +
+ ) } diff --git a/frontend/src/styles/player.css b/frontend/src/styles/player.css index d2b3590..c93acf5 100644 --- a/frontend/src/styles/player.css +++ b/frontend/src/styles/player.css @@ -29,6 +29,9 @@ .recorder-video[controls] { @apply scale-x-100 object-contain; } .recorder-video.is-hidden { @apply hidden; } .recorder-empty { @apply px-4 text-center; } + .recorder-countdown { @apply absolute inset-0 z-10 grid place-content-center justify-items-center gap-2 bg-black/65 text-white; } + .recorder-countdown strong { @apply font-display text-8xl font-bold leading-none text-turquoise; } + .recorder-countdown span { @apply font-ui text-sm font-bold uppercase tracking-[.2em]; } .rec-dot { @apply mr-1 text-danger; } .recorder-delete { @apply mx-auto my-4 block rounded-full px-4 py-2 text-sm font-semibold text-danger shadow-soft transition; background-color: var(--danger-soft); } .recorder-delete:hover { background-color: color-mix(in srgb, var(--danger) 14%, var(--danger-soft)); } From aa87281415960bf77f65cfca5c1c1749e80916c3 Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 15:17:51 +0500 Subject: [PATCH 09/21] fixed --- frontend/src/components/ui/{Alert..jsx => Alert.jsx} | 0 frontend/src/styles/auth.css | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename frontend/src/components/ui/{Alert..jsx => Alert.jsx} (100%) diff --git a/frontend/src/components/ui/Alert..jsx b/frontend/src/components/ui/Alert.jsx similarity index 100% rename from frontend/src/components/ui/Alert..jsx rename to frontend/src/components/ui/Alert.jsx diff --git a/frontend/src/styles/auth.css b/frontend/src/styles/auth.css index 23e0fe2..f818067 100644 --- a/frontend/src/styles/auth.css +++ b/frontend/src/styles/auth.css @@ -8,7 +8,7 @@ .auth-art::before { content: ''; @apply absolute inset-0; background: linear-gradient(160deg, rgb(0 64 26 / 0.86) 20%, rgb(0 46 18 / 0.94) 100%), radial-gradient(70% 60% at 100% 0%, rgb(64 224 208 / 0.4), transparent 70%); } .auth-art-copy { @apply relative pb-2 md:pb-10; } .auth-panel { @apply grid min-w-0 place-items-center bg-page px-4 py-6 sm:px-6 sm:py-10 md:px-8 md:py-16; } - .auth-card { @apply w-full max-w-110px rounded-2xl border border-line bg-surface p-5 shadow-soft sm:rounded-3xl sm:p-8 md:p-10; } + .auth-card { @apply w-full max-w-110 rounded-2xl border border-line bg-surface p-5 shadow-soft sm:rounded-3xl sm:p-8 md:p-10; } .auth-back { @apply mb-6 inline-block rounded-full text-sm font-semibold text-muted hover:text-accent-ink sm:mb-8; } .auth-sub { @apply mt-4 text-base text-muted; } .auth-submit { @apply mt-8; } From daab185ddcf384cd0433467fecda8b5189f258f8 Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 15:23:11 +0500 Subject: [PATCH 10/21] camera permissions throughout the session. --- frontend/src/components/RecorderPanel.jsx | 22 +++++++---- frontend/src/context/RecordingProvider.jsx | 44 +++++++++++++++++++++- frontend/src/hooks/useRecorder.js | 35 ++++++++++++----- 3 files changed, 83 insertions(+), 18 deletions(-) diff --git a/frontend/src/components/RecorderPanel.jsx b/frontend/src/components/RecorderPanel.jsx index 5ff8ffa..ae80f1a 100644 --- a/frontend/src/components/RecorderPanel.jsx +++ b/frontend/src/components/RecorderPanel.jsx @@ -5,9 +5,10 @@ import { Alert, Arrow, Button } from './ui' /** Camera preview, record/stop, delete and re-record for one video. */ export default function RecorderPanel({ video, baseRef, onSaveAndEdit }) { - const { recording, status, error, elapsed, stream, start, stop, discard } = useRecorder(video.id) + const { recording, status, error, elapsed, stream, prepare, start, stop, discard } = useRecorder(video.id) const live = useRef(null) const countdownTimer = useRef(null) + const starting = useRef(false) const [countdown, setCountdown] = useState(null) useEffect(() => { @@ -18,6 +19,7 @@ export default function RecorderPanel({ video, baseRef, onSaveAndEdit }) { const isRecording = status === 'recording' const busy = status === 'requesting' || countdown !== null + const showCameraPreview = isRecording || countdown !== null || (!recording && stream) // Recording starts the base video too, so contributors can sign along while watching. const startCapture = async () => { @@ -25,15 +27,21 @@ export default function RecorderPanel({ video, baseRef, onSaveAndEdit }) { const base = baseRef.current if (started && base && (base.paused || base.ended)) base.play().catch(() => {}) } - - const begin = () => { - if (busy) return + const begin = async () => { + if (busy || starting.current) return + starting.current = true + const ready = await prepare() + if (!ready) { + starting.current = false + return + } let remaining = 3 setCountdown(remaining) const tick = () => { remaining -= 1 if (remaining === 0) { setCountdown(null) + starting.current = false startCapture() return } @@ -54,9 +62,9 @@ export default function RecorderPanel({ video, baseRef, onSaveAndEdit }) {

Watch the example, then make it yours. You can review, trim and delete your recording before you submit it.

-
diff --git a/frontend/src/styles/landing.css b/frontend/src/styles/landing.css index 580caba..d41faef 100644 --- a/frontend/src/styles/landing.css +++ b/frontend/src/styles/landing.css @@ -23,15 +23,9 @@ .hero-quote small { @apply mt-2 block font-sans text-sm font-normal; color: #45604f; } /* card is always white, so its caption cannot use a theme colour */ .marquee { @apply overflow-hidden border-y border-deep/10 bg-turquoise py-4 font-ui text-xs font-bold uppercase tracking-[.12em] text-deep sm:py-5 sm:text-sm sm:tracking-[.2em]; } - .marquee-track { @apply flex w-full; } - .marquee-content { @apply flex w-full shrink-0 items-center justify-evenly gap-4 px-4; } - .marquee-content + .marquee-content { @apply hidden; } + .marquee-track { @apply flex w-max; animation: marquee-slide 30s linear infinite; } + .marquee-content { @apply flex w-max shrink-0 items-center gap-[1.4rem] px-[.7rem]; } .marquee-star { @apply text-deep/60; } - @media (max-width: 767px) { - .marquee-track { @apply w-max; animation: marquee-slide 22s linear infinite; } - .marquee-content { @apply w-max justify-start gap-5 px-5; } - .marquee-content + .marquee-content { @apply flex; } - } @keyframes marquee-slide { to { transform: translateX(-50%); } } @media (prefers-reduced-motion: reduce) { .marquee-track { animation: none; } From b3c016d4fae3286f01d4db16745f76435234a20b Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 17:22:16 +0500 Subject: [PATCH 14/21] critial risk fix: leaving camera on for entire session --- frontend/src/context/RecordingProvider.jsx | 11 +++++++++- frontend/src/hooks/useRecorder.js | 25 ++++++++++++++++------ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/frontend/src/context/RecordingProvider.jsx b/frontend/src/context/RecordingProvider.jsx index 44d9eab..941f159 100644 --- a/frontend/src/context/RecordingProvider.jsx +++ b/frontend/src/context/RecordingProvider.jsx @@ -76,6 +76,15 @@ export default function RecordingProvider({ children }) { return request }, []) + const releaseCamera = useCallback((stream = cameraStreamRef.current) => { + if (!stream) return + stream.getTracks().forEach((track) => track.stop()) + if (cameraStreamRef.current === stream) { + cameraStreamRef.current = null + setCameraStream(null) + } + }, []) + // Different person logged in on this tab: drop whatever the previous one recorded. const userId = user?.id useEffect(() => () => { @@ -88,6 +97,6 @@ export default function RecordingProvider({ children }) { setRecordings({}) }, [userId]) - const value = useMemo(() => ({ recordings, saveRecording, removeRecording, updateEdit, cameraStream, requestCamera }), [recordings, saveRecording, removeRecording, updateEdit, cameraStream, requestCamera]) + const value = useMemo(() => ({ recordings, saveRecording, removeRecording, updateEdit, cameraStream, requestCamera, releaseCamera }), [recordings, saveRecording, removeRecording, updateEdit, cameraStream, requestCamera, releaseCamera]) return {children} } diff --git a/frontend/src/hooks/useRecorder.js b/frontend/src/hooks/useRecorder.js index 568718a..aecd211 100644 --- a/frontend/src/hooks/useRecorder.js +++ b/frontend/src/hooks/useRecorder.js @@ -13,7 +13,7 @@ function describeError(error) { /** Camera + MediaRecorder for one video. The finished take is stored in RecordingContext. */ export function useRecorder(videoId) { - const { recordings, saveRecording, removeRecording, cameraStream, requestCamera } = useRecordings() + const { recordings, saveRecording, removeRecording, cameraStream, requestCamera, releaseCamera } = useRecordings() const [status, setStatus] = useState('idle') // idle | requesting | recording const [error, setError] = useState('') const [elapsed, setElapsed] = useState(0) @@ -29,18 +29,25 @@ export function useRecorder(videoId) { setError('Recording is not supported in this browser. Try a recent version of Chrome, Edge, Firefox or Safari.') return false } + cancelled.current = false setError('') setStatus('requesting') try { - preparedStream.current = await requestCamera() + const media = await requestCamera() + if (cancelled.current) { + releaseCamera(media) + return false + } + preparedStream.current = media setStatus('idle') return true } catch (caught) { + if (cancelled.current) return false setError(describeError(caught)) setStatus('idle') return false } - }, [requestCamera]) + }, [releaseCamera, requestCamera]) const start = useCallback(async () => { const media = preparedStream.current || cameraStream @@ -61,6 +68,8 @@ export function useRecorder(videoId) { const type = instance.mimeType || mimeType || 'video/webm' saveRecording(videoId, { blob: new Blob(chunks.current, { type }), duration: Math.max((Date.now() - startedAt.current) / 1000, 0.5), mimeType: type }) } + releaseCamera(media) + preparedStream.current = null recorder.current = null setStatus('idle') } @@ -72,11 +81,13 @@ export function useRecorder(videoId) { setStatus('recording') return true } catch (caught) { + releaseCamera(media) + preparedStream.current = null setError(describeError(caught)) setStatus('idle') return false } - }, [cameraStream, saveRecording, videoId]) + }, [cameraStream, releaseCamera, saveRecording, videoId]) const stop = useCallback(() => { if (recorder.current?.state === 'recording') recorder.current.stop() @@ -87,12 +98,14 @@ export function useRecorder(videoId) { removeRecording(videoId) }, [removeRecording, videoId]) - // Leaving the page mid-take discards that take; the shared camera stream stays available. + // Leave no active recording or camera stream behind when navigating away. useEffect(() => () => { cancelled.current = true if (recorder.current?.state === 'recording') recorder.current.stop() clearInterval(timer.current) - }, []) + releaseCamera(preparedStream.current) + preparedStream.current = null + }, [releaseCamera]) return { recording: recordings[videoId] || null, status, error, elapsed, stream: cameraStream, prepare, start, stop, discard } } From 8d69f1139d25a36bd74eaa58eaffc0d9df6eff51 Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 17:29:50 +0500 Subject: [PATCH 15/21] update auth design in mobile view. --- frontend/src/styles/auth.css | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/frontend/src/styles/auth.css b/frontend/src/styles/auth.css index f818067..12c1b2d 100644 --- a/frontend/src/styles/auth.css +++ b/frontend/src/styles/auth.css @@ -15,4 +15,15 @@ .auth-footer { @apply mt-7 text-center text-base text-muted; } .auth-footer a { @apply font-semibold text-accent-ink underline underline-offset-4 decoration-2 decoration-transparent hover:decoration-current; } .auth-dev { @apply mt-8 rounded-xl border border-dashed border-line-strong p-3 text-sm text-faint; } + + @media (max-width: 767px) { + .auth-panel { + background-image: + linear-gradient(160deg, rgb(0 64 26 / 0.78) 20%, rgb(0 46 18 / 0.86) 100%), + radial-gradient(70% 60% at 100% 0%, rgb(64 224 208 / 0.3), transparent 70%), + url('https://images.unsplash.com/photo-1556761175-4b46a572b786?auto=format&fit=crop&w=1000&q=80'); + background-size: cover; + background-position: center; + } + } } From 8a435a9d94ca056785d320e98cb971109ad5529d Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 17:40:14 +0500 Subject: [PATCH 16/21] refactor code spacing --- frontend/src/components/BasePlayer.jsx | 77 ++++++--- frontend/src/components/Field.jsx | 95 +++++++--- frontend/src/components/Header.jsx | 101 ++++++++--- frontend/src/pages/CategoryBrowser.jsx | 111 ++++++++---- frontend/src/pages/ForgotPassword.jsx | 112 +++++++++--- frontend/src/pages/Home.jsx | 98 +++++++---- frontend/src/pages/Login.jsx | 75 +++++--- frontend/src/pages/Player.jsx | 133 ++++++++++---- frontend/src/pages/ProfileDashboard.jsx | 219 +++++++++++++++++------- frontend/src/pages/Signup.jsx | 89 ++++++++-- 10 files changed, 823 insertions(+), 287 deletions(-) diff --git a/frontend/src/components/BasePlayer.jsx b/frontend/src/components/BasePlayer.jsx index b368c20..5d02dc5 100644 --- a/frontend/src/components/BasePlayer.jsx +++ b/frontend/src/components/BasePlayer.jsx @@ -18,40 +18,73 @@ export default function BasePlayer({ video, videoRef }) { if (element.paused || element.ended) element.play().catch(() => {}) else element.pause() } + const replay = () => { const element = videoRef.current if (!element) return element.currentTime = 0 element.play().catch(() => {}) } - const seek = (event) => { videoRef.current.currentTime = Number(event.target.value) } + + const seek = (event) => { + videoRef.current.currentTime = Number(event.target.value) + } + const cycleSpeed = () => { const next = SPEEDS[(SPEEDS.indexOf(speed) + 1) % SPEEDS.length] videoRef.current.playbackRate = next setSpeed(next) } + const fullscreen = () => frame.current?.requestFullscreen?.() - return
-
-
-
- - - - {formatTime(time)} / {formatTime(duration)} - - + return ( +
+
+
+ +
+ + + + {formatTime(time)} / {formatTime(duration)} + + +
-
+ ) } diff --git a/frontend/src/components/Field.jsx b/frontend/src/components/Field.jsx index 78bca57..b299e94 100644 --- a/frontend/src/components/Field.jsx +++ b/frontend/src/components/Field.jsx @@ -8,25 +8,80 @@ export default function Field({ label, error, hint, id, type, as: Control = 'inp const hintId = `${fieldId}-hint` const [passwordVisible, setPasswordVisible] = useState(false) const isPassword = Control === 'input' && type === 'password' - return
- - {isPassword - ?
- {children} - +
+ ) : ( + - {passwordVisible - ? - : } - -
- : {children}} - {error ?

{error}

: hint ?

{hint}

: null} -
+ {children} + + )} + + {error ? ( +

{error}

+ ) : hint ? ( +

{hint}

+ ) : null} +
+ ) } diff --git a/frontend/src/components/Header.jsx b/frontend/src/components/Header.jsx index 9b1279a..aca93ad 100644 --- a/frontend/src/components/Header.jsx +++ b/frontend/src/components/Header.jsx @@ -6,33 +6,94 @@ import NotificationBell from './NotificationBell' import ThemeToggle from './ThemeToggle' import { Arrow, Avatar, Brand, ButtonLink } from './ui' -const publicLinks = [['How it works', paths.demo], ['About', paths.about], ['FAQ', paths.faq], ['Contact', paths.contact]] -const memberLinks = [['Library', paths.library], ['FAQ', paths.faq], ['My space', paths.profile]] +const publicLinks = [ + ['How it works', paths.demo], + ['About', paths.about], + ['FAQ', paths.faq], + ['Contact', paths.contact] +] + +const memberLinks = [ + ['Library', paths.library], + ['FAQ', paths.faq], + ['My space', paths.profile] +] export default function Header() { const { user, logout } = useAuth() const navigate = useNavigate() const [open, setOpen] = useState(false) const links = user ? memberLinks : publicLinks + const close = () => setOpen(false) - const handleLogout = async () => { close(); await logout(); navigate(paths.home) } + + const handleLogout = async () => { + close() + await logout() + navigate(paths.home) + } + + return ( +
+
+ + + - return
-
- - -
- - {user && } - {user - ? - : <>Log inGet started } - +
+ + + {user && } + + {user ? ( + + + + ) : ( + <> + + Log in + + + Get started + + + )} + + +
-
- {open && } -
+ + {open && ( + + )} +
+ ) } diff --git a/frontend/src/pages/CategoryBrowser.jsx b/frontend/src/pages/CategoryBrowser.jsx index 5e3f4d8..a0c62ed 100644 --- a/frontend/src/pages/CategoryBrowser.jsx +++ b/frontend/src/pages/CategoryBrowser.jsx @@ -26,41 +26,88 @@ export default function CategoryBrowser() { .sort(SORTS[sort].compare) if (!category) { - return Back to library}>It may have been renamed or removed. + return ( + Back to library} + > + It may have been renamed or removed. + + ) } - return
- -
-
Category · {all.length} {all.length === 1 ? 'video' : 'videos'}

{category.label}
starts here.

-

{category.copy}

-
+ return ( +
+ -
- - +
+
+ Category · {all.length} {all.length === 1 ? 'video' : 'videos'} +

{category.label}
starts here.

- } /> - +

{category.copy}

+
- {videos.length - ?
- {videos.map((video) => { - const count = submissionCount(video.id) - return - - {String(all.indexOf(video) + 1).padStart(2, '0')} - {hasSubmission(video.id) && ✓ {count} submitted} - - -

{formatTime(video.durationSec)}

-

{video.title}

- {hasSubmission(video.id) ? 'Record another' : 'Open video'} ↗ - - })} -
- :

{all.length ? 'No videos match that search. ' : 'No videos in this category yet. '}{all.length > 0 && }

} -
-
+
+ + +
+ } + /> + + + + {videos.length ? ( +
+ {videos.map((video) => { + const count = submissionCount(video.id) + return ( + + + {String(all.indexOf(video) + 1).padStart(2, '0')} + {hasSubmission(video.id) && ( + + ✓ {count} submitted + + )} + + +

{formatTime(video.durationSec)}

+

{video.title}

+ + {hasSubmission(video.id) ? 'Record another' : 'Open video'} ↗ + + + ) + })} +
+ ) : ( +

+ {all.length ? 'No videos match that search. ' : 'No videos in this category yet. '} + {all.length > 0 && ( + + )} +

+ )} + + + ) } diff --git a/frontend/src/pages/ForgotPassword.jsx b/frontend/src/pages/ForgotPassword.jsx index 2c4ce0b..ec4ed12 100644 --- a/frontend/src/pages/ForgotPassword.jsx +++ b/frontend/src/pages/ForgotPassword.jsx @@ -22,7 +22,10 @@ export default function ForgotPassword() { const requestCode = async (event) => { event.preventDefault() setError('') - if (!isEmail(email)) { setError('Enter a valid email address.'); return } + if (!isEmail(email)) { + setError('Enter a valid email address.') + return + } setBusy(true) try { const result = await api.auth.forgotPassword(email) @@ -38,9 +41,18 @@ export default function ForgotPassword() { const reset = async (event) => { event.preventDefault() setError('') - if (code.length !== 6) { setError('Enter the six-digit code from your email.'); return } - if (password.length < 8) { setError('Use at least 8 characters for your password.'); return } - if (password !== confirmPassword) { setError('Passwords do not match.'); return } + if (code.length !== 6) { + setError('Enter the six-digit code from your email.') + return + } + if (password.length < 8) { + setError('Use at least 8 characters for your password.') + return + } + if (password !== confirmPassword) { + setError('Passwords do not match.') + return + } setBusy(true) try { await api.auth.resetPassword({ email, code, password, confirmPassword }) @@ -64,27 +76,73 @@ export default function ForgotPassword() { } } - return Remembered it? Log in} - > - {!resetting - ? - setEmail(event.target.value)} autoComplete="email" /> - {error && {error}} - - - :
- setEmail(event.target.value)} autoComplete="email" /> - setCode(event.target.value.replace(/\D/g, '').slice(0, 6))} /> - setPassword(event.target.value)} hint="Use at least 8 characters." /> - setConfirmPassword(event.target.value)} /> - {notice && {notice}} - {error && {error}} - - - } -
+ return ( + Remembered it? Log in} + > + {!resetting ? ( +
+ setEmail(event.target.value)} + autoComplete="email" + /> + {error && {error}} + + + ) : ( +
+ setEmail(event.target.value)} + autoComplete="email" + /> + setCode(event.target.value.replace(/\D/g, '').slice(0, 6))} + /> + setPassword(event.target.value)} + hint="Use at least 8 characters." + /> + setConfirmPassword(event.target.value)} + /> + {notice && {notice}} + {error && {error}} + + + + )} +
+ ) } diff --git a/frontend/src/pages/Home.jsx b/frontend/src/pages/Home.jsx index 32b5b33..76c6638 100644 --- a/frontend/src/pages/Home.jsx +++ b/frontend/src/pages/Home.jsx @@ -13,43 +13,71 @@ export default function Home() { const nextCategory = nextUp && categories.find((item) => item.id === nextUp.categoryId) const visibleCategories = categories.filter((item) => videosIn(item.id).length) - return
-
-
- {today} -

{greeting()}, {user.firstName}.

-

Which video would you like to contribute to today?

-
-
- -
- {nextUp ? <> + return ( +
+
- Keep contributing ✦ -

{nextUp.title}

-

{nextCategory?.label}

-
{contributedCount} of {orderedPublished.length} videos have a recording from you
+ {today} +

+ {greeting()}, {user.firstName}. +

+

Which video would you like to contribute to today?

- ▶ - :
{orderedPublished.length ? 'Every video covered ✦' : 'Nothing here yet'}

{orderedPublished.length ? 'You have recorded every video at least once.' : 'Videos are on their way.'}

{orderedPublished.length ? 'You can still record any of them again — new categories will also appear here when they are published.' : 'Check back soon.'}

} -
+
-
- - {visibleCategories.length - ?
- {visibleCategories.map((category, index) => { - const videos = videosIn(category.id) - const contributed = videos.filter((video) => hasSubmission(video.id)).length - return - {String(index + 1).padStart(2, '0')} - -

{category.label}

{category.copy}

- {videos.length} {videos.length === 1 ? 'video' : 'videos'} · {contributed} covered +
+ {nextUp ? ( + <> +
+ Keep contributing ✦ +

{nextUp.title}

+

{nextCategory?.label}

+
+ + {contributedCount} of {orderedPublished.length} videos have a recording from you +
+
+ + ▶ - })} -
- :

No categories have published videos yet. Check back soon.

} -
-
+ + ) : ( +
+ {orderedPublished.length ? 'Every video covered ✦' : 'Nothing here yet'} +

+ {orderedPublished.length ? 'You have recorded every video at least once.' : 'Videos are on their way.'} +

+

+ {orderedPublished.length ? 'You can still record any of them again — new categories will also appear here when they are published.' : 'Check back soon.'} +

+
+ )} + + +
+ + {visibleCategories.length ? ( +
+ {visibleCategories.map((category, index) => { + const videos = videosIn(category.id) + const contributed = videos.filter((video) => hasSubmission(video.id)).length + return ( + + {String(index + 1).padStart(2, '0')} + +
+

{category.label}

+

{category.copy}

+
+ {videos.length} {videos.length === 1 ? 'video' : 'videos'} · {contributed} covered + + ) + })} +
+ ) : ( +

No categories have published videos yet. Check back soon.

+ )} +
+ + ) } diff --git a/frontend/src/pages/Login.jsx b/frontend/src/pages/Login.jsx index 3076676..4d8141f 100644 --- a/frontend/src/pages/Login.jsx +++ b/frontend/src/pages/Login.jsx @@ -14,6 +14,7 @@ export default function Login() { const [errors, setErrors] = useState({}) const [formError, setFormError] = useState('') const [busy, setBusy] = useState(false) + const change = (event) => setValues((current) => ({ ...current, [event.target.name]: event.target.value })) const submit = async (event) => { @@ -23,31 +24,55 @@ export default function Login() { if (Object.keys(found).length) return setBusy(true) setFormError('') - try { await login(values.email, values.password) } - catch (error) { setFormError(error.message); setBusy(false) } + try { + await login(values.email, values.password) + } catch (error) { + setFormError(error.message) + setBusy(false) + } } - return( - New to Signpak? - - Create an account - - - }> -
- - -

Forgot password? · Verify email

- {location.state?.notice && {location.state.notice}} - {formError && {formError}} - - -
- ); + return ( + + New to Signpak? Create an account + + } + > +
+ + +

+ Forgot password? · Verify email +

+ {location.state?.notice && {location.state.notice}} + {formError && {formError}} + + +
+ ) } diff --git a/frontend/src/pages/Player.jsx b/frontend/src/pages/Player.jsx index 40a2d1d..77093e9 100644 --- a/frontend/src/pages/Player.jsx +++ b/frontend/src/pages/Player.jsx @@ -10,6 +10,7 @@ import { safeRouteId } from '../utils/validators' export default function Player() { const [params] = useSearchParams() const videoId = safeRouteId(params.get('v')) + // Keyed so switching videos (Next video, another category) resets the player and the camera. return } @@ -18,23 +19,36 @@ export default function Player() { function useCooldown(lastAt, cooldownMs) { const compute = () => (lastAt ? Math.max(0, cooldownMs - (Date.now() - lastAt)) : 0) const [remaining, setRemaining] = useState(compute) + useEffect(() => { if (!lastAt) return undefined const id = setInterval(() => setRemaining(compute()), 250) return () => clearInterval(id) // eslint-disable-next-line react-hooks/exhaustive-deps -- `compute` is intentionally re-created each render; only lastAt/cooldownMs should restart the interval }, [lastAt, cooldownMs]) + return remaining } function PlayerScreen({ videoId }) { - const { publishedVideos, categories, videosIn, submissionCount, lastSubmissionAt, nextVideo, cooldownMs, refresh } = useLibrary() + const { + publishedVideos, + categories, + videosIn, + submissionCount, + lastSubmissionAt, + nextVideo, + cooldownMs, + refresh + } = useLibrary() + const navigate = useNavigate() const location = useLocation() const baseRef = useRef(null) const video = publishedVideos.find((item) => item.id === videoId) const [justSubmitted, setJustSubmitted] = useState(Boolean(location.state?.justSubmitted)) + useEffect(() => { if (!justSubmitted) return undefined const timer = setTimeout(() => setJustSubmitted(false), 5000) @@ -44,13 +58,26 @@ function PlayerScreen({ videoId }) { const remaining = useCooldown(video ? lastSubmissionAt(video.id) : null, cooldownMs) // The countdown only ever counts down, so a fresh 0 -> refresh library data to reflect the new submission in badges/counts. const wasCoolingDown = useRef(false) + useEffect(() => { - if (remaining > 0) wasCoolingDown.current = true - else if (wasCoolingDown.current) { wasCoolingDown.current = false; refresh() } + if (remaining > 0) { + wasCoolingDown.current = true + } else if (wasCoolingDown.current) { + wasCoolingDown.current = false + refresh() + } }, [remaining, refresh]) if (!video) { - return Back to library}>It may have been unpublished or removed. + return ( + Back to library} + > + It may have been unpublished or removed. + + ) } const category = categories.find((item) => item.id === video.categoryId) @@ -60,34 +87,78 @@ function PlayerScreen({ videoId }) { const goNext = () => navigate(next ? watchUrl(next.id) : categoryUrl(video.categoryId)) const seconds = Math.ceil(remaining / 1000) - return
-
← Back to videosVideo {String(number).padStart(2, '0')}
-
-
- -
-
{category?.label}

{video.title}

- -
- {justSubmitted && Recording received — thank you for contributing.} + return ( +
+
+ ← Back to videos + Video {String(number).padStart(2, '0')}
- -
-
+ + {justSubmitted && ( + + Recording received — thank you for contributing. + + )} +
+ + + + + ) } diff --git a/frontend/src/pages/ProfileDashboard.jsx b/frontend/src/pages/ProfileDashboard.jsx index 77549f9..170e61c 100644 --- a/frontend/src/pages/ProfileDashboard.jsx +++ b/frontend/src/pages/ProfileDashboard.jsx @@ -10,78 +10,140 @@ import { normalizeGithub, normalizeLinkedin } from '../utils/validators' export default function ProfileDashboard() { const { user, isAdmin, logout } = useAuth() - const { categories, videosIn, hasSubmission, mySubmissions, publishedVideos, orderedPublished, contributedCount, totalSubmissionCount } = useLibrary() + const { + categories, + videosIn, + hasSubmission, + mySubmissions, + publishedVideos, + orderedPublished, + contributedCount, + totalSubmissionCount + } = useLibrary() const navigate = useNavigate() const total = orderedPublished.length const percent = total ? Math.round((contributedCount / total) * 100) : 0 - const recent = [...mySubmissions].filter((item) => publishedVideos.some((video) => video.id === item.videoId)).sort((a, b) => b.submittedAt - a.submittedAt) + const recent = [...mySubmissions] + .filter((item) => publishedVideos.some((video) => video.id === item.videoId)) + .sort((a, b) => b.submittedAt - a.submittedAt) - return
-
-
- Your space -

{user.firstName} {user.surname}.

-

{user.email} · Contributing since {new Date(user.createdAt).toLocaleDateString('en-US', { month: 'long', year: 'numeric' })}

- -
- -
- -
-
-
- {contributedCount}/{total}} /> - -
Videos covered · {totalSubmissionCount} {totalSubmissionCount === 1 ? 'recording' : 'recordings'} submitted in total{percent}%
-
    - {categories.filter((category) => videosIn(category.id).length).map((category) => { - const videos = videosIn(category.id) - const contributed = videos.filter((video) => hasSubmission(video.id)).length - return
  • {category.label}{contributed}/{videos.length}
  • - })} -
- Keep contributing + return ( +
+
+
+ Your space +

{user.firstName} {user.surname}.

+

+ {user.email} · Contributing since {new Date(user.createdAt).toLocaleDateString('en-US', { month: 'long', year: 'numeric' })} +

+
+ +
-
- Your recordings -

Recent submissions.

- {recent.length - ?
    - {recent.map((item) => { - const video = publishedVideos.find((entry) => entry.id === item.videoId) - return
  • {video.title}Submitted {formatDate(item.submittedAt)}
    Submitted
  • +
    +
    +
    + {contributedCount}/{total}} + /> + +
    + Videos covered · {totalSubmissionCount} {totalSubmissionCount === 1 ? 'recording' : 'recordings'} submitted in total + {percent}% +
    +
      + {categories.filter((category) => videosIn(category.id).length).map((category) => { + const videos = videosIn(category.id) + const contributed = videos.filter((video) => hasSubmission(video.id)).length + return ( +
    • + {category.label} + + {contributed}/{videos.length} +
    • + ) })}
    - :

    Your submitted recordings will show up here.

    } + + Keep contributing + +
    + +
    + Your recordings +

    Recent submissions.

    + {recent.length ? ( +
      + {recent.map((item) => { + const video = publishedVideos.find((entry) => entry.id === item.videoId) + return ( +
    • + +
      + {video.title} + Submitted {formatDate(item.submittedAt)} +
      + Submitted +
    • + ) + })} +
    + ) : ( +

    Your submitted recordings will show up here.

    + )} +
    -
- -
-
+ + + + ) } function ConnectForm() { const { user, saveConnections } = useAuth() - const [values, setValues] = useState({ github: user.connections?.github || '', linkedin: user.connections?.linkedin || '' }) + const [values, setValues] = useState({ + github: user.connections?.github || '', + linkedin: user.connections?.linkedin || '' + }) const [errors, setErrors] = useState({}) const [message, setMessage] = useState('') - const change = (event) => { setMessage(''); setValues((current) => ({ ...current, [event.target.name]: event.target.value })) } + const change = (event) => { + setMessage('') + setValues((current) => ({ ...current, [event.target.name]: event.target.value })) + } + const persist = async (github, linkedin, success) => { await saveConnections({ github, linkedin }) setValues({ github: github || '', linkedin: linkedin || '' }) setMessage(success) } + const submit = async (event) => { event.preventDefault() const github = normalizeGithub(values.github) @@ -91,20 +153,55 @@ function ConnectForm() { if (Object.keys(found).length) return await persist(github.value, linkedin.value, 'Your connections are saved.') } + const disconnect = (name) => { setErrors({}) - const next = { github: user.connections?.github || null, linkedin: user.connections?.linkedin || null, [name]: null } + const next = { + github: user.connections?.github || null, + linkedin: user.connections?.linkedin || null, + [name]: null + } return persist(next.github, next.linkedin, `${name === 'github' ? 'GitHub' : 'LinkedIn'} disconnected.`) } - return
- Connect -

Bring your
world in.

- - {user.connections?.github &&

✓ Connected as @{user.connections.github}

} - - {user.connections?.linkedin &&

✓ Connected: LinkedIn profile

} - {message && {message}} - - + return ( +
+ Connect +

Bring your
world in.

+ + {user.connections?.github && ( +

+ ✓ Connected as @{user.connections.github}{' '} + +

+ )} + + {user.connections?.linkedin && ( +

+ ✓ Connected: LinkedIn profile{' '} + +

+ )} + {message && {message}} + + + ) } diff --git a/frontend/src/pages/Signup.jsx b/frontend/src/pages/Signup.jsx index 5fece6b..8a35f07 100644 --- a/frontend/src/pages/Signup.jsx +++ b/frontend/src/pages/Signup.jsx @@ -16,6 +16,7 @@ export default function Signup() { const [errors, setErrors] = useState({}) const [formError, setFormError] = useState('') const [busy, setBusy] = useState(false) + const change = (event) => setValues((current) => ({ ...current, [event.target.name]: event.target.value })) const submit = async (event) => { @@ -28,20 +29,80 @@ export default function Signup() { try { const result = await signup(values) navigate(`${paths.verifyEmail}?email=${encodeURIComponent(result.email)}`, { replace: true, state: { emailSent: result.verificationEmailSent } }) - } catch (error) { setFormError(error.message); setBusy(false) } + } catch (error) { + setFormError(error.message) + setBusy(false) + } } - return Already signed up? Verify your email · Log in}> -
-
- - -
- - - - {formError && {formError}} - - -
+ return ( + + Already signed up? Verify your email · Log in + + } + > +
+
+ + +
+ + + + {formError && {formError}} + + +
+ ) } From 8668acaa71da058ba714f868d544014256de495e Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 17:48:54 +0500 Subject: [PATCH 17/21] faq navigation changes --- frontend/src/components/Footer.jsx | 1 + frontend/src/components/Header.jsx | 2 -- frontend/src/pages/Landing.jsx | 4 ++++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/Footer.jsx b/frontend/src/components/Footer.jsx index a62b0c3..0c4cd7e 100644 --- a/frontend/src/components/Footer.jsx +++ b/frontend/src/components/Footer.jsx @@ -23,6 +23,7 @@ export default function Footer() {

Good to know

+ FAQ Policy Contact us
diff --git a/frontend/src/components/Header.jsx b/frontend/src/components/Header.jsx index aca93ad..ec11614 100644 --- a/frontend/src/components/Header.jsx +++ b/frontend/src/components/Header.jsx @@ -9,13 +9,11 @@ import { Arrow, Avatar, Brand, ButtonLink } from './ui' const publicLinks = [ ['How it works', paths.demo], ['About', paths.about], - ['FAQ', paths.faq], ['Contact', paths.contact] ] const memberLinks = [ ['Library', paths.library], - ['FAQ', paths.faq], ['My space', paths.profile] ] diff --git a/frontend/src/pages/Landing.jsx b/frontend/src/pages/Landing.jsx index b46fa24..b87a473 100644 --- a/frontend/src/pages/Landing.jsx +++ b/frontend/src/pages/Landing.jsx @@ -1,4 +1,5 @@ import { useState } from 'react' +import { Link } from 'react-router-dom' import { useAuth } from '../context/AuthContext' import { useLibrary } from '../context/LibraryContext' import Field from '../components/Field' @@ -198,6 +199,9 @@ export default function Landing() {

Have questions about video contributions, recording specifications, or partnership opportunities? Reach out to our team.

+

+ Looking for a quick answer? Visit our FAQ page. +

From 026ee86d6a189406110911f0da52ba32911fc05a Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 18:14:45 +0500 Subject: [PATCH 18/21] fixing unecessary frontend request --- frontend/src/components/RouteGuards.jsx | 28 +++++++-- frontend/src/context/AuthProvider.jsx | 74 +++++++++++++++--------- frontend/src/context/LibraryProvider.jsx | 60 ++++++++++++++----- frontend/src/pages/Landing.jsx | 10 ++-- 4 files changed, 122 insertions(+), 50 deletions(-) diff --git a/frontend/src/components/RouteGuards.jsx b/frontend/src/components/RouteGuards.jsx index f153018..a145a68 100644 --- a/frontend/src/components/RouteGuards.jsx +++ b/frontend/src/components/RouteGuards.jsx @@ -1,10 +1,21 @@ +import { useEffect } from 'react' import { Navigate, Outlet, useLocation } from 'react-router-dom' +import { Button, PageState } from './ui' import { useAuth } from '../context/AuthContext' export function RequireAuth() { - const { user, loading } = useAuth() + const { user, loading, sessionChecked, sessionError, ensureSession } = useAuth() const location = useLocation() - if (loading) return
Checking your session…
+ useEffect(() => { + if (!sessionChecked) void ensureSession() + }, [sessionChecked, ensureSession]) + + if (sessionError) return void ensureSession()}>Try again} + >{sessionError} + if (!sessionChecked || loading) return
Checking your session…
if (!user) return return } @@ -16,9 +27,18 @@ export function RequireAdmin() { /** Login and signup are for logged-out visitors. Anyone already in goes back to where they were headed. */ export function GuestOnly() { - const { user, loading } = useAuth() + const { user, loading, sessionChecked, sessionError, ensureSession } = useAuth() const location = useLocation() - if (loading) return
Checking your session…
+ useEffect(() => { + if (!sessionChecked) void ensureSession() + }, [sessionChecked, ensureSession]) + + if (sessionError) return void ensureSession()}>Try again} + >{sessionError} + if (!sessionChecked || loading) return
Checking your session…
if (user) return return } diff --git a/frontend/src/context/AuthProvider.jsx b/frontend/src/context/AuthProvider.jsx index 1b0e8e8..7aef4f9 100644 --- a/frontend/src/context/AuthProvider.jsx +++ b/frontend/src/context/AuthProvider.jsx @@ -1,45 +1,67 @@ -import { useCallback, useEffect, useMemo, useState } from 'react' +import { useCallback, useMemo, useRef, useState } from 'react' import { api } from '../services/api' import { AuthContext } from './AuthContext' export default function AuthProvider({ children }) { const [user, setUser] = useState(null) - const [loading, setLoading] = useState(true) + const [loading, setLoading] = useState(false) + const [sessionChecked, setSessionChecked] = useState(false) + const [sessionError, setSessionError] = useState('') + const sessionRequest = useRef(null) - const refreshSession = useCallback(async () => { - try { - setUser(await api.auth.session()) - } catch { - setUser(null) - } finally { - setLoading(false) - } - }, []) + const ensureSession = useCallback(() => { + if (sessionChecked && !sessionError) return Promise.resolve(user) + if (sessionRequest.current) return sessionRequest.current - useEffect(() => { - const initialRefresh = window.setTimeout(refreshSession, 0) - window.addEventListener('storage', refreshSession) - window.addEventListener('signpak:auth-change', refreshSession) - return () => { - window.clearTimeout(initialRefresh) - window.removeEventListener('storage', refreshSession) - window.removeEventListener('signpak:auth-change', refreshSession) - } - }, [refreshSession]) + setLoading(true) + setSessionError('') + const request = api.auth.session() + .then((session) => { + setUser(session) + return session + }).catch((error) => { + setUser(null) + setSessionError(error?.message || 'Unable to check your session. Try again.') + return null + }) + .finally(() => { + sessionRequest.current = null + setSessionChecked(true) + setLoading(false) + }) + sessionRequest.current = request + return request + }, [sessionChecked, sessionError, user]) - const login = useCallback(async (email, password) => setUser(await api.auth.login(email, password)), []) + const login = useCallback(async (email, password) => { + const nextUser = await api.auth.login(email, password) + setUser(nextUser) + setSessionChecked(true) + setSessionError('') + return nextUser + }, []) const signup = useCallback((values) => api.auth.register(values), []) - const verifyEmail = useCallback(async (email, code) => setUser(await api.auth.verifyEmail(email, code)), []) + const verifyEmail = useCallback(async (email, code) => { + const nextUser = await api.auth.verifyEmail(email, code) + setUser(nextUser) + setSessionChecked(true) + setSessionError('') + return nextUser + }, []) const logout = useCallback(async () => { - try { await api.auth.logout() } finally { setUser(null) } + try { await api.auth.logout() } finally { + setUser(null) + setSessionChecked(true) + setSessionError('') + } }, []) const saveConnections = useCallback(async (connections) => { if (user) setUser(await api.auth.saveConnections(user.id, connections)) }, [user]) const value = useMemo( - () => ({ user, loading, isAdmin: user?.role === 'admin', login, signup, verifyEmail, logout, saveConnections }), - [user, loading, login, signup, verifyEmail, logout, saveConnections], + () => ({ user, loading, sessionChecked, sessionError, ensureSession, isAdmin: user?.role === 'admin', login, signup, verifyEmail, logout, saveConnections }), + [user, loading, sessionChecked, sessionError, ensureSession, login, signup, verifyEmail, logout, saveConnections], ) return {children} } diff --git a/frontend/src/context/LibraryProvider.jsx b/frontend/src/context/LibraryProvider.jsx index acbedc7..a197545 100644 --- a/frontend/src/context/LibraryProvider.jsx +++ b/frontend/src/context/LibraryProvider.jsx @@ -1,10 +1,12 @@ -import { useCallback, useEffect, useMemo, useState } from 'react' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { useLocation } from 'react-router-dom' import { Button, PageState } from '../components/ui' import { api } from '../services/api' +import { paths } from '../routes/appRoutes' import { useAuth } from './AuthContext' import { LibraryContext } from './LibraryContext' -const EMPTY = { ready: false, categories: [], videos: [], submissions: [] } +const EMPTY = { ready: false, ownerId: null, categories: [], videos: [], submissions: [] } const SUBMISSION_COOLDOWN_MS = Number(import.meta.env.VITE_SUBMISSION_COOLDOWN_MS || 30_000) function loadLibrary(user) { @@ -16,32 +18,61 @@ function loadLibrary(user) { ]) } +function isLibraryRoute(pathname) { + return pathname === paths.library + || pathname.startsWith('/library/') + || pathname === paths.watch + || pathname === paths.watchEdit + || pathname === paths.profile + || pathname === paths.admin + || pathname.startsWith(`${paths.admin}/`) +} + export default function LibraryProvider({ children }) { const { user } = useAuth() + const location = useLocation() const [data, setData] = useState(EMPTY) - const [loadError, setLoadError] = useState('') + const [loadError, setLoadError] = useState(null) const [loadAttempt, setLoadAttempt] = useState(0) + const inFlight = useRef(new Map()) + const shouldLoad = Boolean(user) && isLibraryRoute(location.pathname) + const userId = user?.id const refresh = useCallback(async () => { + if (!user) throw new Error('You must be logged in to load the library.') const [categories, videos, submissions] = await loadLibrary(user) - setData({ ready: true, categories, videos, submissions }) - setLoadError('') + setData({ ready: true, ownerId: user.id, categories, videos, submissions }) + setLoadError(null) }, [user]) useEffect(() => { + if (!user || !shouldLoad || (data.ready && data.ownerId === user.id)) return undefined + let active = true - loadLibrary(user) + let request = inFlight.current.get(user.id) + if (!request) { + request = loadLibrary(user) + inFlight.current.set(user.id, request) + const clearRequest = () => { + if (inFlight.current.get(user.id) === request) inFlight.current.delete(user.id) + } + request.then(clearRequest, clearRequest) + } + request .then(([categories, videos, submissions]) => { if (active) { - setData({ ready: true, categories, videos, submissions }) - setLoadError('') + setData({ ready: true, ownerId: user.id, categories, videos, submissions }) + setLoadError(null) } }) .catch((error) => { - if (active) setLoadError(error?.message || 'Unable to load the library. Try again.') + if (active) setLoadError({ + userId: user.id, + message: error?.message || 'Unable to load the library. Try again.', + }) }) return () => { active = false } - }, [user, loadAttempt]) + }, [data.ownerId, data.ready, loadAttempt, shouldLoad, user, userId]) const value = useMemo(() => { const { categories, videos, submissions } = data @@ -98,16 +129,17 @@ export default function LibraryProvider({ children }) { } }, [data, user, refresh]) - if (!data.ready && loadError) { + const dataReadyForUser = Boolean(user) && data.ready && data.ownerId === user.id + if (shouldLoad && !dataReadyForUser && loadError?.userId === user.id) { return { - setLoadError('') + setLoadError(null) setLoadAttempt((attempt) => attempt + 1) }}>Try again} - >{loadError} + >{loadError.message} } - if (!data.ready) return
Loading your library…
+ if (shouldLoad && !dataReadyForUser) return
Loading your library…
return {children} } diff --git a/frontend/src/pages/Landing.jsx b/frontend/src/pages/Landing.jsx index b87a473..66b5693 100644 --- a/frontend/src/pages/Landing.jsx +++ b/frontend/src/pages/Landing.jsx @@ -1,7 +1,6 @@ import { useState } from 'react' import { Link } from 'react-router-dom' import { useAuth } from '../context/AuthContext' -import { useLibrary } from '../context/LibraryContext' import Field from '../components/Field' import Footer from '../components/Footer' import { Alert, Arrow, Button, ButtonLink, Eyebrow } from '../components/ui' @@ -47,7 +46,6 @@ const contributorPerks = [ export default function Landing() { const { user } = useAuth() - const { publishedVideos, categories } = useLibrary() return (
@@ -121,12 +119,12 @@ export default function Landing() {

-
signs cataloged
-
{publishedVideos.length}
+
language
+
PSL
-
categories
-
{categories.length}
+
project
+
AI
community impact
From 596483f867985b92b81e746e136b13ae2b713fb9 Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 18:25:55 +0500 Subject: [PATCH 19/21] frontend update for cache connection --- frontend/src/pages/Landing.jsx | 33 ++++++++++++++++++++++-------- frontend/src/services/api.js | 12 +++++++++++ frontend/src/services/apiRoutes.js | 3 +++ 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/frontend/src/pages/Landing.jsx b/frontend/src/pages/Landing.jsx index 66b5693..1fbb781 100644 --- a/frontend/src/pages/Landing.jsx +++ b/frontend/src/pages/Landing.jsx @@ -1,4 +1,4 @@ -import { useState } from 'react' +import { useEffect, useState } from 'react' import { Link } from 'react-router-dom' import { useAuth } from '../context/AuthContext' import Field from '../components/Field' @@ -46,6 +46,22 @@ const contributorPerks = [ export default function Landing() { const { user } = useAuth() + const [stats, setStats] = useState(null) + const [statsError, setStatsError] = useState(false) + + useEffect(() => { + let active = true + api.public.stats() + .then((result) => { + if (!active) return + setStats(result) + setStatsError(false) + }) + .catch(() => { + if (active) setStatsError(true) + }) + return () => { active = false } + }, []) return (
@@ -117,20 +133,21 @@ export default function Landing() {

By contributing short video clips of signs, you directly help train and fine-tune machine learning models, moving PSL technology beyond isolated letters toward real-world communication.

-
+
-
language
-
PSL
+
registered contributors
+
{stats?.contributors ?? '—'}
-
project
-
AI
+
published videos
+
{stats?.publishedVideos ?? '—'}
-
community impact
-
∞
+
categories
+
{stats?.categories ?? '—'}
+ {statsError &&

Community counts are temporarily unavailable.

}
diff --git a/frontend/src/services/api.js b/frontend/src/services/api.js index 54dfccd..77d323f 100644 --- a/frontend/src/services/api.js +++ b/frontend/src/services/api.js @@ -66,6 +66,7 @@ async function request(path, options = {}) { const json = (method, body) => ({ method, body: JSON.stringify(body) }) const normalizeList = (items) => (items || []).map(normalize) +let publicStatsRequest const notifications = { async list(userId) { return readLocal('notifications', []).filter((item) => item.userId === userId).sort((a, b) => b.createdAt - a.createdAt) }, @@ -83,6 +84,17 @@ const notifications = { } export const api = { + public: { + stats() { + if (!publicStatsRequest) { + publicStatsRequest = request(apiRoutes.public.stats()).finally(() => { + publicStatsRequest = null + }) + } + return publicStatsRequest + }, + }, + auth: { async session() { return normalize(await request(apiRoutes.auth.session())) }, async register(values) { return normalize(await request(apiRoutes.auth.signup(), json('POST', values))) }, diff --git a/frontend/src/services/apiRoutes.js b/frontend/src/services/apiRoutes.js index 5ebcaba..4730d34 100644 --- a/frontend/src/services/apiRoutes.js +++ b/frontend/src/services/apiRoutes.js @@ -9,6 +9,9 @@ const qs = (params = {}) => { export const apiRoutes = { health: () => `${API_BASE}/health`, + public: { + stats: () => `${API_BASE}/public/stats`, + }, auth: { signup: () => `${API_BASE}/auth/signup`, From 2303ec8c14d348206e55612e5da94f649a4e3513 Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 18:29:35 +0500 Subject: [PATCH 20/21] backend database connections updated --- backend/.env.example | 5 ++ backend/docs/setup.md | 2 + backend/src/config/env.js | 10 ++++ .../src/controllers/publicStatsController.js | 7 +++ backend/src/docs/openapi.js | 17 +++++++ backend/src/routes/index.js | 2 + backend/src/routes/publicStatsRoutes.js | 8 +++ backend/src/services/cache/upstashRedis.js | 39 ++++++++++++++ backend/src/services/publicStatsService.js | 51 +++++++++++++++++++ backend/tests/api-basics.test.js | 13 +++++ 10 files changed, 154 insertions(+) create mode 100644 backend/src/controllers/publicStatsController.js create mode 100644 backend/src/routes/publicStatsRoutes.js create mode 100644 backend/src/services/cache/upstashRedis.js create mode 100644 backend/src/services/publicStatsService.js diff --git a/backend/.env.example b/backend/.env.example index c8eedaa..5d924ce 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -67,5 +67,10 @@ MAX_RECORDING_UPLOAD_MB=80 RATE_LIMIT_ENABLED=true +# Optional Upstash Redis REST credentials for caching public landing-page counts +# for 12 hours. Set both values to enable the cache. +# UPSTASH_REDIS_REST_URL=https://.upstash.io +# UPSTASH_REDIS_REST_TOKEN= + # Minimum gap, in milliseconds, between two submissions for the same (user, video). SUBMISSION_COOLDOWN_MS=30000 diff --git a/backend/docs/setup.md b/backend/docs/setup.md index fd54fc2..f5c3f44 100644 --- a/backend/docs/setup.md +++ b/backend/docs/setup.md @@ -144,6 +144,8 @@ shared credentials. | --- | --- | --- | | `RATE_LIMIT_ENABLED` | `true` or `false`; default `true` | Enables API and upload rate limits. Keep enabled outside local debugging. | | `SUBMISSION_COOLDOWN_MS` | Set manually; default `30000` | Minimum delay between submissions for the same user and reference video. | +| `UPSTASH_REDIS_REST_URL` | Upstash Redis database REST URL | Optional shared cache for public landing-page counts. Set together with `UPSTASH_REDIS_REST_TOKEN`. | +| `UPSTASH_REDIS_REST_TOKEN` | Upstash Redis database REST token; keep secret | Enables the public stats cache. Cached values expire after 12 hours; the API continues using MongoDB if Redis is unavailable. | | `WEB3FORMS_ACCESS_KEY` | Create an access key at Web3Forms | Required in production for contact-message delivery. | | `CONTACT_DAILY_LIMIT` | Set manually; default `25` | Maximum successfully delivered messages per UTC day. | | `CONTACT_USER_DAILY_LIMIT` | Set manually; default `1` | Maximum contact messages per account per UTC day. | diff --git a/backend/src/config/env.js b/backend/src/config/env.js index ee3880d..2a2694c 100644 --- a/backend/src/config/env.js +++ b/backend/src/config/env.js @@ -80,7 +80,17 @@ const schema = z.object({ RATE_LIMIT_ENABLED: bool.default(true), SUBMISSION_COOLDOWN_MS: z.coerce.number().int().positive().default(30_000), + UPSTASH_REDIS_REST_URL: z.string().url().optional(), + UPSTASH_REDIS_REST_TOKEN: z.string().min(1).optional(), }).superRefine((data, context) => { + if (Boolean(data.UPSTASH_REDIS_REST_URL) !== Boolean(data.UPSTASH_REDIS_REST_TOKEN)) { + context.addIssue({ + code: 'custom', + path: ['UPSTASH_REDIS_REST_URL'], + message: 'Set both UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN to enable the Redis cache.', + }) + } + if (data.NODE_ENV === 'production') { if (!data.BREVO_API_KEY) { context.addIssue({ code: 'custom', path: ['BREVO_API_KEY'], message: 'Required in production for email verification and password reset.' }) diff --git a/backend/src/controllers/publicStatsController.js b/backend/src/controllers/publicStatsController.js new file mode 100644 index 0000000..2dbe68b --- /dev/null +++ b/backend/src/controllers/publicStatsController.js @@ -0,0 +1,7 @@ +import { publicStatsService } from '../services/publicStatsService.js' +import { asyncHandler } from '../utils/asyncHandler.js' +import { ok } from '../utils/response.js' + +export const publicStatsController = { + get: asyncHandler(async (req, res) => ok(res, await publicStatsService.get())), +} diff --git a/backend/src/docs/openapi.js b/backend/src/docs/openapi.js index 78a7946..7304966 100644 --- a/backend/src/docs/openapi.js +++ b/backend/src/docs/openapi.js @@ -300,6 +300,23 @@ export const openapi = { }, }, }, + '/public/stats': { + get: { + tags: ['Public'], + summary: 'Get cached landing-page aggregate counts', + responses: { + 200: jsonResponse('Public stats', { + type: 'object', + required: ['contributors', 'publishedVideos', 'categories'], + properties: { + contributors: { type: 'integer', minimum: 0 }, + publishedVideos: { type: 'integer', minimum: 0 }, + categories: { type: 'integer', minimum: 0 }, + }, + }), + }, + }, + }, '/docs.json': { get: { tags: ['Health'], summary: 'Get the OpenAPI document', responses: { 200: { description: 'OpenAPI JSON document' } } }, }, diff --git a/backend/src/routes/index.js b/backend/src/routes/index.js index 400b63d..3c7ad92 100644 --- a/backend/src/routes/index.js +++ b/backend/src/routes/index.js @@ -8,6 +8,7 @@ import authRoutes from './authRoutes.js' import categoryRoutes from './categoryRoutes.js' import contactRoutes from './contactRoutes.js' import demoVideoRoutes from './demoVideoRoutes.js' +import publicStatsRoutes from './publicStatsRoutes.js' import submissionRoutes from './submissionRoutes.js' import userRoutes from './userRoutes.js' import videoRoutes from './videoRoutes.js' @@ -34,6 +35,7 @@ router.use('/demo-video', demoVideoRoutes) router.use('/videos', videoRoutes) router.use('/submissions', submissionRoutes) router.use('/contact', contactRoutes) +router.use('/public', publicStatsRoutes) router.use('/admin', adminRoutes) export default router diff --git a/backend/src/routes/publicStatsRoutes.js b/backend/src/routes/publicStatsRoutes.js new file mode 100644 index 0000000..1fcb17a --- /dev/null +++ b/backend/src/routes/publicStatsRoutes.js @@ -0,0 +1,8 @@ +import { Router } from 'express' +import { publicStatsController } from '../controllers/publicStatsController.js' + +const router = Router() + +router.get('/stats', publicStatsController.get) + +export default router diff --git a/backend/src/services/cache/upstashRedis.js b/backend/src/services/cache/upstashRedis.js new file mode 100644 index 0000000..adbc7f8 --- /dev/null +++ b/backend/src/services/cache/upstashRedis.js @@ -0,0 +1,39 @@ +import { env } from '../../config/env.js' + +const configured = Boolean(env.UPSTASH_REDIS_REST_URL && env.UPSTASH_REDIS_REST_TOKEN) + +async function command(...args) { + const response = await fetch(env.UPSTASH_REDIS_REST_URL, { + method: 'POST', + headers: { + Authorization: `Bearer ${env.UPSTASH_REDIS_REST_TOKEN}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(args), + signal: AbortSignal.timeout(2500), + }) + if (!response.ok) throw new Error(`Upstash Redis request failed (${response.status}).`) + const payload = await response.json() + if (payload.error) throw new Error(`Upstash Redis command failed: ${payload.error}`) + return payload.result +} + +export const upstashRedis = { + get enabled() { + return configured && !env.isTest + }, + + async get(key) { + if (!this.enabled) return null + const result = await command('GET', key) + if (result !== null && typeof result !== 'string') { + throw new Error('Upstash Redis returned an invalid cache value.') + } + return result + }, + + async set(key, value, ttlSeconds) { + if (!this.enabled) return + await command('SET', key, JSON.stringify(value), 'EX', ttlSeconds) + }, +} diff --git a/backend/src/services/publicStatsService.js b/backend/src/services/publicStatsService.js new file mode 100644 index 0000000..82aa42d --- /dev/null +++ b/backend/src/services/publicStatsService.js @@ -0,0 +1,51 @@ +import { ROLES, VIDEO_STATUS } from '../config/constants.js' +import { env } from '../config/env.js' +import { categoryRepo } from '../repositories/categoryRepo.js' +import { userRepo } from '../repositories/userRepo.js' +import { videoRepo } from '../repositories/videoRepo.js' +import { logger } from '../utils/logger.js' +import { upstashRedis } from './cache/upstashRedis.js' + +const CACHE_KEY = 'signpak:public-stats:v1' +const CACHE_TTL_SECONDS = 12 * 60 * 60 + +function isValidStats(value) { + return value + && Number.isInteger(value.contributors) && value.contributors >= 0 + && Number.isInteger(value.publishedVideos) && value.publishedVideos >= 0 + && Number.isInteger(value.categories) && value.categories >= 0 +} + +async function loadStats() { + const [contributors, publishedVideos, categories] = await Promise.all([ + userRepo.countByRole(ROLES.USER), + videoRepo.count({ status: VIDEO_STATUS.PUBLISHED, category: { $ne: null } }), + categoryRepo.count(), + ]) + return { contributors, publishedVideos, categories } +} + +export const publicStatsService = { + async get() { + if (!upstashRedis.enabled) return loadStats() + + try { + const cached = await upstashRedis.get(CACHE_KEY) + if (cached !== null) { + const stats = JSON.parse(cached) + if (isValidStats(stats)) return stats + logger.warn('Ignoring invalid cached public stats from Upstash Redis.') + } + } catch (error) { + logger.warn({ err: error }, 'Could not read public stats from Upstash Redis; querying the database.') + } + + const stats = await loadStats() + try { + await upstashRedis.set(CACHE_KEY, stats, CACHE_TTL_SECONDS) + } catch (error) { + logger.warn({ err: error }, 'Could not cache public stats in Upstash Redis.') + } + return stats + }, +} diff --git a/backend/tests/api-basics.test.js b/backend/tests/api-basics.test.js index 93d5854..bdd5a26 100644 --- a/backend/tests/api-basics.test.js +++ b/backend/tests/api-basics.test.js @@ -33,6 +33,19 @@ describe('basics', () => { assert.deepEqual(res.body.data.database, 'connected') }) + test('public landing stats return aggregate counts without authentication', async () => { + const client = new Client(base) + const response = await client.get('/public/stats') + assert.equal(response.status, 200) + assert.deepEqual(Object.keys(response.body.data).sort(), ['categories', 'contributors', 'publishedVideos']) + for (const value of Object.values(response.body.data)) { + assert.ok(Number.isInteger(value) && value >= 0) + } + assert.equal(response.body.data.categories, (await client.get('/categories')).body.data.length) + assert.equal(response.body.data.publishedVideos, (await client.get('/videos')).body.data.length) + assert.ok(response.body.data.contributors >= 2) + }) + test('unknown routes and bad JSON use the error shape', async () => { const c = new Client(base) const missing = await c.get('/nope') From dc18bc305c3101e0caaa755296e42c872cfed35c Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Mon, 12 Oct 2026 18:43:32 +0500 Subject: [PATCH 21/21] version update --- backend/package-lock.json | 4 +-- backend/package.json | 2 +- frontend/package-lock.json | 4 +-- frontend/package.json | 2 +- frontend/src/services/api.js | 49 +++++++++++++++++++++++++++++++++--- 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index a3810b4..a99420e 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -1,12 +1,12 @@ { "name": "backend", - "version": "1.0.0", + "version": "1.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "backend", - "version": "1.0.0", + "version": "1.0.1", "license": "MIT", "dependencies": { "@getbrevo/brevo": "^6.0.3", diff --git a/backend/package.json b/backend/package.json index af1fcfc..0b2ee17 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "backend", - "version": "1.0.0", + "version": "1.0.1", "description": "SignPakCommons API: Express, Node.js and MongoDB", "main": "server.js", "scripts": { diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 8bd8f84..f79c360 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "frontend", - "version": "1.0.2", + "version": "1.0.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "frontend", - "version": "1.0.2", + "version": "1.0.3", "dependencies": { "@tailwindcss/vite": "^4.3.3", "react": "^19.2.8", diff --git a/frontend/package.json b/frontend/package.json index bcd9466..5c318ed 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "frontend", "private": true, - "version": "1.0.2", + "version": "1.0.3", "type": "module", "engines": { "node": ">=20.19.0" diff --git a/frontend/src/services/api.js b/frontend/src/services/api.js index 77d323f..97cc11e 100644 --- a/frontend/src/services/api.js +++ b/frontend/src/services/api.js @@ -66,8 +66,45 @@ async function request(path, options = {}) { const json = (method, body) => ({ method, body: JSON.stringify(body) }) const normalizeList = (items) => (items || []).map(normalize) +const PUBLIC_STATS_CACHE_KEY = `${PREFIX}public-stats` +const PUBLIC_STATS_CACHE_TTL_MS = 30 * 60 * 1000 let publicStatsRequest +function isPublicStats(value) { + return value + && Number.isInteger(value.contributors) && value.contributors >= 0 + && Number.isInteger(value.publishedVideos) && value.publishedVideos >= 0 + && Number.isInteger(value.categories) && value.categories >= 0 +} + +function readCachedPublicStats() { + try { + const raw = window.localStorage.getItem(PUBLIC_STATS_CACHE_KEY) + if (!raw) return null + + const cached = JSON.parse(raw) + if (!isPublicStats(cached?.value) || !Number.isFinite(cached?.savedAt)) { + window.localStorage.removeItem(PUBLIC_STATS_CACHE_KEY) + return null + } + if (Date.now() - cached.savedAt >= PUBLIC_STATS_CACHE_TTL_MS) { + window.localStorage.removeItem(PUBLIC_STATS_CACHE_KEY) + return null + } + return cached.value + } catch { + return null + } +} + +function cachePublicStats(value) { + try { + window.localStorage.setItem(PUBLIC_STATS_CACHE_KEY, JSON.stringify({ value, savedAt: Date.now() })) + } catch { + // The stats request still succeeds when browser storage is unavailable or full. + } +} + const notifications = { async list(userId) { return readLocal('notifications', []).filter((item) => item.userId === userId).sort((a, b) => b.createdAt - a.createdAt) }, async create(userId, payload) { @@ -86,10 +123,16 @@ const notifications = { export const api = { public: { stats() { + const cached = readCachedPublicStats() + if (cached) return Promise.resolve(cached) if (!publicStatsRequest) { - publicStatsRequest = request(apiRoutes.public.stats()).finally(() => { - publicStatsRequest = null - }) + publicStatsRequest = request(apiRoutes.public.stats()) + .then((stats) => { + if (!isPublicStats(stats)) throw new Error('The server returned invalid community statistics.') + cachePublicStats(stats) + return stats + }) + .finally(() => { publicStatsRequest = null }) } return publicStatsRequest },