Core
Core headless
@cmd-kit/core es el centro agnóstico al framework del proyecto. Te da secciones tipadas, fuzzy search, snapshot building, primitivas de ejecución, seguimiento de recientes y helpers de tema sin imponer ninguna capa de render.
Instalación
npm install @cmd-kit/core Qué cubre
- ítems y secciones de comandos
- filtrado fuzzy mediante el pipeline de búsqueda compartido
- snapshots agrupados para renderizado
- modelado de navegación anidada
- despacho de ejecución para callbacks, links y páginas anidadas
- primitivas de estado para recientes
- resolución de tema (simple o dual) y helpers de CSS variables
Ejemplo mínimo
import {
createCommandSnapshot,
createResolvedConfig,
dispatchCommandExecution
} from "@cmd-kit/core";
const config = createResolvedConfig({
sections: [
{
id: "navigation",
title: "Navigation",
items: [
{ id: "home", title: "Dashboard", href: "/dashboard" }
]
}
]
});
const snapshot = createCommandSnapshot(config, "dash");
await dispatchCommandExecution({
item: snapshot.items[0],
port: {
openHref: ({ href }) => window.location.assign(href)
}
}); Añadir un comando nuevo
Para añadir una opción nueva, agrega un nuevo ítem en la configuración de secciones. shortcut es opcional a nivel de datos y solo se mostrará si tu UI lo renderiza.
const config = createResolvedConfig({
sections: [
{
id: "navigation",
title: "Navigation",
items: [
{ id: "home", title: "Dashboard", href: "/dashboard" },
{ id: "billing", title: "Billing", href: "/billing", shortcut: "mod+b" },
{ id: "support", title: "Support", href: "/support" }
]
}
]
}); Comandos recientes en Core
Core no expone una prop recents porque es headless. Para implementar recientes usa recordRecentCommand y resolveRecentCommands en tu estado, o no lo uses si no necesitas esa sección.
import {
recordRecentCommand,
resolveRecentCommands
} from "@cmd-kit/core";
let recentRecords: Array<{ itemId: string; timestamp: number }> = [];
recentRecords = recordRecentCommand({
current: recentRecords,
itemId: "home",
limit: 6
});
const recentItems = resolveRecentCommands(config.items, recentRecords); Tema y mensajes
import {
createThemeCssText,
resolveMessages,
resolveTheme,
resolveThemeMode
} from "@cmd-kit/core";
const themeModes = {
light: { accentColor: "#0fa6d8", backgroundColor: "#ffffff" },
dark: { accentColor: "#12b5e5", backgroundColor: "#0f1720" }
};
const theme = resolveTheme(themeModes, resolveThemeMode());
const messages = resolveMessages({
searchPlaceholder: "Buscar comandos"
});
const cssText = createThemeCssText(theme); Cuándo usarlo directamente
Usa el core directamente cuando quieras construir tu propia UI, integrarte en otro framework o mantener la implementación totalmente custom. Si quieres un componente listo para usar, empieza por uno de los adaptadores oficiales.
FAQ
¿Core incluye componentes visuales?
No. Core es headless y aporta modelado de comandos, filtrado, snapshots, ejecución y helpers de tema/mensajes.
¿Cuándo debo empezar directamente por Core?
Cuando ya sabes que necesitas una UI completamente custom o un adaptador propio.
¿Core soporta carga asíncrona de comandos?
Sí. Puedes usar source y loadCommandSource con el mismo shape de datos que en los adaptadores.
¿Cómo ejecuto enlaces, callbacks y navegación anidada?
Con dispatchCommandExecution y una implementación de port para openHref, runCallback y navigate.
¿Puedo compartir datos entre Core y los adaptadores?
Sí. El modelo de comandos es común, así que puedes migrar sin rediseñar la estructura de ítems/secciones.