Commit graph

296 commits

Author SHA1 Message Date
Avi
85ba0889eb fix(polish): clean up HomeScreen dead code and token drift
- Remove dead .active-profile-row CSS (unused class)
- Replace hardcoded rgba fallbacks in .home-profile-row.is-active with
  design tokens (var(--surface-2), var(--border))
- Remove duplicate edit icon from publication empty state (icon was
  shown above the button, redundant with the button's own icon)
2026-09-01 11:38:21 -05:00
Avi
e41598d24f checkpoint: document identity card simplification 2026-09-01 11:33:45 -05:00
Avi
e854c95d41 fix(polish): remove identity card kicker, flatten to success border
- Remove 'Active signing identity' kicker text
- Card uses flat surface background with var(--success) border
  (matches active profile card treatment)
- Remove dead .home-identity-kicker CSS
- Update test to find card by 'Active profile' heading
2026-09-01 11:32:34 -05:00
Avi
d93af86c1a checkpoint: document compose label alignment 2026-09-01 11:28:15 -05:00
Avi
ee13d47aeb fix(polish): align Compose button label with sidebar nav
- HomeScreen header button: 'Compose note' → 'Compose' (matches sidebar)
- Updated tests to use exact name match and scoped queries to avoid
  matching the sidebar nav button
2026-09-01 11:27:23 -05:00
Avi
8461dd3a5d checkpoint: document layout pass and re-critique (27→30/40) 2026-09-01 11:21:05 -05:00
Avi
32fc764d54 fix(polish): restore success-soft background on identity card
Flat var(--success-soft) instead of the removed gradient — keeps the
green tint that signals active security state without breaking the
flat-by-default rule.
2026-09-01 11:18:56 -05:00
Avi
b05894efc7 fix(layout): redesign first-run guide with visual step indicators
- Replace plain numbered list with icon circles (primary-soft bg)
- Each step uses flex layout: indicator + content
- Step titles and body text have clear hierarchy
- Remove legacy padding-left on ol, use gap-based spacing
- Consistent 14px font size for step content
2026-09-01 11:17:20 -05:00
Avi
96dcbe4264 fix(polish): align HomeScreen with design system
- Remove identity card gradient (flat surface + success border per
  flat-by-default rule)
- Fix profile row border-radius from 8px to var(--radius-sm) (9px)
- Improve publication empty state: centered layout with icon + button
  instead of inline sentence
- Normalize home-identity-name font-size to 16px (matches profile-name)
- Remove redundant grid-template-columns from home-grid
2026-09-01 11:12:49 -05:00
Avi
a47ce8b9ef checkpoint: document keyboard accessibility hardening 2026-09-01 11:07:49 -05:00
Avi
e9022b36b9 fix(a11y): add keyboard accessibility to HomeScreen profile list
- Profile list rows are now focusable (tabIndex) and operable via
  Enter/Space (onKeyDown handler)
- Added role=listbox on the <ul> and role=option + aria-selected on
  non-active rows
- Added descriptive aria-label including profile name and active state
- Added focus-visible CSS ring matching the design system pattern
- Updated test role from 'list' to 'listbox'
2026-09-01 11:07:42 -05:00
Avi
f1236e7eb8 checkpoint: document clippy warning cleanup 2026-09-01 10:46:25 -05:00
Avi
3083a44e02 chore: fix two clippy warnings
Drop the no-op drop(stored) of a &mut reference in profiles.rs and stop
binding the unused ProfileSummary returned by app.undo_delete() in the
IPC UndoDelete handler. Clippy --all-targets is now warning-free.
2026-09-01 10:45:44 -05:00
Avi
bae0892751 checkpoint: document profile import over IPC 2026-09-01 10:42:14 -05:00
Avi
0207636a7a feat: expose profile import over IPC
Wire the existing profiles::import_profile through the JSON-lines IPC
protocol so the GUI can add an existing account: ImportProfile request
and handler in src/ipc.rs, import_profile added to the Electron method
allowlist, api/AppProvider importProfile, and the Add existing account
buttons in ProfilesScreen.

Also add the active signing identity card on Home and fix the HomeScreen
tests whose text queries now match the identity card as well as the
profile row.
2026-09-01 10:41:28 -05:00
Avi
2604cf9d1e checkpoint: document release packages 2026-09-01 10:21:23 -05:00
Avi
3107508a56 fix: query imported metadata by relay 2026-09-01 10:20:52 -05:00
Avi
2340341e64 checkpoint: document metadata lookup correction 2026-09-01 09:55:03 -05:00
Avi
da33652f6d fix: query imported metadata by public key 2026-09-01 09:54:39 -05:00
Avi
4ad4c842bc checkpoint: document automatic imported naming 2026-09-01 09:48:48 -05:00
Avi
b368958a91 fix: derive imported profile name 2026-09-01 09:48:38 -05:00
Avi
470a98f16e checkpoint: document profile metadata import 2026-09-01 09:26:45 -05:00
Avi
bde35bcec4 fix: import existing profile metadata 2026-09-01 09:26:20 -05:00
Avi
aacae4d2f6 checkpoint: document Stardust cleanup 2026-09-01 09:17:22 -05:00
Avi
d2d773a8ff fix: remove Stardust background dots 2026-09-01 09:17:00 -05:00
Avi
ebcd23399f checkpoint: document NIP-46 signer fix 2026-09-01 09:12:05 -05:00
Avi
7605f51079 fix: keep NIP-46 signer subscription open 2026-09-01 09:11:16 -05:00
Avi
a3b509cb09 feat: rename app to Keynctr 2026-08-31 13:13:47 -05:00
Avi
76deca6a7f feat: add Cosmic theme + motion system 2026-08-31 00:35:30 -05:00
Avi
b93443a716 checkpoint: Impeccable themes + ProfileEditModal 2026-08-27 14:13:34 -05:00
Avi
8366af7d86 feat: add Impeccable themes (light + dark) + unified ProfileEditModal
- settings: add Theme::Impeccable / ImpeccableDark (serde rename impeccable-dark)
- types: extend Theme union
- styles: add :root[data-theme=impeccable] (oklch lacquer/kinpaku) and impeccable-dark (lacquer-deep), Alumni Sans display, editorial refinements
- SettingsScreen: add Impeccable options with live swatch preview
- ProfilesScreen: wire ProfileEditModal (Paper Lift) with segmented tabs, keep legacy modals for compat
- DESIGN.md/PRODUCT.md + .impeccable/design.json from impeccable document
2026-08-27 14:12:52 -05:00
Avi
832e1144f0 checkpoint: fix delete/undo + themed auto-dismiss bar 2026-08-27 12:09:53 -05:00
Avi
9e635e7a93 fix: restore profile delete/undo and themed auto-dismiss undo bar
- ipc: add DeleteProfile/UndoDelete requests returning state_view
- profiles: expose delete_profile outside tests
- api: deleteProfile/undoDelete now return AppState; AppProvider uses applyState
- fakeBackend: implement delete/undo handlers
- ProfilesScreen: themed 'Profile deleted — Undo and restore profile' (primary color, primary-soft) with 5s auto-dismiss, shown in both empty and grid states
2026-08-27 12:07:13 -05:00
Avi
56c2a6d836 checkpoint: click profile row to select on Home 2026-08-26 15:00:07 -05:00
Avi
8130c3e7e5 frontend: click a profile row on Home to select it
Mirrors the Profiles screen: the whole non-active row in the Home
'Your profiles' list now selects the profile on click, guarded so the
Copy/Select buttons don't double-trigger. Added a pointer cursor for
non-active rows and a test for row-click selection.
2026-08-26 14:59:51 -05:00
Avi
a5838ea564 checkpoint: active-profile picture on Compose and sidebar 2026-08-26 14:54:02 -05:00
Avi
98f45204dc frontend: show active-profile picture on Compose and sidebar
Avatar was rendered without the 'picture' prop, so the active profile's
image only appeared on Home. Added picture={active.picture} to both
Compose avatars (write + preview) and the sidebar active-profile avatar.
2026-08-26 14:53:46 -05:00
Avi
10148644e7 checkpoint: remove Profiles sidebar tab 2026-08-26 14:50:07 -05:00
Avi
f53416528c frontend: remove redundant Profiles sidebar tab
The Profiles screen is still reachable via Home's 'Manage profiles'
button, so the left-nav Profiles tab was redundant. Dropped the
'profiles' entry from the sidebar NAV_ITEMS and updated App.test.tsx
to navigate to the screen via 'Manage profiles' instead.
2026-08-26 14:49:52 -05:00
Avi
5635f7910a checkpoint: Home profiles list, dev host fix, full-width profiles card 2026-08-26 14:32:48 -05:00
Avi
835b0a02fd frontend: list all profiles on Home, pin dev host, widen profiles card
- Home now shows every profile with its picture, an inline Active badge,
  and a working Select button (was only the active profile).
- Remove the Relays card from Home (status lives on the Relays screen) and
  its unused connection-check logic/test.
- Pin Vite dev server to 127.0.0.1 so Electron and the dev server agree on
  the address (fixes white-box window in dev mode).
- Make the profiles card full-width to match the publication card below.
- Badge now accepts className.
2026-08-26 14:32:22 -05:00
Avi
71e580f474 Trim white margins from sidebar logo artwork
The 512px source had ~25% baked-in white padding on every side, so the
38px sidebar tile showed a small bird floating in a white square.
Cropped to the content bounding box plus a 6% pad (keeps wing/beak
tips clear of the rounded corners); the img already fills the tile via
object-fit: cover. Window/packaged icons untouched.
2026-08-25 14:36:02 -05:00
Avi
f29d4f94a0 Checkpoint: nostr stack 0.45 security migration 2026-08-25 14:24:08 -05:00
Avi
fa5ba08578 Security: upgrade nostr stack 0.40->0.45 clearing 11 RustSec advisories
- nostr 0.40.0 -> 0.45.3, nostr-sdk 0.40.0 -> 0.45.2 (secp256k1 0.30)
- fixes RUSTSEC-2026-0216/0219/0224/0225/0226/0227/0228/0229/0230/0231/0232
  incl. forged-event signature-bypass and NIP-46 credential Debug leak
- NIP-42 auth now explicit: SignerAuthenticator on every client path
- EventBuilder::sign -> finalize_async; nip44 encrypt supplies random nonce
- feed/signer receive loops moved to stream_events (receiver opens before
  the signer announces, preserving the ordering fix)
- relay-pool replaced by in-SDK relay/gossip; try_connect().timeout()
- tests: malformed NIP-44 payload rejection + secret-leak regression
- suite: 115 backend tests green (113 preserved + 2 new); frontend untouched
2026-08-25 14:23:26 -05:00
Avi
bf10ae383a Checkpoint: clarify NIP-42 status (already supported) 2026-08-25 11:52:43 -05:00
Avi
e210f17ddb Checkpoint: DRY modal save lifecycle (R3 complete) 2026-08-25 11:06:13 -05:00
Avi
7098e75ca3 refactor: share modal save lifecycle 2026-08-25 11:04:20 -05:00
Avi
e6a1efc7f2 refactor: share hex-id shortening in lib/format 2026-08-25 10:12:49 -05:00
Avi
ec237bf6dd Checkpoint: relay pool bootstrap 2026-08-24 22:59:05 -05:00
Avi
6d5063d441 refactor: share relay pool bootstrap 2026-08-24 22:58:27 -05:00