{-# OPTIONS_GHC -Wno-missing-role-annotations #-}
{-# OPTIONS_GHC -Wno-term-variable-capture #-}

module Dashi.Components.ActionBar where

import Clay hiding
    ( area
    , fullWidth
    , left
    , legend
    , name
    , not
    , option
    , required
    , right
    , selected
    , span_
    , type_
    )
import Clay qualified
import Dashi.Prelude hiding (Left, Right, has, (#), (&), (**), (|>))
import Dashi.Style.Tokens
import Dashi.Style.Util
import Miso.Html.Element (div_)
import Miso.Html.Property (class_)

data Area
    = Left
    | Centre
    | Right
    deriving stock (Area -> Area -> Bool
(Area -> Area -> Bool) -> (Area -> Area -> Bool) -> Eq Area
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Area -> Area -> Bool
== :: Area -> Area -> Bool
$c/= :: Area -> Area -> Bool
/= :: Area -> Area -> Bool
Eq, Eq Area
Eq Area =>
(Area -> Area -> Ordering)
-> (Area -> Area -> Bool)
-> (Area -> Area -> Bool)
-> (Area -> Area -> Bool)
-> (Area -> Area -> Bool)
-> (Area -> Area -> Area)
-> (Area -> Area -> Area)
-> Ord Area
Area -> Area -> Bool
Area -> Area -> Ordering
Area -> Area -> Area
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 :: Area -> Area -> Ordering
compare :: Area -> Area -> Ordering
$c< :: Area -> Area -> Bool
< :: Area -> Area -> Bool
$c<= :: Area -> Area -> Bool
<= :: Area -> Area -> Bool
$c> :: Area -> Area -> Bool
> :: Area -> Area -> Bool
$c>= :: Area -> Area -> Bool
>= :: Area -> Area -> Bool
$cmax :: Area -> Area -> Area
max :: Area -> Area -> Area
$cmin :: Area -> Area -> Area
min :: Area -> Area -> Area
Ord, Area
Area -> Area -> Bounded Area
forall a. a -> a -> Bounded a
$cminBound :: Area
minBound :: Area
$cmaxBound :: Area
maxBound :: Area
Bounded, Int -> Area
Area -> Int
Area -> [Area]
Area -> Area
Area -> Area -> [Area]
Area -> Area -> Area -> [Area]
(Area -> Area)
-> (Area -> Area)
-> (Int -> Area)
-> (Area -> Int)
-> (Area -> [Area])
-> (Area -> Area -> [Area])
-> (Area -> Area -> [Area])
-> (Area -> Area -> Area -> [Area])
-> Enum Area
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Area -> Area
succ :: Area -> Area
$cpred :: Area -> Area
pred :: Area -> Area
$ctoEnum :: Int -> Area
toEnum :: Int -> Area
$cfromEnum :: Area -> Int
fromEnum :: Area -> Int
$cenumFrom :: Area -> [Area]
enumFrom :: Area -> [Area]
$cenumFromThen :: Area -> Area -> [Area]
enumFromThen :: Area -> Area -> [Area]
$cenumFromTo :: Area -> Area -> [Area]
enumFromTo :: Area -> Area -> [Area]
$cenumFromThenTo :: Area -> Area -> Area -> [Area]
enumFromThenTo :: Area -> Area -> Area -> [Area]
Enum)

instance Token Area where
    tokenName :: forall s. (IsString s, Semigroup s) => Area -> s
tokenName Area
Left = s
"left"
    tokenName Area
Centre = s
"centre"
    tokenName Area
Right = s
"right"

data ActionBar model action = ActionBar
    { forall model action. ActionBar model action -> [View model action]
left :: [View model action]
    , forall model action. ActionBar model action -> [View model action]
centre :: [View model action]
    , forall model action. ActionBar model action -> [View model action]
right :: [View model action]
    }

instance Widget (ActionBar model action) model action where
    widget' :: [Attribute action] -> ActionBar model action -> View model action
widget' [Attribute action]
attrs ActionBar{[View model action]
left :: forall model action. ActionBar model action -> [View model action]
centre :: forall model action. ActionBar model action -> [View model action]
right :: forall model action. ActionBar model action -> [View model action]
left :: [View model action]
centre :: [View model action]
right :: [View model action]
..} =
        [Attribute action] -> [View model action] -> View model action
forall action model.
[Attribute action] -> [View model action] -> View model action
div_
            (MisoString -> Attribute action
forall action. MisoString -> Attribute action
class_ MisoString
"action-bar" Attribute action -> [Attribute action] -> [Attribute action]
forall a. a -> [a] -> [a]
: [Attribute action]
attrs)
            ([View model action] -> View model action)
-> ([[View model action]] -> [View model action])
-> [[View model action]]
-> View model action
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [[View model action]] -> [View model action]
forall a. Monoid a => [a] -> a
mconcat
            ([[View model action]] -> View model action)
-> [[View model action]] -> View model action
forall a b. (a -> b) -> a -> b
$ [ [[Attribute action] -> [View model action] -> View model action
forall action model.
[Attribute action] -> [View model action] -> View model action
div_ [Area -> Attribute action
forall t action. Token t => t -> Attribute action
forall action. Area -> Attribute action
tokenAttr Area
Left] [View model action]
left | Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [View model action] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [View model action]
left]
              , [[Attribute action] -> [View model action] -> View model action
forall action model.
[Attribute action] -> [View model action] -> View model action
div_ [Area -> Attribute action
forall t action. Token t => t -> Attribute action
forall action. Area -> Attribute action
tokenAttr Area
Centre] [View model action]
centre | Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [View model action] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [View model action]
centre]
              , [[Attribute action] -> [View model action] -> View model action
forall action model.
[Attribute action] -> [View model action] -> View model action
div_ [Area -> Attribute action
forall t action. Token t => t -> Attribute action
forall action. Area -> Attribute action
tokenAttr Area
Right] [View model action]
right | Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [View model action] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [View model action]
right]
              ]
    style :: Css
style = do
        Selector
forall a. IsString a => a
form Selector -> Css -> Css
? Selector
".action-bar" Selector -> Css -> Css
? Size LengthUnit -> Css
forall a. Size a -> Css
marginTop (Space -> ValueType Space
forall t.
(Token t, Val (ValueType t), Other (ValueType t)) =>
t -> ValueType t
token (Space -> ValueType Space) -> Space -> ValueType Space
forall a b. (a -> b) -> a -> b
$ SizeToken -> Space
Space SizeToken
Medium)
        Selector
".action-bar" Selector -> Css -> Css
? do
            Css
fullWidth
            NonEmpty Refinement -> Refinement
forall a. Semigroup a => NonEmpty a -> a
sconcat (Selector -> Refinement
has (Selector -> Refinement)
-> (Area -> Selector) -> Area -> Refinement
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Selector
"" Selector -> Refinement -> Selector
#) (Refinement -> Selector)
-> (Area -> Refinement) -> Area -> Selector
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Area -> Refinement
forall t. Token t => t -> Refinement
byToken (Area -> Refinement) -> NonEmpty Area -> NonEmpty Refinement
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall t l. (Token t, IsList l, Item l ~ t) => l
allTokens @Area) Refinement -> Css -> Css
& do
                Display -> Css
display Display
grid
                (Area -> Css) -> Css
forall t. Token t => (t -> Css) -> Css
byTokens \Area
area -> do
                    Key MisoString
"grid-area" Key MisoString -> MisoString -> Css
-: Area -> MisoString
forall s. (IsString s, Semigroup s) => Area -> s
forall t s. (Token t, IsString s, Semigroup s) => t -> s
tokenName Area
area
                    Display -> Css
display Display
flex
                    FlexDirection -> Css
flexDirection FlexDirection
row
                    SizeToken -> Css
gap' SizeToken
XSmall
                    JustifyContentValue -> Css
justifyContent (JustifyContentValue -> Css) -> JustifyContentValue -> Css
forall a b. (a -> b) -> a -> b
$ case Area
area of
                        Area
Left -> JustifyContentValue
forall a. FlexStart a => a
flexStart
                        Area
Centre -> JustifyContentValue
forall a. Center a => a
center
                        Area
Right -> JustifyContentValue
forall a. FlexEnd a => a
flexEnd
                [[Value]] -> Css
gridTemplateAreas [Area -> Value
forall s. (IsString s, Semigroup s) => Area -> s
forall t s. (Token t, IsString s, Semigroup s) => t -> s
tokenName (Area -> Value) -> [Area] -> [Value]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall t l. (Token t, IsList l, Item l ~ t) => l
allTokens @Area]
                [Size LengthUnit] -> Css
forall a. [Size a] -> Css
gridTemplateColumns [Number -> Size LengthUnit
fr Number
1, Number -> Size LengthUnit
fr Number
1, Number -> Size LengthUnit
fr Number
1]
            Refinement -> Refinement
forall a. Not a => a -> Refinement
Clay.not (Selector -> Refinement
has (Selector
"" Selector -> Refinement -> Selector
# Area -> Refinement
forall t. Token t => t -> Refinement
byToken Area
Centre)) Refinement -> Css -> Css
& do
                Display -> Css
display Display
flex
                FlexDirection -> Css
flexDirection FlexDirection
row
                AlignItemsValue -> Css
alignItems AlignItemsValue
forall a. Baseline a => a
baseline
                JustifyContentValue -> Css
justifyContent JustifyContentValue
forall a. SpaceBetween a => a
spaceBetween
                Selector
"" Selector -> Css -> Css
? (Area -> Css) -> Css
forall t. Token t => (t -> Css) -> Css
byTokens \case
                    Area
Left -> () -> Css
forall a. a -> StyleM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
                    Area
Centre -> () -> Css
forall a. a -> StyleM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
                    Area
Right -> AlignItemsValue -> Css
alignItems AlignItemsValue
forall a. FlexEnd a => a
flexEnd
            Selector
self Selector -> Selector -> Selector
|> Selector
star Selector -> Css -> Css
? do
                Display -> Css
display Display
flex
                FlexDirection -> Css
flexDirection FlexDirection
row
                SizeToken -> Css
gap' SizeToken
XSmall