From 7d9f874364ec6e255e62eb3027011bfed267904c Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Tue, 17 May 2022 18:37:38 +0200 Subject: chore: adjust articles styles * change animation on article card hover * change comments section alignment --- src/components/atoms/headings/heading.tsx | 58 ++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 12 deletions(-) (limited to 'src/components/atoms/headings/heading.tsx') diff --git a/src/components/atoms/headings/heading.tsx b/src/components/atoms/headings/heading.tsx index c5bf4ca..e385249 100644 --- a/src/components/atoms/headings/heading.tsx +++ b/src/components/atoms/headings/heading.tsx @@ -1,9 +1,19 @@ -import { FC, ReactNode } from 'react'; +import { + createElement, + ForwardedRef, + forwardRef, + ForwardRefRenderFunction, + ReactNode, +} from 'react'; import styles from './heading.module.scss'; export type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6; export type HeadingProps = { + /** + * The title alignment. Default: left; + */ + alignment?: 'center' | 'left'; /** * The heading body. */ @@ -30,31 +40,55 @@ export type HeadingProps = { withMargin?: boolean; }; +type TitleTagProps = Pick & { + tagName: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p'; +}; + +const TitleTag = forwardRef< + HTMLHeadingElement | HTMLParagraphElement, + TitleTagProps +>( + ( + { children, tagName, ...props }, + ref: ForwardedRef + ) => { + return createElement(tagName, { ...props, ref }, children); + } +); +TitleTag.displayName = 'TitleTag'; + /** * Heading component. * * Render an HTML heading element or a paragraph with heading styles. */ -const Heading: FC = ({ - children, - className, - id, - isFake = false, - level, - withMargin = true, -}) => { - const TitleTag = isFake ? `p` : (`h${level}` as keyof JSX.IntrinsicElements); +const Heading: ForwardRefRenderFunction = ( + { + alignment = 'left', + children, + className, + id, + isFake = false, + level, + withMargin = true, + }, + ref: ForwardedRef +) => { + const tagName = isFake ? 'p' : (`h${level}` as TitleTagProps['tagName']); const levelClass = `heading--${level}`; + const alignmentClass = `heading--${alignment}`; const marginClass = withMargin ? 'heading--margin' : 'heading--regular'; return ( {children} ); }; -export default Heading; +export default forwardRef(Heading); -- cgit v1.2.3