From 88bfccd1e755a8a905ac7deb263d9266626c98c3 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Fri, 6 Nov 2026 08:39:00 -0700 Subject: [PATCH] Say Finish instead of Publish, and match login, cookies, privacy, and account-delete copy to the decided wording. --- lib/server/mail.ts | 6 +++--- messages/en/create/footer.json | 2 +- .../en/create/reviewAndComplete/completed.json | 8 ++++---- .../en/create/reviewAndComplete/finalReview.json | 2 +- messages/en/create/reviewAndComplete/publish.json | 6 +++--- messages/en/create/upload.json | 2 +- messages/en/metadata.json | 4 ++-- messages/en/pages/cookies.json | 12 ++++++------ messages/en/pages/login.json | 14 +++++++------- messages/en/pages/privacy.json | 6 +++--- messages/en/pages/profile.json | 12 ++++++------ tests/components/FinalReviewPage.test.tsx | 2 +- tests/components/LoginForm.test.tsx | 8 ++++---- tests/contexts/AuthModalContext.test.tsx | 2 +- tests/unit/createFooterMessages.test.ts | 6 ++---- 15 files changed, 45 insertions(+), 47 deletions(-) diff --git a/lib/server/mail.ts b/lib/server/mail.ts index 181024e..fc02755 100644 --- a/lib/server/mail.ts +++ b/lib/server/mail.ts @@ -80,13 +80,13 @@ export async function sendMagicLinkEmail( ): Promise { const { text, html } = buildVerifyLinkParts( verifyUrl, - "Open this link to sign in (it expires in 60 minutes):", + "Open this link to log in (it expires in 60 minutes):", "If you did not request this, you can ignore this email.\n\nSent because you saved a draft at communityrule.info", - "Sign in", + "Log in", ); await sendHtmlMail({ to, - subject: "Sign in to Community Rule", + subject: "Log in to Community Rule", text, html, devLog: `[dev] Magic link for ${to}: ${verifyUrl}`, diff --git a/messages/en/create/footer.json b/messages/en/create/footer.json index eb0c060..644239c 100644 --- a/messages/en/create/footer.json +++ b/messages/en/create/footer.json @@ -12,7 +12,7 @@ "confirmDetails": "Confirm details", "confirmDescription": "Confirm description", "confirmSize": "Confirm size", - "publishCommunityRule": "Publish CommunityRule", + "publishCommunityRule": "Finish", "confirmStakeholders": "Confirm Stakeholders", "confirmCoreValues": "Confirm values", "confirmCommunication": "Confirm", diff --git a/messages/en/create/reviewAndComplete/completed.json b/messages/en/create/reviewAndComplete/completed.json index 51c7274..34f1035 100644 --- a/messages/en/create/reviewAndComplete/completed.json +++ b/messages/en/create/reviewAndComplete/completed.json @@ -2,7 +2,7 @@ "toastTitle": "This is what folks see when you share your CommunityRule", "toastDescription": "Your group can use this document as an operating manual.", "shareNoRuleTitle": "Nothing to share yet", - "shareNoRuleDescription": "Open this page from your profile after publishing, or publish a rule first.", + "shareNoRuleDescription": "Open this page from your profile after you finish, or finish a rule first.", "shareLinkCopiedTitle": "Link copied", "shareLinkCopiedDescription": "Paste the link anywhere to share your public CommunityRule.", "shareCopyFailedTitle": "Could not copy link", @@ -16,7 +16,7 @@ "exportEmptyDocumentTitle": "Could not export", "exportEmptyDocumentDescription": "Your rule document is not available to export yet.", "guestInvitesSkippedTitle": "Stakeholder invites were not sent", - "guestInvitesSkippedDescription": "Sign in to invite people by email. Until then, share the public link to this CommunityRule.", - "guestClaimHintTitle": "Sign in to keep this rule on your profile", - "guestClaimHintDescription": "Sign in on this same browser to attach the rule to your account so you can edit it later." + "guestInvitesSkippedDescription": "Log in to invite people by email. Until then, share the public link to this CommunityRule.", + "guestClaimHintTitle": "Log in to keep this rule on your profile", + "guestClaimHintDescription": "Log in on this same browser to attach the rule to your account so you can edit it later." } diff --git a/messages/en/create/reviewAndComplete/finalReview.json b/messages/en/create/reviewAndComplete/finalReview.json index 77ca4b3..59a6508 100644 --- a/messages/en/create/reviewAndComplete/finalReview.json +++ b/messages/en/create/reviewAndComplete/finalReview.json @@ -2,7 +2,7 @@ "title": "Review your Rule", "description": "Here's what other people will see.", "editPublishedTitle": "Edit your CommunityRule", - "editPublishedDescription": "Update what others see on your public rule. Save & Exit or Publish applies changes to your published CommunityRule.", + "editPublishedDescription": "Update what others see on your Rule. Save & Exit or Finish applies the changes.", "ruleCardTitleFallback": "Your community", "addValue": "Add value", "addCard": "Add card", diff --git a/messages/en/create/reviewAndComplete/publish.json b/messages/en/create/reviewAndComplete/publish.json index 34362e9..94ff407 100644 --- a/messages/en/create/reviewAndComplete/publish.json +++ b/messages/en/create/reviewAndComplete/publish.json @@ -1,6 +1,6 @@ { - "publishBannerTitle": "Couldn't publish", - "missingCommunityName": "Add a community name before publishing.", - "publishButtonPublishing": "Publishing…", + "publishBannerTitle": "Couldn't finish", + "missingCommunityName": "Add a community name before you finish.", + "publishButtonPublishing": "Finishing…", "genericPublishFailed": "Something went wrong. Try again." } diff --git a/messages/en/create/upload.json b/messages/en/create/upload.json index 2e46eb0..244c14e 100644 --- a/messages/en/create/upload.json +++ b/messages/en/create/upload.json @@ -2,7 +2,7 @@ "errors": { "generic": "Something went wrong while uploading. Try again.", "tooLarge": "That file is too large. Community photos can be up to 5 MB; attachments up to 10 MB.", - "unauthorized": "Sign in to upload files. Use Save progress if you started without an account.", + "unauthorized": "Log in to upload files. Use Save progress if you started without an account.", "misconfigured": "Uploads are not available on this server yet.", "empty": "That file is empty. Choose a file that has content.", "svg": "SVG files aren't supported. Export a JPEG, PNG, WebP, or GIF instead.", diff --git a/messages/en/metadata.json b/messages/en/metadata.json index 21d2de0..682c911 100644 --- a/messages/en/metadata.json +++ b/messages/en/metadata.json @@ -157,8 +157,8 @@ "keywords": ["terms of service", "license", "communityrule"] }, "cookies": { - "title": "Cookies Settings", - "description": "CommunityRule uses cookies to keep you signed in and to let you claim a rule you published without an account.", + "title": "Cookies", + "description": "CommunityRule uses cookies to keep you logged in and to let you claim a rule you finished without logging in.", "keywords": ["cookies", "session", "privacy", "communityrule"] } } diff --git a/messages/en/pages/cookies.json b/messages/en/pages/cookies.json index 7416759..f26d42d 100644 --- a/messages/en/pages/cookies.json +++ b/messages/en/pages/cookies.json @@ -1,21 +1,21 @@ { - "_comment": "Cookies Settings. Figma Content page Template (19003:23305): banner + labeled body stacks. There are no optional cookies to toggle.", + "_comment": "Cookies. Figma Content page Template (19003:23305): banner + labeled body stacks. There are no optional cookies to toggle. The footer does not link here.", "banner": { - "title": "Cookies Settings", - "description": "CommunityRule uses cookies to keep you signed in and to let you claim a rule you published without an account.", + "title": "Cookies", + "description": "CommunityRule uses cookies to keep you logged in and to let you claim a rule you finished without logging in.", "author": "Media Economies Design Lab", "date": "2026-08-15" }, "updated": "Last updated August 15, 2026.", "intro": [ - "CommunityRule sets a cookie named cr_session after you sign in with a magic link. It keeps you signed in for up to 30 days. If you publish a CommunityRule without signing in, we also set cr_rule_claim so that signing in later on this browser can attach that rule to your account. There are no advertising or analytics cookies to turn off." + "CommunityRule sets a cookie named cr_session after you log in with a magic link. It keeps you logged in for up to 30 days. Set when you finish a Rule without logging in: we also set cr_rule_claim so that logging in later on this browser can attach that rule to your account. There are no advertising or analytics cookies to turn off." ], "sections": [ { "heading": "The session cookie", "paragraphs": [ - "Sign out to clear the session cookie on this browser. Blocking it will sign you out and keep you from staying signed in. Browsing templates does not set this cookie.", - "The claim cookie is set only when you publish without an account. It is httpOnly, lasts up to 30 days, and is cleared after a successful sign-in claim. Clearing this site’s cookies means you cannot attach that guest-published rule to an account from this browser." + "Log out to clear the session cookie on this browser. Blocking it will log you out and keep you from staying logged in. Browsing templates does not set this cookie.", + "Set when you finish a Rule without logging in. It is httpOnly, lasts up to 30 days, and is cleared after a successful login claim. Clearing this site’s cookies means you cannot attach that guest-finished rule to an account from this browser." ] }, { diff --git a/messages/en/pages/login.json b/messages/en/pages/login.json index 9fb560d..7c177cc 100644 --- a/messages/en/pages/login.json +++ b/messages/en/pages/login.json @@ -1,16 +1,16 @@ { "title": "Log in to CommunityRule", - "subtitle": "Enter your email and we'll send you a magic link to sign in. No password needed!", + "subtitle": "Enter your email and we'll send you a magic link to log in. No password needed!", "saveProgressTitle": "Save your progress?", - "saveProgressSubtitle": "We need your email to save, and we'll send you a magic link to sign in. If you don't save now you could lose your progress.", - "keepRuleTitle": "Sign in to keep this rule on your profile", + "saveProgressSubtitle": "We need your email to save, and we'll send you a magic link to log in. If you don't save now you could lose your progress.", + "keepRuleTitle": "Log in to keep this rule on your profile", "keepRuleSubtitle": "Enter your email and we'll send a magic link. Open it on this same browser to attach the rule to your account. You can also continue without saving.", "continueWithoutSaving": "Continue without saving", "emailLabel": "Email address", "emailPlaceholder": "you@example.com", "sendMagicLink": "Send me a magic link", "successTitle": "Check your email", - "successBody": "We sent a sign-in link. Open it on this device to continue. If you don't see it, check spam or promotions.", + "successBody": "We sent a login link. Open it on this device to continue. If you don't see it, check spam or promotions.", "legalPrefix": "By continuing, you agree to our ", "legalAnd": " and ", "legalSuffix": ".", @@ -21,9 +21,9 @@ "emailInvalid": "Enter a valid email address.", "rateLimited": "Too many requests. Try again in {seconds} seconds.", "generic": "Something went wrong. Try again.", - "invalidLink": "That sign-in link is not valid. Request a new one from the login page.", - "expiredLink": "That sign-in link has expired. Request a new one from the login page.", + "invalidLink": "That login link is not valid. Request a new one from the login page.", + "expiredLink": "That login link has expired. Request a new one from the login page.", "serverError": "Something went wrong on our end. Try again later.", - "stakeholderWrongAccount": "Sign out and open the stakeholder invite link again, or use the same email you were invited with." + "stakeholderWrongAccount": "Log out and open the invite link again, or use the same email you were invited with." } } diff --git a/messages/en/pages/privacy.json b/messages/en/pages/privacy.json index 5d58890..6dd10c6 100644 --- a/messages/en/pages/privacy.json +++ b/messages/en/pages/privacy.json @@ -14,14 +14,14 @@ { "heading": "What we collect", "paragraphs": [ - "Your email, to sign you in, change your email, or invite a stakeholder. In-progress drafts in your browser and, after you save, on our servers. Files you attach to a Rule. Messages you send through the organizer form, which go to MEDLab by email. Page performance metrics (URL, timing, and browser), which are written to our server logs and are not tied to your account. If you publish without signing in, a claim cookie on this browser so a later sign-in can attach that Rule to your account.", + "Your email, to log you in, change your email, or invite a stakeholder. In-progress drafts in your browser and, after you save, on our servers. Files you attach to a Rule. Messages you send through the organizer form, which go to MEDLab by email. Page performance metrics (URL, timing, and browser), which are written to our server logs and are not tied to your account. If you finish a Rule without logging in, a claim cookie on this browser so a later login can attach that Rule to your account.", "We do not sell this information or use it for advertising. As a public university project, some records may be subject to the Colorado Open Records Act." ] }, { "heading": "Where it is stored", "paragraphs": [ - "Accounts, drafts, published Rules, uploads, and the recommendation table live on servers MEDLab operates. The app is not hosted on a third-party cloud app platform.", + "Accounts, drafts, finished Rules, uploads, and the recommendation table live on servers MEDLab operates. The app is not hosted on a third-party cloud app platform.", "Sign-in and invite emails are sent through MEDLab’s mail system, which relays through Amazon SES to deliver them. Ordinary server logs may include the request URL and IP address." ] }, @@ -35,7 +35,7 @@ { "heading": "Your account", "paragraphs": [ - "You can sign out, delete a Rule you published, or delete your account from your profile. Deleting your account removes your login and draft. Published Rules are public and stay public unless you delete them first.", + "You can log out, delete a Rule you finished, or delete your account from your profile. Logging out clears the session cookie on this browser. Deleting your account deletes every Rule you made. The people you invited lose access to them.", "Questions: [medlab@colorado.edu](mailto:medlab@colorado.edu)." ] } diff --git a/messages/en/pages/profile.json b/messages/en/pages/profile.json index 5dd5377..8949a55 100644 --- a/messages/en/pages/profile.json +++ b/messages/en/pages/profile.json @@ -9,11 +9,11 @@ "optionLogout": "Log out of CommunityRule", "optionChangeEmail": "Change your account email", "intro": "Manage your CommunityRules, saved progress, and account.", - "signInPrompt": "Sign in to view your profile and saved rules.", + "signInPrompt": "Log in to view your profile and saved rules.", "signInCta": "Log in", "loading": "Loading…", "yourRulesHeading": "Your CommunityRules", - "yourRulesEmpty": "You have not published a rule yet. Create one to see it here.", + "yourRulesEmpty": "You have not finished a rule yet. Create one to see it here.", "draftHeading": "Saved in progress", "draftInProgressBadge": "In progress", "continueDraft": "Continue", @@ -26,7 +26,7 @@ "manageRule": "Manage", "duplicate": "Duplicate", "deleteRule": "Delete", - "deleteRuleConfirm": "Delete this published rule? This cannot be undone.", + "deleteRuleConfirm": "Delete this finished rule? This cannot be undone.", "deleteRuleModalTitle": "Delete this rule?", "deleteRuleModalBody": "This cannot be undone.", "deleteRuleCancel": "Cancel", @@ -50,13 +50,13 @@ "emailChangeVerifyInvalid": "That confirmation link is not valid.", "emailChangeVerifyTaken": "That address was claimed by another account while you were confirming. Try a different email.", "emailChangeRateLimited": "Too many requests. Try again in about {{seconds}} seconds.", - "signOut": "Sign out", + "signOut": "Log out", "deleteAccount": "Delete account", - "deleteAccountIntro": "Permanently delete your account and sign-in data. Your published rules will remain visible without an owner name.", + "deleteAccountIntro": "This deletes your account and every Rule you made. The people you invited lose access to them. Export any Rule you want to keep first.", "deleteAccountCancel": "Cancel", "deleteAccountConfirm": "Delete my account", "deleteAccountModalTitle": "Delete your account?", - "deleteAccountModalBody": "This will remove your account and sign you out. Published rules you created stay public as anonymous community rules.", + "deleteAccountModalBody": "This deletes your account and every Rule you made. The people you invited lose access to them. Export any Rule you want to keep first.", "actionError": "Something went wrong. Try again.", "rulesLoadBannerTitle": "Could not load your CommunityRules", "rulesLoadBannerDescription": "Check your connection and refresh the page.", diff --git a/tests/components/FinalReviewPage.test.tsx b/tests/components/FinalReviewPage.test.tsx index 102cb29..6bf107d 100644 --- a/tests/components/FinalReviewPage.test.tsx +++ b/tests/components/FinalReviewPage.test.tsx @@ -1296,7 +1296,7 @@ describe("FinalReviewScreen — edit published title and description", () => { ).toBeInTheDocument(); expect( screen.getByText( - /Update what others see on your public rule. Save & Exit or Publish applies changes to your published CommunityRule./i, + /Update what others see on your Rule. Save & Exit or Finish applies the changes./i, ), ).toBeInTheDocument(); }); diff --git a/tests/components/LoginForm.test.tsx b/tests/components/LoginForm.test.tsx index f94d757..07e1eaf 100644 --- a/tests/components/LoginForm.test.tsx +++ b/tests/components/LoginForm.test.tsx @@ -124,7 +124,7 @@ describe("LoginForm", () => { expect( await screen.findByRole("heading", { name: /check your email/i }), ).toBeInTheDocument(); - expect(screen.getByText(/we sent a sign-in link/i)).toBeInTheDocument(); + expect(screen.getByText(/we sent a login link/i)).toBeInTheDocument(); expect(screen.getByText(/check spam or promotions/i)).toBeInTheDocument(); }); @@ -191,7 +191,7 @@ describe("LoginForm", () => { ); expect( screen.getByRole("heading", { - name: /sign in to keep this rule on your profile/i, + name: /log in to keep this rule on your profile/i, }), ).toBeInTheDocument(); await user.type( @@ -300,7 +300,7 @@ describe("LoginForm", () => { navMock.searchParams = new URLSearchParams("error=expired_link"); renderLoginForm(); expect( - screen.getByText(/that sign-in link has expired/i), + screen.getByText(/that login link has expired/i), ).toBeInTheDocument(); }); @@ -308,7 +308,7 @@ describe("LoginForm", () => { navMock.searchParams = new URLSearchParams("error=invalid_link"); renderLoginForm(); expect( - screen.getByText(/that sign-in link is not valid/i), + screen.getByText(/that login link is not valid/i), ).toBeInTheDocument(); }); diff --git a/tests/contexts/AuthModalContext.test.tsx b/tests/contexts/AuthModalContext.test.tsx index fe67d4f..663bd12 100644 --- a/tests/contexts/AuthModalContext.test.tsx +++ b/tests/contexts/AuthModalContext.test.tsx @@ -192,7 +192,7 @@ describe("AuthModalProvider (header overlay)", () => { }); expect( screen.getByRole("heading", { - name: /sign in to keep this rule on your profile/i, + name: /log in to keep this rule on your profile/i, }), ).toBeInTheDocument(); await user.type( diff --git a/tests/unit/createFooterMessages.test.ts b/tests/unit/createFooterMessages.test.ts index a655911..6b474de 100644 --- a/tests/unit/createFooterMessages.test.ts +++ b/tests/unit/createFooterMessages.test.ts @@ -24,10 +24,8 @@ describe("create footer messages", () => { expect(messages.create.footer.continue).toBe("Continue"); }); - it("exposes publishCommunityRule for the edit-rule footer CTA", () => { - expect(messages.create.footer.publishCommunityRule).toBe( - "Publish CommunityRule", - ); + it("exposes Finish for the edit-rule footer CTA", () => { + expect(messages.create.footer.publishCommunityRule).toBe("Finish"); }); it("exposes Continue and Skip for the setup questions step", () => {