Compare commits

...

9 Commits

Author SHA1 Message Date
ea7cb2f895 1.13.3
Some checks failed
CI / Lint (push) Failing after 18s
CI / Test (push) Successful in 29s
2026-03-11 18:19:15 +04:00
7e94f335ac Prevent zooming when selecting saved places 2026-03-11 18:16:24 +04:00
066ddb240d 1.13.2
Some checks failed
CI / Lint (push) Failing after 23s
CI / Test (push) Successful in 34s
2026-03-11 17:53:06 +04:00
df336b87ac Smart auto zoom for search/select 2026-03-11 17:51:26 +04:00
dbf71e366a Further improve scrolling 2026-03-11 17:19:48 +04:00
6a83003acb 1.13.1 2026-03-11 16:30:33 +04:00
bcc7c2a011 Improve bottom card scrolling on Android 2026-03-11 16:29:31 +04:00
19f04efecb 1.13.0 2026-03-11 16:16:57 +04:00
c79bbaa41a Merge pull request 'Add email, FB, Instagram to place details' (#26) from feature/social_links into master
All checks were successful
CI / Lint (push) Successful in 21s
CI / Test (push) Successful in 34s
Reviewed-on: #26
2026-03-11 12:11:13 +00:00
11 changed files with 60 additions and 20 deletions

View File

@@ -441,6 +441,7 @@ export default class MapComponent extends Component {
// Track the selected place from the UI Service (Router -> Map)
updateSelectedPin = modifier(() => {
const selected = this.mapUi.selectedPlace;
const options = this.mapUi.selectionOptions || {};
if (!this.selectedPinOverlay || !this.selectedPinElement) return;
@@ -471,7 +472,12 @@ export default class MapComponent extends Component {
}
}
if (selected.bbox) {
if (options.preventZoom) {
// If we are preventing zoom (e.g. user clicked a bookmark), we still need to center
// but without changing the zoom level.
// We use animateToSmartCenter without a second argument (zoom=null).
this.animateToSmartCenter(coords);
} else if (selected.bbox) {
this.zoomToBbox(selected.bbox);
} else {
this.handlePinVisibility(coords);
@@ -530,13 +536,22 @@ export default class MapComponent extends Component {
padding: padding,
duration: 1000,
easing: (t) => t * (2 - t),
maxZoom: currentZoom,
maxZoom: Math.max(currentZoom, 18),
});
}
handlePinVisibility(coords) {
if (!this.mapInstance) return;
const view = this.mapInstance.getView();
const currentZoom = view.getZoom();
// If too far out (e.g. world view), zoom in to neighborhood level (16)
if (currentZoom < 16) {
this.animateToSmartCenter(coords, 16);
return;
}
const pixel = this.mapInstance.getPixelFromCoordinate(coords);
const size = this.mapInstance.getSize();
@@ -555,12 +570,17 @@ export default class MapComponent extends Component {
}
}
animateToSmartCenter(coords) {
animateToSmartCenter(coords, zoom = null) {
if (!this.mapInstance) return;
const size = this.mapInstance.getSize();
const view = this.mapInstance.getView();
const resolution = view.getResolution();
let resolution = view.getResolution();
if (zoom !== null) {
resolution = view.getResolutionForZoom(zoom);
}
let targetCenter = coords;
// Check if mobile (width <= 768px matches CSS)
@@ -582,11 +602,17 @@ export default class MapComponent extends Component {
targetCenter = [coords[0], coords[1] - offsetMapUnits];
}
view.animate({
const animationOptions = {
center: targetCenter,
duration: 1000,
easing: (t) => t * (2 - t), // Ease-out
});
};
if (zoom !== null) {
animationOptions.zoom = zoom;
}
view.animate(animationOptions);
}
panIfObscured(coords) {
@@ -850,6 +876,7 @@ export default class MapComponent extends Component {
'Clicked bookmark while sidebar open (switching):',
clickedBookmark
);
this.mapUi.preventNextZoom = true;
this.router.transitionTo('place', clickedBookmark);
return;
}
@@ -864,6 +891,7 @@ export default class MapComponent extends Component {
// Normal behavior (sidebar is closed)
if (clickedBookmark) {
console.debug('Clicked bookmark:', clickedBookmark);
this.mapUi.preventNextZoom = true;
this.router.transitionTo('place', clickedBookmark);
return;
}

View File

@@ -72,7 +72,9 @@ export default class PlaceRoute extends Route {
// Notify the Map UI to show the pin
if (model) {
this.mapUi.selectPlace(model);
const options = { preventZoom: this.mapUi.preventNextZoom };
this.mapUi.selectPlace(model, options);
this.mapUi.preventNextZoom = false;
}
// Stop the pulse animation if it was running (e.g. redirected from search)
this.mapUi.stopSearch();

View File

@@ -9,18 +9,24 @@ export default class MapUiService extends Service {
@tracked returnToSearch = false;
@tracked currentCenter = null;
@tracked searchBoxHasFocus = false;
@tracked selectionOptions = {};
@tracked preventNextZoom = false;
selectPlace(place) {
selectPlace(place, options = {}) {
this.selectedPlace = place;
this.selectionOptions = options;
}
clearSelection() {
this.selectedPlace = null;
this.selectionOptions = {};
this.preventNextZoom = false;
}
startSearch() {
this.isSearching = true;
this.isCreating = false;
this.preventNextZoom = false;
}
stopSearch() {

View File

@@ -203,6 +203,7 @@ body {
box-shadow: 2px 0 5px rgb(0 0 0 / 10%);
display: flex;
flex-direction: column;
overflow: hidden; /* Ensure flex children are contained */
}
.settings-pane.sidebar {
@@ -239,7 +240,11 @@ body {
.sidebar-content {
padding: 1rem;
overflow-y: auto;
flex: 1; /* Take up remaining vertical space */
-webkit-overflow-scrolling: touch;
flex: 1;
min-height: 0;
touch-action: pan-y;
overscroll-behavior: contain;
}
.edit-form {
@@ -772,7 +777,6 @@ button.create-place {
.sidebar-content {
overflow-y: auto;
overscroll-behavior: contain; /* Prevent scroll chaining */
/* Ensure content doesn't get hidden behind bottom safe areas on mobile */
padding-bottom: env(safe-area-inset-bottom, 20px);

View File

@@ -1,6 +1,6 @@
{
"name": "marco",
"version": "1.12.3",
"version": "1.13.3",
"private": true,
"description": "Unhosted maps app",
"repository": {

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

View File

@@ -39,8 +39,8 @@
<meta name="msapplication-TileColor" content="#F6E9A6">
<meta name="msapplication-TileImage" content="/icons/icon-144.png">
<script type="module" crossorigin src="/assets/main-dKBF4UHr.js"></script>
<link rel="stylesheet" crossorigin href="/assets/main-DoLYcE7E.css">
<script type="module" crossorigin src="/assets/main-gjk9d6Ld.js"></script>
<link rel="stylesheet" crossorigin href="/assets/main-DAo4Q0R2.css">
</head>
<body>
</body>

View File

@@ -3,9 +3,9 @@ import { extensions, ember } from '@embroider/vite';
import { babel } from '@rollup/plugin-babel';
export default defineConfig({
// server: {
// host: '0.0.0.0'
// },
server: {
host: '0.0.0.0'
},
plugins: [
ember(),
// extra plugins here