@@ -1,26 +1,43 @@ | |||
<ion-content> | |||
<h2 class="main-header"> Home </h2> | |||
<figure class="theme-bg-image"> | |||
<img src="assets/home-team/KXIP-lion-white.svg"> | |||
</figure> | |||
<div class="heading-holder"> | |||
<h2 class="main-header"> Home </h2> | |||
<section class="segments"> | |||
<button [ngClass]="{'active' : selectedTab === 'news'}" | |||
(click)="selectedTab = 'news'"> News ({{ newsData.length }}) </button> | |||
<button [ngClass]="{'active' : selectedTab === 'videos'}" | |||
(click)="selectedTab = 'videos'"> Videos </button> | |||
</section> | |||
<section class="segments"> | |||
<button [ngClass]="{'active' : selectedTab === 'news'}" | |||
(click)="selectedTab = 'news'"> News ({{ newsData.length }}) </button> | |||
<button [ngClass]="{'active' : selectedTab === 'videos'}" | |||
(click)="selectedTab = 'videos'"> Videos </button> | |||
</section> | |||
</div> | |||
<button (click)="closeArticle()" | |||
class="close-article-button" | |||
[ngClass]="{'active' : selectedArticle !== null }"> | |||
<ion-icon name="close"></ion-icon> | |||
</button> | |||
<ion-slides [options]="slideOpts"> | |||
<ion-slide *ngFor="let news of newsData"> | |||
<ion-slides [options]="slideOpts" *ngIf="selectedTab === 'news'" | |||
[ngClass]="{'active' : selectedArticle !== null}"> | |||
<ion-slide *ngFor="let news of newsData; let i = index"> | |||
<div class="image-holder"> | |||
<figure> | |||
<img [src]="news.image"> | |||
</figure> | |||
<button *ngIf="news.type === 'VIDEO'"> | |||
<button | |||
[ngClass]="{'active' : selectedArticle !== null}" | |||
*ngIf="news.type === 'VIDEO'"> | |||
<ion-icon name="play"></ion-icon> | |||
</button> | |||
<button *ngIf="news.type === 'ARTICLE'"> | |||
<button | |||
[ngClass]="{'hide' : selectedArticle !== null}" | |||
*ngIf="news.type === 'ARTICLE'"> | |||
<ion-icon name="newspaper"></ion-icon> | |||
</button> | |||
</div> | |||
@@ -28,30 +45,63 @@ | |||
<section class="content"> | |||
<h4> {{ news.heading }} </h4> | |||
<p> | |||
<div class="details"> | |||
{{ news.description }} | |||
</p> | |||
</div> | |||
</section> | |||
<section class="comments" *ngIf="selectedArticle !== null"> | |||
<header> Comments </header> | |||
<ul> | |||
<li *ngFor="let comment of news.comments"> | |||
<p> {{ comment.comment }} <label> - {{ comment.user }} </label> </p> | |||
<button (click)="comment.isLiked = !comment.isLiked" | |||
[ngClass]="{'active' : comment.isLiked}"> | |||
<ion-icon *ngIf="!comment.isLiked" name="heart-outline"></ion-icon> | |||
<ion-icon *ngIf="comment.isLiked" name="heart"></ion-icon> | |||
<span> {{ comment.isLiked ? comment.likes + 1 : comment.likes }} </span> | |||
</button> | |||
</li> | |||
<div class="input-holder" id="comment-input"> | |||
<input type="text" placeholder="Type your comment" [(ngModel)]="myComment"> | |||
<button (click)="postComment()"> <ion-icon name="send"></ion-icon> </button> | |||
</div> | |||
</ul> | |||
</section> | |||
<section class="action-buttons"> | |||
<section class="shortcuts"> | |||
<button> | |||
<ion-icon name="share-social-outline"></ion-icon> | |||
</button> | |||
<button (click)="news.isLiked = !news.isLiked" | |||
<button class="wide-button" (click)="news.isLiked = !news.isLiked" | |||
[ngClass]="{'active' : news.isLiked}"> | |||
<ion-icon *ngIf="!news.isLiked" name="heart-outline"></ion-icon> | |||
<ion-icon *ngIf="news.isLiked" name="heart"></ion-icon> | |||
<span> {{ news.isLiked ? news.likes + 1 : news.likes }} </span> | |||
</button> | |||
</button> | |||
<button> | |||
<ion-icon name="share-social-outline"></ion-icon> | |||
</button> | |||
</section> | |||
<button class="read-more"> | |||
<span *ngIf="news.type === 'ARTICLE'"> Read More </span> | |||
<span *ngIf="news.type === 'VIDEO'"> Watch </span> | |||
<ion-icon name="chevron-forward-outline"></ion-icon> </button> | |||
<section class="shortcuts" *ngIf="selectedArticle !== null"> | |||
<button (click)="news.isBookmarked = !news.isBookmarked" | |||
[ngClass]="{'active' : news.isBookmarked}"> | |||
<ion-icon *ngIf="!news.isBookmarked" name="bookmark-outline"></ion-icon> | |||
<ion-icon *ngIf="news.isBookmarked" name="bookmark"></ion-icon> | |||
</button> | |||
<button class="wide-button" (click)="scrollToAddComment()"> | |||
<ion-icon name="chatbubble-outline"></ion-icon> | |||
<span> {{ news.comments.length }} </span> | |||
</button> | |||
</section> | |||
<button class="read-more" (click)="expandArticle(i)"> | |||
<span> More </span> | |||
<ion-icon name="chevron-forward-outline"></ion-icon> | |||
</button> | |||
</section> | |||
</ion-slide> | |||
@@ -1,5 +1,12 @@ | |||
ion-content { | |||
--background: var(--brand-black); | |||
--background: var(--brand-black); | |||
} | |||
.heading-holder { | |||
position: fixed; | |||
top: 0; | |||
left: 0; | |||
width: 100%; | |||
} | |||
.main-header { | |||
@@ -48,9 +55,126 @@ ion-content { | |||
} | |||
} | |||
.close-article-button { | |||
width: 40px; | |||
height: 40px; | |||
position: fixed; | |||
top: 10px; | |||
right: 10px; | |||
display: flex; | |||
align-items: center; | |||
justify-content: center; | |||
background-color: rgba(#ffff, 0.5); | |||
border-radius: 50%; | |||
z-index: 3; | |||
opacity: 0; | |||
transform: translateY(10px); | |||
pointer-events: none; | |||
transition: opacity 0.3s, transform 0.3s; | |||
&.active { | |||
opacity: 1; | |||
transition-delay: 1s; | |||
transform: translateY(0px); | |||
pointer-events: all; | |||
} | |||
ion-icon { | |||
color: white; | |||
font-size: 20px; | |||
} | |||
} | |||
ion-slides { | |||
margin: 12% 0%; | |||
margin-top: 40%; | |||
height: calc(100vh - 40%); | |||
position: relative; | |||
left: 0; | |||
top: 0; | |||
transition: transform 0.5s, height 0.3s, margin 0.3s, width 0.3s; | |||
z-index: 1; | |||
&.active { | |||
margin: 0px; | |||
width: 100%; | |||
transform: translate(0, 0%); | |||
height: calc(100vh - 56px); | |||
ion-slide { | |||
background-color: white; | |||
border-radius: 0px; | |||
overflow: auto; | |||
.content { | |||
width: 90%; | |||
height: auto; | |||
background-color: white; | |||
transform: translateY(-30px); | |||
position: relative; | |||
border-radius: 10px; | |||
transition-delay: 0.3s; | |||
overflow: auto; | |||
border-width: 0px; | |||
box-shadow: 0px 0px 15px rgba(var(--light-grey-rgb), 0.3); | |||
h4, .details { | |||
opacity: 0; | |||
animation: showUpContent 0.3s forwards; | |||
animation-delay: 0.3s; | |||
} | |||
} | |||
.action-buttons { | |||
width: 90%; | |||
background-color: white; | |||
border-radius: 10px; | |||
position: sticky; | |||
position: -webkit-sticky; | |||
bottom: 0; | |||
z-index: 2; | |||
box-shadow: 0px 0px 15px rgba(var(--light-grey-rgb), 0.3); | |||
justify-content: center; | |||
height: 60px; | |||
.shortcuts { | |||
width: 50%; | |||
button { | |||
background-color: rgba(var(--light-grey-rgb), 0.1); | |||
margin: 0 auto; | |||
width: 40px; | |||
height: 40px; | |||
&.wide-button { | |||
width: auto; | |||
padding: 0 10px; | |||
} | |||
} | |||
} | |||
.read-more { | |||
display: none; | |||
} | |||
} | |||
.image-holder figure { | |||
filter: brightness(30%); | |||
} | |||
} | |||
} | |||
@keyframes showUpContent { | |||
0% { | |||
opacity: 0; | |||
transform: translateY(20px); | |||
-webkit-line-clamp: 4; | |||
} | |||
100% { | |||
opacity: 1; | |||
-webkit-line-clamp: unset; | |||
transform: translateY(0px); | |||
} | |||
} | |||
ion-slide { | |||
display: block; | |||
@@ -59,10 +183,13 @@ ion-slides { | |||
text-align: left; | |||
align-self: start; | |||
height: 100%; | |||
transition: width 0.5s, transform 0.3s, margin 0.3s; | |||
} | |||
.image-holder { | |||
position: relative; | |||
position: sticky; | |||
position: -webkit-sticky; | |||
top: 0; | |||
height: 40%; | |||
overflow: hidden; | |||
@@ -77,10 +204,41 @@ ion-slides { | |||
justify-content: center; | |||
background-color: rgba(#ffff, 0.5); | |||
border-radius: 50%; | |||
transition: transform 0.3s, background-color 0.3s, opacity 0.3s; | |||
&.hide { | |||
opacity: 0; | |||
pointer-events: none; | |||
} | |||
&.active { | |||
transform: translate(calc(-50vw + 40px), -15vh); | |||
animation: ripple 1s infinite; | |||
background-color: rgba(var(--brand-red-rgb), 0.5); | |||
ion-icon { | |||
color: white; | |||
} | |||
} | |||
@keyframes ripple { | |||
0% { | |||
box-shadow: 0px 0px 0px var(--brand-red); | |||
} | |||
50% { | |||
box-shadow: 0px 0px 5px var(--brand-red); | |||
} | |||
100% { | |||
box-shadow: 0px 0px 0px var(--brand-red); | |||
} | |||
} | |||
ion-icon { | |||
color: white; | |||
font-size: 20px; | |||
transition: color 0.3s; | |||
} | |||
} | |||
@@ -90,6 +248,7 @@ ion-slides { | |||
width: 100%; | |||
height: 100%; | |||
filter: brightness(60%); | |||
transition: filter 0.3s; | |||
img { | |||
height: 100%; | |||
@@ -102,11 +261,18 @@ ion-slides { | |||
.content { | |||
background-color: white; | |||
padding: 5%; | |||
padding: 0px 5% 5% 5%; | |||
width: 100%; | |||
margin: 0 auto; | |||
height: calc(60% - 50px); | |||
overflow: hidden; | |||
margin-top: -1px; | |||
border-bottom: 1px solid rgba(var(--light-grey-rgb), 0.8); | |||
border-radius: 0px; | |||
transform: translateY(0px); | |||
box-shadow: 0px 0px 0px var(--light-grey); | |||
transition: border-radius 0.3s, transform 0.3s, width 0.3s, margin 0.3s, box-shadow 0.3s; | |||
border-bottom: 1px solid rgba(var(--light-grey-rgb), 0.3); | |||
z-index: 2; | |||
} | |||
h4 { | |||
@@ -114,11 +280,18 @@ ion-slides { | |||
margin: 0px; | |||
line-height: 1.5; | |||
font-weight: 500; | |||
color: var(--brand-black); | |||
color: var(--brand-black); | |||
transition: opacity 0.1s; | |||
background-color: white; | |||
position: sticky; | |||
position: -webkit-sticky; | |||
top: 1px; | |||
z-index: 1; | |||
padding: 10px 0; | |||
} | |||
p { | |||
margin: 5px 0px 0px 0px; | |||
.details { | |||
margin: 0px; | |||
font-size: 0.9rem; | |||
line-height: 1.5; | |||
font-weight: 400; | |||
@@ -127,6 +300,7 @@ ion-slides { | |||
-webkit-box-orient: vertical; | |||
color: var(--light-grey); | |||
overflow: hidden; | |||
transition: opacity 0.1s; | |||
} | |||
.action-buttons { | |||
@@ -136,16 +310,31 @@ ion-slides { | |||
width: 100%; | |||
height: 50px; | |||
margin-top: -1px; | |||
padding: 0 3%; | |||
padding: 0 3%; | |||
position: relative; | |||
box-shadow: 0px 0px 0px var(--light-grey); | |||
transition: border-radius 0.3s, transform 0.3s, width 0.3s, margin 0.3s, box-shadow 0.3s; | |||
z-index: 1; | |||
margin: 0 auto 20px; | |||
.shortcuts { | |||
display: flex; | |||
align-items: stretch; | |||
align-items: center; | |||
height: 100%; | |||
button { | |||
background-color: transparent; | |||
background-color: #f3f3f3; | |||
margin-right: 5px; | |||
width: 30px; | |||
height: 30px; | |||
border-radius: 50%; | |||
&.wide-button { | |||
width: auto; | |||
border-radius: 5px; | |||
padding: 0 10px; | |||
} | |||
&.active { | |||
ion-icon, span { | |||
@@ -153,6 +342,14 @@ ion-slides { | |||
} | |||
} | |||
// &.bookmark-button { | |||
// &.active { | |||
// ion-icon, span { | |||
// color: var(--light-grey); | |||
// } | |||
// } | |||
// } | |||
span { | |||
vertical-align: middle; | |||
color: var(--light-grey); | |||
@@ -181,4 +378,113 @@ ion-slides { | |||
} | |||
} | |||
.comments { | |||
background-color: white; | |||
width: 90%; | |||
position: relative; | |||
box-shadow: 0px 0px 0px var(--light-grey); | |||
z-index: 1; | |||
margin: 0px auto 20px; | |||
border-radius: 10px; | |||
box-shadow: 0px 0px 15px rgba(var(--light-grey-rgb), 0.3); | |||
border-radius: 10px; | |||
overflow: hidden; | |||
header { | |||
font-size: 1.1rem; | |||
margin: 0px; | |||
line-height: 1.5; | |||
font-weight: 500; | |||
color: var(--brand-black); | |||
transition: opacity 0.1s; | |||
background-color: white; | |||
padding: 10px 5%; | |||
} | |||
ul { | |||
list-style: none; | |||
padding: 0; | |||
margin: 0; | |||
li { | |||
padding: 5px 5% 10px; | |||
border-top: 1px solid rgba(var(--light-grey-rgb), 0.3); | |||
line-height: 1.5; | |||
} | |||
label { | |||
font-size: 1rem; | |||
font-weight: 500; | |||
letter-spacing: 1px; | |||
color: rgba(var(--brand-red-rgb), 0.8); | |||
} | |||
p { | |||
margin: 3px 0; | |||
font-size: 1rem; | |||
font-weight: 400; | |||
color: var(--light-grey); | |||
} | |||
button { | |||
background-color: #f3f3f3; | |||
margin-right: 5px; | |||
height: 30px; | |||
width: auto; | |||
border-radius: 5px; | |||
padding: 0 5px; | |||
span { | |||
vertical-align: middle; | |||
color: var(--light-grey); | |||
} | |||
ion-icon { | |||
vertical-align: middle; | |||
color: var(--brand-black); | |||
font-size: 1rem; | |||
} | |||
&.active { | |||
ion-icon, span { | |||
color: var(--brand-red); | |||
} | |||
} | |||
} | |||
.input-holder { | |||
display: flex; | |||
width: 100%; | |||
height: 70px; | |||
align-items: center; | |||
input { | |||
width: calc(100% - 80px); | |||
margin: 0 auto; | |||
border: 1px solid rgba(var(--light-grey-rgb), 0.3); | |||
border-radius: 30px; | |||
font-size: 14px; | |||
color: var(--brand-black); | |||
font-weight: 500; | |||
height: 40px; | |||
padding: 0 15px; | |||
} | |||
button { | |||
width: 40px; | |||
height: 40px; | |||
background-color: var(--brand-red); | |||
margin: 0 auto; | |||
border-radius: 50%; | |||
ion-icon { | |||
color: white; | |||
font-size: 16px; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
} |
@@ -7,6 +7,8 @@ import { Component, OnInit } from '@angular/core'; | |||
}) | |||
export class HomePage implements OnInit { | |||
selectedTab: string = 'news'; | |||
selectedArticle: number = null; | |||
myComment: string = ''; | |||
slideOpts = { }; | |||
@@ -22,7 +24,8 @@ export class HomePage implements OnInit { | |||
comments: Array<{ | |||
user: string, | |||
comment: string, | |||
likes: number | |||
likes: number, | |||
isLiked: boolean | |||
}>, | |||
}> = []; | |||
@@ -34,7 +37,14 @@ export class HomePage implements OnInit { | |||
id: 1, | |||
image: 'https://s3.india.com/wp-content/uploads/2020/10/Mayank-Agarwal-celebrates-Kings-XI-Punjabs-win-over-Mumbai-Indians-in-match-37-of-Dream11-IPL-2020-in-Dubai%C2%A9KXIP-Twitter.jpg', | |||
heading: 'KXIP beat MI by 3 Wickets', | |||
description: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste ab qui, incidunt illo dolore laboriosam sapiente deserunt officiis ullam. Explicabo accusantium quia tempore totam repellat amet debitis adipisci deserunt iste.', | |||
description: `Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste ab qui, incidunt illo dolore laboriosam sapiente deserunt officiis ullam. | |||
Explicabo accusantium quia tempore totam repellat amet debitis adipisci deserunt iste. | |||
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste ab qui, incidunt illo dolore laboriosam sapiente deserunt officiis u | |||
santium quia tempore totam repellat amet debitis adipisci deserunt iste. | |||
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste ab qui, incidunt illo dolore laboriosam sapiente deserunt officiis u | |||
santium quia tempore totam repellat amet debitis adipisci deserunt iste.`, | |||
type: 'VIDEO', | |||
likes: 10, | |||
isLiked: false, | |||
@@ -43,16 +53,18 @@ export class HomePage implements OnInit { | |||
user: 'kxipFan', | |||
comment: 'Yay!', | |||
likes: 2, | |||
isLiked: true, | |||
}, { | |||
user: 'SehwagFan', | |||
comment: 'finally!', | |||
likes: 5, | |||
isLiked: false, | |||
}] | |||
}, { | |||
id: 2, | |||
image: 'https://www.ak4tsay1.com/wp-content/uploads/2020/02/Kings-XI-Punjab-KXIP-Strengths-and-Weakness-for-IPL-2020-800x445.jpg', | |||
heading: 'KL Rahul scores fastest 100', | |||
description: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste ab qui, incidunt illo dolore laboriosam sapiente deserunt officiis ullam. Explicabo accusantium quia tempore totam repellat amet debitis adipisci deserunt iste.', | |||
description: `Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste ab qui, incidunt illo dolore laboriosam sapiente deserunt officiis ullam. Explicabo accusantium quia tempore totam repellat amet debitis adipisci deserunt iste.`, | |||
type: 'ARTICLE', | |||
isLiked: false, | |||
isBookmarked: false, | |||
@@ -65,8 +77,45 @@ export class HomePage implements OnInit { | |||
spaceBetween: 30, | |||
slidesOffsetBefore: 30, | |||
slidesOffsetAfter: 30, | |||
} | |||
}; | |||
} | |||
expandArticle(index: number) { | |||
this.selectedArticle = index; | |||
this.slideOpts = { | |||
slidesPerView: 1, | |||
spaceBetween: 0, | |||
slidesOffsetBefore: 0, | |||
slidesOffsetAfter: 0, | |||
}; | |||
} | |||
closeArticle() { | |||
this.selectedArticle = null; | |||
this.slideOpts = { | |||
slidesPerView: 1.3, | |||
spaceBetween: 30, | |||
slidesOffsetBefore: 30, | |||
slidesOffsetAfter: 30, | |||
}; | |||
} | |||
postComment() { | |||
this.newsData[this.selectedArticle].comments.push({ | |||
user: 'Test', | |||
comment: this.myComment, | |||
isLiked: false, | |||
likes: 0, | |||
}); | |||
this.myComment = ''; | |||
} | |||
scrollToAddComment() { | |||
document.querySelector('#comment-input').scrollIntoView({behavior: "smooth", block: "start"}); | |||
} | |||
} |
@@ -32,4 +32,21 @@ | |||
outline: none; | |||
text-decoration: none; | |||
letter-spacing: 0.5px; | |||
} | |||
.theme-bg-image { | |||
position: fixed; | |||
opacity: 0.1; | |||
width: 100%; | |||
height: 100%; | |||
display: flex; | |||
align-items: flex-start; | |||
justify-content: center; | |||
left: 0; | |||
top: 0; | |||
img { | |||
display: block; | |||
width: 80%; | |||
} | |||
} |