aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/organisms/layout
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/organisms/layout')
-rw-r--r--src/components/organisms/layout/index.ts2
-rw-r--r--src/components/organisms/layout/site-footer.module.scss26
-rw-r--r--src/components/organisms/layout/site-footer.stories.tsx92
-rw-r--r--src/components/organisms/layout/site-footer.test.tsx38
-rw-r--r--src/components/organisms/layout/site-footer.tsx78
-rw-r--r--src/components/organisms/layout/site-header.module.scss50
-rw-r--r--src/components/organisms/layout/site-header.stories.tsx162
-rw-r--r--src/components/organisms/layout/site-header.test.tsx59
-rw-r--r--src/components/organisms/layout/site-header.tsx47
9 files changed, 0 insertions, 554 deletions
diff --git a/src/components/organisms/layout/index.ts b/src/components/organisms/layout/index.ts
index 4593ccc..86670e3 100644
--- a/src/components/organisms/layout/index.ts
+++ b/src/components/organisms/layout/index.ts
@@ -3,6 +3,4 @@ export * from './comments-list';
export * from './no-results';
export * from './overview';
export * from './posts-list';
-export * from './site-footer';
-export * from './site-header';
export * from './summary';
diff --git a/src/components/organisms/layout/site-footer.module.scss b/src/components/organisms/layout/site-footer.module.scss
deleted file mode 100644
index 158c419..0000000
--- a/src/components/organisms/layout/site-footer.module.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-@use "../../../styles/abstracts/mixins" as mix;
-
-.wrapper {
- display: flex;
- flex-flow: column wrap;
- gap: var(--spacing-xs);
- place-items: center;
- place-content: center;
- padding: var(--spacing-md) 0 calc(var(--toolbar-size) + var(--spacing-md));
-
- @include mix.media("screen") {
- @include mix.dimensions("sm") {
- --toolbar-size: 0px;
-
- flex-flow: row wrap;
- font-size: var(--font-size-sm);
- }
- }
-}
-
-.back-to-top {
- position: fixed;
- bottom: calc(var(--toolbar-size, 0px) + var(--spacing-md));
- right: var(--spacing-md);
- transition: all 0.4s ease-in 0s;
-}
diff --git a/src/components/organisms/layout/site-footer.stories.tsx b/src/components/organisms/layout/site-footer.stories.tsx
deleted file mode 100644
index 3f244b0..0000000
--- a/src/components/organisms/layout/site-footer.stories.tsx
+++ /dev/null
@@ -1,92 +0,0 @@
-import type { ComponentMeta, ComponentStory } from '@storybook/react';
-import { Icon } from '../../atoms';
-import { SiteFooter as SiteFooterComponent } from './site-footer';
-
-/**
- * SiteFooter - Storybook Meta
- */
-export default {
- title: 'Organisms/Layout',
- component: SiteFooterComponent,
- argTypes: {
- backToTopClassName: {
- control: {
- type: 'text',
- },
- description: 'Set additional classnames to the back to top button.',
- table: {
- category: 'Styles',
- },
- type: {
- name: 'string',
- required: false,
- },
- },
- className: {
- control: {
- type: 'text',
- },
- description: 'Set additional classnames to the footer element.',
- table: {
- category: 'Styles',
- },
- type: {
- name: 'string',
- required: false,
- },
- },
- copyright: {
- description: 'The copyright information.',
- type: {
- name: 'object',
- required: true,
- value: {},
- },
- },
- navItems: {
- description: 'The footer nav items.',
- table: {
- category: 'Options',
- },
- type: {
- name: 'object',
- required: false,
- value: {},
- },
- },
- topId: {
- control: {
- type: 'text',
- },
- description:
- 'An element id (without hashtag) used as target by back to top button.',
- type: {
- name: 'string',
- required: true,
- },
- },
- },
-} as ComponentMeta<typeof SiteFooterComponent>;
-
-const Template: ComponentStory<typeof SiteFooterComponent> = (args) => (
- <SiteFooterComponent {...args} />
-);
-
-const copyright = {
- from: '2017',
- owner: 'Lorem ipsum',
- to: '2022',
-};
-
-const navItems = [{ id: 'legal-notice', href: '#', label: 'Legal notice' }];
-
-/**
- * Layout Stories - SiteFooter
- */
-export const SiteFooter = Template.bind({});
-SiteFooter.args = {
- copyright,
- license: <Icon shape="cc-by-sa" />,
- navItems,
- topId: 'top',
-};
diff --git a/src/components/organisms/layout/site-footer.test.tsx b/src/components/organisms/layout/site-footer.test.tsx
deleted file mode 100644
index 3ad4022..0000000
--- a/src/components/organisms/layout/site-footer.test.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { describe, expect, it } from '@jest/globals';
-import { render, screen as rtlScreen } from '../../../../tests/utils';
-import { SiteFooter, type SiteFooterProps } from './site-footer';
-
-const copyright: SiteFooterProps['copyright'] = {
- from: '2017',
- owner: 'Lorem ipsum',
-};
-
-const navItems = [
- { id: 'legal-notice', href: '#', label: 'Legal notice' },
-] satisfies SiteFooterProps['navItems'];
-
-describe('SiteFooter', () => {
- it('renders the website copyright', () => {
- render(<SiteFooter copyright={copyright} topId="top" />);
- expect(
- rtlScreen.getByText(new RegExp(copyright.owner))
- ).toBeInTheDocument();
- expect(rtlScreen.getByText(new RegExp(copyright.from))).toBeInTheDocument();
- });
-
- it('renders a back to top link', () => {
- render(<SiteFooter copyright={copyright} topId="top" />);
- expect(
- rtlScreen.getByRole('link', { name: 'Back to top' })
- ).toBeInTheDocument();
- });
-
- it('renders some nav items', () => {
- render(
- <SiteFooter copyright={copyright} navItems={navItems} topId="top" />
- );
- expect(
- rtlScreen.getByRole('link', { name: navItems[0].label })
- ).toBeInTheDocument();
- });
-});
diff --git a/src/components/organisms/layout/site-footer.tsx b/src/components/organisms/layout/site-footer.tsx
deleted file mode 100644
index ccab051..0000000
--- a/src/components/organisms/layout/site-footer.tsx
+++ /dev/null
@@ -1,78 +0,0 @@
-import type { FC, ReactNode } from 'react';
-import { useIntl } from 'react-intl';
-import { Footer } from '../../atoms';
-import {
- BackToTop,
- type BackToTopProps,
- Colophon,
- type ColophonLink,
- type CopyrightProps,
- Copyright,
-} from '../../molecules';
-import styles from './site-footer.module.scss';
-
-export type SiteFooterProps = {
- /**
- * Set additional classnames to the back to top button.
- */
- backToTopClassName?: BackToTopProps['className'];
- /**
- * Set additional classnames to the footer element.
- */
- className?: string;
- /**
- * Set the copyright information.
- */
- copyright: CopyrightProps;
- /**
- * The website license.
- */
- license?: ReactNode;
- /**
- * The footer nav items.
- */
- navItems?: ColophonLink[];
- /**
- * An element id (without hashtag) used as anchor for back to top button.
- */
- topId: string;
-};
-
-/**
- * SiteFooter component
- *
- * Renders a footer with copyright and nav;
- */
-export const SiteFooter: FC<SiteFooterProps> = ({
- backToTopClassName,
- className = '',
- copyright,
- license,
- navItems,
- topId,
-}) => {
- const intl = useIntl();
- const backToTop = intl.formatMessage({
- defaultMessage: 'Back to top',
- description: 'SiteFooter: an accessible name for the back to top button',
- id: 'OHvb01',
- });
- const backToTopAnchor = `#${topId}`;
- const footerClass = `${styles.wrapper} ${className}`;
- const btnClass = `${styles['back-to-top']} ${backToTopClassName}`;
-
- return (
- <Footer className={footerClass}>
- <Colophon
- copyright={<Copyright {...copyright} />}
- license={license}
- links={navItems}
- />
- <BackToTop
- anchor={backToTopAnchor}
- className={btnClass}
- label={backToTop}
- />
- </Footer>
- );
-};
diff --git a/src/components/organisms/layout/site-header.module.scss b/src/components/organisms/layout/site-header.module.scss
deleted file mode 100644
index 573d455..0000000
--- a/src/components/organisms/layout/site-header.module.scss
+++ /dev/null
@@ -1,50 +0,0 @@
-@use "../../../styles/abstracts/functions" as fun;
-@use "../../../styles/abstracts/mixins" as mix;
-
-.wrapper {
- display: grid;
- grid-template-columns:
- minmax(0, 1fr) min(calc(100vw - calc(var(--spacing-md) * 2)), 100ch)
- minmax(0, 1fr);
- align-items: center;
- padding: var(--spacing-md) 0 var(--spacing-lg);
-
- .toolbar {
- justify-content: space-around;
- position: fixed;
- bottom: 0;
- left: 0;
- z-index: 5;
- background: var(--color-bg);
- border-top: fun.convert-px(4) solid;
- border-image: radial-gradient(
- ellipse at top,
- var(--color-primary-lighter) 20%,
- var(--color-primary) 100%
- )
- 1;
- box-shadow: 0 fun.convert-px(-2) fun.convert-px(3) fun.convert-px(-1)
- var(--color-shadow-dark);
-
- @include mix.media("screen") {
- @include mix.dimensions("sm") {
- justify-content: flex-end;
- width: auto;
- position: relative;
- left: unset;
- background: inherit;
- border: none;
- box-shadow: none;
- }
- }
- }
-}
-
-.body {
- grid-column: 2;
- display: flex;
- flex-flow: row wrap;
- align-items: center;
- justify-content: space-between;
- gap: var(--spacing-md);
-}
diff --git a/src/components/organisms/layout/site-header.stories.tsx b/src/components/organisms/layout/site-header.stories.tsx
deleted file mode 100644
index e69ebfd..0000000
--- a/src/components/organisms/layout/site-header.stories.tsx
+++ /dev/null
@@ -1,162 +0,0 @@
-import type { ComponentMeta, ComponentStory } from '@storybook/react';
-import NextImage from 'next/image';
-import { Heading } from '../../atoms';
-import { SiteHeader as SiteHeaderComponent } from './site-header';
-
-/**
- * SiteHeader - Storybook Meta
- */
-export default {
- title: 'Organisms/Layout',
- component: SiteHeaderComponent,
- args: {
- ackeeStorageKey: 'ackee-tracking',
- isHome: false,
- motionStorageKey: 'reduced-motion',
- searchPage: '#',
- withLink: false,
- },
- argTypes: {
- ackeeStorageKey: {
- control: {
- type: 'text',
- },
- description: 'Set Ackee settings local storage key.',
- type: {
- name: 'string',
- required: true,
- },
- },
- baseline: {
- control: {
- type: 'text',
- },
- description: 'The branding baseline.',
- table: {
- category: 'Options',
- },
- type: {
- name: 'string',
- required: false,
- },
- },
- className: {
- control: {
- type: 'text',
- },
- description: 'Set additional classnames to the header wrapper.',
- table: {
- category: 'Styles',
- },
- type: {
- name: 'string',
- required: false,
- },
- },
- isHome: {
- control: {
- type: 'boolean',
- },
- description: 'Determine if the current page is homepage or not.',
- table: {
- category: 'Options',
- },
- type: {
- name: 'boolean',
- required: false,
- },
- },
- motionStorageKey: {
- control: {
- type: 'text',
- },
- description: 'Set Reduced motion settings local storage key.',
- type: {
- name: 'string',
- required: true,
- },
- },
- nav: {
- description: 'The main navigation items.',
- type: {
- name: 'object',
- required: true,
- value: {},
- },
- },
- photo: {
- control: {
- type: 'text',
- },
- description: 'The branding photo.',
- type: {
- name: 'string',
- required: true,
- },
- },
- searchPage: {
- control: {
- type: 'text',
- },
- description: 'The search results page url.',
- type: {
- name: 'string',
- required: true,
- },
- },
- title: {
- control: {
- type: 'text',
- },
- description: 'The website title.',
- type: {
- name: 'string',
- required: true,
- },
- },
- withLink: {
- control: {
- type: 'boolean',
- },
- description: 'Wrap the website title with a link to homepage.',
- table: {
- category: 'Options',
- },
- type: {
- name: 'boolean',
- required: false,
- },
- },
- },
- parameters: {
- layout: 'fullscreen',
- },
-} as ComponentMeta<typeof SiteHeaderComponent>;
-
-const Template: ComponentStory<typeof SiteHeaderComponent> = (args) => (
- <SiteHeaderComponent {...args} />
-);
-
-const nav = [
- { id: 'home-link', href: '#', label: 'Home' },
- { id: 'blog-link', href: '#', label: 'Blog' },
- { id: 'cv-link', href: '#', label: 'CV' },
- { id: 'contact-link', href: '#', label: 'Contact' },
-];
-
-/**
- * Layout Stories - SiteHeader
- */
-export const SiteHeader = Template.bind({});
-SiteHeader.args = {
- nav,
- logo: (
- <NextImage
- alt="A logo"
- height={100}
- src="https://picsum.photos/100"
- width={100}
- />
- ),
- name: <Heading level={1}>Website title</Heading>,
-};
diff --git a/src/components/organisms/layout/site-header.test.tsx b/src/components/organisms/layout/site-header.test.tsx
deleted file mode 100644
index fa1b7be..0000000
--- a/src/components/organisms/layout/site-header.test.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import { describe, expect, it } from '@jest/globals';
-import NextImage from 'next/image';
-import { render, screen as rtlScreen } from '../../../../tests/utils';
-import { SiteHeader } from './site-header';
-
-const nav = [
- { id: 'home-link', href: '#', label: 'Home' },
- { id: 'blog-link', href: '#', label: 'Blog' },
- { id: 'cv-link', href: '#', label: 'CV' },
- { id: 'contact-link', href: '#', label: 'Contact' },
-];
-
-const title = 'Assumenda quis quod';
-
-describe('SiteHeader', () => {
- it('renders the website title', () => {
- render(
- <SiteHeader
- ackeeStorageKey="ackee-tracking"
- logo={
- <NextImage
- alt="A logo"
- height={200}
- src="https://picsum.photos/200"
- width={200}
- />
- }
- motionStorageKey="reduced-motion"
- name={<h1>{title}</h1>}
- nav={nav}
- searchPage="#"
- />
- );
- expect(
- rtlScreen.getByRole('heading', { level: 1, name: title })
- ).toBeInTheDocument();
- });
-
- it('renders the main nav', () => {
- render(
- <SiteHeader
- ackeeStorageKey="ackee-tracking"
- logo={
- <NextImage
- alt="A photo"
- height={200}
- src="https://picsum.photos/200"
- width={200}
- />
- }
- motionStorageKey="reduced-motion"
- name={<div>{title}</div>}
- nav={nav}
- searchPage="#"
- />
- );
- expect(rtlScreen.getByRole('navigation')).toBeInTheDocument();
- });
-});
diff --git a/src/components/organisms/layout/site-header.tsx b/src/components/organisms/layout/site-header.tsx
deleted file mode 100644
index e8953c0..0000000
--- a/src/components/organisms/layout/site-header.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import type { FC } from 'react';
-import { Header } from '../../atoms';
-import { Branding, type BrandingProps } from '../../molecules';
-import { Toolbar, type ToolbarProps } from '../toolbar';
-import styles from './site-header.module.scss';
-
-export type SiteHeaderProps = BrandingProps &
- Pick<
- ToolbarProps,
- 'ackeeStorageKey' | 'motionStorageKey' | 'nav' | 'searchPage'
- > & {
- /**
- * Set additional classnames to the header element.
- */
- className?: string;
- };
-
-/**
- * SiteHeader component
- *
- * Render the website header.
- */
-export const SiteHeader: FC<SiteHeaderProps> = ({
- ackeeStorageKey,
- className,
- motionStorageKey,
- nav,
- searchPage,
- ...props
-}) => {
- const headerClass = `${styles.wrapper} ${className}`;
-
- return (
- <Header className={headerClass}>
- <div className={styles.body}>
- <Branding {...props} />
- <Toolbar
- ackeeStorageKey={ackeeStorageKey}
- className={styles.toolbar}
- motionStorageKey={motionStorageKey}
- nav={nav}
- searchPage={searchPage}
- />
- </div>
- </Header>
- );
-};