@morphemecms/cms 0.1.0 → 0.2.0-next-20261104150211

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (908) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +21 -21
  3. package/README.md +51 -51
  4. package/astro.mjs +162 -162
  5. package/bin/morpheme.mjs +38 -38
  6. package/client.d.ts +10 -10
  7. package/defaults/blockTexts.ts +33 -33
  8. package/defaults/collections.ts +774 -774
  9. package/defaults/colors.ts +125 -125
  10. package/defaults/company.ts +20 -20
  11. package/defaults/editor.ts +178 -178
  12. package/defaults/internalLinks.ts +30 -30
  13. package/defaults/opens.ts +18 -18
  14. package/defaults/popup.tsx +93 -93
  15. package/defaults/privacy.ts +79 -79
  16. package/defaults/rules.ts +450 -450
  17. package/defaults/schema.ts +16 -16
  18. package/defaults/sitedata.ts +129 -129
  19. package/defaults/standard.ts +106 -106
  20. package/defaults/standardPages.ts +87 -87
  21. package/defaults/texts.ts +481 -481
  22. package/demo/README.md +26 -26
  23. package/demo/src/content/blog/build-a-page-from-blocks.md +19 -19
  24. package/demo/src/content/blog/colors-everyone-can-read.md +19 -19
  25. package/demo/src/content/blog/edit-your-website-from-your-phone.md +21 -21
  26. package/demo/src/content/blog/every-save-is-a-version.md +21 -21
  27. package/demo/src/content/blog/schedule-a-post.md +17 -17
  28. package/demo/src/content/blog/secure-from-day-one.md +17 -17
  29. package/demo/src/content/blog/seo-without-the-guesswork.md +23 -23
  30. package/demo/src/content/blog/switch-themes-without-losing-anything.md +23 -23
  31. package/demo/src/content/blog/the-app-store.md +21 -21
  32. package/demo/src/content/pages/about.md +22 -22
  33. package/demo/src/content/pages/app-store.md +30 -30
  34. package/demo/src/content/pages/blocks.md +98 -98
  35. package/demo/src/content/pages/blog-page.md +11 -11
  36. package/demo/src/content/pages/contact.md +16 -16
  37. package/demo/src/content/pages/get-started.md +20 -20
  38. package/demo/src/content/pages/home.md +26 -26
  39. package/demo/src/content/pages/page-not-found.md +11 -11
  40. package/demo/src/content/pages/privacy-policy.md +24 -24
  41. package/demo/src/data/blocks.json +25 -25
  42. package/demo/src/data/booking.json +6 -6
  43. package/demo/src/data/categories/apps.json +6 -6
  44. package/demo/src/data/categories/design.json +6 -6
  45. package/demo/src/data/categories/editing.json +6 -6
  46. package/demo/src/data/categories/security.json +6 -6
  47. package/demo/src/data/categories/seo.json +6 -6
  48. package/demo/src/data/colors.json +75 -75
  49. package/demo/src/data/contact.json +8 -8
  50. package/demo/src/data/cookies.json +21 -21
  51. package/demo/src/data/footer.json +27 -27
  52. package/demo/src/data/menu.json +35 -35
  53. package/demo/src/data/mobile-menu.json +25 -25
  54. package/demo/src/data/popups/booking-bar.json +13 -13
  55. package/demo/src/data/popups/try-the-editor.json +16 -16
  56. package/demo/src/data/standard-pages.json +8 -8
  57. package/demo/src/data/testimonials/sample-bakery.json +10 -10
  58. package/demo/src/data/testimonials/sample-clinic.json +10 -10
  59. package/demo/src/data/testimonials/sample-studio.json +10 -10
  60. package/demo/src/site/colors.ts +11 -11
  61. package/demo/src/site/config.ts +19 -19
  62. package/icons/lucide/LICENSE +43 -43
  63. package/icons/lucide/address-book.svg +1 -1
  64. package/icons/lucide/app-window.svg +1 -1
  65. package/icons/lucide/arrow-counter-clockwise.svg +1 -1
  66. package/icons/lucide/arrow-down.svg +1 -1
  67. package/icons/lucide/arrow-left.svg +1 -1
  68. package/icons/lucide/arrow-right.svg +1 -1
  69. package/icons/lucide/arrow-square-out.svg +1 -1
  70. package/icons/lucide/arrow-u-up-left.svg +1 -1
  71. package/icons/lucide/arrow-u-up-right.svg +1 -1
  72. package/icons/lucide/arrow-up-right.svg +1 -1
  73. package/icons/lucide/arrow-up.svg +1 -1
  74. package/icons/lucide/arrows-down-up.svg +1 -1
  75. package/icons/lucide/arrows-in-line-horizontal.svg +1 -1
  76. package/icons/lucide/arrows-out-line-horizontal.svg +1 -1
  77. package/icons/lucide/article.svg +1 -1
  78. package/icons/lucide/bank.svg +1 -1
  79. package/icons/lucide/bell.svg +1 -1
  80. package/icons/lucide/bicycle.svg +1 -1
  81. package/icons/lucide/binoculars.svg +1 -1
  82. package/icons/lucide/book-open-text.svg +1 -1
  83. package/icons/lucide/book-open.svg +1 -1
  84. package/icons/lucide/browser.svg +1 -1
  85. package/icons/lucide/buildings.svg +1 -1
  86. package/icons/lucide/bus.svg +1 -1
  87. package/icons/lucide/calendar-blank.svg +1 -1
  88. package/icons/lucide/calendar-check.svg +1 -1
  89. package/icons/lucide/car.svg +1 -1
  90. package/icons/lucide/cards.svg +1 -1
  91. package/icons/lucide/caret-down.svg +1 -1
  92. package/icons/lucide/caret-left.svg +1 -1
  93. package/icons/lucide/caret-right.svg +1 -1
  94. package/icons/lucide/caret-up.svg +1 -1
  95. package/icons/lucide/certificate.svg +1 -1
  96. package/icons/lucide/chart-line-up.svg +1 -1
  97. package/icons/lucide/chats.svg +1 -1
  98. package/icons/lucide/check-circle.svg +1 -1
  99. package/icons/lucide/check.svg +1 -1
  100. package/icons/lucide/circle-half.svg +1 -1
  101. package/icons/lucide/circle.svg +1 -1
  102. package/icons/lucide/clock-counter-clockwise.svg +1 -1
  103. package/icons/lucide/clock.svg +1 -1
  104. package/icons/lucide/code.svg +1 -1
  105. package/icons/lucide/coffee.svg +1 -1
  106. package/icons/lucide/columns.svg +1 -1
  107. package/icons/lucide/cookie.svg +1 -1
  108. package/icons/lucide/copy.svg +1 -1
  109. package/icons/lucide/credit-card.svg +1 -1
  110. package/icons/lucide/currency-circle-dollar.svg +1 -1
  111. package/icons/lucide/cursor-click.svg +1 -1
  112. package/icons/lucide/database.svg +1 -1
  113. package/icons/lucide/desktop.svg +1 -1
  114. package/icons/lucide/device-mobile.svg +1 -1
  115. package/icons/lucide/door-open.svg +1 -1
  116. package/icons/lucide/download-simple.svg +1 -1
  117. package/icons/lucide/envelope-simple.svg +1 -1
  118. package/icons/lucide/eye-slash.svg +1 -1
  119. package/icons/lucide/eye.svg +1 -1
  120. package/icons/lucide/file-pdf.svg +1 -1
  121. package/icons/lucide/file-text.svg +1 -1
  122. package/icons/lucide/file-video.svg +1 -1
  123. package/icons/lucide/file-zip.svg +1 -1
  124. package/icons/lucide/flower-lotus.svg +1 -1
  125. package/icons/lucide/folder-simple.svg +1 -1
  126. package/icons/lucide/funnel.svg +1 -1
  127. package/icons/lucide/gauge.svg +1 -1
  128. package/icons/lucide/gear.svg +1 -1
  129. package/icons/lucide/github-logo.svg +1 -1
  130. package/icons/lucide/globe.svg +1 -1
  131. package/icons/lucide/google-logo.svg +1 -1
  132. package/icons/lucide/graduation-cap.svg +1 -1
  133. package/icons/lucide/hammer.svg +1 -1
  134. package/icons/lucide/hand-heart.svg +1 -1
  135. package/icons/lucide/handshake.svg +1 -1
  136. package/icons/lucide/hard-drives.svg +1 -1
  137. package/icons/lucide/heart.svg +1 -1
  138. package/icons/lucide/house.svg +1 -1
  139. package/icons/lucide/image-square.svg +1 -1
  140. package/icons/lucide/image.svg +1 -1
  141. package/icons/lucide/info.svg +1 -1
  142. package/icons/lucide/keyboard.svg +1 -1
  143. package/icons/lucide/leaf.svg +1 -1
  144. package/icons/lucide/lifebuoy.svg +1 -1
  145. package/icons/lucide/lightbulb.svg +1 -1
  146. package/icons/lucide/link-break.svg +1 -1
  147. package/icons/lucide/link-simple.svg +1 -1
  148. package/icons/lucide/list-bullets.svg +1 -1
  149. package/icons/lucide/list-checks.svg +1 -1
  150. package/icons/lucide/list-numbers.svg +1 -1
  151. package/icons/lucide/list.svg +1 -1
  152. package/icons/lucide/lock-simple-open.svg +1 -1
  153. package/icons/lucide/lock-simple.svg +1 -1
  154. package/icons/lucide/magnifying-glass.svg +1 -1
  155. package/icons/lucide/map-pin.svg +1 -1
  156. package/icons/lucide/map-trifold.svg +1 -1
  157. package/icons/lucide/medal.svg +1 -1
  158. package/icons/lucide/megaphone.svg +1 -1
  159. package/icons/lucide/minus.svg +1 -1
  160. package/icons/lucide/moon.svg +1 -1
  161. package/icons/lucide/newspaper.svg +1 -1
  162. package/icons/lucide/pack.json +23 -23
  163. package/icons/lucide/paint-brush-broad.svg +1 -1
  164. package/icons/lucide/palette.svg +1 -1
  165. package/icons/lucide/paper-plane-tilt.svg +1 -1
  166. package/icons/lucide/pencil-simple.svg +1 -1
  167. package/icons/lucide/phone.svg +1 -1
  168. package/icons/lucide/play-fill.svg +1 -1
  169. package/icons/lucide/plus.svg +1 -1
  170. package/icons/lucide/prohibit.svg +1 -1
  171. package/icons/lucide/puzzle-piece.svg +1 -1
  172. package/icons/lucide/question.svg +1 -1
  173. package/icons/lucide/quotes.svg +1 -1
  174. package/icons/lucide/rows.svg +1 -1
  175. package/icons/lucide/ruler.svg +1 -1
  176. package/icons/lucide/scan.svg +1 -1
  177. package/icons/lucide/shapes.svg +1 -1
  178. package/icons/lucide/share-network.svg +1 -1
  179. package/icons/lucide/shield-check.svg +1 -1
  180. package/icons/lucide/sidebar-simple.svg +1 -1
  181. package/icons/lucide/sign-out.svg +1 -1
  182. package/icons/lucide/signpost.svg +1 -1
  183. package/icons/lucide/sliders-horizontal.svg +1 -1
  184. package/icons/lucide/smiley.svg +1 -1
  185. package/icons/lucide/sparkle.svg +1 -1
  186. package/icons/lucide/square-half-bottom.svg +1 -1
  187. package/icons/lucide/square.svg +1 -1
  188. package/icons/lucide/squares-four.svg +1 -1
  189. package/icons/lucide/sticker.svg +1 -1
  190. package/icons/lucide/storefront.svg +1 -1
  191. package/icons/lucide/sun.svg +1 -1
  192. package/icons/lucide/swatches.svg +1 -1
  193. package/icons/lucide/tag.svg +1 -1
  194. package/icons/lucide/text-aa.svg +1 -1
  195. package/icons/lucide/text-align-left.svg +1 -1
  196. package/icons/lucide/text-b.svg +1 -1
  197. package/icons/lucide/text-h-one.svg +1 -1
  198. package/icons/lucide/text-h-three.svg +1 -1
  199. package/icons/lucide/text-h-two.svg +1 -1
  200. package/icons/lucide/text-italic.svg +1 -1
  201. package/icons/lucide/text-t.svg +1 -1
  202. package/icons/lucide/ticket.svg +1 -1
  203. package/icons/lucide/toggle-right.svg +1 -1
  204. package/icons/lucide/train.svg +1 -1
  205. package/icons/lucide/trash.svg +1 -1
  206. package/icons/lucide/upload-simple.svg +1 -1
  207. package/icons/lucide/user-circle.svg +1 -1
  208. package/icons/lucide/user.svg +1 -1
  209. package/icons/lucide/users-three.svg +1 -1
  210. package/icons/lucide/users.svg +1 -1
  211. package/icons/lucide/video-camera.svg +1 -1
  212. package/icons/lucide/warning-circle.svg +1 -1
  213. package/icons/lucide/warning.svg +1 -1
  214. package/icons/lucide/wave-sine.svg +1 -1
  215. package/icons/lucide/wheelchair.svg +1 -1
  216. package/icons/lucide/wrench.svg +1 -1
  217. package/icons/lucide/x.svg +1 -1
  218. package/icons/material-symbols/LICENSE +201 -201
  219. package/icons/material-symbols/address-book.svg +1 -1
  220. package/icons/material-symbols/app-window.svg +1 -1
  221. package/icons/material-symbols/arrow-counter-clockwise.svg +1 -1
  222. package/icons/material-symbols/arrow-down.svg +1 -1
  223. package/icons/material-symbols/arrow-left.svg +1 -1
  224. package/icons/material-symbols/arrow-right.svg +1 -1
  225. package/icons/material-symbols/arrow-square-out.svg +1 -1
  226. package/icons/material-symbols/arrow-u-up-left.svg +1 -1
  227. package/icons/material-symbols/arrow-u-up-right.svg +1 -1
  228. package/icons/material-symbols/arrow-up-right.svg +1 -1
  229. package/icons/material-symbols/arrow-up.svg +1 -1
  230. package/icons/material-symbols/arrows-down-up.svg +1 -1
  231. package/icons/material-symbols/arrows-in-line-horizontal.svg +1 -1
  232. package/icons/material-symbols/arrows-out-line-horizontal.svg +1 -1
  233. package/icons/material-symbols/article.svg +1 -1
  234. package/icons/material-symbols/bank.svg +1 -1
  235. package/icons/material-symbols/bell.svg +1 -1
  236. package/icons/material-symbols/bicycle.svg +1 -1
  237. package/icons/material-symbols/binoculars.svg +1 -1
  238. package/icons/material-symbols/book-open-text.svg +1 -1
  239. package/icons/material-symbols/book-open.svg +1 -1
  240. package/icons/material-symbols/browser.svg +1 -1
  241. package/icons/material-symbols/buildings.svg +1 -1
  242. package/icons/material-symbols/bus.svg +1 -1
  243. package/icons/material-symbols/calendar-blank.svg +1 -1
  244. package/icons/material-symbols/calendar-check.svg +1 -1
  245. package/icons/material-symbols/car.svg +1 -1
  246. package/icons/material-symbols/cards.svg +1 -1
  247. package/icons/material-symbols/caret-down.svg +1 -1
  248. package/icons/material-symbols/caret-left.svg +1 -1
  249. package/icons/material-symbols/caret-right.svg +1 -1
  250. package/icons/material-symbols/caret-up.svg +1 -1
  251. package/icons/material-symbols/certificate.svg +1 -1
  252. package/icons/material-symbols/chart-line-up.svg +1 -1
  253. package/icons/material-symbols/chats.svg +1 -1
  254. package/icons/material-symbols/check-circle.svg +1 -1
  255. package/icons/material-symbols/check.svg +1 -1
  256. package/icons/material-symbols/circle-half.svg +1 -1
  257. package/icons/material-symbols/circle.svg +1 -1
  258. package/icons/material-symbols/clock-counter-clockwise.svg +1 -1
  259. package/icons/material-symbols/clock.svg +1 -1
  260. package/icons/material-symbols/code.svg +1 -1
  261. package/icons/material-symbols/coffee.svg +1 -1
  262. package/icons/material-symbols/columns.svg +1 -1
  263. package/icons/material-symbols/cookie.svg +1 -1
  264. package/icons/material-symbols/copy.svg +1 -1
  265. package/icons/material-symbols/credit-card.svg +1 -1
  266. package/icons/material-symbols/currency-circle-dollar.svg +1 -1
  267. package/icons/material-symbols/cursor-click.svg +1 -1
  268. package/icons/material-symbols/database.svg +1 -1
  269. package/icons/material-symbols/desktop.svg +1 -1
  270. package/icons/material-symbols/device-mobile.svg +1 -1
  271. package/icons/material-symbols/door-open.svg +1 -1
  272. package/icons/material-symbols/download-simple.svg +1 -1
  273. package/icons/material-symbols/envelope-simple.svg +1 -1
  274. package/icons/material-symbols/eye-slash.svg +1 -1
  275. package/icons/material-symbols/eye.svg +1 -1
  276. package/icons/material-symbols/file-pdf.svg +1 -1
  277. package/icons/material-symbols/file-text.svg +1 -1
  278. package/icons/material-symbols/file-video.svg +1 -1
  279. package/icons/material-symbols/file-zip.svg +1 -1
  280. package/icons/material-symbols/flower-lotus.svg +1 -1
  281. package/icons/material-symbols/folder-simple.svg +1 -1
  282. package/icons/material-symbols/funnel.svg +1 -1
  283. package/icons/material-symbols/gauge.svg +1 -1
  284. package/icons/material-symbols/gear.svg +1 -1
  285. package/icons/material-symbols/github-logo.svg +1 -1
  286. package/icons/material-symbols/globe.svg +1 -1
  287. package/icons/material-symbols/google-logo.svg +1 -1
  288. package/icons/material-symbols/graduation-cap.svg +1 -1
  289. package/icons/material-symbols/hammer.svg +1 -1
  290. package/icons/material-symbols/hand-heart.svg +1 -1
  291. package/icons/material-symbols/handshake.svg +1 -1
  292. package/icons/material-symbols/hard-drives.svg +1 -1
  293. package/icons/material-symbols/heart.svg +1 -1
  294. package/icons/material-symbols/house.svg +1 -1
  295. package/icons/material-symbols/image-square.svg +1 -1
  296. package/icons/material-symbols/image.svg +1 -1
  297. package/icons/material-symbols/info.svg +1 -1
  298. package/icons/material-symbols/keyboard.svg +1 -1
  299. package/icons/material-symbols/leaf.svg +1 -1
  300. package/icons/material-symbols/lifebuoy.svg +1 -1
  301. package/icons/material-symbols/lightbulb.svg +1 -1
  302. package/icons/material-symbols/link-break.svg +1 -1
  303. package/icons/material-symbols/link-simple.svg +1 -1
  304. package/icons/material-symbols/list-bullets.svg +1 -1
  305. package/icons/material-symbols/list-checks.svg +1 -1
  306. package/icons/material-symbols/list-numbers.svg +1 -1
  307. package/icons/material-symbols/list.svg +1 -1
  308. package/icons/material-symbols/lock-simple-open.svg +1 -1
  309. package/icons/material-symbols/lock-simple.svg +1 -1
  310. package/icons/material-symbols/magnifying-glass.svg +1 -1
  311. package/icons/material-symbols/map-pin.svg +1 -1
  312. package/icons/material-symbols/map-trifold.svg +1 -1
  313. package/icons/material-symbols/medal.svg +1 -1
  314. package/icons/material-symbols/megaphone.svg +1 -1
  315. package/icons/material-symbols/minus.svg +1 -1
  316. package/icons/material-symbols/moon.svg +1 -1
  317. package/icons/material-symbols/newspaper.svg +1 -1
  318. package/icons/material-symbols/pack.json +29 -29
  319. package/icons/material-symbols/paint-brush-broad.svg +1 -1
  320. package/icons/material-symbols/palette.svg +1 -1
  321. package/icons/material-symbols/paper-plane-tilt.svg +1 -1
  322. package/icons/material-symbols/pencil-simple.svg +1 -1
  323. package/icons/material-symbols/phone.svg +1 -1
  324. package/icons/material-symbols/play-fill.svg +1 -1
  325. package/icons/material-symbols/plus.svg +1 -1
  326. package/icons/material-symbols/prohibit.svg +1 -1
  327. package/icons/material-symbols/puzzle-piece.svg +1 -1
  328. package/icons/material-symbols/question.svg +1 -1
  329. package/icons/material-symbols/quotes.svg +1 -1
  330. package/icons/material-symbols/rows.svg +1 -1
  331. package/icons/material-symbols/ruler.svg +1 -1
  332. package/icons/material-symbols/scan.svg +1 -1
  333. package/icons/material-symbols/shapes.svg +1 -1
  334. package/icons/material-symbols/share-network.svg +1 -1
  335. package/icons/material-symbols/shield-check.svg +1 -1
  336. package/icons/material-symbols/sidebar-simple.svg +1 -1
  337. package/icons/material-symbols/sign-out.svg +1 -1
  338. package/icons/material-symbols/signpost.svg +1 -1
  339. package/icons/material-symbols/sliders-horizontal.svg +1 -1
  340. package/icons/material-symbols/smiley.svg +1 -1
  341. package/icons/material-symbols/sparkle.svg +1 -1
  342. package/icons/material-symbols/square-half-bottom.svg +1 -1
  343. package/icons/material-symbols/square.svg +1 -1
  344. package/icons/material-symbols/squares-four.svg +1 -1
  345. package/icons/material-symbols/sticker.svg +1 -1
  346. package/icons/material-symbols/storefront.svg +1 -1
  347. package/icons/material-symbols/sun.svg +1 -1
  348. package/icons/material-symbols/swatches.svg +1 -1
  349. package/icons/material-symbols/tag.svg +1 -1
  350. package/icons/material-symbols/text-aa.svg +1 -1
  351. package/icons/material-symbols/text-align-left.svg +1 -1
  352. package/icons/material-symbols/text-b.svg +1 -1
  353. package/icons/material-symbols/text-h-one.svg +1 -1
  354. package/icons/material-symbols/text-h-three.svg +1 -1
  355. package/icons/material-symbols/text-h-two.svg +1 -1
  356. package/icons/material-symbols/text-italic.svg +1 -1
  357. package/icons/material-symbols/text-t.svg +1 -1
  358. package/icons/material-symbols/ticket.svg +1 -1
  359. package/icons/material-symbols/toggle-right.svg +1 -1
  360. package/icons/material-symbols/train.svg +1 -1
  361. package/icons/material-symbols/trash.svg +1 -1
  362. package/icons/material-symbols/upload-simple.svg +1 -1
  363. package/icons/material-symbols/user-circle.svg +1 -1
  364. package/icons/material-symbols/user.svg +1 -1
  365. package/icons/material-symbols/users-three.svg +1 -1
  366. package/icons/material-symbols/users.svg +1 -1
  367. package/icons/material-symbols/video-camera.svg +1 -1
  368. package/icons/material-symbols/warning-circle.svg +1 -1
  369. package/icons/material-symbols/warning.svg +1 -1
  370. package/icons/material-symbols/wave-sine.svg +1 -1
  371. package/icons/material-symbols/wheelchair.svg +1 -1
  372. package/icons/material-symbols/wrench.svg +1 -1
  373. package/icons/material-symbols/x.svg +1 -1
  374. package/icons/phosphor/pack.json +8 -8
  375. package/lib/apps.mjs +142 -139
  376. package/lib/apps.test.d.mts +1 -0
  377. package/lib/apps.test.mjs +50 -0
  378. package/lib/blocks.mjs +90 -90
  379. package/lib/caseCollisions.d.mts +4 -0
  380. package/lib/caseCollisions.mjs +62 -0
  381. package/lib/caseCollisions.test.d.mts +1 -0
  382. package/lib/caseCollisions.test.mjs +74 -0
  383. package/lib/colors.ts +86 -86
  384. package/lib/contactBar.ts +18 -18
  385. package/lib/contracts.d.mts +15 -0
  386. package/lib/contracts.mjs +17 -0
  387. package/lib/cookieCategories.mjs +28 -28
  388. package/lib/crop.mjs +83 -83
  389. package/lib/csp.mjs +130 -130
  390. package/lib/cspSources.mjs +60 -60
  391. package/lib/dynamic-colors.ts +426 -426
  392. package/lib/git.mjs +64 -64
  393. package/lib/hooks.ts +51 -51
  394. package/lib/inline.ts +20 -20
  395. package/lib/license-texts/Apache-2.0.txt +190 -190
  396. package/lib/license-texts/BSD-2-Clause.txt +24 -24
  397. package/lib/license-texts/BSD-3-Clause.txt +28 -28
  398. package/lib/license-texts/ISC.txt +15 -15
  399. package/lib/license-texts/MIT.txt +21 -21
  400. package/lib/licenses.d.mts +1 -1
  401. package/lib/licenses.mjs +683 -683
  402. package/lib/markdown.ts +42 -42
  403. package/lib/motion-schemes.mjs +5 -5
  404. package/lib/motion.ts +131 -131
  405. package/lib/notice.mjs +34 -34
  406. package/lib/scheduled.mjs +37 -37
  407. package/lib/snackbar.ts +149 -149
  408. package/lib/status.mjs +18 -18
  409. package/lib/storeEntries.d.mts +18 -0
  410. package/lib/storeEntries.mjs +64 -0
  411. package/lib/storeEntries.test.d.mts +1 -0
  412. package/lib/storeEntries.test.mjs +71 -0
  413. package/lib/svg.mjs +231 -231
  414. package/lib/text-colors.mjs +43 -43
  415. package/lib/video-id.mjs +72 -72
  416. package/lib/video.mjs +91 -91
  417. package/package.json +136 -131
  418. package/pages/404.astro +10 -10
  419. package/pages/[...slug].astro +51 -51
  420. package/pages/_headers.txt +31 -31
  421. package/pages/blog/index.astro +10 -10
  422. package/pages/blog/kategori/[category].astro +18 -18
  423. package/pages/editor/code-images.json.js +25 -25
  424. package/pages/editor/index.astro +75 -75
  425. package/pages/editor/manifest.webmanifest.js +23 -23
  426. package/pages/editor/sw.js +33 -33
  427. package/pages/editor/sw.js.js +4 -4
  428. package/pages/editor/thumbnails.json.js +21 -21
  429. package/pages/editor/version.json.js +22 -22
  430. package/pages/headers.js +4 -4
  431. package/pages/index.astro +10 -10
  432. package/pages/ny.astro +6 -6
  433. package/pages/robots.txt.js +3 -3
  434. package/pages/rss.xml.js +20 -20
  435. package/scripts/app-screenshots.mjs +164 -164
  436. package/scripts/app-workers.mjs +6 -6
  437. package/scripts/bin.mjs +12 -12
  438. package/scripts/built-site.mjs +134 -99
  439. package/scripts/check-consent.mjs +113 -113
  440. package/scripts/check-content.mjs +151 -149
  441. package/scripts/check-demo.mjs +24 -24
  442. package/scripts/check-store.mjs +160 -0
  443. package/scripts/check-themes.mjs +45 -45
  444. package/scripts/check-worker.mjs +569 -569
  445. package/scripts/compare-html.mjs +81 -81
  446. package/scripts/declarations.mjs +10 -0
  447. package/scripts/declarations.test.mjs +32 -0
  448. package/scripts/demo-site.mjs +42 -42
  449. package/scripts/editor-icons.mjs +56 -56
  450. package/scripts/editor-roundtrip.mjs +134 -134
  451. package/scripts/editor-screens.mjs +101 -101
  452. package/scripts/git-env.mjs +9 -9
  453. package/scripts/icon-packs.mjs +151 -151
  454. package/scripts/link-counts.mjs +22 -22
  455. package/scripts/page-colors.mjs +42 -42
  456. package/scripts/releases.mjs +80 -80
  457. package/scripts/responsive-images.mjs +94 -94
  458. package/scripts/scheduled-list.mjs +15 -15
  459. package/scripts/theme-screenshots.mjs +88 -88
  460. package/scripts/types.mjs +17 -21
  461. package/scripts/video-thumbnails.mjs +89 -89
  462. package/scripts/worker-modules.mjs +34 -34
  463. package/site/appCookies.mjs +74 -74
  464. package/site/apps.ts +21 -21
  465. package/site/autolinks.mjs +200 -200
  466. package/site/blockScripts.ts +31 -31
  467. package/site/categories.ts +16 -16
  468. package/site/consent.ts +26 -26
  469. package/site/content.config.ts +84 -84
  470. package/site/content.ts +104 -104
  471. package/site/cookieList.ts +17 -17
  472. package/site/defineSite.d.mts +2 -14
  473. package/site/defineSite.mjs +131 -136
  474. package/site/directives/interact.mjs +31 -31
  475. package/site/editor-version.mjs +26 -26
  476. package/site/fill.ts +13 -13
  477. package/site/format.ts +11 -11
  478. package/site/home.ts +66 -66
  479. package/site/iconPacks.mjs +43 -43
  480. package/site/icons.mjs +605 -605
  481. package/site/images.mjs +157 -157
  482. package/site/motion.ts +13 -13
  483. package/site/noindex.mjs +21 -21
  484. package/site/pageColors.ts +110 -110
  485. package/site/popups.ts +98 -98
  486. package/site/schema.ts +189 -189
  487. package/site/sections.ts +3 -3
  488. package/site/seo.ts +28 -28
  489. package/site/site.ts +76 -76
  490. package/site/siteConfig.mjs +8 -8
  491. package/site/siteCsp.mjs +75 -75
  492. package/site/siteModules.mjs +27 -27
  493. package/site/standardPages.ts +59 -59
  494. package/site/storeTheme.d.mts +6 -0
  495. package/site/storeTheme.mjs +29 -0
  496. package/site/storeTheme.test.d.mts +1 -0
  497. package/site/storeTheme.test.mjs +53 -0
  498. package/site/testimonials.ts +48 -48
  499. package/site/text.ts +43 -43
  500. package/site/theme.mjs +483 -472
  501. package/site/tracking.client.ts +225 -225
  502. package/site/tracking.ts +9 -9
  503. package/src/ActionParts.tsx +205 -205
  504. package/src/Advanced.tsx +152 -152
  505. package/src/App.tsx +901 -904
  506. package/src/AppList.tsx +1362 -1345
  507. package/src/BlockDialog.tsx +360 -360
  508. package/src/BlockParts.tsx +652 -652
  509. package/src/BlockSettings.tsx +533 -533
  510. package/src/BrandForm.tsx +164 -164
  511. package/src/Colors.tsx +476 -476
  512. package/src/CommunicationParts.tsx +199 -199
  513. package/src/CompanyForm.tsx +209 -209
  514. package/src/Consents.tsx +175 -175
  515. package/src/ContainmentParts.tsx +185 -185
  516. package/src/Crop.tsx +152 -152
  517. package/src/DataForm.tsx +434 -434
  518. package/src/Deleted.tsx +177 -177
  519. package/src/EntryForm.tsx +740 -740
  520. package/src/FileView.tsx +30 -30
  521. package/src/FormFrame.tsx +237 -237
  522. package/src/Keywords.tsx +225 -225
  523. package/src/Library.tsx +1563 -1563
  524. package/src/Licenses.tsx +336 -336
  525. package/src/LinkSheet.tsx +138 -138
  526. package/src/MarkdownEditor.tsx +1075 -1075
  527. package/src/Media.tsx +677 -677
  528. package/src/NavigationParts.tsx +350 -350
  529. package/src/NavigationRestParts.tsx +247 -247
  530. package/src/Notifications.tsx +59 -59
  531. package/src/PagePicker.tsx +136 -136
  532. package/src/Parts.tsx +991 -991
  533. package/src/PartsShown.tsx +168 -168
  534. package/src/PickerParts.tsx +183 -183
  535. package/src/Redirects.tsx +450 -450
  536. package/src/Screen.tsx +184 -184
  537. package/src/SectionsField.tsx +65 -65
  538. package/src/SelectionParts.tsx +134 -134
  539. package/src/SeoScores.tsx +184 -184
  540. package/src/Sheet.tsx +35 -35
  541. package/src/ThemeStore.tsx +376 -376
  542. package/src/Tokens.tsx +346 -346
  543. package/src/Versions.tsx +214 -214
  544. package/src/addresses.ts +75 -75
  545. package/src/allIcons.ts +7 -7
  546. package/src/appFiles.ts +29 -29
  547. package/src/apps.ts +281 -281
  548. package/src/ask.tsx +123 -123
  549. package/src/blocks.ts +251 -251
  550. package/src/brand.ts +153 -153
  551. package/src/cache.ts +42 -42
  552. package/src/check.ts +285 -285
  553. package/src/checkSite.ts +256 -256
  554. package/src/{consents.ts → consentData.ts} +26 -26
  555. package/src/cookieList.ts +70 -70
  556. package/src/countries.ts +59 -59
  557. package/src/deploy.ts +155 -155
  558. package/src/editor.css +602 -602
  559. package/src/examples.ts +85 -85
  560. package/src/fields.tsx +942 -942
  561. package/src/frontmatter.mjs +42 -42
  562. package/src/github.ts +376 -376
  563. package/src/i18n/da-DK/advanced.ts +28 -28
  564. package/src/i18n/da-DK/app.ts +71 -71
  565. package/src/i18n/da-DK/apps.ts +90 -90
  566. package/src/i18n/da-DK/blockSettings.ts +38 -38
  567. package/src/i18n/da-DK/blocks.ts +408 -408
  568. package/src/i18n/da-DK/check.ts +25 -25
  569. package/src/i18n/da-DK/colors.ts +64 -64
  570. package/src/i18n/da-DK/common.ts +118 -118
  571. package/src/i18n/da-DK/company.ts +24 -24
  572. package/src/i18n/da-DK/consents.ts +23 -23
  573. package/src/i18n/da-DK/forms.ts +116 -116
  574. package/src/i18n/da-DK/history.ts +35 -35
  575. package/src/i18n/da-DK/index.ts +49 -49
  576. package/src/i18n/da-DK/keywords.ts +19 -19
  577. package/src/i18n/da-DK/library.ts +135 -135
  578. package/src/i18n/da-DK/licenses.ts +25 -25
  579. package/src/i18n/da-DK/media.ts +79 -79
  580. package/src/i18n/da-DK/parts.ts +696 -696
  581. package/src/i18n/da-DK/preview.ts +13 -13
  582. package/src/i18n/da-DK/redirects.ts +51 -51
  583. package/src/i18n/da-DK/seo.ts +20 -20
  584. package/src/i18n/da-DK/text.ts +35 -35
  585. package/src/i18n/da-DK/theme.ts +41 -41
  586. package/src/i18n/en-US/advanced.ts +32 -32
  587. package/src/i18n/en-US/app.ts +84 -84
  588. package/src/i18n/en-US/apps.ts +134 -134
  589. package/src/i18n/en-US/blockSettings.ts +48 -48
  590. package/src/i18n/en-US/blocks.ts +441 -441
  591. package/src/i18n/en-US/check.ts +31 -31
  592. package/src/i18n/en-US/colors.ts +82 -82
  593. package/src/i18n/en-US/common.ts +144 -144
  594. package/src/i18n/en-US/company.ts +25 -25
  595. package/src/i18n/en-US/consents.ts +25 -25
  596. package/src/i18n/en-US/forms.ts +145 -145
  597. package/src/i18n/en-US/history.ts +43 -43
  598. package/src/i18n/en-US/index.ts +51 -51
  599. package/src/i18n/en-US/keywords.ts +24 -24
  600. package/src/i18n/en-US/library.ts +176 -176
  601. package/src/i18n/en-US/licenses.ts +36 -36
  602. package/src/i18n/en-US/media.ts +80 -80
  603. package/src/i18n/en-US/parts.ts +718 -718
  604. package/src/i18n/en-US/preview.ts +15 -15
  605. package/src/i18n/en-US/redirects.ts +66 -66
  606. package/src/i18n/en-US/seo.ts +26 -26
  607. package/src/i18n/en-US/text.ts +41 -41
  608. package/src/i18n/en-US/theme.ts +41 -41
  609. package/src/i18n/index.ts +124 -124
  610. package/src/icon.tsx +160 -160
  611. package/src/iconPacks.ts +89 -89
  612. package/src/images.ts +163 -163
  613. package/src/{licenses.ts → licenseData.ts} +79 -79
  614. package/src/markdown.mjs +204 -204
  615. package/src/nav.ts +68 -68
  616. package/src/notFound.ts +28 -28
  617. package/src/{notifications.ts → notificationData.ts} +223 -223
  618. package/src/pagePreview.tsx +204 -204
  619. package/src/r2Caching.ts +55 -55
  620. package/src/{redirects.ts → redirectData.ts} +149 -149
  621. package/src/registry.tsx +188 -188
  622. package/src/schema.ts +417 -417
  623. package/src/sections.mjs +303 -303
  624. package/src/seo.ts +333 -333
  625. package/src/shared.ts +44 -44
  626. package/src/sidebar.ts +31 -31
  627. package/src/site.ts +317 -317
  628. package/src/standard/Block.astro +19 -19
  629. package/src/standard/BlockSite.astro +18 -18
  630. package/src/standard/accordion/index.tsx +47 -47
  631. package/src/standard/accordion/load.ts +23 -23
  632. package/src/standard/accordion/shared.ts +15 -15
  633. package/src/standard/accordion/view.ts +32 -32
  634. package/src/standard/buttons/fields.ts +98 -98
  635. package/src/standard/buttons/index.tsx +23 -23
  636. package/src/standard/buttons/load.ts +34 -34
  637. package/src/standard/buttons/shared.ts +12 -12
  638. package/src/standard/buttons/view.ts +30 -30
  639. package/src/standard/cards/index.tsx +71 -71
  640. package/src/standard/cards/load.ts +17 -17
  641. package/src/standard/cards/shared.ts +27 -27
  642. package/src/standard/cards/view.ts +29 -29
  643. package/src/standard/checklist/index.tsx +27 -27
  644. package/src/standard/checklist/load.ts +5 -5
  645. package/src/standard/checklist/view.ts +13 -13
  646. package/src/standard/cookies/index.tsx +17 -17
  647. package/src/standard/cookies/list.ts +56 -56
  648. package/src/standard/cookies/load.ts +11 -11
  649. package/src/standard/cookies/shared.ts +20 -20
  650. package/src/standard/cookies/view.ts +28 -28
  651. package/src/standard/faq/index.tsx +29 -29
  652. package/src/standard/faq/load.ts +14 -14
  653. package/src/standard/faq/view.ts +21 -21
  654. package/src/standard/head.ts +23 -23
  655. package/src/standard/hero/fields.ts +48 -48
  656. package/src/standard/hero/index.tsx +57 -57
  657. package/src/standard/hero/load.ts +23 -23
  658. package/src/standard/hero/view.ts +38 -38
  659. package/src/standard/links/index.tsx +41 -41
  660. package/src/standard/links/load.ts +17 -17
  661. package/src/standard/links/view.ts +25 -25
  662. package/src/standard/list/index.tsx +50 -50
  663. package/src/standard/list/load.ts +5 -5
  664. package/src/standard/list/view.ts +18 -18
  665. package/src/standard/load.ts +7 -7
  666. package/src/standard/notice/index.tsx +30 -30
  667. package/src/standard/notice/load.ts +16 -16
  668. package/src/standard/notice/view.ts +10 -10
  669. package/src/standard/points/index.tsx +42 -42
  670. package/src/standard/points/load.ts +5 -5
  671. package/src/standard/points/view.ts +12 -12
  672. package/src/standard/posts/index.tsx +132 -132
  673. package/src/standard/posts/load.ts +36 -36
  674. package/src/standard/posts/shared.ts +21 -21
  675. package/src/standard/posts/view.ts +63 -63
  676. package/src/standard/pricecards/index.tsx +57 -57
  677. package/src/standard/pricecards/load.ts +11 -11
  678. package/src/standard/pricecards/view.ts +50 -50
  679. package/src/standard/sharedTexts.ts +6 -6
  680. package/src/standard/site.ts +124 -124
  681. package/src/standard/siteLooks.ts +19 -19
  682. package/src/standard/sites.ts +13 -13
  683. package/src/standard/steps/index.tsx +28 -28
  684. package/src/standard/steps/load.ts +5 -5
  685. package/src/standard/steps/view.ts +11 -11
  686. package/src/standard/testimonials/index.tsx +87 -87
  687. package/src/standard/testimonials/list.ts +43 -43
  688. package/src/standard/testimonials/load.ts +58 -58
  689. package/src/standard/testimonials/shared.ts +13 -13
  690. package/src/standard/testimonials/view.ts +76 -76
  691. package/src/standard/themeBlocks.ts +13 -13
  692. package/src/standard/video/index.tsx +23 -23
  693. package/src/standard/video/load.ts +10 -10
  694. package/src/standard/video/view.ts +42 -42
  695. package/src/standard/view.tsx +105 -105
  696. package/src/standard/views.ts +37 -37
  697. package/src/store.ts +479 -499
  698. package/src/theme.ts +90 -90
  699. package/src/themeUi.ts +97 -97
  700. package/src/themes.ts +91 -91
  701. package/src/ui.tsx +3402 -3402
  702. package/src/virtual.d.ts +5 -5
  703. package/src/when.ts +22 -22
  704. package/starter/.githooks/pre-push +4 -4
  705. package/starter/.nvmrc +1 -1
  706. package/starter/.prettierignore +11 -11
  707. package/starter/.prettierrc.json +7 -7
  708. package/starter/README.md +27 -26
  709. package/starter/astro.config.mjs +5 -5
  710. package/starter/package.json +67 -67
  711. package/starter/public/_redirects +1 -1
  712. package/starter/public/favicon.svg +1 -1
  713. package/starter/public/logo.svg +1 -1
  714. package/starter/src/content/pages/blog.md +8 -8
  715. package/starter/src/content/pages/forside.md +9 -9
  716. package/starter/src/content/pages/kontakt.md +7 -7
  717. package/starter/src/content/pages/privatlivspolitik.md +9 -9
  718. package/starter/src/content/pages/siden-findes-ikke.md +7 -7
  719. package/starter/src/content.config.ts +2 -2
  720. package/starter/src/data/apps.json +1 -1
  721. package/starter/src/data/block-settings.json +3 -3
  722. package/starter/src/data/blocks.json +1 -1
  723. package/starter/src/data/booking.json +6 -6
  724. package/starter/src/data/colors.json +70 -70
  725. package/starter/src/data/contact.json +8 -8
  726. package/starter/src/data/cookies.json +21 -21
  727. package/starter/src/data/csp.json +1 -1
  728. package/starter/src/data/footer.json +15 -15
  729. package/starter/src/data/internal-links.json +4 -4
  730. package/starter/src/data/menu.json +4 -4
  731. package/starter/src/data/mobile-menu.json +4 -4
  732. package/starter/src/data/old-addresses.json +1 -1
  733. package/starter/src/data/redirects.json +1 -1
  734. package/starter/src/data/standard-pages.json +8 -8
  735. package/starter/src/data/theme.json +1 -1
  736. package/starter/src/env.d.ts +2 -2
  737. package/starter/src/site/config.ts +13 -13
  738. package/starter/src/site/worker.js +14 -14
  739. package/starter/tsconfig.json +17 -17
  740. package/starter/worker/apps.js +6 -6
  741. package/starter/wrangler.jsonc +39 -39
  742. package/theme/LICENSE +21 -21
  743. package/theme/blocks/ArrowLink.tsx +14 -14
  744. package/theme/blocks/BlockHead.tsx +26 -26
  745. package/theme/blocks/Panel.tsx +32 -32
  746. package/theme/blocks/Person.tsx +26 -26
  747. package/theme/blocks/accordion/PageRow.tsx +25 -25
  748. package/theme/blocks/accordion/View.tsx +17 -17
  749. package/theme/blocks/buttons/Buttons.tsx +28 -28
  750. package/theme/blocks/buttons/View.tsx +12 -12
  751. package/theme/blocks/cards/LinkCards.tsx +72 -72
  752. package/theme/blocks/cards/View.tsx +20 -20
  753. package/theme/blocks/checklist/Checks.tsx +15 -15
  754. package/theme/blocks/checklist/View.tsx +14 -14
  755. package/theme/blocks/cookies/View.tsx +36 -36
  756. package/theme/blocks/faq/Accordion.tsx +34 -34
  757. package/theme/blocks/faq/View.tsx +16 -16
  758. package/theme/blocks/faq/script.ts +56 -56
  759. package/theme/blocks/hero/View.tsx +44 -44
  760. package/theme/blocks/links/LinkGroups.tsx +24 -24
  761. package/theme/blocks/links/View.tsx +17 -17
  762. package/theme/blocks/list/Rows.tsx +24 -24
  763. package/theme/blocks/list/View.tsx +14 -14
  764. package/theme/blocks/notice/View.tsx +13 -13
  765. package/theme/blocks/points/PointList.tsx +34 -34
  766. package/theme/blocks/points/View.tsx +14 -14
  767. package/theme/blocks/posts/View.tsx +26 -26
  768. package/theme/blocks/pricecards/View.tsx +40 -40
  769. package/theme/blocks/steps/StepList.tsx +23 -23
  770. package/theme/blocks/steps/View.tsx +14 -14
  771. package/theme/blocks/testimonials/List.tsx +46 -46
  772. package/theme/blocks/testimonials/Slider.tsx +44 -44
  773. package/theme/blocks/testimonials/Testimonial.tsx +124 -124
  774. package/theme/blocks/testimonials/View.tsx +21 -21
  775. package/theme/blocks/testimonials/script.ts +52 -52
  776. package/theme/blocks/video/View.tsx +41 -41
  777. package/theme/components/ActionBar.astro +63 -63
  778. package/theme/components/AppSlot.astro +21 -21
  779. package/theme/components/ArrowLink.tsx +21 -21
  780. package/theme/components/BlogIndex.astro +48 -48
  781. package/theme/components/BlogPosts.astro +18 -18
  782. package/theme/components/BlogPosts.tsx +45 -45
  783. package/theme/components/BookButton.tsx +22 -22
  784. package/theme/components/Container.astro +11 -11
  785. package/theme/components/CookieConsent.astro +121 -121
  786. package/theme/components/EndBlock.astro +21 -21
  787. package/theme/components/FontPreload.astro +6 -6
  788. package/theme/components/Footer.astro +85 -85
  789. package/theme/components/Header.astro +186 -186
  790. package/theme/components/Icon.astro +16 -16
  791. package/theme/components/Img.astro +29 -29
  792. package/theme/components/Img.tsx +33 -33
  793. package/theme/components/Inline.astro +11 -11
  794. package/theme/components/Logo.astro +23 -23
  795. package/theme/components/LogoMark.astro +10 -10
  796. package/theme/components/Markdown.astro +17 -17
  797. package/theme/components/MobileMenu.tsx +224 -224
  798. package/theme/components/MobileNav.astro +33 -33
  799. package/theme/components/PageHeader.astro +22 -22
  800. package/theme/components/PageSection.astro +24 -24
  801. package/theme/components/PhoneButton.tsx +11 -11
  802. package/theme/components/Popup.astro +145 -145
  803. package/theme/components/PopupButton.tsx +24 -24
  804. package/theme/components/PopupView.tsx +48 -48
  805. package/theme/components/PostList.tsx +58 -58
  806. package/theme/components/PostMeta.tsx +17 -17
  807. package/theme/components/RichText.astro +28 -28
  808. package/theme/components/Section.astro +29 -29
  809. package/theme/components/SectionHeading.tsx +8 -8
  810. package/theme/components/TextSection.astro +16 -16
  811. package/theme/components/home/PageBlock.astro +19 -19
  812. package/theme/components/home/Text.astro +13 -13
  813. package/theme/components/loadPopup.ts +22 -22
  814. package/theme/components/loadPosts.ts +16 -16
  815. package/theme/components/posts.ts +15 -15
  816. package/theme/editor/looks.mjs +7 -7
  817. package/theme/editor/previews.tsx +56 -56
  818. package/theme/layouts/Base.astro +273 -273
  819. package/theme/layouts/PageLayout.astro +126 -126
  820. package/theme/layouts/PostLayout.astro +137 -137
  821. package/theme/scripts/motion.ts +29 -29
  822. package/theme/styles/base.css +320 -320
  823. package/theme/styles/blocks.css +1808 -1808
  824. package/theme/styles/components.css +206 -206
  825. package/theme/styles/global.css +1302 -1302
  826. package/theme/styles/ui.css +6544 -6544
  827. package/theme/templates/Blog.astro +38 -38
  828. package/theme/templates/Category.astro +19 -19
  829. package/theme/templates/Home.astro +36 -36
  830. package/theme/templates/New.astro +68 -68
  831. package/theme/templates/NotFound.astro +117 -117
  832. package/theme/theme.json +28 -28
  833. package/theme/ui/Badge.tsx +45 -45
  834. package/theme/ui/BottomSheet.tsx +148 -148
  835. package/theme/ui/Button.tsx +79 -79
  836. package/theme/ui/ButtonGroup.tsx +31 -31
  837. package/theme/ui/Card.tsx +45 -45
  838. package/theme/ui/Carousel.tsx +124 -124
  839. package/theme/ui/Checkbox.tsx +59 -59
  840. package/theme/ui/Chip.tsx +101 -101
  841. package/theme/ui/ChipSet.tsx +27 -27
  842. package/theme/ui/DatePicker.tsx +149 -149
  843. package/theme/ui/DatePickerContainer.tsx +316 -316
  844. package/theme/ui/Dialog.tsx +100 -100
  845. package/theme/ui/Divider.tsx +27 -27
  846. package/theme/ui/ExposedDropdownMenu.tsx +77 -77
  847. package/theme/ui/Fab.tsx +88 -88
  848. package/theme/ui/FabMenu.tsx +67 -67
  849. package/theme/ui/IconButton.tsx +78 -78
  850. package/theme/ui/List.tsx +287 -287
  851. package/theme/ui/LoadingIndicator.tsx +29 -29
  852. package/theme/ui/Menu.tsx +278 -278
  853. package/theme/ui/NavigationBar.tsx +62 -62
  854. package/theme/ui/NavigationDrawer.tsx +80 -80
  855. package/theme/ui/NavigationRail.tsx +154 -154
  856. package/theme/ui/ProgressIndicator.tsx +162 -162
  857. package/theme/ui/RadioButton.tsx +50 -50
  858. package/theme/ui/Search.tsx +129 -129
  859. package/theme/ui/SegmentedButton.tsx +49 -49
  860. package/theme/ui/SideSheet.tsx +54 -54
  861. package/theme/ui/Slider.tsx +155 -155
  862. package/theme/ui/Snackbar.tsx +67 -67
  863. package/theme/ui/SplitButton.tsx +67 -67
  864. package/theme/ui/Switch.tsx +60 -60
  865. package/theme/ui/Tabs.tsx +114 -114
  866. package/theme/ui/TextField.tsx +278 -278
  867. package/theme/ui/TimePicker.tsx +128 -128
  868. package/theme/ui/TimePickerContainer.tsx +234 -234
  869. package/theme/ui/Toolbar.tsx +67 -67
  870. package/theme/ui/Tooltip.tsx +58 -58
  871. package/theme/ui/TopAppBar.tsx +77 -77
  872. package/theme/ui/bottomSheet.script.ts +8 -8
  873. package/theme/ui/{bottomSheet.ts → bottomSheetControl.ts} +211 -211
  874. package/theme/ui/carousel.script.ts +28 -28
  875. package/theme/ui/carouselLayout.ts +229 -229
  876. package/theme/ui/checkbox.script.ts +8 -8
  877. package/theme/ui/datePicker.script.ts +302 -302
  878. package/theme/ui/dates.ts +185 -185
  879. package/theme/ui/{dialog.ts → dialogControl.ts} +48 -48
  880. package/theme/ui/dropdownMenu.script.ts +166 -166
  881. package/theme/ui/fabMenu.script.ts +57 -57
  882. package/theme/ui/navigationRail.script.ts +47 -47
  883. package/theme/ui/ripple.script.ts +159 -159
  884. package/theme/ui/search.script.ts +92 -92
  885. package/theme/ui/{sideSheet.ts → sideSheetControl.ts} +48 -48
  886. package/theme/ui/slider.script.ts +12 -12
  887. package/theme/ui/sliderUpdate.ts +52 -52
  888. package/theme/ui/snackbar.script.ts +16 -16
  889. package/theme/ui/splitButton.script.ts +63 -63
  890. package/theme/ui/tabs.script.ts +48 -48
  891. package/theme/ui/textField.script.ts +17 -17
  892. package/theme/ui/textFieldUpdate.ts +44 -44
  893. package/theme/ui/timePicker.script.ts +248 -248
  894. package/theme/ui/toolbar.script.ts +43 -43
  895. package/theme/ui/tooltip.script.ts +68 -68
  896. package/worker/consent.js +141 -141
  897. package/worker/editor-github.js +167 -167
  898. package/worker/editor-host.js +74 -74
  899. package/worker/files.js +401 -401
  900. package/worker/github.js +36 -36
  901. package/worker/index.js +188 -184
  902. package/worker/not-found.js +97 -97
  903. package/worker/oauth.js +95 -95
  904. package/worker/publish.js +52 -52
  905. package/worker/push.js +270 -270
  906. package/worker/r2-status.js +50 -50
  907. package/worker/session.js +58 -58
  908. package/worker/store.js +46 -0
@@ -1,1808 +1,1808 @@
1
- /*
2
- The look of the standard blocks (their fields: packages/editor/src/standard/; their markup: blocks/ in this theme), on
3
- the site and in the editor, in the standard theme. Every colour, shape and motion comes from a CSS variable, which a
4
- theme sets to its own design in its own CSS:
5
-
6
- :root { --block-accent: var(--accent); --block-radius: 1.5rem; }
7
-
8
- Without them, the blocks have a plain look of their own (the values below). Sizes and spacing are
9
- the blocks' own, in rem; their text has the site's font. Every theme imports this file into its CSS
10
- (styles/global.css: the standard theme's, another theme's …), which the editor uses too.
11
-
12
- --block-text text
13
- --block-muted quieter text (an answer, a step's text)
14
- --block-accent the one colour: a notice's edge, the step numbers, an open row, the play button,
15
- a card's icon and link
16
- --block-accent-hover the accent of a filled button pointed at (ui.css)
17
- --block-on-accent text on the accent (the step numbers, a filled button)
18
- --block-surface a raised surface (the rows that fold out, the cards)
19
- --block-tint a light background (a notice, a video before it is played)
20
- --block-line lines between rows and along the steps, the edge of a card
21
- --block-radius the corners of a panel
22
- --block-radius-small the corners of something smaller in or beside a panel (a picture in a list, a row, a badge's
23
- square, a step on a time line)
24
- --block-control-radius the corners of a button and a tag (a pill when large)
25
- --block-shadow the shadow of a raised panel
26
- --block-ease the easing of motion (else the motion scheme's, --motion-ease)
27
- --block-ease-quick the easing of a quick change of state (a colour, an arrow that turns or moves; else the motion
28
- scheme's, --motion-ease-quick)
29
- --block-hero-shade, --block-hero-on-shade (optional) the colour a picture behind a hero's text is darkened with,
30
- and the text's on it; without them the text's colour and the surface's
31
- --block-page-width, --block-gutter the page's container (its width, gutters included, and its gutter at the
32
- side), whose left edge the text starts at: how far a banner across the whole width reaches out
33
- of the text to the window's edges, and where its content starts again (the standard theme's
34
- Container.astro: 72rem, 1.25rem and 2rem from 48rem)
35
-
36
- How things move is the site's motion scheme (Material 3's, chosen under "Udseende" › "Bevægelse"; lib/motion.ts), which
37
- Base.astro writes into the <head> as springs, each its duration and curve, for `transition` and `animation`:
38
- --motion-spatial-fast, --motion-spatial, --motion-spatial-slow something that moves, grows or changes shape
39
- --motion-effects-fast, --motion-effects, --motion-effects-slow a colour, a shadow, something that fades
40
- --motion-spatial-fast-duration … --motion-effects-slow-duration each one's duration alone, for what must last as
41
- long as it (a visibility that waits for it, a display … allow-discrete)
42
- --motion-ease, --motion-ease-quick the default spatial and effects curves alone, for a duration of one's own
43
- Without them (a page without Base.astro's <head>), the values below: the standard scheme's lengths with Material's
44
- standard curve.
45
-
46
- A site sets the class `js` on <html> as early as it can (this site: Base.astro): then a long
47
- testimonial is cut with "Læs mere" from the start; without it, the whole text is shown.
48
- The mark before the name on a testimonial (.block-testimonial-mark) is the site's own: it is not shown
49
- until the site gives it a look (the standard theme: an avatar with the name's first letter, its data-initial; another:
50
- its logo).
51
- */
52
- :where(:root) {
53
- --block-text: #1f2328;
54
- --block-muted: #59636e;
55
- --block-accent: #0969da;
56
- --block-accent-hover: #0550ae;
57
- --block-on-accent: #ffffff;
58
- --block-surface: #ffffff;
59
- --block-tint: #f2f4f7;
60
- --block-line: #d8dee4;
61
- --block-radius: 0.75rem;
62
- --block-radius-small: 1rem;
63
- --block-control-radius: 0.5rem;
64
- --block-shadow: 0 1px 3px rgb(0 0 0 / 0.12);
65
- --motion-spatial-fast: 230ms cubic-bezier(0.2, 0, 0, 1);
66
- --motion-spatial: 320ms cubic-bezier(0.2, 0, 0, 1);
67
- --motion-spatial-slow: 490ms cubic-bezier(0.2, 0, 0, 1);
68
- --motion-effects-fast: 150ms cubic-bezier(0.2, 0, 0, 1);
69
- --motion-effects: 240ms cubic-bezier(0.2, 0, 0, 1);
70
- --motion-effects-slow: 330ms cubic-bezier(0.2, 0, 0, 1);
71
- --motion-spatial-fast-duration: 230ms;
72
- --motion-spatial-duration: 320ms;
73
- --motion-spatial-slow-duration: 490ms;
74
- --motion-effects-fast-duration: 150ms;
75
- --motion-effects-duration: 240ms;
76
- --motion-effects-slow-duration: 330ms;
77
- /* Tailwind's transition-colors, transition-opacity … without a duration of their own: the default effects spring. */
78
- --default-transition-duration: var(--motion-effects-duration);
79
- --default-transition-timing-function: var(--motion-ease-quick, cubic-bezier(0.2, 0, 0, 1));
80
- --block-ease: var(--motion-ease, cubic-bezier(0.2, 0, 0, 1));
81
- --block-ease-quick: var(--motion-ease-quick, cubic-bezier(0.2, 0, 0, 1));
82
- --block-page-width: 72rem;
83
- --block-gutter: 1.25rem;
84
- }
85
- @media (min-width: 48rem) {
86
- :where(:root) {
87
- --block-gutter: 2rem;
88
- }
89
- }
90
-
91
- /* In a site's layer of components, so the site's utilities (a margin on the steps) win over them. */
92
- @layer components {
93
- /* A block in the text of a page: the space above and below it. */
94
- .block-in-text {
95
- margin-block: 2rem;
96
- }
97
-
98
- /* "Besked": a short notice in a box with the accent along its left edge (notice/). */
99
- .block-notice {
100
- border-left: 4px solid var(--block-accent);
101
- border-radius: var(--block-radius);
102
- background: var(--block-tint);
103
- padding: 1rem 1.25rem;
104
- font-size: var(--type-body-large-size);
105
- line-height: var(--type-body-large-line-height);
106
- font-weight: var(--type-body-large-weight);
107
- letter-spacing: var(--type-body-large-tracking);
108
- }
109
-
110
- /* "Trin": numbered steps along a line (steps/StepList.tsx). */
111
- .block-steps {
112
- position: relative;
113
- max-width: 48rem;
114
- }
115
- .block-steps.block-in-text {
116
- margin-block: 2.5rem;
117
- }
118
- .block-steps > :not(:last-child) {
119
- margin-bottom: 2.5rem;
120
- }
121
- .block-steps-line {
122
- position: absolute;
123
- top: 1.5rem;
124
- bottom: 1.5rem;
125
- left: 1.5rem;
126
- width: 1px;
127
- background: var(--block-line);
128
- }
129
- .block-step {
130
- position: relative;
131
- display: flex;
132
- gap: 1.25rem;
133
- }
134
- .block-step-number {
135
- position: relative;
136
- display: grid;
137
- width: 3rem;
138
- height: 3rem;
139
- flex-shrink: 0;
140
- place-items: center;
141
- border-radius: 9999px;
142
- background: var(--block-accent);
143
- color: var(--block-on-accent);
144
- font-size: var(--type-title-medium-size);
145
- line-height: var(--type-title-medium-line-height);
146
- font-weight: var(--type-title-medium-weight);
147
- letter-spacing: var(--type-title-medium-tracking);
148
- font-variant-numeric: tabular-nums;
149
- }
150
- .block-step-body {
151
- padding-top: 0.5rem;
152
- }
153
- .block-step-title {
154
- font-size: var(--type-title-large-size);
155
- line-height: var(--type-title-large-line-height);
156
- font-weight: var(--type-title-large-weight);
157
- letter-spacing: var(--type-title-large-tracking);
158
- }
159
- .block-step-text {
160
- margin-top: 0.375rem;
161
- max-width: 50ch;
162
- color: var(--block-muted);
163
- }
164
-
165
- /* "Spørgsmål og svar": rows that fold out, one open at a time (faq/Accordion.tsx). */
166
- .block-accordion {
167
- max-width: 48rem;
168
- border-radius: var(--block-radius);
169
- background: var(--block-surface);
170
- box-shadow: var(--block-shadow);
171
- }
172
- .block-accordion > :not(:last-child) {
173
- border-bottom: 1px solid var(--block-line);
174
- }
175
- .block-accordion-label {
176
- display: flex;
177
- min-height: 3.5rem;
178
- align-items: center;
179
- justify-content: space-between;
180
- gap: 1rem;
181
- padding: 0.875rem 1.25rem;
182
- font-size: var(--type-title-medium-size);
183
- line-height: var(--type-title-medium-line-height);
184
- font-weight: var(--type-title-medium-weight);
185
- letter-spacing: var(--type-title-medium-tracking);
186
- transition: color var(--motion-effects);
187
- }
188
- summary.block-accordion-label {
189
- cursor: pointer;
190
- list-style: none;
191
- /* The focus ring sits inside the row, so the panel's rounded edge never cuts it off. */
192
- outline-offset: -3px;
193
- }
194
- summary.block-accordion-label::-webkit-details-marker {
195
- display: none;
196
- }
197
- .block-accordion-icon {
198
- flex-shrink: 0;
199
- color: var(--block-muted);
200
- transition: rotate var(--motion-spatial);
201
- }
202
- @media (hover: hover) {
203
- summary.block-accordion-label:hover {
204
- color: var(--block-accent);
205
- }
206
- }
207
- .block-accordion-row[open] > .block-accordion-label {
208
- color: var(--block-accent);
209
- }
210
- .block-accordion-row[open] .block-accordion-icon {
211
- rotate: 180deg;
212
- color: var(--block-accent);
213
- }
214
- .block-accordion-body {
215
- padding: 0 1.25rem 1.5rem;
216
- }
217
- /* An answer as it was written: paragraphs and lists apart, links in the accent. */
218
- .block-accordion-answer {
219
- max-width: 60ch;
220
- font-size: var(--type-body-large-size);
221
- line-height: var(--type-body-large-line-height);
222
- font-weight: var(--type-body-large-weight);
223
- letter-spacing: var(--type-body-large-tracking);
224
- color: var(--block-muted);
225
- }
226
- .block-accordion-answer * + * {
227
- margin-top: 0.75em;
228
- }
229
- .block-accordion-answer ul {
230
- list-style: disc;
231
- padding-left: 1.25em;
232
- }
233
- .block-accordion-answer ol {
234
- list-style: decimal;
235
- padding-left: 1.25em;
236
- }
237
- .block-accordion-answer li + li {
238
- margin-top: 0.25em;
239
- }
240
- .block-accordion-answer strong {
241
- color: var(--block-text);
242
- font-weight: 600;
243
- }
244
- .block-accordion-answer a {
245
- color: var(--block-accent);
246
- font-weight: 500;
247
- text-decoration: underline;
248
- text-decoration-thickness: 1px;
249
- text-underline-offset: 0.25em;
250
- }
251
- /* "Hero" (hero/): its heading, the subtitle (the first paragraph, larger) and the introduction, the buttons, a text
252
- under them and a quote, beside the picture on a computer, under it on a phone. */
253
- .block-hero {
254
- display: grid;
255
- gap: 2rem;
256
- align-items: center;
257
- }
258
- .block-hero-title {
259
- margin: 0 0 1.25rem;
260
- font-size: var(--type-display-small-size);
261
- line-height: var(--type-display-small-line-height);
262
- font-weight: var(--type-display-small-weight);
263
- letter-spacing: var(--type-display-small-tracking);
264
- }
265
- .block-hero-text > :first-child {
266
- font-size: var(--type-title-large-size);
267
- line-height: var(--type-title-large-line-height);
268
- font-weight: var(--type-title-large-weight);
269
- letter-spacing: var(--type-title-large-tracking);
270
- }
271
- .block-hero-text > * + * {
272
- margin-top: 1rem;
273
- color: var(--block-muted);
274
- }
275
- .block-hero-body > .block-buttons {
276
- margin-top: 2rem;
277
- }
278
- .block-hero-note {
279
- margin-top: 1rem;
280
- max-width: 44ch;
281
- font-size: var(--type-body-medium-size);
282
- line-height: var(--type-body-medium-line-height);
283
- font-weight: var(--type-body-medium-weight);
284
- letter-spacing: var(--type-body-medium-tracking);
285
- color: var(--block-muted);
286
- }
287
- .block-hero-note > * + * {
288
- margin-top: 0.5rem;
289
- }
290
- /* A quote in the text under the buttons ("> …"): larger, in the text's colour, along a line in the accent; its last
291
- paragraph, when it has more than one, is who said it (with a link to the whole of it). */
292
- .block-hero-note > blockquote {
293
- margin: 2rem 0 0;
294
- border-left: 2px solid var(--block-accent);
295
- padding-left: 1rem;
296
- }
297
- .block-hero-note > blockquote > p {
298
- margin: 0;
299
- font-size: var(--type-body-large-size);
300
- line-height: var(--type-body-large-line-height);
301
- font-weight: var(--type-body-large-weight);
302
- letter-spacing: var(--type-body-large-tracking);
303
- color: var(--block-text);
304
- }
305
- .block-hero-note > blockquote > p:last-child:not(:first-child) {
306
- margin-top: 0.5rem;
307
- font-size: var(--type-body-medium-size);
308
- line-height: var(--type-body-medium-line-height);
309
- font-weight: var(--type-body-medium-weight);
310
- letter-spacing: var(--type-body-medium-tracking);
311
- color: var(--block-muted);
312
- }
313
- .block-hero-picture {
314
- display: block;
315
- width: 100%;
316
- height: auto;
317
- aspect-ratio: 4 / 5;
318
- object-fit: cover;
319
- object-position: 50% 22%;
320
- border-radius: var(--block-radius);
321
- }
322
- /* The picture behind the text ("Hero", `placement` 'behind'): it fills a panel, darkened from below (--block-hero-shade,
323
- the text's colour unless the theme sets it) so the text on it (--block-hero-on-shade, the surface's) can be read. */
324
- .block-hero-behind {
325
- position: relative;
326
- isolation: isolate;
327
- display: flex;
328
- min-height: 26rem;
329
- flex-direction: column;
330
- align-items: stretch;
331
- justify-content: flex-end;
332
- overflow: hidden;
333
- border-radius: var(--block-radius);
334
- padding: 2rem 1.5rem;
335
- color: var(--block-hero-on-shade, var(--block-surface));
336
- }
337
- .block-hero-behind::before {
338
- content: '';
339
- position: absolute;
340
- inset: 0;
341
- z-index: -1;
342
- background: linear-gradient(
343
- to top,
344
- color-mix(in srgb, var(--block-hero-shade, var(--block-text)) 85%, transparent),
345
- color-mix(in srgb, var(--block-hero-shade, var(--block-text)) 35%, transparent) 70%,
346
- color-mix(in srgb, var(--block-hero-shade, var(--block-text)) 20%, transparent)
347
- );
348
- }
349
- .block-hero-behind > .block-hero-picture {
350
- position: absolute;
351
- inset: 0;
352
- z-index: -2;
353
- height: 100%;
354
- aspect-ratio: auto;
355
- border-radius: 0;
356
- }
357
- .block-hero-behind .block-hero-text > * + *,
358
- .block-hero-behind .block-hero-note,
359
- .block-hero-behind .block-hero-note > blockquote > p:last-child:not(:first-child) {
360
- color: color-mix(in srgb, var(--block-hero-on-shade, var(--block-surface)) 85%, transparent);
361
- }
362
- .block-hero-behind .block-hero-note > blockquote {
363
- border-left-color: currentColor;
364
- }
365
- .block-hero-behind .block-hero-note > blockquote > p {
366
- color: var(--block-hero-on-shade, var(--block-surface));
367
- }
368
- .block-hero-behind :is(.block-link, .block-hero-note a) {
369
- color: inherit;
370
- }
371
- /* Across the whole width of the window ("Banner", `width` 'full'): without corners, and without a picture behind it on
372
- a band in the tint, its content in a readable width. On the site (in the text, .block-in-text) it reaches out of
373
- the text to the window's edges, from where the text starts at the left of the page's container (--block-page-width,
374
- --block-gutter), and its content starts there again and ends at the container's right edge; the page is clipped at
375
- the window's edges while it has one (100vw is a scrollbar wider). In the editor it is as wide as where it is drawn. */
376
- .block-hero.block-hero-full {
377
- border-radius: 0;
378
- }
379
- :where(.block-hero-full:not(.block-hero-behind)) {
380
- background: var(--block-tint);
381
- padding: 2.5rem 1.5rem;
382
- }
383
- :where(.block-hero-full) > .block-hero-body {
384
- max-width: 44rem;
385
- }
386
- .block-hero-full.block-in-text {
387
- --block-hero-inset: calc(max(0px, (100vw - var(--block-page-width)) / 2) + var(--block-gutter));
388
- width: 100vw;
389
- max-width: none;
390
- margin-left: calc(-1 * var(--block-hero-inset));
391
- padding-inline: var(--block-hero-inset);
392
- }
393
- body:has(.block-hero-full.block-in-text) {
394
- overflow-x: clip;
395
- }
396
- @media (min-width: 48rem) {
397
- .block-hero {
398
- grid-template-columns: 7fr 5fr;
399
- gap: 3rem;
400
- }
401
- .block-hero-behind {
402
- min-height: 32rem;
403
- padding: 3.5rem;
404
- }
405
- :where(.block-hero-full:not(.block-hero-behind)) {
406
- padding: 4rem 3.5rem;
407
- }
408
- .block-hero-title {
409
- font-size: var(--type-display-medium-size);
410
- line-height: var(--type-display-medium-line-height);
411
- font-weight: var(--type-display-medium-weight);
412
- letter-spacing: var(--type-display-medium-tracking);
413
- }
414
- .block-hero-body > .block-buttons {
415
- flex-direction: row;
416
- }
417
- }
418
-
419
- /* "Knapper": buttons in a row, on a phone under each other in the full width (buttons/). The buttons are the
420
- theme's (.button in ui.css), each of the kind it was given. */
421
- .block-buttons {
422
- display: flex;
423
- flex-direction: column;
424
- gap: 0.75rem;
425
- }
426
-
427
- /* A form in a block or a pop-up (an app's: Mailchimp's signup): its fields (the theme's text fields, .text-field in
428
- ui.css) and its button side by side, wrapping on a phone, and the answer under it. */
429
- .block-form {
430
- display: flex;
431
- flex-wrap: wrap;
432
- gap: 0.75rem;
433
- margin-top: 1.5rem;
434
- }
435
- .block-form > .button {
436
- flex: 1 0 auto;
437
- }
438
- .block-form > .text-field {
439
- flex: 1 1 12rem;
440
- }
441
- /* The answer to a form, in the accent when it went wrong (data-failed). */
442
- .block-message {
443
- margin-top: 1rem;
444
- }
445
- .block-message[data-failed] {
446
- color: var(--block-accent);
447
- }
448
-
449
- /* A link in a block's text (and in the text under a banner's buttons): in the accent, underlined, thicker when
450
- pointed at. */
451
- .block-link,
452
- .block-hero-note a {
453
- color: var(--block-accent);
454
- font-weight: 500;
455
- text-decoration: underline;
456
- text-decoration-thickness: 1px;
457
- text-underline-offset: 0.25em;
458
- }
459
- .block-link:hover,
460
- .block-hero-note a:hover {
461
- text-decoration-thickness: 2px;
462
- }
463
- /* A link on its own line with an arrow after it ("Alle indlæg →"). */
464
- .block-arrow-link {
465
- display: inline-flex;
466
- align-items: center;
467
- gap: 0.5rem;
468
- font-weight: 500;
469
- color: var(--block-accent);
470
- text-decoration: none;
471
- }
472
-
473
- /* "Blogindlæg": its posts as the blog shows them (the theme's PostList.tsx and BlogPosts.tsx), "Alle indlæg" under
474
- them. */
475
- .block-posts-in-text.block-in-text {
476
- margin-block: 2.5rem;
477
- }
478
- .block-posts-all {
479
- margin-top: 1.5rem;
480
- }
481
- /* In the editor's drawing: random posts, of how many; under all of them, how many more there are. */
482
- .block-posts-note {
483
- margin: 0 0 1rem;
484
- font-size: var(--type-body-medium-size);
485
- line-height: var(--type-body-medium-line-height);
486
- font-weight: var(--type-body-medium-weight);
487
- letter-spacing: var(--type-body-medium-tracking);
488
- color: var(--block-muted);
489
- }
490
- .block-posts-more {
491
- margin: 1rem 0 0;
492
- }
493
-
494
- /* Only for screen readers. */
495
- .block-sr-only {
496
- position: absolute;
497
- width: 1px;
498
- height: 1px;
499
- padding: 0;
500
- margin: -1px;
501
- overflow: hidden;
502
- clip-path: inset(50%);
503
- white-space: nowrap;
504
- border-width: 0;
505
- }
506
- /* In a drawing in the editor, when there is nothing to show. */
507
- .block-empty {
508
- border-radius: var(--block-radius);
509
- background: var(--block-tint);
510
- padding: 1.5rem;
511
- color: var(--block-muted);
512
- }
513
-
514
- /* "Udtalelser": testimonials to leaf through (testimonials/Slider.tsx, a carousel: ui.css). */
515
- .carousel.block-in-text,
516
- .block-testimonials.block-in-text,
517
- .block-testimonial.block-in-text {
518
- margin-block: 2.5rem;
519
- }
520
- /* "Udtalelser" one after another (testimonials/List.tsx): two columns where there is room. */
521
- .block-testimonial-list {
522
- columns: 2 18rem;
523
- column-gap: 1rem;
524
- }
525
- .block-testimonial-list > * {
526
- break-inside: avoid;
527
- margin-bottom: 1rem;
528
- }
529
- /* Filter chips (the theme's Chip, ui.css) that filter what is under them ("Udtalelser" under hinanden). */
530
- .block-filters {
531
- display: flex;
532
- flex-wrap: wrap;
533
- gap: 0.5rem;
534
- margin-bottom: 1.5rem;
535
- }
536
- .block-filters[hidden] {
537
- display: none;
538
- }
539
- /* One testimonial (testimonials/Testimonial.tsx), an outlined card (.card in ui.css): a big quotation mark, its tags,
540
- the text (cut after seven lines with "Læs mere", or two with a link to the whole text) and the name. */
541
- .block-testimonial {
542
- display: flex;
543
- width: 100%;
544
- flex-direction: column;
545
- margin: 0;
546
- }
547
- .block-testimonial-head {
548
- display: flex;
549
- align-items: flex-start;
550
- justify-content: space-between;
551
- gap: 1rem;
552
- }
553
- .block-testimonial-quote-mark {
554
- display: block;
555
- height: 2.5rem;
556
- margin-bottom: -1rem;
557
- font-size: var(--type-display-large-size);
558
- line-height: var(--type-display-large-line-height);
559
- font-weight: var(--type-display-large-weight);
560
- letter-spacing: var(--type-display-large-tracking);
561
- color: var(--block-accent);
562
- }
563
- .block-testimonial-tags {
564
- display: flex;
565
- flex-wrap: wrap;
566
- justify-content: flex-end;
567
- gap: 0.5rem;
568
- }
569
- .block-testimonial-tags .chip {
570
- font-size: var(--type-label-large-size);
571
- line-height: var(--type-label-large-line-height);
572
- font-weight: var(--type-label-large-weight);
573
- letter-spacing: var(--type-label-large-tracking);
574
- }
575
- .block-testimonial-text {
576
- margin: 0.75rem 0 0;
577
- font-size: var(--type-body-large-size);
578
- line-height: var(--type-body-large-line-height);
579
- font-weight: var(--type-body-large-weight);
580
- letter-spacing: var(--type-body-large-tracking);
581
- }
582
- .block-testimonial-text > * {
583
- margin: 0;
584
- }
585
- .block-testimonial-text > :not(:last-child) {
586
- margin-bottom: 0.75rem;
587
- }
588
- .block-testimonial-context {
589
- color: var(--block-muted);
590
- }
591
- .block-testimonial-short {
592
- display: -webkit-box;
593
- overflow: hidden;
594
- -webkit-box-orient: vertical;
595
- -webkit-line-clamp: 2;
596
- }
597
- .block-testimonial-more {
598
- position: relative;
599
- display: inline-flex;
600
- align-self: flex-start;
601
- align-items: center;
602
- gap: 0.375rem;
603
- margin-top: 0.75rem;
604
- border: 0;
605
- padding: 0;
606
- background: none;
607
- font: inherit;
608
- font-size: var(--type-label-large-size);
609
- line-height: var(--type-label-large-line-height);
610
- font-weight: var(--type-label-large-weight);
611
- letter-spacing: var(--type-label-large-tracking);
612
- color: var(--block-accent);
613
- text-decoration: none;
614
- }
615
- .block-testimonial-more[hidden] {
616
- display: none;
617
- }
618
- .block-testimonial-more svg {
619
- transition: transform var(--motion-spatial);
620
- }
621
- .block-testimonial-more[aria-expanded='true'] svg {
622
- transform: rotate(180deg);
623
- }
624
- .block-testimonial-name {
625
- display: flex;
626
- align-items: center;
627
- gap: 0.75rem;
628
- margin-top: auto;
629
- padding-top: 1.5rem;
630
- font-weight: 500;
631
- }
632
- .block-testimonial-mark {
633
- display: none;
634
- }
635
- /* A testimonial's picture before the name: small and round. */
636
- .block-testimonial-picture {
637
- width: 2.5rem;
638
- height: 2.5rem;
639
- flex-shrink: 0;
640
- border-radius: 9999px;
641
- object-fit: cover;
642
- }
643
- .js [data-clamp] {
644
- max-height: calc(1.625em * 7);
645
- overflow: hidden;
646
- }
647
- .js [data-clamp][data-overflow] {
648
- mask-image: linear-gradient(to bottom, #000 55%, transparent);
649
- }
650
- .js [data-clamp][data-open] {
651
- max-height: none;
652
- mask-image: none;
653
- }
654
-
655
- /* "Accordion": a row's text, the link to its page and links to more specific pages under it
656
- (accordion/PageRow.tsx). */
657
- .block-row-text {
658
- max-width: 60ch;
659
- font-size: var(--type-body-large-size);
660
- line-height: var(--type-body-large-line-height);
661
- font-weight: var(--type-body-large-weight);
662
- letter-spacing: var(--type-body-large-tracking);
663
- color: var(--block-muted);
664
- }
665
- .block-row-links {
666
- display: flex;
667
- flex-wrap: wrap;
668
- align-items: center;
669
- gap: 0.75rem 1.5rem;
670
- margin-top: 1rem;
671
- }
672
- .block-row-link {
673
- display: inline-flex;
674
- min-height: 2.75rem;
675
- align-items: center;
676
- gap: 0.5rem;
677
- }
678
-
679
- /* "Kort": outlined cards (.card in ui.css) that link to other pages, with an icon, a picture or nothing at the top,
680
- two side by side from small screens (cards/LinkCards.tsx). */
681
- .block-cards {
682
- display: grid;
683
- gap: 1rem;
684
- padding: 0;
685
- list-style: none;
686
- }
687
- .block-card {
688
- display: flex;
689
- height: 100%;
690
- flex-direction: column;
691
- /* Its edge a border in the outlined card's line, so a picture at the top stays inside it. */
692
- border: 1px solid var(--card-outlined-line, var(--block-line));
693
- /* The card's shadow as it is now (ui.css: at rest, pointed at, dragged), without its line. */
694
- box-shadow: var(--card-shadow, 0 0 #0000);
695
- color: inherit;
696
- /* The same with a page (a link, as the site has links) and without one (not a link). */
697
- font-weight: 500;
698
- text-decoration: none;
699
- transition:
700
- border-color var(--motion-effects),
701
- box-shadow var(--motion-effects);
702
- }
703
- .block-card-icon {
704
- color: var(--block-accent);
705
- }
706
- /* The picture fills the top of the card, out to its edges. */
707
- .block-card-picture {
708
- display: block;
709
- margin: -1.5rem -1.5rem 0.25rem;
710
- overflow: hidden;
711
- border-radius: calc(var(--card-radius, var(--block-radius)) - 1px) calc(var(--card-radius, var(--block-radius)) - 1px) 0 0;
712
- background: var(--block-tint);
713
- aspect-ratio: 3 / 2;
714
- }
715
- .block-card-picture img {
716
- display: block;
717
- width: 100%;
718
- height: 100%;
719
- object-fit: cover;
720
- transition: scale var(--motion-spatial-slow);
721
- }
722
- .block-card-title {
723
- margin-top: 1rem;
724
- font-size: var(--type-title-large-size);
725
- line-height: var(--type-title-large-line-height);
726
- font-weight: var(--type-title-large-weight);
727
- letter-spacing: var(--type-title-large-tracking);
728
- }
729
- /* Only text: the heading at the top. */
730
- .block-card-title:first-child {
731
- margin-top: 0;
732
- }
733
- .block-card-text {
734
- margin-top: 0.375rem;
735
- color: var(--block-muted);
736
- }
737
- .block-card-more {
738
- display: inline-flex;
739
- margin-top: auto;
740
- align-items: center;
741
- gap: 0.5rem;
742
- padding-top: 1.25rem;
743
- font-weight: 500;
744
- color: var(--block-accent);
745
- }
746
- .block-card-arrow {
747
- transition: translate var(--motion-spatial);
748
- }
749
- /* The cards on the accent ("Kort", `background`): the whole card in it, its text and icon in the colour that is read
750
- on it. */
751
- .block-cards-accent .block-card {
752
- --card-outlined-surface: var(--block-accent);
753
- --card-outlined-line: transparent;
754
- color: var(--block-on-accent);
755
- }
756
- .block-cards-accent :is(.block-card-icon, .block-card-text, .block-card-more) {
757
- color: var(--block-on-accent);
758
- }
759
- /* A panel (Panel.tsx): an outlined card (.card in ui.css) for a block that is one box (e.g. an app's about
760
- or price block), with an icon, a heading and a text at the top, and parts under a line. */
761
- .block-panel {
762
- color: var(--block-text);
763
- }
764
- .block-panel.block-in-text + .block-panel.block-in-text {
765
- margin-top: 1rem;
766
- }
767
- .block-panel-icon {
768
- display: block;
769
- margin-bottom: 1rem;
770
- color: var(--block-accent);
771
- }
772
- .block-panel-title {
773
- margin: 0;
774
- font-size: var(--type-title-large-size);
775
- line-height: var(--type-title-large-line-height);
776
- font-weight: var(--type-title-large-weight);
777
- letter-spacing: var(--type-title-large-tracking);
778
- }
779
- .block-panel-text {
780
- margin-top: 0.4rem;
781
- color: var(--block-muted);
782
- }
783
- .block-panel > .block-arrow-link {
784
- margin-top: 1rem;
785
- }
786
- /* Buttons in a panel, and a link after them (an app's: Calendly's, when the calendar does not show). */
787
- .block-panel > .block-buttons {
788
- margin-top: 1.25rem;
789
- }
790
- .block-panel > .block-link {
791
- display: inline-flex;
792
- align-items: center;
793
- gap: 0.375rem;
794
- margin-top: 1.25rem;
795
- }
796
- /* Boxes side by side where there is room ("Links", links/LinkGroups.tsx; an app's payment block). */
797
- .block-panels {
798
- display: grid;
799
- /* Two side by side where there is room for 17rem each, never more. */
800
- grid-template-columns: repeat(auto-fit, minmax(min(100%, max(17rem, calc(50% - 0.5rem))), 1fr));
801
- gap: 1rem;
802
- }
803
- .block-panels.block-in-text {
804
- margin-block: 2.5rem;
805
- }
806
- /* Boxes with values to copy: side by side only where each has room for its values with their buttons. */
807
- .block-panels:has(.block-copy-rows) {
808
- grid-template-columns: repeat(auto-fit, minmax(min(100%, max(23rem, calc(50% - 0.5rem))), 1fr));
809
- }
810
- /* "Links": a box's heading linking to its page, and its pages under it in a list (.list in ui.css). */
811
- .block-panel-title a {
812
- color: inherit;
813
- text-decoration: none;
814
- }
815
- .block-panel-title a:hover {
816
- color: var(--block-accent);
817
- }
818
- .block-panel > .list {
819
- margin-top: 1rem;
820
- }
821
- /* "Punkter med ikon": a list without dividers (.list in ui.css, points/PointList.tsx), its items side by side where
822
- there is room for 16rem each. Nothing in it is tapped, so its icons start where the text around it does. */
823
- .block-points {
824
- --list-item-padding-inline: 0;
825
- display: grid;
826
- grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
827
- column-gap: 1.5rem;
828
- }
829
- .block-points.block-in-text {
830
- margin-block: 1.5rem;
831
- }
832
- /* A check's text is its headline alone and can run over more lines, so it starts at the top and the check stands
833
- by its first line. */
834
- .block-checklist .list-item-container {
835
- align-items: flex-start;
836
- }
837
- .block-checklist .list-item-leading {
838
- max-height: var(--list-item-headline-line-height, 1lh);
839
- }
840
- /* A picture with a heading, a text and buttons, beside it where there is room for 22rem each, else under it
841
- (e.g. an app's address block). */
842
- .block-media {
843
- display: grid;
844
- grid-template-columns: repeat(auto-fit, minmax(min(100%, 22rem), 1fr));
845
- align-items: center;
846
- gap: 1.5rem 3rem;
847
- }
848
- .block-media-picture {
849
- display: block;
850
- width: 100%;
851
- aspect-ratio: 4 / 3;
852
- border-radius: var(--block-radius);
853
- object-fit: cover;
854
- }
855
- .block-media-title {
856
- margin: 0;
857
- font-size: var(--type-headline-small-size);
858
- line-height: var(--type-headline-small-line-height);
859
- font-weight: var(--type-headline-small-weight);
860
- letter-spacing: var(--type-headline-small-tracking);
861
- }
862
- .block-media-text {
863
- margin: 1rem 0 0;
864
- font-style: normal;
865
- font-size: var(--type-body-large-size);
866
- line-height: var(--type-body-large-line-height);
867
- font-weight: var(--type-body-large-weight);
868
- letter-spacing: var(--type-body-large-tracking);
869
- }
870
- .block-media-body > .block-buttons {
871
- margin-top: 1.5rem;
872
- }
873
- /* Values that can be copied, each with its name before it and a button after it (e.g. an app's payment block). */
874
- .block-copy-rows {
875
- display: grid;
876
- grid-template-columns: auto 1fr auto;
877
- align-items: center;
878
- gap: 0.75rem 1rem;
879
- margin: 0;
880
- }
881
- .block-copy-rows dt {
882
- color: var(--block-muted);
883
- }
884
- .block-copy-rows dd {
885
- margin: 0;
886
- }
887
- /* In a narrow box the button goes under its value. */
888
- .block-panel:has(> .block-copy-rows) {
889
- container-type: inline-size;
890
- }
891
- @container (width < 18.5rem) {
892
- .block-copy-rows {
893
- grid-template-columns: auto 1fr;
894
- }
895
- .block-copy-rows dt {
896
- grid-column: 1;
897
- }
898
- .block-copy-rows dd {
899
- grid-column: 2;
900
- }
901
- }
902
- .block-copy-value {
903
- white-space: nowrap;
904
- font-size: var(--type-headline-small-size);
905
- line-height: var(--type-headline-small-line-height);
906
- font-weight: var(--type-headline-small-weight);
907
- letter-spacing: var(--type-headline-small-tracking);
908
- font-variant-numeric: tabular-nums;
909
- }
910
- .block-panel > .block-buttons-row {
911
- margin-top: 1.25rem;
912
- }
913
- .block-buttons-row {
914
- display: flex;
915
- flex-wrap: wrap;
916
- gap: 0.5rem;
917
- }
918
- .block-panel-title > svg {
919
- display: inline-block;
920
- margin-right: 0.5rem;
921
- vertical-align: -0.2em;
922
- color: var(--block-accent);
923
- }
924
-
925
- /* Steps that go from free to the full price, each more coloured than the one before (`--step`, a share of the
926
- accent over the tint), the last in the accent; across on a wider screen (e.g. an app's cancellation block). */
927
- .block-timeline {
928
- display: grid;
929
- gap: 0.75rem;
930
- margin: 0;
931
- padding: 0;
932
- list-style: none;
933
- }
934
- .block-timeline.block-in-text {
935
- margin-block: 2rem;
936
- }
937
- .block-timeline > li {
938
- display: flex;
939
- align-items: center;
940
- justify-content: space-between;
941
- gap: 1rem;
942
- border-radius: var(--block-radius-small);
943
- background: color-mix(in srgb, var(--block-accent) var(--step, 0%), var(--block-tint));
944
- padding: 1.25rem;
945
- }
946
- .block-timeline > li:last-child {
947
- background: var(--block-accent);
948
- color: var(--block-on-accent);
949
- }
950
- .block-timeline-when {
951
- font-size: var(--type-body-medium-size);
952
- line-height: var(--type-body-medium-line-height);
953
- font-weight: var(--type-body-medium-weight);
954
- letter-spacing: var(--type-body-medium-tracking);
955
- color: var(--block-muted);
956
- }
957
- .block-timeline > li:last-child .block-timeline-when {
958
- color: inherit;
959
- opacity: 0.9;
960
- }
961
- .block-timeline-value {
962
- font-size: var(--type-title-large-size);
963
- line-height: var(--type-title-large-line-height);
964
- font-weight: var(--type-title-large-weight);
965
- letter-spacing: var(--type-title-large-tracking);
966
- }
967
- @media (width >= 40rem) {
968
- .block-timeline {
969
- grid-auto-columns: 1fr;
970
- grid-auto-flow: column;
971
- gap: 0;
972
- }
973
- .block-timeline > li {
974
- flex-direction: column;
975
- align-items: flex-start;
976
- border-radius: 0;
977
- padding: 1.5rem;
978
- }
979
- .block-timeline > li:first-child {
980
- border-start-start-radius: var(--block-radius);
981
- border-end-start-radius: var(--block-radius);
982
- }
983
- .block-timeline > li:last-child {
984
- border-start-end-radius: var(--block-radius);
985
- border-end-end-radius: var(--block-radius);
986
- }
987
- .block-timeline-value {
988
- margin-top: 1.5rem;
989
- font-size: var(--type-headline-small-size);
990
- line-height: var(--type-headline-small-line-height);
991
- font-weight: var(--type-headline-small-weight);
992
- letter-spacing: var(--type-headline-small-tracking);
993
- }
994
- }
995
-
996
- /* A part of a panel under a line (over the part's own margin and padding: a list, the facts). */
997
- .block-panel > .block-panel-part {
998
- margin-top: 1.25rem;
999
- border-top: 1px solid var(--block-line);
1000
- padding-top: 1.25rem;
1001
- }
1002
- /* Only on phones and tablets (a block a site shows beside the text on a computer). */
1003
- @media (width >= 64rem) {
1004
- .block-small-screens {
1005
- display: none;
1006
- }
1007
- }
1008
-
1009
- /* A person: a small picture beside the name and a title under it. */
1010
- .block-person {
1011
- display: flex;
1012
- align-items: center;
1013
- gap: 1rem;
1014
- }
1015
- .block-person-picture {
1016
- width: 3.5rem;
1017
- height: 3.5rem;
1018
- flex-shrink: 0;
1019
- border-radius: var(--block-radius-small);
1020
- object-fit: cover;
1021
- object-position: 50% 20%;
1022
- }
1023
- .block-person-name {
1024
- display: block;
1025
- font-size: var(--type-title-medium-size);
1026
- line-height: var(--type-title-medium-line-height);
1027
- font-weight: var(--type-title-medium-weight);
1028
- letter-spacing: var(--type-title-medium-tracking);
1029
- }
1030
- .block-person-role {
1031
- display: block;
1032
- font-size: var(--type-body-medium-size);
1033
- line-height: var(--type-body-medium-line-height);
1034
- font-weight: var(--type-body-medium-weight);
1035
- letter-spacing: var(--type-body-medium-tracking);
1036
- color: var(--block-muted);
1037
- }
1038
-
1039
- /* A list with an icon in the accent before each line. */
1040
- .block-icon-list {
1041
- display: grid;
1042
- gap: 0.6rem;
1043
- margin: 0;
1044
- padding: 0;
1045
- list-style: none;
1046
- font-size: var(--type-body-medium-size);
1047
- line-height: var(--type-body-medium-line-height);
1048
- font-weight: var(--type-body-medium-weight);
1049
- letter-spacing: var(--type-body-medium-tracking);
1050
- }
1051
- .block-icon-list > li {
1052
- display: flex;
1053
- align-items: flex-start;
1054
- gap: 0.75rem;
1055
- }
1056
- .block-icon-list svg {
1057
- flex-shrink: 0;
1058
- margin-top: 0.05rem;
1059
- color: var(--block-accent);
1060
- }
1061
-
1062
- /* Facts side by side, each a quiet name over its value, the last one to the right (a duration and a
1063
- price). */
1064
- .block-facts {
1065
- display: grid;
1066
- grid-template-columns: 1fr auto;
1067
- gap: 1rem;
1068
- margin: 0;
1069
- }
1070
- .block-facts dt {
1071
- font-size: var(--type-body-medium-size);
1072
- line-height: var(--type-body-medium-line-height);
1073
- font-weight: var(--type-body-medium-weight);
1074
- letter-spacing: var(--type-body-medium-tracking);
1075
- color: var(--block-muted);
1076
- }
1077
- .block-facts dd {
1078
- margin: 0.15rem 0 0;
1079
- font-weight: 500;
1080
- }
1081
- .block-facts > :last-child {
1082
- text-align: right;
1083
- }
1084
- .block-facts-amount {
1085
- font-size: var(--type-title-large-size);
1086
- line-height: var(--type-title-large-line-height);
1087
- font-weight: var(--type-title-large-weight);
1088
- letter-spacing: var(--type-title-large-tracking);
1089
- font-variant-numeric: tabular-nums;
1090
- }
1091
-
1092
- /* A table: quiet headings over rows with a thin line between them, the first column (each row's name) a little
1093
- heavier; wider than the screen, it scrolls sideways ("Cookieliste"). */
1094
- .block-table {
1095
- overflow-x: auto;
1096
- }
1097
- .block-table table {
1098
- width: 100%;
1099
- min-width: 40rem;
1100
- border-collapse: collapse;
1101
- font-size: var(--type-body-medium-size);
1102
- line-height: var(--type-body-medium-line-height);
1103
- font-weight: var(--type-body-medium-weight);
1104
- letter-spacing: var(--type-body-medium-tracking);
1105
- }
1106
- .block-table :is(th, td) {
1107
- padding: 0.625rem 1rem 0.625rem 0;
1108
- border-bottom: 1px solid var(--block-line);
1109
- text-align: left;
1110
- vertical-align: top;
1111
- }
1112
- .block-table thead th {
1113
- font-size: var(--type-label-large-size);
1114
- line-height: var(--type-label-large-line-height);
1115
- font-weight: var(--type-label-large-weight);
1116
- letter-spacing: var(--type-label-large-tracking);
1117
- color: var(--block-muted);
1118
- }
1119
- .block-table tbody th {
1120
- font-weight: 500;
1121
- white-space: nowrap;
1122
- }
1123
- .block-table td:not(:nth-child(3)) {
1124
- white-space: nowrap;
1125
- }
1126
- .block-table td:nth-child(3) {
1127
- min-width: 14rem;
1128
- }
1129
-
1130
- /* A badge: a small word over a number in a light square ("Spar / 10%"), and a text beside one. */
1131
- .block-badge {
1132
- display: grid;
1133
- width: 3.5rem;
1134
- height: 3.5rem;
1135
- flex-shrink: 0;
1136
- place-content: center;
1137
- border-radius: calc(var(--block-radius-small) - 0.25rem);
1138
- background: var(--block-tint);
1139
- color: var(--block-accent);
1140
- text-align: center;
1141
- line-height: 1.1;
1142
- }
1143
- .block-badge > span {
1144
- font-size: var(--type-label-small-size);
1145
- line-height: var(--type-label-small-line-height);
1146
- font-weight: var(--type-label-small-weight);
1147
- letter-spacing: var(--type-label-small-tracking);
1148
- }
1149
- .block-badge > strong {
1150
- font-size: var(--type-title-medium-size);
1151
- line-height: var(--type-title-medium-line-height);
1152
- font-weight: var(--type-title-medium-weight);
1153
- letter-spacing: var(--type-title-medium-tracking);
1154
- font-variant-numeric: tabular-nums;
1155
- }
1156
- .block-with-badge {
1157
- display: flex;
1158
- align-items: flex-start;
1159
- gap: 1rem;
1160
- font-size: var(--type-body-medium-size);
1161
- line-height: var(--type-body-medium-line-height);
1162
- font-weight: var(--type-body-medium-weight);
1163
- letter-spacing: var(--type-body-medium-tracking);
1164
- }
1165
- .block-with-badge > p {
1166
- margin: 0;
1167
- }
1168
-
1169
- /* A quiet link that is one row, an outlined card (.card in ui.css) with smaller corners: a badge or an icon, a text
1170
- and an arrow, its edge in the accent when pointed at. */
1171
- .block-link-row {
1172
- display: flex;
1173
- align-items: center;
1174
- gap: 1rem;
1175
- --card-radius: var(--block-radius-small);
1176
- --card-padding: 0.85rem 1.1rem 0.85rem 0.85rem;
1177
- font-size: var(--type-body-large-size);
1178
- line-height: var(--type-body-large-line-height);
1179
- font-weight: var(--type-body-large-weight);
1180
- letter-spacing: var(--type-body-large-tracking);
1181
- transition: box-shadow var(--motion-effects);
1182
- }
1183
- .block-link-row.block-in-text {
1184
- margin-block: 1.75rem;
1185
- }
1186
- .block-link-row-text {
1187
- flex: 1;
1188
- }
1189
- .block-link-row-arrow {
1190
- flex-shrink: 0;
1191
- color: var(--block-accent);
1192
- transition: transform var(--motion-spatial);
1193
- }
1194
- a.block-link-row:hover {
1195
- --card-outlined-line: var(--block-accent);
1196
- }
1197
- a.block-link-row:hover .block-link-row-arrow {
1198
- transform: translateX(3px);
1199
- }
1200
-
1201
- /* An invitation, a filled card (.card in ui.css): a picture, a heading and a text, and buttons under each other
1202
- (e.g. an app's booking block); on a computer the three side by side. */
1203
- .block-cta {
1204
- display: grid;
1205
- gap: 1.5rem;
1206
- }
1207
- .block-cta.block-in-text {
1208
- margin-block: 2.5rem;
1209
- }
1210
- .block-cta-picture {
1211
- width: 5rem;
1212
- height: 5rem;
1213
- border-radius: var(--block-radius-small);
1214
- object-fit: cover;
1215
- object-position: 50% 20%;
1216
- }
1217
- .block-cta-title {
1218
- margin: 0;
1219
- font-size: var(--type-headline-small-size);
1220
- line-height: var(--type-headline-small-line-height);
1221
- font-weight: var(--type-headline-small-weight);
1222
- letter-spacing: var(--type-headline-small-tracking);
1223
- }
1224
- .block-cta-text {
1225
- margin-top: 0.5rem;
1226
- max-width: 48ch;
1227
- color: var(--block-muted);
1228
- }
1229
- .block-cta-buttons {
1230
- display: grid;
1231
- gap: 0.625rem;
1232
- }
1233
-
1234
- /* Prices: the big ones as cards side by side, and the others as a list, a row each with the name and
1235
- its details to the left and the price to the right, with a text under it. */
1236
- .block-prices {
1237
- display: grid;
1238
- gap: 1rem;
1239
- }
1240
- .block-prices.block-in-text {
1241
- margin-block: 2.5rem;
1242
- }
1243
- .block-price-cards {
1244
- display: grid;
1245
- gap: 1rem;
1246
- }
1247
- /* A big price, an elevated card (.card in ui.css). */
1248
- .block-price-card {
1249
- display: flex;
1250
- flex-direction: column;
1251
- }
1252
- .block-price-card-head {
1253
- display: flex;
1254
- align-items: flex-start;
1255
- justify-content: space-between;
1256
- gap: 1rem;
1257
- }
1258
- .block-price-card-title {
1259
- margin: 0;
1260
- font-size: var(--type-headline-small-size);
1261
- line-height: var(--type-headline-small-line-height);
1262
- font-weight: var(--type-headline-small-weight);
1263
- letter-spacing: var(--type-headline-small-tracking);
1264
- }
1265
- /* A small fact in a light pill (the duration), its icon in the accent. */
1266
- .block-tag {
1267
- display: inline-flex;
1268
- flex-shrink: 0;
1269
- align-items: center;
1270
- gap: 0.375rem;
1271
- margin-top: 0.25rem;
1272
- border-radius: var(--block-control-radius);
1273
- background: var(--block-tint);
1274
- padding: 0.25rem 0.75rem;
1275
- font-size: var(--type-label-large-size);
1276
- line-height: var(--type-label-large-line-height);
1277
- font-weight: var(--type-label-large-weight);
1278
- letter-spacing: var(--type-label-large-tracking);
1279
- }
1280
- .block-tag svg {
1281
- color: var(--block-accent);
1282
- }
1283
- .block-price-amount {
1284
- margin-top: 1.5rem;
1285
- font-size: var(--type-display-medium-size);
1286
- line-height: var(--type-display-medium-line-height);
1287
- font-weight: var(--type-display-medium-weight);
1288
- letter-spacing: var(--type-display-medium-tracking);
1289
- font-variant-numeric: tabular-nums;
1290
- }
1291
- .block-price-unit {
1292
- margin-top: 0.25rem;
1293
- color: var(--block-muted);
1294
- }
1295
- /* A punch card's offer in a price card, a filled card with smaller corners. */
1296
- .block-price-extra {
1297
- margin-top: 1.5rem;
1298
- --card-radius: var(--block-radius-small);
1299
- --card-padding: 1rem;
1300
- }
1301
- .block-price-extra-title {
1302
- display: flex;
1303
- align-items: center;
1304
- gap: 0.5rem;
1305
- font-weight: 500;
1306
- }
1307
- .block-price-extra-title svg {
1308
- color: var(--block-accent);
1309
- }
1310
- .block-price-extra-text {
1311
- margin-top: 0.25rem;
1312
- color: var(--block-muted);
1313
- }
1314
- .block-price-extra-text strong {
1315
- color: var(--block-text);
1316
- font-weight: 500;
1317
- font-variant-numeric: tabular-nums;
1318
- }
1319
- .block-price-card > .block-arrow-link {
1320
- align-self: flex-start;
1321
- margin-top: 1.5rem;
1322
- }
1323
- .block-price-list {
1324
- margin: 0;
1325
- border: 1px solid var(--block-line);
1326
- border-radius: var(--block-radius);
1327
- padding: 0 1.5rem;
1328
- list-style: none;
1329
- }
1330
- .block-price-row {
1331
- display: grid;
1332
- gap: 0.25rem 1.5rem;
1333
- padding-block: 1.25rem;
1334
- }
1335
- .block-price-row + .block-price-row {
1336
- border-top: 1px solid var(--block-line);
1337
- }
1338
- .block-price-row-name {
1339
- font-size: var(--type-title-medium-size);
1340
- line-height: var(--type-title-medium-line-height);
1341
- font-weight: var(--type-title-medium-weight);
1342
- letter-spacing: var(--type-title-medium-tracking);
1343
- color: inherit;
1344
- text-decoration: none;
1345
- }
1346
- a.block-price-row-name:hover {
1347
- color: var(--block-accent);
1348
- }
1349
- .block-price-row-text {
1350
- font-size: var(--type-body-medium-size);
1351
- line-height: var(--type-body-medium-line-height);
1352
- font-weight: var(--type-body-medium-weight);
1353
- letter-spacing: var(--type-body-medium-tracking);
1354
- color: var(--block-muted);
1355
- }
1356
- .block-price-row-note {
1357
- margin-top: 0.25rem;
1358
- max-width: 60ch;
1359
- font-size: var(--type-body-medium-size);
1360
- line-height: var(--type-body-medium-line-height);
1361
- font-weight: var(--type-body-medium-weight);
1362
- letter-spacing: var(--type-body-medium-tracking);
1363
- color: var(--block-muted);
1364
- }
1365
- .block-price-row-price {
1366
- font-size: var(--type-headline-small-size);
1367
- line-height: var(--type-headline-small-line-height);
1368
- font-weight: var(--type-headline-small-weight);
1369
- letter-spacing: var(--type-headline-small-tracking);
1370
- font-variant-numeric: tabular-nums;
1371
- }
1372
- .block-price-row-price > span {
1373
- display: block;
1374
- font-size: var(--type-body-medium-size);
1375
- line-height: var(--type-body-medium-line-height);
1376
- font-weight: var(--type-body-medium-weight);
1377
- letter-spacing: var(--type-body-medium-tracking);
1378
- color: var(--block-muted);
1379
- }
1380
- /* A quiet text with an icon before it (the terms under the prices). */
1381
- .block-terms {
1382
- display: flex;
1383
- gap: 0.625rem;
1384
- margin-top: 1rem;
1385
- max-width: 70ch;
1386
- font-size: var(--type-body-medium-size);
1387
- line-height: var(--type-body-medium-line-height);
1388
- font-weight: var(--type-body-medium-weight);
1389
- letter-spacing: var(--type-body-medium-tracking);
1390
- color: var(--block-muted);
1391
- }
1392
- .block-terms svg {
1393
- flex-shrink: 0;
1394
- margin-top: 0.125rem;
1395
- }
1396
-
1397
- @media (hover: hover) {
1398
- a.block-card:hover {
1399
- --card-outlined-line: var(--block-accent);
1400
- }
1401
- a.block-card:hover .block-card-arrow {
1402
- translate: 0.25rem 0;
1403
- }
1404
- a.block-card:hover .block-card-picture img {
1405
- scale: 1.03;
1406
- }
1407
- }
1408
- @media (width >= 40rem) {
1409
- .block-buttons {
1410
- flex-direction: row;
1411
- flex-wrap: wrap;
1412
- }
1413
- .block-cards {
1414
- grid-template-columns: repeat(2, minmax(0, 1fr));
1415
- }
1416
- .block-price-row {
1417
- grid-template-columns: 1fr auto;
1418
- }
1419
- .block-price-row-price {
1420
- text-align: right;
1421
- }
1422
- }
1423
- @media (width >= 48rem) {
1424
- .block-testimonial {
1425
- --card-padding: 1.75rem;
1426
- }
1427
- .block-row-text {
1428
- font-size: var(--type-body-large-size);
1429
- line-height: var(--type-body-large-line-height);
1430
- font-weight: var(--type-body-large-weight);
1431
- letter-spacing: var(--type-body-large-tracking);
1432
- }
1433
- .block-notice {
1434
- padding: 1.25rem 1.5rem;
1435
- }
1436
- .block-accordion-label {
1437
- padding-inline: 2rem;
1438
- font-size: var(--type-title-medium-size);
1439
- line-height: var(--type-title-medium-line-height);
1440
- font-weight: var(--type-title-medium-weight);
1441
- letter-spacing: var(--type-title-medium-tracking);
1442
- }
1443
- .block-accordion-body {
1444
- padding: 0 2rem 2rem;
1445
- }
1446
- .block-accordion-answer {
1447
- font-size: var(--type-body-large-size);
1448
- line-height: var(--type-body-large-line-height);
1449
- font-weight: var(--type-body-large-weight);
1450
- letter-spacing: var(--type-body-large-tracking);
1451
- }
1452
- .block-cta {
1453
- grid-template-columns: repeat(12, minmax(0, 1fr));
1454
- align-items: center;
1455
- gap: 2.5rem;
1456
- --card-padding: 3rem;
1457
- }
1458
- .block-cta-picture {
1459
- grid-column: span 2;
1460
- width: 7rem;
1461
- height: 7rem;
1462
- }
1463
- .block-cta-body {
1464
- grid-column: span 6;
1465
- }
1466
- .block-cta-buttons {
1467
- grid-column: span 4;
1468
- }
1469
- .block-cta-title {
1470
- font-size: var(--type-headline-medium-size);
1471
- line-height: var(--type-headline-medium-line-height);
1472
- font-weight: var(--type-headline-medium-weight);
1473
- letter-spacing: var(--type-headline-medium-tracking);
1474
- }
1475
- .block-prices,
1476
- .block-price-cards {
1477
- gap: 1.25rem;
1478
- }
1479
- .block-price-cards {
1480
- grid-template-columns: repeat(2, minmax(0, 1fr));
1481
- }
1482
- .block-price-card {
1483
- --card-padding: 2rem;
1484
- }
1485
- .block-price-card-title {
1486
- font-size: var(--type-headline-medium-size);
1487
- line-height: var(--type-headline-medium-line-height);
1488
- font-weight: var(--type-headline-medium-weight);
1489
- letter-spacing: var(--type-headline-medium-tracking);
1490
- }
1491
- .block-price-amount {
1492
- font-size: var(--type-display-large-size);
1493
- line-height: var(--type-display-large-line-height);
1494
- font-weight: var(--type-display-large-weight);
1495
- letter-spacing: var(--type-display-large-tracking);
1496
- }
1497
- .block-price-list {
1498
- padding-inline: 2rem;
1499
- }
1500
- }
1501
- /* ---- "Tjekliste" and "Priskort" ---- */
1502
-
1503
- /* "Tjekliste" (checklist/Checks.tsx), and what is included on a price card: a list without dividers (.list in
1504
- ui.css), a check before each line; with six or more (not on a card), two columns where there is room for 16rem
1505
- each, never more. Nothing in it is tapped, so it is spaced as a bulleted or numbered list in the text (half a
1506
- line between its lines, not the height of a list item one taps), and its checks start where the text around it
1507
- does. */
1508
- .block-checklist {
1509
- --list-item-min-height: auto;
1510
- --list-item-padding-block: 0.25em;
1511
- --list-item-padding-inline: 0;
1512
- }
1513
- .block-checklist.block-in-text {
1514
- margin-block: 1rem;
1515
- }
1516
- .block-checklist:not(.block-plan-features):has(> :nth-child(6)) {
1517
- display: grid;
1518
- grid-template-columns: repeat(auto-fit, minmax(min(100%, max(16rem, calc(50% - 1rem))), 1fr));
1519
- column-gap: 2rem;
1520
- }
1521
-
1522
- /* "Priskort" (pricecards/View.tsx): the cards side by side, as many columns as there are cards where the block has
1523
- room for them (it is a container: two from 34rem, three from 40rem, four from 56rem; four two by two before that),
1524
- else under each other. Each card an outlined card (.card in ui.css): its name, its price large with what it is for
1525
- beside it, its text, what is included under a line (.block-checklist) and its button at the bottom in the card's
1526
- width, so the buttons of cards side by side are in line; the highlighted one with an edge in the accent and its
1527
- label in a pill in the accent over its name. */
1528
- .block-plans {
1529
- container-type: inline-size;
1530
- }
1531
- .block-plans.block-in-text {
1532
- margin-block: 2.5rem;
1533
- }
1534
- .block-plans-list {
1535
- display: grid;
1536
- gap: 1rem;
1537
- margin: 0;
1538
- padding: 0;
1539
- list-style: none;
1540
- }
1541
- @container (width >= 34rem) {
1542
- .block-plans-2,
1543
- .block-plans-4 {
1544
- grid-template-columns: repeat(2, minmax(0, 1fr));
1545
- }
1546
- }
1547
- @container (width >= 40rem) {
1548
- .block-plans-3 {
1549
- grid-template-columns: repeat(3, minmax(0, 1fr));
1550
- }
1551
- }
1552
- @container (width >= 56rem) {
1553
- .block-plans-4 {
1554
- grid-template-columns: repeat(4, minmax(0, 1fr));
1555
- }
1556
- }
1557
- .block-plan {
1558
- display: flex;
1559
- flex-direction: column;
1560
- color: var(--block-text);
1561
- /* The price is as large as the card has room for (cqi). */
1562
- container-type: inline-size;
1563
- }
1564
- .block-plan-featured {
1565
- box-shadow: inset 0 0 0 2px var(--block-accent);
1566
- }
1567
- .block-plan-badge {
1568
- align-self: flex-start;
1569
- margin-bottom: 0.75rem;
1570
- border-radius: var(--block-control-radius);
1571
- background: var(--block-accent);
1572
- color: var(--block-on-accent);
1573
- padding: 0.25rem 0.75rem;
1574
- font-size: var(--type-label-medium-size);
1575
- line-height: var(--type-label-medium-line-height);
1576
- font-weight: var(--type-label-medium-weight);
1577
- letter-spacing: var(--type-label-medium-tracking);
1578
- }
1579
- .block-plan-name {
1580
- margin: 0;
1581
- font-size: var(--type-title-large-size);
1582
- line-height: var(--type-title-large-line-height);
1583
- font-weight: var(--type-title-large-weight);
1584
- letter-spacing: var(--type-title-large-tracking);
1585
- }
1586
- .block-plan-price {
1587
- display: flex;
1588
- flex-wrap: wrap;
1589
- align-items: baseline;
1590
- gap: 0.25rem 0.5rem;
1591
- margin: 1rem 0 0;
1592
- }
1593
- .block-plan-amount {
1594
- font-size: clamp(var(--type-headline-small-size), 16cqi, var(--type-display-small-size));
1595
- line-height: var(--type-headline-large-line-height);
1596
- font-weight: var(--type-headline-large-weight);
1597
- letter-spacing: var(--type-headline-large-tracking);
1598
- font-variant-numeric: tabular-nums;
1599
- }
1600
- .block-plan-unit {
1601
- color: var(--block-muted);
1602
- }
1603
- .block-plan-text {
1604
- margin: 0.75rem 0 0;
1605
- color: var(--block-muted);
1606
- }
1607
- .block-plan-features {
1608
- margin-top: 1.5rem;
1609
- border-top: 1px solid var(--block-line);
1610
- padding-top: 0.5rem;
1611
- }
1612
- .block-buttons.block-plan-buttons {
1613
- flex-direction: column;
1614
- margin-top: auto;
1615
- padding-top: 1.5rem;
1616
- }
1617
- /* A narrow card: a long text on its button goes onto two lines rather than out of the card. */
1618
- .block-plan-buttons .button {
1619
- padding-block: 0.75rem;
1620
- padding-inline: 1rem;
1621
- white-space: normal;
1622
- text-align: center;
1623
- line-height: 1.25;
1624
- }
1625
-
1626
- /* ---- end of "Tjekliste" and "Priskort" ---- */
1627
-
1628
- /* Opening and closing glide where the browser can animate ::details-content (else the script in
1629
- Accordion.tsx does it); none with reduced motion. */
1630
- @media (prefers-reduced-motion: no-preference) {
1631
- .block-accordion {
1632
- interpolate-size: allow-keywords;
1633
- }
1634
- .block-accordion-row::details-content {
1635
- block-size: 0;
1636
- overflow-y: clip;
1637
- transition:
1638
- block-size var(--motion-spatial),
1639
- content-visibility var(--motion-spatial-duration) allow-discrete;
1640
- }
1641
- .block-accordion-row[open]::details-content {
1642
- block-size: auto;
1643
- }
1644
- }
1645
- @media (prefers-reduced-motion: reduce) {
1646
- .block-accordion-label,
1647
- .block-accordion-icon,
1648
- .block-card,
1649
- .block-card-arrow,
1650
- .block-card-picture img {
1651
- transition: none;
1652
- }
1653
- }
1654
- }
1655
-
1656
- /* "Video": the video before it is played (video/, packages/editor/lib/video.mjs); the video takes its
1657
- place. Outside the layers, as it is a link in the text's style (.prose), whose link style it undoes. */
1658
- .prose .video-facade {
1659
- display: flex;
1660
- flex-direction: column;
1661
- align-items: center;
1662
- justify-content: center;
1663
- gap: 0.5rem;
1664
- width: 100%;
1665
- aspect-ratio: 16 / 9;
1666
- margin-block: 2em;
1667
- padding: 1.5rem;
1668
- border-radius: var(--block-radius);
1669
- background: var(--block-tint);
1670
- color: var(--block-text);
1671
- text-align: center;
1672
- text-decoration: none;
1673
- }
1674
- .prose .video-facade svg {
1675
- color: var(--block-accent);
1676
- transition: transform var(--motion-spatial);
1677
- }
1678
- .prose .video-facade:hover svg {
1679
- transform: scale(1.08);
1680
- }
1681
- /* At most two lines; a longer title ends with "…" (the whole title is still the link's name). */
1682
- .video-facade-title {
1683
- display: -webkit-box;
1684
- max-width: 40ch;
1685
- overflow: hidden;
1686
- font-size: var(--type-title-medium-size);
1687
- line-height: var(--type-title-medium-line-height);
1688
- font-weight: var(--type-title-medium-weight);
1689
- letter-spacing: var(--type-title-medium-tracking);
1690
- -webkit-box-orient: vertical;
1691
- -webkit-line-clamp: 2;
1692
- line-clamp: 2;
1693
- }
1694
- /* With a still from the video (packages/editor/scripts/video-thumbnails.mjs), as on YouTube: the still fills the
1695
- box, the white play button in the middle of the box (not of the space above the title), the title
1696
- at the bottom over a shade. */
1697
- .prose .video-facade-still {
1698
- position: relative;
1699
- isolation: isolate;
1700
- overflow: hidden;
1701
- align-items: flex-start;
1702
- justify-content: flex-end;
1703
- gap: 0.25rem;
1704
- padding: 1rem 1.25rem;
1705
- background: #000;
1706
- color: #fff;
1707
- text-align: left;
1708
- }
1709
- .prose .video-facade-still::after {
1710
- content: '';
1711
- position: absolute;
1712
- inset: 0;
1713
- z-index: -1;
1714
- background: linear-gradient(to bottom, rgb(0 0 0 / 0.15) 40%, rgb(0 0 0 / 0.75));
1715
- }
1716
- .prose .video-facade-still .video-facade-image {
1717
- position: absolute;
1718
- inset: 0;
1719
- z-index: -2;
1720
- width: 100%;
1721
- height: 100%;
1722
- margin: 0;
1723
- object-fit: cover;
1724
- }
1725
- .prose .video-facade-still svg {
1726
- position: absolute;
1727
- inset: 0;
1728
- margin: auto;
1729
- color: #fff;
1730
- filter: drop-shadow(0 2px 8px rgb(0 0 0 / 0.5));
1731
- }
1732
- .video-facade-still .video-facade-title {
1733
- font-size: var(--type-title-small-size);
1734
- line-height: var(--type-title-small-line-height);
1735
- font-weight: var(--type-title-small-weight);
1736
- letter-spacing: var(--type-title-small-tracking);
1737
- color: #fff;
1738
- text-shadow: 0 1px 3px rgb(0 0 0 / 0.8);
1739
- }
1740
- @media (min-width: 768px) {
1741
- .prose .video-facade-still svg {
1742
- width: 4.5rem;
1743
- height: 4.5rem;
1744
- }
1745
- .video-facade-still .video-facade-title {
1746
- font-size: var(--type-title-medium-size);
1747
- line-height: var(--type-title-medium-line-height);
1748
- font-weight: var(--type-title-medium-weight);
1749
- letter-spacing: var(--type-title-medium-tracking);
1750
- }
1751
- }
1752
-
1753
- /* A block's head with a label above its heading or a subheading under it (BlockHead.tsx in blocks/, an <hgroup>; only a
1754
- heading is the text's own <h2>, without this): the label in small capitals, spaced out, in the accent; the
1755
- subheading larger and quiet. Mostly in the text's style (.prose), so outside the layers, like the video above, whose
1756
- margins it sets in place of the text's; a theme that places a block outside the text sets its own (.block-place in
1757
- the standard theme). A theme gives it its own look outside the layers too (the standard theme: in the middle). */
1758
- .block-head {
1759
- margin-block: 2.5em 1.25em;
1760
- }
1761
- .block-head:first-child {
1762
- margin-top: 0;
1763
- }
1764
- .block-head > h2,
1765
- .block-head > .block-eyebrow,
1766
- .block-head > .block-subheading {
1767
- margin-block: 0;
1768
- }
1769
- .block-head > * + h2,
1770
- .block-head > * + .block-subheading {
1771
- margin-top: 0.75rem;
1772
- }
1773
- .block-head > .block-eyebrow + h2 {
1774
- margin-top: 0.5rem;
1775
- }
1776
- .block-head > .block-eyebrow {
1777
- font-size: var(--type-label-medium-size);
1778
- line-height: var(--type-label-medium-line-height);
1779
- font-weight: var(--type-label-medium-weight);
1780
- letter-spacing: 0.12em;
1781
- text-transform: uppercase;
1782
- color: var(--block-accent);
1783
- }
1784
- .block-head > .block-subheading {
1785
- font-size: var(--type-title-large-size);
1786
- line-height: var(--type-title-large-line-height);
1787
- font-weight: var(--type-title-large-weight);
1788
- letter-spacing: var(--type-title-large-tracking);
1789
- color: var(--block-muted);
1790
- }
1791
-
1792
- /* A word or more in one of the site's colours, in a text (packages/editor/lib/text-colors.mjs, the colour button in the
1793
- editor): the accent, or the quiet text's, both readable on the background, the surfaces and the tint (the site's
1794
- pairs of colours, checked under "Farver"). Bold, italic and a link in it have its colour. Outside the layers, as it
1795
- is in the text's style (.prose), whose colours of bold text and links it goes over. On a picture behind a hero's
1796
- text, where only the text's colour can be read, it is the text's. */
1797
- .color-accent,
1798
- .color-accent :is(strong, em, a) {
1799
- color: var(--block-accent);
1800
- }
1801
- .color-muted,
1802
- .color-muted :is(strong, em, a) {
1803
- color: var(--block-muted);
1804
- }
1805
- .block-hero-behind :is(.color-accent, .color-muted),
1806
- .block-hero-behind :is(.color-accent, .color-muted) :is(strong, em, a) {
1807
- color: inherit;
1808
- }
1
+ /*
2
+ The look of the standard blocks (their fields: packages/editor/src/standard/; their markup: blocks/ in this theme), on
3
+ the site and in the editor, in the standard theme. Every colour, shape and motion comes from a CSS variable, which a
4
+ theme sets to its own design in its own CSS:
5
+
6
+ :root { --block-accent: var(--accent); --block-radius: 1.5rem; }
7
+
8
+ Without them, the blocks have a plain look of their own (the values below). Sizes and spacing are
9
+ the blocks' own, in rem; their text has the site's font. Every theme imports this file into its CSS
10
+ (styles/global.css: the standard theme's, another theme's …), which the editor uses too.
11
+
12
+ --block-text text
13
+ --block-muted quieter text (an answer, a step's text)
14
+ --block-accent the one colour: a notice's edge, the step numbers, an open row, the play button,
15
+ a card's icon and link
16
+ --block-accent-hover the accent of a filled button pointed at (ui.css)
17
+ --block-on-accent text on the accent (the step numbers, a filled button)
18
+ --block-surface a raised surface (the rows that fold out, the cards)
19
+ --block-tint a light background (a notice, a video before it is played)
20
+ --block-line lines between rows and along the steps, the edge of a card
21
+ --block-radius the corners of a panel
22
+ --block-radius-small the corners of something smaller in or beside a panel (a picture in a list, a row, a badge's
23
+ square, a step on a time line)
24
+ --block-control-radius the corners of a button and a tag (a pill when large)
25
+ --block-shadow the shadow of a raised panel
26
+ --block-ease the easing of motion (else the motion scheme's, --motion-ease)
27
+ --block-ease-quick the easing of a quick change of state (a colour, an arrow that turns or moves; else the motion
28
+ scheme's, --motion-ease-quick)
29
+ --block-hero-shade, --block-hero-on-shade (optional) the colour a picture behind a hero's text is darkened with,
30
+ and the text's on it; without them the text's colour and the surface's
31
+ --block-page-width, --block-gutter the page's container (its width, gutters included, and its gutter at the
32
+ side), whose left edge the text starts at: how far a banner across the whole width reaches out
33
+ of the text to the window's edges, and where its content starts again (the standard theme's
34
+ Container.astro: 72rem, 1.25rem and 2rem from 48rem)
35
+
36
+ How things move is the site's motion scheme (Material 3's, chosen under "Udseende" › "Bevægelse"; lib/motion.ts), which
37
+ Base.astro writes into the <head> as springs, each its duration and curve, for `transition` and `animation`:
38
+ --motion-spatial-fast, --motion-spatial, --motion-spatial-slow something that moves, grows or changes shape
39
+ --motion-effects-fast, --motion-effects, --motion-effects-slow a colour, a shadow, something that fades
40
+ --motion-spatial-fast-duration … --motion-effects-slow-duration each one's duration alone, for what must last as
41
+ long as it (a visibility that waits for it, a display … allow-discrete)
42
+ --motion-ease, --motion-ease-quick the default spatial and effects curves alone, for a duration of one's own
43
+ Without them (a page without Base.astro's <head>), the values below: the standard scheme's lengths with Material's
44
+ standard curve.
45
+
46
+ A site sets the class `js` on <html> as early as it can (this site: Base.astro): then a long
47
+ testimonial is cut with "Læs mere" from the start; without it, the whole text is shown.
48
+ The mark before the name on a testimonial (.block-testimonial-mark) is the site's own: it is not shown
49
+ until the site gives it a look (the standard theme: an avatar with the name's first letter, its data-initial; another:
50
+ its logo).
51
+ */
52
+ :where(:root) {
53
+ --block-text: #1f2328;
54
+ --block-muted: #59636e;
55
+ --block-accent: #0969da;
56
+ --block-accent-hover: #0550ae;
57
+ --block-on-accent: #ffffff;
58
+ --block-surface: #ffffff;
59
+ --block-tint: #f2f4f7;
60
+ --block-line: #d8dee4;
61
+ --block-radius: 0.75rem;
62
+ --block-radius-small: 1rem;
63
+ --block-control-radius: 0.5rem;
64
+ --block-shadow: 0 1px 3px rgb(0 0 0 / 0.12);
65
+ --motion-spatial-fast: 230ms cubic-bezier(0.2, 0, 0, 1);
66
+ --motion-spatial: 320ms cubic-bezier(0.2, 0, 0, 1);
67
+ --motion-spatial-slow: 490ms cubic-bezier(0.2, 0, 0, 1);
68
+ --motion-effects-fast: 150ms cubic-bezier(0.2, 0, 0, 1);
69
+ --motion-effects: 240ms cubic-bezier(0.2, 0, 0, 1);
70
+ --motion-effects-slow: 330ms cubic-bezier(0.2, 0, 0, 1);
71
+ --motion-spatial-fast-duration: 230ms;
72
+ --motion-spatial-duration: 320ms;
73
+ --motion-spatial-slow-duration: 490ms;
74
+ --motion-effects-fast-duration: 150ms;
75
+ --motion-effects-duration: 240ms;
76
+ --motion-effects-slow-duration: 330ms;
77
+ /* Tailwind's transition-colors, transition-opacity … without a duration of their own: the default effects spring. */
78
+ --default-transition-duration: var(--motion-effects-duration);
79
+ --default-transition-timing-function: var(--motion-ease-quick, cubic-bezier(0.2, 0, 0, 1));
80
+ --block-ease: var(--motion-ease, cubic-bezier(0.2, 0, 0, 1));
81
+ --block-ease-quick: var(--motion-ease-quick, cubic-bezier(0.2, 0, 0, 1));
82
+ --block-page-width: 72rem;
83
+ --block-gutter: 1.25rem;
84
+ }
85
+ @media (min-width: 48rem) {
86
+ :where(:root) {
87
+ --block-gutter: 2rem;
88
+ }
89
+ }
90
+
91
+ /* In a site's layer of components, so the site's utilities (a margin on the steps) win over them. */
92
+ @layer components {
93
+ /* A block in the text of a page: the space above and below it. */
94
+ .block-in-text {
95
+ margin-block: 2rem;
96
+ }
97
+
98
+ /* "Besked": a short notice in a box with the accent along its left edge (notice/). */
99
+ .block-notice {
100
+ border-left: 4px solid var(--block-accent);
101
+ border-radius: var(--block-radius);
102
+ background: var(--block-tint);
103
+ padding: 1rem 1.25rem;
104
+ font-size: var(--type-body-large-size);
105
+ line-height: var(--type-body-large-line-height);
106
+ font-weight: var(--type-body-large-weight);
107
+ letter-spacing: var(--type-body-large-tracking);
108
+ }
109
+
110
+ /* "Trin": numbered steps along a line (steps/StepList.tsx). */
111
+ .block-steps {
112
+ position: relative;
113
+ max-width: 48rem;
114
+ }
115
+ .block-steps.block-in-text {
116
+ margin-block: 2.5rem;
117
+ }
118
+ .block-steps > :not(:last-child) {
119
+ margin-bottom: 2.5rem;
120
+ }
121
+ .block-steps-line {
122
+ position: absolute;
123
+ top: 1.5rem;
124
+ bottom: 1.5rem;
125
+ left: 1.5rem;
126
+ width: 1px;
127
+ background: var(--block-line);
128
+ }
129
+ .block-step {
130
+ position: relative;
131
+ display: flex;
132
+ gap: 1.25rem;
133
+ }
134
+ .block-step-number {
135
+ position: relative;
136
+ display: grid;
137
+ width: 3rem;
138
+ height: 3rem;
139
+ flex-shrink: 0;
140
+ place-items: center;
141
+ border-radius: 9999px;
142
+ background: var(--block-accent);
143
+ color: var(--block-on-accent);
144
+ font-size: var(--type-title-medium-size);
145
+ line-height: var(--type-title-medium-line-height);
146
+ font-weight: var(--type-title-medium-weight);
147
+ letter-spacing: var(--type-title-medium-tracking);
148
+ font-variant-numeric: tabular-nums;
149
+ }
150
+ .block-step-body {
151
+ padding-top: 0.5rem;
152
+ }
153
+ .block-step-title {
154
+ font-size: var(--type-title-large-size);
155
+ line-height: var(--type-title-large-line-height);
156
+ font-weight: var(--type-title-large-weight);
157
+ letter-spacing: var(--type-title-large-tracking);
158
+ }
159
+ .block-step-text {
160
+ margin-top: 0.375rem;
161
+ max-width: 50ch;
162
+ color: var(--block-muted);
163
+ }
164
+
165
+ /* "Spørgsmål og svar": rows that fold out, one open at a time (faq/Accordion.tsx). */
166
+ .block-accordion {
167
+ max-width: 48rem;
168
+ border-radius: var(--block-radius);
169
+ background: var(--block-surface);
170
+ box-shadow: var(--block-shadow);
171
+ }
172
+ .block-accordion > :not(:last-child) {
173
+ border-bottom: 1px solid var(--block-line);
174
+ }
175
+ .block-accordion-label {
176
+ display: flex;
177
+ min-height: 3.5rem;
178
+ align-items: center;
179
+ justify-content: space-between;
180
+ gap: 1rem;
181
+ padding: 0.875rem 1.25rem;
182
+ font-size: var(--type-title-medium-size);
183
+ line-height: var(--type-title-medium-line-height);
184
+ font-weight: var(--type-title-medium-weight);
185
+ letter-spacing: var(--type-title-medium-tracking);
186
+ transition: color var(--motion-effects);
187
+ }
188
+ summary.block-accordion-label {
189
+ cursor: pointer;
190
+ list-style: none;
191
+ /* The focus ring sits inside the row, so the panel's rounded edge never cuts it off. */
192
+ outline-offset: -3px;
193
+ }
194
+ summary.block-accordion-label::-webkit-details-marker {
195
+ display: none;
196
+ }
197
+ .block-accordion-icon {
198
+ flex-shrink: 0;
199
+ color: var(--block-muted);
200
+ transition: rotate var(--motion-spatial);
201
+ }
202
+ @media (hover: hover) {
203
+ summary.block-accordion-label:hover {
204
+ color: var(--block-accent);
205
+ }
206
+ }
207
+ .block-accordion-row[open] > .block-accordion-label {
208
+ color: var(--block-accent);
209
+ }
210
+ .block-accordion-row[open] .block-accordion-icon {
211
+ rotate: 180deg;
212
+ color: var(--block-accent);
213
+ }
214
+ .block-accordion-body {
215
+ padding: 0 1.25rem 1.5rem;
216
+ }
217
+ /* An answer as it was written: paragraphs and lists apart, links in the accent. */
218
+ .block-accordion-answer {
219
+ max-width: 60ch;
220
+ font-size: var(--type-body-large-size);
221
+ line-height: var(--type-body-large-line-height);
222
+ font-weight: var(--type-body-large-weight);
223
+ letter-spacing: var(--type-body-large-tracking);
224
+ color: var(--block-muted);
225
+ }
226
+ .block-accordion-answer * + * {
227
+ margin-top: 0.75em;
228
+ }
229
+ .block-accordion-answer ul {
230
+ list-style: disc;
231
+ padding-left: 1.25em;
232
+ }
233
+ .block-accordion-answer ol {
234
+ list-style: decimal;
235
+ padding-left: 1.25em;
236
+ }
237
+ .block-accordion-answer li + li {
238
+ margin-top: 0.25em;
239
+ }
240
+ .block-accordion-answer strong {
241
+ color: var(--block-text);
242
+ font-weight: 600;
243
+ }
244
+ .block-accordion-answer a {
245
+ color: var(--block-accent);
246
+ font-weight: 500;
247
+ text-decoration: underline;
248
+ text-decoration-thickness: 1px;
249
+ text-underline-offset: 0.25em;
250
+ }
251
+ /* "Hero" (hero/): its heading, the subtitle (the first paragraph, larger) and the introduction, the buttons, a text
252
+ under them and a quote, beside the picture on a computer, under it on a phone. */
253
+ .block-hero {
254
+ display: grid;
255
+ gap: 2rem;
256
+ align-items: center;
257
+ }
258
+ .block-hero-title {
259
+ margin: 0 0 1.25rem;
260
+ font-size: var(--type-display-small-size);
261
+ line-height: var(--type-display-small-line-height);
262
+ font-weight: var(--type-display-small-weight);
263
+ letter-spacing: var(--type-display-small-tracking);
264
+ }
265
+ .block-hero-text > :first-child {
266
+ font-size: var(--type-title-large-size);
267
+ line-height: var(--type-title-large-line-height);
268
+ font-weight: var(--type-title-large-weight);
269
+ letter-spacing: var(--type-title-large-tracking);
270
+ }
271
+ .block-hero-text > * + * {
272
+ margin-top: 1rem;
273
+ color: var(--block-muted);
274
+ }
275
+ .block-hero-body > .block-buttons {
276
+ margin-top: 2rem;
277
+ }
278
+ .block-hero-note {
279
+ margin-top: 1rem;
280
+ max-width: 44ch;
281
+ font-size: var(--type-body-medium-size);
282
+ line-height: var(--type-body-medium-line-height);
283
+ font-weight: var(--type-body-medium-weight);
284
+ letter-spacing: var(--type-body-medium-tracking);
285
+ color: var(--block-muted);
286
+ }
287
+ .block-hero-note > * + * {
288
+ margin-top: 0.5rem;
289
+ }
290
+ /* A quote in the text under the buttons ("> …"): larger, in the text's colour, along a line in the accent; its last
291
+ paragraph, when it has more than one, is who said it (with a link to the whole of it). */
292
+ .block-hero-note > blockquote {
293
+ margin: 2rem 0 0;
294
+ border-left: 2px solid var(--block-accent);
295
+ padding-left: 1rem;
296
+ }
297
+ .block-hero-note > blockquote > p {
298
+ margin: 0;
299
+ font-size: var(--type-body-large-size);
300
+ line-height: var(--type-body-large-line-height);
301
+ font-weight: var(--type-body-large-weight);
302
+ letter-spacing: var(--type-body-large-tracking);
303
+ color: var(--block-text);
304
+ }
305
+ .block-hero-note > blockquote > p:last-child:not(:first-child) {
306
+ margin-top: 0.5rem;
307
+ font-size: var(--type-body-medium-size);
308
+ line-height: var(--type-body-medium-line-height);
309
+ font-weight: var(--type-body-medium-weight);
310
+ letter-spacing: var(--type-body-medium-tracking);
311
+ color: var(--block-muted);
312
+ }
313
+ .block-hero-picture {
314
+ display: block;
315
+ width: 100%;
316
+ height: auto;
317
+ aspect-ratio: 4 / 5;
318
+ object-fit: cover;
319
+ object-position: 50% 22%;
320
+ border-radius: var(--block-radius);
321
+ }
322
+ /* The picture behind the text ("Hero", `placement` 'behind'): it fills a panel, darkened from below (--block-hero-shade,
323
+ the text's colour unless the theme sets it) so the text on it (--block-hero-on-shade, the surface's) can be read. */
324
+ .block-hero-behind {
325
+ position: relative;
326
+ isolation: isolate;
327
+ display: flex;
328
+ min-height: 26rem;
329
+ flex-direction: column;
330
+ align-items: stretch;
331
+ justify-content: flex-end;
332
+ overflow: hidden;
333
+ border-radius: var(--block-radius);
334
+ padding: 2rem 1.5rem;
335
+ color: var(--block-hero-on-shade, var(--block-surface));
336
+ }
337
+ .block-hero-behind::before {
338
+ content: '';
339
+ position: absolute;
340
+ inset: 0;
341
+ z-index: -1;
342
+ background: linear-gradient(
343
+ to top,
344
+ color-mix(in srgb, var(--block-hero-shade, var(--block-text)) 85%, transparent),
345
+ color-mix(in srgb, var(--block-hero-shade, var(--block-text)) 35%, transparent) 70%,
346
+ color-mix(in srgb, var(--block-hero-shade, var(--block-text)) 20%, transparent)
347
+ );
348
+ }
349
+ .block-hero-behind > .block-hero-picture {
350
+ position: absolute;
351
+ inset: 0;
352
+ z-index: -2;
353
+ height: 100%;
354
+ aspect-ratio: auto;
355
+ border-radius: 0;
356
+ }
357
+ .block-hero-behind .block-hero-text > * + *,
358
+ .block-hero-behind .block-hero-note,
359
+ .block-hero-behind .block-hero-note > blockquote > p:last-child:not(:first-child) {
360
+ color: color-mix(in srgb, var(--block-hero-on-shade, var(--block-surface)) 85%, transparent);
361
+ }
362
+ .block-hero-behind .block-hero-note > blockquote {
363
+ border-left-color: currentColor;
364
+ }
365
+ .block-hero-behind .block-hero-note > blockquote > p {
366
+ color: var(--block-hero-on-shade, var(--block-surface));
367
+ }
368
+ .block-hero-behind :is(.block-link, .block-hero-note a) {
369
+ color: inherit;
370
+ }
371
+ /* Across the whole width of the window ("Banner", `width` 'full'): without corners, and without a picture behind it on
372
+ a band in the tint, its content in a readable width. On the site (in the text, .block-in-text) it reaches out of
373
+ the text to the window's edges, from where the text starts at the left of the page's container (--block-page-width,
374
+ --block-gutter), and its content starts there again and ends at the container's right edge; the page is clipped at
375
+ the window's edges while it has one (100vw is a scrollbar wider). In the editor it is as wide as where it is drawn. */
376
+ .block-hero.block-hero-full {
377
+ border-radius: 0;
378
+ }
379
+ :where(.block-hero-full:not(.block-hero-behind)) {
380
+ background: var(--block-tint);
381
+ padding: 2.5rem 1.5rem;
382
+ }
383
+ :where(.block-hero-full) > .block-hero-body {
384
+ max-width: 44rem;
385
+ }
386
+ .block-hero-full.block-in-text {
387
+ --block-hero-inset: calc(max(0px, (100vw - var(--block-page-width)) / 2) + var(--block-gutter));
388
+ width: 100vw;
389
+ max-width: none;
390
+ margin-left: calc(-1 * var(--block-hero-inset));
391
+ padding-inline: var(--block-hero-inset);
392
+ }
393
+ body:has(.block-hero-full.block-in-text) {
394
+ overflow-x: clip;
395
+ }
396
+ @media (min-width: 48rem) {
397
+ .block-hero {
398
+ grid-template-columns: 7fr 5fr;
399
+ gap: 3rem;
400
+ }
401
+ .block-hero-behind {
402
+ min-height: 32rem;
403
+ padding: 3.5rem;
404
+ }
405
+ :where(.block-hero-full:not(.block-hero-behind)) {
406
+ padding: 4rem 3.5rem;
407
+ }
408
+ .block-hero-title {
409
+ font-size: var(--type-display-medium-size);
410
+ line-height: var(--type-display-medium-line-height);
411
+ font-weight: var(--type-display-medium-weight);
412
+ letter-spacing: var(--type-display-medium-tracking);
413
+ }
414
+ .block-hero-body > .block-buttons {
415
+ flex-direction: row;
416
+ }
417
+ }
418
+
419
+ /* "Knapper": buttons in a row, on a phone under each other in the full width (buttons/). The buttons are the
420
+ theme's (.button in ui.css), each of the kind it was given. */
421
+ .block-buttons {
422
+ display: flex;
423
+ flex-direction: column;
424
+ gap: 0.75rem;
425
+ }
426
+
427
+ /* A form in a block or a pop-up (an app's: Mailchimp's signup): its fields (the theme's text fields, .text-field in
428
+ ui.css) and its button side by side, wrapping on a phone, and the answer under it. */
429
+ .block-form {
430
+ display: flex;
431
+ flex-wrap: wrap;
432
+ gap: 0.75rem;
433
+ margin-top: 1.5rem;
434
+ }
435
+ .block-form > .button {
436
+ flex: 1 0 auto;
437
+ }
438
+ .block-form > .text-field {
439
+ flex: 1 1 12rem;
440
+ }
441
+ /* The answer to a form, in the accent when it went wrong (data-failed). */
442
+ .block-message {
443
+ margin-top: 1rem;
444
+ }
445
+ .block-message[data-failed] {
446
+ color: var(--block-accent);
447
+ }
448
+
449
+ /* A link in a block's text (and in the text under a banner's buttons): in the accent, underlined, thicker when
450
+ pointed at. */
451
+ .block-link,
452
+ .block-hero-note a {
453
+ color: var(--block-accent);
454
+ font-weight: 500;
455
+ text-decoration: underline;
456
+ text-decoration-thickness: 1px;
457
+ text-underline-offset: 0.25em;
458
+ }
459
+ .block-link:hover,
460
+ .block-hero-note a:hover {
461
+ text-decoration-thickness: 2px;
462
+ }
463
+ /* A link on its own line with an arrow after it ("Alle indlæg →"). */
464
+ .block-arrow-link {
465
+ display: inline-flex;
466
+ align-items: center;
467
+ gap: 0.5rem;
468
+ font-weight: 500;
469
+ color: var(--block-accent);
470
+ text-decoration: none;
471
+ }
472
+
473
+ /* "Blogindlæg": its posts as the blog shows them (the theme's PostList.tsx and BlogPosts.tsx), "Alle indlæg" under
474
+ them. */
475
+ .block-posts-in-text.block-in-text {
476
+ margin-block: 2.5rem;
477
+ }
478
+ .block-posts-all {
479
+ margin-top: 1.5rem;
480
+ }
481
+ /* In the editor's drawing: random posts, of how many; under all of them, how many more there are. */
482
+ .block-posts-note {
483
+ margin: 0 0 1rem;
484
+ font-size: var(--type-body-medium-size);
485
+ line-height: var(--type-body-medium-line-height);
486
+ font-weight: var(--type-body-medium-weight);
487
+ letter-spacing: var(--type-body-medium-tracking);
488
+ color: var(--block-muted);
489
+ }
490
+ .block-posts-more {
491
+ margin: 1rem 0 0;
492
+ }
493
+
494
+ /* Only for screen readers. */
495
+ .block-sr-only {
496
+ position: absolute;
497
+ width: 1px;
498
+ height: 1px;
499
+ padding: 0;
500
+ margin: -1px;
501
+ overflow: hidden;
502
+ clip-path: inset(50%);
503
+ white-space: nowrap;
504
+ border-width: 0;
505
+ }
506
+ /* In a drawing in the editor, when there is nothing to show. */
507
+ .block-empty {
508
+ border-radius: var(--block-radius);
509
+ background: var(--block-tint);
510
+ padding: 1.5rem;
511
+ color: var(--block-muted);
512
+ }
513
+
514
+ /* "Udtalelser": testimonials to leaf through (testimonials/Slider.tsx, a carousel: ui.css). */
515
+ .carousel.block-in-text,
516
+ .block-testimonials.block-in-text,
517
+ .block-testimonial.block-in-text {
518
+ margin-block: 2.5rem;
519
+ }
520
+ /* "Udtalelser" one after another (testimonials/List.tsx): two columns where there is room. */
521
+ .block-testimonial-list {
522
+ columns: 2 18rem;
523
+ column-gap: 1rem;
524
+ }
525
+ .block-testimonial-list > * {
526
+ break-inside: avoid;
527
+ margin-bottom: 1rem;
528
+ }
529
+ /* Filter chips (the theme's Chip, ui.css) that filter what is under them ("Udtalelser" under hinanden). */
530
+ .block-filters {
531
+ display: flex;
532
+ flex-wrap: wrap;
533
+ gap: 0.5rem;
534
+ margin-bottom: 1.5rem;
535
+ }
536
+ .block-filters[hidden] {
537
+ display: none;
538
+ }
539
+ /* One testimonial (testimonials/Testimonial.tsx), an outlined card (.card in ui.css): a big quotation mark, its tags,
540
+ the text (cut after seven lines with "Læs mere", or two with a link to the whole text) and the name. */
541
+ .block-testimonial {
542
+ display: flex;
543
+ width: 100%;
544
+ flex-direction: column;
545
+ margin: 0;
546
+ }
547
+ .block-testimonial-head {
548
+ display: flex;
549
+ align-items: flex-start;
550
+ justify-content: space-between;
551
+ gap: 1rem;
552
+ }
553
+ .block-testimonial-quote-mark {
554
+ display: block;
555
+ height: 2.5rem;
556
+ margin-bottom: -1rem;
557
+ font-size: var(--type-display-large-size);
558
+ line-height: var(--type-display-large-line-height);
559
+ font-weight: var(--type-display-large-weight);
560
+ letter-spacing: var(--type-display-large-tracking);
561
+ color: var(--block-accent);
562
+ }
563
+ .block-testimonial-tags {
564
+ display: flex;
565
+ flex-wrap: wrap;
566
+ justify-content: flex-end;
567
+ gap: 0.5rem;
568
+ }
569
+ .block-testimonial-tags .chip {
570
+ font-size: var(--type-label-large-size);
571
+ line-height: var(--type-label-large-line-height);
572
+ font-weight: var(--type-label-large-weight);
573
+ letter-spacing: var(--type-label-large-tracking);
574
+ }
575
+ .block-testimonial-text {
576
+ margin: 0.75rem 0 0;
577
+ font-size: var(--type-body-large-size);
578
+ line-height: var(--type-body-large-line-height);
579
+ font-weight: var(--type-body-large-weight);
580
+ letter-spacing: var(--type-body-large-tracking);
581
+ }
582
+ .block-testimonial-text > * {
583
+ margin: 0;
584
+ }
585
+ .block-testimonial-text > :not(:last-child) {
586
+ margin-bottom: 0.75rem;
587
+ }
588
+ .block-testimonial-context {
589
+ color: var(--block-muted);
590
+ }
591
+ .block-testimonial-short {
592
+ display: -webkit-box;
593
+ overflow: hidden;
594
+ -webkit-box-orient: vertical;
595
+ -webkit-line-clamp: 2;
596
+ }
597
+ .block-testimonial-more {
598
+ position: relative;
599
+ display: inline-flex;
600
+ align-self: flex-start;
601
+ align-items: center;
602
+ gap: 0.375rem;
603
+ margin-top: 0.75rem;
604
+ border: 0;
605
+ padding: 0;
606
+ background: none;
607
+ font: inherit;
608
+ font-size: var(--type-label-large-size);
609
+ line-height: var(--type-label-large-line-height);
610
+ font-weight: var(--type-label-large-weight);
611
+ letter-spacing: var(--type-label-large-tracking);
612
+ color: var(--block-accent);
613
+ text-decoration: none;
614
+ }
615
+ .block-testimonial-more[hidden] {
616
+ display: none;
617
+ }
618
+ .block-testimonial-more svg {
619
+ transition: transform var(--motion-spatial);
620
+ }
621
+ .block-testimonial-more[aria-expanded='true'] svg {
622
+ transform: rotate(180deg);
623
+ }
624
+ .block-testimonial-name {
625
+ display: flex;
626
+ align-items: center;
627
+ gap: 0.75rem;
628
+ margin-top: auto;
629
+ padding-top: 1.5rem;
630
+ font-weight: 500;
631
+ }
632
+ .block-testimonial-mark {
633
+ display: none;
634
+ }
635
+ /* A testimonial's picture before the name: small and round. */
636
+ .block-testimonial-picture {
637
+ width: 2.5rem;
638
+ height: 2.5rem;
639
+ flex-shrink: 0;
640
+ border-radius: 9999px;
641
+ object-fit: cover;
642
+ }
643
+ .js [data-clamp] {
644
+ max-height: calc(1.625em * 7);
645
+ overflow: hidden;
646
+ }
647
+ .js [data-clamp][data-overflow] {
648
+ mask-image: linear-gradient(to bottom, #000 55%, transparent);
649
+ }
650
+ .js [data-clamp][data-open] {
651
+ max-height: none;
652
+ mask-image: none;
653
+ }
654
+
655
+ /* "Accordion": a row's text, the link to its page and links to more specific pages under it
656
+ (accordion/PageRow.tsx). */
657
+ .block-row-text {
658
+ max-width: 60ch;
659
+ font-size: var(--type-body-large-size);
660
+ line-height: var(--type-body-large-line-height);
661
+ font-weight: var(--type-body-large-weight);
662
+ letter-spacing: var(--type-body-large-tracking);
663
+ color: var(--block-muted);
664
+ }
665
+ .block-row-links {
666
+ display: flex;
667
+ flex-wrap: wrap;
668
+ align-items: center;
669
+ gap: 0.75rem 1.5rem;
670
+ margin-top: 1rem;
671
+ }
672
+ .block-row-link {
673
+ display: inline-flex;
674
+ min-height: 2.75rem;
675
+ align-items: center;
676
+ gap: 0.5rem;
677
+ }
678
+
679
+ /* "Kort": outlined cards (.card in ui.css) that link to other pages, with an icon, a picture or nothing at the top,
680
+ two side by side from small screens (cards/LinkCards.tsx). */
681
+ .block-cards {
682
+ display: grid;
683
+ gap: 1rem;
684
+ padding: 0;
685
+ list-style: none;
686
+ }
687
+ .block-card {
688
+ display: flex;
689
+ height: 100%;
690
+ flex-direction: column;
691
+ /* Its edge a border in the outlined card's line, so a picture at the top stays inside it. */
692
+ border: 1px solid var(--card-outlined-line, var(--block-line));
693
+ /* The card's shadow as it is now (ui.css: at rest, pointed at, dragged), without its line. */
694
+ box-shadow: var(--card-shadow, 0 0 #0000);
695
+ color: inherit;
696
+ /* The same with a page (a link, as the site has links) and without one (not a link). */
697
+ font-weight: 500;
698
+ text-decoration: none;
699
+ transition:
700
+ border-color var(--motion-effects),
701
+ box-shadow var(--motion-effects);
702
+ }
703
+ .block-card-icon {
704
+ color: var(--block-accent);
705
+ }
706
+ /* The picture fills the top of the card, out to its edges. */
707
+ .block-card-picture {
708
+ display: block;
709
+ margin: -1.5rem -1.5rem 0.25rem;
710
+ overflow: hidden;
711
+ border-radius: calc(var(--card-radius, var(--block-radius)) - 1px) calc(var(--card-radius, var(--block-radius)) - 1px) 0 0;
712
+ background: var(--block-tint);
713
+ aspect-ratio: 3 / 2;
714
+ }
715
+ .block-card-picture img {
716
+ display: block;
717
+ width: 100%;
718
+ height: 100%;
719
+ object-fit: cover;
720
+ transition: scale var(--motion-spatial-slow);
721
+ }
722
+ .block-card-title {
723
+ margin-top: 1rem;
724
+ font-size: var(--type-title-large-size);
725
+ line-height: var(--type-title-large-line-height);
726
+ font-weight: var(--type-title-large-weight);
727
+ letter-spacing: var(--type-title-large-tracking);
728
+ }
729
+ /* Only text: the heading at the top. */
730
+ .block-card-title:first-child {
731
+ margin-top: 0;
732
+ }
733
+ .block-card-text {
734
+ margin-top: 0.375rem;
735
+ color: var(--block-muted);
736
+ }
737
+ .block-card-more {
738
+ display: inline-flex;
739
+ margin-top: auto;
740
+ align-items: center;
741
+ gap: 0.5rem;
742
+ padding-top: 1.25rem;
743
+ font-weight: 500;
744
+ color: var(--block-accent);
745
+ }
746
+ .block-card-arrow {
747
+ transition: translate var(--motion-spatial);
748
+ }
749
+ /* The cards on the accent ("Kort", `background`): the whole card in it, its text and icon in the colour that is read
750
+ on it. */
751
+ .block-cards-accent .block-card {
752
+ --card-outlined-surface: var(--block-accent);
753
+ --card-outlined-line: transparent;
754
+ color: var(--block-on-accent);
755
+ }
756
+ .block-cards-accent :is(.block-card-icon, .block-card-text, .block-card-more) {
757
+ color: var(--block-on-accent);
758
+ }
759
+ /* A panel (Panel.tsx): an outlined card (.card in ui.css) for a block that is one box (e.g. an app's about
760
+ or price block), with an icon, a heading and a text at the top, and parts under a line. */
761
+ .block-panel {
762
+ color: var(--block-text);
763
+ }
764
+ .block-panel.block-in-text + .block-panel.block-in-text {
765
+ margin-top: 1rem;
766
+ }
767
+ .block-panel-icon {
768
+ display: block;
769
+ margin-bottom: 1rem;
770
+ color: var(--block-accent);
771
+ }
772
+ .block-panel-title {
773
+ margin: 0;
774
+ font-size: var(--type-title-large-size);
775
+ line-height: var(--type-title-large-line-height);
776
+ font-weight: var(--type-title-large-weight);
777
+ letter-spacing: var(--type-title-large-tracking);
778
+ }
779
+ .block-panel-text {
780
+ margin-top: 0.4rem;
781
+ color: var(--block-muted);
782
+ }
783
+ .block-panel > .block-arrow-link {
784
+ margin-top: 1rem;
785
+ }
786
+ /* Buttons in a panel, and a link after them (an app's: Calendly's, when the calendar does not show). */
787
+ .block-panel > .block-buttons {
788
+ margin-top: 1.25rem;
789
+ }
790
+ .block-panel > .block-link {
791
+ display: inline-flex;
792
+ align-items: center;
793
+ gap: 0.375rem;
794
+ margin-top: 1.25rem;
795
+ }
796
+ /* Boxes side by side where there is room ("Links", links/LinkGroups.tsx; an app's payment block). */
797
+ .block-panels {
798
+ display: grid;
799
+ /* Two side by side where there is room for 17rem each, never more. */
800
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, max(17rem, calc(50% - 0.5rem))), 1fr));
801
+ gap: 1rem;
802
+ }
803
+ .block-panels.block-in-text {
804
+ margin-block: 2.5rem;
805
+ }
806
+ /* Boxes with values to copy: side by side only where each has room for its values with their buttons. */
807
+ .block-panels:has(.block-copy-rows) {
808
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, max(23rem, calc(50% - 0.5rem))), 1fr));
809
+ }
810
+ /* "Links": a box's heading linking to its page, and its pages under it in a list (.list in ui.css). */
811
+ .block-panel-title a {
812
+ color: inherit;
813
+ text-decoration: none;
814
+ }
815
+ .block-panel-title a:hover {
816
+ color: var(--block-accent);
817
+ }
818
+ .block-panel > .list {
819
+ margin-top: 1rem;
820
+ }
821
+ /* "Punkter med ikon": a list without dividers (.list in ui.css, points/PointList.tsx), its items side by side where
822
+ there is room for 16rem each. Nothing in it is tapped, so its icons start where the text around it does. */
823
+ .block-points {
824
+ --list-item-padding-inline: 0;
825
+ display: grid;
826
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
827
+ column-gap: 1.5rem;
828
+ }
829
+ .block-points.block-in-text {
830
+ margin-block: 1.5rem;
831
+ }
832
+ /* A check's text is its headline alone and can run over more lines, so it starts at the top and the check stands
833
+ by its first line. */
834
+ .block-checklist .list-item-container {
835
+ align-items: flex-start;
836
+ }
837
+ .block-checklist .list-item-leading {
838
+ max-height: var(--list-item-headline-line-height, 1lh);
839
+ }
840
+ /* A picture with a heading, a text and buttons, beside it where there is room for 22rem each, else under it
841
+ (e.g. an app's address block). */
842
+ .block-media {
843
+ display: grid;
844
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 22rem), 1fr));
845
+ align-items: center;
846
+ gap: 1.5rem 3rem;
847
+ }
848
+ .block-media-picture {
849
+ display: block;
850
+ width: 100%;
851
+ aspect-ratio: 4 / 3;
852
+ border-radius: var(--block-radius);
853
+ object-fit: cover;
854
+ }
855
+ .block-media-title {
856
+ margin: 0;
857
+ font-size: var(--type-headline-small-size);
858
+ line-height: var(--type-headline-small-line-height);
859
+ font-weight: var(--type-headline-small-weight);
860
+ letter-spacing: var(--type-headline-small-tracking);
861
+ }
862
+ .block-media-text {
863
+ margin: 1rem 0 0;
864
+ font-style: normal;
865
+ font-size: var(--type-body-large-size);
866
+ line-height: var(--type-body-large-line-height);
867
+ font-weight: var(--type-body-large-weight);
868
+ letter-spacing: var(--type-body-large-tracking);
869
+ }
870
+ .block-media-body > .block-buttons {
871
+ margin-top: 1.5rem;
872
+ }
873
+ /* Values that can be copied, each with its name before it and a button after it (e.g. an app's payment block). */
874
+ .block-copy-rows {
875
+ display: grid;
876
+ grid-template-columns: auto 1fr auto;
877
+ align-items: center;
878
+ gap: 0.75rem 1rem;
879
+ margin: 0;
880
+ }
881
+ .block-copy-rows dt {
882
+ color: var(--block-muted);
883
+ }
884
+ .block-copy-rows dd {
885
+ margin: 0;
886
+ }
887
+ /* In a narrow box the button goes under its value. */
888
+ .block-panel:has(> .block-copy-rows) {
889
+ container-type: inline-size;
890
+ }
891
+ @container (width < 18.5rem) {
892
+ .block-copy-rows {
893
+ grid-template-columns: auto 1fr;
894
+ }
895
+ .block-copy-rows dt {
896
+ grid-column: 1;
897
+ }
898
+ .block-copy-rows dd {
899
+ grid-column: 2;
900
+ }
901
+ }
902
+ .block-copy-value {
903
+ white-space: nowrap;
904
+ font-size: var(--type-headline-small-size);
905
+ line-height: var(--type-headline-small-line-height);
906
+ font-weight: var(--type-headline-small-weight);
907
+ letter-spacing: var(--type-headline-small-tracking);
908
+ font-variant-numeric: tabular-nums;
909
+ }
910
+ .block-panel > .block-buttons-row {
911
+ margin-top: 1.25rem;
912
+ }
913
+ .block-buttons-row {
914
+ display: flex;
915
+ flex-wrap: wrap;
916
+ gap: 0.5rem;
917
+ }
918
+ .block-panel-title > svg {
919
+ display: inline-block;
920
+ margin-right: 0.5rem;
921
+ vertical-align: -0.2em;
922
+ color: var(--block-accent);
923
+ }
924
+
925
+ /* Steps that go from free to the full price, each more coloured than the one before (`--step`, a share of the
926
+ accent over the tint), the last in the accent; across on a wider screen (e.g. an app's cancellation block). */
927
+ .block-timeline {
928
+ display: grid;
929
+ gap: 0.75rem;
930
+ margin: 0;
931
+ padding: 0;
932
+ list-style: none;
933
+ }
934
+ .block-timeline.block-in-text {
935
+ margin-block: 2rem;
936
+ }
937
+ .block-timeline > li {
938
+ display: flex;
939
+ align-items: center;
940
+ justify-content: space-between;
941
+ gap: 1rem;
942
+ border-radius: var(--block-radius-small);
943
+ background: color-mix(in srgb, var(--block-accent) var(--step, 0%), var(--block-tint));
944
+ padding: 1.25rem;
945
+ }
946
+ .block-timeline > li:last-child {
947
+ background: var(--block-accent);
948
+ color: var(--block-on-accent);
949
+ }
950
+ .block-timeline-when {
951
+ font-size: var(--type-body-medium-size);
952
+ line-height: var(--type-body-medium-line-height);
953
+ font-weight: var(--type-body-medium-weight);
954
+ letter-spacing: var(--type-body-medium-tracking);
955
+ color: var(--block-muted);
956
+ }
957
+ .block-timeline > li:last-child .block-timeline-when {
958
+ color: inherit;
959
+ opacity: 0.9;
960
+ }
961
+ .block-timeline-value {
962
+ font-size: var(--type-title-large-size);
963
+ line-height: var(--type-title-large-line-height);
964
+ font-weight: var(--type-title-large-weight);
965
+ letter-spacing: var(--type-title-large-tracking);
966
+ }
967
+ @media (width >= 40rem) {
968
+ .block-timeline {
969
+ grid-auto-columns: 1fr;
970
+ grid-auto-flow: column;
971
+ gap: 0;
972
+ }
973
+ .block-timeline > li {
974
+ flex-direction: column;
975
+ align-items: flex-start;
976
+ border-radius: 0;
977
+ padding: 1.5rem;
978
+ }
979
+ .block-timeline > li:first-child {
980
+ border-start-start-radius: var(--block-radius);
981
+ border-end-start-radius: var(--block-radius);
982
+ }
983
+ .block-timeline > li:last-child {
984
+ border-start-end-radius: var(--block-radius);
985
+ border-end-end-radius: var(--block-radius);
986
+ }
987
+ .block-timeline-value {
988
+ margin-top: 1.5rem;
989
+ font-size: var(--type-headline-small-size);
990
+ line-height: var(--type-headline-small-line-height);
991
+ font-weight: var(--type-headline-small-weight);
992
+ letter-spacing: var(--type-headline-small-tracking);
993
+ }
994
+ }
995
+
996
+ /* A part of a panel under a line (over the part's own margin and padding: a list, the facts). */
997
+ .block-panel > .block-panel-part {
998
+ margin-top: 1.25rem;
999
+ border-top: 1px solid var(--block-line);
1000
+ padding-top: 1.25rem;
1001
+ }
1002
+ /* Only on phones and tablets (a block a site shows beside the text on a computer). */
1003
+ @media (width >= 64rem) {
1004
+ .block-small-screens {
1005
+ display: none;
1006
+ }
1007
+ }
1008
+
1009
+ /* A person: a small picture beside the name and a title under it. */
1010
+ .block-person {
1011
+ display: flex;
1012
+ align-items: center;
1013
+ gap: 1rem;
1014
+ }
1015
+ .block-person-picture {
1016
+ width: 3.5rem;
1017
+ height: 3.5rem;
1018
+ flex-shrink: 0;
1019
+ border-radius: var(--block-radius-small);
1020
+ object-fit: cover;
1021
+ object-position: 50% 20%;
1022
+ }
1023
+ .block-person-name {
1024
+ display: block;
1025
+ font-size: var(--type-title-medium-size);
1026
+ line-height: var(--type-title-medium-line-height);
1027
+ font-weight: var(--type-title-medium-weight);
1028
+ letter-spacing: var(--type-title-medium-tracking);
1029
+ }
1030
+ .block-person-role {
1031
+ display: block;
1032
+ font-size: var(--type-body-medium-size);
1033
+ line-height: var(--type-body-medium-line-height);
1034
+ font-weight: var(--type-body-medium-weight);
1035
+ letter-spacing: var(--type-body-medium-tracking);
1036
+ color: var(--block-muted);
1037
+ }
1038
+
1039
+ /* A list with an icon in the accent before each line. */
1040
+ .block-icon-list {
1041
+ display: grid;
1042
+ gap: 0.6rem;
1043
+ margin: 0;
1044
+ padding: 0;
1045
+ list-style: none;
1046
+ font-size: var(--type-body-medium-size);
1047
+ line-height: var(--type-body-medium-line-height);
1048
+ font-weight: var(--type-body-medium-weight);
1049
+ letter-spacing: var(--type-body-medium-tracking);
1050
+ }
1051
+ .block-icon-list > li {
1052
+ display: flex;
1053
+ align-items: flex-start;
1054
+ gap: 0.75rem;
1055
+ }
1056
+ .block-icon-list svg {
1057
+ flex-shrink: 0;
1058
+ margin-top: 0.05rem;
1059
+ color: var(--block-accent);
1060
+ }
1061
+
1062
+ /* Facts side by side, each a quiet name over its value, the last one to the right (a duration and a
1063
+ price). */
1064
+ .block-facts {
1065
+ display: grid;
1066
+ grid-template-columns: 1fr auto;
1067
+ gap: 1rem;
1068
+ margin: 0;
1069
+ }
1070
+ .block-facts dt {
1071
+ font-size: var(--type-body-medium-size);
1072
+ line-height: var(--type-body-medium-line-height);
1073
+ font-weight: var(--type-body-medium-weight);
1074
+ letter-spacing: var(--type-body-medium-tracking);
1075
+ color: var(--block-muted);
1076
+ }
1077
+ .block-facts dd {
1078
+ margin: 0.15rem 0 0;
1079
+ font-weight: 500;
1080
+ }
1081
+ .block-facts > :last-child {
1082
+ text-align: right;
1083
+ }
1084
+ .block-facts-amount {
1085
+ font-size: var(--type-title-large-size);
1086
+ line-height: var(--type-title-large-line-height);
1087
+ font-weight: var(--type-title-large-weight);
1088
+ letter-spacing: var(--type-title-large-tracking);
1089
+ font-variant-numeric: tabular-nums;
1090
+ }
1091
+
1092
+ /* A table: quiet headings over rows with a thin line between them, the first column (each row's name) a little
1093
+ heavier; wider than the screen, it scrolls sideways ("Cookieliste"). */
1094
+ .block-table {
1095
+ overflow-x: auto;
1096
+ }
1097
+ .block-table table {
1098
+ width: 100%;
1099
+ min-width: 40rem;
1100
+ border-collapse: collapse;
1101
+ font-size: var(--type-body-medium-size);
1102
+ line-height: var(--type-body-medium-line-height);
1103
+ font-weight: var(--type-body-medium-weight);
1104
+ letter-spacing: var(--type-body-medium-tracking);
1105
+ }
1106
+ .block-table :is(th, td) {
1107
+ padding: 0.625rem 1rem 0.625rem 0;
1108
+ border-bottom: 1px solid var(--block-line);
1109
+ text-align: left;
1110
+ vertical-align: top;
1111
+ }
1112
+ .block-table thead th {
1113
+ font-size: var(--type-label-large-size);
1114
+ line-height: var(--type-label-large-line-height);
1115
+ font-weight: var(--type-label-large-weight);
1116
+ letter-spacing: var(--type-label-large-tracking);
1117
+ color: var(--block-muted);
1118
+ }
1119
+ .block-table tbody th {
1120
+ font-weight: 500;
1121
+ white-space: nowrap;
1122
+ }
1123
+ .block-table td:not(:nth-child(3)) {
1124
+ white-space: nowrap;
1125
+ }
1126
+ .block-table td:nth-child(3) {
1127
+ min-width: 14rem;
1128
+ }
1129
+
1130
+ /* A badge: a small word over a number in a light square ("Spar / 10%"), and a text beside one. */
1131
+ .block-badge {
1132
+ display: grid;
1133
+ width: 3.5rem;
1134
+ height: 3.5rem;
1135
+ flex-shrink: 0;
1136
+ place-content: center;
1137
+ border-radius: calc(var(--block-radius-small) - 0.25rem);
1138
+ background: var(--block-tint);
1139
+ color: var(--block-accent);
1140
+ text-align: center;
1141
+ line-height: 1.1;
1142
+ }
1143
+ .block-badge > span {
1144
+ font-size: var(--type-label-small-size);
1145
+ line-height: var(--type-label-small-line-height);
1146
+ font-weight: var(--type-label-small-weight);
1147
+ letter-spacing: var(--type-label-small-tracking);
1148
+ }
1149
+ .block-badge > strong {
1150
+ font-size: var(--type-title-medium-size);
1151
+ line-height: var(--type-title-medium-line-height);
1152
+ font-weight: var(--type-title-medium-weight);
1153
+ letter-spacing: var(--type-title-medium-tracking);
1154
+ font-variant-numeric: tabular-nums;
1155
+ }
1156
+ .block-with-badge {
1157
+ display: flex;
1158
+ align-items: flex-start;
1159
+ gap: 1rem;
1160
+ font-size: var(--type-body-medium-size);
1161
+ line-height: var(--type-body-medium-line-height);
1162
+ font-weight: var(--type-body-medium-weight);
1163
+ letter-spacing: var(--type-body-medium-tracking);
1164
+ }
1165
+ .block-with-badge > p {
1166
+ margin: 0;
1167
+ }
1168
+
1169
+ /* A quiet link that is one row, an outlined card (.card in ui.css) with smaller corners: a badge or an icon, a text
1170
+ and an arrow, its edge in the accent when pointed at. */
1171
+ .block-link-row {
1172
+ display: flex;
1173
+ align-items: center;
1174
+ gap: 1rem;
1175
+ --card-radius: var(--block-radius-small);
1176
+ --card-padding: 0.85rem 1.1rem 0.85rem 0.85rem;
1177
+ font-size: var(--type-body-large-size);
1178
+ line-height: var(--type-body-large-line-height);
1179
+ font-weight: var(--type-body-large-weight);
1180
+ letter-spacing: var(--type-body-large-tracking);
1181
+ transition: box-shadow var(--motion-effects);
1182
+ }
1183
+ .block-link-row.block-in-text {
1184
+ margin-block: 1.75rem;
1185
+ }
1186
+ .block-link-row-text {
1187
+ flex: 1;
1188
+ }
1189
+ .block-link-row-arrow {
1190
+ flex-shrink: 0;
1191
+ color: var(--block-accent);
1192
+ transition: transform var(--motion-spatial);
1193
+ }
1194
+ a.block-link-row:hover {
1195
+ --card-outlined-line: var(--block-accent);
1196
+ }
1197
+ a.block-link-row:hover .block-link-row-arrow {
1198
+ transform: translateX(3px);
1199
+ }
1200
+
1201
+ /* An invitation, a filled card (.card in ui.css): a picture, a heading and a text, and buttons under each other
1202
+ (e.g. an app's booking block); on a computer the three side by side. */
1203
+ .block-cta {
1204
+ display: grid;
1205
+ gap: 1.5rem;
1206
+ }
1207
+ .block-cta.block-in-text {
1208
+ margin-block: 2.5rem;
1209
+ }
1210
+ .block-cta-picture {
1211
+ width: 5rem;
1212
+ height: 5rem;
1213
+ border-radius: var(--block-radius-small);
1214
+ object-fit: cover;
1215
+ object-position: 50% 20%;
1216
+ }
1217
+ .block-cta-title {
1218
+ margin: 0;
1219
+ font-size: var(--type-headline-small-size);
1220
+ line-height: var(--type-headline-small-line-height);
1221
+ font-weight: var(--type-headline-small-weight);
1222
+ letter-spacing: var(--type-headline-small-tracking);
1223
+ }
1224
+ .block-cta-text {
1225
+ margin-top: 0.5rem;
1226
+ max-width: 48ch;
1227
+ color: var(--block-muted);
1228
+ }
1229
+ .block-cta-buttons {
1230
+ display: grid;
1231
+ gap: 0.625rem;
1232
+ }
1233
+
1234
+ /* Prices: the big ones as cards side by side, and the others as a list, a row each with the name and
1235
+ its details to the left and the price to the right, with a text under it. */
1236
+ .block-prices {
1237
+ display: grid;
1238
+ gap: 1rem;
1239
+ }
1240
+ .block-prices.block-in-text {
1241
+ margin-block: 2.5rem;
1242
+ }
1243
+ .block-price-cards {
1244
+ display: grid;
1245
+ gap: 1rem;
1246
+ }
1247
+ /* A big price, an elevated card (.card in ui.css). */
1248
+ .block-price-card {
1249
+ display: flex;
1250
+ flex-direction: column;
1251
+ }
1252
+ .block-price-card-head {
1253
+ display: flex;
1254
+ align-items: flex-start;
1255
+ justify-content: space-between;
1256
+ gap: 1rem;
1257
+ }
1258
+ .block-price-card-title {
1259
+ margin: 0;
1260
+ font-size: var(--type-headline-small-size);
1261
+ line-height: var(--type-headline-small-line-height);
1262
+ font-weight: var(--type-headline-small-weight);
1263
+ letter-spacing: var(--type-headline-small-tracking);
1264
+ }
1265
+ /* A small fact in a light pill (the duration), its icon in the accent. */
1266
+ .block-tag {
1267
+ display: inline-flex;
1268
+ flex-shrink: 0;
1269
+ align-items: center;
1270
+ gap: 0.375rem;
1271
+ margin-top: 0.25rem;
1272
+ border-radius: var(--block-control-radius);
1273
+ background: var(--block-tint);
1274
+ padding: 0.25rem 0.75rem;
1275
+ font-size: var(--type-label-large-size);
1276
+ line-height: var(--type-label-large-line-height);
1277
+ font-weight: var(--type-label-large-weight);
1278
+ letter-spacing: var(--type-label-large-tracking);
1279
+ }
1280
+ .block-tag svg {
1281
+ color: var(--block-accent);
1282
+ }
1283
+ .block-price-amount {
1284
+ margin-top: 1.5rem;
1285
+ font-size: var(--type-display-medium-size);
1286
+ line-height: var(--type-display-medium-line-height);
1287
+ font-weight: var(--type-display-medium-weight);
1288
+ letter-spacing: var(--type-display-medium-tracking);
1289
+ font-variant-numeric: tabular-nums;
1290
+ }
1291
+ .block-price-unit {
1292
+ margin-top: 0.25rem;
1293
+ color: var(--block-muted);
1294
+ }
1295
+ /* A punch card's offer in a price card, a filled card with smaller corners. */
1296
+ .block-price-extra {
1297
+ margin-top: 1.5rem;
1298
+ --card-radius: var(--block-radius-small);
1299
+ --card-padding: 1rem;
1300
+ }
1301
+ .block-price-extra-title {
1302
+ display: flex;
1303
+ align-items: center;
1304
+ gap: 0.5rem;
1305
+ font-weight: 500;
1306
+ }
1307
+ .block-price-extra-title svg {
1308
+ color: var(--block-accent);
1309
+ }
1310
+ .block-price-extra-text {
1311
+ margin-top: 0.25rem;
1312
+ color: var(--block-muted);
1313
+ }
1314
+ .block-price-extra-text strong {
1315
+ color: var(--block-text);
1316
+ font-weight: 500;
1317
+ font-variant-numeric: tabular-nums;
1318
+ }
1319
+ .block-price-card > .block-arrow-link {
1320
+ align-self: flex-start;
1321
+ margin-top: 1.5rem;
1322
+ }
1323
+ .block-price-list {
1324
+ margin: 0;
1325
+ border: 1px solid var(--block-line);
1326
+ border-radius: var(--block-radius);
1327
+ padding: 0 1.5rem;
1328
+ list-style: none;
1329
+ }
1330
+ .block-price-row {
1331
+ display: grid;
1332
+ gap: 0.25rem 1.5rem;
1333
+ padding-block: 1.25rem;
1334
+ }
1335
+ .block-price-row + .block-price-row {
1336
+ border-top: 1px solid var(--block-line);
1337
+ }
1338
+ .block-price-row-name {
1339
+ font-size: var(--type-title-medium-size);
1340
+ line-height: var(--type-title-medium-line-height);
1341
+ font-weight: var(--type-title-medium-weight);
1342
+ letter-spacing: var(--type-title-medium-tracking);
1343
+ color: inherit;
1344
+ text-decoration: none;
1345
+ }
1346
+ a.block-price-row-name:hover {
1347
+ color: var(--block-accent);
1348
+ }
1349
+ .block-price-row-text {
1350
+ font-size: var(--type-body-medium-size);
1351
+ line-height: var(--type-body-medium-line-height);
1352
+ font-weight: var(--type-body-medium-weight);
1353
+ letter-spacing: var(--type-body-medium-tracking);
1354
+ color: var(--block-muted);
1355
+ }
1356
+ .block-price-row-note {
1357
+ margin-top: 0.25rem;
1358
+ max-width: 60ch;
1359
+ font-size: var(--type-body-medium-size);
1360
+ line-height: var(--type-body-medium-line-height);
1361
+ font-weight: var(--type-body-medium-weight);
1362
+ letter-spacing: var(--type-body-medium-tracking);
1363
+ color: var(--block-muted);
1364
+ }
1365
+ .block-price-row-price {
1366
+ font-size: var(--type-headline-small-size);
1367
+ line-height: var(--type-headline-small-line-height);
1368
+ font-weight: var(--type-headline-small-weight);
1369
+ letter-spacing: var(--type-headline-small-tracking);
1370
+ font-variant-numeric: tabular-nums;
1371
+ }
1372
+ .block-price-row-price > span {
1373
+ display: block;
1374
+ font-size: var(--type-body-medium-size);
1375
+ line-height: var(--type-body-medium-line-height);
1376
+ font-weight: var(--type-body-medium-weight);
1377
+ letter-spacing: var(--type-body-medium-tracking);
1378
+ color: var(--block-muted);
1379
+ }
1380
+ /* A quiet text with an icon before it (the terms under the prices). */
1381
+ .block-terms {
1382
+ display: flex;
1383
+ gap: 0.625rem;
1384
+ margin-top: 1rem;
1385
+ max-width: 70ch;
1386
+ font-size: var(--type-body-medium-size);
1387
+ line-height: var(--type-body-medium-line-height);
1388
+ font-weight: var(--type-body-medium-weight);
1389
+ letter-spacing: var(--type-body-medium-tracking);
1390
+ color: var(--block-muted);
1391
+ }
1392
+ .block-terms svg {
1393
+ flex-shrink: 0;
1394
+ margin-top: 0.125rem;
1395
+ }
1396
+
1397
+ @media (hover: hover) {
1398
+ a.block-card:hover {
1399
+ --card-outlined-line: var(--block-accent);
1400
+ }
1401
+ a.block-card:hover .block-card-arrow {
1402
+ translate: 0.25rem 0;
1403
+ }
1404
+ a.block-card:hover .block-card-picture img {
1405
+ scale: 1.03;
1406
+ }
1407
+ }
1408
+ @media (width >= 40rem) {
1409
+ .block-buttons {
1410
+ flex-direction: row;
1411
+ flex-wrap: wrap;
1412
+ }
1413
+ .block-cards {
1414
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1415
+ }
1416
+ .block-price-row {
1417
+ grid-template-columns: 1fr auto;
1418
+ }
1419
+ .block-price-row-price {
1420
+ text-align: right;
1421
+ }
1422
+ }
1423
+ @media (width >= 48rem) {
1424
+ .block-testimonial {
1425
+ --card-padding: 1.75rem;
1426
+ }
1427
+ .block-row-text {
1428
+ font-size: var(--type-body-large-size);
1429
+ line-height: var(--type-body-large-line-height);
1430
+ font-weight: var(--type-body-large-weight);
1431
+ letter-spacing: var(--type-body-large-tracking);
1432
+ }
1433
+ .block-notice {
1434
+ padding: 1.25rem 1.5rem;
1435
+ }
1436
+ .block-accordion-label {
1437
+ padding-inline: 2rem;
1438
+ font-size: var(--type-title-medium-size);
1439
+ line-height: var(--type-title-medium-line-height);
1440
+ font-weight: var(--type-title-medium-weight);
1441
+ letter-spacing: var(--type-title-medium-tracking);
1442
+ }
1443
+ .block-accordion-body {
1444
+ padding: 0 2rem 2rem;
1445
+ }
1446
+ .block-accordion-answer {
1447
+ font-size: var(--type-body-large-size);
1448
+ line-height: var(--type-body-large-line-height);
1449
+ font-weight: var(--type-body-large-weight);
1450
+ letter-spacing: var(--type-body-large-tracking);
1451
+ }
1452
+ .block-cta {
1453
+ grid-template-columns: repeat(12, minmax(0, 1fr));
1454
+ align-items: center;
1455
+ gap: 2.5rem;
1456
+ --card-padding: 3rem;
1457
+ }
1458
+ .block-cta-picture {
1459
+ grid-column: span 2;
1460
+ width: 7rem;
1461
+ height: 7rem;
1462
+ }
1463
+ .block-cta-body {
1464
+ grid-column: span 6;
1465
+ }
1466
+ .block-cta-buttons {
1467
+ grid-column: span 4;
1468
+ }
1469
+ .block-cta-title {
1470
+ font-size: var(--type-headline-medium-size);
1471
+ line-height: var(--type-headline-medium-line-height);
1472
+ font-weight: var(--type-headline-medium-weight);
1473
+ letter-spacing: var(--type-headline-medium-tracking);
1474
+ }
1475
+ .block-prices,
1476
+ .block-price-cards {
1477
+ gap: 1.25rem;
1478
+ }
1479
+ .block-price-cards {
1480
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1481
+ }
1482
+ .block-price-card {
1483
+ --card-padding: 2rem;
1484
+ }
1485
+ .block-price-card-title {
1486
+ font-size: var(--type-headline-medium-size);
1487
+ line-height: var(--type-headline-medium-line-height);
1488
+ font-weight: var(--type-headline-medium-weight);
1489
+ letter-spacing: var(--type-headline-medium-tracking);
1490
+ }
1491
+ .block-price-amount {
1492
+ font-size: var(--type-display-large-size);
1493
+ line-height: var(--type-display-large-line-height);
1494
+ font-weight: var(--type-display-large-weight);
1495
+ letter-spacing: var(--type-display-large-tracking);
1496
+ }
1497
+ .block-price-list {
1498
+ padding-inline: 2rem;
1499
+ }
1500
+ }
1501
+ /* ---- "Tjekliste" and "Priskort" ---- */
1502
+
1503
+ /* "Tjekliste" (checklist/Checks.tsx), and what is included on a price card: a list without dividers (.list in
1504
+ ui.css), a check before each line; with six or more (not on a card), two columns where there is room for 16rem
1505
+ each, never more. Nothing in it is tapped, so it is spaced as a bulleted or numbered list in the text (half a
1506
+ line between its lines, not the height of a list item one taps), and its checks start where the text around it
1507
+ does. */
1508
+ .block-checklist {
1509
+ --list-item-min-height: auto;
1510
+ --list-item-padding-block: 0.25em;
1511
+ --list-item-padding-inline: 0;
1512
+ }
1513
+ .block-checklist.block-in-text {
1514
+ margin-block: 1rem;
1515
+ }
1516
+ .block-checklist:not(.block-plan-features):has(> :nth-child(6)) {
1517
+ display: grid;
1518
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, max(16rem, calc(50% - 1rem))), 1fr));
1519
+ column-gap: 2rem;
1520
+ }
1521
+
1522
+ /* "Priskort" (pricecards/View.tsx): the cards side by side, as many columns as there are cards where the block has
1523
+ room for them (it is a container: two from 34rem, three from 40rem, four from 56rem; four two by two before that),
1524
+ else under each other. Each card an outlined card (.card in ui.css): its name, its price large with what it is for
1525
+ beside it, its text, what is included under a line (.block-checklist) and its button at the bottom in the card's
1526
+ width, so the buttons of cards side by side are in line; the highlighted one with an edge in the accent and its
1527
+ label in a pill in the accent over its name. */
1528
+ .block-plans {
1529
+ container-type: inline-size;
1530
+ }
1531
+ .block-plans.block-in-text {
1532
+ margin-block: 2.5rem;
1533
+ }
1534
+ .block-plans-list {
1535
+ display: grid;
1536
+ gap: 1rem;
1537
+ margin: 0;
1538
+ padding: 0;
1539
+ list-style: none;
1540
+ }
1541
+ @container (width >= 34rem) {
1542
+ .block-plans-2,
1543
+ .block-plans-4 {
1544
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1545
+ }
1546
+ }
1547
+ @container (width >= 40rem) {
1548
+ .block-plans-3 {
1549
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1550
+ }
1551
+ }
1552
+ @container (width >= 56rem) {
1553
+ .block-plans-4 {
1554
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1555
+ }
1556
+ }
1557
+ .block-plan {
1558
+ display: flex;
1559
+ flex-direction: column;
1560
+ color: var(--block-text);
1561
+ /* The price is as large as the card has room for (cqi). */
1562
+ container-type: inline-size;
1563
+ }
1564
+ .block-plan-featured {
1565
+ box-shadow: inset 0 0 0 2px var(--block-accent);
1566
+ }
1567
+ .block-plan-badge {
1568
+ align-self: flex-start;
1569
+ margin-bottom: 0.75rem;
1570
+ border-radius: var(--block-control-radius);
1571
+ background: var(--block-accent);
1572
+ color: var(--block-on-accent);
1573
+ padding: 0.25rem 0.75rem;
1574
+ font-size: var(--type-label-medium-size);
1575
+ line-height: var(--type-label-medium-line-height);
1576
+ font-weight: var(--type-label-medium-weight);
1577
+ letter-spacing: var(--type-label-medium-tracking);
1578
+ }
1579
+ .block-plan-name {
1580
+ margin: 0;
1581
+ font-size: var(--type-title-large-size);
1582
+ line-height: var(--type-title-large-line-height);
1583
+ font-weight: var(--type-title-large-weight);
1584
+ letter-spacing: var(--type-title-large-tracking);
1585
+ }
1586
+ .block-plan-price {
1587
+ display: flex;
1588
+ flex-wrap: wrap;
1589
+ align-items: baseline;
1590
+ gap: 0.25rem 0.5rem;
1591
+ margin: 1rem 0 0;
1592
+ }
1593
+ .block-plan-amount {
1594
+ font-size: clamp(var(--type-headline-small-size), 16cqi, var(--type-display-small-size));
1595
+ line-height: var(--type-headline-large-line-height);
1596
+ font-weight: var(--type-headline-large-weight);
1597
+ letter-spacing: var(--type-headline-large-tracking);
1598
+ font-variant-numeric: tabular-nums;
1599
+ }
1600
+ .block-plan-unit {
1601
+ color: var(--block-muted);
1602
+ }
1603
+ .block-plan-text {
1604
+ margin: 0.75rem 0 0;
1605
+ color: var(--block-muted);
1606
+ }
1607
+ .block-plan-features {
1608
+ margin-top: 1.5rem;
1609
+ border-top: 1px solid var(--block-line);
1610
+ padding-top: 0.5rem;
1611
+ }
1612
+ .block-buttons.block-plan-buttons {
1613
+ flex-direction: column;
1614
+ margin-top: auto;
1615
+ padding-top: 1.5rem;
1616
+ }
1617
+ /* A narrow card: a long text on its button goes onto two lines rather than out of the card. */
1618
+ .block-plan-buttons .button {
1619
+ padding-block: 0.75rem;
1620
+ padding-inline: 1rem;
1621
+ white-space: normal;
1622
+ text-align: center;
1623
+ line-height: 1.25;
1624
+ }
1625
+
1626
+ /* ---- end of "Tjekliste" and "Priskort" ---- */
1627
+
1628
+ /* Opening and closing glide where the browser can animate ::details-content (else the script in
1629
+ Accordion.tsx does it); none with reduced motion. */
1630
+ @media (prefers-reduced-motion: no-preference) {
1631
+ .block-accordion {
1632
+ interpolate-size: allow-keywords;
1633
+ }
1634
+ .block-accordion-row::details-content {
1635
+ block-size: 0;
1636
+ overflow-y: clip;
1637
+ transition:
1638
+ block-size var(--motion-spatial),
1639
+ content-visibility var(--motion-spatial-duration) allow-discrete;
1640
+ }
1641
+ .block-accordion-row[open]::details-content {
1642
+ block-size: auto;
1643
+ }
1644
+ }
1645
+ @media (prefers-reduced-motion: reduce) {
1646
+ .block-accordion-label,
1647
+ .block-accordion-icon,
1648
+ .block-card,
1649
+ .block-card-arrow,
1650
+ .block-card-picture img {
1651
+ transition: none;
1652
+ }
1653
+ }
1654
+ }
1655
+
1656
+ /* "Video": the video before it is played (video/, packages/editor/lib/video.mjs); the video takes its
1657
+ place. Outside the layers, as it is a link in the text's style (.prose), whose link style it undoes. */
1658
+ .prose .video-facade {
1659
+ display: flex;
1660
+ flex-direction: column;
1661
+ align-items: center;
1662
+ justify-content: center;
1663
+ gap: 0.5rem;
1664
+ width: 100%;
1665
+ aspect-ratio: 16 / 9;
1666
+ margin-block: 2em;
1667
+ padding: 1.5rem;
1668
+ border-radius: var(--block-radius);
1669
+ background: var(--block-tint);
1670
+ color: var(--block-text);
1671
+ text-align: center;
1672
+ text-decoration: none;
1673
+ }
1674
+ .prose .video-facade svg {
1675
+ color: var(--block-accent);
1676
+ transition: transform var(--motion-spatial);
1677
+ }
1678
+ .prose .video-facade:hover svg {
1679
+ transform: scale(1.08);
1680
+ }
1681
+ /* At most two lines; a longer title ends with "…" (the whole title is still the link's name). */
1682
+ .video-facade-title {
1683
+ display: -webkit-box;
1684
+ max-width: 40ch;
1685
+ overflow: hidden;
1686
+ font-size: var(--type-title-medium-size);
1687
+ line-height: var(--type-title-medium-line-height);
1688
+ font-weight: var(--type-title-medium-weight);
1689
+ letter-spacing: var(--type-title-medium-tracking);
1690
+ -webkit-box-orient: vertical;
1691
+ -webkit-line-clamp: 2;
1692
+ line-clamp: 2;
1693
+ }
1694
+ /* With a still from the video (packages/editor/scripts/video-thumbnails.mjs), as on YouTube: the still fills the
1695
+ box, the white play button in the middle of the box (not of the space above the title), the title
1696
+ at the bottom over a shade. */
1697
+ .prose .video-facade-still {
1698
+ position: relative;
1699
+ isolation: isolate;
1700
+ overflow: hidden;
1701
+ align-items: flex-start;
1702
+ justify-content: flex-end;
1703
+ gap: 0.25rem;
1704
+ padding: 1rem 1.25rem;
1705
+ background: #000;
1706
+ color: #fff;
1707
+ text-align: left;
1708
+ }
1709
+ .prose .video-facade-still::after {
1710
+ content: '';
1711
+ position: absolute;
1712
+ inset: 0;
1713
+ z-index: -1;
1714
+ background: linear-gradient(to bottom, rgb(0 0 0 / 0.15) 40%, rgb(0 0 0 / 0.75));
1715
+ }
1716
+ .prose .video-facade-still .video-facade-image {
1717
+ position: absolute;
1718
+ inset: 0;
1719
+ z-index: -2;
1720
+ width: 100%;
1721
+ height: 100%;
1722
+ margin: 0;
1723
+ object-fit: cover;
1724
+ }
1725
+ .prose .video-facade-still svg {
1726
+ position: absolute;
1727
+ inset: 0;
1728
+ margin: auto;
1729
+ color: #fff;
1730
+ filter: drop-shadow(0 2px 8px rgb(0 0 0 / 0.5));
1731
+ }
1732
+ .video-facade-still .video-facade-title {
1733
+ font-size: var(--type-title-small-size);
1734
+ line-height: var(--type-title-small-line-height);
1735
+ font-weight: var(--type-title-small-weight);
1736
+ letter-spacing: var(--type-title-small-tracking);
1737
+ color: #fff;
1738
+ text-shadow: 0 1px 3px rgb(0 0 0 / 0.8);
1739
+ }
1740
+ @media (min-width: 768px) {
1741
+ .prose .video-facade-still svg {
1742
+ width: 4.5rem;
1743
+ height: 4.5rem;
1744
+ }
1745
+ .video-facade-still .video-facade-title {
1746
+ font-size: var(--type-title-medium-size);
1747
+ line-height: var(--type-title-medium-line-height);
1748
+ font-weight: var(--type-title-medium-weight);
1749
+ letter-spacing: var(--type-title-medium-tracking);
1750
+ }
1751
+ }
1752
+
1753
+ /* A block's head with a label above its heading or a subheading under it (BlockHead.tsx in blocks/, an <hgroup>; only a
1754
+ heading is the text's own <h2>, without this): the label in small capitals, spaced out, in the accent; the
1755
+ subheading larger and quiet. Mostly in the text's style (.prose), so outside the layers, like the video above, whose
1756
+ margins it sets in place of the text's; a theme that places a block outside the text sets its own (.block-place in
1757
+ the standard theme). A theme gives it its own look outside the layers too (the standard theme: in the middle). */
1758
+ .block-head {
1759
+ margin-block: 2.5em 1.25em;
1760
+ }
1761
+ .block-head:first-child {
1762
+ margin-top: 0;
1763
+ }
1764
+ .block-head > h2,
1765
+ .block-head > .block-eyebrow,
1766
+ .block-head > .block-subheading {
1767
+ margin-block: 0;
1768
+ }
1769
+ .block-head > * + h2,
1770
+ .block-head > * + .block-subheading {
1771
+ margin-top: 0.75rem;
1772
+ }
1773
+ .block-head > .block-eyebrow + h2 {
1774
+ margin-top: 0.5rem;
1775
+ }
1776
+ .block-head > .block-eyebrow {
1777
+ font-size: var(--type-label-medium-size);
1778
+ line-height: var(--type-label-medium-line-height);
1779
+ font-weight: var(--type-label-medium-weight);
1780
+ letter-spacing: 0.12em;
1781
+ text-transform: uppercase;
1782
+ color: var(--block-accent);
1783
+ }
1784
+ .block-head > .block-subheading {
1785
+ font-size: var(--type-title-large-size);
1786
+ line-height: var(--type-title-large-line-height);
1787
+ font-weight: var(--type-title-large-weight);
1788
+ letter-spacing: var(--type-title-large-tracking);
1789
+ color: var(--block-muted);
1790
+ }
1791
+
1792
+ /* A word or more in one of the site's colours, in a text (packages/editor/lib/text-colors.mjs, the colour button in the
1793
+ editor): the accent, or the quiet text's, both readable on the background, the surfaces and the tint (the site's
1794
+ pairs of colours, checked under "Farver"). Bold, italic and a link in it have its colour. Outside the layers, as it
1795
+ is in the text's style (.prose), whose colours of bold text and links it goes over. On a picture behind a hero's
1796
+ text, where only the text's colour can be read, it is the text's. */
1797
+ .color-accent,
1798
+ .color-accent :is(strong, em, a) {
1799
+ color: var(--block-accent);
1800
+ }
1801
+ .color-muted,
1802
+ .color-muted :is(strong, em, a) {
1803
+ color: var(--block-muted);
1804
+ }
1805
+ .block-hero-behind :is(.color-accent, .color-muted),
1806
+ .block-hero-behind :is(.color-accent, .color-muted) :is(strong, em, a) {
1807
+ color: inherit;
1808
+ }