New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details →
Socket
Book a DemoSign in
Socket

accessible-search-select

Package Overview
Dependencies
Maintainers
1
Versions
5
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

accessible-search-select

Un componente de selección con buscador integrado, reutilizable y tipado en TypeScript. Soporta selección única o múltiple y filtrado en memoria.

latest
npmnpm
Version
0.0.4
Version published
Maintainers
1
Created
Source

Accessible Search Select

Un componente de selección con buscador integrado, reutilizable y tipado en TypeScript.
Soporta selección única o múltiple y filtrado en memoria.

Flujo de funcionamiento

Instalación

npm install accessible-search-select
# o
yarn add accessible-search-select

Requisitos

Esta librería utiliza React hooks, por lo que necesita que React esté instalado en tu proyecto.

npm install react react-dom

Uso básico

import { SelectSearch } from "accessible-search-select";

interface User {
  id: number;
  name: string;
}

const users: User[] = [
  { id: 1, name: "Juan" },
  { id: 2, name: "María" },
  { id: 3, name: "Pedro" },
];

export default function App() {
  return (
    <SelectSearch<User>
      options={users}
      optionLabel="name"
      optionValue="id"
      onChange={(value) => console.log("Seleccionado:", value)}
      placeholder="Buscar usuario..."
      noResultsText="Sin resultados"
    />
  );
}

💡 Nota: El tipo User es solo un ejemplo. El componente SelectSearch es genérico (<T>) y funciona con cualquier estructura de datos.

Props

PropTipoRequeridoDescripción
optionsT[]Lista de opciones a mostrar.
optionLabelkeyof TClave del objeto que se mostrará como texto en la lista.
optionLabel2keyof TClave opcional del objeto que se mostrará como texto secundario (entre paréntesis).
optionValuekeyof TClave del objeto que se usará como valor único de la opción.
valueT | T[]Valor actual (single o multiple).
onChange(value: T | T[] | null) => voidSe ejecuta al seleccionar/deseleccionar opciones.
multiplebooleanHabilita selección múltiple. Default: false.
placeholderstringTexto del input de búsqueda.
ariaInputLabelstringTexto accesible para el input. Default: "Buscar opción".
ariaListboxLabelstringTexto accesible para el listbox. Default: "Opciones disponibles".
noResultsTextstringTexto mostrado si no hay coincidencias.
classNamestringClase CSS personalizada para el contenedor.

Ejemplo con selección múltiple controlada (useState)

import { useState } from "react";
import { SelectSearch } from "accessible-search-select";

interface User {
  id: number;
  name: string;
}

const users: User[] = [
  { id: 1, name: "Juan" },
  { id: 2, name: "María" },
  { id: 3, name: "Pedro" },
];

export default function App() {
  const [selectedUsers, setSelectedUsers] = useState<User[] | null>([]);

  return (
    <div>
      <SelectSearch<User>
        options={users}
        optionLabel="name"
        optionValue="id"
        multiple
        value={selectedUsers}
        onChange={setSelectedUsers}
        placeholder="Buscar..."
        noResultsText="Nada encontrado"
      />

      {selectedUsers && selectedUsers.length > 0 && (
        <p>
          Usuarios seleccionados:{" "}
          {selectedUsers.map(u => u.name).join(", ")}
        </p>
      )}
    </div>
  );
}

Flujo de funcionamiento

La búsqueda actualiza searchTerm, se filtran las opciones y se renderiza la lista.
Al seleccionar, se llama onChange devolviendo un elemento único o un array según multiple.

Flujo de funcionamiento con ARIA

Accesibilidad:

El componente está diseñado para ser completamente accesible, compatible con lectores de pantalla y navegación con teclado.

  • El input utiliza aria-label (o ariaInputLabel) para describir su función.
  • La lista utiliza role="listbox" y aria-multiselectable si es selección múltiple.
  • Cada elemento utiliza role="option" y aria-selected según su estado.
  • La navegación con teclado mantiene aria-activedescendant apuntando al elemento resaltado (highlightedIndex), aunque no haya focus real en el li.

Personalización con CSS

Puedes pasar tu propia clase al componente usando la prop className para aplicar estilos externos a los elementos internos (input, ul, li).

import "accessible-search-select/style.css"; // Importa los estilos por defecto (opcional)

<SelectSearch<User>
  className="mi-select-search"
  options={users}
  optionLabel="name"
  optionValue="id"
  onChange={(v) => console.log(v)}
  placeholder="Buscar..."
/>

Clases internas

El componente utiliza las siguientes clases para aplicar estilos, siguiendo la convención BEM:

ClaseDescripción
select-search__containerContenedor principal del componente.
select-search__inputEl input de búsqueda.
select-search__listLista (ul) que contiene los elementos filtrados.
select-search__itemCada elemento (li) de la lista.
select-search__label2Texto secundario opcional (derivado de optionLabel2). Aparece entre paréntesis junto al label principal.
select-search__item--highlightedModificador visual para el elemento actualmente resaltado por navegación con teclado (no es focus real; se usa con aria-activedescendant).
select-search__item--selectedModificador para un elemento seleccionado.
select-search-no-resultsMensaje que aparece cuando no hay resultados.

💡 Nota: Las clases listadas arriba ya vienen preestilizadas en el CSS que exporta la librería, pero puedes sobrescribir sus estilos usando tu propia clase a través de la prop className.

CSS externo (personalizable)

/* =============================
   Contenedor principal (opcional)
   ============================= */
.mi-select-search {
  /* Estilos para el contenedor principal */
}

/* =============================
   Input de búsqueda
   ============================= */
.mi-select-search .select-search__input {
  /* Sobrescribe estilos si lo deseas */
}

/* =============================
   Lista de opciones
   ============================= */
.mi-select-search .select-search__list {
  /* Sobrescribe estilos si lo deseas */
}

/* =============================
   Elemento de lista
   ============================= */
.mi-select-search .select-search__item {
  /* Estilos base para cada opción */
}

/* =============================
   Segundo label opcional
   ============================= */
.mi-select-search .select-search__label2 {
  /* Sobrescribe/resalta estilos si lo deseas */
}

/* =============================
   Elemento actualmente resaltado
   ============================= */
.mi-select-search .select-search__item--highlighted {
  /* Resalta el item seleccionado por teclado */
}

/* =============================
   Elemento seleccionado
   ============================= */
.mi-select-search .select-search__item--selected {
  /* Estilos para la opción seleccionada */
}

/* =============================
   Mensaje de "sin resultados"
   ============================= */
.mi-select-search .select-search-no-results {
  /* Estilos para el mensaje */
}

💡 Nota: Al pasar tu propia clase al componente mediante la prop className, puedes sobrescribir los estilos de las clases internas (select-search__input, select-search__list, select-search__item, etc.) que ya vienen preestilizadas en el CSS de la librería.

Estructura interna

Estructura HTML del SelectSearch

En la imagen puedes ver la estructura interna del componente: un input seguido por un ul con li para cada opción.

Licencia

MIT

Keywords

react

FAQs

Package last updated on 01 Sep 2025

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts