package elements import "fmt" func Text(content string, options ...Variant) templ.Component { if err := ValidTextVariants(options...); err != nil { return renderParagraph(clsxMerge(TextSizeDefault, TextStyleDefault), content) } return renderParagraph(clsxMerge(options...), content) } func ValidTextVariants(variants ...Variant) error { for _, v := range variants { switch v.(type) { case TextSize: case TextStyle: default: return fmt.Errorf("invalid text variant: %v", v) } } return nil } templ renderHeading(attrs templ.Attributes, text string) {
{ text }
} templ renderLink(attrs templ.Attributes, text string) { { text } } templ renderStrong(attrs templ.Attributes, text string) { { text } } templ renderEmphasis(attrs templ.Attributes, text string) { { text } } templ renderCode(attrs templ.Attributes, text string) {
{ text }
}
type TextSize int
const (
TextSizeDefault TextSize = iota
TextSizeSmall
TextSizeMedium
TextSizeLarge
)
func (s TextSize) Attributes() templ.Attributes {
switch s {
case TextSizeSmall:
return templ.Attributes{
"class": "text-sm",
}
case TextSizeLarge:
return templ.Attributes{
"class": "text-xl",
}
}
return templ.Attributes{
"class": "text-md",
}
}
type TextStyle int
const (
TextStyleDefault TextStyle = iota
TextStyleHeading
TextStyleParagraph
TextStyleLink
TextStyleStrong
TextStyleEmphasis
TextStyleCode
)
func (s TextStyle) Attributes() templ.Attributes {
switch s {
case TextStyleHeading:
return templ.Attributes{
"class": "text-xl font-bold text-xl",
}
case TextStyleParagraph:
return templ.Attributes{
"class": "text-base font-normal",
}
case TextStyleLink:
return templ.Attributes{
"class": "text-blue-600 font-medium underline",
}
case TextStyleStrong:
return templ.Attributes{
"class": "font-semibold text-md",
}
case TextStyleCode:
return templ.Attributes{
"class": "text-stone-800 font-mono",
}
default:
return templ.Attributes{
"class": "text-base font-normal text-md",
}
}
}