diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-04 20:24:36 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-04 20:24:36 +0300 |
| commit | 2eb016dbd7575c47c0c52a07831a6a3c097f1ee8 (patch) | |
| tree | fc9c254146fe10820fc2bb53bc29b976361ddc71 | |
| parent | 2f00f28b329110d10004c5152243707308cab95c (diff) | |
Add project logo, favicon, and display logo on login screen
- Add logo.svg at project root and reference it in README.md
- Generate favicon.ico from logo and place in web/
- Serve logo.svg and favicon.ico as static assets
- Display logo on the login page with responsive sizing
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | internal/api/server.go | 3 | ||||
| -rw-r--r-- | logo.svg | 60 | ||||
| -rw-r--r-- | web/css/login.css | 6 | ||||
| -rw-r--r-- | web/favicon.ico | bin | 0 -> 135230 bytes | |||
| -rw-r--r-- | web/login.html | 1 | ||||
| -rw-r--r-- | web/logo.svg | 60 |
7 files changed, 132 insertions, 0 deletions
@@ -1,6 +1,8 @@ player ====== + + Player is an opinionated KISS web media player. It is designed to be simple, lightweight, and easy to use and designed keyboard-first. It supports: * Videos diff --git a/internal/api/server.go b/internal/api/server.go index 23cb5eb..63cd060 100644 --- a/internal/api/server.go +++ b/internal/api/server.go @@ -150,6 +150,9 @@ func (s *Server) routesStatic() { staticHandler := http.FileServer(s.staticFS) s.mux.Handle("/css/", staticHandler) s.mux.Handle("/js/", staticHandler) + s.mux.Handle("/logo.svg", staticHandler) + s.mux.Handle("/favicon.ico", staticHandler) + s.mux.Handle("/favicon.svg", staticHandler) } // routesHTML wires the SPA HTML page routes. diff --git a/logo.svg b/logo.svg new file mode 100644 index 0000000..068b873 --- /dev/null +++ b/logo.svg @@ -0,0 +1,60 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="600" viewBox="0 0 1200 600" role="img" aria-labelledby="title desc"> + <title id="title">Player media software logo</title> + <desc id="desc">A rounded gradient app icon with a play triangle and landscape motif, followed by the word Player.</desc> + + <defs> + <linearGradient id="iconGradient" x1="0" y1="0" x2="1" y2="1"> + <stop offset="0%" stop-color="#0A7CFF"/> + <stop offset="48%" stop-color="#4B67FF"/> + <stop offset="100%" stop-color="#8D45F7"/> + </linearGradient> + + <linearGradient id="hillDark" x1="0" y1="0" x2="1" y2="1"> + <stop offset="0%" stop-color="#4A2AD9"/> + <stop offset="100%" stop-color="#6539E8"/> + </linearGradient> + + <linearGradient id="hillLight" x1="0" y1="0" x2="1" y2="1"> + <stop offset="0%" stop-color="#9D72FF"/> + <stop offset="100%" stop-color="#C091FF"/> + </linearGradient> + + <clipPath id="iconClip"> + <rect x="90" y="170" width="330" height="260" rx="58" ry="58"/> + </clipPath> + + <filter id="softShadow" x="-20%" y="-20%" width="140%" height="140%"> + <feDropShadow dx="0" dy="14" stdDeviation="18" flood-color="#132044" flood-opacity="0.10"/> + </filter> + </defs> + + <!-- Icon --> + <g filter="url(#softShadow)"> + <rect x="90" y="170" width="330" height="260" rx="58" ry="58" fill="url(#iconGradient)"/> + + <g clip-path="url(#iconClip)"> + <!-- Dark foreground hill --> + <path d="M70 420 C110 365 145 350 185 384 L315 500 L70 500 Z" fill="url(#hillDark)" opacity="0.92"/> + + <!-- Light background hill --> + <path d="M210 430 C255 382 292 360 340 398 L455 500 L210 500 Z" fill="url(#hillLight)" opacity="0.72"/> + + <!-- Gentle purple wash near bottom --> + <path d="M90 390 C175 350 260 388 420 340 L420 500 L90 500 Z" fill="#6E42EA" opacity="0.24"/> + </g> + + <!-- Play triangle --> + <path d="M200 236 L200 364 Q200 384 218 374 L318 311 Q337 300 318 289 L218 226 Q200 216 200 236 Z" fill="#FFFFFF"/> + + <!-- Photo sun/dot --> + <circle cx="365" cy="335" r="26" fill="#FFFFFF" opacity="0.98"/> + </g> + + <!-- Wordmark --> + <text x="480" y="352" + font-family="Inter, Avenir Next, Nunito Sans, Segoe UI, Helvetica, Arial, sans-serif" + font-size="148" + font-weight="800" + letter-spacing="-5" + fill="#071126">Player</text> +</svg> diff --git a/web/css/login.css b/web/css/login.css index a32ebd8..086e54c 100644 --- a/web/css/login.css +++ b/web/css/login.css @@ -25,3 +25,9 @@ padding: 1.25rem 1.25rem 1rem; } .login-form .btn { width: 100%; margin-top: 0.5rem; } + +.login-logo { + width: 4rem; + height: auto; + margin-bottom: 0.5rem; +} diff --git a/web/favicon.ico b/web/favicon.ico Binary files differnew file mode 100644 index 0000000..16f3950 --- /dev/null +++ b/web/favicon.ico diff --git a/web/login.html b/web/login.html index 970a004..66a7c9d 100644 --- a/web/login.html +++ b/web/login.html @@ -10,6 +10,7 @@ </head> <body> <div class="login-container" role="main"> + <img src="/logo.svg" alt="Player logo" class="login-logo"> <h1>Player</h1> <form id="login-form" class="login-form" novalidate> <label for="username">Username</label> diff --git a/web/logo.svg b/web/logo.svg new file mode 100644 index 0000000..068b873 --- /dev/null +++ b/web/logo.svg @@ -0,0 +1,60 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="600" viewBox="0 0 1200 600" role="img" aria-labelledby="title desc"> + <title id="title">Player media software logo</title> + <desc id="desc">A rounded gradient app icon with a play triangle and landscape motif, followed by the word Player.</desc> + + <defs> + <linearGradient id="iconGradient" x1="0" y1="0" x2="1" y2="1"> + <stop offset="0%" stop-color="#0A7CFF"/> + <stop offset="48%" stop-color="#4B67FF"/> + <stop offset="100%" stop-color="#8D45F7"/> + </linearGradient> + + <linearGradient id="hillDark" x1="0" y1="0" x2="1" y2="1"> + <stop offset="0%" stop-color="#4A2AD9"/> + <stop offset="100%" stop-color="#6539E8"/> + </linearGradient> + + <linearGradient id="hillLight" x1="0" y1="0" x2="1" y2="1"> + <stop offset="0%" stop-color="#9D72FF"/> + <stop offset="100%" stop-color="#C091FF"/> + </linearGradient> + + <clipPath id="iconClip"> + <rect x="90" y="170" width="330" height="260" rx="58" ry="58"/> + </clipPath> + + <filter id="softShadow" x="-20%" y="-20%" width="140%" height="140%"> + <feDropShadow dx="0" dy="14" stdDeviation="18" flood-color="#132044" flood-opacity="0.10"/> + </filter> + </defs> + + <!-- Icon --> + <g filter="url(#softShadow)"> + <rect x="90" y="170" width="330" height="260" rx="58" ry="58" fill="url(#iconGradient)"/> + + <g clip-path="url(#iconClip)"> + <!-- Dark foreground hill --> + <path d="M70 420 C110 365 145 350 185 384 L315 500 L70 500 Z" fill="url(#hillDark)" opacity="0.92"/> + + <!-- Light background hill --> + <path d="M210 430 C255 382 292 360 340 398 L455 500 L210 500 Z" fill="url(#hillLight)" opacity="0.72"/> + + <!-- Gentle purple wash near bottom --> + <path d="M90 390 C175 350 260 388 420 340 L420 500 L90 500 Z" fill="#6E42EA" opacity="0.24"/> + </g> + + <!-- Play triangle --> + <path d="M200 236 L200 364 Q200 384 218 374 L318 311 Q337 300 318 289 L218 226 Q200 216 200 236 Z" fill="#FFFFFF"/> + + <!-- Photo sun/dot --> + <circle cx="365" cy="335" r="26" fill="#FFFFFF" opacity="0.98"/> + </g> + + <!-- Wordmark --> + <text x="480" y="352" + font-family="Inter, Avenir Next, Nunito Sans, Segoe UI, Helvetica, Arial, sans-serif" + font-size="148" + font-weight="800" + letter-spacing="-5" + fill="#071126">Player</text> +</svg> |
