Compare commits

..

6 Commits

Author SHA1 Message Date
raucao 0332cf4c3c Merge pull request 'Hide quick-search pills on low zoom levels' (#53) from ui/pills_on_zoom into master
CI / Lint (push) Successful in 30s
CI / Test (push) Successful in 54s
Reviewed-on: #53
2026-05-05 05:14:54 +00:00
raucao 59c447fe1f Hide quick-search pills on low zoom levels
CI / Lint (pull_request) Successful in 30s
CI / Test (pull_request) Successful in 56s
Release Drafter / Update release notes draft (pull_request) Successful in 7s
2026-05-05 07:10:28 +02:00
raucao 1140ecfe41 Add buttons for opening signer app, copying connect link
CI / Lint (push) Successful in 49s
CI / Test (push) Successful in 59s
2026-05-05 07:02:08 +02:00
raucao 60936ed2f5 1.21.1
CI / Lint (push) Successful in 32s
CI / Test (push) Successful in 56s
2026-04-27 21:51:55 +01:00
raucao ca82a029bc Fix app menu section layout 2026-04-27 21:50:47 +01:00
raucao 0630aed73d Fix modals 2026-04-27 21:50:36 +01:00
16 changed files with 92 additions and 15 deletions
+7 -1
View File
@@ -15,6 +15,7 @@ export default class AppHeaderComponent extends Component {
@service settings;
@service nostrAuth;
@service nostrData;
@service mapUi;
@tracked isUserMenuOpen = false;
@tracked searchQuery = '';
@@ -22,6 +23,11 @@ export default class AppHeaderComponent extends Component {
return !!this.searchQuery;
}
get showQuickSearch() {
const zoom = this.mapUi.currentZoom ?? 13;
return this.settings.showQuickSearchButtons && zoom >= 12;
}
@action
toggleUserMenu() {
this.isUserMenuOpen = !this.isUserMenuOpen;
@@ -54,7 +60,7 @@ export default class AppHeaderComponent extends Component {
/>
</div>
{{#if this.settings.showQuickSearchButtons}}
{{#if this.showQuickSearch}}
<div class="header-center {{if this.hasQuery 'searching'}}">
<CategoryChips @onSelect={{this.handleChipSelect}} />
</div>
+1 -1
View File
@@ -15,7 +15,7 @@ export default class AppMenuSettingsApis extends Component {
<Icon @name="server" @size={{20}} />
<span>API Providers</span>
</summary>
<div class="details-content">
<div class="details-content form-layout">
<div class="form-group">
<label for="overpass-api">Overpass API Provider</label>
<select
+1 -1
View File
@@ -14,7 +14,7 @@ export default class AppMenuSettingsMapUi extends Component {
<Icon @name="map" @size={{20}} />
<span>Map & UI</span>
</summary>
<div class="details-content">
<div class="details-content form-layout">
<div class="form-group">
<label for="show-quick-search">Quick search buttons visible</label>
<select
+1 -1
View File
@@ -108,7 +108,7 @@ export default class AppMenuSettingsNostr extends Component {
<Icon @name="zap" @size={{20}} />
<span>Nostr</span>
</summary>
<div class="details-content">
<div class="details-content form-layout">
<div class="form-group">
<label for="nostr-photo-fallback-uploads">Upload photos to fallback
servers</label>
+2
View File
@@ -284,6 +284,7 @@ export default class MapComponent extends Component {
// Initialize the UI service with the map center
const initialCenter = toLonLat(view.getCenter());
this.mapUi.updateCenter(initialCenter[1], initialCenter[0]);
this.mapUi.updateZoom(view.getZoom());
apply(this.mapInstance, 'https://tiles.openfreemap.org/styles/liberty', {
webfonts: 'data:text/css,',
@@ -1046,6 +1047,7 @@ export default class MapComponent extends Component {
const view = this.mapInstance.getView();
const center = toLonLat(view.getCenter());
this.mapUi.updateCenter(center[1], center[0]);
this.mapUi.updateZoom(view.getZoom());
// If in creation mode, update the coordinates in the service AND the URL
if (this.mapUi.isCreating) {
+48 -3
View File
@@ -41,6 +41,40 @@ export default class NostrConnectComponent extends Component {
}
}
@action
async copyConnectUri() {
const text = this.nostrAuth.connectUri;
try {
if (navigator.clipboard && window.isSecureContext) {
await navigator.clipboard.writeText(text);
} else {
const textArea = document.createElement('textarea');
textArea.value = text;
textArea.style.position = 'fixed';
textArea.style.top = '0';
textArea.style.left = '0';
textArea.style.opacity = '0';
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
const successful = document.execCommand('copy');
document.body.removeChild(textArea);
if (!successful) {
throw new Error('Fallback copy failed');
}
}
this.toast.show('Connection link copied to clipboard');
} catch (err) {
console.error('Failed to copy text: ', err);
alert('Failed to copy link');
}
}
<template>
<div class="nostr-connect-modal">
<h2>Connect with Nostr</h2>
@@ -59,7 +93,7 @@ export default class NostrConnectComponent extends Component {
class="btn btn-outline"
type="button"
disabled
title="No Nostr extension found in your browser."
title="No Nostr extension found in your browser"
>
Browser Extension (Not Found)
</button>
@@ -79,9 +113,20 @@ export default class NostrConnectComponent extends Component {
{{#if this.nostrAuth.isMobile}}
<p>Waiting for you to approve the connection in your mobile signer
app...</p>
<div class="mobile-connect-actions">
<a href={{this.nostrAuth.connectUri}} class="btn btn-primary">
Open Signer App
</a>
<button
class="btn btn-outline"
type="button"
{{on "click" this.copyConnectUri}}
>
Copy Connection Link
</button>
</div>
{{else}}
<p>Scan this QR code with a compatible Nostr signer app (like
Amber):</p>
<p>Scan this QR code with a Nostr signer app (like Amber):</p>
<div class="qr-code-container">
<canvas {{qrCode this.nostrAuth.connectUri}}></canvas>
</div>
+8
View File
@@ -29,6 +29,14 @@ export default class PlaceDetails extends Component {
@tracked isConnectingNostr = false;
@tracked isGalleryOpen = false;
@tracked selectedGalleryPhoto = null;
@tracked isPhotoUploadModalOpen = false;
@tracked isNostrConnectModalOpen = false;
@tracked newlyUploadedPhotoId = null;
@action
handleUploadStateChange(isActive) {
this.isPhotoUploadActive = isActive;
}
@action
openPhotoUploadModal(e) {
+5
View File
@@ -11,6 +11,7 @@ export default class MapUiService extends Service {
@tracked returnToSearch = false;
@tracked currentCenter = null;
@tracked currentBounds = null;
@tracked currentZoom = null;
@tracked searchBoxHasFocus = false;
@tracked selectionOptions = {};
@tracked preventNextZoom = false;
@@ -81,6 +82,10 @@ export default class MapUiService extends Service {
this.currentCenter = { lat, lon };
}
updateZoom(zoom) {
this.currentZoom = zoom;
}
updateBounds(bounds) {
this.currentBounds = bounds;
}
+11
View File
@@ -594,6 +594,9 @@ body {
padding: 0 1.4rem 1rem;
animation: details-slide-down 0.2s ease-out;
font-size: 0.9rem;
}
.sidebar-content details .details-content.form-layout {
display: flex;
flex-direction: column;
gap: 16px;
@@ -1081,6 +1084,7 @@ abbr[title] {
align-items: center;
justify-content: center;
gap: 0.5rem;
text-decoration: none;
}
.btn:disabled {
@@ -1777,6 +1781,13 @@ button.create-place {
margin-top: 1.5rem;
}
.mobile-connect-actions {
display: flex;
flex-direction: column;
gap: 0.5rem;
margin-top: 1rem;
}
.nostr-connect-status {
margin-top: 1.5rem;
text-align: center;
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "marco",
"version": "1.21.0",
"version": "1.21.1",
"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
File diff suppressed because one or more lines are too long
+2 -2
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-B30qTale.js"></script>
<link rel="stylesheet" crossorigin href="/assets/main-48yHGHPo.css">
<script type="module" crossorigin src="/assets/main-DsygQlAh.js"></script>
<link rel="stylesheet" crossorigin href="/assets/main-C_mgNoFX.css">
</head>
<body>
</body>