Donate blood, help people. Find out which blood types does your donated blood goes to.
Not responsive [yet]
| - | |
| var BLOOD_TYPES = ["O−", "O+", "A−", "A+", "B−", "B+", "AB−", "AB+"]; | |
| mixin bloodSelector(value) | |
| div= value | |
| mixin bloodTypeMixin(value, side) | |
| .human(class=side) | |
| .scribble | |
| span.blood_type= value | |
| .head | |
| .body | |
| .via | |
| .blood_via | |
| #about | |
| .mySocial | |
| a.social( | |
| href="https://www.linkedin.com/in/rominamartinlib/", | |
| target="_new" | |
| ) | |
| i.fab.fa-linkedin | |
| a.social(href="https://rominamartin.github.io/", target="_new") | |
| i.fab.fa-github | |
| a.social(href="https://twitter.com/rominamartinlib", target="_new") | |
| i.fab.fa-twitter | |
| a.social(href="https://donatinghelps.com/", target="_new") | |
| i.fas.fa-globe | |
| #content | |
| h3= 'Select the donor blood type:' | |
| #blood_selector | |
| each type in BLOOD_TYPES | |
| +bloodSelector(type) | |
| #blood_content | |
| .bar | |
| .main_bag | |
| .blood | |
| #center_via_c | |
| .center_via | |
| .blood_via | |
| #humans | |
| each type, index in BLOOD_TYPES | |
| if (index % 2) | |
| +bloodTypeMixin(type, "right") | |
| else | |
| +bloodTypeMixin(type, "left") |
| const humans_parent = document.getElementById("humans"); | |
| const BLOOD_TYPES = { | |
| "O−": ["O−", "O+", "A−", "A+", "B−", "B+", "AB−", "AB+"], | |
| "O+": ["O+", "A+", "B+", "AB+"], | |
| "A−": ["A−", "A+", "AB−", "AB+"], | |
| "A+": ["A+", "AB+"], | |
| "B−": ["B−", "B+", "AB−", "AB+"], | |
| "B+": ["B+", "AB+"], | |
| "AB−": ["AB−", "AB+"], | |
| "AB+": ["AB+"] | |
| }; | |
| const reset_button = document.getElementById("reset"); | |
| const selector = document.getElementById("blood_selector"); | |
| const blood_vias = document.querySelectorAll("#humans .human .blood_via"); | |
| const blood_bag = document.querySelector("#blood_content > div.main_bag > div"); | |
| const center_via = document.querySelector(".center_via > .blood_via"); | |
| const blood_types = document.querySelectorAll(".blood_type"); | |
| let lastCalled; | |
| addListeners(); | |
| function callIfChildren(e) { | |
| if (lastCalled) change(); | |
| if (e.target !== this) setRecipents(e); | |
| } | |
| function addListeners() { | |
| selector.addEventListener("click", callIfChildren); | |
| reset.addEventListener("click", reset); | |
| } | |
| function reset() { | |
| change(); | |
| blood_bag.style.height = "100px"; | |
| center_via.style.height = "0px"; | |
| } | |
| function change() { | |
| lastCalled.target.classList.remove("highlight"); | |
| for (let i = 0; i < blood_vias.length; i++) { | |
| blood_vias[i].style.width = "0px"; | |
| blood_types[i].classList.remove("highlightText"); | |
| } | |
| } | |
| function timeout(ms) { | |
| return new Promise((resolve) => setTimeout(resolve, ms)); | |
| } | |
| async function setRecipents(e) { | |
| e.target.classList.add("highlight"); | |
| lastCalled = e; | |
| const donor = e.target.innerText; | |
| for (let item of BLOOD_TYPES[donor]) { | |
| const recipent_index = Object.keys(BLOOD_TYPES).indexOf(item); | |
| const height = 50 + 50 * Math.floor(recipent_index / 2); | |
| const blood_height = 125 - 25 * Math.floor(recipent_index / 2); | |
| blood_bag.style.height = `${blood_height}px`; | |
| center_via.style.height = `${height}px`; | |
| await timeout(100); | |
| blood_vias[recipent_index].style.width = "100%"; | |
| blood_types[recipent_index].classList.add("highlightText"); | |
| } | |
| } |
| $wires_color: #ccc; | |
| $human_color: #666; | |
| $blood_color: #b51e23; | |
| $transition_time: 1s; | |
| $global_background: #f7f7f7; | |
| body { | |
| overflow-y: hidden; | |
| background: $global_background; | |
| font-family: "Montserrat", sans-serif; | |
| } | |
| #about { | |
| position: absolute; | |
| top: 10px; | |
| left: 10px; | |
| z-index: 2; | |
| a { | |
| display: inline-block; | |
| height: 2.5em; | |
| margin: 0 5px; | |
| } | |
| a i { | |
| font-size: 1.5em; | |
| &.fa-linkedin { | |
| color: #0073b0; | |
| } | |
| &.fa-github, | |
| &.fa-globe { | |
| color: #24292e; | |
| } | |
| &.fa-twitter { | |
| color: #1da1f2; | |
| } | |
| } | |
| } | |
| #content { | |
| position: relative; | |
| margin: 50px auto; | |
| width: 600px; | |
| height: 600px; | |
| } | |
| h3 { | |
| position: absolute; | |
| top: 0px; | |
| left: 0px; | |
| } | |
| #blood_selector { | |
| display: grid; | |
| grid-template-columns: repeat(4, 1fr); | |
| grid-template-rows: 1fr 1fr; | |
| grid-gap: 5px; | |
| width: 200px; | |
| height: 100px; | |
| position: absolute; | |
| left: 10px; | |
| top: 45px; | |
| z-index: 2; | |
| div { | |
| user-select: none; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| background-color: $global_background; | |
| border: 1px solid $blood_color; | |
| border-radius: 25%; | |
| } | |
| div:hover { | |
| border: 1px solid #1da1f2; | |
| font-weight: bold; | |
| cursor: pointer; | |
| } | |
| } | |
| #blood_content { | |
| position: absolute; | |
| top: 50px; | |
| width: 100%; | |
| height: 100%; | |
| } | |
| #center_via_c { | |
| position: absolute; | |
| z-index: 1; | |
| width: 100%; | |
| height: 100%; | |
| .center_via { | |
| width: 8px; | |
| background: $wires_color; | |
| height: 200px; | |
| position: absolute; | |
| left: 304px; | |
| top: 276px; | |
| } | |
| .blood_via { | |
| height: 0; | |
| background-color: $blood_color; | |
| right: 50%; | |
| width: 8px; | |
| transition: height $transition_time/4; | |
| } | |
| } | |
| .bar { | |
| position: fixed; | |
| right: 0; | |
| top: 55px; | |
| width: 55%; | |
| height: 8px; | |
| border-radius: 2px 0 0 2px; | |
| background-color: $wires_color; | |
| } | |
| .main_bag { | |
| position: absolute; | |
| width: 100px; | |
| height: 140px; | |
| top: 70px; | |
| left: 250px; | |
| border-radius: 30px; | |
| opacity: 0.8; | |
| background-color: rgba(154, 207, 234, 0.9); | |
| border: 8px solid rgba(154, 207, 234, 0.9); | |
| .blood { | |
| position: absolute; | |
| left: 0; | |
| bottom: 0; | |
| width: 100%; | |
| height: 100px; | |
| background-color: $blood_color; | |
| border-radius: 0 0 35px 35px; | |
| transition: height $transition_time; | |
| &::before { | |
| content: ""; | |
| position: absolute; | |
| top: -6px; | |
| width: 100%; | |
| height: 10px; | |
| background-color: #92191b; | |
| border-radius: 100%; | |
| } | |
| } | |
| &::before { | |
| content: ""; | |
| position: absolute; | |
| top: -118px; | |
| left: 45%; | |
| width: 10%; | |
| height: 110px; | |
| background-color: $wires_color; | |
| } | |
| } | |
| #humans { | |
| position: absolute; | |
| top: 276px; | |
| width: 400px; | |
| height: 200px; | |
| left: 108px; | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| grid-template-rows: repeat(4, 1fr); | |
| .human { | |
| position: relative; | |
| .via { | |
| position: absolute; | |
| text-align: right; | |
| width: 100%; | |
| height: 8px; | |
| background-color: $wires_color; | |
| bottom: 0; | |
| } | |
| .blood_via { | |
| position: absolute; | |
| height: 8px; | |
| background-color: $blood_color; | |
| width: 0; | |
| bottom: 0; | |
| transition: width $transition_time; | |
| } | |
| &.left { | |
| display: grid; | |
| justify-content: left; | |
| align-content: center; | |
| .blood_via { | |
| right: 0; | |
| } | |
| .scribble { | |
| left: -30px; | |
| span { | |
| left: -40px; | |
| text-align: right; | |
| } | |
| } | |
| } | |
| &.right { | |
| display: grid; | |
| justify-content: right; | |
| align-content: center; | |
| .scribble { | |
| right: -60px; | |
| span { | |
| right: -10px; | |
| } | |
| } | |
| } | |
| .scribble { | |
| position: absolute; | |
| height: 50px; | |
| width: 50px; | |
| top: 0; | |
| transition: background $transition_time; | |
| span { | |
| position: absolute; | |
| display: grid; | |
| align-items: end; | |
| height: 100%; | |
| } | |
| .head { | |
| width: 30%; | |
| height: 30%; | |
| background-color: $human_color; | |
| border-radius: 50%; | |
| margin: 2px auto; | |
| transition: background $transition_time; | |
| position: absolute; | |
| top: 30%; | |
| left: 5%; | |
| } | |
| .body { | |
| position: absolute; | |
| bottom: 0; | |
| width: 40%; | |
| height: 30%; | |
| background-color: $human_color; | |
| border-radius: 50% 50% 0 0; | |
| margin: 0 auto; | |
| transition: background $transition_time; | |
| } | |
| } | |
| } | |
| } | |
| .no_transition { | |
| transition: none !important; | |
| } | |
| .highlight { | |
| border: 2px solid $blood_color !important; | |
| font-weight: bold; | |
| } | |
| .highlightText { | |
| font-weight: bold; | |
| } | |
| @media only screen and (max-width: 400px) { | |
| #content { | |
| position: relative; | |
| margin: 25px auto; | |
| width: 300px; | |
| height: 300px; | |
| h3 { | |
| top: 10px; | |
| font-size: 1em; | |
| } | |
| #blood_selector { | |
| width: 150px; | |
| height: 75px; | |
| font-size: 0.75em; | |
| top: 45px; | |
| } | |
| .bar { | |
| top: 40px; | |
| } | |
| .main_bag { | |
| width: 75px; | |
| height: 105px; | |
| left: 125px; | |
| &::before { | |
| top: -108px; | |
| height: 100px; | |
| } | |
| .blood { | |
| height: 70%; | |
| } | |
| } | |
| #center_via_c .center_via { | |
| left: 167px; | |
| top: 240px; | |
| } | |
| #humans { | |
| top: 240px; | |
| width: 180px; | |
| left: 85px; | |
| } | |
| } | |
| } |
| <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css" rel="stylesheet" /> | |
| <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap" rel="stylesheet" /> |