<!-- Docs styles -->
import { Story, Canvas, Preview, ArgsTable   } from '@storybook/addon-docs';
import image1 from '../../stories/assets/Docum_SDSS_Componentes/07_Selector_desplegable/01_Selector.png';
import image2 from '../../stories/assets/Docum_SDSS_Componentes/07_Selector_desplegable/02_Selector_Anatomia_ListaOpciones.png';
import image3 from '../../stories/assets/Docum_SDSS_Componentes/07_Selector_desplegable/03_Selector_Variaciones_Normal.png';
import image4 from '../../stories/assets/Docum_SDSS_Componentes/07_Selector_desplegable/04_Selector_Variaciones_EnLinea.png';
import image5 from '../../stories/assets/Docum_SDSS_Componentes/07_Selector_desplegable/05_Selector_Variaciones_Normal.png';
import image6 from '../../stories/assets/Docum_SDSS_Componentes/07_Selector_desplegable/06_Selector_Variaciones_Tamano32px.png';
import image7 from '../../stories/assets/Docum_SDSS_Componentes/07_Selector_desplegable/07_Selector_Variaciones_Normal.png';
import image8 from '../../stories/assets/Docum_SDSS_Componentes/07_Selector_desplegable/08_Selector_Variaciones_Light.png';
import image9 from '../../stories/assets/Docum_SDSS_Componentes/07_Selector_desplegable/09_Selector_Anatomia_Normal.png';
import image10 from '../../stories/assets/Docum_SDSS_Componentes/07_Selector_desplegable/10_Selector_Anatomia_EnLinea.png';
import image11 from '../../stories/assets/Docum_SDSS_Componentes/07_Selector_desplegable/11_Selector_Anatomia_Alturas40px.png';
import image12 from '../../stories/assets/Docum_SDSS_Componentes/07_Selector_desplegable/12_Selector_Anatomia_Alturas32px.png';
import image13 from '../../stories/assets/Docum_SDSS_Componentes/07_Selector_desplegable/13_Selector_Estados.png';

<style>
  {`
    .sbdocs-table tr * {
      text-align: center;
      font-weight: bold;
    }

    img {
      display: block;
      margin: 0 auto;
    }

    table {
      margin: 0 auto !important;
    }
  `}
</style>

# Selector / Select

Utilizaremos el selector para ofrecer una  **lista**  de  **opciones**  al usuario como respuesta a una pregunta, de las cuales solo puede  **elegir una**. El selector no muestra en reposo las opciones, por ello funciona bien cuando las opciones presentadas se pueden anticipar incluso antes de abrirlo (por ejemplo con respuestas tipo) o cuando la cantidad de opciones es muy grande.

| **Selector en reposo**<br></br> | **Selector abierto**<br></br> |
|-------------------------|------------------------|
| <img src={image1}/> | <img src={image2}/> |

Siempre que sea posible se recomienda usar los **botones de radio** antes que el selector, ya que permite visualizar las opciones más rápidamente además de ofrecer la posibilidad de textos de aclaración para cada opción.

No se recomienda el uso de selector para menús de navegación, ya que obliga a abrirlo para ver las opciones disponibles lo que limita la posibilidad de descubrir contenidos relevantes. En su lugar se recomienda el uso de otros componentes como el índice, la lista de enlaces o el desplegable.

Aunque los componentes selector y desplegable (dropdown) parecen similares tienen funciones muy diferentes. Mientras el selector permite elegir opciones de un conjunto de elementos y enviar los datos, el desplegable se utiliza para filtrar u ordenar contenido de una página.

Asimismo, desde el punto de vista de diseño, la capa abierta del selector toma los estilos que impone el navegador mientras que el desplegable permite la aplicación del diseño del tema seleccionado a la capa.

### **Variaciones**

<!--Existen dos variaciones para este componente, el selector normal y el selector en línea.

| **Selector normal**<br></br>(por defecto) | **Selector en línea**<br></br> |
|-------------------------|------------------------|
| <img src={image3}/> | <img src={image4}/> |

El  **selector normal**  se usa como parte de formularios, combinado con otros componentes y tiene la altura estándar de todos los componentes de formularios. Este es el tipo de selector por defecto.

El  **selector en línea**  (small selector / inline selector) se usa cuando se asocia con otros componentes, tanto en un interior (por ejemplo un selector en la cabecera de una tabla) o por agrupación de selectores y cajas creando componentes complejos.

Asimismo, -->
El selector normal tiene una variación de  **tamaño**, teniendo el tamaño por defecto una altura bde 40px y un tamaño pequeño de altura 32px que se usa cuando hay problemas de espacio.

| **Selector normal**<br></br>(por defecto) | **Selector pequeño**<br></br> |
|-------------------------|------------------------|
| <img src={image5}/> | <img src={image6}/> |

Por último existe también una variación según el color del fondo, proporcionándose, además de una versión normal con el fondo gris, otra que tiene el fondo blanco.

| **Selector normal**<br></br>(por defecto) | **Selector claro**<br></br> |
|-------------------------|------------------------|
| <img src={image7}/> | <img src={image8}/> |

### Contenido

El selector siempre llevará una  **etiqueta**  que lo encabeza y que describe las opciones que tiene incluidas.

Respecto a los  **textos**  de las opciones del selector, se recomienda que no seam no sean largos, ni que ocupen varias líneas, puesto que puede dar la sensación de ser diferentes opciones.

El selector incluirá siempre un  **texto predefinido**  que indique que se ha de desplegar el listado y seleccionar una opción, como «seleccione una opción».

Se recomienda que el  **orden**  de las opciones presentadas dentro del selector sea por probabilidad de que sea elegida por el usuario (si una opción es la más probable mejor ponerla la primera) y si no se puede aplicar este criterio, se ordenarán de forma alfabética.

Se recomienda también que se produzca una  **validación**  en tiempo real de la selección, que facilita el mantenimiento de los formularios y la claridad de la entrada de datos.

### Anatomía

El selector tiene, al igual que muchos componentes de entrada de información, una  **etiqueta**,  **texto de ayuda**  y el  **cajetín**  de selección que con tiene un  **texto**  que representa la selección y un  **icono**  que permite desplegar la lista de opciones.

Los textos de todos los tipos de selector, el normal, el selector en línea y el pequeño son los mismos, el estándar usado en los componentes, esto es Lato de 16px.

|  |
|-------------------------|
| <img src={image9}/> |
<!--
|  |  |
|-------------------------|------------------------|
| <img src={image9}/> | <img src={image10}/> |
-->
La  **altura**  de la caja, al contrario, es diferente para ambos tipos, 40px la altura del selector normal y 32px la del pequeño. Asismismo, los paddings del texto seleccionado y los del icono de despliegue varían, siendo 16px los del selector normal y 8px los del pequeño.

|  |  |
|-------------------------|------------------------|
| <img src={image11}/> | <img src={image12}/> |

Es importante señalar que la  **lista de opciones**  se desplegará con una capa que no mantiene los estilos del tema, sino los del navegador utilizado. Es por esto que no se define la anatomía de esta capa.

### Comportamiento

El listado de opciones de un selector se activa clicando tanto en el icono de despliegue como en el texto del interior del selector. De esta manera se facilita el uso del mismo y la interacción con el usuario.

El desplazamiento entre las diferentes opciones y la selección se realiza mediante los mecanismos definidos por el navegador, pero típicamente se usa la rueda del ratón o el panel táctil (touchpad). En dispositivos táctiles se emplean los dedos para desplazarse hacia arriba y abajo, y con el teclado se usan las flechas arriba y abajo. La selección se realiza mediante un clic, pulsando en la opción deseada, o con la tecla «intro».

La opción seleccionada se copia en el campo de texto del cajetín sustituyendo a la opción anteriormente seleccionada, o al texto predefinido en el caso de que sea la primera selección.

Los estados de este componente son enabled, hover, focus, open, disabled, error y skeleton.

<img src={image13}/>


### Código

```
<label for="input" class="bx--label">
  <slot name="label-text"> Etiqueta </slot>
</label>
<div class="bx--select-input__wrapper">
  <select id="input" class="bx--select-input bx--select-input--regular" aria-invalid="false">
    <option disabled="disabled" hidden="" selected="selected" class="bx--select-option" value="__bx-select-placeholder_a06zc8133lg"> Elige una opción </option>
    <optgroup class="bx--select-optgroup" label="Categoría 1">
      <option class="bx--select-option" label="" value="Opción 1"> Opción 1 </option>
      <option class="bx--select-option" label="" value="Opción 2"> Opción 2 </option>
      <option class="bx--select-option" label="" value="Opción 3"> Opción 3 </option>
    </optgroup>
    <optgroup class="bx--select-optgroup" label="Categoría 2">
      <option class="bx--select-option" label="" value="Opción 4"> Opción 4 </option>
      <option class="bx--select-option" label="" value="Opción 5"> Opción 5 </option>
      <option class="bx--select-option" label="" value="Opción 6"> Opción 6 </option> 
    </optgroup>
  </select>
  <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 16 16" class="bx--select__arrow"><!----><!----><!----><path d="M8 11L3 6 3.7 5.3 8 9.6 12.3 5.3 13 6z"></path></svg>
</div>
```

### Tokens

**Color**

| Class                 | Property   | Color toke  |
| :-------------------- | :--------- | :---------- |
| `.bx--select-input`   | background | `$field-01` |
| `.bx--select--light`  | background | `$field-02` |
| `.bx--select--inline` | background | transparent |
| `.bx--label`          | text color | `$text-01`  |
| `.bx--select-input`   | text color | `$text-01`  |
| `.bx--select--inline` | text color | `$icon-01`  |
| `.bx--select__arrow`  | fill       | `$icon-01`  |

| Class                             | Property   | Color token    |
| :-------------------------------- | :--------- | :------------- |
| `.bx--select-input:focus`         | border     | `$focus`       |
| `.bx--select-input[data-invalid]` | border     | `$support-01`  |
| `.bx--form-requirement`           | text color | `$support-01`  |
| `.bx--select-input:disabled`      | background | `$disabled-01` |
| `.bx--select-input:disabled`      | text color | `$disabled-02` |

**Tipografía**

| Class                   | Type token       |
| :---------------------- | :--------------- |
| `.bx--label`            | `$label-01`      |
| `.bx--select-input`     | `$body-short-01` |
| `.bx--select--inline`   | `$body-short-01` |
| `.bx--form-requirement` | `$label-01`      |

**Estructura**

| Class                     | Property                    | Spacing token |
| :------------------------ | :-------------------------- | :------------ |
| `.bx--select-input`       | height                      | –             |
| `.bx--label`              | margin-bottom               | `$spacing-03` |
| `.bx--select-input`       | padding-left                | `$spacing-05` |
| `.bx--select__arrow`      | padding-left, padding-right | `$spacing-05` |
| `.bx--select-input`       | border-bottom               | –             |
| `.bx--select-input:focus` | border                      | –             |
