d330b94816
Swap the Send button for a Stop button while a response is streaming, letting users abort the current operation cleanly. Cancelled requests now display "Stopped." instead of an error message. Also includes two smaller fixes: preserve the original assistant text and full tool_calls array when executing write tools for follow-up context, and add 'research' to agentic modes.
528 lines
12 KiB
CSS
528 lines
12 KiB
CSS
:root {
|
||
--ollama-user-bg: var(--background-modifier-form-field);
|
||
--ollama-assistant-bg: var(--background-primary-alt);
|
||
--ollama-border: var(--background-modifier-border);
|
||
--ollama-radius: var(--radius-m);
|
||
--ollama-gap: var(--size-4-2);
|
||
--ollama-log-debug: var(--text-muted);
|
||
--ollama-log-info: var(--text-accent);
|
||
--ollama-log-warn: var(--text-warning);
|
||
--ollama-log-error: var(--text-error);
|
||
--ollama-log-bg: var(--background-primary-alt);
|
||
}
|
||
|
||
/* Root chat view layout: flex column with input locked at bottom */
|
||
.ollama-chat-view-content {
|
||
display: flex;
|
||
flex-direction: column;
|
||
height: 100%;
|
||
overflow: hidden;
|
||
}
|
||
|
||
.ollama-new-chat-container {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
justify-content: flex-start;
|
||
align-items: center;
|
||
gap: var(--size-4-1);
|
||
padding: var(--size-4-1) var(--size-4-2);
|
||
flex-shrink: 0;
|
||
}
|
||
|
||
.ollama-chat-container {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: var(--ollama-gap);
|
||
padding: var(--size-4-2);
|
||
overflow-y: auto;
|
||
flex: 1 1 auto;
|
||
min-height: 0;
|
||
user-select: text;
|
||
-webkit-user-select: text;
|
||
}
|
||
|
||
.ollama-input-container {
|
||
display: flex;
|
||
gap: var(--size-4-1);
|
||
padding: var(--size-4-2);
|
||
border-top: 1px solid var(--ollama-border);
|
||
background-color: var(--background-primary);
|
||
align-items: flex-end;
|
||
flex-shrink: 0;
|
||
}
|
||
|
||
.ollama-message {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: var(--size-4-1);
|
||
padding: var(--size-4-2);
|
||
border-radius: var(--ollama-radius);
|
||
border: 1px solid var(--ollama-border);
|
||
max-width: 90%;
|
||
user-select: text;
|
||
-webkit-user-select: text;
|
||
}
|
||
|
||
.ollama-message-user {
|
||
align-self: flex-end;
|
||
background-color: var(--ollama-user-bg);
|
||
}
|
||
|
||
.ollama-message-assistant {
|
||
align-self: flex-start;
|
||
background-color: var(--ollama-assistant-bg);
|
||
}
|
||
|
||
.ollama-message-header {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: var(--size-4-1);
|
||
font-size: var(--font-smallest);
|
||
font-weight: var(--font-semibold);
|
||
text-transform: uppercase;
|
||
letter-spacing: 0.05em;
|
||
color: var(--text-muted);
|
||
}
|
||
|
||
.ollama-message-role::before {
|
||
display: inline-block;
|
||
width: 1em;
|
||
height: 1em;
|
||
margin-right: var(--size-4-1);
|
||
vertical-align: middle;
|
||
}
|
||
|
||
.ollama-message-user .ollama-message-role::before {
|
||
content: '👤';
|
||
}
|
||
|
||
.ollama-message-assistant .ollama-message-role::before {
|
||
content: '🤖';
|
||
}
|
||
|
||
.ollama-message-content {
|
||
line-height: var(--line-height-normal);
|
||
white-space: pre-wrap;
|
||
word-break: break-word;
|
||
user-select: text;
|
||
-webkit-user-select: text;
|
||
}
|
||
|
||
.ollama-new-chat-container {
|
||
display: flex;
|
||
justify-content: flex-end;
|
||
padding: var(--size-4-1) var(--size-4-2);
|
||
}
|
||
|
||
.ollama-new-chat-button {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: var(--size-4-1);
|
||
padding: var(--size-4-1) var(--size-4-2);
|
||
font-size: var(--font-smallest);
|
||
border-radius: var(--ollama-radius);
|
||
border: 1px solid var(--ollama-border);
|
||
background-color: var(--background-modifier-form-field);
|
||
color: var(--text-normal);
|
||
cursor: pointer;
|
||
transition: background-color 0.15s ease;
|
||
}
|
||
|
||
.ollama-new-chat-button:hover {
|
||
background-color: var(--background-modifier-hover);
|
||
}
|
||
|
||
.ollama-new-chat-button::before {
|
||
content: '➕';
|
||
}
|
||
|
||
.ollama-input {
|
||
flex: 1;
|
||
min-height: 4rem;
|
||
max-height: 12rem;
|
||
padding: var(--size-4-1) var(--size-4-2);
|
||
border-radius: var(--ollama-radius);
|
||
border: 1px solid var(--ollama-border);
|
||
background-color: var(--background-modifier-form-field);
|
||
color: var(--text-normal);
|
||
resize: vertical;
|
||
font-family: inherit;
|
||
font-size: var(--font-ui-small);
|
||
line-height: var(--line-height-normal);
|
||
}
|
||
|
||
.ollama-input:focus {
|
||
outline: none;
|
||
border-color: var(--interactive-accent);
|
||
box-shadow: 0 0 0 2px var(--interactive-accent-translucent);
|
||
}
|
||
|
||
.ollama-send-button {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
padding: var(--size-4-1) var(--size-4-3);
|
||
border-radius: var(--ollama-radius);
|
||
border: none;
|
||
background-color: var(--interactive-accent);
|
||
color: var(--text-on-accent);
|
||
font-weight: var(--font-semibold);
|
||
font-size: var(--font-ui-small);
|
||
cursor: pointer;
|
||
transition: filter 0.15s ease;
|
||
white-space: nowrap;
|
||
}
|
||
|
||
.ollama-send-button:hover {
|
||
filter: brightness(1.1);
|
||
}
|
||
|
||
.ollama-send-button:active {
|
||
filter: brightness(0.95);
|
||
}
|
||
|
||
/* Stop button */
|
||
.ollama-stop-button {
|
||
display: none;
|
||
align-items: center;
|
||
justify-content: center;
|
||
padding: var(--size-4-1) var(--size-4-3);
|
||
border-radius: var(--ollama-radius);
|
||
border: none;
|
||
background-color: var(--text-error);
|
||
color: var(--text-on-accent);
|
||
font-weight: var(--font-semibold);
|
||
font-size: var(--font-ui-small);
|
||
cursor: pointer;
|
||
transition: filter 0.15s ease;
|
||
white-space: nowrap;
|
||
}
|
||
|
||
.ollama-stop-button:hover {
|
||
filter: brightness(1.1);
|
||
}
|
||
|
||
.ollama-stop-button:active {
|
||
filter: brightness(0.95);
|
||
}
|
||
|
||
/* Thinking indicator */
|
||
.ollama-thinking-indicator {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: var(--size-4-1);
|
||
font-style: italic;
|
||
color: var(--text-muted);
|
||
}
|
||
|
||
.ollama-thinking-indicator::before {
|
||
content: '';
|
||
display: inline-block;
|
||
width: 0.9em;
|
||
height: 0.9em;
|
||
border: 2px solid var(--text-muted);
|
||
border-top-color: transparent;
|
||
border-radius: 50%;
|
||
animation: ollama-spin 1s linear infinite;
|
||
}
|
||
|
||
@keyframes ollama-spin {
|
||
to {
|
||
transform: rotate(360deg);
|
||
}
|
||
}
|
||
|
||
/* Proposed Actions Preview */
|
||
.ollama-proposed-actions {
|
||
margin-top: var(--size-4-2);
|
||
padding: var(--size-4-2);
|
||
border: 1px solid var(--ollama-border);
|
||
border-radius: var(--ollama-radius);
|
||
background-color: var(--background-primary);
|
||
}
|
||
|
||
.ollama-proposed-actions-header {
|
||
font-weight: var(--font-semibold);
|
||
font-size: var(--font-ui-small);
|
||
margin-bottom: var(--size-4-2);
|
||
color: var(--text-normal);
|
||
}
|
||
|
||
.ollama-proposed-action {
|
||
margin-bottom: var(--size-4-2);
|
||
padding: var(--size-4-1);
|
||
border: 1px solid var(--ollama-border);
|
||
border-radius: var(--ollama-radius);
|
||
background-color: var(--background-primary-alt);
|
||
}
|
||
|
||
.ollama-action-description {
|
||
font-weight: var(--font-medium);
|
||
font-size: var(--font-ui-small);
|
||
margin-bottom: var(--size-4-1);
|
||
color: var(--text-normal);
|
||
}
|
||
|
||
.ollama-action-diff {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: var(--size-4-1);
|
||
}
|
||
|
||
.ollama-diff-before,
|
||
.ollama-diff-after {
|
||
margin: 0;
|
||
padding: var(--size-4-1);
|
||
border-radius: var(--ollama-radius);
|
||
font-size: var(--font-smallest);
|
||
font-family: var(--font-monospace);
|
||
white-space: pre-wrap;
|
||
word-break: break-word;
|
||
max-height: 8rem;
|
||
overflow-y: auto;
|
||
}
|
||
|
||
.ollama-diff-before {
|
||
background-color: var(--background-modifier-error);
|
||
color: var(--text-normal);
|
||
}
|
||
|
||
.ollama-diff-after {
|
||
background-color: var(--background-modifier-success);
|
||
color: var(--text-normal);
|
||
}
|
||
|
||
.ollama-action-buttons {
|
||
display: flex;
|
||
gap: var(--size-4-1);
|
||
margin-top: var(--size-4-2);
|
||
}
|
||
|
||
.ollama-apply-button {
|
||
padding: var(--size-4-1) var(--size-4-2);
|
||
border-radius: var(--ollama-radius);
|
||
border: none;
|
||
background-color: var(--interactive-accent);
|
||
color: var(--text-on-accent);
|
||
font-weight: var(--font-semibold);
|
||
font-size: var(--font-ui-small);
|
||
cursor: pointer;
|
||
transition: filter 0.15s ease;
|
||
}
|
||
|
||
.ollama-apply-button:hover {
|
||
filter: brightness(1.1);
|
||
}
|
||
|
||
.ollama-cancel-button {
|
||
padding: var(--size-4-1) var(--size-4-2);
|
||
border-radius: var(--ollama-radius);
|
||
border: 1px solid var(--ollama-border);
|
||
background-color: var(--background-modifier-form-field);
|
||
color: var(--text-normal);
|
||
font-weight: var(--font-semibold);
|
||
font-size: var(--font-ui-small);
|
||
cursor: pointer;
|
||
transition: background-color 0.15s ease;
|
||
}
|
||
|
||
.ollama-cancel-button:hover {
|
||
background-color: var(--background-modifier-hover);
|
||
}
|
||
|
||
/* Agent Mode Selector */
|
||
.ollama-mode-selector {
|
||
padding: var(--size-4-1) var(--size-4-2);
|
||
border-radius: var(--ollama-radius);
|
||
border: 1px solid var(--ollama-border);
|
||
background-color: var(--background-modifier-form-field);
|
||
color: var(--text-normal);
|
||
font-size: var(--font-ui-small);
|
||
cursor: pointer;
|
||
}
|
||
|
||
.ollama-mode-selector:focus {
|
||
outline: none;
|
||
border-color: var(--interactive-accent);
|
||
}
|
||
|
||
/* Model Selector */
|
||
.ollama-model-selector {
|
||
padding: var(--size-4-1) var(--size-4-2);
|
||
border-radius: var(--ollama-radius);
|
||
border: 1px solid var(--ollama-border);
|
||
background-color: var(--background-modifier-form-field);
|
||
color: var(--text-normal);
|
||
font-size: var(--font-ui-small);
|
||
cursor: pointer;
|
||
max-width: 10rem;
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
}
|
||
|
||
.ollama-model-selector:focus {
|
||
outline: none;
|
||
border-color: var(--interactive-accent);
|
||
}
|
||
|
||
/* Chat History Selector */
|
||
.ollama-history-selector {
|
||
padding: var(--size-4-1) var(--size-4-2);
|
||
border-radius: var(--ollama-radius);
|
||
border: 1px solid var(--ollama-border);
|
||
background-color: var(--background-modifier-form-field);
|
||
color: var(--text-normal);
|
||
font-size: var(--font-ui-small);
|
||
cursor: pointer;
|
||
max-width: 12rem;
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
}
|
||
|
||
.ollama-history-selector:focus {
|
||
outline: none;
|
||
border-color: var(--interactive-accent);
|
||
}
|
||
|
||
.ollama-history-delete-button {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: var(--size-4-1);
|
||
padding: var(--size-4-1) var(--size-4-2);
|
||
font-size: var(--font-smallest);
|
||
border-radius: var(--ollama-radius);
|
||
border: 1px solid var(--ollama-border);
|
||
background-color: var(--background-modifier-form-field);
|
||
color: var(--text-normal);
|
||
cursor: pointer;
|
||
transition: background-color 0.15s ease;
|
||
}
|
||
|
||
.ollama-history-delete-button:hover {
|
||
background-color: var(--background-modifier-error-hover);
|
||
color: var(--text-error);
|
||
}
|
||
|
||
/* Show Logs Button */
|
||
.ollama-show-logs-button {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: var(--size-4-1);
|
||
padding: var(--size-4-1) var(--size-4-2);
|
||
font-size: var(--font-smallest);
|
||
border-radius: var(--ollama-radius);
|
||
border: 1px solid var(--ollama-border);
|
||
background-color: var(--background-modifier-form-field);
|
||
color: var(--text-normal);
|
||
cursor: pointer;
|
||
transition: background-color 0.15s ease;
|
||
}
|
||
|
||
.ollama-show-logs-button:hover {
|
||
background-color: var(--background-modifier-hover);
|
||
}
|
||
|
||
/* Logs Panel */
|
||
.ollama-logs-container {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 2px;
|
||
padding: var(--size-4-1) var(--size-4-2);
|
||
max-height: 12rem;
|
||
overflow-y: auto;
|
||
background-color: var(--ollama-log-bg);
|
||
border-top: 1px solid var(--ollama-border);
|
||
border-bottom: 1px solid var(--ollama-border);
|
||
font-family: var(--font-monospace);
|
||
font-size: var(--font-smallest);
|
||
}
|
||
|
||
.ollama-log-row {
|
||
display: flex;
|
||
gap: var(--size-4-1);
|
||
align-items: baseline;
|
||
line-height: var(--line-height-tight);
|
||
}
|
||
|
||
.ollama-log-time {
|
||
color: var(--text-faint);
|
||
flex-shrink: 0;
|
||
}
|
||
|
||
.ollama-log-level {
|
||
flex-shrink: 0;
|
||
font-weight: var(--font-semibold);
|
||
text-transform: uppercase;
|
||
min-width: 3em;
|
||
}
|
||
|
||
.ollama-log-level-debug {
|
||
color: var(--ollama-log-debug);
|
||
}
|
||
|
||
.ollama-log-level-info {
|
||
color: var(--ollama-log-info);
|
||
}
|
||
|
||
.ollama-log-level-warn {
|
||
color: var(--ollama-log-warn);
|
||
}
|
||
|
||
.ollama-log-level-error {
|
||
color: var(--ollama-log-error);
|
||
}
|
||
|
||
.ollama-log-category {
|
||
color: var(--text-muted);
|
||
flex-shrink: 0;
|
||
}
|
||
|
||
.ollama-log-message {
|
||
color: var(--text-normal);
|
||
word-break: break-word;
|
||
}
|
||
|
||
/* Activity Indicator */
|
||
.ollama-activity-indicator {
|
||
display: none;
|
||
align-items: center;
|
||
gap: var(--size-4-1);
|
||
padding: var(--size-4-1) var(--size-4-1);
|
||
font-size: var(--font-ui-small);
|
||
color: var(--text-muted);
|
||
white-space: nowrap;
|
||
}
|
||
|
||
.ollama-activity-dot {
|
||
display: inline-block;
|
||
width: 0.6rem;
|
||
height: 0.6rem;
|
||
border-radius: 50%;
|
||
background-color: var(--interactive-accent);
|
||
animation: ollama-pulse 1.2s ease-in-out infinite;
|
||
flex-shrink: 0;
|
||
}
|
||
|
||
.ollama-activity-text {
|
||
font-style: italic;
|
||
}
|
||
|
||
@keyframes ollama-pulse {
|
||
0%,
|
||
100% {
|
||
opacity: 1;
|
||
transform: scale(1);
|
||
}
|
||
50% {
|
||
opacity: 0.4;
|
||
transform: scale(0.8);
|
||
}
|
||
}
|
||
|
||
/* Disabled input/send during activity */
|
||
.ollama-input:disabled,
|
||
.ollama-send-button:disabled {
|
||
opacity: 0.6;
|
||
cursor: not-allowed;
|
||
}
|