[{"name":"FormToolkit.Error","comment":"\n\n@docs Error, toEnglish, toList\n\n","unions":[{"name":"Error","comment":" Represents an error that occurred during decoding or validation.\n","args":["id"],"cases":[["IsBlank",["Maybe.Maybe id"]],["ValueTooLarge",["Maybe.Maybe id","{ value : FormToolkit.Value.Value, max : FormToolkit.Value.Value }"]],["ValueTooSmall",["Maybe.Maybe id","{ value : FormToolkit.Value.Value, min : FormToolkit.Value.Value }"]],["ValueNotInRange",["Maybe.Maybe id","{ value : FormToolkit.Value.Value, min : FormToolkit.Value.Value, max : FormToolkit.Value.Value }"]],["NotNumber",["Maybe.Maybe id"]],["NotBool",["Maybe.Maybe id"]],["HasNoName",["Maybe.Maybe id"]],["PatternError",["Maybe.Maybe id"]],["EmailInvalid",["Maybe.Maybe id"]],["IsGroupNotInput",["Maybe.Maybe id"]],["NoOptionsProvided",["Maybe.Maybe id"]],["InvalidValue",["Maybe.Maybe id"]],["InputNotFound",["id"]],["ErrorList",["Maybe.Maybe id","List.List (FormToolkit.Error.Error id)"]],["ParseError",["Maybe.Maybe id"]],["CustomError",["Maybe.Maybe id","String.String"]]]}],"aliases":[],"values":[{"name":"toEnglish","comment":" ","type":"FormToolkit.Error.Error id -> String.String"},{"name":"toList","comment":" ","type":"FormToolkit.Error.Error id -> List.List (FormToolkit.Error.Error id)"}],"binops":[]},{"name":"FormToolkit.Field","comment":" Provides types and functions to create form fields of various types, set\ntheir attributes, update, and render them.\n\n\n# Field\n\n@docs Field, Msg, update, toHtml\n\n\n# Field types\n\n@docs text, textarea, email, password, strictAutocomplete\n@docs int, float\n@docs date, month, datetime\n@docs select, radio, checkbox\n@docs group, repeatable\n\n\n# Attributes\n\n@docs Attribute\n@docs name, identifier, value, stringValue, required, label, placeholder, hint\n@docs selectionStart, selectionEnd\n@docs options, stringOptions, min, max, step, autogrow\n@docs class, classList\n@docs disabled, hidden, noattr, pattern\n\n\n# Groups\n\n@docs copies, repeatableMin, repeatableMax\n\n\n# Update attributes\n\n@docs updateAttribute, updateAttributes, updateWithId\n@docs updateValuesFromJson\n\n\n# Mapping and composition\n\n@docs map\n\n\n# Validation\n\n@docs validate, touch\n\n","unions":[{"name":"Attribute","comment":" Represents an attribute that can be applied to a field.\n","args":["id","val"],"cases":[]},{"name":"Field","comment":" Represents a form field element, which can be an individual field or a group\nof fields.\n\nThis element may consist of individual input fields (such as text, email, or\npassword), groups of fields, or repeatable fields.\n\nThe type parameter `id` corresponds to an optional identifier used for\nreferencing a specific `field` while decoding or updating attributes, and the\ntype parameter `val` refers to a value of an arbitrary type.\n\nFields are preferably identified by a custom type but can also be identified by\na `String`.\n\n","args":["id"],"cases":[["Field",["FormToolkit.Field.Node id"]]]},{"name":"Msg","comment":" A message generated through interaction with an input.\n","args":["id"],"cases":[["InputChanged",["Maybe.Maybe id","FormToolkit.Field.Path","Internal.Value.Value","{ selectionStart : Basics.Int, selectionEnd : Basics.Int }"]],["OnCheck",["Maybe.Maybe id","FormToolkit.Field.Path","Basics.Bool"]],["InputFocused",["Maybe.Maybe id","FormToolkit.Field.Path"]],["InputBlured",["Maybe.Maybe id","FormToolkit.Field.Path"]],["InputsAdded",["Maybe.Maybe id","FormToolkit.Field.Path"]],["InputsRemoved",["Maybe.Maybe id","FormToolkit.Field.Path"]]]}],"aliases":[],"values":[{"name":"autogrow","comment":" Makes a `textarea` autogrow.\n","type":"Basics.Bool -> FormToolkit.Field.Attribute id val"},{"name":"checkbox","comment":" Builds a checkbox input field.\n\n    consentField : Field id\n    consentField =\n        checkbox [ label \"Subscribe to newsletter\" ]\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> FormToolkit.Field.Field id"},{"name":"class","comment":" Apply a CSS class\n","type":"String.String -> FormToolkit.Field.Attribute id val"},{"name":"classList","comment":" Apply a conditional list of CSS classes\n","type":"List.List ( String.String, Basics.Bool ) -> FormToolkit.Field.Attribute id val"},{"name":"copies","comment":" Sets the text for the add and remove buttons in a repeatable field.\n","type":"{ addFieldsButton : String.String, removeFieldsButton : String.String } -> FormToolkit.Field.Attribute id val"},{"name":"date","comment":" Builds a date input field.\n\n    birthdateField : Field id\n    birthdateField =\n        date [ label \"Birthdate\", required True ]\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> FormToolkit.Field.Field id"},{"name":"datetime","comment":" Builds a datetime-local input field.\n\n    meetingTimeField : Field id\n    meetingTimeField =\n        datetime [ label \"Meeting Time\", required True ]\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> FormToolkit.Field.Field id"},{"name":"disabled","comment":" Sets whether a field is disabled. When set to True, the field input will have the disabled HTML attribute.\n","type":"Basics.Bool -> FormToolkit.Field.Attribute id val"},{"name":"email","comment":" Builds an email input field.\n\n    emailField : Field id\n    emailField =\n        email [ label \"Email\", required True ]\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> FormToolkit.Field.Field id"},{"name":"float","comment":" Builds a floating-point number input field.\n\n    priceField : Field id\n    priceField =\n        float [ label \"Price\", min (Value.float 0.0) ]\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> FormToolkit.Field.Field id"},{"name":"group","comment":" Groups a list of fields.\n\n    nameFields : Field id\n    nameFields =\n        group\n            [ name \"person-name\" ]\n            [ text [ name \"firstName\", label \"First Name\" ]\n            , text [ name \"lastName\", label \"Last Name\" ]\n            ]\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> List.List (FormToolkit.Field.Field id) -> FormToolkit.Field.Field id"},{"name":"hidden","comment":" Sets whether a field is hidden. When set to True, the field will not be rendered.\n","type":"Basics.Bool -> FormToolkit.Field.Attribute id val"},{"name":"hint","comment":" Sets a hint or help text for a field.\n","type":"String.String -> FormToolkit.Field.Attribute id val"},{"name":"identifier","comment":" Sets the identifier to be referenced when decoding a specific field,\nextracting a segment of the form, updating the field's attributes, or\ncustomizing the rendering of a specific field or field error.\n\nAny type can be used as an identifier, but using a custom type is encouraged\nfor added type safety.\n\n    import FormToolkit.Parse as Parse\n    import FormToolkit.Value as Value\n\n    type Fields\n        = FirstName\n        | LastName\n\n    fields : Field Fields\n    fields =\n        group []\n            [ text\n                [ label \"First name\"\n                , identifier FirstName\n                , value (Value.string \"Juan\")\n                ]\n            , text\n                [ label \"Last name\"\n                , identifier LastName\n                , value (Value.string \"Perez\")\n                ]\n            ]\n\n    fields\n        |> Parse.parse\n            (Parse.field FirstName Parse.string)\n        --> Ok \"Juan\"\n\n","type":"id -> FormToolkit.Field.Attribute id val"},{"name":"int","comment":" Builds an integer input field.\n\n    ageField : Field id\n    ageField =\n        int\n            [ label \"Age\"\n            , min (Value.int 0)\n            , max (Value.int 120)\n            ]\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> FormToolkit.Field.Field id"},{"name":"label","comment":" Sets the text to be rendered as the label for a field, or for the legend for\na group or repeatable fields group.\n","type":"String.String -> FormToolkit.Field.Attribute id val"},{"name":"map","comment":" Transforms identifiers or errors in a field, useful for combining fields\nwith identifiers of different types.\n\n    type PersonFields\n        = PersonName\n        | PersonAge\n\n    type TeamFields\n        = TeamName\n        | TeamMembers\n        | MemberFields PersonFields\n\n    personsFields : Field PersonFields\n    personsFields =\n        group []\n            [ text\n                [ label \"Member Name\"\n                , identifier PersonName\n                ]\n            , int\n                [ label \"Member Age\"\n                , identifier PersonAge\n                ]\n            ]\n\n    teamFields : Field TeamFields\n    teamFields =\n        group []\n            [ text\n                [ label \"Team Name\"\n                , identifier TeamName\n                ]\n            , repeatable\n                [ identifier TeamMembers ]\n                -- ↓↓↓↓\n                (map MemberFields personFields)\n                -- ↑↑↑↑\n                []\n            ]\n\n","type":"(a -> b) -> FormToolkit.Field.Field a -> FormToolkit.Field.Field b"},{"name":"max","comment":" Sets the maximum value for a field input if its value is scalar:\n`int`, `float`, `date`, `month`, `datetime`, or `time`.\n","type":"FormToolkit.Value.Value -> FormToolkit.Field.Attribute id val"},{"name":"min","comment":" Sets the minimum value for a field input if its value is scalar:\n`int`, `float`, `date`, `month`, `datetime`, or `time`.\n","type":"FormToolkit.Value.Value -> FormToolkit.Field.Attribute id val"},{"name":"month","comment":" Builds a month input field.\n\n    monthField : Field id\n    monthField =\n        month [ label \"Expiry Month\" ]\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> FormToolkit.Field.Field id"},{"name":"name","comment":" Sets the name of a field.\n\n        import FormToolkit.Parse as Parse\n        import Json.Encode\n\n        text\n            [ label \"First name\"\n            , name \"first-name\"\n            , value (Value.string \"Chavela\")\n            ]\n            |> Parse.parse Parse.json\n                |> Result.map (Json.Encode.encode 0)\n            --> Ok \"{\\\"first-name\\\":\\\"Chavela\\\"}\"\n\n","type":"String.String -> FormToolkit.Field.Attribute id val"},{"name":"noattr","comment":" An attribute that does nothing.\n","type":"FormToolkit.Field.Attribute id val"},{"name":"options","comment":" Sets the options for a [select](#select), [radio](#radio) button, or\n`datalist` for a [text](#text) field or [strictAutocomplete](#strictAutocomplete)\nto provide autocomplete suggestions.\n\n    select\n        [ label \"Agreed?\"\n        , options [ ( \"Yes\", Value.bool True ), ( \"No\", Value.bool False ) ]\n        ]\n\n","type":"List.List ( String.String, FormToolkit.Value.Value ) -> FormToolkit.Field.Attribute id val"},{"name":"password","comment":" Builds a password input field.\n\n    passwordField : Field id\n    passwordField =\n        password [ label \"Password\", required True ]\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> FormToolkit.Field.Field id"},{"name":"pattern","comment":" Sets a pattern for text input. Only characters matching the pattern will be allowed.\nThe input will be formatted automatically, and on blur validated.\nParsing will fail if input doesn't match the pattern.\n\n  - `{d}` - matches digits\n  - `{D}` - matches non-digits\n  - `{w}` - matches word characters (alphanumeric + underscore)\n  - `{W}` - matches non-word characters\n  - Any other character is treated as a literal\n\n```\ntext\n    [ label \"Phone Number\"\n    , pattern \"({d}{d}{d}) {d}{d}{d}-{d}{d}{d}{d}\"\n    ]\n```\n\n","type":"String.String -> FormToolkit.Field.Attribute id val"},{"name":"placeholder","comment":" Sets the placeholder text of a field.\n","type":"String.String -> FormToolkit.Field.Attribute id val"},{"name":"radio","comment":" Builds a radio button input field.\n\n    lightOnField : Field id\n    lightOnField =\n        radio\n            [ label \"Light is\"\n            , options\n                [ ( \"On\", Value.bool True )\n                , ( \"Off\", Value.bool False )\n                ]\n            ]\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> FormToolkit.Field.Field id"},{"name":"repeatable","comment":" Builds a repeatable group of fields from a template field.\n\nA list of field update functions can be passed as the second argument to apply\nto the template, creating one field per function.\n\nThe markup includes buttons for adding and removing fields.\n\nRelevant attributes are [repeatableMin](#repeatableMin),\n[repeatableMax](#repeatableMax), and [copies](#copies).\n\n    import FormToolkit.Parse as Parse\n    import FormToolkit.Value as Value\n\n    emailsFields : Field id\n    emailsFields =\n        repeatable\n            [ repeatableMin 1\n            , repeatableMax 5\n            , copies\n                { addFieldsButton = \"Add name\"\n                , removeFieldsButton = \"Remove\"\n                }\n            ]\n            (text [ placeholder \"Musician name\" ])\n            [ updateAttribute (stringValue \"Brian Eno\")\n            , updateAttribute (stringValue \"Faust\")\n            , updateAttribute (stringValue \"Neu!\")\n            ]\n\n\n    emailsFields\n        |> Parse.parse (Parse.list Parse.string)\n    --> Ok [ \"Brian Eno\", \"Faust\", \"Neu!\" ]\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> FormToolkit.Field.Field id -> List.List (FormToolkit.Field.Field id -> FormToolkit.Field.Field id) -> FormToolkit.Field.Field id"},{"name":"repeatableMax","comment":" Sets the maximum number of instances for a repeating field for a\n[repeatable](#repeatable).\n","type":"Basics.Int -> FormToolkit.Field.Attribute id val"},{"name":"repeatableMin","comment":" Sets the minimum number of instances for a repeating field for a\n[repeatable](#repeatable).\n","type":"Basics.Int -> FormToolkit.Field.Attribute id val"},{"name":"required","comment":" Marks a field as required, parsing and validation will fail and the missing\nfield error will be displayed.\n\n    import FormToolkit.Parse as Parse\n    import FormToolkit.Value as Value\n\n    text [ label \"First name\" ]\n        |> Parse.parse (Parse.maybe Parse.string)\n        --> Ok Nothing\n\n","type":"Basics.Bool -> FormToolkit.Field.Attribute id val"},{"name":"select","comment":" Builds a select input field (dropdown).\n\n    langSelect : Field id\n    langSelect =\n        select\n            [ label \"Language\"\n            , stringOptions [ \"Español\", \"English\", \"Deutsch\" ]\n            ]\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> FormToolkit.Field.Field id"},{"name":"selectionEnd","comment":" Sets the cursor end position for a field.\n","type":"Basics.Int -> FormToolkit.Field.Attribute id val"},{"name":"selectionStart","comment":" Sets the cursor start position for a field.\n","type":"Basics.Int -> FormToolkit.Field.Attribute id val"},{"name":"step","comment":" Sets the step value for numeric field inputs (`int` and `float`).\nThe step value specifies the increment when using the input's up/down arrows.\n","type":"FormToolkit.Value.Value -> FormToolkit.Field.Attribute id val"},{"name":"strictAutocomplete","comment":" Builds a text input field with strict autocomplete. If the user input doesn't\nmatch a provided option, the input value will be blank. The value can be of\nany type.\n\nFor non-strict autocomplete, use [text](#text) with the [options](#options)\nattribute. For string value options, see [stringOptions](#stringOptions).\n\n    strictAutocomplete\n        [ label \"Language\"\n        , stringOptions [ \"Español\", \"English\", \"Deutsch\" ]\n        ]\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> FormToolkit.Field.Field id"},{"name":"stringOptions","comment":" Sets string options for a [select](#select), [radio](#radio) button, or\n`datalist` for a [text](#text) field or [strictAutocomplete](#strictAutocomplete)\nto provide autocomplete suggestions.\n\n    flavorField : Field id ( Bool, Bool )\n    flavorField =\n        text\n            [ label \"Favorite flavor\"\n            , stringOptions\n                [ \"Chocolate\"\n                , \"Pistachio\"\n                , \"Caramel salt\"\n                ]\n            ]\n\n","type":"List.List String.String -> FormToolkit.Field.Attribute id val"},{"name":"stringValue","comment":" Sets string value of a field.\n","type":"String.String -> FormToolkit.Field.Attribute id val"},{"name":"text","comment":" Builds a text input field.\n\n[options](#options) can be provided to construct a `datalist` for autocomplete\nsuggestions.\n\n    usernameField : Field id\n    usernameField =\n        text\n            [ label \"Username\"\n            , placeholder \"Enter your username\"\n            ]\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> FormToolkit.Field.Field id"},{"name":"textarea","comment":" Builds a Textarea input field.\n\n    commentsField : Field id\n    commentsField =\n        textarea\n            [ label \"Comments\"\n            , autogrow True\n            , placeholder \"Enter your comments here\"\n            ]\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> FormToolkit.Field.Field id"},{"name":"toHtml","comment":" Renders the form.\n\n    type UpdateMsg\n        = FieldsUpdated Msg\n\n    view : Html UpdateMsg\n    view =\n        group []\n            [ text [ label \"First Name\" ]\n            , text [ label \"Last Name\" ]\n            ]\n            |> toHtml FieldsUpdated\n\n","type":"(FormToolkit.Field.Msg id -> msg) -> FormToolkit.Field.Field id -> Html.Html msg"},{"name":"touch","comment":" Mark all inputs as touched displaying errors for invalid fields.\n","type":"FormToolkit.Field.Field id -> FormToolkit.Field.Field id"},{"name":"update","comment":" Updates a form by passing a decoder to validate and produce a result,\nand a [Msg](#Msg) to reflect user interactions.\n","type":"FormToolkit.Field.Msg id -> FormToolkit.Field.Field id -> FormToolkit.Field.Field id"},{"name":"updateAttribute","comment":" Updates a field attribute.\n\n    import FormToolkit.Parse as Parse\n    import FormToolkit.Value as Value\n\n    text\n        [ value (Value.string \"Value\") ]\n        |> updateAttribute (value (Value.string \"Updated\"))\n        |> Parse.parse Parse.string\n        --> Ok \"Updated\"\n\n","type":"FormToolkit.Field.Attribute id val -> FormToolkit.Field.Field id -> FormToolkit.Field.Field id"},{"name":"updateAttributes","comment":" Updates several field attributes.\n\n    import FormToolkit.Parse as Parse\n    import FormToolkit.Value as Value\n\n    text\n        [ identifier \"Field\"\n        , stringOptions [ \"Vanilla\", \"Lemon\", \"Yogurt\" ]\n        ]\n        |> updateAttributes\n            [ value (Value.string \"Chocolate\")\n            , stringOptions\n                [ \"Chocolate\"\n                , \"Pistachio\"\n                , \"Caramel salt\"\n                ]\n            ]\n        |> Parse.parse Parse.string\n        --> Ok \"Chocolate\"\n\n","type":"List.List (FormToolkit.Field.Attribute id val) -> FormToolkit.Field.Field id -> FormToolkit.Field.Field id"},{"name":"updateValuesFromJson","comment":" Sets field values from a JSON object. The JSON structure should match the\nform's nested field structure with `name`, groups with no name will not be\nstructurally considered.\n\n    import Json.Decode as Decode\n    import Json.Encode as Encode\n    import FormToolkit.Parse as Parse\n\n\n    json : Encode.Value\n    json =\n        \"\"\"{\"user\":{\"name\":\"Alice\",\"email\":\"alice@example.com\"}}\"\"\"\n            |> Decode.decodeString Decode.value\n            |> Result.withDefault Encode.null\n\n\n    fields : Field String\n    fields =\n        group []\n            [ group [ name \"user\" ]\n                [ text [ name \"name\" ]\n                , text [ name \"email\", identifier \"email-field\" ]\n                ]\n            ]\n\n    updateValuesFromJson json fields\n        |> Result.andThen (Parse.parse (Parse.field \"email-field\" Parse.string))\n    --> Ok \"alice@example.com\"\n\n","type":"Json.Encode.Value -> FormToolkit.Field.Field id -> Result.Result (FormToolkit.Error.Error id) (FormToolkit.Field.Field id)"},{"name":"updateWithId","comment":" Traverses the field tree updating a descendant field matching the\n[identifier](#identifier), if the descendant is not found it will return Nothing.\n\n    import FormToolkit.Parse as Parse\n    import FormToolkit.Value as Value\n\n    group []\n        [ text\n            [ identifier \"Field\"\n            , value (Value.string \"Value\")\n            ]\n        ]\n        |> updateWithId \"Field\" (value (Value.string \"Updated\"))\n        |> Parse.parse (Parse.field \"Field\" Parse.string)\n        --> Ok \"Updated\"\n\n","type":"id -> FormToolkit.Field.Attribute id val -> FormToolkit.Field.Field id -> FormToolkit.Field.Field id"},{"name":"validate","comment":" Check all contained inputs and display errors for failed validations.\n","type":"FormToolkit.Field.Field id -> FormToolkit.Field.Field id"},{"name":"value","comment":" Sets the value of a field.\n\n    import FormToolkit.Parse as Parse\n    import FormToolkit.Value as Value\n\n    text [ label \"Name\", value (Value.string \"Chavela\") ]\n        |> Parse.parse Parse.string\n        --> Ok \"Chavela\"\n\n","type":"FormToolkit.Value.Value -> FormToolkit.Field.Attribute id val"}],"binops":[]},{"name":"FormToolkit.Parse","comment":" Map the values of an input or group of inputs to any shape you want, if you\nknow `Json.Decode` you know how to use this module ;)\n\n@docs Parser, parse, parseUpdate, parseValidate\n\n\n# Traversing and parsing\n\n@docs field\n@docs string, int, float, bool, posix, maybe, list, oneOf\n@docs stringLenient, formattedString, email\n@docs value, json\n@docs succeed, fail\n\n\n# Maps, combinators and pipeline style decoding\n\n@docs map, map2, map3, map4, map5, map6, map7, map8\n@docs andThen, andMap\n\n\n# Input update and custom validations\n\n@docs andUpdate\n\n","unions":[{"name":"Parser","comment":" A parser that takes a tree of input data and returns a parsed result or an\nerror if the decoding fails.\n","args":["id","a"],"cases":[]}],"aliases":[],"values":[{"name":"andMap","comment":" Incrementally apply parsers in a pipeline fashion.\n\n    import FormToolkit.Field as Field exposing (Field)\n    import FormToolkit.Value as Value\n\n    type alias Person =\n        { firstName : String\n        , lastName : String\n        , age : Int\n        }\n\n    type Fields\n        = FirstName\n        | LastName\n        | Age\n\n    fields : Field Fields\n    fields =\n        Field.group []\n            [ Field.text\n                [ Field.identifier FirstName\n                , Field.value (Value.string \"Penny\")\n                ]\n            , Field.text\n                [ Field.identifier LastName\n                , Field.value (Value.string \"Rimbaud\")\n                ]\n            , Field.int\n                [ Field.identifier Age\n                , Field.value (Value.int 81)\n                ]\n            ]\n\n    personParse : Parser Fields Person\n    personParse =\n        succeed Person\n            |> andMap (field FirstName string)\n            |> andMap (field LastName string)\n            |> andMap (field Age int)\n\n\n    fields\n        |> parse personParse\n    --> Ok { firstName = \"Penny\", lastName = \"Rimbaud\", age = 81 }\n\n","type":"FormToolkit.Parse.Parser id a -> FormToolkit.Parse.Parser id (a -> b) -> FormToolkit.Parse.Parser id b"},{"name":"andThen","comment":" Chains together parsers that depend on previous decoding results.\n\n    import FormToolkit.Field as Field exposing (Field)\n    import FormToolkit.Value as Value\n\n    wordsParser : Parser id (List String)\n    wordsParser =\n        string\n            |> andThen\n                (\\strValue ->\n                    case String.words strValue of\n                        [] ->\n                            fail \"No words\"\n\n                        words ->\n                            succeed words\n                )\n\n\n    Field.text [ Field.value (Value.string \"red green blue\") ]\n        |> parse wordsParser\n        --> Ok ([\"red\", \"green\", \"blue\"])\n\n","type":"(a -> FormToolkit.Parse.Parser id b) -> FormToolkit.Parse.Parser id a -> FormToolkit.Parse.Parser id b"},{"name":"andUpdate","comment":" This function can be used for performing custom validations, for\nformatting the input value, and for mapping the result of parsing the field.\n\n    import FormToolkit.Field as Field\n    import FormToolkit.Value as Value\n\n    removeVowels : String -> String\n    removeVowels =\n        String.replace \"a\" \"\"\n            >> String.replace \"e\" \"\"\n            >> String.replace \"i\" \"\"\n            >> String.replace \"o\" \"\"\n            >> String.replace \"u\" \"\"\n\n\n    Field.text [ Field.value (Value.string \"the quick fox jumps over the lazy dog\") ]\n        |> parse\n            (string\n                |> andUpdate\n                    (\\field str ->\n                        ( Field.updateStringValue (removeVowels str) field\n                        , succeed (removeVowels str)\n                        )\n                    )\n            )\n        --> Ok \"th qck fx jmps vr th lzy dg\"\n        -- And input field displays: \"th qck fx jmps vr th lzy dg\"\n\n","type":"(FormToolkit.Field.Field id -> a -> ( FormToolkit.Field.Field id, FormToolkit.Parse.Parser id b )) -> FormToolkit.Parse.Parser id a -> FormToolkit.Parse.Parser id b"},{"name":"bool","comment":" Parses the input value as a `Bool`.\n\n    import FormToolkit.Field as Field\n    import FormToolkit.Value as Value\n\n    Field.text [ Field.value (Value.bool True) ]\n        |> parse bool\n        --> Ok True\n\n","type":"FormToolkit.Parse.Parser id Basics.Bool"},{"name":"email","comment":" ","type":"FormToolkit.Parse.Parser id String.String"},{"name":"fail","comment":" A parser that always fails with a custom error.\n","type":"String.String -> FormToolkit.Parse.Parser id a"},{"name":"field","comment":" Parse for a field with the given identifier using a provided parser.\n\n    import FormToolkit.Field as Field exposing (Field)\n    import FormToolkit.Value as Value\n\n    type Fields\n        = FirstName\n        | LastName\n\n    fields : Field Fields\n    fields =\n        Field.group []\n            [ Field.text\n                [ Field.label \"First name\"\n                , Field.identifier FirstName\n                , Field.value (Value.string \"Brian\")\n                ]\n            , Field.text\n                [ Field.label \"Last name\"\n                , Field.identifier LastName\n                , Field.value (Value.string \"Eno\")\n                ]\n            ]\n\n    fields\n        |> parse (field FirstName string)\n    --> Ok \"Brian\"\n\n","type":"id -> FormToolkit.Parse.Parser id a -> FormToolkit.Parse.Parser id a"},{"name":"float","comment":" Parses the input value as a `Float`.\n\n    import FormToolkit.Field as Field\n    import FormToolkit.Value as Value\n\n    Field.text [ Field.value (Value.float 10.5) ]\n        |> parse float\n        --> Ok 10.5\n\n","type":"FormToolkit.Parse.Parser id Basics.Float"},{"name":"formattedString","comment":" Format a string parser with a mask pattern, updating the field's display value and cursor position.\n\n    import FormToolkit.Field as Field\n    import FormToolkit.Value as Value\n\n    Field.text [ Field.value (Value.string \"1234567890123456\") ]\n        |> parse (formattedString \"{d}{d}{d}{d} {d}{d}{d}{d} {d}{d}{d}{d} {d}{d}{d}{d}\")\n        --> Ok \"1234 5678 9012 3456\"\n        -- And input field displays: \"1234 5678 9012 3456\"\n\n","type":"String.String -> FormToolkit.Parse.Parser id String.String"},{"name":"int","comment":" Parses the input value as an `Int`.\n\n    import FormToolkit.Field as Field\n    import FormToolkit.Value as Value\n\n    Field.text [ Field.value (Value.int 10) ]\n        |> parse int\n        --> Ok 10\n\n","type":"FormToolkit.Parse.Parser id Basics.Int"},{"name":"json","comment":" Converts the entire input tree into a JSON\n[Value](https://package.elm-lang.org/packages/elm/json/latest/Json-Encode#Value).\nField `name` property will be used as the key, if an input name is not present\nthe parser will fail.\n\nUseful if you just want to forward the form values to a backend.\n\n    import FormToolkit.Field as Field\n    import FormToolkit.Value as Value\n    import Json.Encode\n\n    Field.group [ ]\n        [ Field.text\n            [ Field.label \"First name\"\n            , Field.name \"first-name\"\n            , Field.value (Value.string \"Brian\")\n            ]\n        , Field.text\n            [ Field.label \"Last name\"\n            , Field.name \"last-name\"\n            , Field.value (Value.string \"Eno\")\n            ]\n        , Field.repeatable [ Field.name \"fruits\" ]\n            (Field.text [ Field.name \"fruit\" ])\n            [ Field.updateAttribute (Field.stringValue \"mango\")\n            , Field.updateAttribute (Field.stringValue \"banana\")\n            ]\n        ]\n        |> parse json\n        |> Result.map (Json.Encode.encode 0)\n        --> Ok \"{\\\"first-name\\\":\\\"Brian\\\",\\\"last-name\\\":\\\"Eno\\\",\\\"fruits\\\":[{\\\"fruit\\\":\\\"mango\\\"},{\\\"fruit\\\":\\\"banana\\\"}]}\"\n\n","type":"FormToolkit.Parse.Parser id Json.Decode.Value"},{"name":"list","comment":" Parses a list of inputs using the given parser.\n\n    import FormToolkit.Field as Field\n    import FormToolkit.Value as Value\n\n    Field.repeatable [ ]\n        (Field.text [ ])\n        [ Field.updateAttribute (Field.stringValue \"mango\")\n        , Field.updateAttribute (Field.stringValue \"banana\")\n        ]\n        |> parse (list string)\n        --> Ok [ \"mango\", \"banana\" ]\n\n","type":"FormToolkit.Parse.Parser id a -> FormToolkit.Parse.Parser id (List.List a)"},{"name":"map","comment":" Transforms the result of a parser using a function.\n\n    import FormToolkit.Field as Field\n    import FormToolkit.Value as Value\n\n    Field.text [ Field.value (Value.string \"a string\") ]\n        |> parse (map String.toUpper string)\n        --> Ok \"A STRING\"\n\n","type":"(a -> b) -> FormToolkit.Parse.Parser id a -> FormToolkit.Parse.Parser id b"},{"name":"map2","comment":" Combines two parsers using a function.\n\n    import FormToolkit.Field as Field\n    import FormToolkit.Value as Value\n\n    Field.group []\n        [ Field.text\n            [ Field.identifier \"FirstName\"\n            , Field.value (Value.string \"Iris\")\n            ]\n        , Field.text\n            [ Field.identifier \"LastName\"\n            , Field.value (Value.string \"Hefets\")\n            ]\n        ]\n        |> parse\n            (map2 Tuple.pair\n                (field \"FirstName\" string)\n                (field \"LastName\" string)\n            )\n        --> Ok ( \"Iris\", \"Hefets\" )\n\n","type":"(a -> b -> c) -> FormToolkit.Parse.Parser id a -> FormToolkit.Parse.Parser id b -> FormToolkit.Parse.Parser id c"},{"name":"map3","comment":" Combines three parsers using a function.\n\n    import FormToolkit.Field as Field exposing (Field)\n    import FormToolkit.Value as Value\n\n    type alias Person =\n        { firstName : String\n        , lastName : String\n        , age : Int\n        }\n\n    personParse : Parser String Person\n    personParse =\n        map3 Person\n            (field \"FirstName\" string)\n            (field \"LastName\" string)\n            (field \"Age\" int)\n\n    fields : Field String\n    fields =\n        Field.group []\n            [ Field.text\n                [ Field.identifier \"FirstName\"\n                , Field.value (Value.string \"Penny\")\n                ]\n            , Field.text\n                [ Field.identifier \"LastName\"\n                , Field.value (Value.string \"Rimbaud\")\n                ]\n            , Field.int\n                [ Field.identifier \"Age\"\n                , Field.value (Value.int 81)\n                ]\n            ]\n\n    fields\n        |> parse personParse\n    --> Ok { firstName = \"Penny\", lastName = \"Rimbaud\", age = 81 }\n\n","type":"(a -> b -> c -> out) -> FormToolkit.Parse.Parser id a -> FormToolkit.Parse.Parser id b -> FormToolkit.Parse.Parser id c -> FormToolkit.Parse.Parser id out"},{"name":"map4","comment":" ","type":"(a -> b -> c -> d -> out) -> FormToolkit.Parse.Parser id a -> FormToolkit.Parse.Parser id b -> FormToolkit.Parse.Parser id c -> FormToolkit.Parse.Parser id d -> FormToolkit.Parse.Parser id out"},{"name":"map5","comment":" ","type":"(a -> b -> c -> d -> e -> out) -> FormToolkit.Parse.Parser id a -> FormToolkit.Parse.Parser id b -> FormToolkit.Parse.Parser id c -> FormToolkit.Parse.Parser id d -> FormToolkit.Parse.Parser id e -> FormToolkit.Parse.Parser id out"},{"name":"map6","comment":" ","type":"(a -> b -> c -> d -> e -> f -> out) -> FormToolkit.Parse.Parser id a -> FormToolkit.Parse.Parser id b -> FormToolkit.Parse.Parser id c -> FormToolkit.Parse.Parser id d -> FormToolkit.Parse.Parser id e -> FormToolkit.Parse.Parser id f -> FormToolkit.Parse.Parser id out"},{"name":"map7","comment":" ","type":"(a -> b -> c -> d -> e -> f -> g -> out) -> FormToolkit.Parse.Parser id a -> FormToolkit.Parse.Parser id b -> FormToolkit.Parse.Parser id c -> FormToolkit.Parse.Parser id d -> FormToolkit.Parse.Parser id e -> FormToolkit.Parse.Parser id f -> FormToolkit.Parse.Parser id g -> FormToolkit.Parse.Parser id out"},{"name":"map8","comment":" ","type":"(a -> b -> c -> d -> e -> f -> g -> h -> out) -> FormToolkit.Parse.Parser id a -> FormToolkit.Parse.Parser id b -> FormToolkit.Parse.Parser id c -> FormToolkit.Parse.Parser id d -> FormToolkit.Parse.Parser id e -> FormToolkit.Parse.Parser id f -> FormToolkit.Parse.Parser id g -> FormToolkit.Parse.Parser id h -> FormToolkit.Parse.Parser id out"},{"name":"maybe","comment":" Allows dealing with blank values without producing an error.\n\n    import FormToolkit.Field as Field\n    import FormToolkit.Value as Value\n\n    Field.text [ Field.value (Value.string \"A string\") ]\n        |> parse (maybe string)\n        --> Ok (Just \"A string\")\n\n    Field.text []\n        |> parse (maybe string)\n        --> Ok Nothing\n\n","type":"FormToolkit.Parse.Parser id a -> FormToolkit.Parse.Parser id (Maybe.Maybe a)"},{"name":"oneOf","comment":" Tries a list of parsers in order until one succeeds.\n\n    import FormToolkit.Field as Field\n    import FormToolkit.Value as Value\n\n    Field.text [ Field.value (Value.string \"success!\") ]\n        |> parse (oneOf [ fail \"not really ;)\", string ])\n        --> Ok \"success!\"\n\n\n    Field.text [ Field.value (Value.string \"success!\") ]\n        |> parse (oneOf [ string, fail \"not really ;)\" ])\n        --> Ok \"success!\"\n\n","type":"List.List (FormToolkit.Parse.Parser id a) -> FormToolkit.Parse.Parser id a"},{"name":"parse","comment":" Parses an input.\n\n    import FormToolkit.Field as Field exposing (Field)\n    import FormToolkit.Value as Value\n\n    Field.text\n        [ Field.value (Value.string \"A string\")\n        , Field.required True\n        ]\n        |> parse string\n    --> Ok \"A string\"\n\n","type":"FormToolkit.Parse.Parser id a -> FormToolkit.Field.Field id -> Result.Result (FormToolkit.Error.Error id) a"},{"name":"parseUpdate","comment":" Updates an input with a message and parses it.\n\n    import FormToolkit.Field as Field exposing (Field)\n    import FormToolkit.Value as Value\n\n    Field.text\n        [ Field.value (Value.string \"A string\")\n        , Field.required True\n        ]\n        |> parse string\n    --> Ok \"A string\"\n\n","type":"FormToolkit.Parse.Parser id a -> FormToolkit.Field.Msg id -> FormToolkit.Field.Field id -> ( FormToolkit.Field.Field id, Result.Result (FormToolkit.Error.Error id) a )"},{"name":"parseValidate","comment":" Parses an input and updates the tree revealing errors.\n\n    import FormToolkit.Field as Field exposing (Field)\n    import FormToolkit.Value as Value\n\n    Field.text\n        [ Field.value (Value.string \"A string\")\n        , Field.required True\n        ]\n        |> parseValidate string\n        |> Tuple.second\n    -->  Ok \"A string\"\n\n","type":"FormToolkit.Parse.Parser id a -> FormToolkit.Field.Field id -> ( FormToolkit.Field.Field id, Result.Result (FormToolkit.Error.Error id) a )"},{"name":"posix","comment":" Parses the input value as a\n[Time.Posix](https://package.elm-lang.org/packages/elm/time/latest/Time#Posix).\n","type":"FormToolkit.Parse.Parser id Time.Posix"},{"name":"string","comment":" Parses the input value as a `String`.\n\n    import FormToolkit.Field as Field\n    import FormToolkit.Value as Value\n\n    Field.text [ Field.value (Value.string \"A string\") ]\n        |> parse string\n        --> Ok \"A string\"\n\n","type":"FormToolkit.Parse.Parser id String.String"},{"name":"stringLenient","comment":" Parses the input value as a `String` for strictAutocomplete, even when\nthe text doesn't match an option.\n","type":"FormToolkit.Parse.Parser id String.String"},{"name":"succeed","comment":" A parser that always succeeds with the given value, use for buiding\ndecoding pipelines with [andMap](#andMap), or to chain parsers with\n[andThen](#andThen).\n\n    import FormToolkit.Field as Field\n    import FormToolkit.Value as Value\n\n    type Special\n        = SpecialValue\n\n    specialParse : Parser id Special\n    specialParse =\n        string\n            |> andThen\n                (\\strValue ->\n                    if strValue == \"special\" then\n                        succeed SpecialValue\n\n                    else\n                        fail \"Nothing special\"\n                )\n\n\n    Field.text [ Field.value (Value.string \"special\") ]\n        |> parse specialParse\n        --> Ok SpecialValue\n\n","type":"a -> FormToolkit.Parse.Parser id a"},{"name":"value","comment":" Returns the raw value of the input without any decoding.\n\n    import FormToolkit.Field as Field\n    import FormToolkit.Value as Value\n\n    Field.text [ Field.value (Value.string \"A string\") ]\n        |> parse value\n        --> Ok (Value.string \"A string\")\n\n","type":"FormToolkit.Parse.Parser id FormToolkit.Value.Value"}],"binops":[]},{"name":"FormToolkit.Value","comment":" Value is used to set default input values of type either string, integer,\nfloat, boolean, date, month, time, or json.\n\n\n# Init\n\n@docs Value\n@docs string, int, float, bool, blank\n@docs date, month, time\n\n\n# Convert\n\n@docs toString, toBool, toFloat, toInt, toPosix\n\n","unions":[{"name":"Value","comment":" ","args":[],"cases":[["Value",["Internal.Value.Value"]]]}],"aliases":[],"values":[{"name":"blank","comment":" ","type":"FormToolkit.Value.Value"},{"name":"bool","comment":" ","type":"Basics.Bool -> FormToolkit.Value.Value"},{"name":"date","comment":" ","type":"Time.Posix -> FormToolkit.Value.Value"},{"name":"float","comment":" ","type":"Basics.Float -> FormToolkit.Value.Value"},{"name":"int","comment":" ","type":"Basics.Int -> FormToolkit.Value.Value"},{"name":"month","comment":" ","type":"Time.Posix -> FormToolkit.Value.Value"},{"name":"string","comment":" ","type":"String.String -> FormToolkit.Value.Value"},{"name":"time","comment":" ","type":"Time.Posix -> FormToolkit.Value.Value"},{"name":"toBool","comment":" Convert boolean values to `Bool`.\n\n    toBool (bool True) == Just True\n\n    toBool (string \"True\") == Nothing\n\n","type":"FormToolkit.Value.Value -> Maybe.Maybe Basics.Bool"},{"name":"toFloat","comment":" Convert float values to `Float`.\n\n    toFloat (float 3.14) == Just 3.14\n\n    toFloat (string \"3.14\") == Nothing\n\n","type":"FormToolkit.Value.Value -> Maybe.Maybe Basics.Float"},{"name":"toInt","comment":" Convert int values to `Int`.\n\n    toInt (int 42) == Just 42\n\n    toInt (string \"42\") == Nothing\n\n","type":"FormToolkit.Value.Value -> Maybe.Maybe Basics.Int"},{"name":"toPosix","comment":" Convert posix values to `Posix`.\n\n    toPosix (time (Time.millisToPosix 0))\n        == Just (Time.millisToPosix 0)\n\n    toPosix blank == Nothing\n\n","type":"FormToolkit.Value.Value -> Maybe.Maybe Time.Posix"},{"name":"toString","comment":" All values except for blank have a string representation.\n\n    toString (string \"Hello\") == Just \"Hello\"\n\n    toString (int 42) == Just \"42\"\n\n    toString blank == Nothing\n\n","type":"FormToolkit.Value.Value -> Maybe.Maybe String.String"}],"binops":[]},{"name":"FormToolkit.View","comment":"\n\n\n# View\n\n@docs View, fromField, toHtml\n@docs partial\n\n\n# View customizations\n\n@docs customizeErrors, customizeFields\n@docs customizeGroups, customizeRepeatableFields, customizeRepeatingFieldTemplates\n\n\n# Field attributes\n\n@docs FieldAttributes, FieldType, Status\n\n","unions":[{"name":"FieldType","comment":" ","args":[],"cases":[["Text",[]],["TextArea",[]],["Email",[]],["Password",[]],["StrictAutocomplete",[]],["Integer",[]],["Float",[]],["Month",[]],["Date",[]],["LocalDatetime",[]],["Select",[]],["Radio",[]],["Checkbox",[]],["Group",[]],["Repeatable",[]]]},{"name":"Status","comment":" ","args":[],"cases":[["Pristine",[]],["Focused",[]],["Editing",[]],["Touched",[]]]},{"name":"View","comment":" A view is a way to configure the generated markup for an `Field` or group\nof fields.\n","args":["id","msg"],"cases":[]}],"aliases":[{"name":"FieldAttributes","comment":" ","args":["id"],"type":"{ fieldType : FormToolkit.View.FieldType, name : Maybe.Maybe String.String, value : FormToolkit.Value.Value, isRequired : Basics.Bool, label : Maybe.Maybe String.String, placeholder : Maybe.Maybe String.String, hint : Maybe.Maybe String.String, min : FormToolkit.Value.Value, max : FormToolkit.Value.Value, step : FormToolkit.Value.Value, autogrow : Basics.Bool, options : List.List ( String.String, FormToolkit.Value.Value ), identifier : Maybe.Maybe id, status : FormToolkit.View.Status, repeatableMin : Basics.Int, repeatableMax : Maybe.Maybe Basics.Int, addFieldsButtonCopy : String.String, removeFieldsButtonCopy : String.String, errors : List.List (FormToolkit.Error.Error id), classList : List.List String.String, selectionStart : Basics.Int, selectionEnd : Basics.Int, disabled : Basics.Bool, hidden : Basics.Bool, pattern : List.List Internal.Utils.MaskToken }"}],"values":[{"name":"customizeErrors","comment":" Customizes how the error messages are displayed, to be used for i18n errors.\nThe function receives field attributes including all errors for the field.\nIt's possible to override error messages for all fields, individual fields,\nor fields of a certain type.\n\nSee [FieldAttributes](#FieldAttributes) for all the available field attributes.\n\n    type Fields\n        = Name\n        | Temperature\n        | Flavour\n\n    view : View Fields val ()\n    view =\n        Field.group []\n            [ Field.text\n                [ Field.label \"Name\"\n                , Field.identifier Name\n                , Field.required\n                ]\n            , Field.text\n                [ Field.label \"Temperature\"\n                , Field.identifier Temperature\n                , Field.min 20\n                , Field.max 35\n                , Field.required\n                ]\n            , Field.select\n                [ Field.label \"Flavour\"\n                , Field.identifier Flavour\n                , Field.required\n                , Field.options\n                    [ ( \"Banana\", Value.string \"banana\" )\n                    , ( \"Strawbery\", Value.string \"strawberry\" )\n                    , ( \"Chocolate\", Value.string \"chocolate\" )\n                    ]\n                ]\n            ]\n            |> View.fromField (always ())\n            |> View.customizeErrors\n                (\\attributes ->\n                    let\n                        toString =\n                            Value.toString >> Maybe.withDefault \"\"\n\n                        errorToString error =\n                            case ( attributes.inputType, error ) of\n                                ( _, ValueTooLarge _ data ) ->\n                                    toString data.max ++ \" is too high\"\n\n                                ( _, ValueTooSmall _ data ) ->\n                                    toString data.min ++ \" is too low\"\n\n                                ( _, ValueNotInRange _ data ) ->\n                                    \"Make it in between \" ++ toString data.min ++ \" and \" ++ toString data.max\n\n                                ( Select, IsBlank _ ) ->\n                                    \"Make up your mind\"\n\n                                ( _, IsBlank (Just Name) ) ->\n                                    \"Who are you?\"\n\n                                ( _, IsBlank _ ) ->\n                                    \"You forgot to fill in this\"\n\n                                ( _, CustomError _ message ) ->\n                                    message\n\n                                _ ->\n                                    \"Humm...?\"\n                    in\n                    attributes.errors\n                        |> List.map errorToString\n                        |> String.join \", \"\n                )\n\n","type":"(FormToolkit.View.FieldAttributes id -> String.String) -> FormToolkit.View.View id msg -> FormToolkit.View.View id msg"},{"name":"customizeFields","comment":" Provide a function to override the rendering of a field.\n\nThe function receives a configuration record with pre-rendered HTML elements\nand field attributes, and should return `Just (Html msg)` for custom rendering\nor `Nothing` to use the default rendering.\n\nThe `labelHtml`, `fieldHtml`, and `hintHtml` functions take a list of `Html.Attribute msg`\nto allow customization of the rendered elements.\n\nUse `attributes` to access field properties like `identifier` for pattern\nmatching on specific fields. See [FieldAttributes](#FieldAttributes) for all the\navaiable field attributes.\n\nThe example below shows custom rendering for a specific field identifier:\n\n    view : View id val ()\n    view =\n        Field.text\n            [ Field.label \"Name\"\n            , Field.identifier MyField\n            ]\n            |> View.fromField (always ())\n            |> customizeFields\n                (\\{ attributes, labelHtml, fieldHtml, hintHtml, errors } ->\n                    case attributes.identifier of\n                        Just MyField ->\n                            -- Custom rendering for MyField\n                            Just\n                                (Html.div\n                                    [ Attributes.class \"field\" ]\n                                    [ labelHtml [ Attributes.class \"custom-label\" ]\n                                    , Html.div\n                                        [ Attributes.class \"input-wrapper\" ]\n                                        [ fieldHtml []\n                                        , hintHtml []\n                                        ]\n                                    ]\n                                )\n\n                        _ ->\n                            -- Use default rendering for other fields\n                            Nothing\n                )\n\n","type":"({ labelHtml : List.List (Html.Attribute msg) -> Html.Html msg, fieldHtml : List.List (Html.Attribute msg) -> Html.Html msg, hintHtml : List.List (Html.Attribute msg) -> Html.Html msg, errors : List.List String.String, class : String.String, attributes : FormToolkit.View.FieldAttributes id, inputOnChange : FormToolkit.Value.Value -> { selectionStart : Basics.Int, selectionEnd : Basics.Int } -> msg, inputOnCheck : Basics.Bool -> msg, inputOnBlur : msg, inputOnFocus : msg } -> Maybe.Maybe (Html.Html msg)) -> FormToolkit.View.View id msg -> FormToolkit.View.View id msg"},{"name":"customizeGroups","comment":" Provide a function to customize the rendering of a group of fields.\n\n    view : View id val ()\n    view =\n        Field.group []\n            [ Field.text [ Field.label \"Name\" ]\n            , Field.text [ Field.label \"Last Name\" ]\n            ]\n            |> View.fromField (always ())\n            |> customizeField\n                (\\{ fields, legendText } ->\n                    Html.fieldset\n                        [ Html.Attribute.class \"field-group\" ]\n                        ((case legendText of\n                            Just str ->\n                                Html.legend [] [ Html.text str ]\n\n                            Nothing ->\n                                Html.text \"\"\n                         )\n                            :: fields\n                        )\n                )\n\n","type":"({ legendText : Maybe.Maybe String.String, fields : List.List (Html.Html msg), identifier : Maybe.Maybe id, errors : List.List String.String, class : String.String } -> Html.Html msg) -> FormToolkit.View.View id msg -> FormToolkit.View.View id msg"},{"name":"customizeRepeatableFields","comment":" Customize the positioning, and appearance of each of the inputs of a repeatable\ngroup of inputs and the and the button to add new inputs.\n\nThe `addFieldsButton` function takes a list of `Html.Attribute msg` to allow\ncustomization of the button element.\n\nTo customize the template used to add a new input see\n[customizeRepeatingFieldTemplates](#customizeRepeatingFieldTemplates).\n\n    view : View String val ()\n    view =\n        Field.repeatable [ Field.identifier \"People\" ]\n            (Field.group []\n                [ [ Field.text [ Field.label \"Name\" ]\n                  , Field.text [ Field.label \"Last Name\" ]\n                  ]\n                ]\n            )\n            []\n            |> View.fromField (always ())\n            |> customizeRepeatableFields\n                (\\{ legendText, fields, addFieldsButton } ->\n                    Html.fieldset []\n                        [ case legendText of\n                            Just str ->\n                                Html.legend [] [ Html.text str ]\n\n                            Nothing ->\n                                Html.text \"\"\n                        , Html.div [] fields\n                        , addFieldsButton []\n                        ]\n                )\n\n","type":"({ legendText : Maybe.Maybe String.String, fields : List.List (Html.Html msg), addFieldsButton : List.List (Html.Attribute msg) -> Html.Html msg, errors : List.List String.String, class : String.String, identifier : Maybe.Maybe id, addFieldsButtonOnClick : Maybe.Maybe msg, addFieldsButtonCopy : String.String } -> Html.Html msg) -> FormToolkit.View.View id msg -> FormToolkit.View.View id msg"},{"name":"customizeRepeatingFieldTemplates","comment":" Customize the rendering of each of the elements of a repeatable group of\ninputs.\n\nThe `removeFieldsButton` function takes a list of `Html.Attribute msg` to allow\ncustomization of the button element.\n\nTo customize the group of inputs see\n[customizeRepeatableFields](#customizeRepeatableFields).\n\n    view : View String val ()\n    view =\n        Field.repeatable [ Field.identifier \"People\" ]\n            (Field.group []\n                [ [ Field.text [ Field.label \"Name\" ]\n                  , Field.text [ Field.label \"Last Name\" ]\n                  ]\n                ]\n            )\n            []\n            |> View.fromField (always ())\n            |> customizeRepeatingFieldTemplates\n                (\\{ fieldHtml, removeFieldsButton } ->\n                    Html.div\n                        [ Attributes.class \"group-repeat\" ]\n                        [ fieldHtml, removeFieldsButton [] ]\n                )\n\n","type":"({ fieldHtml : Html.Html msg, removeFieldsButton : List.List (Html.Attribute msg) -> Html.Html msg, identifier : Maybe.Maybe id, index : Basics.Int, removeFieldsButtonOnClick : Maybe.Maybe msg, removeFieldsButtonCopy : String.String } -> Html.Html msg) -> FormToolkit.View.View id msg -> FormToolkit.View.View id msg"},{"name":"fromField","comment":" Construct a view from an `Field`.\n\n    view : Html (Never -> a)\n    view =\n        Field.group []\n            [ Field.text [ Field.label \"First Name\" ]\n            , Field.text [ Field.label \"Last Name\" ]\n            ]\n            |> View.fromField (always never)\n            |> View.toHtml\n\n","type":"(FormToolkit.Field.Msg id -> msg) -> FormToolkit.Field.Field id -> FormToolkit.View.View id msg"},{"name":"partial","comment":" A partial view referenced by `identifier`.\nMaybe you want to render segments of the same form in different UI sections.\n\n    Field.group []\n        [ Field.text\n            [ Field.identifier \"FirstName\"\n            , Field.label \"First Name\"\n            ]\n        , Field.text\n            [ Field.identifier \"LastName\"\n            , Field.label \"Last Name\"\n            ]\n        ]\n        |> View.fromField (always never)\n        |> View.partial \"FirstName\"\n        == Just\n            (Field.text\n                [ Field.identifier \"FirstName\"\n                , Field.label \"First Name\"\n                ]\n            )\n\n","type":"id -> FormToolkit.View.View id msg -> Maybe.Maybe (FormToolkit.View.View id msg)"},{"name":"toHtml","comment":" Render a view\n","type":"FormToolkit.View.View id msg -> Html.Html msg"}],"binops":[]}]