3-5 New Charts - #8
Conversation
…r bucketing Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…pty experience trend - getToolUsageCounts now filters sefaria_tools_used to string entries before normalizing, so a non-string entry (null, number, etc.) in this free-text user-submitted field is skipped instead of throwing and blanking out all four Charts & Analytics charts via the outer catch handler. - Move the experienceTrend.length === 0 empty-state message inline (matching the pie chart's own conditional-render guard) instead of an early return, so the two bar charts and the pie chart still render when there's no experience-level data. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Shares VIBE_CODED_SERIES between submissionsTrend.js and ChartsAndAnalytics.jsx (mirroring the EXPERIENCE_LEVELS precedent) instead of hardcoding the strings twice, and adds a one-sentence caption noting vibe_coded is a newly-tracked field so the chart isn't misread as a real overnight trend reversal. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Extracts known technology names from the free-text tech_used_raw field via case-insensitive substring matching, with "Claude Code" checked and excluded first so it doesn't double-count toward the generic Claude/Anthropic API bucket. Shows the top 8 by project count as a horizontal bar chart, matching the existing keyword-frequency chart's style.
Reuses the fixed-order categorical hue palette already used in the charts (blue/orange/aqua/violet/magenta, gray for Uncategorized). Background and border are computed via color-mix() at low strength so each pill stays pale; text is mixed toward --text-h for a muted look instead of a fully saturated hue.
…chart
Recharts' category axis auto-hides tick labels it calculates would
overlap; interval={0} disables that, and the wider axis column gives
longer labels like "Claude/Anthropic API" room to fit.
Extracts the six recharts blocks out of ChartsAndAnalytics.jsx into dedicated presentational components (one file per chart), each owning its chart-specific colors/constants. ChartsAndAnalytics.jsx now only handles data fetching/derivation and renders each chart with props. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…, screenshot URL validation) - screenshots.test.js: update the positive-case test to expect the real manifest path now that screenshotManifest.json is populated, and add a case covering the numeric id form used by ProjectCard.jsx - index.css: give has-screenshot cards their own hover background on the scrim pseudo-element so hovering isn't washed out by the 88%-opacity overlay - generate-screenshots.mjs: validate project_link before navigating to it, rejecting non-http(s) schemes and localhost/private/link-local hosts to close an SSRF/file-read path from unauthenticated submissions
… link, tags+desc on back)
The flip-card's hidden face was still hit-testable in the region behind the visible face's centered content (backface-visibility only affects painting, not pointer events), so clicking the center of a flipped-back card could trigger the hidden front title's link instead of unflipping. Scope pointer-events to whichever face is currently visible. Also add a hover color (var(--accent)) on the project title link, per request, as a visual affordance that it's clickable.
…ip-away on text selection, remove stale CSS - Add visibility: hidden alongside pointer-events: none on the flipped front face so the title link is removed from the tab order and accessibility tree while visually hidden. - Guard the card's click-to-flip handler against active text selections so releasing a text-selection drag inside the back-face description no longer flips the card away. - Remove stale position: relative on .project-card (no longer needed now that faces position against .project-card-inner). - Update stale comment on .project-card-desc to reflect the back-face layout (no image/title/link on that face anymore).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Drops the manifest-driven local screenshot pipeline (generator script, public/screenshots/ images, screenshotManifest.json, getScreenshotUrl, and the ProjectCard background/hover CSS it drove) along with the puppeteer dependency it required. Screenshots are coming back later, backed by cloud storage instead of files committed to the repo. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…g, README, CSS Completes the previous commit, which only removed the screenshot files themselves. This drops the now-dead getScreenshotUrl import and background/hover CSS in ProjectCard, the puppeteer dependency and npm run screenshots script, and the README section documenting it. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Replaces the literal hex colors in categories.js's CATEGORY_COLORS with references to the --chart-* palette already defined in index.css, so the category-color source of truth is the same palette the charts use. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
📊 Code Quality Score: 61/100
Was this score accurate? 👍 Yes · 👎 No Scored by GitVelocity · How are scores calculated? |
saengel
left a comment
There was a problem hiding this comment.
Much better!
If we have time over the next few weeks, we can continue to refine and smooth things out :)
There was a problem hiding this comment.
Pull request overview
This PR expands the dashboard analytics by adding several new charts and refactoring chart rendering into reusable charts/types/* components, alongside new utilities for parsing/aggregating tool and technology usage. It also introduces a shared CSS variable color palette for consistent categorical coloring and updates the project card UI styling/interaction.
Changes:
- Add new trend/count utilities (
getSubmissionsTrendByVibeCoded,getToolUsageCounts,getTechCounts) with corresponding unit tests undersrc/utils/__tests__/. - Refactor chart rendering into reusable
BarChart,LineChart, andPieChartcomponents and wire up six charts inChartsAndAnalytics. - Introduce a shared chart color palette in
index.cssand use category-specific colors for category “pills”; updateProjectCardUI to a flip-card layout.
Reviewed changes
Copilot reviewed 23 out of 24 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| src/utils/techUsed.js | New utility to bucket free-text tech_used_raw into known technology counts. |
| src/utils/submissionsTrend.test.js | Removes the old submissions trend test file (tests moved under src/utils/__tests__/). |
| src/utils/submissionsTrend.js | Adds vibe-coded trend series/constants and improves trend builders with comments and new function. |
| src/utils/sefariaTools.js | New utility to normalize Sefaria endpoints and compute per-endpoint usage counts + “Other” bucket. |
| src/utils/categories.js | Adds a shared category→color mapping and getCategoryColor. |
| src/utils/tests/techUsed.test.js | Adds unit tests for technology counting/bucketing behavior. |
| src/utils/tests/submissionsTrend.test.js | Adds expanded tests for experience trend and new vibe-coded trend logic. |
| src/utils/tests/sefariaTools.test.js | Adds tests for endpoint normalization and tool usage aggregation rules. |
| src/utils/tests/experience.test.js | Fixes import path after test reorg into __tests__/. |
| src/utils/tests/categories.test.js | Adds tests validating distinct category colors and fallback behavior. |
| src/index.css | Adds chart palette CSS variables and updates dashboard controls + project card flip styling. |
| src/components/ProjectCard.jsx | Changes project card to a flip-card interaction and uses per-category pill colors. |
| src/components/Controls.jsx | Adds a class to the search input for styling. |
| src/components/ChartsAndAnalytics.jsx | Switches from inline Recharts usage to composed chart components; adds new charts/data sources. |
| src/components/charts/VibeCodedTrendChart.jsx | New chart component for vibe-coded vs not trend. |
| src/components/charts/types/PieChart.jsx | New reusable pie chart wrapper around Recharts. |
| src/components/charts/types/LineChart.jsx | New reusable line chart wrapper around Recharts with series config. |
| src/components/charts/types/BarChart.jsx | New reusable bar chart wrapper supporting horizontal/vertical layouts. |
| src/components/charts/ToolUsagePieChart.jsx | New pie chart for most-used Sefaria API endpoints. |
| src/components/charts/TechUsedChart.jsx | New vertical bar chart for technologies used. |
| src/components/charts/SubmissionsTrendChart.jsx | New bar chart for submissions over the last 12 months. |
| src/components/charts/KeywordFrequencyChart.jsx | New vertical bar chart for keyword frequency. |
| src/components/charts/ExperienceTrendChart.jsx | New line chart for submissions by experience level. |
| .gitignore | Ignores local worktrees and a data/ directory intended for sensitive local dumps. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| <div className="project-card" onClick={handleCardClick}> | ||
| <div className={`project-card-inner${flipped ? ' flipped' : ''}`}> | ||
| <div className="project-card-front"> | ||
| <a | ||
| className="project-card-title" |
| <LineChart | ||
| data={data} | ||
| title="Vibe-coded vs. not, tracked since July 2026" | ||
| description={'"Vibe-coded" is a newly-tracked field, so earlier months may be undercounted or unreported rather than confirmed non-vibe-coded.'} | ||
| series={VIBE_CODED_SERIES.map((series) => ({ |
📊 Code Quality Score: 61/100
Was this score accurate? 👍 Yes · 👎 No Scored by GitVelocity · How are scores calculated? |
Replaces #6, which GitHub will not allow reopening after a required history rewrite (a committed CSV with non-consented submission data was purged from this branch's git history via
git filter-repo, then force-pushed).Same underlying work as #6:
src/components/charts/, then further generalized into sharedtypes/{LineChart,BarChart,PieChart}components per review feedback on 3-5 New Charts #6src/utils/__tests__/Test plan
npm test(33/33 passing)npm run lint(clean)npm run build(clean)🤖 Generated with Claude Code