{-# LANGUAGE OverloadedStrings #-}
-----------------------------------------------------------------------------
-- |
-- Module      : Hasmin.Properties
-- Copyright   : (c) 2017 Cristian Adrián Ontivero
-- License     : BSD3
-- Stability   : experimental
-- Portability : unknown
--
-----------------------------------------------------------------------------
module Hasmin.Properties
    ( PropertyInfo(..)
    , Inheritance(..)
    , propertiesTraits
    ) where

import Control.Applicative ((<|>))
import Data.Attoparsec.Text (parseOnly)
import Data.Text (Text)
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map

import Hasmin.Types.Value
import Hasmin.Parser.Value

data Inheritance = Inherited | NonInherited
  deriving (Eq, Show)

data PropertyInfo =
      PropertyInfo { initialValues :: Maybe Values
                   , inheritance   :: Inheritance
                   , overwrittenBy :: [Text] -- shorthands that overwrite it
                   , subproperties :: [Text] -- longhands that can be merged into it
                   } deriving (Show)

-- | Map relating property names to information regarding the property.
propertiesTraits :: Map Text PropertyInfo
propertiesTraits = Map.fromList $ processTuples
    [("align-content",                      "stretch",                 NonInherited, mempty, mempty)
    ,("align-items",                        "stretch",                 NonInherited, mempty, mempty)
    ,("align-self",                         "auto",                    NonInherited, mempty, mempty)
    ,("all",                                mempty,                    NonInherited, mempty, mempty) -- No practical initial value
    ,("animation",                          mempty,                    NonInherited, mempty,
        ["animation-name", "animation-duration", "animation-timing-function",
        "animation-delay", "animation-iteration-count", "animation-direction",
        "animation-fill-mode", "animation-play-state"])
    ,("animation-delay",                    "0s",                       NonInherited, ["animation"], mempty) -- experimental
    ,("animation-direction",                "normal",                   NonInherited, ["animation"], mempty) -- experimental
    ,("animation-duration",                 "0s",                       NonInherited, mempty, mempty) -- experimental
    ,("animation-fill-mode",                "none",                     NonInherited, ["animation"], mempty) -- experimental
    ,("animation-iteration-count",          "1",                        NonInherited, ["animation"], mempty) -- experimental
    ,("animation-name",                     "none",                     NonInherited, ["animation"], mempty) -- experimental
    ,("animation-play-state",               "running",                  NonInherited, ["animation"], mempty) -- experimental
    ,("animation-timing-function",          "ease",                     NonInherited, ["animation"], mempty) -- experimental
    ,("backface-visibility",                "visible",                  NonInherited, mempty, mempty)
    ,("-webkit-backface-visibility",        "visible",                  NonInherited, mempty, mempty)
    ,("backdrop-filter",                    "none",                     NonInherited, mempty, mempty) -- experimental
    ,("-webkit-backdrop-filter",            "none",                     NonInherited, mempty, mempty) -- experimental
    ,("background",                         mempty {-shorthand-},       NonInherited, mempty,
        ["background-image", "background-position", "background-size",
        "background-repeat", "background-origin", "background-clip",
        "background-attachment", "background-color"])
    ,("background-attachment",              "scroll",                   NonInherited, ["background"], mempty)
    ,("background-blend-mode",              "normal",                   NonInherited, mempty, mempty) -- TODO find out if these mempty are alright!
    ,("background-clip",                    "border-box",               NonInherited, ["background"], mempty)
    ,("-webkit-background-clip",            "border-box",               NonInherited, ["background"], mempty)
    ,("background-color",                   "transparent",              NonInherited, ["background"], mempty)
    ,("background-image",                   "none",                     NonInherited, ["background"], mempty)
    ,("background-origin",                  "padding-box",              NonInherited, ["background"], mempty)
    ,("background-position",                mempty,                     NonInherited, ["background"], ["background-position-x", "background-position-y"]) --shorthand
    ,("background-position-x",              "left",                     NonInherited, ["background", "background-position"], mempty)
    ,("background-position-inline",         mempty {-not applicable-},  NonInherited, mempty, mempty)
    ,("background-position-block",          mempty {-not applicable-},  NonInherited, mempty, mempty)
    ,("background-position-y",              "top",                      NonInherited, ["background", "background-position"], mempty)
    ,("background-repeat",                  "repeat",                   NonInherited, ["background"], mempty)
    ,("background-size",                    "auto",                     NonInherited, ["background"], mempty)
    ,("block-size",                         "auto",                     NonInherited, mempty, mempty) -- experimental
    ,("border",                             "medium none currentcolor", NonInherited, mempty, ["border-width", "border-style", "border-color"]) -- shorthand!
    -- border-block-* would go here
    ,("border-bottom",                      "medium none currentcolor", NonInherited, ["border"],
        ["border-bottom-color", "border-bottom-style", "border-bottom-width"]) -- shorthand!
    ,("border-bottom-color",                "currentcolor",             NonInherited, ["border", "border-color", "border-bottom"], mempty)
    ,("border-bottom-left-radius",          "0",                        NonInherited, ["border-radius"], mempty)
    ,("border-bottom-right-radius",         "0",                        NonInherited, ["border-radius"], mempty)
    ,("border-bottom-style",                "none",                     NonInherited, ["border", "border-style", "border-bottom"], mempty)
    ,("border-bottom-width",                "medium",                   NonInherited, ["border", "border-width", "border-bottom"], mempty)
    ,("border-collapse",                    "separate",                 Inherited, mempty, mempty)
    ,("border-color",                       mempty,                     NonInherited, ["border"],
        ["border-top-color", "border-right-color", "border-bottom-color",
        "border-left-color"]) -- shorthand!
    ,("border-image",                       mempty,                     NonInherited, ["border"],
        ["border-image-source", "border-image-slice", "border-image-width",
        "border-image-outset", "border-image-repeat"]) -- shorthand
    ,("border-image-outset",                "0",                        NonInherited, ["border", "border-image"], mempty)
    ,("border-image-repeat",                "stretch",                  NonInherited, ["border", "border-image"], mempty)
    ,("border-image-slice",                 "100%",                     NonInherited, ["border", "border-image"], mempty)
    ,("border-image-source",                "none",                     NonInherited, ["border", "border-image"], mempty)
    ,("border-image-width",                 "1",                        NonInherited, ["border", "border-image"], mempty)
    -- border-inline-* would go here
    ,("border-left",                        "medium none currentcolor", NonInherited, ["border"], ["border-left-color", "border-left-style", "border-left-width"]) -- shorthand!
    ,("border-left-color",                  "currentcolor",             NonInherited, ["border", "border-color", "border-left"], mempty)
    ,("border-left-style",                  "none",                     NonInherited, ["border", "border-style", "border-left"], mempty)
    ,("border-left-width",                  "medium",                   NonInherited, ["border", "border-width", "border-left"], mempty)
    ,("border-radius",                      mempty {-shorthand-},       NonInherited, mempty,
        ["border-top-left-radius","border-top-right-radius","border-bottom-right-radius","border-bottom-left-radius"])
    ,("border-right",                       "medium none currentcolor", NonInherited, ["border"],
        ["border-right-color", "border-right-style", "border-right-width"]) -- shorthand!
    ,("border-right-color",                 "currentcolor",             NonInherited, ["border", "border-color", "border-right"], mempty)
    ,("border-right-style",                 "none",                     NonInherited, ["border", "border-style", "border-right"], mempty)
    ,("border-right-width",                 "medium",                   NonInherited, ["border", "border-width", "border-right"], mempty)
    ,("border-spacing",                     "0",                        Inherited, mempty, mempty)
    ,("border-style",                       mempty {-shorthand-},       NonInherited, ["border"], ["border-top-style", "border-right-style", "border-bottom-style", "border-left-style"])
    ,("border-top",                         "medium none currentcolor", NonInherited, ["border"], ["border-top-color", "border-top-style", "border-top-width"]) -- shorthand
    ,("border-top-color",                   "currentcolor",             NonInherited, ["border", "border-color", "border-top"], mempty)
    ,("border-top-style",                   "none",                     NonInherited, ["border", "border-style", "border-top"], mempty)
    ,("border-top-width",                   "medium",                   NonInherited, ["border", "border-style", "border-top"], mempty)
    ,("border-top-left-radius",             "0",                        NonInherited, ["border-radius"], mempty)
    ,("border-top-right-radius",            "0",                        NonInherited, ["border-radius"], mempty)
    ,("border-width",                       mempty {-shorthand-},       NonInherited, ["border"], ["border-top-width", "border-right-width", "border-bottom-width", "border-left-width"])
    ,("bottom",                             "auto",                     NonInherited, mempty, mempty)
    ,("box-decoration-break",               "slice",                    NonInherited, mempty, mempty) -- experimental
    ,("-webkit-box-decoration-break",       "slice",                    NonInherited, mempty, mempty) -- experimental
    ,("-o-box-decoration-break",            "slice",                    NonInherited, mempty, mempty) -- experimental
    ,("box-shadow",                         "none",                     NonInherited, mempty, mempty)
    ,("-webkit-box-shadow",                 "none",                     NonInherited, mempty, mempty)
    ,("box-sizing",                         "content-box",              NonInherited, mempty, mempty) -- experimental
    ,("-webkit-box-sizing",                 "content-box",              NonInherited, mempty, mempty) -- experimental
    ,("-moz-box-sizing",                    "content-box",              NonInherited, mempty, mempty) -- experimental
    ,("break-after",                        "auto",                     NonInherited, mempty, mempty)
    ,("break-before",                       "auto",                     NonInherited, mempty, mempty)
    ,("break-inside",                       "auto",                     NonInherited, mempty, mempty)
    ,("caption-side",                       "top",                      Inherited, mempty, mempty)
    ,("caret-color",                        "auto",                     Inherited, mempty, mempty)
    ,("clear",                              "none",                     NonInherited, mempty, mempty)
    ,("clip",                               "auto",                     NonInherited, mempty, mempty) -- deprecated!
    ,("color",                              mempty {-UA dependent-},    Inherited, mempty, mempty)
    ,("column-count",                       "auto",                     NonInherited, ["columns"], mempty)
    ,("column-fill",                        "balance",                  NonInherited, mempty, mempty)
    ,("column-gap",                         "normal",                   NonInherited, mempty, mempty)
    ,("column-rule",                        "medium none currentcolor", NonInherited, mempty,
        ["column-rule-color", "column-rule-style", "column-rule-width"]) -- shorthand
    ,("column-rule-color",                  "currentcolor",             NonInherited, ["column-rule"], mempty)
    ,("column-rule-style",                  "none",                     NonInherited, ["column-rule"], mempty)
    ,("column-rule-width",                  "medium",                   NonInherited, ["column-rule"], mempty)
    ,("column-span",                        "none",                     NonInherited, mempty, mempty)
    ,("column-width",                       "auto",                     NonInherited, ["columns"], mempty)
    ,("columns",                            mempty {-shorthand-},       NonInherited, mempty, ["column-width", "column-count"])
    ,("content",                            "normal",                   NonInherited, mempty, mempty)
    ,("counter-increment",                  "none",                     NonInherited, mempty, mempty)
    ,("counter-reset",                      "none",                     NonInherited, mempty, mempty)
    ,("cursor",                             "auto",                     Inherited, mempty, mempty)
    ,("direction",                          "ltr",                      Inherited, mempty, mempty)
    ,("display",                            "inline",                   NonInherited, mempty, mempty)
    ,("empty-cells",                        "show",                     Inherited, mempty, mempty)
    ,("filter",                             "none",                     NonInherited, mempty, mempty) -- experimental
    ,("-webkit-filter",                     "none",                     NonInherited, mempty, mempty) -- experimental
    ,("flex",                               mempty {-shorthand-},       NonInherited, mempty, ["flex-grow", "flex-shrink", "flex-basis"])
    ,("flex-basis",                         "auto",                     NonInherited, ["flex"], mempty)
    ,("flex-direction",                     "row",                      NonInherited, ["flex-flow"], mempty)
    ,("flex-flow",                          "row nowrap",               NonInherited, mempty, ["flex-direction", "flex-wrap"]) -- shorthand
    ,("flex-grow",                          "0",                        NonInherited, ["flex"], mempty)
    ,("flex-shrink",                        "1",                        NonInherited, ["flex"], mempty)
    ,("flex-wrap",                          "nowrap", NonInherited, ["flex-flow"], mempty)
    ,("float",                              "none", NonInherited, mempty, mempty)

    -- It seems it's neither inherited nor not inherited. It's not even a
    -- property, but an @font-face "descriptor".
    ,("font-display",                       "auto", NonInherited, mempty, mempty)

    ,("font-family",                        mempty {-UA dependent-}, Inherited, ["font"], mempty)
    ,("font-feature-settings",              "normal", Inherited, mempty, mempty)
    ,("font-kerning",                       "auto", Inherited, ["font"], mempty)
    ,("font-language-override",             "normal", Inherited, ["font"], mempty)
    ,("font",                               mempty {-shorthand-}, Inherited, mempty, ["font-style", "font-variant", "font-weight", "font-stretch", "font-size", "line-height", "font-family"])
    ,("font-size-adjust",                   "none", Inherited, ["font"], mempty)
    ,("font-size",                          "medium", Inherited, ["font"], mempty)
    ,("font-stretch",                       "normal", Inherited, ["font"], mempty)
    ,("font-style",                         "normal", Inherited, ["font"], mempty)
    ,("font-synthesis",                     "weight style", Inherited, mempty, mempty)
    ,("font-variant-alternates",            "normal", Inherited, mempty, mempty)
    ,("font-variant-caps",                  "normal", Inherited, mempty, mempty)
    ,("font-variant-east-asian",            "normal", Inherited, mempty, mempty)
    ,("font-variant-ligatures",             "normal", Inherited, mempty, mempty)
    ,("font-variant",                       "normal", Inherited, ["font"], mempty)
    ,("font-variant-numeric",               "normal", Inherited, mempty, mempty)
    ,("font-variant-position",              "normal", Inherited, mempty, mempty)
    ,("font-weight",                        "normal", Inherited, ["font"], mempty)
    ,("grid",                               mempty {-shorthand-}, NonInherited, mempty, ["grid-template-rows", "grid-template-columns", "grid-template-areas", "grid-auto-rows", "grid-auto-columns", "grid-auto-flow", "grid-column-gap", "grid-row-gap"])-- shorthand, experimental
    ,("grid-area",                          mempty {-shorthand-}, NonInherited, mempty, ["grid-row-start", "grid-row-end", "grid-column-start", "grid-column-end"])  -- shorthand, experimental
    ,("grid-auto-columns",                  "auto", NonInherited, mempty, mempty) -- experimental
    ,("-ms-grid-auto-columns",              "auto", NonInherited, mempty, mempty) -- experimental
    ,("-webkit-grid-auto-columns",          "auto", NonInherited, mempty, mempty) -- experimental
    ,("grid-auto-flow",                     "row", NonInherited, mempty, mempty) -- experimental
    ,("-webkit-grid-auto-flow",             "row", NonInherited, mempty, mempty) -- experimental
    ,("grid-auto-rows",                     "auto", NonInherited, mempty, mempty) -- experimental
    ,("-ms-grid-auto-rows",                 "auto", NonInherited, mempty, mempty) -- experimental
    ,("-webkit-grid-auto-rows",             "auto", NonInherited, mempty, mempty) -- experimental
    ,("grid-column",                        mempty {-shorthand-}, NonInherited, mempty, ["grid-column-start", "grid-column-end"])
    ,("grid-column-end",                    "auto", NonInherited, ["grid-column", "grid-area"], mempty) -- experimental
    ,("-ms-grid-column-end",                "auto", NonInherited, ["grid-column", "grid-area"], mempty) -- experimental
    ,("-webkit-grid-column-end",            "auto", NonInherited, ["grid-column", "grid-area"], mempty) -- experimental
    ,("grid-column-gap",                    "0", NonInherited, ["grid-gap"], mempty)
    ,("-ms-grid-column-gap",                "0", NonInherited, ["grid-gap"], mempty)
    ,("grid-column-start",                  "auto", NonInherited, mempty, mempty) -- experimental
    ,("-ms-grid-column-start",              "auto", NonInherited, mempty, mempty) -- experimental
    ,("-webkit-grid-column-start",          "auto", NonInherited, mempty, mempty) -- experimental
    ,("grid-gap",                           mempty {-shorthand-}, NonInherited, mempty, ["grid-row-gap", "grid-column-gap"])
    ,("grid-row",                           mempty {-shorthand-}, NonInherited, mempty, ["grid-row-start", "grid-row-end"])
    ,("grid-row-end",                       "auto", NonInherited, ["grid-row", "grid-area"], mempty)
    ,("-ms-grid-row-end",                   "auto", NonInherited, ["grid-row", "grid-area"], mempty)
    ,("-webkit-grid-row-end",               "auto", NonInherited, ["grid-row", "grid-area"], mempty)
    ,("grid-row-gap",                       "0", NonInherited, ["grid-gap"], mempty)
    ,("-webkit-grid-row-gap",               "0", NonInherited, ["grid-gap"], mempty)
    ,("grid-row-start",                     "auto", NonInherited, ["grid-row", "grid-area"], mempty)
    ,("-ms-grid-row-start",                 "auto", NonInherited, ["grid-row", "grid-area"], mempty)
    ,("-webkit-grid-row-start",             "auto", NonInherited, ["grid-row", "grid-area"], mempty)
    ,("grid-template",                      mempty {-shorthand-}, NonInherited, mempty, ["grid-template-columns", "grid-template-rows", "grid-template-areas"])
    ,("grid-template-areas",                "none", NonInherited, ["grid-template"], mempty)
    ,("-webkit-grid-template-areas",        "none", NonInherited, ["grid-template"], mempty)
    ,("grid-template-columns",              "none", NonInherited, ["grid-template"], mempty)
    ,("-ms-grid-template-columns",          "none", NonInherited, ["grid-template"], mempty)
    ,("-webkit-grid-template-columns",      "none", NonInherited, ["grid-template"], mempty)
    ,("grid-template-rows",                 "none", NonInherited, ["grid-template"], mempty)
    ,("-ms-grid-template-rows",             "none", NonInherited, ["grid-template"], mempty)
    ,("-webkit-grid-template-rows",         "none", NonInherited, ["grid-template"], mempty)
    ,("height",                             "auto", NonInherited, mempty, mempty)
    ,("hyphens",                            "manual",      NonInherited, mempty, mempty)
    -- ,("image-orientation" --experimental
    -- ,("image-rendering" --experimental
    -- ,("inline-size", -- experimental
    ,("isolation",                          "auto", NonInherited, mempty, mempty)
    ,("justify-content",                    "flex-start", NonInherited, mempty, mempty)
    ,("left",                               "auto", NonInherited, mempty, mempty)
    ,("letter-spacing",                     "normal", Inherited, mempty, mempty)
    ,("line-break",                         "auto", NonInherited, mempty, mempty)
    ,("line-height",                        "normal", Inherited, ["font"], mempty)
    ,("list-style",                         "none disc outside", Inherited, mempty, ["list-style-type", "list-style-position", "list-style-image"]) -- none must go first, for entropy reasons.
    ,("list-style-image",                   "none", Inherited, ["list-style"], mempty)
    ,("list-style-position",                "outside", Inherited, ["list-style"], mempty)
    ,("list-style-type",                    "disc", Inherited, ["list-style"], mempty)
    ,("margin",                             mempty {-shorthand-}, NonInherited, mempty, ["margin-top", "margin-right", "margin-bottom", "margin-left"]) -- shorthand
    -- ,("margin-block-* -- experimental
    ,("margin-bottom",                      "0", NonInherited, ["margin"], mempty)
    -- ,("margin-inline-*" --experimental
    ,("margin-left",                        "0", NonInherited, ["margin"], mempty)
    ,("margin-right",                       "0", NonInherited, ["margin"], mempty)
    ,("margin-top",                         "0", NonInherited, ["margin"], mempty)
    ,("mask",                               mempty {-shorthand-}, NonInherited, mempty, ["mask-clip", "mask-origin", "mask-border"])
    ,("mask-border",                        mempty {-shorthand-}, NonInherited, ["mask"], ["mask-border-source", "mask-border-slice", "mask-border-width", "mask-border-outset", "mask-border-repeat"])
    ,("mask-border-outset",                 "0", NonInherited, ["mask", "mask-border"], mempty)
    ,("mask-border-repeat",                 "stretch", NonInherited, ["mask", "mask-border"], mempty)
    ,("mask-border-slice",                  "0", NonInherited, ["mask", "mask-border"], mempty)
    ,("mask-border-source",                 "none", NonInherited, ["mask", "mask-border"], mempty)
    ,("mask-border-width",                  "auto", NonInherited, ["mask", "mask-border"], mempty)
    ,("mask-clip",                          "border-box", NonInherited, ["mask"], mempty) -- experimental
    ,("-webkit-mask-clip",                  "border-box", NonInherited, ["mask"], mempty) -- experimental
    ,("mask-composite",                     "add", NonInherited, ["mask"], mempty) -- experimental
    ,("mask-image",                         "none", NonInherited, ["mask"], mempty) -- experimental
    ,("-webkit-mask-image",                 "none", NonInherited, ["mask"], mempty) -- experimental
    -- ,("mask-mode",                 "match-source", NonInherited) -- experimental, no support
    ,("mask-origin",                        "border-box", NonInherited, ["mask"], mempty) -- experimental
    ,("-webkit-mask-origin",                "border-box", NonInherited, ["mask"], mempty) -- experimental
    ,("mask-position",                      "center", NonInherited, ["mask"], mempty) -- experimental
    ,("-webkit-mask-position",              "center", NonInherited, ["mask"], mempty) -- experimental
    ,("mask-repeat",                        "no-repeat", NonInherited, ["mask"], mempty) -- experimental
    ,("-webkit-mask-repeat",                "no-repeat", NonInherited, ["mask"], mempty) -- experimental
    ,("mask-size",                          "auto", NonInherited, ["mask"], mempty) -- experimental
    ,("mask-type",                          "luminance", NonInherited, mempty, mempty) -- experimental
    -- ,("max-block-size",         ("0", NonInherited)) -- experimental
    ,("max-height",                         "none", NonInherited, mempty, mempty)
    -- ,("max-inline-size",        ("0", NonInherited)) -- experimental
    ,("max-width",                          "none", NonInherited, mempty, mempty)
    -- ,("min-block-size",         ("0", NonInherited)) -- experimental
    ,("min-height",                         "0", NonInherited, mempty, mempty)
    -- ,("min-inline-size",        ("0", NonInherited)) -- experimental
    ,("min-width",                          "0", NonInherited, mempty, mempty)
    ,("mix-blend-mode",                     "normal", NonInherited, mempty, mempty)
    ,("object-fit",                         "fill", Inherited, mempty, mempty)
    ,("object-position",                    "50% 50%", Inherited, mempty, mempty)
    -- ,("offset-*",                        ("auto", NonInherited)) -- experimental
    ,("opacity",                            "1", NonInherited, mempty, mempty)
    ,("order",                              "0", NonInherited, mempty, mempty)
    ,("orphans",                            "2", Inherited, mempty, mempty)
    ,("outline",                            "medium none invert", NonInherited, mempty, ["outline-width", "outline-style", "outline-color"]) -- shorthand
    ,("outline-color",                      "invert" , NonInherited, ["outline"], mempty)
    ,("outline-offset",                     "0", NonInherited, mempty, mempty)
    ,("outline-style",                      "none", NonInherited, ["outline"], mempty)
    ,("outline-width",                      "medium", NonInherited, ["outline"], mempty)
    ,("overflow",                           "visible", NonInherited, mempty, mempty)
    ,("overflow-wrap",                      "normal", Inherited, mempty, mempty) -- also called word-wrap
    ,("overflow-x",                         "visible", NonInherited, ["overflow"], mempty) -- experimental
    ,("overflow-y",                         "visible", NonInherited, ["overflow"], mempty) -- experimental
    ,("overscroll-behavior",                "auto", NonInherited, mempty, ["overscroll-behavior-x", "overscroll-behavior-y"]) -- experimental, shorthand
    ,("overscroll-behavior-x",              "auto", NonInherited, ["overscroll-behavior"], mempty) -- experimental
    ,("overscroll-behavior-y",              "auto", NonInherited, ["overscroll-behavior"], mempty) -- experimental
    ,("padding",                            mempty {-shorthand-}, NonInherited, mempty, ["padding-top", "padding-right", "padding-bottom", "padding-left"])
    -- ,("padding-block*",          ("0", NonInherited)) -- experimental
    ,("padding-bottom",                     "0", NonInherited, ["padding"], mempty)
    -- ,("padding-inline-*",                ("0", NonInherited)) -- experimental
    ,("padding-left",                       "0", NonInherited, ["padding"], mempty)
    ,("padding-right",                      "0", NonInherited, ["padding"], mempty)
    ,("padding-top",                        "0", NonInherited, ["padding"], mempty)
    ,("page-break-after",                   "auto", NonInherited, mempty, mempty)
    ,("page-break-before",                  "auto", NonInherited, mempty, mempty)
    ,("page-break-inside",                  "auto", NonInherited, mempty, mempty)
    ,("perspective",                        "none", NonInherited, mempty, mempty) -- experimental
    ,("perspective-origin",                 "50% 50%", NonInherited, mempty, mempty) -- experimental
    ,("pointer-events",                     "auto", Inherited, mempty, mempty)
    ,("position",                           "static", NonInherited, mempty, mempty)
    ,("quotes",                             mempty {-UA dependent-}, Inherited, mempty, mempty)
    ,("resize",                             "none", NonInherited, mempty, mempty)
    ,("right",                              "auto", NonInherited, mempty, mempty)
    -- ,("ruby-*", -- experimental
    ,("scroll-behavior",                    "auto", NonInherited, mempty, mempty)
    -- ,("scroll-snap-coordinate", ("none", NonInherited)) -- experimental
    -- ,("scroll-snap-destination",("0 0", NonInherited)) -- experimental, actually 0px 0px
    -- ,("scroll-snap-type", -- experimental
    ,("shape-image-threshold",              "0", NonInherited, mempty, mempty)
    ,("shape-margin",                       "0", NonInherited, mempty, mempty)
    ,("shape-outside",                      "none", NonInherited, mempty, mempty)
    ,("tab-size",                           "8", Inherited, mempty, mempty) -- experimental
    ,("-moz-tab-size",                      "8", Inherited, mempty, mempty) -- experimental
    ,("-o-tab-size",                        "8", Inherited, mempty, mempty) -- experimental
    ,("table-layout",                       "auto", NonInherited, mempty, mempty)
    ,("text-align",                         "start", NonInherited, mempty, mempty)
    ,("text-align-last",                    "auto", Inherited, mempty, mempty) -- experimental
    ,("text-combine-upright",               "none", Inherited, mempty, mempty) -- experimental
    ,("-webkit-text-combine-upright",       "none", Inherited, mempty, mempty) -- experimental
    ,("text-decoration",                    "currentcolor solid none", NonInherited, mempty, ["text-decoration-color", "text-decoration-style", "text-decoration-line"]) -- shorthand
    ,("text-decoration-color",              "currentcolor", NonInherited, ["text-decoration"], mempty)
    ,("text-decoration-line",               "none", NonInherited, ["text-decoration"], mempty)
    ,("text-decoration-style",              "solid", NonInherited, ["text-decoration"], mempty)
    ,("text-emphasis",                      "none currentcolor", NonInherited, mempty, ["text-emphasis-color", "text-emphasis-style"]) -- shorthand
    ,("text-emphasis-color",                "currentcolor", NonInherited, ["text-emphasis"], mempty)
    ,("text-emphasis-position",             "over right", NonInherited, mempty, mempty)
    ,("text-emphasis-style",                "none", NonInherited, ["text-emphasis"], mempty)
    ,("text-indent",                        "0", Inherited, mempty, mempty)
    ,("text-orientation",                   "mixed", Inherited, mempty, mempty) -- experimental
    ,("-webkit-text-orientation",           "mixed", Inherited, mempty, mempty) -- experimental
    ,("text-overflow",                      "clip", NonInherited, mempty, mempty)
    ,("text-rendering",                     "auto", Inherited, mempty, mempty)
    ,("text-shadow",                        "none", Inherited, mempty, mempty)
    ,("text-transform",                     "none", Inherited, mempty, mempty)
    ,("text-underline-position",            "auto", Inherited, mempty, mempty)
    ,("top",                                "auto", NonInherited, mempty, mempty)
    ,("touch-action",                       "auto", NonInherited, mempty, mempty)
    ,("transform",                          "none", NonInherited, mempty, mempty) -- experimental!
    ,("-webkit-transform",                  "none", NonInherited, mempty, mempty) -- experimental!
    ,("transform-box",                      "border-box", NonInherited, mempty, mempty) -- experimental!
    ,("transform-origin",                   mempty {-"50% 50% 0"-}, NonInherited, mempty, mempty) -- experimental!
    ,("-webkit-transform-origin",           mempty {-"50% 50% 0"-}, NonInherited, mempty, mempty) -- experimental!
    ,("transform-style",                    "flat", NonInherited, mempty, mempty) -- experimental!
    ,("-webkit-transform-style",            "flat", NonInherited, mempty, mempty) -- experimental!
    ,("transition",                         mempty {-shorthand-}, NonInherited, mempty,
        ["transition-property", "transition-duration",
        "transition-timing-function", "transition-delay"])
    ,("transition-delay",                   "0s", NonInherited, ["transition"], mempty) -- experimental
    ,("transition-duration",                "0s", NonInherited, ["transition"], mempty) -- experimental
    ,("-webkit-transition-duration",        "0s", NonInherited, ["transition"], mempty) -- experimental
    ,("-o-transition-duration",             "0s", NonInherited, ["transition"], mempty) -- experimental
    ,("-webkit-transition-delay",           "0s", NonInherited, ["transition"], mempty) -- experimental
    ,("transition-property",                "all", NonInherited, ["transition"], mempty) -- experimental
    ,("-webkit-transition-property",        "all", NonInherited, ["transition"], mempty) -- experimental
    ,("-o-transition-property",             "all", NonInherited, ["transition"], mempty) -- experimental
    ,("transition-timing-function",         "ease", NonInherited, ["transition"], mempty) -- experimental
    ,("-webkit-transition-timing-function", "ease", NonInherited, ["transition"], mempty) -- experimental
    ,("unicode-bidi",                       "normal", NonInherited, mempty, mempty)
    ,("user-select",                        "none", NonInherited, mempty, mempty) -- experimental
    ,("-moz-user-select",                   "none", NonInherited, mempty, mempty) -- experimental
    ,("-webkit-user-select",                "none", NonInherited, mempty, mempty) -- experimental
    ,("-ms-user-select",                    "none", NonInherited, mempty, mempty) -- experimental
    ,("vertical-align",                     "baseline", NonInherited, mempty, mempty)
    ,("white-space",                        "normal", Inherited, mempty, mempty)
    ,("widows",                             "2", Inherited, mempty, mempty)
    ,("width",                              "auto", NonInherited, mempty, mempty)
    ,("will-change",                        "auto", NonInherited, mempty, mempty)
    ,("word-break",                         "normal", Inherited, mempty, mempty)
    ,("word-spacing",                       "normal", Inherited, mempty, mempty)
    ,("writing-mode",                       "horizontal-tb", Inherited, mempty, mempty) -- experimental
    ,("-ms-writing-mode",                   "horizontal-tb", Inherited, mempty, mempty) -- experimental
    ,("-webkit-writing-mode",               "horizontal-tb", Inherited, mempty, mempty) -- experimental
    ,("z-index",                            "auto", NonInherited, mempty, mempty)
    ]
  where
    -- Converts the tuples with CSS properties data into a tuple containing a
    -- property's name, and its traits. Allows keeping the table in a more readable
    -- and maintainable format.
    processTuples :: [(Text, Text, Inheritance, [Text], [Text])] -> [(Text, PropertyInfo)]
    processTuples = foldr (\(p,t,i,a,b) xs -> (p, PropertyInfo (getValues p t) i a b) : xs) []
    getValues p s = case parseOnly (valuesFor p <|> valuesFallback) s of
                      Right initValues -> Just initValues
                      Left _           -> Nothing