Commit Graph

493 Commits

Author SHA1 Message Date
3dtours 036b99f67a chore(docker): rebuild the NAS image bundle on 3d12635 2026-10-08 17:39:58 +07:00
3dtours 3d12635a62 fix(library): strictly enforce single folder photo filtering unless subfolder option is enabled 2026-10-08 17:37:06 +07:00
3dtours e39a53663e chore(docker): rebuild the NAS image bundle on 2a3dd6f
frontend 0.1.0+2a3dd6f (index-BTJNy_qy.js, index-CfU8Cvx3.css). The api
image is unchanged.
2026-10-08 17:30:05 +07:00
3dtours 2a3dd6fdbe fix(library): the folder picked is the folder that is shown
A node drew every frame of the branch under it unless the reader shut the
subfolders out, so picking A drew A and everything below it. The pick is
now the scope — the node's own frames — and the branch is what the
SUB FOLDERS chip asks for.

The year filter was already read off the frames the open node drew, so
it follows the same pick. On a tree of 13 frames (r1 r2 | A/a1..a3 |
A/deep/d1 | C/c1..c6 | E/e1, one year per folder) the chip off offers
2024 on the root, 2023 on A, 2022 on A/deep and 2021 on C; the chip on
offers all five years on the root and 2023+2022 on A.

The remembered answer moves to a new key: the chip wrote its first answer
down on the very first visit, so the old key holds 'true' for every
reader who never touched it, and reading it would keep them on a default
they never chose.
2026-10-08 17:29:34 +07:00
3dtours 7f611b2171 chore(docker): rebuild the NAS image bundle on 848800a
frontend 0.1.0+848800a (index-CeVeD6u3.js, index-CfU8Cvx3.css). The api
image is unchanged.
2026-10-08 17:13:14 +07:00
3dtours 848800a77d fix(boot): bring the session and the catalogue back without waiting on /me
A reload drew nothing until the account round trip landed, which on a
faraway API is the whole of the wait: 8.8s to the photo on the studio's
stage and 8.2s to the library's first row, against 0.9s and 0.3s now
(measured with every /api answer held back 8s).

The studio's restore effect returned early on `!authReady`. The gate is
only needed by the two files that ask a tier question — a RAW, which is
a PRO develop, and a catalogue frame, which walks `loadFile` — so it
keeps those and lets the session's own JPEG up on the first pass.
`restoredRef` stops the second pass, when /me lands, from decoding the
frame the first one already showed.

The library mounted nothing until /me answered. What the first paint
reads is now the answer the last visit got, the way the studio reads its
own session back: the frames are already on this disk and have no reason
to sit behind a round trip. An answer the API contradicts puts the note
back on screen the moment it arrives, and an API that never answers is
not written down as this account's standing.
2026-10-08 17:09:53 +07:00
3dtours 2b3146884c chore(docker): rebuild the NAS image bundle on c8fe5c9
frontend 0.1.0+c8fe5c9 (index-DcPas1TG.js). The api image is unchanged.
2026-10-08 14:39:05 +07:00
3dtours c8fe5c919d fix(studio): give the temperature and tint tracks their colour back
Every range rule now names `input[type="range"]` itself, so the class-only WB
rules tied with the plain hairline that follows them and lost — both sliders
were drawing the same grey line as every other knob, and their node sat a pixel
off the thicker track. Measured on the panel: the gradients are back in amber
and blue, and the ring is centred on the line.
2026-10-08 14:38:25 +07:00
3dtours 8f286506b2 feat(studio): hand an export straight to a social network
EXPORT only ever wrote a file, and posting it meant leaving the studio, finding
the file and uploading it again. The dialog now offers FACEBOOK, INSTAGRAM,
REDDIT and X beside the sizes, and the render goes to the network instead of the
download folder.

What the browser can do decides how, since a page may not touch another origin's
composer: a phone's share sheet opens the target app with the picture already
attached, a desktop gets the picture on the clipboard and the site in a new tab
for one paste, and an origin with no clipboard API downloads the file beside the
open site. The line under the row says so before the click.
2026-10-08 14:38:22 +07:00
3dtours f1d7eeff99 chore(docker): rebuild the NAS image bundle on 5f78875
frontend 0.1.0+5f78875 (index-ZIBwvRM-.js). The api image is unchanged.
2026-10-08 11:28:54 +07:00
3dtours 5f78875549 feat(studio): draw every slider as a line with a hollow node, and move the shapes into TOOLS
The default ring was a solid disc on a coloured bar, which read as a crude
block next to the rest of the rail; every range input is now a hairline
track with an outline node in the accent colour, and the temperature and
tint strips keep their gradients on the track itself.

CROP, ROTATE and WATERMARK reshape the frame rather than grade it, so they
belong with the tools that work on the whole image.
2026-10-08 11:28:14 +07:00
3dtours af23f3a7c9 feat(library): read the walk without tiling, and scope the filters to the open folder
The scan made a JPEG tile for every frame as it walked, so a wall of 12MP
files spent its whole budget in the walk; the tile now waits until the card
is actually drawn (makeTile + putPhotoThumb), and a rawish frame whose date
is unreadable retries at 4MB instead of stopping at the head.

The year menu was built from the whole catalogue, so it offered values the
open folder could not produce; it now follows the rows on screen and clears
the choice when a move leaves it stale.
2026-10-08 11:28:14 +07:00
3dtours eee9328bbf chore(docker): rebuild the NAS image bundle on efe07e2
frontend 0.1.0+efe07e2 (index-BaytzCya.js). The api image is unchanged.
2026-10-08 10:36:11 +07:00
3dtours efe07e20ba feat(library): let the scan mark follow the reading down the column
The mark was pinned to the folder the reading was asked of, so a walk through
a whole roll said C2 while the frames under it were what was being read. It
now hangs on the folder the reading stands in — `progress.at` — and on every
row above it up to and including the roll's own row: reading D:/A/B1/C2 marks
C2, B1, A and D:, and as the walk moves the chain moves with it. A reading
that has not reached a frame yet has nowhere to stand, and stands on the
folder it was asked of, so the ring is on the column from the click.
2026-10-08 10:35:02 +07:00
3dtours d5e9144d89 chore(docker): rebuild the NAS image bundle on 8d3b7bf
frontend 0.1.0+8d3b7bf (index-SwDANzWW.js). The api image is unchanged.
2026-10-08 10:18:58 +07:00
3dtours 8d3b7bf134 fix(library): match the scan mark to the row by the walk's own key
The ring said which folder a reading was asked of by taking the row's own
name apart and comparing the pieces, which is the same path spelled twice and
only nearly the same. When the two spellings drifted the asked row never
matched, and the fallback that used to carry the mark on the roll's row had
gone, so a reading ran with nothing on the column at all.

The mark is now built with the key the walk gives the row — `folder/sub`,
through `normPath`, the same way a frame id is spelled — and a reading whose
own row is not on the column (a branch folded away, a folder gone from the
disk) falls back to the roll's own row, so a reading is never invisible.
2026-10-08 10:17:45 +07:00
3dtours bb2d548d6a chore(docker): rebuild the NAS image bundle on 04ed177 2026-10-08 09:59:09 +07:00
3dtours 04ed177e5c fix(library): mark only the folder a reading was asked of and the rows above it 2026-10-08 09:58:35 +07:00
3dtours ce8258b0f0 chore(docker): rebuild the NAS image bundle on a87ee4d 2026-10-08 09:41:55 +07:00
3dtours a87ee4d528 fix(library): ring the folder a reading was asked of, from the click 2026-10-08 09:41:16 +07:00
3dtours a77c9452b9 chore(docker): rebuild the NAS image bundle on cda08c3 2026-10-08 09:24:41 +07:00
3dtours cda08c3908 fix(library): keep the shell the deploy replaced out of a failed navigation, and say when another tab holds the library open 2026-10-08 09:23:23 +07:00
3dtours a3bb412070 chore(docker): rebuild the NAS image bundle on 3242b3a 2026-10-08 08:43:01 +07:00
3dtours 3242b3aa48 fix(library): mark the roll's own row while it is read, and count rows from the catalogue up 2026-10-08 08:05:18 +07:00
3dtours ac0337147f chore(docker): rebuild the NAS image bundle on c80c872 2026-10-07 23:10:55 +07:00
3dtours c80c8729a8 fix(library): mark only the folder a reading stands in, and keep a one-folder reading out of the roll's count
The column's ring was drawn from the open node's roll: a row of another roll
had no path under it, so the empty prefix matched every row of the roll being
read and the whole column lit up. The roll's own row was marked too, at every
moment of a reading of it, and a reading kept to one folder counted its frames
onto the roll's row as well — a roll counted down to one branch of itself.
A queued request was drawn from the reading's roll instead of its own, so a
request on a second roll showed nothing at all.
2026-10-07 23:10:21 +07:00
3dtours 8bc5e08926 fix(library): fix scanning spinner icon on active folder nodes and live counts update 2026-10-07 21:53:22 +07:00
3dtours f8a8844f6d chore(docker): rebuild the NAS image bundle on c42e336 2026-10-07 21:43:00 +07:00
3dtours c42e336a12 fix(library): unconditionally prevent browser context menu on folder tree nodes and fix absolute path matching 2026-10-07 21:40:14 +07:00
3dtours 8f22f4a5bd chore(docker): rebuild the NAS image bundle on a372cc9 2026-10-07 21:31:13 +07:00
3dtours a372cc94f3 fix(library): fix folder context menu lookup and ready check 2026-10-07 21:29:19 +07:00
3dtours 03bc5eb2be chore(docker): rebuild the NAS image bundle on aa981e4 2026-10-07 21:19:13 +07:00
3dtours aa981e4e65 fix(library): fix photo count live update and optimize scan speed 2026-10-07 21:16:10 +07:00
3dtours 8dd8ba9bc7 chore(docker): rebuild the NAS image bundle on 801877d 2026-10-07 20:15:12 +07:00
3dtours 801877d763 fix(library): fix open location folder tree scroll and folder update path matching 2026-10-07 20:12:12 +07:00
3dtours 740e8ed36e chore(docker): rebuild the NAS image bundle on 9bfb39b 2026-10-07 19:56:57 +07:00
3dtours 9bfb39be91 fix(library): resolve root folder rename, open in explorer, open at location centering, UPDATE rescan bug, and optimize scan RAM memory usage 2026-10-07 19:16:03 +07:00
3dtours af76b46c3e chore(docker): rebuild the NAS image bundle on b835415 2026-10-07 18:53:39 +07:00
3dtours b835415c20 fix(library): support thumbnail generation and display for HEIC and TIF files 2026-10-07 18:43:11 +07:00
3dtours 57005ae1e2 fix(library): contain zoom in stage viewport and add drag/pan support for single view 2026-10-07 18:34:45 +07:00
3dtours 5dbcdd36e7 fix(ui): format LIGHT tab main chips to bold and accent, unbold TONE CURVE and DYNAMIC RANGE sub-chips 2026-10-07 18:22:07 +07:00
3dtours 347b66099a style(studio): place Color Chrome sub-buttons on 1 single row and format chip labels bold with theme accent colors 2026-10-07 17:59:50 +07:00
3dtours da7a23bb4b fix(studio): ensure Color Chrome sub-chips are hidden when switching tabs 2026-10-07 17:41:00 +07:00
3dtours 4704e936ba feat(studio): add right-click context menu (Solo mode, Collapse all, Expand all) for DevelopPanels, pin Color Chrome sub-chips, and fix library single view sorting & time range select 2026-10-07 17:35:20 +07:00
3dtours eb47afc63e feat(studio & library): sync Light & Color tab parameters (vibrance, highlight, shadow, white, black) to Gradient Mask & add multi-field sorting options 2026-10-07 12:36:55 +07:00
3dtours 1c7be6dfd4 perf(library): persistent SPA shell, in-memory folder tree caching, and zero-flicker LRU thumbnail caching 2026-10-07 12:05:58 +07:00
3dtours 3b4c49c41d feat(library & studio): add EXIF info bar, portrait frame panning, and multi-photo selection with Panorama/HDR context menu 2026-10-07 10:44:59 +07:00
3dtours 7b836984fc build: update docker tarball and sha256 checksum for NAS release 2026-10-07 07:36:44 +07:00
3dtours 44601897b0 chore: bump service worker cache version to recipescam-v11 2026-10-07 07:31:47 +07:00
3dtours 5338f66134 fix(raw): prioritize camera embedded preview for 100% exact color matching across SONY, OLYMPUS, FUJIFILM, NIKON, CANON, RICOH, LUMIX, LEICA, IPHONE, DNG 2026-10-07 07:29:42 +07:00