diff options
Diffstat (limited to 'client/src/app/videos')
-rw-r--r-- | client/src/app/videos/+video-watch/video-watch.component.html | 144 | ||||
-rw-r--r-- | client/src/app/videos/+video-watch/video-watch.component.scss | 255 |
2 files changed, 214 insertions, 185 deletions
diff --git a/client/src/app/videos/+video-watch/video-watch.component.html b/client/src/app/videos/+video-watch/video-watch.component.html index 5921b4b72..74ead1b76 100644 --- a/client/src/app/videos/+video-watch/video-watch.component.html +++ b/client/src/app/videos/+video-watch/video-watch.component.html | |||
@@ -9,89 +9,91 @@ | |||
9 | <!-- Video information --> | 9 | <!-- Video information --> |
10 | <div *ngIf="video" class="margin-content video-bottom"> | 10 | <div *ngIf="video" class="margin-content video-bottom"> |
11 | <div class="video-info"> | 11 | <div class="video-info"> |
12 | <div class="video-info-name-actions"> | 12 | <div class="video-info-first-row"> |
13 | <div class="video-info-name">{{ video.name }}</div> | 13 | <div> |
14 | <div class="video-info-name">{{ video.name }}</div> | ||
14 | 15 | ||
15 | <div class="video-info-actions"> | 16 | <div class="video-info-date-views"> |
16 | <div | 17 | {{ video.createdAt | myFromNow }} - {{ video.views | myNumberFormatter }} views |
17 | *ngIf="isUserLoggedIn()" [ngClass]="{ 'activated': userRating === 'like' }" (click)="setLike()" | ||
18 | class="action-button action-button-like" | ||
19 | > | ||
20 | <span class="icon icon-like" title="Like this video" ></span> | ||
21 | </div> | 18 | </div> |
22 | 19 | ||
23 | <div | 20 | <div class="video-info-channel"> |
24 | *ngIf="isUserLoggedIn()" [ngClass]="{ 'activated': userRating === 'dislike' }" (click)="setDislike()" | 21 | {{ video.channel.displayName }} |
25 | class="action-button action-button-dislike" | 22 | <!-- Here will be the subscribe button --> |
26 | > | ||
27 | <span class="icon icon-dislike" title="Dislike this video"></span> | ||
28 | </div> | 23 | </div> |
29 | 24 | ||
30 | <div (click)="showShareModal()" class="action-button"> | 25 | <div class="video-info-by"> |
31 | <span class="icon icon-share"></span> | 26 | By {{ video.by }} |
32 | Share | 27 | <img [src]="getAvatarPath()" alt="Account avatar" /> |
33 | </div> | 28 | </div> |
29 | </div> | ||
34 | 30 | ||
35 | <div class="action-more" dropdown dropup="true" placement="right"> | 31 | <div class="video-actions-rates"> |
36 | <div class="action-button" dropdownToggle> | 32 | <div class="video-actions"> |
37 | <span class="icon icon-more"></span> | 33 | <div |
34 | *ngIf="isUserLoggedIn()" [ngClass]="{ 'activated': userRating === 'like' }" (click)="setLike()" | ||
35 | class="action-button action-button-like" | ||
36 | > | ||
37 | <span class="icon icon-like" title="Like this video" ></span> | ||
38 | </div> | 38 | </div> |
39 | 39 | ||
40 | <ul *dropdownMenu class="dropdown-menu" id="more-menu" role="menu" aria-labelledby="single-button"> | 40 | <div |
41 | <li role="menuitem"> | 41 | *ngIf="isUserLoggedIn()" [ngClass]="{ 'activated': userRating === 'dislike' }" (click)="setDislike()" |
42 | <a class="dropdown-item" title="Download the video" href="#" (click)="showDownloadModal($event)"> | 42 | class="action-button action-button-dislike" |
43 | <span class="icon icon-download"></span> Download | 43 | > |
44 | </a> | 44 | <span class="icon icon-dislike" title="Dislike this video"></span> |
45 | </li> | 45 | </div> |
46 | |||
47 | <li *ngIf="isUserLoggedIn()" role="menuitem"> | ||
48 | <a class="dropdown-item" title="Report this video" href="#" (click)="showReportModal($event)"> | ||
49 | <span class="icon icon-alert"></span> Report | ||
50 | </a> | ||
51 | </li> | ||
52 | |||
53 | <li *ngIf="isVideoBlacklistable()" role="menuitem"> | ||
54 | <a class="dropdown-item" title="Blacklist this video" href="#" (click)="blacklistVideo($event)"> | ||
55 | <span class="icon icon-blacklist"></span> Blacklist | ||
56 | </a> | ||
57 | </li> | ||
58 | |||
59 | <li *ngIf="isVideoUpdatable()" role="menuitem"> | ||
60 | <a class="dropdown-item" title="Update this video" href="#" [routerLink]="[ '/videos/edit', video.uuid ]"> | ||
61 | <span class="icon icon-edit"></span> Update | ||
62 | </a> | ||
63 | </li> | ||
64 | |||
65 | <li *ngIf="isVideoRemovable()" role="menuitem"> | ||
66 | <a class="dropdown-item" title="Delete this video" href="#" (click)="removeVideo($event)"> | ||
67 | <span class="icon icon-blacklist"></span> Delete | ||
68 | </a> | ||
69 | </li> | ||
70 | </ul> | ||
71 | </div> | ||
72 | </div> | ||
73 | </div> | ||
74 | |||
75 | <div class="video-info-date-views-bar"> | ||
76 | <div class="video-info-date-views"> | ||
77 | {{ video.createdAt | myFromNow }} - {{ video.views | myNumberFormatter }} views | ||
78 | </div> | ||
79 | 46 | ||
80 | <div | 47 | <div (click)="showShareModal()" class="action-button"> |
81 | class="video-info-likes-dislikes-bar" | 48 | <span class="icon icon-share"></span> |
82 | *ngIf="video.likes !== 0 || video.dislikes !== 0" [tooltip]="likesBarTooltipText"> | 49 | Share |
83 | <div class="likes-bar" [ngStyle]="{ 'width.%': video.likesPercent }"></div> | 50 | </div> |
84 | </div> | ||
85 | </div> | ||
86 | 51 | ||
87 | <div class="video-info-channel"> | 52 | <div class="action-more" dropdown dropup="true" placement="right"> |
88 | {{ video.channel.displayName }} | 53 | <div class="action-button" dropdownToggle> |
89 | <!-- Here will be the subscribe button --> | 54 | <span class="icon icon-more"></span> |
90 | </div> | 55 | </div> |
56 | |||
57 | <ul *dropdownMenu class="dropdown-menu" id="more-menu" role="menu" aria-labelledby="single-button"> | ||
58 | <li role="menuitem"> | ||
59 | <a class="dropdown-item" title="Download the video" href="#" (click)="showDownloadModal($event)"> | ||
60 | <span class="icon icon-download"></span> Download | ||
61 | </a> | ||
62 | </li> | ||
63 | |||
64 | <li *ngIf="isUserLoggedIn()" role="menuitem"> | ||
65 | <a class="dropdown-item" title="Report this video" href="#" (click)="showReportModal($event)"> | ||
66 | <span class="icon icon-alert"></span> Report | ||
67 | </a> | ||
68 | </li> | ||
69 | |||
70 | <li *ngIf="isVideoBlacklistable()" role="menuitem"> | ||
71 | <a class="dropdown-item" title="Blacklist this video" href="#" (click)="blacklistVideo($event)"> | ||
72 | <span class="icon icon-blacklist"></span> Blacklist | ||
73 | </a> | ||
74 | </li> | ||
75 | |||
76 | <li *ngIf="isVideoUpdatable()" role="menuitem"> | ||
77 | <a class="dropdown-item" title="Update this video" href="#" [routerLink]="[ '/videos/edit', video.uuid ]"> | ||
78 | <span class="icon icon-edit"></span> Update | ||
79 | </a> | ||
80 | </li> | ||
81 | |||
82 | <li *ngIf="isVideoRemovable()" role="menuitem"> | ||
83 | <a class="dropdown-item" title="Delete this video" href="#" (click)="removeVideo($event)"> | ||
84 | <span class="icon icon-blacklist"></span> Delete | ||
85 | </a> | ||
86 | </li> | ||
87 | </ul> | ||
88 | </div> | ||
89 | </div> | ||
91 | 90 | ||
92 | <div class="video-info-by"> | 91 | <div |
93 | By {{ video.by }} | 92 | class="video-info-likes-dislikes-bar" |
94 | <img [src]="getAvatarPath()" alt="Account avatar" /> | 93 | *ngIf="video.likes !== 0 || video.dislikes !== 0" [tooltip]="likesBarTooltipText"> |
94 | <div class="likes-bar" [ngStyle]="{ 'width.%': video.likesPercent }"></div> | ||
95 | </div> | ||
96 | </div> | ||
95 | </div> | 97 | </div> |
96 | 98 | ||
97 | <div class="video-info-description"> | 99 | <div class="video-info-description"> |
diff --git a/client/src/app/videos/+video-watch/video-watch.component.scss b/client/src/app/videos/+video-watch/video-watch.component.scss index 7ebdfc0c4..d963f713d 100644 --- a/client/src/app/videos/+video-watch/video-watch.component.scss +++ b/client/src/app/videos/+video-watch/video-watch.component.scss | |||
@@ -39,149 +39,156 @@ | |||
39 | flex-grow: 1; | 39 | flex-grow: 1; |
40 | margin-right: 28px; | 40 | margin-right: 28px; |
41 | 41 | ||
42 | .video-info-name-actions { | 42 | .video-info-first-row { |
43 | display: flex; | 43 | display: flex; |
44 | align-items: center; | 44 | |
45 | & > div { | ||
46 | flex-grow: 1; | ||
47 | } | ||
45 | 48 | ||
46 | .video-info-name { | 49 | .video-info-name { |
47 | margin-right: 30px; | 50 | margin-right: 30px; |
51 | height: 40px; // Align with the action buttons | ||
48 | font-size: 27px; | 52 | font-size: 27px; |
49 | font-weight: $font-semibold; | 53 | font-weight: $font-semibold; |
50 | flex-grow: 1; | 54 | flex-grow: 1; |
51 | } | 55 | } |
52 | 56 | ||
53 | .video-info-actions { | 57 | .video-info-date-views { |
54 | min-width: 215px; | 58 | font-size: 16px; |
59 | margin-bottom: 10px; | ||
60 | flex-grow: 1; | ||
61 | } | ||
62 | |||
63 | .video-info-channel { | ||
64 | font-weight: $font-semibold; | ||
65 | font-size: 15px; | ||
66 | } | ||
67 | |||
68 | .video-info-by { | ||
55 | display: flex; | 69 | display: flex; |
56 | justify-content: end; | 70 | align-items: center; |
71 | font-size: 13px; | ||
72 | |||
73 | img { | ||
74 | @include avatar(18px); | ||
57 | 75 | ||
58 | .action-button:not(:first-child), .action-more { | 76 | margin-left: 7px; |
59 | margin-left: 10px; | ||
60 | } | 77 | } |
78 | } | ||
61 | 79 | ||
62 | .action-button { | 80 | .video-actions-rates { |
63 | @include peertube-button; | 81 | display: flex; |
64 | @include grey-button; | 82 | flex-direction: column; |
83 | align-items: end; | ||
65 | 84 | ||
66 | font-size: 15px; | 85 | .video-actions { |
67 | font-weight: $font-semibold; | 86 | height: 40px; // Align with the title |
68 | display: inline-block; | 87 | min-width: 215px; |
69 | padding: 0 10px 0 10px; | 88 | display: flex; |
89 | align-items: center; | ||
70 | 90 | ||
71 | .icon { | 91 | .action-button:not(:first-child), .action-more { |
72 | @include icon(21px); | 92 | margin-left: 10px; |
93 | } | ||
73 | 94 | ||
74 | position: relative; | 95 | .action-button { |
75 | top: -2px; | 96 | @include peertube-button; |
97 | @include grey-button; | ||
76 | 98 | ||
77 | &.icon-like { | 99 | font-size: 15px; |
78 | background-image: url('../../../assets/images/video/like-grey.svg'); | 100 | font-weight: $font-semibold; |
79 | } | 101 | display: inline-block; |
102 | padding: 0 10px 0 10px; | ||
80 | 103 | ||
81 | &.icon-dislike { | 104 | .icon { |
82 | background-image: url('../../../assets/images/video/dislike-grey.svg'); | 105 | @include icon(21px); |
83 | } | ||
84 | 106 | ||
85 | &.icon-share { | 107 | position: relative; |
86 | background-image: url('../../../assets/images/video/share.svg'); | 108 | top: -2px; |
87 | } | 109 | |
110 | &.icon-like { | ||
111 | background-image: url('../../../assets/images/video/like-grey.svg'); | ||
112 | } | ||
113 | |||
114 | &.icon-dislike { | ||
115 | background-image: url('../../../assets/images/video/dislike-grey.svg'); | ||
116 | } | ||
88 | 117 | ||
89 | &.icon-more { | 118 | &.icon-share { |
90 | background-image: url('../../../assets/images/video/more.svg'); | 119 | background-image: url('../../../assets/images/video/share.svg'); |
91 | top: -1px; | 120 | } |
121 | |||
122 | &.icon-more { | ||
123 | background-image: url('../../../assets/images/video/more.svg'); | ||
124 | top: -1px; | ||
125 | } | ||
92 | } | 126 | } |
93 | } | ||
94 | 127 | ||
95 | &.action-button-like.activated { | 128 | &.action-button-like.activated { |
96 | background-color: #39CC0B; | 129 | background-color: #39CC0B; |
97 | 130 | ||
98 | .icon-like { | 131 | .icon-like { |
99 | background-image: url('../../../assets/images/video/like-white.svg'); | 132 | background-image: url('../../../assets/images/video/like-white.svg'); |
133 | } | ||
100 | } | 134 | } |
101 | } | ||
102 | 135 | ||
103 | &.action-button-dislike.activated { | 136 | &.action-button-dislike.activated { |
104 | background-color: #FF0000; | 137 | background-color: #FF0000; |
105 | 138 | ||
106 | .icon-dislike { | 139 | .icon-dislike { |
107 | background-image: url('../../../assets/images/video/dislike-white.svg'); | 140 | background-image: url('../../../assets/images/video/dislike-white.svg'); |
141 | } | ||
108 | } | 142 | } |
109 | } | 143 | } |
110 | } | ||
111 | 144 | ||
112 | .action-more { | 145 | .action-more { |
113 | display: inline-block; | 146 | display: inline-block; |
114 | 147 | ||
115 | .dropdown-menu .dropdown-item { | 148 | .dropdown-menu .dropdown-item { |
116 | padding: 6px 24px; | 149 | padding: 6px 24px; |
117 | 150 | ||
118 | .icon { | 151 | .icon { |
119 | @include icon(24px); | 152 | @include icon(24px); |
120 | 153 | ||
121 | margin-right: 10px; | 154 | margin-right: 10px; |
122 | position: relative; | 155 | position: relative; |
123 | top: -1px; | 156 | top: -1px; |
124 | 157 | ||
125 | &.icon-download { | 158 | &.icon-download { |
126 | background-image: url('../../../assets/images/video/download-black.svg'); | 159 | background-image: url('../../../assets/images/video/download-black.svg'); |
127 | } | 160 | } |
128 | 161 | ||
129 | &.icon-edit { | 162 | &.icon-edit { |
130 | background-image: url('../../../assets/images/global/edit-black.svg'); | 163 | background-image: url('../../../assets/images/global/edit-black.svg'); |
131 | } | 164 | } |
132 | 165 | ||
133 | &.icon-alert { | 166 | &.icon-alert { |
134 | background-image: url('../../../assets/images/video/alert.svg'); | 167 | background-image: url('../../../assets/images/video/alert.svg'); |
135 | } | 168 | } |
136 | 169 | ||
137 | &.icon-blacklist { | 170 | &.icon-blacklist { |
138 | background-image: url('../../../assets/images/video/blacklist.svg'); | 171 | background-image: url('../../../assets/images/video/blacklist.svg'); |
172 | } | ||
139 | } | 173 | } |
140 | } | 174 | } |
141 | } | 175 | } |
142 | } | 176 | } |
143 | } | ||
144 | } | ||
145 | |||
146 | .video-info-date-views-bar { | ||
147 | display: flex; | ||
148 | 177 | ||
149 | .video-info-date-views { | 178 | .video-info-likes-dislikes-bar { |
150 | font-size: 16px; | 179 | height: 5px; |
151 | margin-bottom: 10px; | 180 | width: 186px; |
152 | flex-grow: 1; | 181 | background-color: #E5E5E5; |
153 | } | 182 | margin-top: 25px; |
154 | |||
155 | .video-info-likes-dislikes-bar { | ||
156 | height: 5px; | ||
157 | width: 186px; | ||
158 | background-color: #E5E5E5; | ||
159 | margin-top: 25px; | ||
160 | 183 | ||
161 | .likes-bar { | 184 | .likes-bar { |
162 | height: 100%; | 185 | height: 100%; |
163 | background-color: #39CC0B; | 186 | background-color: #39CC0B; |
187 | } | ||
164 | } | 188 | } |
165 | } | 189 | } |
166 | } | 190 | } |
167 | 191 | ||
168 | .video-info-channel { | ||
169 | font-weight: $font-semibold; | ||
170 | font-size: 15px; | ||
171 | } | ||
172 | |||
173 | .video-info-by { | ||
174 | display: flex; | ||
175 | align-items: center; | ||
176 | font-size: 13px; | ||
177 | |||
178 | img { | ||
179 | @include avatar(18px); | ||
180 | |||
181 | margin-left: 7px; | ||
182 | } | ||
183 | } | ||
184 | |||
185 | .video-info-description { | 192 | .video-info-description { |
186 | margin: 20px 0; | 193 | margin: 20px 0; |
187 | font-size: 15px; | 194 | font-size: 15px; |
@@ -203,18 +210,16 @@ | |||
203 | } | 210 | } |
204 | } | 211 | } |
205 | 212 | ||
206 | .video-attributes { | 213 | .video-attributes .video-attribute { |
207 | .video-attribute { | 214 | font-size: 13px; |
208 | font-size: 13px; | 215 | display: block; |
209 | display: block; | 216 | margin-bottom: 12px; |
210 | margin-bottom: 12px; | 217 | |
211 | 218 | .video-attribute-label { | |
212 | .video-attribute-label { | 219 | width: 86px; |
213 | width: 86px; | 220 | display: inline-block; |
214 | display: inline-block; | 221 | color: #585858; |
215 | color: #585858; | 222 | font-weight: $font-bold; |
216 | font-weight: $font-bold; | ||
217 | } | ||
218 | } | 223 | } |
219 | } | 224 | } |
220 | } | 225 | } |
@@ -246,14 +251,21 @@ | |||
246 | .video-info { | 251 | .video-info { |
247 | margin-right: 0; | 252 | margin-right: 0; |
248 | 253 | ||
249 | .video-info-name-actions { | 254 | .video-info-first-row { |
250 | align-items: left; | ||
251 | flex-direction: column; | 255 | flex-direction: column; |
252 | margin-bottom: 30px; | 256 | margin-bottom: 30px; |
257 | |||
258 | .video-actions-rates { | ||
259 | margin-top: 20px; | ||
260 | align-items: left; | ||
261 | |||
262 | .video-info-likes-dislikes-bar { | ||
263 | margin-top: 10px; | ||
264 | } | ||
265 | } | ||
253 | } | 266 | } |
254 | 267 | ||
255 | .video-info-date-views-bar { | 268 | .video-info-date-views { |
256 | align-items: left; | ||
257 | flex-direction: column; | 269 | flex-direction: column; |
258 | margin-bottom: 30px; | 270 | margin-bottom: 30px; |
259 | 271 | ||
@@ -261,12 +273,27 @@ | |||
261 | margin-top: 0; | 273 | margin-top: 0; |
262 | } | 274 | } |
263 | } | 275 | } |
276 | |||
277 | .video-attributes .video-attribute { | ||
278 | margin-bottom: 5px; | ||
279 | } | ||
264 | } | 280 | } |
265 | } | 281 | } |
266 | } | 282 | } |
267 | 283 | ||
268 | @media screen and (max-width: 800px) { | 284 | @media screen and (max-width: 600px) { |
269 | .video-bottom { | 285 | .video-bottom { |
270 | margin: 20px 0 0 0; | 286 | margin: 20px 0 0 0; |
287 | |||
288 | .video-info { | ||
289 | |||
290 | .video-info-first-row { | ||
291 | |||
292 | .video-info-name { | ||
293 | font-size: 20px; | ||
294 | height: auto; | ||
295 | } | ||
296 | } | ||
297 | } | ||
271 | } | 298 | } |
272 | } | 299 | } |