From 4cf2f66d42f88737e1555621998b3fb1640e719f Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Sun, 4 May 2025 18:33:42 +0200 Subject: [PATCH] Added copy coords function --- src/assets/scss/radix/_toast.scss | 18 +++++++--- src/components/maps/Map.astro | 15 +++++++- src/components/maps/overlay/MarkerCreator.vue | 28 +++++++++++++-- src/components/maps/overlay/ToastService.vue | 35 ++++++++++++++++--- src/components/maps/overlay/useToast.ts | 5 +-- src/i18n/ui.ts | 8 +++-- 6 files changed, 93 insertions(+), 16 deletions(-) diff --git a/src/assets/scss/radix/_toast.scss b/src/assets/scss/radix/_toast.scss index b336651e..2f251a9a 100644 --- a/src/assets/scss/radix/_toast.scss +++ b/src/assets/scss/radix/_toast.scss @@ -2,12 +2,12 @@ --viewport-padding: 25px; position: fixed; bottom: 0; - right: 0; + right: 2rem; display: flex; flex-direction: column; padding: var(--viewport-padding); gap: 10px; - width: 390px; + width: 480px; max-width: 100vw; margin: 0; list-style: none; @@ -16,15 +16,23 @@ } .toast-root { - background-color: white; - border-radius: 6px; - box-shadow: hsl(206 22% 7% / 35%) 0px 10px 38px -10px, hsl(206 22% 7% / 20%) 0px 10px 20px -15px; padding: 15px; display: grid; grid-template-areas: 'title action' 'description action'; grid-template-columns: auto max-content; column-gap: 15px; align-items: center; + color: var(--slate-800); + border: 1px solid var(--slate-400); + background-color: var(--white); + border-radius: 6px; + box-shadow: hsl(206 22% 7% / 35%) 0px 10px 38px -10px, hsl(206 22% 7% / 20%) 0px 10px 20px -15px; + + &.toast-success { + color: var(--green-700); + border: 1px solid var(--green-700); + background-color: color-mix(in srgb, var(--green-500) 17.5%, var(--white)); + } } .toast-root[data-state='open'] { animation: slideIn 150ms cubic-bezier(0.16, 1, 0.3, 1); diff --git a/src/components/maps/Map.astro b/src/components/maps/Map.astro index 19619e5a..023ce4c0 100644 --- a/src/components/maps/Map.astro +++ b/src/components/maps/Map.astro @@ -602,6 +602,19 @@ map.on('moveend', () => { setupToURL() }) +/** + * Listener for querying a copy of the current coordinates + */ +window.addEventListener('on-copy-coords', () => { + const lon = convertScaleToX(Number(localStorage.getItem('lastHeldXPosition'))) + const lat = convertScaleToY(Number(localStorage.getItem('lastHeldYPosition'))) + const coordsText = JSON.stringify({ x: lon, y: lat }) + + navigator.clipboard.writeText(coordsText) + + window.dispatchEvent(new CustomEvent('on-toast-push', { bubbles: true, detail: { preset: 'copied-coords' }})) +}) + /** * UTILITIES */ @@ -609,7 +622,7 @@ map.on('moveend', () => { * Convert x coords to scale with ratio, zoom and offset * @param {number} x */ - function convertXToScale(x) { +function convertXToScale(x) { return (x * xRatio * zoomRatio) + xOffset } /** diff --git a/src/components/maps/overlay/MarkerCreator.vue b/src/components/maps/overlay/MarkerCreator.vue index bfa38761..9130baac 100644 --- a/src/components/maps/overlay/MarkerCreator.vue +++ b/src/components/maps/overlay/MarkerCreator.vue @@ -36,6 +36,7 @@ function switchMenuMode(newMode: MenuMode) { onMounted(() => { const mapRef = document.getElementById('world') + if (mapRef) { mapRef.addEventListener('contextmenu', handleContextMenu) mapRef.addEventListener('mousedown', hideMenu) @@ -188,6 +189,11 @@ function hideMarkerModal() { function setTitleError(error: Error | null) { markerTitleInputError.value = error } + +function handleCoordsCopy() { + markerMenu.value?.dispatchEvent(new CustomEvent('on-copy-coords', { bubbles: true })) + hideMenu() +}