Skip to content

Commit b9b0bb3

Browse files
ajitpratap0Ajit Pratap Singhclaude
authored
perf(website): self-host fonts + lazy AnalyzeTab for mobile 90+ (#385)
* perf(website): self-host fonts + lazy-load AnalyzeTab for mobile 90+ - Replace Google Fonts external requests with self-hosted @fontsource packages (eliminates ~1s latency on Slow 4G) - Remove Google Fonts preconnect/preload links and CSP allowances from BaseLayout - Lazy-load AnalyzeTab via React.lazy() in both HeroPlayground and Playground (reduces initial JS by ~124KB) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ci: add OFL-1.1 to allowed licenses for fontsource packages SIL Open Font License 1.1 is the standard license for open-source fonts (IBM Plex Mono, Instrument Sans, JetBrains Mono). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Ajit Pratap Singh <ajitpratapsingh@Ajits-Mac-mini-2655.local> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 78070af commit b9b0bb3

File tree

7 files changed

+55
-12
lines changed

7 files changed

+55
-12
lines changed

.github/workflows/security.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ jobs:
168168
# to handle golang.org/x packages which report as compound license
169169
allow-licenses: >-
170170
MIT, Apache-2.0, BSD-2-Clause, BSD-3-Clause, ISC,
171-
BlueOak-1.0.0,
171+
BlueOak-1.0.0, OFL-1.1,
172172
LicenseRef-scancode-google-patent-license-golang,
173173
BSD-3-Clause AND LicenseRef-scancode-google-patent-license-golang
174174

website/package-lock.json

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

website/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
"@codemirror/state": "^6.6.0",
2323
"@codemirror/theme-one-dark": "^6.1.3",
2424
"@codemirror/view": "^6.40.0",
25+
"@fontsource/ibm-plex-mono": "^5.2.7",
26+
"@fontsource/instrument-sans": "^5.2.8",
27+
"@fontsource/jetbrains-mono": "^5.2.8",
2528
"@tailwindcss/typography": "^0.5.19",
2629
"astro": "^5.18.1",
2730
"codemirror": "^6.0.2",

website/src/components/HeroPlayground.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { useState, useEffect, useCallback, useRef } from "react";
1+
import React, { useState, useEffect, useCallback, useRef, Suspense } from "react";
22
import { useWasm } from "./WasmLoader";
33
import SqlEditor from "./SqlEditor";
44
import AstTab from "./playground/AstTab";
55
import FormatTab from "./playground/FormatTab";
66
import LintTab from "./playground/LintTab";
7-
import AnalyzeTab from "./playground/AnalyzeTab";
7+
const AnalyzeTab = React.lazy(() => import("./playground/AnalyzeTab"));
88

99
const HERO_SQL = `SELECT u.name, COUNT(o.id) AS orders
1010
FROM users u
@@ -196,7 +196,9 @@ function InteractiveHero() {
196196
{activeTab === "format" && <FormatTab data={results.format} />}
197197
{activeTab === "lint" && <LintTab data={results.lint} />}
198198
{activeTab === "analyze" && (
199-
<AnalyzeTab data={results.analyze} />
199+
<Suspense fallback={<div className="p-4 text-slate-400">Loading...</div>}>
200+
<AnalyzeTab data={results.analyze} />
201+
</Suspense>
200202
)}
201203
</div>
202204
</div>

website/src/components/Playground.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { useState, useEffect, useCallback, useRef } from "react";
1+
import React, { useState, useEffect, useCallback, useRef, Suspense } from "react";
22
import { useWasm } from "./WasmLoader";
33
import SqlEditor from "./SqlEditor";
44
import AstTab from "./playground/AstTab";
55
import FormatTab from "./playground/FormatTab";
66
import LintTab from "./playground/LintTab";
7-
import AnalyzeTab from "./playground/AnalyzeTab";
7+
const AnalyzeTab = React.lazy(() => import("./playground/AnalyzeTab"));
88

99
const DEFAULT_SQL = `SELECT u.id, u.name, COUNT(o.id) AS order_count
1010
FROM users u
@@ -218,7 +218,11 @@ export default function Playground() {
218218
{activeTab === "ast" && <AstTab data={results.ast} />}
219219
{activeTab === "format" && <FormatTab data={results.format} />}
220220
{activeTab === "lint" && <LintTab data={results.lint} />}
221-
{activeTab === "analyze" && <AnalyzeTab data={results.analyze} />}
221+
{activeTab === "analyze" && (
222+
<Suspense fallback={<div className="p-4 text-slate-400">Loading...</div>}>
223+
<AnalyzeTab data={results.analyze} />
224+
</Suspense>
225+
)}
222226
</div>
223227
</div>
224228
</div>

website/src/layouts/BaseLayout.astro

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,8 @@ const canonicalURL = new URL(Astro.url.pathname, Astro.site);
3535
<link rel="alternate" hreflang="x-default" href={canonicalURL}>
3636
<link rel="icon" type="image/png" href="/images/logo.png" />
3737
<link rel="preconnect" href="https://gosqlx.dev" crossorigin>
38-
<link rel="preconnect" href="https://fonts.googleapis.com">
39-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
40-
<link rel="preload" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@500;700&family=Instrument+Sans:wght@400;600;700&family=JetBrains+Mono:wght@400&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'">
41-
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@500;700&family=Instrument+Sans:wght@400;600;700&family=JetBrains+Mono:wght@400&display=swap"></noscript>
4238
<link rel="preconnect" href="https://img.shields.io" crossorigin>
43-
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src https://fonts.gstatic.com; img-src 'self' https://img.shields.io https://goreportcard.com https://*.shields.io data:; connect-src 'self'">
39+
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; font-src 'self'; img-src 'self' https://img.shields.io https://goreportcard.com https://*.shields.io data:; connect-src 'self'">
4440
<title>{title}</title>
4541
<script type="application/ld+json" set:html={JSON.stringify({
4642
"@context": "https://schema.org",

website/src/styles/global.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
/* Self-hosted fonts */
2+
@import '@fontsource/instrument-sans/400.css';
3+
@import '@fontsource/instrument-sans/600.css';
4+
@import '@fontsource/instrument-sans/700.css';
5+
@import '@fontsource/ibm-plex-mono/500.css';
6+
@import '@fontsource/ibm-plex-mono/700.css';
7+
@import '@fontsource/jetbrains-mono/400.css';
8+
19
@tailwind base;
210
@tailwind components;
311
@tailwind utilities;

0 commit comments

Comments
 (0)