Skip to content

Commit 3fcdcdb

Browse files
Dexploarerclaude
andcommitted
feat: native header uses same glassmorphic pill container as companion
All shell modes now use the same rounded glass container with backdrop blur, border, and shadow. Nav tabs render inside the pill alongside the mode toggle and controls — unified bar across all views. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 136c11c commit 3fcdcdb

File tree

2 files changed

+54
-4
lines changed

2 files changed

+54
-4
lines changed

packages/app-core/src/components/Header.test.tsx

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,4 +477,46 @@ describe("Header", () => {
477477
),
478478
).toHaveLength(1);
479479
});
480+
481+
it("renders the glassmorphic pill container in all modes", async () => {
482+
const mockUseApp = {
483+
elizaCloudEnabled: false,
484+
elizaCloudConnected: false,
485+
elizaCloudCredits: null,
486+
elizaCloudCreditsCritical: false,
487+
elizaCloudCreditsLow: false,
488+
elizaCloudAuthRejected: false,
489+
elizaCloudCreditsError: false,
490+
chatAgentVoiceMuted: false,
491+
handleNewConversation: vi.fn(),
492+
handleSaveCharacter: vi.fn(),
493+
characterSaving: false,
494+
characterSaveSuccess: false,
495+
conversationMessages: [],
496+
chatLastUsage: null,
497+
t: (k: string) => k,
498+
handleStart: vi.fn(),
499+
loadDropStatus: vi.fn().mockResolvedValue(undefined),
500+
tab: "chat",
501+
setTab: vi.fn(),
502+
setState: vi.fn(),
503+
plugins: [],
504+
uiLanguage: "en",
505+
setUiLanguage: vi.fn(),
506+
uiTheme: "dark",
507+
setUiTheme: vi.fn(),
508+
uiShellMode: "native",
509+
switchShellView: vi.fn(),
510+
};
511+
// @ts-expect-error - test uses a narrowed subset
512+
vi.spyOn(AppContext, "useApp").mockReturnValue(mockUseApp);
513+
let tree: ReactTestRenderer | undefined;
514+
await act(async () => {
515+
tree = create(<Header />);
516+
});
517+
const glassShell = tree?.root.findAll(
518+
(node) => node.props["data-testid"] === "header-glass-shell",
519+
);
520+
expect(glassShell?.length).toBe(1);
521+
});
480522
});

packages/app-core/src/components/Header.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,12 +217,18 @@ export function Header({
217217
return (
218218
<>
219219
<header
220-
className={`sticky top-0 z-20 w-full px-3 py-2.5 select-none transition-all sm:px-4 sm:py-3 ${
220+
className="sticky top-0 z-20 w-full select-none overflow-visible"
221+
style={{ WebkitUserSelect: "none", userSelect: "none" }}
222+
data-no-camera-drag="true"
223+
>
224+
<div className={`px-1.5 pt-1.5 sm:px-4 sm:pt-3 ${useMinimalHeaderChrome ? "" : "pb-1.5 sm:pb-3"}`}>
225+
<div
226+
className={`pointer-events-auto relative mx-auto w-full rounded-[20px] border bg-clip-padding shadow ring-1 ring-inset ring-white/10 backdrop-blur-2xl sm:rounded-[22px] transition-all ${
221227
useMinimalHeaderChrome
222-
? "border-b border-transparent bg-transparent backdrop-blur-0 shadow-none"
223-
: "border-b border-border/50 bg-bg/82 backdrop-blur-xl"
228+
? "max-w-5xl border-[rgba(255,255,255,0.12)] bg-[image:linear-gradient(180deg,rgba(255,255,255,0.08),rgba(255,255,255,0.02)),linear-gradient(180deg,rgba(8,11,18,0.52),rgba(5,7,12,0.3))] shadow-[inset_0_1px_0_rgba(255,255,255,0.12),inset_0_-1px_0_rgba(255,255,255,0.04),0_24px_50px_rgba(2,4,8,0.28)]"
229+
: "border-[rgba(255,255,255,0.12)] bg-[image:linear-gradient(180deg,rgba(255,255,255,0.08),rgba(255,255,255,0.02)),linear-gradient(180deg,rgba(8,11,18,0.52),rgba(5,7,12,0.3))] shadow-[inset_0_1px_0_rgba(255,255,255,0.12),inset_0_-1px_0_rgba(255,255,255,0.04),0_24px_50px_rgba(2,4,8,0.28)]"
224230
}`}
225-
style={{ WebkitUserSelect: "none", userSelect: "none" }}
231+
data-testid="header-glass-shell"
226232
>
227233
<ShellHeaderControls
228234
activeShellView={activeShellView}
@@ -338,6 +344,8 @@ export function Header({
338344
</nav>
339345
) : null}
340346
</ShellHeaderControls>
347+
</div>
348+
</div>
341349
</header>
342350

343351
{/* Mobile Menu Overlay */}

0 commit comments

Comments
 (0)