diff --git a/src/sponsor/SponsorDialog.tsx b/src/sponsor/SponsorDialog.tsx
index 7e8320df..6ceaa79a 100644
--- a/src/sponsor/SponsorDialog.tsx
+++ b/src/sponsor/SponsorDialog.tsx
@@ -7,6 +7,7 @@ import React from 'react';
import { useDispatch } from 'react-redux';
import { pybricksTeamUrl } from '../app/constants';
import { useSelector } from '../reducers';
+import ClipboardIcon from '../utils/ClipboardIcon';
import ExternalLinkIcon from '../utils/ExternalLinkIcon';
import patreonLogo from './Digital-Patreon-Logo_White.png';
import gitHubIcon from './GitHub-Mark-Light-32px.png';
@@ -106,8 +107,10 @@ const SponsorDialog: React.VoidFunctionComponent = () => {
intent={Intent.PRIMARY}
icon={
}
fill={true}
+ onClick={() => navigator.clipboard.writeText('pybricks.eth')}
>
pybricks.eth
+
diff --git a/src/utils/ClipboardIcon.tsx b/src/utils/ClipboardIcon.tsx
new file mode 100644
index 00000000..958f80a7
--- /dev/null
+++ b/src/utils/ClipboardIcon.tsx
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: MIT
+// Copyright (c) 2021-2022 The Pybricks Authors
+
+// Icon for indicating external links
+
+import { Icon } from '@blueprintjs/core';
+import React from 'react';
+
+import './clipboard.scss';
+
+const ClipboardIcon: React.VFC = (_props) => {
+ return (
+
+
+
+
+
+
+ );
+};
+
+export default ClipboardIcon;
diff --git a/src/utils/clipboard.scss b/src/utils/clipboard.scss
new file mode 100644
index 00000000..f6f0da12
--- /dev/null
+++ b/src/utils/clipboard.scss
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: MIT
+// Copyright (c) 2021-2022 The Pybricks Authors
+
+@use '@blueprintjs/core/lib/scss/variables' as bp;
+
+span.pb-clipboard {
+ white-space: nowrap;
+}
+
+// override some button magic in case this is used in a button
+.#{bp.$ns}-button .pb-clipboard .#{bp.$ns}-icon:first-child:last-child {
+ margin: 0;
+}