diff --git a/src/lib/components/TerminalTUI.svelte b/src/lib/components/TerminalTUI.svelte
index 8acd06a..c98d079 100644
--- a/src/lib/components/TerminalTUI.svelte
+++ b/src/lib/components/TerminalTUI.svelte
@@ -83,10 +83,19 @@
lastColorMapId = colorMapId;
});
- // Get all interactive button indices
+ // Helper to check if a line or its children contain buttons
+ function hasButtons(line: TerminalLine): boolean {
+ if (line.type === 'button') return true;
+ if (line.type === 'group' && line.children) {
+ return line.children.some(child => hasButtons(child));
+ }
+ return false;
+ }
+
+ // Get all interactive button indices (including buttons nested in groups)
const buttonIndices = $derived(
displayedLines
- .map((item, i) => item.parsed.line.type === 'button' ? i : -1)
+ .map((item, i) => hasButtons(item.parsed.line) ? i : -1)
.filter(i => i !== -1)
);
diff --git a/src/lib/components/tui/TuiButton.svelte b/src/lib/components/tui/TuiButton.svelte
index f706e0d..0d3accb 100644
--- a/src/lib/components/tui/TuiButton.svelte
+++ b/src/lib/components/tui/TuiButton.svelte
@@ -26,6 +26,8 @@
style="--btn-color: {getButtonStyle(line.style)}"
on:click={() => onClick(index)}
on:mouseenter={() => onHover(index)}
+ data-href={line.href || ''}
+ data-external={isExternal ? 'true' : 'false'}
>
{selected ? '▶' : ' '}
{#if line.icon}
diff --git a/src/lib/components/tui/TuiGroup.svelte b/src/lib/components/tui/TuiGroup.svelte
index 101a2ab..52cf446 100644
--- a/src/lib/components/tui/TuiGroup.svelte
+++ b/src/lib/components/tui/TuiGroup.svelte
@@ -1,6 +1,7 @@