From fd3f02c024687bc5c2b9741f6386719a0affb7bb Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Fri, 9 Dec 2022 17:18:41 -0400 Subject: Added machinery for averaging a time-series. --- .../library/lux/data/collection/sequence.lux | 4 +- stdlib/source/library/lux/data/color.lux | 13 +- stdlib/source/library/lux/data/color/cmyk.lux | 24 +- stdlib/source/library/lux/data/color/hsb.lux | 14 +- stdlib/source/library/lux/data/color/hsl.lux | 37 +- stdlib/source/library/lux/data/color/named.lux | 3 - stdlib/source/library/lux/data/color/rgb.lux | 171 +-- stdlib/source/library/lux/data/color/terminal.lux | 6 +- stdlib/source/library/lux/data/format/css.lux | 176 --- .../source/library/lux/data/format/css/class.lux | 34 - stdlib/source/library/lux/data/format/css/font.lux | 24 - stdlib/source/library/lux/data/format/css/id.lux | 34 - .../library/lux/data/format/css/property.lux | 517 ------- .../source/library/lux/data/format/css/query.lux | 135 -- .../library/lux/data/format/css/selector.lux | 213 --- .../source/library/lux/data/format/css/style.lux | 39 - .../source/library/lux/data/format/css/value.lux | 1423 -------------------- stdlib/source/library/lux/data/format/html.lux | 580 -------- stdlib/source/library/lux/web/css.lux | 176 +++ stdlib/source/library/lux/web/css/class.lux | 34 + stdlib/source/library/lux/web/css/font.lux | 24 + stdlib/source/library/lux/web/css/id.lux | 34 + stdlib/source/library/lux/web/css/property.lux | 517 +++++++ stdlib/source/library/lux/web/css/query.lux | 135 ++ stdlib/source/library/lux/web/css/selector.lux | 213 +++ stdlib/source/library/lux/web/css/style.lux | 39 + stdlib/source/library/lux/web/css/value.lux | 1422 +++++++++++++++++++ stdlib/source/library/lux/web/html.lux | 581 ++++++++ .../source/library/lux/world/net/http/response.lux | 7 +- stdlib/source/library/lux/world/time/series.lux | 189 +-- .../library/lux/world/time/series/average.lux | 129 ++ .../source/test/lux/data/collection/sequence.lux | 20 +- stdlib/source/test/lux/data/color.lux | 10 +- stdlib/source/test/lux/data/color/pigment.lux | 3 +- stdlib/source/test/lux/data/color/rgb.lux | 100 +- stdlib/source/test/lux/world/net/http/response.lux | 11 +- stdlib/source/test/lux/world/time/series.lux | 213 ++- .../source/test/lux/world/time/series/average.lux | 100 ++ 38 files changed, 3801 insertions(+), 3603 deletions(-) delete mode 100644 stdlib/source/library/lux/data/format/css.lux delete mode 100644 stdlib/source/library/lux/data/format/css/class.lux delete mode 100644 stdlib/source/library/lux/data/format/css/font.lux delete mode 100644 stdlib/source/library/lux/data/format/css/id.lux delete mode 100644 stdlib/source/library/lux/data/format/css/property.lux delete mode 100644 stdlib/source/library/lux/data/format/css/query.lux delete mode 100644 stdlib/source/library/lux/data/format/css/selector.lux delete mode 100644 stdlib/source/library/lux/data/format/css/style.lux delete mode 100644 stdlib/source/library/lux/data/format/css/value.lux delete mode 100644 stdlib/source/library/lux/data/format/html.lux create mode 100644 stdlib/source/library/lux/web/css.lux create mode 100644 stdlib/source/library/lux/web/css/class.lux create mode 100644 stdlib/source/library/lux/web/css/font.lux create mode 100644 stdlib/source/library/lux/web/css/id.lux create mode 100644 stdlib/source/library/lux/web/css/property.lux create mode 100644 stdlib/source/library/lux/web/css/query.lux create mode 100644 stdlib/source/library/lux/web/css/selector.lux create mode 100644 stdlib/source/library/lux/web/css/style.lux create mode 100644 stdlib/source/library/lux/web/css/value.lux create mode 100644 stdlib/source/library/lux/web/html.lux create mode 100644 stdlib/source/library/lux/world/time/series/average.lux create mode 100644 stdlib/source/test/lux/world/time/series/average.lux (limited to 'stdlib/source') diff --git a/stdlib/source/library/lux/data/collection/sequence.lux b/stdlib/source/library/lux/data/collection/sequence.lux index 72d48f6f1..2d114ca91 100644 --- a/stdlib/source/library/lux/data/collection/sequence.lux +++ b/stdlib/source/library/lux/data/collection/sequence.lux @@ -225,11 +225,11 @@ #root (empty_hierarchy []) #tail (array.empty 0)]) -(def .public (size sequence) +(def .public size (All (_ of) (-> (Sequence of) Nat)) - (the #size sequence)) + (the #size)) (def .public (suffix val sequence) (All (_ of) diff --git a/stdlib/source/library/lux/data/color.lux b/stdlib/source/library/lux/data/color.lux index 5d7c33920..a886acb79 100644 --- a/stdlib/source/library/lux/data/color.lux +++ b/stdlib/source/library/lux/data/color.lux @@ -5,8 +5,6 @@ [monoid (.only Monoid)] ["[0]" equivalence (.only Equivalence)] ["[0]" hash (.only Hash)]] - [control - ["[0]" try]] [data [collection ["[0]" list (.use "[1]#[0]" functor)]]] @@ -99,12 +97,11 @@ (f.+ (|> end .int int.frac (f.* dE))) f.int .nat))) - [redS greenS blueS] (rgb start) - [redE greenE blueE] (rgb end)] - (|> (rgb.rgb (interpolated' (rgb.number redE) (rgb.number redS)) - (interpolated' (rgb.number greenE) (rgb.number greenS)) - (interpolated' (rgb.number blueE) (rgb.number blueS))) - try.trusted + start (rgb start) + end (rgb end)] + (|> (rgb.rgb (interpolated' (rgb.red end) (rgb.red start)) + (interpolated' (rgb.green end) (rgb.green start)) + (interpolated' (rgb.blue end) (rgb.blue start))) of_rgb))) (with_template [ ] diff --git a/stdlib/source/library/lux/data/color/cmyk.lux b/stdlib/source/library/lux/data/color/cmyk.lux index 6dc6b1f2a..ae47d9604 100644 --- a/stdlib/source/library/lux/data/color/cmyk.lux +++ b/stdlib/source/library/lux/data/color/cmyk.lux @@ -4,7 +4,6 @@ [abstract [equivalence (.only Equivalence)]] [control - ["[0]" try] [function [predicate (.only Predicate)]]] [data @@ -16,7 +15,7 @@ [// ["[0]" rgb (.only RGB)]]) -(def .public Value +(type .public Value Frac) (with_template [ ] @@ -79,9 +78,9 @@ (def .public (cmyk it) (-> RGB CMYK) - (let [red (..down (rgb.number (the rgb.#red it))) - green (..down (rgb.number (the rgb.#green it))) - blue (..down (rgb.number (the rgb.#blue it))) + (let [red (..down (rgb.red it)) + green (..down (rgb.green it)) + blue (..down (rgb.blue it)) key (opposite (all f.max red green blue)) f (if (f.< ..most key) (f./ (opposite key) @@ -100,14 +99,7 @@ rgb.black key - (let [~key (opposite key) - red (f.* ~key - (opposite (the #cyan it))) - green (f.* ~key - (opposite (the #magenta it))) - blue (f.* ~key - (opposite (the #yellow it)))] - (|> (rgb.rgb (..up red) - (..up green) - (..up blue)) - try.trusted)))) + (let [~key (opposite key)] + (rgb.rgb (..up (f.* ~key (opposite (the #cyan it)))) + (..up (f.* ~key (opposite (the #magenta it)))) + (..up (f.* ~key (opposite (the #yellow it)))))))) diff --git a/stdlib/source/library/lux/data/color/hsb.lux b/stdlib/source/library/lux/data/color/hsb.lux index 9f07a50eb..5421c2dc3 100644 --- a/stdlib/source/library/lux/data/color/hsb.lux +++ b/stdlib/source/library/lux/data/color/hsb.lux @@ -4,7 +4,6 @@ [abstract [equivalence (.only Equivalence)]] [control - ["[0]" try] [function [predicate (.only Predicate)]]] [math @@ -98,9 +97,9 @@ (def .public (of_rgb it) (-> RGB HSB) - (let [red (..down (rgb.number (the rgb.#red it))) - green (..down (rgb.number (the rgb.#green it))) - blue (..down (rgb.number (the rgb.#blue it))) + (let [red (..down (rgb.red it)) + green (..down (rgb.green it)) + blue (..down (rgb.blue it)) max (all f.max red green blue) min (all f.min red green blue) @@ -145,8 +144,7 @@ red (when mod 0 v 1 q 2 p 3 p 4 t 5 v _ (undefined)) green (when mod 0 t 1 v 2 v 3 q 4 p 5 p _ (undefined)) blue (when mod 0 p 1 p 2 t 3 v 4 v 5 q _ (undefined))] - (try.trusted - (rgb.rgb (..up red) - (..up green) - (..up blue))))) + (rgb.rgb (..up red) + (..up green) + (..up blue)))) ) diff --git a/stdlib/source/library/lux/data/color/hsl.lux b/stdlib/source/library/lux/data/color/hsl.lux index 4a4c13097..ce57f5210 100644 --- a/stdlib/source/library/lux/data/color/hsl.lux +++ b/stdlib/source/library/lux/data/color/hsl.lux @@ -5,12 +5,8 @@ [equivalence (.only Equivalence)] [monad (.only do)]] [control - ["[0]" try] [function [predicate (.only Predicate)]]] - [data - [text - ["%" \\format]]] [math [number ["i" int] @@ -102,9 +98,9 @@ (def .public (of_rgb it) (-> RGB HSL) - (let [red (..down (rgb.number (the rgb.#red it))) - green (..down (rgb.number (the rgb.#green it))) - blue (..down (rgb.number (the rgb.#blue it))) + (let [red (..down (rgb.red it)) + green (..down (rgb.green it)) + blue (..down (rgb.blue it)) max (all f.max red green blue) min (all f.min red green blue) @@ -160,18 +156,17 @@ (-> HSL RGB) (let [[hue saturation luminance] (nominal.representation it)] - (try.trusted - (if (f.= ..least saturation) - ... Achromatic - (let [intensity (..up luminance)] - (rgb.rgb intensity intensity intensity)) - ... Chromatic - (let [q (if (f.< +0.5 luminance) - (|> saturation (f.+ +1.0) (f.* luminance)) - (|> luminance (f.+ saturation) (f.- (f.* saturation luminance)))) - p (|> luminance (f.* +2.0) (f.- q)) - third (|> +1.0 (f./ +3.0))] - (rgb.rgb (|> hue (f.+ third) (hue_rgb p q)) - (|> hue (hue_rgb p q)) - (|> hue (f.- third) (hue_rgb p q)))))))) + (if (f.= ..least saturation) + ... Achromatic + (let [intensity (..up luminance)] + (rgb.rgb intensity intensity intensity)) + ... Chromatic + (let [q (if (f.< +0.5 luminance) + (|> saturation (f.+ +1.0) (f.* luminance)) + (|> luminance (f.+ saturation) (f.- (f.* saturation luminance)))) + p (|> luminance (f.* +2.0) (f.- q)) + third (|> +1.0 (f./ +3.0))] + (rgb.rgb (|> hue (f.+ third) (hue_rgb p q)) + (|> hue (hue_rgb p q)) + (|> hue (f.- third) (hue_rgb p q))))))) ) diff --git a/stdlib/source/library/lux/data/color/named.lux b/stdlib/source/library/lux/data/color/named.lux index 29f58b285..90c603977 100644 --- a/stdlib/source/library/lux/data/color/named.lux +++ b/stdlib/source/library/lux/data/color/named.lux @@ -1,8 +1,6 @@ (.require [library [lux (.except) - [control - ["[0]" try]] [math [number (.only hex)]]]] ["[0]" // (.only Color) @@ -15,7 +13,6 @@ (|> (rgb.rgb (hex ) (hex ) (hex )) - try.trusted //.of_rgb)))] ["F0" "F8" "FF" alice_blue] diff --git a/stdlib/source/library/lux/data/color/rgb.lux b/stdlib/source/library/lux/data/color/rgb.lux index 8c14e7903..9f812baa9 100644 --- a/stdlib/source/library/lux/data/color/rgb.lux +++ b/stdlib/source/library/lux/data/color/rgb.lux @@ -7,11 +7,10 @@ [equivalence (.only Equivalence)] ["[0]" hash (.only Hash)]] [control - ["[0]" try (.only Try)] - ["[0]" exception (.only Exception)]] + [function + [predicate (.only Predicate)]]] [data - [text - ["%" \\format]]] + ["[0]" product]] [math [number ["n" nat] @@ -24,101 +23,103 @@ Nat 256) -(nominal.def .public Value - Nat - - (def .public least - Value - (nominal.abstraction 0)) +(type .public Value + Nat) - (def .public most - Value - (nominal.abstraction (-- ..limit))) +(with_template [ ] + [(def .public + Value + )] - (exception.def .public (invalid it) - (Exception Nat) - (exception.report - (list ["Limit" (%.nat ..limit)] - ["Value" (%.nat it)]))) + [least 0] + [most (-- limit)] + ) - (def .public (value it) - (-> Nat - (Try Value)) - (if (n.< ..limit it) - {try.#Success (nominal.abstraction it)} - (exception.except ..invalid [it]))) +(def .public (value? it) + (Predicate Nat) + (not (or (n.< ..least it) + (n.> ..most it)))) - (def .public number - (-> Value Nat) - (|>> nominal.representation)) +(def .public value + (-> Nat + Value) + (|>> (n.max ..least) + (n.min ..most))) - (type .public RGB - (Record - [#red Value - #green Value - #blue Value])) +(nominal.def .public RGB + (Record + [#red Value + #green Value + #blue Value]) (def .public (rgb red green blue) (-> Nat Nat Nat - (Try RGB)) - (do try.monad - [red (value red) - green (value green) - blue (value blue)] - (in [#red red - #green green - #blue blue]))) - - (def .public equivalence - (Equivalence RGB) - (implementation - (def (= [rR gR bR] [rS gS bS]) - (and (n.= (nominal.representation rR) (nominal.representation rS)) - (n.= (nominal.representation gR) (nominal.representation gS)) - (n.= (nominal.representation bR) (nominal.representation bS)))))) + RGB) + (nominal.abstraction + [#red (value red) + #green (value green) + #blue (value blue)])) + + (with_template [ ] + [(def .public + (-> RGB + Value) + (|>> nominal.representation + (the )))] + + [red #red] + [green #green] + [blue #blue] + ) (def .public hash (Hash RGB) - (implementation - (def equivalence - ..equivalence) + (of hash.functor each + (|>> nominal.representation) + (all product.hash + n.hash + n.hash + n.hash + ))) - (def (hash [r g b]) - (all i64.or - (i64.left_shifted 16 (nominal.representation r)) - (i64.left_shifted 08 (nominal.representation g)) - (nominal.representation b))))) + (def .public equivalence + (Equivalence RGB) + (of ..hash equivalence)) (def (opposite_intensity value) - (-> Nat Nat) - (|> (nominal.representation ..most) + (-> Nat + Nat) + (|> ..most (n.- value))) (def .public (complement it) - (-> RGB RGB) - (`` [(,, (with_template [] - [ (|> it - (the ) - nominal.representation - opposite_intensity - nominal.abstraction)] - - [#red] - [#green] - [#blue] - ))])) + (-> RGB + RGB) + (nominal.abstraction + (`` [(,, (with_template [] + [ (|> it + nominal.representation + (the ) + opposite_intensity)] + + [#red] + [#green] + [#blue] + ))]))) (def .public black RGB - [#red ..least - #green ..least - #blue ..least]) + (nominal.abstraction + [#red ..least + #green ..least + #blue ..least])) (def .public white RGB - [#red ..most - #green ..most - #blue ..most]) + (nominal.abstraction + [#red ..most + #green ..most + #blue ..most])) (with_template [ ] [(def .public @@ -130,15 +131,15 @@ (def (composite left right) (let [left ( left) right ( right)] - (`` [(,, (with_template [] - [ (nominal.abstraction - ( (nominal.representation (the left)) - (nominal.representation (the right))))] - - [#red] - [#green] - [#blue] - ))])))))] + (nominal.abstraction + (`` [(,, (with_template [] + [ ( (the (nominal.representation left)) + (the (nominal.representation right)))] + + [#red] + [#green] + [#blue] + ))]))))))] [addition ..black n.max |> |>] [subtraction ..white n.min ..complement |>] diff --git a/stdlib/source/library/lux/data/color/terminal.lux b/stdlib/source/library/lux/data/color/terminal.lux index d59f2986b..64cf6bb64 100644 --- a/stdlib/source/library/lux/data/color/terminal.lux +++ b/stdlib/source/library/lux/data/color/terminal.lux @@ -90,9 +90,9 @@ (let [it (//.rgb it)] (|> [(%.format ..command - ";" (%.nat (rgb.number (the rgb.#red it))) - ";" (%.nat (rgb.number (the rgb.#green it))) - ";" (%.nat (rgb.number (the rgb.#blue it))) + ";" (%.nat (rgb.red it)) + ";" (%.nat (rgb.green it)) + ";" (%.nat (rgb.blue it)) "m") ] (nominal.abstraction Command))))] diff --git a/stdlib/source/library/lux/data/format/css.lux b/stdlib/source/library/lux/data/format/css.lux deleted file mode 100644 index 517dd9f53..000000000 --- a/stdlib/source/library/lux/data/format/css.lux +++ /dev/null @@ -1,176 +0,0 @@ -(.require - [library - [lux (.except and) - [control - ["[0]" maybe]] - [data - ["[0]" text (.only) - ["%" \\format (.only format)] - ["[0]" encoding (.only Encoding)]] - [collection - ["[0]" list (.use "[1]#[0]" functor)]]] - [math - [number - ["[0]" nat]]] - [meta - [type - ["[0]" nominal (.except Frame def)]]] - [world - [net (.only URL)]]]] - ["[0]" / - ["[1][0]" selector (.only Selector Combinator Specializer Generic)] - ["[1][0]" value (.only Value Animation Percentage)] - ["[1][0]" property (.only Property)] - ["[1][0]" font (.only Font)] - ["[1][0]" style] - ["[1][0]" query (.only Query)]]) - -(nominal.def .public Common Any) -(nominal.def .public Special Any) - -(nominal.def .public (CSS brand) - Text - - (def .public css - (-> (CSS Any) Text) - (|>> representation)) - - (def .public empty - (CSS Any) - (abstraction "")) - - (type .public Style - (List (Ex (_ brand) - [(Property brand) - (Value brand)]))) - - (def .public (rule selector style) - (-> (Selector Any) Style (CSS Common)) - (abstraction (format (/selector.selector selector) "{" (/style.inline (/style.style style)) "}"))) - - (def .public char_set - (-> Encoding (CSS Special)) - (|>> encoding.name - %.text - (text.enclosed ["@charset " ";"]) - abstraction)) - - (def .public (font font) - (-> Font (CSS Special)) - (let [with_unicode (when (the /font.#unicode_range font) - {.#Some unicode_range} - (let [unicode_range' (format "U+" (of nat.hex encoded (the /font.#start unicode_range)) - "-" (of nat.hex encoded (the /font.#end unicode_range)))] - (list ["unicode-range" unicode_range'])) - - {.#None} - (list))] - (|> (list.partial ["font-family" (the /font.#family font)] - ["src" (format "url(" (the /font.#source font) ")")] - ["font-stretch" (|> font (the /font.#stretch) (maybe.else /value.normal_stretch) /value.value)] - ["font-style" (|> font (the /font.#style) (maybe.else /value.normal_style) /value.value)] - ["font-weight" (|> font (the /font.#weight) (maybe.else /value.normal_weight) /value.value)] - with_unicode) - (list#each (function (_ [property value]) - (format property ": " value ";"))) - text.together - (text.enclosed ["{" "}"]) - (format "@font-face") - abstraction))) - - (def .public (import url query) - (-> URL (Maybe Query) (CSS Special)) - (abstraction (format (format "@import url(" (%.text url) ")") - (when query - {.#Some query} - (format " " (/query.query query)) - - {.#None} - "") - ";"))) - - (def separator - text.new_line) - - (type .public Frame - (Record - [#when (Value Percentage) - #what Style])) - - (def .public (key_frames animation frames) - (-> (Value Animation) (List Frame) (CSS Special)) - (abstraction (format "@keyframes " (/value.value animation) " {" - (|> frames - (list#each (function (_ frame) - (format (/value.value (the #when frame)) " {" - (/style.inline (/style.style (the #what frame))) - "}"))) - (text.interposed ..separator)) - "}"))) - - (def !composite - (template (!composite
 )
-      [(abstraction
-        (format (representation 
)
-                ..separator
-                (representation )))]))
-  
-  (def .public (and pre post)
-    (All (_ kind) (-> (CSS kind) (CSS kind) (CSS kind)))
-    (!composite pre post))
-
-  (def .public (in_context combinator selector css)
-    (-> Combinator (Selector Any) (CSS Common) (CSS Common))
-    (|> css
-        representation
-        (text.all_split_by ..separator)
-        (list#each (let [prefix (|> selector
-                                    (combinator (/selector.tag ""))
-                                    /selector.selector)]
-                     (|>> (format prefix))))
-        (text.interposed ..separator)
-        abstraction))
-
-  (def .public (dependent combinator selector style inner)
-    (-> Combinator (Selector Any) Style (CSS Common) (CSS Common))
-    (!composite (..rule selector style)
-                (..in_context combinator selector inner)))
-
-  (with_template [ ]
-    [(def .public 
-       (-> (Selector Any) Style (CSS Common) (CSS Common))
-       (..dependent ))]
-
-    [with_descendants /selector.in]
-    [with_children /selector.sub]
-    )
-
-  (def .public (in_case specializer selector css)
-    (All (_ kind)
-      (-> (Specializer kind) (Selector (Generic Any)) (CSS Common) (CSS Common)))
-    (|> css
-        representation
-        (text.all_split_by ..separator)
-        (list#each (let [prefix (|> selector
-                                    (specializer (as_expected (/selector.tag "")))
-                                    /selector.selector)]
-                     (|>> (format prefix))))
-        (text.interposed ..separator)
-        abstraction))
-
-  (def .public (specialized combinator selector style inner)
-    (All (_ kind)
-      (-> (Specializer kind) (Selector (Generic Any)) Style (CSS Common) (CSS Common)))
-    (!composite (..rule selector style)
-                (..in_case combinator selector inner)))
-
-  (with_template [ ]
-    [(def .public 
-       (-> (Selector (Generic Any)) Style (CSS Common) (CSS Common))
-       (..specialized ))]
-
-    [with_case /selector.and]
-    [with_part /selector.at]
-    [with_element /selector.for]
-    )
-  )
diff --git a/stdlib/source/library/lux/data/format/css/class.lux b/stdlib/source/library/lux/data/format/css/class.lux
deleted file mode 100644
index 46e980a47..000000000
--- a/stdlib/source/library/lux/data/format/css/class.lux
+++ /dev/null
@@ -1,34 +0,0 @@
-(.require
- [library
-  [lux (.except)
-   [abstract
-    [monad (.only do)]]
-   [data
-    ["[0]" text (.use "[1]#[0]" hash)
-     ["%" \\format (.only format)]]]
-   ["[0]" meta (.only)
-    ["[0]" code]
-    [macro
-     [syntax (.only syntax)]]
-    [type
-     ["[0]" nominal (.except def)]]]]])
-
-(nominal.def .public Class
-  Text
-
-  (def .public class
-    (-> Class Text)
-    (|>> representation))
-
-  (def .public custom
-    (-> Text Class)
-    (|>> abstraction))
-
-  (def .public generic
-    (syntax (_ [])
-      (do meta.monad
-        [module meta.current_module_name
-         class meta.seed]
-        (in (list (` (..custom (, (code.text (format "c" (%.nat_16 class)
-                                                     "_" (%.nat_16 (text#hash module))))))))))))
-  )
diff --git a/stdlib/source/library/lux/data/format/css/font.lux b/stdlib/source/library/lux/data/format/css/font.lux
deleted file mode 100644
index f69a8f602..000000000
--- a/stdlib/source/library/lux/data/format/css/font.lux
+++ /dev/null
@@ -1,24 +0,0 @@
-(.require
- [library
-  [lux (.except #source)
-   [meta
-    [code
-     ["s" \\parser]]]
-   [world
-    [net (.only URL)]]]]
- ["[0]" //
-  ["[1][0]" value (.only Value Font_Stretch Font_Style Font_Weight)]])
-
-(type .public Unicode_Range
-  (Record
-   [#start Nat
-    #end Nat]))
-
-(type .public Font
-  (Record
-   [#family Text
-    #source URL
-    #stretch (Maybe (Value Font_Stretch))
-    #style (Maybe (Value Font_Style))
-    #weight (Maybe (Value Font_Weight))
-    #unicode_range (Maybe Unicode_Range)]))
diff --git a/stdlib/source/library/lux/data/format/css/id.lux b/stdlib/source/library/lux/data/format/css/id.lux
deleted file mode 100644
index fc93ec1bb..000000000
--- a/stdlib/source/library/lux/data/format/css/id.lux
+++ /dev/null
@@ -1,34 +0,0 @@
-(.require
- [library
-  [lux (.except)
-   [abstract
-    [monad (.only do)]]
-   [data
-    ["[0]" text (.use "[1]#[0]" hash)
-     ["%" \\format (.only format)]]]
-   ["[0]" meta (.only)
-    ["[0]" code]
-    [macro
-     [syntax (.only syntax)]]
-    [type
-     ["[0]" nominal (.except def)]]]]])
-
-(nominal.def .public ID
-  Text
-
-  (def .public id
-    (-> ID Text)
-    (|>> representation))
-
-  (def .public custom
-    (-> Text ID)
-    (|>> abstraction))
-
-  (def .public generic
-    (syntax (_ [])
-      (do meta.monad
-        [module meta.current_module_name
-         id meta.seed]
-        (in (list (` (..custom (, (code.text (format "i" (%.nat_16 id)
-                                                     "_" (%.nat_16 (text#hash module))))))))))))
-  )
diff --git a/stdlib/source/library/lux/data/format/css/property.lux b/stdlib/source/library/lux/data/format/css/property.lux
deleted file mode 100644
index 192f0395a..000000000
--- a/stdlib/source/library/lux/data/format/css/property.lux
+++ /dev/null
@@ -1,517 +0,0 @@
-(.require
- [library
-  [lux (.except All Location all left right)
-   [data
-    ["[0]" text]]
-   [meta
-    ["[0]" code (.only)
-     ["s" \\parser]]
-    [macro
-     [syntax (.only syntax)]
-     ["[0]" template]]
-    [type
-     ["[0]" nominal (.except def)]]]]]
- [//
-  [value (.only All
-                Number
-                Length Thickness Time
-                Color
-                Location Fit
-                Slice
-                Alignment Animation_Direction
-                Animation Animation_Fill
-                Column_Fill Column_Span
-                Iteration Count
-                Play
-                Timing Visibility Attachment
-                Blend Span Image
-                Angle Repeat Border
-                Collapse Box_Decoration_Break Caption
-                Float Clear
-                Content
-                Cursor
-                Shadow Clip
-                Text_Direction
-                Display Empty
-                Filter
-                Flex_Direction Flex_Wrap
-                Font Font_Kerning Font_Size Font_Stretch Font_Style Font_Weight Font_Variant
-                Grid Grid_Content Grid_Flow Grid_Span Grid_Template
-                Hanging_Punctuation Hyphens Isolation
-                List_Style_Position List_Style_Type
-                Overflow Page_Break Pointer_Events
-                Position
-                Quotes
-                Resize Scroll_Behavior Table_Layout
-                Text_Align Text_Align_Last
-                Text_Decoration_Line Text_Decoration_Style
-                Text_Justification Text_Overflow Text_Transform
-                Transform Transform_Origin Transform_Style
-                Transition
-                Bidi User_Select
-                Vertical_Align
-                White_Space Word_Break Word_Wrap Writing_Mode
-                Z_Index)]])
-
-(def text_symbol
-  (syntax (_ [symbol s.text])
-    (in (list (code.local (text.replaced "-" "_" symbol))))))
-
-(nominal.def .public (Property brand)
-  Text
-
-  (def .public name
-    (-> (Property Any) Text)
-    (|>> representation))
-
-  (with_template [ + +]
-    [(`` (with_template [ ]
-           [(def .public 
-              (Property )
-              (abstraction ))]
-
-           (,, (template.spliced +))))
-
-     (with_expansions [ (template.spliced +)]
-       (with_template []
-         [(`` (def .public (,, (text_symbol ))
-                (Property )
-                (abstraction )))]
-         
-         ))]
-
-    [All
-     []
-     [["all"]]]
-
-    [Length
-     []
-     [["border-image-outset"]
-      ["border-image-width"]
-      ["bottom"]
-      ["column-gap"]
-      ["column-width"]
-      ["flex-basis"]
-      ["grid-column-gap"]
-      ["grid-gap"]
-      ["grid-row-gap"]
-      ["height"]
-      ["left"]
-      ["letter-spacing"]
-      ["line-height"]
-      ["margin"]
-      ["margin-bottom"]
-      ["margin-left"]
-      ["margin-right"]
-      ["margin-top"]
-      ["max-height"]
-      ["max-width"]
-      ["min-height"]
-      ["min-width"]
-      ["outline-offset"]
-      ["padding"]
-      ["padding-bottom"]
-      ["padding-left"]
-      ["padding-right"]
-      ["padding-top"]
-      ["perspective"]
-      ["right"]
-      ["text-indent"]
-      ["top"]
-      ["width"]
-      ["word-spacing"]]]
-
-    [Time
-     []
-     [["animation-delay"]
-      ["animation-duration"]
-      ["transition-delay"]
-      ["transition-duration"]]]
-
-    [Slice
-     []
-     [["border-image-slice"]]]
-
-    [Color
-     [[text_color "color"]]
-     [["background-color"]
-      ["border-color"]
-      ["border-bottom-color"]
-      ["border-left-color"]
-      ["border-right-color"]
-      ["border-top-color"]
-      ["caret-color"]
-      ["column-rule-color"]
-      ["outline-color"]
-      ["text-decoration-color"]]]
-
-    [Alignment
-     []
-     [["align-content"]
-      ["align-items"]
-      ["align-self"]
-      ["justify-content"]]]
-
-    [Animation
-     []
-     [["animation-name"]]]
-
-    [Animation_Direction
-     []
-     [["animation-direction"]]]
-
-    [Animation_Fill
-     []
-     [["animation-fill-mode"]]]
-
-    [Column_Fill
-     []
-     [["column-fill"]]]
-
-    [Column_Span
-     []
-     [["column-span"]]]
-
-    [Iteration
-     []
-     [["animation-iteration-count"]]]
-
-    [Count
-     []
-     [["column-count"]
-      ["flex-grow"]
-      ["flex-shrink"]
-      ["order"]
-      ["tab-size"]]]
-
-    [Play
-     []
-     [["animation-play-state"]]]
-
-    [Timing
-     []
-     [["animation-timing-function"]
-      ["transition-timing-function"]]]
-
-    [Visibility
-     []
-     [["backface-visibility"]
-      ["visibility"]]]
-
-    [Attachment
-     []
-     [["background-attachment"]]]
-
-    [Blend
-     []
-     [["background-blend-mode"]
-      ["mix-blend-mode"]]]
-
-    [Image
-     []
-     [["background-image"]
-      ["border-image-source"]
-      ["list-style-image"]]]
-
-    [Span
-     []
-     [["background-clip"]
-      ["background-origin"]
-      ["box-sizing"]]]
-
-    [Location
-     []
-     [["background-position"]
-      ["object-position"]
-      ["perspective-origin"]]]
-
-    [Repeat
-     []
-     [["background-repeat"]
-      ["border-image-repeat"]]]
-
-    [Fit
-     []
-     [["background-size"]
-      ["border-radius"]
-      ["border-bottom-left-radius"]
-      ["border-bottom-right-radius"]
-      ["border-top-left-radius"]
-      ["border-top-right-radius"]
-      ["border-spacing"]
-      ["object-fit"]]]
-
-    [Border
-     []
-     [["border-style"]
-      ["border-bottom-style"]
-      ["border-left-style"]
-      ["border-right-style"]
-      ["border-top-style"]
-      ["column-rule-style"]
-      ["outline-style"]]]
-
-    [Thickness
-     []
-     [["border-width"]
-      ["border-bottom-width"]
-      ["border-left-width"]
-      ["border-right-width"]
-      ["border-top-width"]
-      ["column-rule-width"]
-      ["outline-width"]]]
-
-    [Collapse
-     []
-     [["border-collapse"]]]
-
-    [Box_Decoration_Break
-     []
-     [["box-decoration-break"]]]
-
-    [Caption
-     []
-     [["caption-side"]]]
-
-    [Clear
-     []
-     [["clear"]]]
-
-    [Shadow
-     []
-     [["box-shadow"]
-      ["text-shadow"]]]
-    
-    [Clip
-     []
-     [["clip"]]]
-
-    [Content
-     []
-     [["counter-reset"]
-      ["counter-increment"]]]
-
-    [Cursor
-     []
-     [["cursor"]]]
-
-    [Text_Direction
-     [[text_direction "direction"]]
-     []]
-
-    [Display
-     []
-     [["display"]]]
-
-    [Empty
-     []
-     [["empty-cells"]]]
-
-    [Filter
-     []
-     [["filter"]]]
-
-    [Flex_Direction
-     []
-     [["flex-direction"]]]
-
-    [Flex_Wrap
-     []
-     [["flex-wrap"]]]
-
-    [Float
-     []
-     [["float"]]]
-
-    [Font
-     []
-     [["font-family"]]]
-
-    [Font_Kerning
-     []
-     [["font-kerning"]]]
-
-    [Font_Size
-     []
-     [["font-size"]]]
-
-    [Font_Stretch
-     []
-     [["font-stretch"]]]
-
-    [Font_Style
-     []
-     [["font-style"]]]
-
-    [Font_Weight
-     []
-     [["font-weight"]]]
-
-    [Font_Variant
-     []
-     [["font-variant"]]]
-
-    [Grid
-     []
-     [["grid-area"]]]
-
-    [Grid_Content
-     []
-     [["grid-auto-columns"]
-      ["grid-auto-rows"]
-      ["grid-template-columns"]
-      ["grid-template-rows"]]]
-
-    [Grid_Flow
-     []
-     [["grid-auto-flow"]]]
-
-    [Grid_Span
-     []
-     [["grid-column-end"]
-      ["grid-column-start"]
-      ["grid-row-end"]
-      ["grid-row-start"]]]
-
-    [Grid_Template
-     []
-     [["grid-template-areas"]]]
-
-    [Hanging_Punctuation
-     []
-     [["hanging-punctuation"]]]
-
-    [Hyphens
-     []
-     [["hyphens"]]]
-
-    [Isolation
-     []
-     [["isolation"]]]
-
-    [List_Style_Position
-     []
-     [["list-style-position"]]]
-
-    [List_Style_Type
-     []
-     [["list-style-type"]]]
-
-    [Number
-     []
-     [["font-size-adjust"]
-      ["opacity"]]]
-
-    [Overflow
-     []
-     [["overflow"]
-      ["overflow-x"]
-      ["overflow-y"]]]
-
-    [Page_Break
-     []
-     [["page-break-after"]
-      ["page-break-before"]
-      ["page-break-inside"]]]
-
-    [Pointer_Events
-     []
-     [["pointer-events"]]]
-
-    [Position
-     []
-     [["position"]]]
-
-    [Quotes
-     []
-     [["quotes"]]]
-
-    [Resize
-     []
-     [["resize"]]]
-
-    [Scroll_Behavior
-     []
-     [["scroll-behavior"]]]
-
-    [Table_Layout
-     []
-     [["table-layout"]]]
-
-    [Text_Align
-     []
-     [["text-align"]]]
-
-    [Text_Align_Last
-     []
-     [["text-align-last"]]]
-
-    [Text_Decoration_Line
-     []
-     [["text-decoration-line"]]]
-
-    [Text_Decoration_Style
-     []
-     [["text-decoration-style"]]]
-
-    [Text_Justification
-     []
-     [["text-justify"]]]
-
-    [Text_Overflow
-     []
-     [["text-overflow"]]]
-
-    [Text_Transform
-     []
-     [["text-transform"]]]
-
-    [Transform
-     []
-     [["transform"]]]
-
-    [Transform_Origin
-     []
-     [["transform-origin"]]]
-
-    [Transform_Style
-     []
-     [["transform-style"]]]
-
-    [Transition
-     []
-     [["transition-property"]]]
-
-    [Bidi
-     []
-     [["unicode-bidi"]]]
-
-    [User_Select
-     []
-     [["user-select"]]]
-
-    [Vertical_Align
-     []
-     [["vertical-align"]]]
-
-    [White_Space
-     []
-     [["white-space"]]]
-
-    [Word_Break
-     []
-     [["word-break"]]]
-
-    [Word_Wrap
-     []
-     [["word-wrap"]]]
-
-    [Writing_Mode
-     []
-     [["writing-mode"]]]
-
-    [Z_Index
-     []
-     [["z-index"]]]
-    )
-  )
diff --git a/stdlib/source/library/lux/data/format/css/query.lux b/stdlib/source/library/lux/data/format/css/query.lux
deleted file mode 100644
index de3defe3b..000000000
--- a/stdlib/source/library/lux/data/format/css/query.lux
+++ /dev/null
@@ -1,135 +0,0 @@
-(.require
- [library
-  [lux (.except and or not all only except)
-   [data
-    ["[0]" text (.only)
-     ["%" \\format (.only format)]]]
-   [meta
-    ["[0]" code (.only)
-     ["s" \\parser]]
-    [macro
-     [syntax (.only syntax)]
-     ["[0]" template]]
-    [type
-     ["[0]" nominal (.except def)]]]]]
- ["[0]" //
-  ["[1][0]" value (.only Value Length Count Resolution Ratio
-                         Orientation Scan Boolean Update
-                         Block_Overflow Inline_Overflow
-                         Display_Mode Color_Gamut Inverted_Colors
-                         Pointer Hover
-                         Light Scripting Motion Color_Scheme)]])
-
-(def text_symbol
-  (syntax (_ [symbol s.text])
-    (in (list (code.local (text.replaced "-" "_" symbol))))))
-
-(nominal.def .public Media
-  Text
-
-  (def .public media
-    (-> Media Text)
-    (|>> representation))
-
-  (with_template []
-    [(`` (def .public (,, (text_symbol ))
-           Media
-           (abstraction )))]
-
-    ["all"]
-    ["print"]
-    ["screen"]
-    ["speech"]
-    ))
-
-(nominal.def .public Feature
-  Text
-
-  (def .public feature
-    (-> Feature Text)
-    (|>> representation))
-
-  (with_template [ ]
-    [(`` (def .public ((,, (text_symbol )) input)
-           (-> (Value ) Feature)
-           (abstraction (format "("  ": " (//value.value input) ")"))))]
-
-    ["min-color" Count]
-    ["color" Count]
-    ["max-color" Count]
-
-    ["min-color-index" Count]
-    ["color-index" Count]
-    ["max-color-index" Count]
-
-    ["min-monochrome" Count]
-    ["monochrome" Count]
-    ["max-monochrome" Count]
-
-    ["min-height" Length]
-    ["height" Length]
-    ["max-height" Length]
-
-    ["min-width" Length]
-    ["width" Length]
-    ["max-width" Length]
-
-    ["min-resolution" Resolution]
-    ["resolution" Resolution]
-    ["max-resolution" Resolution]
-
-    ["aspect-ratio" Ratio]
-    ["max-aspect-ratio" Ratio]
-    ["min-aspect-ratio" Ratio]
-
-    ["display-mode" Display_Mode]
-    ["color-gamut" Color_Gamut]
-    ["grid" Boolean]
-    ["orientation" Orientation]
-    ["overflow-block" Block_Overflow]
-    ["overflow-inline" Inline_Overflow]
-    ["scan" Scan]
-    ["update" Update]
-    ["inverted-colors" Inverted_Colors]
-    ["pointer" Pointer]
-    ["any-pointer" Pointer]
-    ["hover" Hover]
-    ["any-hover" Hover]
-    ["light-level" Light]
-    ["scripting" Scripting]
-    ["prefers-reduced-motion" Motion]
-    ["prefers-color-scheme" Color_Scheme]
-    )
-  )
-
-(nominal.def .public Query
-  Text
-
-  (def .public query
-    (-> Query Text)
-    (|>> representation))
-
-  (with_template [ ]
-    [(def .public 
-       (-> Media Query)
-       (|>> ..media (format ) abstraction))]
-
-    [except "not "]
-    [only "only "]
-    )
-
-  (def .public not
-    (-> Feature Query)
-    (|>> ..feature (format "not ") abstraction))
-
-  (with_template [ ]
-    [(def .public ( left right)
-       (-> Query Query Query)
-       (abstraction (format (representation left)
-                            
-                            (representation right))))]
-
-    [and " and "]
-    [or " or "]
-    )
-  )
diff --git a/stdlib/source/library/lux/data/format/css/selector.lux b/stdlib/source/library/lux/data/format/css/selector.lux
deleted file mode 100644
index 292e27300..000000000
--- a/stdlib/source/library/lux/data/format/css/selector.lux
+++ /dev/null
@@ -1,213 +0,0 @@
-(.require
- [library
-  [lux (.except Label Tag or and for same? not)
-   [data
-    ["[0]" text (.only)
-     ["%" \\format (.only format)]]]
-   [math
-    [number
-     ["i" int]]]
-   [meta
-    [macro
-     ["[0]" template]]
-    [type
-     ["[0]" nominal (.except def)]]]
-   [world
-    ["[0]" locale (.only Locale)]]]]
- ["[0]" //
-  ["[1][0]" id (.only ID)]
-  ["[1][0]" class (.only Class)]])
-
-(type .public Label Text)
-
-(type .public Tag Label)
-(type .public Attribute Label)
-
-(nominal.def .public (Generic brand) Any)
-
-(with_template [ ]
-  [(nominal.def  Any)
-   (type .public  (Generic ))]
-
-  [Can_Chain Can_Chain']
-  [Cannot_Chain Cannot_Chain']
-  )
-
-(nominal.def .public Unique Any)
-(nominal.def .public Specific Any)
-(nominal.def .public Composite Any)
-
-(nominal.def .public (Selector kind)
-  Text
-
-  (def .public selector
-    (-> (Selector Any) Text)
-    (|>> representation))
-
-  (def .public any
-    (Selector Cannot_Chain)
-    (abstraction "*"))
-
-  (def .public tag
-    (-> Tag (Selector Cannot_Chain))
-    (|>> abstraction))
-
-  (with_template [    ]
-    [(def .public 
-       (->  (Selector ))
-       (|>>  (format ) abstraction))]
-
-    [id ID "#" Unique //id.id]
-    [class Class "." Can_Chain //class.class]
-    )
-
-  (with_template [  +]
-    [(`` (with_template [ ]
-           [(def .public ( right left)
-              (-> (Selector ) (Selector ) (Selector Composite))
-              (abstraction (format (representation left)
-                                   
-                                   (representation right))))]
-
-           (,, (template.spliced +))))]
-
-    [Can_Chain (Generic Any)
-     [["" and]]]
-    [Specific (Generic Any)
-     [["" at]]]
-    [Unique (Generic Any)
-     [["" for]]]
-    [Any Any
-     [["," or]
-      [" " in]
-      [">" sub]
-      ["+" next]
-      ["~" later]]]
-    )
-
-  (type .public (Specializer kind)
-    (-> (Selector kind) (Selector (Generic Any)) (Selector Composite)))
-
-  (type .public Combinator
-    (-> (Selector Any) (Selector Any) (Selector Composite)))
-
-  (def .public (with? attribute)
-    (-> Attribute (Selector Can_Chain))
-    (abstraction (format "[" attribute "]")))
-
-  (with_template [ ]
-    [(def .public ( attribute value)
-       (-> Attribute Text (Selector Can_Chain))
-       (abstraction (format "[" attribute  value "]")))]
-
-    ["=" same?]
-    ["~=" has?]
-    ["|=" has_start?]
-    ["^=" starts?]
-    ["$=" ends?]
-    ["*=" contains?]
-    )
-
-  (with_template [ +]
-    [(`` (with_template [ ]
-           [(def .public 
-              (Selector )
-              (abstraction ))]
-
-           (,, (template.spliced +))))]
-
-    [Can_Chain
-     [[active ":active"]
-      [checked ":checked"]
-      [default ":default"]
-      [disabled ":disabled"]
-      [empty ":empty"]
-      [enabled ":enabled"]
-      [first_child ":first-child"]
-      [first_of_type ":first-of-type"]
-      [focused ":focus"]
-      [hovered ":hover"]
-      [in_range ":in-range"]
-      [indeterminate ":indeterminate"]
-      [invalid ":invalid"]
-      [last_child ":last-child"]
-      [last_of_type ":last-of-type"]
-      [link ":link"]
-      [only_of_type ":only-of-type"]
-      [only_child ":only-child"]
-      [optional ":optional"]
-      [out_of_range ":out-of-range"]
-      [read_only ":read-only"]
-      [read_write ":read-write"]
-      [required ":required"]
-      [root ":root"]
-      [target ":target"]
-      [valid ":valid"]
-      [visited ":visited"]]]
-    
-    [Specific
-     [[after "::after"]
-      [before "::before"]
-      [first_letter "::first-letter"]
-      [first_line "::first-line"]
-      [placeholder "::placeholder"]
-      [selection "::selection"]]]
-    )
-
-  (def .public (language locale)
-    (-> Locale (Selector Can_Chain))
-    (|> locale
-        locale.code
-        (text.enclosed ["(" ")"])
-        (format ":lang")
-        abstraction))
-
-  (def .public not
-    (-> (Selector Any) (Selector Can_Chain))
-    (|>> representation
-         (text.enclosed ["(" ")"])
-         (format ":not")
-         abstraction))
-
-  (nominal.def .public Index
-    Text
-
-    (def .public index
-      (-> Nat Index)
-      (|>> %.nat abstraction))
-
-    (with_template [ ]
-      [(def .public  Index (abstraction ))]
-      
-      [odd "odd"]
-      [even "even"]
-      )
-
-    (type .public Formula
-      (Record
-       [#constant Int
-        #variable Int]))
-
-    (def .public (formula input)
-      (-> Formula Index)
-      (let [(open "_[0]") input]
-        (abstraction (format (if (i.< +0 _#variable)
-                               (%.int _#variable)
-                               (%.nat (.nat _#variable)))
-                             (%.int _#constant)))))
-    
-    (with_template [ ]
-      [(def .public ( index)
-         (-> Index (Selector Can_Chain))
-         (|> (representation index)
-             (text.enclosed ["(" ")"])
-             (format )
-             (abstraction Selector)))]
-
-      [nth_child ":nth-child"]
-      [nth_last_child ":nth-last-child"]
-      [nth_of_type ":nth-of-type"]
-      [nth_last_of_type ":nth-last-of-type"]
-      )
-    )
-  )
diff --git a/stdlib/source/library/lux/data/format/css/style.lux b/stdlib/source/library/lux/data/format/css/style.lux
deleted file mode 100644
index d1bd1899d..000000000
--- a/stdlib/source/library/lux/data/format/css/style.lux
+++ /dev/null
@@ -1,39 +0,0 @@
-(.require
- [library
-  [lux (.except with)
-   [data
-    [text
-     ["%" \\format (.only format)]]
-    [collection
-     ["[0]" list (.use "[1]#[0]" mix)]]]
-   [meta
-    [type
-     ["[0]" nominal (.except def)]]]]]
- ["[0]" //
-  ["[1][0]" value (.only Value)]
-  ["[1][0]" property (.only Property)]])
-
-(nominal.def .public Style
-  Text
-
-  (def .public empty
-    Style
-    (abstraction ""))
-
-  (def .public (with [property value])
-    (All (_ brand)
-      (-> [(Property brand) (Value brand)]
-          (-> Style Style)))
-    (|>> representation
-         (format (//property.name property) ": " (//value.value value) ";")
-         abstraction))
-
-  (def .public inline
-    (-> Style Text)
-    (|>> representation))
-
-  (def .public (style config)
-    (-> (List (Ex (_ brand) [(Property brand) (Value brand)]))
-        Style)
-    (list#mix ..with ..empty config))
-  )
diff --git a/stdlib/source/library/lux/data/format/css/value.lux b/stdlib/source/library/lux/data/format/css/value.lux
deleted file mode 100644
index 035d45c10..000000000
--- a/stdlib/source/library/lux/data/format/css/value.lux
+++ /dev/null
@@ -1,1423 +0,0 @@
-(.require
- [library
-  [lux (.except Label All Location and static false true all)
-   [control
-    ["[0]" maybe]]
-   [data
-    ["[0]" product]
-    ["[0]" color (.only)
-     [pigment (.only Pigment)]
-     ["[0]" rgb]]
-    ["[0]" text (.only)
-     ["%" \\format (.only Format format)]]
-    [collection
-     ["[0]" list (.use "[1]#[0]" functor)]]]
-   [math
-    [number
-     ["n" nat]
-     ["i" int]
-     ["r" rev]
-     ["f" frac]]]
-   [meta
-    ["[0]" code (.only)
-     ["<[1]>" \\parser]]
-    [macro
-     [syntax (.only syntax)]
-     ["[0]" template]]
-    [type
-     ["[0]" nominal (.except def)]]]
-   [world
-    [net (.only URL)]]]]
- [//
-  [selector (.only Label)]])
-
-(def text_symbol
-  (syntax (_ [symbol .text])
-    (in (list (code.local (text.replaced "-" "_" symbol))))))
-
-(def enumeration
-  (template (_    + +)
-    [(nominal.def .public 
-       
-
-       (def .public 
-         (->  )
-         (|>> representation))
-
-       (`` (with_template [ ]
-             [(def .public   (abstraction ))]
-
-             (,, (template.spliced +))
-             ))
-
-       (template.spliced +))]))
-
-(def (%number value)
-  (Format Frac)
-  (let [raw (%.frac value)]
-    (if (f.< +0.0 value)
-      raw
-      (|> raw (text.split_at 1) maybe.trusted product.right))))
-
-(nominal.def .public (Value brand)
-  Text
-
-  (def .public value
-    (-> (Value Any)
-        Text)
-    (|>> representation))
-
-  (with_template [ ]
-    [(def .public 
-       Value
-       (abstraction ))]
-
-    [initial "initial"]
-    [inherit "inherit"]
-    [unset "unset"]
-    )
-
-  (nominal.def .public (Numeric kind) Any)
-
-  (with_template []
-    [(with_expansions [' (template.symbol [ "'"])]
-       (nominal.def .public ' Any)
-       (type .public 
-         (Numeric ')))]
-
-    [Number]
-    [Length]
-    [Time]
-    [Percentage]
-    )
-
-  (with_template [ + +]
-    [(nominal.def .public  Any)
-
-     (`` (with_template [ ]
-           [(def .public 
-              (Value )
-              (abstraction ))]
-           
-           (,, (template.spliced +))))
-
-     (with_expansions [ (template.spliced +)]
-       (with_template []
-         [(`` (def .public (,, (..text_symbol ))
-                (Value )
-                (abstraction )))]
-         
-         ))]
-
-    [All
-     []
-     []]
-
-    [Thickness
-     []
-     [["medium"]
-      ["thin"]
-      ["thick"]]]
-
-    [Slice
-     [[full_slice "fill"]]
-     []]
-
-    [Alignment
-     [[auto_alignment "auto"]]
-     [["stretch"]
-      ["center"]
-      ["flex-start"]
-      ["flex-end"]
-      ["baseline"]
-      ["space-between"]
-      ["space-around"]]]
-
-    [Animation
-     []
-     []]
-
-    [Animation_Direction
-     [[normal_direction "normal"]]
-     [["reverse"]
-      ["alternate"]
-      ["alternate-reverse"]]]
-
-    [Animation_Fill
-     [[fill_forwards "forwards"]
-      [fill_backwards "backwards"]
-      [fill_both "both"]]
-     []]
-
-    [Column_Fill
-     []
-     [["balance"]
-      ["auto"]]]
-
-    [Column_Span
-     []
-     [["all"]]]
-
-    [Iteration
-     []
-     [["infinite"]]]
-
-    [Count
-     []
-     []]
-
-    [Play
-     []
-     [["paused"]
-      ["running"]]]
-
-    [Timing
-     []
-     [["linear"]
-      ["ease"]
-      ["ease-in"]
-      ["ease-out"]
-      ["ease-in-out"]
-      ["step-start"]
-      ["step-end"]]]
-
-    [Visibility
-     [[invisible "hidden"]
-      [collapse_visibility "collapse"]]
-     [["visible"]]]
-
-    [Attachment
-     [[scroll_attachment "scroll"]
-      [fixed_attachment "fixed"]
-      [local_attachment "local"]]
-     []]
-
-    [Blend
-     [[normal_blend "normal"]]
-     [["multiply"]
-      ["screen"]
-      ["overlay"]
-      ["darken"]
-      ["lighten"]
-      ["color-dodge"]
-      ["color-burn"]
-      ["difference"]
-      ["exclusion"]
-      ["hue"]
-      ["saturation"]
-      ["color"]
-      ["luminosity"]]]
-
-    [Span
-     []
-     [["border-box"]
-      ["padding-box"]
-      ["content-box"]]]
-
-    [Image
-     [[no_image "none"]]
-     []]
-
-    [Repeat
-     [[stretch_repeat "stretch"]]
-     [["repeat"]
-      ["repeat-x"]
-      ["repeat-y"]
-      ["no-repeat"]
-      ["space"]
-      ["round"]]]
-
-    [Location
-     [[left_top "left top"]
-      [left_center "left center"]
-      [left_bottom "left bottom"]
-      [right_top "right top"]
-      [right_center "right center"]
-      [right_bottom "right bottom"]
-      [center_top "center top"]
-      [center_center "center center"]
-      [center_bottom "center bottom"]]
-     []]
-
-    [Fit
-     [[no_fit "none"]]
-     [["fill"]
-      ["cover"]
-      ["contain"]
-      ["scale-down"]]]
-
-    [Border
-     []
-     [["hidden"]
-      ["dotted"]
-      ["dashed"]
-      ["solid"]
-      ["double"]
-      ["groove"]
-      ["ridge"]
-      ["inset"]
-      ["outset"]]]
-
-    [Collapse
-     []
-     [["separate"]
-      ["collapse"]]]
-
-    [Box_Decoration_Break
-     []
-     [["slice"]
-      ["clone"]]]
-
-    [Caption
-     []
-     [["top"]
-      ["bottom"]]]
-
-    [Float
-     [[float_left "left"]
-      [float_right "right"]]
-     []]
-
-    [Clear
-     [[clear_left "left"]
-      [clear_right "right"]
-      [clear_both "both"]]
-     []]
-
-    [Counter
-     []
-     []]
-
-    [Content
-     []
-     [["open-quote"]
-      ["close-quote"]
-      ["no-open-quote"]
-      ["no-close-quote"]]]
-
-    [Cursor
-     [[horizontal_text "text"]
-      [no_cursor "none"]]
-     [["alias"]
-      ["all-scroll"]
-      ["cell"]
-      ["context-menu"]
-      ["col-resize"]
-      ["copy"]
-      ["crosshair"]
-      ["default"]
-      ["e-resize"]
-      ["ew-resize"]
-      ["grab"]
-      ["grabbing"]
-      ["help"]
-      ["move"]
-      ["n-resize"]
-      ["ne-resize"]
-      ["nesw-resize"]
-      ["ns-resize"]
-      ["nw-resize"]
-      ["nwse-resize"]
-      ["no-drop"]
-      ["not-allowed"]
-      ["pointer"]
-      ["progress"]
-      ["row-resize"]
-      ["s-resize"]
-      ["se-resize"]
-      ["sw-resize"]
-      ["vertical-text"]
-      ["w-resize"]
-      ["wait"]
-      ["zoom-in"]
-      ["zoom-out"]]]
-
-    [Shadow
-     []
-     []]
-
-    [Clip
-     []
-     []]
-
-    [Text_Direction
-     [[left_to_right "ltr"]
-      [right_to_left "rtl"]]
-     []]
-
-    [Display
-     [[grid_display "grid"]
-      [no_display "none"]]
-     [["inline"]
-      ["block"]
-      ["contents"]
-      ["flex"]
-      ["inline-block"]
-      ["inline-flex"]
-      ["inline-grid"]
-      ["inline-table"]
-      ["list-item"]
-      ["run-in"]
-      ["table"]
-      ["table-caption"]
-      ["table-column-group"]
-      ["table-header-group"]
-      ["table-footer-group"]
-      ["table-row-group"]
-      ["table-cell"]
-      ["table-column"]
-      ["table-row"]]]
-
-    [Empty
-     []
-     [["show"]
-      ["hide"]]]
-
-    [Filter
-     []
-     []]
-
-    [Flex_Direction
-     []
-     [["row"]
-      ["row-reverse"]
-      ["column"]
-      ["column-reverse"]]]
-
-    [Flex_Wrap
-     [[no_wrap "nowrap"]]
-     [["wrap"]
-      ["wrap_reverse"]]]
-
-    [Font_Kerning
-     [[auto_kerning "auto"]
-      [normal_kerning "normal"]
-      [no_kerning "none"]]
-     []]
-
-    [Font_Size
-     [[medium_size "medium"]
-      [xx_small_size "xx-small"]
-      [x_small_size "x-small"]
-      [small_size "small"]
-      [large_size "large"]
-      [x_large_size "x-large"]
-      [xx_large_size "xx-large"]
-      [smaller_size "smaller"]
-      [larger_size "larger"]]
-     []]
-
-    [Font_Stretch
-     [[normal_stretch "normal"]]
-     [["condensed"]
-      ["ultra-condensed"]
-      ["extra-condensed"]
-      ["semi-condensed"]
-      ["expanded"]
-      ["semi-expanded"]
-      ["extra-expanded"]
-      ["ultra-expanded"]]]
-
-    [Font_Style
-     [[normal_style "normal"]]
-     [["italic"]
-      ["oblique"]]]
-
-    [Font_Weight
-     [[normal_weight "normal"]
-      [weight_100 "100"]
-      [weight_200 "200"]
-      [weight_300 "300"]
-      [weight_400 "400"]
-      [weight_500 "500"]
-      [weight_600 "600"]
-      [weight_700 "700"]
-      [weight_800 "800"]
-      [weight_900 "900"]]
-     [["bold"]]]
-
-    [Font_Variant
-     [[normal_font "normal"]]
-     [["small-caps"]]]
-
-    [Grid
-     []
-     []]
-
-    [Grid_Content
-     [[auto_content "auto"]]
-     [["max-content"]
-      ["min-content"]]]
-
-    [Grid_Flow
-     [[row_flow "row"]
-      [column_flow "column"]
-      [dense_flow "dense"]
-      [row_dense_flow "row dense"]
-      [column_dense_flow "column dense"]]
-     []]
-
-    [Grid_Span
-     [[auto_span "auto"]]
-     []]
-
-    [Grid_Template
-     []
-     []]
-
-    [Hanging_Punctuation
-     [[no_hanging_punctuation "none"]]
-     [["first"]
-      ["last"]
-      ["allow-end"]
-      ["force-end"]]]
-
-    [Hyphens
-     [[no_hyphens "none"]
-      [manual_hyphens "manual"]
-      [auto_hyphens "auto"]]
-     []]
-
-    [Orientation
-     []
-     [["portrait"]
-      ["landscape"]]]
-
-    [Resolution
-     []
-     []]
-
-    [Scan
-     []
-     [["interlace"]
-      ["progressive"]]]
-
-    [Boolean
-     [[false "0"]
-      [true "1"]]
-     []]
-
-    [Update
-     [[no_update "none"]
-      [slow_update "slow"]
-      [fast_update "fast"]]
-     []]
-
-    [Block_Overflow
-     [[no_block_overflow "none"]
-      [scroll_block_overflow "scroll"]
-      [optional_paged_block_overflow "optional-paged"]
-      [paged_block_overflow "paged"]]
-     []]
-
-    [Inline_Overflow
-     [[no_inline_overflow "none"]
-      [scroll_inline_overflow "scroll"]]
-     []]
-
-    [Display_Mode
-     []
-     [["fullscreen"]
-      ["standalone"]
-      ["minimal-ui"]
-      ["browser"]]]
-
-    [Color_Gamut
-     []
-     [["srgb"]
-      ["p3"]
-      ["rec2020"]]]
-
-    [Inverted_Colors
-     [[no_inverted_colors "none"]
-      [inverted_colors "inverted"]]
-     []]
-
-    [Pointer
-     [[no_pointer "none"]
-      [coarse_pointer "coarse"]
-      [fine_pointer "fine"]]
-     []]
-
-    [Hover
-     [[no_hover "none"]]
-     [["hover"]]]
-
-    [Light
-     [[dim_light "dim"]
-      [normal_light "normal"]
-      [washed_light "washed"]]
-     []]
-
-    [Ratio
-     []
-     []]
-
-    [Scripting
-     [[no_scripting "none"]
-      [initial_scripting_only "initial-only"]
-      [scripting_enabled "enabled"]]
-     []]
-
-    [Motion
-     [[no_motion_preference "no-preference"]
-      [reduced_motion "reduce"]]
-     []]
-
-    [Color_Scheme
-     [[no_color_scheme_preference "no-preference"]
-      [light_color_scheme "light"]
-      [dark_color_scheme "dark"]]
-     []]
-
-    [Isolation
-     [[auto_isolation "auto"]]
-     [["isolate"]]]
-
-    [List_Style_Position
-     []
-     [["inside"]
-      ["outside"]]]
-
-    [List_Style_Type
-     [[no_list_style "none"]]
-     [["disc"]
-      ["armenian"]
-      ["circle"]
-      ["cjk-ideographic"]
-      ["decimal"]
-      ["decimal-leading-zero"]
-      ["georgian"]
-      ["hebrew"]
-      ["hiragana"]
-      ["hiragana-iroha"]
-      ["katakana"]
-      ["katakana-iroha"]
-      ["lower-alpha"]
-      ["lower-greek"]
-      ["lower-latin"]
-      ["lower-roman"]
-      ["square"]
-      ["upper-alpha"]
-      ["upper-greek"]
-      ["upper-latin"]
-      ["upper-roman"]]]
-
-    [Color
-     []
-     []]
-
-    [Overflow
-     [[visible_overflow "visible"]
-      [hidden_overflow "hidden"]
-      [scroll_overflow "scroll"]
-      [auto_overflow "auto"]]
-     []]
-
-    [Page_Break
-     [[auto_page_break "auto"]
-      [always_page_break "always"]
-      [avoid_page_break "avoid"]
-      [left_page_break "left"]
-      [right_page_break "right"]]
-     []]
-
-    [Pointer_Events
-     [[auto_pointer_events "auto"]
-      [no_pointer_events "none"]]
-     []]
-
-    [Position
-     []
-     [["static"]
-      ["absolute"]
-      ["fixed"]
-      ["relative"]
-      ["sticky"]]]
-
-    [Quotes
-     [[no_quotes "none"]]
-     []]
-
-    [Resize
-     [[resize_none "none"]
-      [resize_both "both"]
-      [resize_horizontal "horizontal"]
-      [resize_vertical "vertical"]]
-     []]
-
-    [Scroll_Behavior
-     [[auto_scroll_behavior "auto"]
-      [smooth_scroll_behavior "smooth"]]
-     []]
-
-    [Table_Layout
-     [[auto_table_layout "auto"]
-      [fixed_table_layout "fixed"]]
-     []]
-
-    [Text_Align
-     [[left_text_align "left"]
-      [right_text_align "right"]
-      [center_text_align "center"]
-      [justify_text_align "justify"]]
-     []]
-
-    [Text_Align_Last
-     [[auto_text_align_last "auto"]
-      [left_text_align_last "left"]
-      [right_text_align_last "right"]
-      [center_text_align_last "center"]
-      [justify_text_align_last "justify"]
-      [start_text_align_last "start"]
-      [end_text_align_last "end"]]
-     []]
-
-    [Text_Decoration_Line
-     [[no_text_decoration_line "none"]
-      [underline_text_decoration_line "underline"]
-      [overline_text_decoration_line "overline"]
-      [line_through_text_decoration_line "line-through"]]
-     []]
-
-    [Text_Decoration_Style
-     [[solid_text_decoration_style "solid"]
-      [double_text_decoration_style "double"]
-      [dotted_text_decoration_style "dotted"]
-      [dashed_text_decoration_style "dashed"]
-      [wavy_text_decoration_style "wavy"]]
-     []]
-
-    [Text_Justification
-     [[auto_text_justification "auto"]
-      [inter_word_text_justification "inter-word"]
-      [inter_character_text_justification "inter-character"]
-      [no_text_justification "none"]]
-     []]
-
-    [Text_Overflow
-     [[clip_text_overflow "clip"]
-      [ellipsis_text_overflow "ellipsis"]]
-     []]
-
-    [Text_Transform
-     [[no_text_transform "none"]]
-     [["capitalize"]
-      ["uppercase"]
-      ["lowercase"]]]
-
-    [Transform
-     [[no_transform "none"]]
-     []]
-
-    [Transform_Origin
-     []
-     []]
-
-    [Transform_Style
-     []
-     [["flat"]
-      ["preserve_3d"]]]
-
-    [Transition
-     [[transition_none "none"]
-      [transition_all "all"]]
-     []]
-
-    [Bidi
-     [[bidi_normal "normal"]
-      [bidi_embed "embed"]
-      [bidi_isolate "isolate"]
-      [bidi_isolate_override "isolate-override"]
-      [bidi_plaintext "plaintext"]]
-     [["bidi-override"]]]
-
-    [User_Select
-     [[user_select_auto "auto"]
-      [user_select_none "none"]
-      [user_select_text "text"]
-      [user_select_all "all"]]
-     []]
-
-    [Vertical_Align
-     [[vertical_align_baseline "baseline"]
-      [vertical_align_sub "sub"]
-      [vertical_align_super "super"]
-      [vertical_align_top "top"]
-      [vertical_align_text_top "text-top"]
-      [vertical_align_middle "middle"]
-      [vertical_align_bottom "bottom"]
-      [vertical_align_text_bottom "text-bottom"]]
-     []]
-
-    [White_Space
-     [[normal_white_space "normal"]
-      [no_wrap_white_space "nowrap"]
-      [pre_white_space "pre"]
-      [pre_line_white_space "pre-line"]
-      [pre_wrap_white_space "pre-wrap"]]
-     []]
-
-    [Word_Break
-     [[normal_word_break "normal"]]
-     [["break-all"]
-      ["keep-all"]
-      ["break-word"]]]
-
-    [Word_Wrap
-     [[normal_word_wrap "normal"]
-      [break_word_word_wrap "break-word"]]
-     []]
-
-    [Writing_Mode
-     [[top_to_bottom_writing_mode "horizontal-tb"]
-      [left_to_right_writing_mode "vertical-rl"]
-      [right_to_left_writing_mode "vertical-lr"]]
-     []]
-
-    [Z_Index
-     []
-     []]
-    )
-
-  (def value_separator
-    ",")
-
-  (def (apply name inputs)
-    (-> Text (List Text)
-        Value)
-    (|> inputs
-        (text.interposed ..value_separator)
-        (text.enclosed ["(" ")"])
-        (format name)
-        abstraction))
-
-  (enumeration
-   Step
-   Text
-   step
-   [[start "start"]
-    [end "end"]]
-   [])
-
-  (def .public (steps intervals step)
-    (-> Nat Step
-        (Value Timing))
-    (..apply "steps" (list (%.nat intervals) (..step step))))
-
-  (def .public (cubic_bezier p0 p1 p2 p3)
-    (-> Frac Frac Frac Frac
-        (Value Timing))
-    (|> (list p0 p1 p2 p3)
-        (list#each %number)
-        (..apply "cubic-bezier")))
-
-  (with_template [ ]
-    [(def .public 
-       (-> Nat
-           (Value ))
-       (|>> %.nat abstraction))]
-
-    [iteration Iteration]
-    [count Count]
-    [slice_number/1 Slice]
-    [span_line Grid_Span]
-    )
-
-  (def .public animation
-    (-> Label
-        (Value Animation))
-    (|>> abstraction))
-
-  (def .public (rgb color)
-    (-> color.Color
-        (Value Color))
-    (let [[red green blue] (color.rgb color)]
-      (..apply "rgb" (list (%.nat (rgb.number red))
-                           (%.nat (rgb.number green))
-                           (%.nat (rgb.number blue))))))
-
-  (def .public (rgba pigment)
-    (-> Pigment
-        (Value Color))
-    (let [(open "/[0]") pigment
-          [red green blue] /#color]
-      (..apply "rgba" (list (%.nat (rgb.number red))
-                            (%.nat (rgb.number green))
-                            (%.nat (rgb.number blue))
-                            (if (r.= (of r.interval top) /#alpha)
-                              "1.0"
-                              (format "0" (%.rev /#alpha)))))))
-
-  (with_template [ ]
-    [(def .public ( value)
-       (-> Frac
-           (Value Length))
-       (abstraction (format (%number value) )))]
-
-    [em "em"]
-    [ex "ex"]
-    [rem "rem"]
-    [ch "ch"]
-    [vw "vw"]
-    [vh "vh"]
-    [vmin "vmin"]
-    [vmax "vmax"]
-    [% "%"]
-    [cm "cm"]
-    [mm "mm"]
-    [in "in"]
-    [px "px"]
-    [pt "pt"]
-    [pc "pc"]
-    [fr "fr"]
-    )
-
-  (def (%int value)
-    (Format Int)
-    (if (i.< +0 value)
-      (%.int value)
-      (%.nat (.nat value))))
-
-  (with_template [ ]
-    [(def .public ( value)
-       (-> Int
-           (Value Time))
-       (abstraction (format (if (i.< +0 value)
-                              (%.int value)
-                              (%.nat (.nat value)))
-                            )))]
-
-    
-    [seconds "s"]
-    [milli_seconds "ms"]
-    )
-
-  (def .public thickness
-    (-> (Value Length)
-        (Value Thickness))
-    (|>> transmutation))
-
-  (def slice_separator " ")
-
-  (def .public (slice_number/2 horizontal vertical)
-    (-> Nat Nat
-        (Value Slice))
-    (abstraction (format (%.nat horizontal) ..slice_separator
-                         (%.nat vertical))))
-
-  (nominal.def .public Stop
-    Text
-
-    (def .public stop
-      (-> (Value Color)
-          Stop)
-      (|>> (representation Value) (abstraction Stop)))
-
-    (def stop_separator
-      " ")
-
-    (def .public (single_stop length color)
-      (-> (Value Length) (Value Color)
-          Stop)
-      (abstraction (format (representation Value color) ..stop_separator
-                           (representation Value length))))
-
-    (def .public (double_stop start end color)
-      (-> (Value Length) (Value Length) (Value Color)
-          Stop)
-      (abstraction (format (representation Value color) ..stop_separator
-                           (representation Value start) ..stop_separator
-                           (representation Value end))))
-
-    (nominal.def .public Hint
-      Text
-
-      (def .public hint
-        (-> (Value Length)
-            Hint)
-        (|>> (representation Value) (abstraction Hint)))
-
-      (def (with_hint [hint stop])
-        (-> [(Maybe Hint) Stop]
-            Text)
-        (when hint
-          {.#None}
-          (representation Stop stop)
-          
-          {.#Some hint}
-          (format (representation Hint hint) ..value_separator (representation Stop stop))))))
-
-  (type .public (List/1 a)
-    [a (List a)])
-
-  (nominal.def .public Angle
-    Text
-
-    (def .public angle
-      (-> Angle
-          Text)
-      (|>> representation))
-
-    (def .public (turn value)
-      (-> Rev
-          Angle)
-      (abstraction (format (%.rev value) "turn")))
-
-    (def degree_limit
-      Nat
-      360)
-    
-    (def .public (degree value)
-      (-> Nat
-          Angle)
-      (abstraction (format (%.nat (n.% ..degree_limit value)) "deg")))
-
-    (with_template [ ]
-      [(def .public 
-         Angle
-         (..degree ))]
-      
-      [000 to_top]
-      [090 to_right]
-      [180 to_bottom]
-      [270 to_left]
-      )
-
-    (with_template [ ]
-      [(def .public ( angle start next)
-         (-> Angle Stop (List/1 [(Maybe Hint) Stop])
-             (Value Image))
-         (let [[now after] next]
-           (..apply  (list.partial (representation Angle angle)
-                                             (with_hint now)
-                                             (list#each with_hint after)))))]
-
-      [linear_gradient "linear-gradient"]
-      [repeating_linear_gradient "repeating-linear-gradient"]
-      )
-    )
-
-  (def percentage_limit
-    Nat
-    (.++ 100))
-
-  (def .public (%% value)
-    (-> Nat
-        (Value Percentage))
-    (abstraction (format (%.nat (n.% percentage_limit value)) "%")))
-
-  (def .public slice_percent/1
-    (-> (Value Percentage)
-        (Value Slice))
-    (|>> transmutation))
-
-  (def .public (slice_percent/2 horizontal vertical)
-    (-> (Value Percentage) (Value Percentage)
-        (Value Slice))
-    (abstraction (format (representation horizontal) ..slice_separator
-                         (representation vertical))))
-
-  (with_template [ 
 +]
-    [(`` (with_template [ ]
-           [(def .public 
-              (-> 
-                  (Value Filter))
-              (|>> 
 (list) (..apply )))]
-
-           (,, (template.spliced +))))]
-
-    [Nat (<| representation ..px n.frac)
-     [[blur "blur"]]]
-    [Nat (<| ..angle ..degree)
-     [[hue_rotate "hue-rotate"]]]
-    [(Value Percentage) representation
-     [[brightness "brightness"]
-      [contrast "contrast"]
-      [grayscale "grayscale"]
-      [invert "invert"]
-      [opacity "opacity"]
-      [saturate "saturate"]
-      [sepia "sepia"]]]
-    )
-
-  (def .public svg_filter
-    (-> URL
-        (Value Filter))
-    (|>> (list) (..apply "url")))
-
-  (def default_shadow_length
-    (px +0.0))
-
-  (def .public (drop_shadow horizontal vertical blur spread color)
-    (-> (Value Length) (Value Length)
-        (Maybe (Value Length)) (Maybe (Value Length))
-        (Value Color)
-        (Value Filter))
-    (|> (list (representation horizontal)
-              (representation vertical)
-              (|> blur (maybe.else ..default_shadow_length) representation)
-              (|> spread (maybe.else ..default_shadow_length) representation)
-              (representation color))
-        (text.interposed " ")
-        (list)
-        (..apply "drop-shadow")))
-
-  (def length_separator
-    " ")
-
-  (with_template [ ]
-    [(def .public ( horizontal vertical)
-       (-> (Value Length) (Value Length)
-           (Value ))
-       (abstraction (format (representation horizontal)
-                            ..length_separator
-                            (representation vertical))))]
-
-    [location Location]
-    [fit Fit]
-    )
-
-  (def .public (fit/1 length)
-    (-> (Value Length)
-        (Value Fit))
-    (..fit length length))
-
-  (def .public image
-    (-> URL
-        (Value Image))
-    (|>> %.text
-         (list)
-         (..apply "url")))
-
-  (enumeration
-   Shape
-   Text
-   shape
-   [[ellipse_shape "ellipse"]
-    [circle_shape "circle"]]
-   [])
-
-  (enumeration
-   Extent
-   Text
-   extent
-   [[closest_side "closest-side"]
-    [closest_corner "closest-corner"]
-    [farthest_side "farthest-side"]
-    [farthest_corner "farthest-corner"]]
-   [])
-
-  (with_template [ ]
-    [(def .public ( shape extent location start next)
-       (-> Shape (Maybe Extent) (Value Location)
-           Stop (List/1 [(Maybe Hint) Stop])
-           (Value Image))
-       (let [after_extent (format "at " (representation location))
-             with_extent (when extent
-                           {.#Some extent}
-                           (format (..extent extent) " " after_extent)
-                           
-                           {.#None}
-                           after_extent)
-             where (format (..shape shape) " " with_extent)
-             [now after] next]
-         (..apply  (list.partial (..shape shape)
-                                           (with_hint now)
-                                           (list#each with_hint after)))))]
-    
-    [radial_gradient "radial-gradient"]
-    [repeating_radial_gradient "repeating-radial-gradient"]
-    )
-
-  (def .public (shadow horizontal vertical blur spread color inset?)
-    (-> (Value Length) (Value Length)
-        (Maybe (Value Length)) (Maybe (Value Length))
-        (Value Color) Bit
-        (Value Shadow))
-    (let [with_inset (if inset?
-                       (list "inset")
-                       (list))]
-      (|> (list.partial (representation horizontal)
-                        (representation vertical)
-                        (|> blur (maybe.else ..default_shadow_length) representation)
-                        (|> spread (maybe.else ..default_shadow_length) representation)
-                        (representation color)
-                        with_inset)
-          (text.interposed " ")
-          abstraction)))
-
-  (type .public Rectangle
-    (Record
-     [#top (Value Length)
-      #right (Value Length)
-      #bottom (Value Length)
-      #left (Value Length)]))
-
-  (def .public (clip rectangle)
-    (-> Rectangle
-        (Value Clip))
-    (`` (..apply "rect" (list (,, (with_template []
-                                    [(representation (the  rectangle))]
-
-                                    [#top] [#right] [#bottom] [#left]))))))
-
-  (def .public counter
-    (-> Label
-        (Value Counter))
-    (|>> abstraction))
-
-  (def .public current_count
-    (-> (Value Counter)
-        (Value Content))
-    (|>> representation (list) (..apply "counter")))
-
-  (def .public text
-    (-> Text
-        (Value Content))
-    (|>> %.text abstraction))
-
-  (def .public attribute
-    (-> Label
-        (Value Content))
-    (|>> (list) (..apply "attr")))
-
-  (def .public media
-    (-> URL
-        (Value Content))
-    (|>> (list) (..apply "url")))
-
-  (enumeration
-   Font
-   Text
-   font_name
-   [[serif "serif"]
-    [sans_serif "sans-serif"]
-    [cursive "cursive"]
-    [fantasy "fantasy"]
-    [monospace "monospace"]]
-   [(def .public font
-      (-> Text Font)
-      (|>> %.text abstraction))
-
-    (def .public (font_family options)
-      (-> (List Font) (Value Font))
-      (when options
-        {.#Item _}
-        (|> options
-            (list#each ..font_name)
-            (text.interposed ",")
-            (abstraction Value))
-        
-        {.#End}
-        ..initial))])
-
-  (def .public font_size
-    (-> (Value Length)
-        (Value Font_Size))
-    (|>> transmutation))
-
-  (def .public number
-    (-> Frac
-        (Value Number))
-    (|>> %number abstraction))
-
-  (def .public grid
-    (-> Label
-        (Value Grid))
-    (|>> abstraction))
-
-  (def .public fit_content
-    (-> (Value Length)
-        (Value Grid_Content))
-    (|>> representation (list) (..apply "fit-content")))
-
-  (def .public (min_max min max)
-    (-> (Value Grid_Content) (Value Grid_Content)
-        (Value Grid_Content))
-    (..apply "minmax" (list (representation min)
-                            (representation max))))
-
-  (def .public grid_span
-    (-> Nat
-        (Value Grid_Span))
-    (|>> %.nat (format "span ") abstraction))
-
-  (def grid_column_separator " ")
-  (def grid_row_separator " ")
-
-  (def .public grid_template
-    (-> (List (List (Maybe (Value Grid))))
-        (Value Grid_Template))
-    (let [empty (is (Value Grid)
-                    (abstraction "."))]
-      (|>> (list#each (|>> (list#each (|>> (maybe.else empty)
-                                           representation))
-                           (text.interposed ..grid_column_separator)
-                           (text.enclosed ["'" "'"])))
-           (text.interposed ..grid_row_separator)
-           abstraction)))
-
-  (def .public (resolution dpi)
-    (-> Nat
-        (Value Resolution))
-    (abstraction (format (%.nat dpi) "dpi")))
-
-  (def .public (ratio numerator denominator)
-    (-> Nat Nat
-        (Value Ratio))
-    (abstraction (format (%.nat numerator) "/" (%.nat denominator))))
-
-  (enumeration
-   Quote
-   Text
-   quote_text
-   [[double_quote "\0022"]
-    [single_quote "\0027"]
-    [single_left_angle_quote "\2039"]
-    [single_right_angle_quote "\203A"]
-    [double_left_angle_quote "\00AB"]
-    [double_right_angle_quote "\00BB"]
-    [single_left_quote "\2018"]
-    [single_right_quote "\2019"]
-    [double_left_quote "\201C"]
-    [double_right_quote "\201D"]
-    [low_double_quote "\201E"]]
-   [(def .public quote
-      (-> Text Quote)
-      (|>> abstraction))])
-
-  (def quote_separator " ")
-
-  (def .public (quotes [left0 right0] [left1 right1])
-    (-> [Quote Quote] [Quote Quote]
-        (Value Quotes))
-    (|> (list left0 right0 left1 right1)
-        (list#each (|>> ..quote_text %.text))
-        (text.interposed ..quote_separator)
-        abstraction))
-
-  (def .public (matrix_2d [a b] [c d] [tx ty])
-    (-> [Frac Frac]
-        [Frac Frac]
-        [Frac Frac]
-        (Value Transform))
-    (|> (list a b c d tx ty)
-        (list#each %number)
-        (..apply "matrix")))
-
-  (def .public (matrix_3d [a0 b0 c0 d0] [a1 b1 c1 d1] [a2 b2 c2 d2] [a3 b3 c3 d3])
-    (-> [Frac Frac Frac Frac]
-        [Frac Frac Frac Frac]
-        [Frac Frac Frac Frac]
-        [Frac Frac Frac Frac]
-        (Value Transform))
-    (|> (list a0 b0 c0 d0 a1 b1 c1 d1 a2 b2 c2 d2 a3 b3 c3 d3)
-        (list#each %number)
-        (..apply "matrix3d")))
-
-  (with_template [   ]
-    [(`` (def .public ( [(,, (template.spliced ))])
-           (-> [(,, (template.spliced ))]
-               (Value Transform))
-           (|> (list (,, (template.spliced )))
-               (list#each %number)
-               (..apply ))))]
-
-    [translate_2d "translate" [Frac Frac] [x y]]
-    [translate_3d "translate3d" [Frac Frac Frac] [x y z]]
-    [translate_x "translateX" [Frac] [value]]
-    [translate_y "translateY" [Frac] [value]]
-    [translate_z "translateZ" [Frac] [value]]
-
-    [scale_2d "scale" [Frac Frac] [x y]]
-    [scale_3d "scale3d" [Frac Frac Frac] [x y z]]
-    [scale_x "scaleX" [Frac] [value]]
-    [scale_y "scaleY" [Frac] [value]]
-    [scale_z "scaleZ" [Frac] [value]]
-
-    [perspective "perspective" [Frac] [value]]
-    )
-
-  (with_template [   ]
-    [(`` (def .public ( [(,, (template.spliced ))])
-           (-> [(,, (template.spliced ))]
-               (Value Transform))
-           (|> (list (,, (template.spliced )))
-               (list#each ..angle)
-               (..apply ))))]
-
-    [rotate_2d "rotate" [Angle] [angle]]
-    [rotate_x "rotateX" [Angle] [angle]]
-    [rotate_y "rotateY" [Angle] [angle]]
-    [rotate_z "rotateZ" [Angle] [angle]]
-
-    [skew "skew" [Angle Angle] [x_angle y_angle]]
-    [skew_x "skewX" [Angle] [angle]]
-    [skew_y "skewY" [Angle] [angle]]
-    )
-
-  (def .public (rotate_3d [x y z angle])
-    (-> [Frac Frac Frac Angle]
-        (Value Transform))
-    (..apply "rotate3d"
-             (list (%number x) (%number y) (%number z) (..angle angle))))
-
-  (def origin_separator " ")
-
-  (def .public (origin_2d x y)
-    (-> (Value Length) (Value Length)
-        (Value Transform_Origin))
-    (abstraction (format (representation x) ..origin_separator
-                         (representation y))))
-
-  (def .public (origin_3d x y z)
-    (-> (Value Length) (Value Length) (Value Length)
-        (Value Transform_Origin))
-    (abstraction (format (representation x) ..origin_separator
-                         (representation y) ..origin_separator
-                         (representation z))))
-
-  (def .public vertical_align
-    (-> (Value Length)
-        (Value Vertical_Align))
-    (|>> transmutation))
-
-  (def .public (z_index index)
-    (-> Int
-        (Value Z_Index))
-    (abstraction (if (i.< +0 index)
-                   (%.int index)
-                   (%.nat (.nat index)))))
-
-  (with_template [  ]
-    [(def .public ( pre post)
-       (-> (Value ) (Value )
-           (Value ))
-       (abstraction (format (representation pre)
-                            
-                            (representation post))))]
-
-    ["," Image multi_image]
-    ["," Shadow multi_shadow]
-    [" " Content multi_content]
-    )
-
-  ... https://developer.mozilla.org/en-US/docs/Web/CSS/calc()
-  (with_template [ ]
-    [(def .public ( parameter subject)
-       (.All (_ kind)
-         (-> (Value ) (Value (Numeric kind))
-             (Value (Numeric kind))))
-       (|> (format (representation subject)
-                   (template.text [" "  " "])
-                   (representation parameter))
-           (text.enclosed ["calc(" ")"])
-           abstraction))]
-
-    [+ (Numeric kind)]
-    [- (Numeric kind)]
-    [* Number]
-    [/ Number]
-    )
-  )
diff --git a/stdlib/source/library/lux/data/format/html.lux b/stdlib/source/library/lux/data/format/html.lux
deleted file mode 100644
index eb4569b48..000000000
--- a/stdlib/source/library/lux/data/format/html.lux
+++ /dev/null
@@ -1,580 +0,0 @@
-(.require
- [library
-  [lux (.except Tag Meta Source comment and template open parameter)
-   [control
-    ["[0]" function]
-    ["[0]" maybe (.use "[1]#[0]" functor)]]
-   [data
-    ["[0]" product]
-    ["[0]" text (.only)
-     ["%" \\format (.only Format format)]]
-    [collection
-     ["[0]" list (.use "[1]#[0]" functor mix)]]]
-   [meta
-    [macro
-     ["[0]" template]]
-    [target
-     ["[0]" js]]
-    [type
-     ["[0]" nominal (.except def)]]]
-   [world
-    [net (.only URL)]]]]
- [//
-  ["[0]" xml (.only XML)]
-  ["[0]" css
-   ["[0]" selector]
-   ["[0]" style (.only Style)]
-   ["[1]/[0]" id]
-   ["[1]/[0]" class]]])
-
-(type .public Tag selector.Tag)
-(type .public ID css/id.ID)
-(type .public Class css/class.Class)
-
-... Attributes for an HTML tag.
-(type .public Attributes
-  (List [Text Text]))
-
-(def .public empty
-  Attributes
-  (list))
-
-(type .public Script
-  js.Statement)
-
-(type .public Target
-  (Variant
-   {#Blank}
-   {#Parent}
-   {#Self}
-   {#Top}
-   {#Frame Text}))
-
-(def (target value)
-  (-> Target Text)
-  (when value
-    {#Blank} "_blank"
-    {#Parent} "_parent"
-    {#Self} "_self"
-    {#Top} "_top"
-    {#Frame name} name))
-
-... Properly formats text to ensure no injection can happen on the HTML.
-(def safe
-  (-> Text Text)
-  (|>> (text.replaced "&" "&")
-       (text.replaced "<" "<")
-       (text.replaced ">" ">")
-       (text.replaced text.double_quote """)
-       (text.replaced "'" "'")
-       (text.replaced "/" "/")))
-
-(def attributes
-  (-> Attributes Text)
-  (|>> (list#each (function (_ [key val])
-                    (format " " key "=" text.double_quote (..safe val) text.double_quote)))
-       text.together))
-
-(def (open tag attributes)
-  (-> Tag Attributes Text)
-  (|> attributes
-      ..attributes
-      (format tag)
-      (text.enclosed ["<" ">"])))
-
-(def close
-  (-> Tag Text)
-  (text.enclosed [""]))
-
-(nominal.def .public (HTML brand)
-  Text
-
-  (.with_template [ ]
-    [(nominal.def  Any)
-     (type .public  (HTML ))]
-
-    [Meta Meta']
-    [Head Head']
-    [Item Item']
-    [Option Option']
-    [Input Input']
-    [Cell Cell']
-    [Header Header']
-    [Row Row']
-    [Column Column']
-    [Parameter Parameter']
-    [Body Body']
-    [Document Document']
-    )
-
-  (.with_template [  +]
-    [(nominal.def ( brand) Any)
-     (type .public  (HTML ( Any)))
-
-     (`` (.with_template [ ]
-           [(nominal.def  Any)
-            (type .public  (HTML ( )))]
-
-           (,, (template.spliced +))))]
-
-    [Element Element'
-     [[Content Content']
-      [Image Image']]]
-
-    [Media Media'
-     [[Source Source']
-      [Track Track']]]
-    )
-
-  (def .public html
-    (-> Document Text)
-    (|>> representation))
-
-  (def .public (and pre post)
-    (All (_ brand) (-> (HTML brand) (HTML brand) (HTML brand)))
-    (abstraction (format (representation pre) (representation post))))
-
-  (def .public (comment content node)
-    (All (_ brand) (-> Text (HTML brand) (HTML brand)))
-    (abstraction
-     (format (text.enclosed [""] content)
-             (representation node))))
-
-  (def (empty_tag name attributes)
-    (-> Tag Attributes HTML)
-    (abstraction
-     (format (..open name attributes)
-             (..close name))))
-
-  (def (simple tag attributes)
-    (-> Tag Attributes HTML)
-    (|> attributes
-        (..open tag)
-        abstraction))
-
-  (def (tag name attributes content)
-    (-> Tag Attributes (HTML Any) HTML)
-    (abstraction
-     (format (..open name attributes)
-             (representation content)
-             (..close name))))
-
-  (def (raw tag attributes content)
-    (-> Text Attributes Text HTML)
-    (abstraction
-     (format (..open tag attributes)
-             content
-             (..close tag))))
-
-  (.with_template [  ]
-    [(def .public 
-       (-> Attributes )
-       (..simple ))]
-
-    [link "link" Meta]
-    [meta "meta" Meta]
-    [input "input" Input]
-    [embedded "embed" Element]
-    [column "col" Column]
-    [parameter "param" Parameter]
-    )
-
-  (def .public (base href target)
-    (-> URL (Maybe Target) Meta)
-    (let [partial (list ["href" href])
-          full (when target
-                 {.#Some target}
-                 (list.partial ["target" (..target target)] partial)
-                 
-                 {.#None}
-                 partial)]
-      (..simple "base" full)))
-
-  (def .public style
-    (-> Style Meta)
-    (|>> style.inline (..raw "style" (list))))
-
-  (def .public (script attributes inline)
-    (-> Attributes (Maybe Script) Meta)
-    (|> inline
-        (maybe#each js.code)
-        (maybe.else "")
-        (..raw "script" attributes)))
-
-  (def .public text
-    (-> Text Content)
-    (|>> ..safe
-         abstraction))
-
-  (.with_template [  ]
-    [(def .public 
-       Element
-       (..simple  (list)))
-
-     (def .public  )]
-    ["br"  br  line_break]
-    ["wbr" wbr word_break]
-    ["hr"  hr  separator]
-    )
-
-  (def .public (image source attributes)
-    (-> URL Attributes Image)
-    (|> attributes
-        {.#Item ["src" source]}
-        (..simple "img")))
-
-  (def .public (svg attributes content)
-    (-> Attributes XML Element)
-    (|> content
-        (of xml.codec encoded)
-        (..raw "svg" attributes)))
-
-  (type .public Coord
-    (Record
-     [#horizontal Nat
-      #vertical Nat]))
-
-  (def metric_separator ",")
-  (def coord_separator ",")
-
-  (def (%coord [horizontal vertical])
-    (Format Coord)
-    (format (%.nat horizontal) ..metric_separator (%.nat vertical)))
-  
-  (type .public Rectangle
-    (Record
-     [#start Coord
-      #end Coord]))
-
-  (type .public Circle
-    (Record
-     [#center Coord
-      #radius Nat]))
-
-  (type .public Polygon
-    (Record
-     [#first Coord
-      #second Coord
-      #third Coord
-      #extra (List Coord)]))
-
-  (def (%rectangle [start end])
-    (Format Rectangle)
-    (format (%coord start) ..coord_separator (%coord end)))
-
-  (def (%circle [center radius])
-    (Format Circle)
-    (format (%coord center) ..metric_separator (%.nat radius)))
-
-  (def (%polygon [first second third extra])
-    (Format Polygon)
-    (|> (list.partial first second third extra)
-        (list#each %coord)
-        (text.interposed ..coord_separator)))
-  
-  (type .public Shape
-    (Variant
-     {#Rectangle Rectangle}
-     {#Circle Circle}
-     {#Polygon Polygon}))
-
-  (.with_template [   ]
-    [(def ( attributes shape)
-       (-> Attributes  (HTML Any))
-       (..simple "area" (list.partial ["shape" ]
-                                      ["coords" ( shape)]
-                                      attributes)))]
-
-    [rectangle "rect" Rectangle ..%rectangle]
-    [circle "circle" Circle ..%circle]
-    [polygon "poly" Polygon ..%polygon]
-    )
-  
-  (def (area attributes shape)
-    (-> Attributes Shape (HTML Any))
-    (when shape
-      {#Rectangle rectangle}
-      (..rectangle attributes rectangle)
-      
-      {#Circle circle}
-      (..circle attributes circle)
-      
-      {#Polygon polygon}
-      (..polygon attributes polygon)))
-
-  (def .public (each attributes areas for)
-    (-> Attributes (List [Attributes Shape]) Image Image)
-    (all ..and
-         for
-         (when (list#each (product.uncurried ..area) areas)
-           {.#End}
-           (..empty_tag "map" attributes)
-           
-           {.#Item head tail}
-           (..tag "map" attributes
-                  (list#mix (function.flipped ..and) head tail)))))
-
-  (.with_template [  ]
-    [(def .public 
-       (-> Attributes )
-       (..empty_tag ))]
-
-    [canvas "canvas" Element]
-    [progress "progress" Element]
-    [output "output" Input]
-    [source "source" Source]
-    [track "track" Track]
-    )
-
-  (.with_template [ ]
-    [(def .public ( attributes media on_unsupported)
-       (-> Attributes Media (Maybe Content) Element)
-       (..tag  attributes
-              (|> on_unsupported
-                  (maybe.else (..text ""))
-                  (..and media))))]
-
-    [audio "audio"]
-    [video "video"]
-    )
-
-  (def .public (picture attributes sources image)
-    (-> Attributes Source Image Element)
-    (..tag "picture" attributes (..and sources image)))
-
-  (def .public (anchor href attributes content)
-    (-> URL Attributes Element Element)
-    (..tag "a" (list.partial ["href" href] attributes) content))
-
-  (def .public label
-    (-> ID Input)
-    (|>> css/id.id ["for"] list (..empty_tag "label")))
-
-  (.with_template [   ]
-    [(def .public ( description attributes content)
-       (-> (Maybe Content) Attributes  )
-       (..tag  attributes
-              (when description
-                {.#Some description}
-                (all ..and
-                     (..tag  (list) description)
-                     content)
-                
-                {.#None}
-                content)))]
-
-    [details "details" "summary" Element]
-    [field_set "fieldset" "legend" Input]
-    [figure "figure" "figcaption" Element]
-    )
-
-  (.with_template [  ]
-    [(def .public ( attributes content)
-       (-> Attributes (Maybe Content) )
-       (|> content
-           (maybe.else (..text ""))
-           (..tag  attributes)))]
-
-    [text_area "textarea" Input]
-    [iframe "iframe" Element]
-    )
-
-  (type .public Phrase
-    (-> Attributes Content Element))
-
-  (.with_template [ ]
-    [(def .public 
-       Phrase
-       (..tag ))]
-
-    [abbrebiation "abbr"]
-    [block_quote "blockquote"]
-    [bold "b"]
-    [cite "cite"]
-    [code "code"]
-    [definition "dfn"]
-    [deleted "del"]
-    [emphasized "em"]
-    [h1 "h1"]
-    [h2 "h2"]
-    [h3 "h3"]
-    [h4 "h4"]
-    [h5 "h5"]
-    [h6 "h6"]
-    [inserted "ins"]
-    [italic "i"]
-    [keyboard "kbd"]
-    [marked "mark"]
-    [meter "meter"]
-    [pre "pre"]
-    [quote "q"]
-    [sample "samp"]
-    [struck "s"]
-    [small "small"]
-    [sub "sub"]
-    [super "sup"]
-    [strong "strong"]
-    [time "time"]
-    [underlined "u"]
-    [variable "var"]
-    )
-
-  (def .public incorrect ..struck)
-
-  (def (ruby_pronunciation pronunciation)
-    (-> Content (HTML Any))
-    (..tag "rt" (list)
-           (all ..and
-                (..tag "rp" (list) (..text "("))
-                pronunciation
-                (..tag "rp" (list) (..text ")")))))
-
-  (def .public (ruby attributes content pronunciation)
-    (-> Attributes Content Content Element)
-    (..tag "ruby" attributes
-           (all ..and
-                content
-                (ruby_pronunciation pronunciation))))
-
-  (type .public Composite
-    (-> Attributes Element Element))
-
-  (.with_template [ ]
-    [(def .public 
-       Composite
-       (..tag ))]
-
-    [article "article"]
-    [aside "aside"]
-    [dialog "dialog"]
-    [div "div"]
-    [footer "footer"]
-    [header "header"]
-    [main "main"]
-    [navigation "nav"]
-    [paragraph "p"]
-    [section "section"]
-    [span "span"]
-    )
-
-  (.with_template [  ]
-    [(def 
-       (->  (HTML Any))
-       (..tag  (list)))]
-
-    ["dt" term Content]
-    ["dd" description Element]
-    )
-
-  (def .public (description_list attributes descriptions)
-    (-> Attributes (List [Content Element]) Element)
-    (when (list#each (function (_ [term description])
-                       (all ..and
-                            (..term term)
-                            (..description description)))
-                     descriptions)
-      {.#End}
-      (..empty_tag "dl" attributes)
-      
-      {.#Item head tail}
-      (..tag "dl" attributes
-             (list#mix (function.flipped ..and) head tail))))
-
-  (def .public p ..paragraph)
-
-  (.with_template [   ]
-    [(def .public 
-       (-> Attributes  )
-       (..tag ))]
-
-    [button "button" Element Input]
-    [item "li" Element Item]
-    [ordered_list "ol" Item Element]
-    [unordered_list "ul" Item Element]
-    [option "option" Content Option]
-    [option_group "optgroup" Option Option]
-    [data_list "datalist" Option Element]
-    [select "select" Option Input]
-    [address "address" Element Element]
-    [form "form" Input Element]
-    [data "data" Element Element]
-    [object "object" Parameter Element]
-    )
-
-  (.with_template [   ]
-    [(def .public 
-       (->  )
-       (..tag  (list)))]
-
-    [title "title" Content Meta]
-    [no_script "noscript" Content Meta]
-    [template "template" (HTML Any) (HTML Nothing)]
-    [table_header "th" Element Header]
-    [table_cell "td" Element Cell]
-    [head "head" Meta Head]
-    [body "body" Element Body]
-    )
-
-  (.with_template [   ]
-    [(def 
-       (->  )
-       (..tag  (list)))]
-
-    [table_row "tr" (HTML Any) Row]
-    [table_head "thead" Row HTML]
-    [table_body "tbody" Row HTML]
-    [table_foot "tfoot" Row HTML]
-    [columns_group "colgroup" Column HTML]
-    )
-
-  (def .public (table attributes caption columns headers rows footer)
-    (-> Attributes (Maybe Content) (Maybe Column) Header (List Cell) (Maybe Cell) Element)
-    (let [head (..table_head (..table_row headers))
-          content (when (list#each table_row rows)
-                    {.#End}
-                    head
-
-                    {.#Item first rest}
-                    (..and head
-                           (..table_body
-                            (list#mix (function.flipped ..and) first rest))))
-          content (when footer
-                    {.#None}
-                    content
-                    
-                    {.#Some footer}
-                    (..and content
-                           (..table_foot (..table_row footer))))
-          content (when columns
-                    {.#None}
-                    content
-                    
-                    {.#Some columns}
-                    (..and (..columns_group columns)
-                           content))
-          content (when caption
-                    {.#None}
-                    content
-
-                    {.#Some caption}
-                    (..and (as HTML caption)
-                           content))]
-      (..tag "table" attributes
-             content)))
-
-  (.with_template [ ]
-    [(def .public 
-       (-> Head Body Document)
-       (let [doc_type ]
-         (function (_ head body)
-           (|> (..tag "html" (list) (..and head body))
-               representation
-               (format doc_type)
-               abstraction))))]
-
-    [html/5    ""]
-    [html/4_01 (format "")]
-    [xhtml/1_0 (format "")]
-    [xhtml/1_1 (format "")]
-    )
-  )
diff --git a/stdlib/source/library/lux/web/css.lux b/stdlib/source/library/lux/web/css.lux
new file mode 100644
index 000000000..517dd9f53
--- /dev/null
+++ b/stdlib/source/library/lux/web/css.lux
@@ -0,0 +1,176 @@
+(.require
+ [library
+  [lux (.except and)
+   [control
+    ["[0]" maybe]]
+   [data
+    ["[0]" text (.only)
+     ["%" \\format (.only format)]
+     ["[0]" encoding (.only Encoding)]]
+    [collection
+     ["[0]" list (.use "[1]#[0]" functor)]]]
+   [math
+    [number
+     ["[0]" nat]]]
+   [meta
+    [type
+     ["[0]" nominal (.except Frame def)]]]
+   [world
+    [net (.only URL)]]]]
+ ["[0]" /
+  ["[1][0]" selector (.only Selector Combinator Specializer Generic)]
+  ["[1][0]" value (.only Value Animation Percentage)]
+  ["[1][0]" property (.only Property)]
+  ["[1][0]" font (.only Font)]
+  ["[1][0]" style]
+  ["[1][0]" query (.only Query)]])
+
+(nominal.def .public Common Any)
+(nominal.def .public Special Any)
+
+(nominal.def .public (CSS brand)
+  Text
+
+  (def .public css
+    (-> (CSS Any) Text)
+    (|>> representation))
+
+  (def .public empty
+    (CSS Any)
+    (abstraction ""))
+
+  (type .public Style
+    (List (Ex (_ brand)
+            [(Property brand)
+             (Value brand)])))
+
+  (def .public (rule selector style)
+    (-> (Selector Any) Style (CSS Common))
+    (abstraction (format (/selector.selector selector) "{" (/style.inline (/style.style style)) "}")))
+
+  (def .public char_set
+    (-> Encoding (CSS Special))
+    (|>> encoding.name
+         %.text
+         (text.enclosed ["@charset " ";"])
+         abstraction))
+
+  (def .public (font font)
+    (-> Font (CSS Special))
+    (let [with_unicode (when (the /font.#unicode_range font)
+                         {.#Some unicode_range}
+                         (let [unicode_range' (format "U+" (of nat.hex encoded (the /font.#start unicode_range))
+                                                      "-" (of nat.hex encoded (the /font.#end unicode_range)))]
+                           (list ["unicode-range" unicode_range']))
+                         
+                         {.#None}
+                         (list))]
+      (|> (list.partial ["font-family" (the /font.#family font)]
+                        ["src" (format "url(" (the /font.#source font) ")")]
+                        ["font-stretch" (|> font (the /font.#stretch) (maybe.else /value.normal_stretch) /value.value)]
+                        ["font-style" (|> font (the /font.#style) (maybe.else /value.normal_style) /value.value)]
+                        ["font-weight" (|> font (the /font.#weight) (maybe.else /value.normal_weight) /value.value)]
+                        with_unicode)
+          (list#each (function (_ [property value])
+                       (format property ": " value ";")))
+          text.together
+          (text.enclosed ["{" "}"])
+          (format "@font-face")
+          abstraction)))
+
+  (def .public (import url query)
+    (-> URL (Maybe Query) (CSS Special))
+    (abstraction (format (format "@import url(" (%.text url) ")")
+                         (when query
+                           {.#Some query}
+                           (format " " (/query.query query))
+                           
+                           {.#None}
+                           "")
+                         ";")))
+
+  (def separator
+    text.new_line)
+
+  (type .public Frame
+    (Record
+     [#when (Value Percentage)
+      #what Style]))
+
+  (def .public (key_frames animation frames)
+    (-> (Value Animation) (List Frame) (CSS Special))
+    (abstraction (format "@keyframes " (/value.value animation) " {"
+                         (|> frames
+                             (list#each (function (_ frame)
+                                          (format (/value.value (the #when frame)) " {"
+                                                  (/style.inline (/style.style (the #what frame)))
+                                                  "}")))
+                             (text.interposed ..separator))
+                         "}")))
+
+  (def !composite
+    (template (!composite 
 )
+      [(abstraction
+        (format (representation 
)
+                ..separator
+                (representation )))]))
+  
+  (def .public (and pre post)
+    (All (_ kind) (-> (CSS kind) (CSS kind) (CSS kind)))
+    (!composite pre post))
+
+  (def .public (in_context combinator selector css)
+    (-> Combinator (Selector Any) (CSS Common) (CSS Common))
+    (|> css
+        representation
+        (text.all_split_by ..separator)
+        (list#each (let [prefix (|> selector
+                                    (combinator (/selector.tag ""))
+                                    /selector.selector)]
+                     (|>> (format prefix))))
+        (text.interposed ..separator)
+        abstraction))
+
+  (def .public (dependent combinator selector style inner)
+    (-> Combinator (Selector Any) Style (CSS Common) (CSS Common))
+    (!composite (..rule selector style)
+                (..in_context combinator selector inner)))
+
+  (with_template [ ]
+    [(def .public 
+       (-> (Selector Any) Style (CSS Common) (CSS Common))
+       (..dependent ))]
+
+    [with_descendants /selector.in]
+    [with_children /selector.sub]
+    )
+
+  (def .public (in_case specializer selector css)
+    (All (_ kind)
+      (-> (Specializer kind) (Selector (Generic Any)) (CSS Common) (CSS Common)))
+    (|> css
+        representation
+        (text.all_split_by ..separator)
+        (list#each (let [prefix (|> selector
+                                    (specializer (as_expected (/selector.tag "")))
+                                    /selector.selector)]
+                     (|>> (format prefix))))
+        (text.interposed ..separator)
+        abstraction))
+
+  (def .public (specialized combinator selector style inner)
+    (All (_ kind)
+      (-> (Specializer kind) (Selector (Generic Any)) Style (CSS Common) (CSS Common)))
+    (!composite (..rule selector style)
+                (..in_case combinator selector inner)))
+
+  (with_template [ ]
+    [(def .public 
+       (-> (Selector (Generic Any)) Style (CSS Common) (CSS Common))
+       (..specialized ))]
+
+    [with_case /selector.and]
+    [with_part /selector.at]
+    [with_element /selector.for]
+    )
+  )
diff --git a/stdlib/source/library/lux/web/css/class.lux b/stdlib/source/library/lux/web/css/class.lux
new file mode 100644
index 000000000..46e980a47
--- /dev/null
+++ b/stdlib/source/library/lux/web/css/class.lux
@@ -0,0 +1,34 @@
+(.require
+ [library
+  [lux (.except)
+   [abstract
+    [monad (.only do)]]
+   [data
+    ["[0]" text (.use "[1]#[0]" hash)
+     ["%" \\format (.only format)]]]
+   ["[0]" meta (.only)
+    ["[0]" code]
+    [macro
+     [syntax (.only syntax)]]
+    [type
+     ["[0]" nominal (.except def)]]]]])
+
+(nominal.def .public Class
+  Text
+
+  (def .public class
+    (-> Class Text)
+    (|>> representation))
+
+  (def .public custom
+    (-> Text Class)
+    (|>> abstraction))
+
+  (def .public generic
+    (syntax (_ [])
+      (do meta.monad
+        [module meta.current_module_name
+         class meta.seed]
+        (in (list (` (..custom (, (code.text (format "c" (%.nat_16 class)
+                                                     "_" (%.nat_16 (text#hash module))))))))))))
+  )
diff --git a/stdlib/source/library/lux/web/css/font.lux b/stdlib/source/library/lux/web/css/font.lux
new file mode 100644
index 000000000..f69a8f602
--- /dev/null
+++ b/stdlib/source/library/lux/web/css/font.lux
@@ -0,0 +1,24 @@
+(.require
+ [library
+  [lux (.except #source)
+   [meta
+    [code
+     ["s" \\parser]]]
+   [world
+    [net (.only URL)]]]]
+ ["[0]" //
+  ["[1][0]" value (.only Value Font_Stretch Font_Style Font_Weight)]])
+
+(type .public Unicode_Range
+  (Record
+   [#start Nat
+    #end Nat]))
+
+(type .public Font
+  (Record
+   [#family Text
+    #source URL
+    #stretch (Maybe (Value Font_Stretch))
+    #style (Maybe (Value Font_Style))
+    #weight (Maybe (Value Font_Weight))
+    #unicode_range (Maybe Unicode_Range)]))
diff --git a/stdlib/source/library/lux/web/css/id.lux b/stdlib/source/library/lux/web/css/id.lux
new file mode 100644
index 000000000..fc93ec1bb
--- /dev/null
+++ b/stdlib/source/library/lux/web/css/id.lux
@@ -0,0 +1,34 @@
+(.require
+ [library
+  [lux (.except)
+   [abstract
+    [monad (.only do)]]
+   [data
+    ["[0]" text (.use "[1]#[0]" hash)
+     ["%" \\format (.only format)]]]
+   ["[0]" meta (.only)
+    ["[0]" code]
+    [macro
+     [syntax (.only syntax)]]
+    [type
+     ["[0]" nominal (.except def)]]]]])
+
+(nominal.def .public ID
+  Text
+
+  (def .public id
+    (-> ID Text)
+    (|>> representation))
+
+  (def .public custom
+    (-> Text ID)
+    (|>> abstraction))
+
+  (def .public generic
+    (syntax (_ [])
+      (do meta.monad
+        [module meta.current_module_name
+         id meta.seed]
+        (in (list (` (..custom (, (code.text (format "i" (%.nat_16 id)
+                                                     "_" (%.nat_16 (text#hash module))))))))))))
+  )
diff --git a/stdlib/source/library/lux/web/css/property.lux b/stdlib/source/library/lux/web/css/property.lux
new file mode 100644
index 000000000..192f0395a
--- /dev/null
+++ b/stdlib/source/library/lux/web/css/property.lux
@@ -0,0 +1,517 @@
+(.require
+ [library
+  [lux (.except All Location all left right)
+   [data
+    ["[0]" text]]
+   [meta
+    ["[0]" code (.only)
+     ["s" \\parser]]
+    [macro
+     [syntax (.only syntax)]
+     ["[0]" template]]
+    [type
+     ["[0]" nominal (.except def)]]]]]
+ [//
+  [value (.only All
+                Number
+                Length Thickness Time
+                Color
+                Location Fit
+                Slice
+                Alignment Animation_Direction
+                Animation Animation_Fill
+                Column_Fill Column_Span
+                Iteration Count
+                Play
+                Timing Visibility Attachment
+                Blend Span Image
+                Angle Repeat Border
+                Collapse Box_Decoration_Break Caption
+                Float Clear
+                Content
+                Cursor
+                Shadow Clip
+                Text_Direction
+                Display Empty
+                Filter
+                Flex_Direction Flex_Wrap
+                Font Font_Kerning Font_Size Font_Stretch Font_Style Font_Weight Font_Variant
+                Grid Grid_Content Grid_Flow Grid_Span Grid_Template
+                Hanging_Punctuation Hyphens Isolation
+                List_Style_Position List_Style_Type
+                Overflow Page_Break Pointer_Events
+                Position
+                Quotes
+                Resize Scroll_Behavior Table_Layout
+                Text_Align Text_Align_Last
+                Text_Decoration_Line Text_Decoration_Style
+                Text_Justification Text_Overflow Text_Transform
+                Transform Transform_Origin Transform_Style
+                Transition
+                Bidi User_Select
+                Vertical_Align
+                White_Space Word_Break Word_Wrap Writing_Mode
+                Z_Index)]])
+
+(def text_symbol
+  (syntax (_ [symbol s.text])
+    (in (list (code.local (text.replaced "-" "_" symbol))))))
+
+(nominal.def .public (Property brand)
+  Text
+
+  (def .public name
+    (-> (Property Any) Text)
+    (|>> representation))
+
+  (with_template [ + +]
+    [(`` (with_template [ ]
+           [(def .public 
+              (Property )
+              (abstraction ))]
+
+           (,, (template.spliced +))))
+
+     (with_expansions [ (template.spliced +)]
+       (with_template []
+         [(`` (def .public (,, (text_symbol ))
+                (Property )
+                (abstraction )))]
+         
+         ))]
+
+    [All
+     []
+     [["all"]]]
+
+    [Length
+     []
+     [["border-image-outset"]
+      ["border-image-width"]
+      ["bottom"]
+      ["column-gap"]
+      ["column-width"]
+      ["flex-basis"]
+      ["grid-column-gap"]
+      ["grid-gap"]
+      ["grid-row-gap"]
+      ["height"]
+      ["left"]
+      ["letter-spacing"]
+      ["line-height"]
+      ["margin"]
+      ["margin-bottom"]
+      ["margin-left"]
+      ["margin-right"]
+      ["margin-top"]
+      ["max-height"]
+      ["max-width"]
+      ["min-height"]
+      ["min-width"]
+      ["outline-offset"]
+      ["padding"]
+      ["padding-bottom"]
+      ["padding-left"]
+      ["padding-right"]
+      ["padding-top"]
+      ["perspective"]
+      ["right"]
+      ["text-indent"]
+      ["top"]
+      ["width"]
+      ["word-spacing"]]]
+
+    [Time
+     []
+     [["animation-delay"]
+      ["animation-duration"]
+      ["transition-delay"]
+      ["transition-duration"]]]
+
+    [Slice
+     []
+     [["border-image-slice"]]]
+
+    [Color
+     [[text_color "color"]]
+     [["background-color"]
+      ["border-color"]
+      ["border-bottom-color"]
+      ["border-left-color"]
+      ["border-right-color"]
+      ["border-top-color"]
+      ["caret-color"]
+      ["column-rule-color"]
+      ["outline-color"]
+      ["text-decoration-color"]]]
+
+    [Alignment
+     []
+     [["align-content"]
+      ["align-items"]
+      ["align-self"]
+      ["justify-content"]]]
+
+    [Animation
+     []
+     [["animation-name"]]]
+
+    [Animation_Direction
+     []
+     [["animation-direction"]]]
+
+    [Animation_Fill
+     []
+     [["animation-fill-mode"]]]
+
+    [Column_Fill
+     []
+     [["column-fill"]]]
+
+    [Column_Span
+     []
+     [["column-span"]]]
+
+    [Iteration
+     []
+     [["animation-iteration-count"]]]
+
+    [Count
+     []
+     [["column-count"]
+      ["flex-grow"]
+      ["flex-shrink"]
+      ["order"]
+      ["tab-size"]]]
+
+    [Play
+     []
+     [["animation-play-state"]]]
+
+    [Timing
+     []
+     [["animation-timing-function"]
+      ["transition-timing-function"]]]
+
+    [Visibility
+     []
+     [["backface-visibility"]
+      ["visibility"]]]
+
+    [Attachment
+     []
+     [["background-attachment"]]]
+
+    [Blend
+     []
+     [["background-blend-mode"]
+      ["mix-blend-mode"]]]
+
+    [Image
+     []
+     [["background-image"]
+      ["border-image-source"]
+      ["list-style-image"]]]
+
+    [Span
+     []
+     [["background-clip"]
+      ["background-origin"]
+      ["box-sizing"]]]
+
+    [Location
+     []
+     [["background-position"]
+      ["object-position"]
+      ["perspective-origin"]]]
+
+    [Repeat
+     []
+     [["background-repeat"]
+      ["border-image-repeat"]]]
+
+    [Fit
+     []
+     [["background-size"]
+      ["border-radius"]
+      ["border-bottom-left-radius"]
+      ["border-bottom-right-radius"]
+      ["border-top-left-radius"]
+      ["border-top-right-radius"]
+      ["border-spacing"]
+      ["object-fit"]]]
+
+    [Border
+     []
+     [["border-style"]
+      ["border-bottom-style"]
+      ["border-left-style"]
+      ["border-right-style"]
+      ["border-top-style"]
+      ["column-rule-style"]
+      ["outline-style"]]]
+
+    [Thickness
+     []
+     [["border-width"]
+      ["border-bottom-width"]
+      ["border-left-width"]
+      ["border-right-width"]
+      ["border-top-width"]
+      ["column-rule-width"]
+      ["outline-width"]]]
+
+    [Collapse
+     []
+     [["border-collapse"]]]
+
+    [Box_Decoration_Break
+     []
+     [["box-decoration-break"]]]
+
+    [Caption
+     []
+     [["caption-side"]]]
+
+    [Clear
+     []
+     [["clear"]]]
+
+    [Shadow
+     []
+     [["box-shadow"]
+      ["text-shadow"]]]
+    
+    [Clip
+     []
+     [["clip"]]]
+
+    [Content
+     []
+     [["counter-reset"]
+      ["counter-increment"]]]
+
+    [Cursor
+     []
+     [["cursor"]]]
+
+    [Text_Direction
+     [[text_direction "direction"]]
+     []]
+
+    [Display
+     []
+     [["display"]]]
+
+    [Empty
+     []
+     [["empty-cells"]]]
+
+    [Filter
+     []
+     [["filter"]]]
+
+    [Flex_Direction
+     []
+     [["flex-direction"]]]
+
+    [Flex_Wrap
+     []
+     [["flex-wrap"]]]
+
+    [Float
+     []
+     [["float"]]]
+
+    [Font
+     []
+     [["font-family"]]]
+
+    [Font_Kerning
+     []
+     [["font-kerning"]]]
+
+    [Font_Size
+     []
+     [["font-size"]]]
+
+    [Font_Stretch
+     []
+     [["font-stretch"]]]
+
+    [Font_Style
+     []
+     [["font-style"]]]
+
+    [Font_Weight
+     []
+     [["font-weight"]]]
+
+    [Font_Variant
+     []
+     [["font-variant"]]]
+
+    [Grid
+     []
+     [["grid-area"]]]
+
+    [Grid_Content
+     []
+     [["grid-auto-columns"]
+      ["grid-auto-rows"]
+      ["grid-template-columns"]
+      ["grid-template-rows"]]]
+
+    [Grid_Flow
+     []
+     [["grid-auto-flow"]]]
+
+    [Grid_Span
+     []
+     [["grid-column-end"]
+      ["grid-column-start"]
+      ["grid-row-end"]
+      ["grid-row-start"]]]
+
+    [Grid_Template
+     []
+     [["grid-template-areas"]]]
+
+    [Hanging_Punctuation
+     []
+     [["hanging-punctuation"]]]
+
+    [Hyphens
+     []
+     [["hyphens"]]]
+
+    [Isolation
+     []
+     [["isolation"]]]
+
+    [List_Style_Position
+     []
+     [["list-style-position"]]]
+
+    [List_Style_Type
+     []
+     [["list-style-type"]]]
+
+    [Number
+     []
+     [["font-size-adjust"]
+      ["opacity"]]]
+
+    [Overflow
+     []
+     [["overflow"]
+      ["overflow-x"]
+      ["overflow-y"]]]
+
+    [Page_Break
+     []
+     [["page-break-after"]
+      ["page-break-before"]
+      ["page-break-inside"]]]
+
+    [Pointer_Events
+     []
+     [["pointer-events"]]]
+
+    [Position
+     []
+     [["position"]]]
+
+    [Quotes
+     []
+     [["quotes"]]]
+
+    [Resize
+     []
+     [["resize"]]]
+
+    [Scroll_Behavior
+     []
+     [["scroll-behavior"]]]
+
+    [Table_Layout
+     []
+     [["table-layout"]]]
+
+    [Text_Align
+     []
+     [["text-align"]]]
+
+    [Text_Align_Last
+     []
+     [["text-align-last"]]]
+
+    [Text_Decoration_Line
+     []
+     [["text-decoration-line"]]]
+
+    [Text_Decoration_Style
+     []
+     [["text-decoration-style"]]]
+
+    [Text_Justification
+     []
+     [["text-justify"]]]
+
+    [Text_Overflow
+     []
+     [["text-overflow"]]]
+
+    [Text_Transform
+     []
+     [["text-transform"]]]
+
+    [Transform
+     []
+     [["transform"]]]
+
+    [Transform_Origin
+     []
+     [["transform-origin"]]]
+
+    [Transform_Style
+     []
+     [["transform-style"]]]
+
+    [Transition
+     []
+     [["transition-property"]]]
+
+    [Bidi
+     []
+     [["unicode-bidi"]]]
+
+    [User_Select
+     []
+     [["user-select"]]]
+
+    [Vertical_Align
+     []
+     [["vertical-align"]]]
+
+    [White_Space
+     []
+     [["white-space"]]]
+
+    [Word_Break
+     []
+     [["word-break"]]]
+
+    [Word_Wrap
+     []
+     [["word-wrap"]]]
+
+    [Writing_Mode
+     []
+     [["writing-mode"]]]
+
+    [Z_Index
+     []
+     [["z-index"]]]
+    )
+  )
diff --git a/stdlib/source/library/lux/web/css/query.lux b/stdlib/source/library/lux/web/css/query.lux
new file mode 100644
index 000000000..de3defe3b
--- /dev/null
+++ b/stdlib/source/library/lux/web/css/query.lux
@@ -0,0 +1,135 @@
+(.require
+ [library
+  [lux (.except and or not all only except)
+   [data
+    ["[0]" text (.only)
+     ["%" \\format (.only format)]]]
+   [meta
+    ["[0]" code (.only)
+     ["s" \\parser]]
+    [macro
+     [syntax (.only syntax)]
+     ["[0]" template]]
+    [type
+     ["[0]" nominal (.except def)]]]]]
+ ["[0]" //
+  ["[1][0]" value (.only Value Length Count Resolution Ratio
+                         Orientation Scan Boolean Update
+                         Block_Overflow Inline_Overflow
+                         Display_Mode Color_Gamut Inverted_Colors
+                         Pointer Hover
+                         Light Scripting Motion Color_Scheme)]])
+
+(def text_symbol
+  (syntax (_ [symbol s.text])
+    (in (list (code.local (text.replaced "-" "_" symbol))))))
+
+(nominal.def .public Media
+  Text
+
+  (def .public media
+    (-> Media Text)
+    (|>> representation))
+
+  (with_template []
+    [(`` (def .public (,, (text_symbol ))
+           Media
+           (abstraction )))]
+
+    ["all"]
+    ["print"]
+    ["screen"]
+    ["speech"]
+    ))
+
+(nominal.def .public Feature
+  Text
+
+  (def .public feature
+    (-> Feature Text)
+    (|>> representation))
+
+  (with_template [ ]
+    [(`` (def .public ((,, (text_symbol )) input)
+           (-> (Value ) Feature)
+           (abstraction (format "("  ": " (//value.value input) ")"))))]
+
+    ["min-color" Count]
+    ["color" Count]
+    ["max-color" Count]
+
+    ["min-color-index" Count]
+    ["color-index" Count]
+    ["max-color-index" Count]
+
+    ["min-monochrome" Count]
+    ["monochrome" Count]
+    ["max-monochrome" Count]
+
+    ["min-height" Length]
+    ["height" Length]
+    ["max-height" Length]
+
+    ["min-width" Length]
+    ["width" Length]
+    ["max-width" Length]
+
+    ["min-resolution" Resolution]
+    ["resolution" Resolution]
+    ["max-resolution" Resolution]
+
+    ["aspect-ratio" Ratio]
+    ["max-aspect-ratio" Ratio]
+    ["min-aspect-ratio" Ratio]
+
+    ["display-mode" Display_Mode]
+    ["color-gamut" Color_Gamut]
+    ["grid" Boolean]
+    ["orientation" Orientation]
+    ["overflow-block" Block_Overflow]
+    ["overflow-inline" Inline_Overflow]
+    ["scan" Scan]
+    ["update" Update]
+    ["inverted-colors" Inverted_Colors]
+    ["pointer" Pointer]
+    ["any-pointer" Pointer]
+    ["hover" Hover]
+    ["any-hover" Hover]
+    ["light-level" Light]
+    ["scripting" Scripting]
+    ["prefers-reduced-motion" Motion]
+    ["prefers-color-scheme" Color_Scheme]
+    )
+  )
+
+(nominal.def .public Query
+  Text
+
+  (def .public query
+    (-> Query Text)
+    (|>> representation))
+
+  (with_template [ ]
+    [(def .public 
+       (-> Media Query)
+       (|>> ..media (format ) abstraction))]
+
+    [except "not "]
+    [only "only "]
+    )
+
+  (def .public not
+    (-> Feature Query)
+    (|>> ..feature (format "not ") abstraction))
+
+  (with_template [ ]
+    [(def .public ( left right)
+       (-> Query Query Query)
+       (abstraction (format (representation left)
+                            
+                            (representation right))))]
+
+    [and " and "]
+    [or " or "]
+    )
+  )
diff --git a/stdlib/source/library/lux/web/css/selector.lux b/stdlib/source/library/lux/web/css/selector.lux
new file mode 100644
index 000000000..292e27300
--- /dev/null
+++ b/stdlib/source/library/lux/web/css/selector.lux
@@ -0,0 +1,213 @@
+(.require
+ [library
+  [lux (.except Label Tag or and for same? not)
+   [data
+    ["[0]" text (.only)
+     ["%" \\format (.only format)]]]
+   [math
+    [number
+     ["i" int]]]
+   [meta
+    [macro
+     ["[0]" template]]
+    [type
+     ["[0]" nominal (.except def)]]]
+   [world
+    ["[0]" locale (.only Locale)]]]]
+ ["[0]" //
+  ["[1][0]" id (.only ID)]
+  ["[1][0]" class (.only Class)]])
+
+(type .public Label Text)
+
+(type .public Tag Label)
+(type .public Attribute Label)
+
+(nominal.def .public (Generic brand) Any)
+
+(with_template [ ]
+  [(nominal.def  Any)
+   (type .public  (Generic ))]
+
+  [Can_Chain Can_Chain']
+  [Cannot_Chain Cannot_Chain']
+  )
+
+(nominal.def .public Unique Any)
+(nominal.def .public Specific Any)
+(nominal.def .public Composite Any)
+
+(nominal.def .public (Selector kind)
+  Text
+
+  (def .public selector
+    (-> (Selector Any) Text)
+    (|>> representation))
+
+  (def .public any
+    (Selector Cannot_Chain)
+    (abstraction "*"))
+
+  (def .public tag
+    (-> Tag (Selector Cannot_Chain))
+    (|>> abstraction))
+
+  (with_template [    ]
+    [(def .public 
+       (->  (Selector ))
+       (|>>  (format ) abstraction))]
+
+    [id ID "#" Unique //id.id]
+    [class Class "." Can_Chain //class.class]
+    )
+
+  (with_template [  +]
+    [(`` (with_template [ ]
+           [(def .public ( right left)
+              (-> (Selector ) (Selector ) (Selector Composite))
+              (abstraction (format (representation left)
+                                   
+                                   (representation right))))]
+
+           (,, (template.spliced +))))]
+
+    [Can_Chain (Generic Any)
+     [["" and]]]
+    [Specific (Generic Any)
+     [["" at]]]
+    [Unique (Generic Any)
+     [["" for]]]
+    [Any Any
+     [["," or]
+      [" " in]
+      [">" sub]
+      ["+" next]
+      ["~" later]]]
+    )
+
+  (type .public (Specializer kind)
+    (-> (Selector kind) (Selector (Generic Any)) (Selector Composite)))
+
+  (type .public Combinator
+    (-> (Selector Any) (Selector Any) (Selector Composite)))
+
+  (def .public (with? attribute)
+    (-> Attribute (Selector Can_Chain))
+    (abstraction (format "[" attribute "]")))
+
+  (with_template [ ]
+    [(def .public ( attribute value)
+       (-> Attribute Text (Selector Can_Chain))
+       (abstraction (format "[" attribute  value "]")))]
+
+    ["=" same?]
+    ["~=" has?]
+    ["|=" has_start?]
+    ["^=" starts?]
+    ["$=" ends?]
+    ["*=" contains?]
+    )
+
+  (with_template [ +]
+    [(`` (with_template [ ]
+           [(def .public 
+              (Selector )
+              (abstraction ))]
+
+           (,, (template.spliced +))))]
+
+    [Can_Chain
+     [[active ":active"]
+      [checked ":checked"]
+      [default ":default"]
+      [disabled ":disabled"]
+      [empty ":empty"]
+      [enabled ":enabled"]
+      [first_child ":first-child"]
+      [first_of_type ":first-of-type"]
+      [focused ":focus"]
+      [hovered ":hover"]
+      [in_range ":in-range"]
+      [indeterminate ":indeterminate"]
+      [invalid ":invalid"]
+      [last_child ":last-child"]
+      [last_of_type ":last-of-type"]
+      [link ":link"]
+      [only_of_type ":only-of-type"]
+      [only_child ":only-child"]
+      [optional ":optional"]
+      [out_of_range ":out-of-range"]
+      [read_only ":read-only"]
+      [read_write ":read-write"]
+      [required ":required"]
+      [root ":root"]
+      [target ":target"]
+      [valid ":valid"]
+      [visited ":visited"]]]
+    
+    [Specific
+     [[after "::after"]
+      [before "::before"]
+      [first_letter "::first-letter"]
+      [first_line "::first-line"]
+      [placeholder "::placeholder"]
+      [selection "::selection"]]]
+    )
+
+  (def .public (language locale)
+    (-> Locale (Selector Can_Chain))
+    (|> locale
+        locale.code
+        (text.enclosed ["(" ")"])
+        (format ":lang")
+        abstraction))
+
+  (def .public not
+    (-> (Selector Any) (Selector Can_Chain))
+    (|>> representation
+         (text.enclosed ["(" ")"])
+         (format ":not")
+         abstraction))
+
+  (nominal.def .public Index
+    Text
+
+    (def .public index
+      (-> Nat Index)
+      (|>> %.nat abstraction))
+
+    (with_template [ ]
+      [(def .public  Index (abstraction ))]
+      
+      [odd "odd"]
+      [even "even"]
+      )
+
+    (type .public Formula
+      (Record
+       [#constant Int
+        #variable Int]))
+
+    (def .public (formula input)
+      (-> Formula Index)
+      (let [(open "_[0]") input]
+        (abstraction (format (if (i.< +0 _#variable)
+                               (%.int _#variable)
+                               (%.nat (.nat _#variable)))
+                             (%.int _#constant)))))
+    
+    (with_template [ ]
+      [(def .public ( index)
+         (-> Index (Selector Can_Chain))
+         (|> (representation index)
+             (text.enclosed ["(" ")"])
+             (format )
+             (abstraction Selector)))]
+
+      [nth_child ":nth-child"]
+      [nth_last_child ":nth-last-child"]
+      [nth_of_type ":nth-of-type"]
+      [nth_last_of_type ":nth-last-of-type"]
+      )
+    )
+  )
diff --git a/stdlib/source/library/lux/web/css/style.lux b/stdlib/source/library/lux/web/css/style.lux
new file mode 100644
index 000000000..d1bd1899d
--- /dev/null
+++ b/stdlib/source/library/lux/web/css/style.lux
@@ -0,0 +1,39 @@
+(.require
+ [library
+  [lux (.except with)
+   [data
+    [text
+     ["%" \\format (.only format)]]
+    [collection
+     ["[0]" list (.use "[1]#[0]" mix)]]]
+   [meta
+    [type
+     ["[0]" nominal (.except def)]]]]]
+ ["[0]" //
+  ["[1][0]" value (.only Value)]
+  ["[1][0]" property (.only Property)]])
+
+(nominal.def .public Style
+  Text
+
+  (def .public empty
+    Style
+    (abstraction ""))
+
+  (def .public (with [property value])
+    (All (_ brand)
+      (-> [(Property brand) (Value brand)]
+          (-> Style Style)))
+    (|>> representation
+         (format (//property.name property) ": " (//value.value value) ";")
+         abstraction))
+
+  (def .public inline
+    (-> Style Text)
+    (|>> representation))
+
+  (def .public (style config)
+    (-> (List (Ex (_ brand) [(Property brand) (Value brand)]))
+        Style)
+    (list#mix ..with ..empty config))
+  )
diff --git a/stdlib/source/library/lux/web/css/value.lux b/stdlib/source/library/lux/web/css/value.lux
new file mode 100644
index 000000000..37c8580a0
--- /dev/null
+++ b/stdlib/source/library/lux/web/css/value.lux
@@ -0,0 +1,1422 @@
+(.require
+ [library
+  [lux (.except Label All Location and static false true all)
+   [control
+    ["[0]" maybe]]
+   [data
+    ["[0]" product]
+    ["[0]" color (.only)
+     [pigment (.only Pigment)]
+     ["[0]" rgb]]
+    ["[0]" text (.only)
+     ["%" \\format (.only Format format)]]
+    [collection
+     ["[0]" list (.use "[1]#[0]" functor)]]]
+   [math
+    [number
+     ["n" nat]
+     ["i" int]
+     ["r" rev]
+     ["f" frac]]]
+   [meta
+    ["[0]" code (.only)
+     ["<[1]>" \\parser]]
+    [macro
+     [syntax (.only syntax)]
+     ["[0]" template]]
+    [type
+     ["[0]" nominal (.except def)]]]
+   [world
+    [net (.only URL)]]]]
+ [//
+  [selector (.only Label)]])
+
+(def text_symbol
+  (syntax (_ [symbol .text])
+    (in (list (code.local (text.replaced "-" "_" symbol))))))
+
+(def enumeration
+  (template (_    + +)
+    [(nominal.def .public 
+       
+
+       (def .public 
+         (->  )
+         (|>> representation))
+
+       (`` (with_template [ ]
+             [(def .public   (abstraction ))]
+
+             (,, (template.spliced +))
+             ))
+
+       (template.spliced +))]))
+
+(def (%number value)
+  (Format Frac)
+  (let [raw (%.frac value)]
+    (if (f.< +0.0 value)
+      raw
+      (|> raw (text.split_at 1) maybe.trusted product.right))))
+
+(nominal.def .public (Value brand)
+  Text
+
+  (def .public value
+    (-> (Value Any)
+        Text)
+    (|>> representation))
+
+  (with_template [ ]
+    [(def .public 
+       Value
+       (abstraction ))]
+
+    [initial "initial"]
+    [inherit "inherit"]
+    [unset "unset"]
+    )
+
+  (nominal.def .public (Numeric kind) Any)
+
+  (with_template []
+    [(with_expansions [' (template.symbol [ "'"])]
+       (nominal.def .public ' Any)
+       (type .public 
+         (Numeric ')))]
+
+    [Number]
+    [Length]
+    [Time]
+    [Percentage]
+    )
+
+  (with_template [ + +]
+    [(nominal.def .public  Any)
+
+     (`` (with_template [ ]
+           [(def .public 
+              (Value )
+              (abstraction ))]
+           
+           (,, (template.spliced +))))
+
+     (with_expansions [ (template.spliced +)]
+       (with_template []
+         [(`` (def .public (,, (..text_symbol ))
+                (Value )
+                (abstraction )))]
+         
+         ))]
+
+    [All
+     []
+     []]
+
+    [Thickness
+     []
+     [["medium"]
+      ["thin"]
+      ["thick"]]]
+
+    [Slice
+     [[full_slice "fill"]]
+     []]
+
+    [Alignment
+     [[auto_alignment "auto"]]
+     [["stretch"]
+      ["center"]
+      ["flex-start"]
+      ["flex-end"]
+      ["baseline"]
+      ["space-between"]
+      ["space-around"]]]
+
+    [Animation
+     []
+     []]
+
+    [Animation_Direction
+     [[normal_direction "normal"]]
+     [["reverse"]
+      ["alternate"]
+      ["alternate-reverse"]]]
+
+    [Animation_Fill
+     [[fill_forwards "forwards"]
+      [fill_backwards "backwards"]
+      [fill_both "both"]]
+     []]
+
+    [Column_Fill
+     []
+     [["balance"]
+      ["auto"]]]
+
+    [Column_Span
+     []
+     [["all"]]]
+
+    [Iteration
+     []
+     [["infinite"]]]
+
+    [Count
+     []
+     []]
+
+    [Play
+     []
+     [["paused"]
+      ["running"]]]
+
+    [Timing
+     []
+     [["linear"]
+      ["ease"]
+      ["ease-in"]
+      ["ease-out"]
+      ["ease-in-out"]
+      ["step-start"]
+      ["step-end"]]]
+
+    [Visibility
+     [[invisible "hidden"]
+      [collapse_visibility "collapse"]]
+     [["visible"]]]
+
+    [Attachment
+     [[scroll_attachment "scroll"]
+      [fixed_attachment "fixed"]
+      [local_attachment "local"]]
+     []]
+
+    [Blend
+     [[normal_blend "normal"]]
+     [["multiply"]
+      ["screen"]
+      ["overlay"]
+      ["darken"]
+      ["lighten"]
+      ["color-dodge"]
+      ["color-burn"]
+      ["difference"]
+      ["exclusion"]
+      ["hue"]
+      ["saturation"]
+      ["color"]
+      ["luminosity"]]]
+
+    [Span
+     []
+     [["border-box"]
+      ["padding-box"]
+      ["content-box"]]]
+
+    [Image
+     [[no_image "none"]]
+     []]
+
+    [Repeat
+     [[stretch_repeat "stretch"]]
+     [["repeat"]
+      ["repeat-x"]
+      ["repeat-y"]
+      ["no-repeat"]
+      ["space"]
+      ["round"]]]
+
+    [Location
+     [[left_top "left top"]
+      [left_center "left center"]
+      [left_bottom "left bottom"]
+      [right_top "right top"]
+      [right_center "right center"]
+      [right_bottom "right bottom"]
+      [center_top "center top"]
+      [center_center "center center"]
+      [center_bottom "center bottom"]]
+     []]
+
+    [Fit
+     [[no_fit "none"]]
+     [["fill"]
+      ["cover"]
+      ["contain"]
+      ["scale-down"]]]
+
+    [Border
+     []
+     [["hidden"]
+      ["dotted"]
+      ["dashed"]
+      ["solid"]
+      ["double"]
+      ["groove"]
+      ["ridge"]
+      ["inset"]
+      ["outset"]]]
+
+    [Collapse
+     []
+     [["separate"]
+      ["collapse"]]]
+
+    [Box_Decoration_Break
+     []
+     [["slice"]
+      ["clone"]]]
+
+    [Caption
+     []
+     [["top"]
+      ["bottom"]]]
+
+    [Float
+     [[float_left "left"]
+      [float_right "right"]]
+     []]
+
+    [Clear
+     [[clear_left "left"]
+      [clear_right "right"]
+      [clear_both "both"]]
+     []]
+
+    [Counter
+     []
+     []]
+
+    [Content
+     []
+     [["open-quote"]
+      ["close-quote"]
+      ["no-open-quote"]
+      ["no-close-quote"]]]
+
+    [Cursor
+     [[horizontal_text "text"]
+      [no_cursor "none"]]
+     [["alias"]
+      ["all-scroll"]
+      ["cell"]
+      ["context-menu"]
+      ["col-resize"]
+      ["copy"]
+      ["crosshair"]
+      ["default"]
+      ["e-resize"]
+      ["ew-resize"]
+      ["grab"]
+      ["grabbing"]
+      ["help"]
+      ["move"]
+      ["n-resize"]
+      ["ne-resize"]
+      ["nesw-resize"]
+      ["ns-resize"]
+      ["nw-resize"]
+      ["nwse-resize"]
+      ["no-drop"]
+      ["not-allowed"]
+      ["pointer"]
+      ["progress"]
+      ["row-resize"]
+      ["s-resize"]
+      ["se-resize"]
+      ["sw-resize"]
+      ["vertical-text"]
+      ["w-resize"]
+      ["wait"]
+      ["zoom-in"]
+      ["zoom-out"]]]
+
+    [Shadow
+     []
+     []]
+
+    [Clip
+     []
+     []]
+
+    [Text_Direction
+     [[left_to_right "ltr"]
+      [right_to_left "rtl"]]
+     []]
+
+    [Display
+     [[grid_display "grid"]
+      [no_display "none"]]
+     [["inline"]
+      ["block"]
+      ["contents"]
+      ["flex"]
+      ["inline-block"]
+      ["inline-flex"]
+      ["inline-grid"]
+      ["inline-table"]
+      ["list-item"]
+      ["run-in"]
+      ["table"]
+      ["table-caption"]
+      ["table-column-group"]
+      ["table-header-group"]
+      ["table-footer-group"]
+      ["table-row-group"]
+      ["table-cell"]
+      ["table-column"]
+      ["table-row"]]]
+
+    [Empty
+     []
+     [["show"]
+      ["hide"]]]
+
+    [Filter
+     []
+     []]
+
+    [Flex_Direction
+     []
+     [["row"]
+      ["row-reverse"]
+      ["column"]
+      ["column-reverse"]]]
+
+    [Flex_Wrap
+     [[no_wrap "nowrap"]]
+     [["wrap"]
+      ["wrap_reverse"]]]
+
+    [Font_Kerning
+     [[auto_kerning "auto"]
+      [normal_kerning "normal"]
+      [no_kerning "none"]]
+     []]
+
+    [Font_Size
+     [[medium_size "medium"]
+      [xx_small_size "xx-small"]
+      [x_small_size "x-small"]
+      [small_size "small"]
+      [large_size "large"]
+      [x_large_size "x-large"]
+      [xx_large_size "xx-large"]
+      [smaller_size "smaller"]
+      [larger_size "larger"]]
+     []]
+
+    [Font_Stretch
+     [[normal_stretch "normal"]]
+     [["condensed"]
+      ["ultra-condensed"]
+      ["extra-condensed"]
+      ["semi-condensed"]
+      ["expanded"]
+      ["semi-expanded"]
+      ["extra-expanded"]
+      ["ultra-expanded"]]]
+
+    [Font_Style
+     [[normal_style "normal"]]
+     [["italic"]
+      ["oblique"]]]
+
+    [Font_Weight
+     [[normal_weight "normal"]
+      [weight_100 "100"]
+      [weight_200 "200"]
+      [weight_300 "300"]
+      [weight_400 "400"]
+      [weight_500 "500"]
+      [weight_600 "600"]
+      [weight_700 "700"]
+      [weight_800 "800"]
+      [weight_900 "900"]]
+     [["bold"]]]
+
+    [Font_Variant
+     [[normal_font "normal"]]
+     [["small-caps"]]]
+
+    [Grid
+     []
+     []]
+
+    [Grid_Content
+     [[auto_content "auto"]]
+     [["max-content"]
+      ["min-content"]]]
+
+    [Grid_Flow
+     [[row_flow "row"]
+      [column_flow "column"]
+      [dense_flow "dense"]
+      [row_dense_flow "row dense"]
+      [column_dense_flow "column dense"]]
+     []]
+
+    [Grid_Span
+     [[auto_span "auto"]]
+     []]
+
+    [Grid_Template
+     []
+     []]
+
+    [Hanging_Punctuation
+     [[no_hanging_punctuation "none"]]
+     [["first"]
+      ["last"]
+      ["allow-end"]
+      ["force-end"]]]
+
+    [Hyphens
+     [[no_hyphens "none"]
+      [manual_hyphens "manual"]
+      [auto_hyphens "auto"]]
+     []]
+
+    [Orientation
+     []
+     [["portrait"]
+      ["landscape"]]]
+
+    [Resolution
+     []
+     []]
+
+    [Scan
+     []
+     [["interlace"]
+      ["progressive"]]]
+
+    [Boolean
+     [[false "0"]
+      [true "1"]]
+     []]
+
+    [Update
+     [[no_update "none"]
+      [slow_update "slow"]
+      [fast_update "fast"]]
+     []]
+
+    [Block_Overflow
+     [[no_block_overflow "none"]
+      [scroll_block_overflow "scroll"]
+      [optional_paged_block_overflow "optional-paged"]
+      [paged_block_overflow "paged"]]
+     []]
+
+    [Inline_Overflow
+     [[no_inline_overflow "none"]
+      [scroll_inline_overflow "scroll"]]
+     []]
+
+    [Display_Mode
+     []
+     [["fullscreen"]
+      ["standalone"]
+      ["minimal-ui"]
+      ["browser"]]]
+
+    [Color_Gamut
+     []
+     [["srgb"]
+      ["p3"]
+      ["rec2020"]]]
+
+    [Inverted_Colors
+     [[no_inverted_colors "none"]
+      [inverted_colors "inverted"]]
+     []]
+
+    [Pointer
+     [[no_pointer "none"]
+      [coarse_pointer "coarse"]
+      [fine_pointer "fine"]]
+     []]
+
+    [Hover
+     [[no_hover "none"]]
+     [["hover"]]]
+
+    [Light
+     [[dim_light "dim"]
+      [normal_light "normal"]
+      [washed_light "washed"]]
+     []]
+
+    [Ratio
+     []
+     []]
+
+    [Scripting
+     [[no_scripting "none"]
+      [initial_scripting_only "initial-only"]
+      [scripting_enabled "enabled"]]
+     []]
+
+    [Motion
+     [[no_motion_preference "no-preference"]
+      [reduced_motion "reduce"]]
+     []]
+
+    [Color_Scheme
+     [[no_color_scheme_preference "no-preference"]
+      [light_color_scheme "light"]
+      [dark_color_scheme "dark"]]
+     []]
+
+    [Isolation
+     [[auto_isolation "auto"]]
+     [["isolate"]]]
+
+    [List_Style_Position
+     []
+     [["inside"]
+      ["outside"]]]
+
+    [List_Style_Type
+     [[no_list_style "none"]]
+     [["disc"]
+      ["armenian"]
+      ["circle"]
+      ["cjk-ideographic"]
+      ["decimal"]
+      ["decimal-leading-zero"]
+      ["georgian"]
+      ["hebrew"]
+      ["hiragana"]
+      ["hiragana-iroha"]
+      ["katakana"]
+      ["katakana-iroha"]
+      ["lower-alpha"]
+      ["lower-greek"]
+      ["lower-latin"]
+      ["lower-roman"]
+      ["square"]
+      ["upper-alpha"]
+      ["upper-greek"]
+      ["upper-latin"]
+      ["upper-roman"]]]
+
+    [Color
+     []
+     []]
+
+    [Overflow
+     [[visible_overflow "visible"]
+      [hidden_overflow "hidden"]
+      [scroll_overflow "scroll"]
+      [auto_overflow "auto"]]
+     []]
+
+    [Page_Break
+     [[auto_page_break "auto"]
+      [always_page_break "always"]
+      [avoid_page_break "avoid"]
+      [left_page_break "left"]
+      [right_page_break "right"]]
+     []]
+
+    [Pointer_Events
+     [[auto_pointer_events "auto"]
+      [no_pointer_events "none"]]
+     []]
+
+    [Position
+     []
+     [["static"]
+      ["absolute"]
+      ["fixed"]
+      ["relative"]
+      ["sticky"]]]
+
+    [Quotes
+     [[no_quotes "none"]]
+     []]
+
+    [Resize
+     [[resize_none "none"]
+      [resize_both "both"]
+      [resize_horizontal "horizontal"]
+      [resize_vertical "vertical"]]
+     []]
+
+    [Scroll_Behavior
+     [[auto_scroll_behavior "auto"]
+      [smooth_scroll_behavior "smooth"]]
+     []]
+
+    [Table_Layout
+     [[auto_table_layout "auto"]
+      [fixed_table_layout "fixed"]]
+     []]
+
+    [Text_Align
+     [[left_text_align "left"]
+      [right_text_align "right"]
+      [center_text_align "center"]
+      [justify_text_align "justify"]]
+     []]
+
+    [Text_Align_Last
+     [[auto_text_align_last "auto"]
+      [left_text_align_last "left"]
+      [right_text_align_last "right"]
+      [center_text_align_last "center"]
+      [justify_text_align_last "justify"]
+      [start_text_align_last "start"]
+      [end_text_align_last "end"]]
+     []]
+
+    [Text_Decoration_Line
+     [[no_text_decoration_line "none"]
+      [underline_text_decoration_line "underline"]
+      [overline_text_decoration_line "overline"]
+      [line_through_text_decoration_line "line-through"]]
+     []]
+
+    [Text_Decoration_Style
+     [[solid_text_decoration_style "solid"]
+      [double_text_decoration_style "double"]
+      [dotted_text_decoration_style "dotted"]
+      [dashed_text_decoration_style "dashed"]
+      [wavy_text_decoration_style "wavy"]]
+     []]
+
+    [Text_Justification
+     [[auto_text_justification "auto"]
+      [inter_word_text_justification "inter-word"]
+      [inter_character_text_justification "inter-character"]
+      [no_text_justification "none"]]
+     []]
+
+    [Text_Overflow
+     [[clip_text_overflow "clip"]
+      [ellipsis_text_overflow "ellipsis"]]
+     []]
+
+    [Text_Transform
+     [[no_text_transform "none"]]
+     [["capitalize"]
+      ["uppercase"]
+      ["lowercase"]]]
+
+    [Transform
+     [[no_transform "none"]]
+     []]
+
+    [Transform_Origin
+     []
+     []]
+
+    [Transform_Style
+     []
+     [["flat"]
+      ["preserve_3d"]]]
+
+    [Transition
+     [[transition_none "none"]
+      [transition_all "all"]]
+     []]
+
+    [Bidi
+     [[bidi_normal "normal"]
+      [bidi_embed "embed"]
+      [bidi_isolate "isolate"]
+      [bidi_isolate_override "isolate-override"]
+      [bidi_plaintext "plaintext"]]
+     [["bidi-override"]]]
+
+    [User_Select
+     [[user_select_auto "auto"]
+      [user_select_none "none"]
+      [user_select_text "text"]
+      [user_select_all "all"]]
+     []]
+
+    [Vertical_Align
+     [[vertical_align_baseline "baseline"]
+      [vertical_align_sub "sub"]
+      [vertical_align_super "super"]
+      [vertical_align_top "top"]
+      [vertical_align_text_top "text-top"]
+      [vertical_align_middle "middle"]
+      [vertical_align_bottom "bottom"]
+      [vertical_align_text_bottom "text-bottom"]]
+     []]
+
+    [White_Space
+     [[normal_white_space "normal"]
+      [no_wrap_white_space "nowrap"]
+      [pre_white_space "pre"]
+      [pre_line_white_space "pre-line"]
+      [pre_wrap_white_space "pre-wrap"]]
+     []]
+
+    [Word_Break
+     [[normal_word_break "normal"]]
+     [["break-all"]
+      ["keep-all"]
+      ["break-word"]]]
+
+    [Word_Wrap
+     [[normal_word_wrap "normal"]
+      [break_word_word_wrap "break-word"]]
+     []]
+
+    [Writing_Mode
+     [[top_to_bottom_writing_mode "horizontal-tb"]
+      [left_to_right_writing_mode "vertical-rl"]
+      [right_to_left_writing_mode "vertical-lr"]]
+     []]
+
+    [Z_Index
+     []
+     []]
+    )
+
+  (def value_separator
+    ",")
+
+  (def (apply name inputs)
+    (-> Text (List Text)
+        Value)
+    (|> inputs
+        (text.interposed ..value_separator)
+        (text.enclosed ["(" ")"])
+        (format name)
+        abstraction))
+
+  (enumeration
+   Step
+   Text
+   step
+   [[start "start"]
+    [end "end"]]
+   [])
+
+  (def .public (steps intervals step)
+    (-> Nat Step
+        (Value Timing))
+    (..apply "steps" (list (%.nat intervals) (..step step))))
+
+  (def .public (cubic_bezier p0 p1 p2 p3)
+    (-> Frac Frac Frac Frac
+        (Value Timing))
+    (|> (list p0 p1 p2 p3)
+        (list#each %number)
+        (..apply "cubic-bezier")))
+
+  (with_template [ ]
+    [(def .public 
+       (-> Nat
+           (Value ))
+       (|>> %.nat abstraction))]
+
+    [iteration Iteration]
+    [count Count]
+    [slice_number/1 Slice]
+    [span_line Grid_Span]
+    )
+
+  (def .public animation
+    (-> Label
+        (Value Animation))
+    (|>> abstraction))
+
+  (def .public (rgb color)
+    (-> color.Color
+        (Value Color))
+    (let [color (color.rgb color)]
+      (..apply "rgb" (list (%.nat (rgb.red color))
+                           (%.nat (rgb.green color))
+                           (%.nat (rgb.blue color))))))
+
+  (def .public (rgba pigment)
+    (-> Pigment
+        (Value Color))
+    (let [(open "/[0]") pigment]
+      (..apply "rgba" (list (%.nat (rgb.red /#color))
+                            (%.nat (rgb.green /#color))
+                            (%.nat (rgb.blue /#color))
+                            (if (r.= (of r.interval top) /#alpha)
+                              "1.0"
+                              (format "0" (%.rev /#alpha)))))))
+
+  (with_template [ ]
+    [(def .public ( value)
+       (-> Frac
+           (Value Length))
+       (abstraction (format (%number value) )))]
+
+    [em "em"]
+    [ex "ex"]
+    [rem "rem"]
+    [ch "ch"]
+    [vw "vw"]
+    [vh "vh"]
+    [vmin "vmin"]
+    [vmax "vmax"]
+    [% "%"]
+    [cm "cm"]
+    [mm "mm"]
+    [in "in"]
+    [px "px"]
+    [pt "pt"]
+    [pc "pc"]
+    [fr "fr"]
+    )
+
+  (def (%int value)
+    (Format Int)
+    (if (i.< +0 value)
+      (%.int value)
+      (%.nat (.nat value))))
+
+  (with_template [ ]
+    [(def .public ( value)
+       (-> Int
+           (Value Time))
+       (abstraction (format (if (i.< +0 value)
+                              (%.int value)
+                              (%.nat (.nat value)))
+                            )))]
+
+    
+    [seconds "s"]
+    [milli_seconds "ms"]
+    )
+
+  (def .public thickness
+    (-> (Value Length)
+        (Value Thickness))
+    (|>> transmutation))
+
+  (def slice_separator " ")
+
+  (def .public (slice_number/2 horizontal vertical)
+    (-> Nat Nat
+        (Value Slice))
+    (abstraction (format (%.nat horizontal) ..slice_separator
+                         (%.nat vertical))))
+
+  (nominal.def .public Stop
+    Text
+
+    (def .public stop
+      (-> (Value Color)
+          Stop)
+      (|>> (representation Value) (abstraction Stop)))
+
+    (def stop_separator
+      " ")
+
+    (def .public (single_stop length color)
+      (-> (Value Length) (Value Color)
+          Stop)
+      (abstraction (format (representation Value color) ..stop_separator
+                           (representation Value length))))
+
+    (def .public (double_stop start end color)
+      (-> (Value Length) (Value Length) (Value Color)
+          Stop)
+      (abstraction (format (representation Value color) ..stop_separator
+                           (representation Value start) ..stop_separator
+                           (representation Value end))))
+
+    (nominal.def .public Hint
+      Text
+
+      (def .public hint
+        (-> (Value Length)
+            Hint)
+        (|>> (representation Value) (abstraction Hint)))
+
+      (def (with_hint [hint stop])
+        (-> [(Maybe Hint) Stop]
+            Text)
+        (when hint
+          {.#None}
+          (representation Stop stop)
+          
+          {.#Some hint}
+          (format (representation Hint hint) ..value_separator (representation Stop stop))))))
+
+  (type .public (List/1 a)
+    [a (List a)])
+
+  (nominal.def .public Angle
+    Text
+
+    (def .public angle
+      (-> Angle
+          Text)
+      (|>> representation))
+
+    (def .public (turn value)
+      (-> Rev
+          Angle)
+      (abstraction (format (%.rev value) "turn")))
+
+    (def degree_limit
+      Nat
+      360)
+    
+    (def .public (degree value)
+      (-> Nat
+          Angle)
+      (abstraction (format (%.nat (n.% ..degree_limit value)) "deg")))
+
+    (with_template [ ]
+      [(def .public 
+         Angle
+         (..degree ))]
+      
+      [000 to_top]
+      [090 to_right]
+      [180 to_bottom]
+      [270 to_left]
+      )
+
+    (with_template [ ]
+      [(def .public ( angle start next)
+         (-> Angle Stop (List/1 [(Maybe Hint) Stop])
+             (Value Image))
+         (let [[now after] next]
+           (..apply  (list.partial (representation Angle angle)
+                                             (with_hint now)
+                                             (list#each with_hint after)))))]
+
+      [linear_gradient "linear-gradient"]
+      [repeating_linear_gradient "repeating-linear-gradient"]
+      )
+    )
+
+  (def percentage_limit
+    Nat
+    (.++ 100))
+
+  (def .public (%% value)
+    (-> Nat
+        (Value Percentage))
+    (abstraction (format (%.nat (n.% percentage_limit value)) "%")))
+
+  (def .public slice_percent/1
+    (-> (Value Percentage)
+        (Value Slice))
+    (|>> transmutation))
+
+  (def .public (slice_percent/2 horizontal vertical)
+    (-> (Value Percentage) (Value Percentage)
+        (Value Slice))
+    (abstraction (format (representation horizontal) ..slice_separator
+                         (representation vertical))))
+
+  (with_template [ 
 +]
+    [(`` (with_template [ ]
+           [(def .public 
+              (-> 
+                  (Value Filter))
+              (|>> 
 (list) (..apply )))]
+
+           (,, (template.spliced +))))]
+
+    [Nat (<| representation ..px n.frac)
+     [[blur "blur"]]]
+    [Nat (<| ..angle ..degree)
+     [[hue_rotate "hue-rotate"]]]
+    [(Value Percentage) representation
+     [[brightness "brightness"]
+      [contrast "contrast"]
+      [grayscale "grayscale"]
+      [invert "invert"]
+      [opacity "opacity"]
+      [saturate "saturate"]
+      [sepia "sepia"]]]
+    )
+
+  (def .public svg_filter
+    (-> URL
+        (Value Filter))
+    (|>> (list) (..apply "url")))
+
+  (def default_shadow_length
+    (px +0.0))
+
+  (def .public (drop_shadow horizontal vertical blur spread color)
+    (-> (Value Length) (Value Length)
+        (Maybe (Value Length)) (Maybe (Value Length))
+        (Value Color)
+        (Value Filter))
+    (|> (list (representation horizontal)
+              (representation vertical)
+              (|> blur (maybe.else ..default_shadow_length) representation)
+              (|> spread (maybe.else ..default_shadow_length) representation)
+              (representation color))
+        (text.interposed " ")
+        (list)
+        (..apply "drop-shadow")))
+
+  (def length_separator
+    " ")
+
+  (with_template [ ]
+    [(def .public ( horizontal vertical)
+       (-> (Value Length) (Value Length)
+           (Value ))
+       (abstraction (format (representation horizontal)
+                            ..length_separator
+                            (representation vertical))))]
+
+    [location Location]
+    [fit Fit]
+    )
+
+  (def .public (fit/1 length)
+    (-> (Value Length)
+        (Value Fit))
+    (..fit length length))
+
+  (def .public image
+    (-> URL
+        (Value Image))
+    (|>> %.text
+         (list)
+         (..apply "url")))
+
+  (enumeration
+   Shape
+   Text
+   shape
+   [[ellipse_shape "ellipse"]
+    [circle_shape "circle"]]
+   [])
+
+  (enumeration
+   Extent
+   Text
+   extent
+   [[closest_side "closest-side"]
+    [closest_corner "closest-corner"]
+    [farthest_side "farthest-side"]
+    [farthest_corner "farthest-corner"]]
+   [])
+
+  (with_template [ ]
+    [(def .public ( shape extent location start next)
+       (-> Shape (Maybe Extent) (Value Location)
+           Stop (List/1 [(Maybe Hint) Stop])
+           (Value Image))
+       (let [after_extent (format "at " (representation location))
+             with_extent (when extent
+                           {.#Some extent}
+                           (format (..extent extent) " " after_extent)
+                           
+                           {.#None}
+                           after_extent)
+             where (format (..shape shape) " " with_extent)
+             [now after] next]
+         (..apply  (list.partial (..shape shape)
+                                           (with_hint now)
+                                           (list#each with_hint after)))))]
+    
+    [radial_gradient "radial-gradient"]
+    [repeating_radial_gradient "repeating-radial-gradient"]
+    )
+
+  (def .public (shadow horizontal vertical blur spread color inset?)
+    (-> (Value Length) (Value Length)
+        (Maybe (Value Length)) (Maybe (Value Length))
+        (Value Color) Bit
+        (Value Shadow))
+    (let [with_inset (if inset?
+                       (list "inset")
+                       (list))]
+      (|> (list.partial (representation horizontal)
+                        (representation vertical)
+                        (|> blur (maybe.else ..default_shadow_length) representation)
+                        (|> spread (maybe.else ..default_shadow_length) representation)
+                        (representation color)
+                        with_inset)
+          (text.interposed " ")
+          abstraction)))
+
+  (type .public Rectangle
+    (Record
+     [#top (Value Length)
+      #right (Value Length)
+      #bottom (Value Length)
+      #left (Value Length)]))
+
+  (def .public (clip rectangle)
+    (-> Rectangle
+        (Value Clip))
+    (`` (..apply "rect" (list (,, (with_template []
+                                    [(representation (the  rectangle))]
+
+                                    [#top] [#right] [#bottom] [#left]))))))
+
+  (def .public counter
+    (-> Label
+        (Value Counter))
+    (|>> abstraction))
+
+  (def .public current_count
+    (-> (Value Counter)
+        (Value Content))
+    (|>> representation (list) (..apply "counter")))
+
+  (def .public text
+    (-> Text
+        (Value Content))
+    (|>> %.text abstraction))
+
+  (def .public attribute
+    (-> Label
+        (Value Content))
+    (|>> (list) (..apply "attr")))
+
+  (def .public media
+    (-> URL
+        (Value Content))
+    (|>> (list) (..apply "url")))
+
+  (enumeration
+   Font
+   Text
+   font_name
+   [[serif "serif"]
+    [sans_serif "sans-serif"]
+    [cursive "cursive"]
+    [fantasy "fantasy"]
+    [monospace "monospace"]]
+   [(def .public font
+      (-> Text Font)
+      (|>> %.text abstraction))
+
+    (def .public (font_family options)
+      (-> (List Font) (Value Font))
+      (when options
+        {.#Item _}
+        (|> options
+            (list#each ..font_name)
+            (text.interposed ",")
+            (abstraction Value))
+        
+        {.#End}
+        ..initial))])
+
+  (def .public font_size
+    (-> (Value Length)
+        (Value Font_Size))
+    (|>> transmutation))
+
+  (def .public number
+    (-> Frac
+        (Value Number))
+    (|>> %number abstraction))
+
+  (def .public grid
+    (-> Label
+        (Value Grid))
+    (|>> abstraction))
+
+  (def .public fit_content
+    (-> (Value Length)
+        (Value Grid_Content))
+    (|>> representation (list) (..apply "fit-content")))
+
+  (def .public (min_max min max)
+    (-> (Value Grid_Content) (Value Grid_Content)
+        (Value Grid_Content))
+    (..apply "minmax" (list (representation min)
+                            (representation max))))
+
+  (def .public grid_span
+    (-> Nat
+        (Value Grid_Span))
+    (|>> %.nat (format "span ") abstraction))
+
+  (def grid_column_separator " ")
+  (def grid_row_separator " ")
+
+  (def .public grid_template
+    (-> (List (List (Maybe (Value Grid))))
+        (Value Grid_Template))
+    (let [empty (is (Value Grid)
+                    (abstraction "."))]
+      (|>> (list#each (|>> (list#each (|>> (maybe.else empty)
+                                           representation))
+                           (text.interposed ..grid_column_separator)
+                           (text.enclosed ["'" "'"])))
+           (text.interposed ..grid_row_separator)
+           abstraction)))
+
+  (def .public (resolution dpi)
+    (-> Nat
+        (Value Resolution))
+    (abstraction (format (%.nat dpi) "dpi")))
+
+  (def .public (ratio numerator denominator)
+    (-> Nat Nat
+        (Value Ratio))
+    (abstraction (format (%.nat numerator) "/" (%.nat denominator))))
+
+  (enumeration
+   Quote
+   Text
+   quote_text
+   [[double_quote "\0022"]
+    [single_quote "\0027"]
+    [single_left_angle_quote "\2039"]
+    [single_right_angle_quote "\203A"]
+    [double_left_angle_quote "\00AB"]
+    [double_right_angle_quote "\00BB"]
+    [single_left_quote "\2018"]
+    [single_right_quote "\2019"]
+    [double_left_quote "\201C"]
+    [double_right_quote "\201D"]
+    [low_double_quote "\201E"]]
+   [(def .public quote
+      (-> Text Quote)
+      (|>> abstraction))])
+
+  (def quote_separator " ")
+
+  (def .public (quotes [left0 right0] [left1 right1])
+    (-> [Quote Quote] [Quote Quote]
+        (Value Quotes))
+    (|> (list left0 right0 left1 right1)
+        (list#each (|>> ..quote_text %.text))
+        (text.interposed ..quote_separator)
+        abstraction))
+
+  (def .public (matrix_2d [a b] [c d] [tx ty])
+    (-> [Frac Frac]
+        [Frac Frac]
+        [Frac Frac]
+        (Value Transform))
+    (|> (list a b c d tx ty)
+        (list#each %number)
+        (..apply "matrix")))
+
+  (def .public (matrix_3d [a0 b0 c0 d0] [a1 b1 c1 d1] [a2 b2 c2 d2] [a3 b3 c3 d3])
+    (-> [Frac Frac Frac Frac]
+        [Frac Frac Frac Frac]
+        [Frac Frac Frac Frac]
+        [Frac Frac Frac Frac]
+        (Value Transform))
+    (|> (list a0 b0 c0 d0 a1 b1 c1 d1 a2 b2 c2 d2 a3 b3 c3 d3)
+        (list#each %number)
+        (..apply "matrix3d")))
+
+  (with_template [   ]
+    [(`` (def .public ( [(,, (template.spliced ))])
+           (-> [(,, (template.spliced ))]
+               (Value Transform))
+           (|> (list (,, (template.spliced )))
+               (list#each %number)
+               (..apply ))))]
+
+    [translate_2d "translate" [Frac Frac] [x y]]
+    [translate_3d "translate3d" [Frac Frac Frac] [x y z]]
+    [translate_x "translateX" [Frac] [value]]
+    [translate_y "translateY" [Frac] [value]]
+    [translate_z "translateZ" [Frac] [value]]
+
+    [scale_2d "scale" [Frac Frac] [x y]]
+    [scale_3d "scale3d" [Frac Frac Frac] [x y z]]
+    [scale_x "scaleX" [Frac] [value]]
+    [scale_y "scaleY" [Frac] [value]]
+    [scale_z "scaleZ" [Frac] [value]]
+
+    [perspective "perspective" [Frac] [value]]
+    )
+
+  (with_template [   ]
+    [(`` (def .public ( [(,, (template.spliced ))])
+           (-> [(,, (template.spliced ))]
+               (Value Transform))
+           (|> (list (,, (template.spliced )))
+               (list#each ..angle)
+               (..apply ))))]
+
+    [rotate_2d "rotate" [Angle] [angle]]
+    [rotate_x "rotateX" [Angle] [angle]]
+    [rotate_y "rotateY" [Angle] [angle]]
+    [rotate_z "rotateZ" [Angle] [angle]]
+
+    [skew "skew" [Angle Angle] [x_angle y_angle]]
+    [skew_x "skewX" [Angle] [angle]]
+    [skew_y "skewY" [Angle] [angle]]
+    )
+
+  (def .public (rotate_3d [x y z angle])
+    (-> [Frac Frac Frac Angle]
+        (Value Transform))
+    (..apply "rotate3d"
+             (list (%number x) (%number y) (%number z) (..angle angle))))
+
+  (def origin_separator " ")
+
+  (def .public (origin_2d x y)
+    (-> (Value Length) (Value Length)
+        (Value Transform_Origin))
+    (abstraction (format (representation x) ..origin_separator
+                         (representation y))))
+
+  (def .public (origin_3d x y z)
+    (-> (Value Length) (Value Length) (Value Length)
+        (Value Transform_Origin))
+    (abstraction (format (representation x) ..origin_separator
+                         (representation y) ..origin_separator
+                         (representation z))))
+
+  (def .public vertical_align
+    (-> (Value Length)
+        (Value Vertical_Align))
+    (|>> transmutation))
+
+  (def .public (z_index index)
+    (-> Int
+        (Value Z_Index))
+    (abstraction (if (i.< +0 index)
+                   (%.int index)
+                   (%.nat (.nat index)))))
+
+  (with_template [  ]
+    [(def .public ( pre post)
+       (-> (Value ) (Value )
+           (Value ))
+       (abstraction (format (representation pre)
+                            
+                            (representation post))))]
+
+    ["," Image multi_image]
+    ["," Shadow multi_shadow]
+    [" " Content multi_content]
+    )
+
+  ... https://developer.mozilla.org/en-US/docs/Web/CSS/calc()
+  (with_template [ ]
+    [(def .public ( parameter subject)
+       (.All (_ kind)
+         (-> (Value ) (Value (Numeric kind))
+             (Value (Numeric kind))))
+       (|> (format (representation subject)
+                   (template.text [" "  " "])
+                   (representation parameter))
+           (text.enclosed ["calc(" ")"])
+           abstraction))]
+
+    [+ (Numeric kind)]
+    [- (Numeric kind)]
+    [* Number]
+    [/ Number]
+    )
+  )
diff --git a/stdlib/source/library/lux/web/html.lux b/stdlib/source/library/lux/web/html.lux
new file mode 100644
index 000000000..a9191443c
--- /dev/null
+++ b/stdlib/source/library/lux/web/html.lux
@@ -0,0 +1,581 @@
+(.require
+ [library
+  [lux (.except Tag Meta Source comment and template open parameter)
+   [control
+    ["[0]" function]
+    ["[0]" maybe (.use "[1]#[0]" functor)]]
+   [data
+    ["[0]" product]
+    ["[0]" text (.only)
+     ["%" \\format (.only Format format)]]
+    [collection
+     ["[0]" list (.use "[1]#[0]" functor mix)]]
+    [format
+     ["[0]" xml (.only XML)]]]
+   [meta
+    [macro
+     ["[0]" template]]
+    [target
+     ["[0]" js]]
+    [type
+     ["[0]" nominal (.except def)]]]
+   [world
+    [net (.only URL)]]]]
+ [//
+  ["[0]" css
+   ["[0]" selector]
+   ["[0]" style (.only Style)]
+   ["[1]/[0]" id]
+   ["[1]/[0]" class]]])
+
+(type .public Tag selector.Tag)
+(type .public ID css/id.ID)
+(type .public Class css/class.Class)
+
+... Attributes for an HTML tag.
+(type .public Attributes
+  (List [Text Text]))
+
+(def .public empty
+  Attributes
+  (list))
+
+(type .public Script
+  js.Statement)
+
+(type .public Target
+  (Variant
+   {#Blank}
+   {#Parent}
+   {#Self}
+   {#Top}
+   {#Frame Text}))
+
+(def (target value)
+  (-> Target Text)
+  (when value
+    {#Blank} "_blank"
+    {#Parent} "_parent"
+    {#Self} "_self"
+    {#Top} "_top"
+    {#Frame name} name))
+
+... Properly formats text to ensure no injection can happen on the HTML.
+(def safe
+  (-> Text Text)
+  (|>> (text.replaced "&" "&")
+       (text.replaced "<" "<")
+       (text.replaced ">" ">")
+       (text.replaced text.double_quote """)
+       (text.replaced "'" "'")
+       (text.replaced "/" "/")))
+
+(def attributes
+  (-> Attributes Text)
+  (|>> (list#each (function (_ [key val])
+                    (format " " key "=" text.double_quote (..safe val) text.double_quote)))
+       text.together))
+
+(def (open tag attributes)
+  (-> Tag Attributes Text)
+  (|> attributes
+      ..attributes
+      (format tag)
+      (text.enclosed ["<" ">"])))
+
+(def close
+  (-> Tag Text)
+  (text.enclosed [""]))
+
+(nominal.def .public (HTML brand)
+  Text
+
+  (.with_template [ ]
+    [(nominal.def  Any)
+     (type .public  (HTML ))]
+
+    [Meta Meta']
+    [Head Head']
+    [Item Item']
+    [Option Option']
+    [Input Input']
+    [Cell Cell']
+    [Header Header']
+    [Row Row']
+    [Column Column']
+    [Parameter Parameter']
+    [Body Body']
+    [Document Document']
+    )
+
+  (.with_template [  +]
+    [(nominal.def ( brand) Any)
+     (type .public  (HTML ( Any)))
+
+     (`` (.with_template [ ]
+           [(nominal.def  Any)
+            (type .public  (HTML ( )))]
+
+           (,, (template.spliced +))))]
+
+    [Element Element'
+     [[Content Content']
+      [Image Image']]]
+
+    [Media Media'
+     [[Source Source']
+      [Track Track']]]
+    )
+
+  (def .public html
+    (-> Document Text)
+    (|>> representation))
+
+  (def .public (and pre post)
+    (All (_ brand) (-> (HTML brand) (HTML brand) (HTML brand)))
+    (abstraction (format (representation pre) (representation post))))
+
+  (def .public (comment content node)
+    (All (_ brand) (-> Text (HTML brand) (HTML brand)))
+    (abstraction
+     (format (text.enclosed [""] content)
+             (representation node))))
+
+  (def (empty_tag name attributes)
+    (-> Tag Attributes HTML)
+    (abstraction
+     (format (..open name attributes)
+             (..close name))))
+
+  (def (simple tag attributes)
+    (-> Tag Attributes HTML)
+    (|> attributes
+        (..open tag)
+        abstraction))
+
+  (def (tag name attributes content)
+    (-> Tag Attributes (HTML Any) HTML)
+    (abstraction
+     (format (..open name attributes)
+             (representation content)
+             (..close name))))
+
+  (def (raw tag attributes content)
+    (-> Text Attributes Text HTML)
+    (abstraction
+     (format (..open tag attributes)
+             content
+             (..close tag))))
+
+  (.with_template [  ]
+    [(def .public 
+       (-> Attributes )
+       (..simple ))]
+
+    [link "link" Meta]
+    [meta "meta" Meta]
+    [input "input" Input]
+    [embedded "embed" Element]
+    [column "col" Column]
+    [parameter "param" Parameter]
+    )
+
+  (def .public (base href target)
+    (-> URL (Maybe Target) Meta)
+    (let [partial (list ["href" href])
+          full (when target
+                 {.#Some target}
+                 (list.partial ["target" (..target target)] partial)
+                 
+                 {.#None}
+                 partial)]
+      (..simple "base" full)))
+
+  (def .public style
+    (-> Style Meta)
+    (|>> style.inline (..raw "style" (list))))
+
+  (def .public (script attributes inline)
+    (-> Attributes (Maybe Script) Meta)
+    (|> inline
+        (maybe#each js.code)
+        (maybe.else "")
+        (..raw "script" attributes)))
+
+  (def .public text
+    (-> Text Content)
+    (|>> ..safe
+         abstraction))
+
+  (.with_template [  ]
+    [(def .public 
+       Element
+       (..simple  (list)))
+
+     (def .public  )]
+    ["br"  br  line_break]
+    ["wbr" wbr word_break]
+    ["hr"  hr  separator]
+    )
+
+  (def .public (image source attributes)
+    (-> URL Attributes Image)
+    (|> attributes
+        {.#Item ["src" source]}
+        (..simple "img")))
+
+  (def .public (svg attributes content)
+    (-> Attributes XML Element)
+    (|> content
+        (of xml.codec encoded)
+        (..raw "svg" attributes)))
+
+  (type .public Coord
+    (Record
+     [#horizontal Nat
+      #vertical Nat]))
+
+  (def metric_separator ",")
+  (def coord_separator ",")
+
+  (def (%coord [horizontal vertical])
+    (Format Coord)
+    (format (%.nat horizontal) ..metric_separator (%.nat vertical)))
+  
+  (type .public Rectangle
+    (Record
+     [#start Coord
+      #end Coord]))
+
+  (type .public Circle
+    (Record
+     [#center Coord
+      #radius Nat]))
+
+  (type .public Polygon
+    (Record
+     [#first Coord
+      #second Coord
+      #third Coord
+      #extra (List Coord)]))
+
+  (def (%rectangle [start end])
+    (Format Rectangle)
+    (format (%coord start) ..coord_separator (%coord end)))
+
+  (def (%circle [center radius])
+    (Format Circle)
+    (format (%coord center) ..metric_separator (%.nat radius)))
+
+  (def (%polygon [first second third extra])
+    (Format Polygon)
+    (|> (list.partial first second third extra)
+        (list#each %coord)
+        (text.interposed ..coord_separator)))
+  
+  (type .public Shape
+    (Variant
+     {#Rectangle Rectangle}
+     {#Circle Circle}
+     {#Polygon Polygon}))
+
+  (.with_template [   ]
+    [(def ( attributes shape)
+       (-> Attributes  (HTML Any))
+       (..simple "area" (list.partial ["shape" ]
+                                      ["coords" ( shape)]
+                                      attributes)))]
+
+    [rectangle "rect" Rectangle ..%rectangle]
+    [circle "circle" Circle ..%circle]
+    [polygon "poly" Polygon ..%polygon]
+    )
+  
+  (def (area attributes shape)
+    (-> Attributes Shape (HTML Any))
+    (when shape
+      {#Rectangle rectangle}
+      (..rectangle attributes rectangle)
+      
+      {#Circle circle}
+      (..circle attributes circle)
+      
+      {#Polygon polygon}
+      (..polygon attributes polygon)))
+
+  (def .public (each attributes areas for)
+    (-> Attributes (List [Attributes Shape]) Image Image)
+    (all ..and
+         for
+         (when (list#each (product.uncurried ..area) areas)
+           {.#End}
+           (..empty_tag "map" attributes)
+           
+           {.#Item head tail}
+           (..tag "map" attributes
+                  (list#mix (function.flipped ..and) head tail)))))
+
+  (.with_template [  ]
+    [(def .public 
+       (-> Attributes )
+       (..empty_tag ))]
+
+    [canvas "canvas" Element]
+    [progress "progress" Element]
+    [output "output" Input]
+    [source "source" Source]
+    [track "track" Track]
+    )
+
+  (.with_template [ ]
+    [(def .public ( attributes media on_unsupported)
+       (-> Attributes Media (Maybe Content) Element)
+       (..tag  attributes
+              (|> on_unsupported
+                  (maybe.else (..text ""))
+                  (..and media))))]
+
+    [audio "audio"]
+    [video "video"]
+    )
+
+  (def .public (picture attributes sources image)
+    (-> Attributes Source Image Element)
+    (..tag "picture" attributes (..and sources image)))
+
+  (def .public (anchor href attributes content)
+    (-> URL Attributes Element Element)
+    (..tag "a" (list.partial ["href" href] attributes) content))
+
+  (def .public label
+    (-> ID Input)
+    (|>> css/id.id ["for"] list (..empty_tag "label")))
+
+  (.with_template [   ]
+    [(def .public ( description attributes content)
+       (-> (Maybe Content) Attributes  )
+       (..tag  attributes
+              (when description
+                {.#Some description}
+                (all ..and
+                     (..tag  (list) description)
+                     content)
+                
+                {.#None}
+                content)))]
+
+    [details "details" "summary" Element]
+    [field_set "fieldset" "legend" Input]
+    [figure "figure" "figcaption" Element]
+    )
+
+  (.with_template [  ]
+    [(def .public ( attributes content)
+       (-> Attributes (Maybe Content) )
+       (|> content
+           (maybe.else (..text ""))
+           (..tag  attributes)))]
+
+    [text_area "textarea" Input]
+    [iframe "iframe" Element]
+    )
+
+  (type .public Phrase
+    (-> Attributes Content Element))
+
+  (.with_template [ ]
+    [(def .public 
+       Phrase
+       (..tag ))]
+
+    [abbrebiation "abbr"]
+    [block_quote "blockquote"]
+    [bold "b"]
+    [cite "cite"]
+    [code "code"]
+    [definition "dfn"]
+    [deleted "del"]
+    [emphasized "em"]
+    [h1 "h1"]
+    [h2 "h2"]
+    [h3 "h3"]
+    [h4 "h4"]
+    [h5 "h5"]
+    [h6 "h6"]
+    [inserted "ins"]
+    [italic "i"]
+    [keyboard "kbd"]
+    [marked "mark"]
+    [meter "meter"]
+    [pre "pre"]
+    [quote "q"]
+    [sample "samp"]
+    [struck "s"]
+    [small "small"]
+    [sub "sub"]
+    [super "sup"]
+    [strong "strong"]
+    [time "time"]
+    [underlined "u"]
+    [variable "var"]
+    )
+
+  (def .public incorrect ..struck)
+
+  (def (ruby_pronunciation pronunciation)
+    (-> Content (HTML Any))
+    (..tag "rt" (list)
+           (all ..and
+                (..tag "rp" (list) (..text "("))
+                pronunciation
+                (..tag "rp" (list) (..text ")")))))
+
+  (def .public (ruby attributes content pronunciation)
+    (-> Attributes Content Content Element)
+    (..tag "ruby" attributes
+           (all ..and
+                content
+                (ruby_pronunciation pronunciation))))
+
+  (type .public Composite
+    (-> Attributes Element Element))
+
+  (.with_template [ ]
+    [(def .public 
+       Composite
+       (..tag ))]
+
+    [article "article"]
+    [aside "aside"]
+    [dialog "dialog"]
+    [div "div"]
+    [footer "footer"]
+    [header "header"]
+    [main "main"]
+    [navigation "nav"]
+    [paragraph "p"]
+    [section "section"]
+    [span "span"]
+    )
+
+  (.with_template [  ]
+    [(def 
+       (->  (HTML Any))
+       (..tag  (list)))]
+
+    ["dt" term Content]
+    ["dd" description Element]
+    )
+
+  (def .public (description_list attributes descriptions)
+    (-> Attributes (List [Content Element]) Element)
+    (when (list#each (function (_ [term description])
+                       (all ..and
+                            (..term term)
+                            (..description description)))
+                     descriptions)
+      {.#End}
+      (..empty_tag "dl" attributes)
+      
+      {.#Item head tail}
+      (..tag "dl" attributes
+             (list#mix (function.flipped ..and) head tail))))
+
+  (def .public p ..paragraph)
+
+  (.with_template [   ]
+    [(def .public 
+       (-> Attributes  )
+       (..tag ))]
+
+    [button "button" Element Input]
+    [item "li" Element Item]
+    [ordered_list "ol" Item Element]
+    [unordered_list "ul" Item Element]
+    [option "option" Content Option]
+    [option_group "optgroup" Option Option]
+    [data_list "datalist" Option Element]
+    [select "select" Option Input]
+    [address "address" Element Element]
+    [form "form" Input Element]
+    [data "data" Element Element]
+    [object "object" Parameter Element]
+    )
+
+  (.with_template [   ]
+    [(def .public 
+       (->  )
+       (..tag  (list)))]
+
+    [title "title" Content Meta]
+    [no_script "noscript" Content Meta]
+    [template "template" (HTML Any) (HTML Nothing)]
+    [table_header "th" Element Header]
+    [table_cell "td" Element Cell]
+    [head "head" Meta Head]
+    [body "body" Element Body]
+    )
+
+  (.with_template [   ]
+    [(def 
+       (->  )
+       (..tag  (list)))]
+
+    [table_row "tr" (HTML Any) Row]
+    [table_head "thead" Row HTML]
+    [table_body "tbody" Row HTML]
+    [table_foot "tfoot" Row HTML]
+    [columns_group "colgroup" Column HTML]
+    )
+
+  (def .public (table attributes caption columns headers rows footer)
+    (-> Attributes (Maybe Content) (Maybe Column) Header (List Cell) (Maybe Cell) Element)
+    (let [head (..table_head (..table_row headers))
+          content (when (list#each table_row rows)
+                    {.#End}
+                    head
+
+                    {.#Item first rest}
+                    (..and head
+                           (..table_body
+                            (list#mix (function.flipped ..and) first rest))))
+          content (when footer
+                    {.#None}
+                    content
+                    
+                    {.#Some footer}
+                    (..and content
+                           (..table_foot (..table_row footer))))
+          content (when columns
+                    {.#None}
+                    content
+                    
+                    {.#Some columns}
+                    (..and (..columns_group columns)
+                           content))
+          content (when caption
+                    {.#None}
+                    content
+
+                    {.#Some caption}
+                    (..and (as HTML caption)
+                           content))]
+      (..tag "table" attributes
+             content)))
+
+  (.with_template [ ]
+    [(def .public 
+       (-> Head Body Document)
+       (let [doc_type ]
+         (function (_ head body)
+           (|> (..tag "html" (list) (..and head body))
+               representation
+               (format doc_type)
+               abstraction))))]
+
+    [html/5    ""]
+    [html/4_01 (format "")]
+    [xhtml/1_0 (format "")]
+    [xhtml/1_1 (format "")]
+    )
+  )
diff --git a/stdlib/source/library/lux/world/net/http/response.lux b/stdlib/source/library/lux/world/net/http/response.lux
index 1c8cef67c..93bd80ac8 100644
--- a/stdlib/source/library/lux/world/net/http/response.lux
+++ b/stdlib/source/library/lux/world/net/http/response.lux
@@ -13,9 +13,10 @@
      [encoding
       ["[0]" utf8]]]
     [format
-     ["[0]" html]
-     ["[0]" css (.only CSS)]
-     ["[0]" json (.only JSON) (.use "[1]#[0]" codec)]]]]]
+     ["[0]" json (.only JSON) (.use "[1]#[0]" codec)]]]
+   [web
+    ["[0]" html]
+    ["[0]" css (.only CSS)]]]]
  ["[0]" // (.only Body Message)
   ["[0]" status (.only Status)]
   ["[0]" header]
diff --git a/stdlib/source/library/lux/world/time/series.lux b/stdlib/source/library/lux/world/time/series.lux
index c529f6636..debbe884a 100644
--- a/stdlib/source/library/lux/world/time/series.lux
+++ b/stdlib/source/library/lux/world/time/series.lux
@@ -4,121 +4,126 @@
    [abstract
     [equivalence (.only Equivalence)]
     [functor (.only Functor)]
-    [mix (.only Mix)]]
+    [mix (.only Mix)]
+    [monad (.only do)]]
    [control
     ["[0]" try (.only Try)]
     ["[0]" exception (.only Exception)]]
    [data
+    ["[0]" product]
     [text
      ["%" \\format]]
     [collection
-     ["[0]" array (.only Array) (.use "[1]#[0]" functor mix)
-      ["/" \\unsafe]]]]
+     ["/" sequence (.use "[1]#[0]" functor mix)]]]
+   [math
+    [number
+     ["n" nat]]]
    [meta
-    [type
-     ["[0]" nominal]]]]]
+    [type (.only sharing)]]]]
  [//
+  ["[0]" duration (.only Duration) (.use "[1]#[0]" equivalence)]
   ["[0]" instant (.only Instant) (.use "[1]#[0]" order)]])
 
-(type .public (Event of)
+(type .public (Series of)
   (Record
-   [#when Instant
-    #what of]))
+   [#start Instant
+    #interval Duration
+    #data (/.Sequence of)]))
 
-(def (event_equivalence super)
+(def .public (equivalence super)
   (All (_ of)
     (-> (Equivalence of)
-        (Equivalence (Event of))))
+        (Equivalence (Series of))))
+  (all product.equivalence
+       instant.equivalence
+       duration.equivalence
+       (/.equivalence super)
+       ))
+
+(def .public functor
+  (Functor Series)
   (implementation
-   (def (= reference example)
-     (and (instant#= (the #when reference) (the #when example))
-          (of super = (the #what reference) (the #what example))))))
+   (def (each $)
+     (|>> (revised #data (/#each $))))))
 
-(nominal.def .public (Series of)
-  (Array (Event of))
+(def .public mix
+  (Mix Series)
+  (implementation
+   (def (mix $ init)
+     (|>> (the #data)
+          (/#mix $ init)))))
 
-  (def .public (equivalence super)
-    (All (_ of)
-      (-> (Equivalence of)
-          (Equivalence (Series of))))
-    (implementation
-     (def (= reference example)
-       (of (array.equivalence (event_equivalence super)) =
-           (nominal.representation reference)
-           (nominal.representation example)))))
+(def .public size
+  (All (_ of)
+    (-> (Series of)
+        Nat))
+  (|>> (the #data)
+       /.size))
 
-  (def .public functor
-    (Functor Series)
-    (implementation
-     (def (each $)
-       (|>> nominal.representation
-            (array#each (revised #what $))
-            nominal.abstraction))))
+(def .public start
+  (All (_ of)
+    (-> (Series of)
+        Instant))
+  (the #start))
 
-  (def .public mix
-    (Mix Series)
-    (implementation
-     (def (mix $ init)
-       (|>> nominal.representation
-            (array#mix (function (_ next it)
-                         ($ (the #what next) it))
-                       init)))))
+(def .public (end it)
+  (All (_ of)
+    (-> (Series of)
+        Instant))
+  (instant.after (duration.up (-- (/.size (the #data it)))
+                              (the #interval it))
+                 (the #start it)))
 
-  (exception.def .public (disordered [before after])
-    (Exception [Instant Instant])
-    (exception.report
-     (list ["(Expected) before" (%.instant before)]
-           ["(Expected) after" (%.instant after)])))
+(def .public (at event it)
+  (All (_ of)
+    (-> Nat (Series of)
+        Instant))
+  (instant.after (duration.up event (the #interval it))
+                 (the #start it)))
 
-  (exception.def .public (duplicated it)
-    (Exception Instant)
-    (exception.report
-     (list ["Time-stamp" (%.instant it)])))
+(exception.def .public empty)
 
-  (def .public (series it)
-    (All (_ of)
-      (-> (List (Event of))
-          (Try (Series of))))
-    (when it
-      {.#Item head tail}
-      (loop (again [previous head
-                    it tail])
-        (when it
-          {.#Item current next}
-          (if (instant#< (the #when current) (the #when previous))
-            (again current next)
-            (if (instant#= (the #when current) (the #when previous))
-              (exception.except ..duplicated [(the #when current)])
-              (exception.except ..disordered [(the #when previous) (the #when current)])))
-          
-          {.#End}
-          {try.#Success (nominal.abstraction
-                         (array.of_list it))}))
-      
-      {.#End}
-      {try.#Success (nominal.abstraction
-                     (array.empty 0))}))
+(with_template [ ]
+  [(def .public ( it)
+     (All (_ of)
+       (-> (Series of)
+           (Try of)))
+     (let [data (the #data it)]
+       (when (/.size data)
+         0 (exception.except ..empty [])
+         @ (/.item  data))))]
 
-  (def .public size
-    (All (_ of)
-      (-> (Series of)
-          Nat))
-    (|>> nominal.representation
-         /.size))
+  [(|> 0) earliest]
+  [(-- @) latest]
+  )
 
-  (exception.def .public empty)
-  
-  (with_template [ ]
-    [(def .public ( it)
-       (All (_ of)
-         (-> (Series of)
-             (Try (Event of))))
-       (let [it (nominal.representation it)]
-         (when (array.size it)
-           0 (exception.except ..empty [])
-           @ {try.#Success (/.item  it)})))]
+(exception.def .public (window_goes_out_of_bounds [offset size max_size])
+  (Exception [Nat Nat Nat])
+  (exception.report
+   (list ["From" (%.nat offset)]
+         ["To" (%.nat (n.+ offset size))]
+         ["Maximum" (%.nat max_size)])))
 
-    [earliest 0]
-    [latest (-- @)]
-    )
-  )
+(def .public (window offset size it)
+  (All (_ of)
+    (-> Nat Nat (Series of)
+        (Try (Series of))))
+  (if (n.< (n.+ offset size)
+           (..size it))
+    (exception.except ..window_goes_out_of_bounds [offset size (..size it)])
+    (let [input (the #data it)]
+      (loop (again [item 0
+                    output (sharing [of]
+                             (is (/.Sequence of)
+                                 input)
+                             (is (/.Sequence of)
+                                 /.empty))])
+        (if (n.< size item)
+          (do try.monad
+            [it (/.item (n.+ offset item) input)]
+            (again (++ item) (/.suffix it output)))
+          {try.#Success (let [interval (the #interval it)]
+                          [#start (instant.after (duration.up offset interval)
+                                                 (the #start it))
+                           #interval interval
+                           #data output])})))))
diff --git a/stdlib/source/library/lux/world/time/series/average.lux b/stdlib/source/library/lux/world/time/series/average.lux
new file mode 100644
index 000000000..553cfee7f
--- /dev/null
+++ b/stdlib/source/library/lux/world/time/series/average.lux
@@ -0,0 +1,129 @@
+(.require
+ [library
+  [lux (.except)
+   [abstract
+    [monad (.only do)]]
+   [control
+    ["[0]" try (.only Try)]
+    ["[0]" exception (.only Exception)]]
+   [data
+    ["[0]" product]
+    [text
+     ["%" \\format]]
+    [collection
+     ["[0]" sequence (.only Sequence) (.use "[1]#[0]" mix functor)]]]
+   [math
+    [number
+     ["n" nat]
+     ["f" frac]]]
+   [meta
+    [type (.only sharing)]]]]
+ ["[0]" // (.only Series) (.use "[1]#[0]" mix)])
+
+... https://en.wikipedia.org/wiki/Moving_average#Cumulative_average
+(def .public cumulative
+  (-> (Series Frac)
+      (Series Frac))
+  (revised //.#data
+           (|>> (sequence#mix (function (_ event [[previous_summation previous_period] output])
+                                (let [summation (f.+ previous_summation event)
+                                      average (f./ previous_period summation)]
+                                  [[summation (f.+ +1.0 previous_period)]
+                                   (sequence.suffix average output)]))
+                              [[+0.0 +1.0] (is (Sequence Frac)
+                                               sequence.empty)])
+                product.right)))
+
+(exception.def .public (window_size_is_too_large [maximum actual])
+  (Exception [Nat Nat])
+  (exception.report
+   (list ["Maximum" (%.nat maximum)]
+         ["Actual" (%.nat actual)])))
+
+(def .public (windows size it)
+  (All (_ of)
+    (-> Nat (Series of)
+        (Try (Series (Series of)))))
+  (let [maximum (//.size it)]
+    (if (n.< size maximum)
+      (exception.except ..window_size_is_too_large [maximum size])
+      (let [limit (n.- size maximum)]
+        (loop (again [offset 0
+                      output (sharing [of]
+                               (is (Series of)
+                                   it)
+                               (is (Sequence (Series of))
+                                   sequence.empty))])
+          (if (n.< limit offset)
+            (do try.monad
+              [current (//.window offset size it)]
+              (again (++ offset)
+                     (sequence.suffix current output)))
+            {try.#Success (has //.#data output it)}))))))
+
+(type .public (Average of)
+  (-> (Series of)
+      of))
+
+... https://en.wikipedia.org/wiki/Moving_average
+(def .public (moving average additional it)
+  (All (_ of)
+    (-> (Average of) Nat (Series of)
+        (Try (Series of))))
+  (do try.monad
+    [.let [size (++ additional)]
+     it (windows size it)]
+    (in (|> it
+            (revised //.#data (sequence#each average))
+            (has //.#start (//.at size it))))))
+
+... https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average
+... https://en.wikipedia.org/wiki/Exponential_smoothing
+(type .public Factor
+  (-> Nat
+      Frac))
+
+(def .public (simple_factor additional)
+  Factor
+  (f./ (n.frac (n.+ 2 additional))
+       +2.0))
+
+(def .public (exponential factor)
+  (-> Factor
+      (Average Frac))
+  (function (_ it)
+    (let [factor (factor (//.size it))
+          ~factor (f.- factor +1.0)]
+      (//#mix (is (-> Frac Frac
+                      Frac)
+                  (function (_ event previous)
+                    (f.+ (f.* ~factor previous)
+                         (f.* factor event))))
+              +0.0
+              it))))
+
+... https://en.wikipedia.org/wiki/Moving_average#Simple_moving_average
+(def .public (simple it)
+  (Average Frac)
+  (|> (the //.#data it)
+      (sequence#mix f.+ +0.0)
+      (f./ (n.frac (//.size it)))))
+
+... https://en.wikipedia.org/wiki/Triangular_number
+(def (summation_up_to maximum)
+  (-> Nat
+      Nat)
+  (|> maximum
+      (n.* (++ maximum))
+      (n./ 2)))
+
+... https://en.wikipedia.org/wiki/Moving_average#Weighted_moving_average
+(def .public (weighted it)
+  (Average Frac)
+  (|> it
+      (//#mix (function (_ sample [weight summation])
+                [(f.+ +1.0 weight)
+                 (|> sample (f.* weight) (f.+ summation))])
+              [+1.0 +0.0])
+      product.right
+      (f./ (n.frac (summation_up_to (-- (//.size it)))))))
diff --git a/stdlib/source/test/lux/data/collection/sequence.lux b/stdlib/source/test/lux/data/collection/sequence.lux
index 8a38c3a98..ad34204aa 100644
--- a/stdlib/source/test/lux/data/collection/sequence.lux
+++ b/stdlib/source/test/lux/data/collection/sequence.lux
@@ -134,7 +134,8 @@
 (def .public test
   Test
   (<| (_.covering /._)
-      (_.for [/.Sequence])
+      (_.for [/.Sequence
+              /.#level /.#size /.#root /.#tail])
       (do [! random.monad]
         [size (of ! each (|>> (n.% 100) ++) random.nat)]
         (all _.and
@@ -191,6 +192,23 @@
                         (and (/.every? n.even? positives)
                              (not (/.any? n.even? negatives))
 
+                             (n.= (/.size sample)
+                                  (n.+ (/.size positives)
+                                       (/.size negatives))))))
+                    (_.coverage [/.all]
+                      (let [positives (/.all (function (_ it)
+                                               (if (n.even? it)
+                                                 {.#Some it}
+                                                 {.#None}))
+                                             sample)
+                            negatives (/.all (function (_ it)
+                                               (if (not (n.even? it))
+                                                 {.#Some it}
+                                                 {.#None}))
+                                             sample)]
+                        (and (/.every? n.even? positives)
+                             (not (/.any? n.even? negatives))
+
                              (n.= (/.size sample)
                                   (n.+ (/.size positives)
                                        (/.size negatives))))))
diff --git a/stdlib/source/test/lux/data/color.lux b/stdlib/source/test/lux/data/color.lux
index 5d94addef..c72ee2c1f 100644
--- a/stdlib/source/test/lux/data/color.lux
+++ b/stdlib/source/test/lux/data/color.lux
@@ -56,13 +56,13 @@
 
 (def (distance/3 from to)
   (-> /.Color /.Color Frac)
-  (let [[fr fg fb] (/.rgb from)
-        [tr tg tb] (/.rgb to)]
+  (let [from (/.rgb from)
+        to (/.rgb to)]
     (square_root
      (all f.+
-          (|> (scale (rgb.number tr)) (f.- (scale (rgb.number fr))) square)
-          (|> (scale (rgb.number tg)) (f.- (scale (rgb.number fg))) square)
-          (|> (scale (rgb.number tb)) (f.- (scale (rgb.number fb))) square)))))
+          (|> (scale (rgb.red to)) (f.- (scale (rgb.red from))) square)
+          (|> (scale (rgb.green to)) (f.- (scale (rgb.green from))) square)
+          (|> (scale (rgb.blue to)) (f.- (scale (rgb.blue from))) square)))))
 
 (def rgb_error_margin
   +1.8)
diff --git a/stdlib/source/test/lux/data/color/pigment.lux b/stdlib/source/test/lux/data/color/pigment.lux
index b1798e438..d3ef54029 100644
--- a/stdlib/source/test/lux/data/color/pigment.lux
+++ b/stdlib/source/test/lux/data/color/pigment.lux
@@ -17,7 +17,8 @@
   (<| (_.covering /._)
       (do [! random.monad]
         [alpha random.rev])
-      (_.for [/.Alpha /.Pigment])
+      (_.for [/.Alpha /.Pigment
+              /.#color /.#alpha])
       (all _.and
            (_.coverage [/.transparent]
              (and (not (r.< /.transparent alpha))
diff --git a/stdlib/source/test/lux/data/color/rgb.lux b/stdlib/source/test/lux/data/color/rgb.lux
index a1899e63c..5c81582eb 100644
--- a/stdlib/source/test/lux/data/color/rgb.lux
+++ b/stdlib/source/test/lux/data/color/rgb.lux
@@ -21,10 +21,8 @@
 
 (def .public value
   (Random /.Value)
-  (random.one (|>> (n.% /.limit)
-                   /.value
-                   try.maybe)
-              random.nat))
+  (random#each (|>> (n.% /.limit) /.value)
+               random.nat))
 
 (def .public random
   (Random /.RGB)
@@ -32,51 +30,42 @@
     [red ..value
      green ..value
      blue ..value]
-    (in [/.#red red
-         /.#green green
-         /.#blue blue])))
+    (in (/.rgb red green blue))))
 
 (def .public test
   Test
   (<| (_.covering /._)
       (do [! random.monad]
         [expected_value ..value
-         expected ..random])
+         expected ..random
+
+         expected_red ..value
+         expected_green ..value
+         expected_blue ..value])
       (all _.and
            (_.for [/.Value]
                   (all _.and
-                       (_.coverage [/.number /.value]
+                       (_.coverage [/.least]
+                         (n.>= /.least
+                               expected_value))
+                       (_.coverage [/.most]
+                         (n.<= /.most
+                               expected_value))
+                       (_.coverage [/.value?]
+                         (and (/.value? expected_value)
+                              (not (/.value? (++ /.most)))
+                              (not (/.value? (-- /.least)))))
+                       (_.coverage [/.value]
                          (|> expected_value
-                             /.number
                              /.value
-                             (try#each (|>> /.number
-                                            (n.= (/.number expected_value))))
-                             (try.else false)))
+                             (n.= expected_value)))
                        (_.coverage [/.limit]
-                         (and (when (/.value /.limit)
-                                {try.#Failure _} true
-                                {try.#Success _} false)
-                              (when (/.value (-- /.limit))
-                                {try.#Failure _} false
-                                {try.#Success _} true)))
-                       (_.coverage [/.least]
-                         (when (/.value (++ (/.number /.least)))
-                           {try.#Failure _} false
-                           {try.#Success _} true))
-                       (_.coverage [/.most]
-                         (when (/.value (-- (/.number /.most)))
-                           {try.#Failure _} false
-                           {try.#Success _} true))
-                       (_.coverage [/.invalid]
-                         (and (when (/.value (-- (/.number /.least)))
-                                {try.#Failure it} (exception.match? /.invalid it)
-                                {try.#Success _} false)
-                              (when (/.value (++ (/.number /.most)))
-                                {try.#Failure it} (exception.match? /.invalid it)
-                                {try.#Success _} false)))
+                         (|> /.limit
+                             /.value
+                             (n.= /.limit)
+                             not))
                        ))
-           (_.for [/.RGB
-                   /.#red /.#green /.#blue]
+           (_.for [/.RGB]
                   (all _.and
                        (_.for [/.equivalence]
                               (equivalenceS.spec /.equivalence ..random))
@@ -87,36 +76,15 @@
                        (_.for [/.subtraction]
                               (monoidS.spec /.equivalence /.subtraction ..random))
 
-                       (_.coverage [/.rgb]
-                         (`` (and (let [red (/.number expected_value)
-                                        green (/.number expected_value)
-                                        blue (/.number expected_value)]
-                                    (when (/.rgb red green blue)
-                                      {try.#Failure _}
-                                      false
-                                      
-                                      {try.#Success it}
-                                      (and (n.= (/.number expected_value)
-                                                (/.number (the /.#red it)))
-                                           (n.= (/.number expected_value)
-                                                (/.number (the /.#green it)))
-                                           (n.= (/.number expected_value)
-                                                (/.number (the /.#blue it))))))
-                                  (,, (with_template [  ]
-                                        [(let [red (n.+  (/.number expected_value))
-                                               green (n.+  (/.number expected_value))
-                                               blue (n.+  (/.number expected_value))]
-                                           (when (/.rgb red green blue)
-                                             {try.#Failure it}
-                                             (exception.match? /.invalid it)
-                                             
-                                             {try.#Success _}
-                                             false))]
-
-                                        [/.limit 0 0]
-                                        [0 /.limit 0]
-                                        [0 0 /.limit]
-                                        )))))
+                       (_.coverage [/.rgb
+                                    /.red /.green /.blue]
+                         (let [it (/.rgb expected_red expected_green expected_blue)]
+                           (and (same? expected_red
+                                       (/.red it))
+                                (same? expected_green
+                                       (/.green it))
+                                (same? expected_blue
+                                       (/.blue it)))))
                        (_.coverage [/.complement]
                          (let [~expected (/.complement expected)
                                (open "/#[0]") /.equivalence]
diff --git a/stdlib/source/test/lux/world/net/http/response.lux b/stdlib/source/test/lux/world/net/http/response.lux
index 4e4e0baac..d25d3ce7f 100644
--- a/stdlib/source/test/lux/world/net/http/response.lux
+++ b/stdlib/source/test/lux/world/net/http/response.lux
@@ -17,17 +17,18 @@
      [encoding
       ["[0]" utf8 (.use "[1]#[0]" codec)]]]
     [format
-     ["[0]" html]
-     ["[0]" css (.only)
-      ["[0]" selector]
-      ["[0]" property]
-      ["[0]" value]]
      ["[0]" json (.use "[1]#[0]" codec)
       ["[1]T" \\test]]]]
    [math
     ["[0]" random (.only Random)]
     [number
      ["n" nat]]]
+   [web
+    ["[0]" html]
+    ["[0]" css (.only)
+     ["[0]" selector]
+     ["[0]" property]
+     ["[0]" value]]]
    [test
     ["_" property (.only Test)]
     ["[0]" unit]]]]
diff --git a/stdlib/source/test/lux/world/time/series.lux b/stdlib/source/test/lux/world/time/series.lux
index 806241c2b..47432df08 100644
--- a/stdlib/source/test/lux/world/time/series.lux
+++ b/stdlib/source/test/lux/world/time/series.lux
@@ -15,7 +15,8 @@
     ["[0]" product]
     [collection
      ["[0]" list (.use "[1]#[0]" functor mix)]
-     ["[0]" set]]]
+     ["[0]" set]
+     ["[0]" sequence]]]
    [math
     ["[0]" random (.only Random) (.use "[1]#[0]" functor)]
     [number
@@ -24,129 +25,123 @@
    [world
     [time
      ["[0]" instant (.only Instant) (.use "[1]#[0]" order)]
-     ["[0]" duration]]]
+     ["[0]" duration (.only Duration)]]]
    [test
     ["_" property (.only Test)]]]]
  [\\library
-  ["[0]" /]])
+  ["[0]" /]]
+ ["[0]" /
+  ["[1][0]" average]])
 
-(def .public (event it)
-  (All (_ of)
-    (-> (Random of)
-        (Random (/.Event of))))
-  (do random.monad
-    [when random.instant
-     what it]
-    (in [/.#when when
-         /.#what what])))
-
-(def .public (random size it)
+(def .public (random events it)
   (All (_ of)
     (-> Nat (Random of)
         (Random (/.Series of))))
-  (|> it
-      (random.list size)
-      (random#each (|>> (list#mix (function (_ what [when events])
-                                    [(instant.before duration.milli_second when)
-                                     (list.partial [/.#when when
-                                                    /.#what what]
-                                                   events)])
-                                  [instant.latest (list)])
-                        product.right))
-      (random.one (|>> /.series
-                       try.maybe))))
+  (do [! random.monad]
+    [.let [duration (random.only duration.positive? random.duration)]
+     offset (of ! each (duration.framed (duration.up 100 duration.normal_year))
+                duration)
+     .let [start (instant.after offset instant.epoch)]
+     interval (of ! each (duration.framed duration.week)
+                  duration)
+     data (random.sequence events it)]
+    (in [/.#start start
+         /.#interval interval
+         /.#data data])))
 
-(def (injection when)
-  (-> Instant
+(def (injection start interval)
+  (-> Instant Duration
       (Injection /.Series))
-  (|>> [/.#when when
-        /.#what]
-       list
-       /.series
-       try.trusted))
+  (|>> sequence.sequence
+       [/.#start start
+        /.#interval interval
+        /.#data]))
 
 (def .public test
   Test
   (<| (_.covering /._)
       (do [! random.monad]
-        [before (..event random.nat)
-         after (random.only (|>> (the /.#when)
-                                 (instant#= (the /.#when before))
-                                 not)
-                            (..event random.nat))
-         .let [[before after] (if (instant#< (the /.#when after)
-                                             (the /.#when before))
-                                [before after]
-                                [after before])]
+        [expected_size (of ! each (|>> (n.% 10) ++) random.nat)
+         expected_series (..random expected_size random.nat)
+
+         before random.nat
+         after random.nat
+         expected_start random.instant
+         expected_interval random.duration
 
-         expected_instant random.instant
-         expected_size (of ! each (n.% 10) random.nat)
-         events (is (Random (List (/.Event Int)))
-                    (|> random.int
-                        (random.set i.hash expected_size)
-                        (of ! each (|>> set.list
-                                        (list.sorted i.<)
-                                        (list#each (function (_ it)
-                                                     [/.#when (instant.of_millis it)
-                                                      /.#what it]))))))])
-      (all _.and
-           (<| (_.for [/.Event
-                       /.#what /.#when])
-               (`` (all _.and
-                        (,, (with_template [ ]
-                              [(_.coverage []
-                                 (|> (do try.monad
-                                       [it (/.series (list before after))
-                                        actual ( it)]
-                                       (in (same?  actual)))
-                                     (try.else false)))]
+         window_size (of ! each (|>> (n.% expected_size) ++) random.nat)
+         window_offset (of ! each (n.% (++ (n.- window_size expected_size))) random.nat)])
+      (_.for [/.Series
+              /.#start /.#interval /.#data])
+      (`` (all _.and
+               (_.for [/.equivalence]
+                      (equivalenceS.spec (/.equivalence n.equivalence) (..random expected_size random.nat)))
+               (_.for [/.mix]
+                      (mixS.spec (..injection expected_start expected_interval) /.equivalence /.mix))
+               (_.for [/.functor]
+                      (functorS.spec (..injection expected_start expected_interval) /.equivalence /.functor))
+               
+               (_.coverage [/.size]
+                 (n.= expected_size
+                      (/.size expected_series)))
+               (_.coverage [/.start /.end]
+                 (instant#< (/.end expected_series)
+                            (/.start expected_series)))
+               (_.coverage [/.at]
+                 (and (instant#= (/.at 0 expected_series)
+                                 (/.start expected_series))
+                      (instant#< (/.at (-- expected_size) expected_series)
+                                 (/.start expected_series))))
+               (,, (with_template [ ]
+                     [(_.coverage []
+                        (|> (do try.monad
+                              [.let [it [/.#start expected_start
+                                         /.#interval expected_interval
+                                         /.#data (sequence.sequence before after)]]
+                               actual ( it)]
+                              (in (same?  actual)))
+                            (try.else false)))]
 
-                              [/.earliest before]
-                              [/.latest after]
-                              ))
-                        )))
-           (<| (_.for [/.Series])
-               (`` (all _.and
-                        (_.for [/.equivalence]
-                               (equivalenceS.spec (/.equivalence n.equivalence) (..random expected_size random.nat)))
-                        (_.for [/.mix]
-                               (mixS.spec (..injection expected_instant) /.equivalence /.mix))
-                        (_.for [/.functor]
-                               (functorS.spec (..injection expected_instant) /.equivalence /.functor))
-                        
-                        (_.coverage [/.series /.size]
-                          (|> (do try.monad
-                                [it (/.series events)]
-                                (in (/.size it)))
-                              (try#each (n.= expected_size))
-                              (try.else false)))
-                        (_.coverage [/.empty]
-                          (and (,, (with_template [ ]
-                                     [(|> (do try.monad
-                                            [it (/.series (list))]
-                                            ( it))
-                                          (|.when
-                                            {try.#Failure error}
-                                            (exception.match? /.empty error)
-                                            
-                                            _
-                                            false))]
+                     [/.earliest before]
+                     [/.latest after]
+                     ))
+               (_.coverage [/.empty]
+                 (and (,, (with_template [ ]
+                            [(|> (do try.monad
+                                   [.let [it [/.#start expected_start
+                                              /.#interval expected_interval
+                                              /.#data (sequence.sequence)]]]
+                                   ( it))
+                                 (|.when
+                                   {try.#Failure error}
+                                   (exception.match? /.empty error)
+                                   
+                                   _
+                                   false))]
 
-                                     [/.earliest before]
-                                     [/.latest after]
-                                     ))))
-                        (,, (with_template [  ]
-                              [(_.coverage []
-                                 (|> (/.series (list  ))
-                                     (|.when
-                                       {try.#Failure error}
-                                       (exception.match?  error)
-                                       
-                                       _
-                                       false)))]
+                            [/.earliest before]
+                            [/.latest after]
+                            ))))
+               (_.coverage [/.window]
+                 (|> (do try.monad
+                       [it (/.window window_offset window_size expected_series)]
+                       (in (n.= window_size (/.size it))))
+                     (try.else false)))
+               (_.coverage [/.window_goes_out_of_bounds]
+                 (and (|> (/.window expected_size window_size expected_series)
+                          (|.when
+                            {try.#Failure error}
+                            (exception.match? /.window_goes_out_of_bounds error)
+                            
+                            _
+                            false))
+                      (|> (/.window (++ window_offset) expected_size expected_series)
+                          (|.when
+                            {try.#Failure error}
+                            (exception.match? /.window_goes_out_of_bounds error)
+                            
+                            _
+                            false))))
 
-                              [/.disordered after before]
-                              [/.duplicated before before]
-                              ))
-                        )))
-           )))
+               /average.test
+               ))))
diff --git a/stdlib/source/test/lux/world/time/series/average.lux b/stdlib/source/test/lux/world/time/series/average.lux
new file mode 100644
index 000000000..5cd02181a
--- /dev/null
+++ b/stdlib/source/test/lux/world/time/series/average.lux
@@ -0,0 +1,100 @@
+(.require
+ [library
+  [lux (.except)
+   [abstract
+    [monad (.only do)]]
+   [control
+    ["[0]" try]
+    ["[0]" exception]]
+   [math
+    ["[0]" random (.only Random)]
+    [number
+     ["n" nat]]]
+   [world
+    [time
+     ["[0]" instant (.use "[1]#[0]" order)]
+     ["[0]" duration (.use "[1]#[0]" equivalence)]]]
+   [test
+    ["_" property (.only Test)]]]]
+ [\\library
+  ["[0]" / (.only)
+   ["/[1]" //]]])
+
+(def (series events)
+  (-> Nat
+      (Random (/.Series Frac)))
+  (do [! random.monad]
+    [.let [duration (random.only duration.positive? random.duration)]
+     offset (of ! each (duration.framed (duration.up 100 duration.normal_year))
+                duration)
+     .let [start (instant.after offset instant.epoch)]
+     interval (of ! each (duration.framed duration.week)
+                  duration)
+     data (random.sequence events random.safe_frac)]
+    (in [//.#start start
+         //.#interval interval
+         //.#data data])))
+
+(def .public test
+  Test
+  (<| (_.covering /._)
+      (do [! random.monad]
+        [expected_events (of ! each (|>> (n.% 10) ++) random.nat)
+         input (series expected_events)
+         expected_window_extras (of ! each (n.% expected_events) random.nat)])
+      (all _.and
+           (_.coverage [/.cumulative]
+             (let [output (/.cumulative input)]
+               (and (instant#= (//.start input)
+                               (//.start output))
+                    (n.= (//.size input)
+                         (//.size output)))))
+           (_.coverage [/.windows]
+             (<| (try.else false)
+                 (do try.monad
+                   [output (/.windows expected_window_extras input)]
+                   (in (and (instant#= (//.start input)
+                                       (//.start output))
+                            (n.= (n./ (++ expected_window_extras) (//.size input))
+                                 (//.size output)))))))
+           (_.coverage [/.window_size_is_too_large]
+             (when (/.windows (++ expected_events) input)
+               {try.#Failure error}
+               (exception.match? /.window_size_is_too_large error)
+
+               {try.#Success _}
+               false))
+           (<| (_.for [/.Average /.moving])
+               (all _.and
+                    (_.coverage [/.Factor /.simple_factor /.exponential]
+                      (<| (try.else false)
+                          (do try.monad
+                            [output (/.moving (/.exponential /.simple_factor)
+                                              expected_window_extras
+                                              input)]
+                            (in (and (instant#< (//.start output)
+                                                (//.start input))
+                                     (n.= (n.- expected_window_extras (//.size input))
+                                          (//.size output)))))))
+                    (_.coverage [/.simple]
+                      (<| (try.else false)
+                          (do try.monad
+                            [output (/.moving /.simple
+                                              expected_window_extras
+                                              input)]
+                            (in (and (instant#< (//.start output)
+                                                (//.start input))
+                                     (n.= (n.- expected_window_extras (//.size input))
+                                          (//.size output)))))))
+                    (_.coverage [/.weighted]
+                      (<| (try.else false)
+                          (do try.monad
+                            [output (/.moving /.weighted
+                                              expected_window_extras
+                                              input)]
+                            (in (and (instant#< (//.start output)
+                                                (//.start input))
+                                     (n.= (n.- expected_window_extras (//.size input))
+                                          (//.size output)))))))
+                    ))
+           )))
-- 
cgit v1.2.3