lib/scenic/primitive/style/text_base.ex

#
#  Created by Boyd Multerer on 2021-02-05.
#  Copyright © 2021-2021 Kry10 Limited. All rights reserved.
#

defmodule Scenic.Primitive.Style.TextBase do
  @moduledoc """
  Set the vertical alignment of text.

  Example:

  ```elixir
  graph
    |> text( "Some Text", text_base: :alphabetic )
  ```

  ### Data Format

  TextBase can be any one of the following values

  * `:top` - The top of the em square.
  * `:middle` - The middle of the em square.
  * `:alphabetic` - The normal alphabetic baseline.
  * `:bottom` - The bottom of the bounding box.

  The default if `:text_base` is undefined is `:alphabetic`.

  The alphabetic baseline is at the bottom of characters such as "a", but above the
  bottom of characters with descending tails, such as "g" or "y". This the standard
  baseline from the world of typography. It may be unintuitive if you expected it
  to be at the top of the characters, like most of the primitives in Scenic.
  If that is what you want, then set `:text_base` to `:top`
  """

  use Scenic.Primitive.Style

  # ============================================================================
  # data verification and serialization

  @doc false
  def validate(:top), do: {:ok, :top}
  def validate(:middle), do: {:ok, :middle}
  def validate(:alphabetic), do: {:ok, :alphabetic}
  def validate(:bottom), do: {:ok, :bottom}

  def validate(data) do
    {
      :error,
      """
      #{IO.ANSI.red()}Invalid TextBase specification
      Received: #{inspect(data)}
      #{IO.ANSI.yellow()}
      The :text_base style must be one of :top, :middle, :alphabetic, or :bottom

      The default is :alphabetic, which is common in typography.#{IO.ANSI.default_color()}
      """
    }
  end
end