web: star ratings on the reel, and PICTURES becomes an album browser

The landing strip now carries a score: each look and each contributed
frame shows an average, five stars the visitor can press, and how many
votes it has. Votes are keyed photo:<id> or look:<TAG> and one visitor
has one vote per key, so pressing a second star moves a score instead of
stacking one. The API is public and rate-limited; look: scores survive a
cleared pool, photo: scores are pruned with their photo.

PICTURES was four destination rows; it is now an album per uploader with
a search box, a recipe/rating/newest sort, a minimum-star filter, a big
preview and a filmstrip of thumbnails. Deleting and slot picking still
live in the big box.
This commit is contained in:
2026-09-18 19:17:38 +07:00
parent 4057566a14
commit 07fbadcdc5
10 changed files with 558 additions and 150 deletions
+12 -2
View File
@@ -170,7 +170,18 @@ export const vi = {
'adm.title': 'Quản trị dải phim',
'adm.subtitle': 'Ảnh do người dùng đóng góp. Xoá một ảnh để gỡ nó khỏi trang chủ.',
'adm.upload': 'THÊM ẢNH',
'adm.pool': 'Ảnh đã tải lên',
'adm.albums': 'Album người dùng',
'adm.albumAll': 'Tất cả ảnh',
'adm.filterName': 'Lọc theo tên người dùng',
'adm.sort': 'Sắp xếp',
'adm.sortNewest': 'Mới nhất trước',
'adm.sortRecipe': 'Công thức A→Z',
'adm.sortRating': 'Xếp hạng cao nhất',
'adm.rating': 'Xếp hạng',
'adm.ratingAll': 'Mọi mức xếp hạng',
'adm.ratingAtLeast': 'Từ {n} sao',
'adm.recipe': 'Công thức',
'adm.bigEmpty': 'Chọn một ảnh để xem.',
'adm.pickStrip': 'Dải phim',
'adm.pickTester': 'Live preset tester',
'adm.pickCreator': 'Custom recipe creator',
@@ -205,7 +216,6 @@ export const vi = {
'adm.roleMember': 'Thành viên',
'adm.viewPhotos': 'XEM ẢNH',
'adm.noUsers': 'Chưa có tài khoản nào.',
'adm.showAll': 'TẤT CẢ',
'adm.profileHint': 'Ảnh đại diện, email và mật khẩu của tài khoản đang đăng nhập. Đổi email hoặc mật khẩu cần mật khẩu hiện tại.',
'adm.changeAvatar': 'ĐỔI ẢNH ĐẠI DIỆN',
'adm.currentPassword': 'Mật khẩu hiện tại',