diff --git a/apps/web/src/components/chat/ComposerBannerStack.test.tsx b/apps/web/src/components/chat/ComposerBannerStack.test.tsx index 520f130416a1542367eb1939a7e4d731c793a327..1b592168c20d5832c93bab87be2320a91ee16c0b 100644 --- a/apps/web/src/components/chat/ComposerBannerStack.test.tsx +++ b/apps/web/src/components/chat/ComposerBannerStack.test.tsx @@ -33,6 +33,10 @@ describe("ComposerBannerStack", () => { const markup = renderToStaticMarkup(); expect(markup).not.toContain("data-composer-banner-stack-expanded-items"); + expect(markup).toContain("alert-glass"); + expect(markup).toContain('data-variant="warning"'); + expect(markup).toContain("transform:none"); + expect(markup).not.toContain("will-change:transform"); }); it("applies item-specific surface and action layout classes", () => { diff --git a/apps/web/src/components/chat/ComposerBannerStack.tsx b/apps/web/src/components/chat/ComposerBannerStack.tsx index 0b9acbcc99713767af6d721f0a635e3134fac124..3f8f56f041a64342613b9d51efa54d72752c1743 100644 --- a/apps/web/src/components/chat/ComposerBannerStack.tsx +++ b/apps/web/src/components/chat/ComposerBannerStack.tsx @@ -16,11 +16,10 @@ const stackedExitStyle = { } satisfies CSSProperties; const restingStyle = { opacity: 1, - transform: "translate3d(0, 0, 0)", + transform: "none", } satisfies CSSProperties; const exitTransitionStyle = { transition: `transform ${DISMISS_TRANSITION_MS}ms ease-in, opacity ${DISMISS_TRANSITION_MS}ms ease-in`, - willChange: "transform, opacity", } satisfies CSSProperties; export interface ComposerBannerStackItem { @@ -173,7 +172,11 @@ function ComposerBannerStackAlert({ const dismissOnly = item.onDismiss && !item.actions; return ( - + {item.icon} {item.title} {item.description ? {item.description} : null} diff --git a/apps/web/src/index.css b/apps/web/src/index.css index 70614beb9f46a08f0006860368717a49b081e649..87b8755f4c19a420a4b3682f376cbd1f08240a84 100644 --- a/apps/web/src/index.css +++ b/apps/web/src/index.css @@ -375,6 +375,35 @@ html[data-mobile-composer-route-transition="true"]::view-transition-old(t3-mobil backdrop-filter: blur(16px); } + .alert-glass { + --alert-glass-tint: transparent; + + background: + linear-gradient( + color-mix(in srgb, var(--alert-glass-tint) 4%, transparent), + color-mix(in srgb, var(--alert-glass-tint) 4%, transparent) + ), + color-mix(in srgb, var(--background) var(--glass-opacity), transparent) !important; + -webkit-backdrop-filter: blur(16px) saturate(1.1); + backdrop-filter: blur(16px) saturate(1.1); + } + + .alert-glass[data-variant="error"] { + --alert-glass-tint: var(--destructive); + } + + .alert-glass[data-variant="info"] { + --alert-glass-tint: var(--info); + } + + .alert-glass[data-variant="success"] { + --alert-glass-tint: var(--success); + } + + .alert-glass[data-variant="warning"] { + --alert-glass-tint: var(--warning); + } + .dropdown-glass, .dialog-glass, .workflow-dialog-surface, @@ -566,6 +595,10 @@ html[data-mobile-composer-route-transition="true"]::view-transition-old(t3-mobil @supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) { .chat-composer-glass, + .alert-glass { + background: var(--background) !important; + } + .chat-composer-glass-host { background: var(--background); }