veza/apps/web/docs/CUSTOM_BUTTONS_AUDIT.md
senke 62e28b8557 consistency: audit custom button implementations (Action 9.2.1.1)
- Scanned 166 files with button elements
- Identified 30+ high-priority custom button implementations
- Documented locations, line numbers, and recommended Button variants
- Created comprehensive audit report: apps/web/docs/CUSTOM_BUTTONS_AUDIT.md
- High priority: Live stream, Dashboard, Social, Admin, Studio, File Manager, Modals
- Includes migration strategy and next steps
2026-01-16 01:28:37 +01:00

7.4 KiB

Custom Button Implementations Audit

Date: 2025-01-27
Action: 9.2.1.1 - Find all custom button implementations
Purpose: Identify all buttons with inline className styles that should be replaced with the Button component from @/components/ui/button

Summary

  • Total files with button elements: 166 files
  • Button component location: apps/web/src/components/ui/button.tsx
  • Legacy Button component: apps/web/src/components/base/Button.tsx (uses CSS classes, different API)

Custom Button Implementations Found

High Priority (Should be replaced)

1. Live Stream Components

  • File: apps/web/src/components/live/LiveStreamDetailView.tsx
    • Line 195-200: Send chat button with className="absolute right-1.5 top-1.5 p-1.5 bg-kodo-cyan text-black rounded-full hover:bg-white transition-colors"
    • Line 205-211: Tip button with className="text-kodo-gold hover:text-white"
    • Recommendation: Replace with Button component (variant="default" for send, variant="ghost" for tip)

2. Dashboard Page

  • File: apps/web/src/pages/DashboardPage.tsx
    • Line 235-237: Time filter button with complex className
    • Line 238-240: Active time filter button with className="text-xs font-medium text-kodo-cyan bg-kodo-cyan/10 px-2 py-1 rounded-lg border border-kodo-cyan/20..."
    • Line 241-243: Time filter button with complex className
    • Recommendation: Replace with Button component (variant="outline" for inactive, variant="default" for active)

3. Social Components

  • File: apps/web/src/components/social/CommentItem.tsx

    • Line 61: Button with className="hover:text-white transition-colors"
    • Recommendation: Replace with Button component (variant="ghost")
  • File: apps/web/src/components/social/PostCard.tsx

    • Line 239: Button with className="w-full text-center text-xs text-kodo-cyan mt-4 hover:underline"
    • Recommendation: Replace with Button component (variant="link")
  • File: apps/web/src/pages/SocialPage.tsx

    • Line 112: Button with className="flex items-center gap-2 text-kodo-secondary hover:text-kodo-magenta transition-colors"
    • Line 116: Button with className="flex items-center gap-2 text-kodo-secondary hover:text-kodo-cyan transition-colors"
    • Line 120: Button with className="flex items-center gap-2 text-kodo-secondary hover:text-white transition-colors"
    • Recommendation: Replace with Button component (variant="ghost")
  • File: apps/web/src/components/views/SocialView.tsx

    • Line 75: Button with className="w-full flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium text-gray-400 hover:text-white"
    • Line 146-150: Multiple buttons with className="hover:text-white"
    • Recommendation: Replace with Button component (variant="ghost")

4. Admin Components

  • File: apps/web/src/components/admin/AdminUsersView.tsx

    • Line 169: Disabled button with className="hover:text-white disabled:opacity-50"
    • Line 172: Next button with className="hover:text-white"
    • Recommendation: Replace with Button component (variant="ghost", disabled prop)
  • File: apps/web/src/components/admin/UserTableRow.tsx

    • Line 99: Button with className="w-full text-left px-4 py-2.5 text-xs text-gray-300 hover:bg-white/10 flex items-center gap-2"
    • Recommendation: Replace with Button component (variant="ghost")

5. Studio Components

  • File: apps/web/src/components/studio/ProjectsManager.tsx

    • Line 196: Button with className="p-1.5 rounded bg-kodo-slate text-white"
    • Line 199: Button with className="p-1.5 rounded text-gray-500 hover:text-white"
    • Recommendation: Replace with Button component (variant="secondary" and "ghost")
  • File: apps/web/src/components/studio/CloudFileBrowser.tsx

    • Line 403: Button with className="p-1.5 hover:bg-white/10 rounded text-gray-400 hover:text-white"
    • Line 406: Similar button
    • Recommendation: Replace with Button component (variant="ghost")

6. File Manager

  • File: apps/web/src/components/views/FileManagerView.tsx
    • Line 357: Button with className="p-1.5 hover:bg-white/10 rounded text-gray-400 hover:text-white"
    • Line 363: Similar button
    • Recommendation: Replace with Button component (variant="ghost")

7. Modal Components

  • File: apps/web/src/components/modals/CreatorModal.tsx

    • Line 66: Close button with className="text-gray-400 hover:text-white"
    • Line 113: Button with className="p-3 rounded border border-kodo-cyan bg-kodo-cyan/10 text-kodo-cyan..."
    • Line 117: Button with className="p-3 rounded border border-kodo-steel bg-kodo-slate text-gray-400..."
    • Line 121: Similar button
    • Recommendation: Replace with Button component (variant="ghost" for close, variant="outline" for others)
  • File: apps/web/src/components/ui/ImageCropper.tsx

    • Line 138: Cancel button with className="text-gray-400 hover:text-white"
    • Recommendation: Replace with Button component (variant="ghost")
  • File: apps/web/src/components/upload/BulkUploadModal.tsx

    • Line 46: Close button with className="text-gray-400 hover:text-white"
    • Recommendation: Replace with Button component (variant="ghost")

Medium Priority (Context-specific, may need custom handling)

8. UI Component Internals

  • File: apps/web/src/components/ui/dropdown-menu.tsx
    • Line 120: Internal button with className={cn('outline-none', className)}
    • Note: This is part of a Radix UI component wrapper, may need to stay as-is

Low Priority (May be intentional custom buttons)

9. Specialized Components

  • File: apps/web/src/components/ui/FAB.tsx

    • Floating Action Button - may be intentionally custom
    • Note: Review if FAB should use Button component or remain custom
  • File: apps/web/src/features/tracks/components/LikeButton.tsx

    • Specialized like button component
    • Note: May use Button component internally, needs verification

Statistics

  • High Priority Replacements: ~30+ instances across 15+ files
  • Medium Priority: ~5 instances (UI component internals)
  • Low Priority: ~5 instances (specialized components)

Migration Strategy

  1. Phase 1: Replace high-priority custom buttons in:

    • Live stream components
    • Dashboard page
    • Social components
    • Admin components
  2. Phase 2: Replace medium-priority buttons in:

    • Studio components
    • File manager
    • Modal components
  3. Phase 3: Review and decide on low-priority specialized components

Button Component Variants Available

From apps/web/src/components/ui/button.tsx:

  • default: Primary button with cyan background
  • destructive: Red variant for destructive actions
  • outline: Outlined button
  • secondary: Secondary button with steel background
  • ghost: Minimal button with hover effect
  • link: Link-style button
  • neon: Neon effect button
  • glass: Glass morphism effect
  • premium: Premium gradient button

Notes

  • Some buttons may need size adjustments (Button component supports sm, md, lg, xl)
  • Some buttons may need icon support (Button component supports asChild prop for custom content)
  • Legacy Button component (components/base/Button.tsx) uses different API and CSS classes - should be migrated separately

Next Steps

  1. Audit complete (Action 9.2.1.1)
  2. Replace custom buttons with Button component (Action 9.2.1.2)
  3. Create ESLint rule to enforce Button usage (Action 9.2.1.3)
  4. Create component usage guide (Action 9.2.1.4)