From 7d8fcce2e1b9ec6db00dc2144742cb7f9ee07324 Mon Sep 17 00:00:00 2001 From: suphicakir Date: Fri, 16 Oct 2026 02:36:56 +0300 Subject: [PATCH] feat: add OG images, favicon set, manifest and performance tuning - Build-time Open Graph cards per post and a default card (Satori + Sharp) - Favicon/ICO/apple-touch/manifest icons generated from one SVG (npm run icons) - robots.txt and web manifest generated from site.json - Subset self-hosted fonts to Latin + Turkish (188 KB -> 66 KB) with preload - Inline the stylesheet to remove the render-blocking request - Post-build site audit (npm run check:site): h1, alt, SEO tags, links - Omit canonical on noindex pages Co-Authored-By: Claude Opus 5.5 --- PROJECT_MEMORY.md | 19 +- astro.config.mjs | 2 + package-lock.json | 344 ++++++++++++++++++++++++++++- package.json | 14 +- public/apple-touch-icon.png | Bin 0 -> 4121 bytes public/favicon.ico | Bin 655 -> 2758 bytes public/favicon.svg | 10 +- public/fonts/inter-latin-ext.woff2 | Bin 0 -> 2768 bytes public/fonts/inter-latin.woff2 | Bin 0 -> 28244 bytes public/fonts/rubik-latin-ext.woff2 | Bin 0 -> 3208 bytes public/fonts/rubik-latin.woff2 | Bin 0 -> 32344 bytes public/icon-192.png | Bin 0 -> 4724 bytes public/icon-512.png | Bin 0 -> 17680 bytes public/icon-maskable-512.png | Bin 0 -> 14929 bytes scripts/check-site.mjs | 75 +++++++ scripts/generate-icons.mjs | 76 +++++++ scripts/subset-fonts.mjs | 82 +++++++ src/components/Seo.astro | 31 ++- src/layouts/BaseLayout.astro | 6 +- src/lib/og.ts | 164 ++++++++++++++ src/pages/blog/[slug].astro | 16 +- src/pages/iletisim.astro | 7 +- src/pages/og-default.png.ts | 9 + src/pages/og/[slug].png.ts | 17 ++ src/pages/robots.txt.ts | 15 ++ src/pages/site.webmanifest.ts | 22 ++ src/styles/fonts.css | 43 ++++ src/styles/global.css | 3 +- 28 files changed, 914 insertions(+), 41 deletions(-) create mode 100644 public/apple-touch-icon.png create mode 100644 public/fonts/inter-latin-ext.woff2 create mode 100644 public/fonts/inter-latin.woff2 create mode 100644 public/fonts/rubik-latin-ext.woff2 create mode 100644 public/fonts/rubik-latin.woff2 create mode 100644 public/icon-192.png create mode 100644 public/icon-512.png create mode 100644 public/icon-maskable-512.png create mode 100644 scripts/check-site.mjs create mode 100644 scripts/generate-icons.mjs create mode 100644 scripts/subset-fonts.mjs create mode 100644 src/lib/og.ts create mode 100644 src/pages/og-default.png.ts create mode 100644 src/pages/og/[slug].png.ts create mode 100644 src/pages/robots.txt.ts create mode 100644 src/pages/site.webmanifest.ts create mode 100644 src/styles/fonts.css diff --git a/PROJECT_MEMORY.md b/PROJECT_MEMORY.md index 58c2189..05e3c6c 100644 --- a/PROJECT_MEMORY.md +++ b/PROJECT_MEMORY.md @@ -1,13 +1,13 @@ # PROJECT_MEMORY — ta1sph.info > Claude'un bu proje için kalıcı hafızası. Her görev sonunda güncellenir. Kısa ve güncel tutulur. -> Son güncelleme: 2026-10-16 · Güncelleyen: Claude (Siteyi Kur — Aşama 6) +> Son güncelleme: 2026-10-16 · Güncelleyen: Claude (Siteyi Kur — Aşama 7) ## 1. Durum -- **Aşama:** 6 tamamlandı (Hakkımda, İletişim, yasal, 404). Sıradaki: **Aşama 7 — Kalite**. -- **Tamamlanan:** Aşama 0–6. Stil önizleme yalnızca dev'de: `http://localhost:4321/styleguide/`. -- **Açık işler:** Aşama 7–8. Favicon + `og-default.png` yok (A7); kapaksız yazılarda og:image yok. 3 örnek yazı (`örnek` etiketli) kullanıcı isteyince silinecek. Hakkımda'ya tanıtım paragrafı kullanıcı metin verirse eklenecek (`about.json` → `lead`/yeni alan). +- **Aşama:** 7 tamamlandı (kalite). Sıradaki: **Aşama 8 — Deploy hazırlığı**. +- **Tamamlanan:** Aşama 0–7. Stil önizleme yalnızca dev'de: `http://localhost:4321/styleguide/`. Lighthouse (mobil, 3 koşu ortancası, yerel): A11y/BP/SEO 100 her sayfada; Perf temiz koşullarda 98–100, LCP ~1,4–1,9 sn. Yayında PageSpeed Insights ile doğrulanmalı. +- **Açık işler:** Aşama 8. Node sunucusu yanıtları sıkıştırmıyor → A8'de Traefik `compress` middleware veya eşdeğeri şart. 3 örnek yazı (`örnek` etiketli) kullanıcı isteyince silinecek. Hakkımda tanıtım paragrafı kullanıcı metin verirse. - **Bilinen sorunlar:** Arama (Pagefind) `astro dev`'de çalışmaz, yalnızca build sonrası. Kullanıcının elle başlattığı dev sunucusu yeni koleksiyonu görmüyorsa yeniden başlatılmalı. `npm audit`: 2 orta seviye (postcss-selector-parser 6.0.10, @tailwindcss/typography sabitliyor) — yalnızca build zamanı, düzeltme typography'yi eski sürüme düşürdüğü için uygulanmadı. ## 2. Ortam @@ -43,6 +43,11 @@ - `src/pages/hakkimda.astro` (ProfilePage JSON-LD) · `src/pages/iletisim.astro` (Leaflet + OSM, görünür olunca dinamik import; `divIcon` içinde `.tower-pin`) · `src/pages/[legal].astro` + `src/content/legal/{gizlilik,lisans,sorumluluk-reddi}.md` (koleksiyon `legal`, frontmatter `updated`) · `src/pages/404.astro` - `src/components/PageHeader.astro` (khaki başlık + tek h1; blog listesi de kullanır) · `src/components/CodeCopy.astro` (Markdown'ı sarar, kod bloklarına Kopyala düğmesi) - `LICENSE` (MIT) · `LICENSE-CONTENT` (CC BY-SA 4.0, resmî legalcode.txt'den) +- `src/lib/og.ts` — Satori + Sharp ile 1200×630 OG PNG (khaki, grid çizgileri, kule ikonu); latin-ext fontlar ayrı aile adıyla yedek (`RubikExt`, `InterExt`) · `src/pages/og/[slug].png.ts` (yazı başına) · `src/pages/og-default.png.ts` (diğer sayfalar). `Seo` varsayılanı `/og-default.png`; kapaklı yazıda kapak 1200px JPEG +- `src/pages/site.webmanifest.ts`, `src/pages/robots.txt.ts` (`/api/` kapalı, sitemap satırı) — `site.json`'dan +- `public/fonts/*.woff2` + `src/styles/fonts.css` — **üretilir:** `npm run fonts` (`scripts/subset-fonts.mjs`, subset-font; Latin+Türkçe+sembol, wght Rubik 400–900 / Inter 400–700; 188 KB → 66 KB). Kaynak `@fontsource-variable/*` (devDeps). BaseLayout iki latin dosyasını preload eder +- `public/favicon.{svg,ico}`, `apple-touch-icon.png`, `icon-192/512.png`, `icon-maskable-512.png` — **üretilir:** `npm run icons` (`scripts/generate-icons.mjs`; kırmızı zemin + siyah kule, 16px için kalın varyant) +- `scripts/check-site.mjs` — `npm run check:site` (build sonrası): tek h1, alt, title/description/canonical, tekrar eden id, iç link + anchor - `src/dev/Styleguide.astro` — `astro.config.mjs`'deki `devRoutes` entegrasyonu ile sadece `astro dev`'de `/styleguide/` (`_` önekli sayfalar Astro'da rota olmaz) - `src/lib/slug.ts` — Türkçe karakter dönüştürücü `slugify` - `scripts/new-post.mjs` — `npm run new:post -- "Başlık"` → `src/content/blog//index.md` (draft: true); `slug.ts`'yi Node type-stripping ile import eder @@ -63,6 +68,11 @@ | 2026-10-15 | Kanonik alan: apex `ta1sph.info`, www → 301 | SEO tekilleştirme | | 2026-10-15 | Fontlar self-host (Fontsource: Rubik + Inter) | Performans + gizlilik | | 2026-10-16 | Ek token'lar: `accent-fill`/`on-accent-fill`, `accent-text` (khaki'de fg'ye döner) | Ölçüm: ink/red 4.46, red-strong/khaki 3.85 → küçük metin AA'yı geçmiyordu. Kırmızı zeminli butonlar ≥19px bold | +| 2026-10-16 | Yazı başına OG görseli build'de (Satori) — kullanıcı kararı bana bıraktı | Paylaşımlarda başlıklı kart; harici servis yok | +| 2026-10-16 | Favicon = kırmızı kare + siyah anten kulesi (Tabler) | "TA1" 16px'te okunmuyor; vurgu rengi + İletişim ikonuyla tutarlı | +| 2026-10-16 | Fontlar alt kümelenip `public/fonts`'tan; `build.inlineStylesheets: 'always'` | LCP'yi geciktiren render-blocking CSS + 190 KB font; ölçümde FCP 2,3 → ~1 sn | +| 2026-10-16 | Leaflet CSS iletisim.astro'da statik import | `inlineStylesheets: 'always'` dinamik CSS importunu 404'e düşürüyordu | +| 2026-10-16 | noindex sayfalarda canonical yok (404) | 404'ün `/404/` canonical'ı var olmayan URL'yi gösteriyordu | | 2026-10-16 | Yasal metinler Markdown koleksiyonu (`src/content/legal`), tek dinamik rota | Uzun metin için prose; yeni yasal sayfa = yeni .md | | 2026-10-16 | Leaflet işaretçisinde döndürme iç elemanda (`.tower-pin`) | CSS `rotate` özelliği Leaflet'in `translate3d`'sinden önce uygulanıp konumu kaydırıyordu | | 2026-10-16 | Karanlık harita = karolara CSS `invert` filtresi | İkinci karo sağlayıcısı / API anahtarı gerekmez | @@ -90,6 +100,7 @@ ## 6. Değişiklik Günlüğü (en yeni üstte) +- 2026-10-16 | Siteyi Kur A7 | OG görselleri (yazı başına + varsayılan), favicon seti + manifest, robots.txt, font alt kümeleme + preload, CSS inline, site denetim script'i, Lighthouse | `src/lib/og.ts`, `src/pages/{og,og-default.png,robots.txt,site.webmanifest}*`, `scripts/{generate-icons,subset-fonts,check-site}.mjs`, `public/`, `src/styles/fonts.css`, `Seo.astro`, `BaseLayout.astro`, `astro.config.mjs` - 2026-10-16 | Siteyi Kur A6 | Hakkımda, İletişim (Leaflet harita, gizlenmiş e-posta), Gizlilik/Lisans/Sorumluluk Reddi, 404, LICENSE dosyaları; PageHeader + CodeCopy ortak bileşenleri; axe temiz | `src/pages/{hakkimda,iletisim,[legal],404}.astro`, `src/content/legal/`, `src/data/{about,contact,pages}.json`, `src/components/{PageHeader,CodeCopy,Card}.astro`, `LICENSE*`, `global.css` - 2026-10-16 | Siteyi Kur A5 | Görüntülenme sayacı (node:sqlite, anonim, 24 sa tekil, bot filtresi), top API, sidebar öne çıkanlar API + yedek; uçtan uca test | `src/lib/views.ts`, `src/pages/api/views/`, `src/components/blog/Sidebar.astro`, `src/pages/blog/[slug].astro`, `src/lib/posts.ts` - 2026-10-16 | Siteyi Kur A4 | Blog: koleksiyon, liste/kategori/etiket arşivleri + sayfalama, detay (paylaş, TOC, DIY, kod kopyala, lisans satırı), sidebar (Pagefind arama), RSS, ana sayfa son yazılar, 3 örnek yazı; axe temiz | `src/content*`, `src/pages/blog/`, `src/pages/rss.xml.ts`, `src/components/blog/`, `src/lib/{posts,dates,markdown-plugins}`, `src/data/{blog,categories}.json`, `astro.config.mjs`, `global.css` diff --git a/astro.config.mjs b/astro.config.mjs index c8c116e..4d9736d 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -30,6 +30,8 @@ export default defineConfig({ // Static by default; only routes with `export const prerender = false` (view counter API) run on the server. output: 'static', adapter: node({ mode: 'standalone' }), + // One small stylesheet: inlining it removes a render-blocking request on every page. + build: { inlineStylesheets: 'always' }, integrations: [mdx(), sitemap(), icon({ include: { tabler: ['*'] } }), devRoutes], markdown: { processor: satteri({ hastPlugins: [figurePlugin, externalLinksPlugin] }), diff --git a/package-lock.json b/package-lock.json index c59628d..f24911c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,8 +13,6 @@ "@astrojs/node": "^11.1.8", "@astrojs/rss": "^4.0.19", "@astrojs/sitemap": "^3.7.4", - "@fontsource-variable/inter": "^5.3.0", - "@fontsource-variable/rubik": "^5.3.0", "@iconify-json/tabler": "^1.2.42", "@tailwindcss/vite": "^4.3.3", "astro": "^7.4.0", @@ -24,12 +22,19 @@ }, "devDependencies": { "@astrojs/check": "^0.9.10", + "@fontsource-variable/inter": "^5.3.0", + "@fontsource-variable/rubik": "^5.3.0", + "@fontsource/inter": "^5.3.0", + "@fontsource/rubik": "^5.3.0", "@tailwindcss/typography": "^0.5.20", "@types/leaflet": "^1.9.22", "pagefind": "^1.5.2", "prettier": "^3.9.10", "prettier-plugin-astro": "^1.1.1", "prettier-plugin-tailwindcss": "^0.8.1", + "satori": "^0.60.0", + "sharp": "^0.35.5", + "subset-font": "^2.9.0", "typescript": "^6.0.3" }, "engines": { @@ -862,6 +867,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.3.0.tgz", "integrity": "sha512-OupL48va4JNofb97w6NYeF9S7W/kHNKM0Er8Dem5nqi4jeOLrVJDoE8tZEpnMJmtkvNbB1EIPPwHcdkF6b1oUA==", + "dev": true, "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" @@ -871,6 +877,27 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/@fontsource-variable/rubik/-/rubik-5.3.0.tgz", "integrity": "sha512-yQUf8qle24MJYA+EuauyF+cqjjN6I715nGjitt3sGmwZA0XfA4fWJcLq1C/diREZl4Qzn1E80nLMc0ipC/a4Lg==", + "dev": true, + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/inter": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.3.0.tgz", + "integrity": "sha512-RofMylZmjlJEfELXeNHFWBRcSs75rGU/6bV2S2jfnvv/3rPXPGe0LgUJTklcHZ9lM4OZmAVFhcJPnACfb91A3g==", + "dev": true, + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/rubik": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource/rubik/-/rubik-5.3.0.tgz", + "integrity": "sha512-Nks2mn7vlE1jZVHuVgoKU2Ejqjvd+GJzLRdraCjo1xc79oo7O6vJ8pcvSfmKPGX3/Ln7nt09XWFzPeu2jWf0xQ==", + "dev": true, "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" @@ -921,8 +948,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "devOptional": true, "license": "MIT", - "optional": true, "engines": { "node": ">=18" } @@ -2028,6 +2055,30 @@ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "license": "MIT" }, + "node_modules/@shuding/opentype.js": { + "version": "1.4.0-beta.0", + "resolved": "https://registry.npmjs.org/@shuding/opentype.js/-/opentype.js-1.4.0-beta.0.tgz", + "integrity": "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fflate": "^0.7.3", + "string.prototype.codepointat": "^0.2.1" + }, + "bin": { + "ot": "bin/ot" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@shuding/opentype.js/node_modules/fflate": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.5.tgz", + "integrity": "sha512-QieYf//cis6ywHNi5qW1+PXPQ4bC+XVJAtS4AXIML8P76GroEiOxm/oQtn1f02UkJY1+KsXMJcC+R2v/Eg4G3g==", + "dev": true, + "license": "MIT" + }, "node_modules/@tailwindcss/node": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", @@ -2907,6 +2958,13 @@ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "license": "MIT" }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/aria-query": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", @@ -3032,12 +3090,32 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -3140,6 +3218,13 @@ "node": ">=6" } }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -3196,6 +3281,40 @@ "uncrypto": "^0.1.3" } }, + "node_modules/css-background-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/css-background-parser/-/css-background-parser-0.1.0.tgz", + "integrity": "sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-box-shadow": { + "version": "1.0.0-3", + "resolved": "https://registry.npmjs.org/css-box-shadow/-/css-box-shadow-1.0.0-3.tgz", + "integrity": "sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-gradient-parser": { + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/css-gradient-parser/-/css-gradient-parser-0.0.17.tgz", + "integrity": "sha512-w2Xy9UMMwlKtou0vlRnXvWglPAceXCTtcmVSo8ZBUvqCV5aXEFP/PC6d+I464810I9FT++UACwTD5511bmGPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/css-select": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", @@ -3212,6 +3331,18 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/css-tree": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", @@ -3464,6 +3595,16 @@ "dev": true, "license": "MIT" }, + "node_modules/emoji-regex-xs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-2.0.1.tgz", + "integrity": "sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -3687,6 +3828,17 @@ "node": ">=20" } }, + "node_modules/fontverter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fontverter/-/fontverter-2.0.0.tgz", + "integrity": "sha512-DFVX5hvXuhi1Jven1tbpebYTCT9XYnvx6/Z+HFUPb7ZRMCW+pj2clU9VMhoTPgWKPhAs7JJDSk3CW1jNUvKCZQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "wawoff2": "^2.0.0", + "woff2sfnt-sfnt2woff": "^1.0.0" + } + }, "node_modules/fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", @@ -3777,6 +3929,13 @@ "uncrypto": "^0.1.3" } }, + "node_modules/harfbuzzjs": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/harfbuzzjs/-/harfbuzzjs-0.10.0.tgz", + "integrity": "sha512-SN8LVwCOzvTq3OPNd0+EAghgXugItz56wst567D1vs7LnnKGWprhi3EG58aVOBwhN8HEbQxL4I9NDWkcXUutRw==", + "dev": true, + "license": "MIT" + }, "node_modules/hast-util-to-html": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", @@ -3813,6 +3972,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hex-rgb": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-4.3.0.tgz", + "integrity": "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/html-escaper": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", @@ -4218,6 +4390,17 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/linebreak": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", + "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "0.0.8", + "unicode-trie": "^2.0.0" + } + }, "node_modules/lru-cache": { "version": "11.5.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", @@ -4613,6 +4796,24 @@ "@pagefind/windows-x64": "1.5.2" } }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-css-color": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/parse-css-color/-/parse-css-color-0.2.1.tgz", + "integrity": "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.1.4", + "hex-rgb": "^4.1.0" + } + }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -4707,6 +4908,13 @@ "node": ">=4" } }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, "node_modules/prettier": { "version": "3.9.10", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.10.tgz", @@ -5215,6 +5423,37 @@ "sass-formatter": "dist/cli.js" } }, + "node_modules/satori": { + "version": "0.60.0", + "resolved": "https://registry.npmjs.org/satori/-/satori-0.60.0.tgz", + "integrity": "sha512-OSnpxSr166mj2M9i6Cm3kFWYG6i36FnYDfQU0SR8nsZe5zgp/PskLkyfNAqV8phdGkDfQdFHyJZvrtdss3HAVw==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@shuding/opentype.js": "1.4.0-beta.0", + "css-background-parser": "^0.1.0", + "css-box-shadow": "1.0.0-3", + "css-gradient-parser": "^0.0.17", + "css-to-react-native": "^3.0.0", + "emoji-regex-xs": "^2.0.1", + "escape-html": "^1.0.3", + "fflate": "0.7.3", + "harfbuzzjs": "0.10.0", + "linebreak": "^1.1.0", + "parse-css-color": "^0.2.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/satori/node_modules/fflate": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.3.tgz", + "integrity": "sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==", + "dev": true, + "license": "MIT" + }, "node_modules/satteri": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.10.5.tgz", @@ -5302,8 +5541,8 @@ "version": "0.35.5", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.5.tgz", "integrity": "sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==", + "devOptional": true, "license": "Apache-2.0", - "optional": true, "dependencies": { "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", @@ -5455,6 +5694,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/string.prototype.codepointat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==", + "dev": true, + "license": "MIT" + }, "node_modules/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", @@ -5500,6 +5746,54 @@ "anynum": "^1.0.1" } }, + "node_modules/subset-font": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/subset-font/-/subset-font-2.9.0.tgz", + "integrity": "sha512-WJulQeFwbewrXIGcLJbSZFWI44fHW8gNRuPzLywfDL8w38IPRbN1JFxwG76aoohw9kcFdvjVIn2QmID1iy119A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "fontverter": "^2.0.0", + "harfbuzzjs": "^1.6.1", + "p-limit": "^3.1.0" + } + }, + "node_modules/subset-font/node_modules/harfbuzzjs": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/harfbuzzjs/-/harfbuzzjs-1.6.3.tgz", + "integrity": "sha512-R5Mfo1UUvQmZJmtScP7fBLKYKnYu82ZdtFT7WbQYeGb3Ut5PR3xfFCJ5/FjbcW5SAfb9cqCSny/KNjp+NJBx0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/subset-font/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/subset-font/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/suf-log": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz", @@ -5700,6 +5994,17 @@ "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", "license": "MIT" }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", @@ -6321,6 +6626,37 @@ "dev": true, "license": "MIT" }, + "node_modules/wawoff2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wawoff2/-/wawoff2-2.0.1.tgz", + "integrity": "sha512-r0CEmvpH63r4T15ebFqeOjGqU4+EgTx4I510NtK35EMciSdcTxCw3Byy3JnBonz7iyIFZ0AbVo0bbFpEVuhCYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "woff2_compress.js": "bin/woff2_compress.js", + "woff2_decompress.js": "bin/woff2_decompress.js" + } + }, + "node_modules/woff2sfnt-sfnt2woff": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/woff2sfnt-sfnt2woff/-/woff2sfnt-sfnt2woff-1.0.0.tgz", + "integrity": "sha512-edK4COc1c1EpRfMqCZO1xJOvdUtM5dbVb9iz97rScvnTevqEB3GllnLWCmMVp1MfQBdF1DFg/11I0rSyAdS4qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "^1.0.7" + } + }, + "node_modules/woff2sfnt-sfnt2woff/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, "node_modules/wrap-ansi": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", diff --git a/package.json b/package.json index 0eaf59a..a3abbf6 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,10 @@ "format": "prettier --write .", "format:check": "prettier --check .", "new:post": "node scripts/new-post.mjs", - "astro": "astro" + "astro": "astro", + "icons": "node scripts/generate-icons.mjs", + "check:site": "node scripts/check-site.mjs", + "fonts": "node scripts/subset-fonts.mjs" }, "dependencies": { "@astrojs/markdown-satteri": "^0.4.4", @@ -21,8 +24,6 @@ "@astrojs/node": "^11.1.8", "@astrojs/rss": "^4.0.19", "@astrojs/sitemap": "^3.7.4", - "@fontsource-variable/inter": "^5.3.0", - "@fontsource-variable/rubik": "^5.3.0", "@iconify-json/tabler": "^1.2.42", "@tailwindcss/vite": "^4.3.3", "astro": "^7.4.0", @@ -32,12 +33,19 @@ }, "devDependencies": { "@astrojs/check": "^0.9.10", + "@fontsource-variable/inter": "^5.3.0", + "@fontsource-variable/rubik": "^5.3.0", + "@fontsource/inter": "^5.3.0", + "@fontsource/rubik": "^5.3.0", "@tailwindcss/typography": "^0.5.20", "@types/leaflet": "^1.9.22", "pagefind": "^1.5.2", "prettier": "^3.9.10", "prettier-plugin-astro": "^1.1.1", "prettier-plugin-tailwindcss": "^0.8.1", + "satori": "^0.60.0", + "sharp": "^0.35.5", + "subset-font": "^2.9.0", "typescript": "^6.0.3" } } diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..69d7594ac08258cef230268aa14f126f1eb7d542 GIT binary patch literal 4121 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 nMtQc5&zAf@EtaijO*-%=H^|T_67kW1o?J literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico index 7f48a94d16071d6c8d06478c7458ab12e675019c..a63098aaa443cb591695aef042d6c7c1c45d91c9 100644 GIT binary patch literal 2758 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 literal 655 zcmV;A0&x9_P)Rl-XF(A`bsas&GH{e7U1}Ri zJr5jR8B2*Jd6$=$AqgTM2o2FV$WZ9|#jJ3mmpEs{jB0ps@*Kxv}=RB|IJih8Z&fqwCG`%bN0000#bW%=J zQ=IH#a_&L{B{_6Lu_3m>0bMN%+@aOmN_3G~H^8EGi>+bXO=;-|Z`uFnf==AdP z{Oj-S=ltmI=<4`LcLE*&009F@L_t(|+I`d4ZUZ3@1<*Uo7H^LoCw6-8z4wsbd;b4l zA}zMFtOw2mLX6O5Mgl}(5P=uOM4%=tnuHiuAp%(G<c=npm$Fz%eL - - - + \ No newline at end of file diff --git a/public/fonts/inter-latin-ext.woff2 b/public/fonts/inter-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a2079f27ac69e4f6f57e8cbf42d993e5968c911b GIT binary patch literal 2768 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 literal 0 HcmV?d00001 diff --git a/public/fonts/rubik-latin.woff2 b/public/fonts/rubik-latin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0813bb50f1d3248ee6c83f86803e40cdb312d243 GIT binary patch literal 32344 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 literal 0 HcmV?d00001 diff --git a/public/icon-192.png b/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..7b20c0977bdf07df678ba5b2f441b0f31134252a GIT binary patch literal 4724 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 z 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

brOF!W>krS0sT0UMp5 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 + readdirSync(dir).flatMap((f) => { + const p = join(dir, f); + return statSync(p).isDirectory() ? walk(p) : [p]; + }); + +const pages = walk(ROOT).filter((f) => f.endsWith('.html') && !f.includes('/pagefind/')); +const idsByPage = new Map(); +const problems = []; +const report = (page, msg) => problems.push(`${page}: ${msg}`); + +const urlOf = (file) => + '/' + + relative(ROOT, file) + .replace(/index\.html$/, '') + .replace(/\.html$/, ''); +const html = new Map(pages.map((f) => [urlOf(f), readFileSync(f, 'utf8')])); + +for (const [url, src] of html) { + const ids = [...src.matchAll(/\sid="([^"]+)"/g)].map((m) => m[1]); + idsByPage.set(url, new Set(ids)); + const dupes = ids.filter((id, i) => ids.indexOf(id) !== i); + if (dupes.length) report(url, `duplicate id(s): ${[...new Set(dupes)].join(', ')}`); + + const h1 = (src.match(/]/g) ?? []).length; + if (h1 !== 1) report(url, `${h1}

elements`); + if (!/]+lang="/.test(src)) report(url, 'missing '); + if (!/[^<]+<\/title>/.test(src)) report(url, 'missing <title>'); + if (url !== '/404' && !/<meta name="description" content="[^"]+"/.test(src)) + report(url, 'missing meta description'); + if (url !== '/404' && !/<link rel="canonical" href="https:\/\/ta1sph\.info\//.test(src)) + report(url, 'missing canonical'); + for (const img of src.match(/<img\b[^>]*>/g) ?? []) { + if (!/\salt="/.test(img)) report(url, `img without alt: ${img.slice(0, 80)}`); + } +} + +for (const [url, src] of html) { + const refs = [...src.matchAll(/\s(?:href|src)="([^"]+)"/g)].map((m) => m[1]); + for (const ref of refs) { + if (/^(https?:|mailto:|tel:|data:|javascript:)/.test(ref) || ref.startsWith('//')) { + if (!ref.startsWith('https://ta1sph.info')) continue; + } + const target = new URL(ref.replaceAll('&', '&'), `https://ta1sph.info${url}`); + if (target.host !== 'ta1sph.info') continue; + const path = decodeURIComponent(target.pathname); + if (SERVER_ROUTES.some((r) => r.test(path))) continue; + const file = path.endsWith('/') + ? join(ROOT, path, 'index.html') + : ([join(ROOT, path), join(ROOT, `${path}.html`)].find(existsSync) ?? join(ROOT, path)); + if (!existsSync(file)) { + report(url, `broken link → ${path}`); + continue; + } + if (target.hash && idsByPage.has(path)) { + const id = decodeURIComponent(target.hash.slice(1)); + if (!idsByPage.get(path).has(id)) report(url, `missing anchor → ${path}${target.hash}`); + } + } +} + +console.log(`Checked ${html.size} pages.`); +if (problems.length) { + console.error(problems.map((p) => ` ✗ ${p}`).join('\n')); + process.exit(1); +} +console.log(' ✓ no problems found'); diff --git a/scripts/generate-icons.mjs b/scripts/generate-icons.mjs new file mode 100644 index 0000000..3cd4c26 --- /dev/null +++ b/scripts/generate-icons.mjs @@ -0,0 +1,76 @@ +// Regenerates the favicon set in public/ from the Tabler antenna-tower icon. +// Usage: npm run icons +import { writeFileSync } from 'node:fs'; +import { createRequire } from 'node:module'; +import sharp from 'sharp'; + +const require = createRequire(import.meta.url); +const { icons } = require('@iconify-json/tabler/icons.json'); + +const RED = '#c95748'; +const INK = '#111012'; +const tower = (stroke) => + icons['building-broadcast-tower'].body + .replaceAll('currentColor', INK) + .replaceAll('stroke-width="2"', `stroke-width="${stroke}"`); + +/** + * Square icon: red background, ink tower. + * `pad` = icon inset (0..1), `radius` in viewBox units, `stroke` = Tabler stroke width. + */ +const svg = ({ pad = 0.14, radius = 6, stroke = 2.4 } = {}) => { + const size = 32; + const inner = size * (1 - pad * 2); + const offset = size * pad; + const scale = inner / 24; + return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${size} ${size}"><rect width="${size}" height="${size}" rx="${radius}" fill="${RED}"/><g transform="translate(${offset} ${offset}) scale(${scale})">${tower(stroke)}</g></svg>`; +}; + +const png = (source, px) => + sharp(Buffer.from(source), { density: 72 * (px / 32) * 4 }) + .resize(px, px) + .png() + .toBuffer(); + +/** ICO container with embedded PNG images. */ +function ico(images) { + const header = Buffer.alloc(6 + images.length * 16); + header.writeUInt16LE(0, 0); + header.writeUInt16LE(1, 2); + header.writeUInt16LE(images.length, 4); + let offset = header.length; + images.forEach(({ size, data }, i) => { + const e = 6 + i * 16; + header.writeUInt8(size >= 256 ? 0 : size, e); + header.writeUInt8(size >= 256 ? 0 : size, e + 1); + header.writeUInt16LE(1, e + 4); // colour planes + header.writeUInt16LE(32, e + 6); // bits per pixel + header.writeUInt32LE(data.length, e + 8); + header.writeUInt32LE(offset, e + 12); + offset += data.length; + }); + return Buffer.concat([header, ...images.map((i) => i.data)]); +} + +const rounded = svg(); +const tiny = svg({ pad: 0.06, radius: 4, stroke: 3.2 }); // 16 px tab icon: bigger, bolder +const square = svg({ radius: 0 }); // platforms apply their own mask +const maskable = svg({ pad: 0.24, radius: 0 }); // keep the icon inside the 80% safe zone + +writeFileSync('public/favicon.svg', rounded); +writeFileSync( + 'public/favicon.ico', + ico( + await Promise.all( + [16, 32, 48].map(async (size) => ({ + size, + data: await png(size === 16 ? tiny : rounded, size), + })), + ), + ), +); +writeFileSync('public/apple-touch-icon.png', await png(svg({ pad: 0.18, radius: 0 }), 180)); +writeFileSync('public/icon-192.png', await png(square, 192)); +writeFileSync('public/icon-512.png', await png(square, 512)); +writeFileSync('public/icon-maskable-512.png', await png(maskable, 512)); +console.log('Icons written to public/'); diff --git a/scripts/subset-fonts.mjs b/scripts/subset-fonts.mjs new file mode 100644 index 0000000..ef5a0df --- /dev/null +++ b/scripts/subset-fonts.mjs @@ -0,0 +1,82 @@ +// Builds small self-hosted variable fonts (Latin + Turkish + symbols used in posts) into public/fonts/. +// Sources: @fontsource-variable/{rubik,inter} (SIL OFL 1.1). Usage: npm run fonts +import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import { createRequire } from 'node:module'; +import subsetFont from 'subset-font'; + +const require = createRequire(import.meta.url); + +const ranges = [ + [0x20, 0x7e], // Basic Latin + [0xa0, 0xff], // Latin-1 (ç ö ü · ° × …) + [0x11e, 0x11f], // Ğ ğ + [0x130, 0x131], // İ ı + [0x15e, 0x15f], // Ş ş + [0x394, 0x394], // Δ + [0x3a9, 0x3a9], // Ω + [0x3bb, 0x3bc], // λ μ + [0x2013, 0x2014], // – — + [0x2018, 0x201e], // ‘ ’ ‚ “ ” „ + [0x2022, 0x2022], // • + [0x2026, 0x2026], // … + [0x2032, 0x2033], // ′ ″ + [0x20ba, 0x20ba], // ₺ + [0x2122, 0x2122], // ™ + [0x2190, 0x2193], // ← ↑ → ↓ + [0x2212, 0x2212], // − + [0x2248, 0x2248], // ≈ + [0x2264, 0x2265], // ≤ ≥ +]; +const text = ranges + .flatMap(([a, b]) => Array.from({ length: b - a + 1 }, (_, i) => String.fromCodePoint(a + i))) + .join(''); + +// Fontsource ships each family split by unicode-range (latin / latin-ext). Each part is subset +// on its own and keeps Fontsource's unicode-range, so browsers fetch only the parts a page needs. +const families = [ + { pkg: '@fontsource-variable/rubik', family: 'Rubik Variable', slug: 'rubik', wght: [400, 900] }, + { pkg: '@fontsource-variable/inter', family: 'Inter Variable', slug: 'inter', wght: [400, 700] }, +]; +const parts = ['latin', 'latin-ext']; + +/** unicode-range of one Fontsource part, read from the package's own CSS. */ +function unicodeRange(pkg, slug, part) { + const css = readFileSync(require.resolve(`${pkg}/index.css`), 'utf8'); + const block = css + .split('@font-face') + .find((b) => b.includes(`${slug}-${part}-wght-normal.woff2`)); + const m = block?.match(/unicode-range:\s*([^;]+);/); + if (!m) throw new Error(`unicode-range not found for ${slug} ${part}`); + return m[1].trim(); +} + +mkdirSync('public/fonts', { recursive: true }); +const faces = []; +for (const f of families) { + for (const part of parts) { + const source = readFileSync( + require.resolve(`${f.pkg}/files/${f.slug}-${part}-wght-normal.woff2`), + ); + const out = await subsetFont(source, text, { + targetFormat: 'woff2', + variationAxes: { wght: { min: f.wght[0], max: f.wght[1] } }, + }); + const file = `${f.slug}-${part}.woff2`; + writeFileSync(`public/fonts/${file}`, out); + console.log(`${file}: ${source.length} → ${out.length} bytes`); + faces.push(`@font-face { + font-family: '${f.family}'; + font-style: normal; + font-display: swap; + font-weight: ${f.wght[0]} ${f.wght[1]}; + src: url('/fonts/${file}') format('woff2-variations'); + unicode-range: ${unicodeRange(f.pkg, f.slug, part)}; +}`); + } +} + +writeFileSync( + 'src/styles/fonts.css', + `/* Generated by scripts/subset-fonts.mjs — do not edit. Fonts: SIL OFL 1.1 (Rubik, Inter). */\n${faces.join('\n')}\n`, +); +console.log('Wrote src/styles/fonts.css'); diff --git a/src/components/Seo.astro b/src/components/Seo.astro index c5f0234..2b8e445 100644 --- a/src/components/Seo.astro +++ b/src/components/Seo.astro @@ -5,9 +5,12 @@ export interface Props { /** Page title without the site suffix. Omit on the home page. */ title?: string; description?: string; - /** Absolute or root-relative image URL for OG/Twitter. */ + /** Absolute or root-relative image URL for OG/Twitter. Defaults to the generated /og-default.png. */ image?: string; imageAlt?: string; + /** Pixel size of `image`, when known. */ + imageWidth?: number; + imageHeight?: number; type?: 'website' | 'article'; publishedTime?: Date; modifiedTime?: Date; @@ -21,6 +24,8 @@ const { description = site.description, image, imageAlt, + imageWidth, + imageHeight, type = 'website', publishedTime, modifiedTime, @@ -30,7 +35,11 @@ const { const fullTitle = title ? `${title}${site.titleSeparator}${site.name}` : site.title; const canonical = new URL(Astro.url.pathname, Astro.site ?? site.url).href; -const imageUrl = image ? new URL(image, Astro.site ?? site.url).href : undefined; +// Pages without their own image share the default card (1200×630). +const ogImage = image ?? '/og-default.png'; +const imageUrl = new URL(ogImage, Astro.site ?? site.url).href; +const [ogWidth, ogHeight] = image ? [imageWidth, imageHeight] : [1200, 630]; +const ogAlt = imageAlt ?? (image ? undefined : site.title); const twitterHandle = social.find((s) => s.id === 'x')?.handle; const personId = `${site.url}/#person`; @@ -61,8 +70,11 @@ const graph = { <title>{fullTitle} - -{noindex && } +{noindex ? ( + +) : ( + +)} @@ -70,16 +82,19 @@ const graph = { -{imageUrl && } -{imageUrl && imageAlt && } + +{ogWidth && } +{ogHeight && } +{ogAlt && } {publishedTime && } {modifiedTime && } - + {twitterHandle && } {twitterHandle && } -{imageUrl && } + +{ogAlt && }