Spotlight
SpotlightCommand palette activado con Cmd+K / Ctrl+K. Búsqueda fuzzy instantánea, grupos, historial y dependencias multi-paso.
Demo en vivo
El Spotlight está activo en esta página. Presiónalo con el atajo de teclado o con el botón de búsqueda de la barra superior.
Incluye navegación a todas las páginas de la documentación con búsqueda fuzzy instantánea.
Qué es Spotlight
Spotlight es un command palette integrado en KoreUI que permite a los usuarios buscar y ejecutar acciones, navegar a páginas y buscar datos, todo desde el teclado.
- Atajo de teclado
Cmd+K/Ctrl+Kpara abrir - Búsqueda fuzzy instantánea sobre items locales
- Búsqueda remota con debounce para consultas a servidor
- Providers PHP para organizar items por grupos
- Historial de items recientes en localStorage
- Flujos multi-paso con dependencias (pills en el input)
- Dark mode automático via tokens semánticos
Instalación
El Spotlight viene incluido en KoreUI. Solo necesitas agregar el componente a tu layout.
<body>
{{ $slot }}
{{-- Spotlight --}}
<x-kore::spotlight />
{{-- Otros managers --}}
<livewire:kore-overlay-manager />
<livewire:kore-feedback-manager />
@livewireScripts
</body><body>
{{ $slot }}
{{-- Spotlight --}}
<x-kore::spotlight />
{{-- Otros managers --}}
<livewire:kore-overlay-manager />
<livewire:kore-feedback-manager />
@livewireScripts
</body>Con esto, presiona Cmd+K (Mac) o Ctrl+K (Windows/Linux) para abrir el Spotlight.
Uso mínimo
Puedes usar Spotlight sin providers, solo con búsqueda remota.
<x-kore::spotlight search-url="{{ route('spotlight.search') }}" /><x-kore::spotlight search-url="{{ route('spotlight.search') }}" />Crear un provider
Los providers son clases PHP que generan los items del Spotlight.
namespace App\Spotlight;
use KoreUi\Spotlight\SpotlightItem;
use KoreUi\Spotlight\SpotlightProvider;
class NavigationProvider extends SpotlightProvider
{
public function group(): string { return 'Navegación'; }
public function priority(): int { return 10; }
public function items(): array
{
return [
SpotlightItem::make('Inicio')->icon('home')->route('home'),
SpotlightItem::make('Configuración')->icon('settings')->route('settings')->shortcut('⌘,'),
];
}
}namespace App\Spotlight;
use KoreUi\Spotlight\SpotlightItem;
use KoreUi\Spotlight\SpotlightProvider;
class NavigationProvider extends SpotlightProvider
{
public function group(): string { return 'Navegación'; }
public function priority(): int { return 10; }
public function items(): array
{
return [
SpotlightItem::make('Inicio')->icon('home')->route('home'),
SpotlightItem::make('Configuración')->icon('settings')->route('settings')->shortcut('⌘,'),
];
}
}Registrar providers
Registra tus providers en la configuración o directamente en el componente.
'spotlight' => [
'providers' => [
\App\Spotlight\NavigationProvider::class,
],
],'spotlight' => [
'providers' => [
\App\Spotlight\NavigationProvider::class,
],
],<x-kore::spotlight :providers="[\App\Spotlight\NavigationProvider::class]" /><x-kore::spotlight :providers="[\App\Spotlight\NavigationProvider::class]" />API JavaScript
Controla el Spotlight programáticamente desde JavaScript.
// Abrir el Spotlight
window.dispatchEvent(new CustomEvent('kore:spotlight-open'));
// Abrir con query pre-llenado
window.dispatchEvent(new CustomEvent('kore:spotlight-open', {
detail: { query: 'crear' }
}));
// Cerrar el Spotlight
window.dispatchEvent(new CustomEvent('kore:spotlight-close'));// Abrir el Spotlight
window.dispatchEvent(new CustomEvent('kore:spotlight-open'));
// Abrir con query pre-llenado
window.dispatchEvent(new CustomEvent('kore:spotlight-open', {
detail: { query: 'crear' }
}));
// Cerrar el Spotlight
window.dispatchEvent(new CustomEvent('kore:spotlight-close'));// Cuando se abre
window.addEventListener('kore:spotlight:open', () => { /* ... */ });
// Cuando se cierra
window.addEventListener('kore:spotlight:close', () => { /* ... */ });
// Cuando se selecciona un item
window.addEventListener('kore:spotlight:select', (e) => {
console.log('Item seleccionado:', e.detail.item);
});// Cuando se abre
window.addEventListener('kore:spotlight:open', () => { /* ... */ });
// Cuando se cierra
window.addEventListener('kore:spotlight:close', () => { /* ... */ });
// Cuando se selecciona un item
window.addEventListener('kore:spotlight:select', (e) => {
console.log('Item seleccionado:', e.detail.item);
});Historial reciente
Los items utilizados se guardan en localStorage y aparecen al abrir el Spotlight con el input vacío.
// Limpiar programáticamente
localStorage.removeItem('kore-spotlight-history');// Limpiar programáticamente
localStorage.removeItem('kore-spotlight-history');Para deshabilitarlo, usa :show-recent="false" en el componente o 'show_recent' => false en la configuración.
Búsqueda fuzzy
El algoritmo de búsqueda fuzzy integrado pondera campos por peso para resultados relevantes.
| Campo | Peso | Descripción |
|---|---|---|
name | 3 | Coincidencias en el nombre tienen mayor valor |
synonyms | 2 | Términos alternativos de búsqueda |
description | 1 | Descripción del item |
Incluye bonus por caracteres consecutivos y por coincidencia al inicio de la cadena. Para datasets grandes (>200 items), puede reemplazarse por Fuse.js.
Tokens CSS
El Spotlight usa tokens existentes de kore-theme.css. No requiere tokens adicionales.
| Token | Uso |
|---|---|
--color-kore-surface | Background del panel |
--color-kore-surface-hover | Hover de items |
--color-kore-border | Bordes y separadores |
--color-kore-primary | Item seleccionado (10% opacity) |
--color-kore-muted-fg | Headers de grupo, placeholder |
--color-kore-fg | Texto de items |
--radius-kore-lg | Border radius del panel |
--shadow-kore-xl | Sombra del panel |
Dark mode funciona automáticamente con .dark o [data-theme="dark"] en <html>.
Props
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
shortcut
|
string | k | Tecla del atajo (Cmd/Ctrl + key) |
placeholder
|
string | Buscar acciones, páginas... | Placeholder del input de búsqueda |
providers
|
array | config(...) | Override de providers por instancia |
search-url
|
string|null | null | Endpoint para búsqueda remota |
search-method
|
string | GET | Método HTTP para búsqueda remota |
show-recent
|
bool | true | Mostrar historial de items recientes |
recent-count
|
int | 5 | Cantidad de items recientes a mostrar |
max-results
|
int | 50 | Máximo de resultados totales |
debounce
|
int | 300 | Milisegundos de debounce para búsqueda remota |
Configuración
Configuración completa del Spotlight en config/kore-ui.php.
'spotlight' => [
// Clases PHP de providers
'providers' => [],
// Atajo de teclado (Cmd/Ctrl + shortcut)
'shortcut' => 'k',
// Placeholder del input
'placeholder' => 'Buscar acciones, páginas...',
// Mostrar items cuando input está vacío
'show_results_without_input' => true,
// Historial reciente (localStorage)
'show_recent' => true,
'recent_count' => 5,
'max_history' => 10,
// Búsqueda remota global
'search_url' => null,
'search_method' => 'GET',
'debounce' => 300,
// Límite de resultados totales
'max_results' => 50,
// z-index (encima de overlays z-50 y feedback z-60)
'z_index' => 'z-[70]',
],'spotlight' => [
// Clases PHP de providers
'providers' => [],
// Atajo de teclado (Cmd/Ctrl + shortcut)
'shortcut' => 'k',
// Placeholder del input
'placeholder' => 'Buscar acciones, páginas...',
// Mostrar items cuando input está vacío
'show_results_without_input' => true,
// Historial reciente (localStorage)
'show_recent' => true,
'recent_count' => 5,
'max_history' => 10,
// Búsqueda remota global
'search_url' => null,
'search_method' => 'GET',
'debounce' => 300,
// Límite de resultados totales
'max_results' => 50,
// z-index (encima de overlays z-50 y feedback z-60)
'z_index' => 'z-[70]',
],