module Html.Attributes exposing
( style, property, attribute, map
, class, classList, id, title, hidden
, type_, value, defaultValue, checked, placeholder, selected
, accept, acceptCharset, action, autocomplete, autofocus
, disabled, enctype, formaction, list, maxlength, minlength, method, multiple
, name, novalidate, pattern, readonly, required, size, for, form
, max, min, step
, cols, rows, wrap
, href, target, download, downloadAs, hreflang, media, ping, rel
, ismap, usemap, shape, coords
, src, height, width, alt
, autoplay, controls, loop, preload, poster, default, kind, srclang
, sandbox, seamless, srcdoc
, reversed, start
, align, colspan, rowspan, headers, scope
, async, charset, content, defer, httpEquiv, language, scoped
, accesskey, contenteditable, contextmenu, dir, draggable, dropzone
, itemprop, lang, spellcheck, tabindex
, challenge, keytype
, cite, datetime, pubdate, manifest
)
{-| Helper functions for HTML attributes. They are organized roughly by
category. Each attribute is labeled with the HTML tags it can be used with, so
just search the page for `video` if you want video stuff.
If you cannot find what you are looking for, go to the [Custom
Attributes](#custom-attributes) section to learn how to create new helpers.
# Primitives
@docs style, property, attribute, map
# Super Common Attributes
@docs class, classList, id, title, hidden
# Inputs
@docs type_, value, defaultValue, checked, placeholder, selected
## Input Helpers
@docs accept, acceptCharset, action, autocomplete, autofocus,
disabled, enctype, formaction, list, maxlength, minlength, method, multiple,
name, novalidate, pattern, readonly, required, size, for, form
## Input Ranges
@docs max, min, step
## Input Text Areas
@docs cols, rows, wrap
# Links and Areas
@docs href, target, download, downloadAs, hreflang, media, ping, rel
## Maps
@docs ismap, usemap, shape, coords
# Embedded Content
@docs src, height, width, alt
## Audio and Video
@docs autoplay, controls, loop, preload, poster, default, kind, srclang
## iframes
@docs sandbox, seamless, srcdoc
# Ordered Lists
@docs reversed, start
# Tables
@docs align, colspan, rowspan, headers, scope
# Header Stuff
@docs async, charset, content, defer, httpEquiv, language, scoped
# Less Common Global Attributes
Attributes that can be attached to any HTML tag but are less commonly used.
@docs accesskey, contenteditable, contextmenu, dir, draggable, dropzone,
itemprop, lang, spellcheck, tabindex
# Key Generation
@docs challenge, keytype
# Miscellaneous
@docs cite, datetime, pubdate, manifest
-}
import Html exposing (Attribute)
import Json.Encode as Json
import VirtualDom
-- This library does not include low, high, or optimum because the idea of a
-- `meter` is just too crazy.
-- PRIMITIVES
{-| Specify a list of styles.
myStyle : Attribute msg
myStyle =
style
[ ("backgroundColor", "red")
, ("height", "90px")
, ("width", "100%")
]
greeting : Html msg
greeting =
div [ myStyle ] [ text "Hello!" ]
There is no `Html.Styles` module because best practices for working with HTML
suggest that this should primarily be specified in CSS files. So the general
recommendation is to use this function lightly.
-}
style : List (String, String) -> Attribute msg
style =
VirtualDom.style
{-| This function makes it easier to build a space-separated class attribute.
Each class can easily be added and removed depending on the boolean value it
is paired with. For example, maybe we want a way to view notices:
viewNotice : Notice -> Html msg
viewNotice notice =
div
[ classList
[ ("notice", True)
, ("notice-important", notice.isImportant)
, ("notice-seen", notice.isSeen)
]
]
[ text notice.content ]
-}
classList : List (String, Bool) -> Attribute msg
classList list =
list
|> List.filter Tuple.second
|> List.map Tuple.first
|> String.join " "
|> class
-- CUSTOM ATTRIBUTES
{-| Create *properties*, like saying `domNode.className = 'greeting'` in
JavaScript.
import Json.Encode as Encode
class : String -> Attribute msg
class name =
property "className" (Encode.string name)
Read more about the difference between properties and attributes [here][].
[here]: https://github.com/elm-lang/html/blob/master/properties-vs-attributes.md
-}
property : String -> Json.Value -> Attribute msg
property =
VirtualDom.property
stringProperty : String -> String -> Attribute msg
stringProperty name string =
property name (Json.string string)
boolProperty : String -> Bool -> Attribute msg
boolProperty name bool =
property name (Json.bool bool)
{-| Create *attributes*, like saying `domNode.setAttribute('class', 'greeting')`
in JavaScript.
class : String -> Attribute msg
class name =
attribute "class" name
Read more about the difference between properties and attributes [here][].
[here]: https://github.com/elm-lang/html/blob/master/properties-vs-attributes.md
-}
attribute : String -> String -> Attribute msg
attribute =
VirtualDom.attribute
{-| Transform the messages produced by an `Attribute`.
-}
map : (a -> msg) -> Attribute a -> Attribute msg
map =
VirtualDom.mapProperty
-- GLOBAL ATTRIBUTES
{-| Often used with CSS to style elements with common properties. -}
class : String -> Attribute msg
class name =
stringProperty "className" name
{-| Indicates the relevance of an element. -}
hidden : Bool -> Attribute msg
hidden bool =
boolProperty "hidden" bool
{-| Often used with CSS to style a specific element. The value of this
attribute must be unique.
-}
id : String -> Attribute msg
id name =
stringProperty "id" name
{-| Text to be displayed in a tooltip when hovering over the element. -}
title : String -> Attribute msg
title name =
stringProperty "title" name
-- LESS COMMON GLOBAL ATTRIBUTES
{-| Defines a keyboard shortcut to activate or add focus to the element. -}
accesskey : Char -> Attribute msg
accesskey char =
stringProperty "accessKey" (String.fromChar char)
{-| Indicates whether the element's content is editable. -}
contenteditable : Bool -> Attribute msg
contenteditable bool =
boolProperty "contentEditable" bool
{-| Defines the ID of a `menu` element which will serve as the element's
context menu.
-}
contextmenu : String -> Attribute msg
contextmenu value =
attribute "contextmenu" value
{-| Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl
(Right-To-Left).
-}
dir : String -> Attribute msg
dir value =
stringProperty "dir" value
{-| Defines whether the element can be dragged. -}
draggable : String -> Attribute msg
draggable value =
attribute "draggable" value
{-| Indicates that the element accept the dropping of content on it. -}
dropzone : String -> Attribute msg
dropzone value =
stringProperty "dropzone" value
{-|-}
itemprop : String -> Attribute msg
itemprop value =
attribute "itemprop" value
{-| Defines the language used in the element. -}
lang : String -> Attribute msg
lang value =
stringProperty "lang" value
{-| Indicates whether spell checking is allowed for the element. -}
spellcheck : Bool -> Attribute msg
spellcheck bool =
boolProperty "spellcheck" bool
{-| Overrides the browser's default tab order and follows the one specified
instead.
-}
tabindex : Int -> Attribute msg
tabindex n =
attribute "tabIndex" (toString n)
-- HEADER STUFF
{-| Indicates that the `script` should be executed asynchronously. -}
async : Bool -> Attribute msg
async bool =
boolProperty "async" bool
{-| Declares the character encoding of the page or script. Common values include:
* UTF-8 - Character encoding for Unicode
* ISO-8859-1 - Character encoding for the Latin alphabet
For `meta` and `script`.
-}
charset : String -> Attribute msg
charset value =
attribute "charset" value
{-| A value associated with http-equiv or name depending on the context. For
`meta`.
-}
content : String -> Attribute msg
content value =
stringProperty "content" value
{-| Indicates that a `script` should be executed after the page has been
parsed.
-}
defer : Bool -> Attribute msg
defer bool =
boolProperty "defer" bool
{-| This attribute is an indicator that is paired with the `content` attribute,
indicating what that content means. `httpEquiv` can take on three different
values: content-type, default-style, or refresh. For `meta`.
-}
httpEquiv : String -> Attribute msg
httpEquiv value =
stringProperty "httpEquiv" value
{-| Defines the script language used in a `script`. -}
language : String -> Attribute msg
language value =
stringProperty "language" value
{-| Indicates that a `style` should only apply to its parent and all of the
parents children.
-}
scoped : Bool -> Attribute msg
scoped bool =
boolProperty "scoped" bool
-- EMBEDDED CONTENT
{-| The URL of the embeddable content. For `audio`, `embed`, `iframe`, `img`,
`input`, `script`, `source`, `track`, and `video`.
-}
src : String -> Attribute msg
src value =
stringProperty "src" value
{-| Declare the height of a `canvas`, `embed`, `iframe`, `img`, `input`,
`object`, or `video`.
-}
height : Int -> Attribute msg
height value =
attribute "height" (toString value)
{-| Declare the width of a `canvas`, `embed`, `iframe`, `img`, `input`,
`object`, or `video`.
-}
width : Int -> Attribute msg
width value =
attribute "width" (toString value)
{-| Alternative text in case an image can't be displayed. Works with `img`,
`area`, and `input`.
-}
alt : String -> Attribute msg
alt value =
stringProperty "alt" value
-- AUDIO and VIDEO
{-| The `audio` or `video` should play as soon as possible. -}
autoplay : Bool -> Attribute msg
autoplay bool =
boolProperty "autoplay" bool
{-| Indicates whether the browser should show playback controls for the `audio`
or `video`.
-}
controls : Bool -> Attribute msg
controls bool =
boolProperty "controls" bool
{-| Indicates whether the `audio` or `video` should start playing from the
start when it's finished.
-}
loop : Bool -> Attribute msg
loop bool =
boolProperty "loop" bool
{-| Control how much of an `audio` or `video` resource should be preloaded. -}
preload : String -> Attribute msg
preload value =
stringProperty "preload" value
{-| A URL indicating a poster frame to show until the user plays or seeks the
`video`.
-}
poster : String -> Attribute msg
poster value =
stringProperty "poster" value
{-| Indicates that the `track` should be enabled unless the user's preferences
indicate something different.
-}
default : Bool -> Attribute msg
default bool =
boolProperty "default" bool
{-| Specifies the kind of text `track`. -}
kind : String -> Attribute msg
kind value =
stringProperty "kind" value
{-- TODO: maybe reintroduce once there's a better way to disambiguate imports
{-| Specifies a user-readable title of the text `track`. -}
label : String -> Attribute msg
label value =
stringProperty "label" value
--}
{-| A two letter language code indicating the language of the `track` text data.
-}
srclang : String -> Attribute msg
srclang value =
stringProperty "srclang" value
-- IFRAMES
{-| A space separated list of security restrictions you'd like to lift for an
`iframe`.
-}
sandbox : String -> Attribute msg
sandbox value =
stringProperty "sandbox" value
{-| Make an `iframe` look like part of the containing document. -}
seamless : Bool -> Attribute msg
seamless bool =
boolProperty "seamless" bool
{-| An HTML document that will be displayed as the body of an `iframe`. It will
override the content of the `src` attribute if it has been specified.
-}
srcdoc : String -> Attribute msg
srcdoc value =
stringProperty "srcdoc" value
-- INPUT
{-| Defines the type of a `button`, `input`, `embed`, `object`, `script`,
`source`, `style`, or `menu`.
-}
type_ : String -> Attribute msg
type_ value =
stringProperty "type" value
{-| Defines a default value which will be displayed in a `button`, `option`,
`input`, `li`, `meter`, `progress`, or `param`.
-}
value : String -> Attribute msg
value value =
stringProperty "value" value
{-| Defines an initial value which will be displayed in an `input` when that
`input` is added to the DOM. Unlike `value`, altering `defaultValue` after the
`input` element has been added to the DOM has no effect.
-}
defaultValue : String -> Attribute msg
defaultValue value =
stringProperty "defaultValue" value
{-| Indicates whether an `input` of type checkbox is checked. -}
checked : Bool -> Attribute msg
checked bool =
boolProperty "checked" bool
{-| Provides a hint to the user of what can be entered into an `input` or
`textarea`.
-}
placeholder : String -> Attribute msg
placeholder value =
stringProperty "placeholder" value
{-| Defines which `option` will be selected on page load. -}
selected : Bool -> Attribute msg
selected bool =
boolProperty "selected" bool
-- INPUT HELPERS
{-| List of types the server accepts, typically a file type.
For `form` and `input`.
-}
accept : String -> Attribute msg
accept value =
stringProperty "accept" value
{-| List of supported charsets in a `form`.
-}
acceptCharset : String -> Attribute msg
acceptCharset value =
stringProperty "acceptCharset" value
{-| The URI of a program that processes the information submitted via a `form`.
-}
action : String -> Attribute msg
action value =
stringProperty "action" value
{-| Indicates whether a `form` or an `input` can have their values automatically
completed by the browser.
-}
autocomplete : Bool -> Attribute msg
autocomplete bool =
stringProperty "autocomplete" (if bool then "on" else "off")
{-| The element should be automatically focused after the page loaded.
For `button`, `input`, `keygen`, `select`, and `textarea`.
-}
autofocus : Bool -> Attribute msg
autofocus bool =
boolProperty "autofocus" bool
{-| Indicates whether the user can interact with a `button`, `fieldset`,
`input`, `keygen`, `optgroup`, `option`, `select` or `textarea`.
-}
disabled : Bool -> Attribute msg
disabled bool =
boolProperty "disabled" bool
{-| How `form` data should be encoded when submitted with the POST method.
Options include: application/x-www-form-urlencoded, multipart/form-data, and
text/plain.
-}
enctype : String -> Attribute msg
enctype value =
stringProperty "enctype" value
{-| Indicates the action of an `input` or `button`. This overrides the action
defined in the surrounding `form`.
-}
formaction : String -> Attribute msg
formaction value =
attribute "formAction" value
{-| Associates an `input` with a `datalist` tag. The datalist gives some
pre-defined options to suggest to the user as they interact with an input.
The value of the list attribute must match the id of a `datalist` node.
For `input`.
-}
list : String -> Attribute msg
list value =
attribute "list" value
{-| Defines the minimum number of characters allowed in an `input` or
`textarea`.
-}
minlength : Int -> Attribute msg
minlength n =
attribute "minLength" (toString n)
{-| Defines the maximum number of characters allowed in an `input` or
`textarea`.
-}
maxlength : Int -> Attribute msg
maxlength n =
attribute "maxlength" (toString n)
{-| Defines which HTTP method to use when submitting a `form`. Can be GET
(default) or POST.
-}
method : String -> Attribute msg
method value =
stringProperty "method" value
{-| Indicates whether multiple values can be entered in an `input` of type
email or file. Can also indicate that you can `select` many options.
-}
multiple : Bool -> Attribute msg
multiple bool =
boolProperty "multiple" bool
{-| Name of the element. For example used by the server to identify the fields
in form submits. For `button`, `form`, `fieldset`, `iframe`, `input`, `keygen`,
`object`, `output`, `select`, `textarea`, `map`, `meta`, and `param`.
-}
name : String -> Attribute msg
name value =
stringProperty "name" value
{-| This attribute indicates that a `form` shouldn't be validated when
submitted.
-}
novalidate : Bool -> Attribute msg
novalidate bool =
boolProperty "noValidate" bool
{-| Defines a regular expression which an `input`'s value will be validated
against.
-}
pattern : String -> Attribute msg
pattern value =
stringProperty "pattern" value
{-| Indicates whether an `input` or `textarea` can be edited. -}
readonly : Bool -> Attribute msg
readonly bool =
boolProperty "readOnly" bool
{-| Indicates whether this element is required to fill out or not.
For `input`, `select`, and `textarea`.
-}
required : Bool -> Attribute msg
required bool =
boolProperty "required" bool
{-| For `input` specifies the width of an input in characters.
For `select` specifies the number of visible options in a drop-down list.
-}
size : Int -> Attribute msg
size n =
attribute "size" (toString n)
{-| The element ID described by this `label` or the element IDs that are used
for an `output`.
-}
for : String -> Attribute msg
for value =
stringProperty "htmlFor" value
{-| Indicates the element ID of the `form` that owns this particular `button`,
`fieldset`, `input`, `keygen`, `label`, `meter`, `object`, `output`,
`progress`, `select`, or `textarea`.
-}
form : String -> Attribute msg
form value =
attribute "form" value
-- RANGES
{-| Indicates the maximum value allowed. When using an input of type number or
date, the max value must be a number or date. For `input`, `meter`, and `progress`.
-}
max : String -> Attribute msg
max value =
stringProperty "max" value
{-| Indicates the minimum value allowed. When using an input of type number or
date, the min value must be a number or date. For `input` and `meter`.
-}
min : String -> Attribute msg
min value =
stringProperty "min" value
{-| Add a step size to an `input`. Use `step "any"` to allow any floating-point
number to be used in the input.
-}
step : String -> Attribute msg
step n =
stringProperty "step" n
--------------------------
{-| Defines the number of columns in a `textarea`. -}
cols : Int -> Attribute msg
cols n =
attribute "cols" (toString n)
{-| Defines the number of rows in a `textarea`. -}
rows : Int -> Attribute msg
rows n =
attribute "rows" (toString n)
{-| Indicates whether the text should be wrapped in a `textarea`. Possible
values are "hard" and "soft".
-}
wrap : String -> Attribute msg
wrap value =
stringProperty "wrap" value
-- MAPS
{-| When an `img` is a descendent of an `a` tag, the `ismap` attribute
indicates that the click location should be added to the parent `a`'s href as
a query string.
-}
ismap : Bool -> Attribute msg
ismap value =
boolProperty "isMap" value
{-| Specify the hash name reference of a `map` that should be used for an `img`
or `object`. A hash name reference is a hash symbol followed by the element's name or id.
E.g. `"#planet-map"`.
-}
usemap : String -> Attribute msg
usemap value =
stringProperty "useMap" value
{-| Declare the shape of the clickable area in an `a` or `area`. Valid values
include: default, rect, circle, poly. This attribute can be paired with
`coords` to create more particular shapes.
-}
shape : String -> Attribute msg
shape value =
stringProperty "shape" value
{-| A set of values specifying the coordinates of the hot-spot region in an
`area`. Needs to be paired with a `shape` attribute to be meaningful.
-}
coords : String -> Attribute msg
coords value =
stringProperty "coords" value
-- KEY GEN
{-| A challenge string that is submitted along with the public key in a `keygen`.
-}
challenge : String -> Attribute msg
challenge value =
attribute "challenge" value
{-| Specifies the type of key generated by a `keygen`. Possible values are:
rsa, dsa, and ec.
-}
keytype : String -> Attribute msg
keytype value =
stringProperty "keytype" value
-- REAL STUFF
{-| Specifies the horizontal alignment of a `caption`, `col`, `colgroup`,
`hr`, `iframe`, `img`, `table`, `tbody`, `td`, `tfoot`, `th`, `thead`, or
`tr`.
-}
align : String -> Attribute msg
align value =
stringProperty "align" value
{-| Contains a URI which points to the source of the quote or change in a
`blockquote`, `del`, `ins`, or `q`.
-}
cite : String -> Attribute msg
cite value =
stringProperty "cite" value
-- LINKS AND AREAS
{-| The URL of a linked resource, such as `a`, `area`, `base`, or `link`. -}
href : String -> Attribute msg
href value =
stringProperty "href" value
{-| Specify where the results of clicking an `a`, `area`, `base`, or `form`
should appear. Possible special values include:
* _blank — a new window or tab
* _self — the same frame (this is default)
* _parent — the parent frame
* _top — the full body of the window
You can also give the name of any `frame` you have created.
-}
target : String -> Attribute msg
target value =
stringProperty "target" value
{-| Indicates that clicking an `a` and `area` will download the resource
directly.
-}
download : Bool -> Attribute msg
download bool =
boolProperty "download" bool
{-| Indicates that clicking an `a` and `area` will download the resource
directly, and that the downloaded resource with have the given filename.
-}
downloadAs : String -> Attribute msg
downloadAs value =
stringProperty "download" value
{-| Two-letter language code of the linked resource of an `a`, `area`, or `link`.
-}
hreflang : String -> Attribute msg
hreflang value =
stringProperty "hreflang" value
{-| Specifies a hint of the target media of a `a`, `area`, `link`, `source`,
or `style`.
-}
media : String -> Attribute msg
media value =
attribute "media" value
{-| Specify a URL to send a short POST request to when the user clicks on an
`a` or `area`. Useful for monitoring and tracking.
-}
ping : String -> Attribute msg
ping value =
stringProperty "ping" value
{-| Specifies the relationship of the target object to the link object.
For `a`, `area`, `link`.
-}
rel : String -> Attribute msg
rel value =
attribute "rel" value
-- CRAZY STUFF
{-| Indicates the date and time associated with the element.
For `del`, `ins`, `time`.
-}
datetime : String -> Attribute msg
datetime value =
attribute "datetime" value
{-| Indicates whether this date and time is the date of the nearest `article`
ancestor element. For `time`.
-}
pubdate : String -> Attribute msg
pubdate value =
attribute "pubdate" value
-- ORDERED LISTS
{-| Indicates whether an ordered list `ol` should be displayed in a descending
order instead of a ascending.
-}
reversed : Bool -> Attribute msg
reversed bool =
boolProperty "reversed" bool
{-| Defines the first number of an ordered list if you want it to be something
besides 1.
-}
start : Int -> Attribute msg
start n =
stringProperty "start" (toString n)
-- TABLES
{-| The colspan attribute defines the number of columns a cell should span.
For `td` and `th`.
-}
colspan : Int -> Attribute msg
colspan n =
attribute "colspan" (toString n)
{-| A space separated list of element IDs indicating which `th` elements are
headers for this cell. For `td` and `th`.
-}
headers : String -> Attribute msg
headers value =
stringProperty "headers" value
{-| Defines the number of rows a table cell should span over.
For `td` and `th`.
-}
rowspan : Int -> Attribute msg
rowspan n =
attribute "rowspan" (toString n)
{-| Specifies the scope of a header cell `th`. Possible values are: col, row,
colgroup, rowgroup.
-}
scope : String -> Attribute msg
scope value =
stringProperty "scope" value
{-| Specifies the URL of the cache manifest for an `html` tag. -}
manifest : String -> Attribute msg
manifest value =
attribute "manifest" value
{-- TODO: maybe reintroduce once there's a better way to disambiguate imports
{-| The number of columns a `col` or `colgroup` should span. -}
span : Int -> Attribute msg
span n =
stringProperty "span" (toString n)
--}