Skip to content

Commit a70bf05

Browse files
committed
Create a Header
1 parent 743d882 commit a70bf05

File tree

6 files changed

+107
-0
lines changed

6 files changed

+107
-0
lines changed

src/Header/Header.stories.tsx

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import type { Meta, StoryObj } from "@storybook/react-vite";
2+
3+
import Header from ".";
4+
import { Placeholder } from "../Placeholder";
5+
import ColorSchemeToggle from "../ColorSchemeToggle";
6+
7+
const meta = {
8+
title: "Organism/Header",
9+
component: Header,
10+
argTypes: {
11+
logo: { type: "function" },
12+
elements: { type: "function" },
13+
},
14+
} satisfies Meta<typeof Header>;
15+
16+
export default meta;
17+
type Story = StoryObj<typeof meta>;
18+
19+
export const Default: Story = {
20+
args: {
21+
logo: <Placeholder height="100%" width="100px" label="Logo" />,
22+
elements: [
23+
<ColorSchemeToggle key="color-scheme-toggle" />,
24+
<Placeholder
25+
key="element-1"
26+
height="100%"
27+
width="100px"
28+
label="Element"
29+
/>,
30+
<Placeholder key="navigation" height="100%" label="Navigation Link" />,
31+
],
32+
},
33+
};

src/Header/index.scss

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
@use "sass:map";
2+
3+
@use "../sass/mixins";
4+
@use "../sass/tokens";
5+
6+
.header {
7+
width: 100%;
8+
height: tokens.$header-height;
9+
padding: map.get(tokens.$spacing, base);
10+
box-sizing: border-box;
11+
12+
border-bottom: 1px solid map.get(tokens.$grays, light);
13+
@include mixins.light-mode {
14+
background-color: map.get(tokens.$grays, faint);
15+
border-bottom: 1px solid map.get(tokens.$grays, less-faint);
16+
}
17+
18+
.header__container {
19+
align-items: center;
20+
display: flex;
21+
flex-direction: row;
22+
gap: map.get(tokens.$spacing, base);
23+
justify-content: space-between;
24+
25+
@include mixins.container;
26+
}
27+
28+
.header__logo {
29+
height: 100%;
30+
display: flex;
31+
align-items: center;
32+
flex-direction: row;
33+
gap: map.get(tokens.$spacing, sm);
34+
}
35+
36+
.header__elements {
37+
align-items: center;
38+
display: flex;
39+
flex-direction: row;
40+
gap: map.get(tokens.$spacing, base);
41+
}
42+
}

src/Header/index.tsx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { type FC } from "react";
2+
3+
import "./index.scss";
4+
import React from "react";
5+
6+
export interface HeaderProps {
7+
logo?: React.ReactNode;
8+
elements?: React.ReactNode[];
9+
}
10+
11+
const Header: FC<HeaderProps> = ({ logo, elements = [] }) => {
12+
return (
13+
<header className="header" role="banner">
14+
<div className="header__container">
15+
{!!logo && <div className="header__logo">{logo}</div>}
16+
17+
{elements.length > 0 && (
18+
<div className="header__elements">{elements}</div>
19+
)}
20+
</div>
21+
</header>
22+
);
23+
};
24+
25+
export default Header;

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ export {
5555
default as GitHubButton,
5656
} from "./GitHubButton";
5757

58+
export { type HeaderProps, default as Header } from "./Header";
59+
5860
export {
5961
type LabeledInputProps,
6062
type LabeledInputRenderProps,

src/sass/_mixins.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
@mixin container {
1313
padding-inline: map.get(tokens.$spacing, base);
1414
margin-inline: auto;
15+
box-sizing: border-box;
1516
width: 100%;
1617

1718
@media (width >= map.get(tokens.$breakpoints, small)) {

src/sass/_tokens.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
@use "sass:map";
22

3+
$header-height: 3.5rem;
4+
35
$brand: (
46
red: #ec2c5b,
57
yellow: #faa61a,
@@ -18,6 +20,8 @@ $brand: (
1820
);
1921

2022
$grays: (
23+
faint: color-mix(in oklab, oklch(0.985 0.002 247.839) 95%, transparent),
24+
less-faint: oklch(0.928 0.006 264.531),
2125
very-light: oklch(0.872 0.01 258.338),
2226
light: oklch(0.446 0.03 256.802),
2327
dark: oklch(0.21 0.034 264.665),

0 commit comments

Comments
 (0)