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:
71
src/app/shared/terminal/terminal-dock.html
Normal file
71
src/app/shared/terminal/terminal-dock.html
Normal 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>
|
||||
Reference in New Issue
Block a user