pre-onboarding content, a11y & Core-Web-Vitals polish #74
Inga granskare
Etiketter
Inga etiketter
area/backups
area/ci
area/control-panel
area/identity
area/infra
area/observability
area/payments
area/security
area/storage
area/web
blocked
needs-info
needs-triage
ready-for-implementation
type
bug
type
chore
type
docs
type
epic
type
feature
type
task
wontfix
Ingen milstolpe
Inget projekt
Inga tilldelade
1 deltagare
Notiser
Förfallodatum
Inget förfallodatum satt.
Beroenden
Inga beroenden satta
Referens
bitborg/bitborg-web!74
Läser in…
Hänvisa till i nytt ärende
Ingen beskrivning angiven.
Ta bort grenen "feat/65-polish"
Borttagning av en gren är permanent. Även om den borttagna grenen kan fortsätta existera en kort tid innan den faktiskt tas bort, kan det INTE ångras i de flesta fall. Vill du fortsätta?
Pre-onboarding content, accessibility and Core-Web-Vitals polish (grab-bag). Closes #65.
Note: L1 (CSP
object-src/ CSP header) is intentionally out of scope here — it is handled in the separate #64 PR.astro.config.mjswas not touched.Done
Core Web Vitals
→arrow) withpyftsubset. Sizes dropped ~71%: regular 86 900 → 25 088, italic 90 432 → 25 768, medium 87 040 → 25 440, medium-italic 90 892 → 25 924 bytes. Verified the subsets still contain Swedish glyphs (å/ä/ö/é), dashes, quotes, €, ellipsis and the arrow.<Font preload />now preloads only the two upright weights (regular + medium) via thepreload={[…]}array API, not the italics. Verified the built home page emits exactly two<link rel="preload" as="font" crossorigin>tags (down from four).slot="fallback"skeleton for theserver:deferUserMenu, reserving the same row height/width to avoid header CLS.font-fallback.scss:local("Helvetica Neue"), local("Liberation Sans"), local("Roboto")(verified in the built CSS).Accessibility
tabindex="-1") and fields getaria-invalid+aria-describedbypointing at the message (username/email on input/taken, country on ineligible, captcha group on captcha).title(associated viaaria-describedby).role="group"+aria-labelledby.<span aria-current="page">, not a self-link.aria-labelledbyinstead of a duplicatedaria-label+ visible label.:focus(not only:focus-visible).Content / i18n
ui.tsorg price + the add-on table inen/pricing.astro).##headings inen/terms.md+en/privacy.mdlowered to sentence case (H1 titles kept).sv/docs.md,sv/terms.md(git-värdtjänst),faq/sv/renovate-cost.md,guides/sv/renovate.md,sv/privacy.md,pricing.astroandui.ts.nav.cookiePolicyi18n key (no/cookiespage; unused).sv/privacy.mdto the canonical URL (was pointing at/en).docs.exampleConfig).base.astro, driven by page props with sitewide defaults (title, description → tagline fallback, type, url, site_name, locale sv_SE/en_GB, image → apple-touch-icon; no dedicated social image exists yet).Low-risk
Containerfilecorepack pin aligned topnpm@11.15.0(matchespackageManager/ Volta).Deferred
object-src/ CSP header: handled in the #64 PR (not touched here).Verification
pnpm check— 0 errors (only pre-existing warnings/hints in untouched files).pnpm lint— clean (eslint + stylelint).pnpm build— succeeds; copies the 4 subset fonts.vitest run— 55/55 tests pass (via the pre-push hook).<span>, FAQaria-labelledby, and the full set of sign-uparia-invalid/aria-describedby/role=group/hint/titleattributes.50e0fd5e2a5181117e09Deployed + verified live 2026-07-21. The build was blocked for a while by two infra issues (both now fixed): the fail2ban
caddy-authjail banning the CI runner on the registry/v2auth handshake (bitborg-infra#127 → fixed by the/v2ignoreregex + unbanning the stale runner-egress ban), and a Containerfile cache-mount footgun (#77). After those, run 174 (build-and-push) succeeded and the host pulled the new image.Verified on prod:
/signupreturns 200 with the new CSP —object-src 'none'andstyle-src-elem 'self' 'nonce-…'(the per-request captcha-style nonce), replacing the old brittle hash-scraping. Fonts/a11y from #74 are in the shipped image.