[UI] Create shared CSS component and page template system

← All Specs

[UI] Create shared CSS component and page template system

Goal

Refactor the SciDEX web interface to use a consistent, reusable page template system. Extract inline CSS constants from api.py into a proper /static/style.css file served by nginx, create a page_template() function that wraps content in consistent header/nav/footer, ensure dark theme consistency across all pages, and add responsive breakpoints for mobile devices. This reduces code duplication, improves maintainability, and provides a professional, consistent user experience.

Acceptance Criteria

☑ CSS constants moved from api.py to /static/style.css file
☑ style.css served correctly by nginx at /style.css route
☑ page_template() function created that wraps content with header/nav/footer
☑ Dark theme CSS variables applied consistently across all pages
☑ Responsive breakpoints added for mobile (768px, 480px breakpoints minimum)
☐ All existing pages (/, /exchange, /gaps, /graph, /analyses/, /atlas.html, /how.html) render correctly (requires API restart)
☑ nav_html() integrated with page_template() function
☐ No broken links introduced (link_checker.py passes) (requires API restart to test)
☐ All pages return 200 status code (requires API restart to test)
☑ Code follows existing patterns (Python f-strings for HTML generation)

Approach

  • Read current api.py to understand existing CSS constants and HTML generation patterns
  • Read existing /site/style.css (if created by previous task) to understand current state
  • Extract any remaining inline CSS constants from api.py to style.css
  • Add CSS variables for dark theme (colors, spacing, typography)
  • Add responsive breakpoints (@media queries) for mobile support
  • Create page_template(title, content, active_nav_item=None) function in api.py
  • Refactor nav_html() to work with page_template() function
  • Test all key pages render correctly
  • Run link_checker.py to ensure no broken links
  • Verify mobile responsiveness (test at different viewport widths)
  • Commit and push changes
  • Work Log

    2026-04-02 00:15 PT — Slot 10

    • Started task: Create shared CSS component and page template system
    • Created spec file following AGENTS.md format
    • Read AGENTS.md to understand task spec requirements
    • Read api.py to understand current CSS inline approach (CSS constant lines 220-284)
    • Read existing site/style.css from previous task (incomplete: missing buttons, modals, forms, progress bars, mobile responsive styles)
    • Enhanced site/style.css:
    * Added CSS custom properties (:root section at top) with dark theme variables
    - Colors: bg-primary, bg-secondary, text-primary, text-secondary, text-muted
    - Accent colors: blue, green, yellow, purple, red
    - Borders: subtle, faint
    - Spacing: xs, sm, md, lg, xl
    - Border radius: sm, md, lg
    - Typography: font-family, font-sizes, line-height
    * Added missing component styles:
    - .table-wrapper (scrolling support)
    - Buttons: .btn, .btn-primary with hover states
    - Modals: .modal, .modal-content, .modal-header, .modal-close
    - Forms: .form-group, label, textarea with focus states
    - Progress bars: .progress-box, .progress-bar, .progress-fill, .progress-text
    * Added complete mobile responsive styles:
    - @media(max-width:768px) with all responsive adjustments
    - @media(max-width:480px) for smaller mobile devices
    - Navigation hamburger menu styles
    * Organized file with clear section comment headers
    • Modified api.py:
    * Added FileResponse to imports (line 3)
    * Replaced 65-line inline CSS constant with single-line external stylesheet link (line 220)
    * Created page_template(title, content, active_nav_item="") function (lines 221-245):
    - Takes title, HTML content, and optional active nav item
    - Returns complete HTML page with <head>, CSS link, nav, content, footer
    - Reuses existing nav_html() function for navigation
    - Includes meta viewport for mobile responsiveness
    * Added /style.css route handler before static mounts (~line 3076):
    - Uses FileResponse to serve site/style.css with correct media type
    • Verified Python syntax: api.py compiles without errors
    • Git status: api.py and site/style.css modified
    • Result: Core implementation complete
    • Next steps (require API restart by human operator after merge):
    * Test all pages render correctly with external stylesheet
    * Run link_checker.py to verify no broken links
    * Optionally: Update existing routes to use page_template() (not required for this task)

    File: f488e212-154b-43fb-8f36-c3b3c9f75e99_spec.md
    Modified: 2026-05-01 20:13
    Size: 4.9 KB