Commit Graph

4983 Commits

Author SHA1 Message Date
lemon 97f5f82b05 Rework login modal: translations, layout, and UX
Overhaul AuthDialog's login step:
- Add translation keys for every previously-hardcoded string (titles,
  buttons, placeholders, status labels, validation/errors) across all
  sixteen locales.
- The secret-key form is no longer collapsible — it's always open and is
  the first option, followed by 'Log in with extension', then a
  text-with-arrow link to the remote-signer step.
- Move the key-file upload icon onto the same row as the nsec input
  (instead of beside the submit button); submit button is now full-width
  below.
- Surface extension-login errors as a destructive toast rather than
  writing them into the nsec input's inline error.
- Replace the centered 'Back' text buttons with a back arrow in the
  top-left of the dialog header.

Also correct AGENTS.md's i18n section: the project ships fifteen
non-English locales (hi, id, sw, tr, zh-Hant were missing from the list).
2026-06-21 00:08:52 -07:00
lemon b01f573bf9 Hide nav language switcher when logged in; swap hero CTA to Verify campaigns
Logged-in users change language via Settings, so the top-nav globe now
appears only when logged out (matching the search icon). On the homepage
hero, replace the 'Explore campaigns' button with 'Verify campaigns' and
order it before 'How it works'. Drop the now-unused exploreCampaigns
locale key across all locales.
2026-06-20 23:55:03 -07:00
lemon 59538e1798 Add search to account dropdown 2026-06-20 23:43:32 -07:00
lemon e132587b6d Add profile message action 2026-06-20 23:40:52 -07:00
lemon c78a7ac089 Match profile group card sizing 2026-06-20 23:30:26 -07:00
lemon 9498411e13 Avoid cramped profile Agora cards 2026-06-20 23:25:11 -07:00
lemon 5e07f72fb8 Refine profile Agora campaign grid 2026-06-20 23:21:46 -07:00
lemon e7ca4cc9b1 Merge profile Agora tabs 2026-06-20 23:13:34 -07:00
lemon 4d148218ac Move profile fields below bio 2026-06-20 22:59:35 -07:00
lemon 716579d91e Simplify profile overflow menu 2026-06-20 22:55:47 -07:00
lemon bba7fb045a Remove profile reaction action 2026-06-20 22:52:14 -07:00
lemon 557063c0f3 Match profile action button heights 2026-06-20 22:50:14 -07:00
lemon 65aeb724a3 Move profile stats above bio 2026-06-20 22:49:26 -07:00
lemon 21306afdb2 Inline raised profile stat 2026-06-20 22:48:20 -07:00
lemon 34b5babc01 Blend verification request button 2026-06-20 22:45:01 -07:00
lemon 43dee910b8 Remove verification request button border 2026-06-20 22:43:22 -07:00
lemon 979cc1d097 Refine verification request button 2026-06-20 22:42:16 -07:00
lemon 00579e5de2 Request verification by message 2026-06-20 22:38:49 -07:00
lemon 978ee5f77e Show verifier statements in messages 2026-06-20 22:32:13 -07:00
lemon 66bc7e80f2 Translate received direct messages 2026-06-20 21:38:56 -07:00
lemon 1b5d2bf771 Filter messages by followed users 2026-06-20 21:22:52 -07:00
lemon 495c2c7ce0 Add message thread header actions 2026-06-20 21:16:08 -07:00
lemon cdf47e2900 Smooth direct message sending 2026-06-20 21:00:08 -07:00
lemon 4d7a7acbae Fix direct message thread decryption 2026-06-20 20:55:49 -07:00
lemon 790787aa43 Remove message count badges 2026-06-20 20:51:16 -07:00
lemon ca972704fb Update messages composer controls 2026-06-20 20:50:25 -07:00
lemon 514db0cc59 Refine message send icon 2026-06-20 20:47:18 -07:00
lemon b34660f7d4 Soften messages input styling 2026-06-20 20:45:48 -07:00
lemon 4e0c97482a Restyle message send icon 2026-06-20 20:43:24 -07:00
lemon bf1770eec2 Unify message pane background 2026-06-20 20:40:54 -07:00
lemon e0f122aaad Remove messages pane borders 2026-06-20 20:37:29 -07:00
lemon b244e9d645 Fix messages viewport overflow 2026-06-20 20:35:50 -07:00
lemon 728a56af3f Search message peers by display name 2026-06-20 20:07:01 -07:00
lemon 5553a31ffa Constrain messages page scrolling 2026-06-20 20:01:03 -07:00
lemon 7a4259db6a Paginate direct messages like feeds 2026-06-20 19:54:24 -07:00
lemon 1e4c0735e6 Redesign and speed up messages page 2026-06-20 19:45:14 -07:00
lemon 2e0defa977 Page direct-message history backwards so old conversations load 2026-06-20 19:38:40 -07:00
lemon 0e75799cf0 Add a NIP-04 direct messages page 2026-06-20 11:35:51 -07:00
mkfain e4b0f9a80d Add a corporate sponsorship page
Add /sponsors, a landing-style page for companies that want to partner
with the platform. Lays out the three ways to get involved: an
unrestricted gift to the Agora Seed Fund (BTC or USD), a matching pool
for an individual campaign, a featured campaign, or a curated list of
campaigns (e.g. political prisoners or women's sovereignty in Africa),
and promoting Agora donations to a customer base as a philanthropic
initiative.

Modeled on AboutPage's section recipe (dark hero, alternating section
backgrounds, hand-rolled cards) and routed under the wide
FundraiserLayout above the /:nip19 catch-all. Adds a Sponsors link to
the site footer. English copy only for now; other locales fall back to
English until the copy settles.
2026-06-19 10:54:13 +03:00
lemon 374a1d62de Localize the 'Your name' placeholder in the profile editor
ProfileCard's namePlaceholder default was a hardcoded 'Your name'
literal used by the profile/org editor onboarding steps. Default it to
the new profile.namePlaceholder key (translated across all locales) and
resolve it via t() in the component body; callers that pass their own
placeholder (e.g. the campaign name step) are unaffected.
2026-06-14 17:46:59 -07:00
lemon ccf6b59ae1 Backfill missing translations across all 15 non-English locales
Keys added to en.json over time (notably the verifier create-account
onboarding flow, the walletDoubleTweak recovery namespace, and the
campaign-wizard tag step) were never propagated to the other locales,
so they silently fell back to English at runtime — which is why the
verify-campaign onboarding steps still rendered in English under e.g.
Chinese despite the components calling t().

Translate every key present in en.json but missing from each locale
(84-157 keys each, 1553 total) so all sixteen locales are now complete
with zero English fallbacks. Placeholders, technical tokens, and the
Agora name are preserved verbatim; plural categories follow each
language's grammar.
2026-06-14 17:39:16 -07:00
lemon 5375466e15 Translate the secret-key field aria-label in onboarding
The nsec reveal input in the onboarding 'Save your key' step carried a
hardcoded English aria-label. Route it through
onboarding.secure.secretKeyAriaLabel and translate across all locales.

This was the last untranslated user-facing string in the verifier
create-account flow.
2026-06-14 17:26:01 -07:00
lemon d1e579dda3 Redesign the auth welcome step around the Agora brand
Drop the 'Welcome to Agora' header and the Nostr-flavored subtext from
the welcome step. The Agora bolt mark and wordmark are now the focal
point — laid out inline with the same tight spacing and Bebas display
recipe as the top-nav wordmark, just larger — and the wordmark doubles
as the dialog's accessible title.

Retitle the two buttons to 'Create new account' / 'Log in with
existing' (no Nostr phrasing) and route them through new auth.* keys,
translated across all sixteen locales.
2026-06-14 17:22:38 -07:00
lemon 786938f9fc Translate the image crop dialog and verify-tutorial goal label
The crop modal used in the verifier 'set up your organization'
onboarding step had hardcoded English controls (Reset, the
reposition/zoom hint, Cancel, Processing, Apply Crop, and the default
title). Route them through a new top-level imageCrop namespace and
add translations for all sixteen locales.

The VerifyTutorial demo card's 'of … goal' label was also hardcoded;
reuse the existing campaignsDetail.ofGoal key.
2026-06-14 17:09:58 -07:00
lemon 0486ff3c9f Use a globe icon and tidy the language switcher column
Swap the top-nav language trigger from the Languages glyph to Globe — the
more universal "change language" affordance.

Stop flipping individual RTL rows: the previous per-item dir="rtl" pushed
Arabic / Persian / Pashto names to the far edge while LTR rows hugged the
left, leaving a ragged, jarring column. Force every row LTR-aligned
(text-left) so the selected dot and the names share one clean left edge,
while each name keeps its own lang attribute so the browser still shapes
Arabic/Persian/Khmer/CJK glyphs correctly.
2026-06-14 16:48:00 -07:00
lemon f6c5b69b5c Add an always-visible language switcher to the top nav
A visitor who lands in a language they can't read had no discoverable way
to change it: on desktop the only chrome was the search icon + login, and
the picker was buried at /settings/language (itself only reachable through
the mobile hamburger's "Settings" — a word they may not be able to read).

Add a globe/languages icon to the top-nav right cluster, visible to
everyone regardless of login state. It opens a dropdown listing every
supported language by its own native name (each row rendered in its own
lang/dir), so the right entry is recognizable no matter the current UI
language. Selecting one switches in place via changeAppLanguage without
navigating away, so scroll position and in-progress form state survive.
The /settings/language page remains the canonical deep-link.

New key nav.language added to en.json and all 15 other locales (reusing
each locale's existing language.title translation).
2026-06-14 16:43:58 -07:00
lemon b034716fca Translate strings introduced during the verify-onboarding work
Wire the branch-new hardcoded UI strings through i18n:

- ProfileCard's shared image-edit menu ("Upload file", "Paste URL",
  "Remove") and the website-slot placeholder now use t(); the component
  gains useTranslation.
- The campaign profile step's name placeholder regressed from a
  translated string to a literal "Campaign title" when it switched to the
  shared identity card; restore it via a new
  onboarding.profile.campaignNamePlaceholder key.

New keys added to en.json and translated into all 15 other locales:
profile.imageMenu.{upload,pasteUrl,remove}, profile.websitePlaceholder,
and onboarding.profile.campaignNamePlaceholder.

The plural keys flagged by a first pass (campaignsCount, seeAllCampaigns,
followersTitle, profile.verified.count, etc.) already resolve via
i18next's _one/_other suffixes and needed no change. Pre-existing
untranslated strings that predate this branch (e.g. ImageCropDialog) were
left untouched.

Regression-of: a7a9ed06
2026-06-14 16:34:03 -07:00
lemon 3534a0c4f7 Consolidate duplicated profile-edit logic in onboarding and campaigns
These onboarding/campaign surfaces accumulated several copies of the same
logic over the iterative work. Fold them into shared modules:

- Kind-0 publishing: the campaign-creator profile step reimplemented the same
  read-modify-write publish that usePublishOrgProfile already had (fetch fresh
  -> parse -> merge name/picture/banner/about -> publish with prev), plus its
  own parseProfileMetadata. Route it through the shared hook.

- Draft type: the identical ProfileIdentityDraft and OrgProfileDraft
  interfaces become one ProfileDraft in src/lib/profileDraft.ts, alongside
  parseProfileMetadata/mergeProfileDraft helpers. The hook no longer imports
  its draft type from a component module.

- Auto-grow textarea: the campaign story and verifier bio fields shared an
  identical borderless textarea with copy-pasted height-resize handlers and
  styling. Extract an AutoGrowTextarea component plus an autoGrowTextarea
  helper (also reused by ProfileCard's editable fields).
2026-06-14 16:23:30 -07:00
lemon 222968286b Shorten profile edit button label to 'Edit'
The action now sits in a compact row beside the avatar, so the verbose
'Edit profile' label is unnecessary. Shorten profile.header.editProfile
to just 'Edit' across all locales.
2026-06-14 16:15:12 -07:00
lemon 37dd7dc3e7 Move profile actions onto the avatar row on mobile
On sm/md the Edit Profile / QR / more (or Follow / Donate) buttons sat in
a full-width row below the bio. Put them on the same row as the avatar,
bottom-right, Twitter/X-style: ProfileIdentityHeader gains a hideActionBar
prop, ActionBar is exported with an align prop, and the mobile layout
renders the avatar and a right-justified ActionBar (align="end") together.
With align="end" the Edit Profile button sizes to its label instead of
stretching full-width.
2026-06-14 16:13:32 -07:00