Commit Graph

2169 Commits

Author SHA1 Message Date
Mary Kate Fain 9b93881663 Merge remote-tracking branch 'origin/main' into fix/toast-swipe
# Conflicts:
#	src/components/ui/toast.tsx
#	src/components/ui/toaster.tsx
2026-03-27 19:14:08 -05:00
Mary Kate 21df47eccb Merge branch 'fix/compose-preview-overflow' into 'main'
Fix compose preview overflow not being scrollable in modal

Closes #179

See merge request soapbox-pub/ditto!126
2026-03-28 00:07:25 +00:00
Mary Kate Fain 310993d57c Fix compose preview overflow not being scrollable in modal 2026-03-27 18:51:14 -05:00
Mary Kate Fain 872d319220 Fix compose modal closing when dismissing emoji picker on mobile
Prevent the compose modal from being accidentally dismissed when the user
taps the emoji/GIF picker overlay to close it.  On mobile this was very
easy to trigger, causing the draft to be lost.

Add onInteractOutside and onEscapeKeyDown handlers to the compose modal's
DialogContent that detect when a nested dialog (emoji picker) is open and
prevent the dismiss event from propagating to the parent modal.
2026-03-27 18:31:58 -05:00
Mary Kate Fain c5bc900212 Use kind-specific labels in notification action text instead of generic 'post'
Notifications now say 'reacted to your badge', 'reposted your theme',
'commented on your nsite', etc. instead of always saying 'your post'
or 'your note'. Uses the referenced event's kind to look up a
human-readable noun from a comprehensive kind-to-label map.
2026-03-27 18:14:18 -05:00
Mary Kate Fain 9901635008 Add zap button to badge detail view action bar
The BadgeDetailContent action bar had reactions, reposts, and comments
but was missing the zap button that NoteCard renders for the same
events in the feed.
2026-03-27 17:52:52 -05:00
Mary Kate Fain 1f5ce2546c Add emoji picker and shortcode autocomplete to zap comment box
Extract shared useInsertText hook to DRY up the duplicated text
insertion logic across ComposeBox, DMChatArea, and ZapDialog.
Add EmojiPicker (GUI) and EmojiShortcodeAutocomplete (:shortcode
typing) to the zap comment textarea, and also add shortcode
autocomplete to the DM chat input which was previously missing it.

Closes #176
2026-03-27 17:46:16 -05:00
Lemon 7bfab65042 Fix toast swipe direction to match entry direction on mobile
On mobile, toasts enter from the top but previously could only be swiped
right to dismiss. Now swipe direction is responsive: swipe up on mobile
(top-positioned), swipe right on desktop (bottom-right positioned). Exit
animations also match the swipe direction at each breakpoint.
2026-03-27 15:13:43 -07:00
Mary Kate Fain b59eeeca81 Show theme description on 'updated their theme' (kind 16767) posts
Kind 16767 events previously hardcoded description to undefined, so the
theme description never appeared on 'updated their theme' posts in the
feed or detail view.

Three changes:
- buildActiveThemeTags now accepts and includes a description tag, so
  future kind 16767 events carry the description directly
- setActiveTheme accepts description to thread it through publishing
- ThemeContent extracts the description tag from kind 16767 events, and
  for older events without one, falls back to querying the source theme
  definition via the a-tag reference
2026-03-27 17:09:08 -05:00
Mary Kate Fain d4a928b682 Show full theme description on post detail page
On the feed, theme descriptions are truncated to a single line. On the
post detail page, the full description is now displayed so users can
read long descriptions that don't fit in the thumbnail card.

Closes #124
2026-03-27 16:52:20 -05:00
Alex Gleason da27054a9b Fix file downloads and URL opening on Capacitor iOS
The <a download> and <a target="_blank"> patterns don't work in
WKWebView. Add downloadTextFile() and openUrl() utilities in
src/lib/downloadFile.ts that use @capacitor/filesystem and
@capacitor/share on native platforms, falling back to standard
browser behavior on web.

Update all call sites: onboarding key download (InitialSyncGate,
SignupDialog), image lightbox buttons (ImageGallery, ProfilePage).

Document Capacitor compatibility constraints in AGENTS.md.
2026-03-27 16:42:36 -05:00
Alex Gleason 8fe8525b06 Merge branch 'main' of gitlab.com:soapbox-pub/ditto 2026-03-27 15:40:40 -05:00
Mary Kate 9169cd5d1f Merge branch 'fix/letter-notifications' into 'main'
Fix: add letter (kind 8211) notifications

Closes #188

See merge request soapbox-pub/ditto!118
2026-03-27 20:30:42 +00:00
Alex Gleason 32b0cef65d Change toast swipe direction from right to up for mobile dismissal 2026-03-27 14:57:51 -05:00
Mary Kate Fain abcb51c0e2 Show badge thumbnail preview in badge award notifications
Closes #186. Badge award notifications now display a visual preview
card with the badge image, name, and description for both single and
grouped badge notifications.
2026-03-27 14:44:33 -05:00
Mary Kate Fain 8d02645e26 Enhance letter notification with envelope card preview
Show the sender's profile pic via the EnvelopeCard component (the same
Wii-Mail-inspired envelope tile used in the letters inbox). The card
auto-decrypts to display stationery colors and the sender's avatar as a
wax seal. Clicking the envelope navigates to /letters.
2026-03-27 14:31:05 -05:00
Mary Kate Fain f82adab05d Fix: add letter (kind 8211) notifications
Letters were completely absent from the notification pipeline — users had
to visit the Letters page to discover incoming letters. This integrates
kind 8211 into every layer of the notification system:

- useNotifications: query, grouping, and referenced-event exclusion
- useHasUnreadNotifications: unread dot indicator
- NotificationsPage: LetterNotification component with link to /letters
- NotificationSettings: toggleable Letters row
- notificationTemplates: web push template
- Android NotificationRelayService + NostrPoller: native push support
- EncryptedSettings + schema: letters preference field

Closes #188
2026-03-27 14:15:50 -05:00
Alex Gleason 17954e0504 Fix badges page showing infinite skeleton when logged out
The useBadgeFeed hook required a logged-in user before enabling the query,
causing the follows tab to show loading skeletons forever when logged out.
Now fetches the Team Soapbox follow pack (kind 39089) and uses its members
as the authors filter, giving logged-out users a curated badge feed.
2026-03-27 13:15:44 -05:00
Chad Curtis 488ce5750d Hide top nav on scroll and unify top padding across pages
- MobileTopBar: changed from sticky to fixed positioning with scroll-hide
  transform animation (mirrors bottom nav behavior via useScrollDirection)
- MainLayout: replaced -mt-mobile-bar overlap trick with pt-mobile-bar
  padding since the top bar is now fixed; added data-nav-hidden attribute
  to drive CSS transitions on sticky sub-headers
- SubHeaderBar/top-mobile-bar: sticky top offset transitions to 0 when
  the top bar hides, keeping sub-headers flush with the viewport top
- NotificationsPage, ProfilePage: added arc overhang spacer after
  SubHeaderBar to match Feed's spacing
2026-03-27 02:07:12 -05:00
Chad Curtis 93bc669f24 Lazy-load hls.js in VideoPlayer to reduce main bundle by ~500KB 2026-03-26 23:33:09 -05:00
Chad Curtis aecddf6fb5 Fix drawing canvas 'done' button clipped by drawer max-height 2026-03-26 23:13:42 -05:00
Chad Curtis 51fffc0ae1 Merge branch 'envelope-inbox' into 'main'
Add Letters inbox page with full letter composing from lief

See merge request soapbox-pub/ditto!117
2026-03-27 03:59:48 +00:00
Chad Curtis 403946bac5 Use mailbox icon from lief for Letters page and sidebar 2026-03-26 22:43:11 -05:00
Alex Gleason 5fed2f4182 Add pre-release indicator to settings version footer 2026-03-26 22:28:18 -05:00
Alex Gleason b2f62e12c7 Add build info env vars and pre-release banner to changelog
Expose COMMIT_SHA and COMMIT_TAG via import.meta.env at build time.
In CI, these come from GitLab env vars; locally they fall back to git.

The changelog page now shows:
- A pre-release banner when the build is untagged, with a link to
  the GitLab diff between the latest release and main
- An external link icon on each version card header linking to the
  GitLab release page for that version
2026-03-26 22:19:12 -05:00
Alex Gleason 79571cc5b3 Add spacing between changelog header and content 2026-03-26 22:05:41 -05:00
Chad Curtis 3e6b947893 Fix gift attachment blocking backdrop clicks to close letter dialog 2026-03-26 22:00:01 -05:00
Alex Gleason cc59035c62 Redesign changelog page with parsed structured entries
Parse Keep a Changelog markdown into structured data and render
version cards with colored category badges instead of raw markdown.
2026-03-26 21:57:49 -05:00
Chad Curtis 9b1615480f Polish letter attachment: use actual color moment pattern, theme-derived text color, more spacing 2026-03-26 21:56:22 -05:00
Alex Gleason ad59299581 fix: strip duplicate title from changelog page 2026-03-26 21:53:16 -05:00
Alex Gleason a11be64d94 Add in-app changelog page with runtime fetch from public/CHANGELOG.md 2026-03-26 21:47:10 -05:00
Chad Curtis a32c620b4e Add letter attachment: tap to apply embedded color moment or theme as your Ditto theme 2026-03-26 21:40:30 -05:00
Chad Curtis 7a8fbe3ee5 Fix review items 6-10: use default relays, lazy-load fonts, paginate letters, cap SVG size, fix exhaustive-deps 2026-03-26 21:32:18 -05:00
Chad Curtis 13480d528a Replace LetterRecipientInput with ProfileSearchDropdown, fix compose padding 2026-03-26 21:20:59 -05:00
Alex Gleason cbbb576b26 Add release system with semver versioning, changelog, and release skill
- Switch from CalVer (date+SHA) to semantic versioning starting at v2.0.0
- Create release skill (.agents/skills/release/) with full AI-guided release workflow
- Add CHANGELOG.md with initial 2.0.0 entry
- Update CI tag regex to match semver tags (v2.0.0 instead of v2026.03.24-sha)
- Extract changelog content into GitLab release descriptions
- Update Android versionName to 2.0.0 in build.gradle
- Update iOS MARKETING_VERSION to 2.0.0 in pbxproj
- Expose VERSION (semver) and BUILD_DATE (ISO 8601) as build-time constants
- Display version and build date in Settings page footer
- Remove npm release script (releases are now done via the AI skill)
2026-03-26 21:15:35 -05:00
Chad Curtis 7ddaf135b4 Link about dialogs to in-app routes for color moments, themes, and emoji packs 2026-03-26 20:48:05 -05:00
Chad Curtis 848ac15ef0 Fix CI: remove unused prop, centralize color helpers, extract constants, memoize Sets, move @types/dompurify to devDeps 2026-03-26 19:45:51 -05:00
Chad Curtis ae1f97eb08 Letters: bigger wax seals, adaptive text, inline labels, font loading, SVG sticker fix 2026-03-26 19:17:58 -05:00
Chad Curtis a2fa2a6b96 Letters: redesign inbox as Wii Mail-style envelope grid with modal detail view 2026-03-26 18:51:45 -05:00
Chad Curtis 08a5c808f8 Letters: send animation with envelope, wax seal, Ditto logo, and pre-rendered letter 2026-03-26 18:22:15 -05:00
Chad Curtis c2b14e4f07 Letters: send animation scoped to feed column, inbox updates immediately 2026-03-26 17:40:13 -05:00
Chad Curtis 628dd47772 Letters: send animation with envelope, wax seal, and Ditto logo 2026-03-26 17:35:31 -05:00
Chad Curtis f8612ee20e Letters: arc tab bars for compose, prefs, and inbox 2026-03-26 17:31:15 -05:00
Chad Curtis 172bebe24a Move letter tool buttons into SubHeaderBar below app top bar
- LetterEditor: replace stickyHeader/headerLeft with renderToolbar render prop;
  callers decide where to place the tool buttons
- Both ComposeLetterSheet and LetterPreferencesSection: use SubHeaderBar noArc
  + useLayoutOptions({ hasSubHeader: true }) so tools sit in the sticky sub-header
  matching every other tabbed/sub-header page in the app
2026-03-26 16:58:02 -05:00
Chad Curtis 3c45641ef4 Letters inbox: replace custom FAB with FabButton 2026-03-26 16:53:18 -05:00
Chad Curtis 5eb6af1ab6 Compose send: use FabButton matching app FAB shape; extract FabButton component
- Extract FabButton from FloatingComposeButton (avatar shape mask + primary bg)
- FloatingComposeButton now delegates to FabButton
- ComposeLetterSheet: replace inline send button with FabButton FAB,
  fixed bottom-right on mobile, sticky in column on desktop
- Remove separate page-level send button from compose header
2026-03-26 16:51:31 -05:00
Chad Curtis c1b48058d5 Compose header: use ArcBackground to match app top nav curve 2026-03-26 16:45:42 -05:00
Chad Curtis 33ebeec2ac Compose header: sticky, no border 2026-03-26 16:43:39 -05:00
Chad Curtis a3e5ff9f4a Fix letter preferences header to match app PageHeader style
- LetterEditor: add stickyHeader prop (default true); when false renders a plain
  border-b toolbar row instead of sticky backdrop-blurred header
- LetterPreferencesPage: restore PageHeader (back arrow + title) as the page header
- LetterPreferencesSection: use stickyHeader={false}, remove headerLeft slot usage
2026-03-26 16:41:06 -05:00
Chad Curtis 203ef9dd44 Fix letter stationery theme sync and remove drawer card shape
- useLetterPreferences: simplify to just expose raw saved prefs + isThemeDefault flag,
  no longer conflates theme stationery with saved stationery
- LetterPreferencesSection: always pull from useThemeStationery directly when
  isThemeDefault, persist only on explicit user picks (handleSetStationery),
  sync preview live when theme changes
- ComposeLetterSheet: same pattern — init from themeStationery, switch to saved
  pref once settings load, track explicit user picks to avoid theme override
- LetterEditor drawer: remove bg-background / rounded-b-3xl / border-b card shape
2026-03-26 16:27:31 -05:00