.vbw-planning/milestones/07-rails-audit-and-refactoring/05-view-layer-extraction/04-SUMMARY.md
caa4e69 feat(05-04): add IconComponent with named icon registry4c56789 refactor(05-04): replace inline SVGs with IconComponent35cd427 feat(05-04): split dashboard stats into per-stat Turbo Streams3e315d9 test(05-04): add tests for granular dashboard stat broadcasting35b3560 style(05-04): fix RuboCop array bracket spacing in IconComponentapp/components/source_monitor/icon_component.rb -- new IconComponenttest/components/source_monitor/icon_component_test.rb -- IconComponent testsapp/views/source_monitor/sources/_row.html.erb -- menu_dots SVG replacedapp/views/source_monitor/sources/_details.html.erb -- refresh SVG replacedapp/views/source_monitor/sources/_health_status_badge.html.erb -- chevron_down SVG replacedapp/helpers/source_monitor/application_helper.rb -- loading_spinner_svg and external_link_icon delegate to IconComponentapp/views/source_monitor/dashboard/_stats.html.erb -- individual stat card renders with keyapp/views/source_monitor/dashboard/_stat_card.html.erb -- unique ID per stat cardlib/source_monitor/dashboard/turbo_broadcaster.rb -- per-stat broadcast with STAT_CARDStest/lib/source_monitor/dashboard/turbo_broadcaster_test.rb -- 5 new granular broadcast testssize: nil support to IconComponent so loading_spinner_svg and external_link_icon callers can provide full css_class without conflicting size classes. Minor addition, no scope change.