<!-- Docs styles -->
import { Story, Canvas, Preview, ArgsTable   } from '@storybook/addon-docs';
import image1 from '../../stories/assets/Docum_SDSS_Componentes/04_Campo_numerico/01_Numero_Input.png';
import image2 from '../../stories/assets/Docum_SDSS_Componentes/04_Campo_numerico/02_Numero_Anatomia.png';
import image3 from '../../stories/assets/Docum_SDSS_Componentes/04_Campo_numerico/03_Numero_Estados.png';

<style>
  {`
    .sbdocs-table tr * {
      text-align: center;
      font-weight: bold;
    }

    img {
      display: block;
      margin: 0 auto;
    }

  `}
</style>

# Campo numérico / Number input

Es un tipo de campo de información especial donde el dato esperado es una  **cifra**. Cierto tipo de datos numéricos que no sean cifras, como por ejemplo una fecha, tienen componentes específicos para introducir la información.

<img src={image1}/>

Al ser un tipo específico de  **campo de texto**, todas las características de este son de aplicación al campo numérico, manteniendo las siguientes salvedades.

El campo numérico tiene apariencia de un campo de texto normal pero permite, además de introducir manualmente el número, afinar el valor introducido con los controles incrementales “+” y “-“ que acompañan al componente.

No se recomienda el uso de campos numéricos cuando se esperan números de muchas cifras o con un gran incremento. Funcionan mejor para pequeños incrementos que requieren pocos clics. En estos casos se recomienda usar un campo de texto normal.

Se recomienda utilizar un  **valor por defecto**  cuando se presenta el campo indicando así su formato (comas y puntos) y da una referencia numérica, así como una etiqueta clara y concisa que además indique la unidad del número introducido si se requiere.

### Anatomía

La anatomía de este componente es similar a la del campo de texto, a la que se le añaden los  **iconos**  de los controles incrementales de medida concordante con el texto, esto es 16px.

El  **padding**  de los elementos es el estándar de 16px y se incluye un  **separador**  de 1px sin padding entre los dos iconos.

<img src={image2}/>

### Comportamiento

Cada vez que el usuario pulsa en los controles el valor variará de forma  **incremental**. Por defecto el valor variará en 1 unidad, pero se puede establecer que los saltos sean cantidades más grandes (10, 100…).

Los  **estados**  del componente son los mismos que los del campo de texto, con la salvedad de que el los estados hover y focus pueden afectar por separado a los distintos elementos (caja o controles incrementales).

<img src={image3}/>


### Código

```
<div class="bx--number bx--number--regular">
  <label for="input" class="bx--label">
    <slot name="label-text">  </slot>
  </label>
  <div class="bx--number__input-wrapper">
    <input id="input" type="number" role="alert" aria-atomic="true" min="0" max="9999">
      <div class="bx--number__controls">
        <button aria-live="polite" aria-atomic="true" type="button" class="bx--number__control-btn up-icon" aria-label="increase number input">
          <svg focusable="false" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" fill="currentColor" aria-hidden="true" width="16" height="16" viewBox="0 0 32 32">
            <path d="M17 15L17 8 15 8 15 15 8 15 8 17 15 17 15 24 17 24 17 17 24 17 24 15z"></path>
          </svg>
        </button>
        <button aria-live="polite" aria-atomic="true" type="button" class="bx--number__control-btn down-icon" aria-label="decrease number input">
          <svg focusable="false" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" fill="currentColor" aria-hidden="true" width="16" height="16" viewBox="0 0 32 32">
            <path d="M8 15H24V17H8z"></path>
          </svg>
        </button>
      </div>
    </div>
    <div class="bx--form__helper-text">
      <slot name="helper-text">  </slot>
    </div>
    <div class="bx--form-requirement" hidden="">
      <slot name="validity-message">  </slot>
    </div>
    <div class="bx--form-requirement" hidden="">
      <slot name="validity-message-max">  </slot>
    </div>
    <div class="bx--form-requirement" hidden="">
      <slot name="validity-message-min">  </slot>
    </div> 
</div>
```

### Tokens

**Color**

| Class                              | Property         | Color token |
| :--------------------------------- | :--------------- | :---------- |
| `.bx--label`                       | text color       | `$text-02`  |
| `.bx--number input[type='number']` | text color       | `$text-01`  |
| `.bx--number`                      | background-color | `$field-01` |
| `.bx--number--light`               | background-color | `$field-02` |
| `.bx--number`                      | border-bottom    | `$ui-04`    |
| `.bx--number__controls`            | svg color        | `$icon-01`  |

| Class                                       | Property         | Color token    |
| :------------------------------------------ | :--------------- | :------------- |
| `.bx--number:focus`                         | border           | `$focus`       |
| `.bx--number__controls:focus`               | border           | `$focus`       |
| `[data-invalid]`                            | border           | `$support-01`  |
| `[data-invalid]:focus`                      | color            | `$support-01`  |
| `.bx--form-requirement`                     | text color       | `$support-01`  |
| `.bx--label:disabled`                       | text color       | `$disabled-02` |
| `.bx--number:disabled`                      | background-color | `$disabled-01` |
| `.bx--number input[type='number']:disabled` | text color       | `$disabled-03` |

**Tipografía**

| Class                              | Type token       |
| :--------------------------------- | :--------------- |
| `.bx--label`                       | `$label-01`      |
| `.bx--number input[type='number']` | `$body-short-01` |
| `.bx--form-requirement`            | `$label-01`      |

**Estructura**

| Class                              | Property                    | Spacing token |
| :--------------------------------- | :-------------------------- | :------------ |
| `.bx--label`                       | margin-bottom               | `$spacing-03` |
| `.bx--number input`                | height                      | –             |
| `.bx--number input[type='number']` | padding-left                | `$spacing-05` |
| `.bx--number__controls`            | padding-left, padding-right | `$spacing-05` |
| `.bx--number`                      | border-bottom               | –             |
