diff --git a/packages/frontend/src/components/shared/Heading/Heading.theme.ts b/packages/frontend/src/components/shared/Heading/Heading.theme.ts new file mode 100644 index 0000000..5ce5bb5 --- /dev/null +++ b/packages/frontend/src/components/shared/Heading/Heading.theme.ts @@ -0,0 +1,7 @@ +import { tv, type VariantProps } from 'tailwind-variants'; + +export const headingTheme = tv({ + base: ['text-elements-high-em', 'font-display', 'font-normal'], +}); + +export type HeadingVariants = VariantProps; diff --git a/packages/frontend/src/components/shared/Heading/Heading.tsx b/packages/frontend/src/components/shared/Heading/Heading.tsx new file mode 100644 index 0000000..0621039 --- /dev/null +++ b/packages/frontend/src/components/shared/Heading/Heading.tsx @@ -0,0 +1,30 @@ +import React, { type PropsWithChildren } from 'react'; + +import { headingTheme, type HeadingVariants } from './Heading.theme'; +import { PolymorphicProps } from 'types/common'; + +export type HeadingElementType = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'; + +export type HeadingProps = + PropsWithChildren>; + +export const Heading = ({ + children, + as, + className, + ...props +}: HeadingProps) => { + // Component is the element that will be rendered + const Component = as ?? 'h1'; + + return ( + + {children} + + ); +}; diff --git a/packages/frontend/src/components/shared/Heading/index.ts b/packages/frontend/src/components/shared/Heading/index.ts new file mode 100644 index 0000000..6406e7b --- /dev/null +++ b/packages/frontend/src/components/shared/Heading/index.ts @@ -0,0 +1 @@ +export * from './Heading'; diff --git a/packages/frontend/src/types/common.ts b/packages/frontend/src/types/common.ts index fc79628..dd0fc09 100644 --- a/packages/frontend/src/types/common.ts +++ b/packages/frontend/src/types/common.ts @@ -1,3 +1,9 @@ +import { + type ElementType, + type ComponentPropsWithoutRef, + forwardRef, +} from 'react'; + /** * Construct a type by excluding common keys from one type to another. * @template T - The type from which to omit properties. @@ -7,3 +13,15 @@ * @returns A new type that includes all properties from T except those that are common with U. */ export type OmitCommon = Pick>; + +export type PolymorphicProps = Props & + Omit, 'as'> & { + as?: Element; + }; + +// taken from : https://github.com/total-typescript/react-typescript-tutorial/blob/main/src/08-advanced-patterns/72-as-prop-with-forward-ref.solution.tsx +type FixedForwardRef = ( + render: (props: P, ref: React.Ref) => React.ReactNode, +) => (props: P & React.RefAttributes) => JSX.Element; + +export const fixedForwardRef = forwardRef as FixedForwardRef;