# Account: change email, export my data, delete account Route: `/profile` (extends the Account card, adds "Your data" and "Danger zone" cards). Verification landing: `/account/email/confirm?c=CODE`. API calls are assumed, not specified. Placement: Profile already holds the read-only Email in the Account card and the Password card, so the email change extends that card; the two other features are cards at the bottom. No new navigation. Order: Display name, Account, Your role, Author profile, Password, Your data, Danger zone. Boards: `RenewCMS Screens Account.dc.html` (Profile states), `RenewCMS Screens Auth.dc.html` (groups "Verify new email" and "Account deleted"). Frames: `AppFrame`, `AccountCards`, `AuthCard`. Copy source: `account-copy.js`. English only. ## Change email | State | Copy | |---|---| | Default | "Email" field, link "Change email" | | Form | "New email address" · "Current password" · "We'll send a verification link to the new address. Your email stays the same until you open it." · "Cancel" · "Send verification link" | | Invalid format | "Enter a full email address, like name@example.com." | | Same as current | "That's already your email address." | | Password missing | "Enter your current password." | | Wrong password (403) | "That password isn't correct. Try again." | | Sending | "Sending…" | | Pending | "Waiting for verification" · "We sent a link to marta.alves@atelier-renew.example. Until you open it, you keep logging in with marta@renew.example." · "Resend link" · "Cancel change"; toast "Verification link sent" / "Check marta.alves@atelier-renew.example. The link works once, within 2 hours." | | Resending | "Sending…" | | Resent | toast "Link sent again" / "The previous link no longer works." | | Resend rate limited (429) | "Resend in 4:30" (disabled) · "Too many requests. Try again in a few minutes." | | Cancelled | toast "Email change cancelled" / "You keep logging in with marta@renew.example." | | Rate limited (429) | "Too many requests. Try again in a few minutes.", Send disabled | | Server or network | "Something went wrong on our side. Nothing was changed. Try again in a moment." | Rules: the old email stays active for login until the link is opened. The old address gets the notice email at request time. A request for an address already in use answers like success, so the UI and the response never reveal that an account exists. ## Verification landing (AuthCard) | State | Copy | |---|---| | Confirming | "Confirming your new email…" | | Success | "Your email address has changed" · "Your account now uses marta.alves@atelier-renew.example. Use it the next time you log in." · "Go to profile"; toast "Email address changed" / "Your account now uses marta.alves@atelier-renew.example." | | Invalid or expired (403) | "This link doesn't work" · "It may have expired (links last 2 hours), been cancelled or already been used." · "Request a new link from your profile." · "Go to profile" | | Address unavailable (409) | "We couldn't change your email address" · "This address can't be used for your account. Go back to your profile and try a different one." · "Go to profile" (same copy whether the address is taken or rejected) | | No session (401) | "Log in to confirm your new email" · "You opened this link somewhere you're not logged in. Log in here and we'll confirm the change right after." · "Log in and confirm" | | Missing code | "This link is incomplete" · "The confirmation code is missing. Open the link from your email again, or copy the full address into your browser." · "Go to log in" | | Server error | "Couldn't confirm the change" · "Something went wrong on our side. Nothing was changed. Try again in a moment." · "Try again" | ## Your data Contents listed in the card: Profile (Username, display name, email, role and author profile.); Authored content (Your articles and entries.); Uploaded media (References to the files you uploaded.); Account activity (Your log-ins and the actions recorded under your name.). Card copy: "Your data" · "Download a copy of the personal data RenewCMS holds about you, as JSON files in a ZIP.". | State | Copy | |---|---| | Direct (recommended): default | "Download my data" · "Ready in a few seconds." | | Preparing | "Preparing download…" | | Started | toast "Download started" / "renewcms-export-marta-2026-10-29.zip is in your downloads." | | Rate limited (429, one per 15 minutes, clock-sensitive) | "You can export once every 15 minutes" · "Your last export was at 09:41. Try again in 12 minutes." · "Available in 12:00" | | Error | "Couldn't prepare your data" · "Nothing was changed. Try again in a moment." | | Alternative, emailed link: default | "Request my data" · "Larger exports are prepared in the background. We'll email a download link to marta@renew.example when it's ready." | | Requested | "We're preparing your export" · "This can take a few minutes. We'll email a link to marta@renew.example when it's ready." · "Export requested"; toast "Export requested" / "Check marta@renew.example in a few minutes." | | Already in progress | "An export is already being prepared" · "We'll email a link to marta@renew.example when it's ready." | Recommendation: direct download; async is the documented alternative and uses the export-ready email. ## Delete account Danger zone: "Danger zone" · "Delete your account and your personal data. This can't be undone." · "Delete my account". | State | Copy | |---|---| | Dialog | "Delete your account?" · "This permanently deletes your account. It can't be undone." · list: "Your username, display name and email address", "Your author profile and API keys", "Your sessions: you'll be logged out everywhere" · "Your articles and media stay" / "They stay on the site, credited to "Deleted user". Your name is removed from them." · "Export my data first" · "Current password" · "Type DELETE to confirm" · "Keep my account" · "Delete my account" | | Empty, typing | Confirm disabled until password is filled and the word equals "DELETE" (exact, case-sensitive) | | Wrong password (403) | "That password isn't correct. Try again." | | Deleting | "Deleting…"; fields and Cancel disabled; then sign out and redirect to /login?reason=account-deleted | | Rate limited (429) | "Too many requests. Try again in a few minutes." | | Server error | "Couldn't delete your account. Nothing was deleted. Try again in a moment." | | Blocked: last Owner or administrator | "You can't delete your account yet" · Owner: "You are the last Owner. RenewCMS needs at least one. Transfer ownership or promote another user first, then come back to delete your account." · Administrator: "You are the last administrator. RenewCMS needs at least one. Promote another user first, then come back to delete your account." · "Back to profile" · "Go to Users" | | Blocked: cannot be deleted | "This account can't be deleted" · "RenewCMS can't delete this account right now. Ask an administrator to help, then try again." · "Back to profile" | | Login after deletion | "Your account has been deleted" · "Your articles and media were kept without your name." | Blocked dialogs have no close button, do not close on Escape or backdrop click, and always give a next step. Authored content: anonymized to "Deleted user", stated in the dialog. Export-ready email: the link needs a logged-in session, stated in the email and the card hint. Account-deleted email: generic, no personal data, sent to the address the account had at deletion.