Skip to content
This repository was archived by the owner on Nov 20, 2025. It is now read-only.

Commit 3f3cedd

Browse files
Many improvements to use new types
1 parent 75e6f30 commit 3f3cedd

11 files changed

Lines changed: 322 additions & 75 deletions

File tree

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package tyrian.ui.datatypes
2+
3+
import tyrian.Style
4+
5+
final case class Padding(top: Spacing, right: Spacing, bottom: Spacing, left: Spacing):
6+
7+
def withTop(value: Spacing): Padding =
8+
this.copy(top = value)
9+
10+
def withRight(value: Spacing): Padding =
11+
this.copy(right = value)
12+
13+
def withBottom(value: Spacing): Padding =
14+
this.copy(bottom = value)
15+
16+
def withLeft(value: Spacing): Padding =
17+
this.copy(left = value)
18+
19+
def withVertical(value: Spacing): Padding =
20+
this.copy(top = value, bottom = value)
21+
22+
def withHorizontal(value: Spacing): Padding =
23+
this.copy(right = value, left = value)
24+
25+
def toStyle: Style =
26+
Style(
27+
"padding" -> s"${top.toCSSValue} ${right.toCSSValue} ${bottom.toCSSValue} ${left.toCSSValue}"
28+
)
29+
30+
object Padding:
31+
32+
def zero: Padding =
33+
Padding(Spacing.zero, Spacing.zero, Spacing.zero, Spacing.zero)
34+
def default: Padding =
35+
zero
36+
37+
def apply(value: Spacing): Padding =
38+
Padding(value, value, value, value)
39+
40+
def vertical(value: Spacing): Padding =
41+
Padding(value, Spacing.zero, value, Spacing.zero)
42+
43+
def horizontal(value: Spacing): Padding =
44+
Padding(Spacing.zero, value, Spacing.zero, value)
45+
46+
def topLeft(value: Spacing): Padding =
47+
Padding(value, Spacing.zero, Spacing.zero, value)
48+
49+
def topRight(value: Spacing): Padding =
50+
Padding(value, value, Spacing.zero, Spacing.zero)
51+
52+
def bottomLeft(value: Spacing): Padding =
53+
Padding(Spacing.zero, Spacing.zero, value, value)
54+
55+
def bottomRight(value: Spacing): Padding =
56+
Padding(Spacing.zero, value, value, Spacing.zero)
57+
58+
def left(value: Spacing): Padding =
59+
Padding(Spacing.zero, Spacing.zero, Spacing.zero, value)
60+
61+
def right(value: Spacing): Padding =
62+
Padding(Spacing.zero, value, Spacing.zero, Spacing.zero)
63+
64+
def top(value: Spacing): Padding =
65+
Padding(value, Spacing.zero, Spacing.zero, Spacing.zero)
66+
67+
def bottom(value: Spacing): Padding =
68+
Padding(Spacing.zero, Spacing.zero, value, Spacing.zero)
69+
70+
val XSmall: Padding =
71+
Padding(Spacing.XSmall, Spacing.XSmall, Spacing.XSmall, Spacing.XSmall)
72+
val Small: Padding =
73+
Padding(Spacing.Small, Spacing.Small, Spacing.Small, Spacing.Small)
74+
val Medium: Padding =
75+
Padding(Spacing.Medium, Spacing.Medium, Spacing.Medium, Spacing.Medium)
76+
val Large: Padding =
77+
Padding(Spacing.Large, Spacing.Large, Spacing.Large, Spacing.Large)
78+
val XLarge: Padding =
79+
Padding(Spacing.XLarge, Spacing.XLarge, Spacing.XLarge, Spacing.XLarge)
80+
val XXLarge: Padding =
81+
Padding(Spacing.XXLarge, Spacing.XXLarge, Spacing.XXLarge, Spacing.XXLarge)

tyrian-next/src/main/scala/tyrian/ui/datatypes/Radians.scala

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import scala.math
55
import annotation.targetName
66

77
opaque type Radians = Double
8+
89
object Radians:
910

1011
inline private val pi = Math.PI
@@ -23,8 +24,8 @@ object Radians:
2324

2425
/** Converts degrees to radians, allowing negative angles if input is negative.
2526
*/
26-
inline def fromDegrees(degrees: Double): Radians =
27-
degrees % 360d * piBy180
27+
inline def fromDegrees(degrees: Degrees): Radians =
28+
degrees.toDouble % 360d * piBy180
2829

2930
def mod(dividend: Radians, divisor: Radians): Radians =
3031
Radians((dividend % divisor + divisor) % divisor)
@@ -74,20 +75,23 @@ object Radians:
7475
def invert: Radians =
7576
negative
7677

77-
def `unary_-`: Radians = negative
78+
def `unary_-`: Radians =
79+
negative
7880

7981
def ~==(other: Radians): Boolean =
8082
Math.abs(r.toDouble - other.toDouble) < 0.001
8183

82-
def toDouble: Double =
83-
r
84-
85-
def max(other: Radians): Radians = math.max(r, other)
84+
def max(other: Radians): Radians =
85+
math.max(r, other)
8686

87-
def min(other: Radians): Radians = math.min(r, other)
87+
def min(other: Radians): Radians =
88+
math.min(r, other)
8889

8990
def toFloat: Float =
9091
r.toFloat
9192

92-
def toDegrees: Double =
93-
(360 / pi2) * r.toDouble
93+
def toDouble: Double =
94+
r
95+
96+
def toDegrees: Degrees =
97+
Degrees((360 / pi2) * r.toDouble)

tyrian-next/src/main/scala/tyrian/ui/elements/stateful/input/InputTheme.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import tyrian.ui.datatypes.BorderStyle
77
import tyrian.ui.datatypes.BorderWidth
88
import tyrian.ui.datatypes.FontSize
99
import tyrian.ui.datatypes.FontWeight
10+
import tyrian.ui.datatypes.Padding
1011
import tyrian.ui.datatypes.RGBA
1112
import tyrian.ui.datatypes.Spacing
1213
import tyrian.ui.theme.Theme
@@ -17,7 +18,7 @@ final case class InputTheme(
1718
textColor: RGBA,
1819
backgroundColor: RGBA,
1920
border: Option[Border],
20-
padding: Spacing,
21+
padding: Padding,
2122
disabledBackgroundColor: RGBA,
2223
disabledTextColor: RGBA,
2324
disabledBorderColor: RGBA
@@ -71,7 +72,7 @@ final case class InputTheme(
7172
def withBorderStyle(value: BorderStyle): InputTheme =
7273
modifyBorder(_.withStyle(value))
7374

74-
def withPadding(value: Spacing): InputTheme =
75+
def withPadding(value: Padding): InputTheme =
7576
this.copy(padding = value)
7677

7778
def withDisabledBackgroundColor(value: RGBA): InputTheme =
@@ -97,10 +98,9 @@ final case class InputTheme(
9798
"font-weight" -> fontWeight.toCSSValue,
9899
"color" -> textColor.toCSSValue,
99100
"background-color" -> backgroundColor.toCSSValue,
100-
"padding" -> padding.toCSSValue,
101101
"box-sizing" -> "border-box",
102102
"outline" -> "none"
103-
) |+| borderStyle
103+
) |+| borderStyle |+| padding.toStyle
104104

105105
def toDisabledStyles(theme: Theme): Style =
106106
toStyles(theme) |+| Style(
@@ -119,7 +119,7 @@ object InputTheme:
119119
textColor = RGBA.fromHex("#374151"),
120120
backgroundColor = RGBA.White,
121121
border = None,
122-
padding = Spacing.px(8),
122+
padding = Padding(Spacing.px(8)),
123123
disabledBackgroundColor = RGBA.fromHex("#f9fafb"),
124124
disabledTextColor = RGBA.fromHex("#9ca3af"),
125125
disabledBorderColor = RGBA.fromHex("#e5e7eb")

tyrian-next/src/main/scala/tyrian/ui/layout/Container.scala

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ import tyrian.ui.Extent
66
import tyrian.ui.UIElement
77
import tyrian.ui.datatypes.Align
88
import tyrian.ui.datatypes.Justify
9-
import tyrian.ui.datatypes.Spacing
9+
import tyrian.ui.datatypes.Padding
1010
import tyrian.ui.theme.Theme
1111
import tyrian.ui.theme.ThemeOverride
1212
import tyrian.ui.utils.Lens
1313

1414
final case class Container(
1515
child: UIElement[?, ?],
16-
padding: Spacing,
16+
padding: Padding,
1717
justify: Justify,
1818
align: Align,
1919
width: Option[Extent],
@@ -22,7 +22,7 @@ final case class Container(
2222
themeOverride: ThemeOverride[ContainerTheme]
2323
) extends UIElement[Container, ContainerTheme]:
2424

25-
def withPadding(padding: Spacing): Container =
25+
def withPadding(padding: Padding): Container =
2626
this.copy(padding = padding)
2727

2828
def withJustify(value: Justify): Container =
@@ -84,7 +84,7 @@ object Container:
8484
def apply(child: UIElement[?, ?]): Container =
8585
Container(
8686
child = child,
87-
padding = Spacing.None,
87+
padding = Padding.zero,
8888
justify = Justify.Left,
8989
align = Align.Top,
9090
width = None,
@@ -99,9 +99,8 @@ object Container:
9999
"display" -> "flex",
100100
"flex" -> "1",
101101
"justify-content" -> container.justify.toCSSValue,
102-
"align-items" -> container.align.toCSSValue,
103-
"padding" -> container.padding.toCSSValue
104-
)
102+
"align-items" -> container.align.toCSSValue
103+
) |+| container.padding.toStyle
105104

106105
val containerThemeStyles =
107106
theme match

tyrian-next/src/main/scala/tyrian/ui/layout/ContainerTheme.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import tyrian.ui.datatypes.BorderWidth
88
import tyrian.ui.datatypes.BoxShadow
99
import tyrian.ui.datatypes.Fill
1010
import tyrian.ui.datatypes.Opacity
11+
import tyrian.ui.datatypes.RGB
1112
import tyrian.ui.datatypes.RGBA
1213

1314
final case class ContainerTheme(
@@ -85,6 +86,8 @@ final case class ContainerTheme(
8586
def semiTransparent: ContainerTheme = withOpacity(Opacity.Medium)
8687
def transparent: ContainerTheme = withOpacity(Opacity.None)
8788

89+
def withBackgroundColor(color: RGB): ContainerTheme =
90+
this.copy(backgroundFill = Some(Fill.Color(color)))
8891
def withBackgroundColor(color: RGBA): ContainerTheme =
8992
this.copy(backgroundFill = Some(Fill.Color(color)))
9093

0 commit comments

Comments
 (0)