summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2022-04-08 19:41:40 +0200
committerArmand Philippot <git@armandphilippot.com>2022-04-08 19:41:40 +0200
commita5df28fad0dae266a857ae110c43b3cb8b23c996 (patch)
treea32ea390e90697dc51c3ccb9018de9da2ee4fac3 /src
parent5c75a302c2203cb3ebf31233121026b4775662cf (diff)
refactor: use a consistent classname prop and avoid children prop
I was using the FunctionComponent type for some component that do not use children. So I change the type to VoidFunctionComponent to avoid mistakes. I also rename all the "classes" or "additionalClasses" props to "className" to keep consistency between each components.
Diffstat (limited to 'src')
-rw-r--r--src/components/atoms/buttons/button-link.tsx2
-rw-r--r--src/components/atoms/buttons/button.stories.tsx13
-rw-r--r--src/components/atoms/buttons/button.tsx10
-rw-r--r--src/components/atoms/buttons/buttons.module.scss4
-rw-r--r--src/components/atoms/forms/toggle.module.scss3
-rw-r--r--src/components/atoms/forms/toggle.stories.tsx14
-rw-r--r--src/components/atoms/forms/toggle.tsx26
-rw-r--r--src/components/atoms/headings/heading.stories.tsx14
-rw-r--r--src/components/atoms/headings/heading.tsx14
-rw-r--r--src/components/atoms/images/logo.stories.tsx15
-rw-r--r--src/components/atoms/images/logo.tsx4
-rw-r--r--src/components/atoms/links/link.stories.tsx13
-rw-r--r--src/components/atoms/links/link.tsx14
-rw-r--r--src/components/atoms/links/nav-link.tsx4
-rw-r--r--src/components/atoms/links/sharing-link.tsx4
-rw-r--r--src/components/atoms/links/social-link.tsx10
-rw-r--r--src/components/atoms/lists/description-list.stories.tsx6
-rw-r--r--src/components/atoms/lists/description-list.tsx13
-rw-r--r--src/components/atoms/lists/list.stories.tsx6
-rw-r--r--src/components/atoms/lists/list.tsx15
-rw-r--r--src/components/atoms/loaders/progress-bar.stories.tsx8
-rw-r--r--src/components/atoms/loaders/progress-bar.tsx10
-rw-r--r--src/components/atoms/loaders/spinner.stories.tsx3
-rw-r--r--src/components/atoms/loaders/spinner.tsx6
-rw-r--r--src/components/molecules/buttons/back-to-top.stories.tsx7
-rw-r--r--src/components/molecules/buttons/back-to-top.tsx12
-rw-r--r--src/components/molecules/buttons/help-button.stories.tsx4
-rw-r--r--src/components/molecules/buttons/help-button.tsx10
-rw-r--r--src/components/molecules/images/responsive-image.tsx6
-rw-r--r--src/components/molecules/layout/branding.tsx10
-rw-r--r--src/components/molecules/layout/flipping-logo.stories.tsx23
-rw-r--r--src/components/molecules/layout/flipping-logo.tsx12
-rw-r--r--src/components/molecules/modals/modal.stories.tsx13
-rw-r--r--src/components/molecules/modals/modal.tsx22
-rw-r--r--src/components/molecules/modals/tooltip.stories.tsx23
-rw-r--r--src/components/molecules/modals/tooltip.tsx15
36 files changed, 270 insertions, 118 deletions
diff --git a/src/components/atoms/buttons/button-link.tsx b/src/components/atoms/buttons/button-link.tsx
index 47fe4b0..81229c8 100644
--- a/src/components/atoms/buttons/button-link.tsx
+++ b/src/components/atoms/buttons/button-link.tsx
@@ -2,7 +2,7 @@ import Link from 'next/link';
import { FC } from 'react';
import styles from './buttons.module.scss';
-type ButtonLinkProps = {
+export type ButtonLinkProps = {
/**
* ButtonLink accessible label.
*/
diff --git a/src/components/atoms/buttons/button.stories.tsx b/src/components/atoms/buttons/button.stories.tsx
index 9f4061b..1061d83 100644
--- a/src/components/atoms/buttons/button.stories.tsx
+++ b/src/components/atoms/buttons/button.stories.tsx
@@ -33,6 +33,19 @@ export default {
required: true,
},
},
+ className: {
+ control: {
+ type: 'text',
+ },
+ description: 'Set additional classnames to the button wrapper.',
+ table: {
+ category: 'Styles',
+ },
+ type: {
+ name: 'string',
+ required: false,
+ },
+ },
disabled: {
control: {
type: 'boolean',
diff --git a/src/components/atoms/buttons/button.tsx b/src/components/atoms/buttons/button.tsx
index ae4c894..b223046 100644
--- a/src/components/atoms/buttons/button.tsx
+++ b/src/components/atoms/buttons/button.tsx
@@ -3,9 +3,9 @@ import styles from './buttons.module.scss';
export type ButtonProps = {
/**
- * Add additional classes to the button wrapper.
+ * Set additional classnames to the button wrapper.
*/
- additionalClasses?: string;
+ className?: string;
/**
* Button accessible label.
*/
@@ -17,7 +17,7 @@ export type ButtonProps = {
/**
* Button kind. Default: secondary.
*/
- kind?: 'primary' | 'secondary' | 'tertiary';
+ kind?: 'primary' | 'secondary' | 'tertiary' | 'neutral';
/**
* A callback function to handle click.
*/
@@ -38,7 +38,7 @@ export type ButtonProps = {
* Use a button as call to action.
*/
const Button: FC<ButtonProps> = ({
- additionalClasses,
+ className = '',
ariaLabel,
children,
disabled = false,
@@ -54,7 +54,7 @@ const Button: FC<ButtonProps> = ({
<button
type={type}
disabled={disabled}
- className={`${styles.btn} ${kindClass} ${shapeClass} ${additionalClasses}`}
+ className={`${styles.btn} ${kindClass} ${shapeClass} ${className}`}
aria-label={ariaLabel}
{...props}
>
diff --git a/src/components/atoms/buttons/buttons.module.scss b/src/components/atoms/buttons/buttons.module.scss
index a1c3dba..87c92db 100644
--- a/src/components/atoms/buttons/buttons.module.scss
+++ b/src/components/atoms/buttons/buttons.module.scss
@@ -28,6 +28,10 @@
cursor: wait;
}
+ &--neutral {
+ background: inherit;
+ }
+
&--primary {
background: var(--color-primary);
border: fun.convert-px(2) solid var(--color-bg);
diff --git a/src/components/atoms/forms/toggle.module.scss b/src/components/atoms/forms/toggle.module.scss
index 00e87a2..24b867e 100644
--- a/src/components/atoms/forms/toggle.module.scss
+++ b/src/components/atoms/forms/toggle.module.scss
@@ -6,10 +6,11 @@
display: inline-flex;
align-items: center;
+ width: 100%;
}
.title {
- margin-right: var(--spacing-xs);
+ margin-right: auto;
}
.toggle {
diff --git a/src/components/atoms/forms/toggle.stories.tsx b/src/components/atoms/forms/toggle.stories.tsx
index 6e7323b..ea08694 100644
--- a/src/components/atoms/forms/toggle.stories.tsx
+++ b/src/components/atoms/forms/toggle.stories.tsx
@@ -34,6 +34,20 @@ export default {
required: true,
},
},
+ labelSize: {
+ control: {
+ type: 'select',
+ },
+ description: 'The label size.',
+ options: ['medium', 'small'],
+ table: {
+ category: 'Options',
+ },
+ type: {
+ name: 'string',
+ required: false,
+ },
+ },
name: {
control: {
type: 'text',
diff --git a/src/components/atoms/forms/toggle.tsx b/src/components/atoms/forms/toggle.tsx
index e8e8c0f..7ef40ed 100644
--- a/src/components/atoms/forms/toggle.tsx
+++ b/src/components/atoms/forms/toggle.tsx
@@ -1,9 +1,16 @@
-import { FC, ReactElement } from 'react';
+import { ReactNode, VFC } from 'react';
+import Label, { LabelProps } from './label';
import styles from './toggle.module.scss';
export type ToggleChoices = {
- left: ReactElement | string;
- right: ReactElement | string;
+ /**
+ * The left part of the toggle field (unchecked).
+ */
+ left: ReactNode;
+ /**
+ * The right part of the toggle field (checked).
+ */
+ right: ReactNode;
};
export type ToggleProps = {
@@ -20,6 +27,10 @@ export type ToggleProps = {
*/
label: string;
/**
+ * The label size.
+ */
+ labelSize?: LabelProps['size'];
+ /**
* The input name.
*/
name: string;
@@ -38,13 +49,14 @@ export type ToggleProps = {
*
* Render a toggle with a label and two choices.
*/
-const Toggle: FC<ToggleProps> = ({
+const Toggle: VFC<ToggleProps> = ({
choices,
id,
label,
+ labelSize,
name,
- value,
setValue,
+ value,
}) => {
return (
<>
@@ -56,12 +68,12 @@ const Toggle: FC<ToggleProps> = ({
onChange={() => setValue(!value)}
className={styles.checkbox}
/>
- <label htmlFor={id} className={styles.label}>
+ <Label size={labelSize} htmlFor={id} className={styles.label}>
<span className={styles.title}>{label}</span>
{choices.left}
<span className={styles.toggle}></span>
{choices.right}
- </label>
+ </Label>
</>
);
};
diff --git a/src/components/atoms/headings/heading.stories.tsx b/src/components/atoms/headings/heading.stories.tsx
index cea3532..66a84dc 100644
--- a/src/components/atoms/headings/heading.stories.tsx
+++ b/src/components/atoms/headings/heading.stories.tsx
@@ -9,13 +9,13 @@ export default {
withMargin: true,
},
argTypes: {
- additionalClasses: {
+ className: {
control: {
type: 'text',
},
- description: 'Set additional classes.',
+ description: 'Set additional classnames.',
table: {
- category: 'Options',
+ category: 'Styles',
},
type: {
name: 'string',
@@ -71,12 +71,12 @@ export default {
},
} as ComponentMeta<typeof HeadingComponent>;
-const Template: ComponentStory<typeof HeadingComponent> = (args) => {
- const { level, ...props } = args;
- return <HeadingComponent level={level || 1} {...props} />;
-};
+const Template: ComponentStory<typeof HeadingComponent> = (args) => (
+ <HeadingComponent {...args} />
+);
export const Heading = Template.bind({});
Heading.args = {
children: 'Your title',
+ level: 1,
};
diff --git a/src/components/atoms/headings/heading.tsx b/src/components/atoms/headings/heading.tsx
index 136571d..3048534 100644
--- a/src/components/atoms/headings/heading.tsx
+++ b/src/components/atoms/headings/heading.tsx
@@ -1,19 +1,21 @@
import { FC } from 'react';
import styles from './heading.module.scss';
+export type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
+
export type HeadingProps = {
/**
- * Adds additional classes.
+ * Set additional classnames.
*/
- additionalClasses?: string;
+ className?: string;
/**
* Use an heading element or only its styles. Default: false.
*/
isFake?: boolean;
/**
- * HTML heading level: 'h1', 'h2', 'h3', 'h4', 'h5' or 'h6'.
+ * HTML heading level.
*/
- level: 1 | 2 | 3 | 4 | 5 | 6;
+ level: HeadingLevel;
/**
* Adds margin. Default: true.
*/
@@ -27,7 +29,7 @@ export type HeadingProps = {
*/
const Heading: FC<HeadingProps> = ({
children,
- additionalClasses,
+ className,
isFake = false,
level,
withMargin = true,
@@ -38,7 +40,7 @@ const Heading: FC<HeadingProps> = ({
return (
<TitleTag
- className={`${styles.heading} ${styles[levelClass]} ${styles[marginClass]} ${additionalClasses}`}
+ className={`${styles.heading} ${styles[levelClass]} ${styles[marginClass]} ${className}`}
>
{children}
</TitleTag>
diff --git a/src/components/atoms/images/logo.stories.tsx b/src/components/atoms/images/logo.stories.tsx
index afb5317..fbc7501 100644
--- a/src/components/atoms/images/logo.stories.tsx
+++ b/src/components/atoms/images/logo.stories.tsx
@@ -4,6 +4,21 @@ import LogoComponent from './logo';
export default {
title: 'Atoms/Images',
component: LogoComponent,
+ argTypes: {
+ title: {
+ control: {
+ type: 'text',
+ },
+ description: 'The SVG title.',
+ table: {
+ category: 'Accessibility',
+ },
+ type: {
+ name: 'string',
+ required: false,
+ },
+ },
+ },
} as ComponentMeta<typeof LogoComponent>;
const Template: ComponentStory<typeof LogoComponent> = (args) => (
diff --git a/src/components/atoms/images/logo.tsx b/src/components/atoms/images/logo.tsx
index 9ce2518..2e52110 100644
--- a/src/components/atoms/images/logo.tsx
+++ b/src/components/atoms/images/logo.tsx
@@ -1,4 +1,4 @@
-import { FC } from 'react';
+import { VFC } from 'react';
import styles from './logo.module.scss';
type LogoProps = {
@@ -13,7 +13,7 @@ type LogoProps = {
*
* Render a SVG logo.
*/
-const Logo: FC<LogoProps> = ({ title }) => {
+const Logo: VFC<LogoProps> = ({ title }) => {
return (
<svg
viewBox="0 0 512 512"
diff --git a/src/components/atoms/links/link.stories.tsx b/src/components/atoms/links/link.stories.tsx
index e5a8b0a..569c874 100644
--- a/src/components/atoms/links/link.stories.tsx
+++ b/src/components/atoms/links/link.stories.tsx
@@ -15,6 +15,19 @@ export default {
required: true,
},
},
+ className: {
+ control: {
+ type: 'text',
+ },
+ description: 'Set additional classnames.',
+ table: {
+ category: 'Styles',
+ },
+ type: {
+ name: 'string',
+ required: false,
+ },
+ },
external: {
control: {
type: 'boolean',
diff --git a/src/components/atoms/links/link.tsx b/src/components/atoms/links/link.tsx
index a61158f..87f11fc 100644
--- a/src/components/atoms/links/link.tsx
+++ b/src/components/atoms/links/link.tsx
@@ -2,11 +2,11 @@ import NextLink from 'next/link';
import { FC } from 'react';
import styles from './link.module.scss';
-type LinkProps = {
+export type LinkProps = {
/**
- * Set additional classes to the link.
+ * Set additional classnames to the link.
*/
- classes?: string;
+ className?: string;
/**
* True if it is an external link. Default: false.
*/
@@ -28,24 +28,22 @@ type LinkProps = {
*/
const Link: FC<LinkProps> = ({
children,
- classes,
+ className = '',
href,
lang,
external = false,
}) => {
- const additionalClasses = classes || '';
-
return external ? (
<a
href={href}
hrefLang={lang}
- className={`${styles.link} ${styles['link--external']} ${additionalClasses}`}
+ className={`${styles.link} ${styles['link--external']} ${className}`}
>
{children}
</a>
) : (
<NextLink href={href}>
- <a className={`${styles.link} ${additionalClasses}`}>{children}</a>
+ <a className={`${styles.link} ${className}`}>{children}</a>
</NextLink>
);
};
diff --git a/src/components/atoms/links/nav-link.tsx b/src/components/atoms/links/nav-link.tsx
index 7c6fede..25c0e7d 100644
--- a/src/components/atoms/links/nav-link.tsx
+++ b/src/components/atoms/links/nav-link.tsx
@@ -1,5 +1,5 @@
import Link from 'next/link';
-import { FC, ReactNode } from 'react';
+import { VFC, ReactNode } from 'react';
import styles from './nav-link.module.scss';
export type NavLinkProps = {
@@ -22,7 +22,7 @@ export type NavLinkProps = {
*
* Render a navigation link.
*/
-const NavLink: FC<NavLinkProps> = ({ href, label, logo }) => {
+const NavLink: VFC<NavLinkProps> = ({ href, label, logo }) => {
return (
<Link href={href}>
<a className={styles.link}>
diff --git a/src/components/atoms/links/sharing-link.tsx b/src/components/atoms/links/sharing-link.tsx
index ca53ef9..3cd2dd1 100644
--- a/src/components/atoms/links/sharing-link.tsx
+++ b/src/components/atoms/links/sharing-link.tsx
@@ -1,4 +1,4 @@
-import { FC } from 'react';
+import { VFC } from 'react';
import { useIntl } from 'react-intl';
import styles from './sharing-link.module.scss';
@@ -26,7 +26,7 @@ export type SharingLinkProps = {
*
* Render a sharing link.
*/
-const SharingLink: FC<SharingLinkProps> = ({ medium, url }) => {
+const SharingLink: VFC<SharingLinkProps> = ({ medium, url }) => {
const intl = useIntl();
const text = intl.formatMessage(
{
diff --git a/src/components/atoms/links/social-link.tsx b/src/components/atoms/links/social-link.tsx
index 489c8b4..8c7c790 100644
--- a/src/components/atoms/links/social-link.tsx
+++ b/src/components/atoms/links/social-link.tsx
@@ -2,14 +2,16 @@ import GithubIcon from '@assets/images/social-media/github.svg';
import GitlabIcon from '@assets/images/social-media/gitlab.svg';
import LinkedInIcon from '@assets/images/social-media/linkedin.svg';
import TwitterIcon from '@assets/images/social-media/twitter.svg';
-import { FC } from 'react';
+import { VFC } from 'react';
import styles from './social-link.module.scss';
-type SocialLinkProps = {
+export type SocialWebsite = 'Github' | 'Gitlab' | 'LinkedIn' | 'Twitter';
+
+export type SocialLinkProps = {
/**
* The social website name.
*/
- name: 'Github' | 'Gitlab' | 'LinkedIn' | 'Twitter';
+ name: SocialWebsite;
/**
* The social profile url.
*/
@@ -21,7 +23,7 @@ type SocialLinkProps = {
*
* Render a social icon link.
*/
-const SocialLink: FC<SocialLinkProps> = ({ name, url }) => {
+const SocialLink: VFC<SocialLinkProps> = ({ name, url }) => {
/**
* Retrieve a social link icon by id.
* @param {string} id - The social website id.
diff --git a/src/components/atoms/lists/description-list.stories.tsx b/src/components/atoms/lists/description-list.stories.tsx
index e9a60cf..c65241d 100644
--- a/src/components/atoms/lists/description-list.stories.tsx
+++ b/src/components/atoms/lists/description-list.stories.tsx
@@ -7,13 +7,13 @@ export default {
title: 'Atoms/Lists',
component: DescriptionListComponent,
argTypes: {
- classes: {
+ className: {
control: {
type: 'text',
},
- description: 'Set additional classes to the list wrapper.',
+ description: 'Set additional classnames to the list wrapper',
table: {
- category: 'Options',
+ category: 'Styles',
},
type: {
name: 'string',
diff --git a/src/components/atoms/lists/description-list.tsx b/src/components/atoms/lists/description-list.tsx
index df2880f..a5ab1d5 100644
--- a/src/components/atoms/lists/description-list.tsx
+++ b/src/components/atoms/lists/description-list.tsx
@@ -1,4 +1,4 @@
-import { FC } from 'react';
+import { VFC } from 'react';
import styles from './description-list.module.scss';
export type DescriptionListItem = {
@@ -18,9 +18,9 @@ export type DescriptionListItem = {
export type DescriptionListProps = {
/**
- * Set additional classes to the list wrapper.
+ * Set additional classnames to the list wrapper.
*/
- classes?: string;
+ className?: string;
/**
* The list items.
*/
@@ -32,7 +32,10 @@ export type DescriptionListProps = {
*
* Render a description list.
*/
-const DescriptionList: FC<DescriptionListProps> = ({ classes = '', items }) => {
+const DescriptionList: VFC<DescriptionListProps> = ({
+ className = '',
+ items,
+}) => {
/**
* Retrieve the description list items wrapped in a div element.
*
@@ -54,7 +57,7 @@ const DescriptionList: FC<DescriptionListProps> = ({ classes = '', items }) => {
});
};
- return <dl className={`${styles.list} ${classes}`}>{getItems(items)}</dl>;
+ return <dl className={`${styles.list} ${className}`}>{getItems(items)}</dl>;
};
export default DescriptionList;
diff --git a/src/components/atoms/lists/list.stories.tsx b/src/components/atoms/lists/list.stories.tsx
index 6256e81..30079cb 100644
--- a/src/components/atoms/lists/list.stories.tsx
+++ b/src/components/atoms/lists/list.stories.tsx
@@ -8,13 +8,13 @@ export default {
kind: 'unordered',
},
argTypes: {
- classes: {
+ className: {
control: {
type: 'text',
},
- description: 'Add additional classes to the list element.',
+ description: 'Set additional classnames to the list wrapper',
table: {
- category: 'Options',
+ category: 'Styles',
},
type: {
name: 'string',
diff --git a/src/components/atoms/lists/list.tsx b/src/components/atoms/lists/list.tsx
index 8ce8437..7197c34 100644
--- a/src/components/atoms/lists/list.tsx
+++ b/src/components/atoms/lists/list.tsx
@@ -1,4 +1,4 @@
-import { FC } from 'react';
+import { VFC } from 'react';
import styles from './list.module.scss';
export type ListItem = {
@@ -18,9 +18,9 @@ export type ListItem = {
export type ListProps = {
/**
- * Add additional classes to the list element.
+ * Set additional classnames to the list wrapper
*/
- classes?: string;
+ className?: string;
/**
* An array of list items.
*/
@@ -36,9 +36,8 @@ export type ListProps = {
*
* Render either an ordered or an unordered list.
*/
-const List: FC<ListProps> = ({ classes, items, kind = 'unordered' }) => {
+const List: VFC<ListProps> = ({ className, items, kind = 'unordered' }) => {
const ListTag = kind === 'ordered' ? 'ol' : 'ul';
- const additionalClasses = classes || '';
const kindClass = `list--${kind}`;
/**
@@ -52,7 +51,7 @@ const List: FC<ListProps> = ({ classes, items, kind = 'unordered' }) => {
{value}
{child && (
<ListTag
- className={`${styles.list} ${styles[kindClass]} ${additionalClasses}`}
+ className={`${styles.list} ${styles[kindClass]} ${className}`}
>
{getItems(child)}
</ListTag>
@@ -62,9 +61,7 @@ const List: FC<ListProps> = ({ classes, items, kind = 'unordered' }) => {
};
return (
- <ListTag
- className={`${styles.list} ${styles[kindClass]} ${additionalClasses}`}
- >
+ <ListTag className={`${styles.list} ${styles[kindClass]} ${className}`}>
{getItems(items)}
</ListTag>
);
diff --git a/src/components/atoms/loaders/progress-bar.stories.tsx b/src/components/atoms/loaders/progress-bar.stories.tsx
index 837a696..4fde5a7 100644
--- a/src/components/atoms/loaders/progress-bar.stories.tsx
+++ b/src/components/atoms/loaders/progress-bar.stories.tsx
@@ -5,11 +5,14 @@ export default {
title: 'Atoms/Loaders',
component: ProgressBarComponent,
argTypes: {
- ariaLabel: {
+ 'aria-label': {
control: {
type: 'string',
},
description: 'An accessible name.',
+ table: {
+ category: 'Accessibility',
+ },
type: {
name: 'string',
required: false,
@@ -30,6 +33,9 @@ export default {
type: 'text',
},
description: 'An additional information to display.',
+ table: {
+ category: 'Options',
+ },
type: {
name: 'string',
required: false,
diff --git a/src/components/atoms/loaders/progress-bar.tsx b/src/components/atoms/loaders/progress-bar.tsx
index fa4e09d..1b1ff06 100644
--- a/src/components/atoms/loaders/progress-bar.tsx
+++ b/src/components/atoms/loaders/progress-bar.tsx
@@ -1,11 +1,11 @@
-import { FC } from 'react';
+import { VFC } from 'react';
import styles from './progress-bar.module.scss';
export type ProgressBarProps = {
/**
* Accessible progress bar name.
*/
- ariaLabel?: string;
+ 'aria-label'?: string;
/**
* Current value.
*/
@@ -29,12 +29,12 @@ export type ProgressBarProps = {
*
* Render a progress bar.
*/
-const ProgressBar: FC<ProgressBarProps> = ({
- ariaLabel,
+const ProgressBar: VFC<ProgressBarProps> = ({
current,
info,
min,
max,
+ ...props
}) => {
return (
<div className={styles.progress}>
@@ -46,7 +46,7 @@ const ProgressBar: FC<ProgressBarProps> = ({
aria-valuemin={min}
aria-valuemax={max}
aria-valuenow={current}
- aria-label={ariaLabel}
+ {...props}
></progress>
</div>
);
diff --git a/src/components/atoms/loaders/spinner.stories.tsx b/src/components/atoms/loaders/spinner.stories.tsx
index 86c316e..5006ce4 100644
--- a/src/components/atoms/loaders/spinner.stories.tsx
+++ b/src/components/atoms/loaders/spinner.stories.tsx
@@ -11,6 +11,9 @@ export default {
type: 'text',
},
description: 'Loading message.',
+ table: {
+ category: 'Options',
+ },
type: {
name: 'string',
required: false,
diff --git a/src/components/atoms/loaders/spinner.tsx b/src/components/atoms/loaders/spinner.tsx
index 57b0a43..bff0f25 100644
--- a/src/components/atoms/loaders/spinner.tsx
+++ b/src/components/atoms/loaders/spinner.tsx
@@ -1,8 +1,8 @@
-import { FC } from 'react';
+import { VFC } from 'react';
import { useIntl } from 'react-intl';
import styles from './spinner.module.scss';
-type SpinnerProps = {
+export type SpinnerProps = {
/**
* The loading message. Default: "Loading...".
*/
@@ -14,7 +14,7 @@ type SpinnerProps = {
*
* Render a loading message with animation.
*/
-const Spinner: FC<SpinnerProps> = ({ message }) => {
+const Spinner: VFC<SpinnerProps> = ({ message }) => {
const intl = useIntl();
return (
diff --git a/src/components/molecules/buttons/back-to-top.stories.tsx b/src/components/molecules/buttons/back-to-top.stories.tsx
index f1a36e5..fe58293 100644
--- a/src/components/molecules/buttons/back-to-top.stories.tsx
+++ b/src/components/molecules/buttons/back-to-top.stories.tsx
@@ -6,11 +6,14 @@ export default {
title: 'Molecules/Buttons',
component: BackToTopComponent,
argTypes: {
- additionalClasses: {
+ className: {
control: {
type: 'text',
},
- description: 'Add additional classes to the button wrapper.',
+ description: 'Set additional classnames to the button wrapper.',
+ table: {
+ category: 'Styles',
+ },
type: {
name: 'string',
required: false,
diff --git a/src/components/molecules/buttons/back-to-top.tsx b/src/components/molecules/buttons/back-to-top.tsx
index f25d3e9..56c5247 100644
--- a/src/components/molecules/buttons/back-to-top.tsx
+++ b/src/components/molecules/buttons/back-to-top.tsx
@@ -1,14 +1,14 @@
import ButtonLink from '@components/atoms/buttons/button-link';
import Arrow from '@components/atoms/icons/arrow';
-import { FC } from 'react';
+import { VFC } from 'react';
import { useIntl } from 'react-intl';
import styles from './back-to-top.module.scss';
-type BackToTopProps = {
+export type BackToTopProps = {
/**
- * Add additional classes to the button wrapper.
+ * Set additional classnames to the button wrapper.
*/
- additionalClasses?: string;
+ className?: string;
/**
* An element id (without hashtag) to use as anchor.
*/
@@ -20,7 +20,7 @@ type BackToTopProps = {
*
* Render a back to top link.
*/
-const BackToTop: FC<BackToTopProps> = ({ additionalClasses, target }) => {
+const BackToTop: VFC<BackToTopProps> = ({ className = '', target }) => {
const intl = useIntl();
const linkName = intl.formatMessage({
defaultMessage: 'Back to top',
@@ -29,7 +29,7 @@ const BackToTop: FC<BackToTopProps> = ({ additionalClasses, target }) => {
});
return (
- <div className={`${styles.wrapper} ${additionalClasses}`}>
+ <div className={`${styles.wrapper} ${className}`}>
<ButtonLink shape="square" target={`#${target}`} aria-label={linkName}>
<Arrow direction="top" />
</ButtonLink>
diff --git a/src/components/molecules/buttons/help-button.stories.tsx b/src/components/molecules/buttons/help-button.stories.tsx
index 7ed953e..cfc1b0b 100644
--- a/src/components/molecules/buttons/help-button.stories.tsx
+++ b/src/components/molecules/buttons/help-button.stories.tsx
@@ -6,11 +6,11 @@ export default {
title: 'Molecules/Buttons',
component: HelpButtonComponent,
argTypes: {
- classes: {
+ className: {
control: {
type: 'text',
},
- description: 'Set additional classes to the button.',
+ description: 'Set additional classnames to the button wrapper.',
table: {
category: 'Options',
},
diff --git a/src/components/molecules/buttons/help-button.tsx b/src/components/molecules/buttons/help-button.tsx
index d933829..aeb84ec 100644
--- a/src/components/molecules/buttons/help-button.tsx
+++ b/src/components/molecules/buttons/help-button.tsx
@@ -1,13 +1,13 @@
import Button, { ButtonProps } from '@components/atoms/buttons/button';
-import { FC } from 'react';
+import { VFC } from 'react';
import { useIntl } from 'react-intl';
import styles from './help-button.module.scss';
export type HelpButtonProps = Pick<ButtonProps, 'onClick'> & {
/**
- * Set additional classes to the button.
+ * Set additional classnames to the button wrapper.
*/
- classes?: string;
+ className?: string;
};
/**
@@ -15,7 +15,7 @@ export type HelpButtonProps = Pick<ButtonProps, 'onClick'> & {
*
* Render a button with an interrogation mark icon.
*/
-const HelpButton: FC<HelpButtonProps> = ({ classes = '', onClick }) => {
+const HelpButton: VFC<HelpButtonProps> = ({ className = '', onClick }) => {
const intl = useIntl();
const text = intl.formatMessage({
defaultMessage: 'Help',
@@ -26,7 +26,7 @@ const HelpButton: FC<HelpButtonProps> = ({ classes = '', onClick }) => {
return (
<Button
shape="circle"
- additionalClasses={`${styles.btn} ${classes}`}
+ className={`${styles.btn} ${className}`}
onClick={onClick}
>
<span className="screen-reader-text">{text}</span>
diff --git a/src/components/molecules/images/responsive-image.tsx b/src/components/molecules/images/responsive-image.tsx
index db2f5ab..9f96f18 100644
--- a/src/components/molecules/images/responsive-image.tsx
+++ b/src/components/molecules/images/responsive-image.tsx
@@ -1,6 +1,6 @@
import Link from '@components/atoms/links/link';
import Image, { ImageProps } from 'next/image';
-import { FC } from 'react';
+import { VFC } from 'react';
import styles from './responsive-image.module.scss';
type ResponsiveImageProps = Omit<ImageProps, 'alt' | 'width' | 'height'> & {
@@ -31,7 +31,7 @@ type ResponsiveImageProps = Omit<ImageProps, 'alt' | 'width' | 'height'> & {
*
* Render a responsive image wrapped in a figure element.
*/
-const ResponsiveImage: FC<ResponsiveImageProps> = ({
+const ResponsiveImage: VFC<ResponsiveImageProps> = ({
alt,
caption,
layout,
@@ -42,7 +42,7 @@ const ResponsiveImage: FC<ResponsiveImageProps> = ({
return (
<figure className={styles.wrapper}>
{target ? (
- <Link href={target} classes={styles.link}>
+ <Link href={target} className={styles.link}>
<Image alt={alt} layout={layout || 'intrinsic'} {...props} />
{caption && (
<figcaption className={styles.caption}>{caption}</figcaption>
diff --git a/src/components/molecules/layout/branding.tsx b/src/components/molecules/layout/branding.tsx
index efb2e34..9f564bf 100644
--- a/src/components/molecules/layout/branding.tsx
+++ b/src/components/molecules/layout/branding.tsx
@@ -1,6 +1,6 @@
import Heading from '@components/atoms/headings/heading';
import Link from 'next/link';
-import { FC } from 'react';
+import { VFC } from 'react';
import { useIntl } from 'react-intl';
import styles from './branding.module.scss';
import FlippingLogo from './flipping-logo';
@@ -33,7 +33,7 @@ type BrandingProps = {
*
* Render the branding logo, title and optional baseline.
*/
-const Branding: FC<BrandingProps> = ({
+const Branding: VFC<BrandingProps> = ({
baseline,
isHome = false,
photo,
@@ -61,7 +61,7 @@ const Branding: FC<BrandingProps> = ({
return (
<div className={styles.wrapper}>
<FlippingLogo
- additionalClasses={styles.logo}
+ className={styles.logo}
altText={altText}
logoTitle={logoTitle}
photo={photo}
@@ -70,7 +70,7 @@ const Branding: FC<BrandingProps> = ({
isFake={!isHome}
level={1}
withMargin={false}
- additionalClasses={styles.title}
+ className={styles.title}
>
{withLink ? (
<Link href="/">
@@ -85,7 +85,7 @@ const Branding: FC<BrandingProps> = ({
isFake={true}
level={4}
withMargin={false}
- additionalClasses={styles.baseline}
+ className={styles.baseline}
>
{baseline}
</Heading>
diff --git a/src/components/molecules/layout/flipping-logo.stories.tsx b/src/components/molecules/layout/flipping-logo.stories.tsx
index 1508269..1ac8de8 100644
--- a/src/components/molecules/layout/flipping-logo.stories.tsx
+++ b/src/components/molecules/layout/flipping-logo.stories.tsx
@@ -5,11 +5,21 @@ export default {
title: 'Molecules/Layout',
component: FlippingLogoComponent,
argTypes: {
- additionalClasses: {
+ altText: {
+ control: {
+ type: 'text',
+ },
+ description: 'Photo alternative text.',
+ type: {
+ name: 'string',
+ required: true,
+ },
+ },
+ className: {
control: {
type: 'text',
},
- description: 'Adds additional classes to the logo wrapper.',
+ description: 'Set additional classnames to the logo wrapper.',
table: {
category: 'Options',
},
@@ -18,14 +28,17 @@ export default {
required: false,
},
},
- altText: {
+ logoTitle: {
control: {
type: 'text',
},
- description: 'Photo alternative text.',
+ description: 'An accessible name for the logo.',
+ table: {
+ category: 'Accessibility',
+ },
type: {
name: 'string',
- required: true,
+ required: false,
},
},
photo: {
diff --git a/src/components/molecules/layout/flipping-logo.tsx b/src/components/molecules/layout/flipping-logo.tsx
index 7bb7afc..6f7645f 100644
--- a/src/components/molecules/layout/flipping-logo.tsx
+++ b/src/components/molecules/layout/flipping-logo.tsx
@@ -1,13 +1,13 @@
import Logo from '@components/atoms/images/logo';
import Image from 'next/image';
-import { FC } from 'react';
+import { VFC } from 'react';
import styles from './flipping-logo.module.scss';
type FlippingLogoProps = {
/**
- * Adds additional classes to the logo wrapper.
+ * Set additional classnames to the logo wrapper.
*/
- additionalClasses?: string;
+ className?: string;
/**
* Photo alternative text.
*/
@@ -27,14 +27,14 @@ type FlippingLogoProps = {
*
* Render a logo and a photo with a flipping effect.
*/
-const FlippingLogo: FC<FlippingLogoProps> = ({
- additionalClasses,
+const FlippingLogo: VFC<FlippingLogoProps> = ({
+ className = '',
altText,
logoTitle,
photo,
}) => {
return (
- <div className={`${styles.logo} ${additionalClasses}`}>
+ <div className={`${styles.logo} ${className}`}>
<div className={styles.logo__front}>
<Image src={photo} alt={altText} layout="fill" objectFit="cover" />
</div>
diff --git a/src/components/molecules/modals/modal.stories.tsx b/src/components/molecules/modals/modal.stories.tsx
index b68a24b..bd7d9f4 100644
--- a/src/components/molecules/modals/modal.stories.tsx
+++ b/src/components/molecules/modals/modal.stories.tsx
@@ -15,6 +15,19 @@ export default {
required: true,
},
},
+ className: {
+ control: {
+ type: 'text',
+ },
+ description: 'Set additional classnames to the modal.',
+ table: {
+ category: 'Styles',
+ },
+ type: {
+ name: 'string',
+ required: false,
+ },
+ },
icon: {
control: {
type: 'select',
diff --git a/src/components/molecules/modals/modal.tsx b/src/components/molecules/modals/modal.tsx
index 4dc3b0a..ce12e7a 100644
--- a/src/components/molecules/modals/modal.tsx
+++ b/src/components/molecules/modals/modal.tsx
@@ -1,17 +1,29 @@
import Heading from '@components/atoms/headings/heading';
+import { CogProps } from '@components/atoms/icons/cog';
+import { MagnifyingGlassProps } from '@components/atoms/icons/magnifying-glass';
import dynamic from 'next/dynamic';
-import { FC, ReactNode } from 'react';
+import { FC } from 'react';
import styles from './modal.module.scss';
export type Icons = 'cogs' | 'search';
export type ModalProps = {
+ /**
+ * Set additional classnames.
+ */
+ className?: string;
+ /**
+ * A icon to illustrate the modal.
+ */
icon?: Icons;
+ /**
+ * The modal title.
+ */
title?: string;
};
-const CogIcon = dynamic<ReactNode>(() => import('@components/atoms/icons/cog'));
-const SearchIcon = dynamic<ReactNode>(
+const CogIcon = dynamic<CogProps>(() => import('@components/atoms/icons/cog'));
+const SearchIcon = dynamic<MagnifyingGlassProps>(
() => import('@components/atoms/icons/magnifying-glass')
);
@@ -20,7 +32,7 @@ const SearchIcon = dynamic<ReactNode>(
*
* Render a modal component with an optional title and icon.
*/
-const Modal: FC<ModalProps> = ({ children, icon, title }) => {
+const Modal: FC<ModalProps> = ({ children, className = '', icon, title }) => {
const getIcon = (id: Icons) => {
switch (id) {
case 'cogs':
@@ -33,7 +45,7 @@ const Modal: FC<ModalProps> = ({ children, icon, title }) => {
};
return (
- <div className={styles.wrapper}>
+ <div className={`${styles.wrapper} ${className}`}>
{title && (
<Heading isFake={true} level={3}>
{icon && <span className={styles.icon}>{getIcon(icon)}</span>}
diff --git a/src/components/molecules/modals/tooltip.stories.tsx b/src/components/molecules/modals/tooltip.stories.tsx
index a57cf34..63fc71d 100644
--- a/src/components/molecules/modals/tooltip.stories.tsx
+++ b/src/components/molecules/modals/tooltip.stories.tsx
@@ -5,6 +5,19 @@ export default {
title: 'Molecules/Modals',
component: TooltipComponent,
argTypes: {
+ className: {
+ control: {
+ type: 'text',
+ },
+ description: 'Set additional classnames to the tooltip.',
+ table: {
+ category: 'Styles',
+ },
+ type: {
+ name: 'string',
+ required: false,
+ },
+ },
content: {
control: {
type: 'text',
@@ -15,6 +28,16 @@ export default {
required: true,
},
},
+ icon: {
+ control: {
+ type: 'text',
+ },
+ description: 'The tooltip icon.',
+ type: {
+ name: 'string',
+ required: true,
+ },
+ },
title: {
control: {
type: 'text',
diff --git a/src/components/molecules/modals/tooltip.tsx b/src/components/molecules/modals/tooltip.tsx
index ceb0b14..73f36e7 100644
--- a/src/components/molecules/modals/tooltip.tsx
+++ b/src/components/molecules/modals/tooltip.tsx
@@ -1,12 +1,12 @@
import List, { type ListItem } from '@components/atoms/lists/list';
-import { FC, ReactNode } from 'react';
+import { ReactNode, VFC } from 'react';
import styles from './tooltip.module.scss';
export type TooltipProps = {
/**
- * Set additional classes to the tooltip wrapper.
+ * Set additional classnames to the tooltip wrapper.
*/
- classes?: string;
+ className?: string;
/**
* The tooltip body.
*/
@@ -26,7 +26,12 @@ export type TooltipProps = {
*
* Render a tooltip modal.
*/
-const Tooltip: FC<TooltipProps> = ({ classes = '', content, icon, title }) => {
+const Tooltip: VFC<TooltipProps> = ({
+ className = '',
+ content,
+ icon,
+ title,
+}) => {
/**
* Format an array of strings to an array of object with id and value.
*
@@ -40,7 +45,7 @@ const Tooltip: FC<TooltipProps> = ({ classes = '', content, icon, title }) => {
};
return (
- <div className={`${styles.wrapper} ${classes}`}>
+ <div className={`${styles.wrapper} ${className}`}>
<div className={styles.title}>
<span className={styles.icon}>{icon}</span>
{title}