feat(HAI-089): add logo SVG to header component with tests

- Add logo.svg image element to Header component before the h1 title
- Add header-logo CSS class with sizing and flex-shrink styles
- Update header-left alignment from baseline to center
- Add Header component tests covering logo rendering and position
This commit is contained in:
Dustin Byrne
2026-03-26 01:05:27 -04:00
parent d37f887552
commit 2ab34bc11a
3 changed files with 31 additions and 1 deletions

View File

@@ -8,6 +8,7 @@ export function Header({ onOpenSettings }: HeaderProps) {
return (
<header className="header">
<div className="header-left">
<img src="/logo.svg" alt="hai logo" className="header-logo" width={24} height={24} />
<h1 className="logo">hai</h1>
<span className="logo-sub">board</span>
</div>

View File

@@ -0,0 +1,28 @@
import { describe, it, expect, vi } from "vitest";
import { render, screen } from "@testing-library/react";
import { Header } from "../Header";
describe("Header", () => {
it("renders a logo image with correct src and alt", () => {
render(<Header />);
const logo = screen.getByAltText("hai logo");
expect(logo).toBeDefined();
expect(logo.tagName).toBe("IMG");
expect((logo as HTMLImageElement).src).toContain("/logo.svg");
});
it("renders the logo before the h1 element", () => {
render(<Header />);
const logo = screen.getByAltText("hai logo");
const h1 = screen.getByRole("heading", { level: 1 });
// Logo should be a preceding sibling of the h1
expect(logo.compareDocumentPosition(h1) & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy();
});
it("renders the settings button", () => {
const onOpen = vi.fn();
render(<Header onOpenSettings={onOpen} />);
const btn = screen.getByTitle("Settings");
expect(btn).toBeDefined();
});
});

View File

@@ -40,7 +40,8 @@ html, body {
background: var(--surface);
}
.header-left { display: flex; align-items: baseline; gap: 8px; }
.header-left { display: flex; align-items: center; gap: 8px; }
.header-logo { width: 24px; height: 24px; flex-shrink: 0; }
.header-actions { display: flex; align-items: center; gap: 8px; }
.btn-icon {