diff --git a/frontend/src/components/ToolCallCard.vue b/frontend/src/components/ToolCallCard.vue index 940ecad..c4230f8 100644 --- a/frontend/src/components/ToolCallCard.vue +++ b/frontend/src/components/ToolCallCard.vue @@ -1,5 +1,5 @@ - - {{ label }} - - {{ toolCall.arguments.title ?? toolCall.arguments.summary ?? toolCall.arguments.query ?? toolCall.function }} - - - {{ toolCall.result.error }} - - - {{ deletedNote.title || "Untitled" }} - - - {{ noteContent.title || "Untitled" }} - - #{{ tag }} - - - - {{ noteListCount }} found - - - {{ n.title || "Untitled" }} - - +{{ noteList.length - 8 }} more - - No notes found - - - {{ (toolCall.result.data?.count as number) ?? (toolCall.result.data?.total as number) ?? 0 }} found - - - {{ r.title || "Untitled" }} - - - - - {{ eventData.title }} - {{ formatEventTime(eventData.start) }} - - - {{ updatedEvent.title }} - {{ formatEventTime(updatedEvent.start) }} - - - {{ deletedEvent.title }} - - - - {{ name }} - - - - - {{ todoData.summary }} - - {{ formatEventTime(todoData.due) }} - - - {{ todoCount }} found - - - {{ t.summary }} - {{ formatEventTime(t.due) }} - - - +{{ todoList.length - 5 }} more - - - - - {{ taskCount }} found - - - {{ t.title }} - {{ t.due_date }} - {{ t.priority }} - - +{{ taskList.length - 5 }} more - - - - {{ eventCount }} found - - - {{ ev.title }} - {{ formatEventTime(ev.start) }} - - - +{{ eventList.length - 5 }} more - - - - - {{ webSearch.count }} result{{ webSearch.count !== 1 ? "s" : "" }} - - {{ r.title || r.url }} - - - - {{ title }} - + + + + {{ label }} - - + + + + {{ toolCall.arguments.title ?? toolCall.arguments.summary ?? toolCall.arguments.query ?? toolCall.function }} + + + + {{ toolCall.result.error }} + + + {{ deletedNote.title || "Untitled" }} + + + + {{ noteContent.title || "Untitled" }} + + + + {{ noteListCount }} found + + + + {{ (toolCall.result.data?.count as number) ?? (toolCall.result.data?.total as number) ?? 0 }} found + + + + {{ eventData.title }} + {{ formatEventTime(eventData.start) }} + + + {{ updatedEvent.title }} + {{ formatEventTime(updatedEvent.start) }} + + + {{ deletedEvent.title }} + + + {{ calendarList.length }} calendar{{ calendarList.length !== 1 ? "s" : "" }} + + + + {{ todoData.summary }} + + {{ formatEventTime(todoData.due) }} + + + {{ todoCount }} found + + + {{ taskCount }} found + + + {{ eventCount }} found + + + + {{ webSearch.count }} result{{ webSearch.count !== 1 ? "s" : "" }} + + + + {{ title }} + + + + ▶ + + + + + + + #{{ tag }} + + + + + + {{ n.title || "Untitled" }} + +{{ noteList.length - 8 }} more + + + + + + {{ r.title || "Untitled" }} + + + + + + + {{ t.summary }} + {{ formatEventTime(t.due) }} + + +{{ todoList.length - 5 }} more + + + + + + + {{ t.title }} + {{ t.due_date }} + {{ t.priority }} + + +{{ taskList.length - 5 }} more + + + + + + + {{ ev.title }} + {{ formatEventTime(ev.start) }} + + +{{ eventList.length - 5 }} more + + + + + + {{ name }} + + + + + + {{ r.title || r.url }} + + + + + + Suggested tags: + + #{{ tag }} + ✓ + + + + + + Suggested tags: .tool-call-card { - display: inline-flex; - flex-wrap: wrap; - align-items: center; - gap: 0.35rem; + display: inline-block; background: var(--color-bg-secondary); border: 1px solid var(--color-border); - border-radius: 12px; - padding: 0.3rem 0.6rem; + border-radius: 10px; font-size: 0.8rem; margin-top: 0.4rem; + overflow: hidden; + vertical-align: top; } .tool-call-card.error { border-color: var(--color-danger, #e74c3c); @@ -384,44 +436,83 @@ async function applyTag(tag: string) { .tool-call-card.declined { opacity: 0.55; } -.tool-declined-name { - text-decoration: line-through; - color: var(--color-text-muted); + +/* ── Header ── */ +.tool-card-header { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 0.35rem; + padding: 0.3rem 0.6rem; } +.tool-card-header.clickable { + cursor: pointer; + user-select: none; +} +.tool-card-header.clickable:hover { + background: color-mix(in srgb, var(--color-primary) 6%, transparent); +} + .tool-label { font-weight: 600; color: var(--color-text-muted); text-transform: uppercase; letter-spacing: 0.03em; font-size: 0.7rem; + flex-shrink: 0; } + +.tool-chevron { + font-size: 0.55rem; + color: var(--color-text-muted); + margin-left: auto; + padding-left: 0.4rem; + transition: transform 0.15s ease; + flex-shrink: 0; +} +.tool-chevron.open { + transform: rotate(90deg); +} + +.tool-summary-count { + color: var(--color-text-muted); + font-size: 0.8rem; +} + +/* ── Detail ── */ +.tool-card-detail { + padding: 0.3rem 0.6rem 0.45rem; + border-top: 1px solid var(--color-border); + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +/* ── Shared content styles ── */ .tool-link { color: var(--color-primary); text-decoration: none; } -.tool-link:hover { - text-decoration: underline; -} -.tool-error { - color: var(--color-danger, #e74c3c); -} -.tool-search-info { +.tool-link:hover { text-decoration: underline; } + +.tool-error { color: var(--color-danger, #e74c3c); } + +.tool-declined-name { + text-decoration: line-through; color: var(--color-text-muted); } + .tool-search-results { display: flex; flex-wrap: wrap; gap: 0.25rem; - width: 100%; } .tool-search-item { color: var(--color-primary); text-decoration: none; font-size: 0.8rem; } -.tool-search-item:hover { - text-decoration: underline; -} +.tool-search-item:hover { text-decoration: underline; } .tool-search-item:not(:last-child)::after { content: ","; color: var(--color-text-muted); @@ -431,131 +522,59 @@ async function applyTag(tag: string) { flex-direction: column; flex-wrap: nowrap; } -.web-search-results .tool-search-item::after { - content: none; -} -.tool-event-title { - font-weight: 600; - color: var(--color-text); -} -.tool-event-time { - color: var(--color-text-muted); - font-size: 0.75rem; -} -.tool-event-list { - display: flex; - flex-direction: column; - gap: 0.2rem; - width: 100%; -} -.tool-event-item { - display: flex; - justify-content: space-between; - align-items: baseline; - gap: 0.5rem; -} -.tool-event-item-title { - color: var(--color-text); - font-size: 0.8rem; -} -.tool-event-item-time { - color: var(--color-text-muted); - font-size: 0.75rem; - white-space: nowrap; -} -.tool-event-more { - color: var(--color-text-muted); - font-size: 0.75rem; - font-style: italic; -} -.tool-deleted { - text-decoration: line-through; - opacity: 0.7; -} -.tool-note-tags { - display: flex; - flex-wrap: wrap; - gap: 0.2rem; - width: 100%; -} -.tool-note-tag { - font-size: 0.72rem; - color: var(--color-text-muted); -} +.web-search-results .tool-search-item::after { content: none; } + +.tool-event-title { font-weight: 600; color: var(--color-text); } +.tool-event-time { color: var(--color-text-muted); font-size: 0.75rem; } + +.tool-event-list { display: flex; flex-direction: column; gap: 0.2rem; } +.tool-event-item { display: flex; justify-content: space-between; align-items: baseline; gap: 0.5rem; } +.tool-event-item-title { color: var(--color-text); font-size: 0.8rem; } +.tool-event-item-time { color: var(--color-text-muted); font-size: 0.75rem; white-space: nowrap; } +.tool-event-more { color: var(--color-text-muted); font-size: 0.75rem; font-style: italic; } + +.tool-deleted { text-decoration: line-through; opacity: 0.7; } +.tool-completed { text-decoration: line-through; color: var(--color-success, #2ecc71); } + +.tool-note-tags { display: flex; flex-wrap: wrap; gap: 0.2rem; } +.tool-note-tag { font-size: 0.72rem; color: var(--color-text-muted); } + .tool-task-priority { - font-size: 0.7rem; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.04em; - padding: 0.1rem 0.3rem; - border-radius: 3px; + font-size: 0.7rem; font-weight: 600; text-transform: uppercase; + letter-spacing: 0.04em; padding: 0.1rem 0.3rem; border-radius: 3px; } .priority-high { color: var(--color-danger, #e74c3c); } .priority-medium { color: var(--color-warning, #f59e0b); } .priority-low { color: var(--color-text-muted); } -.tool-completed { - text-decoration: line-through; - color: var(--color-success, #2ecc71); -} -.tool-calendar-list { - display: flex; - flex-wrap: wrap; - gap: 0.3rem; -} + +.tool-calendar-list { display: flex; flex-wrap: wrap; gap: 0.3rem; } .tool-calendar-name { - display: inline-block; - padding: 0.1rem 0.5rem; - border-radius: 999px; - background: var(--color-bg-secondary); - border: 1px solid var(--color-border); - font-size: 0.75rem; - color: var(--color-text); + display: inline-block; padding: 0.1rem 0.5rem; + border-radius: 999px; background: var(--color-bg-secondary); + border: 1px solid var(--color-border); font-size: 0.75rem; color: var(--color-text); } -/* Tag suggestions */ +/* ── Tag suggestions ── */ .tag-suggestions { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 0.3rem; - width: 100%; - margin-top: 0.25rem; - padding-top: 0.3rem; - border-top: 1px solid var(--color-border); + display: flex; flex-wrap: wrap; align-items: center; gap: 0.3rem; + padding: 0.3rem 0.6rem; border-top: 1px solid var(--color-border); } -.tag-suggestions-label { - font-size: 0.7rem; - color: var(--color-text-muted); - font-weight: 500; +.tool-call-card:not(:has(.tool-card-detail)) .tag-suggestions { + /* When outside detail, no top border needed if it's the only extra content */ } +.tag-suggestions-label { font-size: 0.7rem; color: var(--color-text-muted); font-weight: 500; } + .tag-pill { - display: inline-flex; - align-items: center; - gap: 0.2rem; - padding: 0.15rem 0.5rem; - border: 1px solid var(--color-primary); - border-radius: 999px; - background: transparent; - color: var(--color-primary); - font-size: 0.75rem; - cursor: pointer; - transition: background 0.15s, color 0.15s; -} -.tag-pill:hover:not(:disabled) { - background: var(--color-primary); - color: #fff; + display: inline-flex; align-items: center; gap: 0.2rem; + padding: 0.15rem 0.5rem; border: 1px solid var(--color-primary); + border-radius: 999px; background: transparent; color: var(--color-primary); + font-size: 0.75rem; cursor: pointer; transition: background 0.15s, color 0.15s; } +.tag-pill:hover:not(:disabled) { background: var(--color-primary); color: #fff; } .tag-pill.applied { - background: var(--color-success, #2ecc71); - border-color: var(--color-success, #2ecc71); - color: #fff; - cursor: default; -} -.tag-pill:disabled:not(.applied) { - opacity: 0.6; - cursor: wait; -} -.tag-check { - font-size: 0.65rem; + background: var(--color-success, #2ecc71); border-color: var(--color-success, #2ecc71); + color: #fff; cursor: default; } +.tag-pill:disabled:not(.applied) { opacity: 0.6; cursor: wait; } +.tag-check { font-size: 0.65rem; }