Podcast_Assistant / styles.css
StanDataCamp's picture
Add automatic light/dark theme support
1e8a7e0
/*
* Podcast Insights UI - Custom Styles
*
* Design: Modern, minimalistic interface with teal color palette
* Typography: Poppins font family
* Supports both light and dark themes automatically
*/
/* ============================================================
FONTS & BASE
============================================================ */
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap');
* {
font-family: 'Poppins', -apple-system, BlinkMacSystemFont, sans-serif !important;
}
/* ============================================================
CSS VARIABLES - Light & Dark Theme Support
============================================================ */
:root {
/* Primary teal colors */
--teal-primary: #0091ad;
--teal-hover: #007a94;
--teal-light: #e0f7fa;
--teal-soft: #f0fdfa;
/* Light theme colors */
--text-primary: #0f172a;
--text-secondary: #64748b;
--text-muted: #94a3b8;
--bg-surface: #f8fafc;
--bg-input: #f8fafc;
--border-color: #e2e8f0;
--border-light: #f1f5f9;
/* User bubble */
--user-bubble-bg: #e0f7fa;
--user-bubble-border: #b2ebf2;
/* Blockquote */
--quote-bg: #f0fdfa;
/* Example buttons */
--example-bg: #f8fafc;
--example-text: #475569;
/* Feedback */
--feedback-bg: #f8fafc;
/* New button */
--new-btn-bg: #f0fdfa;
--new-btn-text: #0d9488;
--new-btn-border: #99f6e4;
--new-btn-hover-bg: #ccfbf1;
--new-btn-hover-border: #5eead4;
}
/* Dark theme overrides */
@media (prefers-color-scheme: dark) {
:root {
--teal-primary: #22d3ee;
--teal-hover: #67e8f9;
--teal-light: #164e63;
--teal-soft: #0f3d4c;
--text-primary: #f1f5f9;
--text-secondary: #94a3b8;
--text-muted: #64748b;
--bg-surface: #1e293b;
--bg-input: #1e293b;
--border-color: #334155;
--border-light: #1e293b;
--user-bubble-bg: #164e63;
--user-bubble-border: #0e7490;
--quote-bg: #0f3d4c;
--example-bg: #1e293b;
--example-text: #cbd5e1;
--feedback-bg: #1e293b;
--new-btn-bg: #0f3d4c;
--new-btn-text: #22d3ee;
--new-btn-border: #0e7490;
--new-btn-hover-bg: #164e63;
--new-btn-hover-border: #22d3ee;
}
}
/* Gradio dark mode class support */
.dark {
--teal-primary: #22d3ee;
--teal-hover: #67e8f9;
--teal-light: #164e63;
--teal-soft: #0f3d4c;
--text-primary: #f1f5f9;
--text-secondary: #94a3b8;
--text-muted: #64748b;
--bg-surface: #1e293b;
--bg-input: #1e293b;
--border-color: #334155;
--border-light: #1e293b;
--user-bubble-bg: #164e63;
--user-bubble-border: #0e7490;
--quote-bg: #0f3d4c;
--example-bg: #1e293b;
--example-text: #cbd5e1;
--feedback-bg: #1e293b;
--new-btn-bg: #0f3d4c;
--new-btn-text: #22d3ee;
--new-btn-border: #0e7490;
--new-btn-hover-bg: #164e63;
--new-btn-hover-border: #22d3ee;
}
/* ============================================================
LAYOUT & CONTAINER
============================================================ */
.gradio-container {
max-width: 900px !important;
margin: auto !important;
padding: 8px !important;
}
.gradio-container .wrap {
gap: 2px !important;
}
.column {
gap: 4px !important;
}
.block {
margin: 0 !important;
}
.block.padded {
padding: 0 !important;
}
.gr-group, .gradio-group {
padding: 0 !important;
background: transparent !important;
border: none !important;
gap: 2px !important;
}
/* Hide Gradio default footer */
footer.svelte-zxu34v {
display: none !important;
}
/* ============================================================
COLOR THEME - Override Gradio orange with teal
============================================================ */
.orange, [class*="orange"], [style*="orange"] {
background: var(--teal-primary) !important;
border-color: var(--teal-primary) !important;
}
[style*="rgb(249"] {
border-color: var(--teal-primary) !important;
}
.progress-bar, .progress-level {
background: var(--teal-primary) !important;
}
*:focus {
outline-color: var(--teal-primary) !important;
}
/* ============================================================
HEADER
============================================================ */
.header-section {
margin-bottom: 6px !important;
text-align: center !important;
}
.header-content {
text-align: center;
}
.header-section h1,
.header-content h1 {
font-weight: 700 !important;
font-size: 1.6rem !important;
margin-bottom: 2px !important;
color: var(--teal-primary) !important;
}
.header-section p,
.header-content p {
color: var(--text-secondary) !important;
font-size: 0.85rem !important;
margin: 0 !important;
}
/* ============================================================
CHAT CONTAINER
============================================================ */
#chatbot {
border-radius: 12px !important;
border: 1px solid var(--border-color) !important;
box-shadow: 0 2px 8px rgba(0,145,173,0.06) !important;
min-height: 240px !important;
}
.placeholder-content {
height: 190px !important;
}
/* Chat message text size - match input textarea */
#chatbot .message,
#chatbot .message-content,
#chatbot .bot,
#chatbot .user,
#chatbot .md,
#chatbot p,
#chatbot li,
#chatbot blockquote,
#chatbot blockquote p {
font-size: 0.8rem !important;
line-height: 1.5 !important;
}
/* User message bubbles */
#chatbot .user.message,
.svelte-1nr59td.user {
background: var(--user-bubble-bg) !important;
color: var(--text-primary) !important;
border: 1px solid var(--user-bubble-border) !important;
}
/* Links in chat */
#chatbot a {
color: var(--teal-primary) !important;
font-weight: 600 !important;
text-decoration: underline !important;
text-underline-offset: 2px !important;
}
#chatbot a:hover {
color: var(--teal-hover) !important;
}
/* Blockquotes in chat */
#chatbot blockquote {
border-left: 3px solid var(--teal-primary) !important;
background: var(--quote-bg) !important;
padding: 10px 14px !important;
margin: 8px 0 !important;
border-radius: 0 8px 8px 0 !important;
font-style: normal !important;
}
/* ============================================================
INPUT AREA
============================================================ */
.input-row {
margin-top: 4px !important;
gap: 8px !important;
align-items: center !important;
}
.input-row .block {
border: none !important;
box-shadow: none !important;
}
.input-row label.show_textbox_border {
border: none !important;
box-shadow: none !important;
background: transparent !important;
}
.input-row input,
.input-row textarea {
border-radius: 10px !important;
border: 1px solid var(--border-color) !important;
padding: 12px 16px !important;
font-size: 0.85rem !important;
min-height: 44px !important;
background: var(--bg-input) !important;
max-width: 700px !important;
color: var(--text-primary) !important;
}
.input-row input:focus,
.input-row textarea:focus {
border-color: var(--teal-primary) !important;
box-shadow: none !important;
}
.input-row input::placeholder,
.input-row textarea::placeholder {
color: var(--text-muted) !important;
}
/* ============================================================
BUTTONS - Send & New
============================================================ */
.buttons-col {
display: flex !important;
flex-direction: column !important;
gap: 4px !important;
min-width: 110px !important;
justify-content: center !important;
align-self: center !important;
}
.buttons-col button {
width: 100% !important;
min-width: 110px !important;
border-radius: 8px !important;
font-weight: 600 !important;
padding: 6px 16px !important;
font-size: 0.75rem !important;
height: 34px !important;
}
/* Primary button (Send) */
button.primary {
background: linear-gradient(135deg, #0091ad 0%, #00a8c6 100%) !important;
border: none !important;
border-radius: 10px !important;
font-weight: 600 !important;
color: white !important;
}
button.primary:hover {
background: linear-gradient(135deg, #007a94 0%, #0091ad 100%) !important;
}
/* Dark mode primary button - brighter */
@media (prefers-color-scheme: dark) {
button.primary {
background: linear-gradient(135deg, #0891b2 0%, #22d3ee 100%) !important;
}
button.primary:hover {
background: linear-gradient(135deg, #0e7490 0%, #06b6d4 100%) !important;
}
}
.dark button.primary {
background: linear-gradient(135deg, #0891b2 0%, #22d3ee 100%) !important;
}
.dark button.primary:hover {
background: linear-gradient(135deg, #0e7490 0%, #06b6d4 100%) !important;
}
/* New button */
.new-btn {
gap: 0 !important;
}
.new-btn button {
background: var(--new-btn-bg) !important;
color: var(--new-btn-text) !important;
border: 1px solid var(--new-btn-border) !important;
height: 30px !important;
font-size: 0.7rem !important;
}
.new-btn button:hover {
background: var(--new-btn-hover-bg) !important;
border-color: var(--new-btn-hover-border) !important;
}
/* ============================================================
MESSAGE COUNTER & STATUS
============================================================ */
.message-counter {
text-align: center !important;
margin: 4px 0 !important;
padding: 0 !important;
}
.message-counter p {
display: inline-block !important;
background: transparent !important;
color: var(--text-muted) !important;
font-size: 0.7rem !important;
font-weight: 500 !important;
padding: 2px 0 !important;
margin: 0 !important;
}
.limit-msg {
text-align: center !important;
margin: 4px 0 !important;
}
.limit-msg p {
color: var(--text-secondary) !important;
font-size: 0.75rem !important;
font-weight: 500 !important;
margin: 0 !important;
}
.frozen-message {
text-align: center !important;
padding: 6px !important;
margin-top: 4px !important;
}
.frozen-message p {
color: var(--teal-primary) !important;
font-size: 0.8rem !important;
font-weight: 500 !important;
margin: 0 !important;
}
/* ============================================================
EXAMPLE BUTTONS
============================================================ */
.examples-section {
margin-top: 8px !important;
padding: 0 !important;
gap: 8px !important;
align-items: stretch !important;
display: flex !important;
flex-direction: row !important;
flex-wrap: nowrap !important;
}
.examples-section > .block {
flex: 0 0 auto !important;
min-width: 0 !important;
width: auto !important;
}
.examples-section > .block:first-child {
flex: 0 0 auto !important;
max-width: fit-content !important;
align-self: center !important;
}
.examples-section p {
font-size: 0.7rem !important;
color: var(--text-muted) !important;
font-weight: 500 !important;
margin: 0 !important;
white-space: nowrap !important;
flex-shrink: 0 !important;
}
.example-btn {
font-size: 0.68rem !important;
font-weight: 500 !important;
background: var(--example-bg) !important;
border: 1px solid var(--border-color) !important;
border-radius: 8px !important;
padding: 8px 12px !important;
color: var(--example-text) !important;
transition: all 0.15s ease !important;
white-space: normal !important;
text-align: center !important;
line-height: 1.3 !important;
flex: 1 1 0 !important;
min-width: 0 !important;
height: auto !important;
min-height: 50px !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
}
.example-btn:hover {
background: var(--teal-soft) !important;
border-color: var(--teal-primary) !important;
color: var(--teal-primary) !important;
}
/* ============================================================
FEEDBACK SECTION
============================================================ */
.feedback-section {
margin-top: 8px !important;
padding: 8px 12px !important;
background: var(--feedback-bg) !important;
border-radius: 8px !important;
border: 1px solid var(--border-color) !important;
display: flex !important;
align-items: center !important;
gap: 10px !important;
}
.feedback-section p {
font-size: 0.75rem !important;
font-weight: 500 !important;
color: var(--text-secondary) !important;
margin: 0 !important;
white-space: nowrap !important;
}
.feedback-section button {
font-size: 0.7rem !important;
font-weight: 500 !important;
padding: 4px 12px !important;
border-radius: 5px !important;
background: var(--bg-surface) !important;
border: 1px solid var(--border-color) !important;
color: var(--text-primary) !important;
}
.feedback-section button:hover {
background: var(--teal-soft) !important;
border-color: var(--teal-primary) !important;
}
.feedback-input {
margin-top: 6px !important;
}
.feedback-input textarea {
border-radius: 6px !important;
font-size: 0.8rem !important;
border: 1px solid var(--border-color) !important;
background: var(--bg-input) !important;
color: var(--text-primary) !important;
}
/* ============================================================
LOADING ANIMATION
============================================================ */
@keyframes shimmer {
0% { background-position: -200% center; }
100% { background-position: 200% center; }
}
@keyframes fadeInOut {
0%, 100% { opacity: 0.7; }
50% { opacity: 1; }
}
.loading-msg,
.loading-msg * {
border: none !important;
box-shadow: none !important;
outline: none !important;
}
.loading-msg {
text-align: center !important;
padding: 12px 20px !important;
background: linear-gradient(90deg, var(--teal-soft) 0%, var(--teal-light) 25%, var(--teal-soft) 50%, var(--teal-light) 75%, var(--teal-soft) 100%) !important;
background-size: 200% 100% !important;
animation: shimmer 2s ease-in-out infinite, fadeInOut 2s ease-in-out infinite !important;
border-radius: 10px !important;
}
.loading-msg p {
color: var(--teal-primary) !important;
font-size: 0.75rem !important;
font-weight: 500 !important;
margin: 0 !important;
}
.block.loading-msg {
border-width: 0 !important;
}
/* ============================================================
FOOTER
============================================================ */
.footer {
text-align: center !important;
margin-top: 12px !important;
padding: 8px !important;
}
.footer p {
color: var(--text-muted) !important;
font-size: 0.65rem !important;
font-weight: 400 !important;
margin: 0 !important;
}
/* ============================================================
MOBILE RESPONSIVE
============================================================ */
@media (max-width: 768px) {
/* Container padding for mobile */
.gradio-container {
padding: 12px !important;
}
/* Input textarea - smaller placeholder text, full width */
.input-row input,
.input-row textarea {
font-size: 0.8rem !important;
padding: 10px 12px !important;
max-width: 100% !important;
}
/* Feedback section - wrap on mobile */
.feedback-section {
flex-wrap: wrap !important;
justify-content: center !important;
padding: 10px !important;
gap: 8px !important;
}
.feedback-section p {
flex: 0 0 100% !important;
text-align: center !important;
margin-bottom: 4px !important;
}
.feedback-section button {
flex: 1 !important;
min-width: 80px !important;
}
/* Example buttons - stack on mobile */
.examples-section {
flex-wrap: wrap !important;
justify-content: center !important;
}
.examples-section > .block:first-child {
flex: 0 0 100% !important;
text-align: center !important;
}
.example-btn {
flex: 1 1 100% !important;
min-width: 100% !important;
max-width: 100% !important;
}
/* Header smaller on mobile */
.header-section h1,
.header-content h1 {
font-size: 1.3rem !important;
}
.header-section p,
.header-content p {
font-size: 0.75rem !important;
}
/* Buttons column - narrower on mobile */
.buttons-col {
min-width: 90px !important;
}
.buttons-col button {
min-width: 90px !important;
font-size: 0.7rem !important;
padding: 6px 10px !important;
}
}