module Bulma where {- This file is a wrapper around the BULMA css framework. -} import Prelude import Halogen.HTML as HH import DOM.HTML.Indexed as DHI import Halogen.HTML.Properties as HP import Halogen.HTML.Events as HE import Halogen.HTML.Properties.ARIA as ARIA import CSSClasses as C -- HTML PropName used with HP.prop import Halogen.HTML.Core (AttrName(..)) --import Halogen.HTML.Core (PropName(..)) -- import Web.Event.Event (type_, Event, EventType(..)) --import Web.UIEvent.MouseEvent (MouseEvent) columns :: forall (w :: Type) (i :: Type). Array HH.ClassName -> Array (HH.HTML w i) -> HH.HTML w i columns classes = HH.div [ HP.classes (C.columns <> classes) ] columns_ :: forall (w :: Type) (i :: Type). Array (HH.HTML w i) -> HH.HTML w i columns_ = columns [] column :: forall (w :: Type) (i :: Type). Array HH.ClassName -> Array (HH.HTML w i) -> HH.HTML w i column classes = HH.div [ HP.classes (C.column <> classes) ] column_ :: forall (w :: Type) (i :: Type). Array (HH.HTML w i) -> HH.HTML w i column_ = column [] h1 :: forall (w :: Type) (a :: Type). String -> HH.HTML w a h1 title = HH.h1 [ HP.classes (C.title) ] [ HH.text title ] h3 :: forall (w :: Type) (a :: Type). String -> HH.HTML w a h3 title = HH.h1 [ HP.classes (C.title <> C.is5) ] [ HH.text title ] --subtitle :: forall (w :: Type) (a :: Type). String -> HH.HTML w a --subtitle title = HH.h2 [ HP.classes (C.subtitle <> C.is4) ] [ HH.text title ] -- --hdiv :: forall (w :: Type) (a :: Type). Array (HH.HTML w a) -> HH.HTML w a --hdiv = HH.div [ HP.classes [HH.ClassName "mt-5"] ] -- --offcolumn :: forall (w :: Type) (a :: Type). -- Int -> Int -> Array (HH.HTML w a) -> HH.HTML w a --offcolumn 0 size = HH.div [ HP.classes [HH.ClassName ("mt-"<>show size)] ] --offcolumn offset size -- = column [ HH.ClassName ("is-offset-" <> (show offset) <> " is-" <> (show size)) ] input_classes :: forall (r :: Row Type) (i :: Type). Boolean -> HP.IProp ( class :: String | r ) i input_classes true = HP.classes [ HH.ClassName "input is-small is-info" ] input_classes false = HP.classes [ HH.ClassName "input is-small is-danger" ] btn_classes :: forall (r :: Row Type) (i :: Type) . Boolean -> HP.IProp ( class :: String | r ) i btn_classes true = HP.classes [ HH.ClassName "button is-small is-info" ] btn_classes false = HP.classes [ HH.ClassName "button is-small is-danger" ] --simple_table_header :: forall w i. HH.HTML w i --simple_table_header -- = HH.thead_ [ HH.tr_ [ HH.th [ HP.style "width: 50px;" ] [ HH.text "Type" ] -- , HH.th_ [ HH.text "Domain" ] -- , HH.th_ [ HH.text "TTL" ] -- , HH.th_ [ HH.text "Value" ] -- ] -- ] -- --mx_table_header :: forall w i. HH.HTML w i --mx_table_header -- = HH.thead_ [ HH.tr_ [ HH.th_ [ HH.text "Domain" ] -- , HH.th_ [ HH.text "TTL" ] -- , HH.th_ [ HH.text "Priority" ] -- , HH.th_ [ HH.text "Value" ] -- ] -- ] -- --srv_table_header :: forall w i. HH.HTML w i --srv_table_header -- = HH.thead_ [ HH.tr_ [ HH.th_ [ HH.text "Domain" ] -- , HH.th_ [ HH.text "TTL" ] -- , HH.th_ [ HH.text "Priority" ] -- , HH.th_ [ HH.text "Weight" ] -- , HH.th_ [ HH.text "Port" ] -- , HH.th_ [ HH.text "Value" ] -- ] -- ] -- --txt_name :: forall w i. String -> HH.HTML w i --txt_name t -- = HH.td [ rr_name_style ] [ rr_name_text ] -- where -- rr_name_style = HP.style "width: 80px;" -- rr_name_text = HH.text t input_email :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i input_email action "" validity = HH.input [ HE.onValueInput action, HP.placeholder "email", input_classes validity ] input_email action email validity = HH.input [ HE.onValueInput action , HP.value email , HP.placeholder "email" , input_classes validity ] box_input_email :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i box_input_email action email validity = HH.label [ ] [ HH.label [HP.classes C.label ] [ HH.text "Email" ] , HH.div [HP.classes C.control ] [ input_email action email validity ] ] input_password :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i input_password action "" validity = HH.input [ HE.onValueInput action, HP.placeholder "password", input_classes validity ] input_password action password validity = HH.input [ HE.onValueInput action , HP.value password , HP.placeholder "password" , input_classes validity ] box_input_password :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i box_input_password action password validity = HH.label [ ] [ HH.label [HP.classes C.label ] [ HH.text "Password" ] , HH.div [HP.classes C.control ] [ input_password action password validity ] ] ---- TODO: right types ---- input_domain :: forall a w i ---- . (String -> a) ---- -> String ---- -> Boolean ---- -> HH.HTML w i --input_domain :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i --input_domain action domain validity -- = HH.input -- [ HE.onValueInput action -- , HP.value domain -- , HP.placeholder "domain" -- , input_classes validity -- ] -- --box_input_domain :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i --box_input_domain action domain validity = HH.label [ ] -- [ HH.label [HP.classes C.label ] [ HH.text "Domain" ] -- , HH.div [HP.classes C.control ] [ input_domain action domain validity ] -- ] -- --input_ttl :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i --input_ttl action ttl validity -- = HH.input -- [ HE.onValueInput action -- , HP.value ttl -- , HP.prop (PropName "size") 6.0 -- , HP.placeholder "ttl" -- , input_classes validity -- ] -- --box_input_ttl :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i --box_input_ttl action value validity = HH.label [ ] -- [ HH.label [HP.classes C.label ] [ HH.text "TTL" ] -- , HH.div [HP.classes C.control ] [ input_ttl action value validity ] -- ] -- -- --input_priority :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i --input_priority action priority validity -- = HH.input -- [ HE.onValueInput action -- , HP.value priority -- , HP.prop (PropName "size") 6.0 -- , HP.placeholder "priority" -- , input_classes validity -- ] -- --box_input_priority :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i --box_input_priority action value validity = HH.label [ ] -- [ HH.label [HP.classes C.label ] [ HH.text "Priority" ] -- , HH.div [HP.classes C.control ] [ input_priority action value validity ] -- ] -- -- --input_value :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i --input_value action value validity -- = HH.input -- [ HE.onValueInput action -- , HP.value value -- , HP.placeholder "value" -- , input_classes validity -- ] -- --box_input_value :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i --box_input_value action value validity = HH.label [ ] -- [ HH.label [HP.classes C.label ] [ HH.text "Value" ] -- , HH.div [HP.classes C.control ] [ input_value action value validity ] -- ] -- -- --input_weight :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i --input_weight action weight validity -- = HH.input -- [ HE.onValueInput action -- , HP.value weight -- , HP.prop (PropName "size") 6.0 -- , HP.placeholder "weight" -- , input_classes validity -- ] -- --box_input_weight :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i --box_input_weight action weight validity = HH.label [ ] -- [ HH.label [HP.classes C.label ] [ HH.text "Weight" ] -- , HH.div [HP.classes C.control ] [ input_weight action weight validity ] -- ] -- -- --input_port :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i --input_port action port validity -- = HH.input -- [ HE.onValueInput action -- , HP.value port -- , HP.prop (PropName "size") 6.0 -- , HP.placeholder "port" -- , input_classes validity -- ] -- --box_input_port :: forall w i. (String -> i) -> String -> Boolean -> HH.HTML w i --box_input_port action port validity = HH.label [ ] -- [ HH.label [HP.classes C.label ] [ HH.text "Port" ] -- , HH.div [HP.classes C.control ] [ input_port action port validity ] -- ] -- -- --btn_change :: forall w i. i -> i -> Boolean -> Boolean -> HH.HTML w i --btn_change action1 action2 modified validity -- = HH.button -- [ HP.disabled (not modified) -- , btn_change_action validity -- , btn_classes validity -- ] [ HH.text "fix" ] -- where -- -- btn_change_action = case _ of -- true -> HE.onClick \_ -> action1 -- _ -> HE.onClick \_ -> action2 -- -- --btn_delete :: forall w i. (MouseEvent -> i) -> HH.HTML w i --btn_delete action -- = HH.button -- [ HE.onClick action -- , HP.classes [ HH.ClassName "button is-small is-danger" ] -- ] [ HH.text "X" ] -- -- --btn_add :: forall w i. i -> i -> Boolean -> HH.HTML w i --btn_add action1 action2 validity -- = HH.button -- [ btn_add_action validity -- , btn_classes validity -- ] [ HH.text "Add" ] -- where -- -- btn_add_action = case _ of -- true -> HE.onClick \_ -> action1 -- _ -> HE.onClick \_ -> action2 btn :: forall w action. String -> action -> action -> Boolean -> HH.HTML w action btn title action1 action2 validity = HH.button [ btn_add_action validity , btn_classes validity ] [ HH.text title ] where btn_add_action = case _ of true -> HE.onClick \_ -> action1 _ -> HE.onClick \_ -> action2 render_input password placeholder action value validity cond = HH.input $ [ HE.onValueInput action , HP.value value , HP.placeholder placeholder , input_classes validity , cond ] <> case password of false -> [] true -> [ HP.type_ HP.InputPassword ] field_inner ispassword title placeholder action value validity cond = div_field [ div_field_label title , div_field_content $ render_input ispassword placeholder action value validity cond ] where div_field = HH.div [ HP.classes (C.field <> C.horizontal) ] div_field_label title = HH.div [ HP.classes (C.field_label <> C.normal) ] [HH.label [ HP.classes C.label ] [ HH.text title ]] div_field_content content = HH.div [HP.classes C.field_body] [ HH.div [HP.classes C.field ] [ HH.div [HP.classes C.control ] [ content ] ] ] box_input = field_inner false box_password = field_inner true section_medium :: forall w i. Array (HH.HTML w i) -> HH.HTML w i section_medium = HH.section [ HP.classes (C.section <> C.medium) ] field :: forall w i. Array HH.ClassName -> Array (HH.HTML w i) -> HH.HTML w i field classes = HH.div [ HP.classes (C.field <> classes) ] new_domain_field inputaction text selectaction accepted_domains = field C.has_addons [ HH.p [ HP.classes C.control ] [ HH.input $ [ HE.onValueInput inputaction , HP.placeholder "www" , HP.value text , HP.type_ HP.InputText , HP.classes (C.is_primary <> C.input) ] ] , HH.p [ HP.classes C.control ] [ select selectaction $ map option accepted_domains ] , HH.p [ HP.classes C.control ] [ HH.button [ HP.type_ HP.ButtonSubmit , HP.classes C.button ] [ HH.text "add a new domain!" ] ] ] --box_button action value validity cond -- = HH.label [ ] -- [ HH.label [HP.classes C.label ] [ HH.text title ] -- , HH.div [HP.classes C.control ] -- [ render_input ispassword placeholder action value validity cond ] -- ] p :: forall w i. String -> HH.HTML w i p str = HH.p_ [ HH.text str ] box :: forall w i. Array (HH.HTML w i) -> HH.HTML w i box = HH.div [HP.classes C.box] option :: forall w i. String -> HH.HTML w i option value = HH.option_ [HH.text value] select :: forall w i. HH.Node DHI.HTMLselect w i select action options = HH.div [ HP.classes (C.select <> C.is_primary) ] [ HH.select action options] hero :: forall w i. String -> String -> HH.HTML w i hero title subtitle = HH.section [ HP.classes (C.hero <> C.is_info <> C.is_small) ] [ HH.div [ HP.classes C.hero_body ] [ HH.p [ HP.classes C.title ] [ HH.text title ] , HH.p [ HP.classes C.subtitle ] [ HH.text subtitle ] ] ] header :: forall w i. String -> String -> HH.HTML w i header = hero container :: forall w i. Array (HH.HTML w i) -> HH.HTML w i container = HH.div [HP.classes (C.container <> C.is_info)] data_target :: forall r i. String -> HP.IProp r i data_target = HP.attr (AttrName "data-target") modal_domain_delete :: forall w i. String -> HH.HTML w i modal_domain_delete domain = modal [ modal_background , modal_card [modal_header, modal_body] , modal_foot [modal_delete_button, modal_cancel_button] ] where modal = HH.div [HP.classes (C.modal <> C.is_active)] modal_background = HH.div [HP.classes C.modal_background] [] modal_card = HH.div [HP.classes C.modal_card] modal_header = HH.header [HP.classes C.modal_card_head] [ HH.p [HP.classes C.modal_card_title] [HH.text "Deleting a domain"] --, HH.button [HP.classes C.delete, ARIA.label "close"] [] ] modal_body = HH.section [HP.classes C.modal_card_body] [ warning_message ] modal_foot = HH.div [HP.classes C.modal_card_foot] modal_delete_button = HH.button [HP.classes (C.button <> C.is_success)] [HH.text "Delete the domain."] modal_cancel_button = HH.button [HP.classes C.button] [HH.text "Cancel"] warning_message = HH.p [] [ HH.text $ "You are about to delete your domain '" <> domain <> "'. Are you sure you want to do this? This is " , HH.strong_ [ HH.text "irreversible" ] , HH.text "." ] netlibre_navbar :: forall w i. HH.HTML w i netlibre_navbar = main_nav [ nav_brand [ logo, burger_menu ] , nav_menu [ navbar_start [ link_domains , dropdown "List of something" [ dropdown_element "something 1" , dropdown_element "something 2" , dropdown_element "something 3" , dropdown_separator , dropdown_element "something 4" ] ] , navbar_end [ navbar_item [ HH.div [HP.classes C.buttons] [ nav_button_strong "Register" , nav_button_light "Login" ] ] ] ] ] where main_nav = HH.nav [ HP.classes C.navbar, ARIA.label "main navigation", ARIA.role "navigation" ] logo = HH.a [HP.classes C.navbar_item, HP.href "/"] [HH.img [HP.src "/logo.jpeg", HP.width 112, HP.height 28]] burger_menu = HH.a [HP.classes C.navbar_burger, ARIA.label "menu", ARIA.expanded "false", data_target "navbarExample" ] [ HH.span [ARIA.hidden "true"] [] , HH.span [ARIA.hidden "true"] [] , HH.span [ARIA.hidden "true"] [] ] nav_brand = HH.div [HP.classes C.navbar_brand] nav_menu = HH.div [HP.id "navbarExample", HP.classes C.navbar_menu] navbar_start = HH.div [HP.classes C.navbar_start] navbar_end = HH.div [HP.classes C.navbar_end] link_domains = HH.a [HP.classes C.navbar_item] [HH.text "My Domains"] dropdown title dropdown_elements = HH.div [HP.classes (C.navbar_item <> C.has_dropdown <> C.is_hoverable)] [ dropdown_title title, HH.div [HP.classes C.navbar_dropdown] dropdown_elements ] dropdown_title str = HH.a [HP.classes C.navbar_link] [HH.text str] dropdown_element str = HH.a [HP.classes C.navbar_item] [HH.text str] dropdown_separator = HH.hr [HP.classes C.navbar_divider] nav_button_strong str = HH.a [HP.classes (C.button <> C.is_primary)] [HH.strong [] [HH.text str]] nav_button_light str = HH.a [HP.classes (C.button <> C.is_light)] [HH.text str] navbar_item = HH.div [HP.classes C.navbar_item]