Commit Graph
11 Commits
Author SHA1 Message Date
shinalokandClaude Sonnet 4.6 f987df5da5 UI/UX D4: Gemini-style sidebar, welcome glow, pill input, chips, icon controls, history
- app.py: remove gr.Tab, add youlbot-sidebar Column + 3 panel Columns (D4-1)
- app.py: _welcome_html() radial gradient glow + personalized greeting (D4-2)
- app.py: pill-input CSS border-radius:24px, circular send button (D4-3)
- app.py: _example_chips_html() + JS fillInput() replacing gr.Examples (D4-4)
- app.py: icon buttons 💾/🗑, compact ctrl-check layout (D4-5)
- app.py: JS saveChatToHistory/renderChatHistory localStorage max 20 (D4-6)
- app.py: sidebar toggle (☰), dark mode btn, user selector in sidebar
- app.py: respond/reset_chat/switch_user yield welcome_view visibility
- ROADMAP.md: mark all D4 items complete

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 16:58:18 +09:00
shinalokandClaude Sonnet 4.6 1110fa14c7 docs: add D4 Gemini-style UI renewal roadmap based on design mockup
Analyzed design mockup (Gemini-style) vs current UI and documented:
- D4-1: left sidebar layout replacing top tabs
- D4-2: welcome view with personalized greeting + glow gradient
- D4-3: pill-shaped input with center/bottom position transition
- D4-4: example question chip cards (gr.HTML replacing gr.Examples)
- D4-5: control panel iconification with popup panel
- D4-6: conversation history in sidebar via localStorage

Includes comparison table, implementation difficulty ratings, and checklist.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 15:10:52 +09:00
shinalokandClaude Sonnet 4.6 ab437d5d2e UI/UX D3: dark mode toggle, chat export, accessibility, onboarding modal
- app.py: _JS with dark mode toggle (localStorage + system preference) (D3-17)
- app.py: dark mode CSS overrides for custom chat bubble colors (D3-17)
- app.py: export_chat() -> gr.File .md download button in controls row (D3-18)
- app.py: JS aria-label/role/aria-live injection for chatbot and inputs (D3-19)
- app.py: :focus-visible CSS 3px blue outline for keyboard navigation (D3-19)
- app.py: first-visit onboarding modal with localStorage guard (D3-20)
- app.py: js=_JS wired into gr.Blocks()
- ROADMAP.md: mark all D3 items complete

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 14:45:49 +09:00
shinalokandClaude Sonnet 4.6 fb438864b1 UI/UX D2: branded header, custom theme, bubble styles, streaming animation, responsive
- app.py: styled HTML header with robot icon + subtitle (D2-11)
- app.py: gr.themes.Soft(blue/indigo/slate) applied to gr.Blocks (D2-12)
- app.py: user_selector moved to header Row, right-aligned scale=0 (D2-13)
- app.py: .message-wrap .user/.bot custom background + border-radius CSS (D2-14)
- app.py: streaming-indicator blink animation on _live_html (D2-15)
- app.py: @media max-width:768px responsive CSS (D2-16)
- ROADMAP.md: mark all D2 items complete

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 14:41:51 +09:00
shinalokandClaude Sonnet 4.6 c1a28bfdcc UI/UX D1: examples, image accordion, layout improvements, table select, button size
- app.py: add gr.Examples with 3 sample questions (D1-5)
- app.py: wrap image input in gr.Accordion(open=False) (D1-6)
- app.py: checkboxes left Column(scale=3), reset btn right Column(scale=1) (D1-7)
- app.py: msg_box lines=2, send_btn .send-btn CSS min-height 80px (D1-8)
- app.py: doc_table.select -> select_doc_row auto-fills delete_source (D1-9)
- app.py: ingest_btn scale=0 min_width=200 to avoid full-width stretch (D1-10)
- ROADMAP.md: mark all D1 items complete

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 14:28:21 +09:00
shinalokandClaude Sonnet 4.6 e08b43c785 UI/UX D0: fix Textbox label, hide audio accordion, hide footer, hide ingest result box
- app.py: show_label=False on msg_box to remove "Textbox" label
- app.py: wrap audio input in gr.Accordion(open=False) to hide microphone error on load
- app.py: add CSS to hide Gradio footer branding
- app.py: ingest_status starts visible=False; ingest_files returns gr.update(visible=True)
- ROADMAP.md: add UI/UX design improvement section (D0–D3) and mark D0 complete

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 14:25:54 +09:00
shinalokandClaude Sonnet 4.6 974bab7cd8 Phase 28: P3 — Pydantic Settings, dependency-injector IoC, tenacity retry
- config.py: dataclasses → pydantic-settings BaseSettings (flat AppConfig,
  env vars auto-loaded from .env, type-safe validation)
- api_client.py: HTTPAPIClient takes AppConfig directly (APIConfig removed);
  tenacity retry on 5 methods (reset/ingest/list/delete/feedback) —
  retries on 5xx + TransportError, 3 attempts, exponential backoff 1-8s
- container.py: manual DI → dependency_injector DeclarativeContainer with
  providers.Singleton; Container() needs no args
- app.py: container.X → container.X() calls, remove AppConfig import
- requirements.txt: add pydantic-settings, tenacity, dependency-injector

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 05:59:23 +09:00
shinalokandClaude Sonnet 4.6 148211e236 Phase 27: P2 quality improvements — logging, httpx pooling, validation, tests
- app.py: replace print() with logging, basicConfig with LOG_LEVEL env var
- api_client.py: shared AsyncClient instance (connection pooling), URL-encode
  delete_document path parameter, aclose() for cleanup
- services/document.py: validate file exists and extension before ingest
- tests/: ChatService (4) + DocumentService (6) unit tests via pytest-asyncio
- pyproject.toml: asyncio_mode = auto
- requirements-dev.txt: pytest, pytest-asyncio

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01 17:52:43 +09:00
shinalokandClaude Sonnet 4.6 511c87b290 docs: update ROADMAP to reflect P0/P1 completion and services/ package structure
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01 17:46:53 +09:00
shinalokandClaude Sonnet 4.6 d81a2f5888 Phase 26: P1 architecture refactor — DI container, service layer, async callbacks
- config.py: APIConfig + AppConfig dataclasses, env vars centralized
- api_client.py: APIClientProtocol (Protocol) + HTTPAPIClient class, remove module-level globals
- services.py: ChatService, DocumentService, TTSService (TTS moved from app.py)
- container.py: manual DI container with lazy singleton properties
- app.py: all callbacks converted to async, asyncio.run() fully removed, container wired in
- .env.example: add TTS_EDGE_VOICE entry
- ROADMAP.md: P0/P1 checklist updated to reflect completed work

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01 17:36:35 +09:00
shinalok 5ea7948ed3 Add project roadmap outlining improvements and priorities 2026-06-01 16:42:37 +09:00