mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
UX: implements a random and auto generated skeleton (#20202)
UI is not modified much besides removing the border-bottom, and using only message body. However instead of having a fix template, this is all automatically generated and random, resulting in a more natural experience.
This commit is contained in:
parent
b755b45029
commit
a04201ae01
@ -1,119 +1,15 @@
|
|||||||
<div class="chat-skeleton -animation">
|
<div class="chat-skeleton -animation">
|
||||||
<div class="chat-skeleton__header">
|
{{#each this.placeholders as |rows|}}
|
||||||
<div class="chat-skeleton__header-img"></div>
|
<div class="chat-skeleton__body">
|
||||||
<div class="chat-skeleton__header-name"></div>
|
<div class="chat-skeleton__message">
|
||||||
</div>
|
<div class="chat-skeleton__message-avatar"></div>
|
||||||
|
<div class="chat-skeleton__message-poster"></div>
|
||||||
<div class="chat-skeleton__body">
|
<div class="chat-skeleton__message-content">
|
||||||
<div class="chat-skeleton__message">
|
{{#each rows as |row|}}
|
||||||
<div class="chat-skeleton__message-avatar"></div>
|
<div class="chat-skeleton__message-msg" style={{row}}></div>
|
||||||
<div class="chat-skeleton__message-poster"></div>
|
{{/each}}
|
||||||
<div class="chat-skeleton__message-content">
|
</div>
|
||||||
<div class="chat-skeleton__message-msg -line1 -small"></div>
|
|
||||||
<div class="chat-skeleton__message-msg -line2 -large"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="chat-skeleton__message-avatar"></div>
|
|
||||||
<div class="chat-skeleton__message-poster"></div>
|
|
||||||
<div class="chat-skeleton__message-content">
|
|
||||||
<div class="chat-skeleton__message-msg -line1 -large"></div>
|
|
||||||
<div class="chat-skeleton__message-msg -line2 -large"></div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{{/each}}
|
||||||
|
|
||||||
<div class="chat-skeleton__header">
|
|
||||||
<div class="chat-skeleton__header-img"></div>
|
|
||||||
<div class="chat-skeleton__header-name"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="chat-skeleton__body">
|
|
||||||
<div class="chat-skeleton__message">
|
|
||||||
<div class="chat-skeleton__message-avatar"></div>
|
|
||||||
<div class="chat-skeleton__message-poster"></div>
|
|
||||||
<div class="chat-skeleton__message-content">
|
|
||||||
<div class="chat-skeleton__message-msg -line1 -medium"></div>
|
|
||||||
<div class="chat-skeleton__message-msg -line2 -large"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="chat-skeleton__message">
|
|
||||||
<div class="chat-skeleton__message-avatar"></div>
|
|
||||||
<div class="chat-skeleton__message-poster"></div>
|
|
||||||
<div class="chat-skeleton__message-content">
|
|
||||||
<div class="chat-skeleton__message-msg -line1 -medium"></div>
|
|
||||||
<div class="chat-skeleton__message-msg -line2 -large"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="chat-skeleton__message">
|
|
||||||
<div class="chat-skeleton__message-avatar"></div>
|
|
||||||
<div class="chat-skeleton__message-poster"></div>
|
|
||||||
<div class="chat-skeleton__message-content">
|
|
||||||
<div class="chat-skeleton__message-msg -line1 -small"></div>
|
|
||||||
<div class="chat-skeleton__message-msg -line2 -large"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="chat-skeleton__message">
|
|
||||||
<div class="chat-skeleton__message-avatar"></div>
|
|
||||||
<div class="chat-skeleton__message-poster"></div>
|
|
||||||
<div class="chat-skeleton__message-content">
|
|
||||||
<div class="chat-skeleton__message-msg -line1 -medium"></div>
|
|
||||||
<div class="chat-skeleton__message-msg -line2 -small"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="chat-skeleton__message">
|
|
||||||
<div class="chat-skeleton__message-avatar"></div>
|
|
||||||
<div class="chat-skeleton__message-poster"></div>
|
|
||||||
<div class="chat-skeleton__message-content">
|
|
||||||
<div class="chat-skeleton__message-msg -line1 -medium"></div>
|
|
||||||
<div class="chat-skeleton__message-msg -line2 -medium"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="chat-skeleton__header">
|
|
||||||
<div class="chat-skeleton__header-img"></div>
|
|
||||||
<div class="chat-skeleton__header-name"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="chat-skeleton__body">
|
|
||||||
<div class="chat-skeleton__message">
|
|
||||||
<div class="chat-skeleton__message-avatar"></div>
|
|
||||||
<div class="chat-skeleton__message-poster"></div>
|
|
||||||
<div class="chat-skeleton__message-content">
|
|
||||||
<div class="chat-skeleton__message-msg -line1 -small"></div>
|
|
||||||
<div class="chat-skeleton__message-msg -line2 -large"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="chat-skeleton__message">
|
|
||||||
<div class="chat-skeleton__message-avatar"></div>
|
|
||||||
<div class="chat-skeleton__message-poster"></div>
|
|
||||||
<div class="chat-skeleton__message-content">
|
|
||||||
<div class="chat-skeleton__message-msg -line1 -medium"></div>
|
|
||||||
<div class="chat-skeleton__message-msg -line2 -large"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="chat-skeleton__message">
|
|
||||||
<div class="chat-skeleton__message-avatar"></div>
|
|
||||||
<div class="chat-skeleton__message-poster"></div>
|
|
||||||
<div class="chat-skeleton__message-content">
|
|
||||||
<div class="chat-skeleton__message-msg -line1 -large"></div>
|
|
||||||
<div class="chat-skeleton__message-msg -line2 -small"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="chat-skeleton__message">
|
|
||||||
<div class="chat-skeleton__message-avatar"></div>
|
|
||||||
<div class="chat-skeleton__message-poster"></div>
|
|
||||||
<div class="chat-skeleton__message-content">
|
|
||||||
<div class="chat-skeleton__message-msg -line1 -medium"></div>
|
|
||||||
<div class="chat-skeleton__message-msg -line2 -large"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
@ -0,0 +1,16 @@
|
|||||||
|
import Component from "@glimmer/component";
|
||||||
|
import { htmlSafe } from "@ember/template";
|
||||||
|
|
||||||
|
export default class ChatSkeleton extends Component {
|
||||||
|
get placeholders() {
|
||||||
|
return Array.from({ length: 15 }, () => {
|
||||||
|
return Array.from({ length: this.#randomIntFromInterval(1, 5) }, () => {
|
||||||
|
return htmlSafe(`width: ${this.#randomIntFromInterval(20, 95)}%`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#randomIntFromInterval(min, max) {
|
||||||
|
return Math.floor(Math.random() * (max - min + 1) + min);
|
||||||
|
}
|
||||||
|
}
|
@ -3,32 +3,8 @@ $radius: 10px;
|
|||||||
.chat-skeleton {
|
.chat-skeleton {
|
||||||
height: auto;
|
height: auto;
|
||||||
|
|
||||||
&__header {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
width: 100%;
|
|
||||||
padding: 1em;
|
|
||||||
border-bottom: 1px solid var(--primary-100);
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
&__header-img {
|
|
||||||
background-color: var(--primary-100);
|
|
||||||
border-radius: 50%;
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
margin-right: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
&__header-name {
|
|
||||||
background-color: var(--primary-100);
|
|
||||||
width: 70px;
|
|
||||||
height: 18px;
|
|
||||||
border-radius: $radius;
|
|
||||||
}
|
|
||||||
|
|
||||||
&__body {
|
&__body {
|
||||||
padding: 1em;
|
padding: 0.5em 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__message {
|
&__message {
|
||||||
@ -52,10 +28,10 @@ $radius: 10px;
|
|||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
margin-right: 0.5rem;
|
margin-right: 0.5rem;
|
||||||
|
|
||||||
.chat-skeleton__message:nth-of-type(odd) & {
|
.chat-skeleton__body:nth-of-type(odd) & {
|
||||||
background-color: var(--primary-100);
|
background-color: var(--primary-100);
|
||||||
}
|
}
|
||||||
.chat-skeleton__message:nth-of-type(even) & {
|
.chat-skeleton__body:nth-of-type(even) & {
|
||||||
background-color: var(--primary-200);
|
background-color: var(--primary-200);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -68,10 +44,10 @@ $radius: 10px;
|
|||||||
height: 20px;
|
height: 20px;
|
||||||
border-radius: $radius;
|
border-radius: $radius;
|
||||||
|
|
||||||
.chat-skeleton__message:nth-of-type(odd) & {
|
.chat-skeleton__body:nth-of-type(odd) & {
|
||||||
background-color: var(--primary-100);
|
background-color: var(--primary-100);
|
||||||
}
|
}
|
||||||
.chat-skeleton__message:nth-of-type(even) & {
|
.chat-skeleton__body:nth-of-type(even) & {
|
||||||
background-color: var(--primary-200);
|
background-color: var(--primary-200);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -83,30 +59,14 @@ $radius: 10px;
|
|||||||
&__message-msg {
|
&__message-msg {
|
||||||
height: 13px;
|
height: 13px;
|
||||||
border-radius: $radius;
|
border-radius: $radius;
|
||||||
|
margin: 5px 0;
|
||||||
|
|
||||||
.chat-skeleton__message:nth-of-type(odd) & {
|
.chat-skeleton__body:nth-of-type(odd) & {
|
||||||
background-color: var(--primary-100);
|
background-color: var(--primary-100);
|
||||||
}
|
}
|
||||||
.chat-skeleton__message:nth-of-type(even) & {
|
.chat-skeleton__body:nth-of-type(even) & {
|
||||||
background-color: var(--primary-200);
|
background-color: var(--primary-200);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.-line1 {
|
|
||||||
margin-top: 0.5rem;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.-small {
|
|
||||||
width: 35%;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.-medium {
|
|
||||||
width: 60%;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.-large {
|
|
||||||
width: 85%;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&.-animation {
|
&.-animation {
|
||||||
|
Loading…
Reference in New Issue
Block a user