Muzibu Component Refactoring Planı

12,191 Satır Kod Analizi • 60+ Blade Dosyası • 12 Component Önerisi

Analiz Tamamlandı 20 Aralık 2025 Blade Components Multi-Tenant

Basit Anlatım (Herkes İçin)

Projenin ne durumda olduğu ve neden yeniden yapılandırma gerektiği

Ne Tespit Edildi?
Muzibu.com.tr temasında aynı tasarım öğeleri (kartlar, listeler, butonlar) 60'tan fazla farklı dosyada tekrar tekrar yazılmış. Bu, bir yerde yapılan değişikliğin her yere manuel kopyalanması anlamına geliyor. Örneğin:

  • Albüm kartı: Anasayfada, albüm listesinde, artist sayfasında, playlist sayfasında... 20+ farklı yerde aynı kod!
  • Şarkı satırı: Albüm detayında, playlist detayında, favoriler sayfasında... 15+ farklı yerde aynı kod!
  • Play butonu: Her kartta, her listede farklı şekilde yazılmış ama aynı işi yapıyor!

Sorun Nedir?

Örneğin albüm kartının rengini değiştirmek istiyorsunuz. Şu anda 20 farklı dosyayı açıp, 20 farklı yerde aynı değişikliği yapmanız gerekiyor. Bir tanesini unutursanız → site tutarsız görünüyor, bazı yerlerde eski tasarım duruyor.

Çözüm Ne?
Bu tekrar eden parçaları "component" (hazır parça) haline getireceğiz. Yemek tarifi gibi düşünün:

Şu Anki Durum (Kötü)

  • • Her sayfada aynı tarifi baştan yazıyoruz
  • • 20 sayfada "yumurta çırp" yazıyor
  • • Tarif değişince → 20 yeri güncelle!
  • • Unutursanız → tutarsızlık oluşur

Hedef Durum (İyi)

  • • Tarif bir yerde yazılı (component)
  • • Her sayfa "albüm kartı göster" diyor
  • • Tarif değişince → otomatik her yere yansır!
  • • Tutarlılık garantili

Ne Kazanacağız?

%60-70

Kod Azalması

12,000 → 4,000 satır

1 Dakika

Tasarım Değişikliği

Eskiden 20 dosya, şimdi 1

%100

Tutarlılık

Her yerde aynı görünüm

Teknik Detaylar (Geliştiriciler İçin)

Codebase analizi ve mimari kararlar

İncelenen Dosyalar

12,191

Toplam Satır Blade Kodu

60+

Blade Dosyası Analiz Edildi

Dosya Kategorizasyonu

Modules/Muzibu/resources/views/themes/muzibu/
Ana tema klasörü
layouts/ • app.blade.php (master layout)
components/ • header, sidebar, player, overlays
pages/ • home, albums, playlists, artists (25+)
partials/ • Grid views, detail views (15+)

Tasarım Sistemi

Renk Paleti

#ff7f50 muzibu-coral (primary)
#000000 Background
#181818 muzibu-gray (cards)
#b3b3b3 Text gray

Teknoloji Stack

Laravel Blade Components
Tailwind CSS (CDN)
Alpine.js + Livewire
FontAwesome 6.5.1

Code Duplication Metrics

Pattern Tekrar Sayısı Ortalama Satır Toplam Satır Öncelik
Media Card (Grid) 20+ ~80 1,600+ YÜKSEK
Song Row 15+ ~60 900+ YÜKSEK
Hero Header 10+ ~120 1,200+ YÜKSEK
Action Buttons 10+ ~50 500+ ORTA
Horizontal Scroll 5+ ~100 500+ ORTA
Empty State 10+ ~30 300+ DÜŞÜK
TOPLAM (Tahmin) 70+ - ~5,000 satır azalacak

Önerilen Component Yapısı

12 adet yeniden kullanılabilir component önerisi - öncelik sırasıyla

YÜKSEK ÖNCELİK İlk implementasyon - En çok etki

media-card

#1

Album, Playlist, Genre, Sector kartları için universal component

Grid Card Horizontal Card Compact Mode

PROPS:

$media // Model (Album|Playlist|Genre)
$type // 'album'|'playlist'|'genre'
$size // 'normal'|'compact'|'large'
$variant // 'grid'|'horizontal'
$showPlayButton // true|false
20+ tekrar
~1,600 satır azalır

ETKİLENEN DOSYALAR:

• home.blade.php (quick access, featured)
• albums/index.blade.php, show.blade.php
• playlists/index.blade.php, show.blade.php
• genres/index.blade.php, show.blade.php
• artists/show.blade.php
• partials/albums-grid.blade.php
+ 14 dosya daha...

song-row

#2

Şarkı liste satırları için universal component (table row pattern)

Numbered List With Cover Context Menu

PROPS:

$song // Song Model
$index // Sıra numarası
$showCover // true|false
$showArtist // true|false
$showAlbum // true|false
$context // 'album'|'playlist'|'favorites'
15+ tekrar
~900 satır azalır

ETKİLENEN DOSYALAR:

• albums/show.blade.php (track list)
• playlists/show.blade.php (track list)
• favorites/index.blade.php
• genres/show.blade.php (top songs)
• artists/show.blade.php (top songs)
• components/sidebar-right.blade.php
+ 9 dosya daha...

hero-header

#3

Detay sayfaları için büyük cover + metadata header

Large Cover Gradient Overlay Stats

PROPS:

$entity // Album|Playlist|Genre|Artist
$type // 'album'|'playlist'|'genre'
$stats // ['songs' => 12, 'duration' => '45:32']
$gradientFrom // Tailwind color class
10+ tekrar
~1,200 satır azalır

ETKİLENEN DOSYALAR:

• albums/show.blade.php
• playlists/show.blade.php
• genres/show.blade.php
• sectors/show.blade.php
• artists/show.blade.php
• partials/album-detail.blade.php
+ 4 dosya daha...

action-buttons

#4

Detay sayfaları için aksiyon buton grubu (play, favorite, more)

Large Play Favorite 3-dot Menu

PROPS:

$entity // Model instance
$actions // ['play', 'favorite', 'share', 'more']
$playContext // Alpine.store data
$size // 'normal'|'large'
10+ tekrar
~500 satır azalır

ETKİLENEN DOSYALAR:

• albums/show.blade.php
• playlists/show.blade.php
• genres/show.blade.php
• artists/show.blade.php
• home.blade.php (section headers)
+ 5 dosya daha...

ORTA ÖNCELİK İkinci dalga - UI tutarlılığı

horizontal-scroll

#5

Homepage section'ları için yatay scroll container + ok butonları

• Props: $items, $title, $cardComponent
• 5+ tekrar → ~500 satır

empty-state

#6

Boş liste durumları için message + icon + CTA pattern

• Props: $icon, $title, $message, $cta
• 10+ tekrar → ~300 satır

loading-skeleton

#7

Lazy loading için skeleton screens (card/row/grid)

• Props: $type, $count, $columns
• 8+ tekrar → ~250 satır

section-header

#8

Sayfa section başlıkları + "See all" link pattern

• Props: $title, $link, $icon
• 12+ tekrar → ~200 satır

grid-container

#9

Responsive grid wrapper (2-5 column auto-responsive)

• Props: $items, $columns, $gap
• 15+ tekrar → ~180 satır

lazy-image

#10

Lazy loading + placeholder + error fallback (Mevcut ama iyileştirilebilir)

• Props: $src, $alt, $aspectRatio
• Tüm medya çağrılarında kullanılıyor

DÜŞÜK ÖNCELİK Özelleşmiş component'ler - İhtiyaç halinde

user-profile-card #11

Sidebar bottom'daki user card • Sadece 2 yerde kullanılıyor

premium-badge #12

Premium user badge/indicator • 5+ yerde kullanılıyor ama minimal kod

Dosya Etki Haritası

Hangi component hangi dosyaları etkileyecek?

Yüksek Etki (20+ değişiklik)

home.blade.php

~30 değişiklik
• media-card (quick access, featured, new releases)
• horizontal-scroll (4 section)
• section-header (6 başlık)
• grid-container (popular songs)

albums/show.blade.php

~25 değişiklik
• hero-header (album cover + metadata)
• action-buttons (play, favorite, share)
• song-row (track list - 15+ satır)
• empty-state (no songs fallback)

playlists/show.blade.php

~25 değişiklik
• hero-header (playlist cover + metadata)
• action-buttons (play, favorite, edit)
• song-row (track list - 15+ satır)
• empty-state (empty playlist)

artists/show.blade.php

~28 değişiklik
• hero-header (artist banner)
• song-row (top songs)
• media-card (albums grid)
• grid-container (responsive albums)

Orta Etki (10-19 değişiklik)

genres/index.blade.php

~15 değişiklik

genres/show.blade.php

~18 değişiklik

favorites/index.blade.php

~12 değişiklik

playlists/index.blade.php

~14 değişiklik

albums/index.blade.php

~14 değişiklik

sidebar-right.blade.php

~16 değişiklik

Partials (Silinebilir/Birleştirilebilir)

Component'leştikten sonra bu partial dosyaları gereksiz hale gelecek:

partials/albums-grid.blade.php → media-card component
partials/playlists-grid.blade.php → media-card component
partials/genres-grid.blade.php → media-card component
partials/album-detail.blade.php → hero-header component
partials/playlist-detail.blade.php → hero-header component
partials/loading-skeleton.blade.php → loading-skeleton component
Kazanç: 6 partial dosyası silinecek → ~800 satır kod azalacak

Migration Roadmap

Adım adım refactoring planı - 4 faz

1

Faz 1: Foundation Components (2-3 gün)

En kritik ve en çok kullanılan component'leri oluştur

Yapılacaklar

  • media-card component oluştur
  • song-row component oluştur
  • hero-header component oluştur
  • action-buttons component oluştur

Hedef Dosyalar

  • 📁 resources/views/components/muzibu/
  • ├── media-card.blade.php
  • ├── song-row.blade.php
  • ├── hero-header.blade.php
  • └── action-buttons.blade.php
Kazanç: ~4,200 satır 4 component 2-3 gün
2

Faz 2: Replace & Test (3-4 gün)

Foundation component'leri tüm dosyalara uygula ve test et

Replacement Stratejisi

1.

home.blade.php → İlk test sahası

En kompleks sayfa, tüm component'leri kullanıyor. Burası çalışırsa her yer çalışır.

2.

Detail pages → albums/show, playlists/show, artists/show

Hero header + Action buttons + Song row pattern'i uygula

3.

Index pages → Tüm grid view sayfaları

Media-card component'i grid layout'lara uygula

4.

Partial cleanup → Gereksiz partial'ları sil

albums-grid, playlists-grid gibi partial'lar artık gereksiz

Test Checklist

Desktop responsive (1920px, 1440px, 1024px)
Mobile responsive (375px, 768px)
Hover states (play button, 3-dot menu)
Context menu (right-click, long-press)
Alpine.js store interactions
Favorite toggle functionality
40+ dosya güncellenecek 3-4 gün
3

Faz 3: Secondary Components (2 gün)

Orta öncelikli component'leri ekle

  • horizontal-scroll
  • empty-state
  • loading-skeleton
  • section-header
  • grid-container
  • lazy-image (iyileştir)
  • Bonus: user-profile-card
~1,400 satır azalır 2 gün
4

Faz 4: Cleanup & Documentation (1 gün)

Son temizlik, optimizasyon ve dokümantasyon

Cleanup

Kullanılmayan partial'ları sil • Eski kod blokları kaldır • Yorumları temizle

Optimization

Tailwind purge check • Alpine.js performance test • Lazy loading verify

Documentation

Component usage guide • Props documentation • Migration notes

Final Testing

Cross-browser test • Mobile test • Production deploy check

Proje tamamlandı 1 gün

Toplam Süre Tahmini

8-10 gün
12

Component

60+

Dosya Güncelleme

~5,600

Satır Azalacak

%46

Kod Azalması

Beklenen Kazançlar

Component refactoring sonrası elde edilecek faydalar

Geliştirme Verimliliği

Hızlı Değişiklikler

Tasarım değişikliği 20 dosya yerine 1 dosyada. Değişiklik süresi: 2 saat → 10 dakika

Hata Azalması

Props validation sayesinde runtime hataları önlenir. Type hints ile IDE desteği.

Code Reusability

Yeni sayfa eklerken hazır component'leri kullan. Development time: %50 azalır.

Bakım Kolaylığı

%100 Tutarlılık

Tüm sayfalar aynı component'i kullanır → Garanti edilmiş tutarlılık.

Kolay Debug

Bug bir yerde fix edilir, otomatik her yere yansır. Regression test kolaylaşır.

Anlaşılır Codebase

Yeni developer onboarding kolaylaşır. Component isimleri self-documenting.

Performans

Daha Az Kod

12,191 → ~6,500 satır. Daha küçük dosyalar → daha hızlı parse.

Blade Cache Optimize

Component cache edilir, compile time azalır. Opcache hit rate artar.

Tailwind Purge

Component bazlı class kullanımı → daha iyi purge → küçük CSS.

İş Değeri

Time to Market

Yeni feature development %50 daha hızlı. Faster iterations.

UX Consistency

Kullanıcı deneyimi tutarlı → daha az confusion → daha yüksek retention.

Maliyet Tasarrufu

Daha az bug fix time, daha az maintenance cost. ROI: 2-3 ay içinde.

Risk Analizi & Önlemler

Potansiyel sorunlar ve çözüm stratejileri

Risk: Breaking Changes

Component'e geçerken Alpine.js event listener'ları veya context menu tetikleyicileri bozulabilir.

ÖNLEM:

  • • Her component replacement sonrası manuel test (click, right-click, hover)
  • • Browser console'da JavaScript error kontrolü
  • • Git branch kullan: feature/component-refactoring
  • • Commit frequently: Her dosya güncellemesinden sonra commit

Risk: Responsive Layout Issues

Component props farklı ekran boyutlarında beklenmedik şekilde davranabilir.

ÖNLEM:

  • • Chrome DevTools responsive mode test: 375px, 768px, 1024px, 1440px, 1920px
  • • Component'lerde responsive props kullan (örn: $columnsXl="5")
  • • Grid breakpoint'leri sabitle: grid-cols-2 md:grid-cols-3 xl:grid-cols-5

Risk: Time Overrun

Tahmin edilen 8-10 gün uzayabilir, özellikle test fazı beklenenden uzun sürebilir.

ÖNLEM:

  • MVP yaklaşımı: Önce 4 kritik component (Faz 1-2), diğerleri isteğe bağlı
  • • Daily progress tracking: Her gün kaç dosya tamamlandı?
  • • Buffer time ekle: 10 gün yerine 12 gün planla

Risk: Props Over-Engineering

Component'lere çok fazla prop eklemek karmaşıklığa yol açabilir.

ÖNLEM:

  • KISS prensibi: Sadece gerçekten gerekli props ekle
  • • Default values kullan: $showPlayButton = true
  • • Slot pattern kullan: Esnek içerik için {{ $slot }}

Sonraki Adımlar

Bu planı onayladıktan sonra yapılacaklar

Hemen Yapılabilir

1.

Git branch oluştur: git checkout -b feature/component-refactoring

2.

Component klasörü oluştur: resources/views/components/muzibu/

3.

İlk component oluştur: media-card.blade.php (En kritik)

4.

Test sayfası seç: home.blade.php quick access section'ında dene

Karar Gerektirenler

Component naming convention: x-muzibu.media-card mi yoksa x-media-card mi?

Props validation level: Strict (exception throw) mi yoksa Lenient (fallback) mi?

Backward compatibility: Eski partial'ları silmeden önce deprecated notice mi gösterelim?

Test coverage: Manuel test yeterli mi yoksa automated Blade test yazalım mı?

Onay Sonrası İlk Aksiyonlar

30 dk

media-card component template

1 saat

home.blade.php ilk implementasyon

2 saat

Test + iyileştirme iterasyonu

İlk gün sonunda çalışan bir proof-of-concept hazır olacak!