Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
4ad0df22e2
|
|||
|
0decb4cf1b
|
|||
|
2193f935cc
|
|||
|
b2b03c0a38
|
|||
|
0be02c5b20
|
|||
|
653e44348c
|
|||
|
8fdc697a17
|
|||
|
d9b2a17b91
|
|||
|
85255318ba
|
|||
|
713d9d53e6
|
|||
|
e0ea0ca988
|
@@ -1,6 +1,6 @@
|
|||||||
# Project Status: Marco
|
# Project Status: Marco
|
||||||
|
|
||||||
**Last Updated:** Sat Jan 24 2026
|
**Last Updated:** Mon Jan 26 2026
|
||||||
|
|
||||||
## Project Context
|
## Project Context
|
||||||
|
|
||||||
@@ -21,9 +21,14 @@ We are building **Marco**, a decentralized maps application using **Ember.js** (
|
|||||||
- **Visuals:** Increased bookmark marker size (Radius 9px) and added a subtle drop shadow.
|
- **Visuals:** Increased bookmark marker size (Radius 9px) and added a subtle drop shadow.
|
||||||
- **Feedback:** Implemented a "pulse" animation (via OpenLayers Overlay) at the click location to visualize the search radius (30m/50m).
|
- **Feedback:** Implemented a "pulse" animation (via OpenLayers Overlay) at the click location to visualize the search radius (30m/50m).
|
||||||
- **Mobile UX:**
|
- **Mobile UX:**
|
||||||
- Disabled browser tap highlights (`-webkit-tap-highlight-color: transparent`) to prevent blue flashing on Android.
|
- **Touch:** Disabled browser tap highlights (`-webkit-tap-highlight-color: transparent`) to prevent blue flashing on Android.
|
||||||
- Disabled "pull-to-refresh" (`overscroll-behavior: none`) on the body to prevent accidental reloads while keeping the sidebar scrollable (`contain`).
|
- **Scroll:** Disabled "pull-to-refresh" (`overscroll-behavior: none`) on the body to prevent accidental reloads while keeping the sidebar scrollable (`contain`).
|
||||||
- **Auto-Pan:** On mobile screens, if a selected pin is obscured by the bottom sheet, the map automatically pans to center the pin in the visible top half of the screen.
|
- **Auto-Pan:** On mobile screens, if a selected pin is obscured by the bottom sheet, the map automatically pans to center the pin in the visible top half of the screen.
|
||||||
|
- **Controls:** Fixed positioning of "Locate" and "Rotate" buttons on mobile by correcting CSS `inset` syntax.
|
||||||
|
- **iOS Polish:**
|
||||||
|
- Prevented input auto-zoom by ensuring `.form-control` font size is `1rem` (16px).
|
||||||
|
- Added `-webkit-text-size-adjust: 100%` to prevent text inflation on rotation.
|
||||||
|
- Set base `body` font size to `16px`.
|
||||||
- **Geolocation ("Locate Me"):**
|
- **Geolocation ("Locate Me"):**
|
||||||
- Implemented a "Locate Me" button with robust tracking logic.
|
- Implemented a "Locate Me" button with robust tracking logic.
|
||||||
- **Dynamic Zoom:** Automatically zooms to a level where the accuracy circle covers ~10% of the map (fallback logic handles missing accuracy data).
|
- **Dynamic Zoom:** Automatically zooms to a level where the accuracy circle covers ~10% of the map (fallback logic handles missing accuracy data).
|
||||||
@@ -44,7 +49,7 @@ We are building **Marco**, a decentralized maps application using **Ember.js** (
|
|||||||
- configured with `maxAge: false` to ensure data freshness.
|
- configured with `maxAge: false` to ensure data freshness.
|
||||||
- **Dependencies:** Uses `ulid` and `latlon-geohash` internally.
|
- **Dependencies:** Uses `ulid` and `latlon-geohash` internally.
|
||||||
|
|
||||||
### 3. App Infrastructure
|
### 3. App Infrastructure & Build
|
||||||
|
|
||||||
- **Services:**
|
- **Services:**
|
||||||
- `storage.js`: Initializes RemoteStorage, claims access, enables caching, and sets up the widget. Consumes the new `getPlaces` API.
|
- `storage.js`: Initializes RemoteStorage, claims access, enables caching, and sets up the widget. Consumes the new `getPlaces` API.
|
||||||
@@ -68,6 +73,11 @@ We are building **Marco**, a decentralized maps application using **Ember.js** (
|
|||||||
- **Geo Utils:**
|
- **Geo Utils:**
|
||||||
- `app/utils/geo.js`: Haversine distance calculations.
|
- `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.
|
- `app/utils/geohash-coverage.js`: Logic to calculate required 4-char geohash prefixes for a given bounding box.
|
||||||
|
- **Build & DevOps:**
|
||||||
|
- **Icon Generation:** Added `build:icons` script using `magick` and `rsvg-convert` to automate PNG generation from SVG.
|
||||||
|
- **Dependencies:** Documented system requirements (ImageMagick, librsvg) in `README.md`.
|
||||||
|
- **Ember CLI:** Added as dev dependency to support generator commands.
|
||||||
|
- **License:** Added AGPLv3 license.
|
||||||
|
|
||||||
### 4. Routing & Data Optimization
|
### 4. Routing & Data Optimization
|
||||||
|
|
||||||
@@ -91,16 +101,17 @@ We are building **Marco**, a decentralized maps application using **Ember.js** (
|
|||||||
|
|
||||||
## Files Currently in Focus
|
## Files Currently in Focus
|
||||||
|
|
||||||
- `app/templates/application.gjs`: Core layout and "Outside Click" logic.
|
- `app/styles/app.css`: Mobile CSS fixes (font sizes, control positioning).
|
||||||
- `app/components/settings-pane.gjs`: Settings UI.
|
- `package.json`: New scripts and dependencies.
|
||||||
- `app/services/settings.js`: Settings persistence.
|
- `README.md`: Updated documentation.
|
||||||
|
|
||||||
## Next Steps & Pending Tasks
|
## Next Steps & Pending Tasks
|
||||||
|
|
||||||
1. **Collections/Lists:** Implement ability to organize bookmarks into lists/collections.
|
1. **Mobile Polish:** Verify "Locate Me" animation on iOS Safari.
|
||||||
2. **Linting & Code Quality:** Fix remaining CSS errors, remove inline styles in `map.gjs`, and address unused variables/runloop usage.
|
2. **Collections/Lists:** Implement ability to organize bookmarks into lists/collections.
|
||||||
3. **Performance:** Monitor performance with large datasets (thousands of bookmarks).
|
3. **Linting & Code Quality:** Fix remaining CSS errors, remove inline styles in `map.gjs`, and address unused variables/runloop usage.
|
||||||
4. **Testing:** Add automated tests for the geohash coverage, retry logic, and new editing features.
|
4. **Performance:** Monitor performance with large datasets (thousands of bookmarks).
|
||||||
|
5. **Testing:** Add automated tests for the geohash coverage, retry logic, and new editing features.
|
||||||
|
|
||||||
## Technical Constraints
|
## Technical Constraints
|
||||||
|
|
||||||
|
|||||||
@@ -61,8 +61,8 @@ export default class MapComponent extends Component {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Default view settings
|
// Default view settings
|
||||||
let center = [99.05738, 7.55087];
|
let center = [14.21683569, 27.060114248];
|
||||||
let zoom = 13.0;
|
let zoom = 2.661;
|
||||||
|
|
||||||
// Try to restore from localStorage
|
// Try to restore from localStorage
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -4,11 +4,12 @@ html,
|
|||||||
body {
|
body {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
overscroll-behavior: none; /* Prevent pull-to-refresh on mobile */
|
overscroll-behavior: none; /* Prevent pull-to-refresh on mobile */
|
||||||
|
-webkit-text-size-adjust: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
font-family: 'Noto Serif', serif;
|
font-family: 'Noto Serif', sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -256,7 +257,7 @@ body {
|
|||||||
border: 1px solid #ddd;
|
border: 1px solid #ddd;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
font-size: 0.95rem;
|
font-size: 1rem;
|
||||||
box-sizing: border-box; /* Ensure padding doesn't overflow width */
|
box-sizing: border-box; /* Ensure padding doesn't overflow width */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -320,6 +321,11 @@ body {
|
|||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.meta-info p {
|
||||||
|
margin-top: 1rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
.meta-info p:first-child {
|
.meta-info p:first-child {
|
||||||
margin-top: 1.2rem;
|
margin-top: 1.2rem;
|
||||||
padding-top: 1.2rem;
|
padding-top: 1.2rem;
|
||||||
@@ -427,8 +433,8 @@ body {
|
|||||||
margin: 0 0 1rem;
|
margin: 0 0 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.place-details .place-description {
|
.place-details p.place-description {
|
||||||
margin-bottom: 1.5rem;
|
line-height: 1.4;
|
||||||
}
|
}
|
||||||
|
|
||||||
.place-details .actions {
|
.place-details .actions {
|
||||||
@@ -436,6 +442,7 @@ body {
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
gap: 1rem;
|
gap: 1rem;
|
||||||
|
margin-top: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn {
|
.btn {
|
||||||
@@ -495,11 +502,15 @@ body {
|
|||||||
border: 2px solid rgb(255 204 51 / 80%); /* Gold/Yellow to match markers */
|
border: 2px solid rgb(255 204 51 / 80%); /* Gold/Yellow to match markers */
|
||||||
background: rgb(255 204 51 / 20%);
|
background: rgb(255 204 51 / 20%);
|
||||||
position: absolute;
|
position: absolute;
|
||||||
transform: translate(-50%, -50%);
|
/* Use translate3d for GPU acceleration on iOS */
|
||||||
|
transform: translate3d(-50%, -50%, 0);
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
animation: pulse 1.5s infinite ease-out;
|
animation: pulse 1.5s infinite ease-out;
|
||||||
box-sizing: border-box; /* Ensure border is included in width/height */
|
box-sizing: border-box; /* Ensure border is included in width/height */
|
||||||
display: none; /* Hidden by default */
|
display: none; /* Hidden by default */
|
||||||
|
will-change: transform, opacity;
|
||||||
|
-webkit-backface-visibility: hidden;
|
||||||
|
backface-visibility: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-pulse.active {
|
.search-pulse.active {
|
||||||
@@ -513,12 +524,12 @@ body {
|
|||||||
|
|
||||||
@keyframes pulse {
|
@keyframes pulse {
|
||||||
0% {
|
0% {
|
||||||
transform: translate(-50%, -50%) scale(0.8);
|
transform: translate3d(-50%, -50%, 0) scale(0.8);
|
||||||
opacity: 0.8;
|
opacity: 0.8;
|
||||||
}
|
}
|
||||||
|
|
||||||
100% {
|
100% {
|
||||||
transform: translate(-50%, -50%) scale(1.4);
|
transform: translate3d(-50%, -50%, 0) scale(1.4);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "marco",
|
"name": "marco",
|
||||||
"version": "1.8.5",
|
"version": "1.8.9",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Unhosted maps app",
|
"description": "Unhosted maps app",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
1
release/assets/main-BP5J45zX.css
Normal file
1
release/assets/main-BP5J45zX.css
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -26,8 +26,8 @@
|
|||||||
<meta name="msapplication-TileColor" content="#F6E9A6">
|
<meta name="msapplication-TileColor" content="#F6E9A6">
|
||||||
<meta name="msapplication-TileImage" content="/icons/icon-144.png">
|
<meta name="msapplication-TileImage" content="/icons/icon-144.png">
|
||||||
|
|
||||||
<script type="module" crossorigin src="/assets/main-DsIm8MXw.js"></script>
|
<script type="module" crossorigin src="/assets/main-DcXD8_Ko.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/assets/main-Csx4lQiv.css">
|
<link rel="stylesheet" crossorigin href="/assets/main-BP5J45zX.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
Reference in New Issue
Block a user