feat: CardSidebar layout component and ExperienceCard sidebar redesign

Sidebar: period badge, company, stack tags.
Main: role title and rich-text description.
This commit is contained in:
Ilia Mashkov
2026-05-18 12:51:33 +03:00
parent 782c619a91
commit 1550989fd9
7 changed files with 159 additions and 30 deletions
+49 -1
View File
@@ -1,5 +1,5 @@
import { render, screen } from '@testing-library/react';
import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './Card';
import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardSidebar, CardTitle } from './Card';
describe('Card', () => {
describe('rendering', () => {
@@ -72,3 +72,51 @@ describe('CardFooter', () => {
expect(el).toHaveClass('brutal-border-top', 'mt-6', 'pt-6', 'md:mt-8', 'md:pt-8');
});
});
describe('CardSidebar', () => {
describe('rendering', () => {
it('renders sidebar content', () => {
render(<CardSidebar sidebar={<span>Sidebar</span>}>Main</CardSidebar>);
expect(screen.getByText('Sidebar')).toBeInTheDocument();
});
it('renders main content', () => {
render(<CardSidebar sidebar={<span>Sidebar</span>}>Main</CardSidebar>);
expect(screen.getByText('Main')).toBeInTheDocument();
});
});
describe('structure', () => {
it('root wrapper is a flex container', () => {
const { container } = render(<CardSidebar sidebar={<span>S</span>}>M</CardSidebar>);
expect(container.firstChild).toHaveClass('flex');
});
it('sidebar column has brutal-border-sidebar class', () => {
render(<CardSidebar sidebar={<span>Sidebar</span>}>Main</CardSidebar>);
const sidebar = screen.getByText('Sidebar').parentElement;
expect(sidebar).toHaveClass('brutal-border-sidebar');
});
it('sidebar column has fixed width on md', () => {
render(<CardSidebar sidebar={<span>Sidebar</span>}>Main</CardSidebar>);
const sidebar = screen.getByText('Sidebar').parentElement;
expect(sidebar).toHaveClass('md:w-52');
});
it('main column fills remaining space', () => {
render(<CardSidebar sidebar={<span>Sidebar</span>}>Main</CardSidebar>);
expect(screen.getByText('Main')).toHaveClass('flex-1');
});
});
describe('className passthrough', () => {
it('forwards className to the root wrapper', () => {
const { container } = render(
<CardSidebar sidebar={<span>S</span>} className="custom">
M
</CardSidebar>,
);
expect(container.firstChild).toHaveClass('custom');
});
});
});