Skip to content

Form Container

<pa-form-container> | PaFormContainer

A wrapper component for form elements that provides consistent spacing and layout. The Form Container is specifically designed for form inputs, checkboxes, buttons, and related form controls.

vue
<template>
  <pa-form-container size="grouped">
    <pa-input-group label="Name">
      <pa-input placeholder="Enter your name..." />
    </pa-input-group>
    <pa-input-group label="Email">
      <pa-input placeholder="Enter your email..." />
    </pa-input-group>
    <pa-button variant="primary">Submit</pa-button>
  </pa-form-container>
</template>

Examples

Grouped Size (Default)

The grouped size provides 12px spacing and should be used when form fields relate to each other.

vue
<template>
  <pa-form-container size="grouped">
    <pa-input-group label="First Name">
      <pa-input v-model="firstName" placeholder="Enter your first name" />
    </pa-input-group>
    <pa-input-group label="Last Name">
      <pa-input v-model="lastName" placeholder="Enter your last name" />
    </pa-input-group>
    <pa-input-group label="Email Address">
      <pa-input v-model="email" placeholder="Enter your email" />
    </pa-input-group>
    <pa-button variant="primary" @click="submit">Submit</pa-button>
  </pa-form-container>
</template>

<script setup>
import { ref } from 'vue'

const firstName = ref('')
const lastName = ref('')
const email = ref('')

const submit = () => {
  console.log('Form submitted:', { firstName: firstName.value, lastName: lastName.value, email: email.value })
}
</script>

Sparse Grouped Size

The sparse-grouped size provides 18px spacing for fields that relate to each other but require more separation.

vue
<template>
  <pa-form-container size="sparse-grouped">
    <pa-input-group label="Company Name">
      <pa-input v-model="companyName" placeholder="Enter company name" />
    </pa-input-group>
    <pa-input-group label="Department">
      <pa-input v-model="department" placeholder="Enter department" />
    </pa-input-group>
    <pa-input-group label="Job Title">
      <pa-input v-model="jobTitle" placeholder="Enter job title" />
    </pa-input-group>
    <pa-button variant="primary" @click="updateProfile">Update Profile</pa-button>
  </pa-form-container>
</template>

Ungrouped Size

The ungrouped size provides 24px spacing for fields that do not relate to each other.

vue
<template>
  <pa-form-container size="ungrouped">
    <pa-input-group label="Search Query">
      <pa-input v-model="searchTerm" placeholder="Enter search term..." />
    </pa-input-group>
    <pa-checkbox v-model="notifications">Enable email notifications</pa-checkbox>
    <pa-switch v-model="darkMode">Dark mode theme</pa-switch>
    <pa-button variant="secondary" @click="applySettings">Apply Settings</pa-button>
  </pa-form-container>
</template>

Using Form Dividers

For additional spacing between form sections, use the pa-form-divider component within the container.

 
 
vue
<template>
  <pa-form-container size="grouped">
    <pa-input-group label="Username">
      <pa-input v-model="username" placeholder="Enter username" />
    </pa-input-group>
    <pa-input-group label="Email">
      <pa-input v-model="email" placeholder="Enter email address" />
    </pa-input-group>
    <pa-form-divider size="md" />
    <pa-checkbox v-model="rememberPrefs">Remember my preferences</pa-checkbox>
    <pa-form-divider size="lg" />
    <pa-button variant="primary" @click="saveAccount">Save Account</pa-button>
  </pa-form-container>
</template>

Importing

typescript
import { PaFormContainer } from '@payadvantage/ui_components'

Properties

NameDescriptionReflectsTypeDefault
sizeControls the spacing between form elements.no'grouped' | 'sparse-grouped' | 'ungrouped''grouped'

Events

The Form Container component does not emit any events.

Slots

NameDescription
defaultThe form elements to be contained and spaced.

Dependencies

  • CSS Custom Properties: Uses design tokens for consistent spacing values
  • No external dependencies: Pure Vue 3 component with CSS styling

Form Dividers

For additional spacing control within forms, use PaFormDivider to create custom spacing between form sections:

vue
<template>
  <pa-form-container size="grouped">
    <pa-input-group label="Personal Info" />
    <pa-form-divider size="lg" />
    <pa-input-group label="Contact Details" />
  </pa-form-container>
</template>

Design Notes

The Form Container component provides:

  • Semantic spacing: Three distinct spacing levels for different form relationship types
  • Consistent layouts: Ensures uniform spacing across all forms in the application
  • Form structure: Helps organize form elements into logical groups

Spacing Guidelines

SizeSpacingUse Case
grouped12pxRelated fields (name parts, address components)
sparse-grouped18pxSemi-related fields requiring more separation
ungrouped24pxUnrelated fields or separate form sections

Button Placement

When placing buttons in forms, they should use the largest spacing available to prevent them from appearing to belong to the preceding form group. Consider using pa-form-divider with size lg before important action buttons.

Accessibility Notes

  • Uses semantic div structure for proper screen reader navigation
  • Maintains logical tab order through form elements
  • Does not interfere with form validation or submission
  • Preserves all accessibility features of contained form elements