From 712d4087367b866743bde21a54c014b6d87c0b5d Mon Sep 17 00:00:00 2001
From: Alexis <35.alexis.pele@gmail.com>
Date: Sat, 21 Jun 2025 21:33:25 +0200
Subject: [PATCH] Added theme switcher
---
src/assets/scss/_animations.scss | 2 +-
src/assets/scss/_buttons.scss | 6 +--
src/assets/scss/_forms.scss | 2 +-
src/assets/scss/_leaflet.scss | 14 +++++-
src/assets/scss/radix/_dialog.scss | 4 +-
src/assets/scss/radix/_toast.scss | 8 +--
src/assets/scss/theme.scss | 1 +
src/components/global/ThemeSwitch.vue | 30 +++++++++++
src/components/maps/MapOverlay.astro | 22 ++++++--
.../maps/MapOverlayBreadcrumbs.astro | 3 ++
src/components/maps/overlay/SearchMarkers.vue | 3 ++
src/layouts/Layout.astro | 50 ++++++++++++++++++-
12 files changed, 129 insertions(+), 16 deletions(-)
create mode 100644 src/components/global/ThemeSwitch.vue
diff --git a/src/assets/scss/_animations.scss b/src/assets/scss/_animations.scss
index 47034ccd..48d97b9c 100644
--- a/src/assets/scss/_animations.scss
+++ b/src/assets/scss/_animations.scss
@@ -1,7 +1,7 @@
// Animations on load
@media screen and (prefers-reduced-motion: no-preference) {
.appear-from-top {
- animation: fadeIn .2s cubic-bezier(0.785, 0.135, 0.15, 0.86);
+ animation: fadeIn .2s var(--timing-function);
}
@keyframes fadeIn {
diff --git a/src/assets/scss/_buttons.scss b/src/assets/scss/_buttons.scss
index 60f71070..29ec4c25 100644
--- a/src/assets/scss/_buttons.scss
+++ b/src/assets/scss/_buttons.scss
@@ -11,7 +11,7 @@
cursor: pointer;
transition-property: color, background-color, border-color;
transition-duration: .2s;
- transition-timing-function: cubic-bezier(0.785, 0.135, 0.15, 0.86);
+ transition-timing-function: var(--timing-function);
&:disabled {
cursor: not-allowed;
@@ -95,14 +95,14 @@
outline: .2rem solid transparent;
transition-property: color, background-color, border-color, outline-color;
transition-duration: .15s;
- transition-timing-function: cubic-bezier(0.445, 0.05, 0.55, 0.95);
+ transition-timing-function: var(--timing-function);
svg {
fill: var(--foreground);
width: 1.15em;
transition-property: fill;
transition-duration: .15s;
- transition-timing-function: cubic-bezier(0.445, 0.05, 0.55, 0.95);
+ transition-timing-function: var(--timing-function);
}
&:hover,
diff --git a/src/assets/scss/_forms.scss b/src/assets/scss/_forms.scss
index 3b35fabd..f60df6a8 100644
--- a/src/assets/scss/_forms.scss
+++ b/src/assets/scss/_forms.scss
@@ -19,7 +19,7 @@
border-radius: var(--border-radius);
transition-property: box-shadow;
transition-duration: .2s;
- transition-timing-function: cubic-bezier(0.785, 0.135, 0.15, 0.86);
+ transition-timing-function: var(--timing-function);
&:focus-visible {
box-shadow: 0 0 0 .2rem color-mix(in srgb, var(--accent) 20%, transparent);
diff --git a/src/assets/scss/_leaflet.scss b/src/assets/scss/_leaflet.scss
index a6c84ff5..827f60e5 100644
--- a/src/assets/scss/_leaflet.scss
+++ b/src/assets/scss/_leaflet.scss
@@ -39,8 +39,11 @@
box-shadow: none;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
+ transition-property: color, text-shadow;
+ transition-duration: .15s;
+ transition-timing-function: var(--timing-function);
- @include text.stroke(2, color-mix(in srgb, var(--foreground) 10%, var(--background)));
+ @include text.stroke(2, var(--background));
&::before {
display: none;
@@ -59,6 +62,9 @@
color: var(--foreground);
background-color: var(--background);
border-color: var(--border);
+ transition-property: color, background-color, border-color, outline-color;
+ transition-duration: .15s;
+ transition-timing-function: var(--timing-function);
&:hover,
&:focus-visible {
@@ -71,6 +77,9 @@
.leaflet-touch .leaflet-control-measure {
color: var(--foreground);
background-color: var(--background);
+ transition-property: color, background-color, border-color, outline-color;
+ transition-duration: .15s;
+ transition-timing-function: var(--timing-function);
.leaflet-control-measure-toggle {
color: var(--foreground);
@@ -78,6 +87,9 @@
border-color: var(--border);
background-image: url('/icon/ruler.svg');
background-size: 66%;
+ transition-property: color, background-color, border-color, outline-color;
+ transition-duration: .15s;
+ transition-timing-function: var(--timing-function);
&:hover,
&:focus-visible {
diff --git a/src/assets/scss/radix/_dialog.scss b/src/assets/scss/radix/_dialog.scss
index 72685cef..b1850f88 100644
--- a/src/assets/scss/radix/_dialog.scss
+++ b/src/assets/scss/radix/_dialog.scss
@@ -2,7 +2,7 @@
background-color: color-mix(in srgb, var(--black) 50%, transparent);
position: fixed;
inset: 0;
- animation: show-overlay 150ms cubic-bezier(0.16, 1, 0.3, 1);
+ animation: show-overlay 150ms var(--timing-function);
z-index: 100;
}
@@ -24,7 +24,7 @@
background-color: var(--background);
border: 1px solid var(--border);
box-shadow: var(--shadow);
- animation: show-content 150ms cubic-bezier(0.16, 1, 0.3, 1);
+ animation: show-content 150ms var(--timing-function);
&:focus {
outline: none;
diff --git a/src/assets/scss/radix/_toast.scss b/src/assets/scss/radix/_toast.scss
index 1da154ce..09e3a61c 100644
--- a/src/assets/scss/radix/_toast.scss
+++ b/src/assets/scss/radix/_toast.scss
@@ -51,20 +51,20 @@
}
}
.toast-root[data-state='open'] {
- animation: slideIn 150ms cubic-bezier(0.16, 1, 0.3, 1);
+ animation: slideIn 150ms var(--timing-function);
}
.toast-root[data-state='closed'] {
- animation: hide 100ms ease-in;
+ animation: hide 100ms var(--timing-function);
}
.toast-root[data-swipe='move'] {
transform: translateX(var(--radix-toast-swipe-move-x));
}
.toast-root[data-swipe='cancel'] {
transform: translateX(0);
- transition: transform 200ms ease-out;
+ transition: transform 200ms var(--timing-function);
}
.toast-root[data-swipe='end'] {
- animation: swipeOut 100ms ease-out;
+ animation: swipeOut 100ms var(--timing-function);
}
@keyframes hide {
diff --git a/src/assets/scss/theme.scss b/src/assets/scss/theme.scss
index 6daabb57..efbd02c6 100644
--- a/src/assets/scss/theme.scss
+++ b/src/assets/scss/theme.scss
@@ -45,6 +45,7 @@
--border-radius: .25rem;
--shadow: color-mix(in srgb, var(--foreground) 10%, transparent) 0px 4px 12px;
+ --timing-function: cubic-bezier(0.785, 0.135, 0.15, 0.86);
}
.dark {
diff --git a/src/components/global/ThemeSwitch.vue b/src/components/global/ThemeSwitch.vue
new file mode 100644
index 00000000..14cb80c3
--- /dev/null
+++ b/src/components/global/ThemeSwitch.vue
@@ -0,0 +1,30 @@
+
+
+
+