Skip to content

Commit 925f79c

Browse files
committed
feat: terminal search, clickable paths/URLs, ARIA sidebar fixes
Terminal: - Ctrl+Shift+F opens search overlay (buffer scan, match count, up/down nav) - Clickable file paths in output (opens in editor, resolves relative paths) - URL clicks now open in default browser via shell.openExternal - Right-click pastes directly (selection = copy, no selection = paste) ARIA Chat: - Chat fills full sidebar height (flex: 1, removed max-height cap) - URLs in responses are clickable buttons that open in browser - Styled with --blue, underline on hover
1 parent 46b5966 commit 925f79c

5 files changed

Lines changed: 424 additions & 26 deletions

File tree

src/panels/ClaudePanel/AriaChat.css

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
}
1111

1212
.aria-dock-expanded {
13-
max-height: 320px;
14-
min-height: 140px;
13+
flex: 1;
14+
min-height: 0;
1515
}
1616

1717
.aria-dock-chamber {
@@ -171,6 +171,29 @@
171171
color: var(--t2);
172172
}
173173

174+
/* ── Inline links in messages ── */
175+
176+
.aria-link {
177+
display: inline;
178+
font-size: inherit;
179+
font-family: var(--font-code);
180+
color: var(--blue);
181+
background: none;
182+
border: none;
183+
padding: 0;
184+
cursor: pointer;
185+
text-decoration: underline;
186+
text-decoration-color: transparent;
187+
text-underline-offset: 2px;
188+
word-break: break-all;
189+
transition: color var(--transition-fast), text-decoration-color var(--transition-fast);
190+
}
191+
192+
.aria-link:hover {
193+
color: var(--t1);
194+
text-decoration-color: var(--blue);
195+
}
196+
174197
/* ── Code blocks ── */
175198

176199
.aria-code-block {

src/panels/ClaudePanel/AriaChat.tsx

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,30 @@ function formatTime(ts: number): string {
2323
return `${h}:${m}`
2424
}
2525

26+
const URL_PATTERN = /(https?:\/\/[^\s<>"')\]]+)/g
27+
28+
function renderTextWithLinks(text: string, keyPrefix: string) {
29+
const segments = text.split(URL_PATTERN)
30+
return segments.map((seg, j) => {
31+
if (URL_PATTERN.test(seg)) {
32+
// Reset lastIndex after test() consumed it
33+
URL_PATTERN.lastIndex = 0
34+
return (
35+
<button
36+
key={`${keyPrefix}-link-${j}`}
37+
className="aria-link"
38+
onClick={() => window.daemon.shell.openExternal(seg)}
39+
title={seg}
40+
>
41+
{seg}
42+
</button>
43+
)
44+
}
45+
URL_PATTERN.lastIndex = 0
46+
return seg ? <span key={`${keyPrefix}-text-${j}`}>{seg}</span> : null
47+
})
48+
}
49+
2650
function renderContent(text: string) {
2751
const parts = text.split(/(```[\s\S]*?```)/g)
2852
return parts.map((part, i) => {
@@ -37,7 +61,7 @@ function renderContent(text: string) {
3761
)
3862
}
3963
if (!part.trim()) return null
40-
return <span key={i}>{part}</span>
64+
return <span key={i}>{renderTextWithLinks(part, String(i))}</span>
4165
})
4266
}
4367

src/panels/Terminal/Terminal.css

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,89 @@
450450
padding: 4px 2px;
451451
}
452452

453+
/* Terminal output search overlay — top-right of terminal container */
454+
.terminal-search-overlay {
455+
position: absolute;
456+
top: 8px;
457+
right: 10px;
458+
width: min(380px, calc(100% - 20px));
459+
border: 1px solid var(--border);
460+
border-radius: 6px;
461+
background: var(--s2);
462+
backdrop-filter: blur(6px);
463+
box-shadow: var(--shadow-float);
464+
z-index: 5;
465+
}
466+
467+
.terminal-search-input-row {
468+
display: flex;
469+
align-items: center;
470+
gap: 4px;
471+
padding: 4px 6px;
472+
}
473+
474+
.terminal-search-icon {
475+
color: var(--t3);
476+
display: flex;
477+
align-items: center;
478+
flex-shrink: 0;
479+
}
480+
481+
.terminal-search-input {
482+
flex: 1;
483+
background: none;
484+
border: none;
485+
outline: none;
486+
font-size: 12px;
487+
font-family: 'JetBrains Mono', 'Cascadia Code', monospace;
488+
color: var(--t1);
489+
min-width: 0;
490+
}
491+
492+
.terminal-search-input::placeholder {
493+
color: var(--t4);
494+
}
495+
496+
.terminal-search-count {
497+
font-size: 10px;
498+
color: var(--t3);
499+
white-space: nowrap;
500+
padding: 0 4px;
501+
flex-shrink: 0;
502+
}
503+
504+
.terminal-search-nav {
505+
width: 20px;
506+
height: 20px;
507+
display: flex;
508+
align-items: center;
509+
justify-content: center;
510+
border-radius: 3px;
511+
color: var(--t2);
512+
flex-shrink: 0;
513+
}
514+
515+
.terminal-search-nav:hover:not(:disabled) {
516+
background: var(--s4);
517+
color: var(--t1);
518+
}
519+
520+
.terminal-search-nav:disabled {
521+
opacity: 0.3;
522+
cursor: default;
523+
}
524+
525+
/* xterm search highlight override */
526+
.terminal-view .xterm-rows span.search-match {
527+
background: color-mix(in srgb, var(--amber) 35%, transparent) !important;
528+
outline: 1px solid var(--amber);
529+
}
530+
531+
.terminal-view .xterm-rows span.search-match-active {
532+
background: color-mix(in srgb, var(--green) 40%, transparent) !important;
533+
outline: 1px solid var(--green);
534+
}
535+
453536
/* Agent Grid — multi-page Claude session grid */
454537
.agent-grid-wrapper {
455538
display: flex;

0 commit comments

Comments
 (0)