/* LLM 連線測試樣式 */ .llm-connection-test { max-width: 1200px; margin: 0 auto; padding: 24px; } /* Header */ .test-header { margin-bottom: 32px; text-align: center; } .test-header h2 { font-size: 28px; font-weight: 700; color: #1f2937; margin: 0 0 12px 0; } .test-description { font-size: 15px; color: #6b7280; margin: 0; } /* Actions */ .test-actions { display: flex; justify-content: center; margin-bottom: 32px; } .test-all-button { display: flex; align-items: center; gap: 8px; padding: 12px 24px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; border-radius: 8px; font-size: 16px; font-weight: 600; cursor: pointer; transition: all 0.3s ease; box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); } .test-all-button:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 6px 16px rgba(102, 126, 234, 0.4); } .test-all-button:active:not(:disabled) { transform: translateY(0); } .test-all-button:disabled { opacity: 0.6; cursor: not-allowed; } /* Providers Grid */ .providers-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 24px; margin-bottom: 32px; } .provider-card { background: white; border: 2px solid #e5e7eb; border-radius: 12px; padding: 24px; transition: all 0.3s ease; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); } .provider-card:hover { box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); transform: translateY(-2px); } .provider-card.success { border-color: #10b981; background: linear-gradient(135deg, #ffffff 0%, #f0fdf4 100%); } .provider-card.failure { border-color: #ef4444; background: linear-gradient(135deg, #ffffff 0%, #fef2f2 100%); } /* Provider Header */ .provider-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; } .provider-info { display: flex; align-items: center; gap: 12px; } .provider-icon { font-size: 32px; } .provider-info h3 { margin: 0; font-size: 18px; font-weight: 600; color: #1f2937; } .result-icon { font-size: 24px; } /* Provider Body */ .provider-body { min-height: 120px; margin-bottom: 16px; } .result-details { display: flex; flex-direction: column; gap: 12px; } .status-badge { display: inline-block; padding: 6px 12px; border-radius: 6px; font-size: 13px; font-weight: 600; width: fit-content; } .status-badge.success { background-color: #d1fae5; color: #065f46; } .status-badge.failure { background-color: #fee2e2; color: #991b1b; } .result-message { margin: 0; font-size: 14px; color: #4b5563; line-height: 1.6; } .result-meta { display: flex; gap: 8px; font-size: 13px; padding: 8px 12px; background-color: #f9fafb; border-radius: 6px; } .meta-label { font-weight: 600; color: #6b7280; } .meta-value { color: #1f2937; } .error-details { margin-top: 8px; } .error-details summary { cursor: pointer; font-size: 13px; font-weight: 500; color: #ef4444; user-select: none; } .error-details summary:hover { color: #dc2626; } .error-details pre { margin-top: 8px; padding: 12px; background-color: #1f2937; color: #f9fafb; border-radius: 6px; font-size: 12px; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word; } .no-result { margin: 0; padding: 24px; text-align: center; color: #9ca3af; font-size: 14px; } /* Provider Footer */ .provider-footer { border-top: 1px solid #e5e7eb; padding-top: 16px; } .test-button { display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%; padding: 10px 16px; background: white; border: 2px solid; border-radius: 8px; font-size: 14px; font-weight: 600; cursor: pointer; transition: all 0.2s ease; } .test-button:hover:not(:disabled) { background-color: rgba(0, 0, 0, 0.02); transform: translateY(-1px); } .test-button:active:not(:disabled) { transform: translateY(0); } .test-button:disabled { opacity: 0.5; cursor: not-allowed; } /* Spinner */ .spinner { display: inline-block; width: 16px; height: 16px; border: 2px solid rgba(255, 255, 255, 0.3); border-top-color: white; border-radius: 50%; animation: spin 0.8s linear infinite; } .spinner.small { width: 12px; height: 12px; border-width: 2px; } @keyframes spin { to { transform: rotate(360deg); } } /* Footer */ .test-footer { margin-top: 32px; } .info-box { display: flex; gap: 16px; padding: 20px; background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%); border: 1px solid #bfdbfe; border-radius: 12px; } .info-icon { font-size: 24px; flex-shrink: 0; } .info-content { flex: 1; } .info-content strong { display: block; margin-bottom: 8px; color: #1e40af; font-size: 15px; } .info-content p { margin: 0 0 12px 0; color: #1e3a8a; font-size: 14px; line-height: 1.6; } .info-content ul { margin: 0; padding-left: 20px; color: #1e3a8a; } .info-content li { margin-bottom: 6px; font-size: 13px; font-family: 'Courier New', monospace; } /* 響應式設計 */ @media (max-width: 768px) { .llm-connection-test { padding: 16px; } .test-header h2 { font-size: 24px; } .providers-grid { grid-template-columns: 1fr; gap: 16px; } .provider-card { padding: 20px; } .info-box { flex-direction: column; gap: 12px; } .info-icon { font-size: 20px; } } /* 深色模式支援 (可選) */ @media (prefers-color-scheme: dark) { .llm-connection-test { background-color: #111827; } .test-header h2 { color: #f9fafb; } .test-description { color: #9ca3af; } .provider-card { background: #1f2937; border-color: #374151; } .provider-info h3 { color: #f9fafb; } .result-message { color: #d1d5db; } .result-meta { background-color: #111827; } .test-button { background: #1f2937; } .test-button:hover:not(:disabled) { background-color: #374151; } .info-box { background: linear-gradient(135deg, #1e3a8a 0%, #1e40af 100%); border-color: #2563eb; } .info-content strong, .info-content p, .info-content li { color: #dbeafe; } }