Replace the modal command palette with a nonmodal terminal dock.

Ctrl+K now opens a corner session with a parsed navigate grammar, persistent history, and no page lock. Unknown targets stay on a closed alias table and never become URLs.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-26 12:52:22 +02:00
parent 646b39b200
commit 162bd790da
23 changed files with 1322 additions and 1278 deletions

View File

@@ -0,0 +1,71 @@
<div class="terminal-dock" [class.is-open]="open()" [class.is-maximized]="maximized()">
<button
#trigger
type="button"
class="terminal-dock-trigger"
[attr.aria-expanded]="open()"
[attr.aria-controls]="open() ? panelId : null"
[attr.aria-label]="copy().triggerLabel"
(click)="onTriggerClick()"
>
<span>{{ copy().triggerLabel }}</span>
<kbd>{{ shortcutHint() }}</kbd>
</button>
@if (open()) {
<section class="terminal-dock-panel" [id]="panelId" [attr.aria-label]="copy().panelLabel">
<div class="terminal-dock-toolbar cluster">
<p class="terminal-dock-title">{{ copy().panelLabel }}</p>
<button
type="button"
class="terminal-dock-control"
[attr.aria-label]="maximizeLabel()"
[attr.aria-pressed]="maximized()"
(click)="toggleMaximized()"
>
{{ maximizeLabel() }}
</button>
<button
type="button"
class="terminal-dock-control"
[attr.aria-label]="copy().collapseLabel"
(click)="collapse()"
>
{{ copy().collapseLabel }}
</button>
</div>
<div
class="terminal-dock-log"
[id]="logId"
role="log"
aria-live="polite"
aria-atomic="false"
[attr.aria-label]="copy().outputLabel"
>
@for (line of log(); track line.id) {
<p [class.echo]="line.kind === 'echo'">{{ line.text }}</p>
}
</div>
<form class="terminal-dock-form" (submit)="onSubmit($event)">
<label class="terminal-dock-prompt" [attr.for]="inputId">
<span aria-hidden="true">{{ copy().prompt }}</span>
<span class="visually-hidden">{{ copy().inputLabel }}</span>
</label>
<input
#commandInput
[id]="inputId"
type="text"
autocomplete="off"
autocapitalize="off"
spellcheck="false"
[attr.placeholder]="copy().inputPlaceholder"
[value]="query()"
(input)="onQueryInput($event)"
(keydown)="onInputKeydown($event)"
/>
</form>
</section>
}
</div>