feat(brand): the Stack mark and Jersey 10 across app, auth, and docs

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: <Mark> 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 <img>, 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) <noreply@anthropic.com>
This commit is contained in:
Snow Lee
2026-07-19 19:38:42 -07:00
co-authored by Claude Opus 4.8
parent b10c6f961e
commit 25f890c03f
15 changed files with 302 additions and 33 deletions
+5 -4
View File
@@ -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}
</style></head><body><div class="card"><div class="logo">🐻</div><h1>%s</h1>%s</div></body></html>`,
</style></head><body><div class="card"><div class="logo"><svg viewBox="0 0 32 32" role="img" aria-label="BearDrive">` +
`<rect x="4" y="4" width="5.6" height="24"/><rect x="11.2" y="4" width="14.4" height="11.2"/>` +
`<rect x="11.2" y="16.8" width="16.8" height="11.2"/></svg></div><h1>%s</h1>%s</div></body></html>`,
html.EscapeString(title), html.EscapeString(title), body)
}
+1 -1
View File
@@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>BearDrive</title>
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>&#128059;</text></svg>">
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' fill='%23f5a623'><rect x='4' y='4' width='5.6' height='24'/><rect x='11.2' y='4' width='14.4' height='11.2'/><rect x='11.2' y='16.8' width='16.8' height='11.2'/></svg>">
</head>
<body>
<div id="root"></div>
@@ -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.
Binary file not shown.
@@ -81,6 +81,28 @@ export function Icon({ name }: { name: string }) {
return C ? <C className="ico" aria-hidden="true" /> : null;
}
/* The BearDrive mark: a rail and two blocks — the letter B built from
rectangles only, and the same shape as the product (a spine with volumes
hanging off it). One fill, so `currentColor` themes it everywhere: the
sidebar, the favicon, flat ink. Kept identical to the landing page's
Mark.astro; if one changes, change both. */
export function Mark({ size = 22 }: { size?: number }) {
return (
<svg
width={size}
height={size}
viewBox="0 0 32 32"
fill="currentColor"
role="img"
aria-label="BearDrive"
>
<rect x="4" y="4" width="5.6" height="24" />
<rect x="11.2" y="4" width="14.4" height="11.2" />
<rect x="11.2" y="16.8" width="16.8" height="11.2" />
</svg>
);
}
/* The column system, in one place. `#content` owns scrolling and the page
gutter; `<Page>` owns width and centering — nothing else may set either.
Three widths cover every view: `read` for rendered files only (markdown
@@ -152,8 +174,8 @@ export function VaultHeader(props: {
const { name, onHome, showSignout, search } = props;
return (
<header id="vault">
<span id="vault-badge" aria-hidden="true">
🐻
<span id="vault-badge">
<Mark size={22} />
</span>
<span
id="vault-name"
+32 -6
View File
@@ -38,6 +38,26 @@
--hero-top: clamp(32px, 8vh, 88px); /* one vertical start for short centered states */
}
/* Jersey 10 — the logo face, and only the logo (a pixel face is a logo, not a
UI font). Self-hosted: Vite fingerprints it into static/assets/ alongside
the bundle, so the binary stays self-contained and no request leaves the
hub. SIL OFL; licence sits beside the file in src/assets/.
Deliberately NOT a token: tw.css's @theme is mirrored by the cloud landing's
tokens.css and a drift check fails the build if they diverge. */
@font-face {
font-family: "Jersey 10";
font-style: normal;
font-weight: 400;
font-display: swap;
src: url("./assets/jersey-10.woff2") format("woff2");
}
/* Same optical size for whichever face wins the load race. */
@font-face {
font-family: "Logo Fallback";
src: local("Helvetica Neue"), local("Arial"), local("Segoe UI"), local("Roboto");
size-adjust: 73%;
}
* { box-sizing: border-box; }
[hidden] { display: none !important; }
html, body { height: 100%; margin: 0; }
@@ -79,13 +99,19 @@ button, input, a.btn { font-family: inherit; }
paints over their borders instead of sliding behind them. */
position: relative; z-index: 45;
}
#vault-badge {
width: 22px; height: 22px; border-radius: 6px; flex: none;
display: grid; place-items: center; font-size: 13px; line-height: 1;
background: linear-gradient(160deg, #ffcf85, #f5a623 55%, #d3861a);
box-shadow: 0 1px 0 rgba(255,255,255,.35) inset, 0 2px 6px -1px rgba(245,166,35,.4);
/* Brand lockup: the mark in honey, the name in text colour, so the accent
lands once. Same mark and same face as the landing page and the docs — the
three surfaces are one identity. */
#vault-badge { flex: none; display: grid; place-items: center; color: var(--accent); }
#vault-name {
font-family: "Jersey 10", "Logo Fallback", var(--ui);
/* Jersey 10 is a condensed pixel face with a single weight: 18px here sets
to the same optical size as 13px of the UI face, and synthetic bold would
fill the gaps between pixels. */
font-size: 18px; font-weight: 400; font-synthesis: none;
letter-spacing: .01em; line-height: 1;
flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
#vault-name { font-weight: 600; font-size: 13px; letter-spacing: -.01em; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.vault-actions { display: flex; align-items: center; gap: 4px; }
#vault #signout, .icon-btn2 {
width: 28px; height: 28px; border-radius: 6px;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+3 -3
View File
@@ -4,9 +4,9 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>BearDrive</title>
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>&#128059;</text></svg>">
<script type="module" crossorigin src="/assets/index-BLg-iNnn.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-BXXJthEq.css">
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' fill='%23f5a623'><rect x='4' y='4' width='5.6' height='24'/><rect x='11.2' y='4' width='14.4' height='11.2'/><rect x='11.2' y='16.8' width='16.8' height='11.2'/></svg>">
<script type="module" crossorigin src="/assets/index-DrDCfi8U.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-CeGJW3sC.css">
</head>
<body>
<div id="root"></div>
+93
View File
@@ -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.
Binary file not shown.
+4 -8
View File
@@ -1,9 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none" role="img" aria-label="BearDrive">
<circle cx="8" cy="8.5" r="4.5" fill="currentColor" opacity=".55"/>
<circle cx="24" cy="8.5" r="4.5" fill="currentColor" opacity=".55"/>
<circle cx="16" cy="18" r="11" fill="currentColor"/>
<circle cx="11.5" cy="15.5" r="1.6" fill="#0a0b0d"/>
<circle cx="20.5" cy="15.5" r="1.6" fill="#0a0b0d"/>
<ellipse cx="16" cy="21.5" rx="3.6" ry="2.8" fill="#0a0b0d" opacity=".22"/>
<ellipse cx="16" cy="20.4" rx="1.7" ry="1.25" fill="#0a0b0d"/>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="#f5a623" role="img" aria-label="BearDrive">
<rect x="4" y="4" width="5.6" height="24"/>
<rect x="11.2" y="4" width="14.4" height="11.2"/>
<rect x="11.2" y="16.8" width="16.8" height="11.2"/>
</svg>

Before

Width:  |  Height:  |  Size: 563 B

After

Width:  |  Height:  |  Size: 270 B

+38
View File
@@ -59,3 +59,41 @@
.sl-markdown-content .language-console .line > span:first-child {
color: var(--sl-color-gray-3);
}
/* ---- brand lockup ----
Jersey 10 is the logo face across all three surfaces (app sidebar, cloud
landing nav, here), and it is the ONLY thing it sets a pixel face is a
logo, not a UI font. Self-hosted so the docs make no third-party font
request; SIL OFL, licence beside the file in public/fonts/. */
@font-face {
font-family: "Jersey 10";
font-style: normal;
font-weight: 400;
font-display: swap;
src: url("/fonts/jersey-10.woff2") format("woff2");
}
/* Same optical size for whichever face wins the load race: Jersey 10 is
condensed, so 22px of it measures like ~16px of the UI face. */
@font-face {
font-family: "Logo Fallback";
src: local("Helvetica Neue"), local("Arial"), local("Segoe UI"), local("Roboto");
size-adjust: 73%;
}
.site-title {
font-family: "Jersey 10", "Logo Fallback", var(--sl-font);
font-size: 22px;
font-weight: 400;
font-synthesis: none;
letter-spacing: 0.01em;
/* The mark carries the honey; the name stays text colour, matching the app
sidebar and the landing nav. Starlight's default would tint the title
with the accent, which also fails contrast as honey-on-white. */
color: var(--sl-color-white);
}
/* The mark ships as an <img>, so it can't inherit currentColor it carries
the honey fill itself. Size it to sit with the wordmark's cap height. */
.site-title img {
width: 22px;
height: 22px;
}