From bbdb3decacd17818f0b826b9ab689f838a7442e2 Mon Sep 17 00:00:00 2001 From: ildyria Date: Sun, 21 Jun 2026 14:05:40 +0200 Subject: [PATCH 1/6] Upgrade Astro --- .claude/skills/astro-migration/SKILLS.md | 295 + .../astro-migration/behaviour-change.md | 285 + .claude/skills/astro-migration/cloudfare.md | 327 + .../astro-migration/content-collection.md | 300 + .../skills/astro-migration/integration-api.md | 336 + .claude/skills/astro-migration/zod.md | 127 + .dockerignore | 4 + .editorconfig | 2 +- .gitignore | 2 +- .pnpmrc | 2 + .prettierignore | 2 +- .prettierrc.cjs => .prettierrc.mjs | 4 +- .stackblitzrc | 2 +- AGENTS.md | 106 + CLAUDE.md | 3 + astro.config.mjs => astro.config.ts | 41 +- eslint.config.js | 7 + package-lock.json | 8740 ++++++----------- package.json | 83 +- src/assets/styles/tailwind.css | 123 +- src/components/blog/GridItem.astro | 20 +- src/components/blog/ListItem.astro | 10 +- src/components/blog/SinglePost.astro | 7 +- src/components/blog/SinglePost2.astro | 6 +- src/components/common/Analytics.astro | 13 - src/components/common/BasicScripts.astro | 134 + src/components/common/Image.astro | 214 +- src/components/common/Metadata.astro | 119 +- src/components/ui/WidgetWrapper.astro | 14 +- src/components/widgets/Announcement.astro | 2 +- src/config.yaml | 1 + src/content.config.ts | 71 + src/{content => data}/config.ts | 0 .../post/2024-06-25-performance-problems.mdx | 0 .../post/2024-06-29-Future-of-lychee.mdx | 0 .../post/2024-07-02-v6-landing-page.mdx | 0 .../post/2024-07-06-v6-about.mdx | 0 .../post/2024-07-07-v6-gallery-1.mdx | 0 .../post/2024-07-09-v6-gallery-2.mdx | 0 .../post/2024-07-12-v6-gallery-3.mdx | 0 .../post/2024-07-13-v6-gallery-4.mdx | 0 .../post/2024-07-16-v6-album-1.mdx | 0 .../post/2024-07-17-v6-album-2.mdx | 0 .../post/2024-07-18-v6-tests-1.mdx | 0 .../post/2024-07-21-v6-tests-2.mdx | 0 .../post/2024-07-23-v6-tests-3.mdx | 0 .../post/2024-07-24-v6-profile-1.mdx | 0 .../post/2024-07-26-v6-profile-2.mdx | 0 .../post/2024-07-28-v6-settings-1.mdx | 0 .../post/2024-07-29-v6-settings-2.mdx | 0 .../post/2024-07-30-v6-settings-3.mdx | 0 .../post/2024-08-02-v6-settings-4.mdx | 0 .../post/2024-08-03-v6-users.mdx | 0 .../post/2024-08-04-v6-diagnostics.mdx | 0 .../post/2024-08-05-v6-jobs.mdx | 0 .../post/2024-08-08-v6-maintenance.mdx | 0 .../post/2024-08-09-v6-light-mode.mdx | 0 .../post/2024-08-10-v6-move-album-panel.mdx | 0 .../2024-08-11-v6-transfer-album-panel.mdx | 0 .../post/2024-08-14-v6-share-album-panel.mdx | 0 .../post/2024-08-17-v6-upload-dialog.mdx | 0 .../post/2024-08-18-v6-upload-dialog.mdx | 0 .../post/2024-08-27-v6-edit-photo.mdx | 0 .../post/2024-08-31-v6-help.mdx | 0 .../post/2024-09-14-v6-settings.mdx | 0 .../post/2024-09-15-v6-menus.mdx | 0 .../post/2024-09-23-v6-multiple.mdx | 0 .../post/2024-09-24-v6-frame.mdx | 0 .../post/2024-09-24-v6-oauth.mdx | 0 .../post/2024-09-24-v6-scramble.mdx | 0 .../post/2024-09-25-v6-map.mdx | 0 .../post/2024-09-29-v6-alpha.mdx | 0 .../post/2024-09-30-v6-header.mdx | 0 .../post/2024-10-05-v6-beta.mdx | 0 .../post/2024-10-07-v6-beta2.mdx | 0 .../post/2024-10-14-v6-beta3.mdx | 0 src/{content => data}/post/2024-10-26-v6.mdx | 0 .../post/2024-12-13-what-is-next.mdx | 0 .../post/2025-06-07-six-month-later.mdx | 0 .../post/2025-06-11-version-6-6-6.mdx | 0 .../post/2025-07-01-version-6-7-0.mdx | 0 .../post/2025-07-29-finding-duplicates.mdx | 0 ...-13-Opensource-processes-documentation.mdx | 0 .../post/2025-09-13-Code-Rabbit.mdx | 0 .../post/2025-12-31-version-7.mdx | 0 src/env.d.ts | 5 + src/layouts/LandingLayout.astro | 2 +- src/layouts/Layout.astro | 14 +- src/layouts/PageLayout.astro | 4 +- src/pages/roadmap.astro | 1 + src/styles/global.css | 1 + src/types.d.ts | 40 +- src/utils/blog.ts | 23 +- src/utils/{frontmatter.mjs => frontmatter.ts} | 20 +- src/utils/images.ts | 122 +- src/utils/permalinks.ts | 36 +- tsconfig.json | 7 +- 97 files changed, 5429 insertions(+), 6248 deletions(-) create mode 100644 .claude/skills/astro-migration/SKILLS.md create mode 100644 .claude/skills/astro-migration/behaviour-change.md create mode 100644 .claude/skills/astro-migration/cloudfare.md create mode 100644 .claude/skills/astro-migration/content-collection.md create mode 100644 .claude/skills/astro-migration/integration-api.md create mode 100644 .claude/skills/astro-migration/zod.md create mode 100644 .dockerignore create mode 100644 .pnpmrc rename .prettierrc.cjs => .prettierrc.mjs (75%) create mode 100644 AGENTS.md create mode 100644 CLAUDE.md rename astro.config.mjs => astro.config.ts (57%) delete mode 100644 src/components/common/Analytics.astro create mode 100644 src/content.config.ts rename src/{content => data}/config.ts (100%) rename src/{content => data}/post/2024-06-25-performance-problems.mdx (100%) rename src/{content => data}/post/2024-06-29-Future-of-lychee.mdx (100%) rename src/{content => data}/post/2024-07-02-v6-landing-page.mdx (100%) rename src/{content => data}/post/2024-07-06-v6-about.mdx (100%) rename src/{content => data}/post/2024-07-07-v6-gallery-1.mdx (100%) rename src/{content => data}/post/2024-07-09-v6-gallery-2.mdx (100%) rename src/{content => data}/post/2024-07-12-v6-gallery-3.mdx (100%) rename src/{content => data}/post/2024-07-13-v6-gallery-4.mdx (100%) rename src/{content => data}/post/2024-07-16-v6-album-1.mdx (100%) rename src/{content => data}/post/2024-07-17-v6-album-2.mdx (100%) rename src/{content => data}/post/2024-07-18-v6-tests-1.mdx (100%) rename src/{content => data}/post/2024-07-21-v6-tests-2.mdx (100%) rename src/{content => data}/post/2024-07-23-v6-tests-3.mdx (100%) rename src/{content => data}/post/2024-07-24-v6-profile-1.mdx (100%) rename src/{content => data}/post/2024-07-26-v6-profile-2.mdx (100%) rename src/{content => data}/post/2024-07-28-v6-settings-1.mdx (100%) rename src/{content => data}/post/2024-07-29-v6-settings-2.mdx (100%) rename src/{content => data}/post/2024-07-30-v6-settings-3.mdx (100%) rename src/{content => data}/post/2024-08-02-v6-settings-4.mdx (100%) rename src/{content => data}/post/2024-08-03-v6-users.mdx (100%) rename src/{content => data}/post/2024-08-04-v6-diagnostics.mdx (100%) rename src/{content => data}/post/2024-08-05-v6-jobs.mdx (100%) rename src/{content => data}/post/2024-08-08-v6-maintenance.mdx (100%) rename src/{content => data}/post/2024-08-09-v6-light-mode.mdx (100%) rename src/{content => data}/post/2024-08-10-v6-move-album-panel.mdx (100%) rename src/{content => data}/post/2024-08-11-v6-transfer-album-panel.mdx (100%) rename src/{content => data}/post/2024-08-14-v6-share-album-panel.mdx (100%) rename src/{content => data}/post/2024-08-17-v6-upload-dialog.mdx (100%) rename src/{content => data}/post/2024-08-18-v6-upload-dialog.mdx (100%) rename src/{content => data}/post/2024-08-27-v6-edit-photo.mdx (100%) rename src/{content => data}/post/2024-08-31-v6-help.mdx (100%) rename src/{content => data}/post/2024-09-14-v6-settings.mdx (100%) rename src/{content => data}/post/2024-09-15-v6-menus.mdx (100%) rename src/{content => data}/post/2024-09-23-v6-multiple.mdx (100%) rename src/{content => data}/post/2024-09-24-v6-frame.mdx (100%) rename src/{content => data}/post/2024-09-24-v6-oauth.mdx (100%) rename src/{content => data}/post/2024-09-24-v6-scramble.mdx (100%) rename src/{content => data}/post/2024-09-25-v6-map.mdx (100%) rename src/{content => data}/post/2024-09-29-v6-alpha.mdx (100%) rename src/{content => data}/post/2024-09-30-v6-header.mdx (100%) rename src/{content => data}/post/2024-10-05-v6-beta.mdx (100%) rename src/{content => data}/post/2024-10-07-v6-beta2.mdx (100%) rename src/{content => data}/post/2024-10-14-v6-beta3.mdx (100%) rename src/{content => data}/post/2024-10-26-v6.mdx (100%) rename src/{content => data}/post/2024-12-13-what-is-next.mdx (100%) rename src/{content => data}/post/2025-06-07-six-month-later.mdx (100%) rename src/{content => data}/post/2025-06-11-version-6-6-6.mdx (100%) rename src/{content => data}/post/2025-07-01-version-6-7-0.mdx (100%) rename src/{content => data}/post/2025-07-29-finding-duplicates.mdx (100%) rename src/{content => data}/post/2025-08-13-Opensource-processes-documentation.mdx (100%) rename src/{content => data}/post/2025-09-13-Code-Rabbit.mdx (100%) rename src/{content => data}/post/2025-12-31-version-7.mdx (100%) create mode 100644 src/styles/global.css rename src/utils/{frontmatter.mjs => frontmatter.ts} (64%) diff --git a/.claude/skills/astro-migration/SKILLS.md b/.claude/skills/astro-migration/SKILLS.md new file mode 100644 index 00000000..21c5f347 --- /dev/null +++ b/.claude/skills/astro-migration/SKILLS.md @@ -0,0 +1,295 @@ +--- +name: astro-v6-upgrade +description: Guide for upgrading Astro projects from v5 to v6. Use when users mention upgrading Astro, Astro v6, Astro 6, the Cloudflare adapter v13, or errors related to content collections, ViewTransitions, Astro.glob, Zod schemas, or the Content Layer API. +--- + +# Astro v6 Upgrade Guide + +This skill is based on the final [Astro v6 upgrade guide](https://docs.astro.build/en/guides/upgrade-to/v6/) and the [Cloudflare adapter v13 migration](https://docs.astro.build/en/guides/integrations-guide/cloudflare/#upgrading-to-v13-and-astro-6). + +## Quick Start + +1. **Check Node version**: Astro v6 requires Node `22.12.0` or higher. Check with `node -v`, and update `.nvmrc` / deployment config if needed. Ensure that you include CI workflows in this update if applicable. +2. **Upgrade Astro and official integrations together**: + ```bash + npx @astrojs/upgrade # npm + pnpm dlx @astrojs/upgrade # pnpm + yarn dlx @astrojs/upgrade # yarn + ``` +3. **Check for legacy content collections** (see below). v5 supported legacy collections via backwards-compat even without the flag. v6 removes that entirely. +4. **If deploying to Cloudflare**: the `@astrojs/cloudflare` v13 upgrade has significant changes. Load [cloudflare.md](cloudflare.md). +5. **Fix any errors** using this guide. + +## Check: Legacy Content Collections + +**Before upgrading**, check if the project needs content-collection migration. Many v5 projects silently relied on legacy backwards-compat (no flag required) and will break on v6. + +**Decision tree:** + +1. **Does `src/content/config.{js,ts,mjs,mts}` exist?** + - Yes → needs migration (legacy config location). +2. **Are there content folders in `src/content/` but no config file anywhere?** + - Yes → needs migration (implicit legacy collections). +3. **Otherwise, check `src/content.config.{js,ts,mjs,mts}` for:** + - Any collection without a `loader` property → needs migration. + - Any collection with `type:` set → needs migration. +4. **Does the code use `getEntryBySlug()`, `getDataEntryById()`, `entry.slug`, or `entry.render()`?** + - Yes → needs migration. + +If any apply, load [content-collections.md](content-collections.md). + +**Temporary escape hatch** (if migration can't happen immediately): + +```js title="astro.config.mjs" +export default defineConfig({ + legacy: { + collectionsBackwardsCompat: true, + }, +}); +``` + +This preserves the v4-style behavior: `src/content/config.ts` location, `type: 'content'`/`'data'` without loaders, `entry.slug`, `entry.render()`, path-based IDs. It is explicitly a migration helper and should be removed as soon as the project moves to the Content Layer API. + +**Note**: The old `legacy.collections: true` flag is removed. Remove it if present. + +## Quick Fixes + +These are simple renames/replacements. Apply directly. + +### ViewTransitions → ClientRouter + +```astro +--- +// Before +import { ViewTransitions } from 'astro:transitions'; +// After +import { ClientRouter } from 'astro:transitions'; +--- + + + + + +``` + +Also remove the `handleForms` prop if present - it is now removed entirely (form handling has been built in by default since v4). + +### Astro.glob() → import.meta.glob() + +```astro +--- +// Before +const posts = await Astro.glob('./posts/*.md'); + +// After - note: no longer returns a Promise +const posts = Object.values(import.meta.glob('./posts/*.md', { eager: true })); +--- +``` + +Consider content collections for content, or `fast-glob` for runtime globbing. + +### Zod imports + +```ts +// Before (deprecated) +import { z } from 'astro:content'; +import { z } from 'astro:schema'; + +// After +import { z } from 'astro/zod'; +``` + +`astro:schema` and `z` from `astro:content` are deprecated - import `z` from `astro/zod` directly. For Zod 4 API changes (string formats, error messages, transforms), see [zod.md](zod.md). + +### Deprecated APIs + +```ts +// Astro.site in getStaticPaths → import.meta.env.SITE +export function getStaticPaths() { + const site = import.meta.env.SITE; // was Astro.site +} + +// Astro.generator in getStaticPaths → just remove it + +// import.meta.env.ASSETS_PREFIX → astro:config/server +import { build } from 'astro:config/server'; +const prefix = build.assetsPrefix; +``` + +### Removed: emitESMImage() + +```ts +// Before +import { emitESMImage } from 'astro/assets/utils'; +const result = await emitESMImage(imageId, false, false); + +// After +import { emitImageMetadata } from 'astro/assets/utils'; +const result = await emitImageMetadata(imageId); +``` + +### Removed: `` `handleForms` prop + +Forms are handled automatically since v4. Remove the prop: + +```astro + + + + +``` + +### Removed: `prefetch()` `with` option + +```ts +// Before +prefetch('/about', { with: 'fetch' }); +// After +prefetch('/about'); +``` + +### Removed: `rewrite()` from Actions context + +```ts +// Inside an Action handler - remove any context.rewrite() calls. +// Use custom endpoints instead if you need redirect/rewrite behavior. +``` + +### Removed: exposed `astro:transitions` internals + +If imported, remove these or use plain string event names: + +```ts +// Before +import { + createAnimationScope, + isTransitionBeforePreparationEvent, + TRANSITION_AFTER_SWAP, +} from 'astro:transitions/client'; + +console.log(isTransitionBeforePreparationEvent(event)); +console.log(TRANSITION_AFTER_SWAP); + +// After +console.log(event.type === 'astro:before-preparation'); +console.log('astro:after-swap'); +// createAnimationScope has no replacement - remove it. +``` + +### Removed: exposed `astro:actions` internals + +`serializeActionResult` and `deserializeActionResult` are no longer exported from `astro:actions`. Use `getActionContext()` in middleware: + +```ts title="src/middleware.ts" +import { defineMiddleware } from 'astro:middleware'; +import { getActionContext } from 'astro:actions'; + +export const onRequest = defineMiddleware(async (context, next) => { + const { serializeActionResult, deserializeActionResult } = getActionContext(context); + // ... +}); +``` + +Also remove imports of: `ACTION_ERROR_CODES`, `ActionInputError`, `appendForwardSlash`, `astroCalledServerError`, `callSafely`, `formDataToObject`, `getActionQueryString`, `type Actions`, `type ActionAccept`, `type AstroActionContext`, `type SerializedActionResult`. + +### Removed: CommonJS config files + +`astro.config.cjs` and `astro.config.cts` are no longer supported. Rename to `.mjs`, `.js`, `.ts`, or `.mts`. + +### Changed: getStaticPaths params must be strings + +```ts +// Before - numbers were auto-stringified +return [{ params: { id: 1 } }]; +// After - must be string or undefined +return [{ params: { id: "1" } }]; +``` + +### Changed: Session driver config + +```js title="astro.config.mjs" +// Before +import { defineConfig } from 'astro/config'; + +export default defineConfig({ + session: { + driver: 'redis', + options: { url: process.env.REDIS_URL }, + }, +}); + +// After +import { defineConfig, sessionDrivers } from 'astro/config'; + +export default defineConfig({ + session: { + driver: sessionDrivers.redis({ url: process.env.REDIS_URL }), + }, +}); +``` + +### Removed: Percent-encoding in route filenames + +`%25` is no longer allowed in filenames. Rename any `src/pages/test%25file.astro` etc. + +## Error Quick Reference + +| Error | Fix | +|-------|-----| +| `LegacyContentConfigError` | Move `src/content/config.ts` → `src/content.config.ts` | +| `ContentCollectionMissingALoaderError` | Add `loader` to collection - see [content-collections.md](content-collections.md) | +| `ContentCollectionInvalidTypeError` | Remove `type: 'content'` or `type: 'data'` from collection | +| `GetEntryDeprecationError` | Replace `getEntryBySlug()`/`getDataEntryById()` with `getEntry()` | +| `ContentSchemaContainsSlugError` | Replace `.slug` with `.id`, use `.filePath` for filename | +| Cannot find `ViewTransitions` | Use `ClientRouter` (see above) | +| Cannot find `Astro.glob` | Use `import.meta.glob()` (see above) | +| Node version error | Upgrade to Node 22.12.0+ | +| Zod validation errors | Check [zod.md](zod.md) for Zod 4 changes | +| Cloudflare: `Astro.locals.runtime is undefined` | See [cloudflare.md](cloudflare.md) - access moved | + +## Deep Dive Files + +Load these only when needed: + +| File | When to load | +|------|--------------| +| [content-collections.md](content-collections.md) | Legacy content collections need migration | +| [zod.md](zod.md) | Using Zod schemas with `.email()`, `.url()`, custom errors, transforms, or `.default()` | +| [behavior-changes.md](behavior-changes.md) | Subtle issues: i18n redirects, script/style order, env vars, image sizing, Vitest, Shiki, SVGs | +| [integration-api.md](integration-api.md) | Building integrations or adapters | +| [cloudflare.md](cloudflare.md) | Deploying to Cloudflare Workers / Pages, upgrading `@astrojs/cloudflare` to v13 | + +## Experimental Flags to Remove + +These flags are now stable, default, or renamed. Remove from config: + +```js +export default defineConfig({ + experimental: { + // Remove all of these - now stable or default: + csp: true, // stable: use `security.csp` + fonts: true, // stable + liveContentCollections: true, // stable + preserveScriptOrder: true, // now default - see behavior-changes.md + staticImportMetaEnv: true, // now default - see behavior-changes.md + headingIdCompat: true, // now default - see behavior-changes.md + failOnPrerenderConflict: true, // renamed to `prerenderConflictBehavior` + }, +}); +``` + +## Official Adapter Upgrades + +All official adapters need a major upgrade alongside Astro v6 (to accompany Vite 7 + Environment API): + +- [`@astrojs/cloudflare`](https://github.com/withastro/astro/blob/main/packages/integrations/cloudflare/CHANGELOG.md) → **v13** (significant breaking changes - see [cloudflare.md](cloudflare.md)) +- [`@astrojs/netlify`](https://github.com/withastro/astro/blob/main/packages/integrations/netlify/CHANGELOG.md) +- [`@astrojs/node`](https://github.com/withastro/astro/blob/main/packages/integrations/node/CHANGELOG.md) +- [`@astrojs/vercel`](https://github.com/withastro/astro/blob/main/packages/integrations/vercel/CHANGELOG.md) + +## Resources + +- [Astro v6 Upgrade Guide](https://docs.astro.build/en/guides/upgrade-to/v6/) +- [Astro v6 Blog Post](https://astro.build/blog/astro-6-beta/) +- [Content Layer Deep Dive](https://astro.build/blog/content-layer-deep-dive/) +- [Cloudflare adapter docs](https://docs.astro.build/en/guides/integrations-guide/cloudflare/) diff --git a/.claude/skills/astro-migration/behaviour-change.md b/.claude/skills/astro-migration/behaviour-change.md new file mode 100644 index 00000000..6b34a663 --- /dev/null +++ b/.claude/skills/astro-migration/behaviour-change.md @@ -0,0 +1,285 @@ +# Behavior Changes + +These changes may cause unexpected behavior even if your code still runs. Review if you experience issues. + +## Endpoints with File Extensions + +Endpoints whose URL ends in a file extension (e.g. `/src/pages/sitemap.xml.ts`) can no longer be accessed with a trailing slash, regardless of `build.trailingSlash`. + +| URL | v5 | v6 | +|-----|-----|-----| +| `/sitemap.xml` | Works | Works | +| `/sitemap.xml/` | Works | **404** | + +**Fix**: Remove trailing slashes from any links to endpoints with file extensions. + +```html + +Sitemap + +Sitemap +``` + +## getStaticPaths() Params Must Be Strings + +Numbers are no longer auto-stringified. `params` must be `string` or `undefined`. + +```ts +export function getStaticPaths() { + return [ + { params: { id: 1 } }, // v5 worked, v6 errors + { params: { id: "1" } }, // v6 required + ]; +} +``` + +## `Astro` in `getStaticPaths()` deprecated + +Inside `getStaticPaths()`, only `Astro.site` and `Astro.generator` ever worked. Both are now deprecated and will log warnings; any other access throws. + +```astro +--- +// Before +export async function getStaticPaths() { + console.log(Astro.generator); + return getPages(Astro.site); +} + +// After +export async function getStaticPaths() { + // Remove Astro.generator entirely + return getPages(import.meta.env.SITE); +} +--- +``` + +## `import.meta.env.ASSETS_PREFIX` deprecated + +Use `astro:config/server` instead: + +```ts +// Before +someLogic(import.meta.env.ASSETS_PREFIX); + +// After +import { build } from 'astro:config/server'; +someLogic(build.assetsPrefix); +``` + +## i18n Redirect Default Changed + +`i18n.routing.redirectToDefaultLocale` now defaults to `false`, and can only be `true` when `prefixDefaultLocale` is also `true`. This prevents redirect loops previously possible in v5. + +- v5 default: visitors to `/` were redirected to `/{defaultLocale}/` +- v6 default: visitors stay at `/` + +**To restore old behavior:** + +```js title="astro.config.mjs" +export default defineConfig({ + i18n: { + routing: { + prefixDefaultLocale: true, + redirectToDefaultLocale: true, + }, + }, +}); +``` + +If using manual routing middleware, update it too: + +```js title="src/middleware.js" +import { middleware } from 'astro:i18n'; + +export const onRequest = middleware({ + prefixDefaultLocale: true, // was false + redirectToDefaultLocale: true, +}); +``` + +## Script and Style Rendering Order + +Tags now render in source order (v5 reversed them). This was the `experimental.preserveScriptOrder` behavior; it is now default. + +```astro + + +``` + +- v5: **yellow wins** (reversed) +- v6: **red wins** (source order) + +Review ` diff --git a/src/layouts/PageLayout.astro b/src/layouts/PageLayout.astro index f80728a8..e3bc4da7 100644 --- a/src/layouts/PageLayout.astro +++ b/src/layouts/PageLayout.astro @@ -20,9 +20,9 @@ const { metadata } = Astro.props; -
+
-
+
diff --git a/src/pages/roadmap.astro b/src/pages/roadmap.astro index ae44454b..ce7a86be 100644 --- a/src/pages/roadmap.astro +++ b/src/pages/roadmap.astro @@ -408,6 +408,7 @@ const getReleaseTypeBadge = (type: string) => { - -``` - -- v5: **yellow wins** (reversed) -- v6: **red wins** (source order) - -Review `