├── Day 1 - Drum Kit ├── index.html ├── sounds │ ├── boom.wav │ ├── clap.wav │ ├── hihat.wav │ ├── kick.wav │ ├── openhat.wav │ ├── ride.wav │ ├── snare.wav │ ├── tink.wav │ └── tom.wav └── style.css ├── Day 10 - Checkboxes └── index.html ├── Day 11 - Video Player ├── index.html ├── scripts.js └── style.css ├── Day 12 - Key Sequence Detection └── index.html ├── Day 13 - Slide in on Scroll └── index.html ├── Day 14 - References vs Copying └── index.html ├── Day 15 - LocalStorage ├── index.html └── style.css ├── Day 16 - Mouse Move Shadow └── index.html ├── Day 17 - Sort └── index.html ├── Day 18 - Times with Reduce └── index.html ├── Day 19 - Webcam ├── index.html ├── package.json ├── scripts.js └── style.css ├── Day 2 - Clock └── index.html ├── Day 20 - Speech Detection ├── index.html └── package.json ├── Day 21 - Geolocation ├── index.html └── package.json ├── Day 22 - Link Highlighter ├── index.html └── style.css ├── Day 23 - Speech Synthesis ├── index.html └── style.css ├── Day 24 - Sticky Nav ├── index.html └── style.css ├── Day 25 - Event Capture, Propagation, Bubbling and Once └── index.html ├── Day 26 - Stripe Nav └── index.html ├── Day 27 - Click and Drag ├── index.html └── style.css ├── Day 28 - Video Speed Controller ├── index.html └── style.css ├── Day 29 - Countdown Timer ├── index.html ├── scripts.js └── style.css ├── Day 3 - Variables └── index.html ├── Day 30 - Whack A Mole ├── dirt.svg ├── index.html ├── mole.svg └── style.css ├── Day 4 - Array Cardio └── index.html ├── Day 5 - Flex Panel Gallery └── index.html ├── Day 6 - Type Ahead ├── index.html └── style.css ├── Day 7 - Array Cardio Pt.2 └── index.html ├── Day 8 - HTML5 Canvas └── index.html ├── Day 9 - Dev Tools └── index.html └── README.md /Day 1 - Drum Kit/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | JS Drum Kit 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | A 14 | clap 15 |
16 |
17 | S 18 | hihat 19 |
20 |
21 | D 22 | kick 23 |
24 |
25 | F 26 | openhat 27 |
28 |
29 | G 30 | boom 31 |
32 |
33 | H 34 | ride 35 |
36 |
37 | J 38 | snare 39 |
40 |
41 | K 42 | tom 43 |
44 |
45 | L 46 | tink 47 |
48 |
49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 83 | 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /Day 1 - Drum Kit/sounds/boom.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SanKlein/JavaScript-30/1aaa69803190e91354533b532887459594036662/Day 1 - Drum Kit/sounds/boom.wav -------------------------------------------------------------------------------- /Day 1 - Drum Kit/sounds/clap.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SanKlein/JavaScript-30/1aaa69803190e91354533b532887459594036662/Day 1 - Drum Kit/sounds/clap.wav -------------------------------------------------------------------------------- /Day 1 - Drum Kit/sounds/hihat.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SanKlein/JavaScript-30/1aaa69803190e91354533b532887459594036662/Day 1 - Drum Kit/sounds/hihat.wav -------------------------------------------------------------------------------- /Day 1 - Drum Kit/sounds/kick.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SanKlein/JavaScript-30/1aaa69803190e91354533b532887459594036662/Day 1 - Drum Kit/sounds/kick.wav -------------------------------------------------------------------------------- /Day 1 - Drum Kit/sounds/openhat.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SanKlein/JavaScript-30/1aaa69803190e91354533b532887459594036662/Day 1 - Drum Kit/sounds/openhat.wav -------------------------------------------------------------------------------- /Day 1 - Drum Kit/sounds/ride.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SanKlein/JavaScript-30/1aaa69803190e91354533b532887459594036662/Day 1 - Drum Kit/sounds/ride.wav -------------------------------------------------------------------------------- /Day 1 - Drum Kit/sounds/snare.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SanKlein/JavaScript-30/1aaa69803190e91354533b532887459594036662/Day 1 - Drum Kit/sounds/snare.wav -------------------------------------------------------------------------------- /Day 1 - Drum Kit/sounds/tink.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SanKlein/JavaScript-30/1aaa69803190e91354533b532887459594036662/Day 1 - Drum Kit/sounds/tink.wav -------------------------------------------------------------------------------- /Day 1 - Drum Kit/sounds/tom.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SanKlein/JavaScript-30/1aaa69803190e91354533b532887459594036662/Day 1 - Drum Kit/sounds/tom.wav -------------------------------------------------------------------------------- /Day 1 - Drum Kit/style.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-size: 10px; 3 | background: url(http://i.imgur.com/b9r5sEL.jpg) bottom center; 4 | background-size: cover; 5 | } 6 | body,html { 7 | margin: 0; 8 | padding: 0; 9 | font-family: sans-serif; 10 | } 11 | 12 | .keys { 13 | display: flex; 14 | flex: 1; 15 | min-height: 100vh; 16 | align-items: center; 17 | justify-content: center; 18 | } 19 | 20 | .key { 21 | border: .4rem solid black; 22 | border-radius: .5rem; 23 | margin: 1rem; 24 | font-size: 1.5rem; 25 | padding: 1rem .5rem; 26 | transition: all .07s ease; 27 | width: 10rem; 28 | text-align: center; 29 | color: white; 30 | background: rgba(0,0,0,0.4); 31 | text-shadow: 0 0 .5rem black; 32 | } 33 | 34 | .playing { 35 | transform: scale(1.1); 36 | border-color: #ffc600; 37 | box-shadow: 0 0 1rem #ffc600; 38 | } 39 | 40 | kbd { 41 | display: block; 42 | font-size: 4rem; 43 | } 44 | 45 | .sound { 46 | font-size: 1.2rem; 47 | text-transform: uppercase; 48 | letter-spacing: .1rem; 49 | color: #ffc600; 50 | } 51 | -------------------------------------------------------------------------------- /Day 10 - Checkboxes/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Hold Shift to Check Multiple Checkboxes 6 | 7 | 8 | 61 | 67 |
68 |
69 | 70 |

This is an inbox layout.

71 |
72 |
73 | 74 |

Check one item

75 |
76 |
77 | 78 |

Hold down your Shift key

79 |
80 |
81 | 82 |

Check a lower item

83 |
84 |
85 | 86 |

Everything inbetween should also be set to checked

87 |
88 |
89 | 90 |

Try do it with out any libraries

91 |
92 |
93 | 94 |

Just regular JavaScript

95 |
96 |
97 | 98 |

Good Luck!

99 |
100 |
101 | 102 |

Don't forget to tweet your result!

103 |
104 |
105 | 106 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /Day 11 - Video Player/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HTML Video Player 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 |
14 |
15 |
16 |
17 | 18 | 19 | 20 | 21 | 22 |
23 |
24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Day 11 - Video Player/scripts.js: -------------------------------------------------------------------------------- 1 | /* get out elements */ 2 | const player = document.querySelector('.player') 3 | const video = player.querySelector('.viewer') 4 | const progress = player.querySelector('.progress') 5 | const progressBar = player.querySelector('.progress__filled') 6 | const toggle = player.querySelector('.toggle') 7 | const skipButtons = player.querySelectorAll('[data-skip]') 8 | const ranges = player.querySelectorAll('.player__slider') 9 | 10 | /* build out functions */ 11 | function togglePlay() { 12 | video.paused ? video.play() : video.pause() 13 | //video[video.paused ? 'play' : 'pause']() 14 | } 15 | 16 | function updateButton() { 17 | toggle.textContent = this.paused ? '►' : '❙❙' 18 | } 19 | 20 | function skip() { 21 | video.currentTime += parseFloat(this.dataset.skip) 22 | } 23 | 24 | function handleRangeUpdate() { 25 | video[this.name] = this.value 26 | } 27 | 28 | function handleProgress() { 29 | const percent = (video.currentTime / video.duration) * 100 30 | progressBar.style.flexBasis = `${percent}%` 31 | } 32 | 33 | function scrub(e) { 34 | const scrubTime = (e.offsetX / progress.offsetWidth) * video.duration 35 | video.currentTime = scrubTime 36 | } 37 | 38 | /* hook up the event listeners */ 39 | video.addEventListener('click', togglePlay) 40 | video.addEventListener('play', updateButton) 41 | video.addEventListener('pause', updateButton) 42 | video.addEventListener('timeupdate', handleProgress) 43 | 44 | 45 | toggle.addEventListener('click', togglePlay) 46 | 47 | skipButtons.forEach(button => button.addEventListener('click', skip)) 48 | 49 | ranges.forEach(range => range.addEventListener('change', handleRangeUpdate)) 50 | ranges.forEach(range => range.addEventListener('mousemove', handleRangeUpdate)) 51 | 52 | let mousedown = false 53 | progress.addEventListener('click', scrub) 54 | progress.addEventListener('mousemove', (e) => mousedown && scrub(e)) 55 | progress.addEventListener('mousedown', mousedown = true) 56 | progress.addEventListener('mousemove', mousedown = false) 57 | -------------------------------------------------------------------------------- /Day 11 - Video Player/style.css: -------------------------------------------------------------------------------- 1 | html { 2 | box-sizing: border-box; 3 | } 4 | 5 | *, *:before, *:after { 6 | box-sizing: inherit; 7 | } 8 | 9 | body { 10 | padding: 0; 11 | display:flex; 12 | background:#7A419B; 13 | min-height:100vh; 14 | background: linear-gradient(135deg, #7c1599 0%,#921099 48%,#7e4ae8 100%); 15 | background-size:cover; 16 | align-items: center; 17 | justify-content: center; 18 | } 19 | 20 | .player { 21 | max-width:750px; 22 | border:5px solid rgba(0,0,0,0.2); 23 | box-shadow:0 0 20px rgba(0,0,0,0.2); 24 | position: relative; 25 | font-size: 0; 26 | overflow: hidden; 27 | } 28 | 29 | .player__video { 30 | width: 100%; 31 | } 32 | 33 | .player__button { 34 | background:none; 35 | border:0; 36 | line-height:1; 37 | color:white; 38 | text-align: center; 39 | outline:0; 40 | padding: 0; 41 | cursor:pointer; 42 | max-width:50px; 43 | } 44 | 45 | .player__button:focus { 46 | border-color: #ffc600; 47 | } 48 | 49 | .player__slider { 50 | width:10px; 51 | height:30px; 52 | } 53 | 54 | .player__controls { 55 | display:flex; 56 | position: absolute; 57 | bottom:0; 58 | width: 100%; 59 | transform: translateY(100%) translateY(-5px); 60 | transition:all .3s; 61 | flex-wrap:wrap; 62 | background:rgba(0,0,0,0.1); 63 | } 64 | 65 | .player:hover .player__controls { 66 | transform: translateY(0); 67 | } 68 | 69 | .player:hover .progress { 70 | height:15px; 71 | } 72 | 73 | .player__controls > * { 74 | flex:1; 75 | } 76 | 77 | .progress { 78 | flex:10; 79 | position: relative; 80 | display:flex; 81 | flex-basis:100%; 82 | height:5px; 83 | transition:height 0.3s; 84 | background:rgba(0,0,0,0.5); 85 | cursor:ew-resize; 86 | } 87 | 88 | .progress__filled { 89 | width:50%; 90 | background:#ffc600; 91 | flex:0; 92 | flex-basis:50%; 93 | } 94 | 95 | /* unholy css to style input type="range" */ 96 | 97 | input[type=range] { 98 | -webkit-appearance: none; 99 | background:transparent; 100 | width: 100%; 101 | margin: 0 5px; 102 | } 103 | input[type=range]:focus { 104 | outline: none; 105 | } 106 | input[type=range]::-webkit-slider-runnable-track { 107 | width: 100%; 108 | height: 8.4px; 109 | cursor: pointer; 110 | box-shadow: 1px 1px 1px rgba(0, 0, 0, 0), 0 0 1px rgba(13, 13, 13, 0); 111 | background: rgba(255,255,255,0.8); 112 | border-radius: 1.3px; 113 | border: 0.2px solid rgba(1, 1, 1, 0); 114 | } 115 | input[type=range]::-webkit-slider-thumb { 116 | box-shadow: 0 0 0 rgba(0, 0, 0, 0), 0 0 0 rgba(13, 13, 13, 0); 117 | height: 15px; 118 | width: 15px; 119 | border-radius: 50px; 120 | background: #ffc600; 121 | cursor: pointer; 122 | -webkit-appearance: none; 123 | margin-top: -3.5px; 124 | box-shadow:0 0 2px rgba(0,0,0,0.2); 125 | } 126 | input[type=range]:focus::-wefbkit-slider-runnable-track { 127 | background: #bada55; 128 | } 129 | input[type=range]::-moz-range-track { 130 | width: 100%; 131 | height: 8.4px; 132 | cursor: pointer; 133 | box-shadow: 1px 1px 1px rgba(0, 0, 0, 0), 0 0 1px rgba(13, 13, 13, 0); 134 | background: #ffffff; 135 | border-radius: 1.3px; 136 | border: 0.2px solid rgba(1, 1, 1, 0); 137 | } 138 | input[type=range]::-moz-range-thumb { 139 | box-shadow: 0 0 0 rgba(0, 0, 0, 0), 0 0 0 rgba(13, 13, 13, 0); 140 | height: 15px; 141 | width: 15px; 142 | border-radius: 50px; 143 | background: #ffc600; 144 | cursor: pointer; 145 | } 146 | -------------------------------------------------------------------------------- /Day 12 - Key Sequence Detection/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Key Detection 6 | 7 | 8 | 9 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Day 13 - Slide in on Scroll/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Document 6 | 7 | 8 | 9 |
10 | 11 |

Slide in on Scroll

12 | 13 |

Consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariaturlores sunt esse magni, ut, dignissimos.

14 |

Lorem ipsum cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.

15 |

Adipisicing elit. Tempore tempora rerum..

16 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.

17 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.

18 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.

19 | 20 | 21 | 22 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptates, deserunt facilis et iste corrupti omnis tenetur est. Iste ut est dicta dolor itaque adipisci, dolorum minima, veritatis earum provident error molestias. Ratione magni illo sint vel velit ut excepturi consectetur suscipit, earum modi accusamus voluptatem nostrum, praesentium numquam, reiciendis voluptas sit id quisquam. Consequatur in quis reprehenderit modi perspiciatis necessitatibus saepe, quidem, suscipit iure natus dignissimos ipsam, eligendi deleniti accusantium, rerum quibusdam fugit perferendis et optio recusandae sed ratione. Culpa, dolorum reprehenderit harum ab voluptas fuga, nisi eligendi natus maiores illum quas quos et aperiam aut doloremque optio maxime fugiat doloribus. Eum dolorum expedita quam, nesciunt

23 | 24 | 25 | 26 |

at provident praesentium atque quas rerum optio dignissimos repudiandae ullam illum quibusdam. Vel ad error quibusdam, illo ex totam placeat. Quos excepturi fuga, molestiae ea quisquam minus, ratione dicta consectetur officia omnis, doloribus voluptatibus? Veniam ipsum veritatis architecto, provident quas consequatur doloremque quam quidem earum expedita, ad delectus voluptatum, omnis praesentium nostrum qui aspernatur ea eaque adipisci et cumque ab? Ea voluptatum dolore itaque odio. Eius minima distinctio harum, officia ab nihil exercitationem. Tempora rem nemo nam temporibus molestias facilis minus ipsam quam doloribus consequatur debitis nesciunt tempore officiis aperiam quisquam, molestiae voluptates cum, fuga culpa. Distinctio accusamus quibusdam, tempore perspiciatis dolorum optio facere consequatur quidem ullam beatae architecto, ipsam sequi officiis dignissimos amet impedit natus necessitatibus tenetur repellendus dolor rem! Dicta dolorem, iure, facilis illo ex nihil ipsa amet officia, optio temporibus eum autem odit repellendus nisi. Possimus modi, corrupti error debitis doloribus dicta libero earum, sequi porro ut excepturi nostrum ea voluptatem nihil culpa? Ullam expedita eligendi obcaecati reiciendis velit provident omnis quas qui in corrupti est dolore facere ad hic, animi soluta assumenda consequuntur reprehenderit! Voluptate dolor nihil veniam laborum voluptas nisi pariatur sed optio accusantium quam consectetur, corrupti, sequi et consequuntur, excepturi doloremque. Tempore quis velit corporis neque fugit non sequi eaque rem hic. Facere, inventore, aspernatur. Accusantium modi atque, asperiores qui nobis soluta cumque suscipit excepturi possimus doloremque odit saepe perferendis temporibus molestiae nostrum voluptatum quis id sint quidem nesciunt culpa. Rerum labore dolor beatae blanditiis praesentium explicabo velit optio esse aperiam similique, voluptatem cum, maiores ipsa tempore. Reiciendis sed culpa atque inventore, nam ullam enim expedita consectetur id velit iusto alias vitae explicabo nemo neque odio reprehenderit soluta sint eaque. Aperiam, qui ut tenetur, voluptate doloremque officiis dicta quaerat voluptatem rerum natus magni. Eum amet autem dolor ullam.

27 | 28 | 29 | 30 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio maiores adipisci quibusdam repudiandae dolor vero placeat esse sit! Quibusdam saepe aperiam explicabo placeat optio, consequuntur nihil voluptatibus expedita quia vero perferendis, deserunt et incidunt eveniet temporibus doloremque possimus facilis. Possimus labore, officia dolore! Eaque ratione saepe, alias harum laboriosam deserunt laudantium blanditiis eum explicabo placeat reiciendis labore iste sint. Consectetur expedita dignissimos, non quos distinctio, eos rerum facilis eligendi. Asperiores laudantium, rerum ratione consequatur, culpa consectetur possimus atque ab tempore illum non dolor nesciunt. Neque, rerum. A vel non incidunt, quod doloremque dignissimos necessitatibus aliquid laboriosam architecto at cupiditate commodi expedita in, quae blanditiis. Deserunt labore sequi, repellat laboriosam est, doloremque culpa reiciendis tempore excepturi. Enim nostrum fugit itaque vel corporis ullam sed tenetur ipsa qui rem quam error sint, libero. Laboriosam rem, ratione. Autem blanditiis

31 | 32 | 33 |

laborum neque repudiandae quam, cumque, voluptate veritatis itaque, placeat veniam ad nisi. Expedita, laborum reprehenderit ratione soluta velit natus, odit mollitia. Corporis rerum minima fugiat in nostrum. Assumenda natus cupiditate hic quidem ex, quas, amet ipsum esse dolore facilis beatae maxime qui inventore, iste? Maiores dignissimos dolore culpa debitis voluptatem harum, excepturi enim reiciendis, tempora ab ipsam illum aspernatur quasi qui porro saepe iure sunt eligendi tenetur quaerat ducimus quas sequi omnis aperiam suscipit! Molestiae obcaecati officiis quo, ratione eveniet, provident pariatur. Veniam quasi expedita distinctio, itaque molestiae sequi, dolorum nisi repellendus quia facilis iusto dignissimos nam? Tenetur fugit quos autem nihil, perspiciatis expedita enim tempore, alias ab maiores quis necessitatibus distinctio molestias eum, quidem. Delectus impedit quidem laborum, fugit vel neque quo, ipsam, quasi aspernatur quas odio nihil? Veniam amet reiciendis blanditiis quis reprehenderit repudiandae neque, ab ducimus, odit excepturi voluptate saepe ipsam. Voluptatem eum error voluptas porro officiis, amet! Molestias, fugit, ut! Tempore non magnam, amet, facere ducimus accusantium eos veritatis neque.

34 | 35 | 36 | 37 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio maiores adipisci quibusdam repudiandae dolor vero placeat esse sit! Quibusdam saepe aperiam explicabo placeat optio, consequuntur nihil voluptatibus expedita quia vero perferendis, deserunt et incidunt eveniet temporibus doloremque possimus facilis. Possimus labore, officia dolore! Eaque ratione saepe, alias harum laboriosam deserunt laudantium blanditiis eum explicabo placeat reiciendis labore iste sint. Consectetur expedita dignissimos, non quos distinctio, eos rerum facilis eligendi. Asperiores laudantium, rerum ratione consequatur, culpa consectetur possimus atque ab tempore illum non dolor nesciunt. Neque, rerum. A vel non incidunt, quod doloremque dignissimos necessitatibus aliquid laboriosam architecto at cupiditate commodi expedita in, quae blanditiis. Deserunt labore sequi, repellat laboriosam est, doloremque culpa reiciendis tempore excepturi. Enim nostrum fugit itaque vel corporis ullam sed tenetur ipsa qui rem quam error sint, libero. Laboriosam rem, ratione. Autem blanditiis laborum neque repudiandae quam, cumque, voluptate veritatis itaque, placeat veniam ad nisi. Expedita, laborum reprehenderit ratione soluta velit natus, odit mollitia. Corporis rerum minima fugiat in nostrum. Assumenda natus cupiditate hic quidem ex, quas, amet ipsum esse dolore facilis beatae maxime qui inventore, iste? Maiores dignissimos dolore culpa debitis voluptatem harum, excepturi enim reiciendis, tempora ab ipsam illum aspernatur quasi qui porro saepe iure sunt eligendi tenetur quaerat ducimus quas sequi omnis aperiam suscipit! Molestiae obcaecati officiis quo, ratione eveniet, provident pariatur. Veniam quasi expedita distinctio, itaque molestiae sequi, dolorum nisi repellendus quia facilis iusto dignissimos nam? Tenetur fugit quos autem nihil, perspiciatis expedita enim tempore, alias ab maiores quis necessitatibus distinctio molestias eum, quidem. Delectus impedit quidem laborum, fugit vel neque quo, ipsam, quasi aspernatur quas odio nihil? Veniam amet reiciendis blanditiis quis reprehenderit repudiandae neque, ab ducimus, odit excepturi voluptate saepe ipsam. Voluptatem eum error voluptas porro officiis, amet! Molestias, fugit, ut! Tempore non magnam, amet, facere ducimus accusantium eos veritatis neque.

38 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio maiores adipisci quibusdam repudiandae dolor vero placeat esse sit! Quibusdam saepe aperiam explicabo placeat optio, consequuntur nihil voluptatibus expedita quia vero perferendis, deserunt et incidunt eveniet temporibus doloremque possimus facilis. Possimus labore, officia dolore! Eaque ratione saepe, alias harum laboriosam deserunt laudantium blanditiis eum explicabo placeat reiciendis labore iste sint. Consectetur expedita dignissimos, non quos distinctio, eos rerum facilis eligendi. Asperiores laudantium, rerum ratione consequatur, culpa consectetur possimus atque ab tempore illum non dolor nesciunt. Neque, rerum. A vel non incidunt, quod doloremque dignissimos necessitatibus aliquid laboriosam architecto at cupiditate commodi expedita in, quae blanditiis. Deserunt labore sequi, repellat laboriosam est, doloremque culpa reiciendis tempore excepturi. Enim nostrum fugit itaque vel corporis ullam sed tenetur ipsa qui rem quam error sint, libero. Laboriosam rem, ratione. Autem blanditiis laborum neque repudiandae quam, cumque, voluptate veritatis itaque, placeat veniam ad nisi. Expedita, laborum reprehenderit ratione soluta velit natus, odit mollitia. Corporis rerum minima fugiat in nostrum. Assumenda natus cupiditate hic quidem ex, quas, amet ipsum esse dolore facilis beatae maxime qui inventore, iste? Maiores dignissimos dolore culpa debitis voluptatem harum, excepturi enim reiciendis, tempora ab ipsam illum aspernatur quasi qui porro saepe iure sunt eligendi tenetur quaerat ducimus quas sequi omnis aperiam suscipit! Molestiae obcaecati officiis quo, ratione eveniet, provident pariatur. Veniam quasi expedita distinctio, itaque molestiae sequi, dolorum nisi repellendus quia facilis iusto dignissimos nam? Tenetur fugit quos autem nihil, perspiciatis expedita enim tempore, alias ab maiores quis necessitatibus distinctio molestias eum, quidem. Delectus impedit quidem laborum, fugit vel neque quo, ipsam, quasi aspernatur quas odio nihil? Veniam amet reiciendis blanditiis quis reprehenderit repudiandae neque, ab ducimus, odit excepturi voluptate saepe ipsam. Voluptatem eum error voluptas porro officiis, amet! Molestias, fugit, ut! Tempore non magnam, amet, facere ducimus accusantium eos veritatis neque.

39 | 40 | 41 | 42 | 43 |
44 | 45 | 84 | 85 | 140 | 141 | 142 | 143 | -------------------------------------------------------------------------------- /Day 14 - References vs Copying/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | JS Reference VS Copy 6 | 7 | 8 | 9 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /Day 15 - LocalStorage/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | LocalStorage 6 | 7 | 8 | 9 | 13 | 14 | 15 | 16 |
17 |

LOCAL TAPAS

18 |

19 | 22 |
23 | 24 | 25 |
26 |
27 | 28 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /Day 15 - LocalStorage/style.css: -------------------------------------------------------------------------------- 1 | 2 | html { 3 | box-sizing: border-box; 4 | background:url('http://wes.io/hx9M/oh-la-la.jpg') center no-repeat; 5 | background-size:cover; 6 | min-height:100vh; 7 | display:flex; 8 | justify-content: center; 9 | align-items: center; 10 | text-align: center; 11 | font-family: Futura,"Trebuchet MS",Arial,sans-serif 12 | } 13 | *, *:before, *:after {box-sizing: inherit; } 14 | 15 | svg { 16 | fill:white; 17 | background: rgba(0,0,0,0.1); 18 | padding: 20px; 19 | border-radius: 50%; 20 | width:200px; 21 | margin-bottom: 50px; 22 | } 23 | 24 | .wrapper { 25 | padding: 20px; 26 | max-width: 350px; 27 | background: rgba(255,255,255,0.95); 28 | box-shadow: 0 0 0 10px rgba(0,0,0,0.1); 29 | } 30 | 31 | h2 { 32 | text-align: center; 33 | margin: 0; 34 | font-weight: 200; 35 | } 36 | 37 | .plates { 38 | margin: 0; 39 | padding: 0; 40 | text-align: left; 41 | list-style: none; 42 | } 43 | 44 | .plates li { 45 | border-bottom: 1px solid rgba(0,0,0,0.2); 46 | padding: 10px 0; 47 | font-weight: 100; 48 | display: flex; 49 | } 50 | 51 | .plates label { 52 | flex:1; 53 | cursor: pointer; 54 | 55 | } 56 | 57 | .plates input { 58 | display: none; 59 | } 60 | 61 | .plates input + label:before { 62 | content: '⬜️'; 63 | margin-right: 10px; 64 | } 65 | 66 | .plates input:checked + label:before { 67 | content: '🌮'; 68 | } 69 | 70 | .add-items { 71 | margin-top: 20px; 72 | } 73 | 74 | .add-items input { 75 | padding:10px; 76 | outline:0; 77 | border:1px solid rgba(0,0,0,0.1); 78 | } 79 | -------------------------------------------------------------------------------- /Day 16 - Mouse Move Shadow/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Mouse Shadow 6 | 7 | 8 | 9 |
10 |

🔥WOAH!

11 |
12 | 13 | 32 | 33 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /Day 17 - Sort/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Sort Without Articles 6 | 7 | 8 | 9 | 42 | 43 | 44 | 45 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /Day 18 - Times with Reduce/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Videos 6 | 7 | 8 | 184 | 207 | 208 | 209 | -------------------------------------------------------------------------------- /Day 19 - Webcam/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Get User Media Code Along! 6 | 7 | 8 | 9 | 10 |
11 |
12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 | 32 |
33 |
34 | 35 | 36 | 37 |
38 |
39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /Day 19 - Webcam/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gum", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "scripts.js", 6 | "scripts": { 7 | "start" : "browser-sync start --server --files '*.css, *.html, *.js'" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "browser-sync": "^2.12.5" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Day 19 - Webcam/scripts.js: -------------------------------------------------------------------------------- 1 | const video = document.querySelector('.player'); 2 | const canvas = document.querySelector('.photo'); 3 | const ctx = canvas.getContext('2d'); 4 | const strip = document.querySelector('.strip'); 5 | const snap = document.querySelector('.snap'); 6 | 7 | function getVideo() { 8 | console.log(navigator.mediaDevices) 9 | navigator.mediaDevices.getUserMedia({video: true, audio: false}) 10 | .then(localMediaStream => { 11 | console.log(localMediaStream) 12 | video.src = window.URL.createObjectURL(localMediaStream) 13 | video.play() 14 | }) 15 | .catch(err => { 16 | console.error('OH NO!!!', err) 17 | }) 18 | } 19 | 20 | function paintToCanavas() { 21 | canvas.width = video.videoWidth 22 | canvas.height = video.videoHeight 23 | 24 | return setInterval(() => { 25 | ctx.drawImage(video, 0, 0, width, height) 26 | let pixels = ctx.getImageData(0, 0, width, height) 27 | //pixels = redEffect(pixels) 28 | pixels = rgbSplit(pixels) 29 | ctx.globalAlpha = 0.1 30 | ctx.putImageData(pixels, 0, 0) 31 | }, 16) 32 | } 33 | 34 | function takePhoto() { 35 | snap.currentTime = 0 36 | snap.play() 37 | 38 | const data = canvas.toDataURL('image/jpeg') 39 | const link = document.createElement('a') 40 | link.href = data 41 | link.setAttribute('download', 'handsome') 42 | link.innerHTML = `Handsome Man` 43 | strip.insertBefore(link, strip.firstChild) 44 | } 45 | 46 | function redEffect(pixels) { 47 | for (let i = 0; i < pixels.data.length; i += 4) { 48 | pixels.data[i + 0] = pixel.data[i + 0] + 100 // red 49 | pixels.data[i + 1] = pixel.data[i + 1] - 50 // green 50 | pixels.data[i + 2] = pixel.data[i + 2] * 0.5 // blue 51 | } 52 | return pixels 53 | } 54 | 55 | function rgbSplit(pixels) { 56 | for (let i = 0; i < pixels.data.length; i += 4) { 57 | pixels.data[i - 550] = pixel.data[i + 0] // red 58 | pixels.data[i + 100] = pixel.data[i + 1] // green 59 | pixels.data[i - 550] = pixel.data[i + 2] // blue 60 | } 61 | return pixels 62 | } 63 | 64 | function greenScreen(pixels) { 65 | const levels = {} 66 | 67 | [...document.querySelectorAll('.rgb input').forEach(input => { 68 | levels[input.name] = input.value 69 | })] 70 | for (let i = 0; i < pixels.data.length; i += 4) { 71 | red = pixels.data[i + 0] 72 | green = pixels.data[i + 1] 73 | blue = pixels.data[i + 2] 74 | alpha = pixels.data[i + 3] 75 | 76 | if (red >= levels.rmin && green >= levels.gmin && blue >= levels.bmin && red <= levels.rmax && green <= levels.gmax && blue <= levels.bmax) { 77 | pixels.data[i + 3] = 0 78 | } 79 | } 80 | return pixels 81 | } 82 | 83 | getVideo() 84 | 85 | video.addEventListener('canplay', paintToCanavas) 86 | -------------------------------------------------------------------------------- /Day 19 - Webcam/style.css: -------------------------------------------------------------------------------- 1 | html { 2 | box-sizing: border-box; 3 | } 4 | 5 | *, *:before, *:after { 6 | box-sizing: inherit; 7 | } 8 | 9 | html { 10 | font-size: 10px; 11 | background:#ffc600; 12 | } 13 | 14 | .photobooth { 15 | background:white; 16 | max-width:150rem; 17 | margin: 2rem auto; 18 | border-radius:2px; 19 | } 20 | 21 | /*clearfix*/ 22 | .photobooth:after { 23 | content: ''; 24 | display: block; 25 | clear: both; 26 | } 27 | 28 | .photo { 29 | width:100%; 30 | float:left; 31 | } 32 | 33 | .player { 34 | position: absolute; 35 | top:20px; 36 | right: 20px; 37 | width:200px; 38 | } 39 | 40 | /* 41 | Strip! 42 | */ 43 | 44 | .strip { 45 | padding:2rem; 46 | } 47 | .strip img { 48 | width:100px; 49 | overflow-x: scroll; 50 | padding:0.8rem 0.8rem 2.5rem 0.8rem; 51 | box-shadow:0 0 3px rgba(0,0,0,0.2); 52 | background:white; 53 | } 54 | 55 | .strip a:nth-child(5n+1) img { rotate: 10deg; } 56 | .strip a:nth-child(5n+2) img { rotate: -2deg; } 57 | .strip a:nth-child(5n+3) img { rotate: 8deg; } 58 | .strip a:nth-child(5n+4) img { rotate: -11deg; } 59 | .strip a:nth-child(5n+5) img { rotate: 12deg; } 60 | -------------------------------------------------------------------------------- /Day 2 - Clock/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | JS + CSS Clock 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | 18 | 19 | 71 | 72 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /Day 20 - Speech Detection/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Speech Detection 6 | 7 | 8 | 9 |
10 |
11 | 12 | 42 | 43 | 44 | 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /Day 20 - Speech Detection/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gum", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "scripts.js", 6 | "scripts": { 7 | "start" : "browser-sync start --directory --server --files '*.css, *.html, *.js'" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "browser-sync": "^2.12.5" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Day 21 - Geolocation/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Document 6 | 7 | 8 | 9 | 10 | 11 | 12 |

13 | 0 14 | KM/H 15 |

16 | 17 | 59 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /Day 21 - Geolocation/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gum", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "scripts.js", 6 | "scripts": { 7 | "start" : "browser-sync start --directory --server --files '*.css, *.html, *.js' --https" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "browser-sync": "^2.12.5" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Day 22 - Link Highlighter/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 👀👀👀Follow Along Nav 6 | 7 | 8 | 9 | 10 | 19 | 20 |
21 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Est explicabo unde natus necessitatibus esse obcaecati distinctio, aut itaque, qui vitae!

22 |

Aspernatur sapiente quae sint soluta modi, atque praesentium laborum pariatur earum quaerat cupiditate consequuntur facilis ullam dignissimos, aperiam quam veniam.

23 |

Cum ipsam quod, incidunt sit ex tempore placeat maxime corrupti possimus veritatis ipsum fugit recusandae est doloremque? Hic, quibusdam, nulla.

24 |

Esse quibusdam, ad, ducimus cupiditate nulla, quae magni odit totam ut consequatur eveniet sunt quam provident sapiente dicta neque quod.

25 |

Aliquam dicta sequi culpa fugiat consequuntur pariatur optio ad minima, maxime odio, distinctio magni impedit tempore enim repellendus repudiandae quas!

26 |
27 | 28 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /Day 22 - Link Highlighter/style.css: -------------------------------------------------------------------------------- 1 | html { 2 | box-sizing: border-box; 3 | } 4 | *, *:before, *:after { 5 | box-sizing: inherit; 6 | } 7 | body { 8 | min-height: 100vh; 9 | margin: 0; /* Important! */ 10 | font-family: sans-serif; 11 | background: 12 | linear-gradient(45deg, hsla(340, 100%, 55%, 1) 0%, hsla(340, 100%, 55%, 0) 70%), 13 | linear-gradient(135deg, hsla(225, 95%, 50%, 1) 10%, hsla(225, 95%, 50%, 0) 80%), 14 | linear-gradient(225deg, hsla(140, 90%, 50%, 1) 10%, hsla(140, 90%, 50%, 0) 80%), 15 | linear-gradient(315deg, hsla(35, 95%, 55%, 1) 100%, hsla(35, 95%, 55%, 0) 70%); 16 | } 17 | 18 | .wrapper { 19 | margin:0 auto; 20 | max-width:500px; 21 | font-size: 20px; 22 | line-height: 2; 23 | position: relative; 24 | } 25 | 26 | a { 27 | text-decoration: none; 28 | color:black; 29 | background:rgba(0,0,0,0.05); 30 | border-radius: 20px 31 | } 32 | 33 | .highlight { 34 | transition: all 0.2s; 35 | border-bottom:2px solid white; 36 | position: absolute; 37 | top:0; 38 | background:white; 39 | left:0; 40 | z-index: -1; 41 | border-radius:20px; 42 | display: block; 43 | box-shadow: 0 0 10px rgba(0,0,0,0.2) 44 | } 45 | 46 | .menu { 47 | padding: 0; 48 | display: flex; 49 | list-style: none; 50 | justify-content: center; 51 | margin:100px 0; 52 | } 53 | 54 | .menu a { 55 | display: inline-block; 56 | padding:5px; 57 | margin:0 20px; 58 | color:black; 59 | } 60 | -------------------------------------------------------------------------------- /Day 23 - Speech Synthesis/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Speech Synthesis 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 |

The Voiceinator 5000

14 | 15 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /Day 23 - Speech Synthesis/style.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-size: 10px; 3 | box-sizing: border-box; 4 | } 5 | 6 | *, *:before, *:after { 7 | box-sizing: inherit; 8 | } 9 | 10 | body { 11 | padding: 0; 12 | font-family: sans-serif; 13 | background-color:#3BC1AC; 14 | display:flex; 15 | min-height: 100vh; 16 | align-items: center; 17 | 18 | background-image: 19 | radial-gradient(circle at 100% 150%, #3BC1AC 24%, #42D2BB 25%, #42D2BB 28%, #3BC1AC 29%, #3BC1AC 36%, #42D2BB 36%, #42D2BB 40%, transparent 40%, transparent), 20 | radial-gradient(circle at 0 150%, #3BC1AC 24%, #42D2BB 25%, #42D2BB 28%, #3BC1AC 29%, #3BC1AC 36%, #42D2BB 36%, #42D2BB 40%, transparent 40%, transparent), 21 | radial-gradient(circle at 50% 100%, #42D2BB 10%, #3BC1AC 11%, #3BC1AC 23%, #42D2BB 24%, #42D2BB 30%, #3BC1AC 31%, #3BC1AC 43%, #42D2BB 44%, #42D2BB 50%, #3BC1AC 51%, #3BC1AC 63%, #42D2BB 64%, #42D2BB 71%, transparent 71%, transparent), 22 | radial-gradient(circle at 100% 50%, #42D2BB 5%, #3BC1AC 6%, #3BC1AC 15%, #42D2BB 16%, #42D2BB 20%, #3BC1AC 21%, #3BC1AC 30%, #42D2BB 31%, #42D2BB 35%, #3BC1AC 36%, #3BC1AC 45%, #42D2BB 46%, #42D2BB 49%, transparent 50%, transparent), 23 | radial-gradient(circle at 0 50%, #42D2BB 5%, #3BC1AC 6%, #3BC1AC 15%, #42D2BB 16%, #42D2BB 20%, #3BC1AC 21%, #3BC1AC 30%, #42D2BB 31%, #42D2BB 35%, #3BC1AC 36%, #3BC1AC 45%, #42D2BB 46%, #42D2BB 49%, transparent 50%, transparent); 24 | background-size:100px 50px; 25 | } 26 | 27 | 28 | .voiceinator { 29 | padding:2rem; 30 | width:50rem; 31 | margin:0 auto; 32 | border-radius:1rem; 33 | position: relative; 34 | background:white; 35 | overflow: hidden; 36 | z-index: 1; 37 | box-shadow:0 0 5px 5px rgba(0,0,0,0.1); 38 | } 39 | 40 | h1 { 41 | width:calc(100% + 4rem); 42 | margin: 0; 43 | margin-left: -2rem; 44 | margin-top: -2rem; 45 | margin-bottom: 2rem; 46 | padding:.5rem; 47 | background: #ffc600; 48 | border-bottom: 5px solid #F3C010; 49 | text-align: center; 50 | font-size: 5rem; 51 | font-weight: 100; 52 | font-family: 'Pacifico', cursive; 53 | text-shadow:3px 3px 0 #F3C010; 54 | 55 | } 56 | 57 | .voiceinator input, 58 | .voiceinator button, 59 | .voiceinator select, 60 | .voiceinator textarea { 61 | width: 100%; 62 | display: block; 63 | margin:10px 0; 64 | padding:10px; 65 | border:0; 66 | font-size: 2rem; 67 | background:#F7F7F7; 68 | outline:0; 69 | } 70 | 71 | textarea { 72 | height: 20rem; 73 | } 74 | 75 | input[type="select"] { 76 | 77 | } 78 | 79 | .voiceinator button { 80 | background:#ffc600; 81 | border:0; 82 | width: 49%; 83 | float:left; 84 | font-family: 'Pacifico', cursive; 85 | margin-bottom: 0; 86 | font-size: 2rem; 87 | border-bottom: 5px solid #F3C010; 88 | cursor:pointer; 89 | position: relative; 90 | } 91 | 92 | .voiceinator button:active { 93 | top:2px; 94 | } 95 | 96 | .voiceinator button:nth-of-type(1) { 97 | margin-right: 2%; 98 | } 99 | -------------------------------------------------------------------------------- /Day 24 - Sticky Nav/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Sticky Nav 6 | 7 | 8 | 9 | 10 |
11 |

A story about getting lost.

12 |
13 | 14 | 24 | 25 |
26 | 27 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.

28 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.

29 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.

30 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.

31 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.

32 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.

33 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.

34 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.

35 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.

36 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.

37 | 38 | 39 | 40 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptates, deserunt facilis et iste corrupti omnis tenetur est. Iste ut est dicta dolor itaque adipisci, dolorum minima, veritatis earum provident error molestias. Ratione magni illo sint vel velit ut excepturi consectetur suscipit, earum modi accusamus voluptatem nostrum, praesentium numquam, reiciendis voluptas sit id quisquam. Consequatur in quis reprehenderit modi perspiciatis necessitatibus saepe, quidem, suscipit iure natus dignissimos ipsam, eligendi deleniti accusantium, rerum quibusdam fugit perferendis et optio recusandae sed ratione. Culpa, dolorum reprehenderit harum ab voluptas fuga, nisi eligendi natus maiores illum quas quos et aperiam aut doloremque optio maxime fugiat doloribus. Eum dolorum expedita quam, nesciunt

41 | 42 | 43 | 44 |

at provident praesentium atque quas rerum optio dignissimos repudiandae ullam illum quibusdam. Vel ad error quibusdam, illo ex totam placeat. Quos excepturi fuga, molestiae ea quisquam minus, ratione dicta consectetur officia omnis, doloribus voluptatibus? Veniam ipsum veritatis architecto, provident quas consequatur doloremque quam quidem earum expedita, ad delectus voluptatum, omnis praesentium nostrum qui aspernatur ea eaque adipisci et cumque ab? Ea voluptatum dolore itaque odio. Eius minima distinctio harum, officia ab nihil exercitationem. Tempora rem nemo nam temporibus molestias facilis minus ipsam quam doloribus consequatur debitis nesciunt tempore officiis aperiam quisquam, molestiae voluptates cum, fuga culpa. Distinctio accusamus quibusdam, tempore perspiciatis dolorum optio facere consequatur quidem ullam beatae architecto, ipsam sequi officiis dignissimos amet impedit natus necessitatibus tenetur repellendus dolor rem! Dicta dolorem, iure, facilis illo ex nihil ipsa amet officia, optio temporibus eum autem odit repellendus nisi. Possimus modi, corrupti error debitis doloribus dicta libero earum, sequi porro ut excepturi nostrum ea voluptatem nihil culpa? Ullam expedita eligendi obcaecati reiciendis velit provident omnis quas qui in corrupti est dolore facere ad hic, animi soluta assumenda consequuntur reprehenderit! Voluptate dolor nihil veniam laborum voluptas nisi pariatur sed optio accusantium quam consectetur, corrupti, sequi et consequuntur, excepturi doloremque. Tempore quis velit corporis neque fugit non sequi eaque rem hic. Facere, inventore, aspernatur. Accusantium modi atque, asperiores qui nobis soluta cumque suscipit excepturi possimus doloremque odit saepe perferendis temporibus molestiae nostrum voluptatum quis id sint quidem nesciunt culpa. Rerum labore dolor beatae blanditiis praesentium explicabo velit optio esse aperiam similique, voluptatem cum, maiores ipsa tempore. Reiciendis sed culpa atque inventore, nam ullam enim expedita consectetur id velit iusto alias vitae explicabo nemo neque odio reprehenderit soluta sint eaque. Aperiam, qui ut tenetur, voluptate doloremque officiis dicta quaerat voluptatem rerum natus magni. Eum amet autem dolor ullam.

45 | 46 | 47 | 48 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio maiores adipisci quibusdam repudiandae dolor vero placeat esse sit! Quibusdam saepe aperiam explicabo placeat optio, consequuntur nihil voluptatibus expedita quia vero perferendis, deserunt et incidunt eveniet temporibus doloremque possimus facilis. Possimus labore, officia dolore! Eaque ratione saepe, alias harum laboriosam deserunt laudantium blanditiis eum explicabo placeat reiciendis labore iste sint. Consectetur expedita dignissimos, non quos distinctio, eos rerum facilis eligendi. Asperiores laudantium, rerum ratione consequatur, culpa consectetur possimus atque ab tempore illum non dolor nesciunt. Neque, rerum. A vel non incidunt, quod doloremque dignissimos necessitatibus aliquid laboriosam architecto at cupiditate commodi expedita in, quae blanditiis. Deserunt labore sequi, repellat laboriosam est, doloremque culpa reiciendis tempore excepturi. Enim nostrum fugit itaque vel corporis ullam sed tenetur ipsa qui rem quam error sint, libero. Laboriosam rem, ratione. Autem blanditiis laborum neque repudiandae quam, cumque, voluptate veritatis itaque, placeat veniam ad nisi. Expedita, laborum reprehenderit ratione soluta velit natus, odit mollitia. Corporis rerum minima fugiat in nostrum. Assumenda natus cupiditate hic quidem ex, quas, amet ipsum esse dolore facilis beatae maxime qui inventore, iste? Maiores dignissimos dolore culpa debitis voluptatem harum, excepturi enim reiciendis, tempora ab ipsam illum aspernatur quasi qui porro saepe iure sunt eligendi tenetur quaerat ducimus quas sequi omnis aperiam suscipit! Molestiae obcaecati officiis quo, ratione eveniet, provident pariatur. Veniam quasi expedita distinctio, itaque molestiae sequi, dolorum nisi repellendus quia facilis iusto dignissimos nam? Tenetur fugit quos autem nihil, perspiciatis expedita enim tempore, alias ab maiores quis necessitatibus distinctio molestias eum, quidem. Delectus impedit quidem laborum, fugit vel neque quo, ipsam, quasi aspernatur quas odio nihil? Veniam amet reiciendis blanditiis quis reprehenderit repudiandae neque, ab ducimus, odit excepturi voluptate saepe ipsam. Voluptatem eum error voluptas porro officiis, amet! Molestias, fugit, ut! Tempore non magnam, amet, facere ducimus accusantium eos veritatis neque.

49 | 50 | 51 | 52 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio maiores adipisci quibusdam repudiandae dolor vero placeat esse sit! Quibusdam saepe aperiam explicabo placeat optio, consequuntur nihil voluptatibus expedita quia vero perferendis, deserunt et incidunt eveniet temporibus doloremque possimus facilis. Possimus labore, officia dolore! Eaque ratione saepe, alias harum laboriosam deserunt laudantium blanditiis eum explicabo placeat reiciendis labore iste sint. Consectetur expedita dignissimos, non quos distinctio, eos rerum facilis eligendi. Asperiores laudantium, rerum ratione consequatur, culpa consectetur possimus atque ab tempore illum non dolor nesciunt. Neque, rerum. A vel non incidunt, quod doloremque dignissimos necessitatibus aliquid laboriosam architecto at cupiditate commodi expedita in, quae blanditiis. Deserunt labore sequi, repellat laboriosam est, doloremque culpa reiciendis tempore excepturi. Enim nostrum fugit itaque vel corporis ullam sed tenetur ipsa qui rem quam error sint, libero. Laboriosam rem, ratione. Autem blanditiis laborum neque repudiandae quam, cumque, voluptate veritatis itaque, placeat veniam ad nisi. Expedita, laborum reprehenderit ratione soluta velit natus, odit mollitia. Corporis rerum minima fugiat in nostrum. Assumenda natus cupiditate hic quidem ex, quas, amet ipsum esse dolore facilis beatae maxime qui inventore, iste? Maiores dignissimos dolore culpa debitis voluptatem harum, excepturi enim reiciendis, tempora ab ipsam illum aspernatur quasi qui porro saepe iure sunt eligendi tenetur quaerat ducimus quas sequi omnis aperiam suscipit! Molestiae obcaecati officiis quo, ratione eveniet, provident pariatur. Veniam quasi expedita distinctio, itaque molestiae sequi, dolorum nisi repellendus quia facilis iusto dignissimos nam? Tenetur fugit quos autem nihil, perspiciatis expedita enim tempore, alias ab maiores quis necessitatibus distinctio molestias eum, quidem. Delectus impedit quidem laborum, fugit vel neque quo, ipsam, quasi aspernatur quas odio nihil? Veniam amet reiciendis blanditiis quis reprehenderit repudiandae neque, ab ducimus, odit excepturi voluptate saepe ipsam. Voluptatem eum error voluptas porro officiis, amet! Molestias, fugit, ut! Tempore non magnam, amet, facere ducimus accusantium eos veritatis neque.

53 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio maiores adipisci quibusdam repudiandae dolor vero placeat esse sit! Quibusdam saepe aperiam explicabo placeat optio, consequuntur nihil voluptatibus expedita quia vero perferendis, deserunt et incidunt eveniet temporibus doloremque possimus facilis. Possimus labore, officia dolore! Eaque ratione saepe, alias harum laboriosam deserunt laudantium blanditiis eum explicabo placeat reiciendis labore iste sint. Consectetur expedita dignissimos, non quos distinctio, eos rerum facilis eligendi. Asperiores laudantium, rerum ratione consequatur, culpa consectetur possimus atque ab tempore illum non dolor nesciunt. Neque, rerum. A vel non incidunt, quod doloremque dignissimos necessitatibus aliquid laboriosam architecto at cupiditate commodi expedita in, quae blanditiis. Deserunt labore sequi, repellat laboriosam est, doloremque culpa reiciendis tempore excepturi. Enim nostrum fugit itaque vel corporis ullam sed tenetur ipsa qui rem quam error sint, libero. Laboriosam rem, ratione. Autem blanditiis laborum neque repudiandae quam, cumque, voluptate veritatis itaque, placeat veniam ad nisi. Expedita, laborum reprehenderit ratione soluta velit natus, odit mollitia. Corporis rerum minima fugiat in nostrum. Assumenda natus cupiditate hic quidem ex, quas, amet ipsum esse dolore facilis beatae maxime qui inventore, iste? Maiores dignissimos dolore culpa debitis voluptatem harum, excepturi enim reiciendis, tempora ab ipsam illum aspernatur quasi qui porro saepe iure sunt eligendi tenetur quaerat ducimus quas sequi omnis aperiam suscipit! Molestiae obcaecati officiis quo, ratione eveniet, provident pariatur. Veniam quasi expedita distinctio, itaque molestiae sequi, dolorum nisi repellendus quia facilis iusto dignissimos nam? Tenetur fugit quos autem nihil, perspiciatis expedita enim tempore, alias ab maiores quis necessitatibus distinctio molestias eum, quidem. Delectus impedit quidem laborum, fugit vel neque quo, ipsam, quasi aspernatur quas odio nihil? Veniam amet reiciendis blanditiis quis reprehenderit repudiandae neque, ab ducimus, odit excepturi voluptate saepe ipsam. Voluptatem eum error voluptas porro officiis, amet! Molestias, fugit, ut! Tempore non magnam, amet, facere ducimus accusantium eos veritatis neque.

54 |
55 | 56 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /Day 24 - Sticky Nav/style.css: -------------------------------------------------------------------------------- 1 | html { 2 | box-sizing: border-box; 3 | background:#eeeeee; 4 | font-family:'helvetica neue'; 5 | font-size: 20px; 6 | font-weight: 200; 7 | } 8 | body { 9 | margin: 0; 10 | } 11 | *, *:before, *:after { 12 | box-sizing: inherit; 13 | } 14 | 15 | .site-wrap { 16 | max-width: 700px; 17 | margin: 70px auto; 18 | background:white; 19 | padding:40px; 20 | text-align: justify; 21 | box-shadow: 0 0 10px 5px rgba(0, 0, 0, 0.05); 22 | transform: scale(0.98); 23 | transition: transform 0.5s; 24 | } 25 | 26 | .fixed-nav .site-wrap { 27 | transform: scale(1); 28 | } 29 | 30 | header { 31 | text-align: center; 32 | height:50vh; 33 | background:url(http://wes.io/iEgP/wow-so-deep.jpg) bottom center no-repeat; 34 | background-size:cover; 35 | display:flex; 36 | align-items:center; 37 | justify-content: center; 38 | } 39 | 40 | h1 { 41 | color:white; 42 | font-size: 7vw; 43 | text-shadow: 3px 4px 0 rgba(0,0,0,0.2) 44 | } 45 | 46 | nav { 47 | background:black; 48 | top:0; 49 | width: 100%; 50 | transition:all 0.5s; 51 | position: relative; 52 | z-index: 1; 53 | } 54 | 55 | .fixed-nav nav { 56 | position: fixed; 57 | box-shadow: 0 5px rgba(0, 0, 0, 0.1) 58 | } 59 | 60 | nav ul { 61 | margin: 0; 62 | padding:0; 63 | list-style: none; 64 | display:flex; 65 | } 66 | 67 | nav li { 68 | flex:1; 69 | text-align: center; 70 | display: flex; 71 | justify-content: center; 72 | align-items: center; 73 | } 74 | 75 | li.logo { 76 | max-width:0; 77 | overflow: hidden; 78 | background: white; 79 | transition: all .5s; 80 | font-weight: 600; 81 | font-size: 30px; 82 | } 83 | 84 | .fixed-nav li.logo { 85 | max-width: 500px; 86 | } 87 | 88 | li.logo a { 89 | color:black; 90 | } 91 | 92 | nav a { 93 | text-decoration: none; 94 | padding:20px; 95 | display: inline-block; 96 | color:white; 97 | transition:all 0.2s; 98 | text-transform: uppercase; 99 | } 100 | -------------------------------------------------------------------------------- /Day 25 - Event Capture, Propagation, Bubbling and Once/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Understanding JavaScript's Capture 6 | 7 | 8 | 9 |
10 |
11 |
12 |
13 |
14 |
15 | 16 | 39 | 40 | 41 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /Day 26 - Stripe Nav/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Follow Along Nav 6 | 7 | 8 | 67 | 68 | 206 | 207 | 243 | 244 | 245 | 246 | -------------------------------------------------------------------------------- /Day 27 - Click and Drag/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Click and Drag 6 | 7 | 8 | 9 |
10 |
01
11 |
02
12 |
03
13 |
04
14 |
05
15 |
06
16 |
07
17 |
08
18 |
09
19 |
10
20 |
11
21 |
12
22 |
13
23 |
14
24 |
15
25 |
16
26 |
17
27 |
18
28 |
19
29 |
20
30 |
21
31 |
22
32 |
23
33 |
24
34 |
25
35 |
36 | 37 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /Day 27 - Click and Drag/style.css: -------------------------------------------------------------------------------- 1 | html { 2 | box-sizing: border-box; 3 | background: url('https://source.unsplash.com/NFs6dRTBgaM/2000x2000') fixed; 4 | background-size: cover; 5 | } 6 | 7 | *, *:before, *:after { 8 | box-sizing: inherit; 9 | } 10 | 11 | body { 12 | min-height: 100vh; 13 | display: flex; 14 | justify-content: center; 15 | align-items: center; 16 | font-family: sans-serif; 17 | font-size: 20px; 18 | margin: 0; 19 | } 20 | 21 | .items { 22 | height:800px; 23 | padding: 100px; 24 | width:100%; 25 | border:1px solid white; 26 | box-shadow: 0 0 10px 7px rgba(0, 0, 0, 0.09); 27 | overflow-x: scroll; 28 | overflow-y: hidden; 29 | white-space: nowrap; 30 | user-select: none; 31 | cursor: pointer; 32 | transition: all 0.2s; 33 | transform: scale(0.98); 34 | will-change: transform; 35 | position: relative; 36 | background: rgba(255,255,255,0.1); 37 | font-size: 0; 38 | perspective: 500px; 39 | } 40 | 41 | .items.active { 42 | background: rgba(255,255,255,0.3); 43 | cursor: grabbing; 44 | cursor: -webkit-grabbing; 45 | transform: scale(1); 46 | } 47 | 48 | .item { 49 | width:200px; 50 | height: calc(100% - 40px); 51 | display: inline-flex; 52 | align-items: center; 53 | justify-content: center; 54 | font-size: 80px; 55 | font-weight: 100; 56 | color:rgba(0,0,0,0.15); 57 | box-shadow: inset 0 0 0 10px rgba(0,0,0,0.15); 58 | } 59 | 60 | .item:nth-child(9n+1) { background: dodgerblue;} 61 | .item:nth-child(9n+2) { background: goldenrod;} 62 | .item:nth-child(9n+3) { background: paleturquoise;} 63 | .item:nth-child(9n+4) { background: gold;} 64 | .item:nth-child(9n+5) { background: cadetblue;} 65 | .item:nth-child(9n+6) { background: tomato;} 66 | .item:nth-child(9n+7) { background: lightcoral;} 67 | .item:nth-child(9n+8) { background: darkslateblue;} 68 | .item:nth-child(9n+9) { background: rebeccapurple;} 69 | 70 | .item:nth-child(even) { transform: scaleX(1.31) rotateY(40deg); } 71 | .item:nth-child(odd) { transform: scaleX(1.31) rotateY(-40deg); } 72 | 73 | .wrap { 74 | width: auto; 75 | border:2px solid green; 76 | height: 100%; 77 | } 78 | -------------------------------------------------------------------------------- /Day 28 - Video Speed Controller/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Video Speed Scrubber 6 | 7 | 8 | 9 | 10 |
11 | 12 |
13 |
14 |
15 |
16 | 17 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Day 28 - Video Speed Controller/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | display:flex; 3 | justify-content: center; 4 | align-items: center; 5 | min-height: 100vh; 6 | background:#4C4C4C url('https://unsplash.it/1500/900?image=1021'); 7 | background-size:cover; 8 | font-family: sans-serif; 9 | } 10 | .wrapper { 11 | width:850px; 12 | display:flex; 13 | } 14 | video { 15 | box-shadow:0 0 1px 3px rgba(0,0,0,0.1); 16 | } 17 | 18 | .speed { 19 | background:#efefef; 20 | flex:1; 21 | display:flex; 22 | align-items:flex-start; 23 | margin:10px; 24 | border-radius:50px; 25 | box-shadow:0 0 1px 3px rgba(0,0,0,0.1); 26 | overflow: hidden; 27 | } 28 | .speed-bar { 29 | width:100%; 30 | background:linear-gradient(-170deg, #2376ae 0%, #c16ecf 100%); 31 | text-shadow:1px 1px 0 rgba(0,0,0,0.2); 32 | display: flex; 33 | align-items: center; 34 | justify-content: center; 35 | padding:2px; 36 | color:white; 37 | height:16.3%; 38 | } 39 | -------------------------------------------------------------------------------- /Day 29 - Countdown Timer/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Countdown Timer 6 | 7 | 8 | 9 | 10 |
11 |
12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 |
20 |
21 |
22 |

23 |

24 |
25 |
26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /Day 29 - Countdown Timer/scripts.js: -------------------------------------------------------------------------------- 1 | let countdown 2 | const timerDisplay = document.querySelector('.display__time-left') 3 | const endTime = document.querySelector('.display__end-time') 4 | const buttons = document.querySelectorAll('[data-time]') 5 | 6 | function timer(seconds) { 7 | clearInterval(countdown) 8 | 9 | const now = Date.now() 10 | const then = now + seconds * 1000 11 | displayTimeLeft(seconds) 12 | displayEndTime(then) 13 | 14 | countdown = setInterval(() => { 15 | const secondsLeft = Math.round((then - Date.now()) / 1000) 16 | 17 | if (secondsLeft < 0) { 18 | clearInterval(countdown) 19 | return 20 | } 21 | 22 | displayTimeLeft(secondsLeft) 23 | }, 1000) 24 | } 25 | 26 | function displayTimeLeft(seconds) { 27 | const minutes = Math.floor(seconds / 60) 28 | const remainderSeconds = seconds % 60 29 | const display = `${minutes}:${remainderSeconds < 10 ? '0' : ''}${remainderSeconds}` 30 | document.title = display 31 | timerDisplay.textContent = display 32 | } 33 | 34 | function displayEndTime(timestamp) { 35 | const end = new Date(timestamp) 36 | const hour = end.getHours() 37 | const minutes = end.getMinutes() 38 | endTime.textContent = `Be back at ${hour > 12 ? hour - 12 : hour}:${minutes < 10 ? '0' : ''}${minutes}` 39 | } 40 | 41 | function startTimer() { 42 | const seconds = parseInt(this.dataset.time) 43 | timer(seconds) 44 | } 45 | 46 | buttons.forEach(button => button.addEventListener('click', startTimer)) 47 | 48 | document.customForm.addEventListener('submit', function(e) { 49 | e.preventDefault() 50 | const mins = this.minutes.value 51 | timer(mins * 60) 52 | this.reset() 53 | }) 54 | -------------------------------------------------------------------------------- /Day 29 - Countdown Timer/style.css: -------------------------------------------------------------------------------- 1 | html { 2 | box-sizing: border-box; 3 | font-size: 10px; 4 | background: #8E24AA; 5 | background: linear-gradient(45deg, #42a5f5 0%,#478ed1 50%,#0d47a1 100%); 6 | } 7 | 8 | *, *:before, *:after { 9 | box-sizing: inherit; 10 | } 11 | 12 | body { 13 | margin:0; 14 | text-align: center; 15 | font-family: 'Inconsolata', monospace; 16 | } 17 | 18 | .display__time-left { 19 | font-weight: 100; 20 | font-size: 20rem; 21 | margin: 0; 22 | color:white; 23 | text-shadow:4px 4px 0 rgba(0,0,0,0.05); 24 | } 25 | 26 | .timer { 27 | display:flex; 28 | min-height: 100vh; 29 | flex-direction:column; 30 | } 31 | 32 | .timer__controls { 33 | display: flex; 34 | } 35 | 36 | .timer__controls > * { 37 | flex:1; 38 | } 39 | 40 | .timer__controls form { 41 | flex:1; 42 | display:flex; 43 | } 44 | 45 | .timer__controls input { 46 | flex:1; 47 | border:0; 48 | padding:2rem; 49 | } 50 | 51 | .timer__button { 52 | background:none; 53 | border:0; 54 | cursor: pointer; 55 | color:white; 56 | font-size: 2rem; 57 | text-transform: uppercase; 58 | background:rgba(0,0,0,0.1); 59 | border-bottom:3px solid rgba(0,0,0,0.2); 60 | border-right:1px solid rgba(0,0,0,0.2); 61 | padding:1rem; 62 | font-family: 'Inconsolata', monospace; 63 | } 64 | 65 | .timer__button:hover, 66 | .timer__button:focus { 67 | background:rgba(0,0,0,0.2); 68 | outline:0; 69 | } 70 | 71 | .display { 72 | flex:1; 73 | display:flex; 74 | flex-direction: column; 75 | align-items: center; 76 | justify-content: center; 77 | } 78 | 79 | .display__end-time { 80 | font-size: 4rem; 81 | color:white; 82 | } 83 | -------------------------------------------------------------------------------- /Day 3 - Variables/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Scoped CSS Variables and JS 6 | 7 | 8 |

Update CSS Variables with JS

9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 65 | 66 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /Day 30 - Whack A Mole/dirt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | dirt 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Day 30 - Whack A Mole/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Whack A Mole! 6 | 7 | 8 | 9 | 10 | 11 |

Whack-a-mole! 0

12 | 13 | 14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 | 35 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /Day 30 - Whack A Mole/mole.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | mole 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /Day 30 - Whack A Mole/style.css: -------------------------------------------------------------------------------- 1 | html { 2 | box-sizing: border-box; 3 | font-size: 10px; 4 | background: #ffc600; 5 | } 6 | 7 | *, *:before, *:after { 8 | box-sizing: inherit; 9 | } 10 | 11 | body { 12 | padding: 0; 13 | margin:0; 14 | font-family: 'Amatic SC', cursive; 15 | } 16 | 17 | h1 { 18 | text-align: center; 19 | font-size: 10rem; 20 | line-height:1; 21 | margin-bottom: 0; 22 | } 23 | 24 | .score { 25 | background:rgba(255,255,255,0.2); 26 | padding:0 3rem; 27 | line-height:1; 28 | border-radius:1rem; 29 | } 30 | 31 | .game { 32 | width:600px; 33 | height:400px; 34 | display:flex; 35 | flex-wrap:wrap; 36 | margin:0 auto; 37 | } 38 | 39 | .hole { 40 | flex: 1 0 33.33%; 41 | overflow: hidden; 42 | position: relative; 43 | } 44 | 45 | .hole:after { 46 | display: block; 47 | background: url(dirt.svg) bottom center no-repeat; 48 | background-size:contain; 49 | content:''; 50 | width: 100%; 51 | height:70px; 52 | position: absolute; 53 | z-index: 2; 54 | bottom:-30px; 55 | } 56 | 57 | .mole { 58 | background:url('mole.svg') bottom center no-repeat; 59 | background-size:60%; 60 | position: absolute; 61 | top: 100%; 62 | width: 100%; 63 | height: 100%; 64 | transition:all 0.4s; 65 | } 66 | 67 | .hole.up .mole { 68 | top:0; 69 | } 70 | -------------------------------------------------------------------------------- /Day 4 - Array Cardio/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Array Cardio 💪 6 | 7 | 8 |

Psst: have a look at the JavaScript Console 💁

9 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /Day 5 - Flex Panel Gallery/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Flex Panels 💪 6 | 7 | 8 | 9 | 107 | 108 | 109 |
110 |
111 |

Hey

112 |

Let's

113 |

Dance

114 |
115 |
116 |

Give

117 |

Take

118 |

Receive

119 |
120 |
121 |

Experience

122 |

It

123 |

Today

124 |
125 |
126 |

Give

127 |

All

128 |

You can

129 |
130 |
131 |

Life

132 |

In

133 |

Motion

134 |
135 |
136 | 137 | 153 | 154 | 155 | 156 | 157 | 158 | -------------------------------------------------------------------------------- /Day 6 - Type Ahead/style.css: -------------------------------------------------------------------------------- 1 | html { 2 | box-sizing: border-box; 3 | background:#ffc600; 4 | font-family:'helvetica neue'; 5 | font-size: 20px; 6 | font-weight: 200; 7 | } 8 | *, *:before, *:after { 9 | box-sizing: inherit; 10 | } 11 | input { 12 | width: 100%; 13 | padding:20px; 14 | } 15 | 16 | .search-form { 17 | max-width:400px; 18 | margin:50px auto; 19 | } 20 | 21 | input.search { 22 | margin: 0; 23 | text-align: center; 24 | outline:0; 25 | border: 10px solid #F7F7F7; 26 | width: 120%; 27 | left: -10%; 28 | position: relative; 29 | top: 10px; 30 | z-index: 2; 31 | border-radius: 5px; 32 | font-size: 40px; 33 | box-shadow: 0 0 5px rgba(0, 0, 0, 0.12), inset 0 0 2px rgba(0, 0, 0, 0.19); 34 | } 35 | 36 | 37 | .suggestions { 38 | margin: 0; 39 | padding: 0; 40 | position: relative; 41 | /*perspective:20px;*/ 42 | } 43 | .suggestions li { 44 | background:white; 45 | list-style: none; 46 | border-bottom: 1px solid #D8D8D8; 47 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.14); 48 | margin:0; 49 | padding:20px; 50 | transition:background 0.2s; 51 | display:flex; 52 | justify-content:space-between; 53 | text-transform: capitalize; 54 | } 55 | 56 | .suggestions li:nth-child(even) { 57 | transform: perspective(100px) rotateX(3deg) translateY(2px) scale(1.001); 58 | background: linear-gradient(to bottom, #ffffff 0%,#EFEFEF 100%); 59 | } 60 | .suggestions li:nth-child(odd) { 61 | transform: perspective(100px) rotateX(-3deg) translateY(3px); 62 | background: linear-gradient(to top, #ffffff 0%,#EFEFEF 100%); 63 | } 64 | 65 | span.population { 66 | font-size: 15px; 67 | } 68 | 69 | 70 | .details { 71 | text-align: center; 72 | font-size: 15px; 73 | } 74 | 75 | .hl { 76 | background:#ffc600; 77 | } 78 | 79 | .love { 80 | text-align: center; 81 | } 82 | 83 | a { 84 | color:black; 85 | background:rgba(0,0,0,0.1); 86 | text-decoration: none; 87 | } 88 | -------------------------------------------------------------------------------- /Day 7 - Array Cardio Pt.2/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Array Cardio 💪💪 6 | 7 | 8 |

Psst: have a look at the JavaScript Console 💁

9 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /Day 8 - HTML5 Canvas/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HTML5 Canvas 6 | 7 | 8 | 9 | 53 | 54 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Day 9 - Dev Tools/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Console Tricks! 6 | 7 | 8 | 9 |

×BREAK×DOWN×

10 | 11 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](https://javascript30.com/images/JS3-social-share.png) 2 | 3 | # JavaScript30 4 | 5 | See all of the exercises at [https://JavaScript30.com](https://JavaScript30.com) 6 | 7 | [Day 1 - Drum Kit](https://github.com/SanKlein/JavaScript-30/tree/master/Day%201%20-%20Drum%20Kit): data-key tags, .wav files, playing audio, flexbox, transforms 8 | 9 | [Day 2 - Clock](https://github.com/SanKlein/JavaScript-30/tree/master/Day%202%20-%20Clock): transforms, dates, intervals 10 | 11 | [Day 3 - Variables](https://github.com/SanKlein/JavaScript-30/tree/master/Day%203%20-%20Variables): range inputs, data tags, css variables, setProperty 12 | 13 | [Day 4 - Array Cardio](https://github.com/SanKlein/JavaScript-30/tree/master/Day%204%20-%20Array%20Cardio): filter, map, sort, reduce, Array.from, console.table 14 | 15 | [Day 5 - Flex Panel Gallery](https://github.com/SanKlein/JavaScript-30/tree/master/Day%205%20-%20Flex%20Panel%20Gallery): cubic-bezier transitions, flexbox, translations, toggle classes 16 | 17 | [Day 6 - Type Ahead](https://github.com/SanKlein/JavaScript-30/tree/master/Day%206%20-%20Type%20Ahead): auto-complete, RegExp, match, string replace 18 | 19 | [Day 7 - Array Cardio Pt. 2](https://github.com/SanKlein/JavaScript-30/tree/master/Day%207%20-%20Array%20Cardio%20Pt.2): some, every, find, findIndex, splice 20 | 21 | [Day 8 - HTML5 Canvas](https://github.com/SanKlein/JavaScript-30/tree/master/Day%208%20-%20HTML5%20Canvas): canvas, 2d, drawing, offsetX, hsl 22 | 23 | [Day 9 - Dev Tools](https://github.com/SanKlein/JavaScript-30/tree/master/Day%209%20-%20Dev%20Tools): console.warn, console.error, console.info, console.assert, classList.contains, console.dir, console.group, console.const, console.time 24 | 25 | [Day 10 - Checkboxes](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2010%20-%20Checkboxes): querySelector on input type, select multiple checkboxes with shift 26 | 27 | [Day 11 - Video Player](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2011%20-%20Video%20Player): video, range inputs, video skips, video volue, video play back rate, progress bar w/ flexBasis, cursor 28 | 29 | [Day 12 - Key Sequence Detection](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2012%20-%20Key%20Sequence%20Detection): secret key codes, string from char code 30 | 31 | [Day 13 - Slide in on Scroll](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2013%20-%20Slide%20in%20on%20Scroll): debounce, timeouts, image heights, window.scrollY, classList.add, classList.remove, image offSet, translate transforms 32 | 33 | [Day 14 - Reference vs Copying](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2014%20-%20References%20vs%20Copying): Object.assign, spread operator, JSON.parse, JSON.stringify 34 | 35 | [Day 15 - LocalStorage](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2015%20-%20LocalStorage): localStorage, innerHTML, e.target.dataset, reset form, input labels 36 | 37 | [Day 16 - Mouse Move Shadow](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2016%20-%20Mouse%20Move%20Shadow): offsets, Math.round, text shadows 38 | 39 | [Day 17 - Sort](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2017%20-%20Sort): text strip, text replace, sort 40 | 41 | [Day 18 - Times with Reduce](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2018%20-%20Times%20with%20Reduce): split, Math.floor 42 | 43 | [Day 19 - Webcam](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2019%20-%20Webcam): canvas, video, audio, range inputs, navigator.mediaDevices, download photo, video effects, pixels, browser-sync 44 | 45 | [Day 20 - Speech Detection](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2020%20-%20Speech%20Detection): window.SpeechRecognition, browser-sync 46 | 47 | [Day 21 - Geolocation](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2021%20-%20Geolocation): browser-sync, navigator.geolocation, rotate transform 48 | 49 | [Day 22 - Link Highlighter](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2022%20-%20Link%20Highlighter): getBoundingClientRect, scrollY, translate transform 50 | 51 | [Day 23 - Speech Synthesis](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2023%20-%20Speech%20Synthesis): SpeechSynthesisUtterance, options 52 | 53 | [Day 24 - Sticky Nav](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2024%20-%20Sticky%20Nav): fixed nav, offSet, scrollY, scale transform 54 | 55 | [Day 25 - Events](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2025%20-%20Event%20Capture%2C%20Propagation%2C%20Bubbling%20and%20Once): capture, propagation, once, bubble 56 | 57 | [Day 26 - Stripe Nav](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2026%20-%20Stripe%20Nav): transition opacity, arrow, getBoundingClientRect, coords 58 | 59 | [Day 27 - Click and Drag](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2027%20-%20Click%20and%20Drag): pageX, offsetLeft, scrollLeft, cursor, calc height, transform scaleX rotateY 60 | 61 | [Day 28 - Video Speed Controller](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2028%20-%20Video%20Speed%20Controller): video, toFixed(2), pageY, offsetTop 62 | 63 | [Day 29 - Countdown Timer](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2029%20-%20Countdown%20Timer): data prop, setInterval, clearInterval, dates, textContent, document.title, timestamps, parseInt, form reset 64 | 65 | [Day 30 - Whack A Mole](https://github.com/SanKlein/JavaScript-30/tree/master/Day%2030%20-%20Whack%20A%20Mole): svg, scores, play game, Math.random, setTimeout 66 | 67 | Huge thank you to [@WesBos](https://github.com/wesbos)! 68 | --------------------------------------------------------------------------------