@ -0,0 +1,202 @@ |
|||
# ABP Framework 4.1 RC Has Been Published |
|||
|
|||
Today, we have released the [ABP Framework](https://abp.io/) (and the [ABP Commercial](https://commercial.abp.io/)) 4.1.0 RC. This blog post introduces the new features and important changes in this new version. |
|||
|
|||
> **The planned release date for the [4.1.0 final](https://github.com/abpframework/abp/milestone/47) version is January 4, 2021**. |
|||
|
|||
## Get Started with the 4.1 RC |
|||
|
|||
If you want to try the version `4.1.0` today, follow the steps below; |
|||
|
|||
1) **Upgrade** the ABP CLI to the version `4.1.0-rc.1` using a command line terminal: |
|||
|
|||
````bash |
|||
dotnet tool update Volo.Abp.Cli -g --version 4.1.0-rc.1 |
|||
```` |
|||
|
|||
**or install** if you haven't installed before: |
|||
|
|||
````bash |
|||
dotnet tool install Volo.Abp.Cli -g --version 4.1.0-rc.1 |
|||
```` |
|||
|
|||
2) Create a **new application** with the `--preview` option: |
|||
|
|||
````bash |
|||
abp new BookStore --preview |
|||
```` |
|||
|
|||
See the [ABP CLI documentation](https://docs.abp.io/en/abp/latest/CLI) for all the available options. |
|||
|
|||
> You can also use the *Direct Download* tab on the [Get Started](https://abp.io/get-started) page by selecting the **Preview checkbox**. |
|||
|
|||
## Breaking Changes |
|||
|
|||
This version has a minor breaking change if you'd injected a repository by class. This is not a problem for 99% of the applications. However, see [#6677](https://github.com/abpframework/abp/issues/6677) for the solution if that's a breaking change for you. |
|||
|
|||
## What's new with the ABP Framework 4.1 |
|||
|
|||
### Module Entity Extensions |
|||
|
|||
Module Entity Extension system provides a simple way of adding new properties to an existing entity defined by a module that is used by your application. This feature is now available also for the open source modules (identity and tenant-management). [The documentation](https://docs.abp.io/en/abp/latest/Module-Entity-Extensions) has been moved into the ABP Framework's documentation. |
|||
|
|||
**Example: Add "SocialSecurityNumber" property to the `IdentityUser` entity** |
|||
|
|||
````csharp |
|||
ObjectExtensionManager.Instance.Modules() |
|||
.ConfigureIdentity(identity => |
|||
{ |
|||
identity.ConfigureUser(user => |
|||
{ |
|||
user.AddOrUpdateProperty<string>( //property type: string |
|||
"SocialSecurityNumber", //property name |
|||
property => |
|||
{ |
|||
//validation rules |
|||
property.Attributes.Add(new RequiredAttribute()); |
|||
property.Attributes.Add( |
|||
new StringLengthAttribute(64) { |
|||
MinimumLength = 4 |
|||
} |
|||
); |
|||
|
|||
//...other configurations for this property |
|||
} |
|||
); |
|||
}); |
|||
}); |
|||
```` |
|||
|
|||
The new property becomes available on the UI, API and the database. You can even define navigation properties. This provides an easy way to extend existing modules while using them as NuGet packages. See [the document](https://docs.abp.io/en/abp/latest/Module-Entity-Extensions) for details. |
|||
|
|||
### Blazor UI Improvements |
|||
|
|||
Since the Blazor UI is relatively new in the ABP Framework, we continue to add features and make enhancements to fill the gap between other supported UI types. |
|||
|
|||
#### Bundling & Minification |
|||
|
|||
In the version 4.1, we had introduced the `abp bundle` command for the Blazor UI to add global script and style files of the depended modules into the `index.html`. It was a preparation for a real bundling & minification system. With the version 4.2, this command has been completed. |
|||
|
|||
Whenever you add a new module to your Blazor application, just type the `abp bundle` command in a command line terminal; |
|||
|
|||
* It finds all the global script/style files in your application and the modules your application directly or indirectly depends on, ordered by the module dependencies. |
|||
* Bundles all the scripts into a single file and minified the file (same for the styles). |
|||
* Add the single bundle file to the `index.html` file. |
|||
|
|||
Added a configuration into the `appsettings.json` file in the Blazor application in the application startup template to control the bundling mode: |
|||
|
|||
````js |
|||
{ |
|||
"AbpCli": { |
|||
"Bundle": { |
|||
"Mode": "BundleAndMinify" |
|||
} |
|||
} |
|||
} |
|||
```` |
|||
|
|||
Possible values are; |
|||
|
|||
* `BundleAndMinify`: Bundle all the files into a single file and minify the content. |
|||
* `Bundle`: Bundle all files into a single file, but not minify. |
|||
* `None`: Add files individually, do not bundle. |
|||
|
|||
See the [Global Scripts & Styles](https://docs.abp.io/en/abp/4.1/UI/Blazor/Global-Scripts-Styles) document for details. |
|||
|
|||
#### SubmitButton |
|||
|
|||
`SubmitButton` is a new component that simplifies to save a form: |
|||
|
|||
````html |
|||
<SubmitButton Clicked="UpdateEntityAsync" /> |
|||
```` |
|||
|
|||
The main advantages of using this component instead of a standard `Button` with submit type is; It automatically blocks the submit button until the save operation has fully completed. This prevents multiple clicks by user. And it is shorter than doing all manually. See the [document](https://docs.abp.io/en/abp/4.1/UI/Blazor/SubmitButton). |
|||
|
|||
#### Other Blazor UI highlights |
|||
|
|||
* Implemented some **animations** (like opening/closing modals and dropdowns). |
|||
* Automatically **focus** to the first input when you open a modal form. |
|||
|
|||
Module extensibility system (mentioned above) for the Blazor UI is under development and not available yet. |
|||
|
|||
## What's new with the ABP Commercial 4.1 |
|||
|
|||
### Blazor UI Improvements |
|||
|
|||
We continue to complete missing modules and functionalities for the Blazor UI. |
|||
|
|||
#### Organization Unit Management |
|||
|
|||
Organization Management UI has been implemented for the Blazor UI. Example screenshot: |
|||
|
|||
 |
|||
|
|||
#### IdentityServer UI |
|||
|
|||
IdentityServer Management UI is also available for the Blazor UI now: |
|||
|
|||
 |
|||
|
|||
### Suite: Navigation Property Selection with Typeahead |
|||
|
|||
We had introduced auto-complete select style navigation property selection. With this release, it is fully supported by all the UI options. So, when you create an CRUD page with ABP Suite for entity that has 1 to Many relation to another entity, you can simply select the target entity with a typeahead style select component. Example screenshot: |
|||
|
|||
 |
|||
|
|||
### Spanish Language Translation |
|||
|
|||
We continue to add new language supports for the UI. In this version, translated the UI to **Spanish** language. |
|||
|
|||
 |
|||
|
|||
### Coming: Public Website with Integrated CMS Features |
|||
|
|||
In the next version, the application startup template will come with a public website application option. CMS Kit module will be installed in the website by default, that means newsletter, contact form, comments and some other new features will be directly usable in your applications. |
|||
|
|||
An early screenshot from the public website application home page: |
|||
|
|||
 |
|||
|
|||
## Other News |
|||
|
|||
### ABP Community Contents |
|||
|
|||
A lot of new contents have been published in the ABP Community Web Site in the last two weeks: |
|||
|
|||
* [How to Integrate the Telerik Blazor Components to the ABP Blazor UI](https://community.abp.io/articles/how-to-integrate-the-telerik-blazor-components-to-the-abp-blazor-ui-q8g31abb) by [EngincanV](https://github.com/EngincanV) |
|||
* [Using DevExpress Blazor UI Components With the ABP Framework](https://community.abp.io/articles/using-devexpress-blazor-ui-components-with-the-abp-framework-wrpoa8rw) by [@berkansasmaz](https://github.com/berkansasmaz) |
|||
* [Creating a new UI theme by copying the Basic Theme (for MVC UI)](https://community.abp.io/articles/creating-a-new-ui-theme-by-copying-the-basic-theme-for-mvc-ui-yt9b18io) by [@ebubekirdinc](https://github.com/ebubekirdinc) |
|||
* [Using Angular Material Components With the ABP Framework](https://community.abp.io/members/muhammedaltug) by [@muhammedaltug](https://github.com/muhammedaltug) |
|||
* [How to export Excel files from the ABP framework](https://community.abp.io/articles/how-to-export-excel-files-from-the-abp-framework-wm7nnw3n) by [bartvanhoey](https://github.com/bartvanhoey) |
|||
* [Creating an Event Organizer Application with the ABP Framework & Blazor UI](https://community.abp.io/articles/creating-an-event-organizer-application-with-the-blazor-ui-wbe0sf2z) by [@hikalkan](https://github.com/hikalkan) |
|||
|
|||
Thanks to all of the contributors. We are waiting for your contributions too. If you want to create content for the ABP Community, please visit [community.abp.io](https://community.abp.io/) website and submit your article. |
|||
|
|||
#### Be a Superhero on Day 1 with ABP.IO |
|||
|
|||
Thanks to [@lprichar](http://github.com/lprichar) prepared an awesome introduction video for the ABP.IO Platform: "[Be a Superhero on Day 1 with ABP.IO](https://www.youtube.com/watch?v=ea0Zx9DLcGA)". |
|||
|
|||
#### New Sample Application: Event Organizer |
|||
|
|||
This is a new example application developed using the ABP Framework and the Blazor UI. See [this article](https://community.abp.io/articles/creating-an-event-organizer-application-with-the-blazor-ui-wbe0sf2z) for a step by step implementation guide. |
|||
|
|||
 |
|||
|
|||
### Github Discussions |
|||
|
|||
We enabled the [GitHub Discussions for the abp repository](https://github.com/abpframework/abp/discussions) as another place to discuss ideas or get help for the ABP Framework. The ABP core team is spending time participating in discussions and answering to questions as much as possible. |
|||
|
|||
## About the Next Release(s) |
|||
|
|||
Beginning from the next version (4.2.0), we are starting to spend more effort on the **CMS Kit module**. The purpose of this module is to provide CMS primitives (e.g. **comments, tags, reactions, contents**...) and features (e.g. **blog, pages, surveys**) as pre-built and reusable components. Current blog module will be a part of the CMS Kit module. |
|||
|
|||
We will continue to prepare documents, guides, tutorials and examples. And surely, we will continue to make enhancements and optimizations on the current features. |
|||
|
|||
> The planned preview release date for the version 4.2.0 is January 14, 2021 and the final (stable) version release date is January 28, 2021. |
|||
|
|||
Follow the [GitHub milestones](https://github.com/abpframework/abp/milestones) for all the planned ABP Framework version release dates. |
|||
|
|||
## Feedback |
|||
|
|||
Please check out the ABP Framework 4.1.0 RC and [provide feedback](https://github.com/abpframework/abp/issues/new) to help us to release a more stable version. **The planned release date for the [4.1.0 final](https://github.com/abpframework/abp/milestone/45) version is January 4, 2021**. |
|||
|
After Width: | Height: | Size: 226 KiB |
|
After Width: | Height: | Size: 113 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 865 KiB |
|
After Width: | Height: | Size: 268 KiB |
|
After Width: | Height: | Size: 27 KiB |
@ -1,3 +1,233 @@ |
|||
# Plug-In Modules |
|||
|
|||
TODO |
|||
It is possible to load [modules](Module-Development-Basics.md) as plug-ins. That means you may not reference to a module's assembly in your solution, but you can load that module in the application startup just like any other module. |
|||
|
|||
## Basic Usage |
|||
|
|||
`IServiceCollection.AddApplication<T>()` extension method can get options to configure the plug-in sources. |
|||
|
|||
**Example: Load plugins from a folder** |
|||
|
|||
````csharp |
|||
using Microsoft.AspNetCore.Builder; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Volo.Abp.Modularity.PlugIns; |
|||
|
|||
namespace MyPlugInDemo.Web |
|||
{ |
|||
public class Startup |
|||
{ |
|||
public void ConfigureServices(IServiceCollection services) |
|||
{ |
|||
services.AddApplication<MyPlugInDemoWebModule>(options => |
|||
{ |
|||
options.PlugInSources.AddFolder(@"D:\Temp\MyPlugIns"); |
|||
}); |
|||
} |
|||
|
|||
public void Configure(IApplicationBuilder app) |
|||
{ |
|||
app.InitializeApplication(); |
|||
} |
|||
} |
|||
} |
|||
```` |
|||
|
|||
* This is the `Startup` class of a typical ASP.NET Core application. |
|||
* `PlugInSources.AddFolder` gets a folder path and to load assemblies (typically `dll`s) in that folder. |
|||
|
|||
That's all. ABP will discover the modules in the given folder, configure and initialize them just like regular modules. |
|||
|
|||
### Plug-In Sources |
|||
|
|||
`options.PlugInSources` is actually a list of `IPlugInSource` implementations and `AddFolder` is just a shortcut for the following expression: |
|||
|
|||
````csharp |
|||
options.PlugInSources.Add(new FolderPlugInSource(@"D:\Temp\MyPlugIns")); |
|||
```` |
|||
|
|||
> `AddFolder()` only looks for the assembly file in the given folder, but not looks for the sub-folders. You can pass `SearchOption.AllDirectories` as a second parameter to explore plug-ins also from the sub-folders, recursively. |
|||
|
|||
There are two more built-in Plug-In Source implementations: |
|||
|
|||
* `PlugInSources.AddFiles()` gets a list of assembly (typically `dll`) files. This is a shortcut of using `FilePlugInSource` class. |
|||
* `PlugInSources.AddTypes()` gets a list of module class types. If you use this, you need to load the assemblies of the modules yourself, but it provides flexibility when needed. This is a shortcut of using `TypePlugInSource` class. |
|||
|
|||
If you need, you can create your own `IPlugInSource` implementation and add to the `options.PlugInSources` just like the others. |
|||
|
|||
## Example: Creating a Simple Plug-In |
|||
|
|||
Create a simple **Class Library Project** in a solution: |
|||
|
|||
 |
|||
|
|||
You can add ABP Framework packages you need to use in the module. At least, you should add the `Volo.Abp.Core` package to the project: |
|||
|
|||
```` |
|||
Install-Package Volo.Abp.Core |
|||
```` |
|||
|
|||
Every [module](Module-Development-Basics.md) must declare a class derived from the `AbpModule`. Here, a simple module class that resolves a service and initializes it on the application startup: |
|||
|
|||
````csharp |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Volo.Abp; |
|||
using Volo.Abp.Modularity; |
|||
|
|||
namespace MyPlugIn |
|||
{ |
|||
public class MyPlungInModule : AbpModule |
|||
{ |
|||
public override void OnApplicationInitialization(ApplicationInitializationContext context) |
|||
{ |
|||
var myService = context.ServiceProvider |
|||
.GetRequiredService<MyService>(); |
|||
|
|||
myService.Initialize(); |
|||
} |
|||
} |
|||
} |
|||
```` |
|||
|
|||
`MyService` can be any class registered to [Dependency Injection](Dependency-Injection.md) system, as show below: |
|||
|
|||
````csharp |
|||
using Microsoft.Extensions.Logging; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace MyPlugIn |
|||
{ |
|||
public class MyService : ITransientDependency |
|||
{ |
|||
private readonly ILogger<MyService> _logger; |
|||
|
|||
public MyService(ILogger<MyService> logger) |
|||
{ |
|||
_logger = logger; |
|||
} |
|||
|
|||
public void Initialize() |
|||
{ |
|||
_logger.LogInformation("MyService has been initialized"); |
|||
} |
|||
} |
|||
} |
|||
```` |
|||
|
|||
Build the project, open the build folder, find the `MyPlugIn.dll`: |
|||
|
|||
 |
|||
|
|||
Copy `MyPlugIn.dll` into the plug-in folder (`D:\Temp\MyPlugIns` for this example). |
|||
|
|||
If you have configured the main application like described above (see Basic Usage section), you should see the `MyService has been initialized` log in the application startup. |
|||
|
|||
## Example: Creating a Plug-In With Razor Pages |
|||
|
|||
Creating plug-ins with views inside requires a bit more attention. |
|||
|
|||
> This example assumes you've [created a new web application](https://abp.io/get-started) using the application startup template and MVC / Razor Pages UI. |
|||
|
|||
Create a new **Class Library** project in a solution: |
|||
|
|||
 |
|||
|
|||
Edit the `.csproj` file content: |
|||
|
|||
````xml |
|||
<Project Sdk="Microsoft.NET.Sdk.Web"> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net5.0</TargetFramework> |
|||
<OutputType>Library</OutputType> |
|||
<IsPackable>true</IsPackable> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared" Version="4.0.1" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
```` |
|||
|
|||
* Changed `Sdk` to `Microsoft.NET.Sdk.Web`. |
|||
* Added `OutputType` and `IsPackable` properties. |
|||
* Added `Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared` NuGet package. |
|||
|
|||
> Depending on [Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared) package is not required. You can reference to a more base package like [Volo.Abp.AspNetCore.Mvc](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc/). However, if you will build a UI page/component, it is suggested to reference to the [Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared) package since it is the most high-level package without depending on a particular [theme](UI/AspNetCore/Theming.md). If there is no problem to depend on a particular theme, you can directly reference to the theme's package to be able to use the theme-specific features in your plug-in. |
|||
|
|||
Then create your module class in the plug-in: |
|||
|
|||
````csharp |
|||
using System.IO; |
|||
using System.Reflection; |
|||
using Microsoft.AspNetCore.Mvc.ApplicationParts; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; |
|||
using Volo.Abp.Modularity; |
|||
|
|||
namespace MyMvcUIPlugIn |
|||
{ |
|||
[DependsOn(typeof(AbpAspNetCoreMvcUiThemeSharedModule))] |
|||
public class MyMvcUIPlugInModule : AbpModule |
|||
{ |
|||
public override void PreConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
PreConfigure<IMvcBuilder>(mvcBuilder => |
|||
{ |
|||
//Add plugin assembly |
|||
mvcBuilder.PartManager.ApplicationParts.Add(new AssemblyPart(typeof(MyMvcUIPlugInModule).Assembly)); |
|||
|
|||
//Add views assembly |
|||
var viewDllPath = Path.Combine(Path.GetDirectoryName(typeof(MyMvcUIPlugInModule).Assembly.Location), "MyMvcUIPlugIn.Views.dll"); |
|||
var viewAssembly = new CompiledRazorAssemblyPart(Assembly.LoadFrom(viewDllPath)); |
|||
mvcBuilder.PartManager.ApplicationParts.Add(viewAssembly); |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
```` |
|||
|
|||
* Depending on the `AbpAspNetCoreMvcUiThemeSharedModule` since we added the related NuGet package. |
|||
* Adding the plug-in's assembly to the `PartManager` of ASP.NET Core MVC. This is required by ASP.NET Core. Otherwise, your controllers inside the plug-in doesn't work. |
|||
* Adding the plug-in's views assembly to the `PartManager` of ASP.NET Core MVC. This is required by ASP.NET Core. Otherwise, your views inside the plug-in doesn't work. |
|||
|
|||
You can now add a razor page, like `MyPlugInPage.cshtml` inside the `Pages` folder: |
|||
|
|||
````html |
|||
@page |
|||
@model MyMvcUIPlugIn.Pages.MyPlugInPage |
|||
<h1>Welcome to my plug-in page</h1> |
|||
<p>This page is located inside a plug-in module! :)</p> |
|||
```` |
|||
|
|||
Now, you can build the plug-in project. It will produce the following output: |
|||
|
|||
 |
|||
|
|||
Copy the `MyMvcUIPlugIn.dll` and `MyMvcUIPlugIn.Views.dll` into the plug-in folder (`D:\Temp\MyPlugIns` for this example). |
|||
|
|||
If you have configured the main application like described above (see Basic Usage section), you should be able to visit the `/MyPlugInPage` URL when your application: |
|||
|
|||
 |
|||
|
|||
## Discussions |
|||
|
|||
In real world, your plug-in may have some external dependencies. Also, your application might be designed to support plug-ins. All these are your own system requirements. What ABP does is just loading modules on the application startup. What you do inside that modules is up to you. |
|||
|
|||
However, we can provide a few suggestions for some common cases. |
|||
|
|||
### Library Dependencies |
|||
|
|||
For package/dll dependencies, you can copy the related dlls to the plug-in folder. ABP automatically loads all assemblies in the folder and your plug-in will work as expected. |
|||
|
|||
> See [Microsoft's documentation](https://docs.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support#plugin-with-library-dependencies) for some additional explanations for that case. |
|||
|
|||
### Database Schema |
|||
|
|||
If your module uses a relational database and [Entity Framework Core](Entity-Framework-Core.md), it will need to have its tables available in the database. There are different ways to ensure the tables have been created when an application uses the plug-in. Some examples; |
|||
|
|||
1. The Plugin may check if the database tables does exists and create the tables on the application startup or migrate them if the plug-in has been updated and requires some schema changes. You can use EF Core's migration API to do that. |
|||
2. You can improve the `DbMigrator` application to find migrations of the plug-ins and execute them. |
|||
|
|||
There may be other solutions. For example, if your DB admin doesn't allow you to change the database schema in the application code, you may need to manually send a SQL file to the database admin to apply it to the database. |
|||
@ -0,0 +1,25 @@ |
|||
# Blazor UI: SubmitButton component |
|||
|
|||
`SubmitButton` is a simple wrapper around `Button` component. It is used to be placed inside of page Form or Modal dialogs where it can response to user actions and to be activated as a default button by pressing an ENTER key. Once clicked it will go into the `disabled` state and also it will show a small loading indicator until clicked event is finished. |
|||
|
|||
## Quick Example |
|||
|
|||
```html |
|||
<SubmitButton Clicked="@YourSaveOperation" /> |
|||
``` |
|||
|
|||
Notice that we didn't specify any text, like `Save Changes`. This is because `SubmitButton` will by default pull text from the localization. If you want to change that you either specify a localization key or you can add custom content. |
|||
|
|||
### With localization key |
|||
|
|||
```html |
|||
<SubmitButton Clicked="@YourSaveOperation" SaveResourceKey="YourSaveName" /> |
|||
``` |
|||
|
|||
### With custom content |
|||
|
|||
```html |
|||
<SubmitButton Clicked="@YourSaveOperation"> |
|||
@L["Save"] |
|||
</SubmitButton> |
|||
``` |
|||
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 311 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 256 KiB |
|
After Width: | Height: | Size: 164 KiB |
|
After Width: | Height: | Size: 255 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 294 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 149 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 211 KiB |
|
After Width: | Height: | Size: 187 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 251 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 948 KiB |
|
After Width: | Height: | Size: 53 KiB |