web: browse the catalogue as a tree of folders

The library page was a flat wall of thumbnails. It now reads like the admin
pictures tab: a folder tree on the left, the picked node's frame on the stage,
that node's frames in the strip below, and a chip pair to swap the stage for a
wall of every thumbnail in the node.

Folders are walked recursively (dot/@-prefixed names skipped, an unreadable
subfolder is dropped rather than failing the scan), so a roll with a dated
subfolder keeps both levels. Node counts include the subfolders underneath.
This commit is contained in:
2026-09-28 18:15:14 +07:00
parent 7ba1e64e7c
commit d1abda141a
5 changed files with 339 additions and 115 deletions
+5 -3
View File
@@ -225,7 +225,7 @@ export const en: Dict = {
'photos.failed': 'That did not work: {msg}',
'photos.noLabels': 'No strip labels yet',
'lib.title': 'Library',
'lib.title': 'LIBRARY',
'lib.hint':
'Pick a photo folder on this machine. Nothing is uploaded — the page only remembers where the folder is and keeps one thumbnail per frame.',
'lib.add': 'ADD FOLDER',
@@ -233,7 +233,9 @@ export const en: Dict = {
'lib.rescan': 'RESCAN',
'lib.remove': 'REMOVE',
'lib.reconnect': 'GRANT ACCESS AGAIN',
'lib.all': 'ALL',
'lib.tree': 'FOLDERS',
'lib.viewPreview': 'SINGLE',
'lib.viewGrid': 'ALL THUMBS',
'lib.open': 'Open in the studio',
'lib.edited': 'edited',
'lib.size': '{mb} MB',
@@ -250,7 +252,7 @@ export const en: Dict = {
'nav.admin': 'Admin',
'nav.photos': 'My photos',
'nav.profile': 'Profile',
'nav.library': 'Library',
'nav.library': 'LIBRARY',
'nav.studio': 'Studio',
'adm.title': 'Strip moderation',
'adm.subtitle': 'Photos contributed by users. Delete one to pull it off the landing page.',
+5 -3
View File
@@ -17,7 +17,7 @@ export const vi = {
'nav.admin': 'Quản trị',
'nav.photos': 'Ảnh của tôi',
'nav.profile': 'Hồ sơ',
'nav.library': 'Thư viện',
'nav.library': 'THƯ VIỆN',
'nav.studio': 'Studio',
'nav.guest': 'Khách',
@@ -238,7 +238,7 @@ export const vi = {
'photos.failed': 'Không thực hiện được: {msg}',
'photos.noLabels': 'Chưa có nhãn dải phim',
'lib.title': 'Thư viện',
'lib.title': 'THƯ VIỆN',
'lib.hint':
'Chọn thư mục ảnh trên máy. Ảnh không được tải lên đâu cả — trang chỉ nhớ đường dẫn và giữ một ảnh thu nhỏ cho mỗi tấm.',
'lib.add': 'THÊM THƯ MỤC',
@@ -246,7 +246,9 @@ export const vi = {
'lib.rescan': 'QUÉT LẠI',
'lib.remove': 'BỎ',
'lib.reconnect': 'CẤP LẠI QUYỀN',
'lib.all': 'TẤT CẢ',
'lib.tree': 'THƯ MỤC',
'lib.viewPreview': 'MỘT ẢNH',
'lib.viewGrid': 'TOÀN BỘ',
'lib.open': 'Mở trong studio',
'lib.edited': 'đã chỉnh',
'lib.size': '{mb} MB',