|
1 | 1 | module CSS.Size where
|
2 | 2 |
|
3 | 3 | import Prelude
|
4 |
| - |
5 |
| -import CSS.Common (class Auto) |
6 |
| -import CSS.Property (class Val, Value, value) |
| 4 | +import CSS.Common (class Auto, browsers) |
| 5 | +import CSS.Property (class Val, Prefixed(Plain), Value(..), plain, value) |
7 | 6 | import CSS.String (class IsString, fromString)
|
| 7 | +import Data.Exists (Exists, mkExists, runExists) |
8 | 8 |
|
9 |
| -newtype Size :: Type -> Type |
10 |
| -newtype Size a = Size Value |
| 9 | +data LengthUnit |
11 | 10 |
|
12 |
| -type role Size nominal |
| 11 | +data Percentage |
| 12 | + |
| 13 | +data Combination |
13 | 14 |
|
14 |
| -derive instance eqSize :: Eq a => Eq (Size a) |
15 |
| -derive instance ordSize :: Ord a => Ord (Size a) |
| 15 | +data Size :: Type -> Type |
| 16 | +data Size a |
| 17 | + = BasicSize Value |
| 18 | + | SumSize (Exists Size) (Exists Size) |
| 19 | + | DiffSize (Exists Size) (Exists Size) |
| 20 | + | MultSize Number (Exists Size) |
| 21 | + | DivSize Number (Exists Size) |
| 22 | + |
| 23 | +type role Size nominal |
16 | 24 |
|
17 | 25 | instance isStringSize :: IsString (Size a) where
|
18 |
| - fromString = Size <<< fromString |
| 26 | + fromString = BasicSize <<< fromString |
| 27 | + |
| 28 | +sizeToString :: forall a. Size a -> String |
| 29 | +sizeToString (BasicSize (Value x)) = plain x |
| 30 | +sizeToString (SumSize a b) = runExists (\a' -> runExists (\b' -> "(" <> sizeToString a' <> " + " <> sizeToString b' <> ")") b) a |
| 31 | +sizeToString (DiffSize a b) = runExists (\a' -> runExists (\b' -> "(" <> sizeToString a' <> " - " <> sizeToString b' <> ")") b) a |
| 32 | +sizeToString (MultSize a b) = runExists (\b' -> "(" <> show a <> " * " <> sizeToString b' <> ")") b |
| 33 | +sizeToString (DivSize a b) = runExists (\b' -> "(" <> sizeToString b' <> " / " <> show a <> ")") b |
19 | 34 |
|
20 | 35 | instance valSize :: Val (Size a) where
|
21 |
| - value (Size v) = v |
| 36 | + value (BasicSize x) = x |
| 37 | + value x = Value $ browsers <> Plain ("calc" <> sizeToString x) |
22 | 38 |
|
23 | 39 | instance autoSize :: Auto (Size a) where
|
24 | 40 | auto = fromString "auto"
|
25 | 41 |
|
26 |
| -data Abs |
27 |
| -data Rel |
28 |
| - |
29 | 42 | -- | Zero size.
|
30 | 43 | nil :: forall a. Size a
|
31 |
| -nil = Size $ fromString "0" |
| 44 | +nil = BasicSize $ fromString "0" |
32 | 45 |
|
33 | 46 | -- | Unitless size (as recommended for line-height).
|
34 | 47 | unitless :: forall a. Number -> Size a
|
35 |
| -unitless = Size <<< value |
| 48 | +unitless = BasicSize <<< value |
36 | 49 |
|
37 | 50 | -- | Size in pixels.
|
38 |
| -px :: Number -> Size Abs |
39 |
| -px i = Size (value i <> fromString "px") |
| 51 | +px :: Number -> Size LengthUnit |
| 52 | +px i = BasicSize (value i <> fromString "px") |
40 | 53 |
|
41 | 54 | -- | Size in points (1pt = 1/72 of 1in).
|
42 |
| -pt :: Number -> Size Abs |
43 |
| -pt i = Size (value i <> fromString "pt") |
| 55 | +pt :: Number -> Size LengthUnit |
| 56 | +pt i = BasicSize (value i <> fromString "pt") |
44 | 57 |
|
45 | 58 | -- | Size in em's.
|
46 |
| -em :: Number -> Size Abs |
47 |
| -em i = Size (value i <> fromString "em") |
| 59 | +em :: Number -> Size LengthUnit |
| 60 | +em i = BasicSize (value i <> fromString "em") |
48 | 61 |
|
49 | 62 | -- | Size in ex'es (x-height of the first avaliable font).
|
50 |
| -ex :: Number -> Size Abs |
51 |
| -ex i = Size (value i <> fromString "ex") |
| 63 | +ex :: Number -> Size LengthUnit |
| 64 | +ex i = BasicSize (value i <> fromString "ex") |
52 | 65 |
|
53 |
| -ch :: Number -> Size Abs |
54 |
| -ch i = Size (value i <> fromString "ch") |
| 66 | +ch :: Number -> Size LengthUnit |
| 67 | +ch i = BasicSize (value i <> fromString "ch") |
55 | 68 |
|
56 | 69 | -- | SimpleSize in percents.
|
57 |
| -pct :: Number -> Size Rel |
58 |
| -pct i = Size (value i <> fromString "%") |
| 70 | +pct :: Number -> Size Percentage |
| 71 | +pct i = BasicSize (value i <> fromString "%") |
59 | 72 |
|
60 | 73 | -- | Size in rem's.
|
61 |
| -rem :: Number -> Size Rel |
62 |
| -rem i = Size (value i <> fromString "rem") |
| 74 | +rem :: Number -> Size LengthUnit |
| 75 | +rem i = BasicSize (value i <> fromString "rem") |
63 | 76 |
|
64 | 77 | -- | Size in vw's (1vw = 1% of viewport width).
|
65 |
| -vw :: Number -> Size Rel |
66 |
| -vw i = Size (value i <> fromString "vw") |
| 78 | +vw :: Number -> Size LengthUnit |
| 79 | +vw i = BasicSize (value i <> fromString "vw") |
67 | 80 |
|
68 | 81 | -- | Size in vh's (1vh = 1% of viewport height).
|
69 |
| -vh :: Number -> Size Rel |
70 |
| -vh i = Size (value i <> fromString "vh") |
| 82 | +vh :: Number -> Size LengthUnit |
| 83 | +vh i = BasicSize (value i <> fromString "vh") |
71 | 84 |
|
72 | 85 | -- | Size in vmin's (the smaller of vw or vh).
|
73 |
| -vmin :: Number -> Size Rel |
74 |
| -vmin i = Size (value i <> fromString "vmin") |
| 86 | +vmin :: Number -> Size LengthUnit |
| 87 | +vmin i = BasicSize (value i <> fromString "vmin") |
75 | 88 |
|
76 | 89 | -- | Size in vmax's (the larger of vw or vh).
|
77 |
| -vmax :: Number -> Size Rel |
78 |
| -vmax i = Size (value i <> fromString "vmax") |
| 90 | +vmax :: Number -> Size LengthUnit |
| 91 | +vmax i = BasicSize (value i <> fromString "vmax") |
| 92 | + |
| 93 | +class SizeCombination :: forall a b c. a -> b -> c -> Constraint |
| 94 | +class SizeCombination a b c | a -> c, b -> c |
| 95 | + |
| 96 | +instance SizeCombination Percentage Percentage Percentage |
| 97 | +instance SizeCombination LengthUnit LengthUnit LengthUnit |
| 98 | +instance SizeCombination Percentage LengthUnit Combination |
| 99 | +instance SizeCombination LengthUnit Percentage Combination |
| 100 | + |
| 101 | +infixl 6 calcSum as @+@ |
| 102 | + |
| 103 | +calcSum :: forall a b c. SizeCombination a b c => Size a -> Size b -> Size c |
| 104 | +calcSum a b = SumSize (mkExists a) (mkExists b) |
| 105 | + |
| 106 | +infixl 6 calcDiff as @-@ |
| 107 | + |
| 108 | +calcDiff :: forall a b c. SizeCombination a b c => Size a -> Size b -> Size c |
| 109 | +calcDiff a b = DiffSize (mkExists a) (mkExists b) |
| 110 | + |
| 111 | +infixl 7 calcMult as *@ |
| 112 | + |
| 113 | +calcMult :: forall a. Number -> Size a -> Size a |
| 114 | +calcMult a b = MultSize a $ mkExists b |
| 115 | + |
| 116 | +infixl 7 calcMultFlipped as @* |
| 117 | + |
| 118 | +calcMultFlipped :: forall a. Size a -> Number -> Size a |
| 119 | +calcMultFlipped = flip calcMult |
| 120 | + |
| 121 | +infixl 7 calcDiv as @/ |
| 122 | + |
| 123 | +calcDiv :: forall a. Size a -> Number -> Size a |
| 124 | +calcDiv a b = DivSize b $ mkExists a |
79 | 125 |
|
80 | 126 | sym :: forall a b. (a -> a -> a -> a -> b) -> a -> b
|
81 | 127 | sym f a = f a a a a
|
|
0 commit comments