feat(navigation): add favorite entry and Menu tab

This commit is contained in:
Codex
2026-07-22 19:31:06 +08:00
parent 318e4991be
commit 469512df18
23 changed files with 794 additions and 118 deletions
@@ -242,12 +242,6 @@ describe("chat Tailwind components", () => {
const memberHtml = renderWithCharacter(
<ChatHeader isGuest={false} offerBanner={<div>Offer</div>} />,
);
const memberWithHintHtml = renderWithCharacter(
<ChatHeader isGuest={false} showBrowserHint />,
);
const guestWithHintHtml = renderWithCharacter(
<ChatHeader isGuest={true} showBrowserHint />,
);
expect(guestHtml).toContain('aria-label="Sign up to unlock more features"');
expect(guestHtml).toContain("bg-accent");
@@ -257,50 +251,33 @@ describe("chat Tailwind components", () => {
expect(guestHtml).toContain('data-analytics-key="chat.back_to_home"');
expect(guestHtml).toContain("px-(--chat-inline-padding,16px)");
expect(guestHtml).not.toContain('aria-label="Profile"');
expect(guestHtml).toContain('aria-label="Save CozSweet"');
expect(memberHtml).toContain("Offer");
expect(memberHtml).toContain('href="/characters/elio/splash"');
expect(memberHtml).toContain('aria-label="Back to home"');
expect(memberHtml).toContain('aria-label="Profile"');
expect(memberHtml).toContain('data-analytics-key="chat.open_profile"');
expect(memberHtml).toContain('aria-label="Save CozSweet"');
expect(memberHtml).toContain('data-analytics-key="favorite.favorite"');
expect(memberHtml).toContain('data-analytics-key="chat.back_to_home"');
expect(memberHtml).toContain("px-(--chat-inline-padding,16px)");
expect(memberHtml).not.toContain("px-(--spacing-md,12px)");
expect(memberHtml).toContain("bg-[rgba(13,11,20,0.7)]");
expect(memberHtml).toContain("size-(--responsive-icon-button-size,42px)");
expect(memberHtml).toContain("lucide-user-round");
expect(memberWithHintHtml).toContain(
'data-analytics-key="chat.external_browser_hint"',
);
expect(memberWithHintHtml).toContain(
expect(memberHtml).toContain(
"grid-cols-[auto_minmax(0,1fr)_auto]",
);
expect(memberWithHintHtml.indexOf('aria-label="Back to home"')).toBeLessThan(
memberWithHintHtml.indexOf(
'data-analytics-key="chat.external_browser_hint"',
),
);
expect(
memberWithHintHtml.indexOf(
'data-analytics-key="chat.external_browser_hint"',
),
).toBeLessThan(memberWithHintHtml.indexOf('aria-label="Profile"'));
expect(guestWithHintHtml).not.toContain(
expect(memberHtml).not.toContain(
'data-analytics-key="chat.external_browser_hint"',
);
});
it("renders the user avatar in the ChatHeader Profile action", () => {
it("replaces the ChatHeader Profile avatar with the favorite action", () => {
userMocks.avatarUrl = "/images/avatar/profile-user.png";
const html = renderWithCharacter(<ChatHeader isGuest={false} />);
expect(html).toContain("%2Fimages%2Favatar%2Fprofile-user.png");
expect(html).toContain('aria-label="Profile"');
expect(html).toContain('data-analytics-key="chat.open_profile"');
expect(html).toContain(
"var(--responsive-icon-button-size, 42px)",
);
expect(html).not.toContain("lucide-user-round");
expect(html).not.toContain("%2Fimages%2Favatar%2Fprofile-user.png");
expect(html).not.toContain('aria-label="Profile"');
expect(html).not.toContain('data-analytics-key="chat.open_profile"');
expect(html).toContain('aria-label="Save CozSweet"');
expect(html).toContain("lucide-star");
});
it("links guest chat back to the active character splash", () => {
@@ -315,6 +292,7 @@ describe("chat Tailwind components", () => {
expect(html).toContain('href="/characters/maya/splash"');
expect(html).not.toContain('aria-label="Profile"');
expect(html).toContain('aria-label="Save CozSweet"');
expect(html).not.toContain(
'data-analytics-key="chat.external_browser_hint"',
);