/* AI Assistant — Offcanvas panel, chat UI, dark mode compatible */ /* Offcanvas panel */ #aiAssistantPanel { --ai-panel-width: 420px; width: var(--ai-panel-width); max-width: 90vw; border-left: 1px solid var(--bs-border-color); } #aiAssistantPanel .offcanvas-header { border-bottom: 1px solid var(--bs-border-color); padding: 0.75rem 1rem; } #aiAssistantPanel .offcanvas-body { padding: 0; display: flex; flex-direction: column; } /* Tabs */ #aiAssistantPanel .nav-tabs { padding: 0 0.5rem; border-bottom: 1px solid var(--bs-border-color); flex-shrink: 0; } #aiAssistantPanel .nav-tabs .nav-link { font-size: 0.85rem; padding: 0.5rem 0.75rem; } /* Chat area */ .ai-chat-area { flex: 1; overflow-y: auto; padding: 1rem; display: flex; flex-direction: column; gap: 0.75rem; } /* Message bubbles */ .ai-msg { max-width: 92%; padding: 0.6rem 0.85rem; border-radius: 0.75rem; font-size: 0.9rem; line-height: 1.5; word-wrap: break-word; } .ai-msg-user { align-self: flex-end; background: var(--bs-primary); color: #fff; border-bottom-right-radius: 0.2rem; } .ai-msg-assistant { align-self: flex-start; background: var(--bs-tertiary-bg); color: var(--bs-body-color); border-bottom-left-radius: 0.2rem; } .ai-msg-error { align-self: center; background: var(--bs-danger-bg-subtle, #f8d7da); color: var(--bs-danger-text-emphasis, #842029); font-size: 0.85rem; text-align: center; } /* Markdown rendering inside assistant messages */ .ai-msg-assistant p { margin: 0 0 0.5em; } .ai-msg-assistant p:last-child { margin-bottom: 0; } .ai-msg-assistant code { background: var(--bs-body-bg); padding: 0.1em 0.35em; border-radius: 0.25rem; font-size: 0.85em; } .ai-msg-assistant pre { background: var(--bs-body-bg); padding: 0.6rem; border-radius: 0.5rem; overflow-x: auto; margin: 0.5em 0; font-size: 0.82em; } .ai-msg-assistant pre code { background: none; padding: 0; } .ai-msg-assistant ul, .ai-msg-assistant ol { margin: 0.25em 0; padding-left: 1.5em; } .ai-msg-assistant strong { font-weight: 600; } .ai-msg-assistant h1, .ai-msg-assistant h2, .ai-msg-assistant h3 { font-size: 1em; font-weight: 700; margin: 0.5em 0 0.25em; } /* Links inside assistant messages */ .ai-msg-assistant a { color: var(--bs-link-color); text-decoration: underline; text-decoration-color: var(--bs-link-color); text-underline-offset: 2px; } .ai-msg-assistant a:hover { color: var(--bs-link-hover-color); text-decoration-color: var(--bs-link-hover-color); } /* Input area */ .ai-input-area { flex-shrink: 0; border-top: 1px solid var(--bs-border-color); padding: 0.75rem; } .ai-input-area .input-group { gap: 0.5rem; } .ai-input-area textarea { resize: none; font-size: 0.9rem; border-radius: 0.5rem; max-height: 120px; } .ai-input-area .btn { border-radius: 0.5rem; padding: 0.375rem 0.75rem; } /* Suggest form */ .ai-suggest-form textarea { resize: vertical; min-height: 100px; font-size: 0.9rem; } .ai-suggest-success { text-align: center; color: var(--bs-success-text-emphasis, #0f5132); padding: 2rem 1rem; } .ai-suggest-success i { font-size: 2rem; display: block; margin-bottom: 0.5rem; } /* Typing indicator */ .ai-typing { display: inline-flex; align-items: center; gap: 4px; padding: 0.6rem 0.85rem; background: var(--bs-tertiary-bg); border-radius: 0.75rem; border-bottom-left-radius: 0.2rem; align-self: flex-start; } .ai-typing-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--bs-secondary-color); animation: aiTypingBounce 1.2s infinite; } .ai-typing-dot:nth-child(2) { animation-delay: 0.2s; } .ai-typing-dot:nth-child(3) { animation-delay: 0.4s; } @keyframes aiTypingBounce { 0%, 60%, 100% { transform: translateY(0); opacity: 0.4; } 30% { transform: translateY(-4px); opacity: 1; } } /* Tool status indicator */ .ai-tool-status { display: inline-flex; align-items: center; padding: 0.4rem 0.75rem; background: var(--bs-info-bg-subtle, #cff4fc); color: var(--bs-info-text-emphasis, #055160); border-radius: 0.5rem; font-size: 0.82rem; align-self: flex-start; } [data-bs-theme="dark"] .ai-tool-status { background: rgba(13, 202, 240, 0.15); color: var(--bs-info-text-emphasis, #6edff6); } .ai-tool-status .spinner-border { width: 0.85rem; height: 0.85rem; border-width: 0.15em; } /* Quick-reply buttons */ .ai-quick-replies { display: flex; gap: 0.5rem; align-self: flex-start; flex-wrap: wrap; } .ai-quick-replies .btn { font-size: 0.82rem; padding: 0.25rem 0.75rem; border-radius: 1rem; } /* Cost badge */ .ai-cost-badge { font-size: 0.75rem; color: var(--bs-secondary-color); text-align: center; padding: 0.25rem; } /* Prompt builder */ .ai-prompt-builder { overflow-y: auto; flex: 1; } .ai-prompt-preview { background: var(--bs-tertiary-bg); border: 1px solid var(--bs-border-color); border-radius: 0.5rem; padding: 0.75rem; font-size: 0.85rem; line-height: 1.6; color: var(--bs-body-color); min-height: 60px; white-space: pre-wrap; word-wrap: break-word; font-family: inherit; } /* Responsive */ @media (max-width: 576px) { #aiAssistantPanel { --ai-panel-width: 100vw; } }