@morphemecms/cms 0.1.0 → 0.2.0-next-20261104150211

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 (908) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +21 -21
  3. package/README.md +51 -51
  4. package/astro.mjs +162 -162
  5. package/bin/morpheme.mjs +38 -38
  6. package/client.d.ts +10 -10
  7. package/defaults/blockTexts.ts +33 -33
  8. package/defaults/collections.ts +774 -774
  9. package/defaults/colors.ts +125 -125
  10. package/defaults/company.ts +20 -20
  11. package/defaults/editor.ts +178 -178
  12. package/defaults/internalLinks.ts +30 -30
  13. package/defaults/opens.ts +18 -18
  14. package/defaults/popup.tsx +93 -93
  15. package/defaults/privacy.ts +79 -79
  16. package/defaults/rules.ts +450 -450
  17. package/defaults/schema.ts +16 -16
  18. package/defaults/sitedata.ts +129 -129
  19. package/defaults/standard.ts +106 -106
  20. package/defaults/standardPages.ts +87 -87
  21. package/defaults/texts.ts +481 -481
  22. package/demo/README.md +26 -26
  23. package/demo/src/content/blog/build-a-page-from-blocks.md +19 -19
  24. package/demo/src/content/blog/colors-everyone-can-read.md +19 -19
  25. package/demo/src/content/blog/edit-your-website-from-your-phone.md +21 -21
  26. package/demo/src/content/blog/every-save-is-a-version.md +21 -21
  27. package/demo/src/content/blog/schedule-a-post.md +17 -17
  28. package/demo/src/content/blog/secure-from-day-one.md +17 -17
  29. package/demo/src/content/blog/seo-without-the-guesswork.md +23 -23
  30. package/demo/src/content/blog/switch-themes-without-losing-anything.md +23 -23
  31. package/demo/src/content/blog/the-app-store.md +21 -21
  32. package/demo/src/content/pages/about.md +22 -22
  33. package/demo/src/content/pages/app-store.md +30 -30
  34. package/demo/src/content/pages/blocks.md +98 -98
  35. package/demo/src/content/pages/blog-page.md +11 -11
  36. package/demo/src/content/pages/contact.md +16 -16
  37. package/demo/src/content/pages/get-started.md +20 -20
  38. package/demo/src/content/pages/home.md +26 -26
  39. package/demo/src/content/pages/page-not-found.md +11 -11
  40. package/demo/src/content/pages/privacy-policy.md +24 -24
  41. package/demo/src/data/blocks.json +25 -25
  42. package/demo/src/data/booking.json +6 -6
  43. package/demo/src/data/categories/apps.json +6 -6
  44. package/demo/src/data/categories/design.json +6 -6
  45. package/demo/src/data/categories/editing.json +6 -6
  46. package/demo/src/data/categories/security.json +6 -6
  47. package/demo/src/data/categories/seo.json +6 -6
  48. package/demo/src/data/colors.json +75 -75
  49. package/demo/src/data/contact.json +8 -8
  50. package/demo/src/data/cookies.json +21 -21
  51. package/demo/src/data/footer.json +27 -27
  52. package/demo/src/data/menu.json +35 -35
  53. package/demo/src/data/mobile-menu.json +25 -25
  54. package/demo/src/data/popups/booking-bar.json +13 -13
  55. package/demo/src/data/popups/try-the-editor.json +16 -16
  56. package/demo/src/data/standard-pages.json +8 -8
  57. package/demo/src/data/testimonials/sample-bakery.json +10 -10
  58. package/demo/src/data/testimonials/sample-clinic.json +10 -10
  59. package/demo/src/data/testimonials/sample-studio.json +10 -10
  60. package/demo/src/site/colors.ts +11 -11
  61. package/demo/src/site/config.ts +19 -19
  62. package/icons/lucide/LICENSE +43 -43
  63. package/icons/lucide/address-book.svg +1 -1
  64. package/icons/lucide/app-window.svg +1 -1
  65. package/icons/lucide/arrow-counter-clockwise.svg +1 -1
  66. package/icons/lucide/arrow-down.svg +1 -1
  67. package/icons/lucide/arrow-left.svg +1 -1
  68. package/icons/lucide/arrow-right.svg +1 -1
  69. package/icons/lucide/arrow-square-out.svg +1 -1
  70. package/icons/lucide/arrow-u-up-left.svg +1 -1
  71. package/icons/lucide/arrow-u-up-right.svg +1 -1
  72. package/icons/lucide/arrow-up-right.svg +1 -1
  73. package/icons/lucide/arrow-up.svg +1 -1
  74. package/icons/lucide/arrows-down-up.svg +1 -1
  75. package/icons/lucide/arrows-in-line-horizontal.svg +1 -1
  76. package/icons/lucide/arrows-out-line-horizontal.svg +1 -1
  77. package/icons/lucide/article.svg +1 -1
  78. package/icons/lucide/bank.svg +1 -1
  79. package/icons/lucide/bell.svg +1 -1
  80. package/icons/lucide/bicycle.svg +1 -1
  81. package/icons/lucide/binoculars.svg +1 -1
  82. package/icons/lucide/book-open-text.svg +1 -1
  83. package/icons/lucide/book-open.svg +1 -1
  84. package/icons/lucide/browser.svg +1 -1
  85. package/icons/lucide/buildings.svg +1 -1
  86. package/icons/lucide/bus.svg +1 -1
  87. package/icons/lucide/calendar-blank.svg +1 -1
  88. package/icons/lucide/calendar-check.svg +1 -1
  89. package/icons/lucide/car.svg +1 -1
  90. package/icons/lucide/cards.svg +1 -1
  91. package/icons/lucide/caret-down.svg +1 -1
  92. package/icons/lucide/caret-left.svg +1 -1
  93. package/icons/lucide/caret-right.svg +1 -1
  94. package/icons/lucide/caret-up.svg +1 -1
  95. package/icons/lucide/certificate.svg +1 -1
  96. package/icons/lucide/chart-line-up.svg +1 -1
  97. package/icons/lucide/chats.svg +1 -1
  98. package/icons/lucide/check-circle.svg +1 -1
  99. package/icons/lucide/check.svg +1 -1
  100. package/icons/lucide/circle-half.svg +1 -1
  101. package/icons/lucide/circle.svg +1 -1
  102. package/icons/lucide/clock-counter-clockwise.svg +1 -1
  103. package/icons/lucide/clock.svg +1 -1
  104. package/icons/lucide/code.svg +1 -1
  105. package/icons/lucide/coffee.svg +1 -1
  106. package/icons/lucide/columns.svg +1 -1
  107. package/icons/lucide/cookie.svg +1 -1
  108. package/icons/lucide/copy.svg +1 -1
  109. package/icons/lucide/credit-card.svg +1 -1
  110. package/icons/lucide/currency-circle-dollar.svg +1 -1
  111. package/icons/lucide/cursor-click.svg +1 -1
  112. package/icons/lucide/database.svg +1 -1
  113. package/icons/lucide/desktop.svg +1 -1
  114. package/icons/lucide/device-mobile.svg +1 -1
  115. package/icons/lucide/door-open.svg +1 -1
  116. package/icons/lucide/download-simple.svg +1 -1
  117. package/icons/lucide/envelope-simple.svg +1 -1
  118. package/icons/lucide/eye-slash.svg +1 -1
  119. package/icons/lucide/eye.svg +1 -1
  120. package/icons/lucide/file-pdf.svg +1 -1
  121. package/icons/lucide/file-text.svg +1 -1
  122. package/icons/lucide/file-video.svg +1 -1
  123. package/icons/lucide/file-zip.svg +1 -1
  124. package/icons/lucide/flower-lotus.svg +1 -1
  125. package/icons/lucide/folder-simple.svg +1 -1
  126. package/icons/lucide/funnel.svg +1 -1
  127. package/icons/lucide/gauge.svg +1 -1
  128. package/icons/lucide/gear.svg +1 -1
  129. package/icons/lucide/github-logo.svg +1 -1
  130. package/icons/lucide/globe.svg +1 -1
  131. package/icons/lucide/google-logo.svg +1 -1
  132. package/icons/lucide/graduation-cap.svg +1 -1
  133. package/icons/lucide/hammer.svg +1 -1
  134. package/icons/lucide/hand-heart.svg +1 -1
  135. package/icons/lucide/handshake.svg +1 -1
  136. package/icons/lucide/hard-drives.svg +1 -1
  137. package/icons/lucide/heart.svg +1 -1
  138. package/icons/lucide/house.svg +1 -1
  139. package/icons/lucide/image-square.svg +1 -1
  140. package/icons/lucide/image.svg +1 -1
  141. package/icons/lucide/info.svg +1 -1
  142. package/icons/lucide/keyboard.svg +1 -1
  143. package/icons/lucide/leaf.svg +1 -1
  144. package/icons/lucide/lifebuoy.svg +1 -1
  145. package/icons/lucide/lightbulb.svg +1 -1
  146. package/icons/lucide/link-break.svg +1 -1
  147. package/icons/lucide/link-simple.svg +1 -1
  148. package/icons/lucide/list-bullets.svg +1 -1
  149. package/icons/lucide/list-checks.svg +1 -1
  150. package/icons/lucide/list-numbers.svg +1 -1
  151. package/icons/lucide/list.svg +1 -1
  152. package/icons/lucide/lock-simple-open.svg +1 -1
  153. package/icons/lucide/lock-simple.svg +1 -1
  154. package/icons/lucide/magnifying-glass.svg +1 -1
  155. package/icons/lucide/map-pin.svg +1 -1
  156. package/icons/lucide/map-trifold.svg +1 -1
  157. package/icons/lucide/medal.svg +1 -1
  158. package/icons/lucide/megaphone.svg +1 -1
  159. package/icons/lucide/minus.svg +1 -1
  160. package/icons/lucide/moon.svg +1 -1
  161. package/icons/lucide/newspaper.svg +1 -1
  162. package/icons/lucide/pack.json +23 -23
  163. package/icons/lucide/paint-brush-broad.svg +1 -1
  164. package/icons/lucide/palette.svg +1 -1
  165. package/icons/lucide/paper-plane-tilt.svg +1 -1
  166. package/icons/lucide/pencil-simple.svg +1 -1
  167. package/icons/lucide/phone.svg +1 -1
  168. package/icons/lucide/play-fill.svg +1 -1
  169. package/icons/lucide/plus.svg +1 -1
  170. package/icons/lucide/prohibit.svg +1 -1
  171. package/icons/lucide/puzzle-piece.svg +1 -1
  172. package/icons/lucide/question.svg +1 -1
  173. package/icons/lucide/quotes.svg +1 -1
  174. package/icons/lucide/rows.svg +1 -1
  175. package/icons/lucide/ruler.svg +1 -1
  176. package/icons/lucide/scan.svg +1 -1
  177. package/icons/lucide/shapes.svg +1 -1
  178. package/icons/lucide/share-network.svg +1 -1
  179. package/icons/lucide/shield-check.svg +1 -1
  180. package/icons/lucide/sidebar-simple.svg +1 -1
  181. package/icons/lucide/sign-out.svg +1 -1
  182. package/icons/lucide/signpost.svg +1 -1
  183. package/icons/lucide/sliders-horizontal.svg +1 -1
  184. package/icons/lucide/smiley.svg +1 -1
  185. package/icons/lucide/sparkle.svg +1 -1
  186. package/icons/lucide/square-half-bottom.svg +1 -1
  187. package/icons/lucide/square.svg +1 -1
  188. package/icons/lucide/squares-four.svg +1 -1
  189. package/icons/lucide/sticker.svg +1 -1
  190. package/icons/lucide/storefront.svg +1 -1
  191. package/icons/lucide/sun.svg +1 -1
  192. package/icons/lucide/swatches.svg +1 -1
  193. package/icons/lucide/tag.svg +1 -1
  194. package/icons/lucide/text-aa.svg +1 -1
  195. package/icons/lucide/text-align-left.svg +1 -1
  196. package/icons/lucide/text-b.svg +1 -1
  197. package/icons/lucide/text-h-one.svg +1 -1
  198. package/icons/lucide/text-h-three.svg +1 -1
  199. package/icons/lucide/text-h-two.svg +1 -1
  200. package/icons/lucide/text-italic.svg +1 -1
  201. package/icons/lucide/text-t.svg +1 -1
  202. package/icons/lucide/ticket.svg +1 -1
  203. package/icons/lucide/toggle-right.svg +1 -1
  204. package/icons/lucide/train.svg +1 -1
  205. package/icons/lucide/trash.svg +1 -1
  206. package/icons/lucide/upload-simple.svg +1 -1
  207. package/icons/lucide/user-circle.svg +1 -1
  208. package/icons/lucide/user.svg +1 -1
  209. package/icons/lucide/users-three.svg +1 -1
  210. package/icons/lucide/users.svg +1 -1
  211. package/icons/lucide/video-camera.svg +1 -1
  212. package/icons/lucide/warning-circle.svg +1 -1
  213. package/icons/lucide/warning.svg +1 -1
  214. package/icons/lucide/wave-sine.svg +1 -1
  215. package/icons/lucide/wheelchair.svg +1 -1
  216. package/icons/lucide/wrench.svg +1 -1
  217. package/icons/lucide/x.svg +1 -1
  218. package/icons/material-symbols/LICENSE +201 -201
  219. package/icons/material-symbols/address-book.svg +1 -1
  220. package/icons/material-symbols/app-window.svg +1 -1
  221. package/icons/material-symbols/arrow-counter-clockwise.svg +1 -1
  222. package/icons/material-symbols/arrow-down.svg +1 -1
  223. package/icons/material-symbols/arrow-left.svg +1 -1
  224. package/icons/material-symbols/arrow-right.svg +1 -1
  225. package/icons/material-symbols/arrow-square-out.svg +1 -1
  226. package/icons/material-symbols/arrow-u-up-left.svg +1 -1
  227. package/icons/material-symbols/arrow-u-up-right.svg +1 -1
  228. package/icons/material-symbols/arrow-up-right.svg +1 -1
  229. package/icons/material-symbols/arrow-up.svg +1 -1
  230. package/icons/material-symbols/arrows-down-up.svg +1 -1
  231. package/icons/material-symbols/arrows-in-line-horizontal.svg +1 -1
  232. package/icons/material-symbols/arrows-out-line-horizontal.svg +1 -1
  233. package/icons/material-symbols/article.svg +1 -1
  234. package/icons/material-symbols/bank.svg +1 -1
  235. package/icons/material-symbols/bell.svg +1 -1
  236. package/icons/material-symbols/bicycle.svg +1 -1
  237. package/icons/material-symbols/binoculars.svg +1 -1
  238. package/icons/material-symbols/book-open-text.svg +1 -1
  239. package/icons/material-symbols/book-open.svg +1 -1
  240. package/icons/material-symbols/browser.svg +1 -1
  241. package/icons/material-symbols/buildings.svg +1 -1
  242. package/icons/material-symbols/bus.svg +1 -1
  243. package/icons/material-symbols/calendar-blank.svg +1 -1
  244. package/icons/material-symbols/calendar-check.svg +1 -1
  245. package/icons/material-symbols/car.svg +1 -1
  246. package/icons/material-symbols/cards.svg +1 -1
  247. package/icons/material-symbols/caret-down.svg +1 -1
  248. package/icons/material-symbols/caret-left.svg +1 -1
  249. package/icons/material-symbols/caret-right.svg +1 -1
  250. package/icons/material-symbols/caret-up.svg +1 -1
  251. package/icons/material-symbols/certificate.svg +1 -1
  252. package/icons/material-symbols/chart-line-up.svg +1 -1
  253. package/icons/material-symbols/chats.svg +1 -1
  254. package/icons/material-symbols/check-circle.svg +1 -1
  255. package/icons/material-symbols/check.svg +1 -1
  256. package/icons/material-symbols/circle-half.svg +1 -1
  257. package/icons/material-symbols/circle.svg +1 -1
  258. package/icons/material-symbols/clock-counter-clockwise.svg +1 -1
  259. package/icons/material-symbols/clock.svg +1 -1
  260. package/icons/material-symbols/code.svg +1 -1
  261. package/icons/material-symbols/coffee.svg +1 -1
  262. package/icons/material-symbols/columns.svg +1 -1
  263. package/icons/material-symbols/cookie.svg +1 -1
  264. package/icons/material-symbols/copy.svg +1 -1
  265. package/icons/material-symbols/credit-card.svg +1 -1
  266. package/icons/material-symbols/currency-circle-dollar.svg +1 -1
  267. package/icons/material-symbols/cursor-click.svg +1 -1
  268. package/icons/material-symbols/database.svg +1 -1
  269. package/icons/material-symbols/desktop.svg +1 -1
  270. package/icons/material-symbols/device-mobile.svg +1 -1
  271. package/icons/material-symbols/door-open.svg +1 -1
  272. package/icons/material-symbols/download-simple.svg +1 -1
  273. package/icons/material-symbols/envelope-simple.svg +1 -1
  274. package/icons/material-symbols/eye-slash.svg +1 -1
  275. package/icons/material-symbols/eye.svg +1 -1
  276. package/icons/material-symbols/file-pdf.svg +1 -1
  277. package/icons/material-symbols/file-text.svg +1 -1
  278. package/icons/material-symbols/file-video.svg +1 -1
  279. package/icons/material-symbols/file-zip.svg +1 -1
  280. package/icons/material-symbols/flower-lotus.svg +1 -1
  281. package/icons/material-symbols/folder-simple.svg +1 -1
  282. package/icons/material-symbols/funnel.svg +1 -1
  283. package/icons/material-symbols/gauge.svg +1 -1
  284. package/icons/material-symbols/gear.svg +1 -1
  285. package/icons/material-symbols/github-logo.svg +1 -1
  286. package/icons/material-symbols/globe.svg +1 -1
  287. package/icons/material-symbols/google-logo.svg +1 -1
  288. package/icons/material-symbols/graduation-cap.svg +1 -1
  289. package/icons/material-symbols/hammer.svg +1 -1
  290. package/icons/material-symbols/hand-heart.svg +1 -1
  291. package/icons/material-symbols/handshake.svg +1 -1
  292. package/icons/material-symbols/hard-drives.svg +1 -1
  293. package/icons/material-symbols/heart.svg +1 -1
  294. package/icons/material-symbols/house.svg +1 -1
  295. package/icons/material-symbols/image-square.svg +1 -1
  296. package/icons/material-symbols/image.svg +1 -1
  297. package/icons/material-symbols/info.svg +1 -1
  298. package/icons/material-symbols/keyboard.svg +1 -1
  299. package/icons/material-symbols/leaf.svg +1 -1
  300. package/icons/material-symbols/lifebuoy.svg +1 -1
  301. package/icons/material-symbols/lightbulb.svg +1 -1
  302. package/icons/material-symbols/link-break.svg +1 -1
  303. package/icons/material-symbols/link-simple.svg +1 -1
  304. package/icons/material-symbols/list-bullets.svg +1 -1
  305. package/icons/material-symbols/list-checks.svg +1 -1
  306. package/icons/material-symbols/list-numbers.svg +1 -1
  307. package/icons/material-symbols/list.svg +1 -1
  308. package/icons/material-symbols/lock-simple-open.svg +1 -1
  309. package/icons/material-symbols/lock-simple.svg +1 -1
  310. package/icons/material-symbols/magnifying-glass.svg +1 -1
  311. package/icons/material-symbols/map-pin.svg +1 -1
  312. package/icons/material-symbols/map-trifold.svg +1 -1
  313. package/icons/material-symbols/medal.svg +1 -1
  314. package/icons/material-symbols/megaphone.svg +1 -1
  315. package/icons/material-symbols/minus.svg +1 -1
  316. package/icons/material-symbols/moon.svg +1 -1
  317. package/icons/material-symbols/newspaper.svg +1 -1
  318. package/icons/material-symbols/pack.json +29 -29
  319. package/icons/material-symbols/paint-brush-broad.svg +1 -1
  320. package/icons/material-symbols/palette.svg +1 -1
  321. package/icons/material-symbols/paper-plane-tilt.svg +1 -1
  322. package/icons/material-symbols/pencil-simple.svg +1 -1
  323. package/icons/material-symbols/phone.svg +1 -1
  324. package/icons/material-symbols/play-fill.svg +1 -1
  325. package/icons/material-symbols/plus.svg +1 -1
  326. package/icons/material-symbols/prohibit.svg +1 -1
  327. package/icons/material-symbols/puzzle-piece.svg +1 -1
  328. package/icons/material-symbols/question.svg +1 -1
  329. package/icons/material-symbols/quotes.svg +1 -1
  330. package/icons/material-symbols/rows.svg +1 -1
  331. package/icons/material-symbols/ruler.svg +1 -1
  332. package/icons/material-symbols/scan.svg +1 -1
  333. package/icons/material-symbols/shapes.svg +1 -1
  334. package/icons/material-symbols/share-network.svg +1 -1
  335. package/icons/material-symbols/shield-check.svg +1 -1
  336. package/icons/material-symbols/sidebar-simple.svg +1 -1
  337. package/icons/material-symbols/sign-out.svg +1 -1
  338. package/icons/material-symbols/signpost.svg +1 -1
  339. package/icons/material-symbols/sliders-horizontal.svg +1 -1
  340. package/icons/material-symbols/smiley.svg +1 -1
  341. package/icons/material-symbols/sparkle.svg +1 -1
  342. package/icons/material-symbols/square-half-bottom.svg +1 -1
  343. package/icons/material-symbols/square.svg +1 -1
  344. package/icons/material-symbols/squares-four.svg +1 -1
  345. package/icons/material-symbols/sticker.svg +1 -1
  346. package/icons/material-symbols/storefront.svg +1 -1
  347. package/icons/material-symbols/sun.svg +1 -1
  348. package/icons/material-symbols/swatches.svg +1 -1
  349. package/icons/material-symbols/tag.svg +1 -1
  350. package/icons/material-symbols/text-aa.svg +1 -1
  351. package/icons/material-symbols/text-align-left.svg +1 -1
  352. package/icons/material-symbols/text-b.svg +1 -1
  353. package/icons/material-symbols/text-h-one.svg +1 -1
  354. package/icons/material-symbols/text-h-three.svg +1 -1
  355. package/icons/material-symbols/text-h-two.svg +1 -1
  356. package/icons/material-symbols/text-italic.svg +1 -1
  357. package/icons/material-symbols/text-t.svg +1 -1
  358. package/icons/material-symbols/ticket.svg +1 -1
  359. package/icons/material-symbols/toggle-right.svg +1 -1
  360. package/icons/material-symbols/train.svg +1 -1
  361. package/icons/material-symbols/trash.svg +1 -1
  362. package/icons/material-symbols/upload-simple.svg +1 -1
  363. package/icons/material-symbols/user-circle.svg +1 -1
  364. package/icons/material-symbols/user.svg +1 -1
  365. package/icons/material-symbols/users-three.svg +1 -1
  366. package/icons/material-symbols/users.svg +1 -1
  367. package/icons/material-symbols/video-camera.svg +1 -1
  368. package/icons/material-symbols/warning-circle.svg +1 -1
  369. package/icons/material-symbols/warning.svg +1 -1
  370. package/icons/material-symbols/wave-sine.svg +1 -1
  371. package/icons/material-symbols/wheelchair.svg +1 -1
  372. package/icons/material-symbols/wrench.svg +1 -1
  373. package/icons/material-symbols/x.svg +1 -1
  374. package/icons/phosphor/pack.json +8 -8
  375. package/lib/apps.mjs +142 -139
  376. package/lib/apps.test.d.mts +1 -0
  377. package/lib/apps.test.mjs +50 -0
  378. package/lib/blocks.mjs +90 -90
  379. package/lib/caseCollisions.d.mts +4 -0
  380. package/lib/caseCollisions.mjs +62 -0
  381. package/lib/caseCollisions.test.d.mts +1 -0
  382. package/lib/caseCollisions.test.mjs +74 -0
  383. package/lib/colors.ts +86 -86
  384. package/lib/contactBar.ts +18 -18
  385. package/lib/contracts.d.mts +15 -0
  386. package/lib/contracts.mjs +17 -0
  387. package/lib/cookieCategories.mjs +28 -28
  388. package/lib/crop.mjs +83 -83
  389. package/lib/csp.mjs +130 -130
  390. package/lib/cspSources.mjs +60 -60
  391. package/lib/dynamic-colors.ts +426 -426
  392. package/lib/git.mjs +64 -64
  393. package/lib/hooks.ts +51 -51
  394. package/lib/inline.ts +20 -20
  395. package/lib/license-texts/Apache-2.0.txt +190 -190
  396. package/lib/license-texts/BSD-2-Clause.txt +24 -24
  397. package/lib/license-texts/BSD-3-Clause.txt +28 -28
  398. package/lib/license-texts/ISC.txt +15 -15
  399. package/lib/license-texts/MIT.txt +21 -21
  400. package/lib/licenses.d.mts +1 -1
  401. package/lib/licenses.mjs +683 -683
  402. package/lib/markdown.ts +42 -42
  403. package/lib/motion-schemes.mjs +5 -5
  404. package/lib/motion.ts +131 -131
  405. package/lib/notice.mjs +34 -34
  406. package/lib/scheduled.mjs +37 -37
  407. package/lib/snackbar.ts +149 -149
  408. package/lib/status.mjs +18 -18
  409. package/lib/storeEntries.d.mts +18 -0
  410. package/lib/storeEntries.mjs +64 -0
  411. package/lib/storeEntries.test.d.mts +1 -0
  412. package/lib/storeEntries.test.mjs +71 -0
  413. package/lib/svg.mjs +231 -231
  414. package/lib/text-colors.mjs +43 -43
  415. package/lib/video-id.mjs +72 -72
  416. package/lib/video.mjs +91 -91
  417. package/package.json +136 -131
  418. package/pages/404.astro +10 -10
  419. package/pages/[...slug].astro +51 -51
  420. package/pages/_headers.txt +31 -31
  421. package/pages/blog/index.astro +10 -10
  422. package/pages/blog/kategori/[category].astro +18 -18
  423. package/pages/editor/code-images.json.js +25 -25
  424. package/pages/editor/index.astro +75 -75
  425. package/pages/editor/manifest.webmanifest.js +23 -23
  426. package/pages/editor/sw.js +33 -33
  427. package/pages/editor/sw.js.js +4 -4
  428. package/pages/editor/thumbnails.json.js +21 -21
  429. package/pages/editor/version.json.js +22 -22
  430. package/pages/headers.js +4 -4
  431. package/pages/index.astro +10 -10
  432. package/pages/ny.astro +6 -6
  433. package/pages/robots.txt.js +3 -3
  434. package/pages/rss.xml.js +20 -20
  435. package/scripts/app-screenshots.mjs +164 -164
  436. package/scripts/app-workers.mjs +6 -6
  437. package/scripts/bin.mjs +12 -12
  438. package/scripts/built-site.mjs +134 -99
  439. package/scripts/check-consent.mjs +113 -113
  440. package/scripts/check-content.mjs +151 -149
  441. package/scripts/check-demo.mjs +24 -24
  442. package/scripts/check-store.mjs +160 -0
  443. package/scripts/check-themes.mjs +45 -45
  444. package/scripts/check-worker.mjs +569 -569
  445. package/scripts/compare-html.mjs +81 -81
  446. package/scripts/declarations.mjs +10 -0
  447. package/scripts/declarations.test.mjs +32 -0
  448. package/scripts/demo-site.mjs +42 -42
  449. package/scripts/editor-icons.mjs +56 -56
  450. package/scripts/editor-roundtrip.mjs +134 -134
  451. package/scripts/editor-screens.mjs +101 -101
  452. package/scripts/git-env.mjs +9 -9
  453. package/scripts/icon-packs.mjs +151 -151
  454. package/scripts/link-counts.mjs +22 -22
  455. package/scripts/page-colors.mjs +42 -42
  456. package/scripts/releases.mjs +80 -80
  457. package/scripts/responsive-images.mjs +94 -94
  458. package/scripts/scheduled-list.mjs +15 -15
  459. package/scripts/theme-screenshots.mjs +88 -88
  460. package/scripts/types.mjs +17 -21
  461. package/scripts/video-thumbnails.mjs +89 -89
  462. package/scripts/worker-modules.mjs +34 -34
  463. package/site/appCookies.mjs +74 -74
  464. package/site/apps.ts +21 -21
  465. package/site/autolinks.mjs +200 -200
  466. package/site/blockScripts.ts +31 -31
  467. package/site/categories.ts +16 -16
  468. package/site/consent.ts +26 -26
  469. package/site/content.config.ts +84 -84
  470. package/site/content.ts +104 -104
  471. package/site/cookieList.ts +17 -17
  472. package/site/defineSite.d.mts +2 -14
  473. package/site/defineSite.mjs +131 -136
  474. package/site/directives/interact.mjs +31 -31
  475. package/site/editor-version.mjs +26 -26
  476. package/site/fill.ts +13 -13
  477. package/site/format.ts +11 -11
  478. package/site/home.ts +66 -66
  479. package/site/iconPacks.mjs +43 -43
  480. package/site/icons.mjs +605 -605
  481. package/site/images.mjs +157 -157
  482. package/site/motion.ts +13 -13
  483. package/site/noindex.mjs +21 -21
  484. package/site/pageColors.ts +110 -110
  485. package/site/popups.ts +98 -98
  486. package/site/schema.ts +189 -189
  487. package/site/sections.ts +3 -3
  488. package/site/seo.ts +28 -28
  489. package/site/site.ts +76 -76
  490. package/site/siteConfig.mjs +8 -8
  491. package/site/siteCsp.mjs +75 -75
  492. package/site/siteModules.mjs +27 -27
  493. package/site/standardPages.ts +59 -59
  494. package/site/storeTheme.d.mts +6 -0
  495. package/site/storeTheme.mjs +29 -0
  496. package/site/storeTheme.test.d.mts +1 -0
  497. package/site/storeTheme.test.mjs +53 -0
  498. package/site/testimonials.ts +48 -48
  499. package/site/text.ts +43 -43
  500. package/site/theme.mjs +483 -472
  501. package/site/tracking.client.ts +225 -225
  502. package/site/tracking.ts +9 -9
  503. package/src/ActionParts.tsx +205 -205
  504. package/src/Advanced.tsx +152 -152
  505. package/src/App.tsx +901 -904
  506. package/src/AppList.tsx +1362 -1345
  507. package/src/BlockDialog.tsx +360 -360
  508. package/src/BlockParts.tsx +652 -652
  509. package/src/BlockSettings.tsx +533 -533
  510. package/src/BrandForm.tsx +164 -164
  511. package/src/Colors.tsx +476 -476
  512. package/src/CommunicationParts.tsx +199 -199
  513. package/src/CompanyForm.tsx +209 -209
  514. package/src/Consents.tsx +175 -175
  515. package/src/ContainmentParts.tsx +185 -185
  516. package/src/Crop.tsx +152 -152
  517. package/src/DataForm.tsx +434 -434
  518. package/src/Deleted.tsx +177 -177
  519. package/src/EntryForm.tsx +740 -740
  520. package/src/FileView.tsx +30 -30
  521. package/src/FormFrame.tsx +237 -237
  522. package/src/Keywords.tsx +225 -225
  523. package/src/Library.tsx +1563 -1563
  524. package/src/Licenses.tsx +336 -336
  525. package/src/LinkSheet.tsx +138 -138
  526. package/src/MarkdownEditor.tsx +1075 -1075
  527. package/src/Media.tsx +677 -677
  528. package/src/NavigationParts.tsx +350 -350
  529. package/src/NavigationRestParts.tsx +247 -247
  530. package/src/Notifications.tsx +59 -59
  531. package/src/PagePicker.tsx +136 -136
  532. package/src/Parts.tsx +991 -991
  533. package/src/PartsShown.tsx +168 -168
  534. package/src/PickerParts.tsx +183 -183
  535. package/src/Redirects.tsx +450 -450
  536. package/src/Screen.tsx +184 -184
  537. package/src/SectionsField.tsx +65 -65
  538. package/src/SelectionParts.tsx +134 -134
  539. package/src/SeoScores.tsx +184 -184
  540. package/src/Sheet.tsx +35 -35
  541. package/src/ThemeStore.tsx +376 -376
  542. package/src/Tokens.tsx +346 -346
  543. package/src/Versions.tsx +214 -214
  544. package/src/addresses.ts +75 -75
  545. package/src/allIcons.ts +7 -7
  546. package/src/appFiles.ts +29 -29
  547. package/src/apps.ts +281 -281
  548. package/src/ask.tsx +123 -123
  549. package/src/blocks.ts +251 -251
  550. package/src/brand.ts +153 -153
  551. package/src/cache.ts +42 -42
  552. package/src/check.ts +285 -285
  553. package/src/checkSite.ts +256 -256
  554. package/src/{consents.ts → consentData.ts} +26 -26
  555. package/src/cookieList.ts +70 -70
  556. package/src/countries.ts +59 -59
  557. package/src/deploy.ts +155 -155
  558. package/src/editor.css +602 -602
  559. package/src/examples.ts +85 -85
  560. package/src/fields.tsx +942 -942
  561. package/src/frontmatter.mjs +42 -42
  562. package/src/github.ts +376 -376
  563. package/src/i18n/da-DK/advanced.ts +28 -28
  564. package/src/i18n/da-DK/app.ts +71 -71
  565. package/src/i18n/da-DK/apps.ts +90 -90
  566. package/src/i18n/da-DK/blockSettings.ts +38 -38
  567. package/src/i18n/da-DK/blocks.ts +408 -408
  568. package/src/i18n/da-DK/check.ts +25 -25
  569. package/src/i18n/da-DK/colors.ts +64 -64
  570. package/src/i18n/da-DK/common.ts +118 -118
  571. package/src/i18n/da-DK/company.ts +24 -24
  572. package/src/i18n/da-DK/consents.ts +23 -23
  573. package/src/i18n/da-DK/forms.ts +116 -116
  574. package/src/i18n/da-DK/history.ts +35 -35
  575. package/src/i18n/da-DK/index.ts +49 -49
  576. package/src/i18n/da-DK/keywords.ts +19 -19
  577. package/src/i18n/da-DK/library.ts +135 -135
  578. package/src/i18n/da-DK/licenses.ts +25 -25
  579. package/src/i18n/da-DK/media.ts +79 -79
  580. package/src/i18n/da-DK/parts.ts +696 -696
  581. package/src/i18n/da-DK/preview.ts +13 -13
  582. package/src/i18n/da-DK/redirects.ts +51 -51
  583. package/src/i18n/da-DK/seo.ts +20 -20
  584. package/src/i18n/da-DK/text.ts +35 -35
  585. package/src/i18n/da-DK/theme.ts +41 -41
  586. package/src/i18n/en-US/advanced.ts +32 -32
  587. package/src/i18n/en-US/app.ts +84 -84
  588. package/src/i18n/en-US/apps.ts +134 -134
  589. package/src/i18n/en-US/blockSettings.ts +48 -48
  590. package/src/i18n/en-US/blocks.ts +441 -441
  591. package/src/i18n/en-US/check.ts +31 -31
  592. package/src/i18n/en-US/colors.ts +82 -82
  593. package/src/i18n/en-US/common.ts +144 -144
  594. package/src/i18n/en-US/company.ts +25 -25
  595. package/src/i18n/en-US/consents.ts +25 -25
  596. package/src/i18n/en-US/forms.ts +145 -145
  597. package/src/i18n/en-US/history.ts +43 -43
  598. package/src/i18n/en-US/index.ts +51 -51
  599. package/src/i18n/en-US/keywords.ts +24 -24
  600. package/src/i18n/en-US/library.ts +176 -176
  601. package/src/i18n/en-US/licenses.ts +36 -36
  602. package/src/i18n/en-US/media.ts +80 -80
  603. package/src/i18n/en-US/parts.ts +718 -718
  604. package/src/i18n/en-US/preview.ts +15 -15
  605. package/src/i18n/en-US/redirects.ts +66 -66
  606. package/src/i18n/en-US/seo.ts +26 -26
  607. package/src/i18n/en-US/text.ts +41 -41
  608. package/src/i18n/en-US/theme.ts +41 -41
  609. package/src/i18n/index.ts +124 -124
  610. package/src/icon.tsx +160 -160
  611. package/src/iconPacks.ts +89 -89
  612. package/src/images.ts +163 -163
  613. package/src/{licenses.ts → licenseData.ts} +79 -79
  614. package/src/markdown.mjs +204 -204
  615. package/src/nav.ts +68 -68
  616. package/src/notFound.ts +28 -28
  617. package/src/{notifications.ts → notificationData.ts} +223 -223
  618. package/src/pagePreview.tsx +204 -204
  619. package/src/r2Caching.ts +55 -55
  620. package/src/{redirects.ts → redirectData.ts} +149 -149
  621. package/src/registry.tsx +188 -188
  622. package/src/schema.ts +417 -417
  623. package/src/sections.mjs +303 -303
  624. package/src/seo.ts +333 -333
  625. package/src/shared.ts +44 -44
  626. package/src/sidebar.ts +31 -31
  627. package/src/site.ts +317 -317
  628. package/src/standard/Block.astro +19 -19
  629. package/src/standard/BlockSite.astro +18 -18
  630. package/src/standard/accordion/index.tsx +47 -47
  631. package/src/standard/accordion/load.ts +23 -23
  632. package/src/standard/accordion/shared.ts +15 -15
  633. package/src/standard/accordion/view.ts +32 -32
  634. package/src/standard/buttons/fields.ts +98 -98
  635. package/src/standard/buttons/index.tsx +23 -23
  636. package/src/standard/buttons/load.ts +34 -34
  637. package/src/standard/buttons/shared.ts +12 -12
  638. package/src/standard/buttons/view.ts +30 -30
  639. package/src/standard/cards/index.tsx +71 -71
  640. package/src/standard/cards/load.ts +17 -17
  641. package/src/standard/cards/shared.ts +27 -27
  642. package/src/standard/cards/view.ts +29 -29
  643. package/src/standard/checklist/index.tsx +27 -27
  644. package/src/standard/checklist/load.ts +5 -5
  645. package/src/standard/checklist/view.ts +13 -13
  646. package/src/standard/cookies/index.tsx +17 -17
  647. package/src/standard/cookies/list.ts +56 -56
  648. package/src/standard/cookies/load.ts +11 -11
  649. package/src/standard/cookies/shared.ts +20 -20
  650. package/src/standard/cookies/view.ts +28 -28
  651. package/src/standard/faq/index.tsx +29 -29
  652. package/src/standard/faq/load.ts +14 -14
  653. package/src/standard/faq/view.ts +21 -21
  654. package/src/standard/head.ts +23 -23
  655. package/src/standard/hero/fields.ts +48 -48
  656. package/src/standard/hero/index.tsx +57 -57
  657. package/src/standard/hero/load.ts +23 -23
  658. package/src/standard/hero/view.ts +38 -38
  659. package/src/standard/links/index.tsx +41 -41
  660. package/src/standard/links/load.ts +17 -17
  661. package/src/standard/links/view.ts +25 -25
  662. package/src/standard/list/index.tsx +50 -50
  663. package/src/standard/list/load.ts +5 -5
  664. package/src/standard/list/view.ts +18 -18
  665. package/src/standard/load.ts +7 -7
  666. package/src/standard/notice/index.tsx +30 -30
  667. package/src/standard/notice/load.ts +16 -16
  668. package/src/standard/notice/view.ts +10 -10
  669. package/src/standard/points/index.tsx +42 -42
  670. package/src/standard/points/load.ts +5 -5
  671. package/src/standard/points/view.ts +12 -12
  672. package/src/standard/posts/index.tsx +132 -132
  673. package/src/standard/posts/load.ts +36 -36
  674. package/src/standard/posts/shared.ts +21 -21
  675. package/src/standard/posts/view.ts +63 -63
  676. package/src/standard/pricecards/index.tsx +57 -57
  677. package/src/standard/pricecards/load.ts +11 -11
  678. package/src/standard/pricecards/view.ts +50 -50
  679. package/src/standard/sharedTexts.ts +6 -6
  680. package/src/standard/site.ts +124 -124
  681. package/src/standard/siteLooks.ts +19 -19
  682. package/src/standard/sites.ts +13 -13
  683. package/src/standard/steps/index.tsx +28 -28
  684. package/src/standard/steps/load.ts +5 -5
  685. package/src/standard/steps/view.ts +11 -11
  686. package/src/standard/testimonials/index.tsx +87 -87
  687. package/src/standard/testimonials/list.ts +43 -43
  688. package/src/standard/testimonials/load.ts +58 -58
  689. package/src/standard/testimonials/shared.ts +13 -13
  690. package/src/standard/testimonials/view.ts +76 -76
  691. package/src/standard/themeBlocks.ts +13 -13
  692. package/src/standard/video/index.tsx +23 -23
  693. package/src/standard/video/load.ts +10 -10
  694. package/src/standard/video/view.ts +42 -42
  695. package/src/standard/view.tsx +105 -105
  696. package/src/standard/views.ts +37 -37
  697. package/src/store.ts +479 -499
  698. package/src/theme.ts +90 -90
  699. package/src/themeUi.ts +97 -97
  700. package/src/themes.ts +91 -91
  701. package/src/ui.tsx +3402 -3402
  702. package/src/virtual.d.ts +5 -5
  703. package/src/when.ts +22 -22
  704. package/starter/.githooks/pre-push +4 -4
  705. package/starter/.nvmrc +1 -1
  706. package/starter/.prettierignore +11 -11
  707. package/starter/.prettierrc.json +7 -7
  708. package/starter/README.md +27 -26
  709. package/starter/astro.config.mjs +5 -5
  710. package/starter/package.json +67 -67
  711. package/starter/public/_redirects +1 -1
  712. package/starter/public/favicon.svg +1 -1
  713. package/starter/public/logo.svg +1 -1
  714. package/starter/src/content/pages/blog.md +8 -8
  715. package/starter/src/content/pages/forside.md +9 -9
  716. package/starter/src/content/pages/kontakt.md +7 -7
  717. package/starter/src/content/pages/privatlivspolitik.md +9 -9
  718. package/starter/src/content/pages/siden-findes-ikke.md +7 -7
  719. package/starter/src/content.config.ts +2 -2
  720. package/starter/src/data/apps.json +1 -1
  721. package/starter/src/data/block-settings.json +3 -3
  722. package/starter/src/data/blocks.json +1 -1
  723. package/starter/src/data/booking.json +6 -6
  724. package/starter/src/data/colors.json +70 -70
  725. package/starter/src/data/contact.json +8 -8
  726. package/starter/src/data/cookies.json +21 -21
  727. package/starter/src/data/csp.json +1 -1
  728. package/starter/src/data/footer.json +15 -15
  729. package/starter/src/data/internal-links.json +4 -4
  730. package/starter/src/data/menu.json +4 -4
  731. package/starter/src/data/mobile-menu.json +4 -4
  732. package/starter/src/data/old-addresses.json +1 -1
  733. package/starter/src/data/redirects.json +1 -1
  734. package/starter/src/data/standard-pages.json +8 -8
  735. package/starter/src/data/theme.json +1 -1
  736. package/starter/src/env.d.ts +2 -2
  737. package/starter/src/site/config.ts +13 -13
  738. package/starter/src/site/worker.js +14 -14
  739. package/starter/tsconfig.json +17 -17
  740. package/starter/worker/apps.js +6 -6
  741. package/starter/wrangler.jsonc +39 -39
  742. package/theme/LICENSE +21 -21
  743. package/theme/blocks/ArrowLink.tsx +14 -14
  744. package/theme/blocks/BlockHead.tsx +26 -26
  745. package/theme/blocks/Panel.tsx +32 -32
  746. package/theme/blocks/Person.tsx +26 -26
  747. package/theme/blocks/accordion/PageRow.tsx +25 -25
  748. package/theme/blocks/accordion/View.tsx +17 -17
  749. package/theme/blocks/buttons/Buttons.tsx +28 -28
  750. package/theme/blocks/buttons/View.tsx +12 -12
  751. package/theme/blocks/cards/LinkCards.tsx +72 -72
  752. package/theme/blocks/cards/View.tsx +20 -20
  753. package/theme/blocks/checklist/Checks.tsx +15 -15
  754. package/theme/blocks/checklist/View.tsx +14 -14
  755. package/theme/blocks/cookies/View.tsx +36 -36
  756. package/theme/blocks/faq/Accordion.tsx +34 -34
  757. package/theme/blocks/faq/View.tsx +16 -16
  758. package/theme/blocks/faq/script.ts +56 -56
  759. package/theme/blocks/hero/View.tsx +44 -44
  760. package/theme/blocks/links/LinkGroups.tsx +24 -24
  761. package/theme/blocks/links/View.tsx +17 -17
  762. package/theme/blocks/list/Rows.tsx +24 -24
  763. package/theme/blocks/list/View.tsx +14 -14
  764. package/theme/blocks/notice/View.tsx +13 -13
  765. package/theme/blocks/points/PointList.tsx +34 -34
  766. package/theme/blocks/points/View.tsx +14 -14
  767. package/theme/blocks/posts/View.tsx +26 -26
  768. package/theme/blocks/pricecards/View.tsx +40 -40
  769. package/theme/blocks/steps/StepList.tsx +23 -23
  770. package/theme/blocks/steps/View.tsx +14 -14
  771. package/theme/blocks/testimonials/List.tsx +46 -46
  772. package/theme/blocks/testimonials/Slider.tsx +44 -44
  773. package/theme/blocks/testimonials/Testimonial.tsx +124 -124
  774. package/theme/blocks/testimonials/View.tsx +21 -21
  775. package/theme/blocks/testimonials/script.ts +52 -52
  776. package/theme/blocks/video/View.tsx +41 -41
  777. package/theme/components/ActionBar.astro +63 -63
  778. package/theme/components/AppSlot.astro +21 -21
  779. package/theme/components/ArrowLink.tsx +21 -21
  780. package/theme/components/BlogIndex.astro +48 -48
  781. package/theme/components/BlogPosts.astro +18 -18
  782. package/theme/components/BlogPosts.tsx +45 -45
  783. package/theme/components/BookButton.tsx +22 -22
  784. package/theme/components/Container.astro +11 -11
  785. package/theme/components/CookieConsent.astro +121 -121
  786. package/theme/components/EndBlock.astro +21 -21
  787. package/theme/components/FontPreload.astro +6 -6
  788. package/theme/components/Footer.astro +85 -85
  789. package/theme/components/Header.astro +186 -186
  790. package/theme/components/Icon.astro +16 -16
  791. package/theme/components/Img.astro +29 -29
  792. package/theme/components/Img.tsx +33 -33
  793. package/theme/components/Inline.astro +11 -11
  794. package/theme/components/Logo.astro +23 -23
  795. package/theme/components/LogoMark.astro +10 -10
  796. package/theme/components/Markdown.astro +17 -17
  797. package/theme/components/MobileMenu.tsx +224 -224
  798. package/theme/components/MobileNav.astro +33 -33
  799. package/theme/components/PageHeader.astro +22 -22
  800. package/theme/components/PageSection.astro +24 -24
  801. package/theme/components/PhoneButton.tsx +11 -11
  802. package/theme/components/Popup.astro +145 -145
  803. package/theme/components/PopupButton.tsx +24 -24
  804. package/theme/components/PopupView.tsx +48 -48
  805. package/theme/components/PostList.tsx +58 -58
  806. package/theme/components/PostMeta.tsx +17 -17
  807. package/theme/components/RichText.astro +28 -28
  808. package/theme/components/Section.astro +29 -29
  809. package/theme/components/SectionHeading.tsx +8 -8
  810. package/theme/components/TextSection.astro +16 -16
  811. package/theme/components/home/PageBlock.astro +19 -19
  812. package/theme/components/home/Text.astro +13 -13
  813. package/theme/components/loadPopup.ts +22 -22
  814. package/theme/components/loadPosts.ts +16 -16
  815. package/theme/components/posts.ts +15 -15
  816. package/theme/editor/looks.mjs +7 -7
  817. package/theme/editor/previews.tsx +56 -56
  818. package/theme/layouts/Base.astro +273 -273
  819. package/theme/layouts/PageLayout.astro +126 -126
  820. package/theme/layouts/PostLayout.astro +137 -137
  821. package/theme/scripts/motion.ts +29 -29
  822. package/theme/styles/base.css +320 -320
  823. package/theme/styles/blocks.css +1808 -1808
  824. package/theme/styles/components.css +206 -206
  825. package/theme/styles/global.css +1302 -1302
  826. package/theme/styles/ui.css +6544 -6544
  827. package/theme/templates/Blog.astro +38 -38
  828. package/theme/templates/Category.astro +19 -19
  829. package/theme/templates/Home.astro +36 -36
  830. package/theme/templates/New.astro +68 -68
  831. package/theme/templates/NotFound.astro +117 -117
  832. package/theme/theme.json +28 -28
  833. package/theme/ui/Badge.tsx +45 -45
  834. package/theme/ui/BottomSheet.tsx +148 -148
  835. package/theme/ui/Button.tsx +79 -79
  836. package/theme/ui/ButtonGroup.tsx +31 -31
  837. package/theme/ui/Card.tsx +45 -45
  838. package/theme/ui/Carousel.tsx +124 -124
  839. package/theme/ui/Checkbox.tsx +59 -59
  840. package/theme/ui/Chip.tsx +101 -101
  841. package/theme/ui/ChipSet.tsx +27 -27
  842. package/theme/ui/DatePicker.tsx +149 -149
  843. package/theme/ui/DatePickerContainer.tsx +316 -316
  844. package/theme/ui/Dialog.tsx +100 -100
  845. package/theme/ui/Divider.tsx +27 -27
  846. package/theme/ui/ExposedDropdownMenu.tsx +77 -77
  847. package/theme/ui/Fab.tsx +88 -88
  848. package/theme/ui/FabMenu.tsx +67 -67
  849. package/theme/ui/IconButton.tsx +78 -78
  850. package/theme/ui/List.tsx +287 -287
  851. package/theme/ui/LoadingIndicator.tsx +29 -29
  852. package/theme/ui/Menu.tsx +278 -278
  853. package/theme/ui/NavigationBar.tsx +62 -62
  854. package/theme/ui/NavigationDrawer.tsx +80 -80
  855. package/theme/ui/NavigationRail.tsx +154 -154
  856. package/theme/ui/ProgressIndicator.tsx +162 -162
  857. package/theme/ui/RadioButton.tsx +50 -50
  858. package/theme/ui/Search.tsx +129 -129
  859. package/theme/ui/SegmentedButton.tsx +49 -49
  860. package/theme/ui/SideSheet.tsx +54 -54
  861. package/theme/ui/Slider.tsx +155 -155
  862. package/theme/ui/Snackbar.tsx +67 -67
  863. package/theme/ui/SplitButton.tsx +67 -67
  864. package/theme/ui/Switch.tsx +60 -60
  865. package/theme/ui/Tabs.tsx +114 -114
  866. package/theme/ui/TextField.tsx +278 -278
  867. package/theme/ui/TimePicker.tsx +128 -128
  868. package/theme/ui/TimePickerContainer.tsx +234 -234
  869. package/theme/ui/Toolbar.tsx +67 -67
  870. package/theme/ui/Tooltip.tsx +58 -58
  871. package/theme/ui/TopAppBar.tsx +77 -77
  872. package/theme/ui/bottomSheet.script.ts +8 -8
  873. package/theme/ui/{bottomSheet.ts → bottomSheetControl.ts} +211 -211
  874. package/theme/ui/carousel.script.ts +28 -28
  875. package/theme/ui/carouselLayout.ts +229 -229
  876. package/theme/ui/checkbox.script.ts +8 -8
  877. package/theme/ui/datePicker.script.ts +302 -302
  878. package/theme/ui/dates.ts +185 -185
  879. package/theme/ui/{dialog.ts → dialogControl.ts} +48 -48
  880. package/theme/ui/dropdownMenu.script.ts +166 -166
  881. package/theme/ui/fabMenu.script.ts +57 -57
  882. package/theme/ui/navigationRail.script.ts +47 -47
  883. package/theme/ui/ripple.script.ts +159 -159
  884. package/theme/ui/search.script.ts +92 -92
  885. package/theme/ui/{sideSheet.ts → sideSheetControl.ts} +48 -48
  886. package/theme/ui/slider.script.ts +12 -12
  887. package/theme/ui/sliderUpdate.ts +52 -52
  888. package/theme/ui/snackbar.script.ts +16 -16
  889. package/theme/ui/splitButton.script.ts +63 -63
  890. package/theme/ui/tabs.script.ts +48 -48
  891. package/theme/ui/textField.script.ts +17 -17
  892. package/theme/ui/textFieldUpdate.ts +44 -44
  893. package/theme/ui/timePicker.script.ts +248 -248
  894. package/theme/ui/toolbar.script.ts +43 -43
  895. package/theme/ui/tooltip.script.ts +68 -68
  896. package/worker/consent.js +141 -141
  897. package/worker/editor-github.js +167 -167
  898. package/worker/editor-host.js +74 -74
  899. package/worker/files.js +401 -401
  900. package/worker/github.js +36 -36
  901. package/worker/index.js +188 -184
  902. package/worker/not-found.js +97 -97
  903. package/worker/oauth.js +95 -95
  904. package/worker/publish.js +52 -52
  905. package/worker/push.js +270 -270
  906. package/worker/r2-status.js +50 -50
  907. package/worker/session.js +58 -58
  908. package/worker/store.js +46 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ # @morphemecms/cms
2
+
3
+ ## 0.2.0-next-20261104150211
4
+
5
+ ### Minor Changes
6
+
7
+ - 545e832: Themes and apps are installed from the Morpheme store, through the site's Worker (`/api/store/`); set the secret `MORPHEME_STORE_KEY` to connect a site. `store` in `src/site/config.ts` is gone, and a store theme may import CSS only from `@morphemecms/cms` and its own files.
8
+ - 9dbb555: Builds on Windows: the theme's helpers `ui/dialog.ts`, `ui/bottomSheet.ts` and `ui/sideSheet.ts` are now `ui/dialogControl.ts`, `ui/bottomSheetControl.ts` and `ui/sideSheetControl.ts` (app API 2, theme API 3), the editor's screen data modules are `*Data.ts`, `worker/apps.js` with CRLF line endings passes the content check, and the check stops two files whose names differ only by case.
9
+
10
+ ### Patch Changes
11
+
12
+ - 13d68c5: The package now includes its CHANGELOG.md, so a site can read what each version changed.
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Lars Adolfsen
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Lars Adolfsen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,51 +1,51 @@
1
- # Morpheme CMS
2
-
3
- An editor for websites built with [Astro](https://astro.build) and run on [Cloudflare](https://www.cloudflare.com): the
4
- site's owner edits pages, posts, pictures and settings in the browser at `/editor/`, and every save is one commit on
5
- GitHub. MIT licensed, see [LICENSE](LICENSE).
6
-
7
- `@morphemecms/cms` is the editor, the site's pages and its Astro setup (`siteConfig()` in `astro.mjs`), the
8
- standard theme *Material* (`theme/`, id `saturn`), the site's Worker (`worker/`) and the `morpheme` command (`bin/`). A site
9
- gives it its settings (`src/site/`, over the standard ones in `defaults/`), its content (`src/content/`, `src/data/`), its themes (`src/themes/`) and its
10
- apps (`src/apps/`).
11
-
12
- A new site starts from the starter (`starter/`, also in the npm package, since the demo is built from it): a site with only its own settings, the
13
- standard pages and the standard theme, ready for Cloudflare.
14
-
15
- [![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/larsadolfsen/morpheme-cms/tree/main/starter)
16
-
17
- Releases are published to npm from GitHub Actions (`.github/workflows/publish.yml`, with npm's trusted publishing)
18
- when a release is made on GitHub with the tag `v<version>`.
19
-
20
- The rest of this file is in Danish, the language the CMS is made in.
21
-
22
- ## Editoren
23
-
24
- Editoren til et site bygget med Astro, på `/editor/`, uden noget bestemt site skrevet ind. Et site giver den sine samlinger og felter, sine regler og sine egne blokke; kunden retter indholdet, og hvert gem er ét commit på GitHub.
25
-
26
- Hele vejledningen står i `docs/editor.md` i sitets repo. Her er kun det, et site skal have for at bruge pakken.
27
-
28
- ## Indhold
29
-
30
- - `src/`: skærmene, felterne, gem, blokkenes ramme (`blocks.ts`) og registret (`registry.tsx`), reglerne (`check.ts`, `checkSite.ts`) og standardblokkenes kontrakt (`standard/<type>/`: felter, regler, faste tekster, lister og det, de viser: `view.ts` og `load.ts`; deres udseende og CSS er temaets, se nedenfor), og `standard/view.tsx`, `BlockSite.astro` og `sites.ts`, der tegner alle blokke på sitet med deres `View.tsx`.
31
- - `lib/`: det, både editoren og sitet bruger: blokkenes format i teksten (`blocks.mjs`), beskæringen af billeder (`crop.mjs`), en kort tekst med fed og links (`inline.ts`), beskedens *Vis indtil* (`notice.mjs`), en sides og et indlægs status og de planlagte (`status.mjs`, `scheduled.mjs`) og videoerne fra YouTube og Vimeo (`video.mjs`, `video-id.mjs`).
32
- - `site/`: det, sitets sider og temaerne læser sitet med (indholdet, dataenes læsere, billederne, de strukturerede data, temaerne og ikonpakkerne), med sitet som `@site/…` og dets data som `@data/…`.
33
- - `defaults/`: sitets standarddele, det et site har, når dets `src/site/` ikke har en fil af samme navn: samlingerne og felterne, startskærmen, reglerne, *Virksomheden*, farverne, teksterne m.m.
34
- - `worker/`: sitets Worker, den samme for alle sites (`index.js` er dens `main`): login, det, editoren spørger GitHub om, kopien i R2, samtykkerne, adresserne, der ikke findes, de planlagte, notifikationerne og appenes del.
35
-
36
- ## Det, sitet skal have
37
-
38
- - **`src/site/`**, som pakken tager som `@site`, og kun derfra; en fil, sitet ikke har, er pakkens i `defaults/`:
39
- - `config.ts` og `worker.js` skal sitet selv have (`config.ts` med `defineSite` fra `@morphemecms/cms/site/defineSite.mjs`: kun det, der er sitets eget); resten kan det have for at give mere end standarden (som standardens fra `@morphemecms/cms/defaults/<fil>` med sit eget lagt til).
40
- - `@site/editor`: `collections`, `groups`, `lists`, `icons`, `siteName`, `companyParts`, `blockParts`, `relationsOf`, `usedBy`, `usesOf`, `countsOf`, `whatIsAt`, `testimonialsOf`, `siteOf`, `fixedPages`, `everyFixedPage`, `Texts`, `sectionLooks`, `headingLooks` og `config`, og typerne `Props` og `SiteData`.
41
- - `@site/config`: sitets navn, domæne, GitHub-repo og mapper.
42
- - `@site/worker` (til Workeren): `apps`, `contact`, `moved`, `standard`, `oldAddresses` (sitets videresendelser fra gamle adresser, `{ ids, paths }`) og appenes del af Workeren (`appWorkers`, `appTexts`).
43
- - **`@site`** for `src/site/`, ellers `defaults/`: i Vite (`siteFile` i `themePlugin`, `site/theme.mjs`, brugt af `astro.mjs` og `scripts/check-content.mjs`, der indlæser reglerne med Vite) og i TypeScript (`paths` i `tsconfig.json`: `"@site/*": ["./src/site/*", "./node_modules/@morphemecms/cms/defaults/*"]`); til Workeren `@site/config` og `@site/worker` i `alias` i `wrangler.jsonc`, med `main` sat til pakkens `worker/index.js`.
44
- - **Sitets egne blokke** i appenes `blocks/<type>/` (`src/apps/<app>/blocks/<type>/`), hver med `index.tsx` (`defineBlock` fra `@morphemecms/cms/src/blocks`), `view.ts` og `load.ts` (det, blokken viser, i editoren og på sitet) og `View.tsx` (tegningen, begge steder). Pakken finder dem selv.
45
- - **Et standardtema**, som alle sitets temaer bygger på, med standardblokkenes udseende (`blocks/<type>/View.tsx`, én tegning til sitet og editoren), som pakken selv finder (dette site: `packages/editor/theme/`, `packages/editor/src/standard/siteLooks.ts` og `packages/editor/src/standard/themeBlocks.ts`).
46
- - **Siderne** er pakkens (`pages/`, sat ind af `siteConfig()` i `astro.mjs`): sitets sider, bloggen, 404, `/ny/` og editoren (siden, der viser `src/App.tsx`, manifestet, `version.json` og billederne, sitets egen kode bruger). Sitets `astro.config.mjs` er kun `export default await siteConfig()`, og `src/content.config.ts` henter samlingerne fra `site/content.config`.
47
- - **Standardblokkenes stil:** `blocks.css` i standardtemaet (dette site: `packages/editor/theme/styles/blocks.css`), importeret i hvert temas CSS, og variablerne `--block-*` sat til temaets farver og former.
48
- - **Kommandoen `morpheme`** (`bin/morpheme.mjs`, pakkens `scripts/`), kørt fra sitets rod i dets `package.json`: `images` (billedernes mindre størrelser og videoernes stillbilleder, før `dev` og `build`), `after-build` (det, Workeren og editoren læser i `dist/`), `check:content` (indholdet efter editorens regler), `check:editor` (siderne kommer tilbage uændret), `check:worker`, `check:screens`, `check:themes`, `check:demo` (CMS'ets demo, `demo/`, virker med CMS'et), `compare-html`, `app-workers`, `app-screenshots`, `theme-screenshots` (billederne af hvert tema, taget af demoen) og `editor-icons`.
49
- - **Layoutene til sider og blogindlæg** markerer med `data-editor`, hvad *Forhåndsvis* sætter ind (`src/pagePreview.tsx`): `heading`, `image`, `text` og evt. `end` med `data-editor-block` (en blok, der slutter teksten, står dér).
50
- - **Afhængighederne** i `peerDependencies`: alt, pakkens kode henter (Astro og dens integrationer, React, Milkdown, Phosphor, Tailwind, motion, standardtemaets skrift, yaml og det, der laver Markdown i *Forhåndsvis*: unified, remark og rehype), og det, kommandoerne bruger (Vite, esbuild, sharp, Wrangler, og til tjekkene i en browser Playwright og jsdom). Starterens `package.json` har dem alle (`scripts/starter.mjs`).
51
- - **Starteren** (`starter/`): det, et nyt site begynder med, tjekket som et site med pakken fra `npm pack` (`scripts/check-starter.mjs`).
1
+ # Morpheme CMS
2
+
3
+ An editor for websites built with [Astro](https://astro.build) and run on [Cloudflare](https://www.cloudflare.com): the
4
+ site's owner edits pages, posts, pictures and settings in the browser at `/editor/`, and every save is one commit on
5
+ GitHub. MIT licensed, see [LICENSE](LICENSE).
6
+
7
+ `@morphemecms/cms` is the editor, the site's pages and its Astro setup (`siteConfig()` in `astro.mjs`), the
8
+ standard theme *Material* (`theme/`, id `saturn`), the site's Worker (`worker/`) and the `morpheme` command (`bin/`). A site
9
+ gives it its settings (`src/site/`, over the standard ones in `defaults/`), its content (`src/content/`, `src/data/`), its themes (`src/themes/`) and its
10
+ apps (`src/apps/`).
11
+
12
+ A new site starts from the starter (`starter/`, also in the npm package, since the demo is built from it): a site with only its own settings, the
13
+ standard pages and the standard theme, ready for Cloudflare.
14
+
15
+ [![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/larsadolfsen/morpheme-cms/tree/main/starter)
16
+
17
+ Releases are published to npm from GitHub Actions (`.github/workflows/publish.yml`, with npm's trusted publishing)
18
+ when a release is made on GitHub with the tag `v<version>`.
19
+
20
+ The rest of this file is in Danish, the language the CMS is made in.
21
+
22
+ ## Editoren
23
+
24
+ Editoren til et site bygget med Astro, på `/editor/`, uden noget bestemt site skrevet ind. Et site giver den sine samlinger og felter, sine regler og sine egne blokke; kunden retter indholdet, og hvert gem er ét commit på GitHub.
25
+
26
+ Hele vejledningen står i `docs/editor.md` i sitets repo. Her er kun det, et site skal have for at bruge pakken.
27
+
28
+ ## Indhold
29
+
30
+ - `src/`: skærmene, felterne, gem, blokkenes ramme (`blocks.ts`) og registret (`registry.tsx`), reglerne (`check.ts`, `checkSite.ts`) og standardblokkenes kontrakt (`standard/<type>/`: felter, regler, faste tekster, lister og det, de viser: `view.ts` og `load.ts`; deres udseende og CSS er temaets, se nedenfor), og `standard/view.tsx`, `BlockSite.astro` og `sites.ts`, der tegner alle blokke på sitet med deres `View.tsx`.
31
+ - `lib/`: det, både editoren og sitet bruger: blokkenes format i teksten (`blocks.mjs`), beskæringen af billeder (`crop.mjs`), en kort tekst med fed og links (`inline.ts`), beskedens *Vis indtil* (`notice.mjs`), en sides og et indlægs status og de planlagte (`status.mjs`, `scheduled.mjs`) og videoerne fra YouTube og Vimeo (`video.mjs`, `video-id.mjs`).
32
+ - `site/`: det, sitets sider og temaerne læser sitet med (indholdet, dataenes læsere, billederne, de strukturerede data, temaerne og ikonpakkerne), med sitet som `@site/…` og dets data som `@data/…`.
33
+ - `defaults/`: sitets standarddele, det et site har, når dets `src/site/` ikke har en fil af samme navn: samlingerne og felterne, startskærmen, reglerne, *Virksomheden*, farverne, teksterne m.m.
34
+ - `worker/`: sitets Worker, den samme for alle sites (`index.js` er dens `main`): login, det, editoren spørger GitHub om, kopien i R2, samtykkerne, adresserne, der ikke findes, de planlagte, notifikationerne og appenes del.
35
+
36
+ ## Det, sitet skal have
37
+
38
+ - **`src/site/`**, som pakken tager som `@site`, og kun derfra; en fil, sitet ikke har, er pakkens i `defaults/`:
39
+ - `config.ts` og `worker.js` skal sitet selv have (`config.ts` med `defineSite` fra `@morphemecms/cms/site/defineSite.mjs`: kun det, der er sitets eget); resten kan det have for at give mere end standarden (som standardens fra `@morphemecms/cms/defaults/<fil>` med sit eget lagt til).
40
+ - `@site/editor`: `collections`, `groups`, `lists`, `icons`, `siteName`, `companyParts`, `blockParts`, `relationsOf`, `usedBy`, `usesOf`, `countsOf`, `whatIsAt`, `testimonialsOf`, `siteOf`, `fixedPages`, `everyFixedPage`, `Texts`, `sectionLooks`, `headingLooks` og `config`, og typerne `Props` og `SiteData`.
41
+ - `@site/config`: sitets navn, domæne, GitHub-repo og mapper.
42
+ - `@site/worker` (til Workeren): `apps`, `contact`, `moved`, `standard`, `oldAddresses` (sitets videresendelser fra gamle adresser, `{ ids, paths }`) og appenes del af Workeren (`appWorkers`, `appTexts`).
43
+ - **`@site`** for `src/site/`, ellers `defaults/`: i Vite (`siteFile` i `themePlugin`, `site/theme.mjs`, brugt af `astro.mjs` og `scripts/check-content.mjs`, der indlæser reglerne med Vite) og i TypeScript (`paths` i `tsconfig.json`: `"@site/*": ["./src/site/*", "./node_modules/@morphemecms/cms/defaults/*"]`); til Workeren `@site/config` og `@site/worker` i `alias` i `wrangler.jsonc`, med `main` sat til pakkens `worker/index.js`.
44
+ - **Sitets egne blokke** i appenes `blocks/<type>/` (`src/apps/<app>/blocks/<type>/`), hver med `index.tsx` (`defineBlock` fra `@morphemecms/cms/src/blocks`), `view.ts` og `load.ts` (det, blokken viser, i editoren og på sitet) og `View.tsx` (tegningen, begge steder). Pakken finder dem selv.
45
+ - **Et standardtema**, som alle sitets temaer bygger på, med standardblokkenes udseende (`blocks/<type>/View.tsx`, én tegning til sitet og editoren), som pakken selv finder (dette site: `packages/editor/theme/`, `packages/editor/src/standard/siteLooks.ts` og `packages/editor/src/standard/themeBlocks.ts`).
46
+ - **Siderne** er pakkens (`pages/`, sat ind af `siteConfig()` i `astro.mjs`): sitets sider, bloggen, 404, `/ny/` og editoren (siden, der viser `src/App.tsx`, manifestet, `version.json` og billederne, sitets egen kode bruger). Sitets `astro.config.mjs` er kun `export default await siteConfig()`, og `src/content.config.ts` henter samlingerne fra `site/content.config`.
47
+ - **Standardblokkenes stil:** `blocks.css` i standardtemaet (dette site: `packages/editor/theme/styles/blocks.css`), importeret i hvert temas CSS, og variablerne `--block-*` sat til temaets farver og former.
48
+ - **Kommandoen `morpheme`** (`bin/morpheme.mjs`, pakkens `scripts/`), kørt fra sitets rod i dets `package.json`: `images` (billedernes mindre størrelser og videoernes stillbilleder, før `dev` og `build`), `after-build` (det, Workeren og editoren læser i `dist/`), `check:content` (indholdet efter editorens regler), `check:editor` (siderne kommer tilbage uændret), `check:worker`, `check:screens`, `check:themes`, `check:demo` (CMS'ets demo, `demo/`, virker med CMS'et), `compare-html`, `app-workers`, `app-screenshots`, `theme-screenshots` (billederne af hvert tema, taget af demoen) og `editor-icons`.
49
+ - **Layoutene til sider og blogindlæg** markerer med `data-editor`, hvad *Forhåndsvis* sætter ind (`src/pagePreview.tsx`): `heading`, `image`, `text` og evt. `end` med `data-editor-block` (en blok, der slutter teksten, står dér).
50
+ - **Afhængighederne** i `peerDependencies`: alt, pakkens kode henter (Astro og dens integrationer, React, Milkdown, Phosphor, Tailwind, motion, standardtemaets skrift, yaml og det, der laver Markdown i *Forhåndsvis*: unified, remark og rehype), og det, kommandoerne bruger (Vite, esbuild, sharp, Wrangler, og til tjekkene i en browser Playwright og jsdom). Starterens `package.json` har dem alle (`scripts/starter.mjs`).
51
+ - **Starteren** (`starter/`): det, et nyt site begynder med, tjekket som et site med pakken fra `npm pack` (`scripts/check-starter.mjs`).
package/astro.mjs CHANGED
@@ -1,162 +1,162 @@
1
- // The Astro config of a site with the CMS: `export default await siteConfig()` in the site's astro.config.mjs. Everything
2
- // a site is built with: its address and language (src/site/config.ts), Markdown with responsive pictures, internal links
3
- // and videos, React, the sitemap, each page's Content-Security-Policy, what the apps make after the build, the licences,
4
- // the CMS's pages (pages/, added as routes) and the Vite plugins and aliases (@site, @data, @saturn, @theme). The site is
5
- // its root, the working directory; this package is where this file is.
6
- import { defineConfig } from 'astro/config';
7
- import sitemap from '@astrojs/sitemap';
8
- import react from '@astrojs/react';
9
- import tailwindcss from '@tailwindcss/vite';
10
- import { unified } from '@astrojs/markdown-remark';
11
- import rehypeRaw from 'rehype-raw';
12
- import fs from 'node:fs';
13
- import { join } from 'node:path';
14
- import { fileURLToPath, pathToFileURL } from 'node:url';
15
- import { config } from './site/siteConfig.mjs';
16
- import { withSiteModules } from './site/siteModules.mjs';
17
- import { rehypeResponsiveImages } from './site/images.mjs';
18
- import { linksDigest, rehypeAutoLinks } from './site/autolinks.mjs';
19
- import { rehypeVideo } from './lib/video.mjs';
20
- import { csp, joined } from './lib/csp.mjs';
21
- import { appBuilds, appFoldersPlugin } from './lib/apps.mjs';
22
- import { isNoindex } from './site/noindex.mjs';
23
- import { activeTheme, aliases, iconPackLicenses, STANDARD_THEME, themeIcon, themePlugin } from './site/theme.mjs';
24
- import { licensesIntegration, siteOwners } from './lib/licenses.mjs';
25
-
26
- const ROOT = `${process.cwd()}/`;
27
-
28
- /** The CMS's pages, by their address (pages/ in this package), added to the site as routes. */
29
- const PAGES = {
30
- '/': 'index.astro',
31
- '/[...slug]': '[...slug].astro',
32
- '/404': '404.astro',
33
- '/blog': 'blog/index.astro',
34
- '/blog/kategori/[category]': 'blog/kategori/[category].astro',
35
- '/ny': 'ny.astro',
36
- '/rss.xml': 'rss.xml.js',
37
- '/robots.txt': 'robots.txt.js',
38
- '/_headers': 'headers.js',
39
- '/editor': 'editor/index.astro',
40
- '/editor/code-images.json': 'editor/code-images.json.js',
41
- '/editor/manifest.webmanifest': 'editor/manifest.webmanifest.js',
42
- '/editor/sw.js': 'editor/sw.js.js',
43
- '/editor/thumbnails.json': 'editor/thumbnails.json.js',
44
- '/editor/version.json': 'editor/version.json.js',
45
- };
46
-
47
- /** @returns {import('astro').AstroIntegration} */
48
- const pagesIntegration = () => ({
49
- name: 'morpheme-pages',
50
- hooks: {
51
- 'astro:config:setup': ({ injectRoute }) => {
52
- for (const [pattern, file] of Object.entries(PAGES))
53
- injectRoute({ pattern, entrypoint: fileURLToPath(new URL(`pages/${file}`, import.meta.url)) });
54
- },
55
- },
56
- });
57
-
58
- /** The themes the site is built with: the one in use, and the standard theme it builds on. */
59
- const themesBuilt = () => [...new Set([activeTheme(), STANDARD_THEME])];
60
-
61
- /** @param {string} file */
62
- const frontMatter = (file) => fs.readFileSync(file, 'utf8').match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1] ?? '';
63
-
64
- // Pages and posts that name another page as the original (`canonical`), are not for search engines
65
- // (`noindex: true`) or only open on their address (Skjult, `status: "unlisted"`, packages/editor/lib/status.mjs):
66
- // not in the sitemap. Drafts are not built, so not in it either.
67
- /** @param {string} fm @param {string} name */
68
- const field = (fm, name) => fm.match(new RegExp(`^${name}: *"?(.*?)"?\\s*$`, 'm'))?.[1] ?? '';
69
- /** The .md files in a folder (none when the site has no folder of them yet). @param {string} dir */
70
- const markdown = (dir) =>
71
- fs.existsSync(dir) ? fs.readdirSync(dir, { recursive: true, encoding: 'utf8' }).filter((f) => f.endsWith('.md')) : [];
72
- const elsewhere = [
73
- ...markdown('src/content/pages').map((f) => {
74
- const fm = frontMatter(`src/content/pages/${f}`);
75
- return [field(fm, 'path') || `/${f.slice(0, -3)}/`, fm];
76
- }),
77
- ...markdown('src/content/blog').map((f) => [`/${f.slice(0, -3)}/`, frontMatter(`src/content/blog/${f}`)]),
78
- ]
79
- .filter(
80
- ([own, fm]) =>
81
- (field(fm, 'canonical') && field(fm, 'canonical') !== own) || field(fm, 'noindex') === 'true' || field(fm, 'status') === 'unlisted',
82
- )
83
- .map(([own]) => own);
84
- // The blog page (src/data/standard-pages.json) is shown at /blog/, so its canonical URL (another than /blog/) or noindex
85
- // is /blog/'s.
86
- const blogPath = JSON.parse(fs.readFileSync('src/data/standard-pages.json', 'utf8')).blog;
87
- const blogFile = markdown('src/content/pages').find(
88
- (f) => (field(frontMatter(`src/content/pages/${f}`), 'path') || `/${f.slice(0, -3)}/`) === blogPath,
89
- );
90
- const blogPage = blogFile ? frontMatter(`src/content/pages/${blogFile}`) : '';
91
- if ((field(blogPage, 'canonical') && ![blogPath, '/blog/'].includes(field(blogPage, 'canonical'))) || field(blogPage, 'noindex') === 'true')
92
- elsewhere.push('/blog/');
93
-
94
- /** The site's Astro config. */
95
- export async function siteConfig() {
96
- // What the site's apps load from elsewhere (site/siteCsp.mjs).
97
- const { siteSources } = await import('./site/siteCsp.mjs');
98
- return defineConfig({
99
- site: `https://${config.domain}`,
100
- // Every address ends in a slash (imported ones too); keep them identical.
101
- trailingSlash: 'always',
102
- // Inline the (small) stylesheet so it does not block the first render.
103
- build: { format: 'directory', inlineStylesheets: 'always' },
104
- markdown: {
105
- // Images inside pages and posts: responsive srcset, width/height, lazy loading.
106
- // Words from src/data/internal-links.json become internal links.
107
- // Videos from YouTube and Vimeo are links until played (packages/editor/lib/video.mjs).
108
- // The prose column is at most ~720px wide.
109
- processor: unified({
110
- rehypePlugins: [
111
- // HTML written in the Markdown (tables, iframes, links) as elements before the plugins below,
112
- // so they see it too (Astro would parse it only after them).
113
- rehypeRaw,
114
- [rehypeResponsiveImages, { sizes: '(min-width: 800px) 720px, calc(100vw - 40px)' }],
115
- // Internal links from the keywords (src/data/internal-links.json); with what they are made from, so the pages
116
- // rendered before (node_modules/.astro) are rendered again when it changes (linksDigest).
117
- [rehypeAutoLinks, { digest: linksDigest() }],
118
- // Videos load only when played (nothing from Google or Vimeo before that), with the theme's play button.
119
- [rehypeVideo, { play: themeIcon('play-fill') }],
120
- ],
121
- }),
122
- },
123
- integrations: [
124
- // The CMS's pages (pages/): the standard pages, the posts and pages, the blog, RSS and the editor.
125
- pagesIntegration(),
126
- // client:interact: hydrate an island on first touch/hover/focus (site/directives/interact.mjs).
127
- {
128
- name: 'client-interact-directive',
129
- hooks: {
130
- 'astro:config:setup': ({ addClientDirective }) =>
131
- addClientDirective({ name: 'interact', entrypoint: fileURLToPath(new URL('site/directives/interact.mjs', import.meta.url)) }),
132
- },
133
- },
134
- // React is only used for interactive islands (Motion), per design-taste-frontend.
135
- react(),
136
- sitemap({
137
- filter: (page) => !isNoindex(new URL(page).pathname) && !elsewhere.includes(new URL(page).pathname),
138
- }),
139
- // Each page's Content-Security-Policy, after it is built: only its own scripts run (packages/editor/lib/csp.mjs),
140
- // with what the site's measuring and its apps load from elsewhere (packages/editor/site/siteCsp.mjs).
141
- csp({ site: joined(...siteSources()) }),
142
- // What each installed app makes after the build (its build.mjs, in dist/_apps/<app>/: Cookiescanner's scan.json).
143
- appBuilds(ROOT),
144
- // The licences of the third-party work in what is downloaded (the browser's bundle, the pages' styles and fonts), of
145
- // the icon sets the system offers (packages/editor/site/icons.mjs), and of the apps and the themes with what they bring, in
146
- // dist/editor/licenses.json for "Licenser" under "Indstillinger" (packages/editor/lib/licenses.mjs).
147
- licensesIntegration({
148
- root: ROOT,
149
- iconPacks: iconPackLicenses,
150
- owners: () =>
151
- withSiteModules((load) => siteOwners(ROOT, async (id) => (await load(`/src/apps/${id}/index.ts`)).default, themesBuilt())),
152
- }),
153
- ],
154
- vite: {
155
- // The editor (packages/editor/) takes this site from src/site/ as @site (packages/editor/defaults/editor.ts), and the
156
- // site and the editor take the theme in use (src/data/theme.json) as @theme: its file, else the standard
157
- // theme's (themePlugin, packages/editor/site/theme.mjs); and what is in each app's folder (appFoldersPlugin).
158
- plugins: [themePlugin(), appFoldersPlugin(ROOT), tailwindcss()],
159
- resolve: { alias: aliases() },
160
- },
161
- });
162
- }
1
+ // The Astro config of a site with the CMS: `export default await siteConfig()` in the site's astro.config.mjs. Everything
2
+ // a site is built with: its address and language (src/site/config.ts), Markdown with responsive pictures, internal links
3
+ // and videos, React, the sitemap, each page's Content-Security-Policy, what the apps make after the build, the licences,
4
+ // the CMS's pages (pages/, added as routes) and the Vite plugins and aliases (@site, @data, @saturn, @theme). The site is
5
+ // its root, the working directory; this package is where this file is.
6
+ import { defineConfig } from 'astro/config';
7
+ import sitemap from '@astrojs/sitemap';
8
+ import react from '@astrojs/react';
9
+ import tailwindcss from '@tailwindcss/vite';
10
+ import { unified } from '@astrojs/markdown-remark';
11
+ import rehypeRaw from 'rehype-raw';
12
+ import fs from 'node:fs';
13
+ import { join } from 'node:path';
14
+ import { fileURLToPath, pathToFileURL } from 'node:url';
15
+ import { config } from './site/siteConfig.mjs';
16
+ import { withSiteModules } from './site/siteModules.mjs';
17
+ import { rehypeResponsiveImages } from './site/images.mjs';
18
+ import { linksDigest, rehypeAutoLinks } from './site/autolinks.mjs';
19
+ import { rehypeVideo } from './lib/video.mjs';
20
+ import { csp, joined } from './lib/csp.mjs';
21
+ import { appBuilds, appFoldersPlugin } from './lib/apps.mjs';
22
+ import { isNoindex } from './site/noindex.mjs';
23
+ import { activeTheme, aliases, iconPackLicenses, STANDARD_THEME, themeIcon, themePlugin } from './site/theme.mjs';
24
+ import { licensesIntegration, siteOwners } from './lib/licenses.mjs';
25
+
26
+ const ROOT = `${process.cwd()}/`;
27
+
28
+ /** The CMS's pages, by their address (pages/ in this package), added to the site as routes. */
29
+ const PAGES = {
30
+ '/': 'index.astro',
31
+ '/[...slug]': '[...slug].astro',
32
+ '/404': '404.astro',
33
+ '/blog': 'blog/index.astro',
34
+ '/blog/kategori/[category]': 'blog/kategori/[category].astro',
35
+ '/ny': 'ny.astro',
36
+ '/rss.xml': 'rss.xml.js',
37
+ '/robots.txt': 'robots.txt.js',
38
+ '/_headers': 'headers.js',
39
+ '/editor': 'editor/index.astro',
40
+ '/editor/code-images.json': 'editor/code-images.json.js',
41
+ '/editor/manifest.webmanifest': 'editor/manifest.webmanifest.js',
42
+ '/editor/sw.js': 'editor/sw.js.js',
43
+ '/editor/thumbnails.json': 'editor/thumbnails.json.js',
44
+ '/editor/version.json': 'editor/version.json.js',
45
+ };
46
+
47
+ /** @returns {import('astro').AstroIntegration} */
48
+ const pagesIntegration = () => ({
49
+ name: 'morpheme-pages',
50
+ hooks: {
51
+ 'astro:config:setup': ({ injectRoute }) => {
52
+ for (const [pattern, file] of Object.entries(PAGES))
53
+ injectRoute({ pattern, entrypoint: fileURLToPath(new URL(`pages/${file}`, import.meta.url)) });
54
+ },
55
+ },
56
+ });
57
+
58
+ /** The themes the site is built with: the one in use, and the standard theme it builds on. */
59
+ const themesBuilt = () => [...new Set([activeTheme(), STANDARD_THEME])];
60
+
61
+ /** @param {string} file */
62
+ const frontMatter = (file) => fs.readFileSync(file, 'utf8').match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1] ?? '';
63
+
64
+ // Pages and posts that name another page as the original (`canonical`), are not for search engines
65
+ // (`noindex: true`) or only open on their address (Skjult, `status: "unlisted"`, packages/editor/lib/status.mjs):
66
+ // not in the sitemap. Drafts are not built, so not in it either.
67
+ /** @param {string} fm @param {string} name */
68
+ const field = (fm, name) => fm.match(new RegExp(`^${name}: *"?(.*?)"?\\s*$`, 'm'))?.[1] ?? '';
69
+ /** The .md files in a folder (none when the site has no folder of them yet). @param {string} dir */
70
+ const markdown = (dir) =>
71
+ fs.existsSync(dir) ? fs.readdirSync(dir, { recursive: true, encoding: 'utf8' }).filter((f) => f.endsWith('.md')) : [];
72
+ const elsewhere = [
73
+ ...markdown('src/content/pages').map((f) => {
74
+ const fm = frontMatter(`src/content/pages/${f}`);
75
+ return [field(fm, 'path') || `/${f.slice(0, -3)}/`, fm];
76
+ }),
77
+ ...markdown('src/content/blog').map((f) => [`/${f.slice(0, -3)}/`, frontMatter(`src/content/blog/${f}`)]),
78
+ ]
79
+ .filter(
80
+ ([own, fm]) =>
81
+ (field(fm, 'canonical') && field(fm, 'canonical') !== own) || field(fm, 'noindex') === 'true' || field(fm, 'status') === 'unlisted',
82
+ )
83
+ .map(([own]) => own);
84
+ // The blog page (src/data/standard-pages.json) is shown at /blog/, so its canonical URL (another than /blog/) or noindex
85
+ // is /blog/'s.
86
+ const blogPath = JSON.parse(fs.readFileSync('src/data/standard-pages.json', 'utf8')).blog;
87
+ const blogFile = markdown('src/content/pages').find(
88
+ (f) => (field(frontMatter(`src/content/pages/${f}`), 'path') || `/${f.slice(0, -3)}/`) === blogPath,
89
+ );
90
+ const blogPage = blogFile ? frontMatter(`src/content/pages/${blogFile}`) : '';
91
+ if ((field(blogPage, 'canonical') && ![blogPath, '/blog/'].includes(field(blogPage, 'canonical'))) || field(blogPage, 'noindex') === 'true')
92
+ elsewhere.push('/blog/');
93
+
94
+ /** The site's Astro config. */
95
+ export async function siteConfig() {
96
+ // What the site's apps load from elsewhere (site/siteCsp.mjs).
97
+ const { siteSources } = await import('./site/siteCsp.mjs');
98
+ return defineConfig({
99
+ site: `https://${config.domain}`,
100
+ // Every address ends in a slash (imported ones too); keep them identical.
101
+ trailingSlash: 'always',
102
+ // Inline the (small) stylesheet so it does not block the first render.
103
+ build: { format: 'directory', inlineStylesheets: 'always' },
104
+ markdown: {
105
+ // Images inside pages and posts: responsive srcset, width/height, lazy loading.
106
+ // Words from src/data/internal-links.json become internal links.
107
+ // Videos from YouTube and Vimeo are links until played (packages/editor/lib/video.mjs).
108
+ // The prose column is at most ~720px wide.
109
+ processor: unified({
110
+ rehypePlugins: [
111
+ // HTML written in the Markdown (tables, iframes, links) as elements before the plugins below,
112
+ // so they see it too (Astro would parse it only after them).
113
+ rehypeRaw,
114
+ [rehypeResponsiveImages, { sizes: '(min-width: 800px) 720px, calc(100vw - 40px)' }],
115
+ // Internal links from the keywords (src/data/internal-links.json); with what they are made from, so the pages
116
+ // rendered before (node_modules/.astro) are rendered again when it changes (linksDigest).
117
+ [rehypeAutoLinks, { digest: linksDigest() }],
118
+ // Videos load only when played (nothing from Google or Vimeo before that), with the theme's play button.
119
+ [rehypeVideo, { play: themeIcon('play-fill') }],
120
+ ],
121
+ }),
122
+ },
123
+ integrations: [
124
+ // The CMS's pages (pages/): the standard pages, the posts and pages, the blog, RSS and the editor.
125
+ pagesIntegration(),
126
+ // client:interact: hydrate an island on first touch/hover/focus (site/directives/interact.mjs).
127
+ {
128
+ name: 'client-interact-directive',
129
+ hooks: {
130
+ 'astro:config:setup': ({ addClientDirective }) =>
131
+ addClientDirective({ name: 'interact', entrypoint: fileURLToPath(new URL('site/directives/interact.mjs', import.meta.url)) }),
132
+ },
133
+ },
134
+ // React is only used for interactive islands (Motion), per design-taste-frontend.
135
+ react(),
136
+ sitemap({
137
+ filter: (page) => !isNoindex(new URL(page).pathname) && !elsewhere.includes(new URL(page).pathname),
138
+ }),
139
+ // Each page's Content-Security-Policy, after it is built: only its own scripts run (packages/editor/lib/csp.mjs),
140
+ // with what the site's measuring and its apps load from elsewhere (packages/editor/site/siteCsp.mjs).
141
+ csp({ site: joined(...siteSources()) }),
142
+ // What each installed app makes after the build (its build.mjs, in dist/_apps/<app>/: Cookiescanner's scan.json).
143
+ appBuilds(ROOT),
144
+ // The licences of the third-party work in what is downloaded (the browser's bundle, the pages' styles and fonts), of
145
+ // the icon sets the system offers (packages/editor/site/icons.mjs), and of the apps and the themes with what they bring, in
146
+ // dist/editor/licenses.json for "Licenser" under "Indstillinger" (packages/editor/lib/licenses.mjs).
147
+ licensesIntegration({
148
+ root: ROOT,
149
+ iconPacks: iconPackLicenses,
150
+ owners: () =>
151
+ withSiteModules((load) => siteOwners(ROOT, async (id) => (await load(`/src/apps/${id}/index.ts`)).default, themesBuilt())),
152
+ }),
153
+ ],
154
+ vite: {
155
+ // The editor (packages/editor/) takes this site from src/site/ as @site (packages/editor/defaults/editor.ts), and the
156
+ // site and the editor take the theme in use (src/data/theme.json) as @theme: its file, else the standard
157
+ // theme's (themePlugin, packages/editor/site/theme.mjs); and what is in each app's folder (appFoldersPlugin).
158
+ plugins: [themePlugin(), appFoldersPlugin(ROOT), tailwindcss()],
159
+ resolve: { alias: aliases() },
160
+ },
161
+ });
162
+ }
package/bin/morpheme.mjs CHANGED
@@ -1,38 +1,38 @@
1
- #!/usr/bin/env node
2
- // The CMS's commands for a site, run from the site's root (its package.json's scripts): `morpheme <command> [args]`.
3
- // Each runs this package's scripts (scripts/) in turn, on the site in the working directory, and stops at the first that
4
- // fails.
5
- import { spawnSync } from 'node:child_process';
6
- import { fileURLToPath } from 'node:url';
7
-
8
- const COMMANDS = {
9
- /** Before the site is built or served: the pictures' smaller sizes and the videos' stills. */
10
- images: ['responsive-images', 'video-thumbnails'],
11
- /** After the site is built: what the Worker and the editor read from dist/. */
12
- 'after-build': ['scheduled-list', 'link-counts', 'page-colors'],
13
- 'check:content': ['check-content'],
14
- 'check:editor': ['editor-roundtrip'],
15
- 'check:worker': ['check-worker', 'check-consent'],
16
- 'check:screens': ['editor-screens'],
17
- 'check:themes': ['check-themes'],
18
- 'check:demo': ['check-demo'],
19
- 'compare-html': ['compare-html'],
20
- 'app-workers': ['app-workers'],
21
- 'app-screenshots': ['app-screenshots'],
22
- 'theme-screenshots': ['theme-screenshots'],
23
- 'editor-icons': ['editor-icons'],
24
- };
25
-
26
- // Node warns that node:sqlite is experimental, which the consent log's check uses as D1.
27
- const QUIET = new Set(['check-consent']);
28
-
29
- const [command, ...args] = process.argv.slice(2);
30
- if (!COMMANDS[command]) {
31
- console.error(`Brug: morpheme <kommando> […], hvor kommandoen er en af: ${Object.keys(COMMANDS).join(', ')}.`);
32
- process.exit(1);
33
- }
34
- for (const script of COMMANDS[command]) {
35
- const file = fileURLToPath(new URL(`../scripts/${script}.mjs`, import.meta.url));
36
- const { status } = spawnSync(process.execPath, [...(QUIET.has(script) ? ['--no-warnings'] : []), file, ...args], { stdio: 'inherit' });
37
- if (status !== 0) process.exit(status ?? 1);
38
- }
1
+ #!/usr/bin/env node
2
+ // The CMS's commands for a site, run from the site's root (its package.json's scripts): `morpheme <command> [args]`.
3
+ // Each runs this package's scripts (scripts/) in turn, on the site in the working directory, and stops at the first that
4
+ // fails.
5
+ import { spawnSync } from 'node:child_process';
6
+ import { fileURLToPath } from 'node:url';
7
+
8
+ const COMMANDS = {
9
+ /** Before the site is built or served: the pictures' smaller sizes and the videos' stills. */
10
+ images: ['responsive-images', 'video-thumbnails'],
11
+ /** After the site is built: what the Worker and the editor read from dist/. */
12
+ 'after-build': ['scheduled-list', 'link-counts', 'page-colors'],
13
+ 'check:content': ['check-content'],
14
+ 'check:editor': ['editor-roundtrip'],
15
+ 'check:worker': ['check-worker', 'check-consent', 'check-store'],
16
+ 'check:screens': ['editor-screens'],
17
+ 'check:themes': ['check-themes'],
18
+ 'check:demo': ['check-demo'],
19
+ 'compare-html': ['compare-html'],
20
+ 'app-workers': ['app-workers'],
21
+ 'app-screenshots': ['app-screenshots'],
22
+ 'theme-screenshots': ['theme-screenshots'],
23
+ 'editor-icons': ['editor-icons'],
24
+ };
25
+
26
+ // Node warns that node:sqlite is experimental, which the consent log's check uses as D1.
27
+ const QUIET = new Set(['check-consent']);
28
+
29
+ const [command, ...args] = process.argv.slice(2);
30
+ if (!COMMANDS[command]) {
31
+ console.error(`Brug: morpheme <kommando> […], hvor kommandoen er en af: ${Object.keys(COMMANDS).join(', ')}.`);
32
+ process.exit(1);
33
+ }
34
+ for (const script of COMMANDS[command]) {
35
+ const file = fileURLToPath(new URL(`../scripts/${script}.mjs`, import.meta.url));
36
+ const { status } = spawnSync(process.execPath, [...(QUIET.has(script) ? ['--no-warnings'] : []), file, ...args], { stdio: 'inherit' });
37
+ if (status !== 0) process.exit(status ?? 1);
38
+ }
package/client.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- // The types a site with the CMS has besides its own (`/// <reference types="@morphemecms/cms/client" />` in its
2
- // src/env.d.ts): the modules the build makes and the directive it adds (astro.mjs).
3
- /// <reference path="./src/virtual.d.ts" />
4
-
5
- declare module 'astro' {
6
- interface AstroClientDirectives {
7
- 'client:interact'?: boolean;
8
- }
9
- }
10
- export {};
1
+ // The types a site with the CMS has besides its own (`/// <reference types="@morphemecms/cms/client" />` in its
2
+ // src/env.d.ts): the modules the build makes and the directive it adds (astro.mjs).
3
+ /// <reference path="./src/virtual.d.ts" />
4
+
5
+ declare module 'astro' {
6
+ interface AstroClientDirectives {
7
+ 'client:interact'?: boolean;
8
+ }
9
+ }
10
+ export {};