@morphemecms/cms 0.5.0 → 0.7.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 (396) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/astro.mjs +3 -0
  3. package/bin/morpheme.mjs +3 -1
  4. package/defaults/blockTexts.ts +2 -2
  5. package/defaults/collections.ts +10 -0
  6. package/defaults/editor.ts +57 -53
  7. package/defaults/privacy.ts +4 -1
  8. package/defaults/rules.ts +36 -38
  9. package/defaults/standardPages.ts +0 -3
  10. package/defaults/texts.ts +11 -2
  11. package/demo/src/content/pages/about.md +2 -0
  12. package/icons/lucide/browser-fill.svg +1 -0
  13. package/icons/lucide/buildings-fill.svg +1 -0
  14. package/icons/lucide/certificate-fill.svg +1 -0
  15. package/icons/lucide/chart-line-up-fill.svg +1 -0
  16. package/icons/lucide/chats-fill.svg +1 -0
  17. package/icons/lucide/envelope-simple-fill.svg +1 -0
  18. package/icons/lucide/file-text-fill.svg +1 -0
  19. package/icons/lucide/folder-simple-fill.svg +1 -0
  20. package/icons/lucide/gauge.svg +1 -1
  21. package/icons/lucide/gear-six.svg +1 -0
  22. package/icons/lucide/globe-simple.svg +1 -0
  23. package/icons/lucide/heart-fill.svg +1 -0
  24. package/icons/lucide/layout.svg +1 -0
  25. package/icons/lucide/list-checks-fill.svg +1 -0
  26. package/icons/lucide/magnifying-glass-fill.svg +1 -0
  27. package/icons/lucide/megaphone-fill.svg +1 -0
  28. package/icons/lucide/newspaper-fill.svg +1 -0
  29. package/icons/lucide/paint-brush-broad-fill.svg +1 -0
  30. package/icons/lucide/puzzle-piece-fill.svg +1 -0
  31. package/icons/lucide/shield-check-fill.svg +1 -0
  32. package/icons/lucide/sidebar-simple.svg +1 -1
  33. package/icons/lucide/sidebar.svg +1 -0
  34. package/icons/lucide/square-half-bottom-fill.svg +1 -0
  35. package/icons/lucide/square-half.svg +1 -0
  36. package/icons/lucide/squares-four-fill.svg +1 -0
  37. package/icons/lucide/storefront-fill.svg +1 -0
  38. package/icons/lucide/tag-fill.svg +1 -0
  39. package/icons/lucide/toggle-right-fill.svg +1 -0
  40. package/icons/lucide/trash-fill.svg +1 -0
  41. package/icons/lucide/user-fill.svg +1 -0
  42. package/icons/lucide/wrench-fill.svg +1 -0
  43. package/icons/material-symbols/browser-fill.svg +1 -0
  44. package/icons/material-symbols/buildings-fill.svg +1 -0
  45. package/icons/material-symbols/certificate-fill.svg +1 -0
  46. package/icons/material-symbols/chart-line-up-fill.svg +1 -0
  47. package/icons/material-symbols/chats-fill.svg +1 -0
  48. package/icons/material-symbols/envelope-simple-fill.svg +1 -0
  49. package/icons/material-symbols/file-text-fill.svg +1 -0
  50. package/icons/material-symbols/folder-simple-fill.svg +1 -0
  51. package/icons/material-symbols/gauge.svg +1 -1
  52. package/icons/material-symbols/gear-six.svg +1 -0
  53. package/icons/material-symbols/globe-simple.svg +1 -0
  54. package/icons/material-symbols/heart-fill.svg +1 -0
  55. package/icons/material-symbols/layout.svg +1 -0
  56. package/icons/material-symbols/list-checks-fill.svg +1 -0
  57. package/icons/material-symbols/magnifying-glass-fill.svg +1 -0
  58. package/icons/material-symbols/megaphone-fill.svg +1 -0
  59. package/icons/material-symbols/newspaper-fill.svg +1 -0
  60. package/icons/material-symbols/paint-brush-broad-fill.svg +1 -0
  61. package/icons/material-symbols/puzzle-piece-fill.svg +1 -0
  62. package/icons/material-symbols/shield-check-fill.svg +1 -0
  63. package/icons/material-symbols/sidebar-simple.svg +1 -1
  64. package/icons/material-symbols/sidebar.svg +1 -0
  65. package/icons/material-symbols/square-half-bottom-fill.svg +1 -0
  66. package/icons/material-symbols/square-half.svg +1 -0
  67. package/icons/material-symbols/squares-four-fill.svg +1 -0
  68. package/icons/material-symbols/storefront-fill.svg +1 -0
  69. package/icons/material-symbols/tag-fill.svg +1 -0
  70. package/icons/material-symbols/toggle-right-fill.svg +1 -0
  71. package/icons/material-symbols/trash-fill.svg +1 -0
  72. package/icons/material-symbols/user-fill.svg +1 -0
  73. package/icons/material-symbols/wrench-fill.svg +1 -0
  74. package/icons/phosphor/browser-fill.svg +1 -0
  75. package/icons/phosphor/buildings-fill.svg +1 -0
  76. package/icons/phosphor/certificate-fill.svg +1 -0
  77. package/icons/phosphor/chart-line-up-fill.svg +1 -0
  78. package/icons/phosphor/chats-fill.svg +1 -0
  79. package/icons/phosphor/envelope-simple-fill.svg +1 -0
  80. package/icons/phosphor/file-text-fill.svg +1 -0
  81. package/icons/phosphor/folder-simple-fill.svg +1 -0
  82. package/icons/phosphor/gear-six.svg +1 -0
  83. package/icons/phosphor/globe-simple.svg +1 -0
  84. package/icons/phosphor/heart-fill.svg +1 -0
  85. package/icons/phosphor/layout.svg +1 -0
  86. package/icons/phosphor/list-checks-fill.svg +1 -0
  87. package/icons/phosphor/magnifying-glass-fill.svg +1 -0
  88. package/icons/phosphor/megaphone-fill.svg +1 -0
  89. package/icons/phosphor/newspaper-fill.svg +1 -0
  90. package/icons/phosphor/paint-brush-broad-fill.svg +1 -0
  91. package/icons/phosphor/puzzle-piece-fill.svg +1 -0
  92. package/icons/phosphor/shield-check-fill.svg +1 -0
  93. package/icons/phosphor/sidebar.svg +1 -0
  94. package/icons/phosphor/square-half-bottom-fill.svg +1 -0
  95. package/icons/phosphor/square-half.svg +1 -0
  96. package/icons/phosphor/squares-four-fill.svg +1 -0
  97. package/icons/phosphor/storefront-fill.svg +1 -0
  98. package/icons/phosphor/tag-fill.svg +1 -0
  99. package/icons/phosphor/toggle-right-fill.svg +1 -0
  100. package/icons/phosphor/trash-fill.svg +1 -0
  101. package/icons/phosphor/user-fill.svg +1 -0
  102. package/icons/phosphor/wrench-fill.svg +1 -0
  103. package/lib/breakpoints.d.mts +13 -0
  104. package/lib/breakpoints.mjs +20 -0
  105. package/lib/breakpoints.test.mjs +39 -0
  106. package/lib/build-lane.d.mts +15 -0
  107. package/lib/build-lane.mjs +23 -0
  108. package/lib/build-lane.test.mjs +74 -0
  109. package/lib/build-settings.d.mts +16 -0
  110. package/lib/build-settings.mjs +39 -0
  111. package/lib/build-settings.test.mjs +41 -0
  112. package/lib/contracts.d.mts +3 -2
  113. package/lib/contracts.mjs +3 -2
  114. package/lib/drawer-swipe.d.mts +10 -0
  115. package/lib/drawer-swipe.mjs +17 -0
  116. package/lib/drawer-swipe.test.mjs +33 -0
  117. package/lib/drawerKeys.d.mts +9 -0
  118. package/lib/drawerKeys.mjs +26 -0
  119. package/lib/drawerKeys.test.mjs +21 -0
  120. package/lib/eyebrow.d.mts +6 -0
  121. package/lib/eyebrow.mjs +24 -0
  122. package/lib/eyebrow.test.mjs +20 -0
  123. package/lib/front-sections.test.mjs +82 -0
  124. package/lib/heading-levels.d.mts +7 -0
  125. package/lib/heading-levels.mjs +16 -0
  126. package/lib/heading-levels.test.mjs +37 -0
  127. package/lib/inline.ts +3 -2
  128. package/lib/markdown.ts +2 -0
  129. package/lib/materialIcon.d.mts +21 -0
  130. package/lib/materialIcon.mjs +29 -0
  131. package/lib/materialIcon.test.mjs +45 -0
  132. package/lib/menu-layout.d.mts +11 -0
  133. package/lib/menu-layout.mjs +14 -0
  134. package/lib/menu-layout.test.mjs +23 -0
  135. package/lib/menu.d.mts +59 -0
  136. package/lib/menu.mjs +129 -0
  137. package/lib/menu.test.mjs +291 -0
  138. package/lib/rehype-emphasize.d.mts +4 -0
  139. package/lib/rehype-emphasize.mjs +20 -0
  140. package/lib/rehype-emphasize.test.mjs +39 -0
  141. package/lib/section-in-view.d.mts +8 -0
  142. package/lib/section-in-view.mjs +25 -0
  143. package/lib/section-in-view.test.mjs +35 -0
  144. package/lib/section-marker.d.mts +5 -0
  145. package/lib/section-marker.mjs +18 -0
  146. package/lib/section-marker.test.mjs +22 -0
  147. package/lib/section-ranges.d.mts +12 -0
  148. package/lib/section-ranges.mjs +43 -0
  149. package/lib/section-ranges.test.mjs +61 -0
  150. package/lib/sheet-stops.d.mts +68 -0
  151. package/lib/sheet-stops.mjs +198 -0
  152. package/lib/sheet-stops.test.mjs +155 -0
  153. package/lib/still-timer.d.mts +5 -0
  154. package/lib/still-timer.mjs +17 -0
  155. package/lib/still-timer.test.mjs +42 -0
  156. package/lib/text-sections.d.mts +10 -0
  157. package/lib/text-sections.mjs +45 -0
  158. package/lib/text-sections.test.mjs +78 -0
  159. package/lib/video.mjs +2 -1
  160. package/lib/without-h1.d.mts +1 -0
  161. package/lib/without-h1.mjs +7 -0
  162. package/lib/without-h1.test.mjs +26 -0
  163. package/lib/word-at.d.mts +6 -0
  164. package/lib/word-at.mjs +20 -0
  165. package/lib/word-at.test.mjs +19 -0
  166. package/package.json +3 -1
  167. package/pages/editor/version.json.js +22 -2
  168. package/scripts/already-checked.mjs +11 -0
  169. package/scripts/already-checked.test.mjs +18 -0
  170. package/scripts/build-settings-problems.mjs +27 -0
  171. package/scripts/build-settings-problems.test.mjs +35 -0
  172. package/scripts/check-content.mjs +42 -4
  173. package/scripts/check-worker.mjs +96 -4
  174. package/scripts/ci-build.mjs +85 -0
  175. package/scripts/ci-build.test.mjs +137 -0
  176. package/scripts/editor-roundtrip.mjs +62 -3
  177. package/scripts/editor-screens.mjs +21 -7
  178. package/scripts/git-env.mjs +6 -0
  179. package/scripts/step-command.mjs +34 -0
  180. package/scripts/step-command.test.mjs +50 -0
  181. package/scripts/text-problems.mjs +83 -0
  182. package/scripts/text-problems.test.mjs +74 -0
  183. package/scripts/worker-modules.mjs +11 -1
  184. package/site/breakpoints.d.mts +6 -0
  185. package/site/breakpoints.mjs +52 -0
  186. package/site/breakpoints.test.mjs +36 -0
  187. package/site/casing.d.mts +3 -0
  188. package/site/casing.mjs +26 -0
  189. package/site/content.config.ts +2 -0
  190. package/site/content.ts +2 -4
  191. package/site/defineSite.d.mts +1 -0
  192. package/site/defineSite.mjs +3 -0
  193. package/site/home.ts +3 -2
  194. package/site/icons.d.mts +116 -4
  195. package/site/icons.mjs +62 -6
  196. package/site/images.mjs +1 -1
  197. package/site/live-diff.d.mts +22 -0
  198. package/site/live-diff.mjs +98 -0
  199. package/site/live-diff.test.mjs +235 -0
  200. package/site/materialSymbols.d.mts +5 -0
  201. package/site/materialSymbols.mjs +19 -0
  202. package/site/sections.ts +1 -1
  203. package/site/theme.d.mts +1 -1
  204. package/site/theme.mjs +7 -1
  205. package/src/ActionParts.tsx +1 -1
  206. package/src/Advanced.tsx +101 -20
  207. package/src/App.tsx +47 -121
  208. package/src/AppList.tsx +1 -1
  209. package/src/BlockParts.tsx +3 -3
  210. package/src/Colors.tsx +1 -1
  211. package/src/CommunicationParts.tsx +1 -1
  212. package/src/ContainmentParts.tsx +80 -28
  213. package/src/Deleted.tsx +18 -4
  214. package/src/EditorFooter.tsx +14 -0
  215. package/src/EntryForm.tsx +75 -39
  216. package/src/FormFrame.tsx +3 -8
  217. package/src/Library.tsx +46 -51
  218. package/src/Licenses.tsx +27 -11
  219. package/src/MainDrawerParts.tsx +60 -0
  220. package/src/MainMenu.tsx +136 -0
  221. package/src/MarkdownEditor.tsx +175 -32
  222. package/src/Media.tsx +69 -16
  223. package/src/MediaTags.tsx +91 -0
  224. package/src/ModalSheetSample.tsx +47 -0
  225. package/src/NavigationParts.tsx +67 -21
  226. package/src/NavigationRestParts.tsx +1 -1
  227. package/src/Parts.tsx +71 -0
  228. package/src/PartsShown.tsx +1 -1
  229. package/src/PickerParts.tsx +2 -2
  230. package/src/Redirects.tsx +3 -2
  231. package/src/Screen.tsx +93 -90
  232. package/src/SelectionParts.tsx +22 -6
  233. package/src/SiteLogoLink.tsx +14 -0
  234. package/src/StartFab.tsx +22 -0
  235. package/src/StartStatus.tsx +1 -1
  236. package/src/autoTags.d.mts +28 -0
  237. package/src/autoTags.mjs +68 -0
  238. package/src/autoTags.test.mjs +109 -0
  239. package/src/buildSettings.test.mjs +20 -0
  240. package/src/buildSettings.ts +20 -0
  241. package/src/checkSite.ts +14 -1
  242. package/src/deploy.ts +7 -9
  243. package/src/editor.css +150 -17
  244. package/src/eyebrow.d.mts +5 -0
  245. package/src/eyebrow.mjs +53 -0
  246. package/src/eyebrowState.d.mts +21 -0
  247. package/src/eyebrowState.mjs +62 -0
  248. package/src/eyebrowState.test.mjs +78 -0
  249. package/src/fileRecords.d.mts +115 -0
  250. package/src/fileRecords.mjs +224 -0
  251. package/src/fileRecords.test.mjs +224 -0
  252. package/src/fileTagFilter.d.mts +30 -0
  253. package/src/fileTagFilter.mjs +44 -0
  254. package/src/fileTagFilter.test.mjs +57 -0
  255. package/src/fileTags.d.mts +56 -0
  256. package/src/fileTags.mjs +100 -0
  257. package/src/fileTags.test.mjs +127 -0
  258. package/src/firstHeading.d.mts +6 -0
  259. package/src/firstHeading.mjs +37 -0
  260. package/src/i18n/da-DK/advanced.ts +27 -12
  261. package/src/i18n/da-DK/app.ts +9 -7
  262. package/src/i18n/da-DK/apps.ts +16 -16
  263. package/src/i18n/da-DK/blockSettings.ts +9 -9
  264. package/src/i18n/da-DK/blocks.ts +2 -2
  265. package/src/i18n/da-DK/check.ts +5 -2
  266. package/src/i18n/da-DK/cms.ts +14 -12
  267. package/src/i18n/da-DK/colors.ts +5 -5
  268. package/src/i18n/da-DK/common.ts +2 -2
  269. package/src/i18n/da-DK/company.ts +3 -3
  270. package/src/i18n/da-DK/consents.ts +6 -6
  271. package/src/i18n/da-DK/forms.ts +6 -6
  272. package/src/i18n/da-DK/history.ts +6 -6
  273. package/src/i18n/da-DK/keywords.ts +2 -2
  274. package/src/i18n/da-DK/library.ts +17 -15
  275. package/src/i18n/da-DK/licenses.ts +4 -4
  276. package/src/i18n/da-DK/media.ts +10 -4
  277. package/src/i18n/da-DK/parts.ts +62 -25
  278. package/src/i18n/da-DK/preview.ts +5 -6
  279. package/src/i18n/da-DK/redirects.ts +7 -7
  280. package/src/i18n/da-DK/seo.ts +1 -1
  281. package/src/i18n/da-DK/text.ts +2 -0
  282. package/src/i18n/da-DK/theme.ts +5 -5
  283. package/src/i18n/en-US/advanced.ts +34 -18
  284. package/src/i18n/en-US/app.ts +7 -5
  285. package/src/i18n/en-US/apps.ts +9 -9
  286. package/src/i18n/en-US/blockSettings.ts +4 -4
  287. package/src/i18n/en-US/blocks.ts +6 -6
  288. package/src/i18n/en-US/check.ts +6 -3
  289. package/src/i18n/en-US/cms.ts +15 -14
  290. package/src/i18n/en-US/colors.ts +18 -18
  291. package/src/i18n/en-US/common.ts +3 -3
  292. package/src/i18n/en-US/consents.ts +4 -4
  293. package/src/i18n/en-US/forms.ts +5 -5
  294. package/src/i18n/en-US/history.ts +2 -2
  295. package/src/i18n/en-US/library.ts +21 -15
  296. package/src/i18n/en-US/licenses.ts +6 -6
  297. package/src/i18n/en-US/media.ts +7 -1
  298. package/src/i18n/en-US/parts.ts +60 -21
  299. package/src/i18n/en-US/preview.ts +5 -6
  300. package/src/i18n/en-US/redirects.ts +3 -3
  301. package/src/i18n/en-US/seo.ts +1 -1
  302. package/src/i18n/en-US/text.ts +3 -0
  303. package/src/i18n/en-US/theme.ts +6 -6
  304. package/src/icon.tsx +90 -27
  305. package/src/licenseData.test.mjs +28 -0
  306. package/src/licenseData.ts +12 -1
  307. package/src/markdown.d.mts +2 -0
  308. package/src/markdown.mjs +73 -5
  309. package/src/markdown.test.mjs +74 -0
  310. package/src/materialIcons.ts +8 -0
  311. package/src/menuChildren.ts +36 -0
  312. package/src/menuOpen.ts +34 -0
  313. package/src/pagePreview.tsx +23 -19
  314. package/src/r2Caching.ts +14 -0
  315. package/src/sectionFrame.ts +39 -0
  316. package/src/sectionState.d.mts +19 -0
  317. package/src/sectionState.mjs +31 -0
  318. package/src/sectionState.test.mjs +59 -0
  319. package/src/sections.d.mts +9 -7
  320. package/src/sections.mjs +74 -27
  321. package/src/sections.test.mjs +59 -0
  322. package/src/sidebar.ts +2 -2
  323. package/src/site.ts +27 -17
  324. package/src/stillCursor.d.mts +8 -0
  325. package/src/stillCursor.mjs +19 -0
  326. package/src/stillCursor.test.mjs +26 -0
  327. package/src/tagUses.d.mts +47 -0
  328. package/src/tagUses.mjs +121 -0
  329. package/src/tagUses.test.mjs +141 -0
  330. package/src/themeUi.ts +10 -0
  331. package/src/topBarSlot.tsx +37 -0
  332. package/src/ui.tsx +654 -150
  333. package/src/virtual.d.ts +5 -0
  334. package/starter/README.md +2 -1
  335. package/starter/package.json +2 -1
  336. package/starter/wrangler.jsonc +3 -2
  337. package/theme/blocks/cards/LinkCards.tsx +2 -1
  338. package/theme/blocks/hero/View.tsx +2 -1
  339. package/theme/blocks/video/View.tsx +2 -1
  340. package/theme/components/BlogIndex.astro +2 -2
  341. package/theme/components/BlogPosts.astro +1 -1
  342. package/theme/components/BlogPosts.tsx +9 -6
  343. package/theme/components/Container.astro +1 -1
  344. package/theme/components/CookieConsent.astro +1 -1
  345. package/theme/components/EndBlock.astro +1 -1
  346. package/theme/components/Footer.astro +5 -5
  347. package/theme/components/Header.astro +3 -3
  348. package/theme/components/Icon.astro +2 -2
  349. package/theme/components/MobileMenu.tsx +72 -61
  350. package/theme/components/MobileNav.astro +2 -2
  351. package/theme/components/PageHeader.astro +2 -2
  352. package/theme/components/PageSection.astro +1 -1
  353. package/theme/components/PopupButton.tsx +2 -2
  354. package/theme/components/PopupView.tsx +2 -2
  355. package/theme/components/PostList.tsx +7 -3
  356. package/theme/components/RichText.astro +22 -7
  357. package/theme/components/Section.astro +17 -10
  358. package/theme/components/SectionHeading.tsx +1 -1
  359. package/theme/components/home/PageBlock.astro +4 -4
  360. package/theme/components/home/Text.astro +3 -3
  361. package/theme/layouts/PageLayout.astro +3 -3
  362. package/theme/layouts/PostLayout.astro +9 -8
  363. package/theme/styles/base.css +13 -3
  364. package/theme/styles/blocks.css +97 -10
  365. package/theme/styles/components.css +9 -9
  366. package/theme/styles/elevation.test.mjs +168 -0
  367. package/theme/styles/global.css +65 -59
  368. package/theme/styles/ui.css +460 -131
  369. package/theme/templates/Home.astro +1 -1
  370. package/theme/templates/New.astro +5 -5
  371. package/theme/templates/NotFound.astro +2 -2
  372. package/theme/ui/BottomSheet.tsx +118 -21
  373. package/theme/ui/BottomSheetResizeIcon.tsx +13 -0
  374. package/theme/ui/Button.tsx +4 -3
  375. package/theme/ui/Dialog.tsx +1 -1
  376. package/theme/ui/FabMenu.tsx +13 -12
  377. package/theme/ui/LoadingIndicator.tsx +1 -1
  378. package/theme/ui/NavigationDrawer.tsx +116 -15
  379. package/theme/ui/NavigationRail.tsx +22 -13
  380. package/theme/ui/Search.tsx +1 -1
  381. package/theme/ui/SettingRow.tsx +31 -0
  382. package/theme/ui/Switch.tsx +11 -11
  383. package/theme/ui/TextField.tsx +17 -6
  384. package/theme/ui/bottomSheet.script.ts +3 -2
  385. package/theme/ui/bottomSheetControl.ts +131 -46
  386. package/theme/ui/fabMenu.script.ts +69 -53
  387. package/theme/ui/modalSheetSize.ts +214 -0
  388. package/theme/ui/navigationDrawerControl.ts +35 -0
  389. package/theme/ui/search.script.ts +4 -2
  390. package/worker/index.js +3 -0
  391. package/worker/plan-status.js +46 -0
  392. package/worker/push.js +7 -5
  393. package/worker/r2-status.js +2 -1
  394. package/icons/lucide/desktop.svg +0 -1
  395. package/icons/material-symbols/desktop.svg +0 -1
  396. package/icons/phosphor/desktop.svg +0 -1
@@ -9,7 +9,7 @@ export const parts: Messages['parts'] = {
9
9
  toolbarButton:
10
10
  'Værktøj i tekstens værktøjslinje: lidt mindre, så linjen er der på en telefon. Med en pil åbner den en menu (teksttypen, når linjen er for smal).',
11
11
  fields:
12
- 'Temaets felter med navnet på kanten og en forklaring under. Et valg åbner arket, eller en side for sig med det, hvert valg giver (pilen peger derhen).',
12
+ 'Temaets felter med navnet på kanten og en forklaring under. Et valg åbner en menu lige under feltet på en computer, eller arket på en telefon, eller en side for sig med det, hvert valg giver (pilen peger derhen).',
13
13
  formField: 'Et felt, der siger, hvad der er galt med det skrevne, og antal tegn af det højeste antal.',
14
14
  fieldGroup: 'Felter, der hører sammen, i en ramme med deres navn på.',
15
15
  shownValue: 'Det, et felt har, vist uden at kunne rettes her: med sit ikon, eller gråt, når det laves et andet sted.',
@@ -27,15 +27,17 @@ export const parts: Messages['parts'] = {
27
27
  'Søgningen med knapperne ved siden af, altid i samme rækkefølge: sortér, filter, dato, Google og menu eller liste. Sortér er grå, mens siderne vises som menuen.',
28
28
  choiceTile: 'Et af mange ikoner at trykke på, i et gitter.',
29
29
  group:
30
- 'Rækker i en ramme under en lille overskrift: startskærmen og listerne. Ikonet er ens overalt: gråt, og i accentfarven for den åbne del i sidebjælken. Foran navnet kan der i stedet stå et lille billede eller en prøve på en af temaets tokens. Til højre står evt. et antal. En række kan også gøre noget (i accentfarven), slette (i midten) eller kun vises (uden farve under musen, evt. grå).',
30
+ 'Rækker i en ramme under en lille overskrift: startskærmen og listerne. Ikonet er ens overalt: gråt, og i accentfarven for den åbne del i menuen. Foran navnet kan der i stedet stå et lille billede eller en prøve på en af temaets værdier. Til højre står evt. et antal. En række kan også gøre noget (i accentfarven), slette (i midten) eller kun vises (uden farve under musen, evt. grå).',
31
31
  checkList:
32
32
  'Ting, der er tjekket: en score fra 0 til 100 i en ring, en rød trekant ved det, der kan forbedres (som folder sig ud med, hvordan), og en grøn prik ved det, der er i orden.',
33
33
  scoreRing:
34
34
  'En score fra 0 til 100 i en lille ring forrest i en række, i samme farver som ringen i Ting, der er tjekket: grøn fra 90, orange fra 50, ellers rød.',
35
+ menuRow:
36
+ 'En indstilling i samme række som en kontakt: navn og hvad den gør til venstre, og til højre det valgte i en lille ramme med en pil. Den åbner valgene under sig (et ark på en telefon), det valgte med hak. Grå, mens indstillingen ikke kan ændres.',
35
37
  unfold:
36
38
  'Til højre i en række: hvor mange rækker der er under den, og pilen, der viser dem. Rækkerne under står indrykket langs en streg.',
37
39
  sheet:
38
- 'Arket nedefra (en dialog på en computer) med valg eller felter. Et ikon eller en række (fx Sprog) åbner det med valgene, og + (NewChoice) med de slags, noget nyt kan være (fx et pop op-vindue). Valgene kan stå under små overskrifter.',
40
+ 'Arket nedefra (en dialog på en computer) med valg eller felter. Et ikon eller en række (fx Sprog) åbner det med valgene, og + åbner det med de slags, noget nyt kan være (fx et pop op-vindue). Valgene kan stå under små overskrifter.',
39
41
  preview:
40
42
  'Forhåndsvisningen af en blok i en stiplet ramme. Den kan bruges som på siden (fx foldes ud), men et link i den fører ingen steder hen.',
41
43
  colorSwatches: 'Et sæt farver i små rundinger side om side (fx fire af hjemmesidens farver).',
@@ -50,9 +52,15 @@ export const parts: Messages['parts'] = {
50
52
  'Arket med en hel side (forhåndsvisningen), så højt som skærmen. Siden står i en ramme, så bred som en telefon eller en computer, og intet i den kører.',
51
53
  foldSection:
52
54
  'Et afsnit i en lang formular (en side, et blogindlæg), der foldes ind og ud med sin overskrift. Kun det første er åbent fra start.',
53
- sharePreview: 'Et link til en side, som det ser ud, når det deles: billedet, sitets domæne, titlen og beskrivelsen.',
55
+ sharePreview: 'Et link til en side, som det ser ud, når det deles: billedet, hjemmesidens domæne, titlen og beskrivelsen.',
54
56
  formColumns:
55
57
  'En formular på en bred skærm: teksten til venstre, status og de andre felter på kort til højre. På en mindre skærm under hinanden. Overskriften over felterne er altid den samme.',
58
+ mainDrawer:
59
+ 'Editorens menu: hjemmesidens dele i afsnit, den åbne markeret. På en bred skærm står den ved siden af indholdet, og menuknappen i starten af topbjælken viser og skjuler den; på en mindre skærm åbner den over siden og lukker ved et valg, et tryk ved siden af, Escape eller et stryg. Vist her som den, der åbner over siden.',
60
+ editorFooter:
61
+ 'Linjen nederst på hver skærm, under indholdet, med et link til licenserne for det, hjemmesiden og editoren er lavet med.',
62
+ sectionList:
63
+ 'Afsnittene i en lang formular som en liste, hvor det afsnit, der ses, er markeret. På en stor skærm står den i et panel for enden af formularen, som knappen yderst i topbjælken viser og skjuler; på en mindre skærm åbner knappen den i et sidepanel, der lukker, når man vælger et afsnit.',
56
64
  },
57
65
  /** Over the parts: the search, and the groups to show one of (as Material 3 sorts its components). */
58
66
  filter: {
@@ -68,7 +76,7 @@ export const parts: Messages['parts'] = {
68
76
  layout: 'Layout',
69
77
  fieldTypes: 'Felttyper',
70
78
  },
71
- none: 'Ingen dele passer til søgningen.',
79
+ none: 'Ingen dele passer til søgningen',
72
80
  },
73
81
  sample: {
74
82
  domain: 'eksempel.dk',
@@ -137,7 +145,7 @@ export const parts: Messages['parts'] = {
137
145
  `Felterne i formularerne og indstillingerne, én af hver type med de valg, den kan have. Felterne står i ${file} og er bygget af delene ovenfor. Intet her gemmes.`,
138
146
  use: {
139
147
  string:
140
- 'En linje tekst. Den kan skulle udfyldes, have højst et antal tegn, have en tekst, der bruges, når feltet er tomt, skulle have en bestemt form, være en adresse, et tal i par, et telefonnummer eller ord som chips (ét eller flere), eller have et link til der, den rettes.',
148
+ 'En linje tekst. Den kan være påkrævet, have en længdegrænse, vise en tekst, mens den er tom, kræve en bestemt form, rumme en adresse, et tal i par, et telefonnummer eller ord som chips, eller linke til det sted, hvor den rettes.',
141
149
  text: 'Tekst over flere linjer, med de samme valg som en linje.',
142
150
  markdown: 'Tekst med formatering, i samme editor som siderne.',
143
151
  number: 'Et tal.',
@@ -146,7 +154,7 @@ export const parts: Messages['parts'] = {
146
154
  select:
147
155
  'Et af flere valg: i arket nedefra, side om side, som ikoner, eller kun vist. Et valg kan have sin egen forklaring, og et felt kan stå kun ved ét af valgene.',
148
156
  relation:
149
- 'En side, et indlæg eller et tag fra sitets lister. En side vælges med sidevælgeren, også de faste sider; flere valg står som chips.',
157
+ 'En side, et indlæg eller et tag fra hjemmesidens lister. En side vælges med sidevælgeren, også de faste sider; flere valg står som chips.',
150
158
  image: 'Et billede fra Filer eller et nyt.',
151
159
  readonly: 'Vises, men rettes ikke her.',
152
160
  object: 'En gruppe felter i en ramme.',
@@ -156,11 +164,11 @@ export const parts: Messages['parts'] = {
156
164
  'En formular, der ikke er udfyldt rigtigt: en besked forrest siger, hvad der er galt, og feltet rulles frem og blinker, til det rettes. Prøv med et tomt felt, der skal udfyldes.',
157
165
  },
158
166
  tryToSave: 'Prøv at gemme',
159
- allRight: 'Alle felter er udfyldt rigtigt.',
167
+ allRight: 'Alle felter er udfyldt rigtigt',
160
168
  heading: 'Overskrift',
161
169
  headingHint: 'Højst ca. 60 tegn.',
162
170
  underName: 'Tekst (under navnet)',
163
- underNameHint: 'Hvis feltet er tomt, bruges sitets navn.',
171
+ underNameHint: 'Hvis feltet er tomt, bruges hjemmesidens navn.',
164
172
  email: 'E-mail',
165
173
  emailForm: 'Skriv en hel e-mailadresse',
166
174
  keyword: 'Primært søgeord',
@@ -178,9 +186,9 @@ export const parts: Messages['parts'] = {
178
186
  shown: 'Vises',
179
187
  hidden: 'Skjult',
180
188
  listText: 'Tekst (i listen)',
181
- listTextHint: 'Står kun ved placeringen I listen.',
182
- publishedHint: 'Siden er på sitet.',
183
- draftHint: 'Siden er ikke på sitet.',
189
+ listTextHint: 'Vises kun ved placeringen I listen.',
190
+ publishedHint: 'Siden er på hjemmesiden.',
191
+ draftHint: 'Siden er ikke på hjemmesiden.',
184
192
  look: 'Udseende',
185
193
  kind: 'Slags',
186
194
  page: 'Side',
@@ -336,7 +344,7 @@ export const parts: Messages['parts'] = {
336
344
  /** A list of kinds ("Promovering"), by the list's name for one. */
337
345
  kindsIntro: (one: string) => `Hver slags ${one}, også appenes, i alle sine tilstande. Temaet giver dem deres udseende.`,
338
346
  search: 'Søg i delene',
339
- none: 'Ingen dele passer til søgningen.',
347
+ none: 'Ingen dele passer til søgningen',
340
348
  /** The theme's buttons (packages/editor/theme/ui/), first under "UI-komponenter". */
341
349
  ui: 'Knapper',
342
350
  button:
@@ -362,7 +370,7 @@ export const parts: Messages['parts'] = {
362
370
  fieldSupporting: 'Du får kun en mail, når der er nyt.',
363
371
  fieldError: 'Skriv en e-mailadresse.',
364
372
  fieldPlaceholder: 'Din e-mail',
365
- fieldSearch: 'Søg på siden',
373
+ fieldSearch: 'Søg på hjemmesiden',
366
374
  fieldClear: 'Ryd',
367
375
  fieldPhone: 'Telefon',
368
376
  fieldPrefix: '+45',
@@ -379,7 +387,7 @@ export const parts: Messages['parts'] = {
379
387
  fieldReadOnly: 'Kundenummer',
380
388
  fieldReadOnlyValue: '10 482',
381
389
  checkboxLabel: 'Statistik',
382
- checkboxSupporting: 'Hvordan siden bliver brugt.',
390
+ checkboxSupporting: 'Hvordan hjemmesiden bliver brugt.',
383
391
  checkboxParent: 'Alle cookies',
384
392
  checkboxError: 'Sæt flueben for at fortsætte.',
385
393
  /** The theme's chips (Chip), a group of their own under "UI-komponenter". */
@@ -405,10 +413,16 @@ export const parts: Messages['parts'] = {
405
413
  'Kort eller billeder på en række, der skubbes til siden, med prikker under: lige store, i flere størrelser, ét stort (fra starten eller i midten) og ét ad gangen.',
406
414
  dialogKinds: { basic: 'Almindelig', icon: 'Med ikon, liste og skillelinje', container: 'Kun boksen', fullScreen: 'Hele skærmen' },
407
415
  sheetKinds: {
408
- modal: 'Modalt',
416
+ modal: 'Modalt, en dialog på en computer',
417
+ modalSideSheet: 'Modalt, et sideark på en computer',
418
+ modalSheet: 'Modalt, forbliver et ark på en computer',
409
419
  collapsed: 'Standard, foldet sammen',
410
420
  halfExpanded: 'Standard, halvt foldet ud',
411
421
  expanded: 'Standard, foldet ud',
422
+ fixed: 'Standard, fast, uden håndtag og overskrift',
423
+ resizeButton: 'Standard, knap til størrelsen i stedet for håndtaget',
424
+ collapseButton: 'Standard, knap til at folde sammen i fuld højde',
425
+ wideSheet: 'Standard, forbliver et ark på en computer, mens de andre bliver et sideark der',
412
426
  },
413
427
  layouts: {
414
428
  uncontained: 'Lige store',
@@ -424,11 +438,28 @@ export const parts: Messages['parts'] = {
424
438
  save: 'Gem',
425
439
  page: 'Siden bag arket kan stadig bruges.',
426
440
  dragHandle: 'Fold arket ud eller sammen',
441
+ openSheet: 'Åbn det modale ark',
442
+ openSideSheet: 'Åbn det modale ark som sideark',
443
+ openWideSheet: 'Åbn det modale ark med margener',
444
+ paragraphs: [
445
+ 'På en telefon åbner arket i halv skærmhøjde.',
446
+ 'Træk i håndtaget, overskriften eller denne tekst opad for at gøre det så højt, skærmen tillader.',
447
+ 'Når arket er i fuld højde, kan denne tekst rulles.',
448
+ 'Stryg nedad fra toppen af teksten, eller træk i håndtaget nedad, for at lukke det.',
449
+ 'Et hurtigt stryg op eller ned går direkte til fuld højde eller lukker arket.',
450
+ 'Et kort træk nedad, der slippes, sender arket tilbage til halv højde.',
451
+ 'På en computer er arket en dialog, et sideark eller et ark med margener, som eksemplet siger.',
452
+ 'Denne tekst gør kun arket langt nok til, at det skal rulles.',
453
+ ],
427
454
  picture: (n) => `Billede ${n}`,
428
455
  showPicture: (n) => `Vis billede ${n}`,
429
456
  heading: 'Overskrift',
430
457
  text: 'En kort tekst om det, boksen handler om.',
431
458
  sheetText: 'En kort tekst under overskriften',
459
+ sheetPeek: 'En linje, der vises, mens arket er foldet sammen',
460
+ sheetLabel: 'Detaljer',
461
+ resize: 'Fold arket ud eller sammen',
462
+ collapse: 'Fold arket sammen',
432
463
  footer: 'En linje nederst',
433
464
  close: 'Luk',
434
465
  roleDescription: 'karrusel',
@@ -440,7 +471,7 @@ export const parts: Messages['parts'] = {
440
471
  navigation: {
441
472
  title: 'Navigation',
442
473
  topAppBar:
443
- 'Bjælken øverst på en side: kun fladen med sitets egen header, eller knappen forrest, overskriften og knapperne bagerst, lille, mellem eller stor, eller med søgefeltet. Den får en anden flade, når siden rulles under den.',
474
+ 'Bjælken øverst på en side: kun fladen med hjemmesidens egen header, eller knappen forrest, overskriften og knapperne bagerst, lille, mellem eller stor, eller med søgefeltet. Den får en anden flade, når siden rulles under den.',
444
475
  stuck: 'Når siden rulles',
445
476
  /** The top app bar's kinds and what is in them (TopAppBar.tsx). */
446
477
  appBar: {
@@ -450,9 +481,9 @@ export const parts: Messages['parts'] = {
450
481
  long: 'En lang overskrift, der må gå over flere linjer',
451
482
  collapsed: 'foldet sammen',
452
483
  back: 'Tilbage',
453
- search: 'Søg på siden',
484
+ search: 'Søg på hjemmesiden',
454
485
  clear: 'Ryd',
455
- empty: 'Intet passer til søgningen.',
486
+ empty: 'Intet passer til søgningen',
456
487
  favourite: 'Gem',
457
488
  profile: 'Profil',
458
489
  },
@@ -480,7 +511,11 @@ export const parts: Messages['parts'] = {
480
511
  error: 'Vælg en behandling.',
481
512
  kinds: { outlined: 'Med ramme', filled: 'Fyldt' },
482
513
  },
483
- navigationDrawer: 'Menuen, der åbner over siden på en telefon: siderne, en med undersider foldet ud, den åbne markeret.',
514
+ navigationDrawer:
515
+ 'Menuen, der åbner over siden på en telefon: siderne, en med undersider foldet ud, den åbne markeret. Standardmenuen står ved siden af siden med sektioner, ikoner og antal, og i to niveauer: sektioner med en pil og en liste under en tilbage-række.',
516
+ drawerSections: ['Post', 'Konto'],
517
+ drawerItems: ['Indbakke', 'Beskeder', 'Favoritter', 'Papirkurv', 'Profil'],
518
+ drawerBack: ['Hovedmenu'],
484
519
  tabs: 'Faneblade på en række: kun teksten, som under bjælken, eller primære med ikon og sekundære, med en streg under det åbne. Til at skubbe til siden eller i hele bredden.',
485
520
  /** The tabs' made-up views (Tabs.tsx). */
486
521
  views: ['Oversigt', 'Priser', 'Anmeldelser', 'Kontakt', 'Kort', 'Videoer'],
@@ -535,6 +570,8 @@ export const parts: Messages['parts'] = {
535
570
  selection: {
536
571
  title: 'Kontakter, valg og sideark',
537
572
  switch: 'Slår noget til eller fra, med sit navn foran: fra, til, med ikoner i knappen og grå, når den ikke kan ændres.',
573
+ settingRow:
574
+ 'En indstilling på én linje: navnet og hvad den gør i starten, og det, der sætter den, i enden (en kontakt, en rullemenuknap).',
538
575
  radioButton: 'Ét af få valg i en gruppe under sit navn, evt. med en linje under: valgt og grå, når det ikke kan vælges.',
539
576
  slider:
540
577
  'Vælger et tal ved at trække: frit, i trin med prikker, fra midten, et interval med to knapper og med tallet over knappen, i fem størrelser, med ikon og lodret.',
@@ -582,13 +619,13 @@ export const parts: Messages['parts'] = {
582
619
  home: 'Forside',
583
620
  alone: 'Alene',
584
621
  contained: 'I beholder',
585
- loading: 'Henter …',
586
- uploading: 'Uploader',
622
+ loading: 'Henter…',
623
+ uploading: 'Uploader…',
587
624
  percent: (v) => `${Math.round(v * 100)} %`,
588
625
  indeterminate: 'Uden værdi',
589
626
  shapes: { flat: 'Flad', wavy: 'Bølget' },
590
627
  thick: 'Tyk',
591
- sent: 'Beskeden er sendt.',
628
+ sent: 'Beskeden er sendt',
592
629
  booked: 'Din tid er booket. Du får en bekræftelse på e-mail om lidt.',
593
630
  undo: 'Fortryd',
594
631
  seeBooking: 'Se bookingen',
@@ -618,10 +655,10 @@ export const parts: Messages['parts'] = {
618
655
  sections: ['Start', 'Dig'],
619
656
  menu: 'Skift bredde',
620
657
  compose: 'Skriv',
621
- searchLabel: 'Søg på siden',
658
+ searchLabel: 'Søg på hjemmesiden',
622
659
  back: 'Tilbage',
623
660
  clear: 'Ryd',
624
- empty: 'Intet passer til søgningen.',
661
+ empty: 'Intet passer til søgningen',
625
662
  query: 'par',
626
663
  results: [
627
664
  { headline: 'Priser', supporting: 'Søgt for nylig' },
@@ -3,11 +3,10 @@ import type { Messages } from '../en-US';
3
3
  export const preview: Messages['preview'] = {
4
4
  button: 'Forhåndsvis',
5
5
  title: 'Forhåndsvisning',
6
- device: 'Vis som',
7
- phone: 'Telefon',
8
- computer: 'Computer',
9
- making: 'Forhåndsvisningen laves…',
6
+ size: 'Vinduesstørrelse',
7
+ sizes: { compact: 'Kompakt', medium: 'Mellem', expanded: 'Udvidet', large: 'Stor', extraLarge: 'Ekstra stor' },
8
+ making: 'Henter forhåndsvisningen…',
10
9
  failed: (error) => `Kunne ikke oprette forhåndsvisningen: ${error}`,
11
- notHere: 'Den side kan ikke forhåndsvises.',
12
- pageNotLoaded: (status) => `Siden svarede ${status}.`,
10
+ notHere: 'Den side kan ikke forhåndsvises',
11
+ pageNotLoaded: (status) => `Siden kunne ikke hentes, fejl ${status}`,
13
12
  };
@@ -19,28 +19,28 @@ export const redirects: Messages['redirects'] = {
19
19
  sorts: { az: 'A–Å', za: 'Å–A', page: 'Efter side', visits: 'Flest besøg først', last: 'Senest besøgt først' },
20
20
  pageFilter: 'Vis efter side',
21
21
  postsGroup: 'Blogindlæg',
22
- loading: 'Henter videresendelserne',
23
- none: (query) => `Ingen videresendelser${query ? ` med "${query}"` : ''}.`,
22
+ loading: 'Henter videresendelserne…',
23
+ none: (query) => `Ingen videresendelser${query ? ` med "${query}"` : ''}`,
24
24
  from: 'Fra',
25
25
  fromHint: 'Fx /gammel-side/.',
26
26
  to: 'Til',
27
27
  toHint: 'Fx /om-os/ eller / for forsiden.',
28
- sendsTo: (name, noPage) => `Sender til ${name}${noPage ? ' (ikke en side i editoren)' : ''}.`,
28
+ sendsTo: (name, noPage) => `Sender til ${name}${noPage ? ', som ikke er en side i editoren' : ''}.`,
29
29
  deleteRedirect: 'Slet videresendelse',
30
30
  missing: {
31
31
  title: 'Ikke fundet',
32
32
  intro: 'Adresser, som besøgende har prøvet at åbne, men som ikke findes.',
33
33
  searchLabel: 'Søg i adresserne',
34
- loading: 'Henter adresserne',
34
+ loading: 'Henter adresserne…',
35
35
  notLoaded: (error) => `Kunne ikke hente adresserne, der ikke findes: ${error}`,
36
- notKept: 'Hjemmesiden registrerer endnu ikke adresser, der ikke findes.',
37
- none: (query) => (query ? `Ingen adresser med "${query}".` : 'Ingen adresser endnu.'),
36
+ notKept: 'Hjemmesiden registrerer endnu ikke adresser, der ikke findes',
37
+ none: (query) => (query ? `Ingen adresser med "${query}"` : 'Ingen adresser endnu'),
38
38
  seen: (n, last) => `${n === 1 ? 'Ét besøg' : `${n} besøg`}, senest ${last}`,
39
39
  details: (n, first, last, from) =>
40
40
  `${n === 1 ? `Besøgt én gang, ${last}` : `Besøgt ${n} gange, første gang ${first} og senest ${last}`}.${from ? ` Den seneste kom fra ${from}.` : ''}`,
41
41
  sendOn: 'Send videre',
42
42
  forget: 'Fjern fra listen',
43
- forgotten: 'Fjernet fra listen.',
43
+ forgotten: 'Fjernet fra listen',
44
44
  notForgotten: (error) => `Kunne ikke fjerne adressen fra listen: ${error}`,
45
45
  },
46
46
  commit: {
@@ -16,5 +16,5 @@ export const seo: Messages['seo'] = {
16
16
  kindFilter: 'Slags',
17
17
  allKinds: 'Sider og blogindlæg',
18
18
  noKeyword: 'Intet primært søgeord',
19
- none: 'Ingen sider eller blogindlæg passer.',
19
+ none: 'Ingen sider eller blogindlæg passer',
20
20
  };
@@ -22,6 +22,8 @@ export const text: Messages['text'] = {
22
22
  color: 'Farve',
23
23
  colors: { accent: 'Accentfarve', muted: 'Stille tekst' },
24
24
  noColor: 'Ingen farve',
25
+ sectionColor: 'Sektionsfarve',
26
+ sectionColors: { none: 'Ingen', surface: 'Flade', tint: 'Tone', accent: 'Accent' },
25
27
  linkTo: 'Linket går til',
26
28
  linkPage: 'Side',
27
29
  linkAddress: 'Anden adresse',
@@ -16,24 +16,24 @@ export const theme: Messages['theme'] = {
16
16
  lightTheme: 'Lyst tema',
17
17
  tags: 'Tags',
18
18
  allPosts: 'Alle',
19
- noPosts: 'Der er ingen indlæg her endnu.',
19
+ noPosts: 'Her er ingen indlæg endnu',
20
20
  seeAllPosts: 'Se alle indlæg',
21
21
  seeAll: 'Se alle',
22
22
  blog: 'Blog',
23
23
  relatedPosts: 'Relaterede indlæg',
24
24
  readingTime: (minutes) => `${minutes} min. læsetid`,
25
- postsAbout: (count, tag) => `${count} indlæg om ${tag}.`,
25
+ postsAbout: (count, tag) => `${count} indlæg om ${tag}`,
26
26
  notFound: 'Siden findes ikke',
27
27
  didYouMean: 'Mente du',
28
28
  newPages: 'Nye sider',
29
29
  newPagesDescription: 'Nye versioner af siderne, til gennemsyn.',
30
30
  newPagesIntro:
31
- 'Nye versioner af siderne ved siden af de nuværende, til gennemsyn. Google ser dem ikke. Når en side er godkendt, kommer den nye tekst over på den nuværende sides adresse.',
31
+ 'Nye versioner af siderne ved siden af de nuværende, til gennemsyn. Google ser dem ikke. Når du godkender en side, kommer den nye tekst på den nuværende sides adresse.',
32
32
  newVersion: 'Ny version',
33
- newPage: 'Ny side, findes ikke i dag',
33
+ newPage: 'Ny side, som ikke findes endnu',
34
34
  currentPage: (title) => `Nuværende: ${title}`,
35
35
  newPosts: 'Nye blogindlæg',
36
- newPostsIntro: 'Skjulte, indtil de er godkendt: de står ikke på bloggen, og Google ser dem ikke.',
36
+ newPostsIntro: 'Skjulte, indtil du godkender dem. De står ikke på bloggen, og Google ser dem ikke.',
37
37
  reviewNotice: 'Ny version til gennemsyn. Google ser den ikke.',
38
38
  seeCurrentPage: 'Se den nuværende side',
39
39
  seeChanges: 'Se, hvad der er ændret',
@@ -1,32 +1,48 @@
1
- // "Avanceret" under "Indstillinger" (Advanced.tsx): R2 caching, the copy of the site's files in Cloudflare R2
2
- // (r2Caching.ts).
1
+ // "Avanceret" under "Indstillinger" (Advanced.tsx): the faster editor (a copy of the website's files in Cloudflare R2,
2
+ // r2Caching.ts), and the switches for updating the website (buildSettings.ts).
3
3
  export const advanced = {
4
- r2Caching: 'R2 caching',
5
- r2CachingHint: "The Worker gives the editor the site's files from Cloudflare R2 and asks GitHub only for what has changed.",
6
- checking: 'Asking Cloudflare whether R2 is ready.',
7
- /** Why it cannot be turned on, by what the Worker says of the bucket at Cloudflare (packages/editor/worker/r2-status.js); with the
8
- * jurisdiction it is kept within, when it has one. */
4
+ r2Caching: 'Faster editor',
5
+ r2CachingHint: "The editor loads the website's files faster and asks GitHub only for what has changed.",
6
+ checking: 'Checking whether Cloudflare is ready…',
7
+ /** Why it cannot be turned on, by what the editor finds at Cloudflare (packages/editor/worker/r2-status.js); `bucket` is the name
8
+ * of the storage, `jurisdiction` where it is kept, when it has one. */
9
9
  bucket: {
10
10
  ready: (bucket: string, jurisdiction: string | null): string =>
11
- `The bucket ${bucket} is ready at Cloudflare${jurisdiction ? ` in the ${jurisdiction}` : ''}.`,
11
+ `The storage ${bucket} is ready at Cloudflare${jurisdiction ? ` in the ${jurisdiction}` : ''}.`,
12
12
  'no-bucket': (bucket: string, jurisdiction: string | null): string =>
13
- `Can be turned on once the bucket ${bucket} is made under R2 at Cloudflare${jurisdiction ? ` with the jurisdiction ${jurisdiction}` : ''}.`,
13
+ `Can be turned on once the storage ${bucket} is made under R2 at Cloudflare${jurisdiction ? ` and kept in the ${jurisdiction}` : ''}.`,
14
14
  'no-r2': (): string => 'Can be turned on once R2 is turned on at Cloudflare.',
15
- 'no-key': (): string => 'The Worker has no key for Cloudflare, so it can’t see whether R2 is turned on.',
16
- refused: (): string => "Cloudflare didn’t accept the Worker's key for R2.",
15
+ 'no-key': (): string => 'The editor has no key for Cloudflare, so it can’t see whether R2 is turned on.',
16
+ refused: (): string => 'Cloudflare didn’t accept the editor’s key for R2.',
17
17
  failed: (): string => 'Cloudflare didn’t answer whether R2 is ready. Try again later.',
18
18
  },
19
+ builds: 'Updating the website',
20
+ fastContentBuilds: 'Faster updates for content',
21
+ fastContentBuildsHint: 'The website updates sooner when you only change content.',
22
+ paidBuilds: 'Workers Paid plan',
23
+ paidBuildsHint: 'Turn on when your Cloudflare account has Workers Paid.',
24
+ /** Why the Workers Paid switch can't be turned on, by what the editor finds of the account's plan (packages/editor/worker/plan-status.js). */
25
+ plan: {
26
+ no: 'Can be turned on once the Cloudflare account has Workers Paid.',
27
+ 'no-key': 'The editor has no key for Cloudflare, so it can’t see whether the account has Workers Paid.',
28
+ refused: 'Cloudflare didn’t let the editor’s key read the account’s plan. The key needs Billing: Read.',
29
+ failed: 'Cloudflare didn’t answer whether the account has Workers Paid. Try again later.',
30
+ },
31
+ billing: 'Open billing at Cloudflare',
32
+ buildSettingsNotLoaded: (error: string) => `The settings for updating the website couldn’t be loaded: ${error}`,
19
33
  place: 'Location',
20
- placeHint: 'Can only be changed while R2 caching is off.',
34
+ placeHint: 'Can only be changed while Faster editor is off.',
21
35
  placeAuto: 'Automatic',
22
- onWhenBuilt: 'Turned on when the site is updated.',
23
- offWhenBuilt: 'Turned off when the site is updated.',
24
- loading: "Loading the Worker's settings",
25
- notLoaded: (error: string) => `The Worker's settings couldn’t be loaded: ${error}`,
26
- noSettings: 'The site has no settings for the Worker (wrangler.jsonc)',
27
- noLine: "The Worker's settings (wrangler.jsonc) have no line for R2 caching",
36
+ onWhenBuilt: 'Turned on when the website is updated.',
37
+ offWhenBuilt: 'Turned off when the website is updated.',
38
+ loading: 'Loading settings…',
39
+ notLoaded: (error: string) => `The settings couldn’t be loaded: ${error}`,
40
+ noSettings: 'The website has no settings for the editor',
41
+ noLine: 'The website’s settings have no place for Faster editor',
28
42
  /** The commit (siteT). */
29
43
  r2CachingCommit: (on: boolean): string => (on ? 'Editor: turn on R2 caching' : 'Editor: turn off R2 caching'),
44
+ fastContentBuildsCommit: (on: boolean): string => (on ? 'Editor: turn on fast content builds' : 'Editor: turn off fast content builds'),
45
+ paidBuildsCommit: (on: boolean): string => (on ? 'Editor: turn on the paid build plan' : 'Editor: turn off the paid build plan'),
30
46
  placeCommit: (jurisdiction: string | null): string =>
31
47
  jurisdiction ? `Editor: keep the R2 caching bucket in the ${jurisdiction}` : 'Editor: let Cloudflare place the R2 caching bucket',
32
48
  };
@@ -1,11 +1,11 @@
1
1
  // The editor's frame (App.tsx, FormFrame.tsx, ask.tsx), logging in and saving to GitHub (github.ts, cache.ts), pictures (images.ts) and addresses (addresses.ts, checkSite.ts).
2
2
  export const app = {
3
3
  logIn: 'Log in with GitHub',
4
- loading: 'Loading the website’s content',
4
+ loading: 'Loading the website’s content…',
5
5
  cannotSave: (login: string) => `The account ${login} doesn’t have access to save. Log in with another GitHub account under Account.`,
6
6
  notFound: 'Not found',
7
7
  nothingAt: (route: string) => `There’s nothing at the address ${route}`,
8
- /** After a save, when the site has been rebuilt with it (or not); `changes`: what the saves since the last update
8
+ /** After a save, when the website has been updated with it (or not); `changes`: what the saves since the last update
9
9
  * changed, as a list (changesText in deploy.ts). */
10
10
  siteUpdated: (changes: string) => `The website has been updated: ${changes}.`,
11
11
  siteNotUpdated: (changes: string) => `The website wasn’t updated (${changes}). Restore the previous version under Earlier versions.`,
@@ -40,8 +40,10 @@ export const app = {
40
40
  redirect: (from: string) => `redirect from ${from}`,
41
41
  logo: 'logo',
42
42
  icon: 'icon',
43
- r2Caching: 'R2 caching',
43
+ r2Caching: 'faster editor',
44
44
  place: 'storage location',
45
+ fastContentBuilds: 'faster updates for content',
46
+ paidBuilds: 'Workers Paid plan',
45
47
  },
46
48
  /** Why a new page or post cannot have an address. */
47
49
  addressTaken: (address: string) => `There’s already a page or blog post with the address ${address}.`,
@@ -62,7 +64,7 @@ export const app = {
62
64
  viewOnSite: 'View on the website',
63
65
  /** GitHub (github.ts). */
64
66
  loggedOut: 'You have been logged out. Log in again.',
65
- githubAnswered: (status: number) => `GitHub answered ${status}`,
67
+ githubAnswered: (status: number) => `GitHub returned error ${status}. Try again.`,
66
68
  pictureNotLoaded: 'The picture couldn’t be loaded from GitHub. Check your connection and try again.',
67
69
  pictureNotWhole: 'The picture couldn’t be loaded completely. Try again.',
68
70
  changedElsewhere: 'The file was changed elsewhere. Copy your text and reload the page.',
@@ -71,7 +73,7 @@ export const app = {
71
73
  pictureNotOpened: 'The picture couldn’t be opened. Use a JPEG, PNG, or WebP picture.',
72
74
  pictureNotReady: 'The picture couldn’t be prepared',
73
75
  preparingPicture: 'Preparing the picture…',
74
- /** The check before the build (checkSite.ts). */
76
+ /** The check before the website is updated (checkSite.ts). */
75
77
  invalidJson: 'The file isn’t valid JSON',
76
78
  blocksOff: 'Turned off',
77
79
  block: 'Block',
@@ -18,10 +18,10 @@ export const apps = {
18
18
  needsLoads: 'Loads from other addresses',
19
19
  needsSends: 'Sends forms to other addresses',
20
20
  needsServer: 'Has its own part of the website’s server',
21
- needsBuild: 'Makes its own files when the website is built',
21
+ needsBuild: 'Makes its own files when the website is updated',
22
22
  /** What it changes of what the site does itself, by its file in hooks/ (@morphemecms/cms/lib/hooks.ts). */
23
23
  changes: { 'page-colors': 'Changes the pages’ colors' } as Record<AppHook, string>,
24
- /** In the check before the build: a file in an app's hooks/ that is no place an app may change the site. */
24
+ /** In the check before the website is updated: a file in an app's hooks/ that is no place an app may change the site. */
25
25
  unknownHook: (places: string) => `The file is no place an app can change the website: ${places}.`,
26
26
  needsNothing: 'None',
27
27
  /** The kinds of notifications it sends (its `notifications`), each turned off under "Konto" › "Notifikationer". */
@@ -52,13 +52,13 @@ export const apps = {
52
52
  /** After installing: where its blocks are now. */
53
53
  isInstalled: (app: string) => `${app} is installed`,
54
54
  isUninstalled: (app: string) => `${app} is uninstalled`,
55
- /** After installing or updating one from the store, which the site's next build has. */
56
- isInstalledSoon: (app: string) => `${app} is installed and can be used once the website is built`,
57
- isUpdatedSoon: (app: string, version: string) => `${app} is updated to ${version} and works that way once the website is built`,
55
+ /** After installing or updating one from the store, which the website gets in a few minutes. */
56
+ isInstalledSoon: (app: string) => `${app} is installed and can be used in a few minutes`,
57
+ isUpdatedSoon: (app: string, version: string) => `${app} is updated to ${version}. The website uses it in a few minutes.`,
58
58
  /** Asked before uninstalling. */
59
59
  askUninstall: (app: string) => `Uninstall ${app}? What the app adds disappears from the editor.`,
60
60
  /** The name of the switch in the row of one of its blocks (or kinds of a list), read by screen readers. */
61
- activeOf: (block: string) => `Activated: ${block}`,
61
+ activeOf: (block: string) => `Enabled: ${block}`,
62
62
  /** Under "Afinstaller". */
63
63
  uninstallHint: 'Can be uninstalled, as nothing on the website uses the app.',
64
64
  /** Over the pages and entries that use it (its blocks, its kind of pop-up). */
@@ -76,10 +76,10 @@ export const apps = {
76
76
  /** The app store: the button to it over the list of apps, its title, and its search. */
77
77
  find: 'Appstore',
78
78
  searchStore: 'Search for apps',
79
- loadingStore: 'Loading apps',
79
+ loadingStore: 'Loading apps…',
80
80
  storeFailed: 'Couldn’t load the Appstore',
81
81
  /** On "Appstore" when the site's Worker has no store key: only the site's own are there. */
82
- noStore: 'The site has no Appstore',
82
+ noStore: 'The website has no Appstore',
83
83
  /** On "Appstore": the box that connects the site to the Morpheme store, the row that disconnects it, and the answer at the store's hourly limit. */
84
84
  connectTitle: 'The website is not connected to Morpheme',
85
85
  connectText: 'Connect it to install apps and themes from the Appstore.',
@@ -110,7 +110,7 @@ export const apps = {
110
110
  version: (version: string) => `Version ${version}`,
111
111
  /** An app from the store in the site's file of apps, which the site's build does not have yet. */
112
112
  pending: 'Installing…',
113
- pendingHint: 'The app can be used once the website is built.',
113
+ pendingHint: 'The app can be used in a few minutes.',
114
114
  /** A newer version in the store: in the list, and the button on its page. */
115
115
  updateFound: 'Update available',
116
116
  update: (version: string) => `Update to ${version}`,
@@ -4,7 +4,7 @@ export const blockSettings = {
4
4
  on: 'On',
5
5
  off: 'Off',
6
6
  /** At the right of a block's row, and the filter, when it is off (its switch: active, off). */
7
- inactive: 'Deactivated',
7
+ inactive: 'Disabled',
8
8
  standard: 'Standard blocks',
9
9
  /** In the group of an installed app with neither blocks nor kinds. */
10
10
  noBlocks: 'The app has no blocks',
@@ -19,7 +19,7 @@ export const blockSettings = {
19
19
  offHint: 'Not shown under Insert.',
20
20
  /** The switch of an app's kind of a list, and under it: the list's name, its button for a new one ("Ny promovering"),
21
21
  * and its name for more ("promoveringer"). */
22
- active: 'Activated',
22
+ active: 'Enabled',
23
23
  kindStuck: (more: string) => `The block is used in ${more} and can’t be turned off`,
24
24
  kindStillOn: (n: number, what: string) => `The block is used in ${n} ${what}. Delete ${n === 1 ? 'it' : 'them'} first.`,
25
25
  kindOnHint: (create: string) => `Shown under ${create}.`,
@@ -28,11 +28,11 @@ export const blockSettings = {
28
28
  /** Under the preview: whose fields it has (the page's title). */
29
29
  asOn: (page: string) => `As shown on ${page}`,
30
30
  empty: 'An example. The block isn’t used on any page yet.',
31
- nothing: 'The block isn’t used on any page yet, so there is nothing to show',
31
+ nothing: 'The block isn’t used on any page yet, so there’s nothing to show',
32
32
  /** Under the preview of an app's kind of a list: whose fields it has (the entry's name), or none. */
33
33
  asIn: (entry: string) => `As shown in ${entry}`,
34
34
  kindEmpty: 'An example. The block isn’t used yet.',
35
- kindNothing: 'The block isn’t used yet, so there is nothing to show',
35
+ kindNothing: 'The block isn’t used yet, so there’s nothing to show',
36
36
  pages: 'Used on',
37
37
  noPages: 'No pages',
38
38
  /** Over the entries of an app's kind of a list (its name for more), and when there are none. */
@@ -10,9 +10,9 @@ export const blocks = {
10
10
  notSaved: (why: string) => `The block can't be saved yet. ${why}`,
11
11
  /** A picture, chosen and changed like a block. */
12
12
  picture: {
13
- label: 'Image',
14
- hint: 'Choose an image from Files, or upload a new one.',
15
- src: 'Image',
13
+ label: 'Picture',
14
+ hint: 'Choose a picture from Files, or upload a new one.',
15
+ src: 'Picture',
16
16
  alt: 'Alt text',
17
17
  altHint: 'For screen readers and search engines.',
18
18
  /** A picture that is only decoration: drawn with alt="", without an alternative text. */
@@ -112,7 +112,7 @@ export const blocks = {
112
112
  label: 'Banner',
113
113
  hint: "The page's top with a text, a picture, and buttons.",
114
114
  text: 'Text',
115
- textHint: 'The first paragraph is the subtitle, and a picture and buttons are put in with +.',
115
+ textHint: 'The first paragraph is the subtitle. Add a picture and buttons with +.',
116
116
  placement: 'Placement (picture)',
117
117
  placementBeside: 'Beside',
118
118
  placementBehind: 'Behind the text',
@@ -192,12 +192,12 @@ export const blocks = {
192
192
  /** The filters of the list: all of them. */
193
193
  allProviders: 'All providers',
194
194
  allCategories: 'All categories',
195
- /** A cookie added to the list by itself (the app "Cookiescanner") and not yet looked through: the heading at the
195
+ /** A cookie added to the list automatically (the app "Cookiescanner") and not yet looked through: the heading at the
196
196
  * top of the list, what it says, or that it has no purpose yet, what its form says, and the button. */
197
197
  fresh: 'New',
198
198
  freshLabel: 'New',
199
199
  noPurpose: 'No purpose',
200
- freshNotice: 'Added to the list by itself. Look it through and approve it.',
200
+ freshNotice: 'Added to the list automatically. Review it and approve it.',
201
201
  approve: 'Approve',
202
202
  },
203
203
  /** The shared texts ("Blokke" › "Cookieliste"), and what they start as on a site in this language. */
@@ -1,4 +1,4 @@
1
- // What is wrong when a form cannot be saved, also in the check before the build (check.ts).
1
+ // What is wrong when a form cannot be saved, also in the check before the website is updated (check.ts).
2
2
  export const check = {
3
3
  /** What a value must be, when it is another kind (a file edited by hand). */
4
4
  kinds: {
@@ -6,11 +6,11 @@ export const check = {
6
6
  object: 'must be a group of fields',
7
7
  number: 'must be a number',
8
8
  boolean: 'must be on or off',
9
- text: 'must be a text',
9
+ text: 'must be text',
10
10
  },
11
11
  address: 'Write the address with letters or digits',
12
12
  onlyDigits: 'Write only digits',
13
- digits: (n: number) => `Write ${n} digits`,
13
+ digits: (n: number) => (n === 1 ? 'Write 1 digit' : `Write ${n} digits`),
14
14
  fillIn: (label: string) => `Fill in "${label}."`,
15
15
  /** A label and what is wrong with its value. */
16
16
  wrong: (label: string, problem: string) => `${label}: ${problem}.`,
@@ -28,4 +28,7 @@ export const check = {
28
28
  atMostItems: (label: string, max: number) => `There can be at most ${max} in "${label}."`,
29
29
  mustBeOnPage: (name: string) => `"${name}" must be on the page.`,
30
30
  mustBeShown: (name: string) => `"${name}" must be shown on the page.`,
31
+ recordShape: 'A file’s tags need "src" (the file’s address) and the lists "categories" and "removed".',
32
+ recordOverlap: (tag: string) => `The tag "${tag}" is both chosen and removed.`,
33
+ recordDuplicate: (src: string) => `Another file of tags is for ${src}.`,
31
34
  };