@claude-canvas/core 0.2.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/dist/index.d.ts +328 -0
- package/dist/index.js +1433 -0
- package/dist/index.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shadow-container.ts","../src/toast.ts","../src/keyboard-handler.ts","../src/panels/fab-button.ts","../src/panels/chat-panel.ts","../src/panels/session-bar.ts","../src/panels/qa-result.ts","../src/inspector/fiber-walker.ts","../src/inspector/source-mapper.ts","../src/annotator/canvas-overlay.ts","../src/annotator/box-tool.ts","../src/annotator/text-memo.ts","../src/panels/canvas-overlay.ts","../src/panels/toolbar.ts","../src/panels/inspector-popup.ts"],"sourcesContent":["const DESIGN_TOKENS = `\r\n:host {\r\n --cc-bg-panel: rgba(30, 30, 30, 0.95);\r\n --cc-bg-toolbar: rgba(40, 40, 40, 0.92);\r\n --cc-bg-input: rgba(50, 50, 50, 1);\r\n --cc-bg-hover: rgba(60, 60, 60, 1);\r\n --cc-text-primary: #e0e0e0;\r\n --cc-text-secondary: #a0a0a0;\r\n --cc-text-muted: #707070;\r\n --cc-annotation-box: #ff4444;\r\n --cc-annotation-box-fill: rgba(255, 68, 68, 0.1);\r\n --cc-highlight-hover: rgba(66, 133, 244, 0.3);\r\n --cc-highlight-select: rgba(255, 152, 0, 0.4);\r\n --cc-accent: #7c4dff;\r\n --cc-success: #4caf50;\r\n --cc-warning: #ff9800;\r\n --cc-error: #f44336;\r\n --cc-info: #2196f3;\r\n --cc-border: rgba(255, 255, 255, 0.12);\r\n --cc-border-focus: rgba(124, 77, 255, 0.6);\r\n --cc-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\r\n --cc-font-mono: 'SF Mono', 'Fira Code', 'JetBrains Mono', monospace;\r\n --cc-font-size-xs: 11px;\r\n --cc-font-size-sm: 12px;\r\n --cc-font-size-md: 13px;\r\n --cc-font-size-lg: 14px;\r\n --cc-line-height: 1.4;\r\n}\r\n\r\n* {\r\n box-sizing: border-box;\r\n margin: 0;\r\n padding: 0;\r\n}\r\n\r\n.cc-container {\r\n font-family: var(--cc-font-family);\r\n font-size: var(--cc-font-size-md);\r\n color: var(--cc-text-primary);\r\n line-height: var(--cc-line-height);\r\n}\r\n`\r\n\r\nexport class ShadowContainer {\r\n private host: HTMLDivElement\r\n private shadow: ShadowRoot\r\n private container: HTMLDivElement\r\n private mounted = false\r\n\r\n constructor() {\r\n this.host = document.createElement('div')\r\n this.host.id = 'claude-canvas-root'\r\n\r\n this.shadow = this.host.attachShadow({ mode: 'open' })\r\n\r\n const style = document.createElement('style')\r\n style.textContent = DESIGN_TOKENS\r\n this.shadow.appendChild(style)\r\n\r\n this.container = document.createElement('div')\r\n this.container.className = 'cc-container'\r\n this.shadow.appendChild(this.container)\r\n }\r\n\r\n mount(): void {\r\n if (this.mounted) return\r\n document.body.appendChild(this.host)\r\n this.mounted = true\r\n }\r\n\r\n unmount(): void {\r\n if (!this.mounted) return\r\n this.host.remove()\r\n this.mounted = false\r\n }\r\n\r\n getContainer(): HTMLDivElement {\r\n return this.container\r\n }\r\n\r\n getShadowRoot(): ShadowRoot {\r\n return this.shadow\r\n }\r\n}\r\n","export type ToastVariant = 'success' | 'warning' | 'error' | 'info'\r\n\r\nconst TOAST_STYLES = `\r\n.cc-toast-container {\r\n position: fixed;\r\n bottom: 16px;\r\n left: 16px;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n z-index: 10000;\r\n pointer-events: none;\r\n}\r\n\r\n.cc-toast {\r\n padding: 10px 16px;\r\n border-radius: 6px;\r\n font-family: var(--cc-font-family);\r\n font-size: var(--cc-font-size-sm);\r\n color: #fff;\r\n pointer-events: auto;\r\n animation: cc-toast-in 0.2s ease-out;\r\n}\r\n\r\n.cc-toast--success { background: var(--cc-success); }\r\n.cc-toast--warning { background: var(--cc-warning); }\r\n.cc-toast--error { background: var(--cc-error); }\r\n.cc-toast--info { background: var(--cc-info); }\r\n\r\n@keyframes cc-toast-in {\r\n from { opacity: 0; transform: translateY(8px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n}\r\n`\r\n\r\nexport class Toast {\r\n private shadowRoot: ShadowRoot\r\n private toastContainer: HTMLDivElement\r\n private styleInjected = false\r\n\r\n constructor(shadowRoot: ShadowRoot) {\r\n this.shadowRoot = shadowRoot\r\n this.toastContainer = document.createElement('div')\r\n this.toastContainer.className = 'cc-toast-container'\r\n }\r\n\r\n private ensureStyle(): void {\r\n if (this.styleInjected) return\r\n const style = document.createElement('style')\r\n style.textContent = TOAST_STYLES\r\n this.shadowRoot.appendChild(style)\r\n this.shadowRoot.appendChild(this.toastContainer)\r\n this.styleInjected = true\r\n }\r\n\r\n show(message: string, variant: ToastVariant): void {\r\n this.ensureStyle()\r\n\r\n const el = document.createElement('div')\r\n el.className = `cc-toast cc-toast--${variant}`\r\n el.textContent = message\r\n this.toastContainer.appendChild(el)\r\n\r\n setTimeout(() => {\r\n el.remove()\r\n }, 3000)\r\n }\r\n\r\n hide(): void {\r\n const toasts = this.toastContainer.querySelectorAll('.cc-toast')\r\n for (const t of toasts) {\r\n t.remove()\r\n }\r\n }\r\n}\r\n","export type AnnotationMode = 'off' | 'select' | 'box' | 'memo' | 'capture'\r\n\r\nexport interface KeyboardHandlerCallbacks {\r\n onToggleMode: () => void\r\n onEscape: () => void\r\n onToolSwitch: (mode: AnnotationMode) => void\r\n onSend: () => void\r\n}\r\n\r\nconst KEY_TO_MODE: Record<string, AnnotationMode> = {\r\n '1': 'select',\r\n '2': 'box',\r\n '3': 'memo',\r\n '4': 'capture',\r\n}\r\n\r\nexport class KeyboardHandler {\r\n private callbacks: KeyboardHandlerCallbacks\r\n private enabled = true\r\n private listener: ((e: KeyboardEvent) => void) | null = null\r\n\r\n constructor(callbacks: KeyboardHandlerCallbacks) {\r\n this.callbacks = callbacks\r\n }\r\n\r\n mount(): void {\r\n this.listener = (e: KeyboardEvent) => {\r\n if (!this.enabled) return\r\n\r\n if (e.ctrlKey && e.shiftKey && e.key === 'A') {\r\n e.preventDefault()\r\n this.callbacks.onToggleMode()\r\n return\r\n }\r\n\r\n if (e.key === 'Escape') {\r\n this.callbacks.onEscape()\r\n return\r\n }\r\n\r\n if (e.key === 'Enter') {\r\n this.callbacks.onSend()\r\n return\r\n }\r\n\r\n const mode = KEY_TO_MODE[e.key]\r\n if (mode) {\r\n this.callbacks.onToolSwitch(mode)\r\n }\r\n }\r\n\r\n window.addEventListener('keydown', this.listener, true)\r\n }\r\n\r\n unmount(): void {\r\n if (this.listener) {\r\n window.removeEventListener('keydown', this.listener, true)\r\n this.listener = null\r\n }\r\n }\r\n\r\n setEnabled(enabled: boolean): void {\r\n this.enabled = enabled\r\n }\r\n}\r\n","export interface FabButtonOptions {\r\n onActivate: () => void\r\n}\r\n\r\nconst FAB_ICON = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" rx=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"/>\r\n <line x1=\"6\" y1=\"7\" x2=\"14\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n <line x1=\"6\" y1=\"10\" x2=\"12\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n <line x1=\"6\" y1=\"13\" x2=\"10\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n</svg>`\r\n\r\nconst FAB_STYLES = `\r\n.cc-fab-button {\r\n position: fixed;\r\n bottom: 24px;\r\n right: 24px;\r\n width: 40px;\r\n height: 40px;\r\n border-radius: 50%;\r\n border: none;\r\n background: var(--cc-accent, #7c4dff);\r\n color: #fff;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 99999;\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\r\n transition: background 0.15s ease, transform 0.15s ease;\r\n}\r\n\r\n.cc-fab-button:hover {\r\n background: var(--cc-border-focus, rgba(124, 77, 255, 0.8));\r\n transform: scale(1.08);\r\n}\r\n\r\n.cc-fab-tooltip {\r\n position: fixed;\r\n bottom: 72px;\r\n right: 16px;\r\n background: var(--cc-bg-panel, rgba(30, 30, 30, 0.95));\r\n color: var(--cc-text-primary, #e0e0e0);\r\n font-family: var(--cc-font-family, sans-serif);\r\n font-size: var(--cc-font-size-xs, 11px);\r\n padding: 4px 8px;\r\n border-radius: 4px;\r\n white-space: nowrap;\r\n pointer-events: none;\r\n z-index: 99999;\r\n}\r\n`\r\n\r\nexport class FabButton {\r\n private shadowRoot: ShadowRoot\r\n private options: FabButtonOptions\r\n private button: HTMLButtonElement | null = null\r\n private tooltip: HTMLDivElement | null = null\r\n private styleEl: HTMLStyleElement | null = null\r\n private mounted = false\r\n\r\n constructor(shadowRoot: ShadowRoot, options: FabButtonOptions) {\r\n this.shadowRoot = shadowRoot\r\n this.options = options\r\n }\r\n\r\n mount(): void {\r\n if (this.mounted) return\r\n\r\n this.styleEl = document.createElement('style')\r\n this.styleEl.textContent = FAB_STYLES\r\n this.shadowRoot.appendChild(this.styleEl)\r\n\r\n this.button = document.createElement('button')\r\n this.button.className = 'cc-fab-button'\r\n this.button.innerHTML = FAB_ICON\r\n this.button.style.position = 'fixed'\r\n this.button.style.bottom = '24px'\r\n this.button.style.right = '24px'\r\n this.button.style.width = '40px'\r\n this.button.style.height = '40px'\r\n this.button.style.borderRadius = '50%'\r\n this.button.style.zIndex = '99999'\r\n\r\n this.button.addEventListener('click', this.handleClick)\r\n this.button.addEventListener('mouseenter', this.handleMouseEnter)\r\n this.button.addEventListener('mouseleave', this.handleMouseLeave)\r\n\r\n this.shadowRoot.appendChild(this.button)\r\n this.mounted = true\r\n }\r\n\r\n unmount(): void {\r\n if (!this.mounted) return\r\n\r\n this.button?.removeEventListener('click', this.handleClick)\r\n this.button?.removeEventListener('mouseenter', this.handleMouseEnter)\r\n this.button?.removeEventListener('mouseleave', this.handleMouseLeave)\r\n this.button?.remove()\r\n this.styleEl?.remove()\r\n this.hideTooltip()\r\n this.button = null\r\n this.styleEl = null\r\n this.mounted = false\r\n }\r\n\r\n setVisible(visible: boolean): void {\r\n if (!this.button) return\r\n this.button.style.display = visible ? 'flex' : 'none'\r\n if (!visible) {\r\n this.hideTooltip()\r\n }\r\n }\r\n\r\n private handleClick = (): void => {\r\n this.options.onActivate()\r\n }\r\n\r\n private handleMouseEnter = (): void => {\r\n this.showTooltip()\r\n }\r\n\r\n private handleMouseLeave = (): void => {\r\n this.hideTooltip()\r\n }\r\n\r\n private showTooltip(): void {\r\n if (this.tooltip) return\r\n this.tooltip = document.createElement('div')\r\n this.tooltip.className = 'cc-fab-tooltip'\r\n this.tooltip.textContent = 'Ctrl+Shift+A'\r\n this.shadowRoot.appendChild(this.tooltip)\r\n }\r\n\r\n private hideTooltip(): void {\r\n this.tooltip?.remove()\r\n this.tooltip = null\r\n }\r\n}\r\n","import type { ChatMessage } from '../types.js'\r\n\r\nconst CHAT_PANEL_STYLES = `\r\n.cc-chat-panel {\r\n position: fixed;\r\n top: 0;\r\n right: 0;\r\n width: 360px;\r\n height: 100vh;\r\n background: var(--cc-bg-panel, rgba(30, 30, 30, 0.95));\r\n border-left: 1px solid var(--cc-border, rgba(255, 255, 255, 0.1));\r\n display: flex;\r\n flex-direction: column;\r\n z-index: 100000;\r\n transition: transform 0.2s ease;\r\n font-family: var(--cc-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif);\r\n}\r\n\r\n.cc-chat-panel.collapsed {\r\n transform: translateX(100%);\r\n}\r\n\r\n.cc-chat-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 12px;\r\n border-bottom: 1px solid var(--cc-border, rgba(255, 255, 255, 0.1));\r\n}\r\n\r\n.cc-chat-title {\r\n font-weight: 600;\r\n font-size: var(--cc-font-size-lg, 14px);\r\n color: var(--cc-text-primary, #e0e0e0);\r\n}\r\n\r\n.cc-collapse-btn {\r\n background: none;\r\n border: none;\r\n color: var(--cc-text-primary, #e0e0e0);\r\n cursor: pointer;\r\n padding: 4px 8px;\r\n font-size: 12px;\r\n transition: color 0.15s ease;\r\n}\r\n\r\n.cc-collapse-btn:hover {\r\n color: var(--cc-accent, #7c4dff);\r\n}\r\n\r\n.cc-message-list {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: 8px;\r\n}\r\n\r\n.cc-message {\r\n margin-bottom: 8px;\r\n padding: 8px;\r\n border-radius: 6px;\r\n font-size: var(--cc-font-size-md, 12px);\r\n word-break: break-word;\r\n}\r\n\r\n.cc-user-message {\r\n background: var(--cc-bg-hover, rgba(255, 255, 255, 0.05));\r\n color: var(--cc-text-primary, #e0e0e0);\r\n}\r\n\r\n.cc-assistant-message {\r\n background: rgba(124, 77, 255, 0.1);\r\n color: var(--cc-text-primary, #e0e0e0);\r\n}\r\n\r\n.cc-system-message {\r\n background: var(--cc-bg-toolbar, rgba(255, 255, 255, 0.02));\r\n font-size: var(--cc-font-size-sm, 11px);\r\n color: var(--cc-text-secondary, #999);\r\n}\r\n\r\n.cc-message-content {\r\n margin-bottom: 4px;\r\n}\r\n\r\n.cc-files-changed {\r\n margin-top: 6px;\r\n padding-top: 6px;\r\n border-top: 1px solid rgba(255, 255, 255, 0.1);\r\n font-size: var(--cc-font-size-sm, 11px);\r\n}\r\n\r\n.cc-file-change {\r\n margin-bottom: 4px;\r\n display: flex;\r\n gap: 6px;\r\n align-items: center;\r\n}\r\n\r\n.cc-file-action {\r\n padding: 2px 6px;\r\n border-radius: 3px;\r\n font-size: 10px;\r\n font-weight: 600;\r\n min-width: 40px;\r\n text-align: center;\r\n}\r\n\r\n.cc-file-action {\r\n background: rgba(124, 77, 255, 0.2);\r\n color: #7c4dff;\r\n}\r\n\r\n.cc-annotation-card {\r\n margin-top: 6px;\r\n padding: 6px;\r\n background: rgba(255, 255, 255, 0.05);\r\n border-left: 2px solid #7c4dff;\r\n border-radius: 3px;\r\n font-size: var(--cc-font-size-sm, 11px);\r\n}\r\n\r\n.cc-annotation-card > div {\r\n margin-bottom: 3px;\r\n color: #b39ddb;\r\n}\r\n\r\n.cc-annotation-card > div:last-child {\r\n margin-bottom: 0;\r\n}\r\n\r\n.cc-chat-footer {\r\n padding: 8px;\r\n border-top: 1px solid var(--cc-border, rgba(255, 255, 255, 0.1));\r\n display: flex;\r\n gap: 4px;\r\n}\r\n\r\n.cc-chat-input {\r\n flex: 1;\r\n background: var(--cc-bg-input, rgba(255, 255, 255, 0.05));\r\n color: var(--cc-text-primary, #e0e0e0);\r\n border: 1px solid var(--cc-border, rgba(255, 255, 255, 0.1));\r\n border-radius: 4px;\r\n padding: 6px 8px;\r\n font-size: var(--cc-font-size-md, 12px);\r\n font-family: var(--cc-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif);\r\n resize: none;\r\n transition: border-color 0.15s ease;\r\n}\r\n\r\n.cc-chat-input:focus {\r\n outline: none;\r\n border-color: var(--cc-accent, #7c4dff);\r\n}\r\n\r\n.cc-send-btn {\r\n width: 32px;\r\n height: 32px;\r\n background: var(--cc-accent, #7c4dff);\r\n color: white;\r\n border: none;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 14px;\r\n transition: background 0.15s ease, transform 0.1s ease;\r\n}\r\n\r\n.cc-send-btn:hover {\r\n background: rgba(124, 77, 255, 0.8);\r\n}\r\n\r\n.cc-send-btn:active {\r\n transform: scale(0.95);\r\n}\r\n\r\n.cc-send-btn:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n`\r\n\r\nexport class ChatPanel {\r\n private container: HTMLElement\r\n private messageList: HTMLElement\r\n private inputArea: HTMLTextAreaElement\r\n private sendButton: HTMLButtonElement\r\n private messages: ChatMessage[] = []\r\n private collapsed = false\r\n private onSend?: (message: string) => void\r\n\r\n constructor(shadowRoot: ShadowRoot) {\r\n // Create style element\r\n const styleEl = document.createElement('style')\r\n styleEl.textContent = CHAT_PANEL_STYLES\r\n shadowRoot.appendChild(styleEl)\r\n\r\n // Create panel structure inside shadow DOM\r\n this.container = document.createElement('div')\r\n this.container.className = 'cc-chat-panel'\r\n this.container.innerHTML = `\r\n <div class=\"cc-chat-header\">\r\n <span class=\"cc-chat-title\">Claude Canvas</span>\r\n <button class=\"cc-collapse-btn\" aria-label=\"Toggle panel\">◀</button>\r\n </div>\r\n <div class=\"cc-message-list\"></div>\r\n <div class=\"cc-chat-footer\">\r\n <textarea class=\"cc-chat-input\" placeholder=\"메시지를 입력하세요...\" rows=\"2\"></textarea>\r\n <button class=\"cc-send-btn\" aria-label=\"Send\">▶</button>\r\n </div>\r\n `\r\n shadowRoot.appendChild(this.container)\r\n\r\n this.messageList = this.container.querySelector('.cc-message-list') as HTMLElement\r\n this.inputArea = this.container.querySelector('.cc-chat-input') as HTMLTextAreaElement\r\n this.sendButton = this.container.querySelector('.cc-send-btn') as HTMLButtonElement\r\n\r\n // Collapse toggle\r\n const collapseBtn = this.container.querySelector('.cc-collapse-btn')\r\n collapseBtn?.addEventListener('click', () => this.toggle())\r\n\r\n // Send handlers\r\n this.sendButton.addEventListener('click', () => this.handleSend())\r\n this.inputArea.addEventListener('keydown', (e: KeyboardEvent) => {\r\n if (e.key === 'Enter' && !e.shiftKey) {\r\n e.preventDefault()\r\n this.handleSend()\r\n }\r\n })\r\n }\r\n\r\n addMessage(msg: ChatMessage): void {\r\n this.messages.push(msg)\r\n const el = this.renderMessage(msg)\r\n this.messageList.appendChild(el)\r\n this.messageList.scrollTop = this.messageList.scrollHeight\r\n }\r\n\r\n appendStream(delta: string): void {\r\n // Append to last assistant message (typewriter effect)\r\n const last = this.messageList.lastElementChild\r\n if (last?.classList.contains('cc-assistant-message')) {\r\n const content = last.querySelector('.cc-message-content')\r\n if (content) {\r\n content.textContent = (content.textContent || '') + delta\r\n }\r\n }\r\n }\r\n\r\n toggle(): void {\r\n this.collapsed = !this.collapsed\r\n this.container.classList.toggle('collapsed', this.collapsed)\r\n }\r\n\r\n isCollapsed(): boolean {\r\n return this.collapsed\r\n }\r\n\r\n onMessageSend(cb: (message: string) => void): void {\r\n this.onSend = cb\r\n }\r\n\r\n private handleSend(): void {\r\n const text = this.inputArea.value.trim()\r\n if (!text) return\r\n this.onSend?.(text)\r\n this.inputArea.value = ''\r\n }\r\n\r\n private renderMessage(msg: ChatMessage): HTMLElement {\r\n const el = document.createElement('div')\r\n el.className = `cc-message cc-${msg.role}-message`\r\n\r\n const content = document.createElement('div')\r\n content.className = 'cc-message-content'\r\n content.textContent = msg.content\r\n el.appendChild(content)\r\n\r\n if (msg.filesChanged?.length) {\r\n const files = document.createElement('div')\r\n files.className = 'cc-files-changed'\r\n files.innerHTML = msg.filesChanged\r\n .map(\r\n (f) =>\r\n `<div class=\"cc-file-change\"><span class=\"cc-file-action\">${f.action}</span> ${f.file} (+${f.linesAdded}/-${f.linesRemoved})</div>`\r\n )\r\n .join('')\r\n el.appendChild(files)\r\n }\r\n\r\n if (msg.annotations?.annotations.length) {\r\n const annCard = document.createElement('div')\r\n annCard.className = 'cc-annotation-card'\r\n annCard.innerHTML = msg.annotations.annotations\r\n .map((a) =>\r\n a.source\r\n ? `<div>${a.source.componentName} — ${a.source.file}:${a.source.line}</div>`\r\n : `<div>${a.memo}</div>`\r\n )\r\n .join('')\r\n el.appendChild(annCard)\r\n }\r\n\r\n return el\r\n }\r\n}\r\n","export type SessionBarStatus = 'active' | 'qa-running' | 'qa-passed' | 'qa-failed'\r\n\r\nconst SESSION_BAR_STYLES = `\r\n.cc-session-bar {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n height: 28px;\r\n background: var(--cc-bg-toolbar);\r\n border-bottom: 1px solid var(--cc-border);\r\n display: flex;\r\n align-items: center;\r\n padding: 0 12px;\r\n gap: 16px;\r\n font-size: var(--cc-font-size-sm);\r\n color: var(--cc-text-secondary);\r\n z-index: 100003;\r\n}\r\n.cc-status-indicator {\r\n width: 8px;\r\n height: 8px;\r\n border-radius: 50%;\r\n background: var(--cc-success);\r\n}\r\n.cc-branch-name {\r\n font-family: var(--cc-font-mono);\r\n color: var(--cc-text-primary);\r\n}\r\n.cc-end-session-btn {\r\n margin-left: auto;\r\n padding: 2px 8px;\r\n background: var(--cc-error);\r\n color: white;\r\n border: none;\r\n border-radius: 3px;\r\n cursor: pointer;\r\n font-size: var(--cc-font-size-xs);\r\n}\r\n`\r\n\r\nexport class SessionBarPanel {\r\n private container: HTMLElement\r\n private statusDot: HTMLElement\r\n private branchLabel: HTMLElement\r\n private changeLabel: HTMLElement\r\n private hmrLabel: HTMLElement\r\n private endBtn: HTMLButtonElement\r\n private onEndSession?: () => void\r\n private visible = false\r\n\r\n constructor(shadowRoot: ShadowRoot) {\r\n const style = document.createElement('style')\r\n style.textContent = SESSION_BAR_STYLES\r\n shadowRoot.appendChild(style)\r\n\r\n this.container = document.createElement('div')\r\n this.container.className = 'cc-session-bar'\r\n this.container.style.display = 'none'\r\n this.container.innerHTML = `\r\n <span class=\"cc-status-indicator\"></span>\r\n <span class=\"cc-branch-name\"></span>\r\n <span class=\"cc-change-count\">0 files changed</span>\r\n <span class=\"cc-hmr-status\">✓ HMR</span>\r\n <button class=\"cc-end-session-btn\">End Session</button>\r\n `\r\n shadowRoot.appendChild(this.container)\r\n\r\n this.statusDot = this.container.querySelector('.cc-status-indicator') as HTMLElement\r\n this.branchLabel = this.container.querySelector('.cc-branch-name') as HTMLElement\r\n this.changeLabel = this.container.querySelector('.cc-change-count') as HTMLElement\r\n this.hmrLabel = this.container.querySelector('.cc-hmr-status') as HTMLElement\r\n this.endBtn = this.container.querySelector('.cc-end-session-btn') as HTMLButtonElement\r\n this.endBtn.addEventListener('click', () => this.onEndSession?.())\r\n }\r\n\r\n show(branch: string): void {\r\n this.branchLabel.textContent = branch\r\n this.container.style.display = 'flex'\r\n this.visible = true\r\n this.setStatus('active')\r\n }\r\n\r\n hide(): void {\r\n this.container.style.display = 'none'\r\n this.visible = false\r\n }\r\n\r\n setStatus(status: SessionBarStatus): void {\r\n const colors: Record<SessionBarStatus, string> = {\r\n 'active': 'var(--cc-success)',\r\n 'qa-running': 'var(--cc-warning)',\r\n 'qa-passed': 'var(--cc-success)',\r\n 'qa-failed': 'var(--cc-error)',\r\n }\r\n this.statusDot.style.background = colors[status]\r\n }\r\n\r\n updateChangedFiles(count: number): void {\r\n this.changeLabel.textContent = `${count} file${count !== 1 ? 's' : ''} changed`\r\n }\r\n\r\n setHmrStatus(connected: boolean): void {\r\n this.hmrLabel.textContent = connected ? '✓ HMR' : '✗ HMR'\r\n this.hmrLabel.style.color = connected ? 'var(--cc-success)' : 'var(--cc-error)'\r\n }\r\n\r\n onEnd(cb: () => void): void {\r\n this.onEndSession = cb\r\n }\r\n\r\n isVisible(): boolean {\r\n return this.visible\r\n }\r\n}\r\n","export interface QAStepDisplay {\r\n name: string\r\n status: 'pending' | 'running' | 'pass' | 'fail'\r\n duration?: number\r\n output?: string\r\n}\r\n\r\nexport interface FileChangeDisplay {\r\n file: string\r\n action: string\r\n linesAdded: number\r\n linesRemoved: number\r\n}\r\n\r\nconst QA_RESULT_STYLES = `\r\n.cc-qa-modal-overlay {\r\n position: fixed;\r\n inset: 0;\r\n background: rgba(0,0,0,0.6);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 100004;\r\n}\r\n.cc-qa-modal {\r\n background: var(--cc-bg-panel);\r\n border: 1px solid var(--cc-border);\r\n border-radius: 8px;\r\n padding: 24px;\r\n min-width: 420px;\r\n max-width: 520px;\r\n box-shadow: 0 8px 32px rgba(0,0,0,0.6);\r\n}\r\n.cc-qa-title {\r\n margin-bottom: 16px;\r\n font-size: var(--cc-font-size-lg);\r\n}\r\n.cc-qa-step {\r\n padding: 4px 0;\r\n font-family: var(--cc-font-mono);\r\n font-size: var(--cc-font-size-sm);\r\n}\r\n.cc-change-summary {\r\n margin: 12px 0;\r\n padding: 8px;\r\n background: var(--cc-bg-input);\r\n border-radius: 4px;\r\n}\r\n.cc-qa-actions {\r\n display: flex;\r\n gap: 8px;\r\n margin-top: 16px;\r\n}\r\n.cc-qa-merge-btn {\r\n flex: 1;\r\n padding: 6px;\r\n background: var(--cc-success);\r\n color: white;\r\n border: none;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n}\r\n.cc-qa-merge-btn:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n.cc-qa-fix-btn {\r\n flex: 1;\r\n padding: 6px;\r\n background: var(--cc-warning);\r\n color: white;\r\n border: none;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n}\r\n.cc-qa-discard-btn {\r\n flex: 1;\r\n padding: 6px;\r\n background: var(--cc-error);\r\n color: white;\r\n border: none;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n}\r\n.cc-confirm-dialog {\r\n margin-top: 12px;\r\n padding: 12px;\r\n background: var(--cc-bg-input);\r\n border-radius: 4px;\r\n}\r\n.cc-confirm-yes,\r\n.cc-confirm-no {\r\n padding: 4px 12px;\r\n border: none;\r\n border-radius: 3px;\r\n cursor: pointer;\r\n margin-right: 8px;\r\n}\r\n.cc-confirm-yes {\r\n background: var(--cc-error);\r\n color: white;\r\n}\r\n.cc-confirm-no {\r\n background: var(--cc-bg-hover);\r\n color: var(--cc-text-primary);\r\n}\r\n`\r\n\r\nexport class QAResultPanel {\r\n private overlay: HTMLElement\r\n private modal: HTMLElement\r\n private stepList: HTMLElement\r\n private changeSummary: HTMLElement\r\n private mergeBtn: HTMLButtonElement\r\n private fixBtn: HTMLButtonElement\r\n private discardBtn: HTMLButtonElement\r\n private confirmDialog: HTMLElement | null = null\r\n\r\n private onMerge?: () => void\r\n private onFix?: () => void\r\n private onDiscard?: () => void\r\n\r\n constructor(shadowRoot: ShadowRoot) {\r\n const style = document.createElement('style')\r\n style.textContent = QA_RESULT_STYLES\r\n shadowRoot.appendChild(style)\r\n\r\n this.overlay = document.createElement('div')\r\n this.overlay.className = 'cc-qa-modal-overlay'\r\n this.overlay.style.display = 'none'\r\n this.overlay.innerHTML = `\r\n <div class=\"cc-qa-modal\">\r\n <h3 class=\"cc-qa-title\">QA Results</h3>\r\n <div class=\"cc-qa-step-list\"></div>\r\n <div class=\"cc-change-summary\"></div>\r\n <div class=\"cc-qa-actions\">\r\n <button class=\"cc-qa-merge-btn\" disabled>Merge</button>\r\n <button class=\"cc-qa-fix-btn\">Fix</button>\r\n <button class=\"cc-qa-discard-btn\">Discard</button>\r\n </div>\r\n </div>\r\n `\r\n shadowRoot.appendChild(this.overlay)\r\n\r\n this.modal = this.overlay.querySelector('.cc-qa-modal') as HTMLElement\r\n this.stepList = this.overlay.querySelector('.cc-qa-step-list') as HTMLElement\r\n this.changeSummary = this.overlay.querySelector('.cc-change-summary') as HTMLElement\r\n this.mergeBtn = this.overlay.querySelector('.cc-qa-merge-btn') as HTMLButtonElement\r\n this.fixBtn = this.overlay.querySelector('.cc-qa-fix-btn') as HTMLButtonElement\r\n this.discardBtn = this.overlay.querySelector('.cc-qa-discard-btn') as HTMLButtonElement\r\n\r\n this.mergeBtn.addEventListener('click', () => this.onMerge?.())\r\n this.fixBtn.addEventListener('click', () => { this.hide(); this.onFix?.() })\r\n this.discardBtn.addEventListener('click', () => this.showConfirm())\r\n }\r\n\r\n show(): void {\r\n this.overlay.style.display = 'flex'\r\n }\r\n\r\n hide(): void {\r\n this.overlay.style.display = 'none'\r\n }\r\n\r\n updateStep(step: QAStepDisplay): void {\r\n let el = this.stepList.querySelector(`[data-step=\"${step.name}\"]`) as HTMLElement | null\r\n if (!el) {\r\n el = document.createElement('div')\r\n el.className = 'cc-qa-step'\r\n el.setAttribute('data-step', step.name)\r\n this.stepList.appendChild(el)\r\n }\r\n const icon = step.status === 'pass' ? '✓' : step.status === 'fail' ? '✗' : step.status === 'running' ? '⟳' : '○'\r\n const color = step.status === 'pass' ? 'var(--cc-success)' : step.status === 'fail' ? 'var(--cc-error)' : 'var(--cc-text-muted)'\r\n el.innerHTML = `<span style=\"color:${color}\">${icon}</span> ${step.name}${step.duration ? ` (${step.duration}ms)` : ''}`\r\n }\r\n\r\n setOverallPass(pass: boolean): void {\r\n this.mergeBtn.disabled = !pass\r\n }\r\n\r\n setChangeSummary(changes: FileChangeDisplay[]): void {\r\n this.changeSummary.innerHTML = changes.map(c =>\r\n `<div class=\"cc-change-item\">${c.action} ${c.file} <span class=\"cc-diff-stat\">+${c.linesAdded}/-${c.linesRemoved}</span></div>`\r\n ).join('')\r\n }\r\n\r\n onMergeClick(cb: () => void): void { this.onMerge = cb }\r\n onFixClick(cb: () => void): void { this.onFix = cb }\r\n onDiscardClick(cb: () => void): void { this.onDiscard = cb }\r\n\r\n private showConfirm(): void {\r\n this.confirmDialog = document.createElement('div')\r\n this.confirmDialog.className = 'cc-confirm-dialog'\r\n this.confirmDialog.innerHTML = `\r\n <p>정말 폐기하시겠습니까? 모든 변경사항이 삭제됩니다.</p>\r\n <button class=\"cc-confirm-yes\">폐기</button>\r\n <button class=\"cc-confirm-no\">취소</button>\r\n `\r\n this.modal.appendChild(this.confirmDialog)\r\n this.confirmDialog.querySelector('.cc-confirm-yes')?.addEventListener('click', () => {\r\n this.hide()\r\n this.onDiscard?.()\r\n })\r\n this.confirmDialog.querySelector('.cc-confirm-no')?.addEventListener('click', () => {\r\n this.confirmDialog?.remove()\r\n this.confirmDialog = null\r\n })\r\n }\r\n}\r\n","// @claude-canvas/core — Inspector: FiberWalker\r\n// Traverses React fiber tree from DOM elements to extract source info\r\n\r\nimport type { SourceInfo } from '../types'\r\n\r\n// Minimal React fiber shape we care about\r\nexport interface ReactFiberDebugSource {\r\n fileName: string\r\n lineNumber: number\r\n columnNumber: number\r\n}\r\n\r\nexport interface ReactFiberType {\r\n name?: string\r\n displayName?: string\r\n}\r\n\r\nexport interface ReactFiber {\r\n type: ReactFiberType | string | null\r\n stateNode: HTMLElement | null | Record<string, unknown>\r\n _debugSource: ReactFiberDebugSource | null\r\n return: ReactFiber | null\r\n}\r\n\r\n// React attaches fiber to DOM nodes under these key prefixes\r\nconst FIBER_KEY_PREFIXES = ['__reactFiber$', '__reactInternalInstance$']\r\n\r\nexport const FiberWalker = {\r\n /**\r\n * Find the React fiber attached to a DOM element.\r\n * React 18+ uses __reactFiber$<hash>, older versions use __reactInternalInstance$<hash>.\r\n */\r\n getFiberFromElement(el: HTMLElement): ReactFiber | null {\r\n const keys = Object.keys(el)\r\n for (const key of keys) {\r\n for (const prefix of FIBER_KEY_PREFIXES) {\r\n if (key.startsWith(prefix)) {\r\n const fiber = (el as unknown as Record<string, unknown>)[key]\r\n if (fiber && typeof fiber === 'object') {\r\n return fiber as ReactFiber\r\n }\r\n }\r\n }\r\n }\r\n return null\r\n },\r\n\r\n /**\r\n * Extract SourceInfo from a React fiber's _debugSource.\r\n * Returns null when debug source info is unavailable.\r\n */\r\n getSourceInfo(fiber: ReactFiber): SourceInfo | null {\r\n if (!fiber || !fiber._debugSource) {\r\n return null\r\n }\r\n\r\n const { fileName, lineNumber, columnNumber } = fiber._debugSource\r\n\r\n // Resolve component name: displayName > name > 'Anonymous'\r\n let componentName = 'Anonymous'\r\n if (fiber.type && typeof fiber.type === 'object') {\r\n const fiberType = fiber.type as ReactFiberType\r\n if (fiberType.displayName) {\r\n componentName = fiberType.displayName\r\n } else if (fiberType.name) {\r\n componentName = fiberType.name\r\n }\r\n } else if (typeof fiber.type === 'string') {\r\n // Host component (div, span, etc.)\r\n componentName = fiber.type\r\n }\r\n\r\n // Resolve tag name from DOM stateNode\r\n let tagName = 'unknown'\r\n if (\r\n fiber.stateNode &&\r\n typeof (fiber.stateNode as HTMLElement).tagName === 'string'\r\n ) {\r\n tagName = (fiber.stateNode as HTMLElement).tagName.toLowerCase()\r\n }\r\n\r\n // Resolve className from DOM stateNode (only when non-empty)\r\n let className: string | undefined\r\n if (\r\n fiber.stateNode &&\r\n typeof (fiber.stateNode as HTMLElement).className === 'string' &&\r\n (fiber.stateNode as HTMLElement).className.length > 0\r\n ) {\r\n className = (fiber.stateNode as HTMLElement).className\r\n }\r\n\r\n return {\r\n componentName,\r\n file: fileName,\r\n line: lineNumber,\r\n column: columnNumber,\r\n tagName,\r\n ...(className !== undefined ? { className } : {}),\r\n }\r\n },\r\n}\r\n","import type { SourceInfo, LibraryType } from '../types.js'\r\n\r\nexport class SourceMapper {\r\n static detectLibrary(source: SourceInfo, wrapperPaths?: string[]): LibraryType {\r\n if (source.file.includes('node_modules/@carbon')) return 'carbon'\r\n if (source.library?.includes('@carbon')) return 'carbon'\r\n if (wrapperPaths && wrapperPaths.some(p => source.file.includes(p))) return 'project-wrapper'\r\n return 'unknown'\r\n }\r\n\r\n static isWrapperComponent(file: string, wrapperPaths: string[]): boolean {\r\n return wrapperPaths.some(p => file.includes(p))\r\n }\r\n\r\n static formatSourcePath(file: string, line: number, column: number): string {\r\n return `${file}:${line}:${column}`\r\n }\r\n\r\n // Instance method aliases\r\n detectLibrary(source: SourceInfo, wrapperPaths?: string[]): LibraryType {\r\n return SourceMapper.detectLibrary(source, wrapperPaths)\r\n }\r\n\r\n isWrapperComponent(file: string, wrapperPaths: string[]): boolean {\r\n return SourceMapper.isWrapperComponent(file, wrapperPaths)\r\n }\r\n\r\n formatSourcePath(file: string, line: number, column: number): string {\r\n return SourceMapper.formatSourcePath(file, line, column)\r\n }\r\n}\r\n","import type { AnnotationMode, Annotation } from '../types.js'\r\n\r\n// Minimal no-op context for environments that don't support canvas (e.g. jsdom)\r\nfunction makeNoopCtx(): CanvasRenderingContext2D {\r\n return new Proxy({} as CanvasRenderingContext2D, {\r\n get: () => () => undefined,\r\n set: () => true,\r\n })\r\n}\r\n\r\nexport class CanvasOverlay {\r\n private canvas: HTMLCanvasElement\r\n private ctx: CanvasRenderingContext2D\r\n private mode: AnnotationMode = 'off'\r\n private annotations: Annotation[] = []\r\n\r\n constructor() {\r\n this.canvas = document.createElement('canvas')\r\n this.canvas.style.cssText =\r\n 'position:fixed;inset:0;width:100vw;height:100vh;z-index:100001;pointer-events:none;'\r\n try {\r\n this.ctx = this.canvas.getContext('2d') ?? makeNoopCtx()\r\n } catch {\r\n this.ctx = makeNoopCtx()\r\n }\r\n }\r\n\r\n mount(): void {\r\n document.body.appendChild(this.canvas)\r\n }\r\n\r\n unmount(): void {\r\n this.canvas.remove()\r\n }\r\n\r\n setMode(mode: AnnotationMode): void {\r\n this.mode = mode\r\n this.canvas.style.pointerEvents = mode === 'off' ? 'none' : 'auto'\r\n }\r\n\r\n getMode(): AnnotationMode {\r\n return this.mode\r\n }\r\n\r\n drawHoverHighlight(rect: DOMRect): void {\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\r\n this.ctx.strokeStyle = 'rgba(66, 133, 244, 0.8)'\r\n this.ctx.lineWidth = 2\r\n this.ctx.setLineDash([4, 4])\r\n this.ctx.strokeRect(rect.x, rect.y, rect.width, rect.height)\r\n this.ctx.fillStyle = 'rgba(66, 133, 244, 0.1)'\r\n this.ctx.fillRect(rect.x, rect.y, rect.width, rect.height)\r\n }\r\n\r\n drawSelectHighlight(rect: DOMRect): void {\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\r\n this.ctx.strokeStyle = 'rgba(255, 140, 0, 0.9)'\r\n this.ctx.lineWidth = 2\r\n this.ctx.setLineDash([])\r\n this.ctx.strokeRect(rect.x, rect.y, rect.width, rect.height)\r\n this.ctx.fillStyle = 'rgba(255, 140, 0, 0.1)'\r\n this.ctx.fillRect(rect.x, rect.y, rect.width, rect.height)\r\n }\r\n\r\n drawBoxAnnotation(\r\n rect: { x: number; y: number; width: number; height: number },\r\n memo: string\r\n ): void {\r\n this.ctx.strokeStyle = 'rgba(220, 50, 50, 0.9)'\r\n this.ctx.lineWidth = 2\r\n this.ctx.setLineDash([])\r\n this.ctx.strokeRect(rect.x, rect.y, rect.width, rect.height)\r\n if (memo) {\r\n this.ctx.fillStyle = 'rgba(220, 50, 50, 0.9)'\r\n this.ctx.font = '12px sans-serif'\r\n this.ctx.fillText(memo, rect.x + 4, rect.y - 4)\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\r\n }\r\n\r\n getAnnotations(): Annotation[] {\r\n return [...this.annotations]\r\n }\r\n\r\n addAnnotation(ann: Annotation): void {\r\n this.annotations.push(ann)\r\n }\r\n\r\n clearAnnotations(): void {\r\n this.annotations = []\r\n }\r\n}\r\n","export class BoxTool {\r\n private startX = 0\r\n private startY = 0\r\n private drawing = false\r\n\r\n startDraw(x: number, y: number): void {\r\n this.startX = x\r\n this.startY = y\r\n this.drawing = true\r\n }\r\n\r\n updateDraw(x: number, y: number): { x: number; y: number; width: number; height: number } {\r\n return {\r\n x: Math.min(this.startX, x),\r\n y: Math.min(this.startY, y),\r\n width: Math.abs(x - this.startX),\r\n height: Math.abs(y - this.startY),\r\n }\r\n }\r\n\r\n endDraw(x: number, y: number): { x: number; y: number; width: number; height: number } {\r\n this.drawing = false\r\n return this.updateDraw(x, y)\r\n }\r\n\r\n isDrawing(): boolean {\r\n return this.drawing\r\n }\r\n}\r\n","export class TextMemo {\r\n private input: HTMLTextAreaElement\r\n private visible = false\r\n\r\n constructor(container: HTMLElement) {\r\n this.input = document.createElement('textarea')\r\n this.input.className = 'cc-memo-input'\r\n this.input.style.cssText =\r\n 'position:absolute;display:none;width:200px;height:60px;' +\r\n 'background:var(--cc-bg-input);color:var(--cc-text-primary);' +\r\n 'border:1px solid var(--cc-border);border-radius:4px;' +\r\n 'padding:4px 8px;font-size:var(--cc-font-size-sm);resize:none;'\r\n container.appendChild(this.input)\r\n }\r\n\r\n show(x: number, y: number): void {\r\n this.input.style.display = 'block'\r\n this.input.style.left = x + 'px'\r\n this.input.style.top = y + 'px'\r\n this.visible = true\r\n this.input.focus()\r\n }\r\n\r\n hide(): void {\r\n this.input.style.display = 'none'\r\n this.visible = false\r\n this.input.value = ''\r\n }\r\n\r\n getValue(): string {\r\n return this.input.value\r\n }\r\n\r\n isVisible(): boolean {\r\n return this.visible\r\n }\r\n}\r\n","import { CanvasOverlay } from '../annotator/canvas-overlay.js'\r\nimport { BoxTool } from '../annotator/box-tool.js'\r\nimport { FiberWalker } from '../inspector/fiber-walker.js'\r\nimport { SourceMapper } from '../inspector/source-mapper.js'\r\nimport type { Annotation, AnnotationMode, AnnotationSet, SourceInfo } from '../types.js'\r\n\r\nexport class CanvasOverlayPanel {\r\n private overlay: CanvasOverlay\r\n readonly boxTool: BoxTool\r\n private mode: AnnotationMode = 'off'\r\n private onSourceSelect?: (source: SourceInfo) => void\r\n private onAnnotationsReady?: (set: AnnotationSet) => void\r\n\r\n constructor() {\r\n this.overlay = new CanvasOverlay()\r\n this.boxTool = new BoxTool()\r\n }\r\n\r\n mount(): void {\r\n this.overlay.mount()\r\n }\r\n\r\n unmount(): void {\r\n this.overlay.unmount()\r\n }\r\n\r\n setMode(mode: AnnotationMode): void {\r\n this.mode = mode\r\n this.overlay.setMode(mode)\r\n }\r\n\r\n getMode(): AnnotationMode {\r\n return this.mode\r\n }\r\n\r\n onSelect(cb: (source: SourceInfo) => void): void {\r\n this.onSourceSelect = cb\r\n }\r\n\r\n onSend(cb: (set: AnnotationSet) => void): void {\r\n this.onAnnotationsReady = cb\r\n }\r\n\r\n handleElementHover(el: HTMLElement): void {\r\n const fiber = FiberWalker.getFiberFromElement(el)\r\n if (!fiber) return\r\n const rect = el.getBoundingClientRect()\r\n this.overlay.drawHoverHighlight(rect)\r\n }\r\n\r\n handleElementSelect(el: HTMLElement): void {\r\n const fiber = FiberWalker.getFiberFromElement(el)\r\n if (!fiber) return\r\n const source = FiberWalker.getSourceInfo(fiber)\r\n if (!source) return\r\n source.library = SourceMapper.detectLibrary(source)\r\n const rect = el.getBoundingClientRect()\r\n this.overlay.drawSelectHighlight(rect)\r\n const annotation: Annotation = {\r\n id: `ann-${Date.now()}`,\r\n type: 'element-select',\r\n rect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },\r\n source,\r\n memo: '',\r\n createdAt: Date.now(),\r\n }\r\n this.overlay.addAnnotation(annotation)\r\n this.onSourceSelect?.(source)\r\n }\r\n\r\n collectAnnotationSet(): AnnotationSet {\r\n return {\r\n annotations: this.overlay.getAnnotations(),\r\n viewport: { width: window.innerWidth, height: window.innerHeight },\r\n }\r\n }\r\n\r\n send(): void {\r\n const set = this.collectAnnotationSet()\r\n this.onAnnotationsReady?.(set)\r\n }\r\n\r\n clearAnnotations(): void {\r\n this.overlay.clearAnnotations()\r\n this.overlay.clear()\r\n }\r\n}\r\n","import type { AnnotationMode } from '../types.js'\r\n\r\nconst TOOLS: { mode: AnnotationMode; label: string; title: string }[] = [\r\n { mode: 'select', label: 'S', title: 'Select element' },\r\n { mode: 'box', label: 'B', title: 'Draw box annotation' },\r\n { mode: 'memo', label: 'M', title: 'Add memo' },\r\n { mode: 'capture', label: 'C', title: 'Capture screenshot' },\r\n]\r\n\r\nconst TOOLBAR_STYLES = `\r\n.cc-toolbar {\r\n position: fixed;\r\n bottom: 24px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n background: var(--cc-bg-panel, rgba(30,30,30,0.95));\r\n border: 1px solid var(--cc-border, rgba(255,255,255,0.15));\r\n border-radius: 8px;\r\n padding: 6px 8px;\r\n z-index: 100002;\r\n box-shadow: 0 4px 16px rgba(0,0,0,0.4);\r\n}\r\n.cc-tool-btn {\r\n width: 32px;\r\n height: 32px;\r\n border: none;\r\n border-radius: 4px;\r\n background: transparent;\r\n color: var(--cc-text-secondary, rgba(255,255,255,0.6));\r\n cursor: pointer;\r\n font-size: 11px;\r\n font-family: var(--cc-font-family, sans-serif);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: background 0.1s ease, color 0.1s ease;\r\n}\r\n.cc-tool-btn:hover {\r\n background: var(--cc-bg-hover, rgba(255,255,255,0.1));\r\n color: var(--cc-text-primary, #e0e0e0);\r\n}\r\n.cc-tool-btn.active {\r\n background: var(--cc-accent, #7c4dff);\r\n color: #fff;\r\n}\r\n.cc-toolbar-divider {\r\n width: 1px;\r\n height: 20px;\r\n background: var(--cc-border, rgba(255,255,255,0.15));\r\n margin: 0 2px;\r\n}\r\n.cc-send-btn {\r\n padding: 0 12px;\r\n height: 32px;\r\n border: none;\r\n border-radius: 4px;\r\n background: var(--cc-accent, #7c4dff);\r\n color: #fff;\r\n cursor: pointer;\r\n font-size: 12px;\r\n font-family: var(--cc-font-family, sans-serif);\r\n white-space: nowrap;\r\n transition: background 0.1s ease;\r\n}\r\n.cc-send-btn:hover {\r\n background: var(--cc-border-focus, rgba(124,77,255,0.8));\r\n}\r\n`\r\n\r\nexport class ToolbarPanel {\r\n private container: HTMLElement\r\n private currentTool: AnnotationMode = 'select'\r\n private onModeChange?: (mode: AnnotationMode) => void\r\n private onSend?: () => void\r\n private buttons: Map<AnnotationMode, HTMLButtonElement> = new Map()\r\n private mounted = false\r\n\r\n constructor(shadowRoot: ShadowRoot) {\r\n const style = document.createElement('style')\r\n style.textContent = TOOLBAR_STYLES\r\n shadowRoot.appendChild(style)\r\n\r\n this.container = document.createElement('div')\r\n this.container.className = 'cc-toolbar'\r\n this.container.style.display = 'none'\r\n\r\n TOOLS.forEach(({ mode, label, title }) => {\r\n const btn = document.createElement('button')\r\n btn.className = 'cc-tool-btn'\r\n btn.textContent = label\r\n btn.title = title\r\n btn.setAttribute('data-mode', mode)\r\n btn.addEventListener('click', () => {\r\n this.setActiveTool(mode)\r\n this.onModeChange?.(mode)\r\n })\r\n this.buttons.set(mode, btn)\r\n this.container.appendChild(btn)\r\n })\r\n\r\n const divider = document.createElement('div')\r\n divider.className = 'cc-toolbar-divider'\r\n this.container.appendChild(divider)\r\n\r\n const sendBtn = document.createElement('button')\r\n sendBtn.className = 'cc-send-btn'\r\n sendBtn.textContent = 'Send'\r\n sendBtn.addEventListener('click', () => this.onSend?.())\r\n this.container.appendChild(sendBtn)\r\n\r\n shadowRoot.appendChild(this.container)\r\n }\r\n\r\n mount(): void {\r\n this.container.style.display = 'flex'\r\n this.mounted = true\r\n }\r\n\r\n unmount(): void {\r\n this.container.style.display = 'none'\r\n this.mounted = false\r\n }\r\n\r\n setActiveTool(mode: AnnotationMode): void {\r\n this.currentTool = mode\r\n this.buttons.forEach((btn, btnMode) => {\r\n btn.classList.toggle('active', btnMode === mode)\r\n })\r\n }\r\n\r\n getActiveTool(): AnnotationMode {\r\n return this.currentTool\r\n }\r\n\r\n onToolChange(cb: (mode: AnnotationMode) => void): void {\r\n this.onModeChange = cb\r\n }\r\n\r\n onSendClick(cb: () => void): void {\r\n this.onSend = cb\r\n }\r\n\r\n isMounted(): boolean {\r\n return this.mounted\r\n }\r\n}\r\n","import type { SourceInfo } from '../types.js'\r\nimport { SourceMapper } from '../inspector/source-mapper.js'\r\n\r\nconst POPUP_STYLES = `\r\n.cc-inspector-popup {\r\n position: fixed;\r\n background: var(--cc-bg-panel, rgba(30,30,30,0.97));\r\n border: 1px solid var(--cc-border, rgba(255,255,255,0.15));\r\n border-radius: 6px;\r\n padding: 8px 12px;\r\n font-family: var(--cc-font-family, monospace);\r\n font-size: var(--cc-font-size-xs, 11px);\r\n color: var(--cc-text-primary, #e0e0e0);\r\n z-index: 100003;\r\n pointer-events: none;\r\n max-width: 320px;\r\n box-shadow: 0 4px 16px rgba(0,0,0,0.4);\r\n display: none;\r\n}\r\n.cc-inspector-popup.pinned {\r\n pointer-events: auto;\r\n}\r\n.cc-popup-component {\r\n font-weight: bold;\r\n color: var(--cc-accent, #7c4dff);\r\n margin-bottom: 2px;\r\n}\r\n.cc-popup-file {\r\n color: var(--cc-text-secondary, rgba(255,255,255,0.6));\r\n word-break: break-all;\r\n}\r\n.cc-popup-library {\r\n margin-top: 4px;\r\n padding: 2px 6px;\r\n background: var(--cc-bg-hover, rgba(255,255,255,0.08));\r\n border-radius: 3px;\r\n display: inline-block;\r\n font-size: 10px;\r\n}\r\n`\r\n\r\nexport class InspectorPopupPanel {\r\n private element: HTMLElement\r\n private sourceMapper: SourceMapper\r\n private pinned = false\r\n\r\n constructor(shadowRoot: ShadowRoot) {\r\n this.sourceMapper = new SourceMapper()\r\n\r\n const style = document.createElement('style')\r\n style.textContent = POPUP_STYLES\r\n shadowRoot.appendChild(style)\r\n\r\n this.element = document.createElement('div')\r\n this.element.className = 'cc-inspector-popup'\r\n this.element.style.display = 'none'\r\n shadowRoot.appendChild(this.element)\r\n }\r\n\r\n show(source: SourceInfo, rect: DOMRect): void {\r\n const library = this.sourceMapper.detectLibrary(source)\r\n const path = this.sourceMapper.formatSourcePath(source.file, source.line, source.column)\r\n\r\n this.element.innerHTML = ''\r\n\r\n const compLine = document.createElement('div')\r\n compLine.className = 'cc-popup-component'\r\n compLine.textContent = `<${source.componentName}>`\r\n this.element.appendChild(compLine)\r\n\r\n const fileLine = document.createElement('div')\r\n fileLine.className = 'cc-popup-file'\r\n fileLine.textContent = path\r\n this.element.appendChild(fileLine)\r\n\r\n if (library !== 'unknown') {\r\n const libLine = document.createElement('span')\r\n libLine.className = 'cc-popup-library'\r\n libLine.textContent = library\r\n this.element.appendChild(libLine)\r\n }\r\n\r\n // Position above the element\r\n const popupHeight = 80\r\n const top = Math.max(4, rect.top - popupHeight - 8)\r\n const left = Math.min(rect.left, window.innerWidth - 330)\r\n\r\n this.element.style.top = top + 'px'\r\n this.element.style.left = left + 'px'\r\n this.element.style.display = 'block'\r\n }\r\n\r\n hide(): void {\r\n if (this.pinned) return\r\n this.element.style.display = 'none'\r\n }\r\n\r\n forceHide(): void {\r\n this.pinned = false\r\n this.element.style.display = 'none'\r\n }\r\n\r\n pin(): void {\r\n this.pinned = true\r\n this.element.classList.add('pinned')\r\n }\r\n\r\n unpin(): void {\r\n this.pinned = false\r\n this.element.classList.remove('pinned')\r\n }\r\n\r\n isPinned(): boolean {\r\n return this.pinned\r\n }\r\n\r\n isVisible(): boolean {\r\n return this.element.style.display !== 'none'\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@claude-canvas/core",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Claude Canvas browser-side core (annotator, inspector, chat, session)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"access": "public"
|
|
19
|
+
},
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://github.com/claude-canvas/claude-canvas.git",
|
|
23
|
+
"directory": "packages/core"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"tsup": "^8.4.0",
|
|
27
|
+
"vitest": "^3.0.0",
|
|
28
|
+
"jsdom": "^25.0.0",
|
|
29
|
+
"typescript": "^5.7.0"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsup",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"test:watch": "vitest",
|
|
35
|
+
"lint": "eslint src/",
|
|
36
|
+
"typecheck": "tsc --noEmit",
|
|
37
|
+
"clean": "rm -rf dist"
|
|
38
|
+
}
|
|
39
|
+
}
|