Рецепты
05
CommandPalette
Поиск по командам на ⌘K — настоящий listbox с полной навигацией с клавиатуры.
отрендерил aura-react
отрендерил aura-react
отрендерил aura-react
отрендерил aura-react
отрендерил aura-react
Код
Demo.tsx
import { useMemo, useState } from 'react';
import { Button, Dialog, Field, Typography } from '@ilomee/aura-react';
const COMMANDS = [
{ id: 'theme', label: 'Toggle theme' },
{ id: 'accent', label: 'Change accent', description: '10 to choose from' },
{ id: 'docs', label: 'Open docs' },
];
// Палитра — это Dialog, Field и список, который вы фильтруете. `Dialog` даёт затемнение, ловушку и
// Escape; листбокс из `Select` даёт клавиатуру, когда по списку нужно ходить стрелками. Это форма,
// а не компонент: то, что палитра *делает*, — ваши команды.
export default function Demo() {
const [open, setOpen] = useState(true);
const [query, setQuery] = useState('');
const shown = useMemo(
() => COMMANDS.filter((c) => c.label.toLowerCase().includes(query.toLowerCase())),
[query],
);
return (
<>
<Button variant="primary" onClick={() => setOpen(true)}>
Open palette
</Button>
<Dialog open={open} onClose={() => setOpen(false)} label="Commands" top autoFocus={false}>
<Field label="Command" value={query} onValueChange={setQuery} placeholder="Type a command…" />
<ul className="aura-listbox" role="listbox" aria-label="Commands" style={{ marginTop: 12 }}>
{shown.map((command) => (
<li key={command.id} className="aura-listbox__option" role="option" aria-selected="false">
<span className="aura-listbox__label">
{command.label}
{command.description && (
<span className="aura-listbox__description">{command.description}</span>
)}
</span>
</li>
))}
{shown.length === 0 && <li className="aura-listbox__empty">Nothing matches.</li>}
</ul>
<Typography variant="caption" tone="faint" style={{ marginTop: 12 }}>
Wire ⌘K to `setOpen(true)` — the shortcut is the app's, not the dialog's.
</Typography>
</Dialog>
</>
);
}Это пример, а не компонент: его не поставляет ни один пакет и импортировать нечего. Он собран из примитивов, которые есть во всех четырёх пакетах, поэтому та же композиция работает в любом стеке — скопируйте её в свой компонент, и дальше она ваша.
Пропсы
Пропсов нет: композиция принимает то, что вы передадите примитивам внутри неё. Их пропсы — на их собственных страницах.
Какие классы отдаёт
Все фреймворки отдают одни и те же классы — именно поэтому четыре библиотеки выглядят одинаково. Их можно использовать напрямую, вообще без библиотеки компонентов.
| Класс | Роль | Примечания |
|---|---|---|
| .aura-overlay | база | Обязательный. Без него модификатор не работает. |
| .aura-popup | база | Обязательный. Без него модификатор не работает. |