Calendário
O componente é utilizado como uma agenda de eventos, a exemplo do calendário de monitorias da plataforma Stoodi.
Anatomia

Estados de interação
Normal
11:00
Matéria
11:00
Matéria
Pequeno texto de descrição do evento.
Hover
11:00
Matéria
11:00
Matéria
Pequeno texto de descrição do evento.
Focus
11:00
Matéria
11:00
Matéria
Pequeno texto de descrição do evento.
Disabled
11:00
Matéria
11:00
Matéria
Pequeno texto de descrição do evento.
Mobile
No contexto mobile a listagem de evento é sempre exibida em lista. A barra no topo da página, sempre fixa durante o scroll, indica a data referente ao bloco exibido em tela.

Código
HTML
Exibir código
Copiar código

<div class="calendar-example testing">
<div class="tab-bar tab-calendar">
<button class="tab-link active" data-id="26">
<b>26</b><br/>Ter
</button>
<button class="tab-link" data-id="27">
<b>27</b><br/>Qua
</button>
<button class="tab-link" data-id="28">
<b>28</b><br/>Qui
</button>
<button class="tab-link" data-id="29">
<b>29</b><br/>Sex
</button>
<button class="tab-link" data-id="30">
<b>30</b><br/>Sab
</button>
</div>
<div id="26" class="calendar-grid active">
<div class="calendar-title">
<span class="day">26</span>
<span class="date">Jun<br/>Ter</span>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
</div>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
</div>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
<p class="desc">Pequeno texto de descrição do evento.</p>
</div>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
<p class="desc">Pequeno texto de descrição do evento.</p>
</div>
</div>
</div>
<div id="27" class="calendar-grid">
<div class="calendar-title">
<span class="day">27</span>
<span class="date">Jun<br/>Qua</span>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
</div>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
</div>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
</div>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
<p class="desc">Pequeno texto de descrição do evento.</p>
</div>
</div>
</div>
<div id="28" class="calendar-grid">
<div class="calendar-title">
<span class="day">28</span>
<span class="date">Jun<br/>Qui</span>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
</div>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
</div>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
</div>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
<p class="desc">Pequeno texto de descrição do evento.</p>
</div>
</div>
</div>
<div id="29" class="calendar-grid">
<div class="calendar-title">
<span class="day">29</span>
<span class="date">Jun<br/>Sext</span>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
</div>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
<p class="desc">Pequeno texto de descrição do evento.</p>
</div>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
<p class="desc">Pequeno texto de descrição do evento.</p>
</div>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
<p class="desc">Pequeno texto de descrição do evento.</p>
</div>
</div>
</div>
<div id="30" class="calendar-grid">
<div class="calendar-title">
<span class="day">30</span>
<span class="date">Jun<br/>Sab</span>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
</div>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
<p class="desc">Pequeno texto de descrição do evento.</p>
</div>
</div>
<div class="calendar-box">
<span class="hour">11:00</span>
<div class="info">
<span class="title">Matéria</span>
<p class="desc">Pequeno texto de descrição do evento.</p>
</div>
</div>
</div>
</div>
SASS
Exibir código
Copiar código

.calendar-grid{
float: left;
box-sizing: border-box;
padding-right: 20px;
@media(max-width: $MQMobile){
&:not(.active){
display: none;
}
}
&.active{
.calendar-title{
&:before{
content: "";
position: absolute;
bottom: initial;
top: -1px;
left: 0;
width: 100%;
height: 3px;
border-radius: 0;
background-color: #3153f5;
}
}
}
}
.tab-calendar{
@media(min-width: $MQMobile){
display: none;
}
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
padding-left: 0;
margin-bottom: 0;
@media (max-width: $MQMobile){
position: relative;
clear: both;
margin: 0;
padding-top: 15px;
width: 300px;
height: 105px;
white-space: nowrap;
overflow-x: auto;
overflow-y: hidden;
display: block;
}
.tab-link{
position: relative;
-webkit-box-flex: 1;
-ms-flex: 1 1 auto;
flex: 1 1 auto;
box-sizing: border-box;
background-color: transparent;
border: none;
outline: none;
cursor: pointer;
text-align: center;
border-top: 1px solid #ebebeb;
border-bottom: none;
font-family: Lato;
font-size: 0.75em;
font-weight: normal;
font-style: normal;
font-stretch: normal;
line-height: 1.5;
letter-spacing: normal;
color: #9b9b9b!important;
padding-right: 10px;
padding-left: 10px;
&.active{
&:before{
content: "";
position: absolute;
bottom: initial;
top: -3px;
left: 0;
width: 100%;
height: 3px;
border-radius: 0;
background-color: #3153f5;
}
}
b{
font-family: Lato;
font-size: 1.5em;
font-weight: bold;
font-style: normal;
font-stretch: normal;
line-height: 1.3;
letter-spacing: normal;
color: #1e2a54!important;
}
}
}
.calendar-title{
@media (max-width: $MQMobile){
display: none;
}
text-align: center;
position: relative;
background-color: #fff;
border-radius: 4px;
padding: 12px 10px;
width: 230px;
@media(max-width: $MQMobile){
width: 100%;
}
max-width: 100%;
box-sizing: border-box;
min-height: 48px;
color: #fff;
margin-bottom: 20px;
border-top: 1px solid #ebebeb;
.day{
font-family: Lato;
font-size: 2.5em;
font-weight: bold;
font-style: normal;
font-stretch: normal;
line-height: 1.3;
letter-spacing: normal;
color: #1e2a54;
}
.date{
font-family: Lato;
color: #1f2b54;
font-size: 0.875em;
font-weight: bold;
font-style: normal;
font-stretch: normal;
letter-spacing: normal;
display: inline-block;
line-height: 22px;
padding-left: 7px;
}
}
.calendar-box{
position: relative;
background-color: #3153f5;
border-radius: 4px;
padding: 12px 10px;
width: 230px;
max-width: 100%;
box-sizing: border-box;
min-height: 48px;
color: #fff;
margin-bottom: 20px;
transition: .4s;
@media(max-width: $MQMobile){
width: 100%;
}
.info{
padding-left: 50px;
span.title{
color: #fff;
display: block;
font-family: Lato;
font-size: 1em;
font-weight: 500!important;
font-style: normal;
font-stretch: normal;
line-height: 1.5;
letter-spacing: normal;
margin: 0;
padding: 0;
}
.desc{
margin: 6px 0 0 0;
padding: 0;
display: block;
font-family: Lato;
font-size: 0.875em;
font-weight: bold;
font-style: normal;
font-stretch: normal;
line-height: 1.14;
letter-spacing: normal;
}
}
span.hour{
position: absolute;
left: 10px;
margin-top: 2px;
}
&.disabled{
pointer-events: none;
background-color: #f1f1f1;
color: #9b9b9b;
span.title{
color: #9b9b9b;
}
}
&:hover,
&.hovered{
background-color: #1b68ff;
}
&:focus,
&:active,
&.focused{
background-color: #0a51fb;
}
}
JS
Exibir código
Copiar código

$('body').on('click', '.tab-calendar button', function(e){
var id = $(this).data('id');
$('.calendar-grid, .tab-calendar button').removeClass('active');
$(this).addClass('active');
$('.calendar-grid#'+id).addClass('active');
});