    -----------------------------------------------------------------------------
    -- |
    -- Module      :  XMonad.Layout.DecorationEx
    -- Description :  Advanced window decorations module for XMonad
    -- Copyright   :  (c) 2007 Andrea Rossato, 2009 Jan Vornberger, 2023 Ilya Portnov
    -- License     :  BSD-style (see xmonad/LICENSE)
    --
    -- Maintainer  :  portnov84@rambler.ru
    -- Stability   :  unstable
    -- Portability :  unportable
    --
    -- This set of modules contains a set of type classes and their implementations
    -- which define a flexible and extensible mechanism of window decorations.
    --
    -- <<https://github.com/xmonad/xmonad-contrib/assets/50166980/ccc20e1b-6762-48d9-8195-579f77a98396>>
    -- Click <https://github.com/xmonad/xmonad-contrib/assets/50166980/64847a85-33c4-4b5f-8ec8-df73d3e4d58d here>
    -- for a larger version.
    --
    -- Within this mechanism, there are the following entities which define
    -- how decorations will look and work:
    --
    -- * Main object is @DecorationEx@ layout modifier. It is from where everything
    --   starts. It creates, shows and hides decoration windows (rectangles) when
    --   needed. It is parameterized with decoration geometry, decoration engine and
    --   theme. It calls these components to do their parts of the work.
    -- * @DecorationGeometry@ defines where decoration rectangles should be placed.
    --   For example, standard horizontal bar above each window; or tab bar.
    -- * @DecorationEngine@ defines how decorations look and how they react on clicks.
    --   Different implementations of the decoration engine can use different APIs
    --   to draw decorations. Within this package, there is one implementation
    --   (@TextDecoration@), which uses plain Xlib calls, and displays decoration
    --   widgets with text fragments, like @[X]@ or @[_]@. Other engines can, for
    --   example, use the Cairo library to draw nice gradients and image-based widgets.
    -- * A Decoration widget is an element placed on a window decoration. It defines how
    --   it looks and how it responds to clicks. Examples include usual window
    --   buttons (minimize, maximize, close), window icon, window title.
    -- * A Decoration theme defines colors and fonts for the decoration engine. It also
    --   contains a list of decoration widgets and says where to place them (at the
    --   left, at the right or in the center).
    --
    -- This mechanism makes major use of parameterized data types and type families,
    -- in order to make it possible to define different types of decorations, and
    -- easily combine different aspects of decorations. For example, each decoration
    -- engine can be combined with each decoration geometry.
    -----------------------------------------------------------------------------

    module XMonad.Layout.DecorationEx (
      -- * Usage:
      -- $usage

      -- * Standard decoration settings
      decorationEx,
      textDecoration, textTabbed, dwmStyleDeco,
      -- * Decoration-related types
      TextDecoration (..), DefaultGeometry (..),
      TabbedGeometry (..), DwmGeometry (..),
      DecorationEx,
      -- * Theme types
      BoxBorders (..), BorderColors,
      SimpleStyle (..), GenericTheme (..),
      ThemeEx,
      -- * Widget types
      StandardCommand (..), GenericWidget (..),
      StandardWidget,
      -- * Utility functions for themes
      themeEx, borderColor, shadowBorder,
      -- * Convinience re-exports
      Shrinker (..), shrinkText,
      -- * Standard widgets
      titleW, toggleStickyW, minimizeW,
      maximizeW, closeW, dwmpromoteW,
      moveToNextGroupW, moveToPrevGroupW
      ) where

    import XMonad.Layout.Decoration
    import XMonad.Layout.DecorationEx.Common
    import XMonad.Layout.DecorationEx.Widgets
    import XMonad.Layout.DecorationEx.Geometry
    import XMonad.Layout.DecorationEx.LayoutModifier
    import XMonad.Layout.DecorationEx.TextEngine
    import XMonad.Layout.DecorationEx.TabbedGeometry
    import XMonad.Layout.DecorationEx.DwmGeometry

    -- $usage
    --
    -- You can use this module with the following in your
    -- @xmonad.hs@:
    --
    -- > import XMonad.Layout.DecorationEx
    -- Then edit your @layoutHook@ by adding the DwmStyle decoration to
    -- your layout:
    --
    -- > myTheme = ThemeEx {...}
    -- > myL = textDecoration shrinkText myTheme (layoutHook def)
    -- > main = xmonad def { layoutHook = myL }
    --
    -- For more detailed instructions on editing the layoutHook see:
    --
    -- "XMonad.Doc.Extending#Editing_the_layout_hook"
    --
    -- This module exports only some definitions from it's submodules,
    -- most likely to be used from user configurations. To define
    -- your own decoration types you will likely have to import specific
    -- submodules.