{-# LANGUAGE LambdaCase #-}
module Web.Atomic.Types.Selector where
import Data.String (IsString (..))
import Data.Text (Text, pack)
import Data.Text qualified as T
import GHC.Exts (IsList (..))
import Web.Atomic.Types.ClassName
newtype Selector = Selector {Selector -> Text
text :: Text}
deriving (Selector -> Selector -> Bool
(Selector -> Selector -> Bool)
-> (Selector -> Selector -> Bool) -> Eq Selector
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Selector -> Selector -> Bool
== :: Selector -> Selector -> Bool
$c/= :: Selector -> Selector -> Bool
/= :: Selector -> Selector -> Bool
Eq, Eq Selector
Eq Selector =>
(Selector -> Selector -> Ordering)
-> (Selector -> Selector -> Bool)
-> (Selector -> Selector -> Bool)
-> (Selector -> Selector -> Bool)
-> (Selector -> Selector -> Bool)
-> (Selector -> Selector -> Selector)
-> (Selector -> Selector -> Selector)
-> Ord Selector
Selector -> Selector -> Bool
Selector -> Selector -> Ordering
Selector -> Selector -> Selector
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Selector -> Selector -> Ordering
compare :: Selector -> Selector -> Ordering
$c< :: Selector -> Selector -> Bool
< :: Selector -> Selector -> Bool
$c<= :: Selector -> Selector -> Bool
<= :: Selector -> Selector -> Bool
$c> :: Selector -> Selector -> Bool
> :: Selector -> Selector -> Bool
$c>= :: Selector -> Selector -> Bool
>= :: Selector -> Selector -> Bool
$cmax :: Selector -> Selector -> Selector
max :: Selector -> Selector -> Selector
$cmin :: Selector -> Selector -> Selector
min :: Selector -> Selector -> Selector
Ord, Int -> Selector -> ShowS
[Selector] -> ShowS
Selector -> String
(Int -> Selector -> ShowS)
-> (Selector -> String) -> ([Selector] -> ShowS) -> Show Selector
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Selector -> ShowS
showsPrec :: Int -> Selector -> ShowS
$cshow :: Selector -> String
show :: Selector -> String
$cshowList :: [Selector] -> ShowS
showList :: [Selector] -> ShowS
Show)
deriving newtype (String -> Selector
(String -> Selector) -> IsString Selector
forall a. (String -> a) -> IsString a
$cfromString :: String -> Selector
fromString :: String -> Selector
IsString, NonEmpty Selector -> Selector
Selector -> Selector -> Selector
(Selector -> Selector -> Selector)
-> (NonEmpty Selector -> Selector)
-> (forall b. Integral b => b -> Selector -> Selector)
-> Semigroup Selector
forall b. Integral b => b -> Selector -> Selector
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: Selector -> Selector -> Selector
<> :: Selector -> Selector -> Selector
$csconcat :: NonEmpty Selector -> Selector
sconcat :: NonEmpty Selector -> Selector
$cstimes :: forall b. Integral b => b -> Selector -> Selector
stimes :: forall b. Integral b => b -> Selector -> Selector
Semigroup, Semigroup Selector
Selector
Semigroup Selector =>
Selector
-> (Selector -> Selector -> Selector)
-> ([Selector] -> Selector)
-> Monoid Selector
[Selector] -> Selector
Selector -> Selector -> Selector
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: Selector
mempty :: Selector
$cmappend :: Selector -> Selector -> Selector
mappend :: Selector -> Selector -> Selector
$cmconcat :: [Selector] -> Selector
mconcat :: [Selector] -> Selector
Monoid)
selector :: ClassName -> Selector
selector :: ClassName -> Selector
selector (ClassName Text
c) =
Text -> Selector
Selector (Text -> Selector) -> Text -> Selector
forall a b. (a -> b) -> a -> b
$ Text
"." Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> Text
clean Text
c
where
clean :: Text -> Text
clean Text
t = HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
":" Text
"\\:" Text
t
data Pseudo = Pseudo {Pseudo -> ClassName
name :: ClassName, Pseudo -> Selector
suffix :: Selector}
deriving (Int -> Pseudo -> ShowS
[Pseudo] -> ShowS
Pseudo -> String
(Int -> Pseudo -> ShowS)
-> (Pseudo -> String) -> ([Pseudo] -> ShowS) -> Show Pseudo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Pseudo -> ShowS
showsPrec :: Int -> Pseudo -> ShowS
$cshow :: Pseudo -> String
show :: Pseudo -> String
$cshowList :: [Pseudo] -> ShowS
showList :: [Pseudo] -> ShowS
Show, Pseudo -> Pseudo -> Bool
(Pseudo -> Pseudo -> Bool)
-> (Pseudo -> Pseudo -> Bool) -> Eq Pseudo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Pseudo -> Pseudo -> Bool
== :: Pseudo -> Pseudo -> Bool
$c/= :: Pseudo -> Pseudo -> Bool
/= :: Pseudo -> Pseudo -> Bool
Eq, Eq Pseudo
Eq Pseudo =>
(Pseudo -> Pseudo -> Ordering)
-> (Pseudo -> Pseudo -> Bool)
-> (Pseudo -> Pseudo -> Bool)
-> (Pseudo -> Pseudo -> Bool)
-> (Pseudo -> Pseudo -> Bool)
-> (Pseudo -> Pseudo -> Pseudo)
-> (Pseudo -> Pseudo -> Pseudo)
-> Ord Pseudo
Pseudo -> Pseudo -> Bool
Pseudo -> Pseudo -> Ordering
Pseudo -> Pseudo -> Pseudo
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Pseudo -> Pseudo -> Ordering
compare :: Pseudo -> Pseudo -> Ordering
$c< :: Pseudo -> Pseudo -> Bool
< :: Pseudo -> Pseudo -> Bool
$c<= :: Pseudo -> Pseudo -> Bool
<= :: Pseudo -> Pseudo -> Bool
$c> :: Pseudo -> Pseudo -> Bool
> :: Pseudo -> Pseudo -> Bool
$c>= :: Pseudo -> Pseudo -> Bool
>= :: Pseudo -> Pseudo -> Bool
$cmax :: Pseudo -> Pseudo -> Pseudo
max :: Pseudo -> Pseudo -> Pseudo
$cmin :: Pseudo -> Pseudo -> Pseudo
min :: Pseudo -> Pseudo -> Pseudo
Ord)
instance IsString Pseudo where
fromString :: String -> Pseudo
fromString String
s =
let c :: ClassName
c = String -> ClassName
forall a. IsString a => String -> a
fromString String
s
in ClassName -> Selector -> Pseudo
Pseudo ClassName
c (Selector
":" Selector -> Selector -> Selector
forall a. Semigroup a => a -> a -> a
<> Text -> Selector
Selector (String -> Text
pack String
s))
instance ToClassName Pseudo where
toClassName :: Pseudo -> ClassName
toClassName Pseudo
p = Pseudo
p.name
newtype MediaQuery = MediaQuery {MediaQuery -> [Text]
conditions :: [Text]}
deriving (MediaQuery -> MediaQuery -> Bool
(MediaQuery -> MediaQuery -> Bool)
-> (MediaQuery -> MediaQuery -> Bool) -> Eq MediaQuery
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MediaQuery -> MediaQuery -> Bool
== :: MediaQuery -> MediaQuery -> Bool
$c/= :: MediaQuery -> MediaQuery -> Bool
/= :: MediaQuery -> MediaQuery -> Bool
Eq, Int -> MediaQuery -> ShowS
[MediaQuery] -> ShowS
MediaQuery -> String
(Int -> MediaQuery -> ShowS)
-> (MediaQuery -> String)
-> ([MediaQuery] -> ShowS)
-> Show MediaQuery
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MediaQuery -> ShowS
showsPrec :: Int -> MediaQuery -> ShowS
$cshow :: MediaQuery -> String
show :: MediaQuery -> String
$cshowList :: [MediaQuery] -> ShowS
showList :: [MediaQuery] -> ShowS
Show)
deriving newtype (Semigroup MediaQuery
MediaQuery
Semigroup MediaQuery =>
MediaQuery
-> (MediaQuery -> MediaQuery -> MediaQuery)
-> ([MediaQuery] -> MediaQuery)
-> Monoid MediaQuery
[MediaQuery] -> MediaQuery
MediaQuery -> MediaQuery -> MediaQuery
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: MediaQuery
mempty :: MediaQuery
$cmappend :: MediaQuery -> MediaQuery -> MediaQuery
mappend :: MediaQuery -> MediaQuery -> MediaQuery
$cmconcat :: [MediaQuery] -> MediaQuery
mconcat :: [MediaQuery] -> MediaQuery
Monoid, NonEmpty MediaQuery -> MediaQuery
MediaQuery -> MediaQuery -> MediaQuery
(MediaQuery -> MediaQuery -> MediaQuery)
-> (NonEmpty MediaQuery -> MediaQuery)
-> (forall b. Integral b => b -> MediaQuery -> MediaQuery)
-> Semigroup MediaQuery
forall b. Integral b => b -> MediaQuery -> MediaQuery
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: MediaQuery -> MediaQuery -> MediaQuery
<> :: MediaQuery -> MediaQuery -> MediaQuery
$csconcat :: NonEmpty MediaQuery -> MediaQuery
sconcat :: NonEmpty MediaQuery -> MediaQuery
$cstimes :: forall b. Integral b => b -> MediaQuery -> MediaQuery
stimes :: forall b. Integral b => b -> MediaQuery -> MediaQuery
Semigroup)
instance IsString MediaQuery where
fromString :: String -> MediaQuery
fromString String
s = [Text] -> MediaQuery
MediaQuery [String -> Text
pack String
s]
instance IsList MediaQuery where
type Item MediaQuery = Text
fromList :: [Item MediaQuery] -> MediaQuery
fromList = [Item MediaQuery] -> MediaQuery
[Text] -> MediaQuery
MediaQuery
toList :: MediaQuery -> [Item MediaQuery]
toList = (.conditions)
data Media
= MinWidth Int
| MaxWidth Int
deriving (Media -> Media -> Bool
(Media -> Media -> Bool) -> (Media -> Media -> Bool) -> Eq Media
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Media -> Media -> Bool
== :: Media -> Media -> Bool
$c/= :: Media -> Media -> Bool
/= :: Media -> Media -> Bool
Eq, Eq Media
Eq Media =>
(Media -> Media -> Ordering)
-> (Media -> Media -> Bool)
-> (Media -> Media -> Bool)
-> (Media -> Media -> Bool)
-> (Media -> Media -> Bool)
-> (Media -> Media -> Media)
-> (Media -> Media -> Media)
-> Ord Media
Media -> Media -> Bool
Media -> Media -> Ordering
Media -> Media -> Media
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Media -> Media -> Ordering
compare :: Media -> Media -> Ordering
$c< :: Media -> Media -> Bool
< :: Media -> Media -> Bool
$c<= :: Media -> Media -> Bool
<= :: Media -> Media -> Bool
$c> :: Media -> Media -> Bool
> :: Media -> Media -> Bool
$c>= :: Media -> Media -> Bool
>= :: Media -> Media -> Bool
$cmax :: Media -> Media -> Media
max :: Media -> Media -> Media
$cmin :: Media -> Media -> Media
min :: Media -> Media -> Media
Ord, Int -> Media -> ShowS
[Media] -> ShowS
Media -> String
(Int -> Media -> ShowS)
-> (Media -> String) -> ([Media] -> ShowS) -> Show Media
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Media -> ShowS
showsPrec :: Int -> Media -> ShowS
$cshow :: Media -> String
show :: Media -> String
$cshowList :: [Media] -> ShowS
showList :: [Media] -> ShowS
Show)
instance ToClassName Media where
toClassName :: Media -> ClassName
toClassName = \case
MinWidth Int
mn ->
Text -> ClassName
className (Text -> ClassName) -> Text -> ClassName
forall a b. (a -> b) -> a -> b
$ Text
"mmnw" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> (String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
show Int
mn)
MaxWidth Int
mx ->
Text -> ClassName
className (Text -> ClassName) -> Text -> ClassName
forall a b. (a -> b) -> a -> b
$ Text
"mmxw" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> (String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
show Int
mx)
mediaCriteria :: Media -> MediaQuery
mediaCriteria :: Media -> MediaQuery
mediaCriteria (MinWidth Int
n) = [Text] -> MediaQuery
MediaQuery [Text
"min-width: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> (String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
show Int
n) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"px"]
mediaCriteria (MaxWidth Int
n) = [Text] -> MediaQuery
MediaQuery [Text
"max-width: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> (String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
show Int
n) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"px"]