Passwords
Simple and secure password authentication, complete with breach detection and recovery options.
import React, { useState, useEffect } from 'react';import './passwords.css' const Passwords = ({ title = 'Passwords', subtitle = 'Simple and secure password authentication, complete with breach detection and recovery options.', accentColor = '#5DE3FF',}) => { const [isHovered, setIsHovered] = useState(false); const [rotateLock, setRotateLock] = useState(false); const [startDots, setStartDots] = useState(false); useEffect(() => { const timer = setTimeout(() => { setStartDots(isHovered ? true : false) }, isHovered ? 1000 : 0); const timer2 = setTimeout(() => { setRotateLock(isHovered ? true : false) }, isHovered ? 2100 : 0); () => clearTimeout(timer); return () => clearTimeout(timer2); }, [isHovered]); return ( <div className="passwords" style={{ backgroundColor: '#212126' }} onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} > <div class='pass_lock_wrap' style={{ transform: isHovered ? 'translateY(-2rem)' : 'translateY(0rem)' }}> <div class="pass_lock_bg"> <div class="pass_lock_otr"> <div class="pass_lock"> <div class="pass_lock_inner_detail"></div> <div class="pass_svg_wrap" style={{ transform: rotateLock ? 'rotate(90deg)' : 'rotate(0deg)' }}> <svg class="pass_svg" width="8" height="36" viewBox="0 0 8 36" fill="#000" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M3 0C1.34315 0 0 1.34315 0 3V19.5858C0 19.851 0.105357 20.1054 0.292893 20.2929L3.29289 23.2929C3.68342 23.6834 3.68342 24.3166 3.29289 24.7071L0.292893 27.7071C0.105357 27.8946 0 28.149 0 28.4142V33C0 34.6569 1.34315 36 3 36H5C6.65685 36 8 34.6569 8 33V16.4142C8 16.149 7.89464 15.8946 7.70711 15.7071L4.70711 12.7071C4.31658 12.3166 4.31658 11.6834 4.70711 11.2929L7.70711 8.29289C7.89464 8.10536 8 7.851 8 7.58579V3C8 1.34315 6.65685 0 5 0H3Z"></path></svg> </div> </div> </div> <div class="pass_passcode_outer" style={{ transform: isHovered ? 'translateY(1rem)' : 'translateY(0rem)' }}> <div class="pass_passcode_wrap" style={{ border: isHovered ? `1px solid ${accentColor}` : '', boxShadow: isHovered ? 'rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(58, 212, 253, 0.1) 0px 0px 6px 3px' : '' }}> {Array.from({ length: 10 }, (_, index) => index).map((icon, i) => <div className={`pass_password_dot ${startDots ? 'pass_password_dot_in' : 'pass_password_dot_out'}`} style={{ transitionDelay: startDots ? `${i}00ms` : '0ms', backgroundColor: accentColor }}></div> )} </div> </div> <div class="pass_svg_bg_wrap"> <div class="pass_svg_bg_wrap_gradient"></div> <svg width="317" height="214" viewBox="0 0 317 214" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M21.6502 2.38322L2.30334 22.0051C0.827423 23.502 0 25.5197 0 27.6219L0 214L317 214L317 27.6219C317 25.5197 316.173 23.502 314.697 22.0051L295.35 2.38322C293.846 0.858434 291.794 0 289.653 0L27.3468 0C25.2055 0 23.1536 0.858435 21.6502 2.38322Z" fill="#2B2B30" stroke="white" stroke-opacity="0.04"></path></svg> </div> </div> </div> <div className="pass_bottom_bg_gradient"></div> <div className="pass_bottom_caption_wrap" style={{ backgroundImage: "linear-gradient(to top, #212126, transparent)", zIndex: '100' }}> <p className="pass_bottom_title" style={{ color: '#fff' }}>{title}</p> <p className="pass_bottom_subtitle" style={{ color: '#9395A1' }}>{subtitle}</p> </div> </div> );}; export { Passwords };
.passwords { width: 400px; min-width: 280px; height: 260px; border-radius: 16px; position: relative; border-top-color: #d9d9de; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(255, 255, 255, 0.024) 0px 1px 0px 0px inset, rgba(255, 255, 255, 0.024) 0px 0px 0px 1px inset; display: flex; justify-content: center;} @media only screen and (max-width: 480px) { .passwords { width: 100%; }} .pass_lock_bg { height: 80px;} .pass_lock_wrap { -webkit-transition: all .4s cubic-bezier(.26, .48, .34, .99); -moz-transition: all .4s cubic-bezier(.26, .48, .34, .99); -o-transition: all .4s cubic-bezier(.26, .48, .34, .99); transition: all .4s cubic-bezier(.26, .48, .34, .99);} .pass_lock_otr { background-color: rgb(19, 19, 22); border-radius: 9999px; margin: 0px auto; display: flex; justify-content: center; position: relative; top: 48px; width: 64px; height: 64px; padding: 4px;} .pass_lock { background-image: repeating-radial-gradient(rgba(0, 0, 0, 0.2) 0.125rem, rgba(0, 0, 0, 0) 0.25rem); box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(255, 255, 255, 0.08) 0px 1px 0px 0px inset; width: 100%; height: 100%; background-color: #393940; border-radius: 9999px;} .pass_lock_inner_detail{ background-image: linear-gradient(rgb(39, 39, 45), rgba(47, 48, 55, 0.5)); border-radius: 10000px; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(255, 255, 255, 0.02) 0px 1px 0px 0px, rgba(255, 255, 255, 0.06) 0px -1px 0px 0px, rgba(255, 255, 255, 0.02) 0px -2px 4px 0px, rgba(0, 0, 0, 0.2) 0px 1px 1px 0px inset; position: absolute; height: 32px; width: 32px; left: 16px; top: 16px;} .pass_svg { margin: 0px auto;} .pass_svg_wrap { margin: 0px !important; position: relative; top: 10px; -webkit-transition: all .5s cubic-bezier(.94, -0.01, .65, .99); -moz-transition: all .5s cubic-bezier(.94, -0.01, .65, .99); -o-transition: all .5s cubic-bezier(.94, -0.01, .65, .99); transition: all .5s cubic-bezier(.94, -0.01, .65, .99); filter: drop-shadow(rgba(255, 255, 255, 0.1) 0px 1px 0px)} .pass_svg_bg_wrap { margin: 0px !important; overflow: hidden; height: 100%; z-index: 0;} .pass_svg_bg_wrap_gradient { position: absolute; height: 80px; width: 100%; background-image: linear-gradient(to top, #212126, rgba(33, 33, 38, 0)); z-index: 1;} .pass_passcode_outer { display: block; width: 100%; position: absolute; top: 110px; z-index: 2; -webkit-transition: all .2s cubic-bezier(.26, .48, .34, .99); -moz-transition: all .2s cubic-bezier(.26, .48, .34, .99); -o-transition: all .2s cubic-bezier(.26, .48, .34, .99); transition: all .2s cubic-bezier(.26, .48, .34, .99);} .pass_passcode_wrap { background-color: #33353C; background-image: linear-gradient(rgb(47, 48, 55), rgb(39, 39, 45)); border-radius: 6px; box-shadow: rgb(255, 255, 255) 0px 0px 0px 0px, rgba(0, 0, 0, 0.2) 0px 0px 0px 1px, rgba(0, 0, 0, 0.1) 0px 4px 6px -1px, rgba(0, 0, 0, 0.1) 0px 2px 4px -2px; height: 28px; width: 224px; margin: 0px auto; display: flex; align-items: center; column-gap: 6px; padding: 0px 12px;} .pass_password_dot { border-radius: 99999px; box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.4) 0px 1px 2px 0px; height: 4px; width: 4px; margin-top: 0px !important; position: relative; transition-property: filter, opacity;} .pass_password_dot_in { opacity: 1; filter: blur(0px); -webkit-transition: all .3s ease-out; -moz-transition: all .3s ease-out; -o-transition: all .3s ease-out; transition: all .3s ease-out;} .pass_password_dot_out { opacity: 0; filter: blur(30px); -webkit-transition: all .1s ease-out; -moz-transition: all .1s ease-out; -o-transition: all .1s ease-out; transition: all .1s ease-out;} .pass_bottom_bg_gradient { width: 100%; height: 100%; position: absolute; top: 0px; margin-top: 0px !important; border-radius: 16px;} .pass_bottom_caption_wrap { border-bottom-right-radius: 16px; border-bottom-left-radius: 16px; width: 100%; position: absolute; bottom: 0px; padding: 24px; padding-top: 0px;} .pass_bottom_title { font-weight: bold; line-height: 24px; font-size: 13px;} .pass_bottom_subtitle { margin-top: 8px !important; line-height: 20px; font-size: 13px}