Skip to content

Conversation

@jeremyeder
Copy link
Contributor

Summary

This PR implements a comprehensive UI refresh with a dark-first design system, replacing the slate-based corporate aesthetic with a polished modern look using the cl0ck design system.

Changes

Phase 1: Foundation & Design System

  • ✅ Added TOKENS constant with dark-first design values (#0a0a0a background)
  • ✅ Updated useTheme hook to force dark mode everywhere
  • ✅ Created 7 new design system components:
    • StatusBadge - Shadow-based status indicators with glow
    • StatCard - Metric display cards
    • ControlButton - Touch-optimized buttons (44pt min)
    • SectionHeader - Visual hierarchy headers
    • ScreenLayout - Standard wrapper with pull-to-refresh
    • ProgressBar - Progress with shadow accent
    • EmptyState - Friendly empty states

Phase 2: Screen Updates

  • Dashboard: Removed fake quick actions (I'm Feeling Lucky, Inspire Me, Go Invent, Add Action)
  • Sessions: Added EmptyState component for better UX
  • Settings: Removed "Soon" badges from GitHub Integration and API Keys
  • Privacy: Condensed bullet points from 7 to 3 for clarity

Phase 3: Component Migration

Updated 6 UI components to use TOKENS:

  • Badge.tsx - Uses TOKENS.radius20
  • Toggle.tsx - Uses TOKENS.primary, border, card
  • OfflineBanner.tsx - Uses TOKENS.danger, textPrimary
  • ErrorMessage.tsx - Uses TOKENS for all colors
  • Toast.tsx - Uses TOKENS for backgrounds
  • FAB.tsx - Uses TOKENS.primary

Design Decisions

  1. Dark-first everywhere: Forced dark mode via useTheme hook
  2. Shadow-based glow: Replaced SVG radial gradients with shadow effects (8-12 hour savings)
  3. Flat token structure: Simple TOKENS.textPrimary instead of nested TOKENS.text.primary
  4. 4px spacing base: All spacing uses multiples of 4px for consistency
  5. Legacy compatibility: Kept COLORS export for potential rollback

Testing Checklist

  • App background is #0a0a0a (verify in Dashboard, Sessions, Inbox)
  • Card backgrounds are #1a1a1a with shadows
  • StatusBadge shows colored dot + shadow glow
  • Touch targets are ≥44pt for all buttons
  • Pull-to-refresh works on screens with ScreenLayout
  • No "Soon" badges visible in Settings
  • Privacy has 3 condensed bullet points
  • Empty states display correctly
  • Cross-platform: Android elevation fallback works

Files Changed

Created (7 components):

  • components/design-system/StatusBadge.tsx
  • components/design-system/StatCard.tsx
  • components/design-system/ControlButton.tsx
  • components/design-system/SectionHeader.tsx
  • components/design-system/ScreenLayout.tsx
  • components/design-system/ProgressBar.tsx
  • components/design-system/EmptyState.tsx

Modified (11 files):

  • utils/constants.ts - Added TOKENS
  • hooks/useTheme.tsx - Force dark mode
  • app/(tabs)/index.tsx - Remove fake actions
  • app/sessions/index.tsx - Add EmptyState
  • app/settings/index.tsx - Remove Soon badges
  • app/settings/privacy.tsx - Condense text
  • components/ui/Badge.tsx - Use TOKENS
  • components/ui/Toggle.tsx - Use TOKENS
  • components/ui/OfflineBanner.tsx - Use TOKENS
  • components/ui/ErrorMessage.tsx - Use TOKENS
  • components/ui/Toast.tsx - Use TOKENS
  • components/layout/FAB.tsx - Use TOKENS

Rollback Plan

If issues arise, simply revert to main:

git checkout main
git branch -D feature/ui-refresh

🤖 Generated with Claude Code

Developer and others added 8 commits January 11, 2026 14:15
- Add TOKENS constant with dark-first design system values
- Update useTheme hook to force dark mode with TOKENS
- Create 7 new design system components:
  - StatusBadge: Shadow-based status indicators
  - StatCard: Metric display cards
  - ControlButton: Touch-optimized buttons
  - SectionHeader: Visual hierarchy headers
  - ScreenLayout: Standard screen wrapper with pull-to-refresh
  - ProgressBar: Progress indicator with shadow accent
  - EmptyState: Friendly empty state component
- Add test-components.tsx for component validation

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
- Remove fake quick actions (I'm Feeling Lucky, Inspire Me, Go Invent, Add Action)
- Keep only functional quick actions (Interactive, Running, Notifications)
- Update to 3-column grid layout for better spacing

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
- Update sessions index to use EmptyState component
- Add router for create session action in empty state

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
Phase 2 updates:
- Settings: Remove GitHub Integration and API Keys "Soon" badges
- Settings Privacy: Condense bullet points from 7 to 3 key points
- Sessions: Add EmptyState component

Phase 3 updates:
- Badge: Use TOKENS.radius20 for consistency
- Toggle: Use TOKENS colors (primary, border, card)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
Component updates:
- OfflineBanner: Use TOKENS for danger color and text
- ErrorMessage: Use TOKENS for colors and radius
- Toast: Use TOKENS for background colors (primary, warning, success, danger, elevated)
- FAB: Use TOKENS.primary for background color

Cleanup:
- Delete test-components.tsx (testing complete)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
Comprehensive update to migrate entire codebase from legacy light theme
colors to dark-first TOKENS design system.

Color property migrations:
- colors.text → colors.textPrimary (white text on dark)
- colors.accent → colors.primary (blue #3b82f6)
- colors.error → colors.danger (red #ef4444)
- colors.textPrimarySecondary → colors.textSecondary

Files updated (46 total):
- All app screens (tabs, settings, sessions, decisions, RFE, etc.)
- All components (chat, inbox, layout, notifications, session)
- Design system components (ScreenLayout, SectionHeader)
- Theme hook (useTheme.tsx)

Type system fixes:
- Updated ThemeContextType interface to use typeof TOKENS
- Fixed ScreenLayout to use SafeAreaView from react-native-safe-area-context
- Fixed SectionHeader style prop type from ViewStyle to TextStyle

All screens now display white/light gray text on dark backgrounds, making
content readable throughout the app. TypeScript type-check passes with zero
errors.

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
React Native's Animated API doesn't support color interpolation reliably
across platforms. Removed progress and status flash animations that were
using color interpolations, replacing them with static colors.

Changes:
- Removed Animated.interpolate for progressTextColor, progressBgColor, statusBgColor
- Replaced Animated.Text and Animated.View with standard Text and View
- Removed animation useEffects and refs
- Added static wrapper styles (statusBadgeWrapper, progressWrapper)
- Removed unused imports (useEffect, useRef, Animated)

This fixes the runtime error:
"Invariant Violation: outputRange must contain color or value with numeric component"

The app now loads without errors while maintaining dark theme readability.

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
- Session names now dynamically generate dates (Jan 11, Jan 10, etc.)
- All timestamps use relative dates (Date.now() - offset)
- Inbox data updated from December 2025 to current dates
- Notification history uses relative timestamps
- Format design system components with Prettier

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
@jeremyeder jeremyeder merged commit 0625504 into main Jan 11, 2026
1 check failed
@jeremyeder jeremyeder deleted the feature/ui-refresh branch January 11, 2026 21:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants