@grove-dev/astro 0.1.4 → 0.2.2

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 (246) hide show
  1. package/dist/index.d.ts +4 -25
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +56 -22
  4. package/dist/index.js.map +1 -1
  5. package/dist/layouts/index.d.ts +25 -0
  6. package/dist/layouts/index.d.ts.map +1 -0
  7. package/dist/layouts/index.js +25 -0
  8. package/dist/layouts/index.js.map +1 -0
  9. package/dist/lib/display.d.ts +33 -0
  10. package/dist/lib/display.d.ts.map +1 -0
  11. package/dist/lib/display.js +104 -0
  12. package/dist/lib/display.js.map +1 -0
  13. package/dist/lib/format.d.ts +30 -0
  14. package/dist/lib/format.d.ts.map +1 -0
  15. package/dist/lib/format.js +73 -0
  16. package/dist/lib/format.js.map +1 -0
  17. package/dist/lib/index.d.ts +26 -0
  18. package/dist/lib/index.d.ts.map +1 -0
  19. package/dist/lib/index.js +26 -0
  20. package/dist/lib/index.js.map +1 -0
  21. package/dist/lib/lenses.d.ts +96 -0
  22. package/dist/lib/lenses.d.ts.map +1 -0
  23. package/dist/lib/lenses.js +181 -0
  24. package/dist/lib/lenses.js.map +1 -0
  25. package/dist/lib/repo.d.ts +30 -0
  26. package/dist/lib/repo.d.ts.map +1 -0
  27. package/dist/lib/repo.js +44 -0
  28. package/dist/lib/repo.js.map +1 -0
  29. package/dist/lib/scores.d.ts +38 -0
  30. package/dist/lib/scores.d.ts.map +1 -0
  31. package/dist/lib/scores.js +83 -0
  32. package/dist/lib/scores.js.map +1 -0
  33. package/dist/lib/search.d.ts +199 -0
  34. package/dist/lib/search.d.ts.map +1 -0
  35. package/dist/lib/search.js +357 -0
  36. package/dist/lib/search.js.map +1 -0
  37. package/dist/lib/taxonomy-counts.d.ts +25 -0
  38. package/dist/lib/taxonomy-counts.d.ts.map +1 -0
  39. package/dist/lib/taxonomy-counts.js +41 -0
  40. package/dist/lib/taxonomy-counts.js.map +1 -0
  41. package/package.json +7 -7
  42. package/src/components/AppSection.astro +83 -0
  43. package/src/components/AppsIndexRow.astro +204 -0
  44. package/src/components/AppsPagination.astro +126 -0
  45. package/src/components/CategoryGrid.astro +86 -17
  46. package/src/components/ContributorsGrid.astro +149 -0
  47. package/src/components/DecisionRow.astro +89 -0
  48. package/src/components/ExploreByCategory.astro +67 -0
  49. package/src/components/ExploreByStack.astro +72 -0
  50. package/src/components/Hero.astro +246 -0
  51. package/src/components/Icon.astro +223 -0
  52. package/src/components/ItemCard.astro +289 -30
  53. package/src/components/MinimalAbout.astro +82 -0
  54. package/src/components/OriginalCollection.astro +116 -0
  55. package/src/components/RefinePanel.astro +197 -0
  56. package/src/components/ScoreBars.astro +92 -22
  57. package/src/components/SmartLensTabs.astro +71 -0
  58. package/src/components/StackGrid.astro +132 -0
  59. package/src/components/WhyThisExists.astro +116 -0
  60. package/src/index.ts +61 -14
  61. package/src/layouts/BaseLayout.astro +227 -15
  62. package/src/layouts/Container.astro +57 -0
  63. package/src/layouts/Footer.astro +235 -0
  64. package/src/layouts/Header.astro +159 -0
  65. package/src/layouts/SectionHeader.astro +58 -0
  66. package/{templates/default/src/components/layout → src/layouts}/Seo.astro +62 -38
  67. package/src/layouts/ThemeToggle.astro +110 -0
  68. package/src/layouts/astro-shim.d.ts +29 -0
  69. package/src/layouts/index.ts +24 -0
  70. package/src/lib/display.ts +118 -0
  71. package/src/lib/format.ts +65 -0
  72. package/src/lib/index.ts +26 -0
  73. package/src/lib/lenses.ts +241 -0
  74. package/src/lib/repo.ts +44 -0
  75. package/src/lib/scores.ts +94 -0
  76. package/src/lib/search.ts +481 -0
  77. package/src/lib/taxonomy-counts.ts +60 -0
  78. package/src/styles.css +366 -638
  79. package/templates/default/.astro/content.d.ts +155 -0
  80. package/templates/default/.astro/settings.json +5 -0
  81. package/templates/default/.astro/types.d.ts +2 -0
  82. package/templates/default/astro.config.mjs +8 -6
  83. package/templates/default/content/pages/about.md +66 -0
  84. package/templates/default/content/pages/methodology.md +103 -0
  85. package/templates/default/data/generated/records.full.json +8 -0
  86. package/templates/default/data/generated/records.index.json +7 -0
  87. package/templates/default/data/generated/records.json +8 -0
  88. package/templates/default/data/generated/site-config.json +31 -0
  89. package/templates/default/data/records/.gitkeep +0 -0
  90. package/templates/default/dist/_astro/BaseLayout.DfpwR3jc.css +1 -0
  91. package/templates/default/dist/about/index.html +165 -0
  92. package/templates/default/dist/icons/platforms/android.svg +1 -0
  93. package/templates/default/dist/icons/platforms/apple-dark.svg +1 -0
  94. package/templates/default/dist/icons/platforms/apple-light.svg +1 -0
  95. package/templates/default/dist/icons/platforms/chrome.svg +1 -0
  96. package/templates/default/dist/icons/platforms/chromeos.svg +5 -0
  97. package/templates/default/dist/icons/platforms/desktop.svg +4 -0
  98. package/templates/default/dist/icons/platforms/embedded.svg +5 -0
  99. package/templates/default/dist/icons/platforms/ios.svg +1 -0
  100. package/templates/default/dist/icons/platforms/linux.svg +1 -0
  101. package/templates/default/dist/icons/platforms/macos.svg +1 -0
  102. package/templates/default/dist/icons/platforms/ubuntu.svg +1 -0
  103. package/templates/default/dist/icons/platforms/web.svg +5 -0
  104. package/templates/default/dist/icons/platforms/windows.svg +6 -0
  105. package/templates/default/dist/icons/stacks/android.svg +1 -0
  106. package/templates/default/dist/icons/stacks/apple-dark.svg +1 -0
  107. package/templates/default/dist/icons/stacks/apple-light.svg +1 -0
  108. package/templates/default/dist/icons/stacks/capacitor.svg +14 -0
  109. package/templates/default/dist/icons/stacks/dart.svg +1 -0
  110. package/templates/default/dist/icons/stacks/firebase.svg +1 -0
  111. package/templates/default/dist/icons/stacks/flutter.svg +1 -0
  112. package/templates/default/dist/icons/stacks/graphql.svg +1 -0
  113. package/templates/default/dist/icons/stacks/ionic.svg +4 -0
  114. package/templates/default/dist/icons/stacks/java.svg +1 -0
  115. package/templates/default/dist/icons/stacks/javascript.svg +1 -0
  116. package/templates/default/dist/icons/stacks/kotlin.svg +1 -0
  117. package/templates/default/dist/icons/stacks/mongodb.svg +1 -0
  118. package/templates/default/dist/icons/stacks/nodejs.svg +1 -0
  119. package/templates/default/dist/icons/stacks/python.svg +1 -0
  120. package/templates/default/dist/icons/stacks/react-native.svg +1 -0
  121. package/templates/default/dist/icons/stacks/react.svg +1 -0
  122. package/templates/default/dist/icons/stacks/rust.svg +1 -0
  123. package/templates/default/dist/icons/stacks/solidity.svg +1 -0
  124. package/templates/default/dist/icons/stacks/swift.svg +1 -0
  125. package/templates/default/dist/icons/stacks/tensorflow.svg +1 -0
  126. package/templates/default/dist/icons/stacks/typescript.svg +1 -0
  127. package/templates/default/dist/index.html +55 -0
  128. package/templates/default/dist/llms-full.txt +14 -0
  129. package/templates/default/dist/llms.txt +11 -0
  130. package/templates/default/dist/og-image.svg +48 -0
  131. package/templates/default/dist/projects/index.html +61 -0
  132. package/templates/default/dist/robots.txt +53 -0
  133. package/templates/default/dist/sitemap.xml +21 -0
  134. package/templates/default/dist/submit/index.html +69 -0
  135. package/templates/default/grove.config.ts +36 -0
  136. package/templates/default/node_modules/.bin/astro +21 -0
  137. package/templates/default/node_modules/.bin/astro-check +21 -0
  138. package/templates/default/node_modules/.bin/grove +21 -0
  139. package/templates/default/node_modules/.bin/jiti +21 -0
  140. package/templates/default/node_modules/.bin/prettier +21 -0
  141. package/templates/default/node_modules/.bin/rollup +21 -0
  142. package/templates/default/node_modules/.bin/tsc +21 -0
  143. package/templates/default/node_modules/.bin/tsserver +21 -0
  144. package/templates/default/node_modules/.bin/tsx +21 -0
  145. package/templates/default/node_modules/.bin/vite +21 -0
  146. package/templates/default/node_modules/.bin/yaml +21 -0
  147. package/templates/default/node_modules/.vite/deps/_metadata.json +79 -0
  148. package/templates/default/node_modules/.vite/deps/astro-KRVZHBC5.js +433 -0
  149. package/templates/default/node_modules/.vite/deps/astro-KRVZHBC5.js.map +7 -0
  150. package/templates/default/node_modules/.vite/deps/astro___aria-query.js +5 -0
  151. package/templates/default/node_modules/.vite/deps/astro___aria-query.js.map +7 -0
  152. package/templates/default/node_modules/.vite/deps/astro___axobject-query.js +5 -0
  153. package/templates/default/node_modules/.vite/deps/astro___axobject-query.js.map +7 -0
  154. package/templates/default/node_modules/.vite/deps/astro___html-escaper.js +9 -0
  155. package/templates/default/node_modules/.vite/deps/astro___html-escaper.js.map +7 -0
  156. package/templates/default/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js +241 -0
  157. package/templates/default/node_modules/.vite/deps/astro_runtime_client_dev-toolbar_entrypoint__js.js.map +7 -0
  158. package/templates/default/node_modules/.vite/deps/audit-GYHQ3ITH.js +1592 -0
  159. package/templates/default/node_modules/.vite/deps/audit-GYHQ3ITH.js.map +7 -0
  160. package/templates/default/node_modules/.vite/deps/chunk-5WRI5ZAA.js +30 -0
  161. package/templates/default/node_modules/.vite/deps/chunk-5WRI5ZAA.js.map +7 -0
  162. package/templates/default/node_modules/.vite/deps/chunk-7P4KIK53.js +186 -0
  163. package/templates/default/node_modules/.vite/deps/chunk-7P4KIK53.js.map +7 -0
  164. package/templates/default/node_modules/.vite/deps/chunk-BQGHFQJH.js +48 -0
  165. package/templates/default/node_modules/.vite/deps/chunk-BQGHFQJH.js.map +7 -0
  166. package/templates/default/node_modules/.vite/deps/chunk-CJCDKWP2.js +6779 -0
  167. package/templates/default/node_modules/.vite/deps/chunk-CJCDKWP2.js.map +7 -0
  168. package/templates/default/node_modules/.vite/deps/chunk-FHJ3XBDE.js +33 -0
  169. package/templates/default/node_modules/.vite/deps/chunk-FHJ3XBDE.js.map +7 -0
  170. package/templates/default/node_modules/.vite/deps/chunk-FQEMNIUQ.js +88 -0
  171. package/templates/default/node_modules/.vite/deps/chunk-FQEMNIUQ.js.map +7 -0
  172. package/templates/default/node_modules/.vite/deps/chunk-HBSVDAQD.js +72 -0
  173. package/templates/default/node_modules/.vite/deps/chunk-HBSVDAQD.js.map +7 -0
  174. package/templates/default/node_modules/.vite/deps/chunk-HDOQ2U3U.js +3757 -0
  175. package/templates/default/node_modules/.vite/deps/chunk-HDOQ2U3U.js.map +7 -0
  176. package/templates/default/node_modules/.vite/deps/chunk-XEBKRCNE.js +54 -0
  177. package/templates/default/node_modules/.vite/deps/chunk-XEBKRCNE.js.map +7 -0
  178. package/templates/default/node_modules/.vite/deps/package.json +3 -0
  179. package/templates/default/node_modules/.vite/deps/settings-C5H4VHXU.js +213 -0
  180. package/templates/default/node_modules/.vite/deps/settings-C5H4VHXU.js.map +7 -0
  181. package/templates/default/node_modules/.vite/deps/toolbar-H5DB6HVP.js +525 -0
  182. package/templates/default/node_modules/.vite/deps/toolbar-H5DB6HVP.js.map +7 -0
  183. package/templates/default/node_modules/.vite/deps/ui-library-JGHU6JE2.js +1020 -0
  184. package/templates/default/node_modules/.vite/deps/ui-library-JGHU6JE2.js.map +7 -0
  185. package/templates/default/node_modules/.vite/deps/xray-EFCQOW4E.js +147 -0
  186. package/templates/default/node_modules/.vite/deps/xray-EFCQOW4E.js.map +7 -0
  187. package/templates/default/package.json +6 -5
  188. package/templates/default/public/llms-full.txt +14 -0
  189. package/templates/default/public/llms.txt +11 -0
  190. package/templates/default/src/components/layout/BaseLayout.astro +10 -57
  191. package/templates/default/src/components/layout/Footer.astro +16 -134
  192. package/templates/default/src/components/layout/Header.astro +25 -126
  193. package/templates/default/src/data/records.ts +161 -0
  194. package/templates/default/src/lib/markdown.ts +171 -0
  195. package/templates/default/src/pages/about.astro +95 -429
  196. package/templates/default/src/pages/index.astro +258 -61
  197. package/templates/default/src/pages/projects/[slug].astro +480 -0
  198. package/templates/default/src/pages/projects/index.astro +193 -0
  199. package/templates/default/src/pages/sitemap.xml.ts +73 -61
  200. package/templates/default/src/pages/submit.astro +122 -411
  201. package/templates/default/src/styles/global.css +42 -68
  202. package/src/components/ActiveFilterChips.astro +0 -20
  203. package/src/components/DirectoryFilters.astro +0 -100
  204. package/src/components/DirectoryHero.astro +0 -32
  205. package/src/components/HealthBadge.astro +0 -12
  206. package/src/components/LensTabs.astro +0 -26
  207. package/src/components/MethodologyPanel.astro +0 -20
  208. package/src/components/Pagination.astro +0 -24
  209. package/src/components/ProjectDetail.astro +0 -166
  210. package/src/components/SubmitDraft.astro +0 -137
  211. package/templates/default/src/components/AppCard.astro +0 -248
  212. package/templates/default/src/components/AppSection.astro +0 -58
  213. package/templates/default/src/components/AppsIndexRow.astro +0 -230
  214. package/templates/default/src/components/AppsPagination.astro +0 -147
  215. package/templates/default/src/components/CategoryGrid.astro +0 -80
  216. package/templates/default/src/components/ContributorsGrid.astro +0 -105
  217. package/templates/default/src/components/DecisionRow.astro +0 -219
  218. package/templates/default/src/components/ExploreByCategory.astro +0 -74
  219. package/templates/default/src/components/ExploreByStack.astro +0 -102
  220. package/templates/default/src/components/Hero.astro +0 -176
  221. package/templates/default/src/components/MinimalAbout.astro +0 -57
  222. package/templates/default/src/components/OriginalCollection.astro +0 -144
  223. package/templates/default/src/components/RefinePanel.astro +0 -272
  224. package/templates/default/src/components/ScoreBars.astro +0 -72
  225. package/templates/default/src/components/SmartLensTabs.astro +0 -65
  226. package/templates/default/src/components/StackGrid.astro +0 -95
  227. package/templates/default/src/components/WhyThisExists.astro +0 -81
  228. package/templates/default/src/components/icons/Icon.astro +0 -148
  229. package/templates/default/src/components/layout/SectionHeader.astro +0 -42
  230. package/templates/default/src/components/layout/ThemeToggle.astro +0 -97
  231. package/templates/default/src/data/apps.ts +0 -149
  232. package/templates/default/src/data/categories.ts +0 -27
  233. package/templates/default/src/data/config.ts +0 -28
  234. package/templates/default/src/data/contributors.ts +0 -96
  235. package/templates/default/src/data/stacks.ts +0 -47
  236. package/templates/default/src/data/stats.ts +0 -65
  237. package/templates/default/src/data/types.ts +0 -248
  238. package/templates/default/src/lib/apps-search.ts +0 -228
  239. package/templates/default/src/lib/format.ts +0 -36
  240. package/templates/default/src/lib/lenses.ts +0 -98
  241. package/templates/default/src/lib/repo.ts +0 -12
  242. package/templates/default/src/lib/scores.ts +0 -51
  243. package/templates/default/src/lib/taxonomy-counts.ts +0 -31
  244. package/templates/default/src/pages/apps/[slug].astro +0 -709
  245. package/templates/default/src/pages/apps/index.astro +0 -669
  246. package/templates/default/src/pages/contributors.astro +0 -142
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/dist/runtime/client/dev-toolbar/ui-library/badge.js", "../../../../../../../node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/dist/runtime/client/dev-toolbar/ui-library/button.js", "../../../../../../../node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/dist/runtime/client/dev-toolbar/ui-library/card.js", "../../../../../../../node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/dist/runtime/client/dev-toolbar/ui-library/highlight.js", "../../../../../../../node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/dist/runtime/client/dev-toolbar/ui-library/icon.js", "../../../../../../../node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/dist/runtime/client/dev-toolbar/ui-library/radio-checkbox.js", "../../../../../../../node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/dist/runtime/client/dev-toolbar/ui-library/select.js", "../../../../../../../node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/dist/runtime/client/dev-toolbar/ui-library/toggle.js", "../../../../../../../node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/dist/runtime/client/dev-toolbar/ui-library/tooltip.js"],
4
+ "sourcesContent": ["import { settings } from \"../settings.js\";\nconst sizes = [\"small\", \"large\"];\nconst styles = [\"purple\", \"gray\", \"red\", \"green\", \"yellow\", \"blue\"];\nclass DevToolbarBadge extends HTMLElement {\n _size = \"small\";\n _badgeStyle = \"purple\";\n get size() {\n return this._size;\n }\n set size(value) {\n if (!sizes.includes(value)) {\n settings.logger.error(\n `Invalid size: ${value}, expected one of ${sizes.join(\", \")}, got ${value}.`\n );\n return;\n }\n this._size = value;\n this.updateStyle();\n }\n get badgeStyle() {\n return this._badgeStyle;\n }\n set badgeStyle(value) {\n if (!styles.includes(value)) {\n settings.logger.error(\n `Invalid style: ${value}, expected one of ${styles.join(\", \")}, got ${value}.`\n );\n return;\n }\n this._badgeStyle = value;\n this.updateStyle();\n }\n shadowRoot;\n static observedAttributes = [\"badge-style\", \"size\"];\n constructor() {\n super();\n this.shadowRoot = this.attachShadow({ mode: \"open\" });\n this.shadowRoot.innerHTML = `\n\t\t\t<style>\n\t\t\t\t.badge {\n\t\t\t\t\tbox-sizing: border-box;\n\t\t\t\t\tborder-radius: 4px;\n\t\t\t\t\tborder: 1px solid transparent;\n\t\t\t\t\tpadding: 8px;\n\t\t\t\t\tfont-size: 12px;\n\t\t\t\t\tcolor: var(--text-color);\n\t\t\t\t\theight: var(--size);\n\t\t\t\t\tborder: 1px solid var(--border-color);\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\tfont-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n\n\t\t\t\t\t--purple-text: rgba(224, 204, 250, 1);\n\t\t\t\t\t--purple-border: rgba(113, 24, 226, 1);\n\n\t\t\t\t\t--gray-text: rgba(191, 193, 201, 1);\n\t\t\t\t\t--gray-border:rgba(191, 193, 201, 1);\n\n\t\t\t\t\t--red-text: rgba(249, 196, 215, 1);\n\t\t\t\t\t--red-border: rgba(179, 62, 102, 1);\n\n\t\t\t\t\t--green-text: rgba(213, 249, 196, 1);\n\t\t\t\t\t--green-border: rgba(61, 125, 31, 1);\n\n\t\t\t\t\t--yellow-text: rgba(249, 233, 196, 1);\n\t\t\t\t\t--yellow-border: rgba(181, 138, 45, 1);\n\n\t\t\t\t\t--blue-text: rgba(189, 195, 255, 1);\n\t\t\t\t\t--blue-border: rgba(54, 69, 217, 1);\n\n\t\t\t\t\t--large: 24px;\n\t\t\t\t\t--small: 20px;\n\t\t\t\t}\n\t\t\t</style>\n\t\t\t<style id=\"selected-style\"></style>\n\n\t\t\t<div class=\"badge\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t\t`;\n }\n connectedCallback() {\n this.updateStyle();\n }\n attributeChangedCallback() {\n if (this.hasAttribute(\"badge-style\"))\n this.badgeStyle = this.getAttribute(\"badge-style\");\n if (this.hasAttribute(\"size\")) this.size = this.getAttribute(\"size\");\n }\n updateStyle() {\n const style = this.shadowRoot.querySelector(\"#selected-style\");\n if (style) {\n style.innerHTML = `\n\t\t\t.badge {\n\t\t\t\t--text-color: var(--${this.badgeStyle}-text);\n\t\t\t\t--border-color: var(--${this.badgeStyle}-border);\n\t\t\t\t--size: var(--${this.size});\n\t\t\t}`;\n }\n }\n}\nexport {\n DevToolbarBadge\n};\n", "import { settings } from \"../settings.js\";\nconst sizes = [\"small\", \"medium\", \"large\"];\nconst styles = [\"ghost\", \"outline\", \"purple\", \"gray\", \"red\", \"green\", \"yellow\", \"blue\"];\nconst borderRadii = [\"normal\", \"rounded\"];\nclass DevToolbarButton extends HTMLElement {\n _size = \"small\";\n _buttonStyle = \"purple\";\n _buttonBorderRadius = \"normal\";\n get size() {\n return this._size;\n }\n set size(value) {\n if (!sizes.includes(value)) {\n settings.logger.error(\n `Invalid size: ${value}, expected one of ${sizes.join(\", \")}, got ${value}.`\n );\n return;\n }\n this._size = value;\n this.updateStyle();\n }\n get buttonStyle() {\n return this._buttonStyle;\n }\n set buttonStyle(value) {\n if (!styles.includes(value)) {\n settings.logger.error(\n `Invalid style: ${value}, expected one of ${styles.join(\", \")}, got ${value}.`\n );\n return;\n }\n this._buttonStyle = value;\n this.updateStyle();\n }\n get buttonBorderRadius() {\n return this._buttonBorderRadius;\n }\n set buttonBorderRadius(value) {\n if (!borderRadii.includes(value)) {\n settings.logger.error(\n `Invalid border-radius: ${value}, expected one of ${borderRadii.join(\", \")}, got ${value}.`\n );\n return;\n }\n this._buttonBorderRadius = value;\n this.updateStyle();\n }\n static observedAttributes = [\"button-style\", \"size\", \"button-border-radius\"];\n shadowRoot;\n constructor() {\n super();\n this.shadowRoot = this.attachShadow({ mode: \"open\" });\n this.shadowRoot.innerHTML = `\n\t\t\t<style>\n\t\t\t\tbutton {\n\t\t\t\t\t--purple-background: rgba(113, 24, 226, 1);\n\t\t\t\t\t--purple-border: rgba(224, 204, 250, 0.33);\n\t\t\t\t\t--purple-text: #fff;\n\n\t\t\t\t\t--gray-background: rgba(52, 56, 65, 1);\n\t\t\t\t\t--gray-border: rgba(71, 78, 94, 1);\n\t\t\t\t\t--gray-text: #fff;\n\n\t\t\t\t\t--red-background: rgba(179, 62, 102, 1);\n\t\t\t\t\t--red-border: rgba(249, 196, 215, 0.33);\n\t\t\t\t\t--red-text: #fff;\n\n\t\t\t\t\t--green-background: rgba(213, 249, 196, 1);\n\t\t\t\t\t--green-border: rgba(61, 125, 31, 1);\n\t\t\t\t\t--green-text: #000;\n\n\t\t\t\t\t--yellow-background: rgba(255, 236, 179, 1);\n\t\t\t\t\t--yellow-border: rgba(255, 191, 0, 1);\n\t\t\t\t\t--yellow-text: #000;\n\n\t\t\t\t\t--blue-background: rgba(54, 69, 217, 1);\n\t\t\t\t\t--blue-border: rgba(189, 195, 255, 1);\n\t\t\t\t\t--blue-text: #fff;\n\n\t\t\t\t\t--outline-background: transparent;\n\t\t\t\t\t--outline-border: #fff;\n\t\t\t\t\t--outline-text: #fff;\n\n\t\t\t\t\t--ghost-background: transparent;\n\t\t\t\t\t--ghost-border: transparent;\n\t\t\t\t\t--ghost-text: #fff;\n\n\t\t\t\t\t--large-font-size: 16px;\n\t\t\t\t\t--medium-font-size: 14px;\n\t\t\t\t\t--small-font-size: 12px;\n\n\t\t\t\t\t--large-padding: 12px 16px;\n\t\t\t\t\t--large-rounded-padding: 12px 12px;\n\t\t\t\t\t--medium-padding: 8px 12px;\n\t\t\t\t\t--medium-rounded-padding: 8px 8px;\n\t\t\t\t\t--small-padding: 4px 8px;\n\t\t\t\t\t--small-rounded-padding: 4px 4px;\n\n\t\t\t\t\t--normal-border-radius: 4px;\n\t\t\t\t\t--rounded-border-radius: 9999px;\n\n\t\t\t\t\tborder: 1px solid var(--border);\n\t\t\t\t\tpadding: var(--padding);\n\t\t\t\t\tfont-size: var(--font-size);\n\t\t\t\t\tbackground: var(--background);\n\n\t\t\t\t\tcolor: var(--text-color);\n\t\t\t\t\tborder-radius: var(--border-radius);\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t}\n\n\t\t\t\tbutton:hover {\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t}\n\n\t\t\t\t::slotted(astro-dev-toolbar-icon) {\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t\theight: 1em;\n\t\t\t\t\twidth: 1em;\n\t\t\t\t\tmargin-left: 0.5em;\n\t\t\t\t}\n\t\t\t</style>\n\t\t\t<style id=\"selected-style\"></style>\n\n\t\t\t<button>\n\t\t\t\t<slot></slot>\n\t\t\t</button>\n\t\t`;\n }\n connectedCallback() {\n this.updateStyle();\n }\n updateStyle() {\n const style = this.shadowRoot.querySelector(\"#selected-style\");\n if (style) {\n style.innerHTML = `\n\t\t\tbutton {\n\t\t\t\t--background: var(--${this.buttonStyle}-background);\n\t\t\t\t--border: var(--${this.buttonStyle}-border);\n\t\t\t\t--font-size: var(--${this.size}-font-size);\n\t\t\t\t--text-color: var(--${this.buttonStyle}-text);\n\t\t\t\t${this.buttonBorderRadius === \"normal\" ? \"--padding: var(--\" + this.size + \"-padding);\" : \"--padding: var(--\" + this.size + \"-rounded-padding);\"}\n\t\t\t\t--border-radius: var(--${this.buttonBorderRadius}-border-radius);\n\t\t\t}`;\n }\n }\n attributeChangedCallback() {\n if (this.hasAttribute(\"size\")) this.size = this.getAttribute(\"size\");\n if (this.hasAttribute(\"button-style\"))\n this.buttonStyle = this.getAttribute(\"button-style\");\n }\n}\nexport {\n DevToolbarButton\n};\n", "import { settings } from \"../settings.js\";\nconst styles = [\"purple\", \"gray\", \"red\", \"green\", \"yellow\", \"blue\"];\nclass DevToolbarCard extends HTMLElement {\n link;\n clickAction;\n shadowRoot;\n _cardStyle = \"purple\";\n get cardStyle() {\n return this._cardStyle;\n }\n set cardStyle(value) {\n if (!styles.includes(value)) {\n settings.logger.error(\n `Invalid style: ${value}, expected one of ${styles.join(\", \")}, got ${value}.`\n );\n return;\n }\n this._cardStyle = value;\n this.updateStyle();\n }\n static observedAttributes = [\"card-style\"];\n constructor() {\n super();\n this.shadowRoot = this.attachShadow({ mode: \"open\" });\n this.link = this.getAttribute(\"link\");\n }\n attributeChangedCallback() {\n if (this.hasAttribute(\"card-style\"))\n this.cardStyle = this.getAttribute(\"card-style\");\n this.updateStyle();\n }\n updateStyle() {\n const style = this.shadowRoot.querySelector(\"#selected-style\");\n if (style) {\n style.innerHTML = `\n\t\t\t\t:host {\n\t\t\t\t\t--hover-background: var(--${this.cardStyle}-hover-background);\n\t\t\t\t\t--hover-border: var(--${this.cardStyle}-hover-border);\n\t\t\t\t}\n\t\t\t`;\n }\n }\n connectedCallback() {\n const element = this.link ? \"a\" : this.clickAction ? \"button\" : \"div\";\n this.shadowRoot.innerHTML += `\n\t\t\t<style>\n\t\t\t\t:host {\n\t\t\t\t\t--purple-hover-background: rgba(136, 58, 234, 0.33);\n\t\t\t\t\t--purple-hover-border: 1px solid rgba(113, 24, 226, 1);\n\n\t\t\t\t\t--gray-hover-background: rgba(191, 193, 201, 0.33);\n\t\t\t\t\t--gray-hover-border: 1px solid rgba(191, 193, 201, 1);\n\n\t\t\t\t\t--red-hover-background: rgba(249, 196, 215, 0.33);\n\t\t\t\t\t--red-hover-border: 1px solid rgba(179, 62, 102, 1);\n\n\t\t\t\t\t--green-hover-background: rgba(213, 249, 196, 0.33);\n\t\t\t\t\t--green-hover-border: 1px solid rgba(61, 125, 31, 1);\n\n\t\t\t\t\t--yellow-hover-background: rgba(255, 236, 179, 0.33);\n\t\t\t\t\t--yellow-hover-border: 1px solid rgba(255, 191, 0, 1);\n\n\t\t\t\t\t--blue-hover-background: rgba(189, 195, 255, 0.33);\n\t\t\t\t\t--blue-hover-border: 1px solid rgba(54, 69, 217, 1);\n\t\t\t\t}\n\n\t\t\t\t:host>a, :host>button, :host>div {\n\t\t\t\t\tbox-sizing: border-box;\n\t\t\t\t\tpadding: 16px;\n\t\t\t\t\tdisplay: block;\n\t\t\t\t\tborder-radius: 8px;\n\t\t\t\t\tborder: 1px solid rgba(35, 38, 45, 1);\n\t\t\t\t\tcolor: rgba(191, 193, 201, 1);\n\t\t\t\t\ttext-decoration: none;\n\t\t\t\t\tbackground-color: #13151A;\n\t\t\t\t\tbox-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.10), 0px 1px 2px 0px rgba(0, 0, 0, 0.10), 0px 4px 4px 0px rgba(0, 0, 0, 0.09), 0px 10px 6px 0px rgba(0, 0, 0, 0.05), 0px 17px 7px 0px rgba(0, 0, 0, 0.01), 0px 26px 7px 0px rgba(0, 0, 0, 0.00);\n\t\t\t\t\twidth: 100%;\n \t\t\theight: 100%;\n\t\t\t\t}\n\n\t\t\t\th1, h2, h3, h4, h5, h6 {\n\t\t\t\t\tcolor: #fff;\n\t\t\t\t\tfont-weight: 600;\n\t\t\t\t}\n\n\t\t\t\ta:hover, button:hover {\n\t\t\t\t\tbackground: var(--hover-background);\n\t\t\t\t\tborder: var(--hover-border);\n\t\t\t\t}\n\n\t\t\t\tsvg {\n\t\t\t\t\tdisplay: block;\n\t\t\t\t\tmargin: 0 auto;\n\t\t\t\t}\n\n\t\t\t\tspan {\n\t\t\t\t\tmargin-top: 8px;\n\t\t\t\t\tdisplay: block;\n\t\t\t\t\ttext-align: center;\n\t\t\t\t}\n\t\t\t</style>\n\t\t\t<style id=\"selected-style\"></style>\n\n\t\t\t<${element}${this.link ? ` href=\"${this.link}\" target=\"_blank\"` : ``} id=\"astro-overlay-card\">\n\t\t\t\t<slot />\n\t\t\t</${element}>\n\t\t`;\n this.updateStyle();\n if (this.clickAction) {\n this.shadowRoot.getElementById(\"astro-overlay-card\")?.addEventListener(\"click\", this.clickAction);\n }\n }\n}\nexport {\n DevToolbarCard\n};\n", "import { settings } from \"../settings.js\";\nimport { getIconElement, isDefinedIcon } from \"./icons.js\";\nconst styles = [\"purple\", \"gray\", \"red\", \"green\", \"yellow\", \"blue\"];\nclass DevToolbarHighlight extends HTMLElement {\n icon;\n _highlightStyle = \"purple\";\n get highlightStyle() {\n return this._highlightStyle;\n }\n set highlightStyle(value) {\n if (!styles.includes(value)) {\n settings.logger.error(\n `Invalid style: ${value}, expected one of ${styles.join(\", \")}, got ${value}.`\n );\n return;\n }\n this._highlightStyle = value;\n this.updateStyle();\n }\n static observedAttributes = [\"highlight-style\"];\n shadowRoot;\n constructor() {\n super();\n this.shadowRoot = this.attachShadow({ mode: \"open\" });\n this.icon = this.hasAttribute(\"icon\") ? this.getAttribute(\"icon\") : void 0;\n this.shadowRoot.innerHTML = `\n\t\t\t<style>\n\t\t\t\t:host {\n\t\t\t\t\t--purple-background: linear-gradient(180deg, rgba(224, 204, 250, 0.33) 0%, rgba(224, 204, 250, 0.0825) 100%);\n\t\t\t\t\t--purple-border: 1px solid rgba(113, 24, 226, 1);\n\n\t\t\t\t\t--gray-background: linear-gradient(180deg, rgba(191, 193, 201, 0.33) 0%, rgba(191, 193, 201, 0.0825) 100%);\n\t\t\t\t\t--gray-border: 1px solid rgba(191, 193, 201, 1);\n\n\t\t\t\t\t--red-background: linear-gradient(180deg, rgba(249, 196, 215, 0.33) 0%, rgba(249, 196, 215, 0.0825) 100%);\n\t\t\t\t\t--red-border: 1px solid rgba(179, 62, 102, 1);\n\n\t\t\t\t\t--green-background: linear-gradient(180deg, rgba(213, 249, 196, 0.33) 0%, rgba(213, 249, 196, 0.0825) 100%);\n\t\t\t\t\t--green-border: 1px solid rgba(61, 125, 31, 1);\n\n\t\t\t\t\t--yellow-background: linear-gradient(180deg, rgba(255, 236, 179, 0.33) 0%, rgba(255, 236, 179, 0.0825) 100%);\n\t\t\t\t\t--yellow-border: 1px solid rgba(181, 138, 45, 1);\n\n\t\t\t\t\t--blue-background: linear-gradient(180deg, rgba(189, 195, 255, 0.33) 0%, rgba(189, 195, 255, 0.0825) 100%);\n\t\t\t\t\t--blue-border: 1px solid rgba(54, 69, 217, 1);\n\n\t\t\t\t\tborder-radius: 4px;\n\t\t\t\t\tdisplay: block;\n\t\t\t\t\twidth: 100%;\n\t\t\t\t\theight: 100%;\n\t\t\t\t\tposition: absolute;\n\t\t\t\t\tz-index: 2000000000;\n\n\t\t\t\t\tbackground: var(--background);\n\t\t\t\t\tborder: var(--border);\n\t\t\t\t}\n\n\t\t\t\t.icon {\n\t\t\t\t\twidth: 24px;\n\t\t\t\t\theight: 24px;\n\t\t\t\t\tcolor: white;\n\t\t\t\t\tbackground: linear-gradient(0deg, #B33E66, #B33E66), linear-gradient(0deg, #351722, #351722);\n\t\t\t\t\tborder: 1px solid rgba(53, 23, 34, 1);\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\tposition: absolute;\n\t\t\t\t\ttop: -15px;\n\t\t\t\t\tright: -15px;\n\t\t\t\t}\n\t\t\t</style>\n\t\t\t<style id=\"selected-style\"></style>\n\t\t`;\n }\n updateStyle() {\n const style = this.shadowRoot.querySelector(\"#selected-style\");\n if (style) {\n style.innerHTML = `\n\t\t\t:host {\n\t\t\t\t--background: var(--${this.highlightStyle}-background);\n\t\t\t\t--border: var(--${this.highlightStyle}-border);\n\t\t\t}`;\n }\n }\n attributeChangedCallback() {\n if (this.hasAttribute(\"highlight-style\"))\n this.highlightStyle = this.getAttribute(\"highlight-style\");\n }\n connectedCallback() {\n this.updateStyle();\n if (this.icon) {\n let iconContainer = document.createElement(\"div\");\n iconContainer.classList.add(\"icon\");\n let iconElement;\n if (isDefinedIcon(this.icon)) {\n iconElement = getIconElement(this.icon);\n } else {\n iconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n iconElement.setAttribute(\"viewBox\", \"0 0 16 16\");\n iconElement.innerHTML = this.icon;\n }\n if (iconElement) {\n iconElement?.style.setProperty(\"width\", \"16px\");\n iconElement?.style.setProperty(\"height\", \"16px\");\n iconContainer.append(iconElement);\n this.shadowRoot.append(iconContainer);\n }\n }\n }\n}\nexport {\n DevToolbarHighlight\n};\n", "import { getIconElement, isDefinedIcon } from \"./icons.js\";\nclass DevToolbarIcon extends HTMLElement {\n _icon = void 0;\n shadowRoot;\n get icon() {\n return this._icon;\n }\n set icon(name) {\n this._icon = name;\n this.buildTemplate();\n }\n constructor() {\n super();\n this.shadowRoot = this.attachShadow({ mode: \"open\" });\n if (this.hasAttribute(\"icon\")) {\n this.icon = this.getAttribute(\"icon\");\n } else {\n this.buildTemplate();\n }\n }\n getIconHTML(icon) {\n if (icon && isDefinedIcon(icon)) {\n return getIconElement(icon)?.outerHTML ?? \"\";\n }\n return \"<slot />\";\n }\n buildTemplate() {\n this.shadowRoot.innerHTML = `\n\t\t\t<style>\n\t\t\t\tsvg {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t\theight: 100%;\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${this.getIconHTML(this._icon)}`;\n }\n}\nexport {\n DevToolbarIcon\n};\n", "const styles = [\"purple\", \"gray\", \"red\", \"green\", \"yellow\", \"blue\"];\nclass DevToolbarRadioCheckbox extends HTMLElement {\n _radioStyle = \"purple\";\n input;\n shadowRoot;\n get radioStyle() {\n return this._radioStyle;\n }\n set radioStyle(value) {\n if (!styles.includes(value)) {\n console.error(`Invalid style: ${value}, expected one of ${styles.join(\", \")}.`);\n return;\n }\n this._radioStyle = value;\n this.updateStyle();\n }\n static observedAttributes = [\"radio-style\", \"checked\", \"disabled\", \"name\", \"value\"];\n constructor() {\n super();\n this.shadowRoot = this.attachShadow({ mode: \"open\" });\n this.shadowRoot.innerHTML = `\n\t\t<style>\n\t\t\t:host {\n\t\t\t\t--purple-unchecked: rgba(224, 204, 250, 0.33);\n\t\t\t\t--purple-checked: rgba(224, 204, 250, 1);\n\n\t\t\t\t--gray-unchecked: rgba(191, 193, 201, 0.33);\n\t\t\t\t--gray-checked: rgba(191, 193, 201, 1);\n\n\t\t\t\t--red-unchecked: rgba(249, 196, 215, 0.33);\n\t\t\t\t--red-checked: rgba(179, 62, 102, 1);\n\n\t\t\t\t--green-unchecked: rgba(213, 249, 196, 0.33);\n\t\t\t\t--green-checked: rgba(61, 125, 31, 1);\n\n\t\t\t\t--yellow-unchecked: rgba(255, 236, 179, 0.33);\n\t\t\t\t--yellow-checked: rgba(181, 138, 45, 1);\n\n\t\t\t\t--blue-unchecked: rgba(189, 195, 255, 0.33);\n\t\t\t\t--blue-checked: rgba(54, 69, 217, 1);\n\t\t\t}\n\n\t\t\tinput[type=\"radio\"] {\n\t\t\t\tappearance: none;\n\t\t\t\t-webkit-appearance: none;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-content: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tborder: 2px solid var(--unchecked-color);\n\t\t\t\tborder-radius: 9999px;\n\t\t\t\twidth: 16px;\n\t\t\t\theight: 16px;\n\t\t\t}\n\n\t\t\tinput[type=\"radio\"]::before {\n\t\t\t\tcontent: \"\";\n\t\t\t\tbackground-color: var(--checked-color);\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 8px;\n\t\t\t\tborder-radius: 9999px;\n\t\t\t\tvisibility: hidden;\n\t\t\t\tmargin: 2px;\n\t\t\t}\n\n\t\t\tinput[type=\"radio\"]:checked {\n\t\t\t\tborder-color: var(--checked-color);\n\t\t\t}\n\n\t\t\tinput[type=\"radio\"]:checked::before {\n\t\t\t\tvisibility: visible;\n\t\t\t}\n\t\t</style>\n\t\t<style id=\"selected-style\"></style>\n\t\t`;\n this.input = document.createElement(\"input\");\n this.input.type = \"radio\";\n this.shadowRoot.append(this.input);\n }\n connectedCallback() {\n this.updateInputState();\n this.updateStyle();\n }\n updateStyle() {\n const styleElement = this.shadowRoot.querySelector(\"#selected-style\");\n if (styleElement) {\n styleElement.innerHTML = `\n\t\t\t\t:host {\n\t\t\t\t\t--unchecked-color: var(--${this._radioStyle}-unchecked);\n\t\t\t\t\t--checked-color: var(--${this._radioStyle}-checked);\n\t\t\t\t}\n\t\t\t`;\n }\n }\n updateInputState() {\n this.input.checked = this.hasAttribute(\"checked\");\n this.input.disabled = this.hasAttribute(\"disabled\");\n this.input.name = this.getAttribute(\"name\") || \"\";\n this.input.value = this.getAttribute(\"value\") || \"\";\n }\n attributeChangedCallback() {\n if (this.hasAttribute(\"radio-style\")) {\n this.radioStyle = this.getAttribute(\"radio-style\");\n }\n this.updateInputState();\n }\n}\nexport {\n DevToolbarRadioCheckbox\n};\n", "import { settings } from \"../settings.js\";\nconst styles = [\"purple\", \"gray\", \"red\", \"green\", \"yellow\", \"blue\"];\nclass DevToolbarSelect extends HTMLElement {\n shadowRoot;\n element;\n _selectStyle = \"gray\";\n get selectStyle() {\n return this._selectStyle;\n }\n set selectStyle(value) {\n if (!styles.includes(value)) {\n settings.logger.error(`Invalid style: ${value}, expected one of ${styles.join(\", \")}.`);\n return;\n }\n this._selectStyle = value;\n this.updateStyle();\n }\n static observedAttributes = [\"select-style\"];\n constructor() {\n super();\n this.shadowRoot = this.attachShadow({ mode: \"open\" });\n this.shadowRoot.innerHTML = `\n <style>\n :host {\n --purple-text: rgba(224, 204, 250, 1);\n\t\t\t\t\t--purple-border: rgba(113, 24, 226, 1);\n\n --gray-text: rgba(191, 193, 201, 1);\n\t\t\t\t\t--gray-border:rgba(191, 193, 201, 1);\n\n\t\t\t\t\t--red-text: rgba(249, 196, 215, 1);\n\t\t\t\t\t--red-border: rgba(179, 62, 102, 1);\n\n\t\t\t\t\t--green-text: rgba(213, 249, 196, 1);\n\t\t\t\t\t--green-border: rgba(61, 125, 31, 1);\n\n\t\t\t\t\t--yellow-text: rgba(249, 233, 196, 1);\n\t\t\t\t\t--yellow-border: rgba(181, 138, 45, 1);\n\n\t\t\t\t\t--blue-text: rgba(189, 195, 255, 1);\n\t\t\t\t\t--blue-border: rgba(54, 69, 217, 1);\n\n --text-color: var(--gray-text);\n --border-color: var(--gray-border);\n }\n select {\n appearance: none;\n text-align-last: center;\n display: inline-block;\n font-family: system-ui, sans-serif;\n font-size: 14px;\n padding: 4px 24px 4px 8px;\n border: 1px solid var(--border-color);\n border-radius: 4px;\n color: var(--text-color);\n background-color: transparent;\n background-image:\n linear-gradient(45deg, transparent 50%, var(--text-color) 50%),\n linear-gradient(135deg, var(--text-color) 50%, transparent 50%);\n background-position:\n calc(100% - 12px) calc(1em - 2px),\n calc(100% - 8px) calc(1em - 2px);\n background-size: 4px 4px;\n background-repeat: no-repeat;\n }\n </style>\n <style id=\"selected-style\"></style>\n <slot></slot>\n `;\n this.element = document.createElement(\"select\");\n this.shadowRoot.addEventListener(\"slotchange\", (event) => {\n if (event.target instanceof HTMLSlotElement) {\n this.element.append(...event.target.assignedNodes());\n }\n });\n }\n connectedCallback() {\n this.element.name = \"dev-toolbar-select\";\n this.shadowRoot.append(this.element);\n this.updateStyle();\n }\n attributeChangedCallback() {\n if (this.hasAttribute(\"select-style\")) {\n this.selectStyle = this.getAttribute(\"select-style\");\n }\n }\n updateStyle() {\n const style = this.shadowRoot.querySelector(\"#selected-style\");\n if (style) {\n style.innerHTML = `\n :host {\n --text-color: var(--${this.selectStyle}-text);\n --border-color: var(--${this.selectStyle}-border);\n }\n `;\n }\n }\n}\nexport {\n DevToolbarSelect\n};\n", "import { settings } from \"../settings.js\";\nconst styles = [\"purple\", \"gray\", \"red\", \"green\", \"yellow\", \"blue\"];\nclass DevToolbarToggle extends HTMLElement {\n shadowRoot;\n input;\n _toggleStyle = \"gray\";\n get toggleStyle() {\n return this._toggleStyle;\n }\n set toggleStyle(value) {\n if (!styles.includes(value)) {\n settings.logger.error(`Invalid style: ${value}, expected one of ${styles.join(\", \")}.`);\n return;\n }\n this._toggleStyle = value;\n this.updateStyle();\n }\n static observedAttributes = [\"toggle-style\"];\n constructor() {\n super();\n this.shadowRoot = this.attachShadow({ mode: \"open\" });\n this.shadowRoot.innerHTML = `\n\t\t<style>\n\t\t\t:host {\n\t\t\t\t--purple-bg-on: rgba(113, 24, 226, 1);\n\t\t\t\t--purple-border-off: rgba(113, 24, 226, 1);\n\t\t\t\t--purple-border-on: rgba(224, 204, 250, 1);\n\n\t\t\t\t--gray-bg-on: rgba(61, 125, 31, 1);\n\t\t\t\t--gray-border-off: rgba(145, 152, 173, 1);\n\t\t\t\t--gray-border-on: rgba(213, 249, 196, 1);\n\n\t\t\t\t--red-bg-on: rgba(179, 62, 102, 1);\n\t\t\t\t--red-border-off: rgba(179, 62, 102, 1);\n\t\t\t\t--red-border-on: rgba(249, 196, 215, 1);\n\n\t\t\t\t--green-bg-on: rgba(61, 125, 31, 1);\n\t\t\t\t--green-border-off: rgba(61, 125, 31, 1);\n\t\t\t\t--green-border-on: rgba(213, 249, 196, 1);\n\n\t\t\t\t--yellow-bg-on: rgba(181, 138, 45, 1);\n\t\t\t\t--yellow-border-off: rgba(181, 138, 45, 1);\n\t\t\t\t--yellow-border-on: rgba(255, 236, 179, 1);\n\n\t\t\t\t--blue-bg-on: rgba(54, 69, 217, 1);\n\t\t\t\t--blue-border-off: rgba(54, 69, 217, 1);\n\t\t\t\t--blue-border-on: rgba(189, 195, 255, 1);\n\t\t\t}\n\n\t\t\tinput {\n\t\t\t\tappearance: none;\n\t\t\t\twidth: 32px;\n\t\t\t\theight: 20px;\n\t\t\t\tborder: 1px solid var(--border-off);\n\t\t\t\ttransition: background-color 0.2s ease, border-color 0.2s ease;\n\t\t\t\tborder-radius: 9999px;\n\t\t\t}\n\n\t\t\tinput::after {\n\t\t\t\tcontent: '';\n\t\t\t\twidth: 16px;\n\t\t\t\tdisplay: inline-block;\n\t\t\t\theight: 16px;\n\t\t\t\tbackground-color: var(--border-off);\n\t\t\t\tborder-radius: 9999px;\n\t\t\t\ttransition: transform 0.2s ease, background-color 0.2s ease;\n\t\t\t\ttop: 1px;\n\t\t\t\tleft: 1px;\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\t@media (forced-colors: active) {\n\t\t\t\tinput::after {\n\t\t\t\t\tborder: 1px solid black;\n\t\t\t\t\ttop: 0px;\n\t\t\t\t\tleft: 0px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tinput:checked {\n\t\t\t\tborder: 1px solid var(--border-on);\n\t\t\t\tbackground-color: var(--bg-on);\n\t\t\t}\n\n\t\t\tinput:checked::after {\n\t\t\t\ttransform: translateX(12px);\n\t\t\t\tbackground: var(--border-on);\n\t\t\t}\n\t\t</style>\n\t\t<style id=\"selected-style\"></style>\n\t\t`;\n this.input = document.createElement(\"input\");\n }\n attributeChangedCallback() {\n if (this.hasAttribute(\"toggle-style\"))\n this.toggleStyle = this.getAttribute(\"toggle-style\");\n }\n updateStyle() {\n const style = this.shadowRoot.querySelector(\"#selected-style\");\n if (style) {\n style.innerHTML = `\n\t\t\t:host {\n\t\t\t\t--bg-on: var(--${this.toggleStyle}-bg-on);\n\t\t\t\t--border-off: var(--${this.toggleStyle}-border-off);\n\t\t\t\t--border-on: var(--${this.toggleStyle}-border-on);\n\t\t\t}\n\t\t`;\n }\n }\n connectedCallback() {\n this.input.type = \"checkbox\";\n this.input.name = \"dev-toolbar-toggle\";\n this.shadowRoot.append(this.input);\n this.updateStyle();\n }\n get value() {\n return this.input.value;\n }\n set value(val) {\n this.input.value = val;\n }\n}\nexport {\n DevToolbarToggle\n};\n", "import { getIconElement, isDefinedIcon } from \"./icons.js\";\nclass DevToolbarTooltip extends HTMLElement {\n sections = [];\n shadowRoot;\n constructor() {\n super();\n this.shadowRoot = this.attachShadow({ mode: \"open\" });\n }\n connectedCallback() {\n this.shadowRoot.innerHTML = `\n\t\t\t<style>\n\t\t\t:host {\n\t\t\t\tposition: absolute;\n\t\t\t\tdisplay: none;\n\t\t\t\tcolor: white;\n\t\t\t\tbackground: linear-gradient(0deg, #310A65, #310A65), linear-gradient(0deg, #7118E2, #7118E2);\n\t\t\t\tborder: 1px solid rgba(113, 24, 226, 1);\n\t\t\t\tborder-radius: 4px;\n\t\t\t\tpadding: 0;\n\t\t\t\tfont-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n\t\t\t\tfont-size: 14px;\n\t\t\t\tmargin: 0;\n\t\t\t\tz-index: 2000000001;\n\t\t\t\tmax-width: 45ch;\n\t\t\t\twidth: fit-content;\n\t\t\t\tmin-width: 30ch;\n\t\t\t\tbox-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.30), 0px 1px 2px 0px rgba(0, 0, 0, 0.29), 0px 4px 4px 0px rgba(0, 0, 0, 0.26), 0px 10px 6px 0px rgba(0, 0, 0, 0.15), 0px 17px 7px 0px rgba(0, 0, 0, 0.04), 0px 26px 7px 0px rgba(0, 0, 0, 0.01);\n\t\t\t}\n\n\t\t\t:host([data-show=\"true\"]) {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\tsvg {\n\t\t\t\tvertical-align: bottom;\n\t\t\t\tmargin-inline-end: 4px;\n\t\t\t}\n\n\t\t\thr {\n\t\t\t\tborder: 1px solid rgba(136, 58, 234, 0.33);\n\t\t\t\tpadding: 0;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\tsection {\n\t\t\t\tpadding: 8px;\n\t\t\t}\n\n\t\t\t.section-content {\n\t\t\t\tmax-height: 250px;\n \t\toverflow-y: auto;\n\t\t\t}\n\n\t\t\t.modal-title {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.modal-main-title {\n\t\t\t\tfont-weight: bold;\n\t\t\t}\n\n\t\t\t.modal-title + div {\n\t\t\t\tmargin-top: 8px;\n\t\t\t}\n\n\t\t\t.modal-cta {\n\t\t\t\tdisplay: block;\n\t\t\t\tfont-weight: bold;\n\t\t\t\tfont-size: 0.9em;\n\t\t\t}\n\n\t\t\t.clickable-section {\n\t\t\t\tbackground: rgba(113, 24, 226, 1);\n\t\t\t\tpadding: 8px;\n\t\t\t\tborder: 0;\n\t\t\t\tcolor: white;\n\t\t\t\tfont-family: system-ui, sans-serif;\n\t\t\t\ttext-align: left;\n\t\t\t\tline-height: 1.2;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\ttext-decoration: none;\n\t\t\t\tmargin: 0;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.clickable-section:hover {\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\n\t\t\tpre, code {\n\t\t\t\tbackground: rgb(78, 27, 145);\n\t\t\t\tfont-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n\t\t\t\tborder-radius: 2px;\n\t\t\t\tfont-size: 14px;\n\t\t\t\tpadding: 2px;\n\t\t\t}\n\t\t\tpre {\n\t\t\t\tpadding: 1em;\n\t\t\t\tmargin: 0 0;\n\t\t\t\toverflow: auto;\n\t\t\t}\n\t\t\t`;\n const fragment = new DocumentFragment();\n this.sections.forEach((section, index) => {\n const sectionElement = section.clickAction ? document.createElement(\"button\") : document.createElement(\"section\");\n if (section.clickAction) {\n sectionElement.classList.add(\"clickable-section\");\n sectionElement.addEventListener(\"click\", async () => {\n await section.clickAction();\n });\n }\n sectionElement.innerHTML = `\n\t\t\t\t${section.title ? `<div class=\"modal-title\"><span class=\"modal-main-title\">\n\t\t\t\t\t\t${section.icon ? this.getElementForIcon(section.icon) : \"\"}${section.title}</span>${section.inlineTitle ?? \"\"}</div>` : \"\"}\n\t\t\t\t${section.content ? `<div class=\"section-content\">${section.content}</div>` : \"\"}\n\t\t\t\t${section.clickDescription ? `<span class=\"modal-cta\">${section.clickDescription}</span>` : \"\"}\n\t\t\t`;\n fragment.append(sectionElement);\n if (index < this.sections.length - 1) {\n fragment.append(document.createElement(\"hr\"));\n }\n });\n this.shadowRoot.append(fragment);\n }\n getElementForIcon(icon) {\n let iconElement;\n if (isDefinedIcon(icon)) {\n iconElement = getIconElement(icon);\n } else {\n iconElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n iconElement.setAttribute(\"viewBox\", \"0 0 16 16\");\n iconElement.innerHTML = icon;\n }\n iconElement?.style.setProperty(\"width\", \"16px\");\n iconElement?.style.setProperty(\"height\", \"16px\");\n return iconElement?.outerHTML ?? \"\";\n }\n}\nexport {\n DevToolbarTooltip\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["sizes", "styles", "styles", "styles", "styles", "styles", "styles"]
7
+ }
@@ -0,0 +1,147 @@
1
+ import {
2
+ attachTooltipToHighlight,
3
+ createHighlight,
4
+ getElementsPositionInDocument,
5
+ positionHighlight
6
+ } from "./chunk-HBSVDAQD.js";
7
+ import {
8
+ escape
9
+ } from "./chunk-FHJ3XBDE.js";
10
+ import {
11
+ closeOnOutsideClick,
12
+ createWindowElement,
13
+ synchronizePlacementOnUpdate
14
+ } from "./chunk-XEBKRCNE.js";
15
+ import "./chunk-7P4KIK53.js";
16
+ import "./chunk-5WRI5ZAA.js";
17
+
18
+ // ../../../../node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/dist/runtime/client/dev-toolbar/apps/xray.js
19
+ var icon = '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" aria-hidden="true"><path fill="#fff" d="M7.9 1.5v-.4a1.1 1.1 0 0 1 2.2 0v.4a1.1 1.1 0 1 1-2.2 0Zm-6.4 8.6a1.1 1.1 0 1 0 0-2.2h-.4a1.1 1.1 0 0 0 0 2.2h.4ZM12 3.7a1.1 1.1 0 0 0 1.4-.7l.4-1.1a1.1 1.1 0 0 0-2.1-.8l-.4 1.2a1.1 1.1 0 0 0 .7 1.4Zm-9.7 7.6-1.2.4a1.1 1.1 0 1 0 .8 2.1l1-.4a1.1 1.1 0 1 0-.6-2ZM20.8 17a1.9 1.9 0 0 1 0 2.6l-1.2 1.2a1.9 1.9 0 0 1-2.6 0l-4.3-4.2-1.6 3.6a1.9 1.9 0 0 1-1.7 1.2A1.9 1.9 0 0 1 7.5 20L2.7 5a1.9 1.9 0 0 1 2.4-2.4l15 5a1.9 1.9 0 0 1 .2 3.4l-3.7 1.6 4.2 4.3ZM19 18.3 14.6 14a1.9 1.9 0 0 1 .6-3l3.2-1.5L5.1 5.1l4.3 13.3 1.5-3.2a1.9 1.9 0 0 1 3-.6l4.4 4.4.7-.7Z"/></svg>';
20
+ var xray_default = {
21
+ id: "astro:xray",
22
+ name: "Inspect",
23
+ icon,
24
+ init(canvas, eventTarget) {
25
+ let islandsOverlays = [];
26
+ addIslandsOverlay();
27
+ document.addEventListener("astro:after-swap", addIslandsOverlay);
28
+ document.addEventListener("astro:page-load", refreshIslandsOverlayPositions);
29
+ closeOnOutsideClick(eventTarget);
30
+ synchronizePlacementOnUpdate(eventTarget, canvas);
31
+ function addIslandsOverlay() {
32
+ islandsOverlays.forEach(({ highlightElement }) => {
33
+ highlightElement.remove();
34
+ });
35
+ islandsOverlays = [];
36
+ const islands = document.querySelectorAll("astro-island");
37
+ if (islands.length === 0) {
38
+ const window2 = createWindowElement(
39
+ `<style>
40
+ header {
41
+ display: flex;
42
+ }
43
+
44
+ h1 {
45
+ display: flex;
46
+ align-items: center;
47
+ gap: 8px;
48
+ font-weight: 600;
49
+ color: #fff;
50
+ margin: 0;
51
+ font-size: 22px;
52
+ }
53
+
54
+ astro-dev-toolbar-icon {
55
+ width: 1em;
56
+ height: 1em;
57
+ padding: 8px;
58
+ display: block;
59
+ background: #5f9ea0;
60
+ border-radius: 9999px;
61
+ }
62
+ </style>
63
+ <header>
64
+ <h1><astro-dev-toolbar-icon icon="lightbulb"></astro-dev-toolbar-icon>No islands detected.</h1>
65
+ </header>
66
+ <p>
67
+ It looks like there are no interactive component islands on this page. Did you forget to add a client directive to your interactive UI component?
68
+ </p>
69
+ `
70
+ );
71
+ canvas.append(window2);
72
+ return;
73
+ }
74
+ islands.forEach((island) => {
75
+ const computedStyle = window.getComputedStyle(island);
76
+ const islandElement = island.children[0] || island;
77
+ if (islandElement.offsetParent === null || computedStyle.display === "none") {
78
+ return;
79
+ }
80
+ const rect = islandElement.getBoundingClientRect();
81
+ const highlight = createHighlight(rect);
82
+ const tooltip = buildIslandTooltip(island);
83
+ const { isFixed } = getElementsPositionInDocument(islandElement);
84
+ if (isFixed) {
85
+ tooltip.style.position = highlight.style.position = "fixed";
86
+ }
87
+ attachTooltipToHighlight(highlight, tooltip, islandElement);
88
+ canvas.append(highlight);
89
+ islandsOverlays.push({ highlightElement: highlight, island: islandElement });
90
+ });
91
+ ["scroll", "resize"].forEach((event) => {
92
+ window.addEventListener(event, refreshIslandsOverlayPositions);
93
+ });
94
+ }
95
+ function refreshIslandsOverlayPositions() {
96
+ islandsOverlays.forEach(({ highlightElement, island: islandElement }) => {
97
+ const rect = islandElement.getBoundingClientRect();
98
+ positionHighlight(highlightElement, rect);
99
+ });
100
+ }
101
+ function buildIslandTooltip(island) {
102
+ const tooltip = document.createElement("astro-dev-toolbar-tooltip");
103
+ tooltip.sections = [];
104
+ const islandProps = island.getAttribute("props") ? JSON.parse(island.getAttribute("props")) : {};
105
+ const islandClientDirective = island.getAttribute("client");
106
+ if (islandClientDirective) {
107
+ tooltip.sections.push({
108
+ title: "Client directive",
109
+ inlineTitle: `<code>client:${islandClientDirective}</code>`
110
+ });
111
+ }
112
+ const islandPropsEntries = Object.entries(islandProps).filter(
113
+ (prop) => !prop[0].startsWith("data-astro-cid-")
114
+ );
115
+ if (islandPropsEntries.length > 0) {
116
+ const stringifiedProps = JSON.stringify(
117
+ Object.fromEntries(islandPropsEntries.map((prop) => [prop[0], prop[1][1]])),
118
+ void 0,
119
+ 2
120
+ );
121
+ tooltip.sections.push({
122
+ title: "Props",
123
+ content: `<pre><code>${escape(stringifiedProps)}</code></pre>`
124
+ });
125
+ }
126
+ const islandComponentPath = island.getAttribute("component-url");
127
+ if (islandComponentPath) {
128
+ tooltip.sections.push({
129
+ content: islandComponentPath,
130
+ clickDescription: "Click to go to file",
131
+ async clickAction() {
132
+ await fetch(
133
+ "/__open-in-editor?file=" + encodeURIComponent(
134
+ window.__astro_dev_toolbar__.root + islandComponentPath.slice(1)
135
+ )
136
+ );
137
+ }
138
+ });
139
+ }
140
+ return tooltip;
141
+ }
142
+ }
143
+ };
144
+ export {
145
+ xray_default as default
146
+ };
147
+ //# sourceMappingURL=xray-EFCQOW4E.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../node_modules/.pnpm/astro@6.4.5_@types+node@25.9.2_jiti@2.7.0_lightningcss@1.32.0_rollup@4.61.1_tsx@4.22.4_yaml@2.9.0/node_modules/astro/dist/runtime/client/dev-toolbar/apps/xray.js"],
4
+ "sourcesContent": ["import { escape as escapeHTML } from \"html-escaper\";\nimport {\n attachTooltipToHighlight,\n createHighlight,\n getElementsPositionInDocument,\n positionHighlight\n} from \"./utils/highlight.js\";\nimport {\n closeOnOutsideClick,\n createWindowElement,\n synchronizePlacementOnUpdate\n} from \"./utils/window.js\";\nconst icon = '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"#fff\" d=\"M7.9 1.5v-.4a1.1 1.1 0 0 1 2.2 0v.4a1.1 1.1 0 1 1-2.2 0Zm-6.4 8.6a1.1 1.1 0 1 0 0-2.2h-.4a1.1 1.1 0 0 0 0 2.2h.4ZM12 3.7a1.1 1.1 0 0 0 1.4-.7l.4-1.1a1.1 1.1 0 0 0-2.1-.8l-.4 1.2a1.1 1.1 0 0 0 .7 1.4Zm-9.7 7.6-1.2.4a1.1 1.1 0 1 0 .8 2.1l1-.4a1.1 1.1 0 1 0-.6-2ZM20.8 17a1.9 1.9 0 0 1 0 2.6l-1.2 1.2a1.9 1.9 0 0 1-2.6 0l-4.3-4.2-1.6 3.6a1.9 1.9 0 0 1-1.7 1.2A1.9 1.9 0 0 1 7.5 20L2.7 5a1.9 1.9 0 0 1 2.4-2.4l15 5a1.9 1.9 0 0 1 .2 3.4l-3.7 1.6 4.2 4.3ZM19 18.3 14.6 14a1.9 1.9 0 0 1 .6-3l3.2-1.5L5.1 5.1l4.3 13.3 1.5-3.2a1.9 1.9 0 0 1 3-.6l4.4 4.4.7-.7Z\"/></svg>';\nvar xray_default = {\n id: \"astro:xray\",\n name: \"Inspect\",\n icon,\n init(canvas, eventTarget) {\n let islandsOverlays = [];\n addIslandsOverlay();\n document.addEventListener(\"astro:after-swap\", addIslandsOverlay);\n document.addEventListener(\"astro:page-load\", refreshIslandsOverlayPositions);\n closeOnOutsideClick(eventTarget);\n synchronizePlacementOnUpdate(eventTarget, canvas);\n function addIslandsOverlay() {\n islandsOverlays.forEach(({ highlightElement }) => {\n highlightElement.remove();\n });\n islandsOverlays = [];\n const islands = document.querySelectorAll(\"astro-island\");\n if (islands.length === 0) {\n const window2 = createWindowElement(\n `<style>\n\t\t\t\t\t\theader {\n\t\t\t\t\t\t\tdisplay: flex;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\th1 {\n\t\t\t\t\t\t\tdisplay: flex;\n\t\t\t\t\t\t\talign-items: center;\n\t\t\t\t\t\t\tgap: 8px;\n\t\t\t\t\t\t\tfont-weight: 600;\n\t\t\t\t\t\t\tcolor: #fff;\n\t\t\t\t\t\t\tmargin: 0;\n\t\t\t\t\t\t\tfont-size: 22px;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tastro-dev-toolbar-icon {\n\t\t\t\t\t\t\twidth: 1em;\n\t\t\t\t\t\t height: 1em;\n\t\t\t\t\t\t padding: 8px;\n\t\t\t\t\t\t\tdisplay: block;\n\t\t\t\t\t\t\tbackground: #5f9ea0;\n\t\t\t\t\t\t\tborder-radius: 9999px;\n\t\t\t\t\t\t}\n\t\t\t\t\t</style>\n\t\t\t\t\t<header>\n\t\t\t\t\t\t<h1><astro-dev-toolbar-icon icon=\"lightbulb\"></astro-dev-toolbar-icon>No islands detected.</h1>\n\t\t\t\t\t</header>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tIt looks like there are no interactive component islands on this page. Did you forget to add a client directive to your interactive UI component?\n\t\t\t\t\t</p>\n\t\t\t\t\t`\n );\n canvas.append(window2);\n return;\n }\n islands.forEach((island) => {\n const computedStyle = window.getComputedStyle(island);\n const islandElement = island.children[0] || island;\n if (islandElement.offsetParent === null || computedStyle.display === \"none\") {\n return;\n }\n const rect = islandElement.getBoundingClientRect();\n const highlight = createHighlight(rect);\n const tooltip = buildIslandTooltip(island);\n const { isFixed } = getElementsPositionInDocument(islandElement);\n if (isFixed) {\n tooltip.style.position = highlight.style.position = \"fixed\";\n }\n attachTooltipToHighlight(highlight, tooltip, islandElement);\n canvas.append(highlight);\n islandsOverlays.push({ highlightElement: highlight, island: islandElement });\n });\n [\"scroll\", \"resize\"].forEach((event) => {\n window.addEventListener(event, refreshIslandsOverlayPositions);\n });\n }\n function refreshIslandsOverlayPositions() {\n islandsOverlays.forEach(({ highlightElement, island: islandElement }) => {\n const rect = islandElement.getBoundingClientRect();\n positionHighlight(highlightElement, rect);\n });\n }\n function buildIslandTooltip(island) {\n const tooltip = document.createElement(\"astro-dev-toolbar-tooltip\");\n tooltip.sections = [];\n const islandProps = island.getAttribute(\"props\") ? JSON.parse(island.getAttribute(\"props\")) : {};\n const islandClientDirective = island.getAttribute(\"client\");\n if (islandClientDirective) {\n tooltip.sections.push({\n title: \"Client directive\",\n inlineTitle: `<code>client:${islandClientDirective}</code>`\n });\n }\n const islandPropsEntries = Object.entries(islandProps).filter(\n (prop) => !prop[0].startsWith(\"data-astro-cid-\")\n );\n if (islandPropsEntries.length > 0) {\n const stringifiedProps = JSON.stringify(\n Object.fromEntries(islandPropsEntries.map((prop) => [prop[0], prop[1][1]])),\n void 0,\n 2\n );\n tooltip.sections.push({\n title: \"Props\",\n content: `<pre><code>${escapeHTML(stringifiedProps)}</code></pre>`\n });\n }\n const islandComponentPath = island.getAttribute(\"component-url\");\n if (islandComponentPath) {\n tooltip.sections.push({\n content: islandComponentPath,\n clickDescription: \"Click to go to file\",\n async clickAction() {\n await fetch(\n \"/__open-in-editor?file=\" + encodeURIComponent(\n window.__astro_dev_toolbar__.root + islandComponentPath.slice(1)\n )\n );\n }\n });\n }\n return tooltip;\n }\n }\n};\nexport {\n xray_default as default\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -11,16 +11,17 @@
11
11
  },
12
12
  "scripts": {
13
13
  "validate:data": "grove validate",
14
- "build:data": "grove build-data",
15
- "build:llms-full": "grove build-llms-full",
16
- "build": "pnpm run build:data && pnpm run build:llms-full && astro build",
14
+ "build:data": "grove generate",
15
+ "build:sitemap": "grove sitemap",
16
+ "build:llms": "grove llms",
17
+ "build": "pnpm run build:data && pnpm run build:sitemap && pnpm run build:llms && astro build",
17
18
  "dev": "pnpm run build:data && astro dev",
18
19
  "start": "astro dev",
19
20
  "preview": "astro preview",
20
21
  "astro": "astro",
21
22
  "check": "astro check",
22
- "refresh:activity": "grove analyze",
23
- "enrich:github": "grove enrich"
23
+ "sync:github": "grove sync github",
24
+ "cleanup": "grove cleanup stale"
24
25
  },
25
26
  "dependencies": {
26
27
  "@astrojs/check": "^0.9.9",
@@ -0,0 +1,14 @@
1
+ # Grove Directory — full directory
2
+
3
+ > Generated 2026-06-10T15:03:23.841Z from 0 records.
4
+ > Source: https://example.com/projects · Regenerate with `grove generate`.
5
+
6
+ Each section below mirrors one record detail page.
7
+
8
+ ## Index
9
+
10
+
11
+
12
+
13
+
14
+
@@ -0,0 +1,11 @@
1
+ # Grove Directory
2
+
3
+ A curated, health-aware developer directory powered by Grove.
4
+
5
+ Directory: https://example.com/projects
6
+ Records indexed: 0
7
+ Categories: 0
8
+
9
+ ## Usage
10
+
11
+ Use /llms-full.txt for record-level details. Prefer detail pages for citations.
@@ -1,32 +1,16 @@
1
1
  ---
2
- // SPDX-License-Identifier: MIT
3
-
4
- /**
5
- * BaseLayout — wraps every page. Owns the theme-detection inline script
6
- * and the global shell (Header, Footer). Per-page SEO (title, description,
7
- * OG, JSON-LD) is delegated to <Seo /> so each page can declare what it
8
- * needs without polluting the layout file.
9
- */
10
2
  import "../../styles/global.css";
11
3
  import Header from "./Header.astro";
12
4
  import Footer from "./Footer.astro";
13
- import Seo from "./Seo.astro";
14
5
 
15
6
  interface Props {
16
7
  title: string;
17
8
  description: string;
18
- type?: "website" | "article" | "profile";
19
9
  noindex?: boolean;
20
10
  jsonLd?: Record<string, unknown> | Record<string, unknown>[];
21
11
  }
22
12
 
23
- const {
24
- title,
25
- description,
26
- type,
27
- noindex,
28
- jsonLd,
29
- } = Astro.props;
13
+ const { title, description, noindex, jsonLd } = Astro.props;
30
14
 
31
15
  const favicon =
32
16
  "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='3' fill='%2318181b'/%3E%3C/svg%3E";
@@ -38,57 +22,26 @@ const favicon =
38
22
  <meta charset="UTF-8" />
39
23
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
40
24
  <meta name="generator" content={Astro.generator} />
25
+ <meta name="description" content={description} />
41
26
  <meta name="theme-color" content="#0a0a0c" media="(prefers-color-scheme: dark)" />
42
27
  <meta name="theme-color" content="#fafafa" media="(prefers-color-scheme: light)" />
43
28
  <link rel="icon" href={favicon} />
44
29
  <link rel="sitemap" href="/sitemap.xml" />
45
30
  <link rel="alternate" type="text/plain" href="/llms.txt" title="LLM usage guidance" />
46
-
47
- <Seo
48
- title={title}
49
- description={description}
50
- type={type}
51
- noindex={noindex}
52
- jsonLd={jsonLd}
53
- />
54
-
55
- <slot name="head" />
56
- <script is:inline>
57
- (function () {
58
- var STORAGE_KEY = "open-apps-theme";
59
- function getMode() {
60
- var stored = localStorage.getItem(STORAGE_KEY);
61
- if (stored === "light" || stored === "dark" || stored === "system") return stored;
62
- return "system";
63
- }
64
- function apply(mode) {
65
- var resolved =
66
- mode === "system"
67
- ? (window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light")
68
- : mode;
69
- var root = document.documentElement;
70
- if (resolved === "dark") root.classList.add("dark");
71
- else root.classList.remove("dark");
72
- root.dataset.theme = mode;
73
- root.dataset.resolvedTheme = resolved;
74
- }
75
- apply(getMode());
76
- window.addEventListener("theme:set", function (e) { apply(e.detail); });
77
- var mq = window.matchMedia("(prefers-color-scheme: dark)");
78
- mq.addEventListener("change", function () {
79
- if (getMode() === "system") apply("system");
80
- });
81
- })();
82
- </script>
31
+ {noindex && <meta name="robots" content="noindex,nofollow" />}
32
+ <title>{title}</title>
33
+ {jsonLd && (
34
+ <script
35
+ type="application/ld+json"
36
+ set:html={JSON.stringify(jsonLd)}
37
+ />
38
+ )}
83
39
  </head>
84
40
  <body class="min-h-screen bg-white text-ink-900 dark:bg-ink-950 dark:text-ink-100">
85
41
  <Header />
86
-
87
42
  <main>
88
43
  <slot />
89
44
  </main>
90
-
91
45
  <Footer />
92
- <slot name="body-end" />
93
46
  </body>
94
47
  </html>
@@ -1,145 +1,27 @@
1
1
  ---
2
- import { siteConfig } from "../../data/config";
3
- import { stats } from "../../data/stats";
2
+ import siteConfig from "../../data/generated/site-config.json";
4
3
 
5
- const githubUrl = stats.originalRepo;
6
4
  const year = new Date().getFullYear();
7
-
8
- // One-line positioning. Should be the same on every page so the
9
- // project's identity is consistent.
10
- const positioning =
11
- "A searchable directory of real open-source applications — organized by stack, category, platform, license, activity, and maturity.";
12
5
  ---
13
6
 
14
7
  <footer class="mt-16 border-t border-ink-200 bg-white text-ink-500 dark:border-ink-800 dark:bg-ink-950 dark:text-ink-400">
15
- <div
16
- class="mx-auto grid max-w-wide grid-cols-2 gap-8 px-5 py-12 md:grid-cols-4 sm:px-7"
17
- >
18
- <div class="col-span-2 md:col-span-1">
19
- <div
20
- class="mb-2 inline-flex items-center gap-2 text-[0.95rem] font-semibold text-ink-900 dark:text-ink-100"
21
- >
22
- <span
23
- aria-hidden="true"
24
- class="inline-block h-3.5 w-3.5 rounded bg-ink-900 dark:bg-ink-100"
25
- ></span>
26
- <span>{siteConfig.name}</span>
27
- </div>
28
- <p class="m-0 max-w-[36ch] text-[0.8125rem] leading-relaxed text-ink-500 dark:text-ink-400">
29
- {positioning}
8
+ <div class="mx-auto max-w-6xl px-5 py-8 sm:px-7">
9
+ <div class="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
10
+ <p class="m-0 text-sm">
11
+ © {year} {siteConfig.name}.
30
12
  </p>
31
- <p class="mt-3 m-0 text-2xs text-ink-500 dark:text-ink-400">
32
- <span class="font-mono">{stats.apps}</span> apps
33
- <span class="mx-1 text-ink-300 dark:text-ink-700">·</span>
34
- <span class="font-mono">{stats.categories}</span> categories
35
- <span class="mx-1 text-ink-300 dark:text-ink-700">·</span>
36
- <span class="font-mono">{stats.contributors}</span> contributors
13
+ <p class="m-0 text-2xs text-ink-500 dark:text-ink-400">
14
+ Built with{" "}
15
+ <a
16
+ href="https://github.com/tortuvshin/grove"
17
+ target="_blank"
18
+ rel="noopener noreferrer"
19
+ class="hover:text-ink-900 dark:hover:text-ink-100"
20
+ >
21
+ Grove
22
+ </a>
23
+ {" "}— an open-source framework for community knowledge sites.
37
24
  </p>
38
25
  </div>
39
-
40
- <div>
41
- <h4
42
- class="mb-3 text-2xs font-semibold uppercase tracking-wider text-ink-900 dark:text-ink-100"
43
- >
44
- Discover
45
- </h4>
46
- <ul class="m-0 flex list-none flex-col gap-2 p-0">
47
- <li><a href="#hot" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100">Hot apps</a></li>
48
- <li><a href="#new" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100">New apps</a></li>
49
- <li><a href="#mature" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100">Mature apps</a></li>
50
- <li><a href="#stacks" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100">By stack</a></li>
51
- <li><a href="#categories" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100">By category</a></li>
52
- </ul>
53
- </div>
54
-
55
- <div>
56
- <h4
57
- class="mb-3 text-2xs font-semibold uppercase tracking-wider text-ink-900 dark:text-ink-100"
58
- >
59
- Contribute
60
- </h4>
61
- <ul class="m-0 flex list-none flex-col gap-2 p-0">
62
- <li>
63
- <a
64
- href={`${githubUrl}/blob/main/CONTRIBUTING.md`}
65
- target="_blank"
66
- rel="noopener noreferrer"
67
- class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100"
68
- >Submit via GitHub</a
69
- >
70
- </li>
71
- <li><a href="#contributors" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100">Contributors</a></li>
72
- <li>
73
- <a
74
- href={`${githubUrl}/issues`}
75
- target="_blank"
76
- rel="noopener noreferrer"
77
- class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100"
78
- >Report an issue</a
79
- >
80
- </li>
81
- <li>
82
- <a
83
- href={`${githubUrl}/blob/main/CONTRIBUTING.md`}
84
- target="_blank"
85
- rel="noopener noreferrer"
86
- class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100"
87
- >Contributing guide</a
88
- >
89
- </li>
90
- </ul>
91
- </div>
92
-
93
- <div>
94
- <h4
95
- class="mb-3 text-2xs font-semibold uppercase tracking-wider text-ink-900 dark:text-ink-100"
96
- >
97
- Project
98
- </h4>
99
- <ul class="m-0 flex list-none flex-col gap-2 p-0">
100
- <li>
101
- <a
102
- href={githubUrl}
103
- target="_blank"
104
- rel="noopener noreferrer"
105
- class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100"
106
- >Source on GitHub</a
107
- >
108
- </li>
109
- <li><a href="#about" class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100">Why this exists</a></li>
110
- <li>
111
- <a
112
- href={`${githubUrl}/blob/main/README.md`}
113
- target="_blank"
114
- rel="noopener noreferrer"
115
- class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100"
116
- >README</a
117
- >
118
- </li>
119
- <li>
120
- <a
121
- href="/about"
122
- class="text-sm transition-colors hover:text-ink-900 dark:hover:text-ink-100"
123
- >About</a
124
- >
125
- </li>
126
- </ul>
127
- </div>
128
- </div>
129
-
130
- <div class="border-t border-ink-200 dark:border-ink-800">
131
- <div
132
- class="mx-auto flex max-w-wide flex-wrap items-center gap-3 px-5 py-4 text-2xs text-ink-500 sm:px-7 dark:text-ink-400"
133
- >
134
- <span>© {year} {siteConfig.name}. Content under CC BY-SA 4.0.</span>
135
- <span class="text-ink-300 dark:text-ink-700">·</span>
136
- <a
137
- href={githubUrl}
138
- target="_blank"
139
- rel="noopener noreferrer"
140
- class="transition-colors hover:text-ink-900 dark:hover:text-ink-100"
141
- >View source on GitHub</a
142
- >
143
- </div>
144
26
  </div>
145
27
  </footer>