Packages

A framework to build terminal UI applications in Elixir

Current section

Files

Jump to
orange lib layout types.ex
Raw

lib/layout/types.ex

defmodule Orange.Layout.InputTreeNode do
@moduledoc false
# The layout tree uses as the input of the layout API.
@type child :: {:text, binary()} | {:node, __MODULE__.t()}
@type t :: %__MODULE__{
id: integer(),
children: list(child()),
style: __MODULE__.Style.t()
}
defstruct [:id, :children, :style]
defmodule Style do
@moduledoc false
# The style of layout tree node
# Supports only a subset of styling properties that affect the layout.
@type length_or_percent :: {:fixed | integer()} | {:percentage, float()}
@type t :: %__MODULE__{
# Can be a percentage or a fixed value
width: length_or_percent() | nil,
height: {:fixed | integer()} | {:percentage, float()} | nil,
padding: {integer(), integer(), integer(), integer()},
margin: {integer(), integer(), integer(), integer()},
border: {integer(), integer(), integer(), integer()},
display: :flex | :grid,
flex_direction: :row | :column,
flex_grow: integer(),
flex_shrink: integer(),
justify_content:
:start | :end | :center | :space_between | :space_around | :space_evenly | :stretch,
align_items:
:start | :end | :center | :space_between | :space_around | :space_evenly | :stretch,
line_wrap: boolean(),
grid_template_rows: list(grid_track()) | nil,
grid_template_columns: list(grid_track()) | nil,
grid_row: grid_lines(),
grid_column: grid_lines()
}
@type grid_track ::
integer()
| binary()
| {:fr, integer()}
| :auto
| {:repeat, integer(), length_or_percent() | {:fr, integer()}}
@type grid_line :: {:fixed, integer()} | {:span, integer()} | :auto
@type grid_lines :: {:single, grid_line()} | {:double, grid_line(), grid_line()}
defstruct [
:width,
:height,
:padding,
:margin,
:border,
:display,
:flex_direction,
:flex_grow,
:flex_shrink,
:justify_content,
:align_items,
:line_wrap,
:grid_template_rows,
:grid_template_columns,
:grid_row,
:grid_column
]
end
end
defmodule Orange.Layout.OutputTreeNode do
@moduledoc false
# The layout tree uses as the output of the layout API.
# This tree includes the layout information (position, sizes, ...) of the tree.
@type child :: {:text, binary()} | {:node, __MODULE__.t()}
@type t :: %__MODULE__{
id: integer(),
width: integer(),
height: integer(),
x: integer(),
y: integer(),
content_size: {integer(), integer()},
border: __MODULE__.FourValues.t(),
padding: __MODULE__.FourValues.t(),
margin: __MODULE__.FourValues.t(),
children: list(child())
}
defstruct [:id, :width, :height, :x, :y, :content_size, :border, :padding, :margin, :children]
defmodule FourValues do
@moduledoc false
@type t :: %__MODULE__{
left: integer(),
right: integer(),
top: integer(),
bottom: integer()
}
defstruct [:left, :right, :top, :bottom]
end
end