From 25f890c03fbd854af7159761a09ec0d430ceb68f Mon Sep 17 00:00:00 2001 From: Snow Lee Date: Sun, 19 Jul 2026 19:38:42 -0700 Subject: [PATCH] feat(brand): the Stack mark and Jersey 10 across app, auth, and docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the 🐻 emoji standing in for a logo everywhere. The mark is the letter B built from three rectangles — a rail and two blocks, the same shape as the product (a spine with volumes hanging off it). One fill, so `currentColor` themes it in the sidebar, the favicon, and flat ink. - Web app: in shell.tsx replaces the emoji-in-a-gradient-tile badge; the mark takes the honey and the wordmark takes text colour, so the accent lands once. #vault-name sets in Jersey 10 at 18px — the face is condensed, so that measures like 13px of the UI face. - Auth pages (authlocal.go): server-rendered, so they had their own emoji logo. Same mark, inline. - Docs: bear.svg becomes the mark (fixed honey fill — Starlight renders the logo as , which can't inherit currentColor), and .site-title sets in Jersey 10. Starlight tints that title with the accent by default, which put honey on white in light mode and failed contrast; it now takes --sl-color-white, matching the app. - Favicon: the mark, as a data URI. Jersey 10 is SIL OFL and self-hosted in both trees — Vite fingerprints the app's copy into static/assets/, the docs serve theirs from public/ — so no surface makes a third-party font request. Licence ships beside each file. It is deliberately not a design token: tw.css's @theme block is mirrored by the cloud landing's tokens.css and a drift check fails the build if they diverge, so the logo face lives in plain CSS. The cloud landing page carries the same mark and face (separate repo). Co-Authored-By: Claude Opus 4.8 (1M context) --- internal/webapp/authlocal.go | 9 +- internal/webapp/frontend/index.html | 2 +- .../frontend/src/assets/jersey-10-OFL.txt | 93 ++++++++++++++++++ .../frontend/src/assets/jersey-10.woff2 | Bin 0 -> 5160 bytes .../webapp/frontend/src/components/shell.tsx | 26 ++++- internal/webapp/frontend/src/style.css | 38 +++++-- .../webapp/static/assets/index-BXXJthEq.css | 1 - .../webapp/static/assets/index-CeGJW3sC.css | 1 + .../{index-BLg-iNnn.js => index-DrDCfi8U.js} | 16 +-- .../static/assets/jersey-10-COnnvJff.woff2 | Bin 0 -> 5160 bytes internal/webapp/static/index.html | 6 +- web/docs/public/fonts/OFL.txt | 93 ++++++++++++++++++ web/docs/public/fonts/jersey-10.woff2 | Bin 0 -> 5160 bytes web/docs/src/assets/bear.svg | 12 +-- web/docs/src/styles/custom.css | 38 +++++++ 15 files changed, 302 insertions(+), 33 deletions(-) create mode 100644 internal/webapp/frontend/src/assets/jersey-10-OFL.txt create mode 100644 internal/webapp/frontend/src/assets/jersey-10.woff2 delete mode 100644 internal/webapp/static/assets/index-BXXJthEq.css create mode 100644 internal/webapp/static/assets/index-CeGJW3sC.css rename internal/webapp/static/assets/{index-BLg-iNnn.js => index-DrDCfi8U.js} (87%) create mode 100644 internal/webapp/static/assets/jersey-10-COnnvJff.woff2 create mode 100644 web/docs/public/fonts/OFL.txt create mode 100644 web/docs/public/fonts/jersey-10.woff2 diff --git a/internal/webapp/authlocal.go b/internal/webapp/authlocal.go index bd44544..ccfddf4 100644 --- a/internal/webapp/authlocal.go +++ b/internal/webapp/authlocal.go @@ -580,9 +580,8 @@ background:#0a0b0d;color:#eef0f3;display:flex;justify-content:center;padding-top letter-spacing:-.006em;-webkit-font-smoothing:antialiased} .card{background:#0c0e10;border:1px solid rgba(255,255,255,.08);border-radius:14px;padding:28px 30px;width:344px; box-shadow:0 24px 70px -24px rgba(0,0,0,.7)} -.logo{width:34px;height:34px;border-radius:9px;display:grid;place-items:center;font-size:19px;line-height:1; -background:linear-gradient(160deg,#ffcf85,#f5a623 55%%,#d3861a); -box-shadow:0 1px 0 rgba(255,255,255,.35) inset,0 3px 10px -2px rgba(245,166,35,.45);margin-bottom:16px} +.logo{width:30px;height:30px;display:grid;place-items:center;color:#f5a623;margin-bottom:16px} +.logo svg{width:30px;height:30px;fill:currentColor} h1{font-size:18px;font-weight:640;letter-spacing:-.02em;margin:0 0 18px} label{display:block;font-size:12px;color:#9aa0a9;margin:14px 0 5px;font-weight:500} input{width:100%%;box-sizing:border-box;height:38px;padding:0 12px;border-radius:8px; @@ -600,7 +599,9 @@ button:focus-visible{outline:2px solid #ffcf85;outline-offset:2px} @media (max-width:900px){input{height:44px}button{height:44px}} code{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.08);padding:2px 6px;border-radius:5px; font-family:ui-monospace,Menlo,monospace} -

%s

%s
`, +

%s

%s
`, html.EscapeString(title), html.EscapeString(title), body) } diff --git a/internal/webapp/frontend/index.html b/internal/webapp/frontend/index.html index eab9b66..b16c0a0 100644 --- a/internal/webapp/frontend/index.html +++ b/internal/webapp/frontend/index.html @@ -4,7 +4,7 @@ BearDrive - +
diff --git a/internal/webapp/frontend/src/assets/jersey-10-OFL.txt b/internal/webapp/frontend/src/assets/jersey-10-OFL.txt new file mode 100644 index 0000000..f83e6da --- /dev/null +++ b/internal/webapp/frontend/src/assets/jersey-10-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2023 The Soft Type Project Authors (https://github.com/scfried/soft-type-jersey) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/internal/webapp/frontend/src/assets/jersey-10.woff2 b/internal/webapp/frontend/src/assets/jersey-10.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..08fc36d0423b3144e597e556e6195a915ea1dd84 GIT binary patch literal 5160 zcmV+@6xZu_Pew8T0RR9102C+y4gdfE08dN+029yv0RR9100000000000000000000 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 WBbv`tJcYtNX)6V@!9%d|dp8>M>&3_b literal 0 HcmV?d00001 diff --git a/internal/webapp/frontend/src/components/shell.tsx b/internal/webapp/frontend/src/components/shell.tsx index 7f343dd..fd8a765 100644 --- a/internal/webapp/frontend/src/components/shell.tsx +++ b/internal/webapp/frontend/src/components/shell.tsx @@ -81,6 +81,28 @@ export function Icon({ name }: { name: string }) { return C ?