src/components/subheading.tsx
import React from 'react'
import { clsx } from 'clsx'
import type { HTMLAttributes } from 'react'
import { generateIdFromChildren } from '@/tools/generate-id-from-children'
type SubheadingLevel = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'div'
interface SubheadingProps extends HTMLAttributes<HTMLHeadingElement> {
children?: React.ReactNode
className?: string
id?: string
as?: SubheadingLevel
fontSize?: string
fontWeight?: string
letterSpacing?: string
textWrap?: string
fontFamily?: string
color?: string
margin?: string
textAlign?: string
textTransform?: string
}
export function Subheading({
children = '',
className,
id,
as: Element = 'p',
fontSize = '',
fontWeight = '',
letterSpacing = '',
textWrap = '',
fontFamily = '',
color = '',
margin = '',
textAlign = '',
textTransform = '',
...props
}: SubheadingProps) {
const defaults = {
fontSize: 'text-xl',
fontWeight: 'font-semibold',
letterSpacing: 'tracking-tight',
textWrap: 'leading-relaxed',
fontFamily: 'font-heading',
color: 'text-accent',
margin: 'mb-0',
textTransform: 'normal',
}
const finalFontSize = fontSize || defaults.fontSize
const finalFontWeight = fontWeight || defaults.fontWeight
const finalLetterSpacing = letterSpacing || defaults.letterSpacing
const finalTextWrap = textWrap || defaults.textWrap
const finalFontFamily = fontFamily || defaults.fontFamily
const finalColor = color || defaults.color
const finalMargin = margin || defaults.margin
const finalTextAlign = textAlign
const finalTextTransform = textTransform || defaults.textTransform
const subheadingId = id || generateIdFromChildren(children)
return (
<Element
id={subheadingId}
className={clsx(
'content-wrapper',
finalFontSize,
finalFontWeight,
finalLetterSpacing,
finalTextWrap,
finalFontFamily,
finalColor,
finalMargin,
finalTextAlign,
finalTextTransform,
className
)}
{...props}
>
{children}
</Element>
)
}