Merge branch 'main' into update/dependencies/uno.wasm.bootstrap

This commit is contained in:
Arlo 2023-02-24 23:14:43 +00:00
Родитель 323d26268e 57659099b4
Коммит f3bcd92aea
755 изменённых файлов: 4395 добавлений и 11839 удалений

Просмотреть файл

@ -13,6 +13,12 @@
"commands": [
"xstyler"
]
},
"microsoft.visualstudio.slngen.tool": {
"version": "9.5.4",
"commands": [
"slngen"
]
}
}
}

143
.github/workflows/build.yml поставляемый
Просмотреть файл

@ -15,6 +15,11 @@ on:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
env:
DOTNET_VERSION: ${{ '6.0.x' }}
ENABLE_DIAGNOSTICS: false
#COREHOST_TRACE: 1
COREHOST_TRACEFILE: corehosttrace.log
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
@ -24,10 +29,10 @@ jobs:
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
- name: Install .NET 6 SDK
- name: Install .NET SDK v${{ env.DOTNET_VERSION }}
uses: actions/setup-dotnet@v3
with:
dotnet-version: '6.0.x'
dotnet-version: ${{ env.DOTNET_VERSION }}
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- name: Checkout Repository
@ -51,12 +56,21 @@ jobs:
matrix:
platform: [WinUI2, WinUI3]
env:
# faux-ternary expression to select which platforms to build for each platform vs. duplicating step below.
TARGET_PLATFORMS: ${{ matrix.platform != 'WinUI3' && 'all' || 'all-uwp' }}
TEST_PLATFORM: ${{ matrix.platform != 'WinUI3' && 'UWP' || 'WinAppSdk' }}
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
- name: Install .NET 6 SDK
- name: Install .NET SDK v${{ env.DOTNET_VERSION }}
uses: actions/setup-dotnet@v3
with:
dotnet-version: '6.0.x'
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: .NET Info (if diagnostics)
if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }}
run: dotnet --info
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- name: Checkout Repository
@ -70,17 +84,18 @@ jobs:
run: dotnet tool run uno-check --ci --fix --non-interactive --skip wsl --skip androidemulator --verbose
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v1.0.3
uses: microsoft/setup-msbuild@v1.3.1
- name: Enable all TargetFrameworks
working-directory: ./common/Scripts/
run: powershell -version 5.1 -command "./UseTargetFrameworks.ps1 all" -ErrorAction Stop
- name: Enable ${{ env.TARGET_PLATFORMS }} TargetFrameworks
working-directory: ./common/MultiTarget/
run: powershell -version 5.1 -command "./UseTargetFrameworks.ps1 ${{ env.TARGET_PLATFORMS }}" -ErrorAction Stop
- name: Generate solution
run: powershell -version 5.1 -command "./GenerateAllSolution.ps1" -ErrorAction Stop
- name: Generate solution w/ ${{ env.TEST_PLATFORM }} Tests
working-directory: ./
run: powershell -version 5.1 -command "./common/GenerateAllSolution.ps1 -IncludeHeads ${{ env.TEST_PLATFORM }}${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }}" -ErrorAction Stop
- name: Enable Uno.WinUI (in WinUI3 matrix only)
working-directory: ./common/Scripts/
working-directory: ./common/MultiTarget/
run: powershell -version 5.1 -command "./UseUnoWinUI.ps1 3" -ErrorAction Stop
if: ${{ matrix.platform == 'WinUI3' }}
@ -94,11 +109,11 @@ jobs:
# Push Packages to our DevOps Artifacts Feed
- name: Add source
if: ${{github.ref == 'refs/heads/main'}}
if: ${{ github.ref == 'refs/heads/main' }}
run: dotnet nuget add source "https://pkgs.dev.azure.com/dotnet/CommunityToolkit/_packaging/CommunityToolkit-Labs/nuget/v3/index.json" --name LabsFeed --username dummy --password ${{ secrets.DEVOPS_PACKAGE_PUSH_TOKEN }}
- name: Push packages
if: ${{github.ref == 'refs/heads/main'}}
if: ${{ github.ref == 'refs/heads/main' }}
run: dotnet nuget push "**/*.nupkg" --api-key dummy --source LabsFeed --skip-duplicate
# Run tests
@ -112,56 +127,82 @@ jobs:
- name: Run SourceGenerators tests
id: test-generator
run: vstest.console.exe ./common/CommunityToolkit.Labs.Core.SourceGenerators.Tests/CommunityToolkit.Labs.Core.SourceGenerators.Tests/bin/Release/net6.0/CommunityToolkit.Labs.Core.SourceGenerators.Tests.dll /logger:"trx;LogFileName=SourceGenerators.trx"
run: vstest.console.exe ./common/CommunityToolkit.Tooling.SampleGen.Tests/bin/Release/net6.0/CommunityToolkit.Tooling.SampleGen.Tests.dll /logger:"trx;LogFileName=SourceGenerators.trx"
- name: Run experiment tests against UWP
id: test-uwp
run: vstest.console.exe ./tests/**/CommunityToolkit.Labs.Tests.UWP.build.appxrecipe /Framework:FrameworkUap10 /logger:"trx;LogFileName=UWP.trx"
- name: Run experiment tests against WinAppSDK
id: test-winappsdk
run: vstest.console.exe ./tests/**/CommunityToolkit.Labs.Tests.WinAppSdk.build.appxrecipe /Framework:FrameworkUap10 /logger:"trx;LogFileName=WinAppSdk.trx"
- name: Run experiment tests against ${{ env.TEST_PLATFORM }}
id: test-platform
run: vstest.console.exe ./common/**/CommunityToolkit.Tests.${{ env.TEST_PLATFORM }}.build.appxrecipe /Framework:FrameworkUap10 /logger:"trx;LogFileName=${{ env.TEST_PLATFORM }}.trx"
- name: Create test reports
run: |
testspace '[${{ matrix.platform }}]./TestResults/*.trx'
if: ${{ always() && (steps.test-generator.conclusion == 'success' || steps.test-uwp.conclusion == 'success' || steps.test-winappsdk.conclusion == 'success') }}
if: ${{ always() && (steps.test-generator.conclusion == 'success' || steps.test-platform.conclusion == 'success') }}
- name: Artifact - Diagnostic Logs
uses: actions/upload-artifact@v3
if: ${{ (env.ENABLE_DIAGNOSTICS == 'true' || env.COREHOST_TRACE != '') && always() }}
with:
name: build-logs
path: ./**/*.*log
# Test job to build a single experiment to ensure our changes work for both our main types of solutions at the moment
new-experiment:
needs: [Xaml-Style-Check]
# TODO: We should only run this if something in the common or template folder changed...
runs-on: windows-latest
env:
PROJECT_DIRECTORY: template/ProjectTemplate
TEST_PROJECT_NAME: CiTestExp
TEST_PROJECT_DIRECTORY: components/CiTestExp
steps:
- name: Install .NET 6 SDK
- name: Install .NET SDK v${{ env.DOTNET_VERSION }}
uses: actions/setup-dotnet@v3
with:
dotnet-version: '6.0.x'
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: .NET Info (if diagnostics)
if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }}
run: dotnet --info
- name: Enable git long paths
run: git config --system core.longpaths true
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- name: Checkout Repository
uses: actions/checkout@v3
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v1.0.3
uses: microsoft/setup-msbuild@v1.3.1
- name: Add project heads to ProjectTemplate
working-directory: ./${{ env.PROJECT_DIRECTORY }}
run: ${{ github.workspace }}/common/ProjectHeads/GenerateSingleSampleHeads.ps1 -componentPath ${{ github.workspace }}/${{ env.PROJECT_DIRECTORY }}${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }}
# Build and use template for creating new experiments
- name: Build ProjectTemplate
working-directory: ./template/lab
working-directory: ./${{ env.PROJECT_DIRECTORY }}
run: msbuild.exe ProjectTemplate.sln /restore /nowarn:MSB4011 -p:Configuration=Debug
- name: Clean environment
working-directory: ./
run: git clean -xdf
# Create a new experiment from the template and test using that
- name: Install template
working-directory: ./template/lab
working-directory: ${{ env.PROJECT_DIRECTORY }}
run: dotnet new --install ./
- name: Create new experiment
working-directory: ./labs
run: dotnet new labexp -n CiTestExp
working-directory: ./components
run: dotnet new labexp -n ${{ env.TEST_PROJECT_NAME }}
- name: Add project heads to ${{ env.TEST_PROJECT_NAME }}
working-directory: ./${{ env.TEST_PROJECT_DIRECTORY }}
run: ${{ github.workspace }}/common/ProjectHeads/GenerateSingleSampleHeads.ps1 -componentPath ${{ github.workspace }}/${{ env.TEST_PROJECT_DIRECTORY }}${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }}
- name: MSBuild
working-directory: ./labs/CiTestExp
run: msbuild.exe CiTestExp.sln /restore /nowarn:MSB4011 -p:Configuration=Release
working-directory: ./${{ env.TEST_PROJECT_DIRECTORY }}
run: msbuild.exe ${{ env.TEST_PROJECT_NAME }}.sln /restore /nowarn:MSB4011 -p:Configuration=Release
# Run tests
- name: Setup VSTest Path
@ -174,42 +215,64 @@ jobs:
- name: Run tests in the generated experiment against UWP
id: test-uwp
run: vstest.console.exe ./labs/CiTestExp/**/CiTestExp.Tests.UWP.build.appxrecipe /Framework:FrameworkUap10 /logger:"trx;LogFileName=CiTestExpUWP.trx"
run: vstest.console.exe ./components/${{ env.TEST_PROJECT_NAME }}/**/${{ env.TEST_PROJECT_NAME }}.Tests.UWP.build.appxrecipe /Framework:FrameworkUap10 /logger:"trx;LogFileName=${{ env.TEST_PROJECT_NAME }}UWP.trx"
- name: Run tests in the generated experiment against WinAppSDK
id: test-winappsdk
run: vstest.console.exe ./labs/CiTestExp/**/CiTestExp.Tests.WinAppSdk.build.appxrecipe /Framework:FrameworkUap10 /logger:"trx;LogFileName=CiTestExpWinAppSdk.trx"
run: vstest.console.exe ./components/${{ env.TEST_PROJECT_NAME }}/**/${{ env.TEST_PROJECT_NAME }}.Tests.WinAppSdk.build.appxrecipe /Framework:FrameworkUap10 /logger:"trx;LogFileName=${{ env.TEST_PROJECT_NAME }}WinAppSdk.trx"
- name: Create test reports
run: |
testspace '[New Experiment]./TestResults/*.trx'
if: ${{ always() && (steps.test-uwp.conclusion == 'success' || steps.test-winappsdk.conclusion == 'success') }}
- name: Artifact - Diagnostic Logs
uses: actions/upload-artifact@v3
if: ${{ (env.ENABLE_DIAGNOSTICS == 'true' || env.COREHOST_TRACE != '') && always() }}
with:
name: new-experiment-logs
path: ./**/*.*log
wasm-linux:
needs: [Xaml-Style-Check]
runs-on: ubuntu-latest
steps:
- name: Install .NET 6 SDK
- name: Install .NET SDK v${{ env.DOTNET_VERSION }}
uses: actions/setup-dotnet@v3
with:
dotnet-version: '6.0.x'
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: .NET Info (if diagnostics)
if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }}
run: dotnet --info
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- name: Checkout Repository
uses: actions/checkout@v3
# Restore Tools from Manifest list in the Repository
- name: Restore dotnet tools
run: dotnet tool restore
- name: Generate solution
shell: pwsh
run: ./GenerateAllSolution.ps1
working-directory: ./
run: ./common/GenerateAllSolution.ps1${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }}
- name: Install ninja for WASM native dependencies
run: sudo apt-get install ninja-build
# Issue with Comment Links currently, see: https://github.com/mrlacey/CommentLinks/issues/38
# See launch.json configuration file for analogous command we're emulating here to build LINK: ../../.vscode/launch.json:CommunityToolkit.Labs.Wasm.csproj
# See launch.json configuration file for analogous command we're emulating here to build LINK: ../../.vscode/launch.json:CommunityToolkit.App.Wasm.csproj
- name: dotnet build
working-directory: ./platforms/CommunityToolkit.Labs.Wasm/
working-directory: ./common/ProjectHeads/AllComponents/Wasm/
run: dotnet build /r /bl /p:UnoSourceGeneratorUseGenerationHost=true /p:UnoSourceGeneratorUseGenerationController=false
# TODO: Do we want to run tests here? Can we do that on linux easily?
- name: Artifact - Diagnostic Logs
uses: actions/upload-artifact@v3
if: ${{ (env.ENABLE_DIAGNOSTICS == 'true' || env.COREHOST_TRACE != '') && always() }}
with:
name: linux-logs
path: ./**/*.*log

4
.gitignore поставляемый
Просмотреть файл

@ -358,3 +358,7 @@ MigrationBackup/
# Community Toolkit Labs generated files
Toolkit.Labs.All.sln
common/MultiTarget/Generated/**
heads/
# We use slngen to generate solutions
*.sln

4
.vscode/launch.json поставляемый
Просмотреть файл

@ -14,13 +14,13 @@
"/p:UnoSourceGeneratorUseGenerationHost=true",
"/p:UnoSourceGeneratorUseGenerationController=false",
"/p:UnoRemoteControlPort=443",
"--project=${workspaceFolder}/platforms/CommunityToolkit.Labs.Wasm/CommunityToolkit.Labs.Wasm.csproj"
"--project=${workspaceFolder}/common/ProjectHeads/AllComponents/CommunityToolkit.Labs.Wasm/CommunityToolkit.Labs.Wasm.csproj"
],
"presentation": {
"group": "1",
"order": 1
},
"cwd": "${workspaceFolder}/platforms/CommunityToolkit.Labs.Wasm",
"cwd": "${workspaceFolder}/common/ProjectHeads/AllComponents/CommunityToolkit.Labs.Wasm",
"preLaunchTask": "generateAllSolution"
},
{

2
.vscode/tasks.json поставляемый
Просмотреть файл

@ -6,7 +6,7 @@
{
"label": "generateAllSolution",
"type": "shell",
"command": "pwsh ./GenerateAllSolution.ps1",
"command": "pwsh ./common/GenerateAllSolution.ps1",
"group": "build"
}
]

Просмотреть файл

@ -18,4 +18,11 @@
<None Include="$(RepositoryDirectory)ThirdPartyNotices.txt" Pack="true" PackagePath="\" />
</ItemGroup>-->
<ItemGroup>
<SlnGenSolutionItem Include="$(MSBuildThisFileDirectory).editorconfig" />
<SlnGenSolutionItem Include="$(MSBuildThisFileDirectory)settings.xamlstyler" />
<SlnGenSolutionItem Include="$(MSBuildThisFileDirectory)*.md" />
<SlnGenSolutionItem Include="$(MSBuildThisFileDirectory)common\GlobalUsings*.cs" />
</ItemGroup>
</Project>

5
GenerateAllSolution.bat Normal file
Просмотреть файл

@ -0,0 +1,5 @@
@ECHO OFF
SET "IncludeHeads=%1"
IF "%IncludeHeads%"=="" SET "IncludeHeads=all"
powershell .\common\GenerateAllSolution.ps1 -IncludeHeads %IncludeHeads%

Просмотреть файл

@ -1,249 +0,0 @@
Param (
[Parameter(HelpMessage = "The WinUI version to use when building an Uno head.", ParameterSetName = "UseUnoWinUI")]
[ValidateSet('2', '3')]
[string]$UseUnoWinUI = 2
)
# Generate required props for "All" solution.
& ./common/MultiTarget/GenerateAllProjectReferences.ps1
& ./common/GenerateVSCodeLaunchConfig.ps1
# Set WinUI version for Uno projects
$originalWorkingDirectory = Get-Location;
Set-Location common/Scripts/
& ./UseUnoWinUI.ps1 $UseUnoWinUI
Set-Location $originalWorkingDirectory;
# Set up contant values
$templatedProjectFolderConfigTemplateMarker = "[TemplatedProjectFolderConfig]";
$templatedProjectConfigurationTemplateMarker = "[TemplatedProjectConfigurations]";
$templatedProjectDefinitionsMarker = "[TemplatedProjectDefinitions]";
$templatedSharedTestProjectSelfDefinitionsMarker = "[TemplatedSharedTestProjectDefinitions]";
$templatedSharedTestUwpProjectSelfDefinitionsMarker = "[TemplatedSharedTestUwpProjectDefinitions]";
$templatedSharedTestWinAppSdkProjectSelfDefinitionsMarker = "[TemplatedSharedTestWinAppSdkProjectDefinitions]";
$sampleProjectTypeGuid = "9A19103F-16F7-4668-BE54-9A1E7A4F7556";
$sharedProjectTypeGuid = "D954291E-2A0B-460D-934E-DC6B0785DB48";
$libProjectTypeGuid = $sampleProjectTypeGuid;
$solutionTemplatePath = 'common/Toolkit.Labs.All.sln.template';
$generatedSolutionFilePath = 'Toolkit.Labs.All.sln'
function CreateProjectConfiguration {
param (
[string]$projectGuid
)
# Solution files are VERY picky about the unicode characters used as newlines and tabs.
# These characters act strange when paired next to characters found in ASCII, so we append
# as separate strings.
#
# Not doing this would cause Visual Studio to fix the file on load, and always ask the user
# if they want to save the changes.
return "
" + " " + "{$projectGuid}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
{$projectGuid}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
{$projectGuid}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
{$projectGuid}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
{$projectGuid}.Ad-Hoc|ARM64.ActiveCfg = Release|Any CPU
{$projectGuid}.Ad-Hoc|ARM64.Build.0 = Release|Any CPU
{$projectGuid}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{$projectGuid}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{$projectGuid}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{$projectGuid}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{$projectGuid}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
{$projectGuid}.Ad-Hoc|x64.Build.0 = Release|Any CPU
{$projectGuid}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
{$projectGuid}.Ad-Hoc|x86.Build.0 = Release|Any CPU
{$projectGuid}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{$projectGuid}.AppStore|Any CPU.Build.0 = Release|Any CPU
{$projectGuid}.AppStore|ARM.ActiveCfg = Release|Any CPU
{$projectGuid}.AppStore|ARM.Build.0 = Release|Any CPU
{$projectGuid}.AppStore|ARM64.ActiveCfg = Release|Any CPU
{$projectGuid}.AppStore|ARM64.Build.0 = Release|Any CPU
{$projectGuid}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{$projectGuid}.AppStore|iPhone.Build.0 = Release|Any CPU
{$projectGuid}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{$projectGuid}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{$projectGuid}.AppStore|x64.ActiveCfg = Release|Any CPU
{$projectGuid}.AppStore|x64.Build.0 = Release|Any CPU
{$projectGuid}.AppStore|x86.ActiveCfg = Release|Any CPU
{$projectGuid}.AppStore|x86.Build.0 = Release|Any CPU
{$projectGuid}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{$projectGuid}.Debug|Any CPU.Build.0 = Debug|Any CPU
{$projectGuid}.Debug|ARM.ActiveCfg = Debug|Any CPU
{$projectGuid}.Debug|ARM.Build.0 = Debug|Any CPU
{$projectGuid}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{$projectGuid}.Debug|ARM64.Build.0 = Debug|Any CPU
{$projectGuid}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{$projectGuid}.Debug|iPhone.Build.0 = Debug|Any CPU
{$projectGuid}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{$projectGuid}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{$projectGuid}.Debug|x64.ActiveCfg = Debug|Any CPU
{$projectGuid}.Debug|x64.Build.0 = Debug|Any CPU
{$projectGuid}.Debug|x86.ActiveCfg = Debug|Any CPU
{$projectGuid}.Debug|x86.Build.0 = Debug|Any CPU
{$projectGuid}.Release|Any CPU.ActiveCfg = Release|Any CPU
{$projectGuid}.Release|Any CPU.Build.0 = Release|Any CPU
{$projectGuid}.Release|ARM.ActiveCfg = Release|Any CPU
{$projectGuid}.Release|ARM.Build.0 = Release|Any CPU
{$projectGuid}.Release|ARM64.ActiveCfg = Release|Any CPU
{$projectGuid}.Release|ARM64.Build.0 = Release|Any CPU
{$projectGuid}.Release|iPhone.ActiveCfg = Release|Any CPU
{$projectGuid}.Release|iPhone.Build.0 = Release|Any CPU
{$projectGuid}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{$projectGuid}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{$projectGuid}.Release|x64.ActiveCfg = Release|Any CPU
{$projectGuid}.Release|x64.Build.0 = Release|Any CPU
{$projectGuid}.Release|x86.ActiveCfg = Release|Any CPU
{$projectGuid}.Release|x86.Build.0 = Release|Any CPU";
}
function CreateProjectDefinition {
param (
[string]$projectTypeGuid,
[string]$projectGuid,
[string]$projectName,
[string]$projectPath
)
return "
Project(`"{$projectTypeGuid}`") = `"$projectName`", `"$projectPath`", `"{$projectGuid}`"
EndProject";
}
function CreateSharedProjectDefinition {
param (
[string]$projectGuid,
[string]$sharedProjectPath,
[string]$id
)
return "
"+ " " + "$sharedProjectPath*{$projectGuid}*SharedItemsImports = $id";
}
function CreateFolderPlacementForProject {
param (
[string]$projectGuid,
[string]$folderGuid
)
return [System.Environment]::NewLine + " " + "{$projectGuid} = {$folderGuid}";
}
function GetFolderGuid {
param (
[string]$templateContents,
[string]$folderName
)
$folderDefinitionRegex = "Project\(`"{2150E333-8FDC-42A3-9474-1A3956D46DE8}`"\) = `"$folderName`", `"$folderName`", `"\{(.+?)\}`"";
if (-not ($templateContents -match $folderDefinitionRegex)) {
Write-Error "Folder `"$folderName`" was not found";
exit(-1);
}
return $Matches[1];
}
function AddProjectsToSolution {
param (
$templateContents,
[string]$projectPath,
[string]$projectTypeGuid,
[string]$solutionFolder,
[string]$projectGuid,
[bool]$omitConfiguration
)
if ($projectGuid.Length -eq 0) {
$projectGuid = (New-Guid).ToString().ToUpper();
}
$projectPath = Resolve-Path -Relative -Path $projectPath;
$projectName = [System.IO.Path]::GetFileNameWithoutExtension($projectPath);
$sampleFolderGuid = GetFolderGuid $solutionTemplate $solutionFolder;
Write-Host "Adding $projectName to solution folder $solutionFolder";
$definition = CreateProjectDefinition $projectTypeGuid $projectGuid $projectName $projectPath;
$templateContents = $templateContents -replace [regex]::escape($templatedProjectDefinitionsMarker), ($templatedProjectDefinitionsMarker + $definition);
if (-not $omitConfiguration) {
$configuration = CreateProjectConfiguration $projectGuid;
$templateContents = $templateContents -replace [regex]::escape($templatedProjectConfigurationTemplateMarker), ($templatedProjectConfigurationTemplateMarker + $configuration);
}
$folderPlacement = CreateFolderPlacementForProject $projectGuid $sampleFolderGuid;
$templateContents = $templateContents -replace [regex]::escape($templatedProjectFolderConfigTemplateMarker), ($templatedProjectFolderConfigTemplateMarker + $folderPlacement);
return $templateContents;
}
# Execute solution generation from template
$solutionTemplate = Get-Content -Path $solutionTemplatePath;
Write-Output "Loaded solution template from $solutionTemplatePath";
# Add sample projects
foreach ($sampleProjectPath in Get-ChildItem -Recurse -Path 'labs/*/samples/*.Samples/*.Samples.csproj') {
$solutionTemplate = AddProjectsToSolution $solutionTemplate $sampleProjectPath $sampleProjectTypeGuid "Samples"
}
# Add library projects
foreach ($sampleProjectPath in Get-ChildItem -Recurse -Path 'labs/*/src/*.csproj') {
$solutionTemplate = AddProjectsToSolution $solutionTemplate $sampleProjectPath $libProjectTypeGuid "Library"
}
# Add shared test projects
foreach ($sharedProjectItemsPath in Get-ChildItem -Recurse -Path 'labs/*/tests/*.projitems') {
$projitemsContents = Get-Content -Path $sharedProjectItemsPath;
$projectGuidRegex = '<SharedGUID>(.+?)<\/SharedGUID>';
$regex = Select-String -Pattern $projectGuidRegex -InputObject $projitemsContents;
if ($null -eq $regex -or $null -eq $regex.Matches -or $null -eq $regex.Matches.Groups -or $regex.Matches.Groups.Length -lt 2) {
Write-Error "Couldn't get SharedGUID property from $sharedProjectItemsPath";
exit(-1);
}
$projectGuid = $regex.Matches.Groups[1].Value;
$sharedProjectItemsPath = Resolve-Path -Relative -Path $sharedProjectItemsPath;
$sharedProjectPath = $sharedProjectItemsPath -replace "projitems", "shproj";
$solutionTemplate = AddProjectsToSolution $solutionTemplate $sharedProjectPath $sharedProjectTypeGuid "Experiments" $projectGuid.ToUpper() $true;
$sharedProjectItemsName = [System.IO.Path]::GetFileNameWithoutExtension($sharedProjectItemsPath);
Write-Output "Linking $sharedProjectItemsName.projitems to $sharedProjectItemsName";
$sharedProjectDefinition = CreateSharedProjectDefinition $projectGuid $sharedProjectItemsPath "13"
$solutionTemplate = $solutionTemplate -replace [regex]::escape($templatedSharedTestProjectSelfDefinitionsMarker), ($templatedSharedTestProjectSelfDefinitionsMarker + $sharedProjectDefinition);
Write-Output "Linking $sharedProjectItemsName.projitems to CommunityToolkit.Labs.Tests.Uwp";
$uwpSharedProjectDefinition = CreateSharedProjectDefinition "fd78002e-c4e6-4bf8-9ec3-c06250dfef34" $sharedProjectItemsPath "4"
$solutionTemplate = $solutionTemplate -replace [regex]::escape($templatedSharedTestUwpProjectSelfDefinitionsMarker), ($templatedSharedTestUwpProjectSelfDefinitionsMarker + $uwpSharedProjectDefinition);
Write-Output "Linking $sharedProjectItemsName.projitems to CommunityToolkit.Labs.Tests.WinAppSdk";
$winAppSdkSharedProjectDefinition = CreateSharedProjectDefinition "53892f07-fe54-4e36-81d8-105427d097e5" $sharedProjectItemsPath "5"
$solutionTemplate = $solutionTemplate -replace [regex]::escape($templatedSharedTestWinAppSdkProjectSelfDefinitionsMarker), ($templatedSharedTestWinAppSdkProjectSelfDefinitionsMarker + $winAppSdkSharedProjectDefinition);
}
# Clean up template markers
$solutionTemplate = $solutionTemplate -replace [regex]::escape($templatedProjectFolderConfigTemplateMarker), "";
$solutionTemplate = $solutionTemplate -replace [regex]::escape($templatedProjectConfigurationTemplateMarker), "";
$solutionTemplate = $solutionTemplate -replace [regex]::escape($templatedProjectDefinitionsMarker), "";
$solutionTemplate = $solutionTemplate -replace [regex]::escape($templatedSharedTestProjectSelfDefinitionsMarker), "";
$solutionTemplate = $solutionTemplate -replace [regex]::escape($templatedSharedTestUwpProjectSelfDefinitionsMarker), "";
$solutionTemplate = $solutionTemplate -replace [regex]::escape($templatedSharedTestWinAppSdkProjectSelfDefinitionsMarker), "";
$solutionTemplate = $solutionTemplate -replace "(?m)^\s*`r`n", "";
# Save
Set-Content -Path $generatedSolutionFilePath -Value $solutionTemplate;
Write-Output "Solution generated at $generatedSolutionFilePath";

Просмотреть файл

@ -19,7 +19,7 @@ You can find the corresponding `CommunityToolkit.Labs` packages in our Azure Dev
If you find an experiment useful, please up-vote 👍 its corresponding issue and comment with any feedback. Each experiment has an issue assigned to it with the `experiment` label for tracking. Please file any feedback or issues about that experiment on that singular issue. For any other questions or concerns, please [open a Discussion](https://github.com/CommunityToolkit/Labs-Windows/discussions).
Otherwise, you can clone the repo, open the `labs` directory, navigate within the folder for a particular experiment and open up it's solution file in Visual Studio. Run one of the project heads (_ExperimentName.Uwp/Wasm/WinAppSDK_) to see its samples.
Otherwise, you can clone the repo, open the `components` directory, navigate within the folder for a particular experiment and open up it's solution file in Visual Studio. Run one of the project heads (_ExperimentName.Uwp/Wasm/WinAppSDK_) to see its samples.
## Build Requirements
@ -39,9 +39,9 @@ Once there is traction and your idea is approved, an issue will be created to tr
Then you can fork the Labs repo, create a new branch, and start working on your feature (or porting over your existing prototype).
```ascii
dotnet new --install .\template\lab\
dotnet new --install .\template\ProjectTemplate\
cd labs
cd components
dotnet new labexp -n MyExperimentNameHere
```
@ -68,7 +68,7 @@ Open up an issue on the main Toolkit repo using the `Toolkit Labs Transfer` Issu
## Building the Sample App
You can build the main Sample App solution to see all the experiments currently available in this repository by running the `GenerateAllSolution.ps1` PowerShell script in the repo root. Then just open the `Toolkit.Labs.All.sln` solution in Visual Studio. You can run one of the project heads under the platforms folder such as `CommunityToolkit.Labs.WinAppSdk` to run the sample app for that platform.
You can build the main Sample App solution to see all the experiments currently available in this repository by running the `GenerateAllSolution.bat` script in the repo root. Then just open the `Toolkit.Labs.All.sln` solution in Visual Studio. You can run one of the project heads such as `CommunityToolkit.App.WinAppSdk` to run the sample app for that platform.
If you'd like to run a head beyond UWP, Wasm, or the WinAppSDK, you'll need to run the `UseTargetFrameworks.ps1` script first in the `common/Scripts` directory. e.g. `.\UseTargetFrameworks.ps1 -targets all`

Просмотреть файл

@ -1,5 +1,5 @@
<!-- Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. See the LICENSE file in the project root for more information. -->
<Application x:Class="CommunityToolkit.Labs.Shared.App"
<Application x:Class="CommunityToolkit.App.Shared.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Application.Resources>

Просмотреть файл

@ -2,7 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
namespace CommunityToolkit.Labs.Shared;
namespace CommunityToolkit.App.Shared;
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.

Просмотреть файл

@ -1,9 +1,9 @@
<!-- Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. See the LICENSE file in the project root for more information. -->
<Page x:Class="CommunityToolkit.Labs.Shared.AppLoadingView"
<Page x:Class="CommunityToolkit.App.Shared.AppLoadingView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:CommunityToolkit.Labs.Shared"
xmlns:local="using:CommunityToolkit.App.Shared"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
mc:Ignorable="d">

Просмотреть файл

@ -2,11 +2,11 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using CommunityToolkit.Labs.Core.SourceGenerators.Metadata;
using CommunityToolkit.Labs.Core.SourceGenerators;
using CommunityToolkit.Tooling.SampleGen.Metadata;
using CommunityToolkit.Tooling.SampleGen;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation.Collections;
using CommunityToolkit.Labs.Shared.Pages;
using CommunityToolkit.App.Shared.Pages;
#if !WINAPPSDK
using Windows.System;
@ -24,7 +24,7 @@ using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
#endif
namespace CommunityToolkit.Labs.Shared;
namespace CommunityToolkit.App.Shared;
/// <summary>
/// Kicks off the loading process and determines whether to display a single-sample or multi-sample view.

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 637 B

После

Ширина:  |  Высота:  |  Размер: 637 B

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 806 B

После

Ширина:  |  Высота:  |  Размер: 806 B

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 960 B

После

Ширина:  |  Высота:  |  Размер: 960 B

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 1.3 KiB

После

Ширина:  |  Высота:  |  Размер: 1.3 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 3.4 KiB

После

Ширина:  |  Высота:  |  Размер: 3.4 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 3.2 KiB

После

Ширина:  |  Высота:  |  Размер: 3.2 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 6.0 KiB

После

Ширина:  |  Высота:  |  Размер: 6.0 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 3.2 KiB

После

Ширина:  |  Высота:  |  Размер: 3.2 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 4.6 KiB

После

Ширина:  |  Высота:  |  Размер: 4.6 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 3.6 KiB

После

Ширина:  |  Высота:  |  Размер: 3.6 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 346 KiB

После

Ширина:  |  Высота:  |  Размер: 346 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 359 KiB

После

Ширина:  |  Высота:  |  Размер: 359 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 7.6 KiB

После

Ширина:  |  Высота:  |  Размер: 7.6 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 8.4 KiB

После

Ширина:  |  Высота:  |  Размер: 8.4 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 11 KiB

После

Ширина:  |  Высота:  |  Размер: 11 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 11 KiB

После

Ширина:  |  Высота:  |  Размер: 11 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 16 KiB

После

Ширина:  |  Высота:  |  Размер: 16 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 16 KiB

После

Ширина:  |  Высота:  |  Размер: 16 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 20 KiB

После

Ширина:  |  Высота:  |  Размер: 20 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 20 KiB

После

Ширина:  |  Высота:  |  Размер: 20 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 33 KiB

После

Ширина:  |  Высота:  |  Размер: 33 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 33 KiB

После

Ширина:  |  Высота:  |  Размер: 33 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 107 KiB

После

Ширина:  |  Высота:  |  Размер: 107 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 107 KiB

После

Ширина:  |  Высота:  |  Размер: 107 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 1.4 KiB

После

Ширина:  |  Высота:  |  Размер: 1.4 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 3.0 KiB

После

Ширина:  |  Высота:  |  Размер: 3.0 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 3.0 KiB

После

Ширина:  |  Высота:  |  Размер: 3.0 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 4.6 KiB

После

Ширина:  |  Высота:  |  Размер: 4.6 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 4.6 KiB

После

Ширина:  |  Высота:  |  Размер: 4.6 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 5.8 KiB

После

Ширина:  |  Высота:  |  Размер: 5.8 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 5.8 KiB

После

Ширина:  |  Высота:  |  Размер: 5.8 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 8.9 KiB

После

Ширина:  |  Высота:  |  Размер: 8.9 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 8.9 KiB

После

Ширина:  |  Высота:  |  Размер: 8.9 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 28 KiB

После

Ширина:  |  Высота:  |  Размер: 28 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 28 KiB

После

Ширина:  |  Высота:  |  Размер: 28 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 11 KiB

После

Ширина:  |  Высота:  |  Размер: 11 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 11 KiB

После

Ширина:  |  Высота:  |  Размер: 11 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 11 KiB

После

Ширина:  |  Высота:  |  Размер: 11 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 11 KiB

После

Ширина:  |  Высота:  |  Размер: 11 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 18 KiB

После

Ширина:  |  Высота:  |  Размер: 18 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 18 KiB

После

Ширина:  |  Высота:  |  Размер: 18 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 18 KiB

После

Ширина:  |  Высота:  |  Размер: 18 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 22 KiB

После

Ширина:  |  Высота:  |  Размер: 22 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 22 KiB

После

Ширина:  |  Высота:  |  Размер: 22 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 22 KiB

После

Ширина:  |  Высота:  |  Размер: 22 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 35 KiB

После

Ширина:  |  Высота:  |  Размер: 35 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 35 KiB

После

Ширина:  |  Высота:  |  Размер: 35 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 35 KiB

После

Ширина:  |  Высота:  |  Размер: 35 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 114 KiB

После

Ширина:  |  Высота:  |  Размер: 114 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 114 KiB

После

Ширина:  |  Высота:  |  Размер: 114 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 114 KiB

После

Ширина:  |  Высота:  |  Размер: 114 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 4.5 KiB

После

Ширина:  |  Высота:  |  Размер: 4.5 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 4.6 KiB

После

Ширина:  |  Высота:  |  Размер: 4.6 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 4.6 KiB

После

Ширина:  |  Высота:  |  Размер: 4.6 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 6.7 KiB

После

Ширина:  |  Высота:  |  Размер: 6.7 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 6.7 KiB

После

Ширина:  |  Высота:  |  Размер: 6.7 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 9.3 KiB

После

Ширина:  |  Высота:  |  Размер: 9.3 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 9.3 KiB

После

Ширина:  |  Высота:  |  Размер: 9.3 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 13 KiB

После

Ширина:  |  Высота:  |  Размер: 13 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 13 KiB

После

Ширина:  |  Высота:  |  Размер: 13 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 42 KiB

После

Ширина:  |  Высота:  |  Размер: 42 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 42 KiB

После

Ширина:  |  Высота:  |  Размер: 42 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 1.6 KiB

После

Ширина:  |  Высота:  |  Размер: 1.6 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 1.4 KiB

После

Ширина:  |  Высота:  |  Размер: 1.4 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 1.4 KiB

После

Ширина:  |  Высота:  |  Размер: 1.4 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 1.9 KiB

После

Ширина:  |  Высота:  |  Размер: 1.9 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 1.9 KiB

После

Ширина:  |  Высота:  |  Размер: 1.9 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 2.5 KiB

После

Ширина:  |  Высота:  |  Размер: 2.5 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 2.5 KiB

После

Ширина:  |  Высота:  |  Размер: 2.5 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 3.6 KiB

После

Ширина:  |  Высота:  |  Размер: 3.6 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 3.6 KiB

После

Ширина:  |  Высота:  |  Размер: 3.6 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 9.9 KiB

После

Ширина:  |  Высота:  |  Размер: 9.9 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 9.9 KiB

После

Ширина:  |  Высота:  |  Размер: 9.9 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 637 B

После

Ширина:  |  Высота:  |  Размер: 637 B

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 637 B

После

Ширина:  |  Высота:  |  Размер: 637 B

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 637 B

После

Ширина:  |  Высота:  |  Размер: 637 B

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 806 B

После

Ширина:  |  Высота:  |  Размер: 806 B

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 806 B

После

Ширина:  |  Высота:  |  Размер: 806 B

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 806 B

После

Ширина:  |  Высота:  |  Размер: 806 B

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 960 B

После

Ширина:  |  Высота:  |  Размер: 960 B

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 960 B

После

Ширина:  |  Высота:  |  Размер: 960 B

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 960 B

После

Ширина:  |  Высота:  |  Размер: 960 B

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 29 KiB

После

Ширина:  |  Высота:  |  Размер: 29 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 29 KiB

После

Ширина:  |  Высота:  |  Размер: 29 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 29 KiB

После

Ширина:  |  Высота:  |  Размер: 29 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 1.3 KiB

После

Ширина:  |  Высота:  |  Размер: 1.3 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 1.3 KiB

После

Ширина:  |  Высота:  |  Размер: 1.3 KiB

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше