| Age | Commit message (Collapse) | Author |
|
|
|
refresh)
|
|
|
|
destination previews
- Current tile follows the viewport while dragging (touch) or scrolling
(wheel), throttled ~200ms, snapping to the nearest visible tile on
gesture end. setCurrent(id, rect, recenter) so follow never fights the
user's pan (no recenter, no zoom change).
- Persistent destination previews: the current tile's free exits now
render the destination photo (ghost) at each spot, always visible on
mobile and desktop, replacing the old all-tile invisible dropzones and
the hover-only dropzone ghost. Tapping/clicking a preview walks there.
- Desktop hover ghost kept for non-current tiles only (the current tile's
previews are already persistent, so no duplicate).
- Dropzones/previews are current-tile-only; ghost preview on nav zones of
the current tile suppressed.
- Removed MAX_ZONE_TILES (unused after current-only previews).
Tests: domtest 49/49 (rewritten ghost checks for persistent previews +
follow-scroll), touchtest 19/19, exhaust 9/9, splash 6/6, fuzz clean,
hoverlive against live data: 0 stray ghosts, 31 previews across 13 tiles.
|
|
Gated on matchMedia("(hover: none)") so mouse/trackpad behavior is
untouched:
- Nav zones + edge markers only on the current tile; tapping any other
tile selects it first. No more accidental traverses on touch.
- Edges always visible on touch (the hover glow becomes the tap
affordance), glow while pressed via :active. Bands modestly shrunk so
tile centers stay grab-to-pan.
- No hover ghost preview and no dropzones on touch (they were invisible
tap traps without hover).
- Two-finger pinch to zoom (pointer-count based, works everywhere).
- Double-tap on empty space resets zoom, mirroring desktop dblclick.
- Kill iOS tap-highlight and long-press callout.
Adds /tmp/touchtest.mjs (15 checks) covering select/traverse/pinch/
double-tap/pan; domtest 52/52, exhaust 9/9, splash 6/6, fuzz clean.
|
|
- Cache choosePlacement and adjacentTile results per (id,dir); invalidate
on addTile. Avoids O(n^3) placement scoring on every pointermove.
- setCurrent now re-renders only affected navs (prev + new) instead of
refreshAllNav; remove refreshAllNav entirely.
- Add pointercancel handler so interrupted touch/trackpad gestures don't
leave a stuck drag.
- Remove dead code: placeRect, photoConnections + /api/photo route and
THUMBS const on server, dangling info var in pointerup.
- Trim .gitignore, remove .DS_Store, bump cache-bust to ?v=20.
|
|
the edge marker is drawn on the tile and the ghost renders in the gap, so
they never overlap - there is no reason to fade the edge while previewing,
and the .preview class was making the edge vanish exactly when hovered. edges
are now invisible at rest and glow at full strength on hover.
|
|
tile
the arrows in the gap were pointless - that is exactly where the ghost
photo preview appears, so they only collided with it. now the current tile
shows a thin glowing segment running corner-to-corner along each free edge,
drawn ON the tile just inside the border: subtle at rest, bright on hover,
fades out while its preview ghost is showing. occupied directions get no
segment. the ghost still renders in the gap, so nothing overlaps it.
|
|
hover zone covers them; ghost hide is debounced
- chevrons sit entirely in the gap outside the tile (never half-on the photo)
and are drawn only for the current tile, killing the mosaic clutter
- nav zones extend 44px outward so the whole chevron is inside the hit area;
previously the chevron straddled the edge and its outer half was outside the
zone, so mousing across it flipped the ghost on/off (the flicker)
- ghost hide is debounced 80ms and cancelled on the next hover target, so
crossing the gap between a zone and its dropzone no longer blinks the ghost
- setCurrent re-renders navs so chevrons track the current tile
|
|
re-render nav on placement
- chevron is only drawn when the direction is not already occupied, so it
never overlaps a neighboring photo
- hovering a free direction adds a .preview class to the zone so the chevron
fades out while the ghost preview shows underneath it
- pointermove on an occupied direction early-returns (no ghost, no fade)
- refreshAllNav re-renders every tile's nav after a placement so stale chevrons
disappear as soon as a direction becomes occupied
|
|
chevrons (option 1); whole edge band is the hover + click target
|
|
band (not just the 40px button), ghost image loads eagerly, and repeated pointermoves no longer destroy/recreate the ghost (preview stays visible while the thumbnail loads)
|
|
walks with library ids to 60 entries, client falls back to any remaining unplaced photo when a direction's walk is exhausted
|
|
(pointer/key/wheel/touch) and has had time to read
|
|
not pointerenter) - prevents phantom ghosts when keyboard navigation re-renders arrows/dropzones under a stationary mouse
|
|
next ids in exit generation (server), exclude other directions' targets from placement candidates (client)
|
|
traversal from any tile with a free space, back arrows hide their ghost, per-tile dropzones capped for large mosaics
|
|
space or arrow (not the zone band); invisible dropzones for current tile
|
|
ghost, click to place it (choosePlacement refactor, ghost cleared on move)
|
|
clamps, keeps zoom across navigation, 0/f/double-click resets to fit
|
|
substitute better-fitting walked photo on bad fit (FIT_TOLERANCE)
|
|
(edge-aligned candidates, packing cost)
|
|
scoring
|
|
edges, no more coarse tile-width jumps
|
|
no-cache html, stronger zoom gesture (0.04/tile)
|
|
unplaced), arrows on every photo, arrows inside tiles, drop path text
|
|
|
|
zoom-out as mosaic grows
|
|
- movement lands on the photo already occupying the cell ahead instead
of skipping over it to place a new one; new photos only fill genuinely
empty cells, and already-placed path targets still jump to their tile
- tiles 360px desktop / 200px mobile
- fix hover exits being clipped half-off by the tile's overflow:hidden
(clip now lives on the img only); restyle as white circle buttons with
SVG chevrons and pill path labels
|
|
- tiles 240px desktop / 150px mobile
- remove hint bar; trim splash to a single line; drop counts from
hover labels and the move flash
- collision-safe placement: when a step lands on a cell already held
by a different photo, keep stepping in that direction to the first
free cell instead of overwriting, so returning photos are never
covered or orphaned
|
|
Replace the scrolling facet-grid with a walkable maze. You start on a
random photo; every photo holds up to four paths (labels, keywords,
camera, lens ranked by count, library as fallback), one per cardinal
direction, each an ordered cycle. Arrow keys or hover-revealed buttons
lock the next photo of that path onto the grid in the direction moved;
visited photos form a panable mosaic with focus-jump on revisits.
Server: precomputes per-photo exits; adds /api/exits/:id and /api/random.
Client: zero-dependency rewrite — splash, hidden exits, drag-pan, pointer
capture, reduced-motion support.
|
|
Groups photos into paths by shared label, keyword, camera, lens and
dominant colour. Node server.mjs (no build) reads the MariaDB
photoprism database read-only; public/ is a zero-dependency front end
with progressive reveal, a lightbox with connection chips, and a
dominant-colour swatch under every thumbnail.
|