bump: v1.7.21

- Element inspector (pick, screenshot, audit) at top of Tools tab
- CDP bridge evaluate fix (Runtime.enable + returnByValue)
- Screenshot fallback to captureVisibleTab
- Firefox: bridge.status, zap.status handlers in background
- Build info panel in Settings (version, browser, CDP/MCP status)
- Version shown in footer
- Services panel moved to bottom
This commit is contained in:
Hanzo Dev
2026-03-10 11:29:05 -07:00
parent e296931b56
commit 3e26acd30b
6 changed files with 181 additions and 122 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "hanzo-ai-monorepo",
"version": "1.7.20",
"version": "1.7.21",
"private": true,
"description": "Hanzo AI Development Platform Monorepo",
"license": "MIT",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@hanzo/browser-extension",
"version": "1.7.20",
"version": "1.7.21",
"description": "Hanzo AI Browser Extension",
"main": "dist/background.js",
"scripts": {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"manifest_version": 3,
"name": "Hanzo AI",
"version": "1.7.20",
"version": "1.7.21",
"description": "AI-powered dev assistant — click-to-code navigation, source maps, WebGPU AI, and MCP integration for Claude Code.",
"permissions": [
"activeTab",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"manifest_version": 3,
"name": "Hanzo AI",
"version": "1.7.20",
"version": "1.7.21",
"description": "AI-powered dev assistant — click-to-code navigation, source maps, WebGPU AI, and MCP integration for Claude Code.",
"permissions": [
"activeTab",
+154 -101
View File
@@ -1,20 +1,23 @@
/* Hanzo AI Browser Extension Popup — Monochrome Vibrancy */
/* Hanzo AI Browser Extension Popup — Refined Monochrome */
:root {
--primary: #FFFFFF;
--primary-dark: #D4D4D4;
--primary-dark: #E0E0E0;
--bg: #000000;
--surface: #0A0A0A;
--surface-light: #1A1A1A;
--text: #FFFFFF;
--text-dim: #888888;
--text-secondary: #A0A0A0;
--text-dim: #666666;
--border: rgba(255,255,255,0.08);
--border-strong: rgba(255,255,255,0.14);
--border-strong: rgba(255,255,255,0.16);
--glass: rgba(255,255,255,0.04);
--glass-strong: rgba(255,255,255,0.07);
--success: #4CAF50;
--warning: #FFC107;
--error: #F44336;
--link: #A0A0A0;
--link-hover: #FFFFFF;
}
* {
@@ -24,11 +27,11 @@
}
body {
width: 380px;
width: 360px;
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Inter', 'Segoe UI', sans-serif;
background: var(--bg);
color: var(--text);
font-size: 14px;
font-size: 13px;
line-height: 1.5;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
@@ -36,7 +39,7 @@ body {
.container {
background: var(--surface);
min-height: 500px;
min-height: 480px;
position: relative;
}
@@ -47,7 +50,7 @@ body {
top: 0;
left: 0;
right: 0;
height: 120px;
height: 100px;
background: radial-gradient(ellipse at 50% 0%, rgba(255,255,255,0.03) 0%, transparent 70%);
pointer-events: none;
}
@@ -71,15 +74,15 @@ body {
@keyframes glowPulse {
0%, 100% { box-shadow: 0 0 0 0 rgba(255,255,255,0); }
50% { box-shadow: 0 0 12px 2px rgba(255,255,255,0.06); }
50% { box-shadow: 0 0 8px 1px rgba(255,255,255,0.05); }
}
/* Header */
header {
display: flex;
align-items: center;
gap: 12px;
padding: 16px;
gap: 10px;
padding: 14px 16px;
border-bottom: 1px solid var(--border);
background: rgba(0,0,0,0.6);
backdrop-filter: blur(20px) saturate(180%);
@@ -89,33 +92,36 @@ header {
}
.logo {
width: 24px;
height: 24px;
width: 22px;
height: 22px;
color: var(--text);
filter: drop-shadow(0 0 6px rgba(255,255,255,0.15));
filter: drop-shadow(0 0 4px rgba(255,255,255,0.12));
}
h1 {
font-size: 18px;
font-size: 16px;
font-weight: 600;
letter-spacing: -0.01em;
}
h2 {
font-size: 16px;
font-size: 15px;
font-weight: 600;
margin-bottom: 8px;
margin-bottom: 6px;
}
h3 {
font-size: 14px;
font-size: 12px;
font-weight: 600;
margin-bottom: 12px;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--text-secondary);
margin-bottom: 10px;
}
/* Sections */
.section {
padding: 20px;
padding: 16px;
animation: fadeIn 0.3s ease;
}
@@ -126,7 +132,8 @@ h3 {
.subtitle {
color: var(--text-dim);
margin-bottom: 20px;
margin-bottom: 16px;
font-size: 13px;
}
/* Buttons */
@@ -136,17 +143,22 @@ h3 {
justify-content: center;
gap: 8px;
width: 100%;
padding: 12px 16px;
padding: 10px 14px;
border: none;
border-radius: 8px;
font-size: 14px;
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: all 0.25s ease;
transition: all 0.2s ease;
position: relative;
overflow: hidden;
}
.btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.btn-primary {
background: var(--primary);
color: #000000;
@@ -161,13 +173,13 @@ h3 {
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.15), transparent);
transition: left 0.5s ease;
}
.btn-primary:hover {
background: var(--primary-dark);
box-shadow: 0 0 16px rgba(255,255,255,0.12);
box-shadow: 0 0 12px rgba(255,255,255,0.1);
}
.btn-primary:hover::after {
@@ -178,19 +190,28 @@ h3 {
background: var(--glass-strong);
color: var(--text);
border: 1px solid var(--border);
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
}
.btn-secondary:hover {
background: var(--glass);
background: rgba(255,255,255,0.1);
border-color: var(--border-strong);
box-shadow: 0 0 8px rgba(255,255,255,0.05);
}
.btn-ghost {
background: transparent;
color: var(--text-secondary);
border: 1px solid var(--border);
}
.btn-ghost:hover {
color: var(--text);
border-color: var(--border-strong);
background: var(--glass);
}
.btn-icon {
width: 32px;
height: 32px;
width: 28px;
height: 28px;
padding: 0;
display: flex;
align-items: center;
@@ -209,32 +230,30 @@ h3 {
}
.btn-icon svg {
width: 18px;
height: 18px;
width: 16px;
height: 16px;
stroke-width: 1.5;
}
.icon {
width: 20px;
height: 20px;
width: 16px;
height: 16px;
}
/* User Info */
.user-info {
display: flex;
align-items: center;
gap: 12px;
padding: 16px;
gap: 10px;
padding: 12px;
background: var(--glass-strong);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border: 1px solid var(--border);
border-radius: 8px;
}
.avatar {
width: 40px;
height: 40px;
width: 34px;
height: 34px;
border-radius: 50%;
background: var(--border);
border: 1px solid var(--border);
@@ -246,35 +265,35 @@ h3 {
.user-name {
font-weight: 600;
font-size: 13px;
}
.user-email {
font-size: 12px;
font-size: 11px;
color: var(--text-dim);
}
/* Features */
/* Features — compact toggles */
.features {
display: flex;
flex-direction: column;
gap: 12px;
gap: 2px;
}
.feature-toggle label {
display: flex;
align-items: center;
gap: 12px;
padding: 12px;
background: var(--glass-strong);
border: 1px solid var(--border);
border-radius: 8px;
gap: 10px;
padding: 8px 10px;
background: transparent;
border: none;
border-radius: 6px;
cursor: pointer;
transition: all 0.2s;
transition: all 0.15s;
}
.feature-toggle label:hover {
background: var(--glass);
border-color: var(--border-strong);
background: var(--glass-strong);
}
.feature-toggle input {
@@ -283,11 +302,11 @@ h3 {
.toggle {
position: relative;
width: 44px;
height: 24px;
background: rgba(255,255,255,0.1);
border-radius: 12px;
transition: background 0.3s;
width: 32px;
height: 18px;
background: rgba(255,255,255,0.12);
border-radius: 9px;
transition: background 0.25s;
flex-shrink: 0;
}
@@ -296,12 +315,12 @@ h3 {
position: absolute;
top: 2px;
left: 2px;
width: 20px;
height: 20px;
background: white;
width: 14px;
height: 14px;
background: #888;
border-radius: 50%;
transition: transform 0.3s;
box-shadow: 0 1px 4px rgba(0,0,0,0.3);
transition: all 0.25s;
box-shadow: 0 1px 3px rgba(0,0,0,0.3);
}
input:checked + .toggle {
@@ -309,54 +328,62 @@ input:checked + .toggle {
}
input:checked + .toggle::after {
transform: translateX(20px);
transform: translateX(14px);
background: #000;
}
.feature-info {
flex: 1;
}
.feature-info strong {
font-size: 13px;
font-weight: 500;
}
.feature-info small {
display: block;
color: var(--text-dim);
font-size: 12px;
font-size: 11px;
line-height: 1.3;
}
/* Status */
.status {
display: flex;
flex-direction: column;
gap: 12px;
gap: 8px;
}
.status-item {
display: flex;
align-items: center;
gap: 8px;
font-size: 12px;
}
.status-dot {
width: 8px;
height: 8px;
width: 6px;
height: 6px;
border-radius: 50%;
background: rgba(255,255,255,0.1);
background: rgba(255,255,255,0.12);
transition: all 0.3s;
flex-shrink: 0;
}
.status-dot.connected {
background: var(--success);
box-shadow: 0 0 8px rgba(76, 175, 80, 0.3);
animation: glowPulse 3s infinite;
box-shadow: 0 0 6px rgba(76, 175, 80, 0.3);
}
.status-dot.warning {
background: var(--warning);
box-shadow: 0 0 8px rgba(255, 193, 7, 0.2);
box-shadow: 0 0 6px rgba(255, 193, 7, 0.2);
}
.status-dot.error {
background: var(--error);
box-shadow: 0 0 8px rgba(244, 67, 54, 0.2);
box-shadow: 0 0 6px rgba(244, 67, 54, 0.2);
}
.status-dot.connecting {
@@ -365,54 +392,56 @@ input:checked + .toggle::after {
.status-detail {
margin-left: auto;
font-size: 12px;
font-size: 11px;
color: var(--text-dim);
}
/* Actions */
.actions {
display: flex;
gap: 12px;
gap: 8px;
}
.actions .btn {
flex: 1;
font-size: 12px;
padding: 8px 12px;
}
/* Guide */
.guide {
background: var(--glass-strong);
background: var(--glass);
border: 1px solid var(--border);
padding: 16px;
padding: 12px;
border-radius: 8px;
}
.guide h3 {
margin-bottom: 8px;
margin-bottom: 6px;
}
.guide p {
font-size: 12px;
font-size: 11px;
color: var(--text-dim);
margin-bottom: 4px;
margin-bottom: 3px;
}
kbd {
display: inline-block;
padding: 2px 6px;
padding: 1px 5px;
background: rgba(255,255,255,0.06);
border: 1px solid var(--border);
border-radius: 4px;
font-family: monospace;
font-size: 11px;
border-radius: 3px;
font-family: 'SF Mono', 'Menlo', monospace;
font-size: 10px;
}
/* Settings */
.settings-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 20px;
gap: 10px;
margin-bottom: 16px;
}
.settings-header h2 {
@@ -420,12 +449,12 @@ kbd {
}
.setting-group {
margin-bottom: 24px;
margin-bottom: 20px;
}
.setting-group label {
display: block;
margin-bottom: 12px;
margin-bottom: 10px;
color: var(--text-dim);
font-size: 12px;
}
@@ -434,12 +463,12 @@ kbd {
.setting-group input[type="number"],
.setting-group select {
width: 100%;
padding: 8px 12px;
padding: 7px 10px;
background: var(--glass-strong);
border: 1px solid var(--border);
border-radius: 6px;
color: var(--text);
font-size: 14px;
font-size: 13px;
margin-top: 4px;
transition: border-color 0.2s;
}
@@ -466,17 +495,17 @@ kbd {
.backend-select-wrapper select {
width: 100%;
padding: 8px 12px;
padding: 7px 10px;
background: var(--glass-strong);
border: 1px solid var(--border);
border-radius: 6px;
color: var(--text);
font-size: 14px;
font-size: 13px;
cursor: pointer;
appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23888' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 12px center;
background-position: right 10px center;
transition: border-color 0.2s;
}
@@ -489,8 +518,8 @@ kbd {
display: flex;
align-items: center;
gap: 8px;
margin-top: 8px;
font-size: 12px;
margin-top: 6px;
font-size: 11px;
color: var(--text-dim);
}
@@ -498,23 +527,47 @@ kbd {
.divider {
height: 1px;
background: var(--border);
margin: 16px 0;
margin: 12px 0;
}
/* Links */
.help-text {
text-align: center;
font-size: 12px;
color: var(--text-dim);
margin-top: 16px;
margin-top: 12px;
}
.help-text a {
color: var(--text-dim);
text-decoration: none;
transition: color 0.2s;
color: var(--link);
text-decoration: underline;
text-decoration-color: rgba(160,160,160,0.3);
text-underline-offset: 2px;
transition: all 0.2s;
}
.help-text a:hover {
color: var(--link-hover);
text-decoration-color: rgba(255,255,255,0.5);
}
/* Footer links */
.footer-links {
display: flex;
justify-content: center;
gap: 16px;
padding: 12px 16px;
border-top: 1px solid var(--border);
margin-top: 4px;
}
.footer-links a {
color: var(--text-dim);
text-decoration: none;
font-size: 11px;
transition: color 0.2s;
}
.footer-links a:hover {
color: var(--text);
text-decoration: underline;
}
+23 -17
View File
@@ -25,7 +25,7 @@
<p class="subtitle">Connect to your Hanzo AI account</p>
<button id="login-btn" class="btn btn-primary">Sign in with Hanzo</button>
<p class="help-text">
<a href="https://hanzo.id/register" target="_blank">Create account</a>
<a href="https://hanzo.id/register" target="_blank">Create account</a> &middot;
<a href="https://hanzo.id/forgot" target="_blank">Forgot password?</a>
</p>
</div>
@@ -48,21 +48,24 @@
<div class="divider"></div>
</div>
<!-- Open Chat Panel -->
<button id="open-panel" class="btn btn-primary" style="margin-bottom: 16px;">
<!-- Actions -->
<button id="open-panel" class="btn btn-secondary" style="margin-bottom: 8px;">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/>
</svg>
Open Chat Panel
</button>
<button id="open-page-overlay" class="btn btn-secondary" style="margin-bottom: 16px;">
<button id="open-page-overlay" class="btn btn-ghost" style="margin-bottom: 12px;">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
<path d="M4 4h16v12H8l-4 4V4z"/>
</svg>
Toggle On-Page Overlay
</button>
<div class="divider"></div>
<!-- Features -->
<h3>Features</h3>
<div class="features">
<div class="feature-toggle">
<label>
@@ -113,7 +116,7 @@
<!-- Browser Backend -->
<div class="setting-group backend-picker">
<h3>Browser Backend</h3>
<h3>Backend</h3>
<div class="backend-select-wrapper">
<select id="browser-backend">
<option value="auto">Auto (default)</option>
@@ -132,6 +135,7 @@
<div class="divider"></div>
<!-- Connection Status -->
<h3>Status</h3>
<div class="status">
<div class="status-item">
<span class="status-dot" id="zap-status"></span>
@@ -159,15 +163,15 @@
<!-- Actions -->
<div class="actions">
<button id="test-connection" class="btn btn-secondary">Test Connection</button>
<button id="open-settings" class="btn btn-secondary">Settings</button>
<button id="test-connection" class="btn btn-ghost">Test Connection</button>
<button id="open-settings" class="btn btn-ghost">Settings</button>
</div>
<!-- Quick Guide -->
<div class="guide" style="margin-top: 16px;">
<h3>Quick Guide</h3>
<p><kbd>Alt</kbd> + <kbd>Click</kbd> any element to navigate to source</p>
<p><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>H</kbd> to open Hanzo AI panel</p>
<div class="guide" style="margin-top: 12px;">
<h3 style="text-transform: none; letter-spacing: 0; color: var(--text);">Shortcuts</h3>
<p><kbd>Alt</kbd> + <kbd>Click</kbd> any element to jump to source</p>
<p><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>H</kbd> open Hanzo panel</p>
</div>
</div>
@@ -228,14 +232,16 @@
</div>
<button id="save-settings" class="btn btn-primary">Save Settings</button>
<p class="help-text" style="margin-top: 16px;">
<a href="https://console.hanzo.ai" target="_blank">Console</a>
<a href="https://billing.hanzo.ai" target="_blank">Billing</a>
<a href="https://docs.hanzo.ai" target="_blank">Docs</a>
</p>
</div>
</div>
<!-- Footer -->
<div class="footer-links">
<a href="https://docs.hanzo.ai" target="_blank">Docs</a>
<a href="https://console.hanzo.ai" target="_blank">Console</a>
<a href="https://github.com/hanzoai/extension" target="_blank">GitHub</a>
<a href="https://hanzo.ai" target="_blank">hanzo.ai</a>
</div>
</div>
<script src="popup.js"></script>