18 |
19 |
20 |
--------------------------------------------------------------------------------
/02/main.css:
--------------------------------------------------------------------------------
1 | *{box-sizing:border-box;font-family:'Roboto', sans-serif}h1,h2{font-weight:900;margin:0;padding:0}p{font-weight:300;color:#aeaeae;margin:0;padding:0}body{position:relative;margin:0}#overlay{position:absolute;z-index:999;bottom:0;height:150px;width:100%;background-color:yellow;background:linear-gradient(to bottom, rgba(255,255,255,0) 0%, #fff 74%, #fff 100%)}#container{padding:30px}#header{margin-bottom:50px}#header h1{margin-bottom:10px}#schedule .appointment{display:flex;align-items:flex-start;position:relative}#schedule .appointment:last-child .event{padding-bottom:70px}#schedule .appointment .circle{position:absolute;background-color:white;border-radius:100%;border:2px solid red;left:calc(25% - 5px);top:-5px;width:12px;height:12px}#schedule .appointment .time{width:25%;margin-top:-8px;text-align:right;padding-right:20px}#schedule .appointment .event{padding:30px 0 30px 25px;border-left:2px solid red;width:70%}
2 | /*# sourceMappingURL=main.css.map */
3 |
--------------------------------------------------------------------------------
/02/main.css.map:
--------------------------------------------------------------------------------
1 | {
2 | "version": 3,
3 | "mappings": "AAAA,CAAE,CACA,UAAU,CAAE,UAAU,CACtB,WAAW,CAAE,oBAAoB,CAGnC,KACG,CACD,WAAW,CAAE,GAAG,CAChB,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CAAC,CAGZ,CAAE,CACA,WAAW,CAAE,GAAG,CAChB,KAAK,CAAE,OAAO,CACd,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CAAC,CAGZ,IAAK,CACH,QAAQ,CAAE,QAAQ,CAClB,MAAM,CAAE,CAAC,CAGX,QAAS,CACP,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,GAAG,CACZ,MAAM,CAAE,CAAC,CACT,MAAM,CAAE,KAAK,CACb,KAAK,CAAE,IAAI,CACX,gBAAgB,CAAE,MAAM,CACxB,UAAU,CAAE,uEAAmG,CAGjH,UAAW,CACT,OAAO,CAAE,IAAI,CAGf,OAAQ,CACN,aAAa,CAAE,IAAI,CAEnB,UAAG,CACD,aAAa,CAAE,IAAI,CAKrB,sBAAa,CACX,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,UAAU,CACvB,QAAQ,CAAE,QAAQ,CAGhB,wCAAO,CACL,cAAc,CAAE,IAAI,CAIxB,8BAAQ,CACN,QAAQ,CAAE,QAAQ,CAClB,gBAAgB,CAAE,KAAK,CACvB,aAAa,CAAE,IAAI,CACnB,MAAM,CAAE,aAAa,CACrB,IAAI,CAAE,eAAe,CACrB,GAAG,CAAE,IAAI,CACT,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CAGd,4BAAM,CACJ,KAAK,CAAE,GAAG,CACV,UAAU,CAAE,IAAI,CAChB,UAAU,CAAE,KAAK,CACjB,aAAa,CAAE,IAAI,CAGrB,6BAAO,CACL,OAAO,CAAE,gBAAgB,CACzB,WAAW,CAAE,aAAa,CAC1B,KAAK,CAAE,GAAG",
4 | "sources": ["main.scss"],
5 | "names": [],
6 | "file": "main.css"
7 | }
--------------------------------------------------------------------------------
/02/main.js:
--------------------------------------------------------------------------------
1 | var appointments = {
2 | "06h30": {
3 | "title": "HIIT",
4 | "person": "Michael Goulart"
5 | },
6 | "07h00": {
7 | "title": "Zumba",
8 | "person": "Mariana Silva"
9 | },
10 | "07h30": {
11 | "title": "Power Jump",
12 | "person": "Alvaro Bigaton"
13 | },
14 | "08h00": {
15 | "title": "Fit Dance",
16 | "person": "Victor Bonifácio"
17 | },
18 | "08h30": {
19 | "title": "Gap",
20 | "person": "Michael Goulart"
21 | },
22 | "11h30": {
23 | "title": "Power Jump",
24 | "person": "Alvaro Bigaton"
25 | },
26 | "11h35": {
27 | "title": "Zumba",
28 | "person": "Mariana Silva"
29 | },
30 | "19h00": {
31 | "title": "HIIT",
32 | "person": "Victor Bonifácio"
33 | },
34 | "19h00": {
35 | "title": "Jiu-Jitsu",
36 | "person": "Beto Almeida"
37 | },
38 | "19h30": {
39 | "title": "Abdominal",
40 | "person": "Michael Goulart"
41 | },
42 | "20h00": {
43 | "title": "Fit Dance",
44 | "person": "Evandro Almeida"
45 | },
46 | "20h30": {
47 | "title": "Glúteos",
48 | "person": "Mariana Silva"
49 | }
50 | }
51 |
52 | // Cria uma variavel com o horario de agora e transforma em unix time
53 | // https://pt.wikipedia.org/wiki/Unix_time
54 | var now = (new Date()).getTime()
55 | // Cria uma variavel auxiliar, com o maior valor numérico possivel
56 | // no javascript. Isso e para podermos encontrar a menor differenca de
57 | // tempo entre todos os horarios no objeto "appointements"
58 | var smallestTimeDifference = Infinity
59 | // Cria uma variavel auxiliar para guardar o elemento da div.circle
60 | // que precisara sre pintada de vermelho apos todas as iteracoes do
61 | // nosso loop.
62 | var redCircle = undefined
63 |
64 | function createElementAndAddClass(element, classe) {
65 | // Cria novo elemento de HTML, esse elemento sera passado como argumento
66 | var el = document.createElement(element)
67 | // Caso o argumento "classe" tenha sido passado...
68 | if (typeof classe !== "undefined") {
69 | // Adiciona uma classe ao elemento criado
70 | el.classList.add(classe)
71 | }
72 | // Retorna o elemento criado
73 | return el
74 | }
75 |
76 | for (var time in appointments) {
77 | // Cria o elemento de HTML div.appointment
78 | var appointmentDiv = createElementAndAddClass("div", "appointment")
79 |
80 | // Cria o elemento de HTML div.time
81 | var timeDiv = createElementAndAddClass("div", "time")
82 | // Cria o elemento de HTML p
83 | var timeP = createElementAndAddClass("p")
84 | // Adiciona o valor de horario como texto dentro do p recem criado
85 | timeP.textContent = time
86 | // Coloca o p dentro do div.time
87 | timeDiv.appendChild(timeP)
88 | // Coloca o div.time dentro do div.appointment
89 | appointmentDiv.appendChild(timeDiv)
90 |
91 | // Cria o elemento de HTML div.circle
92 | var circleDiv = createElementAndAddClass("div", "circle")
93 | // Coloca o div.circle dentro do div.appointment
94 | appointmentDiv.appendChild(circleDiv)
95 |
96 | // Cria o elemento de HTML div.event
97 | var eventDiv = createElementAndAddClass("div", "event")
98 | // Cria o elemento de HTML H2
99 | var eventH2 = createElementAndAddClass("h2")
100 | // Coloca o titulo da atividade como texto dentro do H2 recem criado
101 | eventH2.textContent = appointments[time]['title']
102 | // Cria o elemento de HTML p
103 | var eventP = createElementAndAddClass("p")
104 | // Coloca o nome da pessoa como texto dentro do p recem criado
105 | eventP.textContent = appointments[time]['person']
106 | // Coloca o H2 dentro do div.event
107 | eventDiv.appendChild(eventH2)
108 | // Coloca o p dentro do div.event
109 | eventDiv.appendChild(eventP)
110 | // Coloca o div.event dentro do div.appointment
111 | appointmentDiv.appendChild(eventDiv)
112 |
113 | // Acessa o elemento div#schedule, que ja existe no nosso HTML
114 | var scheduleDiv = document.getElementById("schedule")
115 | // Coloca o div.appointment dentro do div#schedule
116 | scheduleDiv.appendChild(appointmentDiv)
117 |
118 | /**
119 | * Daqui pra baixo, vamos pintar apenas a bolinha que esta mais
120 | * proxima do horario atual de vermelho.
121 | * Lembrando que ja criamos algumas variaveis auxiliares para isso
122 | * antes de entrar dentro desse for...of loop.
123 | */
124 |
125 | // Novamente, criamos um objecto Date, com o horario de agora.
126 | var timeAppointment = new Date()
127 | // No objeto date recem criado, mudamos a hora para a hora que o
128 | // evento dessa iteracao deveria acontecer.
129 | timeAppointment.setHours(parseInt(time.split("h")[0]))
130 | // Agora, mudamos os minutos para os minutos que o evento dessa
131 | // iteracao deveria acontecer.
132 | timeAppointment.setMinutes(parseInt(time.split("h")[1]))
133 | // Finalmente criamos uma timestamp da data recem criada
134 | // e recem modificada.
135 | timeAppointment = timeAppointment.getTime()
136 | // Encontramos o modulo da diferenca entre a data do evento e a
137 | // data de agora. Usamos o Math.abs porque nao nos importamos com o
138 | // sinal do resultado dessa subtracao, queremos apenas a quantidade
139 | // de segundos entre uma data e a outra.
140 | var timeDifference = Math.abs(timeAppointment - now)
141 | // Agora verificamos se a diferenca entre o horario do evento dessa
142 | // iteracao e o horario de agora, e menor do que a menor diferenca
143 | // encontrada ate agora...
144 | if (timeDifference < smallestTimeDifference) {
145 | // Caso seja a menor diferenca, setamos a nossa variavel que
146 | // guarda o valor da menor diferenca, para essa nova menor
147 | // diferenca encontrada.
148 | smallestTimeDifference = timeDifference
149 | // Tambem salvamos o elemento de HTML div.circle dessa iteracao
150 | // para podermos pintar ele de vermelho depois.
151 | redCircle = circleDiv
152 | }
153 | }
154 |
155 | // Depois de verificar todos os eventos e encontrar qual o mais proximo
156 | // do horario atual. Pintamos o div.circle desse envento de vermelho.
157 | redCircle.style.backgroundColor = "red"
--------------------------------------------------------------------------------
/02/main.scss:
--------------------------------------------------------------------------------
1 | * {
2 | box-sizing: border-box;
3 | font-family: 'Roboto', sans-serif;
4 | }
5 |
6 | h1,
7 | h2 {
8 | font-weight: 900;
9 | margin: 0;
10 | padding: 0;
11 | }
12 |
13 | p {
14 | font-weight: 300;
15 | color: #aeaeae;
16 | margin: 0;
17 | padding: 0;
18 | }
19 |
20 | body {
21 | position: relative;
22 | margin: 0;
23 | }
24 |
25 | #overlay {
26 | position: absolute;
27 | z-index: 999;
28 | bottom: 0;
29 | height: 150px;
30 | width: 100%;
31 | background-color: yellow;
32 | background: linear-gradient(to bottom, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 74%,rgba(255,255,255,1) 100%);
33 | }
34 |
35 | #container {
36 | padding: 30px;
37 | }
38 |
39 | #header {
40 | margin-bottom: 50px;
41 |
42 | h1 {
43 | margin-bottom: 10px;
44 | }
45 | }
46 |
47 | #schedule {
48 | .appointment {
49 | display: flex;
50 | align-items: flex-start;
51 | position: relative;
52 |
53 | &:last-child {
54 | .event {
55 | padding-bottom: 70px;
56 | }
57 | }
58 |
59 | .circle {
60 | position: absolute;
61 | background-color: white;
62 | border-radius: 100%;
63 | border: 2px solid red;
64 | left: calc(25% - 5px);
65 | top: -5px;
66 | width: 12px;
67 | height: 12px;
68 | }
69 |
70 | .time {
71 | width: 25%;
72 | margin-top: -8px;
73 | text-align: right;
74 | padding-right: 20px;
75 | }
76 |
77 | .event {
78 | padding: 30px 0 30px 25px;
79 | border-left: 2px solid red;
80 | width: 70%;
81 | }
82 | }
83 | }
--------------------------------------------------------------------------------
/03/README.md:
--------------------------------------------------------------------------------
1 | # Exercicio 03
2 |
3 | > https://codepen.io/brizental/pen/PeXxbE
4 |
5 | O objetivo desse exercicio era criar barras de progresso que seriam prenchidas de acordo com o atributo `data-percentage` de cada elemento na pagina com a classe `progress`.
--------------------------------------------------------------------------------
/03/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Progresso
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/03/main.css:
--------------------------------------------------------------------------------
1 | *{font-family:'Fira Mono', sans-serif;box-sizing:border-box;padding:0;margin:0}body{display:flex;align-items:center;height:100vh;width:100vw}h1{font-size:30px;margin-bottom:10px}#container{width:50vw;margin:0 auto}.progress{width:50vw;margin-bottom:50px}.progress div{height:5px;width:0;transition:width 2s ease-in}
2 | /*# sourceMappingURL=main.css.map */
3 |
--------------------------------------------------------------------------------
/03/main.css.map:
--------------------------------------------------------------------------------
1 | {
2 | "version": 3,
3 | "mappings": "AAAA,CAAE,CACA,WAAW,CAAE,uBAAuB,CACpC,UAAU,CAAE,UAAU,CACtB,OAAO,CAAE,CAAC,CACV,MAAM,CAAE,CAAC,CAGX,IAAK,CACH,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,MAAM,CACnB,MAAM,CAAE,KAAK,CACb,KAAK,CAAE,KAAK,CAGd,EAAG,CACD,SAAS,CAAE,IAAI,CACf,aAAa,CAAE,IAAI,CAGrB,UAAW,CACT,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,MAAM,CAGhB,SAAU,CACR,KAAK,CAAE,IAAI,CACX,aAAa,CAAE,IAAI,CAEnB,aAAI,CACF,MAAM,CAAE,GAAG,CACX,KAAK,CAAE,CAAC,CACR,UAAU,CAAE,gBAAgB",
4 | "sources": ["main.scss"],
5 | "names": [],
6 | "file": "main.css"
7 | }
--------------------------------------------------------------------------------
/03/main.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Temos tres funcoes que encontram uma cor randomica no CSS,
3 | * as tres funcoes sao validas e fazem, mais ou menos,
4 | * a mesma coisa de formas diferentes.
5 | */
6 |
7 | function getRandomColor() {
8 | // Primeiro criamos uma array com todas as cores que tem
9 | // uma string reservada no CSS.
10 | var colors = ["AliceBlue", "AntiqueWhite", "Aqua", "Aquamarine", "Azure", "Beige", "Bisque", "Black", "BlanchedAlmond", "Blue", "BlueViolet", "Brown", "BurlyWood", "CadetBlue", "Chartreuse", "Chocolate", "Coral", "CornflowerBlue", "Cornsilk", "Crimson", "Cyan", "DarkBlue", "DarkCyan", "DarkGoldenRod", "DarkGray", "DarkGrey", "DarkGreen", "DarkKhaki", "DarkMagenta", "DarkOliveGreen", "Darkorange", "DarkOrchid", "DarkRed", "DarkSalmon", "DarkSeaGreen", "DarkSlateBlue", "DarkSlateGray", "DarkSlateGrey", "DarkTurquoise", "DarkViolet", "DeepPink", "DeepSkyBlue", "DimGray", "DimGrey", "DodgerBlue", "FireBrick", "FloralWhite", "ForestGreen", "Fuchsia", "Gainsboro", "GhostWhite", "Gold", "GoldenRod", "Gray", "Grey", "Green", "GreenYellow", "HoneyDew", "HotPink", "IndianRed", "Indigo", "Ivory", "Khaki", "Lavender", "LavenderBlush", "LawnGreen", "LemonChiffon", "LightBlue", "LightCoral", "LightCyan", "LightGoldenRodYellow", "LightGray", "LightGrey", "LightGreen", "LightPink", "LightSalmon", "LightSeaGreen", "LightSkyBlue", "LightSlateGray", "LightSlateGrey", "LightSteelBlue", "LightYellow", "Lime", "LimeGreen", "Linen", "Magenta", "Maroon", "MediumAquaMarine", "MediumBlue", "MediumOrchid", "MediumPurple", "MediumSeaGreen", "MediumSlateBlue", "MediumSpringGreen", "MediumTurquoise", "MediumVioletRed", "MidnightBlue", "MintCream", "MistyRose", "Moccasin", "NavajoWhite", "Navy", "OldLace", "Olive", "OliveDrab", "Orange", "OrangeRed", "Orchid", "PaleGoldenRod", "PaleGreen", "PaleTurquoise", "PaleVioletRed", "PapayaWhip", "PeachPuff", "Peru", "Pink", "Plum", "PowderBlue", "Purple", "Red", "RosyBrown", "RoyalBlue", "SaddleBrown", "Salmon", "SandyBrown", "SeaGreen", "SeaShell", "Sienna", "Silver", "SkyBlue", "SlateBlue", "SlateGray", "SlateGrey", "Snow", "SpringGreen", "SteelBlue", "Tan", "Teal", "Thistle", "Tomato", "Turquoise", "Violet", "Wheat", "White", "WhiteSmoke", "Yellow", "YellowGreen"];
11 | // Depois criamos uma index aleatorio que pode ir de 0 até
12 | // o maior index existente na array "colors"
13 | var index = Math.floor(Math.random() * colors.length)
14 | // Finalmente retornamos o item da array colors que esta nesse index aleatorio.
15 | return colors[index]
16 | }
17 |
18 | function getRandomColorMilena() {
19 | // Primeiro criamos uma string com todos os carateres possiveis em
20 | // uma string de hex color.
21 | // https://developer.mozilla.org/pt-PT/docs/Web/CSS/color
22 | var letras = '0123456789ABCDEF'
23 | // Agora criamos uma string somente com o caractere '#'.
24 | var cor = "#"
25 | // Sabemos que uma cor em hexadecimal tem o # e mais 6 caracteres,
26 | // portanto criamos um loop que roda 6 vezes para podermos adicionar
27 | // esses seis caracteres que faltam a nossa string de cor.
28 | for (var j = 0; j < 6; j++) {
29 | // Pegamos um caractere aleatorio da string "letras" a cada iteracao
30 | // desse loop e adicionamos a string "cor".
31 | cor = cor + letras[Math.floor(Math.random() * letras.length)]
32 | }
33 | // Finalmente, retornamos a string "cor" que e um valor de cor hexadecimal.
34 | return cor
35 | }
36 |
37 | function getRandomColorBruna() {
38 | // Simplesmente, criamos um valor randomico entre 0 e 16777215 e
39 | // utilizando o metodo "toString" do numero em javascript, ele
40 | // transforma esse numero em um string hexadecimal.
41 | // https://en.wikipedia.org/wiki/Hexadecimal
42 | // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString
43 | return '#' + Math.floor(Math.random() * 16777215).toString(16);
44 | }
45 |
46 | /**
47 | * Aqui, criamos uma funcao que recebe como argumento um numero de
48 | * 0 a 100 que representa uma porcentagem e tambem um elemento de
49 | * HTML, que servira como container, para criar uma barra de progresso.
50 | */
51 |
52 | function createProgressBar(percentage, containerDiv) {
53 | // Cria um elemento de HTML h1.
54 | const percentageH1 = document.createElement("h1")
55 | // Adiciona o valor de porcentagem passado como argumento mais
56 | // o simbolo de porcentagem como texto ao h1 recem criado.
57 | percentageH1.textContent = percentage + "%"
58 | // Coloca o h1 recem criado dentro do containerDiv passado como argumento.
59 | containerDiv.appendChild(percentageH1)
60 |
61 | // Cria um elemento div que sera a nossa barra de progresso.
62 | const progressBar = document.createElement("div")
63 | // Pinta essa barra de progresso com uma cor randomica do CSS.
64 | progressBar.style.backgroundColor = getRandomColor()
65 | // O codigo que esta dentro do setTimeout so roda depois de 100ms.
66 | // Nesse caso o 100ms vem do segundo argumento passado a funcao.
67 | setTimeout(() => {
68 |
69 | /**
70 | * Queremos que esse codigo rode apos 100ms, porque se ele rodar
71 | * assim que o codigo for executado, iniciaremos o width da nossa barra
72 | * direto com o valor desejado e isso nao permitira ao CSS fazer a
73 | * transicao/animacao da barra "crescendo" quando carregamos a pagina.
74 | * Fazendo com que esse codigo rode apenas um pouco depois do carregamento
75 | * da pagina, permitimos que a barra comece com 0px de width e depois
76 | * receba a width correta a partir da porcentagem, o que faz com que a
77 | * transicao do CSS aconteca.
78 | */
79 |
80 | // Seta a width dessa bara de acordo com o valor de porcentagem passado.
81 | progressBar.style.width = percentage + "%"
82 | }, 100)
83 | // Coloca essa barra de progresso dentro do containerDiv.
84 | containerDiv.appendChild(progressBar)
85 | }
86 |
87 | /**
88 | * Agora que ja criamos todas as funcoes necessarias,
89 | * podemos interagir com o nosso HTML...
90 | */
91 |
92 | // Primeiro selecionamos todos os elementos da pagina com a classe "progress"
93 | const progress = document.querySelectorAll(".progress")
94 | // Agora loopamos a array de elementos recem-criada...
95 | for (const div of progress) {
96 | // Pegar o valor que esta no atributo "data-percentage" desse elemento...
97 | const percentage = div.dataset.percentage
98 | // Usando a funcao createProgressBar, geramos o HTML necessario
99 | // para as barras de progresso.
100 | createProgressBar(percentage, div)
101 | }
--------------------------------------------------------------------------------
/03/main.scss:
--------------------------------------------------------------------------------
1 | * {
2 | font-family: 'Fira Mono', sans-serif;
3 | box-sizing: border-box;
4 | padding: 0;
5 | margin: 0;
6 | }
7 |
8 | body {
9 | display: flex;
10 | align-items: center;
11 | height: 100vh;
12 | width: 100vw;
13 | }
14 |
15 | h1 {
16 | font-size: 30px;
17 | margin-bottom: 10px;
18 | }
19 |
20 | #container {
21 | width: 50vw;
22 | margin: 0 auto;
23 | }
24 |
25 | .progress {
26 | width: 50vw;
27 | margin-bottom: 50px;
28 |
29 | div {
30 | height: 5px;
31 | width: 0;
32 | transition: width 2s ease-in;
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/04/README.md:
--------------------------------------------------------------------------------
1 | # Exercicio 04
2 |
3 | > https://codepen.io/brizental/pen/WJLYxK
4 |
5 | O objetivo desse exercicio era criar um slider que muda o volume da musica sendo tocada pelo nosso HTML.
6 |
7 | O Chrome mudou a sua politica de audios em abril/2018 e nao permite mais o atributo "autoplay" que e necessario para que esse exercicio funcione como esperado. Portanto, ele precisa ser aberto no Firefox.
--------------------------------------------------------------------------------
/04/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Spotify
6 |
7 |
8 |
9 |