Repository: trueberryless-org/starlight-nextjs-theme
Pull request #14: feat: use cascade layers
Author: login: trueberryless
Labels: name: 📝 changeset
description: Contains changeset files
name: 🚧 config
description: Configuration file updates
name: 🌏 i18n
description: Updates to internationalized docs, excluding English
name: 📦 package
description: Updates in package structure or package.json
name: 🏯 styles
description: Stylesheets or design updates
Created: 2025-05-16T17:52:33Z | Merged: 2025-05-16T21:56:30Z

<!-- Thank you for opening a PR! We really appreciate you taking the time to help out 🙌 -->

#### Description

- Closes # <!-- Add an issue number if this PR will close it. -->
- What does this PR change? Give us a brief description.
- Did you change something visual? A before/after screenshot can be helpful.

<!--
Here’s what will happen next:
One or more of our maintainers will take a look and may ask you to make changes.
We try to be responsive, but don’t worry if this takes a day or two.
-->


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - Introduced a new CSS cascade layer for the NextJS theme, making it easier to customize and override default styles using custom CSS.
  - Sidebar navigation updated to include a new "Customization" section.
  - Added an "Examples" action button to the documentation homepage for quick access.

- **Bug Fixes**
  - Fixed the positioning of the banner when a sidebar is present to ensure correct display.
  - Resolved an issue with nested user-defined Expressive Code settings being applied incorrectly.

- **Documentation**
  - Added a new "Customization" guide explaining how to override and extend theme styles using CSS layers.
  - Updated sidebar structure and documentation to reflect new customization options.

- **Chores**
  - Increased the minimum required version of Starlight to 0.34.0 and updated related dependencies.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/.changeset/fruity-showers-count.md b/.changeset/fruity-showers-count.md
new file mode 100644
index 0000000..58d8383
--- /dev/null
+++ b/.changeset/fruity-showers-count.md
@@ -0,0 +1,9 @@
+---
+'starlight-nextjs-theme': minor
+---
+
+Groups all of the Starlight NextJS theme CSS declarations into a single `nextjs` [cascade layer](https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Styling_basics/Cascade_layers).
+
+This change aligns with the Starlight CSS architecture and allows for easier customization of the Starlight NextJS theme CSS as any custom unlayered CSS will override the default styles. If you are using cascade layers in your custom CSS, you can use the [`@layer`](https://developer.mozilla.org/en-US/docs/Web/CSS/@layer) CSS at-rule to define the order of precedence for different layers including the ones used by Starlight and the Starlight NextJS theme.
+
+Make sure to check your site’s appearance when upgrading to make sure there are no style regressions caused by this change.
diff --git a/.changeset/polite-books-double.md b/.changeset/polite-books-double.md
new file mode 100644
index 0000000..6fef835
--- /dev/null
+++ b/.changeset/polite-books-double.md
@@ -0,0 +1,5 @@
+---
+'starlight-nextjs-theme': patch
+---
+
+Fixes a banner position issue when using a banner in pages with a sidebar.
\ No newline at end of file
diff --git a/.changeset/weak-peas-laugh.md b/.changeset/weak-peas-laugh.md
new file mode 100644
index 0000000..d96f582
--- /dev/null
+++ b/.changeset/weak-peas-laugh.md
@@ -0,0 +1,11 @@
+---
+'starlight-nextjs-theme': minor
+---
+
+⚠️ **BREAKING CHANGE:** The minimum supported version of Starlight is now version `0.34.0`.
+
+Please use the `@astrojs/upgrade` command to upgrade your project:
+
+```sh
+npx @astrojs/upgrade
+```
diff --git a/.changeset/wild-papers-ask.md b/.changeset/wild-papers-ask.md
new file mode 100644
index 0000000..6157eb8
--- /dev/null
+++ b/.changeset/wild-papers-ask.md
@@ -0,0 +1,5 @@
+---
+'starlight-nextjs-theme': patch
+---
+
+Fixes an issue where nested user-defined Expressive Code settings were not being applied correctly.
diff --git a/docs/astro.config.ts b/docs/astro.config.ts
index c9235f8..0350d64 100644
--- a/docs/astro.config.ts
+++ b/docs/astro.config.ts
@@ -19,7 +19,7 @@ export default defineConfig({
       sidebar: [
         {
           label: "Start Here",
-          items: [{ slug: "getting-started" }],
+          items: ["getting-started", "customization"],
         },
         {
           label: "Examples",
diff --git a/docs/src/content/docs/customization.mdx b/docs/src/content/docs/customization.mdx
new file mode 100644
index 0000000..e15b5c6
--- /dev/null
+++ b/docs/src/content/docs/customization.mdx
@@ -0,0 +1,26 @@
+---
+title: Customization
+description: Learn how to customize your Starlight site and the Starlight NextJS theme with custom CSS.
+---
+
+## Custom CSS
+
+To customize the styles applied to your Starlight site when using the Starlight NextJS theme, you can providing additional CSS files to modify or extend the Starlight and the Starlight NextJS theme default styles.
+
+[Learn more about custom CSS in the Starlight documentation.](https://starlight.astro.build/guides/css-and-tailwind/#custom-css-styles)
+
+## Cascade layers
+
+Like Starlight, the Starlight NextJS theme uses [cascade layers](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Cascade_layers) internally to manage the order of its styles.
+This ensures a predictable CSS order and allows for simpler overrides.
+Any custom unlayered CSS will override the default styles from the `starlight` and `nextjs` layers.
+
+If you are using cascade layers, you can use [`@layer`](https://developer.mozilla.org/en-US/docs/Web/CSS/@layer) in your [custom CSS](https://starlight.astro.build/guides/css-and-tailwind/#custom-css-styles) to define the order of precedence for different layers relative to the Starlight and Starlight NextJS theme styles:
+
+```css "starlight" "nextjs"
+/* src/styles/custom.css */
+@layer my-reset, starlight, nextjs, my-overrides;
+```
+
+The example above defines a custom layer named `my-reset`, applied before all the Starlight and Starlight NextJS theme layers, and another named `my-overrides`, applied after all Starlight and Starlight NextJS theme layers.
+Any styles in the `my-overrides` layer would take precedence over the Starlight and Starlight NextJS theme styles, but Starlight or the Starlight NextJS theme could still change styles set in the `my-reset` layer.
diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx
index f04ab73..a8d4c4f 100644
--- a/docs/src/content/docs/index.mdx
+++ b/docs/src/content/docs/index.mdx
@@ -22,6 +22,10 @@ hero:
     - text: Get Started
       link: /getting-started/
       icon: right-arrow
+    - text: Examples
+      link: /examples/asides/
+      icon: right-arrow
+      variant: minimal
 ---
 
 import { Card, CardGrid } from "@astrojs/starlight/components";
diff --git a/packages/starlight-nextjs-theme/index.ts b/packages/starlight-nextjs-theme/index.ts
index d87ad23..21deaed 100644
--- a/packages/starlight-nextjs-theme/index.ts
+++ b/packages/starlight-nextjs-theme/index.ts
@@ -4,10 +4,15 @@ export default function starlightNextjsTheme(): StarlightPlugin {
   return {
     name: "starlight-nextjs-theme",
     hooks: {
-      "config:setup"({ config: starlightConfig, updateConfig }) {
+      "config:setup"({ config, updateConfig }) {
+        const userExpressiveCodeConfig =
+          !config.expressiveCode || config.expressiveCode === true
+            ? {}
+            : config.expressiveCode;
+
         updateConfig({
           customCss: [
-            ...(starlightConfig.customCss ?? []),
+            ...(config.customCss ?? []),
             "starlight-nextjs-theme/fonts/geist-mono/100.css",
             "starlight-nextjs-theme/fonts/geist-mono/200.css",
             "starlight-nextjs-theme/fonts/geist-mono/300.css",
@@ -29,24 +34,24 @@ export default function starlightNextjsTheme(): StarlightPlugin {
             "starlight-nextjs-theme/styles.css",
           ],
           expressiveCode:
-            starlightConfig.expressiveCode === false
+            config.expressiveCode === false
               ? false
               : {
+                  themes: ["vitesse-dark", "vitesse-light"],
+                  ...userExpressiveCodeConfig,
                   styleOverrides: {
                     borderColor: "var(--sl-color-gray-5)",
                     borderRadius: "0.5rem",
+                    ...userExpressiveCodeConfig.styleOverrides,
                     frames: {
                       editorActiveTabIndicatorTopColor: "unset",
                       editorActiveTabIndicatorBottomColor:
                         "var(--sl-color-gray-3)",
                       editorTabBarBorderBottomColor: "var(--sl-color-gray-5)",
                       frameBoxShadowCssValue: "unset",
+                      ...userExpressiveCodeConfig.styleOverrides?.frames,
                     },
                   },
-                  themes: ["vitesse-dark", "vitesse-light"],
-                  ...(typeof starlightConfig.expressiveCode === "object"
-                    ? starlightConfig.expressiveCode
-                    : {}),
                 },
         });
       },
diff --git a/packages/starlight-nextjs-theme/package.json b/packages/starlight-nextjs-theme/package.json
index 7a9006e..d321a83 100644
--- a/packages/starlight-nextjs-theme/package.json
+++ b/packages/starlight-nextjs-theme/package.json
@@ -28,11 +28,11 @@
     "./styles.css": "./styles.css"
   },
   "devDependencies": {
-    "@astrojs/starlight": "^0.33.0",
-    "astro": "^5.6.1"
+    "@astrojs/starlight": "^0.34.0",
+    "astro": "^5.7.3"
   },
   "peerDependencies": {
-    "@astrojs/starlight": ">=0.30"
+    "@astrojs/starlight": ">=0.34"
   },
   "engines": {
     "node": "^18.17.1 || ^20.3.0 || >=21.0.0"
diff --git a/packages/starlight-nextjs-theme/styles.css b/packages/starlight-nextjs-theme/styles.css
index 4166d77..5fafbae 100644
--- a/packages/starlight-nextjs-theme/styles.css
+++ b/packages/starlight-nextjs-theme/styles.css
@@ -1,627 +1,631 @@
-:root {
-  --sl-font: "Geist Sans", sans-serif;
-  --sl-font-mono: "Geist Mono", monospace;
-  --sl-mobile-toc-height: 5rem;
-}
+@layer starlight, nextjs;
 
-/* Dark mode colors. */
-:root {
-  --sl-color-accent-low: #142245;
-  --sl-color-accent: #305adf;
-  --sl-color-accent-high: #b3c8f7;
-  --sl-color-white: #ffffff;
-  --sl-color-gray-1: #dcdcdc;
-  --sl-color-gray-2: #a8a8a8;
-  --sl-color-gray-3: #737373;
-  --sl-color-gray-4: #4a4a4a;
-  --sl-color-gray-5: #2f2f2f;
-  --sl-color-gray-6: #1b1b1b;
-  --sl-color-gray-7: #111111;
-  --sl-color-black: #0e0e0e;
-
-  --sl-color-bg-sidebar: var(--sl-color-black);
-  --sl-nextjs-header-bg-color: rgba(14, 14, 14, 0.6);
-
-  --sl-text-h1: var(--sl-text-3xl);
-  --sl-text-h2: var(--sl-text-2xl);
-  --sl-text-h3: var(--sl-text-xl);
-  --sl-text-h4: var(--sl-text-lg);
-  --sl-text-h5: unset;
-
-  --sidebar-margin-left: max(
-    1rem,
-    calc(
-      (
-          100% - var(--__toc-width, var(--sl-sidebar-width)) -
-            (2 * var(--__toc-width, 1.5rem)) -
-            var(--sl-content-inline-start, 0rem) - var(--sl-content-width) -
-            1rem
-        ) /
-        2
-    )
-  );
-}
+@layer nextjs {
+  :root {
+    --sl-font: "Geist Sans", sans-serif;
+    --sl-font-mono: "Geist Mono", monospace;
+    --sl-mobile-toc-height: 5rem;
+  }
 
-@media (min-width: 800px) {
+  /* Dark mode colors. */
   :root {
-    --sl-nav-pad-x: calc(1.5rem + var(--sidebar-margin-left));
+    --sl-color-accent-low: #142245;
+    --sl-color-accent: #305adf;
+    --sl-color-accent-high: #b3c8f7;
+    --sl-color-white: #ffffff;
+    --sl-color-gray-1: #dcdcdc;
+    --sl-color-gray-2: #a8a8a8;
+    --sl-color-gray-3: #737373;
+    --sl-color-gray-4: #4a4a4a;
+    --sl-color-gray-5: #2f2f2f;
+    --sl-color-gray-6: #1b1b1b;
+    --sl-color-gray-7: #111111;
+    --sl-color-black: #0e0e0e;
+
+    --sl-color-bg-sidebar: var(--sl-color-black);
+    --sl-nextjs-header-bg-color: rgba(14, 14, 14, 0.6);
+
+    --sl-text-h1: var(--sl-text-3xl);
+    --sl-text-h2: var(--sl-text-2xl);
+    --sl-text-h3: var(--sl-text-xl);
+    --sl-text-h4: var(--sl-text-lg);
+    --sl-text-h5: unset;
+
+    --sidebar-margin-left: max(
+      1rem,
+      calc(
+        (
+            100% - var(--__toc-width, var(--sl-sidebar-width)) -
+              (2 * var(--__toc-width, 1.5rem)) -
+              var(--sl-content-inline-start, 0rem) - var(--sl-content-width) -
+              1rem
+          ) /
+          2
+      )
+    );
   }
-}
 
-/* Light mode colors. */
-:root[data-theme="light"] {
-  --sl-color-accent-low: #c7d7fa;
-  --sl-color-accent: #325ce1;
-  --sl-color-accent-high: #192d66;
-  --sl-color-white: #181818;
-  --sl-color-gray-1: #272727;
-  --sl-color-gray-2: #383838;
-  --sl-color-gray-3: #585858;
-  --sl-color-gray-4: #8b8b8b;
-  --sl-color-gray-5: #c2c2c2;
-  --sl-color-gray-6: #eeeeee;
-  --sl-color-gray-7: #f6f6f6;
-  --sl-color-black: #ffffff;
-
-  --sl-nextjs-header-bg-color: rgba(255, 255, 255, 0.5);
-}
+  @media (min-width: 800px) {
+    :root {
+      --sl-nav-pad-x: calc(1.5rem + var(--sidebar-margin-left));
+    }
+  }
 
-/* Header */
+  /* Light mode colors. */
+  :root[data-theme="light"] {
+    --sl-color-accent-low: #c7d7fa;
+    --sl-color-accent: #325ce1;
+    --sl-color-accent-high: #192d66;
+    --sl-color-white: #181818;
+    --sl-color-gray-1: #272727;
+    --sl-color-gray-2: #383838;
+    --sl-color-gray-3: #585858;
+    --sl-color-gray-4: #8b8b8b;
+    --sl-color-gray-5: #c2c2c2;
+    --sl-color-gray-6: #eeeeee;
+    --sl-color-gray-7: #f6f6f6;
+    --sl-color-black: #ffffff;
+
+    --sl-nextjs-header-bg-color: rgba(255, 255, 255, 0.5);
+  }
 
-header.header {
-  -webkit-backdrop-filter: blur(1rem);
-  backdrop-filter: blur(1rem);
-  background-color: var(--sl-nextjs-header-bg-color);
-  color: var(--sl-color-white);
-  border-bottom: 1px solid var(--sl-color-hairline);
-}
+  /* Header */
 
-@media (min-width: 800px) {
-  header.header > .header > div.sl-flex:has(site-search) {
-    justify-self: end;
-    min-width: 15rem;
+  header.header {
+    -webkit-backdrop-filter: blur(1rem);
+    backdrop-filter: blur(1rem);
+    background-color: var(--sl-nextjs-header-bg-color);
+    color: var(--sl-color-white);
+    border-bottom: 1px solid var(--sl-color-hairline);
   }
 
-  header.header
-    > .header
-    > div.sl-flex:has(site-search)
-    > site-search
-    > button {
-    color: var(--sl-color-gray-1);
-  }
+  @media (min-width: 800px) {
+    header.header > .header > div.sl-flex:has(site-search) {
+      justify-self: end;
+      min-width: 15rem;
+    }
 
-  header.header
-    > .header
-    > div.sl-flex:has(site-search)
-    > site-search:hover
-    > button {
-    background-color: var(--sl-color-gray-6);
-    border-color: var(--sl-color-gray-5);
-    color: var(--sl-color-gray-1);
-  }
+    header.header
+      > .header
+      > div.sl-flex:has(site-search)
+      > site-search
+      > button {
+      color: var(--sl-color-gray-1);
+    }
 
-  .social-icons {
-    gap: 2rem;
-    margin-right: 1rem;
-  }
+    header.header
+      > .header
+      > div.sl-flex:has(site-search)
+      > site-search:hover
+      > button {
+      background-color: var(--sl-color-gray-6);
+      border-color: var(--sl-color-gray-5);
+      color: var(--sl-color-gray-1);
+    }
 
-  .social-icons::after {
-    display: none;
-  }
+    .social-icons {
+      gap: 2rem;
+      margin-right: 1rem;
+    }
 
-  .social-icons > a {
-    border: 1px solid var(--sl-color-gray-5);
-    border-radius: 0.5rem;
-    height: 100%;
-    padding: 0.69rem;
-    color: var(--sl-color-gray-1);
-  }
+    .social-icons::after {
+      display: none;
+    }
 
-  .social-icons > a:hover {
-    opacity: 1;
-    background-color: var(--sl-color-gray-6);
-  }
+    .social-icons > a {
+      border: 1px solid var(--sl-color-gray-5);
+      border-radius: 0.5rem;
+      height: 100%;
+      padding: 0.69rem;
+      color: var(--sl-color-gray-1);
+    }
 
-  header.header > .header > .right-group {
-    gap: 0;
-  }
+    .social-icons > a:hover {
+      opacity: 1;
+      background-color: var(--sl-color-gray-6);
+    }
 
-  :is(starlight-theme-select, starlight-lang-select) {
-    color: var(--sl-color-gray-1);
-    border-radius: 0.5rem;
-    border: 1px solid var(--sl-color-gray-5);
-    padding-inline-start: 0.5rem;
-  }
+    header.header > .header > .right-group {
+      gap: 0;
+    }
 
-  :is(starlight-theme-select, starlight-lang-select) > label > select {
-    padding-block: 0.5rem;
-  }
+    :is(starlight-theme-select, starlight-lang-select) {
+      color: var(--sl-color-gray-1);
+      border-radius: 0.5rem;
+      border: 1px solid var(--sl-color-gray-5);
+      padding-inline-start: 0.5rem;
+    }
 
-  :is(starlight-theme-select, starlight-lang-select):hover {
-    background-color: var(--sl-color-gray-6);
-  }
+    :is(starlight-theme-select, starlight-lang-select) > label > select {
+      padding-block: 0.5rem;
+    }
 
-  :is(starlight-theme-select, starlight-lang-select):hover > label {
-    color: var(--sl-color-gray-1);
-  }
-}
+    :is(starlight-theme-select, starlight-lang-select):hover {
+      background-color: var(--sl-color-gray-6);
+    }
 
-@media (min-width: 1152px) {
-  header.header > .header > .right-group {
-    gap: 0.5rem;
+    :is(starlight-theme-select, starlight-lang-select):hover > label {
+      color: var(--sl-color-gray-1);
+    }
   }
-}
 
-/* Sidebar */
+  @media (min-width: 1152px) {
+    header.header > .header > .right-group {
+      gap: 0.5rem;
+    }
+  }
 
-.sidebar-pane {
-  border-inline-end: 0;
-}
+  /* Sidebar */
 
-@media (min-width: 800px) {
   .sidebar-pane {
-    margin-left: var(--sidebar-margin-left);
+    border-inline-end: 0;
   }
-}
 
-@media (min-width: 50rem) {
-  :root {
-    --sl-sidebar-pad-x: 1.25rem;
+  @media (min-width: 800px) {
+    .sidebar-pane {
+      margin-left: var(--sidebar-margin-left);
+    }
   }
-}
 
-.sidebar-content {
-  padding-top: 1.5rem;
-}
-
-.sidebar-content summary {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  gap: 0.25rem;
-  padding-left: 0;
-  padding-right: 0;
-  font-weight: 700;
-}
+  @media (min-width: 50rem) {
+    :root {
+      --sl-sidebar-pad-x: 1.25rem;
+    }
+  }
 
-/* .sidebar-content .caret {
-  display: none;
-}
+  .sidebar-content {
+    padding-top: 1.5rem;
+  }
 
-@media (min-width: 50rem) {
   .sidebar-content summary {
-    --caret-adjustment: 0.5px;
-    transform: translateY(var(--caret-adjustment));
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+    gap: 0.25rem;
+    padding-left: 0;
+    padding-right: 0;
+    font-weight: 700;
   }
 
-  .sidebar-content .group-label {
-    transform: translateY(calc(-1 * var(--caret-adjustment)));
+  /* .sidebar-content .caret {
+    display: none;
   }
-} */
 
-.sidebar-content li {
-  border: 0;
-  --sl-sidebar-item-padding-inline: 0.45rem;
-  /* margin: 0; */
-  padding: 0;
-}
+  @media (min-width: 50rem) {
+    .sidebar-content summary {
+      --caret-adjustment: 0.5px;
+      transform: translateY(var(--caret-adjustment));
+    }
 
-.sidebar-content .top-level {
-  display: flex;
-  flex-direction: column;
-  gap: 4px;
-}
+    .sidebar-content .group-label {
+      transform: translateY(calc(-1 * var(--caret-adjustment)));
+    }
+  } */
 
-.sidebar-content .top-level > * {
-  margin-block: 0;
-}
+  .sidebar-content li {
+    border: 0;
+    --sl-sidebar-item-padding-inline: 0.45rem;
+    /* margin: 0; */
+    padding: 0;
+  }
 
-.sidebar-content .top-level > li:has(details) {
-  margin-block: 0.5rem;
-}
+  .sidebar-content .top-level {
+    display: flex;
+    flex-direction: column;
+    gap: 4px;
+  }
 
-.sidebar-content .large {
-  padding-left: 0.75rem;
-  padding-right: 0.75rem;
-  font-size: 0.875rem;
-}
+  .sidebar-content .top-level > * {
+    margin-block: 0;
+  }
+
+  .sidebar-content .top-level > li:has(details) {
+    margin-block: 0.5rem;
+  }
 
-@media (min-width: 50rem) {
   .sidebar-content .large {
-    font-size: var(--sl-text-sm);
+    padding-left: 0.75rem;
+    padding-right: 0.75rem;
+    font-size: 0.875rem;
   }
-}
 
-.sidebar-content a.large {
-  font-size: 0.875rem;
-}
+  @media (min-width: 50rem) {
+    .sidebar-content .large {
+      font-size: var(--sl-text-sm);
+    }
+  }
 
-.sidebar-content a {
-  padding-left: 0.75rem;
-  padding-right: 0.75rem;
-  padding-top: 0.5rem;
-  padding-bottom: 0.5rem;
-  font-size: 0.875rem;
-}
+  .sidebar-content a.large {
+    font-size: 0.875rem;
+  }
 
-.sidebar-content a[aria-current="page"] {
-  background-color: transparent;
-  color: var(--sl-color-accent-high);
-}
+  .sidebar-content a {
+    padding-left: 0.75rem;
+    padding-right: 0.75rem;
+    padding-top: 0.5rem;
+    padding-bottom: 0.5rem;
+    font-size: 0.875rem;
+  }
 
-[data-theme="light"] .sidebar-content a[aria-current="page"] {
-  color: var(--sl-color-accent);
-}
+  .sidebar-content a[aria-current="page"] {
+    background-color: transparent;
+    color: var(--sl-color-accent-high);
+  }
 
-.sidebar-content a[aria-current="page"]:hover {
-  color: var(--sl-color-white);
-}
+  [data-theme="light"] .sidebar-content a[aria-current="page"] {
+    color: var(--sl-color-accent);
+  }
 
-main {
-  position: relative;
-}
+  .sidebar-content a[aria-current="page"]:hover {
+    color: var(--sl-color-white);
+  }
 
-/* Banner */
-
-.sl-banner {
-  background-color: var(--sl-color-accent-low);
-  border: 1px solid var(--sl-color-accent-high);
-  border-radius: 0.5rem;
-  box-shadow: none;
-  color: var(--sl-color-white);
-  line-height: 1.4;
-  margin-block: 2rem -0.5rem;
-  margin-inline: var(--sl-content-pad-x);
-  max-width: var(--sl-content-width);
-  padding: 1rem;
-  text-align: start;
-  text-wrap: initial;
-
-  a {
-    color: var(--sl-color-green-accent);
-    text-underline-offset: 0.25em;
+  main {
+    position: relative;
+  }
+
+  /* Banner */
 
-    &:is(:hover, :focus-visible) {
-      color: var(--sl-color-accent-high);
+  .sl-banner {
+    background-color: var(--sl-color-accent-low);
+    border: 1px solid var(--sl-color-accent-high);
+    border-radius: 0.5rem;
+    box-shadow: none;
+    color: var(--sl-color-white);
+    line-height: 1.4;
+    margin-block: 2rem -0.5rem;
+    margin-inline: var(--sl-content-pad-x);
+    max-width: var(--sl-content-width);
+    padding: 1rem;
+    text-align: start;
+    text-wrap: initial;
+
+    a {
+      color: var(--sl-color-green-accent);
+      text-underline-offset: 0.25em;
+
+      &:is(:hover, :focus-visible) {
+        color: var(--sl-color-accent-high);
+      }
     }
-  }
 
-  @media (min-width: 72rem) {
-    margin-bottom: -1rem;
-    margin-inline: auto;
+    @media (min-width: 72rem) {
+      margin-bottom: -1rem;
+      margin-inline: auto;
 
-    [data-has-sidebar] & {
-      justify-self: end;
-      margin-inline: var(--sl-content-pad-x);
+      [data-has-sidebar] & {
+        justify-self: end;
+        margin-inline: var(--sl-content-pad-x);
+      }
     }
   }
 
-  @media (min-width: 88.5rem) {
-    [data-has-sidebar] & {
-      margin-left: auto;
-      margin-right: var(--sl-content-pad-x);
-    }
+  [data-has-sidebar] main:has(.sl-banner) {
+    display: grid;
   }
-}
 
-/* Content */
+  /* Content */
 
-@media (min-width: 1152px) {
-  :root {
-    --sl-mobile-toc-height: 0rem;
+  @media (min-width: 1152px) {
+    :root {
+      --sl-mobile-toc-height: 0rem;
+    }
   }
-}
 
-.main-pane > main > .content-panel:last-of-type {
-  border-top: none;
-  padding-top: 0;
-}
-
-.content-panel {
-  padding-top: 1rem;
-}
+  .main-pane > main > .content-panel:last-of-type {
+    border-top: none;
+    padding-top: 0;
+  }
 
-.content-panel + .content-panel {
-  border-top: none;
-  padding-top: 0;
-}
+  .content-panel {
+    padding-top: 1rem;
+  }
 
-.content-panel h1 {
-  margin-top: 0.5rem;
-}
+  .content-panel + .content-panel {
+    border-top: none;
+    padding-top: 0;
+  }
 
-@media (min-width: 72rem) {
   .content-panel h1 {
-    margin-top: 1rem;
+    margin-top: 0.5rem;
   }
-}
 
-.meta {
-  align-items: center;
-  flex-direction: row-reverse;
-}
+  @media (min-width: 72rem) {
+    .content-panel h1 {
+      margin-top: 1rem;
+    }
+  }
 
-.meta a {
-  border: 1px solid var(--sl-color-gray-5);
-  border-radius: 0.5rem;
-  padding: 0.25rem 0.5rem;
-}
+  .meta {
+    align-items: center;
+    flex-direction: row-reverse;
+  }
 
-.meta a:is(:hover, :focus-visible) {
-  border-color: var(--sl-color-gray-2);
-  color: var(--sl-color-gray-2);
-}
+  .meta a {
+    border: 1px solid var(--sl-color-gray-5);
+    border-radius: 0.5rem;
+    padding: 0.25rem 0.5rem;
+  }
 
-/* Markdown */
+  .meta a:is(:hover, :focus-visible) {
+    border-color: var(--sl-color-gray-2);
+    color: var(--sl-color-gray-2);
+  }
 
-.sl-markdown-content a:not(:where(.not-content *)) {
-  color: var(--sl-color-white);
-  text-underline-offset: 0.25em;
-}
+  /* Markdown */
 
-.sl-markdown-content a:is(:hover, :focus-visible):not(:where(.not-content *)) {
-  color: var(--sl-color-accent-high);
-}
+  .sl-markdown-content a:not(:where(.not-content *)) {
+    color: var(--sl-color-white);
+    text-underline-offset: 0.25em;
+  }
 
-.sl-markdown-content code:not(:where(.not-content *)) {
-  border-radius: 5px;
-}
+  .sl-markdown-content
+    a:is(:hover, :focus-visible):not(:where(.not-content *)) {
+    color: var(--sl-color-accent-high);
+  }
 
-.sl-markdown-content tr:nth-child(2n):not(:where(.not-content *)) {
-  background-color: var(--sl-color-gray-7);
-}
+  .sl-markdown-content code:not(:where(.not-content *)) {
+    border-radius: 5px;
+  }
 
-.sl-markdown-content :is(th, td):not(:where(.not-content *)) {
-  border: none;
-}
+  .sl-markdown-content tr:nth-child(2n):not(:where(.not-content *)) {
+    background-color: var(--sl-color-gray-7);
+  }
 
-.sl-markdown-content th:not(:where(.not-content *)) {
-  border-bottom: 1px solid var(--sl-color-white);
-}
+  .sl-markdown-content :is(th, td):not(:where(.not-content *)) {
+    border: none;
+  }
 
-.sl-markdown-content td:not(:where(.not-content *)) {
-  border-bottom: 1px solid var(--sl-color-gray-5);
-}
+  .sl-markdown-content th:not(:where(.not-content *)) {
+    border-bottom: 1px solid var(--sl-color-white);
+  }
 
-.sl-markdown-content details:not(:where(.not-content *)) {
-  --sl-details-border-color--hover: var(--sl-color-accent-high);
+  .sl-markdown-content td:not(:where(.not-content *)) {
+    border-bottom: 1px solid var(--sl-color-gray-5);
+  }
 
-  border-inline-start-width: 1px;
-}
+  .sl-markdown-content details:not(:where(.not-content *)) {
+    --sl-details-border-color--hover: var(--sl-color-accent-high);
 
-.sl-markdown-content .expressive-code .has-title {
-  --ec-uiPadBlk: 0.375rem;
-}
+    border-inline-start-width: 1px;
+  }
 
-.sl-markdown-content .expressive-code .frame.is-terminal .header {
-  border-bottom: 1px solid var(--sl-color-gray-5);
-}
+  .sl-markdown-content .expressive-code .has-title {
+    --ec-uiPadBlk: 0.375rem;
+  }
 
-/* Tabs */
+  .sl-markdown-content .expressive-code .frame.is-terminal .header {
+    border-bottom: 1px solid var(--sl-color-gray-5);
+  }
 
-starlight-tabs .tablist-wrapper {
-  overflow-y: hidden;
-}
+  /* Tabs */
 
-starlight-tabs ul[role="tablist"] {
-  border-bottom-width: 1px;
-}
+  starlight-tabs .tablist-wrapper {
+    overflow-y: hidden;
+  }
 
-starlight-tabs ul[role="tablist"] a[role="tab"] {
-  padding-block: 0.25rem;
-}
+  starlight-tabs ul[role="tablist"] {
+    border-bottom-width: 1px;
+  }
 
-starlight-tabs
-  ul[role="tablist"]
-  a[role="tab"]:not([aria-selected="true"]):hover {
-  border-color: var(--sl-color-white);
-  color: var(--sl-color-white);
-}
+  starlight-tabs ul[role="tablist"] a[role="tab"] {
+    padding-block: 0.25rem;
+  }
 
-/* Cards */
+  starlight-tabs
+    ul[role="tablist"]
+    a[role="tab"]:not([aria-selected="true"]):hover {
+    border-color: var(--sl-color-white);
+    color: var(--sl-color-white);
+  }
 
-.sl-markdown-content .card-grid.stagger {
-  --stagger-height: 2.5rem;
-}
+  /* Cards */
 
-.sl-markdown-content .card {
-  --sl-text-h1: var(--sl-text-4xl);
-  --sl-text-h2: var(--sl-text-3xl);
-  --sl-text-h3: var(--sl-text-2xl);
-  --sl-text-h4: var(--sl-text-xl);
-  --sl-text-h5: var(--sl-text-lg);
+  .sl-markdown-content .card-grid.stagger {
+    --stagger-height: 2.5rem;
+  }
 
-  border-radius: 0.5rem;
-  padding: clamp(1rem, calc(0.125rem + 1.5vw), 2.5rem);
-}
+  .sl-markdown-content .card {
+    --sl-text-h1: var(--sl-text-4xl);
+    --sl-text-h2: var(--sl-text-3xl);
+    --sl-text-h3: var(--sl-text-2xl);
+    --sl-text-h4: var(--sl-text-xl);
+    --sl-text-h5: var(--sl-text-lg);
 
-.sl-markdown-content .card .title .icon {
-  font-size: 1.875rem;
-}
+    border-radius: 0.5rem;
+    padding: clamp(1rem, calc(0.125rem + 1.5vw), 2.5rem);
+  }
 
-.sl-markdown-content .sl-link-card {
-  box-shadow: none;
-}
+  .sl-markdown-content .card .title .icon {
+    font-size: 1.875rem;
+  }
 
-.sl-markdown-content .sl-link-card:hover {
-  background: initial;
-}
+  .sl-markdown-content .sl-link-card {
+    box-shadow: none;
+  }
 
-.sl-markdown-content .sl-link-card .title {
-  color: var(--sl-color-white);
-}
+  .sl-markdown-content .sl-link-card:hover {
+    background: initial;
+  }
 
-.sl-markdown-content .sl-link-card .description {
-  color: var(--sl-color-gray-3);
-}
+  .sl-markdown-content .sl-link-card .title {
+    color: var(--sl-color-white);
+  }
 
-.sl-markdown-content .sl-link-card:is(:hover, :focus-visible) .description {
-  color: var(--sl-color-gray-2);
-}
+  .sl-markdown-content .sl-link-card .description {
+    color: var(--sl-color-gray-3);
+  }
 
-.sl-markdown-content .sl-link-card .icon {
-  color: var(--sl-color-gray-2);
-}
+  .sl-markdown-content .sl-link-card:is(:hover, :focus-visible) .description {
+    color: var(--sl-color-gray-2);
+  }
 
-/* Asides */
+  .sl-markdown-content .sl-link-card .icon {
+    color: var(--sl-color-gray-2);
+  }
 
-.starlight-aside {
-  border: 1px solid var(--sl-color-asides-border);
-  border-radius: 0.5rem;
-  color: var(--sl-color-asides-text-accent);
-}
+  /* Asides */
 
-.starlight-aside tr:nth-child(2n) {
-  background-color: color-mix(
-    in srgb,
-    var(--sl-color-asides-border) 25%,
-    var(--sl-color-black)
-  );
-}
+  .starlight-aside {
+    border: 1px solid var(--sl-color-asides-border);
+    border-radius: 0.5rem;
+    color: var(--sl-color-asides-text-accent);
+  }
 
-/* File Tree */
+  .starlight-aside tr:nth-child(2n) {
+    background-color: color-mix(
+      in srgb,
+      var(--sl-color-asides-border) 25%,
+      var(--sl-color-black)
+    );
+  }
 
-.sl-markdown-content starlight-file-tree {
-  background-color: var(--sl-color-black);
-  border: 1px solid var(--sl-color-accent-high);
-  border-radius: 0.5rem;
-}
+  /* File Tree */
 
-.sl-markdown-content
-  starlight-file-tree
-  .directory
-  > details
-  > summary:hover
-  ~ ul {
-  border-color: var(--sl-color-accent-high);
-}
+  .sl-markdown-content starlight-file-tree {
+    background-color: var(--sl-color-black);
+    border: 1px solid var(--sl-color-accent-high);
+    border-radius: 0.5rem;
+  }
 
-/* Notices */
+  .sl-markdown-content
+    starlight-file-tree
+    .directory
+    > details
+    > summary:hover
+    ~ ul {
+    border-color: var(--sl-color-accent-high);
+  }
 
-.content-panel:first-of-type p.sl-flex:not(:where(.sl-markdown-content *)) {
-  border-radius: 0.5rem;
-  padding: 1rem;
-}
+  /* Notices */
 
-.content-panel:first-of-type p.sl-flex:not(:where(.sl-markdown-content *)) svg {
-  flex-shrink: 0;
-}
+  .content-panel:first-of-type p.sl-flex:not(:where(.sl-markdown-content *)) {
+    border-radius: 0.5rem;
+    padding: 1rem;
+  }
 
-/* Steps */
-
-.sl-steps > li:last-of-type::after {
-  --guide-width: 1px;
-
-  background: linear-gradient(
-    to bottom,
-    var(--sl-color-hairline-light),
-    var(--sl-color-bg) 85%
-  );
-  bottom: var(--bullet-margin);
-  content: "";
-  inset-inline-start: calc((var(--bullet-size) - var(--guide-width)) / 2);
-  position: absolute;
-  top: calc(var(--bullet-size) + var(--bullet-margin));
-  width: var(--guide-width);
-}
+  .content-panel:first-of-type
+    p.sl-flex:not(:where(.sl-markdown-content *))
+    svg {
+    flex-shrink: 0;
+  }
 
-/* Link Buttons */
+  /* Steps */
+
+  .sl-steps > li:last-of-type::after {
+    --guide-width: 1px;
+
+    background: linear-gradient(
+      to bottom,
+      var(--sl-color-hairline-light),
+      var(--sl-color-bg) 85%
+    );
+    bottom: var(--bullet-margin);
+    content: "";
+    inset-inline-start: calc((var(--bullet-size) - var(--guide-width)) / 2);
+    position: absolute;
+    top: calc(var(--bullet-size) + var(--bullet-margin));
+    width: var(--guide-width);
+  }
 
-:is(.hero, .sl-markdown-content) .sl-link-button {
-  padding: 0.75rem 1rem;
-}
+  /* Link Buttons */
 
-:is(.hero, .sl-markdown-content) .sl-link-button svg {
-  font-size: 1.25rem;
-}
+  :is(.hero, .sl-markdown-content) .sl-link-button {
+    padding: 0.75rem 1rem;
+  }
 
-:is(.hero, .sl-markdown-content) .sl-link-button.primary {
-  background-color: var(--sl-color-accent-low);
-  border: 1px solid var(--sl-color-accent);
-  color: var(--sl-color-accent-high);
-}
+  :is(.hero, .sl-markdown-content) .sl-link-button svg {
+    font-size: 1.25rem;
+  }
 
-:is(.hero, .sl-markdown-content)
-  .sl-link-button.primary:is(:hover, :focus-visible) {
-  border-color: var(--sl-color-accent-low);
-  color: var(--sl-color-white);
-}
+  :is(.hero, .sl-markdown-content) .sl-link-button.primary {
+    background-color: var(--sl-color-accent-low);
+    border: 1px solid var(--sl-color-accent);
+    color: var(--sl-color-accent-high);
+  }
 
-:is(.hero, .sl-markdown-content) .sl-link-button.secondary {
-  border-color: var(--sl-color-gray-2);
-  color: var(--sl-color-gray-2);
-}
+  :is(.hero, .sl-markdown-content)
+    .sl-link-button.primary:is(:hover, :focus-visible) {
+    border-color: var(--sl-color-accent-low);
+    color: var(--sl-color-white);
+  }
 
-:is(.hero, .sl-markdown-content)
-  .sl-link-button.secondary:is(:hover, :focus-visible) {
-  border-color: var(--sl-color-accent-high);
-  color: var(--sl-color-accent-high);
-}
+  :is(.hero, .sl-markdown-content) .sl-link-button.secondary {
+    border-color: var(--sl-color-gray-2);
+    color: var(--sl-color-gray-2);
+  }
 
-:is(.hero, .sl-markdown-content) .sl-link-button.minimal {
-  padding-inline: 0.25rem;
-}
+  :is(.hero, .sl-markdown-content)
+    .sl-link-button.secondary:is(:hover, :focus-visible) {
+    border-color: var(--sl-color-accent-high);
+    color: var(--sl-color-accent-high);
+  }
 
-:is(.hero, .sl-markdown-content)
-  .sl-link-button.minimal:is(:hover, :focus-visible) {
-  color: var(--sl-color-accent-high);
-}
+  :is(.hero, .sl-markdown-content) .sl-link-button.minimal {
+    padding-inline: 0.25rem;
+  }
 
-/* Pagination Links */
+  :is(.hero, .sl-markdown-content)
+    .sl-link-button.minimal:is(:hover, :focus-visible) {
+    color: var(--sl-color-accent-high);
+  }
 
-.pagination-links {
-  gap: 0;
-}
+  /* Pagination Links */
 
-.pagination-links > a {
-  align-items: end;
-  border: none;
-  box-shadow: none;
-  padding-inline: 0;
-}
+  .pagination-links {
+    gap: 0;
+  }
 
-.pagination-links > a > svg {
-  margin-bottom: 0.17rem;
-}
+  .pagination-links > a {
+    align-items: end;
+    border: none;
+    box-shadow: none;
+    padding-inline: 0;
+  }
 
-.pagination-links .link-title {
-  font-size: var(--sl-text-lg);
-}
+  .pagination-links > a > svg {
+    margin-bottom: 0.17rem;
+  }
 
-/* Table of Contents */
+  .pagination-links .link-title {
+    font-size: var(--sl-text-lg);
+  }
 
-.right-sidebar {
-  border-inline-start: none;
-}
+  /* Table of Contents */
 
-.right-sidebar h2 {
-  font-size: var(--sl-text-xs);
-  font-weight: 600;
-  padding-left: 0.5rem;
-  margin-bottom: 0.45rem;
-  margin-top: 1rem;
-}
+  .right-sidebar {
+    border-inline-start: none;
+  }
 
-.right-sidebar a {
-  padding-bottom: 0.45rem;
-}
+  .right-sidebar h2 {
+    font-size: var(--sl-text-xs);
+    font-weight: 600;
+    padding-left: 0.5rem;
+    margin-bottom: 0.45rem;
+    margin-top: 1rem;
+  }
 
-.right-sidebar a[aria-current="true"] {
-  font-weight: 500;
-  color: var(--sl-color-gray-3);
-}
+  .right-sidebar a {
+    padding-bottom: 0.45rem;
+  }
 
-.right-sidebar a:hover {
-  color: var(--sl-color-white);
-}
+  .right-sidebar a[aria-current="true"] {
+    font-weight: 500;
+    color: var(--sl-color-gray-3);
+  }
 
-.right-sidebar mobile-starlight-toc > nav {
-  border-top: none;
-  -webkit-backdrop-filter: blur(1rem);
-  backdrop-filter: blur(1rem);
-  background-color: var(--sl-nextjs-header-bg-color);
-}
+  .right-sidebar a:hover {
+    color: var(--sl-color-white);
+  }
+
+  .right-sidebar mobile-starlight-toc > nav {
+    border-top: none;
+    -webkit-backdrop-filter: blur(1rem);
+    backdrop-filter: blur(1rem);
+    background-color: var(--sl-nextjs-header-bg-color);
+  }
 
-.right-sidebar mobile-starlight-toc > nav summary {
-  margin-top: 1rem;
+  .right-sidebar mobile-starlight-toc > nav summary {
+    margin-top: 1rem;
+  }
 }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2b8b43f..3ae6395 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -45,11 +45,11 @@ importers:
   packages/starlight-nextjs-theme:
     devDependencies:
       '@astrojs/starlight':
-        specifier: ^0.33.0
-        version: 0.33.0(astro@5.6.1(rollup@4.39.0)(typescript@5.8.3))
+        specifier: ^0.34.0
+        version: 0.34.3(astro@5.7.13(rollup@4.39.0)(typescript@5.8.3))
       astro:
-        specifier: ^5.6.1
-        version: 5.6.1(rollup@4.39.0)(typescript@5.8.3)
+        specifier: ^5.7.3
+        version: 5.7.13(rollup@4.39.0)(typescript@5.8.3)
 
   packages/starlight-nextjs-theme/fonts/geist-mono: {}
 
@@ -92,20 +92,11 @@ packages:
   '@astrojs/sitemap@3.3.0':
     resolution: {integrity: sha512-nYE4lKQtk+Kbrw/w0G0TTgT724co0jUsU4tPlHY9au5HmTBKbwiCLwO/15b1/y13aZ4Kr9ZbMeMHlXuwn0ty4Q==}
 
-  '@astrojs/starlight@0.33.0':
-    resolution: {integrity: sha512-BAdz3TJ5f7e0iDwu7ZNy6i6Rlca2sgi416K8pGPN3VMIlgJmj9NCqSUGZh+OQhk5FNzmnssi8w+xQQeNpe5hDw==}
-    peerDependencies:
-      astro: ^5.1.5
-
   '@astrojs/starlight@0.34.3':
     resolution: {integrity: sha512-MAuD3NF+E+QXJJuVKofoR6xcPTP4BJmYWeOBd03udVdubNGVnPnSWVZAi+ZtnTofES4+mJdp8BNGf+ubUxkiiA==}
     peerDependencies:
       astro: ^5.5.0
 
-  '@astrojs/telemetry@3.2.0':
-    resolution: {integrity: sha512-wxhSKRfKugLwLlr4OFfcqovk+LIFtKwLyGPqMsv+9/ibqqnW3Gv7tBhtKEb0gAyUAC4G9BTVQeQahqnQAhd6IQ==}
-    engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0}
-
   '@astrojs/telemetry@3.2.1':
     resolution: {integrity: sha512-SSVM820Jqc6wjsn7qYfV9qfeQvePtVc1nSofhyap7l0/iakUKywj3hfy3UJAOV4sGV4Q/u450RD4AaCaFvNPlg==}
     engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0}
@@ -368,27 +359,15 @@ packages:
     cpu: [x64]
     os: [win32]
 
-  '@expressive-code/core@0.40.2':
-    resolution: {integrity: sha512-gXY3v7jbgz6nWKvRpoDxK4AHUPkZRuJsM79vHX/5uhV9/qX6Qnctp/U/dMHog/LCVXcuOps+5nRmf1uxQVPb3w==}
-
   '@expressive-code/core@0.41.2':
     resolution: {integrity: sha512-AJW5Tp9czbLqKMzwudL9Rv4js9afXBxkSGLmCNPq1iRgAYcx9NkTPJiSNCesjKRWoVC328AdSu6fqrD22zDgDg==}
 
-  '@expressive-code/plugin-frames@0.40.2':
-    resolution: {integrity: sha512-aLw5IlDlZWb10Jo/TTDCVsmJhKfZ7FJI83Zo9VDrV0OBlmHAg7klZqw68VDz7FlftIBVAmMby53/MNXPnMjTSQ==}
-
   '@expressive-code/plugin-frames@0.41.2':
     resolution: {integrity: sha512-pfy0hkJI4nbaONjmksFDcuHmIuyPTFmi1JpABe4q2ajskiJtfBf+WDAL2pg595R9JNoPrrH5+aT9lbkx2noicw==}
 
-  '@expressive-code/plugin-shiki@0.40.2':
-    resolution: {integrity: sha512-t2HMR5BO6GdDW1c1ISBTk66xO503e/Z8ecZdNcr6E4NpUfvY+MRje+LtrcvbBqMwWBBO8RpVKcam/Uy+1GxwKQ==}
-
   '@expressive-code/plugin-shiki@0.41.2':
     resolution: {integrity: sha512-xD4zwqAkDccXqye+235BH5bN038jYiSMLfUrCOmMlzxPDGWdxJDk5z4uUB/aLfivEF2tXyO2zyaarL3Oqht0fQ==}
 
-  '@expressive-code/plugin-text-markers@0.40.2':
-    resolution: {integrity: sha512-/XoLjD67K9nfM4TgDlXAExzMJp6ewFKxNpfUw4F7q5Ecy+IU3/9zQQG/O70Zy+RxYTwKGw2MA9kd7yelsxnSmw==}
-
   '@expressive-code/plugin-text-markers@0.41.2':
     resolution: {integrity: sha512-JFWBz2qYxxJOJkkWf96LpeolbnOqJY95TvwYc0hXIHf9oSWV0h0SY268w/5N3EtQaD9KktzDE+VIVwb9jdb3nw==}
 
@@ -792,54 +771,36 @@ packages:
     cpu: [x64]
     os: [win32]
 
-  '@shikijs/core@1.29.2':
-    resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==}
-
   '@shikijs/core@3.2.1':
     resolution: {integrity: sha512-FhsdxMWYu/C11sFisEp7FMGBtX/OSSbnXZDMBhGuUDBNTdsoZlMSgQv5f90rwvzWAdWIW6VobD+G3IrazxA6dQ==}
 
   '@shikijs/core@3.4.1':
     resolution: {integrity: sha512-GCqSd3KXRTKX1sViP7fIyyyf6do2QVg+fTd4IT00ucYCVSKiSN8HbFbfyjGsoZePNKWcQqXe4U4rrz2IVldG5A==}
 
-  '@shikijs/engine-javascript@1.29.2':
-    resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==}
-
   '@shikijs/engine-javascript@3.2.1':
     resolution: {integrity: sha512-eMdcUzN3FMQYxOmRf2rmU8frikzoSHbQDFH2hIuXsrMO+IBOCI9BeeRkCiBkcLDHeRKbOCtYMJK3D6U32ooU9Q==}
 
   '@shikijs/engine-javascript@3.4.1':
     resolution: {integrity: sha512-oGvRqN3Bsk+cGzmCb/5Kt/LfD7uyA8vCUUawyqmLti/AYNV7++zIZFEW8JwW5PrpPNWWx9RcZ/chnYLedzlVIQ==}
 
-  '@shikijs/engine-oniguruma@1.29.2':
-    resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==}
-
   '@shikijs/engine-oniguruma@3.2.1':
     resolution: {integrity: sha512-wZZAkayEn6qu2+YjenEoFqj0OyQI64EWsNR6/71d1EkG4sxEOFooowKivsWPpaWNBu3sxAG+zPz5kzBL/SsreQ==}
 
   '@shikijs/engine-oniguruma@3.4.1':
     resolution: {integrity: sha512-p8I5KWgEDUcXRif9JjJUZtNeqCyxZ8xcslecDJMigsqSZfokwqQIsH4aGpdjzmDf8LIWvT+C3TCxnJQVaPmCbQ==}
 
-  '@shikijs/langs@1.29.2':
-    resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==}
-
   '@shikijs/langs@3.2.1':
     resolution: {integrity: sha512-If0iDHYRSGbihiA8+7uRsgb1er1Yj11pwpX1c6HLYnizDsKAw5iaT3JXj5ZpaimXSWky/IhxTm7C6nkiYVym+A==}
 
   '@shikijs/langs@3.4.1':
     resolution: {integrity: sha512-v5A5ApJYcrcPLHcwAi0bViUU+Unh67UaXU9gGX3qfr2z3AqlqSZbC00W/3J4+tfGJASzwrWDro2R1er6SsCL1Q==}
 
-  '@shikijs/themes@1.29.2':
-    resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==}
-
   '@shikijs/themes@3.2.1':
     resolution: {integrity: sha512-k5DKJUT8IldBvAm8WcrDT5+7GA7se6lLksR+2E3SvyqGTyFMzU2F9Gb7rmD+t+Pga1MKrYFxDIeyWjMZWM6uBQ==}
 
   '@shikijs/themes@3.4.1':
     resolution: {integrity: sha512-XOJgs55mVVMZtNVJx1NVmdcfXG9HIyZGh7qpCw/Ok5UMjWgkmb8z15TgcmF3ItvHItijiIMl9BLcNO/tFSGl1w==}
 
-  '@shikijs/types@1.29.2':
-    resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==}
-
   '@shikijs/types@3.2.1':
     resolution: {integrity: sha512-/NTWAk4KE2M8uac0RhOsIhYQf4pdU0OywQuYDGIGAJ6Mjunxl2cGiuLkvu4HLCMn+OTTLRWkjZITp+aYJv60yA==}
 
@@ -979,21 +940,11 @@ packages:
     resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
     hasBin: true
 
-  astro-expressive-code@0.40.2:
-    resolution: {integrity: sha512-yJMQId0yXSAbW9I6yqvJ3FcjKzJ8zRL7elbJbllkv1ZJPlsI0NI83Pxn1YL1IapEM347EvOOkSW2GL+2+NO61w==}
-    peerDependencies:
-      astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0
-
   astro-expressive-code@0.41.2:
     resolution: {integrity: sha512-HN0jWTnhr7mIV/2e6uu4PPRNNo/k4UEgTLZqbp3MrHU+caCARveG2yZxaZVBmxyiVdYqW5Pd3u3n2zjnshixbw==}
     peerDependencies:
       astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0
 
-  astro@5.6.1:
-    resolution: {integrity: sha512-aQ2TV7wIf+q2Oi6gGWMINHWEAZqoP0eH6/mihodfTJYATPWyd03JIGVfjtYUJlkNdNSKxDXwEe/r/Zx4CZ1FPg==}
-    engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'}
-    hasBin: true
-
   astro@5.7.13:
     resolution: {integrity: sha512-cRGq2llKOhV3XMcYwQpfBIUcssN6HEK5CRbcMxAfd9OcFhvWE7KUy50zLioAZVVl3AqgUTJoNTlmZfD2eG0G1w==}
     engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'}
@@ -1303,9 +1254,6 @@ packages:
   eventemitter3@5.0.1:
     resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
 
-  expressive-code@0.40.2:
-    resolution: {integrity: sha512-1zIda2rB0qiDZACawzw2rbdBQiWHBT56uBctS+ezFe5XMAaFaHLnnSYND/Kd+dVzO9HfCXRDpzH3d+3fvOWRcw==}
-
   expressive-code@0.41.2:
     resolution: {integrity: sha512-aLZiZaqorRtNExtGpUjK9zFH9aTpWeoTXMyLo4b4IcuXfPqtLPPxhRm/QlPb8QqIcMMXnSiGRHSFpQfX0m7HJw==}
 
@@ -1859,9 +1807,6 @@ packages:
   oniguruma-parser@0.5.4:
     resolution: {integrity: sha512-yNxcQ8sKvURiTwP0mV6bLQCYE7NKfKRRWunhbZnXgxSmB1OXa1lHrN3o4DZd+0Si0kU5blidK7BcROO8qv5TZA==}
 
-  oniguruma-to-es@2.3.0:
-    resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==}
-
   oniguruma-to-es@4.1.0:
     resolution: {integrity: sha512-SNwG909cSLo4vPyyPbU/VJkEc9WOXqu2ycBlfd1UCXLqk1IijcQktSBb2yRQ2UFPsDhpkaf+C1dtT3PkLK/yWA==}
 
@@ -2030,24 +1975,15 @@ packages:
   regenerator-runtime@0.14.1:
     resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
 
-  regex-recursion@5.1.1:
-    resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==}
-
   regex-recursion@6.0.2:
     resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==}
 
   regex-utilities@2.3.0:
     resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==}
 
-  regex@5.1.1:
-    resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==}
-
   regex@6.0.1:
     resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==}
 
-  rehype-expressive-code@0.40.2:
-    resolution: {integrity: sha512-+kn+AMGCrGzvtH8Q5lC6Y5lnmTV/r33fdmi5QU/IH1KPHKobKr5UnLwJuqHv5jBTSN/0v2wLDS7RTM73FVzqmQ==}
-
   rehype-expressive-code@0.41.2:
     resolution: {integrity: sha512-vHYfWO9WxAw6kHHctddOt+P4266BtyT1mrOIuxJD+1ELuvuJAa5uBIhYt0OVMyOhlvf57hzWOXJkHnMhpaHyxw==}
 
@@ -2155,9 +2091,6 @@ packages:
     resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
     engines: {node: '>=8'}
 
-  shiki@1.29.2:
-    resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==}
-
   shiki@3.2.1:
     resolution: {integrity: sha512-VML/2o1/KGYkEf/stJJ+s9Ypn7jUKQPomGLGYso4JJFMFxVDyPNsjsI3MB3KLjlMOeH44gyaPdXC6rik2WXvUQ==}
 
@@ -2443,46 +2376,6 @@ packages:
   vfile@6.0.3:
     resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
 
-  vite@6.2.5:
-    resolution: {integrity: sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==}
-    engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
-    hasBin: true
-    peerDependencies:
-      '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
-      jiti: '>=1.21.0'
-      less: '*'
-      lightningcss: ^1.21.0
-      sass: '*'
-      sass-embedded: '*'
-      stylus: '*'
-      sugarss: '*'
-      terser: ^5.16.0
-      tsx: ^4.8.1
-      yaml: ^2.4.2
-    peerDependenciesMeta:
-      '@types/node':
-        optional: true
-      jiti:
-        optional: true
-      less:
-        optional: true
-      lightningcss:
-        optional: true
-      sass:
-        optional: true
-      sass-embedded:
-        optional: true
-      stylus:
-        optional: true
-      sugarss:
-        optional: true
-      terser:
-        optional: true
-      tsx:
-        optional: true
-      yaml:
-        optional: true
-
   vite@6.3.5:
     resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
@@ -2639,25 +2532,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@astrojs/mdx@4.2.3(astro@5.6.1(rollup@4.39.0)(typescript@5.8.3))':
-    dependencies:
-      '@astrojs/markdown-remark': 6.3.1
-      '@mdx-js/mdx': 3.1.0(acorn@8.14.1)
-      acorn: 8.14.1
-      astro: 5.6.1(rollup@4.39.0)(typescript@5.8.3)
-      es-module-lexer: 1.6.0
-      estree-util-visit: 2.0.0
-      hast-util-to-html: 9.0.5
-      kleur: 4.1.5
-      rehype-raw: 7.0.0
-      remark-gfm: 4.0.1
-      remark-smartypants: 3.0.2
-      source-map: 0.7.4
-      unist-util-visit: 5.0.0
-      vfile: 6.0.3
-    transitivePeerDependencies:
-      - supports-color
-
   '@astrojs/mdx@4.2.3(astro@5.7.13(rollup@4.39.0)(typescript@5.8.3))':
     dependencies:
       '@astrojs/markdown-remark': 6.3.1
@@ -2687,37 +2561,6 @@ snapshots:
       stream-replace-string: 2.0.0
       zod: 3.24.2
 
-  '@astrojs/starlight@0.33.0(astro@5.6.1(rollup@4.39.0)(typescript@5.8.3))':
-    dependencies:
-      '@astrojs/mdx': 4.2.3(astro@5.6.1(rollup@4.39.0)(typescript@5.8.3))
-      '@astrojs/sitemap': 3.3.0
-      '@pagefind/default-ui': 1.3.0
-      '@types/hast': 3.0.4
-      '@types/js-yaml': 4.0.9
-      '@types/mdast': 4.0.4
-      astro: 5.6.1(rollup@4.39.0)(typescript@5.8.3)
-      astro-expressive-code: 0.40.2(astro@5.6.1(rollup@4.39.0)(typescript@5.8.3))
-      bcp-47: 2.1.0
-      hast-util-from-html: 2.0.3
-      hast-util-select: 6.0.4
-      hast-util-to-string: 3.0.1
-      hastscript: 9.0.1
-      i18next: 23.16.8
-      js-yaml: 4.1.0
-      klona: 2.0.6
-      mdast-util-directive: 3.1.0
-      mdast-util-to-markdown: 2.1.2
-      mdast-util-to-string: 4.0.0
-      pagefind: 1.3.0
-      rehype: 13.0.2
-      rehype-format: 5.0.1
-      remark-directive: 3.0.1
-      unified: 11.0.5
-      unist-util-visit: 5.0.0
-      vfile: 6.0.3
-    transitivePeerDependencies:
-      - supports-color
-
   '@astrojs/starlight@0.34.3(astro@5.7.13(rollup@4.39.0)(typescript@5.8.3))':
     dependencies:
       '@astrojs/markdown-remark': 6.3.1
@@ -2751,18 +2594,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@astrojs/telemetry@3.2.0':
-    dependencies:
-      ci-info: 4.2.0
-      debug: 4.4.0
-      dlv: 1.1.3
-      dset: 3.1.4
-      is-docker: 3.0.0
-      is-wsl: 3.1.0
-      which-pm-runs: 1.1.0
-    transitivePeerDependencies:
-      - supports-color
-
   '@astrojs/telemetry@3.2.1':
     dependencies:
       ci-info: 4.2.0
@@ -3071,18 +2902,6 @@ snapshots:
   '@esbuild/win32-x64@0.25.2':
     optional: true
 
-  '@expressive-code/core@0.40.2':
-    dependencies:
-      '@ctrl/tinycolor': 4.1.0
-      hast-util-select: 6.0.4
-      hast-util-to-html: 9.0.5
-      hast-util-to-text: 4.0.2
-      hastscript: 9.0.1
-      postcss: 8.5.3
-      postcss-nested: 6.2.0(postcss@8.5.3)
-      unist-util-visit: 5.0.0
-      unist-util-visit-parents: 6.0.1
-
   '@expressive-code/core@0.41.2':
     dependencies:
       '@ctrl/tinycolor': 4.1.0
@@ -3095,28 +2914,15 @@ snapshots:
       unist-util-visit: 5.0.0
       unist-util-visit-parents: 6.0.1
 
-  '@expressive-code/plugin-frames@0.40.2':
-    dependencies:
-      '@expressive-code/core': 0.40.2
-
   '@expressive-code/plugin-frames@0.41.2':
     dependencies:
       '@expressive-code/core': 0.41.2
 
-  '@expressive-code/plugin-shiki@0.40.2':
-    dependencies:
-      '@expressive-code/core': 0.40.2
-      shiki: 1.29.2
-
   '@expressive-code/plugin-shiki@0.41.2':
     dependencies:
       '@expressive-code/core': 0.41.2
       shiki: 3.4.1
 
-  '@expressive-code/plugin-text-markers@0.40.2':
-    dependencies:
-      '@expressive-code/core': 0.40.2
-
   '@expressive-code/plugin-text-markers@0.41.2':
     dependencies:
       '@expressive-code/core': 0.41.2
@@ -3444,15 +3250,6 @@ snapshots:
   '@rollup/rollup-win32-x64-msvc@4.39.0':
     optional: true
 
-  '@shikijs/core@1.29.2':
-    dependencies:
-      '@shikijs/engine-javascript': 1.29.2
-      '@shikijs/engine-oniguruma': 1.29.2
-      '@shikijs/types': 1.29.2
-      '@shikijs/vscode-textmate': 10.0.2
-      '@types/hast': 3.0.4
-      hast-util-to-html: 9.0.5
-
   '@shikijs/core@3.2.1':
     dependencies:
       '@shikijs/types': 3.2.1
@@ -3467,12 +3264,6 @@ snapshots:
       '@types/hast': 3.0.4
       hast-util-to-html: 9.0.5
 
-  '@shikijs/engine-javascript@1.29.2':
-    dependencies:
-      '@shikijs/types': 1.29.2
-      '@shikijs/vscode-textmate': 10.0.2
-      oniguruma-to-es: 2.3.0
-
   '@shikijs/engine-javascript@3.2.1':
     dependencies:
       '@shikijs/types': 3.2.1
@@ -3485,11 +3276,6 @@ snapshots:
       '@shikijs/vscode-textmate': 10.0.2
       oniguruma-to-es: 4.3.3
 
-  '@shikijs/engine-oniguruma@1.29.2':
-    dependencies:
-      '@shikijs/types': 1.29.2
-      '@shikijs/vscode-textmate': 10.0.2
-
   '@shikijs/engine-oniguruma@3.2.1':
     dependencies:
       '@shikijs/types': 3.2.1
@@ -3500,10 +3286,6 @@ snapshots:
       '@shikijs/types': 3.4.1
       '@shikijs/vscode-textmate': 10.0.2
 
-  '@shikijs/langs@1.29.2':
-    dependencies:
-      '@shikijs/types': 1.29.2
-
   '@shikijs/langs@3.2.1':
     dependencies:
       '@shikijs/types': 3.2.1
@@ -3512,10 +3294,6 @@ snapshots:
     dependencies:
       '@shikijs/types': 3.4.1
 
-  '@shikijs/themes@1.29.2':
-    dependencies:
-      '@shikijs/types': 1.29.2
-
   '@shikijs/themes@3.2.1':
     dependencies:
       '@shikijs/types': 3.2.1
@@ -3524,11 +3302,6 @@ snapshots:
     dependencies:
       '@shikijs/types': 3.4.1
 
-  '@shikijs/types@1.29.2':
-    dependencies:
-      '@shikijs/vscode-textmate': 10.0.2
-      '@types/hast': 3.0.4
-
   '@shikijs/types@3.2.1':
     dependencies:
       '@shikijs/vscode-textmate': 10.0.2
@@ -3651,111 +3424,11 @@ snapshots:
 
   astring@1.9.0: {}
 
-  astro-expressive-code@0.40.2(astro@5.6.1(rollup@4.39.0)(typescript@5.8.3)):
-    dependencies:
-      astro: 5.6.1(rollup@4.39.0)(typescript@5.8.3)
-      rehype-expressive-code: 0.40.2
-
   astro-expressive-code@0.41.2(astro@5.7.13(rollup@4.39.0)(typescript@5.8.3)):
     dependencies:
       astro: 5.7.13(rollup@4.39.0)(typescript@5.8.3)
       rehype-expressive-code: 0.41.2
 
-  astro@5.6.1(rollup@4.39.0)(typescript@5.8.3):
-    dependencies:
-      '@astrojs/compiler': 2.11.0
-      '@astrojs/internal-helpers': 0.6.1
-      '@astrojs/markdown-remark': 6.3.1
-      '@astrojs/telemetry': 3.2.0
-      '@oslojs/encoding': 1.1.0
-      '@rollup/pluginutils': 5.1.4(rollup@4.39.0)
-      acorn: 8.14.1
-      aria-query: 5.3.2
-      axobject-query: 4.1.0
-      boxen: 8.0.1
-      ci-info: 4.2.0
-      clsx: 2.1.1
-      common-ancestor-path: 1.0.1
-      cookie: 1.0.2
-      cssesc: 3.0.0
-      debug: 4.4.0
-      deterministic-object-hash: 2.0.2
-      devalue: 5.1.1
-      diff: 5.2.0
-      dlv: 1.1.3
-      dset: 3.1.4
-      es-module-lexer: 1.6.0
-      esbuild: 0.25.2
-      estree-walker: 3.0.3
-      flattie: 1.1.1
-      github-slugger: 2.0.0
-      html-escaper: 3.0.3
-      http-cache-semantics: 4.1.1
-      js-yaml: 4.1.0
-      kleur: 4.1.5
-      magic-string: 0.30.17
-      magicast: 0.3.5
-      mrmime: 2.0.1
-      neotraverse: 0.6.18
-      p-limit: 6.2.0
-      p-queue: 8.1.0
-      package-manager-detector: 1.1.0
-      picomatch: 4.0.2
-      prompts: 2.4.2
-      rehype: 13.0.2
-      semver: 7.7.1
-      shiki: 3.2.1
-      tinyexec: 0.3.2
-      tinyglobby: 0.2.12
-      tsconfck: 3.1.5(typescript@5.8.3)
-      ultrahtml: 1.6.0
-      unist-util-visit: 5.0.0
-      unstorage: 1.15.0
-      vfile: 6.0.3
-      vite: 6.2.5
-      vitefu: 1.0.6(vite@6.2.5)
-      xxhash-wasm: 1.1.0
-      yargs-parser: 21.1.1
-      yocto-spinner: 0.2.1
-      zod: 3.24.2
-      zod-to-json-schema: 3.24.5(zod@3.24.2)
-      zod-to-ts: 1.2.0(typescript@5.8.3)(zod@3.24.2)
-    optionalDependencies:
-      sharp: 0.33.5
-    transitivePeerDependencies:
-      - '@azure/app-configuration'
-      - '@azure/cosmos'
-      - '@azure/data-tables'
-      - '@azure/identity'
-      - '@azure/keyvault-secrets'
-      - '@azure/storage-blob'
-      - '@capacitor/preferences'
-      - '@deno/kv'
-      - '@netlify/blobs'
-      - '@planetscale/database'
-      - '@types/node'
-      - '@upstash/redis'
-      - '@vercel/blob'
-      - '@vercel/kv'
-      - aws4fetch
-      - db0
-      - idb-keyval
-      - ioredis
-      - jiti
-      - less
-      - lightningcss
-      - rollup
-      - sass
-      - sass-embedded
-      - stylus
-      - sugarss
-      - supports-color
-      - terser
-      - tsx
-      - typescript
-      - uploadthing
-      - yaml
-
   astro@5.7.13(rollup@4.39.0)(typescript@5.8.3):
     dependencies:
       '@astrojs/compiler': 2.11.0
@@ -4155,13 +3828,6 @@ snapshots:
 
   eventemitter3@5.0.1: {}
 
-  expressive-code@0.40.2:
-    dependencies:
-      '@expressive-code/core': 0.40.2
-      '@expressive-code/plugin-frames': 0.40.2
-      '@expressive-code/plugin-shiki': 0.40.2
-      '@expressive-code/plugin-text-markers': 0.40.2
-
   expressive-code@0.41.2:
     dependencies:
       '@expressive-code/core': 0.41.2
@@ -5109,12 +4775,6 @@ snapshots:
 
   oniguruma-parser@0.5.4: {}
 
-  oniguruma-to-es@2.3.0:
-    dependencies:
-      emoji-regex-xs: 1.0.0
-      regex: 5.1.1
-      regex-recursion: 5.1.1
-
   oniguruma-to-es@4.1.0:
     dependencies:
       emoji-regex-xs: 1.0.0
@@ -5296,29 +4956,16 @@ snapshots:
 
   regenerator-runtime@0.14.1: {}
 
-  regex-recursion@5.1.1:
-    dependencies:
-      regex: 5.1.1
-      regex-utilities: 2.3.0
-
   regex-recursion@6.0.2:
     dependencies:
       regex-utilities: 2.3.0
 
   regex-utilities@2.3.0: {}
 
-  regex@5.1.1:
-    dependencies:
-      regex-utilities: 2.3.0
-
   regex@6.0.1:
     dependencies:
       regex-utilities: 2.3.0
 
-  rehype-expressive-code@0.40.2:
-    dependencies:
-      expressive-code: 0.40.2
-
   rehype-expressive-code@0.41.2:
     dependencies:
       expressive-code: 0.41.2
@@ -5551,17 +5198,6 @@ snapshots:
 
   shebang-regex@3.0.0: {}
 
-  shiki@1.29.2:
-    dependencies:
-      '@shikijs/core': 1.29.2
-      '@shikijs/engine-javascript': 1.29.2
-      '@shikijs/engine-oniguruma': 1.29.2
-      '@shikijs/langs': 1.29.2
-      '@shikijs/themes': 1.29.2
-      '@shikijs/types': 1.29.2
-      '@shikijs/vscode-textmate': 10.0.2
-      '@types/hast': 3.0.4
-
   shiki@3.2.1:
     dependencies:
       '@shikijs/core': 3.2.1
@@ -5826,14 +5462,6 @@ snapshots:
       '@types/unist': 3.0.3
       vfile-message: 4.0.2
 
-  vite@6.2.5:
-    dependencies:
-      esbuild: 0.25.2
-      postcss: 8.5.3
-      rollup: 4.39.0
-    optionalDependencies:
-      fsevents: 2.3.3
-
   vite@6.3.5:
     dependencies:
       esbuild: 0.25.2
@@ -5845,10 +5473,6 @@ snapshots:
     optionalDependencies:
       fsevents: 2.3.3
 
-  vitefu@1.0.6(vite@6.2.5):
-    optionalDependencies:
-      vite: 6.2.5
-
   vitefu@1.0.6(vite@6.3.5):
     optionalDependencies:
       vite: 6.3.5


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 4**

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: ASSERTIVE**
**Plan: Pro**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between bb1889a41794e0eb2204ea54fe498d6671000036 and 4a3ba257a0f60652fe7eaa049d2dc800cfee7b90.

</details>

<details>
<summary>⛔ Files ignored due to path filters (1)</summary>

* `pnpm-lock.yaml` is excluded by `!**/pnpm-lock.yaml`

</details>

<details>
<summary>📒 Files selected for processing (7)</summary>

* `.changeset/fruity-showers-count.md` (1 hunks)
* `.changeset/polite-books-double.md` (1 hunks)
* `.changeset/weak-peas-laugh.md` (1 hunks)
* `docs/astro.config.ts` (1 hunks)
* `docs/src/content/docs/customization.mdx` (1 hunks)
* `packages/starlight-nextjs-theme/package.json` (1 hunks)
* `packages/starlight-nextjs-theme/styles.css` (1 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🪛 LanguageTool</summary>

<details>
<summary>.changeset/fruity-showers-count.md</summary>

[style] ~5-~5: Consider removing “of” to be more concise
Context: ...rlight-nextjs-theme': minor ---  Groups all of the Starlight NextJS theme CSS declarations...

(ALL_OF_THE)

---

[uncategorized] ~5-~5: The official spelling of this programming framework is “Next.js”.
Context: ... minor ---  Groups all of the Starlight NextJS theme CSS declarations into a single `n...

(NODE_JS)

---

[uncategorized] ~5-~5: The official spelling of this programming framework is “Next.js”.
Context: ...JS theme CSS declarations into a single `nextjs` [cascade layer](https://developer.mozi...

(NODE_JS)

---

[uncategorized] ~7-~7: The official spelling of this programming framework is “Next.js”.
Context: ...r easier customization of the Starlight NextJS theme CSS as any custom unlayered CSS w...

(NODE_JS)

---

[uncategorized] ~7-~7: Possible missing comma found.
Context: ...omization of the Starlight NextJS theme CSS as any custom unlayered CSS will overri...

(AI_HYDRA_LEO_MISSING_COMMA)

---

[uncategorized] ~7-~7: The official spelling of this programming framework is “Next.js”.
Context: ...nes used by Starlight and the Starlight NextJS theme.  Make sure to check your site’s ...

(NODE_JS)

</details>
<details>
<summary>docs/src/content/docs/customization.mdx</summary>

[uncategorized] ~8-~8: The official spelling of this programming framework is “Next.js”.
Context: ...Starlight site when using the Starlight NextJS theme, you can providing additional CSS...

(NODE_JS)

---

[uncategorized] ~8-~8: This verb may not be in the correct form. Consider using a different form for this context.
Context: ...ing the Starlight NextJS theme, you can providing additional CSS files to modify or exten...

(AI_EN_LECTOR_REPLACEMENT_VERB_FORM)

---

[uncategorized] ~8-~8: The official spelling of this programming framework is “Next.js”.
Context: ... extend the Starlight and the Starlight NextJS theme default styles.  [Learn more abou...

(NODE_JS)

---

[uncategorized] ~14-~14: The official spelling of this programming framework is “Next.js”.
Context: ...e layers  Like Starlight, the Starlight NextJS theme uses [cascade layers](https://dev...

(NODE_JS)

---

[uncategorized] ~16-~16: The official spelling of this programming framework is “Next.js”.
Context: ...default styles from the `starlight` and `nextjs` layers.  If you are using cascade laye...

(NODE_JS)

---

[uncategorized] ~18-~18: The official spelling of this programming framework is “Next.js”.
Context: ...relative to the Starlight and Starlight NextJS theme styles:  ```css "starlight" "next...

(NODE_JS)

---

[uncategorized] ~25-~25: The official spelling of this programming framework is “Next.js”.
Context: ... before all the Starlight and Starlight NextJS theme layers, and another named `my-ove...

(NODE_JS)

---

[uncategorized] ~25-~25: The official spelling of this programming framework is “Next.js”.
Context: ...plied after all Starlight and Starlight NextJS theme layers. Any styles in the `my-ove...

(NODE_JS)

---

[uncategorized] ~26-~26: The official spelling of this programming framework is “Next.js”.
Context: ...edence over the Starlight and Starlight NextJS theme styles, but Starlight or the Star...

(NODE_JS)

---

[uncategorized] ~26-~26: The official spelling of this programming framework is “Next.js”.
Context: ... styles, but Starlight or the Starlight NextJS theme could still change styles set in ...

(NODE_JS)

</details>

</details>

</details>

<details>
<summary>🔇 Additional comments (6)</summary><blockquote>

<details>
<summary>.changeset/polite-books-double.md (1)</summary>

`1-5`: **Looks good - clear changeset message for the patch.**

The changeset message clearly explains the purpose of this patch: fixing banner positioning when displayed on pages with a sidebar. This aligns well with the changes mentioned in the AI summary.

</details>
<details>
<summary>.changeset/weak-peas-laugh.md (1)</summary>

`1-11`: **Well-documented breaking change with clear upgrade instructions.**

The changeset correctly identifies this as a minor version bump with a breaking change (raising minimum Starlight version to 0.34.0) and provides clear upgrade instructions. This is good practice for helping users transition smoothly.

</details>
<details>
<summary>packages/starlight-nextjs-theme/package.json (2)</summary>

`31-32`: **Dependency versions updated correctly.**

The devDependencies for `@astrojs/starlight` and `astro` have been bumped to newer versions, which supports the changes being made in this PR.

---

`35-35`: **Peer dependency update aligns with breaking change.**

The minimum required version of `@astrojs/starlight` has been raised from `>=0.30` to `>=0.34`, which matches the breaking change mentioned in the changeset file.

</details>
<details>
<summary>docs/astro.config.ts (1)</summary>

`22-22`: **Sidebar updated to include new customization docs.**

Adding "customization" to the sidebar is appropriate since this PR introduces CSS cascade layers for better theme customization, and according to the AI summary, new documentation has been added to explain this feature.

</details>
<details>
<summary>packages/starlight-nextjs-theme/styles.css (1)</summary>

`1-3`: **Encapsulate theme styles using CSS cascade layers**  
The new `@layer starlight, nextjs;` declaration paired with wrapping all existing rules inside `@layer nextjs { … }` precisely scopes your theme’s CSS and establishes predictable override behavior without altering any selectors or properties.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T19:04:41Z
user: login: coderabbitai[bot]
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-16T19:14:41Z

Review comments:
diff_hunk: @@ -0,0 +1,9 @@
+---
+'starlight-nextjs-theme': minor
+---
+
+Groups all of the Starlight NextJS theme CSS declarations into a single `nextjs` [cascade layer](https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Styling_basics/Cascade_layers).
path: .changeset/fruity-showers-count.md
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Simplify phrasing and use official framework name**  
Remove the unnecessary “of” and update “NextJS” to “Next.js” for accuracy and brevity.  
  
```diff
- Groups all of the Starlight NextJS theme CSS declarations into a single `nextjs` layer.
+ Groups all Starlight Next.js theme CSS declarations into a single `nextjs` layer.
```


> Committable suggestion skipped: line range outside the PR's diff.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[style] ~5-~5: Consider removing “of” to be more concise
Context: ...rlight-nextjs-theme': minor ---  Groups all of the Starlight NextJS theme CSS declarations...

(ALL_OF_THE)

---

[uncategorized] ~5-~5: The official spelling of this programming framework is “Next.js”.
Context: ... minor ---  Groups all of the Starlight NextJS theme CSS declarations into a single `n...

(NODE_JS)

---

[uncategorized] ~5-~5: The official spelling of this programming framework is “Next.js”.
Context: ...JS theme CSS declarations into a single `nextjs` [cascade layer](https://developer.mozi...

(NODE_JS)

</details>

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In the .changeset/fruity-showers-count.md file at line 5, simplify the phrasing
by removing the unnecessary word "of" and correct the framework name from
"NextJS" to the official "Next.js" to improve accuracy and brevity.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-16T19:04:40Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,9 @@
+---
+'starlight-nextjs-theme': minor
+---
+
+Groups all of the Starlight NextJS theme CSS declarations into a single `nextjs` [cascade layer](https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Styling_basics/Cascade_layers).
+
+This change aligns with the Starlight CSS architecture and allows for easier customization of the Starlight NextJS theme CSS as any custom unlayered CSS will override the default styles. If you are using cascade layers in your custom CSS, you can use the [`@layer`](https://developer.mozilla.org/en-US/docs/Web/CSS/@layer) CSS at-rule to define the order of precedence for different layers including the ones used by Starlight and the Starlight NextJS theme.
path: .changeset/fruity-showers-count.md
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Fix grammar, add missing comma, and correct framework name**  
Insert a comma for readability and use the official “Next.js” spelling. Also restructure slightly for clarity.  
  
```diff
- This change aligns with the Starlight CSS architecture and allows for easier customization of the Starlight NextJS theme CSS as any custom unlayered CSS will override the default styles. If you are using cascade layers in your custom CSS, you can use the [`@layer`](https://developer.mozilla.org/en-US/docs/Web/CSS/@layer) CSS at-rule to define the order of precedence for different layers including the ones used by Starlight and the Starlight NextJS theme.
+ This change aligns with the Starlight CSS architecture, allowing easier customization of the Starlight Next.js theme CSS; any custom unlayered CSS will override the default styles. If you are using cascade layers in your custom CSS, you can use the [`@layer`](https://developer.mozilla.org/en-US/docs/Web/CSS/@layer) at-rule to define the order of precedence for different layers, including those used by Starlight and the Starlight Next.js theme.
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
This change aligns with the Starlight CSS architecture, allowing easier customization of the Starlight Next.js theme CSS; any custom unlayered CSS will override the default styles. If you are using cascade layers in your custom CSS, you can use the [`@layer`](https://developer.mozilla.org/en-US/docs/Web/CSS/@layer) at-rule to define the order of precedence for different layers, including those used by Starlight and the Starlight Next.js theme.
```

</details>

<!-- suggestion_end -->

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[uncategorized] ~7-~7: The official spelling of this programming framework is “Next.js”.
Context: ...r easier customization of the Starlight NextJS theme CSS as any custom unlayered CSS w...

(NODE_JS)

---

[uncategorized] ~7-~7: Possible missing comma found.
Context: ...omization of the Starlight NextJS theme CSS as any custom unlayered CSS will overri...

(AI_HYDRA_LEO_MISSING_COMMA)

---

[uncategorized] ~7-~7: The official spelling of this programming framework is “Next.js”.
Context: ...nes used by Starlight and the Starlight NextJS theme.  Make sure to check your site’s ...

(NODE_JS)

</details>

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In the .changeset/fruity-showers-count.md file at line 7, fix the grammar by
adding a comma after "Starlight CSS architecture" for better readability,
correct the framework name from "NextJS" to the official "Next.js" spelling, and
slightly restructure the sentence to improve clarity while preserving the
original meaning.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-16T19:04:40Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,26 @@
+---
+title: Customization
+description: Learn how to customize your Starlight site and the Starlight NextJS theme with custom CSS.
+---
+
+## Custom CSS
+
+To customize the styles applied to your Starlight site when using the Starlight NextJS theme, you can providing additional CSS files to modify or extend the Starlight and the Starlight NextJS theme default styles.
path: docs/src/content/docs/customization.mdx
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Fix grammar and framework name**  
The sentence has a verb form issue and uses the unofficial “NextJS.” Update to “provide” and “Next.js.”  
  
```diff
- To customize the styles applied to your Starlight site when using the Starlight NextJS theme, you can providing additional CSS files to modify or extend the Starlight and the Starlight NextJS theme default styles.
+ To customize the styles applied to your Starlight site when using the Starlight Next.js theme, you can provide additional CSS files to modify or extend the Starlight and Starlight Next.js theme’s default styles.
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
To customize the styles applied to your Starlight site when using the Starlight Next.js theme, you can provide additional CSS files to modify or extend the Starlight and Starlight Next.js theme’s default styles.
```

</details>

<!-- suggestion_end -->

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[uncategorized] ~8-~8: The official spelling of this programming framework is “Next.js”.
Context: ...Starlight site when using the Starlight NextJS theme, you can providing additional CSS...

(NODE_JS)

---

[uncategorized] ~8-~8: This verb may not be in the correct form. Consider using a different form for this context.
Context: ...ing the Starlight NextJS theme, you can providing additional CSS files to modify or exten...

(AI_EN_LECTOR_REPLACEMENT_VERB_FORM)

---

[uncategorized] ~8-~8: The official spelling of this programming framework is “Next.js”.
Context: ... extend the Starlight and the Starlight NextJS theme default styles.  [Learn more abou...

(NODE_JS)

</details>

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/src/content/docs/customization.mdx at line 8, fix the grammar by
changing "providing" to "provide" and update the framework name from "NextJS" to
the correct "Next.js" to ensure proper verb usage and official naming.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-16T19:04:40Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,26 @@
+---
+title: Customization
+description: Learn how to customize your Starlight site and the Starlight NextJS theme with custom CSS.
+---
+
+## Custom CSS
+
+To customize the styles applied to your Starlight site when using the Starlight NextJS theme, you can providing additional CSS files to modify or extend the Starlight and the Starlight NextJS theme default styles.
+
+[Learn more about custom CSS in the Starlight documentation.](https://starlight.astro.build/guides/css-and-tailwind/#custom-css-styles)
+
+## Cascade layers
+
+Like Starlight, the Starlight NextJS theme uses [cascade layers](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Cascade_layers) internally to manage the order of its styles.
+This ensures a predictable CSS order and allows for simpler overrides.
+Any custom unlayered CSS will override the default styles from the `starlight` and `nextjs` layers.
+
+If you are using cascade layers, you can use [`@layer`](https://developer.mozilla.org/en-US/docs/Web/CSS/@layer) in your [custom CSS](https://starlight.astro.build/guides/css-and-tailwind/#custom-css-styles) to define the order of precedence for different layers relative to the Starlight and Starlight NextJS theme styles:
path: docs/src/content/docs/customization.mdx
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Use official “Next.js” spelling throughout**  
For consistency and accuracy, replace all instances of “NextJS” with “Next.js” in this section.  
  
```diff
- Like Starlight, the Starlight NextJS theme uses [cascade layers](…).
+ Like Starlight, the Starlight Next.js theme uses [cascade layers](…).

- Any custom unlayered CSS will override the default styles from the `starlight` and `nextjs` layers.
+ Any custom unlayered CSS will override the default styles from the `starlight` and `nextjs` layers in the Starlight Next.js theme.
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
Like Starlight, the Starlight Next.js theme uses [cascade layers](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Cascade_layers) internally to manage the order of its styles.
This ensures a predictable CSS order and allows for simpler overrides.
Any custom unlayered CSS will override the default styles from the `starlight` and `nextjs` layers in the Starlight Next.js theme.

If you are using cascade layers, you can use [`@layer`](https://developer.mozilla.org/en-US/docs/Web/CSS/@layer) in your [custom CSS](https://starlight.astro.build/guides/css-and-tailwind/#custom-css-styles) to define the order of precedence for different layers relative to the Starlight and Starlight NextJS theme styles:
```

</details>

<!-- suggestion_end -->

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[uncategorized] ~14-~14: The official spelling of this programming framework is “Next.js”.
Context: ...e layers  Like Starlight, the Starlight NextJS theme uses [cascade layers](https://dev...

(NODE_JS)

---

[uncategorized] ~16-~16: The official spelling of this programming framework is “Next.js”.
Context: ...default styles from the `starlight` and `nextjs` layers.  If you are using cascade laye...

(NODE_JS)

---

[uncategorized] ~18-~18: The official spelling of this programming framework is “Next.js”.
Context: ...relative to the Starlight and Starlight NextJS theme styles:  ```css "starlight" "next...

(NODE_JS)

</details>

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In docs/src/content/docs/customization.mdx around lines 14 to 18, replace all
occurrences of "NextJS" with the official spelling "Next.js" to maintain
consistency and accuracy in the documentation.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-16T19:04:40Z
author_association: CONTRIBUTOR

PR comments:
user: login: changeset-bot[bot]
created_at: 2025-05-16T17:52:37Z
body: ###  🦋  Changeset detected

Latest commit: 43f56f9c8e76fe2992fa2e2d5f991bedbd0b93ad

**The changes in this PR will be included in the next version bump.**



Not sure what this means? [Click here  to learn what changesets are](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md).

[Click here if you're a maintainer who wants to add another changeset to this PR](https://github.com/trueberryless-org/starlight-nextjs-theme/new/cascade-layers?filename=.changeset/purple-bottles-attend.md&value=---%0A%22%40fake-scope%2Ffake-pkg%22%3A%20patch%0A---%0A%0Afeat%3A%20use%20cascade%20layers%0A)

<details><summary>💥 An error occurred when fetching the changed packages and changesets in this PR</summary>

```
Some errors occurred when validating the changesets config:
The package or glob expression "starlight-nextjs-theme-docs" is specified in the `ignore` option but it is not found in the project. You may have misspelled the package name or provided an invalid glob expression. Note that glob expressions must be defined according to https://www.npmjs.com/package/micromatch.
```

</details>

author_association: NONE
user: login: netlify[bot]
created_at: 2025-05-16T17:52:38Z
body: ### <span aria-hidden="true">✅</span> Deploy Preview for *starlight-nextjs-theme* ready!


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | 43f56f9c8e76fe2992fa2e2d5f991bedbd0b93ad |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/projects/starlight-nextjs-theme/deploys/6827918e77588f000883bfb4 |
|<span aria-hidden="true">😎</span> Deploy Preview | [https://deploy-preview-14--starlight-nextjs-theme.netlify.app](https://deploy-preview-14--starlight-nextjs-theme.netlify.app) |
|<span aria-hidden="true">📱</span> Preview on mobile | <details><summary> Toggle QR Code... </summary><br /><br />![QR Code](https://app.netlify.com/qr-code/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJodHRwczovL2RlcGxveS1wcmV2aWV3LTE0LS1zdGFybGlnaHQtbmV4dGpzLXRoZW1lLm5ldGxpZnkuYXBwIn0.qywYvu7zFnnM5cKdQNcfsQo6YVac5ugDCjmbJPq_S04)<br /><br />_Use your smartphone camera to open QR code link._</details> |
---
<!-- [starlight-nextjs-theme Preview](https://deploy-preview-14--starlight-nextjs-theme.netlify.app) -->
_To edit notification comments on pull requests, go to your [Netlify project configuration](https://app.netlify.com/projects/starlight-nextjs-theme/configuration/notifications#deploy-notifications)._
author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-05-16T17:52:40Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

This update introduces CSS cascade layers to the Starlight NextJS theme, encapsulating all theme styles within a new `nextjs` layer. Documentation is added to explain customization using CSS layers. The sidebar configuration is updated to include a new "customization" item. Dependency versions are bumped, banner layout and nested Expressive Code settings issues are fixed, and the minimum Starlight version requirement is raised to 0.34.0.

## Changes

| File(s)                                                                                 | Change Summary                                                                                                                                                                                                                   |
|-----------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| .changeset/fruity-showers-count.md<br>.changeset/polite-books-double.md<br>.changeset/weak-peas-laugh.md<br>.changeset/wild-papers-ask.md | Adds changelog entries: introducing the `nextjs` CSS cascade layer, fixing banner layout with sidebar, raising minimum Starlight version to 0.34.0, and fixing nested Expressive Code settings application.                      |
| docs/astro.config.ts                                                                    | Updates sidebar configuration: replaces object array with string array, adds "customization" as a sidebar item under "Start Here".                                                                                               |
| docs/src/content/docs/customization.mdx                                                 | Adds a new documentation page detailing how to customize Starlight and the NextJS theme using custom CSS and cascade layers, including usage examples and explanations.                                                          |
| docs/src/content/docs/index.mdx                                                        | Adds an "Examples" action button with a right-arrow icon linking to "/examples/asides/" on the documentation index page hero section.                                                                                            |
| packages/starlight-nextjs-theme/package.json                                            | Bumps `@astrojs/starlight` and `astro` dependency versions; raises peer dependency requirement for Starlight to >=0.34.0.                                                                                                       |
| packages/starlight-nextjs-theme/styles.css                                              | Wraps all CSS rules in `@layer starlight, nextjs;` and `@layer nextjs { ... }`, introducing CSS cascade layers for the theme without changing style rules or selectors.                                                          |
| packages/starlight-nextjs-theme/index.ts                                               | Renames hook parameter from `starlightConfig` to `config`; refactors Expressive Code config normalization and merging of style overrides to be more explicit and structured, ensuring user overrides take precedence.             |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant CustomCSS
    participant NextJSThemeCSS
    participant StarlightCSS

    User->>CustomCSS: Add custom styles (optionally in layers)
    CustomCSS-->>NextJSThemeCSS: Custom CSS overrides theme styles (if unlayered or ordered after)
    NextJSThemeCSS->>StarlightCSS: NextJS theme styles are layered after Starlight base
    Note right of User: CSS cascade layers determine style precedence
```

## Possibly related PRs

- trueberryless-org/starlight-nextjs-theme#11: Modifies `.sl-banner` CSS rules to fix layout with sidebar; both PRs affect banner styling and the same CSS file, making them directly related.

## Poem

> In layers of CSS, so neat and so new,  
> The NextJS theme dons a fashionable hue.  
> Sidebar and banner now play nice and fair,  
> Customizations explained with the utmost care.  
> With version bumps and docs in the mix,  
> This rabbit approves these stylish new tricks!  
> 🐇✨

<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: ASSERTIVE**
**Plan: Pro**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 4a3ba257a0f60652fe7eaa049d2dc800cfee7b90 and 43f56f9c8e76fe2992fa2e2d5f991bedbd0b93ad.

</details>

<details>
<summary>📒 Files selected for processing (4)</summary>

* `.changeset/wild-papers-ask.md` (1 hunks)
* `docs/src/content/docs/index.mdx` (1 hunks)
* `packages/starlight-nextjs-theme/index.ts` (2 hunks)
* `packages/starlight-nextjs-theme/package.json` (1 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

<details>
<summary>.changeset/wild-papers-ask.md</summary>

5-5: First line in a file should be a top-level heading
null

(MD041, first-line-heading, first-line-h1)

</details>

</details>

</details>

<details>
<summary>🔇 Additional comments (6)</summary><blockquote>

<details>
<summary>docs/src/content/docs/index.mdx (1)</summary>

`25-28`: **Great addition of the Examples button!**

Adding this link to examples improves navigation and makes it easier for users to discover example content. The consistent styling with the existing "Get Started" button creates good visual cohesion.

</details>
<details>
<summary>packages/starlight-nextjs-theme/package.json (1)</summary>

`31-32`: **Important dependency updates with increased minimum requirements**

The bump in Starlight's minimum required version from 0.30 to 0.34 is significant and will require users to update their Starlight installation. This appears to be intentional and necessary to support the new CSS cascade layer features and other improvements in this PR.



Also applies to: 35-35

</details>
<details>
<summary>packages/starlight-nextjs-theme/index.ts (3)</summary>

`7-12`: **Improved parameter naming and robust expressiveCode config normalization**

Renaming from `starlightConfig` to `config` enhances readability. The new normalization logic explicitly handles both boolean and object values for the expressiveCode configuration, making the code more robust.

---

`15-15`: **Good use of spread operator for customCss**

This ensures user-defined custom CSS files are included first, maintaining proper cascade order while preserving user customizations.

---

`37-42`: **Enhanced configuration merging structure**

The revised configuration merging properly handles user overrides, ensuring they take precedence over default values. This is especially important for nested properties like styleOverrides and frames. The explicit ordering makes the code more maintainable and predictable.



Also applies to: 45-45, 52-52

</details>
<details>
<summary>.changeset/wild-papers-ask.md (1)</summary>

`1-5`: **Good changeset documentation**

The changeset correctly documents the fix for nested Expressive Code settings, which aligns with the implementation changes in index.ts. This will be useful information for users when the next release is published.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

5-5: First line in a file should be a top-level heading
null

(MD041, first-line-heading, first-line-h1)

</details>

</details>

</details>

</blockquote></details>

</details>
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=trueberryless-org/starlight-nextjs-theme&utm_content=14):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR