feat: Added scale(1.02) hover to all 6 card types, cardEnter stagger an…
- "frontend/src/App.css" - "frontend/src/pages/Home.tsx" - "frontend/src/pages/TopicsBrowse.tsx" - "frontend/src/pages/CreatorDetail.tsx" - "frontend/src/pages/SubTopicPage.tsx" - "frontend/src/pages/SearchResults.tsx" GSD-Task: S01/T01
This commit is contained in:
parent
9296cd4df8
commit
d94995453e
21 changed files with 1381 additions and 647 deletions
|
|
@ -26,3 +26,4 @@
|
|||
| D018 | M004/S04 | architecture | Version snapshot failure handling strategy in stage 5 | Best-effort versioning — snapshot INSERT failure logs ERROR but does not block page update (existing content overwrites proceed regardless) | Versioning is a diagnostic/benchmarking feature. Losing a version snapshot is far less damaging than failing the entire page synthesis. Follows the same non-blocking side-effect pattern established in D005 for embedding/Qdrant failures. | Yes | agent |
|
||||
| D019 | M005/S02 | frontend-layout | Technique page layout structure | CSS grid 2-column layout: 1fr main + 22rem sticky sidebar, collapsing to single column at 768px. Page max-width widened from 48rem to 64rem. | 22rem sidebar provides enough room for moment cards and plugin lists without cramming. 64rem total width accommodates both columns comfortably on standard desktop displays. Sticky sidebar keeps navigation aids visible while scrolling prose. 768px breakpoint aligns with existing mobile styles in the codebase. | Yes | agent |
|
||||
| D020 | M006/S05 | frontend | Topics page card layout visual differentiation approach | 3px colored left border + small colored dot next to category name, using existing badge CSS custom properties per category | Subtler than a full colored header — maintains dark theme cohesion while providing clear visual differentiation between 7 category cards. Reuses existing --color-badge-cat-*-bg/text custom properties, avoiding new color definitions. | Yes | agent |
|
||||
| D021 | M011 | scope | Which UI/UX assessment findings to implement in M011 | 12 of 16 findings approved; F01 (beginner paths), F02 (YouTube links), F03 (hide admin), F15 (CTA label) denied | User triaged each finding individually. Denied F01 because audience knows what they want. Denied F02 because no video URLs / don't want to link out. Denied F03 because admin dropdown is fine as-is. Denied F15 as low-value. | Yes | human |
|
||||
|
|
|
|||
|
|
@ -59,3 +59,4 @@ Ten milestones complete. The system is deployed and running on ub01 at `http://u
|
|||
| M008 | Credibility Debt Cleanup — Broken Links, Test Data, Jargon, Empty Metrics | ✅ Complete |
|
||||
| M009 | Homepage & First Impression | ✅ Complete |
|
||||
| M010 | Discovery, Navigation & Visual Identity | ✅ Complete |
|
||||
| M011 | Interaction Polish, Navigation & Accessibility | 🔄 Active |
|
||||
|
|
|
|||
|
|
@ -89,3 +89,107 @@
|
|||
**Description:** A producer mid-session can find a specific technique in under 30 seconds from Alt+Tab to reading the key insight.
|
||||
**Validation:** Timed test: Alt+Tab → search → read technique → under 30 seconds.
|
||||
**Primary Owner:** M001/S05
|
||||
|
||||
## R016 — Card Hover Animations & Staggered Entrance
|
||||
**Status:** active
|
||||
**Description:** All technique/content cards animate on hover (scale + shadow transition). Card grids use staggered fade-in-up entrance animations on page load.
|
||||
**Validation:** Cards visually respond to hover with smooth 200ms transition. Grid cards appear sequentially on page load.
|
||||
**Primary Owner:** M011/S01
|
||||
|
||||
## R017 — Featured Technique Visual Redesign
|
||||
**Status:** active
|
||||
**Description:** Featured Technique section on homepage has a visually distinct treatment (gradient border, glow, or full-bleed) that differentiates it from ordinary cards.
|
||||
**Validation:** Featured technique is visually prominent and clearly distinct from regular technique cards.
|
||||
**Primary Owner:** M011/S01
|
||||
|
||||
## R018 — Random Technique Discovery
|
||||
**Status:** active
|
||||
**Description:** A "Random Technique" button exists that navigates to a randomly selected technique page.
|
||||
**Validation:** Clicking the button loads a different technique each time.
|
||||
**Primary Owner:** M011/S01
|
||||
|
||||
## R019 — Topics Page Default-Collapsed
|
||||
**Status:** active
|
||||
**Description:** Topics page loads with all categories collapsed, showing only category cards. Clicking a category expands its sub-topics with a smooth slide animation.
|
||||
**Validation:** Page loads collapsed. Click expands with animation. Click again collapses.
|
||||
**Primary Owner:** M011/S02
|
||||
|
||||
## R020 — Global Search in Navigation
|
||||
**Status:** active
|
||||
**Description:** A compact search input in the navigation bar is available on all pages except the homepage. Cmd+K (or /) keyboard shortcut focuses it from any page.
|
||||
**Validation:** Search bar visible in nav on Topics, Creators, Technique, About pages. Cmd+K focuses it.
|
||||
**Primary Owner:** M011/S03
|
||||
|
||||
## R021 — Mobile Hamburger Menu
|
||||
**Status:** active
|
||||
**Description:** Navigation uses a hamburger menu on viewports below 768px with generous touch targets (44×44px minimum).
|
||||
**Validation:** Mobile viewport shows hamburger icon. Tapping reveals nav items. Touch targets meet minimum size.
|
||||
**Primary Owner:** M011/S03
|
||||
|
||||
## R022 — Heading Hierarchy Fix
|
||||
**Status:** active
|
||||
**Description:** Every page has exactly one H1 element. Heading levels are sequential (no skips from H1 to H3).
|
||||
**Validation:** DOM inspection confirms single H1 per page and sequential heading levels.
|
||||
**Primary Owner:** M011/S04
|
||||
|
||||
## R023 — Skip-to-Content Link
|
||||
**Status:** active
|
||||
**Description:** A visually hidden skip link is the first focusable element on every page, visible on keyboard focus.
|
||||
**Validation:** Tab from page load shows "Skip to content" link. Clicking it jumps to main content area.
|
||||
**Primary Owner:** M011/S04
|
||||
|
||||
## R024 — Text Contrast AA Compliance
|
||||
**Status:** active
|
||||
**Description:** All text meets WCAG AA contrast ratios (4.5:1 for normal text, 3:1 for large text) against the dark background.
|
||||
**Validation:** Secondary text color passes 4.5:1 contrast check against page background.
|
||||
**Primary Owner:** M011/S04
|
||||
|
||||
## R025 — Page-Specific Document Titles
|
||||
**Status:** active
|
||||
**Description:** Each route sets a descriptive document title (e.g., "Bass — Sound Design — Chrysopedia", "COPYCATT — Chrysopedia").
|
||||
**Validation:** Browser tab shows distinct title per page. Navigating between pages updates the title.
|
||||
**Primary Owner:** M011/S04
|
||||
|
||||
## R026 — Creator Stats Topic-Colored Pills
|
||||
**Status:** active
|
||||
**Description:** Creator detail page stats line rendered as topic-colored pill badges instead of run-on text.
|
||||
**Validation:** Stats show as visually distinct colored pills grouped by topic category.
|
||||
**Primary Owner:** M011/S02
|
||||
|
||||
## R027 — Tag Overflow Limit on Cards
|
||||
**Status:** active
|
||||
**Description:** Technique cards show a maximum of 4 tags, with a "+N more" indicator for additional tags.
|
||||
**Validation:** Cards with >4 tags show exactly 4 plus a "+N more" badge.
|
||||
**Primary Owner:** M011/S02
|
||||
|
||||
## R028 — Empty Subtopic Handling
|
||||
**Status:** active
|
||||
**Description:** Sub-topics with 0 techniques either hidden by default or display a "Coming soon" badge.
|
||||
**Validation:** Empty subtopics are visually distinguished or hidden. No dead-end clicks.
|
||||
**Primary Owner:** M011/S02
|
||||
|
||||
## Denied / Out of Scope
|
||||
|
||||
## R029 — Beginner Learning Paths
|
||||
**Status:** out-of-scope
|
||||
**Description:** Curated beginner learning paths with skill-level tags and "New to Production?" section.
|
||||
**Validation:** n/a
|
||||
**Notes:** Denied — audience knows what they're looking for. Assessment F01.
|
||||
|
||||
## R030 — YouTube Deep Links on Key Moments
|
||||
**Status:** out-of-scope
|
||||
**Description:** Key moment timestamps link to source YouTube videos at the correct time.
|
||||
**Validation:** n/a
|
||||
**Notes:** Denied — no video URLs in data model / don't want to link out. Assessment F02.
|
||||
|
||||
## R031 — Hide Admin Dropdown
|
||||
**Status:** out-of-scope
|
||||
**Description:** Admin dropdown hidden from public visitors behind auth or flag.
|
||||
**Validation:** n/a
|
||||
**Notes:** Denied — fine as-is. Assessment F03.
|
||||
|
||||
## R032 — CTA Label Changes
|
||||
**Status:** out-of-scope
|
||||
**Description:** Change "Start Exploring" to more descriptive CTA text.
|
||||
**Validation:** n/a
|
||||
**Notes:** Denied — skipped. Assessment F15.
|
||||
|
|
|
|||
118
.gsd/milestones/M011/M011-CONTEXT.md
Normal file
118
.gsd/milestones/M011/M011-CONTEXT.md
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
# M011: Interaction Polish, Navigation & Accessibility
|
||||
|
||||
**Gathered:** 2026-03-31
|
||||
**Status:** Ready for planning
|
||||
|
||||
## Project Description
|
||||
|
||||
Chrysopedia is a music production knowledge base with a React/TypeScript frontend, FastAPI backend, and Docker Compose deployment on ub01. The UI/UX assessment (March 31, 2026) identified 16 findings — 12 were approved for implementation, 4 denied. This milestone addresses the approved findings.
|
||||
|
||||
## Why This Milestone
|
||||
|
||||
The assessment found the site "functionally competent but emotionally flat" — adequate for expert users who know what they want, but lacking the interaction polish, discovery mechanisms, and accessibility compliance that would make it engaging and professional. The approved scope targets three themes: visual delight (hover animations, staggered entrances, featured technique redesign, random discovery), usability (topics collapse, global search, mobile hamburger, creator stats, tag overflow, empty subtopics), and accessibility (heading hierarchy, skip link, contrast, page titles).
|
||||
|
||||
## User-Visible Outcome
|
||||
|
||||
### When this milestone is complete, the user can:
|
||||
|
||||
- See cards animate on hover and stagger in on page load across all listing pages
|
||||
- Click "Random Technique" to discover a random technique page
|
||||
- Browse Topics page with collapsed categories that expand smoothly on click
|
||||
- Search from any page via a compact nav search bar or Cmd+K shortcut
|
||||
- Navigate on mobile via a hamburger menu with proper touch targets
|
||||
- See creator topic distribution as colored pills instead of run-on text
|
||||
- See clean cards with max 4 tags and "+N more" overflow
|
||||
- Navigate with proper heading hierarchy, skip link, and WCAG AA contrast
|
||||
|
||||
### Entry point / environment
|
||||
|
||||
- Entry point: http://ub01:8096 (or http://chrysopedia.com)
|
||||
- Environment: Docker Compose on ub01
|
||||
- Live dependencies involved: PostgreSQL (random technique endpoint), existing API
|
||||
|
||||
## Completion Class
|
||||
|
||||
- Contract complete means: frontend builds with 0 errors, all visual changes render correctly
|
||||
- Integration complete means: random technique endpoint returns valid data, global search navigates correctly
|
||||
- Operational complete means: deployed to ub01 and verified in browser
|
||||
|
||||
## Final Integrated Acceptance
|
||||
|
||||
To call this milestone complete, we must prove:
|
||||
|
||||
- Cards animate on hover and stagger entrance on all listing pages
|
||||
- Random technique button navigates to a real technique page
|
||||
- Topics page loads collapsed and expands with animation
|
||||
- Global search works from non-home pages with Cmd+K shortcut
|
||||
- Mobile hamburger menu works at narrow viewports
|
||||
- Lighthouse accessibility score improved (heading hierarchy, contrast, skip link, titles)
|
||||
|
||||
## Risks and Unknowns
|
||||
|
||||
- CSS animation performance on lower-end devices — keep transforms GPU-composited (transform, opacity only)
|
||||
- Global search in nav may conflict with existing SearchAutocomplete component sizing — need compact variant
|
||||
- Mobile hamburger state management — need to close on navigation and outside click
|
||||
|
||||
## Existing Codebase / Prior Art
|
||||
|
||||
- `frontend/src/App.css` — 3800+ lines, all styles including existing `pageEnter` animation, CSS custom properties for colors
|
||||
- `frontend/src/App.tsx` — App shell with header nav, routes. Nav H1 on line 20 needs semantic fix
|
||||
- `frontend/src/components/SearchAutocomplete.tsx` — Existing component with `heroSize` prop, has inline and hero modes
|
||||
- `frontend/src/pages/TopicsBrowse.tsx` — Already has expand/collapse state via `useState<Set>`, defaults to all-expanded
|
||||
- `frontend/src/pages/CreatorDetail.tsx` — Stats rendered as text string, needs pill component
|
||||
- `frontend/src/pages/Home.tsx` — Featured technique section, random technique button target
|
||||
- `frontend/src/utils/catSlug.ts` — Shared category slug utility for color mapping
|
||||
- `backend/routers/techniques.py` — Already has `ORDER BY func.random()` for technique listing
|
||||
|
||||
> See `.gsd/DECISIONS.md` for all architectural and pattern decisions.
|
||||
|
||||
## Relevant Requirements
|
||||
|
||||
- R016–R028 — All new requirements for this milestone (see REQUIREMENTS.md)
|
||||
- R015 — Global search in nav supports 30-second retrieval target
|
||||
|
||||
## Scope
|
||||
|
||||
### In Scope
|
||||
|
||||
- Card hover animations (scale + shadow + transition) on all card types
|
||||
- Staggered entrance animations on card grids
|
||||
- Featured technique visual redesign (glow/gradient border)
|
||||
- Random technique button + backend endpoint
|
||||
- Topics page default-collapsed with expand/collapse animation
|
||||
- Creator stats as topic-colored pills
|
||||
- Tag overflow limit (4 + "+N more")
|
||||
- Empty subtopic handling ("Coming soon" or hide)
|
||||
- Compact search bar in nav (all non-home pages)
|
||||
- Cmd+K keyboard shortcut for search focus
|
||||
- Mobile hamburger menu (<768px)
|
||||
- Heading hierarchy fix (single H1 per page)
|
||||
- Skip-to-content link
|
||||
- Text contrast increase to WCAG AA
|
||||
- Page-specific document titles per route
|
||||
|
||||
### Out of Scope / Non-Goals
|
||||
|
||||
- Beginner learning paths (F01 — denied)
|
||||
- YouTube deep links on key moments (F02 — denied)
|
||||
- Hide admin dropdown (F03 — denied)
|
||||
- CTA label changes (F15 — denied)
|
||||
- Audio/sound design elements
|
||||
- Embedded video players
|
||||
- User accounts or personalization
|
||||
|
||||
## Technical Constraints
|
||||
|
||||
- CSS animations must use GPU-composited properties (transform, opacity) for performance
|
||||
- SearchAutocomplete component must support a new compact/nav mode without breaking existing hero/inline modes
|
||||
- Mobile hamburger must close on route change (React Router navigation)
|
||||
- All changes must build cleanly with TypeScript strict mode
|
||||
|
||||
## Integration Points
|
||||
|
||||
- Backend API — new `GET /api/v1/techniques/random` endpoint for random technique discovery
|
||||
- Existing CSS custom property system — `--color-badge-cat-*` properties for topic colors on creator stats
|
||||
|
||||
## Open Questions
|
||||
|
||||
- None — scope is well-defined from assessment triage
|
||||
12
.gsd/milestones/M011/M011-ROADMAP.md
Normal file
12
.gsd/milestones/M011/M011-ROADMAP.md
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
# M011:
|
||||
|
||||
## Vision
|
||||
Transform Chrysopedia from functionally adequate to engaging and accessible. Add interaction delight (hover animations, staggered entrances, featured technique glow, random discovery), navigation improvements (collapsed topics, global search, mobile hamburger, creator stats pills, tag overflow, empty subtopics), and WCAG accessibility fixes (heading hierarchy, skip link, contrast, page titles).
|
||||
|
||||
## Slice Overview
|
||||
| ID | Slice | Risk | Depends | Done | After this |
|
||||
|----|-------|------|---------|------|------------|
|
||||
| S01 | Interaction Delight & Discovery | medium | — | ⬜ | Cards animate on hover with scale+shadow. Card grids stagger entrance. Featured technique has glow treatment. Random Technique button navigates to a random page. |
|
||||
| S02 | Topics, Creator Stats & Card Polish | medium | — | ⬜ | Topics page loads collapsed, expands with animation. Creator stats show colored topic pills. Cards limit tags to 4 with +N more. Empty subtopics show Coming soon. |
|
||||
| S03 | Global Search & Mobile Navigation | medium | — | ⬜ | Compact search bar in nav on all pages. Cmd+K focuses it. Mobile viewport shows hamburger menu. |
|
||||
| S04 | Accessibility & SEO Fixes | low | — | ⬜ | Every page has single H1, skip-to-content link, AA contrast text, and descriptive browser tab title. |
|
||||
88
.gsd/milestones/M011/slices/S01/S01-PLAN.md
Normal file
88
.gsd/milestones/M011/slices/S01/S01-PLAN.md
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
# S01: Interaction Delight & Discovery
|
||||
|
||||
**Goal:** Cards animate on hover with scale+shadow. Card grids stagger entrance. Featured technique has glow treatment. Random Technique button navigates to a random page.
|
||||
**Demo:** After this: Cards animate on hover with scale+shadow. Card grids stagger entrance. Featured technique has glow treatment. Random Technique button navigates to a random page.
|
||||
|
||||
## Tasks
|
||||
- [x] **T01: Added scale(1.02) hover to all 6 card types, cardEnter stagger animation across 5 pages, and gradient-border glow on featured technique** — ## Description
|
||||
|
||||
CSS-first visual polish covering R016 (card hover + stagger) and R017 (featured glow). Touches all 6 card hover states, adds a new `cardEnter` keyframe with stagger delay pattern, applies stagger indices via JSX style props across 5 page components, and redesigns the `.home-featured` section with gradient border + box-shadow glow.
|
||||
|
||||
## Steps
|
||||
|
||||
1. **Card hover scale** — In `frontend/src/App.css`, add `transform: scale(1.02)` to hover states for `.recent-card`, `.creator-technique-card`, `.subtopic-technique-card`, `.search-result-card`, and `.topic-card`. For `.nav-card`, augment existing `translateY(-1px)` to `scale(1.02) translateY(-1px)`. Add `transition: ... transform 0.2s` where not already present. Ensure `will-change: transform` is on the base card class.
|
||||
|
||||
2. **Stagger keyframe + utility class** — Add `@keyframes cardEnter` (opacity 0→1, translateY(12px→0), 300ms ease-out) to `App.css`. Add `.card-stagger` class that applies the animation with `animation-delay: calc(var(--stagger-index, 0) * 60ms)` and `animation-fill-mode: both`.
|
||||
|
||||
3. **Stagger indices on Home.tsx** — Add `className="card-stagger"` and `style={{ '--stagger-index': i } as React.CSSProperties}` to recent cards `.map()` loop (line ~202). Also add to nav-cards (indices 0, 1).
|
||||
|
||||
4. **Stagger indices on TopicsBrowse.tsx** — Add stagger class + index to `.topic-card` elements in the `.map()` loop (line ~117).
|
||||
|
||||
5. **Stagger indices on CreatorDetail.tsx** — Add stagger class + index to `.creator-technique-card` elements in the `.map()` loop (line ~141).
|
||||
|
||||
6. **Stagger indices on SubTopicPage.tsx** — Add stagger class + index to `.subtopic-technique-card` elements in the `.map()` loops (line ~139). Reset index per group.
|
||||
|
||||
7. **Stagger indices on SearchResults.tsx** — Add stagger class + index to `.search-result-card` elements in the `.map()` loop (line ~80).
|
||||
|
||||
8. **Featured technique glow** — Redesign `.home-featured` in `App.css`: replace `border-left: 3px solid var(--color-accent)` with a gradient border using `border-image: linear-gradient(135deg, var(--color-accent), #a855f7) 1` or pseudo-element approach, add `box-shadow: 0 0 20px rgba(34, 211, 238, 0.15), 0 0 40px rgba(34, 211, 238, 0.05)` for glow effect. Keep it subtle — accent glow, not neon. Ensure it stays GPU-composited (only box-shadow + opacity, no layout properties).
|
||||
|
||||
## Must-Haves
|
||||
|
||||
- [ ] All 6 card types have scale(1.02) hover with smooth transition
|
||||
- [ ] `@keyframes cardEnter` and `.card-stagger` class defined in App.css
|
||||
- [ ] Stagger indices applied in all 5 page components
|
||||
- [ ] `.home-featured` has visible glow/gradient treatment
|
||||
- [ ] `npx tsc --noEmit` passes
|
||||
- [ ] `npm run build` succeeds
|
||||
|
||||
## Verification
|
||||
|
||||
- `cd frontend && npx tsc --noEmit` — no type errors
|
||||
- `cd frontend && npm run build` — Vite build succeeds
|
||||
- `grep -q 'cardEnter' frontend/src/App.css` — keyframe exists
|
||||
- `grep -q 'card-stagger' frontend/src/App.css` — utility class exists
|
||||
- `grep -c 'stagger-index' frontend/src/pages/Home.tsx frontend/src/pages/TopicsBrowse.tsx frontend/src/pages/CreatorDetail.tsx frontend/src/pages/SubTopicPage.tsx frontend/src/pages/SearchResults.tsx` — all 5 pages have stagger indices
|
||||
- Estimate: 45m
|
||||
- Files: frontend/src/App.css, frontend/src/pages/Home.tsx, frontend/src/pages/TopicsBrowse.tsx, frontend/src/pages/CreatorDetail.tsx, frontend/src/pages/SubTopicPage.tsx, frontend/src/pages/SearchResults.tsx
|
||||
- Verify: cd frontend && npx tsc --noEmit && npm run build && grep -q 'cardEnter' src/App.css && grep -q 'card-stagger' src/App.css
|
||||
- [ ] **T02: Add random technique endpoint and discovery button on homepage** — ## Description
|
||||
|
||||
Vertical feature for R018: backend endpoint, API client function, and frontend button with navigation. The existing `GET /api/v1/techniques?sort=random&limit=1` works but returns the full paginated list response. A dedicated `GET /api/v1/techniques/random` returning just `{ slug: string }` is cleaner.
|
||||
|
||||
## Failure Modes
|
||||
|
||||
| Dependency | On error | On timeout | On malformed response |
|
||||
|------------|----------|-----------|----------------------|
|
||||
| `GET /techniques/random` | Button shows brief error state, stays on page | Same as error — fetch has default timeout | Shouldn't happen (typed response), but guard with optional chaining |
|
||||
| No techniques in DB | Endpoint returns 404 | N/A | Button hidden or disabled |
|
||||
|
||||
## Steps
|
||||
|
||||
1. **Backend endpoint** — In `backend/routers/techniques.py`, add `GET /random` endpoint BEFORE the `/{slug}` route (line ~185) to avoid slug capture. The endpoint queries `SELECT slug FROM technique_pages ORDER BY random() LIMIT 1`, returns `{"slug": "..."}`. If no techniques exist, return 404.
|
||||
|
||||
2. **API client function** — In `frontend/src/api/public-client.ts`, add `fetchRandomTechnique(): Promise<{ slug: string }>` that calls `GET /api/v1/techniques/random`.
|
||||
|
||||
3. **Random button in Home.tsx** — Add a "Random Technique" button after the nav-cards section (or near the CTA area). Use a dice/shuffle icon (SVG inline or emoji 🎲). On click: set loading state, call `fetchRandomTechnique()`, then `navigate(`/techniques/${slug}`)`. If fetch fails, briefly show error then reset. The button should have the `.btn` base class with a secondary style.
|
||||
|
||||
4. **Button CSS** — Add `.btn--random` styles in `App.css` if needed (may just use existing `.btn` with minor tweaks). Consider a subtle shuffle icon animation on hover.
|
||||
|
||||
## Must-Haves
|
||||
|
||||
- [ ] `GET /api/v1/techniques/random` returns `{ slug: string }` with 200, or 404 if empty
|
||||
- [ ] Route registered before `/{slug}` to avoid capture
|
||||
- [ ] `fetchRandomTechnique()` in public-client.ts
|
||||
- [ ] Button visible on homepage, navigates to a technique on click
|
||||
- [ ] Button has loading state during fetch
|
||||
- [ ] `npx tsc --noEmit` passes
|
||||
- [ ] `npm run build` succeeds
|
||||
|
||||
## Verification
|
||||
|
||||
- `cd frontend && npx tsc --noEmit` — no type errors
|
||||
- `cd frontend && npm run build` — Vite build succeeds
|
||||
- `grep -q 'fetchRandomTechnique' frontend/src/api/public-client.ts` — client function exists
|
||||
- `grep -q '/random' backend/routers/techniques.py` — endpoint exists
|
||||
- `grep -q 'Random' frontend/src/pages/Home.tsx` — button exists in homepage
|
||||
- Estimate: 30m
|
||||
- Files: backend/routers/techniques.py, frontend/src/api/public-client.ts, frontend/src/pages/Home.tsx, frontend/src/App.css
|
||||
- Verify: cd frontend && npx tsc --noEmit && npm run build && grep -q 'fetchRandomTechnique' src/api/public-client.ts && grep -q '/random' ../backend/routers/techniques.py
|
||||
109
.gsd/milestones/M011/slices/S01/S01-RESEARCH.md
Normal file
109
.gsd/milestones/M011/slices/S01/S01-RESEARCH.md
Normal file
|
|
@ -0,0 +1,109 @@
|
|||
# S01 Research: Interaction Delight & Discovery
|
||||
|
||||
## Summary
|
||||
|
||||
This slice covers three requirements: R016 (card hover + staggered entrance), R017 (featured technique glow), R018 (random technique button). All are CSS-first frontend work with one small backend addition (random endpoint). The codebase already has the patterns and data plumbing — this is applying polish to existing elements.
|
||||
|
||||
**Risk:** Medium only because CSS animation scope touches many card types across multiple pages. No architectural unknowns.
|
||||
|
||||
## Recommendation
|
||||
|
||||
Straightforward CSS + minor JSX work. Split into: (1) card hover/stagger animations (CSS-only, all card types), (2) featured technique glow redesign (CSS + minor JSX), (3) random technique button (backend endpoint + frontend button + navigation).
|
||||
|
||||
## Implementation Landscape
|
||||
|
||||
### Card Types Requiring Hover Animation (R016)
|
||||
|
||||
Six distinct card CSS classes need hover treatment (scale + shadow + 200ms transition):
|
||||
|
||||
| Card class | Page | Container class | Current hover |
|
||||
|---|---|---|---|
|
||||
| `.nav-card` | Home | `.nav-cards` | translateY(-1px), border-color, box-shadow ✓ already good |
|
||||
| `.recent-card` | Home | `.recent-list` | border-color, box-shadow only — needs scale |
|
||||
| `.creator-technique-card` | CreatorDetail | direct children | border-color, box-shadow only — needs scale |
|
||||
| `.subtopic-technique-card` | SubTopicPage | `.subtopic-group__list` | border-color, box-shadow only — needs scale |
|
||||
| `.search-result-card` | SearchResults | `.search-group` | has hover — needs scale |
|
||||
| `.topic-card` | TopicsBrowse | `.topics-grid` | no explicit hover — needs full treatment |
|
||||
|
||||
**Note:** `.nav-card` already has `transform: translateY(-1px)` on hover. Augment to `scale(1.02) translateY(-1px)` rather than replacing.
|
||||
|
||||
CreatorsBrowse uses `.creator-row` (table rows, not cards) — not in scope for card hover.
|
||||
|
||||
### Staggered Entrance Animations (R016)
|
||||
|
||||
Existing animation: `@keyframes pageEnter` applies `translateY(8px)` fade-in to all page containers. Cards within pages don't have individual entrance animations.
|
||||
|
||||
**Approach:** Define a `@keyframes cardEnter` (opacity 0→1, translateY(12px→0)) and apply via a `.card-stagger` utility class. Use CSS `animation-delay` with `calc(var(--stagger-index) * 60ms)` pattern — set `--stagger-index` via `style` prop in JSX `.map()` loops. This avoids JS animation libraries entirely.
|
||||
|
||||
**Pages needing stagger:**
|
||||
- Home: `.recent-list` (4 cards)
|
||||
- TopicsBrowse: `.topics-grid` (7 cards)
|
||||
- CreatorDetail: technique cards list
|
||||
- SubTopicPage: technique cards per group
|
||||
- SearchResults: result cards
|
||||
|
||||
### Featured Technique Glow (R017)
|
||||
|
||||
Current `.home-featured` is a plain bordered box with `border-left: 3px solid var(--color-accent)`. Needs a visually distinct glow/gradient treatment.
|
||||
|
||||
**Approach:** Replace the left-border accent with a gradient border (using `border-image` or pseudo-element with `background: linear-gradient`) plus a subtle `box-shadow` glow using the cyan accent color (`--color-accent: #22d3ee`). Keep it GPU-composited (box-shadow + opacity).
|
||||
|
||||
**File:** Only `frontend/src/App.css` lines ~1231-1293 (`.home-featured` block). No JSX changes needed — the existing class structure supports the redesign purely in CSS.
|
||||
|
||||
### Random Technique Button (R018)
|
||||
|
||||
**Backend:** The existing `GET /api/v1/techniques?sort=random&limit=1` already returns a random technique (uses `ORDER BY func.random()` in `backend/routers/techniques.py:158`). A dedicated `GET /api/v1/techniques/random` endpoint would be cleaner (single redirect-style response), but the existing list endpoint works fine. Decision: add a lightweight `/techniques/random` endpoint that returns `{ slug: string }` — avoids fetching full list response for one item.
|
||||
|
||||
**Frontend API client:** Add `fetchRandomTechnique()` to `frontend/src/api/public-client.ts`.
|
||||
|
||||
**Frontend button:** Add a "Random Technique" button to `Home.tsx`, near the hero section or below nav-cards. On click: fetch random slug → `navigate(`/techniques/${slug}`)`. Button needs a dice/shuffle icon and loading state.
|
||||
|
||||
**Note:** Home.tsx already fetches a random technique for the "Featured Technique" section (line 29-37: `fetchTechniques({ sort: "random", limit: 1 })`). The Random button should use a separate fetch to avoid navigating to the already-displayed featured technique.
|
||||
|
||||
### CSS Custom Properties Available
|
||||
|
||||
The theme system (`App.css` lines 1-60) provides all needed tokens:
|
||||
- `--color-accent: #22d3ee` (cyan) — for glow
|
||||
- `--color-accent-subtle: rgba(34, 211, 238, 0.1)` — for subtle glow rings
|
||||
- `--color-shadow: rgba(0, 0, 0, 0.2)` — existing shadow base
|
||||
- `--color-bg-surface: #1a1a24` — card backgrounds
|
||||
|
||||
### Animation Performance Constraint
|
||||
|
||||
Per KNOWLEDGE.md and M011-CONTEXT.md: CSS animations must use GPU-composited properties only (`transform`, `opacity`). Box-shadow transitions are technically not GPU-composited but are acceptable at this scale (static elements, not scrolling). Avoid animating `width`, `height`, `padding`, `margin`.
|
||||
|
||||
## Key Files
|
||||
|
||||
| File | Role | Changes |
|
||||
|---|---|---|
|
||||
| `frontend/src/App.css` | All styles | Add hover scale, stagger keyframes, featured glow, random button styles |
|
||||
| `frontend/src/pages/Home.tsx` | Homepage | Add random technique button, stagger indices on recent cards |
|
||||
| `frontend/src/pages/TopicsBrowse.tsx` | Topics grid | Add stagger indices to topic cards |
|
||||
| `frontend/src/pages/CreatorDetail.tsx` | Creator page | Add stagger indices to technique cards |
|
||||
| `frontend/src/pages/SubTopicPage.tsx` | Subtopic page | Add stagger indices to technique cards |
|
||||
| `frontend/src/pages/SearchResults.tsx` | Search results | Add stagger indices to result cards |
|
||||
| `frontend/src/api/public-client.ts` | API client | Add `fetchRandomTechnique()` |
|
||||
| `backend/routers/techniques.py` | API | Add `GET /techniques/random` endpoint |
|
||||
|
||||
## Task Seams
|
||||
|
||||
Natural decomposition:
|
||||
|
||||
1. **Card hover animations** (CSS-only) — Add `transform: scale(1.02)` and enhanced shadow to all card hover states. Pure CSS, no JSX changes. Can verify visually.
|
||||
|
||||
2. **Staggered entrance animations** (CSS + JSX) — Define `@keyframes cardEnter` and `.card-stagger` class. Add `style={{ '--stagger-index': i }}` to card `.map()` loops across 5 pages. Slightly more work due to touching multiple files.
|
||||
|
||||
3. **Featured technique glow** (CSS-only) — Redesign `.home-featured` with gradient border and box-shadow glow. Pure CSS.
|
||||
|
||||
4. **Random technique button** (backend + frontend) — Add endpoint, API client function, button in Home.tsx with navigation. Riskiest piece (backend change), should be built first or second to validate the API works.
|
||||
|
||||
## Verification Strategy
|
||||
|
||||
- `cd frontend && npx tsc --noEmit` — TypeScript compiles
|
||||
- `cd frontend && npm run build` — Vite build succeeds
|
||||
- Visual verification in browser at `http://ub01:8096`:
|
||||
- Hover any card → see scale + shadow transition
|
||||
- Load any listing page → cards stagger in
|
||||
- Homepage featured technique → visible glow/gradient
|
||||
- Click Random Technique → navigates to a technique page
|
||||
- Click Random Technique again → navigates to a different page (probabilistic)
|
||||
68
.gsd/milestones/M011/slices/S01/tasks/T01-PLAN.md
Normal file
68
.gsd/milestones/M011/slices/S01/tasks/T01-PLAN.md
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
---
|
||||
estimated_steps: 24
|
||||
estimated_files: 6
|
||||
skills_used: []
|
||||
---
|
||||
|
||||
# T01: Add card hover scale, staggered entrance animations, and featured technique glow
|
||||
|
||||
## Description
|
||||
|
||||
CSS-first visual polish covering R016 (card hover + stagger) and R017 (featured glow). Touches all 6 card hover states, adds a new `cardEnter` keyframe with stagger delay pattern, applies stagger indices via JSX style props across 5 page components, and redesigns the `.home-featured` section with gradient border + box-shadow glow.
|
||||
|
||||
## Steps
|
||||
|
||||
1. **Card hover scale** — In `frontend/src/App.css`, add `transform: scale(1.02)` to hover states for `.recent-card`, `.creator-technique-card`, `.subtopic-technique-card`, `.search-result-card`, and `.topic-card`. For `.nav-card`, augment existing `translateY(-1px)` to `scale(1.02) translateY(-1px)`. Add `transition: ... transform 0.2s` where not already present. Ensure `will-change: transform` is on the base card class.
|
||||
|
||||
2. **Stagger keyframe + utility class** — Add `@keyframes cardEnter` (opacity 0→1, translateY(12px→0), 300ms ease-out) to `App.css`. Add `.card-stagger` class that applies the animation with `animation-delay: calc(var(--stagger-index, 0) * 60ms)` and `animation-fill-mode: both`.
|
||||
|
||||
3. **Stagger indices on Home.tsx** — Add `className="card-stagger"` and `style={{ '--stagger-index': i } as React.CSSProperties}` to recent cards `.map()` loop (line ~202). Also add to nav-cards (indices 0, 1).
|
||||
|
||||
4. **Stagger indices on TopicsBrowse.tsx** — Add stagger class + index to `.topic-card` elements in the `.map()` loop (line ~117).
|
||||
|
||||
5. **Stagger indices on CreatorDetail.tsx** — Add stagger class + index to `.creator-technique-card` elements in the `.map()` loop (line ~141).
|
||||
|
||||
6. **Stagger indices on SubTopicPage.tsx** — Add stagger class + index to `.subtopic-technique-card` elements in the `.map()` loops (line ~139). Reset index per group.
|
||||
|
||||
7. **Stagger indices on SearchResults.tsx** — Add stagger class + index to `.search-result-card` elements in the `.map()` loop (line ~80).
|
||||
|
||||
8. **Featured technique glow** — Redesign `.home-featured` in `App.css`: replace `border-left: 3px solid var(--color-accent)` with a gradient border using `border-image: linear-gradient(135deg, var(--color-accent), #a855f7) 1` or pseudo-element approach, add `box-shadow: 0 0 20px rgba(34, 211, 238, 0.15), 0 0 40px rgba(34, 211, 238, 0.05)` for glow effect. Keep it subtle — accent glow, not neon. Ensure it stays GPU-composited (only box-shadow + opacity, no layout properties).
|
||||
|
||||
## Must-Haves
|
||||
|
||||
- [ ] All 6 card types have scale(1.02) hover with smooth transition
|
||||
- [ ] `@keyframes cardEnter` and `.card-stagger` class defined in App.css
|
||||
- [ ] Stagger indices applied in all 5 page components
|
||||
- [ ] `.home-featured` has visible glow/gradient treatment
|
||||
- [ ] `npx tsc --noEmit` passes
|
||||
- [ ] `npm run build` succeeds
|
||||
|
||||
## Verification
|
||||
|
||||
- `cd frontend && npx tsc --noEmit` — no type errors
|
||||
- `cd frontend && npm run build` — Vite build succeeds
|
||||
- `grep -q 'cardEnter' frontend/src/App.css` — keyframe exists
|
||||
- `grep -q 'card-stagger' frontend/src/App.css` — utility class exists
|
||||
- `grep -c 'stagger-index' frontend/src/pages/Home.tsx frontend/src/pages/TopicsBrowse.tsx frontend/src/pages/CreatorDetail.tsx frontend/src/pages/SubTopicPage.tsx frontend/src/pages/SearchResults.tsx` — all 5 pages have stagger indices
|
||||
|
||||
## Inputs
|
||||
|
||||
- ``frontend/src/App.css` — existing card hover styles and theme custom properties`
|
||||
- ``frontend/src/pages/Home.tsx` — recent cards and nav-cards `.map()` loops`
|
||||
- ``frontend/src/pages/TopicsBrowse.tsx` — topic cards `.map()` loop`
|
||||
- ``frontend/src/pages/CreatorDetail.tsx` — technique cards `.map()` loop`
|
||||
- ``frontend/src/pages/SubTopicPage.tsx` — technique cards `.map()` loops`
|
||||
- ``frontend/src/pages/SearchResults.tsx` — result cards `.map()` loop`
|
||||
|
||||
## Expected Output
|
||||
|
||||
- ``frontend/src/App.css` — updated with card hover scale, cardEnter keyframe, .card-stagger class, featured glow styles`
|
||||
- ``frontend/src/pages/Home.tsx` — stagger indices on nav-cards and recent cards`
|
||||
- ``frontend/src/pages/TopicsBrowse.tsx` — stagger indices on topic cards`
|
||||
- ``frontend/src/pages/CreatorDetail.tsx` — stagger indices on technique cards`
|
||||
- ``frontend/src/pages/SubTopicPage.tsx` — stagger indices on technique cards`
|
||||
- ``frontend/src/pages/SearchResults.tsx` — stagger indices on result cards`
|
||||
|
||||
## Verification
|
||||
|
||||
cd frontend && npx tsc --noEmit && npm run build && grep -q 'cardEnter' src/App.css && grep -q 'card-stagger' src/App.css
|
||||
89
.gsd/milestones/M011/slices/S01/tasks/T01-SUMMARY.md
Normal file
89
.gsd/milestones/M011/slices/S01/tasks/T01-SUMMARY.md
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
---
|
||||
id: T01
|
||||
parent: S01
|
||||
milestone: M011
|
||||
provides: []
|
||||
requires: []
|
||||
affects: []
|
||||
key_files: ["frontend/src/App.css", "frontend/src/pages/Home.tsx", "frontend/src/pages/TopicsBrowse.tsx", "frontend/src/pages/CreatorDetail.tsx", "frontend/src/pages/SubTopicPage.tsx", "frontend/src/pages/SearchResults.tsx"]
|
||||
key_decisions: ["card-stagger pattern uses CSS custom property --stagger-index with calc() delay", "border-image gradient for featured glow instead of pseudo-element"]
|
||||
patterns_established: []
|
||||
drill_down_paths: []
|
||||
observability_surfaces: []
|
||||
duration: ""
|
||||
verification_result: "npx tsc --noEmit passes. npm run build succeeds (50 modules). grep confirms cardEnter keyframe, card-stagger class, and stagger-index present in all 5 page components."
|
||||
completed_at: 2026-03-31T08:22:22.910Z
|
||||
blocker_discovered: false
|
||||
---
|
||||
|
||||
# T01: Added scale(1.02) hover to all 6 card types, cardEnter stagger animation across 5 pages, and gradient-border glow on featured technique
|
||||
|
||||
> Added scale(1.02) hover to all 6 card types, cardEnter stagger animation across 5 pages, and gradient-border glow on featured technique
|
||||
|
||||
## What Happened
|
||||
---
|
||||
id: T01
|
||||
parent: S01
|
||||
milestone: M011
|
||||
key_files:
|
||||
- frontend/src/App.css
|
||||
- frontend/src/pages/Home.tsx
|
||||
- frontend/src/pages/TopicsBrowse.tsx
|
||||
- frontend/src/pages/CreatorDetail.tsx
|
||||
- frontend/src/pages/SubTopicPage.tsx
|
||||
- frontend/src/pages/SearchResults.tsx
|
||||
key_decisions:
|
||||
- card-stagger pattern uses CSS custom property --stagger-index with calc() delay
|
||||
- border-image gradient for featured glow instead of pseudo-element
|
||||
duration: ""
|
||||
verification_result: passed
|
||||
completed_at: 2026-03-31T08:22:22.911Z
|
||||
blocker_discovered: false
|
||||
---
|
||||
|
||||
# T01: Added scale(1.02) hover to all 6 card types, cardEnter stagger animation across 5 pages, and gradient-border glow on featured technique
|
||||
|
||||
**Added scale(1.02) hover to all 6 card types, cardEnter stagger animation across 5 pages, and gradient-border glow on featured technique**
|
||||
|
||||
## What Happened
|
||||
|
||||
Added transform: scale(1.02) with will-change and smooth transitions to all 6 card types. Created @keyframes cardEnter and .card-stagger utility class with CSS custom property --stagger-index for staggered delays. Applied stagger indices across Home.tsx (nav-cards + recent), TopicsBrowse.tsx, CreatorDetail.tsx, SubTopicPage.tsx, and SearchResults.tsx. Redesigned .home-featured with gradient border-image and double box-shadow glow.
|
||||
|
||||
## Verification
|
||||
|
||||
npx tsc --noEmit passes. npm run build succeeds (50 modules). grep confirms cardEnter keyframe, card-stagger class, and stagger-index present in all 5 page components.
|
||||
|
||||
## Verification Evidence
|
||||
|
||||
| # | Command | Exit Code | Verdict | Duration |
|
||||
|---|---------|-----------|---------|----------|
|
||||
| 1 | `cd frontend && npx tsc --noEmit` | 0 | ✅ pass | 3000ms |
|
||||
| 2 | `cd frontend && npm run build` | 0 | ✅ pass | 3200ms |
|
||||
| 3 | `grep -q 'cardEnter' frontend/src/App.css` | 0 | ✅ pass | 50ms |
|
||||
| 4 | `grep -q 'card-stagger' frontend/src/App.css` | 0 | ✅ pass | 50ms |
|
||||
| 5 | `grep -c 'stagger-index' (5 pages)` | 0 | ✅ pass | 50ms |
|
||||
|
||||
|
||||
## Deviations
|
||||
|
||||
SearchResultCard needed staggerIndex prop threaded through. topic-card gained a new :hover rule (had none before).
|
||||
|
||||
## Known Issues
|
||||
|
||||
border-image removes border-radius on featured card — known CSS limitation. Glow box-shadow still provides visual treatment.
|
||||
|
||||
## Files Created/Modified
|
||||
|
||||
- `frontend/src/App.css`
|
||||
- `frontend/src/pages/Home.tsx`
|
||||
- `frontend/src/pages/TopicsBrowse.tsx`
|
||||
- `frontend/src/pages/CreatorDetail.tsx`
|
||||
- `frontend/src/pages/SubTopicPage.tsx`
|
||||
- `frontend/src/pages/SearchResults.tsx`
|
||||
|
||||
|
||||
## Deviations
|
||||
SearchResultCard needed staggerIndex prop threaded through. topic-card gained a new :hover rule (had none before).
|
||||
|
||||
## Known Issues
|
||||
border-image removes border-radius on featured card — known CSS limitation. Glow box-shadow still provides visual treatment.
|
||||
64
.gsd/milestones/M011/slices/S01/tasks/T02-PLAN.md
Normal file
64
.gsd/milestones/M011/slices/S01/tasks/T02-PLAN.md
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
---
|
||||
estimated_steps: 26
|
||||
estimated_files: 4
|
||||
skills_used: []
|
||||
---
|
||||
|
||||
# T02: Add random technique endpoint and discovery button on homepage
|
||||
|
||||
## Description
|
||||
|
||||
Vertical feature for R018: backend endpoint, API client function, and frontend button with navigation. The existing `GET /api/v1/techniques?sort=random&limit=1` works but returns the full paginated list response. A dedicated `GET /api/v1/techniques/random` returning just `{ slug: string }` is cleaner.
|
||||
|
||||
## Failure Modes
|
||||
|
||||
| Dependency | On error | On timeout | On malformed response |
|
||||
|------------|----------|-----------|----------------------|
|
||||
| `GET /techniques/random` | Button shows brief error state, stays on page | Same as error — fetch has default timeout | Shouldn't happen (typed response), but guard with optional chaining |
|
||||
| No techniques in DB | Endpoint returns 404 | N/A | Button hidden or disabled |
|
||||
|
||||
## Steps
|
||||
|
||||
1. **Backend endpoint** — In `backend/routers/techniques.py`, add `GET /random` endpoint BEFORE the `/{slug}` route (line ~185) to avoid slug capture. The endpoint queries `SELECT slug FROM technique_pages ORDER BY random() LIMIT 1`, returns `{"slug": "..."}`. If no techniques exist, return 404.
|
||||
|
||||
2. **API client function** — In `frontend/src/api/public-client.ts`, add `fetchRandomTechnique(): Promise<{ slug: string }>` that calls `GET /api/v1/techniques/random`.
|
||||
|
||||
3. **Random button in Home.tsx** — Add a "Random Technique" button after the nav-cards section (or near the CTA area). Use a dice/shuffle icon (SVG inline or emoji 🎲). On click: set loading state, call `fetchRandomTechnique()`, then `navigate(`/techniques/${slug}`)`. If fetch fails, briefly show error then reset. The button should have the `.btn` base class with a secondary style.
|
||||
|
||||
4. **Button CSS** — Add `.btn--random` styles in `App.css` if needed (may just use existing `.btn` with minor tweaks). Consider a subtle shuffle icon animation on hover.
|
||||
|
||||
## Must-Haves
|
||||
|
||||
- [ ] `GET /api/v1/techniques/random` returns `{ slug: string }` with 200, or 404 if empty
|
||||
- [ ] Route registered before `/{slug}` to avoid capture
|
||||
- [ ] `fetchRandomTechnique()` in public-client.ts
|
||||
- [ ] Button visible on homepage, navigates to a technique on click
|
||||
- [ ] Button has loading state during fetch
|
||||
- [ ] `npx tsc --noEmit` passes
|
||||
- [ ] `npm run build` succeeds
|
||||
|
||||
## Verification
|
||||
|
||||
- `cd frontend && npx tsc --noEmit` — no type errors
|
||||
- `cd frontend && npm run build` — Vite build succeeds
|
||||
- `grep -q 'fetchRandomTechnique' frontend/src/api/public-client.ts` — client function exists
|
||||
- `grep -q '/random' backend/routers/techniques.py` — endpoint exists
|
||||
- `grep -q 'Random' frontend/src/pages/Home.tsx` — button exists in homepage
|
||||
|
||||
## Inputs
|
||||
|
||||
- ``backend/routers/techniques.py` — existing techniques router with `sort=random` logic at line 158`
|
||||
- ``frontend/src/api/public-client.ts` — existing API client with `fetchTechniques()``
|
||||
- ``frontend/src/pages/Home.tsx` — homepage component (T01 output with stagger indices)`
|
||||
- ``frontend/src/App.css` — styles (T01 output with card animations)`
|
||||
|
||||
## Expected Output
|
||||
|
||||
- ``backend/routers/techniques.py` — new GET /random endpoint before /{slug}`
|
||||
- ``frontend/src/api/public-client.ts` — new fetchRandomTechnique() function`
|
||||
- ``frontend/src/pages/Home.tsx` — Random Technique button with navigation logic`
|
||||
- ``frontend/src/App.css` — random button styling if needed`
|
||||
|
||||
## Verification
|
||||
|
||||
cd frontend && npx tsc --noEmit && npm run build && grep -q 'fetchRandomTechnique' src/api/public-client.ts && grep -q '/random' ../backend/routers/techniques.py
|
||||
6
.gsd/milestones/M011/slices/S02/S02-PLAN.md
Normal file
6
.gsd/milestones/M011/slices/S02/S02-PLAN.md
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
# S02: Topics, Creator Stats & Card Polish
|
||||
|
||||
**Goal:** Improve information density and visual clarity on Topics and Creator pages
|
||||
**Demo:** After this: Topics page loads collapsed, expands with animation. Creator stats show colored topic pills. Cards limit tags to 4 with +N more. Empty subtopics show Coming soon.
|
||||
|
||||
## Tasks
|
||||
6
.gsd/milestones/M011/slices/S03/S03-PLAN.md
Normal file
6
.gsd/milestones/M011/slices/S03/S03-PLAN.md
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
# S03: Global Search & Mobile Navigation
|
||||
|
||||
**Goal:** Make search accessible from any page and improve mobile navigation
|
||||
**Demo:** After this: Compact search bar in nav on all pages. Cmd+K focuses it. Mobile viewport shows hamburger menu.
|
||||
|
||||
## Tasks
|
||||
6
.gsd/milestones/M011/slices/S04/S04-PLAN.md
Normal file
6
.gsd/milestones/M011/slices/S04/S04-PLAN.md
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
# S04: Accessibility & SEO Fixes
|
||||
|
||||
**Goal:** Bring the site to WCAG 2.1 Level AA on core metrics and add SEO page titles
|
||||
**Demo:** After this: Every page has single H1, skip-to-content link, AA contrast text, and descriptive browser tab title.
|
||||
|
||||
## Tasks
|
||||
654
CHRYSOPEDIA-ASSESSMENT.md
Normal file
654
CHRYSOPEDIA-ASSESSMENT.md
Normal file
|
|
@ -0,0 +1,654 @@
|
|||
# UI/UX Assessment: Chrysopedia
|
||||
## Assessment Date: March 31, 2026
|
||||
## Assessed By: Claude (UI/UX Assessor Agent)
|
||||
## Scope: Full public-facing application — Home, Topics, Creators, Technique detail, Search, About
|
||||
## Method: Live browser navigation with desktop (1280×800) and mobile (390×844) viewports
|
||||
|
||||
---
|
||||
|
||||
## 1. Product Context Summary
|
||||
|
||||
Chrysopedia is a **structured knowledgebase for electronic music production techniques**, built by extracting and distilling long-form video tutorials into searchable, categorized text content. The core value proposition — "Skip the 4-hour videos, find the insight you need in seconds" — is communicated clearly on the homepage. Content is organized along three axes: **Topics** (hierarchical categories like Sound Design > Bass), **Creators** (individual producers whose tutorials have been processed), and **Techniques** (the atomic content units combining narrative text, key moments with timestamps, signal chains, and related items). The product targets the niche intersection of electronic music producers who learn from YouTube tutorials but want faster access to specific techniques. Currently at v0.8.0 with 5 creators, ~175 techniques, and 8 top-level topic categories spanning the full production pipeline from Workflow through Mastering.
|
||||
|
||||
---
|
||||
|
||||
## 2. Journey Inventory
|
||||
|
||||
### Journey 1: "Find a technique I know I want"
|
||||
| Attribute | Detail |
|
||||
|-----------|--------|
|
||||
| **Entry point** | Homepage search bar (auto-focused on load) |
|
||||
| **Steps** | 1. Type keyword → 2. See autocomplete (5 results) → 3. Click result OR "See all results" → 4. Read technique page |
|
||||
| **Step count** | 2–3 clicks |
|
||||
| **Friction** | Low — autocomplete is responsive, results show type badges (TECHNIQUE) and creator names |
|
||||
| **Drop-off risk** | Low — search is the primary CTA and works well |
|
||||
| **Unhappy path** | No "no results" state was tested; unclear what happens with misspellings or vague queries |
|
||||
|
||||
### Journey 2: "Browse by topic — I know the category"
|
||||
| Attribute | Detail |
|
||||
|-----------|--------|
|
||||
| **Entry point** | Nav → Topics, or homepage Topics card |
|
||||
| **Steps** | 1. Click Topics → 2. Scan categories → 3. Click sub-topic → 4. See techniques grouped by creator → 5. Click technique |
|
||||
| **Step count** | 3–4 clicks |
|
||||
| **Friction** | Medium — Topics page is dense; all categories are expanded by default showing all sub-topics simultaneously. Filter input exists but may go unnoticed |
|
||||
| **Drop-off risk** | Medium — wall-of-text feeling; no visual differentiation between categories beyond icons |
|
||||
| **Decision points** | Choosing between categories requires understanding the taxonomy (e.g., "Sound Design" vs "Synthesis" vs "Mixing" — distinctions unclear for beginners) |
|
||||
|
||||
### Journey 3: "Explore by creator — I follow this producer"
|
||||
| Attribute | Detail |
|
||||
|-----------|--------|
|
||||
| **Entry point** | Nav → Creators |
|
||||
| **Steps** | 1. Click Creators → 2. See creator list with genre filters → 3. Click creator → 4. See technique list → 5. Click technique |
|
||||
| **Step count** | 3–4 clicks |
|
||||
| **Friction** | Low — clean layout, genre pill filters, sort options (Random/A-Z/Views) |
|
||||
| **Drop-off risk** | Low for users who know a creator name; higher for discovery since only 5 creators exist currently |
|
||||
| **Discoverability** | Good — breadcrumbs present on creator detail page ("← Creators") |
|
||||
|
||||
### Journey 4: "I'm a beginner — where do I start?"
|
||||
| Attribute | Detail |
|
||||
|-----------|--------|
|
||||
| **Entry point** | Homepage |
|
||||
| **Steps** | 1. Read homepage → 2. ??? |
|
||||
| **Step count** | Unknown — **no guided beginner path exists** |
|
||||
| **Friction** | **High** — homepage assumes the user knows what to search for. "Start Exploring" button links to Topics, which presents an expert-level taxonomy. No "Start Here" guide, no skill-level filtering, no curated learning paths |
|
||||
| **Drop-off risk** | **Critical** — this is the primary gap for the stated goal of serving beginners |
|
||||
| **Discoverability** | The 3-step "how it works" cards on the homepage explain the *platform*, not the *content*. A beginner doesn't know what "FM synthesis" or "gain staging" means |
|
||||
|
||||
### Journey 5: "Discover something interesting (leisure browsing)"
|
||||
| Attribute | Detail |
|
||||
|-----------|--------|
|
||||
| **Entry point** | Homepage → Featured Technique or Recently Added |
|
||||
| **Steps** | 1. Scroll homepage → 2. See featured technique → 3. Click through → 4. Read → 5. Follow "Related Techniques" |
|
||||
| **Step count** | 2–3 clicks |
|
||||
| **Friction** | Medium — Featured Technique section is nice but only shows one. Recently Added shows 4. No "surprise me" or "random technique" feature. Related Techniques at bottom of detail pages create a browsable chain but require scrolling past the full article |
|
||||
| **Drop-off risk** | Medium — limited discovery surfaces mean the browse loop runs dry quickly |
|
||||
|
||||
### Journey 6: "Find the exact video moment a technique comes from"
|
||||
| Attribute | Detail |
|
||||
|-----------|--------|
|
||||
| **Entry point** | Technique detail page → Key Moments sidebar |
|
||||
| **Steps** | 1. Navigate to technique → 2. Read Key Moments with timestamps → 3. ??? |
|
||||
| **Step count** | 2 steps, then dead end |
|
||||
| **Friction** | **High** — timestamps are shown (e.g., "18:07 – 18:26") but there is **no link to the source video**. The user can see the video title but cannot click through to YouTube at the timestamp |
|
||||
| **Drop-off risk** | High — this is a core promise unfulfilled. The source attribution is present but not actionable |
|
||||
|
||||
---
|
||||
|
||||
## 3. Heuristic Scorecard
|
||||
|
||||
| # | Dimension | Rating | Justification |
|
||||
|---|-----------|--------|---------------|
|
||||
| 3.1 | **First Impression & Orientation** | 3 — Adequate | The landing page clearly communicates *what* Chrysopedia does ("Production Knowledge, Distilled") and the 3-step value prop is effective. However, the dark theme with cyan accents, while aesthetically consistent, creates a somewhat intimidating "developer tool" feeling rather than an inviting creative learning environment. The search bar is auto-focused (good), but there is no guidance for users who don't know what to search for. |
|
||||
| 3.2 | **Navigation & Wayfinding** | 4 — Good | Three-item top nav (Home / Topics / Creators) is clean and understandable. Breadcrumbs appear on topic drill-downs and creator detail pages. Active nav state is visually indicated. The "← Back" links on technique pages are helpful. However, there's no global search in the nav bar (only on homepage), and no way to get back to search results after clicking into a technique. |
|
||||
| 3.3 | **Layout, Visual Hierarchy & Typography** | 3 — Adequate | Consistent dark theme with clear card-based layout. Technique cards show category badges, tags, and preview text effectively. However: heading hierarchy is broken (two H1 elements per page — the nav logo and the page title); body text contrast is borderline (rgb(139,139,154) on the dark background is ~4.2:1, just at the WCAG AA threshold); the technique detail page splits into a content column and Key Moments sidebar without clear visual separation. |
|
||||
| 3.4 | **Interaction Design & Feedback** | 3 — Adequate | Search autocomplete works well with immediate feedback. Tag pills and category badges are clickable and lead to relevant filtered views. However: no loading states or skeleton screens observed; page transitions are instant (SSG) which is good; hover states on cards are subtle (border color change) and could be more pronounced; the "Hide sub-topics ▲" toggles on the Topics page work but the animation is absent — the content simply appears/disappears. |
|
||||
| 3.5 | **Form Design & Data Entry** | 3 — Adequate | Only two input fields exist: homepage search and topics filter. Both function correctly. Search has a clear placeholder, a visible search button, a clear (×) button, and autocomplete. However, the search input on the results page loses focus after submission, and there's no keyboard shortcut (e.g., "/" to focus search). |
|
||||
| 3.6 | **Error Handling & Recovery** | 2 — Deficient | No error states were observed or testable on the public site. The "Report issue with this page" link at the bottom of technique pages is good but could be more prominent. Empty states were not encountered, but the Counterpoint sub-topic under Music Theory shows "0 techniques · 0 creators" with no helpful message. No 404 page was tested. |
|
||||
| 3.7 | **Content Quality & Microcopy** | 4 — Good | Technique descriptions are detailed, well-structured, and genuinely educational. The writing is clear and uses appropriate domain terminology without being inaccessible. Key Moments provide excellent summaries with timestamps. Tag taxonomy is consistent. However: button labels could be more specific ("Start Exploring" → what exactly?); the "Admin ▾" dropdown in the nav appears for all users and adds confusion. |
|
||||
| 3.8 | **Accessibility (WCAG Baseline)** | 2 — Deficient | Multiple issues: (1) No skip-to-content link; (2) Duplicate H1 elements on every page (nav H1 + page H1); (3) Heading hierarchy skips (H1 → H3 on homepage, skipping H2 for the value prop cards); (4) Body/subtitle text color contrast borderline at ~4.2:1; (5) `lang="en"` is correctly set; (6) No images on the site (good — no alt text issues); (7) Keyboard navigation untested but tab order appears logical; (8) Focus indicators not visually checked but browser defaults should apply. |
|
||||
| 3.9 | **Responsive Design & Device Adaptation** | 4 — Good | Mobile layout adapts well: nav items wrap horizontally (not hamburger menu), cards stack vertically, search input and button stack correctly. Topics page columns become single-column on mobile. Technique detail page stacks the Key Moments sidebar below the content on mobile. However: the nav wrapping means all items (Home, Topics, Creators, Admin ▾) are visible but cramped on mobile; a hamburger menu would be cleaner at mobile widths. |
|
||||
| 3.10 | **Performance Perception** | 5 — Excellent | Pages load near-instantly (static site generation). No layout shifts observed. Search autocomplete appears with no perceptible delay. Route transitions are fast. This is a strength — the site *feels* snappy. |
|
||||
| 3.11 | **Trust & Credibility** | 3 — Adequate | The site looks polished and intentional. Open-source on GitHub adds transparency. Creator attribution is consistent. Version number in footer (v0.8.0) signals active development but also "not finished." The "Admin ▾" dropdown in the nav for all visitors undermines professional polish. No broken links observed. |
|
||||
| 3.12 | **Emotional Design & Polish** | 2 — Deficient | This is the largest opportunity area. The site is functionally competent but emotionally flat. There are zero moments of delight, no micro-interactions, no personality. The dark theme is utilitarian, not atmospheric. For a music production audience — people who are creative, aesthetic-minded, and accustomed to visually rich tools like Ableton, Serum, and YouTube — the current design feels like a developer's side project rather than a creative tool. No sound, no visualization, no interactivity beyond search. The "Featured Technique" section could be a moment of delight but is styled identically to every other card. |
|
||||
|
||||
**Overall Heuristic Average: 3.2 / 5 — Adequate with notable gaps**
|
||||
|
||||
---
|
||||
|
||||
## 4. Detailed Findings
|
||||
|
||||
### Critical & High Priority
|
||||
|
||||
---
|
||||
|
||||
### F01 — No Guided Entry Point for Beginners
|
||||
|
||||
**Severity:** Critical
|
||||
**Dimension:** 3.1 — First Impression & Orientation
|
||||
**Journey affected:** Journey 4 (beginner orientation)
|
||||
**Location:** Homepage
|
||||
|
||||
**Observation:**
|
||||
The homepage assumes users know what to search for. The "Start Exploring" button links to the Topics page, which presents an expert-level taxonomy (Workflow, Music Theory, Sound Design, Synthesis, Arrangement, Mixing, Mastering). A beginner who doesn't know what "gain staging" or "FM synthesis" means has no entry point. There are no skill-level filters, no "Start Here" guide, no curated learning paths.
|
||||
|
||||
**Impact:**
|
||||
Beginners — a primary target audience per the project goal — will bounce. They cannot form a search query because they don't have the vocabulary. The Topics taxonomy makes sense to producers who already know the production pipeline, but is meaningless to someone who just downloaded their first DAW.
|
||||
|
||||
**Recommendation:**
|
||||
Add a **"New to Production?"** section on the homepage with 3-5 curated starting paths:
|
||||
- "Making Your First Beat" → curated techniques about drums, basic arrangement
|
||||
- "Understanding Sound Design" → fundamental synthesis techniques
|
||||
- "Getting a Clean Mix" → EQ and compression basics
|
||||
|
||||
Additionally, add **skill-level tags** to techniques (Beginner / Intermediate / Advanced) so the Topics and Search views can be filtered by experience level.
|
||||
|
||||
**Effort estimate:** Medium
|
||||
**Dependencies:** Requires content curation and potentially new metadata on technique records
|
||||
|
||||
---
|
||||
|
||||
### F02 — Key Moments Timestamps Are Not Linked to Source Videos
|
||||
|
||||
**Severity:** High
|
||||
**Dimension:** 3.4 — Interaction Design & Feedback
|
||||
**Journey affected:** Journey 6 (find the video moment)
|
||||
**Location:** Technique detail page — Key Moments sidebar
|
||||
|
||||
**Observation:**
|
||||
Key Moments display the source video title and timestamps (e.g., "1:12 – 1:31") but these are not clickable links to the source YouTube video. The video title is truncated and not linked. The user can see *which* video the technique came from but cannot watch the specific segment.
|
||||
|
||||
**Impact:**
|
||||
The platform's value proposition is "skip the 4-hour videos." But users who want to *see* the technique demonstrated — rather than just read about it — are dead-ended. This undermines the "distilled from creator tutorials" narrative: if you can't get back to the source, the distillation feels like a one-way door.
|
||||
|
||||
**Recommendation:**
|
||||
Make each Key Moment's video title a link to the YouTube video at the specific timestamp (using `?t=` parameter). Format: `https://youtube.com/watch?v={id}&t={start_seconds}`. Optionally embed a small video player preview. At minimum, the video title should be a clickable link.
|
||||
|
||||
**Effort estimate:** Small (if video URLs and timestamps are in the data)
|
||||
**Dependencies:** Requires source video URLs in the technique data model
|
||||
|
||||
---
|
||||
|
||||
### F03 — "Admin ▾" Dropdown Visible to All Users
|
||||
|
||||
**Severity:** High
|
||||
**Dimension:** 3.11 — Trust & Credibility
|
||||
**Journey affected:** All journeys
|
||||
**Location:** Global navigation bar
|
||||
|
||||
**Observation:**
|
||||
The top-right navigation includes an "Admin ▾" dropdown button visible to all visitors, not just authenticated administrators. This exposes the internal tooling surface to public users.
|
||||
|
||||
**Impact:**
|
||||
For regular users, this creates confusion ("Am I supposed to be an admin?") and undermines the professional polish of the product. It signals "this is a development prototype" rather than a finished product. If the dropdown contains functional admin actions, it's also a potential security concern.
|
||||
|
||||
**Recommendation:**
|
||||
Hide the Admin dropdown behind authentication. If the site has no auth system, use a URL parameter or local storage flag (`?admin=true` or `localStorage.chrysopedia_admin`) to enable the admin UI only when needed.
|
||||
|
||||
**Effort estimate:** Small
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### F04 — Emotional Flatness — No Moments of Delight
|
||||
|
||||
**Severity:** High
|
||||
**Dimension:** 3.12 — Emotional Design & Polish
|
||||
**Journey affected:** All journeys, especially Journey 5 (leisure browsing)
|
||||
**Location:** Site-wide
|
||||
|
||||
**Observation:**
|
||||
The site is functional but emotionally inert. There are no micro-interactions (hover animations, transition effects, visual feedback), no personality in the design, no music-production-related visual metaphors or motifs. The dark theme is uniform dark navy (#0f0f14) with cyan (#22d3ee) accents — utilitarian, not atmospheric. Card hover states are a barely perceptible border color change. Page transitions are instant with no visual continuity. The "Featured Technique" section looks identical to every other content card.
|
||||
|
||||
**Impact:**
|
||||
The stated goal is to make the site "more fun or enticing to use." Electronic music producers are an aesthetic-driven audience accustomed to rich, visual tools. The current design creates no desire to return, no browsing enjoyment, no sense of discovery or play. It's a reference database that reads like one, when it could read like a creative exploration tool.
|
||||
|
||||
**Recommendation:**
|
||||
Implement a progressive approach:
|
||||
1. **Phase 1 (Quick wins):** Add hover animations on cards (subtle scale transform + shadow), smooth scroll behavior, staggered card entrance animations on page load, a pulsing/breathing effect on the featured technique card
|
||||
2. **Phase 2 (Atmospheric):** Add a subtle waveform or frequency visualization to the header area, use gradient backgrounds that shift by topic category (warm for drums, cool for synthesis), add audio waveform-inspired decorative elements
|
||||
3. **Phase 3 (Interactive):** Add a "Random Technique" button with a slot-machine animation, add a "Technique of the Day" with a unique visual treatment, consider playable audio snippets on technique pages where relevant
|
||||
|
||||
**Effort estimate:** Medium (Phase 1), Large (Phase 2-3)
|
||||
**Dependencies:** F01 (beginner paths would benefit from the same visual treatment)
|
||||
|
||||
---
|
||||
|
||||
### F05 — Topics Page Information Overload
|
||||
|
||||
**Severity:** High
|
||||
**Dimension:** 3.2 — Navigation & Wayfinding
|
||||
**Journey affected:** Journey 2 (browse by topic)
|
||||
**Location:** /topics
|
||||
|
||||
**Observation:**
|
||||
The Topics page loads with all 8 categories fully expanded, displaying every sub-topic simultaneously. This creates a wall of ~50+ line items across 2 columns, requiring significant scrolling to see all categories. The "Filter topics..." input at the top could help, but it's easy to miss and its behavior is unclear (does it filter categories? sub-topics? both?). The "Hide sub-topics ▲" toggles exist but default to open.
|
||||
|
||||
**Impact:**
|
||||
Users seeking a specific sub-topic must scan a large, undifferentiated list. The information density overwhelms the browsing intent. Beginners especially will be intimidated by the sheer number of technical terms presented simultaneously.
|
||||
|
||||
**Recommendation:**
|
||||
1. **Default to collapsed categories** — show only the 8 top-level categories with their icons, descriptions, and technique/sub-topic counts. Let users expand the ones they're interested in.
|
||||
2. **Add visual differentiation** — use distinct colors or gradient accents per category (synth = purple, drums = orange, etc.) to create visual anchors for scanning.
|
||||
3. **Make the filter input more prominent** — add a descriptive label ("Filter by topic name"), increase its width, and show a live count of matching results.
|
||||
|
||||
**Effort estimate:** Small (collapse default), Medium (visual differentiation)
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### Medium Priority
|
||||
|
||||
---
|
||||
|
||||
### F06 — No Search in Global Navigation
|
||||
|
||||
**Severity:** Medium
|
||||
**Dimension:** 3.2 — Navigation & Wayfinding
|
||||
**Journey affected:** Journey 1 (find a known technique)
|
||||
**Location:** Navigation bar (all pages except homepage)
|
||||
|
||||
**Observation:**
|
||||
The search bar only appears on the homepage hero section and the search results page. When a user is on the Topics, Creators, or Technique detail pages, there is no way to search without navigating back to the homepage.
|
||||
|
||||
**Impact:**
|
||||
Users who want to search from any page must click "Home" first, breaking their flow. This is a common pattern in knowledgebase sites but creates unnecessary friction, especially for the core use case of "find answers fast."
|
||||
|
||||
**Recommendation:**
|
||||
Add a compact search input (or a search icon that expands into an input) in the navigation bar across all pages. Alternatively, support a keyboard shortcut (Cmd+K or "/") to open a global search modal.
|
||||
|
||||
**Effort estimate:** Medium
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### F07 — Heading Hierarchy and Semantic HTML Issues
|
||||
|
||||
**Severity:** Medium
|
||||
**Dimension:** 3.8 — Accessibility
|
||||
**Journey affected:** Screen reader users on all pages
|
||||
**Location:** All pages
|
||||
|
||||
**Observation:**
|
||||
Every page contains two H1 elements (the "Chrysopedia" logo in the nav and the page title). The homepage skips from H1 directly to H3 for the "How it works" cards, omitting H2 entirely. On the technique detail page, the heading structure is H1 → H2 (technique title) → H3 (section headings), which is correct, but the nav H1 still duplicates.
|
||||
|
||||
**Impact:**
|
||||
Screen reader users rely on heading hierarchy for navigation. Multiple H1 elements and skipped heading levels create a confusing document outline. This is a WCAG 2.1 Level A violation (1.3.1 Info and Relationships).
|
||||
|
||||
**Recommendation:**
|
||||
1. Change the nav "Chrysopedia" to a styled `<span>` or `<p>` instead of H1
|
||||
2. Fix homepage heading hierarchy: the "Production Knowledge, Distilled" should be the single H1, the value prop card titles should be H2
|
||||
3. Audit all pages for heading level consistency
|
||||
|
||||
**Effort estimate:** Small
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### F08 — Missing Skip-to-Content Link
|
||||
|
||||
**Severity:** Medium
|
||||
**Dimension:** 3.8 — Accessibility
|
||||
**Journey affected:** Keyboard and screen reader users on all pages
|
||||
**Location:** All pages
|
||||
|
||||
**Observation:**
|
||||
There is no skip-to-content link that allows keyboard users to bypass the navigation and jump directly to the main content area.
|
||||
|
||||
**Impact:**
|
||||
Keyboard users must tab through all navigation items on every page load before reaching the content. This is particularly tedious on pages with many links (Topics has 58 links, Creator detail has 56).
|
||||
|
||||
**Recommendation:**
|
||||
Add a visually hidden skip link as the first focusable element: `<a href="#main-content" class="skip-link">Skip to content</a>` with CSS that shows it only on focus.
|
||||
|
||||
**Effort estimate:** Trivial
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### F09 — Subtitle/Body Text Contrast on Dark Theme
|
||||
|
||||
**Severity:** Medium
|
||||
**Dimension:** 3.8 — Accessibility
|
||||
**Journey affected:** All journeys
|
||||
**Location:** All pages — subtitle text, card descriptions, and metadata
|
||||
|
||||
**Observation:**
|
||||
Secondary text uses color `rgb(139, 139, 154)` (#8B8B9A) on the dark background. Against the page background of approximately #0f0f14, this yields a contrast ratio of approximately 4.2:1 — just barely meeting WCAG AA for normal text (4.5:1 required) and likely failing under some calculations. The text appears dim and difficult to read, particularly on the homepage description and technique card previews.
|
||||
|
||||
**Impact:**
|
||||
Users in non-ideal lighting conditions, those with low vision, or those on monitors with lower contrast ratios may struggle to read secondary content — which includes technique descriptions, tag labels, and metadata that are essential for navigation decisions.
|
||||
|
||||
**Recommendation:**
|
||||
Increase the secondary text color to at least `rgb(160, 160, 180)` (#A0A0B4) for a ~5.5:1 ratio, or better yet `rgb(180, 180, 195)` (#B4B4C3) for ~6.5:1. The current aesthetic can be preserved while improving readability.
|
||||
|
||||
**Effort estimate:** Trivial
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### F10 — No "Surprise Me" or Random Discovery Feature
|
||||
|
||||
**Severity:** Medium
|
||||
**Dimension:** 3.12 — Emotional Design & Polish
|
||||
**Journey affected:** Journey 5 (leisure browsing)
|
||||
**Location:** Homepage, potentially global
|
||||
|
||||
**Observation:**
|
||||
For a knowledgebase with 175+ techniques, there is no serendipitous discovery mechanism. The "Featured Technique" shows one article. "Recently Added" shows four. The Creators page has a "Random" sort, but there's no global "show me something interesting" feature.
|
||||
|
||||
**Impact:**
|
||||
The stated goal includes "high value leisure paths." Currently, the only leisure path is linear browsing through topic hierarchies or scrolling through a creator's technique list. There's no mechanism to surprise, delight, or introduce users to techniques they wouldn't have searched for.
|
||||
|
||||
**Recommendation:**
|
||||
1. Add a **"Random Technique" button** on the homepage (floating or in the header) that navigates to a randomly selected technique
|
||||
2. Add a **"Technique of the Day"** feature that highlights a different technique each day with unique visual treatment
|
||||
3. On technique detail pages, add a **"Show me another like this"** button that uses tag similarity to suggest an unexpected related technique
|
||||
4. Consider a **"Discovery Mode"** that shows a carousel or tinder-style card interface for casual browsing
|
||||
|
||||
**Effort estimate:** Small (random button), Medium (technique of the day), Large (discovery mode)
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### F11 — Creator Stats Line Poorly Formatted
|
||||
|
||||
**Severity:** Medium
|
||||
**Dimension:** 3.3 — Layout, Visual Hierarchy & Typography
|
||||
**Journey affected:** Journey 3 (explore by creator)
|
||||
**Location:** Creator detail page (e.g., /creators/copycatt)
|
||||
|
||||
**Observation:**
|
||||
Below the creator name, the stats are displayed as a single unpunctuated string: "12 videos Sound design: 13 Workflow: 10 Mixing: 10 Synthesis: 5 Music Theory: 5 Sound Design: 3 Arrangement: 3". This is hard to scan and parse visually. It appears as a run-on sentence rather than structured data.
|
||||
|
||||
**Impact:**
|
||||
Users cannot quickly understand a creator's content distribution across topics. The visual weight of this line is lost because it reads as a paragraph rather than structured metadata.
|
||||
|
||||
**Recommendation:**
|
||||
Format the stats as visual pills or a small bar chart. For example:
|
||||
- Use topic-colored badges: `[Sound Design: 13] [Workflow: 10] [Mixing: 10]`
|
||||
- Or a horizontal bar chart showing relative content volume per category
|
||||
- Separate "12 videos" from the topic breakdown with a visual divider
|
||||
|
||||
**Effort estimate:** Small
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### F12 — Mobile Nav Should Use Hamburger Menu
|
||||
|
||||
**Severity:** Medium
|
||||
**Dimension:** 3.9 — Responsive Design & Device Adaptation
|
||||
**Journey affected:** All mobile journeys
|
||||
**Location:** Navigation bar on mobile viewport
|
||||
|
||||
**Observation:**
|
||||
On mobile (390px wide), the navigation items (Home, Topics, Creators, Admin ▾) display inline and wrap to a second row. While functional, this consumes vertical space and looks cramped. The "Admin ▾" button is particularly problematic on mobile — it adds a non-user-facing element to already constrained space.
|
||||
|
||||
**Impact:**
|
||||
Mobile users see a cluttered header. The nav items are small and close together, potentially causing mis-taps. This is a polish issue rather than a functional blocker, but it affects first impressions on mobile.
|
||||
|
||||
**Recommendation:**
|
||||
Implement a hamburger menu for viewports below 768px. The expanded menu should display items with generous touch targets (minimum 44×44px). This also makes it easy to hide the Admin option on mobile.
|
||||
|
||||
**Effort estimate:** Medium
|
||||
**Dependencies:** F03 (Admin visibility)
|
||||
|
||||
---
|
||||
|
||||
### Low Priority / Enhancements
|
||||
|
||||
---
|
||||
|
||||
### F13 — No Page-Specific Titles
|
||||
|
||||
**Severity:** Low
|
||||
**Dimension:** 3.8 — Accessibility / SEO
|
||||
**Journey affected:** All journeys
|
||||
**Location:** Browser tab title on all pages
|
||||
|
||||
**Observation:**
|
||||
Every page has the same title: "Chrysopedia". The Topics page, Creators page, individual technique pages, and About page all show the same browser tab title. This makes it impossible to distinguish tabs and hurts SEO.
|
||||
|
||||
**Impact:**
|
||||
Users with multiple Chrysopedia tabs cannot differentiate them. Search engines cannot distinguish pages from the title alone. Browser history shows identical entries.
|
||||
|
||||
**Recommendation:**
|
||||
Use descriptive page titles: "Bass — Sound Design — Chrysopedia", "COPYCATT — Chrysopedia", "FM Bass Foundation by COPYCATT — Chrysopedia", etc.
|
||||
|
||||
**Effort estimate:** Trivial
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### F14 — Empty Topic Sub-categories Show No Guidance
|
||||
|
||||
**Severity:** Low
|
||||
**Dimension:** 3.6 — Error Handling & Recovery
|
||||
**Journey affected:** Journey 2 (browse by topic)
|
||||
**Location:** Topics page — e.g., Counterpoint (0 techniques · 0 creators), Physical Modeling (0 techniques · 0 creators)
|
||||
|
||||
**Observation:**
|
||||
Some sub-topics have zero techniques and zero creators but are still listed without any context. Users who click into these will find nothing.
|
||||
|
||||
**Impact:**
|
||||
Minor — these are likely placeholders for future content. But they set expectations that cannot be met and clutter the topic list.
|
||||
|
||||
**Recommendation:**
|
||||
Either hide empty sub-topics by default (with a "Show all including empty" toggle), or add a subtle "Coming soon" badge. If clicked, the empty topic page should say "No techniques yet — check back soon" rather than an empty list.
|
||||
|
||||
**Effort estimate:** Trivial
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### F15 — "Start Exploring" Button Label is Vague
|
||||
|
||||
**Severity:** Low
|
||||
**Dimension:** 3.7 — Content Quality & Microcopy
|
||||
**Journey affected:** Journey 2, Journey 4
|
||||
**Location:** Homepage, About page
|
||||
|
||||
**Observation:**
|
||||
The primary CTA below the value proposition cards says "Start Exploring" but links to the Topics page. The label doesn't tell the user what they'll find when they click.
|
||||
|
||||
**Impact:**
|
||||
Minor — users will click and see Topics. But a more specific label could set better expectations and serve different user types.
|
||||
|
||||
**Recommendation:**
|
||||
Consider context-aware CTAs:
|
||||
- "Browse All Topics" (descriptive)
|
||||
- "Find Your First Technique" (beginner-oriented)
|
||||
- Or split into two CTAs: "Browse Topics" / "Search for Something Specific"
|
||||
|
||||
**Effort estimate:** Trivial
|
||||
**Dependencies:** F01 (if beginner path is added, this button could link there)
|
||||
|
||||
---
|
||||
|
||||
### F16 — Tag Overflow on Technique Cards
|
||||
|
||||
**Severity:** Low
|
||||
**Dimension:** 3.3 — Layout, Visual Hierarchy & Typography
|
||||
**Journey affected:** Journey 2, Journey 3
|
||||
**Location:** Technique cards on search results, topic pages, and creator pages
|
||||
|
||||
**Observation:**
|
||||
Some technique cards (e.g., "Drum Synthesis Fundamentals by COPYCATT") display 8+ tag pills, causing them to wrap to multiple lines and pushing the preview text far down the card. The tag density varies significantly between techniques, creating uneven card heights in the grid.
|
||||
|
||||
**Impact:**
|
||||
Visual inconsistency makes scanning harder. Cards with many tags feel cluttered compared to cards with 2-3 tags.
|
||||
|
||||
**Recommendation:**
|
||||
Limit visible tags to 3-4, with a "+N more" indicator that reveals the full list on hover or click. Alternatively, show only the primary category tag on cards and reveal full tags on the detail page.
|
||||
|
||||
**Effort estimate:** Small
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
## 5. Strategic Summary & Development Handoff
|
||||
|
||||
### Overall Assessment
|
||||
|
||||
Chrysopedia is a **solid content platform with excellent fundamentals** — the content quality is genuinely high, the information architecture is well-structured, search works well, and performance is excellent. The site successfully delivers on its core promise of distilling long-form tutorials into searchable, structured knowledge.
|
||||
|
||||
However, the site currently optimizes for **expert users who already know what they're looking for** while neglecting the discovery and delight dimensions that would make it compelling for beginners and casual browsers. The aesthetic is competent but emotionally flat — it reads as a database interface rather than a creative learning environment. For an audience of music producers who are accustomed to rich, visual, and interactive tools, the current experience is unlikely to generate the kind of engagement and return visits that grow a community.
|
||||
|
||||
**The single most impactful area for improvement is adding guided entry points for beginners and discovery mechanisms for casual browsers.** The content is the product's greatest asset; the primary gap is surfacing that content to users who don't yet know how to find it.
|
||||
|
||||
---
|
||||
|
||||
### Top 5 Priorities
|
||||
|
||||
#### Priority 1: Beginner Onboarding & Learning Paths (F01)
|
||||
|
||||
**Objective:** Give users who don't know music production terminology a clear starting point.
|
||||
**Success criteria:** A first-time visitor with zero production knowledge can find and read their first relevant technique within 60 seconds.
|
||||
|
||||
##### Subtasks:
|
||||
1. Define 3-5 beginner learning paths with curated technique selections (e.g., "Your First Beat", "Understanding Synthesis", "Mixing Basics")
|
||||
2. Create a "New to Production?" section on the homepage above the fold (or as a prominent secondary CTA alongside search)
|
||||
3. Add skill-level metadata (beginner/intermediate/advanced) to technique records
|
||||
4. Build a learning path page template that sequences techniques in pedagogical order
|
||||
5. Add skill-level filter pills to Topics and Search views
|
||||
|
||||
##### Acceptance criteria:
|
||||
- [ ] Homepage has a visible "New to Production?" section or CTA
|
||||
- [ ] At least 3 curated learning paths are accessible from the homepage
|
||||
- [ ] Each path sequences 5-10 techniques in learning order
|
||||
- [ ] Skill-level filters appear on Topics and Search result pages
|
||||
|
||||
##### Context for implementing agent:
|
||||
The site appears to be built with a static site generator (SSG). Learning paths could be implemented as a new content type in the data model. Technique cards already support metadata tags — skill level could be an additional categorical tag. The homepage layout uses a grid of cards, so a "New to Production?" section could follow the same component pattern.
|
||||
|
||||
---
|
||||
|
||||
#### Priority 2: Source Video Deep Links on Key Moments (F02)
|
||||
|
||||
**Objective:** Make Key Moments actionable by linking timestamps to source YouTube videos.
|
||||
**Success criteria:** Every Key Moment timestamp is a clickable link that opens the source video at the correct time.
|
||||
|
||||
##### Subtasks:
|
||||
1. Audit the data model to confirm source video URLs and timestamps are available
|
||||
2. Add YouTube link construction (video_id + timestamp → `?t=` parameter)
|
||||
3. Render each Key Moment video title as a link to YouTube at the start timestamp
|
||||
4. Add a small YouTube icon or "Watch" affordance next to the timestamp
|
||||
5. Consider adding an embedded YouTube player that auto-seeks to the relevant timestamp
|
||||
|
||||
##### Acceptance criteria:
|
||||
- [ ] Every Key Moment timestamp links to the source YouTube video at the correct time
|
||||
- [ ] Links open in a new tab
|
||||
- [ ] Video title is the link text, styled as a clickable element
|
||||
|
||||
##### Context for implementing agent:
|
||||
Key Moments currently show a video title (e.g., "Sound Design - Everything In 2 Hours Speedr...") and timestamps. The video URL likely exists in the data pipeline since these are sourced from YouTube. The implementation is a template change on the technique detail page, specifically in the Key Moments sidebar component.
|
||||
|
||||
---
|
||||
|
||||
#### Priority 3: Visual Delight & Atmosphere (F04)
|
||||
|
||||
**Objective:** Transform the site from a utilitarian database into an engaging creative learning environment.
|
||||
**Success criteria:** Users describe the site as "fun to browse" and spend more time per session.
|
||||
|
||||
##### Subtasks:
|
||||
1. Add card hover animations (scale: 1.02, box-shadow increase, 200ms ease transition)
|
||||
2. Add staggered entrance animations for card grids on page load (fade-in-up, 50ms delay between cards)
|
||||
3. Redesign the "Featured Technique" section with a larger, visually distinct treatment (gradient border, glow effect, or full-bleed layout)
|
||||
4. Add smooth scroll behavior globally
|
||||
5. Implement subtle category-colored accents (topic category → color mapping for borders, badges, and highlights)
|
||||
6. Add a "Random Technique" button with a dice icon in the nav or hero area
|
||||
7. Consider a waveform or frequency visualization motif in the header/hero background
|
||||
|
||||
##### Acceptance criteria:
|
||||
- [ ] Cards animate on hover with smooth transitions
|
||||
- [ ] Card grids use staggered entrance animations
|
||||
- [ ] Featured Technique has a visually distinct, premium treatment
|
||||
- [ ] "Random Technique" button exists and functions
|
||||
- [ ] At least 3 distinct category colors are used across the site
|
||||
|
||||
##### Context for implementing agent:
|
||||
The site uses a dark theme with CSS custom properties. Card components use border styling that can be enhanced with transitions. Animations can be implemented with CSS `@keyframes` and `animation-delay` calculated from card index. The category color system could use a CSS custom property map (`--cat-synthesis: #8b5cf6; --cat-mixing: #3b82f6;` etc.).
|
||||
|
||||
---
|
||||
|
||||
#### Priority 4: Collapse Topics & Improve Navigation (F05, F06)
|
||||
|
||||
**Objective:** Reduce Topics page overwhelm and add global search.
|
||||
**Success criteria:** Topics page loads in an unintimidating collapsed state; search is accessible from every page.
|
||||
|
||||
##### Subtasks:
|
||||
1. Change Topics page to default-collapsed categories (click to expand)
|
||||
2. Add expand/collapse animation (slide-down, ~200ms)
|
||||
3. Add a search input to the global navigation bar (compact style, visible on all pages)
|
||||
4. Support Cmd+K keyboard shortcut to focus the search bar
|
||||
5. Style each topic category card with a distinct accent color for visual differentiation
|
||||
6. Make the topic filter input more prominent with a label and live count
|
||||
|
||||
##### Acceptance criteria:
|
||||
- [ ] Topics page loads with all categories collapsed
|
||||
- [ ] Clicking a category smoothly expands its sub-topics
|
||||
- [ ] Search input is available in the nav bar on all pages
|
||||
- [ ] Cmd+K or "/" keyboard shortcut focuses the search input
|
||||
|
||||
##### Context for implementing agent:
|
||||
The Topics page currently renders all categories with their sub-topics expanded. The toggle mechanism exists ("Hide sub-topics ▲") so the infrastructure is there — it just needs the default state flipped. The global search could be a simplified version of the homepage search component, placed in the nav bar with responsive sizing.
|
||||
|
||||
---
|
||||
|
||||
#### Priority 5: Accessibility Fixes (F07, F08, F09, F13)
|
||||
|
||||
**Objective:** Bring the site to WCAG 2.1 Level AA compliance on core accessibility metrics.
|
||||
**Success criteria:** All automated accessibility checks pass (axe-core, Lighthouse accessibility).
|
||||
|
||||
##### Subtasks:
|
||||
1. Fix heading hierarchy: single H1 per page, sequential heading levels
|
||||
2. Add skip-to-content link
|
||||
3. Increase secondary text contrast ratio to ≥ 4.5:1
|
||||
4. Add page-specific `<title>` elements
|
||||
5. Hide Admin dropdown from public users
|
||||
6. Run axe-core audit and fix any additional findings
|
||||
|
||||
##### Acceptance criteria:
|
||||
- [ ] Each page has exactly one H1 element
|
||||
- [ ] Heading levels are sequential (no skips)
|
||||
- [ ] Skip-to-content link is present and functional
|
||||
- [ ] All text meets WCAG AA contrast ratios (4.5:1 for normal text, 3:1 for large text)
|
||||
- [ ] Browser tab titles are page-specific
|
||||
- [ ] Lighthouse Accessibility score ≥ 90
|
||||
|
||||
##### Context for implementing agent:
|
||||
The nav component uses an H1 for the "Chrysopedia" logo — change to a styled `<span>` or `<div>`. Page titles need to be set in the `<head>` per-route. The skip link is a single `<a>` element with a CSS `.sr-only` class that becomes visible on focus. Text contrast fix is a single CSS custom property change.
|
||||
|
||||
---
|
||||
|
||||
### Quick Wins (Trivial/Small Effort)
|
||||
|
||||
1. **F08 — Add skip-to-content link** (Trivial) — one HTML element + 5 lines CSS
|
||||
2. **F13 — Add page-specific titles** (Trivial) — template change per route
|
||||
3. **F09 — Increase text contrast** (Trivial) — CSS color value change
|
||||
4. **F15 — Improve "Start Exploring" label** (Trivial) — text change
|
||||
5. **F14 — Handle empty sub-topics** (Trivial) — conditional display
|
||||
6. **F03 — Hide Admin dropdown from public** (Small) — conditional rendering
|
||||
7. **F07 — Fix heading hierarchy** (Small) — semantic HTML changes
|
||||
8. **F11 — Format creator stats** (Small) — component redesign
|
||||
9. **F16 — Limit visible tags on cards** (Small) — component change
|
||||
|
||||
---
|
||||
|
||||
### Systemic Patterns
|
||||
|
||||
1. **Expert-first design bias.** The site consistently assumes users already know what they want. Search assumes vocabulary. Topics assumes taxonomy knowledge. There is no scaffolding for beginners. This is the single most impactful systemic issue.
|
||||
|
||||
2. **Content-rich, experience-poor.** The content quality is genuinely excellent — detailed, educational, well-structured. But the presentation treats every piece of content identically. There's no visual hierarchy between "featured" and "ordinary" content, no emotional differentiation between categories, no design system that celebrates the content.
|
||||
|
||||
3. **Missing feedback loops.** Users consume content but have no way to signal what was useful, save favorites, track what they've read, or build a personal learning path. The experience is purely consumptive with no personalization or progression signals.
|
||||
|
||||
4. **Accessibility as an afterthought.** Multiple WCAG issues (heading hierarchy, contrast, skip links, page titles) suggest accessibility was not part of the development process. These are individually small fixes but collectively indicate a need for an accessibility-first development practice going forward.
|
||||
|
||||
---
|
||||
|
||||
## Appendix A: Pages Traversed
|
||||
|
||||
| Page | URL | Key Observations |
|
||||
|------|-----|------------------|
|
||||
| Homepage | / | Clear value prop, search works well, lacks beginner guidance |
|
||||
| Topics | /topics | Dense, all expanded by default, good taxonomy but overwhelming |
|
||||
| Creators | /creators | Clean, good genre filters, "Random" sort is nice |
|
||||
| Creator Detail | /creators/copycatt | Good back navigation, stats line needs formatting |
|
||||
| Technique Detail | /techniques/fm-bass-foundation-copycatt | Two-column layout, Key Moments excellent but not linked |
|
||||
| Technique Detail (dense) | /techniques/drum-synthesis-fundamentals-copycatt | 28 key moments, content-heavy, good related techniques section |
|
||||
| Search Results | /search?q=bass | Clean results, 20 results for "bass", good metadata on cards |
|
||||
| Topic Drill-down | /topics/sound-design/bass | Good breadcrumbs, grouped by creator, clean layout |
|
||||
| About | /about | Clear explanation, nice pipeline visualization |
|
||||
| Homepage (mobile) | / (390px) | Layout adapts but nav is cramped |
|
||||
| Topics (mobile) | /topics (390px) | Single column works well |
|
||||
|
||||
## Appendix B: Technical Notes
|
||||
|
||||
- **Framework:** Static Site Generator (pages load instantly, no client-side routing observed)
|
||||
- **Version:** v0.8.0 (Build 2026-03-31)
|
||||
- **Content volume:** ~175 techniques, 5 creators, 8 topic categories, ~50 sub-topics
|
||||
- **Accessibility issues found:** Duplicate H1, heading level skips, missing skip link, borderline contrast on secondary text, no page-specific titles
|
||||
- **Performance:** Excellent — no measurable lag on any interaction
|
||||
- **No images found** on the site (all content is text-based)
|
||||
- **Footer links:** GitHub (source code), About page — good transparency
|
||||
|
|
@ -1,629 +0,0 @@
|
|||
# UI/UX Assessment: Chrysopedia
|
||||
|
||||
## Assessment Date: March 30, 2026
|
||||
## Assessed By: Claude (UI/UX Assessor Agent)
|
||||
## Scope: Full public-facing application — Home, Topics, Creators, Search, Technique detail pages, Creator profiles
|
||||
## Method: Live browser navigation with screenshots, interaction testing, responsive viewport testing
|
||||
|
||||
---
|
||||
|
||||
## 1. Product Context Summary
|
||||
|
||||
Chrysopedia is a knowledge base / encyclopedia for EDM (electronic dance music) production techniques. It curates content from recognized producers and educators ("Creators" like Chee, COPYCATT, Break, Skope) by extracting actionable production techniques and timestamped "Key Moments" from their tutorial videos. The content is organized by topic categories (Workflow, Music Theory, Sound Design, Synthesis, Arrangement, Mixing, Mastering) with sub-topic drill-downs, and can also be browsed by creator or searched via keyword.
|
||||
|
||||
The primary audience spans all tiers of beginner and advanced musicians/music producers. The core value proposition is rapid education: surfacing distilled, high-value production knowledge that would otherwise require watching 4+ hour tutorial videos. The site currently holds ~175 techniques across 6 creators, with 7 top-level topic categories and 50+ sub-topics.
|
||||
|
||||
**The biggest strategic UX challenge:** The site currently presents itself as a reference tool for people who already know what they're looking for. It does not yet effectively serve users who arrive with zero context about EDM production terminology and need guided discovery paths. This is the single most impactful gap between the product's ambition ("educate users quickly with high-value leisure paths") and its current state ("structured database with expert search").
|
||||
|
||||
---
|
||||
|
||||
## 2. Journey Inventory
|
||||
|
||||
| # | Intent | Steps | Discoverability | Friction | Drop-off Risk |
|
||||
|---|--------|-------|-----------------|----------|---------------|
|
||||
| J1 | Find a specific technique I know by name | 2 (type → click result) | High — search is front and center | Low | Low |
|
||||
| J2 | Browse techniques by topic area | 3 (Home → Topics → Sub-topic) | Medium — requires knowing which category | Medium — sub-topics link to search results, not curated pages | Medium |
|
||||
| J3 | Explore what a specific creator teaches | 3 (Home → Creators → Creator) | High — clear nav path | Low | Low |
|
||||
| J4 | Discover techniques as a complete beginner | ??? | **Very Low** — no guided path exists | **Critical** — no "start here," no learning paths, no difficulty levels | **Very High** |
|
||||
| J5 | Read a technique article end-to-end | 2 (search/browse → click article) | Medium | Low — articles are well-structured | Low |
|
||||
| J6 | Find the original video source for a technique | 3+ (article → key moments sidebar → ???) | Low — key moments show timestamps but **many link to 404 pages** | **Critical** — broken links | **Very High** |
|
||||
| J7 | Filter creators by genre | 2 (Creators → genre pills) | High — visible filters | Low | Low |
|
||||
| J8 | Understand what Chrysopedia IS on first visit | 1 (land on home) | **Low** — no tagline, no explanation, no value prop statement | **High** — "Search techniques, key moments, and creators" is functional copy, not motivational | **High** |
|
||||
|
||||
### Key Journey Observations
|
||||
|
||||
**J4 (Beginner Discovery) is the critical gap.** A user who arrives wanting to learn EDM production but doesn't know the difference between "synthesis" and "sound design" has no entry point. There is no "Start Here," no "Popular Techniques," no "Beginner's Path," no difficulty ratings on content, and no contextual help explaining what categories mean. The taxonomy uses expert-level vocabulary (Transient Shaping, Gain Staging, Bus Processing) with no glossary or progressive disclosure.
|
||||
|
||||
**J6 (Key Moments) is broken.** Key Moments displayed in search results link to technique pages using the key moment's slug rather than the parent technique's slug, resulting in "Technique Not Found" 404 pages. This is a data integrity / routing bug that makes a core feature non-functional.
|
||||
|
||||
**J8 (First Impression) undersells the product.** The homepage subtitle "Search techniques, key moments, and creators" reads like a database instruction manual, not an invitation. There is no hero copy explaining *why* this site exists or *what makes it different* from just watching YouTube.
|
||||
|
||||
---
|
||||
|
||||
## 3. Heuristic Scorecard
|
||||
|
||||
| Dimension | Rating | Justification |
|
||||
|-----------|--------|---------------|
|
||||
| **3.1 First Impression & Orientation** | 2 — Deficient | No value proposition, no tagline, no hero narrative. The homepage looks like an internal tool's landing page, not a consumer product. A first-time visitor cannot determine within 10 seconds why they should use this vs. YouTube. |
|
||||
| **3.2 Navigation & Wayfinding** | 3 — Adequate | Top nav is consistent (Home, Topics, Creators). Back buttons present on detail pages. But no breadcrumbs, no "where am I in the taxonomy" indicator, and sub-topic navigation redirects to search results rather than dedicated pages. |
|
||||
| **3.3 Layout, Visual Hierarchy & Typography** | 3 — Adequate | Clean dark theme with reasonable card-based layout. Typography hierarchy is functional but undifferentiated — headings, body text, and metadata all blend together. No color or weight variation to create visual rhythm. The cyan accent is overused (search button, topic badges, hide/show toggles all compete). |
|
||||
| **3.4 Interaction Design & Feedback** | 3 — Adequate | Cards have hover states. Search submits and returns results. But: no loading indicators during search, no empty-state handling visible, no micro-interactions or transitions to create continuity between views. Feels static and utilitarian. |
|
||||
| **3.5 Form Design & Data Entry** | 4 — Good | Only two forms: search input (with placeholder, prominent button) and topic filter. Both work as expected. Search auto-focuses on home page load — good. |
|
||||
| **3.6 Error Handling & Recovery** | 2 — Deficient | "Technique Not Found" page exists but is triggered by the app's own broken links (Key Moments linking to wrong slugs). The error page only offers "Back to Home" — no suggestions, no search redirection, no "did you mean." The yellow "semantic search unavailable" banner on search results is user-facing technical jargon. |
|
||||
| **3.7 Content Quality & Microcopy** | 3 — Adequate | Technique articles are genuinely well-written and valuable — clearly the product's strongest asset. But UI microcopy is bare-minimum: no empty states with guidance, no onboarding copy, no tooltips explaining categories. Button labels are generic ("Search"). |
|
||||
| **3.8 Accessibility (WCAG Baseline)** | 3 — Adequate | Dark theme with light text has generally acceptable contrast. Semantic HTML landmarks present (8 on homepage). Search input has aria label. But: topic category badges (cyan on dark) may have marginal contrast, interactive elements rely heavily on color alone, and keyboard navigation was not deeply tested. |
|
||||
| **3.9 Responsive Design & Device Adaptation** | 4 — Good | Mobile layout stacks correctly — cards go single-column, nav remains accessible, search input and button reflow properly. No content is lost on mobile. Minor issue: nav items on mobile are cramped horizontally at 390px. |
|
||||
| **3.10 Performance Perception** | 4 — Good | Pages load quickly (static site with pre-built HTML). No perceptible layout shifts. Route transitions feel snappy. The "semantic search unavailable" fallback suggests infrastructure awareness. |
|
||||
| **3.11 Trust & Credibility** | 3 — Adequate | Professional enough design, but the "v0.1.0 · Built 2026-03-31 · dev" footer signals an unfinished product. Broken key moment links erode trust. No "About" page explaining the project, team, or methodology. TestCreator showing "0 techniques · 1 video" on the creators page looks like test data left in production. |
|
||||
| **3.12 Emotional Design & Polish** | 2 — Deficient | The experience is functional but joyless. No personality in the copy, no moments of delight, no visual storytelling. The dark theme + monospaced feeling + raw data presentation creates a "database viewer" atmosphere rather than an "exploration playground." For a product targeting musicians/creatives, the aesthetic communicates engineering, not artistry. |
|
||||
|
||||
**Overall Weighted Score: 3.0 / 5 — Adequate but significantly underperforming its potential**
|
||||
|
||||
---
|
||||
|
||||
## 4. Detailed Findings
|
||||
|
||||
### Critical Findings
|
||||
|
||||
---
|
||||
|
||||
### F-001 — Key Moments Link to 404 "Technique Not Found" Pages
|
||||
|
||||
**Severity:** Critical
|
||||
**Dimension:** 3.6 Error Handling & Recovery
|
||||
**Journey affected:** J6 (Find original video source)
|
||||
**Location:** Search results page → Key Moment results → Click through
|
||||
|
||||
**Observation:**
|
||||
When clicking Key Moment results from the search page (e.g., "Shadow Hills compressor for warmth and transient glue on master bus"), the link goes to `/techniques/shadow-hills-compressor-for-warmth-and-transient-glue-on-master-bus` — a slug derived from the key moment title rather than the parent technique's slug. This route does not exist, resulting in a "Technique Not Found" error page.
|
||||
|
||||
**Impact:**
|
||||
Key Moments are a core differentiating feature of Chrysopedia — they're timestamped, actionable nuggets of wisdom. When users can't reach the content behind them, the product's unique value proposition is broken. Users clicking these links will immediately lose trust and likely leave.
|
||||
|
||||
**Recommendation:**
|
||||
Key moment links should resolve to the parent technique page with an anchor or highlight targeting the specific key moment section. The URL should be the parent technique's slug (e.g., `/techniques/mixing-diagnostics-signal-control-chee#key-moment-shadow-hills`). If key moments are not standalone pages, the search result card for a key moment should show which parent technique it belongs to and link there.
|
||||
|
||||
**Effort estimate:** Medium
|
||||
**Dependencies:** Data model — need parent technique slug available in key moment data
|
||||
|
||||
---
|
||||
|
||||
### F-002 — No Value Proposition or Onboarding for First-Time Visitors
|
||||
|
||||
**Severity:** Critical
|
||||
**Dimension:** 3.1 First Impression & Orientation
|
||||
**Journey affected:** J4 (Beginner discovery), J8 (First impression)
|
||||
**Location:** Homepage (`/`)
|
||||
|
||||
**Observation:**
|
||||
The homepage opens directly to "Search techniques, key moments, and creators" with a search box. There is no tagline, hero statement, or explanation of what Chrysopedia is, why it exists, or what makes it valuable. The name "Chrysopedia" itself is not self-explanatory. A music producer arriving for the first time has no way to understand that this is a curated knowledge base distilled from tutorial videos — they see what looks like a generic search interface.
|
||||
|
||||
**Impact:**
|
||||
First-time visitors, especially beginners who are the stated target audience, will bounce. They don't know what to search for. They don't understand the content model (techniques extracted from creator videos). They have no reason to believe this is worth their time over YouTube.
|
||||
|
||||
**Recommendation:**
|
||||
Add a hero section above the search bar with:
|
||||
1. A clear tagline: e.g., "Production techniques from the world's best electronic music creators — distilled so you don't have to watch the 4-hour tutorial."
|
||||
2. A brief "How it works" explainer (3 bullet points or icons): Creators → Videos → Distilled Techniques → Key Moments
|
||||
3. A "Start Exploring" CTA that links to a curated beginner path or the most popular techniques
|
||||
4. Optionally, a featured technique or "Technique of the Day" to immediately demonstrate the content's value
|
||||
|
||||
**Effort estimate:** Medium
|
||||
**Dependencies:** None — can be pure frontend content work
|
||||
|
||||
---
|
||||
|
||||
### High Findings
|
||||
|
||||
---
|
||||
|
||||
### F-003 — No Guided Discovery Path for Beginners
|
||||
|
||||
**Severity:** High
|
||||
**Dimension:** 3.2 Navigation & Wayfinding
|
||||
**Journey affected:** J4 (Beginner discovery)
|
||||
**Location:** Site-wide — no learning paths exist
|
||||
|
||||
**Observation:**
|
||||
The taxonomy uses expert-level vocabulary throughout: "Transient Shaping," "Gain Staging," "Bus Processing," "OTT Compression," "Sidechain Compression." There is no glossary, no difficulty level indicators, no "start here" flow, and no contextual definitions. The Topics page presents all 7 categories with their sub-topics expanded simultaneously — overwhelming for a beginner who doesn't know the difference between Mixing and Mastering.
|
||||
|
||||
**Impact:**
|
||||
The stated goal is to serve "all tiers of beginner and advanced musicians." Currently, only users who already have production vocabulary can navigate effectively. Beginners face a wall of unfamiliar terminology with no scaffolding.
|
||||
|
||||
**Recommendation:**
|
||||
1. **Skill level tags** on techniques (Beginner / Intermediate / Advanced)
|
||||
2. **"Start Here" landing page** with a curated sequence: "New to production? Start with Workflow → Sound Design → Arrangement → Mixing → Mastering"
|
||||
3. **Contextual tooltips** on sub-topic names in the Topics view (hover/tap to see a one-sentence definition)
|
||||
4. **"Learning Paths"** — curated sequences of techniques that build on each other (e.g., "Your First Bass Sound" → "FM Bass Foundation" → "Bass Processing Chain")
|
||||
5. **Popular/Trending section** on home page — social proof helps beginners know what's worth reading
|
||||
|
||||
**Effort estimate:** Large
|
||||
**Dependencies:** Content tagging (difficulty levels) required
|
||||
|
||||
---
|
||||
|
||||
### F-004 — Sub-Topic Navigation Redirects to Search Instead of Curated Pages
|
||||
|
||||
**Severity:** High
|
||||
**Dimension:** 3.2 Navigation & Wayfinding
|
||||
**Journey affected:** J2 (Browse by topic)
|
||||
**Location:** Topics page → clicking any sub-topic (e.g., "Compression")
|
||||
|
||||
**Observation:**
|
||||
Clicking a sub-topic like "Compression" (36 techniques, 5 creators) on the Topics page redirects to `/search?q=compression&scope=topics`, which returns a flat list of Key Moments. This is disorienting for two reasons: (1) the user expected to see techniques organized under "Compression," not raw search results; (2) the search results show mostly Key Moments rather than technique articles, and many of those Key Moments link to 404s (see F-001).
|
||||
|
||||
**Impact:**
|
||||
The taxonomy structure on the Topics page promises organized browsing but delivers a search dump. Users who prefer structured exploration over search are not served. The disconnect between expectation (curated category page) and reality (search results) feels like a shortcut rather than a feature.
|
||||
|
||||
**Recommendation:**
|
||||
Create dedicated sub-topic landing pages (e.g., `/topics/mixing/compression`) that show:
|
||||
1. A brief description of the sub-topic ("Compression in mixing is used for...")
|
||||
2. Techniques grouped by creator or by approach
|
||||
3. The most popular or foundational technique highlighted
|
||||
4. Related sub-topics ("See also: Gain Staging, Limiting")
|
||||
|
||||
If dedicated pages are out of scope for v0.1, at minimum the search-redirect should show Techniques first (not just Key Moments) and include the sub-topic name as a visible heading ("Compression — 36 techniques").
|
||||
|
||||
**Effort estimate:** Medium–Large
|
||||
**Dependencies:** Routing changes, potentially new page template
|
||||
|
||||
---
|
||||
|
||||
### F-005 — The Experience Feels Like a Database, Not a Discovery Playground
|
||||
|
||||
**Severity:** High
|
||||
**Dimension:** 3.12 Emotional Design & Polish
|
||||
**Journey affected:** All journeys
|
||||
**Location:** Site-wide
|
||||
|
||||
**Observation:**
|
||||
Every page presents data in identical flat card lists with minimal visual differentiation. The home page is a search box + two links + a list. The Topics page is a grid of expandable lists. The Creators page is a list. Technique pages are text with a sidebar. There is no visual storytelling, no imagery beyond tiny creator avatars, no color coding beyond the cyan accent, no animations, no personality in the copy, and no interactive elements beyond links and a search box.
|
||||
|
||||
**Impact:**
|
||||
For a product targeting musicians and creative people, the aesthetic is purely utilitarian. The stated goal is to make the website "fun or enticing to use" with "high value leisure paths." Currently, it reads like documentation — valuable but not inviting. Users won't come back for the experience; they'll only come back if they need a specific answer. This undermines the "leisure browsing" goal.
|
||||
|
||||
**Recommendation:**
|
||||
1. **Visual identity beyond dark-mode cards.** Add topic-specific color coding (Mixing = blue, Sound Design = purple, Synthesis = green, etc.) so the taxonomy is visually navigable, not just textually navigable.
|
||||
2. **Creator personality.** Larger creator images, genre tags shown prominently, maybe a quote or style descriptor ("Chee — Experimental bass sound design pioneer").
|
||||
3. **Content teaser elements.** Pull a particularly interesting quote or insight from each technique and display it as a highlighted callout in list views — give users a taste before they click.
|
||||
4. **Interactive exploration.** A visual "topic map" or "technique graph" where users can see connections between concepts (compression relates to gain staging relates to limiting) would be far more engaging than hierarchical lists for exploratory browsing.
|
||||
5. **Micro-interactions.** Smooth transitions between pages, card entrance animations, hover reveals of technique previews — these signal craft and make browsing feel rewarding.
|
||||
|
||||
**Effort estimate:** Large
|
||||
**Dependencies:** Design system investment, potentially content enrichment
|
||||
|
||||
---
|
||||
|
||||
### F-006 — "Semantic Search Unavailable" Banner Exposes Infrastructure to Users
|
||||
|
||||
**Severity:** High
|
||||
**Dimension:** 3.6 Error Handling & Recovery
|
||||
**Journey affected:** J1 (Search for technique)
|
||||
**Location:** Search results page
|
||||
|
||||
**Observation:**
|
||||
A prominent yellow banner reads: "Showing keyword results — semantic search unavailable." This is technical infrastructure language presented to users who have no concept of "semantic search" vs. "keyword search" and no action they can take about it.
|
||||
|
||||
**Impact:**
|
||||
Creates anxiety ("is this broken?") and erodes confidence in results ("am I missing better results?"). Users may interpret this as "search isn't working properly" and leave.
|
||||
|
||||
**Recommendation:**
|
||||
Remove the banner entirely for users. If keyword fallback is the current reality, it should be the silent default. If semantic search becomes available later, promote it as a new feature rather than flagging its absence. At most, a subtle indicator like "Search powered by keywords" could appear in footer-level metadata, not as a warning banner.
|
||||
|
||||
**Effort estimate:** Trivial
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### Medium Findings
|
||||
|
||||
---
|
||||
|
||||
### F-007 — Test Data Visible in Production (TestCreator)
|
||||
|
||||
**Severity:** Medium
|
||||
**Dimension:** 3.11 Trust & Credibility
|
||||
**Journey affected:** J3 (Explore creators)
|
||||
**Location:** Creators page
|
||||
|
||||
**Observation:**
|
||||
"TestCreator" appears in the creators list with "0 techniques · 1 video · 0 views." This is clearly test/development data left in the production build.
|
||||
|
||||
**Impact:**
|
||||
Undermines professionalism. Users may question the quality and maintenance of the platform.
|
||||
|
||||
**Recommendation:**
|
||||
Remove TestCreator from production data. Add a build-time validation that filters out test entities, or use a flag to mark records as test-only.
|
||||
|
||||
**Effort estimate:** Trivial
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### F-008 — Footer Shows Version/Build/Dev Environment Info
|
||||
|
||||
**Severity:** Medium
|
||||
**Dimension:** 3.11 Trust & Credibility
|
||||
**Journey affected:** All journeys (visible on every page)
|
||||
**Location:** Footer on all pages
|
||||
|
||||
**Observation:**
|
||||
The footer displays "v0.1.0 · Built 2026-03-31 · dev · GitHub" on every page. The "dev" label and version number signal an incomplete, development-stage product.
|
||||
|
||||
**Impact:**
|
||||
Users may perceive the site as unreliable or not ready for real use. The "dev" label is particularly concerning — it suggests this isn't even a production deployment.
|
||||
|
||||
**Recommendation:**
|
||||
For the public-facing site: remove "dev" environment indicator, make version number less prominent or hidden, and consider replacing the raw build footer with a more polished footer containing About, Contact, and social links.
|
||||
|
||||
**Effort estimate:** Trivial
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### F-009 — No "About" Page or Project Explanation
|
||||
|
||||
**Severity:** Medium
|
||||
**Dimension:** 3.11 Trust & Credibility
|
||||
**Journey affected:** J8 (Understand what Chrysopedia is)
|
||||
**Location:** Site-wide — no About page exists
|
||||
|
||||
**Observation:**
|
||||
There is no About page, FAQ, or methodology explanation anywhere on the site. Users cannot learn who created this, why it exists, how techniques are extracted from videos, or what the editorial process is. The only external link is the GitHub repository.
|
||||
|
||||
**Impact:**
|
||||
Trust requires context. Users need to know: Is this community-generated? AI-generated? Expert-curated? How are creators selected? Is the content reviewed? Without this, the content exists in a credibility vacuum.
|
||||
|
||||
**Recommendation:**
|
||||
Add a simple About page covering:
|
||||
1. What Chrysopedia is (one paragraph)
|
||||
2. How content is created (extraction methodology)
|
||||
3. Who maintains it
|
||||
4. How to suggest new creators/videos
|
||||
5. Roadmap or "coming soon" — builds excitement
|
||||
|
||||
**Effort estimate:** Small
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### F-010 — Technique Cards in "Recently Added" Don't Show Enough Context
|
||||
|
||||
**Severity:** Medium
|
||||
**Dimension:** 3.7 Content Quality & Microcopy
|
||||
**Journey affected:** J4 (Beginner discovery), J2 (Browse)
|
||||
**Location:** Homepage "Recently Added" section
|
||||
|
||||
**Observation:**
|
||||
Recently added technique cards show: title, creator name, category badge, and a truncated description. They do not show: sub-topics/tags, difficulty level, or the number of key moments. The description truncation cuts off mid-sentence at ~100 characters, which is often not enough to understand what the technique covers.
|
||||
|
||||
**Impact:**
|
||||
Users browsing the home page have insufficient information to decide whether a technique is relevant to them, especially beginners who can't infer content from titles like "Transient Control with Compression and Saturation."
|
||||
|
||||
**Recommendation:**
|
||||
1. Show 2-3 most relevant sub-topic tags on each card (they're already visible on search result cards — bring them to the home page too)
|
||||
2. Add key moment count ("4 key moments") as social proof of content depth
|
||||
3. Increase description truncation limit or show a stronger hook sentence
|
||||
|
||||
**Effort estimate:** Small
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### F-011 — All Creators Show "0 views"
|
||||
|
||||
**Severity:** Medium
|
||||
**Dimension:** 3.11 Trust & Credibility
|
||||
**Journey affected:** J3 (Explore creators)
|
||||
**Location:** Creators page and creator profile pages
|
||||
|
||||
**Observation:**
|
||||
Every creator card and profile shows "0 views" — Caracal Project (0 views), Break (0 views), COPYCATT (0 views), Chee (0 views). This appears to be either unimplemented analytics or a counter that hasn't been activated.
|
||||
|
||||
**Impact:**
|
||||
Displaying zero engagement metrics is worse than showing no metrics at all. It makes the platform look unused and the content unread.
|
||||
|
||||
**Recommendation:**
|
||||
Either implement view tracking so the numbers reflect reality, or remove the "views" metric entirely until it's functional. Consider replacing with a more useful signal like "techniques covering 8 topics" or a genre descriptor.
|
||||
|
||||
**Effort estimate:** Small
|
||||
**Dependencies:** Analytics implementation decision
|
||||
|
||||
---
|
||||
|
||||
### F-012 — No Visual Connection Between Key Moments and Parent Techniques
|
||||
|
||||
**Severity:** Medium
|
||||
**Dimension:** 3.4 Interaction Design & Feedback
|
||||
**Journey affected:** J5 (Read technique), J6 (Find source video)
|
||||
**Location:** Technique detail page — Key Moments sidebar
|
||||
|
||||
**Observation:**
|
||||
The Key Moments sidebar on technique detail pages shows timestamps and descriptions, but there is no interactive connection between the key moments and the main article sections. The article body discusses the same topics (e.g., "Track cloning for safe experimentation") that key moments reference (e.g., "Clone tracks before experimental sound design changes"), but scrolling the article doesn't highlight the corresponding key moment, and clicking a key moment doesn't scroll to the relevant section.
|
||||
|
||||
**Impact:**
|
||||
The two-column layout creates a relationship between long-form explanation (left) and timestamped source reference (right), but this relationship is not interactive. Users must manually correlate content, reducing the value of both views.
|
||||
|
||||
**Recommendation:**
|
||||
1. Anchor-link key moments to their corresponding article sections (click key moment → scroll to section)
|
||||
2. Highlight the active key moment card as the user scrolls through the corresponding article section
|
||||
3. Eventually: embed or link to the actual video timestamp so users can watch the 57-second clip rather than hunting through the full video
|
||||
|
||||
**Effort estimate:** Medium
|
||||
**Dependencies:** Content mapping between key moments and article sections
|
||||
|
||||
---
|
||||
|
||||
### Low / Enhancement Findings
|
||||
|
||||
---
|
||||
|
||||
### F-013 — Search Has No Autocomplete or Suggestions
|
||||
|
||||
**Severity:** Low / Enhancement
|
||||
**Dimension:** 3.4 Interaction Design & Feedback
|
||||
**Journey affected:** J1 (Search), J4 (Beginner discovery)
|
||||
**Location:** Search input on home page and search page
|
||||
|
||||
**Observation:**
|
||||
Typing in the search box provides no autocomplete suggestions, popular searches, or type-ahead results. Users must formulate their query independently and submit to see any results.
|
||||
|
||||
**Recommendation:**
|
||||
Add type-ahead suggestions showing matching techniques, creators, and topics as the user types. For beginners, showing popular searches below the empty search box ("Popular: reverb, compression, bass design, arrangement") would provide discovery scaffolding.
|
||||
|
||||
**Effort estimate:** Medium
|
||||
**Dependencies:** Search index that supports prefix matching
|
||||
|
||||
---
|
||||
|
||||
### F-014 — Topic Filter on Topics Page Has No Feedback
|
||||
|
||||
**Severity:** Low
|
||||
**Dimension:** 3.4 Interaction Design & Feedback
|
||||
**Location:** Topics page → "Filter topics..." input
|
||||
|
||||
**Observation:**
|
||||
The "Filter topics..." input field on the Topics page filters the displayed categories, but there is no result count, no "no results" message if the filter matches nothing, and no indication that filtering is active.
|
||||
|
||||
**Effort estimate:** Small
|
||||
**Dependencies:** None
|
||||
|
||||
---
|
||||
|
||||
### F-015 — Creator Avatars Are Identical Waveform Icons
|
||||
|
||||
**Severity:** Low / Enhancement
|
||||
**Dimension:** 3.12 Emotional Design & Polish
|
||||
**Location:** Creator cards on Creators page and creator profiles
|
||||
|
||||
**Observation:**
|
||||
All creators share the same small waveform/spectrogram icon. There is no visual differentiation between creators — you cannot tell Chee from COPYCATT from Break without reading the text.
|
||||
|
||||
**Recommendation:**
|
||||
Allow creators to have unique avatars or auto-generate distinctive icons (e.g., based on their genre, a color derived from their name, or a unique waveform shape). This adds personality and aids visual scanning.
|
||||
|
||||
**Effort estimate:** Small
|
||||
**Dependencies:** Asset pipeline or avatar generation
|
||||
|
||||
---
|
||||
|
||||
### F-016 — No "Related Techniques" or Cross-Linking Within Articles
|
||||
|
||||
**Severity:** Enhancement
|
||||
**Dimension:** 3.2 Navigation & Wayfinding
|
||||
**Journey affected:** J2 (Browse), J5 (Read technique)
|
||||
**Location:** Technique detail pages
|
||||
|
||||
**Observation:**
|
||||
Technique articles end abruptly after the last section. There are no "Related Techniques," "More from this Creator," or "Also tagged with [compression]" suggestions. The only forward navigation from a technique is the "← Back" link, the footer, or the global nav.
|
||||
|
||||
**Recommendation:**
|
||||
Add a "Related Techniques" section at the bottom of each technique page showing 3-4 related techniques (same creator, same sub-topic, or same tags). This creates exploration loops and increases session depth — essential for the "leisure browsing" goal.
|
||||
|
||||
**Effort estimate:** Medium
|
||||
**Dependencies:** Tag-based or topic-based relation logic
|
||||
|
||||
---
|
||||
|
||||
## 5. Strategic Summary & Development Handoff
|
||||
|
||||
### Overall Assessment
|
||||
|
||||
Chrysopedia has a genuinely valuable content core — the technique articles are well-written, well-structured, and provide real production insights that would take hours to extract from raw tutorial videos. The taxonomy is logical and comprehensive. The technical foundation is solid (fast loading, clean routing, reasonable responsive behavior).
|
||||
|
||||
However, the product is currently a well-organized **database** when it needs to be an **experience**. The biggest systemic issue is that every page is designed for users who already know what they want — there is no discovery scaffolding, no emotional pull, no narrative arc to guide exploration. For a product targeting creative people across all skill levels, the interface feels like reading a technical manual rather than exploring a treasure trove of production wisdom.
|
||||
|
||||
The single most impactful area for improvement is **the first 30 seconds of a new visitor's experience.** If a beginner music producer lands on Chrysopedia and immediately understands (a) what this is, (b) why it's valuable, and (c) how to start exploring even though they don't know the terminology — everything else follows. Currently, that 30-second window produces confusion and likely bounce.
|
||||
|
||||
### Top 5 Priorities
|
||||
|
||||
1. **F-001 — Fix Key Moments broken links** (Critical → blocks core feature)
|
||||
2. **F-002 — Add value proposition / hero section to homepage** (Critical → blocks user acquisition)
|
||||
3. **F-003 — Create guided discovery paths for beginners** (High → blocks target audience)
|
||||
4. **F-005 — Transform the experience from database to discovery playground** (High → blocks engagement/retention)
|
||||
5. **F-004 — Build dedicated sub-topic pages** (High → blocks structured browsing)
|
||||
|
||||
### Quick Wins (Trivial/Small effort, ship fast)
|
||||
|
||||
- **F-006:** Remove "semantic search unavailable" banner (Trivial — 1 line change)
|
||||
- **F-007:** Remove TestCreator from production data (Trivial)
|
||||
- **F-008:** Clean up footer — remove "dev" indicator (Trivial)
|
||||
- **F-011:** Remove "0 views" metric or hide until functional (Small)
|
||||
- **F-010:** Add tags and key moment count to home page technique cards (Small)
|
||||
|
||||
### Systemic Patterns
|
||||
|
||||
1. **No progressive disclosure.** Information is presented at full complexity immediately — no layering from simple to complex, no "learn more" expansion patterns, no glossary support.
|
||||
2. **No content relationships.** Techniques, key moments, creators, and topics exist as isolated entities. There is no "related techniques," no "if you liked this, try...", no cross-linking that would create exploration loops.
|
||||
3. **No personality or emotional engagement.** Copy is purely functional, visuals are purely structural, interactions are purely transactional. There is no editorial voice, no featured content curation, no sense of discovery or delight.
|
||||
4. **Key Moments are under-leveraged.** They're the product's unique differentiator (timestamped insights from real videos) but they're buried in sidebars and broken in search results. They should be front-and-center, playable, and shareable.
|
||||
|
||||
---
|
||||
|
||||
### Task Decomposition for Top 5 Priorities
|
||||
|
||||
---
|
||||
|
||||
## Priority 1: Fix Key Moments Broken Links
|
||||
|
||||
**Objective:** All Key Moment links in search results resolve to their parent technique page, not 404s.
|
||||
**Success criteria:** Clicking any Key Moment search result navigates to the parent technique's detail page with the relevant section visible.
|
||||
|
||||
### Subtasks:
|
||||
1. Audit data model: ensure every key moment record has a `parentTechniqueSlug` field populated
|
||||
2. Update search result rendering: Key Moment cards should link to `/techniques/{parentTechniqueSlug}` not `/techniques/{keyMomentSlug}`
|
||||
3. Add anchor targets to technique page sections so key moment links can deep-link (e.g., `/techniques/mixing-diagnostics#shadow-hills-compressor`)
|
||||
4. Add integration test: verify all key moment slugs in the search index resolve to valid technique pages
|
||||
|
||||
### Acceptance criteria:
|
||||
- [ ] Zero Key Moment links produce 404 errors
|
||||
- [ ] Key Moment search results show parent technique name as secondary text
|
||||
- [ ] Clicking a Key Moment result lands on the parent technique page
|
||||
|
||||
### Context for implementing agent:
|
||||
Key moment search results are rendered at `/search?q=...&scope=topics`. The current link pattern appends the key moment title as a slug to `/techniques/`, but techniques are indexed by their own slug (e.g., `flexible-production-workflow-copycatt`). The fix requires either a lookup table or a data model change to associate key moments with their parent technique slug.
|
||||
|
||||
---
|
||||
|
||||
## Priority 2: Homepage Value Proposition & Hero Section
|
||||
|
||||
**Objective:** First-time visitors understand what Chrysopedia is, why it's valuable, and how to start within 10 seconds.
|
||||
**Success criteria:** A new user can articulate what the site does after viewing the homepage for 10 seconds.
|
||||
|
||||
### Subtasks:
|
||||
1. Design hero section: tagline + 2-3 sentence description + "Start Exploring" CTA
|
||||
2. Add "How It Works" visual: Creator → Video → Techniques → Key Moments (3-4 icon steps)
|
||||
3. Add "Featured Technique" or "Technique of the Day" spotlight below the hero
|
||||
4. Add "Popular Topics" quick-links (top 5-6 sub-topics by technique count) as pills/buttons
|
||||
5. Move "Recently Added" below the new sections — it's currently the only content below the fold
|
||||
|
||||
### Acceptance criteria:
|
||||
- [ ] Hero section visible above the fold with clear value proposition
|
||||
- [ ] "Start Exploring" CTA links to a meaningful entry point
|
||||
- [ ] At least one piece of featured content demonstrates the product's value immediately
|
||||
- [ ] Mobile layout preserves all elements without horizontal scroll
|
||||
|
||||
### Context for implementing agent:
|
||||
The home page is a static-generated page. The hero content is copywriting + HTML/CSS — no backend changes needed. The "Featured Technique" requires selecting one technique to highlight, which could be randomized from a curated set or the most-tagged technique. "Popular Topics" can be derived from the existing sub-topic technique counts visible on the Topics page.
|
||||
|
||||
---
|
||||
|
||||
## Priority 3: Beginner Discovery Paths
|
||||
|
||||
**Objective:** Users with zero production knowledge can navigate Chrysopedia and find relevant, digestible content.
|
||||
**Success criteria:** A simulated beginner user flow (landing page → explore → read first technique) completes in < 5 clicks with no terminology dead-ends.
|
||||
|
||||
### Subtasks:
|
||||
1. Add a "Start Here" or "New to Production?" landing page with curated technique sequence
|
||||
2. Implement difficulty level tags (Beginner/Intermediate/Advanced) on techniques — even if initially applied manually to 20 top techniques
|
||||
3. Add brief plain-English descriptions to topic categories on the Topics page (what does "Gain Staging" mean?)
|
||||
4. Add a "Popular Techniques" section on the homepage sorted by engagement or editorial curation
|
||||
5. Create a "Glossary" page or inline tooltip system for production terminology
|
||||
|
||||
### Acceptance criteria:
|
||||
- [ ] "Start Here" page accessible from homepage and main nav
|
||||
- [ ] At least 20 techniques have difficulty level tags
|
||||
- [ ] Topic categories show descriptions (even brief ones) alongside counts
|
||||
- [ ] No sub-topic name appears without some form of explanation available
|
||||
|
||||
### Context for implementing agent:
|
||||
This is primarily a content + information architecture task. Difficulty tags need a new field in the technique data model. The "Start Here" page is a new route with curated content. Tooltips can use the existing dark theme tooltip pattern if one exists, or be built as a simple hover/tap component. The glossary could be a standalone page or inline definitions.
|
||||
|
||||
---
|
||||
|
||||
## Priority 4: Experience Transformation — Database → Discovery
|
||||
|
||||
**Objective:** Transform the browsing experience from a flat data listing to an engaging exploration interface.
|
||||
**Success criteria:** Users describe the experience as "interesting to browse" in qualitative feedback, and session depth increases (pages per visit > 3).
|
||||
|
||||
### Subtasks:
|
||||
1. Implement topic-specific color coding across the site (Mixing = blue, Sound Design = purple, etc.)
|
||||
2. Add "Related Techniques" section to the bottom of every technique detail page (3-4 related items)
|
||||
3. Add content teasers — pull one interesting quote or insight from each technique and show it in list views
|
||||
4. Implement smooth page transitions and card entrance animations (CSS transitions, no JS library required)
|
||||
5. Add "More from [Creator]" section on technique pages
|
||||
6. Create a visual topic map or interactive exploration interface (stretch goal)
|
||||
|
||||
### Acceptance criteria:
|
||||
- [ ] Each of the 7 top-level topics has a distinct accent color used consistently
|
||||
- [ ] Every technique page has a "Related Techniques" section with at least 2 recommendations
|
||||
- [ ] Page transitions feel smooth (no hard cuts between routes)
|
||||
- [ ] Creator pages show at minimum a genre descriptor and technique count by topic
|
||||
|
||||
### Context for implementing agent:
|
||||
Color coding requires a mapping from topic slugs to color values, applied via CSS custom properties or inline styles. Related techniques can use shared sub-topics as the relation signal — techniques tagged with the same sub-topic are related. Page transitions can be implemented with CSS `view-transition-name` if the framework supports it, or with a simple fade/slide CSS animation on route change.
|
||||
|
||||
---
|
||||
|
||||
## Priority 5: Dedicated Sub-Topic Pages
|
||||
|
||||
**Objective:** Clicking a sub-topic in the Topics view leads to a curated landing page, not raw search results.
|
||||
**Success criteria:** Every sub-topic with >0 techniques has a dedicated page showing techniques organized by creator, with a description and related sub-topics.
|
||||
|
||||
### Subtasks:
|
||||
1. Create a new page template for sub-topic landing pages (`/topics/{topic}/{subtopic}`)
|
||||
2. Populate each page with: sub-topic description, technique list grouped by creator, technique count
|
||||
3. Add "Related Sub-topics" sidebar or section (other sub-topics in the same parent topic)
|
||||
4. Update the Topics page to link sub-topic names to their new landing pages instead of search redirects
|
||||
5. Add breadcrumb navigation: Topics → [Topic] → [Sub-topic]
|
||||
|
||||
### Acceptance criteria:
|
||||
- [ ] All sub-topics with >0 techniques link to a dedicated page
|
||||
- [ ] Each sub-topic page shows techniques grouped by creator
|
||||
- [ ] Breadcrumbs visible and functional on sub-topic pages
|
||||
- [ ] Pages include a brief description of the sub-topic
|
||||
|
||||
### Context for implementing agent:
|
||||
The Topics page already renders sub-topic data including technique counts and creator counts. The sub-topic pages would be generated at build time from the same data source. The current routing sends sub-topic clicks to `/search?q={subtopic}&scope=topics` — this needs to change to `/topics/{parentTopic}/{subtopic}` with a new page template. The description for each sub-topic may need to be written manually or generated.
|
||||
|
||||
---
|
||||
|
||||
## Appendix A: Journey Flow Documentation
|
||||
|
||||
### J1 — Search for "reverb"
|
||||
1. Land on chrysopedia.com → search input auto-focused ✓
|
||||
2. Type "reverb" → press Enter → `/search?q=reverb`
|
||||
3. Yellow "semantic search unavailable" banner appears ✗
|
||||
4. Results show 19 Techniques and 1 Key Moment
|
||||
5. Results include technique cards with creator, category, tags, and description preview
|
||||
6. Click any technique → navigates to detail page ✓
|
||||
|
||||
### J6 — Click Key Moment from search (BROKEN)
|
||||
1. Search "compression" via Topics sub-topic → `/search?q=compression&scope=topics`
|
||||
2. Results show 20 Key Moments (no techniques shown)
|
||||
3. Click "Shadow Hills compressor for warmth and transient glue on master bus"
|
||||
4. Navigate to `/techniques/shadow-hills-compressor-for-warmth-and-transient-glue-on-master-bus`
|
||||
5. **"Technique Not Found" error page** — 404 ✗
|
||||
6. Only recovery option: "Back to Home" link
|
||||
|
||||
### J3 — Explore Chee's techniques
|
||||
1. Home → Creators nav link → `/creators`
|
||||
2. See list of 6 creators with technique/video/view counts
|
||||
3. Genre filter pills available (All, Bass music, Drum & bass, Dubstep, etc.)
|
||||
4. Click "Chee" → `/creators/chee`
|
||||
5. See "14 videos · 0 views" and 62 techniques listed ✓
|
||||
6. Technique cards show category badge, tags, and description preview ✓
|
||||
|
||||
---
|
||||
|
||||
## Appendix B: Evidence Log
|
||||
|
||||
| Finding | Evidence |
|
||||
|---------|----------|
|
||||
| F-001 | URL `/techniques/shadow-hills-compressor-for-warmth-and-transient-glue-on-master-bus` → "Technique Not Found" page. Browser console shows 404 network error. |
|
||||
| F-002 | Homepage screenshot — no tagline, hero, or value prop. Only "Search techniques, key moments, and creators" as subtitle. |
|
||||
| F-003 | Topics page screenshot — sub-topics include "Transient Shaping," "Gain Staging," "Bus Processing" with no definitions or difficulty indicators. |
|
||||
| F-004 | Clicking "Compression" sub-topic → redirects to `/search?q=compression&scope=topics` showing only Key Moments, not a curated page. |
|
||||
| F-005 | All pages use identical card list layout. No color coding, no imagery, no animations, no interactive discovery elements. |
|
||||
| F-006 | Search results page shows yellow banner: "Showing keyword results — semantic search unavailable." |
|
||||
| F-007 | Creators page shows "TestCreator" with "0 techniques · 1 video · 0 views." |
|
||||
| F-008 | Footer on all pages: "v0.1.0 · Built 2026-03-31 · dev · GitHub." |
|
||||
| F-009 | No About link in nav, footer, or any page. Only external link is GitHub repo. |
|
||||
| F-010 | Home page technique cards show only title, creator, category badge, truncated description. No sub-topic tags or key moment count. |
|
||||
| F-011 | All creators show "0 views" — Caracal Project, Break, Skope, COPYCATT, Chee. |
|
||||
| F-012 | Technique detail page Key Moments sidebar — no interaction between scrolling article and key moment cards. |
|
||||
| F-015 | All creators use identical waveform icon — no visual differentiation. |
|
||||
|
||||
---
|
||||
|
||||
*End of assessment.*
|
||||
|
|
@ -1234,9 +1234,14 @@ a.app-footer__repo:hover {
|
|||
padding: 1.25rem 1.5rem;
|
||||
background: var(--color-bg-surface);
|
||||
border: 1px solid var(--color-border);
|
||||
border-left: 3px solid var(--color-accent);
|
||||
border-radius: 0.5rem;
|
||||
text-align: left;
|
||||
position: relative;
|
||||
border-image: linear-gradient(135deg, var(--color-accent), #a855f7) 1;
|
||||
border-image-slice: 1;
|
||||
box-shadow:
|
||||
0 0 20px rgba(34, 211, 238, 0.15),
|
||||
0 0 40px rgba(34, 211, 238, 0.05);
|
||||
}
|
||||
|
||||
.home-featured__label {
|
||||
|
|
@ -2144,12 +2149,14 @@ a.app-footer__repo:hover {
|
|||
text-decoration: none;
|
||||
color: inherit;
|
||||
box-shadow: 0 1px 3px var(--color-shadow);
|
||||
transition: border-color 0.15s, box-shadow 0.15s;
|
||||
transition: border-color 0.15s, box-shadow 0.15s, transform 0.2s;
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
.creator-technique-card:hover {
|
||||
border-color: var(--color-accent-hover);
|
||||
box-shadow: 0 2px 8px var(--color-accent-subtle);
|
||||
transform: scale(1.02);
|
||||
}
|
||||
|
||||
.creator-technique-card__title {
|
||||
|
|
@ -2233,6 +2240,13 @@ a.app-footer__repo:hover {
|
|||
box-shadow: 0 1px 3px var(--color-shadow);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
transition: box-shadow 0.15s, transform 0.2s;
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
.topic-card:hover {
|
||||
box-shadow: 0 4px 12px var(--color-shadow);
|
||||
transform: scale(1.02);
|
||||
}
|
||||
|
||||
.topic-card__body {
|
||||
|
|
@ -3623,6 +3637,24 @@ a.app-footer__repo:hover {
|
|||
to { opacity: 1; transform: translateX(-50%) translateY(0); }
|
||||
}
|
||||
|
||||
/* ── Card stagger entrance animation ──────────────────────────────────── */
|
||||
|
||||
@keyframes cardEnter {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(12px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
.card-stagger {
|
||||
animation: cardEnter 0.3s ease-out both;
|
||||
animation-delay: calc(var(--stagger-index, 0) * 60ms);
|
||||
}
|
||||
|
||||
/* ── Recent card with creator ─────────────────────────────────────────── */
|
||||
|
||||
.recent-card__header {
|
||||
|
|
|
|||
|
|
@ -138,11 +138,12 @@ export default function CreatorDetail() {
|
|||
<div className="empty-state">No techniques yet.</div>
|
||||
) : (
|
||||
<div className="creator-techniques__list">
|
||||
{techniques.map((t) => (
|
||||
{techniques.map((t, i) => (
|
||||
<Link
|
||||
key={t.id}
|
||||
to={`/techniques/${t.slug}`}
|
||||
className="creator-technique-card"
|
||||
className="creator-technique-card card-stagger"
|
||||
style={{ '--stagger-index': i } as React.CSSProperties}
|
||||
>
|
||||
<span className="creator-technique-card__title">
|
||||
{t.title}
|
||||
|
|
|
|||
|
|
@ -142,13 +142,13 @@ export default function Home() {
|
|||
|
||||
{/* Navigation cards */}
|
||||
<section className="nav-cards">
|
||||
<Link to="/topics" className="nav-card">
|
||||
<Link to="/topics" className="nav-card card-stagger" style={{ '--stagger-index': 0 } as React.CSSProperties}>
|
||||
<h3 className="nav-card__title"><IconTopics /> Topics</h3>
|
||||
<p className="nav-card__desc">
|
||||
Browse techniques organized by category and sub-topic
|
||||
</p>
|
||||
</Link>
|
||||
<Link to="/creators" className="nav-card">
|
||||
<Link to="/creators" className="nav-card card-stagger" style={{ '--stagger-index': 1 } as React.CSSProperties}>
|
||||
<h3 className="nav-card__title"><IconCreators /> Creators</h3>
|
||||
<p className="nav-card__desc">
|
||||
Discover creators and their technique libraries
|
||||
|
|
@ -199,11 +199,12 @@ export default function Home() {
|
|||
{recent
|
||||
.filter((t) => t.id !== featured?.id)
|
||||
.slice(0, 4)
|
||||
.map((t) => (
|
||||
.map((t, i) => (
|
||||
<Link
|
||||
key={t.id}
|
||||
to={`/techniques/${t.slug}`}
|
||||
className="recent-card"
|
||||
className="recent-card card-stagger"
|
||||
style={{ '--stagger-index': i } as React.CSSProperties}
|
||||
>
|
||||
<span className="recent-card__header">
|
||||
<span className="recent-card__title">{t.title}</span>
|
||||
|
|
|
|||
|
|
@ -77,8 +77,8 @@ export default function SearchResults() {
|
|||
Techniques ({techniqueResults.length})
|
||||
</h3>
|
||||
<div className="search-group__list">
|
||||
{techniqueResults.map((item) => (
|
||||
<SearchResultCard key={`tp-${item.slug}`} item={item} />
|
||||
{techniqueResults.map((item, i) => (
|
||||
<SearchResultCard key={`tp-${item.slug}`} item={item} staggerIndex={i} />
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -92,7 +92,7 @@ export default function SearchResults() {
|
|||
</h3>
|
||||
<div className="search-group__list">
|
||||
{momentResults.map((item, i) => (
|
||||
<SearchResultCard key={`km-${item.slug}-${i}`} item={item} />
|
||||
<SearchResultCard key={`km-${item.slug}-${i}`} item={item} staggerIndex={i} />
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -112,11 +112,12 @@ function getSearchResultLink(item: SearchResultItem): string {
|
|||
return `/techniques/${item.slug}`;
|
||||
}
|
||||
|
||||
function SearchResultCard({ item }: { item: SearchResultItem }) {
|
||||
function SearchResultCard({ item, staggerIndex }: { item: SearchResultItem; staggerIndex: number }) {
|
||||
return (
|
||||
<Link
|
||||
to={getSearchResultLink(item)}
|
||||
className="search-result-card"
|
||||
className="search-result-card card-stagger"
|
||||
style={{ '--stagger-index': staggerIndex } as React.CSSProperties}
|
||||
>
|
||||
<div className="search-result-card__header">
|
||||
<span className="search-result-card__title">{item.title}</span>
|
||||
|
|
|
|||
|
|
@ -136,11 +136,12 @@ export default function SubTopicPage() {
|
|||
</span>
|
||||
</h3>
|
||||
<div className="subtopic-group__list">
|
||||
{group.techniques.map((t) => (
|
||||
{group.techniques.map((t, i) => (
|
||||
<Link
|
||||
key={t.id}
|
||||
to={`/techniques/${t.slug}`}
|
||||
className="subtopic-technique-card"
|
||||
className="subtopic-technique-card card-stagger"
|
||||
style={{ '--stagger-index': i } as React.CSSProperties}
|
||||
>
|
||||
<span className="subtopic-technique-card__title">{t.title}</span>
|
||||
{t.topic_tags && t.topic_tags.length > 0 && (
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ export default function TopicsBrowse() {
|
|||
</div>
|
||||
) : (
|
||||
<div className="topics-grid">
|
||||
{filtered.map((cat) => {
|
||||
{filtered.map((cat, i) => {
|
||||
const slug = catSlug(cat.name);
|
||||
const isExpanded = expanded.has(cat.name);
|
||||
const totalTechniques = cat.sub_topics.reduce(
|
||||
|
|
@ -125,10 +125,11 @@ export default function TopicsBrowse() {
|
|||
return (
|
||||
<div
|
||||
key={cat.name}
|
||||
className="topic-card"
|
||||
className="topic-card card-stagger"
|
||||
style={{
|
||||
borderLeftColor: `var(--color-badge-cat-${slug}-text)`,
|
||||
}}
|
||||
'--stagger-index': i,
|
||||
} as React.CSSProperties}
|
||||
>
|
||||
<div className="topic-card__body">
|
||||
<h3 className="topic-card__name">
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue