Prh v0.4.1 beta#13
Conversation
…s and fixes - FOIA Targets page at /analysis/foia with ScoreBadge, filters, pagination - ScoreBadge, TableSkeleton, EmptyState, ErrorBoundary components - Loading spinners on NetworkGraph and SankeyDiagram - Dashboard stat cards click-through; Export FOIA CSV - Cyberpunk neon UI: dark blue-black theme, card/sidebar/tab glows, glitch hover, scanlines - Fixes: Browse tab URL init, FOIA table columns, light contrast, search dropdown, network min-width - Docs: CHANGELOG, RELEASE_NOTES, FEATURES, FEATURE_ROADMAP updated - Screenshots directory and README relative paths Co-authored-by: Cursor <cursoragent@cursor.com>
…cs update - AnalysisOverview.tsx: distinct gradients for Entity Network (purple), Sankey (gold) cards - Add docs/development/PRH_DEVELOPMENT_ROADMAP.md (audit P0-P3) - CHANGELOG_v0.4.1Beta, RELEASE_NOTES_v0.4.1, FEATURE_ROADMAP, README updated - Rebuild frontend into backend/static Co-authored-by: Cursor <cursoragent@cursor.com>
- Flow top→bottom; nodes per layer spread horizontally - Links from bottom-center of source to top-center of target - Labels unchanged (no rotation), readable LTR - Rebuild frontend into backend/static Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Pull request overview
This PR introduces a comprehensive cyberpunk-themed UI overhaul for dark mode, adds a dedicated FOIA Targets page with quality scoring, and includes several UX improvements and bug fixes for the Project RawHorse application.
Changes:
- Added FOIA Targets page at
/analysis/foiawith sortable table, filters, pagination, and quality scoring (priority, specificity, likelihood) - Implemented cyberpunk aesthetic with deep blue-black backgrounds, neon purple/cyan/gold accents, glow effects, glitch hover animations, and scanline overlays in dark mode
- Added shared components (ScoreBadge, ErrorBoundary, TableSkeleton, EmptyState) for consistency and improved error handling
- Fixed UI bugs including Browse tab URL initialization, light mode contrast, search dropdown truncation, and network graph layout issues
- Updated documentation with new roadmap and feature tracking
Reviewed changes
Copilot reviewed 39 out of 51 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| frontend/src/pages/FoiaTargetsPage.tsx | New dedicated page for FOIA targets with sorting, filtering, pagination, and expandable quality notes |
| frontend/src/components/ScoreBadge.tsx | Shared component for consistent score display with type-specific thresholds |
| frontend/src/components/ErrorBoundary.tsx | Error boundary component with retry and home navigation options |
| frontend/src/components/EmptyState.tsx | Reusable empty state component with icon, title, description, and action slot |
| frontend/src/components/TableSkeleton.tsx | Wrapper around SkeletonLoader for table loading states |
| frontend/src/pages/Browse.tsx | Integrated ScoreBadge and EmptyState components; fixed tab URL initialization |
| frontend/src/pages/Dashboard.tsx | Converted stat cards to clickable links navigating to Browse tabs |
| frontend/src/pages/AnalysisOverview.tsx | Added FOIA Targets card with distinct color gradient |
| frontend/src/components/SearchBar.tsx | Added title tooltips to prevent text truncation issues |
| frontend/src/components/NetworkGraph.tsx | Added loading spinner with spin animation |
| frontend/src/components/SankeyDiagram.tsx | Added loading spinner and improved comments |
| frontend/src/pages/Export.tsx | Added FOIA Targets CSV export button |
| frontend/src/App.tsx | Wrapped all routes in ErrorBoundary; added /analysis/foia route |
| frontend/src/styles/theme.css | Added neon color variables and deep blue-black dark mode palette |
| frontend/src/App.css | Added neon glows, glitch animations, scanlines, and cyberpunk styling |
| frontend/src/index.css | Added neon cyan focus outlines for dark mode |
| backend/routers/export_router.py | Added FOIA targets CSV export endpoint |
| frontend/src/services/api.ts | Added exportFOIATargetsCSV function |
| README.md | Updated screenshot paths to use relative references |
| docs/development/PRH_DEVELOPMENT_ROADMAP.md | New roadmap with prioritized development tasks (P0-P3) |
| docs/RELEASE_NOTES_v0.4.1.md | Release notes documenting all v0.4.1 changes |
| CHANGELOG_v0.4.1Beta.md | Detailed changelog for beta release |
| frontend/package.json | Version bumped to 0.4.1 |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| @keyframes spin { | ||
| from { transform: rotate(0deg); } | ||
| to { transform: rotate(360deg); } | ||
| } | ||
|
|
There was a problem hiding this comment.
The @keyframes spin animation is defined separately in multiple CSS files (App.css, NetworkGraph.css, and SankeyDiagram.css). This creates duplication and potential maintenance issues if the animation needs to be modified. Consider:
- Moving the spin animation to a shared CSS file (like theme.css or a new animations.css)
- Or, if CSS modules or component-scoped styles are being used intentionally, this duplication may be acceptable
Note that the animation definitions are identical across all files, so consolidation would be beneficial.
| @keyframes spin { | |
| from { transform: rotate(0deg); } | |
| to { transform: rotate(360deg); } | |
| } |
| .card:hover, | ||
| .stat-card:hover { | ||
| animation: glitch 0.3s ease; | ||
| } | ||
|
|
||
| .card:hover::before, | ||
| .stat-card:hover::before { | ||
| content: ''; | ||
| position: absolute; | ||
| inset: 0; | ||
| background: rgba(0, 240, 255, 0.06); | ||
| pointer-events: none; | ||
| animation: glitchSlice 0.3s ease; | ||
| clip-path: inset(40% 0 50% 0); | ||
| transform: translate(-2px, 0); | ||
| z-index: 0; | ||
| } | ||
|
|
||
| .card:hover::after, | ||
| .stat-card:hover::after { | ||
| content: ''; | ||
| position: absolute; | ||
| inset: 0; | ||
| background: rgba(255, 215, 0, 0.06); | ||
| pointer-events: none; | ||
| animation: glitchSlice 0.3s ease; | ||
| clip-path: inset(40% 0 50% 0); | ||
| transform: translate(2px, 0); | ||
| z-index: 0; | ||
| } |
There was a problem hiding this comment.
The glitch hover animation on cards applies a position: absolute pseudo-element with inset: 0 which could obscure content or interfere with pointer events for interactive elements within the card. While pointer-events: none is set (good!), consider testing that:
- All buttons, links, and inputs within cards remain fully clickable during the hover animation
- The z-index layering is correct (the pseudo-elements have z-index: 0, but card content should have higher z-index if needed)
This is likely fine as implemented, but worth verifying with user testing.
| [data-theme="dark"] .main-content::after { | ||
| content: ''; | ||
| position: absolute; | ||
| inset: 0; | ||
| background: repeating-linear-gradient( | ||
| 0deg, | ||
| transparent, | ||
| transparent 2px, | ||
| rgba(0, 0, 0, 0.03) 2px, | ||
| rgba(0, 0, 0, 0.03) 4px | ||
| ); | ||
| pointer-events: none; | ||
| z-index: 1; | ||
| } |
There was a problem hiding this comment.
The scanline overlay on .main-content::after has z-index: 1 which could potentially overlap with card content. While cards have position: relative set (good!), child elements within cards may not have explicit z-index values and could be obscured by the scanline effect. Consider either:
- Removing the z-index from the scanline overlay (letting it default to 0)
- Adding
position: relativeto.main-content > *to ensure all direct children establish their own stacking context - Setting a higher z-index on
.cardor its children
This is primarily a cosmetic concern but could affect interactive elements like buttons or inputs within cards.
|
@copilot open a new pull request to apply changes based on the comments in this thread |
|
@ConsciousEnergy I've opened a new pull request, #14, to work on those changes. Once the pull request is ready, I'll request review from you. |
[WIP] Update application aesthetics for retro-cyber punk feel in UI/UX
Prh v0.4.1 beta UI/UX Improvements with more aesthetic cosmetics.
Summary
Motivation / Context
To create a little more aesthetic and cosmetic appeal to users.
Testing
cd frontend && npm run build)Screenshots (if UI change)
Data Changes (if data contribution)
Checklist