@janga/norna 0.7.2 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/README.md +16 -16
  2. package/bin/norna-cli.mjs +12 -7
  3. package/docs/README.md +10 -11
  4. package/docs/commands.md +8 -8
  5. package/docs/configuration.md +13 -145
  6. package/docs/content.md +17 -15
  7. package/docs/design/command-organization.md +55 -55
  8. package/docs/design/site-examples-structure.md +2 -2
  9. package/docs/engine-development.md +5 -5
  10. package/docs/getting-started.md +19 -26
  11. package/docs/images-and-metadata.md +1 -1
  12. package/docs/local-development.md +2 -2
  13. package/docs/publishing.md +1 -1
  14. package/docs/routes.md +2 -2
  15. package/docs/site-structure.md +8 -7
  16. package/docs/theme.md +149 -7
  17. package/docs/typography.md +47 -28
  18. package/examples/dog-gallery/.astro/collections/site.schema.json +802 -0
  19. package/examples/dog-gallery/.astro/collections/theme.schema.json +714 -0
  20. package/examples/dog-gallery/.astro/content-assets.mjs +4 -0
  21. package/examples/dog-gallery/.astro/content-modules.mjs +1 -0
  22. package/examples/dog-gallery/.astro/content.d.ts +175 -0
  23. package/examples/dog-gallery/.astro/data-store.json +1 -0
  24. package/examples/dog-gallery/.astro/dev-local.json +8 -0
  25. package/examples/dog-gallery/.astro/dev.json +13 -0
  26. package/examples/dog-gallery/.astro/dev.log +49 -0
  27. package/examples/dog-gallery/.astro/settings.json +5 -0
  28. package/examples/dog-gallery/.astro/types.d.ts +2 -0
  29. package/examples/dog-gallery/dist/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js +1 -0
  30. package/examples/dog-gallery/dist/_astro/SitePage.BFHZm5UG.css +1 -0
  31. package/examples/dog-gallery/dist/dog-care/index.html +15 -0
  32. package/examples/dog-gallery/dist/favicon.svg +7 -0
  33. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1080.webp +0 -0
  34. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1440.webp +0 -0
  35. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1536.webp +0 -0
  36. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-480.webp +0 -0
  37. package/examples/dog-gallery/dist/images/generated/black-dogs/black-puppy-meadow-7255e3d9-768.webp +0 -0
  38. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-480.webp +0 -0
  39. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-768.webp +0 -0
  40. package/examples/dog-gallery/dist/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-960.webp +0 -0
  41. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1080.webp +0 -0
  42. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1440.webp +0 -0
  43. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-1920.webp +0 -0
  44. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-3939.webp +0 -0
  45. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-480.webp +0 -0
  46. package/examples/dog-gallery/dist/images/generated/brown-dogs/brown-dog-50ef114e-768.webp +0 -0
  47. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1080.webp +0 -0
  48. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1440.webp +0 -0
  49. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1920.webp +0 -0
  50. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-2400.webp +0 -0
  51. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-480.webp +0 -0
  52. package/examples/dog-gallery/dist/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-768.webp +0 -0
  53. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1080.webp +0 -0
  54. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1440.webp +0 -0
  55. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-1600.webp +0 -0
  56. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-480.webp +0 -0
  57. package/examples/dog-gallery/dist/images/generated/golden-dogs/golden-retriever-f797fd88-768.webp +0 -0
  58. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1080.webp +0 -0
  59. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1440.webp +0 -0
  60. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1920.webp +0 -0
  61. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-2576.webp +0 -0
  62. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-480.webp +0 -0
  63. package/examples/dog-gallery/dist/images/generated/golden-dogs/toller-puppy-a2a8fbc0-768.webp +0 -0
  64. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1080.webp +0 -0
  65. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-1277.webp +0 -0
  66. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-480.webp +0 -0
  67. package/examples/dog-gallery/dist/images/generated/white-dogs/white-cute-dog-077a0689-768.webp +0 -0
  68. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1080.webp +0 -0
  69. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1440.webp +0 -0
  70. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1536.webp +0 -0
  71. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-480.webp +0 -0
  72. package/examples/dog-gallery/dist/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-768.webp +0 -0
  73. package/examples/dog-gallery/dist/index.html +43 -0
  74. package/examples/dog-gallery/dist/robots.txt +2 -0
  75. package/examples/dog-gallery/node_modules/.vite/deps/_metadata.json +74 -0
  76. package/examples/dog-gallery/node_modules/.vite/deps/astro-D_GIpJIE.js +434 -0
  77. package/examples/dog-gallery/node_modules/.vite/deps/astro-D_GIpJIE.js.map +1 -0
  78. package/examples/dog-gallery/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  79. package/examples/dog-gallery/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  80. package/examples/dog-gallery/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  81. package/examples/dog-gallery/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  82. package/examples/dog-gallery/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  83. package/examples/dog-gallery/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  84. package/examples/dog-gallery/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  85. package/examples/dog-gallery/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  86. package/examples/dog-gallery/node_modules/.vite/deps/audit-DM9Hkl5B.js +1534 -0
  87. package/examples/dog-gallery/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +1 -0
  88. package/examples/dog-gallery/node_modules/.vite/deps/highlight-DnZ1ULOL.js +48 -0
  89. package/examples/dog-gallery/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +1 -0
  90. package/examples/dog-gallery/node_modules/.vite/deps/icons-RyebKi45.js +42 -0
  91. package/examples/dog-gallery/node_modules/.vite/deps/icons-RyebKi45.js.map +1 -0
  92. package/examples/dog-gallery/node_modules/.vite/deps/package.json +3 -0
  93. package/examples/dog-gallery/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  94. package/examples/dog-gallery/node_modules/.vite/deps/settings-DaU-gNnK.js +190 -0
  95. package/examples/dog-gallery/node_modules/.vite/deps/settings-DaU-gNnK.js.map +1 -0
  96. package/examples/dog-gallery/node_modules/.vite/deps/toolbar-63PA619H.js +458 -0
  97. package/examples/dog-gallery/node_modules/.vite/deps/toolbar-63PA619H.js.map +1 -0
  98. package/examples/dog-gallery/node_modules/.vite/deps/ui-library--bkcNSYz.js +1016 -0
  99. package/examples/dog-gallery/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +1 -0
  100. package/examples/dog-gallery/node_modules/.vite/deps/window-jPkpKVcy.js +32 -0
  101. package/examples/dog-gallery/node_modules/.vite/deps/window-jPkpKVcy.js.map +1 -0
  102. package/examples/dog-gallery/node_modules/.vite/deps/xray-BXCHpEJP.js +111 -0
  103. package/examples/dog-gallery/node_modules/.vite/deps/xray-BXCHpEJP.js.map +1 -0
  104. package/examples/dog-gallery/site/config.mjs +12 -42
  105. package/examples/dog-gallery/site/content.md +27 -5
  106. package/examples/dog-gallery/site/routes/dog-care/route-content.md +17 -3
  107. package/examples/dog-gallery/site/theme.md +85 -26
  108. package/fixtures/basic/site/config.mjs +2 -22
  109. package/fixtures/basic/site/content.md +1 -1
  110. package/fixtures/basic/site/theme.md +7 -3
  111. package/package.json +3 -3
  112. package/scripts/check-config.mjs +3 -3
  113. package/scripts/deploy-site.mjs +3 -3
  114. package/scripts/init-site.mjs +10 -8
  115. package/scripts/lib/frontmatter-yaml.mjs +85 -0
  116. package/scripts/lib/presentation.mjs +10 -11
  117. package/scripts/lib/project-config.mjs +91 -45
  118. package/scripts/lib/site-content.mjs +20 -2
  119. package/scripts/lib/theme-config.mjs +34 -0
  120. package/scripts/lib/typography.mjs +100 -20
  121. package/scripts/show-typography.mjs +58 -154
  122. package/scripts/sync-content-sections.mjs +6 -6
  123. package/scripts/test-content-check.mjs +3 -4
  124. package/scripts/test-engine-commands.mjs +2 -2
  125. package/scripts/test-package-check.mjs +17 -16
  126. package/scripts/test-temporary-visibility.mjs +2 -3
  127. package/src/components/SitePage.astro +2 -3
  128. package/src/components/SiteSection.astro +39 -5
  129. package/src/content.config.ts +60 -2
  130. package/src/layouts/BaseLayout.astro +17 -0
  131. package/src/styles/global.css +54 -50
  132. package/starters/basic/README.md +10 -15
  133. package/starters/basic/package.json +2 -2
  134. package/starters/basic/site/config.mjs +3 -24
  135. package/starters/basic/site/content.md +40 -7
  136. package/starters/basic/site/theme.md +110 -17
  137. package/starters/project/.github/workflows/deploy.yml +65 -0
  138. package/starters/project/README.md +72 -0
  139. package/starters/project/package-lock.json +4296 -0
  140. package/starters/project/package.json +35 -0
  141. package/starters/project/site/config.mjs +43 -0
  142. package/starters/project/site/content.md +88 -0
  143. package/starters/project/site/public/robots.txt +2 -0
  144. package/starters/project/site/routes/guide/route-content.md +58 -0
  145. package/starters/project/site/theme.md +15 -0
@@ -0,0 +1,43 @@
1
+ <!DOCTYPE html><html lang="en" style="scroll-behavior: smooth; --font-sans: Arial, 'Helvetica Neue', Helvetica, sans-serif; --page-width: 2048px; --content-gutter-desktop: clamp(1.25rem, 4vw, 3rem); --content-gutter-mobile: 16px; --space-nav-to-first-section-desktop: clamp(1.25rem, 2.5vw, 2rem); --space-nav-to-first-section-mobile: 1rem; --space-section-title-to-body-desktop: 0.55rem; --space-section-title-to-body-mobile: 0.45rem; --space-section-body-to-gallery-desktop: 1.25rem; --space-section-body-to-gallery-mobile: 1rem; --space-gallery-item-desktop: clamp(1.25rem, 2.8vw, 2rem); --space-gallery-item-mobile: 1.8rem; --space-section-to-section-desktop: clamp(1.8rem, 3vw, 2.75rem); --space-section-to-section-mobile: 1.65rem; --space-final-section-bottom-desktop: clamp(1.8rem, 3vw, 2.75rem); --space-final-section-bottom-mobile: 1.65rem; --space-subheading-top-desktop: 1.35rem; --space-subheading-top-mobile: 1.1rem; --space-subheading-rule-top-desktop: 0.65rem; --space-subheading-rule-top-mobile: 0.55rem; --gallery-width: 55vw; --gallery-max-available-width-desktop: 100%; --gallery-max-available-width-mobile: 100%; --gallery-max-image-height-desktop: 74svh; --gallery-max-image-height-mobile: 68svh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="format-detection" content="telephone=no"><meta name="description" content="A small norna example with free dog images."><meta name="theme-color" content="#000000"><link rel="canonical" href="http://localhost:4321/"><meta name="generator" content="Astro v7.1.3"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><title>Local Dog Example</title><link rel="stylesheet" href="/_astro/SitePage.BFHZm5UG.css"></head><body><a class="skip-link" href="#main-content">Skip to content</a><header class="site-top site-top-has-site-nav" data-smooth-scroll="{&quot;durationPerPixelMs&quot;:0.22,&quot;enabled&quot;:true,&quot;maximumDurationMs&quot;:4000,&quot;minimumDurationMs&quot;:2000}" style="--site-top-background-color: #550000; --site-top-text-color: #ffffff"><div class="site-nav-row"><a class="site-brand" href="/">Local Dog Example</a><nav class="site-nav" aria-label="Pages"><ul><li><a href="/" aria-current="page">Dog site!</a></li><li><a href="/dog-care/">Dog care</a></li></ul></nav><details class="mobile-nav-menu"><summary><span>Dog site!</span></summary><div class="mobile-nav-panel"><nav class="mobile-site-nav" aria-label="Pages"><h2>Pages</h2><ul><li><a href="/" aria-current="page">Dog site!</a></li><li><a href="/dog-care/">Dog care</a></li></ul></nav><nav class="mobile-page-nav" aria-label="On this page"><h2>On this page</h2><ul><li><a href="#black-dogs" aria-current="true">Black Dogs</a></li><li><a href="#summer-dogs">Summer Dogs</a></li><li><a href="#brown-dogs">Brown Dogs</a></li><li><a href="#golden-dogs">Golden Dogs</a></li><li><a href="#white-dogs">White Dogs</a></li><li><a href="#sources">Sources</a></li></ul></nav></div></details></div><nav class="page-nav" aria-label="On this page"><ul><li><a href="#black-dogs" aria-current="true">Black Dogs</a></li><li><a href="#summer-dogs">Summer Dogs</a></li><li><a href="#brown-dogs">Brown Dogs</a></li><li><a href="#golden-dogs">Golden Dogs</a></li><li><a href="#white-dogs">White Dogs</a></li><li><a href="#sources">Sources</a></li></ul></nav></header><script type="module">var e=document.querySelector(`.site-top`),t=Array.from(document.querySelectorAll(`.site-section`)),n=Array.from(document.querySelectorAll(`.page-nav a, .mobile-page-nav a`)),r=document.querySelector(`.mobile-nav-menu`),i=JSON.parse(e?.getAttribute(`data-smooth-scroll`)??`{}`),a=0,o=[120,320,700,1e3,2e3],s=window.matchMedia(`(prefers-reduced-motion: reduce)`),c=i.minimumDurationMs,l=i.maximumDurationMs,u=i.durationPerPixelMs,d=[`wheel`,`touchstart`],f=new Set([`ArrowDown`,`ArrowUp`,`End`,`Home`,`PageDown`,`PageUp`,` `]),p=null,m=null,h=0;`scrollRestoration`in history&&(history.scrollRestoration=`manual`);var g=()=>{if(!(e instanceof HTMLElement))return;let t=Math.ceil(e.getBoundingClientRect().height+a);return document.documentElement.style.setProperty(`--site-top-anchor-offset`,`${t}px`),t},_=e=>{let n=e.replace(/^#/,``);return t.find(e=>e.id===n)},v=e=>e?.querySelector(`h1, h2`),y=()=>{p&&=(p.cancel(),null)},b=e=>{e&&m!==e.id&&(m=e.id,n.forEach(t=>{t.getAttribute(`href`)===`#${e.id}`?t.setAttribute(`aria-current`,`true`):t.removeAttribute(`aria-current`)}))},x=()=>_(window.location.hash),S=e=>{window.location.hash!==e&&history.pushState(null,``,e)},C=()=>{r instanceof HTMLDetailsElement&&(r.open=!1)},w=e=>{if(!(e instanceof HTMLElement))return;let t=v(e);if(!(t instanceof HTMLElement))return;let n=g();if(n)return Math.max(0,t.getBoundingClientRect().top+window.scrollY-n)},T=e=>{y();let t=document.documentElement,n=t.style.scrollBehavior;t.style.scrollBehavior=`auto`,window.scrollTo(0,e),t.style.scrollBehavior=n},E=e=>{let t=Math.abs(e);return!i.enabled||s.matches||t<=a?0:Math.min(l,Math.max(c,t*u))},D=e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2,O=(e,{duration:t,onComplete:n}={})=>{y();let r=typeof e==`function`?e:()=>e,i=r();if(i===void 0)return 0;let a=window.scrollY,o=i-a,s=t??E(o);if(s<=0){let e=r();return e===void 0?0:(T(e),n?.(),0)}let c=document.documentElement,l=c.style.scrollBehavior,u=performance.now(),m=0,h={cancel:()=>{}},g=()=>{d.forEach(e=>{window.removeEventListener(e,v)}),window.removeEventListener(`keydown`,b),c.style.scrollBehavior=l,p===h&&(p=null)},_=()=>{m&&cancelAnimationFrame(m),g()},v=()=>_(),b=e=>{f.has(e.key)&&v()},x=e=>{let t=e-u,o=Math.min(1,t/s),c=r();c!==void 0&&(i=c);let l=a+(i-a)*D(o);if(window.scrollTo(0,l),o>=1){window.scrollTo(0,i),g(),n?.();return}m=requestAnimationFrame(x)};return h.cancel=_,p=h,c.style.scrollBehavior=`auto`,d.forEach(e=>{window.addEventListener(e,v,{passive:!0})}),window.addEventListener(`keydown`,b),m=requestAnimationFrame(x),s},k=(e,{behavior:t=`smooth`,duration:n,onComplete:r}={})=>{let i=w(e);if(i===void 0)return 0;let a=t===`smooth`?O(()=>w(e),{duration:n,onComplete:r}):(T(i),r?.(),0);return b(e),a},A=()=>{g()},j=()=>{if(p)return;let e=x();e instanceof HTMLElement&&k(e,{behavior:`auto`})},M=()=>{if(!window.location.hash)return;h+=1;let e=h;o.forEach(t=>{window.setTimeout(()=>{e===h&&requestAnimationFrame(j)},t)})},N=({behavior:e=`auto`,scrollHashlessTop:n=!1}={})=>{let r=x();if(r instanceof HTMLElement){k(r,{behavior:e}),M();return}n&&T(0),b(t[0])};n.forEach(e=>{e.addEventListener(`click`,t=>{let n=_(e.hash);if(!(n instanceof HTMLElement))return;let r=w(n);if(r===void 0)return;t.preventDefault();let i=`#${n.id}`,a=E(r-window.scrollY);S(i),b(n),C(),k(n,{behavior:`smooth`,duration:a,onComplete:M})})}),A(),requestAnimationFrame(()=>N({behavior:`auto`})),e instanceof HTMLElement&&`ResizeObserver`in window&&new ResizeObserver(A).observe(e),window.addEventListener(`resize`,A),window.addEventListener(`load`,M),window.addEventListener(`hashchange`,()=>N({behavior:`auto`,scrollHashlessTop:!0})),window.addEventListener(`popstate`,()=>N({behavior:`auto`,scrollHashlessTop:!0})),window.visualViewport&&window.visualViewport.addEventListener(`resize`,A);</script><main id="main-content" class="site-content"><section id="black-dogs" class="site-section" data-section-title="Black Dogs" style="--section-background-color: #550000; --section-text-color: #ffffff; --section-heading-align-desktop: left; --section-heading-align-mobile: left; --section-heading-font-size-desktop: clamp(2rem, 1.35rem + 2.4vw, 3.75rem); --section-heading-font-size-mobile: clamp(1.8rem, 1.25rem + 3vw, 2.85rem); --section-heading-line-height: 1.04; --section-heading-spacing: 0.5em; --section-heading-width-desktop: var(--gallery-layout-width); --section-heading-width-mobile: var(--gallery-layout-width); --section-markdown-h3-align-desktop: left; --section-markdown-h3-align-mobile: left; --section-markdown-h3-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-markdown-h3-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-markdown-h3-line-height: 1.18; --section-markdown-h3-spacing: 0.85rem; --section-markdown-h4-align-desktop: left; --section-markdown-h4-align-mobile: left; --section-markdown-h4-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-markdown-h4-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-markdown-h4-line-height: 1.42; --section-markdown-h4-spacing: 0.75rem; --section-body-align-desktop: left; --section-body-align-mobile: left; --section-body-font-size-desktop: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-font-size-mobile: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-line-height: 1.42; --section-body-paragraph-spacing: 0.75em; --section-body-width-desktop: var(--gallery-layout-width); --section-body-width-mobile: var(--gallery-layout-width); --section-caption-align-desktop: center; --section-caption-align-mobile: center; --section-caption-font-size-desktop: clamp(0.78rem, 0.76rem + 0.08vw, 0.84rem); --section-caption-font-size-mobile: clamp(0.78rem, 0.76rem + 0.08vw, 0.84rem); --section-caption-line-height: 1.3; --section-caption-spacing: 0.45em; --section-caption-justify-desktop: center; --section-caption-justify-mobile: center"><div class="section-card"><header class="section-header"><h1>Black Dogs</h1></header><div class="section-body section-body-has-gallery"><div class="section-markdown"><p>Black-coated dogs from the local norna development collection. This
2
+ sentence contains <span class="inline-style inline-style-highlight" style="--inline-style-color: #ffd84d">yellow highlighted text</span> for inline style
3
+ inspection.</p>
4
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a
5
+ ante venenatis dapibus posuere velit aliquet.</p>
6
+ <h3 id="coat-notes">Coat notes</h3>
7
+ <p>This <code>###</code> heading should follow <code>typography.headings.h3</code>.</p>
8
+ <h4 id="small-detail">Small detail</h4>
9
+ <p>This <code>####</code> heading should follow <code>typography.headings.h4</code>.</p>
10
+ <p>Curabitur blandit tempus porttitor. Donec id elit non mi porta gravida at eget
11
+ metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.</p></div><div class="gallery" aria-label="Images: Black Dogs"><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-960.webp" srcset="/images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-480.webp 480w, /images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-768.webp 768w, /images/generated/black-dogs/photo-of-a-black-dog-5cf614d2-960.webp 960w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 960 / 1600;" width="960" height="1600" class="gallery-image" alt="A black dog sitting outdoors and looking at the camera." decoding="async" fetchpriority="high" loading="eager"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>Photo of a dog. ContaDeletada2906, CC0 1.0, via Wikimedia Commons.</span></div></figcaption></figure><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/black-dogs/black-puppy-meadow-7255e3d9-1440.webp" srcset="/images/generated/black-dogs/black-puppy-meadow-7255e3d9-480.webp 480w, /images/generated/black-dogs/black-puppy-meadow-7255e3d9-768.webp 768w, /images/generated/black-dogs/black-puppy-meadow-7255e3d9-1080.webp 1080w, /images/generated/black-dogs/black-puppy-meadow-7255e3d9-1440.webp 1440w, /images/generated/black-dogs/black-puppy-meadow-7255e3d9-1536.webp 1536w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 1536 / 1024;" width="1536" height="1024" class="gallery-image gallery-image-landscape" alt="A black puppy standing in a grassy meadow and looking at the camera." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>AI-generated image.</span></div></figcaption></figure></div><script type="module" src="/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js"></script></div></div></section><section id="summer-dogs" class="site-section" data-section-title="Summer Dogs" style="--section-background-color: #181818; --section-text-color: #ffffff; --section-heading-align-desktop: left; --section-heading-align-mobile: left; --section-heading-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-heading-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-heading-line-height: 1.08; --section-heading-spacing: 0.45em; --section-heading-width-desktop: var(--gallery-layout-width); --section-heading-width-mobile: var(--gallery-layout-width); --section-markdown-h3-align-desktop: left; --section-markdown-h3-align-mobile: left; --section-markdown-h3-font-size-desktop: clamp(1.1rem, 1.02rem + 0.35vw, 1.35rem); --section-markdown-h3-font-size-mobile: clamp(1.12rem, 1rem + 0.85vw, 1.42rem); --section-markdown-h3-line-height: 1.3; --section-markdown-h3-spacing: 0.75rem; --section-markdown-h4-align-desktop: left; --section-markdown-h4-align-mobile: left; --section-markdown-h4-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-markdown-h4-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-markdown-h4-line-height: 1.42; --section-markdown-h4-spacing: 0.6rem; --section-body-align-desktop: left; --section-body-align-mobile: left; --section-body-font-size-desktop: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-font-size-mobile: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-line-height: 1.42; --section-body-paragraph-spacing: 0.6em; --section-body-width-desktop: var(--gallery-layout-width); --section-body-width-mobile: var(--gallery-layout-width); --section-caption-align-desktop: center; --section-caption-align-mobile: center; --section-caption-font-size-desktop: clamp(0.78rem, 0.76rem + 0.08vw, 0.84rem); --section-caption-font-size-mobile: clamp(0.78rem, 0.76rem + 0.08vw, 0.84rem); --section-caption-line-height: 1.25; --section-caption-spacing: 0.35em; --section-caption-justify-desktop: center; --section-caption-justify-mobile: center"><div class="section-card"><header class="section-header"><h2>Summer Dogs</h2></header><div class="section-body section-body-text-only"><div class="section-markdown"><p>This temporary section is visible during August 2026. It is here to demonstrate
12
+ date-controlled sections and <span class="inline-style inline-style-alert" style="--inline-style-color: #ff9a3d">warm alert text</span> in the local dog example.</p>
13
+ <p>Lorem ipsum dolor sit amet.</p>
14
+ <p>Vestibulum id ligula porta felis euismod semper. Maecenas faucibus mollis
15
+ interdum. Nullam quis risus eget urna mollis ornare vel eu leo.</p></div></div></div></section><section id="brown-dogs" class="site-section" data-section-title="Brown Dogs" style="--section-background-color: #550000; --section-text-color: #ffffff; --section-heading-align-desktop: left; --section-heading-align-mobile: left; --section-heading-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-heading-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-heading-line-height: 1.12; --section-heading-spacing: 0.8em; --section-heading-width-desktop: var(--gallery-layout-width); --section-heading-width-mobile: var(--gallery-layout-width); --section-markdown-h3-align-desktop: left; --section-markdown-h3-align-mobile: left; --section-markdown-h3-font-size-desktop: clamp(1.1rem, 1.02rem + 0.35vw, 1.35rem); --section-markdown-h3-font-size-mobile: clamp(1.12rem, 1rem + 0.85vw, 1.42rem); --section-markdown-h3-line-height: 1.35; --section-markdown-h3-spacing: 1rem; --section-markdown-h4-align-desktop: left; --section-markdown-h4-align-mobile: left; --section-markdown-h4-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-markdown-h4-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-markdown-h4-line-height: 1.55; --section-markdown-h4-spacing: 0.85rem; --section-body-align-desktop: left; --section-body-align-mobile: left; --section-body-font-size-desktop: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-font-size-mobile: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-line-height: 1.62; --section-body-paragraph-spacing: 1em; --section-body-width-desktop: var(--gallery-layout-width); --section-body-width-mobile: var(--gallery-layout-width); --section-caption-align-desktop: left; --section-caption-align-mobile: left; --section-caption-font-size-desktop: clamp(0.78rem, 0.76rem + 0.08vw, 0.84rem); --section-caption-font-size-mobile: clamp(0.78rem, 0.76rem + 0.08vw, 0.84rem); --section-caption-line-height: 1.4; --section-caption-spacing: 0.6em; --section-caption-justify-desktop: flex-start; --section-caption-justify-mobile: flex-start"><div class="section-card"><header class="section-header"><h2>Brown Dogs</h2></header><div class="section-body section-body-has-gallery"><div class="section-markdown"><p>Brown dogs provide a second image section for local navigation checks.</p>
16
+ <p>Donec ullamcorper nulla non metus auctor fringilla. Fusce dapibus, tellus ac
17
+ cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit
18
+ amet risus.</p>
19
+ <p>Maecenas sed diam eget risus varius blandit sit amet non magna. Morbi leo risus,
20
+ porta ac consectetur ac, vestibulum at eros. Sed posuere consectetur est at
21
+ lobortis.</p></div><div class="gallery" aria-label="Images: Brown Dogs"><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/brown-dogs/brown-dog-50ef114e-1440.webp" srcset="/images/generated/brown-dogs/brown-dog-50ef114e-480.webp 480w, /images/generated/brown-dogs/brown-dog-50ef114e-768.webp 768w, /images/generated/brown-dogs/brown-dog-50ef114e-1080.webp 1080w, /images/generated/brown-dogs/brown-dog-50ef114e-1440.webp 1440w, /images/generated/brown-dogs/brown-dog-50ef114e-1920.webp 1920w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 3939 / 2626;" width="3939" height="2626" class="gallery-image gallery-image-landscape" alt="A brown dog looking directly at the camera." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>DogBrown. Frank-3, CC0 1.0, via Wikimedia Commons.</span></div></figcaption></figure><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1440.webp" srcset="/images/generated/brown-dogs/dog-accompanies-master-7ef804d5-480.webp 480w, /images/generated/brown-dogs/dog-accompanies-master-7ef804d5-768.webp 768w, /images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1080.webp 1080w, /images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1440.webp 1440w, /images/generated/brown-dogs/dog-accompanies-master-7ef804d5-1920.webp 1920w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 2400 / 1800;" width="2400" height="1800" class="gallery-image gallery-image-landscape" alt="A man walks outdoors with a dog at his side." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>Dog accompanies his master. Steve Hillebrand, U.S. Fish and Wildlife Service, public domain.</span></div></figcaption></figure></div></div></div></section><section id="golden-dogs" class="site-section" data-section-title="Golden Dogs" style="--section-background-color: #550000; --section-text-color: #ffffff; --section-heading-align-desktop: left; --section-heading-align-mobile: left; --section-heading-font-size-desktop: clamp(1.6rem, 1.22rem + 1.45vw, 2.75rem); --section-heading-font-size-mobile: clamp(1.5rem, 1.12rem + 2vw, 2.25rem); --section-heading-line-height: 1.08; --section-heading-spacing: 0.65em; --section-heading-width-desktop: var(--gallery-layout-width); --section-heading-width-mobile: var(--gallery-layout-width); --section-markdown-h3-align-desktop: left; --section-markdown-h3-align-mobile: left; --section-markdown-h3-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-markdown-h3-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-markdown-h3-line-height: 1.35; --section-markdown-h3-spacing: 0.7rem; --section-markdown-h4-align-desktop: left; --section-markdown-h4-align-mobile: left; --section-markdown-h4-font-size-desktop: clamp(1.1rem, 1.02rem + 0.35vw, 1.35rem); --section-markdown-h4-font-size-mobile: clamp(1.12rem, 1rem + 0.85vw, 1.42rem); --section-markdown-h4-line-height: 1.5; --section-markdown-h4-spacing: 0.55rem; --section-body-align-desktop: left; --section-body-align-mobile: left; --section-body-font-size-desktop: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-font-size-mobile: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-line-height: 1.58; --section-body-paragraph-spacing: 1em; --section-body-width-desktop: var(--gallery-layout-width); --section-body-width-mobile: var(--gallery-layout-width); --section-caption-align-desktop: center; --section-caption-align-mobile: center; --section-caption-font-size-desktop: clamp(0.78rem, 0.76rem + 0.08vw, 0.84rem); --section-caption-font-size-mobile: clamp(0.78rem, 0.76rem + 0.08vw, 0.84rem); --section-caption-line-height: 1.35; --section-caption-spacing: 0.5em; --section-caption-justify-desktop: center; --section-caption-justify-mobile: center"><div class="section-card"><header class="section-header"><h2>Golden Dogs</h2></header><div class="section-body section-body-has-gallery"><div class="section-markdown"><p>Golden-coated retrievers add a third image section and more scrolling depth.</p>
22
+ <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam.</p>
23
+ <h3 id="training-note">Training note</h3>
24
+ <p>This section overrides <code>headings.h2</code> and <code>headings.h3</code>, while keeping the
25
+ site-wide <code>headings.h4</code> style.</p>
26
+ <p>Nulla vitae elit libero, a pharetra augue. Integer posuere erat a ante venenatis
27
+ dapibus posuere velit aliquet. Aenean eu leo quam. Pellentesque ornare sem
28
+ lacinia quam venenatis vestibulum.</p></div><div class="gallery" aria-label="Images: Golden Dogs"><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/golden-dogs/golden-retriever-f797fd88-1440.webp" srcset="/images/generated/golden-dogs/golden-retriever-f797fd88-480.webp 480w, /images/generated/golden-dogs/golden-retriever-f797fd88-768.webp 768w, /images/generated/golden-dogs/golden-retriever-f797fd88-1080.webp 1080w, /images/generated/golden-dogs/golden-retriever-f797fd88-1440.webp 1440w, /images/generated/golden-dogs/golden-retriever-f797fd88-1600.webp 1600w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 1600 / 1200;" width="1600" height="1200" class="gallery-image gallery-image-landscape" alt="A golden retriever standing outdoors." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>Golden Retriever. Ribo, public domain, via Wikimedia Commons.</span></div></figcaption></figure><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/golden-dogs/toller-puppy-a2a8fbc0-1440.webp" srcset="/images/generated/golden-dogs/toller-puppy-a2a8fbc0-480.webp 480w, /images/generated/golden-dogs/toller-puppy-a2a8fbc0-768.webp 768w, /images/generated/golden-dogs/toller-puppy-a2a8fbc0-1080.webp 1080w, /images/generated/golden-dogs/toller-puppy-a2a8fbc0-1440.webp 1440w, /images/generated/golden-dogs/toller-puppy-a2a8fbc0-1920.webp 1920w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 2576 / 1932;" width="2576" height="1932" class="gallery-image gallery-image-landscape" alt="A young Nova Scotia Duck Tolling Retriever puppy sitting on grass." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>Nova Scotia Duck Tolling Retriever puppy. RM, public domain, via Wikimedia Commons.</span></div></figcaption></figure></div></div></div></section><section id="white-dogs" class="site-section" data-section-title="White Dogs" style="--section-background-color: #550000; --section-text-color: #ffffff; --section-heading-align-desktop: left; --section-heading-align-mobile: left; --section-heading-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-heading-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-heading-line-height: 1.08; --section-heading-spacing: 0.65em; --section-heading-width-desktop: var(--gallery-layout-width); --section-heading-width-mobile: var(--gallery-layout-width); --section-markdown-h3-align-desktop: left; --section-markdown-h3-align-mobile: left; --section-markdown-h3-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-markdown-h3-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-markdown-h3-line-height: 1.35; --section-markdown-h3-spacing: 0.7rem; --section-markdown-h4-align-desktop: left; --section-markdown-h4-align-mobile: left; --section-markdown-h4-font-size-desktop: clamp(1.1rem, 1.02rem + 0.35vw, 1.35rem); --section-markdown-h4-font-size-mobile: clamp(1.12rem, 1rem + 0.85vw, 1.42rem); --section-markdown-h4-line-height: 1.5; --section-markdown-h4-spacing: 0.55rem; --section-body-align-desktop: left; --section-body-align-mobile: left; --section-body-font-size-desktop: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-font-size-mobile: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-line-height: 1.5; --section-body-paragraph-spacing: 0.85em; --section-body-width-desktop: var(--gallery-layout-width); --section-body-width-mobile: var(--gallery-layout-width); --section-caption-align-desktop: center; --section-caption-align-mobile: center; --section-caption-font-size-desktop: clamp(0.78rem, 0.76rem + 0.08vw, 0.84rem); --section-caption-font-size-mobile: clamp(0.78rem, 0.76rem + 0.08vw, 0.84rem); --section-caption-line-height: 1.35; --section-caption-spacing: 0.35em; --section-caption-justify-desktop: center; --section-caption-justify-mobile: center"><div class="section-card"><header class="section-header"><h2>White Dogs</h2></header><div class="section-body section-body-has-gallery"><div class="section-markdown"><p>A white dog completes the colour-based image sequence.</p>
29
+ <p>Etiam porta sem malesuada magna mollis euismod. Donec id elit non mi porta
30
+ gravida at eget metus.</p>
31
+ <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Lorem ipsum
32
+ dolor sit amet, consectetur adipiscing elit. Donec sed odio dui. Vestibulum id
33
+ ligula porta felis euismod semper.</p></div><div class="gallery" aria-label="Images: White Dogs"><section class="gallery-item gallery-carousel" data-carousel tabindex="0" role="group" aria-roledescription="carousel" aria-label="White Dogs, bildkarusell" style="--gallery-carousel-aspect-ratio: 1.2047169811320755"><div class="gallery-carousel-stage"><div class="gallery-carousel-viewport" data-carousel-viewport><div class="gallery-carousel-slides"><figure class="gallery-carousel-slide" data-carousel-slide><div class="gallery-carousel-image-frame"><img src="/images/generated/white-dogs/white-cute-dog-077a0689-1277.webp" srcset="/images/generated/white-dogs/white-cute-dog-077a0689-480.webp 480w, /images/generated/white-dogs/white-cute-dog-077a0689-768.webp 768w, /images/generated/white-dogs/white-cute-dog-077a0689-1080.webp 1080w, /images/generated/white-dogs/white-cute-dog-077a0689-1277.webp 1277w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 1277 / 1060;" width="1277" height="1060" class="gallery-image gallery-image-landscape" alt="A white dog looking toward the camera." decoding="async" fetchpriority="low" loading="lazy"></div></figure><figure class="gallery-carousel-slide" data-carousel-slide><div class="gallery-carousel-image-frame"><img src="/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1440.webp" srcset="/images/generated/white-dogs/white-puppy-garden-d3ab2ca0-480.webp 480w, /images/generated/white-dogs/white-puppy-garden-d3ab2ca0-768.webp 768w, /images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1080.webp 1080w, /images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1440.webp 1440w, /images/generated/white-dogs/white-puppy-garden-d3ab2ca0-1536.webp 1536w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 1536 / 1024;" width="1536" height="1024" class="gallery-image gallery-image-landscape" alt="A fluffy white puppy standing on grass in a garden." decoding="async" fetchpriority="low" loading="lazy"></div></figure></div></div><button class="gallery-carousel-button gallery-carousel-button-previous" type="button" data-carousel-previous aria-label="Föregående bild" title="Föregående bild"><span aria-hidden="true">‹</span></button><button class="gallery-carousel-button gallery-carousel-button-next" type="button" data-carousel-next aria-label="Nästa bild" title="Nästa bild"><span aria-hidden="true">›</span></button><output class="gallery-carousel-position" data-carousel-position aria-live="polite">1 / 2</output></div><div class="gallery-carousel-captions" data-carousel-captions><p class="gallery-meta gallery-carousel-caption" data-carousel-caption data-carousel-caption-index="0"><span class="gallery-details"><span>White cute dog. Neal Ziring, public domain, via Wikimedia Commons.</span></span></p><p class="gallery-meta gallery-carousel-caption" data-carousel-caption data-carousel-caption-index="1"><span class="gallery-details"><span>AI-generated image.</span></span></p></div></section></div></div></div></section><section id="sources" class="site-section" data-section-title="Sources" style="--section-background-color: #550000; --section-text-color: #ffffff; --section-heading-align-desktop: left; --section-heading-align-mobile: left; --section-heading-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-heading-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-heading-line-height: 1.08; --section-heading-spacing: 0.65em; --section-heading-width-desktop: var(--gallery-layout-width); --section-heading-width-mobile: var(--gallery-layout-width); --section-markdown-h3-align-desktop: left; --section-markdown-h3-align-mobile: left; --section-markdown-h3-font-size-desktop: clamp(1.35rem, 1.1rem + 0.9vw, 2rem); --section-markdown-h3-font-size-mobile: clamp(1.3rem, 1.05rem + 1.35vw, 1.75rem); --section-markdown-h3-line-height: 1.35; --section-markdown-h3-spacing: 0.7rem; --section-markdown-h4-align-desktop: left; --section-markdown-h4-align-mobile: left; --section-markdown-h4-font-size-desktop: clamp(1.1rem, 1.02rem + 0.35vw, 1.35rem); --section-markdown-h4-font-size-mobile: clamp(1.12rem, 1rem + 0.85vw, 1.42rem); --section-markdown-h4-line-height: 1.5; --section-markdown-h4-spacing: 0.55rem; --section-body-align-desktop: left; --section-body-align-mobile: left; --section-body-font-size-desktop: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-font-size-mobile: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-body-line-height: 1.5; --section-body-paragraph-spacing: 0.85em; --section-body-width-desktop: var(--gallery-layout-width); --section-body-width-mobile: var(--gallery-layout-width); --section-caption-align-desktop: center; --section-caption-align-mobile: center; --section-caption-font-size-desktop: clamp(0.78rem, 0.76rem + 0.08vw, 0.84rem); --section-caption-font-size-mobile: clamp(0.78rem, 0.76rem + 0.08vw, 0.84rem); --section-caption-line-height: 1.35; --section-caption-spacing: 0.5em; --section-caption-justify-desktop: center; --section-caption-justify-mobile: center"><div class="section-card"><header class="section-header"><h2>Sources</h2></header><div class="section-body section-body-text-only"><div class="section-markdown"><p>Most images are sourced from Wikimedia Commons pages that list CC0 or
34
+ public-domain licensing:</p>
35
+ <ul>
36
+ <li><a href="https://commons.wikimedia.org/wiki/File:Photo_of_a_dog.jpg">Photo of a dog</a></li>
37
+ <li><a href="https://commons.wikimedia.org/wiki/File:DogBrown.jpg">DogBrown</a></li>
38
+ <li><a href="https://commons.wikimedia.org/wiki/File:Dog_accompanies_his_master.jpg">Dog accompanies his master</a></li>
39
+ <li><a href="https://commons.wikimedia.org/wiki/File:Golden_Retriever.jpg">Golden Retriever</a></li>
40
+ <li><a href="https://commons.wikimedia.org/wiki/File:Toller_pup7wks2.JPG">Toller pup7wks2</a></li>
41
+ <li><a href="https://commons.wikimedia.org/wiki/File:White_cute_dog.jpg">White cute dog</a></li>
42
+ </ul>
43
+ <p>The black and white puppy images are AI-generated.</p></div></div></div></section></main><footer class="site-footer" style="--site-footer-background-color: #550000; --site-footer-text-color: #ffffff"><p>Dog images from Wikimedia Commons; see image captions for license details.<span>Built 07/08/2026, 15:26</span></p></footer></body></html>
@@ -0,0 +1,2 @@
1
+ User-agent: *
2
+ Allow: /
@@ -0,0 +1,74 @@
1
+ {
2
+ "hash": "18953098",
3
+ "configHash": "df6ba470",
4
+ "lockfileHash": "808f2e8e",
5
+ "browserHash": "54286dfc",
6
+ "optimized": {
7
+ "astro > aria-query": {
8
+ "src": "../../../../../node_modules/aria-query/lib/index.js",
9
+ "file": "astro_n_aria-query.js",
10
+ "fileHash": "dc2a8aee",
11
+ "needsInterop": true
12
+ },
13
+ "astro > axobject-query": {
14
+ "src": "../../../../../node_modules/axobject-query/lib/index.js",
15
+ "file": "astro_n_axobject-query.js",
16
+ "fileHash": "3acd67c7",
17
+ "needsInterop": true
18
+ },
19
+ "astro > html-escaper": {
20
+ "src": "../../../../../node_modules/html-escaper/esm/index.js",
21
+ "file": "astro_n_html-escaper.js",
22
+ "fileHash": "9967a3db",
23
+ "needsInterop": false
24
+ },
25
+ "astro/runtime/client/dev-toolbar/entrypoint.js": {
26
+ "src": "../../../../../node_modules/astro/dist/runtime/client/dev-toolbar/entrypoint.js",
27
+ "file": "astro_runtime_client_dev-toolbar_entrypoint__js.js",
28
+ "fileHash": "98dc9563",
29
+ "needsInterop": false
30
+ }
31
+ },
32
+ "chunks": {
33
+ "astro-D_GIpJIE": {
34
+ "file": "astro-D_GIpJIE.js",
35
+ "isDynamicEntry": true
36
+ },
37
+ "audit-DM9Hkl5B": {
38
+ "file": "audit-DM9Hkl5B.js",
39
+ "isDynamicEntry": true
40
+ },
41
+ "highlight-DnZ1ULOL": {
42
+ "file": "highlight-DnZ1ULOL.js",
43
+ "isDynamicEntry": false
44
+ },
45
+ "icons-RyebKi45": {
46
+ "file": "icons-RyebKi45.js",
47
+ "isDynamicEntry": false
48
+ },
49
+ "rolldown-runtime-BvCyGRYZ": {
50
+ "file": "rolldown-runtime-BvCyGRYZ.js",
51
+ "isDynamicEntry": false
52
+ },
53
+ "settings-DaU-gNnK": {
54
+ "file": "settings-DaU-gNnK.js",
55
+ "isDynamicEntry": true
56
+ },
57
+ "toolbar-63PA619H": {
58
+ "file": "toolbar-63PA619H.js",
59
+ "isDynamicEntry": true
60
+ },
61
+ "ui-library--bkcNSYz": {
62
+ "file": "ui-library--bkcNSYz.js",
63
+ "isDynamicEntry": true
64
+ },
65
+ "window-jPkpKVcy": {
66
+ "file": "window-jPkpKVcy.js",
67
+ "isDynamicEntry": false
68
+ },
69
+ "xray-BXCHpEJP": {
70
+ "file": "xray-BXCHpEJP.js",
71
+ "isDynamicEntry": true
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,434 @@
1
+ import { n as isDefinedIcon } from "./icons-RyebKi45.js";
2
+ import { n as createWindowElement, r as synchronizePlacementOnUpdate, t as closeOnOutsideClick } from "./window-jPkpKVcy.js";
3
+ //#region ../../node_modules/astro/dist/runtime/client/dev-toolbar/apps/utils/icons.js
4
+ function randomFromArray(list) {
5
+ return list[Math.floor(Math.random() * list.length)];
6
+ }
7
+ var categoryIcons = new Map(Object.entries({
8
+ frameworks: ["puzzle", "grid"],
9
+ adapters: [
10
+ "puzzle",
11
+ "grid",
12
+ "compress"
13
+ ],
14
+ "css+ui": [
15
+ "compress",
16
+ "grid",
17
+ "image",
18
+ "resizeImage",
19
+ "puzzle"
20
+ ],
21
+ "performance+seo": [
22
+ "approveUser",
23
+ "checkCircle",
24
+ "compress",
25
+ "robot",
26
+ "searchFile",
27
+ "sitemap"
28
+ ],
29
+ analytics: [
30
+ "checkCircle",
31
+ "compress",
32
+ "searchFile"
33
+ ],
34
+ accessibility: ["approveUser", "checkCircle"],
35
+ other: [
36
+ "checkCircle",
37
+ "grid",
38
+ "puzzle",
39
+ "sitemap"
40
+ ]
41
+ }));
42
+ function iconForIntegration(integration) {
43
+ return randomFromArray(integration.categories.filter((category) => categoryIcons.has(category)).flatMap((category) => categoryIcons.get(category)));
44
+ }
45
+ var iconColors = [
46
+ "#BC52EE",
47
+ "#6D6AF0",
48
+ "#52EEBD",
49
+ "#52B7EE",
50
+ "#52EE55",
51
+ "#B7EE52",
52
+ "#EEBD52",
53
+ "#EE5552",
54
+ "#EE52B7",
55
+ "#858B98"
56
+ ];
57
+ function colorForIntegration() {
58
+ return randomFromArray(iconColors);
59
+ }
60
+ //#endregion
61
+ //#region ../../node_modules/astro/dist/runtime/client/dev-toolbar/apps/astro.js
62
+ var astroLogo = "<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 99 26\" width=\"100\"><path fill=\"#fff\" d=\"M6.70402 22.1453c-1.17459-1.0737-1.51748-3.3297-1.02811-4.9641.84853 1.0304 2.02424 1.3569 3.24204 1.5411 1.88005.2844 3.72635.178 5.47285-.6813.1998-.0984.3844-.2292.6027-.3617.1639.4755.2065.9554.1493 1.4439-.1392 1.1898-.7313 2.1088-1.673 2.8054-.3765.2787-.775.5278-1.1639.7905-1.1948.8075-1.518 1.7544-1.0691 3.1318.0107.0336.0202.0671.0444.149-.6101-.273-1.0557-.6705-1.39518-1.1931-.3586-.5517-.52921-1.1619-.53819-1.8221-.00449-.3213-.00449-.6455-.0477-.9623-.10551-.7722-.46804-1.118-1.15102-1.1379-.70094-.0205-1.2554.4129-1.40244 1.0953-.01122.0523-.02749.1041-.04377.1649l.00112.0006Z\"/><path fill=\"url(#paint0_linear_386_2739)\" d=\"M6.70402 22.1453c-1.17459-1.0737-1.51748-3.3297-1.02811-4.9641.84853 1.0304 2.02424 1.3569 3.24204 1.5411 1.88005.2844 3.72635.178 5.47285-.6813.1998-.0984.3844-.2292.6027-.3617.1639.4755.2065.9554.1493 1.4439-.1392 1.1898-.7313 2.1088-1.673 2.8054-.3765.2787-.775.5278-1.1639.7905-1.1948.8075-1.518 1.7544-1.0691 3.1318.0107.0336.0202.0671.0444.149-.6101-.273-1.0557-.6705-1.39518-1.1931-.3586-.5517-.52921-1.1619-.53819-1.8221-.00449-.3213-.00449-.6455-.0477-.9623-.10551-.7722-.46804-1.118-1.15102-1.1379-.70094-.0205-1.2554.4129-1.40244 1.0953-.01122.0523-.02749.1041-.04377.1649l.00112.0006Z\"/><path fill=\"#fff\" d=\"M0 16.909s3.47815-1.6944 6.96603-1.6944l2.62973-8.13858c.09846-.39359.38592-.66106.71044-.66106.3246 0 .612.26747.7105.66106l2.6297 8.13858c4.1309 0 6.966 1.6944 6.966 1.6944S14.7045.814589 14.693.782298C14.5234.306461 14.2371 0 13.8512 0H6.76183c-.38593 0-.66063.306461-.84174.782298C5.90733.81398 0 16.909 0 16.909ZM36.671 11.7318c0 1.4262-1.7739 2.2779-4.2302 2.2779-1.5985 0-2.1638-.3962-2.1638-1.2281 0-.8715.7018-1.2875 2.3003-1.2875 1.4426 0 2.6707.0198 4.0937.1981v.0396Zm.0195-1.7629c-.8772-.19808-2.2028-.31693-3.7818-.31693-4.6006 0-6.7644 1.08943-6.7644 3.62483 0 2.6344 1.4815 3.6446 4.9125 3.6446 2.9046 0 4.8735-.7328 5.5947-2.5354h.117c-.0195.4358-.039.8716-.039 1.2083 0 .931.156 1.0102.9162 1.0102h3.5869c-.1949-.5546-.3119-2.1194-.3119-3.4663 0-1.446.0585-2.5355.0585-4.00123 0-2.99098-1.7934-4.89253-7.4077-4.89253-2.4173 0-5.1074.41596-7.1543 1.03.1949.81213.4679 2.45617.6043 3.5258 1.774-.83193 4.2887-1.18847 6.2381-1.18847 2.6902 0 3.4309.61404 3.4309 1.86193v.4952ZM46.5325 12.5637c-.4874.0594-1.1502.0594-1.8325.0594-.7213 0-1.3841-.0198-1.8324-.0792 0 .1585-.0195.3367-.0195.4952 0 2.476 1.618 3.922 7.3102 3.922 5.3609 0 7.0958-1.4262 7.0958-3.9418 0-2.3769-1.1501-3.5456-6.238-3.8031-3.9573-.17827-4.3082-.61404-4.3082-1.10924 0-.57442.5068-.87154 3.158-.87154 2.7487 0 3.4894.37635 3.4894 1.16866v.17827c.3899-.01981 1.0917-.03961 1.813-.03961.6823 0 1.423.0198 1.8519.05942 0-.17827.0195-.33674.0195-.47539 0-2.91175-2.4172-3.86252-7.0958-3.86252-5.2634 0-7.0373 1.2875-7.0373 3.8031 0 2.25805 1.423 3.66445 6.472 3.88235 3.7233.1188 4.1327.5348 4.1327 1.1092 0 .6141-.6043.8914-3.2165.8914-3.0021 0-3.7623-.416-3.7623-1.2677v-.1189ZM63.6883 2.125c-1.423 1.32712-3.9768 2.65425-5.3998 3.01079.0195.73289.0195 2.07982.0195 2.81271l1.3061.01981c-.0195 1.40635-.039 3.10979-.039 4.23889 0 2.6344 1.3841 4.6152 5.6922 4.6152 1.813 0 3.0216-.1981 4.5226-.515-.1559-.9706-.3314-2.4562-.3898-3.5852-.8968.2971-2.0274.4556-3.275.4556-1.735 0-2.4368-.4754-2.4368-1.8422 0-1.1884 0-2.29767.0195-3.32768 2.2223.01981 4.4446.05943 5.7507.09904-.0195-1.03.0195-2.51559.078-3.50598-1.8909.03961-4.0157.05942-5.7702.05942.0195-.87154.039-1.70347.0585-2.5354h-.1365ZM75.3313 7.35427c.0195-1.03001.039-1.90156.0585-2.75329h-3.9183c.0585 1.70347.0585 3.44656.0585 6.00172 0 2.5553-.0195 4.3182-.0585 6.0018h4.4836c-.078-1.1885-.0975-3.189-.0975-4.8925 0-2.69388 1.0917-3.46638 3.5674-3.46638 1.1502 0 1.9689.13865 2.6902.39615.0195-1.01019.2144-2.97117.3314-3.84271-.7408-.21789-1.5595-.35655-2.5537-.35655-2.1249-.0198-3.6844.85174-4.4056 2.93156l-.156-.0198ZM94.8501 10.5235c0 2.1591-1.5595 3.1693-4.0157 3.1693-2.4368 0-3.9963-.9508-3.9963-3.1693 0-2.21846 1.579-3.05039 3.9963-3.05039 2.4367 0 4.0157.89135 4.0157 3.05039Zm4.0743-.099c0-4.29832-3.353-6.21968-8.09-6.21968-4.7566 0-7.9926 1.92136-7.9926 6.21968 0 4.2785 3.0216 6.5762 7.9731 6.5762 4.9904 0 8.1095-2.2977 8.1095-6.5762Z\"/><defs><linearGradient id=\"paint0_linear_386_2739\" x1=\"5.46011\" x2=\"16.8017\" y1=\"25.9999\" y2=\"20.6412\" gradientUnits=\"userSpaceOnUse\"><stop stop-color=\"#D83333\"/><stop offset=\"1\" stop-color=\"#F041FF\"/></linearGradient></defs></svg>";
63
+ var integrationData;
64
+ var astro_default = {
65
+ id: "astro:home",
66
+ name: "Menu",
67
+ icon: "astro:logo",
68
+ async init(canvas, eventTarget) {
69
+ createCanvas();
70
+ document.addEventListener("astro:after-swap", createCanvas);
71
+ eventTarget.addEventListener("app-toggled", async (event) => {
72
+ resetDebugButton();
73
+ if (!(event instanceof CustomEvent)) return;
74
+ if (event.detail.state === true) {
75
+ if (!integrationData) fetchIntegrationData();
76
+ }
77
+ });
78
+ closeOnOutsideClick(eventTarget);
79
+ synchronizePlacementOnUpdate(eventTarget, canvas);
80
+ function fetchIntegrationData() {
81
+ fetch("https://astro.build/api/v1/dev-overlay/", { cache: "no-cache" }).then((res) => res.json()).then((data) => {
82
+ integrationData = data;
83
+ integrationData.data = integrationData.data.map((integration) => {
84
+ return integration;
85
+ });
86
+ refreshIntegrationList();
87
+ });
88
+ }
89
+ function createCanvas() {
90
+ const links = [
91
+ {
92
+ icon: "bug",
93
+ name: "Report a Bug",
94
+ link: "https://github.com/withastro/astro/issues/new/choose"
95
+ },
96
+ {
97
+ icon: "lightbulb",
98
+ name: "Feedback",
99
+ link: "https://github.com/withastro/roadmap/discussions/new/choose"
100
+ },
101
+ {
102
+ icon: "file-search",
103
+ name: "Documentation",
104
+ link: "https://docs.astro.build"
105
+ },
106
+ {
107
+ icon: "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 17 14\"><path fill=\"currentColor\" d=\"M14.3451 1.9072c-1.0375-.47613-2.1323-.81595-3.257-1.010998-.0102-.001716-.0207-.000234-.03.004243s-.017.011728-.022.020757c-.141.249998-.297.576998-.406.832998-1.2124-.18399-2.44561-.18399-3.658 0-.12159-.28518-.25914-.56328-.412-.832998-.00513-.00893-.01285-.016098-.02213-.02056-.00928-.004462-.0197-.00601-.02987-.00444-1.125.193998-2.22.533998-3.257 1.010998-.00888.00339-.0163.00975-.021.018-2.074 3.099-2.643004 6.122-2.364004 9.107.001.014.01.028.021.037 1.207724.8946 2.558594 1.5777 3.995004 2.02.01014.0032.02103.0031.03111-.0003.01007-.0034.01878-.01.02489-.0187.308-.42.582-.863.818-1.329.00491-.0096.0066-.0205.0048-.0312-.00181-.0106-.007-.0204-.0148-.0278-.00517-.0049-.0113-.0086-.018-.011-.43084-.1656-.84811-.3645-1.248-.595-.01117-.0063-.01948-.0167-.0232-.029-.00373-.0123-.00258-.0255.0032-.037.0034-.0074.00854-.014.015-.019.084-.063.168-.129.248-.195.00706-.0057.01554-.0093.02453-.0106.00898-.0012.01813 0 .02647.0036 2.619 1.196 5.454 1.196 8.041 0 .0086-.0037.0181-.0051.0275-.0038.0093.0012.0181.0049.0255.0108.08.066.164.132.248.195.0068.005.0123.0116.0159.0192.0036.0076.0053.016.0049.0244-.0003.0084-.0028.0166-.0072.0238-.0043.0072-.0104.0133-.0176.0176-.399.2326-.8168.4313-1.249.594-.0069.0025-.0132.0065-.0183.0117-.0052.0051-.0092.0114-.0117.0183-.0023.0067-.0032.0138-.0027.0208.0005.0071.0024.0139.0057.0202.24.465.515.909.817 1.329.0061.0087.0148.0153.0249.0187.0101.0034.021.0035.0311.0003 1.4388-.441 2.7919-1.1241 4.001-2.02.0061-.0042.0111-.0097.0147-.0161.0037-.0064.0058-.0135.0063-.0209.334-3.451-.559-6.449-2.366-9.106-.0018-.00439-.0045-.00834-.008-.01162-.0034-.00327-.0075-.00578-.012-.00738Zm-8.198 7.307c-.789 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612Zm5.316 0c-.788 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612Z\"/></svg>",
108
+ name: "Community",
109
+ link: "https://astro.build/chat"
110
+ }
111
+ ];
112
+ const { latestAstroVersion, version, debugInfo } = window.__astro_dev_toolbar__ ?? {};
113
+ const windowComponent = createWindowElement(`<style>
114
+ #buttons-container {
115
+ display: flex;
116
+ gap: 16px;
117
+ justify-content: center;
118
+ }
119
+
120
+ #buttons-container astro-dev-toolbar-card {
121
+ flex: 1;
122
+ }
123
+
124
+ footer {
125
+ display: flex;
126
+ justify-content: center;
127
+ gap: 24px;
128
+ }
129
+
130
+ footer a {
131
+ color: rgba(145, 152, 173, 1);
132
+ }
133
+
134
+ footer a:hover {
135
+ color: rgba(204, 206, 216, 1);
136
+ }
137
+
138
+ #main-container {
139
+ display: flex;
140
+ flex-direction: column;
141
+ height: 100%;
142
+ gap: 24px;
143
+ }
144
+
145
+ p {
146
+ margin-top: 0;
147
+ }
148
+
149
+ header {
150
+ display: flex;
151
+ justify-content: space-between;
152
+ align-items: center;
153
+ }
154
+
155
+ header section {
156
+ display: flex;
157
+ gap: 0.8em;
158
+ }
159
+
160
+ h2 {
161
+ color: white;
162
+ margin: 0;
163
+ font-size: 18px;
164
+ }
165
+
166
+ a {
167
+ color: rgba(224, 204, 250, 1);
168
+ }
169
+
170
+ a:hover {
171
+ color: #f4ecfd;
172
+ }
173
+
174
+ #integration-list-wrapper {
175
+ position: relative;
176
+ --offset: 24px;
177
+ overflow-x: auto;
178
+ overflow-y: hidden;
179
+ margin-left: calc(var(--offset) * -1);
180
+ margin-right: calc(var(--offset) * -1);
181
+ padding-left: var(--offset);
182
+ padding-right: var(--offset);
183
+ height: 210px;
184
+ }
185
+
186
+ /* Pseudo-elements to fade cards as they scroll out of viewport */
187
+ #integration-list-wrapper::before,
188
+ #integration-list-wrapper::after {
189
+ content: '';
190
+ height: 192px;
191
+ display: block;
192
+ position: fixed;
193
+ width: var(--offset);
194
+ top: 106px;
195
+ background: red;
196
+ }
197
+
198
+ #integration-list-wrapper::before {
199
+ left: -1px;
200
+ border-left: 1px solid rgba(52, 56, 65, 1);
201
+ background: linear-gradient(to right, rgba(19, 21, 26, 1), rgba(19, 21, 26, 0));
202
+ }
203
+
204
+ #integration-list-wrapper::after {
205
+ right: -1px;
206
+ border-right: 1px solid rgba(52, 56, 65, 1);
207
+ background: linear-gradient(to left, rgba(19, 21, 26, 1), rgba(19, 21, 26, 0));
208
+ }
209
+
210
+ #integration-list-wrapper::-webkit-scrollbar {
211
+ width: 5px;
212
+ height: 8px;
213
+ background-color: rgba(255, 255, 255, 0.08); /* or add it to the track */
214
+ border-radius: 4px;
215
+ }
216
+
217
+ /* This is wild but gives us a gap on either side of the container */
218
+ #integration-list-wrapper::-webkit-scrollbar-button:start:decrement,
219
+ #integration-list-wrapper::-webkit-scrollbar-button:end:increment {
220
+ display: block;
221
+ width: 24px;
222
+ background-color: #13151A;
223
+ }
224
+
225
+ /* Removes arrows on both sides */
226
+ #integration-list-wrapper::-webkit-scrollbar-button:horizontal:start:increment,
227
+ #integration-list-wrapper::-webkit-scrollbar-button:horizontal:end:decrement {
228
+ display: none;
229
+ }
230
+
231
+ #integration-list-wrapper::-webkit-scrollbar-track-piece {
232
+ border-radius: 4px;
233
+ }
234
+
235
+ #integration-list-wrapper::-webkit-scrollbar-thumb {
236
+ background-color: rgba(255, 255, 255, 0.3);
237
+ border-radius: 4px;
238
+ }
239
+
240
+ #integration-list {
241
+ margin-top: 1em;
242
+ display: flex;
243
+ gap: 16px;
244
+ padding-bottom: 1em;
245
+ }
246
+
247
+ #integration-list::after {
248
+ content: " ";
249
+ display: inline-block;
250
+ white-space: pre;
251
+ width: 1px;
252
+ height: 1px;
253
+ }
254
+
255
+ #integration-list astro-dev-toolbar-card, .integration-skeleton {
256
+ min-width: 240px;
257
+ height: 160px;
258
+ }
259
+
260
+ .integration-skeleton {
261
+ animation: pulse 2s calc(var(--i, 0) * 250ms) cubic-bezier(0.4, 0, 0.6, 1) infinite;
262
+ background-color: rgba(35, 38, 45, 1);
263
+ border-radius: 8px;
264
+ }
265
+
266
+ @keyframes pulse {
267
+ 0%, 100% {
268
+ opacity: 1;
269
+ }
270
+ 50% {
271
+ opacity: .5;
272
+ }
273
+ }
274
+
275
+ #integration-list astro-dev-toolbar-card .integration-image {
276
+ width: 40px;
277
+ height: 40px;
278
+ background-color: var(--integration-image-background, white);
279
+ border-radius: 9999px;
280
+ display: flex;
281
+ justify-content: center;
282
+ align-items: center;
283
+ margin-bottom: 8px;
284
+ }
285
+
286
+ #integration-list astro-dev-toolbar-card img {
287
+ width: 24px;
288
+ height: 24px;
289
+ }
290
+
291
+ #integration-list astro-dev-toolbar-card astro-dev-toolbar-icon {
292
+ width: 24px;
293
+ height: 24px;
294
+ color: #fff;
295
+ }
296
+
297
+ #links {
298
+ margin: auto 0;
299
+ display: flex;
300
+ justify-content: center;
301
+ gap: 24px;
302
+ }
303
+
304
+ #links a {
305
+ text-decoration: none;
306
+ align-items: center;
307
+ display: flex;
308
+ flex-direction: column;
309
+ gap: 0.7em;
310
+ flex: 1;
311
+ white-space: nowrap;
312
+ font-weight: 600;
313
+ color: white;
314
+ }
315
+
316
+ #links a:hover {
317
+ color: rgba(145, 152, 173, 1);
318
+ }
319
+
320
+ #links astro-dev-toolbar-icon {
321
+ width: 1.5em;
322
+ height: 1.5em;
323
+ display: block;
324
+ }
325
+
326
+ #integration-list astro-dev-toolbar-card svg {
327
+ width: 24px;
328
+ height: 24px;
329
+ vertical-align: bottom;
330
+ }
331
+
332
+ #integration-list astro-dev-toolbar-card h3 {
333
+ margin: 0;
334
+ margin-bottom: 8px;
335
+ color: white;
336
+ white-space: nowrap;
337
+ }
338
+
339
+ #integration-list astro-dev-toolbar-card p {
340
+ font-size: 14px;
341
+ }
342
+
343
+ @media (forced-colors: active) {
344
+ svg path[fill="#fff"] {
345
+ fill: black;
346
+ }
347
+ }
348
+ </style>
349
+
350
+ <header>
351
+ <section>
352
+ ${astroLogo}
353
+ <astro-dev-toolbar-badge badge-style="gray" size="large">${version}</astro-dev-toolbar-badge>
354
+ ${latestAstroVersion ? `<astro-dev-toolbar-badge badge-style="green" size="large">${latestAstroVersion} available!</astro-dev-toolbar-badge>
355
+ ` : ""}
356
+ </section>
357
+ <astro-dev-toolbar-button id="copy-debug-button">Copy debug info <astro-dev-toolbar-icon icon="copy" /></astro-dev-toolbar-button>
358
+ </header>
359
+ <hr />
360
+
361
+ <div id="main-container">
362
+ <div>
363
+ <header><h2>Featured integrations</h2><a href="https://astro.build/integrations/" target="_blank">View all</a></header>
364
+ <div id="integration-list-wrapper">
365
+ <section id="integration-list">
366
+ <div class="integration-skeleton" style="--i:0;"></div>
367
+ <div class="integration-skeleton" style="--i:1;"></div>
368
+ <div class="integration-skeleton" style="--i:2;"></div>
369
+ <div class="integration-skeleton" style="--i:3;"></div>
370
+ <div class="integration-skeleton" style="--i:4;"></div>
371
+ </section>
372
+ </div>
373
+ </div>
374
+ <section id="links">
375
+ ${links.map((link) => `<a href="${link.link}" target="_blank"><astro-dev-toolbar-icon ${isDefinedIcon(link.icon) ? `icon="${link.icon}">` : `>${link.icon}`}</astro-dev-toolbar-icon>${link.name}</a>`).join("")}
376
+ </section>
377
+ </div>
378
+ `);
379
+ const copyDebugButton = windowComponent.querySelector("#copy-debug-button");
380
+ copyDebugButton?.addEventListener("click", () => {
381
+ navigator.clipboard.writeText("```\n" + debugInfo + "\n```");
382
+ copyDebugButton.textContent = "Copied to clipboard!";
383
+ setTimeout(() => {
384
+ resetDebugButton();
385
+ }, 3500);
386
+ });
387
+ canvas.append(windowComponent);
388
+ if (integrationData) refreshIntegrationList();
389
+ }
390
+ function resetDebugButton() {
391
+ const copyDebugButton = canvas.querySelector("#copy-debug-button");
392
+ if (!copyDebugButton) return;
393
+ copyDebugButton.innerHTML = "Copy debug info <astro-dev-toolbar-icon icon=\"copy\" />";
394
+ }
395
+ function refreshIntegrationList() {
396
+ const integrationList = canvas.querySelector("#integration-list");
397
+ if (!integrationList) return;
398
+ integrationList.innerHTML = "";
399
+ const fragment = document.createDocumentFragment();
400
+ for (const integration of integrationData.data) {
401
+ const integrationComponent = document.createElement("astro-dev-toolbar-card");
402
+ integrationComponent.link = integration.homepageUrl;
403
+ const integrationContainer = document.createElement("div");
404
+ integrationContainer.className = "integration-container";
405
+ const integrationImage = document.createElement("div");
406
+ integrationImage.className = "integration-image";
407
+ if (integration.image) {
408
+ const img = document.createElement("img");
409
+ img.src = integration.image;
410
+ img.alt = integration.title;
411
+ integrationImage.append(img);
412
+ } else {
413
+ const icon = document.createElement("astro-dev-toolbar-icon");
414
+ icon.icon = iconForIntegration(integration);
415
+ integrationImage.append(icon);
416
+ integrationImage.style.setProperty("--integration-image-background", colorForIntegration());
417
+ }
418
+ integrationContainer.append(integrationImage);
419
+ let integrationTitle = document.createElement("h3");
420
+ integrationTitle.textContent = integration.title;
421
+ if (integration.official || integration.categories.includes("official")) integrationTitle.innerHTML += " <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 21 20\"><rect width=\"19\" height=\"19\" x=\"1.16602\" y=\".5\" fill=\"url(#paint0_linear_917_1096)\" fill-opacity=\".33\" rx=\"9.5\"/><path fill=\"#fff\" d=\"M15.139 6.80657c-.062-.06248-.1357-.11208-.217-.14592-.0812-.03385-.1683-.05127-.2563-.05127-.0881 0-.1752.01742-.2564.05127-.0813.03384-.155.08344-.217.14592L9.22566 11.7799 7.13899 9.68657c-.06435-.06216-.14031-.11103-.22355-.14383-.08323-.03281-.17211-.04889-.26157-.04735-.08945.00155-.17773.0207-.25978.05637a.68120694.68120694 0 0 0-.21843.15148c-.06216.06435-.11104.14031-.14384.22355-.0328.08321-.04889.17211-.04734.26161.00154.0894.0207.1777.05636.2597.03566.0821.08714.1563.15148.2185l2.56 2.56c.06198.0625.13571.1121.21695.1459s.16838.0513.25639.0513c.088 0 .17514-.0175.25638-.0513s.15497-.0834.21695-.1459L15.139 7.78657c.0677-.06242.1217-.13819.1586-.22253.0369-.08433.056-.1754.056-.26747 0-.09206-.0191-.18313-.056-.26747-.0369-.08433-.0909-.1601-.1586-.22253Z\"/><rect width=\"19\" height=\"19\" x=\"1.16602\" y=\".5\" stroke=\"url(#paint1_linear_917_1096)\" rx=\"9.5\"/><defs><linearGradient id=\"paint0_linear_917_1096\" x1=\"20.666\" x2=\"-3.47548\" y1=\".00000136\" y2=\"10.1345\" gradientUnits=\"userSpaceOnUse\"><stop stop-color=\"#4AF2C8\"/><stop offset=\"1\" stop-color=\"#2F4CB3\"/></linearGradient><linearGradient id=\"paint1_linear_917_1096\" x1=\"20.666\" x2=\"-3.47548\" y1=\".00000136\" y2=\"10.1345\" gradientUnits=\"userSpaceOnUse\"><stop stop-color=\"#4AF2C8\"/><stop offset=\"1\" stop-color=\"#2F4CB3\"/></linearGradient></defs></svg>";
422
+ integrationContainer.append(integrationTitle);
423
+ const integrationDescription = document.createElement("p");
424
+ integrationDescription.textContent = integration.description.length > 90 ? integration.description.slice(0, 90) + "…" : integration.description;
425
+ integrationContainer.append(integrationDescription);
426
+ integrationComponent.append(integrationContainer);
427
+ fragment.append(integrationComponent);
428
+ }
429
+ integrationList.append(fragment);
430
+ }
431
+ }
432
+ };
433
+ //#endregion
434
+ export { astro_default as default };