11package tyrian .ui .text
22
3+ import tyrian .EmptyAttribute
34import tyrian .ui .Theme
45import tyrian .ui .UIElement
56import tyrian .ui .datatypes .FontSize
@@ -13,9 +14,9 @@ import tyrian.ui.datatypes.TextStyle
1314final case class Text (
1415 value : String ,
1516 variant : TextVariant ,
17+ classNames : Set [String ],
1618 _modifyTheme : Option [Theme => Theme ]
17- ) extends UIElement [Nothing ]:
18- type T = Text
19+ ) extends UIElement [Text , Nothing ]:
1920
2021 def withValue (value : String ): Text =
2122 this .copy(value = value)
@@ -50,6 +51,9 @@ final case class Text(
5051 def alignRight : Text = modifyTextTheme(_.withAlignment(TextAlignment .Right ))
5152 def alignJustify : Text = modifyTextTheme(_.withAlignment(TextAlignment .Justify ))
5253
54+ def withClassNames (classes : Set [String ]): Text =
55+ this .copy(classNames = classes)
56+
5357 def modifyTheme (f : Theme => Theme ): Text =
5458 this .copy(_modifyTheme = Some (f))
5559
@@ -97,18 +101,18 @@ object Text:
97101 import tyrian .Html .*
98102
99103 def apply (value : String ): Text =
100- Text (value, TextVariant .Normal , None )
101-
102- def body (value : String ): Text = Text (value, TextVariant .Normal , None )
103- def heading1 (value : String ): Text = Text (value, TextVariant .Heading1 , None )
104- def heading2 (value : String ): Text = Text (value, TextVariant .Heading2 , None )
105- def heading3 (value : String ): Text = Text (value, TextVariant .Heading3 , None )
106- def heading4 (value : String ): Text = Text (value, TextVariant .Heading4 , None )
107- def heading5 (value : String ): Text = Text (value, TextVariant .Heading5 , None )
108- def heading6 (value : String ): Text = Text (value, TextVariant .Heading6 , None )
109- def caption (value : String ): Text = Text (value, TextVariant .Caption , None )
110- def code (value : String ): Text = Text (value, TextVariant .Code , None )
111- def label (value : String ): Text = Text (value, TextVariant .Label , None )
104+ Text (value, TextVariant .Normal , Set (), None )
105+
106+ def body (value : String ): Text = Text (value, TextVariant .Normal , Set (), None )
107+ def heading1 (value : String ): Text = Text (value, TextVariant .Heading1 , Set (), None )
108+ def heading2 (value : String ): Text = Text (value, TextVariant .Heading2 , Set (), None )
109+ def heading3 (value : String ): Text = Text (value, TextVariant .Heading3 , Set (), None )
110+ def heading4 (value : String ): Text = Text (value, TextVariant .Heading4 , Set (), None )
111+ def heading5 (value : String ): Text = Text (value, TextVariant .Heading5 , Set (), None )
112+ def heading6 (value : String ): Text = Text (value, TextVariant .Heading6 , Set (), None )
113+ def caption (value : String ): Text = Text (value, TextVariant .Caption , Set (), None )
114+ def code (value : String ): Text = Text (value, TextVariant .Code , Set (), None )
115+ def label (value : String ): Text = Text (value, TextVariant .Label , Set (), None )
112116
113117 def toHtml (element : Text )(using theme : Theme ): Html [Nothing ] =
114118 val t = element._modifyTheme match
@@ -118,18 +122,22 @@ object Text:
118122 val textTheme = getVariantTheme(element.variant, t)
119123 val styles = textTheme.toStyles(t)
120124
125+ val classAttribute =
126+ if element.classNames.isEmpty then EmptyAttribute
127+ else cls := element.classNames.mkString(" " )
128+
121129 element.variant match
122- case TextVariant .Normal => span(style(styles))(element.value)
123- case TextVariant .Paragraph => p(style(styles))(element.value)
124- case TextVariant .Heading1 => h1(style(styles))(element.value)
125- case TextVariant .Heading2 => h2(style(styles))(element.value)
126- case TextVariant .Heading3 => h3(style(styles))(element.value)
127- case TextVariant .Heading4 => h4(style(styles))(element.value)
128- case TextVariant .Heading5 => h5(style(styles))(element.value)
129- case TextVariant .Heading6 => h6(style(styles))(element.value)
130- case TextVariant .Caption => span(style(styles))(element.value)
131- case TextVariant .Code => tyrian.Html .code(style(styles))(element.value)
132- case TextVariant .Label => tyrian.Html .label(style(styles))(element.value)
130+ case TextVariant .Normal => span(style(styles), classAttribute )(element.value)
131+ case TextVariant .Paragraph => p(style(styles), classAttribute )(element.value)
132+ case TextVariant .Heading1 => h1(style(styles), classAttribute )(element.value)
133+ case TextVariant .Heading2 => h2(style(styles), classAttribute )(element.value)
134+ case TextVariant .Heading3 => h3(style(styles), classAttribute )(element.value)
135+ case TextVariant .Heading4 => h4(style(styles), classAttribute )(element.value)
136+ case TextVariant .Heading5 => h5(style(styles), classAttribute )(element.value)
137+ case TextVariant .Heading6 => h6(style(styles), classAttribute )(element.value)
138+ case TextVariant .Caption => span(style(styles), classAttribute )(element.value)
139+ case TextVariant .Code => tyrian.Html .code(style(styles), classAttribute )(element.value)
140+ case TextVariant .Label => tyrian.Html .label(style(styles), classAttribute )(element.value)
133141
134142 private def getVariantTheme (variant : TextVariant , theme : Theme ): TextTheme =
135143 variant match
0 commit comments