<div class="bux-switch">
    <fieldset id="bux-switch__switch-923094551" class="bux-switch__fieldset" aria-describedby="bux-switch__helper-text-923094551">

        <legend class="bux-switch__legend">
            Form Input Label
        </legend>

        <span class="bux-switch__helper-text" id="bux-switch__helper-text-923094551">
            Helper Text
        </span>

        <div class="bux-switch__input-spacer">

            <div class="bux-switch__option ">
                <input type="checkbox" id="bux-switch__option-883183065" name="switch-default" role="switch" />
                <label for="bux-switch__option-883183065">Item 1</label>
            </div>

            <div class="bux-switch__option ">
                <input type="checkbox" id="bux-switch__option-1083787654" name="switch-default" role="switch" />
                <label for="bux-switch__option-1083787654">Item 2</label>
            </div>

            <div class="bux-switch__option ">
                <input type="checkbox" id="bux-switch__option-1706679843" name="switch-default" role="switch" />
                <label for="bux-switch__option-1706679843">Item 3</label>
            </div>
        </div>
    </fieldset>
</div>
{# 

Switch

Available variables:

- required:         Boolean. Set to true to require form element.
- modifier:         Sets the variant of the form item.
                    Allowed values:
                        - null, error, disabled.
- legend:           String for the form legend.
- helper_text:      String for the form helper text.
- input_name:       String for the form element name. Optional.
- items:            Array containing the form items.
- item.text:        Display text for the form item.
- error_helper_text:Content for the error helper text.

#}

{% import 'forms/_macros/attributes.twig' as Attributes %}

{% set random_seed = random() %}
{% set form_element = 'switch' %}
{% set element_id = "bux-" ~ form_element ~ "__" ~ form_element ~ "-" ~ random_seed %}
{% set base_class = "bux-" ~ form_element ~ "__fieldset" %}
{% set modifier_class = modifier ? ' ' ~ base_class ~ "--" ~ modifier : '' %}

{% set aria_describedby = "bux-" ~ form_element ~ "__helper-text-" ~ random_seed %}

{% if modifier == 'error' %}
    {% set aria_error_describedby = 'error' ? "bux-" ~ form_element ~ "__error-message-" ~ random_seed %}
    {% set aria_describedby = aria_error_describedby ~ ' ' ~ aria_describedby %}
{% endif %}

{% set field = {
    form_element: form_element,
    element_id: element_id,
    descriptor: {
        tag: 'legend',
        text: legend
    },
    required: required,
    random_seed: random_seed,
    helper_text: helper_text,
    attributes: {
        id: element_id,
        class: base_class ~ modifier_class,
        'aria-describedby': helper_text ? aria_describedby : false,
        placeholder: placeholder_text,
        required: required ? true : false,
        disabled: modifier == 'disabled' ? true : false,
        'aria-invalid': modifier == 'error' ? true : false,
    },
    error_helper_text: error_helper_text
} %}

<div class="bux-{{ field.form_element }}">
    <fieldset {{ Attributes.render(field.attributes) }}>

        {% include '@descriptor' with field only %}

        {% if helper_text %}
            {% include '@helper' with field only %}
        {% endif %}

        {% if modifier == 'error' %}
            {% include '@error' with field only %}
        {% endif %}

        <div class="bux-{{ field.form_element }}__input-spacer">
            {% for item in items %}
                {% set item_random_seed = random() %}
                {% set item_base_class = "bux-%s__option"|format(field.form_element) %}
                {% set item_modifier_class = modifier ? " %s--%s"|format(item_base_class, modifier) : '' %}

                {% set item_attributes = {
                    type: "checkbox",
                    id: "bux-%s__option-%s"|format(field.form_element, item_random_seed),
                    name: input_name ?? field.attributes.id,
                    role: 'switch'
                } %}

                {% if field.is_disabled %}
                    {% set item_attributes = item_attributes|merge({disabled: true}) %}
                {% endif %}

                <div class="{{ item_base_class }} {{ item_modifier_class }}">
                    <input {{ Attributes.render(item_attributes) }} />
                    <label for="{{ item_attributes.id }}">{{ item.text }}</label>
                </div>
            {% endfor %}
        </div>
    </fieldset>
</div>
legend: Form Input Label
helper_text: Helper Text
input_name: switch-default
items:
  - text: Item 1
  - text: Item 2
  - text: Item 3
  • Content:
    .bux-switch {
      @include form-element;
    
      &__option {
        display: grid;
        grid-template-columns: 45px auto;
        gap: $sp-12;
    
        label {
          margin-top: 4px;
        }
    
        & + & {
          margin-top: $sp-8;
        }
    
        input {
          appearance: none;
          cursor: pointer;
          background-color: $gray-dark-80;
          border: none;
          border-radius: 32px;
          height: 24px;
          width: 45px;
          display: grid;
          place-content: center;
          margin: 0;
          transform: translateY(3px);
    
          &:checked {
            background-color: $scarlet;
          }
    
          &:before {
            content: "";
            height: 18px;
            width: 18px;
            background-color: white;
            transition: 120ms transform ease-in-out;
            border-radius: 50%;
            transform: translate(-10px, 4px);
          }
    
          &:checked:before {
            transform: translate(10px, 4px);
          }
    
          &:after {
            content: "";
            height: 9px;
            width: 2px;
            border-radius: 2px;
            background-color: $white;
            transition: 120ms transform ease-in-out;
            transform: translate(0, -6px);
          }
    
          &:checked:after {
            background-color: $scarlet;
            transform: translate(18.5px, -9px);
          }
    
          &:focus {
            outline: 2px solid $focus;
          }
        }
    
        &--disabled input {
          background-color: $gray-light-40;
        }
    
        &--disabled label {
          color: $gray-light-40;
        }
      }
      &__error-message {
        @include form-error-message;
        margin-top: 8px;
      }
    }
    
  • URL: /components/raw/switch/_switch.scss
  • Filesystem Path: src/components/forms/switch/_switch.scss
  • Size: 1.5 KB

No notes defined.