Commit Graph
16 Commits
Author SHA1 Message Date
FliesentischKingandDevin 0decdf415a Loop uploaded videos during playback
Enable Plyr's loop option so videos restart automatically instead of
stopping at the end.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-04 19:54:13 +02:00
FliesentischKingandDevin 456776ea68 Shorten thread route from /thread to /t
All internal links (tiles, prev/next nav, comments, notifications,
breadcrumb, dropzone route check) point to /t/<id>. A global route
middleware permanently redirects old /thread/<id> URLs including
query string and comment anchor.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-04 15:24:32 +02:00
FliesentischKingandDevin e2f2949586 Locale keys for new features
Adds strings for select mode, bulk delete, breadcrumbs, spinner
loading label, tag chip, submitting state (de/en) and removes the
now-unused recording bar keys.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-04 03:06:48 +02:00
FliesentischKingandDevin d6e578dac8 Tighter pagination reserve in page size calculation
The reserve was ~24px larger than the actual pagination block,
which could cost the grid a full row at boundary viewport heights.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-04 03:06:48 +02:00
FliesentischKingandDevin 7689c3e9c0 Layout additions: breadcrumbs, global drop zone, sticky MOTD
- Route-derived SiteBreadcrumb below the MOTD on all non-index
  pages; separator icon switched to bxs:chevron-right-square
- GlobalDropZone moved to the layout so it works on every page;
  on thread routes it only applies to the upper half of the
  viewport (comment attachments keep their own zone)
- MOTD banner is now sticky below the site header

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-04 03:06:42 +02:00
FliesentischKingandDevin de0cd6d34f Mass-select grid and bulk delete for moderators
- Select mode in the filter row (upload.delete permission): tiles
  toggle selection in the capture phase, a floating action bar
  offers select-all and delete with confirmation popover
- New POST /api/uploads/bulk-delete endpoint (validated, deduped,
  max 200 ids) removing rows, files and attachment data
- upload-deleted broadcast on bulk and single delete; other clients
  refresh the grid and drop matching notifications
- Also: skeleton tile grid as loading state, dropzone logic moved
  to the layout-level GlobalDropZone, obsolete ytimg preconnect
  removed

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-04 03:06:38 +02:00
FliesentischKingandDevin f57fffb414 Thread page UX improvements
- Skeleton comment cards while the thread loads; comment count
  only rendered once data arrives
- Subscribe button updates optimistically (fixes shallowRef
  useFetch data not being reactive on in-place mutation)
- Add-tag control restyled as a tag chip, tag icon removed;
  recording indicator bar dropped in favor of the mic button state
- Nav arrows and audio controls follow the theme border radius;
  arrow z-index no longer overlays sticky header/MOTD
- Thread notifications are marked read on visit and on live arrival
- Audio upload player uses the shared media volume

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-04 03:06:32 +02:00
FliesentischKingandDevin fe9e723c72 Media attachment cards with popover players and shared volume
- Audio/video attachments render as media cards (cover or icon,
  title/artist/size) instead of plain file chips; image attachments
  use 3:2 thumbnails matching the audio card height
- Players open in a Popover (autoplay on open) with a dimming
  overlay; AudioPlayerDialog/VideoPlayerDialog removed
- New useMediaVolume composable shares volume/mute between all
  audio players and Plyr via the 4brett-player storage key
- Player buttons and Plyr controls follow the theme border radius
- Portrait videos: aspect is applied even when metadata loaded
  before hydration, and the raw video is height-capped pre-JS

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-04 03:06:11 +02:00
FliesentischKingandDevin cd04135463 Locally stored thumbnails for video and YouTube uploads
- Server-side video thumbnails: ffmpeg-static grabs a frame at ~1s,
  scales it to 480px and stores it under /uploads/thumbs/ at upload
  time (direct files, remote URLs and comment attachments)
- YouTube thumbnails are downloaded once at upload time instead of
  being hotlinked from i.ytimg.com on every render; remote URL kept
  as fallback for legacy rows
- thumbUrl now covers video/audio/youtube/twitch in grid meta,
  profile uploads and notifications
- Generated thumbnail files are removed on single/bulk delete

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-04 03:06:01 +02:00
FliesentischKingandDevin d95ccf9dc7 Shared Spinner component for button loading states
Adds a reusable shadcn-style Spinner (lucide loader-circle icon,
localized aria-label) and wires it into every button that has a
pending state: comment submit, delete, tag save, profile save,
admin saves, upload, login and register.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-04 03:05:48 +02:00
FliesentischKingandDevin fab086d17e Discord-style reaction tooltips
Tooltips now show a large emoji on the left with reactor names
stacked vertically, instead of a comma-separated name list.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-04 03:05:41 +02:00
FliesentischKingandDevin c34e551708 Fix missing Figtree/Manrope webfont imports
The themes declared these font families but never imported them,
so browsers silently fell back to generic sans-serif.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-04 03:05:34 +02:00
FliesentischKing d95ed40053 i18n implemented 2026-10-03 23:45:04 +02:00
FliesentischKing 2ccea34bb9 English Readme 2026-10-03 21:58:09 +02:00
FliesentischKing 5a6fc7f976 New Themes 2026-10-03 21:32:57 +02:00
FliesentischKing a1346c98b1 Initial Commit 2026-10-03 20:07:49 +02:00