@janga/norna 0.7.6 → 0.7.7

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 (137) hide show
  1. package/README.md +5 -5
  2. package/astro.config.mjs +76 -0
  3. package/bin/norna-cli.mjs +2 -2
  4. package/docs/README.md +3 -3
  5. package/docs/commands.md +6 -6
  6. package/docs/configuration.md +3 -2
  7. package/docs/content.md +152 -91
  8. package/docs/design/site-examples-structure.md +1 -1
  9. package/docs/engine-development.md +3 -3
  10. package/docs/getting-started.md +4 -3
  11. package/docs/images-and-metadata.md +112 -20
  12. package/docs/routes.md +9 -12
  13. package/docs/site-structure.md +4 -3
  14. package/docs/theme.md +8 -7
  15. package/docs/typography.md +5 -5
  16. package/examples/dog-gallery/site/content.md +41 -45
  17. package/examples/dog-gallery/site/routes/010-dog-care/route-content.md +1 -3
  18. package/fixtures/basic/site/content.md +2 -4
  19. package/fixtures/content-model-v2/.astro/collections/site.schema.json +776 -0
  20. package/fixtures/content-model-v2/.astro/collections/theme.schema.json +668 -0
  21. package/fixtures/content-model-v2/.astro/content-assets.mjs +4 -0
  22. package/fixtures/content-model-v2/.astro/content-modules.mjs +1 -0
  23. package/fixtures/content-model-v2/.astro/content.d.ts +175 -0
  24. package/fixtures/content-model-v2/.astro/data-store.json +1 -0
  25. package/fixtures/content-model-v2/.astro/dev-local.json +8 -0
  26. package/fixtures/content-model-v2/.astro/dev.json +13 -0
  27. package/fixtures/content-model-v2/.astro/dev.log +231 -0
  28. package/fixtures/content-model-v2/.astro/settings.json +5 -0
  29. package/fixtures/content-model-v2/.astro/types.d.ts +2 -0
  30. package/fixtures/content-model-v2/dist/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js +1 -0
  31. package/fixtures/content-model-v2/dist/_astro/SitePage.BbfZub4g.css +1 -0
  32. package/fixtures/content-model-v2/dist/guide/index.html +3 -0
  33. package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-480.webp +0 -0
  34. package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-768.webp +0 -0
  35. package/fixtures/content-model-v2/dist/images/generated/intro/detail-27930b14-971.webp +0 -0
  36. package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-480.webp +0 -0
  37. package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-768.webp +0 -0
  38. package/fixtures/content-model-v2/dist/images/generated/intro/duplicate-49c98f6c-971.webp +0 -0
  39. package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-480.webp +0 -0
  40. package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-768.webp +0 -0
  41. package/fixtures/content-model-v2/dist/images/generated/intro/hero-6d588a83-971.webp +0 -0
  42. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1080.webp +0 -0
  43. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1440.webp +0 -0
  44. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-1600.webp +0 -0
  45. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-480.webp +0 -0
  46. package/fixtures/content-model-v2/dist/images/generated/plain/image-3770d763-768.webp +0 -0
  47. package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-480.webp +0 -0
  48. package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-768.webp +0 -0
  49. package/fixtures/content-model-v2/dist/images/generated/routes/010-guide/images/intro/duplicate-5cf614d2-960.webp +0 -0
  50. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1080.webp +0 -0
  51. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1440.webp +0 -0
  52. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-1600.webp +0 -0
  53. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-480.webp +0 -0
  54. package/fixtures/content-model-v2/dist/images/generated/timed/slide-one-3770d763-768.webp +0 -0
  55. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1080.webp +0 -0
  56. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1440.webp +0 -0
  57. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-1600.webp +0 -0
  58. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-480.webp +0 -0
  59. package/fixtures/content-model-v2/dist/images/generated/timed/slide-three-5bdec65e-768.webp +0 -0
  60. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1080.webp +0 -0
  61. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1440.webp +0 -0
  62. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-1600.webp +0 -0
  63. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-480.webp +0 -0
  64. package/fixtures/content-model-v2/dist/images/generated/timed/slide-two-26c08aee-768.webp +0 -0
  65. package/fixtures/content-model-v2/dist/index.html +8 -0
  66. package/fixtures/content-model-v2/node_modules/.vite/deps/_metadata.json +80 -0
  67. package/fixtures/content-model-v2/node_modules/.vite/deps/astro-D_GIpJIE.js +434 -0
  68. package/fixtures/content-model-v2/node_modules/.vite/deps/astro-D_GIpJIE.js.map +1 -0
  69. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  70. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  71. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  72. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  73. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  74. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  75. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  76. package/fixtures/content-model-v2/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  77. package/fixtures/content-model-v2/node_modules/.vite/deps/audit-DM9Hkl5B.js +1534 -0
  78. package/fixtures/content-model-v2/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +1 -0
  79. package/fixtures/content-model-v2/node_modules/.vite/deps/embla-carousel.js +1389 -0
  80. package/fixtures/content-model-v2/node_modules/.vite/deps/embla-carousel.js.map +1 -0
  81. package/fixtures/content-model-v2/node_modules/.vite/deps/highlight-DnZ1ULOL.js +48 -0
  82. package/fixtures/content-model-v2/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +1 -0
  83. package/fixtures/content-model-v2/node_modules/.vite/deps/icons-RyebKi45.js +42 -0
  84. package/fixtures/content-model-v2/node_modules/.vite/deps/icons-RyebKi45.js.map +1 -0
  85. package/fixtures/content-model-v2/node_modules/.vite/deps/package.json +3 -0
  86. package/fixtures/content-model-v2/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  87. package/fixtures/content-model-v2/node_modules/.vite/deps/settings-DaU-gNnK.js +190 -0
  88. package/fixtures/content-model-v2/node_modules/.vite/deps/settings-DaU-gNnK.js.map +1 -0
  89. package/fixtures/content-model-v2/node_modules/.vite/deps/toolbar-63PA619H.js +458 -0
  90. package/fixtures/content-model-v2/node_modules/.vite/deps/toolbar-63PA619H.js.map +1 -0
  91. package/fixtures/content-model-v2/node_modules/.vite/deps/ui-library--bkcNSYz.js +1016 -0
  92. package/fixtures/content-model-v2/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +1 -0
  93. package/fixtures/content-model-v2/node_modules/.vite/deps/window-jPkpKVcy.js +32 -0
  94. package/fixtures/content-model-v2/node_modules/.vite/deps/window-jPkpKVcy.js.map +1 -0
  95. package/fixtures/content-model-v2/node_modules/.vite/deps/xray-BXCHpEJP.js +111 -0
  96. package/fixtures/content-model-v2/node_modules/.vite/deps/xray-BXCHpEJP.js.map +1 -0
  97. package/fixtures/content-model-v2/site/.norna/generated-images.json +210 -0
  98. package/fixtures/content-model-v2/site/config.mjs +11 -0
  99. package/fixtures/content-model-v2/site/content.md +84 -0
  100. package/fixtures/content-model-v2/site/images/card-section/adopt.svg +9 -0
  101. package/fixtures/content-model-v2/site/images/card-section/foster.svg +12 -0
  102. package/fixtures/content-model-v2/site/images/intro/detail.jpg +0 -0
  103. package/fixtures/content-model-v2/site/images/intro/duplicate.jpg +0 -0
  104. package/fixtures/content-model-v2/site/images/intro/hero.jpg +0 -0
  105. package/fixtures/content-model-v2/site/images/plain/image.jpg +0 -0
  106. package/fixtures/content-model-v2/site/images/timed/slide-one.jpg +0 -0
  107. package/fixtures/content-model-v2/site/images/timed/slide-three.jpg +0 -0
  108. package/fixtures/content-model-v2/site/images/timed/slide-two.jpg +0 -0
  109. package/fixtures/content-model-v2/site/routes/010-guide/images/intro/duplicate.jpg +0 -0
  110. package/fixtures/content-model-v2/site/routes/010-guide/route-content.md +17 -0
  111. package/fixtures/content-model-v2/site/theme.md +9 -0
  112. package/package.json +3 -2
  113. package/scripts/deploy-site.mjs +11 -4
  114. package/scripts/dev-local.mjs +6 -0
  115. package/scripts/generate-images.mjs +132 -56
  116. package/scripts/lib/image-dimensions.mjs +26 -0
  117. package/scripts/lib/norna-markdown-blocks.mjs +643 -0
  118. package/scripts/lib/site-content.mjs +31 -29
  119. package/scripts/show-typography.mjs +17 -9
  120. package/scripts/sync-content-sections.mjs +280 -411
  121. package/scripts/test-content-check.mjs +59 -45
  122. package/scripts/test-content-model-v2.mjs +998 -0
  123. package/scripts/test-engine-commands.mjs +1 -1
  124. package/scripts/test-package-check.mjs +36 -8
  125. package/scripts/test-temporary-visibility.mjs +3 -6
  126. package/src/components/CardList.astro +77 -0
  127. package/src/components/GalleryGrid.astro +22 -12
  128. package/src/components/SiteNavigation.astro +5 -4
  129. package/src/components/SitePage.astro +9 -2
  130. package/src/components/SiteSection.astro +35 -13
  131. package/src/content.config.ts +4 -17
  132. package/src/lib/generatedImages.ts +50 -10
  133. package/src/lib/sectionContent.ts +130 -35
  134. package/src/styles/global.css +187 -0
  135. package/starters/basic/site/content.md +10 -6
  136. package/starters/project/site/content.md +0 -9
  137. package/starters/project/site/routes/010-guide/route-content.md +0 -5
@@ -0,0 +1,8 @@
1
+ <!DOCTYPE html><html lang="en" style="scroll-behavior: smooth; --font-sans: Arial, 'Helvetica Neue', Helvetica, sans-serif; --page-width: 1180px; --content-gutter-desktop: clamp(1.25rem, 4vw, 3rem); --content-gutter-mobile: 1rem; --space-nav-to-first-section-desktop: clamp(1.25rem, 3vw, 2.5rem); --space-nav-to-first-section-mobile: 1.25rem; --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.5rem; --space-section-to-section-desktop: clamp(1.4rem, 3vw, 2.75rem); --space-section-to-section-mobile: 1.5rem; --space-final-section-bottom-desktop: clamp(1.4rem, 3vw, 2.75rem); --space-final-section-bottom-mobile: 1.5rem; --gallery-width: 900px; --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="Internal fixture for Markdown-authoritative Norna content."><meta name="theme-color" content="#000000"><link rel="canonical" href="https://example.com/"><meta name="generator" content="Astro v7.1.3"><title>Content Model v2 Fixture</title><link rel="stylesheet" href="/_astro/SitePage.BbfZub4g.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: var(--color-page); --site-top-text-color: var(--color-text)"><div class="site-nav-row"><a class="site-brand" href="/">Content Model v2 Fixture</a><nav class="site-nav" aria-label="Pages"><ul><li><a href="/" aria-current="page">Content Model v2 Fixture</a></li><li><a href="/guide/">Guide</a></li></ul></nav><details class="mobile-nav-menu"><summary><span>Content Model v2 Fixture</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">Content Model v2 Fixture</a></li><li><a href="/guide/">Guide</a></li></ul></nav><nav class="mobile-page-nav" aria-label="On this page"><h2>On this page</h2><ul><li><a href="#intro" aria-current="true">Intro</a></li><li><a href="#timed">Timed section</a></li><li><a href="#plain">Plain section</a></li></ul></nav></div></details></div><nav class="page-nav" aria-label="On this page"><ul><li><a href="#intro" aria-current="true">Intro</a></li><li><a href="#timed">Timed section</a></li><li><a href="#plain">Plain section</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="intro" class="site-section" data-section-title="Intro" style="--section-background-color: transparent; --section-text-color: var(--color-text); --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.04; --section-heading-spacing-after: 0.55em; --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.05rem, 0.98rem + 0.28vw, 1.22rem); --section-markdown-h3-font-size-mobile: clamp(1.04rem, 0.98rem + 0.45vw, 1.18rem); --section-markdown-h3-line-height: 1.18; --section-markdown-h3-spacing-before: 1.5em; --section-markdown-h3-spacing-after: 0.5em; --section-markdown-h4-align-desktop: left; --section-markdown-h4-align-mobile: left; --section-markdown-h4-font-size-desktop: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-markdown-h4-font-size-mobile: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-markdown-h4-line-height: 1.42; --section-markdown-h4-spacing-before: 1.1em; --section-markdown-h4-spacing-after: 0.4em; --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.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.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-font-size-mobile: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-line-height: 1.3; --section-caption-spacing-before: 0.5em; --section-caption-justify-desktop: center; --section-caption-justify-mobile: center"><div class="section-card"><header class="section-header"><h1>Intro</h1></header><div class="section-body section-body-has-gallery"><div class="section-markdown"><p>This fixture validates that Markdown defines sections and that section metadata
2
+ is optional. It also checks <span class="inline-style inline-style-highlight" style="--inline-style-color: #b3261e">inline styles</span>.</p>
3
+ </div><div class="gallery" aria-label="Images: Intro"><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/intro/hero-6d588a83-971.webp" srcset="/images/generated/intro/hero-6d588a83-480.webp 480w, /images/generated/intro/hero-6d588a83-768.webp 768w, /images/generated/intro/hero-6d588a83-971.webp 971w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 971 / 1619;" width="971" height="1619" class="gallery-image" alt="A black Labrador-type dog sitting on grass." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>Dog portrait one: a black Labrador-type dog.</span></div></figcaption></figure></div><script type="module" src="/_astro/GalleryGrid.astro_astro_type_script_index_0_lang.B0kxDyGz.js"></script><div class="section-markdown">
4
+ <h3 id="subhead-but-not-a-new-section">Subhead, but not a new section</h3>
5
+ <p>Text can continue after a Norna-managed image.</p>
6
+ </div><div class="gallery" aria-label="Images: Intro"><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/intro/detail-27930b14-971.webp" srcset="/images/generated/intro/detail-27930b14-480.webp 480w, /images/generated/intro/detail-27930b14-768.webp 768w, /images/generated/intro/detail-27930b14-971.webp 971w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 971 / 1619;" width="971" height="1619" class="gallery-image" alt="A small tan terrier-type dog standing in grass." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>Dog portrait two: a small tan terrier-type dog.</span></div></figcaption></figure><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/intro/duplicate-49c98f6c-971.webp" srcset="/images/generated/intro/duplicate-49c98f6c-480.webp 480w, /images/generated/intro/duplicate-49c98f6c-768.webp 768w, /images/generated/intro/duplicate-49c98f6c-971.webp 971w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 971 / 1619;" width="971" height="1619" class="gallery-image" alt="A white and brown border collie-type dog sitting outdoors." decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>Dog portrait three: a white and brown border collie-type dog.</span></div></figcaption></figure></div></div></div></section><section id="timed" class="site-section" data-section-title="Timed section" style="--section-background-color: transparent; --section-text-color: var(--color-text); --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-after: 0.55em; --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.05rem, 0.98rem + 0.28vw, 1.22rem); --section-markdown-h3-font-size-mobile: clamp(1.04rem, 0.98rem + 0.45vw, 1.18rem); --section-markdown-h3-line-height: 1.35; --section-markdown-h3-spacing-before: 1.5em; --section-markdown-h3-spacing-after: 0.5em; --section-markdown-h4-align-desktop: left; --section-markdown-h4-align-mobile: left; --section-markdown-h4-font-size-desktop: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-markdown-h4-font-size-mobile: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-markdown-h4-line-height: 1.55; --section-markdown-h4-spacing-before: 1.1em; --section-markdown-h4-spacing-after: 0.4em; --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: 0.85em; --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.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-font-size-mobile: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-line-height: 1.4; --section-caption-spacing-before: 0.5em; --section-caption-justify-desktop: flex-start; --section-caption-justify-mobile: flex-start"><div class="section-card"><header class="section-header"><h2>Timed section</h2></header><div class="section-body section-body-has-gallery"><div class="section-markdown"><p>This section uses frontmatter metadata without duplicating section order.</p>
7
+ </div><div class="gallery" aria-label="Images: Timed section"><section class="gallery-item gallery-carousel" data-carousel tabindex="0" role="group" aria-roledescription="carousel" aria-label="Timed section, bildkarusell" style="--gallery-carousel-aspect-ratio: 1.6666666666666667"><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/timed/slide-one-3770d763-1440.webp" srcset="/images/generated/timed/slide-one-3770d763-480.webp 480w, /images/generated/timed/slide-one-3770d763-768.webp 768w, /images/generated/timed/slide-one-3770d763-1080.webp 1080w, /images/generated/timed/slide-one-3770d763-1440.webp 1440w, /images/generated/timed/slide-one-3770d763-1600.webp 1600w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 1600 / 960;" width="1600" height="960" class="gallery-image gallery-image-landscape" alt="A russet-brown dog beginning a gallop in a grassy field." 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/timed/slide-two-26c08aee-1440.webp" srcset="/images/generated/timed/slide-two-26c08aee-480.webp 480w, /images/generated/timed/slide-two-26c08aee-768.webp 768w, /images/generated/timed/slide-two-26c08aee-1080.webp 1080w, /images/generated/timed/slide-two-26c08aee-1440.webp 1440w, /images/generated/timed/slide-two-26c08aee-1600.webp 1600w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 1600 / 960;" width="1600" height="960" class="gallery-image gallery-image-landscape" alt="The same russet-brown dog fully extended in mid-gallop." 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/timed/slide-three-5bdec65e-1440.webp" srcset="/images/generated/timed/slide-three-5bdec65e-480.webp 480w, /images/generated/timed/slide-three-5bdec65e-768.webp 768w, /images/generated/timed/slide-three-5bdec65e-1080.webp 1080w, /images/generated/timed/slide-three-5bdec65e-1440.webp 1440w, /images/generated/timed/slide-three-5bdec65e-1600.webp 1600w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 1600 / 960;" width="1600" height="960" class="gallery-image gallery-image-landscape" alt="The same russet-brown dog landing during a gallop." 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 / 3</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>Gallop phase one: push-off.</span></span></p><p class="gallery-meta gallery-carousel-caption" data-carousel-caption data-carousel-caption-index="1"><span class="gallery-details"><span>Gallop phase two: suspension.</span></span></p><p class="gallery-meta gallery-carousel-caption" data-carousel-caption data-carousel-caption-index="2"><span class="gallery-details"><span>Gallop phase three: landing.</span></span></p></div></section></div></div></div></section><section id="plain" class="site-section" data-section-title="Plain section" style="--section-background-color: transparent; --section-text-color: var(--color-text); --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-after: 0.55em; --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.05rem, 0.98rem + 0.28vw, 1.22rem); --section-markdown-h3-font-size-mobile: clamp(1.04rem, 0.98rem + 0.45vw, 1.18rem); --section-markdown-h3-line-height: 1.35; --section-markdown-h3-spacing-before: 1.5em; --section-markdown-h3-spacing-after: 0.5em; --section-markdown-h4-align-desktop: left; --section-markdown-h4-align-mobile: left; --section-markdown-h4-font-size-desktop: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-markdown-h4-font-size-mobile: clamp(0.96rem, 0.94rem + 0.08vw, 1rem); --section-markdown-h4-line-height: 1.55; --section-markdown-h4-spacing-before: 1.1em; --section-markdown-h4-spacing-after: 0.4em; --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: 0.85em; --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.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-font-size-mobile: clamp(0.86rem, 0.84rem + 0.08vw, 0.92rem); --section-caption-line-height: 1.4; --section-caption-spacing-before: 0.5em; --section-caption-justify-desktop: flex-start; --section-caption-justify-mobile: flex-start"><div class="section-card"><header class="section-header"><h2>Plain section</h2></header><div class="section-body section-body-has-gallery"><div class="section-markdown"><p>This section has no frontmatter metadata.</p>
8
+ </div><div class="gallery" aria-label="Images: Plain section"><figure class="gallery-item"><div class="gallery-image-frame"><img src="/images/generated/plain/image-3770d763-1440.webp" srcset="/images/generated/plain/image-3770d763-480.webp 480w, /images/generated/plain/image-3770d763-768.webp 768w, /images/generated/plain/image-3770d763-1080.webp 1080w, /images/generated/plain/image-3770d763-1440.webp 1440w, /images/generated/plain/image-3770d763-1600.webp 1600w" sizes="(max-width: 700px) 100vw, 100vw" style="aspect-ratio: 1600 / 960;" width="1600" height="960" class="gallery-image gallery-image-landscape" alt decoding="async" fetchpriority="low" loading="lazy"></div><figcaption class="gallery-meta"><div class="gallery-details"><span>a dog</span></div></figcaption></figure></div></div></div></section></main></body></html>
@@ -0,0 +1,80 @@
1
+ {
2
+ "hash": "de113bed",
3
+ "configHash": "5c2ed27d",
4
+ "lockfileHash": "808f2e8e",
5
+ "browserHash": "e72fc9bb",
6
+ "optimized": {
7
+ "astro > aria-query": {
8
+ "src": "../../../../../node_modules/aria-query/lib/index.js",
9
+ "file": "astro_n_aria-query.js",
10
+ "fileHash": "14eef713",
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": "256c2859",
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": "7db8908e",
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": "5fc5d14b",
29
+ "needsInterop": false
30
+ },
31
+ "embla-carousel": {
32
+ "src": "../../../../../node_modules/embla-carousel/esm/embla-carousel.esm.js",
33
+ "file": "embla-carousel.js",
34
+ "fileHash": "be8494a6",
35
+ "needsInterop": false
36
+ }
37
+ },
38
+ "chunks": {
39
+ "astro-D_GIpJIE": {
40
+ "file": "astro-D_GIpJIE.js",
41
+ "isDynamicEntry": true
42
+ },
43
+ "audit-DM9Hkl5B": {
44
+ "file": "audit-DM9Hkl5B.js",
45
+ "isDynamicEntry": true
46
+ },
47
+ "highlight-DnZ1ULOL": {
48
+ "file": "highlight-DnZ1ULOL.js",
49
+ "isDynamicEntry": false
50
+ },
51
+ "icons-RyebKi45": {
52
+ "file": "icons-RyebKi45.js",
53
+ "isDynamicEntry": false
54
+ },
55
+ "rolldown-runtime-BvCyGRYZ": {
56
+ "file": "rolldown-runtime-BvCyGRYZ.js",
57
+ "isDynamicEntry": false
58
+ },
59
+ "settings-DaU-gNnK": {
60
+ "file": "settings-DaU-gNnK.js",
61
+ "isDynamicEntry": true
62
+ },
63
+ "toolbar-63PA619H": {
64
+ "file": "toolbar-63PA619H.js",
65
+ "isDynamicEntry": true
66
+ },
67
+ "ui-library--bkcNSYz": {
68
+ "file": "ui-library--bkcNSYz.js",
69
+ "isDynamicEntry": true
70
+ },
71
+ "window-jPkpKVcy": {
72
+ "file": "window-jPkpKVcy.js",
73
+ "isDynamicEntry": false
74
+ },
75
+ "xray-BXCHpEJP": {
76
+ "file": "xray-BXCHpEJP.js",
77
+ "isDynamicEntry": true
78
+ }
79
+ }
80
+ }
@@ -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 };