diff --git a/01 - JavaScript Drum Kit/index-START.html b/01 - JavaScript Drum Kit/index-START.html index 4070d32767..b668d8014f 100644 --- a/01 - JavaScript Drum Kit/index-START.html +++ b/01 - JavaScript Drum Kit/index-START.html @@ -1,10 +1,12 @@ + JS Drum Kit + @@ -57,10 +59,14 @@ - + }); + + - + + \ No newline at end of file diff --git a/01 - JavaScript Drum Kit/index.html b/01 - JavaScript Drum Kit/index.html new file mode 100644 index 0000000000..faa6f2ab27 --- /dev/null +++ b/01 - JavaScript Drum Kit/index.html @@ -0,0 +1,93 @@ + + + + + + JS Drum Kit + + + + + + +
+
+ A + clap +
+
+ S + hihat +
+
+ D + kick +
+
+ F + openhat +
+
+ G + boom +
+
+ H + ride +
+
+ J + snare +
+
+ K + tom +
+
+ L + tink +
+
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/02 - JS and CSS Clock/index.html b/02 - JS and CSS Clock/index.html new file mode 100644 index 0000000000..65fa4d47f2 --- /dev/null +++ b/02 - JS and CSS Clock/index.html @@ -0,0 +1,121 @@ + + + + + + JS + CSS Clock + + + + + +
+
+
+
+
+
+
+ 08:57:00 +
+
+ + + + + + + + \ No newline at end of file diff --git a/03 - CSS Variables/index.html b/03 - CSS Variables/index.html new file mode 100644 index 0000000000..6bfdb06c6c --- /dev/null +++ b/03 - CSS Variables/index.html @@ -0,0 +1,77 @@ + + + + + + Scoped CSS Variables and JS + + + +

Update CSS Variables with JS

+ +
+ + + + + + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/04 - Array Cardio Day 1/index.html b/04 - Array Cardio Day 1/index.html new file mode 100644 index 0000000000..fb4d4963e4 --- /dev/null +++ b/04 - Array Cardio Day 1/index.html @@ -0,0 +1,115 @@ + + + + + + Array Cardio ๐Ÿ’ช + + + + + +
+ + + + + \ No newline at end of file diff --git a/05 - Flex Panel Gallery/index.html b/05 - Flex Panel Gallery/index.html new file mode 100644 index 0000000000..403e533c85 --- /dev/null +++ b/05 - Flex Panel Gallery/index.html @@ -0,0 +1,170 @@ + + + + + + Flex Panels ๐Ÿ’ช + + + + + + + +
+
+

Hey

+

Let's

+

Dance

+
+
+

Give

+

Take

+

Receive

+
+
+

Experience

+

It

+

Today

+
+
+

Give

+

All

+

You can

+
+
+

Life

+

In

+

Motion

+
+
+ + + + + + + + \ No newline at end of file diff --git a/06 - Type Ahead/index.html b/06 - Type Ahead/index.html new file mode 100644 index 0000000000..eb7aaa053e --- /dev/null +++ b/06 - Type Ahead/index.html @@ -0,0 +1,64 @@ + + + + + + Type Ahead ๐Ÿ‘€ + + + + + +
+ + +
+ + + + \ No newline at end of file diff --git a/07 - Array Cardio Day 2/index.html b/07 - Array Cardio Day 2/index.html new file mode 100644 index 0000000000..f60106f3b1 --- /dev/null +++ b/07 - Array Cardio Day 2/index.html @@ -0,0 +1,84 @@ + + + + + + Array Cardio ๐Ÿ’ช๐Ÿ’ช + + + + + +
+ + + + + \ No newline at end of file diff --git a/08 - Fun with HTML5 Canvas/index.html b/08 - Fun with HTML5 Canvas/index.html new file mode 100644 index 0000000000..2ffa31836a --- /dev/null +++ b/08 - Fun with HTML5 Canvas/index.html @@ -0,0 +1,122 @@ + + + + + + HTML5 Canvas + + + + + + + + + + + + \ No newline at end of file diff --git a/09 - Dev Tools Domination/index.html b/09 - Dev Tools Domination/index.html new file mode 100644 index 0000000000..82da8de920 --- /dev/null +++ b/09 - Dev Tools Domination/index.html @@ -0,0 +1,183 @@ + + + + + + Console Tricks! + + + + + + +

+ It isn't easy being green. +

+ +
    +
  1. Right-click the paragraph above, then click "Inspect"
  2. +
  3. In dev tools, right-click the "p" element, then click "Break on..." / "attribute modifications"
  4. +
  5. (Left-)click the paragraph above, and code execution should be paused in the JavaScript "makeGreen()" function.
  6. +
+ +

+ Press F12 to see the results of these console statements: +

+ + + + + + \ No newline at end of file diff --git a/10 - Hold Shift and Check Checkboxes/index.html b/10 - Hold Shift and Check Checkboxes/index.html new file mode 100644 index 0000000000..f9a315ca25 --- /dev/null +++ b/10 - Hold Shift and Check Checkboxes/index.html @@ -0,0 +1,128 @@ + + + + + + Hold Shift to Check Multiple Checkboxes + + + + + +
+
+ +

This is an inbox layout.

+
+
+ +

Check one item

+
+
+ +

Hold down your Shift key

+
+ + +

Check a lower item

+
+
+ +

Everything inbetween should also be set to checked

+
+
+ +

Try do it with out any libraries

+
+
+ +

Just regular JavaScript

+
+
+ +

Good Luck!

+
+
+ +

Don't forget to tweet your result!

+
+
+ + + + + \ No newline at end of file diff --git a/11 - Custom Video Player/index.html b/11 - Custom Video Player/index.html index 281a15eaa8..c9267911ee 100644 --- a/11 - Custom Video Player/index.html +++ b/11 - Custom Video Player/index.html @@ -1,27 +1,30 @@ + HTML Video Player - -
- + +
+ -
-
+
+
-
- - - - - -
-
+
+ + + + + + +
+
- + + \ No newline at end of file diff --git a/11 - Custom Video Player/scripts.js b/11 - Custom Video Player/scripts.js index e69de29bb2..467fb96b98 100644 --- a/11 - Custom Video Player/scripts.js +++ b/11 - Custom Video Player/scripts.js @@ -0,0 +1,67 @@ +const player = document.querySelector('.player'); +const video = player.querySelector('.viewer'); +const progress = player.querySelector('.progress'); +const progressBar = player.querySelector('.progress__filled'); +const toggle = player.querySelector('.toggle'); +const skipButtons = player.querySelectorAll('[data-skip]'); +const ranges = player.querySelectorAll('.player__slider'); +const fullscreen = player.querySelector('#fullscreenButton'); + +function togglePlay() { + video[video.paused ? 'play' : 'pause'](); +} + +function toggleFullscreen() { + if (document.webkitIsFullScreen) { + document.webkitExitFullscreen(); + } else { + player.webkitRequestFullscreen(); + } +} + +function handleFullScreenChange() { + console.log(document.webkitIsFullScreen); +} + +function updateToggleIcon() { + toggle.textContent = this.paused ? 'โ–บ' : 'โšโš'; +} + +function skip() { + video.currentTime += parseFloat(this.dataset.skip); +} + +function handleRangeUpdate() { + video[this.name] = this.value; // (range names are "volume" and "playbackRate") +} + +function updateProgressBar() { + const percent = video.currentTime / video.duration * 100; + progressBar.style.flexBasis = `${percent}%`; +} + +function scrub(e) { + const newPercentComplete = e.offsetX / progress.offsetWidth; + const scrubTime = newPercentComplete * video.duration; + video.currentTime = scrubTime; +} + +toggle.addEventListener('click', togglePlay); + +document.addEventListener('onwebkitfullscreenchange', handleFullScreenChange); +fullscreen.addEventListener('click', toggleFullscreen); + +video.addEventListener('click', togglePlay); +video.addEventListener('play', updateToggleIcon); +video.addEventListener('pause', updateToggleIcon); +video.addEventListener('timeupdate', updateProgressBar); + +skipButtons.forEach(button => button.addEventListener('click', skip)); + +ranges.forEach(range => range.addEventListener('change', handleRangeUpdate)); + +let mouseDown = false; +progress.addEventListener('click', scrub); +progress.addEventListener('mousedown', () => (mouseDown = true)); +progress.addEventListener('mouseup', () => (mouseDown = false)); +progress.addEventListener('mousemove', e => mouseDown && scrub(e)); diff --git a/12 - Key Sequence Detection/index.html b/12 - Key Sequence Detection/index.html new file mode 100644 index 0000000000..86d2243667 --- /dev/null +++ b/12 - Key Sequence Detection/index.html @@ -0,0 +1,54 @@ + + + + + + Key Detection + + + + + +

Type the "Konami Code" for a wonderful surprise! + ๐Ÿ˜

+ + + + + \ No newline at end of file diff --git a/13 - Slide in on Scroll/index.html b/13 - Slide in on Scroll/index.html new file mode 100644 index 0000000000..b601e0f248 --- /dev/null +++ b/13 - Slide in on Scroll/index.html @@ -0,0 +1,241 @@ + + + + + + Document + + + + +
+ +

Slide in on Scroll

+ +

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.

+

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.

+

Adipisicing elit. Tempore tempora rerum..

+

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.

+

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.

+

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.

+ + + +

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

+ + + +

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.

+ + + +

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.

+ + + +

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.

+

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.

+ + + + +
+ + + + + + + + \ No newline at end of file diff --git a/14 - JavaScript References VS Copying/index.html b/14 - JavaScript References VS Copying/index.html new file mode 100644 index 0000000000..60266bd64d --- /dev/null +++ b/14 - JavaScript References VS Copying/index.html @@ -0,0 +1,137 @@ + + + + + + JS Reference VS Copy + + + + + +
+ + + + + + \ No newline at end of file diff --git a/15 - LocalStorage/index.html b/15 - LocalStorage/index.html new file mode 100644 index 0000000000..29225f9d48 --- /dev/null +++ b/15 - LocalStorage/index.html @@ -0,0 +1,119 @@ + + + + + + Local Storage / Event Delegation + + + + + + + + + + + + + + + + + +
+

LOCAL TAPAS

+

+
    +
  • Loading Tapas...
  • +
+
+ + +
+ + +
+
+
+ + + + + \ No newline at end of file diff --git a/16 - Mouse Move Shadow/index.html b/16 - Mouse Move Shadow/index.html new file mode 100644 index 0000000000..a74e36913d --- /dev/null +++ b/16 - Mouse Move Shadow/index.html @@ -0,0 +1,72 @@ + + + + + + Mouse Shadow + + + + +
+

๐Ÿ”ฅWOAH!

+
+ + + + + + + + \ No newline at end of file diff --git a/17 - Sort Without Articles/index.html b/17 - Sort Without Articles/index.html new file mode 100644 index 0000000000..3409045189 --- /dev/null +++ b/17 - Sort Without Articles/index.html @@ -0,0 +1,80 @@ + + + + + + Sort Without Articles + + + + + + +
    + + + + + + \ No newline at end of file diff --git a/18 - Adding Up Times with Reduce/index.html b/18 - Adding Up Times with Reduce/index.html new file mode 100644 index 0000000000..fa5d4f258e --- /dev/null +++ b/18 - Adding Up Times with Reduce/index.html @@ -0,0 +1,271 @@ + + + + + + Videos + + + + + +
      +
    • + Video 1 +
    • +
    • + Video 2 +
    • +
    • + Video 3 +
    • +
    • + Video 4 +
    • +
    • + Video 5 +
    • +
    • + Video 6 +
    • +
    • + Video 7 +
    • +
    • + Video 8 +
    • +
    • + Video 9 +
    • +
    • + Video 10 +
    • +
    • + Video 11 +
    • +
    • + Video 12 +
    • +
    • + Video 13 +
    • +
    • + Video 14 +
    • +
    • + Video 15 +
    • +
    • + Video 16 +
    • +
    • + Video 17 +
    • +
    • + Video 18 +
    • +
    • + Video 19 +
    • +
    • + Video 20 +
    • +
    • + Video 21 +
    • +
    • + Video 22 +
    • +
    • + Video 23 +
    • +
    • + Video 24 +
    • +
    • + Video 25 +
    • +
    • + Video 26 +
    • +
    • + Video 27 +
    • +
    • + Video 28 +
    • +
    • + Video 29 +
    • +
    • + Video 30 +
    • +
    • + Video 31 +
    • +
    • + Video 32 +
    • +
    • + Video 33 +
    • +
    • + Video 34 +
    • +
    • + Video 35 +
    • +
    • + Video 36 +
    • +
    • + Video 37 +
    • +
    • + Video 38 +
    • +
    • + Video 39 +
    • +
    • + Video 40 +
    • +
    • + Video 41 +
    • +
    • + Video 42 +
    • +
    • + Video 43 +
    • +
    • + Video 44 +
    • +
    • + Video 45 +
    • +
    • + Video 46 +
    • +
    • + Video 47 +
    • +
    • + Video 48 +
    • +
    • + Video 49 +
    • +
    • + Video 50 +
    • +
    • + Video 51 +
    • +
    • + Video 52 +
    • +
    • + Video 53 +
    • +
    • + Video 54 +
    • +
    • + Video 55 +
    • +
    • + Video 56 +
    • +
    • + Video 57 +
    • +
    • + Video 58 +
    • +
    + + + + + + + + + + + + + + + + +
    Video running times
    TitleTime
    Total
    + + + + + \ No newline at end of file diff --git a/19 - Webcam Fun/index.html b/19 - Webcam Fun/index.html index d4ffc4dc2a..bfa8ac4d1b 100755 --- a/19 - Webcam Fun/index.html +++ b/19 - Webcam Fun/index.html @@ -1,16 +1,18 @@ + Get User Media Code Along! +
    - +
    @@ -42,4 +44,5 @@ - + + \ No newline at end of file diff --git a/19 - Webcam Fun/scripts.js b/19 - Webcam Fun/scripts.js index 00355f5a9c..ec8772c4cf 100644 --- a/19 - Webcam Fun/scripts.js +++ b/19 - Webcam Fun/scripts.js @@ -2,4 +2,103 @@ const video = document.querySelector('.player'); const canvas = document.querySelector('.photo'); const ctx = canvas.getContext('2d'); const strip = document.querySelector('.strip'); -const snap = document.querySelector('.snap'); +const snapAudio = document.querySelector('.snap'); + +function getVideo() { + navigator.mediaDevices + .getUserMedia({ video: true, audio: false }) + .then(localMediaStream => { + video.src = window.URL.createObjectURL(localMediaStream); + video.play(); + }) + .catch(err => { + alert('Video initialization error: ' + err); + console.log('VIDEO ERROR', err); + }); +} + +function paintToCanvas() { + const { videoWidth, videoHeight } = video; + canvas.width = videoWidth; + canvas.height = videoHeight; + + return setInterval(() => { + ctx.drawImage(video, 0, 0, videoWidth, videoHeight); + + let pixels = ctx.getImageData(0, 0, videoWidth, videoHeight); + + pixels = greenScreen(pixels); + ctx.putImageData(pixels, 0, 0); + }, 50); +} + +function takePhoto() { + snapAudio.currentTime = 0; + snapAudio.play(); + + const a = document.createElement('a'); + a.href = canvas.toDataURL('image/jpeg'); + a.setAttribute('download', 'handsome'); + a.innerHTML = `Handsome person`; + + strip.insertBefore(a, strip.firstChild); +} + +function redEffect(pixels) { + const data = pixels.data; + + for (let i = 0; i < data.length; i += 4) { + data[i + 0] = data[i + 0] + 200; // RED + data[i + 1] = data[i + 1] - 50; // GREEN + data[i + 2] = data[i + 2] * 0.5; // Blue + } + + return pixels; +} + +function rgbSplit(pixels) { + const data = pixels.data; + + for (let i = 0; i < data.length; i += 4) { + data[i - 150] = data[i + 0]; // RED + data[i + 500] = data[i + 1]; // GREEN + data[i - 550] = data[i + 2]; // Blue + } + + return pixels; +} + +function greenScreen(pixels) { + const levels = {}; + + document.querySelectorAll('.rgb input').forEach(input => { + levels[input.name] = input.value; + }); + + const data = pixels.data; + + for (i = 0; i < data.length; i = i + 4) { + red = data[i + 0]; + green = data[i + 1]; + blue = data[i + 2]; + alpha = data[i + 3]; + + if ( + red >= levels.rmin && + green >= levels.gmin && + blue >= levels.bmin && + red <= levels.rmax && + green <= levels.gmax && + blue <= levels.bmax + ) { + // take it out! + data[i + 3] = 0; + } + } + + return pixels; +} + +getVideo(); + +video.addEventListener('canplay', paintToCanvas); diff --git a/20 - Speech Detection/index.html b/20 - Speech Detection/index.html new file mode 100644 index 0000000000..5be8a0dfbe --- /dev/null +++ b/20 - Speech Detection/index.html @@ -0,0 +1,86 @@ + + + + + + Speech Detection + + + + +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/21 - Geolocation/index.html b/21 - Geolocation/index.html new file mode 100644 index 0000000000..efa9d9a8f4 --- /dev/null +++ b/21 - Geolocation/index.html @@ -0,0 +1,115 @@ + + + + + + Document + + + + +
    +

    latitude: unknown

    +

    longitude: unknown

    +
    + + + + + + + + + + + + + + + +

    + 0 + KM/H +

    + + + + + + + + \ No newline at end of file diff --git a/22 - Follow Along Link Highlighter/index.html b/22 - Follow Along Link Highlighter/index.html new file mode 100644 index 0000000000..dc4fe22f71 --- /dev/null +++ b/22 - Follow Along Link Highlighter/index.html @@ -0,0 +1,66 @@ + + + + + + ๐Ÿ‘€๐Ÿ‘€๐Ÿ‘€Follow Along Nav + + + + + + + +
    +

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

    +

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

    +

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

    +

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

    +

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

    +
    + + + + + \ No newline at end of file diff --git a/23 - Speech Synthesis/index.html b/23 - Speech Synthesis/index.html new file mode 100644 index 0000000000..346588114d --- /dev/null +++ b/23 - Speech Synthesis/index.html @@ -0,0 +1,98 @@ + + + + + + Speech Synthesis + + + + + + +
    + +

    The Voiceinator 5000

    + + + +
    + + +
    + + + + + + + + + + + +
    + + + + + \ No newline at end of file diff --git a/23 - Speech Synthesis/style.css b/23 - Speech Synthesis/style.css index a7aaa3938b..b39eddecc3 100644 --- a/23 - Speech Synthesis/style.css +++ b/23 - Speech Synthesis/style.css @@ -3,7 +3,9 @@ html { box-sizing: border-box; } -*, *:before, *:after { +*, +*:before, +*:after { box-sizing: inherit; } @@ -11,86 +13,157 @@ body { margin: 0; padding: 0; font-family: sans-serif; - background-color:#3BC1AC; - display:flex; + background-color: #3bc1ac; + display: flex; min-height: 100vh; align-items: center; - background-image: - radial-gradient(circle at 100% 150%, #3BC1AC 24%, #42D2BB 25%, #42D2BB 28%, #3BC1AC 29%, #3BC1AC 36%, #42D2BB 36%, #42D2BB 40%, transparent 40%, transparent), - radial-gradient(circle at 0 150%, #3BC1AC 24%, #42D2BB 25%, #42D2BB 28%, #3BC1AC 29%, #3BC1AC 36%, #42D2BB 36%, #42D2BB 40%, transparent 40%, transparent), - 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), - 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), - 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); - background-size:100px 50px; + background-image: radial-gradient( + circle at 100% 150%, + #3bc1ac 24%, + #42d2bb 25%, + #42d2bb 28%, + #3bc1ac 29%, + #3bc1ac 36%, + #42d2bb 36%, + #42d2bb 40%, + transparent 40%, + transparent + ), + radial-gradient( + circle at 0 150%, + #3bc1ac 24%, + #42d2bb 25%, + #42d2bb 28%, + #3bc1ac 29%, + #3bc1ac 36%, + #42d2bb 36%, + #42d2bb 40%, + transparent 40%, + transparent + ), + 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 + ), + 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 + ), + 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 + ); + background-size: 100px 50px; } - - .voiceinator { - padding:2rem; - width:50rem; - margin:0 auto; - border-radius:1rem; + padding: 2rem; + width: 50rem; + margin: 0 auto; + border-radius: 1rem; position: relative; - background:white; + background: white; overflow: hidden; z-index: 1; - box-shadow:0 0 5px 5px rgba(0,0,0,0.1); + box-shadow: 0 0 5px 5px rgba(0, 0, 0, 0.1); } - h1 { - width:calc(100% + 4rem); + width: calc(100% + 4rem); margin: -2rem 0 2rem -2rem; - padding:.5rem; + padding: 0.5rem; background: #ffc600; - border-bottom: 5px solid #F3C010; + border-bottom: 5px solid #f3c010; text-align: center; font-size: 5rem; font-weight: 100; font-family: 'Pacifico', cursive; - text-shadow:3px 3px 0 #F3C010; - + text-shadow: 3px 3px 0 #f3c010; } - .voiceinator input, .voiceinator button, .voiceinator select, .voiceinator textarea { width: 100%; display: block; - margin:10px 0; - padding:10px; - border:0; + margin: 10px 0; + padding: 10px; + border: 0; font-size: 2rem; - background:#F7F7F7; - outline:0; + background: #f7f7f7; + outline: 0; } - textarea { height: 20rem; } - -input[type="select"] { - +input[type='select'] { } - .voiceinator button { - background:#ffc600; - border:0; + background: #ffc600; + border: 0; width: 49%; - float:left; + float: left; font-family: 'Pacifico', cursive; margin-bottom: 0; font-size: 2rem; - border-bottom: 5px solid #F3C010; - cursor:pointer; + border-bottom: 5px solid #f3c010; + cursor: pointer; position: relative; } - .voiceinator button:active { - top:2px; + top: 2px; } - .voiceinator button:nth-of-type(1) { margin-right: 2%; } +.englishOnlyDiv { + text-align: right; + font-size: 14px; + margin: 0; +} +.englishOnlyDiv label, +.englishOnlyDiv input { + display: inline; + width: auto; +} diff --git a/24 - Sticky Nav/index.html b/24 - Sticky Nav/index.html new file mode 100644 index 0000000000..75f968e869 --- /dev/null +++ b/24 - Sticky Nav/index.html @@ -0,0 +1,189 @@ + + + + + + Sticky Nav + + + + + +
    +

    A story about getting lost.

    +
    + + + +
    + +

    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.

    +

    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.

    +

    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.

    +

    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.

    +

    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.

    +

    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.

    +

    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.

    +

    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.

    +

    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.

    +

    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.

    + + + +

    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

    + + + +

    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.

    + + + +

    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.

    + + + +

    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.

    +

    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.

    +
    + + + + + + \ No newline at end of file diff --git a/24 - Sticky Nav/style.css b/24 - Sticky Nav/style.css new file mode 100644 index 0000000000..a57f1c79d7 --- /dev/null +++ b/24 - Sticky Nav/style.css @@ -0,0 +1,101 @@ +html { + box-sizing: border-box; + background: #eeeeee; + font-family: 'helvetica neue'; + font-size: 20px; + font-weight: 200; +} +body { + margin: 0; +} +*, +*:before, +*:after { + box-sizing: inherit; +} + +.site-wrap { + max-width: 700px; + margin: 70px auto; + background: white; + padding: 40px; + text-align: justify; + box-shadow: 0 0 10px 5px rgba(0, 0, 0, 0.05); + transform: scale(0.98); + transition: transform 0.5s; +} + +body.fixed-nav .site-wrap { + transform: scale(1); +} + +header { + text-align: center; + height: 50vh; + background: url(http://wes.io/iEgP/wow-so-deep.jpg) bottom center no-repeat; + background-size: cover; + display: flex; + align-items: center; + justify-content: center; +} + +h1 { + color: white; + font-size: 7vw; + text-shadow: 3px 4px 0 rgba(0, 0, 0, 0.2); +} + +nav { + background: black; + top: 0; + width: 100%; + transition: all 0.5s; + position: relative; + z-index: 1; +} + +body.fixed-nav nav { + position: fixed; + box-shadow: 0 5px 0 rgba(0, 0, 0, 0.1); +} + +nav ul { + margin: 0; + padding: 0; + list-style: none; + display: flex; +} + +nav li { + flex: 1; + text-align: center; + display: flex; + justify-content: center; + align-items: center; +} + +li.logo { + max-width: 0; + overflow: hidden; + background: white; + transition: all 1.5s; + font-weight: 600; + font-size: 30px; +} + +li.logo a { + color: black; +} + +body.fixed-nav li.logo { + max-width: 500px; +} + +nav a { + text-decoration: none; + padding: 20px; + display: inline-block; + color: white; + transition: all 0.2s; + text-transform: uppercase; +} diff --git a/25 - Event Capture, Propagation, Bubbling and Once/index.html b/25 - Event Capture, Propagation, Bubbling and Once/index.html new file mode 100644 index 0000000000..750bdcfe56 --- /dev/null +++ b/25 - Event Capture, Propagation, Bubbling and Once/index.html @@ -0,0 +1,76 @@ + + + + + + Understanding JavaScript's Capture + + + + +
    +
    +
    +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/26 - Stripe Follow Along Nav/index.html b/26 - Stripe Follow Along Nav/index.html new file mode 100644 index 0000000000..e6b4527e51 --- /dev/null +++ b/26 - Stripe Follow Along Nav/index.html @@ -0,0 +1,266 @@ + + + + + + Follow Along Nav + + + +

    Cool

    + + + + + + + + + \ No newline at end of file diff --git a/27 - Click and Drag/index.html b/27 - Click and Drag/index.html new file mode 100644 index 0000000000..2f03f9ec0f --- /dev/null +++ b/27 - Click and Drag/index.html @@ -0,0 +1,86 @@ + + + + + + Click and Drag + + + + +
    +
    01
    +
    02
    +
    03
    +
    04
    +
    05
    +
    06
    +
    07
    +
    08
    +
    09
    +
    10
    +
    11
    +
    12
    +
    13
    +
    14
    +
    15
    +
    16
    +
    17
    +
    18
    +
    19
    +
    20
    +
    21
    +
    22
    +
    23
    +
    24
    +
    25
    +
    + + + + + + \ No newline at end of file diff --git a/28 - Video Speed Controller/index.html b/28 - Video Speed Controller/index.html new file mode 100644 index 0000000000..3fed9973f0 --- /dev/null +++ b/28 - Video Speed Controller/index.html @@ -0,0 +1,51 @@ + + + + + + Video Speed Scrubber + + + + + +
    + +
    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/29 - Countdown Timer/index.html b/29 - Countdown Timer/index.html index d54f447dd9..5ad85511b3 100644 --- a/29 - Countdown Timer/index.html +++ b/29 - Countdown Timer/index.html @@ -1,11 +1,13 @@ + Countdown Timer +
    @@ -24,6 +26,7 @@

    - + - + + \ No newline at end of file diff --git a/29 - Countdown Timer/scripts.js b/29 - Countdown Timer/scripts.js new file mode 100644 index 0000000000..52df292926 --- /dev/null +++ b/29 - Countdown Timer/scripts.js @@ -0,0 +1,94 @@ +let countdown; +const timerDisplay = document.querySelector('.display__time-left'); +const endTime = document.querySelector('.display__end-time'); +const buttons = Array.from(document.querySelectorAll('[data-time]')); + +function timer(seconds) { + clearInterval(countdown); + + const now = Date.now(); + const then = now + seconds * 1000; + displayTimeLeft(seconds); + displayEndingTime(new Date(then)); + + countdown = setInterval(() => { + const secondsLeft = Math.round((then - Date.now()) / 1000); + + if (secondsLeft < 0) { + return clearInterval(countdown); + } + + displayTimeLeft(secondsLeft); + }, 1000); +} + +function displayTimeLeft(seconds) { + const stringBuilder = []; + let unitCalculator = { remaining: seconds, value: 0 }; + const remaining = { seconds }; + + const hours = calculateUnits(remaining, 3600); + const hasHours = hours > 0; + if (hasHours) { + stringBuilder.push(hours); + } + + const minutes = calculateUnits(remaining, 60); + if (hasHours || minutes > 0) { + stringBuilder.push(formatUnits(minutes, /*zeroPrefix=*/ hasHours)); + } else { + stringBuilder.push(''); + } + + stringBuilder.push(formatUnits(remaining.seconds)); + + const display = stringBuilder.join(':'); + document.title = display; + timerDisplay.textContent = display; +} + +function displayEndingTime(endingTime) { + const hours = endingTime.getHours(); + const displayHours = hours > 12 ? hours - 12 : hours; + + const minutes = formatUnits(endingTime.getMinutes()); + + endTime.textContent = `Be back at ${displayHours}:${minutes}`; +} + +function calculateUnits(remaining, divisor) { + const { seconds } = remaining; + const units = Math.floor(seconds / divisor); + remaining.seconds = seconds % divisor; + return units; +} + +function formatUnits(units, zeroPrefix = true) { + return zeroPrefix && units < 10 ? `0${units}` : units; +} + +function handleButtonClick() { + const seconds = parseInt(this.dataset.time); + timer(seconds); +} + +function handleFormSubmit(e, callback) { + e.preventDefault(); + callback(); + this.reset(); +} + +buttons.forEach(button => button.addEventListener('click', handleButtonClick)); + +document.customForm.addEventListener('submit', function(e) { + e.preventDefault(); + const mins = parseFloat(this.minutes.value); + + if (isNaN(mins)) { + alert(`"${this.minutes.value}" is not a number!`); + } else { + timer(mins * 60); + } + + this.reset(); +}); diff --git a/29 - Countdown Timer/style.css b/29 - Countdown Timer/style.css index f240799477..b2d09eadc9 100644 --- a/29 - Countdown Timer/style.css +++ b/29 - Countdown Timer/style.css @@ -1,32 +1,43 @@ html { box-sizing: border-box; font-size: 10px; - background: #8E24AA; - background: linear-gradient(45deg, #42a5f5 0%,#478ed1 50%,#0d47a1 100%); + background: #8e24aa; + background: linear-gradient(45deg, #42a5f5 0%, #478ed1 50%, #0d47a1 100%); } -*, *:before, *:after { +*, +*:before, +*:after { box-sizing: inherit; } body { - margin:0; + margin: 0; text-align: center; font-family: 'Inconsolata', monospace; } +div.header { + display: flex; + flex-direction: column; +} + +div.header > * { + display: inline; +} + .display__time-left { font-weight: 100; font-size: 20rem; margin: 0; - color:white; - text-shadow:4px 4px 0 rgba(0,0,0,0.05); + color: white; + text-shadow: 4px 4px 0 rgba(0, 0, 0, 0.05); } .timer { - display:flex; + display: flex; min-height: 100vh; - flex-direction:column; + flex-direction: column; } .timer__controls { @@ -34,43 +45,43 @@ body { } .timer__controls > * { - flex:1; + flex: 1; } .timer__controls form { - flex:1; - display:flex; + flex: 1; + display: flex; } .timer__controls input { - flex:1; - border:0; - padding:2rem; + flex: 1; + border: 0; + padding: 2rem; } .timer__button { - background:none; - border:0; + background: none; + border: 0; cursor: pointer; - color:white; + color: white; font-size: 2rem; text-transform: uppercase; - background:rgba(0,0,0,0.1); - border-bottom:3px solid rgba(0,0,0,0.2); - border-right:1px solid rgba(0,0,0,0.2); - padding:1rem; + background: rgba(0, 0, 0, 0.1); + border-bottom: 3px solid rgba(0, 0, 0, 0.2); + border-right: 1px solid rgba(0, 0, 0, 0.2); + padding: 1rem; font-family: 'Inconsolata', monospace; } .timer__button:hover, .timer__button:focus { - background:rgba(0,0,0,0.2); - outline:0; + background: rgba(0, 0, 0, 0.2); + outline: 0; } .display { - flex:1; - display:flex; + flex: 1; + display: flex; flex-direction: column; align-items: center; justify-content: center; @@ -78,5 +89,5 @@ body { .display__end-time { font-size: 4rem; - color:white; + color: white; } diff --git a/30 - Whack A Mole/index.html b/30 - Whack A Mole/index.html new file mode 100644 index 0000000000..6ef9360d17 --- /dev/null +++ b/30 - Whack A Mole/index.html @@ -0,0 +1,178 @@ + + + + + + Whack A Mole! + + + + + + +
    +

    Whack-a-mole! +   +   +

    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/30 - Whack A Mole/style.css b/30 - Whack A Mole/style.css index 8fec3f5d8e..91ea43fce3 100644 --- a/30 - Whack A Mole/style.css +++ b/30 - Whack A Mole/style.css @@ -4,36 +4,54 @@ html { background: #ffc600; } -*, *:before, *:after { +*, +*:before, +*:after { box-sizing: inherit; } body { padding: 0; - margin:0; + margin: 0; font-family: 'Amatic SC', cursive; } +div.header { + display: flex; + justify-content: space-around; + align-items: baseline; +} + +div.header h1 span { + margin-right: 5px; +} + +div.header button { + font-family: 'Amatic SC', cursive; + font-size: 10rem; + background: #ffc600; +} + h1 { text-align: center; font-size: 10rem; - line-height:1; + line-height: 1; margin-bottom: 0; } -.score { - background:rgba(255,255,255,0.2); - padding:0 3rem; - line-height:1; - border-radius:1rem; +.score, +#timeRemaining { + padding: 0 3rem; + line-height: 1; + border-radius: 1rem; } .game { - width:600px; - height:400px; - display:flex; - flex-wrap:wrap; - margin:0 auto; + width: 600px; + height: 400px; + display: flex; + flex-wrap: wrap; + margin: 0 auto; } .hole { @@ -45,25 +63,25 @@ h1 { .hole:after { display: block; background: url(dirt.svg) bottom center no-repeat; - background-size:contain; - content:''; + background-size: contain; + content: ''; width: 100%; - height:70px; + height: 70px; position: absolute; z-index: 2; - bottom:-30px; + bottom: -30px; } .mole { - background:url('mole.svg') bottom center no-repeat; - background-size:60%; + background: url('mole.svg') bottom center no-repeat; + background-size: 60%; position: absolute; top: 100%; width: 100%; height: 100%; - transition:all 0.4s; + transition: all 0.4s; } .hole.up .mole { - top:0; + top: 0; } diff --git a/HtmlBuilder.css b/HtmlBuilder.css new file mode 100644 index 0000000000..a2d7ac9ba5 --- /dev/null +++ b/HtmlBuilder.css @@ -0,0 +1,60 @@ +body { + font-family: sans-serif; +} + +table { + border: 1px solid #ffffff; + width: 350px; + height: 200px; + border-collapse: collapse; + margin-bottom: 1em; +} + +table td, +table th { + border: 1px solid #ffffff; + padding: 3px 2px; +} + +table tbody td { + font-size: 16px; +} + +table tr:nth-child(even) { + background: #d0e4f5; +} + +table thead { + background: #0b6fa4; + border-bottom: 5px solid #ffffff; +} + +table thead th { + font-size: 17px; + font-weight: bold; + color: #ffffff; + border-left: 2px solid #ffffff; + text-align: left; +} + +table thead th:first-child { + border-left: none; +} + +table tfoot { + font-size: 14px; + font-weight: bold; + color: #333333; + background: #d0e4f5; + border-top: 3px solid #444444; +} + +table tfoot td { + font-size: 14px; +} + +table caption { + font-weight: bold; + text-align: left; + padding-bottom: 2px; +} diff --git a/HtmlBuilder.js b/HtmlBuilder.js new file mode 100644 index 0000000000..cb0f85d414 --- /dev/null +++ b/HtmlBuilder.js @@ -0,0 +1,82 @@ +/** + * Tool for challenges where Wes uses console.log and console.table. Used to render to page instead. + */ +class HtmlBuilder { + constructor() { + this.html = []; + } + + appendHtml(htmlString) { + this.html.push(htmlString); + } + + appendElement(tagName, value, attributes) { + const adjustedAttributes = attributes ? ' ' + attributes : ''; + this.appendHtml(`<${tagName}${adjustedAttributes}>${value}`); + } + + appendPageHeader(text) { + this.appendElement('h1', text); + } + + appendSectionHeader(text) { + this.appendElement('h2', text); + } + + appendParagraph(text, attributes) { + this.appendElement('p', text, attributes); + } + + getPropertyNamesForArray(items) { + if (items && items.length) { + const item = items[0]; + if (typeof item === 'object') { + return Object.getOwnPropertyNames(item); + } + } + + return []; + } + + appendTable(caption, items, displayCount = true) { + this.appendHtml(''); + + const itemCount = items ? items.length : 0; + const itemCountString = displayCount ? ` (count: ${itemCount})` : ''; + this.appendElement('caption', `${caption}${itemCountString}`); + + const propertyNames = this.getPropertyNamesForArray(items); + const isObjectArray = propertyNames.length > 0; + this.appendHtml(''); + propertyNames.forEach(name => this.appendElement('th', name)); + this.appendHtml(''); + + this.appendHtml(''); + items.forEach(item => { + this.appendHtml(''); + if (isObjectArray) { + propertyNames.forEach(name => this.appendElement('td', item[name])); + } else { + this.appendElement('td', item); + } + this.appendHtml(''); + }); + this.appendHtml(''); + + this.appendHtml('
    '); + } + + appendObjectHtml(caption, obj) { + const json = JSON.stringify(obj, null, 2); + + html.appendHtml('
    '); + html.appendHtml(`${caption}:`); + html.appendHtml(`
    ${json}
    `); + html.appendHtml('
    '); + } + + render(selector) { + const elem = document.querySelector(selector); + elem.innerHTML = this.html.join(''); + } +} diff --git a/index.html b/index.html new file mode 100644 index 0000000000..de2d8f8bd1 --- /dev/null +++ b/index.html @@ -0,0 +1,119 @@ + + + + + + JavaScript 30 - Brian Schroer + + + + +

    Brian Schroer's solutions for JavaScript 30

    +
    +
    + + + + + + \ No newline at end of file