diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..18d7e03 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,8 @@ +services: + web: + build: . + ports: + - "8080:80" + volumes: + - .:/usr/share/nginx/html:delegated,Z + restart: unless-stopped diff --git a/css/style.css b/css/style.css index 991e790..669cfa1 100644 --- a/css/style.css +++ b/css/style.css @@ -795,3 +795,452 @@ footer { [data-theme="dark"] .send-btn:hover:not(:disabled) { background: linear-gradient(135deg, var(--pink-500), #1a1a3e); } + +/* LLM interactive elements */ +.llm-btn { + background: linear-gradient(135deg, var(--pink-400), var(--pink-500)); + color: var(--white); + border: none; + padding: 0.5rem 1rem; + border-radius: 10px; + cursor: pointer; + font-size: 0.82rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + transition: background 0.2s, transform 0.1s, opacity 0.2s; + display: inline-flex; + align-items: center; + gap: 0.4rem; +} + +.llm-btn:hover:not(:disabled) { + background: linear-gradient(135deg, var(--pink-500), var(--pink-600)); + transform: translateY(-1px); +} + +.llm-btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.llm-btn .icon { + font-size: 1rem; +} + +.llm-response-area { + background: var(--pink-100); + border: 2px solid var(--pink-300); + border-radius: 12px; + padding: 1rem 1.2rem; + margin-top: 0.8rem; + font-size: 0.9rem; + line-height: 1.6; + max-height: 400px; + overflow-y: auto; + display: none; +} + +.llm-response-area.visible { + display: block; + animation: llmFadeIn 0.3s ease-out; +} + +@keyframes llmFadeIn { + from { opacity: 0; transform: translateY(8px); } + to { opacity: 1; transform: translateY(0); } +} + +.llm-loading { + color: var(--pink-500); + font-style: italic; +} + +.llm-error { + color: var(--pink-700); + font-weight: 600; +} + +.llm-inline-code { + background: var(--white); + padding: 0.15rem 0.4rem; + border-radius: 4px; + font-family: 'Courier New', monospace; + font-size: 0.85em; + border: 1px solid var(--pink-300); +} + +.llm-code-block { + background: var(--pink-50); + padding: 0.8rem 1rem; + border-radius: 8px; + overflow-x: auto; + font-size: 0.85rem; + border: 1px solid var(--pink-200); + margin: 0.5rem 0; +} + +.llm-code-block code { + font-family: 'Courier New', monospace; + white-space: pre-wrap; +} + +.llm-mini-chat { + display: none; + background: var(--white); + border: 2px solid var(--pink-300); + border-radius: 16px; + padding: 1.2rem; + margin-top: 1rem; + box-shadow: var(--shadow-lg); +} + +.llm-mini-chat.visible { + display: block; + animation: llmFadeIn 0.3s ease-out; +} + +.llm-mini-chat-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.8rem; + padding-bottom: 0.5rem; + border-bottom: 2px solid var(--pink-200); +} + +.llm-mini-chat-header h4 { + color: var(--pink-600); + font-size: 0.95rem; + margin: 0; +} + +.llm-close-btn { + background: none; + border: none; + color: var(--pink-500); + cursor: pointer; + font-size: 1.2rem; + padding: 0.2rem; + line-height: 1; + transition: color 0.2s; +} + +.llm-close-btn:hover { + color: var(--pink-700); +} + +.llm-mini-chat-output { + background: var(--pink-50); + border: 1px solid var(--pink-200); + border-radius: 10px; + padding: 0.8rem 1rem; + margin-bottom: 0.8rem; + min-height: 40px; + font-size: 0.9rem; + line-height: 1.6; + max-height: 300px; + overflow-y: auto; + white-space: pre-wrap; +} + +.llm-mini-chat-input-row { + display: flex; + gap: 0.5rem; +} + +.llm-mini-chat-input { + flex: 1; + padding: 0.5rem 0.8rem; + border: 2px solid var(--pink-200); + border-radius: 10px; + font-size: 0.88rem; + color: var(--pink-900); + background: var(--pink-50); + font-family: inherit; + resize: none; + outline: none; +} + +.llm-mini-chat-input:focus { + border-color: var(--pink-400); + background: var(--white); +} + +.llm-mini-chat-send { + background: linear-gradient(135deg, var(--pink-400), var(--pink-500)); + color: var(--white); + border: none; + padding: 0.5rem 1rem; + border-radius: 10px; + cursor: pointer; + font-size: 0.85rem; + font-weight: 700; + white-space: nowrap; + transition: background 0.2s; +} + +.llm-mini-chat-send:hover:not(:disabled) { + background: linear-gradient(135deg, var(--pink-500), var(--pink-600)); +} + +.llm-mini-chat-send:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +/* Dark mode LLM styles */ +[data-theme="dark"] .llm-btn { + background: linear-gradient(135deg, var(--pink-600), #0f3460); +} + +[data-theme="dark"] .llm-btn:hover:not(:disabled) { + background: linear-gradient(135deg, var(--pink-500), #1a1a3e); +} + +[data-theme="dark"] .llm-response-area { + background: var(--bg-primary); + border-color: var(--border-secondary); +} + +[data-theme="dark"] .llm-loading { + color: var(--pink-400); +} + +[data-theme="dark"] .llm-error { + color: var(--pink-300); +} + +[data-theme="dark"] .llm-inline-code { + background: var(--bg-card); + border-color: var(--border-primary); + color: var(--text-primary); +} + +[data-theme="dark"] .llm-code-block { + background: var(--bg-table); + border-color: var(--border-primary); + color: var(--text-primary); +} + +[data-theme="dark"] .llm-mini-chat { + background: var(--bg-card); + border-color: var(--border-primary); +} + +[data-theme="dark"] .llm-mini-chat-header { + border-bottom-color: var(--border-primary); +} + +[data-theme="dark"] .llm-mini-chat-header h4 { + color: var(--text-heading); +} + +[data-theme="dark"] .llm-close-btn { + color: var(--text-secondary); +} + +[data-theme="dark"] .llm-close-btn:hover { + color: var(--text-primary); +} + +[data-theme="dark"] .llm-mini-chat-output { + background: var(--bg-primary); + border-color: var(--border-primary); + color: var(--text-primary); +} + +[data-theme="dark"] .llm-mini-chat-input { + background: var(--bg-primary); + border-color: var(--border-primary); + color: var(--text-primary); +} + +[data-theme="dark"] .llm-mini-chat-input:focus { + border-color: var(--border-accent); + background: var(--bg-secondary); +} + +[data-theme="dark"] .llm-mini-chat-send { + background: linear-gradient(135deg, var(--pink-600), #0f3460); +} + +[data-theme="dark"] .llm-mini-chat-send:hover:not(:disabled) { + background: linear-gradient(135deg, var(--pink-500), #1a1a3e); +} + +/* Ask a question section on home page */ +.ask-question-section { + margin-top: 2.5rem; +} + +.ask-question-box { + background: var(--white); + border-radius: 16px; + padding: 2rem; + box-shadow: var(--shadow-lg); + border: 2px solid var(--pink-200); +} + +.ask-question-box h3 { + color: var(--pink-700); + margin-bottom: 1rem; + font-size: 1.2rem; +} + +.ask-question-input-row { + display: flex; + gap: 0.8rem; + margin-bottom: 1rem; +} + +.ask-question-input { + flex: 1; + padding: 0.8rem 1rem; + border: 2px solid var(--pink-200); + border-radius: 12px; + font-size: 0.95rem; + color: var(--pink-900); + background: var(--pink-50); + font-family: inherit; + resize: none; + outline: none; +} + +.ask-question-input:focus { + border-color: var(--pink-400); + background: var(--white); +} + +.ask-question-answer { + background: var(--pink-50); + border: 1px solid var(--pink-200); + border-radius: 10px; + padding: 1rem 1.2rem; + font-size: 0.95rem; + line-height: 1.6; + min-height: 40px; + white-space: pre-wrap; + display: none; +} + +.ask-question-answer.visible { + display: block; + animation: llmFadeIn 0.3s ease-out; +} + +[data-theme="dark"] .ask-question-box { + background: var(--bg-card); + border-color: var(--border-primary); +} + +[data-theme="dark"] .ask-question-box h3 { + color: var(--text-heading); +} + +[data-theme="dark"] .ask-question-input { + background: var(--bg-primary); + border-color: var(--border-primary); + color: var(--text-primary); +} + +[data-theme="dark"] .ask-question-input:focus { + border-color: var(--border-accent); + background: var(--bg-secondary); +} + +[data-theme="dark"] .ask-question-answer { + background: var(--bg-primary); + border-color: var(--border-primary); + color: var(--text-primary); +} + +/* Modal dialog */ +.llm-modal-backdrop { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 9999; + background: rgba(0, 0, 0, 0.5); + justify-content: center; + align-items: center; + padding: 2rem; +} + +.llm-modal-container { + background: var(--white); + border-radius: 20px; + max-width: 700px; + width: 100%; + max-height: 80vh; + display: flex; + flex-direction: column; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); + overflow: hidden; +} + +.llm-modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1.2rem 1.5rem; + border-bottom: 2px solid var(--pink-200); +} + +.llm-modal-title { + color: var(--pink-600); + font-size: 1.1rem; + margin: 0; +} + +.llm-modal-close { + background: none; + border: none; + color: var(--pink-500); + font-size: 1.5rem; + cursor: pointer; + padding: 0.2rem 0.5rem; + line-height: 1; + transition: color 0.2s; +} + +.llm-modal-close:hover { + color: var(--pink-700); +} + +.llm-modal-body { + padding: 1.5rem; + overflow-y: auto; + flex: 1; + font-size: 0.95rem; + line-height: 1.7; + color: var(--pink-900); + white-space: pre-wrap; +} + +[data-theme="dark"] .llm-modal-container { + background: var(--bg-card); +} + +[data-theme="dark"] .llm-modal-header { + border-bottom-color: var(--border-primary); +} + +[data-theme="dark"] .llm-modal-title { + color: var(--text-heading); +} + +[data-theme="dark"] .llm-modal-close { + color: var(--text-secondary); +} + +[data-theme="dark"] .llm-modal-close:hover { + color: var(--text-primary); +} + +[data-theme="dark"] .llm-modal-body { + color: var(--text-primary); +} + diff --git a/index.html b/index.html index 99488d3..c49ec5f 100644 --- a/index.html +++ b/index.html @@ -106,9 +106,20 @@
Ask anything about AI โ terminology, concepts, techniques, or real-world applications. Powered by your configured LLM.
+Try AI right now โ ask questions, brainstorm ideas, get explanations, or just experiment. Powered by a real LLM API.