aboutsummaryrefslogtreecommitdiff
path: root/public/app.js
AgeCommit message (Collapse)Author
2026-08-05admin panel for walk-graph management; /api/import gated behind admin logindax
2026-08-05touch: tap any visible slot to place, single ghost shown via scroll revealdax
2026-08-05bigger splash title, longer read timedax
2026-08-05restore splash overlaydax
2026-08-05hide prospective ghost on zoom reset (keyboard f/0, dblclick, touch ↵dax
double-tap); never render ghost from async exits on touch
2026-08-05suppress prospective ghost after click/scroll/zoom until real pointer ↵dax
movement, so pans can't reveal a ghost under a stationary mouse
2026-08-05prospective ghost only over empty slots: show single dimmed preview at the ↵dax
hovered slot off any placed tile, tap ghost or arrows to place; remove all buttons/dropzones on current tile
2026-08-05preview loading/blank state: hide old thumb instantly while new loads, 1s ↵dax
spinner fallback; keep preview hidden until scroll or mouse move, reset after click/keyboard navigation
2026-08-04single follow-preview: hover brightens to .85, persists at last option ↵dax
dimmed to .35; drop ghost + nav-edge buttons on current card
2026-08-04fix preview flicker: hide only best-dir preview when ghost shows, keep ↵dax
dropzones hit-testable
2026-08-04stream import uploads to disk; advertise direct-origin fast uploads; fix ↵dax
/api/paths total
2026-08-04show upload progress and indexing state; raise upload caps and timeoutsdax
2026-08-04add photo import: upload -> photoprism, fix desktop file dialogdax
- POST /api/import with native multipart parser (no new deps); stages files then delegates indexing+thumbnailing to PhotoPrism via `photoprism cp` - pathways reflects new photos immediately via refresh() - upload UI shown only in empty-library state - nixos: PHOTOPRISM_READONLY=false; pathways service gets STAGING_ROOT and photoprism env; PATH includes /run/wrappers/bin so sudo is found - fix: stage.setPointerCapture was swallowing the import label's click on desktop, preventing the native file dialog from opening
2026-08-04hover black space around mosaic: per-free-dir dropzones + hotspotsdax
Mouse users can now hover the empty black space beside the current tile to preview the photo that would be placed at that free-direction spot. renderTileZones now renders one dropzone per free direction (N/E/S/W): - the most-centered free dir keeps the persistent .preview (thumbnail) - the other free dirs are transparent hover hotspots that showGhost() the destination placement on pointermove and scheduleHideGhost() on leave - stable-element logic via a key string: early-return when unchanged; if only bestDir flips, move the cached prevEl into the new best dropzone and update img.src (no element churn / no flicker) - hotspots skipped on TOUCH (kept for tap-to-walk), persistent preview only - one preview at a time via .dropzone.hidden { visibility:hidden } zones map entries are now { els, key, bestDir, prevEl, img }. Tests green: domtest 58, touchtest 19, exhausttest 9, splashtest 6, fuzz clean, hoverlive 0 stray ghosts. Live at ?v=27.
2026-08-04mouse keeps selection control until an explicit scroll; drags pan without ↵dax
re-selecting
2026-08-04restore mouse hover ghosts alongside scroll preview (one preview at a time)dax
2026-08-04fix preview image sizing and scroll flicker (reuse dropzone, dedupe follow ↵dax
refresh)
2026-08-04single most-centered preview as you scrolldax
2026-08-04Previews appear as you scroll: current tile follows pan, tappable ↵dax
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.
2026-08-04Touch interaction model for coarse pointers, desktop unchangeddax
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.
2026-08-04Code review cleanup: cache placement/adjacency, drop dead codedax
- 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.
2026-08-04pathways: glowing edge segments only appear on hover; drop the preview fadedax
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.
2026-08-04pathways: replace floating edge chevrons with full-edge glow segments on the ↵dax
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.
2026-08-04pathways: chevrons float fully off the tile and only for the current tile; ↵dax
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
2026-08-04pathways: chevrons only for free directions, fade while previewing, ↵dax
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
2026-08-04pathways: replace small circle nav buttons with big free-floating edge ↵dax
chevrons (option 1); whole edge band is the hover + click target
2026-08-04pathways: reliable hover previews - ghost triggers on the whole direction ↵dax
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)
2026-08-04pathways: no dead-end directions while photos remain - server extends short ↵dax
walks with library ids to 60 entries, client falls back to any remaining unplaced photo when a direction's walk is exhausted
2026-08-04pathways: drop splash hint text; auto-fade splash once the user is active ↵dax
(pointer/key/wheel/touch) and has had time to read
2026-08-04pathways: ghost preview only shows on real pointer movement (pointermove, ↵dax
not pointerenter) - prevents phantom ghosts when keyboard navigation re-renders arrows/dropzones under a stationary mouse
2026-08-04pathways: four directions lead to four distinct photos - dedupe per-photo ↵dax
next ids in exit generation (server), exclude other directions' targets from placement candidates (client)
2026-08-04pathways: round-trip navigation (right then left returns to the same photo), ↵dax
traversal from any tile with a free space, back arrows hide their ghost, per-tile dropzones capped for large mosaics
2026-08-04pathways: scroll pans / pinch zooms; ghost preview on hover of destination ↵dax
space or arrow (not the zone band); invisible dropzones for current tile
2026-08-04pathways: hover a direction to preview the next photo as a translucent ↵dax
ghost, click to place it (choosePlacement refactor, ghost cleared on move)
2026-08-04pathways: mouse-gesture zoom - cursor-anchored wheel/pinch zoom with min/max ↵dax
clamps, keeps zoom across navigation, 0/f/double-click resets to fit
2026-08-04pathways: space-aware photo pick - use walk next when fit is close, ↵dax
substitute better-fitting walked photo on bad fit (FIT_TOLERANCE)
2026-08-04pathways: 2D placement search - never overlap, fill nearby voids ↵dax
(edge-aligned candidates, packing cost)
2026-08-04pathways: start tile fits both window dims, placement packs tight via slack ↵dax
scoring
2026-08-04pathways: smarter placement - fine-grained nearest fit + snap to neighbor ↵dax
edges, no more coarse tile-width jumps
2026-08-04pathways: fix deployment (files now land in public/), cache-bust assets + ↵dax
no-cache html, stronger zoom gesture (0.04/tile)
2026-08-04pathways: native-aspect free-form mosaic, no teleports (walk to next ↵dax
unplaced), arrows on every photo, arrows inside tiles, drop path text
2026-08-04pathways: stronger zoom-out per tile so the mosaic gesture readsdax
2026-08-04pathways: per-direction hover zones, transparent arrows, bigger start tile, ↵dax
zoom-out as mosaic grows
2026-08-04pathways: spatial movement, bigger tiles, cleaner exitsdax
- 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
2026-08-04pathways: bigger tiles, less chrome, no covered photosdax
- 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
2026-08-04pathways: walking mosaic navigatordax
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.
2026-08-04pathways: photo viewer over the PhotoPrism librarydax
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.