Skip to content

Composables и плагин

useCommandPalette

Composable, предоставляющий глобальное состояние палитры и все функции управления. Должен вызываться внутри дерева компонентов, где установлен VCommandPalettePlugin. Передайте имя инстанса — useCommandPalette('sidebar') — чтобы обратиться к именованному инстансу.

ts
import { useCommandPalette } from '@macrulez/vue-command-palette'

const {
  isOpen, // Readonly<Ref<boolean>>
  query, // Ref<string>
  results, // ComputedRef<SearchResult[]>
  activeIndex, // Ref<number>
  history, // Readonly<Ref<HistoryEntry[]>>
  loadingCommandId, // Readonly<Ref<string | null>>

  open, // (paletteId?: string) => void
  close, // () => void
  toggle, // () => void
  goBack, // () => void — извлекает историю или закрывает, если пусто
  executeCommand, // (cmd: Command) => Promise<void>
  executeActive, // () => Promise<void> — запускает текущий выбранный результат
  getRecentCommands, // () => Command[]
  getPinnedCommands, // () => Command[]
  registerCommands, // (commands: Command[]) => () => void
  registerGroup, // (group: CommandGroup) => () => void
  addRecent, // (id: string) => void
  pin,
  unpin,
  togglePin,
  isPinned, // API закреплённых команд
  pinnedIds, // Readonly<Ref<string[]>>
  queryHistory, // Readonly<Ref<string[]>>
} = useCommandPalette()

Программное управление

ts
const { open, close, toggle } = useCommandPalette()

open() // открыть палитру
close() // закрыть и сбросить состояние
toggle() // переключить открыто/закрыто

// Открыть под-палитру (навигация по хлебным крошкам)
open('parent-command-id')

useRegisterCommands

Регистрирует команды при монтировании компонента и автоматически снимает регистрацию при размонтировании. Команды, зарегистрированные так, не имеют заголовка группы.

ts
import { useRegisterCommands } from '@macrulez/vue-command-palette'

// В любом setup() компонента
useRegisterCommands([
  {
    id: 'format-doc',
    label: 'Format Document',
    icon: '✨',
    perform: () => formatDocument(),
  },
  {
    id: 'toggle-sidebar',
    label: 'Toggle Sidebar',
    shortcut: ['$mod', 'b'],
    perform: () => sidebar.toggle(),
  },
])

useRegisterGroup

Регистрирует полную группу команд с label и приоритетом при монтировании, снимает регистрацию при размонтировании.

ts
import { useRegisterGroup } from '@macrulez/vue-command-palette'

useRegisterGroup({
  id: 'editor',
  label: 'Editor',
  priority: 80,
  commands: [
    {
      id: 'editor-format',
      label: 'Format Document',
      description: 'Run Prettier on the current file',
      icon: '✨',
      perform: () => format(),
    },
    {
      id: 'editor-lint',
      label: 'Lint File',
      description: 'Run ESLint and show errors',
      icon: '🔍',
      enabled: () => isFileOpen.value,
      perform: () => lint(),
    },
  ],
})

VCommandPalettePlugin

Vue-плагин, настраивающий глобальное хранилище команд, слушатель клавиатуры и реактивное состояние.

ts
app.use(VCommandPalettePlugin, options)

Опции (PaletteOptions)

ОпцияТипПо умолчаниюОписание
namestring'default'Имя инстанса (см. Множественные инстансы)
hotkeystring[]['$mod', 'k']Комбинация клавиш для переключения палитры
colorTheme'light' | 'dark' | 'system''system'Начальная цветовая тема палитры
searchSearchFnвстроенный нечёткийКастомная стратегия поиска (см. Кастомный поиск)
searchNestedbooleantrueПоказывать вложенные subCommands в результатах поиска с хлебными крошками
showDisabledbooleanfalseПоказывать отключённые команды (серые, невыполнимые, в конце списка) вместо их скрытия
frecencybooleanfalseПовышать в ранжировании часто и недавно используемые команды (см. Frecency)
onSearch(query) => Command[] | Promise<Command[]>Асинхронный источник данных уровня плагина, объединяется с каждым запросом (см. Асинхронный поиск)
bindShortcutsbooleanfalseАвтоматически регистрировать shortcut каждой команды как глобальную горячую клавишу
persistRecentbooleantrueСохранять недавние команды в localStorage
maxRecentnumber5Максимальное общее число хранимых недавних команд
maxRecentPerGroupnumber0Максимум недавних на группу (0 = без ограничений)
localStorageKeystring'vcp:recent'Ключ, используемый в localStorage
onOpen() => voidВызывается каждый раз при открытии палитры
onClose() => voidВызывается каждый раз при закрытии палитры
onError(err: unknown, command: Command) => voidВызывается, когда perform() выбрасывает исключение
onHighlight(command: Command | null) => voidВызывается при смене активной по клавиатуре команды (для превью/аналитики)

Пример со всеми опциями

ts
app.use(VCommandPalettePlugin, {
  hotkey: ['$mod', 'k'],
  colorTheme: 'system', // 'light' | 'dark' | 'system'
  persistRecent: true,
  maxRecent: 8,
  maxRecentPerGroup: 2,
  localStorageKey: 'myapp:palette:recent',
  onOpen: () => analytics.track('palette_opened'),
  onClose: () => analytics.track('palette_closed'),
  onError: (err, cmd) => {
    console.error(`Command "${cmd.label}" failed:`, err)
    toast.error(`Failed to run "${cmd.label}"`)
  },
})

Клавиша $mod

$mod разрешается в Meta (⌘) на macOS и Ctrl на Windows / Linux — используйте её для переносимых между платформами сочетаний:

ts
hotkey: ['$mod', 'k'] // Cmd+K на Mac, Ctrl+K на Windows
shortcut: ['$mod', 'shift', 'p'] // Cmd+Shift+P на Mac, Ctrl+Shift+P на Windows