Skip to content

Commit ece0508

Browse files
[codex] Fix glass hover compositing artifacts (pingdotgg#4446)
Co-authored-by: codex <codex@users.noreply.github.com>
1 parent a7ee309 commit ece0508

6 files changed

Lines changed: 29 additions & 11 deletions

File tree

apps/web/src/components/SidebarV2.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import {
1818
AlarmClockOffIcon,
1919
CheckIcon,
2020
ChevronDownIcon,
21-
ChevronRightIcon,
2221
CircleAlertIcon,
2322
CircleCheckIcon,
2423
CircleDashedIcon,
@@ -240,7 +239,11 @@ function SidebarV2ThreadTooltip({
240239
side="right"
241240
align="start"
242241
sideOffset={8}
243-
className="dropdown-glass max-w-80 border-0! bg-[color-mix(in_srgb,var(--background)_var(--glass-opacity),transparent)] text-left whitespace-normal shadow-lg/10 before:hidden dark:shadow-none"
242+
className="dropdown-glass max-w-80 border-0! text-left whitespace-normal shadow-lg/10 before:hidden dark:shadow-none"
243+
style={{
244+
background:
245+
"color-mix(in srgb, var(--popover) 18%, color-mix(in srgb, var(--popover) var(--glass-opacity), transparent))",
246+
}}
244247
>
245248
<div className="flex max-w-80 flex-col gap-2 p-2">
246249
<div className="whitespace-nowrap text-sm font-medium text-foreground">{thread.title}</div>
@@ -652,7 +655,6 @@ const SidebarV2Row = memo(function SidebarV2Row(props: {
652655
// content; surface is reserved for interaction (hover, multi-select, route).
653656
const rowSurfaceClassName = cn(
654657
"group/v2-row relative w-full cursor-pointer overflow-hidden rounded-md text-left outline-none select-none",
655-
variant === "card" && "backdrop-blur-[16px]",
656658
props.isActive
657659
? "bg-sidebar-row-active text-sidebar-foreground"
658660
: isSelected

apps/web/src/components/chat/ModelListRow.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export const ModelListRow = memo(function ModelListRow(props: {
5151
contentClassName="flex w-full items-center gap-3"
5252
className={cn(
5353
"group relative w-full !min-w-0 max-w-full cursor-pointer rounded-md px-2 py-2.5 transition-[background-color,box-shadow,color]",
54-
"data-highlighted:bg-muted/56 data-selected:bg-foreground/[0.08] data-selected:text-foreground data-selected:ring-0",
54+
"hover:bg-[color-mix(in_srgb,var(--popover)_90%,var(--foreground))] data-highlighted:bg-[color-mix(in_srgb,var(--popover)_90%,var(--foreground))] data-selected:bg-foreground/[0.08] data-selected:text-foreground data-selected:ring-0 [&[data-highlighted][data-selected]]:bg-[color-mix(in_srgb,var(--popover)_90%,var(--foreground))]",
5555
props.disabledReason &&
5656
"data-disabled:pointer-events-auto data-disabled:cursor-not-allowed data-disabled:hover:bg-transparent",
5757
)}

apps/web/src/components/chat/ModelPickerContent.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ export const ModelPickerContent = memo(function ModelPickerContent(props: {
521521
return (
522522
<TooltipProvider delay={0}>
523523
<div
524-
className="dropdown-glass model-picker-surface relative flex h-screen max-h-96 w-screen max-w-100 flex-row overflow-hidden rounded-lg text-popover-foreground"
524+
className="dropdown-glass model-picker-surface relative flex h-screen max-h-96 w-screen max-w-100 flex-row overflow-hidden rounded-lg text-popover-foreground [clip-path:inset(0_round_var(--radius-lg))]"
525525
data-model-picker-content="true"
526526
>
527527
{/* Sidebar */}

apps/web/src/components/chat/ModelPickerSidebar.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ export const ModelPickerSidebar = memo(function ModelPickerSidebar(props: {
125125
render={
126126
<button
127127
className={cn(
128-
"relative isolate flex w-full cursor-pointer aspect-square items-center justify-center rounded-md transition-colors hover:bg-muted",
128+
"relative isolate flex w-full cursor-pointer aspect-square items-center justify-center rounded-md transition-colors hover:bg-[color-mix(in_srgb,var(--popover)_90%,var(--foreground))] focus-visible:bg-[color-mix(in_srgb,var(--popover)_90%,var(--foreground))] focus-visible:outline-none",
129129
)}
130130
onClick={() => handleSelect("favorites")}
131131
type="button"
@@ -172,7 +172,7 @@ export const ModelPickerSidebar = memo(function ModelPickerSidebar(props: {
172172
<button
173173
data-model-picker-provider={entry.instanceId}
174174
className={cn(
175-
"relative isolate flex w-full cursor-pointer aspect-square items-center justify-center rounded-md transition-colors hover:bg-muted",
175+
"relative isolate flex w-full cursor-pointer aspect-square items-center justify-center rounded-md transition-colors hover:bg-[color-mix(in_srgb,var(--popover)_90%,var(--foreground))] focus-visible:bg-[color-mix(in_srgb,var(--popover)_90%,var(--foreground))] focus-visible:outline-none",
176176
isDisabled && "opacity-50 cursor-not-allowed hover:bg-transparent",
177177
)}
178178
data-provider-accent-color={entry.accentColor}

apps/web/src/components/chat/ProviderModelPicker.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,8 @@ export const ProviderModelPicker = memo(function ProviderModelPicker(props: {
187187
</PopoverTrigger>
188188
<PopoverPopup
189189
align="start"
190-
className="border-0 bg-transparent p-0 shadow-none before:hidden [--viewport-inline-padding:0]"
191-
viewportClassName="rounded-lg !overflow-hidden p-0 [clip-path:inset(0_round_var(--radius-lg))]"
190+
className="border-0 bg-transparent p-0 shadow-none before:hidden [-webkit-backdrop-filter:none]! [--viewport-inline-padding:0] [backdrop-filter:none]!"
191+
viewportClassName="rounded-lg !overflow-hidden p-0"
192192
>
193193
<ModelPickerContent
194194
activeInstanceId={activeInstanceId}

apps/web/src/index.css

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,6 @@ html[data-mobile-composer-route-transition="true"]::view-transition-old(t3-mobil
574574
--alert-glass-tint: var(--warning);
575575
}
576576

577-
.dropdown-glass,
578577
.dialog-glass {
579578
background: color-mix(in srgb, var(--background) var(--glass-opacity), transparent);
580579
-webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturation));
@@ -588,6 +587,19 @@ html[data-mobile-composer-route-transition="true"]::view-transition-old(t3-mobil
588587
}
589588

590589
.dropdown-glass {
590+
/*
591+
* Elevated glass needs a denser tint than broad ambient surfaces. Nesting
592+
* the user-controlled mix inside an 18% popover tint preserves the full
593+
* opacity setting range (40% -> 51%, 80% -> 84%, 100% -> 100%) while
594+
* keeping high-contrast page content from blooming through menus.
595+
*/
596+
background: color-mix(
597+
in srgb,
598+
var(--popover) 18%,
599+
color-mix(in srgb, var(--popover) var(--glass-opacity), transparent)
600+
);
601+
-webkit-backdrop-filter: blur(var(--glass-blur));
602+
backdrop-filter: blur(var(--glass-blur));
591603
border: 1px solid color-mix(in srgb, var(--foreground) 10%, transparent);
592604
box-shadow: 0 16px 40px -18px rgb(0 0 0 / 55%);
593605
}
@@ -602,7 +614,11 @@ html[data-mobile-composer-route-transition="true"]::view-transition-old(t3-mobil
602614
}
603615

604616
.dark .model-picker-surface.model-picker-surface {
605-
background: color-mix(in srgb, var(--background) var(--glass-opacity), transparent);
617+
background: color-mix(
618+
in srgb,
619+
var(--popover) 18%,
620+
color-mix(in srgb, var(--popover) var(--glass-opacity), transparent)
621+
);
606622
}
607623

608624
.dark .dialog-glass {

0 commit comments

Comments
 (0)