Skip to content

Справочник API

Command

ts
interface Command<T = unknown> {
  id: string // уникальный идентификатор
  label: string // отображаемый текст, ищется движком нечёткого поиска
  description?: string // подзаголовок под label
  icon?: Component | string // Vue-компонент или эмодзи / строка
  keywords?: string[] // дополнительные термины для поиска
  aliases?: string[] // альтернативные label (тот же счёт, что и совпадение по label)
  shortcut?: string[] // подсказка только для отображения: ['$mod', 'k']
  disabled?: boolean // постоянно недоступна
  enabled?: () => boolean // динамическое отключение — вычисляется на каждом рендере
  disabledReason?: string // тултип, показываемый когда команда отключена
  badge?: string | { text: string; color?: string } // небольшая метка (например, "New", "Pro")
  confirm?: string // подсказка перед выполнением
  perform: () => void | Promise<void> // действие; может быть асинхронным
  subCommands?: Command[] // открывает вложенную палитру при выборе
  page?: CommandPage // открывает страницу со своим вводом/асинхронным поиском
  actions?: CommandAction[] // дополнительные действия, открываются по Tab
  info?: string // текст/HTML, показываемый в панели предпросмотра (v-html)
  data?: T // типобезопасный payload (см. «Типизированные данные команды»)
}

Поле icon

Принимает строку-эмодзи, обычную текстовую строку или любой Vue-компонент:

ts
import MyIcon from './MyIcon.vue'

{
  icon: '🏠'
} // строка-эмодзи
{
  icon: '⌘'
} // строка-символ
{
  icon: MyIcon
} // Vue-компонент — рендерится как <MyIcon />

CommandAction

ts
interface CommandAction {
  id: string
  label: string
  icon?: Component | string
  shortcut?: string[] // подсказка только для отображения
  perform: () => void | Promise<void>
}

Дополнительное действие команды — см. Дополнительные действия.

CommandPage

ts
interface CommandPage {
  placeholder?: string // плейсхолдер ввода на странице
  items?: Command[] // статичные элементы (пустой запрос)
  onSearch?: (query: string) => Command[] | Promise<Command[]> // результаты по запросу (с debounce)
}

Открывается командой вместо (или в дополнение к) выполнения — см. Страницы команд.

Типизированные данные команды

Прикрепите произвольный типобезопасный payload к командам через дженерик Command<T> и его поле data. useRegisterCommands / useRegisterGroup, fuzzySearch<T>, SearchResult<T> и SearchFn<T> — все пробрасывают тип дальше, так что вы получаете полный вывод типов (и ошибки при несовпадении). По умолчанию используется unknown, поэтому существующий нетипизированный код не затрагивается.

ts
interface UserData {
  id: number
  email: string
}

useRegisterCommands<UserData>([
  {
    id: 'user-ada',
    label: 'Ada Lovelace',
    data: { id: 1, email: 'ada@example.com' }, // проверяется по UserData
    perform: () => {},
  },
])

// Автономный поиск сохраняет тип:
const results = fuzzySearch<UserData>('ada', commands)
results[0].command.data?.email // string | undefined
ts
// @ts-expect-error — data должен соответствовать UserData
const bad: Command<UserData> = { id: 'x', label: 'X', data: { wrong: true }, perform: () => {} }

Внутри слотов #item / #preview command типизирован как Command (data: unknown), поскольку палитра хранит команды смешанных типов — сужайте тип через приведение или type guard, когда там нужен payload.

SearchResult

ts
interface SearchResult {
  command: Command
  score: number
  matches: Array<[start: number, end: number]>
  groupId?: string
  parents?: Command[] // цепочка предков, когда результат — вложенная под-команда
  matchedField?: 'label' | 'description' | 'keyword' | 'alias' // какое поле выиграло счёт
  matchedText?: string // текст совпавшего ключевого слова/алиаса
}

PaletteContext

Полный инжектируемый контекст, доступный в кастомных composables через inject(PALETTE_INJECT_KEY):

ts
interface PaletteContext {
  store: CommandStore
  keyboard: KeyboardManager
  isOpen: Ref<boolean>
  query: Ref<string>
  activeIndex: Ref<number>
  history: Ref<HistoryEntry[]>
  recentIds: Ref<string[]>
  loadingCommandId: Ref<string | null>
  results: ComputedRef<SearchResult[]>
  persistRecent: boolean
  maxRecent: number
  maxRecentPerGroup: number
  localStorageKey: string
  onOpen?: () => void
  onClose?: () => void
  onError?: (err: unknown, command: Command) => void
}

createCommandStore

(search?: SearchFn, searchNested?: boolean, scoreBonus?: (command: Command) => number, showDisabled?: boolean) => CommandStore

Низкоуровневая фабрика, лежащая в основе VCommandPalettePlugin и утилит тестирования — регистрирует/ищет команды напрямую. Обычно не нужна напрямую: используйте плагин или useCommandPalette().

Типы TypeScript

Все публичные типы экспортируются из корня пакета:

ts
import type {
  Command,
  CommandGroupType, // определение группы — НЕ компонент CommandGroup
  CommandAction, // дополнительное действие команды
  CommandPage, // страница, открываемая командой (плейсхолдер + асинхронный onSearch)
  SearchResult, // { command, score, matches, groupId?, parents?, matchedField? }
  SearchFn, // сигнатура кастомной стратегии поиска
  PaletteMode, // активируемая префиксом область
  CommandUsage, // статистика frecency { count, lastUsed }
  PaletteOptions,
  PaletteLabels, // настраиваемые строки UI (i18n)
  PaletteContext,
  PaletteState,
  CommandStore,
  KeyboardManager,
} from '@macrulez/vue-command-palette'

Примечание: именованный экспорт CommandGroup — это Vue-компонент. Интерфейс определения группы экспортируется как CommandGroupType, чтобы избежать конфликта.