Drag & Drop With Vanilla JS

Sdílet
Vložit
  • Äas pÅ™idán 26. 08. 2024
  • In this video we will take a look at drag events in JavaScript to be able to create drag and drop functionality
    Code:
    codepen.io/bra...
    💖 Become a Patron: Show support & get perks!
    / traversymedia
    Website & Udemy Courses
    www.traversymed...
    Follow Traversy Media:
    / traversymedia
    / traversymedia
    / traversymedia
    The Developer Hangout: Public Discord Server
    / discord

Komentáře • 407

  • @TraversyMedia
    @TraversyMedia  PÅ™ed 6 lety +56

    I forgot to mention I do have a 21 hour course on vanilla JS on Udemy if anyone is interested here is a $10 code.
    www.udemy.com/modern-javascript-from-the-beginning/?couponCode=CZcams10

    • @jolyonfavreau3160
      @jolyonfavreau3160 PÅ™ed 6 lety +2

      bought it and have been working through it slowly. excellent course, full of easy to follow content.

    • @hossameldinshaheen5366
      @hossameldinshaheen5366 PÅ™ed 6 lety

      Are you will make react course i mean react front to back like angular not the course that you explain projects, please we need essential course with projects.

    • @slinco65
      @slinco65 PÅ™ed 6 lety

      Working through it now - great course Brad! Anyone who wants to _really_ know javascript should take Brad's course ;-)

    • @dadev3668
      @dadev3668 PÅ™ed 6 lety

      Definitly a great course I just got past the ajax part and it's great I can finally do some kool apps with my laravel backends, I do have one request for once if you can get a chance to do a tailwind css course that would be great Thanks Brad

    • @albertgalvez2556
      @albertgalvez2556 PÅ™ed 6 lety

      Got it and can't wait to go through it.

  • @mohammadakbar32
    @mohammadakbar32 PÅ™ed 6 lety +72

    i was looking for drag n drop! thanks Brad! God bless you and your family

  •  PÅ™ed 6 lety +79

    Hi. Thanks for an amazing tutorial as always! I would do two improvements to this code:
    1. requestAnimationFrame() instead of setTimeout()
    2. classList.add() & classList.remove() instead of manipulating className string
    Thanks again! Keep on doing amazing work!

    • @coced
      @coced PÅ™ed 5 lety +9

      classList.toggle is pretty neat too

    • @icarofilho6524
      @icarofilho6524 PÅ™ed 3 lety

      I just used requestAnimationFrame and it works great thank you.

    • @Maxim9575
      @Maxim9575 PÅ™ed 3 lety

      About rAF that function works on similar principles like setTimeout, but there is one thing which change everything. setTimeout based on queues executed codes (rude but it is), every setTimeout in running code is set at the end of such queue, and when queue will come to the next setTimeout, that setTimeout will be execute. rAF practically is same, but it will be invoked also like setTimeout but with one optimization thing, it's synchronization with HZ of your display. So rAF may be called faster than setTimeout or against slower, it all depends on your monitor mostly.
      You should see lecture about Event Loop or Jake Archibald: In The Loop.

  • @kariminic
    @kariminic PÅ™ed 6 lety +29

    These new videos can be overwhelming, I am trying to stick to learning just a few web development languages that fit within my schedule but EVERY pop UP notification from Brad, are irresistible.. There is a new thing to learn or a word for motivation to upcoming developers..Thanks Brad, You the best.

    • @TraversyMedia
      @TraversyMedia  PÅ™ed 6 lety +9

      I realize that. What I always suggest is having a core set of technologies that you REALLY dig into and learn through various resources BUT it does not hurt to watch and learn other things just to grasp the coding concepts, etc. A lot of time it will help you in just general logic and understanding in programming in general.

    • @kariminic
      @kariminic PÅ™ed 6 lety +3

      Traversy Media Thanks a bunch, you always a source of my Motivation..

    • @raymondmichael4987
      @raymondmichael4987 PÅ™ed 6 lety

      Great point Sam C

  • @MrThejhubs
    @MrThejhubs PÅ™ed 4 lety +2

    I gotta say, as far as content, this is one of the best tuts I've watched. You described the topic of the video (drap & drop & their listeners) on a basic level without going into every single other feature you were using (callbacks, timeouts, etc.). A simple thing, but my biggest complaints on other tutorial channels. I came here to learn drag and drop, and I did. Thank you, subbed.

  • @scorpionesp6510
    @scorpionesp6510 PÅ™ed 2 lety +1

    Bruh, I love your teaching style, and how you are so clear and how you show how things work instead of just watching you code. Purchased a bunch of your courses to support and subscribed (yes aiming for a cookie here) but love your lessons and thanks!

  • @arpanmukherjee4625
    @arpanmukherjee4625 PÅ™ed 6 lety +26

    Love this channel....I have learnt Laravel, Vue.js, Building REST Service and what not....Best of the best.....

  • @LordN3r3v4r
    @LordN3r3v4r PÅ™ed 6 lety +14

    domElement.classList.toggle('hovered'); Way easier to understand and the support is there (for IE), as long as you use just one parameter (the class name string). There are also .add(), .remove(), .contains() and .replace() methods for dealing with CSS classes. Nice video!

  • @hardikmodi8234
    @hardikmodi8234 PÅ™ed 6 lety +17

    Whenever I think of implementing something in project, on the very next day sir Brad have Video on that. Really amazing. Thank you very much for your great efforts.

  • @glenn_r_frank_author
    @glenn_r_frank_author PÅ™ed 4 lety +3

    Thank you for such a complete tutorial for basics and beginners on this. I love how you took the time to show us the consolw events firing off .. really made it so much more understandable!

  • @wesstephenson4533
    @wesstephenson4533 PÅ™ed 5 lety

    I wish more people taught like you do. You not only make sure I understand, but you explain things in a way that I can't misunderstand. I love it!

  • @mihkelsiim761
    @mihkelsiim761 PÅ™ed 4 lety

    These console messages were really useful. It helped me a lot to understand when what is run.

  • @jopeme_official
    @jopeme_official PÅ™ed 3 lety

    Your videos don't get more helpful than this. Thank you so much for not only teaching us this but do it in a way that ANYONE can understand. Truly appreciate you, man!

  • @jatinraj4974
    @jatinraj4974 PÅ™ed 6 lety +21

    Love your work sir 😠. Now I am 14year old and learned js and done few projects just because of you .You gave me love for coding thanks sir .😊

    • @TraversyMedia
      @TraversyMedia  PÅ™ed 6 lety +5

      That is awesome. I wish I got started that young. Keep that up and you'll run circles around other devs when you're older

    • @PlotTwists
      @PlotTwists PÅ™ed 6 lety

      you swapped your age numbers ... it's 21

    • @jatinraj4974
      @jatinraj4974 PÅ™ed 6 lety +2

      Male Man what to say ..haters come every where .You do your work I will do mine.Thanks 😊😊😊😊

    • @jatinraj4974
      @jatinraj4974 PÅ™ed 6 lety

      Traversy Media thanks for this advice sir 😊 love for code😋

  • @Navarragirl27
    @Navarragirl27 PÅ™ed 5 lety

    The one and only Brad, who can explain JS so well anyone can understand. Thank you very much :)

  • @daalwada
    @daalwada PÅ™ed 3 lety +1

    Basics of Kanban board 😅 Amazing work Brad! I am really glad there are developers like you who exist to contribute genuinely to teach people! Great tutorial 😊ðŸ‘

  • @kingundfaker
    @kingundfaker PÅ™ed 5 lety

    14:08 You can mark the lines you want to copy and then shift+alt+arrow key to instantly copy&paste.
    Nice Guide on Drag & Drop! You helped me implenting this on my Dungeon & Dragons Browser Game :)

    • @TraversyMedia
      @TraversyMedia  PÅ™ed 5 lety

      Thanks, yeah I learned that a bit after this video :)

  • @theWanAndOnly
    @theWanAndOnly PÅ™ed 4 lety

    man, javascript has advanced over the years. It's really intuitive and easy to do all these complex things now. Hooray for progress! And thanks for your tutorial btw, making it look effortless is not easy, you're doing it good man.

  • @mn6210
    @mn6210 PÅ™ed 6 lety

    Thanks for the free drag and drop tutorial. Whenever I need something related to programming language , first thing comes to my mind is this channel(traversy media). Your channel is in top of my list. I appreciate your work..

  • @juditzentai1517
    @juditzentai1517 PÅ™ed 4 lety

    This video is very helpful. I just want to mention that I used a different solution to see only 1 picture while being dragged, under the cursor and not on the original place. I simply added to the . hold in the CSS an opacity: 0% attribute. This way while the picture is being dragged, the original picture in the original place becomes invisible. This might not be the most elegant solution but you do not have to use setTimeout().
    Anyway, you just shortened my home assignment a lot so thank you! :)

  • @Soumya21st
    @Soumya21st PÅ™ed 6 lety +10

    Brad is a Javascript Rockstar in the youtube earth

  • @vitalikda
    @vitalikda PÅ™ed 5 lety +11

    Issue on Firefox: it requires the `dataTransfer.setData` function in the dragStart event. Something like this:
    function dragStart(e) {
    this.className += ' hold';
    e.dataTransfer.setData('text', '');
    setTimeout(() => (this.className = 'invisible'), 0);
    }

  • @myhandle370
    @myhandle370 PÅ™ed 2 lety

    Short video and straight to the point. Excellent!

  • @Jadraptor
    @Jadraptor PÅ™ed 6 lety

    Thank you for doing these sorts of videos. It makes it easy for me to learn at my own speed.
    This was also not nearly as complex as I thought it would be. I have a new understanding for how to structure such things in vanilla.

  • @limitless9483
    @limitless9483 PÅ™ed 4 lety

    As someone who hasn't started learning frameworks yet, this helps me a lot, will implement it in my js game, thanks brad.

  • @tonniewhiteley2497
    @tonniewhiteley2497 PÅ™ed 6 lety

    You know I was on the train home yesterday dead tired and I went on CZcams to watch some chill videos and I saw that one and I got sooo excited that even after a whole day of work I had to watch this :D thanks Brad :)))

  • @arturluisoliveira
    @arturluisoliveira PÅ™ed 4 lety

    thanks brad, I've studied javascript in your channel for a while and recently at my first task end up in here again! hahaha. thanks for the knowledge, happy new year.

  • @khudoyorrakhmatov7530
    @khudoyorrakhmatov7530 PÅ™ed 2 lety

    The way Brad delivers content is next level. After having watched his videos for some time, I became a picky learner.

  • @YuriiKratser
    @YuriiKratser PÅ™ed 5 lety

    Didn't you create a great course "modern js ..." if it was you, you are super teacher!

  • @canimcanimnazlim
    @canimcanimnazlim PÅ™ed 2 lety

    i love the way you try to make us understand whats going on really :)

  • @K8Tech
    @K8Tech PÅ™ed 6 lety

    You struggle searching how to do something with your app... Brads got you.
    Thanks man!!!

  • @AetherXIV
    @AetherXIV PÅ™ed 3 lety

    your tutorial style is excellent. thank you so much man. clear and easy to follow

  • @VeeWebCode
    @VeeWebCode PÅ™ed 6 lety +16

    Sir, your tutorials are so awesome..

  • @eoussama
    @eoussama PÅ™ed 6 lety +5

    You never fail to amaze Brad, splendid tutorial, god bless you and your family, keep up the hard work ðŸ‘.

  • @expchrfir
    @expchrfir PÅ™ed 5 lety

    im doing my first js applicationa and you have some great content. not the first time this week im ending up with a video of yours. Cheers!

  • @sergegoujon8022
    @sergegoujon8022 PÅ™ed 6 lety

    Worth mentioning that it's usually faster to grab an element with specific class by using .getElementsByClassName() instead of .querySelector().

  • @AdegbengaAgoroCrenet
    @AdegbengaAgoroCrenet PÅ™ed 6 lety

    This is a great tutorial. I would traditionally implement this with a library but now I am definitely going to be doing pure Vanilla for these. Thanks Brad

  • @hollidaycursive
    @hollidaycursive PÅ™ed 3 lety

    I don't know if anyone else ran into this, but if you click on the background on accident instead of the image and drag, you are actually highlighting the div or divs.
    If you then grab the image while more than one div is highlighted, you will make the image disappear. Upon searching for the div in the inspector, you will find that it's invisible.
    To fix this, add "user-select: none;" to the "empty" class in your css and it will prevent this from happening!

  • @lucasa8710
    @lucasa8710 PÅ™ed 4 lety

    this is the best video i have ever seen, i mean, the way you explain it is really amazing; sorry about my english.

  • @jamalabdullahi8155
    @jamalabdullahi8155 PÅ™ed 6 lety +2

    Many thanks brad this is what I was trying to do this week

  • @00el04
    @00el04 PÅ™ed 4 lety +1

    nice, might change this into a drag and drop game

  • @RufusVidS
    @RufusVidS PÅ™ed 4 lety

    Terrific tutorial as usual. The only one comment I felt was missing was the fact that the .append() method removes the element from its prior container automatically (which is clear as you watch the elements in the Developer Tool window), but I remember wondering why there wasn't a remove() method to detach an element from the original container.

  • @gavincoulson3900
    @gavincoulson3900 PÅ™ed 3 lety

    Brad I cannot tell you how much I appreciate your videos. Please keep making this amazing content. Love your channel and love your Udemy courses.

  • @yolo-mb4cy
    @yolo-mb4cy PÅ™ed 5 lety +2

    2 questions:
    1. How did it work with setTimeout()
    2. Why is it good to use const empty in the for loop?

  • @fogreyiz
    @fogreyiz PÅ™ed 5 lety

    Excellent tutorial without unnecessary and complicated details.

  • @TheFGrox
    @TheFGrox PÅ™ed 6 lety

    You may even use the "add(string[])" and "remove(string[])" methods of the property "classList" of an HTML element to add or remove CSS classes from it. The code will be a little more readable at first glance doing so.

  • @misterz5908
    @misterz5908 PÅ™ed 4 lety

    Please Brad can you do more this kind of short and very useful courses !ðŸ™
    And Thanks a lot! We love you💕

  • @LesAnimes
    @LesAnimes PÅ™ed 5 lety +1

    Man come on!!! you make everything look extremely easy, you are the one, God bless you

  • @cyt4638
    @cyt4638 PÅ™ed 3 lety

    Awesome tutorials for drag events in front-end design! Thank you Brad!

  • @WinkkleBoss28023
    @WinkkleBoss28023 PÅ™ed 6 lety

    Thank you, sir.
    because of you, I was able to learn HTML, CSS, js and bootstrap in my summer vacations.
    god bless you and your family.

  • @joduaxddddd
    @joduaxddddd PÅ™ed 6 lety +2

    I've been looking for this for the past few days

  • @leoniduvarov6565
    @leoniduvarov6565 PÅ™ed 6 lety

    I'll be using this for my final project at my internship. Thank you!

  • @Yiosho
    @Yiosho PÅ™ed 6 lety

    Wish I could've had this video some months back when I had to do this at my first job... In the end had to settle using jQuery. Really nice video, thank you!

  • @nahabiz
    @nahabiz PÅ™ed 6 lety +1

    Great tutorial, as always, Brad. Could you do a part 2 where all the divs are filled but if you pick up an image from one div, and drop it on another filled div, the image from the first div replaces that from the second div. On drop, the image from the second div, would move to the now empty first div. I hope this make sense.

  • @erayeroglu8175
    @erayeroglu8175 PÅ™ed 6 lety

    Your pronounciation and expression is very clear, I can easily understand you. Thanks bro

  • @steveymcneckbeard
    @steveymcneckbeard PÅ™ed 6 lety +1

    Oh Brad you do make my day, thank you so much for all your hard work!

  • @hemaethossain4946
    @hemaethossain4946 PÅ™ed 6 lety +7

    Love you Brad. You're a nice guy!

  • @vovaparkhomchuk
    @vovaparkhomchuk PÅ™ed 6 lety

    You are the best Brad! Thank you very much. Every time I watch your videos, I learn something new, simple and (that is important) very interesting

  • @ThePredictR4036
    @ThePredictR4036 PÅ™ed 2 lety +1

    Really Huge THANKS!!! You made something, what is really useful with this video! Thank You so much again!

    • @xplodivity
      @xplodivity PÅ™ed 2 lety

      I followed this tutorial and took it forward by adding swap, add and delete functionality along with drag and drop. Have a look if you are interested
      czcams.com/video/AAmx-WWKCKM/video.html

  • @zachbaird2851
    @zachbaird2851 PÅ™ed 6 lety

    I saw this on my CZcams dash and said "Yeeeeeees". Love the tutorials, Brad!

  • @Oswee
    @Oswee PÅ™ed 6 lety

    Select code and press Alt + Shift + Arrow Down. :) Would like to see the same stuff but with some table rows. Like re-ordering tasks by their number of priority (with actually changing number of priority/or order).

  • @saikumardesu1700
    @saikumardesu1700 PÅ™ed 2 lety

    Thank you very much for sharing, exact video I was looking for.

  • @birsingh5388
    @birsingh5388 PÅ™ed 6 lety

    Just buy your Vanilla JavaScript course, I hope I will learn lots of new things from that udemy course. Thank you, Brad.

  • @johnaspinall8773
    @johnaspinall8773 PÅ™ed 2 lety

    Excellent video Brad, just what I was after! Could you explain the invisible and doubling box again where you used setTimeout? I couldnt see any visual difference?

  • @quechon1
    @quechon1 PÅ™ed 6 lety

    Im a python guy but with your videos i have learnt a lot thanks for the time youbput on this man

  • @xenialxerous2441
    @xenialxerous2441 PÅ™ed 6 lety

    Hey Brad! I can't thank you enough for sharing your knowledge & helping others achieve their goals.. thank you so much. I wanna be one of your Patron in a near future!!

  • @ItsUreBoy446
    @ItsUreBoy446 PÅ™ed 6 lety

    Great video! Figured since this is JavaScript, I’d throw out a suggestion for a future video. I’m interested in a video showing the use of lazy loading images on a site with many of them, so that images below and even above of the viewport are temporarily removed to reduce browser strain

  • @continental_drift
    @continental_drift PÅ™ed 6 lety +4

    Interesting and helpful, It works in Chrome, almost works in Edge and in Firefox the image disappears as soon as I begin to drag on it. Javascript is enabled in Firefox but Edge I can't find the supposed place to check it.

    • @shioli3927
      @shioli3927 PÅ™ed 5 lety +2

      Firefox does support HTML5 draggable. But it does not automatically figure out what´s the data to be moved. As chrome does. If you don´t tell it anything.
      You have to add
      let img = new Image();
      img.src = "source.unsplash.com/random/150x150";
      e.dataTransfer.setData("image", img);
      into dragStart(e)

    • @sucetonraisin
      @sucetonraisin PÅ™ed 5 lety

      @@shioli3927 I was struggling with this, thanks for sharing this information!

  • @aayush_dutt
    @aayush_dutt PÅ™ed 6 lety +1

    I love this channel

  • @stephh4392
    @stephh4392 PÅ™ed 6 lety +1

    Another high quality video!!! I learned so much updated JS from you, thank u, sir^_^

  • @lukasdemmer1605
    @lukasdemmer1605 PÅ™ed 6 lety

    very good video and explanation, i found what i searched for

  • @gorki90
    @gorki90 PÅ™ed 6 lety

    Great video. It's incredible how you keep doing videos explaining things I would need to look up in near future.

  • @FordExplorer-rm6ew
    @FordExplorer-rm6ew PÅ™ed 4 lety +1

    Seeing this in es5 would be cool.
    Hard to tell what I have to do to use this in production.
    Have re written most of it in es5 but,
    12:00 *this* keyword binds to something different in es5 vs es6

  • @calvinrosehart7042
    @calvinrosehart7042 PÅ™ed 4 lety +1

    Great job explaining everything, very much appreciated!

  • @michaeljfordham
    @michaeljfordham PÅ™ed 5 lety

    Really, really great video and in-depth explanation. Thanks for sharing Brad!

  • @blacklotus1606
    @blacklotus1606 PÅ™ed 6 lety

    to be honest amazing tuts, i was looking for something like it..., and the console.log explanation was top notch.

  • @rohitdalal954
    @rohitdalal954 PÅ™ed 6 lety

    Awesome tutorial :). I was thinking of doing it yesterday and you made it easier! Thanks:)

  • @agustinlavalla8892
    @agustinlavalla8892 PÅ™ed 4 lety

    Very instructive and useful. Thanks!

  • @Haresh1270
    @Haresh1270 PÅ™ed 3 lety

    Fantastic, this is what I was looking for

  • @diogopachecopedro6345
    @diogopachecopedro6345 PÅ™ed 4 lety

    @travery media - thanks for that. super fun lunch project

  • @lucasbertoldo5062
    @lucasbertoldo5062 PÅ™ed 3 lety

    Exactly what I was looking for. Thanks, Brad, for save me one more time!

  • @sulpher9
    @sulpher9 PÅ™ed 6 lety

    Appreciate the explanation of what is going on - good stuff!

  • @Ash-em5pm
    @Ash-em5pm PÅ™ed 6 lety

    You are awesome Brad, and i really missed your facecam, hope you are now all set up with your new office,expecting a new setup tour soon:)

    • @FunIsGoingOn
      @FunIsGoingOn PÅ™ed 6 lety

      Ash Klmepton Seems like he had to drag and drop so much stuff in real life that the idea of this tut was born 😂

  • @mr.c7411
    @mr.c7411 PÅ™ed 3 lety

    Best programming channel🙌

  • @carlotadias9335
    @carlotadias9335 PÅ™ed 2 lety

    Amazing explanation and very simple and direct! Thank you!

  • @danielmichael5922
    @danielmichael5922 PÅ™ed 6 lety +3

    great tutorial. it worked on Google chrome, opera browser and Internet explorer 11. it didn't work on Firefox quantum. it just didn't work. please try it and tell me how to fix it. Another thing is, i got warnings from Vs Code that const can only be used in ES6...

  • @lorgaraurelian1480
    @lorgaraurelian1480 PÅ™ed 5 lety

    Thank you, man. A very good introduction to drag&drop event.

  • @abdelabdel8089
    @abdelabdel8089 PÅ™ed 5 lety

    I can not thank you enough man. You are saving my day almost everyday!

  • @sasikantnair
    @sasikantnair PÅ™ed 5 lety

    Thank you. People might not be familiar with 'this' method during beginner stages, so could've been better if this was accomplished without 'this'. The video was good. You're good at explaining things. Keep it up.

  • @PlotTwists
    @PlotTwists PÅ™ed 6 lety

    Nice video very clear and simple and strait to the point, keep up the good work

  • @AndreSpeek
    @AndreSpeek PÅ™ed 6 lety +1

    Hey Brad... Another great tutorial, thank! Only thing I noticed that this doesn't work on a touchscreen or mobile... I tried to look for solutions but I just found lots of questions and no good answers so far... Do you know how to do this?

    • @DopEZTam
      @DopEZTam PÅ™ed 3 lety

      have u found out yet

  • @kuvinci
    @kuvinci PÅ™ed 6 lety

    *Awesome!* I was struggling to do good drag&drop on es5 but it's so much easier on es6

  • @softafrica
    @softafrica PÅ™ed 5 lety

    You are the best man, simply the best. Your tutorials have so much helped me especially for Vanilla js. Thanks and
    God bless You

  • @n_fan329
    @n_fan329 PÅ™ed 5 lety

    Brad Traversy !! I love you brother from the bottom of my heart, you really changed my life :)

  • @dataenthusiast6721
    @dataenthusiast6721 PÅ™ed 3 lety

    If you're struggling to drag multiple images on multiple div boxes, it's better to use dataTransfer. Here is how it can be done:
    Assuming you have multiple images, you can use for(img of images){//dragStart event & dragEnd event}.
    You can then go on to write the event functions
    function dragStart(e){
    e.preventDefault();
    //set the id of the target image
    e.dataTransfer.setData('text', e.target.id);
    }
    function dragDrop(){
    //Your codes
    }
    In your dragDrop function for the empty boxes, you can write
    function dragDrop(e){
    e.preventDefault();
    //get the id of the dragged image
    id = e.dataTransfer.getData('text');
    //append the dragged image
    this.append(document.getElementById(id));
    }
    It took me sometime to figure this out until I learned about how to use dataTransfer.
    Hope this is helpful.

  • @user-ff2et9rx5l
    @user-ff2et9rx5l PÅ™ed 4 lety

    Your tutorials are awesome!

  • @h0ckeyd
    @h0ckeyd PÅ™ed 4 lety

    This is awesome. If I wanted to add another picture, would I, for example just repeat this process?

  • @TruthSeekerClub
    @TruthSeekerClub PÅ™ed 3 lety

    very simple and neat

  • @josuejure6127
    @josuejure6127 PÅ™ed 2 lety

    Hi, could you explain to me why in that particular instance a for loop doesn't work?

  • @Mental1993
    @Mental1993 PÅ™ed 6 lety

    Amazing work once again.
    I also support you on Patreon. Never regret a single dollar spent.