@goodfellow-cms/admin 0.5.0 → 0.6.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
@@ -1,4 +1,4 @@
1
- import { AdminSite, ContentStore, GitHost, SignInError } from "@goodfellow-cms/core";
1
+ import { AdminSite, ContentStore, GitHost, PluginTasks, SignInError } from "@goodfellow-cms/core";
2
2
  import "react";
3
3
  import "@goodfellow-cms/react";
4
4
  import "@puckeditor/core";
@@ -28,6 +28,7 @@ export declare const defaultStrings: {
28
28
  readonly "signIn.token.create": "Create a token on {host}";
29
29
  readonly "signIn.token.createBroad": "Create a broader token instead";
30
30
  readonly "signIn.token.createBroadHint": "Use this if the site belongs to someone else and the first link doesn't let you choose it. This kind of token can change everything your account can.";
31
+ readonly "signIn.token.apiTokenHint": "Use this if you can't create a token for the site itself. Paste your Atlassian account's email address, a colon, then the token, such as name@example.org:ATATT3x…, and give the token permission to read and write repositories, pull requests and pipelines.";
31
32
  readonly "signIn.token.chooseSite": "If {host} asks what the token can access, choose this site.";
32
33
  readonly "signIn.token.step2": "Copy the token and paste it here:";
33
34
  readonly "signIn.token.label": "Access token";
@@ -100,6 +101,10 @@ export declare const defaultStrings: {
100
101
  readonly "editor.viewport.phone": "Phone";
101
102
  readonly "editor.failed": "The editor stopped working. Reload the page to start it again.";
102
103
  readonly "editor.frame": "Editing {title}";
104
+ readonly "editor.choose": "Editor";
105
+ readonly "editor.standard": "Standard editor";
106
+ readonly "editor.plugin.failed": "{editor} didn't start. Choose the standard editor to keep editing.";
107
+ readonly "editor.plugin.invalid": "{editor} gave back something this site can't publish, so nothing was published. Try again, or choose the standard editor.";
103
108
  readonly "publish.publishing": "Publishing…";
104
109
  readonly "publish.done": "Published.";
105
110
  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.";
@@ -248,7 +253,7 @@ export declare const defaultStrings: {
248
253
  readonly "versions.back": "Back to editing";
249
254
  readonly "versions.intro": "Every version that's been published, newest first. Choose one to see it, then restore it to put it back. Something that was moved to a new address starts a new history there.";
250
255
  readonly "versions.notFound": "There's no history to show here. It may have been moved or deleted.";
251
- readonly "versions.local": "Version history is in the published site's admin panel, where you sign in with GitHub or GitLab.";
256
+ readonly "versions.local": "Version history is in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.";
252
257
  readonly "versions.demo": "Version history isn't kept in a demo.";
253
258
  readonly "versions.loading": "Loading versions…";
254
259
  readonly "versions.loadingVersion": "Loading this version…";
@@ -492,14 +497,51 @@ export declare const defaultStrings: {
492
497
  readonly "media.error.size": "{name} is too large: files can be up to 25 MB. For long videos, upload them to YouTube or Vimeo and link to them instead.";
493
498
  readonly "media.error.unreadable": "{name} couldn't be read. It may be damaged, or in a format browsers can't open, such as HEIC. Save it as a JPEG and try again.";
494
499
  readonly "media.choose": "Choose image";
500
+ readonly "media.chooseAudio": "Choose sound file";
495
501
  readonly "media.chooseFile": "Choose file";
496
502
  readonly "media.chooseVideo": "Choose video";
497
503
  readonly "media.pickerTitle": "Choose an image";
504
+ readonly "media.pickerTitleAudio": "Choose a sound file";
498
505
  readonly "media.pickerTitleFile": "Choose a file";
499
506
  readonly "media.pickerTitleVideo": "Choose a video";
500
507
  readonly "media.pickerEmpty": "Nothing has been uploaded yet. Upload a file to use it here.";
501
508
  readonly "media.clear": "Remove";
509
+ readonly "table.addRow": "Add a row";
510
+ readonly "table.addColumn": "Add a column";
511
+ readonly "table.removeRow": "Remove this row";
512
+ readonly "table.removeRowNumber": "Remove row {row}";
513
+ readonly "table.removeColumn": "Remove this column";
514
+ readonly "table.removeColumnNumber": "Remove column {column}";
515
+ readonly "table.cell": "Row {row}, column {column}";
502
516
  readonly "media.credit": "Credit: {credit}";
517
+ readonly "media.stored": "Kept by {plugin}";
518
+ readonly "media.error.storageSize": "{name} is too large: {plugin} takes files up to {size}.";
519
+ readonly "media.storage.title": "Where media is kept";
520
+ readonly "media.storage.intro": "{plugin} keeps the site's media in its storage, including large files such as long videos. It keeps {count} files now. Pages show them from there, at the same addresses.";
521
+ readonly "media.storage.missing": "{count} files are kept in storage by {plugin}, which the site no longer has. Pages still show them, but new files go into the site's own files.";
522
+ readonly "media.storage.notReady": "{plugin} can't take files yet. {message}";
523
+ readonly "media.storage.unavailable": "{plugin} didn't answer. Reload the admin panel and try again.";
524
+ readonly "media.storage.settings": "Open {plugin}'s settings";
525
+ readonly "media.storage.failed": "{plugin} couldn't keep {name}.";
526
+ readonly "media.storage.uploading": "Uploading to {plugin}… This takes about a minute.";
527
+ readonly "media.storage.wait": "Each group of files takes about a minute.";
528
+ readonly "media.move.button": "Move {count} files to {plugin}";
529
+ readonly "media.move.title": "Move the site's media to {plugin}?";
530
+ readonly "media.move.body": "{plugin} will keep these files, and pages will show them from its storage at the same addresses, so nothing on them changes. They're taken out of the site's own files; Version history keeps them.";
531
+ readonly "media.move.moving": "Moved {done} of {total}…";
532
+ readonly "media.move.busy": "Moving…";
533
+ readonly "media.move.nothing": "No files were moved.";
534
+ readonly "media.move.some": "Moved {count} files to {plugin}, then stopped.";
535
+ readonly "media.move.done": "Moved {count} files to {plugin}.";
536
+ readonly "media.move.message": "Move media to {plugin}";
537
+ readonly "media.back.button": "Move back to the site";
538
+ readonly "media.back.title": "Move the media back from {plugin}?";
539
+ readonly "media.back.body": "The files {plugin} keeps are copied back into the site's own files, at the same addresses, and new files go there too. Each can be up to 25 MB.";
540
+ readonly "media.back.empty": "{plugin} keeps no files now. New files will go into the site's own files.";
541
+ readonly "media.back.large": "These are larger than 25 MB, so {plugin} keeps them: {names}";
542
+ readonly "media.back.failed": "{name} couldn't be copied back from {plugin}'s storage, which may not allow it.";
543
+ readonly "media.back.done": "Moved {count} files back from {plugin}.";
544
+ readonly "media.back.message": "Move media back from {plugin}";
503
545
  readonly "ai.label": "AI";
504
546
  readonly "ai.title": "Write with AI";
505
547
  readonly "ai.mode.add": "Describe what to add to this page, and AI will write it at the end of the page.";
@@ -583,7 +625,7 @@ export declare const defaultStrings: {
583
625
  readonly "domain.current": "The site is at {address} now.";
584
626
  readonly "domain.connected": "Connected to {domain}.";
585
627
  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.";
586
- readonly "domain.local": "Domains are connected in the published site's admin panel, where you sign in with GitHub or GitLab.";
628
+ readonly "domain.local": "Domains are connected in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.";
587
629
  readonly "domain.admin.title": "Admin address";
588
630
  readonly "domain.admin.intro": "An address of its own for the admin panel, such as admin.example.org, keeps the site's pages from reaching what the admin panel keeps, such as editors' sign-in. Editors then sign in there. Blocks from registries other than Goodfellow's can be added only once the admin panel has one.";
589
631
  readonly "domain.admin.unsupported": "{host} serves each site at one address, so the admin panel can't have one of its own here.";
@@ -676,7 +718,7 @@ export declare const defaultStrings: {
676
718
  readonly "owner.token.paste": "Copy the token and paste it here:";
677
719
  readonly "settings.tab.security": "Security";
678
720
  readonly "security.demo": "A demo has no sign-in to keep safe.";
679
- readonly "security.local": "The sign-in page is set in the published site's admin panel, where you sign in with GitHub or GitLab.";
721
+ readonly "security.local": "The sign-in page is set in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.";
680
722
  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.";
681
723
  readonly "security.broker.title": "Sign-in page";
682
724
  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.";
@@ -753,8 +795,186 @@ export declare const defaultStrings: {
753
795
  readonly "settings.tab.updates": "Updates";
754
796
  readonly "settings.tab.history": "Site history";
755
797
  readonly "settings.tab.import": "WordPress";
798
+ readonly "settings.tab.themes": "Themes";
799
+ readonly "plugins.notFound": "The site has no plugin screen at this address.";
800
+ readonly "plugins.failed": "{plugin}'s screen couldn't start. If it keeps happening, the plugin may need updating.";
801
+ readonly "themes.intro": "A theme changes your site's look: its colors, fonts and the styles of its blocks, and sometimes its header and footer. Themes are only settings and styles, with no code, and you can change anything a theme sets afterwards in Colors & fonts and Custom CSS.";
802
+ readonly "themes.installed": "Installed theme";
803
+ readonly "themes.noneInstalled": "No theme is installed. Your site uses its own colors and fonts.";
804
+ readonly "themes.installedBadge": "Installed";
805
+ readonly "themes.release": "version {version}";
806
+ readonly "themes.updateAvailable": "Version {version} is out";
807
+ readonly "themes.updateTo": "Update to {version}";
808
+ readonly "themes.seeVersion": "See version {version}";
809
+ readonly "themes.upToDate": "Up to date";
810
+ readonly "themes.show": "Show";
811
+ readonly "themes.showLabel": "Show {name}";
812
+ readonly "themes.find": "Find a theme";
813
+ readonly "themes.search": "Search themes";
814
+ readonly "themes.searchButton": "Search";
815
+ readonly "themes.loading": "Looking for themes…";
816
+ readonly "themes.noneFound": "No themes were found.";
817
+ readonly "themes.byPublisher": "{name}, published by {publisher}";
818
+ readonly "themes.releaseDetails": "{name}, version {version}, published {date}";
819
+ readonly "themes.provenance": "Built from {source}, which npm checked when it was published.";
820
+ readonly "themes.noProvenance": "There's no record of where this version was built, so nobody has checked it came from its publisher's own code.";
821
+ readonly "themes.waiting": "Version {version} can be installed once it's {days} days old, since most harmful versions are found by then.";
822
+ readonly "themes.incompatible": "Version {version} doesn't say it works with Goodfellow {goodfellow}.";
823
+ readonly "themes.tooNew": "This theme's versions are too new to install. Versions can be installed once they're {days} days old.";
824
+ readonly "themes.notCompatible": "No version of this theme says it works with Goodfellow {version}.";
825
+ readonly "themes.imageAlt": "A site with the {title} theme";
826
+ readonly "themes.loads": "This theme asks visitors' browsers for these files from other sites, which can tell those sites who visits yours:";
827
+ readonly "themes.useLayout": "Use the theme's header and footer in place of yours. Your menus, logo and contact details stay as they are.";
828
+ readonly "themes.layoutUnknown": "The theme's header and footer use blocks a theme can't add, or that your site doesn't have ({blocks}), so they can't be used.";
829
+ readonly "themes.kept": "You changed these since the version before, so they stay as you set them: {list}.";
830
+ readonly "themes.replaced": "You changed these, and installing this theme replaces your changes: {list}.";
831
+ readonly "themes.changed.css": "the theme's CSS";
832
+ readonly "themes.preview": "Your site with {title}";
833
+ readonly "themes.previewPage": "Page to look at";
834
+ readonly "themes.install": "Install and publish";
835
+ readonly "themes.installDemo": "Install";
836
+ readonly "themes.installMessage": "Install the {title} theme, version {version}";
837
+ readonly "themes.updateMessage": "Update the {title} theme to version {version}";
838
+ readonly "themes.installedNotice": "{title} is installed. Your site will show it once it's rebuilt.";
839
+ readonly "themes.updated": "{title} is updated to version {version}.";
840
+ readonly "themes.remove": "Remove";
841
+ readonly "themes.removeTitle": "Remove {title}?";
842
+ readonly "themes.removeBody": "Colors, fonts and styles the theme set go back to Goodfellow's defaults, and its CSS is removed. Anything you changed yourself, and your header and footer, stay as they are.";
843
+ readonly "themes.removeReplaced": "Removing it also removes your changes to: {list}.";
844
+ readonly "themes.removeMessage": "Remove the {title} theme";
845
+ readonly "themes.removed": "{title} is removed.";
846
+ readonly "themes.error.record": "The record of which theme is installed can't be read.";
847
+ readonly "themes.error.unreachable": "Themes can't be looked up right now. Check your internet connection and try again.";
848
+ readonly "themes.error.badFile": "This theme has a problem in its files, so it can't be installed. Its publisher needs to fix it.";
849
+ readonly "themes.error.notATheme": "This package isn't a Goodfellow theme.";
850
+ readonly "settings.tab.plugins": "Plugins";
851
+ readonly "plugins.intro": "Plugins add to what your site and this admin panel can do, such as blocks, screens here, and steps when your site is built. Unlike themes, they have code, which is included when your site is built and runs on its pages, so install only plugins you trust. Before you install one, this screen shows what it asks to do and reads its code for things to look at.";
852
+ readonly "plugins.where.none": "Plugins can be installed here once the admin panel has an address of its own, or a token broker, where your site's pages can't reach it: see the Domain and Security tabs. Until then, a developer can add plugins to the site's code.";
853
+ readonly "plugins.where.contentOnly": "This site's code is kept apart from its content, so a developer adds plugins there.";
854
+ readonly "plugins.where.demo": "Plugins can't be installed in a demo.";
855
+ readonly "plugins.where.local": "On this computer, a developer adds plugins with npm and lists them in goodfellow.config.tsx. The published admin panel installs them.";
856
+ readonly "plugins.where.setup": "Your site's build doesn't write the list of its packages' versions yet, which plugins installed here need. A developer needs to update its build setup to the starter's first.";
857
+ readonly "plugins.installed": "Installed plugins";
858
+ readonly "plugins.noneInstalled": "No plugins are installed.";
859
+ readonly "plugins.inCode": "Added by a developer";
860
+ readonly "plugins.installedBadge": "Installed";
861
+ readonly "plugins.release": "version {version}";
862
+ readonly "plugins.updateAvailable": "Version {version} is out";
863
+ readonly "plugins.updateTo": "Update to {version}";
864
+ readonly "plugins.seeVersion": "See version {version}";
865
+ readonly "plugins.upToDate": "Up to date";
866
+ readonly "plugins.show": "Show";
867
+ readonly "plugins.showLabel": "Show {name}";
868
+ readonly "plugins.find": "Find a plugin";
869
+ readonly "plugins.search": "Search plugins";
870
+ readonly "plugins.searchButton": "Search";
871
+ readonly "plugins.loading": "Looking for plugins…";
872
+ readonly "plugins.noneFound": "No plugins were found.";
873
+ readonly "plugins.byPublisher": "{name}, published by {publisher}";
874
+ readonly "plugins.releaseDetails": "{name}, version {version}, published {date}";
875
+ readonly "plugins.provenance": "Built from {source}, which npm checked when it was published.";
876
+ readonly "plugins.noProvenance": "There's no record of where this version was built, so nobody has checked it came from its publisher's own code.";
877
+ readonly "plugins.waiting": "Version {version} can be installed once it's {days} days old, since most harmful versions are found by then.";
878
+ readonly "plugins.incompatible": "Version {version} doesn't say it works with Goodfellow {goodfellow}.";
879
+ readonly "plugins.tooNew": "This plugin's versions are too new to install. Versions can be installed once they're {days} days old.";
880
+ readonly "plugins.notCompatible": "No version of this plugin says it works with Goodfellow {version}.";
881
+ readonly "plugins.asks": "What it asks to do";
882
+ readonly "plugins.asks.connect": "Reach these addresses from the admin panel: {list}";
883
+ readonly "plugins.asks.files": "Read and publish these files: {list}";
884
+ readonly "plugins.asks.secrets": "Get these secrets when your site is built: {list}";
885
+ readonly "plugins.asks.read": "Read these parts of your site when it's built: {list}";
886
+ readonly "plugins.asks.write": "Write these parts of the built site: {list}";
887
+ readonly "plugins.asks.blocks": "Add these blocks: {list}";
888
+ readonly "plugins.asks.admin": "Run in the admin panel, in a frame of its own that can't reach your sign-in";
889
+ readonly "plugins.asks.screens": "Add these screens to Site Settings: {list}";
890
+ readonly "plugins.asks.build": "Run these steps when your site is built: {list}";
891
+ readonly "plugins.asks.tasks": "Run these tasks with its secrets when the admin panel asks, each taking about a minute: {list}";
892
+ readonly "plugins.secrets.github.title": "Add them on GitHub";
893
+ readonly "plugins.secrets.github.link": "Open GitHub's form for a new secret";
894
+ readonly "plugins.secrets.github.open": "Open GitHub's form for a new secret with the link below. Add each key there, one at a time, opening the form again for the next.";
895
+ readonly "plugins.secrets.github.add": "For {name}: type {name} in Name, paste its value in Secret, and choose Add secret.";
896
+ readonly "plugins.secrets.github.who": "Only the site's owners on GitHub can open the form.";
897
+ readonly "plugins.secrets.github.kind": "This form adds secrets for this site alone, which is all it needs. GitHub's environment and organization secrets are for other things, so you can leave them alone.";
898
+ readonly "plugins.secrets.gitlab.title": "Add them on GitLab";
899
+ readonly "plugins.secrets.gitlab.link": "Open the site's CI/CD settings on GitLab";
900
+ readonly "plugins.secrets.gitlab.open": "Open the site's CI/CD settings on GitLab with the link below, and expand Variables. Add each key there, one at a time.";
901
+ readonly "plugins.secrets.gitlab.add": "For {name}: choose Add variable, choose Masked under Visibility, keep Protect variable ticked, type {name} in Key, paste its value in Value, and choose Add variable.";
902
+ readonly "plugins.secrets.gitlab.who": "Only the site's owners (Maintainers) on GitLab can change its CI/CD settings.";
903
+ readonly "plugins.secrets.bitbucket.title": "Add them on Bitbucket";
904
+ readonly "plugins.secrets.bitbucket.link": "Open the site's Pipelines variables on Bitbucket";
905
+ readonly "plugins.secrets.bitbucket.open": "Open the site's Pipelines variables on Bitbucket with the link below. Add each key there, one at a time. If Bitbucket says Pipelines isn't turned on, turn it on under Settings first.";
906
+ readonly "plugins.secrets.bitbucket.add": "For {name}: type {name} in Name, paste its value in Value, tick Secured, and choose Add.";
907
+ readonly "plugins.secrets.bitbucket.who": "Only the site's owners (with Admin permission) on Bitbucket can change its variables.";
908
+ readonly "plugins.secrets.development.title": "Add them on this computer";
909
+ readonly "plugins.secrets.development.file": "In the site's folder, beside package.json, open the file .env.local, or make it, and add a line for each of {names}:";
910
+ readonly "plugins.secrets.development.values": "Put each value after its =, save the file, and try again. There's no need to restart the development server.";
911
+ readonly "plugins.secrets.development.local": "This is only for trying the site on this computer: .env.local is never published. The live site needs them in its own secrets too.";
912
+ readonly "plugins.secrets.server.title": "Add them to the site's server";
913
+ readonly "plugins.secrets.server.add": "Add {names} as environment variables where the site's server runs, such as the project's Settings → Environment Variables on Vercel.";
914
+ readonly "plugins.secrets.server.deploy": "Then deploy the site again so the server has them.";
915
+ readonly "plugins.secrets.server.who": "Whoever set up the site's server knows where its environment variables are. Without them there, the build service's secrets below are used instead, which is slower.";
916
+ readonly "plugins.task.missing": "Your site's setup can't run plugins' tasks yet. A developer needs to copy the starter's plugin-task setup into the site.";
917
+ readonly "plugins.task.not-allowed": "Your sign-in can't run plugins' tasks. Ask the site's owner to let you publish.";
918
+ readonly "plugins.task.timeout": "The site's build service didn't answer in time. Try again in a few minutes.";
919
+ readonly "plugins.task.failed": "The site's build service couldn't run the plugin's task. Try again, or ask a developer to look at the site's builds.";
920
+ readonly "plugins.asks.server": "Answer requests on your site's server, with everything the server can do";
921
+ readonly "plugins.asks.mediaStorage": "Keep your site's media in a storage service, outside the site's own files";
922
+ readonly "plugins.asks.editor": "Offer its own page editor, {title}, which anyone editing the site can choose in place of the usual one, and which is given what they edit there";
923
+ readonly "plugins.asks.always": "Like any plugin, its code is included when your site is built, and its blocks run on your site's pages, where nothing holds them to what it asks.";
924
+ readonly "plugins.asks.new": "This version asks for more than the one installed:";
925
+ readonly "plugins.code": "What its code does";
926
+ readonly "plugins.code.intro": "The plugin's code, and the code of the packages it needs, read as text for things to look at. Code can hide what it does, so this is a place to start, not a promise.";
927
+ readonly "plugins.code.reading": "Reading its code…";
928
+ readonly "plugins.code.via": "needed by {via}";
929
+ readonly "plugins.code.none": "Nothing to look at was found.";
930
+ readonly "plugins.code.summary": "Its code: {list}.";
931
+ readonly "plugins.code.nothing": "Nothing to look at was found in its code.";
932
+ readonly "plugins.code.unreadSummary": "{count} of its packages couldn't be read in full.";
933
+ readonly "plugins.note.network": "makes network requests";
934
+ readonly "plugins.note.programs": "runs other programs on the computer that builds your site";
935
+ readonly "plugins.note.eval": "runs code made from text, which can't be read beforehand";
936
+ readonly "plugins.note.native": "includes native code, which can't be read";
937
+ readonly "plugins.note.install-script": "has a script npm would run when installing it, which your site's build doesn't run, since it installs packages with scripts turned off";
938
+ readonly "plugins.unread.too-large": "Too large to read in full.";
939
+ readonly "plugins.unread.too-many": "Not read: the plugin needs too many packages to read them all.";
940
+ readonly "plugins.unread.no-release": "No version of it is old enough yet, so your site couldn't be built with this plugin.";
941
+ readonly "plugins.unread.range": "Comes from somewhere other than npm, so it wasn't read.";
942
+ readonly "plugins.unread.unavailable": "Couldn't be read.";
943
+ readonly "plugins.install": "Install";
944
+ readonly "plugins.confirmTitle": "Install {title}?";
945
+ readonly "plugins.confirmIntro": "{name} version {version} asks to:";
946
+ readonly "plugins.confirmConfig": "Your site's settings file is changed too, to list the plugins installed here, since it didn't yet.";
947
+ readonly "plugins.confirmBuild": "Your site's build then writes down the versions of the packages it needs, without running any of their code, and rebuilds your site with it, which takes a few minutes.";
948
+ readonly "plugins.confirmReview": "Your site's server holds its secrets, so installing a plugin is submitted for review, for a developer to accept.";
949
+ readonly "plugins.confirmInstall": "Install and publish";
950
+ readonly "plugins.submit": "Submit for review";
951
+ readonly "plugins.reviewIntro": "Installs {name} version {version}, from the admin panel's Plugins screen. It asks to:";
952
+ readonly "plugins.installMessage": "Install the {title} plugin, version {version}";
953
+ readonly "plugins.updateMessage": "Update the {title} plugin to version {version}";
954
+ readonly "plugins.installedNotice": "{title} is installed. Your site will have it once it's rebuilt, in a few minutes.";
955
+ readonly "plugins.updated": "{title} is updated to version {version}.";
956
+ readonly "plugins.submitted": "The change to {title} is submitted for review.";
957
+ readonly "plugins.seeReview": "See it";
958
+ readonly "plugins.remove": "Remove";
959
+ readonly "plugins.removeReview": "Submit for review";
960
+ readonly "plugins.removeTitle": "Remove {title}?";
961
+ readonly "plugins.removeBody": "Its code is taken out of your site when it's next built. Files it kept in your site's content stay where they are.";
962
+ readonly "plugins.removeUsed": "Pages use its blocks ({blocks}), so it can't be removed. Take them off those pages first.";
963
+ readonly "plugins.removeKeepsMedia": "{title} keeps your site's media, which pages show from its storage. Move the media back into the site's own files on the Media screen first.";
964
+ readonly "plugins.removeMessage": "Remove the {title} plugin";
965
+ readonly "plugins.removed": "{title} is removed.";
966
+ readonly "plugins.error.record": "The record of which plugins are installed can't be read.";
967
+ readonly "plugins.error.unreachable": "Plugins can't be looked up right now. Check your internet connection and try again.";
968
+ readonly "plugins.error.badFile": "This plugin has a problem in its files, so it can't be installed. Its publisher needs to fix it.";
969
+ readonly "plugins.error.notAPlugin": "This package isn't a Goodfellow plugin.";
970
+ readonly "plugins.error.config": "Your site's settings file lists plugins of its own, so a developer needs to add the ones installed here to it first.";
971
+ readonly "plugins.error.inCode": "A developer added this plugin to the site's code, so it's changed there.";
972
+ readonly "plugins.error.blockClash": "This plugin's blocks have the same names as ones your site has: {blocks}.";
973
+ readonly "plugins.error.notInstalled": "This plugin wasn't installed here.";
974
+ readonly "updates.pluginRange": "{title}, a plugin installed here, says it works with Goodfellow {range}, so your site may not build with Goodfellow {version} until the plugin has a newer version.";
975
+ readonly "updates.themeRange": "Your theme, {title}, says it works with Goodfellow {range}. Goodfellow {version} may change how it looks, so check Themes for a newer version of it after updating.";
756
976
  readonly "siteHistory.intro": "Every publish that changed the site's pages, items, settings or media, newest first. Choose one to see how the site looked after it and what has changed since, then restore the whole site as it was.";
757
- readonly "siteHistory.local": "Site history is in the published site's admin panel, where you sign in with GitHub or GitLab.";
977
+ readonly "siteHistory.local": "Site history is in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.";
758
978
  readonly "siteHistory.demo": "Site history isn't kept in a demo.";
759
979
  readonly "siteHistory.error": "The site's history couldn't be loaded. Check your connection and try again.";
760
980
  readonly "siteHistory.current": "The site now";
@@ -782,6 +1002,7 @@ export declare const defaultStrings: {
782
1002
  readonly "siteHistory.subject.redirects": "Redirects";
783
1003
  readonly "siteHistory.subject.credits": "Photo credits";
784
1004
  readonly "siteHistory.subject.css": "Custom CSS";
1005
+ readonly "siteHistory.subject.theme": "Which theme is installed";
785
1006
  readonly "siteHistory.subject.code": "Code added to every page";
786
1007
  readonly "import.title": "Import from WordPress";
787
1008
  readonly "import.intro": "Bring a WordPress site's pages, posts, categories, tags, menus and media into this site. Pages keep their addresses, posts become a collection, and old addresses send visitors on to the new ones. You'll see what comes across before anything changes.";
@@ -819,7 +1040,7 @@ export declare const defaultStrings: {
819
1040
  readonly "import.note.embed": "Something from {name} is now a link to it: {items}.";
820
1041
  readonly "import.note.form": "A form was left out. Add a Form block in its place: {items}.";
821
1042
  readonly "import.note.script": "A script was left out: {items}.";
822
- readonly "import.note.table": "A table became text, since pages have no tables: {items}.";
1043
+ readonly "import.note.table": "A table became text, since the site has no Table block: {items}.";
823
1044
  readonly "import.note.posts": "A list of the latest posts was left out of a post: {items}.";
824
1045
  readonly "import.note.video": "A video is now a link to it, since posts show videos as links: {items}.";
825
1046
  readonly "import.note.oldLinks": "Links that still go to the WordPress site, to pages that weren't imported: {count}, such as {url}.";
@@ -861,7 +1082,7 @@ export declare const defaultStrings: {
861
1082
  readonly "updates.code.link": "See it on {host}";
862
1083
  readonly "updates.noAccess": "Your sign-in can't see the site's code, at {place}, where its updates are installed. Ask the site's developer to give you access to it. On GitHub, an access token needs to reach it too, or with Sign in with GitHub, Goodfellow's app needs to be installed there.";
863
1084
  readonly "updates.back.skip": "Don't install Goodfellow {version} again";
864
- readonly "updates.local": "Updates are shown in the published site's admin panel, where you sign in with GitHub or GitLab.";
1085
+ readonly "updates.local": "Updates are shown in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.";
865
1086
  readonly "updates.demo": "Updates aren't installed in a demo.";
866
1087
  readonly "updates.loading": "Checking for updates…";
867
1088
  readonly "updates.current": "This site uses Goodfellow {version}.";
@@ -929,7 +1150,7 @@ export declare const defaultStrings: {
929
1150
  readonly "updates.error.other": "Something went wrong. Try again in a moment.";
930
1151
  readonly "editors.intro": "The people who can edit this site.";
931
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.";
932
- readonly "editors.local": "Editors are invited in the published site's admin panel, where you sign in with GitHub or GitLab.";
1153
+ readonly "editors.local": "Editors are invited in the published site's admin panel, where you sign in with GitHub, GitLab or Bitbucket.";
933
1154
  readonly "editors.demo": "Editors can't be invited in a demo.";
934
1155
  readonly "editors.loading": "Loading editors…";
935
1156
  readonly "editors.onlyOwners": "Only the site's owners can invite and remove editors.";
@@ -954,6 +1175,7 @@ export declare const defaultStrings: {
954
1175
  readonly "editors.invite.title": "Invite someone";
955
1176
  readonly "editors.invite.field": "Their {host} username";
956
1177
  readonly "editors.invite.hint": "They need a {host} account. {host} emails them an invitation, which they accept before they can sign in here.";
1178
+ readonly "editors.invite.hintMembers": "They need to be in the site's {host} workspace already. They can edit as soon as you add them.";
957
1179
  readonly "editors.invite.fieldEmail": "Their email address or {host} username";
958
1180
  readonly "editors.invite.hintEmail": "With an email address, {host} emails them an invitation, and they make an account if they don't have one.";
959
1181
  readonly "editors.invite.submit": "Invite";
@@ -1040,6 +1262,12 @@ export declare const defaultStrings: {
1040
1262
  readonly "theme.bodyFont": "Text";
1041
1263
  readonly "theme.radius": "Corner rounding";
1042
1264
  readonly "theme.radiusHint": "Such as 0.5rem, or 0 for square corners.";
1265
+ readonly "theme.parts": "Blocks' parts";
1266
+ readonly "theme.partsHint": "Give a part of every block of one kind classes, such as rounded-xl shadow-sm, to change how they all look. They come after the block's own classes and before what's chosen for each block.";
1267
+ readonly "theme.partsBlock": "Block";
1268
+ readonly "theme.partsBlockStyled": "{block} ({count} styled)";
1269
+ readonly "theme.partsName": "Its name is {name}, for custom CSS.";
1270
+ readonly "theme.partsNone": "This site's blocks have no named parts.";
1043
1271
  readonly "theme.color.background": "Background";
1044
1272
  readonly "theme.color.foreground": "Text";
1045
1273
  readonly "theme.color.primary": "Main color";