diff --git a/README.md b/README.md
index 6a92957..9f07653 100644
--- a/README.md
+++ b/README.md
@@ -55,7 +55,7 @@ browser-language redirect; readers switch from the header language menu.
- Long Chinese headings may use `\u200b` to mark where they are allowed to
wrap; headings otherwise break only at spaces and punctuation.
- To add a locale: add it to `src/lib/locales.ts`, add a content file, add the
- path to `prerender.entries` in `svelte.config.js`, add its share-image file
+ path to `prerender.entries` in `vite.config.ts`, add its share-image file
in `src/lib/seo.ts`, regenerate the PNGs with
`swift scripts/share-cards/render.swift` on macOS, and extend
`scripts/verify-build.mjs`. The sitemap is generated from the locale list.
diff --git a/package.json b/package.json
index cbf6aec..a665f33 100644
--- a/package.json
+++ b/package.json
@@ -11,8 +11,8 @@
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json"
},
"devDependencies": {
- "@sveltejs/adapter-static": "^3.0.10",
- "@sveltejs/kit": "^2.70.3",
+ "@sveltejs/adapter-static": "^4.0.0",
+ "@sveltejs/kit": "^3.0.1",
"@sveltejs/vite-plugin-svelte": "^7.3.1",
"@tailwindcss/vite": "^4.3.3",
"svelte": "^5.57.2",
@@ -21,5 +21,9 @@
"typescript": "^6.0.3",
"vite": "^8.3.4",
"vitest": "^5.0.3"
+ },
+ "imports": {
+ "#lib": "./src/lib/index.js",
+ "#lib/*": "./src/lib/*"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a2e6e1f..9112a2f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -9,11 +9,11 @@ importers:
.:
devDependencies:
'@sveltejs/adapter-static':
- specifier: ^3.0.10
- version: 3.0.10(@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.2)(vite@8.3.4(jiti@2.7.0)))(svelte@5.57.2)(typescript@6.0.3)(vite@8.3.4(jiti@2.7.0)))
+ specifier: ^4.0.0
+ version: 4.0.0(@sveltejs/kit@3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.2)(vite@8.3.4(jiti@2.7.0)))(svelte@5.57.2)(typescript@6.0.3)(vite@8.3.4(jiti@2.7.0)))
'@sveltejs/kit':
- specifier: ^2.70.3
- version: 2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.2)(vite@8.3.4(jiti@2.7.0)))(svelte@5.57.2)(typescript@6.0.3)(vite@8.3.4(jiti@2.7.0))
+ specifier: ^3.0.1
+ version: 3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.2)(vite@8.3.4(jiti@2.7.0)))(svelte@5.57.2)(typescript@6.0.3)(vite@8.3.4(jiti@2.7.0))
'@sveltejs/vite-plugin-svelte':
specifier: ^7.3.1
version: 7.3.1(svelte@5.57.2)(vite@8.3.4(jiti@2.7.0))
@@ -173,21 +173,21 @@ packages:
peerDependencies:
acorn: ^8.9.0
- '@sveltejs/adapter-static@3.0.10':
- resolution: {integrity: sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==}
+ '@sveltejs/adapter-static@4.0.0':
+ resolution: {integrity: sha512-aF1J23R1ebKqUxQ4/qLr/Lxu63NFmLAtg8UZl3HFLxaoA1D/nhTVGcD9lTqx65iUbjNR2iOL0TgOxSX82x6Paw==}
peerDependencies:
- '@sveltejs/kit': ^2.0.0
+ '@sveltejs/kit': ^3.0.0-next.0
- '@sveltejs/kit@2.70.3':
- resolution: {integrity: sha512-UDvEYuZqAMbfB/oXIoqKvbKcb7YczK5zYrzmsGV1zRJk03jntwp8dXiYoIJotxAndsKvcPFtx9H1GRSKFdSHgg==}
- engines: {node: '>=18.13'}
+ '@sveltejs/kit@3.0.1':
+ resolution: {integrity: sha512-8JMCCq7ZUJELi3hbhb0+c9Rs8qnbHW90vhOfM+t1FSF4fhIpG9/FOsH4IYgcITMhbdkSrrn+Kvd9G+q8A+UO6Q==}
+ engines: {node: '>=22.17'}
hasBin: true
peerDependencies:
'@opentelemetry/api': ^1.0.0
- '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0
- svelte: ^4.0.0 || ^5.0.0-next.0
- typescript: ^5.3.3 || ^6.0.0
- vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0
+ '@sveltejs/vite-plugin-svelte': ^7.0.0
+ svelte: ^5.57.1
+ typescript: ^6.0.0
+ vite: ^8.0.12
peerDependenciesMeta:
'@opentelemetry/api':
optional: true
@@ -302,9 +302,6 @@ packages:
'@types/chai@5.2.3':
resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
- '@types/cookie@0.6.0':
- resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
-
'@types/deep-eql@4.0.2':
resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
@@ -354,9 +351,9 @@ packages:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
- cookie@0.6.0:
- resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
- engines: {node: '>= 0.6'}
+ cookie@2.0.1:
+ resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==}
+ engines: {node: '>=22'}
deepmerge@4.3.1:
resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
@@ -366,12 +363,12 @@ packages:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
- devalue@5.9.1:
- resolution: {integrity: sha512-+17vil3EVQRzvtDJSFuTWEb8XJRvXqAiV3qZyQWD398QeXUa6CxsUyMdD1fxzEhUrd4FojitFz7lhIHBTlV4fw==}
-
devalue@5.9.2:
resolution: {integrity: sha512-po4PAY5c53tw5XMocSnf8A/5OHhbbUftpr93aEN6BBoAdntUmK7vu7wOATqvt7cXO7m1Cl4gMVn6p7n6n4mj0w==}
+ devalue@5.9.4:
+ resolution: {integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==}
+
enhanced-resolve@5.24.5:
resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==}
engines: {node: '>=10.13.0'}
@@ -421,10 +418,6 @@ packages:
resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
hasBin: true
- kleur@4.1.5:
- resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
- engines: {node: '>=6'}
-
lightningcss-android-arm64@1.32.0:
resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
engines: {node: '>= 12.0.0'}
@@ -626,9 +619,6 @@ packages:
resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
engines: {node: '>=6'}
- set-cookie-parser@3.1.2:
- resolution: {integrity: sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==}
-
sirv@3.0.2:
resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==}
engines: {node: '>=18'}
@@ -864,24 +854,20 @@ snapshots:
dependencies:
acorn: 8.18.0
- '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.2)(vite@8.3.4(jiti@2.7.0)))(svelte@5.57.2)(typescript@6.0.3)(vite@8.3.4(jiti@2.7.0)))':
+ '@sveltejs/adapter-static@4.0.0(@sveltejs/kit@3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.2)(vite@8.3.4(jiti@2.7.0)))(svelte@5.57.2)(typescript@6.0.3)(vite@8.3.4(jiti@2.7.0)))':
dependencies:
- '@sveltejs/kit': 2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.2)(vite@8.3.4(jiti@2.7.0)))(svelte@5.57.2)(typescript@6.0.3)(vite@8.3.4(jiti@2.7.0))
+ '@sveltejs/kit': 3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.2)(vite@8.3.4(jiti@2.7.0)))(svelte@5.57.2)(typescript@6.0.3)(vite@8.3.4(jiti@2.7.0))
- '@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.2)(vite@8.3.4(jiti@2.7.0)))(svelte@5.57.2)(typescript@6.0.3)(vite@8.3.4(jiti@2.7.0))':
+ '@sveltejs/kit@3.0.1(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.2)(vite@8.3.4(jiti@2.7.0)))(svelte@5.57.2)(typescript@6.0.3)(vite@8.3.4(jiti@2.7.0))':
dependencies:
+ '@rolldown/pluginutils': 1.0.1
'@standard-schema/spec': 1.1.0
- '@sveltejs/acorn-typescript': 1.0.13(acorn@8.18.0)
'@sveltejs/vite-plugin-svelte': 7.3.1(svelte@5.57.2)(vite@8.3.4(jiti@2.7.0))
- '@types/cookie': 0.6.0
- acorn: 8.18.0
- cookie: 0.6.0
- devalue: 5.9.1
+ cookie: 2.0.1
+ devalue: 5.9.4
esm-env: 1.2.2
- kleur: 4.1.5
- magic-string: 0.30.21
+ magic-string: 1.4.2
mrmime: 2.0.1
- set-cookie-parser: 3.1.2
sirv: 3.0.2
svelte: 5.57.2
vite: 8.3.4(jiti@2.7.0)
@@ -972,8 +958,6 @@ snapshots:
'@types/deep-eql': 4.0.2
assertion-error: 2.0.1
- '@types/cookie@0.6.0': {}
-
'@types/deep-eql@4.0.2': {}
'@types/estree@1.0.9': {}
@@ -1005,16 +989,16 @@ snapshots:
clsx@2.1.1: {}
- cookie@0.6.0: {}
+ cookie@2.0.1: {}
deepmerge@4.3.1: {}
detect-libc@2.1.2: {}
- devalue@5.9.1: {}
-
devalue@5.9.2: {}
+ devalue@5.9.4: {}
+
enhanced-resolve@5.24.5:
dependencies:
graceful-fs: 4.2.11
@@ -1049,8 +1033,6 @@ snapshots:
jiti@2.7.0: {}
- kleur@4.1.5: {}
-
lightningcss-android-arm64@1.32.0:
optional: true
@@ -1208,8 +1190,6 @@ snapshots:
dependencies:
mri: 1.2.0
- set-cookie-parser@3.1.2: {}
-
sirv@3.0.2:
dependencies:
'@polka/url': 1.0.0-next.29
diff --git a/src/app.css b/src/app.css
index 1588096..1806f79 100644
--- a/src/app.css
+++ b/src/app.css
@@ -295,7 +295,7 @@
}
}
-/* Scroll reveal (see $lib/reveal.ts). Elements start hidden only once JS is
+/* Scroll reveal (see #lib/reveal.ts). Elements start hidden only once JS is
known to run; the fallback animation shows them if hydration never lands. */
:root[data-js] [data-reveal]:not([data-revealed]) {
opacity: 0;
diff --git a/src/app.d.ts b/src/app.d.ts
index 683c27a..ef3f68f 100644
--- a/src/app.d.ts
+++ b/src/app.d.ts
@@ -1,6 +1,6 @@
///
-import type { Locale } from '$lib/locales';
+import type { Locale } from '#lib/locales.js';
declare global {
namespace App {
diff --git a/src/hooks.server.ts b/src/hooks.server.ts
index db10bce..61addc7 100644
--- a/src/hooks.server.ts
+++ b/src/hooks.server.ts
@@ -1,5 +1,5 @@
-import type { Handle } from '@sveltejs/kit';
-import { localeFromPath, localeInfo } from '$lib/locales';
+import type { Handle } from '@sveltejs/kit/hooks';
+import { localeFromPath, localeInfo } from '#lib/locales.js';
// Runs while prerendering, so each static page ships with its own `lang`.
export const handle: Handle = ({ event, resolve }) => {
diff --git a/src/lib/components/AgentsSection.svelte b/src/lib/components/AgentsSection.svelte
index 91859e8..9f41877 100644
--- a/src/lib/components/AgentsSection.svelte
+++ b/src/lib/components/AgentsSection.svelte
@@ -1,7 +1,7 @@
diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte
index 3d194ce..08c0dbe 100644
--- a/src/lib/components/Header.svelte
+++ b/src/lib/components/Header.svelte
@@ -6,9 +6,9 @@
import Wordmark from './Wordmark.svelte';
import ThemeSwitcher from './ThemeSwitcher.svelte';
import LanguageSwitcher from './LanguageSwitcher.svelte';
- import { navSections, pageSections, site } from '$lib/site';
- import { localePath } from '$lib/locales';
- import { currentLocale, currentMessages } from '$lib/content';
+ import { navSections, pageSections, site } from '#lib/site.js';
+ import { localePath } from '#lib/locales.js';
+ import { currentLocale, currentMessages } from '#lib/content/index.js';
import { page } from '$app/state';
const t = $derived(currentMessages());
diff --git a/src/lib/components/Hero.svelte b/src/lib/components/Hero.svelte
index a1538f8..2a4f35a 100644
--- a/src/lib/components/Hero.svelte
+++ b/src/lib/components/Hero.svelte
@@ -1,9 +1,9 @@
diff --git a/src/lib/components/InstallSection.svelte b/src/lib/components/InstallSection.svelte
index 2eaf2d8..7e94571 100644
--- a/src/lib/components/InstallSection.svelte
+++ b/src/lib/components/InstallSection.svelte
@@ -1,10 +1,10 @@
diff --git a/src/lib/components/Terminal.svelte b/src/lib/components/Terminal.svelte
index 5299a25..a89d245 100644
--- a/src/lib/components/Terminal.svelte
+++ b/src/lib/components/Terminal.svelte
@@ -1,7 +1,7 @@
diff --git a/src/lib/components/Wordmark.svelte b/src/lib/components/Wordmark.svelte
index ad011e6..9cc2dea 100644
--- a/src/lib/components/Wordmark.svelte
+++ b/src/lib/components/Wordmark.svelte
@@ -1,7 +1,7 @@
diff --git a/src/routes/[[lang=locale]]/results/+page.svelte b/src/routes/[[lang=locale]]/results/+page.svelte
index d29a2c6..5d66aa0 100644
--- a/src/routes/[[lang=locale]]/results/+page.svelte
+++ b/src/routes/[[lang=locale]]/results/+page.svelte
@@ -1,8 +1,8 @@