@0xmaxma/claude-gateway 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +791 -0
- package/config.template.json +87 -0
- package/dist/agent/context-isolation.d.ts +28 -0
- package/dist/agent/context-isolation.d.ts.map +1 -0
- package/dist/agent/context-isolation.js +80 -0
- package/dist/agent/context-isolation.js.map +1 -0
- package/dist/agent/runner.d.ts +211 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +1802 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/workspace-loader.d.ts +31 -0
- package/dist/agent/workspace-loader.d.ts.map +1 -0
- package/dist/agent/workspace-loader.js +207 -0
- package/dist/agent/workspace-loader.js.map +1 -0
- package/dist/api/auth.d.ts +25 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +77 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/cron-router.d.ts +22 -0
- package/dist/api/cron-router.d.ts.map +1 -0
- package/dist/api/cron-router.js +197 -0
- package/dist/api/cron-router.js.map +1 -0
- package/dist/api/gateway-router.d.ts +52 -0
- package/dist/api/gateway-router.d.ts.map +1 -0
- package/dist/api/gateway-router.js +215 -0
- package/dist/api/gateway-router.js.map +1 -0
- package/dist/api/router.d.ts +5 -0
- package/dist/api/router.d.ts.map +1 -0
- package/dist/api/router.js +1098 -0
- package/dist/api/router.js.map +1 -0
- package/dist/api/skills-router.d.ts +5 -0
- package/dist/api/skills-router.d.ts.map +1 -0
- package/dist/api/skills-router.js +424 -0
- package/dist/api/skills-router.js.map +1 -0
- package/dist/api/workspace-router.d.ts +4 -0
- package/dist/api/workspace-router.d.ts.map +1 -0
- package/dist/api/workspace-router.js +149 -0
- package/dist/api/workspace-router.js.map +1 -0
- package/dist/config/loader.d.ts +16 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +235 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/migrator.d.ts +70 -0
- package/dist/config/migrator.d.ts.map +1 -0
- package/dist/config/migrator.js +343 -0
- package/dist/config/migrator.js.map +1 -0
- package/dist/config/watcher.d.ts +30 -0
- package/dist/config/watcher.d.ts.map +1 -0
- package/dist/config/watcher.js +170 -0
- package/dist/config/watcher.js.map +1 -0
- package/dist/cron/manager.d.ts +48 -0
- package/dist/cron/manager.d.ts.map +1 -0
- package/dist/cron/manager.js +580 -0
- package/dist/cron/manager.js.map +1 -0
- package/dist/cron/scheduler.d.ts +50 -0
- package/dist/cron/scheduler.d.ts.map +1 -0
- package/dist/cron/scheduler.js +231 -0
- package/dist/cron/scheduler.js.map +1 -0
- package/dist/discord/receiver.d.ts +17 -0
- package/dist/discord/receiver.d.ts.map +1 -0
- package/dist/discord/receiver.js +108 -0
- package/dist/discord/receiver.js.map +1 -0
- package/dist/heartbeat/history.d.ts +24 -0
- package/dist/heartbeat/history.d.ts.map +1 -0
- package/dist/heartbeat/history.js +50 -0
- package/dist/heartbeat/history.js.map +1 -0
- package/dist/heartbeat/parser.d.ts +26 -0
- package/dist/heartbeat/parser.d.ts.map +1 -0
- package/dist/heartbeat/parser.js +283 -0
- package/dist/heartbeat/parser.js.map +1 -0
- package/dist/history/cleanup.d.ts +21 -0
- package/dist/history/cleanup.d.ts.map +1 -0
- package/dist/history/cleanup.js +171 -0
- package/dist/history/cleanup.js.map +1 -0
- package/dist/history/db.d.ts +27 -0
- package/dist/history/db.d.ts.map +1 -0
- package/dist/history/db.js +323 -0
- package/dist/history/db.js.map +1 -0
- package/dist/history/media-store.d.ts +27 -0
- package/dist/history/media-store.d.ts.map +1 -0
- package/dist/history/media-store.js +158 -0
- package/dist/history/media-store.js.map +1 -0
- package/dist/history/types.d.ts +62 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +3 -0
- package/dist/history/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +483 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +3 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +81 -0
- package/dist/logger.js.map +1 -0
- package/dist/memory/manager.d.ts +45 -0
- package/dist/memory/manager.d.ts.map +1 -0
- package/dist/memory/manager.js +178 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/session/compactor.d.ts +22 -0
- package/dist/session/compactor.d.ts.map +1 -0
- package/dist/session/compactor.js +151 -0
- package/dist/session/compactor.js.map +1 -0
- package/dist/session/process.d.ts +76 -0
- package/dist/session/process.d.ts.map +1 -0
- package/dist/session/process.js +729 -0
- package/dist/session/process.js.map +1 -0
- package/dist/session/store.d.ts +102 -0
- package/dist/session/store.d.ts.map +1 -0
- package/dist/session/store.js +533 -0
- package/dist/session/store.js.map +1 -0
- package/dist/skills/index.d.ts +9 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +15 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/invoker.d.ts +16 -0
- package/dist/skills/invoker.d.ts.map +1 -0
- package/dist/skills/invoker.js +36 -0
- package/dist/skills/invoker.js.map +1 -0
- package/dist/skills/loader.d.ts +23 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +183 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/parser.d.ts +55 -0
- package/dist/skills/parser.d.ts.map +1 -0
- package/dist/skills/parser.js +178 -0
- package/dist/skills/parser.js.map +1 -0
- package/dist/skills/sync.d.ts +10 -0
- package/dist/skills/sync.d.ts.map +1 -0
- package/dist/skills/sync.js +130 -0
- package/dist/skills/sync.js.map +1 -0
- package/dist/skills/watcher.d.ts +16 -0
- package/dist/skills/watcher.d.ts.map +1 -0
- package/dist/skills/watcher.js +25 -0
- package/dist/skills/watcher.js.map +1 -0
- package/dist/telegram/markdown.d.ts +25 -0
- package/dist/telegram/markdown.d.ts.map +1 -0
- package/dist/telegram/markdown.js +237 -0
- package/dist/telegram/markdown.js.map +1 -0
- package/dist/telegram/receiver.d.ts +17 -0
- package/dist/telegram/receiver.d.ts.map +1 -0
- package/dist/telegram/receiver.js +104 -0
- package/dist/telegram/receiver.js.map +1 -0
- package/dist/types.d.ts +224 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/web-ui.d.ts +6 -0
- package/dist/ui/web-ui.d.ts.map +1 -0
- package/dist/ui/web-ui.js +227 -0
- package/dist/ui/web-ui.js.map +1 -0
- package/dist/watch/factory.d.ts +26 -0
- package/dist/watch/factory.d.ts.map +1 -0
- package/dist/watch/factory.js +43 -0
- package/dist/watch/factory.js.map +1 -0
- package/dist/webhook/manager.d.ts +34 -0
- package/dist/webhook/manager.d.ts.map +1 -0
- package/dist/webhook/manager.js +120 -0
- package/dist/webhook/manager.js.map +1 -0
- package/mcp/bun.lock +264 -0
- package/mcp/channel-manager.ts +115 -0
- package/mcp/package.json +15 -0
- package/mcp/router.ts +69 -0
- package/mcp/server.ts +129 -0
- package/mcp/tools/agent/handlers.ts +578 -0
- package/mcp/tools/agent/module.ts +163 -0
- package/mcp/tools/browser/module.ts +321 -0
- package/mcp/tools/browser/skills/open-browser/SKILL.md +89 -0
- package/mcp/tools/cron/client.ts +65 -0
- package/mcp/tools/cron/module.ts +158 -0
- package/mcp/tools/cron/skills/cron/SKILL.md +46 -0
- package/mcp/tools/discord/access.ts +197 -0
- package/mcp/tools/discord/client.ts +31 -0
- package/mcp/tools/discord/commands.ts +48 -0
- package/mcp/tools/discord/inbound.ts +53 -0
- package/mcp/tools/discord/module.ts +442 -0
- package/mcp/tools/discord/outbound.ts +90 -0
- package/mcp/tools/discord/receiver-server.ts +58 -0
- package/mcp/tools/discord/skills/access/SKILL.md +86 -0
- package/mcp/tools/discord/skills/configure/SKILL.md +53 -0
- package/mcp/tools/discord/threading.ts +37 -0
- package/mcp/tools/discord/types.ts +106 -0
- package/mcp/tools/skills/handlers.ts +196 -0
- package/mcp/tools/skills/module.ts +163 -0
- package/mcp/tools/telegram/module.ts +454 -0
- package/mcp/tools/telegram/pure.ts +224 -0
- package/mcp/tools/telegram/receiver-server.ts +1656 -0
- package/mcp/tools/telegram/skills/access/SKILL.md +169 -0
- package/mcp/tools/telegram/skills/configure/SKILL.md +118 -0
- package/mcp/tools/telegram/typing.ts +327 -0
- package/mcp/types.ts +128 -0
- package/package.json +62 -0
- package/resource/claude_gateway.svg +112 -0
package/mcp/types.ts
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the gateway multi-channel architecture.
|
|
3
|
+
* Adopts openclaw patterns: ChannelModule interface, ToolVisibility, Route Resolution.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export type ChannelId = string;
|
|
7
|
+
|
|
8
|
+
export type InboundMessage = {
|
|
9
|
+
channel: ChannelId;
|
|
10
|
+
accountId: string;
|
|
11
|
+
senderId: string;
|
|
12
|
+
chatId: string;
|
|
13
|
+
chatType: 'direct' | 'group' | 'channel';
|
|
14
|
+
text: string;
|
|
15
|
+
messageId: string;
|
|
16
|
+
replyToMessageId?: string;
|
|
17
|
+
threadId?: string;
|
|
18
|
+
attachmentFileId?: string;
|
|
19
|
+
ts: number;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export type OutboundMessage = {
|
|
23
|
+
channel: ChannelId;
|
|
24
|
+
accountId: string;
|
|
25
|
+
chatId: string;
|
|
26
|
+
text: string;
|
|
27
|
+
replyToMessageId?: string;
|
|
28
|
+
files?: string[];
|
|
29
|
+
format?: 'text' | 'html' | 'markdown';
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export type ChannelCapabilities = {
|
|
33
|
+
typingIndicator: boolean;
|
|
34
|
+
reactions: boolean;
|
|
35
|
+
editMessage: boolean;
|
|
36
|
+
fileAttachment: boolean;
|
|
37
|
+
threadReply: boolean;
|
|
38
|
+
maxMessageLength: number;
|
|
39
|
+
markupFormat: 'html' | 'markdown' | 'none';
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export type ChannelAccountSnapshot = {
|
|
43
|
+
accountId: string;
|
|
44
|
+
running: boolean;
|
|
45
|
+
configured: boolean;
|
|
46
|
+
lastMessageAt?: number;
|
|
47
|
+
lastError?: string;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export type McpToolDefinition = {
|
|
51
|
+
name: string;
|
|
52
|
+
description: string;
|
|
53
|
+
inputSchema: object;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export type McpToolResult = {
|
|
57
|
+
content: Array<{ type: 'text'; text: string }>;
|
|
58
|
+
isError?: boolean;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* ToolVisibility: openclaw pattern
|
|
63
|
+
* "current-channel" — expose tools only when this channel is the origin
|
|
64
|
+
* "all-configured" — expose tools always (cross-channel sends, cron)
|
|
65
|
+
*/
|
|
66
|
+
export type ToolVisibility = 'current-channel' | 'all-configured';
|
|
67
|
+
|
|
68
|
+
/** Chat channel module — receives and sends messages */
|
|
69
|
+
export interface ChannelModule {
|
|
70
|
+
id: ChannelId;
|
|
71
|
+
capabilities: ChannelCapabilities;
|
|
72
|
+
toolVisibility: ToolVisibility;
|
|
73
|
+
|
|
74
|
+
/** Check whether this module is configured and enabled */
|
|
75
|
+
isEnabled(): boolean;
|
|
76
|
+
|
|
77
|
+
/** MCP tools exposed by this module */
|
|
78
|
+
getTools(): McpToolDefinition[];
|
|
79
|
+
|
|
80
|
+
/** Execute a tool call */
|
|
81
|
+
handleTool(name: string, args: Record<string, unknown>): Promise<McpToolResult>;
|
|
82
|
+
|
|
83
|
+
/** Initialize bot client for tool calls (non-blocking) */
|
|
84
|
+
initBot?(): Promise<void>;
|
|
85
|
+
|
|
86
|
+
/** Start listening for inbound messages */
|
|
87
|
+
start(handler: InboundMessageHandler, signal: AbortSignal): Promise<void>;
|
|
88
|
+
|
|
89
|
+
/** Runtime status snapshot */
|
|
90
|
+
getSnapshot(): ChannelAccountSnapshot;
|
|
91
|
+
|
|
92
|
+
/** Skills directory path */
|
|
93
|
+
skillsDir?: string;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Tool-only module — no inbound messages (e.g. cron) */
|
|
97
|
+
export interface ToolModule {
|
|
98
|
+
id: string;
|
|
99
|
+
toolVisibility: ToolVisibility;
|
|
100
|
+
isEnabled(): boolean;
|
|
101
|
+
getTools(): McpToolDefinition[];
|
|
102
|
+
handleTool(name: string, args: Record<string, unknown>): Promise<McpToolResult>;
|
|
103
|
+
skillsDir?: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export type InboundMessageHandler = (msg: InboundMessage) => Promise<void>;
|
|
107
|
+
|
|
108
|
+
/** Route resolution result — openclaw ResolvedAgentRoute */
|
|
109
|
+
export type ResolvedRoute = {
|
|
110
|
+
agentId: string;
|
|
111
|
+
channel: ChannelId;
|
|
112
|
+
accountId: string;
|
|
113
|
+
sessionKey: string;
|
|
114
|
+
chatId: string;
|
|
115
|
+
chatType: 'direct' | 'group' | 'channel';
|
|
116
|
+
senderId: string;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
/** Channel context injected into agent system prompt */
|
|
120
|
+
export type ChannelContext = {
|
|
121
|
+
origin: {
|
|
122
|
+
channel: ChannelId;
|
|
123
|
+
chatId: string;
|
|
124
|
+
senderId: string;
|
|
125
|
+
chatType: 'direct' | 'group' | 'channel';
|
|
126
|
+
};
|
|
127
|
+
configuredChannels: ChannelId[];
|
|
128
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@0xmaxma/claude-gateway",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Multi-agent gateway for Claude",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/0xMaxMa/claude-gateway"
|
|
8
|
+
},
|
|
9
|
+
"main": "dist/index.js",
|
|
10
|
+
"bin": {
|
|
11
|
+
"claude-gateway": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"engines": {
|
|
14
|
+
"node": ">=22"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist/",
|
|
18
|
+
"resource/",
|
|
19
|
+
"mcp/",
|
|
20
|
+
"README.md",
|
|
21
|
+
"config.template.json"
|
|
22
|
+
],
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"start": "node --no-warnings=ExperimentalWarning --env-file-if-exists=.env dist/index.js",
|
|
29
|
+
"test": "jest",
|
|
30
|
+
"test:unit": "jest --testPathPattern=unit",
|
|
31
|
+
"integration": "jest --testPathPattern=integration --testTimeout=15000",
|
|
32
|
+
"integration:ma": "jest --testPathPattern=multi-agent --testTimeout=15000",
|
|
33
|
+
"test:manual": "jest --testPathPattern=phase-manual --testTimeout=15000",
|
|
34
|
+
"integration:hb": "jest --testPathPattern=heartbeat-e2e --testTimeout=15000",
|
|
35
|
+
"integration:cs": "jest --testPathPattern=character-system --testTimeout=15000",
|
|
36
|
+
"typecheck": "tsc --noEmit"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"chokidar": "^3.5.0",
|
|
40
|
+
"cron-parser": "^5.5.0",
|
|
41
|
+
"express": "^4.18.0",
|
|
42
|
+
"js-yaml": "^4.1.0",
|
|
43
|
+
"lru-cache": "^10.0.0",
|
|
44
|
+
"node-cron": "^3.0.0",
|
|
45
|
+
"p-queue": "^6.6.2"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@types/express": "^4.17.0",
|
|
49
|
+
"@types/jest": "^29.0.0",
|
|
50
|
+
"@types/js-yaml": "^4.0.0",
|
|
51
|
+
"@types/node": "^22.19.18",
|
|
52
|
+
"@types/node-cron": "^3.0.0",
|
|
53
|
+
"@types/supertest": "^7.2.0",
|
|
54
|
+
"@types/tmp": "^0.2.0",
|
|
55
|
+
"jest": "^29.0.0",
|
|
56
|
+
"supertest": "^7.2.2",
|
|
57
|
+
"tmp": "^0.2.0",
|
|
58
|
+
"ts-jest": "^29.0.0",
|
|
59
|
+
"ts-node": "^10.9.2",
|
|
60
|
+
"typescript": "^5.0.0"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
<svg width="100%" viewBox="0 0 680 490" xmlns="http://www.w3.org/2000/svg" role="img">
|
|
2
|
+
<title style="fill:rgb(0, 0, 0);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">Claude pixel art with small claw on terminal</title>
|
|
3
|
+
<desc style="fill:rgb(0, 0, 0);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">A pixelated orange Claude character with a small open claw arm on the right side, on a black terminal background with green command text.</desc>
|
|
4
|
+
|
|
5
|
+
<defs>
|
|
6
|
+
<pattern id="scanlines" x="0" y="0" width="4" height="4" patternUnits="userSpaceOnUse">
|
|
7
|
+
<rect x="0" y="0" width="4" height="2" fill="#000000"/>
|
|
8
|
+
<rect x="0" y="2" width="4" height="2" fill="#0A0E0C"/>
|
|
9
|
+
</pattern>
|
|
10
|
+
</defs>
|
|
11
|
+
|
|
12
|
+
<!-- Terminal background -->
|
|
13
|
+
<rect x="0" y="0" width="680" height="480" fill="#05080A" style="fill:rgb(5, 8, 10);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
14
|
+
<rect x="0" y="0" width="680" height="480" fill="url(#scanlines)" opacity="0.35" style="stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.35;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
15
|
+
|
|
16
|
+
<!-- Terminal text -->
|
|
17
|
+
<text x="20" y="36" font-family="Courier, 'Courier New', monospace" font-size="16" fill="#33FF66" font-weight="bold" style="fill:rgb(51, 255, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:Courier, "Courier New", monospace;font-size:16px;font-weight:700;text-anchor:start;dominant-baseline:auto">$ claude-gateway</text>
|
|
18
|
+
<text x="20" y="60" font-family="Courier, 'Courier New', monospace" font-size="16" fill="#33FF66" font-weight="bold" style="fill:rgb(51, 255, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:Courier, "Courier New", monospace;font-size:16px;font-weight:700;text-anchor:start;dominant-baseline:auto">make create-agent</text>
|
|
19
|
+
|
|
20
|
+
<!-- Blinking cursor after make create-agent -->
|
|
21
|
+
<rect x="194" y="46" width="10" height="16" fill="#33FF66" style="fill:rgb(51, 255, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4556;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
|
|
22
|
+
<animate attributeName="opacity" values="1;1;0;0" dur="1s" repeatCount="indefinite" style="fill:rgb(51, 255, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
23
|
+
</rect>
|
|
24
|
+
|
|
25
|
+
<!-- ================= CHARACTER =================
|
|
26
|
+
Grid: 8 cols × 8 rows, 28px per pixel, origin (180, 200) -->
|
|
27
|
+
|
|
28
|
+
<!-- Head (narrower top, cols 1-6, rows 0-1) -->
|
|
29
|
+
<rect x="208" y="200" width="168" height="56" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
30
|
+
|
|
31
|
+
<!-- Body (wider, cols 0-7, rows 2-5) -->
|
|
32
|
+
<rect x="180" y="256" width="224" height="112" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
33
|
+
|
|
34
|
+
<!-- 4 legs (cols 0, 2, 5, 7 @ rows 6-7) -->
|
|
35
|
+
<rect x="180" y="368" width="28" height="56" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
36
|
+
<rect x="236" y="368" width="28" height="56" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
37
|
+
<rect x="320" y="368" width="28" height="56" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
38
|
+
<rect x="376" y="368" width="28" height="56" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
39
|
+
|
|
40
|
+
<!-- Eyes (tall vertical rectangles) -->
|
|
41
|
+
<rect x="236" y="284" width="28" height="56" fill="#1F1512" style="fill:rgb(31, 21, 18);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
42
|
+
<rect x="320" y="284" width="28" height="56" fill="#1F1512" style="fill:rgb(31, 21, 18);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
43
|
+
<rect x="240" y="288" width="6" height="6" fill="#4A3A32" style="fill:rgb(74, 58, 50);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
44
|
+
<rect x="324" y="288" width="6" height="6" fill="#4A3A32" style="fill:rgb(74, 58, 50);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
45
|
+
|
|
46
|
+
<!-- ================= SMALL OPEN CLAW =================
|
|
47
|
+
Attached to right shoulder, going up-right -->
|
|
48
|
+
|
|
49
|
+
<!-- Arm (col 8, row 1) -->
|
|
50
|
+
<rect x="404" y="228" width="28" height="28" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
51
|
+
<!-- Wrist (col 9, row 0) -->
|
|
52
|
+
<rect x="432" y="200" width="28" height="28" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
53
|
+
<!-- Palm (row -1, cols 8-10) -->
|
|
54
|
+
<rect x="404" y="172" width="84" height="28" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
55
|
+
<!-- Left pincer tip (col 8, row -2) -->
|
|
56
|
+
<rect x="404" y="144" width="28" height="28" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
57
|
+
<!-- Right pincer tip (col 10, row -2) -->
|
|
58
|
+
<rect x="460" y="144" width="28" height="28" fill="#E87B35" style="fill:rgb(232, 123, 53);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
59
|
+
|
|
60
|
+
<!-- ================= HIGHLIGHTS (top edges) ================= -->
|
|
61
|
+
<rect x="208" y="200" width="168" height="4" fill="#FFAE66" opacity="0.9" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.9;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
62
|
+
<rect x="180" y="256" width="28" height="4" fill="#FFAE66" opacity="0.85" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.85;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
63
|
+
<rect x="376" y="256" width="28" height="4" fill="#FFAE66" opacity="0.85" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.85;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
64
|
+
<rect x="180" y="368" width="28" height="4" fill="#FFAE66" opacity="0.8" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.8;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
65
|
+
<rect x="236" y="368" width="28" height="4" fill="#FFAE66" opacity="0.8" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.8;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
66
|
+
<rect x="320" y="368" width="28" height="4" fill="#FFAE66" opacity="0.8" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.8;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
67
|
+
<rect x="376" y="368" width="28" height="4" fill="#FFAE66" opacity="0.8" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.8;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
68
|
+
<rect x="404" y="144" width="28" height="4" fill="#FFAE66" opacity="0.9" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.9;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
69
|
+
<rect x="460" y="144" width="28" height="4" fill="#FFAE66" opacity="0.9" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.9;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
70
|
+
<rect x="404" y="172" width="84" height="4" fill="#FFAE66" opacity="0.85" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.85;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
71
|
+
<rect x="404" y="228" width="28" height="4" fill="#FFAE66" opacity="0.75" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.75;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
72
|
+
|
|
73
|
+
<!-- Left edges (subtle light highlight) -->
|
|
74
|
+
<rect x="208" y="200" width="4" height="56" fill="#FFAE66" opacity="0.55" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.55;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
75
|
+
<rect x="180" y="256" width="4" height="112" fill="#FFAE66" opacity="0.45" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.45;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
76
|
+
<rect x="180" y="368" width="4" height="56" fill="#FFAE66" opacity="0.4" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
77
|
+
<rect x="236" y="368" width="4" height="56" fill="#FFAE66" opacity="0.4" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
78
|
+
<rect x="320" y="368" width="4" height="56" fill="#FFAE66" opacity="0.4" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
79
|
+
<rect x="376" y="368" width="4" height="56" fill="#FFAE66" opacity="0.4" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
80
|
+
<rect x="404" y="144" width="4" height="28" fill="#FFAE66" opacity="0.55" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.55;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
81
|
+
<rect x="460" y="144" width="4" height="28" fill="#FFAE66" opacity="0.55" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.55;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
82
|
+
<rect x="404" y="172" width="4" height="28" fill="#FFAE66" opacity="0.5" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
83
|
+
<rect x="432" y="200" width="4" height="28" fill="#FFAE66" opacity="0.5" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
84
|
+
<rect x="404" y="228" width="4" height="28" fill="#FFAE66" opacity="0.5" style="fill:rgb(255, 174, 102);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
85
|
+
|
|
86
|
+
<!-- ================= SHADOWS (right + bottom edges) ================= -->
|
|
87
|
+
<rect x="372" y="200" width="4" height="56" fill="#B35A1E" opacity="0.55" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.55;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
88
|
+
<rect x="400" y="256" width="4" height="112" fill="#B35A1E" opacity="0.55" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.55;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
89
|
+
<rect x="204" y="368" width="4" height="56" fill="#B35A1E" opacity="0.5" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
90
|
+
<rect x="260" y="368" width="4" height="56" fill="#B35A1E" opacity="0.5" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
91
|
+
<rect x="344" y="368" width="4" height="56" fill="#B35A1E" opacity="0.5" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
92
|
+
<rect x="400" y="368" width="4" height="56" fill="#B35A1E" opacity="0.5" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
93
|
+
<rect x="428" y="144" width="4" height="28" fill="#B35A1E" opacity="0.55" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.55;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
94
|
+
<rect x="484" y="144" width="4" height="28" fill="#B35A1E" opacity="0.55" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.55;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
95
|
+
<rect x="484" y="172" width="4" height="28" fill="#B35A1E" opacity="0.5" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
96
|
+
<rect x="456" y="200" width="4" height="28" fill="#B35A1E" opacity="0.5" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
97
|
+
<rect x="428" y="228" width="4" height="28" fill="#B35A1E" opacity="0.5" style="fill:rgb(179, 90, 30);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.5;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
98
|
+
|
|
99
|
+
<!-- Bottom leg shadows -->
|
|
100
|
+
<rect x="180" y="420" width="28" height="4" fill="#8B3E10" opacity="0.6" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.6;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
101
|
+
<rect x="236" y="420" width="28" height="4" fill="#8B3E10" opacity="0.6" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.6;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
102
|
+
<rect x="320" y="420" width="28" height="4" fill="#8B3E10" opacity="0.6" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.6;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
103
|
+
<rect x="376" y="420" width="28" height="4" fill="#8B3E10" opacity="0.6" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.6;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
104
|
+
|
|
105
|
+
<!-- Belly underside shadow (between legs) -->
|
|
106
|
+
<rect x="208" y="364" width="28" height="4" fill="#8B3E10" opacity="0.4" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
107
|
+
<rect x="264" y="364" width="56" height="4" fill="#8B3E10" opacity="0.4" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
108
|
+
<rect x="348" y="364" width="28" height="4" fill="#8B3E10" opacity="0.4" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
109
|
+
|
|
110
|
+
<!-- Dark accent in the claw mouth gap -->
|
|
111
|
+
<rect x="432" y="168" width="28" height="4" fill="#8B3E10" opacity="0.4" style="fill:rgb(139, 62, 16);stroke:none;color:rgb(255, 255, 255);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.4;font-family:"Anthropic Sans", -apple-system, "system-ui", "Segoe UI", sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
|
|
112
|
+
</svg>
|