The form kit provides consumers with a convenient, consistently styled <form> wrapper.
This kit uses rails form_with with our custom builder to render forms using other kits such as text_input, select, and typeahead to name a few. Doing so provides UI consistency within forms and makes adding a form to your page easier.
<% example_collection = [ OpenStruct.new(name: "Alabama", value: 1), OpenStruct.new(name: "Alaska", value: 2), OpenStruct.new(name: "Arizona", value: 3), OpenStruct.new(name: "Arkansas", value: 4), OpenStruct.new(name: "California", value: 5), OpenStruct.new(name: "Colorado", value: 6), OpenStruct.new(name: "Connecticut", value: 7), OpenStruct.new(name: "Delaware", value: 8), OpenStruct.new(name: "Florida", value: 9), OpenStruct.new(name: "Georgia", value: 10), ] %> <% example_dropdown_options = [ { label: 'United States', value: 'United States', id: 'us' }, { label: 'Canada', value: 'Canada', id: 'ca' }, { label: 'Pakistan', value: 'Pakistan', id: 'pk' }, ] %> <% treeData = [{ label: "Power Home Remodeling", value: "Power Home Remodeling", id: "100", expanded: true, children: [ { label: "People", value: "People", id: "101", expanded: true, children: [ { label: "Talent Acquisition", value: "Talent Acquisition", id: "102", }, { label: "Business Affairs", value: "Business Affairs", id: "103", children: [ { label: "Initiatives", value: "Initiatives", id: "104", }, { label: "Learning & Development", value: "Learning & Development", id: "105", }, ], }, { label: "People Experience", value: "People Experience", id: "106", }, ], }, { label: "Contact Center", value: "Contact Center", id: "107", children: [ { label: "Appointment Management", value: "Appointment Management", id: "108", }, { label: "Customer Service", value: "Customer Service", id: "109", }, { label: "Energy", value: "Energy", id: "110", }, ], }, ], }] %> <%= pb_form_with(scope: :example, url: "", method: :get) do |form| %> <%= form.typeahead :example_typeahead, props: { data: { typeahead_example1: true, user: {} }, label: true, placeholder: "Search for a user" } %> <%= form.text_field :example_text_field, props: { label: true } %> <%= form.text_field :example_text_field_2, props: { label: "Text Field Custom Label" } %> <%= form.phone_number_field :example_phone_number_field, props: { label: true, hidden_inputs: true} %> <%= form.intl_telephone :example_intl_telephone, props: { label: true, hidden_inputs: true } %> <%= form.email_field :example_email_field, props: { label: true } %> <%= form.number_field :example_number_field, props: { label: true } %> <%= form.search_field :example_search_field, props: { label: true } %> <%= form.password_field :example_password_field, props: { label: true } %> <%= form.url_field :example_url_field, props: { label: true } %> <%= form.text_area :example_text_area, props: { label: true } %> <%= form.dropdown_field :example_dropdown, props: { label: true, options: example_dropdown_options } %> <%= form.dropdown_field :example_dropdown_multi, props: { label: true, options: example_dropdown_options, multi_select: true } %> <%= form.select :example_select, [ ["Yes", 1], ["No", 2] ], props: { label: true } %> <%= form.collection_select :example_collection_select, example_collection, :value, :name, props: { label: true } %> <%= form.check_box :example_checkbox, data: { field1: "value1", field2: "value2" }, props: { text: "Example Checkbox", label: true }, checked_value: "yes", unchecked_value: "no", id: "checkbox-id", name: "checkbox-name", class: "checkbox-class" %> <%= form.date_picker :example_date_picker_1, props: { label: true } %> <%= form.star_rating_field :example_star_rating, props: { variant: "interactive", label: true } %> <%= form.time_zone_select_field :example_time_zone_select, ActiveSupport::TimeZone.us_zones, { default: "Eastern Time (US & Canada)" }, props: { label: true } %> <%= form.multi_level_select :example_multi_level_select, props: { id: "multi-level-select-form-default", tree_data: treeData, margin_bottom: "sm", label: "Example Multi Level Select field" } %> <%= form.time_picker :example_time_picker, props: { label: true } %> <%= form.actions do |action| %> <%= action.submit %> <%= action.button props: { type: "reset", text: "Cancel", variant: "secondary" } %> <% end %> <% end %> <!-- form.typeahead user results example template --> <template data-typeahead-example-result-option> <%= pb_rails("user", props: { name: tag(:slot, name: "name"), orientation: "horizontal", align: "left", avatar_url: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=", avatar: true }) %> </template> <!-- form.typeahead JS example implementation --> <%= javascript_tag defer: "defer" do %> document.addEventListener("pb-typeahead-kit-search", function(event) { if (!event.target.dataset || !event.target.dataset.typeaheadExample1) return; fetch(`https://api.github.com/search/users?q=${encodeURIComponent(event.detail.searchingFor)}`) .then(response => response.json()) .then((result) => { const resultOptionTemplate = document.querySelector("[data-typeahead-example-result-option]") event.detail.setResults((result.items || []).map((user) => { const wrapper = resultOptionTemplate.content.cloneNode(true) wrapper.children[0].dataset.user = JSON.stringify(user) wrapper.querySelector('slot[name="name"]').replaceWith(user.login) wrapper.querySelector('img').dataset.src = user.avatar_url return wrapper })) }) }) document.addEventListener("pb-typeahead-kit-result-option-selected", function(event) { if (!event.target.dataset.typeaheadExample1) return; const selectedUserJSON = event.detail.selected.firstElementChild.dataset.user const selectedUserData = JSON.parse(selectedUserJSON) // set the input field's value event.target.querySelector('input[name=example_typeahead]').value = selectedUserData.login // log the selected option's dataset console.log('The selected user data:') console.dir(selectedUserData) // do even more with the data later - TBD event.target.dataset.user = selectedUserJSON }) <% end %>
Validation displays an error with red border and red text below indicating that the user must fill out the field.
<% example_collection = [ OpenStruct.new(name: "Alabama", value: 1), OpenStruct.new(name: "Alaska", value: 2), OpenStruct.new(name: "Arizona", value: 3), OpenStruct.new(name: "Arkansas", value: 4), OpenStruct.new(name: "California", value: 5), OpenStruct.new(name: "Colorado", value: 6), OpenStruct.new(name: "Connecticut", value: 7), OpenStruct.new(name: "Delaware", value: 8), OpenStruct.new(name: "Florida", value: 9), OpenStruct.new(name: "Georgia", value: 10), ] %> <% example_dropdown_options = [ { label: 'United States', value: 'United States', id: 'us' }, { label: 'Canada', value: 'Canada', id: 'ca' }, { label: 'Pakistan', value: 'Pakistan', id: 'pk' }, ] %> <% example_typeahead_options = [ { label: 'Orange', value: '#FFA500' }, { label: 'Red', value: '#FF0000' }, { label: 'Green', value: '#00FF00' }, { label: 'Blue', value: '#0000FF' }, ] %> <% treeData = [{ label: "Power Home Remodeling", value: "Power Home Remodeling", id: "100", expanded: true, children: [ { label: "People", value: "People", id: "101", expanded: true, children: [ { label: "Talent Acquisition", value: "Talent Acquisition", id: "102", }, { label: "Business Affairs", value: "Business Affairs", id: "103", children: [ { label: "Initiatives", value: "Initiatives", id: "104", }, { label: "Learning & Development", value: "Learning & Development", id: "105", }, ], }, { label: "People Experience", value: "People Experience", id: "106", }, ], }, { label: "Contact Center", value: "Contact Center", id: "107", children: [ { label: "Appointment Management", value: "Appointment Management", id: "108", }, { label: "Customer Service", value: "Customer Service", id: "109", }, { label: "Energy", value: "Energy", id: "110", }, ], }, ], }] %> <%= pb_form_with(scope: :example, method: :get, url: "", validate: true) do |form| %> <%= form.typeahead :example_typeahead_validation, props: { data: { typeahead_example2: true, user: {} }, label: true, placeholder: "Search for a user", required: true } %> <%= form.typeahead :example_typeahead_validation_react, props: { options: example_typeahead_options, pills: true, label: "Example Typeahead (React Rendered)", placeholder: "Search for a user", required: true } %> <%= form.typeahead :example_typeahead_validation_react_2, props: { options: example_typeahead_options, pills: true, label: "Example Typeahead 2 (React Rendered)", placeholder: "Search for a user", required: true } %> <%= form.text_field :example_text_field_validation, props: { label: true, required: true } %> <%= form.phone_number_field :example_phone_number_field_validation, props: { label: "Example phone field", hidden_inputs: true, required: true } %> <%= form.email_field :example_email_field_validation, props: { label: true, required: true } %> <%= form.number_field :example_number_field_validation, props: { label: true, required: true } %> <%= form.search_field :example_project_number_validation, props: { label: true, required: true, validation: { pattern: "[0-9]{2}-[0-9]{5}", message: "Please enter a valid project number (example: 33-12345)." } } %> <%= form.password_field :example_password_field_validation, props: { label: true, required: true } %> <%= form.url_field :example_url_field_validation, props: { label: true, required: true } %> <%= form.text_area :example_text_area_validation, props: { label: true, required: true } %> <%= form.dropdown_field :example_dropdown_validation, props: { label: true, options: example_dropdown_options, required: true } %> <%= form.dropdown_field :example_dropdown_validation_multi, props: { label: true, options: example_dropdown_options, multi_select: true, required: true } %> <%= form.select :example_select_validation, [ ["Yes", 1], ["No", 2] ], props: { label: true, blank_selection: "Select One...", required: true } %> <%= form.collection_select :example_collection_select_validation, example_collection, :value, :name, props: { label: true, blank_selection: "Select One...", required: true } %> <%= form.check_box :example_checkbox_validation, props: { text: "Example Checkbox Validation", label: true, required: true }, checked_value: "1", unchecked_value: "0" %> <%= form.date_picker :example_date_picker_2, props: { label: true, required: true, allow_input: true } %> <%= form.star_rating_field :example_star_rating_validation, props: { variant: "interactive", label: true, required: true } %> <%= form.time_zone_select_field :example_time_zone_select, ActiveSupport::TimeZone.us_zones, { default: "Eastern Time (US & Canada)" }, props: { label: true, blank_selection: "Select a Time Zone...", required: true } %> <%= form.multi_level_select :example_multi_level_select, props: { id: "multi-level-select-form", tree_data: treeData, margin_bottom: "sm", required: true, label: "Example Multi Level Select field" } %> <%= form.time_picker :example_time_picker_validation, props: { label: true, required: true } %> <%= form.actions do |action| %> <%= action.submit %> <%= action.button props: { type: "reset", text: "Cancel", variant: "secondary" } %> <% end %> <% end %> <!-- form.typeahead user results example template --> <template data-typeahead-example-result-option> <%= pb_rails("user", props: { name: tag(:slot, name: "name"), orientation: "horizontal", align: "left", avatar_url: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=", avatar: true }) %> </template> <!-- form.typeahead JS example implementation --> <%= javascript_tag defer: "defer" do %> document.addEventListener("pb-typeahead-kit-search", function(event) { if (!event.target.dataset || !event.target.dataset.typeaheadExample2) return fetch(`https://api.github.com/search/users?q=${encodeURIComponent(event.detail.searchingFor)}`) .then(response => response.json()) .then((result) => { const resultOptionTemplate = document.querySelector("[data-typeahead-example-result-option]") event.detail.setResults((result.items || []).map((user) => { const wrapper = resultOptionTemplate.content.cloneNode(true) wrapper.children[0].dataset.user = JSON.stringify(user) wrapper.querySelector('slot[name="name"]').replaceWith(user.login) wrapper.querySelector('img').dataset.src = user.avatar_url return wrapper })) }) }) document.addEventListener("pb-typeahead-kit-result-option-selected", function(event) { if (!event.target.dataset.typeaheadExample2) return const selectedUserJSON = event.detail.selected.firstElementChild.dataset.user const selectedUserData = JSON.parse(selectedUserJSON) // set the input field's value event.target.querySelector('input[name=example_typeahead_validation]').value = selectedUserData.login // log the selected option's dataset console.log('The selected user data:') console.dir(selectedUserData) // do even more with the data later - TBD event.target.dataset.user = selectedUserJSON }) <% end %>
Custom validation messages allow you to override the browser's default validation text with your own messaging. This provides a better user experience by giving specific, actionable feedback.
Text-based inputs (TextInput, Typeahead) use the validation prop with a message key:
validation: { message: "Please enter a valid email address." }
Selection-based inputs (Select, DatePicker, TimePicker) use the validation_message prop:
validation_message: "Please select an option."
When a required field is left empty or fails validation, your custom message will display instead of the generic browser default.
<% example_collection = [ OpenStruct.new(name: "Alabama", value: 1), OpenStruct.new(name: "Alaska", value: 2), OpenStruct.new(name: "Arizona", value: 3), OpenStruct.new(name: "Arkansas", value: 4), OpenStruct.new(name: "California", value: 5), OpenStruct.new(name: "Colorado", value: 6), OpenStruct.new(name: "Connecticut", value: 7), OpenStruct.new(name: "Delaware", value: 8), OpenStruct.new(name: "Florida", value: 9), OpenStruct.new(name: "Georgia", value: 10), ] %> <% example_typeahead_options = [ { label: 'Orange', value: '#FFA500' }, { label: 'Red', value: '#FF0000' }, { label: 'Green', value: '#00FF00' }, { label: 'Blue', value: '#0000FF' }, ] %> <%= pb_form_with(scope: :example, method: :get, url: "", validate: true) do |form| %> <%= form.text_field :example_text_field_validation_msg, props: { label: "Text Field With Validation Message", required: true, validation: { message: "I am a custom validation message for text field." } } %> <%= form.typeahead :example_typeahead_validation_msg, props: { data: { typeahead_example_msg: true, user: {} }, label: "Typeahead With Validation Message", placeholder: "Search for a user", required: true, validation: { message: "I am a custom validation message for typeahead." } } %> <%= form.typeahead :example_typeahead_validation_react_msg, props: { options: example_typeahead_options, pills: true, label: "Typeahead With Validation Message (React Rendered)", placeholder: "Search for a color", required: true, validation: { message: "I am a custom validation message for React typeahead." } } %> <%= form.select :example_select_validation_msg, [ ["Yes", 1], ["No", 2] ], props: { label: true, blank_selection: "Select One...", required: true, validation_message: "I am a custom validation message for select." } %> <%= form.collection_select :example_collection_select_validation_msg, example_collection, :value, :name, props: { label: "Collection Select With Validation Message", blank_selection: "Select a State...", required: true, validation_message: "I am a custom validation message for collection select." } %> <%= form.date_picker :example_date_picker_validation_msg, props: { label: "Date Picker With Validation Message", required: true, validation_message: "I am a custom validation message for date picker.", allow_input: true } %> <%= form.time_picker :example_time_picker_validation_msg, props: { label: "Time Picker With Validation Message", required: true, validation_message: "I am a custom validation message for time picker." } %> <%= form.actions do |action| %> <%= action.submit %> <%= action.button props: { type: "reset", text: "Cancel", variant: "secondary" } %> <% end %> <% end %> <!-- form.typeahead user results example template --> <template data-typeahead-example-result-option> <%= pb_rails("user", props: { name: tag(:slot, name: "name"), orientation: "horizontal", align: "left", avatar_url: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=", avatar: true }) %> </template> <!-- form.typeahead JS example implementation --> <%= javascript_tag defer: "defer" do %> document.addEventListener("pb-typeahead-kit-search", function(event) { if (!event.target.dataset || !event.target.dataset.typeaheadExampleMsg) return fetch(`https://api.github.com/search/users?q=${encodeURIComponent(event.detail.searchingFor)}`) .then(response => response.json()) .then((result) => { const resultOptionTemplate = document.querySelector("[data-typeahead-example-result-option]") event.detail.setResults((result.items || []).map((user) => { const wrapper = resultOptionTemplate.content.cloneNode(true) wrapper.children[0].dataset.user = JSON.stringify(user) wrapper.querySelector('slot[name="name"]').replaceWith(user.login) wrapper.querySelector('img').dataset.src = user.avatar_url return wrapper })) }) }) document.addEventListener("pb-typeahead-kit-result-option-selected", function(event) { if (!event.target.dataset.typeaheadExampleMsg) return const selectedUserJSON = event.detail.selected.firstElementChild.dataset.user const selectedUserData = JSON.parse(selectedUserJSON) // set the input field's value event.target.querySelector('input[name=example_typeahead_validation_msg]').value = selectedUserData.login // log the selected option's dataset console.log('The selected user data:') console.dir(selectedUserData) // do even more with the data later - TBD event.target.dataset.user = selectedUserJSON }) <% end %>
Pressing Submit will trigger a loading state where the button content is replaced by a spinner icon and the submit button will be disabled.
<%= pb_form_with(scope: :example, url: "", method: :get, loading: true) do |form| %> <%= form.text_field :example_text_field_loading, props: { label: true } %> <%= form.actions do |action| %> <%= action.submit %> <%= action.button props: { type: "reset", text: "Cancel", variant: "secondary" } %> <% end %> <% end %> <script> const loadingForm = document.querySelector(".pb_form_loading") if (loadingForm) { loadingForm.addEventListener("submit", function(event) { event.preventDefault(); const submitButton = event['submitter']; const cancelButton = event['target'].querySelector('button[type="reset"]'); if (submitButton) { let currentClass = submitButton.className; let newClass = currentClass.replace("pb_button_disabled pb_button_loading", "pb_button_enabled"); let cancelClass = cancelButton ? cancelButton.className : ""; let newCancelClass = cancelClass.replace("_disabled", "_enabled"); setTimeout(function() { submitButton.disabled = false; submitButton.className = currentClass; if (cancelButton) { cancelButton.disabled = false; cancelButton.className = cancelClass; } }, 5000); } }); } </script>
The required_indicator prop adds a red asterisk (*) to the input label, visually marking the field as required. This works with both label: true for auto-generated labels and label: "Custom Text" for custom labels.
While it's typically used alongside the required prop for HTML5 validation, you can use required_indicator independently if you're handling validation differently (e.g., client-side or backend validation).
<% tree_data = [ { label: "HQ", value: "hQ", id: "hq", }, { label: "Philadelphia", value: "philadelphia", id: "phl", children: [ { label: "Marketing & Sales PHL", value: "marketingAndSalesPhl", id: "marketingPHL", }, { label: "Installation Office PHL", value: "installationOfficePhl", id: "installationPHL", }, { label: "Warehouse PHL", value: "warehousePhl", id: "warehousePHL", }, ] }, { label: "New Jersey", value: "newJersey", id: "nj", children: [ { label: "New Jersey", value: "newJersey", id: "nj1", children: [ { label: "Marketing & Sales NJ", value: "marketingAndSalesNj", id: "marketingNJ", }, { label: "Installation Office NJ", value: "installationOfficeNj", id: "installationNJ", }, { label: "Warehouse NJ", value: "warehouseNj", id: "warehouseNJ", }, ], }, { label: "Princeton", value: "princeton", id: "princeton", children: [ { label: "Marketing & Sales Princeton", value: "marketingAndSalesPrinceton", id: "marketingPR", }, { label: "Installation Office Princeton", value: "installationOfficePrinceton", id: "installationPR", }, { label: "Warehouse Princeton", value: "warehousePrinceton", id: "warehousePR", }, ] }, ] }, { label: "Maryland", value: "maryland", id: "MD", children: [ { label: "Marketing & Sales MD", value: "marketingAndSalesMd", id: "marketingMD", }, { label: "Installation Office MD", value: "installationOfficeMd", id: "installationMD", }, { label: "Warehouse MD", value: "warehouseMd", id: "warehouseMD", }, ] }, { label: "Connecticut", value: "connecticut", id: "CT", children: [ { label: "Marketing & Sales CT", value: "marketingAndSalesCt", id: "marketingCT", }, { label: "Installation Office CT", value: "installationOfficeCt", id: "installationCT", }, { label: "Warehouse CT", value: "warehouseCt", id: "warehouseCT", }, ] }, ]; %> <% example_dropdown_options = [ { label: 'United States', value: 'United States', id: 'us' }, { label: 'Canada', value: 'Canada', id: 'ca' }, { label: 'Pakistan', value: 'Pakistan', id: 'pk' } ] %> <%= pb_form_with(scope: :example, url: "", method: :get, validate: true) do |form| %> <%= form.typeahead :example_typeahead_field, props: { label: true, required: true, required_indicator: true } %> <%= form.text_field :example_text_field, props: { label: true, required: true, required_indicator: true } %> <%= form.text_field :example_text_field_2, props: { label: "Text Field Custom Label", required: true, required_indicator: true } %> <%= form.phone_number_field :example_phone_number_field, props: { label: true, required: true, required_indicator: true } %> <%= form.email_field :example_email_field, props: { label: true, required: true, required_indicator: true } %> <%= form.number_field :example_number_field, props: { label: true, required: true, required_indicator: true } %> <%= form.search_field :example_search_field, props: { label: true, required: true, required_indicator: true } %> <%= form.password_field :example_password_field, props: { label: true, required: true, required_indicator: true } %> <%= form.url_field :example_url_field, props: { label: true, required: true, required_indicator: true } %> <%= form.text_area :example_text_area, props: { label: true, required: true, required_indicator: true } %> <%= form.text_area :example_text_area_2, props: { label: "Textarea Custom Label", required: true, required_indicator: true } %> <%# form.check_box :example_checkbox, props: { label: true, text: "Checkbox Label", required: true, required_indicator: true } %> <%= form.time_picker :example_time_picker_required_indicator, props: { label: true, required: true, required_indicator: true } %> <%= form.date_picker :example_date_picker_required_indicator, props: { label: true, required: true, required_indicator: true } %> <%= form.date_picker :example_date_picker_required_indicator_custom, props: { label: "Custom Date Picker Label", required: true, required_indicator: true } %> <%= form.select :example_select_required_indicator, [["Yes", 1], ["No", 2]], props: { label: true, required: true, required_indicator: true } %> <%= form.select :example_select_required_indicator_2, [["Yes", 1], ["No", 2]], props: { label: "Example Select Field", required: true, required_indicator: true } %> <%= form.multi_level_select :example_multi_level_select_required_indicator, props: { label: true, margin_y: 'sm', required: true, required_indicator: true, tree_data: tree_data } %> <%= form.multi_level_select :example_multi_level_select_required_indicator_custom, props: { label: "Custom Multi Level Select Label", margin_y: 'sm', required: true, required_indicator: true, tree_data: tree_data } %> <%= form.dropdown_field :example_dropdown, props: { label: true, options: example_dropdown_options, required: true, required_indicator: true } %> <%= form.dropdown_field :example_dropdown_2, props: { label: "Dropdown Custom Label", options: example_dropdown_options, required: true, required_indicator: true } %> <%= form.actions do |action| %> <%= action.submit %> <%= action.button props: { type: "reset", text: "Cancel", variant: "secondary" } %> <% end %> <% end %>
Avoid using a form without validation if fields are required and using with validation if not required.
| Props | Type | Values |
|---|---|---|
align_content |
enum | responsive
|
start
end
center
spaceBetween
spaceAround
spaceEvenly
|
align_items |
enum | responsive
|
start
end
center
|
border_radius |
enum
|
none
xs
sm
md
lg
xl
rounded
|
cursor |
enum
|
auto
default
none
contextMenu
help
pointer
progress
wait
cell
|
dark |
boolean
|
true
false
|
flex |
enum | responsive
|
auto
initial
0
1
2
3
4
5
6
7
8
9
10
11
12
none
|
flex_direction |
enum | responsive
|
row
column
rowReverse
columnReverse
|
flex_wrap |
enum | responsive
|
wrap
nowrap
wrapReverse
|
justify_content |
enum | responsive
|
start
end
center
spaceBetween
spaceAround
spaceEvenly
|
line_height |
enum
|
loosest
looser
loose
normal
tight
tighter
tightest
|
margin_right |
array
|
none
xxs
xs
sm
md
lg
xl
|
margin_left |
array
|
none
xxs
xs
sm
md
lg
xl
|
margin_top |
array
|
none
xxs
xs
sm
md
lg
xl
|
margin_bottom |
array
|
none
xxs
xs
sm
md
lg
xl
|
margin_x |
array
|
none
xxs
xs
sm
md
lg
xl
|
margin_y |
array
|
none
xxs
xs
sm
md
lg
xl
|
margin |
array
|
none
xxs
xs
sm
md
lg
xl
|
width |
string
|
|
min_width |
string
|
|
max_width |
string
|
|
gap |
string | responsive
|
|
column_gap |
string | responsive
|
|
row_gap |
string | responsive
|
|
number_spacing |
enum
|
tabular
|
order |
enum | responsive
|
none
first
1
2
3
4
5
6
7
8
9
10
11
12
|
overflow_x |
enum
|
scroll
visible
hidden
auto
|
overflow_y |
enum
|
scroll
visible
hidden
auto
|
overflow |
enum
|
scroll
visible
hidden
auto
|
padding_right |
array
|
none
xxs
xs
sm
md
lg
xl
|
padding_left |
array
|
none
xxs
xs
sm
md
lg
xl
|
padding_top |
array
|
none
xxs
xs
sm
md
lg
xl
|
padding_bottom |
array
|
none
xxs
xs
sm
md
lg
xl
|
padding_x |
array
|
none
xxs
xs
sm
md
lg
xl
|
padding_y |
array
|
none
xxs
xs
sm
md
lg
xl
|
padding |
array
|
none
xxs
xs
sm
md
lg
xl
|
position |
enum
|
relative
absolute
fixed
sticky
static
|
shadow |
enum
|
none
deep
deeper
deepest
|
text_align |
enum | responsive
|
start
end
left
right
center
justify
justifyAll
matchParent
|
truncate |
enum
|
none
1
2
3
4
5
|
vertical_align |
enum | responsive
|
baseline
super
top
middle
bottom
sub
text-top
text-bottom
|
z_index |
enum | responsive
|
1
2
3
4
5
6
7
8
9
10
max
|
top |
enum | object
|
xxs
xs
sm
md
lg
xl
xxl
|
inset |
boolean
|
true
false
|
right |
enum | object
|
xxs
xs
sm
md
lg
xl
xxl
|
bottom |
enum | object
|
xxs
xs
sm
md
lg
xl
xxl
|
left |
enum | object
|
xxs
xs
sm
md
lg
xl
xxl
|
height |
string
|
|
max_height |
string
|
|
min_height |
string
|
|
hover |
object
|
|
group_hover |
boolean
|
true
false
|
| Props | Type | Values | Default |
|---|---|---|---|
form_system |
string
|
||
form_system_options |
string
|
||
loading |
boolean
|
true
false
|
false
|
options |
string
|
||
validate |
boolean
|
true
false
|
false
|