Skip to content

Forms

The Forms components provide a collection of form elements in the Casoon UI Library.

Usage

Text Input

html
<div class="form-group">
  <label for="name" class="form-label">Name</label>
  <input type="text" id="name" class="form-input" placeholder="Your name">
</div>

Textarea

html
<div class="form-group">
  <label for="message" class="form-label">Message</label>
  <textarea id="message" class="form-textarea" placeholder="Your message"></textarea>
</div>

Select

html
<div class="form-group">
  <label for="country" class="form-label">Country</label>
  <select id="country" class="form-select">
    <option value="">Please select</option>
    <option value="de">Germany</option>
    <option value="at">Austria</option>
    <option value="ch">Switzerland</option>
  </select>
</div>

Checkbox

html
<div class="form-group">
  <label class="form-checkbox">
    <input type="checkbox">
    <span>I agree to the terms and conditions</span>
  </label>
</div>

Radio

html
<div class="form-group">
  <label class="form-radio">
    <input type="radio" name="gender" value="male">
    <span>Male</span>
  </label>
  <label class="form-radio">
    <input type="radio" name="gender" value="female">
    <span>Female</span>
  </label>
</div>

Variants

Sizes

html
<div class="form-group">
  <input type="text" class="form-input form-input--sm" placeholder="Small">
  <input type="text" class="form-input" placeholder="Normal">
  <input type="text" class="form-input form-input--lg" placeholder="Large">
</div>

Status

html
<div class="form-group">
  <input type="text" class="form-input form-input--success" placeholder="Success">
  <input type="text" class="form-input form-input--warning" placeholder="Warning">
  <input type="text" class="form-input form-input--error" placeholder="Error">
</div>

With Icons

html
<div class="form-group">
  <div class="form-input-with-icon">
    <i class="icon-search"></i>
    <input type="text" class="form-input" placeholder="Search">
  </div>
</div>

CSS Variables

css
:root {
  --form-input-padding: 0.5rem 1rem;
  --form-input-border-radius: 0.25rem;
  --form-input-border-color: #e0e0e0;
  --form-input-focus-border-color: #007bff;
  --form-input-bg-color: #ffffff;
  --form-input-text-color: #333333;
  --form-input-placeholder-color: #999999;
  --form-input-transition: all 0.2s ease;
}

Best Practices

Accessibility

  • Use semantic HTML elements
  • Add ARIA attributes
  • Ensure sufficient contrast
  • Implement keyboard navigation

Responsive Design

  • Use relative units
  • Test on different screen sizes
  • Adapt forms for mobile devices
  • Optimize touch interaction

Performance

  • Minimize CSS
  • Optimize loading time
  • Avoid unnecessary nesting
  • Use CSS transitions instead of JavaScript animations

Integration

Astro

astro
---
import '@casoon/ui-lib/components/forms.css';
interface Props {
  type?: 'text' | 'email' | 'password' | 'number';
  label?: string;
  placeholder?: string;
  value?: string;
  required?: boolean;
  disabled?: boolean;
  size?: 'sm' | 'md' | 'lg';
  status?: 'success' | 'warning' | 'error';
  icon?: string;
}
const {
  type = 'text',
  label,
  placeholder,
  value,
  required = false,
  disabled = false,
  size,
  status,
  icon
} = Astro.props;
---

<div class="form-group">
  {label && <label class="form-label">{label}</label>}
  {icon ? (
    <div class="form-input-with-icon">
      <i class={icon}></i>
      <input
        type={type}
        class:list={[
          'form-input',
          size && `form-input--${size}`,
          status && `form-input--${status}`
        ]}
        placeholder={placeholder}
        value={value}
        required={required}
        disabled={disabled}
      />
    </div>
  ) : (
    <input
      type={type}
      class:list={[
        'form-input',
        size && `form-input--${size}`,
        status && `form-input--${status}`
      ]}
      placeholder={placeholder}
      value={value}
      required={required}
      disabled={disabled}
    />
  )}
</div>

<style>
  .form-input {
    width: 100%;
    padding: var(--form-input-padding);
    border: 1px solid var(--form-input-border-color);
    border-radius: var(--form-input-border-radius);
    background-color: var(--form-input-bg-color);
    color: var(--form-input-text-color);
    transition: var(--form-input-transition);
  }
  
  .form-input:focus {
    border-color: var(--form-input-focus-border-color);
    outline: none;
  }
  
  .form-input::placeholder {
    color: var(--form-input-placeholder-color);
  }
  
  .form-input-with-icon {
    position: relative;
  }
  
  .form-input-with-icon i {
    position: absolute;
    left: 1rem;
    top: 50%;
    transform: translateY(-50%);
  }
  
  .form-input-with-icon input {
    padding-left: 2.5rem;
  }
</style>

Usage in an Astro component:

astro
---
import FormInput from '../components/FormInput.astro';
---

<FormInput
  type="text"
  label="Name"
  placeholder="Your name"
  required
/>

<FormInput
  type="email"
  label="Email"
  placeholder="Your email address"
  status="success"
  icon="icon-mail"
/>