| CSS = """ |
| html, body, .gradio-container { |
| height: 100% !important; |
| margin: 0 !important; |
| } |
| |
| /* 1. Глобальный контейнер: занимаем все пространство без прокрутки страницы */ |
| .gradio-container { |
| max-width: 100% !important; |
| margin: 0 !important; |
| padding: 0 !important; |
| height: 100vh !important; |
| display: flex !important; |
| flex-direction: column !important; |
| background-color: var(--background-fill-primary) !important; |
| overflow: hidden !important; |
| } |
| |
| /* 2. Основной ряд: Sidebar + Chat |
| Сделано flex: main-row занимает оставшееся пространство и не вызывает лишнюю высоту */ |
| #main-row { |
| display: flex !important; |
| flex: 1 1 auto !important; |
| height: 100% !important; |
| margin: 0 !important; |
| gap: 0 !important; |
| overflow: hidden !important; |
| } |
| |
| /* 3. Сайдбар: фиксированная ширина, скролл при переполнении */ |
| #sidebar-container { |
| width: 320px !important; |
| min-width: 240px !important; |
| max-width: 380px !important; |
| border-right: 1px solid var(--border-color-primary) !important; |
| background-color: var(--background-fill-secondary) !important; |
| padding: 1.25rem !important; |
| height: 100% !important; |
| display: flex !important; |
| flex-direction: column !important; |
| box-shadow: 2px 0 8px rgba(0, 0, 0, 0.02) !important; |
| overflow: auto !important; |
| } |
| |
| /* Убираем "старение" (побледнение) при обновлении данных */ |
| .stale { |
| opacity: 1 !important; |
| filter: none !important; |
| } |
| |
| /* 5. Правая колонка с чатом (Главная область) */ |
| #col-chat-main { |
| display: flex !important; |
| flex-direction: column !important; |
| height: 100% !important; |
| padding: 0 !important; |
| margin: 0 !important; |
| gap: 0 !important; |
| background: var(--background-fill-primary) !important; |
| flex: 1 1 auto !important; |
| overflow: hidden !important; |
| } |
| |
| /* ЧАТБОТ: Растягиваем на всю доступную высоту, min-height:0 для корректного flex-scroll */ |
| #chatbot { |
| flex: 1 1 auto !important; |
| height: auto !important; |
| min-height: 0 !important; |
| border: none !important; |
| border-radius: 0 !important; |
| margin: 0 !important; |
| display: flex !important; |
| flex-direction: column !important; |
| overflow-y: auto !important; |
| } |
| |
| /* Фикс для внутренней обертки Gradio Chatbot - предотвращаем overflow issues */ |
| #chatbot > .wrapper { |
| flex: 1 1 auto !important; |
| display: flex !important; |
| flex-direction: column !important; |
| min-height: 0 !important; |
| overflow: auto !important; |
| } |
| |
| /* 6. Поле ввода: фиксируем снизу с помощью sticky, чтобы всегда быть видимым */ |
| #input-area { |
| padding: 0.75rem 1rem !important; |
| border-top: 1px solid var(--border-color-primary) !important; |
| background: var(--background-fill-primary) !important; |
| box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.02) !important; |
| flex-shrink: 0 !important; |
| position: sticky !important; |
| bottom: 0 !important; |
| z-index: 10 !important; |
| } |
| |
| /* Текстовое поле адаптируется по ширине и не выходит за границы */ |
| #input-area textarea { |
| border-radius: 10px !important; |
| border: 1px solid var(--border-color-primary) !important; |
| padding: 12px 16px !important; |
| font-size: 1rem !important; |
| transition: border-color 0.2s ease !important; |
| width: 100% !important; |
| box-sizing: border-box !important; |
| } |
| |
| #input-area textarea:focus { |
| border-color: var(--color-accent) !important; |
| box-shadow: 0 0 0 2px rgba(var(--color-accent-rgb), 0.1) !important; |
| } |
| |
| /* 7. Кнопки и прочие элементы */ |
| .gr-button-primary { |
| border-radius: 8px !important; |
| font-weight: 600 !important; |
| } |
| |
| /* Кастомный скроллбар */ |
| ::-webkit-scrollbar { |
| width: 8px; |
| height: 8px; |
| } |
| |
| ::-webkit-scrollbar-track { |
| background: transparent; |
| } |
| |
| ::-webkit-scrollbar-thumb { |
| background: var(--neutral-300); |
| border-radius: 10px; |
| } |
| |
| ::-webkit-scrollbar-thumb:hover { |
| background: var(--neutral-400); |
| } |
| |
| /* Скрытие футера */ |
| footer { |
| display: none !important; |
| } |
| |
| /* Убираем лишние зазоры между элементами */ |
| .gap { |
| gap: 12px !important; |
| } |
| """ |
|
|