feat(ads/seo/release): v1.2.0 with live Google Ads, isolated ad profile, ads.txt, and SEO/AEO/GEO optimization
This commit is contained in:
parent
a88aafa1e5
commit
0e568f1f0a
975 changed files with 130593 additions and 16783 deletions
339
src/Paca.App/ExtensionManagerWindow.xaml
Normal file
339
src/Paca.App/ExtensionManagerWindow.xaml
Normal file
|
|
@ -0,0 +1,339 @@
|
|||
<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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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=" " 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=" " 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>
|
||||
Loading…
Add table
Add a link
Reference in a new issue