@morphemecms/cms 0.1.0 → 0.1.1-next-20261103223426

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 (888) hide show
  1. package/CHANGELOG.md +7 -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 +139 -139
  376. package/lib/blocks.mjs +90 -90
  377. package/lib/colors.ts +86 -86
  378. package/lib/contactBar.ts +18 -18
  379. package/lib/cookieCategories.mjs +28 -28
  380. package/lib/crop.mjs +83 -83
  381. package/lib/csp.mjs +130 -130
  382. package/lib/cspSources.mjs +60 -60
  383. package/lib/dynamic-colors.ts +426 -426
  384. package/lib/git.mjs +64 -64
  385. package/lib/hooks.ts +51 -51
  386. package/lib/inline.ts +20 -20
  387. package/lib/license-texts/Apache-2.0.txt +190 -190
  388. package/lib/license-texts/BSD-2-Clause.txt +24 -24
  389. package/lib/license-texts/BSD-3-Clause.txt +28 -28
  390. package/lib/license-texts/ISC.txt +15 -15
  391. package/lib/license-texts/MIT.txt +21 -21
  392. package/lib/licenses.mjs +683 -683
  393. package/lib/markdown.ts +42 -42
  394. package/lib/motion-schemes.mjs +5 -5
  395. package/lib/motion.ts +131 -131
  396. package/lib/notice.mjs +34 -34
  397. package/lib/scheduled.mjs +37 -37
  398. package/lib/snackbar.ts +149 -149
  399. package/lib/status.mjs +18 -18
  400. package/lib/svg.mjs +231 -231
  401. package/lib/text-colors.mjs +43 -43
  402. package/lib/video-id.mjs +72 -72
  403. package/lib/video.mjs +91 -91
  404. package/package.json +136 -131
  405. package/pages/404.astro +10 -10
  406. package/pages/[...slug].astro +51 -51
  407. package/pages/_headers.txt +31 -31
  408. package/pages/blog/index.astro +10 -10
  409. package/pages/blog/kategori/[category].astro +18 -18
  410. package/pages/editor/code-images.json.js +25 -25
  411. package/pages/editor/index.astro +75 -75
  412. package/pages/editor/manifest.webmanifest.js +23 -23
  413. package/pages/editor/sw.js +33 -33
  414. package/pages/editor/sw.js.js +4 -4
  415. package/pages/editor/thumbnails.json.js +21 -21
  416. package/pages/editor/version.json.js +22 -22
  417. package/pages/headers.js +4 -4
  418. package/pages/index.astro +10 -10
  419. package/pages/ny.astro +6 -6
  420. package/pages/robots.txt.js +3 -3
  421. package/pages/rss.xml.js +20 -20
  422. package/scripts/app-screenshots.mjs +164 -164
  423. package/scripts/app-workers.mjs +6 -6
  424. package/scripts/bin.mjs +12 -12
  425. package/scripts/built-site.mjs +99 -99
  426. package/scripts/check-consent.mjs +113 -113
  427. package/scripts/check-content.mjs +149 -149
  428. package/scripts/check-demo.mjs +24 -24
  429. package/scripts/check-themes.mjs +45 -45
  430. package/scripts/check-worker.mjs +569 -569
  431. package/scripts/compare-html.mjs +81 -81
  432. package/scripts/declarations.mjs +10 -0
  433. package/scripts/declarations.test.mjs +32 -0
  434. package/scripts/demo-site.mjs +42 -42
  435. package/scripts/editor-icons.mjs +56 -56
  436. package/scripts/editor-roundtrip.mjs +134 -134
  437. package/scripts/editor-screens.mjs +101 -101
  438. package/scripts/git-env.mjs +9 -9
  439. package/scripts/icon-packs.mjs +151 -151
  440. package/scripts/link-counts.mjs +22 -22
  441. package/scripts/page-colors.mjs +42 -42
  442. package/scripts/releases.mjs +80 -80
  443. package/scripts/responsive-images.mjs +94 -94
  444. package/scripts/scheduled-list.mjs +15 -15
  445. package/scripts/theme-screenshots.mjs +88 -88
  446. package/scripts/types.mjs +17 -21
  447. package/scripts/video-thumbnails.mjs +89 -89
  448. package/scripts/worker-modules.mjs +34 -34
  449. package/site/appCookies.mjs +74 -74
  450. package/site/apps.ts +21 -21
  451. package/site/autolinks.mjs +200 -200
  452. package/site/blockScripts.ts +31 -31
  453. package/site/categories.ts +16 -16
  454. package/site/consent.ts +26 -26
  455. package/site/content.config.ts +84 -84
  456. package/site/content.ts +104 -104
  457. package/site/cookieList.ts +17 -17
  458. package/site/defineSite.mjs +136 -136
  459. package/site/directives/interact.mjs +31 -31
  460. package/site/editor-version.mjs +26 -26
  461. package/site/fill.ts +13 -13
  462. package/site/format.ts +11 -11
  463. package/site/home.ts +66 -66
  464. package/site/iconPacks.mjs +43 -43
  465. package/site/icons.mjs +605 -605
  466. package/site/images.mjs +157 -157
  467. package/site/motion.ts +13 -13
  468. package/site/noindex.mjs +21 -21
  469. package/site/pageColors.ts +110 -110
  470. package/site/popups.ts +98 -98
  471. package/site/schema.ts +189 -189
  472. package/site/sections.ts +3 -3
  473. package/site/seo.ts +28 -28
  474. package/site/site.ts +76 -76
  475. package/site/siteConfig.mjs +8 -8
  476. package/site/siteCsp.mjs +75 -75
  477. package/site/siteModules.mjs +27 -27
  478. package/site/standardPages.ts +59 -59
  479. package/site/testimonials.ts +48 -48
  480. package/site/text.ts +43 -43
  481. package/site/theme.mjs +472 -472
  482. package/site/tracking.client.ts +225 -225
  483. package/site/tracking.ts +9 -9
  484. package/src/ActionParts.tsx +205 -205
  485. package/src/Advanced.tsx +152 -152
  486. package/src/App.tsx +904 -904
  487. package/src/AppList.tsx +1345 -1345
  488. package/src/BlockDialog.tsx +360 -360
  489. package/src/BlockParts.tsx +652 -652
  490. package/src/BlockSettings.tsx +533 -533
  491. package/src/BrandForm.tsx +164 -164
  492. package/src/Colors.tsx +476 -476
  493. package/src/CommunicationParts.tsx +199 -199
  494. package/src/CompanyForm.tsx +209 -209
  495. package/src/Consents.tsx +175 -175
  496. package/src/ContainmentParts.tsx +185 -185
  497. package/src/Crop.tsx +152 -152
  498. package/src/DataForm.tsx +434 -434
  499. package/src/Deleted.tsx +177 -177
  500. package/src/EntryForm.tsx +740 -740
  501. package/src/FileView.tsx +30 -30
  502. package/src/FormFrame.tsx +237 -237
  503. package/src/Keywords.tsx +225 -225
  504. package/src/Library.tsx +1563 -1563
  505. package/src/Licenses.tsx +336 -336
  506. package/src/LinkSheet.tsx +138 -138
  507. package/src/MarkdownEditor.tsx +1075 -1075
  508. package/src/Media.tsx +677 -677
  509. package/src/NavigationParts.tsx +350 -350
  510. package/src/NavigationRestParts.tsx +247 -247
  511. package/src/Notifications.tsx +59 -59
  512. package/src/PagePicker.tsx +136 -136
  513. package/src/Parts.tsx +991 -991
  514. package/src/PartsShown.tsx +168 -168
  515. package/src/PickerParts.tsx +183 -183
  516. package/src/Redirects.tsx +450 -450
  517. package/src/Screen.tsx +184 -184
  518. package/src/SectionsField.tsx +65 -65
  519. package/src/SelectionParts.tsx +134 -134
  520. package/src/SeoScores.tsx +184 -184
  521. package/src/Sheet.tsx +35 -35
  522. package/src/ThemeStore.tsx +376 -376
  523. package/src/Tokens.tsx +346 -346
  524. package/src/Versions.tsx +214 -214
  525. package/src/addresses.ts +75 -75
  526. package/src/allIcons.ts +7 -7
  527. package/src/appFiles.ts +29 -29
  528. package/src/apps.ts +281 -281
  529. package/src/ask.tsx +123 -123
  530. package/src/blocks.ts +251 -251
  531. package/src/brand.ts +153 -153
  532. package/src/cache.ts +42 -42
  533. package/src/check.ts +285 -285
  534. package/src/checkSite.ts +256 -256
  535. package/src/consents.ts +26 -26
  536. package/src/cookieList.ts +70 -70
  537. package/src/countries.ts +59 -59
  538. package/src/deploy.ts +155 -155
  539. package/src/editor.css +602 -602
  540. package/src/examples.ts +85 -85
  541. package/src/fields.tsx +942 -942
  542. package/src/frontmatter.mjs +42 -42
  543. package/src/github.ts +376 -376
  544. package/src/i18n/da-DK/advanced.ts +28 -28
  545. package/src/i18n/da-DK/app.ts +71 -71
  546. package/src/i18n/da-DK/apps.ts +90 -90
  547. package/src/i18n/da-DK/blockSettings.ts +38 -38
  548. package/src/i18n/da-DK/blocks.ts +408 -408
  549. package/src/i18n/da-DK/check.ts +25 -25
  550. package/src/i18n/da-DK/colors.ts +64 -64
  551. package/src/i18n/da-DK/common.ts +118 -118
  552. package/src/i18n/da-DK/company.ts +24 -24
  553. package/src/i18n/da-DK/consents.ts +23 -23
  554. package/src/i18n/da-DK/forms.ts +116 -116
  555. package/src/i18n/da-DK/history.ts +35 -35
  556. package/src/i18n/da-DK/index.ts +49 -49
  557. package/src/i18n/da-DK/keywords.ts +19 -19
  558. package/src/i18n/da-DK/library.ts +135 -135
  559. package/src/i18n/da-DK/licenses.ts +25 -25
  560. package/src/i18n/da-DK/media.ts +79 -79
  561. package/src/i18n/da-DK/parts.ts +696 -696
  562. package/src/i18n/da-DK/preview.ts +13 -13
  563. package/src/i18n/da-DK/redirects.ts +51 -51
  564. package/src/i18n/da-DK/seo.ts +20 -20
  565. package/src/i18n/da-DK/text.ts +35 -35
  566. package/src/i18n/da-DK/theme.ts +41 -41
  567. package/src/i18n/en-US/advanced.ts +32 -32
  568. package/src/i18n/en-US/app.ts +84 -84
  569. package/src/i18n/en-US/apps.ts +134 -134
  570. package/src/i18n/en-US/blockSettings.ts +48 -48
  571. package/src/i18n/en-US/blocks.ts +441 -441
  572. package/src/i18n/en-US/check.ts +31 -31
  573. package/src/i18n/en-US/colors.ts +82 -82
  574. package/src/i18n/en-US/common.ts +144 -144
  575. package/src/i18n/en-US/company.ts +25 -25
  576. package/src/i18n/en-US/consents.ts +25 -25
  577. package/src/i18n/en-US/forms.ts +145 -145
  578. package/src/i18n/en-US/history.ts +43 -43
  579. package/src/i18n/en-US/index.ts +51 -51
  580. package/src/i18n/en-US/keywords.ts +24 -24
  581. package/src/i18n/en-US/library.ts +176 -176
  582. package/src/i18n/en-US/licenses.ts +36 -36
  583. package/src/i18n/en-US/media.ts +80 -80
  584. package/src/i18n/en-US/parts.ts +718 -718
  585. package/src/i18n/en-US/preview.ts +15 -15
  586. package/src/i18n/en-US/redirects.ts +66 -66
  587. package/src/i18n/en-US/seo.ts +26 -26
  588. package/src/i18n/en-US/text.ts +41 -41
  589. package/src/i18n/en-US/theme.ts +41 -41
  590. package/src/i18n/index.ts +124 -124
  591. package/src/icon.tsx +160 -160
  592. package/src/iconPacks.ts +89 -89
  593. package/src/images.ts +163 -163
  594. package/src/licenses.ts +79 -79
  595. package/src/markdown.mjs +204 -204
  596. package/src/nav.ts +68 -68
  597. package/src/notFound.ts +28 -28
  598. package/src/notifications.ts +223 -223
  599. package/src/pagePreview.tsx +204 -204
  600. package/src/r2Caching.ts +55 -55
  601. package/src/redirects.ts +149 -149
  602. package/src/registry.tsx +188 -188
  603. package/src/schema.ts +417 -417
  604. package/src/sections.mjs +303 -303
  605. package/src/seo.ts +333 -333
  606. package/src/shared.ts +44 -44
  607. package/src/sidebar.ts +31 -31
  608. package/src/site.ts +317 -317
  609. package/src/standard/Block.astro +19 -19
  610. package/src/standard/BlockSite.astro +18 -18
  611. package/src/standard/accordion/index.tsx +47 -47
  612. package/src/standard/accordion/load.ts +23 -23
  613. package/src/standard/accordion/shared.ts +15 -15
  614. package/src/standard/accordion/view.ts +32 -32
  615. package/src/standard/buttons/fields.ts +98 -98
  616. package/src/standard/buttons/index.tsx +23 -23
  617. package/src/standard/buttons/load.ts +34 -34
  618. package/src/standard/buttons/shared.ts +12 -12
  619. package/src/standard/buttons/view.ts +30 -30
  620. package/src/standard/cards/index.tsx +71 -71
  621. package/src/standard/cards/load.ts +17 -17
  622. package/src/standard/cards/shared.ts +27 -27
  623. package/src/standard/cards/view.ts +29 -29
  624. package/src/standard/checklist/index.tsx +27 -27
  625. package/src/standard/checklist/load.ts +5 -5
  626. package/src/standard/checklist/view.ts +13 -13
  627. package/src/standard/cookies/index.tsx +17 -17
  628. package/src/standard/cookies/list.ts +56 -56
  629. package/src/standard/cookies/load.ts +11 -11
  630. package/src/standard/cookies/shared.ts +20 -20
  631. package/src/standard/cookies/view.ts +28 -28
  632. package/src/standard/faq/index.tsx +29 -29
  633. package/src/standard/faq/load.ts +14 -14
  634. package/src/standard/faq/view.ts +21 -21
  635. package/src/standard/head.ts +23 -23
  636. package/src/standard/hero/fields.ts +48 -48
  637. package/src/standard/hero/index.tsx +57 -57
  638. package/src/standard/hero/load.ts +23 -23
  639. package/src/standard/hero/view.ts +38 -38
  640. package/src/standard/links/index.tsx +41 -41
  641. package/src/standard/links/load.ts +17 -17
  642. package/src/standard/links/view.ts +25 -25
  643. package/src/standard/list/index.tsx +50 -50
  644. package/src/standard/list/load.ts +5 -5
  645. package/src/standard/list/view.ts +18 -18
  646. package/src/standard/load.ts +7 -7
  647. package/src/standard/notice/index.tsx +30 -30
  648. package/src/standard/notice/load.ts +16 -16
  649. package/src/standard/notice/view.ts +10 -10
  650. package/src/standard/points/index.tsx +42 -42
  651. package/src/standard/points/load.ts +5 -5
  652. package/src/standard/points/view.ts +12 -12
  653. package/src/standard/posts/index.tsx +132 -132
  654. package/src/standard/posts/load.ts +36 -36
  655. package/src/standard/posts/shared.ts +21 -21
  656. package/src/standard/posts/view.ts +63 -63
  657. package/src/standard/pricecards/index.tsx +57 -57
  658. package/src/standard/pricecards/load.ts +11 -11
  659. package/src/standard/pricecards/view.ts +50 -50
  660. package/src/standard/sharedTexts.ts +6 -6
  661. package/src/standard/site.ts +124 -124
  662. package/src/standard/siteLooks.ts +19 -19
  663. package/src/standard/sites.ts +13 -13
  664. package/src/standard/steps/index.tsx +28 -28
  665. package/src/standard/steps/load.ts +5 -5
  666. package/src/standard/steps/view.ts +11 -11
  667. package/src/standard/testimonials/index.tsx +87 -87
  668. package/src/standard/testimonials/list.ts +43 -43
  669. package/src/standard/testimonials/load.ts +58 -58
  670. package/src/standard/testimonials/shared.ts +13 -13
  671. package/src/standard/testimonials/view.ts +76 -76
  672. package/src/standard/themeBlocks.ts +13 -13
  673. package/src/standard/video/index.tsx +23 -23
  674. package/src/standard/video/load.ts +10 -10
  675. package/src/standard/video/view.ts +42 -42
  676. package/src/standard/view.tsx +105 -105
  677. package/src/standard/views.ts +37 -37
  678. package/src/store.ts +499 -499
  679. package/src/theme.ts +90 -90
  680. package/src/themeUi.ts +97 -97
  681. package/src/themes.ts +91 -91
  682. package/src/ui.tsx +3402 -3402
  683. package/src/virtual.d.ts +5 -5
  684. package/src/when.ts +22 -22
  685. package/starter/.githooks/pre-push +4 -4
  686. package/starter/.nvmrc +1 -1
  687. package/starter/.prettierignore +11 -11
  688. package/starter/.prettierrc.json +7 -7
  689. package/starter/README.md +26 -26
  690. package/starter/astro.config.mjs +5 -5
  691. package/starter/package.json +67 -67
  692. package/starter/public/_redirects +1 -1
  693. package/starter/public/favicon.svg +1 -1
  694. package/starter/public/logo.svg +1 -1
  695. package/starter/src/content/pages/blog.md +8 -8
  696. package/starter/src/content/pages/forside.md +9 -9
  697. package/starter/src/content/pages/kontakt.md +7 -7
  698. package/starter/src/content/pages/privatlivspolitik.md +9 -9
  699. package/starter/src/content/pages/siden-findes-ikke.md +7 -7
  700. package/starter/src/content.config.ts +2 -2
  701. package/starter/src/data/apps.json +1 -1
  702. package/starter/src/data/block-settings.json +3 -3
  703. package/starter/src/data/blocks.json +1 -1
  704. package/starter/src/data/booking.json +6 -6
  705. package/starter/src/data/colors.json +70 -70
  706. package/starter/src/data/contact.json +8 -8
  707. package/starter/src/data/cookies.json +21 -21
  708. package/starter/src/data/csp.json +1 -1
  709. package/starter/src/data/footer.json +15 -15
  710. package/starter/src/data/internal-links.json +4 -4
  711. package/starter/src/data/menu.json +4 -4
  712. package/starter/src/data/mobile-menu.json +4 -4
  713. package/starter/src/data/old-addresses.json +1 -1
  714. package/starter/src/data/redirects.json +1 -1
  715. package/starter/src/data/standard-pages.json +8 -8
  716. package/starter/src/data/theme.json +1 -1
  717. package/starter/src/env.d.ts +2 -2
  718. package/starter/src/site/config.ts +13 -13
  719. package/starter/src/site/worker.js +14 -14
  720. package/starter/tsconfig.json +17 -17
  721. package/starter/worker/apps.js +6 -6
  722. package/starter/wrangler.jsonc +39 -39
  723. package/theme/LICENSE +21 -21
  724. package/theme/blocks/ArrowLink.tsx +14 -14
  725. package/theme/blocks/BlockHead.tsx +26 -26
  726. package/theme/blocks/Panel.tsx +32 -32
  727. package/theme/blocks/Person.tsx +26 -26
  728. package/theme/blocks/accordion/PageRow.tsx +25 -25
  729. package/theme/blocks/accordion/View.tsx +17 -17
  730. package/theme/blocks/buttons/Buttons.tsx +28 -28
  731. package/theme/blocks/buttons/View.tsx +12 -12
  732. package/theme/blocks/cards/LinkCards.tsx +72 -72
  733. package/theme/blocks/cards/View.tsx +20 -20
  734. package/theme/blocks/checklist/Checks.tsx +15 -15
  735. package/theme/blocks/checklist/View.tsx +14 -14
  736. package/theme/blocks/cookies/View.tsx +36 -36
  737. package/theme/blocks/faq/Accordion.tsx +34 -34
  738. package/theme/blocks/faq/View.tsx +16 -16
  739. package/theme/blocks/faq/script.ts +56 -56
  740. package/theme/blocks/hero/View.tsx +44 -44
  741. package/theme/blocks/links/LinkGroups.tsx +24 -24
  742. package/theme/blocks/links/View.tsx +17 -17
  743. package/theme/blocks/list/Rows.tsx +24 -24
  744. package/theme/blocks/list/View.tsx +14 -14
  745. package/theme/blocks/notice/View.tsx +13 -13
  746. package/theme/blocks/points/PointList.tsx +34 -34
  747. package/theme/blocks/points/View.tsx +14 -14
  748. package/theme/blocks/posts/View.tsx +26 -26
  749. package/theme/blocks/pricecards/View.tsx +40 -40
  750. package/theme/blocks/steps/StepList.tsx +23 -23
  751. package/theme/blocks/steps/View.tsx +14 -14
  752. package/theme/blocks/testimonials/List.tsx +46 -46
  753. package/theme/blocks/testimonials/Slider.tsx +44 -44
  754. package/theme/blocks/testimonials/Testimonial.tsx +124 -124
  755. package/theme/blocks/testimonials/View.tsx +21 -21
  756. package/theme/blocks/testimonials/script.ts +52 -52
  757. package/theme/blocks/video/View.tsx +41 -41
  758. package/theme/components/ActionBar.astro +63 -63
  759. package/theme/components/AppSlot.astro +21 -21
  760. package/theme/components/ArrowLink.tsx +21 -21
  761. package/theme/components/BlogIndex.astro +48 -48
  762. package/theme/components/BlogPosts.astro +18 -18
  763. package/theme/components/BlogPosts.tsx +45 -45
  764. package/theme/components/BookButton.tsx +22 -22
  765. package/theme/components/Container.astro +11 -11
  766. package/theme/components/CookieConsent.astro +121 -121
  767. package/theme/components/EndBlock.astro +21 -21
  768. package/theme/components/FontPreload.astro +6 -6
  769. package/theme/components/Footer.astro +85 -85
  770. package/theme/components/Header.astro +186 -186
  771. package/theme/components/Icon.astro +16 -16
  772. package/theme/components/Img.astro +29 -29
  773. package/theme/components/Img.tsx +33 -33
  774. package/theme/components/Inline.astro +11 -11
  775. package/theme/components/Logo.astro +23 -23
  776. package/theme/components/LogoMark.astro +10 -10
  777. package/theme/components/Markdown.astro +17 -17
  778. package/theme/components/MobileMenu.tsx +224 -224
  779. package/theme/components/MobileNav.astro +33 -33
  780. package/theme/components/PageHeader.astro +22 -22
  781. package/theme/components/PageSection.astro +24 -24
  782. package/theme/components/PhoneButton.tsx +11 -11
  783. package/theme/components/Popup.astro +145 -145
  784. package/theme/components/PopupButton.tsx +24 -24
  785. package/theme/components/PopupView.tsx +48 -48
  786. package/theme/components/PostList.tsx +58 -58
  787. package/theme/components/PostMeta.tsx +17 -17
  788. package/theme/components/RichText.astro +28 -28
  789. package/theme/components/Section.astro +29 -29
  790. package/theme/components/SectionHeading.tsx +8 -8
  791. package/theme/components/TextSection.astro +16 -16
  792. package/theme/components/home/PageBlock.astro +19 -19
  793. package/theme/components/home/Text.astro +13 -13
  794. package/theme/components/loadPopup.ts +22 -22
  795. package/theme/components/loadPosts.ts +16 -16
  796. package/theme/components/posts.ts +15 -15
  797. package/theme/editor/looks.mjs +7 -7
  798. package/theme/editor/previews.tsx +56 -56
  799. package/theme/layouts/Base.astro +273 -273
  800. package/theme/layouts/PageLayout.astro +126 -126
  801. package/theme/layouts/PostLayout.astro +137 -137
  802. package/theme/scripts/motion.ts +29 -29
  803. package/theme/styles/base.css +320 -320
  804. package/theme/styles/blocks.css +1808 -1808
  805. package/theme/styles/components.css +206 -206
  806. package/theme/styles/global.css +1302 -1302
  807. package/theme/styles/ui.css +6544 -6544
  808. package/theme/templates/Blog.astro +38 -38
  809. package/theme/templates/Category.astro +19 -19
  810. package/theme/templates/Home.astro +36 -36
  811. package/theme/templates/New.astro +68 -68
  812. package/theme/templates/NotFound.astro +117 -117
  813. package/theme/theme.json +28 -28
  814. package/theme/ui/Badge.tsx +45 -45
  815. package/theme/ui/BottomSheet.tsx +148 -148
  816. package/theme/ui/Button.tsx +79 -79
  817. package/theme/ui/ButtonGroup.tsx +31 -31
  818. package/theme/ui/Card.tsx +45 -45
  819. package/theme/ui/Carousel.tsx +124 -124
  820. package/theme/ui/Checkbox.tsx +59 -59
  821. package/theme/ui/Chip.tsx +101 -101
  822. package/theme/ui/ChipSet.tsx +27 -27
  823. package/theme/ui/DatePicker.tsx +149 -149
  824. package/theme/ui/DatePickerContainer.tsx +316 -316
  825. package/theme/ui/Dialog.tsx +100 -100
  826. package/theme/ui/Divider.tsx +27 -27
  827. package/theme/ui/ExposedDropdownMenu.tsx +77 -77
  828. package/theme/ui/Fab.tsx +88 -88
  829. package/theme/ui/FabMenu.tsx +67 -67
  830. package/theme/ui/IconButton.tsx +78 -78
  831. package/theme/ui/List.tsx +287 -287
  832. package/theme/ui/LoadingIndicator.tsx +29 -29
  833. package/theme/ui/Menu.tsx +278 -278
  834. package/theme/ui/NavigationBar.tsx +62 -62
  835. package/theme/ui/NavigationDrawer.tsx +80 -80
  836. package/theme/ui/NavigationRail.tsx +154 -154
  837. package/theme/ui/ProgressIndicator.tsx +162 -162
  838. package/theme/ui/RadioButton.tsx +50 -50
  839. package/theme/ui/Search.tsx +129 -129
  840. package/theme/ui/SegmentedButton.tsx +49 -49
  841. package/theme/ui/SideSheet.tsx +54 -54
  842. package/theme/ui/Slider.tsx +155 -155
  843. package/theme/ui/Snackbar.tsx +67 -67
  844. package/theme/ui/SplitButton.tsx +67 -67
  845. package/theme/ui/Switch.tsx +60 -60
  846. package/theme/ui/Tabs.tsx +114 -114
  847. package/theme/ui/TextField.tsx +278 -278
  848. package/theme/ui/TimePicker.tsx +128 -128
  849. package/theme/ui/TimePickerContainer.tsx +234 -234
  850. package/theme/ui/Toolbar.tsx +67 -67
  851. package/theme/ui/Tooltip.tsx +58 -58
  852. package/theme/ui/TopAppBar.tsx +77 -77
  853. package/theme/ui/bottomSheet.script.ts +8 -8
  854. package/theme/ui/bottomSheet.ts +211 -211
  855. package/theme/ui/carousel.script.ts +28 -28
  856. package/theme/ui/carouselLayout.ts +229 -229
  857. package/theme/ui/checkbox.script.ts +8 -8
  858. package/theme/ui/datePicker.script.ts +302 -302
  859. package/theme/ui/dates.ts +185 -185
  860. package/theme/ui/dialog.ts +48 -48
  861. package/theme/ui/dropdownMenu.script.ts +166 -166
  862. package/theme/ui/fabMenu.script.ts +57 -57
  863. package/theme/ui/navigationRail.script.ts +47 -47
  864. package/theme/ui/ripple.script.ts +159 -159
  865. package/theme/ui/search.script.ts +92 -92
  866. package/theme/ui/sideSheet.ts +48 -48
  867. package/theme/ui/slider.script.ts +12 -12
  868. package/theme/ui/sliderUpdate.ts +52 -52
  869. package/theme/ui/snackbar.script.ts +16 -16
  870. package/theme/ui/splitButton.script.ts +63 -63
  871. package/theme/ui/tabs.script.ts +48 -48
  872. package/theme/ui/textField.script.ts +17 -17
  873. package/theme/ui/textFieldUpdate.ts +44 -44
  874. package/theme/ui/timePicker.script.ts +248 -248
  875. package/theme/ui/toolbar.script.ts +43 -43
  876. package/theme/ui/tooltip.script.ts +68 -68
  877. package/worker/consent.js +141 -141
  878. package/worker/editor-github.js +167 -167
  879. package/worker/editor-host.js +74 -74
  880. package/worker/files.js +401 -401
  881. package/worker/github.js +36 -36
  882. package/worker/index.js +184 -184
  883. package/worker/not-found.js +97 -97
  884. package/worker/oauth.js +95 -95
  885. package/worker/publish.js +52 -52
  886. package/worker/push.js +270 -270
  887. package/worker/r2-status.js +50 -50
  888. package/worker/session.js +58 -58
package/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # @morphemecms/cms
2
+
3
+ ## 0.1.1-next-20261103223426
4
+
5
+ ### Patch Changes
6
+
7
+ - 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'],
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 {};