Eleventy Plugin Baseline Navigator

A magic carpet ride

 Go back

Navigator

Page Context
{ '/navigator-core.html':
   { site:
      { title: 'Eleventy Plugin Baseline',
        tagline: 'A magic carpet ride',
        url: 'https://eleventy-plugin-baseline.netlify.app',
        noindex: false },
     page:
      { inputPath: './src/navigator-core.html',
        fileSlug: 'navigator-core',
        filePathStem: '/navigator-core',
        outputFileExtension: 'html',
        templateSyntax: 'njk',
        date: 2026-04-28T07:59:33.141Z,
        url: '/navigator-core.html',
        outputPath: './dist/navigator-core.html',
        lang: 'en',
        locale: { translationKey: undefined, lang: 'en', isDefaultLang: true },
        sitemap: { ignore: false, changefreq: '', priority: -1 } },
     entry:
      { title: 'Navigator Core', description: 'Eleventy + Baseline internals', head: null },
     query: { isHome: false },
     meta:
      { title: 'Navigator Core | Eleventy Plugin Baseline',
        description: 'Eleventy + Baseline internals',
        canonical: 'https://eleventy-plugin-baseline.netlify.app/navigator-core.html',
        robots: 'index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1',
        noindex: false },
     render: { generator: 'Eleventy v3.1.5' },
     head:
      { link: [ { rel: 'stylesheet', href: '/assets/css/index.css' } ],
        script:
         [ { src: '/assets/js/index.js', defer: true },
           { src: '/assets/js/vendor/index.js', defer: true } ],
        style: [],
        meta: [ { name: 'color-scheme', content: 'light dark' } ] } } }
env
Environment {
  _events: [Object: null prototype] {},
  _eventsCount: 0,
  _maxListeners: undefined,
  opts:
   { dev: true,
     autoescape: true,
     throwOnUndefined: false,
     trimBlocks: false,
     lstripBlocks: false },
  loaders:
   [ FileSystemLoader {
       _events:
        [Object: null prototype] { update: [Function (anonymous)], load: [Function (anonymous)] },
       _eventsCount: 2,
       _maxListeners: undefined,
       pathsToNames: {},
       noCache: false,
       searchPaths: [ 'src/_includes/', '/opt/build/repo' ],
       cache: {},
       [Symbol(shapeMode)]: false,
       [Symbol(kCapture)]: false } ],
  globals:
   { range: [Function: range],
     cycler: [Function: cycler],
     joiner: [Function: joiner],
     date: { toUTCISO: [Function: toUTCISO] },
     _runtime: [Function: fn],
     _ctx: [Function: fn] },
  filters:
   { abs: [Function: abs],
     batch: [Function: batch],
     capitalize: [Function: capitalize],
     center: [Function: center],
     default: [Function: default_],
     dictsort: [Function: dictsort],
     dump: [Function: dump],
     escape: [Function: escape],
     safe: [Function: safe],
     first: [Function: first],
     forceescape: [Function: forceescape],
     groupby: [Function: groupby],
     indent: [Function: indent],
     join: [Function: join],
     last: [Function: last],
     length: [Function: lengthFilter],
     list: [Function: list],
     lower: [Function: lower],
     nl2br: [Function: nl2br],
     random: [Function: random],
     reject: [Function: filter],
     rejectattr: [Function: rejectattr],
     select: [Function: filter],
     selectattr: [Function: selectattr],
     replace: [Function: replace],
     reverse: [Function: reverse],
     round: [Function: round],
     slice: [Function: slice],
     sum: [Function: sum],
     sort: [Function: macro],
     string: [Function: string],
     striptags: [Function: striptags],
     title: [Function: title],
     trim: [Function: trim],
     truncate: [Function: truncate],
     upper: [Function: upper],
     urlencode: [Function: urlencode],
     urlize: [Function: urlize],
     wordcount: [Function: wordcount],
     float: [Function: float],
     int: [Function: macro],
     d: [Function: default_],
     e: [Function: escape],
     inputPathToUrl: [Function (anonymous)],
     slug: [Function (anonymous)],
     slugify: [Function (anonymous)],
     url: [Function (anonymous)],
     log: [Function (anonymous)],
     getCollectionItemIndex: [Function (anonymous)],
     getCollectionItem: [Function (anonymous)],
     getPreviousCollectionItem: [Function (anonymous)],
     getNextCollectionItem: [Function (anonymous)],
     addPathPrefixToFullUrl: [Function (anonymous)],
     htmlBaseUrl: [Function (anonymous)],
     locale_url: [Function (anonymous)],
     locale_links: [Function (anonymous)],
     locale_page: [Function (anonymous)],
     i18nTranslationsFor: [Function (anonymous)],
     i18nTranslationIn: [Function (anonymous)],
     i18nDefaultTranslation: [Function (anonymous)],
     _inspect: [Function (anonymous)],
     _json: [Function (anonymous)],
     _keys: [Function (anonymous)],
     markdownify: [Function (anonymous)],
     relatedPosts: [Function (anonymous)],
     isString: [Function (anonymous)],
     renderTransforms: [Function (anonymous)],
     transformWithHtmlBase: [Function (anonymous)],
     inlineESbuild: [Function (anonymous)],
     inlinePostCSS: [Function (anonymous)] },
  tests:
   { callable: [Function: callable],
     defined: [Function: defined],
     divisibleby: [Function: divisibleby],
     escaped: [Function: escaped],
     equalto: [Function: equalto],
     eq: [Function: equalto],
     sameas: [Function: equalto],
     even: [Function: even],
     falsy: [Function: falsy],
     ge: [Function: ge],
     greaterthan: [Function: greaterthan],
     gt: [Function: greaterthan],
     le: [Function: le],
     lessthan: [Function: lessthan],
     lt: [Function: lessthan],
     lower: [Function: lower],
     ne: [Function: ne],
     null: [Function: nullTest],
     number: [Function: number],
     odd: [Function: odd],
     string: [Function: string],
     truthy: [Function: truthy],
     undefined: [Function: undefinedTest],
     upper: [Function: upper],
     iterable: [Function: iterable],
     mapping: [Function: mapping] },
  asyncFilters:
   [ 'renderTransforms', 'transformWithHtmlBase', 'inlineESbuild', 'inlinePostCSS' ],
  extensions:
   { setAsync:
      PairedShortcodeFunction {
        tags: [ 'setAsync' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'setAsync' },
     getBundle:
      ShortcodeFunction {
        tags: [ 'getBundle' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'getBundle' },
     getBundleFileUrl:
      ShortcodeFunction {
        tags: [ 'getBundleFileUrl' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'getBundleFileUrl' },
     image:
      ShortcodeFunction {
        tags: [ 'image' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'image' },
     alertBlock:
      PairedShortcodeFunction {
        tags: [ 'alertBlock' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'alertBlock' },
     highlight:
      PairedShortcodeFunction {
        tags: [ 'highlight' ],
        parse: [Function (anonymous)],
        run: [Function (anonymous)],
        __name: 'highlight' } },
  extensionsList:
   [ PairedShortcodeFunction {
       tags: [ 'setAsync' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'setAsync' },
     ShortcodeFunction {
       tags: [ 'getBundle' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'getBundle' },
     ShortcodeFunction {
       tags: [ 'getBundleFileUrl' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'getBundleFileUrl' },
     ShortcodeFunction {
       tags: [ 'image' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'image' },
     PairedShortcodeFunction {
       tags: [ 'alertBlock' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'alertBlock' },
     PairedShortcodeFunction {
       tags: [ 'highlight' ],
       parse: [Function (anonymous)],
       run: [Function (anonymous)],
       __name: 'highlight' } ],
  [Symbol(shapeMode)]: false,
  [Symbol(kCapture)]: false }
ctx
{ helpers: { buildCommit: [Function: buildCommit] },
  settings:
   { title: 'Eleventy Plugin Baseline',
     tagline: 'A magic carpet ride',
     url: 'https://eleventy-plugin-baseline.netlify.app',
     noindex: false,
     defaultLanguage: 'en',
     languages:
      { en:
         { contentDir: 'content/en/',
           languageCode: 'en',
           languageName: 'English',
           title: 'Eleventy Plugin Baseline',
           tagline: 'A magic carpet ride' },
        nl:
         { contentDir: 'content/nl/',
           languageCode: 'nl',
           languageName: 'Nederlands',
           title: 'Eleventy Plugin Baseline',
           tagline: 'Een rit op een magisch tapijt' },
        fr:
         { contentDir: 'content/fr/',
           languageCode: 'fr',
           languageName: 'Français',
           title: 'Eleventy Plugin Baseline',
           tagline: 'Un tour en tapis volant' } },
     head:
      { link: [ { rel: 'stylesheet', href: '/assets/css/index.css' } ],
        script:
         [ { src: '/assets/js/index.js', defer: true },
           { src: '/assets/js/vendor/index.js', defer: true } ],
        meta: [ { name: 'color-scheme', content: 'light dark' } ] },
     seo: {} },
  _baseline:
   { env:
      { name: 'Eleventy Baseline',
        package: '@apleasantview/eleventy-plugin-baseline',
        version: '0.1.0-next.35',
        mode: 'production' },
     features:
      { verbose: true,
        multilang: true,
        sitemap: true,
        navigator: true,
        head: { titleSeparator: ' | ', showGenerator: true },
        assets: { esbuild: {} },
        hasImageTransformPlugin: false },
     paths:
      { input: './src/',
        output: './dist/',
        includes: './src/_includes/',
        data: './src/_data/',
        assets: './src/assets/',
        public: './src/static/' } },
  _assets: {},
  _head: {},
  _multilang: {},
  _navigator: {},
  _sitemap: {},
  _snapshot:
   { contentMap: null,
     pageContext:
      { '/navigator-core.html':
         { site:
            { title: 'Eleventy Plugin Baseline',
              tagline: 'A magic carpet ride',
              url: 'https://eleventy-plugin-baseline.netlify.app',
              noindex: false },
           page:
            { inputPath: './src/navigator-core.html',
              fileSlug: 'navigator-core',
              filePathStem: '/navigator-core',
              outputFileExtension: 'html',
              templateSyntax: 'njk',
              date: 2026-04-28T07:59:33.141Z,
              url: '/navigator-core.html',
              outputPath: './dist/navigator-core.html',
              lang: 'en',
              locale: [Object],
              sitemap: [Object] },
           entry:
            { title: 'Navigator Core', description: 'Eleventy + Baseline internals', head: null },
           query: { isHome: false },
           meta:
            { title: 'Navigator Core | Eleventy Plugin Baseline',
              description: 'Eleventy + Baseline internals',
              canonical: 'https://eleventy-plugin-baseline.netlify.app/navigator-core.html',
              robots: 'index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1',
              noindex: false },
           render: { generator: 'Eleventy v3.1.5' },
           head: { link: [Array], script: [Array], style: [], meta: [Array] } } } },
  _pageContext:
   { site:
      { title: 'Eleventy Plugin Baseline',
        tagline: 'A magic carpet ride',
        url: 'https://eleventy-plugin-baseline.netlify.app',
        noindex: false },
     page:
      { inputPath: './src/navigator-core.html',
        fileSlug: 'navigator-core',
        filePathStem: '/navigator-core',
        outputFileExtension: 'html',
        templateSyntax: 'njk',
        date: 2026-04-28T07:59:33.141Z,
        url: '/navigator-core.html',
        outputPath: './dist/navigator-core.html',
        lang: 'en',
        locale: { translationKey: undefined, lang: 'en', isDefaultLang: true },
        sitemap: { ignore: false, changefreq: '', priority: -1 } },
     entry:
      { title: 'Navigator Core', description: 'Eleventy + Baseline internals', head: null },
     query: { isHome: false },
     meta:
      { title: 'Navigator Core | Eleventy Plugin Baseline',
        description: 'Eleventy + Baseline internals',
        canonical: 'https://eleventy-plugin-baseline.netlify.app/navigator-core.html',
        robots: 'index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1',
        noindex: false },
     render: { generator: 'Eleventy v3.1.5' },
     head:
      { link: [ { rel: 'stylesheet', href: '/assets/css/index.css' } ],
        script:
         [ { src: '/assets/js/index.js', defer: true },
           { src: '/assets/js/vendor/index.js', defer: true } ],
        style: [],
        meta: [ { name: 'color-scheme', content: 'light dark' } ] } },
  eleventyComputed:
   { _pageContext: [Function (anonymous)],
     page:
      { lang: [Function (anonymous)],
        locale: [Function (anonymous)],
        sitemap: [Function (anonymous)] },
     _snapshot: [Function (anonymous)] },
  eleventy:
   { version: '3.1.5',
     generator: 'Eleventy v3.1.5',
     env:
      { source: 'cli',
        runMode: 'build',
        config: '/opt/build/repo/eleventy.config.js',
        root: '/opt/build/repo' },
     directories:
      { input: './src/',
        inputFile: undefined,
        inputGlob: undefined,
        data: './src/_data/',
        includes: './src/_includes/',
        layouts: undefined,
        output: './dist/' } },
  pkg:
   { name: 'eleventy-plugin-baseline',
     version: '1.0.0',
     description: 'An experimental Swiss army knife toolkit for Eleventy',
     main: 'index.js',
     type: 'module',
     engines: { node: '>=20' },
     scripts:
      { test: 'vitest run',
        start: 'npm-run-all clean dev',
        'start-next': 'npm-run-all clean dev-next',
        clean: 'rimraf dist/',
        dev: 'npx @11ty/eleventy --serve',
        'dev-next': 'npx @11ty/eleventy --config=eleventy.config.next.js --serve',
        build: 'npm-run-all clean build:eleventy',
        'build-next': 'npm-run-all clean build:eleventy-next',
        'build:eleventy': 'cross-env ELEVENTY_ENV=production npx @11ty/eleventy',
        'build:eleventy-next':
         'cross-env ELEVENTY_ENV=production npx @11ty/eleventy --config=eleventy.config.next.js',
        dryrun: 'npx @11ty/eleventy --dryrun',
        'dryrun-next': 'npx @11ty/eleventy --config=eleventy.config.next.js --dryrun',
        debug: 'npm-run-all clean debug:*',
        'debug:log': 'npm-run-all clean debug:eleventy-logged',
        'debug:eleventy': 'cross-env DEBUG=Eleventy* npx @11ty/eleventy --dryrun',
        'debug:eleventy-logged': 'cross-env DEBUG=Eleventy* npx @11ty/eleventy --dryrun > debug.log 2>&1',
        lint: 'eslint . --ext=js,jsx,ts,tsx',
        'lint:fix': 'eslint . --ext=js,jsx,ts,tsx --fix',
        'lint:docs': 'eslint . --ignore-pattern "_baseline/" --ext=js,jsx,ts,tsx',
        'lint:docs-fix': 'eslint . --ignore-pattern "_baseline/" --ext=js,jsx,ts,tsx --fix',
        'lint:plugin': 'eslint _baseline/ --ext=js,jsx,ts,tsx',
        'lint:plugin-fix': 'eslint _baseline/ --ext=js,jsx,ts,tsx --fix',
        'format:docs': 'prettier . "!_baseline/**/*" --check',
        'format:docs-fix': 'prettier . "!_baseline/**/*" --write',
        'format:plugin': 'prettier ./_baseline --check --debug-check',
        'format:plugin-fix': 'prettier ./_baseline --write',
        baseline: 'npx @11ty/eleventy --config _baseline/eleventy.config.js --serve',
        release: 'bash _baseline/release.sh',
        'release:tag': 'bash _baseline/release.sh tag',
        'release:local': 'bash _baseline/release.sh local' },
     author: 'Cristovao Verstraeten',
     license: 'ISC',
     keywords: [ 'eleventy-plugin', 'eleventy' ],
     repository:
      { url: 'git@github.com:apleasantview/eleventy-plugin-baseline.git', type: 'git' },
     private: true,
     dependencies:
      { '@11ty/eleventy': '3.1.5',
        '@11ty/eleventy-img': '^6.0.4',
        '@11ty/eleventy-plugin-syntaxhighlight': '^5.0.2',
        '@rviscomi/capo.js': '^2.1.0',
        'cross-env': '^10.1.0',
        cssnano: '^7.1.3',
        dotenv: '^17.3.1',
        esbuild: '0.27.4',
        'npm-run-all': '^4.1.5',
        postcss: '^8.5.8',
        'postcss-import': '^16.1.1',
        'postcss-import-ext-glob': '^2.1.1',
        'postcss-load-config': '^6.0.1',
        'postcss-preset-env': '^11.2.0',
        rimraf: '^6.1.3',
        zod: '^4.3.6' },
     devDependencies:
      { '@eslint/js': '^10.0.1',
        '@vitest/coverage-v8': '^4.1.4',
        eslint: '^10.1.0',
        prettier: '^3.8.1',
        'prettier-plugin-jinja-template': '^2.1.0',
        sharp: '^0.34.5',
        vitest: '^4.1.4' } },
  title: 'Navigator Core',
  permalink: '/navigator-core.html',
  description: 'Eleventy + Baseline internals',
  layout: null,
  eleventyExcludeFromCollections: true,
  _internal: false,
  inspectorDepth: 4,
  page:
   { inputPath: './src/navigator-core.html',
     fileSlug: 'navigator-core',
     filePathStem: '/navigator-core',
     outputFileExtension: 'html',
     templateSyntax: 'njk',
     date: 2026-04-28T07:59:33.141Z,
     rawInput:
      '\n<!DOCTYPE html>\n<html lang="{{ lang | default(settings.defaultLanguage) }}">\n\n<head>\n\t<baseline-head></baseline-head>\n\t<style>\n\t\t._navigator__wrapper:not(#\\#):not(#\\#) {\n\t\t\tbox-sizing: content-box;\n\t\t\tmax-width: 60rem;\n\t\t\tpadding-inline: clamp(1rem, 0.2083rem + 3.5185vw, 3.375rem);\n\t\t\tmargin-inline: auto;\n\t\t}\n\n\t\t._navigator__wrapper:not(#\\#):not(#\\#) > * + * {\n\t\t\tmargin-block-start: 1.25rem;\n\t\t}\n\t</style>\n</head>\n\n<body>\n\t<a href="#main" class="skip-link">\n\t\tSkip to main content\n\t</a>\n\t<header>\n\t\t<div class="_navigator__wrapper">\n\t\t\t<h1>{{ settings.title }} Navigator</h1>\n\t\t\t<div>\n\t\t\t\t<p>{{ settings.tagline }}</p>\n\t\t\t</div>\n\t\t</div>\n\t</header>\n\t<main id="main" tabindex="-1">\n\t\t<div class="_navigator__wrapper">\n\t\t\t<p><a id="go-back" href=""><span style="vertical-align: text-bottom;">&#8592;</span>&nbsp;Go back</a></p>\n\t\t\t<h2><u>Navigator</u></h2>\n\t\t\t<details>\n\t\t\t\t<summary><strong>Page Context</strong></summary>\n\t\t\t\t<pre>\n\t\t\t\t\t{{- _snapshot.pageContext | _inspect({ depth: null }) -}}\n\t\t\t\t</pre>\n\t\t\t</details>\n\t\t\t{% for key, value in _runtime() %}\n\t\t\t<details>\n\t\t\t\t<summary><strong>{{ key }}</strong></summary>\n\t\t\t\t{% if value | isString %}\n\t\t\t\t<pre>{{ value }}</pre>\n\t\t\t\t{% else %}\n\t\t\t\t<pre>{{ value | _inspect({ depth: inspectorDepth }) }}</pre>\n\t\t\t\t{% endif %}\n\t\t\t</details>\n\t\t\t{% endfor %}\n\t\t</div>\n\t</main>\n\t<script>\n\t\tdocument.getElementById("go-back").addEventListener("click", (event) => {\n\t\t\tevent.preventDefault();\n\t\t\thistory.back();\n\t\t});\n\t</script>\n\t<footer>\n\t\t<div class="_navigator__wrapper"><small>Navigator Core — Eleventy Plugin Baseline</small></div>\n\t</footer>\n</body>\n\n</html>\n',
     url: '/navigator-core.html',
     outputPath: './dist/navigator-core.html',
     lang: 'en',
     locale: { translationKey: undefined, lang: 'en', isDefaultLang: true },
     sitemap: { ignore: false, changefreq: '', priority: -1 } },
  collections:
   <ref *1> {
     docs:
      [ { template:
           Template {
             inputPath: './src/content/docs/00.introduction/01.overview.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '01.overview',
             filePathStem: '/content/docs/00.introduction/01.overview',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\n## Overview\n\nBaseline makes the structural decisions that Eleventy leaves open — directory layout, asset pipeline, image handling, SEO, sitemaps — and wires them together so you can skip the setup and start building.\n\n{% alertBlock “warning” %}\n\nWork in progress: APIs and defaults may shift.\n\n{% endalertBlock %}\n\n## Who it’s for\n\n- You’ve started a new Eleventy project and found yourself wiring up the same things for the third time.\n- You want those decisions made together, so they fit together — but you still own your site.\n- You’d rather start from a working baseline than a blank slate or a theme.\n\n## Quick start\n\n- Baseline concepts: [Baseline Concepts](/docs/baseline-concepts/)\n- Quickstart (checklist): [Docs Quickstart](/docs/quickstart/)\n- Build from scratch: [Build a Simple Baseline Site](/docs/tutorial/build-a-simple-baseline-site/)\n- Add to an existing site: [Integrate with Eleventy Base Blog](/docs/how-to/integrate-eleventy-base-blog/)\n- Set correct URLs: [Deployment URL Checks](/docs/tutorial/deployment-url-checks/)\n\n<div class="l-fluid-grid">\n\n  <div class="l-fluid-grid__block">\n\n## Tutorials (learn)\n\n- [Build a Simple Baseline Site](/docs/tutorial/build-a-simple-baseline-site/)\n- [Assets Pipeline Quickstart](/docs/tutorial/assets-pipeline-quickstart/)\n- [Head & SEO Basics](/docs/tutorial/head-and-seo-basics/)\n- [Sitemaps & Drafts](/docs/tutorial/sitemaps-and-drafts/)\n- [Image Shortcode Basics](/docs/tutorial/image-shortcode-basics/)\n- [Build a Multilingual Baseline Site](/docs/tutorial/build-a-multilingual-baseline-site/)\n- [Custom Social Previews](/docs/tutorial/custom-social-previews/)\n- [More tutorials](/docs/tutorial/)\n\n  </div>\n\n  <div class="l-fluid-grid__block">\n\n## How-To’s (recipes)\n\n- [Social Previews Checklist](/docs/how-to/social-previews-checklist/)\n- [Custom PostCSS Config](/docs/how-to/custom-postcss-config/)\n- [Custom Esbuild Targets](/docs/how-to/custom-esbuild-targets/)\n- [Deploy Under a Subpath](/docs/how-to/deploy-under-a-subpath/)\n- [Image Transform](/docs/how-to/image-transform/)\n- [Multilingual Index](/docs/how-to/multilingual-index/)\n- [CI/Publish Checklist](/docs/how-to/ci-publish-checklist/)\n- [Integrate with Eleventy Base Blog](/docs/how-to/integrate-eleventy-base-blog/)\n- [All how-to’s](/docs/how-to/)\n\n  </div>\n\n  <div class="l-fluid-grid__block">\n\n## References\n\n- [Plugin entrypoint](/docs/reference/plugin-entrypoint/)\n- [Config object defaults](/docs/reference/config-object-defaults/)\n- [Globals](/docs/reference/globals/)\n- [Shortcodes](/docs/reference/shortcodes/)\n- [References index](/docs/reference/)\n\n  </div>\n\n  <div class="l-fluid-grid__block">\n\n## Modules (module references)\n\n- [assets-core](/docs/module/assets-core/)\n- [assets-postcss](/docs/module/assets-postcss/)\n- [assets-esbuild](/docs/module/assets-esbuild/)\n- [head-core](/docs/module/head-core/)\n- [multilang-core](/docs/module/multilang-core/)\n- [navigator-core](/docs/module/navigator-core/)\n- [sitemap-core](/docs/module/sitemap-core/)\n- [Full list](/docs/module/)\n\n  </div>\n\n</div>\n\n## Good to know\n\n- Package: `@apleasantview/eleventy-plugin-baseline` (npm). APIs may still shift.\n- Set `site.url` via env for correct canonicals and sitemaps. Use `pathPrefix` if deploying under a subpath.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: '/docs/',
             topicSlug: 'introduction',
             topicTitle: 'Introduction',
             title: 'Documentation',
             description: 'Documentation for Eleventy Plugin Baseline',
             date: 2026-04-15T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/00.introduction/01.overview.md',
             fileSlug: '01.overview',
             filePathStem: '/content/docs/00.introduction/01.overview',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-04-15T00:00:00.000Z,
             rawInput:
              '\n## Overview\n\nBaseline makes the structural decisions that Eleventy leaves open — directory layout, asset pipeline, image handling, SEO, sitemaps — and wires them together so you can skip the setup and start building.\n\n{% alertBlock “warning” %}\n\nWork in progress: APIs and defaults may shift.\n\n{% endalertBlock %}\n\n## Who it’s for\n\n- You’ve started a new Eleventy project and found yourself wiring up the same things for the third time.\n- You want those decisions made together, so they fit together — but you still own your site.\n- You’d rather start from a working baseline than a blank slate or a theme.\n\n## Quick start\n\n- Baseline concepts: [Baseline Concepts](/docs/baseline-concepts/)\n- Quickstart (checklist): [Docs Quickstart](/docs/quickstart/)\n- Build from scratch: [Build a Simple Baseline Site](/docs/tutorial/build-a-simple-baseline-site/)\n- Add to an existing site: [Integrate with Eleventy Base Blog](/docs/how-to/integrate-eleventy-base-blog/)\n- Set correct URLs: [Deployment URL Checks](/docs/tutorial/deployment-url-checks/)\n\n<div class="l-fluid-grid">\n\n  <div class="l-fluid-grid__block">\n\n## Tutorials (learn)\n\n- [Build a Simple Baseline Site](/docs/tutorial/build-a-simple-baseline-site/)\n- [Assets Pipeline Quickstart](/docs/tutorial/assets-pipeline-quickstart/)\n- [Head & SEO Basics](/docs/tutorial/head-and-seo-basics/)\n- [Sitemaps & Drafts](/docs/tutorial/sitemaps-and-drafts/)\n- [Image Shortcode Basics](/docs/tutorial/image-shortcode-basics/)\n- [Build a Multilingual Baseline Site](/docs/tutorial/build-a-multilingual-baseline-site/)\n- [Custom Social Previews](/docs/tutorial/custom-social-previews/)\n- [More tutorials](/docs/tutorial/)\n\n  </div>\n\n  <div class="l-fluid-grid__block">\n\n## How-To’s (recipes)\n\n- [Social Previews Checklist](/docs/how-to/social-previews-checklist/)\n- [Custom PostCSS Config](/docs/how-to/custom-postcss-config/)\n- [Custom Esbuild Targets](/docs/how-to/custom-esbuild-targets/)\n- [Deploy Under a Subpath](/docs/how-to/deploy-under-a-subpath/)\n- [Image Transform](/docs/how-to/image-transform/)\n- [Multilingual Index](/docs/how-to/multilingual-index/)\n- [CI/Publish Checklist](/docs/how-to/ci-publish-checklist/)\n- [Integrate with Eleventy Base Blog](/docs/how-to/integrate-eleventy-base-blog/)\n- [All how-to’s](/docs/how-to/)\n\n  </div>\n\n  <div class="l-fluid-grid__block">\n\n## References\n\n- [Plugin entrypoint](/docs/reference/plugin-entrypoint/)\n- [Config object defaults](/docs/reference/config-object-defaults/)\n- [Globals](/docs/reference/globals/)\n- [Shortcodes](/docs/reference/shortcodes/)\n- [References index](/docs/reference/)\n\n  </div>\n\n  <div class="l-fluid-grid__block">\n\n## Modules (module references)\n\n- [assets-core](/docs/module/assets-core/)\n- [assets-postcss](/docs/module/assets-postcss/)\n- [assets-esbuild](/docs/module/assets-esbuild/)\n- [head-core](/docs/module/head-core/)\n- [multilang-core](/docs/module/multilang-core/)\n- [navigator-core](/docs/module/navigator-core/)\n- [sitemap-core](/docs/module/sitemap-core/)\n- [Full list](/docs/module/)\n\n  </div>\n\n</div>\n\n## Good to know\n\n- Package: `@apleasantview/eleventy-plugin-baseline` (npm). APIs may still shift.\n- Set `site.url` via env for correct canonicals and sitemaps. Use `pathPrefix` if deploying under a subpath.\n',
             url: '/docs/',
             outputPath: './dist/docs/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/00.introduction/01.overview.md',
          fileSlug: '01.overview',
          filePathStem: '/content/docs/00.introduction/01.overview',
          date: 2026-04-15T00:00:00.000Z,
          outputPath: './dist/docs/index.html',
          url: '/docs/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/00.introduction/02.baseline-concepts.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '02.baseline-concepts',
             filePathStem: '/content/docs/00.introduction/02.baseline-concepts',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nBaseline makes the structural decisions that Eleventy leaves open — directory layout, asset pipeline, image handling, SEO, sitemaps — and wires them into a set of modules that work together. This page is a conceptual map: what Baseline handles, how the pieces relate, and where your decisions take over.\n\n## The one‑sentence model\n\nBaseline **makes the setup decisions** (directory structure, template engine, image formats, meta tags, asset bundling, sitemap) **so you can skip the wiring and start building**.\n\n## What Baseline does\n\n**Baseline handles**\n\n- Directory structure — `src/` as input, `dist/` as output, with a standard layout for assets, data, and templates.\n- Asset pipeline — PostCSS for CSS, esbuild for JS. One entry point per directory.\n- Image shortcode — AVIF and WebP, responsive widths, lazy loading.\n- `<head>` tags — meta, canonical, Open Graph, title. Drop `<baseline-head>` in your layout.\n- Sitemap — XML generation, multilingual support with hreflang.\n- Debug tooling — template inspection filters and an optional navigator page.\n\n**You handle**\n\n- Visual design, CSS, layout.\n- Content structure and naming.\n- Templates and layout logic.\n- Deployment.\n\n## How to think about configuration\n\nBaseline’s configuration has two parts:\n\n<div class="c-docs-steps">\n\n1. **Plugin options**\n\n   You pass `baseline({...})` options to enable or disable modules — navigator page, sitemap generation, multilingual support.\n\n   ```js\n   eleventyConfig.addPlugin(\n   \tbaseline({\n   \t\tenableNavigatorTemplate: false,\n   \t\tenableSitemapTemplate: true\n   \t})\n   );\n   ```\n\n2. **Exported config object**\n\n   You re-export `baselineConfig` so Eleventy uses Baseline’s directory structure, template engine, and formats. Start from the defaults; override if you need to.\n\n   ```js\n   import { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n   export const config = baselineConfig;\n   ```\n\n</div>\n\nThe plugin controls what Baseline does. The config export controls where Eleventy looks. They stay separate so you can reason about each one independently.\n\n## How the modules fit together\n\nYour content and templates live in `src/content/` and `src/_includes/` — that’s yours. Baseline’s modules handle everything around them: assets are compiled, head tags are injected, sitemaps are generated. Eleventy writes the result to `dist/`.\n\nHere’s how the modules relate:\n\n<div class="c-docs-steps">\n\n- **Assets**\n\n  `assets-core` establishes the pipeline and exposes `_baseline.assets`.  \n  `assets-postcss` compiles `src/assets/css/**/index.css` → `dist/assets/css/`.  \n  `assets-esbuild` bundles `src/assets/js/**/index.js` → `dist/assets/js/`.\n\n- **Head**\n\n  `head-core` merges page data + site data + `_data/head.js`, then injects the result into `<baseline-head>`.\n\n- **Sitemap**\n\n  `sitemap-core` generates XML sitemaps using `site.url` and page data. Every page is included unless you exclude it. In multilingual mode, it produces per-language sitemaps plus an index.\n\n- **Multilingual (optional)**\n\n  `multilang-core` adds translations collections, i18n filters, and language normalization. Sitemap generation stays in `sitemap-core` — `multilang-core` provides a helper it depends on.\n\n- **Debug (optional)**\n\n  `navigator-core` exposes `_navigator` and `_context` globals for inspecting template data. Optional virtual debug page in dev.\n\n</div>\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: '/docs/baseline-concepts/',
             topicSlug: 'introduction',
             topicTitle: 'Introduction',
             title: 'Baseline concepts',
             description:
              'A one-page conceptual map of how Baseline fits into Eleventy: what it handles, how the pieces relate, and where your decisions take over.',
             date: 2026-04-14T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/00.introduction/02.baseline-concepts.md',
             fileSlug: '02.baseline-concepts',
             filePathStem: '/content/docs/00.introduction/02.baseline-concepts',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-04-14T00:00:00.000Z,
             rawInput:
              '\nBaseline makes the structural decisions that Eleventy leaves open — directory layout, asset pipeline, image handling, SEO, sitemaps — and wires them into a set of modules that work together. This page is a conceptual map: what Baseline handles, how the pieces relate, and where your decisions take over.\n\n## The one‑sentence model\n\nBaseline **makes the setup decisions** (directory structure, template engine, image formats, meta tags, asset bundling, sitemap) **so you can skip the wiring and start building**.\n\n## What Baseline does\n\n**Baseline handles**\n\n- Directory structure — `src/` as input, `dist/` as output, with a standard layout for assets, data, and templates.\n- Asset pipeline — PostCSS for CSS, esbuild for JS. One entry point per directory.\n- Image shortcode — AVIF and WebP, responsive widths, lazy loading.\n- `<head>` tags — meta, canonical, Open Graph, title. Drop `<baseline-head>` in your layout.\n- Sitemap — XML generation, multilingual support with hreflang.\n- Debug tooling — template inspection filters and an optional navigator page.\n\n**You handle**\n\n- Visual design, CSS, layout.\n- Content structure and naming.\n- Templates and layout logic.\n- Deployment.\n\n## How to think about configuration\n\nBaseline’s configuration has two parts:\n\n<div class="c-docs-steps">\n\n1. **Plugin options**\n\n   You pass `baseline({...})` options to enable or disable modules — navigator page, sitemap generation, multilingual support.\n\n   ```js\n   eleventyConfig.addPlugin(\n   \tbaseline({\n   \t\tenableNavigatorTemplate: false,\n   \t\tenableSitemapTemplate: true\n   \t})\n   );\n   ```\n\n2. **Exported config object**\n\n   You re-export `baselineConfig` so Eleventy uses Baseline’s directory structure, template engine, and formats. Start from the defaults; override if you need to.\n\n   ```js\n   import { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n   export const config = baselineConfig;\n   ```\n\n</div>\n\nThe plugin controls what Baseline does. The config export controls where Eleventy looks. They stay separate so you can reason about each one independently.\n\n## How the modules fit together\n\nYour content and templates live in `src/content/` and `src/_includes/` — that’s yours. Baseline’s modules handle everything around them: assets are compiled, head tags are injected, sitemaps are generated. Eleventy writes the result to `dist/`.\n\nHere’s how the modules relate:\n\n<div class="c-docs-steps">\n\n- **Assets**\n\n  `assets-core` establishes the pipeline and exposes `_baseline.assets`.  \n  `assets-postcss` compiles `src/assets/css/**/index.css` → `dist/assets/css/`.  \n  `assets-esbuild` bundles `src/assets/js/**/index.js` → `dist/assets/js/`.\n\n- **Head**\n\n  `head-core` merges page data + site data + `_data/head.js`, then injects the result into `<baseline-head>`.\n\n- **Sitemap**\n\n  `sitemap-core` generates XML sitemaps using `site.url` and page data. Every page is included unless you exclude it. In multilingual mode, it produces per-language sitemaps plus an index.\n\n- **Multilingual (optional)**\n\n  `multilang-core` adds translations collections, i18n filters, and language normalization. Sitemap generation stays in `sitemap-core` — `multilang-core` provides a helper it depends on.\n\n- **Debug (optional)**\n\n  `navigator-core` exposes `_navigator` and `_context` globals for inspecting template data. Optional virtual debug page in dev.\n\n</div>\n',
             url: '/docs/baseline-concepts/',
             outputPath: './dist/docs/baseline-concepts/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/00.introduction/02.baseline-concepts.md',
          fileSlug: '02.baseline-concepts',
          filePathStem: '/content/docs/00.introduction/02.baseline-concepts',
          date: 2026-04-14T00:00:00.000Z,
          outputPath: './dist/docs/baseline-concepts/index.html',
          url: '/docs/baseline-concepts/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/00.introduction/03.quickstart.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '03.quickstart',
             filePathStem: '/content/docs/00.introduction/03.quickstart',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nFast path to a single-language Baseline site. For full context, see [the Simple Baseline Site tutorial](/docs/tutorial/build-a-simple-baseline-site/).\n\n## Prerequisites\n\n- Node 20.15.0+ and npm.\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n\n## 1) Install\n\n```bash\nmkdir baseline-quickstart\ncd baseline-quickstart\nnpm init -y\nnpm install @11ty/eleventy @apleasantview/eleventy-plugin-baseline @11ty/eleventy-img\n```\n\n## 2) Configure\n\n- `.env`:\n  ```text\n  ELEVENTY_ENV="development"\n  URL="http://localhost:8080/"\n  ```\n- `eleventy.config.js`: add `baseline({})` and export `config`; if you have other config/plugins, place Baseline last.\n- `src/_data/site.js`: title/tagline/url/defaultLanguage.\n- `src/_data/head.js`: CSS/JS links.\n- `src/_includes/layouts/base.njk`: add `<baseline-head>` inside `<head>`.\n- `src/content/pages/index.md`: front matter + minimal body.\n- Assets: `src/assets/assets.11tydata.js` (exclude from collections), `src/assets/css/index.css`, `src/assets/js/index.js`.\n\n## 3) Run and build\n\n- Dev: `npx rimraf dist/ && npm run dev`\n  - Open http://localhost:8080/; check `dist/` (including `dist/sitemap.xml`).\n- Build: `npx rimraf dist/ && npm run build`\n  - Inspect `dist/` for final output.\n\n## Next steps\n\n- Tutorial: [Build a Simple Baseline Site](/docs/tutorial/build-a-simple-baseline-site/)\n- Assets: [Assets Pipeline Quickstart](/docs/tutorial/assets-pipeline-quickstart/)\n- Head/SEO: [Head & SEO Basics](/docs/tutorial/head-and-seo-basics/)\n- Multilingual: [Build a Multilingual Baseline Site](/docs/tutorial/build-a-multilingual-baseline-site/)\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: '/docs/quickstart/',
             topicSlug: 'introduction',
             topicTitle: 'Introduction',
             title: 'Quickstart',
             description:
              'Fast path to a single-language Baseline site—install, configure, run dev/build.',
             parent: 'docs',
             date: 2026-04-15T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/00.introduction/03.quickstart.md',
             fileSlug: '03.quickstart',
             filePathStem: '/content/docs/00.introduction/03.quickstart',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-04-15T00:00:00.000Z,
             rawInput:
              '\nFast path to a single-language Baseline site. For full context, see [the Simple Baseline Site tutorial](/docs/tutorial/build-a-simple-baseline-site/).\n\n## Prerequisites\n\n- Node 20.15.0+ and npm.\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n\n## 1) Install\n\n```bash\nmkdir baseline-quickstart\ncd baseline-quickstart\nnpm init -y\nnpm install @11ty/eleventy @apleasantview/eleventy-plugin-baseline @11ty/eleventy-img\n```\n\n## 2) Configure\n\n- `.env`:\n  ```text\n  ELEVENTY_ENV="development"\n  URL="http://localhost:8080/"\n  ```\n- `eleventy.config.js`: add `baseline({})` and export `config`; if you have other config/plugins, place Baseline last.\n- `src/_data/site.js`: title/tagline/url/defaultLanguage.\n- `src/_data/head.js`: CSS/JS links.\n- `src/_includes/layouts/base.njk`: add `<baseline-head>` inside `<head>`.\n- `src/content/pages/index.md`: front matter + minimal body.\n- Assets: `src/assets/assets.11tydata.js` (exclude from collections), `src/assets/css/index.css`, `src/assets/js/index.js`.\n\n## 3) Run and build\n\n- Dev: `npx rimraf dist/ && npm run dev`\n  - Open http://localhost:8080/; check `dist/` (including `dist/sitemap.xml`).\n- Build: `npx rimraf dist/ && npm run build`\n  - Inspect `dist/` for final output.\n\n## Next steps\n\n- Tutorial: [Build a Simple Baseline Site](/docs/tutorial/build-a-simple-baseline-site/)\n- Assets: [Assets Pipeline Quickstart](/docs/tutorial/assets-pipeline-quickstart/)\n- Head/SEO: [Head & SEO Basics](/docs/tutorial/head-and-seo-basics/)\n- Multilingual: [Build a Multilingual Baseline Site](/docs/tutorial/build-a-multilingual-baseline-site/)\n',
             url: '/docs/quickstart/',
             outputPath: './dist/docs/quickstart/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/00.introduction/03.quickstart.md',
          fileSlug: '03.quickstart',
          filePathStem: '/content/docs/00.introduction/03.quickstart',
          date: 2026-04-15T00:00:00.000Z,
          outputPath: './dist/docs/quickstart/index.html',
          url: '/docs/quickstart/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/00.index.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '00.index',
             filePathStem: '/content/docs/01.tutorial/00.index',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nBaseline tutorials to get you productive quickly: start from a simple site, then add assets, head/SEO, sitemap/drafts, images, multilingual, and social previews.\n\n{% alertBlock "info" %}\n\nThe completed tutorial site (with how-to chapters) is [available on GitHub](https://github.com/apleasantview/simple-baseline-site).\n\n{% endalertBlock %}\n\n## Index\n\n<ul>\n{%- for item in collections.docs %}\n{%- if item.data.topicSlug === topicSlug and item.url !== page.url %}\n\t<li><a href="{{ item.url }}">{{ item.data.title }}</a></li>\n{%- endif %}\n{%- endfor %}\n</ul>\n\nPrefer a checklist? See the [Docs Quickstart](/docs/quickstart/).\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: '/docs/tutorial/',
             topicSlug: 'tutorial',
             topicTitle: 'Tutorials',
             title: 'Tutorials',
             description:
              'Browse Baseline tutorials: build a simple site, assets, head/SEO, sitemaps, images, multilingual, social previews, and correct deployment URLs.',
             parent: 'docs',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/01.tutorial/00.index.md',
             fileSlug: '00.index',
             filePathStem: '/content/docs/01.tutorial/00.index',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nBaseline tutorials to get you productive quickly: start from a simple site, then add assets, head/SEO, sitemap/drafts, images, multilingual, and social previews.\n\n{% alertBlock "info" %}\n\nThe completed tutorial site (with how-to chapters) is [available on GitHub](https://github.com/apleasantview/simple-baseline-site).\n\n{% endalertBlock %}\n\n## Index\n\n<ul>\n{%- for item in collections.docs %}\n{%- if item.data.topicSlug === topicSlug and item.url !== page.url %}\n\t<li><a href="{{ item.url }}">{{ item.data.title }}</a></li>\n{%- endif %}\n{%- endfor %}\n</ul>\n\nPrefer a checklist? See the [Docs Quickstart](/docs/quickstart/).\n',
             url: '/docs/tutorial/',
             outputPath: './dist/docs/tutorial/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/01.tutorial/00.index.md',
          fileSlug: '00.index',
          filePathStem: '/content/docs/01.tutorial/00.index',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/index.html',
          url: '/docs/tutorial/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/01.simple-baseline-site.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '01.simple-baseline-site',
             filePathStem: '/content/docs/01.tutorial/01.simple-baseline-site',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nCreate a single-language Eleventy site using `@apleasantview/eleventy-plugin-baseline` with its defaults. We’ll use npm, Node 20.15.0, minimal CSS, and keep things as close to “starter” as possible.\n\n## What you’ll build\n\n- A basic Eleventy site with one page.\n- Baseline wired with default options (multilingual off, sitemap on, navigator template off).\n- A tiny stylesheet, bundled automatically via Baseline’s assets pipeline, and an auto-generated `sitemap.xml`.\n\n## Prerequisites\n\n- Node 20.15.0 (or >=20).\n- npm.\n- A terminal.\n\n## 1) Create the project\n\n```bash\nmkdir simple-baseline-site\ncd simple-baseline-site\nnpm init -y\n```\n\n- Open `package.json` and set `"type": "module"` (Baseline expects ESM). Example:\n  ```json\n  {\n  \t"name": "simple-baseline-site",\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n\n## 2) Install Eleventy, Eleventy Image and Baseline\n\n```bash\nnpm install @11ty/eleventy @apleasantview/eleventy-plugin-baseline @11ty/eleventy-img\n```\n\n## 3) Configure Eleventy to use Baseline defaults\n\nCreate `eleventy.config.js` in the project root:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\t// Defaults: verbose off, navigator off, sitemap on, multilingual off.\n\televentyConfig.addPlugin(baseline());\n}\n\nexport const config = baselineConfig;\n```\n\n`export const config = baselineConfig;` lets Eleventy pick up Baseline’s directory/default settings automatically.\n\nBaseline will configure HtmlBasePlugin to use `process.env.URL` automatically; create a local `.env` for dev, and set `URL` in your host/CI for production so links stay correct.\n\nCreate a local `.env` file now:\n\n```txt\nELEVENTY_ENV="development"\nURL="http://localhost:8080/"\n```\n\n## 4) Required site data\n\nCreate `src/_data/site.js`:\n\n```js\nexport default {\n\ttitle: \'Simple Baseline Site\',\n\ttagline: \'Hello, Eleventy + Baseline\',\n\turl: process.env.URL || \'http://localhost:8080/\',\n\tdefaultLanguage: \'en\',\n\tnoindex: false\n};\n```\n\nAdd `src/_data/head.js` so your bundled assets load:\n\n```js\nexport default {\n\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\tscript: [{ src: \'/assets/js/index.js\', defer: true }]\n};\n```\n\n## 5) Minimal layout\n\nCreate `src/_includes/layouts/base.njk`:\n\n{% raw %}\n\n```nunjucks\n<!DOCTYPE html>\n<html lang="{{ lang | default(site.defaultLanguage) }}">\n  <head>\n    <baseline-head></baseline-head>\n    <meta name="color-scheme" content="light dark">\n  </head>\n  <body>\n    <main id="main">\n      <h1>{{ title }}</h1>\n      {{ content | safe }}\n      {% if page.url !== "/" %}\n        <p><a id="go-back" href=""><span style="vertical-align: text-bottom;">&#8592;</span>&nbsp;Go back</a></p>\n      {% endif %}\n    </main>\n    <script>\n    const backBtn = document.getElementById("go-back");\n    if ( backBtn ) {\n      backBtn.addEventListener("click", (event) => {\n        event.preventDefault();\n        history.back();\n      });\n    }\n    </script>\n  </body>\n</html>\n```\n\n{% endraw %}\n\n## 6) Add a first page\n\nCreate `src/content/pages/index.md`:\n\n{% raw %}\n\n```md\n---\ntitle: \'Hello Baseline\'\ndescription: \'A minimal Eleventy page powered by eleventy-plugin-baseline.\'\npermalink: \'/\'\nlayout: \'layouts/base.njk\'\n---\n\nYou’re looking at a page rendered with Eleventy and the Baseline plugin defaults.\n\n## Index\n\n<ul class="index-links">\n{% for item in collections.all %}\n<li><a href="{{ item.url }}">{{ item.data.title }}</a></li>\n{% endfor %}\n</ul>\n```\n\n{% endraw %}\n\n## 7) Minimal assets\n\nCreate `src/assets/assets.11tydata.js` to keep assets out of collections:\n\n```js\nexport default {\n\televentyExcludeFromCollections: true\n};\n```\n\nCreate `src/assets/css/index.css`:\n\n```css\nbody {\n\tfont-family: system-ui, sans-serif;\n\tmargin: 0;\n\tpadding: 2rem;\n\tline-height: 1.5;\n\tcolor: #1f2937;\n\tbackground: #f8fafc;\n}\n\nh1 {\n\tmargin-bottom: 0.5rem;\n}\n```\n\nCreate `src/assets/js/index.js`:\n\n```js\ndocument.addEventListener(\'DOMContentLoaded\', () => {\n\tconsole.log(`Howdy!`);\n});\n```\n\n## 8) Run the site locally\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open the printed local URL (default http://localhost:8080/). You should see “Hello, Baseline.”\n- While dev runs, Eleventy also writes to `dist/`, so you can peek at the generated files (including `sitemap.xml`).\n\n{% alertBlock "info" %}\nEleventy doesn’t clean `dist/` automatically. If you rerun dev/build or when your build seems stale, clear `dist/` first (e.g., `npx rimraf dist`).\n{% endalertBlock %}\n\n## 9) Production build and inspect output\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\n- Find the built files in `dist/`.\n- `dist/sitemap.xml` is generated automatically (sitemap module is on by default).\n\n## 10) Next steps\n\n- Add more pages under `src/content/pages/` with front matter (`title`, `description`, `permalink`, `layout`).\n- If you deploy under a subpath, set `pathPrefix` in `eleventy.config.js`.\n- When you have a production URL, update `src/_data/site.js` so canonical URLs and the sitemap are correct.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: [Function: permalink],
             topicSlug: 'tutorial',
             topicTitle: 'Tutorials',
             title: 'Build a Simple Baseline Site',
             slug: 'build-a-simple-baseline-site',
             description:
              'Create a single-language Eleventy site with Baseline defaults, minimal CSS/JS, and an auto sitemap using npm and Node 20.',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/01.tutorial/01.simple-baseline-site.md',
             fileSlug: '01.simple-baseline-site',
             filePathStem: '/content/docs/01.tutorial/01.simple-baseline-site',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nCreate a single-language Eleventy site using `@apleasantview/eleventy-plugin-baseline` with its defaults. We’ll use npm, Node 20.15.0, minimal CSS, and keep things as close to “starter” as possible.\n\n## What you’ll build\n\n- A basic Eleventy site with one page.\n- Baseline wired with default options (multilingual off, sitemap on, navigator template off).\n- A tiny stylesheet, bundled automatically via Baseline’s assets pipeline, and an auto-generated `sitemap.xml`.\n\n## Prerequisites\n\n- Node 20.15.0 (or >=20).\n- npm.\n- A terminal.\n\n## 1) Create the project\n\n```bash\nmkdir simple-baseline-site\ncd simple-baseline-site\nnpm init -y\n```\n\n- Open `package.json` and set `"type": "module"` (Baseline expects ESM). Example:\n  ```json\n  {\n  \t"name": "simple-baseline-site",\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n\n## 2) Install Eleventy, Eleventy Image and Baseline\n\n```bash\nnpm install @11ty/eleventy @apleasantview/eleventy-plugin-baseline @11ty/eleventy-img\n```\n\n## 3) Configure Eleventy to use Baseline defaults\n\nCreate `eleventy.config.js` in the project root:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\t// Defaults: verbose off, navigator off, sitemap on, multilingual off.\n\televentyConfig.addPlugin(baseline());\n}\n\nexport const config = baselineConfig;\n```\n\n`export const config = baselineConfig;` lets Eleventy pick up Baseline’s directory/default settings automatically.\n\nBaseline will configure HtmlBasePlugin to use `process.env.URL` automatically; create a local `.env` for dev, and set `URL` in your host/CI for production so links stay correct.\n\nCreate a local `.env` file now:\n\n```txt\nELEVENTY_ENV="development"\nURL="http://localhost:8080/"\n```\n\n## 4) Required site data\n\nCreate `src/_data/site.js`:\n\n```js\nexport default {\n\ttitle: \'Simple Baseline Site\',\n\ttagline: \'Hello, Eleventy + Baseline\',\n\turl: process.env.URL || \'http://localhost:8080/\',\n\tdefaultLanguage: \'en\',\n\tnoindex: false\n};\n```\n\nAdd `src/_data/head.js` so your bundled assets load:\n\n```js\nexport default {\n\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\tscript: [{ src: \'/assets/js/index.js\', defer: true }]\n};\n```\n\n## 5) Minimal layout\n\nCreate `src/_includes/layouts/base.njk`:\n\n{% raw %}\n\n```nunjucks\n<!DOCTYPE html>\n<html lang="{{ lang | default(site.defaultLanguage) }}">\n  <head>\n    <baseline-head></baseline-head>\n    <meta name="color-scheme" content="light dark">\n  </head>\n  <body>\n    <main id="main">\n      <h1>{{ title }}</h1>\n      {{ content | safe }}\n      {% if page.url !== "/" %}\n        <p><a id="go-back" href=""><span style="vertical-align: text-bottom;">&#8592;</span>&nbsp;Go back</a></p>\n      {% endif %}\n    </main>\n    <script>\n    const backBtn = document.getElementById("go-back");\n    if ( backBtn ) {\n      backBtn.addEventListener("click", (event) => {\n        event.preventDefault();\n        history.back();\n      });\n    }\n    </script>\n  </body>\n</html>\n```\n\n{% endraw %}\n\n## 6) Add a first page\n\nCreate `src/content/pages/index.md`:\n\n{% raw %}\n\n```md\n---\ntitle: \'Hello Baseline\'\ndescription: \'A minimal Eleventy page powered by eleventy-plugin-baseline.\'\npermalink: \'/\'\nlayout: \'layouts/base.njk\'\n---\n\nYou’re looking at a page rendered with Eleventy and the Baseline plugin defaults.\n\n## Index\n\n<ul class="index-links">\n{% for item in collections.all %}\n<li><a href="{{ item.url }}">{{ item.data.title }}</a></li>\n{% endfor %}\n</ul>\n```\n\n{% endraw %}\n\n## 7) Minimal assets\n\nCreate `src/assets/assets.11tydata.js` to keep assets out of collections:\n\n```js\nexport default {\n\televentyExcludeFromCollections: true\n};\n```\n\nCreate `src/assets/css/index.css`:\n\n```css\nbody {\n\tfont-family: system-ui, sans-serif;\n\tmargin: 0;\n\tpadding: 2rem;\n\tline-height: 1.5;\n\tcolor: #1f2937;\n\tbackground: #f8fafc;\n}\n\nh1 {\n\tmargin-bottom: 0.5rem;\n}\n```\n\nCreate `src/assets/js/index.js`:\n\n```js\ndocument.addEventListener(\'DOMContentLoaded\', () => {\n\tconsole.log(`Howdy!`);\n});\n```\n\n## 8) Run the site locally\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open the printed local URL (default http://localhost:8080/). You should see “Hello, Baseline.”\n- While dev runs, Eleventy also writes to `dist/`, so you can peek at the generated files (including `sitemap.xml`).\n\n{% alertBlock "info" %}\nEleventy doesn’t clean `dist/` automatically. If you rerun dev/build or when your build seems stale, clear `dist/` first (e.g., `npx rimraf dist`).\n{% endalertBlock %}\n\n## 9) Production build and inspect output\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\n- Find the built files in `dist/`.\n- `dist/sitemap.xml` is generated automatically (sitemap module is on by default).\n\n## 10) Next steps\n\n- Add more pages under `src/content/pages/` with front matter (`title`, `description`, `permalink`, `layout`).\n- If you deploy under a subpath, set `pathPrefix` in `eleventy.config.js`.\n- When you have a production URL, update `src/_data/site.js` so canonical URLs and the sitemap are correct.\n',
             url: '/docs/tutorial/build-a-simple-baseline-site/',
             outputPath: './dist/docs/tutorial/build-a-simple-baseline-site/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/01.tutorial/01.simple-baseline-site.md',
          fileSlug: '01.simple-baseline-site',
          filePathStem: '/content/docs/01.tutorial/01.simple-baseline-site',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/build-a-simple-baseline-site/index.html',
          url: '/docs/tutorial/build-a-simple-baseline-site/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/02.multilingual-site.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '02.multilingual-site',
             filePathStem: '/content/docs/01.tutorial/02.multilingual-site',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nCreate a two-language Eleventy site (en + nl) using `@apleasantview/eleventy-plugin-baseline`. We’ll enable Baseline’s multilingual support, add localized pages, render hreflang/alternate links, and confirm per-language sitemaps. Uses npm, Node 20.15.0, and the same minimal layout style as the previous tutorial.\n\n## What you’ll build\n\n- A basic site with English and Dutch pages.\n- Baseline configured with `multilingual: true` and language metadata.\n- Layout with hreflang/alternate links; automatic per-language sitemaps.\n\n## Prerequisites\n\n- Node 20.15.0 (or >=20) and npm.\n- `package.json` with `"type": "module"`.\n- Minimal scripts (same as prior tutorial):\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n\n## 1) Install Eleventy, Eleventy Image and Baseline\n\n```bash\nnpm install @11ty/eleventy @apleasantview/eleventy-plugin-baseline @11ty/eleventy-img\n```\n\n## 2) Configure Eleventy with Baseline multilingual\n\nCreate `eleventy.config.js`:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\nimport i18n from \'./src/_data/i18n.js\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\t// Multilingual on; default language and languages pulled from i18n data.\n\televentyConfig.addPlugin(\n\t\tbaseline({\n\t\t\tmultilingual: true,\n\t\t\tdefaultLanguage: i18n.defaultLanguage,\n\t\t\tlanguages: i18n.languages\n\t\t})\n\t);\n}\n\nexport const config = baselineConfig;\n```\n\n{% alertBlock "info" %}\n\nBaseline’s multilang support uses Eleventy’s built-in i18n plugin. For plugin details, see the Eleventy i18n docs: [https://www.11ty.dev/docs/plugins/i18n/](https://www.11ty.dev/docs/plugins/i18n/).\n\n{% endalertBlock %}\n\nBaseline will configure HtmlBasePlugin to use `process.env.URL` automatically; create a local `.env` for dev, and set `URL` in your host/CI for production so canonicals, hreflang, and sitemaps use the right origin.\n\nCreate a local `.env` now:\n\n```txt\nELEVENTY_ENV="development"\nURL="http://localhost:8080/"\n```\n\n## 3) Required site data\n\n`src/_data/site.js`:\n\n```js\nexport default {\n\ttitle: \'Multilingual Baseline Site\',\n\ttagline: \'Hello, Eleventy + Baseline (i18n)\',\n\turl: process.env.URL || \'http://localhost:8080/\',\n\tdefaultLanguage: \'en\',\n\tnoindex: false\n};\n```\n\n`src/_data/head.js`:\n\n```js\nexport default {\n\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\tscript: [{ src: \'/assets/js/index.js\', defer: true }]\n};\n```\n\n## 4) Define languages\n\nCreate `src/_data/i18n.js`:\n\n```js\nexport default {\n\tdefaultLanguage: \'en\',\n\tlanguages: {\n\t\ten: {\n\t\t\tcontentDir: \'content/en/\',\n\t\t\tlanguageCode: \'en\',\n\t\t\tlanguageName: \'English\',\n\t\t\ttitle: \'Baseline (EN)\',\n\t\t\ttagline: \'Hello\'\n\t\t},\n\t\tnl: {\n\t\t\tcontentDir: \'content/nl/\',\n\t\t\tlanguageCode: \'nl\',\n\t\t\tlanguageName: \'Nederlands\',\n\t\t\ttitle: \'Baseline (NL)\',\n\t\t\ttagline: \'Hallo\'\n\t\t}\n\t}\n};\n```\n\n## 5) Per-language directory data\n\n`src/content/en/en.11tydata.js`:\n\n```js\nexport default { lang: \'en\' };\n```\n\n`src/content/nl/nl.11tydata.js`:\n\n```js\nexport default { lang: \'nl\' };\n```\n\n## 6) Minimal layout with hreflang\n\nUse the same simple layout as before, plus alternates. Create `src/_includes/layouts/base.njk`:\n\n{% raw %}\n\n```nunjucks\n<!DOCTYPE html>\n<html lang="{{ lang | default(site.defaultLanguage) }}">\n  <head>\n    <baseline-head></baseline-head>\n    {# hreflang/alternate links from collections.translationsMap #}\n    {% set translations = collections.translationsMap[translationKey] %}\n    {% if translations %}\n      {% for language, item in translations %}\n        <link rel="alternate" hreflang="{{ item.lang }}" href="{{ item.url }}">\n        {% if item.isDefaultLang %}<link rel="alternate" hreflang="x-default" href="{{ item.url }}">{% endif %}\n      {% endfor %}\n    {% endif %}\n    <meta name="color-scheme" content="light dark">\n  </head>\n  <body>\n    <main id="main">\n      <h1>{{ title }}</h1>\n      {{ content | safe }}\n      {% if page.url !== "/" %}\n        <p><a id="go-back" href=""><span style="vertical-align: text-bottom;">&#8592;</span>&nbsp;Go back</a></p>\n      {% endif %}\n    </main>\n    <script>\n    const backBtn = document.getElementById("go-back");\n    if ( backBtn ) {\n      backBtn.addEventListener("click", (event) => {\n        event.preventDefault();\n        history.back();\n      });\n    }\n    </script>\n  </body>\n</html>\n```\n\n{% endraw %}\n\n## 7) Add localized pages\n\n`src/content/en/pages/index.md`:\n\n```md\n---\ntitle: \'Hello Baseline (EN)\'\ndescription: \'English home\'\npermalink: \'/en/\'\nlayout: \'layouts/base.njk\'\ntranslationKey: \'homepage\'\n---\n\nWelcome to the English home page.\n```\n\n`src/content/nl/pages/index.md`:\n\n```md\n---\ntitle: \'Hallo Baseline (NL)\'\ndescription: \'Nederlandse home\'\npermalink: \'/nl/\'\nlayout: \'layouts/base.njk\'\ntranslationKey: \'homepage\'\n---\n\nWelkom op de Nederlandse homepagina.\n```\n\n## 8) Minimal assets (reuse from prior tutorial)\n\n- `src/assets/css/index.css` — same minimal styles as before.\n- `src/assets/js/index.js` — optional small script (e.g., DOMContentLoaded log).\n\n## 9) Run the site locally\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Visit `/en/` for English and `/nl/` for Dutch.\n- View page source to see `<link rel="alternate" hreflang="...">` entries.\n- While dev runs, Eleventy also writes to `dist/`, so you can peek at the generated files including `sitemap.xml` and per-language sitemaps like `dist/en/sitemap.xml` and `dist/nl/sitemap.xml`.\n\n## 10) Production build and inspect output\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\n- Check `dist/` for per-language output.\n- `dist/sitemap.xml` plus per-language sitemaps (e.g., `dist/en/sitemap.xml`, `dist/nl/sitemap.xml`) if multiple languages are present.\n\n## 11) Next steps\n\n- Add more pages under `src/content/en/` and `src/content/nl/` with matching `translationKey` values to link translations.\n- Localize labels (e.g., nav text) via data files keyed by `lang`.\n- Set `pathPrefix` if deploying under a subpath; ensure `site.url` is set to your production URL for correct canonicals and sitemap links.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: [Function: permalink],
             topicSlug: 'tutorial',
             topicTitle: 'Tutorials',
             title: 'Build a Multilingual Baseline Site',
             slug: 'build-a-multilingual-baseline-site',
             description:
              'Build an English and Dutch Baseline site with Eleventy i18n, hreflang links, per-language sitemaps, and environment-driven URLs.',
             date: 2026-01-26T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/01.tutorial/02.multilingual-site.md',
             fileSlug: '02.multilingual-site',
             filePathStem: '/content/docs/01.tutorial/02.multilingual-site',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-26T00:00:00.000Z,
             rawInput:
              '\nCreate a two-language Eleventy site (en + nl) using `@apleasantview/eleventy-plugin-baseline`. We’ll enable Baseline’s multilingual support, add localized pages, render hreflang/alternate links, and confirm per-language sitemaps. Uses npm, Node 20.15.0, and the same minimal layout style as the previous tutorial.\n\n## What you’ll build\n\n- A basic site with English and Dutch pages.\n- Baseline configured with `multilingual: true` and language metadata.\n- Layout with hreflang/alternate links; automatic per-language sitemaps.\n\n## Prerequisites\n\n- Node 20.15.0 (or >=20) and npm.\n- `package.json` with `"type": "module"`.\n- Minimal scripts (same as prior tutorial):\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n\n## 1) Install Eleventy, Eleventy Image and Baseline\n\n```bash\nnpm install @11ty/eleventy @apleasantview/eleventy-plugin-baseline @11ty/eleventy-img\n```\n\n## 2) Configure Eleventy with Baseline multilingual\n\nCreate `eleventy.config.js`:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\nimport i18n from \'./src/_data/i18n.js\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\t// Multilingual on; default language and languages pulled from i18n data.\n\televentyConfig.addPlugin(\n\t\tbaseline({\n\t\t\tmultilingual: true,\n\t\t\tdefaultLanguage: i18n.defaultLanguage,\n\t\t\tlanguages: i18n.languages\n\t\t})\n\t);\n}\n\nexport const config = baselineConfig;\n```\n\n{% alertBlock "info" %}\n\nBaseline’s multilang support uses Eleventy’s built-in i18n plugin. For plugin details, see the Eleventy i18n docs: [https://www.11ty.dev/docs/plugins/i18n/](https://www.11ty.dev/docs/plugins/i18n/).\n\n{% endalertBlock %}\n\nBaseline will configure HtmlBasePlugin to use `process.env.URL` automatically; create a local `.env` for dev, and set `URL` in your host/CI for production so canonicals, hreflang, and sitemaps use the right origin.\n\nCreate a local `.env` now:\n\n```txt\nELEVENTY_ENV="development"\nURL="http://localhost:8080/"\n```\n\n## 3) Required site data\n\n`src/_data/site.js`:\n\n```js\nexport default {\n\ttitle: \'Multilingual Baseline Site\',\n\ttagline: \'Hello, Eleventy + Baseline (i18n)\',\n\turl: process.env.URL || \'http://localhost:8080/\',\n\tdefaultLanguage: \'en\',\n\tnoindex: false\n};\n```\n\n`src/_data/head.js`:\n\n```js\nexport default {\n\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\tscript: [{ src: \'/assets/js/index.js\', defer: true }]\n};\n```\n\n## 4) Define languages\n\nCreate `src/_data/i18n.js`:\n\n```js\nexport default {\n\tdefaultLanguage: \'en\',\n\tlanguages: {\n\t\ten: {\n\t\t\tcontentDir: \'content/en/\',\n\t\t\tlanguageCode: \'en\',\n\t\t\tlanguageName: \'English\',\n\t\t\ttitle: \'Baseline (EN)\',\n\t\t\ttagline: \'Hello\'\n\t\t},\n\t\tnl: {\n\t\t\tcontentDir: \'content/nl/\',\n\t\t\tlanguageCode: \'nl\',\n\t\t\tlanguageName: \'Nederlands\',\n\t\t\ttitle: \'Baseline (NL)\',\n\t\t\ttagline: \'Hallo\'\n\t\t}\n\t}\n};\n```\n\n## 5) Per-language directory data\n\n`src/content/en/en.11tydata.js`:\n\n```js\nexport default { lang: \'en\' };\n```\n\n`src/content/nl/nl.11tydata.js`:\n\n```js\nexport default { lang: \'nl\' };\n```\n\n## 6) Minimal layout with hreflang\n\nUse the same simple layout as before, plus alternates. Create `src/_includes/layouts/base.njk`:\n\n{% raw %}\n\n```nunjucks\n<!DOCTYPE html>\n<html lang="{{ lang | default(site.defaultLanguage) }}">\n  <head>\n    <baseline-head></baseline-head>\n    {# hreflang/alternate links from collections.translationsMap #}\n    {% set translations = collections.translationsMap[translationKey] %}\n    {% if translations %}\n      {% for language, item in translations %}\n        <link rel="alternate" hreflang="{{ item.lang }}" href="{{ item.url }}">\n        {% if item.isDefaultLang %}<link rel="alternate" hreflang="x-default" href="{{ item.url }}">{% endif %}\n      {% endfor %}\n    {% endif %}\n    <meta name="color-scheme" content="light dark">\n  </head>\n  <body>\n    <main id="main">\n      <h1>{{ title }}</h1>\n      {{ content | safe }}\n      {% if page.url !== "/" %}\n        <p><a id="go-back" href=""><span style="vertical-align: text-bottom;">&#8592;</span>&nbsp;Go back</a></p>\n      {% endif %}\n    </main>\n    <script>\n    const backBtn = document.getElementById("go-back");\n    if ( backBtn ) {\n      backBtn.addEventListener("click", (event) => {\n        event.preventDefault();\n        history.back();\n      });\n    }\n    </script>\n  </body>\n</html>\n```\n\n{% endraw %}\n\n## 7) Add localized pages\n\n`src/content/en/pages/index.md`:\n\n```md\n---\ntitle: \'Hello Baseline (EN)\'\ndescription: \'English home\'\npermalink: \'/en/\'\nlayout: \'layouts/base.njk\'\ntranslationKey: \'homepage\'\n---\n\nWelcome to the English home page.\n```\n\n`src/content/nl/pages/index.md`:\n\n```md\n---\ntitle: \'Hallo Baseline (NL)\'\ndescription: \'Nederlandse home\'\npermalink: \'/nl/\'\nlayout: \'layouts/base.njk\'\ntranslationKey: \'homepage\'\n---\n\nWelkom op de Nederlandse homepagina.\n```\n\n## 8) Minimal assets (reuse from prior tutorial)\n\n- `src/assets/css/index.css` — same minimal styles as before.\n- `src/assets/js/index.js` — optional small script (e.g., DOMContentLoaded log).\n\n## 9) Run the site locally\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Visit `/en/` for English and `/nl/` for Dutch.\n- View page source to see `<link rel="alternate" hreflang="...">` entries.\n- While dev runs, Eleventy also writes to `dist/`, so you can peek at the generated files including `sitemap.xml` and per-language sitemaps like `dist/en/sitemap.xml` and `dist/nl/sitemap.xml`.\n\n## 10) Production build and inspect output\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\n- Check `dist/` for per-language output.\n- `dist/sitemap.xml` plus per-language sitemaps (e.g., `dist/en/sitemap.xml`, `dist/nl/sitemap.xml`) if multiple languages are present.\n\n## 11) Next steps\n\n- Add more pages under `src/content/en/` and `src/content/nl/` with matching `translationKey` values to link translations.\n- Localize labels (e.g., nav text) via data files keyed by `lang`.\n- Set `pathPrefix` if deploying under a subpath; ensure `site.url` is set to your production URL for correct canonicals and sitemap links.\n',
             url: '/docs/tutorial/build-a-multilingual-baseline-site/',
             outputPath: './dist/docs/tutorial/build-a-multilingual-baseline-site/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/01.tutorial/02.multilingual-site.md',
          fileSlug: '02.multilingual-site',
          filePathStem: '/content/docs/01.tutorial/02.multilingual-site',
          date: 2026-01-26T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/build-a-multilingual-baseline-site/index.html',
          url: '/docs/tutorial/build-a-multilingual-baseline-site/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/03.assets-pipeline.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '03.assets-pipeline',
             filePathStem: '/content/docs/01.tutorial/03.assets-pipeline',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nShip CSS and JS with Baseline’s built-in assets pipeline. You’ll add a CSS entry, a JS entry, run dev/build, and (optionally) inline assets in a template. Uses npm, Node 20.15.0+, and the same Baseline defaults as prior tutorials.\n\n## What you’ll build\n\n- A site that bundles `src/assets/css/index.css` via PostCSS (with Baseline’s fallback config if you don’t provide one).\n- A site that bundles `src/assets/js/index.js` via esbuild (bundled and minified).\n- Optional: inline CSS/JS in a template using Baseline filters.\n\n## Prerequisites\n\n- Node 20.15.0 (or >=20) and npm.\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n- Baseline already installed and configured as in the simple tutorial (defaults on).\n\n## 1) Ensure Baseline is loaded\n\n`eleventy.config.js` should include:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\t// Baseline\'s assets pipeline is enabled by default.\n\televentyConfig.addPlugin(baseline());\n}\n\nexport const config = baselineConfig;\n```\n\n## 2) Add a page that links assets\n\nCreate `src/content/pages/assets-quickstart.md`:\n\n```md\n---\ntitle: \'Assets Quickstart\'\ndescription: \'CSS and JS bundled by Baseline.\'\npermalink: \'/assets-quickstart/\'\nlayout: \'layouts/base.njk\'\n---\n\nCSS should style this page, and JS should log to the console. Here’s a small badge:\n\n<span class="pill">Pending</span>\n```\n\nYour base layout should already include the head links from `_data/head.js`:\n\n```js\nexport default {\n\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\tscript: [{ src: \'/assets/js/index.js\', defer: true }]\n};\n```\n\n## 3) Author the CSS entry\n\nCreate `src/assets/css/index.css`:\n\n```css\n:root {\n\tcolor-scheme: light;\n}\n\nbody {\n\tfont-family: system-ui, sans-serif;\n\tmargin: 0;\n\tpadding: 2rem;\n\tline-height: 1.5;\n\tcolor: #1f2937;\n\tbackground: #f8fafc;\n}\n\nh1 {\n\tmargin-bottom: 0.5rem;\n}\n\n.pill {\n\tdisplay: inline-block;\n\tpadding: 0.25rem 0.75rem;\n\tborder-radius: 999px;\n\tbackground: #e0f2fe;\n\tcolor: #0f172a;\n\tfont-weight: 600;\n}\n```\n\nIf you provide your own PostCSS config (e.g., `postcss.config.js`), Baseline will use it; otherwise it falls back to the built-in config.\n\n## 4) Author the JS entry\n\nCreate `src/assets/js/index.js`:\n\n```js\ndocument.addEventListener(\'DOMContentLoaded\', () => {\n\tconsole.log(\'Baseline assets: JS is loaded\');\n\tconst pill = document.querySelector(\'.pill\');\n\tif (pill) {\n\t\tpill.textContent = \'Bundled JS is running\';\n\t}\n});\n```\n\n## 5) Inline a small asset (optional)\n\nUse the inline filters with a file path; they return the `<style>`/`<script>` wrappers for you:\n\n{% raw %}\n\n```nunjucks\n{% set cssPath = _baseline.assets.input ~ "css/inline-example.css" %}\n{{ cssPath | inlinePostCSS | safe }}\n\n{% set jsPath  = _baseline.assets.input ~ "js/inline-example.js" %}\n{{ jsPath  | inlineESbuild | safe }}\n```\n\n{% endraw %}\n\n- inlinePostCSS and inlineESbuild are async filters. Use `| safe` so the generated `<style>`/`<script>` isn’t escaped.\n- Both resolve configs/build from project root and return fallback comments on error (non-fatal).\n\n## 6) Run the site locally\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open the local URL (default http://localhost:8080/). Check that styles apply and the console logs appear.\n- While dev runs, Eleventy writes to `dist/`, so you can inspect `dist/assets/css/index.css` and `dist/assets/js/index.js`.\n- Changes to common asset formats (png/jpg/webp/gif/avif/svg) under `src/assets` trigger a rebuild during `npm run dev`.\n\nReminder: Eleventy doesn’t clean `dist/`; if you rerun dev/build, clear it first (e.g., `npx rimraf dist`).\n\n## 7) Production build and inspect output\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\n- Check `dist/assets/css/index.css` (PostCSS output) and `dist/assets/js/index.js` (bundled/minified).\n\n## 8) Next steps\n\n- Add your own `postcss.config.js` to customize plugins.\n- Add more entry points if needed (e.g., section-specific `index.css` under subfolders).\n- Use `inlinePostCSS` / `inlineESbuild` selectively for critical snippets. Avoid inlining large bundles.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: [Function: permalink],
             topicSlug: 'tutorial',
             topicTitle: 'Tutorials',
             title: 'Assets Pipeline Quickstart',
             slug: 'assets-pipeline-quickstart',
             description:
              'Wire Baseline’s PostCSS and esbuild pipeline, add CSS/JS entries, inline small assets, and verify dev vs prod output with npm scripts.',
             date: 2026-04-13T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/01.tutorial/03.assets-pipeline.md',
             fileSlug: '03.assets-pipeline',
             filePathStem: '/content/docs/01.tutorial/03.assets-pipeline',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-04-13T00:00:00.000Z,
             rawInput:
              '\nShip CSS and JS with Baseline’s built-in assets pipeline. You’ll add a CSS entry, a JS entry, run dev/build, and (optionally) inline assets in a template. Uses npm, Node 20.15.0+, and the same Baseline defaults as prior tutorials.\n\n## What you’ll build\n\n- A site that bundles `src/assets/css/index.css` via PostCSS (with Baseline’s fallback config if you don’t provide one).\n- A site that bundles `src/assets/js/index.js` via esbuild (bundled and minified).\n- Optional: inline CSS/JS in a template using Baseline filters.\n\n## Prerequisites\n\n- Node 20.15.0 (or >=20) and npm.\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n- Baseline already installed and configured as in the simple tutorial (defaults on).\n\n## 1) Ensure Baseline is loaded\n\n`eleventy.config.js` should include:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\t// Baseline\'s assets pipeline is enabled by default.\n\televentyConfig.addPlugin(baseline());\n}\n\nexport const config = baselineConfig;\n```\n\n## 2) Add a page that links assets\n\nCreate `src/content/pages/assets-quickstart.md`:\n\n```md\n---\ntitle: \'Assets Quickstart\'\ndescription: \'CSS and JS bundled by Baseline.\'\npermalink: \'/assets-quickstart/\'\nlayout: \'layouts/base.njk\'\n---\n\nCSS should style this page, and JS should log to the console. Here’s a small badge:\n\n<span class="pill">Pending</span>\n```\n\nYour base layout should already include the head links from `_data/head.js`:\n\n```js\nexport default {\n\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\tscript: [{ src: \'/assets/js/index.js\', defer: true }]\n};\n```\n\n## 3) Author the CSS entry\n\nCreate `src/assets/css/index.css`:\n\n```css\n:root {\n\tcolor-scheme: light;\n}\n\nbody {\n\tfont-family: system-ui, sans-serif;\n\tmargin: 0;\n\tpadding: 2rem;\n\tline-height: 1.5;\n\tcolor: #1f2937;\n\tbackground: #f8fafc;\n}\n\nh1 {\n\tmargin-bottom: 0.5rem;\n}\n\n.pill {\n\tdisplay: inline-block;\n\tpadding: 0.25rem 0.75rem;\n\tborder-radius: 999px;\n\tbackground: #e0f2fe;\n\tcolor: #0f172a;\n\tfont-weight: 600;\n}\n```\n\nIf you provide your own PostCSS config (e.g., `postcss.config.js`), Baseline will use it; otherwise it falls back to the built-in config.\n\n## 4) Author the JS entry\n\nCreate `src/assets/js/index.js`:\n\n```js\ndocument.addEventListener(\'DOMContentLoaded\', () => {\n\tconsole.log(\'Baseline assets: JS is loaded\');\n\tconst pill = document.querySelector(\'.pill\');\n\tif (pill) {\n\t\tpill.textContent = \'Bundled JS is running\';\n\t}\n});\n```\n\n## 5) Inline a small asset (optional)\n\nUse the inline filters with a file path; they return the `<style>`/`<script>` wrappers for you:\n\n{% raw %}\n\n```nunjucks\n{% set cssPath = _baseline.assets.input ~ "css/inline-example.css" %}\n{{ cssPath | inlinePostCSS | safe }}\n\n{% set jsPath  = _baseline.assets.input ~ "js/inline-example.js" %}\n{{ jsPath  | inlineESbuild | safe }}\n```\n\n{% endraw %}\n\n- inlinePostCSS and inlineESbuild are async filters. Use `| safe` so the generated `<style>`/`<script>` isn’t escaped.\n- Both resolve configs/build from project root and return fallback comments on error (non-fatal).\n\n## 6) Run the site locally\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open the local URL (default http://localhost:8080/). Check that styles apply and the console logs appear.\n- While dev runs, Eleventy writes to `dist/`, so you can inspect `dist/assets/css/index.css` and `dist/assets/js/index.js`.\n- Changes to common asset formats (png/jpg/webp/gif/avif/svg) under `src/assets` trigger a rebuild during `npm run dev`.\n\nReminder: Eleventy doesn’t clean `dist/`; if you rerun dev/build, clear it first (e.g., `npx rimraf dist`).\n\n## 7) Production build and inspect output\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\n- Check `dist/assets/css/index.css` (PostCSS output) and `dist/assets/js/index.js` (bundled/minified).\n\n## 8) Next steps\n\n- Add your own `postcss.config.js` to customize plugins.\n- Add more entry points if needed (e.g., section-specific `index.css` under subfolders).\n- Use `inlinePostCSS` / `inlineESbuild` selectively for critical snippets. Avoid inlining large bundles.\n',
             url: '/docs/tutorial/assets-pipeline-quickstart/',
             outputPath: './dist/docs/tutorial/assets-pipeline-quickstart/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/01.tutorial/03.assets-pipeline.md',
          fileSlug: '03.assets-pipeline',
          filePathStem: '/content/docs/01.tutorial/03.assets-pipeline',
          date: 2026-04-13T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/assets-pipeline-quickstart/index.html',
          url: '/docs/tutorial/assets-pipeline-quickstart/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/04.head-seo-basics.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '04.head-seo-basics',
             filePathStem: '/content/docs/01.tutorial/04.head-seo-basics',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nAdd sensible head/SEO defaults with Baseline. You’ll set site-wide metadata, page front matter, see how `<baseline-head>` renders canonical and OG/Twitter shells, and control indexing. Uses npm, Node 20.15.0+, and the same Baseline setup as earlier tutorials.\n\n## What you’ll build\n\n- A page with proper `title` and `description`.\n- Canonical, OG, and Twitter meta generated by Baseline.\n- Noindex controls at page and site level.\n\n## Prerequisites\n\n- Baseline already installed and loaded (as in the simple tutorial).\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n- Set `site.url` to your production URL (or leave localhost for local testing).\n\n## 1) Ensure Baseline is loaded\n\n`eleventy.config.js`:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\televentyConfig.addPlugin(baseline());\n}\n\nexport const config = baselineConfig;\n```\n\n## 2) Site-wide metadata\n\nUpdate `src/_data/site.js`:\n\n```js\nexport default {\n\ttitle: \'Baseline Head Demo\',\n\ttagline: \'Head & SEO quickstart\',\n\turl: process.env.URL || \'http://localhost:8080/\',\n\tdefaultLanguage: \'en\',\n\tnoindex: false\n};\n```\n\n## 3) Head assets\n\nEnsure `src/_data/head.js` includes your bundles:\n\n```js\nexport default {\n\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\tscript: [{ src: \'/assets/js/index.js\', defer: true }]\n};\n```\n\n## 4) Layout with `<baseline-head>`\n\n`<baseline-head>` must be present inside `<head>` for Baseline to inject meta/link tags. Example:\n\n{% raw %}\n\n```nunjucks\n<!DOCTYPE html>\n<html lang="{{ lang | default(site.defaultLanguage) }}">\n  <head>\n    <baseline-head></baseline-head>\n    <meta name="color-scheme" content="light dark">\n  </head>\n  <body>\n    <main id="main">\n      {{ content | safe }}\n      {% if page.url !== "/" %}\n        <p><a id="go-back" href=""><span style="vertical-align: text-bottom;">&#8592;</span>&nbsp;Go back</a></p>\n      {% endif %}\n    </main>\n    <script>\n    const backBtn = document.getElementById("go-back");\n    if ( backBtn ) {\n      backBtn.addEventListener("click", (event) => {\n        event.preventDefault();\n        history.back();\n      });\n    }\n    </script>\n  </body>\n</html>\n```\n\n{% endraw %}\n\n## 5) Page front matter\n\nCreate `src/content/pages/head-demo.md`:\n\n```md\n---\ntitle: \'Head & SEO Demo\'\ndescription: \'A page showing Baseline head/SEO defaults.\'\npermalink: \'/head-demo/\'\nlayout: \'layouts/base.njk\'\n---\n\nThis page uses Baseline’s head defaults for canonical, OG, and Twitter meta.\n```\n\n## 6) Per-page front matter overrides (canonical + social)\n\nAdd overrides in the same page front matter:\n\n```yaml\nhead:\n  canonical: \'https://example.com/head-demo/\'\n  openGraph:\n    \'og:title\': \'Custom OG Title\'\n    \'og:image\': \'https://example.com/assets/social/og-head-demo.jpg\'\n  twitter:\n    \'twitter:title\': \'Custom Twitter Title\'\n    \'twitter:image\': \'https://example.com/assets/social/twitter-head-demo.jpg\'\n```\n\n- Canonical falls back to `page.url` → content map → `site.url` + `pathPrefix`. Supplying `canonical` is optional—add it here to see the override.\n- Use absolute URLs for social images (combine `site.url` + your path in production).\n\n## 7) Noindex (site-wide and per-page)\n\n- Set `noindex: true` in `src/_data/site.js` to suppress indexing and the sitemap entirely.\n- Per-page: set `noindex: true` in front matter to add a `robots` noindex and exclude the page from the sitemap. Use `sitemap: { ignore: true }` if you want sitemap-only exclusion.\n\n## 8) Run and inspect\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open the page (default http://localhost:8080/head-demo/).\n- View source: confirm `<baseline-head>` rendered the canonical (your override if set), OG/Twitter tags (including custom titles/images), and defaults for description/robots.\n- Check `dist/sitemap.xml` while dev runs; the page should be listed unless `noindex` is true.\n\n## 9) Production build\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\n- Inspect `dist/head-demo/index.html` for the rendered head.\n- Confirm `dist/sitemap.xml` includes or excludes the page according to `noindex`.\n\n## 10) Next steps\n\n- Set `pathPrefix` in `eleventy.config.js` if deploying under a subpath.\n- Provide real `site.url` for correct canonical/sitemap URLs in production.\n- Add social image/meta customization via your own `_data/head.js` or page data.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: [Function: permalink],
             topicSlug: 'tutorial',
             topicTitle: 'Tutorials',
             title: 'Head & SEO Basics',
             slug: 'head-and-seo-basics',
             description:
              'Set Baseline head defaults, canonical and social meta, override per page, and verify rendered tags and sitemap use the correct origins.',
             date: 2026-01-26T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/01.tutorial/04.head-seo-basics.md',
             fileSlug: '04.head-seo-basics',
             filePathStem: '/content/docs/01.tutorial/04.head-seo-basics',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-26T00:00:00.000Z,
             rawInput:
              '\nAdd sensible head/SEO defaults with Baseline. You’ll set site-wide metadata, page front matter, see how `<baseline-head>` renders canonical and OG/Twitter shells, and control indexing. Uses npm, Node 20.15.0+, and the same Baseline setup as earlier tutorials.\n\n## What you’ll build\n\n- A page with proper `title` and `description`.\n- Canonical, OG, and Twitter meta generated by Baseline.\n- Noindex controls at page and site level.\n\n## Prerequisites\n\n- Baseline already installed and loaded (as in the simple tutorial).\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n- Set `site.url` to your production URL (or leave localhost for local testing).\n\n## 1) Ensure Baseline is loaded\n\n`eleventy.config.js`:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\televentyConfig.addPlugin(baseline());\n}\n\nexport const config = baselineConfig;\n```\n\n## 2) Site-wide metadata\n\nUpdate `src/_data/site.js`:\n\n```js\nexport default {\n\ttitle: \'Baseline Head Demo\',\n\ttagline: \'Head & SEO quickstart\',\n\turl: process.env.URL || \'http://localhost:8080/\',\n\tdefaultLanguage: \'en\',\n\tnoindex: false\n};\n```\n\n## 3) Head assets\n\nEnsure `src/_data/head.js` includes your bundles:\n\n```js\nexport default {\n\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\tscript: [{ src: \'/assets/js/index.js\', defer: true }]\n};\n```\n\n## 4) Layout with `<baseline-head>`\n\n`<baseline-head>` must be present inside `<head>` for Baseline to inject meta/link tags. Example:\n\n{% raw %}\n\n```nunjucks\n<!DOCTYPE html>\n<html lang="{{ lang | default(site.defaultLanguage) }}">\n  <head>\n    <baseline-head></baseline-head>\n    <meta name="color-scheme" content="light dark">\n  </head>\n  <body>\n    <main id="main">\n      {{ content | safe }}\n      {% if page.url !== "/" %}\n        <p><a id="go-back" href=""><span style="vertical-align: text-bottom;">&#8592;</span>&nbsp;Go back</a></p>\n      {% endif %}\n    </main>\n    <script>\n    const backBtn = document.getElementById("go-back");\n    if ( backBtn ) {\n      backBtn.addEventListener("click", (event) => {\n        event.preventDefault();\n        history.back();\n      });\n    }\n    </script>\n  </body>\n</html>\n```\n\n{% endraw %}\n\n## 5) Page front matter\n\nCreate `src/content/pages/head-demo.md`:\n\n```md\n---\ntitle: \'Head & SEO Demo\'\ndescription: \'A page showing Baseline head/SEO defaults.\'\npermalink: \'/head-demo/\'\nlayout: \'layouts/base.njk\'\n---\n\nThis page uses Baseline’s head defaults for canonical, OG, and Twitter meta.\n```\n\n## 6) Per-page front matter overrides (canonical + social)\n\nAdd overrides in the same page front matter:\n\n```yaml\nhead:\n  canonical: \'https://example.com/head-demo/\'\n  openGraph:\n    \'og:title\': \'Custom OG Title\'\n    \'og:image\': \'https://example.com/assets/social/og-head-demo.jpg\'\n  twitter:\n    \'twitter:title\': \'Custom Twitter Title\'\n    \'twitter:image\': \'https://example.com/assets/social/twitter-head-demo.jpg\'\n```\n\n- Canonical falls back to `page.url` → content map → `site.url` + `pathPrefix`. Supplying `canonical` is optional—add it here to see the override.\n- Use absolute URLs for social images (combine `site.url` + your path in production).\n\n## 7) Noindex (site-wide and per-page)\n\n- Set `noindex: true` in `src/_data/site.js` to suppress indexing and the sitemap entirely.\n- Per-page: set `noindex: true` in front matter to add a `robots` noindex and exclude the page from the sitemap. Use `sitemap: { ignore: true }` if you want sitemap-only exclusion.\n\n## 8) Run and inspect\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open the page (default http://localhost:8080/head-demo/).\n- View source: confirm `<baseline-head>` rendered the canonical (your override if set), OG/Twitter tags (including custom titles/images), and defaults for description/robots.\n- Check `dist/sitemap.xml` while dev runs; the page should be listed unless `noindex` is true.\n\n## 9) Production build\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\n- Inspect `dist/head-demo/index.html` for the rendered head.\n- Confirm `dist/sitemap.xml` includes or excludes the page according to `noindex`.\n\n## 10) Next steps\n\n- Set `pathPrefix` in `eleventy.config.js` if deploying under a subpath.\n- Provide real `site.url` for correct canonical/sitemap URLs in production.\n- Add social image/meta customization via your own `_data/head.js` or page data.\n',
             url: '/docs/tutorial/head-and-seo-basics/',
             outputPath: './dist/docs/tutorial/head-and-seo-basics/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/01.tutorial/04.head-seo-basics.md',
          fileSlug: '04.head-seo-basics',
          filePathStem: '/content/docs/01.tutorial/04.head-seo-basics',
          date: 2026-01-26T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/head-and-seo-basics/index.html',
          url: '/docs/tutorial/head-and-seo-basics/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/05.debugging-navigator.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '05.debugging-navigator',
             filePathStem: '/content/docs/01.tutorial/05.debugging-navigator',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nUse Baseline’s debug helpers to inspect Eleventy data. You’ll add a page that uses `_inspect`, `_json`, and `_keys`, and optionally enable the navigator template for a full data snapshot. Keep navigator features off in production.\n\n## What you’ll build\n\n- A debug page that prints selected data using Baseline filters.\n- (Optional) A navigator page that shows a full data cascade snapshot.\n\n## Prerequisites\n\n- Baseline installed and loaded (as in previous tutorials).\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n- A sample page already exists (e.g., from the simple tutorial).\n\n## 1) Enable (or skip) the navigator template\n\nIf you want the full snapshot page for local use only, enable the navigator template. If you skip this, leave `enableNavigatorTemplate` false and continue with the filters. The debug filters work without the navigator page.\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\televentyConfig.addPlugin(\n\t\tbaseline({\n\t\t\tenableNavigatorTemplate: true // local dev only; disable for production\n\t\t})\n\t);\n}\n\nexport const config = baselineConfig;\n```\n\n## 2) Add a debug page\n\nCreate `src/content/pages/debug-playground.md`:\n\n{% raw %}\n\n```md\n---\ntitle: \'Debug Playground\'\ndescription: \'Inspect data with Baseline debug helpers.\'\npermalink: \'/debug-playground/\'\nlayout: \'layouts/base.njk\'\n---\n\n## Collections (first 3)\n\n<pre>\n{% for item in collections.all.slice(0, 3) %}\n- {{ item.url }}\n{% endfor %}\n</pre>\n\n## Page keys\n\n<pre>{{ page | _keys }}</pre>\n\n## Page data (inspect)\n\n<pre>{{ page | _inspect({ getters: true, depth: 2 }) }}</pre>\n\n## Page data (json)\n\n<pre>{{ page | _json(2) }}</pre>\n```\n\n{% endraw %}\n\n## 3) Use navigator helpers inline\n\nIf you want to see the full data/context on this page:\n\n{% raw %}\n\n```nunjucks\n<h2>Navigator snapshot (inline)</h2>\n<pre>{{ _navigator() | _inspect() }}</pre>\n```\n\n{% endraw %}\n\n`_navigator()` renders the full snapshot; `_context()` renders just the current context. This dumps a large snapshot—use only in local dev.\n\n## 4) Run and inspect\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open `/debug-playground/` to see filter output.\n- (Optional) Open the navigator virtual page. Expect verbose output; avoid exposing it publicly.\n\n## 5) Visit the navigator template (optional)\n\nWith `enableNavigatorTemplate: true`, Baseline exposes a virtual page at `/navigator-core.html`. Keep this disabled in production.\n\n## 6) Production considerations\n\n- Set `enableNavigatorTemplate: false` in production.\n- `_navigator()` and `_context()` expose the full render context and can include secrets from your data layer or environment.\n- Remove or guard `_navigator()`/`_context()` from templates you ship.\n- You can keep `_inspect`/`_json` locally for troubleshooting; avoid noisy output in production pages.\n\n## 7) Next steps\n\n- Combine with `draft: true` pages for safe local-only experiments.\n- Narrow inspection by slicing collections or selecting specific data keys.\n- Pair with sitemap/noindex controls when inspecting what will be indexed.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: [Function: permalink],
             topicSlug: 'tutorial',
             topicTitle: 'Tutorials',
             title: 'Debugging & Navigator',
             slug: 'debugging-and-navigator',
             description:
              'Use Baseline debug filters and the optional navigator to inspect Eleventy data, collections, and pages without shipping debug tools to production.',
             date: 2026-01-26T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/01.tutorial/05.debugging-navigator.md',
             fileSlug: '05.debugging-navigator',
             filePathStem: '/content/docs/01.tutorial/05.debugging-navigator',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-26T00:00:00.000Z,
             rawInput:
              '\nUse Baseline’s debug helpers to inspect Eleventy data. You’ll add a page that uses `_inspect`, `_json`, and `_keys`, and optionally enable the navigator template for a full data snapshot. Keep navigator features off in production.\n\n## What you’ll build\n\n- A debug page that prints selected data using Baseline filters.\n- (Optional) A navigator page that shows a full data cascade snapshot.\n\n## Prerequisites\n\n- Baseline installed and loaded (as in previous tutorials).\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n- A sample page already exists (e.g., from the simple tutorial).\n\n## 1) Enable (or skip) the navigator template\n\nIf you want the full snapshot page for local use only, enable the navigator template. If you skip this, leave `enableNavigatorTemplate` false and continue with the filters. The debug filters work without the navigator page.\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\televentyConfig.addPlugin(\n\t\tbaseline({\n\t\t\tenableNavigatorTemplate: true // local dev only; disable for production\n\t\t})\n\t);\n}\n\nexport const config = baselineConfig;\n```\n\n## 2) Add a debug page\n\nCreate `src/content/pages/debug-playground.md`:\n\n{% raw %}\n\n```md\n---\ntitle: \'Debug Playground\'\ndescription: \'Inspect data with Baseline debug helpers.\'\npermalink: \'/debug-playground/\'\nlayout: \'layouts/base.njk\'\n---\n\n## Collections (first 3)\n\n<pre>\n{% for item in collections.all.slice(0, 3) %}\n- {{ item.url }}\n{% endfor %}\n</pre>\n\n## Page keys\n\n<pre>{{ page | _keys }}</pre>\n\n## Page data (inspect)\n\n<pre>{{ page | _inspect({ getters: true, depth: 2 }) }}</pre>\n\n## Page data (json)\n\n<pre>{{ page | _json(2) }}</pre>\n```\n\n{% endraw %}\n\n## 3) Use navigator helpers inline\n\nIf you want to see the full data/context on this page:\n\n{% raw %}\n\n```nunjucks\n<h2>Navigator snapshot (inline)</h2>\n<pre>{{ _navigator() | _inspect() }}</pre>\n```\n\n{% endraw %}\n\n`_navigator()` renders the full snapshot; `_context()` renders just the current context. This dumps a large snapshot—use only in local dev.\n\n## 4) Run and inspect\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open `/debug-playground/` to see filter output.\n- (Optional) Open the navigator virtual page. Expect verbose output; avoid exposing it publicly.\n\n## 5) Visit the navigator template (optional)\n\nWith `enableNavigatorTemplate: true`, Baseline exposes a virtual page at `/navigator-core.html`. Keep this disabled in production.\n\n## 6) Production considerations\n\n- Set `enableNavigatorTemplate: false` in production.\n- `_navigator()` and `_context()` expose the full render context and can include secrets from your data layer or environment.\n- Remove or guard `_navigator()`/`_context()` from templates you ship.\n- You can keep `_inspect`/`_json` locally for troubleshooting; avoid noisy output in production pages.\n\n## 7) Next steps\n\n- Combine with `draft: true` pages for safe local-only experiments.\n- Narrow inspection by slicing collections or selecting specific data keys.\n- Pair with sitemap/noindex controls when inspecting what will be indexed.\n',
             url: '/docs/tutorial/debugging-and-navigator/',
             outputPath: './dist/docs/tutorial/debugging-and-navigator/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/01.tutorial/05.debugging-navigator.md',
          fileSlug: '05.debugging-navigator',
          filePathStem: '/content/docs/01.tutorial/05.debugging-navigator',
          date: 2026-01-26T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/debugging-and-navigator/index.html',
          url: '/docs/tutorial/debugging-and-navigator/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/06.sitemaps-and-drafts.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '06.sitemaps-and-drafts',
             filePathStem: '/content/docs/01.tutorial/06.sitemaps-and-drafts',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nControl sitemap output and drafts with Baseline defaults. You’ll set `site.url`, tweak per-page sitemap fields, use `noindex`, and see how `draft: true` behaves in dev vs build.\n\n## What you’ll build\n\n- Pages that appear (or are excluded) in `sitemap.xml`.\n- Per-page sitemap controls (`ignore`, `changefreq`, `priority`, `lastmod`).\n- Draft pages that render in dev but are skipped in production builds.\n\n## Prerequisites\n\n- Baseline installed and loaded (defaults keep sitemap on).\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n- Set `site.url` to your production URL for correct sitemap/canonical links (use localhost while testing).\n\n## 1) Ensure Baseline sitemap is on (default)\n\n`eleventy.config.js` with default options keeps the sitemap module enabled:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\t// Sitemap is enabled by default\n\televentyConfig.addPlugin(baseline());\n}\n\nexport const config = baselineConfig;\n```\n\n## 2) Page with sitemap controls\n\nCreate `src/content/pages/sitemap-demo.md`:\n\n```md\n---\ntitle: \'Sitemap Demo\'\ndescription: \'Control sitemap entries.\'\npermalink: \'/sitemap-demo/\'\nlayout: \'layouts/base.njk\'\nsitemap:\n  changefreq: \'weekly\'\n  priority: 0.7\n  lastmod: 2024-01-01\n---\n\nThis page stays in the sitemap with custom frequency, priority, and lastmod.\n```\n\n## 3) Noindex (site-wide and per-page)\n\n- Site-wide: set `noindex: true` in `src/_data/site.js` to skip the sitemap entirely.\n- Per-page: `noindex: true` in front matter is respected and excludes the page from the sitemap. Use `sitemap: { ignore: true }` if you want sitemap-only exclusion.\n\n  ```yaml\n  sitemap:\n    ignore: true\n  eleventyExcludeFromCollections: true\n  ```\n\n  - `sitemap: { ignore: true }` — removes it from the sitemap, page still renders.\n  - `eleventyExcludeFromCollections: true` — keeps it out of collections and thus out of the sitemap.\n\n## 4) Drafts\n\nAdd `draft: true` in front matter:\n\n```yaml\ndraft: true\n```\n\n- Dev: drafts render in `npm run dev`.\n- Build: when `ELEVENTY_RUN_MODE=build`, drafts are skipped.\n- Baseline registers a drafts preprocessor (guarded so it won’t double-register); your own preprocessor wins if you add one.\n\n## 5) Run and inspect\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open pages normally.\n- Check `dist/sitemap.xml` while dev runs (sitemap is emitted and includes drafts).\n- Draft pages render in dev and show up in the dev sitemap; they are excluded from the sitemap when you build for production (`ELEVENTY_RUN_MODE=build`).\n\n## 6) Production build\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\nThen inspect `dist/sitemap.xml`:\n\n- Pages with `sitemap.ignore: true` are excluded.\n- Site-wide noindex: true (from `src/_data/site.js`) excludes all sitemap entries.\n- Drafts (`draft: true`) are excluded (because `ELEVENTY_RUN_MODE=build` is set by the build script).\n\n## 7) Multilingual note\n\nIf multilingual is enabled, Baseline emits per-language sitemaps (e.g., `/en/sitemap.xml`, `/nl/sitemap.xml`) plus the root sitemap index. Per-page `ignore`/`noindex`/`draft` rules still apply per entry.\n\n## 8) Next steps\n\n- Keep `site.url` accurate in production; use `pathPrefix` if deploying under a subpath.\n- Adjust `changefreq`/`priority` sparingly; search engines treat them as hints.\n- Use drafts for in-progress content; remember they return in dev.\n- Set defaults in data files: `src/_data/sitemap.js` for global sitemap defaults, or directory data (e.g., `posts.11tydata.js`) to apply `sitemap` settings across a folder.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: [Function: permalink],
             topicSlug: 'tutorial',
             topicTitle: 'Tutorials',
             title: 'Sitemaps & Drafts',
             slug: 'sitemaps-and-drafts',
             description:
              'Control sitemap entries and drafts in Baseline: set per-page sitemap fields, apply noindex, and see how drafts behave in dev vs build.',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/01.tutorial/06.sitemaps-and-drafts.md',
             fileSlug: '06.sitemaps-and-drafts',
             filePathStem: '/content/docs/01.tutorial/06.sitemaps-and-drafts',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nControl sitemap output and drafts with Baseline defaults. You’ll set `site.url`, tweak per-page sitemap fields, use `noindex`, and see how `draft: true` behaves in dev vs build.\n\n## What you’ll build\n\n- Pages that appear (or are excluded) in `sitemap.xml`.\n- Per-page sitemap controls (`ignore`, `changefreq`, `priority`, `lastmod`).\n- Draft pages that render in dev but are skipped in production builds.\n\n## Prerequisites\n\n- Baseline installed and loaded (defaults keep sitemap on).\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n- Set `site.url` to your production URL for correct sitemap/canonical links (use localhost while testing).\n\n## 1) Ensure Baseline sitemap is on (default)\n\n`eleventy.config.js` with default options keeps the sitemap module enabled:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\t// Sitemap is enabled by default\n\televentyConfig.addPlugin(baseline());\n}\n\nexport const config = baselineConfig;\n```\n\n## 2) Page with sitemap controls\n\nCreate `src/content/pages/sitemap-demo.md`:\n\n```md\n---\ntitle: \'Sitemap Demo\'\ndescription: \'Control sitemap entries.\'\npermalink: \'/sitemap-demo/\'\nlayout: \'layouts/base.njk\'\nsitemap:\n  changefreq: \'weekly\'\n  priority: 0.7\n  lastmod: 2024-01-01\n---\n\nThis page stays in the sitemap with custom frequency, priority, and lastmod.\n```\n\n## 3) Noindex (site-wide and per-page)\n\n- Site-wide: set `noindex: true` in `src/_data/site.js` to skip the sitemap entirely.\n- Per-page: `noindex: true` in front matter is respected and excludes the page from the sitemap. Use `sitemap: { ignore: true }` if you want sitemap-only exclusion.\n\n  ```yaml\n  sitemap:\n    ignore: true\n  eleventyExcludeFromCollections: true\n  ```\n\n  - `sitemap: { ignore: true }` — removes it from the sitemap, page still renders.\n  - `eleventyExcludeFromCollections: true` — keeps it out of collections and thus out of the sitemap.\n\n## 4) Drafts\n\nAdd `draft: true` in front matter:\n\n```yaml\ndraft: true\n```\n\n- Dev: drafts render in `npm run dev`.\n- Build: when `ELEVENTY_RUN_MODE=build`, drafts are skipped.\n- Baseline registers a drafts preprocessor (guarded so it won’t double-register); your own preprocessor wins if you add one.\n\n## 5) Run and inspect\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open pages normally.\n- Check `dist/sitemap.xml` while dev runs (sitemap is emitted and includes drafts).\n- Draft pages render in dev and show up in the dev sitemap; they are excluded from the sitemap when you build for production (`ELEVENTY_RUN_MODE=build`).\n\n## 6) Production build\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\nThen inspect `dist/sitemap.xml`:\n\n- Pages with `sitemap.ignore: true` are excluded.\n- Site-wide noindex: true (from `src/_data/site.js`) excludes all sitemap entries.\n- Drafts (`draft: true`) are excluded (because `ELEVENTY_RUN_MODE=build` is set by the build script).\n\n## 7) Multilingual note\n\nIf multilingual is enabled, Baseline emits per-language sitemaps (e.g., `/en/sitemap.xml`, `/nl/sitemap.xml`) plus the root sitemap index. Per-page `ignore`/`noindex`/`draft` rules still apply per entry.\n\n## 8) Next steps\n\n- Keep `site.url` accurate in production; use `pathPrefix` if deploying under a subpath.\n- Adjust `changefreq`/`priority` sparingly; search engines treat them as hints.\n- Use drafts for in-progress content; remember they return in dev.\n- Set defaults in data files: `src/_data/sitemap.js` for global sitemap defaults, or directory data (e.g., `posts.11tydata.js`) to apply `sitemap` settings across a folder.\n',
             url: '/docs/tutorial/sitemaps-and-drafts/',
             outputPath: './dist/docs/tutorial/sitemaps-and-drafts/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/01.tutorial/06.sitemaps-and-drafts.md',
          fileSlug: '06.sitemaps-and-drafts',
          filePathStem: '/content/docs/01.tutorial/06.sitemaps-and-drafts',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/sitemaps-and-drafts/index.html',
          url: '/docs/tutorial/sitemaps-and-drafts/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        ... 28 more items ],
     translationsMap:
      { homepage:
         { fr:
            { title: 'Bienvenue', url: '/fr/', lang: 'fr', isDefaultLang: false, data: [Object] },
           nl:
            { title: 'Welkom', url: '/nl/', lang: 'nl', isDefaultLang: false, data: [Object] },
           en: { title: 'Welcome', url: '/', lang: 'en', isDefaultLang: true, data: [Object] } } },
     translations:
      [ { template:
           Template {
             inputPath: './src/content/fr/pages/index.html',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: 'pages',
             filePathStem: '/content/fr/pages/index',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             _stats: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           `\n{% extends "layouts/base.njk" %}\n\n{% block content %}\n\t<h1>{{ title }}</h1>\n\n\t<p>\n\t\t<strong>Eleventy Plugin Baseline</strong> prend les décisions structurelles qu'Eleventy laisse ouvertes :\n\t\tarborescence, pipeline d'assets, images, SEO, sitemaps. Vous passez la mise en place et commencez à construire.\n\t</p>\n\n\t{% alertBlock "warning" %}\n\t\t<p>Work in progress : la documentation et les API peuvent évoluer.</p>\n\t{% endalertBlock %}\n\n\t<h2>À propos</h2>\n\t<p>\n\t\tSi vous avez déjà démarré un nouveau projet Eleventy et vous êtes retrouvé à câbler les mêmes éléments pour la\n\t\ttroisième fois — arborescence, moteur de templates, formats d'image, balises meta, bundling d'assets, sitemap —\n\t\tc'est pour vous. Baseline prend ces décisions ensemble, pour qu'elles s'articulent entre elles.\n\t</p>\n\t<p>\n\t\tVotre site reste le vôtre. Baseline gère l'infrastructure. Votre design, votre contenu, ce qui fait de votre site le\n\t\tvôtre — tout ça reste à vous.\n\t</p>\n\t<p>\n\t\tLe plugin est disponible en preview sur npm. Une version stable est prévue pour\n\t\t<a href="https://github.com/11ty/eleventy/milestone/46">Eleventy 4.0</a>.\n\t</p>\n\t<p>\n\t\t<small\n\t\t\t><strong style="color: var(--color-text-muted);">Cristovao Verstraeten</strong><br /><a\n\t\t\t\thref="https://www.apleasantview.com/"\n\t\t\t\ttarget="_blank"\n\t\t\t\tstyle="display: inline-block; transform: translateY(-0.25em)"\n\t\t\t\t>a pleasant view</a\n\t\t\t></small\n\t\t>\n\t</p>\n\n\t<div style="margin-block: var(--space-xl);">\n\t\t{%\n\t\t\timage {\n\t\t\t\tsrc: "/media/example.jpg",\n\t\t\t\talt: "Photo by Rohit Choudhari on Unsplash",\n\t\t\t\tcaption: 'Photo by <a href="https://unsplash.com/@iamrohitchoudhari?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Rohit Choudhari</a> on <a href="https://unsplash.com/photos/an-abstract-image-of-a-star-shaped-object-PkrUN6pvLYM?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>',\n\t\t\t\twidths: [320, 640, 768],\n\t\t\t\tsetDimensions: false,\n\t\t\t\tstyle: "object-fit: contain;"\n\t\t\t}\n\t\t%}\n\t</div>\n\n\t<div style="padding-block: var(--space-s)"></div>\n{% endblock %}\n`,
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'fr',
             title: 'Bienvenue',
             permalink: '/fr/',
             draft: false,
             translationKey: 'homepage',
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/fr/pages/index.html',
             fileSlug: 'pages',
             filePathStem: '/content/fr/pages/index',
             outputFileExtension: 'html',
             templateSyntax: 'njk',
             date: 2026-04-28T07:59:24.214Z,
             rawInput:
              `\n{% extends "layouts/base.njk" %}\n\n{% block content %}\n\t<h1>{{ title }}</h1>\n\n\t<p>\n\t\t<strong>Eleventy Plugin Baseline</strong> prend les décisions structurelles qu'Eleventy laisse ouvertes :\n\t\tarborescence, pipeline d'assets, images, SEO, sitemaps. Vous passez la mise en place et commencez à construire.\n\t</p>\n\n\t{% alertBlock "warning" %}\n\t\t<p>Work in progress : la documentation et les API peuvent évoluer.</p>\n\t{% endalertBlock %}\n\n\t<h2>À propos</h2>\n\t<p>\n\t\tSi vous avez déjà démarré un nouveau projet Eleventy et vous êtes retrouvé à câbler les mêmes éléments pour la\n\t\ttroisième fois — arborescence, moteur de templates, formats d'image, balises meta, bundling d'assets, sitemap —\n\t\tc'est pour vous. Baseline prend ces décisions ensemble, pour qu'elles s'articulent entre elles.\n\t</p>\n\t<p>\n\t\tVotre site reste le vôtre. Baseline gère l'infrastructure. Votre design, votre contenu, ce qui fait de votre site le\n\t\tvôtre — tout ça reste à vous.\n\t</p>\n\t<p>\n\t\tLe plugin est disponible en preview sur npm. Une version stable est prévue pour\n\t\t<a href="https://github.com/11ty/eleventy/milestone/46">Eleventy 4.0</a>.\n\t</p>\n\t<p>\n\t\t<small\n\t\t\t><strong style="color: var(--color-text-muted);">Cristovao Verstraeten</strong><br /><a\n\t\t\t\thref="https://www.apleasantview.com/"\n\t\t\t\ttarget="_blank"\n\t\t\t\tstyle="display: inline-block; transform: translateY(-0.25em)"\n\t\t\t\t>a pleasant view</a\n\t\t\t></small\n\t\t>\n\t</p>\n\n\t<div style="margin-block: var(--space-xl);">\n\t\t{%\n\t\t\timage {\n\t\t\t\tsrc: "/media/example.jpg",\n\t\t\t\talt: "Photo by Rohit Choudhari on Unsplash",\n\t\t\t\tcaption: 'Photo by <a href="https://unsplash.com/@iamrohitchoudhari?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Rohit Choudhari</a> on <a href="https://unsplash.com/photos/an-abstract-image-of-a-star-shaped-object-PkrUN6pvLYM?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>',\n\t\t\t\twidths: [320, 640, 768],\n\t\t\t\tsetDimensions: false,\n\t\t\t\tstyle: "object-fit: contain;"\n\t\t\t}\n\t\t%}\n\t</div>\n\n\t<div style="padding-block: var(--space-s)"></div>\n{% endblock %}\n`,
             url: '/fr/',
             outputPath: './dist/fr/index.html',
             lang: 'fr',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/fr/pages/index.html',
          fileSlug: 'pages',
          filePathStem: '/content/fr/pages/index',
          date: 2026-04-28T07:59:24.214Z,
          outputPath: './dist/fr/index.html',
          url: '/fr/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter],
          locale: { translationKey: 'homepage', lang: 'fr', isDefaultLang: false } },
        { template:
           Template {
             inputPath: './src/content/nl/pages/index.html',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: 'pages',
             filePathStem: '/content/nl/pages/index',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             _stats: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           `\n{% extends "layouts/base.njk" %}\n\n{% block content %}\n\t<div class="u-flow">\n\t\t<h1>{{ title }}</h1>\n\t\t<p>\n\t\t\t<strong>Eleventy Plugin Baseline</strong> neemt de structurele beslissingen die Eleventy openlaat:\n\t\t\tmappenstructuur, asset pipeline, afbeeldingen, SEO, sitemaps. Je slaat de setup over en begint met bouwen.\n\t\t</p>\n\t\t{% alertBlock "warning" %}\n\t\t\t<p>Work in progress: documentatie en API's kunnen veranderen.</p>\n\t\t{% endalertBlock %}\n\t\t<h2>Over de plugin</h2>\n\t\t<p>\n\t\t\tAls je al eens een nieuw Eleventy-project bent gestart en voor de derde keer dezelfde dingen aan het aansluiten\n\t\t\twas — mappenstructuur, template engine, afbeeldingsformaten, meta tags, asset bundling, sitemap — dan is dit voor\n\t\t\tjou. Baseline neemt die beslissingen samen, zodat ze op elkaar aansluiten.\n\t\t</p>\n\t\t<p>\n\t\t\tJe behoudt de controle over je site. Baseline regelt de infrastructuur. Je ontwerp, je content, de dingen die jouw\n\t\t\tsite van jou maken — die blijven van jou.\n\t\t</p>\n\t\t<p>\n\t\t\tDe plugin is beschikbaar als preview op npm. Een stabiele release is gepland voor\n\t\t\t<a href="https://github.com/11ty/eleventy/milestone/46">Eleventy 4.0</a>.\n\t\t</p>\n\t\t<p>\n\t\t\t<small\n\t\t\t\t><strong style="color: var(--color-text-muted);">Cristovao Verstraeten</strong><br /><a\n\t\t\t\t\thref="https://www.apleasantview.com/"\n\t\t\t\t\ttarget="_blank"\n\t\t\t\t\tstyle="display: inline-block; transform: translateY(-0.25em)"\n\t\t\t\t\t>a pleasant view</a\n\t\t\t\t></small\n\t\t\t>\n\t\t</p>\n\t\t<div style="margin-block: var(--space-xl);">\n\t\t\t{%\n\t\t\t\timage {\n\t\t\t\t\tsrc: "/media/example.jpg",\n\t\t\t\t\talt: "Photo by Rohit Choudhari on Unsplash",\n\t\t\t\t\tcaption: 'Photo by <a href="https://unsplash.com/@iamrohitchoudhari?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Rohit Choudhari</a> on <a href="https://unsplash.com/photos/an-abstract-image-of-a-star-shaped-object-PkrUN6pvLYM?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>',\n\t\t\t\t\twidths: [320, 640, 768],\n\t\t\t\t\tsetDimensions: false,\n\t\t\t\t\tstyle: "object-fit: contain;"\n\t\t\t\t}\n\t\t\t%}\n\t\t</div>\n\n\t\t<div style="padding-block: var(--space-s)"></div>\n\t</div>\n{% endblock %}\n`,
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'nl',
             title: 'Welkom',
             permalink: '/nl/',
             draft: false,
             translationKey: 'homepage',
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/nl/pages/index.html',
             fileSlug: 'pages',
             filePathStem: '/content/nl/pages/index',
             outputFileExtension: 'html',
             templateSyntax: 'njk',
             date: 2026-04-28T07:59:24.214Z,
             rawInput:
              `\n{% extends "layouts/base.njk" %}\n\n{% block content %}\n\t<div class="u-flow">\n\t\t<h1>{{ title }}</h1>\n\t\t<p>\n\t\t\t<strong>Eleventy Plugin Baseline</strong> neemt de structurele beslissingen die Eleventy openlaat:\n\t\t\tmappenstructuur, asset pipeline, afbeeldingen, SEO, sitemaps. Je slaat de setup over en begint met bouwen.\n\t\t</p>\n\t\t{% alertBlock "warning" %}\n\t\t\t<p>Work in progress: documentatie en API's kunnen veranderen.</p>\n\t\t{% endalertBlock %}\n\t\t<h2>Over de plugin</h2>\n\t\t<p>\n\t\t\tAls je al eens een nieuw Eleventy-project bent gestart en voor de derde keer dezelfde dingen aan het aansluiten\n\t\t\twas — mappenstructuur, template engine, afbeeldingsformaten, meta tags, asset bundling, sitemap — dan is dit voor\n\t\t\tjou. Baseline neemt die beslissingen samen, zodat ze op elkaar aansluiten.\n\t\t</p>\n\t\t<p>\n\t\t\tJe behoudt de controle over je site. Baseline regelt de infrastructuur. Je ontwerp, je content, de dingen die jouw\n\t\t\tsite van jou maken — die blijven van jou.\n\t\t</p>\n\t\t<p>\n\t\t\tDe plugin is beschikbaar als preview op npm. Een stabiele release is gepland voor\n\t\t\t<a href="https://github.com/11ty/eleventy/milestone/46">Eleventy 4.0</a>.\n\t\t</p>\n\t\t<p>\n\t\t\t<small\n\t\t\t\t><strong style="color: var(--color-text-muted);">Cristovao Verstraeten</strong><br /><a\n\t\t\t\t\thref="https://www.apleasantview.com/"\n\t\t\t\t\ttarget="_blank"\n\t\t\t\t\tstyle="display: inline-block; transform: translateY(-0.25em)"\n\t\t\t\t\t>a pleasant view</a\n\t\t\t\t></small\n\t\t\t>\n\t\t</p>\n\t\t<div style="margin-block: var(--space-xl);">\n\t\t\t{%\n\t\t\t\timage {\n\t\t\t\t\tsrc: "/media/example.jpg",\n\t\t\t\t\talt: "Photo by Rohit Choudhari on Unsplash",\n\t\t\t\t\tcaption: 'Photo by <a href="https://unsplash.com/@iamrohitchoudhari?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Rohit Choudhari</a> on <a href="https://unsplash.com/photos/an-abstract-image-of-a-star-shaped-object-PkrUN6pvLYM?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>',\n\t\t\t\t\twidths: [320, 640, 768],\n\t\t\t\t\tsetDimensions: false,\n\t\t\t\t\tstyle: "object-fit: contain;"\n\t\t\t\t}\n\t\t\t%}\n\t\t</div>\n\n\t\t<div style="padding-block: var(--space-s)"></div>\n\t</div>\n{% endblock %}\n`,
             url: '/nl/',
             outputPath: './dist/nl/index.html',
             lang: 'nl',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/nl/pages/index.html',
          fileSlug: 'pages',
          filePathStem: '/content/nl/pages/index',
          date: 2026-04-28T07:59:24.214Z,
          outputPath: './dist/nl/index.html',
          url: '/nl/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter],
          locale: { translationKey: 'homepage', lang: 'nl', isDefaultLang: false } },
        { template:
           Template {
             inputPath: './src/content/en/pages/index.njk',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: 'pages',
             filePathStem: '/content/en/pages/index',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             _stats: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           `\n{% block content %}\n\t<p>\n\t\t<strong>Eleventy Plugin Baseline</strong> makes the structural decisions that Eleventy leaves open: directory\n\t\tlayout, asset pipeline, image handling, SEO, sitemaps. You get to skip the setup and start building.\n\t</p>\n\n\t{% alertBlock "warning" %}\n\t\t<p>Work in progress: docs and APIs may shift.</p>\n\t{% endalertBlock %}\n\n\t<h2>About</h2>\n\t<p>\n\t\tIf you've started a new Eleventy project and found yourself wiring up the same things for the third time — directory\n\t\tstructure, template engine, image formats, meta tags, asset bundling, sitemap — this is for you. Baseline makes\n\t\tthose decisions together, so they fit together.\n\t</p>\n\t<p>\n\t\tYou still own your site. Baseline handles the infrastructure. Your design, your content, the things that make your\n\t\tsite yours — those stay yours.\n\t</p>\n\t<p>\n\t\tThe plugin is available for preview on npm. A stable release is aimed for\n\t\t<a href="https://github.com/11ty/eleventy/milestone/46">Eleventy 4.0</a>.\n\t</p>\n\t<p>\n\t\t<small\n\t\t\t><strong style="color: var(--color-text-muted);">Cristovao Verstraeten</strong><br /><a\n\t\t\t\thref="https://www.apleasantview.com/"\n\t\t\t\ttarget="_blank"\n\t\t\t\tstyle="display: inline-block; transform: translateY(-0.25em)"\n\t\t\t\t>a pleasant view</a\n\t\t\t></small\n\t\t>\n\t</p>\n\n\t<div style="margin-block: var(--space-xl);">\n\t\t{%\n\t\t\timage {\n\t\t\t\tsrc: "/media/example.jpg",\n\t\t\t\talt: "Photo by Rohit Choudhari on Unsplash",\n\t\t\t\tcaption: 'Photo by <a href="https://unsplash.com/@iamrohitchoudhari?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Rohit Choudhari</a> on <a href="https://unsplash.com/photos/an-abstract-image-of-a-star-shaped-object-PkrUN6pvLYM?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>',\n\t\t\t\tloading: "eager",\n\t\t\t\twidths: [320, 578, 768],\n\t\t\t\tattrs: {\n\t\t\t\t\tfetchpriority: "high"\n\t\t\t\t},\n\t\t\t\tstyle: "object-fit: contain; height: auto;"\n\t\t\t}\n\t\t%}\n\t</div>\n{% endblock %}\n`,
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             title: 'Welcome',
             permalink: '/',
             translationKey: 'homepage',
             layout: 'layouts/page.njk',
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/en/pages/index.njk',
             fileSlug: 'pages',
             filePathStem: '/content/en/pages/index',
             outputFileExtension: 'html',
             templateSyntax: 'njk',
             date: 2026-04-28T07:59:24.214Z,
             rawInput:
              `\n{% block content %}\n\t<p>\n\t\t<strong>Eleventy Plugin Baseline</strong> makes the structural decisions that Eleventy leaves open: directory\n\t\tlayout, asset pipeline, image handling, SEO, sitemaps. You get to skip the setup and start building.\n\t</p>\n\n\t{% alertBlock "warning" %}\n\t\t<p>Work in progress: docs and APIs may shift.</p>\n\t{% endalertBlock %}\n\n\t<h2>About</h2>\n\t<p>\n\t\tIf you've started a new Eleventy project and found yourself wiring up the same things for the third time — directory\n\t\tstructure, template engine, image formats, meta tags, asset bundling, sitemap — this is for you. Baseline makes\n\t\tthose decisions together, so they fit together.\n\t</p>\n\t<p>\n\t\tYou still own your site. Baseline handles the infrastructure. Your design, your content, the things that make your\n\t\tsite yours — those stay yours.\n\t</p>\n\t<p>\n\t\tThe plugin is available for preview on npm. A stable release is aimed for\n\t\t<a href="https://github.com/11ty/eleventy/milestone/46">Eleventy 4.0</a>.\n\t</p>\n\t<p>\n\t\t<small\n\t\t\t><strong style="color: var(--color-text-muted);">Cristovao Verstraeten</strong><br /><a\n\t\t\t\thref="https://www.apleasantview.com/"\n\t\t\t\ttarget="_blank"\n\t\t\t\tstyle="display: inline-block; transform: translateY(-0.25em)"\n\t\t\t\t>a pleasant view</a\n\t\t\t></small\n\t\t>\n\t</p>\n\n\t<div style="margin-block: var(--space-xl);">\n\t\t{%\n\t\t\timage {\n\t\t\t\tsrc: "/media/example.jpg",\n\t\t\t\talt: "Photo by Rohit Choudhari on Unsplash",\n\t\t\t\tcaption: 'Photo by <a href="https://unsplash.com/@iamrohitchoudhari?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Rohit Choudhari</a> on <a href="https://unsplash.com/photos/an-abstract-image-of-a-star-shaped-object-PkrUN6pvLYM?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>',\n\t\t\t\tloading: "eager",\n\t\t\t\twidths: [320, 578, 768],\n\t\t\t\tattrs: {\n\t\t\t\t\tfetchpriority: "high"\n\t\t\t\t},\n\t\t\t\tstyle: "object-fit: contain; height: auto;"\n\t\t\t}\n\t\t%}\n\t</div>\n{% endblock %}\n`,
             url: '/',
             outputPath: './dist/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/en/pages/index.njk',
          fileSlug: 'pages',
          filePathStem: '/content/en/pages/index',
          date: 2026-04-28T07:59:24.214Z,
          outputPath: './dist/index.html',
          url: '/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter],
          locale: { translationKey: 'homepage', lang: 'en', isDefaultLang: true } } ],
     all:
      [ { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/00.index.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '00.index',
             filePathStem: '/content/docs/01.tutorial/00.index',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nBaseline tutorials to get you productive quickly: start from a simple site, then add assets, head/SEO, sitemap/drafts, images, multilingual, and social previews.\n\n{% alertBlock "info" %}\n\nThe completed tutorial site (with how-to chapters) is [available on GitHub](https://github.com/apleasantview/simple-baseline-site).\n\n{% endalertBlock %}\n\n## Index\n\n<ul>\n{%- for item in collections.docs %}\n{%- if item.data.topicSlug === topicSlug and item.url !== page.url %}\n\t<li><a href="{{ item.url }}">{{ item.data.title }}</a></li>\n{%- endif %}\n{%- endfor %}\n</ul>\n\nPrefer a checklist? See the [Docs Quickstart](/docs/quickstart/).\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: '/docs/tutorial/',
             topicSlug: 'tutorial',
             topicTitle: 'Tutorials',
             title: 'Tutorials',
             description:
              'Browse Baseline tutorials: build a simple site, assets, head/SEO, sitemaps, images, multilingual, social previews, and correct deployment URLs.',
             parent: 'docs',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/01.tutorial/00.index.md',
             fileSlug: '00.index',
             filePathStem: '/content/docs/01.tutorial/00.index',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nBaseline tutorials to get you productive quickly: start from a simple site, then add assets, head/SEO, sitemap/drafts, images, multilingual, and social previews.\n\n{% alertBlock "info" %}\n\nThe completed tutorial site (with how-to chapters) is [available on GitHub](https://github.com/apleasantview/simple-baseline-site).\n\n{% endalertBlock %}\n\n## Index\n\n<ul>\n{%- for item in collections.docs %}\n{%- if item.data.topicSlug === topicSlug and item.url !== page.url %}\n\t<li><a href="{{ item.url }}">{{ item.data.title }}</a></li>\n{%- endif %}\n{%- endfor %}\n</ul>\n\nPrefer a checklist? See the [Docs Quickstart](/docs/quickstart/).\n',
             url: '/docs/tutorial/',
             outputPath: './dist/docs/tutorial/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/01.tutorial/00.index.md',
          fileSlug: '00.index',
          filePathStem: '/content/docs/01.tutorial/00.index',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/index.html',
          url: '/docs/tutorial/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/01.simple-baseline-site.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '01.simple-baseline-site',
             filePathStem: '/content/docs/01.tutorial/01.simple-baseline-site',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nCreate a single-language Eleventy site using `@apleasantview/eleventy-plugin-baseline` with its defaults. We’ll use npm, Node 20.15.0, minimal CSS, and keep things as close to “starter” as possible.\n\n## What you’ll build\n\n- A basic Eleventy site with one page.\n- Baseline wired with default options (multilingual off, sitemap on, navigator template off).\n- A tiny stylesheet, bundled automatically via Baseline’s assets pipeline, and an auto-generated `sitemap.xml`.\n\n## Prerequisites\n\n- Node 20.15.0 (or >=20).\n- npm.\n- A terminal.\n\n## 1) Create the project\n\n```bash\nmkdir simple-baseline-site\ncd simple-baseline-site\nnpm init -y\n```\n\n- Open `package.json` and set `"type": "module"` (Baseline expects ESM). Example:\n  ```json\n  {\n  \t"name": "simple-baseline-site",\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n\n## 2) Install Eleventy, Eleventy Image and Baseline\n\n```bash\nnpm install @11ty/eleventy @apleasantview/eleventy-plugin-baseline @11ty/eleventy-img\n```\n\n## 3) Configure Eleventy to use Baseline defaults\n\nCreate `eleventy.config.js` in the project root:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\t// Defaults: verbose off, navigator off, sitemap on, multilingual off.\n\televentyConfig.addPlugin(baseline());\n}\n\nexport const config = baselineConfig;\n```\n\n`export const config = baselineConfig;` lets Eleventy pick up Baseline’s directory/default settings automatically.\n\nBaseline will configure HtmlBasePlugin to use `process.env.URL` automatically; create a local `.env` for dev, and set `URL` in your host/CI for production so links stay correct.\n\nCreate a local `.env` file now:\n\n```txt\nELEVENTY_ENV="development"\nURL="http://localhost:8080/"\n```\n\n## 4) Required site data\n\nCreate `src/_data/site.js`:\n\n```js\nexport default {\n\ttitle: \'Simple Baseline Site\',\n\ttagline: \'Hello, Eleventy + Baseline\',\n\turl: process.env.URL || \'http://localhost:8080/\',\n\tdefaultLanguage: \'en\',\n\tnoindex: false\n};\n```\n\nAdd `src/_data/head.js` so your bundled assets load:\n\n```js\nexport default {\n\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\tscript: [{ src: \'/assets/js/index.js\', defer: true }]\n};\n```\n\n## 5) Minimal layout\n\nCreate `src/_includes/layouts/base.njk`:\n\n{% raw %}\n\n```nunjucks\n<!DOCTYPE html>\n<html lang="{{ lang | default(site.defaultLanguage) }}">\n  <head>\n    <baseline-head></baseline-head>\n    <meta name="color-scheme" content="light dark">\n  </head>\n  <body>\n    <main id="main">\n      <h1>{{ title }}</h1>\n      {{ content | safe }}\n      {% if page.url !== "/" %}\n        <p><a id="go-back" href=""><span style="vertical-align: text-bottom;">&#8592;</span>&nbsp;Go back</a></p>\n      {% endif %}\n    </main>\n    <script>\n    const backBtn = document.getElementById("go-back");\n    if ( backBtn ) {\n      backBtn.addEventListener("click", (event) => {\n        event.preventDefault();\n        history.back();\n      });\n    }\n    </script>\n  </body>\n</html>\n```\n\n{% endraw %}\n\n## 6) Add a first page\n\nCreate `src/content/pages/index.md`:\n\n{% raw %}\n\n```md\n---\ntitle: \'Hello Baseline\'\ndescription: \'A minimal Eleventy page powered by eleventy-plugin-baseline.\'\npermalink: \'/\'\nlayout: \'layouts/base.njk\'\n---\n\nYou’re looking at a page rendered with Eleventy and the Baseline plugin defaults.\n\n## Index\n\n<ul class="index-links">\n{% for item in collections.all %}\n<li><a href="{{ item.url }}">{{ item.data.title }}</a></li>\n{% endfor %}\n</ul>\n```\n\n{% endraw %}\n\n## 7) Minimal assets\n\nCreate `src/assets/assets.11tydata.js` to keep assets out of collections:\n\n```js\nexport default {\n\televentyExcludeFromCollections: true\n};\n```\n\nCreate `src/assets/css/index.css`:\n\n```css\nbody {\n\tfont-family: system-ui, sans-serif;\n\tmargin: 0;\n\tpadding: 2rem;\n\tline-height: 1.5;\n\tcolor: #1f2937;\n\tbackground: #f8fafc;\n}\n\nh1 {\n\tmargin-bottom: 0.5rem;\n}\n```\n\nCreate `src/assets/js/index.js`:\n\n```js\ndocument.addEventListener(\'DOMContentLoaded\', () => {\n\tconsole.log(`Howdy!`);\n});\n```\n\n## 8) Run the site locally\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open the printed local URL (default http://localhost:8080/). You should see “Hello, Baseline.”\n- While dev runs, Eleventy also writes to `dist/`, so you can peek at the generated files (including `sitemap.xml`).\n\n{% alertBlock "info" %}\nEleventy doesn’t clean `dist/` automatically. If you rerun dev/build or when your build seems stale, clear `dist/` first (e.g., `npx rimraf dist`).\n{% endalertBlock %}\n\n## 9) Production build and inspect output\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\n- Find the built files in `dist/`.\n- `dist/sitemap.xml` is generated automatically (sitemap module is on by default).\n\n## 10) Next steps\n\n- Add more pages under `src/content/pages/` with front matter (`title`, `description`, `permalink`, `layout`).\n- If you deploy under a subpath, set `pathPrefix` in `eleventy.config.js`.\n- When you have a production URL, update `src/_data/site.js` so canonical URLs and the sitemap are correct.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: [Function: permalink],
             topicSlug: 'tutorial',
             topicTitle: 'Tutorials',
             title: 'Build a Simple Baseline Site',
             slug: 'build-a-simple-baseline-site',
             description:
              'Create a single-language Eleventy site with Baseline defaults, minimal CSS/JS, and an auto sitemap using npm and Node 20.',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/01.tutorial/01.simple-baseline-site.md',
             fileSlug: '01.simple-baseline-site',
             filePathStem: '/content/docs/01.tutorial/01.simple-baseline-site',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nCreate a single-language Eleventy site using `@apleasantview/eleventy-plugin-baseline` with its defaults. We’ll use npm, Node 20.15.0, minimal CSS, and keep things as close to “starter” as possible.\n\n## What you’ll build\n\n- A basic Eleventy site with one page.\n- Baseline wired with default options (multilingual off, sitemap on, navigator template off).\n- A tiny stylesheet, bundled automatically via Baseline’s assets pipeline, and an auto-generated `sitemap.xml`.\n\n## Prerequisites\n\n- Node 20.15.0 (or >=20).\n- npm.\n- A terminal.\n\n## 1) Create the project\n\n```bash\nmkdir simple-baseline-site\ncd simple-baseline-site\nnpm init -y\n```\n\n- Open `package.json` and set `"type": "module"` (Baseline expects ESM). Example:\n  ```json\n  {\n  \t"name": "simple-baseline-site",\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n\n## 2) Install Eleventy, Eleventy Image and Baseline\n\n```bash\nnpm install @11ty/eleventy @apleasantview/eleventy-plugin-baseline @11ty/eleventy-img\n```\n\n## 3) Configure Eleventy to use Baseline defaults\n\nCreate `eleventy.config.js` in the project root:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\t// Defaults: verbose off, navigator off, sitemap on, multilingual off.\n\televentyConfig.addPlugin(baseline());\n}\n\nexport const config = baselineConfig;\n```\n\n`export const config = baselineConfig;` lets Eleventy pick up Baseline’s directory/default settings automatically.\n\nBaseline will configure HtmlBasePlugin to use `process.env.URL` automatically; create a local `.env` for dev, and set `URL` in your host/CI for production so links stay correct.\n\nCreate a local `.env` file now:\n\n```txt\nELEVENTY_ENV="development"\nURL="http://localhost:8080/"\n```\n\n## 4) Required site data\n\nCreate `src/_data/site.js`:\n\n```js\nexport default {\n\ttitle: \'Simple Baseline Site\',\n\ttagline: \'Hello, Eleventy + Baseline\',\n\turl: process.env.URL || \'http://localhost:8080/\',\n\tdefaultLanguage: \'en\',\n\tnoindex: false\n};\n```\n\nAdd `src/_data/head.js` so your bundled assets load:\n\n```js\nexport default {\n\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\tscript: [{ src: \'/assets/js/index.js\', defer: true }]\n};\n```\n\n## 5) Minimal layout\n\nCreate `src/_includes/layouts/base.njk`:\n\n{% raw %}\n\n```nunjucks\n<!DOCTYPE html>\n<html lang="{{ lang | default(site.defaultLanguage) }}">\n  <head>\n    <baseline-head></baseline-head>\n    <meta name="color-scheme" content="light dark">\n  </head>\n  <body>\n    <main id="main">\n      <h1>{{ title }}</h1>\n      {{ content | safe }}\n      {% if page.url !== "/" %}\n        <p><a id="go-back" href=""><span style="vertical-align: text-bottom;">&#8592;</span>&nbsp;Go back</a></p>\n      {% endif %}\n    </main>\n    <script>\n    const backBtn = document.getElementById("go-back");\n    if ( backBtn ) {\n      backBtn.addEventListener("click", (event) => {\n        event.preventDefault();\n        history.back();\n      });\n    }\n    </script>\n  </body>\n</html>\n```\n\n{% endraw %}\n\n## 6) Add a first page\n\nCreate `src/content/pages/index.md`:\n\n{% raw %}\n\n```md\n---\ntitle: \'Hello Baseline\'\ndescription: \'A minimal Eleventy page powered by eleventy-plugin-baseline.\'\npermalink: \'/\'\nlayout: \'layouts/base.njk\'\n---\n\nYou’re looking at a page rendered with Eleventy and the Baseline plugin defaults.\n\n## Index\n\n<ul class="index-links">\n{% for item in collections.all %}\n<li><a href="{{ item.url }}">{{ item.data.title }}</a></li>\n{% endfor %}\n</ul>\n```\n\n{% endraw %}\n\n## 7) Minimal assets\n\nCreate `src/assets/assets.11tydata.js` to keep assets out of collections:\n\n```js\nexport default {\n\televentyExcludeFromCollections: true\n};\n```\n\nCreate `src/assets/css/index.css`:\n\n```css\nbody {\n\tfont-family: system-ui, sans-serif;\n\tmargin: 0;\n\tpadding: 2rem;\n\tline-height: 1.5;\n\tcolor: #1f2937;\n\tbackground: #f8fafc;\n}\n\nh1 {\n\tmargin-bottom: 0.5rem;\n}\n```\n\nCreate `src/assets/js/index.js`:\n\n```js\ndocument.addEventListener(\'DOMContentLoaded\', () => {\n\tconsole.log(`Howdy!`);\n});\n```\n\n## 8) Run the site locally\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open the printed local URL (default http://localhost:8080/). You should see “Hello, Baseline.”\n- While dev runs, Eleventy also writes to `dist/`, so you can peek at the generated files (including `sitemap.xml`).\n\n{% alertBlock "info" %}\nEleventy doesn’t clean `dist/` automatically. If you rerun dev/build or when your build seems stale, clear `dist/` first (e.g., `npx rimraf dist`).\n{% endalertBlock %}\n\n## 9) Production build and inspect output\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\n- Find the built files in `dist/`.\n- `dist/sitemap.xml` is generated automatically (sitemap module is on by default).\n\n## 10) Next steps\n\n- Add more pages under `src/content/pages/` with front matter (`title`, `description`, `permalink`, `layout`).\n- If you deploy under a subpath, set `pathPrefix` in `eleventy.config.js`.\n- When you have a production URL, update `src/_data/site.js` so canonical URLs and the sitemap are correct.\n',
             url: '/docs/tutorial/build-a-simple-baseline-site/',
             outputPath: './dist/docs/tutorial/build-a-simple-baseline-site/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/01.tutorial/01.simple-baseline-site.md',
          fileSlug: '01.simple-baseline-site',
          filePathStem: '/content/docs/01.tutorial/01.simple-baseline-site',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/build-a-simple-baseline-site/index.html',
          url: '/docs/tutorial/build-a-simple-baseline-site/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/06.sitemaps-and-drafts.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '06.sitemaps-and-drafts',
             filePathStem: '/content/docs/01.tutorial/06.sitemaps-and-drafts',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nControl sitemap output and drafts with Baseline defaults. You’ll set `site.url`, tweak per-page sitemap fields, use `noindex`, and see how `draft: true` behaves in dev vs build.\n\n## What you’ll build\n\n- Pages that appear (or are excluded) in `sitemap.xml`.\n- Per-page sitemap controls (`ignore`, `changefreq`, `priority`, `lastmod`).\n- Draft pages that render in dev but are skipped in production builds.\n\n## Prerequisites\n\n- Baseline installed and loaded (defaults keep sitemap on).\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n- Set `site.url` to your production URL for correct sitemap/canonical links (use localhost while testing).\n\n## 1) Ensure Baseline sitemap is on (default)\n\n`eleventy.config.js` with default options keeps the sitemap module enabled:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\t// Sitemap is enabled by default\n\televentyConfig.addPlugin(baseline());\n}\n\nexport const config = baselineConfig;\n```\n\n## 2) Page with sitemap controls\n\nCreate `src/content/pages/sitemap-demo.md`:\n\n```md\n---\ntitle: \'Sitemap Demo\'\ndescription: \'Control sitemap entries.\'\npermalink: \'/sitemap-demo/\'\nlayout: \'layouts/base.njk\'\nsitemap:\n  changefreq: \'weekly\'\n  priority: 0.7\n  lastmod: 2024-01-01\n---\n\nThis page stays in the sitemap with custom frequency, priority, and lastmod.\n```\n\n## 3) Noindex (site-wide and per-page)\n\n- Site-wide: set `noindex: true` in `src/_data/site.js` to skip the sitemap entirely.\n- Per-page: `noindex: true` in front matter is respected and excludes the page from the sitemap. Use `sitemap: { ignore: true }` if you want sitemap-only exclusion.\n\n  ```yaml\n  sitemap:\n    ignore: true\n  eleventyExcludeFromCollections: true\n  ```\n\n  - `sitemap: { ignore: true }` — removes it from the sitemap, page still renders.\n  - `eleventyExcludeFromCollections: true` — keeps it out of collections and thus out of the sitemap.\n\n## 4) Drafts\n\nAdd `draft: true` in front matter:\n\n```yaml\ndraft: true\n```\n\n- Dev: drafts render in `npm run dev`.\n- Build: when `ELEVENTY_RUN_MODE=build`, drafts are skipped.\n- Baseline registers a drafts preprocessor (guarded so it won’t double-register); your own preprocessor wins if you add one.\n\n## 5) Run and inspect\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open pages normally.\n- Check `dist/sitemap.xml` while dev runs (sitemap is emitted and includes drafts).\n- Draft pages render in dev and show up in the dev sitemap; they are excluded from the sitemap when you build for production (`ELEVENTY_RUN_MODE=build`).\n\n## 6) Production build\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\nThen inspect `dist/sitemap.xml`:\n\n- Pages with `sitemap.ignore: true` are excluded.\n- Site-wide noindex: true (from `src/_data/site.js`) excludes all sitemap entries.\n- Drafts (`draft: true`) are excluded (because `ELEVENTY_RUN_MODE=build` is set by the build script).\n\n## 7) Multilingual note\n\nIf multilingual is enabled, Baseline emits per-language sitemaps (e.g., `/en/sitemap.xml`, `/nl/sitemap.xml`) plus the root sitemap index. Per-page `ignore`/`noindex`/`draft` rules still apply per entry.\n\n## 8) Next steps\n\n- Keep `site.url` accurate in production; use `pathPrefix` if deploying under a subpath.\n- Adjust `changefreq`/`priority` sparingly; search engines treat them as hints.\n- Use drafts for in-progress content; remember they return in dev.\n- Set defaults in data files: `src/_data/sitemap.js` for global sitemap defaults, or directory data (e.g., `posts.11tydata.js`) to apply `sitemap` settings across a folder.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: [Function: permalink],
             topicSlug: 'tutorial',
             topicTitle: 'Tutorials',
             title: 'Sitemaps & Drafts',
             slug: 'sitemaps-and-drafts',
             description:
              'Control sitemap entries and drafts in Baseline: set per-page sitemap fields, apply noindex, and see how drafts behave in dev vs build.',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/01.tutorial/06.sitemaps-and-drafts.md',
             fileSlug: '06.sitemaps-and-drafts',
             filePathStem: '/content/docs/01.tutorial/06.sitemaps-and-drafts',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nControl sitemap output and drafts with Baseline defaults. You’ll set `site.url`, tweak per-page sitemap fields, use `noindex`, and see how `draft: true` behaves in dev vs build.\n\n## What you’ll build\n\n- Pages that appear (or are excluded) in `sitemap.xml`.\n- Per-page sitemap controls (`ignore`, `changefreq`, `priority`, `lastmod`).\n- Draft pages that render in dev but are skipped in production builds.\n\n## Prerequisites\n\n- Baseline installed and loaded (defaults keep sitemap on).\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n- Set `site.url` to your production URL for correct sitemap/canonical links (use localhost while testing).\n\n## 1) Ensure Baseline sitemap is on (default)\n\n`eleventy.config.js` with default options keeps the sitemap module enabled:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\t// Sitemap is enabled by default\n\televentyConfig.addPlugin(baseline());\n}\n\nexport const config = baselineConfig;\n```\n\n## 2) Page with sitemap controls\n\nCreate `src/content/pages/sitemap-demo.md`:\n\n```md\n---\ntitle: \'Sitemap Demo\'\ndescription: \'Control sitemap entries.\'\npermalink: \'/sitemap-demo/\'\nlayout: \'layouts/base.njk\'\nsitemap:\n  changefreq: \'weekly\'\n  priority: 0.7\n  lastmod: 2024-01-01\n---\n\nThis page stays in the sitemap with custom frequency, priority, and lastmod.\n```\n\n## 3) Noindex (site-wide and per-page)\n\n- Site-wide: set `noindex: true` in `src/_data/site.js` to skip the sitemap entirely.\n- Per-page: `noindex: true` in front matter is respected and excludes the page from the sitemap. Use `sitemap: { ignore: true }` if you want sitemap-only exclusion.\n\n  ```yaml\n  sitemap:\n    ignore: true\n  eleventyExcludeFromCollections: true\n  ```\n\n  - `sitemap: { ignore: true }` — removes it from the sitemap, page still renders.\n  - `eleventyExcludeFromCollections: true` — keeps it out of collections and thus out of the sitemap.\n\n## 4) Drafts\n\nAdd `draft: true` in front matter:\n\n```yaml\ndraft: true\n```\n\n- Dev: drafts render in `npm run dev`.\n- Build: when `ELEVENTY_RUN_MODE=build`, drafts are skipped.\n- Baseline registers a drafts preprocessor (guarded so it won’t double-register); your own preprocessor wins if you add one.\n\n## 5) Run and inspect\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open pages normally.\n- Check `dist/sitemap.xml` while dev runs (sitemap is emitted and includes drafts).\n- Draft pages render in dev and show up in the dev sitemap; they are excluded from the sitemap when you build for production (`ELEVENTY_RUN_MODE=build`).\n\n## 6) Production build\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\nThen inspect `dist/sitemap.xml`:\n\n- Pages with `sitemap.ignore: true` are excluded.\n- Site-wide noindex: true (from `src/_data/site.js`) excludes all sitemap entries.\n- Drafts (`draft: true`) are excluded (because `ELEVENTY_RUN_MODE=build` is set by the build script).\n\n## 7) Multilingual note\n\nIf multilingual is enabled, Baseline emits per-language sitemaps (e.g., `/en/sitemap.xml`, `/nl/sitemap.xml`) plus the root sitemap index. Per-page `ignore`/`noindex`/`draft` rules still apply per entry.\n\n## 8) Next steps\n\n- Keep `site.url` accurate in production; use `pathPrefix` if deploying under a subpath.\n- Adjust `changefreq`/`priority` sparingly; search engines treat them as hints.\n- Use drafts for in-progress content; remember they return in dev.\n- Set defaults in data files: `src/_data/sitemap.js` for global sitemap defaults, or directory data (e.g., `posts.11tydata.js`) to apply `sitemap` settings across a folder.\n',
             url: '/docs/tutorial/sitemaps-and-drafts/',
             outputPath: './dist/docs/tutorial/sitemaps-and-drafts/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/01.tutorial/06.sitemaps-and-drafts.md',
          fileSlug: '06.sitemaps-and-drafts',
          filePathStem: '/content/docs/01.tutorial/06.sitemaps-and-drafts',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/sitemaps-and-drafts/index.html',
          url: '/docs/tutorial/sitemaps-and-drafts/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/07.custom-social-previews.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '07.custom-social-previews',
             filePathStem: '/content/docs/01.tutorial/07.custom-social-previews',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nAdd custom Open Graph and Twitter meta using Baseline. You’ll set site-wide defaults and override per page, then verify the rendered `<head>`. Uses npm, Node 20.15.0+, and the same Baseline setup as earlier tutorials.\n\n## What you’ll build\n\n- Site-wide OG/Twitter defaults (title/description/image).\n- A page that overrides the social title/description/image.\n- A checklist to confirm rendered tags.\n\n## Prerequisites\n\n- Baseline installed and loaded.\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n- Set `site.url` to your production URL when you deploy (localhost is fine while testing).\n\n## 1) Ensure Baseline is loaded\n\n`eleventy.config.js`:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\televentyConfig.addPlugin(baseline());\n}\n\nexport const config = baselineConfig;\n```\n\n## 2) Set site-wide social defaults\n\nIn `src/_data/head.js`, use `openGraph` and `twitter` objects:\n\n```js\nexport default {\n\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\tscript: [{ src: \'/assets/js/index.js\', defer: true }],\n\topenGraph: {\n\t\t\'og:title\': \'Baseline Starter\',\n\t\t\'og:description\': \'An Eleventy site using Baseline\',\n\t\t\'og:type\': \'website\',\n\t\t\'og:image\': \'https://example.com/assets/social/default-og.jpg\'\n\t},\n\ttwitter: {\n\t\t\'twitter:card\': \'summary_large_image\',\n\t\t\'twitter:title\': \'Baseline Starter\',\n\t\t\'twitter:description\': \'An Eleventy site using Baseline\',\n\t\t\'twitter:image\': \'\',\n\t\t\'twitter:site\': \'@yoursite\',\n\t\t\'twitter:creator\': \'@yoursite\'\n\t}\n};\n```\n\n## 3) Create a page with overrides\n\nCreate `src/content/pages/social-demo.md`:\n\n```md\n---\ntitle: \'Custom Social Preview\'\ndescription: \'This page overrides social meta.\'\npermalink: \'/social-demo/\'\nlayout: \'layouts/base.njk\'\nhead:\n  openGraph:\n    \'og:title\': \'Custom OG Title\'\n    \'og:description\': \'Custom OG description for this page.\'\n    \'og:image\': \'https://example.com/assets/social/custom-og.jpg\'\n  twitter:\n    \'twitter:card\': \'summary_large_image\'\n    \'twitter:title\': \'Custom Twitter Title\'\n    \'twitter:description\': \'Custom Twitter description.\'\n    \'twitter:image\': \'https://example.com/assets/social/custom-twitter.jpg\'\n---\n\nThis page sets its own OG/Twitter meta instead of using the defaults.\n```\n\n## 4) Run and verify\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open `/social-demo/`, view source, and confirm:\n  - `<meta property="og:title" ...>` / `og:description` / `og:image` match the page overrides.\n  - `<meta name="twitter:card" ...>` plus `twitter:title` / `twitter:description` / `twitter:image` are present.\n- Build to double-check:\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\n- Inspect `dist/social-demo/index.html` to confirm the overrides are rendered.\n\n## 5) Tips\n\n- Use absolute URLs for social images (`site.url` + path in production).\n- Keep image dimensions suitable for social sharing (e.g., ~1200×630).\n- If you skip per-page fields, Baseline falls back to site-wide defaults from `_data/head.js`.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: [Function: permalink],
             topicSlug: 'tutorial',
             topicTitle: 'Tutorials',
             title: 'Custom Social Previews',
             slug: 'custom-social-previews',
             description:
              'Set global and per-page Open Graph and Twitter meta in Baseline, use absolute social images, and confirm rendered tags in dev and build.',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/01.tutorial/07.custom-social-previews.md',
             fileSlug: '07.custom-social-previews',
             filePathStem: '/content/docs/01.tutorial/07.custom-social-previews',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nAdd custom Open Graph and Twitter meta using Baseline. You’ll set site-wide defaults and override per page, then verify the rendered `<head>`. Uses npm, Node 20.15.0+, and the same Baseline setup as earlier tutorials.\n\n## What you’ll build\n\n- Site-wide OG/Twitter defaults (title/description/image).\n- A page that overrides the social title/description/image.\n- A checklist to confirm rendered tags.\n\n## Prerequisites\n\n- Baseline installed and loaded.\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n- Set `site.url` to your production URL when you deploy (localhost is fine while testing).\n\n## 1) Ensure Baseline is loaded\n\n`eleventy.config.js`:\n\n```js\nimport baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n/** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\nexport default async function (eleventyConfig) {\n\televentyConfig.addPlugin(baseline());\n}\n\nexport const config = baselineConfig;\n```\n\n## 2) Set site-wide social defaults\n\nIn `src/_data/head.js`, use `openGraph` and `twitter` objects:\n\n```js\nexport default {\n\tlink: [{ rel: \'stylesheet\', href: \'/assets/css/index.css\' }],\n\tscript: [{ src: \'/assets/js/index.js\', defer: true }],\n\topenGraph: {\n\t\t\'og:title\': \'Baseline Starter\',\n\t\t\'og:description\': \'An Eleventy site using Baseline\',\n\t\t\'og:type\': \'website\',\n\t\t\'og:image\': \'https://example.com/assets/social/default-og.jpg\'\n\t},\n\ttwitter: {\n\t\t\'twitter:card\': \'summary_large_image\',\n\t\t\'twitter:title\': \'Baseline Starter\',\n\t\t\'twitter:description\': \'An Eleventy site using Baseline\',\n\t\t\'twitter:image\': \'\',\n\t\t\'twitter:site\': \'@yoursite\',\n\t\t\'twitter:creator\': \'@yoursite\'\n\t}\n};\n```\n\n## 3) Create a page with overrides\n\nCreate `src/content/pages/social-demo.md`:\n\n```md\n---\ntitle: \'Custom Social Preview\'\ndescription: \'This page overrides social meta.\'\npermalink: \'/social-demo/\'\nlayout: \'layouts/base.njk\'\nhead:\n  openGraph:\n    \'og:title\': \'Custom OG Title\'\n    \'og:description\': \'Custom OG description for this page.\'\n    \'og:image\': \'https://example.com/assets/social/custom-og.jpg\'\n  twitter:\n    \'twitter:card\': \'summary_large_image\'\n    \'twitter:title\': \'Custom Twitter Title\'\n    \'twitter:description\': \'Custom Twitter description.\'\n    \'twitter:image\': \'https://example.com/assets/social/custom-twitter.jpg\'\n---\n\nThis page sets its own OG/Twitter meta instead of using the defaults.\n```\n\n## 4) Run and verify\n\n```bash\nnpx rimraf dist/ && npm run dev\n```\n\n- Open `/social-demo/`, view source, and confirm:\n  - `<meta property="og:title" ...>` / `og:description` / `og:image` match the page overrides.\n  - `<meta name="twitter:card" ...>` plus `twitter:title` / `twitter:description` / `twitter:image` are present.\n- Build to double-check:\n\n```bash\nnpx rimraf dist/ && npm run build\n```\n\n- Inspect `dist/social-demo/index.html` to confirm the overrides are rendered.\n\n## 5) Tips\n\n- Use absolute URLs for social images (`site.url` + path in production).\n- Keep image dimensions suitable for social sharing (e.g., ~1200×630).\n- If you skip per-page fields, Baseline falls back to site-wide defaults from `_data/head.js`.\n',
             url: '/docs/tutorial/custom-social-previews/',
             outputPath: './dist/docs/tutorial/custom-social-previews/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/01.tutorial/07.custom-social-previews.md',
          fileSlug: '07.custom-social-previews',
          filePathStem: '/content/docs/01.tutorial/07.custom-social-previews',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/custom-social-previews/index.html',
          url: '/docs/tutorial/custom-social-previews/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/01.tutorial/08.deployment-url-checks.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '08.deployment-url-checks',
             filePathStem: '/content/docs/01.tutorial/08.deployment-url-checks',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nKeep your URLs correct across dev, preview, and production so canonicals, sitemaps, and social tags never leak `localhost`. Uses npm, Node 20.15.0+, and the Baseline setup from earlier tutorials.\n\n## What you’ll build\n\n- A Baseline site that reads the right origin for each environment.\n- Canonical, sitemap, and social URLs pointed at the expected domain (or preview).\n\n## Prerequisites\n\n- Baseline installed and loaded.\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n\n## 1) Set site.url (and optionally pathPrefix)\n\nIn `src/_data/site.js`:\n\n```js\nexport default {\n\ttitle: \'Simple Baseline Site\',\n\ttagline: \'Correct URLs across dev/preview/prod\',\n\turl: process.env.URL || \'http://localhost:8080/\', // override per env\n\tdefaultLanguage: \'en\',\n\tnoindex: false\n};\n```\n\n- Use `pathPrefix` in `eleventy.config.js` if deploying under a subpath (e.g., `/my-site/`). Baseline head/sitemap will respect it.\n\n## 2) Set environment URLs (local and CI)\n\n- Dev/preview: create a local `.env` (don’t commit it):\n  ```txt\n  ELEVENTY_ENV="development"\n  URL="http://localhost:8080/"\n  ```\n- Production: set `URL` in your hosting/CI environment to the live origin (e.g., `https://example.com`).\n- Previews (optional, e.g., Netlify): `URL` usually points to production; `DEPLOY_URL` / `DEPLOY_PRIME_URL` point to the preview. Baseline falls back to those when `URL` is missing. If you don’t use preview builds, you can skip these.\n- Baseline loads `dotenv`, so `process.env.URL` is available in `site.js` and `eleventy.config.js`. The HTML base tag and sitemap use this value (plus `pathPrefix` if set).\n\n## 3) Run with the right URL per environment\n\n- Dev/preview: ensure your `.env` is loaded (e.g., `URL=http://localhost:8080`), then:\n  ```bash\n  npx rimraf dist/ && npm run dev\n  ```\n- Production: set `URL` in hosting/CI to the live origin (not an inline shell export), then:\n  ```bash\n  npx rimraf dist/ && npm run build\n  ```\n- Verify the rendered pages use the expected origin in canonical, sitemap, and social tags.\n\n## 4) Preview builds (optional)\n\n- On Netlify, `DEPLOY_URL` / `DEPLOY_PRIME_URL` provide the preview origin; `URL` is also set to the live site for production. Other hosts differ — set an equivalent preview URL env var for staging.\n- Verify the rendered canonical and sitemap root match the preview domain.\n\n## 5) Verify outputs\n\n- View source: check `<link rel="canonical">` and OG/Twitter URLs — no `localhost` when `URL` is set.\n- Inspect `dist/sitemap.xml` (and per-language sitemaps if multilingual): URLs should start with the expected origin (plus `pathPrefix` if used).\n\n## 6) PathPrefix checklist (if applicable)\n\n- In `eleventy.config.js`, set `pathPrefix` to your subpath (e.g., `/docs/`).\n- Ensure assets/links/canonicals/sitemaps use the prefixed paths; rebuild and verify.\n\n## 7) Next steps\n\n- Pair with the social previews tutorial to ensure social images use absolute URLs.\n- Add a CI check that fails builds if `URL` is missing for production.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: [Function: permalink],
             topicSlug: 'tutorial',
             topicTitle: 'Tutorials',
             title: 'Deployment URL Checks',
             slug: 'deployment-url-checks',
             description:
              'Keep canonical, sitemap, and social URLs correct across dev, preview, and production by setting URL/pathPrefix envs and verifying output.',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/01.tutorial/08.deployment-url-checks.md',
             fileSlug: '08.deployment-url-checks',
             filePathStem: '/content/docs/01.tutorial/08.deployment-url-checks',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nKeep your URLs correct across dev, preview, and production so canonicals, sitemaps, and social tags never leak `localhost`. Uses npm, Node 20.15.0+, and the Baseline setup from earlier tutorials.\n\n## What you’ll build\n\n- A Baseline site that reads the right origin for each environment.\n- Canonical, sitemap, and social URLs pointed at the expected domain (or preview).\n\n## Prerequisites\n\n- Baseline installed and loaded.\n- `package.json` with `"type": "module"` and scripts:\n  ```json\n  {\n  \t"type": "module",\n  \t"scripts": {\n  \t\t"dev": "npx @11ty/eleventy --serve",\n  \t\t"build": "npx @11ty/eleventy"\n  \t}\n  }\n  ```\n\n## 1) Set site.url (and optionally pathPrefix)\n\nIn `src/_data/site.js`:\n\n```js\nexport default {\n\ttitle: \'Simple Baseline Site\',\n\ttagline: \'Correct URLs across dev/preview/prod\',\n\turl: process.env.URL || \'http://localhost:8080/\', // override per env\n\tdefaultLanguage: \'en\',\n\tnoindex: false\n};\n```\n\n- Use `pathPrefix` in `eleventy.config.js` if deploying under a subpath (e.g., `/my-site/`). Baseline head/sitemap will respect it.\n\n## 2) Set environment URLs (local and CI)\n\n- Dev/preview: create a local `.env` (don’t commit it):\n  ```txt\n  ELEVENTY_ENV="development"\n  URL="http://localhost:8080/"\n  ```\n- Production: set `URL` in your hosting/CI environment to the live origin (e.g., `https://example.com`).\n- Previews (optional, e.g., Netlify): `URL` usually points to production; `DEPLOY_URL` / `DEPLOY_PRIME_URL` point to the preview. Baseline falls back to those when `URL` is missing. If you don’t use preview builds, you can skip these.\n- Baseline loads `dotenv`, so `process.env.URL` is available in `site.js` and `eleventy.config.js`. The HTML base tag and sitemap use this value (plus `pathPrefix` if set).\n\n## 3) Run with the right URL per environment\n\n- Dev/preview: ensure your `.env` is loaded (e.g., `URL=http://localhost:8080`), then:\n  ```bash\n  npx rimraf dist/ && npm run dev\n  ```\n- Production: set `URL` in hosting/CI to the live origin (not an inline shell export), then:\n  ```bash\n  npx rimraf dist/ && npm run build\n  ```\n- Verify the rendered pages use the expected origin in canonical, sitemap, and social tags.\n\n## 4) Preview builds (optional)\n\n- On Netlify, `DEPLOY_URL` / `DEPLOY_PRIME_URL` provide the preview origin; `URL` is also set to the live site for production. Other hosts differ — set an equivalent preview URL env var for staging.\n- Verify the rendered canonical and sitemap root match the preview domain.\n\n## 5) Verify outputs\n\n- View source: check `<link rel="canonical">` and OG/Twitter URLs — no `localhost` when `URL` is set.\n- Inspect `dist/sitemap.xml` (and per-language sitemaps if multilingual): URLs should start with the expected origin (plus `pathPrefix` if used).\n\n## 6) PathPrefix checklist (if applicable)\n\n- In `eleventy.config.js`, set `pathPrefix` to your subpath (e.g., `/docs/`).\n- Ensure assets/links/canonicals/sitemaps use the prefixed paths; rebuild and verify.\n\n## 7) Next steps\n\n- Pair with the social previews tutorial to ensure social images use absolute URLs.\n- Add a CI check that fails builds if `URL` is missing for production.\n',
             url: '/docs/tutorial/deployment-url-checks/',
             outputPath: './dist/docs/tutorial/deployment-url-checks/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/01.tutorial/08.deployment-url-checks.md',
          fileSlug: '08.deployment-url-checks',
          filePathStem: '/content/docs/01.tutorial/08.deployment-url-checks',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/tutorial/deployment-url-checks/index.html',
          url: '/docs/tutorial/deployment-url-checks/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/02.how-to/00.index.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '00.index',
             filePathStem: '/content/docs/02.how-to/00.index',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nRecipe-style guides for Baseline. Pick the task you need and follow the steps.\n\n## Index\n\n<ul>\n{%- for item in collections.docs %}\n{%- if item.data.topicSlug === topicSlug and item.url !== page.url %}\n\t<li><a href="{{ item.url }}">{{ item.data.title }}</a></li>\n{%- endif %}\n{%- endfor %}\n</ul>\n\nPrefer a quickstart? See the [Docs Quickstart](/docs/quickstart/).\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: '/docs/how-to/',
             topicSlug: 'how-to',
             topicTitle: 'How-To’s',
             title: 'How-To’s',
             description:
              'Recipe-style guides for Baseline: social previews, PostCSS, esbuild, subpaths, image transform, multilingual index, CI/publish, and Base Blog integration.',
             parent: 'docs',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/02.how-to/00.index.md',
             fileSlug: '00.index',
             filePathStem: '/content/docs/02.how-to/00.index',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nRecipe-style guides for Baseline. Pick the task you need and follow the steps.\n\n## Index\n\n<ul>\n{%- for item in collections.docs %}\n{%- if item.data.topicSlug === topicSlug and item.url !== page.url %}\n\t<li><a href="{{ item.url }}">{{ item.data.title }}</a></li>\n{%- endif %}\n{%- endfor %}\n</ul>\n\nPrefer a quickstart? See the [Docs Quickstart](/docs/quickstart/).\n',
             url: '/docs/how-to/',
             outputPath: './dist/docs/how-to/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/02.how-to/00.index.md',
          fileSlug: '00.index',
          filePathStem: '/content/docs/02.how-to/00.index',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/how-to/index.html',
          url: '/docs/how-to/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/02.how-to/01.social-previews-checklist.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '01.social-previews-checklist',
             filePathStem: '/content/docs/02.how-to/01.social-previews-checklist',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nSet Open Graph and Twitter meta with global defaults and per-page overrides. Keep social images absolute (use `site.url` or your CDN) to avoid `localhost` in previews. This is a quick checklist; for the full walkthrough, see the tutorial “Custom Social Previews.”\n\n## Prerequisites\n\n- Baseline installed and loaded; `site.url` set via `.env`/environment for builds.\n- `package.json` with `"type": "module"` and scripts (`dev`, `build`); `@11ty/eleventy-img` already installed if you generate images separately.\n\n## Steps\n\n<div class="c-docs-steps">\n\n1. Set global defaults in `src/_data/head.js` (OG/Twitter title, description, image).\n2. Override per page in front matter under `head.openGraph` / `head.twitter`.\n3. Use absolute URLs for images (combine `site.url` + path).\n4. Verify: dev/build, view source for `og:*` and `twitter:*`, confirm canonical origin.\n\n</div>\n\n## Notes\n\n- Keep titles/descriptions concise; supply card-appropriate image dimensions (e.g., ~1200×630).\n- Per-page `head` overrides win over `_data/head.js`; use absolute URLs for images.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: [Function: permalink],
             topicSlug: 'how-to',
             topicTitle: 'How-To’s',
             title: 'Social Previews Checklist',
             slug: 'social-previews-checklist',
             description:
              'Quick checklist to set global and per-page Open Graph and Twitter meta in Baseline, using absolute social images and verifying tags after build.',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/02.how-to/01.social-previews-checklist.md',
             fileSlug: '01.social-previews-checklist',
             filePathStem: '/content/docs/02.how-to/01.social-previews-checklist',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nSet Open Graph and Twitter meta with global defaults and per-page overrides. Keep social images absolute (use `site.url` or your CDN) to avoid `localhost` in previews. This is a quick checklist; for the full walkthrough, see the tutorial “Custom Social Previews.”\n\n## Prerequisites\n\n- Baseline installed and loaded; `site.url` set via `.env`/environment for builds.\n- `package.json` with `"type": "module"` and scripts (`dev`, `build`); `@11ty/eleventy-img` already installed if you generate images separately.\n\n## Steps\n\n<div class="c-docs-steps">\n\n1. Set global defaults in `src/_data/head.js` (OG/Twitter title, description, image).\n2. Override per page in front matter under `head.openGraph` / `head.twitter`.\n3. Use absolute URLs for images (combine `site.url` + path).\n4. Verify: dev/build, view source for `og:*` and `twitter:*`, confirm canonical origin.\n\n</div>\n\n## Notes\n\n- Keep titles/descriptions concise; supply card-appropriate image dimensions (e.g., ~1200×630).\n- Per-page `head` overrides win over `_data/head.js`; use absolute URLs for images.\n',
             url: '/docs/how-to/social-previews-checklist/',
             outputPath: './dist/docs/how-to/social-previews-checklist/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/02.how-to/01.social-previews-checklist.md',
          fileSlug: '01.social-previews-checklist',
          filePathStem: '/content/docs/02.how-to/01.social-previews-checklist',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/how-to/social-previews-checklist/index.html',
          url: '/docs/how-to/social-previews-checklist/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/02.how-to/02.custom-postcss-config.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '02.custom-postcss-config',
             filePathStem: '/content/docs/02.how-to/02.custom-postcss-config',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nProvide your own `postcss.config.js` to override Baseline’s fallback. Keep cssnano for production only, add or remove plugins as needed, and verify the output.\n\n## Prerequisites\n\n- Baseline installed and loaded; assets pipeline enabled.\n- `src/assets/css/index.css` exists as the entry.\n- `package.json` with `"type": "module"` and scripts (`dev`, `build`).\n\n## Steps\n\n<div class="c-docs-steps">\n\n1. Install PostCSS and the plugins you plan to use:\n\n   ```bash\n   npm install postcss postcss-import postcss-preset-env cssnano postcss-mixins\n   ```\n\n   Baseline ships fallback plugins, but when you provide your own `postcss.config.js`, bring the plugins as explicit dependencies.\n\n2. Add `postcss.config.js` at the project root:\n\n   ```js\n   import postcssImport from \'postcss-import\';\n   import postcssMixins from \'postcss-mixins\';\n   import postcssPresetEnv from \'postcss-preset-env\';\n   import cssnano from \'cssnano\';\n\n   const isProd = process.env.ELEVENTY_ENV === \'production\';\n\n   const plugins = [postcssImport(), postcssMixins(), postcssPresetEnv({ stage: 1 })];\n\n   if (isProd) {\n   \tplugins.push(cssnano({ preset: \'default\' }));\n   }\n\n   /** @type {import(\'postcss-load-config\').Config} */\n   export default {\n   \tmap: isProd ? false : { inline: true },\n   \tplugins\n   };\n   ```\n\n3. Exercise the config in your CSS (imports and mixins):\n\n   `src/assets/css/base.css`:\n\n   ```css\n   :root {\n   \tcolor-scheme: light;\n   }\n\n   body {\n   \tfont-family: system-ui, sans-serif;\n   \tmargin: 0;\n   \tpadding: 2rem;\n   \tline-height: 1.5;\n   \tcolor: #1f2937;\n   \tbackground: #f8fafc;\n   }\n\n   h1 {\n   \tmargin-bottom: 0.5rem;\n   }\n\n   .pill {\n   \tdisplay: inline-block;\n   \tpadding: 0.25rem 0.75rem;\n   \tborder-radius: 999px;\n   \tbackground: #e0f2fe;\n   \tcolor: #0f172a;\n   \tfont-weight: 600;\n   }\n   ```\n\n   `src/assets/css/mixins.css`:\n\n   ```css\n   @define-mixin linksMixin {\n   \tcolor: #0f172a;\n   \ttext-decoration: underline;\n   \ttext-decoration-color: #fc35b9;\n   \ttext-decoration-thickness: 2px;\n   \ttext-underline-offset: 3px;\n   \tfont-weight: 600;\n   }\n   ```\n\n   `src/assets/css/links.css`:\n\n   ```css\n   a {\n   \t@mixin linksMixin;\n   }\n\n   a:hover {\n   \tcolor: #fc35b9;\n   }\n   ```\n\n   `src/assets/css/index.css`:\n\n   ```css\n   @import \'./base.css\';\n   @import \'./mixins.css\';\n   @import \'./links.css\';\n   ```\n\n4. Run and inspect.\n   - Dev: `npx rimraf dist/ && npm run dev`\n   - Build: `npx rimraf dist/ && npm run build`\n   - Check `dist/assets/css/index.css`:\n     - Dev: expanded CSS with mapped imports; no minification.\n     - Prod: minified (cssnano), imports flattened, custom media resolved.\n\n</div>\n\n## Notes\n\n- Your `postcss.config.js` fully overrides Baseline’s fallback. Keep the entry file at `src/assets/css/index.css`; add partials via imports.\n- Add/remove plugins as needed (e.g., purge/RTL/lightningcss). Use env guards to keep dev output readable and prod output optimized.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: [Function: permalink],
             topicSlug: 'how-to',
             topicTitle: 'How-To’s',
             title: 'Custom PostCSS Config',
             slug: 'custom-postcss-config',
             description:
              'Override Baseline fallback with your own postcss.config.js, install plugins, use imports and mixins, and verify dev vs production CSS output.',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/02.how-to/02.custom-postcss-config.md',
             fileSlug: '02.custom-postcss-config',
             filePathStem: '/content/docs/02.how-to/02.custom-postcss-config',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nProvide your own `postcss.config.js` to override Baseline’s fallback. Keep cssnano for production only, add or remove plugins as needed, and verify the output.\n\n## Prerequisites\n\n- Baseline installed and loaded; assets pipeline enabled.\n- `src/assets/css/index.css` exists as the entry.\n- `package.json` with `"type": "module"` and scripts (`dev`, `build`).\n\n## Steps\n\n<div class="c-docs-steps">\n\n1. Install PostCSS and the plugins you plan to use:\n\n   ```bash\n   npm install postcss postcss-import postcss-preset-env cssnano postcss-mixins\n   ```\n\n   Baseline ships fallback plugins, but when you provide your own `postcss.config.js`, bring the plugins as explicit dependencies.\n\n2. Add `postcss.config.js` at the project root:\n\n   ```js\n   import postcssImport from \'postcss-import\';\n   import postcssMixins from \'postcss-mixins\';\n   import postcssPresetEnv from \'postcss-preset-env\';\n   import cssnano from \'cssnano\';\n\n   const isProd = process.env.ELEVENTY_ENV === \'production\';\n\n   const plugins = [postcssImport(), postcssMixins(), postcssPresetEnv({ stage: 1 })];\n\n   if (isProd) {\n   \tplugins.push(cssnano({ preset: \'default\' }));\n   }\n\n   /** @type {import(\'postcss-load-config\').Config} */\n   export default {\n   \tmap: isProd ? false : { inline: true },\n   \tplugins\n   };\n   ```\n\n3. Exercise the config in your CSS (imports and mixins):\n\n   `src/assets/css/base.css`:\n\n   ```css\n   :root {\n   \tcolor-scheme: light;\n   }\n\n   body {\n   \tfont-family: system-ui, sans-serif;\n   \tmargin: 0;\n   \tpadding: 2rem;\n   \tline-height: 1.5;\n   \tcolor: #1f2937;\n   \tbackground: #f8fafc;\n   }\n\n   h1 {\n   \tmargin-bottom: 0.5rem;\n   }\n\n   .pill {\n   \tdisplay: inline-block;\n   \tpadding: 0.25rem 0.75rem;\n   \tborder-radius: 999px;\n   \tbackground: #e0f2fe;\n   \tcolor: #0f172a;\n   \tfont-weight: 600;\n   }\n   ```\n\n   `src/assets/css/mixins.css`:\n\n   ```css\n   @define-mixin linksMixin {\n   \tcolor: #0f172a;\n   \ttext-decoration: underline;\n   \ttext-decoration-color: #fc35b9;\n   \ttext-decoration-thickness: 2px;\n   \ttext-underline-offset: 3px;\n   \tfont-weight: 600;\n   }\n   ```\n\n   `src/assets/css/links.css`:\n\n   ```css\n   a {\n   \t@mixin linksMixin;\n   }\n\n   a:hover {\n   \tcolor: #fc35b9;\n   }\n   ```\n\n   `src/assets/css/index.css`:\n\n   ```css\n   @import \'./base.css\';\n   @import \'./mixins.css\';\n   @import \'./links.css\';\n   ```\n\n4. Run and inspect.\n   - Dev: `npx rimraf dist/ && npm run dev`\n   - Build: `npx rimraf dist/ && npm run build`\n   - Check `dist/assets/css/index.css`:\n     - Dev: expanded CSS with mapped imports; no minification.\n     - Prod: minified (cssnano), imports flattened, custom media resolved.\n\n</div>\n\n## Notes\n\n- Your `postcss.config.js` fully overrides Baseline’s fallback. Keep the entry file at `src/assets/css/index.css`; add partials via imports.\n- Add/remove plugins as needed (e.g., purge/RTL/lightningcss). Use env guards to keep dev output readable and prod output optimized.\n',
             url: '/docs/how-to/custom-postcss-config/',
             outputPath: './dist/docs/how-to/custom-postcss-config/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/02.how-to/02.custom-postcss-config.md',
          fileSlug: '02.custom-postcss-config',
          filePathStem: '/content/docs/02.how-to/02.custom-postcss-config',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/how-to/custom-postcss-config/index.html',
          url: '/docs/how-to/custom-postcss-config/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/02.how-to/03.custom-esbuild-targets.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '03.custom-esbuild-targets',
             filePathStem: '/content/docs/02.how-to/03.custom-esbuild-targets',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nAdd multiple JS entrypoints, decide when to inline vs bundle, and override esbuild targets/minify for Baseline’s JS pipeline.\n\n## Prerequisites\n\n- Baseline installed and loaded; assets pipeline enabled.\n- Default JS entry at `src/assets/js/index.js` exists.\n- `package.json` with `"type": "module"` and scripts (`dev`, `build`).\n\n## Steps\n\n<div class="c-docs-steps">\n\n1. Install and set esbuild version explicitly.\n\n   While Baseline ships with esbuild as dependency, you might want to fix your esbuild version as recommended in its documentation.\n\n   ```bash\n   npm install --save-exact --save-dev esbuild\n   ```\n\n2. Add additional entrypoints.\n\n   Create more `index.js` files under `src/assets/js/`. Each folder becomes a bundle in `dist/assets/js/`:\n\n   ```bash\n   mkdir -p src/assets/js/home src/assets/js/about\n   echo "console.log(\'home bundle\');" > src/assets/js/home/index.js\n   echo "console.log(\'about bundle\');" > src/assets/js/about/index.js\n   ```\n\n   Reference them in templates:\n\n   Example\n\n   ```md\n   ---\n   title: \'Hello Baseline\'\n   description: \'A minimal Eleventy page powered by eleventy-plugin-baseline.\'\n   permalink: \'/\'\n   layout: \'layouts/base.njk\'\n   head:\n     script:\n       - src: \'/assets/js/home/index.js\'\n         defer: true\n   ---\n   ```\n\n3. Inline a small script (keep requests low).\n\n   For tiny helpers, inline the bundled output with the built-in filter:\n\n   {% raw %}\n\n   ```nunjucks\n   {% set jsPath  = _baseline.assets.input ~ "js/about/index.js" %}\n   {{ jsPath | inlineESbuild | safe }}\n   ```\n\n   {% endraw %}\n\n   This bundles + minifies that file with esbuild target `es2020` and injects a `<script>…</script>` tag.\n\n4. Set default target/minify for all bundles.\n\n   Pass options to Baseline when you register it:\n\n   ```js\n   import baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n   /** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\n   export default async function (eleventyConfig) {\n   \televentyConfig.addPlugin(\n   \t\tbaseline({\n   \t\t\tassetsESBuild: {\n   \t\t\t\tminify: process.env.ELEVENTY_ENV === \'production\',\n   \t\t\t\ttarget: \'es2017\'\n   \t\t\t}\n   \t\t})\n   \t);\n   }\n\n   export const config = baselineConfig;\n   ```\n\n5. Override target/minify for a specific inline script.\n\n   For a one-off override, pass options directly to the built-in inline filter (options merge with your defaults from `assetsESBuild`):\n\n   {% raw %}\n\n   ```nunjucks\n   {% set jsPath  = _baseline.assets.input ~ "js/about/index.js" %}\n   {{ jsPath | inlineESbuild({ minify: false, target: "es2018" }) | safe }}\n   ```\n\n   {% endraw %}\n\n6. Verify.\n   - Dev: `npx rimraf dist/ && npm run dev`\n   - Build: `npx rimraf dist/ && npm run build`\n   - Check `dist/assets/js/**/index.js` for bundled output and size.\n   - For inlined scripts, view page source and confirm the bundled code is present.\n\n</div>\n\n## Notes\n\n- Baseline’s default JS bundling: any `index.js` under `src/assets/js/**/` is bundled, minified, and targeted to `es2020`.\n- Use inline only for small helpers; keep larger bundles as external files for caching.\n- When you override globally, you own updates to targets/minification; revisit if you change browser support.\n- If you often need different inline settings, write your own filter that calls `inlineESbuild` with preset options, then use that filter instead of repeating the options object.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: [Function: permalink],
             topicSlug: 'how-to',
             topicTitle: 'How-To’s',
             title: 'Custom Esbuild Targets',
             slug: 'custom-esbuild-targets',
             description:
              'Add multiple JS entrypoints, choose when to inline, and set esbuild target/minify defaults or per-inline overrides in Baseline.',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/02.how-to/03.custom-esbuild-targets.md',
             fileSlug: '03.custom-esbuild-targets',
             filePathStem: '/content/docs/02.how-to/03.custom-esbuild-targets',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nAdd multiple JS entrypoints, decide when to inline vs bundle, and override esbuild targets/minify for Baseline’s JS pipeline.\n\n## Prerequisites\n\n- Baseline installed and loaded; assets pipeline enabled.\n- Default JS entry at `src/assets/js/index.js` exists.\n- `package.json` with `"type": "module"` and scripts (`dev`, `build`).\n\n## Steps\n\n<div class="c-docs-steps">\n\n1. Install and set esbuild version explicitly.\n\n   While Baseline ships with esbuild as dependency, you might want to fix your esbuild version as recommended in its documentation.\n\n   ```bash\n   npm install --save-exact --save-dev esbuild\n   ```\n\n2. Add additional entrypoints.\n\n   Create more `index.js` files under `src/assets/js/`. Each folder becomes a bundle in `dist/assets/js/`:\n\n   ```bash\n   mkdir -p src/assets/js/home src/assets/js/about\n   echo "console.log(\'home bundle\');" > src/assets/js/home/index.js\n   echo "console.log(\'about bundle\');" > src/assets/js/about/index.js\n   ```\n\n   Reference them in templates:\n\n   Example\n\n   ```md\n   ---\n   title: \'Hello Baseline\'\n   description: \'A minimal Eleventy page powered by eleventy-plugin-baseline.\'\n   permalink: \'/\'\n   layout: \'layouts/base.njk\'\n   head:\n     script:\n       - src: \'/assets/js/home/index.js\'\n         defer: true\n   ---\n   ```\n\n3. Inline a small script (keep requests low).\n\n   For tiny helpers, inline the bundled output with the built-in filter:\n\n   {% raw %}\n\n   ```nunjucks\n   {% set jsPath  = _baseline.assets.input ~ "js/about/index.js" %}\n   {{ jsPath | inlineESbuild | safe }}\n   ```\n\n   {% endraw %}\n\n   This bundles + minifies that file with esbuild target `es2020` and injects a `<script>…</script>` tag.\n\n4. Set default target/minify for all bundles.\n\n   Pass options to Baseline when you register it:\n\n   ```js\n   import baseline, { config as baselineConfig } from \'@apleasantview/eleventy-plugin-baseline\';\n\n   /** @param {import("@11ty/eleventy").UserConfig} eleventyConfig */\n   export default async function (eleventyConfig) {\n   \televentyConfig.addPlugin(\n   \t\tbaseline({\n   \t\t\tassetsESBuild: {\n   \t\t\t\tminify: process.env.ELEVENTY_ENV === \'production\',\n   \t\t\t\ttarget: \'es2017\'\n   \t\t\t}\n   \t\t})\n   \t);\n   }\n\n   export const config = baselineConfig;\n   ```\n\n5. Override target/minify for a specific inline script.\n\n   For a one-off override, pass options directly to the built-in inline filter (options merge with your defaults from `assetsESBuild`):\n\n   {% raw %}\n\n   ```nunjucks\n   {% set jsPath  = _baseline.assets.input ~ "js/about/index.js" %}\n   {{ jsPath | inlineESbuild({ minify: false, target: "es2018" }) | safe }}\n   ```\n\n   {% endraw %}\n\n6. Verify.\n   - Dev: `npx rimraf dist/ && npm run dev`\n   - Build: `npx rimraf dist/ && npm run build`\n   - Check `dist/assets/js/**/index.js` for bundled output and size.\n   - For inlined scripts, view page source and confirm the bundled code is present.\n\n</div>\n\n## Notes\n\n- Baseline’s default JS bundling: any `index.js` under `src/assets/js/**/` is bundled, minified, and targeted to `es2020`.\n- Use inline only for small helpers; keep larger bundles as external files for caching.\n- When you override globally, you own updates to targets/minification; revisit if you change browser support.\n- If you often need different inline settings, write your own filter that calls `inlineESbuild` with preset options, then use that filter instead of repeating the options object.\n',
             url: '/docs/how-to/custom-esbuild-targets/',
             outputPath: './dist/docs/how-to/custom-esbuild-targets/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/02.how-to/03.custom-esbuild-targets.md',
          fileSlug: '03.custom-esbuild-targets',
          filePathStem: '/content/docs/02.how-to/03.custom-esbuild-targets',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/how-to/custom-esbuild-targets/index.html',
          url: '/docs/how-to/custom-esbuild-targets/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        { template:
           Template {
             inputPath: './src/content/docs/02.how-to/04.deploy-under-subpath.md',
             parsed: [Object],
             extraOutputSubdirectory: '',
             templateData: [TemplateData],
             fileSlug: [TemplateFileSlug],
             fileSlugStr: '04.deploy-under-subpath',
             filePathStem: '/content/docs/02.how-to/04.deploy-under-subpath',
             linters: [],
             transforms: [Object],
             isVerbose: true,
             isDryRun: false,
             writeCount: 0,
             outputFormat: 'fs',
             behavior: [TemplateBehavior],
             renderCount: 0,
             _dataCache: [Promise],
             inputContent: [Promise],
             readingPromise: [Promise],
             _frontMatterDataCache: [Promise],
             computedData: [ComputedData],
             _usePermalinkRoot: undefined },
          rawInput:
           '\nServe your Baseline site from a subpath (e.g., `/docs/`) and keep links, assets, canonical URLs, and sitemap correct.\n\n## Prerequisites\n\n- Baseline installed; assets pipeline enabled.\n- `site.url` set to the production origin (no trailing slash, no subpath).\n- You deploy to a subpath (e.g., GitHub Pages project site, reverse proxy, Netlify subdir).\n\n## Steps\n\n<div class="c-docs-steps">\n\n1. Set `pathPrefix` in Eleventy config.\n\n   In `eleventy.config.js`, keep `site.url` to the origin and set `pathPrefix` to the subpath:\n\n   ```js\n   import baseline, { config as baselineConfig } from \'./_baseline/eleventy.config.js\';\n\n   export default async function (eleventyConfig) {\n   \televentyConfig.addPlugin(baseline());\n   }\n\n   export const config = {\n   \t...baselineConfig,\n   \tpathPrefix: \'/docs/\' // include leading/trailing slash\n   };\n   ```\n\n   Eleventy rewrites root-relative URLs with `pathPrefix`, and Baseline’s head/sitemap modules read it via Eleventy.\n\n2. Keep `site.url` clean (origin only).\n\n   In `src/_data/site.js`, use the origin only (no subpath). Canonicals and sitemap combine `site.url` + `pathPrefix` automatically:\n\n   ```js\n   export default {\n   \ttitle: \'My Site\',\n   \ttagline: \'My Site Tagline\',\n   \turl: process.env.URL || \'http://localhost:8080/\', // no /docs here\n   \tdefaultLanguage: \'en\',\n   \tnoindex: false\n   };\n   ```\n\n3. Use root-relative asset/page links.\n\n   Reference built assets and pages with leading slashes so Eleventy applies `pathPrefix`:\n\n   {% raw %}\n\n   ```nunjucks\n   <link rel="stylesheet" href="/assets/css/index.css">\n   <script src="/assets/js/index.js" defer></script>\n   <a href="/docs/getting-started/">Docs home</a>\n   ```\n\n   {% endraw %}\n\n   Avoid hardcoded full URLs with the subpath baked in.\n\n4. Build and inspect outputs.\n   - Dev: `npx rimraf dist/ && npm run dev`\n   - Build: `npx rimraf dist/ && npm run build`\n   - Check `dist/sitemap.xml` and confirm URLs include `/docs/`.\n   - Inspect a built page for `<link rel="canonical">` and asset URLs that include `/docs/`.\n\n5. Preview with the subpath.\n   - Serve `dist/` from a subpath-capable server or use Eleventy’s preview with `--pathprefix="/docs/"` to spot broken links.\n   - Click through pages and assets to confirm everything resolves under `/docs/`.\n\n</div>\n\n## Notes\n\n- Don’t append the subpath to `site.url`; use `pathPrefix` for the path segment.\n- If you move back to root hosting, clear `pathPrefix` to avoid double paths.\n- Watch for hardcoded absolute URLs; prefer root-relative so Eleventy can rewrite with `pathPrefix`.\n\n## Common pitfalls\n\n- Mixing subpath into `site.url` and also setting `pathPrefix` → double `/docs/docs/` in links and sitemap.\n- Hardcoded absolute URLs (e.g., `https://example.com/docs/...`) that won’t rewrite; use root-relative.\n- Missing leading slash on assets/links (`assets/js/index.js` instead of `/assets/js/index.js`) prevents `pathPrefix` from applying.\n- Building without `pathPrefix` and then deploying under a subpath breaks links; build/preview with the same `pathPrefix` you plan to deploy.\n',
          groupNumber: 0,
          data:
           { helpers: [Object],
             settings: [Object],
             _baseline: [Object],
             _assets: {},
             _head: {},
             _multilang: {},
             _navigator: {},
             _sitemap: {},
             _snapshot: [Object],
             _pageContext: [Object],
             eleventyComputed: [Object],
             eleventy: [Object],
             pkg: [Object],
             lang: 'en',
             layout: 'layouts/page.njk',
             random: 'Random string',
             permalink: [Function: permalink],
             topicSlug: 'how-to',
             topicTitle: 'How-To’s',
             title: 'Deploy Under a Subpath',
             slug: 'deploy-under-a-subpath',
             description:
              'Serve your Baseline site from a subpath: set pathPrefix, keep site.url clean, use root-relative links, and verify sitemap/canonicals.',
             date: 2026-01-25T00:00:00.000Z,
             page: [Object],
             collections: [Circular *1] },
          page:
           { inputPath: './src/content/docs/02.how-to/04.deploy-under-subpath.md',
             fileSlug: '04.deploy-under-subpath',
             filePathStem: '/content/docs/02.how-to/04.deploy-under-subpath',
             outputFileExtension: 'html',
             templateSyntax: 'njk,md',
             date: 2026-01-25T00:00:00.000Z,
             rawInput:
              '\nServe your Baseline site from a subpath (e.g., `/docs/`) and keep links, assets, canonical URLs, and sitemap correct.\n\n## Prerequisites\n\n- Baseline installed; assets pipeline enabled.\n- `site.url` set to the production origin (no trailing slash, no subpath).\n- You deploy to a subpath (e.g., GitHub Pages project site, reverse proxy, Netlify subdir).\n\n## Steps\n\n<div class="c-docs-steps">\n\n1. Set `pathPrefix` in Eleventy config.\n\n   In `eleventy.config.js`, keep `site.url` to the origin and set `pathPrefix` to the subpath:\n\n   ```js\n   import baseline, { config as baselineConfig } from \'./_baseline/eleventy.config.js\';\n\n   export default async function (eleventyConfig) {\n   \televentyConfig.addPlugin(baseline());\n   }\n\n   export const config = {\n   \t...baselineConfig,\n   \tpathPrefix: \'/docs/\' // include leading/trailing slash\n   };\n   ```\n\n   Eleventy rewrites root-relative URLs with `pathPrefix`, and Baseline’s head/sitemap modules read it via Eleventy.\n\n2. Keep `site.url` clean (origin only).\n\n   In `src/_data/site.js`, use the origin only (no subpath). Canonicals and sitemap combine `site.url` + `pathPrefix` automatically:\n\n   ```js\n   export default {\n   \ttitle: \'My Site\',\n   \ttagline: \'My Site Tagline\',\n   \turl: process.env.URL || \'http://localhost:8080/\', // no /docs here\n   \tdefaultLanguage: \'en\',\n   \tnoindex: false\n   };\n   ```\n\n3. Use root-relative asset/page links.\n\n   Reference built assets and pages with leading slashes so Eleventy applies `pathPrefix`:\n\n   {% raw %}\n\n   ```nunjucks\n   <link rel="stylesheet" href="/assets/css/index.css">\n   <script src="/assets/js/index.js" defer></script>\n   <a href="/docs/getting-started/">Docs home</a>\n   ```\n\n   {% endraw %}\n\n   Avoid hardcoded full URLs with the subpath baked in.\n\n4. Build and inspect outputs.\n   - Dev: `npx rimraf dist/ && npm run dev`\n   - Build: `npx rimraf dist/ && npm run build`\n   - Check `dist/sitemap.xml` and confirm URLs include `/docs/`.\n   - Inspect a built page for `<link rel="canonical">` and asset URLs that include `/docs/`.\n\n5. Preview with the subpath.\n   - Serve `dist/` from a subpath-capable server or use Eleventy’s preview with `--pathprefix="/docs/"` to spot broken links.\n   - Click through pages and assets to confirm everything resolves under `/docs/`.\n\n</div>\n\n## Notes\n\n- Don’t append the subpath to `site.url`; use `pathPrefix` for the path segment.\n- If you move back to root hosting, clear `pathPrefix` to avoid double paths.\n- Watch for hardcoded absolute URLs; prefer root-relative so Eleventy can rewrite with `pathPrefix`.\n\n## Common pitfalls\n\n- Mixing subpath into `site.url` and also setting `pathPrefix` → double `/docs/docs/` in links and sitemap.\n- Hardcoded absolute URLs (e.g., `https://example.com/docs/...`) that won’t rewrite; use root-relative.\n- Missing leading slash on assets/links (`assets/js/index.js` instead of `/assets/js/index.js`) prevents `pathPrefix` from applying.\n- Building without `pathPrefix` and then deploying under a subpath breaks links; build/preview with the same `pathPrefix` you plan to deploy.\n',
             url: '/docs/how-to/deploy-under-a-subpath/',
             outputPath: './dist/docs/how-to/deploy-under-a-subpath/index.html',
             lang: 'en',
             locale: [Object],
             sitemap: [Object] },
          inputPath: './src/content/docs/02.how-to/04.deploy-under-subpath.md',
          fileSlug: '04.deploy-under-subpath',
          filePathStem: '/content/docs/02.how-to/04.deploy-under-subpath',
          date: 2026-01-25T00:00:00.000Z,
          outputPath: './dist/docs/how-to/deploy-under-a-subpath/index.html',
          url: '/docs/how-to/deploy-under-a-subpath/',
          templateContent: [Getter/Setter],
          content: [Getter/Setter] },
        ... 31 more items ] } }
globals
{ range: [Function: range],
  cycler: [Function: cycler],
  joiner: [Function: joiner],
  date: { toUTCISO: [Function: toUTCISO] },
  _runtime: [Function: fn],
  _ctx: [Function: fn] }