Skip to content

Commit cf342c0

Browse files
committed
feat: add header and page components
1 parent dee4d9f commit cf342c0

13 files changed

+183
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
@layer sl-components {
2+
[data-sl-header] {
3+
font: var(--sl-text-display-1-font);
4+
letter-spacing: var(--sl-text-display-1-letter-spacing);
5+
6+
border-bottom: var(--sl-border);
7+
}
8+
}
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
2+
import React, { forwardRef } from 'react'
3+
import { Content, ContentProps } from '../content'
4+
import './header.css'
5+
6+
export const Header = forwardRef<HTMLDivElement, HeaderProps>(
7+
function Header(props, ref) {
8+
const { children, ...otherProps } = props
9+
10+
return (
11+
<Content data-sl-header {...otherProps} ref={ref}>
12+
{children}
13+
</Content>
14+
)
15+
}
16+
)
17+
18+
export type HeaderProps = ContentProps
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './header'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import '../header.css'
2+
import './styles.css'
3+
import React from 'react'
4+
5+
import { Header } from '../index'
6+
import { Container, Content } from '../../content'
7+
import { Page } from '../../page'
8+
9+
export default {
10+
title: 'shoreline-components/header',
11+
}
12+
13+
export function Default() {
14+
return (
15+
<Container>
16+
<Header>Header</Header>
17+
</Container>
18+
)
19+
}
20+
21+
export function WithPage() {
22+
return (
23+
<Page>
24+
<Header narrow>Header</Header>
25+
<Content narrow className="page-content">
26+
<div className="generic-content">Page content</div>
27+
</Content>
28+
</Page>
29+
)
30+
}
31+
32+
export function OnComponent() {
33+
return (
34+
<Container>
35+
<div className="card-like-component">
36+
<Header>Component header</Header>
37+
<Content>Text</Content>
38+
</div>
39+
</Container>
40+
)
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
.page-content {
2+
flex-grow: 1;
3+
}
4+
5+
.generic-content {
6+
height: 100%;
7+
width: 100%;
8+
background-color: var(--sl-bg-muted);
9+
}
10+
11+
.card-like-component {
12+
border: var(--sl-border);
13+
border-radius: var(--sl-border-radius-medium);
14+
height: 15rem;
15+
margin: 1rem;
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import React from 'react'
2+
import { describe, expect, test } from 'vitest'
3+
import { render } from '@testing-library/react'
4+
5+
import { Header } from '../header'
6+
7+
describe('header', () => {
8+
test('renders', () => {
9+
const { container } = render(<Header />)
10+
11+
expect(container.querySelector('[data-sl-header]')).toBeInTheDocument()
12+
})
13+
})
14+

packages/components/src/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
/* PLOP_INJECT_EXPORT */
2+
export * from './header'
3+
export * from './page'
24
export * from './toast'
35
export * from './skeleton'
46
export * from './tab'

packages/components/src/page/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './page'

packages/components/src/page/page.css

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
@layer sl-components {
2+
[data-sl-page] {
3+
height: 100vh;
4+
display: flex;
5+
flex-direction: column;
6+
}
7+
}

packages/components/src/page/page.tsx

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import React, { ComponentPropsWithoutRef, forwardRef } from 'react'
2+
import { Container } from '../content'
3+
4+
export const Page = forwardRef<HTMLDivElement, PageProps>(function Page(
5+
props,
6+
ref
7+
) {
8+
const { children, ...otherProps } = props
9+
10+
return (
11+
<Container data-sl-page ref={ref} {...otherProps}>
12+
{children}
13+
</Container>
14+
)
15+
})
16+
17+
export interface PageProps extends ComponentPropsWithoutRef<'div'> {
18+
className?: string
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import '../page.css'
2+
import './styles.css'
3+
import React from 'react'
4+
5+
import { Page } from '../index'
6+
import { Content } from '../../content'
7+
import { Header } from '../../header'
8+
9+
export default {
10+
title: 'shoreline-components/page',
11+
}
12+
13+
export function Default() {
14+
return (
15+
<Page>
16+
<Header>Header</Header>
17+
<Content className="page-content">
18+
<div className="page-inner-content">Page content</div>
19+
</Content>
20+
</Page>
21+
)
22+
}
23+
24+
export function Narrow() {
25+
return (
26+
<Page>
27+
<Header narrow>Header</Header>
28+
<Content narrow className="page-content">
29+
<div className="page-inner-content">Page content</div>
30+
</Content>
31+
</Page>
32+
)
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
.page-content {
2+
flex-grow: 1;
3+
}
4+
5+
.page-inner-content {
6+
height: 100%;
7+
width: 100%;
8+
background-color: var(--sl-bg-muted);
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import React from 'react'
2+
import { describe, expect, test } from 'vitest'
3+
import { render } from '@testing-library/react'
4+
5+
import { Page } from '../page'
6+
7+
describe('page', () => {
8+
test('renders', () => {
9+
const { container } = render(<Page />)
10+
11+
expect(container.querySelector('[data-sl-page]')).toBeInTheDocument()
12+
})
13+
})
14+

0 commit comments

Comments
 (0)