Compare commits

..

12 Commits

Author SHA1 Message Date
1d022b21bd 1.20.5
All checks were successful
CI / Lint (push) Successful in 31s
CI / Test (push) Successful in 56s
2026-04-25 11:10:44 +01:00
3e831a7686 Enable relay pings
This should re-establish relay connections when PWAs are being woken up
after background sleep
2026-04-25 11:08:55 +01:00
2943125dbd 1.20.4
All checks were successful
CI / Lint (push) Successful in 31s
CI / Test (push) Successful in 57s
2026-04-25 10:55:20 +01:00
a32ad7572b Add more marker icons
Some checks failed
CI / Lint (push) Successful in 32s
CI / Test (push) Has been cancelled
2026-04-25 10:53:53 +01:00
a1b3957c83 Fix photo icon in map markers 2026-04-25 10:42:05 +01:00
9f2f233c22 Adjust JPEG quality for large photos 2026-04-25 10:41:39 +01:00
1ba4afdf08 1.20.3
All checks were successful
CI / Lint (push) Successful in 31s
CI / Test (push) Successful in 57s
2026-04-24 13:55:07 +01:00
d764134513 Remove superfluous publishing status alert 2026-04-24 13:53:40 +01:00
e38f540c79 1.20.2
All checks were successful
CI / Lint (push) Successful in 32s
CI / Test (push) Successful in 58s
2026-04-24 12:28:08 +01:00
73ad5b4eb1 Disable closing modal during photo upload 2026-04-24 12:24:19 +01:00
b4a70233cf Show detailed photo upload status
All checks were successful
CI / Lint (push) Successful in 31s
CI / Test (push) Successful in 56s
2026-04-24 11:56:37 +01:00
cb4b9c6b40 Render portrait thumbnails as squares on mobile
All checks were successful
CI / Lint (push) Successful in 32s
CI / Test (push) Successful in 56s
A bit too small otherwise
2026-04-24 11:01:58 +01:00
19 changed files with 136 additions and 54 deletions

View File

@@ -11,6 +11,7 @@ export default class Modal extends Component {
@action @action
close() { close() {
if (this.args.disableClose) return;
if (this.args.onClose) { if (this.args.onClose) {
this.args.onClose(); this.args.onClose();
} }
@@ -31,10 +32,11 @@ export default class Modal extends Component {
> >
<button <button
type="button" type="button"
class="close-modal-btn btn-text" class="close-modal-btn btn-text {{if @disableClose 'disabled'}}"
disabled={{@disableClose}}
{{on "click" this.close}} {{on "click" this.close}}
> >
<Icon @name="x" @size={{24}} /> <Icon @name="x" @size={{24}} @color="currentColor" />
</button> </button>
{{yield}} {{yield}}
</div> </div>

View File

@@ -27,6 +27,12 @@ export default class PlaceDetails extends Component {
@tracked isPhotoUploadModalOpen = false; @tracked isPhotoUploadModalOpen = false;
@tracked isNostrConnectModalOpen = false; @tracked isNostrConnectModalOpen = false;
@tracked newlyUploadedPhotoId = null; @tracked newlyUploadedPhotoId = null;
@tracked isPhotoUploadActive = false;
@action
handleUploadStateChange(isActive) {
this.isPhotoUploadActive = isActive;
}
@action @action
openPhotoUploadModal(e) { openPhotoUploadModal(e) {
@@ -42,6 +48,7 @@ export default class PlaceDetails extends Component {
@action @action
closePhotoUploadModal(eventId) { closePhotoUploadModal(eventId) {
if (this.isPhotoUploadActive) return;
this.isPhotoUploadModalOpen = false; this.isPhotoUploadModalOpen = false;
if (typeof eventId === 'string') { if (typeof eventId === 'string') {
this.newlyUploadedPhotoId = eventId; this.newlyUploadedPhotoId = eventId;
@@ -569,7 +576,7 @@ export default class PlaceDetails extends Component {
{{#if this.osmUrl}} {{#if this.osmUrl}}
<div class="meta-info"> <div class="meta-info">
<p class="content-with-icon"> <p class="content-with-icon">
<Icon @name="camera" /> <Icon @name="feather-camera" />
<span> <span>
<button <button
type="button" type="button"
@@ -585,10 +592,14 @@ export default class PlaceDetails extends Component {
</div> </div>
{{#if this.isPhotoUploadModalOpen}} {{#if this.isPhotoUploadModalOpen}}
<Modal @onClose={{this.closePhotoUploadModal}}> <Modal
@onClose={{this.closePhotoUploadModal}}
@disableClose={{this.isPhotoUploadActive}}
>
<PlacePhotoUpload <PlacePhotoUpload
@place={{this.saveablePlace}} @place={{this.saveablePlace}}
@onClose={{this.closePhotoUploadModal}} @onClose={{this.closePhotoUploadModal}}
@onUploadStateChange={{this.handleUploadStateChange}}
/> />
</Modal> </Modal>
{{/if}} {{/if}}

View File

@@ -10,7 +10,7 @@ import { isMobile } from '../utils/device';
import Blurhash from './blurhash'; import Blurhash from './blurhash';
const MAX_IMAGE_DIMENSION = 1920; const MAX_IMAGE_DIMENSION = 1920;
const IMAGE_QUALITY = 0.94; const IMAGE_QUALITY = 0.9;
const MAX_THUMBNAIL_DIMENSION = 350; const MAX_THUMBNAIL_DIMENSION = 350;
const THUMBNAIL_QUALITY = 0.9; const THUMBNAIL_QUALITY = 0.9;
@@ -22,6 +22,7 @@ export default class PlacePhotoUploadItem extends Component {
@tracked thumbnailUrl = ''; @tracked thumbnailUrl = '';
@tracked blurhash = ''; @tracked blurhash = '';
@tracked error = ''; @tracked error = '';
@tracked statusText = '';
constructor() { constructor() {
super(...arguments); super(...arguments);
@@ -47,6 +48,7 @@ export default class PlacePhotoUploadItem extends Component {
uploadTask = task(async (file) => { uploadTask = task(async (file) => {
this.error = ''; this.error = '';
this.statusText = 'Processing';
try { try {
// 1. Process main image and generate blurhash in worker // 1. Process main image and generate blurhash in worker
const mainData = await this.imageProcessor.process( const mainData = await this.imageProcessor.process(
@@ -71,18 +73,34 @@ export default class PlacePhotoUploadItem extends Component {
let mainResult, thumbResult; let mainResult, thumbResult;
const isMobileDevice = isMobile(); const isMobileDevice = isMobile();
const mainProgress = (status) => {
if (status === 'signing') this.statusText = 'Signing photo upload';
if (status === 'uploading') this.statusText = 'Uploading photo';
};
const thumbProgress = (status) => {
if (status === 'signing') this.statusText = 'Signing thumbnail upload';
if (status === 'uploading') this.statusText = 'Uploading thumbnail';
};
if (isMobileDevice) { if (isMobileDevice) {
// Mobile: sequential uploads to preserve bandwidth and memory // Mobile: sequential uploads to preserve bandwidth and memory
mainResult = await this.blossom.upload(mainData.blob, { mainResult = await this.blossom.upload(mainData.blob, {
sequential: true, sequential: true,
onProgress: mainProgress,
}); });
thumbResult = await this.blossom.upload(thumbData.blob, { thumbResult = await this.blossom.upload(thumbData.blob, {
sequential: true, sequential: true,
onProgress: thumbProgress,
}); });
} else { } else {
// Desktop: concurrent uploads // Desktop: concurrent uploads
const mainUploadPromise = this.blossom.upload(mainData.blob); const mainUploadPromise = this.blossom.upload(mainData.blob, {
const thumbUploadPromise = this.blossom.upload(thumbData.blob); onProgress: mainProgress,
});
const thumbUploadPromise = this.blossom.upload(thumbData.blob, {
onProgress: thumbProgress,
});
[mainResult, thumbResult] = await Promise.all([ [mainResult, thumbResult] = await Promise.all([
mainUploadPromise, mainUploadPromise,
@@ -127,6 +145,9 @@ export default class PlacePhotoUploadItem extends Component {
@color="white" @color="white"
class="spin-animation" class="spin-animation"
/> />
{{#if this.statusText}}
<span class="upload-status-text">{{this.statusText}}</span>
{{/if}}
</div> </div>
{{/if}} {{/if}}

View File

@@ -19,7 +19,6 @@ export default class PlacePhotoUpload extends Component {
@tracked file = null; @tracked file = null;
@tracked uploadedPhoto = null; @tracked uploadedPhoto = null;
@tracked status = '';
@tracked error = ''; @tracked error = '';
@tracked isPublishing = false; @tracked isPublishing = false;
@tracked isDragging = false; @tracked isDragging = false;
@@ -77,6 +76,9 @@ export default class PlacePhotoUpload extends Component {
} }
this.file = file; this.file = file;
this.uploadedPhoto = null; this.uploadedPhoto = null;
if (this.args.onUploadStateChange) {
this.args.onUploadStateChange(true);
}
} }
@action @action
@@ -91,6 +93,9 @@ export default class PlacePhotoUpload extends Component {
} }
this.file = null; this.file = null;
this.uploadedPhoto = null; this.uploadedPhoto = null;
if (this.args.onUploadStateChange) {
this.args.onUploadStateChange(false);
}
} }
deletePhotoTask = task(async (photoData) => { deletePhotoTask = task(async (photoData) => {
@@ -126,7 +131,6 @@ export default class PlacePhotoUpload extends Component {
return; return;
} }
this.status = 'Publishing event...';
this.error = ''; this.error = '';
this.isPublishing = true; this.isPublishing = true;
@@ -185,18 +189,20 @@ export default class PlacePhotoUpload extends Component {
this.nostrData.store.add(event); this.nostrData.store.add(event);
this.toast.show('Photo published successfully'); this.toast.show('Photo published successfully');
this.status = '';
// Clear out the file so user can upload more or be done // Clear out the file so user can upload more or be done
this.file = null; this.file = null;
this.uploadedPhoto = null; this.uploadedPhoto = null;
if (this.args.onUploadStateChange) {
this.args.onUploadStateChange(false);
}
if (this.args.onClose) { if (this.args.onClose) {
this.args.onClose(event.id); this.args.onClose(event.id);
} }
} catch (e) { } catch (e) {
this.error = 'Failed to publish: ' + e.message; this.error = 'Failed to publish: ' + e.message;
this.status = '';
} finally { } finally {
this.isPublishing = false; this.isPublishing = false;
} }
@@ -212,12 +218,6 @@ export default class PlacePhotoUpload extends Component {
</div> </div>
{{/if}} {{/if}}
{{#if this.status}}
<div class="alert alert-info">
{{this.status}}
</div>
{{/if}}
{{#if this.file}} {{#if this.file}}
<div class="photo-grid"> <div class="photo-grid">
<PlacePhotoUploadItem <PlacePhotoUploadItem

View File

@@ -116,7 +116,8 @@ export default class PlacePhotosCarousel extends Component {
{{#each this.photos as |photo|}} {{#each this.photos as |photo|}}
{{! template-lint-disable no-inline-styles }} {{! template-lint-disable no-inline-styles }}
<div <div
class="carousel-slide" class="carousel-slide
{{if photo.isLandscape 'landscape' 'portrait'}}"
style={{photo.style}} style={{photo.style}}
data-event-id={{photo.eventId}} data-event-id={{photo.eventId}}
> >

View File

@@ -60,10 +60,13 @@ export default class BlossomService extends Service {
return `Nostr ${base64url}`; return `Nostr ${base64url}`;
} }
async _uploadToServer(file, hash, serverUrl) { async _uploadToServer(file, hash, serverUrl, onProgress) {
const uploadUrl = getBlossomUrl(serverUrl, 'upload'); const uploadUrl = getBlossomUrl(serverUrl, 'upload');
if (onProgress) onProgress('signing');
const authHeader = await this._getAuthHeader('upload', hash, serverUrl); const authHeader = await this._getAuthHeader('upload', hash, serverUrl);
if (onProgress) onProgress('uploading');
// eslint-disable-next-line warp-drive/no-external-request-patterns // eslint-disable-next-line warp-drive/no-external-request-patterns
const response = await fetch(uploadUrl, { const response = await fetch(uploadUrl, {
method: 'PUT', method: 'PUT',
@@ -109,14 +112,20 @@ export default class BlossomService extends Service {
if (options.sequential) { if (options.sequential) {
// Sequential upload logic // Sequential upload logic
mainResult = await this._uploadToServer(file, payloadHash, mainServer); mainResult = await this._uploadToServer(
file,
payloadHash,
mainServer,
options.onProgress
);
for (const serverUrl of fallbackServers) { for (const serverUrl of fallbackServers) {
try { try {
const result = await this._uploadToServer( const result = await this._uploadToServer(
file, file,
payloadHash, payloadHash,
serverUrl serverUrl,
options.onProgress
); );
fallbackUrls.push(result.url); fallbackUrls.push(result.url);
} catch (error) { } catch (error) {
@@ -125,9 +134,14 @@ export default class BlossomService extends Service {
} }
} else { } else {
// Concurrent upload logic // Concurrent upload logic
const mainPromise = this._uploadToServer(file, payloadHash, mainServer); const mainPromise = this._uploadToServer(
file,
payloadHash,
mainServer,
options.onProgress
);
const fallbackPromises = fallbackServers.map((serverUrl) => const fallbackPromises = fallbackServers.map((serverUrl) =>
this._uploadToServer(file, payloadHash, serverUrl) this._uploadToServer(file, payloadHash, serverUrl, options.onProgress)
); );
// Main server MUST succeed // Main server MUST succeed

View File

@@ -2,7 +2,7 @@ import Service from '@ember/service';
import { RelayPool } from 'applesauce-relay'; import { RelayPool } from 'applesauce-relay';
export default class NostrRelayService extends Service { export default class NostrRelayService extends Service {
pool = new RelayPool(); pool = new RelayPool({ enablePing: true });
async publish(relays, event) { async publish(relays, event) {
if (!relays || relays.length === 0) { if (!relays || relays.length === 0) {

View File

@@ -285,10 +285,20 @@ body {
inset: 0; inset: 0;
background: rgb(0 0 0 / 60%); background: rgb(0 0 0 / 60%);
display: flex; display: flex;
flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
.upload-status-text {
color: white;
margin-top: 1rem;
font-size: 0.9rem;
text-shadow: 0 1px 3px rgb(0 0 0 / 80%);
text-align: center;
padding: 0 1rem;
}
.photo-upload-item .error-overlay { .photo-upload-item .error-overlay {
background: rgb(224 108 117 / 80%); background: rgb(224 108 117 / 80%);
cursor: pointer; cursor: pointer;
@@ -1006,10 +1016,17 @@ abbr[title] {
flex: 0 0 auto; flex: 0 0 auto;
height: 100px; height: 100px;
width: auto; width: auto;
aspect-ratio: var(--slide-ratio, 16 / 9);
scroll-snap-align: none; scroll-snap-align: none;
} }
.carousel-slide.landscape {
aspect-ratio: var(--slide-ratio, 16 / 9);
}
.carousel-slide.portrait {
aspect-ratio: 1 / 1;
}
.carousel-placeholder { .carousel-placeholder {
display: block; display: block;
background-color: var(--hover-bg); background-color: var(--hover-bg);
@@ -1798,6 +1815,12 @@ button.create-place {
top: 1rem; top: 1rem;
right: 1rem; right: 1rem;
cursor: pointer; cursor: pointer;
color: #898989;
}
.close-modal-btn.disabled {
color: #ccc;
cursor: not-allowed;
} }
.place-photo-upload h2 { .place-photo-upload h2 {
@@ -1816,11 +1839,6 @@ button.create-place {
color: #c00; color: #c00;
} }
.alert-info {
background: #eef;
color: #00c;
}
.preview-group { .preview-group {
margin-bottom: 1rem; margin-bottom: 1rem;
} }

View File

@@ -2,7 +2,7 @@
import activity from 'feather-icons/dist/icons/activity.svg?raw'; import activity from 'feather-icons/dist/icons/activity.svg?raw';
import arrowLeft from 'feather-icons/dist/icons/arrow-left.svg?raw'; import arrowLeft from 'feather-icons/dist/icons/arrow-left.svg?raw';
import bookmark from 'feather-icons/dist/icons/bookmark.svg?raw'; import bookmark from 'feather-icons/dist/icons/bookmark.svg?raw';
import camera from 'feather-icons/dist/icons/camera.svg?raw'; import featherCamera from 'feather-icons/dist/icons/camera.svg?raw';
import checkSquare from 'feather-icons/dist/icons/check-square.svg?raw'; import checkSquare from 'feather-icons/dist/icons/check-square.svg?raw';
import chevronLeft from 'feather-icons/dist/icons/chevron-left.svg?raw'; import chevronLeft from 'feather-icons/dist/icons/chevron-left.svg?raw';
import chevronRight from 'feather-icons/dist/icons/chevron-right.svg?raw'; import chevronRight from 'feather-icons/dist/icons/chevron-right.svg?raw';
@@ -45,7 +45,9 @@ import badgeShieldWithFire from '@waysidemapping/pinhead/dist/icons/badge_shield
import beachUmbrellaInGround from '@waysidemapping/pinhead/dist/icons/beach_umbrella_in_ground.svg?raw'; import beachUmbrellaInGround from '@waysidemapping/pinhead/dist/icons/beach_umbrella_in_ground.svg?raw';
import beerMugWithFoam from '@waysidemapping/pinhead/dist/icons/beer_mug_with_foam.svg?raw'; import beerMugWithFoam from '@waysidemapping/pinhead/dist/icons/beer_mug_with_foam.svg?raw';
import burgerAndDrinkCupWithStraw from '@waysidemapping/pinhead/dist/icons/burger_and_drink_cup_with_straw.svg?raw'; import burgerAndDrinkCupWithStraw from '@waysidemapping/pinhead/dist/icons/burger_and_drink_cup_with_straw.svg?raw';
import bridge from '@waysidemapping/pinhead/dist/icons/bridge.svg?raw';
import bus from '@waysidemapping/pinhead/dist/icons/bus.svg?raw'; import bus from '@waysidemapping/pinhead/dist/icons/bus.svg?raw';
import camera from '@waysidemapping/pinhead/dist/icons/camera.svg?raw';
import boxingGloveUp from '@waysidemapping/pinhead/dist/icons/boxing_glove_up.svg?raw'; import boxingGloveUp from '@waysidemapping/pinhead/dist/icons/boxing_glove_up.svg?raw';
import car from '@waysidemapping/pinhead/dist/icons/car.svg?raw'; import car from '@waysidemapping/pinhead/dist/icons/car.svg?raw';
import cigaretteWithSmokeCurl from '@waysidemapping/pinhead/dist/icons/cigarette_with_smoke_curl.svg?raw'; import cigaretteWithSmokeCurl from '@waysidemapping/pinhead/dist/icons/cigarette_with_smoke_curl.svg?raw';
@@ -76,6 +78,7 @@ import gravestone from '@waysidemapping/pinhead/dist/icons/gravestone.svg?raw';
import grecianVase from '@waysidemapping/pinhead/dist/icons/grecian_vase.svg?raw'; import grecianVase from '@waysidemapping/pinhead/dist/icons/grecian_vase.svg?raw';
import greekCross from '@waysidemapping/pinhead/dist/icons/greek_cross.svg?raw'; import greekCross from '@waysidemapping/pinhead/dist/icons/greek_cross.svg?raw';
import iceCreamOnCone from '@waysidemapping/pinhead/dist/icons/ice_cream_on_cone.svg?raw'; import iceCreamOnCone from '@waysidemapping/pinhead/dist/icons/ice_cream_on_cone.svg?raw';
import industrialBuilding from '@waysidemapping/pinhead/dist/icons/industrial_building.svg?raw';
import jewel from '@waysidemapping/pinhead/dist/icons/jewel.svg?raw'; import jewel from '@waysidemapping/pinhead/dist/icons/jewel.svg?raw';
import lowriseBuilding from '@waysidemapping/pinhead/dist/icons/lowrise_building.svg?raw'; import lowriseBuilding from '@waysidemapping/pinhead/dist/icons/lowrise_building.svg?raw';
import marketStall from '@waysidemapping/pinhead/dist/icons/market_stall.svg?raw'; import marketStall from '@waysidemapping/pinhead/dist/icons/market_stall.svg?raw';
@@ -103,6 +106,7 @@ import roundStructureWithFlag from '@waysidemapping/pinhead/dist/icons/round_str
import sailingShipInWater from '@waysidemapping/pinhead/dist/icons/sailing_ship_in_water.svg?raw'; import sailingShipInWater from '@waysidemapping/pinhead/dist/icons/sailing_ship_in_water.svg?raw';
import scissorsOpen from '@waysidemapping/pinhead/dist/icons/scissors_open.svg?raw'; import scissorsOpen from '@waysidemapping/pinhead/dist/icons/scissors_open.svg?raw';
import shipwreckInWater from '@waysidemapping/pinhead/dist/icons/shipwreck_in_water.svg?raw'; import shipwreckInWater from '@waysidemapping/pinhead/dist/icons/shipwreck_in_water.svg?raw';
import steamTrainOnRailwayTrack from '@waysidemapping/pinhead/dist/icons/steam_train_on_railway_track.svg?raw';
import shoppingBag from '@waysidemapping/pinhead/dist/icons/shopping_bag.svg?raw'; import shoppingBag from '@waysidemapping/pinhead/dist/icons/shopping_bag.svg?raw';
import shoppingBasket from '@waysidemapping/pinhead/dist/icons/shopping_basket.svg?raw'; import shoppingBasket from '@waysidemapping/pinhead/dist/icons/shopping_basket.svg?raw';
import shoppingCart from '@waysidemapping/pinhead/dist/icons/shopping_cart.svg?raw'; import shoppingCart from '@waysidemapping/pinhead/dist/icons/shopping_cart.svg?raw';
@@ -132,8 +136,10 @@ const ICONS = {
bookmark, bookmark,
'boxing-glove-up': boxingGloveUp, 'boxing-glove-up': boxingGloveUp,
'burger-and-drink-cup-with-straw': burgerAndDrinkCupWithStraw, 'burger-and-drink-cup-with-straw': burgerAndDrinkCupWithStraw,
bridge,
bus, bus,
camera, camera,
'feather-camera': featherCamera,
'check-square': checkSquare, 'check-square': checkSquare,
'chevron-left': chevronLeft, 'chevron-left': chevronLeft,
'chevron-right': chevronRight, 'chevron-right': chevronRight,
@@ -176,6 +182,7 @@ const ICONS = {
heart, heart,
home, home,
'ice-cream-on-cone': iceCreamOnCone, 'ice-cream-on-cone': iceCreamOnCone,
'industrial-building': industrialBuilding,
info, info,
instagram, instagram,
jewel, jewel,
@@ -216,6 +223,7 @@ const ICONS = {
'sailing-ship-in-water': sailingShipInWater, 'sailing-ship-in-water': sailingShipInWater,
'scissors-open': scissorsOpen, 'scissors-open': scissorsOpen,
'shipwreck-in-water': shipwreckInWater, 'shipwreck-in-water': shipwreckInWater,
'steam-train-on-railway-track': steamTrainOnRailwayTrack,
'shopping-bag': shoppingBag, 'shopping-bag': shoppingBag,
search, search,
server, server,

View File

@@ -109,6 +109,7 @@ export const POI_ICON_RULES = [
{ tags: { amenity: 'arts_center' }, icon: 'comedy-mask-and-tragedy-mask' }, { tags: { amenity: 'arts_center' }, icon: 'comedy-mask-and-tragedy-mask' },
// Historic // Historic
{ tags: { historic: 'bridge' }, icon: 'bridge' },
{ tags: { historic: 'fort' }, icon: 'fort' }, { tags: { historic: 'fort' }, icon: 'fort' },
{ tags: { historic: 'castle' }, icon: 'palace' }, { tags: { historic: 'castle' }, icon: 'palace' },
{ tags: { historic: 'building' }, icon: 'classical-building-with-flag' }, { tags: { historic: 'building' }, icon: 'classical-building-with-flag' },
@@ -119,6 +120,12 @@ export const POI_ICON_RULES = [
tags: { historic: 'monument' }, tags: { historic: 'monument' },
icon: 'classical-building-with-dome-and-flag', icon: 'classical-building-with-dome-and-flag',
}, },
{ tags: { historic: 'folly' }, icon: 'classical-building' },
{ tags: { historic: 'industrial' }, icon: 'industrial-building' },
{
tags: { historic: 'railway_station' },
icon: 'steam-train-on-railway-track',
},
{ tags: { historic: 'ship' }, icon: 'sailing-ship-in-water' }, { tags: { historic: 'ship' }, icon: 'sailing-ship-in-water' },
{ tags: { historic: 'wreck' }, icon: 'shipwreck-in-water' }, { tags: { historic: 'wreck' }, icon: 'shipwreck-in-water' },
{ tags: { historic: 'ruins' }, icon: 'camera' }, { tags: { historic: 'ruins' }, icon: 'camera' },

View File

@@ -41,7 +41,7 @@ export const POI_CATEGORIES = [
{ {
id: 'things-to-do', id: 'things-to-do',
label: 'Things to do', label: 'Things to do',
icon: 'camera', icon: 'feather-camera',
filter: [ filter: [
'["tourism"~"^(museum|gallery|attraction|viewpoint|zoo|theme_park|aquarium|artwork)$"]', '["tourism"~"^(museum|gallery|attraction|viewpoint|zoo|theme_park|aquarium|artwork)$"]',
'["amenity"~"^(cinema|theatre|arts_centre|planetarium)$"]', '["amenity"~"^(cinema|theatre|arts_centre|planetarium)$"]',

View File

@@ -1,6 +1,6 @@
{ {
"name": "marco", "name": "marco",
"version": "1.20.1", "version": "1.20.5",
"private": true, "private": true,
"description": "Unhosted maps app", "description": "Unhosted maps app",
"repository": { "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

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-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-CGySSjv6.js"></script> <script type="module" crossorigin src="/assets/main-Dhq0XoTm.js"></script>
<link rel="stylesheet" crossorigin href="/assets/main-BA3LWr76.css"> <link rel="stylesheet" crossorigin href="/assets/main-CHuW_yI-.css">
</head> </head>
<body> <body>
</body> </body>