defmodule VoidableUI.Components do @moduledoc """ HEEx function components for all Voidable web components. Each function component renders the corresponding `` custom element tag. Interactive components include `phx-hook="VoidEvent"` and `data-void-events` attributes to bridge CustomEvents to LiveView's `pushEvent`. """ use Phoenix.Component defp unique_id, do: System.unique_integer([:positive]) |> Integer.to_string() # --------------------------------------------------------------------------- # Badge (static) # --------------------------------------------------------------------------- @doc "Renders a `` status badge." attr :color, :string, default: nil attr :size, :string, default: nil attr :rest, :global slot :inner_block, required: true def badge(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Button (interactive — void-click) # --------------------------------------------------------------------------- @doc "Renders a `` element." attr :id, :string, default: nil attr :variant, :string, default: nil attr :color, :string, default: nil attr :disabled, :boolean, default: false attr :type, :string, default: nil attr :size, :string, default: nil attr :rest, :global slot :inner_block, required: true def button(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Divider (static) # --------------------------------------------------------------------------- @doc "Renders a `` separator." attr :label, :string, default: nil attr :orientation, :string, default: nil attr :rest, :global def divider(assigns) do ~H""" """ end # --------------------------------------------------------------------------- # Spinner (static) # --------------------------------------------------------------------------- @doc "Renders a `` loading indicator." attr :size, :string, default: nil attr :label, :string, default: nil attr :rest, :global def spinner(assigns) do ~H""" """ end # --------------------------------------------------------------------------- # Skeleton (static) # --------------------------------------------------------------------------- @doc "Renders a `` placeholder." attr :variant, :string, default: nil attr :rest, :global def skeleton(assigns) do ~H""" """ end # --------------------------------------------------------------------------- # StatusDot (static) # --------------------------------------------------------------------------- @doc "Renders a `` indicator." attr :status, :string, default: nil attr :rest, :global def status_dot(assigns) do ~H""" """ end # --------------------------------------------------------------------------- # Switch (interactive — void-change) # --------------------------------------------------------------------------- @doc "Renders a `` toggle." attr :id, :string, default: nil attr :checked, :boolean, default: false attr :disabled, :boolean, default: false attr :color, :string, default: nil attr :size, :string, default: nil attr :rest, :global def switch(assigns) do ~H""" """ end # --------------------------------------------------------------------------- # Avatar (static) # --------------------------------------------------------------------------- @doc "Renders a `` user avatar." attr :src, :string, default: nil attr :alt, :string, default: nil attr :initials, :string, default: nil attr :size, :string, default: nil attr :rest, :global def avatar(assigns) do ~H""" """ end # --------------------------------------------------------------------------- # Alert (interactive — void-dismiss when dismissible) # --------------------------------------------------------------------------- @doc "Renders a `` message." attr :id, :string, default: nil attr :color, :string, default: nil attr :dismissible, :boolean, default: false attr :variant, :string, default: nil attr :rest, :global slot :inner_block, required: true def alert(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Tag (interactive when removable — void-remove) # --------------------------------------------------------------------------- @doc "Renders a `` label." attr :id, :string, default: nil attr :color, :string, default: nil attr :removable, :boolean, default: false attr :size, :string, default: nil attr :rest, :global slot :inner_block, required: true def tag(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Progress (static) # --------------------------------------------------------------------------- @doc "Renders a `` bar." attr :value, :integer, default: nil attr :max, :integer, default: nil attr :color, :string, default: nil attr :size, :string, default: nil attr :indeterminate, :boolean, default: false attr :rest, :global def progress(assigns) do ~H""" """ end # --------------------------------------------------------------------------- # Panel (static) # --------------------------------------------------------------------------- @doc "Renders a `` container." attr :label, :string, default: nil attr :variant, :string, default: nil attr :rest, :global slot :inner_block, required: true def panel(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Input (interactive — void-input, void-change) # --------------------------------------------------------------------------- @doc "Renders a `` text field." attr :id, :string, default: nil attr :type, :string, default: nil attr :value, :string, default: nil attr :placeholder, :string, default: nil attr :disabled, :boolean, default: false attr :readonly, :boolean, default: false attr :required, :boolean, default: false attr :name, :string, default: nil attr :size, :string, default: nil attr :error, :string, default: nil attr :rest, :global def input(assigns) do ~H""" """ end # --------------------------------------------------------------------------- # Textarea (interactive — void-input, void-change) # --------------------------------------------------------------------------- @doc "Renders a `` multi-line text field." attr :id, :string, default: nil attr :value, :string, default: nil attr :placeholder, :string, default: nil attr :disabled, :boolean, default: false attr :readonly, :boolean, default: false attr :required, :boolean, default: false attr :name, :string, default: nil attr :rows, :integer, default: nil attr :resize, :string, default: nil attr :size, :string, default: nil attr :error, :string, default: nil attr :rest, :global def textarea(assigns) do ~H""" """ end # --------------------------------------------------------------------------- # Select (interactive — void-change) # --------------------------------------------------------------------------- @doc "Renders a `` dropdown." attr :id, :string, default: nil attr :value, :string, default: nil attr :disabled, :boolean, default: false attr :required, :boolean, default: false attr :name, :string, default: nil attr :size, :string, default: nil attr :error, :string, default: nil attr :placeholder, :string, default: nil attr :rest, :global slot :inner_block, required: true def select(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Checkbox (interactive — void-change) # --------------------------------------------------------------------------- @doc "Renders a `` toggle." attr :id, :string, default: nil attr :checked, :boolean, default: false attr :disabled, :boolean, default: false attr :indeterminate, :boolean, default: false attr :name, :string, default: nil attr :value, :string, default: nil attr :color, :string, default: nil attr :size, :string, default: nil attr :rest, :global slot :inner_block def checkbox(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Radio (interactive — void-change) # --------------------------------------------------------------------------- @doc "Renders a `` button." attr :id, :string, default: nil attr :checked, :boolean, default: false attr :disabled, :boolean, default: false attr :name, :string, default: nil attr :value, :string, default: nil attr :color, :string, default: nil attr :size, :string, default: nil attr :rest, :global slot :inner_block def radio(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # RadioGroup (interactive — void-change) # --------------------------------------------------------------------------- @doc "Renders a `` container." attr :id, :string, default: nil attr :label, :string, default: nil attr :value, :string, default: nil attr :name, :string, default: nil attr :orientation, :string, default: nil attr :rest, :global slot :inner_block, required: true def radio_group(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Field (wraps interactive children) # --------------------------------------------------------------------------- @doc "Renders a `` form field wrapper." attr :label, :string, default: nil attr :error, :string, default: nil attr :helper, :string, default: nil attr :required, :boolean, default: false attr :rest, :global slot :inner_block, required: true def field(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Option (static — child of multiselect/combobox) # --------------------------------------------------------------------------- @doc "Renders a `` inside a multiselect or combobox." attr :value, :string, required: true attr :selected, :boolean, default: false attr :rest, :global slot :inner_block, required: true def option(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Multiselect (interactive — void-change) # --------------------------------------------------------------------------- @doc "Renders a `` multi-value dropdown." attr :id, :string, default: nil attr :placeholder, :string, default: nil attr :disabled, :boolean, default: false attr :size, :string, default: nil attr :error, :string, default: nil attr :name, :string, default: nil attr :rest, :global slot :inner_block, required: true def multiselect(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Dialog (interactive — void-close) # --------------------------------------------------------------------------- @doc "Renders a `` modal." attr :id, :string, default: nil attr :open, :boolean, default: false attr :heading, :string, default: nil attr :size, :string, default: nil attr :closable, :boolean, default: true attr :rest, :global slot :inner_block, required: true def dialog(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Tabs (interactive — void-change) # --------------------------------------------------------------------------- @doc "Renders a `` tab container." attr :id, :string, default: nil attr :value, :string, default: nil attr :size, :string, default: nil attr :rest, :global slot :inner_block, required: true def tabs(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # TabPanel (static) # --------------------------------------------------------------------------- @doc "Renders a `` inside tabs." attr :tab, :string, required: true attr :label, :string, default: nil attr :active, :boolean, default: false attr :rest, :global slot :inner_block, required: true def tab_panel(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Accordion (static — parent container) # --------------------------------------------------------------------------- @doc "Renders a `` container." attr :multiple, :boolean, default: false attr :rest, :global slot :inner_block, required: true def accordion(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # AccordionItem (interactive — void-toggle) # --------------------------------------------------------------------------- @doc "Renders a `` collapsible section." attr :id, :string, default: nil attr :heading, :string, default: nil attr :open, :boolean, default: false attr :rest, :global slot :inner_block, required: true def accordion_item(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Breadcrumbs (static) # --------------------------------------------------------------------------- @doc "Renders a `` navigation trail." attr :separator, :string, default: nil attr :rest, :global slot :inner_block, required: true def breadcrumbs(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # List (static) # --------------------------------------------------------------------------- @doc "Renders a `` container." attr :dividers, :boolean, default: false attr :rest, :global slot :inner_block, required: true def list(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # ListItem (static) # --------------------------------------------------------------------------- @doc "Renders a `` element." attr :selected, :boolean, default: false attr :disabled, :boolean, default: false attr :interactive, :boolean, default: false attr :rest, :global slot :inner_block, required: true def list_item(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Toast (interactive — void-close) # --------------------------------------------------------------------------- @doc "Renders a `` notification." attr :id, :string, default: nil attr :color, :string, default: nil attr :duration, :integer, default: nil attr :dismissable, :boolean, default: true attr :heading, :string, default: nil attr :rest, :global slot :inner_block, required: true def toast(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # ToastContainer (static — programmatic) # --------------------------------------------------------------------------- @doc "Renders a `` positioning wrapper." attr :position, :string, default: nil attr :rest, :global slot :inner_block def toast_container(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Stepper (static) # --------------------------------------------------------------------------- @doc "Renders a `` progress indicator." attr :value, :integer, default: nil attr :steps, :string, default: nil attr :rest, :global def stepper(assigns) do ~H""" """ end # --------------------------------------------------------------------------- # Drawer (interactive — void-close) # --------------------------------------------------------------------------- @doc "Renders a `` slide-out panel." attr :id, :string, default: nil attr :open, :boolean, default: false attr :side, :string, default: nil attr :size, :string, default: nil attr :heading, :string, default: nil attr :closable, :boolean, default: true attr :rest, :global slot :inner_block, required: true def drawer(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Card (static) # --------------------------------------------------------------------------- @doc "Renders a `` container." attr :heading, :string, default: nil attr :variant, :string, default: nil attr :padding, :string, default: nil attr :rest, :global slot :inner_block, required: true def card(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Popover (interactive — void-close) # --------------------------------------------------------------------------- @doc "Renders a `` floating panel." attr :id, :string, default: nil attr :open, :boolean, default: false attr :position, :string, default: nil attr :trigger, :string, default: nil attr :rest, :global slot :inner_block, required: true def popover(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Tooltip (static — hover-based, no server events) # --------------------------------------------------------------------------- @doc "Renders a `` hover tip." attr :text, :string, default: nil attr :position, :string, default: nil attr :delay, :integer, default: nil attr :rest, :global slot :inner_block, required: true def tooltip(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Banner (static) # --------------------------------------------------------------------------- @doc "Renders a `` announcement." attr :color, :string, default: nil attr :dismissable, :boolean, default: false attr :variant, :string, default: nil attr :rest, :global slot :inner_block, required: true def banner(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # ScrollArea (static) # --------------------------------------------------------------------------- @doc "Renders a `` scrollable container." attr :max_height, :string, default: nil attr :direction, :string, default: nil attr :rest, :global slot :inner_block, required: true def scroll_area(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Table (static) # --------------------------------------------------------------------------- @doc "Renders a `` wrapper." attr :striped, :boolean, default: false attr :hoverable, :boolean, default: false attr :compact, :boolean, default: false attr :bordered, :boolean, default: false attr :rest, :global slot :inner_block, required: true def table(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Pagination (interactive — void-change) # --------------------------------------------------------------------------- @doc "Renders a `` page navigator." attr :id, :string, default: nil attr :total, :integer, default: nil attr :value, :integer, default: nil attr :siblings, :integer, default: nil attr :size, :string, default: nil attr :rest, :global def pagination(assigns) do ~H""" """ end # --------------------------------------------------------------------------- # ErrorFallback (static) # --------------------------------------------------------------------------- @doc "Renders a `` error display." attr :heading, :string, default: nil attr :message, :string, default: nil attr :retryable, :boolean, default: false attr :retry_label, :string, default: nil attr :icon, :boolean, default: true attr :rest, :global def error_fallback(assigns) do ~H""" """ end # --------------------------------------------------------------------------- # CheckboxGroup (interactive — void-change) # --------------------------------------------------------------------------- @doc "Renders a `` container." attr :id, :string, default: nil attr :label, :string, default: nil attr :orientation, :string, default: nil attr :rest, :global slot :inner_block, required: true def checkbox_group(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Combobox (interactive — void-change) # --------------------------------------------------------------------------- @doc "Renders a `` searchable dropdown." attr :id, :string, default: nil attr :value, :string, default: nil attr :placeholder, :string, default: nil attr :disabled, :boolean, default: false attr :size, :string, default: nil attr :error, :string, default: nil attr :name, :string, default: nil attr :rest, :global slot :inner_block, required: true def combobox(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Slider (interactive — void-input, void-change) # --------------------------------------------------------------------------- @doc "Renders a `` range input." attr :id, :string, default: nil attr :value, :integer, default: nil attr :min, :integer, default: nil attr :max, :integer, default: nil attr :step, :integer, default: nil attr :disabled, :boolean, default: false attr :name, :string, default: nil attr :show_value, :boolean, default: false attr :size, :string, default: nil attr :rest, :global def slider(assigns) do ~H""" """ end # --------------------------------------------------------------------------- # FileUpload (interactive — void-change) # --------------------------------------------------------------------------- @doc "Renders a `` drop zone." attr :id, :string, default: nil attr :accept, :string, default: nil attr :multiple, :boolean, default: false attr :disabled, :boolean, default: false attr :max_size, :integer, default: nil attr :error, :string, default: nil attr :rest, :global def file_upload(assigns) do ~H""" """ end # --------------------------------------------------------------------------- # NavBar (static) # --------------------------------------------------------------------------- @doc "Renders a `` navigation bar." attr :sticky, :boolean, default: false attr :bordered, :boolean, default: true attr :variant, :string, default: nil attr :rest, :global slot :inner_block, required: true def nav_bar(assigns) do ~H""" {render_slot(@inner_block)} """ end # --------------------------------------------------------------------------- # Hamburger (interactive — void-toggle) # --------------------------------------------------------------------------- @doc "Renders a `` menu toggle." attr :id, :string, default: nil attr :active, :boolean, default: false attr :size, :string, default: nil attr :rest, :global def hamburger(assigns) do ~H""" """ end # --------------------------------------------------------------------------- # ComposeInput (interactive — void-input, void-submit) # --------------------------------------------------------------------------- @doc "Renders a `` chat-style input." attr :id, :string, default: nil attr :value, :string, default: nil attr :placeholder, :string, default: nil attr :disabled, :boolean, default: false attr :maxlength, :integer, default: nil attr :rest, :global def compose_input(assigns) do ~H""" """ end end