Commit Graph

692 Commits

Author SHA1 Message Date
3dtours b2e2ebb266 fix(studio): the strip asks for the frame in view, and lands where it is put
The rail glided to the frame in hand. A glide across a roll of six hundred
fires a scroll event a frame, and every one of them asked the thumbnail
cache for another window: the tiles of the frames being looked at queued
behind two screens of margin, so the strip sat blank exactly where it was
being read while it drew frames nobody had reached. The rail now lands
where it is put, one window is asked for, and the frames in view are the
first asked for a tile.

The strip also keeps its height: `overflow-x: auto` makes the other axis a
scroller too, so a strip squeezed by the column hid its own frames rather
than spilling them. The photo above gives way instead.
2026-10-15 17:52:37 +07:00
3dtours 164055a6c0 chore(docker): stamp the image bundle with 4b4d9b3 2026-10-15 17:18:22 +07:00
3dtours 065c9af1c1 feat(studio): a strip of the folder's own frames under the photo
The studio is where a frame is graded, and the frame next to the one being
graded is the one the reader almost always wants next — a roll is shot in
order and looked through in order. Until now the only way to it was LIBRARY:
the stage had no way back to the folder the frame came from.

The strip stands between the photo and the row that names the file, on the
phone at the same place. It holds the folder the open frame was filed in —
the frames beside it, not every frame the folder was scanned for, which is
what the row's own `dir` is read for — in a file browser's order rather than
the catalogue's newest-shutter-first, because a roll off a camera is the
order it is looked through in. The frame on the stage is the lit one and the
one the rail is scrolled to, wherever the rail had been left; a click is the
same opening the catalogue's wall makes, so the frame arrives with the look
it was last left at.

The tiles are the shelf's own: `makeThumb` off the same store, and the URL
cache the wall keeps is lent to the strip through the hook that fills it.

  docker/frontend/src/ui/Filmstrip.tsx      the strip
  docker/frontend/src/ui/ImageStage.tsx     one optional slot for it
  docker/frontend/src/App.tsx               the folder, read off the catalogue
  docker/frontend/src/Library.tsx           the tile hook, exported
  docker/frontend/src/styles/app.css        the strip and its frames
2026-10-15 17:16:59 +07:00
3dtours b5c8af4982 chore(docker): stamp the image bundle with f96f395 2026-10-15 16:22:18 +07:00
3dtours 1a718a74d9 fix(library): a roll picked at a drive root counts its frames under one spelling
The picker hands a whole drive over named `\`, which `normPath` folds to the
empty root, and a row of that roll was keyed `Roll` where the reading files its
counts, its walked folders and its frames under `/Roll` — one folder under two
names. Every number beside a subfolder of a picked drive read nought, and the
spinner of a reading stood on the roll's own row and nowhere it was reading.

The row key is the roll's own spelling again, and so is the path `relOf` hands
back for a row under it: a reading kept to one folder of a drive root asks for
`/Roll`, and `sub` counted from the old `Roll/` merged nothing. Both are the
spelling the check at the foot of `scripts/tree-scan-check.mjs` asks for, and it
is green again.

A bounded reading also measured itself against `\/Roll` spelled from the raw
name, which no id is filed under: `held` stood at nought and the line read the
catalogue's whole roll as the ground it was climbing from. It is built from
`normPath` of both, the way an id is.
2026-10-15 16:22:15 +07:00
3dtours b3b24f05cc chore(docker): stamp the image bundle with f54013a 2026-10-15 15:33:02 +07:00
3dtours fa0b2cb719 fix(heal): one drag is one repair, and the band at its rim is the model's
A press has to mean what it lands on. A drag is a run of spots and the run
has a spine, so a press within half a brush radius of that spine takes the
drag and dragging moves it, while a press in the outer half of the spots —
where the run is not, and a new repair is wanted — lays a stroke against it.
Before, a brush near a repaired one was read as a drag OF it: the second
stroke was folded into the first and the first moved under the user. Spots
carry the drag they came from (stroke), older recipes still answer to the
old radius, and the outline of a repaired run is drawn idle so it can be
taken hold of (app.css).

A repair already made is part of the photo it was made in. The renderer now
solves one drag at a time, in the order they were drawn, each against the
frame the drags before it have already left — so a stroke laid beside a
repaired one invents its pixels from a frame that no longer holds what the
first took away, and the repair the user has already accepted does not move
when they brush next to it. Measured (probe-seam.mjs, a second stroke laid
2.5 brush radii from the first, counted in levels over the first drag's own
circles): 0 at the worst pixel, 0 of 19189 pixels moved by more than two.

The ring the first repair left behind was the fill's and not the model's.
The model's pixels were laid through the mask's own ramp, so the outer
quarter of every spot — where the mask still weighs the fill in at up to
full strength — was the fill's, and the fill is the light of the WHOLE box
it was built in: a stroke a third of the frame long is filled by blurs up to
sixteen brush radii wide, so what it brings there is the box's average and
not the rim's. The model is the repair wherever it has one, so it now owns
the spot out to 0.92 of its radius (HEAL_PATCH_STOPS) and the fill only
meets the photo in the sliver the mask itself fades over. Measured with the
same probe: 0.76 levels of mean change over the repair where it was 1.86,
8.5 at the worst pixel where it was 14.2, and the edge strength at the rim
after the repair 0.92 where the photo's own edges around it are 0.5 (1.52
before) — the band that was 8 to 11 levels dark is gone.

matchToRim goes with them: the relaxation it ran over every crop measures
nothing the band above does not already do, and the probe's numbers are
identical with it removed.
2026-10-15 15:32:59 +07:00
3dtours cfdebab157 feat(library): read a cloud folder by its albums, and a frame by any of its paths
A folder on an Immich server is named by an album's id and a folder on this
machine by a path, and both are drawn in one column, so a preview asked for
by one spelling of an address has to be found by the others. A frame's id
now answers to the spellings of the same path — drive-letter case, either
separator, a leading slash — and the thumbnail cache holds enough of them
that a roll is not read twice.

The cloud catalogue is read by what the folder says it is. Kind 'share', or
a folder with no album ticked, is every album the key can see: one reading,
kept to its own cursor, and the frames no album names found by the
whole-library read behind it. A folder with albums ticked is those albums,
read album by album, and it is complete when the last of them is. The album
rows are written before the node's own number, so the column never says a
number and then grows rows under it.

The inference session runs without a proxy: the worker script a proxy loads
is fetched by the session's own origin, and a cross-origin page is served
by the page's.
2026-10-15 15:32:52 +07:00
3dtours 9d714bcffa chore(docker): stamp the image bundle with 365bdf9 2026-10-15 06:49:06 +07:00
3dtours 365bdf9a61 chore(docker): stamp the image bundle with bfa207f 2026-10-15 00:55:47 +07:00
3dtours bfa207f8b2 fix(develop): call the tonal rows what the reference calls them (HIGHLIGHTS, SHADOWS, WHITES, BLACKS) 2026-10-15 00:55:11 +07:00
3dtours ba181da86b fix(tone): read the ramp's base from the pixel's own neighbourhood, so highlights and shadows move a region and keep the detail in it 2026-10-15 00:55:09 +07:00
3dtours 8809eb84b0 fix(heal): cut the whole brush out of the mask, so the repair takes its colour from the photo and not from the spot it is repairing 2026-10-15 00:55:01 +07:00
3dtours 678d3811fc chore(docker): stamp the image bundle with aa8f462 2026-10-14 23:08:34 +07:00
3dtours aa8f462058 feat(library): ask the origin to keep the tiles, so the visit after opens painted 2026-10-14 23:07:22 +07:00
3dtours df44200890 feat(heal): compute true outer union boundary for brush strokes and expand zoom viewport with free panning 2026-10-14 18:42:58 +07:00
3dtours c384d421d6 feat(heal): group brush stroke circles into unified patches with contour outline, bulk drag, and bulk delete 2026-10-14 18:07:18 +07:00
3dtours 4b5e55bc50 fix(heal): eliminate boundary seams by windowing inpaint clusters to 1:1 scale and smoothing feather transition 2026-10-14 17:35:27 +07:00
3dtours 8df0a03414 fix(heal): eliminate border seams with smoothstep feather, 95% solid mask, and matched photo grain texture 2026-10-14 16:45:15 +07:00
3dtours f6acf3ee6c fix(heal): eliminate grey wash artifacts by restoring opaque patches and progressive fillSurface cropping 2026-10-14 16:29:17 +07:00
3dtours 1fe31c35a4 fix(heal): resolve adjacent objects texture leak and overwriting by clustering and progressive masking 2026-10-14 16:15:00 +07:00
3dtours a24f000ead style(mobile): uppercase button names in mobile hamburger menu and export button 2026-10-14 15:58:49 +07:00
3dtours 6290e5a8ab chore(docker): stamp the image bundle with 91d7d8d 2026-10-14 15:43:38 +07:00
3dtours 91d7d8d471 feat(studio): move UNDO and REDO icons to mobile topbar outside hamburger menu 2026-10-14 15:43:01 +07:00
3dtours 70a7e7ad6f chore(docker): stamp the image bundle with dfa75f3 2026-10-14 15:24:42 +07:00
3dtours dfa75f3356 fix(studio): resolve iOS HEAL auto-reload and grey blob with fast harmonic inpaint 2026-10-14 15:17:57 +07:00
3dtours ff712384da chore(docker): stamp the image bundle with 70ed61b 2026-10-14 12:57:38 +07:00
3dtours 70ed61b8de fix(studio): stroke clustering for HEAL, mobile WebGL inpaint stability, and reorganize LIGHT panels with HSL 2026-10-14 12:57:31 +07:00
3dtours c1d098e4e2 chore(docker): stamp the image bundle with 172df98 2026-10-14 12:06:08 +07:00
3dtours 172df9871b fix(studio): theme-sync LIGHT tab, fix iOS HEAL crash, and align docker container names to recipescam 2026-10-14 12:06:03 +07:00
3dtours 8a39ece37a chore(docker): stamp the image bundle with d52d4c4 2026-10-14 11:02:04 +07:00
3dtours d52d4c4281 feat(studio): redesign LIGHT tab to Lumetri style and fix mobile inpaint freeze with worker proxy and patch cache 2026-10-14 11:01:52 +07:00
3dtours e9cc2bb15a chore(docker): stamp the image bundle with 8fee669 2026-10-14 09:51:33 +07:00
3dtours 8fee6693bf fix(studio): an iPhone keeps the repair off WebGPU, off the worker pool and at 384 pixels, the three things its page did not survive 2026-10-14 09:50:51 +07:00
3dtours b7f63f488a chore(docker): stamp the image bundle with 5aa6a5b 2026-10-14 08:59:51 +07:00
3dtours 5aa6a5ba23 fix(studio): a repair lands under the brush with no pill over it, and a browser with no device is not asked for one 2026-10-14 08:59:13 +07:00
3dtours 24ce97edcc chore(docker): stamp the image bundle with 836858c 2026-10-14 00:53:37 +07:00
3dtours 836858c36c fix(studio): the repair keeps to a worker wherever it falls back, so a device that cannot run the graph cannot freeze the page 2026-10-14 00:52:58 +07:00
3dtours c192aa1ee2 chore(docker): stamp the image bundle with 4ff5eca 2026-10-14 00:19:13 +07:00
3dtours 4ff5eca71a fix(studio): the repair model runs in a worker where the phone has no device, so the page keeps answering fingers 2026-10-14 00:18:35 +07:00
3dtours b48bb74c22 chore(docker): stamp the image bundle with e31074b 2026-10-13 23:36:13 +07:00
3dtours e31074be4a feat(studio): a phone's header folds into one button, the open ruler no longer rides the photo 2026-10-13 23:35:44 +07:00
3dtours 522e4e9ee4 chore(docker): stamp the image bundle with ad85f0b 2026-10-13 23:06:58 +07:00
3dtours ad85f0bd0a fix(studio): a touch anywhere on the ruler takes the number, on every engine 2026-10-13 23:06:27 +07:00
3dtours b6ae819002 chore(docker): stamp the image bundle with 4eb74c3 2026-10-13 19:57:32 +07:00
3dtours 4eb74c3779 fix(studio): a drag on the photo holds the render until the finger lifts 2026-10-13 19:56:46 +07:00
3dtours db2fae9ada chore(docker): stamp the image bundle with b03896e 2026-10-13 19:42:38 +07:00
3dtours b03896e398 feat(studio): a finger across the photo is the open ruler's own track 2026-10-13 19:42:08 +07:00
3dtours 3948d525bd chore(docker): stamp the image bundle with 6e810b6 2026-10-13 19:21:01 +07:00
3dtours 6e810b66fc feat(studio): two fingers on the stage are the phone's own zoom, for aiming FIX and HEAL 2026-10-13 19:20:30 +07:00