Fix modal backdrop blur by applying filter on the overlay itself.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-08-08 18:21:43 +03:30
co-authored by Cursor
parent e6670ed06f
commit 656fc57494
14 changed files with 33 additions and 164 deletions
@@ -1,8 +1,9 @@
.overlay { .overlay {
position: fixed; position: fixed;
inset: 0; inset: 0;
isolation: isolate; background: var(--modal-overlay-bg);
background: transparent; backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -10,19 +11,6 @@
padding: 20px; padding: 20px;
} }
/* Tint + blur on ::before so opacity animations on .overlay cannot disable backdrop-filter. */
.overlay::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
pointer-events: none;
background: var(--modal-overlay-bg);
backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
}
.modal { .modal {
width: 100%; width: 100%;
max-width: 520px; max-width: 520px;
@@ -1,8 +1,9 @@
.overlay { .overlay {
position: fixed; position: fixed;
inset: 0; inset: 0;
isolation: isolate; background: var(--modal-overlay-bg);
background: transparent; backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -10,19 +11,6 @@
padding: 20px; padding: 20px;
} }
/* Tint + blur on ::before so opacity animations on .overlay cannot disable backdrop-filter. */
.overlay::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
pointer-events: none;
background: var(--modal-overlay-bg);
backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
}
.modal { .modal {
width: 100%; width: 100%;
max-width: 480px; max-width: 480px;
@@ -1,8 +1,9 @@
.overlay { .overlay {
position: fixed; position: fixed;
inset: 0; inset: 0;
isolation: isolate; background: var(--modal-overlay-bg);
background: transparent; backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -10,19 +11,6 @@
padding: 20px; padding: 20px;
} }
/* Tint + blur on ::before so opacity animations on .overlay cannot disable backdrop-filter. */
.overlay::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
pointer-events: none;
background: var(--modal-overlay-bg);
backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
}
.modal { .modal {
position: relative; position: relative;
width: 100%; width: 100%;
@@ -1,8 +1,9 @@
.overlay { .overlay {
position: fixed; position: fixed;
inset: 0; inset: 0;
isolation: isolate; background: rgba(127, 29, 29, 0.28);
background: transparent; backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -10,19 +11,6 @@
padding: 20px; padding: 20px;
} }
/* Tint + blur on ::before so opacity animations on .overlay cannot disable backdrop-filter. */
.overlay::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
pointer-events: none;
background: rgba(127, 29, 29, 0.28);
backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
}
.modal { .modal {
position: relative; position: relative;
width: 100%; width: 100%;
@@ -1,7 +1,6 @@
.overlay { .overlay {
position: fixed; position: fixed;
inset: 0; inset: 0;
isolation: isolate;
z-index: 300; z-index: 300;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -9,21 +8,11 @@
justify-content: center; justify-content: center;
gap: 16px; gap: 16px;
padding: 24px; padding: 24px;
background: transparent;
}
.overlay::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
pointer-events: none;
background: rgba(15, 23, 42, 0.82); background: rgba(15, 23, 42, 0.82);
backdrop-filter: blur(var(--modal-overlay-blur)); backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur)); -webkit-backdrop-filter: blur(var(--modal-overlay-blur));
} }
.closeBtn { .closeBtn {
position: absolute; position: absolute;
top: 20px; top: 20px;
@@ -1,8 +1,9 @@
.overlay { .overlay {
position: fixed; position: fixed;
inset: 0; inset: 0;
isolation: isolate; background: var(--modal-overlay-bg);
background: transparent; backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -10,19 +11,6 @@
padding: 20px; padding: 20px;
} }
/* Tint + blur on ::before so opacity animations on .overlay cannot disable backdrop-filter. */
.overlay::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
pointer-events: none;
background: var(--modal-overlay-bg);
backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
}
.modal { .modal {
width: 100%; width: 100%;
max-width: 640px; max-width: 640px;
@@ -1,8 +1,9 @@
.overlay { .overlay {
position: fixed; position: fixed;
inset: 0; inset: 0;
isolation: isolate; background: var(--modal-overlay-bg);
background: transparent; backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -10,19 +11,6 @@
padding: 20px; padding: 20px;
} }
/* Tint + blur on ::before so opacity animations on .overlay cannot disable backdrop-filter. */
.overlay::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
pointer-events: none;
background: var(--modal-overlay-bg);
backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
}
.overlayNested { .overlayNested {
z-index: 1010; z-index: 1010;
} }
+1 -1
View File
@@ -25,7 +25,7 @@
--glass-shadow: 0 8px 32px rgba(31, 38, 135, 0.08); --glass-shadow: 0 8px 32px rgba(31, 38, 135, 0.08);
--blur-glass: 28px; --blur-glass: 28px;
--modal-overlay-bg: rgba(15, 23, 42, 0.4); --modal-overlay-bg: rgba(15, 23, 42, 0.4);
--modal-overlay-blur: 12px; --modal-overlay-blur: 16px;
--text-primary: #1e293b; --text-primary: #1e293b;
--text-secondary: #64748b; --text-secondary: #64748b;
--text-muted: #94a3b8; --text-muted: #94a3b8;
@@ -1,8 +1,9 @@
.overlay { .overlay {
position: fixed; position: fixed;
inset: 0; inset: 0;
isolation: isolate; background: var(--modal-overlay-bg);
background: transparent; backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -10,19 +11,6 @@
padding: 20px; padding: 20px;
} }
/* Tint + blur on ::before so opacity animations on .overlay cannot disable backdrop-filter. */
.overlay::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
pointer-events: none;
background: var(--modal-overlay-bg);
backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
}
.overlayNested { .overlayNested {
z-index: 210; z-index: 210;
} }
@@ -1,8 +1,9 @@
.overlay { .overlay {
position: fixed; position: fixed;
inset: 0; inset: 0;
isolation: isolate; background: rgba(127, 29, 29, 0.28);
background: transparent; backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -10,19 +11,6 @@
padding: 20px; padding: 20px;
} }
/* Tint + blur on ::before so opacity animations on .overlay cannot disable backdrop-filter. */
.overlay::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
pointer-events: none;
background: rgba(127, 29, 29, 0.28);
backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
}
.modal { .modal {
position: relative; position: relative;
width: 100%; width: 100%;
@@ -1,8 +1,9 @@
.overlay { .overlay {
position: fixed; position: fixed;
inset: 0; inset: 0;
isolation: isolate; background: var(--modal-overlay-bg);
background: transparent; backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -10,19 +11,6 @@
padding: 20px; padding: 20px;
} }
/* Tint + blur on ::before so opacity animations on .overlay cannot disable backdrop-filter. */
.overlay::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
pointer-events: none;
background: var(--modal-overlay-bg);
backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
}
.modal { .modal {
width: 100%; width: 100%;
max-width: 520px; max-width: 520px;
+1 -1
View File
@@ -30,7 +30,7 @@
--radius-sm: 12px; --radius-sm: 12px;
--blur-glass: 28px; --blur-glass: 28px;
--modal-overlay-bg: rgba(15, 23, 42, 0.4); --modal-overlay-bg: rgba(15, 23, 42, 0.4);
--modal-overlay-blur: 12px; --modal-overlay-blur: 16px;
--select-arrow-size: 16px; --select-arrow-size: 16px;
--select-arrow-offset: 12px; --select-arrow-offset: 12px;
--select-padding-end: 2.5rem; --select-padding-end: 2.5rem;
@@ -25,7 +25,7 @@
--glass-shadow: 0 8px 32px rgba(31, 38, 135, 0.08); --glass-shadow: 0 8px 32px rgba(31, 38, 135, 0.08);
--blur-glass: 28px; --blur-glass: 28px;
--modal-overlay-bg: rgba(15, 23, 42, 0.4); --modal-overlay-bg: rgba(15, 23, 42, 0.4);
--modal-overlay-blur: 12px; --modal-overlay-blur: 16px;
--text-primary: #1e293b; --text-primary: #1e293b;
--text-secondary: #64748b; --text-secondary: #64748b;
--text-muted: #94a3b8; --text-muted: #94a3b8;
@@ -1,8 +1,9 @@
.overlay { .overlay {
position: fixed; position: fixed;
inset: 0; inset: 0;
isolation: isolate; background: var(--modal-overlay-bg);
background: transparent; backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -10,19 +11,6 @@
padding: 20px; padding: 20px;
} }
/* Tint + blur on ::before so opacity animations on .overlay cannot disable backdrop-filter. */
.overlay::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
pointer-events: none;
background: var(--modal-overlay-bg);
backdrop-filter: blur(var(--modal-overlay-blur));
-webkit-backdrop-filter: blur(var(--modal-overlay-blur));
}
.modal { .modal {
position: relative; position: relative;
width: 100%; width: 100%;