@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/src/licenses.ts CHANGED
@@ -1,79 +1,79 @@
1
- // The licences of the third-party work the site and the editor are made with ("Licenser" under "Indstillinger",
2
- // Licenses.tsx), as the build finds them (/editor/licenses.json, licensesIntegration in packages/editor/lib/licenses.mjs),
3
- // what an app (defineApp) and a theme (theme.json) declare (their own licence and the third-party work they bring), and
4
- // what the store's catalog has of them (scripts/store-release.mjs, storeLicenses).
5
-
6
- /** What a third-party work is to the site: a font, icons, code (a library, also styles) or pictures. */
7
- export type LicenseKind = 'font' | 'icons' | 'library' | 'image';
8
-
9
- /** A third-party work an app or a theme brings, as it declares it (`thirdParty`): an npm package it imports (its
10
- * version, who made it, its licence and its text are its folder's; `author`, and `file`, a file in the app's or the
11
- * theme's folder with the licence's text, for a package that has neither); or another work (a font or pictures in its
12
- * folder), with its name, who made it, its licence's name and the file in its folder with its text. A theme's icon
13
- * packs (icon-packs/) are not declared here: each pack's manifest says its licence. */
14
- export type ThirdParty =
15
- | { package: string; kind: LicenseKind; author?: string; file?: string }
16
- | { name: string; version?: string; author: string; license: string; file: string; kind: LicenseKind };
17
-
18
- /** The licence of one's own work that grants nothing ("all rights reserved"), as npm writes it. */
19
- export const UNLICENSED = 'UNLICENSED';
20
-
21
- /** Who brings a work: the editor, the site's own code, or an app or a theme (`app/<id>`, `tema/<id>`, LicenseOwner.id). */
22
- export type LicenseWhere = 'editor' | 'site' | `app/${string}` | `tema/${string}`;
23
-
24
- /** A third-party work as the build found it: its id (a package's name; `ikoner/<id>` for an icon set; `<owner>/<name>`
25
- * for another work an app or a theme declares), its name, version, who made it, its licence's name and text (`standard`:
26
- * the licence's standard text, as the package has none of its own), what it is, who brings it (`where`, none for an
27
- * icon set or a work only an app or a theme not in use brings) and through which packages (`via`, when the site does not
28
- * import it itself). `shipped: false`: brought by an app or a theme the site is built with, but not in what is downloaded (the Worker's, the
29
- * build's). */
30
- export type LicensedWork = {
31
- id: string;
32
- name: string;
33
- version: string | null;
34
- author: string;
35
- license: string;
36
- text: string;
37
- standard?: boolean;
38
- kind: LicenseKind;
39
- where: LicenseWhere[];
40
- via?: string[];
41
- shipped?: false;
42
- };
43
-
44
- /** An app or a theme with its own licence (`text`: LICENSE in its folder, none when it is UNLICENSED) and the works it
45
- * brings (their ids: those it declares, and those shipped through them alone), and whether the site is built with it. */
46
- export type LicenseOwner = {
47
- id: `app/${string}` | `tema/${string}`;
48
- kind: 'app' | 'theme';
49
- /** Its folder's name in src/apps/ or src/themes/. */
50
- key: string;
51
- name: string;
52
- version: string | null;
53
- author: string;
54
- license: string;
55
- text: string | null;
56
- works: string[];
57
- inUse: boolean;
58
- };
59
-
60
- /** What the build wrote (/editor/licenses.json). */
61
- export type LicensesFile = { works: LicensedWork[]; owners: LicenseOwner[] };
62
-
63
- /** A work an app or a theme declares, as the store's catalog has it: without its text. */
64
- export type StoreLicense = Pick<LicensedWork, 'name' | 'version' | 'author' | 'license' | 'kind'>;
65
-
66
- /** An app's or a theme's licences as the store's catalog has them: its own licence's name and what it brings. */
67
- export type StoreLicenses = { license: string; works: StoreLicense[] };
68
-
69
- // The file, fetched once each time the editor opens: undefined while it loads, null when there is none (the site is not
70
- // built since it came, or the editor is offline).
71
- let loaded: Promise<LicensesFile | null> | undefined;
72
-
73
- /** The licences as the site was last built (/editor/licenses.json). */
74
- export function loadLicenses(): Promise<LicensesFile | null> {
75
- loaded ??= fetch('/editor/licenses.json', { cache: 'no-store' })
76
- .then((res) => (res.ok ? (res.json() as Promise<LicensesFile>) : null))
77
- .catch(() => null);
78
- return loaded;
79
- }
1
+ // The licences of the third-party work the site and the editor are made with ("Licenser" under "Indstillinger",
2
+ // Licenses.tsx), as the build finds them (/editor/licenses.json, licensesIntegration in packages/editor/lib/licenses.mjs),
3
+ // what an app (defineApp) and a theme (theme.json) declare (their own licence and the third-party work they bring), and
4
+ // what the store's catalog has of them (scripts/store-release.mjs, storeLicenses).
5
+
6
+ /** What a third-party work is to the site: a font, icons, code (a library, also styles) or pictures. */
7
+ export type LicenseKind = 'font' | 'icons' | 'library' | 'image';
8
+
9
+ /** A third-party work an app or a theme brings, as it declares it (`thirdParty`): an npm package it imports (its
10
+ * version, who made it, its licence and its text are its folder's; `author`, and `file`, a file in the app's or the
11
+ * theme's folder with the licence's text, for a package that has neither); or another work (a font or pictures in its
12
+ * folder), with its name, who made it, its licence's name and the file in its folder with its text. A theme's icon
13
+ * packs (icon-packs/) are not declared here: each pack's manifest says its licence. */
14
+ export type ThirdParty =
15
+ | { package: string; kind: LicenseKind; author?: string; file?: string }
16
+ | { name: string; version?: string; author: string; license: string; file: string; kind: LicenseKind };
17
+
18
+ /** The licence of one's own work that grants nothing ("all rights reserved"), as npm writes it. */
19
+ export const UNLICENSED = 'UNLICENSED';
20
+
21
+ /** Who brings a work: the editor, the site's own code, or an app or a theme (`app/<id>`, `tema/<id>`, LicenseOwner.id). */
22
+ export type LicenseWhere = 'editor' | 'site' | `app/${string}` | `tema/${string}`;
23
+
24
+ /** A third-party work as the build found it: its id (a package's name; `ikoner/<id>` for an icon set; `<owner>/<name>`
25
+ * for another work an app or a theme declares), its name, version, who made it, its licence's name and text (`standard`:
26
+ * the licence's standard text, as the package has none of its own), what it is, who brings it (`where`, none for an
27
+ * icon set or a work only an app or a theme not in use brings) and through which packages (`via`, when the site does not
28
+ * import it itself). `shipped: false`: brought by an app or a theme the site is built with, but not in what is downloaded (the Worker's, the
29
+ * build's). */
30
+ export type LicensedWork = {
31
+ id: string;
32
+ name: string;
33
+ version: string | null;
34
+ author: string;
35
+ license: string;
36
+ text: string;
37
+ standard?: boolean;
38
+ kind: LicenseKind;
39
+ where: LicenseWhere[];
40
+ via?: string[];
41
+ shipped?: false;
42
+ };
43
+
44
+ /** An app or a theme with its own licence (`text`: LICENSE in its folder, none when it is UNLICENSED) and the works it
45
+ * brings (their ids: those it declares, and those shipped through them alone), and whether the site is built with it. */
46
+ export type LicenseOwner = {
47
+ id: `app/${string}` | `tema/${string}`;
48
+ kind: 'app' | 'theme';
49
+ /** Its folder's name in src/apps/ or src/themes/. */
50
+ key: string;
51
+ name: string;
52
+ version: string | null;
53
+ author: string;
54
+ license: string;
55
+ text: string | null;
56
+ works: string[];
57
+ inUse: boolean;
58
+ };
59
+
60
+ /** What the build wrote (/editor/licenses.json). */
61
+ export type LicensesFile = { works: LicensedWork[]; owners: LicenseOwner[] };
62
+
63
+ /** A work an app or a theme declares, as the store's catalog has it: without its text. */
64
+ export type StoreLicense = Pick<LicensedWork, 'name' | 'version' | 'author' | 'license' | 'kind'>;
65
+
66
+ /** An app's or a theme's licences as the store's catalog has them: its own licence's name and what it brings. */
67
+ export type StoreLicenses = { license: string; works: StoreLicense[] };
68
+
69
+ // The file, fetched once each time the editor opens: undefined while it loads, null when there is none (the site is not
70
+ // built since it came, or the editor is offline).
71
+ let loaded: Promise<LicensesFile | null> | undefined;
72
+
73
+ /** The licences as the site was last built (/editor/licenses.json). */
74
+ export function loadLicenses(): Promise<LicensesFile | null> {
75
+ loaded ??= fetch('/editor/licenses.json', { cache: 'no-store' })
76
+ .then((res) => (res.ok ? (res.json() as Promise<LicensesFile>) : null))
77
+ .catch(() => null);
78
+ return loaded;
79
+ }
package/src/markdown.mjs CHANGED
@@ -1,204 +1,204 @@
1
- // The Milkdown setup shared by the editor (/editor/) and packages/editor/scripts/editor-roundtrip.mjs, so the check
2
- // runs the same Markdown parser and writer as the browser.
3
- import { Editor, editorViewCtx, rootCtx, defaultValueCtx, remarkStringifyOptionsCtx, serializerCtx } from '@milkdown/kit/core';
4
- import { commonmark } from '@milkdown/kit/preset/commonmark';
5
- import { gfm } from '@milkdown/kit/preset/gfm';
6
- import { $markSchema, $nodeSchema, $prose, $remark } from '@milkdown/kit/utils';
7
- import { Plugin } from '@milkdown/kit/prose/state';
8
- import { blockHtml, parseBlock } from '../lib/blocks.mjs';
9
- import { COLOR_CLOSE, TEXT_COLORS, colorClass, colorOpen, colorOpened } from '../lib/text-colors.mjs';
10
-
11
- // Write Markdown the way imported files are written: "- " bullets and
12
- // "* * *" rules, so a save changes as few lines as possible.
13
- const stringify = { bullet: '-', listItemIndent: 'tab', rule: '*', ruleSpaces: true };
14
-
15
- // The site's blocks in the text (packages/editor/lib/blocks.mjs), read from and written back as their line of HTML.
16
- // Milkdown puts HTML at the top of the text in a paragraph; a paragraph that is only a block becomes
17
- // a siteBlock node (with its type and props) before the text is read. Any type is read: the sections
18
- // of the fixed pages are blocks too (sections.mjs); the site shows only its own (RichText.astro).
19
- // Other HTML on a line of its own (YouTube, Vimeo, Calendly, an imported table) is a block too, of the
20
- // type HTML, with the HTML as it is as its `code`, and written back as it was.
21
- export const HTML = 'html';
22
- const remarkSiteBlocks = $remark('remarkSiteBlocks', () => () => (tree) => {
23
- tree.children = tree.children.map((child) => {
24
- const only = child.type === 'paragraph' && child.children?.length === 1 ? child.children[0] : child;
25
- if (only.type !== 'html') return child;
26
- const block = parseBlock(String(only.value), null);
27
- return block
28
- ? { type: 'siteBlock', blockType: block.type, props: block.props }
29
- : { type: 'siteBlock', blockType: HTML, props: { code: String(only.value) } };
30
- });
31
- });
32
-
33
- // One node per block, with its type and its props. How it looks in the editor: MarkdownEditor.tsx.
34
- /** @type {import('@milkdown/kit/utils').$NodeSchema<'siteBlock'>} */
35
- export const siteBlockSchema = $nodeSchema('siteBlock', () => ({
36
- group: 'block',
37
- atom: true,
38
- selectable: true,
39
- attrs: { type: { default: '' }, props: { default: {} } },
40
- parseDOM: [{ tag: 'div[data-site-block]', getAttrs: (dom) => parseBlock(dom.dataset.siteBlock ?? '', null) ?? false }],
41
- toDOM: (node) => ['div', { 'data-site-block': blockHtml(node.attrs.type, node.attrs.props) }],
42
- parseMarkdown: {
43
- match: (node) => node.type === 'siteBlock',
44
- runner: (state, node, type) => {
45
- state.addNode(type, { type: node.blockType, props: node.props });
46
- },
47
- },
48
- toMarkdown: {
49
- match: (node) => node.type.name === 'siteBlock',
50
- runner: (state, node) => {
51
- const { type, props } = node.attrs;
52
- state.addNode('html', undefined, type === HTML ? String(props.code ?? '') : blockHtml(type, props));
53
- },
54
- },
55
- }));
56
-
57
- // A word or more in one of the site's colours (packages/editor/lib/text-colors.mjs): in the Markdown the HTML around
58
- // it, <span class="color-accent">…</span>, which Milkdown would read as two pieces of HTML with the text between them;
59
- // read as the text with the colour (a mark), and written back as the same HTML. A piece of HTML without its end, or
60
- // another span, stays HTML.
61
- function colorRuns(children) {
62
- const out = [];
63
- for (let i = 0; i < children.length; i++) {
64
- const color = children[i].type === 'html' ? colorOpened(children[i].value) : null;
65
- let end = -1;
66
- for (let j = i + 1, depth = 0; color && j < children.length && end < 0; j++) {
67
- const node = children[j];
68
- if (node.type !== 'html') continue;
69
- if (/^<span\b/.test(node.value)) depth++;
70
- else if (node.value === COLOR_CLOSE && depth-- === 0) end = j;
71
- }
72
- if (end < 0) out.push(children[i]);
73
- else {
74
- out.push({ type: 'textColor', color, children: children.slice(i + 1, end) });
75
- i = end;
76
- }
77
- }
78
- return out;
79
- }
80
-
81
- function textColorMarkdown(node, _, state, info) {
82
- const tracker = state.createTracker(info);
83
- let value = tracker.move(colorOpen(node.color));
84
- value += tracker.move(state.containerPhrasing(node, { ...tracker.current(), before: '>', after: '<' }));
85
- return value + tracker.move(COLOR_CLOSE);
86
- }
87
- textColorMarkdown.peek = () => '<';
88
-
89
- const remarkTextColors = $remark(
90
- 'remarkTextColors',
91
- () =>
92
- function () {
93
- const data = this.data();
94
- (data.toMarkdownExtensions ??= []).push({ handlers: { textColor: textColorMarkdown } });
95
- const walk = (node) => {
96
- if (!node.children) return;
97
- node.children = colorRuns(node.children);
98
- node.children.forEach(walk);
99
- };
100
- return walk;
101
- },
102
- );
103
-
104
- /** @type {import('@milkdown/kit/utils').$MarkSchema<'textColor'>} */
105
- export const textColorSchema = $markSchema('textColor', () => ({
106
- attrs: { color: { default: TEXT_COLORS[0] } },
107
- parseDOM: TEXT_COLORS.map((color) => ({ tag: `span.${colorClass(color)}`, attrs: { color } })),
108
- toDOM: (mark) => ['span', { class: colorClass(mark.attrs.color) }],
109
- parseMarkdown: {
110
- match: (node) => node.type === 'textColor',
111
- runner: (state, node, markType) => {
112
- state.openMark(markType, { color: node.color });
113
- state.next(node.children);
114
- state.closeMark(markType);
115
- },
116
- },
117
- toMarkdown: {
118
- match: (mark) => mark.type.name === 'textColor',
119
- runner: (state, mark) => {
120
- state.withMark(mark, 'textColor', undefined, { color: mark.attrs.color });
121
- },
122
- },
123
- }));
124
-
125
- /** A Milkdown editor of the text, in root (not created yet). @param {HTMLElement | null} root @param {string} markdown
126
- * @returns {import('@milkdown/kit/core').Editor} */
127
- export function makeEditor(root, markdown) {
128
- return Editor.make()
129
- .config((ctx) => {
130
- ctx.set(rootCtx, root);
131
- ctx.set(defaultValueCtx, markdown);
132
- ctx.update(remarkStringifyOptionsCtx, (options) => ({ ...options, ...stringify }));
133
- })
134
- .use(commonmark)
135
- .use(gfm)
136
- .use(remarkSiteBlocks)
137
- .use(siteBlockSchema)
138
- .use(remarkTextColors)
139
- .use(textColorSchema);
140
- }
141
-
142
- // The text in parts, for a fixed page's sections (sections.mjs): each block, each heading at the top
143
- // level ("Overskrift", H2), and the Markdown of the text between them. Empty paragraphs (the lines
144
- // kept free between two blocks to write in), empty headings (left when one is deleted) and the page's H1
145
- // (no section's) are left out.
146
- export function partsOf(ctx) {
147
- const doc = ctx.get(editorViewCtx).state.doc;
148
- const serialize = ctx.get(serializerCtx);
149
- const parts = [];
150
- let run = [];
151
- const flush = () => {
152
- const markdown = run.length ? serialize(doc.type.create(null, run)).trim() : '';
153
- if (markdown) parts.push({ markdown });
154
- run = [];
155
- };
156
- doc.forEach((node) => {
157
- // HTML in a section's text stays in its text.
158
- if (node.type.name === 'siteBlock' && node.attrs.type !== HTML) {
159
- flush();
160
- parts.push({ block: { type: node.attrs.type, props: node.attrs.props } });
161
- } else if (node.type.name === 'heading' && node.attrs.level === 2) {
162
- flush();
163
- parts.push({ heading: node.textContent.trim() });
164
- } else if (node.type.name === 'heading' && node.attrs.level === 1) {
165
- flush();
166
- } else if (!((node.type.name === 'paragraph' || node.type.name === 'heading') && !node.textContent.trim() && !node.childCount))
167
- run.push(node);
168
- });
169
- flush();
170
- return parts;
171
- }
172
-
173
- // Keeps a free line (an empty paragraph) between two blocks and before and after them, so there is
174
- // always a place to write a text between them. Not part of undo. Used by the editor (MarkdownEditor.tsx)
175
- // and the check, which writes the text back with the free lines in it.
176
- /** @type {import('@milkdown/kit/utils').$Prose} */
177
- export const spacing = $prose(
178
- () =>
179
- new Plugin({
180
- appendTransaction: (_, __, state) => {
181
- const gaps = [];
182
- let before = null;
183
- state.doc.forEach((node, at) => {
184
- if (node.type.name === 'siteBlock' && (!before || before.type.name === 'siteBlock')) gaps.push(at);
185
- before = node;
186
- });
187
- if (state.doc.lastChild?.type.name === 'siteBlock') gaps.push(state.doc.content.size);
188
- if (!gaps.length) return null;
189
- const tr = state.tr;
190
- for (const at of gaps.reverse()) tr.insert(at, state.schema.nodes.paragraph.create());
191
- return tr.setMeta('addToHistory', false);
192
- },
193
- }),
194
- );
195
-
196
- // The Markdown of the text, without its empty paragraphs (the free lines between the blocks).
197
- export function markdownOf(ctx) {
198
- const doc = ctx.get(editorViewCtx).state.doc;
199
- const kept = [];
200
- doc.forEach((node) => {
201
- if (!(node.type.name === 'paragraph' && node.content.size === 0)) kept.push(node);
202
- });
203
- return ctx.get(serializerCtx)(doc.type.create(null, kept));
204
- }
1
+ // The Milkdown setup shared by the editor (/editor/) and packages/editor/scripts/editor-roundtrip.mjs, so the check
2
+ // runs the same Markdown parser and writer as the browser.
3
+ import { Editor, editorViewCtx, rootCtx, defaultValueCtx, remarkStringifyOptionsCtx, serializerCtx } from '@milkdown/kit/core';
4
+ import { commonmark } from '@milkdown/kit/preset/commonmark';
5
+ import { gfm } from '@milkdown/kit/preset/gfm';
6
+ import { $markSchema, $nodeSchema, $prose, $remark } from '@milkdown/kit/utils';
7
+ import { Plugin } from '@milkdown/kit/prose/state';
8
+ import { blockHtml, parseBlock } from '../lib/blocks.mjs';
9
+ import { COLOR_CLOSE, TEXT_COLORS, colorClass, colorOpen, colorOpened } from '../lib/text-colors.mjs';
10
+
11
+ // Write Markdown the way imported files are written: "- " bullets and
12
+ // "* * *" rules, so a save changes as few lines as possible.
13
+ const stringify = { bullet: '-', listItemIndent: 'tab', rule: '*', ruleSpaces: true };
14
+
15
+ // The site's blocks in the text (packages/editor/lib/blocks.mjs), read from and written back as their line of HTML.
16
+ // Milkdown puts HTML at the top of the text in a paragraph; a paragraph that is only a block becomes
17
+ // a siteBlock node (with its type and props) before the text is read. Any type is read: the sections
18
+ // of the fixed pages are blocks too (sections.mjs); the site shows only its own (RichText.astro).
19
+ // Other HTML on a line of its own (YouTube, Vimeo, Calendly, an imported table) is a block too, of the
20
+ // type HTML, with the HTML as it is as its `code`, and written back as it was.
21
+ export const HTML = 'html';
22
+ const remarkSiteBlocks = $remark('remarkSiteBlocks', () => () => (tree) => {
23
+ tree.children = tree.children.map((child) => {
24
+ const only = child.type === 'paragraph' && child.children?.length === 1 ? child.children[0] : child;
25
+ if (only.type !== 'html') return child;
26
+ const block = parseBlock(String(only.value), null);
27
+ return block
28
+ ? { type: 'siteBlock', blockType: block.type, props: block.props }
29
+ : { type: 'siteBlock', blockType: HTML, props: { code: String(only.value) } };
30
+ });
31
+ });
32
+
33
+ // One node per block, with its type and its props. How it looks in the editor: MarkdownEditor.tsx.
34
+ /** @type {import('@milkdown/kit/utils').$NodeSchema<'siteBlock'>} */
35
+ export const siteBlockSchema = $nodeSchema('siteBlock', () => ({
36
+ group: 'block',
37
+ atom: true,
38
+ selectable: true,
39
+ attrs: { type: { default: '' }, props: { default: {} } },
40
+ parseDOM: [{ tag: 'div[data-site-block]', getAttrs: (dom) => parseBlock(dom.dataset.siteBlock ?? '', null) ?? false }],
41
+ toDOM: (node) => ['div', { 'data-site-block': blockHtml(node.attrs.type, node.attrs.props) }],
42
+ parseMarkdown: {
43
+ match: (node) => node.type === 'siteBlock',
44
+ runner: (state, node, type) => {
45
+ state.addNode(type, { type: node.blockType, props: node.props });
46
+ },
47
+ },
48
+ toMarkdown: {
49
+ match: (node) => node.type.name === 'siteBlock',
50
+ runner: (state, node) => {
51
+ const { type, props } = node.attrs;
52
+ state.addNode('html', undefined, type === HTML ? String(props.code ?? '') : blockHtml(type, props));
53
+ },
54
+ },
55
+ }));
56
+
57
+ // A word or more in one of the site's colours (packages/editor/lib/text-colors.mjs): in the Markdown the HTML around
58
+ // it, <span class="color-accent">…</span>, which Milkdown would read as two pieces of HTML with the text between them;
59
+ // read as the text with the colour (a mark), and written back as the same HTML. A piece of HTML without its end, or
60
+ // another span, stays HTML.
61
+ function colorRuns(children) {
62
+ const out = [];
63
+ for (let i = 0; i < children.length; i++) {
64
+ const color = children[i].type === 'html' ? colorOpened(children[i].value) : null;
65
+ let end = -1;
66
+ for (let j = i + 1, depth = 0; color && j < children.length && end < 0; j++) {
67
+ const node = children[j];
68
+ if (node.type !== 'html') continue;
69
+ if (/^<span\b/.test(node.value)) depth++;
70
+ else if (node.value === COLOR_CLOSE && depth-- === 0) end = j;
71
+ }
72
+ if (end < 0) out.push(children[i]);
73
+ else {
74
+ out.push({ type: 'textColor', color, children: children.slice(i + 1, end) });
75
+ i = end;
76
+ }
77
+ }
78
+ return out;
79
+ }
80
+
81
+ function textColorMarkdown(node, _, state, info) {
82
+ const tracker = state.createTracker(info);
83
+ let value = tracker.move(colorOpen(node.color));
84
+ value += tracker.move(state.containerPhrasing(node, { ...tracker.current(), before: '>', after: '<' }));
85
+ return value + tracker.move(COLOR_CLOSE);
86
+ }
87
+ textColorMarkdown.peek = () => '<';
88
+
89
+ const remarkTextColors = $remark(
90
+ 'remarkTextColors',
91
+ () =>
92
+ function () {
93
+ const data = this.data();
94
+ (data.toMarkdownExtensions ??= []).push({ handlers: { textColor: textColorMarkdown } });
95
+ const walk = (node) => {
96
+ if (!node.children) return;
97
+ node.children = colorRuns(node.children);
98
+ node.children.forEach(walk);
99
+ };
100
+ return walk;
101
+ },
102
+ );
103
+
104
+ /** @type {import('@milkdown/kit/utils').$MarkSchema<'textColor'>} */
105
+ export const textColorSchema = $markSchema('textColor', () => ({
106
+ attrs: { color: { default: TEXT_COLORS[0] } },
107
+ parseDOM: TEXT_COLORS.map((color) => ({ tag: `span.${colorClass(color)}`, attrs: { color } })),
108
+ toDOM: (mark) => ['span', { class: colorClass(mark.attrs.color) }],
109
+ parseMarkdown: {
110
+ match: (node) => node.type === 'textColor',
111
+ runner: (state, node, markType) => {
112
+ state.openMark(markType, { color: node.color });
113
+ state.next(node.children);
114
+ state.closeMark(markType);
115
+ },
116
+ },
117
+ toMarkdown: {
118
+ match: (mark) => mark.type.name === 'textColor',
119
+ runner: (state, mark) => {
120
+ state.withMark(mark, 'textColor', undefined, { color: mark.attrs.color });
121
+ },
122
+ },
123
+ }));
124
+
125
+ /** A Milkdown editor of the text, in root (not created yet). @param {HTMLElement | null} root @param {string} markdown
126
+ * @returns {import('@milkdown/kit/core').Editor} */
127
+ export function makeEditor(root, markdown) {
128
+ return Editor.make()
129
+ .config((ctx) => {
130
+ ctx.set(rootCtx, root);
131
+ ctx.set(defaultValueCtx, markdown);
132
+ ctx.update(remarkStringifyOptionsCtx, (options) => ({ ...options, ...stringify }));
133
+ })
134
+ .use(commonmark)
135
+ .use(gfm)
136
+ .use(remarkSiteBlocks)
137
+ .use(siteBlockSchema)
138
+ .use(remarkTextColors)
139
+ .use(textColorSchema);
140
+ }
141
+
142
+ // The text in parts, for a fixed page's sections (sections.mjs): each block, each heading at the top
143
+ // level ("Overskrift", H2), and the Markdown of the text between them. Empty paragraphs (the lines
144
+ // kept free between two blocks to write in), empty headings (left when one is deleted) and the page's H1
145
+ // (no section's) are left out.
146
+ export function partsOf(ctx) {
147
+ const doc = ctx.get(editorViewCtx).state.doc;
148
+ const serialize = ctx.get(serializerCtx);
149
+ const parts = [];
150
+ let run = [];
151
+ const flush = () => {
152
+ const markdown = run.length ? serialize(doc.type.create(null, run)).trim() : '';
153
+ if (markdown) parts.push({ markdown });
154
+ run = [];
155
+ };
156
+ doc.forEach((node) => {
157
+ // HTML in a section's text stays in its text.
158
+ if (node.type.name === 'siteBlock' && node.attrs.type !== HTML) {
159
+ flush();
160
+ parts.push({ block: { type: node.attrs.type, props: node.attrs.props } });
161
+ } else if (node.type.name === 'heading' && node.attrs.level === 2) {
162
+ flush();
163
+ parts.push({ heading: node.textContent.trim() });
164
+ } else if (node.type.name === 'heading' && node.attrs.level === 1) {
165
+ flush();
166
+ } else if (!((node.type.name === 'paragraph' || node.type.name === 'heading') && !node.textContent.trim() && !node.childCount))
167
+ run.push(node);
168
+ });
169
+ flush();
170
+ return parts;
171
+ }
172
+
173
+ // Keeps a free line (an empty paragraph) between two blocks and before and after them, so there is
174
+ // always a place to write a text between them. Not part of undo. Used by the editor (MarkdownEditor.tsx)
175
+ // and the check, which writes the text back with the free lines in it.
176
+ /** @type {import('@milkdown/kit/utils').$Prose} */
177
+ export const spacing = $prose(
178
+ () =>
179
+ new Plugin({
180
+ appendTransaction: (_, __, state) => {
181
+ const gaps = [];
182
+ let before = null;
183
+ state.doc.forEach((node, at) => {
184
+ if (node.type.name === 'siteBlock' && (!before || before.type.name === 'siteBlock')) gaps.push(at);
185
+ before = node;
186
+ });
187
+ if (state.doc.lastChild?.type.name === 'siteBlock') gaps.push(state.doc.content.size);
188
+ if (!gaps.length) return null;
189
+ const tr = state.tr;
190
+ for (const at of gaps.reverse()) tr.insert(at, state.schema.nodes.paragraph.create());
191
+ return tr.setMeta('addToHistory', false);
192
+ },
193
+ }),
194
+ );
195
+
196
+ // The Markdown of the text, without its empty paragraphs (the free lines between the blocks).
197
+ export function markdownOf(ctx) {
198
+ const doc = ctx.get(editorViewCtx).state.doc;
199
+ const kept = [];
200
+ doc.forEach((node) => {
201
+ if (!(node.type.name === 'paragraph' && node.content.size === 0)) kept.push(node);
202
+ });
203
+ return ctx.get(serializerCtx)(doc.type.create(null, kept));
204
+ }