From 69f11c7f313c14124090bf74293a3d3e4c71cb4f Mon Sep 17 00:00:00 2001
From: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
Date: Tue, 27 Jan 2026 12:12:36 -0500
Subject: [PATCH] Update copy highlighting nonprofit status
---
_locales/en/messages.json | 12 +++
.../components/PreferencesDonations.scss | 24 ------
ts/components/About.dom.tsx | 4 +
ts/components/ChatsTab.dom.tsx | 4 +
...ionPrivacyInformationModal.dom.stories.tsx | 22 +++++
.../DonationPrivacyInformationModal.dom.tsx | 81 +++++++++++--------
ts/components/PreferencesDonations.dom.tsx | 4 +-
7 files changed, 91 insertions(+), 60 deletions(-)
create mode 100644 ts/components/DonationPrivacyInformationModal.dom.stories.tsx
diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index f167ef0884..b5749ab67b 100644
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -1086,6 +1086,10 @@
"messageformat": "See {whatsNew} in this update",
"description": "Shown in the main window"
},
+ "icu:signalNonProfit": {
+ "messageformat": "Signal is a 501c3 nonprofit",
+ "description": "Shown at the bottom of the main window when a chat is not selected"
+ },
"icu:viewReleaseNotes": {
"messageformat": "what's new",
"description": "Clickable link that displays the latest release notes"
@@ -9698,10 +9702,18 @@
"messageformat": "Privacy over Profit",
"description": "Title shown at the top of the donations preferences page"
},
+ "icu:PreferencesDonations__title-v2": {
+ "messageformat": "Proudly nonprofit",
+ "description": "Title shown at the top of the donations preferences page"
+ },
"icu:PreferencesDonations__description": {
"messageformat": "Private messaging, funded by you. No ads, no tracking, no compromise. Donate now to support Signal. Read more",
"description": "Description text explaining Signal's donation model with learn more link"
},
+ "icu:PreferencesDonations__description-v2": {
+ "messageformat": "Donate to support private messaging. Keep Signal independent and ad-free. Read more",
+ "description": "Description text explaining Signal's donation model with learn more link"
+ },
"icu:PreferencesDonations__donate-button": {
"messageformat": "Donate",
"description": "Button text to make a donation"
diff --git a/stylesheets/components/PreferencesDonations.scss b/stylesheets/components/PreferencesDonations.scss
index 5a2daf6940..a973e831a9 100644
--- a/stylesheets/components/PreferencesDonations.scss
+++ b/stylesheets/components/PreferencesDonations.scss
@@ -438,30 +438,6 @@
}
}
-.DonationPrivacyInformationModal {
- @include donations-modal;
-
- &__footer {
- display: flex;
- justify-content: space-between;
- align-items: center;
- gap: 16px;
- }
-
- &__faqs-link {
- @include mixins.button-reset;
-
- & {
- color: variables.$color-ultramarine;
- text-decoration: none;
-
- &:hover {
- text-decoration: underline;
- }
- }
- }
-}
-
.PreferencesDonations__badge-list {
width: 100%;
margin-block: 4px 8px;
diff --git a/ts/components/About.dom.tsx b/ts/components/About.dom.tsx
index 33e0f0f09b..14eff03d0f 100644
--- a/ts/components/About.dom.tsx
+++ b/ts/components/About.dom.tsx
@@ -5,6 +5,7 @@ import React from 'react';
import type { LocalizerType } from '../types/Util.std.js';
import { useEscapeHandling } from '../hooks/useEscapeHandling.dom.js';
+import { tw } from '../axo/tw.dom.js';
export type AboutProps = Readonly<{
closeAbout: () => unknown;
@@ -63,6 +64,9 @@ export function About({
{i18n('icu:privacyPolicy')}
+
+ {i18n('icu:signalNonProfit')}
+
);
diff --git a/ts/components/ChatsTab.dom.tsx b/ts/components/ChatsTab.dom.tsx
index 806e3af8f5..636acc4826 100644
--- a/ts/components/ChatsTab.dom.tsx
+++ b/ts/components/ChatsTab.dom.tsx
@@ -7,6 +7,7 @@ import type { NavTabPanelProps } from './NavTabs.dom.js';
import { WhatsNewLink } from './WhatsNewLink.dom.js';
import type { UnreadStats } from '../util/countUnreadStats.std.js';
import type { SmartConversationViewProps } from '../state/smart/ConversationView.preload.js';
+import { tw } from '../axo/tw.dom.js';
export type ChatsTabProps = Readonly<{
otherTabsUnreadStats: UnreadStats;
@@ -74,6 +75,9 @@ export function ChatsTab({
+
+ {i18n('icu:signalNonProfit')}
+
)}
diff --git a/ts/components/DonationPrivacyInformationModal.dom.stories.tsx b/ts/components/DonationPrivacyInformationModal.dom.stories.tsx
new file mode 100644
index 0000000000..122299e947
--- /dev/null
+++ b/ts/components/DonationPrivacyInformationModal.dom.stories.tsx
@@ -0,0 +1,22 @@
+// Copyright 2025 Signal Messenger, LLC
+// SPDX-License-Identifier: AGPL-3.0-only
+
+import React from 'react';
+
+import { action } from '@storybook/addon-actions';
+
+import type { Meta } from '@storybook/react';
+import { DonationPrivacyInformationModal } from './DonationPrivacyInformationModal.dom.js';
+import type { LocalizerType } from '../types/I18N.std.js';
+
+const { i18n } = window.SignalContext;
+
+export default {
+ title: 'Components/DonationPrivacyInformationModal',
+} satisfies Meta<{ i18n: LocalizerType; onClose: VoidFunction }>;
+
+export function Default(): React.JSX.Element {
+ return (
+
+ );
+}
diff --git a/ts/components/DonationPrivacyInformationModal.dom.tsx b/ts/components/DonationPrivacyInformationModal.dom.tsx
index ee4165945c..2b1b1f723e 100644
--- a/ts/components/DonationPrivacyInformationModal.dom.tsx
+++ b/ts/components/DonationPrivacyInformationModal.dom.tsx
@@ -2,11 +2,11 @@
// SPDX-License-Identifier: AGPL-3.0-only
import React, { useCallback } from 'react';
-import { Modal } from './Modal.dom.js';
-import { Button, ButtonSize } from './Button.dom.js';
-import { I18n } from './I18n.dom.js';
import type { LocalizerType } from '../types/Util.std.js';
import { openLinkInWebBrowser } from '../util/openLinkInWebBrowser.dom.js';
+import { AxoDialog } from '../axo/AxoDialog.dom.js';
+import { I18n } from './I18n.dom.js';
+import { tw } from '../axo/tw.dom.js';
export type DonationPrivacyInformationModalProps = {
i18n: LocalizerType;
@@ -23,43 +23,56 @@ export function DonationPrivacyInformationModal({
);
};
- const modalFooter = (
-
-
-
-
- );
-
const paragraphComponent = useCallback(
(parts: Array) => {parts}
,
[]
);
return (
- {
+ if (!open) {
+ onClose();
+ }
+ }}
>
-
-
+
+
+
+ {i18n('icu:PreferencesDonations__privacy-modal-title')}
+
+
+
+
+
+
+
+
+
+
+
+ {i18n('icu:PreferencesDonations__faqs')}
+
+
+ {i18n('icu:PreferencesDonations__privacy-modal-ok')}
+
+
+
+
+
);
}
diff --git a/ts/components/PreferencesDonations.dom.tsx b/ts/components/PreferencesDonations.dom.tsx
index d1118bf8c1..a4fb991296 100644
--- a/ts/components/PreferencesDonations.dom.tsx
+++ b/ts/components/PreferencesDonations.dom.tsx
@@ -189,7 +189,7 @@ function DonationHero({
/>
- {i18n('icu:PreferencesDonations__title')}
+ {i18n('icu:PreferencesDonations__title-v2')}
>