7673fc63ea
- Updated toolbar styles for improved layout and appearance, including padding and margin adjustments. - Introduced new styles for scale menu and compact dropdowns. - Enhanced map pin tooltips with better positioning and hover effects. - Added new styles for map sheet filters, including search and date range controls. - Improved editor styles for a more cohesive look and feel, including transport controls for video editing. - Expanded GeoLocation interface to include additional address fields and formatted address. - Updated MediaItem interface to include storage reference and uploadedBy fields. - Enhanced MediaComment interface with author details for better user identification. - Introduced GalleryUser interface to represent signed-in users in the host app.
5.3 KiB
5.3 KiB
Requirements backlog (complete)
Status: ✅ done · 🚧 in progress · ⬜ planned · 🔑 needs key/creds. Cross-ref /docs/ROADMAP.md.
Done (Phases 1–3)
- ✅ macOS-Photos UI: sidebar, toolbar, Library (Years/Months/All), Collections, Map (map/satellite/grid), People, Recently Deleted (locked), lightbox, light/dark/semi-dark, responsive to 280px, a11y, nonce CSP.
- ✅ Albums (CRUD/nested/smart), source auto-classify, recycle bin, duplicates, multi-select, import (file+drag), export, EXIF (GPS/date/camera) on import.
- ✅ Object detection (TF.js, free) → tags/search/find-similar/Objects browser/object focus.
- ✅ Annotations (rect/oval/line/arrow/double-arrow measurement/text/freehand + colors) in editor + lightbox.
- ✅ Info panel (full metadata + mini-map). Themes menu +
accentColor/borderRadiusprops. - ✅ Gemini generative editor (Remove BG/Restore/Colorize/Replace Sky/prompt) — 🔑 needs billed key (free=429).
Now / next (in user's priority order) — all ✅ done
- ✅ Custom camera (#1): getUserMedia preview; capture photo; record video; switch front/back; grid; live annotation + measurement; geolocation on capture (permission); auto object-detect after capture.
- ✅ Supabase backend + storage (🔑): Postgres data + Supabase Storage adapter (run
docs/supabase-setup.sqlonce). Backend is the source of truth on load. The CRM host supplies its own incremental data-door adapter (applyChanges+putMedia); localStorage remains the zero-config dev default. - ✅ Face clustering → People; OCR (tesseract.js) → Documents + searchable text; semantic search (transformers.js / CLIP) — all free, in-browser.
- ✅ Full video editor + annotations (timeline engine, no ffmpeg); ✅ macOS-parity custom video player.
New requests (early sessions — now all done)
- ✅ Editor: straighten / tilt (angle slider) — rotate by arbitrary degrees.
- ✅ Crop: free-form AND fixed-ratio — a selected ratio (e.g. 1:1) is kept while dragging; also free crop.
- ✅ Import sync of existing metadata: IPTC/XMP keywords + location read on import (exifr) alongside object detection.
- ✅ Web-meaningful UI (deep pass): "All Projects" → "All Albums"; removed "App Store"; sidebar tabs / corner radius / touch-ups reviewed for a web gallery matching macOS.
- ✅ Search dropdown defaults: Recently Viewed / Recently Edited / Recently Added when the search field is focused.
- ✅ Info → map click opens full Map centered on that photo's location.
- ✅ Map parity w/ macOS: click a tag → that tag's images grouped by date; thumbnail pins; location sheets.
- ✅ Local-model fallback:
@imgly/background-removal(free, in-browser) wired for Remove Background — no key needed. - ✅ Everything free; build our own where no free option (analysis/OCR/faces/semantic/bg-remove all run in-browser).
- ✅ Memory in project
.claude/folder (this folder) — done. - ✅ More advanced features — versioning + audit log, comments, advanced video editor, sharing, password lock, glass design polish, custom video player (open-ended; new requests continue below).
Host-app embedding & CRM integration (2026-07-23) — done
The SDK now embeds into a host product (LynkedUp CRM), not only the standalone demo. All of it is opt-in.
- ✅ Embedded layout (
embedded) + chrome suppression (chrome,DEFAULT_CHROME) +hiddenViews+keyboardShortcutsflag; livesetConfigre-applies theme/tokens/identity/chrome without remount. - ✅ Host identity (
currentUser: GalleryUser) → identity-stamped comments (authorId/author/authorAvatar, delete only own), uploads (MediaItem.uploadedBy, never overwritten), versions (author on each). Info panel shows "Uploaded by" + per-version author.be-crmstill ownsowner_principal_id(display-only here). - ✅
shareBaseUrl(host owns share-link base) + full-screen (defaultFullscreen,.apg--fullscreen,setFullscreen/toggleFullscreen). - ✅ Full
ThemeTokensmap (52 keys) → CSS vars (sanitized); floating glass toolbar +.apg-scalemenudropdown. - ✅ Incremental adapter:
applyChanges(StateChanges)(diff-based, serialized, rollback-on-reject) +putMedia(id, blob, meta) → StoredBlob {ref,url};MediaItem.storageRef. TypesStateChanges/StoredBlobexported. - ✅ Server-backed Recently-Deleted lock (
lockProvider { status, set, verify }) replaces the device-local hash;lockConfigured= UI truth;lockError= wrong-password vs unavailable. - ✅ Editable caption + multi-line
notein Info (searchable); full-address reverse geocoding (Nominatim, persisted); map fly-to / count badge / hover mini-slider / date-range location filter. - ✅ UI fixes: Info-panel inline
<video>preview; comments as cards + spacing/divider; video-editor custom transport outside the transformed frame; map tooltipuser-select:none+ edge-clamping. - ⬜ Still open: real multi-user auth / permissions in the host (SDK identity is display-only; backend is the authority).
Notes
- getUserMedia needs HTTPS or localhost (dev OK). Permissions-Policy already allows camera/mic/geolocation=self.
- When Supabase is wired, switch the demo adapter from localStorage → Supabase and drop localStorage reliance.