Skip to content

Commit fc54491

Browse files
enhanced ui ux and fixed some running issues
1 parent f26ef9d commit fc54491

2 files changed

Lines changed: 45 additions & 25 deletions

File tree

src/book_recommender/config.py

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
--accent: #7dd3fc;
3333
--accent-strong: #38bdf8;
3434
--accent-2: #a78bfa;
35+
--success: #4ade80;
36+
--shadow: rgba(0,0,0,0.3);
3537
}
3638
:root[data-theme='light'] {
3739
--bg: #f8fafc;
@@ -42,28 +44,44 @@
4244
--accent: #0ea5e9;
4345
--accent-strong: #0284c7;
4446
--accent-2: #6366f1;
47+
--success: #22c55e;
48+
--shadow: rgba(0,0,0,0.08);
4549
}
46-
.gradio-container, body {background: radial-gradient(circle at 20% 20%, #0b1224, #050914 55%) !important; color: var(--text) !important; font-family: 'Inter', 'Segoe UI', system-ui, sans-serif !important; margin: 0;}
47-
:root[data-theme='light'] .gradio-container, :root[data-theme='light'] body {background: #f1f5f9 !important;}
48-
.panel {background: var(--panel); border: 1px solid var(--border); border-radius: 16px; padding: 18px; box-shadow: 0 18px 36px rgba(0,0,0,0.25);}
50+
* {transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease, transform 0.15s ease;}
51+
.gradio-container, body {background: radial-gradient(circle at 20% 20%, #0b1224, #050914 55%) !important; color: var(--text) !important; font-family: 'Inter', 'Segoe UI', system-ui, sans-serif !important; margin: 0; line-height: 1.6;}
52+
:root[data-theme='light'] .gradio-container, :root[data-theme='light'] body {background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%) !important;}
53+
.panel {background: var(--panel); border: 1px solid var(--border); border-radius: 20px; padding: 24px; box-shadow: 0 20px 40px var(--shadow); backdrop-filter: blur(10px);}
4954
.panel ul, .panel li, .panel p {color: var(--text) !important;}
55+
.panel ul {margin: 12px 0; padding-left: 20px;}
56+
.panel li {margin: 8px 0; line-height: 1.5;}
5057
.accent {color: var(--accent-strong);}
51-
.btn-primary {background: linear-gradient(120deg,var(--accent-strong),var(--accent-2)); color: #0b1021; font-weight: 700; border: none; min-height: 44px;}
52-
.pill {display: inline-block; padding: 6px 10px; border-radius: 999px; background: rgba(125,211,252,0.12); color: var(--accent); font-size: 12px; margin-right: 8px;}
53-
.headline {font-size: 26px; font-weight: 800; color: var(--text) !important;}
54-
.subhead {color: var(--muted) !important; margin-top: 6px;}
55-
.label {color: var(--muted) !important; font-size: 13px;}
56-
.cards {display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 12px;}
57-
.card {background: var(--panel); border: 1px solid var(--border); border-radius: 14px; padding: 12px; box-shadow: 0 10px 24px rgba(0,0,0,0.16); min-height: 120px;}
58-
.card img {width: 100%; height: 180px; object-fit: cover; border-radius: 10px; margin-bottom: 8px; background: var(--border);}
59-
.card h4 {margin: 6px 0; font-size: 16px; color: var(--text);}
60-
.card p {margin: 4px 0; color: var(--muted); font-size: 13px;}
61-
.toolbar {display: flex; flex-wrap: wrap; gap: 10px; align-items: center;}
62-
.ghost-btn {background: transparent; border: 1px solid var(--border); color: var(--text); border-radius: 10px; padding: 10px 12px; min-height: 44px;}
58+
.btn-primary {background: linear-gradient(135deg,var(--accent-strong),var(--accent-2)) !important; color: #ffffff !important; font-weight: 700; border: none !important; min-height: 48px; border-radius: 12px; cursor: pointer; box-shadow: 0 4px 12px rgba(56,189,248,0.3);}
59+
.btn-primary:hover {transform: translateY(-2px); box-shadow: 0 6px 20px rgba(56,189,248,0.4);}
60+
.btn-primary:active {transform: translateY(0);}
61+
.pill {display: inline-block; padding: 8px 16px; border-radius: 999px; background: linear-gradient(135deg, rgba(125,211,252,0.15), rgba(167,139,250,0.15)); color: var(--accent); font-size: 13px; font-weight: 600; margin-right: 8px; border: 1px solid var(--accent);}
62+
.headline {font-size: 32px; font-weight: 900; color: var(--text) !important; letter-spacing: -0.5px; margin-bottom: 8px;}
63+
.subhead {color: var(--muted) !important; margin-top: 6px; font-size: 15px; line-height: 1.6;}
64+
.label {color: var(--muted) !important; font-size: 14px; font-weight: 600; margin-bottom: 8px;}
65+
.cards {display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 16px; margin-top: 16px;}
66+
.card {background: var(--panel); border: 1px solid var(--border); border-radius: 16px; padding: 0; box-shadow: 0 8px 24px var(--shadow); overflow: hidden; min-height: 140px; cursor: pointer;}
67+
.card:hover {transform: translateY(-4px); box-shadow: 0 12px 32px var(--shadow); border-color: var(--accent);}
68+
.card img {width: 100%; height: 200px; object-fit: cover; margin-bottom: 0; background: linear-gradient(135deg, var(--border), var(--panel));}
69+
.card > a {text-decoration: none; display: block;}
70+
.card > a > div {padding: 16px;}
71+
.card h4 {margin: 0 0 8px 0; font-size: 17px; font-weight: 700; color: var(--text) !important; line-height: 1.4;}
72+
.card p {margin: 4px 0; color: var(--muted) !important; font-size: 13px; line-height: 1.5;}
73+
.toolbar {display: flex; flex-wrap: wrap; gap: 12px; align-items: center; margin-top: 16px;}
74+
.ghost-btn {background: var(--panel) !important; border: 1px solid var(--border) !important; color: var(--text) !important; border-radius: 12px; padding: 10px 16px; min-height: 48px; cursor: pointer; font-weight: 600;}
75+
.ghost-btn:hover {background: var(--border) !important; transform: translateY(-1px);}
76+
.ghost-btn:active {transform: translateY(0);}
77+
input[type="text"], textarea, select {background: var(--panel) !important; border: 2px solid var(--border) !important; color: var(--text) !important; border-radius: 12px !important; padding: 12px !important; font-size: 14px !important;}
78+
input[type="text"]:focus, textarea:focus, select:focus {border-color: var(--accent) !important; outline: none !important; box-shadow: 0 0 0 3px rgba(56,189,248,0.1) !important;}
6379
@media (max-width: 768px) {
64-
.panel {padding: 14px;}
80+
.panel {padding: 18px; border-radius: 16px;}
6581
.toolbar {flex-direction: column; align-items: stretch;}
6682
.ghost-btn, .btn-primary {width: 100%;}
83+
.headline {font-size: 26px;}
84+
.cards {grid-template-columns: 1fr;}
6785
}
6886
"""
6987

src/book_recommender/ui.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,23 @@
88

99
def _render_cards(books: list[dict]) -> str:
1010
if not books:
11-
return "<p class='label'>No Google Books hints for this query.</p>"
11+
return "<div style='color: var(--muted); font-style: italic; padding: 20px; text-align: center;'>No books found for this query.</div>"
1212
parts = []
1313
for book in books:
1414
thumb = book.get("thumbnail", "")
1515
link = book.get("link", "") or "#"
1616
title = book.get("title", "Unknown title")
1717
authors = book.get("authors", "Unknown author")
18-
desc = book.get("description", "")
18+
desc = (book.get("description", "") or "")[:180]
1919
parts.append(
2020
"<div class='card'>"
2121
f"<a href='{link}' target='_blank' rel='noopener noreferrer'>"
22-
+ (f"<img src='{thumb}' alt='cover' />" if thumb else "")
22+
+ (f"<img src='{thumb}' alt='cover' />" if thumb else "<div style='height:200px;background:var(--border);'></div>")
23+
+ "<div>"
2324
+ f"<h4>{title}</h4>"
24-
f"<p><strong>{authors}</strong></p>"
25-
+ (f"<p>{desc}</p>" if desc else "")
25+
f"<p style='font-weight:600;'>{authors}</p>"
26+
+ (f"<p>{desc}...</p>" if desc else "")
27+
+ "</div>"
2628
+ "</a></div>"
2729
)
2830
return "<div class='cards'>" + "".join(parts) + "</div>"
@@ -72,7 +74,7 @@ def on_load_session(selection, history):
7274

7375
with gr.Blocks() as demo:
7476
history_state = gr.State([])
75-
gr.Markdown("<div class='pill'>HCD-first</div>", elem_id="pill-top")
77+
gr.Markdown("<div class='pill'>📚 AI-Powered</div>", elem_id="pill-top")
7678
gr.Markdown(
7779
f"<div class='headline'>{APP_TITLE}</div>"
7880
f"<div class='subhead'>{APP_SUBTITLE}</div>"
@@ -129,9 +131,9 @@ def on_load_session(selection, history):
129131
)
130132

131133
with gr.Row(elem_classes=["toolbar"]):
132-
btn = gr.Button("Recommend!", elem_classes=["btn-primary"], scale=2)
133-
btn_refresh = gr.Button("Refresh (new spin)", elem_classes=["ghost-btn"], scale=1)
134-
btn_copy = gr.Button("Copy list", elem_classes=["ghost-btn"], scale=1)
134+
btn = gr.Button("✨ Get Recommendations", elem_classes=["btn-primary"], scale=2)
135+
btn_refresh = gr.Button("🔄 New Spin", elem_classes=["ghost-btn"], scale=1)
136+
btn_copy = gr.Button("📋 Copy List", elem_classes=["ghost-btn"], scale=1)
135137

136138
output = gr.Markdown(label="Recommendations", value="")
137139
external_view = gr.Markdown(label="Google Books hints", value="", elem_classes=["label"])

0 commit comments

Comments
 (0)