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:
161
src/app/shared/terminal/terminal-dock.scss
Normal file
161
src/app/shared/terminal/terminal-dock.scss
Normal file
@@ -0,0 +1,161 @@
|
||||
@use 'breakpoints' as bp;
|
||||
|
||||
:host {
|
||||
display: contents;
|
||||
}
|
||||
|
||||
.terminal-dock {
|
||||
position: fixed;
|
||||
z-index: 40;
|
||||
inset-inline-end: var(--space-4);
|
||||
inset-block-end: var(--space-4);
|
||||
display: grid;
|
||||
justify-items: end;
|
||||
gap: var(--space-2);
|
||||
}
|
||||
|
||||
.terminal-dock-trigger {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: var(--space-2);
|
||||
min-height: 2.75rem;
|
||||
padding: var(--space-2) var(--space-3);
|
||||
border: 1px solid var(--surface-glass-border);
|
||||
border-radius: var(--radius-sm);
|
||||
background: var(--color-surface-raised);
|
||||
color: var(--color-text);
|
||||
font: inherit;
|
||||
}
|
||||
|
||||
.terminal-dock-trigger kbd {
|
||||
padding: 0.1rem var(--space-2);
|
||||
border: 1px solid var(--surface-glass-border);
|
||||
border-radius: var(--radius-sm);
|
||||
font-family: var(--font-mono);
|
||||
font-size: var(--text-xs);
|
||||
color: var(--color-text-muted);
|
||||
}
|
||||
|
||||
.terminal-dock-panel {
|
||||
display: grid;
|
||||
grid-template-rows: auto 1fr auto;
|
||||
gap: var(--space-3);
|
||||
width: 100%;
|
||||
max-height: min(70vh, 32rem);
|
||||
padding: var(--space-4);
|
||||
border: 1px solid var(--surface-glass-border);
|
||||
border-radius: var(--radius-lg) var(--radius-lg) 0 0;
|
||||
background: var(--color-surface-raised);
|
||||
box-shadow: var(--shadow-raised);
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
.terminal-dock.is-open {
|
||||
inset-inline: 0;
|
||||
inset-block-end: 0;
|
||||
justify-items: stretch;
|
||||
}
|
||||
|
||||
.terminal-dock.is-open .terminal-dock-trigger {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.is-maximized .terminal-dock-panel {
|
||||
max-height: 90vh;
|
||||
}
|
||||
|
||||
.terminal-dock-title,
|
||||
.terminal-dock-log,
|
||||
.terminal-dock-log p,
|
||||
.terminal-dock-form {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.terminal-dock-title {
|
||||
font-size: var(--text-sm);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.terminal-dock-control {
|
||||
min-height: 2.75rem;
|
||||
padding-inline: var(--space-3);
|
||||
border: 1px solid var(--surface-glass-border);
|
||||
border-radius: var(--radius-sm);
|
||||
background: transparent;
|
||||
color: var(--color-text);
|
||||
font: inherit;
|
||||
}
|
||||
|
||||
.terminal-dock-log {
|
||||
overflow: auto;
|
||||
min-height: 6rem;
|
||||
font-family: var(--font-mono);
|
||||
font-size: var(--text-sm);
|
||||
color: var(--color-text-muted);
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.terminal-dock-log .echo {
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
.terminal-dock-form {
|
||||
display: grid;
|
||||
grid-template-columns: auto 1fr;
|
||||
align-items: center;
|
||||
gap: var(--space-2);
|
||||
}
|
||||
|
||||
.terminal-dock-prompt {
|
||||
font-family: var(--font-mono);
|
||||
font-size: var(--text-sm);
|
||||
color: var(--color-accent-cool);
|
||||
}
|
||||
|
||||
.terminal-dock-form input {
|
||||
min-height: 2.75rem;
|
||||
padding: var(--space-2) var(--space-3);
|
||||
border: 1px solid var(--surface-glass-border);
|
||||
border-radius: var(--radius-sm);
|
||||
background: var(--color-surface);
|
||||
color: var(--color-text);
|
||||
font-family: var(--font-mono);
|
||||
font-size: var(--text-sm);
|
||||
}
|
||||
|
||||
@media (hover: hover) and (pointer: fine) {
|
||||
.terminal-dock-trigger:hover,
|
||||
.terminal-dock-control:hover {
|
||||
border-color: var(--surface-glass-border-strong);
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.terminal-dock,
|
||||
.terminal-dock-panel {
|
||||
transition: none;
|
||||
}
|
||||
}
|
||||
|
||||
@include bp.respond-to(md) {
|
||||
.terminal-dock.is-open {
|
||||
inset-inline: auto var(--space-4);
|
||||
inset-block-end: var(--space-4);
|
||||
justify-items: end;
|
||||
}
|
||||
|
||||
.terminal-dock.is-open .terminal-dock-trigger {
|
||||
display: inline-flex;
|
||||
}
|
||||
|
||||
.terminal-dock-panel {
|
||||
width: min(28rem, calc(100vw - var(--space-8)));
|
||||
max-height: min(22rem, 60vh);
|
||||
border-radius: var(--radius-md);
|
||||
}
|
||||
|
||||
.is-maximized .terminal-dock-panel {
|
||||
width: min(48rem, calc(100vw - var(--space-8)));
|
||||
max-height: min(36rem, 80vh);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user