Showing preview only (4,147K chars total). Download the full file or copy to clipboard to get everything.
Repository: withastro/starlight
Branch: main
Commit: d87102166683
Files: 874
Total size: 3.8 MB
Directory structure:
gitextract_q6rx5rxj/
├── .changeset/
│ ├── README.md
│ └── config.json
├── .devcontainer/
│ ├── Dockerfile
│ ├── devcontainer.json
│ └── welcome-message.txt
├── .git-blame-ignore-revs
├── .github/
│ ├── DISCUSSION_TEMPLATE/
│ │ ├── docs-suggestions.yml
│ │ └── feature-requests.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── ---01-bug-report.yml
│ │ ├── ---02-docs-issue.yml
│ │ └── config.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── labeler.yml
│ ├── renovate.json5
│ └── workflows/
│ ├── ci.yml
│ ├── congratsbot.yml
│ ├── file-icons.yml
│ ├── format.yml
│ ├── lunaria.yml
│ ├── pr-labeler.yml
│ ├── preview-release.yml
│ ├── release.yml
│ ├── size-limit.yml
│ └── welcome-bot.yml
├── .gitignore
├── .npmrc
├── .prettierignore
├── .prettierrc
├── .vscode/
│ ├── extensions.json
│ └── launch.json
├── CONTRIBUTING.md
├── LICENSE
├── docs/
│ ├── .gitignore
│ ├── README.md
│ ├── __a11y__/
│ │ ├── docs.test.ts
│ │ └── test-utils.ts
│ ├── astro.config.mjs
│ ├── grammars/
│ │ ├── README.md
│ │ ├── generate.mjs
│ │ └── markdoc.tmLanguage.json
│ ├── lunaria/
│ │ ├── components.ts
│ │ ├── renderer.config.ts
│ │ └── styles.css
│ ├── lunaria.config.json
│ ├── package.json
│ ├── playwright.config.ts
│ ├── public/
│ │ ├── _headers
│ │ └── _redirects
│ ├── src/
│ │ ├── assets/
│ │ │ ├── landing.css
│ │ │ └── robots.txt
│ │ ├── components/
│ │ │ ├── about-astro.astro
│ │ │ ├── component-preview.astro
│ │ │ ├── fluid-grid.astro
│ │ │ ├── icons-list.astro
│ │ │ ├── languages-list.astro
│ │ │ ├── media-card.astro
│ │ │ ├── showcase-card.astro
│ │ │ ├── showcase-sites.astro
│ │ │ ├── sidebar-preview.astro
│ │ │ ├── social-links-type.astro
│ │ │ ├── testimonial-grid.astro
│ │ │ ├── testimonial.astro
│ │ │ ├── theme-designer/
│ │ │ │ ├── atom.ts
│ │ │ │ ├── color-editor.astro
│ │ │ │ ├── color-lib.ts
│ │ │ │ ├── contrast-level.astro
│ │ │ │ ├── palette.astro
│ │ │ │ ├── presets.astro
│ │ │ │ ├── preview.astro
│ │ │ │ ├── store.ts
│ │ │ │ └── value-slider.astro
│ │ │ ├── theme-designer.astro
│ │ │ ├── theme-grid.astro
│ │ │ ├── theme-image.astro
│ │ │ ├── ui-strings-list.astro
│ │ │ ├── youtube-card.astro
│ │ │ └── youtube-grid.astro
│ │ ├── content/
│ │ │ ├── docs/
│ │ │ │ ├── 404.md
│ │ │ │ ├── components/
│ │ │ │ │ ├── asides.mdx
│ │ │ │ │ ├── badges.mdx
│ │ │ │ │ ├── card-grids.mdx
│ │ │ │ │ ├── cards.mdx
│ │ │ │ │ ├── code.mdx
│ │ │ │ │ ├── file-tree.mdx
│ │ │ │ │ ├── icons.mdx
│ │ │ │ │ ├── link-buttons.mdx
│ │ │ │ │ ├── link-cards.mdx
│ │ │ │ │ ├── steps.mdx
│ │ │ │ │ ├── tabs.mdx
│ │ │ │ │ └── using-components.mdx
│ │ │ │ ├── da/
│ │ │ │ │ ├── 404.md
│ │ │ │ │ └── index.mdx
│ │ │ │ ├── de/
│ │ │ │ │ ├── 404.md
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── asides.mdx
│ │ │ │ │ │ ├── badges.mdx
│ │ │ │ │ │ ├── card-grids.mdx
│ │ │ │ │ │ ├── cards.mdx
│ │ │ │ │ │ ├── code.mdx
│ │ │ │ │ │ ├── file-tree.mdx
│ │ │ │ │ │ ├── icons.mdx
│ │ │ │ │ │ ├── link-buttons.mdx
│ │ │ │ │ │ ├── link-cards.mdx
│ │ │ │ │ │ ├── steps.mdx
│ │ │ │ │ │ ├── tabs.mdx
│ │ │ │ │ │ └── using-components.mdx
│ │ │ │ │ ├── environmental-impact.md
│ │ │ │ │ ├── getting-started.mdx
│ │ │ │ │ ├── guides/
│ │ │ │ │ │ ├── authoring-content.mdx
│ │ │ │ │ │ ├── css-and-tailwind.mdx
│ │ │ │ │ │ ├── customization.mdx
│ │ │ │ │ │ ├── i18n.mdx
│ │ │ │ │ │ ├── overriding-components.mdx
│ │ │ │ │ │ ├── pages.mdx
│ │ │ │ │ │ ├── project-structure.mdx
│ │ │ │ │ │ ├── route-data.mdx
│ │ │ │ │ │ ├── sidebar.mdx
│ │ │ │ │ │ └── site-search.mdx
│ │ │ │ │ ├── index.mdx
│ │ │ │ │ ├── manual-setup.mdx
│ │ │ │ │ ├── reference/
│ │ │ │ │ │ ├── configuration.mdx
│ │ │ │ │ │ ├── frontmatter.md
│ │ │ │ │ │ ├── icons.mdx
│ │ │ │ │ │ ├── overrides.md
│ │ │ │ │ │ ├── plugins.md
│ │ │ │ │ │ └── route-data.mdx
│ │ │ │ │ └── resources/
│ │ │ │ │ ├── community-content.mdx
│ │ │ │ │ ├── plugins.mdx
│ │ │ │ │ ├── showcase.mdx
│ │ │ │ │ └── themes.mdx
│ │ │ │ ├── environmental-impact.md
│ │ │ │ ├── es/
│ │ │ │ │ ├── 404.md
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── asides.mdx
│ │ │ │ │ │ ├── badges.mdx
│ │ │ │ │ │ ├── card-grids.mdx
│ │ │ │ │ │ ├── cards.mdx
│ │ │ │ │ │ ├── code.mdx
│ │ │ │ │ │ ├── file-tree.mdx
│ │ │ │ │ │ ├── icons.mdx
│ │ │ │ │ │ ├── link-buttons.mdx
│ │ │ │ │ │ ├── link-cards.mdx
│ │ │ │ │ │ ├── steps.mdx
│ │ │ │ │ │ ├── tabs.mdx
│ │ │ │ │ │ └── using-components.mdx
│ │ │ │ │ ├── environmental-impact.md
│ │ │ │ │ ├── getting-started.mdx
│ │ │ │ │ ├── guides/
│ │ │ │ │ │ ├── authoring-content.mdx
│ │ │ │ │ │ ├── css-and-tailwind.mdx
│ │ │ │ │ │ ├── customization.mdx
│ │ │ │ │ │ ├── i18n.mdx
│ │ │ │ │ │ ├── overriding-components.mdx
│ │ │ │ │ │ ├── pages.mdx
│ │ │ │ │ │ ├── project-structure.mdx
│ │ │ │ │ │ ├── route-data.mdx
│ │ │ │ │ │ ├── sidebar.mdx
│ │ │ │ │ │ └── site-search.mdx
│ │ │ │ │ ├── index.mdx
│ │ │ │ │ ├── manual-setup.mdx
│ │ │ │ │ ├── reference/
│ │ │ │ │ │ ├── configuration.mdx
│ │ │ │ │ │ ├── frontmatter.md
│ │ │ │ │ │ ├── icons.mdx
│ │ │ │ │ │ ├── overrides.md
│ │ │ │ │ │ ├── plugins.md
│ │ │ │ │ │ └── route-data.mdx
│ │ │ │ │ └── resources/
│ │ │ │ │ ├── community-content.mdx
│ │ │ │ │ ├── plugins.mdx
│ │ │ │ │ ├── showcase.mdx
│ │ │ │ │ └── themes.mdx
│ │ │ │ ├── fr/
│ │ │ │ │ ├── 404.md
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── asides.mdx
│ │ │ │ │ │ ├── badges.mdx
│ │ │ │ │ │ ├── card-grids.mdx
│ │ │ │ │ │ ├── cards.mdx
│ │ │ │ │ │ ├── code.mdx
│ │ │ │ │ │ ├── file-tree.mdx
│ │ │ │ │ │ ├── icons.mdx
│ │ │ │ │ │ ├── link-buttons.mdx
│ │ │ │ │ │ ├── link-cards.mdx
│ │ │ │ │ │ ├── steps.mdx
│ │ │ │ │ │ ├── tabs.mdx
│ │ │ │ │ │ └── using-components.mdx
│ │ │ │ │ ├── environmental-impact.md
│ │ │ │ │ ├── getting-started.mdx
│ │ │ │ │ ├── guides/
│ │ │ │ │ │ ├── authoring-content.mdx
│ │ │ │ │ │ ├── css-and-tailwind.mdx
│ │ │ │ │ │ ├── customization.mdx
│ │ │ │ │ │ ├── i18n.mdx
│ │ │ │ │ │ ├── overriding-components.mdx
│ │ │ │ │ │ ├── pages.mdx
│ │ │ │ │ │ ├── project-structure.mdx
│ │ │ │ │ │ ├── route-data.mdx
│ │ │ │ │ │ ├── sidebar.mdx
│ │ │ │ │ │ └── site-search.mdx
│ │ │ │ │ ├── index.mdx
│ │ │ │ │ ├── manual-setup.mdx
│ │ │ │ │ ├── reference/
│ │ │ │ │ │ ├── configuration.mdx
│ │ │ │ │ │ ├── frontmatter.md
│ │ │ │ │ │ ├── icons.mdx
│ │ │ │ │ │ ├── overrides.md
│ │ │ │ │ │ ├── plugins.md
│ │ │ │ │ │ └── route-data.mdx
│ │ │ │ │ └── resources/
│ │ │ │ │ ├── community-content.mdx
│ │ │ │ │ ├── plugins.mdx
│ │ │ │ │ ├── showcase.mdx
│ │ │ │ │ └── themes.mdx
│ │ │ │ ├── getting-started.mdx
│ │ │ │ ├── guides/
│ │ │ │ │ ├── authoring-content.mdx
│ │ │ │ │ ├── css-and-tailwind.mdx
│ │ │ │ │ ├── customization.mdx
│ │ │ │ │ ├── i18n.mdx
│ │ │ │ │ ├── overriding-components.mdx
│ │ │ │ │ ├── pages.mdx
│ │ │ │ │ ├── project-structure.mdx
│ │ │ │ │ ├── route-data.mdx
│ │ │ │ │ ├── sidebar.mdx
│ │ │ │ │ └── site-search.mdx
│ │ │ │ ├── hi/
│ │ │ │ │ ├── 404.md
│ │ │ │ │ ├── environmental-impact.md
│ │ │ │ │ ├── getting-started.mdx
│ │ │ │ │ └── index.mdx
│ │ │ │ ├── id/
│ │ │ │ │ ├── 404.md
│ │ │ │ │ ├── environmental-impact.md
│ │ │ │ │ ├── getting-started.mdx
│ │ │ │ │ └── index.mdx
│ │ │ │ ├── index.mdx
│ │ │ │ ├── it/
│ │ │ │ │ ├── 404.md
│ │ │ │ │ ├── environmental-impact.md
│ │ │ │ │ ├── getting-started.mdx
│ │ │ │ │ ├── index.mdx
│ │ │ │ │ └── resources/
│ │ │ │ │ ├── community-content.mdx
│ │ │ │ │ ├── plugins.mdx
│ │ │ │ │ └── showcase.mdx
│ │ │ │ ├── ja/
│ │ │ │ │ ├── 404.md
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── asides.mdx
│ │ │ │ │ │ ├── badges.mdx
│ │ │ │ │ │ ├── card-grids.mdx
│ │ │ │ │ │ ├── cards.mdx
│ │ │ │ │ │ ├── code.mdx
│ │ │ │ │ │ ├── file-tree.mdx
│ │ │ │ │ │ ├── icons.mdx
│ │ │ │ │ │ ├── link-buttons.mdx
│ │ │ │ │ │ ├── link-cards.mdx
│ │ │ │ │ │ ├── steps.mdx
│ │ │ │ │ │ ├── tabs.mdx
│ │ │ │ │ │ └── using-components.mdx
│ │ │ │ │ ├── environmental-impact.md
│ │ │ │ │ ├── getting-started.mdx
│ │ │ │ │ ├── guides/
│ │ │ │ │ │ ├── authoring-content.mdx
│ │ │ │ │ │ ├── css-and-tailwind.mdx
│ │ │ │ │ │ ├── customization.mdx
│ │ │ │ │ │ ├── i18n.mdx
│ │ │ │ │ │ ├── overriding-components.mdx
│ │ │ │ │ │ ├── pages.mdx
│ │ │ │ │ │ ├── project-structure.mdx
│ │ │ │ │ │ ├── route-data.mdx
│ │ │ │ │ │ ├── sidebar.mdx
│ │ │ │ │ │ └── site-search.mdx
│ │ │ │ │ ├── index.mdx
│ │ │ │ │ ├── manual-setup.mdx
│ │ │ │ │ ├── reference/
│ │ │ │ │ │ ├── configuration.mdx
│ │ │ │ │ │ ├── frontmatter.md
│ │ │ │ │ │ ├── icons.mdx
│ │ │ │ │ │ ├── overrides.md
│ │ │ │ │ │ ├── plugins.md
│ │ │ │ │ │ └── route-data.mdx
│ │ │ │ │ └── resources/
│ │ │ │ │ ├── community-content.mdx
│ │ │ │ │ ├── plugins.mdx
│ │ │ │ │ ├── showcase.mdx
│ │ │ │ │ └── themes.mdx
│ │ │ │ ├── ko/
│ │ │ │ │ ├── 404.md
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── asides.mdx
│ │ │ │ │ │ ├── badges.mdx
│ │ │ │ │ │ ├── card-grids.mdx
│ │ │ │ │ │ ├── cards.mdx
│ │ │ │ │ │ ├── code.mdx
│ │ │ │ │ │ ├── file-tree.mdx
│ │ │ │ │ │ ├── icons.mdx
│ │ │ │ │ │ ├── link-buttons.mdx
│ │ │ │ │ │ ├── link-cards.mdx
│ │ │ │ │ │ ├── steps.mdx
│ │ │ │ │ │ ├── tabs.mdx
│ │ │ │ │ │ └── using-components.mdx
│ │ │ │ │ ├── environmental-impact.md
│ │ │ │ │ ├── getting-started.mdx
│ │ │ │ │ ├── guides/
│ │ │ │ │ │ ├── authoring-content.mdx
│ │ │ │ │ │ ├── css-and-tailwind.mdx
│ │ │ │ │ │ ├── customization.mdx
│ │ │ │ │ │ ├── i18n.mdx
│ │ │ │ │ │ ├── overriding-components.mdx
│ │ │ │ │ │ ├── pages.mdx
│ │ │ │ │ │ ├── project-structure.mdx
│ │ │ │ │ │ ├── route-data.mdx
│ │ │ │ │ │ ├── sidebar.mdx
│ │ │ │ │ │ └── site-search.mdx
│ │ │ │ │ ├── index.mdx
│ │ │ │ │ ├── manual-setup.mdx
│ │ │ │ │ ├── reference/
│ │ │ │ │ │ ├── configuration.mdx
│ │ │ │ │ │ ├── frontmatter.md
│ │ │ │ │ │ ├── icons.mdx
│ │ │ │ │ │ ├── overrides.md
│ │ │ │ │ │ ├── plugins.md
│ │ │ │ │ │ └── route-data.mdx
│ │ │ │ │ └── resources/
│ │ │ │ │ ├── community-content.mdx
│ │ │ │ │ ├── plugins.mdx
│ │ │ │ │ ├── showcase.mdx
│ │ │ │ │ └── themes.mdx
│ │ │ │ ├── manual-setup.mdx
│ │ │ │ ├── pt-br/
│ │ │ │ │ ├── 404.md
│ │ │ │ │ ├── environmental-impact.md
│ │ │ │ │ ├── getting-started.mdx
│ │ │ │ │ ├── index.mdx
│ │ │ │ │ └── resources/
│ │ │ │ │ ├── community-content.mdx
│ │ │ │ │ ├── plugins.mdx
│ │ │ │ │ └── showcase.mdx
│ │ │ │ ├── pt-pt/
│ │ │ │ │ ├── 404.md
│ │ │ │ │ ├── environmental-impact.md
│ │ │ │ │ ├── getting-started.mdx
│ │ │ │ │ ├── index.mdx
│ │ │ │ │ └── resources/
│ │ │ │ │ ├── community-content.mdx
│ │ │ │ │ ├── plugins.mdx
│ │ │ │ │ └── showcase.mdx
│ │ │ │ ├── reference/
│ │ │ │ │ ├── configuration.mdx
│ │ │ │ │ ├── frontmatter.md
│ │ │ │ │ ├── icons.mdx
│ │ │ │ │ ├── overrides.md
│ │ │ │ │ ├── plugins.md
│ │ │ │ │ └── route-data.mdx
│ │ │ │ ├── resources/
│ │ │ │ │ ├── community-content.mdx
│ │ │ │ │ ├── plugins.mdx
│ │ │ │ │ ├── showcase.mdx
│ │ │ │ │ └── themes.mdx
│ │ │ │ ├── ru/
│ │ │ │ │ ├── 404.md
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── asides.mdx
│ │ │ │ │ │ ├── badges.mdx
│ │ │ │ │ │ ├── card-grids.mdx
│ │ │ │ │ │ ├── cards.mdx
│ │ │ │ │ │ ├── code.mdx
│ │ │ │ │ │ ├── file-tree.mdx
│ │ │ │ │ │ ├── icons.mdx
│ │ │ │ │ │ ├── link-buttons.mdx
│ │ │ │ │ │ ├── link-cards.mdx
│ │ │ │ │ │ ├── steps.mdx
│ │ │ │ │ │ ├── tabs.mdx
│ │ │ │ │ │ └── using-components.mdx
│ │ │ │ │ ├── environmental-impact.md
│ │ │ │ │ ├── getting-started.mdx
│ │ │ │ │ ├── guides/
│ │ │ │ │ │ ├── authoring-content.mdx
│ │ │ │ │ │ ├── css-and-tailwind.mdx
│ │ │ │ │ │ ├── customization.mdx
│ │ │ │ │ │ ├── i18n.mdx
│ │ │ │ │ │ ├── overriding-components.mdx
│ │ │ │ │ │ ├── pages.mdx
│ │ │ │ │ │ ├── project-structure.mdx
│ │ │ │ │ │ ├── route-data.mdx
│ │ │ │ │ │ ├── sidebar.mdx
│ │ │ │ │ │ └── site-search.mdx
│ │ │ │ │ ├── index.mdx
│ │ │ │ │ ├── manual-setup.mdx
│ │ │ │ │ ├── reference/
│ │ │ │ │ │ ├── configuration.mdx
│ │ │ │ │ │ ├── frontmatter.md
│ │ │ │ │ │ ├── icons.mdx
│ │ │ │ │ │ ├── overrides.md
│ │ │ │ │ │ ├── plugins.md
│ │ │ │ │ │ └── route-data.mdx
│ │ │ │ │ └── resources/
│ │ │ │ │ ├── community-content.mdx
│ │ │ │ │ ├── plugins.mdx
│ │ │ │ │ ├── showcase.mdx
│ │ │ │ │ └── themes.mdx
│ │ │ │ ├── tr/
│ │ │ │ │ ├── 404.md
│ │ │ │ │ ├── environmental-impact.md
│ │ │ │ │ ├── getting-started.mdx
│ │ │ │ │ ├── index.mdx
│ │ │ │ │ └── resources/
│ │ │ │ │ ├── community-content.mdx
│ │ │ │ │ └── showcase.mdx
│ │ │ │ ├── uk/
│ │ │ │ │ ├── 404.md
│ │ │ │ │ ├── getting-started.mdx
│ │ │ │ │ ├── index.mdx
│ │ │ │ │ └── manual-setup.mdx
│ │ │ │ └── zh-cn/
│ │ │ │ ├── 404.md
│ │ │ │ ├── components/
│ │ │ │ │ ├── asides.mdx
│ │ │ │ │ ├── badges.mdx
│ │ │ │ │ ├── card-grids.mdx
│ │ │ │ │ ├── cards.mdx
│ │ │ │ │ ├── code.mdx
│ │ │ │ │ ├── file-tree.mdx
│ │ │ │ │ ├── icons.mdx
│ │ │ │ │ ├── link-buttons.mdx
│ │ │ │ │ ├── link-cards.mdx
│ │ │ │ │ ├── steps.mdx
│ │ │ │ │ ├── tabs.mdx
│ │ │ │ │ └── using-components.mdx
│ │ │ │ ├── environmental-impact.md
│ │ │ │ ├── getting-started.mdx
│ │ │ │ ├── guides/
│ │ │ │ │ ├── authoring-content.mdx
│ │ │ │ │ ├── css-and-tailwind.mdx
│ │ │ │ │ ├── customization.mdx
│ │ │ │ │ ├── i18n.mdx
│ │ │ │ │ ├── overriding-components.mdx
│ │ │ │ │ ├── pages.mdx
│ │ │ │ │ ├── project-structure.mdx
│ │ │ │ │ ├── route-data.mdx
│ │ │ │ │ ├── sidebar.mdx
│ │ │ │ │ └── site-search.mdx
│ │ │ │ ├── index.mdx
│ │ │ │ ├── manual-setup.mdx
│ │ │ │ ├── reference/
│ │ │ │ │ ├── configuration.mdx
│ │ │ │ │ ├── frontmatter.md
│ │ │ │ │ ├── icons.mdx
│ │ │ │ │ ├── overrides.md
│ │ │ │ │ ├── plugins.md
│ │ │ │ │ └── route-data.mdx
│ │ │ │ └── resources/
│ │ │ │ ├── community-content.mdx
│ │ │ │ ├── plugins.mdx
│ │ │ │ ├── showcase.mdx
│ │ │ │ └── themes.mdx
│ │ │ └── i18n/
│ │ │ ├── de.json
│ │ │ ├── en.json
│ │ │ ├── fr.json
│ │ │ ├── ja.json
│ │ │ ├── ko.json
│ │ │ ├── ru.json
│ │ │ └── zh-CN.json
│ │ └── content.config.ts
│ └── tsconfig.json
├── eslint.config.mjs
├── examples/
│ ├── basics/
│ │ ├── .gitignore
│ │ ├── .vscode/
│ │ │ ├── extensions.json
│ │ │ └── launch.json
│ │ ├── README.md
│ │ ├── astro.config.mjs
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── content/
│ │ │ │ └── docs/
│ │ │ │ ├── guides/
│ │ │ │ │ └── example.md
│ │ │ │ ├── index.mdx
│ │ │ │ └── reference/
│ │ │ │ └── example.md
│ │ │ └── content.config.ts
│ │ └── tsconfig.json
│ ├── markdoc/
│ │ ├── .gitignore
│ │ ├── .vscode/
│ │ │ ├── extensions.json
│ │ │ └── launch.json
│ │ ├── README.md
│ │ ├── astro.config.mjs
│ │ ├── markdoc.config.mjs
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── content/
│ │ │ │ └── docs/
│ │ │ │ ├── guides/
│ │ │ │ │ └── example.mdoc
│ │ │ │ ├── index.mdoc
│ │ │ │ └── reference/
│ │ │ │ └── example.mdoc
│ │ │ └── content.config.ts
│ │ └── tsconfig.json
│ └── tailwind/
│ ├── .gitignore
│ ├── .vscode/
│ │ ├── extensions.json
│ │ └── launch.json
│ ├── README.md
│ ├── astro.config.mjs
│ ├── package.json
│ ├── src/
│ │ ├── content/
│ │ │ └── docs/
│ │ │ ├── guides/
│ │ │ │ └── example.md
│ │ │ ├── index.mdx
│ │ │ └── reference/
│ │ │ └── example.md
│ │ ├── content.config.ts
│ │ └── styles/
│ │ └── global.css
│ └── tsconfig.json
├── package.json
├── packages/
│ ├── docsearch/
│ │ ├── CHANGELOG.md
│ │ ├── DocSearch.astro
│ │ ├── README.md
│ │ ├── index.ts
│ │ ├── package.json
│ │ ├── schema.ts
│ │ ├── variables.css
│ │ └── virtual.d.ts
│ ├── file-icons-generator/
│ │ ├── config.ts
│ │ ├── index.ts
│ │ ├── package.json
│ │ └── utils/
│ │ ├── file.ts
│ │ ├── font.ts
│ │ └── seti.ts
│ ├── markdoc/
│ │ ├── .npmignore
│ │ ├── CHANGELOG.md
│ │ ├── Code.astro
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── markdoc.test-d.ts
│ │ ├── components.ts
│ │ ├── html.mjs
│ │ ├── index.mjs
│ │ └── package.json
│ ├── starlight/
│ │ ├── .gitignore
│ │ ├── .npmignore
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __e2e__/
│ │ │ ├── .gitignore
│ │ │ ├── basics.test.ts
│ │ │ ├── collection-config.test.ts
│ │ │ ├── fixtures/
│ │ │ │ ├── basics/
│ │ │ │ │ ├── astro.config.mjs
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src/
│ │ │ │ │ ├── components/
│ │ │ │ │ │ ├── PurpleCard.astro
│ │ │ │ │ │ └── Test.astro
│ │ │ │ │ ├── content/
│ │ │ │ │ │ ├── comments/
│ │ │ │ │ │ │ └── bob.mdx
│ │ │ │ │ │ ├── docs/
│ │ │ │ │ │ │ ├── anchor-heading-component.mdx
│ │ │ │ │ │ │ ├── anchor-heading.md
│ │ │ │ │ │ │ ├── head-propagation.mdx
│ │ │ │ │ │ │ ├── headings-banner.md
│ │ │ │ │ │ │ ├── headings.md
│ │ │ │ │ │ │ ├── tabs-nested.mdx
│ │ │ │ │ │ │ ├── tabs-unsynced.mdx
│ │ │ │ │ │ │ ├── tabs-variable-height.mdx
│ │ │ │ │ │ │ ├── tabs.mdx
│ │ │ │ │ │ │ ├── whitespaces.mdx
│ │ │ │ │ │ │ └── اللُّغَةُ-الْعَرَبِيَّةُ.md
│ │ │ │ │ │ └── reviews/
│ │ │ │ │ │ └── alice.mdx
│ │ │ │ │ ├── content.config.ts
│ │ │ │ │ └── pages/
│ │ │ │ │ ├── [...param].astro
│ │ │ │ │ ├── comments/
│ │ │ │ │ │ └── [...comment].astro
│ │ │ │ │ ├── markdown-page.md
│ │ │ │ │ ├── reviews/
│ │ │ │ │ │ └── [...review].astro
│ │ │ │ │ └── starlight-page-css-layer-order.astro
│ │ │ │ ├── custom src-dir/
│ │ │ │ │ ├── astro.config.mjs
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── www/
│ │ │ │ │ ├── content.config.ts
│ │ │ │ │ └── pages/
│ │ │ │ │ └── custom.astro
│ │ │ │ ├── git/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── astro.config.mjs
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src/
│ │ │ │ │ ├── content/
│ │ │ │ │ │ └── docs/
│ │ │ │ │ │ └── index.md
│ │ │ │ │ └── content.config.ts
│ │ │ │ ├── legacy-collections-backwards-compat/
│ │ │ │ │ ├── astro.config.mjs
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src/
│ │ │ │ │ ├── content/
│ │ │ │ │ │ └── config.ts
│ │ │ │ │ └── pages/
│ │ │ │ │ └── custom.astro
│ │ │ │ ├── no-node-builtins/
│ │ │ │ │ ├── astro.config.mjs
│ │ │ │ │ ├── package.json
│ │ │ │ │ └── src/
│ │ │ │ │ ├── content/
│ │ │ │ │ │ └── docs/
│ │ │ │ │ │ └── index.md
│ │ │ │ │ ├── content.config.ts
│ │ │ │ │ └── noNodeModule.ts
│ │ │ │ └── ssr/
│ │ │ │ ├── astro.config.mjs
│ │ │ │ ├── package.json
│ │ │ │ └── src/
│ │ │ │ ├── component/
│ │ │ │ │ └── ServerCheck.astro
│ │ │ │ ├── content/
│ │ │ │ │ └── docs/
│ │ │ │ │ ├── 404.mdx
│ │ │ │ │ ├── content.mdx
│ │ │ │ │ ├── demo.mdx
│ │ │ │ │ └── index.md
│ │ │ │ ├── content.config.ts
│ │ │ │ └── middleware.ts
│ │ │ ├── git.test.ts
│ │ │ ├── legacy-collections-backwards-compat.test.ts
│ │ │ ├── no-node-builtins.test.ts
│ │ │ ├── ssr.test.ts
│ │ │ └── test-utils.ts
│ │ ├── __tests__/
│ │ │ ├── absolute-favicon/
│ │ │ │ ├── absolute-favicon.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── basics/
│ │ │ │ ├── base.test.ts
│ │ │ │ ├── config-errors.test.ts
│ │ │ │ ├── config.test-d.ts
│ │ │ │ ├── config.test.ts
│ │ │ │ ├── format-canonical.test.ts
│ │ │ │ ├── format-path.test.ts
│ │ │ │ ├── git.test.ts
│ │ │ │ ├── i18n.test.ts
│ │ │ │ ├── localizedUrl.test.ts
│ │ │ │ ├── navigation-labels.test.ts
│ │ │ │ ├── navigation-order.test.ts
│ │ │ │ ├── navigation.test.ts
│ │ │ │ ├── omit-canonical.test.ts
│ │ │ │ ├── pagefind.test.ts
│ │ │ │ ├── pagination-with-base.test.ts
│ │ │ │ ├── route-data.test.ts
│ │ │ │ ├── routing.test.ts
│ │ │ │ ├── schema.test.ts
│ │ │ │ ├── sitemap.test.ts
│ │ │ │ ├── slugs.test.ts
│ │ │ │ ├── sorting.test.ts
│ │ │ │ ├── starlight-page-route-data-extend.test.ts
│ │ │ │ ├── starlight-page-route-data.test.ts
│ │ │ │ ├── toc.test.ts
│ │ │ │ ├── translations.test.ts
│ │ │ │ ├── user-config.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── build-format-file/
│ │ │ │ ├── navigation.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── edit-url/
│ │ │ │ ├── edit-url.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── git-utils.ts
│ │ │ ├── head/
│ │ │ │ ├── head.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── i18n/
│ │ │ │ ├── config.test.ts
│ │ │ │ ├── empty-src/
│ │ │ │ │ └── content/
│ │ │ │ │ └── i18n/
│ │ │ │ │ └── .gitkeep
│ │ │ │ ├── head.test.ts
│ │ │ │ ├── i18n.test.ts
│ │ │ │ ├── localizedUrl.test.ts
│ │ │ │ ├── malformed-json-src/
│ │ │ │ │ └── content/
│ │ │ │ │ └── i18n/
│ │ │ │ │ └── en.json
│ │ │ │ ├── malformed-yaml-src/
│ │ │ │ │ └── content/
│ │ │ │ │ └── i18n/
│ │ │ │ │ └── en.yml
│ │ │ │ ├── navigation-order.test.ts
│ │ │ │ ├── routing.test.ts
│ │ │ │ ├── src/
│ │ │ │ │ └── content/
│ │ │ │ │ └── i18n/
│ │ │ │ │ ├── en.json
│ │ │ │ │ └── fr.yml
│ │ │ │ ├── translations-ec.test.ts
│ │ │ │ ├── translations-fs.test.ts
│ │ │ │ ├── translations-with-user-config.test.ts
│ │ │ │ ├── translations.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── i18n-non-root-single-locale/
│ │ │ │ ├── config.test.ts
│ │ │ │ ├── i18n.test.ts
│ │ │ │ ├── localizedUrl.test.ts
│ │ │ │ ├── routing.test.ts
│ │ │ │ ├── slugs.test.ts
│ │ │ │ ├── src/
│ │ │ │ │ └── content/
│ │ │ │ │ └── i18n/
│ │ │ │ │ └── fr.json
│ │ │ │ ├── translations-fs.test.ts
│ │ │ │ ├── translations-with-user-config.test.ts
│ │ │ │ ├── translations.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── i18n-root-default-locale/
│ │ │ │ ├── i18n.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── i18n-root-locale/
│ │ │ │ ├── config.test.ts
│ │ │ │ ├── i18n.test.ts
│ │ │ │ ├── localizedUrl.test.ts
│ │ │ │ ├── routing.test.ts
│ │ │ │ ├── slugs.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── i18n-sidebar/
│ │ │ │ ├── i18n-sidebar-fallback-slug.test.ts
│ │ │ │ ├── i18n-sidebar.test.ts
│ │ │ │ ├── sidebar-internal-link-error.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── i18n-sidebar-badge-error/
│ │ │ │ ├── i18n-sidebar-badge-error.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── i18n-single-root-locale/
│ │ │ │ ├── config.test.ts
│ │ │ │ ├── i18n.test.ts
│ │ │ │ ├── routing.test.ts
│ │ │ │ ├── slugs.test.ts
│ │ │ │ ├── src/
│ │ │ │ │ └── content/
│ │ │ │ │ └── i18n/
│ │ │ │ │ └── fr.json
│ │ │ │ ├── translations-fs.test.ts
│ │ │ │ ├── translations-with-user-config.test.ts
│ │ │ │ ├── translations.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── middleware/
│ │ │ │ ├── middleware.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── plugins/
│ │ │ │ ├── config.test.ts
│ │ │ │ ├── integration.test.ts
│ │ │ │ ├── route-middleware.test.ts
│ │ │ │ ├── translations.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── remark-rehype/
│ │ │ │ ├── anchor-links.test.ts
│ │ │ │ ├── asides.test.ts
│ │ │ │ ├── code-rtl-support.test.ts
│ │ │ │ ├── rehype-file-tree.test.ts
│ │ │ │ ├── rehype-steps.test.ts
│ │ │ │ ├── rehype-tabs.test.ts
│ │ │ │ ├── remark-rehype.test.ts
│ │ │ │ ├── snapshots/
│ │ │ │ │ ├── file-tree-basic.html
│ │ │ │ │ ├── file-tree-comment-nodes.html
│ │ │ │ │ ├── file-tree-comment-text.html
│ │ │ │ │ ├── generates-anchor-link-markup.html
│ │ │ │ │ ├── generates-aside-caution-custom-icon.html
│ │ │ │ │ ├── generates-aside-caution-custom-label-and-icon.html
│ │ │ │ │ ├── generates-aside-danger-custom-icon.html
│ │ │ │ │ ├── generates-aside-danger-custom-label-and-icon.html
│ │ │ │ │ ├── generates-aside-note-custom-icon.html
│ │ │ │ │ ├── generates-aside-note-custom-label-and-icon.html
│ │ │ │ │ ├── generates-aside-note-multiple-path-custom-icon.html
│ │ │ │ │ ├── generates-aside-tip-custom-icon.html
│ │ │ │ │ ├── generates-aside-tip-custom-label-and-icon.html
│ │ │ │ │ ├── generates-aside.html
│ │ │ │ │ ├── handles-complex-children.html
│ │ │ │ │ ├── nested-asides-custom-titles.html
│ │ │ │ │ └── nested-asides.html
│ │ │ │ ├── utils.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── sidebar/
│ │ │ │ ├── navigation-attributes.test.ts
│ │ │ │ ├── navigation-badges.test.ts
│ │ │ │ ├── navigation-hidden.test.ts
│ │ │ │ ├── navigation-order.test.ts
│ │ │ │ ├── navigation-unicode.test.ts
│ │ │ │ ├── navigation.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── sidebar-slug-error/
│ │ │ │ ├── sidebar-slug-error.test.ts
│ │ │ │ └── vitest.config.ts
│ │ │ ├── snapshot-serializer-astro-error.ts
│ │ │ ├── test-config.ts
│ │ │ ├── test-plugin-utils.ts
│ │ │ ├── test-utils.ts
│ │ │ └── toc-custom-config/
│ │ │ ├── toc-custom-config.test.ts
│ │ │ └── vitest.config.ts
│ │ ├── components/
│ │ │ ├── AnchorHeading.astro
│ │ │ ├── Banner.astro
│ │ │ ├── ContentNotice.astro
│ │ │ ├── ContentPanel.astro
│ │ │ ├── DraftContentNotice.astro
│ │ │ ├── EditLink.astro
│ │ │ ├── FallbackContentNotice.astro
│ │ │ ├── Footer.astro
│ │ │ ├── Head.astro
│ │ │ ├── Header.astro
│ │ │ ├── Hero.astro
│ │ │ ├── LanguageSelect.astro
│ │ │ ├── LastUpdated.astro
│ │ │ ├── MarkdownContent.astro
│ │ │ ├── MobileMenuFooter.astro
│ │ │ ├── MobileMenuToggle.astro
│ │ │ ├── MobileTableOfContents.astro
│ │ │ ├── Page.astro
│ │ │ ├── PageFrame.astro
│ │ │ ├── PageSidebar.astro
│ │ │ ├── PageTitle.astro
│ │ │ ├── Pagination.astro
│ │ │ ├── Search.astro
│ │ │ ├── Select.astro
│ │ │ ├── Sidebar.astro
│ │ │ ├── SidebarPersister.astro
│ │ │ ├── SidebarRestorePoint.astro
│ │ │ ├── SidebarSublist.astro
│ │ │ ├── SiteTitle.astro
│ │ │ ├── SkipLink.astro
│ │ │ ├── SocialIcons.astro
│ │ │ ├── StarlightPage.astro
│ │ │ ├── TableOfContents.astro
│ │ │ ├── ThemeProvider.astro
│ │ │ ├── ThemeSelect.astro
│ │ │ └── TwoColumnContent.astro
│ │ ├── components-internals/
│ │ │ ├── Icons.ts
│ │ │ ├── SidebarPersistState.ts
│ │ │ └── TableOfContents/
│ │ │ ├── TableOfContentsList.astro
│ │ │ └── starlight-toc.ts
│ │ ├── components.ts
│ │ ├── constants.ts
│ │ ├── expressive-code.d.ts
│ │ ├── expressive-code.mjs
│ │ ├── global.d.ts
│ │ ├── i18n.d.ts
│ │ ├── index.ts
│ │ ├── integrations/
│ │ │ ├── asides-error.ts
│ │ │ ├── asides.ts
│ │ │ ├── code-rtl-support.ts
│ │ │ ├── expressive-code/
│ │ │ │ ├── hast.d.ts
│ │ │ │ ├── hast.mjs
│ │ │ │ ├── index.ts
│ │ │ │ ├── preprocessor.ts
│ │ │ │ ├── themes/
│ │ │ │ │ ├── night-owl-dark.jsonc
│ │ │ │ │ └── night-owl-light.jsonc
│ │ │ │ ├── theming.ts
│ │ │ │ └── translations.ts
│ │ │ ├── heading-links.ts
│ │ │ ├── pagefind.ts
│ │ │ ├── remark-rehype.ts
│ │ │ ├── shared/
│ │ │ │ ├── absolutePathToLang.ts
│ │ │ │ ├── localeToLang.ts
│ │ │ │ └── slugToLocale.ts
│ │ │ ├── sitemap.ts
│ │ │ ├── virtual-user-config.ts
│ │ │ └── vite-layer-order.ts
│ │ ├── internal.ts
│ │ ├── loaders.ts
│ │ ├── locals.d.ts
│ │ ├── locals.ts
│ │ ├── package.json
│ │ ├── playwright.config.ts
│ │ ├── props.ts
│ │ ├── route-data.ts
│ │ ├── routes/
│ │ │ ├── common.astro
│ │ │ ├── ssr/
│ │ │ │ ├── 404.astro
│ │ │ │ └── index.astro
│ │ │ └── static/
│ │ │ ├── 404.astro
│ │ │ └── index.astro
│ │ ├── schema.ts
│ │ ├── schemas/
│ │ │ ├── badge.ts
│ │ │ ├── components.ts
│ │ │ ├── expressiveCode.ts
│ │ │ ├── favicon.ts
│ │ │ ├── head.ts
│ │ │ ├── hero.ts
│ │ │ ├── i18n.ts
│ │ │ ├── icon.ts
│ │ │ ├── logo.ts
│ │ │ ├── pagefind.ts
│ │ │ ├── prevNextLink.ts
│ │ │ ├── sidebar.ts
│ │ │ ├── site-title.ts
│ │ │ ├── social.ts
│ │ │ └── tableOfContents.ts
│ │ ├── style/
│ │ │ ├── anchor-links.css
│ │ │ ├── asides.css
│ │ │ ├── layers.css
│ │ │ ├── markdown.css
│ │ │ ├── print.css
│ │ │ ├── props.css
│ │ │ ├── reset.css
│ │ │ └── util.css
│ │ ├── translations/
│ │ │ ├── README.md
│ │ │ ├── ar.json
│ │ │ ├── ca.json
│ │ │ ├── cs.json
│ │ │ ├── da.json
│ │ │ ├── de.json
│ │ │ ├── el.json
│ │ │ ├── en.json
│ │ │ ├── es.json
│ │ │ ├── fa.json
│ │ │ ├── fi.json
│ │ │ ├── fr.json
│ │ │ ├── gl.json
│ │ │ ├── he.json
│ │ │ ├── hi.json
│ │ │ ├── hu.json
│ │ │ ├── id.json
│ │ │ ├── index.ts
│ │ │ ├── it.json
│ │ │ ├── ja.json
│ │ │ ├── ko.json
│ │ │ ├── lv.json
│ │ │ ├── nb.json
│ │ │ ├── nl.json
│ │ │ ├── pl.json
│ │ │ ├── pt.json
│ │ │ ├── ro.json
│ │ │ ├── ru.json
│ │ │ ├── sk.json
│ │ │ ├── sv.json
│ │ │ ├── th.json
│ │ │ ├── tr.json
│ │ │ ├── uk.json
│ │ │ ├── vi.json
│ │ │ ├── zh-CN.json
│ │ │ └── zh-TW.json
│ │ ├── types.ts
│ │ ├── user-components/
│ │ │ ├── Aside.astro
│ │ │ ├── Badge.astro
│ │ │ ├── Card.astro
│ │ │ ├── CardGrid.astro
│ │ │ ├── FileTree.astro
│ │ │ ├── Icon.astro
│ │ │ ├── LinkButton.astro
│ │ │ ├── LinkCard.astro
│ │ │ ├── Steps.astro
│ │ │ ├── TabItem.astro
│ │ │ ├── Tabs.astro
│ │ │ ├── file-tree-icons.ts
│ │ │ ├── rehype-file-tree.ts
│ │ │ ├── rehype-steps.ts
│ │ │ └── rehype-tabs.ts
│ │ ├── utils/
│ │ │ ├── base.ts
│ │ │ ├── canonical.ts
│ │ │ ├── collection-fs.ts
│ │ │ ├── collection.ts
│ │ │ ├── createPathFormatter.ts
│ │ │ ├── createTranslationSystem.ts
│ │ │ ├── error-map.ts
│ │ │ ├── format-path.ts
│ │ │ ├── generateToC.ts
│ │ │ ├── git.ts
│ │ │ ├── gitInlined.ts
│ │ │ ├── head.ts
│ │ │ ├── i18n.ts
│ │ │ ├── localizedUrl.ts
│ │ │ ├── navigation.ts
│ │ │ ├── path.ts
│ │ │ ├── plugins.ts
│ │ │ ├── routing/
│ │ │ │ ├── data.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── middleware.ts
│ │ │ │ └── types.ts
│ │ │ ├── slugs.ts
│ │ │ ├── starlight-page.ts
│ │ │ ├── translations-fs.ts
│ │ │ ├── translations.ts
│ │ │ ├── types.ts
│ │ │ ├── url.ts
│ │ │ ├── user-config.ts
│ │ │ └── validateLogoImports.ts
│ │ ├── virtual-internal.d.ts
│ │ ├── virtual.d.ts
│ │ └── vitest.config.ts
│ └── tailwind/
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── __tests__/
│ │ └── tailwind.test.ts
│ ├── package.json
│ ├── tailwind.css
│ └── vitest.config.ts
├── pnpm-workspace.yaml
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .changeset/README.md
================================================
# Changesets
Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
with multi-package repos, or single-package repos to help you version and publish your code. You can
find the full documentation for it [in our repository](https://github.com/changesets/changesets)
We have a quick list of common questions to get you started engaging with this project in
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
================================================
FILE: .changeset/config.json
================================================
{
"$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json",
"changelog": [
"@changesets/changelog-github",
{ "repo": "withastro/starlight" }
],
"commit": false,
"linked": [],
"access": "public",
"baseBranch": "origin/main",
"updateInternalDependencies": "patch",
"ignore": ["starlight-docs", "@example/*", "starlight-file-icons-generator", "@e2e/*"],
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
"onlyUpdatePeerDependentsWhenOutOfRange": true
}
}
================================================
FILE: .devcontainer/Dockerfile
================================================
# Based on https://github.com/withastro/astro/blob/main/.devcontainer/Dockerfile
FROM mcr.microsoft.com/devcontainers/javascript-node:0-22
# We uninstall pnpm here, since we enable the corepack version in the postCreateCommand
# This ensures we respect the "packageManager" version in package.json
RUN npm uninstall -g pnpm
COPY welcome-message.txt /usr/local/etc/vscode-dev-containers/first-run-notice.txt
================================================
FILE: .devcontainer/devcontainer.json
================================================
{
"name": "Contribute to Starlight",
"build": {
"dockerfile": "Dockerfile"
},
"postCreateCommand": "sudo corepack enable pnpm && pnpm config set store-dir /home/node/.pnpm-store && PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 pnpm install",
"waitFor": "postCreateCommand",
"customizations": {
"codespaces": {
"openFiles": ["CONTRIBUTING.md"]
},
"vscode": {
"extensions": ["astro-build.astro-vscode", "esbenp.prettier-vscode"]
}
}
}
================================================
FILE: .devcontainer/welcome-message.txt
================================================
🌟 Welcome to Starlight!
🛠️ Your environment is fully setup with all required software installed.
Next steps:
- Preview the docs site:
cd docs && pnpm dev --host
- Run tests:
cd packages/starlight && pnpm test
================================================
FILE: .git-blame-ignore-revs
================================================
# Apply with:
# `git config --local blame.ignoreRevsFile .git-blame-ignore-revs`
# [Add Prettier and format files](https://github.com/withastro/starlight/pull/393)
9b172f5ee09697d80f301e9b70aca1946419ce24
================================================
FILE: .github/DISCUSSION_TEMPLATE/docs-suggestions.yml
================================================
body:
- type: markdown
attributes:
value: |
Thank you for getting in touch! Please fill out this form as completely as possible.
Want to report a problem with the Starlight docs? [Open a new issue](https://github.com/withastro/starlight/issues/new?assignees=&labels=&projects=&template=---02-docs-issue.yml)
Want to chat before posting? [Join us in the `#starlight` channel on Discord](https://astro.build/chat)
- type: textarea
id: summary
attributes:
label: What is your idea?
description: A brief, one or two sentence description of your idea for how to improve the Starlight docs.
validations:
required: true
- type: textarea
id: background
attributes:
label: Why is this important?
description: Explain why this idea is valuable. What problems would it solve? Which users would it help?
validations:
required: true
- type: textarea
id: prior-art
attributes:
label: How does your idea relate to existing docs content?
description: Are there specific pages you would like to change? Or existing pages that are related to your proposal?
placeholder: |
- Example
- Example
- Example
- type: checkboxes
id: will-pr
attributes:
label: Participation
description: Let us know if your interested in contributing this feature yourself.
options:
- label: I am willing to submit a pull request for this feature.
required: false
================================================
FILE: .github/DISCUSSION_TEMPLATE/feature-requests.yml
================================================
body:
- type: markdown
attributes:
value: |
Thank you for getting in touch! Please fill out this form as completely as possible.
Want to report a bug instead? [Use our bug report form](https://github.com/withastro/starlight/issues/new?assignees=&labels=&projects=&template=---01-bug-report.yml)
Want to chat before posting? [Join us in the `#starlight` channel on Discord](https://astro.build/chat)
- type: input
id: starlight-version
attributes:
label: What version of `starlight` are you using?
placeholder: 0.0.0
validations:
required: true
- type: textarea
id: summary
attributes:
label: What is your idea?
description: A brief, one or two sentence description of your idea for a new feature.
validations:
required: true
- type: textarea
id: background
attributes:
label: Why is this feature necessary?
description: Explain why this feature is important. What problems would it solve? Which users would it help?
validations:
required: true
- type: textarea
id: prior-art
attributes:
label: Do you have examples of this feature in other projects?
description: Help us understand your idea by sharing links to example implementations we can compare against.
placeholder: |
- Example
- Example
- Example
- type: checkboxes
id: will-pr
attributes:
label: Participation
description: Let us know if your interested in contributing this feature yourself.
options:
- label: I am willing to submit a pull request for this feature.
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/---01-bug-report.yml
================================================
name: "\U0001F41B Bug Report"
description: Report an issue or possible bug
labels: []
assignees: []
body:
- type: markdown
attributes:
value: |
Thank you for taking the time to file a bug report! Please fill out this form as completely as possible.
✅ I am using the **latest versions of Starlight and Astro**.
✅ I am using a compatible version of Node.js (`v22.12.0+`).
- type: input
id: starlight-version
attributes:
label: What version of `starlight` are you using?
placeholder: 0.0.0
validations:
required: true
- type: input
id: astro-version
attributes:
label: What version of `astro` are you using?
placeholder: 0.0.0
validations:
required: true
- type: input
id: package-manager
attributes:
label: What package manager are you using?
placeholder: npm, yarn, pnpm
validations:
required: true
- type: input
id: os
attributes:
label: What operating system are you using?
placeholder: Mac, Windows, Linux
validations:
required: true
- type: input
id: browser
attributes:
label: What browser are you using?
placeholder: Chrome, Firefox, Safari
validations:
required: true
- type: textarea
id: bug-description
attributes:
label: Describe the Bug
description: A clear and concise description of what the bug is.
validations:
required: true
- type: input
id: bug-reproduction
attributes:
label: Link to Minimal Reproducible Example
description: 'Use [astro.new](https://astro.new) to create a minimal reproduction of the problem. **A minimal reproduction is required** so that others can help debug your issue. If a report is vague (e.g. just a generic error message) and has no reproduction, it may be auto-closed. Not sure how to create a minimal example? [Read our guide](https://docs.astro.build/en/guides/troubleshooting/#creating-minimal-reproductions)'
placeholder: 'https://stackblitz.com/abcd1234'
validations:
required: true
- type: checkboxes
id: will-pr
attributes:
label: Participation
options:
- label: I am willing to submit a pull request for this issue.
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/---02-docs-issue.yml
================================================
name: "\U0001F4DA Docs Issue"
description: Report an issue with the Starlight documentation
labels: []
assignees: []
body:
- type: markdown
attributes:
value: |
Thank you for taking the time to let us know something is wrong! Please fill out this form as completely as possible.
- type: input
id: docs-page
attributes:
label: What page of the docs did you find an issue on?
description: If this issue applies to multiple pages, include additional pages in your bug description.
placeholder: https://starlight.astro.build/...
validations:
required: true
- type: textarea
id: bug-description
attributes:
label: Describe the issue
description: A clear and concise description of what the issue is.
validations:
required: true
- type: input
id: os
attributes:
label: What operating system are you using?
placeholder: Mac, Windows, Linux
validations:
required: true
- type: input
id: browser
attributes:
label: What browser are you using?
placeholder: Chrome, Firefox, Safari
validations:
required: true
- type: checkboxes
id: will-pr
attributes:
label: Participation
options:
- label: I am willing to submit a pull request for this issue.
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: 💡 Feature Request
url: https://github.com/withastro/starlight/discussions/new?category=feature-requests
about: Suggest an improvement you’d like to see added to Starlight
- name: 👾 Chat
url: https://astro.build/chat
about: Our Discord server is active, come join us!
- name: 💁 Support
url: https://astro.build/chat
about: 'This issue tracker is not for support questions. Join us on Discord for assistance!'
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!-- Thank you for opening a PR! We really appreciate you taking the time to help out 🙌 -->
#### Description
<!-- New features should first be discussed and approved by maintainers in GitHub or Discord discussions. -->
<!-- If this PR adds a new public-facing feature, uncomment the line below and include a link to the relevant discussion. -->
<!-- - [x] This PR adds a new feature which has been discussed and approved [here](link to GitHub or Discord discussion). -->
- 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.
-->
================================================
FILE: .github/labeler.yml
================================================
# See https://github.com/actions/labeler
'🚨 action':
- changed-files:
- any-glob-to-any-file:
- .github/workflows/**
i18n:
- changed-files:
- any-glob-to-any-file:
- docs/src/content/docs/de/**/*
- docs/src/content/docs/es/**/*
- docs/src/content/docs/fr/**/*
- docs/src/content/docs/it/**/*
- docs/src/content/docs/ja/**/*
- docs/src/content/docs/zh-cn/**/*
- docs/src/content/docs/pt-br/**/*
- docs/src/content/docs/pt-pt/**/*
- docs/src/content/docs/ko/**/*
- docs/src/content/docs/ru/**/*
- docs/src/content/docs/id/**/*
- docs/src/content/docs/tr/**/*
- docs/src/content/docs/hi/**/*
- docs/src/content/docs/da/**/*
- docs/src/content/docs/uk/**/*
'🌟 core':
- changed-files:
- any-glob-to-any-file:
- packages/starlight/**
'🌟 tailwind':
- changed-files:
- any-glob-to-any-file:
- packages/tailwind/**
'🌟 docsearch':
- changed-files:
- any-glob-to-any-file:
- packages/docsearch/**
'🌟 markdoc':
- changed-files:
- any-glob-to-any-file:
- packages/markdoc/**
'📚 docs':
- changed-files:
- any-glob-to-any-file:
- docs/**
================================================
FILE: .github/renovate.json5
================================================
{
$schema: 'https://docs.renovatebot.com/renovate-schema.json',
extends: [
':disableDependencyDashboard',
':semanticPrefixFixDepsChoreOthers',
':ignoreModulesAndTests',
'workarounds:all',
'helpers:pinGitHubActionDigestsToSemver',
'docker:disable',
],
rangeStrategy: 'bump',
ignorePaths: ['**/node_modules/**'],
packageRules: [
{
groupName: 'github-actions',
matchManagers: ['github-actions'],
},
{
matchManagers: ['npm'],
groupName: 'dependencies',
matchDepTypes: ['devDependencies', 'dependencies', 'peerDependencies'],
enabled: false,
},
{
description: 'Disable package manager version updates',
matchPackageNames: ['pnpm'],
matchDepTypes: ['packageManager'],
enabled: false,
},
{
description: 'Disable Node.js version updates with actions/setup-node',
matchDepNames: ['node'],
matchDepTypes: ['uses-with'],
enabled: false,
},
],
}
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
push:
branches: [main]
merge_group:
pull_request:
branches: [main]
# Automatically cancel in-progress actions on the same branch
concurrency:
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request_target' && github.head_ref || github.ref }}
cancel-in-progress: true
env:
NODE_VERSION: 22
ASTRO_TELEMETRY_DISABLED: true
jobs:
changes:
runs-on: ubuntu-latest
permissions:
pull-requests: read
outputs:
docs: ${{ steps.filter.outputs.docs }}
docs_ja: ${{ steps.filter.outputs.docs_ja }}
docs_en: ${{ steps.filter.outputs.docs_en }}
docs_not_content: ${{ steps.filter.outputs.docs_not_content }}
packages: ${{ steps.filter.outputs.packages }}
ci: ${{ steps.filter.outputs.ci }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: filter
# When updating filters here, make sure to also add or remove them from the
# outputs block above.
with:
filters: |
docs:
- 'docs/**'
docs_ja:
- 'docs/src/content/docs/ja/**'
docs_en:
- 'docs/src/content/docs/**'
# Exclude languages with a two-letter code
- '!docs/src/content/docs/{a..z}{a..z}/**'
# Exclude languages with a region subtag
- '!docs/src/content/docs/{a..z}{a..z}-{a..z}{a..z}/**'
docs_not_content:
- 'docs/**'
- '!docs/src/content/docs/**'
packages:
- 'packages/**'
ci:
- '.github/workflows/ci.yml'
unit-test:
name: Run unit tests
needs: changes
if: ${{ needs.changes.outputs.packages == 'true' || needs.changes.outputs.ci == 'true' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm'
- run: pnpm i
- name: Test packages
run: pnpm -r test:coverage
e2e-test:
name: 'Run E2E tests (${{ matrix.os }})'
needs: changes
if: ${{ needs.changes.outputs.packages == 'true' || needs.changes.outputs.ci == 'true' }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
# Uninstall man-db to prevent man page updates taking a long time after package installations
# on Ubuntu 24.04.
# https://github.com/actions/runner/issues/4030
# https://github.com/actions/runner-images/issues/10977
- name: Uninstall man-db
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get remove man-db
- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm'
- run: pnpm i
- name: Test packages (Linux)
if: matrix.os == 'ubuntu-latest'
run: pnpm -r test:e2e:chrome
# Firefox is used for Windows E2E tests as Chrome on Windows requires the installation of the
# Server Media Foundation windows feature, which can take up to 3 minutes to install on CI.
# https://github.com/microsoft/playwright/blob/e7bff526433b6dcb02801763ab5b1c6407902d47/packages/playwright-core/src/server/registry/dependencies.ts#L79-L89
- name: Test packages (Windows)
if: matrix.os == 'windows-latest'
run: pnpm -r test:e2e:firefox
type-check:
name: Run type checks
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm'
- run: pnpm i
- name: Generate docs types
working-directory: docs
run: pnpm astro sync
- name: Type check packages
run: pnpm typecheck
lint:
name: Lint code
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm'
- run: pnpm i
- name: Generate types
working-directory: ./docs
run: pnpm astro sync
- name: Run linter
run: pnpm lint
a11y:
name: Check for accessibility issues
needs: changes
if: ${{ needs.changes.outputs.docs_not_content == 'true' || needs.changes.outputs.docs_ja == 'true' || needs.changes.outputs.docs_en == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.packages == 'true' }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
# Uninstall man-db to prevent man page updates taking a long time after package installations
# on Ubuntu 24.04.
# https://github.com/actions/runner/issues/4030
# https://github.com/actions/runner-images/issues/10977
- name: Uninstall man-db
run: |
sudo apt-get update
sudo apt-get remove man-db
- name: Setup PNPM
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
- name: Setup Node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm'
- name: Install Dependencies
run: pnpm i
- name: Run accessibility audit
working-directory: ./docs
run: pnpm t
windows-smoke:
name: Docs site builds on Windows
runs-on: windows-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm'
- run: pnpm i
- name: Build docs site
working-directory: ./docs
run: pnpm build
links:
name: Check for broken links
needs: changes
if: ${{ needs.changes.outputs.docs == 'true' || needs.changes.outputs.ci == 'true' }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Setup PNPM
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
- name: Setup Node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm'
- name: Install Dependencies
run: pnpm i
- name: Build docs site and check links
working-directory: ./docs
run: pnpm linkcheck
================================================
FILE: .github/workflows/congratsbot.yml
================================================
name: Congratsbot
on:
push:
branches: [main]
jobs:
congrats:
if: ${{ github.repository_owner == 'withastro' && github.event.head_commit.message != '[ci] format' }}
uses: withastro/automation/.github/workflows/congratsbot.yml@main
with:
EMOJIS: '🎉,🎊,🧑🚀,🥳,🙌,🚀,🤩,☄️,💫,<:starlight:1107431075543797802>,<:houston_pride:1130504824673284107>'
COAUTHOR_TEMPLATES: >
[
"Thanks <names> for helping! ✨",
"<names> stepped up to lend a hand — thank you! 🙌",
"<names> with the assist! 💪",
"Couldn’t have done this without <names>! 💖",
"Made even better by <names>! 🚀",
"And the team effort award goes to… <names>! 🏆",
"Featuring contributions by <names>! 🌟"
]
secrets:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_CONGRATS }}
================================================
FILE: .github/workflows/file-icons.yml
================================================
name: File icons generator
on:
schedule:
- cron: '0 0 * * 0'
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
icons:
name: Generate file icons
if: github.repository_owner == 'withastro'
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Setup PNPM
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
- name: Setup Node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 22.12.0
cache: 'pnpm'
- name: Install Dependencies
run: pnpm i
- name: Run file icons generator
run: pnpm build
working-directory: packages/file-icons-generator
- name: Create Pull Request
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0
with:
branch: ci/file-icons
token: ${{ secrets.FREDKBOT_GITHUB_TOKEN }}
commit-message: 'ci: update file icons'
title: 'ci: update file icons'
body: |
This PR is auto-generated by a GitHub action to update the file icons and file tree definitions available in Starlight.
================================================
FILE: .github/workflows/format.yml
================================================
name: Format
on:
push:
branches:
- main
jobs:
format:
runs-on: ubuntu-latest
steps:
- name: Check out code using Git
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ github.head_ref }}
# Needs access to push to main
token: ${{ secrets.FREDKBOT_GITHUB_TOKEN }}
- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 22.12.0
cache: 'pnpm'
- run: pnpm i
- name: Format with Prettier
run: pnpm format
- name: Commit changes
uses: stefanzweifel/git-auto-commit-action@04702edda442b2e678b25b537cec683a1493fcb9 # v7.1.0
with:
commit_message: '[ci] format'
branch: ${{ github.head_ref }}
commit_user_name: fredkbot
commit_user_email: fred+astrobot@astro.build
================================================
FILE: .github/workflows/lunaria.yml
================================================
name: Lunaria
on:
# Trigger the workflow every time a pull request is opened or synchronized at the target `main` branch
pull_request_target:
types: [opened, synchronize]
branches: [main]
paths:
- 'docs/**'
# Allow this job to clone the repository and comment on the pull request
permissions:
contents: read
pull-requests: write
jobs:
lunaria-overview:
name: Generate Lunaria Overview
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
# Necessary for Lunaria to work properly
# Makes the action clone the entire git history
fetch-depth: 0
- name: Setup PNPM
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
- name: Setup Node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 22.12.0
cache: pnpm
- name: Install dependencies
run: pnpm install
shell: bash
- name: Generate Lunaria Overview
uses: yanthomasdev/lunaria-action@06ad5ab2704d030708baf3b279ca0446b418e853 # v0.1.0
with:
token: ${{ secrets.FREDKBOT_GITHUB_TOKEN }}
working-directory: docs
================================================
FILE: .github/workflows/pr-labeler.yml
================================================
name: 'Pull Request Labeler'
on:
- pull_request_target
jobs:
triage:
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@634933edcd8ababfe52f92936142cc22ac488b1b # v6.0.1
with:
repo-token: '${{ secrets.GITHUB_TOKEN }}'
================================================
FILE: .github/workflows/preview-release.yml
================================================
name: Preview Release
permissions: {}
on:
pull_request:
branches: [main]
types: [labeled]
# Automatically cancel in-progress actions on the same branch
concurrency:
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.ref }}
cancel-in-progress: true
jobs:
preview:
name: Preview Release
if: ${{ github.repository_owner == 'withastro' && github.event.label.name == 'pr-preview' }}
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: Checkout Repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
# While releasing with changesets works with a shallow clone, this is not the case of
# running `changeset status` which does not extend a shallow clone.
fetch-depth: 0
persist-credentials: false
- name: Setup PNPM
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
- name: Setup Node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.10.0
cache: 'pnpm'
- name: Install Dependencies
run: pnpm i
- name: Get changeset status
id: changeset
run: |
pnpm changeset status --output changeset-status.json
echo "status=$(cat changeset-status.json | jq -c .)" >> $GITHUB_OUTPUT
- name: Get pnpm packages
id: pnpm
run: echo "packages=$(pnpm list --recursive --depth -1 --json | jq -c .)" >> $GITHUB_OUTPUT
- name: Get preview packages
id: preview
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
env:
CHANGESET: ${{ steps.changeset.outputs.status }}
PACKAGES: ${{ steps.pnpm.outputs.packages }}
with:
script: |
const { relative } = require('node:path');
const changeset = JSON.parse(process.env.CHANGESET);
const packages = JSON.parse(process.env.PACKAGES);
// A map of all packages name in the monorepo to their relative paths.
const packagePathsMap = Object.fromEntries(packages.map(pkg => [pkg.name, relative(process.cwd(), pkg.path)]));
// A list of all relative package paths to publish in this preview release.
const previewPackagePaths = [...new Set(changeset.changesets.map(change => change.releases.map(release => packagePathsMap[release.name])).flat())]
// A space-separated string of all relative package paths to publish in this preview release (or an empty string if none).
core.setOutput('packages', previewPackagePaths.join(' '));
# We remove the preview label before publishing so that the label is always removed even if
# publishing fails, so we can retry by only adding the label again.
- name: Remove Preview Label
uses: actions-ecosystem/action-remove-labels@2ce5d41b4b6aa8503e285553f75ed56e0a40bae0 # v1.3.0
with:
labels: pr-preview
- name: Publish preview packages
env:
PACKAGES: ${{ steps.preview.outputs.packages }}
run: |
if [ -z "$PACKAGES" ]; then
echo "::error::No packages to publish in this preview release."
echo "::error::Make sure the pull request includes a changeset."
exit 1
fi
# Note that `--compact` is used for shorter URLs but requires packages to be published on
# npm. This means that it's not possible to publish a preview for a new package that has
# not yet been published on npm.
pnpm dlx pkg-pr-new publish --pnpm --compact --packageManager=pnpm --no-template $PACKAGES
================================================
FILE: .github/workflows/release.yml
================================================
name: Release
permissions: {}
on:
push:
branches:
- main
jobs:
release:
name: Release
if: ${{ github.repository_owner == 'withastro' }}
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
id-token: write
steps:
- name: Checkout Repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
# This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits
fetch-depth: 0
persist-credentials: false
- name: Setup PNPM
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
- name: Setup Node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.10.0
cache: 'pnpm'
- name: Install Dependencies
run: pnpm i
- name: Create Release Pull Request
uses: changesets/action@6a0a831ff30acef54f2c6aa1cbbc1096b066edaf # v1.7.0
with:
version: pnpm run version
publish: pnpm changeset publish
commit: '[ci] release'
title: '[ci] release'
env:
GITHUB_TOKEN: ${{ secrets.FREDKBOT_GITHUB_TOKEN }}
NPM_TOKEN: "" # See https://github.com/changesets/changesets/issues/1152#issuecomment-3190884868
================================================
FILE: .github/workflows/size-limit.yml
================================================
name: Size Limit
on:
pull_request:
branches: [main]
# Automatically cancel in-progress actions on the same branch
concurrency:
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request_target' && github.head_ref || github.ref }}
cancel-in-progress: true
env:
NODE_VERSION: 22
jobs:
# This basic check runs size-limit for the current branch.
# It will fail if the branch pushes the size over the specified budget.
size-limit-basic:
if: ${{ github.event.pull_request.head.repo.full_name != 'withastro/starlight' }}
name: Check build output is within performance budget (forks)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
- name: Setup Node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm'
- run: pnpm i
- run: 'pnpm build:examples'
- run: pnpm size
# This check cannot run in forks, so is only run for PRs from this repo.
# It will run size-limit for both `main` and the PR branch and comment in the PR with changes.
size-limit:
if: ${{ github.event.pull_request.head.repo.full_name == 'withastro/starlight' }}
name: Check build output is within performance budget
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
- name: Setup Node
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm'
- name: Run size-limit
uses: andresz1/size-limit-action@94bc357df29c36c8f8d50ea497c3e225c3c95d1d # v1.8.0
with:
github_token: ${{ secrets.FREDKBOT_GITHUB_TOKEN }}
build_script: 'build:examples'
package_manager: pnpm
================================================
FILE: .github/workflows/welcome-bot.yml
================================================
name: WelcomeBot
on:
pull_request_target:
branches: [main]
types: [opened]
permissions:
pull-requests: write
jobs:
welcome:
name: Welcome First-Time Contributors
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: zephyrproject-rtos/action-first-interaction@58853996b1ac504b8e0f6964301f369d2bb22e5c
with:
repo-token: ${{ secrets.FREDKBOT_GITHUB_TOKEN }}
pr-opened-message: |
Hello! Thank you for opening your **first PR** to Starlight! ✨
Here’s what will happen next:
1. Our GitHub bots will run to check your changes.
If they spot any issues you will see some error messages on this PR.
Don’t hesitate to ask any questions if you’re not sure what these mean!
2. In a few minutes, you’ll be able to see a preview of your changes on Netlify 🤩
3. 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 few days.
================================================
FILE: .gitignore
================================================
# dependencies
node_modules/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store
# Vitest
__coverage__/
# Playwright
test-results/
# Vercel output
.vercel
================================================
FILE: .npmrc
================================================
prefer-workspace-packages=true
link-workspace-packages=true
shell-emulator=true
auto-install-peers=false
================================================
FILE: .prettierignore
================================================
# Deep Directories
**/node_modules
# Generated Directories
**/dist
**/build
**/.astro
**/__coverage__
# Directories
.changeset
# Files
pnpm-lock.yaml
# Test snapshots
**/__tests__/**/snapshots
# https://github.com/withastro/prettier-plugin-astro/issues/337
packages/starlight/user-components/Tabs.astro
# Prettier forces whitespace between elements we want to avoid for consistency with the rehype version
packages/starlight/components/AnchorHeading.astro
packages/starlight/__e2e__/fixtures/basics/src/content/docs/anchor-heading-component.mdx
# Malformed YAML file used for testing
packages/starlight/__tests__/i18n/malformed-yaml-src/content/i18n/*.yml
# GitHub Actions workflow files
.github/workflows/*.yml
================================================
FILE: .prettierrc
================================================
{
"printWidth": 100,
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"useTabs": true,
"plugins": ["prettier-plugin-astro"],
"overrides": [
{
"files": [".*", "*.json", "*.md", "*.toml", "*.yml"],
"options": {
"useTabs": false
}
},
{
"files": ["*.md", "*.mdx"],
"options": {
"printWidth": 80
}
}
]
}
================================================
FILE: .vscode/extensions.json
================================================
{
"recommendations": [
"astro-build.astro-vscode",
"dbaeumer.vscode-eslint",
"hideoo.starlight-links"
],
"unwantedRecommendations": []
}
================================================
FILE: .vscode/launch.json
================================================
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"cwd": "${workspaceFolder}/docs",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
}
================================================
FILE: CONTRIBUTING.md
================================================
# Contributor Manual
We welcome contributions of any size and contributors of any skill level.
As an open source project, we believe in giving back to our contributors.
We are happy to help with guidance on PRs, technical writing, and turning any feature idea into a reality.
> **Tip for new contributors:**
> Take a look at [GitHub's Docs](https://docs.github.com/en/get-started/quickstart/hello-world) for helpful information on working with GitHub.
This document is an active work in progress — like Starlight itself! Feel free to join us in [the Astro Discord server][discord] to join the discussion. Look for the `#starlight` channel and say “Hi!” when you arrive.
## Types of contributions
There are lots of ways to contribute to Starlight.
Maintaining Starlight requires writing Astro code, as well as addressing accessibility, styling, and UX concerns.
This repository also contains the code for the Starlight docs website.
Help writing docs, catching typos and errors, as well as translating docs into other languages is always welcome.
You can also get involved by leaving feedback on [issues][issues] or reviewing [pull requests][pulls] by other contributors.
We encourage you to:
- [**Open an issue**][new-issue] to let us know of bugs in Starlight, documentation you found unclear, or other issues you run into.
- [**Look at existing issues**][issues] (especially those labelled [“good first issue”][gfi]) to find ways to contribute.
- **Make a pull request (PR)** to address an open issue or to fix obvious problems.
Read more about [making a PR in GitHub’s docs][pr-docs]
- [**Review existing PRs**][pulls] to help us merge contributions sooner.
- [**Add or update translations**](#translations). We need help translating both Starlight’s UI and documentation.
## About this repo
This repo is a “monorepo,” meaning it contains several projects in one. It contains the Starlight docs site in [`docs/`](./docs/) and the packages that make up Starlight in [`packages/`](./packages/).
### Setting up a development environment
You can [develop locally](#developing-locally) or use an online coding development environment like [GitHub Codespaces](#developing-using-github-codespaces) to get started quickly.
#### Developing locally
**Prerequisites:** Developing Starlight requires [Node.js](https://nodejs.org/en) (v16 or higher) and [pnpm](https://pnpm.io/) (v8.2 or higher). Make sure you have these installed before following these steps.
1. **Fork Starlight** to your personal GitHub account by clicking <kbd>Fork</kbd> on the [main Starlight repo page][sl].
2. **Clone your fork** of Starlight to your computer. Replace `YOUR-USERNAME` in the command below with your GitHub username to clone in a Terminal:
```sh
git clone https://github.com/YOUR-USERNAME/starlight.git
```
3. **Change directory** to the cloned repo:
```sh
cd starlight
```
4. **Install dependencies** with `pnpm`:
```sh
pnpm i
```
5. **Generate TypeScript types** for all Astro modules:
```sh
cd docs
pnpm astro sync
```
#### Developing using GitHub Codespaces
1. **Create a new codespace** via https://codespaces.new/withastro/starlight
2. **Generate TypeScript types** for all Astro modules:
```sh
pnpm astro sync
```
3. If running the docs site, pass the `--host` flag to avoid “502 Bad Gateway” errors:
```sh
cd docs
pnpm dev --host
```
The dev container used for GitHub Codespaces can also be used with [other supporting tools](https://containers.dev/supporting), including VS Code.
### Making a Pull Request
When making a pull request containing changes impacting users to Starlight or any related packages (`packages/*`), be sure to [add a changeset](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md#i-am-in-a-multi-package-repository-a-mono-repo) that will describe the changes to users.
Documentation-only (`docs/*`) and non-package (`examples/*`) changes do not need changesets.
```sh
pnpm exec changeset
```
## Testing
### Testing visual changes while you work
Run the Astro dev server on the docs site to see how changes you make impact a project using Starlight.
To do this, move into the `docs/` directory from the root of the repo and then run `pnpm dev`:
```sh
cd docs
pnpm dev
```
You should then be able to open <http://localhost:4321> and see your changes.
> **Note**
> Changes to the Starlight integration will require you to quit and restart the dev server to take effect.
### Check for broken links in the docs site
When adding or translating content in the Starlight docs site, you can check all internal links are valid.
All GitHub PRs are checked this way automatically, but testing locally can help if you want to confirm changes are correct before committing them.
To do this, move into the `docs/` directory from the root of the repo and then run `pnpm linkcheck`:
```sh
cd docs
pnpm linkcheck
```
If there are any broken links, the build will fail and log which pages need to be fixed.
### Unit tests
The Starlight package includes unit tests in [`packages/starlight/__tests__/`](./packages/starlight/__tests__/), which are run using [Vitest][vitest].
To run tests, move into the Starlight package and then run `pnpm test`:
```sh
cd packages/starlight
pnpm test
```
This will run tests and then listen for changes, re-running tests when files change.
#### Test environments
A lot of Starlight code relies on Vite virtual modules provided either by Astro or by Starlight itself. Each subdirectory of `packages/starlight/__tests__/` should contain a `vitest.config.ts` file that uses the `defineVitestConfig()` helper to define a valid test environment for tests in that directory. This helper takes a single argument, which provides a Starlight user config object:
```ts
// packages/starlight/__tests__/basics/vitest.config.ts
import { defineVitestConfig } from '../test-config';
export default defineVitestConfig({
title: 'Basics',
});
```
This allows you to run tests of Starlight code against different combinations of Starlight configuration options.
#### Mocking content collections
Starlight relies on a user’s `docs` and (optional) `i18n` content collections, which aren’t available during testing. You can use a top-level `vi.mock()` call and the `mockedAstroContent` helper to set up fake collection entries for the current test file:
```js
import { describe, expect, test, vi } from 'vitest';
vi.mock('astro:content', async () =>
(await import('../test-utils')).mockedAstroContent({
docs: [
['index.mdx', { title: 'Home Page' }],
['environmental-impact.md', { title: 'Eco-friendly docs' }],
],
i18n: [['en', { 'page.editLink': 'Modify this doc!' }]],
})
);
```
#### Test coverage
To see how much of Starlight’s code is currently being tested, run `pnpm test:coverage` from the Starlight package:
```sh
cd packages/starlight
pnpm test:coverage
```
This will print a table to your terminal and also generate an HTML report you can load in a web browser by opening [`packages/starlight/__coverage__/index.html`](./packages/starlight/__coverage__/index.html).
### End-to-end (E2E) tests
Starlight also includes E2E tests in [`packages/starlight/__e2e__/`](./packages/starlight/__e2e__/), which are run using [Playwright][playwright].
To run these tests, move into the Starlight package and then run `pnpm test:e2e`:
```sh
cd packages/starlight
pnpm test:e2e
```
#### Test fixtures
Each subdirectory of `packages/starlight/__e2e__/fixtures` should contain the basic files needed to run Starlight (`package.json`, `astro.config.mjs`, a content collection configuration in `src/content.config.ts` and some content to render in `src/content/docs/`).
The `testFactory()` helper can be used in a test file to define the fixture which will be built and loaded in a preview server during a set of tests.
```ts
// packages/starlight/__e2e__/feature.test.ts
import { testFactory } from './test-utils';
const test = await testFactory('./fixtures/basics/');
```
This allows you to run tests against different combinations of Astro and Starlight configuration options for various content.
#### When to add E2E tests?
E2E are most useful for testing what happens on a page after it has been loaded by a browser. They run slower than unit tests so they should be used sparingly when unit tests aren’t sufficient.
## Translations
Translations help make Starlight accessible to more people.
Check out the dedicated [i18n contribution guidelines](https://contribute.docs.astro.build/guides/i18n/#quality-standards--adaptation) in the Astro docs contributor guide for more details regarding our translation process and quality standards.
### Translating Starlight’s UI
Starlight’s UI comes with some built-in text elements. For example, the table of contents on a Starlight page has a heading of “On this page” and the theme picker shows “Light”, “Dark”, and “Auto” labels. Starlight aims to provide these in as many languages as possible.
Help out by adding or updating translation files in [`packages/starlight/translations`](./packages/starlight/translations/).
Each language’s JSON file follows the [translation structure described in Starlight’s docs](https://starlight.astro.build/guides/i18n/#translate-starlights-ui).
📺 **Prefer a visual walkthrough?** [Watch an introduction to Starlight’s translation files.](https://scrimba.com/scrim/cpb44bt3)
### Translating Starlight’s docs
Starlight’s documentation is also translated into multiple languages. You can find the source code for the site in [the `docs/` directory](./docs/) of this repository.
Help out by:
- Reviewing [open translation PRs][pulls]
- Updating out-of-date translated pages
- Adding an untranslated page
Visit **<https://i18n.starlight.astro.build>** to track translation progress for the currently supported languages.
#### Adding a new language to Starlight’s docs
To add a language, you will need its BCP-47 tag and a label. See [“Adding a new language”](https://contribute.docs.astro.build/guides/i18n/#adding-a-new-language) in the Astro docs contributor guide for some helpful tips around choosing these.
- Add your language to the `locales` config in `docs/astro.config.mjs`
- Add your language to the `locales` config in `docs/lunaria.config.json`
- Add your language’s subtag to the i18n label config in `.github/labeler.yml`
- Add your language to the `config.sitemap.exclude` option in `docs/__a11y__/test-utils.ts`
- Create the first translated page for your language.
This must be the Starlight landing page: `docs/src/content/docs/{language}/index.mdx`.
- Open a pull request on GitHub to add your changes to Starlight!
## Understanding Starlight
- Starlight is built as an Astro integration.
Read the [Astro Integration API docs][api-docs] to learn more about how integrations work.
The Starlight integration is exported from [`packages/starlight/index.ts`](./packages/starlight/index.ts).
It sets up Starlight’s routing logic, parses user config, and adds configuration to a Starlight user’s Astro project.
- Most pages in a Starlight project are built using a single [`packages/starlight/index.astro`](./packages/starlight/index.astro) route.
If you’ve worked on an Astro site before, much of this should look familiar: it’s an Astro component and uses a number of other components to build a page based on user content.
- Starlight consumes a user’s content from the `'docs'` [content collection](https://docs.astro.build/en/guides/content-collections/).
This allows us to specify the permissible frontmatter via [a Starlight-specific schema](./packages/starlight/schema.ts) and get predictable data while providing clear error messages if a user sets invalid frontmatter in a page.
- Components that require JavaScript for their functionality are all written without a UI framework, most often as custom elements.
This helps keep Starlight lightweight and makes it easier for a user to choose to add components from a framework of their choice to their project.
- Components that require client-side JavaScript or CSS should use JavaScript/CSS features that are well-supported by browsers.
You can find a list of supported browsers and their versions using this [browserslist query](https://browsersl.ist/#q=%3E+0.5%25%2C+not+dead%2C+Chrome+%3E%3D+105%2C+Edge+%3E%3D+105%2C+Firefox+%3E%3D+121%2C+Safari+%3E%3D+15.4%2C+iOS+%3E%3D+15.4%2C+not+op_mini+all). To check whether or not a feature is supported, you can visit the [Can I use](https://caniuse.com) website and search for the feature.
[discord]: https://astro.build/chat
[issues]: https://github.com/withastro/starlight/issues
[sl]: https://github.com/withastro/starlight/pulls
[pulls]: https://github.com/withastro/starlight/pulls
[new-issue]: https://github.com/withastro/starlight/issues/new/choose
[pr-docs]: https://docs.github.com/en/get-started/quickstart/contributing-to-projects#making-a-pull-request
[gfi]: https://github.com/withastro/starlight/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22+
[api-docs]: https://docs.astro.build/en/reference/integrations-reference/
[vitest]: https://vitest.dev/
[playwright]: https://playwright.dev/
## Showcase
### Sites
We love to see websites built with Starlight and share them with the community on our [showcase](https://starlight.astro.build/resources/showcase/) page.
If you’ve built a documentation site with Starlight, adding it to the showcase is just a pull request away!
1. Set up a development environment by following the [“Setting up a development environment”](#setting-up-a-development-environment) instructions.
2. Add a screenshot of your site to the `docs/src/assets/showcase/` directory. The image file must:
- Be a `.png` file and named after your site’s domain, e.g. `example.com.png`.
- Have the dimensions of 800 × 450 pixels.
3. Add a new entry for your website in `docs/src/components/showcase-sites.astro`.
- The new entry must be appended at the end of the existing list of sites.
- The `title` attribute must be the name of your site with no extra details.
- The `href` attribute must be the URL of your Starlight site. If your documentation is hosted on a subdomain or subdirectory, include that in the URL.
- The `thumbnail` attribute must be the filename of the screenshot you added in step 2.
```diff
<Card title="Example" href="https://example.net" thumbnail="example.net.png" />
<Card title="Last Example" href="https://example.org" thumbnail="example.org.png" />
+ <Card title="New Example" href="https://example.com" thumbnail="example.com.png" />
</FluidGrid>
```
4. Open a pull request on GitHub to add your changes.
### Themes
Share themes for Starlight you built by adding them to our [themes](https://starlight.astro.build/resources/themes/) page. Here’s how!
1. Set up a development environment by following the [“Setting up a development environment”](#setting-up-a-development-environment) instructions.
2. Take screenshots of your theme’s light and dark modes using our demo project.
1. Open the [theme demo project](https://stackblitz.com/edit/github-jj1kzx5x?file=astro.config.mjs) on StackBlitz.
2. Install your theme using StackBlitz’s integrated terminal:
```sh
npm i your-theme-name
```
3. Update `astro.config.mjs` to import your theme and add it to Starlight’s `plugins` array.
4. Run the dev server:
```sh
npm run dev
```
5. Open the theme preview in a new tab and use dev tools’ responsive view to take screenshots with the screen sized to 1280×720 pixels.
3. Add your screenshots of the theme’s light and dark modes to the `docs/src/assets/themes/` directory. The images must:
- be PNG files with your theme’s name and the color variant, e.g. a theme named “Moon” would have files named `moon-light.png` and `moon-dark.png`
- have dimensions of 1280×720 pixels
4. Add a new entry for your website in `docs/src/content/docs/resources/themes.mdx`.
You can look at existing entries to see how to format this.
- The new entry must be appended at the end of the existing list of sites.
- The `title` attribute must be the name of your theme.
- The `description` attribute should briefly describe your theme’s aesthetic, inspiration, or key features.
- The `href` attribute must be the URL of your theme’s website demonstrating what the theme looks like.
- The `previews` attribute must be an object listing the filenames of the screenshots you added in step 3.
## Preview releases
Maintainers can create preview releases for any pull requests containing pending changesets by adding the `pr-preview` label to such PRs. When doing so, a GitHub Actions workflow will be triggered to create a preview release for all necessary packages and a comment will be added to the PR with instructions on how to install the preview packages.
To update a preview release after making additional changes to the PR, add the `pr-preview` label again to re-trigger the workflow.
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2023 [Astro contributors](https://github.com/withastro/starlight/graphs/contributors)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: docs/.gitignore
================================================
# build output
dist/
# generated types
.astro/
# dependencies
node_modules/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store
================================================
FILE: docs/README.md
================================================
# Starlight Docs
[](https://starlight.astro.build)
This directory contains the Starlight documentation website (built with Starlight!)
[](https://stackblitz.com/github/withastro/starlight/tree/main/docs)
[](https://codesandbox.io/p/sandbox/github/withastro/starlight/tree/main/docs)
## 🧞 Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
| :---------------------- | :----------------------------------------------- |
| `pnpm install` | Installs dependencies |
| `pnpm run dev` | Starts local dev server at `localhost:4321` |
| `pnpm run build` | Build your production site to `./dist/` |
| `pnpm run preview` | Preview your build locally, before deploying |
| `pnpm run astro ...` | Run CLI commands like `astro add`, `astro check` |
| `pnpm run astro --help` | Get help using the Astro CLI |
## 👀 Want to learn more?
Feel free to check [the Astro documentation](https://docs.astro.build) or jump into the [Astro Discord server](https://astro.build/chat).
================================================
FILE: docs/__a11y__/docs.test.ts
================================================
import { expect, test } from './test-utils';
test('does not report accessibility violations on the docs site', async ({ docsSite }) => {
let violationsCount = 0;
const urls = await docsSite.getAllUrls();
for (const url of urls) {
const violations = await docsSite.testPage(url);
if (violations.length > 0) {
violationsCount += violations.length;
}
await docsSite.reportPageViolations(violations);
}
expect(
violationsCount,
`Found ${violationsCount} accessibility violations. Check the errors above for more details.`
).toBe(0);
});
================================================
FILE: docs/__a11y__/test-utils.ts
================================================
import { test as baseTest, type Page } from '@playwright/test';
import {
DefaultTerminalReporter,
getViolations,
injectAxe,
reportViolations,
} from 'axe-playwright';
import Sitemapper from 'sitemapper';
// We use the Lunaria config to get the list of languages rather than the Astro config as importing
// the latter does not play well with Playwright.
import lunariaConfig from '../lunaria.config.json' with { type: 'json' };
export { expect, type Locator } from '@playwright/test';
const config: Config = {
axe: {
// https://www.deque.com/axe/core-documentation/api-documentation/#axecore-tags
runOnly: {
type: 'tag',
values: ['wcag2a', 'wcag21a', 'wcag2aa', 'wcag21aa', 'wcag22aa', 'best-practice'],
},
},
// i18n specific configuration.
i18n: {
// A list of slugs to exclude from the sitemap for the default locale.
// By default, all slugs for the default locale are included.
exclude: [
'components/using-components',
'getting-started',
'guides/customization',
'guides/i18n',
'guides/overriding-components',
'guides/pages',
'guides/project-structure',
'guides/route-data',
'guides/site-search',
'manual-setup',
'reference/frontmatter',
'reference/overrides',
'reference/plugins',
'reference/route-data',
],
// Locale-specific included slugs (non-default locale slugs are excluded by default).
locales: {
// N.B. If adding more locales here, also update the changed files filters in
// `.github/workflows/ci.yml` to ensure tests run when files for those locales change.
ja: ['guides/route-data', 'reference/frontmatter'],
},
},
// A list of violation to ignore.
ignore: [{ id: 'landmark-unique', nodeMatcher: landmarkUniqueNodeMatcher }],
sitemap: {
url: 'http://localhost:4321/sitemap-index.xml',
replace: {
query: 'https://starlight.astro.build',
value: 'http://localhost:4321',
},
},
};
process.env.ASTRO_TELEMETRY_DISABLED = 'true';
process.env.ASTRO_DISABLE_UPDATE_CHECK = 'true';
const locales = lunariaConfig.locales.map((locale) => locale.lang);
export const test = baseTest.extend<{
docsSite: DocsSite;
}>({
docsSite: async ({ page }, use) => use(new DocsSite(page)),
});
// A Playwright test fixture accessible from within all tests.
class DocsSite {
private readonly page: Page;
constructor(page: Page) {
this.page = page;
}
async getAllUrls() {
const sitemap = new Sitemapper({ url: config.sitemap.url });
const { sites } = await sitemap.fetch();
if (sites.length === 0) {
throw new Error('No URLs found in sitemap.');
}
const urls: string[] = [];
for (const site of sites) {
const slug = site.replace(config.sitemap.replace.query, '');
const url = config.sitemap.replace.value + slug;
// Default locale
if (!locales.some((locale) => slug.startsWith(`/${locale}/`))) {
// Skip default locale excluded slugs
if (config.i18n.exclude.some((excludedSlug) => slug.endsWith(`/${excludedSlug}/`)))
continue;
} else {
// Get locale-specific config
const locale = slug.split('/')[1]!;
const localeConfig = config.i18n.locales[locale];
// Skip non-configured locales
if (!localeConfig) continue;
// Skip locale-specific non-included slugs
if (!localeConfig.some((includedSlug) => slug.endsWith(`/${includedSlug}/`))) continue;
}
urls.push(url);
}
return urls;
}
async testPage(url: string) {
await this.page.goto(url);
await injectAxe(this.page);
await this.page.waitForLoadState('networkidle');
const violations = await getViolations(this.page, undefined, config.axe);
return this.#filterViolations(violations);
}
async reportPageViolations(violations: Awaited<ReturnType<typeof this.testPage>>) {
const url = this.page.url().replace(config.sitemap.replace.value, '');
if (violations.length > 0) {
console.error(`> Found ${violations.length} violations on ${url}\n`);
await reportViolations(violations, new DefaultTerminalReporter(true, true, false));
console.error('\n');
} else {
console.log(`> Found no violations on ${url}`);
}
}
#filterViolations(violations: Awaited<ReturnType<typeof getViolations>>) {
return violations.filter((violation) => {
return !config.ignore.some((ignore) => {
if (typeof ignore === 'string') return violation.id === ignore;
if (violation.id !== ignore.id) return false;
if (!ignore.nodeMatcher) return true;
return !violation.nodes.some(ignore.nodeMatcher);
});
});
}
}
function landmarkUniqueNodeMatcher(node: ViolationNode) {
// Ignore some `landmark-unique` violations.
return (
/**
* Asides: the best action to fix this violation would be to remove the landmark altogether as
* it's not necessary in this case and switch to the `note` role. Although, this is not possible
* at the moment due to an issue with NVDA not announcing it and also skipping the associated
* label for a role not supported.
*
* @see https://github.com/nvaccess/nvda/issues/10439
* @see https://github.com/withastro/starlight/pull/2503
*/
!/^<aside[^>]* class="starlight-aside[^>]*>$/.test(node.html) &&
/**
* Expressive Code `<pre>` blocks: EC 0.41.3 introduced a change adding the `region` role to
* scrollable code blocks. The best action to fix this violation would potentially to switch to
* another role, e.g. `group`, and adding `aria-label` or `aria-labelledby` to provide a generic
* label, e.g. `'Horizontally scrollable code'`.
*
* @see https://github.com/expressive-code/expressive-code/pull/343
* @see https://github.com/expressive-code/expressive-code/pull/348
*/
!/^<pre[^>]* data-language[^>]* role="region"[^>]*>$/.test(node.html)
);
}
interface Config {
axe: Parameters<typeof getViolations>[2];
i18n: { exclude: string[]; locales: Record<string, string[]> };
ignore: Array<
| string
| {
id: string;
// A function called for each node to evaluate if it should be ignored or not.
// Return `true` if the node should be considered for the violation, `false` otherwise.
nodeMatcher?: (node: ViolationNode) => boolean;
}
>;
sitemap: {
url: string;
replace: {
query: string;
value: string;
};
};
}
type Violations = Awaited<ReturnType<typeof getViolations>>;
type ViolationNode = Violations[number]['nodes'][number];
================================================
FILE: docs/astro.config.mjs
================================================
// @ts-check
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
import starlightLinksValidator from 'starlight-links-validator';
import markdocGrammar from './grammars/markdoc.tmLanguage.json';
export const locales = {
root: { label: 'English', lang: 'en' },
de: { label: 'Deutsch', lang: 'de' },
es: { label: 'Español', lang: 'es' },
ja: { label: '日本語', lang: 'ja' },
fr: { label: 'Français', lang: 'fr' },
it: { label: 'Italiano', lang: 'it' },
id: { label: 'Bahasa Indonesia', lang: 'id' },
'zh-cn': { label: '简体中文', lang: 'zh-CN' },
'pt-br': { label: 'Português do Brasil', lang: 'pt-BR' },
'pt-pt': { label: 'Português', lang: 'pt-PT' },
ko: { label: '한국어', lang: 'ko' },
tr: { label: 'Türkçe', lang: 'tr' },
ru: { label: 'Русский', lang: 'ru' },
hi: { label: 'हिंदी', lang: 'hi' },
da: { label: 'Dansk', lang: 'da' },
uk: { label: 'Українська', lang: 'uk' },
};
/* https://docs.netlify.com/configure-builds/environment-variables/#read-only-variables */
const NETLIFY_PREVIEW_SITE = process.env.CONTEXT !== 'production' && process.env.DEPLOY_PRIME_URL;
const site = NETLIFY_PREVIEW_SITE || 'https://starlight.astro.build/';
const ogUrl = new URL('og.jpg?v=1', site).href;
const ogImageAlt = 'Make your docs shine with Starlight';
export default defineConfig({
site,
trailingSlash: 'always',
integrations: [
starlight({
title: 'Starlight',
logo: {
light: '/src/assets/logo-light.svg',
dark: '/src/assets/logo-dark.svg',
replacesTitle: true,
},
lastUpdated: true,
editLink: {
baseUrl: 'https://github.com/withastro/starlight/edit/main/docs/',
},
social: [
{ icon: 'github', label: 'GitHub', href: 'https://github.com/withastro/starlight' },
{ icon: 'discord', label: 'Discord', href: 'https://astro.build/chat' },
],
head: [
{
tag: 'script',
attrs: {
src: 'https://cdn.usefathom.com/script.js',
'data-site': 'EZBHTSIG',
defer: true,
},
},
{
tag: 'meta',
attrs: { property: 'og:image', content: ogUrl },
},
{
tag: 'meta',
attrs: { property: 'og:image:alt', content: ogImageAlt },
},
],
customCss: ['./src/assets/landing.css'],
locales,
sidebar: [
{
label: 'Start Here',
translations: {
de: 'Beginne hier',
es: 'Comienza aqui',
ja: 'ここからはじめる',
fr: 'Commencez ici',
it: 'Inizia qui',
id: 'Mulai dari sini',
'zh-CN': '从这里开始',
'pt-BR': 'Comece Aqui',
'pt-PT': 'Comece Aqui',
ko: '시작 안내',
tr: 'Buradan Başlayın',
ru: 'Первые шаги',
hi: 'यहाँ से शुरू करे',
uk: 'Почніть звідси',
},
items: [
'getting-started',
'manual-setup',
{
label: 'Environmental Impact',
slug: 'environmental-impact',
translations: {
de: 'Umweltbelastung',
es: 'Documentación ecológica',
ja: '環境への負荷',
fr: 'Impact environnemental',
it: 'Impatto ambientale',
id: 'Dampak terhadap lingkungan',
'zh-CN': '环境影响',
'pt-BR': 'Impacto Ambiental',
'pt-PT': 'Impacto Ambiental',
ko: '환경적 영향',
tr: 'Çevre Etkisi',
ru: 'Влияние на окружающую среду',
hi: 'पर्यावरणीय प्रभाव',
uk: 'Вплив на довкілля',
},
},
],
},
{
label: 'Guides',
translations: {
de: 'Anleitungen',
es: 'Guías',
ja: 'ガイド',
fr: 'Guides',
it: 'Guide',
id: 'Panduan',
'zh-CN': '指南',
'pt-BR': 'Guias',
'pt-PT': 'Guias',
ko: '가이드',
tr: 'Rehber',
ru: 'Руководства',
hi: 'गाइड',
uk: 'Ґайди',
},
autogenerate: { directory: 'guides' },
},
{
label: 'Components',
translations: {
de: 'Komponenten',
fr: 'Composants',
ru: 'Компоненты',
ko: '컴포넌트',
ja: 'コンポーネント',
'zh-CN': '组件',
uk: 'Компоненти',
},
autogenerate: { directory: 'components' },
},
{
label: 'Reference',
translations: {
de: 'Referenzen',
es: 'Referencias',
ja: 'リファレンス',
fr: 'Référence',
it: 'Riferimenti',
id: 'Referensi',
'zh-CN': '参考',
'pt-BR': 'Referência',
ko: '참조',
tr: 'Referanslar',
ru: 'Справочник',
hi: 'संदर्भ',
uk: 'Довідник',
},
autogenerate: { directory: 'reference' },
},
{
label: 'Resources',
translations: {
de: 'Ressourcen',
'zh-CN': '资源',
fr: 'Ressources',
'pt-BR': 'Recursos',
'pt-PT': 'Recursos',
ja: 'リソース',
ru: 'Ресурсы',
ko: '리소스',
uk: 'Ресурси',
},
autogenerate: { directory: 'resources' },
},
],
expressiveCode: { shiki: { langs: [markdocGrammar] } },
plugins: process.env.CHECK_LINKS
? [
starlightLinksValidator({
errorOnFallbackPages: false,
errorOnInconsistentLocale: true,
}),
]
: [],
}),
],
});
================================================
FILE: docs/grammars/README.md
================================================
# Starlight Docs Grammars
This directory contains additional grammars for the Starlight documentation website.
## Grammars
The following additional grammars are generated and available for use:
- [Markdoc](https://github.com/markdoc/language-server)
## Usage
To generate the grammars from their source files, run:
```sh
pnpm grammars
```
To include the grammars in the Starlight documentation website, update the `expressiveCode.shiki.langs` array in the `astro.config.mjs` file:
```diff
starlight({
expressiveCode: {
shiki: {
langs: [
JSON.parse(
fs.readFileSync('./grammars/existing.tmLanguage.json', 'utf-8'),
+ fs.readFileSync('./grammars/new.tmLanguage.json', 'utf-8'),
),
],
},
},
});
```
================================================
FILE: docs/grammars/generate.mjs
================================================
// @ts-check
import fs from 'node:fs/promises';
const markdown = {
repo: 'shikijs/textmate-grammars-themes',
tmLanguagePath: 'packages/tm-grammars/grammars/markdown.json',
};
const markdoc = {
repo: 'markdoc/language-server',
// We don't need the Markdoc grammar, only the Markdoc Markdown grammar.
// tmLanguagePath: 'syntaxes/markdoc.tmLanguage.json',
markdownTmLanguagePath: 'syntaxes/markdoc.markdown.tmLanguage.json',
};
/**
* Download a TextMate grammar file from a GitHub repository.
* @param {string} repo
* @param {string} path
*/
async function fetchTmLanguage(repo, path) {
const url = `https://raw.githubusercontent.com/${repo}/main/${path}`;
const response = await fetch(url);
const data = await response.json();
return data;
}
// Download the TextMate grammar files for Markdown.
const markdownTmLanguage = await fetchTmLanguage(markdown.repo, markdown.tmLanguagePath);
// Download the TextMate grammar files for Markdoc Markdown.
const markdocMarkdownTmLanguage = await fetchTmLanguage(
markdoc.repo,
markdoc.markdownTmLanguagePath
);
// Reference: https://macromates.com/manual/en/language_grammars
// Update the name and scope name for the Markdoc grammar.
markdownTmLanguage.name = 'markdoc';
markdownTmLanguage.scopeName = 'text.html.markdoc';
// Merge the Markdown and Markdoc Markdown grammar repositories.
markdownTmLanguage.repository = {
...markdownTmLanguage.repository,
...markdocMarkdownTmLanguage.repository,
};
// Include the Markdoc Markdown grammar rules at the beginning of the Markdown grammar.
for (const rule of Object.keys(markdocMarkdownTmLanguage.repository)) {
// Skip shortcut rules as they break syntax highlighting of child content that includes dots in
// words and we don't ever use them.
if (rule === 'shortcut') continue;
markdownTmLanguage.repository.block.patterns.unshift({ include: `#${rule}` });
markdownTmLanguage.repository.inline.patterns.unshift({ include: `#${rule}` });
}
// Write the grammar to a file.
await fs.writeFile(
'./grammars/markdoc.tmLanguage.json',
JSON.stringify(
markdownTmLanguage,
(key, value) => {
// The `applyEndPatternLast` property should be a boolean and not a number.
if (key === 'applyEndPatternLast') return Boolean(value);
return value;
},
2
)
);
console.log('Markdoc grammar generated successfully.');
================================================
FILE: docs/grammars/markdoc.tmLanguage.json
================================================
{
"displayName": "Markdown",
"name": "markdoc",
"patterns": [
{
"include": "#frontMatter"
},
{
"include": "#block"
}
],
"repository": {
"ampersand": {
"comment": "Markdown will convert this for us. We match it so that the HTML grammar will not mark it up as invalid.",
"match": "&(?!([a-zA-Z0-9]+|#\\d+|#x[0-9a-fA-F]+);)",
"name": "meta.other.valid-ampersand.markdown"
},
"block": {
"patterns": [
{
"include": "#tag"
},
{
"include": "#attribute"
},
{
"include": "#separator"
},
{
"include": "#heading"
},
{
"include": "#blockquote"
},
{
"include": "#lists"
},
{
"include": "#fenced_code_block"
},
{
"include": "#raw_block"
},
{
"include": "#link-def"
},
{
"include": "#html"
},
{
"include": "#table"
},
{
"include": "#paragraph"
}
]
},
"blockquote": {
"begin": "(^|\\G)[ ]{0,3}(>) ?",
"captures": {
"2": {
"name": "punctuation.definition.quote.begin.markdown"
}
},
"name": "markup.quote.markdown",
"patterns": [
{
"include": "#block"
}
],
"while": "(^|\\G)\\s*(>) ?"
},
"bold": {
"begin": "(?<open>(\\*\\*(?=\\w)|(?<!\\w)\\*\\*|(?<!\\w)\\b__))(?=\\S)(?=(<[^>]*+>|(?<raw>`+)([^`]|(?!(?<!`)\\k<raw>(?!`))`)*+\\k<raw>|\\\\[\\\\`*_{}\\[\\]()#.!+\\->]?+|\\[((?<square>[^\\[\\]\\\\]|\\\\.|\\[\\g<square>*+\\])*+\\](([ ]?\\[[^\\]]*+\\])|(\\([ \\t]*+<?(.*?)>?[ \\t]*+((?<title>['\"])(.*?)\\k<title>)?\\))))|(?!(?<=\\S)\\k<open>).)++(?<=\\S)(?=__\\b|\\*\\*)\\k<open>)",
"captures": {
"1": {
"name": "punctuation.definition.bold.markdown"
}
},
"end": "(?<=\\S)(\\1)",
"name": "markup.bold.markdown",
"patterns": [
{
"applyEndPatternLast": true,
"begin": "(?=<[^>]*?>)",
"end": "(?<=>)",
"patterns": [
{
"include": "text.html.derivative"
}
]
},
{
"include": "#escape"
},
{
"include": "#ampersand"
},
{
"include": "#bracket"
},
{
"include": "#raw"
},
{
"include": "#bold"
},
{
"include": "#italic"
},
{
"include": "#image-inline"
},
{
"include": "#link-inline"
},
{
"include": "#link-inet"
},
{
"include": "#link-email"
},
{
"include": "#image-ref"
},
{
"include": "#link-ref-literal"
},
{
"include": "#link-ref"
},
{
"include": "#link-ref-shortcut"
},
{
"include": "#strikethrough"
}
]
},
"bracket": {
"comment": "Markdown will convert this for us. We match it so that the HTML grammar will not mark it up as invalid.",
"match": "<(?![a-zA-Z/?$!])",
"name": "meta.other.valid-bracket.markdown"
},
"escape": {
"match": "\\\\[-`*_#+.!(){}\\[\\]\\\\>]",
"name": "constant.character.escape.markdown"
},
"fenced_code_block": {
"patterns": [
{
"include": "#fenced_code_block_css"
},
{
"include": "#fenced_code_block_basic"
},
{
"include": "#fenced_code_block_ini"
},
{
"include": "#fenced_code_block_java"
},
{
"include": "#fenced_code_block_lua"
},
{
"include": "#fenced_code_block_makefile"
},
{
"include": "#fenced_code_block_perl"
},
{
"include": "#fenced_code_block_r"
},
{
"include": "#fenced_code_block_ruby"
},
{
"include": "#fenced_code_block_php"
},
{
"include": "#fenced_code_block_sql"
},
{
"include": "#fenced_code_block_vs_net"
},
{
"include": "#fenced_code_block_xml"
},
{
"include": "#fenced_code_block_xsl"
},
{
"include": "#fenced_code_block_yaml"
},
{
"include": "#fenced_code_block_dosbatch"
},
{
"include": "#fenced_code_block_clojure"
},
{
"include": "#fenced_code_block_coffee"
},
{
"include": "#fenced_code_block_c"
},
{
"include": "#fenced_code_block_cpp"
},
{
"include": "#fenced_code_block_diff"
},
{
"include": "#fenced_code_block_dockerfile"
},
{
"include": "#fenced_code_block_git_commit"
},
{
"include": "#fenced_code_block_git_rebase"
},
{
"include": "#fenced_code_block_go"
},
{
"include": "#fenced_code_block_groovy"
},
{
"include": "#fenced_code_block_pug"
},
{
"include": "#fenced_code_block_js"
},
{
"include": "#fenced_code_block_js_regexp"
},
{
"include": "#fenced_code_block_json"
},
{
"include": "#fenced_code_block_jsonc"
},
{
"include": "#fenced_code_block_less"
},
{
"include": "#fenced_code_block_objc"
},
{
"include": "#fenced_code_block_swift"
},
{
"include": "#fenced_code_block_scss"
},
{
"include": "#fenced_code_block_perl6"
},
{
"include": "#fenced_code_block_powershell"
},
{
"include": "#fenced_code_block_python"
},
{
"include": "#fenced_code_block_julia"
},
{
"include": "#fenced_code_block_regexp_python"
},
{
"include": "#fenced_code_block_rust"
},
{
"include": "#fenced_code_block_scala"
},
{
"include": "#fenced_code_block_shell"
},
{
"include": "#fenced_code_block_ts"
},
{
"include": "#fenced_code_block_tsx"
},
{
"include": "#fenced_code_block_csharp"
},
{
"include": "#fenced_code_block_fsharp"
},
{
"include": "#fenced_code_block_dart"
},
{
"include": "#fenced_code_block_handlebars"
},
{
"include": "#fenced_code_block_markdown"
},
{
"include": "#fenced_code_block_log"
},
{
"include": "#fenced_code_block_erlang"
},
{
"include": "#fenced_code_block_elixir"
},
{
"include": "#fenced_code_block_latex"
},
{
"include": "#fenced_code_block_bibtex"
},
{
"include": "#fenced_code_block_twig"
},
{
"include": "#fenced_code_block_unknown"
}
]
},
"fenced_code_block_basic": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(html|htm|shtml|xhtml|inc|tmpl|tpl)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.html",
"patterns": [
{
"include": "text.html.basic"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_bibtex": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(bibtex)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.bibtex",
"patterns": [
{
"include": "text.bibtex"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_c": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(c|h)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.c",
"patterns": [
{
"include": "source.c"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_clojure": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(clj|cljs|clojure)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.clojure",
"patterns": [
{
"include": "source.clojure"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_coffee": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(coffee|Cakefile|coffee.erb)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.coffee",
"patterns": [
{
"include": "source.coffee"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_cpp": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(cpp|c\\+\\+|cxx)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.cpp source.cpp",
"patterns": [
{
"include": "source.cpp"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_csharp": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(cs|csharp|c#)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.csharp",
"patterns": [
{
"include": "source.cs"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_css": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(css|css.erb)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.css",
"patterns": [
{
"include": "source.css"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_dart": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(dart)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.dart",
"patterns": [
{
"include": "source.dart"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_diff": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(patch|diff|rej)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.diff",
"patterns": [
{
"include": "source.diff"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_dockerfile": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(dockerfile|Dockerfile)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.dockerfile",
"patterns": [
{
"include": "source.dockerfile"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_dosbatch": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(bat|batch)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.dosbatch",
"patterns": [
{
"include": "source.batchfile"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_elixir": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(elixir)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.elixir",
"patterns": [
{
"include": "source.elixir"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_erlang": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(erlang)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.erlang",
"patterns": [
{
"include": "source.erlang"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_fsharp": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(fs|fsharp|f#)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.fsharp",
"patterns": [
{
"include": "source.fsharp"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_git_commit": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(COMMIT_EDITMSG|MERGE_MSG)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.git_commit",
"patterns": [
{
"include": "text.git-commit"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_git_rebase": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(git-rebase-todo)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.git_rebase",
"patterns": [
{
"include": "text.git-rebase"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_go": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(go|golang)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.go",
"patterns": [
{
"include": "source.go"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_groovy": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(groovy|gvy)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.groovy",
"patterns": [
{
"include": "source.groovy"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_handlebars": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(handlebars|hbs)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.handlebars",
"patterns": [
{
"include": "text.html.handlebars"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_ini": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(ini|conf)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.ini",
"patterns": [
{
"include": "source.ini"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_java": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(java|bsh)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.java",
"patterns": [
{
"include": "source.java"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_js": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(js|jsx|javascript|es6|mjs|cjs|dataviewjs|\\{\\.js.+?\\})((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.javascript",
"patterns": [
{
"include": "source.js"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_js_regexp": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(regexp)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.js_regexp",
"patterns": [
{
"include": "source.js.regexp"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_json": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(json|json5|sublime-settings|sublime-menu|sublime-keymap|sublime-mousemap|sublime-theme|sublime-build|sublime-project|sublime-completions)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.json",
"patterns": [
{
"include": "source.json"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_jsonc": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(jsonc)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.jsonc",
"patterns": [
{
"include": "source.json.comments"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_julia": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(julia|\\{\\.julia.+?\\})((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.julia",
"patterns": [
{
"include": "source.julia"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_latex": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(latex|tex)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.latex",
"patterns": [
{
"include": "text.tex.latex"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_less": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(less)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.less",
"patterns": [
{
"include": "source.css.less"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_log": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(log)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.log",
"patterns": [
{
"include": "text.log"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_lua": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(lua)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.lua",
"patterns": [
{
"include": "source.lua"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_makefile": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(Makefile|makefile|GNUmakefile|OCamlMakefile)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.makefile",
"patterns": [
{
"include": "source.makefile"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_markdown": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(markdown|md)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.markdown",
"patterns": [
{
"include": "text.html.markdown"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_objc": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(objectivec|objective-c|mm|objc|obj-c|m|h)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.objc",
"patterns": [
{
"include": "source.objc"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_perl": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(perl|pl|pm|pod|t|PL|psgi|vcl)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.perl",
"patterns": [
{
"include": "source.perl"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_perl6": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(perl6|p6|pl6|pm6|nqp)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.perl6",
"patterns": [
{
"include": "source.perl.6"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_php": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(php|php3|php4|php5|phpt|phtml|aw|ctp)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.php",
"patterns": [
{
"include": "text.html.basic"
},
{
"include": "source.php"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_powershell": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(powershell|ps1|psm1|psd1|pwsh)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.powershell",
"patterns": [
{
"include": "source.powershell"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_pug": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(jade|pug)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.pug",
"patterns": [
{
"include": "text.pug"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_python": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(python|py|py3|rpy|pyw|cpy|SConstruct|Sconstruct|sconstruct|SConscript|gyp|gypi|\\{\\.python.+?\\})((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.python",
"patterns": [
{
"include": "source.python"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_r": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(R|r|s|S|Rprofile|\\{\\.r.+?\\})((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.r",
"patterns": [
{
"include": "source.r"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_regexp_python": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(re)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.regexp_python",
"patterns": [
{
"include": "source.regexp.python"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_ruby": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(ruby|rb|rbx|rjs|Rakefile|rake|cgi|fcgi|gemspec|irbrc|Capfile|ru|prawn|Cheffile|Gemfile|Guardfile|Hobofile|Vagrantfile|Appraisals|Rantfile|Berksfile|Berksfile.lock|Thorfile|Puppetfile)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.ruby",
"patterns": [
{
"include": "source.ruby"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_rust": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(rust|rs|\\{\\.rust.+?\\})((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.rust",
"patterns": [
{
"include": "source.rust"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_scala": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(scala|sbt)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.scala",
"patterns": [
{
"include": "source.scala"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_scss": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(scss)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.scss",
"patterns": [
{
"include": "source.css.scss"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_shell": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(shell|sh|bash|zsh|bashrc|bash_profile|bash_login|profile|bash_logout|.textmate_init|\\{\\.bash.+?\\})((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.shellscript",
"patterns": [
{
"include": "source.shell"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_sql": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(sql|ddl|dml)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.sql",
"patterns": [
{
"include": "source.sql"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_swift": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(swift)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.swift",
"patterns": [
{
"include": "source.swift"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_ts": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(typescript|ts)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.typescript",
"patterns": [
{
"include": "source.ts"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_tsx": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(tsx)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.typescriptreact",
"patterns": [
{
"include": "source.tsx"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_twig": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(twig)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.twig",
"patterns": [
{
"include": "source.twig"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_unknown": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?=([^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown"
},
"fenced_code_block_vs_net": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(vb)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.vs_net",
"patterns": [
{
"include": "source.asp.vb.net"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_xml": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(xml|xsd|tld|jsp|pt|cpt|dtml|rss|opml)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.xml",
"patterns": [
{
"include": "text.xml"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_xsl": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(xsl|xslt)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.xsl",
"patterns": [
{
"include": "text.xml.xsl"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"fenced_code_block_yaml": {
"begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(yaml|yml)((\\s+|:|,|\\{|\\?)[^`]*)?$)",
"beginCaptures": {
"3": {
"name": "punctuation.definition.markdown"
},
"4": {
"name": "fenced_code.block.language.markdown"
},
"5": {
"name": "fenced_code.block.language.attributes.markdown"
}
},
"end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$",
"endCaptures": {
"3": {
"name": "punctuation.definition.markdown"
}
},
"name": "markup.fenced_code.block.markdown",
"patterns": [
{
"begin": "(^|\\G)(\\s*)(.*)",
"contentName": "meta.embedded.block.yaml",
"patterns": [
{
"include": "source.yaml"
}
],
"while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)"
}
]
},
"frontMatter": {
"applyEndPatternLast": true,
"begin": "\\A(?=(-{3,}))",
"end": "^ {,3}\\1-*[ \\t]*$|^[ \\t]*\\.{3}$",
"endCaptures": {
"0": {
"name": "punctuation.definition.end.frontmatter"
}
},
"patterns": [
{
"begin": "\\A(-{3,})(.*)$",
"beginCaptures": {
"1": {
"name": "punctuation.definition.begin.frontmatter"
},
"2": {
"name": "comment.frontmatter"
}
},
"contentName": "meta.embedded.block.frontmatter",
"patterns": [
{
"include": "source.yaml"
}
],
"while": "^(?! {,3}\\1-*[ \\t]*$|[ \\t]*\\.{3}$)"
}
]
},
"heading": {
"captures": {
"1": {
"patterns": [
{
"captures": {
"1": {
"name": "punctuation.definition.heading.markdown"
},
"2": {
"name": "entity.name.section.markdown",
"patterns": [
{
"include": "#inline"
},
{
"include": "text.html.derivative"
}
]
},
"3": {
"name": "punctuation.definition.heading.markdown"
}
},
"match": "(#{6})\\s+(.*?)(?:\\s+(#+))?\\s*$",
"name": "heading.6.markdown"
},
{
"captures": {
"1": {
"name": "punctuation.definition.heading.markdown"
},
"2": {
"name": "entity.name.section.markdown",
"patterns": [
{
"include": "#inline"
},
{
"include": "text.html.derivative"
}
]
},
"3": {
"name": "punctuation.definition.heading.markdown"
}
},
"match": "(#{5})\\s+(.*?)(?:\\s+(#+))?\\s*$",
"name": "heading.5.markdown"
},
{
"captures": {
"1": {
"name": "punctuation.definition.heading.markdown"
},
"2": {
"name": "entity.name.section.markdown",
"patterns": [
{
"include": "#inline"
},
{
"include": "text.html.derivative"
}
]
},
"3": {
"name": "punctuation.definition.heading.markdown"
}
},
"match": "(#{4})\\s+(.*?)(?:\\s+(#+))?\\s*$",
"name": "heading.4.markdown"
},
{
"captures": {
"1": {
"name": "punctuation.definition.heading.markdown"
},
"2": {
"name": "entity.name.section.markdown",
"patterns": [
{
"include": "#inline"
},
{
"include": "text.html.derivative"
}
]
},
"3": {
"name": "punctuation.definition.heading.markdown"
}
},
"match": "(#{3})\\s+(.*?)(?:\\s+(#+))?\\s*$",
"name": "heading.3.markdown"
},
{
"captures": {
"1": {
"name": "punctuation.definition.heading.markdown"
},
"2": {
"name": "entity.name.section.markdown",
"patterns": [
{
"include": "#inline"
},
{
"include": "text.html.derivative"
}
]
},
"3": {
"name": "punctuation.definition.heading.markdown"
}
},
"match": "(#{2})\\s+(.*?)(?:\\s+(#+))?\\s*$",
"name": "heading.2.markdown"
},
{
"captures": {
"1": {
"name": "punctuation.definition.heading.markdown"
},
"2": {
"name": "entity.name.section.markdown",
"patterns": [
{
"include": "#inline"
},
{
"include": "text.html.derivative"
}
]
},
"3": {
"name": "punctuation.definition.heading.markdown"
}
},
"match": "(#{1})\\s+(.*?)(?:\\s+(#+))?\\s*$",
"name": "heading.1.markdown"
}
]
}
},
"match": "(?:^|\\G)[ ]{0,3}(#{1,6}\\s+(.*?)(\\s+#{1,6})?\\s*)$",
"name": "markup.heading.markdown"
},
"heading-setext": {
"patterns": [
{
"match": "^(={3,})(?=[ \\t]*$\\n?)",
"name": "markup.heading.setext.1.markdown"
},
{
"match": "^(-{3,})(?=[ \\t]*$\\n?)",
"name": "markup.heading.setext.2.markdown"
}
]
},
"html": {
"patterns": [
{
"begin": "(^|\\G)\\s*(<!--)",
"captures": {
"1": {
"name": "punctuation.definition.comment.html"
},
"2": {
"name": "punctuation.definition.comment.html"
}
},
"end": "(-->)",
"name": "comment.block.html"
},
{
"begin": "(?i)(^|\\G)\\s*(?=<(script|style|pre)(\\s|$|>)(?!.*?</(script|style|pre)>))",
"end": "(?i)(.*)((</)(script|style|pre)(>))",
"endCaptures": {
"1": {
"patterns": [
{
"include": "text.html.derivative"
}
]
},
"2": {
"name": "meta.tag.structure.$4.end.html"
},
"3": {
"name": "punctuation.definition.tag.begin.html"
},
"4": {
"name": "entity.name.tag.html"
},
"5": {
"name": "punctuation.definition.tag.end.html"
}
},
"patterns": [
{
"begin": "(\\s*|$)",
"patterns": [
{
"include": "text.html.derivative"
}
],
"while": "(?i)^(?!.*</(script|style|pre)>)"
}
]
},
{
"begin": "(?i)(^|\\G)\\s*(?=</?[a-zA-Z]+[^\\s/>]*(\\s|$|/?>))",
"patterns": [
{
"include": "text.html.derivative"
}
],
"while": "^(?!\\s*$)"
},
{
"begin": "(^|\\G)\\s*(?=(<[a-zA-Z0-9\\-](/?>|\\s.*?>)|</[a-zA-Z0-9\\-]>)\\s*$)",
"patterns": [
{
"include": "text.html.derivative"
}
],
"while": "^(?!\\s*$)"
}
]
},
"image-inline": {
"captures": {
"1": {
"name": "punctuation.definition.link.description.begin.markdown"
},
"2": {
"name": "string.other.link.description.markdown"
},
"4": {
"name": "punctuation.definition.link.description.end.markdown"
},
"5": {
"name": "punctuation.definition.metadata.markdown"
},
"7": {
"name": "punctuation.definition.link.markdown"
},
"8": {
"name": "markup.underline.link.image.markdown"
},
"9": {
"name": "punctuation.definition.link.markdown"
},
"10": {
"name": "markup.underline.link.image.markdown"
},
"12": {
"name": "string.other.link.description.title.markdown"
},
"13": {
"name": "punctuation.definition.string.begin.markdown"
},
"14": {
"name": "punctuation.definition.string.end.markdown"
},
"15": {
"name": "string.other.link.description.title.markdown"
},
"16": {
"name": "punctuation.definition.string.begin.markdown"
},
"17": {
"name": "punctuation.definition.string.end.markdown"
},
"18": {
"name": "string.other.link.description.title.markdown"
},
"19": {
"name": "punctuation.definition.string.begin.markdown"
},
"20": {
"name": "punctuation.definition.string.end.markdown"
},
"21": {
"name": "punctuation.definition.metadata.markdown"
}
},
"match": "(!\\[)((?<square>[^\\[\\]\\\\]|\\\\.|\\[\\g<square>*+\\])*+)(\\])(\\()[ \\t]*((<)((?:\\\\[<>]|[^<>\\n])*)(>)|((?<url>(?>[^\\s()]+)|\\(\\g<url>*\\))*))[ \\t]*(?:((\\().+?(\\)))|((\").+?(\"))|((').+?(')))?\\s*(\\))",
"name": "meta.image.inline.markdown"
},
"image-ref": {
"captures": {
"1": {
"name": "punctuation.definition.link.description.begin.markdown"
},
"2": {
"name": "string.other.link.description.markdown"
},
"4": {
"name": "punctuation.definition.link.description.end.markdown"
},
"5": {
"name": "punctuation.definition.constant.markdown"
},
"6": {
"name": "constant.other.reference.link.markdown"
},
"7": {
"name": "punctuation.definition.constant.markdown"
}
},
"match": "(!\\[)((?<square>[^\\[\\]\\\\]|\\\\.|\\[\\g<square>*+\\])*+)(\\])[ ]?(\\[)(.*?)(\\])",
"name": "meta.image.reference.markdown"
},
"inline": {
"patterns": [
{
"include": "#tag"
},
{
"include": "#attribute"
},
{
"include": "#ampersand"
},
{
"include": "#bracket"
},
{
"include": "#bold"
},
{
"include": "#italic"
},
{
"include": "#raw"
},
{
"include": "#strikethrough"
},
{
"include": "#escape"
},
{
"include": "#image-inline"
},
{
"include": "#image-ref"
},
{
"include": "#link-email"
},
{
"include": "#link-inet"
},
{
"include": "#link-inline"
},
{
"include": "#link-ref"
},
{
"include": "#link-ref-literal"
},
{
"include": "#link-ref-shortcut"
}
]
},
"italic": {
"begin": "(?<open>(\\*(?=\\w)|(?<!\\w)\\*|(?<!\\w)\\b_))(?=\\S)(?=(<[^>]*+>|(?<raw>`+)([^`]|(?!(?<!`)\\k<raw>(?!`))`)*+\\k<raw>|\\\\[\\\\`*_{}\\[\\]()#.!+\\->]?+|\\[((?<square>[^\\[\\]\\\\]|\\\\.|\\[\\g<square>*+\\])*+\\](([ ]?\\[[^\\]]*+\\])|(\\([ \\t]*+<?(.*?)>?[ \\t]*+((?<title>['\"])(.*?)\\k<title>)?\\))))|\\k<open>\\k<open>|(?!(?<=\\S)\\k<open>).)++(?<=\\S)(?=_\\b|\\*)\\k<open>)",
"captures": {
"1": {
"name": "punctuation.definition.italic.markdown"
}
},
"end": "(?<=\\S)(\\1)((?!\\1)|(?=\\1\\1))",
"name": "markup.italic.markdown",
"patterns": [
{
"applyEndPatternLast": true,
"begin": "(?=<[^>]*?>)",
"end": "(?<=>)",
"patterns": [
{
"include": "text.html.derivative"
}
]
},
{
"include": "#escape"
},
{
"include": "#ampersand"
},
{
"include": "#bracket"
},
{
"include": "#raw"
},
{
"include": "#bold"
},
{
"include": "#image-inline"
},
{
"include": "#link-inline"
},
{
"include": "#link-inet"
},
{
"include": "#link-email"
},
{
"include": "#image-ref"
},
{
"include": "#link-ref-literal"
},
{
"include": "#link-ref"
},
{
"include": "#link-ref-shortcut"
},
{
"include": "#strikethrough"
}
]
},
"link-def": {
"captures": {
"1": {
"name": "punctuation.definition.constant.markdown"
},
"2": {
"name": "constant.other.reference.link.markdown"
},
"3": {
"name": "punctuation.definition.constant.markdown"
},
"4": {
"name": "punctuation.separator.key-value.markdown"
},
"5": {
"name": "punctuation.definition.link.markdown"
},
"6": {
"name": "markup.underline.link.markdown"
},
"7": {
"name": "punctuation.definition.link.markdown"
},
"8": {
"name": "markup.underline.link.markdown"
},
"9": {
"name": "string.other.link.description.title.markdown"
},
"10": {
"name": "punctuation.definition.string.begin.markdown"
},
"11": {
"name": "punctuation.definition.string.end.markdown"
},
"12": {
"name": "string.other.link.description.title.markdown"
},
"13": {
"name": "punctuation.definition.string.begin.markdown"
},
"14": {
"name": "punctuation.definition.string.end.markdown"
},
"15": {
"name": "string.other.link.description.title.markdown"
},
"16": {
"name": "punctuation.definition.string.begin.markdown"
},
"17": {
"name": "punctuation.definition.string.end.markdown"
}
},
"match": "\\s*(\\[)([^]]+?)(\\])(:)[ \\t]*(?:(<)((?:\\\\[<>]|[^<>\\n])*)(>)|(\\S+?))[ \\t]*(?:((\\().+?(\\)))|((\").+?(\"))|((').+?(')))?\\s*$",
"name": "meta.link.reference.def.markdown"
},
"link-email": {
"captures": {
"1": {
"name": "punctuation.definition.link.markdown"
},
"2": {
"name": "markup.underline.link.markdown"
},
"4": {
"name": "punctuation.definition.link.markdown"
}
},
"match": "(<)((?:mailto:)?[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)(>)",
"name": "meta.link.email.lt-gt.markdown"
},
"link-inet": {
"captures": {
"1": {
"name": "punctuation.definition.link.markdown"
},
"2": {
"name": "markup.underline.link.markdown"
},
"3": {
"name": "punctuation.definition.link.markdown"
}
},
"match": "(<)((?:https?|ftp)://.*?)(>)",
"name": "meta.link.inet.markdown"
},
"link-inline": {
"captures": {
"1": {
"name": "punctuation.definition.link.title.begin.markdown"
},
"2": {
"name": "string.other.link.title.markdown",
"patterns": [
{
"include": "#raw"
},
{
"include": "#bold"
},
{
"include": "#italic"
},
{
"include": "#strikethrough"
},
{
"include": "#image-inline"
}
]
},
"4": {
"name": "punctuation.definition.link.title.end.markdown"
},
"5": {
"name": "punctuation.definition.metadata.markdown"
},
"7": {
"name": "punctuation.definition.link.markdown"
},
"8": {
"name": "markup.underline.link.markdown"
},
"9": {
"name": "punctuation.definition.link.markdown"
},
"10": {
"name": "markup.underline.link.markdown"
},
"12": {
"name": "string.other.link.description.title.markdown"
},
"13": {
"name": "punctuation.definition.string.begin.markdown"
},
"14": {
"name": "punctuation.definition.string.end.markdown"
},
"15": {
"name": "string.other.link.description.title.markdown"
},
"16": {
"name": "punctuation.definition.string.begin.markdown"
},
"17": {
"name": "punctuation.definition.string.end.markdown"
},
"18": {
"name": "string.other.link.description.title.markdown"
},
"19": {
"name": "punctuation.definition.string.begin.markdown"
},
"20": {
"name": "punctuation.definition.string.end.markdown"
},
"21": {
"name": "punctuation.definition.metadata.markdown"
}
},
"match": "(\\[)((?<square>[^\\[\\]\\\\]|\\\\.|\\[\\g<square>*+\\])*+)(\\])(\\()[ \\t]*((<)((?:\\\\[<>]|[^<>\\n])*)(>)|((?<url>(?>[^\\s()]+)|\\(\\g<url>*\\))*))[ \\t]*(?:((\\()[^()]*(\\)))|((\")[^\"]*(\"))|((')[^']*(')))?\\s*(\\))",
"name": "meta.link.inline.markdown"
},
"link-ref": {
"captures": {
"1": {
"name": "punctuation.definition.link.title.begin.markdown"
},
"2": {
"name": "string.other.link.title.markdown",
"patterns": [
{
"include": "#raw"
},
{
"include": "#bold"
},
{
"include": "#italic"
},
{
"include": "#strikethrough"
},
{
"include": "#image-inline"
}
]
},
"4": {
"name": "punctuation.definition.link.title.end.markdown"
},
"5": {
"name": "punctuation.definition.constant.begin.markdown"
},
"6": {
"name": "constant.other.reference.link.markdown"
},
"7": {
"name": "punctuation.definition.constant.end.markdown"
}
},
"match": "(?<![\\]\\\\])(\\[)((?<square>[^\\[\\]\\\\]|\\\\.|\\[\\g<square>*+\\])*+)(\\])(\\[)([^\\]]*+)(\\])",
"name": "meta.link.reference.markdown"
},
"link-ref-literal": {
"captures": {
"1": {
"name": "punctuation.definition.link.title.begin.markdown"
},
"2": {
"name": "string.other.link.title.markdown"
},
"4": {
"name": "punctuation.definition.link.title.end.markdown"
},
"5": {
"name": "punctuation.definition.constant.begin.markdown"
},
"6": {
"name": "punctuation.definition.constant.end.markdown"
}
},
"match": "(?<![\\]\\\\])(\\[)((?<square>[^\\[\\]\\\\]|\\\\.|\\[\\g<square>*+\\])*+)(\\])[ ]?(\\[)(\\])",
"name": "meta.link.reference.literal.markdown"
},
"link-ref-shortcut": {
"captures": {
"1": {
"name": "punctuation.definition.link.title.begin.markdown"
},
"2": {
"name": "string.other.link.title.markdown"
},
"3": {
"name": "punctuation.definition.link.title.end.markdown"
}
},
"match": "(?<![\\]\\\\])(\\[)((?:[^\\s\\[\\]\\\\]|\\\\[\\[\\]])+?)((?<!\\\\)\\])",
"name": "meta.link.reference.markdown"
},
"list_paragraph": {
"begin": "(^|\\G)(?=\\S)(?![*+->]\\s|\\d+\\.\\s)",
"name": "meta.paragraph.markdown",
"patterns": [
{
"include": "#inline"
},
{
"include": "text.html.derivative"
},
{
"include": "#heading-setext"
}
],
"while": "(^|\\G)(?!\\s*$|#|[ ]{0,3}([-*_>][ ]{2,}){3,}[ \\t]*$\\n?|[ ]{0,3}[*+->]|[ ]{0,3}\\d+\\.)"
},
"lists": {
"patterns": [
{
"begin": "(^|\\G)([ ]{0,3})([*+-])([ \\t])",
"beginCaptures": {
"3": {
"name": "punctuation.definition.list.begin.markdown"
}
},
"comment": "Currently does not support un-indented second lines.",
"name": "markup.list.unnumbered.markdown",
"patterns": [
{
"include": "#block"
},
{
"include": "#list_paragraph"
}
],
"while": "((^|\\G)([ ]{2,4}|\\t))|(^[ \\t]*$)"
},
{
"begin": "(^|\\G)([ ]{0,3})(\\d+[\\.)])([ \\t])",
"beginCaptures": {
"3": {
"name": "punctuation.definition.list.begin.markdown"
}
},
"name": "markup.list.numbered.markdown",
"patterns": [
{
"include": "#block"
},
{
"include": "#list_paragraph"
}
],
"while": "((^|\\G)([ ]{2,4}|\\t))|(^[ \\t]*$)"
}
]
},
"paragraph": {
"begin": "(^|\\G)[ ]{0,3}(?=[^ \\t\\n])",
"name": "meta.paragraph.markdown",
"patterns": [
{
"include": "#inline"
},
{
"include": "text.html.derivative"
},
{
"include": "#heading-setext"
}
],
"while": "(^|\\G)((?=\\s*[-=]{3,}\\s*$)|[ ]{4,}(?=[^ \\t\\n]))"
},
"raw": {
"captures": {
"1": {
"name": "punctuation.definition.raw.markdown"
},
"3": {
"name": "punctuation.definition.raw.markdown"
}
},
"match": "(`+)((?:[^`]|(?!(?<!`)\\1(?!`))`)*+)(\\1)",
"name": "markup.inline.raw.string.markdown"
},
"raw_block": {
"begin": "(^|\\G)([ ]{4}|\\t)",
"name": "markup.raw.block.markdown",
"while": "(^|\\G)([ ]{4}|\\t)"
},
"separator": {
"match": "(^|\\G)[ ]{0,3}([\\*\\-_])([ ]{0,2}\\2){2,}[ \\t]*$\\n?",
"name": "meta.separator.markdown"
},
"strikethrough": {
"captures": {
"1": {
"name": "punctuation.definition.strikethrough.markdown"
},
"2": {
"patterns": [
{
"applyEndPatternLast": true,
"begin": "(?=<[^>]*?>)",
"end": "(?<=>)",
"patterns": [
{
"include": "text.html.derivative"
}
]
},
{
"include": "#escape"
},
{
"include": "#ampersand"
},
{
"include": "#bracket"
},
{
"include": "#raw"
},
{
"include": "#bold"
},
{
"include": "#italic"
},
{
"include": "#image-inline"
},
{
"include": "#link-inline"
},
{
"include": "#link-inet"
},
{
"include": "#link-email"
},
{
"include": "#image-ref"
},
{
"include": "#link-ref-literal"
},
{
"include": "#link-ref"
},
{
"include": "#link-ref-shortcut"
}
]
},
"3": {
"name": "punctuation.definition.strikethrough.markdown"
}
},
"match": "(?<!\\\\)(~{2,})((?:[^~]|(?!(?<![~\\\\])\\1(?!~))~)*+)(\\1)",
"name": "markup.strikethrough.markdown"
},
"table": {
"begin": "(^|\\G)(\\|)(?=[^|].+\\|\\s*$)",
"beginCaptures": {
"2": {
"name": "punctuation.definition.table.markdown"
}
},
"name": "markup.table.markdown",
"patterns": [
{
"match": "\\|",
"name": "punctuation.definition.table.markdown"
},
{
"captures": {
"1": {
"name": "punctuation.separator.table.markdown"
}
},
"match": "(?<=\\|)\\s*(:?-+:?)\\s*(?=\\|)"
},
{
"captures": {
"1": {
"patterns": [
{
"include": "#inline"
}
]
}
},
"match": "(?<=\\|)\\s*(?=\\S)((\\\\\\||[^|])+)(?<=\\S)\\s*(?=\\|)"
}
],
"while": "(^|\\G)(?=\\|)"
},
"shortcut": {
"match": "(\\$|\\.|#)([-_:a-zA-Z0-9]+)",
"name": "string.other.markdoc-shortcut"
},
"attribute": {
"match": "([-_a-zA-Z0-9]+)(=)",
"captures": {
"1": {
"name": "entity.other.attribute-name"
},
"2": {
"name": "punctuation.definition.tag.equal.markdoc"
}
}
},
"tag": {
"name": "punctuation.definition.tag",
"begin": "({%)\\s*/?([-_a-zA-Z0-9]+)?",
"end": "\\s*/?\\s*%}",
"beginCaptures": {
"1": {
"name": "punctuation.definition.tag.begin.markdoc"
},
"2": {
"name": "entity.name.tag"
}
},
"endCaptures": {
"0": {
"name": "punctuation.definition.tag.end.markdoc"
}
},
"patterns": [
{
"include": "#attribute"
},
{
"include": "#shortcut"
},
{
"include": "source.json"
}
]
}
},
"scopeName": "text.html.markdoc"
}
================================================
FILE: docs/lunaria/components.ts
================================================
import { html } from '@lunariajs/core';
export const TitleParagraph = () => html`
<p>
If you're interested in helping us translate
<a href="https://starlight.astro.build/">starlight.astro.build</a> into one of the languages
listed below, you've come to the right place! This auto-updating page always lists all the
content that could use your help right now.
</p>
<p>
Before starting a new translation, please read our
<a
href="https://github.com/withastro/starlight/blob/main/CONTRIBUTING.md#translating-starlights-docs"
>translation guide</a
>
to learn about our translation process and how you can get involved.
</p>
`;
================================================
FILE: docs/lunaria/renderer.config.ts
================================================
import { defineRendererConfig } from '@lunariajs/core';
import { TitleParagraph } from './components';
export default defineRendererConfig({
slots: {
afterTitle: TitleParagraph,
},
});
================================================
FILE: docs/lunaria/styles.css
================================================
:root {
--theme-accent: hsl(234, 100%, 87%);
--theme-bg: hsl(223, 13%, 10%);
--theme-table-header: hsl(222, 13%, 16%);
--theme-table-hover: hsl(222, 13%, 16%);
--theme-text: hsl(228, 8%, 77%);
--theme-text-bright: hsl(0, 0%, 100%);
--overlay-blurple: hsla(255, 60%, 60%, 0.2);
--ln-color-background: linear-gradient(215deg, var(--overlay-blurple), transparent 40%),
radial-gradient(var(--overlay-blurple), transparent 40%) no-repeat -60vw -40vh / 105vw 200vh,
radial-gradient(var(--overlay-blurple), transparent 65%) no-repeat 50% calc(100% + 20rem) /
60rem 30rem,
var(--theme-bg);
--ln-color-link: var(--theme-accent);
--ln-color-black: var(--theme-text);
--ln-color-done: var(--ln-color-blue);
--ln-color-outdated: #ea580c;
--ln-color-missing: var(--theme-text-bright);
--ln-color-table-background: var(--theme-table-header);
--ln-color-table-border: var(--theme-table-header);
color-scheme: dark;
}
h1,
h2,
h3,
h4,
h5,
h6 {
color: var(--theme-text-bright);
}
p a {
text-decoration: underline;
}
.create-button {
background-color: hsl(213deg 89% 64% / 20%);
border-radius: 0.5em;
}
sup {
display: flex;
justify-content: center;
}
================================================
FILE: docs/lunaria.config.json
================================================
{
"$schema": "./node_modules/@lunariajs/core/config.schema.json",
"repository": {
"name": "withastro/starlight",
"rootDir": "docs"
},
"defaultLocale": {
"label": "English",
"lang": "en"
},
"locales": [
{
"label": "Dansk",
"lang": "da"
},
{
"label": "Deutsch",
"lang": "de"
},
{
"label": "Español",
"lang": "es"
},
{
"label": "Français",
"lang": "fr"
},
{
"label": "हिंदी",
"lang": "hi"
},
{
"label": "Bahasa Indonesia",
"lang": "id"
},
{
"label": "Italiano",
"lang": "it"
},
{
"label": "日本語",
"lang": "ja"
},
{
"label": "한국어",
"lang": "ko"
},
{
"label": "Português do Brasil",
"lang": "pt-br"
},
{
"label": "Português",
"lang": "pt-pt"
},
{
"label": "Русский",
"lang": "ru"
},
{
"label": "Türkçe",
"lang": "tr"
},
{
"label": "Українська",
"lang": "uk"
},
{
"label": "简体中文",
"lang": "zh-cn"
}
],
"files": [
{
"location": "src/content/docs/**/*.{md,mdx}",
"pattern": "src/content/docs/@lang/@path",
"type": "universal"
}
],
"dashboard": {
"title": "Starlight Docs Translation Status",
"description": "Translation progress tracker for the Starlight Docs site. See how much has been translated in your language and get involved!",
"favicon": {
"external": [
{
"link": "https://starlight.astro.build/favicon.svg",
"type": "image/svg+xml"
}
]
},
"customCss": ["./lunaria/styles.css"],
"basesToHide": ["src/content/docs/"],
"ui": {
"statusByLocale.heading": "Translation progress by locale",
"statusByLocale.incompleteLocalizationLink": "incomplete translation",
"statusByLocale.outdatedLocalizationLink": "outdated translation",
"statusByLocale.completeLocalization": "This translation is complete, amazing job! 🎉",
"statusByFile.heading": "Translation status by file"
}
},
"ignoreKeywords": ["lunaria-ignore", "typo", "en-only", "broken link", "i18nReady", "i18nIgnore"],
"renderer": "./lunaria/renderer.config.ts"
}
================================================
FILE: docs/package.json
================================================
{
"name": "starlight-docs",
"private": true,
"type": "module",
"version": "0.0.1",
"scripts": {
"test": "playwright install --with-deps chromium && playwright test",
"dev": "astro dev",
"start": "astro dev",
"build": "astro build",
"preview": "astro preview",
"typecheck": "tsc --noEmit",
"linkcheck": "CHECK_LINKS=true pnpm build",
"astro": "astro",
"lunaria:build": "lunaria build",
"grammars": "node grammars/generate.mjs"
},
"dependencies": {
"@astro-community/astro-embed-youtube": "^0.5.10",
"@astrojs/starlight": "workspace:*",
"@lunariajs/core": "^0.1.1",
"@types/culori": "^2.1.1",
"astro": "^6.0.1",
"culori": "^4.0.1",
"sharp": "^0.34.2"
},
"devDependencies": {
"@playwright/test": "^1.57.0",
"axe-playwright": "^2.0.3",
"sitemapper": "^3.2.12",
"starlight-links-validator": "^0.20.0"
}
}
================================================
FILE: docs/playwright.config.ts
================================================
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
forbidOnly: !!process.env['CI'],
projects: [
{
name: 'Chrome Stable',
use: {
...devices['Desktop Chrome'],
headless: true,
},
},
],
testMatch: '__a11y__/*.test.ts',
// The timeout for the accessibility tests only.
timeout: 180 * 1_000,
webServer: [
{
command: 'pnpm run build && pnpm run preview',
reuseExistingServer: !process.env['CI'],
stdout: 'pipe',
// The timeout of the single build step ran before the accessibility tests.
timeout: 120 * 1_000,
url: 'http://localhost:4321',
},
],
workers: 1,
});
================================================
FILE: docs/public/_headers
================================================
/_astro/*
Cache-Control: public
Cache-Control: max-age=31536000
Cache-Control: immutable
================================================
FILE: docs/public/_redirects
================================================
# Proxy to Phat Houston from our Product Hunt launch — site operated by Otterlord
/ph/* https://astro-houston-ph.pages.dev/ph/:splat 200
# Moved content
/zh/* /zh-cn/:splat
/showcase/ /resources/showcase/
/:lang/showcase/ /:lang/resources/showcase/
# Component docs
/guides/components/ /components/using-components/
/:lang/guides/components/ /:lang/components/using-components/
# Translated 404s
/:lang/* /:lang/404/ 404
/* /404/ 404
================================================
FILE: docs/src/assets/landing.css
================================================
:root {
--purple-hsl: 255, 60%, 60%;
--overlay-blurple: hsla(var(--purple-hsl), 0.2);
}
:root[data-theme='light'] {
--purple-hsl: 255, 85%, 65%;
}
[data-has-hero] .page {
background:
linear-gradient(215deg, var(--overlay-blurple), transparent 40%),
radial-gradient(var(--overlay-blurple), transparent 40%) no-repeat -60vw -40vh / 105vw 200vh,
radial-gradient(var(--overlay-blurple), transparent 65%) no-repeat 50% calc(100% + 20rem) /
60rem 30rem;
}
[data-has-hero] header {
border-bottom: 1px solid transparent;
background-color: transparent;
-webkit-backdrop-filter: blur(16px);
backdrop-filter: blur(16px);
}
[data-has-hero] .hero > img {
filter: drop-shadow(0 0 3rem var(--overlay-blurple));
}
================================================
FILE: docs/src/assets/robots.txt
================================================
User-agent: *
Allow: /
Sitemap: https://starlight.astro.build/sitemap-index.xml
================================================
FILE: docs/src/components/about-astro.astro
================================================
---
interface Props {
title: string;
}
const { title } = Astro.props;
---
<article class="sl-flex" aria-labelledby="about-astro-heading">
<small id="about-astro-heading">
{title}
<span class="sr-only">Astro</span>
</small>
<svg
aria-hidden="true"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 301 79"
fill="var(--sl-color-white)"
>
<path
d="M20.8 66.8c-3.6-3.2-4.6-10-3.1-15 2.5 3.2 6.1 4.2 9.8 4.7 5.7.9 11.3.6 16.5-2l1.9-1.1a9 9 0 0 1 .4 4.3 12 12 0 0 1-5 8.5l-3.6 2.4c-3.6 2.4-4.6 5.3-3.2 9.4l.1.5c-1.8-.8-3.2-2-4.2-3.6-1-1.7-1.6-3.5-1.6-5.5 0-1 0-2-.2-3-.3-2.3-1.4-3.3-3.4-3.4a4 4 0 0 0-4.3 3.3l-.1.5ZM.5 51s10.5-5 21-5l8-24.6c.3-1.2 1.2-2 2.2-2 1 0 1.8.8 2.1 2l8 24.5c12.5 0 21 5.1 21 5.1L45 2.4C44.4.9 43.6 0 42.4 0H21c-1.2 0-2 1-2.6 2.4L.5 51Zm111-7c0 4.3-5.4 6.8-12.8 6.8-4.9 0-6.6-1.2-6.6-3.7 0-2.6 2.1-3.9 7-3.9 4.3 0 8 .1 12.4.6v.2Zm0-5.4a56 56 0 0 0-11.4-1c-14 0-20.5 3.4-20.5 11 0 8 4.5 11 14.9 11 8.8 0 14.7-2.2 17-7.6h.3l-.2 3.6c0 2.8.5 3 2.8 3h10.9c-.6-1.6-1-6.3-1-10.4l.2-12c0-9.1-5.4-14.8-22.4-14.8a83 83 0 0 0-21.7 3C81 27 82 32 82.3 35.2c5.3-2.5 13-3.6 18.8-3.6 8.2 0 10.4 1.9 10.4 5.6v1.5Zm29.8 7.9c-1.5.2-3.5.2-5.5.2-2.2 0-4.2-.1-5.6-.3V48c0 7.5 4.9 11.8 22 11.8 16.3 0 21.6-4.3 21.6-11.8 0-7.2-3.5-10.8-19-11.5-11.9-.6-13-1.9-13-3.4 0-1.7 1.6-2.6 9.6-2.6 8.3 0 10.6 1.1 10.6 3.5v.6a120.9 120.9 0 0 1 11 0l.1-1.4c0-8.8-7.3-11.7-21.5-11.7-15.9 0-21.3 4-21.3 11.5 0 6.8 4.3 11 19.6 11.7 11.3.4 12.5 1.6 12.5 3.4 0 1.8-1.8 2.7-9.7 2.7-9 0-11.4-1.3-11.4-3.9v-.3ZM193.2 15c-4.3 4-12 8-16.3 9v8.5l4 .1-.1 12.8c0 8 4.2 14 17.2 14 5.5 0 9.1-.7 13.7-1.6-.5-3-1-7.4-1.2-10.8-2.7.9-6.1 1.3-10 1.3-5.2 0-7.3-1.4-7.3-5.5v-10l17.5.2c0-3 0-7.6.2-10.6-5.7.2-12.1.2-17.4.2l.1-7.6h-.4Zm35.3 15.8.1-8.4h-11.8a752.4 752.4 0 0 1 0 36.2h13.5c-.2-3.5-.3-9.6-.3-14.7 0-8.1 3.3-10.5 10.8-10.5 3.5 0 6 .5 8.2 1.2 0-3 .6-9 1-11.6-2.3-.6-4.7-1-7.7-1-6.5-.1-11.2 2.5-13.4 8.8h-.4Zm59 9.5c0 6.5-4.7 9.6-12.1 9.6-7.4 0-12.1-2.9-12.1-9.6 0-6.7 4.8-9.2 12-9.2 7.4 0 12.2 2.7 12.2 9.2Zm12.3-.3c0-13-10.1-18.8-24.4-18.8-14.4 0-24.2 5.8-24.2 18.8s9.1 20 24.1 20c15.1 0 24.5-7 24.5-19.9Z"
>
</path>
</svg>
<slot />
</article>
<style>
article {
max-width: 40rem;
margin-inline: auto;
padding-block: 5rem;
flex-direction: column;
align-items: center;
text-align: center;
gap: 0.5rem;
}
article > :global(*) {
max-width: 50ch;
margin-top: 0 !important;
}
small {
color: var(--sl-color-gray-3);
}
svg {
width: 15rem;
}
</style>
================================================
FILE: docs/src/components/component-preview.astro
================================================
---
import { Tabs, TabItem } from '@astrojs/starlight/components';
const showContentTypeTabs = Astro.slots.has('markdoc');
---
<figure>
{
showContentTypeTabs ? (
<Tabs syncKey="content-type">
<TabItem label="MDX">
<slot />
</TabItem>
<TabItem label="Markdoc">
<slot name="markdoc" />
</TabItem>
</Tabs>
) : (
<slot />
)
}
<div class="preview">
<figcaption>{Astro.locals.t('component.preview')}</figcaption>
<div class="preview-content"><slot name="preview" /></div>
</div>
</figure>
<style>
:global(.sl-markdown-content) .preview {
border: 1px solid var(--sl-color-gray-5);
border-top: none;
margin-top: 0;
}
.preview:only-child {
border-top: 1px solid var(--sl-color-gray-5);
}
figcaption {
font-size: var(--sl-text-sm);
font-weight: 600;
padding: 0.5rem 1rem 0;
}
:global(.sl-markdown-content) .preview-content {
margin-top: 0;
padding: 1rem;
}
</style>
================================================
FILE: docs/src/components/fluid-grid.astro
================================================
---
interface Props {
minColumnWidth?: string;
gap?: string;
}
const { minColumnWidth, gap } = Astro.props;
---
<ul class="fluid-grid"><slot /></ul>
<style define:vars={{ minColumnWidth, gap }}>
.fluid-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--minColumnWidth, 11rem)), 1fr));
gap: var(--gap, 1rem);
list-style: none;
padding: 0;
}
.fluid-grid > :global(*) {
margin-top: 0 !important;
}
</style>
================================================
FILE: docs/src/components/icons-list.astro
================================================
---
import { Icon } from '@astrojs/starlight/components';
import { Icons, type StarlightIcon } from '../../../packages/starlight/components-internals/Icons';
interface Props {
labels?: {
copied?: string;
};
}
const { copied = 'Copied!' } = Astro.props.labels ?? {};
const icons = Object.keys(Icons) as StarlightIcon[];
---
<div class="icons-grid" data-label-copied={copied}>
{
icons.map((icon) => {
return (
<button class="icon-preview" aria-label={`Copy ${icon} icon to clipboard`} data-name={icon}>
<Icon name={icon} size="1.5rem" />
<span aria-live="polite">{icon}</span>
</button>
);
})
}
</div>
<script>
const iconGrid = document.querySelector<HTMLDivElement>('.icons-grid');
const copiedLabel = document.querySelector<HTMLDivElement>('.icons-grid')?.dataset.labelCopied!;
iconGrid?.addEventListener('click', (event) => {
if (!(event.target instanceof Element)) return;
const icon = event.target.closest('.icon-preview');
if (!(icon instanceof HTMLButtonElement)) return;
const iconName = icon.dataset.name!;
navigator.clipboard.writeText(iconName);
const iconLabel = icon.querySelector('[aria-live]');
if (iconLabel) {
iconLabel.textContent = copiedLabel;
setTimeout(() => {
iconLabel.textContent = iconName;
}, 1000);
}
});
</script>
<style>
.icons-grid {
display: grid;
gap: 1rem;
grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
}
.icons-grid .icon-preview {
align-items: center;
justify-content: center;
text-align: center;
border: 1px solid var(--sl-color-gray-5);
display: flex;
flex-direction: column;
font-size: var(--sl-text-sm);
gap: 0.25rem;
margin: 0;
overflow-wrap: anywhere;
padding: 0.75rem;
background: none;
}
.icon-preview:hover,
.icon-preview:focus {
cursor: pointer;
border: 1px solid var(--sl-color-gray-3);
background: var(--sl-color-gray-7, var(--sl-color-gray-6));
}
</style>
================================================
FILE: docs/src/components/languages-list.astro
================================================
---
import { getEntry } from 'astro:content';
import translations from '../../../packages/starlight/translations';
interface Props {
startsSentence?: boolean;
}
// The current page's slug.
const slug = Astro.url.pathname.replace(/^\//, '').replace(/\/$/, '');
// The docs entry for the current page, or `undefined` if the page is using fallback content.
const entry = await getEntry('docs', slug);
// The BCP-47 tag for the current page or fallback content's language.
const pageLang = entry && Astro.currentLocale ? Astro.currentLocale : 'en';
// The BCP-47 tags for all supported languages in Starlight.
const supportedLangs = Object.keys(translations);
// An i18n helper that returns the language name for a given BCP-47 tag configured for the current page's language.
const langNames = new Intl.DisplayNames([pageLang], { type: 'language' });
// A list of the language names for all supported languages sorted alphabetically.
const supportedLangNames = supportedLangs
.map((supportedLang) => {
const langName = langNames.of(supportedLang);
if (!langName) throw new Error(`Failed to get the language name for '${supportedLang}'.`);
return langName;
})
.sort((a, b) => a.localeCompare(b, pageLang));
// The list of language names for all supported languages formatted according to the current page's language.
const langList = new Intl.ListFormat(pageLang, {
style: 'long',
type: 'conjunction',
}).format(supportedLangNames);
---
{
Astro.props.startsSentence
? langList[0]?.toLocaleUpperCase(pageLang) + langList.slice(1)
: langList
}
================================================
FILE: docs/src/components/media-card.astro
================================================
---
interface Props {
href?: string | undefined;
}
const { href } = Astro.props;
const El = href ? 'a' : 'span';
---
<li class="not-content sl-flex">
<El class="media-card sl-flex" {href}>
<div class="media"><slot name="media" /></div>
<slot />
</El>
</li>
<style>
.media-card {
flex-direction: column;
border: 1px solid var(--sl-color-gray-5);
border-radius: 0.5rem;
overflow: hidden;
text-decoration: none;
box-shadow: var(--sl-shadow-sm);
width: 100%;
}
a:hover {
border-color: var(--sl-color-gray-2);
background-color: var(--sl-color-gray-7, var(--sl-color-gray-6));
}
.media {
border-bottom: 1px solid var(--sl-color-gray-5);
}
.media :global(img) {
display: block;
width: 100%;
height: auto;
aspect-ratio: 16 / 9;
object-fit: cover;
}
.media-card :global(.title) {
color: var(--sl-color-white);
font-weight: 600;
line-height: var(--sl-line-height-headings);
}
</style>
================================================
FILE: docs/src/components/showcase-card.astro
================================================
---
import type { ImageMetadata } from 'astro';
import { Image } from 'astro:assets';
import MediaCard from './media-card.astro';
import { AstroError } from 'astro/errors';
interface Props {
href: string;
title: string;
thumbnail: string;
}
const { href, title } = Astro.props;
const thumbnails = import.meta.glob<{ default: ImageMetadata }>(
'../assets/showcase/*{.png,.jpg,.jpeg,.webp,.avif}'
);
const thumbnail = thumbnails[`../assets/showcase/${Astro.props.thumbnail}`];
if (!thumbnail) {
throw new Error(`Could not resolve showcase thumbnail: ${Astro.props.thumbnail}`);
}
const src = (await thumbnail()).default;
if (src.width !== 800 || src.height !== 450) {
let fileName = src.src.split('/').pop();
const queryIndex = fileName?.indexOf('?');
if (queryIndex !== undefined && queryIndex > -1) {
fileName = fileName?.slice(0, queryIndex);
}
throw new AstroError(
'Showcase images must be **800×450px**',
`Dimensions of **${src.width}×${src.height}px** found for showcase image \`${fileName || src.src}\`\n\n` +
`For best results:\n\n` +
`1. Take a screenshot of the site using a browser resized to **1280×720px**. The responsive view in dev tools can be helpful for this.\n\n` +
`2. Resize the screenshot to **800×450px** and make sure it is saved as a PNG. An online tool like [Squoosh](https://squoosh.app/) can help here.\n\n` +
`See more details in the [Starlight contributing guide](https://github.com/withastro/starlight/blob/main/CONTRIBUTING.md#showcase)\n`
);
}
---
<MediaCard {href}>
<Image slot="media" {src} alt="" width="560" />
<p class="title">{title}</p>
</MediaCard>
<style>
.title {
padding: 0.75rem 1rem;
}
</style>
================================================
FILE: docs/src/components/showcase-sites.astro
================================================
---
import Card from './showcase-card.astro';
import FluidGrid from './fluid-grid.astro';
---
<FluidGrid>
<Card title="Athena OS" href="https://athenaos.org" thumbnail="www.athenaos.org.png" />
<Card title="pls" href="https://pls.cli.rs/" thumbnail="pls.cli.rs.png" />
<Card title="capo.js" href="https://rviscomi.github.io/capo.js/" thumbnail="capo.js.png" />
<Card
title="Web Monetization API"
href="https://webmonetization.org/docs/"
thumbnail="webmonetization.org.png"
/>
<Card
title="QBCore Docs"
href="https://brycerussell.github.io/qbcore-docs/"
thumbnail="brycerussell.github.io-qbcore-docs.png"
/>
<Card title="har.fyi" href="https://har.fyi/" thumbnail="har.fyi.png" />
<Card title="xs-dev docs" href="https://xs-dev.js.org" thumbnail="xs-dev.js.org.png" />
<Card title="Felicity" href="https://felicity.pages.dev/" thumbnail="felicity.pages.dev.png" />
<Card
title="NgxEditor"
href="https://sibiraj-s.github.io/ngx-editor/"
thumbnail="sibiraj-s.github.io-ngx-editor.png"
/>
<Card title="Terrateam Docs" href="https://terrateam.io/docs" thumbnail="terrateam.io-docs.png" />
<Card
title="Obytes Starter"
href="https://starter.obytes.com"
thumbnail="starter.obytes.com.jpg"
/>
<Card
title="Kanri"
href="https://www.kanriapp.com/getting-started/what-is-kanri/"
thumbnail="kanriapp.com.png"
/>
<Card title="Refact" href="https://docs.refact.ai/" thumbnail="refact.ai.png" />
<Card
title="Some drops of PHP Book"
href="https://drops-of-php.hi-folks.dev/"
thumbnail="drops-of-php.hi-folks.dev.png"
/>
<Card title="Nostalgist.js" href="https://nostalgist.js.org/" thumbnail="nostalgist.js.org.png" />
<Card
title="AI Prompt Snippets"
href="https://ai-prompt-snippets.vercel.app/"
thumbnail="ai-prompt-snippets.png"
/>
<Card
title="Folks Router"
href="https://folksrouter.io/docs/introduction"
thumbnail="folksrouter.io.png"
/>
<Card
title="React Awesome Reveal"
href="https://react-awesome-reveal.morello.dev/"
thumbnail="react-awesome-reveal.morello.dev.png"
/>
<Card
title="Ethereum Follow Protocol"
href="https://docs.ethfollow.xyz/"
thumbnail="docs.ethfollow.xyz.png"
/>
<Card title="Knip" href="https://knip.dev" thumbnail="knip.dev.png" />
<Card title="secco" href="https://secco.lekoarts.de" thumbnail="secco.lekoarts.de.png" />
<Card
title="SiteOne Crawler"
href="https://crawler.siteone.io/?utm_source=starlight-docs"
thumbnail="crawler.siteone.io.png"
/>
<Card title="Mr. Robøt" href="https://docs.mrrobot.app" thumbnail="docs.mrrobot.app.png" />
<Card title="Open SaaS Docs" href="https://docs.opensaas.sh/" thumbnail="opensaas.sh.png" />
<Card
title="Astro Snipcart"
href="https://astro-snipcart.vercel.app/"
thumbnail="astro-snipcart.png"
/>
<Card title="oneRepo" href="https://onerepo.tools" thumbnail="onerepo.tools.png" />
<Card title="Flojoy" href="https://docs.flojoy.ai" thumbnail="docs.flojoy.ai.png" />
<Card title="AstroNvim" href="https://docs.astronvim.com" thumbnail="docs.astronvim.com.png" />
<Card
title="ScreenshotOne Docs"
href="https://screenshotone.com/docs/"
thumbnail="screenshotone.com.png"
/>
<Card title="DipSway" href="https://api.dipsway.com" thumbnail="api.dipsway.com.png" />
<Card title="RunsOn" href="https://runs-on.com" thumbnail="runs-on.com.png" />
<Card title="SST Ion" href="https://ion.sst.dev/" thumbnail="ion.sst.dev.png" />
<Card
title="Font Awesome"
href="https://docs.fontawesome.com/"
thumbnail="docs.fontawesome.com.png"
/>
<Card title="TrueCharts" href="https://truecharts.org/" thumbnail="truecharts.org.png" />
<Card title="Kinde" href="https://docs.kinde.com/" thumbnail="kinde.com.png" />
<Card title="DMNO" href="https://dmno.dev" thumbnail="dmno.dev.png" />
<Card title="EspansoEdit" href="https://ee.qqv.com.au" thumbnail="ee.qqv.com.au.png" />
<Card title="TutorialKit" href="https://tutorialkit.dev/" thumbnail="tutorialkit.dev.png" />
<Card
title="The Dev Health OS"
href="https://www.devhealthos.com/"
thumbnail="www.devhealthos.com.png"
/>
<Card
title="FeedbackSpark"
href="https://feedbackspark.com/docs/"
thumbnail="feedbackspark.com.png"
/>
<Card
title="QuotesDomain"
href="https://www.quotesdomain.com/"
thumbnail="quotesdomain.com.png"
/>
<Card title="Saasfly" href="https://document.saasfly.io/" thumbnail="document.saasfly.io.png" />
<Card
title="freeCodeCamp"
href="https://contribute.freecodecamp.org/intro/"
thumbnail="contribute.freecodecamp.org.png"
/>
<Card
title="Style Dictionary"
href="https://styledictionary.com/"
thumbnail="styledictionary.com.png"
/>
<Card title="CodeSweetly" href="https://codesweetly.com/" thumbnail="codesweetly.com.png" />
<Card title="grpcmd" href="https://grpc.md/docs/" thumbnail="grpc.md.png" />
<Card
title="Pokemon Database"
href="https://pokemon-siace.netlify.app/"
thumbnail="pokemon-siace.netlify.app.png"
/>
<Card
title="Cloudflare Docs"
href="https://developers.cloudflare.com/"
thumbnail="developers.cloudflare.com.png"
/>
<Card title="Open {re}Source" href="https://openresource.dev" thumbnail="openresource.dev.png" />
<Card
title="Orbit CSS"
href="https://zumerlab.github.io/orbit-docs/"
thumbnail="zumerlab.github.io.orbit-docs.png"
/>
<Card
title="LaunchFast"
href="https://www.launchfa.st/documentation"
thumbnail="launchfa.st.png"
/>
<Card title="Capgo" href="https://capgo.app/docs" thumbnail="capgo.app.png" />
<Card
title="React Bricks"
href="https://docs.reactbricks.com"
thumbnail="docs.reactbricks.com.png"
/>
<Card title="emoji-blast" href="https://emojiblast.dev" thumbnail="docs.emojiblast.dev.png" />
<Card
title="Text To Table Converter"
href="https://texttotableconverter.com"
thumbnail="texttotableconverter.com.png"
/>
<Card
title="Isomorphic Validation"
href="https://itihon.github.io/isomorphic-validation/"
thumbnail="itihon.github.io-isomorphic-validation.png"
/>
<Card
title="Accessible Astro"
href="https://accessible-astro.incluud.dev"
thumbnail="accessible-astro.incluud.dev.png"
/>
<Card title="Learn AISO" href="https://learnaiso.com" thumbnail="learnaiso.com.png" />
<Card title="PaperMC Docs" href="https://docs.papermc.io" thumbnail="docs.papermc.io.png" />
<Card title="Bingo" href="https://create.bingo" thumbnail="create.bingo.png" />
<Card title="OctoGuide" href="https://octo.guide" thumbnail="octo.guide.png" />
<Card
title="Sonar"
href="https://sonar-team.github.io/doc/"
thumbnail="sonar-team.github.io.png"
/>
<Card title="Cookie API" href="https://docs.cookie-api.com" thumbnail="docs.cookie-api.com.png" />
<Card title="Fluid DnD" href="https://fluid-dnd.netlify.app/" thumbnail="fluid-dnd.png" />
<Card title="PyDocs" href="https://www.pydocs.site/en" thumbnail="www.pydocs.site.png" />
<Card title="Fomr" href="https://fomr.io/help" thumbnail="fomr.io.png" />
<Card
title="The Jotter | Bag of Tricks"
href="https://events-3bg.pages.dev/jotter"
thumbnail="events-3bg.pages.dev.png"
/>
<Card title="@vtbag" href="https://vtbag.dev" thumbnail="vtbag.dev.png" />
<Card title="vlt docs" href="https://docs.vlt.sh/" thumbnail="docs.vlt.sh.png" />
<Card
title="sharp"
href="https://sharp.pixelplumbing.com/"
thumbnail="sharp.pixelplumbing.com.png"
/>
<Card title="Netlify Docs" href="https://docs.netlify.com" thumbnail="docs.netlify.com.png" />
<Card
title="Open AI Agents SDK"
href="https://openai.github.io/openai-agents-js/"
thumbnail="openai.github.io.png"
/>
<Card title="opencode" href="https://opencode.ai/docs" thumbnail="opencode.ai.png" />
<Card title="Scalekit Docs" href="https://docs.scalekit.com/" thumbnail="docs.scalekit.com.png" />
<Card title="Aptos Docs" href="https://aptos.dev" thumbnail="aptos.dev.png" />
<Card title="OmniPrint Docs" href="https://omni-byte.com/docs/" thumbnail="omni-byte.com.png" />
<Card title="Academeez" href="https://www.academeez.com/" thumbnail="academeez.com.png" />
<Card title="openstatus Docs" href="https://docs.openstatus.dev" thumbnail="openstatus.dev.png" />
<Card title="Saucer" href="https://saucer.app" thumbnail="saucer.app.png" />
<Card title="lychee" href="https://lychee.cli.rs/" thumbnail="lychee.cli.rs.png" />
<Card title="Biome" href="https://biomejs.dev/" thumbnail="biomejs.dev.png" />
<Card title="aspire.dev" href="https://aspire.dev/" thumbnail="aspire.dev.png" />
<Card title="bettercap" href="https://www.bettercap.org/" thumbnail="bettercap.org.png" />
<Card title="modestbench" href="https://modestbench.dev/" thumbnail="modestbench.dev.png" />
<Card title="LavaMoat" href="https://lavamoat.github.io/" thumbnail="lavamoat.github.io.png" />
<Card title="STACKIT Docs" href="https://docs.stackit.cloud" thumbnail="docs.stackit.cloud.png" />
<Card title="CatchIntent" href="https://catchintent.com/docs" thumbnail="catchintent.com.png" />
<Card title="Actionbase" href="https://actionbase.io/" thumbnail="actionbase.io.png" />
<Card title="Formware Help Center" href="https://formware.io/help/" thumbnail="formware.io.png" />
</FluidGrid>
================================================
FILE: docs/src/components/sidebar-preview.astro
================================================
---
import type {
AutoSidebarGroup,
SidebarItem,
InternalSidebarLinkItem,
} from '../../../packages/starlight/schemas/sidebar';
import SidebarSublist from '../../../packages/starlight/components/SidebarSublist.astro';
import type { Badge } from '../../../packages/starlight/schemas/badge';
import type { SidebarEntry } from '../../../packages/starlight/utils/routing/types';
interface Props {
config: SidebarConfig;
}
type SidebarConfig = (Exclude<SidebarItem, AutoSidebarGroup | InternalSidebarLinkItem> & {
badge?: Badge;
})[];
const { config } = Astro.props;
function makeEntries(items: SidebarConfig): SidebarEntry[] {
return items.map((item) => {
if ('link' in item) {
return {
type: 'link',
label: item.label,
// Empty hrefs are used to represent internal links that do not exist in the Starlight
// docs. Using a non-existing anchor link like `#_` will not trigger a page reload or any
// scrolling.
href: item.link.length > 0 ? item.link : '#_',
isCurrent: false,
badge: item.badge,
attrs: item.attrs ?? {},
};
}
return {
type: 'group',
label: item.label,
entries: makeEntries(item.items as SidebarConfig),
collapsed: item.collapsed,
badge: item.badge,
};
});
}
---
<div class="sidebar-preview not-content">
<SidebarSublist sublist={makeEntries(config)} />
</div>
<style>
.sidebar-preview {
background-color: var(--sl-color-bg-sidebar);
border: 1px solid var(--sl-color-gray-5);
padding: 1rem var(--sl-sidebar-pad-x);
/* Matches `var(--sl-sidebar-width)`, but hardcoded to avoid being overridden when printing the page. */
max-width: 18.75rem;
}
</style>
================================================
FILE: docs/src/components/social-links-type.astro
================================================
---
import { getRelativeLocaleUrl } from 'astro:i18n';
const href = getRelativeLocaleUrl(Astro.currentLocale ?? 'en', '/reference/icons/');
---
<code>
<Fragment set:text="Array<{" />
label: string; icon: <a {href}>StarlightIcon</a>; href: string
<Fragment set:text="}>" />
</code>
================================================
FILE: docs/src/components/testimonial-grid.astro
================================================
---
interface Props {
title: string;
}
const { title } = Astro.props;
---
<div class="testimonial-wrapper not-content" data-pagefind-ignore>
<h2 class="testimonial-grid-title">{title}</h2>
<ul class="testimonial-grid">
<slot />
</ul>
</div>
<style>
.testimonial-wrapper {
margin-block: 7rem 2.5rem !important;
font-size: clamp(var(--sl-text-sm), calc(0.5rem + 1vw), var(--sl-text-body));
}
.testimonial-grid-title {
text-align: center;
font-size: var(--sl-text-h3);
font-weight: 600;
color: var(--sl-color-white);
line-height: var(--sl-line-height-headings);
}
.testimonial-grid {
margin-top: 2.5rem;
display: grid;
gap: 5em;
padding-inline-start: 0;
}
@media (min-width: 50rem) {
.testimonial-grid {
grid-template-columns: 1fr 1fr;
}
}
</style>
================================================
FILE: docs/src/components/testimonial.astro
================================================
---
import type { ImageMetadata } from 'astro';
import { Image } from 'astro:assets';
interface Props {
handle: string;
name: string;
cite: string;
}
const { name, handle, cite } = Astro.props;
const avatars = import.meta.glob<{ default: ImageMetadata }>('../assets/testimonials/*.jpg');
const avatar = avatars[`../assets/testimonials/${handle}.jpg`];
if (!avatar) {
throw new Error(`Could not resolve testimonial avatar for @${handle}`);
}
const src = (await avatar()).default;
---
<li class="testimonial">
<blockquote class="quote" cite={cite}>
<slot />
</blockquote>
<div class="footer">
<Image class="avatar" height="96" width="96" {src} alt="" />
<div>
<p class="name">{name}</p>
<a href={cite} class="handle">@{handle}</a>
</div>
</div>
</li>
<style>
.testimonial {
display: flex;
flex-direction: column;
gap: 1.5em;
}
@media (min-width: 50rem) {
.testimonial {
gap: 2em;
}
}
.quote {
position: relative;
padding-inline-start: 1.5em;
}
.quote::before {
position: absolute;
content: '';
inset-block: 0.5em;
inset-inline-start: 0;
border-inline-start: 1px solid var(--sl-color-text-accent);
}
.quote > :global(* + *) {
margin-top: 0.75em;
}
.footer {
display: flex;
gap: 1rem;
align-items: center;
}
.avatar {
--outline-color: rgba(255, 255, 255, 0.33);
outline: 1px solid var(--outline-color);
outline-offset: -1px;
border-radius: 99rem;
width: 4em;
height: 4em;
}
:global([data-theme='light']) .avatar {
--outline-color: rgba(23, 25, 30, 0.33);
}
.name {
font-weight: 600;
font-size: var(--sl-text-h4);
color: var(--sl-color-white);
line-height: var(--sl-line-height-headings);
}
.handle {
text-underline-offset: 4px;
color: var(--sl-color-text-accent);
}
.handle:hover {
color: var(--sl-color-white);
}
</style>
================================================
FILE: docs/src/components/theme-designer/atom.ts
================================================
class Atom<T> {
#v: T;
#subscribers = new Map<(v: T) => void, (v: T) => void>();
#notify = () => this.#subscribers.forEach((cb) => cb(this.#v));
constructor(init: T) {
this.#v = init;
}
get(): T {
return this.#v;
}
set(v: T): void {
this.#v = v;
this.#notify();
}
subscribe(cb: (v: T) => void): () => boolean {
cb(this.#v);
this.#subscribers.set(cb, cb);
return () => this.#subscribers.delete(cb);
}
}
type MapStore<T> = Atom<T> & { setKey: (key: keyof T, value: T[typeof key]) => void };
export function map<T extends Record<string, unknown>>(value: T): MapStore<T> {
const atom = new Atom(value) as MapStore<T>;
atom.setKey = (key: keyof T, value: T[typeof key]) => {
const curr = atom.get();
if (curr[key] !== value) atom.set({ ...curr, [key]: value });
};
return atom;
}
export function atom<T>(value: T): Atom<T> {
return new Atom(value);
}
================================================
FILE: docs/src/components/theme-designer/color-editor.astro
================================================
---
import { oklchToHex } from './color-lib';
import { store } from './store';
import ValueSlider from './value-slider.astro';
export interface Props {
key: keyof typeof store;
legend: string;
labels: Record<'pickColor' | 'hue' | 'chroma', string>;
}
const { key, legend, labels } = Astro.props;
const { hue, chroma } = store[key].get();
const initialColor = oklchToHex(52, chroma, hue);
---
<color-editor data-key={key}>
<fieldset>
<legend>{legend}</legend>
<label class="color-picker">
<span class="sr-only">{labels.pickColor}</span>
<input type="color" value={initialColor} />
</label>
<div class="sliders">
<ValueSlider label={labels.hue} storeKey={key} type="hue" />
<ValueSlider label={labels.chroma} storeKey={key} type="chroma" />
</div>
</fieldset>
</color-editor>
<script>
import { oklch, oklchToHex } from './color-lib';
import { store } from './store';
export class ColorEditor extends HTMLElement {
#store = store[this.dataset.key as keyof typeof store];
#colorInput = this.querySelector<HTMLInputElement>('input[type="color"]')!;
constructor() {
super();
// Update color on user input.
this.#store.subscribe(({ chroma, hue }) => {
this.#colorInput.value = oklchToHex(52, chroma, hue);
});
this.#colorInput.addEventListener('input', (e) => {
if (!(e.target instanceof HTMLInputElement)) return;
const old = this.#store.get();
const { c, h } = { ...oklch(e.target.value) };
this.#store.set({ hue: h ?? old.hue, chroma: c ?? old.chroma });
});
}
}
customElements.define('color-editor', ColorEditor);
</script>
<style>
fieldset {
border: 1px solid var(--sl-color-gray-5);
background-color: var(--sl-color-gray-7, var(--sl-color-gray-6));
padding: 1rem;
color: var(--sl-color-white);
}
legend {
float: left;
float: inline-start;
font-weight: 600;
}
.color-picker {
float: right;
float: inline-end;
}
.sliders {
clear: both;
}
input[type='color'] {
border: 0;
background: transparent;
height: 2em;
width: 3rem;
cursor: pointer;
--swatch-border: var(--sl-color-gray-3);
}
input[type
gitextract_q6rx5rxj/ ├── .changeset/ │ ├── README.md │ └── config.json ├── .devcontainer/ │ ├── Dockerfile │ ├── devcontainer.json │ └── welcome-message.txt ├── .git-blame-ignore-revs ├── .github/ │ ├── DISCUSSION_TEMPLATE/ │ │ ├── docs-suggestions.yml │ │ └── feature-requests.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── ---01-bug-report.yml │ │ ├── ---02-docs-issue.yml │ │ └── config.yml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── labeler.yml │ ├── renovate.json5 │ └── workflows/ │ ├── ci.yml │ ├── congratsbot.yml │ ├── file-icons.yml │ ├── format.yml │ ├── lunaria.yml │ ├── pr-labeler.yml │ ├── preview-release.yml │ ├── release.yml │ ├── size-limit.yml │ └── welcome-bot.yml ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc ├── .vscode/ │ ├── extensions.json │ └── launch.json ├── CONTRIBUTING.md ├── LICENSE ├── docs/ │ ├── .gitignore │ ├── README.md │ ├── __a11y__/ │ │ ├── docs.test.ts │ │ └── test-utils.ts │ ├── astro.config.mjs │ ├── grammars/ │ │ ├── README.md │ │ ├── generate.mjs │ │ └── markdoc.tmLanguage.json │ ├── lunaria/ │ │ ├── components.ts │ │ ├── renderer.config.ts │ │ └── styles.css │ ├── lunaria.config.json │ ├── package.json │ ├── playwright.config.ts │ ├── public/ │ │ ├── _headers │ │ └── _redirects │ ├── src/ │ │ ├── assets/ │ │ │ ├── landing.css │ │ │ └── robots.txt │ │ ├── components/ │ │ │ ├── about-astro.astro │ │ │ ├── component-preview.astro │ │ │ ├── fluid-grid.astro │ │ │ ├── icons-list.astro │ │ │ ├── languages-list.astro │ │ │ ├── media-card.astro │ │ │ ├── showcase-card.astro │ │ │ ├── showcase-sites.astro │ │ │ ├── sidebar-preview.astro │ │ │ ├── social-links-type.astro │ │ │ ├── testimonial-grid.astro │ │ │ ├── testimonial.astro │ │ │ ├── theme-designer/ │ │ │ │ ├── atom.ts │ │ │ │ ├── color-editor.astro │ │ │ │ ├── color-lib.ts │ │ │ │ ├── contrast-level.astro │ │ │ │ ├── palette.astro │ │ │ │ ├── presets.astro │ │ │ │ ├── preview.astro │ │ │ │ ├── store.ts │ │ │ │ └── value-slider.astro │ │ │ ├── theme-designer.astro │ │ │ ├── theme-grid.astro │ │ │ ├── theme-image.astro │ │ │ ├── ui-strings-list.astro │ │ │ ├── youtube-card.astro │ │ │ └── youtube-grid.astro │ │ ├── content/ │ │ │ ├── docs/ │ │ │ │ ├── 404.md │ │ │ │ ├── components/ │ │ │ │ │ ├── asides.mdx │ │ │ │ │ ├── badges.mdx │ │ │ │ │ ├── card-grids.mdx │ │ │ │ │ ├── cards.mdx │ │ │ │ │ ├── code.mdx │ │ │ │ │ ├── file-tree.mdx │ │ │ │ │ ├── icons.mdx │ │ │ │ │ ├── link-buttons.mdx │ │ │ │ │ ├── link-cards.mdx │ │ │ │ │ ├── steps.mdx │ │ │ │ │ ├── tabs.mdx │ │ │ │ │ └── using-components.mdx │ │ │ │ ├── da/ │ │ │ │ │ ├── 404.md │ │ │ │ │ └── index.mdx │ │ │ │ ├── de/ │ │ │ │ │ ├── 404.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── asides.mdx │ │ │ │ │ │ ├── badges.mdx │ │ │ │ │ │ ├── card-grids.mdx │ │ │ │ │ │ ├── cards.mdx │ │ │ │ │ │ ├── code.mdx │ │ │ │ │ │ ├── file-tree.mdx │ │ │ │ │ │ ├── icons.mdx │ │ │ │ │ │ ├── link-buttons.mdx │ │ │ │ │ │ ├── link-cards.mdx │ │ │ │ │ │ ├── steps.mdx │ │ │ │ │ │ ├── tabs.mdx │ │ │ │ │ │ └── using-components.mdx │ │ │ │ │ ├── environmental-impact.md │ │ │ │ │ ├── getting-started.mdx │ │ │ │ │ ├── guides/ │ │ │ │ │ │ ├── authoring-content.mdx │ │ │ │ │ │ ├── css-and-tailwind.mdx │ │ │ │ │ │ ├── customization.mdx │ │ │ │ │ │ ├── i18n.mdx │ │ │ │ │ │ ├── overriding-components.mdx │ │ │ │ │ │ ├── pages.mdx │ │ │ │ │ │ ├── project-structure.mdx │ │ │ │ │ │ ├── route-data.mdx │ │ │ │ │ │ ├── sidebar.mdx │ │ │ │ │ │ └── site-search.mdx │ │ │ │ │ ├── index.mdx │ │ │ │ │ ├── manual-setup.mdx │ │ │ │ │ ├── reference/ │ │ │ │ │ │ ├── configuration.mdx │ │ │ │ │ │ ├── frontmatter.md │ │ │ │ │ │ ├── icons.mdx │ │ │ │ │ │ ├── overrides.md │ │ │ │ │ │ ├── plugins.md │ │ │ │ │ │ └── route-data.mdx │ │ │ │ │ └── resources/ │ │ │ │ │ ├── community-content.mdx │ │ │ │ │ ├── plugins.mdx │ │ │ │ │ ├── showcase.mdx │ │ │ │ │ └── themes.mdx │ │ │ │ ├── environmental-impact.md │ │ │ │ ├── es/ │ │ │ │ │ ├── 404.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── asides.mdx │ │ │ │ │ │ ├── badges.mdx │ │ │ │ │ │ ├── card-grids.mdx │ │ │ │ │ │ ├── cards.mdx │ │ │ │ │ │ ├── code.mdx │ │ │ │ │ │ ├── file-tree.mdx │ │ │ │ │ │ ├── icons.mdx │ │ │ │ │ │ ├── link-buttons.mdx │ │ │ │ │ │ ├── link-cards.mdx │ │ │ │ │ │ ├── steps.mdx │ │ │ │ │ │ ├── tabs.mdx │ │ │ │ │ │ └── using-components.mdx │ │ │ │ │ ├── environmental-impact.md │ │ │ │ │ ├── getting-started.mdx │ │ │ │ │ ├── guides/ │ │ │ │ │ │ ├── authoring-content.mdx │ │ │ │ │ │ ├── css-and-tailwind.mdx │ │ │ │ │ │ ├── customization.mdx │ │ │ │ │ │ ├── i18n.mdx │ │ │ │ │ │ ├── overriding-components.mdx │ │ │ │ │ │ ├── pages.mdx │ │ │ │ │ │ ├── project-structure.mdx │ │ │ │ │ │ ├── route-data.mdx │ │ │ │ │ │ ├── sidebar.mdx │ │ │ │ │ │ └── site-search.mdx │ │ │ │ │ ├── index.mdx │ │ │ │ │ ├── manual-setup.mdx │ │ │ │ │ ├── reference/ │ │ │ │ │ │ ├── configuration.mdx │ │ │ │ │ │ ├── frontmatter.md │ │ │ │ │ │ ├── icons.mdx │ │ │ │ │ │ ├── overrides.md │ │ │ │ │ │ ├── plugins.md │ │ │ │ │ │ └── route-data.mdx │ │ │ │ │ └── resources/ │ │ │ │ │ ├── community-content.mdx │ │ │ │ │ ├── plugins.mdx │ │ │ │ │ ├── showcase.mdx │ │ │ │ │ └── themes.mdx │ │ │ │ ├── fr/ │ │ │ │ │ ├── 404.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── asides.mdx │ │ │ │ │ │ ├── badges.mdx │ │ │ │ │ │ ├── card-grids.mdx │ │ │ │ │ │ ├── cards.mdx │ │ │ │ │ │ ├── code.mdx │ │ │ │ │ │ ├── file-tree.mdx │ │ │ │ │ │ ├── icons.mdx │ │ │ │ │ │ ├── link-buttons.mdx │ │ │ │ │ │ ├── link-cards.mdx │ │ │ │ │ │ ├── steps.mdx │ │ │ │ │ │ ├── tabs.mdx │ │ │ │ │ │ └── using-components.mdx │ │ │ │ │ ├── environmental-impact.md │ │ │ │ │ ├── getting-started.mdx │ │ │ │ │ ├── guides/ │ │ │ │ │ │ ├── authoring-content.mdx │ │ │ │ │ │ ├── css-and-tailwind.mdx │ │ │ │ │ │ ├── customization.mdx │ │ │ │ │ │ ├── i18n.mdx │ │ │ │ │ │ ├── overriding-components.mdx │ │ │ │ │ │ ├── pages.mdx │ │ │ │ │ │ ├── project-structure.mdx │ │ │ │ │ │ ├── route-data.mdx │ │ │ │ │ │ ├── sidebar.mdx │ │ │ │ │ │ └── site-search.mdx │ │ │ │ │ ├── index.mdx │ │ │ │ │ ├── manual-setup.mdx │ │ │ │ │ ├── reference/ │ │ │ │ │ │ ├── configuration.mdx │ │ │ │ │ │ ├── frontmatter.md │ │ │ │ │ │ ├── icons.mdx │ │ │ │ │ │ ├── overrides.md │ │ │ │ │ │ ├── plugins.md │ │ │ │ │ │ └── route-data.mdx │ │ │ │ │ └── resources/ │ │ │ │ │ ├── community-content.mdx │ │ │ │ │ ├── plugins.mdx │ │ │ │ │ ├── showcase.mdx │ │ │ │ │ └── themes.mdx │ │ │ │ ├── getting-started.mdx │ │ │ │ ├── guides/ │ │ │ │ │ ├── authoring-content.mdx │ │ │ │ │ ├── css-and-tailwind.mdx │ │ │ │ │ ├── customization.mdx │ │ │ │ │ ├── i18n.mdx │ │ │ │ │ ├── overriding-components.mdx │ │ │ │ │ ├── pages.mdx │ │ │ │ │ ├── project-structure.mdx │ │ │ │ │ ├── route-data.mdx │ │ │ │ │ ├── sidebar.mdx │ │ │ │ │ └── site-search.mdx │ │ │ │ ├── hi/ │ │ │ │ │ ├── 404.md │ │ │ │ │ ├── environmental-impact.md │ │ │ │ │ ├── getting-started.mdx │ │ │ │ │ └── index.mdx │ │ │ │ ├── id/ │ │ │ │ │ ├── 404.md │ │ │ │ │ ├── environmental-impact.md │ │ │ │ │ ├── getting-started.mdx │ │ │ │ │ └── index.mdx │ │ │ │ ├── index.mdx │ │ │ │ ├── it/ │ │ │ │ │ ├── 404.md │ │ │ │ │ ├── environmental-impact.md │ │ │ │ │ ├── getting-started.mdx │ │ │ │ │ ├── index.mdx │ │ │ │ │ └── resources/ │ │ │ │ │ ├── community-content.mdx │ │ │ │ │ ├── plugins.mdx │ │ │ │ │ └── showcase.mdx │ │ │ │ ├── ja/ │ │ │ │ │ ├── 404.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── asides.mdx │ │ │ │ │ │ ├── badges.mdx │ │ │ │ │ │ ├── card-grids.mdx │ │ │ │ │ │ ├── cards.mdx │ │ │ │ │ │ ├── code.mdx │ │ │ │ │ │ ├── file-tree.mdx │ │ │ │ │ │ ├── icons.mdx │ │ │ │ │ │ ├── link-buttons.mdx │ │ │ │ │ │ ├── link-cards.mdx │ │ │ │ │ │ ├── steps.mdx │ │ │ │ │ │ ├── tabs.mdx │ │ │ │ │ │ └── using-components.mdx │ │ │ │ │ ├── environmental-impact.md │ │ │ │ │ ├── getting-started.mdx │ │ │ │ │ ├── guides/ │ │ │ │ │ │ ├── authoring-content.mdx │ │ │ │ │ │ ├── css-and-tailwind.mdx │ │ │ │ │ │ ├── customization.mdx │ │ │ │ │ │ ├── i18n.mdx │ │ │ │ │ │ ├── overriding-components.mdx │ │ │ │ │ │ ├── pages.mdx │ │ │ │ │ │ ├── project-structure.mdx │ │ │ │ │ │ ├── route-data.mdx │ │ │ │ │ │ ├── sidebar.mdx │ │ │ │ │ │ └── site-search.mdx │ │ │ │ │ ├── index.mdx │ │ │ │ │ ├── manual-setup.mdx │ │ │ │ │ ├── reference/ │ │ │ │ │ │ ├── configuration.mdx │ │ │ │ │ │ ├── frontmatter.md │ │ │ │ │ │ ├── icons.mdx │ │ │ │ │ │ ├── overrides.md │ │ │ │ │ │ ├── plugins.md │ │ │ │ │ │ └── route-data.mdx │ │ │ │ │ └── resources/ │ │ │ │ │ ├── community-content.mdx │ │ │ │ │ ├── plugins.mdx │ │ │ │ │ ├── showcase.mdx │ │ │ │ │ └── themes.mdx │ │ │ │ ├── ko/ │ │ │ │ │ ├── 404.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── asides.mdx │ │ │ │ │ │ ├── badges.mdx │ │ │ │ │ │ ├── card-grids.mdx │ │ │ │ │ │ ├── cards.mdx │ │ │ │ │ │ ├── code.mdx │ │ │ │ │ │ ├── file-tree.mdx │ │ │ │ │ │ ├── icons.mdx │ │ │ │ │ │ ├── link-buttons.mdx │ │ │ │ │ │ ├── link-cards.mdx │ │ │ │ │ │ ├── steps.mdx │ │ │ │ │ │ ├── tabs.mdx │ │ │ │ │ │ └── using-components.mdx │ │ │ │ │ ├── environmental-impact.md │ │ │ │ │ ├── getting-started.mdx │ │ │ │ │ ├── guides/ │ │ │ │ │ │ ├── authoring-content.mdx │ │ │ │ │ │ ├── css-and-tailwind.mdx │ │ │ │ │ │ ├── customization.mdx │ │ │ │ │ │ ├── i18n.mdx │ │ │ │ │ │ ├── overriding-components.mdx │ │ │ │ │ │ ├── pages.mdx │ │ │ │ │ │ ├── project-structure.mdx │ │ │ │ │ │ ├── route-data.mdx │ │ │ │ │ │ ├── sidebar.mdx │ │ │ │ │ │ └── site-search.mdx │ │ │ │ │ ├── index.mdx │ │ │ │ │ ├── manual-setup.mdx │ │ │ │ │ ├── reference/ │ │ │ │ │ │ ├── configuration.mdx │ │ │ │ │ │ ├── frontmatter.md │ │ │ │ │ │ ├── icons.mdx │ │ │ │ │ │ ├── overrides.md │ │ │ │ │ │ ├── plugins.md │ │ │ │ │ │ └── route-data.mdx │ │ │ │ │ └── resources/ │ │ │ │ │ ├── community-content.mdx │ │ │ │ │ ├── plugins.mdx │ │ │ │ │ ├── showcase.mdx │ │ │ │ │ └── themes.mdx │ │ │ │ ├── manual-setup.mdx │ │ │ │ ├── pt-br/ │ │ │ │ │ ├── 404.md │ │ │ │ │ ├── environmental-impact.md │ │ │ │ │ ├── getting-started.mdx │ │ │ │ │ ├── index.mdx │ │ │ │ │ └── resources/ │ │ │ │ │ ├── community-content.mdx │ │ │ │ │ ├── plugins.mdx │ │ │ │ │ └── showcase.mdx │ │ │ │ ├── pt-pt/ │ │ │ │ │ ├── 404.md │ │ │ │ │ ├── environmental-impact.md │ │ │ │ │ ├── getting-started.mdx │ │ │ │ │ ├── index.mdx │ │ │ │ │ └── resources/ │ │ │ │ │ ├── community-content.mdx │ │ │ │ │ ├── plugins.mdx │ │ │ │ │ └── showcase.mdx │ │ │ │ ├── reference/ │ │ │ │ │ ├── configuration.mdx │ │ │ │ │ ├── frontmatter.md │ │ │ │ │ ├── icons.mdx │ │ │ │ │ ├── overrides.md │ │ │ │ │ ├── plugins.md │ │ │ │ │ └── route-data.mdx │ │ │ │ ├── resources/ │ │ │ │ │ ├── community-content.mdx │ │ │ │ │ ├── plugins.mdx │ │ │ │ │ ├── showcase.mdx │ │ │ │ │ └── themes.mdx │ │ │ │ ├── ru/ │ │ │ │ │ ├── 404.md │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── asides.mdx │ │ │ │ │ │ ├── badges.mdx │ │ │ │ │ │ ├── card-grids.mdx │ │ │ │ │ │ ├── cards.mdx │ │ │ │ │ │ ├── code.mdx │ │ │ │ │ │ ├── file-tree.mdx │ │ │ │ │ │ ├── icons.mdx │ │ │ │ │ │ ├── link-buttons.mdx │ │ │ │ │ │ ├── link-cards.mdx │ │ │ │ │ │ ├── steps.mdx │ │ │ │ │ │ ├── tabs.mdx │ │ │ │ │ │ └── using-components.mdx │ │ │ │ │ ├── environmental-impact.md │ │ │ │ │ ├── getting-started.mdx │ │ │ │ │ ├── guides/ │ │ │ │ │ │ ├── authoring-content.mdx │ │ │ │ │ │ ├── css-and-tailwind.mdx │ │ │ │ │ │ ├── customization.mdx │ │ │ │ │ │ ├── i18n.mdx │ │ │ │ │ │ ├── overriding-components.mdx │ │ │ │ │ │ ├── pages.mdx │ │ │ │ │ │ ├── project-structure.mdx │ │ │ │ │ │ ├── route-data.mdx │ │ │ │ │ │ ├── sidebar.mdx │ │ │ │ │ │ └── site-search.mdx │ │ │ │ │ ├── index.mdx │ │ │ │ │ ├── manual-setup.mdx │ │ │ │ │ ├── reference/ │ │ │ │ │ │ ├── configuration.mdx │ │ │ │ │ │ ├── frontmatter.md │ │ │ │ │ │ ├── icons.mdx │ │ │ │ │ │ ├── overrides.md │ │ │ │ │ │ ├── plugins.md │ │ │ │ │ │ └── route-data.mdx │ │ │ │ │ └── resources/ │ │ │ │ │ ├── community-content.mdx │ │ │ │ │ ├── plugins.mdx │ │ │ │ │ ├── showcase.mdx │ │ │ │ │ └── themes.mdx │ │ │ │ ├── tr/ │ │ │ │ │ ├── 404.md │ │ │ │ │ ├── environmental-impact.md │ │ │ │ │ ├── getting-started.mdx │ │ │ │ │ ├── index.mdx │ │ │ │ │ └── resources/ │ │ │ │ │ ├── community-content.mdx │ │ │ │ │ └── showcase.mdx │ │ │ │ ├── uk/ │ │ │ │ │ ├── 404.md │ │ │ │ │ ├── getting-started.mdx │ │ │ │ │ ├── index.mdx │ │ │ │ │ └── manual-setup.mdx │ │ │ │ └── zh-cn/ │ │ │ │ ├── 404.md │ │ │ │ ├── components/ │ │ │ │ │ ├── asides.mdx │ │ │ │ │ ├── badges.mdx │ │ │ │ │ ├── card-grids.mdx │ │ │ │ │ ├── cards.mdx │ │ │ │ │ ├── code.mdx │ │ │ │ │ ├── file-tree.mdx │ │ │ │ │ ├── icons.mdx │ │ │ │ │ ├── link-buttons.mdx │ │ │ │ │ ├── link-cards.mdx │ │ │ │ │ ├── steps.mdx │ │ │ │ │ ├── tabs.mdx │ │ │ │ │ └── using-components.mdx │ │ │ │ ├── environmental-impact.md │ │ │ │ ├── getting-started.mdx │ │ │ │ ├── guides/ │ │ │ │ │ ├── authoring-content.mdx │ │ │ │ │ ├── css-and-tailwind.mdx │ │ │ │ │ ├── customization.mdx │ │ │ │ │ ├── i18n.mdx │ │ │ │ │ ├── overriding-components.mdx │ │ │ │ │ ├── pages.mdx │ │ │ │ │ ├── project-structure.mdx │ │ │ │ │ ├── route-data.mdx │ │ │ │ │ ├── sidebar.mdx │ │ │ │ │ └── site-search.mdx │ │ │ │ ├── index.mdx │ │ │ │ ├── manual-setup.mdx │ │ │ │ ├── reference/ │ │ │ │ │ ├── configuration.mdx │ │ │ │ │ ├── frontmatter.md │ │ │ │ │ ├── icons.mdx │ │ │ │ │ ├── overrides.md │ │ │ │ │ ├── plugins.md │ │ │ │ │ └── route-data.mdx │ │ │ │ └── resources/ │ │ │ │ ├── community-content.mdx │ │ │ │ ├── plugins.mdx │ │ │ │ ├── showcase.mdx │ │ │ │ └── themes.mdx │ │ │ └── i18n/ │ │ │ ├── de.json │ │ │ ├── en.json │ │ │ ├── fr.json │ │ │ ├── ja.json │ │ │ ├── ko.json │ │ │ ├── ru.json │ │ │ └── zh-CN.json │ │ └── content.config.ts │ └── tsconfig.json ├── eslint.config.mjs ├── examples/ │ ├── basics/ │ │ ├── .gitignore │ │ ├── .vscode/ │ │ │ ├── extensions.json │ │ │ └── launch.json │ │ ├── README.md │ │ ├── astro.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── content/ │ │ │ │ └── docs/ │ │ │ │ ├── guides/ │ │ │ │ │ └── example.md │ │ │ │ ├── index.mdx │ │ │ │ └── reference/ │ │ │ │ └── example.md │ │ │ └── content.config.ts │ │ └── tsconfig.json │ ├── markdoc/ │ │ ├── .gitignore │ │ ├── .vscode/ │ │ │ ├── extensions.json │ │ │ └── launch.json │ │ ├── README.md │ │ ├── astro.config.mjs │ │ ├── markdoc.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── content/ │ │ │ │ └── docs/ │ │ │ │ ├── guides/ │ │ │ │ │ └── example.mdoc │ │ │ │ ├── index.mdoc │ │ │ │ └── reference/ │ │ │ │ └── example.mdoc │ │ │ └── content.config.ts │ │ └── tsconfig.json │ └── tailwind/ │ ├── .gitignore │ ├── .vscode/ │ │ ├── extensions.json │ │ └── launch.json │ ├── README.md │ ├── astro.config.mjs │ ├── package.json │ ├── src/ │ │ ├── content/ │ │ │ └── docs/ │ │ │ ├── guides/ │ │ │ │ └── example.md │ │ │ ├── index.mdx │ │ │ └── reference/ │ │ │ └── example.md │ │ ├── content.config.ts │ │ └── styles/ │ │ └── global.css │ └── tsconfig.json ├── package.json ├── packages/ │ ├── docsearch/ │ │ ├── CHANGELOG.md │ │ ├── DocSearch.astro │ │ ├── README.md │ │ ├── index.ts │ │ ├── package.json │ │ ├── schema.ts │ │ ├── variables.css │ │ └── virtual.d.ts │ ├── file-icons-generator/ │ │ ├── config.ts │ │ ├── index.ts │ │ ├── package.json │ │ └── utils/ │ │ ├── file.ts │ │ ├── font.ts │ │ └── seti.ts │ ├── markdoc/ │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── Code.astro │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── markdoc.test-d.ts │ │ ├── components.ts │ │ ├── html.mjs │ │ ├── index.mjs │ │ └── package.json │ ├── starlight/ │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __e2e__/ │ │ │ ├── .gitignore │ │ │ ├── basics.test.ts │ │ │ ├── collection-config.test.ts │ │ │ ├── fixtures/ │ │ │ │ ├── basics/ │ │ │ │ │ ├── astro.config.mjs │ │ │ │ │ ├── package.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── PurpleCard.astro │ │ │ │ │ │ └── Test.astro │ │ │ │ │ ├── content/ │ │ │ │ │ │ ├── comments/ │ │ │ │ │ │ │ └── bob.mdx │ │ │ │ │ │ ├── docs/ │ │ │ │ │ │ │ ├── anchor-heading-component.mdx │ │ │ │ │ │ │ ├── anchor-heading.md │ │ │ │ │ │ │ ├── head-propagation.mdx │ │ │ │ │ │ │ ├── headings-banner.md │ │ │ │ │ │ │ ├── headings.md │ │ │ │ │ │ │ ├── tabs-nested.mdx │ │ │ │ │ │ │ ├── tabs-unsynced.mdx │ │ │ │ │ │ │ ├── tabs-variable-height.mdx │ │ │ │ │ │ │ ├── tabs.mdx │ │ │ │ │ │ │ ├── whitespaces.mdx │ │ │ │ │ │ │ └── اللُّغَةُ-الْعَرَبِيَّةُ.md │ │ │ │ │ │ └── reviews/ │ │ │ │ │ │ └── alice.mdx │ │ │ │ │ ├── content.config.ts │ │ │ │ │ └── pages/ │ │ │ │ │ ├── [...param].astro │ │ │ │ │ ├── comments/ │ │ │ │ │ │ └── [...comment].astro │ │ │ │ │ ├── markdown-page.md │ │ │ │ │ ├── reviews/ │ │ │ │ │ │ └── [...review].astro │ │ │ │ │ └── starlight-page-css-layer-order.astro │ │ │ │ ├── custom src-dir/ │ │ │ │ │ ├── astro.config.mjs │ │ │ │ │ ├── package.json │ │ │ │ │ └── www/ │ │ │ │ │ ├── content.config.ts │ │ │ │ │ └── pages/ │ │ │ │ │ └── custom.astro │ │ │ │ ├── git/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── astro.config.mjs │ │ │ │ │ ├── package.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── content/ │ │ │ │ │ │ └── docs/ │ │ │ │ │ │ └── index.md │ │ │ │ │ └── content.config.ts │ │ │ │ ├── legacy-collections-backwards-compat/ │ │ │ │ │ ├── astro.config.mjs │ │ │ │ │ ├── package.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── content/ │ │ │ │ │ │ └── config.ts │ │ │ │ │ └── pages/ │ │ │ │ │ └── custom.astro │ │ │ │ ├── no-node-builtins/ │ │ │ │ │ ├── astro.config.mjs │ │ │ │ │ ├── package.json │ │ │ │ │ └── src/ │ │ │ │ │ ├── content/ │ │ │ │ │ │ └── docs/ │ │ │ │ │ │ └── index.md │ │ │ │ │ ├── content.config.ts │ │ │ │ │ └── noNodeModule.ts │ │ │ │ └── ssr/ │ │ │ │ ├── astro.config.mjs │ │ │ │ ├── package.json │ │ │ │ └── src/ │ │ │ │ ├── component/ │ │ │ │ │ └── ServerCheck.astro │ │ │ │ ├── content/ │ │ │ │ │ └── docs/ │ │ │ │ │ ├── 404.mdx │ │ │ │ │ ├── content.mdx │ │ │ │ │ ├── demo.mdx │ │ │ │ │ └── index.md │ │ │ │ ├── content.config.ts │ │ │ │ └── middleware.ts │ │ │ ├── git.test.ts │ │ │ ├── legacy-collections-backwards-compat.test.ts │ │ │ ├── no-node-builtins.test.ts │ │ │ ├── ssr.test.ts │ │ │ └── test-utils.ts │ │ ├── __tests__/ │ │ │ ├── absolute-favicon/ │ │ │ │ ├── absolute-favicon.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── basics/ │ │ │ │ ├── base.test.ts │ │ │ │ ├── config-errors.test.ts │ │ │ │ ├── config.test-d.ts │ │ │ │ ├── config.test.ts │ │ │ │ ├── format-canonical.test.ts │ │ │ │ ├── format-path.test.ts │ │ │ │ ├── git.test.ts │ │ │ │ ├── i18n.test.ts │ │ │ │ ├── localizedUrl.test.ts │ │ │ │ ├── navigation-labels.test.ts │ │ │ │ ├── navigation-order.test.ts │ │ │ │ ├── navigation.test.ts │ │ │ │ ├── omit-canonical.test.ts │ │ │ │ ├── pagefind.test.ts │ │ │ │ ├── pagination-with-base.test.ts │ │ │ │ ├── route-data.test.ts │ │ │ │ ├── routing.test.ts │ │ │ │ ├── schema.test.ts │ │ │ │ ├── sitemap.test.ts │ │ │ │ ├── slugs.test.ts │ │ │ │ ├── sorting.test.ts │ │ │ │ ├── starlight-page-route-data-extend.test.ts │ │ │ │ ├── starlight-page-route-data.test.ts │ │ │ │ ├── toc.test.ts │ │ │ │ ├── translations.test.ts │ │ │ │ ├── user-config.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── build-format-file/ │ │ │ │ ├── navigation.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── edit-url/ │ │ │ │ ├── edit-url.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── git-utils.ts │ │ │ ├── head/ │ │ │ │ ├── head.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── i18n/ │ │ │ │ ├── config.test.ts │ │ │ │ ├── empty-src/ │ │ │ │ │ └── content/ │ │ │ │ │ └── i18n/ │ │ │ │ │ └── .gitkeep │ │ │ │ ├── head.test.ts │ │ │ │ ├── i18n.test.ts │ │ │ │ ├── localizedUrl.test.ts │ │ │ │ ├── malformed-json-src/ │ │ │ │ │ └── content/ │ │ │ │ │ └── i18n/ │ │ │ │ │ └── en.json │ │ │ │ ├── malformed-yaml-src/ │ │ │ │ │ └── content/ │ │ │ │ │ └── i18n/ │ │ │ │ │ └── en.yml │ │ │ │ ├── navigation-order.test.ts │ │ │ │ ├── routing.test.ts │ │ │ │ ├── src/ │ │ │ │ │ └── content/ │ │ │ │ │ └── i18n/ │ │ │ │ │ ├── en.json │ │ │ │ │ └── fr.yml │ │ │ │ ├── translations-ec.test.ts │ │ │ │ ├── translations-fs.test.ts │ │ │ │ ├── translations-with-user-config.test.ts │ │ │ │ ├── translations.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── i18n-non-root-single-locale/ │ │ │ │ ├── config.test.ts │ │ │ │ ├── i18n.test.ts │ │ │ │ ├── localizedUrl.test.ts │ │ │ │ ├── routing.test.ts │ │ │ │ ├── slugs.test.ts │ │ │ │ ├── src/ │ │ │ │ │ └── content/ │ │ │ │ │ └── i18n/ │ │ │ │ │ └── fr.json │ │ │ │ ├── translations-fs.test.ts │ │ │ │ ├── translations-with-user-config.test.ts │ │ │ │ ├── translations.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── i18n-root-default-locale/ │ │ │ │ ├── i18n.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── i18n-root-locale/ │ │ │ │ ├── config.test.ts │ │ │ │ ├── i18n.test.ts │ │ │ │ ├── localizedUrl.test.ts │ │ │ │ ├── routing.test.ts │ │ │ │ ├── slugs.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── i18n-sidebar/ │ │ │ │ ├── i18n-sidebar-fallback-slug.test.ts │ │ │ │ ├── i18n-sidebar.test.ts │ │ │ │ ├── sidebar-internal-link-error.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── i18n-sidebar-badge-error/ │ │ │ │ ├── i18n-sidebar-badge-error.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── i18n-single-root-locale/ │ │ │ │ ├── config.test.ts │ │ │ │ ├── i18n.test.ts │ │ │ │ ├── routing.test.ts │ │ │ │ ├── slugs.test.ts │ │ │ │ ├── src/ │ │ │ │ │ └── content/ │ │ │ │ │ └── i18n/ │ │ │ │ │ └── fr.json │ │ │ │ ├── translations-fs.test.ts │ │ │ │ ├── translations-with-user-config.test.ts │ │ │ │ ├── translations.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── middleware/ │ │ │ │ ├── middleware.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── plugins/ │ │ │ │ ├── config.test.ts │ │ │ │ ├── integration.test.ts │ │ │ │ ├── route-middleware.test.ts │ │ │ │ ├── translations.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── remark-rehype/ │ │ │ │ ├── anchor-links.test.ts │ │ │ │ ├── asides.test.ts │ │ │ │ ├── code-rtl-support.test.ts │ │ │ │ ├── rehype-file-tree.test.ts │ │ │ │ ├── rehype-steps.test.ts │ │ │ │ ├── rehype-tabs.test.ts │ │ │ │ ├── remark-rehype.test.ts │ │ │ │ ├── snapshots/ │ │ │ │ │ ├── file-tree-basic.html │ │ │ │ │ ├── file-tree-comment-nodes.html │ │ │ │ │ ├── file-tree-comment-text.html │ │ │ │ │ ├── generates-anchor-link-markup.html │ │ │ │ │ ├── generates-aside-caution-custom-icon.html │ │ │ │ │ ├── generates-aside-caution-custom-label-and-icon.html │ │ │ │ │ ├── generates-aside-danger-custom-icon.html │ │ │ │ │ ├── generates-aside-danger-custom-label-and-icon.html │ │ │ │ │ ├── generates-aside-note-custom-icon.html │ │ │ │ │ ├── generates-aside-note-custom-label-and-icon.html │ │ │ │ │ ├── generates-aside-note-multiple-path-custom-icon.html │ │ │ │ │ ├── generates-aside-tip-custom-icon.html │ │ │ │ │ ├── generates-aside-tip-custom-label-and-icon.html │ │ │ │ │ ├── generates-aside.html │ │ │ │ │ ├── handles-complex-children.html │ │ │ │ │ ├── nested-asides-custom-titles.html │ │ │ │ │ └── nested-asides.html │ │ │ │ ├── utils.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── sidebar/ │ │ │ │ ├── navigation-attributes.test.ts │ │ │ │ ├── navigation-badges.test.ts │ │ │ │ ├── navigation-hidden.test.ts │ │ │ │ ├── navigation-order.test.ts │ │ │ │ ├── navigation-unicode.test.ts │ │ │ │ ├── navigation.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── sidebar-slug-error/ │ │ │ │ ├── sidebar-slug-error.test.ts │ │ │ │ └── vitest.config.ts │ │ │ ├── snapshot-serializer-astro-error.ts │ │ │ ├── test-config.ts │ │ │ ├── test-plugin-utils.ts │ │ │ ├── test-utils.ts │ │ │ └── toc-custom-config/ │ │ │ ├── toc-custom-config.test.ts │ │ │ └── vitest.config.ts │ │ ├── components/ │ │ │ ├── AnchorHeading.astro │ │ │ ├── Banner.astro │ │ │ ├── ContentNotice.astro │ │ │ ├── ContentPanel.astro │ │ │ ├── DraftContentNotice.astro │ │ │ ├── EditLink.astro │ │ │ ├── FallbackContentNotice.astro │ │ │ ├── Footer.astro │ │ │ ├── Head.astro │ │ │ ├── Header.astro │ │ │ ├── Hero.astro │ │ │ ├── LanguageSelect.astro │ │ │ ├── LastUpdated.astro │ │ │ ├── MarkdownContent.astro │ │ │ ├── MobileMenuFooter.astro │ │ │ ├── MobileMenuToggle.astro │ │ │ ├── MobileTableOfContents.astro │ │ │ ├── Page.astro │ │ │ ├── PageFrame.astro │ │ │ ├── PageSidebar.astro │ │ │ ├── PageTitle.astro │ │ │ ├── Pagination.astro │ │ │ ├── Search.astro │ │ │ ├── Select.astro │ │ │ ├── Sidebar.astro │ │ │ ├── SidebarPersister.astro │ │ │ ├── SidebarRestorePoint.astro │ │ │ ├── SidebarSublist.astro │ │ │ ├── SiteTitle.astro │ │ │ ├── SkipLink.astro │ │ │ ├── SocialIcons.astro │ │ │ ├── StarlightPage.astro │ │ │ ├── TableOfContents.astro │ │ │ ├── ThemeProvider.astro │ │ │ ├── ThemeSelect.astro │ │ │ └── TwoColumnContent.astro │ │ ├── components-internals/ │ │ │ ├── Icons.ts │ │ │ ├── SidebarPersistState.ts │ │ │ └── TableOfContents/ │ │ │ ├── TableOfContentsList.astro │ │ │ └── starlight-toc.ts │ │ ├── components.ts │ │ ├── constants.ts │ │ ├── expressive-code.d.ts │ │ ├── expressive-code.mjs │ │ ├── global.d.ts │ │ ├── i18n.d.ts │ │ ├── index.ts │ │ ├── integrations/ │ │ │ ├── asides-error.ts │ │ │ ├── asides.ts │ │ │ ├── code-rtl-support.ts │ │ │ ├── expressive-code/ │ │ │ │ ├── hast.d.ts │ │ │ │ ├── hast.mjs │ │ │ │ ├── index.ts │ │ │ │ ├── preprocessor.ts │ │ │ │ ├── themes/ │ │ │ │ │ ├── night-owl-dark.jsonc │ │ │ │ │ └── night-owl-light.jsonc │ │ │ │ ├── theming.ts │ │ │ │ └── translations.ts │ │ │ ├── heading-links.ts │ │ │ ├── pagefind.ts │ │ │ ├── remark-rehype.ts │ │ │ ├── shared/ │ │ │ │ ├── absolutePathToLang.ts │ │ │ │ ├── localeToLang.ts │ │ │ │ └── slugToLocale.ts │ │ │ ├── sitemap.ts │ │ │ ├── virtual-user-config.ts │ │ │ └── vite-layer-order.ts │ │ ├── internal.ts │ │ ├── loaders.ts │ │ ├── locals.d.ts │ │ ├── locals.ts │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── props.ts │ │ ├── route-data.ts │ │ ├── routes/ │ │ │ ├── common.astro │ │ │ ├── ssr/ │ │ │ │ ├── 404.astro │ │ │ │ └── index.astro │ │ │ └── static/ │ │ │ ├── 404.astro │ │ │ └── index.astro │ │ ├── schema.ts │ │ ├── schemas/ │ │ │ ├── badge.ts │ │ │ ├── components.ts │ │ │ ├── expressiveCode.ts │ │ │ ├── favicon.ts │ │ │ ├── head.ts │ │ │ ├── hero.ts │ │ │ ├── i18n.ts │ │ │ ├── icon.ts │ │ │ ├── logo.ts │ │ │ ├── pagefind.ts │ │ │ ├── prevNextLink.ts │ │ │ ├── sidebar.ts │ │ │ ├── site-title.ts │ │ │ ├── social.ts │ │ │ └── tableOfContents.ts │ │ ├── style/ │ │ │ ├── anchor-links.css │ │ │ ├── asides.css │ │ │ ├── layers.css │ │ │ ├── markdown.css │ │ │ ├── print.css │ │ │ ├── props.css │ │ │ ├── reset.css │ │ │ └── util.css │ │ ├── translations/ │ │ │ ├── README.md │ │ │ ├── ar.json │ │ │ ├── ca.json │ │ │ ├── cs.json │ │ │ ├── da.json │ │ │ ├── de.json │ │ │ ├── el.json │ │ │ ├── en.json │ │ │ ├── es.json │ │ │ ├── fa.json │ │ │ ├── fi.json │ │ │ ├── fr.json │ │ │ ├── gl.json │ │ │ ├── he.json │ │ │ ├── hi.json │ │ │ ├── hu.json │ │ │ ├── id.json │ │ │ ├── index.ts │ │ │ ├── it.json │ │ │ ├── ja.json │ │ │ ├── ko.json │ │ │ ├── lv.json │ │ │ ├── nb.json │ │ │ ├── nl.json │ │ │ ├── pl.json │ │ │ ├── pt.json │ │ │ ├── ro.json │ │ │ ├── ru.json │ │ │ ├── sk.json │ │ │ ├── sv.json │ │ │ ├── th.json │ │ │ ├── tr.json │ │ │ ├── uk.json │ │ │ ├── vi.json │ │ │ ├── zh-CN.json │ │ │ └── zh-TW.json │ │ ├── types.ts │ │ ├── user-components/ │ │ │ ├── Aside.astro │ │ │ ├── Badge.astro │ │ │ ├── Card.astro │ │ │ ├── CardGrid.astro │ │ │ ├── FileTree.astro │ │ │ ├── Icon.astro │ │ │ ├── LinkButton.astro │ │ │ ├── LinkCard.astro │ │ │ ├── Steps.astro │ │ │ ├── TabItem.astro │ │ │ ├── Tabs.astro │ │ │ ├── file-tree-icons.ts │ │ │ ├── rehype-file-tree.ts │ │ │ ├── rehype-steps.ts │ │ │ └── rehype-tabs.ts │ │ ├── utils/ │ │ │ ├── base.ts │ │ │ ├── canonical.ts │ │ │ ├── collection-fs.ts │ │ │ ├── collection.ts │ │ │ ├── createPathFormatter.ts │ │ │ ├── createTranslationSystem.ts │ │ │ ├── error-map.ts │ │ │ ├── format-path.ts │ │ │ ├── generateToC.ts │ │ │ ├── git.ts │ │ │ ├── gitInlined.ts │ │ │ ├── head.ts │ │ │ ├── i18n.ts │ │ │ ├── localizedUrl.ts │ │ │ ├── navigation.ts │ │ │ ├── path.ts │ │ │ ├── plugins.ts │ │ │ ├── routing/ │ │ │ │ ├── data.ts │ │ │ │ ├── index.ts │ │ │ │ ├── middleware.ts │ │ │ │ └── types.ts │ │ │ ├── slugs.ts │ │ │ ├── starlight-page.ts │ │ │ ├── translations-fs.ts │ │ │ ├── translations.ts │ │ │ ├── types.ts │ │ │ ├── url.ts │ │ │ ├── user-config.ts │ │ │ └── validateLogoImports.ts │ │ ├── virtual-internal.d.ts │ │ ├── virtual.d.ts │ │ └── vitest.config.ts │ └── tailwind/ │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__/ │ │ └── tailwind.test.ts │ ├── package.json │ ├── tailwind.css │ └── vitest.config.ts ├── pnpm-workspace.yaml └── tsconfig.json
SYMBOL INDEX (419 symbols across 110 files)
FILE: docs/__a11y__/test-utils.ts
class DocsSite (line 74) | class DocsSite {
method constructor (line 77) | constructor(page: Page) {
method getAllUrls (line 81) | async getAllUrls() {
method testPage (line 116) | async testPage(url: string) {
method reportPageViolations (line 124) | async reportPageViolations(violations: Awaited<ReturnType<typeof this....
method #filterViolations (line 136) | #filterViolations(violations: Awaited<ReturnType<typeof getViolations>...
function landmarkUniqueNodeMatcher (line 148) | function landmarkUniqueNodeMatcher(node: ViolationNode) {
type Config (line 174) | interface Config {
type Violations (line 195) | type Violations = Awaited<ReturnType<typeof getViolations>>;
type ViolationNode (line 196) | type ViolationNode = Violations[number]['nodes'][number];
FILE: docs/astro.config.mjs
constant NETLIFY_PREVIEW_SITE (line 27) | const NETLIFY_PREVIEW_SITE = process.env.CONTEXT !== 'production' && pro...
FILE: docs/grammars/generate.mjs
function fetchTmLanguage (line 22) | async function fetchTmLanguage(repo, path) {
FILE: docs/src/components/theme-designer/atom.ts
class Atom (line 1) | class Atom<T> {
method constructor (line 5) | constructor(init: T) {
method get (line 8) | get(): T {
method set (line 11) | set(v: T): void {
method subscribe (line 15) | subscribe(cb: (v: T) => void): () => boolean {
type MapStore (line 22) | type MapStore<T> = Atom<T> & { setKey: (key: keyof T, value: T[typeof ke...
function map (line 24) | function map<T extends Record<string, unknown>>(value: T): MapStore<T> {
function atom (line 33) | function atom<T>(value: T): Atom<T> {
FILE: docs/src/components/theme-designer/color-lib.ts
function getPalettes (line 49) | function getPalettes(config: {
FILE: docs/src/components/theme-designer/store.ts
constant MAX_CHROMA (line 40) | const MAX_CHROMA = 0.27;
FILE: packages/docsearch/index.ts
type DocSearchClientOptions (line 15) | type DocSearchClientOptions = Omit<
type SearchOptions (line 20) | type SearchOptions = DocSearchClientOptions['searchParameters'];
type DocSearchUserConfig (line 94) | type DocSearchUserConfig = z.infer<typeof DocSearchConfigSchema>;
function starlightDocSearch (line 97) | function starlightDocSearch(userConfig: DocSearchUserConfig): StarlightP...
function vitePluginDocSearch (line 142) | function vitePluginDocSearch(root: URL, config: DocSearchUserConfig): Vi...
type VitePlugin (line 171) | type VitePlugin = NonNullable<ViteUserConfig['plugins']>[number];
FILE: packages/file-icons-generator/utils/file.ts
function writeDefinitionsAndSVGs (line 39) | async function writeDefinitionsAndSVGs(
function prettifyFile (line 61) | function prettifyFile(filePath: string) {
FILE: packages/file-icons-generator/utils/font.ts
function getIconSvgPaths (line 10) | async function getIconSvgPaths(repoPath: string, icons: string[], defini...
function getComputedFontSizeToFit (line 58) | function getComputedFontSizeToFit(glyph: opentype.Glyph, size: number, f...
function getGlyphPathDimensions (line 81) | function getGlyphPathDimensions(glyph: opentype.Glyph, fontSize: number) {
function getFontGlyphAlias (line 96) | function getFontGlyphAlias(icon: string): string {
function updateDefinitionsWithAlias (line 109) | function updateDefinitionsWithAlias(definitions: Definitions, icon: stri...
function updateDefinitionsRecordWithAlias (line 119) | function updateDefinitionsRecordWithAlias(
FILE: packages/file-icons-generator/utils/seti.ts
function setupRepo (line 15) | async function setupRepo() {
function deleteRepo (line 43) | async function deleteRepo(repoPath: string) {
function getFont (line 56) | async function getFont(repoPath: string) {
function parseMapping (line 72) | async function parseMapping(repoPath: string) {
function getSetiIconName (line 113) | function getSetiIconName(icon: string) {
function getMapping (line 120) | async function getMapping(repoPath: string) {
FILE: packages/markdoc/__tests__/markdoc.test-d.ts
type UserComponents (line 19) | type UserComponents = keyof typeof import('@astrojs/starlight/components');
type UserComponentProps (line 20) | type UserComponentProps<T extends (args: any) => any> = keyof RemoveInde...
type MarkdocPreset (line 24) | type MarkdocPreset = typeof import('../index.mjs').StarlightMarkdocPreset;
type MarkdocNodes (line 25) | type MarkdocNodes = keyof MarkdocPreset['nodes'];
type MarkdocNodeAttributes (line 26) | type MarkdocNodeAttributes<T extends MarkdocNodes> = keyof MarkdocPreset...
type MarkdocTags (line 27) | type MarkdocTags = keyof MarkdocPreset['tags'];
type MarkdocTagAttributes (line 28) | type MarkdocTagAttributes<T extends MarkdocTags> = keyof MarkdocPreset['...
type FenceAttributes (line 32) | type FenceAttributes = MarkdocNodeAttributes<'fence'>;
type MarkdocFenceAttributes (line 35) | type MarkdocFenceAttributes = 'content' | 'language';
type UnsupportedCodeProps (line 42) | type UnsupportedCodeProps =
type UnsupportedBadgeProps (line 82) | type UnsupportedBadgeProps = Exclude<keyof HTMLAttributes<'span'>, WellK...
type UnsupportedCodeProps (line 104) | type UnsupportedCodeProps = 'mark' | 'ins' | 'del';
type UnsupportedLinkButtonProps (line 126) | type UnsupportedLinkButtonProps = Exclude<keyof HTMLAttributes<'a'>, Wel...
type UnsupportedLinkCardProps (line 138) | type UnsupportedLinkCardProps = Exclude<keyof HTMLAttributes<'a'>, WellK...
type WellKnownElementAttributes (line 160) | type WellKnownElementAttributes = keyof typeof import('../html.mjs').Wel...
type WellKnownAnchorAttributes (line 161) | type WellKnownAnchorAttributes = keyof typeof import('../html.mjs').Well...
type RemoveIndexSignature (line 164) | type RemoveIndexSignature<T> = {
FILE: packages/markdoc/index.mjs
function starlightMarkdoc (line 298) | function starlightMarkdoc({ headingLinks = true } = {}) {
FILE: packages/starlight/__e2e__/basics.test.ts
function expectSelectedTab (line 529) | async function expectSelectedTab(tabs: Locator, label: string, panel?: s...
function testTOCHighlighting (line 809) | function testTOCHighlighting({
FILE: packages/starlight/__e2e__/fixtures/no-node-builtins/src/noNodeModule.ts
function preventNodeBuiltinDependencyPlugin (line 13) | function preventNodeBuiltinDependencyPlugin(): NonNullable<
FILE: packages/starlight/__e2e__/ssr.test.ts
function expectEquivalentHTML (line 65) | function expectEquivalentHTML(a: string, b: string) {
function getNormalizedHTML (line 69) | function getNormalizedHTML(html: string) {
FILE: packages/starlight/__e2e__/test-utils.ts
function testFactory (line 12) | function testFactory(fixturePath: string) {
class StarlightPage (line 79) | class StarlightPage {
method constructor (line 83) | constructor(server: Server, page: Page) {
method goto (line 89) | goto(url: string) {
method resolveUrl (line 94) | resolveUrl(url: string) {
type PreviewServer (line 101) | type PreviewServer = Awaited<ReturnType<typeof preview>>;
type DevServer (line 102) | type DevServer = Awaited<ReturnType<typeof dev>>;
type Server (line 103) | type Server = PreviewServer | DevServer;
FILE: packages/starlight/__tests__/basics/config-errors.test.ts
function parseStarlightConfigWithFriendlyErrors (line 5) | function parseStarlightConfigWithFriendlyErrors(config: StarlightUserCon...
FILE: packages/starlight/__tests__/basics/config.test-d.ts
type SidebarUserItem (line 6) | type SidebarUserItem = NonNullable<StarlightUserConfig['sidebar']>[number];
FILE: packages/starlight/__tests__/basics/format-path.test.ts
type FormatPathOptions (line 4) | type FormatPathOptions = Parameters<typeof createPathFormatter>[0];
FILE: packages/starlight/__tests__/basics/git.test.ts
type CommitDate (line 162) | type CommitDate = ReturnType<typeof getNewestCommitDate>;
FILE: packages/starlight/__tests__/basics/i18n.test.ts
type AstroI18nTestEachConfig (line 70) | type AstroI18nTestEachConfig = {
function getAstroI18nTestConfig (line 312) | function getAstroI18nTestConfig(i18nConfig: AstroUserConfig['i18n']): As...
FILE: packages/starlight/__tests__/basics/pagefind.test.ts
function runStarlightPagefind (line 13) | async function runStarlightPagefind(outputDir: URL) {
function createMockIndex (line 23) | function createMockIndex(): pagefind.PagefindIndex {
FILE: packages/starlight/__tests__/basics/schema.test.ts
function parseHeadConfigWithFriendlyErrors (line 84) | function parseHeadConfigWithFriendlyErrors(
FILE: packages/starlight/__tests__/git-utils.ts
function makeTestRepo (line 6) | function makeTestRepo(onPath?: string) {
type ISODate (line 60) | type ISODate =
type FileTree (line 65) | type FileTree = { [name in string]: TreeEntry };
type TreeEntry (line 66) | type TreeEntry = string | FileTree;
function writeFileTree (line 68) | function writeFileTree(root: string, fileTree: FileTree) {
FILE: packages/starlight/__tests__/head/head.test.ts
type GetTestHeadOptions (line 202) | type GetTestHeadOptions = {
function getTestHead (line 208) | function getTestHead({
FILE: packages/starlight/__tests__/i18n/translations-ec.test.ts
function getUseTranslations (line 108) | function getUseTranslations(exists: boolean = true) {
function getStarlightConfigAndUseTranslations (line 114) | function getStarlightConfigAndUseTranslations(
function getExpressiveCodeOverriddenLanguages (line 128) | function getExpressiveCodeOverriddenLanguages() {
FILE: packages/starlight/__tests__/plugins/config.test.ts
method 'config:setup' (line 35) | 'config:setup'() {}
method 'config:setup' (line 36) | 'config:setup'() {}
method 'config:setup' (line 40) | 'config:setup'({ config }) {
method setup (line 156) | setup() {}
method 'config:setup' (line 192) | 'config:setup'() {}
method setup (line 193) | setup() {}
FILE: packages/starlight/__tests__/plugins/integration.test.ts
method 'config:setup' (line 23) | 'config:setup'({ addIntegration, updateConfig }) {
method 'config:setup' (line 32) | 'config:setup'({ addIntegration }) {
method 'config:setup' (line 58) | 'config:setup'({ addIntegration }) {
method 'config:setup' (line 69) | 'config:setup'({ astroConfig }) {
FILE: packages/starlight/__tests__/plugins/route-middleware.test.ts
method setup (line 12) | setup({ addRouteMiddleware }) {
method setup (line 20) | setup({ addRouteMiddleware }) {
method setup (line 28) | setup({ addRouteMiddleware }) {
method setup (line 36) | setup({ addRouteMiddleware }) {
FILE: packages/starlight/__tests__/plugins/vitest.config.ts
method 'config:setup' (line 18) | 'config:setup'({ config, updateConfig }) {
method 'config:setup' (line 37) | 'config:setup'({ config, updateConfig }) {
method 'i18n:setup' (line 48) | 'i18n:setup'({ injectTranslations }) {
method 'config:setup' (line 63) | async 'config:setup'({ config, updateConfig, useTranslations, absolutePa...
FILE: packages/starlight/__tests__/remark-rehype/anchor-links.test.ts
function renderMarkdown (line 19) | function renderMarkdown(
FILE: packages/starlight/__tests__/remark-rehype/asides.test.ts
function renderMarkdown (line 26) | function renderMarkdown(
FILE: packages/starlight/__tests__/remark-rehype/code-rtl-support.test.ts
function renderMarkdown (line 11) | function renderMarkdown(content: string, options: { fileURL?: URL } = {}) {
FILE: packages/starlight/__tests__/remark-rehype/rehype-file-tree.test.ts
function processTestFileTree (line 164) | function processTestFileTree(html: string) {
function extractFileTree (line 169) | function extractFileTree(html: string, stripIcons = true) {
FILE: packages/starlight/__tests__/remark-rehype/utils.ts
function createRemarkRehypePluginTestOptions (line 9) | async function createRemarkRehypePluginTestOptions(
FILE: packages/starlight/__tests__/sidebar/navigation.test.ts
function includesOnlyLinksWithTrailingSlash (line 186) | function includesOnlyLinksWithTrailingSlash(entry: SidebarEntry | undefi...
FILE: packages/starlight/__tests__/snapshot-serializer-astro-error.ts
method test (line 6) | test(val) {
method serialize (line 10) | serialize({ name, message, hint }: AstroError, config, indentation, dept...
function indent (line 17) | function indent(string = '', indentation = '\t') {
FILE: packages/starlight/__tests__/test-config.ts
function defineVitestConfig (line 10) | async function defineVitestConfig(
FILE: packages/starlight/__tests__/test-plugin-utils.ts
function createTestPluginContext (line 4) | function createTestPluginContext(): StarlightPluginContext {
class TestAstroIntegrationLogger (line 15) | class TestAstroIntegrationLogger {
method constructor (line 17) | constructor(public label = 'test-integration-logger') {}
FILE: packages/starlight/__tests__/test-utils.ts
function mockDoc (line 26) | function mockDoc(
function mockDict (line 46) | function mockDict(id: string, data: z.input<ReturnType<typeof i18nSchema...
function mockedAstroContent (line 54) | async function mockedAstroContent({
function mockedCollectionConfig (line 76) | async function mockedCollectionConfig(docsUserSchema?: Parameters<typeof...
type RouteDataTestContextOptions (line 95) | type RouteDataTestContextOptions = {
function getRouteDataTestContext (line 108) | function getRouteDataTestContext({
FILE: packages/starlight/components-internals/Icons.ts
type StarlightIcon (line 210) | type StarlightIcon = keyof typeof Icons;
FILE: packages/starlight/components-internals/SidebarPersistState.ts
type SidebarState (line 9) | interface SidebarState {
FILE: packages/starlight/components-internals/TableOfContents/starlight-toc.ts
class StarlightTOC (line 3) | class StarlightTOC extends HTMLElement {
method current (line 16) | protected set current(link: HTMLAnchorElement) {
method constructor (line 26) | constructor() {
method getRootMargin (line 114) | private getRootMargin(): `-${number}px 0% ${number}px` {
FILE: packages/starlight/constants.ts
constant PAGE_TITLE_ID (line 4) | const PAGE_TITLE_ID = '_top';
FILE: packages/starlight/expressive-code.mjs
function defineEcConfig (line 21) | function defineEcConfig(config) {
FILE: packages/starlight/global.d.ts
type StarlightThemeProvider (line 1) | interface StarlightThemeProvider {
type Window (line 8) | interface Window {
FILE: packages/starlight/i18n.d.ts
type CustomTypeOptions (line 12) | interface CustomTypeOptions {
FILE: packages/starlight/index.ts
function StarlightIntegration (line 33) | function StarlightIntegration(
FILE: packages/starlight/integrations/asides-error.ts
function throwInvalidAsideIconError (line 3) | function throwInvalidAsideIconError(icon: string) {
FILE: packages/starlight/integrations/asides.ts
function h (line 24) | function h(el: string, attrs: Properties = {}, children: unknown[] = [])...
function s (line 34) | function s(el: string, attrs: Properties = {}, children: unknown[] = [])...
function isNodeDirective (line 44) | function isNodeDirective(node: Node): node is Directives {
function transformUnhandledDirective (line 58) | function transformUnhandledDirective(
function makeSvgChildNodes (line 88) | function makeSvgChildNodes(children: Result['children']): P[] {
function remarkAsides (line 127) | function remarkAsides(options: RemarkRehypePluginOptions): Plugin<[], Ro...
function remarkDirectivesRestoration (line 244) | function remarkDirectivesRestoration() {
function starlightDirectivesRestorationIntegration (line 270) | function starlightDirectivesRestorationIntegration(): AstroIntegration {
FILE: packages/starlight/integrations/code-rtl-support.ts
function rehypeRtlCodeSupport (line 20) | function rehypeRtlCodeSupport(_options: RemarkRehypePluginOptions) {
FILE: packages/starlight/integrations/expressive-code/index.ts
type StarlightExpressiveCodeOptions (line 8) | type StarlightExpressiveCodeOptions = Omit<AstroExpressiveCodeOptions, '...
type StarlightEcIntegrationOptions (line 54) | type StarlightEcIntegrationOptions = {
FILE: packages/starlight/integrations/expressive-code/preprocessor.ts
type StarlightEcConfigPreprocessorOptions (line 14) | type StarlightEcConfigPreprocessorOptions = {
function getStarlightEcConfigPreprocessor (line 24) | function getStarlightEcConfigPreprocessor({
FILE: packages/starlight/integrations/expressive-code/theming.ts
type BundledThemeName (line 5) | type BundledThemeName = 'starlight-dark' | 'starlight-light';
type ThemeObjectOrBundledThemeName (line 7) | type ThemeObjectOrBundledThemeName = ThemeObjectOrShikiThemeName | Bundl...
function preprocessThemes (line 13) | function preprocessThemes(
function customizeBundledTheme (line 35) | function customizeBundledTheme(theme: ExpressiveCodeTheme) {
function applyStarlightUiThemeColors (line 52) | function applyStarlightUiThemeColors(theme: ExpressiveCodeTheme) {
FILE: packages/starlight/integrations/expressive-code/translations.ts
function addTranslations (line 6) | function addTranslations(config: StarlightConfig, useTranslations: UseTr...
function addTranslationsForLocale (line 16) | function addTranslationsForLocale(
type UseTranslations (line 36) | type UseTranslations = Awaited<ReturnType<typeof createTranslationSystem...
FILE: packages/starlight/integrations/heading-links.ts
function rehypeAutolinkHeadings (line 24) | function rehypeAutolinkHeadings({
function headingRank (line 77) | function headingRank(node: Nodes): number | undefined {
FILE: packages/starlight/integrations/pagefind.ts
function starlightPagefind (line 6) | async function starlightPagefind({
function assertPagefindResponse (line 45) | function assertPagefindResponse<T extends PagefindBaseResponse>(
type PagefindBaseResponse (line 56) | interface PagefindBaseResponse {
type PagefindIntegrationOptions (line 60) | type PagefindIntegrationOptions = Pick<HookParameters<'astro:build:done'...
FILE: packages/starlight/integrations/remark-rehype.ts
function starlightRemarkPlugins (line 17) | function starlightRemarkPlugins(options: RemarkRehypePluginOptions): Rem...
function starlightRehypePlugins (line 22) | function starlightRehypePlugins(options: RemarkRehypePluginOptions): Reh...
function remarkPlugins (line 30) | function remarkPlugins(options: RemarkRehypePluginOptions): RemarkPlugin {
function rehypePlugins (line 47) | function rehypePlugins(options: RemarkRehypePluginOptions): RehypePlugin {
function getRemarkRehypePaths (line 73) | function getRemarkRehypePaths(options: RemarkRehypePluginOptions): strin...
function shouldTransformFile (line 87) | function shouldTransformFile(file: VFile, remarkRehypePaths: string[]) {
function normalizePath (line 105) | function normalizePath(path: string) {
type RemarkRehypePluginOptions (line 109) | interface RemarkRehypePluginOptions {
type RemarkPlugin (line 116) | type RemarkPlugin = Plugin<[], RemarkRoot>;
type RehypePlugin (line 117) | type RehypePlugin = Plugin<[], RehypeRoot>;
FILE: packages/starlight/integrations/shared/absolutePathToLang.ts
function absolutePathToLang (line 6) | function absolutePathToLang(
FILE: packages/starlight/integrations/shared/localeToLang.ts
function localeToLang (line 8) | function localeToLang(
FILE: packages/starlight/integrations/shared/slugToLocale.ts
function slugToLocale (line 9) | function slugToLocale(
FILE: packages/starlight/integrations/sitemap.ts
function getSitemapConfig (line 4) | function getSitemapConfig(opts: StarlightConfig): SitemapOptions {
function starlightSitemap (line 21) | function starlightSitemap(opts: StarlightConfig) {
FILE: packages/starlight/integrations/virtual-user-config.ts
function resolveVirtualModuleId (line 15) | function resolveVirtualModuleId<T extends string>(id: T): `\0${T}` {
function vitePluginStarlightUserConfig (line 20) | function vitePluginStarlightUserConfig(
FILE: packages/starlight/integrations/vite-layer-order.ts
function vitePluginStarlightCssLayerOrder (line 20) | function vitePluginStarlightCssLayerOrder(): VitePlugin {
type VitePlugin (line 69) | type VitePlugin = NonNullable<ViteUserConfig['plugins']>[number];
FILE: packages/starlight/loaders.ts
type GlobOptions (line 9) | type GlobOptions = Parameters<typeof glob>[0];
type GenerateIdFunction (line 10) | type GenerateIdFunction = NonNullable<GlobOptions['generateId']>;
function docsLoader (line 15) | function docsLoader({
function i18nLoader (line 33) | function i18nLoader(): Loader {
function createGlobLoadFn (line 40) | function createGlobLoadFn(
FILE: packages/starlight/locals.d.ts
type I18n (line 7) | interface I18n {}
type Locals (line 14) | interface Locals {
FILE: packages/starlight/locals.ts
function initializeStarlightRoute (line 22) | function initializeStarlightRoute(context: APIContext) {
FILE: packages/starlight/props.ts
type Props (line 14) | type Props = StarlightRouteData;
FILE: packages/starlight/route-data.ts
type RouteMiddlewareHandler (line 4) | type RouteMiddlewareHandler = (
function defineRouteMiddleware (line 9) | function defineRouteMiddleware(fn: RouteMiddlewareHandler) {
FILE: packages/starlight/schema.ts
type DefaultSchema (line 114) | type DefaultSchema = ReturnType<typeof StarlightFrontmatterSchema>;
type BaseSchema (line 117) | type BaseSchema = z.core.$ZodType;
type ExtendedSchema (line 120) | type ExtendedSchema<T extends BaseSchema = never> = [T] extends [never]
type DocsSchemaOpts (line 126) | interface DocsSchemaOpts<T extends BaseSchema> {
function docsSchema (line 152) | function docsSchema<T extends BaseSchema = never>(
FILE: packages/starlight/schemas/badge.ts
type BadgeComponentProps (line 23) | type BadgeComponentProps = z.input<typeof BadgeComponentSchema>;
type Badge (line 38) | type Badge = z.output<typeof badgeSchema>;
type I18nBadge (line 39) | type I18nBadge = z.output<typeof i18nBadgeSchema>;
type I18nBadgeConfig (line 40) | type I18nBadgeConfig = z.output<ReturnType<typeof I18nBadgeConfigSchema>>;
FILE: packages/starlight/schemas/components.ts
function ComponentConfigSchema (line 3) | function ComponentConfigSchema() {
FILE: packages/starlight/schemas/favicon.ts
function isFaviconExt (line 38) | function isFaviconExt(ext: string): ext is keyof typeof faviconTypeMap {
FILE: packages/starlight/schemas/head.ts
type HeadUserConfig (line 49) | type HeadUserConfig = z.input<ReturnType<typeof HeadConfigSchema>>;
type HeadConfig (line 50) | type HeadConfig = z.output<ReturnType<typeof HeadConfigSchema>>;
FILE: packages/starlight/schemas/i18n.ts
type i18nSchemaOpts (line 3) | interface i18nSchemaOpts<T extends z.ZodObject = BaseExtendSchema> {
type DefaultI18nSchema (line 28) | type DefaultI18nSchema = ReturnType<typeof defaultI18nSchema>;
type MergeSchemas (line 38) | type MergeSchemas<A extends z.ZodObject, B extends z.ZodObject> = z.ZodO...
type ExtendedSchema (line 43) | type ExtendedSchema<T extends z.ZodObject> = T extends z.ZodObject
type BaseExtendSchema (line 48) | type BaseExtendSchema = z.ZodObject<{}>;
function i18nSchema (line 51) | function i18nSchema<T extends z.ZodObject = BaseExtendSchema>({
type i18nSchemaOutput (line 59) | type i18nSchemaOutput = z.output<ExtendedSchema<BaseExtendSchema>>;
function builtinI18nSchema (line 61) | function builtinI18nSchema() {
function starlightI18nSchema (line 69) | function starlightI18nSchema() {
function pagefindI18nSchema (line 172) | function pagefindI18nSchema() {
function expressiveCodeI18nSchema (line 228) | function expressiveCodeI18nSchema() {
FILE: packages/starlight/schemas/logo.ts
type LogoUserConfig (line 27) | type LogoUserConfig = z.input<ReturnType<typeof LogoConfigSchema>>;
type LogoConfig (line 28) | type LogoConfig = z.output<ReturnType<typeof LogoConfigSchema>>;
FILE: packages/starlight/schemas/prevNextLink.ts
type PrevNextLinkUserConfig (line 17) | type PrevNextLinkUserConfig = z.input<ReturnType<typeof PrevNextLinkConf...
type PrevNextLinkConfig (line 18) | type PrevNextLinkConfig = z.output<ReturnType<typeof PrevNextLinkConfigS...
FILE: packages/starlight/schemas/sidebar.ts
type LinkHTMLAttributes (line 37) | type LinkHTMLAttributes = Omit<
type SidebarLinkItem (line 51) | type SidebarLinkItem = z.infer<typeof SidebarLinkItemSchema>;
type AutoSidebarGroup (line 71) | type AutoSidebarGroup = z.infer<typeof AutoSidebarGroupSchema>;
type ManualSidebarGroupInput (line 73) | type ManualSidebarGroupInput = z.input<typeof SidebarGroupSchema> & {
type ManualSidebarGroupOutput (line 84) | type ManualSidebarGroupOutput = z.output<typeof SidebarGroupSchema> & {
type InternalSidebarLinkItem (line 122) | type InternalSidebarLinkItem = z.output<typeof InternalSidebarLinkItemSc...
type SidebarItem (line 131) | type SidebarItem = z.infer<typeof SidebarItemSchema>;
FILE: packages/starlight/user-components/rehype-file-tree.ts
type DataMap (line 13) | interface DataMap {
function processFileTree (line 28) | function processFileTree(html: string, directoryLabel: string) {
function makeText (line 139) | function makeText(value = ''): Text {
function makeSVGIcon (line 144) | function makeSVGIcon(svgString: string) {
function getFileIcon (line 159) | function getFileIcon(fileName: string) {
function getFileIconName (line 170) | function getFileIconName(fileName: string) {
function getFileIconTypeFromExtension (line 187) | function getFileIconTypeFromExtension(fileName: string) {
function validateFileTree (line 202) | function validateFileTree(tree: Element) {
function isElementNode (line 235) | function isElementNode(node: ElementContent): node is Element {
function throwFileTreeValidationError (line 240) | function throwFileTreeValidationError(message: string): never {
type Definitions (line 247) | interface Definitions {
FILE: packages/starlight/user-components/rehype-steps.ts
class StepsError (line 76) | class StepsError extends AstroError {
method constructor (line 77) | constructor(message: string, html?: string) {
FILE: packages/starlight/user-components/rehype-tabs.ts
type Panel (line 7) | interface Panel {
type DataMap (line 15) | interface DataMap {
FILE: packages/starlight/utils/base.ts
function pathWithBase (line 6) | function pathWithBase(path: string) {
function fileWithBase (line 12) | function fileWithBase(path: string) {
FILE: packages/starlight/utils/canonical.ts
type FormatCanonicalOptions (line 4) | interface FormatCanonicalOptions {
function formatCanonical (line 16) | function formatCanonical(href: string, opts: FormatCanonicalOptions) {
FILE: packages/starlight/utils/collection-fs.ts
function resolveCollectionPath (line 13) | function resolveCollectionPath(collection: StarlightCollection, srcDir: ...
function getCollectionPosixPath (line 17) | function getCollectionPosixPath(collection: StarlightCollection, srcDir:...
FILE: packages/starlight/utils/collection.ts
type StarlightCollection (line 1) | type StarlightCollection = 'docs' | 'i18n';
function getCollectionUrl (line 21) | function getCollectionUrl(collection: StarlightCollection, srcDir: URL) {
function getCollectionPathFromRoot (line 25) | function getCollectionPathFromRoot(
FILE: packages/starlight/utils/createPathFormatter.ts
type FormatPathOptions (line 10) | interface FormatPathOptions {
function formatPath (line 36) | function formatPath(
function createPathFormatter (line 58) | function createPathFormatter(opts: FormatPathOptions) {
FILE: packages/starlight/utils/createTranslationSystem.ts
function createTranslationSystem (line 15) | async function createTranslationSystem<T extends i18nSchemaOutput>(
function stripLangRegion (line 88) | function stripLangRegion(lang: string) {
function localeToLang (line 96) | function localeToLang(
type BuiltInStrings (line 106) | type BuiltInStrings = (typeof builtinTranslations)['en'];
function buildResources (line 109) | function buildResources<T extends i18nSchemaOutput>(
type I18nKeys (line 127) | type I18nKeys = keyof BuiltInStrings | UserI18nKeys | keyof StarlightApp...
type I18nT (line 129) | type I18nT = TFunction<'starlight', undefined> & {
FILE: packages/starlight/utils/error-map.ts
type TypeErrByPathEntry (line 12) | type TypeErrByPathEntry = {
function parseWithFriendlyErrors (line 27) | function parseWithFriendlyErrors<T extends z.ZodType>(
function parseAsyncWithFriendlyErrors (line 47) | async function parseAsyncWithFriendlyErrors<T extends z.ZodType>(
function processParsedData (line 58) | function processParsedData<T extends z.ZodType>(
FILE: packages/starlight/utils/generateToC.ts
type TocItem (line 4) | interface TocItem extends MarkdownHeading {
type TocOpts (line 8) | interface TocOpts {
function generateToC (line 15) | function generateToC(
function injectChild (line 26) | function injectChild(items: TocItem[], item: TocItem): void {
FILE: packages/starlight/utils/git.ts
type GitAPI (line 9) | type GitAPI = {
function getNewestCommitDate (line 19) | function getNewestCommitDate(file: string): Date {
function getRepoRoot (line 41) | function getRepoRoot(directory: string): string {
function getAllNewestCommitDate (line 58) | function getAllNewestCommitDate(rootPath: string, docsPath: string): [st...
FILE: packages/starlight/utils/gitInlined.ts
type InlinedData (line 8) | type InlinedData = ReturnType<typeof getAllNewestCommitDate>;
FILE: packages/starlight/utils/head.ts
function getHead (line 14) | function getHead(
function createHead (line 123) | function createHead(defaults: HeadUserConfig, ...heads: HeadConfig[]) {
function hasTag (line 140) | function hasTag(head: HeadConfig, entry: HeadConfig[number]): boolean {
function hasOneOf (line 161) | function hasOneOf(head: HeadConfig, entry: HeadConfig[number], keys: str...
function getAttr (line 169) | function getAttr(
function mergeHead (line 185) | function mergeHead(oldHead: HeadConfig, newHead: HeadConfig) {
function sortHead (line 190) | function sortHead(head: HeadConfig) {
function getImportance (line 199) | function getImportance(entry: HeadConfig[number]) {
FILE: packages/starlight/utils/i18n.ts
function processI18nConfig (line 28) | function processI18nConfig(
function getAstroI18nConfig (line 54) | function getAstroI18nConfig(config: StarlightConfig): NonNullable<AstroC...
function getStarlightI18nConfig (line 85) | function getStarlightI18nConfig(
function inferStarlightLocaleFromAstroLocale (line 139) | function inferStarlightLocaleFromAstroLocale(astroLocale: AstroLocale) {
function isDefaultAstroLocale (line 145) | function isDefaultAstroLocale(
function isAstroLocaleExtendedConfig (line 158) | function isAstroLocaleExtendedConfig(locale: AstroLocale): locale is Ast...
function getLocaleInfo (line 163) | function getLocaleInfo(lang: string) {
function getLocaleDir (line 184) | function getLocaleDir(locale: Intl.Locale): 'ltr' | 'rtl' {
function pickLang (line 209) | function pickLang<T extends Record<string, string>>(
type AstroLocale (line 216) | type AstroLocale = NonNullable<AstroConfig['i18n']>['locales'][number];
type AstroLocaleExtendedConfig (line 217) | type AstroLocaleExtendedConfig = Exclude<AstroLocale, string>;
FILE: packages/starlight/utils/localizedUrl.ts
function localizedUrl (line 8) | function localizedUrl(
FILE: packages/starlight/utils/navigation.ts
type Dir (line 48) | interface Dir {
function makeDir (line 55) | function makeDir(slug: string): Dir {
function isDir (line 64) | function isDir(data: Record<string, unknown>): data is Dir {
function configItemToEntry (line 69) | function configItemToEntry(
function groupFromAutogenerateConfig (line 94) | function groupFromAutogenerateConfig(
function linkFromSidebarLinkItem (line 129) | function linkFromSidebarLinkItem(item: SidebarLinkItem, locale: string |...
function linkFromInternalSidebarLinkItem (line 141) | function linkFromInternalSidebarLinkItem(
function makeSidebarLink (line 181) | function makeSidebarLink(
function makeLink (line 194) | function makeLink({
function pathsMatch (line 208) | function pathsMatch(pathA: string, pathB: string) {
function getBreadcrumbs (line 213) | function getBreadcrumbs(path: string, baseDir: string): string[] {
function getRoutePathRelativeToCollectionRoot (line 229) | function getRoutePathRelativeToCollectionRoot(route: Route, locale: stri...
function treeify (line 238) | function treeify(routes: Route[], locale: string | undefined, baseDir: s...
function linkFromRoute (line 276) | function linkFromRoute(route: Route, attrs?: LinkHTMLAttributes): Sideba...
function getOrder (line 289) | function getOrder(routeOrDir: Route | Dir): number {
function sortDirEntries (line 297) | function sortDirEntries(dir: [string, Dir | Route][]): [string, Dir | Ro...
function groupFromDir (line 309) | function groupFromDir(
function dirToItem (line 331) | function dirToItem(
function sidebarFromDir (line 346) | function sidebarFromDir(
function getSidebar (line 374) | function getSidebar(pathname: string, locale: string | undefined): Sideb...
function getSidebarFromConfig (line 385) | function getSidebarFromConfig(
function getIntermediateSidebarFromConfig (line 397) | function getIntermediateSidebarFromConfig(
function setIntermediateSidebarCurrentEntry (line 412) | function setIntermediateSidebarCurrentEntry(
function getSidebarCurrentEntry (line 432) | function getSidebarCurrentEntry(sidebar: SidebarEntry[], pathname: strin...
function getSidebarHash (line 447) | function getSidebarHash(sidebar: SidebarEntry[]): string {
function recursivelyBuildSidebarIdentity (line 458) | function recursivelyBuildSidebarIdentity(sidebar: SidebarEntry[]): string {
function flattenSidebar (line 469) | function flattenSidebar(sidebar: SidebarEntry[]): SidebarLink[] {
function getPrevNextLinks (line 476) | function getPrevNextLinks(
function applyPrevNextLinkConfig (line 496) | function applyPrevNextLinkConfig(
function getSidebarBadge (line 529) | function getSidebarBadge(
function getSidebarBadgeText (line 542) | function getSidebarBadgeText(
FILE: packages/starlight/utils/path.ts
function ensureLeadingSlash (line 2) | function ensureLeadingSlash(href: string): string {
function ensureTrailingSlash (line 8) | function ensureTrailingSlash(href: string): string {
function ensureLeadingAndTrailingSlashes (line 14) | function ensureLeadingAndTrailingSlashes(href: string): string {
function stripLeadingSlash (line 21) | function stripLeadingSlash(href: string) {
function stripTrailingSlash (line 27) | function stripTrailingSlash(href: string) {
function stripLeadingAndTrailingSlashes (line 33) | function stripLeadingAndTrailingSlashes(href: string): string {
function stripHtmlExtension (line 40) | function stripHtmlExtension(path: string) {
function ensureHtmlExtension (line 46) | function ensureHtmlExtension(path: string) {
function stripExtension (line 55) | function stripExtension(path: string) {
FILE: packages/starlight/utils/plugins.ts
function runPlugins (line 20) | async function runPlugins(
function applyPluginMiddleware (line 139) | function applyPluginMiddleware(
function injectPluginTranslationsTypes (line 156) | function injectPluginTranslationsTypes(
type StarlightConfigUpdate (line 199) | type StarlightConfigUpdate = Partial<Omit<StarlightUserConfig, 'routeMid...
type StarlightI18nTFactory (line 200) | type StarlightI18nTFactory = Awaited<ReturnType<typeof createTranslation...
type StarlightPluginsUserConfig (line 469) | type StarlightPluginsUserConfig = z.input<typeof starlightPluginsConfigS...
type StarlightPlugin (line 471) | type StarlightPlugin = z.input<typeof starlightPluginSchema>;
type HookParameters (line 473) | type HookParameters<
type StarlightUserConfigWithPlugins (line 478) | type StarlightUserConfigWithPlugins = StarlightUserConfig & {
type StarlightPluginContext (line 491) | type StarlightPluginContext = Pick<
type PluginTranslations (line 496) | type PluginTranslations = Record<string, UserI18nSchema & Record<string,...
FILE: packages/starlight/utils/routing/data.ts
type PageProps (line 17) | interface PageProps extends Route {
type RouteDataContext (line 21) | type RouteDataContext = Pick<APIContext, 'generator' | 'site' | 'url'>;
function getRoute (line 23) | async function getRoute(context: APIContext): Promise<Route> {
function useRouteData (line 30) | function useRouteData(
function generateRouteData (line 39) | function generateRouteData({
function getToC (line 63) | function getToC({ entry, lang, headings }: PageProps) {
function getLastUpdated (line 78) | function getLastUpdated({ entry }: PageProps): Date | undefined {
function getEditUrl (line 96) | function getEditUrl({ entry }: PageProps): URL | undefined {
function getSiteTitle (line 113) | function getSiteTitle(lang: string): string {
function getSiteTitleHref (line 121) | function getSiteTitleHref(locale: string | undefined): string {
function get404Route (line 126) | async function get404Route(locals: App.Locals): Promise<Route> {
FILE: packages/starlight/utils/routing/index.ts
type Path (line 13) | interface Path extends GetStaticPathsItem {
function normalizeCollectionEntry (line 26) | function normalizeCollectionEntry(entry: StarlightDocsCollectionEntry): ...
function getRoutes (line 44) | function getRoutes(): Route[] {
function getParamRouteMapping (line 85) | function getParamRouteMapping(): ReadonlyMap<string | undefined, Route> {
function getRouteBySlugParam (line 94) | function getRouteBySlugParam(slugParam: string | undefined): Route | und...
function getPaths (line 98) | function getPaths(): Path[] {
function getLocaleRoutes (line 110) | function getLocaleRoutes(locale: string | undefined): Route[] {
function getLocaleDocs (line 118) | function getLocaleDocs(locale: string | undefined): StarlightDocsEntry[] {
function filterByLocale (line 123) | function filterByLocale<T extends { id: string }>(items: T[], locale: st...
FILE: packages/starlight/utils/routing/middleware.ts
function attachRouteDataAndRunMiddleware (line 11) | async function attachRouteDataAndRunMiddleware(
type MiddlewareHandler (line 20) | type MiddlewareHandler<T> = (context: T, next: () => Promise<void>) => v...
class MiddlewareRunnerStep (line 26) | class MiddlewareRunnerStep<T> {
method constructor (line 28) | constructor(callback: MiddlewareHandler<T>) {
method run (line 31) | async run(context: T, next: () => Promise<void>): Promise<void> {
class MiddlewareRunner (line 56) | class MiddlewareRunner<T> {
method constructor (line 60) | constructor(
method #stepThrough (line 70) | async #stepThrough(steps: Array<MiddlewareRunnerStep<T>>) {
method run (line 78) | async run() {
FILE: packages/starlight/utils/routing/types.ts
type LocaleData (line 8) | interface LocaleData {
type SidebarLink (line 17) | interface SidebarLink {
type SidebarGroup (line 26) | interface SidebarGroup {
type SidebarEntry (line 34) | type SidebarEntry = SidebarLink | SidebarGroup;
type PaginationLinks (line 36) | interface PaginationLinks {
type StarlightDocsCollectionEntry (line 44) | type StarlightDocsCollectionEntry = CollectionEntry<'docs'>;
type StarlightDocsEntry (line 47) | type StarlightDocsEntry = StarlightDocsCollectionEntry & {
type Route (line 52) | interface Route extends LocaleData {
type StarlightRouteData (line 64) | interface StarlightRouteData extends Route {
FILE: packages/starlight/utils/slugs.ts
function slugToLocale (line 13) | function slugToLocale(slug: string): string | undefined {
function slugToLocaleData (line 18) | function slugToLocaleData(slug: string): LocaleData {
function localeToLang (line 27) | function localeToLang(locale: string | undefined): string {
function localeToDir (line 37) | function localeToDir(locale: string | undefined): 'ltr' | 'rtl' {
function slugToParam (line 50) | function slugToParam(slug: string): string | undefined {
function slugToPathname (line 56) | function slugToPathname(slug: string): string {
function localizedSlug (line 71) | function localizedSlug(slug: string, locale: string | undefined): string {
function localizedFilePath (line 92) | function localizedFilePath(filePath: string, locale: string | undefined)...
function urlToSlug (line 104) | function urlToSlug(url: URL): string {
FILE: packages/starlight/utils/starlight-page.ts
type StarlightPageFrontmatter (line 65) | type StarlightPageFrontmatter = Omit<
type StarlightPageProps (line 84) | type StarlightPageProps = Prettify<
type StarlightPageDocsEntry (line 100) | type StarlightPageDocsEntry = Omit<StarlightDocsEntry, 'render'>;
function generateStarlightPageRouteData (line 102) | async function generateStarlightPageRouteData({
function getStarlightPageFrontmatter (line 171) | async function getStarlightPageFrontmatter(frontmatter: StarlightPageFro...
function getUserDocsSchema (line 200) | async function getUserDocsSchema(): Promise<
FILE: packages/starlight/utils/translations-fs.ts
function createTranslationSystemFromFs (line 19) | async function createTranslationSystemFromFs<T extends i18nSchemaOutput>(
FILE: packages/starlight/utils/translations.ts
type i18nCollection (line 15) | type i18nCollection = CollectionEntry<'i18n'>;
type UserI18nSchema (line 19) | type UserI18nSchema = 'i18n' extends DataCollectionKey
type UserI18nKeys (line 24) | type UserI18nKeys = keyof RemoveIndexSignature<UserI18nSchema>;
function loadTranslations (line 27) | async function loadTranslations() {
FILE: packages/starlight/utils/types.ts
type RemoveIndexSignature (line 2) | type RemoveIndexSignature<T> = {
type Prettify (line 13) | type Prettify<T> = {
FILE: packages/starlight/utils/user-config.ts
type StarlightConfig (line 339) | type StarlightConfig = z.infer<typeof StarlightConfigSchema>;
type StarlightUserConfig (line 340) | type StarlightUserConfig = z.input<typeof StarlightConfigSchema>;
FILE: packages/starlight/utils/validateLogoImports.ts
function validateLogoImports (line 5) | function validateLogoImports(): void {
FILE: packages/starlight/virtual-internal.d.ts
type ImageMetadata (line 10) | type ImageMetadata = import('astro').ImageMetadata;
FILE: packages/tailwind/__tests__/tailwind.test.ts
function getRootVariables (line 85) | function getRootVariables(output: string) {
function render (line 246) | async function render(candidates: string[] = [], theme: string = '') {
Condensed preview — 874 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,294K chars).
[
{
"path": ".changeset/README.md",
"chars": 510,
"preview": "# Changesets\n\nHello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that wo"
},
{
"path": ".changeset/config.json",
"chars": 502,
"preview": "{\n \"$schema\": \"https://unpkg.com/@changesets/config@2.3.0/schema.json\",\n \"changelog\": [\n \"@changesets/changelog-git"
},
{
"path": ".devcontainer/Dockerfile",
"chars": 408,
"preview": "# Based on https://github.com/withastro/astro/blob/main/.devcontainer/Dockerfile\nFROM mcr.microsoft.com/devcontainers/ja"
},
{
"path": ".devcontainer/devcontainer.json",
"chars": 468,
"preview": "{\n \"name\": \"Contribute to Starlight\",\n \"build\": {\n \"dockerfile\": \"Dockerfile\"\n },\n \"postCreateCommand\": \"sudo cor"
},
{
"path": ".devcontainer/welcome-message.txt",
"chars": 226,
"preview": "🌟 Welcome to Starlight!\n\n🛠️ Your environment is fully setup with all required software installed.\n\nNext steps:\n\n - Pre"
},
{
"path": ".git-blame-ignore-revs",
"chars": 206,
"preview": "# Apply with:\n# `git config --local blame.ignoreRevsFile .git-blame-ignore-revs`\n\n# [Add Prettier and format files](http"
},
{
"path": ".github/DISCUSSION_TEMPLATE/docs-suggestions.yml",
"chars": 1520,
"preview": "body:\n - type: markdown\n attributes:\n value: |\n Thank you for getting in touch! Please fill out this for"
},
{
"path": ".github/DISCUSSION_TEMPLATE/feature-requests.yml",
"chars": 1673,
"preview": "body:\n - type: markdown\n attributes:\n value: |\n Thank you for getting in touch! Please fill out this for"
},
{
"path": ".github/ISSUE_TEMPLATE/---01-bug-report.yml",
"chars": 2293,
"preview": "name: \"\\U0001F41B Bug Report\"\ndescription: Report an issue or possible bug\nlabels: []\nassignees: []\nbody:\n - type: mark"
},
{
"path": ".github/ISSUE_TEMPLATE/---02-docs-issue.yml",
"chars": 1345,
"preview": "name: \"\\U0001F4DA Docs Issue\"\ndescription: Report an issue with the Starlight documentation\nlabels: []\nassignees: []\nbod"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 489,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: 💡 Feature Request\n url: https://github.com/withastro/starlight/d"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 864,
"preview": "<!-- Thank you for opening a PR! We really appreciate you taking the time to help out 🙌 -->\n\n#### Description\n\n<!-- New "
},
{
"path": ".github/labeler.yml",
"chars": 1296,
"preview": "# See https://github.com/actions/labeler\n\n'🚨 action':\n - changed-files:\n - any-glob-to-any-file:\n - .gith"
},
{
"path": ".github/renovate.json5",
"chars": 911,
"preview": "{\n\t$schema: 'https://docs.renovatebot.com/renovate-schema.json',\n\textends: [\n\t\t':disableDependencyDashboard',\n\t\t':semant"
},
{
"path": ".github/workflows/ci.yml",
"chars": 7697,
"preview": "name: CI\n\non:\n push:\n branches: [main]\n merge_group:\n pull_request:\n branches: [main]\n\n# Automatically cancel i"
},
{
"path": ".github/workflows/congratsbot.yml",
"chars": 843,
"preview": "name: Congratsbot\n\non:\n push:\n branches: [main]\n\njobs:\n congrats:\n if: ${{ github.repository_owner == 'withastro"
},
{
"path": ".github/workflows/file-icons.yml",
"chars": 1320,
"preview": "name: File icons generator\n\non:\n schedule:\n - cron: '0 0 * * 0'\n workflow_dispatch:\n\npermissions:\n contents: write"
},
{
"path": ".github/workflows/format.yml",
"chars": 1007,
"preview": "name: Format\n\non:\n push:\n branches:\n - main\n\njobs:\n format:\n runs-on: ubuntu-latest\n steps:\n - name"
},
{
"path": ".github/workflows/lunaria.yml",
"chars": 1313,
"preview": "name: Lunaria\n\non:\n # Trigger the workflow every time a pull request is opened or synchronized at the target `main` bra"
},
{
"path": ".github/workflows/pr-labeler.yml",
"chars": 323,
"preview": "name: 'Pull Request Labeler'\non:\n - pull_request_target\n\njobs:\n triage:\n permissions:\n contents: read\n pu"
},
{
"path": ".github/workflows/preview-release.yml",
"chars": 3836,
"preview": "name: Preview Release\npermissions: {}\n\non:\n pull_request:\n branches: [main]\n types: [labeled]\n\n# Automatically ca"
},
{
"path": ".github/workflows/release.yml",
"chars": 1398,
"preview": "name: Release\npermissions: {}\n\non:\n push:\n branches:\n - main\n\njobs:\n release:\n name: Release\n if: ${{ gi"
},
{
"path": ".github/workflows/size-limit.yml",
"chars": 2083,
"preview": "name: Size Limit\n\non:\n pull_request:\n branches: [main]\n\n# Automatically cancel in-progress actions on the same branc"
},
{
"path": ".github/workflows/welcome-bot.yml",
"chars": 1132,
"preview": "name: WelcomeBot\n\non:\n pull_request_target:\n branches: [main]\n types: [opened]\n\npermissions:\n pull-requests: wri"
},
{
"path": ".gitignore",
"chars": 257,
"preview": "# dependencies\nnode_modules/\n\n# logs\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\n\n# environment varia"
},
{
"path": ".npmrc",
"chars": 105,
"preview": "prefer-workspace-packages=true\nlink-workspace-packages=true\nshell-emulator=true\nauto-install-peers=false\n"
},
{
"path": ".prettierignore",
"chars": 720,
"preview": "# Deep Directories\n**/node_modules\n\n# Generated Directories\n**/dist\n**/build\n**/.astro\n**/__coverage__\n\n# Directories\n.c"
},
{
"path": ".prettierrc",
"chars": 410,
"preview": "{\n \"printWidth\": 100,\n \"semi\": true,\n \"singleQuote\": true,\n \"tabWidth\": 2,\n \"trailingComma\": \"es5\",\n \"useTabs\": tr"
},
{
"path": ".vscode/extensions.json",
"chars": 155,
"preview": "{\n \"recommendations\": [\n \"astro-build.astro-vscode\",\n \"dbaeumer.vscode-eslint\",\n \"hideoo.starlight-links\"\n ],"
},
{
"path": ".vscode/launch.json",
"chars": 247,
"preview": "{\n \"version\": \"0.2.0\",\n \"configurations\": [\n {\n \"command\": \"./node_modules/.bin/astro dev\",\n \"cwd\": \"${wo"
},
{
"path": "CONTRIBUTING.md",
"chars": 17105,
"preview": "# Contributor Manual\n\nWe welcome contributions of any size and contributors of any skill level.\nAs an open source projec"
},
{
"path": "LICENSE",
"chars": 1137,
"preview": "MIT License\n\nCopyright (c) 2023 [Astro contributors](https://github.com/withastro/starlight/graphs/contributors)\n\nPermis"
},
{
"path": "docs/.gitignore",
"chars": 229,
"preview": "# build output\ndist/\n# generated types\n.astro/\n\n# dependencies\nnode_modules/\n\n# logs\nnpm-debug.log*\nyarn-debug.log*\nyarn"
},
{
"path": "docs/README.md",
"chars": 1412,
"preview": "# Starlight Docs\n\n[](https://starlight.as"
},
{
"path": "docs/__a11y__/docs.test.ts",
"chars": 560,
"preview": "import { expect, test } from './test-utils';\n\ntest('does not report accessibility violations on the docs site', async ({"
},
{
"path": "docs/__a11y__/test-utils.ts",
"chars": 6326,
"preview": "import { test as baseTest, type Page } from '@playwright/test';\nimport {\n\tDefaultTerminalReporter,\n\tgetViolations,\n\tinje"
},
{
"path": "docs/astro.config.mjs",
"chars": 5004,
"preview": "// @ts-check\nimport { defineConfig } from 'astro/config';\nimport starlight from '@astrojs/starlight';\nimport starlightLi"
},
{
"path": "docs/grammars/README.md",
"chars": 762,
"preview": "# Starlight Docs Grammars\n\nThis directory contains additional grammars for the Starlight documentation website.\n\n## Gram"
},
{
"path": "docs/grammars/generate.mjs",
"chars": 2343,
"preview": "// @ts-check\n\nimport fs from 'node:fs/promises';\n\nconst markdown = {\n\trepo: 'shikijs/textmate-grammars-themes',\n\ttmLangu"
},
{
"path": "docs/grammars/markdoc.tmLanguage.json",
"chars": 86964,
"preview": "{\n \"displayName\": \"Markdown\",\n \"name\": \"markdoc\",\n \"patterns\": [\n {\n \"include\": \"#frontMatter\"\n },\n {\n "
},
{
"path": "docs/lunaria/components.ts",
"chars": 650,
"preview": "import { html } from '@lunariajs/core';\n\nexport const TitleParagraph = () => html`\n\t<p>\n\t\tIf you're interested in helpin"
},
{
"path": "docs/lunaria/renderer.config.ts",
"chars": 190,
"preview": "import { defineRendererConfig } from '@lunariajs/core';\nimport { TitleParagraph } from './components';\n\nexport default d"
},
{
"path": "docs/lunaria/styles.css",
"chars": 1169,
"preview": ":root {\n\t--theme-accent: hsl(234, 100%, 87%);\n\t--theme-bg: hsl(223, 13%, 10%);\n\t--theme-table-header: hsl(222, 13%, 16%)"
},
{
"path": "docs/lunaria.config.json",
"chars": 2290,
"preview": "{\n \"$schema\": \"./node_modules/@lunariajs/core/config.schema.json\",\n \"repository\": {\n \"name\": \"withastro/starlight\","
},
{
"path": "docs/package.json",
"chars": 904,
"preview": "{\n \"name\": \"starlight-docs\",\n \"private\": true,\n \"type\": \"module\",\n \"version\": \"0.0.1\",\n \"scripts\": {\n \"test\": \"p"
},
{
"path": "docs/playwright.config.ts",
"chars": 646,
"preview": "import { defineConfig, devices } from '@playwright/test';\n\nexport default defineConfig({\n\tforbidOnly: !!process.env['CI'"
},
{
"path": "docs/public/_headers",
"chars": 95,
"preview": "/_astro/*\n Cache-Control: public\n Cache-Control: max-age=31536000\n Cache-Control: immutable\n"
},
{
"path": "docs/public/_redirects",
"chars": 534,
"preview": "# Proxy to Phat Houston from our Product Hunt launch — site operated by Otterlord\n/ph/* https://astro-hous"
},
{
"path": "docs/src/assets/landing.css",
"chars": 720,
"preview": ":root {\n\t--purple-hsl: 255, 60%, 60%;\n\t--overlay-blurple: hsla(var(--purple-hsl), 0.2);\n}\n\n:root[data-theme='light'] {\n\t"
},
{
"path": "docs/src/assets/robots.txt",
"chars": 81,
"preview": "User-agent: *\nAllow: /\n\nSitemap: https://starlight.astro.build/sitemap-index.xml\n"
},
{
"path": "docs/src/components/about-astro.astro",
"chars": 2472,
"preview": "---\ninterface Props {\n\ttitle: string;\n}\n\nconst { title } = Astro.props;\n---\n\n<article class=\"sl-flex\" aria-labelledby=\"a"
},
{
"path": "docs/src/components/component-preview.astro",
"chars": 937,
"preview": "---\nimport { Tabs, TabItem } from '@astrojs/starlight/components';\n\nconst showContentTypeTabs = Astro.slots.has('markdoc"
},
{
"path": "docs/src/components/fluid-grid.astro",
"chars": 458,
"preview": "---\ninterface Props {\n\tminColumnWidth?: string;\n\tgap?: string;\n}\nconst { minColumnWidth, gap } = Astro.props;\n---\n\n<ul c"
},
{
"path": "docs/src/components/icons-list.astro",
"chars": 1936,
"preview": "---\nimport { Icon } from '@astrojs/starlight/components';\nimport { Icons, type StarlightIcon } from '../../../packages/s"
},
{
"path": "docs/src/components/languages-list.astro",
"chars": 1559,
"preview": "---\nimport { getEntry } from 'astro:content';\nimport translations from '../../../packages/starlight/translations';\n\ninte"
},
{
"path": "docs/src/components/media-card.astro",
"chars": 933,
"preview": "---\ninterface Props {\n\thref?: string | undefined;\n}\nconst { href } = Astro.props;\nconst El = href ? 'a' : 'span';\n---\n\n<"
},
{
"path": "docs/src/components/showcase-card.astro",
"chars": 1680,
"preview": "---\nimport type { ImageMetadata } from 'astro';\nimport { Image } from 'astro:assets';\nimport MediaCard from './media-car"
},
{
"path": "docs/src/components/showcase-sites.astro",
"chars": 9087,
"preview": "---\nimport Card from './showcase-card.astro';\nimport FluidGrid from './fluid-grid.astro';\n---\n\n<FluidGrid>\n\t<Card title="
},
{
"path": "docs/src/components/sidebar-preview.astro",
"chars": 1655,
"preview": "---\nimport type {\n\tAutoSidebarGroup,\n\tSidebarItem,\n\tInternalSidebarLinkItem,\n} from '../../../packages/starlight/schemas"
},
{
"path": "docs/src/components/social-links-type.astro",
"chars": 285,
"preview": "---\nimport { getRelativeLocaleUrl } from 'astro:i18n';\nconst href = getRelativeLocaleUrl(Astro.currentLocale ?? 'en', '/"
},
{
"path": "docs/src/components/testimonial-grid.astro",
"chars": 792,
"preview": "---\ninterface Props {\n\ttitle: string;\n}\n\nconst { title } = Astro.props;\n---\n\n<div class=\"testimonial-wrapper not-content"
},
{
"path": "docs/src/components/testimonial.astro",
"chars": 1833,
"preview": "---\nimport type { ImageMetadata } from 'astro';\nimport { Image } from 'astro:assets';\n\ninterface Props {\n\thandle: string"
},
{
"path": "docs/src/components/theme-designer/atom.ts",
"chars": 883,
"preview": "class Atom<T> {\n\t#v: T;\n\t#subscribers = new Map<(v: T) => void, (v: T) => void>();\n\t#notify = () => this.#subscribers.fo"
},
{
"path": "docs/src/components/theme-designer/color-editor.astro",
"chars": 2416,
"preview": "---\nimport { oklchToHex } from './color-lib';\nimport { store } from './store';\nimport ValueSlider from './value-slider.a"
},
{
"path": "docs/src/components/theme-designer/color-lib.ts",
"chars": 5773,
"preview": "import {\n\tclampChroma,\n\tformatHex,\n\tmodeLrgb,\n\tmodeOklch,\n\tmodeRgb,\n\tuseMode,\n\twcagContrast,\n\ttype Oklch,\n} from 'culori"
},
{
"path": "docs/src/components/theme-designer/contrast-level.astro",
"chars": 1806,
"preview": "---\nexport interface Props {\n\tlabels: {\n\t\tlabel: string;\n\t};\n}\nconst { labels = { label: 'WCAG Contrast Level' } } = Ast"
},
{
"path": "docs/src/components/theme-designer/palette.astro",
"chars": 954,
"preview": "---\ninterface Props {\n\tlight?: boolean;\n}\n---\n\n<div class=\"not-content\">\n\t<div class=\"palette\">\n\t\t{\n\t\t\tAstro.props.light"
},
{
"path": "docs/src/components/theme-designer/presets.astro",
"chars": 2239,
"preview": "---\nimport { Icon } from '@astrojs/starlight/components';\nimport { getPalettes } from './color-lib';\nimport { presets } "
},
{
"path": "docs/src/components/theme-designer/preview.astro",
"chars": 1243,
"preview": "---\nimport type { HTMLAttributes } from 'astro/types';\nimport Palette from './palette.astro';\n\ninterface Props extends H"
},
{
"path": "docs/src/components/theme-designer/store.ts",
"chars": 1174,
"preview": "import { atom, map } from './atom';\n\nexport const presets = {\n\tocean: {\n\t\taccent: { hue: 240, chroma: 0.27 },\n\t\tgray: { "
},
{
"path": "docs/src/components/theme-designer/value-slider.astro",
"chars": 1525,
"preview": "---\nimport { store } from './store';\n\ninterface Props {\n\tlabel: string;\n\tstoreKey: keyof typeof store;\n\ttype: 'hue' | 'c"
},
{
"path": "docs/src/components/theme-designer.astro",
"chars": 5035,
"preview": "---\nimport { TabItem, Tabs } from '@astrojs/starlight/components';\nimport ColorEditor, { type Props as EditorProps } fro"
},
{
"path": "docs/src/components/theme-grid.astro",
"chars": 5697,
"preview": "---\nimport { Icon } from '@astrojs/starlight/components';\nimport FluidGrid from './fluid-grid.astro';\nimport MediaCard f"
},
{
"path": "docs/src/components/theme-image.astro",
"chars": 1436,
"preview": "---\nimport { AstroError } from 'astro/errors';\nimport { Image } from 'astro:assets';\n\ninterface Props {\n\tsrc: string;\n\tc"
},
{
"path": "docs/src/components/ui-strings-list.astro",
"chars": 179,
"preview": "---\nimport { Code } from '@astrojs/starlight/components';\nimport uiStrings from '../../../packages/starlight/translation"
},
{
"path": "docs/src/components/youtube-card.astro",
"chars": 650,
"preview": "---\nimport { YouTube } from '@astro-community/astro-embed-youtube';\nimport MediaCard from './media-card.astro';\n\nexport "
},
{
"path": "docs/src/components/youtube-grid.astro",
"chars": 286,
"preview": "---\nimport FluidGrid from './fluid-grid.astro';\nimport YoutubeCard, { type Props as CardProps } from './youtube-card.ast"
},
{
"path": "docs/src/content/docs/404.md",
"chars": 319,
"preview": "---\ntitle: Not found\ntemplate: splash\neditUrl: false\nlastUpdated: false\nhero:\n title: '404'\n tagline: <strong>Houston,"
},
{
"path": "docs/src/content/docs/components/asides.mdx",
"chars": 4288,
"preview": "---\ntitle: Asides\ndescription: Learn how to use asides in Starlight to display secondary information alongside a page’s "
},
{
"path": "docs/src/content/docs/components/badges.mdx",
"chars": 3742,
"preview": "---\ntitle: Badges\ndescription: Learn how to use badges in Starlight to display additional pieces of information.\n---\n\nim"
},
{
"path": "docs/src/content/docs/components/card-grids.mdx",
"chars": 4075,
"preview": "---\ntitle: Card Grids\ndescription: Learn how to wrap multiple cards in a grid in Starlight.\nsidebar:\n order: 4\n---\n\nimp"
},
{
"path": "docs/src/content/docs/components/cards.mdx",
"chars": 2268,
"preview": "---\ntitle: Cards\ndescription: Learn how to use cards in Starlight to display content in a box.\nsidebar:\n order: 2\n---\n\n"
},
{
"path": "docs/src/content/docs/components/code.mdx",
"chars": 2828,
"preview": "---\ntitle: Code\ndescription: Learn how to display syntax highlighted code in Starlight without Markdown code blocks.\n---"
},
{
"path": "docs/src/content/docs/components/file-tree.mdx",
"chars": 4276,
"preview": "---\ntitle: File Tree\ndescription: Learn how to display the structure of a directory with file icons and collapsible sub-"
},
{
"path": "docs/src/content/docs/components/icons.mdx",
"chars": 3053,
"preview": "---\ntitle: Icons\ndescription: Learn how to display icons in Starlight.\n---\n\nimport { Icon } from '@astrojs/starlight/com"
},
{
"path": "docs/src/content/docs/components/link-buttons.mdx",
"chars": 3644,
"preview": "---\ntitle: Link Buttons\ndescription: Learn how to create link buttons in Starlight for visually distinct call-to-action "
},
{
"path": "docs/src/content/docs/components/link-cards.mdx",
"chars": 2731,
"preview": "---\ntitle: Link Cards\ndescription: Learn how to display links prominently as cards in Starlight.\nsidebar:\n order: 3\n---"
},
{
"path": "docs/src/content/docs/components/steps.mdx",
"chars": 2149,
"preview": "---\ntitle: Steps\ndescription: Learn how to style numbered lists of tasks to create step-by-step guides in Starlight.\n---"
},
{
"path": "docs/src/content/docs/components/tabs.mdx",
"chars": 5200,
"preview": "---\ntitle: Tabs\ndescription: Learn how to create tabbed interfaces in Starlight to group equivalent information.\n---\n\nim"
},
{
"path": "docs/src/content/docs/components/using-components.mdx",
"chars": 3668,
"preview": "---\ntitle: Using Components\ndescription: Using components in MDX and Markdoc with Starlight.\nsidebar:\n order: 1\n---\n\nCo"
},
{
"path": "docs/src/content/docs/da/404.md",
"chars": 332,
"preview": "---\ntitle: Ikke Fundet\ntemplate: splash\neditUrl: false\nlastUpdated: false\nhero:\n title: '404'\n tagline: <strong>Housto"
},
{
"path": "docs/src/content/docs/da/index.mdx",
"chars": 2001,
"preview": "---\ntitle: Starlight 🌟 Byg dokumentationssider med Astro\ndescription: Starlight hjælper dig med at bygge smukke og hurti"
},
{
"path": "docs/src/content/docs/de/404.md",
"chars": 349,
"preview": "---\ntitle: Nicht gefunden\ntemplate: splash\neditUrl: false\nlastUpdated: false\nhero:\n title: '404'\n tagline: <strong>Hou"
},
{
"path": "docs/src/content/docs/de/components/asides.mdx",
"chars": 4875,
"preview": "---\ntitle: Nebenbemerkungen\ndescription: Lerne, wie du in Starlight zusätzliche Informationen neben dem Hauptinhalt eine"
},
{
"path": "docs/src/content/docs/de/components/badges.mdx",
"chars": 3985,
"preview": "---\ntitle: Abzeichen\ndescription: Lerne, wie du in Starlight Abzeichen verwenden kannst, um zusätzliche Informationen an"
},
{
"path": "docs/src/content/docs/de/components/card-grids.mdx",
"chars": 4453,
"preview": "---\ntitle: Kartenraster\ndescription: Erfahre, wie du in Starlight mehrere Karten in ein Raster packen kannst.\nsidebar:\n "
},
{
"path": "docs/src/content/docs/de/components/cards.mdx",
"chars": 2531,
"preview": "---\ntitle: Karten\ndescription: Lerne, wie du in Starlight Karten verwenden kannst, um Inhalte in einer Box anzuzeigen.\ns"
},
{
"path": "docs/src/content/docs/de/components/code.mdx",
"chars": 3100,
"preview": "---\ntitle: Code\ndescription: Erfahre, wie du syntaxmarkierten Code in Starlight ohne Markdown-Codeblöcke anzeigen kannst"
},
{
"path": "docs/src/content/docs/de/components/file-tree.mdx",
"chars": 4575,
"preview": "---\ntitle: Verzeichnisbaum\ndescription: Lerne, wie du die Struktur eines Verzeichnisses mit Dateisymbolen und einklappba"
},
{
"path": "docs/src/content/docs/de/components/icons.mdx",
"chars": 3344,
"preview": "---\ntitle: Symbole\ndescription: Erfahre, wie du Symbole in Starlight anzeigen kannst.\n---\n\nimport { Icon } from '@astroj"
},
{
"path": "docs/src/content/docs/de/components/link-buttons.mdx",
"chars": 3903,
"preview": "---\ntitle: Link-Buttons\ndescription: Erfahre, wie du in Starlight Link-Buttons für visuell eindeutige Call-to-Action-Lin"
},
{
"path": "docs/src/content/docs/de/components/link-cards.mdx",
"chars": 3036,
"preview": "---\ntitle: Link-Karten\ndescription: Erfahre, wie du in Starlight Links prominent als Karten anzeigst.\nsidebar:\n order: "
},
{
"path": "docs/src/content/docs/de/components/steps.mdx",
"chars": 2369,
"preview": "---\ntitle: Schritte\ndescription: Hier erfährst du, wie du nummerierte Listen mit Aufgaben erstellen kannst, um Schritt-f"
},
{
"path": "docs/src/content/docs/de/components/tabs.mdx",
"chars": 5756,
"preview": "---\ntitle: Registerkarten\ndescription: Lerne, wie du in Starlight Oberflächen mit Registerkarten erstellst, um gleichwer"
},
{
"path": "docs/src/content/docs/de/components/using-components.mdx",
"chars": 4354,
"preview": "---\ntitle: Verwendung von Komponenten\ndescription: Verwendung von Komponenten in MDX und Markdoc mit Starlight.\nsidebar:"
},
{
"path": "docs/src/content/docs/de/environmental-impact.md",
"chars": 9146,
"preview": "---\ntitle: Umweltfreundliche Dokumentation\ndescription: Erfahre, wie Starlight dir helfen kann, umweltfreundlichere Doku"
},
{
"path": "docs/src/content/docs/de/getting-started.mdx",
"chars": 5074,
"preview": "---\ntitle: Erste Schritte\ndescription: Lerne, wie du deine nächste Dokumentations­website mit Starlight und Astro er"
},
{
"path": "docs/src/content/docs/de/guides/authoring-content.mdx",
"chars": 21693,
"preview": "---\ntitle: Inhalte in Markdown verfassen\ndescription: Ein Überblick über die von Starlight unterstützte Markdown-Syntax."
},
{
"path": "docs/src/content/docs/de/guides/css-and-tailwind.mdx",
"chars": 13238,
"preview": "---\ntitle: CSS & Styling\ndescription: Lerne, wie du deine Starlight-Website mit benutzerdefiniertem CSS gestalten oder m"
},
{
"path": "docs/src/content/docs/de/guides/customization.mdx",
"chars": 14884,
"preview": "---\ntitle: Starlight anpassen\ndescription: Lerne, wie du deine Starlight-Website mit deinem Logo, eigenen Schriftarten, "
},
{
"path": "docs/src/content/docs/de/guides/i18n.mdx",
"chars": 15934,
"preview": "---\ntitle: Internationalisierung (i18n)\ndescription: Lerne, wie du deine Starlight-Website so konfigurierst, dass sie me"
},
{
"path": "docs/src/content/docs/de/guides/overriding-components.mdx",
"chars": 6571,
"preview": "---\ntitle: Komponenten ersetzen\ndescription: In Starlight kannst du eingebauten Komponenten ersetzen, um eigene Elemente"
},
{
"path": "docs/src/content/docs/de/guides/pages.mdx",
"chars": 8713,
"preview": "---\ntitle: Seiten\ndescription: Lerne, wie du mit Starlight die Seiten deiner Dokumentationswebsite erstellst und verwalt"
},
{
"path": "docs/src/content/docs/de/guides/project-structure.mdx",
"chars": 1735,
"preview": "---\ntitle: Projektstruktur\ndescription: Lerne, wie du Dateien in deinem Starlight-Projekt organisierst.\n---\n\nDiese Anlei"
},
{
"path": "docs/src/content/docs/de/guides/route-data.mdx",
"chars": 6016,
"preview": "---\ntitle: Routendaten\ndescription: Erfahre, wie das Seitendatenmodell von Starlight zum Rendern deiner Seiten verwendet"
},
{
"path": "docs/src/content/docs/de/guides/sidebar.mdx",
"chars": 18432,
"preview": "---\ntitle: Seitenleisten-Navigation\ndescription: Erfahre, wie du die Navigationslinks in der Seitenleiste deiner Starlig"
},
{
"path": "docs/src/content/docs/de/guides/site-search.mdx",
"chars": 9013,
"preview": "---\ntitle: Suche\ndescription: Finde heraus, welche Suchfunktionen in Starlight integriert sind und wie du sie anpassen k"
},
{
"path": "docs/src/content/docs/de/index.mdx",
"chars": 6514,
"preview": "---\ntitle: Starlight 🌟 Einfache Dokumentations-Websites mit Astro\nhead:\n - tag: title\n content: Starlight 🌟 Einfache"
},
{
"path": "docs/src/content/docs/de/manual-setup.mdx",
"chars": 5335,
"preview": "---\ntitle: Manuelle Einrichtung\ndescription: Lerne wie du Starlight manuell konfigurierst, um es zu einem bestehenden As"
},
{
"path": "docs/src/content/docs/de/reference/configuration.mdx",
"chars": 27213,
"preview": "---\ntitle: Konfigurationsreferenz\ndescription: Ein Überblick über alle von Starlight unterstützten Konfigurations­op"
},
{
"path": "docs/src/content/docs/de/reference/frontmatter.md",
"chars": 13748,
"preview": "---\ntitle: Frontmatter Referenz\ndescription: Ein Überblick über die von Starlight unterstützten Standard-Frontmatter-Fel"
},
{
"path": "docs/src/content/docs/de/reference/icons.mdx",
"chars": 1141,
"preview": "---\ntitle: Symbole Referenz\ndescription: Eine Übersicht über alle in Starlight verfügbaren Symbole.\nsidebar:\n label: Sy"
},
{
"path": "docs/src/content/docs/de/reference/overrides.md",
"chars": 13503,
"preview": "---\ntitle: Ersetzung von Komponenten Referenz\ndescription: Ein Überblick über die Komponenten und Komponenten­eigens"
},
{
"path": "docs/src/content/docs/de/reference/plugins.md",
"chars": 13875,
"preview": "---\ntitle: Plugins Referenz\ndescription: Ein Überblick über die Starlight-Plugin-API.\ntableOfContents:\n maxHeadingLevel"
},
{
"path": "docs/src/content/docs/de/reference/route-data.mdx",
"chars": 6217,
"preview": "---\ntitle: Routendaten Referenz\ndescription: Die vollständige Referenz­dokumentation für Starlights Routendatenobjek"
},
{
"path": "docs/src/content/docs/de/resources/community-content.mdx",
"chars": 11729,
"preview": "---\ntitle: Community-Inhalte\ndescription: Entdecke von der Community erstellte Anleitungen, Artikel und Videos, die dir "
},
{
"path": "docs/src/content/docs/de/resources/plugins.mdx",
"chars": 11839,
"preview": "---\ntitle: Plugins und Integrationen\ndescription: Entdecke Community-Tools wie Plugins und Integrationen, die Starlight "
},
{
"path": "docs/src/content/docs/de/resources/showcase.mdx",
"chars": 677,
"preview": "---\ntitle: Starlight Schaufenster\ndescription: Entdecke Websites, die mit Starlight erstellt wurden!\nsidebar:\n label: W"
},
{
"path": "docs/src/content/docs/de/resources/themes.mdx",
"chars": 4589,
"preview": "---\ntitle: Themes\ndescription: Gestalte deine Dokumentation mit einem Community-Theme für Starlight\ntableOfContents: fal"
},
{
"path": "docs/src/content/docs/environmental-impact.md",
"chars": 8109,
"preview": "---\ntitle: Eco-friendly docs\ndescription: Learn how Starlight can help you build greener documentation sites and reduce "
},
{
"path": "docs/src/content/docs/es/404.md",
"chars": 348,
"preview": "---\ntitle: No encontrada\ntemplate: splash\neditUrl: false\nlastUpdated: false\nhero:\n title: '404'\n tagline: <strong>Hous"
},
{
"path": "docs/src/content/docs/es/components/asides.mdx",
"chars": 3754,
"preview": "---\ntitle: Apartados\ndescription: Aprende a usar apartados en Starlight para mostrar información secundaria junto al con"
},
{
"path": "docs/src/content/docs/es/components/badges.mdx",
"chars": 3825,
"preview": "---\ntitle: Insignias\ndescription: Aprende a usar insignias en Starlight para mostrar información adicional.\n---\n\nimport "
},
{
"path": "docs/src/content/docs/es/components/card-grids.mdx",
"chars": 4318,
"preview": "---\ntitle: Cuadrículas de tarjetas\ndescription: Aprende a envolver varias tarjetas en una cuadrícula en Starlight.\nsideb"
},
{
"path": "docs/src/content/docs/es/components/cards.mdx",
"chars": 2439,
"preview": "---\ntitle: Tarjetas\ndescription: Aprende a usar tarjetas en Starlight para mostrar contenido en una caja.\nsidebar:\n ord"
},
{
"path": "docs/src/content/docs/es/components/code.mdx",
"chars": 3053,
"preview": "---\ntitle: Código\ndescription: Aprende a mostrar código con resaltado de sintaxis en Starlight sin bloques de código de "
},
{
"path": "docs/src/content/docs/es/components/file-tree.mdx",
"chars": 3883,
"preview": "---\ntitle: Árbol de archivos\ndescription: Aprende a mostrar la estructura de un directorio con iconos de archivo y subdi"
},
{
"path": "docs/src/content/docs/es/components/icons.mdx",
"chars": 3228,
"preview": "---\ntitle: Iconos\ndescription: Aprende a mostrar iconos en Starlight.\n---\n\nimport { Icon } from '@astrojs/starlight/comp"
},
{
"path": "docs/src/content/docs/es/components/link-buttons.mdx",
"chars": 3924,
"preview": "---\ntitle: Botones de enlace\ndescription: Aprende a crear botones de enlace en Starlight para enlaces de llamada a la ac"
},
{
"path": "docs/src/content/docs/es/components/link-cards.mdx",
"chars": 2968,
"preview": "---\ntitle: Tarjetas de enlace\ndescription: Aprende a mostrar enlaces de forma destacada como tarjetas en Starlight.\nside"
},
{
"path": "docs/src/content/docs/es/components/steps.mdx",
"chars": 2277,
"preview": "---\ntitle: Pasos\ndescription: Aprende como dar estilo a listas numeradas de tareas para crear guías paso a paso en Starl"
},
{
"path": "docs/src/content/docs/es/components/tabs.mdx",
"chars": 5563,
"preview": "---\ntitle: Pestañas\ndescription: Aprende a crear interfaces con pestañas en Starlight para agrupar información equivalen"
},
{
"path": "docs/src/content/docs/es/components/using-components.mdx",
"chars": 4213,
"preview": "---\ntitle: Usando componentes\ndescription: Usando componentes en MDX y Markdoc con Starlight.\nsidebar:\n order: 1\n---\n\nL"
},
{
"path": "docs/src/content/docs/es/environmental-impact.md",
"chars": 9008,
"preview": "---\ntitle: Documentación ecológica\ndescription: Aprende cómo Starlight puede ayudarte a construir sitios de documentació"
},
{
"path": "docs/src/content/docs/es/getting-started.mdx",
"chars": 4706,
"preview": "---\ntitle: Empezando\ndescription: Aprende cómo empezar a construir tu próximo sitio de documentación con Starlight utili"
},
{
"path": "docs/src/content/docs/es/guides/authoring-content.mdx",
"chars": 18318,
"preview": "---\ntitle: Creación de contenido en Markdown\ndescription: Una descripción general de la sintaxis Markdown que soporta St"
},
{
"path": "docs/src/content/docs/es/guides/css-and-tailwind.mdx",
"chars": 8863,
"preview": "---\ntitle: CSS y Estilos\ndescription: Aprende a darle estilo a tu sitio Starlight con CSS personalizado o integrado con "
},
{
"path": "docs/src/content/docs/es/guides/customization.mdx",
"chars": 14497,
"preview": "---\ntitle: Personalizando Starlight\ndescription: Aprende cómo personalizar tu sitio de Starlight con estilos personaliza"
},
{
"path": "docs/src/content/docs/es/guides/i18n.mdx",
"chars": 15161,
"preview": "---\ntitle: Internacionalización (i18n)\ndescription: Aprende a configurar tu sitio Starlight para admitir varios idiomas."
},
{
"path": "docs/src/content/docs/es/guides/overriding-components.mdx",
"chars": 6019,
"preview": "---\ntitle: Sobreescribiendo Componentes\ndescription: Aprende como sobreescribir los componentes integrados de Starlight "
},
{
"path": "docs/src/content/docs/es/guides/pages.mdx",
"chars": 6763,
"preview": "---\ntitle: Páginas\ndescription: Aprende cómo crear y gestionar las páginas de tu sitio de documentación con Starlight.\ns"
},
{
"path": "docs/src/content/docs/es/guides/project-structure.mdx",
"chars": 1794,
"preview": "---\ntitle: Estructura del proyecto\ndescription: Aprende cómo organizar archivos en tu proyecto Starlight\n---\n\nEsta guía "
},
{
"path": "docs/src/content/docs/es/guides/route-data.mdx",
"chars": 5992,
"preview": "---\ntitle: Datos de Ruta\ndescription: Aprende cómo se utiliza el modelo de datos de página de Starlight para renderizar "
},
{
"path": "docs/src/content/docs/es/guides/sidebar.mdx",
"chars": 16032,
"preview": "---\ntitle: Barra Lateral de Navegación\ndescription: Aprende a configurar y personalizar los enlaces de navegación de la "
},
{
"path": "docs/src/content/docs/es/guides/site-search.mdx",
"chars": 5855,
"preview": "---\ntitle: Búsqueda en el sitio\ndescription: Aprende sobre las funciones de búsqueda de sitios integradas de Starlight y"
},
{
"path": "docs/src/content/docs/es/index.mdx",
"chars": 6328,
"preview": "---\ntitle: Starlight 🌟 Construye sitios de documentación con Astro\nhead:\n - tag: title\n content: Starlight 🌟 Constru"
},
{
"path": "docs/src/content/docs/es/manual-setup.mdx",
"chars": 4667,
"preview": "---\ntitle: Configuración Manual\ndescription: Aprende como configurar Starlight manualmente para agregarlo a un proyecto "
},
{
"path": "docs/src/content/docs/es/reference/configuration.mdx",
"chars": 20104,
"preview": "---\ntitle: Referencia de Configuración\ndescription: Una descripción general de todas las opciones de configuración que a"
},
{
"path": "docs/src/content/docs/es/reference/frontmatter.md",
"chars": 12815,
"preview": "---\ntitle: Referencia de Frontmatter\ndescription: Una visión general de los campos de frontmatter predeterminados que ad"
},
{
"path": "docs/src/content/docs/es/reference/icons.mdx",
"chars": 796,
"preview": "---\ntitle: Referencia de iconos\ndescription: Una descripción general de todos los iconos disponibles en Starlight.\n---\n\n"
},
{
"path": "docs/src/content/docs/es/reference/overrides.md",
"chars": 16519,
"preview": "---\ntitle: Referencia de Personalización de Componentes\ndescription: Una descripción general de los componentes y props "
},
{
"path": "docs/src/content/docs/es/reference/plugins.md",
"chars": 7795,
"preview": "---\ntitle: Referencia de Plugins\ndescription: Una descripción general de la API de plugins de Starlight.\ntableOfContents"
},
{
"path": "docs/src/content/docs/es/reference/route-data.mdx",
"chars": 6306,
"preview": "---\ntitle: Referencia de los Datos de Ruta\ndescription: La documentación de referencia completa para el objeto de datos "
},
{
"path": "docs/src/content/docs/es/resources/community-content.mdx",
"chars": 6598,
"preview": "---\ntitle: Contenido de la comunidad\ndescription: ¡Descubre guías, artículos y videos producidos por la comunidad para a"
},
{
"path": "docs/src/content/docs/es/resources/plugins.mdx",
"chars": 5272,
"preview": "---\ntitle: Plugins e Integraciones\ndescription: ¡Descubre herramientas de la comunidad como plugins e integraciones que "
},
{
"path": "docs/src/content/docs/es/resources/showcase.mdx",
"chars": 683,
"preview": "---\ntitle: Exhibición de Starlight\ndescription: ¡Descubre sitios construidos con Starlight!\nsidebar:\n label: Galería de"
},
{
"path": "docs/src/content/docs/es/resources/themes.mdx",
"chars": 3089,
"preview": "---\ntitle: Temas\ndescription: Dale estilo a tus documentos con un tema de la comunidad para Starlight\ntableOfContents: f"
},
{
"path": "docs/src/content/docs/fr/404.md",
"chars": 366,
"preview": "---\ntitle: Page Introuvable\ntemplate: splash\neditUrl: false\nlastUpdated: false\nhero:\n title: '404'\n tagline: <strong>H"
},
{
"path": "docs/src/content/docs/fr/components/asides.mdx",
"chars": 4872,
"preview": "---\ntitle: Encarts\ndescription: Apprenez à utiliser les encarts dans Starlight pour afficher des informations secondaire"
},
{
"path": "docs/src/content/docs/fr/components/badges.mdx",
"chars": 4023,
"preview": "---\ntitle: Badges\ndescription: Apprenez à utiliser les badges dans Starlight pour afficher des informations supplémentai"
},
{
"path": "docs/src/content/docs/fr/components/card-grids.mdx",
"chars": 4478,
"preview": "---\ntitle: Grilles de cartes\ndescription: Apprenez à regrouper plusieurs cartes dans une grille dans Starlight.\nsidebar:"
},
{
"path": "docs/src/content/docs/fr/components/cards.mdx",
"chars": 2538,
"preview": "---\ntitle: Cartes\ndescription: Apprenez à utiliser des cartes dans Starlight pour afficher du contenu dans un cadre.\nsid"
},
{
"path": "docs/src/content/docs/fr/components/code.mdx",
"chars": 3145,
"preview": "---\ntitle: Code\ndescription: Apprenez à afficher du code avec coloration syntaxique dans Starlight sans blocs de code Ma"
},
{
"path": "docs/src/content/docs/fr/components/file-tree.mdx",
"chars": 4625,
"preview": "---\ntitle: Arborescence de fichiers\ndescription: Apprenez à afficher la structure d'un répertoire avec des icônes de fic"
},
{
"path": "docs/src/content/docs/fr/components/icons.mdx",
"chars": 3361,
"preview": "---\ntitle: Icônes\ndescription: Apprenez à afficher des icônes avec Starlight.\n---\n\nimport { Icon } from '@astrojs/starli"
},
{
"path": "docs/src/content/docs/fr/components/link-buttons.mdx",
"chars": 4102,
"preview": "---\ntitle: Boutons de liaison\ndescription: Apprenez à créer des boutons de liaison dans Starlight pour des liens visuell"
},
{
"path": "docs/src/content/docs/fr/components/link-cards.mdx",
"chars": 3114,
"preview": "---\ntitle: Cartes de liaison\ndescription: Apprenez à afficher des liens de manière proéminente sous forme de cartes dans"
},
{
"path": "docs/src/content/docs/fr/components/steps.mdx",
"chars": 2371,
"preview": "---\ntitle: Étapes\ndescription: Apprenez à mettre en forme des listes numérotées de tâches pour créer des guides étape pa"
},
{
"path": "docs/src/content/docs/fr/components/tabs.mdx",
"chars": 5565,
"preview": "---\ntitle: Onglets\ndescription: Apprenez à créer des interfaces à onglets dans Starlight pour regrouper des informations"
},
{
"path": "docs/src/content/docs/fr/components/using-components.mdx",
"chars": 4433,
"preview": "---\ntitle: Utilisation des composants\ndescription: Utilisation des composants avec MDX et Markdoc avec Starlight.\nsideba"
},
{
"path": "docs/src/content/docs/fr/environmental-impact.md",
"chars": 9337,
"preview": "---\ntitle: Documentations écologiques\ndescription: Découvrez comment Starlight peut vous aider à créer des documentation"
},
{
"path": "docs/src/content/docs/fr/getting-started.mdx",
"chars": 5105,
"preview": "---\ntitle: Mise en route\ndescription: Apprenez à créer votre prochain site de documentation avec Starlight by Astro.\n---"
},
{
"path": "docs/src/content/docs/fr/guides/authoring-content.mdx",
"chars": 22335,
"preview": "---\ntitle: Création de contenu en Markdown\ndescription: Un aperçu de la syntaxe Markdown prise en charge par Starlight.\n"
},
{
"path": "docs/src/content/docs/fr/guides/css-and-tailwind.mdx",
"chars": 13428,
"preview": "---\ntitle: CSS et mise en forme\ndescription: Apprendre à mettre en forme votre site Starlight avec du CSS personnalisé o"
},
{
"path": "docs/src/content/docs/fr/guides/customization.mdx",
"chars": 15239,
"preview": "---\ntitle: Personnaliser Starlight\ndescription: Apprenez à vous approprier votre site Starlight avec votre logo, polices"
},
{
"path": "docs/src/content/docs/fr/guides/i18n.mdx",
"chars": 16482,
"preview": "---\ntitle: Internationalisation (i18n)\ndescription: Apprenez à configurer votre site Starlight pour qu'il prenne en char"
},
{
"path": "docs/src/content/docs/fr/guides/overriding-components.mdx",
"chars": 6704,
"preview": "---\ntitle: Redéfinition de composants\ndescription: Apprenez à redéfinir les composants intégrés à Starlight pour ajouter"
},
{
"path": "docs/src/content/docs/fr/guides/pages.mdx",
"chars": 8851,
"preview": "---\ntitle: Pages\ndescription: Apprenez à créer et à gérer les pages de votre site de documentation avec Starlight.\nsideb"
},
{
"path": "docs/src/content/docs/fr/guides/project-structure.mdx",
"chars": 1768,
"preview": "---\ntitle: Structure du projet\ndescription: Apprenez à organiser les fichiers dans votre projet Starlight.\n---\n\nCe guide"
},
{
"path": "docs/src/content/docs/fr/guides/route-data.mdx",
"chars": 6202,
"preview": "---\ntitle: Données de route\ndescription: Apprenez comment le modèle de données de page de Starlight est utilisé pour aff"
},
{
"path": "docs/src/content/docs/fr/guides/sidebar.mdx",
"chars": 18598,
"preview": "---\ntitle: Barre latérale de navigation\ndescription: Apprendre à configurer et personnaliser les liens de la barre latér"
},
{
"path": "docs/src/content/docs/fr/guides/site-search.mdx",
"chars": 9203,
"preview": "---\ntitle: Recherche\ndescription: Découvrez les fonctionnalités de recherche intégrées à Starlight et comment les person"
},
{
"path": "docs/src/content/docs/fr/index.mdx",
"chars": 6717,
"preview": "---\ntitle: Starlight 🌟 Construire des sites de documentation avec Astro\nhead:\n - tag: title\n content: Starlight 🌟 Co"
},
{
"path": "docs/src/content/docs/fr/manual-setup.mdx",
"chars": 5280,
"preview": "---\ntitle: Installation manuelle\ndescription: Apprendre à configurer Starlight manuellement pour l'ajouter à un projet A"
},
{
"path": "docs/src/content/docs/fr/reference/configuration.mdx",
"chars": 28205,
"preview": "---\ntitle: Référence de configuration\ndescription: Une vue d'ensemble de toutes les options de configuration prises en c"
},
{
"path": "docs/src/content/docs/fr/reference/frontmatter.md",
"chars": 13877,
"preview": "---\ntitle: Référence du frontmatter\ndescription: Une vue d'ensemble des champs du frontmatter par défaut pris en charge "
},
{
"path": "docs/src/content/docs/fr/reference/icons.mdx",
"chars": 1182,
"preview": "---\ntitle: Référence des icônes\ndescription: Une vue d'ensemble de tous les icônes disponibles dans Starlight.\n---\n\nStar"
},
{
"path": "docs/src/content/docs/fr/reference/overrides.md",
"chars": 13184,
"preview": "---\ntitle: Référence des redéfinitions\ndescription: Une vue d'ensemble de tous les composants et les props des composant"
},
{
"path": "docs/src/content/docs/fr/reference/plugins.md",
"chars": 14509,
"preview": "---\ntitle: Référence des modules d'extension\ndescription: Une vue d'ensemble de l'API des modules d'extension Starlight."
},
{
"path": "docs/src/content/docs/fr/reference/route-data.mdx",
"chars": 6330,
"preview": "---\ntitle: Référence des données de route\ndescription: La documentation de référence complète pour l'objet de données de"
}
]
// ... and 674 more files (download for full content)
About this extraction
This page contains the full source code of the withastro/starlight GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 874 files (3.8 MB), approximately 1.0M tokens, and a symbol index with 419 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.