aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHayleigh Thompson <me@hayleigh.dev>2023-02-13 13:13:30 +0000
committerHayleigh Thompson <me@hayleigh.dev>2023-02-13 13:13:30 +0000
commit18882110afda3aebaaa94d3a9b1a479c56355979 (patch)
treec6a50968c41f08e18d77b2b9d89a4b264a731a5d
parent74ec8d1d26feab65bda962cff88e2285a32c6b7c (diff)
downloadlustre-18882110afda3aebaaa94d3a9b1a479c56355979.tar.gz
lustre-18882110afda3aebaaa94d3a9b1a479c56355979.zip
:recycle: Remove distinction between attributes and properties: react doesn't care.
-rw-r--r--src/lustre/attribute.gleam192
1 files changed, 96 insertions, 96 deletions
diff --git a/src/lustre/attribute.gleam b/src/lustre/attribute.gleam
index 4dff602..51ef13b 100644
--- a/src/lustre/attribute.gleam
+++ b/src/lustre/attribute.gleam
@@ -1,6 +1,6 @@
// IMPORTS ---------------------------------------------------------------------
-import gleam/dynamic.{ Dynamic }
+import gleam/dynamic.{Dynamic}
import gleam/int
import gleam/list
import gleam/pair
@@ -8,235 +8,235 @@ import gleam/string
// TYPES -----------------------------------------------------------------------
+/// Attributes are attached to specific elements. They're either key/value pairs
+/// or event handlers.
///
-pub opaque type Attribute(action) {
- Attribute(name: String, value: String)
- Property(name: String, value: Dynamic)
- Event(name: String, handler: fn (Dynamic, fn (action) -> Nil) -> Nil)
+pub opaque type Attribute(msg) {
+ Attribute(name: String, value: Dynamic)
+ Event(name: String, handler: fn(Dynamic, fn(msg) -> Nil) -> Nil)
}
// CONSTRUCTORS ----------------------------------------------------------------
///
-pub fn attribute (name: String, value: String) -> Attribute(action) {
- Attribute(name, value)
+pub fn attribute(name: String, value: any) -> Attribute(msg) {
+ Attribute(name, dynamic.from(value))
}
-///
-pub fn property (name: String, value: Dynamic) -> Attribute(action) {
- Property(name, value)
-}
-
-///
-pub fn event (name: String, handler: fn (Dynamic, fn (action) -> Nil) -> Nil) -> Attribute(action) {
- Event(name, handler)
+///
+pub fn event(
+ name: String,
+ handler: fn(Dynamic, fn(msg) -> Nil) -> Nil,
+) -> Attribute(msg) {
+ Event(name, handler)
}
// COMMON ATTRIBUTES -----------------------------------------------------------
///
-pub fn style (properties: List(#(String, String))) -> Attribute(action) {
- property("style", style_object(properties))
+pub fn style(properties: List(#(String, String))) -> Attribute(msg) {
+ attribute("style", style_object(properties))
}
-external fn style_object (properties: List(#(String, String))) -> Dynamic
- = "../ffi.mjs" "object"
+external fn style_object(properties: List(#(String, String))) -> Dynamic =
+ "../ffi.mjs" "object"
///
-pub fn class (name: String) -> Attribute(action) {
- attribute("className", name)
+pub fn class(name: String) -> Attribute(msg) {
+ attribute("className", name)
}
///
-pub fn classes (names: List(#(String, Bool))) -> Attribute(action) {
- attribute("className",
- names
- |> list.filter(pair.second)
- |> list.map(pair.first)
- |> string.join(" ")
- )
+pub fn classes(names: List(#(String, Bool))) -> Attribute(msg) {
+ attribute(
+ "className",
+ names
+ |> list.filter(pair.second)
+ |> list.map(pair.first)
+ |> string.join(" "),
+ )
}
///
-pub fn id (name: String) -> Attribute(action) {
- attribute("id", name)
+pub fn id(name: String) -> Attribute(msg) {
+ attribute("id", name)
}
// INPUTS ----------------------------------------------------------------------
///
-pub fn type_ (name: String) -> Attribute(action) {
- attribute("type", name)
+pub fn type_(name: String) -> Attribute(msg) {
+ attribute("type", name)
}
///
-pub fn value (val: Dynamic) -> Attribute(action) {
- property("value", val)
+pub fn value(val: Dynamic) -> Attribute(msg) {
+ attribute("value", val)
}
///
-pub fn checked (is_checked: Bool) -> Attribute(action) {
- property("checked", dynamic.from(is_checked))
+pub fn checked(is_checked: Bool) -> Attribute(msg) {
+ attribute("checked", is_checked)
}
///
-pub fn placeholder (text: String) -> Attribute(action) {
- attribute("placeholder", text)
+pub fn placeholder(text: String) -> Attribute(msg) {
+ attribute("placeholder", text)
}
///
-pub fn selected (is_selected: Bool) -> Attribute(action) {
- property("selected", dynamic.from(is_selected))
+pub fn selected(is_selected: Bool) -> Attribute(msg) {
+ attribute("selected", is_selected)
}
// INPUT HELPERS ---------------------------------------------------------------
///
-pub fn accept (types: List(String)) -> Attribute(action) {
- attribute("accept", string.join(types, " "))
+pub fn accept(types: List(String)) -> Attribute(msg) {
+ attribute("accept", string.join(types, " "))
}
///
-pub fn accept_charset (types: List(String)) -> Attribute(action) {
- attribute("acceptCharset", string.join(types, " "))
+pub fn accept_charset(types: List(String)) -> Attribute(msg) {
+ attribute("acceptCharset", string.join(types, " "))
}
///
-pub fn action (uri: String) -> Attribute(action) {
- attribute("action", uri)
+pub fn msg(uri: String) -> Attribute(msg) {
+ attribute("msg", uri)
}
///
-pub fn autocomplete (should_autocomplete: Bool) -> Attribute(action) {
- property("autocomplete", dynamic.from(should_autocomplete))
+pub fn autocomplete(should_autocomplete: Bool) -> Attribute(msg) {
+ attribute("autocomplete", should_autocomplete)
}
///
-pub fn autofocus (should_autofocus: Bool) -> Attribute(action) {
- property("autoFocus", dynamic.from(should_autofocus))
+pub fn autofocus(should_autofocus: Bool) -> Attribute(msg) {
+ attribute("autoFocus", should_autofocus)
}
///
-pub fn disabled (is_disabled: Bool) -> Attribute(action) {
- property("disabled", dynamic.from(is_disabled))
+pub fn disabled(is_disabled: Bool) -> Attribute(msg) {
+ attribute("disabled", is_disabled)
}
///
-pub fn name (name: String) -> Attribute(action) {
- attribute("name", name)
+pub fn name(name: String) -> Attribute(msg) {
+ attribute("name", name)
}
///
-pub fn pattern (regex: String) -> Attribute(action) {
- attribute("pattern", regex)
+pub fn pattern(regex: String) -> Attribute(msg) {
+ attribute("pattern", regex)
}
///
-pub fn readonly (is_readonly: Bool) -> Attribute(action) {
- property("readonly", dynamic.from(is_readonly))
+pub fn readonly(is_readonly: Bool) -> Attribute(msg) {
+ attribute("readonly", is_readonly)
}
///
-pub fn required (is_required: Bool) -> Attribute(action) {
- property("required", dynamic.from(is_required))
+pub fn required(is_required: Bool) -> Attribute(msg) {
+ attribute("required", is_required)
}
///
-pub fn for (id: String) -> Attribute(action) {
- attribute("for", id)
+pub fn for(id: String) -> Attribute(msg) {
+ attribute("for", id)
}
// INPUT RANGES ----------------------------------------------------------------
///
-pub fn max (val: String) -> Attribute(action) {
- attribute("max", val)
+pub fn max(val: String) -> Attribute(msg) {
+ attribute("max", val)
}
///
-pub fn min (val: String) -> Attribute(action) {
- attribute("min", val)
+pub fn min(val: String) -> Attribute(msg) {
+ attribute("min", val)
}
///
-pub fn step (val: String) -> Attribute(action) {
- attribute("step", val)
+pub fn step(val: String) -> Attribute(msg) {
+ attribute("step", val)
}
// INPUT TEXT AREAS ------------------------------------------------------------
///
-pub fn cols (val: Int) -> Attribute(action) {
- attribute("cols", int.to_string(val))
+pub fn cols(val: Int) -> Attribute(msg) {
+ attribute("cols", int.to_string(val))
}
///
-pub fn rows (val: Int) -> Attribute(action) {
- attribute("rows", int.to_string(val))
+pub fn rows(val: Int) -> Attribute(msg) {
+ attribute("rows", int.to_string(val))
}
///
-pub fn wrap (mode: String) -> Attribute(action) {
- attribute("wrap", mode)
+pub fn wrap(mode: String) -> Attribute(msg) {
+ attribute("wrap", mode)
}
// LINKS AND AREAS -------------------------------------------------------------
///
-pub fn href (uri: String) -> Attribute(action) {
- attribute("href", uri)
+pub fn href(uri: String) -> Attribute(msg) {
+ attribute("href", uri)
}
///
-pub fn target (target: String) -> Attribute(action) {
- attribute("target", target)
+pub fn target(target: String) -> Attribute(msg) {
+ attribute("target", target)
}
///
-pub fn download (filename: String) -> Attribute(action) {
- attribute("download", filename)
+pub fn download(filename: String) -> Attribute(msg) {
+ attribute("download", filename)
}
///
-pub fn rel (relationship: String) -> Attribute(action) {
- attribute("rel", relationship)
+pub fn rel(relationship: String) -> Attribute(msg) {
+ attribute("rel", relationship)
}
// EMBEDDED CONTENT ------------------------------------------------------------
///
-pub fn src (uri: String) -> Attribute(action) {
- attribute("src", uri)
+pub fn src(uri: String) -> Attribute(msg) {
+ attribute("src", uri)
}
///
-pub fn height (val: Int) -> Attribute(action) {
- attribute("height", int.to_string(val))
+pub fn height(val: Int) -> Attribute(msg) {
+ attribute("height", int.to_string(val))
}
///
-pub fn width (val: Int) -> Attribute(action) {
- attribute("width", int.to_string(val))
+pub fn width(val: Int) -> Attribute(msg) {
+ attribute("width", int.to_string(val))
}
///
-pub fn alt (text: String) -> Attribute(action) {
- attribute("alt", text)
+pub fn alt(text: String) -> Attribute(msg) {
+ attribute("alt", text)
}
// AUDIO AND VIDEO -------------------------------------------------------------
///
-pub fn autoplay (should_autoplay: Bool) -> Attribute(action) {
- property("autoplay", dynamic.from(should_autoplay))
+pub fn autoplay(should_autoplay: Bool) -> Attribute(msg) {
+ attribute("autoplay", should_autoplay)
}
///
-pub fn controls (visible: Bool) -> Attribute(action) {
- property("controls", dynamic.from(visible))
+pub fn controls(visible: Bool) -> Attribute(msg) {
+ attribute("controls", visible)
}
///
-pub fn loop (should_loop: Bool) -> Attribute(action) {
- property("loop", dynamic.from(should_loop))
+pub fn loop(should_loop: Bool) -> Attribute(msg) {
+ attribute("loop", should_loop)
}