KeiSeiKit-1.0/_blocks/stack-sveltekit.md
Parfii-bot a4e667de10 KeiSeiKit-public — clean state
Single-commit clean baseline after security scrub of niche-tells,
project codenames, internal jargon, and contributor-email leaks.

Contents:
- 100 Rust crates (_primitives/_rust/)
- 37 agent manifests (_manifests/) + generated specs (_generated/)
- 67 user-invocable skills (skills/)
- 33 hooks (hooks/)
- Composition blocks (_blocks/)
- Documentation (docs/, README.md)
- TS adapter packages (_ts_packages/)
- Assembler (_assembler/)
- Roles (_roles/)
- Templates (_templates/)
- Forgejo CI (.forgejo/)

Author: Denis Parfionovich <info@greendragon.info>

License: see LICENSE.
2026-05-01 12:09:03 +08:00

2.5 KiB

STACK — SvelteKit (Svelte 5 Runes + TS)

Use for animation-heavy sites, mobile-first interactive surfaces, and apps where smallest-possible runtime matters. Svelte 5 compiles to minimal JS; Runes replace the legacy reactive-label syntax.

Scaffold: npm create svelte@latest <app> → choose "SvelteKit", TypeScript strict, ESLint + Prettier.

Routing: file-based (src/routes/). Each route is a folder containing +page.svelte (UI) + optionally +page.server.ts (server load / actions) / +page.ts (universal load) / +layout.svelte. Dynamic routes via [slug]/+page.svelte.

Runes (Svelte 5):

  • $state(x) — reactive value (replaces let x = ... + $: label)
  • $derived(expr) — computed (replaces $: derivations)
  • $effect(() => {...}) — side effect (replaces $: statements with side effects)
  • $props() — component props (replaces export let)
  • $bindable() — two-way binding opt-in

No more legacy export let / $: foo = bar in new code. Runes are the canonical API from Svelte 5 onwards.

Data flow:

  • +page.server.ts load({ fetch, params }) — runs on server only, DB/secrets OK.
  • +page.ts load(...) — runs both server (SSR) + client (navigation) — no secrets.
  • Form actions: export const actions = { default: async ({ request }) => {...} } in +page.server.ts. Use <form method="POST"> + progressive enhancement — works without JS.

Env vars:

  • $env/static/private + $env/dynamic/private — server-only, secrets OK.
  • $env/static/public + $env/dynamic/public — must be prefixed PUBLIC_, ships to client.
  • SvelteKit refuses to build if a private env is imported into a client module — enforcement built in.

Deploy adapter (Cloudflare default): npm i -D @sveltejs/adapter-cloudflare and set it in svelte.config.js. Alternatives: adapter-node, adapter-vercel, adapter-static. Cloudflare adapter supports KV / R2 / D1 via platform.env.* inside load functions.

Stores (legacy, still supported): writable, readable, derived from svelte/store. Prefer $state in components; use stores only for cross-component shared state that truly needs it.

Testing: Vitest for unit + @testing-library/svelte for components + Playwright for E2E.

Forbidden: legacy export let + $: label syntax for NEW code (use Runes), $env/static/private imported into a client-reachable module, mixing runes + legacy reactivity in the same component, hardcoded secrets in svelte.config.js (ships to client bundle), adding React/Vue into a SvelteKit app without a very specific reason.