feat(landing-page): add welcome bonus and game carousel
This commit is contained in:
parent
b2f4d9d0d8
commit
8e986727ec
@ -1,2 +1,127 @@
|
|||||||
<app-navbar></app-navbar>
|
<app-navbar></app-navbar>
|
||||||
<button (click)="login()">Einloggen</button>
|
|
||||||
|
<div class="min-h-screen bg-deep-blue text-text-primary">
|
||||||
|
<div class="container mx-auto px-4 py-8 sm:py-12">
|
||||||
|
<div class="max-w-5xl mx-auto">
|
||||||
|
<div class="text-center mb-12 sm:mb-16">
|
||||||
|
<h1 class="text-3xl sm:text-4xl lg:text-5xl font-bold mb-2 sm:mb-3 text-text-primary">
|
||||||
|
Willkommensbonus
|
||||||
|
</h1>
|
||||||
|
<div class="text-4xl sm:text-5xl lg:text-7xl font-extrabold text-emerald-light mb-3 sm:mb-4">
|
||||||
|
200% bis zu 500€
|
||||||
|
</div>
|
||||||
|
<p class="text-text-secondary text-base sm:text-lg mb-6 sm:mb-8">
|
||||||
|
+ 200 Freispiele
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<button class="w-full sm:w-auto bg-emerald hover:bg-emerald-dark text-text-primary font-bold px-6 sm:px-8 py-3 rounded transition-all duration-300 active:scale-95 shadow-lg">
|
||||||
|
Bonus Sichern
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="relative mb-16">
|
||||||
|
<h2 class="text-xl sm:text-2xl font-bold mb-4 sm:mb-6 text-text-primary">Beliebte Spiele</h2>
|
||||||
|
<div class="relative group">
|
||||||
|
<div class="overflow-hidden rounded-lg">
|
||||||
|
<div class="flex transition-transform duration-500 ease-out" [style.transform]="'translateX(-' + currentSlide * 100 + '%)'">
|
||||||
|
<div class="min-w-full grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
|
||||||
|
<div class="bg-deep-blue-contrast rounded-lg overflow-hidden shadow-lg hover:shadow-xl transition-shadow duration-300">
|
||||||
|
<div class="p-4">
|
||||||
|
<h3 class="font-bold mb-2 text-text-primary">Slots</h3>
|
||||||
|
<p class="text-text-secondary text-sm mb-4">Klassische Spielautomaten</p>
|
||||||
|
<button class="w-full bg-emerald hover:bg-emerald-dark text-text-primary font-bold py-2 rounded transition-all duration-300 active:scale-95">
|
||||||
|
Jetzt Spielen
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bg-deep-blue-contrast rounded-lg overflow-hidden shadow-lg hover:shadow-xl transition-shadow duration-300">
|
||||||
|
<div class="p-4">
|
||||||
|
<h3 class="font-bold mb-2 text-text-primary">Plinko</h3>
|
||||||
|
<p class="text-text-secondary text-sm mb-4">Spannendes Geschicklichkeitsspiel</p>
|
||||||
|
<button class="w-full bg-emerald hover:bg-emerald-dark text-text-primary font-bold py-2 rounded transition-all duration-300 active:scale-95">
|
||||||
|
Jetzt Spielen
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="hidden lg:block bg-deep-blue-contrast rounded-lg overflow-hidden shadow-lg hover:shadow-xl transition-shadow duration-300">
|
||||||
|
<div class="p-4">
|
||||||
|
<h3 class="font-bold mb-2 text-text-primary">Blackjack</h3>
|
||||||
|
<p class="text-text-secondary text-sm mb-4">Klassisches Kartenspiel</p>
|
||||||
|
<button class="w-full bg-emerald hover:bg-emerald-dark text-text-primary font-bold py-2 rounded transition-all duration-300 active:scale-95">
|
||||||
|
Jetzt Spielen
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="min-w-full grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
|
||||||
|
<div class="bg-deep-blue-contrast rounded-lg overflow-hidden shadow-lg hover:shadow-xl transition-shadow duration-300">
|
||||||
|
<div class="p-4">
|
||||||
|
<h3 class="font-bold mb-2 text-text-primary">Poker</h3>
|
||||||
|
<p class="text-text-secondary text-sm mb-4">Texas Hold'em & mehr</p>
|
||||||
|
<button class="w-full bg-emerald hover:bg-emerald-dark text-text-primary font-bold py-2 rounded transition-all duration-300 active:scale-95">
|
||||||
|
Jetzt Spielen
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bg-deep-blue-contrast rounded-lg overflow-hidden shadow-lg hover:shadow-xl transition-shadow duration-300">
|
||||||
|
<div class="p-4">
|
||||||
|
<h3 class="font-bold mb-2 text-text-primary">Liars Dice</h3>
|
||||||
|
<p class="text-text-secondary text-sm mb-4">Würfelspiel mit Strategie</p>
|
||||||
|
<button class="w-full bg-emerald hover:bg-emerald-dark text-text-primary font-bold py-2 rounded transition-all duration-300 active:scale-95">
|
||||||
|
Jetzt Spielen
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="hidden lg:block bg-deep-blue-contrast rounded-lg overflow-hidden shadow-lg hover:shadow-xl transition-shadow duration-300">
|
||||||
|
<div class="p-4">
|
||||||
|
<h3 class="font-bold mb-2 text-text-primary">Lootboxen</h3>
|
||||||
|
<p class="text-text-secondary text-sm mb-4">Überraschungskisten</p>
|
||||||
|
<button class="w-full bg-emerald hover:bg-emerald-dark text-text-primary font-bold py-2 rounded transition-all duration-300 active:scale-95">
|
||||||
|
Jetzt Spielen
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="hidden lg:block absolute left-[-4rem] top-1/2 -translate-y-1/2 bg-deep-blue-contrast hover:bg-deep-blue-contrast/90 text-text-primary p-3 rounded-full opacity-0 group-hover:opacity-100 transition-all duration-300 shadow-lg hover:scale-110" (click)="prevSlide()">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button class="hidden lg:block absolute right-[-4rem] top-1/2 -translate-y-1/2 bg-deep-blue-contrast hover:bg-deep-blue-contrast/90 text-text-primary p-3 rounded-full opacity-0 group-hover:opacity-100 transition-all duration-300 shadow-lg hover:scale-110" (click)="nextSlide()">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div class="absolute -bottom-6 left-1/2 -translate-x-1/2 flex gap-2">
|
||||||
|
<button *ngFor="let _ of [0, 1]; let i = index"
|
||||||
|
[class]="'w-2 h-2 rounded-full transition-all duration-300 ' + (currentSlide === i ? 'bg-emerald w-4' : 'bg-text-tertiary')"
|
||||||
|
(click)="goToSlide(i)">
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid grid-cols-1 sm:grid-cols-3 gap-4 sm:gap-6">
|
||||||
|
<div class="bg-deep-blue-contrast rounded-lg shadow-lg p-4 sm:p-6 text-center">
|
||||||
|
<div class="text-xl sm:text-2xl font-bold text-emerald">50 Mio.€+</div>
|
||||||
|
<div class="text-text-secondary text-sm">Ausgezahlt</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-deep-blue-contrast rounded-lg shadow-lg p-4 sm:p-6 text-center">
|
||||||
|
<div class="text-xl sm:text-2xl font-bold text-emerald">10 Mio.+</div>
|
||||||
|
<div class="text-text-secondary text-sm">Spiele</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bg-deep-blue-contrast rounded-lg shadow-lg p-4 sm:p-6 text-center">
|
||||||
|
<div class="text-xl sm:text-2xl font-bold text-emerald">24/7</div>
|
||||||
|
<div class="text-text-secondary text-sm">Support <span class="text-emerald text-xs">*</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@ -1,10 +1,55 @@
|
|||||||
import { Component } from '@angular/core';
|
import { ChangeDetectionStrategy, Component, OnInit, OnDestroy } from '@angular/core';
|
||||||
import { NavbarComponent } from '../shared/components/navbar/navbar.component';
|
import { NavbarComponent } from '../shared/components/navbar/navbar.component';
|
||||||
|
import { NgFor } from '@angular/common';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-landing-page',
|
selector: 'app-landing-page',
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [NavbarComponent],
|
imports: [NavbarComponent, NgFor],
|
||||||
templateUrl: './landing-page.component.html',
|
templateUrl: './landing-page.component.html',
|
||||||
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
})
|
})
|
||||||
export class LandingPageComponent {}
|
export class LandingPageComponent implements OnInit, OnDestroy {
|
||||||
|
currentSlide = 0;
|
||||||
|
private autoplayInterval: any;
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
this.startAutoplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnDestroy() {
|
||||||
|
this.stopAutoplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
prevSlide() {
|
||||||
|
this.currentSlide = this.currentSlide === 0 ? 1 : 0;
|
||||||
|
this.resetAutoplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
nextSlide() {
|
||||||
|
this.currentSlide = this.currentSlide === 1 ? 0 : 1;
|
||||||
|
this.resetAutoplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
goToSlide(index: number) {
|
||||||
|
this.currentSlide = index;
|
||||||
|
this.resetAutoplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
private startAutoplay() {
|
||||||
|
this.autoplayInterval = setInterval(() => {
|
||||||
|
this.nextSlide();
|
||||||
|
}, 5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
private stopAutoplay() {
|
||||||
|
if (this.autoplayInterval) {
|
||||||
|
clearInterval(this.autoplayInterval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private resetAutoplay() {
|
||||||
|
this.stopAutoplay();
|
||||||
|
this.startAutoplay();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<footer class="bg-deep-blue-contrast mt-auto">
|
<footer class="bg-deep-blue mt-auto">
|
||||||
<div class="max-w-7xl mx-auto py-12 px-4 sm:px-6 lg:px-8">
|
<div class="max-w-7xl mx-auto py-12 px-4 sm:px-6 lg:px-8">
|
||||||
<div class="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-8">
|
<div class="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-8">
|
||||||
<div class="col-span-2 md:col-span-1">
|
<div class="col-span-2 md:col-span-1">
|
||||||
@ -106,6 +106,10 @@
|
|||||||
<div class="mt-12 pt-8 border-t border-deep-blue-light">
|
<div class="mt-12 pt-8 border-t border-deep-blue-light">
|
||||||
<div class="flex flex-col md:flex-row justify-between items-center">
|
<div class="flex flex-col md:flex-row justify-between items-center">
|
||||||
<div class="text-gray-400 text-sm mb-4 md:mb-0">
|
<div class="text-gray-400 text-sm mb-4 md:mb-0">
|
||||||
|
<span class="text-xs">
|
||||||
|
<span class="text-emerald">*</span> nicht vorhanden.
|
||||||
|
</span>
|
||||||
|
<br>
|
||||||
© {{ currentYear }} Trustworthy Casino. Keine Rechte vorbehalten.
|
© {{ currentYear }} Trustworthy Casino. Keine Rechte vorbehalten.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import { AsyncPipe } from '@angular/common';
|
|
||||||
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
|
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
|
||||||
import { RouterModule } from '@angular/router';
|
import { RouterModule } from '@angular/router';
|
||||||
import { KeycloakService } from 'keycloak-angular';
|
import { KeycloakService } from 'keycloak-angular';
|
||||||
@ -7,7 +6,7 @@ import { KeycloakService } from 'keycloak-angular';
|
|||||||
selector: 'app-navbar',
|
selector: 'app-navbar',
|
||||||
templateUrl: './navbar.component.html',
|
templateUrl: './navbar.component.html',
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [RouterModule, AsyncPipe],
|
imports: [RouterModule],
|
||||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
})
|
})
|
||||||
export class NavbarComponent {
|
export class NavbarComponent {
|
||||||
|
@ -1,14 +1,37 @@
|
|||||||
@import 'tailwindcss';
|
@import 'tailwindcss';
|
||||||
|
|
||||||
@theme {
|
@theme {
|
||||||
--color-deep-blue: #0f212e;
|
--color-deep-blue: #0a1219;
|
||||||
--color-deep-blue-light: #1a2c38;
|
--color-deep-blue-light: #121e27;
|
||||||
--color-deep-blue-contrast: #1b2c3b;
|
--color-deep-blue-contrast: #1a2835;
|
||||||
--color-light-blue: #1475e1;
|
|
||||||
|
--color-emerald: #10b981;
|
||||||
|
--color-emerald-dark: #059669;
|
||||||
|
--color-emerald-light: #34d399;
|
||||||
|
|
||||||
|
--color-text-primary: #ffffff;
|
||||||
|
--color-text-secondary: #94a3b8;
|
||||||
|
--color-text-tertiary: #64748b;
|
||||||
|
|
||||||
|
--color-accent-yellow: #fbbf24;
|
||||||
|
--color-accent-red: #ef4444;
|
||||||
|
--color-accent-purple: #8b5cf6;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
@apply bg-deep-blue text-gray-100;
|
@apply bg-deep-blue text-text-primary;
|
||||||
|
}
|
||||||
|
|
||||||
|
button, a {
|
||||||
|
@apply cursor-pointer active:scale-95 transition-all duration-200;
|
||||||
|
}
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
font-family: Roboto, 'Helvetica Neue', sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mat-mdc-dialog-container {
|
.mat-mdc-dialog-container {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user