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 @@ + + + + + diff --git a/src/components/maps/MapOverlay.astro b/src/components/maps/MapOverlay.astro index ff0fd53d..10f7b10a 100644 --- a/src/components/maps/MapOverlay.astro +++ b/src/components/maps/MapOverlay.astro @@ -8,6 +8,7 @@ import SearchMarkers from "./overlay/SearchMarkers.vue"; import LangSwitcher from "./overlay/LangSwitcher.vue"; import MapOverlayBreadcrumbs from "./MapOverlayBreadcrumbs.astro"; import ToastService from "./overlay/ToastService.vue"; +import ThemeSwitch from "../global/ThemeSwitch.vue"; interface Props extends MapOverlayProps {} @@ -41,9 +42,14 @@ const currentUrl = Astro.url } - {ENABLE_I18N && - - } + +
+ {ENABLE_I18N && + + } + + +
{ENABLE_BREADCRUMB && @@ -71,5 +77,15 @@ const currentUrl = Astro.url align-items: top; gap: 1rem; } + + .right-menu { + display: grid; + gap: .5rem; + align-content: flex-start; + + @media screen and (width >= 900px) { + display: flex; + } + } } diff --git a/src/components/maps/MapOverlayBreadcrumbs.astro b/src/components/maps/MapOverlayBreadcrumbs.astro index d4cea186..873e7676 100644 --- a/src/components/maps/MapOverlayBreadcrumbs.astro +++ b/src/components/maps/MapOverlayBreadcrumbs.astro @@ -54,6 +54,9 @@ menu { border-radius: 100vmax; box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 12px; pointer-events: all; + transition-property: color, background-color, border-color, outline-color; + transition-duration: .15s; + transition-timing-function: var(--timing-function); li { display: flex; diff --git a/src/components/maps/overlay/SearchMarkers.vue b/src/components/maps/overlay/SearchMarkers.vue index 23468c9c..13609c78 100644 --- a/src/components/maps/overlay/SearchMarkers.vue +++ b/src/components/maps/overlay/SearchMarkers.vue @@ -314,6 +314,9 @@ function resetAllFields(actionAfter?: "focusAfter") { border-radius: 25px; box-shadow: var(--shadow); pointer-events: all; + transition-property: color, background-color, border-color, outline-color; + transition-duration: .15s; + transition-timing-function: var(--timing-function); @media screen and (width >= 900px) { width: clamp(25rem, 35dvw, 30rem); diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index 30777892..2286a402 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -58,7 +58,55 @@ const lang = getLangFromUrl(Astro.url) || defaultLang; - + + +