AI agents: fetch the documentation index at llms.txt. Markdown versions are available by appending .md to any page URL, including this page's markdown.
Introduction
Review your branch in cmux or a browser.
DiffHub is a local diff viewer for cmux.
+diff --git a/.changeset/remove-glide-font.md b/.changeset/remove-glide-font.md new file mode 100644 index 0000000..29c7dec --- /dev/null +++ b/.changeset/remove-glide-font.md @@ -0,0 +1,5 @@ +--- +"diffhub": patch +--- + +Replace the bundled Glide/Glide Mono typeface with Inter, loaded via `next/font/google` instead of the removed local woff2 files. Required by a licence takedown demand from Lineto GmbH; no functional or visual-weight change beyond the typeface swap. diff --git a/AGENTS.md b/AGENTS.md index 69d8fdb..d4e05a2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -78,3 +78,14 @@ curl -s localhost:2099/api/files # JSON file list; /api/diff streams text/p ``` There is no `pnpm run doctor`, `pnpm run verify`, or feature map. Gap: nothing scripts the build, serve, and API or browser check above, so UI behaviour (scroll anchoring, comments, themes) is proven only by the unit tests and by hand; `apps/web` has a Playwright `test:instant` that CI does not run. + + + +# This is NOT the Turborepo you know + +Turborepo configuration, task behavior, and CLI commands can vary between installed versions and may differ from your training data. Resolve the `turbo` package from this file's directory or relevant workspace; in monorepos, it may not be visible from the repository root. For example, run `node -p "require.resolve('turbo/package.json')"` from a workspace that depends on `turbo`. + +Read `docs/README.md` inside that installed package first, then read the relevant pages from its `docs/` directory before changing Turborepo configuration or commands. Heed deprecation notices. These bundled docs match the installed package version and are available without network access. + +This block is written and re-added by `turbo` before repository-scoped commands when an AI agent is detected. In the Turborepo source repository, its template is defined in `crates/turborepo-cli/src/cli/agent_guidance.rs`. Removing the managed block while updates are enabled means a later qualifying invocation will add it again. Set `"agentGuidance": false` in the root `turbo.json` or `turbo.jsonc` to opt out; this does not remove an existing block. Keep the block committed with your work to avoid an uncommitted change on the next agent invocation. + diff --git a/apps/cli/app/fonts/glide-variable-italic.woff2 b/apps/cli/app/fonts/glide-variable-italic.woff2 deleted file mode 100644 index 67dabce..0000000 Binary files a/apps/cli/app/fonts/glide-variable-italic.woff2 and /dev/null differ diff --git a/apps/cli/app/fonts/glide-variable.woff2 b/apps/cli/app/fonts/glide-variable.woff2 deleted file mode 100644 index e0ad84f..0000000 Binary files a/apps/cli/app/fonts/glide-variable.woff2 and /dev/null differ diff --git a/apps/cli/app/globals.css b/apps/cli/app/globals.css index e18dd0a..c13a008 100644 --- a/apps/cli/app/globals.css +++ b/apps/cli/app/globals.css @@ -12,9 +12,9 @@ @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); - --font-sans: var(--font-glide), ui-sans-serif, system-ui, sans-serif; + --font-sans: var(--font-inter), ui-sans-serif, system-ui, sans-serif; --font-mono: var(--font-jetbrains-mono), ui-monospace, monospace; - --font-heading: var(--font-glide), ui-sans-serif, system-ui, sans-serif; + --font-heading: var(--font-inter), ui-sans-serif, system-ui, sans-serif; --color-sidebar-ring: var(--sidebar-ring); --color-sidebar-border: var(--sidebar-border); --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); diff --git a/apps/cli/app/layout.tsx b/apps/cli/app/layout.tsx index 97e72b0..add1b05 100644 --- a/apps/cli/app/layout.tsx +++ b/apps/cli/app/layout.tsx @@ -1,19 +1,14 @@ import { Agentation } from "agentation"; import type { Metadata } from "next"; -import { JetBrains_Mono } from "next/font/google"; -import localFont from "next/font/local"; +import { Inter, JetBrains_Mono } from "next/font/google"; import { DiffsWorkerProvider } from "@diffhub/diff-core/react"; import { ThemeProvider } from "@/components/theme-provider"; import "./globals.css"; -const glide = localFont({ +const inter = Inter({ display: "swap", - src: [ - { path: "./fonts/glide-variable.woff2", style: "normal" }, - { path: "./fonts/glide-variable-italic.woff2", style: "italic" }, - ], - variable: "--font-glide", - weight: "100 950", + subsets: ["latin"], + variable: "--font-inter", }); const jetbrainsMono = JetBrains_Mono({ @@ -35,7 +30,7 @@ export default function RootLayout({ return (
diff --git a/apps/web/app/fonts/glide-mono.woff2 b/apps/web/app/fonts/glide-mono.woff2 deleted file mode 100644 index 75ec13b..0000000 Binary files a/apps/web/app/fonts/glide-mono.woff2 and /dev/null differ diff --git a/apps/web/app/fonts/glide-variable.woff2 b/apps/web/app/fonts/glide-variable.woff2 deleted file mode 100644 index e0ad84f..0000000 Binary files a/apps/web/app/fonts/glide-variable.woff2 and /dev/null differ diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css index f445851..8a236c4 100644 --- a/apps/web/app/globals.css +++ b/apps/web/app/globals.css @@ -13,9 +13,9 @@ @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); - --font-sans: var(--font-glide), ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; + --font-sans: var(--font-inter), ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; --font-mono: - var(--font-glide-mono), ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, + var(--font-geist-mono), ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; --color-sidebar-ring: var(--sidebar-ring); --color-sidebar-border: var(--sidebar-border); @@ -59,7 +59,7 @@ --radius-2xl: calc(var(--radius) * 1.8); --radius-3xl: calc(var(--radius) * 2.2); --radius-4xl: calc(var(--radius) * 2.6); - --font-display: var(--font-glide); + --font-display: var(--font-inter); --shadow-card: var(--shadow-card); --shadow-card-hover: var(--shadow-card-hover); --shadow-inset: var(--shadow-inset); diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index ad2f882..8bd53c4 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -1,24 +1,20 @@ import type { Metadata, Viewport } from "next"; -import localFont from "next/font/local"; +import { Geist_Mono, Inter } from "next/font/google"; import { siteConfig } from "@/lib/config"; import "./globals.css"; -const glide = localFont({ +const inter = Inter({ display: "swap", - // No italic face: nothing on the site sets italic sans, and preloading it - // cost every page 117 KB. - src: [{ path: "./fonts/glide-variable.woff2", style: "normal" }], - variable: "--font-glide", - weight: "100 950", + subsets: ["latin"], + variable: "--font-inter", }); -const glideMono = localFont({ +const geistMono = Geist_Mono({ display: "swap", - src: "./fonts/glide-mono.woff2", - variable: "--font-glide-mono", - weight: "400", + subsets: ["latin"], + variable: "--font-geist-mono", }); export const viewport: Viewport = { @@ -98,7 +94,7 @@ export default function RootLayout({ }>) { return ( diff --git a/apps/web/app/og-image-shared.tsx b/apps/web/app/og-image-shared.tsx index 49e22be..b6d1db0 100644 --- a/apps/web/app/og-image-shared.tsx +++ b/apps/web/app/og-image-shared.tsx @@ -6,7 +6,7 @@ import { ImageResponse } from "next/og"; /** * Layout helper for this zone's social card. The zone owns the route, the - * brand colours, and the mark. This file only sets type in Glide and the + * brand colours, and the mark. This file only sets type in Inter and the * poster lockup (mark at the top, title on the baseline). * * It is not served by blode-co. `app/opengraph-image.tsx` in this repo is the @@ -33,10 +33,10 @@ export const OG_CONTENT_TYPE = "image/png"; const ogAsset = (file: string) => path.join(process.cwd(), "lib/og-assets", file); -const glideFonts = [ +const interFonts = [ { - data: readFileSync(ogAsset("glide-600.ttf")), - name: "Glide", + data: readFileSync(ogAsset("inter-600.ttf")), + name: "Inter", style: "normal" as const, weight: 600 as const, }, @@ -80,7 +80,7 @@ export const renderZoneOgImage = ({ style={{ color, display: "flex", - fontFamily: "Glide", + fontFamily: "Inter", fontSize: titleSize, fontWeight: 600, letterSpacing: "-0.02em", @@ -94,5 +94,5 @@ export const renderZoneOgImage = ({ ); - return new ImageResponse(content, { ...OG_SIZE, fonts: glideFonts }); + return new ImageResponse(content, { ...OG_SIZE, fonts: interFonts }); }; diff --git a/apps/web/components/marketing/review-demo-hunk.ts b/apps/web/components/marketing/review-demo-hunk.ts index b5ea799..c57d438 100644 --- a/apps/web/components/marketing/review-demo-hunk.ts +++ b/apps/web/components/marketing/review-demo-hunk.ts @@ -21,8 +21,8 @@ export interface DiffLine { // Verbatim from `git show afe7d53 -- apps/cli/lib/export-comments.ts`, split // into the tokens Shiki produces with packages/diff-core/src/themes/linear-dark.json, // the theme the viewer itself renders with. Set in the system monospace stack, -// not Glide Mono, because Glide Mono's backtick has zero advance width and eats -// the space beside it. +// not the site's `--font-mono` (Geist Mono), to keep this static demo decoupled +// from font loading. const PINK = "#fa9ce3"; const PURPLE = "#cc9dff"; const BLUE = "#8fa7ff"; diff --git a/apps/web/lib/conversion-events.test.ts b/apps/web/lib/conversion-events.test.ts index 86c705e..a6b8d26 100644 --- a/apps/web/lib/conversion-events.test.ts +++ b/apps/web/lib/conversion-events.test.ts @@ -90,10 +90,12 @@ test("a product slug stays on location and does not invent $pathname", () => { }); test("zip and dmg hrefs use download_clicked", () => { - expect(isDownloadHref("https://blode.co/glide/glide.zip")).toBe(true); + expect(isDownloadHref("https://blode.co/cascade/cascade.zip")).toBe(true); expect(isDownloadHref("https://blode.co/convene/Convene.dmg")).toBe(true); expect(isDownloadHref("https://blode.co/commandment/app.dmg?x=1")).toBe(true); - expect(conversionEventForHref("https://blode.co/glide/glide.zip")).toBe(DOWNLOAD_CLICKED_EVENT); + expect(conversionEventForHref("https://blode.co/cascade/cascade.zip")).toBe( + DOWNLOAD_CLICKED_EVENT, + ); expect(isDownloadHref("https://blode.co/diffhub")).toBe(false); expect(isDownloadHref("https://github.com/mblode/diffhub")).toBe(false); expect(isDownloadHref("npx diffhub@latest cmux")).toBe(false); diff --git a/apps/web/lib/conversion-events.ts b/apps/web/lib/conversion-events.ts index bd8add6..228a0e8 100644 --- a/apps/web/lib/conversion-events.ts +++ b/apps/web/lib/conversion-events.ts @@ -29,7 +29,7 @@ export interface ConversionClick { const DOWNLOAD_HREF = /\.(?:zip|dmg)(?:[?#]|$)/iu; /** - * Binary downloads (Glide zip, Convene/Commandment dmg) use `download_clicked`. + * Binary downloads (Cascade zip, Convene/Commandment dmg) use `download_clicked`. * Install, GitHub, sign-in, and create flows stay on `cta_clicked`. */ export const isDownloadHref = (href: string): boolean => DOWNLOAD_HREF.test(href); diff --git a/apps/web/lib/docs-proxy.fixture.html b/apps/web/lib/docs-proxy.fixture.html index d0245d4..85c1991 100644 --- a/apps/web/lib/docs-proxy.fixture.html +++ b/apps/web/lib/docs-proxy.fixture.html @@ -1,4 +1,4 @@ -