Skip to content

feat(ui): port the glass treatment from the V3/V4 experiment - #6170

Open
jbecke wants to merge 1 commit into
mainfrom
jacob/glass-chrome
Open

feat(ui): port the glass treatment from the V3/V4 experiment#6170
jbecke wants to merge 1 commit into
mainfrom
jacob/glass-chrome

Conversation

@jbecke

@jbecke jbecke commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Summary

Standalone port of the Apple-style glass chrome from claude/v3-facebook-topbar-layout-et1kbq (as of its V4 state), with none of the layout work. The look is a backdrop blur, a bright inner top edge, a dark inner bottom edge, a soft cast shadow, and a 135deg specular rim drawn as a 1px gradient masked to the border box, so it composes with any radius.

What changes

  • CSS utilities (apps/web/src/index.css): glass / glass-sm / glass-lg in a three-step scale, plus glass-input, glass-none, and scrim-glass. Palette tokens (which way the light comes from, themed with a light-mode pass) are split from geometry tokens (how big, set per size), with --glass-scale multiplying every strength at once. A new bg-menu-glass color is the menu surface at 88% opacity so backdrop content reads through floating chrome.
  • Buttons: every variant carries the glass except ghost, which has no surface of its own and picks it up on hover instead. Compact sizes step down to glass-sm. Inside a ButtonGroup the group carries one pane for the whole row and its buttons opt out. outline moves from a transparent to a tinted background so the blur has a substrate, and its hover/press feedback moves to the overlay-* scrims the other tinted variants already use.
  • Floating chrome gets glass-lg + bg-menu-glass: dropdowns and sub-menus, context menus, selects, popovers, the mobile touch menu, the Lexical typeahead menus (@mentions, slash/skills, emoji, snippets, tags, agent commands), cmd+k, the create launcher, and floating dialogs. Fullscreen dialogs stay opaque. Redundant per-site shadow-menu overrides on Dropdown.Content are dropped since the base class now owns the shadow.
  • Compose surfaces get glass-input (full-strength glass with a wide, faint ambient shadow; quieter in light mode): desktop channel input, AI chat input, agent input, email compose (the unframed inline variant is excluded).
  • Dialog scrim: floating dialogs dim the page behind them with scrim-glass, an accent-tinted wash with a whisper of blur; visibleScrim layers its heavier coat on top for destructive flows.
  • Only the standard backdrop-filter is declared. Lightning CSS adds the -webkit- prefix itself, and a hand-written prefix after the standard one made it collapse the pair to the prefixed form alone in production builds.

Verification

  • Compiled index.css through Tailwind's compiler: every glass utility and its hover / container-query variants emit, with the @apply chains resolved.
  • biome check on all changed files is clean.
  • Button.test.tsx and Badge.test.tsx pass. The Badge trigger test is updated for the outline variant's hover feedback moving to overlay-hover / overlay-active.
  • tsc type-check reports no errors in any changed file.

Things to eyeball in the app

  • The outline button variant now has a tinted background instead of transparent. This is the most visible behavior change outside the effect itself.
  • Light mode: the glass palette inverts (lift comes from white), and the compose-input halo is scaled down so it does not dominate pale surfaces.

Generated by Claude Code


Note

Low Risk
Broad visual/styling rollout with no auth, data, or API changes; main regression risk is backdrop-filter behavior across browsers/themes and the more visible outline-button background.

Overview
Ports marketing-style glass chrome (backdrop blur, specular rim, inner highlights/shadows) into the web app via new CSS utilities in index.css: glass / glass-sm / glass-lg, plus glass-input, scrim-glass, glass-none, and translucent bg-menu-glass with theme-aware palette tokens.

Buttons pick up size-scaled glass on every variant except ghost (hover-only so toolbar icons don’t look chipped); outline switches from transparent to a tinted bg-lift/70 and uses overlay-hover / overlay-active for press states. ButtonGroup applies one glass pane for the whole row while child buttons opt out.

Floating surfaces—shared Dropdown, Dialog (non-fullscreen), Select, context/Lexical menus, popovers, cmd+k launcher, mobile touch menu—move to glass-lg + menu-glass backgrounds; redundant per-call-site shadow-menu on dropdown content is removed. Dialog overlays use scrim-glass (accent wash + light blur), with visibleScrim still layering the heavier dim for destructive flows.

Composer-style inputs (desktop channel input, chat/agent/email compose) get glass-input for a softer ambient float. Badge.test expectations update for the outline button hover class rename.

Reviewed by Cursor Bugbot for commit 4a99ffb. Bugbot is set up for automated code reviews on this repo. Configure here.

Standalone port of the Apple-style glass chrome from the
claude/v3-facebook-topbar-layout-et1kbq branch (as of its V4 state), with
none of the layout work: a backdrop blur, a bright inner top edge, a dark
inner bottom edge, a soft cast shadow, and a 135deg specular rim drawn as a
1px gradient masked to the border box.

- `glass` / `glass-sm` / `glass-lg` utilities in index.css, with palette
  tokens (themed, light-mode pass) split from geometry tokens (per size).
- Button applies it to every variant except `ghost`, which picks it up on
  hover; compact sizes step down to `glass-sm`. ButtonGroup carries one pane
  for the whole row and its buttons opt out. `base` gets a tinted background
  so the blur has a substrate.
- `glass-lg` + `bg-menu-glass` on floating chrome: dropdowns, context menus,
  selects, popovers, the Lexical typeahead menus, cmd+k and the create
  launcher, and floating dialogs (fullscreen dialogs stay opaque).
- `glass-input` (wide faint ambient shadow, quieter in light mode) on the
  desktop channel input, AI chat input, agent input, and email compose.
- `scrim-glass` dims the page behind floating dialogs with an accent-tinted
  wash and a whisper of blur; `visibleScrim` layers its heavier coat on top.
- `glass-none` opts out under a variant (collapsed property pills).
- Only the standard `backdrop-filter` is declared: Lightning CSS adds the
  -webkit- prefix itself, and a hand-written prefix after it made the pair
  collapse to the prefixed form alone in production builds.
@coderabbitai

coderabbitai Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Team

Run ID: bb0174ed-27b8-4e79-ac18-4262d1acf533

📥 Commits

Reviewing files that changed from the base of the PR and between 77dde64 and 4a99ffb.

📒 Files selected for processing (41)
  • apps/web/src/components/app/app-sidebar/sidebar.tsx
  • apps/web/src/components/app/mobile/MobileTouchMenu.tsx
  • apps/web/src/components/app/split-layout/components/SplitFileMenu.tsx
  • apps/web/src/components/ui/components/Badge.test.tsx
  • apps/web/src/components/ui/components/Button.tsx
  • apps/web/src/components/ui/components/ButtonGroup.tsx
  • apps/web/src/components/ui/components/CommandMenuPrimitives.tsx
  • apps/web/src/components/ui/components/Dialog.tsx
  • apps/web/src/components/ui/components/Dropdown.tsx
  • apps/web/src/components/ui/components/Select.tsx
  • apps/web/src/components/ui/components/SendButton.tsx
  • apps/web/src/features/block-agent/ui/AgentInput.tsx
  • apps/web/src/features/block-email/component/BaseInput.tsx
  • apps/web/src/features/block-email/component/date-selector.tsx
  • apps/web/src/features/calendar/components/composer/EventDateTimeInputs.tsx
  • apps/web/src/features/calendar/components/composer/EventDateTimeRangeFields.tsx
  • apps/web/src/features/calendar/components/composer/EventPropertyPills.tsx
  • apps/web/src/features/channel/Bots/BotInviteSelect.tsx
  • apps/web/src/features/channel/Bots/ChannelMultiSelect.tsx
  • apps/web/src/features/channel/Input/ChannelInput.tsx
  • apps/web/src/features/command/Launcher.tsx
  • apps/web/src/features/command/sidebar/sidebar-create-menu.tsx
  • apps/web/src/features/entity/extractors-property/entity-key-properties.tsx
  • apps/web/src/features/next-soup/soup-view/filters-bar/consolidated-filter-chip.tsx
  • apps/web/src/features/next-soup/soup-view/filters-bar/group-dropdown.tsx
  • apps/web/src/features/next-soup/soup-view/filters-bar/search/search-facet-chip.tsx
  • apps/web/src/features/next-soup/soup-view/filters-bar/sort-dropdown.tsx
  • apps/web/src/features/next-soup/soup-view/filters-bar/unified-filter-dropdown.tsx
  • apps/web/src/features/next-soup/soup-view/views/companies/CompanyViewsMenu.tsx
  • apps/web/src/index.css
  • apps/web/src/lib/core/component/AI/component/input/ChatInput.tsx
  • apps/web/src/lib/core/component/ContextMenu.tsx
  • apps/web/src/lib/core/component/LexicalMarkdown/component/menu/ActionsMenu.tsx
  • apps/web/src/lib/core/component/LexicalMarkdown/component/menu/AgentCommandsMenu/AgentCommandsMenu.tsx
  • apps/web/src/lib/core/component/LexicalMarkdown/component/menu/EmojiMenu.tsx
  • apps/web/src/lib/core/component/LexicalMarkdown/component/menu/InlineFollowupMenu.tsx
  • apps/web/src/lib/core/component/LexicalMarkdown/component/menu/MentionsMenu/MentionsMenu.tsx
  • apps/web/src/lib/core/component/LexicalMarkdown/component/menu/SkillsMenu/SkillsMenu.tsx
  • apps/web/src/lib/core/component/LexicalMarkdown/component/menu/SnippetsMenu/SnippetsMenu.tsx
  • apps/web/src/lib/core/component/LexicalMarkdown/component/menu/TagsMenu.tsx
  • apps/web/src/lib/core/component/OldMenu.tsx

Included review availability: Your plan provides up to 8 included reviews per hour; 6 remain after this review.


📝 Summary

Summary by CodeRabbit

  • Style
    • Updated menus, dropdowns, dialogs, popovers, and command panels with a consistent glass-style appearance.
    • Added translucent backgrounds, blur effects, refined borders, and scrim styling across overlays.
    • Refreshed buttons and button groups with glass surfaces and updated hover and active states.
    • Applied the new visual treatment to composer, chat, and agent input areas.
    • Improved responsive styling for property controls and touch-based inputs.

Walkthrough

The pull request adds a glass styling system with theme tokens and utilities for surfaces, scrims, inputs, and menus. Shared dialogs, dropdowns, selects, buttons, groups, and inputs now use glass classes. Feature menus, popovers, editor menus, and legacy menus replace opaque backgrounds or shadows with glass styling. Badge interaction tests now expect overlay hover and active classes.

Merge Risk: ⚪ Minimal · up to 4a99f

The glass styling rollout updates shared surfaces and controls without a supported functional, security, data, or availability regression. It is ready to merge.

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Description check ✅ Passed The description clearly explains the glass styling rollout, affected components, visual behavior, and verification steps.
Title check ✅ Passed The title uses valid conventional commit format with the feat(ui): prefix, describes the glass treatment change, and is 60 characters long.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4a99ffb. Configure here.

return (
<Panel
class={cn('max-h-[75vh] rounded-xl bg-dialog', local.class)}
class={cn('max-h-[75vh] rounded-xl bg-transparent', local.class)}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Onboarding command menu has no pane

Medium Severity

CommandMenuShell now uses bg-transparent and depends on a parent to paint the glass pane. The create launcher was updated for that contract, but the onboarding command-k lesson still mounts CommandMenuInner in a raw Kobalte dialog with no glass-lg or bg-menu-glass, so the lesson menu has no surface.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 4a99ffb. Configure here.

// `glass` rather than the `glass-sm` that icon-sm would pick up: the
// send button is a prominent floating action, and at half strength the
// rim vanishes into the solid accent fill.
'rounded-[11px] size-7.5 [&_svg]:stroke-[4px] glass',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Send button glass override loses

Low Severity

SendButton adds glass so the prominent send control is not stuck with the glass-sm that icon-sm applies. cn does not treat glass and glass-sm as a conflicting pair, so both stay on the element and glass-sm wins in the stylesheet.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 4a99ffb. Configure here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants