Skip to content

feat(ui): restyle admin and moderation (redesign step 5/6) - #69

Merged
florianjs merged 15 commits into
mainfrom
feat/ui-admin
Oct 8, 2026
Merged

florianjs merged 15 commits into
mainfrom
feat/ui-admin

Conversation

@florianjs

Copy link
Copy Markdown
Owner

⚠️ Built on top of #64 → #65 → #66 → #67 → #68. Merge those first, in order. This PR targets main, and its diff shrinks as they land.

Summary

  • Typography: sentence-case labels across every admin and moderation panel, including settings field labels (SettingsGroup) and stat cards.
  • Colors:
    • raw Tailwind palette colors (red, yellow, green, blue, purple) are replaced by theme tokens (danger, seed, leech, neutrals);
    • charts read their colors from the theme instead of hard-coded hex values, so they stay legible in the light theme and follow theme switches. Peers use the leech color and seeders the seed color; violet stays reserved for freeleech.
  • Branding preview: the logo is visible in the light theme (it was white on white).
  • Removed: the Homepage content editor (hero, status badge, 3 feature boxes) and GET /api/homepage-content. The home page is now the dashboard and never displayed that content. The settings columns are left in place, so no migration is needed. The staff note (welcome message) stays, and its help text now says it appears on every member's dashboard.

Test plan

  • npx vitest run, npm run build, translation key check
  • Demo instance, dark and light: admin dashboard and charts, users, branding, Torznab, settings, moderation dashboard, pending torrents
  • Mobile width

🤖 Generated with Claude Code

florianjs and others added 6 commits October 8, 2026 16:09
- theme tokens as CSS variables: light, dark, or follow the system, chosen
  per user (cookie, applied during SSR so there is no flash)
- meaningful colors: green for upload/seed, amber for download/leech,
  violet for freeleech; contrast inks keep existing controls legible in
  both themes
- self-hosted IBM Plex Sans and Mono (Google Fonts was blocked by the CSP,
  so the app silently fell back to system fonts)
- app shell: grouped sidebar (browse, community, account, staff), top bar
  with a transfer meter, freeleech pill and account menu (passkey copy,
  points, theme, language)
- command palette (Cmd/Ctrl+K or /): search torrents and jump to pages
- mobile navigation drawer, skip link, visible focus, reduced motion
- dialog overlays stay dark in both themes; fix icons collapsed to zero
  width by an inline class

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- greeting, account strip (ratio with upload/download, seeding and leeching
  counts, bonus points, hit & runs), staff note, new torrents, open bounties
  and latest forum topics, from a single /api/dashboard request
- track per-user seeding/leeching torrents in Redis on announce
- show the admin welcome message, which was editable but never displayed
- transfer meter reads live upload/download (the sealed session only held
  the values from sign-in)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- one conversation per pair of members, unread badge in the sidebar,
  messages page with conversation list and thread, start a conversation
  from a profile or by username
- block a member (they can no longer message you), hide a conversation for
  yourself (it comes back on a new message)
- only participants can read a conversation, staff included; plain text
  rendered as text, 1 to 5000 characters, rate limited
- conversation marked read up to the newest message shown

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- list: live search synced with the URL, categories as filter chips with
  subcategories, real sorting (newest, oldest, size, name; the API ignored
  sortBy until now), tags under each name, pending badge on own uploads
- /search redirects to /torrents (it duplicated the list)
- detail: prominent download, uploader, tags, swarm strip with seed/leech
  bar, details panel with hash copy, collapsible peer list, report button
- comments are displayed and can be posted and deleted (the API returned
  them but the page never showed them)
- comments: rate limited, no comments on pending torrents you cannot see
- upload/edit modals: plain labels, readable category paths
- fix subcategory lookup using select instead of columns

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- plain sentence-case typography instead of tracked capitals, real page
  headings, numbers in the tabular face
- violet kept for freeleech only: balances and rewards use the text color
- forum: categories as a compact list showing the latest topic; post
  authors with avatar and link to their profile
- profiles aligned with the other pages, role badges in neutral outline

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- plain sentence-case labels across all admin and moderation panels,
  including settings field labels and stat cards
- raw palette colors replaced by theme tokens (danger, seed, leech)
- charts read their colors from the theme and follow light/dark changes
- branding preview logo visible in the light theme
- remove the homepage content editor and /api/homepage-content: the home
  page is now the dashboard and never showed that content; the staff
  note (welcome message) stays and its help text says where it appears

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 11 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 2 included reviews currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 68fb605b-edc2-4044-85ca-f9576a0abe53
📥 Commits

Reviewing files that changed from the base of the PR and between 22bd096 and 69841dc.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (93)
  • app/app.vue
  • app/assets/css/main.css
  • app/components/CategorySidebar.vue
  • app/components/EditTorrentModal.vue
  • app/components/MediaIdsFields.vue
  • app/components/ReportModal.vue
  • app/components/SearchBar.vue
  • app/components/SettingsGroup.vue
  • app/components/StatsCard.vue
  • app/components/ThemeSwitcher.vue
  • app/components/TorrentTable.vue
  • app/components/UploadTorrentModal.vue
  • app/components/UserAvatar.vue
  • app/components/admin/Announcements.vue
  • app/components/admin/Bonus.vue
  • app/components/admin/Branding.vue
  • app/components/admin/Categories.vue
  • app/components/admin/Charts.vue
  • app/components/admin/Endpoints.vue
  • app/components/admin/FooterLinks.vue
  • app/components/admin/Freeleech.vue
  • app/components/admin/HnR.vue
  • app/components/admin/HomepageContent.vue
  • app/components/admin/Invites.vue
  • app/components/admin/Panic.vue
  • app/components/admin/PendingTorrents.vue
  • app/components/admin/Protocols.vue
  • app/components/admin/Registration.vue
  • app/components/admin/Reports.vue
  • app/components/admin/Roles.vue
  • app/components/admin/System.vue
  • app/components/admin/Tags.vue
  • app/components/admin/TorznabBlacklist.vue
  • app/components/admin/TorznabConfig.vue
  • app/components/admin/TorznabLogTable.vue
  • app/components/admin/TorznabLogs.vue
  • app/components/admin/TorznabRateLimiting.vue
  • app/components/admin/TorznabStats.vue
  • app/components/admin/TorznabUsers.vue
  • app/components/admin/Users.vue
  • app/components/shell/AppSidebar.vue
  • app/components/shell/CommandPalette.vue
  • app/components/shell/TransferMeter.vue
  • app/components/shell/UserMenu.vue
  • app/composables/useTheme.ts
  • app/composables/useUnreadMessages.ts
  • app/layouts/default.vue
  • app/pages/admin.vue
  • app/pages/auth/register.vue
  • app/pages/bounties/[id].vue
  • app/pages/bounties/index.vue
  • app/pages/forum/category/[id].vue
  • app/pages/forum/index.vue
  • app/pages/forum/new-topic.vue
  • app/pages/forum/topic/[id].vue
  • app/pages/index.vue
  • app/pages/invites.vue
  • app/pages/messages.vue
  • app/pages/mod.vue
  • app/pages/search.vue
  • app/pages/shop.vue
  • app/pages/torrents/[hash].vue
  • app/pages/torrents/index.vue
  • app/pages/users/[id].vue
  • i18n/locales/en/app.json
  • i18n/locales/en/messages.json
  • i18n/locales/fr/app.json
  • i18n/locales/fr/messages.json
  • nuxt.config.ts
  • package.json
  • server/api/dashboard.get.ts
  • server/api/forum/topics/[id].get.ts
  • server/api/homepage-content.get.ts
  • server/api/messages/[id].delete.ts
  • server/api/messages/[id].get.ts
  • server/api/messages/[id].post.ts
  • server/api/messages/block.post.ts
  • server/api/messages/index.get.ts
  • server/api/messages/index.post.ts
  • server/api/messages/unread.get.ts
  • server/api/torrents/[hash].get.ts
  • server/api/torrents/[hash]/comments.post.ts
  • server/api/torrents/index.get.ts
  • server/db/migrations/0014_private_messages.sql
  • server/db/schema.ts
  • server/redis/userActivity.ts
  • server/tracker/handlers.ts
  • server/utils/messageRules.ts
  • server/utils/messages.ts
  • server/utils/schemas.ts
  • tailwind.config.ts
  • tests/message-rules.test.ts
  • tests/theme.test.ts
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

florianjs and others added 9 commits October 8, 2026 17:13
- closed mobile drawer is invisible so its links leave the tab order;
  the sidebar gets a landmark label instead of an action label
- command palette drops late search answers and resets on close, and
  returns focus to the element that opened it
- passkey copy only shows Copied when the clipboard write succeeds
- account switch clears the previous balance and avatar
- theme cookie is validated, unknown values fall back to system
- fixed colors: paper (white) for text on colored fills and uploaded
  logos, scrim for shadows, so they do not flip with the theme

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- user activity tracking errors are logged instead of failing the
  announce (and skipping H&R and completion tracking after it)
- the dashboard falls back to empty swarm counts when stats are
  unavailable instead of returning a 500

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- banned or missing recipients are refused (404) for new conversations
  and replies alike
- blocking an unknown user id returns 404 instead of a 500
- malformed ?before / ?limit return 400 instead of a 500
- hidden conversations are filtered in SQL so they do not use up the
  100-row limit and push older visible ones out of the list
- block and hide failures show an error instead of an unhandled
  rejection

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- unknown ?sort values fall back to newest instead of an empty list
- the torrent list orders by id after the chosen column, so offset
  pagination cannot repeat or skip torrents with equal size or name
- failed comment deletions show an error and refresh the list
- delete button text uses the fixed white on the red fill

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	app/components/admin/Announcements.vue
#	app/components/admin/Branding.vue
#	app/components/admin/HnR.vue
#	app/components/admin/HomepageContent.vue
#	app/components/admin/Panic.vue
#	app/components/admin/Registration.vue
#	app/components/admin/Reports.vue
@florianjs

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@florianjs
florianjs merged commit be9745c into main Oct 8, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant