content: {-# LANGUAGE OverloadedStrings #-}
  -- | This is an example Termonad configuration that shows how to use the
  -- Solarized colour scheme https://ethanschoonover.com/solarized/
  
  module Main where
  
  import Data.Maybe (fromMaybe)
  import Termonad
    ( CursorBlinkMode(CursorBlinkModeOn)
    , Option(Set)
    , ShowScrollbar(ShowScrollbarNever)
    , TMConfig
    , confirmExit
    , cursorBlinkMode
    , defaultConfigOptions
    , defaultTMConfig
    , options
    , showMenu
    , showScrollbar
    , start
    , FontConfig
    , FontSize(FontSizePoints)
    , defaultFontConfig
    , fontConfig
    , fontFamily
    , fontSize
    )
  import Termonad.Config.Colour
    ( AlphaColour
    , ColourConfig
    , Palette(ExtendedPalette)
    , addColourExtension
    , createColour
    , createColourExtension
    , defaultColourConfig
    , defaultStandardColours
    , defaultLightColours
    , backgroundColour
    , foregroundColour
    , palette
    , List8
    , mkList8
    )
  
  -- This is our main 'TMConfig'.  It holds all of the non-colour settings
  -- for Termonad.
  --
  -- This shows how a few settings can be changed.
  myTMConfig :: TMConfig
  myTMConfig =
    defaultTMConfig
      { options =
          defaultConfigOptions
            { showScrollbar = ShowScrollbarNever
            , confirmExit = False
            , showMenu = False
            , cursorBlinkMode = CursorBlinkModeOn
            , fontConfig = fontConf
            }
      }
  
  -- This is our Solarized dark 'ColourConfig'.  It holds all of our dark-related settings.
  solarizedDark :: ColourConfig (AlphaColour Double)
  solarizedDark =
    defaultColourConfig
      -- Set the default foreground colour of text of the terminal.
      { foregroundColour = Set (createColour 131 148 150) -- base0
      , backgroundColour = Set (createColour   0  43  54) -- base03
      -- Set the extended palette that has 2 Vecs of 8 Solarized palette colours
      , palette = ExtendedPalette solarizedDark1 solarizedDark2
      }
    where
      solarizedDark1 :: List8 (AlphaColour Double)
      solarizedDark1 = fromMaybe defaultStandardColours $ mkList8
        [ createColour   7  54  66 -- base02
        , createColour 220  50  47 -- red
        , createColour 133 153   0 -- green
        , createColour 181 137   0 -- yellow
        , createColour  38 139 210 -- blue
        , createColour 211  54 130 -- magenta
        , createColour  42 161 152 -- cyan
        , createColour 238 232 213 -- base2
        ]
  
      solarizedDark2 :: List8 (AlphaColour Double)
      solarizedDark2 = fromMaybe defaultStandardColours $ mkList8
        [ createColour   0  43  54 -- base03
        , createColour 203  75  22 -- orange
        , createColour  88 110 117 -- base01
        , createColour 101 123 131 -- base00
        , createColour 131 148 150 -- base0
        , createColour 108 113 196 -- violet
        , createColour 147 161 161 -- base1
        , createColour 253 246 227 -- base3
        ]
  
  -- This is our Solarized light 'ColourConfig'.  It holds all of our light-related settings.
  solarizedLight :: ColourConfig (AlphaColour Double)
  solarizedLight =
    defaultColourConfig
      -- Set the default foreground colour of text of the terminal.
      { foregroundColour = Set (createColour 101 123 131) -- base00
      , backgroundColour = Set (createColour 253 246 227) -- base3
      -- Set the extended palette that has 2 Vecs of 8 Solarized palette colours
      , palette = ExtendedPalette solarizedLight1 solarizedLight2
      }
    where
      solarizedLight1 :: List8 (AlphaColour Double)
      solarizedLight1 = fromMaybe defaultLightColours $ mkList8
        [ createColour   7  54  66 -- base02
        , createColour 220  50  47 -- red
        , createColour 133 153   0 -- green
        , createColour 181 137   0 -- yellow
        , createColour  38 139 210 -- blue
        , createColour 211  54 130 -- magenta
        , createColour  42 161 152 -- cyan
        , createColour 238 232 213 -- base2
        ]
  
      solarizedLight2 :: List8 (AlphaColour Double)
      solarizedLight2 = fromMaybe defaultLightColours $ mkList8
        [ createColour   0  43  54 -- base03
        , createColour 203  75  22 -- orange
        , createColour  88 110 117 -- base01
        , createColour 101 123 131 -- base00
        , createColour 131 148 150 -- base0
        , createColour 108 113 196 -- violet
        , createColour 147 161 161 -- base1
        , createColour 253 246 227 -- base3
        ]
  
  -- This defines the font for the terminal.
  fontConf :: FontConfig
  fontConf =
    defaultFontConfig
      { fontFamily = "Monospace"
      , fontSize = FontSizePoints 12
      }
  
  main :: IO ()
  main = do
    -- First, create the colour extension based on either Solarized modules.
    myColourExt <- createColourExtension solarizedDark
  
    -- Update 'myTMConfig' with our colour extension.
    let newTMConfig = addColourExtension myTMConfig myColourExt
  
    -- Start Termonad with our updated 'TMConfig'.
    start newTMConfig
  