<!-- AUTO-GENERATED by scripts/generate-docs.mjs — do not edit; edit docs/llm/reference/_fragments/<name>.md and run `pnpm docs:generate`. -->

# Overlays

Use when you need a transient layer above content.

## Index

- [`command-palette`](#command-palette) — Cmd/Ctrl+K searchable, grouped command panel
- [`drawer`](#drawer) — Edge-anchored slide-in panel with focus trap
- [`dropdown`](#dropdown) — Button-triggered floating menu with keyboard navigation
- [`modal`](#modal) — Dialog with overlay, focus trap and scroll lock
- [`popover`](#popover) — Interactive floating panel — like an interactive tooltip
- [`tooltip`](#tooltip) — Hover/focus floating label, auto-positioned

---

## command-palette

> Deep dive: [`docs/llm/command-palette.md`](../../../docs/llm/command-palette.md)

Cmd/Ctrl+K search panel with filterable, grouped commands (combobox/listbox).

```html
<div data-c42-command-palette>
  <div data-c42-command-overlay></div>
  <div data-c42-command-dialog>
    <input data-c42-command-input placeholder="Type a command…" />
    <div data-c42-command-list>
      <div data-c42-command-group data-label="Files">
        <button data-c42-command-item data-value="new" data-keywords="create">New File</button>
        <button data-c42-command-item data-value="open">Open File…</button>
      </div>
      <div data-c42-command-empty>No results</div>
    </div>
  </div>
</div>
```

```ts
import { CommandPalette } from '@42/core/command-palette';
const palette = new CommandPalette(root, { hotkey: 'k' });
palette.on('commandpalette:select', (e) => console.log(e.detail.value));
```

Keyboard: ⌘/Ctrl+K toggles; type to filter (label + `data-keywords`); ArrowUp/Down + Home/End move the highlight; Enter selects; Escape closes.
Options: `defaultOpen` (false), `hotkey` (`'k'`, `null` to disable), `closeOnOverlayClick` (true), `closeOnEscape` (true), `clearOnClose` (true), `filter(query, text)`
Methods: `openPalette()`, `close()`, `toggle()`, `isOpen`, `activeItem`
Events: `commandpalette:open`, `commandpalette:close`, `commandpalette:select` → `{ value, item }`, `commandpalette:filter` → `{ query, count }`

---

## drawer

Slide-in panel anchored to an edge. Focus trap, scroll lock, Esc/overlay dismissal.

```html
<div data-c42-drawer>
  <div data-c42-drawer-overlay></div>
  <div data-c42-drawer-content>
    <button data-c42-drawer-close>Close</button>
  </div>
</div>
```

```ts
import { Drawer } from '@42/core/drawer';
const drawer = new Drawer(root, { side: 'right', closeOnEscape: true, closeOnOverlayClick: true });
drawer.open();
```

Options: `side` ('left'|'right'|'top'|'bottom'), `closeOnOverlayClick`, `closeOnEscape`, `lockScroll`, `defaultOpen`
Events: `drawer:open`, `drawer:close`

---

## dropdown

Floating menu triggered by a button. Keyboard nav with arrows, Esc to close.

```html
<div data-c42-dropdown>
  <button data-c42-dropdown-trigger>Menu</button>
  <div data-c42-dropdown-menu>
    <button data-c42-dropdown-item>Option 1</button>
    <button data-c42-dropdown-item>Option 2</button>
  </div>
</div>
```

```ts
import { Dropdown } from '@42/core/dropdown';
new Dropdown(root, { placement: 'bottom-start', offset: 4, closeOnSelect: true });
```

Options: `placement` (Placement), `offset`, `closeOnSelect`
Events: `dropdown:open`, `dropdown:close`

---

## modal

Dialog with overlay, focus trap, scroll lock.

```html
<div data-c42-modal>
  <button data-c42-modal-trigger>Open</button>
  <div data-c42-modal-overlay>
    <div data-c42-modal-content>
      <button data-c42-modal-close>×</button>
      <p>Modal body</p>
    </div>
  </div>
</div>
```

```ts
import { Modal } from '@42/core/modal';
new Modal(root, { closeOnOverlayClick: true, closeOnEscape: true, lockScroll: true });
```

Options: `closeOnOverlayClick`, `closeOnEscape`, `lockScroll`, `defaultOpen`
Events: `modal:open`, `modal:close`

---

## popover

Interactive floating panel (links/forms/buttons inside). Toggles on click,
manages focus, closes on outside-click / Escape, positions with floating-ui.
Like a tooltip but interactive.

```html
<div data-c42-popover>
  <button data-c42-popover-trigger>Open</button>
  <div data-c42-popover-content>
    <a href="#">A link</a>
    <button>An action</button>
  </div>
</div>
```

```ts
import { Popover } from '@42/core/popover';
const p = new Popover(root, { placement: 'bottom', trapFocus: false });
p.toggle();
```

Options: `placement` (default 'bottom'), `offset` (default 8), `autoFocus` (default true), `trapFocus` (default false), `closeOnOutsideClick` (default true)
Methods: `openPopover()`, `close()`, `toggle()`, `isOpen`
Events: `popover:open`, `popover:close`

---

## tooltip

Floating tooltip on hover/focus. Auto-positioned via floating-ui.

```html
<span data-c42-tooltip>
  <button data-c42-tooltip-trigger>Hover me</button>
  <div data-c42-tooltip-content>Tooltip text</div>
</span>
```

```ts
import { Tooltip } from '@42/core/tooltip';
new Tooltip(root, { placement: 'top', offset: 6, openDelay: 200, closeDelay: 0 });
```

Options: `placement`, `offset`, `openDelay`, `closeDelay`
Events: `tooltip:open`, `tooltip:close`
