diff options
Diffstat (limited to 'stdlib/source/library/lux/web/css/value.lux')
-rw-r--r-- | stdlib/source/library/lux/web/css/value.lux | 1422 |
1 files changed, 1422 insertions, 0 deletions
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 <code>.text]) + (in (list (code.local (text.replaced "-" "_" symbol)))))) + +(def enumeration + (template (_ <abstraction> <representation> <out> <sample>+ <definition>+) + [(nominal.def .public <abstraction> + <representation> + + (def .public <out> + (-> <abstraction> <representation>) + (|>> representation)) + + (`` (with_template [<name> <value>] + [(def .public <name> <abstraction> (abstraction <value>))] + + (,, (template.spliced <sample>+)) + )) + + (template.spliced <definition>+))])) + +(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 [<name> <value>] + [(def .public <name> + Value + (abstraction <value>))] + + [initial "initial"] + [inherit "inherit"] + [unset "unset"] + ) + + (nominal.def .public (Numeric kind) Any) + + (with_template [<name>] + [(with_expansions [<name>' (template.symbol [<name> "'"])] + (nominal.def .public <name>' Any) + (type .public <name> + (Numeric <name>')))] + + [Number] + [Length] + [Time] + [Percentage] + ) + + (with_template [<brand> <alias>+ <value>+] + [(nominal.def .public <brand> Any) + + (`` (with_template [<name> <value>] + [(def .public <name> + (Value <brand>) + (abstraction <value>))] + + (,, (template.spliced <alias>+)))) + + (with_expansions [<rows> (template.spliced <value>+)] + (with_template [<value>] + [(`` (def .public (,, (..text_symbol <value>)) + (Value <brand>) + (abstraction <value>)))] + + <rows>))] + + [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 [<name> <brand>] + [(def .public <name> + (-> Nat + (Value <brand>)) + (|>> %.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 [<name> <suffix>] + [(def .public (<name> value) + (-> Frac + (Value Length)) + (abstraction (format (%number value) <suffix>)))] + + [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 [<name> <suffix>] + [(def .public (<name> value) + (-> Int + (Value Time)) + (abstraction (format (if (i.< +0 value) + (%.int value) + (%.nat (.nat value))) + <suffix>)))] + + + [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 [<degree> <name>] + [(def .public <name> + Angle + (..degree <degree>))] + + [000 to_top] + [090 to_right] + [180 to_bottom] + [270 to_left] + ) + + (with_template [<name> <function>] + [(def .public (<name> angle start next) + (-> Angle Stop (List/1 [(Maybe Hint) Stop]) + (Value Image)) + (let [[now after] next] + (..apply <function> (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 [<input> <pre> <function>+] + [(`` (with_template [<name> <function>] + [(def .public <name> + (-> <input> + (Value Filter)) + (|>> <pre> (list) (..apply <function>)))] + + (,, (template.spliced <function>+))))] + + [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 [<name> <type>] + [(def .public (<name> horizontal vertical) + (-> (Value Length) (Value Length) + (Value <type>)) + (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 [<name> <function>] + [(def .public (<name> 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 <function> (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 [<side>] + [(representation (the <side> 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 [<name> <function> <input_types> <input_values>] + [(`` (def .public (<name> [(,, (template.spliced <input_values>))]) + (-> [(,, (template.spliced <input_types>))] + (Value Transform)) + (|> (list (,, (template.spliced <input_values>))) + (list#each %number) + (..apply <function>))))] + + [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 [<name> <function> <input_types> <input_values>] + [(`` (def .public (<name> [(,, (template.spliced <input_values>))]) + (-> [(,, (template.spliced <input_types>))] + (Value Transform)) + (|> (list (,, (template.spliced <input_values>))) + (list#each ..angle) + (..apply <function>))))] + + [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 [<separator> <type> <multi>] + [(def .public (<multi> pre post) + (-> (Value <type>) (Value <type>) + (Value <type>)) + (abstraction (format (representation pre) + <separator> + (representation post))))] + + ["," Image multi_image] + ["," Shadow multi_shadow] + [" " Content multi_content] + ) + + ... https://developer.mozilla.org/en-US/docs/Web/CSS/calc() + (with_template [<name> <parameter>] + [(def .public (<name> parameter subject) + (.All (_ kind) + (-> (Value <parameter>) (Value (Numeric kind)) + (Value (Numeric kind)))) + (|> (format (representation subject) + (template.text [" " <name> " "]) + (representation parameter)) + (text.enclosed ["calc(" ")"]) + abstraction))] + + [+ (Numeric kind)] + [- (Numeric kind)] + [* Number] + [/ Number] + ) + ) |