@morphemecms/cms 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1106) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -3
  3. package/astro.d.mts +2 -0
  4. package/astro.mjs +162 -0
  5. package/bin/morpheme.mjs +38 -0
  6. package/client.d.ts +10 -0
  7. package/defaults/blockTexts.ts +33 -0
  8. package/defaults/collections.ts +774 -0
  9. package/defaults/colors.ts +125 -0
  10. package/defaults/company.ts +20 -0
  11. package/defaults/editor.ts +178 -0
  12. package/defaults/internalLinks.ts +30 -0
  13. package/defaults/opens.ts +18 -0
  14. package/defaults/popup.tsx +93 -0
  15. package/defaults/privacy.ts +79 -0
  16. package/defaults/rules.ts +450 -0
  17. package/defaults/schema.ts +16 -0
  18. package/defaults/sitedata.ts +129 -0
  19. package/defaults/standard.ts +106 -0
  20. package/defaults/standardPages.ts +87 -0
  21. package/defaults/texts.ts +481 -0
  22. package/demo/README.md +26 -0
  23. package/demo/public/apple-touch-icon.png +0 -0
  24. package/demo/public/editor/apple-touch-icon.png +0 -0
  25. package/demo/public/editor/icon-192.png +0 -0
  26. package/demo/public/editor/icon-512.png +0 -0
  27. package/demo/public/editor/icon-maskable-512.png +0 -0
  28. package/demo/public/favicon.ico +0 -0
  29. package/demo/public/favicon.svg +1 -0
  30. package/demo/public/images/uploads/2026/10/andromeda.webp +0 -0
  31. package/demo/public/images/uploads/2026/10/earth-from-space.webp +0 -0
  32. package/demo/public/images/uploads/2026/10/editor-blog.webp +0 -0
  33. package/demo/public/images/uploads/2026/10/editor-colors.webp +0 -0
  34. package/demo/public/images/uploads/2026/10/editor-home.webp +0 -0
  35. package/demo/public/images/uploads/2026/10/editor-page.webp +0 -0
  36. package/demo/public/images/uploads/2026/10/editor-pages.webp +0 -0
  37. package/demo/public/images/uploads/2026/10/editor-seo.webp +0 -0
  38. package/demo/public/images/uploads/2026/10/editor-start.webp +0 -0
  39. package/demo/public/images/uploads/2026/10/editor-themes.webp +0 -0
  40. package/demo/public/images/uploads/2026/10/moon.webp +0 -0
  41. package/demo/public/images/uploads/2026/10/saturn.webp +0 -0
  42. package/demo/public/logo.svg +1 -0
  43. package/demo/src/content/blog/build-a-page-from-blocks.md +19 -0
  44. package/demo/src/content/blog/colors-everyone-can-read.md +19 -0
  45. package/demo/src/content/blog/edit-your-website-from-your-phone.md +21 -0
  46. package/demo/src/content/blog/every-save-is-a-version.md +21 -0
  47. package/demo/src/content/blog/schedule-a-post.md +17 -0
  48. package/demo/src/content/blog/secure-from-day-one.md +17 -0
  49. package/demo/src/content/blog/seo-without-the-guesswork.md +23 -0
  50. package/demo/src/content/blog/switch-themes-without-losing-anything.md +23 -0
  51. package/demo/src/content/blog/the-app-store.md +21 -0
  52. package/demo/src/content/pages/about.md +22 -0
  53. package/demo/src/content/pages/app-store.md +30 -0
  54. package/demo/src/content/pages/blocks.md +98 -0
  55. package/demo/src/content/pages/blog-page.md +11 -0
  56. package/demo/src/content/pages/contact.md +16 -0
  57. package/demo/src/content/pages/get-started.md +20 -0
  58. package/demo/src/content/pages/home.md +26 -0
  59. package/demo/src/content/pages/page-not-found.md +11 -0
  60. package/demo/src/content/pages/privacy-policy.md +24 -0
  61. package/demo/src/data/blocks.json +25 -0
  62. package/demo/src/data/booking.json +6 -0
  63. package/demo/src/data/categories/apps.json +6 -0
  64. package/demo/src/data/categories/design.json +6 -0
  65. package/demo/src/data/categories/editing.json +6 -0
  66. package/demo/src/data/categories/security.json +6 -0
  67. package/demo/src/data/categories/seo.json +6 -0
  68. package/demo/src/data/colors.json +75 -0
  69. package/demo/src/data/contact.json +8 -0
  70. package/demo/src/data/cookies.json +21 -0
  71. package/demo/src/data/footer.json +27 -0
  72. package/demo/src/data/menu.json +35 -0
  73. package/demo/src/data/mobile-menu.json +25 -0
  74. package/demo/src/data/popups/booking-bar.json +13 -0
  75. package/demo/src/data/popups/try-the-editor.json +16 -0
  76. package/demo/src/data/standard-pages.json +8 -0
  77. package/demo/src/data/testimonials/sample-bakery.json +10 -0
  78. package/demo/src/data/testimonials/sample-clinic.json +10 -0
  79. package/demo/src/data/testimonials/sample-studio.json +10 -0
  80. package/demo/src/site/colors.ts +11 -0
  81. package/demo/src/site/config.ts +19 -0
  82. package/icons/lucide/LICENSE +43 -0
  83. package/icons/lucide/LICENSE-material-design-icons +20 -0
  84. package/icons/lucide/address-book.svg +1 -0
  85. package/icons/lucide/app-window.svg +1 -0
  86. package/icons/lucide/arrow-counter-clockwise.svg +1 -0
  87. package/icons/lucide/arrow-down.svg +1 -0
  88. package/icons/lucide/arrow-left.svg +1 -0
  89. package/icons/lucide/arrow-right.svg +1 -0
  90. package/icons/lucide/arrow-square-out.svg +1 -0
  91. package/icons/lucide/arrow-u-up-left.svg +1 -0
  92. package/icons/lucide/arrow-u-up-right.svg +1 -0
  93. package/icons/lucide/arrow-up-right.svg +1 -0
  94. package/icons/lucide/arrow-up.svg +1 -0
  95. package/icons/lucide/arrows-down-up.svg +1 -0
  96. package/icons/lucide/arrows-in-line-horizontal.svg +1 -0
  97. package/icons/lucide/arrows-out-line-horizontal.svg +1 -0
  98. package/icons/lucide/article.svg +1 -0
  99. package/icons/lucide/bank.svg +1 -0
  100. package/icons/lucide/bell.svg +1 -0
  101. package/icons/lucide/bicycle.svg +1 -0
  102. package/icons/lucide/binoculars.svg +1 -0
  103. package/icons/lucide/book-open-text.svg +1 -0
  104. package/icons/lucide/book-open.svg +1 -0
  105. package/icons/lucide/browser.svg +1 -0
  106. package/icons/lucide/buildings.svg +1 -0
  107. package/icons/lucide/bus.svg +1 -0
  108. package/icons/lucide/calendar-blank.svg +1 -0
  109. package/icons/lucide/calendar-check.svg +1 -0
  110. package/icons/lucide/car.svg +1 -0
  111. package/icons/lucide/cards.svg +1 -0
  112. package/icons/lucide/caret-down.svg +1 -0
  113. package/icons/lucide/caret-left.svg +1 -0
  114. package/icons/lucide/caret-right.svg +1 -0
  115. package/icons/lucide/caret-up.svg +1 -0
  116. package/icons/lucide/certificate.svg +1 -0
  117. package/icons/lucide/chart-line-up.svg +1 -0
  118. package/icons/lucide/chats.svg +1 -0
  119. package/icons/lucide/check-circle.svg +1 -0
  120. package/icons/lucide/check.svg +1 -0
  121. package/icons/lucide/circle-half.svg +1 -0
  122. package/icons/lucide/circle.svg +1 -0
  123. package/icons/lucide/clock-counter-clockwise.svg +1 -0
  124. package/icons/lucide/clock.svg +1 -0
  125. package/icons/lucide/code.svg +1 -0
  126. package/icons/lucide/coffee.svg +1 -0
  127. package/icons/lucide/columns.svg +1 -0
  128. package/icons/lucide/cookie.svg +1 -0
  129. package/icons/lucide/copy.svg +1 -0
  130. package/icons/lucide/credit-card.svg +1 -0
  131. package/icons/lucide/currency-circle-dollar.svg +1 -0
  132. package/icons/lucide/cursor-click.svg +1 -0
  133. package/icons/lucide/database.svg +1 -0
  134. package/icons/lucide/desktop.svg +1 -0
  135. package/icons/lucide/device-mobile.svg +1 -0
  136. package/icons/lucide/door-open.svg +1 -0
  137. package/icons/lucide/download-simple.svg +1 -0
  138. package/icons/lucide/envelope-simple.svg +1 -0
  139. package/icons/lucide/eye-slash.svg +1 -0
  140. package/icons/lucide/eye.svg +1 -0
  141. package/icons/lucide/file-pdf.svg +1 -0
  142. package/icons/lucide/file-text.svg +1 -0
  143. package/icons/lucide/file-video.svg +1 -0
  144. package/icons/lucide/file-zip.svg +1 -0
  145. package/icons/lucide/flower-lotus.svg +1 -0
  146. package/icons/lucide/folder-simple.svg +1 -0
  147. package/icons/lucide/funnel.svg +1 -0
  148. package/icons/lucide/gauge.svg +1 -0
  149. package/icons/lucide/gear.svg +1 -0
  150. package/icons/lucide/github-logo.svg +1 -0
  151. package/icons/lucide/globe.svg +1 -0
  152. package/icons/lucide/google-logo.svg +1 -0
  153. package/icons/lucide/graduation-cap.svg +1 -0
  154. package/icons/lucide/hammer.svg +1 -0
  155. package/icons/lucide/hand-heart.svg +1 -0
  156. package/icons/lucide/handshake.svg +1 -0
  157. package/icons/lucide/hard-drives.svg +1 -0
  158. package/icons/lucide/heart.svg +1 -0
  159. package/icons/lucide/house.svg +1 -0
  160. package/icons/lucide/image-square.svg +1 -0
  161. package/icons/lucide/image.svg +1 -0
  162. package/icons/lucide/info.svg +1 -0
  163. package/icons/lucide/keyboard.svg +1 -0
  164. package/icons/lucide/leaf.svg +1 -0
  165. package/icons/lucide/lifebuoy.svg +1 -0
  166. package/icons/lucide/lightbulb.svg +1 -0
  167. package/icons/lucide/link-break.svg +1 -0
  168. package/icons/lucide/link-simple.svg +1 -0
  169. package/icons/lucide/list-bullets.svg +1 -0
  170. package/icons/lucide/list-checks.svg +1 -0
  171. package/icons/lucide/list-numbers.svg +1 -0
  172. package/icons/lucide/list.svg +1 -0
  173. package/icons/lucide/lock-simple-open.svg +1 -0
  174. package/icons/lucide/lock-simple.svg +1 -0
  175. package/icons/lucide/magnifying-glass.svg +1 -0
  176. package/icons/lucide/map-pin.svg +1 -0
  177. package/icons/lucide/map-trifold.svg +1 -0
  178. package/icons/lucide/medal.svg +1 -0
  179. package/icons/lucide/megaphone.svg +1 -0
  180. package/icons/lucide/minus.svg +1 -0
  181. package/icons/lucide/moon.svg +1 -0
  182. package/icons/lucide/newspaper.svg +1 -0
  183. package/icons/lucide/pack.json +23 -0
  184. package/icons/lucide/paint-brush-broad.svg +1 -0
  185. package/icons/lucide/palette.svg +1 -0
  186. package/icons/lucide/paper-plane-tilt.svg +1 -0
  187. package/icons/lucide/pencil-simple.svg +1 -0
  188. package/icons/lucide/phone.svg +1 -0
  189. package/icons/lucide/play-fill.svg +1 -0
  190. package/icons/lucide/plus.svg +1 -0
  191. package/icons/lucide/prohibit.svg +1 -0
  192. package/icons/lucide/puzzle-piece.svg +1 -0
  193. package/icons/lucide/question.svg +1 -0
  194. package/icons/lucide/quotes.svg +1 -0
  195. package/icons/lucide/rows.svg +1 -0
  196. package/icons/lucide/ruler.svg +1 -0
  197. package/icons/lucide/scan.svg +1 -0
  198. package/icons/lucide/shapes.svg +1 -0
  199. package/icons/lucide/share-network.svg +1 -0
  200. package/icons/lucide/shield-check.svg +1 -0
  201. package/icons/lucide/sidebar-simple.svg +1 -0
  202. package/icons/lucide/sign-out.svg +1 -0
  203. package/icons/lucide/signpost.svg +1 -0
  204. package/icons/lucide/sliders-horizontal.svg +1 -0
  205. package/icons/lucide/smiley.svg +1 -0
  206. package/icons/lucide/sparkle.svg +1 -0
  207. package/icons/lucide/square-half-bottom.svg +1 -0
  208. package/icons/lucide/square.svg +1 -0
  209. package/icons/lucide/squares-four.svg +1 -0
  210. package/icons/lucide/sticker.svg +1 -0
  211. package/icons/lucide/storefront.svg +1 -0
  212. package/icons/lucide/sun.svg +1 -0
  213. package/icons/lucide/swatches.svg +1 -0
  214. package/icons/lucide/tag.svg +1 -0
  215. package/icons/lucide/text-aa.svg +1 -0
  216. package/icons/lucide/text-align-left.svg +1 -0
  217. package/icons/lucide/text-b.svg +1 -0
  218. package/icons/lucide/text-h-one.svg +1 -0
  219. package/icons/lucide/text-h-three.svg +1 -0
  220. package/icons/lucide/text-h-two.svg +1 -0
  221. package/icons/lucide/text-italic.svg +1 -0
  222. package/icons/lucide/text-t.svg +1 -0
  223. package/icons/lucide/ticket.svg +1 -0
  224. package/icons/lucide/toggle-right.svg +1 -0
  225. package/icons/lucide/train.svg +1 -0
  226. package/icons/lucide/trash.svg +1 -0
  227. package/icons/lucide/upload-simple.svg +1 -0
  228. package/icons/lucide/user-circle.svg +1 -0
  229. package/icons/lucide/user.svg +1 -0
  230. package/icons/lucide/users-three.svg +1 -0
  231. package/icons/lucide/users.svg +1 -0
  232. package/icons/lucide/video-camera.svg +1 -0
  233. package/icons/lucide/warning-circle.svg +1 -0
  234. package/icons/lucide/warning.svg +1 -0
  235. package/icons/lucide/wave-sine.svg +1 -0
  236. package/icons/lucide/wheelchair.svg +1 -0
  237. package/icons/lucide/wrench.svg +1 -0
  238. package/icons/lucide/x.svg +1 -0
  239. package/icons/material-symbols/LICENSE +201 -0
  240. package/icons/material-symbols/LICENSE-material-design-icons +20 -0
  241. package/icons/material-symbols/address-book.svg +1 -0
  242. package/icons/material-symbols/app-window.svg +1 -0
  243. package/icons/material-symbols/arrow-counter-clockwise.svg +1 -0
  244. package/icons/material-symbols/arrow-down.svg +1 -0
  245. package/icons/material-symbols/arrow-left.svg +1 -0
  246. package/icons/material-symbols/arrow-right.svg +1 -0
  247. package/icons/material-symbols/arrow-square-out.svg +1 -0
  248. package/icons/material-symbols/arrow-u-up-left.svg +1 -0
  249. package/icons/material-symbols/arrow-u-up-right.svg +1 -0
  250. package/icons/material-symbols/arrow-up-right.svg +1 -0
  251. package/icons/material-symbols/arrow-up.svg +1 -0
  252. package/icons/material-symbols/arrows-down-up.svg +1 -0
  253. package/icons/material-symbols/arrows-in-line-horizontal.svg +1 -0
  254. package/icons/material-symbols/arrows-out-line-horizontal.svg +1 -0
  255. package/icons/material-symbols/article.svg +1 -0
  256. package/icons/material-symbols/bank.svg +1 -0
  257. package/icons/material-symbols/bell.svg +1 -0
  258. package/icons/material-symbols/bicycle.svg +1 -0
  259. package/icons/material-symbols/binoculars.svg +1 -0
  260. package/icons/material-symbols/book-open-text.svg +1 -0
  261. package/icons/material-symbols/book-open.svg +1 -0
  262. package/icons/material-symbols/browser.svg +1 -0
  263. package/icons/material-symbols/buildings.svg +1 -0
  264. package/icons/material-symbols/bus.svg +1 -0
  265. package/icons/material-symbols/calendar-blank.svg +1 -0
  266. package/icons/material-symbols/calendar-check.svg +1 -0
  267. package/icons/material-symbols/car.svg +1 -0
  268. package/icons/material-symbols/cards.svg +1 -0
  269. package/icons/material-symbols/caret-down.svg +1 -0
  270. package/icons/material-symbols/caret-left.svg +1 -0
  271. package/icons/material-symbols/caret-right.svg +1 -0
  272. package/icons/material-symbols/caret-up.svg +1 -0
  273. package/icons/material-symbols/certificate.svg +1 -0
  274. package/icons/material-symbols/chart-line-up.svg +1 -0
  275. package/icons/material-symbols/chats.svg +1 -0
  276. package/icons/material-symbols/check-circle.svg +1 -0
  277. package/icons/material-symbols/check.svg +1 -0
  278. package/icons/material-symbols/circle-half.svg +1 -0
  279. package/icons/material-symbols/circle.svg +1 -0
  280. package/icons/material-symbols/clock-counter-clockwise.svg +1 -0
  281. package/icons/material-symbols/clock.svg +1 -0
  282. package/icons/material-symbols/code.svg +1 -0
  283. package/icons/material-symbols/coffee.svg +1 -0
  284. package/icons/material-symbols/columns.svg +1 -0
  285. package/icons/material-symbols/cookie.svg +1 -0
  286. package/icons/material-symbols/copy.svg +1 -0
  287. package/icons/material-symbols/credit-card.svg +1 -0
  288. package/icons/material-symbols/currency-circle-dollar.svg +1 -0
  289. package/icons/material-symbols/cursor-click.svg +1 -0
  290. package/icons/material-symbols/database.svg +1 -0
  291. package/icons/material-symbols/desktop.svg +1 -0
  292. package/icons/material-symbols/device-mobile.svg +1 -0
  293. package/icons/material-symbols/door-open.svg +1 -0
  294. package/icons/material-symbols/download-simple.svg +1 -0
  295. package/icons/material-symbols/envelope-simple.svg +1 -0
  296. package/icons/material-symbols/eye-slash.svg +1 -0
  297. package/icons/material-symbols/eye.svg +1 -0
  298. package/icons/material-symbols/file-pdf.svg +1 -0
  299. package/icons/material-symbols/file-text.svg +1 -0
  300. package/icons/material-symbols/file-video.svg +1 -0
  301. package/icons/material-symbols/file-zip.svg +1 -0
  302. package/icons/material-symbols/flower-lotus.svg +1 -0
  303. package/icons/material-symbols/folder-simple.svg +1 -0
  304. package/icons/material-symbols/funnel.svg +1 -0
  305. package/icons/material-symbols/gauge.svg +1 -0
  306. package/icons/material-symbols/gear.svg +1 -0
  307. package/icons/material-symbols/github-logo.svg +1 -0
  308. package/icons/material-symbols/globe.svg +1 -0
  309. package/icons/material-symbols/google-logo.svg +1 -0
  310. package/icons/material-symbols/graduation-cap.svg +1 -0
  311. package/icons/material-symbols/hammer.svg +1 -0
  312. package/icons/material-symbols/hand-heart.svg +1 -0
  313. package/icons/material-symbols/handshake.svg +1 -0
  314. package/icons/material-symbols/hard-drives.svg +1 -0
  315. package/icons/material-symbols/heart.svg +1 -0
  316. package/icons/material-symbols/house.svg +1 -0
  317. package/icons/material-symbols/image-square.svg +1 -0
  318. package/icons/material-symbols/image.svg +1 -0
  319. package/icons/material-symbols/info.svg +1 -0
  320. package/icons/material-symbols/keyboard.svg +1 -0
  321. package/icons/material-symbols/leaf.svg +1 -0
  322. package/icons/material-symbols/lifebuoy.svg +1 -0
  323. package/icons/material-symbols/lightbulb.svg +1 -0
  324. package/icons/material-symbols/link-break.svg +1 -0
  325. package/icons/material-symbols/link-simple.svg +1 -0
  326. package/icons/material-symbols/list-bullets.svg +1 -0
  327. package/icons/material-symbols/list-checks.svg +1 -0
  328. package/icons/material-symbols/list-numbers.svg +1 -0
  329. package/icons/material-symbols/list.svg +1 -0
  330. package/icons/material-symbols/lock-simple-open.svg +1 -0
  331. package/icons/material-symbols/lock-simple.svg +1 -0
  332. package/icons/material-symbols/magnifying-glass.svg +1 -0
  333. package/icons/material-symbols/map-pin.svg +1 -0
  334. package/icons/material-symbols/map-trifold.svg +1 -0
  335. package/icons/material-symbols/medal.svg +1 -0
  336. package/icons/material-symbols/megaphone.svg +1 -0
  337. package/icons/material-symbols/minus.svg +1 -0
  338. package/icons/material-symbols/moon.svg +1 -0
  339. package/icons/material-symbols/newspaper.svg +1 -0
  340. package/icons/material-symbols/pack.json +29 -0
  341. package/icons/material-symbols/paint-brush-broad.svg +1 -0
  342. package/icons/material-symbols/palette.svg +1 -0
  343. package/icons/material-symbols/paper-plane-tilt.svg +1 -0
  344. package/icons/material-symbols/pencil-simple.svg +1 -0
  345. package/icons/material-symbols/phone.svg +1 -0
  346. package/icons/material-symbols/play-fill.svg +1 -0
  347. package/icons/material-symbols/plus.svg +1 -0
  348. package/icons/material-symbols/prohibit.svg +1 -0
  349. package/icons/material-symbols/puzzle-piece.svg +1 -0
  350. package/icons/material-symbols/question.svg +1 -0
  351. package/icons/material-symbols/quotes.svg +1 -0
  352. package/icons/material-symbols/rows.svg +1 -0
  353. package/icons/material-symbols/ruler.svg +1 -0
  354. package/icons/material-symbols/scan.svg +1 -0
  355. package/icons/material-symbols/shapes.svg +1 -0
  356. package/icons/material-symbols/share-network.svg +1 -0
  357. package/icons/material-symbols/shield-check.svg +1 -0
  358. package/icons/material-symbols/sidebar-simple.svg +1 -0
  359. package/icons/material-symbols/sign-out.svg +1 -0
  360. package/icons/material-symbols/signpost.svg +1 -0
  361. package/icons/material-symbols/sliders-horizontal.svg +1 -0
  362. package/icons/material-symbols/smiley.svg +1 -0
  363. package/icons/material-symbols/sparkle.svg +1 -0
  364. package/icons/material-symbols/square-half-bottom.svg +1 -0
  365. package/icons/material-symbols/square.svg +1 -0
  366. package/icons/material-symbols/squares-four.svg +1 -0
  367. package/icons/material-symbols/sticker.svg +1 -0
  368. package/icons/material-symbols/storefront.svg +1 -0
  369. package/icons/material-symbols/sun.svg +1 -0
  370. package/icons/material-symbols/swatches.svg +1 -0
  371. package/icons/material-symbols/tag.svg +1 -0
  372. package/icons/material-symbols/text-aa.svg +1 -0
  373. package/icons/material-symbols/text-align-left.svg +1 -0
  374. package/icons/material-symbols/text-b.svg +1 -0
  375. package/icons/material-symbols/text-h-one.svg +1 -0
  376. package/icons/material-symbols/text-h-three.svg +1 -0
  377. package/icons/material-symbols/text-h-two.svg +1 -0
  378. package/icons/material-symbols/text-italic.svg +1 -0
  379. package/icons/material-symbols/text-t.svg +1 -0
  380. package/icons/material-symbols/ticket.svg +1 -0
  381. package/icons/material-symbols/toggle-right.svg +1 -0
  382. package/icons/material-symbols/train.svg +1 -0
  383. package/icons/material-symbols/trash.svg +1 -0
  384. package/icons/material-symbols/upload-simple.svg +1 -0
  385. package/icons/material-symbols/user-circle.svg +1 -0
  386. package/icons/material-symbols/user.svg +1 -0
  387. package/icons/material-symbols/users-three.svg +1 -0
  388. package/icons/material-symbols/users.svg +1 -0
  389. package/icons/material-symbols/video-camera.svg +1 -0
  390. package/icons/material-symbols/warning-circle.svg +1 -0
  391. package/icons/material-symbols/warning.svg +1 -0
  392. package/icons/material-symbols/wave-sine.svg +1 -0
  393. package/icons/material-symbols/wheelchair.svg +1 -0
  394. package/icons/material-symbols/wrench.svg +1 -0
  395. package/icons/material-symbols/x.svg +1 -0
  396. package/icons/phosphor/LICENSE +21 -0
  397. package/icons/phosphor/address-book.svg +1 -0
  398. package/icons/phosphor/app-window.svg +1 -0
  399. package/icons/phosphor/arrow-counter-clockwise.svg +1 -0
  400. package/icons/phosphor/arrow-down.svg +1 -0
  401. package/icons/phosphor/arrow-left.svg +1 -0
  402. package/icons/phosphor/arrow-right.svg +1 -0
  403. package/icons/phosphor/arrow-square-out.svg +1 -0
  404. package/icons/phosphor/arrow-u-up-left.svg +1 -0
  405. package/icons/phosphor/arrow-u-up-right.svg +1 -0
  406. package/icons/phosphor/arrow-up-right.svg +1 -0
  407. package/icons/phosphor/arrow-up.svg +1 -0
  408. package/icons/phosphor/arrows-down-up.svg +1 -0
  409. package/icons/phosphor/arrows-in-line-horizontal.svg +1 -0
  410. package/icons/phosphor/arrows-out-line-horizontal.svg +1 -0
  411. package/icons/phosphor/article.svg +1 -0
  412. package/icons/phosphor/bank.svg +1 -0
  413. package/icons/phosphor/bell.svg +1 -0
  414. package/icons/phosphor/bicycle.svg +1 -0
  415. package/icons/phosphor/binoculars.svg +1 -0
  416. package/icons/phosphor/book-open-text.svg +1 -0
  417. package/icons/phosphor/book-open.svg +1 -0
  418. package/icons/phosphor/browser.svg +1 -0
  419. package/icons/phosphor/buildings.svg +1 -0
  420. package/icons/phosphor/bus.svg +1 -0
  421. package/icons/phosphor/calendar-blank.svg +1 -0
  422. package/icons/phosphor/calendar-check.svg +1 -0
  423. package/icons/phosphor/car.svg +1 -0
  424. package/icons/phosphor/cards.svg +1 -0
  425. package/icons/phosphor/caret-down.svg +1 -0
  426. package/icons/phosphor/caret-left.svg +1 -0
  427. package/icons/phosphor/caret-right.svg +1 -0
  428. package/icons/phosphor/caret-up.svg +1 -0
  429. package/icons/phosphor/certificate.svg +1 -0
  430. package/icons/phosphor/chart-line-up.svg +1 -0
  431. package/icons/phosphor/chats.svg +1 -0
  432. package/icons/phosphor/check-circle.svg +1 -0
  433. package/icons/phosphor/check.svg +1 -0
  434. package/icons/phosphor/circle-half.svg +1 -0
  435. package/icons/phosphor/circle.svg +1 -0
  436. package/icons/phosphor/clock-counter-clockwise.svg +1 -0
  437. package/icons/phosphor/clock.svg +1 -0
  438. package/icons/phosphor/code.svg +1 -0
  439. package/icons/phosphor/coffee.svg +1 -0
  440. package/icons/phosphor/columns.svg +1 -0
  441. package/icons/phosphor/cookie.svg +1 -0
  442. package/icons/phosphor/copy.svg +1 -0
  443. package/icons/phosphor/credit-card.svg +1 -0
  444. package/icons/phosphor/currency-circle-dollar.svg +1 -0
  445. package/icons/phosphor/cursor-click.svg +1 -0
  446. package/icons/phosphor/database.svg +1 -0
  447. package/icons/phosphor/desktop.svg +1 -0
  448. package/icons/phosphor/device-mobile.svg +1 -0
  449. package/icons/phosphor/door-open.svg +1 -0
  450. package/icons/phosphor/download-simple.svg +1 -0
  451. package/icons/phosphor/envelope-simple.svg +1 -0
  452. package/icons/phosphor/eye-slash.svg +1 -0
  453. package/icons/phosphor/eye.svg +1 -0
  454. package/icons/phosphor/file-pdf.svg +1 -0
  455. package/icons/phosphor/file-text.svg +1 -0
  456. package/icons/phosphor/file-video.svg +1 -0
  457. package/icons/phosphor/file-zip.svg +1 -0
  458. package/icons/phosphor/flower-lotus.svg +1 -0
  459. package/icons/phosphor/folder-simple.svg +1 -0
  460. package/icons/phosphor/funnel.svg +1 -0
  461. package/icons/phosphor/gauge.svg +1 -0
  462. package/icons/phosphor/gear.svg +1 -0
  463. package/icons/phosphor/github-logo.svg +1 -0
  464. package/icons/phosphor/globe.svg +1 -0
  465. package/icons/phosphor/google-logo.svg +1 -0
  466. package/icons/phosphor/graduation-cap.svg +1 -0
  467. package/icons/phosphor/hammer.svg +1 -0
  468. package/icons/phosphor/hand-heart.svg +1 -0
  469. package/icons/phosphor/handshake.svg +1 -0
  470. package/icons/phosphor/hard-drives.svg +1 -0
  471. package/icons/phosphor/heart.svg +1 -0
  472. package/icons/phosphor/house.svg +1 -0
  473. package/icons/phosphor/image-square.svg +1 -0
  474. package/icons/phosphor/image.svg +1 -0
  475. package/icons/phosphor/info.svg +1 -0
  476. package/icons/phosphor/keyboard.svg +1 -0
  477. package/icons/phosphor/leaf.svg +1 -0
  478. package/icons/phosphor/lifebuoy.svg +1 -0
  479. package/icons/phosphor/lightbulb.svg +1 -0
  480. package/icons/phosphor/link-break.svg +1 -0
  481. package/icons/phosphor/link-simple.svg +1 -0
  482. package/icons/phosphor/list-bullets.svg +1 -0
  483. package/icons/phosphor/list-checks.svg +1 -0
  484. package/icons/phosphor/list-numbers.svg +1 -0
  485. package/icons/phosphor/list.svg +1 -0
  486. package/icons/phosphor/lock-simple-open.svg +1 -0
  487. package/icons/phosphor/lock-simple.svg +1 -0
  488. package/icons/phosphor/magnifying-glass.svg +1 -0
  489. package/icons/phosphor/map-pin.svg +1 -0
  490. package/icons/phosphor/map-trifold.svg +1 -0
  491. package/icons/phosphor/medal.svg +1 -0
  492. package/icons/phosphor/megaphone.svg +1 -0
  493. package/icons/phosphor/minus.svg +1 -0
  494. package/icons/phosphor/moon.svg +1 -0
  495. package/icons/phosphor/newspaper.svg +1 -0
  496. package/icons/phosphor/pack.json +8 -0
  497. package/icons/phosphor/paint-brush-broad.svg +1 -0
  498. package/icons/phosphor/palette.svg +1 -0
  499. package/icons/phosphor/paper-plane-tilt.svg +1 -0
  500. package/icons/phosphor/pencil-simple.svg +1 -0
  501. package/icons/phosphor/phone.svg +1 -0
  502. package/icons/phosphor/play-fill.svg +1 -0
  503. package/icons/phosphor/plus.svg +1 -0
  504. package/icons/phosphor/prohibit.svg +1 -0
  505. package/icons/phosphor/puzzle-piece.svg +1 -0
  506. package/icons/phosphor/question.svg +1 -0
  507. package/icons/phosphor/quotes.svg +1 -0
  508. package/icons/phosphor/rows.svg +1 -0
  509. package/icons/phosphor/ruler.svg +1 -0
  510. package/icons/phosphor/scan.svg +1 -0
  511. package/icons/phosphor/shapes.svg +1 -0
  512. package/icons/phosphor/share-network.svg +1 -0
  513. package/icons/phosphor/shield-check.svg +1 -0
  514. package/icons/phosphor/sidebar-simple.svg +1 -0
  515. package/icons/phosphor/sign-out.svg +1 -0
  516. package/icons/phosphor/signpost.svg +1 -0
  517. package/icons/phosphor/sliders-horizontal.svg +1 -0
  518. package/icons/phosphor/smiley.svg +1 -0
  519. package/icons/phosphor/sparkle.svg +1 -0
  520. package/icons/phosphor/square-half-bottom.svg +1 -0
  521. package/icons/phosphor/square.svg +1 -0
  522. package/icons/phosphor/squares-four.svg +1 -0
  523. package/icons/phosphor/sticker.svg +1 -0
  524. package/icons/phosphor/storefront.svg +1 -0
  525. package/icons/phosphor/sun.svg +1 -0
  526. package/icons/phosphor/swatches.svg +1 -0
  527. package/icons/phosphor/tag.svg +1 -0
  528. package/icons/phosphor/text-aa.svg +1 -0
  529. package/icons/phosphor/text-align-left.svg +1 -0
  530. package/icons/phosphor/text-b.svg +1 -0
  531. package/icons/phosphor/text-h-one.svg +1 -0
  532. package/icons/phosphor/text-h-three.svg +1 -0
  533. package/icons/phosphor/text-h-two.svg +1 -0
  534. package/icons/phosphor/text-italic.svg +1 -0
  535. package/icons/phosphor/text-t.svg +1 -0
  536. package/icons/phosphor/ticket.svg +1 -0
  537. package/icons/phosphor/toggle-right.svg +1 -0
  538. package/icons/phosphor/train.svg +1 -0
  539. package/icons/phosphor/trash.svg +1 -0
  540. package/icons/phosphor/upload-simple.svg +1 -0
  541. package/icons/phosphor/user-circle.svg +1 -0
  542. package/icons/phosphor/user.svg +1 -0
  543. package/icons/phosphor/users-three.svg +1 -0
  544. package/icons/phosphor/users.svg +1 -0
  545. package/icons/phosphor/video-camera.svg +1 -0
  546. package/icons/phosphor/warning-circle.svg +1 -0
  547. package/icons/phosphor/warning.svg +1 -0
  548. package/icons/phosphor/wave-sine.svg +1 -0
  549. package/icons/phosphor/wheelchair.svg +1 -0
  550. package/icons/phosphor/wrench.svg +1 -0
  551. package/icons/phosphor/x.svg +1 -0
  552. package/lib/apps.d.mts +28 -0
  553. package/lib/apps.mjs +139 -0
  554. package/lib/blocks.d.mts +23 -0
  555. package/lib/blocks.mjs +90 -0
  556. package/lib/colors.ts +86 -0
  557. package/lib/contactBar.ts +18 -0
  558. package/lib/cookieCategories.d.mts +17 -0
  559. package/lib/cookieCategories.mjs +28 -0
  560. package/lib/crop.d.mts +34 -0
  561. package/lib/crop.mjs +83 -0
  562. package/lib/csp.d.mts +22 -0
  563. package/lib/csp.mjs +130 -0
  564. package/lib/cspSources.d.mts +24 -0
  565. package/lib/cspSources.mjs +60 -0
  566. package/lib/dynamic-colors.ts +426 -0
  567. package/lib/git.d.mts +24 -0
  568. package/lib/git.mjs +64 -0
  569. package/lib/hooks.ts +51 -0
  570. package/lib/inline.ts +20 -0
  571. package/lib/license-texts/Apache-2.0.txt +191 -0
  572. package/lib/license-texts/BSD-2-Clause.txt +24 -0
  573. package/lib/license-texts/BSD-3-Clause.txt +28 -0
  574. package/lib/license-texts/ISC.txt +15 -0
  575. package/lib/license-texts/MIT.txt +21 -0
  576. package/lib/licenses.d.mts +190 -0
  577. package/lib/licenses.mjs +683 -0
  578. package/lib/markdown.ts +42 -0
  579. package/lib/motion-schemes.d.mts +2 -0
  580. package/lib/motion-schemes.mjs +5 -0
  581. package/lib/motion.ts +131 -0
  582. package/lib/notice.d.mts +3 -0
  583. package/lib/notice.mjs +34 -0
  584. package/lib/scheduled.d.mts +15 -0
  585. package/lib/scheduled.mjs +37 -0
  586. package/lib/snackbar.ts +149 -0
  587. package/lib/status.d.mts +7 -0
  588. package/lib/status.mjs +18 -0
  589. package/lib/svg.d.mts +22 -0
  590. package/lib/svg.mjs +231 -0
  591. package/lib/text-colors.d.mts +11 -0
  592. package/lib/text-colors.mjs +43 -0
  593. package/lib/video-id.d.mts +14 -0
  594. package/lib/video-id.mjs +72 -0
  595. package/lib/video.d.mts +20 -0
  596. package/lib/video.mjs +91 -0
  597. package/package.json +131 -6
  598. package/pages/404.astro +10 -0
  599. package/pages/[...slug].astro +51 -0
  600. package/pages/_headers.txt +31 -0
  601. package/pages/blog/index.astro +10 -0
  602. package/pages/blog/kategori/[category].astro +18 -0
  603. package/pages/editor/code-images.json.js +25 -0
  604. package/pages/editor/index.astro +75 -0
  605. package/pages/editor/manifest.webmanifest.js +23 -0
  606. package/pages/editor/sw.js +33 -0
  607. package/pages/editor/sw.js.js +4 -0
  608. package/pages/editor/thumbnails.json.js +21 -0
  609. package/pages/editor/version.json.js +22 -0
  610. package/pages/headers.js +4 -0
  611. package/pages/index.astro +10 -0
  612. package/pages/ny.astro +6 -0
  613. package/pages/robots.txt.js +3 -0
  614. package/pages/rss.xml.js +20 -0
  615. package/scripts/app-screenshots.mjs +164 -0
  616. package/scripts/app-workers.mjs +6 -0
  617. package/scripts/bin.mjs +12 -0
  618. package/scripts/built-site.mjs +99 -0
  619. package/scripts/check-consent.mjs +113 -0
  620. package/scripts/check-content.mjs +149 -0
  621. package/scripts/check-demo.mjs +24 -0
  622. package/scripts/check-themes.mjs +45 -0
  623. package/scripts/check-worker.mjs +569 -0
  624. package/scripts/compare-html.mjs +81 -0
  625. package/scripts/demo-site.mjs +42 -0
  626. package/scripts/editor-icons.mjs +56 -0
  627. package/scripts/editor-roundtrip.mjs +134 -0
  628. package/scripts/editor-screens.mjs +101 -0
  629. package/scripts/git-env.mjs +9 -0
  630. package/scripts/icon-packs.mjs +151 -0
  631. package/scripts/link-counts.mjs +22 -0
  632. package/scripts/page-colors.mjs +42 -0
  633. package/scripts/releases.d.mts +10 -0
  634. package/scripts/releases.mjs +80 -0
  635. package/scripts/responsive-images.mjs +94 -0
  636. package/scripts/scheduled-list.mjs +15 -0
  637. package/scripts/theme-screenshots.mjs +88 -0
  638. package/scripts/types.mjs +21 -0
  639. package/scripts/video-thumbnails.mjs +89 -0
  640. package/scripts/worker-modules.mjs +34 -0
  641. package/site/appCookies.d.mts +9 -0
  642. package/site/appCookies.mjs +74 -0
  643. package/site/apps.ts +21 -0
  644. package/site/autolinks.d.mts +11 -0
  645. package/site/autolinks.mjs +200 -0
  646. package/site/blockScripts.ts +31 -0
  647. package/site/categories.ts +16 -0
  648. package/site/consent.ts +26 -0
  649. package/site/content.config.ts +84 -0
  650. package/site/content.ts +104 -0
  651. package/site/cookieList.ts +17 -0
  652. package/site/defineSite.d.mts +142 -0
  653. package/site/defineSite.mjs +136 -0
  654. package/site/directives/interact.d.mts +2 -0
  655. package/site/directives/interact.mjs +31 -0
  656. package/site/editor-version.d.mts +1 -0
  657. package/site/editor-version.mjs +26 -0
  658. package/site/fill.ts +13 -0
  659. package/site/format.ts +11 -0
  660. package/site/home.ts +66 -0
  661. package/site/iconPacks.d.mts +20 -0
  662. package/site/iconPacks.mjs +43 -0
  663. package/site/icons.d.mts +693 -0
  664. package/site/icons.mjs +605 -0
  665. package/site/images.d.mts +43 -0
  666. package/site/images.mjs +157 -0
  667. package/site/motion.ts +13 -0
  668. package/site/noindex.d.mts +6 -0
  669. package/site/noindex.mjs +21 -0
  670. package/site/pageColors.ts +110 -0
  671. package/site/popups.ts +98 -0
  672. package/site/schema.ts +189 -0
  673. package/site/sections.ts +3 -0
  674. package/site/seo.ts +28 -0
  675. package/site/site.ts +76 -0
  676. package/site/siteConfig.d.mts +1 -0
  677. package/site/siteConfig.mjs +8 -0
  678. package/site/siteCsp.d.mts +10 -0
  679. package/site/siteCsp.mjs +75 -0
  680. package/site/siteModules.d.mts +7 -0
  681. package/site/siteModules.mjs +27 -0
  682. package/site/standardPages.ts +59 -0
  683. package/site/testimonials.ts +48 -0
  684. package/site/text.ts +43 -0
  685. package/site/theme.d.mts +83 -0
  686. package/site/theme.mjs +472 -0
  687. package/site/tracking.client.ts +225 -0
  688. package/site/tracking.ts +9 -0
  689. package/src/ActionParts.tsx +205 -0
  690. package/src/Advanced.tsx +152 -0
  691. package/src/App.tsx +904 -0
  692. package/src/AppList.tsx +1345 -0
  693. package/src/BlockDialog.tsx +360 -0
  694. package/src/BlockParts.tsx +652 -0
  695. package/src/BlockSettings.tsx +533 -0
  696. package/src/BrandForm.tsx +164 -0
  697. package/src/Colors.tsx +476 -0
  698. package/src/CommunicationParts.tsx +199 -0
  699. package/src/CompanyForm.tsx +209 -0
  700. package/src/Consents.tsx +175 -0
  701. package/src/ContainmentParts.tsx +185 -0
  702. package/src/Crop.tsx +152 -0
  703. package/src/DataForm.tsx +434 -0
  704. package/src/Deleted.tsx +177 -0
  705. package/src/EntryForm.tsx +740 -0
  706. package/src/FileView.tsx +30 -0
  707. package/src/FormFrame.tsx +237 -0
  708. package/src/Keywords.tsx +225 -0
  709. package/src/Library.tsx +1563 -0
  710. package/src/Licenses.tsx +336 -0
  711. package/src/LinkSheet.tsx +138 -0
  712. package/src/MarkdownEditor.tsx +1075 -0
  713. package/src/Media.tsx +677 -0
  714. package/src/NavigationParts.tsx +350 -0
  715. package/src/NavigationRestParts.tsx +247 -0
  716. package/src/Notifications.tsx +59 -0
  717. package/src/PagePicker.tsx +136 -0
  718. package/src/Parts.tsx +991 -0
  719. package/src/PartsShown.tsx +168 -0
  720. package/src/PickerParts.tsx +183 -0
  721. package/src/Redirects.tsx +450 -0
  722. package/src/Screen.tsx +184 -0
  723. package/src/SectionsField.tsx +65 -0
  724. package/src/SelectionParts.tsx +134 -0
  725. package/src/SeoScores.tsx +184 -0
  726. package/src/Sheet.tsx +35 -0
  727. package/src/ThemeStore.tsx +376 -0
  728. package/src/Tokens.tsx +346 -0
  729. package/src/Versions.tsx +214 -0
  730. package/src/addresses.ts +75 -0
  731. package/src/allIcons.ts +7 -0
  732. package/src/appFiles.ts +29 -0
  733. package/src/apps.ts +281 -0
  734. package/src/ask.tsx +123 -0
  735. package/src/blocks.ts +251 -0
  736. package/src/brand.ts +153 -0
  737. package/src/cache.ts +42 -0
  738. package/src/check.ts +285 -0
  739. package/src/checkSite.ts +256 -0
  740. package/src/consents.ts +26 -0
  741. package/src/cookieList.ts +70 -0
  742. package/src/countries.ts +59 -0
  743. package/src/deploy.ts +155 -0
  744. package/src/editor.css +602 -0
  745. package/src/examples.ts +85 -0
  746. package/src/fields.tsx +942 -0
  747. package/src/frontmatter.d.mts +6 -0
  748. package/src/frontmatter.mjs +42 -0
  749. package/src/github.ts +376 -0
  750. package/src/i18n/da-DK/advanced.ts +28 -0
  751. package/src/i18n/da-DK/app.ts +71 -0
  752. package/src/i18n/da-DK/apps.ts +90 -0
  753. package/src/i18n/da-DK/blockSettings.ts +38 -0
  754. package/src/i18n/da-DK/blocks.ts +408 -0
  755. package/src/i18n/da-DK/check.ts +25 -0
  756. package/src/i18n/da-DK/colors.ts +64 -0
  757. package/src/i18n/da-DK/common.ts +118 -0
  758. package/src/i18n/da-DK/company.ts +24 -0
  759. package/src/i18n/da-DK/consents.ts +23 -0
  760. package/src/i18n/da-DK/forms.ts +116 -0
  761. package/src/i18n/da-DK/history.ts +35 -0
  762. package/src/i18n/da-DK/index.ts +49 -0
  763. package/src/i18n/da-DK/keywords.ts +19 -0
  764. package/src/i18n/da-DK/library.ts +135 -0
  765. package/src/i18n/da-DK/licenses.ts +25 -0
  766. package/src/i18n/da-DK/media.ts +79 -0
  767. package/src/i18n/da-DK/parts.ts +696 -0
  768. package/src/i18n/da-DK/preview.ts +13 -0
  769. package/src/i18n/da-DK/redirects.ts +51 -0
  770. package/src/i18n/da-DK/seo.ts +20 -0
  771. package/src/i18n/da-DK/text.ts +35 -0
  772. package/src/i18n/da-DK/theme.ts +41 -0
  773. package/src/i18n/en-US/advanced.ts +32 -0
  774. package/src/i18n/en-US/app.ts +84 -0
  775. package/src/i18n/en-US/apps.ts +134 -0
  776. package/src/i18n/en-US/blockSettings.ts +48 -0
  777. package/src/i18n/en-US/blocks.ts +441 -0
  778. package/src/i18n/en-US/check.ts +31 -0
  779. package/src/i18n/en-US/colors.ts +82 -0
  780. package/src/i18n/en-US/common.ts +144 -0
  781. package/src/i18n/en-US/company.ts +25 -0
  782. package/src/i18n/en-US/consents.ts +25 -0
  783. package/src/i18n/en-US/forms.ts +145 -0
  784. package/src/i18n/en-US/history.ts +43 -0
  785. package/src/i18n/en-US/index.ts +51 -0
  786. package/src/i18n/en-US/keywords.ts +24 -0
  787. package/src/i18n/en-US/library.ts +176 -0
  788. package/src/i18n/en-US/licenses.ts +36 -0
  789. package/src/i18n/en-US/media.ts +80 -0
  790. package/src/i18n/en-US/parts.ts +718 -0
  791. package/src/i18n/en-US/preview.ts +15 -0
  792. package/src/i18n/en-US/redirects.ts +66 -0
  793. package/src/i18n/en-US/seo.ts +26 -0
  794. package/src/i18n/en-US/text.ts +41 -0
  795. package/src/i18n/en-US/theme.ts +41 -0
  796. package/src/i18n/index.ts +124 -0
  797. package/src/icon.tsx +160 -0
  798. package/src/iconPacks.ts +89 -0
  799. package/src/images.ts +163 -0
  800. package/src/licenses.ts +79 -0
  801. package/src/markdown.d.mts +12 -0
  802. package/src/markdown.mjs +204 -0
  803. package/src/nav.ts +68 -0
  804. package/src/notFound.ts +28 -0
  805. package/src/notifications.ts +223 -0
  806. package/src/pagePreview.tsx +204 -0
  807. package/src/r2Caching.ts +55 -0
  808. package/src/redirects.ts +149 -0
  809. package/src/registry.tsx +188 -0
  810. package/src/schema.ts +417 -0
  811. package/src/sections.d.mts +45 -0
  812. package/src/sections.mjs +303 -0
  813. package/src/seo.ts +333 -0
  814. package/src/shared.ts +44 -0
  815. package/src/sidebar.ts +31 -0
  816. package/src/site.ts +317 -0
  817. package/src/standard/Block.astro +19 -0
  818. package/src/standard/BlockSite.astro +18 -0
  819. package/src/standard/accordion/index.tsx +47 -0
  820. package/src/standard/accordion/load.ts +23 -0
  821. package/src/standard/accordion/shared.ts +15 -0
  822. package/src/standard/accordion/view.ts +32 -0
  823. package/src/standard/buttons/fields.ts +98 -0
  824. package/src/standard/buttons/index.tsx +23 -0
  825. package/src/standard/buttons/load.ts +34 -0
  826. package/src/standard/buttons/shared.ts +12 -0
  827. package/src/standard/buttons/view.ts +30 -0
  828. package/src/standard/cards/index.tsx +71 -0
  829. package/src/standard/cards/load.ts +17 -0
  830. package/src/standard/cards/shared.ts +27 -0
  831. package/src/standard/cards/view.ts +29 -0
  832. package/src/standard/checklist/index.tsx +27 -0
  833. package/src/standard/checklist/load.ts +5 -0
  834. package/src/standard/checklist/view.ts +13 -0
  835. package/src/standard/cookies/index.tsx +17 -0
  836. package/src/standard/cookies/list.ts +56 -0
  837. package/src/standard/cookies/load.ts +11 -0
  838. package/src/standard/cookies/shared.ts +20 -0
  839. package/src/standard/cookies/view.ts +28 -0
  840. package/src/standard/faq/index.tsx +29 -0
  841. package/src/standard/faq/load.ts +14 -0
  842. package/src/standard/faq/view.ts +21 -0
  843. package/src/standard/head.ts +23 -0
  844. package/src/standard/hero/fields.ts +48 -0
  845. package/src/standard/hero/index.tsx +57 -0
  846. package/src/standard/hero/load.ts +23 -0
  847. package/src/standard/hero/view.ts +38 -0
  848. package/src/standard/links/index.tsx +41 -0
  849. package/src/standard/links/load.ts +17 -0
  850. package/src/standard/links/view.ts +25 -0
  851. package/src/standard/list/index.tsx +50 -0
  852. package/src/standard/list/load.ts +5 -0
  853. package/src/standard/list/view.ts +18 -0
  854. package/src/standard/load.ts +7 -0
  855. package/src/standard/notice/index.tsx +30 -0
  856. package/src/standard/notice/load.ts +16 -0
  857. package/src/standard/notice/view.ts +10 -0
  858. package/src/standard/points/index.tsx +42 -0
  859. package/src/standard/points/load.ts +5 -0
  860. package/src/standard/points/view.ts +12 -0
  861. package/src/standard/posts/index.tsx +132 -0
  862. package/src/standard/posts/load.ts +36 -0
  863. package/src/standard/posts/shared.ts +21 -0
  864. package/src/standard/posts/view.ts +63 -0
  865. package/src/standard/pricecards/index.tsx +57 -0
  866. package/src/standard/pricecards/load.ts +11 -0
  867. package/src/standard/pricecards/view.ts +50 -0
  868. package/src/standard/sharedTexts.ts +6 -0
  869. package/src/standard/site.ts +124 -0
  870. package/src/standard/siteLooks.ts +19 -0
  871. package/src/standard/sites.ts +13 -0
  872. package/src/standard/steps/index.tsx +28 -0
  873. package/src/standard/steps/load.ts +5 -0
  874. package/src/standard/steps/view.ts +11 -0
  875. package/src/standard/testimonials/index.tsx +87 -0
  876. package/src/standard/testimonials/list.ts +43 -0
  877. package/src/standard/testimonials/load.ts +58 -0
  878. package/src/standard/testimonials/shared.ts +13 -0
  879. package/src/standard/testimonials/view.ts +76 -0
  880. package/src/standard/themeBlocks.ts +13 -0
  881. package/src/standard/video/index.tsx +23 -0
  882. package/src/standard/video/load.ts +10 -0
  883. package/src/standard/video/view.ts +42 -0
  884. package/src/standard/view.tsx +105 -0
  885. package/src/standard/views.ts +37 -0
  886. package/src/store.ts +499 -0
  887. package/src/theme.ts +90 -0
  888. package/src/themeUi.ts +97 -0
  889. package/src/themes.ts +91 -0
  890. package/src/ui.tsx +3402 -0
  891. package/src/virtual.d.ts +5 -0
  892. package/src/when.ts +22 -0
  893. package/starter/.githooks/pre-push +4 -0
  894. package/starter/.nvmrc +1 -0
  895. package/starter/.prettierignore +11 -0
  896. package/starter/.prettierrc.json +7 -0
  897. package/starter/README.md +26 -0
  898. package/starter/astro.config.mjs +5 -0
  899. package/starter/package.json +67 -0
  900. package/starter/public/_redirects +1 -0
  901. package/starter/public/apple-touch-icon.png +0 -0
  902. package/starter/public/editor/apple-touch-icon.png +0 -0
  903. package/starter/public/editor/icon-192.png +0 -0
  904. package/starter/public/editor/icon-512.png +0 -0
  905. package/starter/public/editor/icon-maskable-512.png +0 -0
  906. package/starter/public/favicon.ico +0 -0
  907. package/starter/public/favicon.svg +1 -0
  908. package/starter/public/logo.svg +1 -0
  909. package/starter/src/content/pages/blog.md +8 -0
  910. package/starter/src/content/pages/forside.md +9 -0
  911. package/starter/src/content/pages/kontakt.md +7 -0
  912. package/starter/src/content/pages/privatlivspolitik.md +9 -0
  913. package/starter/src/content/pages/siden-findes-ikke.md +7 -0
  914. package/starter/src/content.config.ts +2 -0
  915. package/starter/src/data/apps.json +1 -0
  916. package/starter/src/data/block-settings.json +3 -0
  917. package/starter/src/data/blocks.json +1 -0
  918. package/starter/src/data/booking.json +6 -0
  919. package/starter/src/data/colors.json +70 -0
  920. package/starter/src/data/contact.json +8 -0
  921. package/starter/src/data/cookies.json +21 -0
  922. package/starter/src/data/csp.json +1 -0
  923. package/starter/src/data/footer.json +15 -0
  924. package/starter/src/data/internal-links.json +4 -0
  925. package/starter/src/data/menu.json +4 -0
  926. package/starter/src/data/mobile-menu.json +4 -0
  927. package/starter/src/data/old-addresses.json +1 -0
  928. package/starter/src/data/redirects.json +1 -0
  929. package/starter/src/data/standard-pages.json +8 -0
  930. package/starter/src/data/theme.json +1 -0
  931. package/starter/src/env.d.ts +2 -0
  932. package/starter/src/site/config.ts +13 -0
  933. package/starter/src/site/worker.js +14 -0
  934. package/starter/tsconfig.json +17 -0
  935. package/starter/worker/apps.js +6 -0
  936. package/starter/wrangler.jsonc +39 -0
  937. package/theme/LICENSE +21 -0
  938. package/theme/blocks/ArrowLink.tsx +14 -0
  939. package/theme/blocks/BlockHead.tsx +26 -0
  940. package/theme/blocks/Panel.tsx +32 -0
  941. package/theme/blocks/Person.tsx +26 -0
  942. package/theme/blocks/accordion/PageRow.tsx +25 -0
  943. package/theme/blocks/accordion/View.tsx +17 -0
  944. package/theme/blocks/buttons/Buttons.tsx +28 -0
  945. package/theme/blocks/buttons/View.tsx +12 -0
  946. package/theme/blocks/cards/LinkCards.tsx +72 -0
  947. package/theme/blocks/cards/View.tsx +20 -0
  948. package/theme/blocks/checklist/Checks.tsx +15 -0
  949. package/theme/blocks/checklist/View.tsx +14 -0
  950. package/theme/blocks/cookies/View.tsx +36 -0
  951. package/theme/blocks/faq/Accordion.tsx +34 -0
  952. package/theme/blocks/faq/View.tsx +16 -0
  953. package/theme/blocks/faq/script.ts +56 -0
  954. package/theme/blocks/hero/View.tsx +44 -0
  955. package/theme/blocks/links/LinkGroups.tsx +24 -0
  956. package/theme/blocks/links/View.tsx +17 -0
  957. package/theme/blocks/list/Rows.tsx +24 -0
  958. package/theme/blocks/list/View.tsx +14 -0
  959. package/theme/blocks/notice/View.tsx +13 -0
  960. package/theme/blocks/points/PointList.tsx +34 -0
  961. package/theme/blocks/points/View.tsx +14 -0
  962. package/theme/blocks/posts/View.tsx +26 -0
  963. package/theme/blocks/pricecards/View.tsx +40 -0
  964. package/theme/blocks/steps/StepList.tsx +23 -0
  965. package/theme/blocks/steps/View.tsx +14 -0
  966. package/theme/blocks/testimonials/List.tsx +46 -0
  967. package/theme/blocks/testimonials/Slider.tsx +44 -0
  968. package/theme/blocks/testimonials/Testimonial.tsx +124 -0
  969. package/theme/blocks/testimonials/View.tsx +21 -0
  970. package/theme/blocks/testimonials/script.ts +52 -0
  971. package/theme/blocks/video/View.tsx +41 -0
  972. package/theme/components/ActionBar.astro +63 -0
  973. package/theme/components/AppSlot.astro +21 -0
  974. package/theme/components/ArrowLink.tsx +21 -0
  975. package/theme/components/BlogIndex.astro +48 -0
  976. package/theme/components/BlogPosts.astro +18 -0
  977. package/theme/components/BlogPosts.tsx +45 -0
  978. package/theme/components/BookButton.tsx +22 -0
  979. package/theme/components/Container.astro +11 -0
  980. package/theme/components/CookieConsent.astro +121 -0
  981. package/theme/components/EndBlock.astro +21 -0
  982. package/theme/components/FontPreload.astro +6 -0
  983. package/theme/components/Footer.astro +85 -0
  984. package/theme/components/Header.astro +186 -0
  985. package/theme/components/Icon.astro +16 -0
  986. package/theme/components/Img.astro +29 -0
  987. package/theme/components/Img.tsx +33 -0
  988. package/theme/components/Inline.astro +11 -0
  989. package/theme/components/Logo.astro +23 -0
  990. package/theme/components/LogoMark.astro +10 -0
  991. package/theme/components/Markdown.astro +17 -0
  992. package/theme/components/MobileMenu.tsx +224 -0
  993. package/theme/components/MobileNav.astro +33 -0
  994. package/theme/components/PageHeader.astro +22 -0
  995. package/theme/components/PageSection.astro +24 -0
  996. package/theme/components/PhoneButton.tsx +11 -0
  997. package/theme/components/Popup.astro +145 -0
  998. package/theme/components/PopupButton.tsx +24 -0
  999. package/theme/components/PopupView.tsx +48 -0
  1000. package/theme/components/PostList.tsx +58 -0
  1001. package/theme/components/PostMeta.tsx +17 -0
  1002. package/theme/components/RichText.astro +28 -0
  1003. package/theme/components/Section.astro +29 -0
  1004. package/theme/components/SectionHeading.tsx +8 -0
  1005. package/theme/components/TextSection.astro +16 -0
  1006. package/theme/components/home/PageBlock.astro +19 -0
  1007. package/theme/components/home/Text.astro +13 -0
  1008. package/theme/components/loadPopup.ts +22 -0
  1009. package/theme/components/loadPosts.ts +16 -0
  1010. package/theme/components/posts.ts +15 -0
  1011. package/theme/editor/looks.mjs +7 -0
  1012. package/theme/editor/previews.tsx +56 -0
  1013. package/theme/layouts/Base.astro +273 -0
  1014. package/theme/layouts/PageLayout.astro +126 -0
  1015. package/theme/layouts/PostLayout.astro +137 -0
  1016. package/theme/screenshots/1-front.jpg +0 -0
  1017. package/theme/screenshots/2-front-dark.jpg +0 -0
  1018. package/theme/screenshots/3-blog.jpg +0 -0
  1019. package/theme/screenshots/4-contact.jpg +0 -0
  1020. package/theme/scripts/motion.ts +29 -0
  1021. package/theme/styles/base.css +320 -0
  1022. package/theme/styles/blocks.css +1808 -0
  1023. package/theme/styles/components.css +206 -0
  1024. package/theme/styles/global.css +1302 -0
  1025. package/theme/styles/ui.css +6544 -0
  1026. package/theme/templates/Blog.astro +38 -0
  1027. package/theme/templates/Category.astro +19 -0
  1028. package/theme/templates/Home.astro +36 -0
  1029. package/theme/templates/New.astro +68 -0
  1030. package/theme/templates/NotFound.astro +117 -0
  1031. package/theme/theme.json +28 -0
  1032. package/theme/ui/Badge.tsx +45 -0
  1033. package/theme/ui/BottomSheet.tsx +148 -0
  1034. package/theme/ui/Button.tsx +79 -0
  1035. package/theme/ui/ButtonGroup.tsx +31 -0
  1036. package/theme/ui/Card.tsx +45 -0
  1037. package/theme/ui/Carousel.tsx +124 -0
  1038. package/theme/ui/Checkbox.tsx +59 -0
  1039. package/theme/ui/Chip.tsx +101 -0
  1040. package/theme/ui/ChipSet.tsx +27 -0
  1041. package/theme/ui/DatePicker.tsx +149 -0
  1042. package/theme/ui/DatePickerContainer.tsx +316 -0
  1043. package/theme/ui/Dialog.tsx +100 -0
  1044. package/theme/ui/Divider.tsx +27 -0
  1045. package/theme/ui/ExposedDropdownMenu.tsx +77 -0
  1046. package/theme/ui/Fab.tsx +88 -0
  1047. package/theme/ui/FabMenu.tsx +67 -0
  1048. package/theme/ui/IconButton.tsx +78 -0
  1049. package/theme/ui/List.tsx +287 -0
  1050. package/theme/ui/LoadingIndicator.tsx +29 -0
  1051. package/theme/ui/Menu.tsx +278 -0
  1052. package/theme/ui/NavigationBar.tsx +62 -0
  1053. package/theme/ui/NavigationDrawer.tsx +80 -0
  1054. package/theme/ui/NavigationRail.tsx +154 -0
  1055. package/theme/ui/ProgressIndicator.tsx +162 -0
  1056. package/theme/ui/RadioButton.tsx +50 -0
  1057. package/theme/ui/Search.tsx +129 -0
  1058. package/theme/ui/SegmentedButton.tsx +49 -0
  1059. package/theme/ui/SideSheet.tsx +54 -0
  1060. package/theme/ui/Slider.tsx +155 -0
  1061. package/theme/ui/Snackbar.tsx +67 -0
  1062. package/theme/ui/SplitButton.tsx +67 -0
  1063. package/theme/ui/Switch.tsx +60 -0
  1064. package/theme/ui/Tabs.tsx +114 -0
  1065. package/theme/ui/TextField.tsx +278 -0
  1066. package/theme/ui/TimePicker.tsx +128 -0
  1067. package/theme/ui/TimePickerContainer.tsx +234 -0
  1068. package/theme/ui/Toolbar.tsx +67 -0
  1069. package/theme/ui/Tooltip.tsx +58 -0
  1070. package/theme/ui/TopAppBar.tsx +77 -0
  1071. package/theme/ui/bottomSheet.script.ts +8 -0
  1072. package/theme/ui/bottomSheet.ts +211 -0
  1073. package/theme/ui/carousel.script.ts +28 -0
  1074. package/theme/ui/carouselLayout.ts +229 -0
  1075. package/theme/ui/checkbox.script.ts +8 -0
  1076. package/theme/ui/datePicker.script.ts +302 -0
  1077. package/theme/ui/dates.ts +185 -0
  1078. package/theme/ui/dialog.ts +48 -0
  1079. package/theme/ui/dropdownMenu.script.ts +166 -0
  1080. package/theme/ui/fabMenu.script.ts +57 -0
  1081. package/theme/ui/navigationRail.script.ts +47 -0
  1082. package/theme/ui/ripple.script.ts +159 -0
  1083. package/theme/ui/search.script.ts +92 -0
  1084. package/theme/ui/sideSheet.ts +48 -0
  1085. package/theme/ui/slider.script.ts +12 -0
  1086. package/theme/ui/sliderUpdate.ts +52 -0
  1087. package/theme/ui/snackbar.script.ts +16 -0
  1088. package/theme/ui/splitButton.script.ts +63 -0
  1089. package/theme/ui/tabs.script.ts +48 -0
  1090. package/theme/ui/textField.script.ts +17 -0
  1091. package/theme/ui/textFieldUpdate.ts +44 -0
  1092. package/theme/ui/timePicker.script.ts +248 -0
  1093. package/theme/ui/toolbar.script.ts +43 -0
  1094. package/theme/ui/tooltip.script.ts +68 -0
  1095. package/worker/consent.js +141 -0
  1096. package/worker/editor-github.js +167 -0
  1097. package/worker/editor-host.js +74 -0
  1098. package/worker/files.js +401 -0
  1099. package/worker/github.js +36 -0
  1100. package/worker/index.js +184 -0
  1101. package/worker/not-found.js +97 -0
  1102. package/worker/oauth.js +95 -0
  1103. package/worker/publish.js +52 -0
  1104. package/worker/push.js +270 -0
  1105. package/worker/r2-status.js +50 -0
  1106. package/worker/session.js +58 -0
@@ -0,0 +1,1302 @@
1
+ /* The standard theme: its base (Tailwind, the blocks, its components' classes) and its own look over it, Material 3. */
2
+ @import './base.css';
3
+ @import '@fontsource-variable/roboto';
4
+
5
+ /*
6
+ The standard theme's look, Material: the site in Material Design 3 (m3.material.io). Roboto and the M3 type scale (regular headlines,
7
+ medium titles and labels), the M3 shapes (below), tonal surfaces instead of lines, the M3 elevation levels and its emphasized easing; buttons
8
+ as wide as their label (filled and tonal) and lists in segments. The theme's own parts (the top app bar, the
9
+ navigation drawer, the FAB, the footer) are at the end.
10
+
11
+ The colours are the site's (src/data/colors.json, "Farver" in the editor), used by name as in the standard theme
12
+ and mapped to the M3 roles: primary = --accent, on-primary = --on-accent, surface (the page) = --bg, the surface
13
+ containers = --surface-container-low, --surface-container, --surface-container-high and --surface-container-highest,
14
+ on-surface = --ink, on-surface-variant = --muted, outline = --outline, outline variant = --line, the inverse colours
15
+ = --inverse-surface, --inverse-on-surface and --inverse-primary, and the error colours = --error, --on-error,
16
+ --error-container and --on-error-container. They are M3's own
17
+ when the colours are made from a source colour (dynamic colour), and every text on them keeps the contrast the editor
18
+ checks (colorPairs), in light and dark mode.
19
+ */
20
+ :root {
21
+ /* The surfaces and the outline, M3's roles as the site's colours ("Farver"): the page on the background, --surface
22
+ the lowest container, and the containers each a step towards the text's colour. */
23
+ --md-background: var(--bg);
24
+ --md-surface-container-lowest: var(--surface-container-lowest);
25
+ --md-surface-container-low: var(--surface-container-low);
26
+ --md-surface-container: var(--surface-container);
27
+ --md-surface-container-high: var(--surface-container-high);
28
+ --md-surface-container-highest: var(--surface-container-highest);
29
+ --md-outline: var(--outline);
30
+ /* State layers: on-surface (or primary) over the element, 8% pointed at, 10% pressed. */
31
+ --md-hover: color-mix(in srgb, var(--ink) 8%, transparent);
32
+ --md-pressed: color-mix(in srgb, var(--ink) 10%, transparent);
33
+ --md-primary-hover: color-mix(in srgb, var(--accent) 8%, transparent);
34
+ /* M3's elevation levels (m3.material.io/styles/elevation, as material-web draws them: a key and an ambient shadow),
35
+ the same in light and dark mode. Every part takes its M3 level from them by default (ui.css). */
36
+ --elevation-0: 0 0 #0000;
37
+ --elevation-1: 0 1px 2px rgb(0 0 0 / 0.3), 0 1px 3px 1px rgb(0 0 0 / 0.15);
38
+ --elevation-2: 0 1px 2px rgb(0 0 0 / 0.3), 0 2px 6px 2px rgb(0 0 0 / 0.15);
39
+ --elevation-3: 0 1px 3px rgb(0 0 0 / 0.3), 0 4px 8px 3px rgb(0 0 0 / 0.15);
40
+ --elevation-4: 0 2px 3px rgb(0 0 0 / 0.3), 0 6px 10px 4px rgb(0 0 0 / 0.15);
41
+ --elevation-5: 0 4px 4px rgb(0 0 0 / 0.3), 0 8px 12px 6px rgb(0 0 0 / 0.15);
42
+ /* The shade over the page behind a dialog, a sheet and the navigation drawer. */
43
+ --md-scrim: rgb(0 0 0 / 0.32);
44
+ /* M3's corner radius scale (m3.material.io/styles/shape/corner-radius-scale), its ten steps named for how round a
45
+ corner is. Every corner in the theme is one of them: a part's variable below maps it to its step, as M3's component
46
+ tokens do, also one corner at a time (a sheet's top, the inner corners of a split button or a menu's groups).
47
+ Changing a step (--md-shape-medium) changes every part mapped to it; changing a part's variable (--card-radius)
48
+ maps that part to another step. Optical roundness (outer radius - padding = inner radius) only where the theme's
49
+ own layout always puts something in its container's corner (a card's picture at its top: the card's corners);
50
+ never on something whose place is the block's or the content's, which keeps its own step. */
51
+ --md-shape-none: 0rem;
52
+ --md-shape-extra-small: 0.25rem;
53
+ --md-shape-small: 0.5rem;
54
+ --md-shape-medium: 0.75rem;
55
+ --md-shape-large: 1rem;
56
+ --md-shape-large-increased: 1.25rem;
57
+ --md-shape-extra-large: 1.75rem;
58
+ --md-shape-extra-large-increased: 2rem;
59
+ --md-shape-extra-extra-large: 3rem;
60
+ --md-shape-full: 9999px;
61
+
62
+ --radius: var(--md-shape-medium);
63
+ --shadow: var(--elevation-1);
64
+ /* The site's motion scheme's curve ("Bevægelse", @morphemecms/cms/lib/motion.ts). */
65
+ --ease: var(--motion-ease, cubic-bezier(0.2, 0, 0, 1));
66
+
67
+ --block-surface: var(--md-surface-container-low);
68
+ --block-radius: var(--md-shape-medium);
69
+ --block-control-radius: var(--md-shape-full);
70
+ --block-shadow: var(--elevation-1);
71
+ --block-ease: var(--ease);
72
+ /* Pictures in a list, a row, a step on the time line: large corners. */
73
+ --radius-small: var(--md-shape-large);
74
+
75
+ /* The standard theme's components (docs/editor.md, "Temaets variabler"). Dialogs (the cookie question, a pop-up):
76
+ extra-large increased corners, a high surface container, no line (the third elevation, as every dialog). */
77
+ --dialog-radius: var(--md-shape-extra-large-increased);
78
+ --dialog-surface: var(--md-surface-container-high);
79
+ --dialog-line: transparent;
80
+ --dialog-scrim: var(--md-scrim);
81
+ /* A bottom sheet (ui.css; a dialog on a computer): extra-large corners, the lowest surface container (also as a dialog,
82
+ as M3's on every screen), no lines, the scrim, the drag handle in on-surface-variant at 40% (the first elevation,
83
+ the third as a dialog, as every bottom sheet). */
84
+ --bottom-sheet-radius: var(--md-shape-extra-large);
85
+ --bottom-sheet-surface: var(--md-surface-container-low);
86
+ --bottom-sheet-line: transparent;
87
+ --bottom-sheet-scrim: var(--md-scrim);
88
+ --bottom-sheet-handle: color-mix(in srgb, var(--muted) 40%, transparent);
89
+ /* The carousel's page indicator: the dots in the outline, the chosen one a longer pill (in the primary colour). */
90
+ --carousel-dot-colour: var(--md-outline);
91
+ /* The carousel's items: extra-large corners, none on a full-screen one. */
92
+ --carousel-item-radius: var(--md-shape-extra-large);
93
+ --carousel-full-screen-radius: var(--md-shape-none);
94
+ --carousel-dot-selected-width: 1.5rem;
95
+ /* The large pictures at the top of a page, a blog post and the blog: extra-large corners. */
96
+ --theme-picture-radius: var(--md-shape-extra-large);
97
+ /* Chips (ui.css): 32px, 8px corners, an outline and no container; a chosen filter chip in the secondary container
98
+ with its check, not in the primary colour. */
99
+ --chip-height: 2rem;
100
+ --chip-padding: 0.375rem 1rem;
101
+ --chip-radius: var(--md-shape-small);
102
+ --chip-surface: transparent;
103
+ --chip-line: var(--md-outline);
104
+ --chip-hover-line: var(--md-outline);
105
+ --chip-hover-text: currentColor;
106
+ --chip-selected-surface: var(--tint);
107
+ --chip-selected-hover: color-mix(in srgb, var(--ink) 8%, var(--tint));
108
+ --chip-selected-text: var(--ink);
109
+ --chip-selected-check: block;
110
+ /* The page's headline: the M3 type scale (display small on a phone, display medium on a computer). */
111
+ /* The front page: its headline closer to the first section under it. */
112
+ --theme-home-first-space: 2.5rem;
113
+ --theme-home-first-space-large: 4rem;
114
+
115
+ /* Buttons (ui.css): M3's small size (40px), as wide as the label, full corners (or square), a label in medium weight; a text
116
+ button with less room at its sides; tonal in the secondary container, elevated on the lowest container with the
117
+ first elevation, outlined with M3's outline and its label in the primary colour. */
118
+ --button-height: 2.5rem;
119
+ --button-radius: var(--md-shape-full);
120
+ /* Square buttons and icon buttons by M3's size: medium corners on the small ones (40px, as these buttons), large on
121
+ the medium (56px: the hero's buttons on a computer, the medium icon button), extra-large on the large. */
122
+ --button-xsmall-square-radius: var(--md-shape-medium);
123
+ --button-small-square-radius: var(--md-shape-medium);
124
+ --button-square-radius: var(--md-shape-medium);
125
+ --button-large-square-radius: var(--md-shape-extra-large);
126
+ --button-xlarge-square-radius: var(--md-shape-extra-large);
127
+ --icon-button-medium-square-radius: var(--md-shape-large);
128
+ --button-padding: 1.5rem;
129
+ --button-gap: 0.5rem;
130
+ --button-font-size: var(--type-label-large-size);
131
+ --button-weight: var(--type-label-large-weight);
132
+ --button-letter-spacing: var(--type-label-large-tracking);
133
+ --button-small-height: 2.5rem;
134
+ --button-small-padding: 1rem;
135
+ --button-xsmall-height: 2.5rem;
136
+ --button-xsmall-padding: 1rem;
137
+ --button-xsmall-gap: 0.5rem;
138
+ --button-text-padding: 0.75rem;
139
+ --button-filled-hover: color-mix(in srgb, var(--on-accent) 8%, var(--accent));
140
+ --button-tonal-surface: var(--tint);
141
+ --button-tonal-text: var(--ink);
142
+ --button-tonal-hover: color-mix(in srgb, var(--ink) 8%, var(--tint));
143
+ --button-elevated-surface: var(--md-surface-container-low);
144
+ --button-elevated-text: var(--accent);
145
+ --button-outlined-surface: transparent;
146
+ --button-outlined-text: var(--accent);
147
+ --button-outlined-line: var(--md-outline);
148
+ --button-outlined-hover-text: var(--accent);
149
+ --button-outlined-hover-line: var(--md-outline);
150
+ --button-text-text: var(--accent);
151
+ --button-text-hover: var(--md-primary-hover);
152
+ /* Icon buttons: 48 by 48 with a 24px icon; standard in on-surface-variant without a container, tonal in the
153
+ secondary container (the cross on a pop-up, as it can stand on a picture). */
154
+ --icon-button-size: 3rem;
155
+ --icon-button-icon-size: 1.5rem;
156
+ --icon-button-standard-text: var(--muted);
157
+ --icon-button-tonal-surface: var(--tint);
158
+ --icon-button-tonal-text: var(--ink);
159
+ --icon-button-outlined-surface: transparent;
160
+ --icon-button-outlined-text: var(--muted);
161
+ --icon-button-outlined-line: var(--md-outline);
162
+ /* Text fields: 56px, 4px corners, the content 16px from the edges; outlined with M3's outline, on-surface when
163
+ pointed at and 2px in the primary colour while written in; filled in the highest container with an active
164
+ indicator under it (on-surface-variant, 2px in the primary colour while written in); what is wrong in the error
165
+ colour. The checkbox 18px, its name
166
+ after 16px (M3's 48px target around it). */
167
+ --text-field-height: 3.5rem;
168
+ --text-field-padding: 1rem;
169
+ --text-field-radius: var(--md-shape-extra-small);
170
+ --text-field-outlined-surface: transparent;
171
+ --text-field-outlined-line: var(--md-outline);
172
+ --text-field-outlined-hover-line: var(--ink);
173
+ --text-field-outlined-focus-line: var(--accent);
174
+ --text-field-filled-surface: var(--md-surface-container-highest);
175
+ --text-field-filled-line: var(--muted);
176
+ --text-field-filled-hover-line: var(--ink);
177
+ --text-field-filled-focus-line: var(--accent);
178
+ --text-field-label-surface: var(--md-background);
179
+ --text-field-error: var(--error);
180
+ --text-field-disabled-opacity: 0.38;
181
+ --checkbox-size: 1.125rem;
182
+ --checkbox-gap: 1rem;
183
+
184
+ /* Cards (ui.css): 12px corners; outlined on the surface with the outline variant, elevated on a low container with
185
+ the first elevation, filled on the highest container. */
186
+ --card-radius: var(--md-shape-medium);
187
+ --card-filled-surface: var(--md-surface-container-highest);
188
+ --card-outlined-surface: var(--surface);
189
+ --card-outlined-line: var(--line);
190
+ --card-elevated-surface: var(--md-surface-container-low);
191
+ /* Lists (M3 Expressive's list tokens): items 56, 72 and 88px high by their lines, 16px in from their sides, 10px over
192
+ and under their text and 12px between their elements, without lines between them; 20px icons; the headline in body
193
+ large, the supporting text in body medium, the overline and the trailing text in label small; a state layer in the
194
+ text's colour when pointed at (8%) and pressed (10%), nothing moving aside; disabled at 38%, a segmented item on a
195
+ 10% layer of the text's colour. Their corners extra-small, medium pointed at, large pressed and focused, large
196
+ increased selected; a selected one in the secondary container. Segmented: each item on a surface container (a step
197
+ up from the page, as Material's items on the surface over a container), 2px between them and the list's corners
198
+ large. */
199
+ --list-divider: transparent;
200
+ --list-item-min-height: 3.5rem;
201
+ --list-item-two-line-min-height: 4.5rem;
202
+ --list-item-three-line-min-height: 5.5rem;
203
+ --list-item-padding-block: 0.625rem;
204
+ --list-item-padding-inline: 1rem;
205
+ --list-item-gap: 0.75rem;
206
+ --list-item-radius: var(--md-shape-extra-small);
207
+ --list-item-hover-radius: var(--md-shape-medium);
208
+ --list-item-pressed-radius: var(--md-shape-large);
209
+ --list-item-selected-radius: var(--md-shape-large-increased);
210
+ --list-item-icon-size: 1.25rem;
211
+ --list-item-hover-surface: var(--md-hover);
212
+ --list-item-pressed-surface: var(--md-pressed);
213
+ --list-item-hover-text: var(--ink);
214
+ --list-item-hover-trailing-shift: 0;
215
+ --list-item-selected-surface: var(--secondary-container);
216
+ --list-item-selected-text: var(--on-secondary-container);
217
+ --list-item-selected-weight: 400;
218
+ --list-item-leading-icon-selected-color: var(--accent);
219
+ --list-item-disabled-opacity: 0.38;
220
+ --list-segmented-gap: 0.125rem;
221
+ --list-segmented-radius: var(--md-shape-large);
222
+ --list-segmented-inner-radius: var(--md-shape-extra-small);
223
+ --list-segmented-hover-radius: var(--md-shape-medium);
224
+ --list-segmented-pressed-radius: var(--md-shape-large);
225
+ --list-segmented-selected-radius: var(--md-shape-large-increased);
226
+ --list-segmented-padding-inline: 1rem;
227
+ --list-segmented-surface: var(--md-surface-container);
228
+ --list-segmented-hover-surface: var(--md-hover);
229
+ --list-segmented-pressed-surface: var(--md-pressed);
230
+ --list-segmented-disabled-surface: color-mix(in srgb, var(--ink) 10%, transparent);
231
+
232
+ /* The header's parts (ui.css): the top app bar on the background, in a surface container once the page scrolls under
233
+ it (M3 shows its second elevation there by that surface alone), without a line, a shadow or a blur. */
234
+ --top-app-bar-surface: var(--md-background);
235
+ --top-app-bar-stuck-surface: var(--md-surface-container);
236
+ --top-app-bar-line-width: 0;
237
+ --top-app-bar-backdrop: none;
238
+ --top-app-bar-stuck-shadow: none;
239
+ /* Menus: a surface container with small corners (its groups' inner corners extra-small), the second elevation, items 48px high, 112–280px wide, and
240
+ scrolling when higher than the screen; the open page in the secondary container. */
241
+ --menu-width: max-content;
242
+ --menu-min-width: 7rem;
243
+ --menu-max-width: 17.5rem;
244
+ --menu-max-height: calc(100dvh - 5rem);
245
+ --menu-radius: var(--md-shape-small);
246
+ --menu-group-inner-radius: var(--md-shape-extra-small);
247
+ --menu-surface: var(--md-surface-container);
248
+ --menu-line: transparent;
249
+ --menu-padding: 0.5rem 0;
250
+ --menu-item-height: 3rem;
251
+ --menu-item-padding: 0 0.75rem 0 1rem;
252
+ --menu-item-radius: var(--md-shape-none);
253
+ --menu-item-text: var(--ink);
254
+ --menu-item-hover-surface: var(--md-hover);
255
+ --menu-item-hover-text: var(--ink);
256
+ --menu-item-selected-surface: var(--tint);
257
+ --menu-item-selected-text: var(--ink);
258
+ --menu-item-selected-weight: 400;
259
+ /* Navigation drawers: from the left, large corners towards the page, a low surface container, M3's scrim; items 56px
260
+ high with a full active indicator in the secondary container, a label in medium weight. */
261
+ --navigation-drawer-width: min(22.5rem, 88vw);
262
+ --navigation-drawer-radius: var(--md-shape-none) var(--md-shape-large) var(--md-shape-large) var(--md-shape-none);
263
+ --navigation-drawer-surface: var(--md-surface-container-low);
264
+ --navigation-drawer-scrim: var(--md-scrim);
265
+ --navigation-drawer-item-height: 3.5rem;
266
+ --navigation-drawer-item-padding: 0 1.5rem 0 1rem;
267
+ --navigation-drawer-item-radius: var(--md-shape-full);
268
+ --navigation-drawer-item-text: var(--muted);
269
+ --navigation-drawer-item-hover: var(--md-hover);
270
+ --navigation-drawer-item-active-surface: var(--tint);
271
+ --navigation-drawer-item-active-text: var(--ink);
272
+ --navigation-drawer-item-active-weight: 500;
273
+ --navigation-drawer-row-gap: 0;
274
+ --navigation-drawer-toggle-size: 3rem;
275
+ --navigation-drawer-toggle-hover: var(--md-hover);
276
+ /* FABs: 56px high with large corners, the medium (80px) large increased, the large (96px) extra-large; the third
277
+ elevation, the fourth when pointed at, a state layer. The secondary
278
+ container is the theme's (--tint, as everywhere here). */
279
+ --fab-radius: var(--md-shape-large);
280
+ --fab-medium-radius: var(--md-shape-large-increased);
281
+ --fab-large-radius: var(--md-shape-extra-large);
282
+ --fab-primary-hover: color-mix(in srgb, var(--on-accent) 8%, var(--accent));
283
+ --fab-secondary-container-surface: var(--tint);
284
+ --fab-secondary-container-text: var(--ink);
285
+ --fab-secondary-container-hover: color-mix(in srgb, var(--ink) 8%, var(--tint));
286
+ /* The buttons that do more than one thing (ui.css, "Actions"), as M3's. Button groups 12px apart, or connected 2px
287
+ apart with small corners between them (extra-small for the extra-small buttons, large and large increased for the
288
+ large and extra-large); a toggle off in a surface container in on-surface-variant, on in the primary colour, with
289
+ medium corners in a standard group. Segmented buttons 40px high (the buttons' height) with the
290
+ outline and no container, the chosen in the secondary container with its check. Split buttons 2px apart with
291
+ extra-small corners between them (small for the large, medium for the extra-large). A FAB menu's actions as pills in the secondary container (the theme's --tint, below) and its
292
+ FAB a circle while open. */
293
+ --button-group-gap: 0.75rem;
294
+ --button-group-connected-gap: 0.125rem;
295
+ --button-group-xsmall-inner-radius: var(--md-shape-extra-small);
296
+ --button-group-inner-radius: var(--md-shape-small);
297
+ --button-group-large-inner-radius: var(--md-shape-large);
298
+ --button-group-xlarge-inner-radius: var(--md-shape-large-increased);
299
+ --button-group-selected-radius: var(--md-shape-medium);
300
+ --button-toggle-surface: var(--md-surface-container);
301
+ --button-toggle-text: var(--muted);
302
+ --button-toggle-hover: color-mix(in srgb, var(--muted) 8%, var(--md-surface-container));
303
+ --button-toggle-selected-surface: var(--accent);
304
+ --button-toggle-selected-text: var(--on-accent);
305
+ --button-toggle-selected-hover: color-mix(in srgb, var(--on-accent) 8%, var(--accent));
306
+ --segmented-button-surface: transparent;
307
+ --segmented-button-line: var(--md-outline);
308
+ --segmented-button-padding: 0.75rem;
309
+ --segmented-button-selected-surface: var(--tint);
310
+ --segmented-button-selected-text: var(--ink);
311
+ --segmented-button-selected-hover: color-mix(in srgb, var(--ink) 8%, var(--tint));
312
+ --segmented-button-radius: var(--md-shape-full);
313
+ --split-button-inner-radius: var(--md-shape-extra-small);
314
+ --split-button-large-inner-radius: var(--md-shape-small);
315
+ --split-button-xlarge-inner-radius: var(--md-shape-medium);
316
+ --fab-menu-close-radius: var(--md-shape-full);
317
+
318
+ /* Switches (ui.css): M3's 52 by 32 track, off in the highest container with a 2px outline and a 16px handle in the
319
+ outline (24px with its icon), on in the primary colour with a 24px handle in on-primary and its icon in the primary
320
+ colour, 28px while pressed, no shadow; 38% when it cannot be changed. */
321
+ --switch-width: 3.25rem;
322
+ --switch-height: 2rem;
323
+ --switch-track-surface: var(--md-surface-container-highest);
324
+ --switch-track-line: var(--md-outline);
325
+ --switch-track-line-width: 2px;
326
+ --switch-handle-size: 1rem;
327
+ --switch-handle-icon-size: 1.5rem;
328
+ --switch-handle-checked-size: 1.5rem;
329
+ --switch-handle-pressed-size: 1.75rem;
330
+ --switch-handle-surface: var(--md-outline);
331
+ --switch-handle-checked-surface: var(--on-accent);
332
+ --switch-handle-shadow: none;
333
+ --switch-icon-color: var(--md-surface-container-highest);
334
+ --switch-icon-checked-color: var(--accent);
335
+ --switch-disabled-opacity: 0.38;
336
+ /* Radio buttons: 20px, the name after 16px (M3's 48px target around it), as the checkbox. */
337
+ --radio-button-size: 1.25rem;
338
+ --radio-button-gap: 1rem;
339
+ --radio-group-label-weight: 500;
340
+ /* Sliders (M3 Expressive): a 16px track with small corners at its ends (medium, large and extra-large on the medium,
341
+ large and extra-large sliders) and 2px beside the handle, the active part in
342
+ the primary colour, the inactive in the secondary container, a 4 by 44 handle in the primary colour with 6px of room
343
+ on each side (2px wide while pressed) and its centre at least 8px from the track's ends, 4px stops, and the value over the handle in a 48 by 44 pill on the inverse
344
+ surface; 38% when it cannot be moved. */
345
+ --slider-height: 2.75rem;
346
+ --slider-track-height: 1rem;
347
+ --slider-track-radius: var(--md-shape-small);
348
+ --slider-medium-track-radius: var(--md-shape-medium);
349
+ --slider-large-track-radius: var(--md-shape-large);
350
+ --slider-xlarge-track-radius: var(--md-shape-extra-large);
351
+ --slider-track-inner-radius: 0.125rem;
352
+ --slider-track-gap: 0.5rem;
353
+ --slider-active-track: var(--accent);
354
+ --slider-inactive-track: var(--tint);
355
+ --slider-handle-width: 0.25rem;
356
+ --slider-handle-height: 2.75rem;
357
+ --slider-handle-radius: var(--md-shape-full);
358
+ --slider-handle-surface: var(--accent);
359
+ --slider-handle-line-width: 0;
360
+ --slider-handle-shadow: none;
361
+ --slider-handle-pressed-width: 0.125rem;
362
+ --slider-handle-inset: 0.375rem;
363
+ --slider-stop-color: var(--accent);
364
+ --slider-stop-active-color: var(--tint);
365
+ --slider-value-surface: var(--ink);
366
+ --slider-value-text: var(--surface);
367
+ --slider-value-radius: var(--md-shape-full);
368
+ --slider-value-room: 3rem;
369
+ --slider-disabled-opacity: 0.38;
370
+ /* Side sheets: a standard one on the page's surface with the outline variant between them, a modal one in a low
371
+ surface container with large corners towards the page, the first elevation and M3's scrim; the headline in title
372
+ large, a line in the outline variant over the actions. */
373
+ --side-sheet-surface: var(--md-background);
374
+ --side-sheet-modal-surface: var(--md-surface-container-low);
375
+ --side-sheet-radius: var(--md-shape-large);
376
+ /* A modal navigation rail: large corners towards the page, as the drawer. */
377
+ --navigation-rail-modal-radius: var(--md-shape-large);
378
+ --side-sheet-scrim: var(--md-scrim);
379
+
380
+ /* Communication (ui.css). A badge in the error colours. A snackbar: the inverse surface and its text, extra-small
381
+ corners, the third elevation, no blur; its action in the inverse primary with a state layer, the close icon in the
382
+ inverse surface's text colour. A plain tooltip the same surface with extra-small corners; a rich one on a surface container with medium corners, the second elevation and no line. A
383
+ linear progress indicator 4px high, a 4px gap before its track and the stop indicator at its end; a circular one
384
+ with a 4px gap. */
385
+ --snackbar-radius: var(--md-shape-extra-small);
386
+ --badge-radius: var(--md-shape-full);
387
+ --badge-surface: var(--error);
388
+ --badge-text: var(--on-error);
389
+ --snackbar-surface: var(--inverse-surface);
390
+ --snackbar-text: var(--inverse-on-surface);
391
+ --snackbar-padding-block: 0.875rem;
392
+ --snackbar-backdrop: none;
393
+ --snackbar-action-text: var(--inverse-primary);
394
+ --snackbar-action-hover: color-mix(in srgb, var(--inverse-primary) 8%, transparent);
395
+ --tooltip-plain-surface: var(--inverse-surface);
396
+ --tooltip-plain-text: var(--inverse-on-surface);
397
+ --tooltip-plain-radius: var(--md-shape-extra-small);
398
+ --tooltip-rich-surface: var(--md-surface-container);
399
+ --tooltip-rich-text: var(--muted);
400
+ --tooltip-rich-subhead: var(--ink);
401
+ --tooltip-rich-radius: var(--md-shape-medium);
402
+ --tooltip-rich-line: transparent;
403
+ --linear-progress-indicator-height: 0.25rem;
404
+ --linear-progress-indicator-radius: var(--md-shape-full);
405
+ --linear-progress-indicator-stop-size: 0.25rem;
406
+ --circular-progress-indicator-gap: 7;
407
+ /* The navigation bar: 64px (M3 Expressive), in a surface container without a line, the active indicator 56 × 32 in the
408
+ secondary container, the labels in label medium. */
409
+ --navigation-bar-height: 4rem;
410
+ --navigation-bar-surface: var(--md-surface-container);
411
+ --navigation-bar-line: transparent;
412
+ --navigation-bar-item-text: var(--muted);
413
+ --navigation-bar-item-selected-text: var(--ink);
414
+ --navigation-bar-indicator-width: 3.5rem;
415
+ --navigation-bar-indicator-radius: var(--md-shape-full);
416
+ --navigation-bar-indicator-surface: var(--tint);
417
+ --navigation-bar-indicator-text: var(--ink);
418
+ --navigation-bar-indicator-hover: var(--md-hover);
419
+ --navigation-bar-label-selected-weight: 500;
420
+ /* The navigation rail: 96px collapsed and 220px wide, on the page's background without a line, the same indicator
421
+ (56px high when wide), the labels in label medium, wide in label large. */
422
+ --navigation-rail-width: 6rem;
423
+ --navigation-rail-expanded-width: 13.75rem;
424
+ --navigation-rail-padding: 1.5rem 0.5rem;
425
+ --navigation-rail-surface: var(--md-background);
426
+ --navigation-rail-line: transparent;
427
+ --navigation-rail-item-text: var(--muted);
428
+ --navigation-rail-item-selected-text: var(--ink);
429
+ --navigation-rail-indicator-radius: var(--md-shape-full);
430
+ --navigation-rail-indicator-surface: var(--tint);
431
+ --navigation-rail-indicator-text: var(--ink);
432
+ --navigation-rail-indicator-hover: var(--md-hover);
433
+ --navigation-rail-label-selected-weight: 500;
434
+ /* Search: the bar 56px, full corners, in the high surface container with a state layer; the view in it too, docked
435
+ with extra-large corners and the third elevation, with a divider under its header. */
436
+ --search-bar-height: 3.5rem;
437
+ --search-bar-radius: var(--md-shape-full);
438
+ --search-bar-padding: 1rem;
439
+ --search-bar-gap: 1rem;
440
+ --search-bar-surface: var(--md-surface-container-high);
441
+ --search-bar-line: transparent;
442
+ --search-bar-hover: color-mix(in srgb, var(--ink) 8%, var(--md-surface-container-high));
443
+ --search-bar-placeholder: var(--muted);
444
+ --search-view-surface: var(--md-surface-container-high);
445
+ --search-view-radius: var(--md-shape-extra-large);
446
+ --search-view-line: transparent;
447
+ --search-view-divider: var(--line);
448
+ --search-view-results-padding: 0.5rem 0;
449
+ --search-view-option-surface: var(--md-hover);
450
+ /* Toolbars (M3 Expressive): in a surface container, docked without a line or blur, floating with full corners and
451
+ the third elevation;
452
+ vibrant in the primary colour. */
453
+ --toolbar-standard-surface: var(--md-surface-container);
454
+ --toolbar-docked-line-width: 0;
455
+ --toolbar-docked-backdrop: none;
456
+ --toolbar-floating-line: transparent;
457
+ --toolbar-floating-radius: var(--md-shape-full);
458
+ /* Date pickers: the dialog's high surface container and third elevation, a docked one with large corners; the
459
+ headline regular in the headline-large size, the month and year and the supporting text in on-surface-variant, the
460
+ line under the header in outline variant; days in 40px circles with a state layer, the range's band in the
461
+ secondary container. */
462
+ --date-picker-docked-radius: var(--md-shape-large);
463
+ --date-picker-day-radius: var(--md-shape-full);
464
+ --date-picker-supporting-color: var(--muted);
465
+ --date-picker-menu-button-text: var(--muted);
466
+ --date-picker-day-hover: var(--md-hover);
467
+ --date-picker-range-surface: var(--tint);
468
+ /* Time pickers: the boxes 96 × 80 with small corners and display-large numbers in the highest surface container, the
469
+ one on the dial in the secondary container, and the 256px dial in the highest surface container. */
470
+ --time-picker-headline-color: var(--muted);
471
+ --time-picker-box-radius: var(--md-shape-small);
472
+ --time-picker-box-surface: var(--md-surface-container-highest);
473
+ --time-picker-box-selected-surface: var(--tint);
474
+ --time-picker-box-selected-text: var(--ink);
475
+ --time-picker-dial-surface: var(--md-surface-container-highest);
476
+ }
477
+
478
+ /* The same elevation in dark mode (the standard theme's shadow there is another). */
479
+ @media (prefers-color-scheme: dark) {
480
+ :root:not([data-theme='light']) {
481
+ --shadow: var(--elevation-1);
482
+ }
483
+ }
484
+ :root[data-theme='dark'] {
485
+ --shadow: var(--elevation-1);
486
+ }
487
+
488
+ @theme inline {
489
+ --font-sans: 'Roboto Variable', Roboto, ui-sans-serif, system-ui, sans-serif;
490
+ }
491
+
492
+ @layer base {
493
+ body {
494
+ background: var(--md-background);
495
+ }
496
+ :focus-visible {
497
+ outline: 3px solid var(--accent);
498
+ outline-offset: 2px;
499
+ border-radius: var(--md-shape-extra-small);
500
+ }
501
+ }
502
+
503
+ @layer components {
504
+ /* Common buttons (their variables above): a state layer when pointed at (the ripple when pressed; their elevation is
505
+ ui.css's, at M3's levels), and the corners a little squarer while pressed (M3 Expressive).
506
+ Side by side, wrapping, also on a phone. */
507
+ .block-buttons {
508
+ flex-direction: row;
509
+ flex-wrap: wrap;
510
+ align-items: center;
511
+ }
512
+ .button {
513
+ transition:
514
+ background-color var(--motion-effects),
515
+ color var(--motion-effects),
516
+ box-shadow var(--motion-effects),
517
+ border-radius var(--motion-spatial-fast);
518
+ }
519
+ .button:active {
520
+ transform: none;
521
+ border-radius: var(--md-shape-medium);
522
+ }
523
+ .button-outlined:hover {
524
+ background: var(--md-primary-hover);
525
+ }
526
+ .button-text:focus-visible {
527
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
528
+ }
529
+ /* A text button reaches 48px for a finger, above and below it. */
530
+ .button-text {
531
+ position: relative;
532
+ }
533
+ .button-text::after {
534
+ content: '';
535
+ position: absolute;
536
+ inset: -0.25rem 0;
537
+ }
538
+ /* An M3 button's icon stands before its label: the arrow after a button's text is not shown. */
539
+ .button-trailing-icon {
540
+ display: none;
541
+ }
542
+ /* The hero's buttons: small (40px) on a phone, so two fit side by side, medium (56px, a larger label) from a
543
+ tablet. */
544
+ @media (min-width: 48rem) {
545
+ .block-hero {
546
+ --button-height: 3.5rem;
547
+ --button-square-radius: var(--md-shape-large);
548
+ --button-padding: 1.75rem;
549
+ --button-font-size: var(--type-title-medium-size);
550
+ --button-weight: var(--type-title-medium-weight);
551
+ --button-letter-spacing: var(--type-title-medium-tracking);
552
+ }
553
+ .block-hero .button:active {
554
+ border-radius: var(--md-shape-large);
555
+ }
556
+ }
557
+ /* A link with an arrow on its own ("Læs mere", "Alle indlæg"), and "Læs mere" on a testimonial: text buttons, a
558
+ label in the primary colour with a state layer, the label in line with the text beside it. */
559
+ .block-arrow-link,
560
+ .block-testimonial-more {
561
+ min-height: 2.5rem;
562
+ margin-inline: -0.75rem;
563
+ border-radius: var(--md-shape-full);
564
+ padding: 0 0.75rem;
565
+ font-size: var(--type-label-large-size);
566
+ line-height: var(--type-label-large-line-height);
567
+ font-weight: var(--type-label-large-weight);
568
+ letter-spacing: var(--type-label-large-tracking);
569
+ transition: background-color var(--motion-effects);
570
+ }
571
+ .block-arrow-link:hover,
572
+ .block-testimonial-more:hover {
573
+ background: var(--md-primary-hover);
574
+ }
575
+ .block-arrow-link:active,
576
+ .block-testimonial-more:active {
577
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
578
+ }
579
+ .block-testimonial-more {
580
+ cursor: pointer;
581
+ }
582
+ /* Chips (their variables above): a label in medium weight, a state layer when pointed at; a chosen filter chip with
583
+ its 18px check before the label, 8px from the edge. */
584
+ .chip {
585
+ transition:
586
+ background-color var(--motion-effects),
587
+ box-shadow var(--motion-effects);
588
+ }
589
+ .chip:hover {
590
+ background: var(--md-hover);
591
+ }
592
+ .chip-elevated:hover {
593
+ background: color-mix(in srgb, var(--ink) 8%, var(--chip-elevated-surface, var(--block-surface)));
594
+ }
595
+ .chip-filter:is([aria-pressed='true'], [aria-current='page']) {
596
+ padding-left: 0.5rem;
597
+ }
598
+ .block-tag {
599
+ border-radius: var(--md-shape-small);
600
+ background: var(--tint);
601
+ }
602
+
603
+ /* Text fields (their variables above): the filled one's corners square at the bottom, along its active indicator,
604
+ which is 2px in the primary colour while it is written in or wrong. */
605
+ .text-field-filled .text-field-container {
606
+ border-radius: var(--md-shape-extra-small) var(--md-shape-extra-small) var(--md-shape-none) var(--md-shape-none);
607
+ }
608
+ .text-field-filled .text-field-container:hover {
609
+ background: color-mix(in srgb, var(--ink) 8%, var(--md-surface-container-highest));
610
+ }
611
+ .text-field-filled .text-field-container:has(> .text-field-input:focus) {
612
+ box-shadow: inset 0 -2px 0 var(--accent);
613
+ }
614
+ .text-field-filled.text-field-error .text-field-container,
615
+ .text-field-filled.text-field-error .text-field-container:hover,
616
+ .text-field-filled.text-field-error .text-field-container:has(> .text-field-input:focus) {
617
+ box-shadow: inset 0 -2px 0 var(--text-field-error, var(--accent));
618
+ }
619
+
620
+ /* An M3 checkbox: an 18px box with a 2px edge in on-surface-variant and 2px corners, filled in the primary colour
621
+ with the theme's tick in on-primary when ticked, in a round state layer (40px) when pointed at, 38% when it cannot
622
+ be changed. */
623
+ .checkbox-box {
624
+ width: 2.5rem;
625
+ height: 2.5rem;
626
+ margin: -0.5rem -0.6875rem -0.6875rem;
627
+ border-radius: var(--md-shape-full);
628
+ transition: background-color var(--motion-effects);
629
+ }
630
+ .checkbox:hover .checkbox-box {
631
+ background: var(--md-hover);
632
+ }
633
+ .checkbox:has(.checkbox-input:disabled):hover .checkbox-box {
634
+ background: transparent;
635
+ }
636
+ .checkbox-input {
637
+ appearance: none;
638
+ width: 1.125rem;
639
+ height: 1.125rem;
640
+ border: 2px solid var(--muted);
641
+ border-radius: 2px;
642
+ transition:
643
+ background-color var(--motion-effects),
644
+ border-color var(--motion-effects);
645
+ }
646
+ .checkbox-input:checked {
647
+ border-color: var(--accent);
648
+ background: var(--accent);
649
+ }
650
+ .checkbox-input:checked + .checkbox-icon {
651
+ display: block;
652
+ color: var(--on-accent);
653
+ }
654
+ .checkbox-input:focus-visible {
655
+ outline: 3px solid var(--accent);
656
+ outline-offset: 2px;
657
+ }
658
+ .checkbox-box:has(.checkbox-input:disabled) {
659
+ opacity: 0.38;
660
+ }
661
+
662
+ /* An M3 switch (its variables above): a round state layer (40px) around the handle when pointed at, in the primary
663
+ colour when on; the handle off in on-surface-variant when pointed at or pressed. */
664
+ .switch-handle::before {
665
+ content: '';
666
+ position: absolute;
667
+ top: 50%;
668
+ left: 50%;
669
+ width: 2.5rem;
670
+ height: 2.5rem;
671
+ border-radius: var(--md-shape-full);
672
+ translate: -50% -50%;
673
+ transition: background-color var(--motion-effects);
674
+ }
675
+ .switch:hover .switch-input:enabled + .switch-handle::before {
676
+ background: var(--md-hover);
677
+ }
678
+ .switch:hover .switch-input:enabled:checked + .switch-handle::before {
679
+ background: var(--md-primary-hover);
680
+ }
681
+ .switch:hover .switch-input:enabled:not(:checked) + .switch-handle,
682
+ .switch-input:enabled:active:not(:checked) + .switch-handle {
683
+ background: var(--muted);
684
+ }
685
+ .switch-input:focus-visible {
686
+ outline: 3px solid var(--accent);
687
+ outline-offset: 2px;
688
+ }
689
+
690
+ /* An M3 radio button: a 20px ring in on-surface-variant, chosen in the primary colour with a 10px dot in it, in a
691
+ round state layer (40px) when pointed at, 38% when it cannot be chosen. */
692
+ .radio-button-box {
693
+ width: 2.5rem;
694
+ height: 2.5rem;
695
+ margin: -0.5rem -0.625rem -0.625rem;
696
+ border-radius: var(--md-shape-full);
697
+ transition: background-color var(--motion-effects);
698
+ }
699
+ .radio-button:hover .radio-button-box {
700
+ background: var(--md-hover);
701
+ }
702
+ .radio-button:has(.radio-button-input:disabled):hover .radio-button-box {
703
+ background: transparent;
704
+ }
705
+ .radio-button-input {
706
+ appearance: none;
707
+ border: 2px solid var(--muted);
708
+ border-radius: var(--md-shape-full);
709
+ transition: border-color var(--motion-effects);
710
+ }
711
+ .radio-button-input:checked {
712
+ border-color: var(--accent);
713
+ background: radial-gradient(circle closest-side, var(--accent) 62.5%, transparent calc(62.5% + 0.5px));
714
+ }
715
+ .radio-button-input:focus-visible {
716
+ outline: 3px solid var(--accent);
717
+ outline-offset: 2px;
718
+ border-radius: var(--md-shape-full);
719
+ }
720
+ .radio-button-box:has(.radio-button-input:disabled) {
721
+ opacity: 0.38;
722
+ }
723
+
724
+ /* An M3 slider's value: label large in its pill. */
725
+ .slider-value {
726
+ min-width: 3rem;
727
+ padding: 0.75rem 1rem;
728
+ }
729
+
730
+ /* An M3 side sheet's headline in on-surface-variant. */
731
+ .side-sheet-headline {
732
+ color: var(--muted);
733
+ }
734
+
735
+ /* Icon buttons (their variables above): a state layer when pointed at (the ripple when pressed), no shrinking. The
736
+ cross on a sheet is 40 by 40 with a 22px icon. */
737
+ .icon-button {
738
+ transition: background-color var(--motion-effects);
739
+ }
740
+ .icon-button:active {
741
+ transform: none;
742
+ }
743
+ .icon-button-standard:hover,
744
+ .icon-button-outlined:hover {
745
+ background: var(--md-hover);
746
+ color: var(--muted);
747
+ }
748
+ .icon-button-outlined:hover {
749
+ box-shadow: inset 0 0 0 1px var(--md-outline);
750
+ }
751
+ .icon-button-tonal:hover {
752
+ background: color-mix(in srgb, var(--ink) 8%, var(--tint));
753
+ }
754
+ /* On a snackbar (the inverse surface): the state layers in its colours. */
755
+ .snackbar .button-text:focus-visible {
756
+ background: color-mix(in srgb, var(--inverse-primary) 10%, transparent);
757
+ }
758
+ .snackbar .icon-button-standard:hover {
759
+ background: color-mix(in srgb, var(--inverse-on-surface) 8%, transparent);
760
+ color: var(--inverse-on-surface);
761
+ }
762
+ .bottom-sheet-header {
763
+ --icon-button-size: 2.5rem;
764
+ --icon-button-icon-size: 1.375rem;
765
+ }
766
+
767
+ /* "Besked": a filled card in the secondary container. */
768
+ .block-notice {
769
+ border-left: 0;
770
+ border-radius: var(--md-shape-medium);
771
+ background: var(--tint);
772
+ padding: 1rem 1.5rem;
773
+ }
774
+
775
+ /* "Trin": the numbers in the primary container. */
776
+ .block-step-number {
777
+ background: var(--tint);
778
+ color: var(--accent);
779
+ }
780
+
781
+ /* "Spørgsmål og svar": a list in a filled card, a state layer on a row pointed at. */
782
+ .block-accordion {
783
+ display: grid;
784
+ gap: 2px;
785
+ background: transparent;
786
+ box-shadow: none;
787
+ }
788
+ .block-accordion > * {
789
+ overflow: hidden;
790
+ border-radius: var(--md-shape-extra-small);
791
+ background: var(--md-surface-container);
792
+ }
793
+ .block-accordion > :not(:last-child) {
794
+ border-bottom: 0;
795
+ }
796
+ .block-accordion > :first-child {
797
+ border-top-left-radius: var(--md-shape-large);
798
+ border-top-right-radius: var(--md-shape-large);
799
+ }
800
+ .block-accordion > :last-child {
801
+ border-bottom-left-radius: var(--md-shape-large);
802
+ border-bottom-right-radius: var(--md-shape-large);
803
+ }
804
+ .block-accordion-label {
805
+ padding: 1rem 1.5rem;
806
+ transition:
807
+ background-color var(--motion-effects),
808
+ color var(--motion-effects);
809
+ }
810
+ .block-accordion-body {
811
+ padding: 0 1.5rem 1.5rem;
812
+ }
813
+ @media (hover: hover) {
814
+ summary.block-accordion-label:hover {
815
+ background: var(--md-hover);
816
+ color: inherit;
817
+ }
818
+ }
819
+
820
+ /* "Hero": a large picture with extra-large corners. */
821
+ .block-hero-picture {
822
+ border-radius: var(--md-shape-extra-large);
823
+ }
824
+ /* The quote: a filled card. */
825
+ .block-hero-note > blockquote {
826
+ border: 0;
827
+ border-radius: var(--md-shape-large);
828
+ background: var(--tint);
829
+ padding: 1rem 1.25rem;
830
+ }
831
+
832
+ /* "Kort": filled cards, as Material 3's (their outlined cards on the highest container, without the edge or a
833
+ shadow, also when pointed at), with a state layer when pointed at. */
834
+ .block-card {
835
+ border: 0;
836
+ --card-outlined-surface: var(--md-surface-container-highest);
837
+ --card-outlined-hover-shadow: var(--elevation-0);
838
+ transition: background-color var(--motion-effects);
839
+ }
840
+ .block-card-picture {
841
+ border-radius: var(--card-radius) var(--card-radius) var(--md-shape-none) var(--md-shape-none);
842
+ }
843
+ .block-card-text {
844
+ font-weight: 400;
845
+ }
846
+ @media (hover: hover) {
847
+ a.block-card:hover {
848
+ --card-outlined-surface: color-mix(in srgb, var(--ink) 8%, var(--md-surface-container-highest));
849
+ }
850
+ }
851
+
852
+ /* Panels and the cards of testimonials and prices: outlined, filled and elevated cards (their variables above). A
853
+ list in a panel reaches out to its sides, so its items' text is in line with the panel's. */
854
+ .block-panel > .list {
855
+ margin-inline: -1rem;
856
+ }
857
+ .block-testimonial {
858
+ --card-outlined-surface: var(--md-surface-container);
859
+ --card-outlined-line: transparent;
860
+ }
861
+ /* No quotation mark: a glyph of the font, not one of the theme's icons. */
862
+ .block-testimonial-quote-mark {
863
+ display: none;
864
+ }
865
+
866
+ /* An invitation: a filled card with extra-large corners, its picture with large corners (where it stands is the
867
+ block's, so it takes no optical roundness from the card). */
868
+ .block-cta {
869
+ --card-radius: var(--md-shape-extra-large);
870
+ --card-padding: 1.5rem;
871
+ }
872
+ .block-cta-title {
873
+ font-size: var(--type-headline-small-size);
874
+ line-height: var(--type-headline-small-line-height);
875
+ font-weight: var(--type-headline-small-weight);
876
+ letter-spacing: var(--type-headline-small-tracking);
877
+ }
878
+ .block-cta-picture {
879
+ border-radius: var(--md-shape-large);
880
+ }
881
+ @media (min-width: 48rem) {
882
+ .block-cta {
883
+ --card-padding: 2rem;
884
+ }
885
+ }
886
+
887
+ /* A link that is one row: a list item in a card, a state layer when pointed at. */
888
+ .block-link-row {
889
+ --card-radius: var(--md-shape-medium);
890
+ --card-outlined-surface: var(--md-surface-container-low);
891
+ --card-outlined-line: transparent;
892
+ transition: background-color var(--motion-effects);
893
+ }
894
+ a.block-link-row:hover {
895
+ --card-outlined-surface: color-mix(in srgb, var(--ink) 8%, var(--md-surface-container-low));
896
+ --card-outlined-line: transparent;
897
+ }
898
+
899
+ /* A bottom sheet (its variables above): a 32 by 4 drag handle, the headline in M3's headline small. */
900
+ .bottom-sheet-drag-handle {
901
+ padding: 1.375rem 0 0.75rem;
902
+ }
903
+ .bottom-sheet-drag-handle::before {
904
+ width: 2rem;
905
+ height: 0.25rem;
906
+ }
907
+ @media (width >= 48rem) {
908
+ .bottom-sheet-header {
909
+ padding: 1.5rem 1.5rem 0.75rem;
910
+ }
911
+ }
912
+
913
+ /* The editor's drawing of the bar at the bottom of a phone's screen (components.css): without a frame, rounded. */
914
+ .theme-action-bar-drawn {
915
+ border: 0;
916
+ border-radius: var(--md-shape-medium);
917
+ }
918
+
919
+ /* The carousel's page indicator (its variables above): the dots half seen through, the chosen one wholly. */
920
+ .carousel-indicator-dot > span {
921
+ opacity: 0.5;
922
+ }
923
+ .carousel-indicator-dot[aria-current='true'] > span {
924
+ opacity: 1;
925
+ }
926
+
927
+ /* The buttons that do more than one thing (their variables above): the ripple when pressed; a split button's
928
+ corners between its two halves a little rounder while pressed, the outer ones as they are; 38% when a segment
929
+ cannot be used (M3). A FAB menu's actions in the secondary container, as pills. */
930
+ .segmented-button-segment:disabled {
931
+ opacity: 0.38;
932
+ }
933
+ .split-button > .button:active {
934
+ border-radius: var(--block-control-radius);
935
+ }
936
+ .split-button > .split-button-leading:active {
937
+ border-start-end-radius: var(--md-shape-small);
938
+ border-end-end-radius: var(--md-shape-small);
939
+ }
940
+ .split-button > .split-button-trailing:active {
941
+ border-start-start-radius: var(--md-shape-small);
942
+ border-end-start-radius: var(--md-shape-small);
943
+ }
944
+ .split-button > .split-button-trailing[aria-expanded='true']:active {
945
+ border-radius: var(--block-control-radius);
946
+ }
947
+ .fab-menu-list {
948
+ --fab-radius: var(--md-shape-full);
949
+ --fab-primary-container-surface: var(--tint);
950
+ --fab-primary-container-text: var(--ink);
951
+ --fab-primary-container-hover: color-mix(in srgb, var(--ink) 8%, var(--tint));
952
+ }
953
+ }
954
+
955
+ /* Long text: pictures with large corners. */
956
+ .prose :where(img):not(:where(.not-prose img)),
957
+ .picture-crop,
958
+ .prose :where(iframe) {
959
+ border-radius: var(--md-shape-large);
960
+ }
961
+
962
+ /* The mark before the name on a testimonial without a picture: an avatar, a circle in the highest surface container
963
+ (it stands on a container) with the name's first letter (data-initial, Testimonial.tsx), as Material's avatars
964
+ without a picture, not the standard theme's dot. */
965
+ .block-testimonial-mark {
966
+ display: grid;
967
+ width: 2.5rem;
968
+ height: 2.5rem;
969
+ place-items: center;
970
+ border-radius: var(--md-shape-full);
971
+ background: var(--md-surface-container-highest);
972
+ color: var(--ink);
973
+ font-size: var(--type-title-medium-size);
974
+ font-weight: var(--type-title-medium-weight);
975
+ letter-spacing: var(--type-title-medium-tracking);
976
+ line-height: 1;
977
+ }
978
+ .block-testimonial-mark::before {
979
+ content: attr(data-initial);
980
+ }
981
+
982
+ /* The Material theme's own parts (components/Header.astro, MobileMenu.tsx, Footer.astro). */
983
+
984
+ /* The top app bar (its variables above, Header.astro): 64px high, above the cookie banner, so its menus are too. */
985
+ /* The menu's items: a label in medium weight, a state layer, the open page in an active indicator (the secondary
986
+ container). 40px high, and 48px to touch. */
987
+ .md-nav-item,
988
+ .md-nav-toggle {
989
+ position: relative;
990
+ }
991
+ .md-nav-item::after {
992
+ content: '';
993
+ position: absolute;
994
+ inset: -0.25rem 0;
995
+ }
996
+ .md-nav-toggle::after {
997
+ content: '';
998
+ position: absolute;
999
+ inset: -0.25rem -0.125rem -0.25rem -0.5rem;
1000
+ }
1001
+ .md-nav-item {
1002
+ display: inline-flex;
1003
+ min-height: 2.5rem;
1004
+ align-items: center;
1005
+ gap: 0.25rem;
1006
+ border-radius: var(--md-shape-full);
1007
+ padding: 0 1rem;
1008
+ white-space: nowrap;
1009
+ color: var(--muted);
1010
+ font-size: var(--type-label-large-size);
1011
+ line-height: var(--type-label-large-line-height);
1012
+ font-weight: var(--type-label-large-weight);
1013
+ letter-spacing: var(--type-label-large-tracking);
1014
+ transition:
1015
+ background-color var(--motion-effects),
1016
+ color var(--motion-effects);
1017
+ }
1018
+ .md-nav-item:hover {
1019
+ background: var(--md-hover);
1020
+ color: var(--ink);
1021
+ }
1022
+ .md-nav-item:focus-visible,
1023
+ .md-nav-item:active {
1024
+ background: var(--md-pressed);
1025
+ color: var(--ink);
1026
+ }
1027
+ /* An item with sub-pages: its label, then the button that opens them. */
1028
+ .md-nav-item-parent {
1029
+ padding-right: 0.25rem;
1030
+ }
1031
+ .md-nav-toggle {
1032
+ display: grid;
1033
+ width: 2rem;
1034
+ height: 2.5rem;
1035
+ place-items: center;
1036
+ border-radius: var(--md-shape-full);
1037
+ color: var(--muted);
1038
+ transition:
1039
+ background-color var(--motion-effects),
1040
+ color var(--motion-effects);
1041
+ }
1042
+ .md-nav-toggle:hover {
1043
+ background: var(--md-hover);
1044
+ color: var(--ink);
1045
+ }
1046
+ .md-nav-toggle:focus-visible,
1047
+ .md-nav-toggle:active {
1048
+ background: var(--md-pressed);
1049
+ color: var(--ink);
1050
+ }
1051
+ .md-nav-toggle > svg {
1052
+ transition: transform var(--motion-spatial-fast);
1053
+ }
1054
+ .md-nav-toggle[aria-expanded='true'] > svg {
1055
+ transform: rotate(180deg);
1056
+ }
1057
+ .md-nav-item[aria-current='page'],
1058
+ li:has(.menu-item[aria-current='page']) > .md-nav-item {
1059
+ background: var(--tint);
1060
+ color: var(--ink);
1061
+ }
1062
+ /* A menu (its variables above): a state layer with focus from the keyboard (the ripple when pressed), and the open page
1063
+ in the secondary container also when pointed at. */
1064
+ .menu-item:focus-visible {
1065
+ background: var(--md-pressed);
1066
+ }
1067
+ .menu-item[aria-current='page']:hover {
1068
+ background: var(--tint);
1069
+ }
1070
+
1071
+ /* The extended FAB (its variables above, Header.astro): at the bottom right of the screen, with the ripple when pressed. It
1072
+ shows only its icon while the page scrolls down (data-collapsed). */
1073
+ [data-fab] {
1074
+ position: fixed;
1075
+ right: max(1rem, env(safe-area-inset-right));
1076
+ bottom: max(1rem, env(safe-area-inset-bottom));
1077
+ z-index: 30;
1078
+ }
1079
+ @media (min-width: 48rem) {
1080
+ [data-fab] {
1081
+ right: 1.5rem;
1082
+ bottom: 1.5rem;
1083
+ }
1084
+ }
1085
+ /* In the navigation drawer: at the top, in the secondary container, lowered (as in a Google app): M3's lowered FAB, at
1086
+ the first elevation and the second when pointed at. */
1087
+ .navigation-drawer > .extended-fab {
1088
+ --fab-shadow: var(--elevation-1);
1089
+ --fab-hover-shadow: var(--elevation-2);
1090
+ margin: 0.25rem 0 0.75rem 0.5rem;
1091
+ align-self: flex-start;
1092
+ }
1093
+ /* On a phone with a bar at the bottom of the screen (a docked toolbar, components.css), the page's FAB is not shown; the
1094
+ bar's buttons are the common buttons, round and as everywhere else (only pressed a little squarer), the filled one to
1095
+ the right, after the outlined one or the text. */
1096
+ @media (width < 48rem) {
1097
+ body:has(.theme-action-bar) [data-fab] {
1098
+ display: none;
1099
+ }
1100
+ }
1101
+ :is(.theme-action-bar, .theme-action-bar-drawn) > .button-filled {
1102
+ order: 2;
1103
+ }
1104
+
1105
+ /* The modal navigation drawer (its variables above, MobileMenu.tsx): room inside it; nothing in it is squeezed when its
1106
+ content is higher than the screen, the drawer scrolls instead. */
1107
+ .navigation-drawer {
1108
+ padding: 0.75rem 0.75rem max(1rem, env(safe-area-inset-bottom));
1109
+ }
1110
+ .navigation-drawer > * {
1111
+ flex-shrink: 0;
1112
+ }
1113
+ .md-drawer-head {
1114
+ display: flex;
1115
+ align-items: center;
1116
+ gap: 0.75rem;
1117
+ padding: 0.25rem 0 1rem 1rem;
1118
+ }
1119
+ .md-drawer-name {
1120
+ font-size: var(--type-title-medium-size);
1121
+ line-height: var(--type-title-medium-line-height);
1122
+ font-weight: var(--type-title-medium-weight);
1123
+ letter-spacing: var(--type-title-medium-tracking);
1124
+ }
1125
+ .md-drawer-role {
1126
+ color: var(--muted);
1127
+ font-size: var(--type-body-medium-size);
1128
+ line-height: var(--type-body-medium-line-height);
1129
+ font-weight: var(--type-body-medium-weight);
1130
+ letter-spacing: var(--type-body-medium-tracking);
1131
+ }
1132
+ .navigation-drawer-item:focus-visible {
1133
+ background: var(--md-pressed);
1134
+ }
1135
+ /* An item with sub-pages: its link and the caret in one row, the active indicator around both. */
1136
+ .navigation-drawer-row {
1137
+ border-radius: var(--md-shape-full);
1138
+ transition: background-color var(--motion-effects);
1139
+ }
1140
+ .navigation-drawer-row > .navigation-drawer-item,
1141
+ .navigation-drawer-row > .navigation-drawer-item:hover {
1142
+ background: none;
1143
+ }
1144
+ .navigation-drawer-row:has(> .navigation-drawer-item:hover) {
1145
+ background: var(--md-hover);
1146
+ }
1147
+ .navigation-drawer-row:has(> .navigation-drawer-item:focus-visible) {
1148
+ background: var(--md-pressed);
1149
+ }
1150
+ .navigation-drawer-row[data-active] {
1151
+ background: var(--tint);
1152
+ }
1153
+ .navigation-drawer-row[data-active] > .navigation-drawer-item {
1154
+ color: var(--ink);
1155
+ }
1156
+ .navigation-drawer-row[data-active]:has(> .navigation-drawer-item:hover) {
1157
+ background: color-mix(in srgb, var(--ink) 8%, var(--tint));
1158
+ }
1159
+ .navigation-drawer-row[data-active]:has(> .navigation-drawer-item:focus-visible) {
1160
+ background: color-mix(in srgb, var(--ink) 10%, var(--tint));
1161
+ }
1162
+ .navigation-drawer-toggle {
1163
+ margin-right: 0.25rem;
1164
+ color: var(--muted);
1165
+ }
1166
+ .navigation-drawer-toggle:focus-visible {
1167
+ background: var(--md-pressed);
1168
+ }
1169
+ /* Directly in the drawer ("Ring"), not in a row with a caret: as high as its content. */
1170
+ .navigation-drawer > .navigation-drawer-item {
1171
+ flex: none;
1172
+ }
1173
+ /* A sub-page: an item further in, its label in regular weight. */
1174
+ .navigation-drawer-subitem {
1175
+ min-height: 3.5rem;
1176
+ gap: 0.75rem;
1177
+ margin-left: 0;
1178
+ border-left: 0;
1179
+ border-radius: var(--md-shape-full);
1180
+ padding: 0 1.5rem 0 2.25rem;
1181
+ color: var(--muted);
1182
+ transition: background-color var(--motion-effects);
1183
+ }
1184
+ .navigation-drawer-subitem:hover {
1185
+ background: var(--md-hover);
1186
+ color: var(--muted);
1187
+ }
1188
+ .navigation-drawer-subitem:focus-visible {
1189
+ background: var(--md-pressed);
1190
+ }
1191
+ .navigation-drawer-subitem[data-active] {
1192
+ background: var(--tint);
1193
+ color: var(--ink);
1194
+ font-weight: 400;
1195
+ }
1196
+ .md-divider {
1197
+ margin: 0.5rem 1rem;
1198
+ border: 0;
1199
+ border-top: 1px solid var(--line);
1200
+ }
1201
+
1202
+ /* The footer: a surface container with extra-large corners at the top, a headline, lists with leading icons and a
1203
+ state layer, and text buttons at the bottom. */
1204
+ .md-footer {
1205
+ margin-top: 6rem;
1206
+ border-radius: var(--md-shape-extra-large) var(--md-shape-extra-large) var(--md-shape-none) var(--md-shape-none);
1207
+ background: var(--md-surface-container);
1208
+ }
1209
+ .md-footer-name {
1210
+ margin-top: 0.75rem;
1211
+ font-size: var(--type-headline-small-size);
1212
+ line-height: var(--type-headline-small-line-height);
1213
+ font-weight: var(--type-headline-small-weight);
1214
+ letter-spacing: var(--type-headline-small-tracking);
1215
+ }
1216
+ .md-footer-text {
1217
+ margin-top: 0.5rem;
1218
+ max-width: 38ch;
1219
+ color: var(--muted);
1220
+ font-size: var(--type-body-medium-size);
1221
+ line-height: var(--type-body-medium-line-height);
1222
+ font-weight: var(--type-body-medium-weight);
1223
+ letter-spacing: var(--type-body-medium-tracking);
1224
+ }
1225
+ .md-footer-heading,
1226
+ .md-footer-column > p {
1227
+ color: var(--ink);
1228
+ font-size: var(--type-label-large-size);
1229
+ line-height: var(--type-label-large-line-height);
1230
+ font-weight: var(--type-label-large-weight);
1231
+ letter-spacing: var(--type-label-large-tracking);
1232
+ }
1233
+ .md-footer-list,
1234
+ .md-footer-column > ul {
1235
+ margin: 0.5rem -1rem 0;
1236
+ }
1237
+ .md-footer-item,
1238
+ .md-footer-column > ul a {
1239
+ display: flex;
1240
+ min-height: 3rem;
1241
+ align-items: center;
1242
+ gap: 1rem;
1243
+ border-radius: var(--md-shape-full);
1244
+ padding: 0.5rem 1rem;
1245
+ color: var(--muted);
1246
+ font-size: var(--type-body-medium-size);
1247
+ line-height: var(--type-body-medium-line-height);
1248
+ font-weight: var(--type-body-medium-weight);
1249
+ letter-spacing: var(--type-body-medium-tracking);
1250
+ transition: background-color var(--motion-effects);
1251
+ }
1252
+ .md-footer-item:hover,
1253
+ .md-footer-column > ul a:hover {
1254
+ background: var(--md-hover);
1255
+ color: var(--ink);
1256
+ }
1257
+ .md-footer-item:focus-visible,
1258
+ .md-footer-item:active,
1259
+ .md-footer-column > ul a:focus-visible,
1260
+ .md-footer-column > ul a:active {
1261
+ background: var(--md-pressed);
1262
+ color: var(--ink);
1263
+ }
1264
+ .md-footer-column > ul > li {
1265
+ margin-block: 0;
1266
+ }
1267
+ .md-footer-item > svg {
1268
+ flex-shrink: 0;
1269
+ }
1270
+ .md-footer-column > a {
1271
+ margin-top: 0.5rem;
1272
+ font-weight: 500;
1273
+ }
1274
+ .md-footer-bottom {
1275
+ display: flex;
1276
+ flex-wrap: wrap;
1277
+ align-items: center;
1278
+ justify-content: space-between;
1279
+ gap: 0.5rem 1rem;
1280
+ border-top: 1px solid var(--line);
1281
+ padding-top: 1rem;
1282
+ color: var(--muted);
1283
+ font-size: var(--type-body-medium-size);
1284
+ line-height: var(--type-body-medium-line-height);
1285
+ font-weight: var(--type-body-medium-weight);
1286
+ letter-spacing: var(--type-body-medium-tracking);
1287
+ /* Its text buttons (the cookie settings, light or dark) with an 18px icon. */
1288
+ --button-icon-size: 1.125rem;
1289
+ }
1290
+ .md-footer-bottom > div {
1291
+ margin-inline: -0.75rem;
1292
+ }
1293
+ /* Room under the footer's last line for the FAB, or for the bar at the bottom of the screen: in the footer instead of
1294
+ under the page (components.css), so the footer reaches the bar. */
1295
+ @media (width < 48rem) {
1296
+ body:has(.theme-action-bar):has(.md-footer) {
1297
+ padding-bottom: 0;
1298
+ }
1299
+ body:has(.theme-action-bar, [data-fab]) .md-footer {
1300
+ padding-bottom: 5rem;
1301
+ }
1302
+ }