# Components Library This library only comes with building blocks for your components, and you should built your own form components - or use the provided building blocks directly. Feel free to grab and customize these components to your needs, and treat them as a starting point when building your form builder. The code below is released under public domain: defmodule MyAppWeb.Surface.FormComponents do defmodule Label do use Surface.Component prop(form, :struct, required: true) prop(field, :atom, required: true) prop(text, :string, required: true) prop(required, :boolean, required: false, default: false) def render(assigns) do ~F""" {#if @required} {#else} {/if} """ end end defmodule Errors do use Surface.Component prop(form, :struct, required: true) prop(errors, :map, required: true) prop(field, :atom, required: true) def render(assigns) do ~F""" {#for {_key, message} <- field_errors} {message}
{/for}
""" end end defmodule Input do use Surface.Component alias MyAppWeb.Surface.FormComponents.{Errors, Label} prop(form, :struct, required: true) prop(type, :string, required: true) prop(errors, :map, required: true) prop(field, :atom, required: true) prop(label, :string, required: false) prop(target, :any, required: false, default: nil) prop(options, :list, required: false, default: []) prop(checked_value, :string, required: false, default: "1") prop(unchecked_value, :string, required: false, default: "0") def render(%{type: type} = assigns) when type in ["text", "password", "email", "textarea"] do ~F"""
{#if @label}
""" end def render(%{type: "select", options: _} = assigns) do ~F"""
{#if @label}
""" end def render(%{type: "checkbox", options: _} = assigns) do ~F"""
{#if @label}
""" end defp is_checked?(form, field, checked_value) do Map.get(form, field) == checked_value || Map.get(form, field) == true end defp is_required?(form, field) do validations = Vex.Extract.settings(form) |> Map.get(field, []) {:presence, true} in validations end end end Also see [Spike Example app](https://github.com/hubertlepicki/spike_example) for more examples.