diff --git a/.changeset/beat-code-texture.md b/.changeset/beat-code-texture.md new file mode 100644 index 00000000..e9aa8b67 --- /dev/null +++ b/.changeset/beat-code-texture.md @@ -0,0 +1,6 @@ +--- +"@workspace/web": patch +"@workspace/og": patch +--- + +Add subtle BeatAPI code textures to the workspace and setup screens, and ensure their embedded font dependencies resolve after installation. diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 500b291a..267a7102 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -4,7 +4,7 @@ BeatGeo is maintained by BeatAPI and incorporates the MIT-licensed Elmo codebase Inherited statistics include share-of-voice and citation-stability calculations. The local metrics module reuses the same answer-level share-of-voice ratio. -[BeatBrowser](https://github.com/BeatAPI/BeatBrowser) is included as a pinned MIT dependency (`d116e0a3613b39455557eec1ec8a89f4e2b198bf`); its original license and notices remain in the package. Its Chrome extension is copied locally during setup, with no separate product account or database. +[BeatBrowser](https://github.com/BeatAPI/BeatBrowser) is included as a pinned MIT dependency (`d93e0bc38fd8047fbcdb2b307f668abbeae775a0`); its original license and notices remain in the package. Its Chrome extension is copied locally during setup, with no separate product account or database. Research references, not bundled complete products: diff --git a/apps/browser-lab/public/assets/code-texture.svg b/apps/browser-lab/public/assets/code-texture.svg new file mode 100644 index 00000000..26d36032 --- /dev/null +++ b/apps/browser-lab/public/assets/code-texture.svg @@ -0,0 +1,34 @@ + + + + +client = OpenAI( + base_url="https://api.beatapi.io/v1", + api_key=os.environ["BEATAPI_API_KEY"] +) + + +{ + "brand": "your website", + "questions": [], + "citations": [] +} + + +// original answers, visible sources +observe → compare → improve +// repeat the same questions + + +"mcpServers": { + "beatapi": { + "url": "https://beatapi.io/mcp" + } +} + + +const browser = createBrowser(); +await browser.profiles(); +// evidence from your browser + + diff --git a/apps/browser-lab/public/style.css b/apps/browser-lab/public/style.css index 86bddcd6..732a71c1 100644 --- a/apps/browser-lab/public/style.css +++ b/apps/browser-lab/public/style.css @@ -282,14 +282,14 @@ nav a.active { flex-direction: column; } #main { + position: relative; + isolation: isolate; margin-left: var(--sidebar); min-height: 100vh; } .education { padding: 24px; - background-color: #1d1c1b; - background-image: radial-gradient(#33312f 1px, transparent 1px); - background-size: 10px 10px; + background: transparent; } .education-card { border: 1px solid #3a3835; @@ -584,6 +584,7 @@ dialog textarea { background: var(--side); } table { + background: var(--bg); width: 100%; border-collapse: collapse; font-size: 13px; @@ -621,6 +622,7 @@ td { color: var(--muted); } .metrics { + background: var(--bg); display: grid; grid-template-columns: repeat(4, 1fr); border: 1px solid var(--line); @@ -829,3 +831,17 @@ td { animation: none !important; } } + +/* Same static code texture as the product dashboard, on the existing dark palette. */ +#main::before { + content: ""; + position: absolute; + inset: 0; + z-index: -1; + pointer-events: none; + background: url("/assets/code-texture.svg") top right / 1200px 960px no-repeat; + opacity: 0.25; +} +@media print { + #main::before { display: none; } +} diff --git a/apps/web/public/code-texture.svg b/apps/web/public/code-texture.svg new file mode 100644 index 00000000..26d36032 --- /dev/null +++ b/apps/web/public/code-texture.svg @@ -0,0 +1,34 @@ + + + + +client = OpenAI( + base_url="https://api.beatapi.io/v1", + api_key=os.environ["BEATAPI_API_KEY"] +) + + +{ + "brand": "your website", + "questions": [], + "citations": [] +} + + +// original answers, visible sources +observe → compare → improve +// repeat the same questions + + +"mcpServers": { + "beatapi": { + "url": "https://beatapi.io/mcp" + } +} + + +const browser = createBrowser(); +await browser.profiles(); +// evidence from your browser + + diff --git a/apps/web/src/components/app-shell.tsx b/apps/web/src/components/app-shell.tsx index 2d03bb03..412180c2 100644 --- a/apps/web/src/components/app-shell.tsx +++ b/apps/web/src/components/app-shell.tsx @@ -16,7 +16,7 @@ export function AppShell({ {/* `overflow-clip`, not `overflow-hidden`: both clip to the rounded corners, but `hidden` makes this a scroll container, which stops descendants from sticking to the viewport (the site header included). */} - + {header} {children} diff --git a/apps/web/src/components/auth/auth-split-layout.tsx b/apps/web/src/components/auth/auth-split-layout.tsx index 1179a050..f2d2b1b4 100644 --- a/apps/web/src/components/auth/auth-split-layout.tsx +++ b/apps/web/src/components/auth/auth-split-layout.tsx @@ -37,7 +37,7 @@ const BAND = "flex w-full flex-col lg:min-h-[39rem]"; export function AuthSplitLayout({ title, subtitle, children, pitch, footer }: AuthSplitLayoutProps) { return ( -
+
@@ -53,10 +53,6 @@ export function AuthSplitLayout({ title, subtitle, children, pitch, footer }: Au
diff --git a/apps/web/src/routes/_authed/setup.tsx b/apps/web/src/routes/_authed/setup.tsx index 194a52dc..801c0a44 100644 --- a/apps/web/src/routes/_authed/setup.tsx +++ b/apps/web/src/routes/_authed/setup.tsx @@ -51,7 +51,7 @@ function SetupPage() { }); return ( -
+
diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css index 05a5e3f5..17358ac5 100644 --- a/apps/web/src/styles.css +++ b/apps/web/src/styles.css @@ -180,3 +180,37 @@ color-adjust: exact !important; } } + +/* Brand texture is decorative; opaque data surfaces keep charts and text clear. */ +.beat-workspace { + position: relative; + isolation: isolate; +} +.beat-workspace::before { + content: ""; + position: absolute; + inset: 0; + z-index: -1; + pointer-events: none; + background: url("/code-texture.svg") top right / 1200px 960px no-repeat; + opacity: 0.2; +} +.dark .beat-workspace::before { + opacity: 0.24; +} +.beat-workspace [data-slot="table-container"] { + background: var(--background); +} +@media (max-width: 640px) { + .beat-workspace::before, + .dark .beat-workspace::before { + background-position: top right -150px; + background-size: 900px 720px; + opacity: 0.13; + } +} +@media print { + .beat-workspace::before { + display: none; + } +} diff --git a/package.json b/package.json index 46bd11fd..c0ecc045 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,6 @@ "typescript": "^7.0.2" }, "dependencies": { - "@beatapi/beat-browser": "github:BeatAPI/BeatBrowser#d116e0a3613b39455557eec1ec8a89f4e2b198bf" + "@beatapi/beat-browser": "github:BeatAPI/BeatBrowser#d93e0bc38fd8047fbcdb2b307f668abbeae775a0" } } diff --git a/packages/og/package.json b/packages/og/package.json index 67ecc01f..4fb8a474 100644 --- a/packages/og/package.json +++ b/packages/og/package.json @@ -15,6 +15,9 @@ "./virtual": "./src/virtual.d.ts" }, "dependencies": { + "@fontsource/geist-mono": "^5.3.0", + "@fontsource/geist-sans": "^5.3.0", + "@fontsource/titan-one": "^5.3.0", "@takumi-rs/core": "^2.14.0", "@takumi-rs/helpers": "^2.13.5", "@workspace/config": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1a3aa9d1..c0ac30fd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -182,8 +182,8 @@ importers: .: dependencies: '@beatapi/beat-browser': - specifier: github:BeatAPI/BeatBrowser#d116e0a3613b39455557eec1ec8a89f4e2b198bf - version: https://codeload.github.com/BeatAPI/BeatBrowser/tar.gz/d116e0a3613b39455557eec1ec8a89f4e2b198bf(supports-color@8.1.1)(zod@4.6.5) + specifier: github:BeatAPI/BeatBrowser#d93e0bc38fd8047fbcdb2b307f668abbeae775a0 + version: https://codeload.github.com/BeatAPI/BeatBrowser/tar.gz/d93e0bc38fd8047fbcdb2b307f668abbeae775a0(supports-color@8.1.1)(zod@4.6.5) devDependencies: '@biomejs/biome': specifier: 2.5.15 @@ -851,6 +851,15 @@ importers: packages/og: dependencies: + '@fontsource/geist-mono': + specifier: ^5.3.0 + version: 5.3.0 + '@fontsource/geist-sans': + specifier: ^5.3.0 + version: 5.3.0 + '@fontsource/titan-one': + specifier: ^5.3.0 + version: 5.3.0 '@takumi-rs/core': specifier: ^2.14.0 version: 2.14.0(csstype@3.2.3)(preact@10.29.8)(react@19.3.0) @@ -1450,8 +1459,8 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@beatapi/beat-browser@https://codeload.github.com/BeatAPI/BeatBrowser/tar.gz/d116e0a3613b39455557eec1ec8a89f4e2b198bf': - resolution: {gitHosted: true, integrity: sha512-6A+VQK6QVR6LxJSQWJW/4yuXGwpIetXa2e9B3tEg9ljPO38bvKVgMCDsNnCugcHIpJSjdb3s9lZCVSqpXTph3A==, tarball: https://codeload.github.com/BeatAPI/BeatBrowser/tar.gz/d116e0a3613b39455557eec1ec8a89f4e2b198bf} + '@beatapi/beat-browser@https://codeload.github.com/BeatAPI/BeatBrowser/tar.gz/d93e0bc38fd8047fbcdb2b307f668abbeae775a0': + resolution: {gitHosted: true, integrity: sha512-Fd6txDBAcSYbchPiXLeDn+1brifi/xr19L7m6VHqLaDBle3rc9EePyJpMLvnDWpu5vsV9II5Fp+1GlMscslDDQ==, tarball: https://codeload.github.com/BeatAPI/BeatBrowser/tar.gz/d93e0bc38fd8047fbcdb2b307f668abbeae775a0} version: 1.3.1 engines: {node: '>=20'} hasBin: true @@ -10872,7 +10881,7 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@beatapi/beat-browser@https://codeload.github.com/BeatAPI/BeatBrowser/tar.gz/d116e0a3613b39455557eec1ec8a89f4e2b198bf(supports-color@8.1.1)(zod@4.6.5)': + '@beatapi/beat-browser@https://codeload.github.com/BeatAPI/BeatBrowser/tar.gz/d93e0bc38fd8047fbcdb2b307f668abbeae775a0(supports-color@8.1.1)(zod@4.6.5)': dependencies: '@modelcontextprotocol/sdk': 1.32.1(supports-color@8.1.1)(zod@4.6.5) ws: 8.21.3