mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-27 11:20:42 +01:00
feat(ui): round-4 feedback — tool-row-sized muted self-talk, BookOpen/Terminal tool icons, md status glyph in comments
- Interstitial self-talk matches tool rows: text-xs wrapper + scoped .tc-interstitial override (prose-sm sets its own font-size on .paperclip-markdown, so the utility alone can't shrink it) - tool-taxonomy: read family Book -> BookOpen, terminal SquareTerminal -> Terminal, edit SquarePen -> Terminal (per the letter of the board ask; the lucide link was pasted twice, flagged on the thread) - Inline issue-reference status glyph in markdown bodies steps down lg (20px) -> md (16px) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
fe7edd291b
commit
1daeef878b
4 files changed
+21
-17
No files matched your search
@@ -41,7 +41,7 @@ export function TaskChatBubble({ item }: TaskChatBubbleProps) {
|
||||
return (
|
||||
<div
|
||||
className={cn(
|
||||
"w-full text-sm text-muted-foreground",
|
||||
"tc-interstitial w-full text-xs text-muted-foreground",
|
||||
item.streaming && "tc-typewriter-stream",
|
||||
)}
|
||||
data-testid="task-chat-interstitial"
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
Book,
|
||||
BookOpen,
|
||||
Brain,
|
||||
ChevronsLeftRightEllipsis,
|
||||
MessageSquareReply,
|
||||
Network,
|
||||
Search,
|
||||
SearchCode,
|
||||
SquarePen,
|
||||
SquareTerminal,
|
||||
Terminal,
|
||||
Wrench,
|
||||
} from "lucide-react";
|
||||
import { McpIcon } from "./McpIcon";
|
||||
@@ -18,7 +17,7 @@ describe("toolTaxonomy", () => {
|
||||
it("maps each family to its icon and verb", () => {
|
||||
expect(toolTaxonomy("Bash")).toEqual({
|
||||
family: "terminal",
|
||||
icon: SquareTerminal,
|
||||
icon: Terminal,
|
||||
verbLabel: "Running a command",
|
||||
});
|
||||
expect(toolTaxonomy("Shell").family).toBe("terminal");
|
||||
@@ -38,14 +37,15 @@ describe("toolTaxonomy", () => {
|
||||
|
||||
expect(toolTaxonomy("Read")).toEqual({
|
||||
family: "read",
|
||||
icon: Book,
|
||||
icon: BookOpen,
|
||||
verbLabel: "Reading files",
|
||||
});
|
||||
expect(toolTaxonomy("NotebookRead").family).toBe("read");
|
||||
|
||||
// Round-4 board feedback: edits share the terminal glyph.
|
||||
expect(toolTaxonomy("Edit")).toEqual({
|
||||
family: "edit",
|
||||
icon: SquarePen,
|
||||
icon: Terminal,
|
||||
verbLabel: "Editing files",
|
||||
});
|
||||
expect(toolTaxonomy("Write").family).toBe("edit");
|
||||
@@ -87,10 +87,10 @@ describe("toolTaxonomy", () => {
|
||||
|
||||
describe("toolTaxonomy multi-word ACP titles", () => {
|
||||
it("classifies by the first word", () => {
|
||||
expect(toolTaxonomy("Read File").icon).toBe(Book);
|
||||
expect(toolTaxonomy("Edit File").icon).toBe(SquarePen);
|
||||
expect(toolTaxonomy("Write File").icon).toBe(SquarePen);
|
||||
expect(toolTaxonomy("Terminal").icon).toBe(SquareTerminal);
|
||||
expect(toolTaxonomy("Read File").icon).toBe(BookOpen);
|
||||
expect(toolTaxonomy("Edit File").icon).toBe(Terminal);
|
||||
expect(toolTaxonomy("Write File").icon).toBe(Terminal);
|
||||
expect(toolTaxonomy("Terminal").icon).toBe(Terminal);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -6,15 +6,14 @@
|
||||
* tools.
|
||||
*/
|
||||
import {
|
||||
Book,
|
||||
BookOpen,
|
||||
Brain,
|
||||
ChevronsLeftRightEllipsis,
|
||||
MessageSquareReply,
|
||||
Network,
|
||||
Search,
|
||||
SearchCode,
|
||||
SquarePen,
|
||||
SquareTerminal,
|
||||
Terminal,
|
||||
Wrench,
|
||||
} from "lucide-react";
|
||||
import type { ComponentType, SVGProps } from "react";
|
||||
@@ -70,11 +69,12 @@ export function mcpToolSegment(name: string): string | null {
|
||||
}
|
||||
|
||||
const FAMILY_META: Record<Exclude<ToolFamily, "mcp">, Omit<ToolTaxonomyEntry, "family">> = {
|
||||
terminal: { icon: SquareTerminal, verbLabel: "Running a command" },
|
||||
terminal: { icon: Terminal, verbLabel: "Running a command" },
|
||||
grep: { icon: SearchCode, verbLabel: "Grepping" },
|
||||
search: { icon: Search, verbLabel: "Searching" },
|
||||
read: { icon: Book, verbLabel: "Reading files" },
|
||||
edit: { icon: SquarePen, verbLabel: "Editing files" },
|
||||
read: { icon: BookOpen, verbLabel: "Reading files" },
|
||||
// Board round-4 feedback asked for the terminal glyph on edits as well.
|
||||
edit: { icon: Terminal, verbLabel: "Editing files" },
|
||||
web: { icon: ChevronsLeftRightEllipsis, verbLabel: "Fetching the web" },
|
||||
agent: { icon: Network, verbLabel: "Delegating" },
|
||||
other: { icon: Wrench, verbLabel: "Working" },
|
||||
|
||||
@@ -592,6 +592,10 @@
|
||||
CSS-only typewriter, no per-char timers. Text appended to an existing block
|
||||
lands instantly; history omits the class entirely. */
|
||||
.tc-typewriter-stream .paperclip-markdown > * { animation: tc-typewriter var(--motion-typewriter-reveal) var(--motion-typewriter-steps) both; }
|
||||
/* Interstitial narration matches the tool rows (text-xs): prose-sm sets its
|
||||
own font-size on .paperclip-markdown, so the wrapper's text-xs alone can't
|
||||
shrink it — this scoped override wins on specificity. */
|
||||
.tc-interstitial .paperclip-markdown { font-size: var(--text-xs); line-height: var(--text-xs--line-height); }
|
||||
|
||||
/* Scroll-to-latest pill (stock shadcn MessageScrollerButton motion, tokenized).
|
||||
The pill is centered with translateX(-50%), so the keyframes carry the X
|
||||
|
||||
Reference in new issue
Block a user