Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 55 additions & 20 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

## Executive Summary

This roadmap outlines the development plan for Tyler Earls' portfolio website, focusing on performance optimization, modern React tooling, and enhanced user experience. The project has **completed Phase 5 (React Compiler Integration)** and **Phase 6 (CI/CD setup)**, and is now working through **Phase 7 (UI/UX Enhancements)** with 12 open issues.
This roadmap outlines the development plan for Tyler Earls' portfolio website, focusing on performance optimization, modern React tooling, and enhanced user experience. The project has **completed Phase 5 (React Compiler Integration)** and **Phase 6 (CI/CD setup)**, and is now working through **Phase 7 (UI/UX Enhancements)** with 11 open issues.

**Current Focus**: Accessibility & Core Web Vitals! Critical issue #61 (WCAG AA contrast) completed Nov 16! Now focusing on high-priority accessibility improvements (#62, #63).
**Current Focus**: Accessibility & Core Web Vitals! Issues #61 (WCAG AA contrast) and #62 (touch target sizes) completed! Now focusing on #63 (Cumulative Layout Shift on mobile).

---

Expand All @@ -21,18 +21,15 @@ This roadmap outlines the development plan for Tyler Earls' portfolio website, f

## Open Issues Summary

### Priority Breakdown (12 Total - 1 Completed)
### Priority Breakdown (11 Total - 2 Completed)

#### 🔴 Critical Priority (0 issues)

✅ **#61** - Fix Active Navigation Link Contrast (WCAG AA Failure) - **COMPLETED Nov 16, 2025**

#### 🟡 High Priority (2 issues) - Effort: ~4-8 hours
#### 🟡 High Priority (1 issue) - Effort: ~2-5 hours

- **#62** - Increase Touch Target Sizes for Mobile Accessibility - _~2-3 hours_
- GitHub label: 🟡 MAJOR
- Impact: Mobile UX and accessibility compliance
- Scope: Navigation toggle, social media links, project cards
✅ **#62** - Increase Touch Target Sizes for Mobile Accessibility - **COMPLETED Nov 23, 2025**

- **#63** - Fix Cumulative Layout Shift (CLS) on Mobile - _~2-5 hours_
- GitHub label: 🟡 MAJOR
Expand Down Expand Up @@ -166,14 +163,16 @@ _Successfully migrated to TailwindCSS v4 with modern config_
- Changes: Updated `--active-light` color from cyan-400 to darker cyan (rgb(0, 150, 175))
- Result: Achieves 3:1+ contrast ratio for WCAG AA compliance

**Next Up**:

2. **#62** - Increase Touch Target Sizes for Mobile Accessibility - **START NEXT**
2. ✅ **#62** - Increase Touch Target Sizes for Mobile Accessibility - **COMPLETED**
- Priority: 🟡 HIGH
- Effort: ~2-3 hours
- Impact: Mobile UX and accessibility
- Status: Completed Nov 23, 2025
- Effort: ~2 hours (actual)
- Changes: Updated touch targets across all interactive elements
- Result: All buttons, links, and interactive elements now meet WCAG 2.5.5 minimum (44×44px)

3. **#63** - Fix Cumulative Layout Shift (CLS) on Mobile
**Next Up**:

3. **#63** - Fix Cumulative Layout Shift (CLS) on Mobile - **START NEXT**
- Priority: 🟡 HIGH
- Effort: ~2-5 hours
- Impact: Core Web Vitals score
Expand Down Expand Up @@ -285,8 +284,8 @@ Phase 6: CI/CD & Production Readiness ✅ COMPLETE

Phase 7: Accessibility & Core Web Vitals (CURRENT FOCUS)
├── ✅ #61 Navigation link contrast (1h) - COMPLETED
├── 🟡 #62 Touch target sizes (2-3h) - HIGH PRIORITY - NEXT
├── 🟡 #63 Fix CLS on mobile (2-5h) - HIGH PRIORITY
├── #62 Touch target sizes (2h) - COMPLETED
├── 🟡 #63 Fix CLS on mobile (2-5h) - HIGH PRIORITY - NEXT
├── 🔵 #64 WCAG AAA contrast (2-4h) - ENHANCEMENT
└── 🔵 #65 Font size readability (1-2h) - ENHANCEMENT

Expand Down Expand Up @@ -366,17 +365,17 @@ _None - All prerequisites for #43 are complete. Ready to implement._
| Priority | Open | In Progress | Closed (This Sprint) | Total Open |
| ----------- | ------ | ----------- | -------------------- | ---------- |
| 🔴 Critical | 0 | 0 | 1 | 0 |
| 🟡 High | 2 | 0 | 7 | 2 |
| 🟡 High | 1 | 0 | 8 | 1 |
| 🟢 Medium | 3 | 0 | 2 | 3 |
| 🔵 Low | 7 | 0 | 0 | 7 |
| **TOTAL** | **12** | **0** | **10** | **12** |
| **TOTAL** | **11** | **0** | **11** | **11** |

### Issues by Category

**React Compiler** (0 open, 5 closed): Closed: #38 (epic), #39, #40, #41, #42, #43, #44
**Bugs** (0 open, 1 closed): Closed: #51 (navigation header overflow)
**CI/CD** (0 open, 1 closed): Closed: #18 (GitHub Actions pipeline)
**Accessibility** (4 open, 1 closed): Open: #62, #63, #64, #65 | Closed: #61 (navigation contrast)
**Accessibility** (3 open, 2 closed): Open: #63, #64, #65 | Closed: #61 (navigation contrast), #62 (touch targets)
**UI/UX** (6 open, 2 closed): Open: #10, #11, #13, #14, #15, #27 | Closed: #58 (left-align text), #28 (React 19 Meta)
**Research** (2 open): #33, #34

Expand All @@ -385,7 +384,7 @@ _None - All prerequisites for #43 are complete. Ready to implement._
| Effort Level | Count | Issues |
| ------------- | ----- | ------------------------------ |
| Small (< 2h) | 4 | #11, #13, #33, #34, #65 |
| Medium (2-8h) | 5 | #62, #63, #64, #27, #10 |
| Medium (2-8h) | 4 | #63, #64, #27, #10 |
| Large (> 8h) | 3 | #14 (1-2 days), #15 (1-2 days) |

**Note**: Issue #14 categorized as Large based on 1-2 days estimate (~8-16 hours total effort).
Expand Down Expand Up @@ -453,6 +452,42 @@ _None - All prerequisites for #43 are complete. Ready to implement._

## Changelog

### 2025-11-23 - Issue #62 Completed: Touch Target Sizes Increased for Mobile Accessibility

- **Completed**: #62 - Increase Touch Target Sizes for Mobile Accessibility
- **Priority**: 🟡 HIGH (GitHub label: MAJOR)
- **Status**: Completed Nov 23, 2025
- **Effort**: ~2 hours (within 2-3 hour estimate)
- **Implementation**: Enhanced touch targets across all interactive elements to meet WCAG 2.5.5 standards
- **Changes**:
- **Navigation Toggle**: Increased from 36×36px to 44×44px with proper padding
- **Navigation Links**: Added min-height: 44px with padding (10px vertical, 16px horizontal)
- **Social Media Icons**: Added min-width/min-height: 44px with 6px padding
- **Dark Mode Toggle**: Applied global button rule for 44×44px minimum
- **Inline Anchor Links**: Added min-height: 44px with vertical padding
- **Updated navigation bar height**: Changed from 68px to 76px to accommodate larger toggle
- **Added WCAG 2.5.5 compliance comments** in CSS files for maintainability
- **Files Modified**:
- `src/components/navigation/NavigationToggle/NavigationToggle.module.css`
- `src/components/navigation/NavigationBar/NavigationBar.module.css`
- `src/components/SocialMediaIcons/SocialMediaIcon.module.css`
- `src/styles/globals.css`
- `src/components/InlineAnchor/InlineAnchor.tsx`
- **Result**:
- ✅ All interactive elements now meet 44×44px minimum touch target size
- ✅ WCAG 2.5.5 Level AAA compliance achieved for touch targets
- ✅ All 131 unit tests passing
- ✅ Production build successful
- ✅ No visual regressions on desktop/tablet viewports
- **Impact**:
- Dramatically improved mobile UX for all users
- Enhanced accessibility for users with motor impairments
- Reduced tap errors on mobile devices
- Resolves 148 violations reported in issue (all pages: Home, Code, Contact)
- Better compliance with mobile accessibility guidelines
- **Testing**: Verified touch targets meet minimum sizes across all components
- **Next Actions**: Proceed with #63 (Fix Cumulative Layout Shift on mobile)

### 2025-11-16 - Issue #61 Completed: Navigation Link Contrast Fixed for WCAG AA

- **Completed**: #61 - Fix Active Navigation Link Contrast (WCAG AA Failure)
Expand Down
8 changes: 8 additions & 0 deletions src/components/InlineAnchor/InlineAnchor.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/* WCAG 2.5.5 - Ensure inline anchor links meet minimum touch target */
.inline-anchor-link {
display: inline-flex;
min-height: var(--touch-target-min);
align-items: center;
padding-top: 0.5rem;
padding-bottom: 0.5rem;
}
2 changes: 2 additions & 0 deletions src/components/InlineAnchor/InlineAnchor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import type { PropsWithChildren } from "react";

import ExternalLinkIcon from "@/components/icons/ExternalLinkIcon.tsx";
import { mergeClasses } from "@/util/styling/styling.utils.ts";
import styles from "./InlineAnchor.module.css";

export type InlineAnchorProps = PropsWithChildren<{
ariaLabel: string;
Expand Down Expand Up @@ -29,6 +30,7 @@ export default function InlineAnchor({
aria-label={ariaLabel}
target={isExternal ? "_blank" : undefined}
rel="noreferrer"
className={styles["inline-anchor-link"]}
>
<InlineAnchorContent
isExternal={isExternal}
Expand Down
10 changes: 10 additions & 0 deletions src/components/SocialMediaIcons/SocialMediaIcon.module.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
/* WCAG 2.5.5 - Ensure social media icon links meet 44×44px minimum touch target */
.icon-base {
min-width: var(--touch-target-min);
min-height: var(--touch-target-min);
display: inline-flex;
align-items: center;
justify-content: center;
padding: 6px;
}

.icon-base svg {
height: 2rem;
width: 2rem;
Expand Down
13 changes: 11 additions & 2 deletions src/components/navigation/NavigationBar/NavigationBar.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,17 @@
justify-self: center;
align-self: center;
width: fit-content;
/* 68 px height = 36px height of toggle container + 32px vertical padding */
@apply sm:h-[68px] sm:w-full sm:flex-row;
/* Updated from 68px to 76px to accommodate 44px toggle height + 32px padding (sm: breakpoint and above) */
@apply sm:h-[76px] sm:w-full sm:flex-row;
}

/* WCAG 2.5.5 - Ensure navigation links meet 44×44px minimum touch target */
.navigation-list-container a {
min-height: var(--touch-target-min);
display: inline-flex;
align-items: center;
justify-content: center;
padding: 10px 16px;
}

.navigation-toggle-container {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
#custom-toggler {
width: 36px;
height: 36px;
/* WCAG 2.5.5 - Touch target minimum 44×44px for mobile accessibility */
min-width: var(--touch-target-min);
min-height: var(--touch-target-min);
width: var(--touch-target-min);
height: var(--touch-target-min);
display: flex;
flex-flow: column;
gap: 0.5rem 0;
justify-content: center;
align-items: center;
/* Add padding for better touch area */
padding: 4px;
}

#custom-toggler > div {
Expand Down
17 changes: 17 additions & 0 deletions src/styles/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@
/* Custom z-index */
--z-index-100: 100;

/* WCAG 2.5.5 - Touch target minimum size */
--touch-target-min: 44px;

/* Custom box shadows */
--shadow-outline-dark: 0 0 0 3px #67e8f9;
--shadow-outline-inset-dark:
Expand Down Expand Up @@ -149,3 +152,17 @@ html * {
color: var(--accent-color);
}
}

/* WCAG 2.5.5 - Ensure all buttons and interactive elements meet 44×44px minimum touch target for mobile accessibility
* NOTE: This global rule applies to ALL buttons in the project as a baseline accessibility standard.
* If future components need different sizing, use .btn-compact or similar exceptions.
*/
button {
min-width: var(--touch-target-min);
min-height: var(--touch-target-min);
display: inline-flex;
align-items: center;
justify-content: center;
padding: 6px;
cursor: pointer;
}