| |
| |
| |
| |
| |
|
|
|
|
| *,
|
| *::before,
|
| *::after {
|
| margin: 0;
|
| padding: 0;
|
| box-sizing: border-box;
|
| }
|
|
|
| :root {
|
| --bg: #f8f9fa;
|
| --bg-card: #ffffff;
|
| --bg-hover: #f1f3f4;
|
| --bg-input: #ffffff;
|
| --bg-chip: #ffffff;
|
| --bg-output: #f8f9fa;
|
|
|
| --border: #dadce0;
|
| --border-light: #e8eaed;
|
| --border-focus: #4d90fe;
|
|
|
| --text: #202124;
|
| --text-secondary: #5f6368;
|
| --text-muted: #9aa0a6;
|
| --text-link: #1a73e8;
|
|
|
| --accent: #1a73e8;
|
| --accent-light: #e8f0fe;
|
| --accent-surface: rgba(26, 115, 232, 0.08);
|
|
|
| --success: #34a853;
|
| --error: #ea4335;
|
| --warning: #fbbc04;
|
|
|
| --font: 'DM Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
|
| --font-mono: 'JetBrains Mono', 'Cascadia Code', 'Consolas', monospace;
|
|
|
| --radius-sm: 6px;
|
| --radius-md: 12px;
|
| --radius-lg: 24px;
|
| --radius-pill: 100px;
|
|
|
| --shadow: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.06);
|
| --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08);
|
| --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.1);
|
| --shadow-card: 0 1px 6px rgba(0, 0, 0, 0.06), 0 2px 32px rgba(0, 0, 0, 0.04);
|
|
|
| --grid-color: #e0e0e0;
|
| --grid-size: 40px;
|
| }
|
|
|
| html,
|
| body {
|
| height: 100%;
|
| font-family: var(--font);
|
| font-size: 14px;
|
| color: var(--text);
|
| background: var(--bg);
|
| -webkit-font-smoothing: antialiased;
|
| overflow: hidden;
|
| }
|
|
|
| ::selection {
|
| background: var(--accent-light);
|
| color: var(--accent);
|
| }
|
|
|
| ::-webkit-scrollbar {
|
| width: 6px;
|
| height: 6px;
|
| }
|
|
|
| ::-webkit-scrollbar-track {
|
| background: transparent;
|
| }
|
|
|
| ::-webkit-scrollbar-thumb {
|
| background: var(--border);
|
| border-radius: 3px;
|
| }
|
|
|
|
|
| #app {
|
| display: flex;
|
| height: 100vh;
|
| width: 100vw;
|
| }
|
|
|
|
|
| #canvas {
|
| flex: 1;
|
| position: relative;
|
| display: flex;
|
| flex-direction: column;
|
| align-items: center;
|
| justify-content: center;
|
| background-color: var(--bg);
|
| background-image: radial-gradient(circle, var(--grid-color) 1px, transparent 1px);
|
| background-size: var(--grid-size) var(--grid-size);
|
| overflow: hidden;
|
| }
|
|
|
|
|
| #status-bar {
|
| position: absolute;
|
| top: 16px;
|
| right: 20px;
|
| display: flex;
|
| align-items: center;
|
| gap: 6px;
|
| font-size: 11px;
|
| color: var(--text-muted);
|
| z-index: 10;
|
| }
|
|
|
| #connection-indicator {
|
| width: 7px;
|
| height: 7px;
|
| border-radius: 50%;
|
| background: var(--error);
|
| transition: background 0.3s;
|
| }
|
|
|
| #connection-indicator.connected {
|
| background: var(--success);
|
| }
|
|
|
| #status-text {
|
| font-weight: 500;
|
| }
|
|
|
|
|
| #tool-rail {
|
| display: flex;
|
| flex-direction: column;
|
| gap: 8px;
|
| padding: 16px 10px;
|
| z-index: 10;
|
| background: transparent;
|
| }
|
|
|
| .rail-btn {
|
| display: flex;
|
| align-items: center;
|
| justify-content: center;
|
| width: 38px;
|
| height: 38px;
|
| border: 1.5px solid var(--border);
|
| border-radius: var(--radius-md);
|
| background: var(--bg-card);
|
| color: var(--text-secondary);
|
| font-family: var(--font);
|
| font-size: 13px;
|
| font-weight: 600;
|
| cursor: pointer;
|
| transition: all 0.15s ease;
|
| box-shadow: var(--shadow);
|
| position: relative;
|
| }
|
|
|
| .rail-btn:hover {
|
| border-color: var(--accent);
|
| color: var(--accent);
|
| box-shadow: var(--shadow-md);
|
| transform: translateY(-1px);
|
| }
|
|
|
| .rail-btn:active {
|
| transform: scale(0.95);
|
| }
|
|
|
| .rail-btn.active {
|
| border-color: var(--accent);
|
| background: var(--accent-light);
|
| color: var(--accent);
|
| }
|
|
|
| .rail-btn[title]::after {
|
| content: attr(title);
|
| position: absolute;
|
| left: calc(100% + 8px);
|
| top: 50%;
|
| transform: translateY(-50%);
|
| background: var(--text);
|
| color: #fff;
|
| font-size: 11px;
|
| font-weight: 500;
|
| padding: 4px 10px;
|
| border-radius: var(--radius-sm);
|
| white-space: nowrap;
|
| opacity: 0;
|
| pointer-events: none;
|
| transition: opacity 0.15s;
|
| }
|
|
|
| .rail-btn:hover[title]::after {
|
| opacity: 1;
|
| }
|
|
|
|
|
| #center-card {
|
| position: relative;
|
| width: 100%;
|
| max-width: 600px;
|
| background: var(--bg-card);
|
| border: 1px solid var(--border-light);
|
| border-radius: 20px;
|
| padding: 36px 40px 28px;
|
| box-shadow: var(--shadow-card);
|
| animation: cardIn 0.3s ease-out;
|
| z-index: 5;
|
| }
|
|
|
| @keyframes cardIn {
|
| from {
|
| opacity: 0;
|
| transform: translateY(12px) scale(0.98);
|
| }
|
|
|
| to {
|
| opacity: 1;
|
| transform: translateY(0) scale(1);
|
| }
|
| }
|
|
|
| #card-close {
|
| position: absolute;
|
| top: 14px;
|
| right: 18px;
|
| background: none;
|
| border: none;
|
| font-size: 20px;
|
| color: var(--text-muted);
|
| cursor: pointer;
|
| line-height: 1;
|
| padding: 4px;
|
| transition: color 0.15s;
|
| }
|
|
|
| #card-close:hover {
|
| color: var(--text);
|
| }
|
|
|
| #greeting {
|
| font-size: 22px;
|
| font-weight: 600;
|
| color: var(--text);
|
| margin-bottom: 20px;
|
| letter-spacing: -0.4px;
|
| text-align: center;
|
| }
|
|
|
|
|
| #prompt-container {
|
| display: flex;
|
| align-items: center;
|
| gap: 8px;
|
| background: var(--bg-input);
|
| border: 1.5px solid var(--border);
|
| border-radius: var(--radius-pill);
|
| padding: 4px 6px 4px 18px;
|
| transition: border-color 0.15s, box-shadow 0.15s;
|
| }
|
|
|
| #prompt-container:focus-within {
|
| border-color: var(--border-focus);
|
| box-shadow: 0 0 0 3px var(--accent-surface);
|
| }
|
|
|
| #prompt-input,
|
| #conv-input {
|
| flex: 1;
|
| border: none;
|
| outline: none;
|
| background: transparent;
|
| font-family: var(--font);
|
| font-size: 14px;
|
| color: var(--text);
|
| padding: 10px 0;
|
| }
|
|
|
| #prompt-input::placeholder,
|
| #conv-input::placeholder {
|
| color: var(--text-muted);
|
| }
|
|
|
| #send-btn,
|
| #conv-send-btn {
|
| display: flex;
|
| align-items: center;
|
| justify-content: center;
|
| width: 34px;
|
| height: 34px;
|
| border: none;
|
| border-radius: 50%;
|
| background: var(--accent);
|
| color: #fff;
|
| cursor: pointer;
|
| transition: all 0.15s;
|
| flex-shrink: 0;
|
| }
|
|
|
| #send-btn:hover,
|
| #conv-send-btn:hover {
|
| background: #1557b0;
|
| transform: scale(1.05);
|
| }
|
|
|
|
|
| #icon-bar {
|
| display: flex;
|
| align-items: center;
|
| gap: 4px;
|
| margin-top: 12px;
|
| padding: 0 4px;
|
| }
|
|
|
| .icon-btn {
|
| display: flex;
|
| align-items: center;
|
| justify-content: center;
|
| width: 30px;
|
| height: 30px;
|
| border: none;
|
| border-radius: var(--radius-sm);
|
| background: transparent;
|
| color: var(--text-muted);
|
| cursor: pointer;
|
| transition: all 0.12s;
|
| }
|
|
|
| .icon-btn:hover {
|
| background: var(--bg-hover);
|
| color: var(--text-secondary);
|
| }
|
|
|
|
|
| #suggestion-chips {
|
| display: flex;
|
| flex-wrap: wrap;
|
| justify-content: center;
|
| gap: 8px;
|
| margin-top: 16px;
|
| }
|
|
|
| .chip {
|
| display: inline-flex;
|
| align-items: center;
|
| padding: 8px 18px;
|
| font-family: var(--font);
|
| font-size: 13px;
|
| font-weight: 500;
|
| color: var(--text);
|
| background: var(--bg-chip);
|
| border: 1px solid var(--border);
|
| border-radius: var(--radius-pill);
|
| cursor: pointer;
|
| transition: all 0.15s;
|
| user-select: none;
|
| }
|
|
|
| .chip:hover {
|
| border-color: var(--text-muted);
|
| box-shadow: var(--shadow);
|
| transform: translateY(-1px);
|
| }
|
|
|
| .chip:active {
|
| transform: scale(0.97);
|
| }
|
|
|
|
|
| #bottom-links {
|
| display: flex;
|
| justify-content: center;
|
| gap: 20px;
|
| margin-top: 20px;
|
| }
|
|
|
| .bottom-link {
|
| display: inline-flex;
|
| align-items: center;
|
| gap: 6px;
|
| font-size: 13px;
|
| font-weight: 500;
|
| color: var(--text-secondary);
|
| text-decoration: none;
|
| transition: color 0.15s;
|
| }
|
|
|
| .bottom-link:hover {
|
| color: var(--accent);
|
| }
|
|
|
|
|
| #conversation {
|
| display: flex;
|
| flex-direction: column;
|
| width: 100%;
|
| max-width: 780px;
|
| height: 100%;
|
| padding: 60px 20px 0;
|
| }
|
|
|
| #conversation.hidden {
|
| display: none;
|
| }
|
|
|
| #messages {
|
| flex: 1;
|
| overflow-y: auto;
|
| padding: 20px 0;
|
| display: flex;
|
| flex-direction: column;
|
| gap: 14px;
|
| }
|
|
|
| .msg {
|
| max-width: 85%;
|
| padding: 12px 16px;
|
| border-radius: 18px;
|
| font-size: 14px;
|
| line-height: 1.55;
|
| animation: msgIn 0.2s ease-out;
|
| }
|
|
|
| @keyframes msgIn {
|
| from {
|
| opacity: 0;
|
| transform: translateY(4px);
|
| }
|
|
|
| to {
|
| opacity: 1;
|
| transform: translateY(0);
|
| }
|
| }
|
|
|
| .msg-label {
|
| font-size: 10px;
|
| font-weight: 600;
|
| text-transform: uppercase;
|
| letter-spacing: 0.5px;
|
| margin-bottom: 4px;
|
| }
|
|
|
| .msg-body {
|
| word-wrap: break-word;
|
| white-space: pre-wrap;
|
| }
|
|
|
| .msg-user {
|
| align-self: flex-end;
|
| background: var(--accent);
|
| color: #fff;
|
| border-bottom-right-radius: 4px;
|
| }
|
|
|
| .msg-user .msg-label {
|
| color: rgba(255, 255, 255, 0.6);
|
| }
|
|
|
| .msg-agent {
|
| align-self: flex-start;
|
| background: var(--bg-card);
|
| border: 1px solid var(--border-light);
|
| border-bottom-left-radius: 4px;
|
| }
|
|
|
| .msg-agent .msg-label {
|
| color: var(--text-muted);
|
| }
|
|
|
| .msg-system {
|
| align-self: center;
|
| text-align: center;
|
| font-size: 12px;
|
| color: var(--text-muted);
|
| padding: 6px 14px;
|
| background: var(--accent-light);
|
| border-radius: var(--radius-pill);
|
| }
|
|
|
| .msg-tool {
|
| align-self: flex-start;
|
| background: var(--accent-light);
|
| border: 1px solid rgba(26, 115, 232, 0.15);
|
| border-bottom-left-radius: 4px;
|
| }
|
|
|
| .msg-tool .msg-label {
|
| color: var(--accent);
|
| }
|
|
|
| .msg-error {
|
| align-self: flex-start;
|
| background: #fce8e6;
|
| border: 1px solid rgba(234, 67, 53, 0.15);
|
| }
|
|
|
| .msg-error .msg-label {
|
| color: var(--error);
|
| }
|
|
|
|
|
| #conv-input-bar {
|
| display: flex;
|
| align-items: center;
|
| gap: 8px;
|
| padding: 12px 0 20px;
|
| border-top: 1px solid var(--border-light);
|
| background: transparent;
|
| }
|
|
|
| #conv-input {
|
| flex: 1;
|
| padding: 12px 18px;
|
| border: 1.5px solid var(--border);
|
| border-radius: var(--radius-pill);
|
| font-family: var(--font);
|
| font-size: 14px;
|
| transition: border-color 0.15s, box-shadow 0.15s;
|
| }
|
|
|
| #conv-input:focus {
|
| border-color: var(--border-focus);
|
| box-shadow: 0 0 0 3px var(--accent-surface);
|
| outline: none;
|
| }
|
|
|
|
|
| #output-area {
|
| background: var(--bg-card);
|
| border: 1px solid var(--border-light);
|
| border-radius: var(--radius-md);
|
| margin-bottom: 10px;
|
| max-height: 300px;
|
| overflow: hidden;
|
| display: flex;
|
| flex-direction: column;
|
| box-shadow: var(--shadow);
|
| }
|
|
|
| #output-area.hidden {
|
| display: none;
|
| }
|
|
|
| #output-header {
|
| display: flex;
|
| justify-content: space-between;
|
| align-items: center;
|
| padding: 8px 14px;
|
| border-bottom: 1px solid var(--border-light);
|
| font-size: 12px;
|
| font-weight: 600;
|
| color: var(--text-secondary);
|
| }
|
|
|
| #close-output {
|
| background: none;
|
| border: none;
|
| font-size: 16px;
|
| color: var(--text-muted);
|
| cursor: pointer;
|
| }
|
|
|
| #output-content {
|
| flex: 1;
|
| overflow-y: auto;
|
| padding: 10px 14px;
|
| font-family: var(--font-mono);
|
| font-size: 12px;
|
| line-height: 1.6;
|
| color: var(--text-secondary);
|
| white-space: pre-wrap;
|
| }
|
|
|
| .progress-line {
|
| color: var(--text-muted);
|
| padding: 1px 0;
|
| }
|
|
|
| .progress-line::before {
|
| content: '> ';
|
| color: var(--accent);
|
| }
|
|
|
| .transcript-preview {
|
| max-height: 200px;
|
| overflow-y: auto;
|
| padding: 8px;
|
| background: var(--bg-output);
|
| border-radius: var(--radius-sm);
|
| margin-top: 6px;
|
| border: 1px solid var(--border-light);
|
| }
|
|
|
| .download-link {
|
| display: inline-flex;
|
| align-items: center;
|
| gap: 6px;
|
| margin-top: 8px;
|
| padding: 6px 14px;
|
| font-family: var(--font);
|
| font-size: 12px;
|
| font-weight: 600;
|
| color: #fff;
|
| background: var(--accent);
|
| border: none;
|
| border-radius: var(--radius-sm);
|
| cursor: pointer;
|
| text-decoration: none;
|
| transition: background 0.15s;
|
| }
|
|
|
| .download-link:hover {
|
| background: #1557b0;
|
| }
|
|
|
|
|
| .spinner {
|
| display: inline-block;
|
| width: 12px;
|
| height: 12px;
|
| border: 2px solid var(--border);
|
| border-top-color: var(--accent);
|
| border-radius: 50%;
|
| animation: spin 0.6s linear infinite;
|
| margin-right: 4px;
|
| vertical-align: middle;
|
| }
|
|
|
| @keyframes spin {
|
| to {
|
| transform: rotate(360deg);
|
| }
|
| }
|
|
|
|
|
| .settings-btn {
|
| display: flex;
|
| align-items: center;
|
| justify-content: center;
|
| width: 30px;
|
| height: 30px;
|
| border: none;
|
| border-radius: var(--radius-sm);
|
| background: transparent;
|
| color: var(--text-muted);
|
| cursor: pointer;
|
| transition: all 0.12s;
|
| margin-left: 4px;
|
| }
|
|
|
| .settings-btn:hover {
|
| background: var(--bg-hover);
|
| color: var(--text-secondary);
|
| }
|
|
|
| #settings-panel {
|
| position: absolute;
|
| inset: 0;
|
| z-index: 50;
|
| display: flex;
|
| align-items: center;
|
| justify-content: center;
|
| background: rgba(0, 0, 0, 0.15);
|
| backdrop-filter: blur(2px);
|
| animation: fadeIn 0.15s ease-out;
|
| }
|
|
|
| #settings-panel.hidden {
|
| display: none;
|
| }
|
|
|
| @keyframes fadeIn {
|
| from {
|
| opacity: 0;
|
| }
|
|
|
| to {
|
| opacity: 1;
|
| }
|
| }
|
|
|
| .settings-card {
|
| width: 100%;
|
| max-width: 480px;
|
| background: var(--bg-card);
|
| border: 1px solid var(--border-light);
|
| border-radius: 16px;
|
| box-shadow: var(--shadow-lg);
|
| overflow: hidden;
|
| }
|
|
|
| .settings-header {
|
| display: flex;
|
| align-items: center;
|
| justify-content: space-between;
|
| padding: 16px 20px;
|
| border-bottom: 1px solid var(--border-light);
|
| }
|
|
|
| .settings-header h2 {
|
| font-size: 15px;
|
| font-weight: 600;
|
| }
|
|
|
| .settings-header button {
|
| background: none;
|
| border: none;
|
| font-size: 20px;
|
| color: var(--text-muted);
|
| cursor: pointer;
|
| }
|
|
|
| .settings-header button:hover {
|
| color: var(--text);
|
| }
|
|
|
| .settings-body {
|
| padding: 20px;
|
| }
|
|
|
| .settings-label {
|
| display: block;
|
| font-size: 12px;
|
| font-weight: 600;
|
| color: var(--text-secondary);
|
| margin-bottom: 6px;
|
| }
|
|
|
| .settings-input-row {
|
| display: flex;
|
| gap: 8px;
|
| }
|
|
|
| .settings-input-row input {
|
| flex: 1;
|
| padding: 9px 14px;
|
| border: 1.5px solid var(--border);
|
| border-radius: var(--radius-sm);
|
| font-family: var(--font-mono);
|
| font-size: 12px;
|
| color: var(--text);
|
| background: var(--bg);
|
| outline: none;
|
| transition: border-color 0.15s;
|
| }
|
|
|
| .settings-input-row input:focus {
|
| border-color: var(--accent);
|
| }
|
|
|
| .settings-hint {
|
| font-size: 11px;
|
| color: var(--text-muted);
|
| margin-top: 4px;
|
| }
|
|
|
| .settings-divider {
|
| height: 1px;
|
| background: var(--border-light);
|
| margin: 16px 0;
|
| }
|
|
|
| .detection-box {
|
| display: flex;
|
| align-items: center;
|
| gap: 8px;
|
| padding: 10px 14px;
|
| background: var(--bg);
|
| border: 1px solid var(--border-light);
|
| border-radius: var(--radius-sm);
|
| font-size: 13px;
|
| }
|
|
|
| .detect-dot {
|
| width: 8px;
|
| height: 8px;
|
| border-radius: 50%;
|
| background: var(--text-muted);
|
| flex-shrink: 0;
|
| }
|
|
|
| .detect-dot.found {
|
| background: var(--success);
|
| }
|
|
|
| .detect-dot.missing {
|
| background: var(--error);
|
| }
|
|
|
| .detect-details {
|
| font-family: var(--font-mono);
|
| font-size: 11px;
|
| color: var(--text-muted);
|
| margin-top: 6px;
|
| line-height: 1.5;
|
| }
|
|
|
| .settings-actions {
|
| display: flex;
|
| gap: 8px;
|
| margin-top: 4px;
|
| }
|
|
|
| .btn-primary {
|
| padding: 8px 18px;
|
| font-family: var(--font);
|
| font-size: 13px;
|
| font-weight: 600;
|
| color: #fff;
|
| background: var(--accent);
|
| border: none;
|
| border-radius: var(--radius-sm);
|
| cursor: pointer;
|
| transition: background 0.15s;
|
| }
|
|
|
| .btn-primary:hover {
|
| background: #1557b0;
|
| }
|
|
|
| .btn-primary:disabled {
|
| opacity: 0.5;
|
| cursor: not-allowed;
|
| }
|
|
|
| .btn-outline {
|
| padding: 8px 18px;
|
| font-family: var(--font);
|
| font-size: 13px;
|
| font-weight: 500;
|
| color: var(--text-secondary);
|
| background: var(--bg-card);
|
| border: 1px solid var(--border);
|
| border-radius: var(--radius-sm);
|
| cursor: pointer;
|
| transition: all 0.15s;
|
| }
|
|
|
| .btn-outline:hover {
|
| border-color: var(--text-muted);
|
| }
|
|
|
| .btn-outline:disabled {
|
| opacity: 0.5;
|
| cursor: not-allowed;
|
| }
|
|
|
| .btn-danger {
|
| color: var(--error);
|
| border-color: rgba(234, 67, 53, 0.3);
|
| }
|
|
|
| .btn-danger:hover {
|
| border-color: var(--error);
|
| background: #fce8e6;
|
| }
|
|
|
|
|
| @media (max-width: 640px) {
|
| #center-card {
|
| margin: 0 12px;
|
| padding: 28px 20px 22px;
|
| }
|
|
|
| #greeting {
|
| font-size: 18px;
|
| }
|
|
|
| #tool-rail {
|
| padding: 12px 6px;
|
| }
|
|
|
| .rail-btn {
|
| width: 32px;
|
| height: 32px;
|
| font-size: 11px;
|
| }
|
| } |