Rename project identity from RazorPagesMovie to BewerbungsSeite
Deploy Staging / deploy (push) Successful in 1m44s

This commit is contained in:
Francesco Lorenzo D'Amico
2026-09-03 15:07:53 +02:00
parent 43055a6a3d
commit ea14d9208e
329 changed files with 121 additions and 121 deletions
@@ -0,0 +1,3 @@
namespace BewerbungsSeite.Api.V1.Contact;
public record ContactDto(string? Name, string? Email, string? Phone, string? Subject, string? Message);
+23
View File
@@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>BewerbungsSeite</RootNamespace>
<AssemblyName>BewerbungsSeite</AssemblyName>
<UserSecretsId>02763b00-6256-4663-b3cd-9c520c4b3f91</UserSecretsId>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.28">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.22.1" />
</ItemGroup>
</Project>
@@ -0,0 +1,39 @@
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
using BewerbungsSeite.Api.V1.Contact;
using BewerbungsSeite.Data;
using BewerbungsSeite.Models;
using BewerbungsSeite.Services;
namespace BewerbungsSeite.Controllers.Api.V1;
[ApiController]
[Route("api/v1/[controller]")]
public class ContactController(RazorPagesMovieContext context, IContactMessageNotificationQueue notificationQueue) : ControllerBase
{
[HttpPost]
public async Task<IActionResult> Post(ContactDto request)
{
var contactMessage = new ContactMessage
{
Name = request.Name ?? string.Empty,
Email = request.Email ?? string.Empty,
Phone = string.IsNullOrWhiteSpace(request.Phone) ? null : request.Phone,
Subject = request.Subject ?? string.Empty,
Message = request.Message ?? string.Empty
};
var validationResults = new List<ValidationResult>();
if (!Validator.TryValidateObject(contactMessage, new ValidationContext(contactMessage), validationResults, validateAllProperties: true))
{
return BadRequest(new { error = "Bitte alle Pflichtfelder korrekt ausfüllen." });
}
context.ContactMessage.Add(contactMessage);
await context.SaveChangesAsync();
notificationQueue.Enqueue(contactMessage.Id);
return Ok(new { success = true });
}
}
@@ -0,0 +1,9 @@
using Microsoft.EntityFrameworkCore;
namespace BewerbungsSeite.Data;
public class RazorPagesMovieContext(DbContextOptions<RazorPagesMovieContext> options) : DbContext(options)
{
public DbSet<BewerbungsSeite.Models.AdminUser> AdminUser { get; set; } = default!;
public DbSet<BewerbungsSeite.Models.ContactMessage> ContactMessage { get; set; } = default!;
}
+22
View File
@@ -0,0 +1,22 @@
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 8080
EXPOSE 8081
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["BewerbungWebseite/BewerbungsSeite.csproj", "BewerbungWebseite/"]
RUN dotnet restore "./BewerbungWebseite/BewerbungsSeite.csproj"
COPY . .
WORKDIR "/src/BewerbungWebseite"
RUN dotnet build "./BewerbungsSeite.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./BewerbungsSeite.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "BewerbungsSeite.dll"]
@@ -0,0 +1,55 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using BewerbungsSeite.Data;
#nullable disable
namespace BewerbungsSeite.Migrations
{
[DbContext(typeof(RazorPagesMovieContext))]
[Migration("20260627202538_InitialCreate")]
partial class InitialCreate
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.28")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("BewerbungsSeite.Models.Movie", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Genre")
.HasColumnType("nvarchar(max)");
b.Property<decimal>("Price")
.HasColumnType("decimal(18,2)");
b.Property<DateTime>("ReleaseDate")
.HasColumnType("datetime2");
b.Property<string>("Title")
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("Movie");
});
#pragma warning restore 612, 618
}
}
}
@@ -0,0 +1,38 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace BewerbungsSeite.Migrations
{
/// <inheritdoc />
public partial class InitialCreate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Movie",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
ReleaseDate = table.Column<DateTime>(type: "datetime2", nullable: false),
Genre = table.Column<string>(type: "nvarchar(max)", nullable: true),
Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Movie", x => x.Id);
});
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Movie");
}
}
}
@@ -0,0 +1,61 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using BewerbungsSeite.Data;
#nullable disable
namespace BewerbungsSeite.Migrations
{
[DbContext(typeof(RazorPagesMovieContext))]
[Migration("20260627205340_Rating")]
partial class Rating
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.28")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("BewerbungsSeite.Models.Movie", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Genre")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<decimal>("Price")
.HasColumnType("decimal(18, 2)");
b.Property<string>("Rating")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("ReleaseDate")
.HasColumnType("datetime2");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("Movie");
});
#pragma warning restore 612, 618
}
}
}
@@ -0,0 +1,65 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace BewerbungsSeite.Migrations
{
/// <inheritdoc />
public partial class Rating : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "Title",
table: "Movie",
type: "nvarchar(max)",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "nvarchar(max)",
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Genre",
table: "Movie",
type: "nvarchar(max)",
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "nvarchar(max)",
oldNullable: true);
migrationBuilder.AddColumn<string>(
name: "Rating",
table: "Movie",
type: "nvarchar(max)",
nullable: false,
defaultValue: "");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Rating",
table: "Movie");
migrationBuilder.AlterColumn<string>(
name: "Title",
table: "Movie",
type: "nvarchar(max)",
nullable: true,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
migrationBuilder.AlterColumn<string>(
name: "Genre",
table: "Movie",
type: "nvarchar(max)",
nullable: true,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
}
}
}
@@ -0,0 +1,64 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using BewerbungsSeite.Data;
#nullable disable
namespace BewerbungsSeite.Migrations
{
[DbContext(typeof(RazorPagesMovieContext))]
[Migration("20260627210009_New_DataAnnotations")]
partial class New_DataAnnotations
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.28")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("BewerbungsSeite.Models.Movie", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Genre")
.IsRequired()
.HasMaxLength(30)
.HasColumnType("nvarchar(30)");
b.Property<decimal>("Price")
.HasColumnType("decimal(18, 2)");
b.Property<string>("Rating")
.IsRequired()
.HasMaxLength(5)
.HasColumnType("nvarchar(5)");
b.Property<DateTime>("ReleaseDate")
.HasColumnType("datetime2");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(60)
.HasColumnType("nvarchar(60)");
b.HasKey("Id");
b.ToTable("Movie");
});
#pragma warning restore 612, 618
}
}
}
@@ -0,0 +1,72 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace BewerbungsSeite.Migrations
{
/// <inheritdoc />
public partial class New_DataAnnotations : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "Title",
table: "Movie",
type: "nvarchar(60)",
maxLength: 60,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
migrationBuilder.AlterColumn<string>(
name: "Rating",
table: "Movie",
type: "nvarchar(5)",
maxLength: 5,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
migrationBuilder.AlterColumn<string>(
name: "Genre",
table: "Movie",
type: "nvarchar(30)",
maxLength: 30,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "Title",
table: "Movie",
type: "nvarchar(max)",
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(60)",
oldMaxLength: 60);
migrationBuilder.AlterColumn<string>(
name: "Rating",
table: "Movie",
type: "nvarchar(max)",
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(5)",
oldMaxLength: 5);
migrationBuilder.AlterColumn<string>(
name: "Genre",
table: "Movie",
type: "nvarchar(max)",
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(30)",
oldMaxLength: 30);
}
}
}
@@ -0,0 +1,125 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using BewerbungsSeite.Data;
#nullable disable
namespace BewerbungsSeite.Migrations
{
[DbContext(typeof(RazorPagesMovieContext))]
[Migration("20260818121135_AddAdminUserAndContactMessage")]
partial class AddAdminUserAndContactMessage
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.28")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("BewerbungsSeite.Models.AdminUser", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("PasswordHash")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Username")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.HasKey("Id");
b.ToTable("AdminUser");
});
modelBuilder.Entity("BewerbungsSeite.Models.ContactMessage", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Email")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("nvarchar(200)");
b.Property<string>("Message")
.IsRequired()
.HasMaxLength(4000)
.HasColumnType("nvarchar(4000)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<string>("Phone")
.HasMaxLength(30)
.HasColumnType("nvarchar(30)");
b.Property<DateTime>("SentAt")
.HasColumnType("datetime2");
b.Property<string>("Subject")
.HasMaxLength(150)
.HasColumnType("nvarchar(150)");
b.HasKey("Id");
b.ToTable("ContactMessage");
});
modelBuilder.Entity("BewerbungsSeite.Models.Movie", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Genre")
.IsRequired()
.HasMaxLength(30)
.HasColumnType("nvarchar(30)");
b.Property<decimal>("Price")
.HasColumnType("decimal(18, 2)");
b.Property<string>("Rating")
.IsRequired()
.HasMaxLength(5)
.HasColumnType("nvarchar(5)");
b.Property<DateTime>("ReleaseDate")
.HasColumnType("datetime2");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(60)
.HasColumnType("nvarchar(60)");
b.HasKey("Id");
b.ToTable("Movie");
});
#pragma warning restore 612, 618
}
}
}
@@ -0,0 +1,57 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace BewerbungsSeite.Migrations
{
/// <inheritdoc />
public partial class AddAdminUserAndContactMessage : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "AdminUser",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Username = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false),
PasswordHash = table.Column<string>(type: "nvarchar(max)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_AdminUser", x => x.Id);
});
migrationBuilder.CreateTable(
name: "ContactMessage",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Name = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false),
Email = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
Phone = table.Column<string>(type: "nvarchar(30)", maxLength: 30, nullable: true),
Subject = table.Column<string>(type: "nvarchar(150)", maxLength: 150, nullable: true),
Message = table.Column<string>(type: "nvarchar(4000)", maxLength: 4000, nullable: false),
SentAt = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ContactMessage", x => x.Id);
});
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "AdminUser");
migrationBuilder.DropTable(
name: "ContactMessage");
}
}
}
@@ -0,0 +1,128 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using BewerbungsSeite.Data;
#nullable disable
namespace BewerbungsSeite.Migrations
{
[DbContext(typeof(RazorPagesMovieContext))]
[Migration("20260818134749_AddNotificationSentToContactMessage")]
partial class AddNotificationSentToContactMessage
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.28")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("BewerbungsSeite.Models.AdminUser", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("PasswordHash")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Username")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.HasKey("Id");
b.ToTable("AdminUser");
});
modelBuilder.Entity("BewerbungsSeite.Models.ContactMessage", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Email")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("nvarchar(200)");
b.Property<string>("Message")
.IsRequired()
.HasMaxLength(5000)
.HasColumnType("nvarchar(max)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<bool>("NotificationSent")
.HasColumnType("bit");
b.Property<string>("Phone")
.HasMaxLength(30)
.HasColumnType("nvarchar(30)");
b.Property<DateTime>("SentAt")
.HasColumnType("datetime2");
b.Property<string>("Subject")
.HasMaxLength(150)
.HasColumnType("nvarchar(150)");
b.HasKey("Id");
b.ToTable("ContactMessage");
});
modelBuilder.Entity("BewerbungsSeite.Models.Movie", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Genre")
.IsRequired()
.HasMaxLength(30)
.HasColumnType("nvarchar(30)");
b.Property<decimal>("Price")
.HasColumnType("decimal(18, 2)");
b.Property<string>("Rating")
.IsRequired()
.HasMaxLength(5)
.HasColumnType("nvarchar(5)");
b.Property<DateTime>("ReleaseDate")
.HasColumnType("datetime2");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(60)
.HasColumnType("nvarchar(60)");
b.HasKey("Id");
b.ToTable("Movie");
});
#pragma warning restore 612, 618
}
}
}
@@ -0,0 +1,49 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace BewerbungsSeite.Migrations
{
/// <inheritdoc />
public partial class AddNotificationSentToContactMessage : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "Message",
table: "ContactMessage",
type: "nvarchar(max)",
maxLength: 5000,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(4000)",
oldMaxLength: 4000);
migrationBuilder.AddColumn<bool>(
name: "NotificationSent",
table: "ContactMessage",
type: "bit",
nullable: false,
defaultValue: false);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "NotificationSent",
table: "ContactMessage");
migrationBuilder.AlterColumn<string>(
name: "Message",
table: "ContactMessage",
type: "nvarchar(4000)",
maxLength: 4000,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)",
oldMaxLength: 5000);
}
}
}
@@ -0,0 +1,124 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using BewerbungsSeite.Data;
#nullable disable
namespace BewerbungsSeite.Migrations
{
[DbContext(typeof(RazorPagesMovieContext))]
[Migration("20260819120324_ChangeAdminUserAndContactMessageIdToGuid")]
partial class ChangeAdminUserAndContactMessageIdToGuid
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.28")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("BewerbungsSeite.Models.AdminUser", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("PasswordHash")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Username")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.HasKey("Id");
b.ToTable("AdminUser");
});
modelBuilder.Entity("BewerbungsSeite.Models.ContactMessage", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("Email")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("nvarchar(200)");
b.Property<string>("Message")
.IsRequired()
.HasMaxLength(5000)
.HasColumnType("nvarchar(max)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<bool>("NotificationSent")
.HasColumnType("bit");
b.Property<string>("Phone")
.HasMaxLength(30)
.HasColumnType("nvarchar(30)");
b.Property<DateTime>("SentAt")
.HasColumnType("datetime2");
b.Property<string>("Subject")
.HasMaxLength(150)
.HasColumnType("nvarchar(150)");
b.HasKey("Id");
b.ToTable("ContactMessage");
});
modelBuilder.Entity("BewerbungsSeite.Models.Movie", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Genre")
.IsRequired()
.HasMaxLength(30)
.HasColumnType("nvarchar(30)");
b.Property<decimal>("Price")
.HasColumnType("decimal(18, 2)");
b.Property<string>("Rating")
.IsRequired()
.HasMaxLength(5)
.HasColumnType("nvarchar(5)");
b.Property<DateTime>("ReleaseDate")
.HasColumnType("datetime2");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(60)
.HasColumnType("nvarchar(60)");
b.HasKey("Id");
b.ToTable("Movie");
});
#pragma warning restore 612, 618
}
}
}
@@ -0,0 +1,99 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace BewerbungsSeite.Migrations
{
/// <inheritdoc />
public partial class ChangeAdminUserAndContactMessageIdToGuid : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropPrimaryKey(
name: "PK_ContactMessage",
table: "ContactMessage");
migrationBuilder.DropColumn(
name: "Id",
table: "ContactMessage");
migrationBuilder.AddColumn<Guid>(
name: "Id",
table: "ContactMessage",
type: "uniqueidentifier",
nullable: false,
defaultValueSql: "NEWID()");
migrationBuilder.AddPrimaryKey(
name: "PK_ContactMessage",
table: "ContactMessage",
column: "Id");
migrationBuilder.DropPrimaryKey(
name: "PK_AdminUser",
table: "AdminUser");
migrationBuilder.DropColumn(
name: "Id",
table: "AdminUser");
migrationBuilder.AddColumn<Guid>(
name: "Id",
table: "AdminUser",
type: "uniqueidentifier",
nullable: false,
defaultValueSql: "NEWID()");
migrationBuilder.AddPrimaryKey(
name: "PK_AdminUser",
table: "AdminUser",
column: "Id");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropPrimaryKey(
name: "PK_ContactMessage",
table: "ContactMessage");
migrationBuilder.DropColumn(
name: "Id",
table: "ContactMessage");
migrationBuilder.AddColumn<int>(
name: "Id",
table: "ContactMessage",
type: "int",
nullable: false)
.Annotation("SqlServer:Identity", "1, 1");
migrationBuilder.AddPrimaryKey(
name: "PK_ContactMessage",
table: "ContactMessage",
column: "Id");
migrationBuilder.DropPrimaryKey(
name: "PK_AdminUser",
table: "AdminUser");
migrationBuilder.DropColumn(
name: "Id",
table: "AdminUser");
migrationBuilder.AddColumn<int>(
name: "Id",
table: "AdminUser",
type: "int",
nullable: false)
.Annotation("SqlServer:Identity", "1, 1");
migrationBuilder.AddPrimaryKey(
name: "PK_AdminUser",
table: "AdminUser",
column: "Id");
}
}
}
@@ -0,0 +1,125 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using BewerbungsSeite.Data;
#nullable disable
namespace BewerbungsSeite.Migrations
{
[DbContext(typeof(RazorPagesMovieContext))]
[Migration("20260821123359_MakeContactMessageSubjectRequired")]
partial class MakeContactMessageSubjectRequired
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.28")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("BewerbungsSeite.Models.AdminUser", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("PasswordHash")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Username")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.HasKey("Id");
b.ToTable("AdminUser");
});
modelBuilder.Entity("BewerbungsSeite.Models.ContactMessage", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("Email")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("nvarchar(200)");
b.Property<string>("Message")
.IsRequired()
.HasMaxLength(5000)
.HasColumnType("nvarchar(max)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<bool>("NotificationSent")
.HasColumnType("bit");
b.Property<string>("Phone")
.HasMaxLength(30)
.HasColumnType("nvarchar(30)");
b.Property<DateTime>("SentAt")
.HasColumnType("datetime2");
b.Property<string>("Subject")
.IsRequired()
.HasMaxLength(150)
.HasColumnType("nvarchar(150)");
b.HasKey("Id");
b.ToTable("ContactMessage");
});
modelBuilder.Entity("BewerbungsSeite.Models.Movie", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Genre")
.IsRequired()
.HasMaxLength(30)
.HasColumnType("nvarchar(30)");
b.Property<decimal>("Price")
.HasColumnType("decimal(18, 2)");
b.Property<string>("Rating")
.IsRequired()
.HasMaxLength(5)
.HasColumnType("nvarchar(5)");
b.Property<DateTime>("ReleaseDate")
.HasColumnType("datetime2");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(60)
.HasColumnType("nvarchar(60)");
b.HasKey("Id");
b.ToTable("Movie");
});
#pragma warning restore 612, 618
}
}
}
@@ -0,0 +1,42 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace BewerbungsSeite.Migrations
{
/// <inheritdoc />
public partial class MakeContactMessageSubjectRequired : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql("UPDATE ContactMessage SET Subject = '' WHERE Subject IS NULL;");
migrationBuilder.AlterColumn<string>(
name: "Subject",
table: "ContactMessage",
type: "nvarchar(150)",
maxLength: 150,
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "nvarchar(150)",
oldMaxLength: 150,
oldNullable: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "Subject",
table: "ContactMessage",
type: "nvarchar(150)",
maxLength: 150,
nullable: true,
oldClrType: typeof(string),
oldType: "nvarchar(150)",
oldMaxLength: 150);
}
}
}
@@ -0,0 +1,91 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using BewerbungsSeite.Data;
#nullable disable
namespace BewerbungsSeite.Migrations
{
[DbContext(typeof(RazorPagesMovieContext))]
[Migration("20260826122916_DropMovieTable")]
partial class DropMovieTable
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.28")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("BewerbungsSeite.Models.AdminUser", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("PasswordHash")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Username")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.HasKey("Id");
b.ToTable("AdminUser");
});
modelBuilder.Entity("BewerbungsSeite.Models.ContactMessage", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("Email")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("nvarchar(200)");
b.Property<string>("Message")
.IsRequired()
.HasMaxLength(5000)
.HasColumnType("nvarchar(max)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<bool>("NotificationSent")
.HasColumnType("bit");
b.Property<string>("Phone")
.HasMaxLength(30)
.HasColumnType("nvarchar(30)");
b.Property<DateTime>("SentAt")
.HasColumnType("datetime2");
b.Property<string>("Subject")
.IsRequired()
.HasMaxLength(150)
.HasColumnType("nvarchar(150)");
b.HasKey("Id");
b.ToTable("ContactMessage");
});
#pragma warning restore 612, 618
}
}
}
@@ -0,0 +1,39 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace BewerbungsSeite.Migrations
{
/// <inheritdoc />
public partial class DropMovieTable : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Movie");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Movie",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Genre = table.Column<string>(type: "nvarchar(30)", maxLength: 30, nullable: false),
Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false),
Rating = table.Column<string>(type: "nvarchar(5)", maxLength: 5, nullable: false),
ReleaseDate = table.Column<DateTime>(type: "datetime2", nullable: false),
Title = table.Column<string>(type: "nvarchar(60)", maxLength: 60, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Movie", x => x.Id);
});
}
}
}
@@ -0,0 +1,88 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using BewerbungsSeite.Data;
#nullable disable
namespace BewerbungsSeite.Migrations
{
[DbContext(typeof(RazorPagesMovieContext))]
partial class RazorPagesMovieContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.28")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("BewerbungsSeite.Models.AdminUser", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("PasswordHash")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Username")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.HasKey("Id");
b.ToTable("AdminUser");
});
modelBuilder.Entity("BewerbungsSeite.Models.ContactMessage", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<string>("Email")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("nvarchar(200)");
b.Property<string>("Message")
.IsRequired()
.HasMaxLength(5000)
.HasColumnType("nvarchar(max)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<bool>("NotificationSent")
.HasColumnType("bit");
b.Property<string>("Phone")
.HasMaxLength(30)
.HasColumnType("nvarchar(30)");
b.Property<DateTime>("SentAt")
.HasColumnType("datetime2");
b.Property<string>("Subject")
.IsRequired()
.HasMaxLength(150)
.HasColumnType("nvarchar(150)");
b.HasKey("Id");
b.ToTable("ContactMessage");
});
#pragma warning restore 612, 618
}
}
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel.DataAnnotations;
namespace BewerbungsSeite.Models;
public class AdminUser
{
public Guid Id { get; set; }
[Required]
[StringLength(100)]
public string Username { get; set; } = string.Empty;
[Required]
public string PasswordHash { get; set; } = string.Empty;
}
@@ -0,0 +1,39 @@
using System.ComponentModel.DataAnnotations;
namespace BewerbungsSeite.Models;
public class ContactMessage
{
public Guid Id { get; set; }
[Required]
[StringLength(100)]
public string Name { get; set; } = string.Empty;
[Display(Name = "E-Mail")]
[Required]
[EmailAddress]
[StringLength(200)]
public string Email { get; set; } = string.Empty;
[Display(Name = "Telefon")]
[Phone]
[StringLength(30)]
public string? Phone { get; set; }
[Display(Name = "Betreff")]
[Required]
[StringLength(150)]
public string Subject { get; set; } = string.Empty;
[Display(Name = "Nachricht")]
[Required]
[StringLength(5000)]
public string Message { get; set; } = string.Empty;
[Display(Name = "Gesendet am")]
[DataType(DataType.DateTime)]
public DateTime SentAt { get; set; } = DateTime.Now;
public bool NotificationSent { get; set; } = false;
}
@@ -0,0 +1,11 @@
@page
@model BewerbungsSeite.Pages.Admin.IndexModel
@{
ViewData["Title"] = "Admin";
}
<h1>Welcome, @User.Identity?.Name</h1>
<form method="post" asp-page-handler="Logout">
<button type="submit" class="btn btn-secondary">Logout</button>
</form>
@@ -0,0 +1,19 @@
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace BewerbungsSeite.Pages.Admin;
public class IndexModel : PageModel
{
public void OnGet()
{
}
public async Task<IActionResult> OnPostLogoutAsync()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return RedirectToPage("/Login");
}
}
+26
View File
@@ -0,0 +1,26 @@
@page
@model ErrorModel
@{
ViewData["Title"] = "Error";
}
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
@if (Model.ShowRequestId)
{
<p>
<strong>Request ID:</strong> <code>@Model.RequestId</code>
</p>
}
<h3>Development Mode</h3>
<p>
Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
It can result in displaying sensitive information from exceptions to end users.
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
and restarting the app.
</p>
+28
View File
@@ -0,0 +1,28 @@
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace BewerbungsSeite.Pages
{
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
[IgnoreAntiforgeryToken]
public class ErrorModel : PageModel
{
public string? RequestId { get; set; }
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
private readonly ILogger<ErrorModel> _logger;
public ErrorModel(ILogger<ErrorModel> logger)
{
_logger = logger;
}
public void OnGet()
{
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
}
}
}
File diff suppressed because it is too large Load Diff
+12
View File
@@ -0,0 +1,12 @@
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace BewerbungsSeite.Pages
{
public class IndexModel : PageModel
{
public void OnGet()
{
}
}
}
+28
View File
@@ -0,0 +1,28 @@
@page
@model BewerbungsSeite.Pages.LoginModel
@{
ViewData["Title"] = "Login";
}
<div class="row justify-content-center">
<div class="col-md-4">
<h1>Admin Login</h1>
@if (!string.IsNullOrEmpty(Model.ErrorMessage))
{
<div class="alert alert-danger">@Model.ErrorMessage</div>
}
<form method="post">
<div class="mb-3">
<label asp-for="Username" class="form-label"></label>
<input asp-for="Username" class="form-control" autofocus />
</div>
<div class="mb-3">
<label asp-for="Password" class="form-label"></label>
<input asp-for="Password" type="password" class="form-control" />
</div>
<button type="submit" class="btn btn-primary">Login</button>
</form>
</div>
</div>
+53
View File
@@ -0,0 +1,53 @@
using System.Security.Claims;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using BewerbungsSeite.Data;
using BewerbungsSeite.Models;
namespace BewerbungsSeite.Pages;
public class LoginModel : PageModel
{
private readonly RazorPagesMovieContext _context;
public LoginModel(RazorPagesMovieContext context)
{
_context = context;
}
[BindProperty]
public string Username { get; set; } = string.Empty;
[BindProperty]
public string Password { get; set; } = string.Empty;
public string? ErrorMessage { get; set; }
public void OnGet()
{
}
public async Task<IActionResult> OnPostAsync(string? returnUrl)
{
var user = await _context.AdminUser.SingleOrDefaultAsync(u => u.Username == Username);
var hasher = new PasswordHasher<AdminUser>();
if (user is null || hasher.VerifyHashedPassword(user, user.PasswordHash, Password) == PasswordVerificationResult.Failed)
{
ErrorMessage = "Benutzername oder Passwort ist falsch.";
return Page();
}
var identity = new ClaimsIdentity(
new[] { new Claim(ClaimTypes.Name, user.Username) },
CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity));
return LocalRedirect(returnUrl ?? "/Admin");
}
}
@@ -0,0 +1,147 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>@Html.Raw(ViewData["Title"])</title>
<link rel="icon" type="image/png" href="~/images/fav-icon/icon.png" />
<link rel="stylesheet" href="~/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/css/owl.carousel.min.css" />
<link rel="stylesheet" href="~/css/nivo-slider.css" />
<link rel="stylesheet" href="~/css/animate.css" />
<link rel="stylesheet" href="~/css/animated-text.css" />
<link rel="stylesheet" href="~/css/all.min.css" />
<link rel="stylesheet" href="~/css/flaticon.css" />
<link rel="stylesheet" href="~/css/theme-default.css" />
<link rel="stylesheet" href="~/css/meanmenu.min.css" />
<link rel="stylesheet" href="~/css/style.css" />
<link rel="stylesheet" href="~/css/owl.transitions.css" />
<link rel="stylesheet" href="~/css/widget.css" />
<link rel="stylesheet" href="~/css/responsive.css" />
<link rel="stylesheet" href="~/css/slick.css" />
<link rel="stylesheet" href="~/css/slick-theme.css" />
<style>
html {
scroll-behavior: smooth;
}
body {
overflow-x: hidden;
}
img {
max-width: 100%;
height: auto;
}
</style>
@await RenderSectionAsync("Styles", required: false)
</head>
<body>
<div id="sticky-header" class="techno_nav_manu style-two portfolio-header">
<div class="container">
<div class="row align-items-center">
<div class="col-lg-4">
<a class="portfolio-brand" href="#hero">Francesco Lorenzo D'Amico</a>
</div>
<div class="col-lg-8">
<nav class="techno_menu text-center">
<ul class="nav_scroll">
<li><a href="#hero">Start</a></li>
<li><a href="#about">Über mich</a></li>
<li><a href="#skills">Kompetenzen</a></li>
<li><a href="#projects">Projekte</a></li>
<li><a href="#goals">Ziele</a></li>
<li><a href="#experience">Erfahrung</a></li>
<li><a href="#documents">Dokumente</a></li>
<li><a href="#contact">Kontakt</a></li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div class="mobile-menu-area d-sm-block d-md-block d-lg-none">
<div class="mobile-menu">
<nav class="techno_menu">
<ul class="nav_scroll">
<li><a href="#hero">Start</a></li>
<li><a href="#about">Über mich</a></li>
<li><a href="#skills">Kompetenzen</a></li>
<li><a href="#projects">Projekte</a></li>
<li><a href="#goals">Ziele</a></li>
<li><a href="#experience">Erfahrung</a></li>
<li><a href="#documents">Dokumente</a></li>
<li><a href="#contact">Kontakt</a></li>
</ul>
</nav>
</div>
</div>
@RenderBody()
<footer class="footer-middle portfolio-footer">
<div class="container">
<div class="row footer-bottom">
<div class="col-lg-12">
<div class="footer-bottom-content">
<div class="footer-bottom-content-copy">
<p>© 2026 Francesco Lorenzo D'Amico</p>
</div>
</div>
</div>
</div>
</div>
</footer>
<div class="scroll-area">
<div class="top-wrap">
<div class="go-top-btn-wraper">
<div class="go-top go-top-button">
<i class="fas fa-arrow-up"></i>
<i class="fas fa-arrow-up"></i>
</div>
</div>
</div>
</div>
<script src="~/js/jquery-1.9.0.min.js"></script>
<script src="~/js/bootstrap.min.js"></script>
<script src="~/js/owl.carousel.min.js"></script>
<script src="~/js/jquery.counterup.min.js"></script>
<script src="~/js/waypoints.min.js"></script>
<script src="~/js/wow.js"></script>
<script src="~/js/imagesloaded.pkgd.min.js"></script>
<script src="~/js/ajax-mail.js"></script>
<script src="~/js/animated-text.js"></script>
<script src="~/js/isotope.pkgd.min.js"></script>
<script src="~/js/jquery.nivo.slider.pack.js"></script>
<script src="~/js/jquery.meanmenu.js"></script>
<script src="~/js/popper.min.js"></script>
<script src="~/js/jquery.scrollUp.js"></script>
<script src="~/js/theme.js"></script>
<script src="~/js/slick.js"></script>
<script src="~/js/slick.min.js"></script>
<script src="~/js/jquery.barfiller.js"></script>
<script>
$(window).on("scroll", function () {
var scrolled = $(window).scrollTop();
if (scrolled > 300) $(".go-top").addClass("active");
if (scrolled < 300) $(".go-top").removeClass("active");
});
$(".go-top").on("click", function () {
$("html, body").animate({ scrollTop: "0" }, 1200);
});
</script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
@@ -0,0 +1,48 @@
/* Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification
for details on configuring this project to bundle and minify static web assets. */
a.navbar-brand {
white-space: normal;
text-align: center;
word-break: break-all;
}
a {
color: #0077cc;
}
.btn-primary {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
.border-top {
border-top: 1px solid #e5e5e5;
}
.border-bottom {
border-bottom: 1px solid #e5e5e5;
}
.box-shadow {
box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);
}
button.accept-policy {
font-size: 1rem;
line-height: inherit;
}
.footer {
position: absolute;
bottom: 0;
width: 100%;
white-space: nowrap;
line-height: 60px;
}
@@ -0,0 +1,3 @@
@using BewerbungsSeite
@namespace BewerbungsSeite.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@@ -0,0 +1,3 @@
@{
Layout = "_Layout";
}
+65
View File
@@ -0,0 +1,65 @@
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.EntityFrameworkCore;
using BewerbungsSeite.Data;
using BewerbungsSeite.Models;
using BewerbungsSeite.Services;
using System.Text.Encodings.Web;
using System.Text.Unicode;
var builder = WebApplication.CreateBuilder(args);
if (builder.Environment.IsDevelopment())
{
builder.Configuration.AddJsonFile("appsettings.Local.json", optional: true, reloadOnChange: true);
}
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("BewerbungsSeite") ?? throw new InvalidOperationException("Connection string 'BewerbungsSeite' not found.")));
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Login";
options.AccessDeniedPath = "/Login";
});
builder.Services.AddAuthorization();
builder.Services.AddRazorPages(options =>
{
options.Conventions.AuthorizeFolder("/Admin");
});
builder.Services.AddControllers();
builder.Services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All));
builder.Services.AddHttpClient();
builder.Services.AddSingleton<IContactMessageNotificationQueue, ContactMessageNotificationQueue>();
builder.Services.AddHostedService<ContactMessageNotificationService>();
var app = builder.Build();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
var context = services.GetRequiredService<RazorPagesMovieContext>();
context.Database.Migrate();
SeedData.Initialize(services);
}
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.MapControllers();
app.Run();
@@ -0,0 +1,49 @@
{
"profiles": {
"http": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5223"
},
"https": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"dotnetRunMessages": true,
"applicationUrl": "https://localhost:7055;http://localhost:5223"
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Container (Dockerfile)": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
"environmentVariables": {
"ASPNETCORE_HTTPS_PORTS": "8081",
"ASPNETCORE_HTTP_PORTS": "8080"
},
"publishAllPorts": true,
"useSSL": true
}
},
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:38323",
"sslPort": 44354
}
}
}
@@ -0,0 +1,8 @@
{
"dependencies": {
"mssql1": {
"type": "mssql",
"connectionId": "ConnectionStrings:BewerbungsSeite"
}
}
}
@@ -0,0 +1,8 @@
{
"dependencies": {
"mssql1": {
"type": "mssql.local",
"connectionId": "ConnectionStrings:BewerbungsSeite"
}
}
}
+50
View File
@@ -0,0 +1,50 @@
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using BewerbungsSeite.Data;
namespace BewerbungsSeite.Models;
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<DbContextOptions<RazorPagesMovieContext>>()))
{
if (context == null)
{
throw new ArgumentNullException("Null RazorPagesMovieContext");
}
if (!context.AdminUser.Any())
{
var accounts = serviceProvider.GetRequiredService<IConfiguration>()
.GetSection("AdminAccounts")
.Get<List<AdminAccountSeed>>() ?? new List<AdminAccountSeed>();
var hasher = new PasswordHasher<AdminUser>();
foreach (var account in accounts)
{
if (string.IsNullOrWhiteSpace(account.Username) || string.IsNullOrWhiteSpace(account.Password))
{
continue;
}
var user = new AdminUser { Username = account.Username };
user.PasswordHash = hasher.HashPassword(user, account.Password);
context.AdminUser.Add(user);
}
context.SaveChanges();
}
}
}
private class AdminAccountSeed
{
public string Username { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
}
}
@@ -0,0 +1,150 @@
using System.Net.Http.Json;
using Microsoft.EntityFrameworkCore;
using BewerbungsSeite.Data;
namespace BewerbungsSeite.Services;
public class ContactMessageNotificationService : BackgroundService
{
private static readonly TimeSpan FallbackSweepInterval = TimeSpan.FromMinutes(2);
private readonly IServiceScopeFactory _scopeFactory;
private readonly IHttpClientFactory _httpClientFactory;
private readonly IConfiguration _configuration;
private readonly IContactMessageNotificationQueue _queue;
private readonly IHostEnvironment _hostEnvironment;
private readonly ILogger<ContactMessageNotificationService> _logger;
public ContactMessageNotificationService(
IServiceScopeFactory scopeFactory,
IHttpClientFactory httpClientFactory,
IConfiguration configuration,
IContactMessageNotificationQueue queue,
IHostEnvironment hostEnvironment,
ILogger<ContactMessageNotificationService> logger)
{
_scopeFactory = scopeFactory;
_httpClientFactory = httpClientFactory;
_configuration = configuration;
_queue = queue;
_hostEnvironment = hostEnvironment;
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
var consumerTask = ConsumeQueueAsync(stoppingToken);
var fallbackSweepTask = RunFallbackSweepAsync(stoppingToken);
await Task.WhenAll(consumerTask, fallbackSweepTask);
}
private async Task ConsumeQueueAsync(CancellationToken stoppingToken)
{
await foreach (var contactMessageId in _queue.DequeueAllAsync(stoppingToken))
{
try
{
await SendNotificationAsync(contactMessageId, stoppingToken);
}
finally
{
_queue.Release(contactMessageId);
}
}
}
private async Task RunFallbackSweepAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
await EnqueueUnsentFromDatabaseAsync(stoppingToken);
try
{
await Task.Delay(FallbackSweepInterval, stoppingToken);
}
catch (OperationCanceledException)
{
// Dienst wird beendet.
}
}
}
private async Task EnqueueUnsentFromDatabaseAsync(CancellationToken stoppingToken)
{
using var scope = _scopeFactory.CreateScope();
var context = scope.ServiceProvider.GetRequiredService<RazorPagesMovieContext>();
var offeneIds = await context.ContactMessage
.Where(c => !c.NotificationSent)
.OrderBy(c => c.SentAt)
.Select(c => c.Id)
.ToListAsync(stoppingToken);
foreach (var id in offeneIds)
{
_queue.Enqueue(id);
}
}
private async Task SendNotificationAsync(Guid contactMessageId, CancellationToken stoppingToken)
{
var botToken = _configuration["Telegram:BotToken"];
var chatId = _configuration["Telegram:ChatId"];
if (string.IsNullOrWhiteSpace(botToken) || string.IsNullOrWhiteSpace(chatId))
{
_logger.LogWarning("Telegram:BotToken oder Telegram:ChatId ist nicht konfiguriert – Benachrichtigung wird übersprungen.");
return;
}
using var scope = _scopeFactory.CreateScope();
var context = scope.ServiceProvider.GetRequiredService<RazorPagesMovieContext>();
var eintrag = await context.ContactMessage.FindAsync(new object?[] { contactMessageId }, stoppingToken);
if (eintrag is null || eintrag.NotificationSent)
{
return;
}
var text = $"[{GetEnvironmentTag()}] Neue Kontaktanfrage von {eintrag.Name}\n"
+ $"E-Mail: {eintrag.Email}\n"
+ (string.IsNullOrWhiteSpace(eintrag.Phone) ? "" : $"Telefon: {eintrag.Phone}\n")
+ (string.IsNullOrWhiteSpace(eintrag.Subject) ? "" : $"Betreff: {eintrag.Subject}\n")
+ $"\n{eintrag.Message}";
var httpClient = _httpClientFactory.CreateClient();
var sendMessageUrl = $"https://api.telegram.org/bot{botToken}/sendMessage";
try
{
var response = await httpClient.PostAsJsonAsync(
sendMessageUrl,
new { chat_id = chatId, text },
stoppingToken);
if (response.IsSuccessStatusCode)
{
eintrag.NotificationSent = true;
await context.SaveChangesAsync(stoppingToken);
}
else
{
_logger.LogWarning("Telegram-Versand fehlgeschlagen für ContactMessage {Id}: {StatusCode}", eintrag.Id, response.StatusCode);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Telegram-Versand fehlgeschlagen für ContactMessage {Id}", eintrag.Id);
}
}
private string GetEnvironmentTag() => _hostEnvironment.EnvironmentName switch
{
"Development" => "DEV",
"Staging" => "TEST",
"Production" => "PROD",
var other => other.ToUpperInvariant()
};
}
@@ -0,0 +1,32 @@
using System.Collections.Concurrent;
using System.Threading.Channels;
namespace BewerbungsSeite.Services;
public interface IContactMessageNotificationQueue
{
void Enqueue(Guid contactMessageId);
IAsyncEnumerable<Guid> DequeueAllAsync(CancellationToken cancellationToken);
void Release(Guid contactMessageId);
}
public class ContactMessageNotificationQueue : IContactMessageNotificationQueue
{
private readonly Channel<Guid> _channel = Channel.CreateUnbounded<Guid>();
private readonly ConcurrentDictionary<Guid, byte> _inFlight = new();
public void Enqueue(Guid contactMessageId)
{
if (_inFlight.TryAdd(contactMessageId, 0))
{
_channel.Writer.TryWrite(contactMessageId);
}
}
public IAsyncEnumerable<Guid> DequeueAllAsync(CancellationToken cancellationToken) =>
_channel.Reader.ReadAllAsync(cancellationToken);
public void Release(Guid contactMessageId) => _inFlight.TryRemove(contactMessageId, out _);
}
@@ -0,0 +1,12 @@
{
"DetailedErrors": true,
"ConnectionStrings": {
"BewerbungsSeite": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true;TrustServerCertificate=true"
},
"Logging": {
"LogLevel": {
"Default": "Debug",
"Microsoft.AspNetCore": "Information"
}
}
}
@@ -0,0 +1,11 @@
{
"ConnectionStrings": {
"BewerbungsSeite": "Server=sqlserver,1433;Database=RazorPagesMovieContext;User Id=sa;Password=YourPassword123!;TrustServerCertificate=True"
},
"Logging": {
"LogLevel": {
"Default": "Warning",
"Microsoft.AspNetCore": "Warning"
}
}
}
@@ -0,0 +1,11 @@
{
"ConnectionStrings": {
"BewerbungsSeite": "Server=sqlserver,1433;Database=RazorPagesMovieContext;User Id=sa;Password=YourPassword123!;TrustServerCertificate=True"
},
"Logging": {
"LogLevel": {
"Default": "Warning",
"Microsoft.AspNetCore": "Warning"
}
}
}
+9
View File
@@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
+42
View File
@@ -0,0 +1,42 @@
services:
sqlserver:
image: mcr.microsoft.com/mssql/server:2022-latest
container_name: sqlserver
restart: unless-stopped
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=YourPassword123!
ports:
- "1700:1433"
volumes:
- /mnt/PoolHDD/AppData/razorpages-movie/sqlserver:/var/opt/mssql
healthcheck:
test: ["CMD-SHELL", "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P YourPassword123! -Q 'SELECT 1' -No"]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
networks:
- movienet
razorpagesmovie:
image: francesco448/razorpagesmovie:latest
container_name: razorpages-movie
restart: unless-stopped
ports:
- "9001:8080"
volumes:
- ./app:/app
working_dir: /app
environment:
- ASPNETCORE_ENVIRONMENT=Production
- TZ=Europe/Zurich
depends_on:
sqlserver:
condition: service_healthy
networks:
- movienet
networks:
movienet:
driver: bridge
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+935
View File
@@ -0,0 +1,935 @@
/*
Flaticon icon font: Flaticon
Creation date: 27/11/2019 09:49
*/
@font-face {
font-family: "Flaticon";
src: url("../fonts/Flaticon.woff2") format("woff2"), url("../fonts/Flaticon.woff") format("woff");
font-weight: normal;
font-style: normal;
}
[class^="flaticon-"]:before,
[class*=" flaticon-"]:before,
[class^="flaticon-"]:after,
[class*=" flaticon-"]:after {
font-family: Flaticon;
font-style: normal;
}
.flaticon-map:before {
content: "\f100";
}
.flaticon-mail:before {
content: "\f101";
}
.flaticon-call-answer:before {
content: "\f102";
}
.flaticon-chat:before {
content: "\f103";
}
.flaticon-left-arrow:before {
content: "\f104";
}
.flaticon-right-arrow:before {
content: "\f105";
}
.flaticon-back:before {
content: "\f106";
}
.flaticon-next:before {
content: "\f107";
}
.flaticon-play-button:before {
content: "\f108";
}
.flaticon-play-button-1:before {
content: "\f109";
}
.flaticon-upload:before {
content: "\f10a";
}
.flaticon-back-1:before {
content: "\f10b";
}
.flaticon-responsive:before {
content: "\f10c";
}
.flaticon-add:before {
content: "\f10d";
}
.flaticon-play-button-2:before {
content: "\f10e";
}
.flaticon-android:before {
content: "\f10f";
}
.flaticon-fire:before {
content: "\f110";
}
.flaticon-layers:before {
content: "\f111";
}
.flaticon-computer:before {
content: "\f112";
}
.flaticon-chip:before {
content: "\f113";
}
.flaticon-cogwheels:before {
content: "\f114";
}
.flaticon-support:before {
content: "\f115";
}
.flaticon-web:before {
content: "\f116";
}
.flaticon-headset:before {
content: "\f117";
}
.flaticon-facebook:before {
content: "\f118";
}
.flaticon-drop-of-liquid:before {
content: "\f119";
}
.flaticon-drop:before {
content: "\f11a";
}
.flaticon-placeholder:before {
content: "\f11b";
}
.flaticon-shield:before {
content: "\f11c";
}
.flaticon-fountain-pen:before {
content: "\f11d";
}
.flaticon-fountain-pen-1:before {
content: "\f11e";
}
.flaticon-settings:before {
content: "\f11f";
}
.flaticon-phone-call:before {
content: "\f120";
}
.flaticon-call:before {
content: "\f121";
}
.flaticon-settings-1:before {
content: "\f122";
}
.flaticon-placeholder-1:before {
content: "\f123";
}
.flaticon-pen:before {
content: "\f124";
}
.flaticon-analytics:before {
content: "\f125";
}
.flaticon-monitor:before {
content: "\f126";
}
.flaticon-email:before {
content: "\f127";
}
.flaticon-speech-bubble:before {
content: "\f128";
}
.flaticon-suitcase:before {
content: "\f129";
}
.flaticon-communications:before {
content: "\f12a";
}
.flaticon-cash:before {
content: "\f12b";
}
.flaticon-twitter:before {
content: "\f12c";
}
.flaticon-twitter-2:before {
content: "\f12d";
}
.flaticon-instagram-logo:before {
content: "\f12e";
}
.flaticon-instagram-1:before {
content: "\f12f";
}
.flaticon-whatsapp-1:before {
content: "\f130";
}
.flaticon-linkedin-2:before {
content: "\f131";
}
.flaticon-twitter-1:before {
content: "\f132";
}
.flaticon-facebook-3:before {
content: "\f133";
}
.flaticon-whatsapp-2:before {
content: "\f134";
}
.flaticon-xiaomi:before {
content: "\f135";
}
.flaticon-odnoklassniki:before {
content: "\f136";
}
.flaticon-pinterest:before {
content: "\f137";
}
.flaticon-pinterest-1:before {
content: "\f138";
}
.flaticon-wifi:before {
content: "\f139";
}
.flaticon-light-bulb:before {
content: "\f13a";
}
.flaticon-project-management:before {
content: "\f13b";
}
.flaticon-monitor-1:before {
content: "\f13c";
}
.flaticon-camera:before {
content: "\f13d";
}
.flaticon-user:before {
content: "\f13e";
}
.flaticon-advertising:before {
content: "\f13f";
}
.flaticon-select:before {
content: "\f140";
}
.flaticon-snowflake:before {
content: "\f141";
}
.flaticon-snowflake-1:before {
content: "\f142";
}
.flaticon-travel-agency:before {
content: "\f143";
}
.flaticon-bauble:before {
content: "\f144";
}
.flaticon-temporary-agency:before {
content: "\f145";
}
.flaticon-star:before {
content: "\f146";
}
.flaticon-snow-globe:before {
content: "\f147";
}
.flaticon-christmas-tree:before {
content: "\f148";
}
.flaticon-gift:before {
content: "\f149";
}
.flaticon-mortgage:before {
content: "\f14a";
}
.flaticon-monitoring:before {
content: "\f14b";
}
.flaticon-network-1:before {
content: "\f14c";
}
.flaticon-neural:before {
content: "\f14d";
}
.flaticon-networking:before {
content: "\f14e";
}
.flaticon-cloud-computing:before {
content: "\f14f";
}
.flaticon-cloud-computing-1:before {
content: "\f150";
}
.flaticon-microchip:before {
content: "\f151";
}
.flaticon-social-care:before {
content: "\f152";
}
.flaticon-help:before {
content: "\f153";
}
.flaticon-begging:before {
content: "\f154";
}
.flaticon-customer-service:before {
content: "\f155";
}
.flaticon-support-2:before {
content: "\f156";
}
.flaticon-support-3:before {
content: "\f157";
}
.flaticon-customer-service-1:before {
content: "\f158";
}
.flaticon-customer-support:before {
content: "\f159";
}
.flaticon-headphones:before {
content: "\f15a";
}
.flaticon-social-care-1:before {
content: "\f15b";
}
.flaticon-care:before {
content: "\f15c";
}
.flaticon-user-1:before {
content: "\f15d";
}
.flaticon-phone:before {
content: "\f15e";
}
.flaticon-search:before {
content: "\f15f";
}
.flaticon-facebook-4:before {
content: "\f160";
}
.flaticon-pin:before {
content: "\f161";
}
.flaticon-user-2:before {
content: "\f162";
}
.flaticon-internet:before {
content: "\f163";
}
.flaticon-user-3:before {
content: "\f164";
}
.flaticon-chat-1:before {
content: "\f165";
}
.flaticon-team:before {
content: "\f166";
}
.flaticon-connection:before {
content: "\f167";
}
.flaticon-bar-chart:before {
content: "\f168";
}
.flaticon-money:before {
content: "\f169";
}
.flaticon-file:before {
content: "\f16a";
}
.flaticon-linkedin-3:before {
content: "\f16b";
}
.flaticon-pinterest-2:before {
content: "\f16c";
}
.flaticon-google-browser:before {
content: "\f16d";
}
.flaticon-gmail-1:before {
content: "\f16e";
}
.flaticon-gmail-3:before {
content: "\f16f";
}
.flaticon-vimeo:before {
content: "\f170";
}
.flaticon-vimeo-2:before {
content: "\f171";
}
.flaticon-skype:before {
content: "\f172";
}
.flaticon-skype-1:before {
content: "\f173";
}
.flaticon-skype-2:before {
content: "\f174";
}
.flaticon-skype-3:before {
content: "\f175";
}
.flaticon-google-plus-logo:before {
content: "\f176";
}
.flaticon-like:before {
content: "\f177";
}
.flaticon-clock:before {
content: "\f178";
}
.flaticon-loupe:before {
content: "\f179";
}
.flaticon-money-1:before {
content: "\f17a";
}
.flaticon-hand-shake:before {
content: "\f17b";
}
.flaticon-team-1:before {
content: "\f17c";
}
.flaticon-money-2:before {
content: "\f17d";
}
.flaticon-man:before {
content: "\f17e";
}
.flaticon-value:before {
content: "\f17f";
}
.flaticon-share:before {
content: "\f180";
}
.flaticon-time:before {
content: "\f181";
}
.flaticon-school:before {
content: "\f182";
}
.flaticon-chart:before {
content: "\f183";
}
.flaticon-data:before {
content: "\f184";
}
.flaticon-photo:before {
content: "\f185";
}
.flaticon-internet-1:before {
content: "\f186";
}
.flaticon-money-3:before {
content: "\f187";
}
.flaticon-payment:before {
content: "\f188";
}
.flaticon-pin-1:before {
content: "\f189";
}
.flaticon-time-1:before {
content: "\f18a";
}
.flaticon-idea:before {
content: "\f18b";
}
.flaticon-download:before {
content: "\f18c";
}
.flaticon-growth:before {
content: "\f18d";
}
.flaticon-multimedia:before {
content: "\f18e";
}
.flaticon-network-2:before {
content: "\f18f";
}
.flaticon-next-1:before {
content: "\f190";
}
.flaticon-origami:before {
content: "\f191";
}
.flaticon-share-1:before {
content: "\f192";
}
.flaticon-clock-1:before {
content: "\f193";
}
.flaticon-refresh:before {
content: "\f194";
}
.flaticon-avatar:before {
content: "\f195";
}
.flaticon-support-4:before {
content: "\f196";
}
.flaticon-cursor:before {
content: "\f197";
}
.flaticon-brain:before {
content: "\f198";
}
.flaticon-laptop:before {
content: "\f199";
}
.flaticon-arrow:before {
content: "\f19a";
}
.flaticon-mortarboard:before {
content: "\f19b";
}
.flaticon-avatar-1:before {
content: "\f19c";
}
.flaticon-chat-2:before {
content: "\f19d";
}
.flaticon-question:before {
content: "\f19e";
}
.flaticon-test:before {
content: "\f19f";
}
.flaticon-doctor:before {
content: "\f1a0";
}
.flaticon-support-5:before {
content: "\f1a1";
}
.flaticon-map-1:before {
content: "\f1a2";
}
.flaticon-eye:before {
content: "\f1a3";
}
.flaticon-money-4:before {
content: "\f1a4";
}
.flaticon-world:before {
content: "\f1a5";
}
.flaticon-school-1:before {
content: "\f1a6";
}
.flaticon-chat-3:before {
content: "\f1a7";
}
.flaticon-idea-1:before {
content: "\f1a8";
}
.flaticon-support-6:before {
content: "\f1a9";
}
.flaticon-diamond:before {
content: "\f1aa";
}
.flaticon-time-2:before {
content: "\f1ab";
}
.flaticon-bag:before {
content: "\f1ac";
}
.flaticon-contract:before {
content: "\f1ad";
}
.flaticon-report:before {
content: "\f1ae";
}
.flaticon-folder:before {
content: "\f1af";
}
.flaticon-truck:before {
content: "\f1b0";
}
.flaticon-document:before {
content: "\f1b1";
}
.flaticon-plane:before {
content: "\f1b2";
}
.flaticon-time-3:before {
content: "\f1b3";
}
.flaticon-trash:before {
content: "\f1b4";
}
.flaticon-pin-2:before {
content: "\f1b5";
}
.flaticon-think:before {
content: "\f1b6";
}
.flaticon-idea-2:before {
content: "\f1b7";
}
.flaticon-download-1:before {
content: "\f1b8";
}
.flaticon-bell:before {
content: "\f1b9";
}
.flaticon-lock:before {
content: "\f1ba";
}
.flaticon-upload-1:before {
content: "\f1bb";
}
.flaticon-cinema:before {
content: "\f1bc";
}
.flaticon-goal:before {
content: "\f1bd";
}
.flaticon-work:before {
content: "\f1be";
}
.flaticon-design:before {
content: "\f1bf";
}
.flaticon-search-1:before {
content: "\f1c0";
}
.flaticon-food:before {
content: "\f1c1";
}
.flaticon-alert:before {
content: "\f1c2";
}
.flaticon-brain-1:before {
content: "\f1c3";
}
.flaticon-book:before {
content: "\f1c4";
}
.flaticon-time-4:before {
content: "\f1c5";
}
.flaticon-shield-1:before {
content: "\f1c6";
}
.flaticon-time-5:before {
content: "\f1c7";
}
.flaticon-man-1:before {
content: "\f1c8";
}
.flaticon-brain-2:before {
content: "\f1c9";
}
.flaticon-water:before {
content: "\f1ca";
}
.flaticon-content:before {
content: "\f1cb";
}
.flaticon-data-1:before {
content: "\f1cc";
}
.flaticon-like-1:before {
content: "\f1cd";
}
.flaticon-time-6:before {
content: "\f1ce";
}
.flaticon-sign:before {
content: "\f1cf";
}
.flaticon-book-1:before {
content: "\f1d0";
}
.flaticon-adjust:before {
content: "\f1d1";
}
.flaticon-menu:before {
content: "\f1d2";
}
.flaticon-calendar:before {
content: "\f1d3";
}
.flaticon-eye-1:before {
content: "\f1d4";
}
.flaticon-clock-2:before {
content: "\f1d5";
}
.flaticon-share-2:before {
content: "\f1d6";
}
.flaticon-fingerprint:before {
content: "\f1d7";
}
.flaticon-signal:before {
content: "\f1d8";
}
.flaticon-lock-1:before {
content: "\f1d9";
}
.flaticon-water-1:before {
content: "\f1da";
}
.flaticon-code:before {
content: "\f1db";
}
.flaticon-repeat:before {
content: "\f1dc";
}
.flaticon-map-2:before {
content: "\f1dd";
}
.flaticon-message:before {
content: "\f1de";
}
.flaticon-network-3:before {
content: "\f1df";
}
.flaticon-more:before {
content: "\f1e0";
}
.flaticon-random:before {
content: "\f1e1";
}
.flaticon-sign-1:before {
content: "\f1e2";
}
.flaticon-mail-1:before {
content: "\f1e3";
}
.flaticon-adjust-1:before {
content: "\f1e4";
}
+142
View File
@@ -0,0 +1,142 @@
a.meanmenu-reveal{display:none}
.mean-container .mean-bar {
background: #E91F4F;
float: left;
min-height: 60px;
padding: 4px 0 0;
position: relative;
width: 100%;
z-index: 999999;
}
.mean-container a.meanmenu-reveal{width:22px;height:22px;padding:18px;top:0;right:0;cursor:pointer;color:#fff;text-decoration:none;font-size:16px;text-indent:-9999em;line-height:22px;font-size:1px;display:block;font-family:Arial,Helvetica,sans-serif;font-weight:700;float: right;}
.mean-container a.meanmenu-reveal span{display:block;background:#fff;height:3px;margin-top:3px}
.mean-container .mean-nav{float:left;width:100%;background:#0c1923}
.mean-container .mean-nav ul{padding:0;margin:0;width:100%;list-style-type:none}
.mean-container .mean-nav ul li {
background: #f8f8f8 none repeat scroll 0 0;
float: left;
position: relative;
width: 100%;
border-top: 1px solid#ddd;
}
.mean-container .mean-nav ul li a {
background: #f8f8f8 none repeat scroll 0 0;
color: #666666;
display: block;
float: left;
font-size: 14px;
margin: 0;
padding: 1em 5%;
text-align: left;
text-decoration: none;
text-transform: uppercase;
width: 90%;
font-weight: bold;
}
.mobile-menu-area {
background: #262626;
}
.mean-container .mean-nav ul li li a {
border-top: 1px solid rgba(255, 255, 255, 0.25);
opacity: 0.75;
padding: 1em 10%;
text-shadow: none !important;
visibility: visible;
width: 80%;
font-weight: normal;
text-transform: capitalize;
color: #444;
}
.mean-container .mean-nav ul li.mean-last a{border-bottom:0;margin-bottom:0}
.mean-container .mean-nav ul li li li a{width:70%;padding:1em 15%}
.mean-container .mean-nav ul li li li li a{width:60%;padding:1em 20%}
.mean-container .mean-nav ul li li li li li a{width:50%;padding:1em 25%}
.mean-container .mean-nav ul li a:hover {
background: #f8f8f8 none repeat scroll 0 0;
color: #F47E1E;
}
.mean-container .mean-nav ul li a.mean-expand{
width:26px;
height: 15px;
margin-top: 1px;
padding: 12px !important;
text-align:center;
position:absolute;
right:0;top:0;
z-index:2;
font-weight:700;
background:rgba(255,255,255,.1);
border:0!important;
background: #F8F8F8;
}
.mean-container .mean-nav ul li a.mean-expand:hover {
background: #f8f8f8;
}
.mean-container .mean-push{float:left;width:100%;padding:0;margin:0;clear:both}
.mean-nav .wrapper{width:100%;padding:0;margin:0}
.mean-container .mean-bar,.mean-container .mean-bar *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}
.mean-remove{display:none!important}
.mean-container .mean-bar::after {
color: #ffffff;
content: "MENU";
font-size: 21px;
left: 5%;
position: absolute;
top: 12px;
}
/* -------------------------------
39. Mobile menu
----------------------------------*/
.mean-container .mean-bar::after {
display: none;
}
.mean-container .mean-nav ul li a:hover {
color: #0762f8;
border-radius: 0;
}
.mean-container a.meanmenu-reveal span {
background: #fff;
}
.mobile-menu-area {
background: #fff none repeat scroll 0 0;
}
.mean-container .mean-nav ul li a {
background: #fff;
color: #444;
display: block;
}
.mean-container .mean-nav ul li a.mean-expand {
background: none;
top: -4px;
}
.mean-container .mean-nav ul li a.mean-expand:hover {
background: none;
}
.mean-container .mean-nav ul li {
background: #444;
}
.mean-container .mean-nav ul li li a {
color: #151948;
opacity: .90;
border-top: 0;
}
.mean-container a.meanmenu-reveal {
color: #fff;
}
.meanmenu-reveal.meanclose:hover {
color: #fff !important;
}
.mean-container a.meanmenu-reveal:hover span {
background: #fff;
}
.mean-container .mean-bar::before {
color: #fff;
content: "Techno";
font-size: 22px;
font-weight: 800;
left: 10px;
position: absolute;
top: 18px;
}
@@ -0,0 +1,113 @@
/*
* jQuery Nivo Slider v3.2
* http://nivo.dev7studios.com
*
* Copyright 2012, Dev7studios
* Free to use and abuse under the MIT license.
* http://www.opensource.org/licenses/mit-license.php
*/
/* The Nivo Slider styles */
.nivoSlider {
position:relative;
width:100%;
height:auto;
overflow: hidden;
}
.nivoSlider img {
position:absolute;
top:0px;
left:0px;
max-width: none;
}
.nivo-main-image {
display: block !important;
position: relative !important;
width: 100% !important;
}
/* If an image is wrapped in a link */
.nivoSlider a.nivo-imageLink {
position:absolute;
top:0px;
left:0px;
width:100%;
height:100%;
border:0;
padding:0;
margin:0;
z-index:6;
display:none;
background:white;
filter:alpha(opacity=0);
opacity:0;
}
/* The slices and boxes in the Slider */
.nivo-slice {
display:block;
position:absolute;
z-index:5;
height:100%;
top:0;
}
.nivo-box {
display:block;
position:absolute;
z-index:5;
overflow:hidden;
}
.nivo-box img { display:block; }
/* Caption styles */
.nivo-caption {
position:absolute;
left:0px;
bottom:0px;
background:#000;
color:#fff;
width:100%;
z-index:8;
padding: 5px 10px;
opacity: 0.8;
overflow: hidden;
display: none;
-moz-opacity: 0.8;
filter:alpha(opacity=8);
-webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
-moz-box-sizing: border-box; /* Firefox, other Gecko */
box-sizing: border-box; /* Opera/IE 8+ */
}
.nivo-caption p {
padding:5px;
margin:0;
}
.nivo-caption a {
display:inline !important;
}
.nivo-html-caption {
display:none;
}
/* Direction nav styles (e.g. Next & Prev) */
.nivo-directionNav a {
position:absolute;
top:45%;
z-index:9;
cursor:pointer;
}
.nivo-prevNav {
left:0px;
}
.nivo-nextNav {
right:0px;
}
/* Control nav styles (e.g. 1,2,3...) */
.nivo-controlNav {
text-align:center;
padding: 15px 0;
}
.nivo-controlNav a {
cursor:pointer;
}
.nivo-controlNav a.active {
font-weight:bold;
}
+6
View File
@@ -0,0 +1,6 @@
/**
* Owl Carousel v2.2.1
* Copyright 2013-2025 David Deutsch
* Licensed under ()
*/
.owl-carousel,.owl-carousel .owl-item{-webkit-tap-highlight-color:transparent;position:relative}.owl-carousel{display:none;width:100%;z-index:1}.owl-carousel .owl-stage{position:relative;-ms-touch-action:pan-Y;-moz-backface-visibility:hidden}.owl-carousel .owl-stage:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.owl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0,0,0)}.owl-carousel .owl-item,.owl-carousel .owl-wrapper{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0)}.owl-carousel .owl-item{min-height:1px;float:left;-webkit-backface-visibility:hidden;-webkit-touch-callout:none}.owl-carousel .owl-item img{display:block;}.owl-carousel .owl-dots.disabled,.owl-carousel .owl-nav.disabled{display:none}.no-js .owl-carousel,.owl-carousel.owl-loaded{display:block}.owl-carousel .owl-dot,.owl-carousel .owl-nav .owl-next,.owl-carousel .owl-nav .owl-prev{cursor:pointer;cursor:hand;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-loading{opacity:0;display:block}.owl-carousel.owl-hidden{opacity:0}.owl-carousel.owl-refresh .owl-item{visibility:hidden}.owl-carousel.owl-drag .owl-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-grab{cursor:move;cursor:grab}.owl-carousel.owl-rtl{direction:rtl}.owl-carousel.owl-rtl .owl-item{float:right}.owl-carousel .animated{animation-duration:1s;animation-fill-mode:both}.owl-carousel .owl-animated-in{z-index:0}.owl-carousel .owl-animated-out{z-index:1}.owl-carousel .fadeOut{animation-name:fadeOut}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.owl-height{transition:height .5s ease-in-out}.owl-carousel .owl-item .owl-lazy{opacity:0;transition:opacity .4s ease}.owl-carousel .owl-item img.owl-lazy{transform-style:preserve-3d}.owl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.owl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url(owl.video.play.png) no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;transition:transform .1s ease}.owl-carousel .owl-video-play-icon:hover{-ms-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}.owl-carousel .owl-video-playing .owl-video-play-icon,.owl-carousel .owl-video-playing .owl-video-tn{display:none}.owl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;background-size:contain;transition:opacity .4s ease}.owl-carousel .owl-video-frame{position:relative;z-index:1;height:100%;width:100%}
@@ -0,0 +1,163 @@
/*
* Owl Carousel CSS3 Transitions
* v1.3.2
*/
.owl-origin {
-webkit-perspective: 1200px;
-webkit-perspective-origin-x : 50%;
-webkit-perspective-origin-y : 50%;
-moz-perspective : 1200px;
-moz-perspective-origin-x : 50%;
-moz-perspective-origin-y : 50%;
perspective : 1200px;
}
/* fade */
.owl-fade-out {
z-index: 10;
-webkit-animation: fadeOut .7s both ease;
-moz-animation: fadeOut .7s both ease;
animation: fadeOut .7s both ease;
}
.owl-fade-in {
-webkit-animation: fadeIn .7s both ease;
-moz-animation: fadeIn .7s both ease;
animation: fadeIn .7s both ease;
}
/* backSlide */
.owl-backSlide-out {
-webkit-animation: backSlideOut 1s both ease;
-moz-animation: backSlideOut 1s both ease;
animation: backSlideOut 1s both ease;
}
.owl-backSlide-in {
-webkit-animation: backSlideIn 1s both ease;
-moz-animation: backSlideIn 1s both ease;
animation: backSlideIn 1s both ease;
}
/* goDown */
.owl-goDown-out {
-webkit-animation: scaleToFade .7s ease both;
-moz-animation: scaleToFade .7s ease both;
animation: scaleToFade .7s ease both;
}
.owl-goDown-in {
-webkit-animation: goDown .6s ease both;
-moz-animation: goDown .6s ease both;
animation: goDown .6s ease both;
}
/* scaleUp */
.owl-fadeUp-in {
-webkit-animation: scaleUpFrom .5s ease both;
-moz-animation: scaleUpFrom .5s ease both;
animation: scaleUpFrom .5s ease both;
}
.owl-fadeUp-out {
-webkit-animation: scaleUpTo .5s ease both;
-moz-animation: scaleUpTo .5s ease both;
animation: scaleUpTo .5s ease both;
}
/* Keyframes */
/*empty*/
@-webkit-keyframes empty {
0% {opacity: 1}
}
@-moz-keyframes empty {
0% {opacity: 1}
}
@keyframes empty {
0% {opacity: 1}
}
@-webkit-keyframes fadeIn {
0% { opacity:0; }
100% { opacity:1; }
}
@-moz-keyframes fadeIn {
0% { opacity:0; }
100% { opacity:1; }
}
@keyframes fadeIn {
0% { opacity:0; }
100% { opacity:1; }
}
@-webkit-keyframes fadeOut {
0% { opacity:1; }
100% { opacity:0; }
}
@-moz-keyframes fadeOut {
0% { opacity:1; }
100% { opacity:0; }
}
@keyframes fadeOut {
0% { opacity:1; }
100% { opacity:0; }
}
@-webkit-keyframes backSlideOut {
25% { opacity: .5; -webkit-transform: translateZ(-500px); }
75% { opacity: .5; -webkit-transform: translateZ(-500px) translateX(-200%); }
100% { opacity: .5; -webkit-transform: translateZ(-500px) translateX(-200%); }
}
@-moz-keyframes backSlideOut {
25% { opacity: .5; -moz-transform: translateZ(-500px); }
75% { opacity: .5; -moz-transform: translateZ(-500px) translateX(-200%); }
100% { opacity: .5; -moz-transform: translateZ(-500px) translateX(-200%); }
}
@keyframes backSlideOut {
25% { opacity: .5; transform: translateZ(-500px); }
75% { opacity: .5; transform: translateZ(-500px) translateX(-200%); }
100% { opacity: .5; transform: translateZ(-500px) translateX(-200%); }
}
@-webkit-keyframes backSlideIn {
0%, 25% { opacity: .5; -webkit-transform: translateZ(-500px) translateX(200%); }
75% { opacity: .5; -webkit-transform: translateZ(-500px); }
100% { opacity: 1; -webkit-transform: translateZ(0) translateX(0); }
}
@-moz-keyframes backSlideIn {
0%, 25% { opacity: .5; -moz-transform: translateZ(-500px) translateX(200%); }
75% { opacity: .5; -moz-transform: translateZ(-500px); }
100% { opacity: 1; -moz-transform: translateZ(0) translateX(0); }
}
@keyframes backSlideIn {
0%, 25% { opacity: .5; transform: translateZ(-500px) translateX(200%); }
75% { opacity: .5; transform: translateZ(-500px); }
100% { opacity: 1; transform: translateZ(0) translateX(0); }
}
@-webkit-keyframes scaleToFade {
to { opacity: 0; -webkit-transform: scale(.8); }
}
@-moz-keyframes scaleToFade {
to { opacity: 0; -moz-transform: scale(.8); }
}
@keyframes scaleToFade {
to { opacity: 0; transform: scale(.8); }
}
@-webkit-keyframes goDown {
from { -webkit-transform: translateY(-100%); }
}
@-moz-keyframes goDown {
from { -moz-transform: translateY(-100%); }
}
@keyframes goDown {
from { transform: translateY(-100%); }
}
@-webkit-keyframes scaleUpFrom {
from { opacity: 0; -webkit-transform: scale(1.5); }
}
@-moz-keyframes scaleUpFrom {
from { opacity: 0; -moz-transform: scale(1.5); }
}
@keyframes scaleUpFrom {
from { opacity: 0; transform: scale(1.5); }
}
@-webkit-keyframes scaleUpTo {
to { opacity: 0; -webkit-transform: scale(1.5); }
}
@-moz-keyframes scaleUpTo {
to { opacity: 0; -moz-transform: scale(1.5); }
}
@keyframes scaleUpTo {
to { opacity: 0; transform: scale(1.5); }
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,204 @@
@charset 'UTF-8';
/* Slider */
.slick-loading .slick-list
{
background: #fff url('./ajax-loader.gif') center center no-repeat;
}
/* Icons */
@font-face
{
font-family: 'slick';
font-weight: normal;
font-style: normal;
src: url('./fonts/slick.eot');
src: url('./fonts/slick.eot?#iefix') format('embedded-opentype'), url('./fonts/slick.woff') format('woff'), url('./fonts/slick.ttf') format('truetype'), url('./fonts/slick.svg#slick') format('svg');
}
/* Arrows */
.slick-prev,
.slick-next
{
font-size: 0;
line-height: 0;
position: absolute;
top: 50%;
display: block;
width: 20px;
height: 20px;
padding: 0;
-webkit-transform: translate(0, -50%);
-ms-transform: translate(0, -50%);
transform: translate(0, -50%);
cursor: pointer;
color: transparent;
border: none;
outline: none;
background: transparent;
}
.slick-prev:hover,
.slick-prev:focus,
.slick-next:hover,
.slick-next:focus
{
color: transparent;
outline: none;
background: transparent;
}
.slick-prev:hover:before,
.slick-prev:focus:before,
.slick-next:hover:before,
.slick-next:focus:before
{
opacity: 1;
}
.slick-prev.slick-disabled:before,
.slick-next.slick-disabled:before
{
opacity: .25;
}
.slick-prev:before,
.slick-next:before
{
font-family: 'slick';
font-size: 20px;
line-height: 1;
opacity: .75;
color: white;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.slick-prev
{
left: -25px;
}
[dir='rtl'] .slick-prev
{
right: -25px;
left: auto;
}
.slick-prev:before
{
content: '←';
}
[dir='rtl'] .slick-prev:before
{
content: '→';
}
.slick-next
{
right: -25px;
}
[dir='rtl'] .slick-next
{
right: auto;
left: -25px;
}
.slick-next:before
{
content: '→';
}
[dir='rtl'] .slick-next:before
{
content: '←';
}
/* Dots */
.slick-dotted.slick-slider
{
margin-bottom: 30px;
}
.slick-dots
{
position: absolute;
bottom: -25px;
display: block;
width: 100%;
padding: 0;
margin: 0;
list-style: none;
text-align: center;
}
.slick-dots li
{
position: relative;
display: inline-block;
width: 20px;
height: 20px;
margin: 0 5px;
padding: 0;
cursor: pointer;
}
.slick-dots li button
{
font-size: 0;
line-height: 0;
display: block;
width: 20px;
height: 20px;
padding: 5px;
cursor: pointer;
color: transparent;
border: 0;
outline: none;
background: transparent;
}
.slick-dots li button:hover,
.slick-dots li button:focus
{
outline: none;
}
.slick-dots li button:hover:before,
.slick-dots li button:focus:before
{
opacity: 1;
}
.slick-dots li button:before
{
font-family: 'slick';
font-size: 6px;
line-height: 20px;
position: absolute;
top: 0;
left: 0;
width: 20px;
height: 20px;
content: '•';
text-align: center;
opacity: .25;
color: black;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.slick-dots li.slick-active button:before
{
opacity: .75;
color: black;
}
+119
View File
@@ -0,0 +1,119 @@
/* Slider */
.slick-slider
{
position: relative;
display: block;
box-sizing: border-box;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-touch-callout: none;
-khtml-user-select: none;
-ms-touch-action: pan-y;
touch-action: pan-y;
-webkit-tap-highlight-color: transparent;
}
.slick-list
{
position: relative;
display: block;
overflow: hidden;
margin: 0;
padding: 0;
}
.slick-list:focus
{
outline: none;
}
.slick-list.dragging
{
cursor: pointer;
cursor: hand;
}
.slick-slider .slick-track,
.slick-slider .slick-list
{
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
.slick-track
{
position: relative;
top: 0;
left: 0;
display: block;
margin-left: auto;
margin-right: auto;
}
.slick-track:before,
.slick-track:after
{
display: table;
content: '';
}
.slick-track:after
{
clear: both;
}
.slick-loading .slick-track
{
visibility: hidden;
}
.slick-slide
{
display: none;
float: left;
height: 100%;
min-height: 1px;
}
[dir='rtl'] .slick-slide
{
float: right;
}
.slick-slide img
{
display: block;
}
.slick-slide.slick-loading img
{
display: none;
}
.slick-slide.dragging img
{
pointer-events: none;
}
.slick-initialized .slick-slide
{
display: block;
}
.slick-loading .slick-slide
{
visibility: hidden;
}
.slick-vertical .slick-slide
{
display: block;
height: auto;
border: 1px solid transparent;
}
.slick-arrow.slick-hidden {
display: none;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,516 @@
/*
font-family: 'Rajdhani', sans-serif;
font-family: 'Rubik', sans-serif;
*/
@import url('https://fonts.googleapis.com/css2?family=Rajdhani:wght@300;400;500;700&family=Rubik:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap');
html, body {
overflow-x: hidden;
}
body {
color: #33354b;
font-size: 16px;
font-weight: 400;
line-height: 28px;
text-align: left;
font-family: 'Rubik', sans-serif;
}
p {
font-weight: 400;
font-style: normal;
}
h1,
h2,
h3,
h4,
h5,
h6 {
color: #151423;
font-family: 'Rajdhani', sans-serif;
font-style: normal;
margin-bottom: 0;
margin-top: 11px;
line-height: 1.2;
font-weight: 700;
-webkit-transition: .5s;
transition: .5s;
}
a{
-webkit-transition: all 0.3s ease-out 0s;
transition: all 0.3s ease-out 0s;
}
a{
color: #33354b;
}
a:focus,
.btn:focus {
text-decoration: none;
outline: none;
}
a:focus,
a:hover {
text-decoration: none;
text-decoration: none;
}
.uppercase {
text-transform: uppercase;
}
.capitalize {
text-transform: capitalize;
}
h1 a,
h2 a,
h3 a,
h4 a,
h5 a,
h6 a {
color: inherit;
-webkit-transition: .5s;
transition: .5s;
}
h1 {
font-size:45px;
}
h2 {
font-size: 35px;
}
h3 {
font-size: 30px;
}
h4 {
font-size: 24px;
}
h5 {
font-size: 20px;
}
h6 {
font-size: 18px;
}
.white h1,
.white h2,
.white h3,
.white h4,
.white h5,
.white h6 {
color: #fff;
}
.white p {
color: #fff;
}
.white i {
color: #fff;
}
ul {
margin: 0px;
padding: 0px;
}
li {
}
ul {
margin: 0;
padding: 0;
}
li {
}
input:focus,
button:focus
{
border-color:transparent;
outline-color:transparent;
}
textarea:focus{
background: rgba(252,150,21,0.2);
border-color:transparent;
outline-color:transparent;
box-shadow: 0 0 0 0.2rem rgb(252 150 21 / 50%);
}
hr {
margin: 60px 0;
padding: 0px;
border-bottom: 1px solid #eceff8;
border-top: 0px;
}
hr.style-2 {
border-bottom: 1px dashed #f10;
}
hr.mp-0 {
margin: 0;
border-bottom: 1px solid #eceff8;
}
hr.mtb-40 {
margin: 40px 0;
border-bottom: 1px solid #eceff8;
border-top: 0px;
}
label {
color: #fff;
cursor: pointer;
font-size: 14px;
font-weight: 400;
}
a,i, cite, em, var, address, dfn,ol,li,ul{
font-style:normal;
font-weight:400;
}
/* Default Background */
.bg_color {
background: #43baff;
}
.bg_color2 {
background: #211e3b !important;
}
.white_bg{
background: #fff;
}
.bg_fixed {
background-attachment: fixed;
}
.bg_before{
position:relative;
}
.bg_before:before{
position:absolute;
content:"";
left:0;
top:0;
height:100%;
width:100%;
background:rgba(12,90,219,0.3);
}
.nagative_mb {
position: relative;
margin-bottom: -180px;
z-index: 1;
}
*::-moz-selection {
background: #4fc1f0;
color: #fff;
text-shadow: none;
}
::-moz-selection {
background: #4fc1f0;
color: #fff;
text-shadow: none;
}
::selection {
background: #4fc1f0;
color: #fff;
text-shadow: none;
}
::placeholder {
color: #9da4a8;
font-size: 15px;
}
::-webkit-input-placeholder {
/* Chrome/Opera/Safari */
color: #9da4a8;
}
::-moz-placeholder {
/* Firefox 19+ */
color: #9da4a8;
}
:-ms-input-placeholder {
/* IE 10+ */
color: #9da4a8;
}
:-moz-placeholder {
/* Firefox 18- */
color: #9da4a8;
}
/* Contact Area */
.counter_area ::-moz-selection {
contact_area: #001d23;
text-shadow: none;
}
.contact_area ::-moz-selection {
color: #001d23;
text-shadow: none;
}
.contact_area ::selection {
color: #001d23;
text-shadow: none;
}
.contact_area ::placeholder {
color: #001d23;
font-size: 16px;
}
.contact_area ::-webkit-input-placeholder {
/* Chrome/Opera/Safari */
color: #001d23;
}
.contact_area ::-moz-placeholder {
/* Firefox 19+ */
color: #001d23;
}
.contact_area :-ms-input-placeholder {
/* IE 10+ */
color: #001d23;
}
.contact_area :-moz-placeholder {
/* Firefox 18- */
color: #001d23;
}
.blog_reply ::-moz-selection {
color: #151948;
}
.blog_reply ::-moz-selection {
color: #151948;
}
.blog_reply ::selection {
color: #151948;
}
.blog_reply::placeholder {
color: #151948;
}
.blog_reply ::-webkit-input-placeholder {
/* Chrome/Opera/Safari */
color: #151948;
}
.blog_reply ::-moz-placeholder {
/* Firefox 19+ */
color: #151948;
}
.blog_reply :-ms-input-placeholder {
/* IE 10+ */
color: #151948;
}
.blog_reply :-moz-placeholder {
/* Firefox 18- */
color: #151948;
}
/* Padding Top Css */
.pt-350{padding-top:350px;}
.pt-300{padding-top:300px;}
.pt-280{padding-top:280px;}
.pt-250{padding-top:250px;}
.pt-220{padding-top:220px;}
.pt-190{padding-top:190px;}
.pt-180{padding-top:180px;}
.pt-170{padding-top:170px;}
.pt-160{padding-top:160px;}
.pt-150{padding-top:150px;}
.pt-140{padding-top:140px;}
.pt-130{padding-top:130px;}
.pt-120{padding-top:120px;}
.pt-115{padding-top:115px;}
.pt-110{padding-top:110px;}
.pt-100{padding-top:100px;}
.pt-95{padding-top:95px;}
.pt-90{padding-top:90px;}
.pt-85{padding-top:85px;}
.pt-80{padding-top:80px;}
.pt-75{padding-top:75px;}
.pt-70{padding-top:70px;}
.pt-65{padding-top:65px;}
.pt-60{padding-top:60px;}
.pt-55{padding-top:55px;}
.pt-50{padding-top:50px;}
.pt-45{padding-top:45px;}
.pt-40{padding-top:40px;}
.pt-35{padding-top:35px;}
.pt-30{padding-top:30px;}
.pt-25{padding-top:25px;}
.pt-20{padding-top:20px;}
.pt-15{padding-top:15px;}
.pt-10{padding-top:10px;}
/* Padding Bottom Css */
.pb-350{padding-bottom:350px;}
.pb-250{padding-bottom:250px;}
.pb-210{padding-bottom:210px;}
.pb-200{padding-bottom:200px;}
.pb-180{padding-bottom:180px;}
.pb-170{padding-bottom:170px;}
.pb-160{padding-bottom:160px;}
.pb-150{padding-bottom:150px;}
.pb-140{padding-bottom:140px;}
.pb-135{padding-bottom:135px;}
.pb-130{padding-bottom:130px;}
.pb-120{padding-bottom:120px;}
.pb-110{padding-bottom:110px;}
.pb-100{padding-bottom:100px;}
.pb-95{padding-bottom:95px;}
.pb-90{padding-bottom:90px;}
.pb-85{padding-bottom:85px;}
.pb-80{padding-bottom:80px;}
.pb-75{padding-bottom:75px;}
.pb-70{padding-bottom:70px;}
.pb-65{padding-bottom:65px;}
.pb-60{padding-bottom:60px;}
.pb-55{padding-bottom:55px;}
.pb-50{padding-bottom:50px;}
.pb-45{padding-bottom:45px;}
.pb-40{padding-bottom:40px;}
.pb-35{padding-bottom:35px;}
.pb-30{padding-bottom:30px;}
.pb-25{padding-bottom:25px;}
.pb-20{padding-bottom:20px;}
.pb-15{padding-bottom:15px;}
.pb-10{padding-bottom:10px;}
/* Padding Left Css */
.pl-120{padding-left:120px;}
.pl-110{padding-left:110px;}
.pl-100{padding-left:100px;}
.pl-90{padding-left:90px;}
.pl-80{padding-left:80px;}
.pl-70{padding-left:70px;}
.pl-60{padding-left:60px;}
.pl-50{padding-left:50px;}
.pl-40{padding-left:40px;}
.pl-35{padding-left:35px;}
.pl-30{padding-left:30px;}
.pl-25{padding-left:25px;}
.pl-20{padding-left:20px;}
.pl-15{padding-left:15px;}
.pl-10{padding-left:10px;}
/* Padding Right Css */
.pr-120{padding-right:120px;}
.pr-110{padding-right:110px;}
.pr-100{padding-right:100px;}
.pr-90{padding-right:90px;}
.pr-80{padding-right:80px;}
.pr-70{padding-right:70px;}
.pr-60{padding-right:60px;}
.pr-50{padding-right:50px;}
.pr-40{padding-right:40px;}
.pr-35{padding-right:35px;}
.pr-30{padding-right:30px;}
.pr-25{padding-right:25px;}
.pr-20{padding-right:20px;}
.pr-15{padding-right:15px;}
.pr-10{padding-right:10px;}
/* Margin Top Css */
.mt-200{margin-top:200px;}
.mt-190{margin-top:190px;}
.mt-180{margin-top:180px;}
.mt-170{margin-top:170px;}
.mt-160{margin-top:160px;}
.mt-150{margin-top:150px;}
.mt-140{margin-top:140px;}
.mt-130{margin-top:130px;}
.mt-120{margin-top:120px;}
.mt-110{margin-top:110px;}
.mt-100{margin-top:100px;}
.mt-95{margin-top:95px;}
.mt-90{margin-top:90px;}
.mt-80{margin-top:80px;}
.mt-75{margin-top:75px;}
.mt-70{margin-top:70px;}
.mt-65{margin-top:65px;}
.mt-60{margin-top:60px;}
.mt-55{margin-top:55px;}
.mt-50{margin-top:50px;}
.mt-45{margin-top:45px;}
.mt-40{margin-top:40px;}
.mt-35{margin-top:35px;}
.mt-30{margin-top:30px;}
.mt-25{margin-top:25px;}
.mt-20{margin-top:20px;}
.mt-15{margin-top:15px;}
.mt-10{margin-top:10px;}
/* Margin Bottom Css */
.mb-200{margin-bottom:200px;}
.mb-190{margin-bottom:190px;}
.mb-180{margin-bottom:180px;}
.mb-170{margin-bottom:170px;}
.mb-160{margin-bottom:160px;}
.mb-150{margin-bottom:150px;}
.mb-140{margin-bottom:140px;}
.mb-130{margin-bottom:130px;}
.mb-120{margin-bottom:120px;}
.mb-110{margin-bottom:110px;}
.mb-100{margin-bottom:100px;}
.mb-95{margin-bottom:95px;}
.mb-90{margin-bottom:90px;}
.mb-80{margin-bottom:80px;}
.mb-75{margin-bottom:75px;}
.mb-70{margin-bottom:70px;}
.mb-65{margin-bottom:65px;}
.mb-60{margin-bottom:60px;}
.mb-55{margin-bottom:55px;}
.mb-50{margin-bottom:50px;}
.mb-45{margin-bottom:45px;}
.mb-40{margin-bottom:40px;}
.mb-35{margin-bottom:35px;}
.mb-30{margin-bottom:30px;}
.mb-25{margin-bottom:25px;}
.mb-20{margin-bottom:20px;}
.mb-15{margin-bottom:15px;}
.mb-10{margin-bottom:10px;}
/* Margin Left Css */
.ml-200{margin-left:200px;}
.ml-190{margin-left:190px;}
.ml-180{margin-left:180px;}
.ml-170{margin-left:170px;}
.ml-160{margin-left:160px;}
.ml-150{margin-left:150px;}
.ml-140{margin-left:140px;}
.ml-130{margin-left:130px;}
.ml-120{margin-left:120px;}
.ml-110{margin-left:110px;}
.ml-100{margin-left:100px;}
.ml-95{margin-left:95px;}
.ml-90{margin-left:90px;}
.ml-80{margin-left:80px;}
.ml-75{margin-left:75px;}
.ml-70{margin-left:70px;}
.ml-65{margin-left:65px;}
.ml-60{margin-left:60px;}
.ml-55{margin-left:55px;}
.ml-50{margin-left:50px;}
.ml-45{margin-left:45px;}
.ml-40{margin-left:40px;}
.ml-35{margin-left:35px;}
.ml-30{margin-left:30px;}
.ml-25{margin-left:25px;}
.ml-20{margin-left:20px;}
.ml-15{margin-left:15px;}
.ml-10{margin-left:10px;}
/* Margin Right Css */
.mr-200{margin-right:200px;}
.mr-190{margin-right:190px;}
.mr-180{margin-right:180px;}
.mr-170{margin-right:170px;}
.mr-160{margin-right:160px;}
.mr-150{margin-right:150px;}
.mr-140{margin-right:140px;}
.mr-130{margin-right:130px;}
.mr-120{margin-right:120px;}
.mr-110{margin-right:110px;}
.mr-100{margin-right:100px;}
.mr-95{margin-right:95px;}
.mr-90{margin-right:90px;}
.mr-80{margin-right:80px;}
.mr-75{margin-right:75px;}
.mr-70{margin-right:70px;}
.mr-65{margin-right:65px;}
.mr-60{margin-right:60px;}
.mr-55{margin-right:55px;}
.mr-50{margin-right:50px;}
.mr-45{margin-right:45px;}
.mr-40{margin-right:40px;}
.mr-35{margin-right:35px;}
.mr-30{margin-right:30px;}
.mr-25{margin-right:25px;}
.mr-20{margin-right:20px;}
.mr-15{margin-right:15px;}
.mr-10{margin-right:10px;}
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.
@@ -0,0 +1,935 @@
/*
Flaticon icon font: Flaticon
Creation date: 27/11/2019 09:49
*/
@font-face {
font-family: "Flaticon";
src: url("../fonts/Flaticon.woff2") format("woff2"), url("../fonts/Flaticon.woff") format("woff");
font-weight: normal;
font-style: normal;
}
[class^="flaticon-"]:before,
[class*=" flaticon-"]:before,
[class^="flaticon-"]:after,
[class*=" flaticon-"]:after {
font-family: Flaticon;
font-style: normal;
}
.flaticon-map:before {
content: "\f100";
}
.flaticon-mail:before {
content: "\f101";
}
.flaticon-call-answer:before {
content: "\f102";
}
.flaticon-chat:before {
content: "\f103";
}
.flaticon-left-arrow:before {
content: "\f104";
}
.flaticon-right-arrow:before {
content: "\f105";
}
.flaticon-back:before {
content: "\f106";
}
.flaticon-next:before {
content: "\f107";
}
.flaticon-play-button:before {
content: "\f108";
}
.flaticon-play-button-1:before {
content: "\f109";
}
.flaticon-upload:before {
content: "\f10a";
}
.flaticon-back-1:before {
content: "\f10b";
}
.flaticon-responsive:before {
content: "\f10c";
}
.flaticon-add:before {
content: "\f10d";
}
.flaticon-play-button-2:before {
content: "\f10e";
}
.flaticon-android:before {
content: "\f10f";
}
.flaticon-fire:before {
content: "\f110";
}
.flaticon-layers:before {
content: "\f111";
}
.flaticon-computer:before {
content: "\f112";
}
.flaticon-chip:before {
content: "\f113";
}
.flaticon-cogwheels:before {
content: "\f114";
}
.flaticon-support:before {
content: "\f115";
}
.flaticon-web:before {
content: "\f116";
}
.flaticon-headset:before {
content: "\f117";
}
.flaticon-facebook:before {
content: "\f118";
}
.flaticon-drop-of-liquid:before {
content: "\f119";
}
.flaticon-drop:before {
content: "\f11a";
}
.flaticon-placeholder:before {
content: "\f11b";
}
.flaticon-shield:before {
content: "\f11c";
}
.flaticon-fountain-pen:before {
content: "\f11d";
}
.flaticon-fountain-pen-1:before {
content: "\f11e";
}
.flaticon-settings:before {
content: "\f11f";
}
.flaticon-phone-call:before {
content: "\f120";
}
.flaticon-call:before {
content: "\f121";
}
.flaticon-settings-1:before {
content: "\f122";
}
.flaticon-placeholder-1:before {
content: "\f123";
}
.flaticon-pen:before {
content: "\f124";
}
.flaticon-analytics:before {
content: "\f125";
}
.flaticon-monitor:before {
content: "\f126";
}
.flaticon-email:before {
content: "\f127";
}
.flaticon-speech-bubble:before {
content: "\f128";
}
.flaticon-suitcase:before {
content: "\f129";
}
.flaticon-communications:before {
content: "\f12a";
}
.flaticon-cash:before {
content: "\f12b";
}
.flaticon-twitter:before {
content: "\f12c";
}
.flaticon-twitter-2:before {
content: "\f12d";
}
.flaticon-instagram-logo:before {
content: "\f12e";
}
.flaticon-instagram-1:before {
content: "\f12f";
}
.flaticon-whatsapp-1:before {
content: "\f130";
}
.flaticon-linkedin-2:before {
content: "\f131";
}
.flaticon-twitter-1:before {
content: "\f132";
}
.flaticon-facebook-3:before {
content: "\f133";
}
.flaticon-whatsapp-2:before {
content: "\f134";
}
.flaticon-xiaomi:before {
content: "\f135";
}
.flaticon-odnoklassniki:before {
content: "\f136";
}
.flaticon-pinterest:before {
content: "\f137";
}
.flaticon-pinterest-1:before {
content: "\f138";
}
.flaticon-wifi:before {
content: "\f139";
}
.flaticon-light-bulb:before {
content: "\f13a";
}
.flaticon-project-management:before {
content: "\f13b";
}
.flaticon-monitor-1:before {
content: "\f13c";
}
.flaticon-camera:before {
content: "\f13d";
}
.flaticon-user:before {
content: "\f13e";
}
.flaticon-advertising:before {
content: "\f13f";
}
.flaticon-select:before {
content: "\f140";
}
.flaticon-snowflake:before {
content: "\f141";
}
.flaticon-snowflake-1:before {
content: "\f142";
}
.flaticon-travel-agency:before {
content: "\f143";
}
.flaticon-bauble:before {
content: "\f144";
}
.flaticon-temporary-agency:before {
content: "\f145";
}
.flaticon-star:before {
content: "\f146";
}
.flaticon-snow-globe:before {
content: "\f147";
}
.flaticon-christmas-tree:before {
content: "\f148";
}
.flaticon-gift:before {
content: "\f149";
}
.flaticon-mortgage:before {
content: "\f14a";
}
.flaticon-monitoring:before {
content: "\f14b";
}
.flaticon-network-1:before {
content: "\f14c";
}
.flaticon-neural:before {
content: "\f14d";
}
.flaticon-networking:before {
content: "\f14e";
}
.flaticon-cloud-computing:before {
content: "\f14f";
}
.flaticon-cloud-computing-1:before {
content: "\f150";
}
.flaticon-microchip:before {
content: "\f151";
}
.flaticon-social-care:before {
content: "\f152";
}
.flaticon-help:before {
content: "\f153";
}
.flaticon-begging:before {
content: "\f154";
}
.flaticon-customer-service:before {
content: "\f155";
}
.flaticon-support-2:before {
content: "\f156";
}
.flaticon-support-3:before {
content: "\f157";
}
.flaticon-customer-service-1:before {
content: "\f158";
}
.flaticon-customer-support:before {
content: "\f159";
}
.flaticon-headphones:before {
content: "\f15a";
}
.flaticon-social-care-1:before {
content: "\f15b";
}
.flaticon-care:before {
content: "\f15c";
}
.flaticon-user-1:before {
content: "\f15d";
}
.flaticon-phone:before {
content: "\f15e";
}
.flaticon-search:before {
content: "\f15f";
}
.flaticon-facebook-4:before {
content: "\f160";
}
.flaticon-pin:before {
content: "\f161";
}
.flaticon-user-2:before {
content: "\f162";
}
.flaticon-internet:before {
content: "\f163";
}
.flaticon-user-3:before {
content: "\f164";
}
.flaticon-chat-1:before {
content: "\f165";
}
.flaticon-team:before {
content: "\f166";
}
.flaticon-connection:before {
content: "\f167";
}
.flaticon-bar-chart:before {
content: "\f168";
}
.flaticon-money:before {
content: "\f169";
}
.flaticon-file:before {
content: "\f16a";
}
.flaticon-linkedin-3:before {
content: "\f16b";
}
.flaticon-pinterest-2:before {
content: "\f16c";
}
.flaticon-google-browser:before {
content: "\f16d";
}
.flaticon-gmail-1:before {
content: "\f16e";
}
.flaticon-gmail-3:before {
content: "\f16f";
}
.flaticon-vimeo:before {
content: "\f170";
}
.flaticon-vimeo-2:before {
content: "\f171";
}
.flaticon-skype:before {
content: "\f172";
}
.flaticon-skype-1:before {
content: "\f173";
}
.flaticon-skype-2:before {
content: "\f174";
}
.flaticon-skype-3:before {
content: "\f175";
}
.flaticon-google-plus-logo:before {
content: "\f176";
}
.flaticon-like:before {
content: "\f177";
}
.flaticon-clock:before {
content: "\f178";
}
.flaticon-loupe:before {
content: "\f179";
}
.flaticon-money-1:before {
content: "\f17a";
}
.flaticon-hand-shake:before {
content: "\f17b";
}
.flaticon-team-1:before {
content: "\f17c";
}
.flaticon-money-2:before {
content: "\f17d";
}
.flaticon-man:before {
content: "\f17e";
}
.flaticon-value:before {
content: "\f17f";
}
.flaticon-share:before {
content: "\f180";
}
.flaticon-time:before {
content: "\f181";
}
.flaticon-school:before {
content: "\f182";
}
.flaticon-chart:before {
content: "\f183";
}
.flaticon-data:before {
content: "\f184";
}
.flaticon-photo:before {
content: "\f185";
}
.flaticon-internet-1:before {
content: "\f186";
}
.flaticon-money-3:before {
content: "\f187";
}
.flaticon-payment:before {
content: "\f188";
}
.flaticon-pin-1:before {
content: "\f189";
}
.flaticon-time-1:before {
content: "\f18a";
}
.flaticon-idea:before {
content: "\f18b";
}
.flaticon-download:before {
content: "\f18c";
}
.flaticon-growth:before {
content: "\f18d";
}
.flaticon-multimedia:before {
content: "\f18e";
}
.flaticon-network-2:before {
content: "\f18f";
}
.flaticon-next-1:before {
content: "\f190";
}
.flaticon-origami:before {
content: "\f191";
}
.flaticon-share-1:before {
content: "\f192";
}
.flaticon-clock-1:before {
content: "\f193";
}
.flaticon-refresh:before {
content: "\f194";
}
.flaticon-avatar:before {
content: "\f195";
}
.flaticon-support-4:before {
content: "\f196";
}
.flaticon-cursor:before {
content: "\f197";
}
.flaticon-brain:before {
content: "\f198";
}
.flaticon-laptop:before {
content: "\f199";
}
.flaticon-arrow:before {
content: "\f19a";
}
.flaticon-mortarboard:before {
content: "\f19b";
}
.flaticon-avatar-1:before {
content: "\f19c";
}
.flaticon-chat-2:before {
content: "\f19d";
}
.flaticon-question:before {
content: "\f19e";
}
.flaticon-test:before {
content: "\f19f";
}
.flaticon-doctor:before {
content: "\f1a0";
}
.flaticon-support-5:before {
content: "\f1a1";
}
.flaticon-map-1:before {
content: "\f1a2";
}
.flaticon-eye:before {
content: "\f1a3";
}
.flaticon-money-4:before {
content: "\f1a4";
}
.flaticon-world:before {
content: "\f1a5";
}
.flaticon-school-1:before {
content: "\f1a6";
}
.flaticon-chat-3:before {
content: "\f1a7";
}
.flaticon-idea-1:before {
content: "\f1a8";
}
.flaticon-support-6:before {
content: "\f1a9";
}
.flaticon-diamond:before {
content: "\f1aa";
}
.flaticon-time-2:before {
content: "\f1ab";
}
.flaticon-bag:before {
content: "\f1ac";
}
.flaticon-contract:before {
content: "\f1ad";
}
.flaticon-report:before {
content: "\f1ae";
}
.flaticon-folder:before {
content: "\f1af";
}
.flaticon-truck:before {
content: "\f1b0";
}
.flaticon-document:before {
content: "\f1b1";
}
.flaticon-plane:before {
content: "\f1b2";
}
.flaticon-time-3:before {
content: "\f1b3";
}
.flaticon-trash:before {
content: "\f1b4";
}
.flaticon-pin-2:before {
content: "\f1b5";
}
.flaticon-think:before {
content: "\f1b6";
}
.flaticon-idea-2:before {
content: "\f1b7";
}
.flaticon-download-1:before {
content: "\f1b8";
}
.flaticon-bell:before {
content: "\f1b9";
}
.flaticon-lock:before {
content: "\f1ba";
}
.flaticon-upload-1:before {
content: "\f1bb";
}
.flaticon-cinema:before {
content: "\f1bc";
}
.flaticon-goal:before {
content: "\f1bd";
}
.flaticon-work:before {
content: "\f1be";
}
.flaticon-design:before {
content: "\f1bf";
}
.flaticon-search-1:before {
content: "\f1c0";
}
.flaticon-food:before {
content: "\f1c1";
}
.flaticon-alert:before {
content: "\f1c2";
}
.flaticon-brain-1:before {
content: "\f1c3";
}
.flaticon-book:before {
content: "\f1c4";
}
.flaticon-time-4:before {
content: "\f1c5";
}
.flaticon-shield-1:before {
content: "\f1c6";
}
.flaticon-time-5:before {
content: "\f1c7";
}
.flaticon-man-1:before {
content: "\f1c8";
}
.flaticon-brain-2:before {
content: "\f1c9";
}
.flaticon-water:before {
content: "\f1ca";
}
.flaticon-content:before {
content: "\f1cb";
}
.flaticon-data-1:before {
content: "\f1cc";
}
.flaticon-like-1:before {
content: "\f1cd";
}
.flaticon-time-6:before {
content: "\f1ce";
}
.flaticon-sign:before {
content: "\f1cf";
}
.flaticon-book-1:before {
content: "\f1d0";
}
.flaticon-adjust:before {
content: "\f1d1";
}
.flaticon-menu:before {
content: "\f1d2";
}
.flaticon-calendar:before {
content: "\f1d3";
}
.flaticon-eye-1:before {
content: "\f1d4";
}
.flaticon-clock-2:before {
content: "\f1d5";
}
.flaticon-share-2:before {
content: "\f1d6";
}
.flaticon-fingerprint:before {
content: "\f1d7";
}
.flaticon-signal:before {
content: "\f1d8";
}
.flaticon-lock-1:before {
content: "\f1d9";
}
.flaticon-water-1:before {
content: "\f1da";
}
.flaticon-code:before {
content: "\f1db";
}
.flaticon-repeat:before {
content: "\f1dc";
}
.flaticon-map-2:before {
content: "\f1dd";
}
.flaticon-message:before {
content: "\f1de";
}
.flaticon-network-3:before {
content: "\f1df";
}
.flaticon-more:before {
content: "\f1e0";
}
.flaticon-random:before {
content: "\f1e1";
}
.flaticon-sign-1:before {
content: "\f1e2";
}
.flaticon-mail-1:before {
content: "\f1e3";
}
.flaticon-adjust-1:before {
content: "\f1e4";
}
Binary file not shown.
File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 416 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 747 KiB

Some files were not shown because too many files have changed in this diff Show More