releases/src/Paca.App/ExtensionManagerWindow.xaml

339 lines
30 KiB
XML

<Window x:Class="Paca.App.ExtensionManagerWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Paca.App"
Title="확장 프로그램 (Chrome Extensions)" Height="660" Width="880"
FontFamily="{DynamicResource UiFont}"
Background="{DynamicResource WindowBgGradient}"
WindowStartupLocation="CenterOwner" ShowInTaskbar="False"
MinHeight="520" MinWidth="680"
UseLayoutRounding="True"
KeyboardNavigation.TabNavigation="Cycle"
AutomationProperties.Name="확장 프로그램 관리 창">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Themes/Shared.xaml"/>
</ResourceDictionary.MergedDictionaries>
<BooleanToVisibilityConverter x:Key="BoolToVis"/>
<local:InverseBooleanToVisibilityConverter x:Key="InverseBoolToVis"/>
<local:InverseBoolConverter x:Key="InverseBool"/>
</ResourceDictionary>
</Window.Resources>
<Grid Margin="18">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <!-- 상단 헤더 & 탭 -->
<RowDefinition Height="Auto"/> <!-- 개발자 모드 툴바 -->
<RowDefinition Height="Auto"/> <!-- 토스트 알림 바 -->
<RowDefinition Height="*"/> <!-- 메인 컨텐츠 (탭별) -->
<RowDefinition Height="Auto"/> <!-- 하단 푸터 -->
</Grid.RowDefinitions>
<!-- 1. 상단 헤더 & 탭 네비게이션 & 개발자 모드 토글 -->
<DockPanel Grid.Row="0" Margin="0,0,0,12">
<StackPanel DockPanel.Dock="Left" Orientation="Horizontal" VerticalAlignment="Center">
<Border Width="34" Height="34" CornerRadius="8" Background="{DynamicResource AccentFadeBrush}" Margin="0,0,10,0">
<TextBlock Text="&#xEA86;" Style="{DynamicResource FluentIcon}" FontSize="18" Foreground="{DynamicResource AccentBrush}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="확장 프로그램" FontSize="18" FontWeight="SemiBold" Foreground="{DynamicResource TextPrimary}"/>
<TextBlock Text="Chrome Extensions" FontSize="11" Foreground="{DynamicResource TextMuted}"/>
</StackPanel>
</StackPanel>
<!-- 우측: 개발자 모드 스위치 & 웹스토어 링크 -->
<StackPanel DockPanel.Dock="Right" Orientation="Horizontal" VerticalAlignment="Center">
<Border Background="{DynamicResource CardBg}" BorderBrush="{DynamicResource BorderSubtle}" BorderThickness="1" CornerRadius="6" Padding="10,5" Margin="0,0,8,0">
<StackPanel Orientation="Horizontal">
<TextBlock Text="개발자 모드" FontSize="11.5" Foreground="{DynamicResource TextPrimary}" VerticalAlignment="Center" Margin="0,0,8,0"/>
<CheckBox x:Name="DevModeCheck" Click="DevModeCheck_Click" VerticalAlignment="Center" Cursor="Hand"/>
</StackPanel>
</Border>
<Button Style="{StaticResource GhostButton}" Click="OpenWebStore_Click" ToolTip="크롬 웹 스토어 사이트로 이동합니다">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE774;" Style="{DynamicResource FluentIcon}" FontSize="12" Margin="0,0,6,0" VerticalAlignment="Center"/>
<TextBlock Text="Chrome 웹 스토어" VerticalAlignment="Center"/>
</StackPanel>
</Button>
</StackPanel>
<!-- 중앙: 탭 전환 버튼 (설치된 확장 vs 스토어 마켓플레이스) -->
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<RadioButton x:Name="TabInstalledRadio" GroupName="ExtTabs" IsChecked="True" Checked="TabRadio_Checked" Style="{StaticResource {x:Type ToggleButton}}" Margin="0,0,6,0" Cursor="Hand" Padding="14,6">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xEA86;" Style="{DynamicResource FluentIcon}" FontSize="12" Margin="0,0,6,0" VerticalAlignment="Center"/>
<TextBlock x:Name="TabInstalledText" Text="설치된 확장 (0)" FontSize="12.5" FontWeight="SemiBold" VerticalAlignment="Center"/>
</StackPanel>
</RadioButton>
<RadioButton x:Name="TabStoreRadio" GroupName="ExtTabs" Checked="TabRadio_Checked" Style="{StaticResource {x:Type ToggleButton}}" Cursor="Hand" Padding="14,6">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE719;" Style="{DynamicResource FluentIcon}" FontSize="12" Margin="0,0,6,0" VerticalAlignment="Center"/>
<TextBlock Text="스토어 / 찾기" FontSize="12.5" FontWeight="SemiBold" VerticalAlignment="Center"/>
</StackPanel>
</RadioButton>
</StackPanel>
</DockPanel>
<!-- 2. 개발자 모드 액션 바 (토글 ON 시 표시) -->
<Border x:Name="DevModeBar" Grid.Row="1" Background="{DynamicResource CardBg}" BorderBrush="{DynamicResource AccentBrush}" BorderThickness="1" CornerRadius="6" Padding="10,7" Margin="0,0,0,12" Visibility="Collapsed">
<DockPanel>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Margin="0,0,14,0">
<TextBlock Text="&#xE7BE;" Style="{DynamicResource FluentIcon}" FontSize="12" Foreground="{DynamicResource AccentBrush}" Margin="0,0,6,0" VerticalAlignment="Center"/>
<TextBlock Text="개발자 모드" FontSize="11.5" FontWeight="SemiBold" Foreground="{DynamicResource AccentBrush}" VerticalAlignment="Center"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Style="{StaticResource GhostButton}" Click="LoadUnpacked_Click" Margin="0,0,6,0" ToolTip="manifest.json이 포함된 개발 폴더를 로드합니다">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xED25;" Style="{DynamicResource FluentIcon}" FontSize="12" Margin="0,0,5,0" VerticalAlignment="Center"/>
<TextBlock Text="압축 해제된 확장 로드..." VerticalAlignment="Center"/>
</StackPanel>
</Button>
<Button Style="{StaticResource GhostButton}" Click="InstallCrx_Click" Margin="0,0,6,0" ToolTip=".crx 또는 .zip 패키지 파일을 설치합니다">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE7B8;" Style="{DynamicResource FluentIcon}" FontSize="12" Margin="0,0,5,0" VerticalAlignment="Center"/>
<TextBlock Text="CRX / ZIP 파일 설치..." VerticalAlignment="Center"/>
</StackPanel>
</Button>
<Button Style="{StaticResource GhostButton}" Click="InstallFromUrl_Click" ToolTip="웹스토어 주소나 확장 ID를 입력해 직접 설치합니다">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE710;" Style="{DynamicResource FluentIcon}" FontSize="12" Margin="0,0,5,0" VerticalAlignment="Center"/>
<TextBlock Text="웹스토어 URL 직접 설치..." VerticalAlignment="Center"/>
</StackPanel>
</Button>
</StackPanel>
</DockPanel>
</Border>
<!-- 3. 토스트 알림 배너 -->
<Border x:Name="ToastBanner" Grid.Row="2" Background="{DynamicResource AccentFadeBrush}" BorderBrush="{DynamicResource AccentBrush}" BorderThickness="1" CornerRadius="6" Padding="10,6" Margin="0,0,0,10" Visibility="Collapsed">
<DockPanel>
<Button DockPanel.Dock="Right" Content="✕" Style="{StaticResource GhostButton}" Padding="4,0" Click="DismissToast_Click"/>
<TextBlock x:Name="ToastText" Text="알림 메시지" FontSize="11.5" Foreground="{DynamicResource AccentTextBrush}" FontWeight="Medium" VerticalAlignment="Center"/>
</DockPanel>
</Border>
<!-- 4. 메인 컨텐츠 영역 -->
<Grid Grid.Row="3">
<!-- TAB A: 설치된 확장 프로그램 목록 -->
<Grid x:Name="InstalledView" Visibility="Visible">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- 검색창 -->
<Border Grid.Row="0" Style="{StaticResource SearchInputContainer}" Padding="8,4" Margin="0,0,0,10">
<DockPanel VerticalAlignment="Center">
<TextBlock Text="&#xE721;" Style="{DynamicResource FluentIcon}" FontSize="12" Foreground="{DynamicResource TextMuted}" VerticalAlignment="Center" Margin="0,0,8,0"/>
<TextBox x:Name="InstalledSearchBox" Style="{StaticResource AddressTextBox}" TextChanged="InstalledSearchBox_TextChanged" Tag="설치된 확장 프로그램 검색 (이름, 설명, ID)..."/>
</DockPanel>
</Border>
<!-- 목록 스크롤뷰어 -->
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
<StackPanel>
<!-- 빈 목록 안내 -->
<Border x:Name="EmptyState" Background="{DynamicResource CardBg}" BorderBrush="{DynamicResource BorderSubtle}" BorderThickness="1" CornerRadius="8" Padding="36" Margin="0,10,0,0" Visibility="Collapsed">
<StackPanel HorizontalAlignment="Center">
<TextBlock Text="&#xEA86;" Style="{DynamicResource FluentIcon}" FontSize="40" Foreground="{DynamicResource TextMuted}" HorizontalAlignment="Center" Margin="0,0,0,12"/>
<TextBlock Text="설치된 확장 프로그램이 없습니다." FontSize="14.5" FontWeight="SemiBold" Foreground="{DynamicResource TextPrimary}" HorizontalAlignment="Center"/>
<TextBlock Text="스토어에서 광고 차단, 동영상 도우미, 다크 모드 등 유용한 확장을 설치해보세요." FontSize="11.5" Foreground="{DynamicResource TextMuted}" HorizontalAlignment="Center" Margin="0,4,0,16"/>
<Button Style="{StaticResource PrimaryButton}" Click="GoToStore_Click" HorizontalAlignment="Center" Padding="14,6">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE719;" Style="{DynamicResource FluentIcon}" FontSize="12" Margin="0,0,6,0" VerticalAlignment="Center"/>
<TextBlock Text="스토어에서 확장 찾아보기" VerticalAlignment="Center"/>
</StackPanel>
</Button>
</StackPanel>
</Border>
<!-- 확장 리스트 아이템즈 컨트롤 -->
<ItemsControl x:Name="ExtensionList">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="{DynamicResource CardBg}" BorderBrush="{DynamicResource BorderSubtle}" BorderThickness="1" CornerRadius="10" Padding="16,14" Margin="0,0,0,8">
<DockPanel LastChildFill="True">
<!-- 확장 아이콘 -->
<Border DockPanel.Dock="Left" Width="44" Height="44" CornerRadius="8" Background="{DynamicResource Surface2}" Margin="0,0,14,0" VerticalAlignment="Center">
<Grid>
<TextBlock Text="&#xEA86;" Style="{DynamicResource FluentIcon}" FontSize="22" Foreground="{DynamicResource TextMuted}"/>
<Image Source="{Binding IconPath}" Stretch="Uniform" Width="36" Height="36"/>
</Grid>
</Border>
<!-- 토글 스위치 및 액션 버튼들 -->
<StackPanel DockPanel.Dock="Right" Orientation="Horizontal" VerticalAlignment="Center" Margin="10,0,0,0">
<!-- 도구모음 고정 핀 체크박스 -->
<CheckBox Content="도구 모음에 고정" IsChecked="{Binding IsPinned, Mode=TwoWay}" Click="TogglePin_Click" Tag="{Binding}" Margin="0,0,14,0" Style="{StaticResource DarkCheckBox}" FontSize="11"/>
<!-- 옵션 버튼 (HasOptions 있을 때만 활성화) -->
<Button Style="{StaticResource GhostButton}" Click="OpenOptions_Click" Tag="{Binding}" Margin="0,0,6,0" Padding="8,4" FontSize="11"
Visibility="{Binding HasOptions, Converter={StaticResource BoolToVis}}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE713;" Style="{DynamicResource FluentIcon}" FontSize="11" Margin="0,0,4,0" VerticalAlignment="Center"/>
<TextBlock Text="설정" VerticalAlignment="Center"/>
</StackPanel>
</Button>
<!-- 삭제 버튼 -->
<Button Style="{StaticResource GhostButton}" Click="Uninstall_Click" Tag="{Binding}" Margin="0,0,10,0" Padding="8,4" FontSize="11" Foreground="{DynamicResource ErrorBrush}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xE74D;" Style="{DynamicResource FluentIcon}" FontSize="11" Foreground="{DynamicResource ErrorBrush}" Margin="0,0,4,0" VerticalAlignment="Center"/>
<TextBlock Text="삭제" Foreground="{DynamicResource ErrorBrush}" VerticalAlignment="Center"/>
</StackPanel>
</Button>
<!-- 사용 설정 토글 스위치 -->
<CheckBox Style="{StaticResource DarkCheckBox}" IsChecked="{Binding IsEnabled, Mode=TwoWay}" Click="ToggleEnable_Click" Tag="{Binding}" VerticalAlignment="Center"/>
</StackPanel>
<!-- 정보 텍스트 -->
<StackPanel VerticalAlignment="Center">
<StackPanel Orientation="Horizontal" Margin="0,0,0,2">
<TextBlock Text="{Binding EffectiveName}" FontWeight="SemiBold" FontSize="13.5" Foreground="{DynamicResource TextPrimary}" Margin="0,0,8,0"/>
<TextBlock Text="{Binding Manifest.Version, StringFormat='v{0}'}" FontSize="11" Foreground="{DynamicResource TextMuted}" VerticalAlignment="Center" Margin="0,0,8,0"/>
<Border Background="{DynamicResource AccentFadeBrush}" CornerRadius="4" Padding="4,1" Visibility="{Binding IsUnpacked, Converter={StaticResource BoolToVis}}">
<TextBlock Text="개발자 로드" FontSize="9.5" Foreground="{DynamicResource AccentBrush}"/>
</Border>
</StackPanel>
<TextBlock Text="{Binding EffectiveDescription}" FontSize="11.5" Foreground="{DynamicResource TextSecondary}" TextWrapping="Wrap" MaxHeight="34" TextTrimming="CharacterEllipsis"/>
<TextBlock Text="{Binding Id, StringFormat='ID: {0}'}" FontSize="10" FontFamily="{DynamicResource MonoFont}" Foreground="{DynamicResource TextMuted}" Margin="0,2,0,0"/>
</StackPanel>
</DockPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</ScrollViewer>
</Grid>
<!-- TAB B: 확장 프로그램 스토어 / 마켓플레이스 -->
<Grid x:Name="StoreView" Visibility="Collapsed">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <!-- 검색 및 카테고리 필터 -->
<RowDefinition Height="*"/> <!-- 마켓플레이스 카드 그리드 -->
<RowDefinition Height="Auto"/> <!-- 하단 웹스토어 안내 -->
</Grid.RowDefinitions>
<!-- 검색창 및 카테고리 필터 칩 -->
<StackPanel Grid.Row="0" Margin="0,0,0,10">
<Border Style="{StaticResource SearchInputContainer}" Padding="8,4" Margin="0,0,0,8">
<DockPanel VerticalAlignment="Center">
<TextBlock Text="&#xE721;" Style="{DynamicResource FluentIcon}" FontSize="12" Foreground="{DynamicResource TextMuted}" VerticalAlignment="Center" Margin="0,0,8,0"/>
<TextBox x:Name="StoreSearchBox" Style="{StaticResource AddressTextBox}" TextChanged="StoreSearchBox_TextChanged" KeyDown="StoreSearchBox_KeyDown" Tag="스토어에서 확장 프로그램 검색 (예: adblock, sponsor, volume, youtube, 번역, 다크모드...)" />
</DockPanel>
</Border>
<!-- 카테고리 칩 -->
<StackPanel Orientation="Horizontal">
<RadioButton Content="전체" Tag="전체" GroupName="StoreCat" IsChecked="True" Click="CategoryChip_Click" Style="{StaticResource {x:Type ToggleButton}}" Margin="0,0,6,0" Padding="10,4" FontSize="11"/>
<RadioButton Content="광고/보안" Tag="광고/보안" GroupName="StoreCat" Click="CategoryChip_Click" Style="{StaticResource {x:Type ToggleButton}}" Margin="0,0,6,0" Padding="10,4" FontSize="11"/>
<RadioButton Content="미디어 도우미" Tag="미디어 도우미" GroupName="StoreCat" Click="CategoryChip_Click" Style="{StaticResource {x:Type ToggleButton}}" Margin="0,0,6,0" Padding="10,4" FontSize="11"/>
<RadioButton Content="생산성" Tag="생산성" GroupName="StoreCat" Click="CategoryChip_Click" Style="{StaticResource {x:Type ToggleButton}}" Margin="0,0,6,0" Padding="10,4" FontSize="11"/>
</StackPanel>
</StackPanel>
<!-- 스토어 아이템 목록 -->
<Grid Grid.Row="1">
<!-- 검색 결과 없을 때 안내 -->
<Border x:Name="StoreEmptyState" Visibility="Collapsed" Background="{DynamicResource CardBg}" BorderBrush="{DynamicResource BorderSubtle}" BorderThickness="1" CornerRadius="8" Padding="24" VerticalAlignment="Center" HorizontalAlignment="Center" MaxWidth="440">
<StackPanel HorizontalAlignment="Center">
<TextBlock Text="&#xe151;" FontFamily="{DynamicResource LucideFont}" FontSize="32" Foreground="{DynamicResource TextMuted}" HorizontalAlignment="Center" Margin="0,0,0,8"/>
<TextBlock Text="내장 카탈로그에서 일치하는 확장을 찾을 수 없습니다." FontSize="13" FontWeight="SemiBold" Foreground="{DynamicResource TextPrimary}" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Text="Chrome 웹 스토어에는 수만 개의 확장이 등록되어 있습니다. 공식 스토어에서 직접 검색하여 설치해 보세요!" FontSize="11" Foreground="{DynamicResource TextSecondary}" TextWrapping="Wrap" TextAlignment="Center" Margin="0,6,0,14"/>
<Button x:Name="StoreSearchOnlineBtn" Style="{StaticResource PrimaryButton}" Click="StoreSearchOnline_Click" Padding="14,7" HorizontalAlignment="Center" Cursor="Hand">
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#xe0e8; " FontFamily="{DynamicResource LucideFont}" VerticalAlignment="Center"/>
<TextBlock x:Name="StoreSearchOnlineBtnText" Text="Chrome 웹 스토어에서 온라인 검색 ↗" FontWeight="SemiBold" FontSize="11.5"/>
</StackPanel>
</Button>
</StackPanel>
</Border>
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
<ItemsControl x:Name="StoreList">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="{DynamicResource CardBg}" BorderBrush="{DynamicResource BorderSubtle}" BorderThickness="1" CornerRadius="8" Padding="14" Margin="0,0,0,10"
Cursor="Hand" MouseLeftButtonUp="StoreCard_MouseLeftButtonUp" ToolTip="클릭하여 확장 프로그램을 설치하거나 웹스토어를 엽니다">
<DockPanel>
<!-- 우측 액션 버튼 (설치 vs 설치됨) -->
<StackPanel DockPanel.Dock="Right" VerticalAlignment="Center" Margin="14,0,0,0" Width="135">
<!-- 미설치 시: 설치 버튼 -->
<Button Style="{StaticResource PrimaryButton}" Click="InstallStoreItem_Click" Padding="12,7" HorizontalAlignment="Stretch" Cursor="Hand"
IsEnabled="{Binding IsInstalling, Converter={StaticResource InverseBool}}"
Visibility="{Binding IsInstalled, Converter={StaticResource InverseBoolToVis}}">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<TextBlock Text="설치 중..." FontWeight="SemiBold" FontSize="11" Visibility="{Binding IsInstalling, Converter={StaticResource BoolToVis}}"/>
<StackPanel Orientation="Horizontal" Visibility="{Binding IsInstalling, Converter={StaticResource InverseBoolToVis}}">
<TextBlock Text="+ " FontWeight="Bold"/>
<TextBlock Text="Chrome에 추가" FontWeight="SemiBold" FontSize="11.5"/>
</StackPanel>
</StackPanel>
</Button>
<!-- 설치 완료 시: 설치됨 배지 & 웹스토어 링크 -->
<StackPanel Visibility="{Binding IsInstalled, Converter={StaticResource BoolToVis}}">
<Border Background="{DynamicResource AccentFadeBrush}" CornerRadius="4" Padding="8,4" HorizontalAlignment="Stretch">
<TextBlock Text="설치됨" FontSize="11" FontWeight="SemiBold" Foreground="{DynamicResource AccentTextBrush}" HorizontalAlignment="Center"/>
</Border>
<Button Style="{StaticResource GhostButton}" Content="웹스토어 ↗" Click="OpenItemWebStore_Click" Margin="0,4,0,0" FontSize="10" Padding="4,2" HorizontalAlignment="Center"/>
</StackPanel>
</StackPanel>
<!-- 좌측 아이콘 (Lucide 글리프) -->
<Border DockPanel.Dock="Left" Width="44" Height="44" CornerRadius="8" Background="{DynamicResource PanelBg}" BorderBrush="{DynamicResource BorderSubtle}" BorderThickness="1" Margin="0,0,14,0" VerticalAlignment="Center">
<TextBlock Text="{Binding IconGlyph}" FontFamily="{DynamicResource LucideFont}" Foreground="{DynamicResource AccentTextBrush}" FontSize="20" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<!-- 중앙 상세 정보 -->
<StackPanel VerticalAlignment="Center">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" FontSize="13.5" FontWeight="SemiBold" Foreground="{DynamicResource TextPrimary}" VerticalAlignment="Center"/>
<Border Background="{DynamicResource PanelBg}" CornerRadius="4" Padding="5,1" Margin="8,0,0,0" VerticalAlignment="Center">
<TextBlock Text="{Binding Category}" FontSize="9.5" Foreground="{DynamicResource TextMuted}"/>
</Border>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Margin="8,0,0,0">
<TextBlock Text="&#xe176; " FontFamily="{DynamicResource LucideFont}" FontSize="10" Foreground="#F59E0B" VerticalAlignment="Center"/>
<TextBlock Text="{Binding Rating, StringFormat='{}{0:0.0}'}" FontSize="10" Foreground="#F59E0B" FontWeight="SemiBold" VerticalAlignment="Center"/>
</StackPanel>
<TextBlock Text="{Binding Users, StringFormat='({0})'}" FontSize="10" Foreground="{DynamicResource TextMuted}" Margin="4,0,0,0" VerticalAlignment="Center"/>
<!-- 웹스토어 원본 상세 보기 버튼 -->
<Button Style="{StaticResource GhostButton}" Content="상세 ↗" Click="OpenItemWebStore_Click" Margin="8,0,0,0" FontSize="10" Padding="4,1" VerticalAlignment="Center"/>
</StackPanel>
<TextBlock Text="{Binding Description}" FontSize="11" Foreground="{DynamicResource TextSecondary}" TextWrapping="Wrap" Margin="0,3,0,3" MaxHeight="36" TextTrimming="CharacterEllipsis"/>
<TextBlock Text="{Binding Id}" Style="{StaticResource Type.Mono}" FontSize="9.5" Foreground="{DynamicResource TextMuted}"/>
</StackPanel>
</DockPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
<!-- 하단 웹스토어 안내 바 -->
<Border Grid.Row="2" Background="{DynamicResource CardBg}" BorderBrush="{DynamicResource BorderSubtle}" BorderThickness="1" CornerRadius="6" Padding="12,8" Margin="0,10,0,0">
<DockPanel>
<Button DockPanel.Dock="Right" Style="{StaticResource GhostButton}" Content="Chrome 웹 스토어 열기 ↗" Click="OpenWebStore_Click" Padding="10,4" VerticalAlignment="Center"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="원하는 확장 프로그램이 목록에 없나요?" FontSize="11.5" FontWeight="SemiBold" Foreground="{DynamicResource TextPrimary}"/>
<TextBlock Text="Google 공식 Chrome 웹 스토어에서 직접 수만 개의 확장 프로그램을 둘러보실 수 있습니다." FontSize="10.5" Foreground="{DynamicResource TextMuted}"/>
</StackPanel>
</DockPanel>
</Border>
</Grid>
</Grid>
<!-- 5. 하단 푸터 -->
<DockPanel Grid.Row="4" Margin="0,12,0,0">
<TextBlock Text="※ 크롬 확장 프로그램은 Chromium 기반 WebView2 프로필에 격리되어 안전하게 실행됩니다." FontSize="10.5" Foreground="{DynamicResource TextMuted}" VerticalAlignment="Center"/>
<Button DockPanel.Dock="Right" Style="{StaticResource PrimaryButton}" Content="닫기" Width="90" Click="Close_Click" IsCancel="True" AutomationProperties.Name="확장 프로그램 창 닫기" HorizontalAlignment="Right"/>
</DockPanel>
</Grid>
</Window>