diff --git a/PROJECT_STATUS.md b/PROJECT_STATUS.md index 3b6f6a4..a82dd04 100644 --- a/PROJECT_STATUS.md +++ b/PROJECT_STATUS.md @@ -1,6 +1,6 @@ # Project Status: Marco -**Last Updated:** Mon Jan 19 2026 +**Last Updated:** Wed Jan 21 2026 ## Project Context @@ -25,6 +25,8 @@ We are building **Marco**, a decentralized maps application using **Ember.js** ( - **Dynamic Zoom:** Automatically zooms to a level where the accuracy circle covers ~10% of the map (fallback logic handles missing accuracy data). - **Smart Pulse:** Displays a pulsing blue circle during the search phase. - **Auto-Stop:** Pulse and tracking automatically stop when high accuracy (≤20m) is achieved or after a 10s timeout. +- **Persistence:** Saves and restores map center and zoom level using `localStorage` (key: `marco:map-view`). +- **Controls:** Enabled standard OpenLayers Rotate control (re-north) and custom Locate control. ### 2. RemoteStorage Module (`@remotestorage/module-places`) @@ -46,7 +48,10 @@ We are building **Marco**, a decentralized maps application using **Ember.js** ( - `osm.js`: Fetches nearby POIs from Overpass API. - **Reliability:** Implemented `fetchWithRetry` to handle HTTP 504/502/503 timeouts and 429 rate limits, in addition to network errors. - **UI Components:** - - `places-sidebar.gjs`: Displays a list of nearby POIs. Allows selecting a place to view details and saving it as a bookmark. Links to the OSM website via the node ID. + - `places-sidebar.gjs`: Displays a list of nearby POIs. + - `place-details.gjs`: Dedicated component for displaying rich place information. + - **Features:** Icons (via `feather-icons`), Address, Phone, Website, Opening Hours, Cuisine, Wikipedia. + - **Layout:** Polished UI with distinct sections for Actions and Meta info. - **Geo Utils:** - `app/utils/geo.js`: Haversine distance calculations. - `app/utils/geohash-coverage.js`: Logic to calculate required 4-char geohash prefixes for a given bounding box. @@ -64,25 +69,23 @@ We are building **Marco**, a decentralized maps application using **Ember.js** ( 1. User pans map -> `moveend` triggers `storage.loadPlacesInBounds`. 2. User clicks map -> "Pulse" animation -> hybrid hit detection (Visual Tile vs Overpass). 3. **Navigation:** Selected place is passed to the route (`transitionTo` with model), updating the URL to `/place/` or `/place/osm::` without re-fetching data. - 4. Sidebar displays details (using normalized `osmTags`). + 4. Sidebar displays details via `` component. 5. User clicks "Save Bookmark" -> Stores JSON in RemoteStorage. 6. RemoteStorage change event -> Debounced reload updates the map reactive-ly. ## Files Currently in Focus -- `app/routes/place.js`: Routing logic, ID parsing, and URL serialization. -- `app/services/osm.js`: Data fetching and normalization. +- `app/components/place-details.gjs`: UI logic for place info. +- `app/routes/place.js`: Routing logic. - `app/components/map.gjs`: Map rendering and interaction. - `app/services/storage.js`: Data sync logic. ## Next Steps & Pending Tasks 1. **App Header:** Implement a transparent header bar with the App Logo (left) and Login/User Info (right). -2. **Persist View:** Store the current map center and zoom level in `localStorage` to restore the view upon re-opening the app. -3. **Edit Bookmarks:** Allow users to edit the title and description of saved places. -4. **Refine UI/UX:** Further polish sidebar interactions and mobile responsiveness. -5. **Performance:** Monitor performance with large datasets (thousands of bookmarks). -6. **Testing:** Add automated tests for the geohash coverage and retry logic. +2. **Edit Bookmarks:** Allow users to edit the title and description of saved places. +3. **Performance:** Monitor performance with large datasets (thousands of bookmarks). +4. **Testing:** Add automated tests for the geohash coverage and retry logic. ## Technical Constraints