Files
qwen-code/packages/vscode-ide-companion/src/webview/styles/tailwind.css
yiliang114 54fd63f04b fix(vscode-ide-companion): optimize stream termination handling and fix style layering issues
Unify stream termination using the `sendStreamEnd` method to avoid duplicate code.
Add stream termination reason identification and handling for timeout and session expiration scenarios.
Centralize cleanup logic for various stream termination states in the WebView message hooks.
Adjust Tailwind CSS styles to resolve component layering display issues.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-15 22:41:38 +08:00

195 lines
5.7 KiB
CSS

/**
* @license
* Copyright 2025 Qwen Team
* SPDX-License-Identifier: Apache-2.0
*/
@tailwind base;
@tailwind components;
@tailwind utilities;
/* ===========================
Reusable Component Classes
=========================== */
@layer components {
.btn-ghost {
@apply bg-transparent border border-transparent rounded cursor-pointer outline-none transition-colors duration-200;
color: var(--app-primary-foreground);
font-size: var(--vscode-chat-font-size, 13px);
border-radius: 4px;
}
.btn-ghost:hover,
.btn-ghost:focus {
background: var(--app-ghost-button-hover-background);
}
.btn-sm {
@apply p-small;
}
.btn-md {
@apply py-small px-medium;
}
.icon-sm {
@apply w-4 h-4;
}
/* Composer: root container anchored to bottom*/
.composer-root {
@apply absolute bottom-4 left-4 right-4 flex flex-col z-20;
}
/* Composer: form wrapper */
.composer-form {
@apply relative flex flex-col max-w-[680px] mx-auto rounded-large border shadow-sm transition-colors duration-200 z-[1];
background: var(--app-input-secondary-background);
border-color: var(--app-input-border);
color: var(--app-input-foreground);
}
.composer-form:focus-within {
/* match existing highlight behavior */
border-color: var(--app-input-highlight);
box-shadow: 0 1px 2px color-mix(in srgb, var(--app-input-highlight), transparent 80%);
}
/* Composer: input editable area */
.composer-input {
/* Use plain CSS for font-family inheritance; Tailwind has no `font-inherit` utility */
@apply flex-1 self-stretch py-2.5 px-3.5 outline-none overflow-y-auto relative select-text min-h-[1.5em] max-h-[200px] bg-transparent border-0 rounded-none overflow-x-hidden break-words whitespace-pre-wrap;
font-family: inherit;
font-size: var(--vscode-chat-font-size, 13px);
color: var(--app-input-foreground);
}
/* Show placeholder when truly empty OR when flagged as empty via data attribute.
The data attribute is needed because some browsers insert a <br> in
contentEditable, which breaks :empty matching. */
.composer-input:empty:before,
.composer-input[data-empty="true"]::before {
content: attr(data-placeholder);
color: var(--app-input-placeholder-foreground);
pointer-events: none;
position: absolute;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: calc(100% - 28px);
}
.composer-input:focus {
outline: none;
}
.composer-input:disabled,
.composer-input[contenteditable="false"] {
color: #999;
cursor: not-allowed;
}
/* Composer: actions row (more compact) */
.composer-actions {
@apply flex items-center gap-1 min-w-0 z-[1];
padding: 5px;
color: var(--app-secondary-foreground);
border-top: 0.5px solid var(--app-input-border);
}
/* Text button (icon + label) */
.btn-text-compact {
@apply inline-flex items-center gap-1 px-1 py-0.5 rounded-[2px] cursor-pointer appearance-none bg-transparent border-0 min-w-0 shrink text-[0.85em] transition-colors duration-150;
color: var(--app-secondary-foreground);
}
.btn-text-compact--primary {
color: var(--app-secondary-foreground);
/* color: var(--app-primary-foreground); */
}
.btn-text-compact:hover {
background-color: var(--app-ghost-button-hover-background);
}
.btn-text-compact:active:not(:disabled) {
filter: brightness(1.1);
}
.btn-text-compact > svg {
height: 1em;
width: 1em;
flex-shrink: 0;
}
.btn-text-compact > span {
display: inline-block;
min-width: 0;
max-width: 200px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
vertical-align: middle;
}
@media screen and (max-width: 300px) {
.btn-text-compact > svg {
display: none;
}
}
/* Icon-only button, compact square (26x26) */
.btn-icon-compact {
@apply inline-flex items-center justify-center w-[26px] h-[26px] p-0 rounded-small bg-transparent border border-transparent cursor-pointer shrink-0 transition-all duration-150;
color: var(--app-secondary-foreground);
}
.btn-icon-compact:hover {
background-color: var(--app-ghost-button-hover-background);
}
.btn-icon-compact > svg {
@apply w-4 h-4;
}
/* Active/primary state for icon button (e.g., Thinking on) */
.btn-icon-compact--active {
background-color: var(--app-qwen-clay-button-orange);
color: var(--app-qwen-ivory);
}
.btn-icon-compact--active > svg {
stroke: var(--app-qwen-ivory);
fill: var(--app-qwen-ivory);
}
.composer-overlay {
@apply absolute inset-0 rounded-large z-0;
background: var(--app-input-background);
}
/* Optional: send button variant */
.btn-send-compact {
@apply btn-icon-compact ml-auto hover:brightness-110 disabled:opacity-40 disabled:cursor-not-allowed;
background-color: var(--app-qwen-clay-button-orange);
color: var(--app-qwen-ivory);
}
/*
* File path styling inside tool call content
* Applies to: .toolcall-content-wrapper .file-link-path
* - Use monospace editor font
* - Slightly smaller size
* - Link color
* - Tighten top alignment and allow aggressive breaking for long paths
*/
.toolcall-content-wrapper .file-link-path {
/* Tailwind utilities where possible */
@apply text-[0.85em] pt-px break-all min-w-0;
/* Not covered by Tailwind defaults: use CSS vars / properties */
font-family: var(--app-monospace-font-family);
color: var(--app-link-color);
overflow-wrap: anywhere;
}
}
/* ===========================
Utilities
=========================== */
@layer utilities {
/* Multi-line clamp with ellipsis (Chromium-based webview supported) */
.q-line-clamp-3 {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
}
}