Field

Field - Phlex implementation

Examples

Default

A complete form demonstrating various field types including inputs, checkboxes, select, and grouped fields.

Payment Method
All transactions are secure and encrypted
Enter your 16-digit card number
Billing Address
The billing address associated with your payment method
<div class="w-full max-w-md">
  <%= render "ui/field/group" do %>
    <%= render "ui/field/set" do %>
      <%= render "ui/field/legend" do %>Payment Method<% end %>
      <%= render "ui/field/description" do %>All transactions are secure and encrypted<% end %>
      <%= render "ui/field/group" do %>
        <%= render "ui/field" do %>
          <%= render "ui/label", for_id: "card-name", content: "Name on Card", attributes: { data: { slot: "field-label" } } %>
          <%= render "ui/input", id: "card-name", placeholder: "Evil Rabbit", required: true %>
        <% end %>
        <%= render "ui/field" do %>
          <%= render "ui/label", for_id: "card-number", content: "Card Number", attributes: { data: { slot: "field-label" } } %>
          <%= render "ui/input", id: "card-number", placeholder: "1234 5678 9012 3456", required: true %>
          <%= render "ui/field/description" do %>Enter your 16-digit card number<% end %>
        <% end %>
        <div class="grid grid-cols-3 gap-4">
          <%= render "ui/field" do %>
            <%= render "ui/label", for_id: "exp-month", content: "Month", attributes: { data: { slot: "field-label" } } %>
            <%= render "ui/input", id: "exp-month", placeholder: "MM", required: true %>
          <% end %>
          <%= render "ui/field" do %>
            <%= render "ui/label", for_id: "exp-year", content: "Year", attributes: { data: { slot: "field-label" } } %>
            <%= render "ui/input", id: "exp-year", placeholder: "YYYY", required: true %>
          <% end %>
          <%= render "ui/field" do %>
            <%= render "ui/label", for_id: "cvv", content: "CVV", attributes: { data: { slot: "field-label" } } %>
            <%= render "ui/input", id: "cvv", placeholder: "123", required: true %>
          <% end %>
        </div>
      <% end %>
    <% end %>
    <%= render "ui/field/separator" %>
    <%= render "ui/field/set" do %>
      <%= render "ui/field/legend" do %>Billing Address<% end %>
      <%= render "ui/field/description" do %>The billing address associated with your payment method<% end %>
      <%= render "ui/field/group" do %>
        <%= render "ui/field", orientation: "horizontal" do %>
          <%= render "ui/checkbox", id: "same-shipping", checked: true %>
          <%= render "ui/label", for_id: "same-shipping", content: "Same as shipping address", classes: "font-normal", attributes: { data: { slot: "field-label" } } %>
        <% end %>
      <% end %>
    <% end %>
  <% end %>
</div>

Input

Basic text inputs with labels and helper descriptions.

Choose a unique username for your account.
Must be at least 8 characters long.
<div class="w-full max-w-md">
  <%= render "ui/field/set" do %>
    <%= render "ui/field/group" do %>
      <%= render "ui/field" do %>
        <%= render "ui/label", for_id: "username", content: "Username", attributes: { data: { slot: "field-label" } } %>
        <%= render "ui/input", id: "username", type: "text", placeholder: "Max Leiter" %>
        <%= render "ui/field/description" do %>Choose a unique username for your account.<% end %>
      <% end %>
      <%= render "ui/field" do %>
        <%= render "ui/label", for_id: "password", content: "Password", attributes: { data: { slot: "field-label" } } %>
        <%= render "ui/field/description" do %>Must be at least 8 characters long.<% end %>
        <%= render "ui/input", id: "password", type: "password", placeholder: "••••••••" %>
      <% end %>
    <% end %>
  <% end %>
</div>

Textarea

Multi-line text input with label and description.

Share your thoughts about our service.
<div class="w-full max-w-md">
  <%= render "ui/field/set" do %>
    <%= render "ui/field/group" do %>
      <%= render "ui/field" do %>
        <%= render "ui/label", for_id: "feedback", content: "Feedback", attributes: { data: { slot: "field-label" } } %>
        <%= render "ui/textarea", id: "feedback", placeholder: "Your feedback helps us improve...", rows: 4 %>
        <%= render "ui/field/description" do %>Share your thoughts about our service.<% end %>
      <% end %>
    <% end %>
  <% end %>
</div>

Select

Dropdown select field with label and description.

Engineering
Design
Marketing
Sales
Select your department or area of work.
<div class="w-full max-w-md">
  <%= render "ui/field" do %>
    <%= render "ui/label", for_id: "department", content: "Department", attributes: { data: { slot: "field-label" } } %>
    <%= render "ui/select", value: "engineering" do %>
      <%= render "ui/select/trigger", id: "department", placeholder: "Choose department" %>
      <%= render "ui/select/content" do %>
        <%= render "ui/select/item", value: "engineering" do %>Engineering<% end %>
        <%= render "ui/select/item", value: "design" do %>Design<% end %>
        <%= render "ui/select/item", value: "marketing" do %>Marketing<% end %>
        <%= render "ui/select/item", value: "sales" do %>Sales<% end %>
      <% end %>
    <% end %>
    <%= render "ui/field/description" do %>Select your department or area of work.<% end %>
  <% end %>
</div>

Slider

Slider field with dynamic value display.

Price Range
Set your budget range for the search.
<div class="w-full max-w-md">
  <%= render "ui/field" do %>
    <%= render "ui/field/title" do %>Price Range<% end %>
    <%= render "ui/field/description" do %>Set your budget range for the search.<% end %>
    <%= render "ui/slider", default_value: [200, 800], min: 0, max: 1000, step: 50 do %>
      <%= render "ui/slider/track" do %>
        <%= render "ui/slider/range" %>
      <% end %>
      <%= render "ui/slider/thumb" %>
      <%= render "ui/slider/thumb" %>
    <% end %>
  <% end %>
</div>

Fieldset

Grouped fields under a legend with address information.

Address Information
We need your address to deliver your order.
<div class="w-full max-w-md">
  <%= render "ui/field/set" do %>
    <%= render "ui/field/legend" do %>Address Information<% end %>
    <%= render "ui/field/description" do %>We need your address to deliver your order.<% end %>
    <%= render "ui/field/group" do %>
      <%= render "ui/field" do %>
        <%= render "ui/label", for_id: "street", content: "Street Address", attributes: { data: { slot: "field-label" } } %>
        <%= render "ui/input", id: "street", type: "text", placeholder: "123 Main St" %>
      <% end %>
      <div class="grid grid-cols-2 gap-4">
        <%= render "ui/field" do %>
          <%= render "ui/label", for_id: "city", content: "City", attributes: { data: { slot: "field-label" } } %>
          <%= render "ui/input", id: "city", type: "text", placeholder: "New York" %>
        <% end %>
        <%= render "ui/field" do %>
          <%= render "ui/label", for_id: "zip", content: "Postal Code", attributes: { data: { slot: "field-label" } } %>
          <%= render "ui/input", id: "zip", type: "text", placeholder: "90502" %>
        <% end %>
      </div>
    <% end %>
  <% end %>
</div>

Checkbox

Checkbox group with labels and a separate checkbox with description.

Show these items on the desktop
Select the items you want to show on the desktop.
Your Desktop & Documents folders are being synced with iCloud Drive.
<div class="w-full max-w-md">
  <%= render "ui/field/group" do %>
    <%= render "ui/field/set" do %>
      <%= render "ui/field/legend", variant: "label" do %>Show these items on the desktop<% end %>
      <%= render "ui/field/description" do %>Select the items you want to show on the desktop.<% end %>
      <%= render "ui/field/group", classes: "gap-3" do %>
        <%= render "ui/field", orientation: "horizontal" do %>
          <%= render "ui/checkbox", id: "hard-disks", checked: true %>
          <%= render "ui/label", for_id: "hard-disks", content: "Hard disks", classes: "font-normal", attributes: { data: { slot: "field-label" } } %>
        <% end %>
        <%= render "ui/field", orientation: "horizontal" do %>
          <%= render "ui/checkbox", id: "external-disks" %>
          <%= render "ui/label", for_id: "external-disks", content: "External disks", classes: "font-normal", attributes: { data: { slot: "field-label" } } %>
        <% end %>
        <%= render "ui/field", orientation: "horizontal" do %>
          <%= render "ui/checkbox", id: "cds-dvds" %>
          <%= render "ui/label", for_id: "cds-dvds", content: "CDs, DVDs, and iPods", classes: "font-normal", attributes: { data: { slot: "field-label" } } %>
        <% end %>
        <%= render "ui/field", orientation: "horizontal" do %>
          <%= render "ui/checkbox", id: "servers" %>
          <%= render "ui/label", for_id: "servers", content: "Connected servers", classes: "font-normal", attributes: { data: { slot: "field-label" } } %>
        <% end %>
      <% end %>
    <% end %>
    <%= render "ui/field/separator" %>
    <%= render "ui/field", orientation: "horizontal" do %>
      <%= render "ui/checkbox", id: "sync-folders", checked: true %>
      <%= render "ui/field/content" do %>
        <%= render "ui/label", for_id: "sync-folders", content: "Sync Desktop & Documents folders", attributes: { data: { slot: "field-label" } } %>
        <%= render "ui/field/description" do %>Your Desktop & Documents folders are being synced with iCloud Drive.<% end %>
      <% end %>
    <% end %>
  <% end %>
</div>

Choice Card

Wrap Field components inside Label to create selectable card-style field groups.

Select the compute environment for your cluster.
<div class="w-full max-w-md">
  <%= render "ui/field/group" do %>
    <%= render "ui/field/set" do %>
      <%= render "ui/label", content: "Compute Environment", attributes: { data: { slot: "field-label" } } %>
      <%= render "ui/field/description" do %>Select the compute environment for your cluster.<% end %>
      <div class="grid gap-3" role="radiogroup">
        <label for="kubernetes" class="flex w-full cursor-pointer flex-col rounded-md border p-4 has-[:checked]:border-primary has-[:checked]:bg-primary/5 dark:has-[:checked]:bg-primary/10">
          <div class="flex w-full items-center gap-3">
            <div class="flex flex-1 flex-col gap-1">
              <span class="text-sm font-medium">Kubernetes</span>
              <span class="text-sm text-muted-foreground">Run GPU workloads on a K8s configured cluster.</span>
            </div>
            <%= render "ui/radio_button", name: "compute", value: "kubernetes", id: "kubernetes", checked: true %>
          </div>
        </label>
        <label for="vm" class="flex w-full cursor-pointer flex-col rounded-md border p-4 has-[:checked]:border-primary has-[:checked]:bg-primary/5 dark:has-[:checked]:bg-primary/10">
          <div class="flex w-full items-center gap-3">
            <div class="flex flex-1 flex-col gap-1">
              <span class="text-sm font-medium">Virtual Machine</span>
              <span class="text-sm text-muted-foreground">Access a VM configured cluster to run GPU workloads.</span>
            </div>
            <%= render "ui/radio_button", name: "compute", value: "vm", id: "vm" %>
          </div>
        </label>
      </div>
    <% end %>
  <% end %>
</div>

Field Group

Stacks related field sets separated by dividers for organizing notification preferences.

Get notified when ChatGPT responds to requests that take time.
Get notified when tasks you've created have updates.
<div class="w-full max-w-md">
  <%= render "ui/field/group" do %>
    <%= render "ui/field/set" do %>
      <%= render "ui/label", content: "Responses", attributes: { data: { slot: "field-label" } } %>
      <%= render "ui/field/description" do %>Get notified when ChatGPT responds to requests that take time.<% end %>
      <%= render "ui/field/group", data: { slot: "checkbox-group" } do %>
        <%= render "ui/field", orientation: "horizontal" do %>
          <%= render "ui/checkbox", id: "push-responses", checked: true, disabled: true %>
          <%= render "ui/label", for_id: "push-responses", content: "Push notifications", classes: "font-normal", attributes: { data: { slot: "field-label" } } %>
        <% end %>
      <% end %>
    <% end %>
    <%= render "ui/field/separator" %>
    <%= render "ui/field/set" do %>
      <%= render "ui/label", content: "Tasks", attributes: { data: { slot: "field-label" } } %>
      <%= render "ui/field/description" do %>Get notified when tasks you've created have updates.<% end %>
      <%= render "ui/field/group", data: { slot: "checkbox-group" } do %>
        <%= render "ui/field", orientation: "horizontal" do %>
          <%= render "ui/checkbox", id: "push-tasks" %>
          <%= render "ui/label", for_id: "push-tasks", content: "Push notifications", classes: "font-normal", attributes: { data: { slot: "field-label" } } %>
        <% end %>
        <%= render "ui/field", orientation: "horizontal" do %>
          <%= render "ui/checkbox", id: "email-tasks" %>
          <%= render "ui/label", for_id: "email-tasks", content: "Email notifications", classes: "font-normal", attributes: { data: { slot: "field-label" } } %>
        <% end %>
      <% end %>
    <% end %>
  <% end %>
</div>

Features

  • Custom styling with Tailwind classes
  • Form integration

API Reference

Field

Core wrapper for a single form field with support for different orientations.

Parameters

NameTypeDefaultDescription
orientationStringverticalOrientation (horizontal or vertical)
data_invalidStringnilThe data invalid

Content

Flex column that groups control and descriptions.

Description

Helper text for form fields.

Group

Layout wrapper that stacks Field components.

Label

Label styled for form fields with disability states.

Parameters

NameTypeDefaultDescription
for_idStringnilThe for id

Separator

Visual divider to separate sections inside FieldGroup.

Title

Title with label styling inside FieldContent.