[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6D1XGC0XPDJWEK8AS4RZBYK":3,"skill-same:01M6D1XGC0XPDJWEK8AS4RZBYK":67},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":49,"ownerHtmlUrl":50,"ownerBlogUrl":49,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M6D1XGC0XPDJWEK8AS4RZBYK","docs-sites",null,"Documentation sites: choosing a generator (Starlight, Docusaurus, VitePress, MkDocs Material, mdBook, Mintlify), information architecture and navigation, search, versioning, code blocks with tabs and copy buttons, docs as code with previews, link checking and prose linting, internationalisation, and feedback. Read before creating or reorganising a documentation site.","enowdev\u002Fenowxcli","enowdev","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F179420349?v=4","01M6D1MVX2KC0X3Z9NESE7P22K","Enow Dev.","01M6D1MW1FMZGBDKWAJY4GQX81",67,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fenowdev\u002Fenowxcli\u002Fblob\u002Fmain\u002Fcrates\u002Fenowx-core\u002Fskills\u002Fdocs-sites\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"docs","docs sites","architecture","documentation","code","search","docusaurus","site","feedback","versioning","read","navigation","mkdocs","mintlify","prose","2026-11-10 10:12:30",false,"---\nname: docs-sites\ndescription: \"Documentation sites: choosing a generator (Starlight, Docusaurus, VitePress, MkDocs Material, mdBook, Mintlify), information architecture and navigation, search, versioning, code blocks with tabs and copy buttons, docs as code with previews, link checking and prose linting, internationalisation, and feedback. Read before creating or reorganising a documentation site.\"\n---\n\n# Documentation sites\n\nThe generated docs site is the starter template with its example pages\nstill in the sidebar, navigation that mirrors the folder tree five levels\ndeep, search that finds nothing, every page versioned from day one, code\nblocks with no language or copy button, a callout on every paragraph,\nlinks broken by the last rename, and a \"Was this helpful?\" widget nobody\nreads. This skill: choosing the generator, organising by what readers do,\nsearch, versioning, code blocks, docs as code with checks in CI,\ntranslation and feedback. The page layout is in `ui-page-docs`; what goes\non each page is in `docs` and its family.\n\n## 1. Choose the generator\n\n| Generator | Built on | Choose it when |\n|---|---|---|\n| Starlight | Astro | The default for a new static docs site in any stack: Pagefind search, i18n, code blocks with titles and copy buttons, tabs, asides, steps and file trees built in |\n| Docusaurus | React | A React team, versioned docs, a blog beside the docs; versioning and i18n built in, MDX |\n| VitePress | Vue and Vite | A Vue or Vite project; small and fast, local search built in, the build fails on dead links |\n| Material for MkDocs | Python | A Python project, with API reference from docstrings through mkdocstrings; versions with mike |\n| Sphinx | Python | A large existing reStructuredText project, cross-referenced API docs, Read the Docs; MyST for Markdown |\n| mdBook | Rust | A book-shaped guide for a Rust project; `mdbook test` runs its Rust examples; API reference stays on docs.rs |\n| Fumadocs or Nextra | Next.js | Docs inside an existing Next.js application |\n| Mintlify, ReadMe, GitBook | Hosted | An API playground from OpenAPI, editors who are not engineers, no build to run; weigh the cost and the lock-in |\n\n- The project's own stack wins: a React team keeps a Docusaurus site\n  alive, and an unfamiliar generator gets abandoned.\n- Material for MkDocs has been in maintenance mode since late 2025 while\n  its team builds Zensical, which reads the same `mkdocs.yml`. Existing\n  sites keep working; for a new one, check the state of both first.\n- Never build a docs site from scratch: search, navigation, anchors and\n  code blocks are solved problems.\n\n```sh\nnpm create astro@latest -- --template starlight   # Starlight\nnpx create-docusaurus@latest docs classic          # Docusaurus\nnpx vitepress init                                 # VitePress\nmdbook init docs                                   # mdBook\n```\n\nThen remove every example page, logo and link the template ships with.\n\n## 2. Information architecture\n\n- Top-level sections by what the reader is doing, named in their words:\n  **Get started** (tutorials), **Guides** (how-to), **Concepts**\n  (explanation), **Reference** (API, CLI, configuration), plus the\n  changelog and troubleshooting.\n- The landing page routes by task, with 3 to 6 entry points: \"Install\",\n  \"Build your first ...\", \"API reference\", \"Upgrade from v1\". Not a\n  marketing hero.\n- A sidebar two or three levels deep, 5 to 9 items per group, in the order\n  of use (reference may go alphabetically or by resource). Labels of 2 to\n  4 words that match each page's title.\n- Every page reachable from the navigation, or unlisted on purpose; no\n  orphans.\n- URLs lowercase, kebab-case, short and stable (`\u002Fguides\u002Frotate-api-key`),\n  with no dates, and no version unless the docs are versioned. A moved\n  page gets a redirect: `redirects` in Astro's config for Starlight,\n  `@docusaurus\u002Fplugin-client-redirects`, the `mkdocs-redirects` plugin, or\n  the host's `_redirects` (Netlify, Cloudflare Pages) or `vercel.json`.\n- Previous and next links in tutorials, an \"on this page\" list on long\n  pages, breadcrumbs past two levels.\n\n## 3. Search\n\n- Static search, built in or added: Pagefind (Starlight's, or any static\n  build with `npx pagefind --site dist`), VitePress's local search, the\n  search in Material for MkDocs and in mdBook.\n- Hosted: Algolia DocSearch (free for many open-source projects, on\n  application), Typesense DocSearch run yourself, or the platform's own.\n- Results depend on the content: titles and headings in the words readers\n  type, one topic per page, generated noise kept out (once any page marks\n  an element `data-pagefind-body`, Pagefind indexes only such elements;\n  it always skips `data-pagefind-ignore`).\n- Try the ten to twenty questions readers ask most (from support and from\n  search logs): the right page comes first. Queries with no results are\n  the best list of pages to write next.\n\n## 4. Versioning\n\n- Version the docs only when many users stay on older versions for long:\n  self-hosted products, libraries with long-term support branches.\n  Otherwise keep one current version, a changelog, upgrade guides, and\n  \"Added in 2.3\" notes on features.\n- When versioned: the latest at unversioned URLs, older ones under\n  `\u002Fv2\u002F`; a banner on old versions linking to the same page in the latest;\n  canonical URLs pointing at the latest; only maintained versions built.\n- Tools: Docusaurus (`npm run docusaurus docs:version 2.0`), mike for\n  MkDocs (`mike deploy --push --update-aliases 2.0 latest`), Read the Docs\n  builds per tag or branch, the `starlight-versions` plugin.\n\n## 5. Code blocks and components\n\n- Every block has a language; file contents get a title (the path); the\n  lines that matter are highlighted; changes show as a diff; the copy\n  button copies the command only, with no prompt and no output.\n- Tabs per package manager or language, with the choice kept across the\n  page and the site: Starlight `\u003CTabs syncKey=\"pm\">`, Docusaurus\n  `\u003CTabs groupId=\"pm\">`, VitePress `::: code-group`, Material content tabs\n  (`=== \"npm\"`) with the `content.tabs.link` feature.\n\n| Generator | Title and highlighted lines |\n|---|---|\n| Starlight | ` ```js title=\"astro.config.mjs\" {2-3} ins={4} del={5} ` |\n| Docusaurus | ` ```js title=\"docusaurus.config.js\" {2-3} `, or `\u002F\u002F highlight-next-line` |\n| VitePress | ` ```ts{2,4-5} `, or `\u002F\u002F [!code ++]`, `\u002F\u002F [!code --]`, `\u002F\u002F [!code focus]` |\n| Material for MkDocs | ` ```py title=\"app.py\" hl_lines=\"2 3\" ` |\n\n- Code comes from files that CI builds and tests, included rather than\n  pasted:\n  - VitePress: `\u003C\u003C\u003C @\u002Fsnippets\u002Fcreate-order.ts#usage`, for a\n    `#region usage` in the file;\n  - Material for MkDocs: `--8\u003C-- \"examples\u002Fcreate_order.py\"` inside the\n    block, with the `pymdownx.snippets` extension;\n  - Starlight: `import source from \"..\u002F..\u002Fexamples\u002Forder.ts?raw\";` in MDX,\n    shown with Starlight's `\u003CCode code={source} lang=\"ts\" \u002F>`;\n  - Docusaurus: the file through `raw-loader` into `\u003CCodeBlock>`;\n  - mdBook: `{{#include ..\u002Fexamples\u002Forder.rs:usage}}`, between\n    `\u002F\u002F ANCHOR: usage` and `\u002F\u002F ANCHOR_END: usage` lines.\n- Callouts (note, tip, caution, danger) sparingly: one or two on a page at\n  most, caution and danger only for data loss, security or cost. Syntax:\n  `:::note` in Starlight and Docusaurus, `::: tip` in VitePress, `!!! note`\n  in Material, `> [!NOTE]` on GitHub.\n- Cards and grids on the landing page only; a steps component for\n  tutorials.\n\n## 6. Docs as code\n\n- Markdown or MDX in the repository (`docs\u002F` or `apps\u002Fdocs\u002F`), reviewed in\n  pull requests like code, with a CODEOWNERS entry.\n- A preview deploy per pull request (Netlify, Vercel, Cloudflare Pages,\n  Read the Docs pull request builds), linked in the pull request.\n- On every pull request, CI:\n  - builds strictly: Docusaurus throws on broken links by default\n    (`onBrokenLinks`), VitePress fails on dead links,\n    `mkdocs build --strict`, `sphinx-build -W --keep-going`, Starlight\n    with the `starlight-links-validator` plugin;\n  - checks links with lychee (`lychee --no-progress 'docs\u002F**\u002F*.md'`, or\n    on the built site). External links fail for reasons outside your\n    control: check them on a schedule, weekly, with `--cache`, a GitHub\n    token against rate limits, and exclusions in `.lycheeignore`;\n  - lints prose with Vale, with a style (Google, Microsoft or your own)\n    and a vocabulary of project terms: warnings first, errors once the\n    backlog is clean;\n  - checks spelling with cspell (with a project word list) or typos (fast,\n    few false positives), and Markdown with markdownlint-cli2;\n  - runs the doctests and builds the included examples.\n\n```ini\n# .vale.ini\nStylesPath = .github\u002Fvale\nMinAlertLevel = warning\nPackages = Google\nVocab = Project\n\n[*.{md,mdx}]\nBasedOnStyles = Vale, Google\n```\n\nProject terms go in `.github\u002Fvale\u002Fconfig\u002Fvocabularies\u002FProject\u002Faccept.txt`,\none per line; `vale sync` downloads the packages, and `vale docs` runs it.\n\n## 7. Translation\n\n- Translate once the source docs are stable and there are readers who\n  need it. A half-translated site with stale pages serves them worse than\n  one good language.\n- The source language is canonical. Translations follow it with a tracked\n  lag, and a page says when its translation is out of date or falls back\n  to the source (Starlight shows the fallback with a notice).\n- Built in: Starlight, Docusaurus (`npm run write-translations` for the\n  interface strings), VitePress locales; the `mkdocs-static-i18n` plugin\n  for MkDocs. Platforms: Crowdin, Lokalise, Weblate. A machine draft is\n  reviewed by someone fluent before it ships.\n- Never translate code, identifiers, flags, config keys or field names,\n  and keep the terms the audience keeps in English (`i18n`).\n- The language switcher keeps the reader on the same page; `hreflang`\n  links connect the versions.\n\n## 8. Feedback, analytics and machine readers\n\n- Analytics only if someone acts on them, and privacy-respecting\n  (Plausible, Umami, or the host's): the top pages, searches with no\n  results, 404s, where readers leave a tutorial.\n- An \"Edit this page\" link (`editLink` in Starlight, `editUrl` in\n  Docusaurus) and a \"Report a problem\" link to the issues; a \"Was this\n  helpful?\" widget only if someone reads the answers every week.\n- A 404 page with search and the main entry points.\n- A unique title and description per page, a sitemap, canonical URLs, a\n  social preview image.\n- Agents read docs too: many sites publish `\u002Fllms.txt` (an index of the\n  pages) and Markdown copies of pages, and community plugins generate them\n  for Starlight, Docusaurus and VitePress. Generate them from the same\n  source, never as a second copy kept by hand.\n\n## 9. Speed and accessibility\n\n- Static output, with JavaScript only for search, tabs and the theme\n  switch: every content page reads with JavaScript off; only search needs\n  it.\n- The layout, the widths and the sticky parts are in `ui-page-docs`. Light\n  and dark themes, with code colours readable in both; a skip link;\n  visible focus; search that opens with `\u002F` or `Ctrl+K` and works from the\n  keyboard; headings in order; alt text; AA contrast.\n\n## Check it\n\n- The site builds strictly with no warnings, and the link checker is clean\n  for internal links.\n- With `preview` when you have it, on the landing page, a guide and a\n  reference page at 360, 768 and 1440px: nothing wider than the screen,\n  long code scrolling inside its block, the sidebar turning into a menu on\n  a phone, contrast passing, every control named.\n- The ten questions readers ask most each find the right page first.\n- No template leftovers: example pages, the generator's logo, a demo\n  blog, placeholder social links.\n- Every moved URL redirects.\n\n## Avoid\n\nThe template's example pages left in; navigation that mirrors folders\nfive levels deep; versioning nobody needs; code blocks with no language,\nor copy buttons that copy the prompt; callouts on every section; pasted\ncode that CI never runs; external link checks that fail every pull\nrequest; half-translated sites; a feedback widget nobody reads; a docs\nsite built from scratch.\n","# Documentation sites\n\nThe generated docs site is the starter template with its example pages\nstill in the sidebar, navigation that mirrors the folder tree five levels\ndeep, search that finds nothing, every page versioned from day one, code\nblocks with no language or copy button, a callout on every paragraph,\nlinks broken by the last rename, and a \"Was this helpful?\" widget nobody\nreads. This skill: choosing the generator, organising by what readers do,\nsearch, versioning, code blocks, docs as code with checks in CI,\ntranslation and feedback. The page layout is in `ui-page-docs`; what goes\non each page is in `docs` and its family.\n\n## 1. Choose the generator\n\n| Generator | Built on | Choose it when |\n|---|---|---|\n| Starlight | Astro | The default for a new static docs site in any stack: Pagefind search, i18n, code blocks with titles and copy buttons, tabs, asides, steps and file trees built in |\n| Docusaurus | React | A React team, versioned docs, a blog beside the docs; versioning and i18n built in, MDX |\n| VitePress | Vue and Vite | A Vue or Vite project; small and fast, local search built in, the build fails on dead links |\n| Material for MkDocs | Python | A Python project, with API reference from docstrings through mkdocstrings; versions with mike |\n| Sphinx | Python | A large existing reStructuredText project, cross-referenced API docs, Read the Docs; MyST for Markdown |\n| mdBook | Rust | A book-shaped guide for a Rust project; `mdbook test` runs its Rust examples; API reference stays on docs.rs |\n| Fumadocs or Nextra | Next.js | Docs inside an existing Next.js application |\n| Mintlify, ReadMe, GitBook | Hosted | An API playground from OpenAPI, editors who are not engineers, no build to run; weigh the cost and the lock-in |\n\n- The project's own stack wins: a React team keeps a Docusaurus site\n  alive, and an unfamiliar generator gets abandoned.\n- Material for MkDocs has been in maintenance mode since late 2025 while\n  its team builds Zensical, which reads the same `mkdocs.yml`. Existing\n  sites keep working; for a new one, check the state of both first.\n- Never build a docs site from scratch: search, navigation, anchors and\n  code blocks are solved problems.\n\n```sh\nnpm create astro@latest -- --template starlight   # Starlight\nnpx create-docusaurus@latest docs classic          # Docusaurus\nnpx vitepress init                                 # VitePress\nmdbook init docs                                   # mdBook\n```\n\nThen remove every example page, logo and link the template ships with.\n\n## 2. Information architecture\n\n- Top-level sections by what the reader is doing, named in their words:\n  **Get started** (tutorials), **Guides** (how-to), **Concepts**\n  (explanation), **Reference** (API, CLI, configuration), plus the\n  changelog and troubleshooting.\n- The landing page routes by task, with 3 to 6 entry points: \"Install\",\n  \"Build your first ...\", \"API reference\", \"Upgrade from v1\". Not a\n  marketing hero.\n- A sidebar two or three levels deep, 5 to 9 items per group, in the order\n  of use (reference may go alphabetically or by resource). Labels of 2 to\n  4 words that match each page's title.\n- Every page reachable from the navigation, or unlisted on purpose; no\n  orphans.\n- URLs lowercase, kebab-case, short and stable (`\u002Fguides\u002Frotate-api-key`),\n  with no dates, and no version unless the docs are versioned. A moved\n  page gets a redirect: `redirects` in Astro's config for Starlight,\n  `@docusaurus\u002Fplugin-client-redirects`, the `mkdocs-redirects` plugin, or\n  the host's `_redirects` (Netlify, Cloudflare Pages) or `vercel.json`.\n- Previous and next links in tutorials, an \"on this page\" list on long\n  pages, breadcrumbs past two levels.\n\n## 3. Search\n\n- Static search, built in or added: Pagefind (Starlight's, or any static\n  build with `npx pagefind --site dist`), VitePress's local search, the\n  search in Material for MkDocs and in mdBook.\n- Hosted: Algolia DocSearch (free for many open-source projects, on\n  application), Typesense DocSearch run yourself, or the platform's own.\n- Results depend on the content: titles and headings in the words readers\n  type, one topic per page, generated noise kept out (once any page marks\n  an element `data-pagefind-body`, Pagefind indexes only such elements;\n  it always skips `data-pagefind-ignore`).\n- Try the ten to twenty questions readers ask most (from support and from\n  search logs): the right page comes first. Queries with no results are\n  the best list of pages to write next.\n\n## 4. Versioning\n\n- Version the docs only when many users stay on older versions for long:\n  self-hosted products, libraries with long-term support branches.\n  Otherwise keep one current version, a changelog, upgrade guides, and\n  \"Added in 2.3\" notes on features.\n- When versioned: the latest at unversioned URLs, older ones under\n  `\u002Fv2\u002F`; a banner on old versions linking to the same page in the latest;\n  canonical URLs pointing at the latest; only maintained versions built.\n- Tools: Docusaurus (`npm run docusaurus docs:version 2.0`), mike for\n  MkDocs (`mike deploy --push --update-aliases 2.0 latest`), Read the Docs\n  builds per tag or branch, the `starlight-versions` plugin.\n\n## 5. Code blocks and components\n\n- Every block has a language; file contents get a title (the path); the\n  lines that matter are highlighted; changes show as a diff; the copy\n  button copies the command only, with no prompt and no output.\n- Tabs per package manager or language, with the choice kept across the\n  page and the site: Starlight `\u003CTabs syncKey=\"pm\">`, Docusaurus\n  `\u003CTabs groupId=\"pm\">`, VitePress `::: code-group`, Material content tabs\n  (`=== \"npm\"`) with the `content.tabs.link` feature.\n\n| Generator | Title and highlighted lines |\n|---|---|\n| Starlight | ` ```js title=\"astro.config.mjs\" {2-3} ins={4} del={5} ` |\n| Docusaurus | ` ```js title=\"docusaurus.config.js\" {2-3} `, or `\u002F\u002F highlight-next-line` |\n| VitePress | ` ```ts{2,4-5} `, or `\u002F\u002F [!code ++]`, `\u002F\u002F [!code --]`, `\u002F\u002F [!code focus]` |\n| Material for MkDocs | ` ```py title=\"app.py\" hl_lines=\"2 3\" ` |\n\n- Code comes from files that CI builds and tests, included rather than\n  pasted:\n  - VitePress: `\u003C\u003C\u003C @\u002Fsnippets\u002Fcreate-order.ts#usage`, for a\n    `#region usage` in the file;\n  - Material for MkDocs: `--8\u003C-- \"examples\u002Fcreate_order.py\"` inside the\n    block, with the `pymdownx.snippets` extension;\n  - Starlight: `import source from \"..\u002F..\u002Fexamples\u002Forder.ts?raw\";` in MDX,\n    shown with Starlight's `\u003CCode code={source} lang=\"ts\" \u002F>`;\n  - Docusaurus: the file through `raw-loader` into `\u003CCodeBlock>`;\n  - mdBook: `{{#include ..\u002Fexamples\u002Forder.rs:usage}}`, between\n    `\u002F\u002F ANCHOR: usage` and `\u002F\u002F ANCHOR_END: usage` lines.\n- Callouts (note, tip, caution, danger) sparingly: one or two on a page at\n  most, caution and danger only for data loss, security or cost. Syntax:\n  `:::note` in Starlight and Docusaurus, `::: tip` in VitePress, `!!! note`\n  in Material, `> [!NOTE]` on GitHub.\n- Cards and grids on the landing page only; a steps component for\n  tutorials.\n\n## 6. Docs as code\n\n- Markdown or MDX in the repository (`docs\u002F` or `apps\u002Fdocs\u002F`), reviewed in\n  pull requests like code, with a CODEOWNERS entry.\n- A preview deploy per pull request (Netlify, Vercel, Cloudflare Pages,\n  Read the Docs pull request builds), linked in the pull request.\n- On every pull request, CI:\n  - builds strictly: Docusaurus throws on broken links by default\n    (`onBrokenLinks`), VitePress fails on dead links,\n    `mkdocs build --strict`, `sphinx-build -W --keep-going`, Starlight\n    with the `starlight-links-validator` plugin;\n  - checks links with lychee (`lychee --no-progress 'docs\u002F**\u002F*.md'`, or\n    on the built site). External links fail for reasons outside your\n    control: check them on a schedule, weekly, with `--cache`, a GitHub\n    token against rate limits, and exclusions in `.lycheeignore`;\n  - lints prose with Vale, with a style (Google, Microsoft or your own)\n    and a vocabulary of project terms: warnings first, errors once the\n    backlog is clean;\n  - checks spelling with cspell (with a project word list) or typos (fast,\n    few false positives), and Markdown with markdownlint-cli2;\n  - runs the doctests and builds the included examples.\n\n```ini\n# .vale.ini\nStylesPath = .github\u002Fvale\nMinAlertLevel = warning\nPackages = Google\nVocab = Project\n\n[*.{md,mdx}]\nBasedOnStyles = Vale, Google\n```\n\nProject terms go in `.github\u002Fvale\u002Fconfig\u002Fvocabularies\u002FProject\u002Faccept.txt`,\none per line; `vale sync` downloads the packages, and `vale docs` runs it.\n\n## 7. Translation\n\n- Translate once the source docs are stable and there are readers who\n  need it. A half-translated site with stale pages serves them worse than\n  one good language.\n- The source language is canonical. Translations follow it with a tracked\n  lag, and a page says when its translation is out of date or falls back\n  to the source (Starlight shows the fallback with a notice).\n- Built in: Starlight, Docusaurus (`npm run write-translations` for the\n  interface strings), VitePress locales; the `mkdocs-static-i18n` plugin\n  for MkDocs. Platforms: Crowdin, Lokalise, Weblate. A machine draft is\n  reviewed by someone fluent before it ships.\n- Never translate code, identifiers, flags, config keys or field names,\n  and keep the terms the audience keeps in English (`i18n`).\n- The language switcher keeps the reader on the same page; `hreflang`\n  links connect the versions.\n\n## 8. Feedback, analytics and machine readers\n\n- Analytics only if someone acts on them, and privacy-respecting\n  (Plausible, Umami, or the host's): the top pages, searches with no\n  results, 404s, where readers leave a tutorial.\n- An \"Edit this page\" link (`editLink` in Starlight, `editUrl` in\n  Docusaurus) and a \"Report a problem\" link to the issues; a \"Was this\n  helpful?\" widget only if someone reads the answers every week.\n- A 404 page with search and the main entry points.\n- A unique title and description per page, a sitemap, canonical URLs, a\n  social preview image.\n- Agents read docs too: many sites publish `\u002Fllms.txt` (an index of the\n  pages) and Markdown copies of pages, and community plugins generate them\n  for Starlight, Docusaurus and VitePress. Generate them from the same\n  source, never as a second copy kept by hand.\n\n## 9. Speed and accessibility\n\n- Static output, with JavaScript only for search, tabs and the theme\n  switch: every content page reads with JavaScript off; only search needs\n  it.\n- The layout, the widths and the sticky parts are in `ui-page-docs`. Light\n  and dark themes, with code colours readable in both; a skip link;\n  visible focus; search that opens with `\u002F` or `Ctrl+K` and works from the\n  keyboard; headings in order; alt text; AA contrast.\n\n## Check it\n\n- The site builds strictly with no warnings, and the link checker is clean\n  for internal links.\n- With `preview` when you have it, on the landing page, a guide and a\n  reference page at 360, 768 and 1440px: nothing wider than the screen,\n  long code scrolling inside its block, the sidebar turning into a menu on\n  a phone, contrast passing, every control named.\n- The ten questions readers ask most each find the right page first.\n- No template leftovers: example pages, the generator's logo, a demo\n  blog, placeholder social links.\n- Every moved URL redirects.\n\n## Avoid\n\nThe template's example pages left in; navigation that mirrors folders\nfive levels deep; versioning nobody needs; code blocks with no language,\nor copy buttons that copy the prompt; callouts on every section; pasted\ncode that CI never runs; external link checks that fail every pull\nrequest; half-translated sites; a feedback widget nobody reads; a docs\nsite built from scratch.\n",{"name":5,"description":7},"main","38293fe1b096e6bf3646c7344c38786ed688f464","crates\u002Fenowx-core\u002Fskills\u002Fdocs-sites",21,"https:\u002F\u002Fgithub.com\u002Fenowdev\u002Fenowxcli","https:\u002F\u002Fenowx.ai","https:\u002F\u002Fgithub.com\u002Fenowdev","Pretending to be a Developer","2026-10-06 02:05:35",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add enowdev\u002Fenowxcli --skill docs-sites",{"tool":59,"command":60},"bunx","bunx skills add enowdev\u002Fenowxcli --skill docs-sites",{"tool":62,"command":63},"pnpm","pnpm dlx skills add enowdev\u002Fenowxcli --skill docs-sites","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fenowdev\u002Fenowxcli\u002Fblob\u002Fmain\u002Fcrates\u002Fenowx-core\u002Fskills\u002Fdocs-sites\u002FSKILL.md",true,[],[68,84,106,122,146,168],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":79,"publishedAt":39},"01M6D2HQYSQD9N7MTNDT4A7CBM","demo-skill","Project-scope demo skill for tests.","https:\u002F\u002Fgithub.com\u002Fenowdev\u002Fenowxcli\u002Fblob\u002Fmain\u002Fworkspace\u002F.agents\u002Fskills\u002Fdemo-skill\u002FSKILL.md",[74],{"categoryNo":75,"categoryName":76,"taxonomyType":77,"taxonomyTypeDesc":78},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[80,81,82,83,34],"demo skill","demo","tests","project",{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":96,"publishedAt":39},"01M6D2HM0GCPM0TM2HPG9HHR2R","writing","Writing words people read: the specific thing instead of claims, words to drop, sentences, interface copy (buttons, labels, errors, empty states, confirmations), page copy, notifications and emails, alt text and link text, numbers and dates, words that translate well, documentation and voice. Read before writing a page's copy, an interface's text or a document.","https:\u002F\u002Fgithub.com\u002Fenowdev\u002Fenowxcli\u002Fblob\u002Fmain\u002Fcrates\u002Fenowx-core\u002Fskills\u002Fwriting\u002FSKILL.md",[90,93],{"categoryNo":91,"categoryName":92,"taxonomyType":77,"taxonomyTypeDesc":78},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":94,"categoryName":95,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000036","内容创作者",[86,97,98,99,100,101,34,102,103,104,27,105],"text","emails","empty","drop","document","page","voice","notifications","translate",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":115,"publishedAt":39},"01M6D2HG07YS49NM196Q0R3AZ8","ui","Designing or restyling an interface: direction, layout, type, colour, icons, components, states, responsive behaviour. Read before building a page, a screen or a set of components.","https:\u002F\u002Fgithub.com\u002Fenowdev\u002Fenowxcli\u002Fblob\u002Fmain\u002Fcrates\u002Fenowx-core\u002Fskills\u002Fui\u002FSKILL.md",[112],{"categoryNo":113,"categoryName":114,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000032","设计师",[108,116,117,118,119,102,120,34,121],"icons","components","SET","responsive","layout","before building",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":132,"publishedAt":39},"01M6D2HB59HZHWG1RYZDV4SJ91","ui-themes","Light and dark themes, and colour that holds in both: tokens with a value per theme, and what each kind of content needs to stay visible (icons, SVG drawings and line art, logos, photos, screenshots, charts, code, maps, borders, shadows, focus, form controls), switching without a flash, and checking both. Read before building a second theme or a theme toggle, and before any drawing, logo or chart on a page that has two themes.","https:\u002F\u002Fgithub.com\u002Fenowdev\u002Fenowxcli\u002Fblob\u002Fmain\u002Fcrates\u002Fenowx-core\u002Fskills\u002Fui-themes\u002FSKILL.md",[128,131],{"categoryNo":129,"categoryName":130,"taxonomyType":77,"taxonomyTypeDesc":78},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[108,133,134,135,136,137,138,139,140,34,121,141,102,28,142,143,116,144,145],"ui themes","switching","photos","tokens","drawing","focus","maps","Art","flash","Charts","content","screenshots","logo",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":155,"publishedAt":39},"01M6D2H5R5KRAE524C8QX0T7Q0","ui-structure","Structure before styling: the blueprint written before any interface code (the screen's job, the regions its kind of page needs, their order and why, the layout skeleton in numbers, the components and their states), the anatomy and order of a homepage, a dashboard, a list, a detail page, settings, a form, sign-in, pricing, docs, an article and a checkout, and how to turn the blueprint into code (tokens, layout primitives, components, sections, page). Read first, before building or rebuilding any page or screen.","https:\u002F\u002Fgithub.com\u002Fenowdev\u002Fenowxcli\u002Fblob\u002Fmain\u002Fcrates\u002Fenowx-core\u002Fskills\u002Fui-structure\u002FSKILL.md",[152,153,154],{"categoryNo":91,"categoryName":92,"taxonomyType":77,"taxonomyTypeDesc":78},{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":94,"categoryName":95,"taxonomyType":21,"taxonomyTypeDesc":22},[156,108,157,117,158,159,28,160,161,162,120,136,163,164,165,34,121,102,166,167],"structure","ui structure","pricing","dashboard","Blueprint","article","anatomy","styling","primitives","list","why","how",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":181,"publishedAt":39},"01M6D2H0ZZBJG77MBGPZHA6MWD","ui-stack-vue","Building interfaces in Vue 3 and Nuxt: project layout, script setup with typed defineProps, defineEmits and defineModel, attribute fallthrough, slots and scoped slots, template refs, ref, reactive and computed, watch versus watchEffect, composables and VueUse, provide and inject, Pinia, keyed v-for, transitions, Nuxt 4 (app directory, pages, layouts, useFetch and useAsyncData keys, $fetch in handlers, server routes, runtime config, useSeoMeta, NuxtImg, middleware), VeeValidate forms, Reka UI and Nuxt UI, testing, vue-tsc, and the traps. Read when the project uses Vue or Nuxt.","https:\u002F\u002Fgithub.com\u002Fenowdev\u002Fenowxcli\u002Fblob\u002Fmain\u002Fcrates\u002Fenowx-core\u002Fskills\u002Fui-stack-vue\u002FSKILL.md",[174,177,180],{"categoryNo":175,"categoryName":176,"taxonomyType":77,"taxonomyTypeDesc":78},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":178,"categoryName":179,"taxonomyType":77,"taxonomyTypeDesc":78},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":113,"categoryName":114,"taxonomyType":21,"taxonomyTypeDesc":22},[108,182,183,184,185,186,187,188,120,83,189,190,34,191,192,193,194,195,196,197],"vue","stack","ui stack vue","forms","pages","watch","runtime","transitions","fetch","pinia","nuxt","template","server","config","directory","testing"]