Upgraded to Astro 7, Cleared Two Broken Landing Pages
Banner VC's site now runs on Astro 7. The upgrade's stricter HTML compiler caught two orphaned closing tags that Astro 6 had silently tolerated for months.
Changelog - 2026-07-06 (01)
Upgraded to Astro 7, Cleared Two Broken Landing Pages
Why Care?
This site now runs on the same Astro major version as the rest of the Banner Knots fleet. Dependency drift across sibling sites makes shared patterns harder to copy and adapt, so bringing every site to Astro 7 keeps the fleet's pattern-copying workflow honest.
What's New?
astroupgraded 6.1.7 → 7.0.6@shikijs/rehype4.0.2 → 4.3.1@tailwindcss/vite4.2.2 → 4.3.2tailwindcss4.2.2 → 4.3.2rehype-stringify,remark-gfm,remark-rehype,unifiedbumped within existing semver ranges (patch releases)Added
@astrojs/checkandtypescriptas dev dependencies sopnpm exec astro checkis runnable for the first time on this siteFixed two orphaned
</div>closing tags insrc/pages/landing2.astroandsrc/pages/landing3.astro
How It Worked
The safe patch/minor bump (pnpm update) went through clean. The Astro 6 → 7 major bump broke the build immediately with a compiler error neither of the older toolchain versions had ever surfaced:
[CompilerError] Closing tag '</div>' has no matching opening tag.
src/pages/landing2.astro:275:6Both landing2.astro and landing3.astro are Webstudio-exported one-off marketing page variants. Each had accumulated two stray </div> tags right before the closing </BaseThemeLayout> — leftover from a copy-paste export that Astro 6's more permissive HTML parser never flagged. Astro 7's new compiler enforces strict tag balance, so the build now fails loudly instead of silently emitting malformed markup. Counted div open/close tags across every page in src/pages/ to confirm these were the only two offenders, then removed the extras.
Under the Hood
Running any pnpm command scoped to this site from inside sites/banner-site/ was hitting pnpm outdated's workspace-detection walk-up: pnpm found the astro-knots root pnpm-workspace.yaml (which doesn't list sites/*) and threw Cannot read properties of undefined instead of treating banner-site as a self-contained project. Added a local pnpm-workspace.yaml with packages: [] — the same pattern already used by mpstaton-site — so pnpm anchors the workspace boundary at banner-site itself and its own node_modules/lockfile stay isolated from the parent.
pnpm exec astro check surfaced 83 pre-existing TypeScript errors, none of which trace back to the Astro 7 upgrade: strictPropertyInitialization violations in the src/components/flare/*.astro Three.js/canvas animation classes (BannerFlag, FlagCloth, FlagPixel*, WobbleRings), plus missing @types/node coverage in astro.config.mjs and the two scripts/*.ts utilities. These errors were invisible before this change only because @astrojs/check/typescript had never been installed on this site — left out of scope for this pass since they predate the dependency bump and aren't upgrade-induced.
One cosmetic, non-blocking build warning appeared for the first time: lightningcss's minifier doesn't recognize Astro's :global() scoping pseudo-class syntax used across several component <style> blocks (ContentEnhancer.astro, CardGridLayout.astro, etc.), so it skips minifying those specific rules. Confirmed the CSS itself survives intact in dist/_astro/*.css — output is correct, just slightly larger for those selectors.
Build Verification
pnpm build— clean, exit 0, 29 pages generatedpnpm exec astro check— 83 pre-existing errors (documented above, out of scope), 0 new errors from the upgradeNo
@astrojs/*adapters present on this site, so there was no VerceledgeMiddleware/isrmigration needed
Files Touched
package.json— version bump to0.0.9, dependency version bumps, added@astrojs/check+typescriptpnpm-lock.yaml— regeneratedpnpm-workspace.yaml— added, isolates this site from the parent astro-knots workspacesrc/pages/landing2.astro— removed 2 orphaned</div>tagssrc/pages/landing3.astro— removed 1 orphaned</div>tag
