diff --git a/frontend/index.html b/frontend/index.html
index ccaf55e420..26faa92d45 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -44,6 +44,11 @@
border: 4px solid #eee;
border-color: #eee transparent #eee transparent;
animation: spinning-loading-indicator 1s linear infinite;
+ @media (prefers-reduced-motion) {
+ animation: none;
+ content: "Loading…";
+ border: none;
+ }
}
@keyframes spinning-loading-indicator {
diff --git a/frontend/src/components/floating-menus/ColorPicker.svelte b/frontend/src/components/floating-menus/ColorPicker.svelte
index 7e221eac7b..b132acfa81 100644
--- a/frontend/src/components/floating-menus/ColorPicker.svelte
+++ b/frontend/src/components/floating-menus/ColorPicker.svelte
@@ -962,6 +962,10 @@
// We don't use the CSS `filter: grayscale(1);` property because it produces overly dark tones for bright colors with a noticeable jump on hover.
background: var(--pure-color-gray);
transition: background-color 0.1s;
+
+ @media (prefers-reduced-motion) {
+ transition: none;
+ }
}
&:hover div {
@@ -976,6 +980,10 @@
&.disabled .details .choice-preview {
transition: opacity 0.1s;
+ @media (prefers-reduced-motion) {
+ transition: none;
+ }
+
&:hover {
opacity: 0.5;
}
diff --git a/frontend/src/components/panels/Document.svelte b/frontend/src/components/panels/Document.svelte
index 3f679690b2..31a1b8ff6c 100644
--- a/frontend/src/components/panels/Document.svelte
+++ b/frontend/src/components/panels/Document.svelte
@@ -702,6 +702,10 @@
opacity: 0.25;
transition: opacity 0.1s;
+ @media (prefers-reduced-motion) {
+ transition: none;
+ }
+
&:hover {
opacity: 1;
}
@@ -853,6 +857,10 @@
transition: opacity 0.2s;
opacity: 0;
+ @media (prefers-reduced-motion) {
+ transition: none;
+ }
+
&.open {
cursor: auto;
pointer-events: auto;
diff --git a/frontend/src/components/views/Graph.svelte b/frontend/src/components/views/Graph.svelte
index 99c509c4e1..f7bde0cabe 100644
--- a/frontend/src/components/views/Graph.svelte
+++ b/frontend/src/components/views/Graph.svelte
@@ -846,6 +846,10 @@
opacity: 0.5;
transform: translateY(-100%);
+ @media (prefers-reduced-motion) {
+ transition: none;
+ }
+
// Tail
&::after {
content: "";
diff --git a/frontend/src/components/widgets/inputs/NumberInput.svelte b/frontend/src/components/widgets/inputs/NumberInput.svelte
index 3b70934525..51d0836053 100644
--- a/frontend/src/components/widgets/inputs/NumberInput.svelte
+++ b/frontend/src/components/widgets/inputs/NumberInput.svelte
@@ -283,6 +283,9 @@
clearTimeout(repeatTimeout);
}
+ // The widget might be destroyed, in which case it would be very bad to keep sending events pointing at the wrong index.
+ onDestroy(onIncrementPointerUp);
+
function incrementPressAbort(e: KeyboardEvent | MouseEvent) {
// Only abort if the user right clicks or presses Escape
if (e instanceof KeyboardEvent && e.key !== "Escape") return;
diff --git a/frontend/src/components/widgets/inputs/SpectrumInput.svelte b/frontend/src/components/widgets/inputs/SpectrumInput.svelte
index 6611614c5d..528979baf4 100644
--- a/frontend/src/components/widgets/inputs/SpectrumInput.svelte
+++ b/frontend/src/components/widgets/inputs/SpectrumInput.svelte
@@ -303,6 +303,10 @@
&.disabled .gradient-strip {
transition: opacity 0.1s;
+ @media (prefers-reduced-motion) {
+ transition: none;
+ }
+
&:hover {
opacity: 0.5;
}