@janga/norna 0.7.11 → 0.7.13

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 (239) hide show
  1. package/README.md +120 -108
  2. package/bin/norna-cli.mjs +1 -1
  3. package/docs/README.md +107 -75
  4. package/docs/assets/norna-dog-shelter.jpg +0 -0
  5. package/docs/commands.md +7 -4
  6. package/docs/configuration.md +86 -185
  7. package/docs/design/command-organization.md +1 -1
  8. package/docs/design/norna-diagram-design.md +2 -1
  9. package/docs/design/site-examples-structure.md +4 -1
  10. package/docs/engine-development.md +15 -8
  11. package/docs/getting-started.md +126 -144
  12. package/docs/how-to/embedded-site.md +35 -0
  13. package/docs/publishing.md +47 -46
  14. package/docs/requirements.md +54 -0
  15. package/docs/routes.md +1 -1
  16. package/docs/site-structure.md +4 -4
  17. package/docs/sitewide-content.md +2 -1
  18. package/docs/theme.md +18 -0
  19. package/examples/README.md +26 -24
  20. package/examples/complete-sites/dog-shelter-multi-page/.astro/content-assets.mjs +4 -1
  21. package/examples/complete-sites/dog-shelter-multi-page/.astro/content.d.ts +1 -1
  22. package/examples/complete-sites/dog-shelter-multi-page/.astro/data-store.json +1 -1
  23. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.json +6 -8
  24. package/examples/complete-sites/dog-shelter-multi-page/.astro/dev.log +26 -53
  25. package/examples/complete-sites/dog-shelter-multi-page/README.md +7 -0
  26. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/_metadata.json +29 -35
  27. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{astro-D_GIpJIE.js → astro-B3JHJyiv.js} +4 -4
  28. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  29. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_aria-query.js +151 -151
  30. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -1
  31. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_axobject-query.js +131 -131
  32. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -1
  33. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_html-escaper.js +1 -1
  34. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -1
  35. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +10 -10
  36. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -1
  37. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{audit-DM9Hkl5B.js → audit-C3SVr7dT.js} +10 -10
  38. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  39. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{highlight-DnZ1ULOL.js → highlight-BLtvqtzO.js} +1 -1
  40. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  41. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{icons-RyebKi45.js → icons-C92i61-2.js} +1 -1
  42. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  43. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{settings-DaU-gNnK.js → settings-v5GgKks_.js} +2 -2
  44. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  45. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{toolbar-63PA619H.js → toolbar-BFvJVp26.js} +2 -2
  46. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  47. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{ui-library--bkcNSYz.js → ui-library-Cd35oAvo.js} +10 -10
  48. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  49. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{window-jPkpKVcy.js → window-vo3A6TMn.js} +1 -1
  50. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  51. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/{xray-BXCHpEJP.js → xray-DwhzGckb.js} +3 -3
  52. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  53. package/examples/complete-sites/dog-shelter-multi-page/site/.norna/generated-images.json +92 -12
  54. package/examples/complete-sites/dog-shelter-multi-page/site/config.md +3 -0
  55. package/examples/complete-sites/dog-shelter-multi-page/site/content.md +12 -0
  56. package/examples/complete-sites/dog-shelter-multi-page/site/images/intro/shelter-dog.jpg +0 -0
  57. package/examples/complete-sites/dog-shelter-multi-page/site/public/logo.svg +9 -0
  58. package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rex.jpg +0 -0
  59. package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rover.jpg +0 -0
  60. package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/route-content.md +11 -19
  61. package/examples/complete-sites/dog-shelter-multi-page/site/routes/020-adopt/images/adopt/adoption-dog.jpg +0 -0
  62. package/examples/complete-sites/dog-shelter-multi-page/site/routes/020-adopt/route-content.md +11 -0
  63. package/examples/complete-sites/dog-shelter-multi-page/site/sitewide-content.md +12 -2
  64. package/examples/complete-sites/dog-shelter-multi-page/site/theme.md +1 -23
  65. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/site.schema.json +59 -0
  66. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/sitewide.schema.json +138 -0
  67. package/examples/complete-sites/dog-shelter-single-page/.astro/collections/theme.schema.json +755 -0
  68. package/examples/complete-sites/dog-shelter-single-page/.astro/content-assets.mjs +4 -0
  69. package/examples/complete-sites/dog-shelter-single-page/.astro/content-modules.mjs +1 -0
  70. package/examples/complete-sites/dog-shelter-single-page/.astro/content.d.ts +183 -0
  71. package/examples/complete-sites/dog-shelter-single-page/.astro/data-store.json +1 -0
  72. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.json +13 -0
  73. package/examples/complete-sites/dog-shelter-single-page/.astro/dev.log +14 -0
  74. package/examples/complete-sites/dog-shelter-single-page/.astro/settings.json +5 -0
  75. package/examples/complete-sites/dog-shelter-single-page/.astro/types.d.ts +2 -0
  76. package/examples/complete-sites/dog-shelter-single-page/README.md +7 -0
  77. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/_metadata.json +74 -0
  78. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js +434 -0
  79. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  80. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  81. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  82. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  83. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  84. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  85. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  86. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  87. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  88. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js +1534 -0
  89. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  90. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js +48 -0
  91. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  92. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js +42 -0
  93. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  94. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/package.json +3 -0
  95. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  96. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js +190 -0
  97. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  98. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js +458 -0
  99. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  100. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js +1016 -0
  101. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  102. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js +32 -0
  103. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  104. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js +111 -0
  105. package/examples/complete-sites/dog-shelter-single-page/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  106. package/examples/complete-sites/dog-shelter-single-page/site/.norna/generated-images.json +44 -12
  107. package/examples/complete-sites/dog-shelter-single-page/site/config.md +3 -0
  108. package/examples/complete-sites/dog-shelter-single-page/site/content.md +20 -24
  109. package/examples/complete-sites/dog-shelter-single-page/site/images/what-we-do/rescue-dog.jpg +0 -0
  110. package/examples/complete-sites/dog-shelter-single-page/site/images/you-can-help/foster-dog.jpg +0 -0
  111. package/examples/complete-sites/dog-shelter-single-page/site/public/logo.svg +9 -0
  112. package/examples/complete-sites/dog-shelter-single-page/site/sitewide-content.md +12 -2
  113. package/examples/complete-sites/dog-shelter-single-page/site/theme.md +1 -23
  114. package/examples/feature-demos/media-and-surfaces/.astro/data-store.json +1 -1
  115. package/examples/feature-demos/media-and-surfaces/.astro/dev.log +15 -2
  116. package/examples/feature-demos/media-and-surfaces/README.md +7 -1
  117. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/_metadata.json +7 -1
  118. package/examples/{complete-sites/dog-shelter-multi-page → feature-demos/media-and-surfaces}/node_modules/.vite/deps/embla-carousel.js +1 -1
  119. package/examples/feature-demos/media-and-surfaces/node_modules/.vite/deps/embla-carousel.js.map +1 -0
  120. package/examples/feature-demos/media-and-surfaces/site/config.md +3 -0
  121. package/examples/feature-demos/media-and-surfaces/site/content.md +5 -51
  122. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/route-content.md +10 -25
  123. package/examples/feature-demos/media-and-surfaces/site/routes/020-surfaces/route-content.md +1 -1
  124. package/examples/feature-demos/sitewide-content/.astro/collections/site.schema.json +59 -0
  125. package/examples/feature-demos/sitewide-content/.astro/collections/sitewide.schema.json +138 -0
  126. package/examples/feature-demos/sitewide-content/.astro/collections/theme.schema.json +755 -0
  127. package/examples/feature-demos/sitewide-content/.astro/content-assets.mjs +1 -0
  128. package/examples/feature-demos/sitewide-content/.astro/content-modules.mjs +1 -0
  129. package/examples/feature-demos/sitewide-content/.astro/content.d.ts +183 -0
  130. package/examples/feature-demos/sitewide-content/.astro/data-store.json +1 -0
  131. package/examples/feature-demos/sitewide-content/.astro/dev.json +13 -0
  132. package/examples/feature-demos/sitewide-content/.astro/dev.log +18 -0
  133. package/examples/feature-demos/sitewide-content/.astro/settings.json +5 -0
  134. package/examples/feature-demos/sitewide-content/.astro/types.d.ts +2 -0
  135. package/examples/feature-demos/sitewide-content/README.md +18 -0
  136. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/_metadata.json +74 -0
  137. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js +434 -0
  138. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro-B3JHJyiv.js.map +1 -0
  139. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js +6390 -0
  140. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_aria-query.js.map +1 -0
  141. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js +2702 -0
  142. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_axobject-query.js.map +1 -0
  143. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js +65 -0
  144. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_n_html-escaper.js.map +1 -0
  145. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +455 -0
  146. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +1 -0
  147. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js +1534 -0
  148. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/audit-C3SVr7dT.js.map +1 -0
  149. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js +48 -0
  150. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/highlight-BLtvqtzO.js.map +1 -0
  151. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js +42 -0
  152. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/icons-C92i61-2.js.map +1 -0
  153. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/package.json +3 -0
  154. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/rolldown-runtime-BvCyGRYZ.js +4 -0
  155. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js +190 -0
  156. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/settings-v5GgKks_.js.map +1 -0
  157. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js +458 -0
  158. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/toolbar-BFvJVp26.js.map +1 -0
  159. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js +1016 -0
  160. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/ui-library-Cd35oAvo.js.map +1 -0
  161. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js +32 -0
  162. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/window-vo3A6TMn.js.map +1 -0
  163. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js +111 -0
  164. package/examples/feature-demos/sitewide-content/node_modules/.vite/deps/xray-DwhzGckb.js.map +1 -0
  165. package/examples/feature-demos/sitewide-content/site/.norna/generated-images.json +1 -0
  166. package/examples/feature-demos/sitewide-content/site/config.md +3 -0
  167. package/examples/feature-demos/sitewide-content/site/content.md +16 -0
  168. package/examples/feature-demos/sitewide-content/site/public/logo.svg +6 -0
  169. package/examples/feature-demos/sitewide-content/site/public/robots.txt +2 -0
  170. package/examples/feature-demos/sitewide-content/site/routes/010-identity/route-content.md +20 -0
  171. package/examples/feature-demos/sitewide-content/site/routes/020-notices/route-content.md +22 -0
  172. package/examples/feature-demos/sitewide-content/site/routes/030-footer/route-content.md +17 -0
  173. package/examples/feature-demos/sitewide-content/site/sitewide-content.md +33 -0
  174. package/examples/feature-demos/sitewide-content/site/theme.md +3 -0
  175. package/examples/feature-demos/theme-presets/.astro/dev.log +37 -0
  176. package/examples/feature-demos/theme-presets/README.md +5 -1
  177. package/examples/feature-demos/theme-presets/site/config.md +3 -0
  178. package/fixtures/basic/site/config.md +3 -0
  179. package/fixtures/content-model-v2/site/config.md +3 -0
  180. package/package.json +12 -7
  181. package/scripts/build-pages.mjs +4 -6
  182. package/scripts/check-config.mjs +1 -10
  183. package/scripts/deploy-site.mjs +12 -8
  184. package/scripts/lib/example-sites.mjs +3 -0
  185. package/scripts/lib/github-repository.mjs +44 -0
  186. package/scripts/lib/norna-markdown-blocks.mjs +97 -10
  187. package/scripts/lib/project-config.mjs +112 -123
  188. package/scripts/lib/site-content.mjs +7 -0
  189. package/scripts/lib/site-paths.mjs +6 -2
  190. package/scripts/test-client-javascript.mjs +221 -0
  191. package/scripts/test-content-check.mjs +103 -0
  192. package/scripts/test-content-model-v2.mjs +9 -13
  193. package/scripts/test-documentation.mjs +116 -0
  194. package/scripts/test-engine-commands.mjs +12 -3
  195. package/scripts/test-examples.mjs +9 -0
  196. package/scripts/test-package-check.mjs +17 -9
  197. package/scripts/test-project-config.mjs +125 -0
  198. package/scripts/test-temporary-visibility.mjs +3 -10
  199. package/scripts/test-theme-presets.mjs +3 -8
  200. package/scripts/watch-pages-deploy.mjs +15 -11
  201. package/src/components/GalleryGrid.astro +30 -230
  202. package/src/components/ImageCarousel.astro +184 -0
  203. package/src/components/MobileSectionNavigationScript.astro +14 -0
  204. package/src/components/SiteNavigation.astro +54 -341
  205. package/src/components/SiteNotesScript.astro +43 -0
  206. package/src/components/SitePage.astro +4 -1
  207. package/src/components/SiteSection.astro +4 -47
  208. package/src/layouts/BaseLayout.astro +1 -1
  209. package/src/lib/galleryImages.ts +53 -0
  210. package/src/styles/global.css +81 -1
  211. package/starters/basic/.github/workflows/deploy.yml +1 -2
  212. package/starters/basic/README.md +10 -8
  213. package/starters/basic/site/config.md +3 -0
  214. package/starters/project/.github/workflows/deploy.yml +1 -2
  215. package/starters/project/README.md +3 -4
  216. package/starters/project/site/config.md +3 -0
  217. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/astro-D_GIpJIE.js.map +0 -1
  218. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/audit-DM9Hkl5B.js.map +0 -1
  219. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/embla-carousel.js.map +0 -1
  220. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/highlight-DnZ1ULOL.js.map +0 -1
  221. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/icons-RyebKi45.js.map +0 -1
  222. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/settings-DaU-gNnK.js.map +0 -1
  223. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/toolbar-63PA619H.js.map +0 -1
  224. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/ui-library--bkcNSYz.js.map +0 -1
  225. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/window-jPkpKVcy.js.map +0 -1
  226. package/examples/complete-sites/dog-shelter-multi-page/node_modules/.vite/deps/xray-BXCHpEJP.js.map +0 -1
  227. package/examples/complete-sites/dog-shelter-multi-page/site/config.mjs +0 -30
  228. package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rex.svg +0 -19
  229. package/examples/complete-sites/dog-shelter-multi-page/site/routes/010-dogs/images/dogs/rover.svg +0 -19
  230. package/examples/complete-sites/dog-shelter-single-page/site/config.mjs +0 -30
  231. package/examples/complete-sites/dog-shelter-single-page/site/images/what-we-do/dog-house.svg +0 -25
  232. package/examples/complete-sites/dog-shelter-single-page/site/images/you-can-help/heart.svg +0 -13
  233. package/examples/feature-demos/media-and-surfaces/site/config.mjs +0 -30
  234. package/examples/feature-demos/media-and-surfaces/site/routes/010-media/theme.md +0 -3
  235. package/examples/feature-demos/theme-presets/site/config.mjs +0 -30
  236. package/fixtures/basic/site/config.mjs +0 -27
  237. package/fixtures/content-model-v2/site/config.mjs +0 -11
  238. package/starters/basic/site/config.mjs +0 -27
  239. package/starters/project/site/config.mjs +0 -30
@@ -1,6 +1,18 @@
1
- # Norna examples
1
+ # Norna Examples
2
2
 
3
- Runnable examples are grouped by purpose.
3
+ These examples are source projects, visual demonstrations, and integration
4
+ checks. Every example is built by `npm run test:examples` and published by the
5
+ documentation workflow.
6
+
7
+ | Example | Purpose | Live demo | Source |
8
+ | --- | --- | --- | --- |
9
+ | Dog shelter, single page | A coherent homepage made from sections | [Open site](https://janga.github.io/norna/examples/complete-sites/dog-shelter-single-page/) | [View files](complete-sites/dog-shelter-single-page/) |
10
+ | Dog shelter, multi-page | A coherent site with ordered routes and route-local images | [Open site](https://janga.github.io/norna/examples/complete-sites/dog-shelter-multi-page/) | [View files](complete-sites/dog-shelter-multi-page/) |
11
+ | Theme presets | All complete presets without overrides | [Open site](https://janga.github.io/norna/examples/feature-demos/theme-presets/) | [View files](feature-demos/theme-presets/) |
12
+ | Media and surfaces | Image blocks, cards, notes, palettes, and section surfaces | [Open site](https://janga.github.io/norna/examples/feature-demos/media-and-surfaces/) | [View files](feature-demos/media-and-surfaces/) |
13
+ | Sitewide content | Shared identity, navigation, banners, and footer content | [Open site](https://janga.github.io/norna/examples/feature-demos/sitewide-content/) | [View files](feature-demos/sitewide-content/) |
14
+
15
+ ## Directory Structure
4
16
 
5
17
  ```text
6
18
  examples/
@@ -9,33 +21,23 @@ examples/
9
21
  | `-- dog-shelter-multi-page/
10
22
  `-- feature-demos/
11
23
  |-- theme-presets/
12
- `-- media-and-surfaces/
24
+ |-- media-and-surfaces/
25
+ `-- sitewide-content/
13
26
  ```
14
27
 
15
- ## Complete sites
16
-
17
- `complete-sites/` contains small sites that can be read as coherent examples
18
- of a Norna project.
19
-
20
- - `dog-shelter-single-page/` demonstrates a homepage made from sections.
21
- - `dog-shelter-multi-page/` adds ordered routes and route-local content.
28
+ `complete-sites/` contains small sites that can be read as coherent Norna
29
+ projects. `feature-demos/` contains focused visual test benches. Feature demos
30
+ are useful for documentation and integration checks, but are not starter
31
+ templates.
22
32
 
23
- ## Feature demos
33
+ ## Run An Example Locally
24
34
 
25
- `feature-demos/` contains focused visual test benches. They are useful for
26
- documentation, manual inspection and integration checks, but are not intended
27
- as starter templates.
28
-
29
- - `theme-presets/` compares Norna's complete built-in theme presets.
30
- - `media-and-surfaces/` demonstrates managed media blocks, notes, palettes and
31
- section surfaces.
32
-
33
- The repository's GitHub Pages workflow publishes rendered copies under
34
- `https://janga.github.io/norna/examples/` so the HTML documentation can link to
35
- working sites rather than only their source files.
36
-
37
- Run an example from the repository root by passing its `site/` directory:
35
+ From the Norna repository root, pass the example's `site/` directory:
38
36
 
39
37
  ```sh
40
38
  node bin/norna.mjs --site-dir examples/feature-demos/media-and-surfaces/site dev:local
41
39
  ```
40
+
41
+ Use another path from the table to run a different example. The repository's
42
+ GitHub Pages workflow publishes the same source projects under
43
+ `https://janga.github.io/norna/examples/`.
@@ -1 +1,4 @@
1
- export default new Map();
1
+
2
+
3
+ export default new Map([]);
4
+
@@ -178,6 +178,6 @@ declare module 'astro:content' {
178
178
  LiveContentConfig['collections'][C]['loader']
179
179
  >;
180
180
 
181
- export type ContentConfig = typeof import("../../../src/content.config.js");
181
+ export type ContentConfig = typeof import("../../../../src/content.config.js");
182
182
  export type LiveContentConfig = never;
183
183
  }
@@ -1 +1 @@
1
- [["Map",1,2,9,10,72,73,94,95],"meta::meta",["Map",3,4,5,6,7,8],"astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":\"jsx\",\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"attribute\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":\"0.0.0.0\",\"port\":4321,\"allowedHosts\":[\"0.0.0.0\",\"0.0.0.0\",\"0.0.0.0\",\"0.0.0.0\"]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"dangerouslyProcessSVG\":false,\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":{\"type\":\"shiki\",\"excludeLangs\":[\"math\"]},\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[],\"rehypePlugins\":[],\"remarkRehype\":{},\"processor\":{\"name\":\"satteri\",\"options\":{\"mdastPlugins\":[],\"hastPlugins\":[],\"features\":{}}}},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[],\"csp\":false,\"actionBodySizeLimit\":1048576,\"serverIslandBodySizeLimit\":1048576},\"env\":{\"schema\":{},\"validateSecrets\":false},\"prerenderConflictBehavior\":\"warn\",\"fetchFile\":\"fetch\",\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"chromeDevtoolsWorkspace\":false,\"collectionStorage\":\"single-file\"},\"legacy\":{\"collectionsBackwardsCompat\":false}}","astro-version","7.1.3","content-config-digest","ef24ddbc7d731e37","site",["Map",11,12,32,33,52,53],"site-content",{"id":11,"data":13,"body":17,"filePath":18,"digest":19,"rendered":20},{"title":14,"description":15,"sections":16},"Home","A multi-page dog shelter website built with Norna.",{},"## Dog Shelter {#intro}\n\nWe rescue dogs, help them recover and introduce them to families ready to give\nthem a permanent home.\n\nVisit **Dogs** to meet two current residents, or **Adopt** to learn how the\nadoption process works.","site/content.md","0691a0caebe70101",{"html":21,"metadata":22},"\u003Ch2 id=\"dog-shelter-intro\">Dog Shelter {#intro}\u003C/h2>\n\u003Cp>We rescue dogs, help them recover and introduce them to families ready to give\nthem a permanent home.\u003C/p>\n\u003Cp>Visit \u003Cstrong>Dogs\u003C/strong> to meet two current residents, or \u003Cstrong>Adopt\u003C/strong> to learn how the\nadoption process works.\u003C/p>\n",{"headings":23,"localImagePaths":28,"remoteImagePaths":29,"frontmatter":30,"imagePaths":31},[24],{"depth":25,"slug":26,"text":27},2,"dog-shelter-intro","Dog Shelter {#intro}",[],[],{"title":14,"description":15},[],"site-route-010-dogs",{"id":32,"data":34,"body":38,"filePath":39,"digest":40,"rendered":41},{"title":35,"description":36,"sections":37},"Dogs","Meet dogs currently waiting for adoption.",{},"## Dogs {#dogs}\n\nMeet Rover and Rex.\n\n\u003C!-- norna-image-provenance:\nimage: rover.svg\nsource: AI-assisted, hand-authored SVG\nprompt: Draw a friendly brown cartoon dog standing in profile on a pale green\nbackground. Flat vector style, dark outlines, no text or external assets.\n\nimage: rex.svg\nsource: AI-assisted, hand-authored SVG\nprompt: Draw a friendly golden cartoon dog standing in profile on a pale cream\nbackground. Make it visibly distinct from Rover. Flat vector style, dark\noutlines, no text or external assets.\n-->\n\n```norna-image-stack\n- image: rover.svg\n alt: Rover, a brown dog with upright ears and a curled tail.\n caption: Rover needs daily walks.\n- image: rex.svg\n alt: Rex, a golden dog with one floppy ear and a gently curved tail.\n caption: Rex needs a patient home.\n```","site/routes/010-dogs/route-content.md","73e4b18631e96d28",{"html":42,"metadata":43},"\u003Ch2 id=\"dogs-dogs\">Dogs {#dogs}\u003C/h2>\n\u003Cp>Meet Rover and Rex.\u003C/p>\n\u003C!-- norna-image-provenance:\nimage: rover.svg\nsource: AI-assisted, hand-authored SVG\nprompt: Draw a friendly brown cartoon dog standing in profile on a pale green\nbackground. Flat vector style, dark outlines, no text or external assets.\n\nimage: rex.svg\nsource: AI-assisted, hand-authored SVG\nprompt: Draw a friendly golden cartoon dog standing in profile on a pale cream\nbackground. Make it visibly distinct from Rover. Flat vector style, dark\noutlines, no text or external assets.\n-->\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan>- image: rover.svg\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> alt: Rover, a brown dog with upright ears and a curled tail.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> caption: Rover needs daily walks.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- image: rex.svg\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> alt: Rex, a golden dog with one floppy ear and a gently curved tail.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> caption: Rex needs a patient home.\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n",{"headings":44,"localImagePaths":48,"remoteImagePaths":49,"frontmatter":50,"imagePaths":51},[45],{"depth":25,"slug":46,"text":47},"dogs-dogs","Dogs {#dogs}",[],[],{"title":35,"description":36},[],"site-route-020-adopt",{"id":52,"data":54,"body":58,"filePath":59,"digest":60,"rendered":61},{"title":55,"description":56,"sections":57},"Adopt","Learn how to adopt from Dog Shelter.",{},"## Adopt {#adopt}\n\nAdoption begins with a conversation about your home, routines and experience\nwith dogs. We then arrange a meeting with dogs whose needs appear to match.\n\nThe goal is not the quickest placement. It is a stable home where both the dog\nand the family have the support they need.","site/routes/020-adopt/route-content.md","9e72f3ba5409e5a5",{"html":62,"metadata":63},"\u003Ch2 id=\"adopt-adopt\">Adopt {#adopt}\u003C/h2>\n\u003Cp>Adoption begins with a conversation about your home, routines and experience\nwith dogs. We then arrange a meeting with dogs whose needs appear to match.\u003C/p>\n\u003Cp>The goal is not the quickest placement. It is a stable home where both the dog\nand the family have the support they need.\u003C/p>\n",{"headings":64,"localImagePaths":68,"remoteImagePaths":69,"frontmatter":70,"imagePaths":71},[65],{"depth":25,"slug":66,"text":67},"adopt-adopt","Adopt {#adopt}",[],[],{"title":55,"description":56},[],"sitewide",["Map",74,75],"site-sitewide",{"id":74,"data":76,"filePath":82,"digest":83,"rendered":84},{"navigation":77,"banners":79,"footer":80},{"brand":78},"Dog Shelter",[],{"copyrightMessage":81},"Dog Shelter example site.","site/sitewide-content.md","1e321f6f03ded3d4",{"html":85,"metadata":86},"",{"headings":87,"localImagePaths":88,"remoteImagePaths":89,"frontmatter":90,"imagePaths":93},[],[],[],{"navigation":91,"footer":92},{"brand":78},{"copyrightMessage":81},[],"theme",["Map",96,97],"theme.md",{"id":96,"data":98,"filePath":122,"digest":123,"rendered":124},{"layout":99,"gallery":105,"typography":112,"presentation":115},{"density":100,"pageWidth":101,"gutter":102},"normal","1180px",{"desktop":103,"mobile":104},"clamp(1.25rem, 4vw, 3rem)","1rem",{"width":106,"maxAvailableWidthPercent":107,"maxAvailableHeightPercent":109},"760px",{"desktop":108,"mobile":108},100,{"desktop":110,"mobile":111},72,68,{"fontFamily":113,"preset":114,"rhythm":100},"Arial, 'Helvetica Neue', Helvetica, sans-serif","text-forward",{"palette":116,"sectionSurfaces":117},"paper",{"mode":118,"sequence":119},"cycle",[120,121],"base","soft","site/theme.md","c7dd8e38cdcd2768",{"html":85,"metadata":125},{"headings":126,"localImagePaths":127,"remoteImagePaths":128,"frontmatter":129,"imagePaths":139},[],[],[],{"layout":130,"gallery":132,"typography":135,"presentation":136},{"density":100,"pageWidth":101,"gutter":131},{"desktop":103,"mobile":104},{"width":106,"maxAvailableWidthPercent":133,"maxAvailableHeightPercent":134},{"desktop":108,"mobile":108},{"desktop":110,"mobile":111},{"fontFamily":113,"preset":114,"rhythm":100},{"palette":116,"sectionSurfaces":137},{"mode":118,"sequence":138},[120,121],[]]
1
+ [["Map",1,2,9,10,72,73,98,99],"meta::meta",["Map",3,4,5,6,7,8],"astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":\"jsx\",\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"attribute\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":\"127.0.0.1\",\"port\":4412,\"allowedHosts\":[\"127.0.0.1\",\"127.0.0.1\",\"127.0.0.1\",\"127.0.0.1\"]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"dangerouslyProcessSVG\":false,\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":{\"type\":\"shiki\",\"excludeLangs\":[\"math\"]},\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[],\"rehypePlugins\":[],\"remarkRehype\":{},\"processor\":{\"name\":\"satteri\",\"options\":{\"mdastPlugins\":[],\"hastPlugins\":[],\"features\":{}}}},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[],\"csp\":false,\"actionBodySizeLimit\":1048576,\"serverIslandBodySizeLimit\":1048576},\"env\":{\"schema\":{},\"validateSecrets\":false},\"prerenderConflictBehavior\":\"warn\",\"fetchFile\":\"fetch\",\"logger\":{\"entrypoint\":\"astro/logger/json\"},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"chromeDevtoolsWorkspace\":false,\"collectionStorage\":\"single-file\"},\"legacy\":{\"collectionsBackwardsCompat\":false}}","astro-version","7.1.3","content-config-digest","ef24ddbc7d731e37","site",["Map",11,12,32,33,52,53],"site-content",{"id":11,"data":13,"body":17,"filePath":18,"digest":19,"rendered":20},{"title":14,"description":15,"sections":16},"Home","A multi-page dog shelter website built with Norna.",{},"## Dog Shelter {#intro}\n\nWe rescue dogs, help them recover and introduce them to families ready to give\nthem a permanent home.\n\nVisit **Dogs** to meet two current residents, or **Adopt** to learn how the\nadoption process works.\n\n```norna-card-list\nlayout: image-right\nflow: stack\nsize: s\nwidth: narrow\n\n- title: Rescue, recovery and new homes\n text: Meet the dogs currently in our care and learn what kind of home each one needs.\n image: shelter-dog.jpg\n link: /dogs/\n```","site/content.md","8e6311f7aa2b670d",{"html":21,"metadata":22},"\u003Ch2 id=\"dog-shelter-intro\">Dog Shelter {#intro}\u003C/h2>\n\u003Cp>We rescue dogs, help them recover and introduce them to families ready to give\nthem a permanent home.\u003C/p>\n\u003Cp>Visit \u003Cstrong>Dogs\u003C/strong> to meet two current residents, or \u003Cstrong>Adopt\u003C/strong> to learn how the\nadoption process works.\u003C/p>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan>layout: image-right\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>flow: stack\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>size: s\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>width: narrow\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- title: Rescue, recovery and new homes\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> text: Meet the dogs currently in our care and learn what kind of home each one needs.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> image: shelter-dog.jpg\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> link: /dogs/\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n",{"headings":23,"localImagePaths":28,"remoteImagePaths":29,"frontmatter":30,"imagePaths":31},[24],{"depth":25,"slug":26,"text":27},2,"dog-shelter-intro","Dog Shelter {#intro}",[],[],{"title":14,"description":15},[],"site-route-010-dogs",{"id":32,"data":34,"body":38,"filePath":39,"digest":40,"rendered":41},{"title":35,"description":36,"sections":37},"Dogs","Meet dogs currently waiting for adoption.",{},"## Dogs {#dogs}\n\nMeet Rover and Rex.\n\n```norna-card-list\nlayout: image-top\nflow: grid\nsize: s\nwidth: narrow\n\n- title: Rover\n text: Curious and active. Rover needs daily walks and room to explore.\n image: rover.jpg\n- title: Rex\n text: Gentle and observant. Rex needs a patient home with quiet routines.\n image: rex.jpg\n```","site/routes/010-dogs/route-content.md","7b650f7fd791e689",{"html":42,"metadata":43},"\u003Ch2 id=\"dogs-dogs\">Dogs {#dogs}\u003C/h2>\n\u003Cp>Meet Rover and Rex.\u003C/p>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan>layout: image-top\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>flow: grid\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>size: s\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>width: narrow\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- title: Rover\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> text: Curious and active. Rover needs daily walks and room to explore.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> image: rover.jpg\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- title: Rex\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> text: Gentle and observant. Rex needs a patient home with quiet routines.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> image: rex.jpg\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n",{"headings":44,"localImagePaths":48,"remoteImagePaths":49,"frontmatter":50,"imagePaths":51},[45],{"depth":25,"slug":46,"text":47},"dogs-dogs","Dogs {#dogs}",[],[],{"title":35,"description":36},[],"site-route-020-adopt",{"id":52,"data":54,"body":58,"filePath":59,"digest":60,"rendered":61},{"title":55,"description":56,"sections":57},"Adopt","Learn how to adopt from Dog Shelter.",{},"## Adopt {#adopt}\n\nAdoption begins with a conversation about your home, routines and experience\nwith dogs. We then arrange a meeting with dogs whose needs appear to match.\n\nThe goal is not the quickest placement. It is a stable home where both the dog\nand the family have the support they need.\n\n```norna-card-list\nlayout: image-left\nflow: stack\nsize: s\nwidth: narrow\n\n- title: Start with a conversation\n text: Tell us about your home and routines, then meet dogs whose needs may be a good match.\n image: adoption-dog.jpg\n```","site/routes/020-adopt/route-content.md","9c0eba10f95aae72",{"html":62,"metadata":63},"\u003Ch2 id=\"adopt-adopt\">Adopt {#adopt}\u003C/h2>\n\u003Cp>Adoption begins with a conversation about your home, routines and experience\nwith dogs. We then arrange a meeting with dogs whose needs appear to match.\u003C/p>\n\u003Cp>The goal is not the quickest placement. It is a stable home where both the dog\nand the family have the support they need.\u003C/p>\n\u003Cpre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan>layout: image-left\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>flow: stack\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>size: s\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>width: narrow\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan>- title: Start with a conversation\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> text: Tell us about your home and routines, then meet dogs whose needs may be a good match.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan> image: adoption-dog.jpg\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n",{"headings":64,"localImagePaths":68,"remoteImagePaths":69,"frontmatter":70,"imagePaths":71},[65],{"depth":25,"slug":66,"text":67},"adopt-adopt","Adopt {#adopt}",[],[],{"title":55,"description":56},[],"sitewide",["Map",74,75],"site-sitewide",{"id":74,"data":76,"body":84,"filePath":85,"digest":86,"rendered":87},{"navigation":77,"banners":81,"footer":82},{"logo":78},{"alt":79,"height":80},"Dog Shelter","3rem",[],{"copyrightMessage":83},"Dog Shelter example site. Dog photos by Bicanski, CC0, via Pixnio.","\u003C!-- norna-image-provenance:\nimage: logo.svg\nsource: AI-assisted, hand-authored SVG\nprompt: Create a compact horizontal dog shelter logo with a simple dog face in\na house-shaped mark and the words Dog Shelter. Use flat vector shapes, a warm\nred accent, dark text, transparent background and no external assets.\n-->","site/sitewide-content.md","68de962e675a456b",{"html":88,"metadata":89},"\u003C!-- norna-image-provenance:\nimage: logo.svg\nsource: AI-assisted, hand-authored SVG\nprompt: Create a compact horizontal dog shelter logo with a simple dog face in\na house-shaped mark and the words Dog Shelter. Use flat vector shapes, a warm\nred accent, dark text, transparent background and no external assets.\n-->\n",{"headings":90,"localImagePaths":91,"remoteImagePaths":92,"frontmatter":93,"imagePaths":97},[],[],[],{"navigation":94,"footer":96},{"logo":95},{"alt":79,"height":80},{"copyrightMessage":83},[],"theme",["Map",100,101],"theme.md",{"id":100,"data":102,"filePath":104,"digest":105,"rendered":106},{"preset":103},"project","site/theme.md","d19ab283a10fb060",{"html":107,"metadata":108},"",{"headings":109,"localImagePaths":110,"remoteImagePaths":111,"frontmatter":112,"imagePaths":113},[],[],[],{"preset":103},[]]
@@ -1,15 +1,13 @@
1
1
  {
2
- "pid": 47121,
3
- "port": 4321,
4
- "url": "http://localhost:4321",
2
+ "pid": 58179,
3
+ "port": 4412,
4
+ "url": "http://127.0.0.1:4412",
5
5
  "urls": {
6
6
  "local": [
7
- "http://localhost:4321/"
7
+ "http://127.0.0.1:4412/"
8
8
  ],
9
- "network": [
10
- "http://192.168.1.102:4321/"
11
- ]
9
+ "network": []
12
10
  },
13
11
  "background": true,
14
- "startedAt": "2026-08-21T03:52:42.741Z"
12
+ "startedAt": "2026-08-21T04:55:53.950Z"
15
13
  }
@@ -1,53 +1,26 @@
1
- 05:52:41 [vite] connected.
2
- 05:52:42 [types] Generated 1ms
3
- 05:52:42 [vite] connected.
4
- 05:52:42 [content] Syncing content
5
- [Shiki] The language "norna-image-stack" doesn't exist, falling back to "plaintext".
6
- 05:52:42 [content] Synced content
7
- astro v7.1.3 ready in 1114 ms
8
- Local http://localhost:4321/
9
- Network http://192.168.1.102:4321/
10
- 05:52:42 watching for file changes...
11
-
12
- update New version of Astro available: 7.2.4
13
- Run npx @astrojs/upgrade to update
14
-
15
- 05:52:43 [200] / 49ms
16
- 05:52:43 [200] / 8ms
17
- 05:52:43 [200] / 4ms
18
- 05:52:50 [200] /dogs/ 22ms
19
- 05:52:51 [vite] new dependencies optimized: embla-carousel
20
- 05:52:53 [200] /adopt/ 8ms
21
- 05:52:55 [200] /dogs/ 9ms
22
- 05:53:14 [200] / 8ms
23
- 05:53:15 [200] /dogs/ 8ms
24
- 05:55:45 [ERROR] [vite] Norna image refresh failed:
25
- spawn /opt/homebrew/Cellar/node/26.7.0/bin/node ENOENT
26
- 05:55:45 [ERROR] Failed to load url /.astro/content-assets.mjs (resolved id: /Users/jangarefelt/Projects/webbhack/norna/examples/002-dog-shelter-multi-page/.astro/content-assets.mjs) in /Users/jangarefelt/Projects/webbhack/norna/node_modules/astro/dist/content/runtime.js. Does the file exist?
27
- Stack trace:
28
- at loadAndTransform (file:///Users/jangarefelt/Projects/webbhack/norna/node_modules/vite/dist/node/chunks/node.js:19714:31)
29
- at async handleInvoke (file:///Users/jangarefelt/Projects/webbhack/norna/node_modules/vite/dist/node/chunks/node.js:25811:21)
30
- 05:55:45 [ERROR] [UnknownFilesystemError]
31
- Hint:
32
- It can be caused by many things, eg. missing permissions or a file not existing we attempt to read. Check the error cause for more details.
33
- Error reference:
34
- https://docs.astro.build/en/reference/errors/unknown-filesystem-error/
35
- Stack trace:
36
- at /Users/jangarefelt/Projects/webbhack/norna/examples/002-dog-shelter-multi-page/Users/jangarefelt/Projects/webbhack/norna/node_modules/astro/dist/content/mutable-data-store.js:367:13
37
- [...] See full stack trace in the browser, or rerun with --verbose.
38
- Caused by:
39
- ENOENT: no such file or directory, open '/Users/jangarefelt/Projects/webbhack/norna/examples/002-dog-shelter-multi-page/.astro/data-store.json.tmp'
40
- at async open (node:internal/fs/promises:1360:25)
41
- [...] See full stack trace in the browser, or rerun with --verbose.
42
- 05:55:45 [ERROR] [UnknownFilesystemError]
43
- Hint:
44
- It can be caused by many things, eg. missing permissions or a file not existing we attempt to read. Check the error cause for more details.
45
- Error reference:
46
- https://docs.astro.build/en/reference/errors/unknown-filesystem-error/
47
- Stack trace:
48
- at /Users/jangarefelt/Projects/webbhack/norna/examples/002-dog-shelter-multi-page/Users/jangarefelt/Projects/webbhack/norna/node_modules/astro/dist/content/mutable-data-store.js:103:15
49
- [...] See full stack trace in the browser, or rerun with --verbose.
50
- Caused by:
51
- ENOENT: no such file or directory, open '/Users/jangarefelt/Projects/webbhack/norna/examples/002-dog-shelter-multi-page/.astro/content-assets.mjs.tmp'
52
- at async open (node:internal/fs/promises:1360:25)
53
- [...] See full stack trace in the browser, or rerun with --verbose.
1
+ {"message":"connected.","label":"vite","level":"info"}
2
+ {"message":"Generated 0ms","label":"types","level":"info"}
3
+ {"message":"connected.","label":"vite","level":"info"}
4
+ {"message":"Syncing content","label":"content","level":"info"}
5
+ {"message":"Astro config changed","label":"content","level":"info"}
6
+ {"message":"Clearing content store","label":"content","level":"info"}
7
+ [Shiki] The language "norna-card-list" doesn't exist, falling back to "plaintext".
8
+ [Shiki] The language "norna-card-list" doesn't exist, falling back to "plaintext".
9
+ [Shiki] The language "norna-card-list" doesn't exist, falling back to "plaintext".
10
+ {"message":"Synced content","label":"content","level":"info"}
11
+ {"message":"Re-optimizing dependencies because vite config has changed","label":"vite","level":"info"}
12
+ {"message":" astro v7.1.3 ready in 1134 ms\n┃ Local http://127.0.0.1:4412/","label":"SKIP_FORMAT","level":"info"}
13
+ {"message":"watching for file changes...","label":null,"level":"info"}
14
+ {"message":"[200] / 52ms","label":null,"level":"info"}
15
+ {"message":"[200] / 7ms","label":null,"level":"info"}
16
+ {"message":"[200] /dogs/ 18ms","label":null,"level":"info"}
17
+ {"message":"[200] /adopt/ 8ms","label":null,"level":"info"}
18
+ {"message":"[200] / 8ms","label":null,"level":"info"}
19
+ {"message":"[200] /dogs/ 8ms","label":null,"level":"info"}
20
+ {"message":"[200] /adopt/ 8ms","label":null,"level":"info"}
21
+ {"message":"[200] /dogs/ 8ms","label":null,"level":"info"}
22
+ {"message":"[200] / 9ms","label":null,"level":"info"}
23
+ {"message":"[200] / 8ms","label":null,"level":"info"}
24
+ {"message":"[200] / 6ms","label":null,"level":"info"}
25
+ {"message":"[200] /dogs/ 13ms","label":null,"level":"info"}
26
+ {"message":"[200] /dogs/ 7ms","label":null,"level":"info"}
@@ -2,6 +2,13 @@
2
2
 
3
3
  A small Norna site with a homepage and ordered routes for dogs and adoption.
4
4
 
5
+ [Live demo](https://janga.github.io/norna/examples/complete-sites/dog-shelter-multi-page/)
6
+ |
7
+ [View source](https://github.com/janga/norna/tree/main/examples/complete-sites/dog-shelter-multi-page)
8
+
9
+ The dog photos are CC0 images by Bicanski, sourced from Pixnio. Attribution is
10
+ included in the site footer even though the licence does not require it.
11
+
5
12
  Run it from the Norna repository root:
6
13
 
7
14
  ```sh
@@ -1,79 +1,73 @@
1
1
  {
2
- "hash": "c5835335",
3
- "configHash": "81cb5b61",
2
+ "hash": "5cf74c44",
3
+ "configHash": "468b2565",
4
4
  "lockfileHash": "808f2e8e",
5
- "browserHash": "3314f0cd",
5
+ "browserHash": "24b56f2c",
6
6
  "optimized": {
7
7
  "astro > aria-query": {
8
- "src": "../../../../../node_modules/aria-query/lib/index.js",
8
+ "src": "../../../../../../node_modules/aria-query/lib/index.js",
9
9
  "file": "astro_n_aria-query.js",
10
- "fileHash": "2df55228",
10
+ "fileHash": "22765b52",
11
11
  "needsInterop": true
12
12
  },
13
13
  "astro > axobject-query": {
14
- "src": "../../../../../node_modules/axobject-query/lib/index.js",
14
+ "src": "../../../../../../node_modules/axobject-query/lib/index.js",
15
15
  "file": "astro_n_axobject-query.js",
16
- "fileHash": "3317e674",
16
+ "fileHash": "c0c497a1",
17
17
  "needsInterop": true
18
18
  },
19
19
  "astro > html-escaper": {
20
- "src": "../../../../../node_modules/html-escaper/esm/index.js",
20
+ "src": "../../../../../../node_modules/html-escaper/esm/index.js",
21
21
  "file": "astro_n_html-escaper.js",
22
- "fileHash": "b3fbc938",
22
+ "fileHash": "3d5b47f7",
23
23
  "needsInterop": false
24
24
  },
25
25
  "astro/runtime/client/dev-toolbar/entrypoint.js": {
26
- "src": "../../../../../node_modules/astro/dist/runtime/client/dev-toolbar/entrypoint.js",
26
+ "src": "../../../../../../node_modules/astro/dist/runtime/client/dev-toolbar/entrypoint.js",
27
27
  "file": "astro_runtime_client_dev-toolbar_entrypoint__js.js",
28
- "fileHash": "a1ac7053",
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": "6ac7301f",
28
+ "fileHash": "89643eed",
35
29
  "needsInterop": false
36
30
  }
37
31
  },
38
32
  "chunks": {
39
- "astro-D_GIpJIE": {
40
- "file": "astro-D_GIpJIE.js",
33
+ "astro-B3JHJyiv": {
34
+ "file": "astro-B3JHJyiv.js",
41
35
  "isDynamicEntry": true
42
36
  },
43
- "audit-DM9Hkl5B": {
44
- "file": "audit-DM9Hkl5B.js",
37
+ "audit-C3SVr7dT": {
38
+ "file": "audit-C3SVr7dT.js",
45
39
  "isDynamicEntry": true
46
40
  },
47
- "highlight-DnZ1ULOL": {
48
- "file": "highlight-DnZ1ULOL.js",
41
+ "highlight-BLtvqtzO": {
42
+ "file": "highlight-BLtvqtzO.js",
49
43
  "isDynamicEntry": false
50
44
  },
51
- "icons-RyebKi45": {
52
- "file": "icons-RyebKi45.js",
45
+ "icons-C92i61-2": {
46
+ "file": "icons-C92i61-2.js",
53
47
  "isDynamicEntry": false
54
48
  },
55
49
  "rolldown-runtime-BvCyGRYZ": {
56
50
  "file": "rolldown-runtime-BvCyGRYZ.js",
57
51
  "isDynamicEntry": false
58
52
  },
59
- "settings-DaU-gNnK": {
60
- "file": "settings-DaU-gNnK.js",
53
+ "settings-v5GgKks_": {
54
+ "file": "settings-v5GgKks_.js",
61
55
  "isDynamicEntry": true
62
56
  },
63
- "toolbar-63PA619H": {
64
- "file": "toolbar-63PA619H.js",
57
+ "toolbar-BFvJVp26": {
58
+ "file": "toolbar-BFvJVp26.js",
65
59
  "isDynamicEntry": true
66
60
  },
67
- "ui-library--bkcNSYz": {
68
- "file": "ui-library--bkcNSYz.js",
61
+ "ui-library-Cd35oAvo": {
62
+ "file": "ui-library-Cd35oAvo.js",
69
63
  "isDynamicEntry": true
70
64
  },
71
- "window-jPkpKVcy": {
72
- "file": "window-jPkpKVcy.js",
65
+ "window-vo3A6TMn": {
66
+ "file": "window-vo3A6TMn.js",
73
67
  "isDynamicEntry": false
74
68
  },
75
- "xray-BXCHpEJP": {
76
- "file": "xray-BXCHpEJP.js",
69
+ "xray-DwhzGckb": {
70
+ "file": "xray-DwhzGckb.js",
77
71
  "isDynamicEntry": true
78
72
  }
79
73
  }
@@ -1,6 +1,6 @@
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
1
+ import { n as isDefinedIcon } from "./icons-C92i61-2.js";
2
+ import { n as createWindowElement, r as synchronizePlacementOnUpdate, t as closeOnOutsideClick } from "./window-vo3A6TMn.js";
3
+ //#region ../../../node_modules/astro/dist/runtime/client/dev-toolbar/apps/utils/icons.js
4
4
  function randomFromArray(list) {
5
5
  return list[Math.floor(Math.random() * list.length)];
6
6
  }
@@ -58,7 +58,7 @@ function colorForIntegration() {
58
58
  return randomFromArray(iconColors);
59
59
  }
60
60
  //#endregion
61
- //#region ../../node_modules/astro/dist/runtime/client/dev-toolbar/apps/astro.js
61
+ //#region ../../../node_modules/astro/dist/runtime/client/dev-toolbar/apps/astro.js
62
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
63
  var integrationData;
64
64
  var astro_default = {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro-B3JHJyiv.js","names":[],"sources":["../../../../../../node_modules/astro/dist/runtime/client/dev-toolbar/apps/utils/icons.js","../../../../../../node_modules/astro/dist/runtime/client/dev-toolbar/apps/astro.js"],"sourcesContent":["function randomFromArray(list) {\n return list[Math.floor(Math.random() * list.length)];\n}\nconst categoryIcons = new Map(\n Object.entries({\n frameworks: [\"puzzle\", \"grid\"],\n adapters: [\"puzzle\", \"grid\", \"compress\"],\n \"css+ui\": [\"compress\", \"grid\", \"image\", \"resizeImage\", \"puzzle\"],\n \"performance+seo\": [\"approveUser\", \"checkCircle\", \"compress\", \"robot\", \"searchFile\", \"sitemap\"],\n analytics: [\"checkCircle\", \"compress\", \"searchFile\"],\n accessibility: [\"approveUser\", \"checkCircle\"],\n other: [\"checkCircle\", \"grid\", \"puzzle\", \"sitemap\"]\n })\n);\nfunction iconForIntegration(integration) {\n const icons = integration.categories.filter((category) => categoryIcons.has(category)).flatMap((category) => categoryIcons.get(category));\n return randomFromArray(icons);\n}\nconst iconColors = [\n \"#BC52EE\",\n \"#6D6AF0\",\n \"#52EEBD\",\n \"#52B7EE\",\n \"#52EE55\",\n \"#B7EE52\",\n \"#EEBD52\",\n \"#EE5552\",\n \"#EE52B7\",\n \"#858B98\"\n];\nfunction colorForIntegration() {\n return randomFromArray(iconColors);\n}\nexport {\n colorForIntegration,\n iconForIntegration\n};\n","import { isDefinedIcon } from \"../ui-library/icons.js\";\nimport { colorForIntegration, iconForIntegration } from \"./utils/icons.js\";\nimport {\n closeOnOutsideClick,\n createWindowElement,\n synchronizePlacementOnUpdate\n} from \"./utils/window.js\";\nconst 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>';\nlet integrationData;\nvar astro_default = {\n id: \"astro:home\",\n name: \"Menu\",\n icon: \"astro:logo\",\n async init(canvas, eventTarget) {\n createCanvas();\n document.addEventListener(\"astro:after-swap\", createCanvas);\n eventTarget.addEventListener(\"app-toggled\", async (event) => {\n resetDebugButton();\n if (!(event instanceof CustomEvent)) return;\n if (event.detail.state === true) {\n if (!integrationData) fetchIntegrationData();\n }\n });\n closeOnOutsideClick(eventTarget);\n synchronizePlacementOnUpdate(eventTarget, canvas);\n function fetchIntegrationData() {\n fetch(\"https://astro.build/api/v1/dev-overlay/\", {\n cache: \"no-cache\"\n }).then((res) => res.json()).then((data) => {\n integrationData = data;\n integrationData.data = integrationData.data.map((integration) => {\n return integration;\n });\n refreshIntegrationList();\n });\n }\n function createCanvas() {\n const links = [\n {\n icon: \"bug\",\n name: \"Report a Bug\",\n link: \"https://github.com/withastro/astro/issues/new/choose\"\n },\n {\n icon: \"lightbulb\",\n name: \"Feedback\",\n link: \"https://github.com/withastro/roadmap/discussions/new/choose\"\n },\n {\n icon: \"file-search\",\n name: \"Documentation\",\n link: \"https://docs.astro.build\"\n },\n {\n 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>',\n name: \"Community\",\n link: \"https://astro.build/chat\"\n }\n ];\n const { latestAstroVersion, version, debugInfo } = window.__astro_dev_toolbar__ ?? {};\n const windowComponent = createWindowElement(\n `<style>\n\t\t\t\t#buttons-container {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tgap: 16px;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t}\n\n\t\t\t\t#buttons-container astro-dev-toolbar-card {\n\t\t\t\t\tflex: 1;\n\t\t\t\t}\n\n\t\t\t\tfooter {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\tgap: 24px;\n\t\t\t\t}\n\n\t\t\t\tfooter a {\n\t\t\t\t\tcolor: rgba(145, 152, 173, 1);\n\t\t\t\t}\n\n\t\t\t\tfooter a:hover {\n\t\t\t\t\tcolor: rgba(204, 206, 216, 1);\n\t\t\t\t}\n\n\t\t\t\t#main-container {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tflex-direction: column;\n\t\t\t\t\theight: 100%;\n\t\t\t\t\tgap: 24px;\n\t\t\t\t}\n\n\t\t\t\tp {\n\t\t\t\t\tmargin-top: 0;\n\t\t\t\t}\n\n\t\t\t\theader {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tjustify-content: space-between;\n\t\t\t\t\talign-items: center;\n\t\t\t\t}\n\n\t\t\t\theader section {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tgap: 0.8em;\n\t\t\t\t}\n\n\t\t\t\th2 {\n\t\t\t\t\tcolor: white;\n\t\t\t\t\tmargin: 0;\n\t\t\t\t\tfont-size: 18px;\n\t\t\t\t}\n\n\t\t\t\ta {\n\t\t\t\t\tcolor: rgba(224, 204, 250, 1);\n\t\t\t\t}\n\n\t\t\t\ta:hover {\n\t\t\t\t\tcolor: #f4ecfd;\n\t\t\t\t}\n\n\t\t\t\t#integration-list-wrapper {\n\t\t\t\t\tposition: relative;\n\t\t\t\t\t--offset: 24px;\n\t\t\t\t\toverflow-x: auto;\n\t\t\t\t\toverflow-y: hidden;\n\t\t\t\t\tmargin-left: calc(var(--offset) * -1);\n\t\t\t\t\tmargin-right: calc(var(--offset) * -1);\n\t\t\t\t\tpadding-left: var(--offset);\n\t\t\t\t\tpadding-right: var(--offset);\n\t\t\t\t\theight: 210px;\n\t\t\t\t}\n\n\t\t\t\t/* Pseudo-elements to fade cards as they scroll out of viewport */\n\t\t\t\t#integration-list-wrapper::before,\n\t\t\t\t#integration-list-wrapper::after {\n\t\t\t\t\tcontent: '';\n\t\t\t\t\theight: 192px;\n\t\t\t\t\tdisplay: block;\n\t\t\t\t\tposition: fixed;\n\t\t\t\t\twidth: var(--offset);\n\t\t\t\t\ttop: 106px;\n\t\t\t\t\tbackground: red;\n\t\t\t\t}\n\n\t\t\t\t#integration-list-wrapper::before {\n\t\t\t\t\tleft: -1px;\n\t\t\t\t\tborder-left: 1px solid rgba(52, 56, 65, 1);\n\t\t\t\t\tbackground: linear-gradient(to right, rgba(19, 21, 26, 1), rgba(19, 21, 26, 0));\n\t\t\t\t}\n\n\t\t\t\t#integration-list-wrapper::after {\n\t\t\t\t\tright: -1px;\n\t\t\t\t\tborder-right: 1px solid rgba(52, 56, 65, 1);\n\t\t\t\t\tbackground: linear-gradient(to left, rgba(19, 21, 26, 1), rgba(19, 21, 26, 0));\n\t\t\t\t}\n\n\t\t\t\t#integration-list-wrapper::-webkit-scrollbar {\n\t\t\t\t\twidth: 5px;\n\t\t\t\t\theight: 8px;\n\t\t\t\t\tbackground-color: rgba(255, 255, 255, 0.08); /* or add it to the track */\n\t\t\t\t\tborder-radius: 4px;\n\t\t\t\t}\n\n\t\t\t\t/* This is wild but gives us a gap on either side of the container */\n\t\t\t\t#integration-list-wrapper::-webkit-scrollbar-button:start:decrement,\n\t\t\t\t#integration-list-wrapper::-webkit-scrollbar-button:end:increment {\n\t\t\t\t\tdisplay: block;\n\t\t\t\t\twidth: 24px;\n\t\t\t\t\tbackground-color: #13151A;\n\t\t\t\t}\n\n\t\t\t\t/* Removes arrows on both sides */\n\t\t\t\t#integration-list-wrapper::-webkit-scrollbar-button:horizontal:start:increment,\n\t\t\t\t#integration-list-wrapper::-webkit-scrollbar-button:horizontal:end:decrement {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\n\t\t\t\t#integration-list-wrapper::-webkit-scrollbar-track-piece {\n\t\t\t\t\tborder-radius: 4px;\n\t\t\t\t}\n\n\t\t\t\t#integration-list-wrapper::-webkit-scrollbar-thumb {\n\t\t\t\t\tbackground-color: rgba(255, 255, 255, 0.3);\n\t\t\t\t\tborder-radius: 4px;\n\t\t\t\t}\n\n\t\t\t\t#integration-list {\n\t\t\t\t\tmargin-top: 1em;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tgap: 16px;\n\t\t\t\t\tpadding-bottom: 1em;\n\t\t\t\t}\n\n\t\t\t\t#integration-list::after {\n\t\t\t\t\tcontent: \" \";\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t\twhite-space: pre;\n\t\t\t\t\twidth: 1px;\n\t\t\t\t\theight: 1px;\n\t\t\t\t}\n\n\t\t\t\t#integration-list astro-dev-toolbar-card, .integration-skeleton {\n\t\t\t\t\tmin-width: 240px;\n\t\t\t\t\theight: 160px;\n\t\t\t\t}\n\n\t\t\t\t.integration-skeleton {\n\t\t\t\t\tanimation: pulse 2s calc(var(--i, 0) * 250ms) cubic-bezier(0.4, 0, 0.6, 1) infinite;\n\t\t\t\t\tbackground-color: rgba(35, 38, 45, 1);\n\t\t\t\t\tborder-radius: 8px;\n\t\t\t\t}\n\n\t\t\t\t@keyframes pulse {\n\t\t\t\t\t0%, 100% {\n\t\t\t\t\t\topacity: 1;\n\t\t\t\t\t}\n\t\t\t\t\t50% {\n\t\t\t\t\t\topacity: .5;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t#integration-list astro-dev-toolbar-card .integration-image {\n\t\t\t\t\twidth: 40px;\n\t\t\t\t\theight: 40px;\n\t\t\t\t\tbackground-color: var(--integration-image-background, white);\n\t\t\t\t\tborder-radius: 9999px;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tmargin-bottom: 8px;\n\t\t\t\t}\n\n\t\t\t\t#integration-list astro-dev-toolbar-card img {\n\t\t\t\t\twidth: 24px;\n\t\t\t\t\theight: 24px;\n\t\t\t\t}\n\n\t\t\t\t#integration-list astro-dev-toolbar-card astro-dev-toolbar-icon {\n\t\t\t\t\twidth: 24px;\n\t\t\t\t\theight: 24px;\n\t\t\t\t\tcolor: #fff;\n\t\t\t\t}\n\n\t\t\t\t#links {\n\t\t\t\t\tmargin: auto 0;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\tgap: 24px;\n\t\t\t\t}\n\n\t\t\t\t#links a {\n\t\t\t\t\ttext-decoration: none;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tflex-direction: column;\n\t\t\t\t\tgap: 0.7em;\n\t\t\t\t\tflex: 1;\n\t\t\t\t\twhite-space: nowrap;\n\t\t\t\t\tfont-weight: 600;\n\t\t\t\t\tcolor: white;\n\t\t\t\t}\n\n\t\t\t\t#links a:hover {\n\t\t\t\t\tcolor: rgba(145, 152, 173, 1);\n\t\t\t\t}\n\n\t\t\t\t#links astro-dev-toolbar-icon {\n\t\t\t\t\twidth: 1.5em;\n\t\t\t\t\theight: 1.5em;\n\t\t\t\t\tdisplay: block;\n\t\t\t\t}\n\n\t\t\t\t#integration-list astro-dev-toolbar-card svg {\n\t\t\t\t\twidth: 24px;\n\t\t\t\t\theight: 24px;\n\t\t\t\t\tvertical-align: bottom;\n\t\t\t\t}\n\n\t\t\t\t#integration-list astro-dev-toolbar-card h3 {\n\t\t\t\t\tmargin: 0;\n\t\t\t\t\tmargin-bottom: 8px;\n \t\t\tcolor: white;\n\t\t\t\t\twhite-space: nowrap;\n\t\t\t\t}\n\n\t\t\t\t#integration-list astro-dev-toolbar-card p {\n\t\t\t\t\tfont-size: 14px;\n\t\t\t\t}\n\n\t\t\t\t@media (forced-colors: active) {\n\t\t\t\t\tsvg path[fill=\"#fff\"] {\n\t\t\t\t\t\tfill: black;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t</style>\n\n\t\t\t<header>\n\t\t\t\t<section>\n\t\t\t\t${astroLogo}\n\t\t\t\t<astro-dev-toolbar-badge badge-style=\"gray\" size=\"large\">${version}</astro-dev-toolbar-badge>\n\t\t\t\t${latestAstroVersion ? `<astro-dev-toolbar-badge badge-style=\"green\" size=\"large\">${latestAstroVersion} available!</astro-dev-toolbar-badge>\n\t\t\t\t\t\t` : \"\"}\n\t\t\t\t</section>\n\t\t\t\t<astro-dev-toolbar-button id=\"copy-debug-button\">Copy debug info <astro-dev-toolbar-icon icon=\"copy\" /></astro-dev-toolbar-button>\n\t\t\t</header>\n\t\t\t<hr />\n\n\t\t\t<div id=\"main-container\">\n\t\t\t\t<div>\n\t\t\t\t\t<header><h2>Featured integrations</h2><a href=\"https://astro.build/integrations/\" target=\"_blank\">View all</a></header>\n\t\t\t\t\t\t<div id=\"integration-list-wrapper\">\n\t\t\t\t\t\t\t<section id=\"integration-list\">\n\t\t\t\t\t\t\t\t<div class=\"integration-skeleton\" style=\"--i:0;\"></div>\n\t\t\t\t\t\t\t\t<div class=\"integration-skeleton\" style=\"--i:1;\"></div>\n\t\t\t\t\t\t\t\t<div class=\"integration-skeleton\" style=\"--i:2;\"></div>\n\t\t\t\t\t\t\t\t<div class=\"integration-skeleton\" style=\"--i:3;\"></div>\n\t\t\t\t\t\t\t\t<div class=\"integration-skeleton\" style=\"--i:4;\"></div>\n\t\t\t\t\t\t\t</section>\n\t\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<section id=\"links\">\n\t\t\t\t${links.map(\n (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>`\n ).join(\"\")}\n\t\t\t\t</section>\n\t\t\t</div>\n\t\t`\n );\n const copyDebugButton = windowComponent.querySelector(\"#copy-debug-button\");\n copyDebugButton?.addEventListener(\"click\", () => {\n navigator.clipboard.writeText(\"```\\n\" + debugInfo + \"\\n```\");\n copyDebugButton.textContent = \"Copied to clipboard!\";\n setTimeout(() => {\n resetDebugButton();\n }, 3500);\n });\n canvas.append(windowComponent);\n if (integrationData) refreshIntegrationList();\n }\n function resetDebugButton() {\n const copyDebugButton = canvas.querySelector(\"#copy-debug-button\");\n if (!copyDebugButton) return;\n copyDebugButton.innerHTML = 'Copy debug info <astro-dev-toolbar-icon icon=\"copy\" />';\n }\n function refreshIntegrationList() {\n const integrationList = canvas.querySelector(\"#integration-list\");\n if (!integrationList) return;\n integrationList.innerHTML = \"\";\n const fragment = document.createDocumentFragment();\n for (const integration of integrationData.data) {\n const integrationComponent = document.createElement(\"astro-dev-toolbar-card\");\n integrationComponent.link = integration.homepageUrl;\n const integrationContainer = document.createElement(\"div\");\n integrationContainer.className = \"integration-container\";\n const integrationImage = document.createElement(\"div\");\n integrationImage.className = \"integration-image\";\n if (integration.image) {\n const img = document.createElement(\"img\");\n img.src = integration.image;\n img.alt = integration.title;\n integrationImage.append(img);\n } else {\n const icon = document.createElement(\"astro-dev-toolbar-icon\");\n icon.icon = iconForIntegration(integration);\n integrationImage.append(icon);\n integrationImage.style.setProperty(\n \"--integration-image-background\",\n colorForIntegration()\n );\n }\n integrationContainer.append(integrationImage);\n let integrationTitle = document.createElement(\"h3\");\n integrationTitle.textContent = integration.title;\n if (integration.official || integration.categories.includes(\"official\")) {\n 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>';\n }\n integrationContainer.append(integrationTitle);\n const integrationDescription = document.createElement(\"p\");\n integrationDescription.textContent = integration.description.length > 90 ? integration.description.slice(0, 90) + \"\\u2026\" : integration.description;\n integrationContainer.append(integrationDescription);\n integrationComponent.append(integrationContainer);\n fragment.append(integrationComponent);\n }\n integrationList.append(fragment);\n }\n }\n};\nexport {\n astro_default as default\n};\n"],"x_google_ignoreList":[0,1],"mappings":";;;AAAA,SAAS,gBAAgB,MAAM;CAC7B,OAAO,KAAK,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,MAAM;AACpD;AACA,IAAM,gBAAgB,IAAI,IACxB,OAAO,QAAQ;CACb,YAAY,CAAC,UAAU,MAAM;CAC7B,UAAU;EAAC;EAAU;EAAQ;CAAU;CACvC,UAAU;EAAC;EAAY;EAAQ;EAAS;EAAe;CAAQ;CAC/D,mBAAmB;EAAC;EAAe;EAAe;EAAY;EAAS;EAAc;CAAS;CAC9F,WAAW;EAAC;EAAe;EAAY;CAAY;CACnD,eAAe,CAAC,eAAe,aAAa;CAC5C,OAAO;EAAC;EAAe;EAAQ;EAAU;CAAS;AACpD,CAAC,CACH;AACA,SAAS,mBAAmB,aAAa;CAEvC,OAAO,gBADO,YAAY,WAAW,QAAQ,aAAa,cAAc,IAAI,QAAQ,CAAC,CAAC,CAAC,SAAS,aAAa,cAAc,IAAI,QAAQ,CAC5G,CAAC;AAC9B;AACA,IAAM,aAAa;CACjB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AACA,SAAS,sBAAsB;CAC7B,OAAO,gBAAgB,UAAU;AACnC;;;ACzBA,IAAM,YAAY;AAClB,IAAI;AACJ,IAAI,gBAAgB;CAClB,IAAI;CACJ,MAAM;CACN,MAAM;CACN,MAAM,KAAK,QAAQ,aAAa;EAC9B,aAAa;EACb,SAAS,iBAAiB,oBAAoB,YAAY;EAC1D,YAAY,iBAAiB,eAAe,OAAO,UAAU;GAC3D,iBAAiB;GACjB,IAAI,EAAE,iBAAiB,cAAc;GACrC,IAAI,MAAM,OAAO,UAAU;QACrB,CAAC,iBAAiB,qBAAqB;GAAA;EAE/C,CAAC;EACD,oBAAoB,WAAW;EAC/B,6BAA6B,aAAa,MAAM;EAChD,SAAS,uBAAuB;GAC9B,MAAM,2CAA2C,EAC/C,OAAO,WACT,CAAC,CAAC,CAAC,MAAM,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,SAAS;IAC1C,kBAAkB;IAClB,gBAAgB,OAAO,gBAAgB,KAAK,KAAK,gBAAgB;KAC/D,OAAO;IACT,CAAC;IACD,uBAAuB;GACzB,CAAC;EACH;EACA,SAAS,eAAe;GACtB,MAAM,QAAQ;IACZ;KACE,MAAM;KACN,MAAM;KACN,MAAM;IACR;IACA;KACE,MAAM;KACN,MAAM;KACN,MAAM;IACR;IACA;KACE,MAAM;KACN,MAAM;KACN,MAAM;IACR;IACA;KACE,MAAM;KACN,MAAM;KACN,MAAM;IACR;GACF;GACA,MAAM,EAAE,oBAAoB,SAAS,cAAc,OAAO,yBAAyB,CAAC;GACpF,MAAM,kBAAkB,oBACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA+OF,UAAU;+DAC+C,QAAQ;MACjE,qBAAqB,6DAA6D,mBAAmB;UACjG,GAAG;;;;;;;;;;;;;;;;;;;;MAoBP,MAAM,KACD,SAAS,YAAY,KAAK,KAAK,4CAA4C,cAAc,KAAK,IAAI,IAAI,SAAS,KAAK,KAAK,MAAM,IAAI,KAAK,OAAO,2BAA2B,KAAK,KAAK,KACvL,CAAC,CAAC,KAAK,EAAE,EAAE;;;GAIb;GACA,MAAM,kBAAkB,gBAAgB,cAAc,oBAAoB;GAC1E,iBAAiB,iBAAiB,eAAe;IAC/C,UAAU,UAAU,UAAU,UAAU,YAAY,OAAO;IAC3D,gBAAgB,cAAc;IAC9B,iBAAiB;KACf,iBAAiB;IACnB,GAAG,IAAI;GACT,CAAC;GACD,OAAO,OAAO,eAAe;GAC7B,IAAI,iBAAiB,uBAAuB;EAC9C;EACA,SAAS,mBAAmB;GAC1B,MAAM,kBAAkB,OAAO,cAAc,oBAAoB;GACjE,IAAI,CAAC,iBAAiB;GACtB,gBAAgB,YAAY;EAC9B;EACA,SAAS,yBAAyB;GAChC,MAAM,kBAAkB,OAAO,cAAc,mBAAmB;GAChE,IAAI,CAAC,iBAAiB;GACtB,gBAAgB,YAAY;GAC5B,MAAM,WAAW,SAAS,uBAAuB;GACjD,KAAK,MAAM,eAAe,gBAAgB,MAAM;IAC9C,MAAM,uBAAuB,SAAS,cAAc,wBAAwB;IAC5E,qBAAqB,OAAO,YAAY;IACxC,MAAM,uBAAuB,SAAS,cAAc,KAAK;IACzD,qBAAqB,YAAY;IACjC,MAAM,mBAAmB,SAAS,cAAc,KAAK;IACrD,iBAAiB,YAAY;IAC7B,IAAI,YAAY,OAAO;KACrB,MAAM,MAAM,SAAS,cAAc,KAAK;KACxC,IAAI,MAAM,YAAY;KACtB,IAAI,MAAM,YAAY;KACtB,iBAAiB,OAAO,GAAG;IAC7B,OAAO;KACL,MAAM,OAAO,SAAS,cAAc,wBAAwB;KAC5D,KAAK,OAAO,mBAAmB,WAAW;KAC1C,iBAAiB,OAAO,IAAI;KAC5B,iBAAiB,MAAM,YACrB,kCACA,oBAAoB,CACtB;IACF;IACA,qBAAqB,OAAO,gBAAgB;IAC5C,IAAI,mBAAmB,SAAS,cAAc,IAAI;IAClD,iBAAiB,cAAc,YAAY;IAC3C,IAAI,YAAY,YAAY,YAAY,WAAW,SAAS,UAAU,GACpE,iBAAiB,aAAa;IAEhC,qBAAqB,OAAO,gBAAgB;IAC5C,MAAM,yBAAyB,SAAS,cAAc,GAAG;IACzD,uBAAuB,cAAc,YAAY,YAAY,SAAS,KAAK,YAAY,YAAY,MAAM,GAAG,EAAE,IAAI,MAAW,YAAY;IACzI,qBAAqB,OAAO,sBAAsB;IAClD,qBAAqB,OAAO,oBAAoB;IAChD,SAAS,OAAO,oBAAoB;GACtC;GACA,gBAAgB,OAAO,QAAQ;EACjC;CACF;AACF"}