-- | -- Module: Data.CSS.Properties.Types -- Copyright: (c) 2013 Ertugrul Soeylemez -- License: BSD3 -- Maintainer: Ertugrul Soeylemez module Data.CSS.Properties.Types ( -- * Lengths Length, AutoLen, FactorLen, -- * Generic CSS types CssString(..), CssUrl(..), -- * Edge-oriented Edge(..), -- * Specific properties -- ** Backgrounds BackgroundAttachment(..), BackgroundRepeat(..), -- ** Borders BorderStyle(..), BorderWidth(..), -- ** Fonts FontFamily(..), FontSize(..), FontStyle(..), FontVariant(..), FontWeight(..), -- ** Generated content ContentPart(..), -- ** Layout ClipMode(..), DisplayMode(..), FloatEdge(..), OverflowMode(..), PositionMode(..), VisibilityMode(..), -- ** Lists ListPosition(..), ListStyle(..), -- ** Paged media PageBreak(..), AnyBreak, InsideBreak, PageSelector(..), -- ** Tables CaptionSide(..), TableLayout(..), -- ** Text TextAlign(..), TextDecoration(..), TextDirection(..), TextTransform(..), TextWrapMode(..), UnicodeBidiMode(..), VerticalAlign(..), -- ** User interface Cursor(..) ) where import Blaze.ByteString.Builder import Blaze.ByteString.Builder.Char8 hiding (fromString) import Control.Lens import Data.ByteString (ByteString) import Data.CSS.Properties.Classes import Data.CSS.Properties.Utils import Data.CSS.Types import Data.CSS.Utils import Data.Data import Data.Foldable (Foldable(fold)) import Data.List import Data.Monoid import Data.String import Data.Text (Text) -- | Length transformer to add automatic lengths. data AutoLen len a = AutoLen | NoAutoLen (len a) deriving (Eq, Ord, Show) instance HasAutoLength (AutoLen len) where autoLen = AutoLen instance (HasLength len) => HasLength (AutoLen len) where _Cm = _NoAutoLen . _Cm _Em = _NoAutoLen . _Em _Ex = _NoAutoLen . _Ex _Mm = _NoAutoLen . _Mm _Px = _NoAutoLen . _Px zeroLen = NoAutoLen zeroLen instance (HasPercent len) => HasPercent (AutoLen len) where _Factor = _NoAutoLen . _Factor instance (ToPropValue (len a)) => ToPropValue (AutoLen len a) where toPropBuilder AutoLen = fromByteString "auto" toPropBuilder (NoAutoLen l) = toPropBuilder l -- | Background attachment. data BackgroundAttachment = FixedBgr -- ^ @fixed@ background. | ScrollBgr -- ^ @scroll@ background. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue BackgroundAttachment where toPropBuilder FixedBgr = fromByteString "fixed" toPropBuilder ScrollBgr = fromByteString "scroll" -- | Background repeating. data BackgroundRepeat = NoRepeat -- ^ @no-repeat@. | Repeat -- ^ @repeat@ both axes. | RepeatX -- ^ @repeat-x@ axis. | RepeatY -- ^ @repeat-y@ axis. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue BackgroundRepeat where toPropBuilder NoRepeat = fromByteString "no-repeat" toPropBuilder Repeat = fromByteString "repeat" toPropBuilder RepeatX = fromByteString "repeat-x" toPropBuilder RepeatY = fromByteString "repeat-y" -- | Border style. data BorderStyle = NoBorder | HiddenBorder | DottedBorder | DashedBorder | SolidBorder | DoubleBorder | GrooveBorder | RidgeBorder | InsetBorder | OutsetBorder deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue BorderStyle where toPropBuilder NoBorder = fromByteString "none" toPropBuilder HiddenBorder = fromByteString "hidden" toPropBuilder DottedBorder = fromByteString "dotted" toPropBuilder DashedBorder = fromByteString "dashed" toPropBuilder SolidBorder = fromByteString "solid" toPropBuilder DoubleBorder = fromByteString "double" toPropBuilder GrooveBorder = fromByteString "groove" toPropBuilder RidgeBorder = fromByteString "ridge" toPropBuilder InsetBorder = fromByteString "inset" toPropBuilder OutsetBorder = fromByteString "outset" -- | Border widths. data BorderWidth a = BorderWidth (Length a) -- ^ Custom border width. | MediumWidth -- ^ Medium border width. | ThickWidth -- ^ Thick border width. | ThinWidth -- ^ Thin border width. deriving (Eq, Ord, Show, Typeable) instance HasLength BorderWidth where _Em = _BorderWidth . _Em _Ex = _BorderWidth . _Ex _Mm = _BorderWidth . _Mm _Px = _BorderWidth . _Px zeroLen = BorderWidth zeroLen instance (Real a) => ToPropValue (BorderWidth a) where toPropBuilder (BorderWidth l) = toPropBuilder l toPropBuilder MediumWidth = fromByteString "medium" toPropBuilder ThickWidth = fromByteString "thick" toPropBuilder ThinWidth = fromByteString "thin" -- | Table caption sides. data CaptionSide = BottomSide -- ^ Table's @bottom@ side. | TopSide -- ^ Table's @top@ side. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue CaptionSide where toPropBuilder BottomSide = fromByteString "bottom" toPropBuilder TopSide = fromByteString "top" -- | Clipping modes. data ClipMode a -- | Rectangular clipping region. = ClipRect (AutoLen Length a) (AutoLen Length a) (AutoLen Length a) (AutoLen Length a) deriving (Eq, Ord, Show, Typeable) instance (Real a) => ToPropValue (ClipMode a) where toPropBuilder (ClipRect t r b l) = fromByteString "rect(" <> toPropBuilder t <> fromChar ',' <> toPropBuilder r <> fromChar ',' <> toPropBuilder b <> fromChar ',' <> toPropBuilder l <> fromChar ')' -- | Parts for the @content@ property. data ContentPart url = AttrPart ByteString -- ^ @attr(x)@ part. | CloseQuotePart -- ^ @close-quote@ part. | CounterPart ByteString (Maybe ListStyle) -- ^ @counter(x, y)@ part. | CountersPart ByteString Text (Maybe ListStyle) -- ^ @counters(x, y)@ part. | NoCloseQuotePart -- ^ @no-close-quote@ part. | NoOpenQuotePart -- ^ @no-open-quote@ part. | OpenQuotePart -- ^ @open-quote@ part. | TextPart (CssString Text) -- ^ Text part. | UriPart url -- ^ @url(x)@ part. deriving (Data, Eq, Functor, Ord, Read, Show, Typeable) instance IsString (ContentPart url) where fromString = TextPart . fromString instance (ToPropValue url) => ToPropValue (ContentPart url) where toPropBuilder part = case part of AttrPart attr -> bs "attr(" <> bs attr <> ch ')' CloseQuotePart -> bs "close-quote" NoCloseQuotePart -> bs "no-close-quote" NoOpenQuotePart -> bs "no-open-quote" OpenQuotePart -> bs "open-quote" UriPart url -> toPropBuilder url CounterPart name (Just DecimalList) -> bs "counter(" <> bs name <> ch ')' CounterPart name style -> bs "counter(" <> bs name <> ch ',' <> maybeBuilder "none" style <> ch ')' CountersPart name sep (Just DecimalList) -> bs "counters(" <> bs name <> ch ',' <> cssString sep <> ch ')' CountersPart name sep style -> bs "counters(" <> bs name <> ch ',' <> cssString sep <> ch ',' <> maybeBuilder "none" style <> ch ')' TextPart text -> toPropBuilder text where bs = fromByteString ch = fromChar -- | CSS strings. newtype CssString a = CssString { getCssString :: a } deriving (Data, Eq, Foldable, Functor, Ord, Read, Show, Traversable, Typeable) instance (IsString a) => IsString (CssString a) where fromString = CssString . fromString instance ToPropValue (CssString Text) where toPropBuilder = cssString . getCssString -- | CSS URLs. newtype CssUrl a = CssUrl { getCssUrl :: a } deriving (Data, Eq, Foldable, Functor, Ord, Read, Show, Traversable, Typeable) instance (IsString a) => IsString (CssUrl a) where fromString = CssUrl . fromString instance ToPropValue (CssUrl Text) where toPropBuilder (CssUrl url) = fromByteString "url(" <> cssString url <> fromChar ')' -- | Cursors. data Cursor url = CrosshairCursor -- ^ @crosshair@ cursor. | CursorFrom [url] -- ^ Cursor from one of the given URLs. | DefaultCursor -- ^ @default@ cursor. | EResizeCursor -- ^ @e-resize@ cursor. | HelpCursor -- ^ @help@ cursor. | MoveCursor -- ^ @move@ cursor. | NResizeCursor -- ^ @n-resize@ cursor. | NeResizeCursor -- ^ @ne-resize@ cursor. | NwResizeCursor -- ^ @nw-resize@ cursor. | PointerCursor -- ^ @pointer@ cursor. | ProgressCursor -- ^ @progress@ cursor. | SResizeCursor -- ^ @s-resize@ cursor. | SeResizeCursor -- ^ @se-resize@ cursor. | SwResizeCursor -- ^ @sw-resize@ cursor. | TextCursor -- ^ @text@ cursor. | WResizeCursor -- ^ @w-resize@ cursor. | WaitCursor -- ^ @wait@ cursor. deriving (Data, Eq, Foldable, Functor, Ord, Read, Show, Typeable, Traversable) instance (ToPropValue url) => ToPropValue (Cursor url) where toPropBuilder CrosshairCursor = fromByteString "crosshair" toPropBuilder DefaultCursor = fromByteString "default" toPropBuilder EResizeCursor = fromByteString "e-resize" toPropBuilder HelpCursor = fromByteString "help" toPropBuilder MoveCursor = fromByteString "move" toPropBuilder NResizeCursor = fromByteString "n-resize" toPropBuilder NeResizeCursor = fromByteString "ne-resize" toPropBuilder NwResizeCursor = fromByteString "nw-resize" toPropBuilder PointerCursor = fromByteString "pointer" toPropBuilder ProgressCursor = fromByteString "progress" toPropBuilder SResizeCursor = fromByteString "s-resize" toPropBuilder SeResizeCursor = fromByteString "se-resize" toPropBuilder SwResizeCursor = fromByteString "sw-resize" toPropBuilder TextCursor = fromByteString "text" toPropBuilder WResizeCursor = fromByteString "w-resize" toPropBuilder WaitCursor = fromByteString "wait" toPropBuilder (CursorFrom us) = fold . intersperse (fromChar ',') . map toPropBuilder $ us -- | Display modes. data DisplayMode = BlockDisplay -- ^ @block@ display. | InlineBlockDisplay -- ^ @inline-block@ display. | InlineDisplay -- ^ @inline@ display. | ListItemDisplay -- ^ @list-item@ display | NoneDisplay -- ^ @none@ display. | TableDisplay -- ^ @table@ display. | InlineTableDisplay -- ^ @inline-table@ display. | TableRowGroupDisplay -- ^ @table-row-group@ display. | TableColumnDisplay -- ^ @table-column@ display. | TableColumnGroupDisplay -- ^ @table-column-group@ display. | TableHeaderGroupDisplay -- ^ @table-header-group@ display. | TableFooterGroupDisplay -- ^ @table-footer-group@ display. | TableRowDisplay -- ^ @table-row@ display. | TableCellDisplay -- ^ @table-cell@ display. | TableCaptionDisplay -- ^ @table-caption@ display. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue DisplayMode where toPropBuilder BlockDisplay = fromByteString "block" toPropBuilder InlineBlockDisplay = fromByteString "inline-block" toPropBuilder InlineDisplay = fromByteString "inline" toPropBuilder InlineTableDisplay = fromByteString "inline-table" toPropBuilder ListItemDisplay = fromByteString "list-item" toPropBuilder NoneDisplay = fromByteString "none" toPropBuilder TableCaptionDisplay = fromByteString "table-caption" toPropBuilder TableCellDisplay = fromByteString "table-cell" toPropBuilder TableColumnDisplay = fromByteString "table-column" toPropBuilder TableColumnGroupDisplay = fromByteString "table-column-group" toPropBuilder TableDisplay = fromByteString "table" toPropBuilder TableFooterGroupDisplay = fromByteString "table-footer-group" toPropBuilder TableHeaderGroupDisplay = fromByteString "table-header-group" toPropBuilder TableRowDisplay = fromByteString "table-row" toPropBuilder TableRowGroupDisplay = fromByteString "table-row-group" -- | Edge-oriented specifications. data Edge a = Edges [a] -- ^ All edges. | BottomEdge a -- ^ Bottom edge. | LeftEdge a -- ^ Left edge. | RightEdge a -- ^ Right edge. | TopEdge a -- ^ Top edge. deriving (Data, Eq, Foldable, Functor, Ord, Read, Show, Traversable, Typeable) -- | Length transformer to add percental lengths. data FactorLen len a = FactorLen a | NoFactorLen (len a) deriving (Eq, Ord, Show) instance (HasAutoLength len) => HasAutoLength (FactorLen len) where autoLen = NoFactorLen autoLen instance (HasLength len) => HasLength (FactorLen len) where _Cm = _NoFactorLen . _Cm _Em = _NoFactorLen . _Em _Ex = _NoFactorLen . _Ex _Mm = _NoFactorLen . _Mm _Px = _NoFactorLen . _Px zeroLen = NoFactorLen zeroLen instance HasPercent (FactorLen len) where _Factor = prism FactorLen ex where ex (FactorLen x) = Right x ex len = Left len instance (Real a, ToPropValue (len a)) => ToPropValue (FactorLen len a) where toPropBuilder (FactorLen x) = showReal (100*x) <> fromChar '%' toPropBuilder (NoFactorLen l) = toPropBuilder l -- | Floating edge. data FloatEdge = LeftFloat | RightFloat deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue FloatEdge where toPropBuilder LeftFloat = fromByteString "left" toPropBuilder RightFloat = fromByteString "right" -- | Font families. data FontFamily = CursiveFont -- ^ Generic @cursive@ font. | FantasyFont -- ^ Generic @fantasy@ font. | MonospaceFont -- ^ Generic @monospace@ font. | SansSerifFont -- ^ Generic @sans-serif@ font. | SerifFont -- ^ Generic @serif@ font. | NamedFont (CssString Text) -- ^ Specific named font. deriving (Data, Eq, Ord, Read, Show, Typeable) instance IsString FontFamily where fromString = NamedFont . fromString instance ToPropValue FontFamily where toPropBuilder CursiveFont = fromByteString "cursive" toPropBuilder FantasyFont = fromByteString "fantasy" toPropBuilder MonospaceFont = fromByteString "monospace" toPropBuilder SansSerifFont = fromByteString "sans-serif" toPropBuilder SerifFont = fromByteString "serif" toPropBuilder (NamedFont ff) = toPropBuilder ff -- | Font sizes. data FontSize a = XXSmallSize -- ^ Absolutely @xx-small@ size. | XSmallSize -- ^ Absolutely @x-small@ size. | SmallSize -- ^ Absolutely @small@ size. | MediumSize -- ^ Absolutely @medium@ size. | LargeSize -- ^ Absolutely @large@ size. | XLargeSize -- ^ Absolutely @x-large@ size. | XXLargeSize -- ^ Absolutely @xx-large@ size. | LargerSize -- ^ Relatively @larger@ size. | SmallerSize -- ^ Relatively @smaller@ size. | LengthSize (FactorLen Length a) -- ^ Specific font size. deriving (Eq, Ord, Show, Typeable) instance HasLength FontSize where _Em = _LengthSize . _Em _Ex = _LengthSize . _Ex _Mm = _LengthSize . _Mm _Px = _LengthSize . _Px zeroLen = LengthSize zeroLen instance HasPercent FontSize where _Factor = _LengthSize . _Factor instance (Real a) => ToPropValue (FontSize a) where toPropBuilder LargeSize = fromByteString "large" toPropBuilder LargerSize = fromByteString "larger" toPropBuilder MediumSize = fromByteString "medium" toPropBuilder SmallSize = fromByteString "small" toPropBuilder SmallerSize = fromByteString "smaller" toPropBuilder XLargeSize = fromByteString "x-large" toPropBuilder XSmallSize = fromByteString "x-small" toPropBuilder XXLargeSize = fromByteString "xx-large" toPropBuilder XXSmallSize = fromByteString "xx-small" toPropBuilder (LengthSize l) = toPropBuilder l -- | Font styles. data FontStyle = ItalicStyle -- ^ Select @italic@ style. | ObliqueStyle -- ^ Select @oblique@ style. | NormalStyle -- ^ Select @normal@ style. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue FontStyle where toPropBuilder ItalicStyle = fromByteString "italic" toPropBuilder ObliqueStyle = fromByteString "oblique" toPropBuilder NormalStyle = fromByteString "normal" -- | Font variants. data FontVariant = NormalVariant -- ^ Select @normal@ font. | SmallCapsVariant -- ^ Select @small-caps@ font. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue FontVariant where toPropBuilder NormalVariant = fromByteString "normal" toPropBuilder SmallCapsVariant = fromByteString "small-caps" -- | Font weight. data FontWeight = BolderWeight -- ^ Relatively @bolder@ font weight. | LighterWeight -- ^ Relatively @lighter@ font weight. | FontWeight Int -- ^ Specific font weight (1-9), 4 = @normal@, 7 = @bold@. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue FontWeight where toPropBuilder BolderWeight = fromByteString "bolder" toPropBuilder LighterWeight = fromByteString "lighter" toPropBuilder (FontWeight 4) = fromByteString "normal" toPropBuilder (FontWeight 7) = fromByteString "bold" toPropBuilder (FontWeight w) = showReal (100*w) -- | Length transformer to add lengths in various CSS units. data Length a = EmLen a -- ^ Font sizes. | ExLen a -- ^ Vertical sizes of the letter @x@. | MmLen a -- ^ Millimeters. | PxLen a -- ^ Pixels. | ZeroLen -- ^ Zero. deriving (Eq, Ord, Show, Typeable) instance HasLength Length where _Em = prism (orZeroLen EmLen) ex where ex (EmLen x) = Right x ex ZeroLen = Right 0 ex len = Left len _Ex = prism (orZeroLen ExLen) ex where ex (ExLen x) = Right x ex ZeroLen = Right 0 ex len = Left len _Mm = prism (orZeroLen MmLen) ex where ex (MmLen x) = Right x ex ZeroLen = Right 0 ex len = Left len _Px = prism (orZeroLen PxLen) ex where ex (PxLen x) = Right x ex ZeroLen = Right 0 ex len = Left len zeroLen = ZeroLen instance (Real a) => ToPropValue (Length a) where toPropBuilder (EmLen x) = showReal x <> fromByteString "em" toPropBuilder (ExLen x) = showReal x <> fromByteString "ex" toPropBuilder (MmLen x) = showReal x <> fromByteString "mm" toPropBuilder (PxLen x) = showReal x <> fromByteString "px" toPropBuilder ZeroLen = fromChar '0' -- | List number/bullet position. data ListPosition = InsideList -- ^ @inside@ the box. | OutsideList -- ^ @outside@ of the box. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue ListPosition where toPropBuilder InsideList = fromByteString "inside" toPropBuilder OutsideList = fromByteString "outside" -- | List number/bullet styles. data ListStyle = ArmenianList -- ^ @armenian@ numbering. | CircleList -- ^ @circle@ bullets. | DecimalLeadingZeroList -- ^ @decimal-leading-zero@ numbering. | DecimalList -- ^ @decimal@ numbering. | DiscList -- ^ @disc@ bullets. | GeorgianList -- ^ @georgian@ numbering. | LowerAlphaList -- ^ @lower-alpha@ numbering. | LowerGreekList -- ^ @lower-greek@ numbering. | LowerLatinList -- ^ @lower-latin@ numbering. | LowerRomanList -- ^ @lower-roman@ numbering. | SquareList -- ^ @square@ bullets. | UpperAlphaList -- ^ @upper-alpha@ numbering. | UpperLatinList -- ^ @upper-latin@ numbering. | UpperRomanList -- ^ @upper-roman@ numbering. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue ListStyle where toPropBuilder ArmenianList = fromByteString "armenian" toPropBuilder CircleList = fromByteString "circle" toPropBuilder DecimalLeadingZeroList = fromByteString "decimal-leading-zero" toPropBuilder DecimalList = fromByteString "decimal" toPropBuilder DiscList = fromByteString "disc" toPropBuilder GeorgianList = fromByteString "georgian" toPropBuilder LowerAlphaList = fromByteString "lower-alpha" toPropBuilder LowerGreekList = fromByteString "lower-greek" toPropBuilder LowerLatinList = fromByteString "lower-latin" toPropBuilder LowerRomanList = fromByteString "lower-roman" toPropBuilder SquareList = fromByteString "square" toPropBuilder UpperAlphaList = fromByteString "upper-alpha" toPropBuilder UpperLatinList = fromByteString "upper-latin" toPropBuilder UpperRomanList = fromByteString "upper-roman" -- | Overflow handling mode. data OverflowMode = AutoOverflow -- ^ @auto@ overflow handling. | HiddenOverflow -- ^ @hidden@ overflow handling. | ScrollOverflow -- ^ @scroll@ overflow handling. | VisibleOverflow -- ^ @visible@ overflow handling. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue OverflowMode where toPropBuilder AutoOverflow = fromByteString "auto" toPropBuilder HiddenOverflow = fromByteString "hidden" toPropBuilder ScrollOverflow = fromByteString "scroll" toPropBuilder VisibleOverflow = fromByteString "visible" -- | Page break rules. data PageBreak :: * -> * where AlwaysBreak :: PageBreak AnyBreak AvoidBreak :: PageBreak InsideBreak LeftBreak :: PageBreak AnyBreak RightBreak :: PageBreak AnyBreak instance ToPropValue (PageBreak a) where toPropBuilder AlwaysBreak = fromByteString "always" toPropBuilder AvoidBreak = fromByteString "avoid" toPropBuilder LeftBreak = fromByteString "left" toPropBuilder RightBreak = fromByteString "right" -- | Page break context: any. data AnyBreak -- | Page break context: @page-break-inside@. data InsideBreak -- | Page selectors for paged media. data PageSelector = AllPages -- ^ Select all pages (@\@page@). | FirstPage -- ^ Select first page (@\@page :first@). | LeftPages -- ^ Select all left pages (@\@page :left@). | RightPages -- ^ Select all right pages (@\@page :right@). deriving (Data, Eq, Ord, Read, Show, Typeable) -- | Position modes. data PositionMode = AbsolutePos -- ^ @absolute@ positioning. | FixedPos -- ^ @fixed@ positioning. | RelativePos -- ^ @relative@ positioning. | StaticPos -- ^ @static@ positioning. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue PositionMode where toPropBuilder AbsolutePos = fromByteString "absolute" toPropBuilder FixedPos = fromByteString "fixed" toPropBuilder RelativePos = fromByteString "relative" toPropBuilder StaticPos = fromByteString "static" -- | Table layout. data TableLayout = AutoLayout -- ^ @auto@ layout. | FixedLayout -- ^ @fixed@ layout. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue TableLayout where toPropBuilder AutoLayout = fromByteString "auto" toPropBuilder FixedLayout = fromByteString "fixed" -- | Text alignment. data TextAlign = CenterAlign -- ^ @center@ alignment. | JustifyAlign -- ^ @justify@ alignment. | LeftAlign -- ^ @left@ alignment. | RightAlign -- ^ @right@ alignment. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue TextAlign where toPropBuilder CenterAlign = fromByteString "center" toPropBuilder JustifyAlign = fromByteString "justify" toPropBuilder LeftAlign = fromByteString "left" toPropBuilder RightAlign = fromByteString "right" -- | Text decoration. data TextDecoration = BlinkText -- ^ @blink@ text. | LineThroughText -- ^ @line-through@ text. | OverlineText -- ^ @overline@ text. | UnderlineText -- ^ @underline@ text. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue TextDecoration where toPropBuilder BlinkText = fromByteString "blink" toPropBuilder LineThroughText = fromByteString "line-through" toPropBuilder OverlineText = fromByteString "overline" toPropBuilder UnderlineText = fromByteString "underline" -- | Text direction. data TextDirection = LeftToRight | RightToLeft deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue TextDirection where toPropBuilder LeftToRight = fromByteString "ltr" toPropBuilder RightToLeft = fromByteString "rtl" -- | Text transformation modes. data TextTransform = CapitalizeText -- ^ @capitalize@ transform. | LowercaseText -- ^ @lowercase@ transform. | UppercaseText -- ^ @uppercase@ transform. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue TextTransform where toPropBuilder CapitalizeText = fromByteString "capitalize" toPropBuilder LowercaseText = fromByteString "lowercase" toPropBuilder UppercaseText = fromByteString "uppercase" -- | Text wrapping modes. data TextWrapMode = NormalWrapping -- ^ @normal@ wrapping. | NowrapWrapping -- ^ @nowrap@ wrapping. | PreLineWrapping -- ^ @pre-line@ wrapping. | PreWrapWrapping -- ^ @pre-wrap@ wrapping. | PreWrapping -- ^ @pre@ wrapping. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue TextWrapMode where toPropBuilder NormalWrapping = fromByteString "normal" toPropBuilder NowrapWrapping = fromByteString "nowrap" toPropBuilder PreLineWrapping = fromByteString "pre-line" toPropBuilder PreWrapWrapping = fromByteString "pre-wrap" toPropBuilder PreWrapping = fromByteString "pre" -- | Unicode bidi embedding mode. data UnicodeBidiMode = EmbedBidi -- ^ @embed@ mode. | NormalBidi -- ^ @normal@ mode. | OverrideBidi -- ^ @bidi-override@ mode. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue UnicodeBidiMode where toPropBuilder EmbedBidi = fromByteString "embed" toPropBuilder NormalBidi = fromByteString "normal" toPropBuilder OverrideBidi = fromByteString "bidi-override" -- | Vertical text/box alignment. data VerticalAlign a = BaselineAlign | BottomAlign | LengthAlign (FactorLen Length a) | MiddleAlign | SubAlign | SuperAlign | TextBottomAlign | TextTopAlign | TopAlign deriving (Eq, Ord, Show, Typeable) instance HasLength VerticalAlign where _Em = _LengthAlign . _Em _Ex = _LengthAlign . _Ex _Mm = _LengthAlign . _Mm _Px = _LengthAlign . _Px zeroLen = LengthAlign zeroLen instance HasPercent VerticalAlign where _Factor = _LengthAlign . _Factor instance (Real a) => ToPropValue (VerticalAlign a) where toPropBuilder BaselineAlign = fromByteString "baseline" toPropBuilder BottomAlign = fromByteString "bottom" toPropBuilder MiddleAlign = fromByteString "middle" toPropBuilder SubAlign = fromByteString "sub" toPropBuilder SuperAlign = fromByteString "super" toPropBuilder TextBottomAlign = fromByteString "text-bottom" toPropBuilder TextTopAlign = fromByteString "text-top" toPropBuilder TopAlign = fromByteString "top" toPropBuilder (LengthAlign x) = toPropBuilder x -- | Visibility modes. data VisibilityMode = CollapseVisibility -- ^ @collapse@ visibility. | HiddenVisibility -- ^ @hidden@ visibility. | VisibleVisibility -- ^ @visible@ visibility. deriving (Data, Eq, Ord, Read, Show, Typeable) instance ToPropValue VisibilityMode where toPropBuilder CollapseVisibility = fromByteString "collapse" toPropBuilder HiddenVisibility = fromByteString "hidden" toPropBuilder VisibleVisibility = fromByteString "visible" -- | Helper prism for border widths. _BorderWidth :: Prism' (BorderWidth a) (Length a) _BorderWidth = prism BorderWidth ex where ex (BorderWidth l) = Right l ex w = Left w -- | Helper prism for 'VerticalAlign'. _LengthAlign :: Prism' (VerticalAlign a) (FactorLen Length a) _LengthAlign = prism LengthAlign ex where ex (LengthAlign x) = Right x ex va = Left va -- | Helper prism for 'FontSize'. _LengthSize :: Prism' (FontSize a) (FactorLen Length a) _LengthSize = prism LengthSize ex where ex (LengthSize x) = Right x ex fs = Left fs -- | Helper prism for non-automatic lengths. _NoAutoLen :: Prism' (AutoLen len a) (len a) _NoAutoLen = prism NoAutoLen ex where ex (NoAutoLen l) = Right l ex len = Left len -- | Helper prism for non-automatic lengths. _NoFactorLen :: Prism' (FactorLen len a) (len a) _NoFactorLen = prism NoFactorLen ex where ex (NoFactorLen l) = Right l ex len = Left len -- | Helper function to convert a length to 'zeroLen' if it's zero. orZeroLen :: (Eq a, HasLength len, Num a) => (a -> len a) -> (a -> len a) orZeroLen _ 0 = zeroLen orZeroLen f x = f x