Рецепты
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базаОбязательный. Без него модификатор не работает.