@goodfellow-cms/admin 0.6.0 → 0.8.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.
package/dist/index.d.ts CHANGED
@@ -17,6 +17,7 @@ export declare const defaultStrings: {
17
17
  readonly "nav.blocks": "Blocks";
18
18
  readonly "nav.layout": "Header & Footer";
19
19
  readonly "nav.settings": "Site Settings";
20
+ readonly "nav.menu": "Menu";
20
21
  readonly loading: "Loading…";
21
22
  readonly "setup.noBackend": "This site's settings don't say where the site is stored, so the admin panel can't open it. A developer needs to add a backend to goodfellow.config.tsx.";
22
23
  readonly "signIn.title": "Sign in to edit this site";
@@ -102,13 +103,24 @@ export declare const defaultStrings: {
102
103
  readonly "editor.failed": "The editor stopped working. Reload the page to start it again.";
103
104
  readonly "editor.frame": "Editing {title}";
104
105
  readonly "editor.choose": "Editor";
106
+ readonly "editor.blockSearch": "Search blocks";
107
+ readonly "editor.blockSearchNone": 'No blocks match. Try another word, such as "picture" or "columns".';
108
+ readonly "editor.blockSearchFound": "Blocks found";
105
109
  readonly "editor.standard": "Standard editor";
110
+ readonly "editor.plugin.switchLoses": "Some of what you changed in {editor} can't be kept in the other editor, so switching now leaves behind everything you changed since you opened {editor}. Switch anyway?\n\n{problems}";
111
+ readonly "editor.plugin.pageSettings": "The page's settings";
112
+ readonly "editor.plugin.problem": "{block}: {message}";
113
+ readonly "editor.plugin.problemField": "{block}, {field}: {message}";
114
+ readonly "editor.plugin.loading": "Opening {editor}…";
106
115
  readonly "editor.plugin.failed": "{editor} didn't start. Choose the standard editor to keep editing.";
116
+ readonly "editor.invalid": "The editor gave back something this site can't publish, so nothing was published. Reload the page and try again.";
107
117
  readonly "editor.plugin.invalid": "{editor} gave back something this site can't publish, so nothing was published. Try again, or choose the standard editor.";
108
118
  readonly "publish.publishing": "Publishing…";
109
119
  readonly "publish.done": "Published.";
110
120
  readonly "publish.conflict": "Someone else changed the site since you opened this page, so your changes weren't published. Reload to see their changes, then make yours again.";
111
121
  readonly "publish.error": "Your changes couldn't be published. Check your connection and try again.";
122
+ readonly "publish.reloaded": "This is the page as the other person left it. Make your changes again, or put yours back to publish them over theirs.";
123
+ readonly "publish.putMineBack": "Put my changes back";
112
124
  readonly "publish.invalid": "Fix the highlighted problems before publishing.";
113
125
  readonly "draft.label": "Draft";
114
126
  readonly "draft.add": "Add to draft";
@@ -131,6 +143,9 @@ export declare const defaultStrings: {
131
143
  readonly "draft.leave": "Back to the live site";
132
144
  readonly "draft.waiting": "A draft started {date} is waiting to be published.";
133
145
  readonly "draft.waitingMany": "{count} drafts are waiting to be published.";
146
+ readonly "draft.reviewWaiting": "A draft is waiting for review: {title}.";
147
+ readonly "draft.reviewWaitingMany": "{count} drafts are waiting for review.";
148
+ readonly "draft.inReview": "Submitted for review.";
134
149
  readonly "draft.choose": "Draft to open";
135
150
  readonly "draft.started": "Started {date}";
136
151
  readonly "draft.open": "Open";
@@ -150,8 +165,25 @@ export declare const defaultStrings: {
150
165
  readonly "checks.alsoWarnings": "These could be better too:";
151
166
  readonly "checks.publishAnyway": "Publish anyway";
152
167
  readonly "checks.goBack": "Go back";
168
+ readonly "limits.title": "Some of this is outside what you can change";
169
+ readonly "limits.intro": "An owner has limited what you can change on this site, and these changes are outside it:";
170
+ readonly "limits.review": "Submit them for review instead: the site's reviewers are asked to look, and can publish them for you.";
171
+ readonly "limits.noReview": "Ask an owner to make these changes for you, or to let you make them on Site Settings' Editors screen.";
172
+ readonly "limits.goBack": "Go back";
173
+ readonly "limits.submitting": "Submitting for review…";
174
+ readonly "limits.submitted": "Submitted for review. The live site stays as it is until a reviewer publishes it.";
175
+ readonly "limits.submitError": "The changes couldn't be submitted for review. Check your connection and try again.";
176
+ readonly "limits.page": "The page {name}";
177
+ readonly "limits.entry": "{name}, in {collection}";
178
+ readonly "limits.media": "The media library";
179
+ readonly "limits.layout": "The header and footer";
180
+ readonly "limits.menus": "The menus";
181
+ readonly "limits.other": "The site's settings, or other things only owners change";
182
+ readonly "limits.readOnly": "You can look at this, but an owner has limited what you can change, and it's outside it.";
183
+ readonly "limits.mediaReadOnly": "An owner has limited what you can change, and the media library is outside it. You can still use its files on pages you can change.";
153
184
  readonly "checks.missing-page": "{place} links to {target}, which isn't a page on the site.";
154
185
  readonly "checks.missing-media": "{place} uses {target}, which isn't in the media library.";
186
+ readonly "checks.unsafe-link": "{place} links to {target}, an address that would run code on the site. Pages leave it out: use an address that starts with https://, or one of the site's own pages.";
155
187
  readonly "checks.no-title": "{place} has no title, so browser tabs and search results show only the site's name.";
156
188
  readonly "checks.missing-translation": "{place} has no translation in {language} yet. Visitors reading in {language} are sent to its home page instead.";
157
189
  readonly "checks.outdated-translation": "{place} has changed since its translation in {language} was made. Update the translation, then mark it as up to date.";
@@ -181,6 +213,7 @@ export declare const defaultStrings: {
181
213
  readonly "pages.empty": "This site has no pages yet.";
182
214
  readonly "pages.column.title": "Title";
183
215
  readonly "pages.column.address": "Address";
216
+ readonly "pages.look": "Look";
184
217
  readonly "pages.edit": "Edit";
185
218
  readonly "pages.move": "Change address";
186
219
  readonly "pages.duplicate": "Duplicate";
@@ -242,7 +275,7 @@ export declare const defaultStrings: {
242
275
  readonly "deletePage.submit": "Delete page";
243
276
  readonly "deletePage.message": 'Delete page "{title}"';
244
277
  readonly "address.invalid": "Use lowercase letters, numbers and hyphens, with / between parts, such as /about-us.";
245
- readonly "address.reserved": "This address is used by the admin panel. Choose another.";
278
+ readonly "address.reserved": "This address can't be used: the admin panel uses it, or it ends in /index, which is the page above it. Choose another.";
246
279
  readonly "address.taken": "Another page already uses this address.";
247
280
  readonly "field.required": "This can't be empty.";
248
281
  readonly "editPage.message": 'Update page "{title}"';
@@ -320,7 +353,7 @@ export declare const defaultStrings: {
320
353
  readonly "newEntry.addressHint": "The last part of the page's address, as in {example}.";
321
354
  readonly "newEntry.message": 'Add {entry} "{title}"';
322
355
  readonly "entryName.invalid": "Use lowercase letters, numbers and hyphens only, such as easter-vigil.";
323
- readonly "entryName.reserved": "This address is used by the admin panel. Choose another.";
356
+ readonly "entryName.reserved": "This address can't be used: the admin panel uses it, or it ends in /index, which is the page above it. Choose another.";
324
357
  readonly "entryName.taken": "Something else on the site already uses this address.";
325
358
  readonly "moveEntry.message": 'Move {entry} "{title}" from {from} to {to}';
326
359
  readonly "deleteEntry.body": "{title} will be removed from {name}.";
@@ -451,6 +484,11 @@ export declare const defaultStrings: {
451
484
  readonly "blocks.discard": "Discard changes";
452
485
  readonly "blocks.publish": "Publish";
453
486
  readonly "blocks.publishedNotice": "Published. Added blocks will be in the editor's list of blocks, and removed ones gone from it, once the site has been updated.";
487
+ readonly "blocks.submit": "Submit for review";
488
+ readonly "blocks.reviewHint": "Blocks' code runs on this site's server, which holds its secrets, so adding and removing blocks is submitted for review, for a developer to accept.";
489
+ readonly "blocks.reviewDescription": "From the admin panel's Blocks screen. The blocks' code runs on the site's server.";
490
+ readonly "blocks.submittedNotice": "Submitted for review. Once a developer accepts it and the site has been updated, the editor's list of blocks will change.";
491
+ readonly "blocks.seeReview": "See it";
454
492
  readonly "blocks.addMessage": "Add the {name} block";
455
493
  readonly "blocks.removeMessage": "Remove the {name} block";
456
494
  readonly "blocks.changeMessage": "Change blocks: {changes}";
@@ -488,6 +526,7 @@ export declare const defaultStrings: {
488
526
  readonly "media.uploaded": "Uploaded. Visitors see new files once the live site is updated.";
489
527
  readonly "media.uploadMessage": "Add {names}";
490
528
  readonly "media.replaceMessage": "Replace {name}";
529
+ readonly "media.replaceKind": "{name} is a different kind of file from {target}. Replace it with a file of the same kind, or upload {name} as a new file.";
491
530
  readonly "media.deleteMessage": "Delete {name}";
492
531
  readonly "media.deleteTitle": "Delete {name}?";
493
532
  readonly "media.deleteBody": "{name} will be removed from the site.";
@@ -513,6 +552,57 @@ export declare const defaultStrings: {
513
552
  readonly "table.removeColumn": "Remove this column";
514
553
  readonly "table.removeColumnNumber": "Remove column {column}";
515
554
  readonly "table.cell": "Row {row}, column {column}";
555
+ readonly "style.align": "Text alignment";
556
+ readonly "style.align.default": "As the block has it";
557
+ readonly "style.align.left": "Left";
558
+ readonly "style.align.center": "Centered";
559
+ readonly "style.align.right": "Right";
560
+ readonly "style.align.justify": "Justified";
561
+ readonly "style.fontSize": "Text size";
562
+ readonly "style.fontSize.xs": "Extra small";
563
+ readonly "style.fontSize.sm": "Small";
564
+ readonly "style.fontSize.base": "Normal";
565
+ readonly "style.fontSize.lg": "Large";
566
+ readonly "style.fontSize.xl": "Extra large";
567
+ readonly "style.fontSize.2xl": "Very large";
568
+ readonly "style.fontSize.3xl": "Huge";
569
+ readonly "style.fontSize.4xl": "Very huge";
570
+ readonly "style.fontSize.5xl": "Giant";
571
+ readonly "style.fontSize.6xl": "Enormous";
572
+ readonly "style.color": "Text color";
573
+ readonly "style.background": "Background color";
574
+ readonly "style.colorDefault": "As the block has it";
575
+ readonly "style.colorCustom": "Choose a color";
576
+ readonly "style.contrast": "This text may be hard to read on this background. Try colors further apart.";
577
+ readonly "style.padding": "Space inside";
578
+ readonly "style.margin": "Space around";
579
+ readonly "style.eachSide": "Set each side";
580
+ readonly "style.side.top": "Top";
581
+ readonly "style.side.right": "Right";
582
+ readonly "style.side.bottom": "Bottom";
583
+ readonly "style.side.left": "Left";
584
+ readonly "style.allSides": "All sides";
585
+ readonly "style.none": "None";
586
+ readonly "style.radius": "Rounded corners";
587
+ readonly "style.hiddenOn": "Hide on";
588
+ readonly "style.hiddenOn.phones": "Phones (narrower than 640px)";
589
+ readonly "style.hiddenOn.tablets": "Tablets (640px to 1023px)";
590
+ readonly "style.hiddenOn.computers": "Computers (1024px and wider)";
591
+ readonly "style.hiddenOnHint": "Choose a preview width above the page to see it as each size of screen does. A block hidden there is still in the Outline, where you can choose it.";
592
+ readonly "style.hiddenOnAll": "This block is hidden on every size of screen, so visitors never see it.";
593
+ readonly "style.radius.none": "Square";
594
+ readonly "style.radius.sm": "Slightly rounded";
595
+ readonly "style.radius.md": "Rounded";
596
+ readonly "style.radius.lg": "The theme's rounding";
597
+ readonly "style.radius.xl": "Very rounded";
598
+ readonly "style.radius.full": "Round";
599
+ readonly "style.default": "As the block has it";
600
+ readonly "style.custom": "Your own…";
601
+ readonly "style.customLength": "Your own size, such as 12px or 1.5rem";
602
+ readonly "style.customLengthInvalid": "Write a number with px, rem, em or %, such as 12px.";
603
+ readonly "style.other": "Other CSS classes";
604
+ readonly "style.otherHint": "Tailwind classes, or your own from Custom CSS, separated by spaces.";
605
+ readonly "style.reset": "Back to the block's own look";
516
606
  readonly "media.credit": "Credit: {credit}";
517
607
  readonly "media.stored": "Kept by {plugin}";
518
608
  readonly "media.error.storageSize": "{name} is too large: {plugin} takes files up to {size}.";
@@ -604,10 +694,8 @@ export declare const defaultStrings: {
604
694
  readonly "ai.error.answer": "The answer couldn't be used. Try again, or try a different model or service.";
605
695
  readonly "ai.error.service": "{service} reported a problem. Try again in a moment.";
606
696
  readonly "settings.title": "Site Settings";
607
- readonly "appearance.choice": "Colors of the admin panel";
608
- readonly "appearance.system": "Match my computer";
609
- readonly "appearance.light": "Light";
610
- readonly "appearance.dark": "Dark";
697
+ readonly "appearance.darkMode": "Dark mode";
698
+ readonly "adminLanguage.label": "Language of the admin panel";
611
699
  readonly "settings.tab.general": "General";
612
700
  readonly "settings.tab.languages": "Languages";
613
701
  readonly "settings.tab.theme": "Colors & fonts";
@@ -623,6 +711,7 @@ export declare const defaultStrings: {
623
711
  readonly "settings.previewEmpty": "Add a home page to see a preview here.";
624
712
  readonly "domain.intro": "Connect a domain you own, such as example.org, so the site is at that address.";
625
713
  readonly "domain.current": "The site is at {address} now.";
714
+ readonly "domain.copy": "This admin panel is a copy of the site's, such as a staging site, at {address}. That address is set where the copy is built, so the domain this screen connects is the main site's.";
626
715
  readonly "domain.connected": "Connected to {domain}.";
627
716
  readonly "domain.signIn": "Editors sign in by going to {host} and coming back here. Add {address} to the redirect URIs of the application they sign in with on {host}, or signing in will stop working once the site moves.";
628
717
  readonly "domain.local": "Domains are connected in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.";
@@ -722,6 +811,7 @@ export declare const defaultStrings: {
722
811
  readonly "security.contentOnly": "The sign-in page is set in the site's code, which is kept apart from its content, so a developer sets it there.";
723
812
  readonly "security.broker.title": "Sign-in page";
724
813
  readonly "security.broker.intro": "A sign-in page of its own, called a token broker, keeps editors' sign-in and AI keys at an address that holds nothing else, and shows the admin panel from there, so nothing on the site's pages can reach them. It asks the editor before publishing the site's code. It needs an address of its own, such as signin.example.org, that serves nothing else.";
814
+ readonly "security.exposed": "Editors sign in at the site's own address, where its pages could reach their sign-in: code added on the Code tab, or by a block, could act as anyone signed in. A sign-in page of its own, below, keeps it out of their reach, and needs no domain on GitLab, Cloudflare Pages or Vercel. Where you have a domain and the host allows it, an admin address of its own, on the Domain screen, does too.";
725
815
  readonly "security.broker.useTitle": "Sign in at a sign-in page that's online";
726
816
  readonly "security.add.title": "Add a token broker";
727
817
  readonly "security.add.intro": "Makes a project on {host} for the sign-in page, from Goodfellow's released files and a file naming this site, and puts it online where you choose. It needs a token that can create projects, used only now and kept only until you leave this screen.";
@@ -794,6 +884,74 @@ export declare const defaultStrings: {
794
884
  readonly "settings.tab.editors": "Editors";
795
885
  readonly "settings.tab.updates": "Updates";
796
886
  readonly "settings.tab.history": "Site history";
887
+ readonly "settings.tab.comments": "Comments";
888
+ readonly "comments.intro": "Visitors' comments are kept on GitHub, in a public project of their own, and shown on pages with the Comments block through Giscus. Visitors sign in with a GitHub account to comment.";
889
+ readonly "comments.demo": "Comments can't be set up in the demo.";
890
+ readonly "comments.local": "Comments are set up from the admin panel on the live site, which signs in to GitHub. Pages here show them once they are.";
891
+ readonly "comments.unavailable": "The admin panel can set comments up only where it signs in to GitHub itself. Set them up on GitHub as the documentation's Comments page says, then paste Giscus's code into the Comments block.";
892
+ readonly "comments.setup.title": "Set up comments";
893
+ readonly "comments.setup.new": "Make a new project for comments";
894
+ readonly "comments.setup.existing": "Use a project I already have";
895
+ readonly "comments.setup.name": "Name of the new project";
896
+ readonly "comments.setup.nameHint": "It's made beside the site's own on GitHub. Anyone can read it, since visitors read the comments from there.";
897
+ readonly "comments.setup.existingName": "The project, as owner/name or its address on GitHub";
898
+ readonly "comments.setup.existingHint": "It must be public. Its Discussions are turned on if they're off.";
899
+ readonly "comments.setup.button": "Set up comments";
900
+ readonly "comments.setup.working": "Setting up…";
901
+ readonly "comments.setup.description": "Visitors' comments on {site}";
902
+ readonly "comments.setup.message": "Set up comments";
903
+ readonly "comments.install.title": "Last step: install Giscus";
904
+ readonly "comments.install.intro": "Giscus is the GitHub app that shows comments on pages and posts what visitors write. Install it on {project}, choosing only that project.";
905
+ readonly "comments.install.button": "Install Giscus";
906
+ readonly "comments.install.then": "Then add the Comments block to a page, or to a collection's template. Pages show comments once the site has been rebuilt.";
907
+ readonly "comments.place.title": "Where comments are kept";
908
+ readonly "comments.place.kept": "Comments are kept as {category} discussions in";
909
+ readonly "comments.place.install": "If pages don't show comments, check that Giscus is installed on the project:";
910
+ readonly "comments.place.giscus": "Giscus on GitHub";
911
+ readonly "comments.stop.button": "Stop using comments";
912
+ readonly "comments.stop.title": "Stop using comments?";
913
+ readonly "comments.stop.body": "Pages stop showing comments once the site has been rebuilt. Everything visitors wrote stays in {project} on GitHub, so you can set comments up with it again later.";
914
+ readonly "comments.stop.message": "Stop using comments";
915
+ readonly "comments.moderate.title": "What visitors have written";
916
+ readonly "comments.moderate.empty": "No one has commented yet.";
917
+ readonly "comments.moderate.more": "Show more pages";
918
+ readonly "comments.moderate.block": "To stop someone commenting at all, block them on GitHub.";
919
+ readonly "comments.moderate.blockLink": "How to block someone";
920
+ readonly "comments.thread.count": "Comments: {count}";
921
+ readonly "comments.thread.locked": "Closed to new comments";
922
+ readonly "comments.thread.lock": "Close to new comments";
923
+ readonly "comments.thread.unlock": "Open to new comments";
924
+ readonly "comments.openOnGitHub": "Open on GitHub";
925
+ readonly "comments.comment.hidden": "Hidden";
926
+ readonly "comments.comment.hiddenAs": "Hidden as {reason}";
927
+ readonly "comments.comment.hide": "Hide";
928
+ readonly "comments.comment.show": "Show again";
929
+ readonly "comments.comment.delete": "Delete";
930
+ readonly "comments.hide.title": "Hide this comment?";
931
+ readonly "comments.hide.body": "It stays on the page, folded away and marked with why it was hidden, until you show it again.";
932
+ readonly "comments.hide.reason": "Why";
933
+ readonly "comments.reason.spam": "spam";
934
+ readonly "comments.reason.abuse": "abusive";
935
+ readonly "comments.reason.off-topic": "off topic";
936
+ readonly "comments.delete.title": "Delete this comment?";
937
+ readonly "comments.delete.body": "It's removed for good.";
938
+ readonly "comments.delete.bodyReplies": "It's removed for good, with the replies to it.";
939
+ readonly "comments.token.title": "Use a GitHub token for comments";
940
+ readonly "comments.token.intro": "The admin panel's sign-in can reach only the site's own project on GitHub. To set up and moderate comments, use a GitHub token of your own. It's kept only in this tab, until you sign out.";
941
+ readonly "comments.token.create": "Create a token on GitHub";
942
+ readonly "comments.token.scope": "It's filled in with what comments need: leave the choices as they are.";
943
+ readonly "comments.token.paste": "Copy the token and paste it here:";
944
+ readonly "comments.token.label": "GitHub token";
945
+ readonly "comments.token.active": "This tab is using a GitHub token of your own for comments.";
946
+ readonly "comments.error.no-access": "GitHub didn't let this sign-in do that. Use a GitHub token of your own, made by someone who can manage the project.";
947
+ readonly "comments.error.not-found": "GitHub has no project with that name, or this sign-in can't see it.";
948
+ readonly "comments.error.not-public": "That project is private, so visitors couldn't read its comments. Make it public on GitHub, then try again.";
949
+ readonly "comments.error.name-taken": "There's already a project with that name. Choose another name, or use it as a project you already have.";
950
+ readonly "comments.error.name-invalid": "A project's name can have only letters, numbers, hyphens, underscores and dots.";
951
+ readonly "comments.error.no-discussions": "Discussions are off in that project, and this sign-in can't turn them on. Turn them on in the project's settings on GitHub, then try again.";
952
+ readonly "comments.error.no-category": "That project's Discussions have no categories yet. Open its Discussions on GitHub once, then try again.";
953
+ readonly "comments.error.other": "Something went wrong on GitHub. Try again in a moment.";
954
+ readonly "comments.error.fix": "Open it on GitHub";
797
955
  readonly "settings.tab.import": "WordPress";
798
956
  readonly "settings.tab.themes": "Themes";
799
957
  readonly "plugins.notFound": "The site has no plugin screen at this address.";
@@ -1149,7 +1307,7 @@ export declare const defaultStrings: {
1149
1307
  readonly "updates.error.save": "The change couldn't be saved. Try again in a moment.";
1150
1308
  readonly "updates.error.other": "Something went wrong. Try again in a moment.";
1151
1309
  readonly "editors.intro": "The people who can edit this site.";
1152
- readonly "editors.roles": "Editors can change and publish everything in the admin panel. Owners can also invite and remove editors, and connect a domain.";
1310
+ readonly "editors.roles": "Editors can change and publish everything in the admin panel, unless their limits below say otherwise. Owners can also invite and remove editors, limit what they can change, and connect a domain.";
1153
1311
  readonly "editors.local": "Editors are invited in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.";
1154
1312
  readonly "editors.demo": "Editors can't be invited in a demo.";
1155
1313
  readonly "editors.loading": "Loading editors…";
@@ -1185,6 +1343,33 @@ export declare const defaultStrings: {
1185
1343
  readonly "editors.error.invalid": "That isn't a username or email address that {host} accepts.";
1186
1344
  readonly "editors.error.already": "They already edit the site, or have been invited.";
1187
1345
  readonly "editors.error.other": "Something went wrong. Try again in a moment.";
1346
+ readonly "permissions.title": "Limits";
1347
+ readonly "permissions.intro": "Limit what someone can change: some pages, some collections, the media library, the header and footer, or the menus. Anyone not listed here can change everything their role allows. Changes outside someone's limits go to a reviewer, who publishes them or not.";
1348
+ readonly "permissions.where": "The admin panel keeps people to their limits, so nobody changes the wrong page by mistake. People who can publish to the site on {host} could still change other files there, so only a site with its own server holds everyone to them.";
1349
+ readonly "permissions.whereServer": "The site's server holds everyone to their limits, whatever they try.";
1350
+ readonly "permissions.host": "the site's host";
1351
+ readonly "permissions.person": "Their username";
1352
+ readonly "permissions.personHint": "The name they sign in with, as the list above shows it.";
1353
+ readonly "permissions.add": "Limit what they can change";
1354
+ readonly "permissions.change": "Change";
1355
+ readonly "permissions.remove": "Remove limits";
1356
+ readonly "permissions.nothing": "Nothing yet";
1357
+ readonly "permissions.allPages": "Every page";
1358
+ readonly "permissions.editTitle": "What {name} can change";
1359
+ readonly "permissions.editIntro": "Tick what they can change. They can look at everything else, and submit changes to it for review.";
1360
+ readonly "permissions.pages": "Pages";
1361
+ readonly "permissions.pagesHint": "Each with the pages under it, and their translations.";
1362
+ readonly "permissions.collections": "Collections' items";
1363
+ readonly "permissions.more": "Also";
1364
+ readonly "permissions.languages": "Languages";
1365
+ readonly "permissions.everyLanguage": "Every language";
1366
+ readonly "permissions.save": "Publish limits";
1367
+ readonly "permissions.message": "Change what {name} can change";
1368
+ readonly "permissions.removeMessage": "Let {name} change everything";
1369
+ readonly "permissions.reviewers": "Who reviews changes outside someone's limits";
1370
+ readonly "permissions.reviewersHint": "Usernames, separated by commas. Leave it empty for every owner.";
1371
+ readonly "permissions.saveReviewers": "Publish reviewers";
1372
+ readonly "permissions.reviewersMessage": "Change who reviews changes outside editors' limits";
1188
1373
  readonly "general.siteTitle": "Site name";
1189
1374
  readonly "general.description": "Description";
1190
1375
  readonly "general.descriptionHint": "Shown by search engines when a page doesn't have its own description.";
@@ -1237,6 +1422,25 @@ export declare const defaultStrings: {
1237
1422
  readonly "forms.accessKeyLink": "Get an access key from Web3Forms";
1238
1423
  readonly "forms.captcha": "Ask visitors to show they aren't robots (hCaptcha)";
1239
1424
  readonly "forms.captchaHint": "Adds Web3Forms' hCaptcha and its script to pages with a form. To turn away answers without it, also turn hCaptcha on for the form in a Web3Forms account.";
1425
+ readonly "consent.title": "Visitors' consent";
1426
+ readonly "consent.ask": "Ask visitors before showing content from other sites";
1427
+ readonly "consent.hint": "Videos from YouTube and Vimeo, Google forms and maps, hCaptcha and the code under Code wait until visitors agree, with a notice at the bottom of the page that asks them. Their answer is kept in their browser. Links to #consent, such as in a menu, open the notice again.";
1428
+ readonly "consent.message": "What the notice says";
1429
+ readonly "consent.accept": "Button that agrees";
1430
+ readonly "consent.decline": "Button that doesn't";
1431
+ readonly "consent.held": "What's shown in a video's or form's place";
1432
+ readonly "consent.heldHint": "{site} is where it comes from, such as youtube-nocookie.com.";
1433
+ readonly "consent.show": "Button there that shows it";
1434
+ readonly "consent.policy": "Privacy page";
1435
+ readonly "consent.policyHint": "The page that says what the site and the sites it shows content from do, such as /privacy.";
1436
+ readonly "consent.policyLabel": "Words of the link to it";
1437
+ readonly "consent.choose": "Button that shows the choices";
1438
+ readonly "consent.save": "Button that keeps the choices";
1439
+ readonly "consent.kind.content": "Choice for content from other sites";
1440
+ readonly "consent.kind.statistics": "Choice for statistics";
1441
+ readonly "consent.kind.marketing": "Choice for advertising";
1442
+ readonly "consent.days": "Ask again after this many days";
1443
+ readonly "consent.daysHint": "Visitors' answers last this long, then the notice asks again. 180 days, about six months, is common; regulators in Europe accept up to 395, 13 months.";
1240
1444
  readonly "forms.formspree": "Formspree form address";
1241
1445
  readonly "forms.formspreeHint": "Make a form in Formspree and copy its address, such as https://formspree.io/f/xyzabcde. On Formspree's free plan, visitors see Formspree's own thank-you page.";
1242
1446
  readonly "forms.address": "Address forms send answers to";
@@ -1355,13 +1559,23 @@ export declare const defaultStrings: {
1355
1559
  readonly "css.label": "Custom CSS";
1356
1560
  readonly "code.editorHint": "Tab indents, and suggestions appear as you type. Press Escape, then Tab, to leave the editor. Ctrl+F finds and replaces.";
1357
1561
  readonly "code.intro": "Code from services such as analytics or site verification, added to every page of the site. It never runs in the admin panel, so check it on the site once it's published. Paste only code you trust: it can change anything on the site.";
1562
+ readonly "code.exposed": "Editors sign in at the same address as the site's pages, so code here runs where it could act as anyone signed in to the admin panel, and publish changes as them.";
1563
+ readonly "code.exposedFix": "A sign-in page or an admin address of its own, on the Security tab, keeps their sign-in out of its reach.";
1358
1564
  readonly "code.head": "In the page head";
1359
1565
  readonly "code.headHint": "Script, style, link, meta and noscript tags, such as the ones Google Analytics gives you.";
1566
+ readonly "code.purpose.head": "What the code in the page head is for";
1567
+ readonly "code.purpose.body": "What the code at the end of the page is for";
1568
+ readonly "code.purposeHint": "Visitors choose which kinds to allow. Code needed for the site to work loads for everyone without asking, so choose it only for code that doesn't follow visitors.";
1569
+ readonly "code.purpose.needed": "Needed for the site to work: loads without asking";
1570
+ readonly "code.purpose.content": "Content from other sites, such as a chat widget";
1571
+ readonly "code.purpose.statistics": "Statistics, such as Google Analytics";
1572
+ readonly "code.purpose.marketing": "Advertising";
1360
1573
  readonly "code.body": "At the end of the page";
1361
1574
  readonly "code.bodyHint": "Any HTML, such as a chat widget, added just before the end of every page.";
1362
1575
  readonly "code.error.text": 'The code in the page head has text outside a tag: "{text}". Only tags such as <script> and <meta> can go there.';
1363
1576
  readonly "code.error.tag": 'A <{tag}> tag can\'t go in the page head. Put it in "At the end of the page" instead.';
1364
1577
  readonly "code.error.unclosed": "A {tag} tag in the page head isn't closed.";
1578
+ readonly "code.error.template": "This code has </template> in it. While the site asks visitors before loading other sites' content, that would let the code run before they agree. Take it out.";
1365
1579
  };
1366
1580
  type StringKey = keyof typeof defaultStrings;
1367
1581
  type Strings = Record<StringKey, string>;
@@ -1433,7 +1647,7 @@ interface AdminProps {
1433
1647
  registry?: string;
1434
1648
  }
1435
1649
  /** The admin panel. Render it on its own page, such as `/admin`. */
1436
- export declare function Admin({ site, frames, store, host, server, preview, siteUrl, strings, registry }: AdminProps): import("react").JSX.Element;
1650
+ export declare function Admin({ site, frames, store, host, server, preview, siteUrl, strings, registry }: AdminProps): import("react").JSX.Element | null;
1437
1651
  /** Renders the admin panel into an element. */
1438
1652
  export declare function mountAdmin(element: Element, props: AdminProps): void;
1439
1653
  //#endregion