UNPKG

llmasaservice-ui

Version:

Prebuilt UI components for LLMAsAService.io

932 lines (931 loc) 22.7 kB
/* src/ChatPanel.css */ *, *::before, *::after { box-sizing: border-box; } :root { --spacing-small: 0.3rem; --spacing-medium: 0.5rem; --spacing-large: 1rem; --border-radius: 10px; --icon-size-large: 1rem; --icon-button-size-large: 2.5rem; --icon-size-small: 1.5rem; --icon-button-size-small: 1.7rem; --button-send-size: 40px; --input-height: 40px; --background-color: #fff; --title-text-color: #555; --title-background-color: #fff; --title-divider-color: #eee; --input-background-color: #eee; --input-border-color: #ddd; --input-text-color: #555; --button-background-color: #eee; --button-border-color: #ddd; --button-text-color: #555; --button-background-color-hover: #777; --button-text-color-hover: #fff; --button-drop-shadow: 2px 2px 4px rgba(0, 0, 0, 0.15); --button-disabled-color: #ccc; --button-disabled-background-color: #eee; --button-action-background-color: transparent; --button-action-text-color: #999; --prompt-background-color: #eeeeee; --prompt-text-color: #000; --response-background-color: #ffffff; --response-text-color: #000; --button-scroll-background-color: #777; --button-scroll-text-color: #fff; --button-scroll-background-color-hover: #999; --table-border-color: #777; --powered-by-text-color: #999; --background-color-mandatory: #ffcccc; --border-color-mandatory: #ff5555; --text-color-manadatory: #ff5555; } .dark-theme { --background-color: #171717; --title-text-color: #e0e0e0; --title-background-color: #171717; --title-divider-color: #333; --input-background-color: #2c2c2c; --input-border-color: #444; --input-text-color: #e0e0e0; --button-background-color: #3a3a3a; --button-border-color: #555; --button-text-color: #e0e0e0; --button-background-color-hover: #505050; --button-text-color-hover: #fff; --button-drop-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); --button-disabled-color: #808080; --button-disabled-background-color: #505050; --button-action-background-color: transparent; --button-action-text-color: #bbb; --prompt-background-color: #333333; --prompt-text-color: #ffffff; --response-background-color: #171717; --response-text-color: #e0e0e0; --button-scroll-background-color: #505050; --button-scroll-text-color: #fff; --button-scroll-background-color-hover: #606060; --table-border-color: #444; --background-color-mandatory: #2c2c2c; --border-color-mandatory: #ff5555; --text-color-manadatory: #e0e0e0; } .llm-panel { font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; font-size: 0.875rem; background-color: var(--background-color); display: flex; flex-direction: column; position: relative; padding: var(--spacing-medium); } .llm-panel .title { font-size: 1rem; padding: var(--spacing-medium); border-bottom: 0.5px solid var(--title-divider-color); text-align: center; color: var(--title-text-color); background-color: var(--title-background-color); } .llm-panel .input-container { display: flex; flex-direction: row; align-items: center; margin-top: var(--spacing-small); } .llm-panel .email-input-container { display: flex; flex-direction: row; width: 100%; gap: var(--spacing-small); margin-top: var(--spacing-small); margin-bottom: var(--spacing-small); padding-right: var(--spacing-small); } .llm-panel .email-input { flex: 1; color: var(--input-text-color); padding: var(--spacing-small); background-color: var(--input-background-color); border: 1px solid var(--input-border-color); } .llm-panel .email-input-invalid { flex: 1; color: var(--input-text-color); padding: var(--spacing-small); background-color: var(--background-color-mandatory); border: 1px solid var(--border-color-mandatory); } .llm-panel .email-input-message { color: var(--text-color-manadatory); font-size: 0.8em; margin-top: var(--spacing-small); } .llm-panel .email-input-invalid::placeholder { color: var(--text-color-manadatory); } .llm-panel .email-input-set { flex: 1; color: var(--input-text-color); padding: var(--spacing-small); background-color: var(--background-color); border: 0px solid var(--background-color); opacity: 0.7; user-select: none; } .llm-panel .email-input-button:hover { background-color: var(--button-background-color-hover); color: var(--button-text-color-hover); } .llm-panel .email-input-button { padding: var(--spacing-small); background-color: var(--button-background-color); color: var(--button-text-color); border-radius: var(--border-radius); border: 1px solid var(--button-border-color); cursor: pointer; transition: background-color 0.3s ease; white-space: nowrap; } .llm-panel .chat-input { flex: 1; color: var(--input-text-color); margin: 0 var(--spacing-small); padding: var(--spacing-small); border-radius: var(--border-radius); min-height: var(--input-height); max-height: 120px; resize: vertical; overflow-y: auto; background-color: var(--input-background-color); border: 1px solid var(--input-border-color); transition: height 0.1s ease; } .llm-panel .chat-input.user-resized { max-height: none; } .llm-panel .chat-input:focus, .llm-panel input:focus { outline: none; border: 2px solid var(--button-background-color-hover); box-shadow: 0 0 5px var(--button-background-color-hover); } .llm-panel .chat-input:disabled { background-color: var(--button-disabled-background-color); cursor: not-allowed; } .llm-panel .chat-input:disabled::placeholder { color: var(--button-disabled-color); } .llm-panel .send-button { margin-right: var(--spacing-small); padding: var(--spacing-small); background-color: var(--button-background-color); color: var(--button-text-color); background-color: var(--input-background-color); border: 1px solid var(--input-border-color); border-radius: var(--border-radius); cursor: pointer; height: var(--button-send-size); width: var(--button-send-size); transition: background-color 0.3s ease; } .llm-panel .send-button:hover { background-color: var(--button-background-color-hover); color: var(--button-text-color-hover); } .llm-panel .send-button:disabled { cursor: not-allowed; color: var(--button-disabled-color); background-color: var(--button-disabled-background-color); } .llm-panel .history-entry { background-color: var(--background-color); padding-bottom: var(--spacing-medium); border-radius: var(--border-radius); margin-bottom: var(--spacing-medium); } .llm-panel .responseArea { flex: 1; background-color: var(--background-color); border-radius: var(--border-radius); overflow-y: auto; padding: var(--spacing-medium); margin-top: var(--spacing-medium); } .llm-panel .prompt { align-self: flex-start; padding: var(--spacing-medium); border-radius: 25px; margin-left: 5%; max-width: 100%; white-space: pre-wrap; background-color: var(--prompt-background-color); color: var(--prompt-text-color); margin-top: var(--spacing-small); } .llm-panel .response { align-self: flex-end; padding: var(--spacing-small); background-color: var(--response-background-color); color: var(--response-text-color); margin-top: var(--spacing-small); } .llm-panel .copy-button, .llm-panel .thumbs-button { font-size: var(--icon-size-small); border: none; background-color: var(--button-action-background-color); color: var(--button-action-text-color); cursor: pointer; width: var(--icon-button-size-small); height: var(--icon-button-size-small); display: flex; justify-content: center; align-items: center; } .llm-panel .copy-button:hover, .llm-panel .thumbs-button:hover { color: var(--button-text-color-hover); background-color: var(--button-background-color-hover); box-shadow: 0 0 5px var(--button-background-color-hover); } .llm-panel .copy-button:disabled, .llm-panel .thumbs-button:disabled { cursor: not-allowed; color: var(--button-disabled-color); background-color: var(--button-disabled-background-color); } .llm-panel .icon-svg { width: var(--icon-size-small); height: var(--icon-size-small); margin: 0; } .llm-panel .icon-svg-large { width: var(--icon-size-large); height: var(--icon-size-large); margin: 0; } .llm-panel .button-container { display: flex; margin-top: var(--spacing-medium); } .llm-panel .button-container-actions { display: flex; justify-content: space-between; gap: 0; } .llm-panel .scroll-button { position: absolute; left: 50%; transform: translateX(-50%); bottom: 5%; background-color: var(--button-scroll-background-color); color: var(--button-scroll-text-color); border: none; border-radius: 50%; height: 2.5rem; width: 2.5rem; display: flex; align-items: center; justify-content: center; cursor: pointer; z-index: 10; } .llm-panel .scroll-button:hover { background-color: var(--button-scroll-background-color-hover); } .llm-panel table { border-collapse: collapse; margin-bottom: 1em; border: 1px solid var(--table-border-color); } .llm-panel th, .llm-panel td { border: 1px solid var(--table-border-color); padding: 8px; } .llm-panel .save-button { flex: 1; background-color: var(--button-background-color); color: var(--button-text-color); border: 1px solid var(--button-border-color); border-radius: var(--border-radius); cursor: pointer; padding: 5px 10px; font-size: 0.8em; margin: var(--spacing-small); transition: background-color 0.3s ease, transform 0.3s ease; box-shadow: var(--button-drop-shadow); } .llm-panel .save-button:disabled { cursor: not-allowed; color: var(--button-disabled-color); background-color: var(--button-disabled-background-color); } .llm-panel .save-button:hover { background-color: var(--button-background-color-hover); color: var(--button-text-color-hover); } .llm-panel .new-conversation-button { background-color: var(--prompt-background-color); border-color: var(--button-border-color); font-weight: 500; } .llm-panel .new-conversation-button:hover { background-color: var(--button-background-color-hover); color: var(--button-text-color-hover); transform: translateY(-1px); } .llm-panel .new-conversation-button.confirm-state { background-color: #ff6b35; color: white; border-color: #e55a2b; animation: pulse-confirm 1s infinite; } .llm-panel .new-conversation-button.confirm-state:hover { background-color: #e55a2b; color: white; } @keyframes pulse-confirm { 0% { opacity: 1; } 50% { opacity: 0.7; } 100% { opacity: 1; } } .llm-panel .suggestion-button { background-color: var(--button-background-color); color: var(--button-text-color); border: 1px solid var(--button-border-color); border-radius: var(--border-radius); padding: 5px 10px; font-size: 0.8em; cursor: pointer; margin: var(--spacing-small); box-shadow: var(--button-drop-shadow); } .llm-panel .suggestion-button:hover { background-color: var(--button-background-color-hover); color: var(--button-text-color-hover); } .llm-panel .suggestion-button:disabled { background-color: var(--button-disabled-color); color: var(--button-disabled-background-color); cursor: not-allowed; } .footer-container { display: flex; align-items: center; min-height: 24px; } .footer-container.no-tools { justify-content: center; } .footer-container.with-tools { justify-content: space-between; } .footer-left { flex: 1; display: flex; justify-content: center; } .footer-right { flex: 1; display: flex; justify-content: center; } .footer-center { flex: none; width: 100%; } .powered-by { display: flex; justify-content: center; align-items: center; color: var(--powered-by-text-color); font-size: 0.8em; height: 100%; text-align: center; } .powered-by a { color: var(--powered-by-text-color); text-decoration: underline; } .tool-status { display: flex; align-items: center; justify-content: center; margin-top: 4px; font-size: 10px; color: #666; opacity: 0.7; cursor: help; } .tool-status-dot { width: 6px; height: 6px; border-radius: 50%; margin-right: 4px; display: inline-block; cursor: help; } .tool-status-dot.loading { background-color: #ffa500; animation: pulse 1.5s ease-in-out infinite; } .tool-status-dot.ready { background-color: #28a745; } .tool-status-dot.ready:hover { background-color: #34ce57; transform: scale(1.2); transition: all 0.2s ease; } .tool-status-dot.error { background-color: #dc3545; } .tool-status-text { font-size: 9px; font-weight: 300; cursor: help; } .tool-status-text:hover { opacity: 1; transition: opacity 0.2s ease; } .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.5); display: flex; justify-content: center; align-items: center; } .modal-content { background: white; padding: 5px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); text-align: center; color: #333; } .modal-text { color: black; } .modal-buttons { padding: 5px 10px; display: flex; justify-content: space-between; } .modal-buttons button { padding: 5px 10px; border: none; border-radius: 5px; cursor: pointer; } .modal-buttons button:first-child { background: #ccc; } .modal-buttons button:last-child { background: #007bff; color: white; } .approve-tools-panel { display: flex; flex-direction: column; gap: var(--spacing-small); margin-top: var(--spacing-small); padding: var(--spacing-small); background-color: #FFFFE0; border: 1px solid var(--button-border-color); box-shadow: var(--button-drop-shadow); margin-left: calc(-1 * var(--spacing-medium)); margin-right: calc(-1 * var(--spacing-medium)); color: black; } .approve-tools-header { font-size: 0.75em; text-align: center; } .approve-tools-buttons { display: flex; justify-content: center; flex-wrap: wrap; gap: var(--spacing-small); margin: var(--spacing-small) 0; } .approve-tools-button { background-color: var(--button-background-color); color: var(--button-text-color); border: 1px solid var(--button-border-color); border-radius: var(--border-radius); padding: 5px 5px; font-size: 0.8em; cursor: pointer; margin: var(--spacing-small); box-shadow: var(--button-drop-shadow); } .approve-tools-description { text-align: center; font-size: 0.75em; color: var(--button-action-text-color); padding: 0 var(--spacing-small) var(--spacing-small); } .invalid { border-color: red; } .error-message { color: red; font-size: 0.8em; margin-top: var(--spacing-small); } .loading-text { display: flex; align-items: flex-start; justify-content: flex-start; margin: 10px 0; height: auto; min-height: 30px; padding: 8px 12px; background: linear-gradient( 135deg, rgba(0, 123, 255, 0.05) 0%, rgba(0, 123, 255, 0.1) 100%); border-left: 3px solid rgba(0, 123, 255, 0.3); border-radius: 6px; font-size: 0.9rem; font-style: italic; color: var(--button-text-color); opacity: 0.8; transition: all 0.3s ease; word-wrap: break-word; overflow-wrap: break-word; line-height: 1.4; } .dark-theme .loading-text { background: linear-gradient( 135deg, rgba(100, 200, 255, 0.08) 0%, rgba(100, 200, 255, 0.15) 100%); border-left-color: rgba(100, 200, 255, 0.4); color: var(--button-text-color); } .loading-text:hover { opacity: 1; transform: translateX(2px); } .loading-text .dot { background-color: var(--button-text-color); border-radius: 50%; width: 6px; height: 6px; margin: 0 2px 0 8px; display: inline-block; animation: jump 1.2s infinite ease-in-out; flex-shrink: 0; align-self: center; } .dark-theme .loading-text .dot { background-color: rgba(100, 200, 255, 0.7); } .loading-text .dot:nth-child(2) { animation-delay: 0s; } .loading-text .dot:nth-child(3) { animation-delay: 0.2s; } .loading-text .dot:nth-child(4) { animation-delay: 0.4s; } @keyframes jump { 0%, 80%, 100% { transform: translateY(0); opacity: 0.6; } 40% { transform: translateY(-6px); opacity: 1; } } .llm-panel .approve-all-button { background-color: var(--button-background-color-hover); color: var(--button-text-color-hover); border: 1px solid var(--button-border-color); border-radius: var(--border-radius); padding: 8px 15px; font-size: 0.9em; font-weight: bold; cursor: pointer; margin: var(--spacing-medium) 0; box-shadow: var(--button-drop-shadow); display: inline-block; } .llm-panel .approve-all-button:hover { filter: brightness(1.1); transform: translateY(-1px); } .modal-overlay { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background-color: rgba(0, 0, 0, 0.5); display: flex; justify-content: center; align-items: center; z-index: 1000; } .tool-info-modal-content { width: 90vw; height: 90vh; max-width: 90vw; max-height: 90vh; display: flex; flex-direction: column; background-color: white; padding: 20px; border-radius: 8px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); position: relative; color: #333; } .tool-info-container { display: flex; flex-grow: 1; flex-direction: row; gap: 0; margin: 0; padding: 0; } .tool-info-section { flex: 1; display: flex; flex-direction: column; padding: 10px; background-color: white; } .tool-info-json { width: 100%; height: 100%; overflow: auto; resize: none; background-color: #f5f5f5; border: 1px solid #ccc; border-radius: 4px; padding: 8px; font-family: monospace; flex-grow: 1; } .modal-buttons { display: flex; justify-content: flex-end; margin-top: 10px; } .modal-buttons button { padding: 8px 16px; margin-left: 8px; border: none; border-radius: 4px; background-color: #007bff; color: white; cursor: pointer; } .tool-status { display: flex; align-items: center; justify-content: center; margin-top: 4px; font-size: 10px; color: #666; opacity: 0.7; cursor: help; } .tool-status-dot { width: 6px; height: 6px; border-radius: 50%; margin-right: 4px; display: inline-block; cursor: help; } .tool-status-dot.loading { background-color: #ffa500; animation: pulse 1.5s ease-in-out infinite; } .tool-status-dot.ready { background-color: #28a745; } .tool-status-dot.ready:hover { background-color: #34ce57; transform: scale(1.2); transition: all 0.2s ease; } .tool-status-dot.error { background-color: #dc3545; } .tool-status-text { font-size: 9px; font-weight: 300; cursor: help; } .tool-status-text:hover { opacity: 1; transition: opacity 0.2s ease; } .dark-theme .tool-status { color: #999; } .reasoning-section, .searching-section { margin: 1rem 0; padding: 0.75rem; border-radius: var(--border-radius); border-left: 4px solid; background-color: var(--reasoning-background-color, #f8f9fa); } .reasoning-section { border-left-color: var(--reasoning-border-color, #007bff); background-color: var(--reasoning-background-color, #f0f8ff); } .searching-section { border-left-color: var(--searching-border-color, #28a745); background-color: var(--searching-background-color, #f0fff0); } .reasoning-header, .searching-header { font-weight: 600; font-size: 0.9rem; margin-bottom: 0.5rem; color: var(--prompt-text-color); opacity: 0.8; } .reasoning-content, .searching-content { font-size: 0.85rem; line-height: 1.4; color: var(--prompt-text-color); opacity: 0.9; font-style: italic; } .dark-theme .reasoning-section { background-color: var(--reasoning-background-color-dark, #1a1a2e); border-left-color: var(--reasoning-border-color-dark, #4a9eff); } .dark-theme .searching-section { background-color: var(--searching-background-color-dark, #1a2e1a); border-left-color: var(--searching-border-color-dark, #4ade80); } .dark-theme .reasoning-header, .dark-theme .searching-header, .dark-theme .reasoning-content, .dark-theme .searching-content { color: var(--response-text-color); } .streaming-response { animation: fadeIn 0.3s ease-in-out; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .thinking-block-container { margin-bottom: var(--spacing-medium); } .thinking-section { border: 1px solid var(--input-border-color); border-radius: var(--border-radius); padding: var(--spacing-medium); background-color: var(--input-background-color); margin-bottom: var(--spacing-small); } .thinking-header { display: flex; justify-content: space-between; align-items: center; font-weight: bold; color: var(--title-text-color); margin-bottom: var(--spacing-small); font-size: 0.9rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .thinking-navigation { display: flex; align-items: center; gap: var(--spacing-small); } .thinking-nav-btn { background: var(--button-background-color); border: 1px solid var(--button-border-color); border-radius: 4px; padding: 2px 6px; cursor: pointer; font-size: 12px; line-height: 1; min-width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; } .thinking-nav-btn:hover:not(:disabled) { background: var(--button-background-color-hover); color: var(--button-text-color-hover); } .thinking-nav-btn:disabled { background: var(--button-disabled-background-color); color: var(--button-disabled-color); cursor: not-allowed; } .thinking-counter { font-size: 11px; color: var(--title-text-color); font-weight: normal; min-width: 30px; text-align: center; } .thinking-content { color: var(--input-text-color); font-size: 0.85rem; line-height: 1.4; white-space: pre-wrap; } .thinking-content-row { display: flex; align-items: flex-start; gap: 6px; } .thinking-content-collapsed { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; flex: 1; min-width: 0; } .thinking-content-expanded { flex: 1; min-width: 0; } .thinking-expand-btn { background: none; border: none; cursor: pointer; color: var(--title-text-color); font-size: 0.75rem; padding: 2px 4px; margin-top: 2px; opacity: 0.7; flex-shrink: 0; } .thinking-expand-btn:hover { opacity: 1; } button[data-pending=true] { opacity: 0.55; pointer-events: none; position: relative; } button[data-pending=true]::after { content: "\2026"; position: absolute; top: 2px; right: 6px; font-weight: bold; opacity: 0.6; font-size: 0.8em; } .reasoning-section { border-left: 3px solid #4a90e2; } .searching-section { border-left: 3px solid #7b68ee; }