Reusable component library sources

Custom form elements

Accordion item 1

Amet minim mollit non deserunt ullamco est sit aliqua dolor do amet sint. Velit officia consequat duis enim velit mollit. Exercitation veniam consequat sunt nostrud amet.

Accordion item 2

Amet minim mollit non deserunt ullamco est sit aliqua dolor do amet sint. Velit officia consequat duis enim velit mollit. Exercitation veniam consequat sunt nostrud amet.

Accordion item 3

Amet minim mollit non deserunt ullamco est sit aliqua dolor do amet sint. Velit officia consequat duis enim velit mollit. Exercitation veniam consequat sunt nostrud amet.

              

<!--radio -->
<div class="wrapper">
<label class="radio">
<input class="radio__input" type="radio" name="radio" value="1">
<span class="radio__label">Default</span>
</label>

<label class="radio">
<input class="radio__input" type="radio" name="radio" value="2" checked>
<span class="radio__label">Selected</span>
</label>

<label class="radio">
<input class="radio__input" type="radio" name="radio" value="3" disabled>
<span class="radio__label">Disabled</span>
</label>
</div>


<!--checkbox -->
<div class="wrapper">
<label class="checkbox">
    <input class="checkbox__input" type="checkbox" name="checkbox-set" value="1">
    <div class="checkbox__state">
        <div class="checkbox__control">
            <svg class="checkbox__icon">
                <use xlink:href="../../assets/images/sprite.svg#check"></use>
            </svg>  
        </div>
        <div class="checkbox__label">
            Default
        </div>
    </div>
</label>

<label class="checkbox">
    <input class="checkbox__input" type="checkbox" name="checkbox-set" value="2">
    <div class="checkbox__state">
        <div class="checkbox__control">
            <svg class="checkbox__icon">
                <use xlink:href="../../assets/images/sprite.svg#check"></use>
            </svg>  
        </div>
        <div class="checkbox__label">
            Checkbox
        </div>
    </div>
</label>

<label class="checkbox">
    <input class="checkbox__input" type="checkbox" name="checkbox-set" value="3" disabled>
    <div class="checkbox__state">
        <div class="checkbox__control">
            <svg class="checkbox__icon">
                <use xlink:href="../../assets/images/sprite.svg#check"></use>
            </svg>  
        </div>
        <div class="checkbox__label">
            Disabled
        </div>
    </div>
</label>
</div>


<!--toggler -->
<div class="wrapper">

<label class="toggler">
<input class="toggler__input available-hidden" type="checkbox" name="toggler" value="1">
<span class="toggler__label">Off</span>
</label>

<label class="toggler">
<input class="toggler__input available-hidden" type="checkbox" name="toggler" value="2" checked>
<span class="toggler__label">On</span>
</label>

<label class="toggler">
<input class="toggler__input available-hidden" type="checkbox" name="toggler" value="3" disabled>
<span class="toggler__label">Disabled</span>
</label>

</div>


<!--input -->
<div class="wrapper">
<label class="input">
    <span class="input__label">Label</span>
    <input class="input__control" type="text" placeholder="Placeholder">
    <span class="input__status">Some status</span>
</label>
<label class="input input_success">
    <span class="input__label">Success</span>
    <div class="input__block">
    <input class="input__control" type="text" placeholder="Placeholder" value="Success">
        <svg class="input__icon">
            <use xlink:href="../../assets/images/sprite.svg#success"></use>
        </svg>
    </div>
    <span class="input__status">Some status</span>
</label>
<label class="input input_invalid">
    <span class="input__label">Error</span>
    <div class="input__block">
        <input class="input__control" type="text" placeholder="Placeholder" value="Error">
        <svg class="input__icon">
            <use xlink:href="../../assets/images/sprite.svg#error"></use>
        </svg>
    </div>
    <span class="input__status">Some status</span>
</label>
</div>



<!--button -->
<div class="wrapper">
<button class="button button_primary">Primary</button>
<button class="button button_primary" disabled>Primary disabled</button>

<button class="button button_secondary">Secondary</button>
<button class="button button_secondary" disabled>Secondary disabled</button>

<button class="button button_alternate">Alternate</button>
<button class="button button_alternate" disabled>Alternate disabled</button>
</div>


<!--accordion -->
<div class="accordion-wrapper">
  <details class="accordion accordion-wrapper__item" open>
    <summary class="accordion__summary">
      <span class="accordion__title">Accordion item 1</span>
      <svg class="accordion__icon" width="24" height="24">
        <use xlink:href="../src/images/sprite.svg#arrow-down"></use>
      </svg>
    </summary>
    <p class="accordion__text">
      Amet minim mollit non deserunt ullamco est sit aliqua dolor do amet sint. Velit officia consequat duis enim velit mollit. Exercitation veniam consequat sunt nostrud amet.
    </p>
  </details>
  
  <details class="accordion accordion-wrapper__item">
      <summary class="accordion__summary">
        <span class="accordion__title">Accordion item 2</span>
        <svg class="accordion__icon" width="24" height="24">
          <use xlink:href="../src/images/sprite.svg#arrow-down"></use>
        </svg>
      </summary>
      <p class="accordion__text">
          Amet minim mollit non deserunt ullamco est sit aliqua dolor do amet sint. Velit officia consequat duis enim velit mollit. Exercitation veniam consequat sunt nostrud amet.
      </p>
  </details>
  
  <details class="accordion accordion-wrapper__item">
      <summary class="accordion__summary">
        <span class="accordion__title">Accordion item 3</span>
        <svg class="accordion__icon" width="24" height="24">
          <use xlink:href="../src/images/sprite.svg#arrow-down"></use>
        </svg>
      </summary>
      <p class="accordion__text">
          Amet minim mollit non deserunt ullamco est sit aliqua dolor do amet sint. Velit officia consequat duis enim velit mollit. Exercitation veniam consequat sunt nostrud amet.
      </p>
  </details>
</div>

              
            
              
/* radio */
.radio {
line-height: 0;
position: relative;
}

.radio__input {
position: absolute;
opacity: 0;
clip: rect(0 0 0 0);
width: 1px;
height: 1px;
margin: -1px;
z-index: -1;
}

.radio__label {
display: inline-flex;
align-items: center;
user-select: none;

font-family: var(--ff-secondary);
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 24px;
color: var(--grey-4);
}

/* состояние радиокнопки по умолчанию (default) */
.radio__label::before {
content: '';
display: inline-block;
width: 28px;
height: 28px;
flex-shrink: 0;
flex-grow: 0;
border: 1px solid var(--grey-2);
border-radius: 50%;
margin-right: 12px;
box-sizing: border-box;
}

/* наведении курсора */
.radio__input:not(:disabled):not(.radio_disabled):not(:checked) + .radio__label:hover {
cursor: pointer;
}
.radio__input:not(:disabled):not(.radio_disabled):not(:checked) + .radio__label:hover::before {
border-color: var(--grey-3);
}

/* активная радиокнопка, при нажатии */
.radio__input:not(:disabled):not(.radio_disabled):active + .radio__label::before {
background-color: var(--grey-1);
}

/* надпись радиокнопки в фокусе */
.radio__input:not(:disabled):not(.radio_disabled):focus + .radio__label {
text-decoration: underline;
}

/* радиокновка выбрана (checked) - внешняя часть */
.radio__input:not(:disabled):not(.radio_disabled):checked + .radio__label::before {
background-color: var(--white);
border: 2px solid var(--blue);
}

/* радиокновка выбрана (checked) - внутренняя часть */
.radio__input:not(:disabled):not(.radio_disabled):checked + .radio__label::after {
position: absolute;
content: '';
left: 5px;
width: 18px;
height: 18px;
border-radius: 50%;
background: var(--blue);
}

/* радиокнопка в состоянии disabled */
.radio__input.radio_disabled+ .radio__label::before,
.radio__input:disabled + .radio__label::before {
background-color: var(--grey-2);
}

/* надпись радиокнопки в состоянии disabled */
.radio__input.radio_disabled + .radio__label,
.radio__input:disabled + .radio__label {
color: var(--grey-2);
}

/* checkbox */
.checkbox {
display: inline-block;
}

.checkbox__input {
position: absolute;
opacity: 0;
clip: rect(0 0 0 0);
width: 1px;
height: 1px;
margin: -1px;
z-index: -1;
pointer-events: none;
cursor: default;
}

.checkbox__state {
display: flex;
align-items: center;
}

.checkbox__label {
font-family: var(--ff-secondary);
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 24px;
color: var(--label-color);
margin-left: 12px;
}

.checkbox__control {
display: flex;
justify-content: center;
align-items: center;
width: 28px;
height: 28px;
background-color: var(--main-bg);  
border: 1px solid var(--border-input-color);
border-radius: 4px;
box-sizing: border-box;
position: relative;
}

.checkbox__icon {
display: none;
width: 22px;
height: 22px;
color: var(--main-bg);
}

/* чекбокс в состоянии hover */
.checkbox__input:not(:disabled):hover ~ .checkbox__state  {
cursor: pointer;
}

/* чекбокс в состоянии checked - фон и бордер */
.checkbox__input:checked ~ .checkbox__state .checkbox__control {
background-color: var(--primary);
border-color: var(--primary);
}

/* чекбокс в состоянии checked - галочка */
.checkbox__input:checked ~ .checkbox__state .checkbox__icon {
display: block;
}

/* чекбокс в фокусе */
.checkbox__input:focus ~ .checkbox__state .checkbox__label {
text-decoration: underline;
}

/* чекбокс в состоянии disabled - label */
.checkbox__input:disabled ~ .checkbox__state .checkbox__label {
color: var(--grey-2);
}
/* чекбокс в состоянии disabled - сам чекбокс */
.checkbox__input:disabled ~ .checkbox__state .checkbox__control {
background-color: var(--grey-2);
}

/* outline вокруг checkbox */
.checkbox__input:focus ~ .checkbox__state .checkbox__control {
/* Виден в полноцветном пространстве */
box-shadow: 0px 0px 5px 5px var(--outline-color);
/* Отображается в высококонтрастных темах Windows */
outline-color: transparent;
outline-width: 2px;
outline-style: dotted;
}

/* toggler */
.toggler {
display: inline-block;
line-height: 0;
position: relative;
}

.toggler__input {
position: absolute;
opacity: 0;
clip: rect(0 0 0 0);
width: 1px;
height: 1px;
margin: -1px;
z-index: -1;
pointer-events: none;
cursor: default;
}

.toggler__label {
display: inline-flex;
align-items: center;
user-select: none;

font-family: var(--ff-secondary);
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 24px;
color: var(--grey-4);
}

/* состояние toggler по умолчанию (default) - окантовка */
.toggler__label::before {
content: '';
display: inline-block;
width: 52px;
height: 28px;
margin-right: 12px;

flex-shrink: 0;
flex-grow: 0;
background: var(--white);
border: 1px solid var(--grey-2);
border-radius: 16px;
box-sizing: border-box;
}

/* состояние toggler по умолчанию (default) - сердцевина */
.toggler__label::after {
position: absolute;
content: '';
top: calc(50% - 24px/2);
left: 3px;
width: 24px;
height: 24px;
border-radius: 16px;
background: var(--grey-2);
}

/* toggler в состоянии hover */
.toggler__input:not(:disabled):hover + .toggler__label {
cursor: pointer;
}

/* toggler в состоянии checked - фон и бордер */
.toggler__input:checked + .toggler__label::before {
background-color: var(--primary);
border-color: var(--primary);
}

/* toggler в состоянии checked - сердцевина */
.toggler__input:checked + .toggler__label::after {
left: 26px;
background-color: var(--white);
}

/* toggler в состоянии focus */
.toggler__input:focus + .toggler__label {
text-decoration: underline;
}

/* toggler в состоянии disabled - подпись */
.toggler__input:disabled + .toggler__label {
color: var(--grey-2);
}

/* toggler в состоянии disabled - фон */
.toggler__input:disabled + .toggler__label::before {
background-color: var(--grey-2);
}

/* toggler в состоянии disabled - сердцевина */
.toggler__input:disabled + .toggler__label::after {
background-color: var(--grey-3);
}

/* input */
.input {
display: flex;
flex-direction: column;
/* Ранее вносил изменения в index.css, но это еще в ПР, поэтому пока здесь пишу CSS-свойства */
/* потом перенесу всё в index.css */
--box-shadow-input-focus: 0px 1px 1px rgba(51, 154, 240, 0.1);
--box-shadow-input-error: 0px 1px 1px rgba(240, 61, 62, 0.1);
}

.input__label, .input__status {
font-family: var(--ff-secondary);
font-weight: 500;
font-size: 12px;
line-height: 18px;
letter-spacing: 0.04em;
text-transform: uppercase;
color: var(--grey-3);
}

.input__status {
font-weight: 400;
font-size: 8px;
line-height: 14px;
}

.input__block {
display: flex;
position: relative;
}

.input__control {
width: 350px;
padding: 16px 54px 14px 26px;
background: var(--white);
border: 1px solid var(--grey-2);
border-radius: 8px;
box-sizing: border-box;

font-family: var(--ff-secondary);
font-weight: normal;
font-size: 20px;
line-height: 26px;
color: var(--grey-4);
}

.input__control::placeholder {
color: var(--grey-2);
}

.input:not(.input_success) > .input__block .input__control:focus,
.input:not(.input_invalid) > .input__block .input__control:focus {
border: 1px solid var(--primary);
box-shadow: var(--box-shadow-input-focus);
outline: none;
}

.input__icon {
position: absolute;
top: 17px;
right: 18px;
width: 24px;
height: 24px;
}

.input_success > .input__status,
.input_success > .input__block .input__icon {
color: var(--success);
}

.input_invalid > .input__status,
.input_invalid > .input__block .input__icon {
color: var(--error);
}

.input_success > .input__block .input__control {
box-shadow: var(--box-shadow-input-success);
border-color: var(--success);
}
.input_invalid > .input__block .input__control {
box-shadow: var(--box-shadow-input-error);
border-color: var(--error);
}

/* button */
.button {
width: 189px;
height: 48px;
border-radius: 8px;
border: none;

font-style: normal;
font-weight: 500;
font-size: 16px;
line-height: 19px;

text-align: center;

cursor: pointer;
transition: var(--transition-button);
}

.button:disabled {
opacity: 0.5;
pointer-events: none;
}

/* primary */
.button_primary {
color: var(--primary-text);
background-color: var(--primary);
}

.button_primary:hover {
background-color: var(--primary-hover);
}

/* secondary */
.button_secondary {
color: var(--secondary-text);
background-color: var(--secondary);
}

.button_secondary:hover {
background-color: var(--secondary-hover);
}

/* alternate */
.button_alternate {
color: var(--alternate-text);
background-color: var(--alternate);
border: 1px solid var(--alternate-border);
}

.button_alternate:hover {
background-color: var(--alternate-hover);
border: 1px solid var(--alternate-hover-border);
}

/* accordion */
.accordion {
  border: 1px solid var(--border-color);
  border-radius: 0.5em;
  padding: 1em 1.5em;
  font-family: var(--ff-secondary);
  font-size: 1rem;
  line-height: 1.5;
  background-color: var(--main-bg);
}

.accordion__summary {
  display: block;
  outline: none;
  height : 1.5em;
}

.accordion__title {
  float: left;
}

.accordion__icon {
  float: right;
}

.accordion__summary::after {
  clear: both;
}

.accordion__summary:focus {
  border-radius: 2px;
  padding: 2px 4px;
  box-shadow: 0px 0px 2px 2px var(--outline-color);
}

.accordion__summary::-webkit-details-marker {
  display: none;
}

.accordion__title {
  color: var(--accordion-title);
}

.accordion__text {
  color: var(--accordion-text);
}

.accordion[open] .accordion__icon {
  transform: rotate(180deg);
  transition: transform 0.35s ease-out;
}

.accordion__icon {
  color: var(--accordion-text);
  margin-left: auto;
  transition: transform 0.35s ease-out;
}

.accordion[open] .accordion__summary ~ * {
  animation: sweep .5s ease-in-out;
}

@keyframes sweep {
  0%    {opacity: 0; margin-left: -10px}
  100%  {opacity: 1; margin-left: 0px}
}