@morphemecms/cms 0.0.0-stage → 0.1.0

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 (1106) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -3
  3. package/astro.d.mts +2 -0
  4. package/astro.mjs +162 -0
  5. package/bin/morpheme.mjs +38 -0
  6. package/client.d.ts +10 -0
  7. package/defaults/blockTexts.ts +33 -0
  8. package/defaults/collections.ts +774 -0
  9. package/defaults/colors.ts +125 -0
  10. package/defaults/company.ts +20 -0
  11. package/defaults/editor.ts +178 -0
  12. package/defaults/internalLinks.ts +30 -0
  13. package/defaults/opens.ts +18 -0
  14. package/defaults/popup.tsx +93 -0
  15. package/defaults/privacy.ts +79 -0
  16. package/defaults/rules.ts +450 -0
  17. package/defaults/schema.ts +16 -0
  18. package/defaults/sitedata.ts +129 -0
  19. package/defaults/standard.ts +106 -0
  20. package/defaults/standardPages.ts +87 -0
  21. package/defaults/texts.ts +481 -0
  22. package/demo/README.md +26 -0
  23. package/demo/public/apple-touch-icon.png +0 -0
  24. package/demo/public/editor/apple-touch-icon.png +0 -0
  25. package/demo/public/editor/icon-192.png +0 -0
  26. package/demo/public/editor/icon-512.png +0 -0
  27. package/demo/public/editor/icon-maskable-512.png +0 -0
  28. package/demo/public/favicon.ico +0 -0
  29. package/demo/public/favicon.svg +1 -0
  30. package/demo/public/images/uploads/2026/10/andromeda.webp +0 -0
  31. package/demo/public/images/uploads/2026/10/earth-from-space.webp +0 -0
  32. package/demo/public/images/uploads/2026/10/editor-blog.webp +0 -0
  33. package/demo/public/images/uploads/2026/10/editor-colors.webp +0 -0
  34. package/demo/public/images/uploads/2026/10/editor-home.webp +0 -0
  35. package/demo/public/images/uploads/2026/10/editor-page.webp +0 -0
  36. package/demo/public/images/uploads/2026/10/editor-pages.webp +0 -0
  37. package/demo/public/images/uploads/2026/10/editor-seo.webp +0 -0
  38. package/demo/public/images/uploads/2026/10/editor-start.webp +0 -0
  39. package/demo/public/images/uploads/2026/10/editor-themes.webp +0 -0
  40. package/demo/public/images/uploads/2026/10/moon.webp +0 -0
  41. package/demo/public/images/uploads/2026/10/saturn.webp +0 -0
  42. package/demo/public/logo.svg +1 -0
  43. package/demo/src/content/blog/build-a-page-from-blocks.md +19 -0
  44. package/demo/src/content/blog/colors-everyone-can-read.md +19 -0
  45. package/demo/src/content/blog/edit-your-website-from-your-phone.md +21 -0
  46. package/demo/src/content/blog/every-save-is-a-version.md +21 -0
  47. package/demo/src/content/blog/schedule-a-post.md +17 -0
  48. package/demo/src/content/blog/secure-from-day-one.md +17 -0
  49. package/demo/src/content/blog/seo-without-the-guesswork.md +23 -0
  50. package/demo/src/content/blog/switch-themes-without-losing-anything.md +23 -0
  51. package/demo/src/content/blog/the-app-store.md +21 -0
  52. package/demo/src/content/pages/about.md +22 -0
  53. package/demo/src/content/pages/app-store.md +30 -0
  54. package/demo/src/content/pages/blocks.md +98 -0
  55. package/demo/src/content/pages/blog-page.md +11 -0
  56. package/demo/src/content/pages/contact.md +16 -0
  57. package/demo/src/content/pages/get-started.md +20 -0
  58. package/demo/src/content/pages/home.md +26 -0
  59. package/demo/src/content/pages/page-not-found.md +11 -0
  60. package/demo/src/content/pages/privacy-policy.md +24 -0
  61. package/demo/src/data/blocks.json +25 -0
  62. package/demo/src/data/booking.json +6 -0
  63. package/demo/src/data/categories/apps.json +6 -0
  64. package/demo/src/data/categories/design.json +6 -0
  65. package/demo/src/data/categories/editing.json +6 -0
  66. package/demo/src/data/categories/security.json +6 -0
  67. package/demo/src/data/categories/seo.json +6 -0
  68. package/demo/src/data/colors.json +75 -0
  69. package/demo/src/data/contact.json +8 -0
  70. package/demo/src/data/cookies.json +21 -0
  71. package/demo/src/data/footer.json +27 -0
  72. package/demo/src/data/menu.json +35 -0
  73. package/demo/src/data/mobile-menu.json +25 -0
  74. package/demo/src/data/popups/booking-bar.json +13 -0
  75. package/demo/src/data/popups/try-the-editor.json +16 -0
  76. package/demo/src/data/standard-pages.json +8 -0
  77. package/demo/src/data/testimonials/sample-bakery.json +10 -0
  78. package/demo/src/data/testimonials/sample-clinic.json +10 -0
  79. package/demo/src/data/testimonials/sample-studio.json +10 -0
  80. package/demo/src/site/colors.ts +11 -0
  81. package/demo/src/site/config.ts +19 -0
  82. package/icons/lucide/LICENSE +43 -0
  83. package/icons/lucide/LICENSE-material-design-icons +20 -0
  84. package/icons/lucide/address-book.svg +1 -0
  85. package/icons/lucide/app-window.svg +1 -0
  86. package/icons/lucide/arrow-counter-clockwise.svg +1 -0
  87. package/icons/lucide/arrow-down.svg +1 -0
  88. package/icons/lucide/arrow-left.svg +1 -0
  89. package/icons/lucide/arrow-right.svg +1 -0
  90. package/icons/lucide/arrow-square-out.svg +1 -0
  91. package/icons/lucide/arrow-u-up-left.svg +1 -0
  92. package/icons/lucide/arrow-u-up-right.svg +1 -0
  93. package/icons/lucide/arrow-up-right.svg +1 -0
  94. package/icons/lucide/arrow-up.svg +1 -0
  95. package/icons/lucide/arrows-down-up.svg +1 -0
  96. package/icons/lucide/arrows-in-line-horizontal.svg +1 -0
  97. package/icons/lucide/arrows-out-line-horizontal.svg +1 -0
  98. package/icons/lucide/article.svg +1 -0
  99. package/icons/lucide/bank.svg +1 -0
  100. package/icons/lucide/bell.svg +1 -0
  101. package/icons/lucide/bicycle.svg +1 -0
  102. package/icons/lucide/binoculars.svg +1 -0
  103. package/icons/lucide/book-open-text.svg +1 -0
  104. package/icons/lucide/book-open.svg +1 -0
  105. package/icons/lucide/browser.svg +1 -0
  106. package/icons/lucide/buildings.svg +1 -0
  107. package/icons/lucide/bus.svg +1 -0
  108. package/icons/lucide/calendar-blank.svg +1 -0
  109. package/icons/lucide/calendar-check.svg +1 -0
  110. package/icons/lucide/car.svg +1 -0
  111. package/icons/lucide/cards.svg +1 -0
  112. package/icons/lucide/caret-down.svg +1 -0
  113. package/icons/lucide/caret-left.svg +1 -0
  114. package/icons/lucide/caret-right.svg +1 -0
  115. package/icons/lucide/caret-up.svg +1 -0
  116. package/icons/lucide/certificate.svg +1 -0
  117. package/icons/lucide/chart-line-up.svg +1 -0
  118. package/icons/lucide/chats.svg +1 -0
  119. package/icons/lucide/check-circle.svg +1 -0
  120. package/icons/lucide/check.svg +1 -0
  121. package/icons/lucide/circle-half.svg +1 -0
  122. package/icons/lucide/circle.svg +1 -0
  123. package/icons/lucide/clock-counter-clockwise.svg +1 -0
  124. package/icons/lucide/clock.svg +1 -0
  125. package/icons/lucide/code.svg +1 -0
  126. package/icons/lucide/coffee.svg +1 -0
  127. package/icons/lucide/columns.svg +1 -0
  128. package/icons/lucide/cookie.svg +1 -0
  129. package/icons/lucide/copy.svg +1 -0
  130. package/icons/lucide/credit-card.svg +1 -0
  131. package/icons/lucide/currency-circle-dollar.svg +1 -0
  132. package/icons/lucide/cursor-click.svg +1 -0
  133. package/icons/lucide/database.svg +1 -0
  134. package/icons/lucide/desktop.svg +1 -0
  135. package/icons/lucide/device-mobile.svg +1 -0
  136. package/icons/lucide/door-open.svg +1 -0
  137. package/icons/lucide/download-simple.svg +1 -0
  138. package/icons/lucide/envelope-simple.svg +1 -0
  139. package/icons/lucide/eye-slash.svg +1 -0
  140. package/icons/lucide/eye.svg +1 -0
  141. package/icons/lucide/file-pdf.svg +1 -0
  142. package/icons/lucide/file-text.svg +1 -0
  143. package/icons/lucide/file-video.svg +1 -0
  144. package/icons/lucide/file-zip.svg +1 -0
  145. package/icons/lucide/flower-lotus.svg +1 -0
  146. package/icons/lucide/folder-simple.svg +1 -0
  147. package/icons/lucide/funnel.svg +1 -0
  148. package/icons/lucide/gauge.svg +1 -0
  149. package/icons/lucide/gear.svg +1 -0
  150. package/icons/lucide/github-logo.svg +1 -0
  151. package/icons/lucide/globe.svg +1 -0
  152. package/icons/lucide/google-logo.svg +1 -0
  153. package/icons/lucide/graduation-cap.svg +1 -0
  154. package/icons/lucide/hammer.svg +1 -0
  155. package/icons/lucide/hand-heart.svg +1 -0
  156. package/icons/lucide/handshake.svg +1 -0
  157. package/icons/lucide/hard-drives.svg +1 -0
  158. package/icons/lucide/heart.svg +1 -0
  159. package/icons/lucide/house.svg +1 -0
  160. package/icons/lucide/image-square.svg +1 -0
  161. package/icons/lucide/image.svg +1 -0
  162. package/icons/lucide/info.svg +1 -0
  163. package/icons/lucide/keyboard.svg +1 -0
  164. package/icons/lucide/leaf.svg +1 -0
  165. package/icons/lucide/lifebuoy.svg +1 -0
  166. package/icons/lucide/lightbulb.svg +1 -0
  167. package/icons/lucide/link-break.svg +1 -0
  168. package/icons/lucide/link-simple.svg +1 -0
  169. package/icons/lucide/list-bullets.svg +1 -0
  170. package/icons/lucide/list-checks.svg +1 -0
  171. package/icons/lucide/list-numbers.svg +1 -0
  172. package/icons/lucide/list.svg +1 -0
  173. package/icons/lucide/lock-simple-open.svg +1 -0
  174. package/icons/lucide/lock-simple.svg +1 -0
  175. package/icons/lucide/magnifying-glass.svg +1 -0
  176. package/icons/lucide/map-pin.svg +1 -0
  177. package/icons/lucide/map-trifold.svg +1 -0
  178. package/icons/lucide/medal.svg +1 -0
  179. package/icons/lucide/megaphone.svg +1 -0
  180. package/icons/lucide/minus.svg +1 -0
  181. package/icons/lucide/moon.svg +1 -0
  182. package/icons/lucide/newspaper.svg +1 -0
  183. package/icons/lucide/pack.json +23 -0
  184. package/icons/lucide/paint-brush-broad.svg +1 -0
  185. package/icons/lucide/palette.svg +1 -0
  186. package/icons/lucide/paper-plane-tilt.svg +1 -0
  187. package/icons/lucide/pencil-simple.svg +1 -0
  188. package/icons/lucide/phone.svg +1 -0
  189. package/icons/lucide/play-fill.svg +1 -0
  190. package/icons/lucide/plus.svg +1 -0
  191. package/icons/lucide/prohibit.svg +1 -0
  192. package/icons/lucide/puzzle-piece.svg +1 -0
  193. package/icons/lucide/question.svg +1 -0
  194. package/icons/lucide/quotes.svg +1 -0
  195. package/icons/lucide/rows.svg +1 -0
  196. package/icons/lucide/ruler.svg +1 -0
  197. package/icons/lucide/scan.svg +1 -0
  198. package/icons/lucide/shapes.svg +1 -0
  199. package/icons/lucide/share-network.svg +1 -0
  200. package/icons/lucide/shield-check.svg +1 -0
  201. package/icons/lucide/sidebar-simple.svg +1 -0
  202. package/icons/lucide/sign-out.svg +1 -0
  203. package/icons/lucide/signpost.svg +1 -0
  204. package/icons/lucide/sliders-horizontal.svg +1 -0
  205. package/icons/lucide/smiley.svg +1 -0
  206. package/icons/lucide/sparkle.svg +1 -0
  207. package/icons/lucide/square-half-bottom.svg +1 -0
  208. package/icons/lucide/square.svg +1 -0
  209. package/icons/lucide/squares-four.svg +1 -0
  210. package/icons/lucide/sticker.svg +1 -0
  211. package/icons/lucide/storefront.svg +1 -0
  212. package/icons/lucide/sun.svg +1 -0
  213. package/icons/lucide/swatches.svg +1 -0
  214. package/icons/lucide/tag.svg +1 -0
  215. package/icons/lucide/text-aa.svg +1 -0
  216. package/icons/lucide/text-align-left.svg +1 -0
  217. package/icons/lucide/text-b.svg +1 -0
  218. package/icons/lucide/text-h-one.svg +1 -0
  219. package/icons/lucide/text-h-three.svg +1 -0
  220. package/icons/lucide/text-h-two.svg +1 -0
  221. package/icons/lucide/text-italic.svg +1 -0
  222. package/icons/lucide/text-t.svg +1 -0
  223. package/icons/lucide/ticket.svg +1 -0
  224. package/icons/lucide/toggle-right.svg +1 -0
  225. package/icons/lucide/train.svg +1 -0
  226. package/icons/lucide/trash.svg +1 -0
  227. package/icons/lucide/upload-simple.svg +1 -0
  228. package/icons/lucide/user-circle.svg +1 -0
  229. package/icons/lucide/user.svg +1 -0
  230. package/icons/lucide/users-three.svg +1 -0
  231. package/icons/lucide/users.svg +1 -0
  232. package/icons/lucide/video-camera.svg +1 -0
  233. package/icons/lucide/warning-circle.svg +1 -0
  234. package/icons/lucide/warning.svg +1 -0
  235. package/icons/lucide/wave-sine.svg +1 -0
  236. package/icons/lucide/wheelchair.svg +1 -0
  237. package/icons/lucide/wrench.svg +1 -0
  238. package/icons/lucide/x.svg +1 -0
  239. package/icons/material-symbols/LICENSE +201 -0
  240. package/icons/material-symbols/LICENSE-material-design-icons +20 -0
  241. package/icons/material-symbols/address-book.svg +1 -0
  242. package/icons/material-symbols/app-window.svg +1 -0
  243. package/icons/material-symbols/arrow-counter-clockwise.svg +1 -0
  244. package/icons/material-symbols/arrow-down.svg +1 -0
  245. package/icons/material-symbols/arrow-left.svg +1 -0
  246. package/icons/material-symbols/arrow-right.svg +1 -0
  247. package/icons/material-symbols/arrow-square-out.svg +1 -0
  248. package/icons/material-symbols/arrow-u-up-left.svg +1 -0
  249. package/icons/material-symbols/arrow-u-up-right.svg +1 -0
  250. package/icons/material-symbols/arrow-up-right.svg +1 -0
  251. package/icons/material-symbols/arrow-up.svg +1 -0
  252. package/icons/material-symbols/arrows-down-up.svg +1 -0
  253. package/icons/material-symbols/arrows-in-line-horizontal.svg +1 -0
  254. package/icons/material-symbols/arrows-out-line-horizontal.svg +1 -0
  255. package/icons/material-symbols/article.svg +1 -0
  256. package/icons/material-symbols/bank.svg +1 -0
  257. package/icons/material-symbols/bell.svg +1 -0
  258. package/icons/material-symbols/bicycle.svg +1 -0
  259. package/icons/material-symbols/binoculars.svg +1 -0
  260. package/icons/material-symbols/book-open-text.svg +1 -0
  261. package/icons/material-symbols/book-open.svg +1 -0
  262. package/icons/material-symbols/browser.svg +1 -0
  263. package/icons/material-symbols/buildings.svg +1 -0
  264. package/icons/material-symbols/bus.svg +1 -0
  265. package/icons/material-symbols/calendar-blank.svg +1 -0
  266. package/icons/material-symbols/calendar-check.svg +1 -0
  267. package/icons/material-symbols/car.svg +1 -0
  268. package/icons/material-symbols/cards.svg +1 -0
  269. package/icons/material-symbols/caret-down.svg +1 -0
  270. package/icons/material-symbols/caret-left.svg +1 -0
  271. package/icons/material-symbols/caret-right.svg +1 -0
  272. package/icons/material-symbols/caret-up.svg +1 -0
  273. package/icons/material-symbols/certificate.svg +1 -0
  274. package/icons/material-symbols/chart-line-up.svg +1 -0
  275. package/icons/material-symbols/chats.svg +1 -0
  276. package/icons/material-symbols/check-circle.svg +1 -0
  277. package/icons/material-symbols/check.svg +1 -0
  278. package/icons/material-symbols/circle-half.svg +1 -0
  279. package/icons/material-symbols/circle.svg +1 -0
  280. package/icons/material-symbols/clock-counter-clockwise.svg +1 -0
  281. package/icons/material-symbols/clock.svg +1 -0
  282. package/icons/material-symbols/code.svg +1 -0
  283. package/icons/material-symbols/coffee.svg +1 -0
  284. package/icons/material-symbols/columns.svg +1 -0
  285. package/icons/material-symbols/cookie.svg +1 -0
  286. package/icons/material-symbols/copy.svg +1 -0
  287. package/icons/material-symbols/credit-card.svg +1 -0
  288. package/icons/material-symbols/currency-circle-dollar.svg +1 -0
  289. package/icons/material-symbols/cursor-click.svg +1 -0
  290. package/icons/material-symbols/database.svg +1 -0
  291. package/icons/material-symbols/desktop.svg +1 -0
  292. package/icons/material-symbols/device-mobile.svg +1 -0
  293. package/icons/material-symbols/door-open.svg +1 -0
  294. package/icons/material-symbols/download-simple.svg +1 -0
  295. package/icons/material-symbols/envelope-simple.svg +1 -0
  296. package/icons/material-symbols/eye-slash.svg +1 -0
  297. package/icons/material-symbols/eye.svg +1 -0
  298. package/icons/material-symbols/file-pdf.svg +1 -0
  299. package/icons/material-symbols/file-text.svg +1 -0
  300. package/icons/material-symbols/file-video.svg +1 -0
  301. package/icons/material-symbols/file-zip.svg +1 -0
  302. package/icons/material-symbols/flower-lotus.svg +1 -0
  303. package/icons/material-symbols/folder-simple.svg +1 -0
  304. package/icons/material-symbols/funnel.svg +1 -0
  305. package/icons/material-symbols/gauge.svg +1 -0
  306. package/icons/material-symbols/gear.svg +1 -0
  307. package/icons/material-symbols/github-logo.svg +1 -0
  308. package/icons/material-symbols/globe.svg +1 -0
  309. package/icons/material-symbols/google-logo.svg +1 -0
  310. package/icons/material-symbols/graduation-cap.svg +1 -0
  311. package/icons/material-symbols/hammer.svg +1 -0
  312. package/icons/material-symbols/hand-heart.svg +1 -0
  313. package/icons/material-symbols/handshake.svg +1 -0
  314. package/icons/material-symbols/hard-drives.svg +1 -0
  315. package/icons/material-symbols/heart.svg +1 -0
  316. package/icons/material-symbols/house.svg +1 -0
  317. package/icons/material-symbols/image-square.svg +1 -0
  318. package/icons/material-symbols/image.svg +1 -0
  319. package/icons/material-symbols/info.svg +1 -0
  320. package/icons/material-symbols/keyboard.svg +1 -0
  321. package/icons/material-symbols/leaf.svg +1 -0
  322. package/icons/material-symbols/lifebuoy.svg +1 -0
  323. package/icons/material-symbols/lightbulb.svg +1 -0
  324. package/icons/material-symbols/link-break.svg +1 -0
  325. package/icons/material-symbols/link-simple.svg +1 -0
  326. package/icons/material-symbols/list-bullets.svg +1 -0
  327. package/icons/material-symbols/list-checks.svg +1 -0
  328. package/icons/material-symbols/list-numbers.svg +1 -0
  329. package/icons/material-symbols/list.svg +1 -0
  330. package/icons/material-symbols/lock-simple-open.svg +1 -0
  331. package/icons/material-symbols/lock-simple.svg +1 -0
  332. package/icons/material-symbols/magnifying-glass.svg +1 -0
  333. package/icons/material-symbols/map-pin.svg +1 -0
  334. package/icons/material-symbols/map-trifold.svg +1 -0
  335. package/icons/material-symbols/medal.svg +1 -0
  336. package/icons/material-symbols/megaphone.svg +1 -0
  337. package/icons/material-symbols/minus.svg +1 -0
  338. package/icons/material-symbols/moon.svg +1 -0
  339. package/icons/material-symbols/newspaper.svg +1 -0
  340. package/icons/material-symbols/pack.json +29 -0
  341. package/icons/material-symbols/paint-brush-broad.svg +1 -0
  342. package/icons/material-symbols/palette.svg +1 -0
  343. package/icons/material-symbols/paper-plane-tilt.svg +1 -0
  344. package/icons/material-symbols/pencil-simple.svg +1 -0
  345. package/icons/material-symbols/phone.svg +1 -0
  346. package/icons/material-symbols/play-fill.svg +1 -0
  347. package/icons/material-symbols/plus.svg +1 -0
  348. package/icons/material-symbols/prohibit.svg +1 -0
  349. package/icons/material-symbols/puzzle-piece.svg +1 -0
  350. package/icons/material-symbols/question.svg +1 -0
  351. package/icons/material-symbols/quotes.svg +1 -0
  352. package/icons/material-symbols/rows.svg +1 -0
  353. package/icons/material-symbols/ruler.svg +1 -0
  354. package/icons/material-symbols/scan.svg +1 -0
  355. package/icons/material-symbols/shapes.svg +1 -0
  356. package/icons/material-symbols/share-network.svg +1 -0
  357. package/icons/material-symbols/shield-check.svg +1 -0
  358. package/icons/material-symbols/sidebar-simple.svg +1 -0
  359. package/icons/material-symbols/sign-out.svg +1 -0
  360. package/icons/material-symbols/signpost.svg +1 -0
  361. package/icons/material-symbols/sliders-horizontal.svg +1 -0
  362. package/icons/material-symbols/smiley.svg +1 -0
  363. package/icons/material-symbols/sparkle.svg +1 -0
  364. package/icons/material-symbols/square-half-bottom.svg +1 -0
  365. package/icons/material-symbols/square.svg +1 -0
  366. package/icons/material-symbols/squares-four.svg +1 -0
  367. package/icons/material-symbols/sticker.svg +1 -0
  368. package/icons/material-symbols/storefront.svg +1 -0
  369. package/icons/material-symbols/sun.svg +1 -0
  370. package/icons/material-symbols/swatches.svg +1 -0
  371. package/icons/material-symbols/tag.svg +1 -0
  372. package/icons/material-symbols/text-aa.svg +1 -0
  373. package/icons/material-symbols/text-align-left.svg +1 -0
  374. package/icons/material-symbols/text-b.svg +1 -0
  375. package/icons/material-symbols/text-h-one.svg +1 -0
  376. package/icons/material-symbols/text-h-three.svg +1 -0
  377. package/icons/material-symbols/text-h-two.svg +1 -0
  378. package/icons/material-symbols/text-italic.svg +1 -0
  379. package/icons/material-symbols/text-t.svg +1 -0
  380. package/icons/material-symbols/ticket.svg +1 -0
  381. package/icons/material-symbols/toggle-right.svg +1 -0
  382. package/icons/material-symbols/train.svg +1 -0
  383. package/icons/material-symbols/trash.svg +1 -0
  384. package/icons/material-symbols/upload-simple.svg +1 -0
  385. package/icons/material-symbols/user-circle.svg +1 -0
  386. package/icons/material-symbols/user.svg +1 -0
  387. package/icons/material-symbols/users-three.svg +1 -0
  388. package/icons/material-symbols/users.svg +1 -0
  389. package/icons/material-symbols/video-camera.svg +1 -0
  390. package/icons/material-symbols/warning-circle.svg +1 -0
  391. package/icons/material-symbols/warning.svg +1 -0
  392. package/icons/material-symbols/wave-sine.svg +1 -0
  393. package/icons/material-symbols/wheelchair.svg +1 -0
  394. package/icons/material-symbols/wrench.svg +1 -0
  395. package/icons/material-symbols/x.svg +1 -0
  396. package/icons/phosphor/LICENSE +21 -0
  397. package/icons/phosphor/address-book.svg +1 -0
  398. package/icons/phosphor/app-window.svg +1 -0
  399. package/icons/phosphor/arrow-counter-clockwise.svg +1 -0
  400. package/icons/phosphor/arrow-down.svg +1 -0
  401. package/icons/phosphor/arrow-left.svg +1 -0
  402. package/icons/phosphor/arrow-right.svg +1 -0
  403. package/icons/phosphor/arrow-square-out.svg +1 -0
  404. package/icons/phosphor/arrow-u-up-left.svg +1 -0
  405. package/icons/phosphor/arrow-u-up-right.svg +1 -0
  406. package/icons/phosphor/arrow-up-right.svg +1 -0
  407. package/icons/phosphor/arrow-up.svg +1 -0
  408. package/icons/phosphor/arrows-down-up.svg +1 -0
  409. package/icons/phosphor/arrows-in-line-horizontal.svg +1 -0
  410. package/icons/phosphor/arrows-out-line-horizontal.svg +1 -0
  411. package/icons/phosphor/article.svg +1 -0
  412. package/icons/phosphor/bank.svg +1 -0
  413. package/icons/phosphor/bell.svg +1 -0
  414. package/icons/phosphor/bicycle.svg +1 -0
  415. package/icons/phosphor/binoculars.svg +1 -0
  416. package/icons/phosphor/book-open-text.svg +1 -0
  417. package/icons/phosphor/book-open.svg +1 -0
  418. package/icons/phosphor/browser.svg +1 -0
  419. package/icons/phosphor/buildings.svg +1 -0
  420. package/icons/phosphor/bus.svg +1 -0
  421. package/icons/phosphor/calendar-blank.svg +1 -0
  422. package/icons/phosphor/calendar-check.svg +1 -0
  423. package/icons/phosphor/car.svg +1 -0
  424. package/icons/phosphor/cards.svg +1 -0
  425. package/icons/phosphor/caret-down.svg +1 -0
  426. package/icons/phosphor/caret-left.svg +1 -0
  427. package/icons/phosphor/caret-right.svg +1 -0
  428. package/icons/phosphor/caret-up.svg +1 -0
  429. package/icons/phosphor/certificate.svg +1 -0
  430. package/icons/phosphor/chart-line-up.svg +1 -0
  431. package/icons/phosphor/chats.svg +1 -0
  432. package/icons/phosphor/check-circle.svg +1 -0
  433. package/icons/phosphor/check.svg +1 -0
  434. package/icons/phosphor/circle-half.svg +1 -0
  435. package/icons/phosphor/circle.svg +1 -0
  436. package/icons/phosphor/clock-counter-clockwise.svg +1 -0
  437. package/icons/phosphor/clock.svg +1 -0
  438. package/icons/phosphor/code.svg +1 -0
  439. package/icons/phosphor/coffee.svg +1 -0
  440. package/icons/phosphor/columns.svg +1 -0
  441. package/icons/phosphor/cookie.svg +1 -0
  442. package/icons/phosphor/copy.svg +1 -0
  443. package/icons/phosphor/credit-card.svg +1 -0
  444. package/icons/phosphor/currency-circle-dollar.svg +1 -0
  445. package/icons/phosphor/cursor-click.svg +1 -0
  446. package/icons/phosphor/database.svg +1 -0
  447. package/icons/phosphor/desktop.svg +1 -0
  448. package/icons/phosphor/device-mobile.svg +1 -0
  449. package/icons/phosphor/door-open.svg +1 -0
  450. package/icons/phosphor/download-simple.svg +1 -0
  451. package/icons/phosphor/envelope-simple.svg +1 -0
  452. package/icons/phosphor/eye-slash.svg +1 -0
  453. package/icons/phosphor/eye.svg +1 -0
  454. package/icons/phosphor/file-pdf.svg +1 -0
  455. package/icons/phosphor/file-text.svg +1 -0
  456. package/icons/phosphor/file-video.svg +1 -0
  457. package/icons/phosphor/file-zip.svg +1 -0
  458. package/icons/phosphor/flower-lotus.svg +1 -0
  459. package/icons/phosphor/folder-simple.svg +1 -0
  460. package/icons/phosphor/funnel.svg +1 -0
  461. package/icons/phosphor/gauge.svg +1 -0
  462. package/icons/phosphor/gear.svg +1 -0
  463. package/icons/phosphor/github-logo.svg +1 -0
  464. package/icons/phosphor/globe.svg +1 -0
  465. package/icons/phosphor/google-logo.svg +1 -0
  466. package/icons/phosphor/graduation-cap.svg +1 -0
  467. package/icons/phosphor/hammer.svg +1 -0
  468. package/icons/phosphor/hand-heart.svg +1 -0
  469. package/icons/phosphor/handshake.svg +1 -0
  470. package/icons/phosphor/hard-drives.svg +1 -0
  471. package/icons/phosphor/heart.svg +1 -0
  472. package/icons/phosphor/house.svg +1 -0
  473. package/icons/phosphor/image-square.svg +1 -0
  474. package/icons/phosphor/image.svg +1 -0
  475. package/icons/phosphor/info.svg +1 -0
  476. package/icons/phosphor/keyboard.svg +1 -0
  477. package/icons/phosphor/leaf.svg +1 -0
  478. package/icons/phosphor/lifebuoy.svg +1 -0
  479. package/icons/phosphor/lightbulb.svg +1 -0
  480. package/icons/phosphor/link-break.svg +1 -0
  481. package/icons/phosphor/link-simple.svg +1 -0
  482. package/icons/phosphor/list-bullets.svg +1 -0
  483. package/icons/phosphor/list-checks.svg +1 -0
  484. package/icons/phosphor/list-numbers.svg +1 -0
  485. package/icons/phosphor/list.svg +1 -0
  486. package/icons/phosphor/lock-simple-open.svg +1 -0
  487. package/icons/phosphor/lock-simple.svg +1 -0
  488. package/icons/phosphor/magnifying-glass.svg +1 -0
  489. package/icons/phosphor/map-pin.svg +1 -0
  490. package/icons/phosphor/map-trifold.svg +1 -0
  491. package/icons/phosphor/medal.svg +1 -0
  492. package/icons/phosphor/megaphone.svg +1 -0
  493. package/icons/phosphor/minus.svg +1 -0
  494. package/icons/phosphor/moon.svg +1 -0
  495. package/icons/phosphor/newspaper.svg +1 -0
  496. package/icons/phosphor/pack.json +8 -0
  497. package/icons/phosphor/paint-brush-broad.svg +1 -0
  498. package/icons/phosphor/palette.svg +1 -0
  499. package/icons/phosphor/paper-plane-tilt.svg +1 -0
  500. package/icons/phosphor/pencil-simple.svg +1 -0
  501. package/icons/phosphor/phone.svg +1 -0
  502. package/icons/phosphor/play-fill.svg +1 -0
  503. package/icons/phosphor/plus.svg +1 -0
  504. package/icons/phosphor/prohibit.svg +1 -0
  505. package/icons/phosphor/puzzle-piece.svg +1 -0
  506. package/icons/phosphor/question.svg +1 -0
  507. package/icons/phosphor/quotes.svg +1 -0
  508. package/icons/phosphor/rows.svg +1 -0
  509. package/icons/phosphor/ruler.svg +1 -0
  510. package/icons/phosphor/scan.svg +1 -0
  511. package/icons/phosphor/shapes.svg +1 -0
  512. package/icons/phosphor/share-network.svg +1 -0
  513. package/icons/phosphor/shield-check.svg +1 -0
  514. package/icons/phosphor/sidebar-simple.svg +1 -0
  515. package/icons/phosphor/sign-out.svg +1 -0
  516. package/icons/phosphor/signpost.svg +1 -0
  517. package/icons/phosphor/sliders-horizontal.svg +1 -0
  518. package/icons/phosphor/smiley.svg +1 -0
  519. package/icons/phosphor/sparkle.svg +1 -0
  520. package/icons/phosphor/square-half-bottom.svg +1 -0
  521. package/icons/phosphor/square.svg +1 -0
  522. package/icons/phosphor/squares-four.svg +1 -0
  523. package/icons/phosphor/sticker.svg +1 -0
  524. package/icons/phosphor/storefront.svg +1 -0
  525. package/icons/phosphor/sun.svg +1 -0
  526. package/icons/phosphor/swatches.svg +1 -0
  527. package/icons/phosphor/tag.svg +1 -0
  528. package/icons/phosphor/text-aa.svg +1 -0
  529. package/icons/phosphor/text-align-left.svg +1 -0
  530. package/icons/phosphor/text-b.svg +1 -0
  531. package/icons/phosphor/text-h-one.svg +1 -0
  532. package/icons/phosphor/text-h-three.svg +1 -0
  533. package/icons/phosphor/text-h-two.svg +1 -0
  534. package/icons/phosphor/text-italic.svg +1 -0
  535. package/icons/phosphor/text-t.svg +1 -0
  536. package/icons/phosphor/ticket.svg +1 -0
  537. package/icons/phosphor/toggle-right.svg +1 -0
  538. package/icons/phosphor/train.svg +1 -0
  539. package/icons/phosphor/trash.svg +1 -0
  540. package/icons/phosphor/upload-simple.svg +1 -0
  541. package/icons/phosphor/user-circle.svg +1 -0
  542. package/icons/phosphor/user.svg +1 -0
  543. package/icons/phosphor/users-three.svg +1 -0
  544. package/icons/phosphor/users.svg +1 -0
  545. package/icons/phosphor/video-camera.svg +1 -0
  546. package/icons/phosphor/warning-circle.svg +1 -0
  547. package/icons/phosphor/warning.svg +1 -0
  548. package/icons/phosphor/wave-sine.svg +1 -0
  549. package/icons/phosphor/wheelchair.svg +1 -0
  550. package/icons/phosphor/wrench.svg +1 -0
  551. package/icons/phosphor/x.svg +1 -0
  552. package/lib/apps.d.mts +28 -0
  553. package/lib/apps.mjs +139 -0
  554. package/lib/blocks.d.mts +23 -0
  555. package/lib/blocks.mjs +90 -0
  556. package/lib/colors.ts +86 -0
  557. package/lib/contactBar.ts +18 -0
  558. package/lib/cookieCategories.d.mts +17 -0
  559. package/lib/cookieCategories.mjs +28 -0
  560. package/lib/crop.d.mts +34 -0
  561. package/lib/crop.mjs +83 -0
  562. package/lib/csp.d.mts +22 -0
  563. package/lib/csp.mjs +130 -0
  564. package/lib/cspSources.d.mts +24 -0
  565. package/lib/cspSources.mjs +60 -0
  566. package/lib/dynamic-colors.ts +426 -0
  567. package/lib/git.d.mts +24 -0
  568. package/lib/git.mjs +64 -0
  569. package/lib/hooks.ts +51 -0
  570. package/lib/inline.ts +20 -0
  571. package/lib/license-texts/Apache-2.0.txt +191 -0
  572. package/lib/license-texts/BSD-2-Clause.txt +24 -0
  573. package/lib/license-texts/BSD-3-Clause.txt +28 -0
  574. package/lib/license-texts/ISC.txt +15 -0
  575. package/lib/license-texts/MIT.txt +21 -0
  576. package/lib/licenses.d.mts +190 -0
  577. package/lib/licenses.mjs +683 -0
  578. package/lib/markdown.ts +42 -0
  579. package/lib/motion-schemes.d.mts +2 -0
  580. package/lib/motion-schemes.mjs +5 -0
  581. package/lib/motion.ts +131 -0
  582. package/lib/notice.d.mts +3 -0
  583. package/lib/notice.mjs +34 -0
  584. package/lib/scheduled.d.mts +15 -0
  585. package/lib/scheduled.mjs +37 -0
  586. package/lib/snackbar.ts +149 -0
  587. package/lib/status.d.mts +7 -0
  588. package/lib/status.mjs +18 -0
  589. package/lib/svg.d.mts +22 -0
  590. package/lib/svg.mjs +231 -0
  591. package/lib/text-colors.d.mts +11 -0
  592. package/lib/text-colors.mjs +43 -0
  593. package/lib/video-id.d.mts +14 -0
  594. package/lib/video-id.mjs +72 -0
  595. package/lib/video.d.mts +20 -0
  596. package/lib/video.mjs +91 -0
  597. package/package.json +131 -6
  598. package/pages/404.astro +10 -0
  599. package/pages/[...slug].astro +51 -0
  600. package/pages/_headers.txt +31 -0
  601. package/pages/blog/index.astro +10 -0
  602. package/pages/blog/kategori/[category].astro +18 -0
  603. package/pages/editor/code-images.json.js +25 -0
  604. package/pages/editor/index.astro +75 -0
  605. package/pages/editor/manifest.webmanifest.js +23 -0
  606. package/pages/editor/sw.js +33 -0
  607. package/pages/editor/sw.js.js +4 -0
  608. package/pages/editor/thumbnails.json.js +21 -0
  609. package/pages/editor/version.json.js +22 -0
  610. package/pages/headers.js +4 -0
  611. package/pages/index.astro +10 -0
  612. package/pages/ny.astro +6 -0
  613. package/pages/robots.txt.js +3 -0
  614. package/pages/rss.xml.js +20 -0
  615. package/scripts/app-screenshots.mjs +164 -0
  616. package/scripts/app-workers.mjs +6 -0
  617. package/scripts/bin.mjs +12 -0
  618. package/scripts/built-site.mjs +99 -0
  619. package/scripts/check-consent.mjs +113 -0
  620. package/scripts/check-content.mjs +149 -0
  621. package/scripts/check-demo.mjs +24 -0
  622. package/scripts/check-themes.mjs +45 -0
  623. package/scripts/check-worker.mjs +569 -0
  624. package/scripts/compare-html.mjs +81 -0
  625. package/scripts/demo-site.mjs +42 -0
  626. package/scripts/editor-icons.mjs +56 -0
  627. package/scripts/editor-roundtrip.mjs +134 -0
  628. package/scripts/editor-screens.mjs +101 -0
  629. package/scripts/git-env.mjs +9 -0
  630. package/scripts/icon-packs.mjs +151 -0
  631. package/scripts/link-counts.mjs +22 -0
  632. package/scripts/page-colors.mjs +42 -0
  633. package/scripts/releases.d.mts +10 -0
  634. package/scripts/releases.mjs +80 -0
  635. package/scripts/responsive-images.mjs +94 -0
  636. package/scripts/scheduled-list.mjs +15 -0
  637. package/scripts/theme-screenshots.mjs +88 -0
  638. package/scripts/types.mjs +21 -0
  639. package/scripts/video-thumbnails.mjs +89 -0
  640. package/scripts/worker-modules.mjs +34 -0
  641. package/site/appCookies.d.mts +9 -0
  642. package/site/appCookies.mjs +74 -0
  643. package/site/apps.ts +21 -0
  644. package/site/autolinks.d.mts +11 -0
  645. package/site/autolinks.mjs +200 -0
  646. package/site/blockScripts.ts +31 -0
  647. package/site/categories.ts +16 -0
  648. package/site/consent.ts +26 -0
  649. package/site/content.config.ts +84 -0
  650. package/site/content.ts +104 -0
  651. package/site/cookieList.ts +17 -0
  652. package/site/defineSite.d.mts +142 -0
  653. package/site/defineSite.mjs +136 -0
  654. package/site/directives/interact.d.mts +2 -0
  655. package/site/directives/interact.mjs +31 -0
  656. package/site/editor-version.d.mts +1 -0
  657. package/site/editor-version.mjs +26 -0
  658. package/site/fill.ts +13 -0
  659. package/site/format.ts +11 -0
  660. package/site/home.ts +66 -0
  661. package/site/iconPacks.d.mts +20 -0
  662. package/site/iconPacks.mjs +43 -0
  663. package/site/icons.d.mts +693 -0
  664. package/site/icons.mjs +605 -0
  665. package/site/images.d.mts +43 -0
  666. package/site/images.mjs +157 -0
  667. package/site/motion.ts +13 -0
  668. package/site/noindex.d.mts +6 -0
  669. package/site/noindex.mjs +21 -0
  670. package/site/pageColors.ts +110 -0
  671. package/site/popups.ts +98 -0
  672. package/site/schema.ts +189 -0
  673. package/site/sections.ts +3 -0
  674. package/site/seo.ts +28 -0
  675. package/site/site.ts +76 -0
  676. package/site/siteConfig.d.mts +1 -0
  677. package/site/siteConfig.mjs +8 -0
  678. package/site/siteCsp.d.mts +10 -0
  679. package/site/siteCsp.mjs +75 -0
  680. package/site/siteModules.d.mts +7 -0
  681. package/site/siteModules.mjs +27 -0
  682. package/site/standardPages.ts +59 -0
  683. package/site/testimonials.ts +48 -0
  684. package/site/text.ts +43 -0
  685. package/site/theme.d.mts +83 -0
  686. package/site/theme.mjs +472 -0
  687. package/site/tracking.client.ts +225 -0
  688. package/site/tracking.ts +9 -0
  689. package/src/ActionParts.tsx +205 -0
  690. package/src/Advanced.tsx +152 -0
  691. package/src/App.tsx +904 -0
  692. package/src/AppList.tsx +1345 -0
  693. package/src/BlockDialog.tsx +360 -0
  694. package/src/BlockParts.tsx +652 -0
  695. package/src/BlockSettings.tsx +533 -0
  696. package/src/BrandForm.tsx +164 -0
  697. package/src/Colors.tsx +476 -0
  698. package/src/CommunicationParts.tsx +199 -0
  699. package/src/CompanyForm.tsx +209 -0
  700. package/src/Consents.tsx +175 -0
  701. package/src/ContainmentParts.tsx +185 -0
  702. package/src/Crop.tsx +152 -0
  703. package/src/DataForm.tsx +434 -0
  704. package/src/Deleted.tsx +177 -0
  705. package/src/EntryForm.tsx +740 -0
  706. package/src/FileView.tsx +30 -0
  707. package/src/FormFrame.tsx +237 -0
  708. package/src/Keywords.tsx +225 -0
  709. package/src/Library.tsx +1563 -0
  710. package/src/Licenses.tsx +336 -0
  711. package/src/LinkSheet.tsx +138 -0
  712. package/src/MarkdownEditor.tsx +1075 -0
  713. package/src/Media.tsx +677 -0
  714. package/src/NavigationParts.tsx +350 -0
  715. package/src/NavigationRestParts.tsx +247 -0
  716. package/src/Notifications.tsx +59 -0
  717. package/src/PagePicker.tsx +136 -0
  718. package/src/Parts.tsx +991 -0
  719. package/src/PartsShown.tsx +168 -0
  720. package/src/PickerParts.tsx +183 -0
  721. package/src/Redirects.tsx +450 -0
  722. package/src/Screen.tsx +184 -0
  723. package/src/SectionsField.tsx +65 -0
  724. package/src/SelectionParts.tsx +134 -0
  725. package/src/SeoScores.tsx +184 -0
  726. package/src/Sheet.tsx +35 -0
  727. package/src/ThemeStore.tsx +376 -0
  728. package/src/Tokens.tsx +346 -0
  729. package/src/Versions.tsx +214 -0
  730. package/src/addresses.ts +75 -0
  731. package/src/allIcons.ts +7 -0
  732. package/src/appFiles.ts +29 -0
  733. package/src/apps.ts +281 -0
  734. package/src/ask.tsx +123 -0
  735. package/src/blocks.ts +251 -0
  736. package/src/brand.ts +153 -0
  737. package/src/cache.ts +42 -0
  738. package/src/check.ts +285 -0
  739. package/src/checkSite.ts +256 -0
  740. package/src/consents.ts +26 -0
  741. package/src/cookieList.ts +70 -0
  742. package/src/countries.ts +59 -0
  743. package/src/deploy.ts +155 -0
  744. package/src/editor.css +602 -0
  745. package/src/examples.ts +85 -0
  746. package/src/fields.tsx +942 -0
  747. package/src/frontmatter.d.mts +6 -0
  748. package/src/frontmatter.mjs +42 -0
  749. package/src/github.ts +376 -0
  750. package/src/i18n/da-DK/advanced.ts +28 -0
  751. package/src/i18n/da-DK/app.ts +71 -0
  752. package/src/i18n/da-DK/apps.ts +90 -0
  753. package/src/i18n/da-DK/blockSettings.ts +38 -0
  754. package/src/i18n/da-DK/blocks.ts +408 -0
  755. package/src/i18n/da-DK/check.ts +25 -0
  756. package/src/i18n/da-DK/colors.ts +64 -0
  757. package/src/i18n/da-DK/common.ts +118 -0
  758. package/src/i18n/da-DK/company.ts +24 -0
  759. package/src/i18n/da-DK/consents.ts +23 -0
  760. package/src/i18n/da-DK/forms.ts +116 -0
  761. package/src/i18n/da-DK/history.ts +35 -0
  762. package/src/i18n/da-DK/index.ts +49 -0
  763. package/src/i18n/da-DK/keywords.ts +19 -0
  764. package/src/i18n/da-DK/library.ts +135 -0
  765. package/src/i18n/da-DK/licenses.ts +25 -0
  766. package/src/i18n/da-DK/media.ts +79 -0
  767. package/src/i18n/da-DK/parts.ts +696 -0
  768. package/src/i18n/da-DK/preview.ts +13 -0
  769. package/src/i18n/da-DK/redirects.ts +51 -0
  770. package/src/i18n/da-DK/seo.ts +20 -0
  771. package/src/i18n/da-DK/text.ts +35 -0
  772. package/src/i18n/da-DK/theme.ts +41 -0
  773. package/src/i18n/en-US/advanced.ts +32 -0
  774. package/src/i18n/en-US/app.ts +84 -0
  775. package/src/i18n/en-US/apps.ts +134 -0
  776. package/src/i18n/en-US/blockSettings.ts +48 -0
  777. package/src/i18n/en-US/blocks.ts +441 -0
  778. package/src/i18n/en-US/check.ts +31 -0
  779. package/src/i18n/en-US/colors.ts +82 -0
  780. package/src/i18n/en-US/common.ts +144 -0
  781. package/src/i18n/en-US/company.ts +25 -0
  782. package/src/i18n/en-US/consents.ts +25 -0
  783. package/src/i18n/en-US/forms.ts +145 -0
  784. package/src/i18n/en-US/history.ts +43 -0
  785. package/src/i18n/en-US/index.ts +51 -0
  786. package/src/i18n/en-US/keywords.ts +24 -0
  787. package/src/i18n/en-US/library.ts +176 -0
  788. package/src/i18n/en-US/licenses.ts +36 -0
  789. package/src/i18n/en-US/media.ts +80 -0
  790. package/src/i18n/en-US/parts.ts +718 -0
  791. package/src/i18n/en-US/preview.ts +15 -0
  792. package/src/i18n/en-US/redirects.ts +66 -0
  793. package/src/i18n/en-US/seo.ts +26 -0
  794. package/src/i18n/en-US/text.ts +41 -0
  795. package/src/i18n/en-US/theme.ts +41 -0
  796. package/src/i18n/index.ts +124 -0
  797. package/src/icon.tsx +160 -0
  798. package/src/iconPacks.ts +89 -0
  799. package/src/images.ts +163 -0
  800. package/src/licenses.ts +79 -0
  801. package/src/markdown.d.mts +12 -0
  802. package/src/markdown.mjs +204 -0
  803. package/src/nav.ts +68 -0
  804. package/src/notFound.ts +28 -0
  805. package/src/notifications.ts +223 -0
  806. package/src/pagePreview.tsx +204 -0
  807. package/src/r2Caching.ts +55 -0
  808. package/src/redirects.ts +149 -0
  809. package/src/registry.tsx +188 -0
  810. package/src/schema.ts +417 -0
  811. package/src/sections.d.mts +45 -0
  812. package/src/sections.mjs +303 -0
  813. package/src/seo.ts +333 -0
  814. package/src/shared.ts +44 -0
  815. package/src/sidebar.ts +31 -0
  816. package/src/site.ts +317 -0
  817. package/src/standard/Block.astro +19 -0
  818. package/src/standard/BlockSite.astro +18 -0
  819. package/src/standard/accordion/index.tsx +47 -0
  820. package/src/standard/accordion/load.ts +23 -0
  821. package/src/standard/accordion/shared.ts +15 -0
  822. package/src/standard/accordion/view.ts +32 -0
  823. package/src/standard/buttons/fields.ts +98 -0
  824. package/src/standard/buttons/index.tsx +23 -0
  825. package/src/standard/buttons/load.ts +34 -0
  826. package/src/standard/buttons/shared.ts +12 -0
  827. package/src/standard/buttons/view.ts +30 -0
  828. package/src/standard/cards/index.tsx +71 -0
  829. package/src/standard/cards/load.ts +17 -0
  830. package/src/standard/cards/shared.ts +27 -0
  831. package/src/standard/cards/view.ts +29 -0
  832. package/src/standard/checklist/index.tsx +27 -0
  833. package/src/standard/checklist/load.ts +5 -0
  834. package/src/standard/checklist/view.ts +13 -0
  835. package/src/standard/cookies/index.tsx +17 -0
  836. package/src/standard/cookies/list.ts +56 -0
  837. package/src/standard/cookies/load.ts +11 -0
  838. package/src/standard/cookies/shared.ts +20 -0
  839. package/src/standard/cookies/view.ts +28 -0
  840. package/src/standard/faq/index.tsx +29 -0
  841. package/src/standard/faq/load.ts +14 -0
  842. package/src/standard/faq/view.ts +21 -0
  843. package/src/standard/head.ts +23 -0
  844. package/src/standard/hero/fields.ts +48 -0
  845. package/src/standard/hero/index.tsx +57 -0
  846. package/src/standard/hero/load.ts +23 -0
  847. package/src/standard/hero/view.ts +38 -0
  848. package/src/standard/links/index.tsx +41 -0
  849. package/src/standard/links/load.ts +17 -0
  850. package/src/standard/links/view.ts +25 -0
  851. package/src/standard/list/index.tsx +50 -0
  852. package/src/standard/list/load.ts +5 -0
  853. package/src/standard/list/view.ts +18 -0
  854. package/src/standard/load.ts +7 -0
  855. package/src/standard/notice/index.tsx +30 -0
  856. package/src/standard/notice/load.ts +16 -0
  857. package/src/standard/notice/view.ts +10 -0
  858. package/src/standard/points/index.tsx +42 -0
  859. package/src/standard/points/load.ts +5 -0
  860. package/src/standard/points/view.ts +12 -0
  861. package/src/standard/posts/index.tsx +132 -0
  862. package/src/standard/posts/load.ts +36 -0
  863. package/src/standard/posts/shared.ts +21 -0
  864. package/src/standard/posts/view.ts +63 -0
  865. package/src/standard/pricecards/index.tsx +57 -0
  866. package/src/standard/pricecards/load.ts +11 -0
  867. package/src/standard/pricecards/view.ts +50 -0
  868. package/src/standard/sharedTexts.ts +6 -0
  869. package/src/standard/site.ts +124 -0
  870. package/src/standard/siteLooks.ts +19 -0
  871. package/src/standard/sites.ts +13 -0
  872. package/src/standard/steps/index.tsx +28 -0
  873. package/src/standard/steps/load.ts +5 -0
  874. package/src/standard/steps/view.ts +11 -0
  875. package/src/standard/testimonials/index.tsx +87 -0
  876. package/src/standard/testimonials/list.ts +43 -0
  877. package/src/standard/testimonials/load.ts +58 -0
  878. package/src/standard/testimonials/shared.ts +13 -0
  879. package/src/standard/testimonials/view.ts +76 -0
  880. package/src/standard/themeBlocks.ts +13 -0
  881. package/src/standard/video/index.tsx +23 -0
  882. package/src/standard/video/load.ts +10 -0
  883. package/src/standard/video/view.ts +42 -0
  884. package/src/standard/view.tsx +105 -0
  885. package/src/standard/views.ts +37 -0
  886. package/src/store.ts +499 -0
  887. package/src/theme.ts +90 -0
  888. package/src/themeUi.ts +97 -0
  889. package/src/themes.ts +91 -0
  890. package/src/ui.tsx +3402 -0
  891. package/src/virtual.d.ts +5 -0
  892. package/src/when.ts +22 -0
  893. package/starter/.githooks/pre-push +4 -0
  894. package/starter/.nvmrc +1 -0
  895. package/starter/.prettierignore +11 -0
  896. package/starter/.prettierrc.json +7 -0
  897. package/starter/README.md +26 -0
  898. package/starter/astro.config.mjs +5 -0
  899. package/starter/package.json +67 -0
  900. package/starter/public/_redirects +1 -0
  901. package/starter/public/apple-touch-icon.png +0 -0
  902. package/starter/public/editor/apple-touch-icon.png +0 -0
  903. package/starter/public/editor/icon-192.png +0 -0
  904. package/starter/public/editor/icon-512.png +0 -0
  905. package/starter/public/editor/icon-maskable-512.png +0 -0
  906. package/starter/public/favicon.ico +0 -0
  907. package/starter/public/favicon.svg +1 -0
  908. package/starter/public/logo.svg +1 -0
  909. package/starter/src/content/pages/blog.md +8 -0
  910. package/starter/src/content/pages/forside.md +9 -0
  911. package/starter/src/content/pages/kontakt.md +7 -0
  912. package/starter/src/content/pages/privatlivspolitik.md +9 -0
  913. package/starter/src/content/pages/siden-findes-ikke.md +7 -0
  914. package/starter/src/content.config.ts +2 -0
  915. package/starter/src/data/apps.json +1 -0
  916. package/starter/src/data/block-settings.json +3 -0
  917. package/starter/src/data/blocks.json +1 -0
  918. package/starter/src/data/booking.json +6 -0
  919. package/starter/src/data/colors.json +70 -0
  920. package/starter/src/data/contact.json +8 -0
  921. package/starter/src/data/cookies.json +21 -0
  922. package/starter/src/data/csp.json +1 -0
  923. package/starter/src/data/footer.json +15 -0
  924. package/starter/src/data/internal-links.json +4 -0
  925. package/starter/src/data/menu.json +4 -0
  926. package/starter/src/data/mobile-menu.json +4 -0
  927. package/starter/src/data/old-addresses.json +1 -0
  928. package/starter/src/data/redirects.json +1 -0
  929. package/starter/src/data/standard-pages.json +8 -0
  930. package/starter/src/data/theme.json +1 -0
  931. package/starter/src/env.d.ts +2 -0
  932. package/starter/src/site/config.ts +13 -0
  933. package/starter/src/site/worker.js +14 -0
  934. package/starter/tsconfig.json +17 -0
  935. package/starter/worker/apps.js +6 -0
  936. package/starter/wrangler.jsonc +39 -0
  937. package/theme/LICENSE +21 -0
  938. package/theme/blocks/ArrowLink.tsx +14 -0
  939. package/theme/blocks/BlockHead.tsx +26 -0
  940. package/theme/blocks/Panel.tsx +32 -0
  941. package/theme/blocks/Person.tsx +26 -0
  942. package/theme/blocks/accordion/PageRow.tsx +25 -0
  943. package/theme/blocks/accordion/View.tsx +17 -0
  944. package/theme/blocks/buttons/Buttons.tsx +28 -0
  945. package/theme/blocks/buttons/View.tsx +12 -0
  946. package/theme/blocks/cards/LinkCards.tsx +72 -0
  947. package/theme/blocks/cards/View.tsx +20 -0
  948. package/theme/blocks/checklist/Checks.tsx +15 -0
  949. package/theme/blocks/checklist/View.tsx +14 -0
  950. package/theme/blocks/cookies/View.tsx +36 -0
  951. package/theme/blocks/faq/Accordion.tsx +34 -0
  952. package/theme/blocks/faq/View.tsx +16 -0
  953. package/theme/blocks/faq/script.ts +56 -0
  954. package/theme/blocks/hero/View.tsx +44 -0
  955. package/theme/blocks/links/LinkGroups.tsx +24 -0
  956. package/theme/blocks/links/View.tsx +17 -0
  957. package/theme/blocks/list/Rows.tsx +24 -0
  958. package/theme/blocks/list/View.tsx +14 -0
  959. package/theme/blocks/notice/View.tsx +13 -0
  960. package/theme/blocks/points/PointList.tsx +34 -0
  961. package/theme/blocks/points/View.tsx +14 -0
  962. package/theme/blocks/posts/View.tsx +26 -0
  963. package/theme/blocks/pricecards/View.tsx +40 -0
  964. package/theme/blocks/steps/StepList.tsx +23 -0
  965. package/theme/blocks/steps/View.tsx +14 -0
  966. package/theme/blocks/testimonials/List.tsx +46 -0
  967. package/theme/blocks/testimonials/Slider.tsx +44 -0
  968. package/theme/blocks/testimonials/Testimonial.tsx +124 -0
  969. package/theme/blocks/testimonials/View.tsx +21 -0
  970. package/theme/blocks/testimonials/script.ts +52 -0
  971. package/theme/blocks/video/View.tsx +41 -0
  972. package/theme/components/ActionBar.astro +63 -0
  973. package/theme/components/AppSlot.astro +21 -0
  974. package/theme/components/ArrowLink.tsx +21 -0
  975. package/theme/components/BlogIndex.astro +48 -0
  976. package/theme/components/BlogPosts.astro +18 -0
  977. package/theme/components/BlogPosts.tsx +45 -0
  978. package/theme/components/BookButton.tsx +22 -0
  979. package/theme/components/Container.astro +11 -0
  980. package/theme/components/CookieConsent.astro +121 -0
  981. package/theme/components/EndBlock.astro +21 -0
  982. package/theme/components/FontPreload.astro +6 -0
  983. package/theme/components/Footer.astro +85 -0
  984. package/theme/components/Header.astro +186 -0
  985. package/theme/components/Icon.astro +16 -0
  986. package/theme/components/Img.astro +29 -0
  987. package/theme/components/Img.tsx +33 -0
  988. package/theme/components/Inline.astro +11 -0
  989. package/theme/components/Logo.astro +23 -0
  990. package/theme/components/LogoMark.astro +10 -0
  991. package/theme/components/Markdown.astro +17 -0
  992. package/theme/components/MobileMenu.tsx +224 -0
  993. package/theme/components/MobileNav.astro +33 -0
  994. package/theme/components/PageHeader.astro +22 -0
  995. package/theme/components/PageSection.astro +24 -0
  996. package/theme/components/PhoneButton.tsx +11 -0
  997. package/theme/components/Popup.astro +145 -0
  998. package/theme/components/PopupButton.tsx +24 -0
  999. package/theme/components/PopupView.tsx +48 -0
  1000. package/theme/components/PostList.tsx +58 -0
  1001. package/theme/components/PostMeta.tsx +17 -0
  1002. package/theme/components/RichText.astro +28 -0
  1003. package/theme/components/Section.astro +29 -0
  1004. package/theme/components/SectionHeading.tsx +8 -0
  1005. package/theme/components/TextSection.astro +16 -0
  1006. package/theme/components/home/PageBlock.astro +19 -0
  1007. package/theme/components/home/Text.astro +13 -0
  1008. package/theme/components/loadPopup.ts +22 -0
  1009. package/theme/components/loadPosts.ts +16 -0
  1010. package/theme/components/posts.ts +15 -0
  1011. package/theme/editor/looks.mjs +7 -0
  1012. package/theme/editor/previews.tsx +56 -0
  1013. package/theme/layouts/Base.astro +273 -0
  1014. package/theme/layouts/PageLayout.astro +126 -0
  1015. package/theme/layouts/PostLayout.astro +137 -0
  1016. package/theme/screenshots/1-front.jpg +0 -0
  1017. package/theme/screenshots/2-front-dark.jpg +0 -0
  1018. package/theme/screenshots/3-blog.jpg +0 -0
  1019. package/theme/screenshots/4-contact.jpg +0 -0
  1020. package/theme/scripts/motion.ts +29 -0
  1021. package/theme/styles/base.css +320 -0
  1022. package/theme/styles/blocks.css +1808 -0
  1023. package/theme/styles/components.css +206 -0
  1024. package/theme/styles/global.css +1302 -0
  1025. package/theme/styles/ui.css +6544 -0
  1026. package/theme/templates/Blog.astro +38 -0
  1027. package/theme/templates/Category.astro +19 -0
  1028. package/theme/templates/Home.astro +36 -0
  1029. package/theme/templates/New.astro +68 -0
  1030. package/theme/templates/NotFound.astro +117 -0
  1031. package/theme/theme.json +28 -0
  1032. package/theme/ui/Badge.tsx +45 -0
  1033. package/theme/ui/BottomSheet.tsx +148 -0
  1034. package/theme/ui/Button.tsx +79 -0
  1035. package/theme/ui/ButtonGroup.tsx +31 -0
  1036. package/theme/ui/Card.tsx +45 -0
  1037. package/theme/ui/Carousel.tsx +124 -0
  1038. package/theme/ui/Checkbox.tsx +59 -0
  1039. package/theme/ui/Chip.tsx +101 -0
  1040. package/theme/ui/ChipSet.tsx +27 -0
  1041. package/theme/ui/DatePicker.tsx +149 -0
  1042. package/theme/ui/DatePickerContainer.tsx +316 -0
  1043. package/theme/ui/Dialog.tsx +100 -0
  1044. package/theme/ui/Divider.tsx +27 -0
  1045. package/theme/ui/ExposedDropdownMenu.tsx +77 -0
  1046. package/theme/ui/Fab.tsx +88 -0
  1047. package/theme/ui/FabMenu.tsx +67 -0
  1048. package/theme/ui/IconButton.tsx +78 -0
  1049. package/theme/ui/List.tsx +287 -0
  1050. package/theme/ui/LoadingIndicator.tsx +29 -0
  1051. package/theme/ui/Menu.tsx +278 -0
  1052. package/theme/ui/NavigationBar.tsx +62 -0
  1053. package/theme/ui/NavigationDrawer.tsx +80 -0
  1054. package/theme/ui/NavigationRail.tsx +154 -0
  1055. package/theme/ui/ProgressIndicator.tsx +162 -0
  1056. package/theme/ui/RadioButton.tsx +50 -0
  1057. package/theme/ui/Search.tsx +129 -0
  1058. package/theme/ui/SegmentedButton.tsx +49 -0
  1059. package/theme/ui/SideSheet.tsx +54 -0
  1060. package/theme/ui/Slider.tsx +155 -0
  1061. package/theme/ui/Snackbar.tsx +67 -0
  1062. package/theme/ui/SplitButton.tsx +67 -0
  1063. package/theme/ui/Switch.tsx +60 -0
  1064. package/theme/ui/Tabs.tsx +114 -0
  1065. package/theme/ui/TextField.tsx +278 -0
  1066. package/theme/ui/TimePicker.tsx +128 -0
  1067. package/theme/ui/TimePickerContainer.tsx +234 -0
  1068. package/theme/ui/Toolbar.tsx +67 -0
  1069. package/theme/ui/Tooltip.tsx +58 -0
  1070. package/theme/ui/TopAppBar.tsx +77 -0
  1071. package/theme/ui/bottomSheet.script.ts +8 -0
  1072. package/theme/ui/bottomSheet.ts +211 -0
  1073. package/theme/ui/carousel.script.ts +28 -0
  1074. package/theme/ui/carouselLayout.ts +229 -0
  1075. package/theme/ui/checkbox.script.ts +8 -0
  1076. package/theme/ui/datePicker.script.ts +302 -0
  1077. package/theme/ui/dates.ts +185 -0
  1078. package/theme/ui/dialog.ts +48 -0
  1079. package/theme/ui/dropdownMenu.script.ts +166 -0
  1080. package/theme/ui/fabMenu.script.ts +57 -0
  1081. package/theme/ui/navigationRail.script.ts +47 -0
  1082. package/theme/ui/ripple.script.ts +159 -0
  1083. package/theme/ui/search.script.ts +92 -0
  1084. package/theme/ui/sideSheet.ts +48 -0
  1085. package/theme/ui/slider.script.ts +12 -0
  1086. package/theme/ui/sliderUpdate.ts +52 -0
  1087. package/theme/ui/snackbar.script.ts +16 -0
  1088. package/theme/ui/splitButton.script.ts +63 -0
  1089. package/theme/ui/tabs.script.ts +48 -0
  1090. package/theme/ui/textField.script.ts +17 -0
  1091. package/theme/ui/textFieldUpdate.ts +44 -0
  1092. package/theme/ui/timePicker.script.ts +248 -0
  1093. package/theme/ui/toolbar.script.ts +43 -0
  1094. package/theme/ui/tooltip.script.ts +68 -0
  1095. package/worker/consent.js +141 -0
  1096. package/worker/editor-github.js +167 -0
  1097. package/worker/editor-host.js +74 -0
  1098. package/worker/files.js +401 -0
  1099. package/worker/github.js +36 -0
  1100. package/worker/index.js +184 -0
  1101. package/worker/not-found.js +97 -0
  1102. package/worker/oauth.js +95 -0
  1103. package/worker/publish.js +52 -0
  1104. package/worker/push.js +270 -0
  1105. package/worker/r2-status.js +50 -0
  1106. package/worker/session.js +58 -0
@@ -0,0 +1,200 @@
1
+ // Automatic internal links. The words come from the pages and posts themselves: their keywords
2
+ // (`keyword`, the primary one, and `keywords`, more separated by commas; under
3
+ // "Søgemaskiner" in the editor; the front page's link to / and the blog page's to /blog/, where they are shown, and the
4
+ // 404 page's to nowhere). src/data/internal-links.json, under "Søgemaskineoptimering" ›
5
+ // "Interne links" in the editor (packages/editor/defaults/internalLinks.ts): `enabled` turns the links on or off, `maxPerPage` is the
6
+ // most per page. A word links to the page it is a
7
+ // keyword of. Unlike linking every occurrence of a word, a target is
8
+ // linked once per page, at most `maxPerPage` links per page, never to the page itself, never inside
9
+ // headings or existing links, and never as part of a word joined with a hyphen (not "web" in "web-design"). Used by the Markdown pipeline (packages/editor/astro.mjs) and by an import
10
+ // script, which removes the old plugin links so they are not doubled. Each link has data-link="auto", so how many there
11
+ // are of each word can be counted after the build (packages/editor/scripts/link-counts.mjs, /editor/links.json).
12
+ import { createHash } from 'node:crypto';
13
+ import fs from 'node:fs';
14
+ import path from 'node:path';
15
+ import { parse } from 'yaml';
16
+ import { isPreview, livePath } from './noindex.mjs';
17
+ import { stateOf } from '@morphemecms/cms/lib/status.mjs';
18
+
19
+ const FILE = path.resolve('src/data/internal-links.json');
20
+ // The front page, the blog page and the 404 page ("Indstillinger" › "Udseende" › "Standardsider",
21
+ // packages/editor/defaults/standardPages.ts): the front page's address sends on to /, the blog page's to /blog/, and the 404 page has none.
22
+ const STANDARD = path.resolve('src/data/standard-pages.json');
23
+ const PAGES = path.resolve('src/content/pages');
24
+ const POSTS = path.resolve('src/content/blog');
25
+ // What a word may not touch to be linked: a letter, a digit, or a hyphen joining it to another word.
26
+ const LETTER = '\\p{L}\\p{N}-';
27
+ const escape = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
28
+ const split = (text) =>
29
+ String(text ?? '')
30
+ .split(',')
31
+ .map((w) => w.trim())
32
+ .filter(Boolean);
33
+
34
+ let standard;
35
+ /** A page's address as it is linked to: the front page's is /, the blog page's /blog/, and the 404 page's none (null). */
36
+ function linked(href) {
37
+ standard ??= (() => {
38
+ try {
39
+ return JSON.parse(fs.readFileSync(STANDARD, 'utf8'));
40
+ } catch {
41
+ return {};
42
+ }
43
+ })();
44
+ if (href === standard.front) return '/';
45
+ if (href === standard.blog) return '/blog/';
46
+ return href === standard.notFound ? null : href;
47
+ }
48
+
49
+ /** The .md files in a folder and its subfolders, as paths relative to it (none when there is no folder). */
50
+ const files = (dir) =>
51
+ fs.existsSync(dir) ? fs.readdirSync(dir, { recursive: true, encoding: 'utf8' }).filter((f) => f.endsWith('.md')) : [];
52
+ const frontmatter = (file) => parse(fs.readFileSync(file, 'utf8').match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1] ?? '') ?? {};
53
+
54
+ /** The keywords of the pages and posts: [{ href, primary, secondary }]. A page's address is its
55
+ * `path`, or else its file name (getPages() in packages/editor/site/content.ts); a new version of a page (/ny/…)
56
+ * gives its keywords to the page it is for, when that page exists. Only published ones are linked to
57
+ * (packages/editor/lib/status.mjs). */
58
+ function keywordRules() {
59
+ const entries = [
60
+ ...files(PAGES).map((f) => {
61
+ const data = frontmatter(path.join(PAGES, f));
62
+ const id = f
63
+ .replace(/\\/g, '/')
64
+ .replace(/\.md$/, '')
65
+ .replace(/(^|\/)index$/, '');
66
+ return { href: data.path || `/${id}/`, data };
67
+ }),
68
+ ...files(POSTS).map((f) => ({ href: `/${path.basename(f, '.md')}/`, data: frontmatter(path.join(POSTS, f)) })),
69
+ ].filter((e) => stateOf(e.data) === 'published');
70
+ const live = new Set(
71
+ entries
72
+ .map((e) => e.href)
73
+ .filter((href) => !isPreview(href))
74
+ .map(linked),
75
+ );
76
+ return entries
77
+ .map(({ href, data }) => ({ href: linked(livePath(href)), primary: split(data.keyword), secondary: split(data.keywords) }))
78
+ .filter((r) => r.href && live.has(r.href) && (r.primary.length || r.secondary.length))
79
+ .sort((a, b) => a.href.localeCompare(b.href));
80
+ }
81
+
82
+ let cached;
83
+ /** { enabled, maxPerPage, words: Map<lowercase word, href>, pattern } */
84
+ export function loadLinks() {
85
+ if (cached) return cached;
86
+ const data = JSON.parse(fs.readFileSync(FILE, 'utf8'));
87
+ const enabled = data.enabled !== false;
88
+ const maxPerPage = Number.isFinite(data.maxPerPage) ? data.maxPerPage : 8;
89
+ // A word used for two pages links to the one it is the primary keyword of, then to the one it is
90
+ // a secondary keyword of; between equals, to the first by address.
91
+ const rules = keywordRules();
92
+ const ranked = [...rules.map((r) => ({ href: r.href, words: r.primary })), ...rules.map((r) => ({ href: r.href, words: r.secondary }))];
93
+ const words = new Map();
94
+ for (const { href, words: list } of ranked)
95
+ for (const word of list) {
96
+ const key = word.toLowerCase();
97
+ if (!words.has(key)) words.set(key, href);
98
+ else if (words.get(key) !== href) console.warn(`interne links: "${word}" linker til ${words.get(key)}, ikke ${href}`);
99
+ }
100
+ // One regex for all words, longest first so "tryg tilknytning" wins over shorter matches.
101
+ const all = [...words.keys()].sort((a, b) => b.length - a.length).map(escape);
102
+ const pattern = new RegExp(`(?<![${LETTER}])(${all.join('|')})(?![${LETTER}])`, 'giu');
103
+ cached = { enabled, maxPerPage, words, pattern };
104
+ return cached;
105
+ }
106
+
107
+ // Not inside links, headings, code, or the offer and price boxes.
108
+ const SKIP = new Set(['aside', 'a', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'code', 'pre', 'button', 'figcaption', 'dl']);
109
+
110
+ /** The URL of the page being rendered: front matter `path` (pages) or /<file name>/ (posts). A new
111
+ * version of a page (/ny/…) counts as the page it is for, so it links as it will once it replaces it. */
112
+ function pagePath(file) {
113
+ const fm = file.data?.astro?.frontmatter;
114
+ if (fm?.path) return linked(livePath(fm.path));
115
+ const name = path.basename(file.path ?? '', '.md');
116
+ return name ? linked(`/${name}/`) : '';
117
+ }
118
+
119
+ /** The pages a block in the text links to (packages/editor/lib/blocks.mjs): its `href` fields (emner, priskort,
120
+ * knapper, Kort), the links in its texts (spørgsmål og svar) and the posts it picks. */
121
+ function blockLinks(node) {
122
+ let props;
123
+ try {
124
+ props = JSON.parse(String(node.properties.dataProps ?? '{}'));
125
+ } catch {
126
+ return [];
127
+ }
128
+ const links = [];
129
+ const visit = (value, key) => {
130
+ if (typeof value === 'string') {
131
+ if (key === 'href' && value.startsWith('/')) links.push(value.split('#')[0]);
132
+ for (const m of value.matchAll(/\]\((\/[^)\s#]*)/g)) links.push(m[1]);
133
+ } else if (Array.isArray(value)) value.forEach((v) => visit(v, key));
134
+ else if (value && typeof value === 'object') Object.entries(value).forEach(([k, v]) => visit(v, k));
135
+ };
136
+ visit(props);
137
+ if (node.properties.dataBlock === 'posts' && Array.isArray(props.picked)) links.push(...props.picked.map((id) => `/${id}/`));
138
+ return links;
139
+ }
140
+
141
+ /** What every page's links are made from: the words and where each links to, whether they are on and how many there
142
+ * are per page, and this file. Given to the plugin in packages/editor/astro.mjs, so it is in Astro's config: a page's text is
143
+ * kept rendered between builds (node_modules/.astro) until it or the config changes, and a keyword changed on one page
144
+ * changes the links on the others, so then every page is rendered again. */
145
+ export function linksDigest() {
146
+ const { enabled, maxPerPage, words } = loadLinks();
147
+ const text = JSON.stringify([enabled, maxPerPage, [...words], fs.readFileSync(new URL(import.meta.url), 'utf8')]);
148
+ return createHash('sha256').update(text).digest('hex').slice(0, 16);
149
+ }
150
+
151
+ /** Rehype plugin; `digest` (linksDigest) is not used here. */
152
+ export function rehypeAutoLinks() {
153
+ return (tree, file) => {
154
+ const { enabled, maxPerPage, words, pattern } = loadLinks();
155
+ if (!enabled || !words.size) return;
156
+ const self = pagePath(file);
157
+ const used = new Set([self]);
158
+ // Targets the text already links to by hand, or a block on the page links to, are not linked again.
159
+ const collect = (node) => {
160
+ if (node.type === 'element' && node.tagName === 'a') used.add(String(node.properties?.href ?? '').split('#')[0]);
161
+ if (node.type === 'element' && node.properties?.dataBlock) blockLinks(node).forEach((href) => used.add(href));
162
+ node.children?.forEach(collect);
163
+ };
164
+ collect(tree);
165
+ let count = 0;
166
+
167
+ const walk = (node) => {
168
+ if (!node.children || count >= maxPerPage) return;
169
+ if (node.type === 'element' && SKIP.has(node.tagName)) return;
170
+ const out = [];
171
+ for (const child of node.children) {
172
+ if (child.type !== 'text' || count >= maxPerPage) {
173
+ walk(child);
174
+ out.push(child);
175
+ continue;
176
+ }
177
+ let last = 0;
178
+ for (const m of child.value.matchAll(pattern)) {
179
+ const href = words.get(m[1].toLowerCase());
180
+ if (used.has(href) || count >= maxPerPage) continue;
181
+ used.add(href);
182
+ count++;
183
+ if (m.index > last) out.push({ type: 'text', value: child.value.slice(last, m.index) });
184
+ // data-link="auto": counted after the build (packages/editor/scripts/link-counts.mjs), for the editor's list of keywords.
185
+ out.push({ type: 'element', tagName: 'a', properties: { href, dataLink: 'auto' }, children: [{ type: 'text', value: m[1] }] });
186
+ last = m.index + m[1].length;
187
+ }
188
+ if (last < child.value.length) out.push({ type: 'text', value: child.value.slice(last) });
189
+ }
190
+ node.children = out;
191
+ };
192
+ walk(tree);
193
+ };
194
+ }
195
+
196
+ /** For the migration: turn links whose text is one of the words back into plain text. */
197
+ export function unlinkAutoWords(markdown) {
198
+ const { words } = loadLinks();
199
+ return markdown.replace(/(?<!!)\[([^\]\[]+)\]\((\/[^)\s]*)\)/g, (all, text) => (words.has(text.trim().toLowerCase()) ? text : all));
200
+ }
@@ -0,0 +1,31 @@
1
+ // What the blocks do in a browser on the site: script.ts in a theme's blocks/<type>/ (the rows that fold out, the
2
+ // testimonials' "Læs mere" …; the theme in use's, else the standard theme's, as their look, sites.ts), what the theme's
3
+ // UI components do (ui/<name>.script.ts: a carousel's page indicator, by `ui/<name>`), in an app's
4
+ // block (src/apps/<app>/blocks/<type>/), and in an app's part of a list's entries (src/apps/<app>/<list>/: Mailchimp's
5
+ // signup in a pop-up). Each is a function that finds its blocks on the page and does nothing without them; the theme's
6
+ // Base.astro runs them all on every page, so they also work where a site or an app shows a block's parts of its own
7
+ // (this site's front page).
8
+ type Script = () => void;
9
+
10
+ const byType = (found: Record<string, Script>) =>
11
+ Object.fromEntries(Object.entries(found).map(([file, run]) => [file.split('/').at(-2)!, run]));
12
+
13
+ // The theme's UI components' by their name (ui/carousel.script.ts: ui/carousel).
14
+ const byUi = (found: Record<string, Script>) =>
15
+ Object.fromEntries(Object.entries(found).map(([file, run]) => [`ui/${file.split('/').at(-1)!.replace('.script.ts', '')}`, run]));
16
+
17
+ /** What each block does in a browser, by its type. */
18
+ export const blockScripts: Record<string, Script> = {
19
+ ...byType(import.meta.glob<Script>('@saturn/blocks/*/script.ts', { eager: true, import: 'default' })),
20
+ ...byType(import.meta.glob<Script>('@theme/blocks/*/script.ts', { eager: true, import: 'default' })),
21
+ ...byUi(import.meta.glob<Script>('@saturn/ui/*.script.ts', { eager: true, import: 'default' })),
22
+ ...byUi(import.meta.glob<Script>('@theme/ui/*.script.ts', { eager: true, import: 'default' })),
23
+ ...byType(import.meta.glob<Script>('/src/apps/*/blocks/*/script.ts', { eager: true, import: 'default' })),
24
+ // An app's part of its kind of a list's entries (Mailchimp's signup in a pop-up), by the app and the list.
25
+ ...Object.fromEntries(
26
+ Object.entries(import.meta.glob<Script>('/src/apps/*/*/script.ts', { eager: true, import: 'default' })).map(([file, run]) => [
27
+ file.split('/').slice(-3, -1).join('/'),
28
+ run,
29
+ ]),
30
+ ),
31
+ };
@@ -0,0 +1,16 @@
1
+ // Tags (called categories in the code): one JSON file per tag in src/data/categories/, edited in the
2
+ // editor (/editor/, "Tags"). The file name is the slug: the address /blog/kategori/<slug>/ and the
3
+ // value stored in the `categories` of the blog posts and the testimonials. Only a blog category
4
+ // (`blogCategory`, "Blogkategori" in the editor) is shown on the blog: a pill on the blog index and
5
+ // on its posts, and its own page. The others only pick posts and testimonials.
6
+ type CategoryData = { name: string; blogCategory?: boolean; seoTitle?: string; seoDescription?: string; shareImage?: string };
7
+
8
+ const files = import.meta.glob<CategoryData>('@data/categories/*.json', { eager: true, import: 'default' });
9
+
10
+ export const categories = Object.entries(files)
11
+ .map(([file, c]) => ({ slug: file.replace(/^.*\/|\.json$/g, ''), ...c }))
12
+ .sort((a, b) => a.slug.localeCompare(b.slug));
13
+
14
+ const notOnBlog = new Set(categories.filter((c) => c.blogCategory === false).map((c) => c.slug));
15
+ /** Whether the tag is shown on the blog (a tag without a file, or from before the field, is). */
16
+ export const isBlogCategory = (slug: string) => !notOnBlog.has(slug);
@@ -0,0 +1,26 @@
1
+ // What the cookie banner asks about: the categories of cookies (@morphemecms/cms/lib/cookieCategories.mjs) of what the
2
+ // installed apps load with their settings (`cookies` in their index.ts: Google Analytics statistics, Google Ads
3
+ // marketing, Google Tag Manager both), each a yes or no of its own; and whether the site has the banner (and
4
+ // "Cookieindstillinger" in the footer) at all: when it is switched on ("Privatliv" › "Cookiebanner",
5
+ // src/data/cookies.json) and there is something to ask about. For the theme (Base.astro, Footer.astro,
6
+ // CookieConsent.astro), which knows no app by name.
7
+ import type { AppDefinition } from '../src/apps';
8
+ import { appIdOf } from '../src/apps';
9
+ import { CONSENT_CATEGORIES, type ConsentCategory } from '../lib/cookieCategories.mjs';
10
+ import cookies from '@data/cookies.json';
11
+ import { installed, settingsOf } from './apps';
12
+
13
+ // Only the apps' index.ts, without their blocks (as opens.ts).
14
+ const appFiles = import.meta.glob<{ default: AppDefinition }>('/src/apps/*/index.ts', { eager: true });
15
+
16
+ const asked = new Set(
17
+ Object.entries(appFiles).flatMap(([path, { default: app }]) => {
18
+ const id = appIdOf(path);
19
+ return installed.includes(id) ? (app.cookies?.(settingsOf(id, app.settings?.values)) ?? []) : [];
20
+ }),
21
+ );
22
+
23
+ /** The categories the banner asks about, in its order. */
24
+ export const consentCategories: ConsentCategory[] = CONSENT_CATEGORIES.filter((c) => asked.has(c));
25
+
26
+ export const cookieBanner = cookies.enabled && consentCategories.length > 0;
@@ -0,0 +1,84 @@
1
+ import { defineCollection, z } from 'astro:content';
2
+ import { glob } from 'astro/loaders';
3
+
4
+ // Kladde, Skjult or Planlagt (Udgivet when left out), and for Planlagt when, in Danish time
5
+ // ("2026-11-01T08:00"): what each one is on the site is in packages/editor/lib/status.mjs.
6
+ const status = {
7
+ status: z.enum(['draft', 'unlisted', 'scheduled']).optional(),
8
+ publishAt: z.string().optional(),
9
+ };
10
+
11
+ // Blog posts: one .md file per post in src/content/blog/.
12
+ // The file name becomes the URL: mit-foerste-indlaeg.md -> /mit-foerste-indlaeg/
13
+ const blog = defineCollection({
14
+ loader: glob({ pattern: '**/*.md', base: './src/content/blog' }),
15
+ schema: z.object({
16
+ title: z.string(),
17
+ date: z.coerce.date(),
18
+ // Last edit (when imported, the old site's); dateModified in the structured data.
19
+ updated: z.coerce.date().optional(),
20
+ description: z.string().optional().default(''),
21
+ categories: z.array(z.string()).optional().default([]),
22
+ image: z.string().optional(),
23
+ imageAlt: z.string().optional(),
24
+ // "Dekorativt billede": `image` is drawn with alt="" (screen readers skip it), whatever `imageAlt` says.
25
+ imageDecorative: z.boolean().optional(),
26
+ ...status,
27
+ // Google title and description (the <title> and meta description). Empty: built from the title.
28
+ seoTitle: z.string().optional(),
29
+ seoDescription: z.string().optional(),
30
+ // The picture shown when it is shared (og:image). Empty: `image`, else the first picture in the text.
31
+ shareImage: z.string().optional(),
32
+ // The title and description when it is shared (og:title, og:description). Empty: the Google title and description.
33
+ shareTitle: z.string().optional(),
34
+ shareDescription: z.string().optional(),
35
+ // Words that link here from the other pages and posts (packages/editor/site/autolinks.mjs): the primary
36
+ // keyword, and more separated by commas.
37
+ keyword: z.string().optional(),
38
+ keywords: z.string().optional(),
39
+ // The address of the page Google should count as the original (rel=canonical). Empty: this one.
40
+ canonical: z.string().optional(),
41
+ // Not for search engines: noindex (Base.astro) and not in the sitemap (packages/editor/astro.mjs).
42
+ noindex: z.boolean().optional().default(false),
43
+ }),
44
+ });
45
+
46
+ // Imported pages. `path` is the exact URL, e.g. /ydelser/raadgivning/
47
+ // Pages created in the editor (/editor/) have no `path`: the file name is the URL (getPages()).
48
+ const pages = defineCollection({
49
+ loader: glob({ pattern: '**/*.md', base: './src/content/pages' }),
50
+ schema: z.object({
51
+ title: z.string(),
52
+ path: z
53
+ .string()
54
+ .regex(/^\/.*\/$/, 'path skal starte og slutte med /')
55
+ .optional(),
56
+ description: z.string().optional().default(''),
57
+ order: z.number().optional().default(0),
58
+ ...status,
59
+ // Google title and description (the <title> and meta description). Empty: built from the title.
60
+ seoTitle: z.string().optional(),
61
+ seoDescription: z.string().optional(),
62
+ // The picture shown when it is shared (og:image). Empty: the first picture in the text.
63
+ shareImage: z.string().optional(),
64
+ // The title and description when it is shared (og:title, og:description). Empty: the Google title and description.
65
+ shareTitle: z.string().optional(),
66
+ shareDescription: z.string().optional(),
67
+ // Words that link here from the other pages and posts (packages/editor/site/autolinks.mjs): the primary
68
+ // keyword, and more separated by commas.
69
+ keyword: z.string().optional(),
70
+ keywords: z.string().optional(),
71
+ // The address of the page Google should count as the original (rel=canonical). Empty: this one.
72
+ canonical: z.string().optional(),
73
+ // Not for search engines: noindex (Base.astro) and not in the sitemap (packages/editor/astro.mjs).
74
+ noindex: z.boolean().optional().default(false),
75
+ // Across the whole page, without the owner's card beside the text (PageLayout.astro).
76
+ wide: z.boolean().optional().default(false),
77
+ // A new version of a page (/ny/…): what the owner should look at or answer before it replaces the
78
+ // current page. Shown at the top of the new version and on /ny/.
79
+ review: z.string().optional(),
80
+ updated: z.coerce.date().optional(),
81
+ }),
82
+ });
83
+
84
+ export const collections = { blog, pages };
@@ -0,0 +1,104 @@
1
+ import { getCollection, type CollectionEntry } from 'astro:content';
2
+ import { categories, isBlogCategory } from './categories';
3
+ import { displayTitle } from './text';
4
+ import { isPreview } from './noindex.mjs';
5
+ import { stateOf } from '@morphemecms/cms/lib/status.mjs';
6
+ import { pageH1 } from '@morphemecms/cms/src/sections.mjs';
7
+
8
+ // From text.ts, which the editor uses too (it has no content collections).
9
+ export { displayTitle, openingText } from './text';
10
+ export { stateOf };
11
+
12
+ export type Post = CollectionEntry<'blog'>;
13
+ // Every page has a path: its own, or /<file name>/ for pages created in the editor.
14
+ export type Page = CollectionEntry<'pages'> & { data: { path: string } };
15
+
16
+ export const postPath = (post: Post) => `/${post.id}/`;
17
+
18
+ // What a page or post is on this site (packages/editor/lib/status.mjs); in dev a draft is on it, as if published.
19
+ const stateHere = (data: { status?: string; publishAt?: string }) => {
20
+ const state = stateOf(data);
21
+ return state === 'draft' && import.meta.env.DEV ? 'published' : state;
22
+ };
23
+ // Whether a page or post in that state is built: a published one, and with `unlisted` a hidden one.
24
+ const shown = (state: ReturnType<typeof stateOf>, unlisted: boolean) => state === 'published' || (unlisted && state === 'unlisted');
25
+
26
+ // The posts on the blog and in every list of posts; with `unlisted`, also those that only open on
27
+ // their address (Skjult; the pages of the posts are made for those too). A draft is not on the site.
28
+ export async function getPosts({ unlisted = false } = {}) {
29
+ return (await getCollection('blog', ({ data }) => shown(stateHere(data), unlisted))).sort(
30
+ (a, b) => b.data.date.valueOf() - a.data.date.valueOf(),
31
+ );
32
+ }
33
+
34
+ /** Which posts a "Blogindlæg" block or the front page's section shows (packages/editor/site/home.ts): those in
35
+ * any of `categories` (all when empty), the newest `count`, or with `order` "random" all of them,
36
+ * to show `count` of at random on the page (the theme's PostList.tsx); or with `show` "picked" those picked. */
37
+ export async function postsFor(
38
+ { show = 'categories', categories = [], order = 'newest', picked = [] }: PostChoice,
39
+ count: number,
40
+ ): Promise<{ posts: Post[]; random: boolean }> {
41
+ const posts = await getPosts();
42
+ if (show === 'picked') return { posts: picked.map((id) => posts.find((p) => p.id === id)).filter((p) => p !== undefined), random: false };
43
+ const pool = posts.filter((p) => !categories.length || p.data.categories.some((c) => categories.includes(c)));
44
+ const random = order === 'random' && pool.length > count;
45
+ return { posts: random ? pool : pool.slice(0, count), random };
46
+ }
47
+ export type PostChoice = {
48
+ /** "all": all of them, which "Blogindlæg" lists itself (StandardSite.posts.list), not by this. */
49
+ show?: 'all' | 'categories' | 'picked';
50
+ categories?: string[];
51
+ /** How many, '3' to '6' (postCount in the standard block Blogindlæg's shared.ts). */
52
+ count?: string;
53
+ order?: 'newest' | 'random';
54
+ picked?: string[];
55
+ /** The category "Alle indlæg" goes to (allPostsCategory in packages/editor/site/home.ts). */
56
+ link?: string;
57
+ };
58
+
59
+ // The pages on the site, also the hidden ones (Skjult; with `unlisted: false` not those) and, like the
60
+ // posts, the drafts on the editor's preview; with `previews: false`, not the new versions of pages under /ny/.
61
+ export async function getPages({ previews = true, unlisted = true } = {}): Promise<Page[]> {
62
+ const pages = await getCollection('pages', ({ data }) => shown(stateHere(data), unlisted));
63
+ for (const page of pages) page.data.path ??= `/${page.id}/`;
64
+ return (previews ? pages : pages.filter((p) => !isPreview(p.data.path!))) as Page[];
65
+ }
66
+
67
+ const categoryNames = new Map(categories.map((c) => [c.slug, c.name]));
68
+ export const categoryName = (slug: string) => categoryNames.get(slug) ?? slug.replace(/-/g, ' ').replace(/^./, (c) => c.toUpperCase());
69
+
70
+ // The blog categories that actually have posts, most used first: the pills on the blog index and
71
+ // the pages /blog/kategori/<slug>/.
72
+ export async function getCategories() {
73
+ const posts = await getPosts();
74
+ const counts = new Map<string, number>();
75
+ for (const p of posts) for (const c of p.data.categories.filter(isBlogCategory)) counts.set(c, (counts.get(c) ?? 0) + 1);
76
+ return [...counts].sort((a, b) => b[1] - a[1]).map(([slug, count]) => ({ slug, name: categoryName(slug), count }));
77
+ }
78
+
79
+ export function parentPage(page: Page, all: Page[]) {
80
+ const folder = page.data.path.replace(/[^/]+\/$/, '');
81
+ if (folder === '/') return undefined;
82
+ return all.find((p) => p.data.path === folder);
83
+ }
84
+
85
+ // The H1 of a page: the heading at the top of its text ("# …", pageH1), else its title.
86
+ export const pageHeading = (page: Page) => pageH1(page.body ?? '').heading ?? displayTitle(page.data.title);
87
+
88
+ /** The H1 of a page as HTML, when a word in it has a colour (<span class="color-accent">, packages/editor/lib/text-colors.mjs),
89
+ * for the layout to draw in its place; else undefined, and the layout draws pageHeading. */
90
+ export const pageHeadingHtml = (page: Page): string | undefined => pageH1(page.body ?? '').html;
91
+
92
+ /** A page's text as HTML without its H1 at the top, which the layout draws in its own place (above the picture). */
93
+ export const withoutH1 = (html: string) => html.replace(/^\s*<h1\b[^>]*>[\s\S]*?<\/h1>\s*/, '');
94
+
95
+ /** Anchor for a testimonial on the testimonials page, e.g. "marie-louise-eriksen". */
96
+ export const testimonialId = (t: { name: string }) =>
97
+ t.name
98
+ .toLowerCase()
99
+ .replace(/æ/g, 'ae')
100
+ .replace(/ø/g, 'oe')
101
+ .replace(/å/g, 'aa')
102
+ .normalize('NFD')
103
+ .replace(/[^a-z0-9]+/g, '-')
104
+ .replace(/^-|-$/g, '');
@@ -0,0 +1,17 @@
1
+ // The site's cookie list: one JSON file per cookie in src/data/cookie-list/ (config.cookieList), edited in the editor
2
+ // ("Lister" › "Cookies"), with those of the apps installed and those the app "Cookiescanner" finds (see
3
+ // packages/editor/src/cookieList.ts). The standard block "Cookieliste" shows them (StandardSite.cookies).
4
+ import { categoryOf } from '@morphemecms/cms/lib/cookieCategories.mjs';
5
+ import type { CookieItem } from '@morphemecms/cms/src/standard/site';
6
+
7
+ const files = import.meta.glob<Record<string, unknown>>('@data/cookie-list/*.json', { eager: true, import: 'default' });
8
+
9
+ const text = (v: unknown) => (v == null ? '' : String(v));
10
+
11
+ export const cookieList: CookieItem[] = Object.values(files).map((c) => ({
12
+ name: text(c.name),
13
+ provider: text(c.provider),
14
+ purpose: text(c.purpose) || undefined,
15
+ lasts: text(c.lasts) || undefined,
16
+ category: categoryOf(c),
17
+ }));
@@ -0,0 +1,142 @@
1
+ export function defineSite(own: SiteOwn & Partial<SiteChoices>): SiteConfig;
2
+ export type ButtonTarget = {
3
+ value: string;
4
+ label: string;
5
+ note?: string;
6
+ pick?: string;
7
+ pickLabel?: string;
8
+ };
9
+ /**
10
+ * What a site says of itself in its config.ts.
11
+ */
12
+ export type SiteOwn = {
13
+ /**
14
+ * The editor's name as an app (on the home screen, in the tab).
15
+ */
16
+ name: string;
17
+ /**
18
+ * What the editor is for (the app's description).
19
+ */
20
+ description: string;
21
+ /**
22
+ * The site's language, with the country (BCP 47): the editor's, unless one is picked on "Konto" or
23
+ * the browser asks for another the editor has (src/i18n/); the commits are always in it.
24
+ */
25
+ locale: string;
26
+ /**
27
+ * The site's own domain: a link written with it is a link within the site. The site is at
28
+ * https://<domain>/ (Astro's `site`, the structured data), and measures only there and at www.<domain> (site/tracking.ts).
29
+ */
30
+ domain: string;
31
+ /**
32
+ * What search engines show of the site when a page has no description of its own.
33
+ */
34
+ siteDescription: string;
35
+ /**
36
+ * Where a save goes: one commit on this branch (src/github.ts).
37
+ */
38
+ repo: {
39
+ owner: string;
40
+ name: string;
41
+ branch: string;
42
+ };
43
+ };
44
+ /**
45
+ * What a site can say of itself, else the standard: the owner's picture (beside a blog post, and shown when a page with
46
+ * none of its own is shared), the booking page and the pages a booking ends on, the page about the owner, the block
47
+ * drawn after every blog post, the word a page's title can end in, pictures that are the same though their names say
48
+ * otherwise, the file of its redirects from old addresses, and its app store.
49
+ */
50
+ export type SiteChoices = {
51
+ /**
52
+ * The owner's picture, or none.
53
+ */
54
+ picture: {
55
+ src: string;
56
+ alt: string;
57
+ } | null;
58
+ /**
59
+ * The booking page, where "Book en tid" goes when no booking sheet
60
+ * opens ('': the site has none, and the header has no button to it), and the pages a booking or an order ends on: not
61
+ * for search engines (site/noindex.mjs), and without the action bar.
62
+ */
63
+ booking: {
64
+ path: string;
65
+ thanks: string[];
66
+ };
67
+ /**
68
+ * The page about the owner (an AboutPage in the structured data), or ''.
69
+ */
70
+ aboutPath: string;
71
+ /**
72
+ * The block drawn across the page after every blog post (its type, with its shared texts), or ''.
73
+ */
74
+ postEnd: string;
75
+ /**
76
+ * A word a page's title can end in, after a dash, for search engines (" – København"): kept in
77
+ * <title>, left out of the page's heading (displayTitle in site/text.ts). Empty: nothing is left out.
78
+ */
79
+ titleEnd: string;
80
+ /**
81
+ * Pictures that are the same though their names say otherwise (a crop
82
+ * saved under a new name), by name (samePicture in site/images.mjs).
83
+ */
84
+ samePictures: Record<string, string>;
85
+ /**
86
+ * The site's other redirects: rules ("<from> <to> 301", one to a
87
+ * line) and the Worker's map (`{ ids, paths }`, worker/index.js), shown and changed with the editor's own under
88
+ * Videresendelser (src/redirects.ts).
89
+ */
90
+ siteRedirects: {
91
+ rules: string;
92
+ map: string;
93
+ };
94
+ /**
95
+ * The app store ("Apps" ›
96
+ * "Appstore", src/store.ts): the GitHub repository and branch of its catalog (`catalog`, the apps and themes that can
97
+ * be installed, each with where its folder is in the repository, at which commit), or none: then "Appstore" has only
98
+ * the site's own.
99
+ */
100
+ store: {
101
+ owner: string;
102
+ name: string;
103
+ branch: string;
104
+ catalog: string;
105
+ } | null;
106
+ };
107
+ export type SiteConfig = SiteOwn & SiteChoices & typeof STANDARD;
108
+ declare namespace STANDARD {
109
+ let wrangler: string;
110
+ namespace folders {
111
+ let blog: string;
112
+ let pages: string;
113
+ let data: string;
114
+ let media: string;
115
+ let files: string;
116
+ }
117
+ let redirects: string;
118
+ let blockSettings: string;
119
+ namespace apps {
120
+ let installed: string;
121
+ let settings: string;
122
+ let folder: string;
123
+ }
124
+ let blockTexts: string;
125
+ let theme: string;
126
+ let icons: string;
127
+ let motion: string;
128
+ let themes: string;
129
+ let csp: string;
130
+ let colors: string;
131
+ let menu: string;
132
+ let reserved: string[];
133
+ namespace lists {
134
+ let testimonials: string;
135
+ let tags: string;
136
+ let cookies: string;
137
+ }
138
+ let cookieList: string;
139
+ let buttonTargets: ButtonTarget[];
140
+ let standardPages: string;
141
+ }
142
+ export {};