From c105cb0de0fd5f4794ff32e390658313a4b6b4c4 Mon Sep 17 00:00:00 2001 From: Burak Yigit Kaya Date: Fri, 3 Jul 2026 06:55:17 +0000 Subject: [PATCH 1/3] =?UTF-8?q?docs(site):=20use=20brand=20fonts=20?= =?UTF-8?q?=E2=80=94=20Dammit=20Sans=20headings,=20Rubik=20body?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per design (Steven Lewis): headings use the custom 'Dammit Sans' display font (self-hosted @font-face), body switches from Inter to Rubik. Code stays JetBrains Mono. - docs/public/fonts/dammit-sans-v0.3-bold.otf: self-hosted display face - cli.css: @font-face, --sl-font -> Rubik, --sl-font-headings -> Dammit Sans; apply headings font to .sl-markdown-content h1-h6, .page-title-wrapper h1, .hero h1 - astro.config.mjs: Google Fonts link Inter -> Rubik (JetBrains Mono kept) Dammit Sans is a display face with a limited glyph set, so headings fall back to Rubik for any missing glyphs (/ * \ | ^ _ `). Verified via astro build (39 pages): font ships to /fonts/, @font-face + heading var in built CSS, Rubik in the Google Fonts link. --- docs/astro.config.mjs | 2 +- docs/public/fonts/dammit-sans-v0.3-bold.otf | Bin 0 -> 8572 bytes docs/src/styles/cli.css | 24 ++++++++++++++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100755 docs/public/fonts/dammit-sans-v0.3-bold.otf diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index d6d9f4e4a..80610f325 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -196,7 +196,7 @@ export default defineConfig({ tag: "link", attrs: { rel: "stylesheet", - href: "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap", + href: "https://fonts.googleapis.com/css2?family=Rubik:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap", }, }, // Plausible analytics — defer keeps it off the critical path diff --git a/docs/public/fonts/dammit-sans-v0.3-bold.otf b/docs/public/fonts/dammit-sans-v0.3-bold.otf new file mode 100755 index 0000000000000000000000000000000000000000..44cf6cfecbb45ff884f3b5d350373616aff5ff2b GIT binary patch literal 8572 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 literal 0 HcmV?d00001 diff --git a/docs/src/styles/cli.css b/docs/src/styles/cli.css index 26794bf44..322a7d1b3 100644 --- a/docs/src/styles/cli.css +++ b/docs/src/styles/cli.css @@ -3,6 +3,24 @@ Base theme provided by @sentry/starlight-theme ========================================================================== */ +/* Brand fonts: Rubik (body) + Dammit Sans (headings) + JetBrains Mono (code). + Dammit Sans is a self-hosted display face with a limited glyph set, so + headings fall back to Rubik for any missing glyphs (e.g. / * \ | ^ _ `). */ +@font-face { + font-family: "Dammit Sans"; + src: url("/fonts/dammit-sans-v0.3-bold.otf") format("opentype"); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +/* Headings use the Dammit Sans display font; body/code are unaffected. */ +.sl-markdown-content :is(h1, h2, h3, h4, h5, h6):not(:where(.not-content *)), +.page-title-wrapper h1, +.hero h1 { + font-family: var(--sl-font-headings); +} + :root, :root[data-theme="dark"], :root[data-theme="light"] { @@ -10,8 +28,10 @@ /* Sentry brand purple (#7553FF), the mid-anchor of the CLI banner gradient */ --sl-color-accent-rgb: 117 83 255; - /* CLI uses Inter + JetBrains Mono */ - --sl-font: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + /* Rubik (body) + Dammit Sans (headings) + JetBrains Mono (code) */ + --sl-font: "Rubik", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + --sl-font-headings: "Dammit Sans", "Rubik", -apple-system, BlinkMacSystemFont, + "Segoe UI", sans-serif; --sl-font-mono: "JetBrains Mono", ui-monospace, monospace; /* Match the original CLI docs header sizing. */ From 28048bc0dfd36407d438c0df3f4d9db43ce380bd Mon Sep 17 00:00:00 2001 From: Burak Yigit Kaya Date: Fri, 3 Jul 2026 07:00:15 +0000 Subject: [PATCH 2/3] fix(docs): make Dammit Sans @font-face URL base-aware MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The @font-face used a root-absolute /fonts/... URL, which 404s on PR previews that serve under a base path (DOCS_BASE_PATH, e.g. /_preview/pr-N) — headings would fall back to Rubik there. Move the font into src/ and reference it with a relative URL so Vite bundles + hashes it and rewrites the URL respecting base. Verified: prod build -> /_astro/dammit-sans-*.otf; DOCS_BASE_PATH=/_preview/pr-1183 build -> /_preview/pr-1183/_astro/dammit-sans-*.otf. Addresses Cursor Bugbot. --- .../{public => src}/fonts/dammit-sans-v0.3-bold.otf | Bin docs/src/styles/cli.css | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) rename docs/{public => src}/fonts/dammit-sans-v0.3-bold.otf (100%) diff --git a/docs/public/fonts/dammit-sans-v0.3-bold.otf b/docs/src/fonts/dammit-sans-v0.3-bold.otf similarity index 100% rename from docs/public/fonts/dammit-sans-v0.3-bold.otf rename to docs/src/fonts/dammit-sans-v0.3-bold.otf diff --git a/docs/src/styles/cli.css b/docs/src/styles/cli.css index 322a7d1b3..768da899a 100644 --- a/docs/src/styles/cli.css +++ b/docs/src/styles/cli.css @@ -8,7 +8,9 @@ headings fall back to Rubik for any missing glyphs (e.g. / * \ | ^ _ `). */ @font-face { font-family: "Dammit Sans"; - src: url("/fonts/dammit-sans-v0.3-bold.otf") format("opentype"); + /* Relative URL so Vite bundles + hashes it and respects the site `base` + (root-absolute paths break under the PR-preview base, e.g. /_preview/pr-N). */ + src: url("../fonts/dammit-sans-v0.3-bold.otf") format("opentype"); font-weight: 700; font-style: normal; font-display: swap; From 91d6ea88437a10c3735241f262ecd79865650d62 Mon Sep 17 00:00:00 2001 From: Burak Yigit Kaya Date: Fri, 3 Jul 2026 07:11:44 +0000 Subject: [PATCH 3/3] docs(site): use theme's self-hosted Rubik instead of CDN (review L1/N1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @sentry/starlight-theme already self-hosts Rubik (as 'Rubik Variable') and sets it as the default --sl-font. Point --sl-font (and the headings fallback) at 'Rubik Variable' and drop Rubik from the Google Fonts link — body now uses the theme's self-hosted face with no redundant CDN dependency. JetBrains Mono (which the theme does not ship — it uses IBM Plex Mono) stays on Google Fonts. Also complete the missing-glyph note (# and ~) in the cli.css comment. --- docs/astro.config.mjs | 2 +- docs/src/styles/cli.css | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 80610f325..a4123a6ad 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -196,7 +196,7 @@ export default defineConfig({ tag: "link", attrs: { rel: "stylesheet", - href: "https://fonts.googleapis.com/css2?family=Rubik:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap", + href: "https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap", }, }, // Plausible analytics — defer keeps it off the critical path diff --git a/docs/src/styles/cli.css b/docs/src/styles/cli.css index 768da899a..ea247d8e2 100644 --- a/docs/src/styles/cli.css +++ b/docs/src/styles/cli.css @@ -3,9 +3,10 @@ Base theme provided by @sentry/starlight-theme ========================================================================== */ -/* Brand fonts: Rubik (body) + Dammit Sans (headings) + JetBrains Mono (code). - Dammit Sans is a self-hosted display face with a limited glyph set, so - headings fall back to Rubik for any missing glyphs (e.g. / * \ | ^ _ `). */ +/* Brand fonts: Dammit Sans (headings, self-hosted below) + Rubik (body, self- + hosted by @sentry/starlight-theme as "Rubik Variable") + JetBrains Mono + (code). Dammit Sans is a display face with a limited glyph set, so headings + fall back to Rubik for any missing glyph (e.g. # / * \ | ^ _ ` ~). */ @font-face { font-family: "Dammit Sans"; /* Relative URL so Vite bundles + hashes it and respects the site `base` @@ -30,10 +31,12 @@ /* Sentry brand purple (#7553FF), the mid-anchor of the CLI banner gradient */ --sl-color-accent-rgb: 117 83 255; - /* Rubik (body) + Dammit Sans (headings) + JetBrains Mono (code) */ - --sl-font: "Rubik", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; - --sl-font-headings: "Dammit Sans", "Rubik", -apple-system, BlinkMacSystemFont, - "Segoe UI", sans-serif; + /* Body uses the theme's self-hosted Rubik Variable; headings use Dammit Sans; + code stays JetBrains Mono. */ + --sl-font: "Rubik Variable", -apple-system, BlinkMacSystemFont, "Segoe UI", + sans-serif; + --sl-font-headings: "Dammit Sans", "Rubik Variable", -apple-system, + BlinkMacSystemFont, "Segoe UI", sans-serif; --sl-font-mono: "JetBrains Mono", ui-monospace, monospace; /* Match the original CLI docs header sizing. */