llm-agent-plugin/src/css/styles.css
2025-09-29 12:54:38 +03:00

855 lines
25 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* src/styles.css или куда ты добавляешь стили */
/* CSS переменные, чтобы создать атмосферу Шира из "Властелина колец" */
:root {
/* Общие стили узлов графа */
--node-padding: 10px;
--node-border-radius: 5px;
--node-font-size: 14px;
--node-font-weight: bold;
--node-text-align: center;
/* Переменные для текста */
--font-text-size: 14px;
--font-monospace: 'Roboto Mono', monospace;
--border-color-light: #d3cbbd; /* Светлая граница, землистая */
--border-color-dark: #a99b87; /* Темная граница, землистая */
--background-modifier-form-field: #f5efe1; /* Светлый земляной фон для полей */
--background-modifier-form-field-highlighted: #e4dccf; /* Немного темнее для выделенных полей */
--node-text-color: var(
--text-normal
); /* Используем общую переменную для текста узлов */
}
/* Определение для светлой темы */
.theme-light {
/* Цвета для кнопок и интерактивных элементов (светлая тема) */
--button-primary-background: #5a8f6a; /* Насыщенный ширский зеленый для кнопок */
--button-primary-hover-background: #4a7a5c; /* Темнее для наведения */
--button-primary-text-color: #ffffff; /* Белый текст */
--button-secondary-background: #d9d1bf; /* Светлый землистый для второстепенных кнопок */
--button-secondary-hover-background: #c4bda9; /* Темнее для наведения */
--button-secondary-text-color: #333333; /* Темный текст для второстепенных */
/* Цвета сообщений чата */
--llm-user-border-color: #79a07e; /* Ширский зеленый */
--llm-user-background-color: #e6f2e6; /* Очень светлый ширский зеленый */
--llm-llm-border-color: #b2a27e; /* Нейтральный, землистый оттенок */
--llm-llm-background-color: #f8f3e9; /* Светлый кремовый */
--llm-tool-border-color: #b08d57; /* Древесный коричневый */
--llm-tool-background-color: #fdf4e3; /* Светлый песочный */
--llm-error-border-color: #c25b5b; /* Приглушенный красный */
--llm-error-background-color: #f7e0e0; /* Светлый приглушенный красный */
--llm-assistant-border-color: #9c9c8f; /* Серый камень */
--llm-assistant-background-color: #ecece4; /* Светло-серый, землистый */
/* Переменные для текста (светлая тема) */
--text-normal: #333;
--text-muted: #666;
--background-secondary-alt: #f0f0f0;
--text-accent: #007bff;
}
/* Определение для тёмной темы */
.theme-dark {
/* Цвета для кнопок и интерактивных элементов (темная тема) */
--button-primary-background: #4a7a5c; /* Более глубокий зеленый для темной темы */
--button-primary-hover-background: #3a6a4c;
--button-primary-text-color: #ffffff;
--button-secondary-background: #a99d8b; /* Более темный землистый */
--button-secondary-hover-background: #948d7b;
--button-secondary-text-color: #f0f0f0;
/* Переменные для темной темы, сохраняющие "ширскую" атмосферу */
--llm-user-border-color: #5a8f6a; /* Темнее зеленый */
--llm-user-background-color: #2b3a2d; /* Глубокий зеленый фон */
--llm-llm-border-color: #8c7e60; /* Темный землистый */
--llm-llm-background-color: #3a3227; /* Темный кремовый/коричневый */
--llm-tool-border-color: #806842; /* Темный древесный коричневый */
--llm-tool-background-color: #3b2c1c; /* Глубокий песочный/коричневый */
--llm-error-border-color: #9c4b4b; /* Более глубокий красный */
--llm-error-background-color: #4a2d2d; /* Темный приглушенный красный */
--llm-assistant-border-color: #7c7c70; /* Темный серый камень */
--llm-assistant-background-color: #3a3a35; /* Глубокий серо-землистый */
/* Переменные для текста (темная тема) */
--text-normal: #f0f0f0; /* Светлый текст */
--text-muted: #b0b0b0; /* Светлый приглушенный текст */
--background-secondary-alt: #2a2a2a; /* Темный фон */
--text-accent: #6aa84f; /* Более приглушенный зеленый акцент */
}
.llm-agent-chat-panel .message-type-user {
border: 1px solid var(--llm-user-border-color); /* Цвет для user */
background-color: var(
--llm-user-background-color
); /* Светло-голубой фон для user */
}
.llm-agent-chat-panel .message-type-llm {
border: 1px solid var(--llm-llm-border-color); /* Цвет для llm */
background-color: var(
--llm-llm-background-color
); /* Светло-зеленый фон для llm */
}
.llm-agent-chat-panel .message-type-tool {
border: 1px solid var(--llm-tool-border-color); /* Цвет для tool */
background-color: var(
--llm-tool-background-color
); /* Светло-оранжевый фон для tool */
}
.llm-agent-chat-panel .message-type-error {
border: 1px solid var(--llm-error-border-color); /* Красный цвет для error */
background-color: var(
--llm-error-background-color
); /* Светло-красный фон для error */
}
.llm-agent-chat-panel .message-type-assistant {
border: 1px solid var(--llm-assistant-border-color); /* Цвет для assistant */
background-color: var(
--llm-assistant-background-color
); /* Светло-серый фон для assistant */
}
/* Общие стили для сообщений */
.llm-agent-chat-panel .message {
margin-bottom: 10px;
display: flex; /* Flex-контейнер для всего сообщения */
flex-direction: column; /* Элементы внутри сообщения будут выстраиваться вертикально */
padding: 10px; /* Общие отступы для всего сообщения */
border-radius: 5px;
max-width: 80%; /* Ограничение ширины сообщения */
word-break: break-word; /* Разбиение слов для длинных сообщений */
overflow-wrap: break-word; /* Перенос слов */
}
.llm-agent-chat-panel .message.user {
margin-left: auto; /* Выравнивание по правому краю для пользователя */
}
.llm-agent-chat-panel .message.assistant {
margin-right: auto; /* Выравнивание по левому краю для ассистента, если потребуется */
}
.chat-meta {
margin-bottom: 5px; /* Отступ между мета-информацией и содержимым */
}
.chat-sender-info {
display: flex; /* Делаем sender-info flex-контейнером */
align-items: center; /* Выравнивание иконки и текста по центру */
gap: 8px; /* Расстояние между иконкой и текстом */
}
.chat-message-icon svg {
width: 20px; /* Размер иконки */
height: 20px;
flex-shrink: 0; /* Предотвращает сжатие иконки */
}
.chat-role-label {
font-weight: bold;
font-size: 0.9em;
color: var(--text-muted);
}
.chat-message-content {
font-size: var(--font-text-size);
line-height: 1.5;
color: var(--text-normal);
user-select: text; /* Разрешить выделение текста внутри содержимого */
}
/* Стили для узлов графа */
.react-flow__node-default,
.react-flow__node-user,
.react-flow__node-llm,
.react-flow__node-tool,
.react-flow__node-error,
.react-flow__node-assistant {
padding: var(--node-padding);
border-radius: var(--node-border-radius);
text-align: var(--node-text-align);
font-size: var(--node-font-size);
font-weight: var(--node-font-weight);
color: var(--node-text-color);
}
.react-flow__node-user {
border: 1px solid var(--llm-user-border-color); /* Цвет для user */
background-color: var(
--llm-user-background-color
); /* Светло-голубой фон для user */
}
.react-flow__node-llm {
border: 1px solid var(--llm-llm-border-color); /* Цвет для llm */
background-color: var(
--llm-llm-background-color
); /* Светло-зеленый фон для llm */
}
.react-flow__node-tool {
border: 1px solid var(--llm-tool-border-color); /* Цвет для tool */
background-color: var(
--llm-tool-background-color
); /* Светло-оранжевый фон для tool */
}
.react-flow__node-error {
border: 1px solid var(--llm-error-border-color); /* Красный цвет для error */
background-color: var(
--llm-error-background-color
); /* Светло-красный фон для error */
}
.react-flow__node-assistant {
border: 1px solid var(--llm-assistant-border-color); /* Нейтральный серый для ассистента */
background-color: var(--llm-assistant-background-color); /* Светло-серый фон */
}
/* Компактные стили для узлов React Flow */
.react-flow__node {
font-size: 12px !important;
padding: 4px 8px !important;
min-width: 100px !important;
max-width: 130px !important;
min-height: 30px !important;
border-radius: 6px !important;
}
.react-flow__node-default {
width: auto !important;
height: auto !important;
}
/* ----------------------------------------------- Chat Panel Styles -------------------------------------------------------- */
.llm-agent-chat-panel {
display: flex;
flex-direction: column;
height: 100%;
}
.chat-history {
flex-grow: 1;
overflow-y: auto;
padding: 10px;
-webkit-user-select: text; /* Разрешить выделение для WebKit-браузеров */
-moz-user-select: text; /* Разрешить выделение для Firefox */
user-select: text; /* Стандартное свойство для выделения текста */
scroll-behavior: smooth;
}
/* Стили для inline-кода в сообщениях */
.chat-message-content code {
background-color: var(--background-secondary-alt);
border-radius: 4px;
padding: 2px 4px;
font-family: var(--font-monospace);
font-size: 0.9em;
color: var(--text-accent);
}
/* Стиль для форм ввода чата */
.chat-input-form {
display: flex;
padding: 10px;
border-top: 1px solid #eee;
gap: 10px;
}
.command-input {
position: relative;
flex-grow: 1;
}
#message-input {
width: 100%;
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
scroll-margin-bottom: 30px; /* Добавляет отступ в 20px снизу при прокрутке к этому элементу */
}
.submit-button {
padding: 4px 8px; /* Восстанавливаем паддинг */
border: none; /* Убираем рамку */
border-radius: 8px;
cursor: pointer;
font-size: 11px;
transition: all 0.2s;
/* Явно переопределяем стили, которые могли быть затронуты */
width: auto; /* Убедимся, что ширина не ограничена */
height: auto; /* Убедимся, что высота не ограничена */
background-color: var(
--button-primary-background
) !important; /* Используем переменную для основного цвета кнопки */
color: var(
--button-primary-text-color
) !important; /* Используем переменную для цвета текста кнопки */
opacity: 1; /* Если .clickable-icon устанавливает opacity */
display: inline-flex; /* Или flex, если нужно выравнивание элементов внутри */
align-items: center; /* Для вертикального выравнивания контента, если display: flex */
justify-content: center; /* Для горизонтального выравнивания контента, если display: flex */
}
#send-button:hover {
background-color: var(
--button-primary-hover-background
) !important; /* Переменная для наведения */
}
/* Добавляем стили для нового интерфейса ввода */
.chat-input-container {
border-top: 1px solid var(--background-modifier-border);
padding: 8px 10px 4px 10px;
position: relative;
}
.scroll-container {
overflow-y: auto;
scrollbar-width: thin;
max-height: 70vh;
margin-bottom: 8px;
}
/*.message-input-editor {
outline: none;
font-size: 14px;
line-height: 1.4;
min-height: 20px;
padding: 8px 0;
color: var(--text-normal);
position: relative;
}*/
.message-input-editor {
min-height: 20px;
max-height: 200px;
overflow-y: auto;
word-wrap: break-word;
white-space: pre-wrap;
}
.message-input-editor.is-empty::before {
content: attr(data-placeholder);
color: var(--text-muted);
position: absolute;
pointer-events: none;
}
.message-input-editor[data-placeholder]::before {
content: attr(data-placeholder);
color: var(--text-muted);
position: absolute;
pointer-events: none;
opacity: 0.6;
}
.message-input-editor.is-empty[data-placeholder]::before {
display: block;
}
.message-input-editor:not(.is-empty)[data-placeholder]::before,
.message-input-editor:focus[data-placeholder]::before {
display: none;
}
.message-input-editor .reference-box {
display: inline-flex !important;
vertical-align: middle;
margin: 0 1px;
}
.message-input-editor .reference-box:focus {
outline: 2px solid var(--interactive-accent);
outline-offset: 1px;
}
.chat-controls {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 12px;
color: var(--text-muted);
}
.control-buttons-left {
display: flex;
align-items: center;
gap: 8px;
}
.control-buttons-right {
display: flex;
align-items: center;
gap: 8px;
}
.model-select-container {
position: relative;
}
.model-select-button {
display: flex;
align-items: center;
gap: 4px;
padding: 4px 8px;
border: none;
border-radius: 8px;
background-color: var(
--button-secondary-background
); /* Используем переменную для второстепенных кнопок */
color: var(
--button-secondary-text-color
); /* Используем переменную для текста второстепенных кнопок */
cursor: pointer;
font-size: 11px;
transition: all 0.2s;
}
.model-select-button:hover {
background-color: var(
--button-secondary-hover-background
); /* Используем переменную для наведения второстепенных кнопок */
filter: brightness(1.1); /* Можно оставить или скорректировать под тему */
}
.model-name {
max-width: 120px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.dropdown-icon {
width: 12px;
height: 12px;
flex-shrink: 0;
}
.model-dropdown {
position: absolute;
/* Убираем жесткое bottom: 100%; т.к. позиционирование будет задаваться в JS */
/* bottom: 100%; */
left: 0;
/* right: 0; */ /* Это может привести к растягиванию, лучше оставить auto или задать ширину */
width: max-content; /* Чтобы дропдаун не растягивался на всю ширину родителя */
min-width: 150px; /* Минимальная ширина */
background-color: var(
--background-primary
); /* Предполагается, что --background-primary есть и подходит */
border: 1px solid var(--border-color-dark); /* Используем новую переменную для границы */
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); /* Можно скорректировать тень в соответствии с темой */
z-index: 1000;
/* margin-bottom: 4px; */ /* Это будет задавать JS через top/bottom */
max-height: 200px;
overflow-y: auto;
}
.model-option {
padding: 8px 12px;
cursor: pointer;
font-size: 11px;
color: var(--text-normal);
transition: background-color 0.2s;
}
.model-option:hover {
}
.model-option.selected {
background-color: var(
--background-modifier-selected
); /* Или другой подходящий цвет */
color: var(--text-highlighted); /* Или другой подходящий цвет */
}
.model-option:first-child {
border-radius: 8px 8px 0 0;
}
.model-option:last-child {
border-radius: 0 0 8px 8px;
}
.submit-button {
padding: 4px 8px;
border: none;
border-radius: 8px;
cursor: pointer;
font-size: 11px;
transition: all 0.2s;
}
.submit-button:hover:enabled {
filter: brightness(1.25);
}
.submit-button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.submit-text {
font-family: system-ui, -apple-system, sans-serif;
}
/* Обновляем стили для suggestions */
.suggestions {
position: absolute;
bottom: 100%;
left: 0;
right: 0;
background-color: var(
--background-primary
); /* Предполагается, что --background-primary есть и подходит */
border: 1px solid var(--border-color-dark); /* Используем новую переменную для границы */
border-radius: 8px;
max-height: 150px;
overflow-y: auto;
z-index: 100;
margin-bottom: 4px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); /* Можно скорректировать тень в соответствии с темой */
}
.suggestion-item {
padding: 8px 12px;
cursor: pointer;
font-size: 12px;
color: var(--text-normal);
transition: background-color 0.2s;
}
.suggestion-item:hover {
}
.suggestion-item.selected {
background-color: var(--background-modifier-selected);
color: var(--text-highlighted);
}
/* Удаляем старые стили для chat-input-form и message-input */
.chat-input-form {
display: none;
}
#message-input {
display: none;
}
/* ----------------------------------------------- History Panel Styles --------------------------------------------------- */
.llm-agent-history-sidebar {
border-right: 1px solid var(--background-modifier-border);
overflow-y: auto;
background-color: var(--background-secondary);
transition: width 0.3s ease, min-width 0.3s ease, border-right 0.3s ease;
min-width: 0;
}
.llm-agent-history-sidebar.expanded {
width: 200px;
min-width: 200px;
}
.llm-agent-history-sidebar.collapsed {
width: 0;
min-width: 0;
border-right: none;
overflow: hidden;
}
/* Стили для заголовков графов в панели истории */
.graph-title-generated {
color: var(--text-normal);
}
.graph-title-pending {
color: var(--text-muted);
}
/* ----------------------------------------------- Toggle Button Styles --------------------------------------------------- */
.history-toggle-button {
position: absolute;
top: 10px;
left: 10px;
z-index: 9999; /* Увеличиваем z-index, чтобы быть выше React Flow */
width: 32px;
height: 32px;
border: none;
border-radius: 6px;
background-color: var(--background-primary);
border: 1px solid var(--border-color-light);
cursor: pointer;
font-size: 16px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
transition: all 0.2s ease;
}
.history-toggle-button:hover {
background-color: var(--background-modifier-hover);
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
transform: translateY(-1px);
}
/* ----------------------------------------------- Graph Container Styles -------------------------------------------------- */
.llm-agent-graph-container {
flex: 1;
position: relative;
background-color: var(--background-primary);
}
/* ----------------------------------------------- Reference System Styles --------------------------------------------------- */
/* Reference Boxes */
.reference-box {
display: inline-flex;
align-items: center;
padding: 2px 6px;
border-radius: 4px;
font-size: 11px;
margin: 0 2px;
cursor: pointer;
user-select: none;
vertical-align: middle;
transition: all 0.2s ease;
}
.reference-box:hover {
opacity: 0.8;
transform: translateY(-1px);
}
.reference-box-icon {
width: 12px;
height: 12px;
margin-right: 4px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
}
.reference-box-name {
font-weight: 500;
white-space: nowrap;
}
/* Файлы - одинарная ссылка @ */
.reference-box.file.single {
background: rgba(100, 150, 255, 0.1);
border: 1px solid rgba(100, 150, 255, 0.3);
color: var(--text-normal);
}
/* Файлы - постоянная ссылка @@ */
.reference-box.file.permanent {
background: rgba(100, 150, 255, 0.2);
border: 1px solid rgba(100, 150, 255, 0.6);
color: var(--text-normal);
font-weight: 600;
}
.reference-box.file.permanent .reference-box-name {
font-weight: 600;
}
/* Перебиваем стиль Obsidian для prompt*/
.reference-box.prompt {
display: inline-flex;
flex-direction: row;
box-shadow: var(--shadow-l);
z-index: auto;
position: static;
top: auto;
width: auto;
max-width: none;
max-height: none;
overflow: hidden;
}
/* Промпты - одинарная ссылка # */
.reference-box.prompt.single {
background: rgba(255, 150, 100, 0.1);
border: 1px solid rgba(255, 150, 100, 0.3);
color: var(--text-normal);
}
/* Промпты - постоянная ссылка ## */
.reference-box.prompt.permanent {
background: rgba(238, 122, 69, 0.2);
border: 1px solid rgba(255, 150, 100, 0.6);
color: var(--text-normal);
font-weight: 600;
}
.reference-box.prompt.permanent .reference-box-name {
font-weight: 600;
}
/* Reference Autocomplete */
.reference-autocomplete {
/* 200px для 5 элементов, возможно, нужно заменить на расчёт с помощью padding и размером шрифта */
--item-height: 33px; /* высота одного элемента */
--visible-items: 10; /* количество видимых элементов */
position: absolute;
background: var(--background-primary);
border: 1px solid var(--border-color);
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
z-index: 1000;
max-height: calc(var(--item-height) * var(--visible-items));
overflow-y: auto;
min-width: 250px;
max-width: 400px;
}
.reference-option {
display: flex;
align-items: center;
padding: 8px 12px;
cursor: pointer;
font-size: 12px;
color: var(--text-normal);
transition: background-color 0.2s;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
}
.reference-option:hover,
.reference-option.selected {
background-color: var(--background-modifier-hover);
}
.reference-option:last-child {
border-bottom: none;
}
.reference-option-icon {
width: 16px;
height: 16px;
margin-right: 8px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
color: var(--text-muted);
}
.reference-option-name {
flex: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-weight: 500;
}
.reference-option-path {
font-size: 10px;
color: var(--text-muted);
margin-left: 8px;
max-width: 150px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* Темная тема */
.theme-dark .reference-autocomplete {
background: var(--background-primary);
border-color: var(--border-color);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.theme-dark .reference-option:hover,
.theme-dark .reference-option.selected {
background-color: rgba(255, 255, 255, 0.1);
}
/* Светлая тема */
.theme-light .reference-autocomplete {
background: #ffffff;
border-color: #e0e0e0;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.theme-light .reference-option:hover,
.theme-light .reference-option.selected {
background-color: rgba(0, 0, 0, 0.05);
}
/* Скроллбар для автокомплита */
.reference-autocomplete::-webkit-scrollbar {
width: 6px;
}
.reference-autocomplete::-webkit-scrollbar-track {
background: transparent;
}
.reference-autocomplete::-webkit-scrollbar-thumb {
background: var(--scrollbar-thumb-bg);
border-radius: 3px;
}
.reference-autocomplete::-webkit-scrollbar-thumb:hover {
background: var(--scrollbar-thumb-bg-hover);
}
/* ----------------------------------------------- Settings Views ------------------------------------------------------------ */
.setting-item.llm-agent-excluded-folder-item {
padding-left: 30px; /* Отступ для элементов списка */
border-left: 2px solid var(--background-modifier-border); /* Разделитель */
margin-bottom: 5px;
margin-top: 5px;
}
.setting-item.llm-agent-excluded-folder-item .setting-item-control {
display: flex;
align-items: center;
gap: 5px;
}
.setting-item.llm-agent-excluded-folder-item .setting-item-control input {
flex-grow: 1; /* Поле ввода занимает все доступное пространство */
}
/* ----------------------------------------------- Obsidian core override ------------------------------------------------------------ */
.status-bar-item {
display: none;
padding: 0;
&.plugin-editor-width-slider {
display: inline-flex;
& .editor-width-slider {
width: 80px !important;
}
& .editor-width-slider-value {
padding: 4px 3px !important;
font-size: 10px !important;
margin: 0 !important;
}
}
}