UNPKG

@rocktimsaikia/github-card

Version:

A minimal github card widget for your portfolio.

163 lines (157 loc) 5.1 kB
const widgetStyle=` h1, div, p { margin: 0px; padding: 0px; font-family: 'system-ui' } a{ text-decoration: none; color: inherit; } #github-logo{ height: 20px; position: absolute; top: 10px; right: 10px; } .cover{ height: 120px; width: 100%; background: #FF5C5C; position: absolute; left: 0px; top: 0px; border-top-left-radius: 5px; border-top-right-radius: 5px; } .card { position: relative; display: inline-block; background: #ffffff; border-radius: 5px; box-shadow: 0 12px 13px rgba(0,0,0,0.16), 0 12px 13px rgba(0,0,0,0.16); text-align: center; padding: 20px 50px; margin: 5px; padding-top: 5px; transition: all 0.5s; } /* Dark Theme */ .card.dark{ background: #1C1D21; } .dark .card-title{ color: #E4E4E4 !important; font-weight: 500 !important; } .dark .card-desc{ font-weight: 400 !important; color: #c6c6c6 !important; } .dark .count{ color: #c6c6c6 !important; font-weight: 600 !important; } .dark .box-text{ color: #797979 !important; font-weight: 500 !important; } .dark .footer-box{ background: #1D2025 !important; box-shadow: 0px 0.2px 5px rgba(255, 255, 255, 0.15), 0px 4px 10px rgba(0, 0, 0, 0.25) !important; } .card .fa-github { position: absolute; color: #646464; font-size: 20px; top: 10px; right: 10px; } .card .card-title { color: #434343; margin-bottom: -8px; font-size: 25px; font-weight: 600; } .card .card-responsename { margin-bottom: 20px; color: #797979; } .card .card-desc { font-weight: 500; width: 250px; margin: auto; display: block; color: #3c3c3c; } .card .card-img-wrapper { position: relative; height: 160px; width: 160px; margin: 10px auto; margin-bottom: 20px; } .card .card-img-wrapper img { height: 100%; width: 100%; border-radius: 50%; } .card .card-footer { margin-top: 40px; } .card .card-footer .footer-box { position: relative; border-top: 2px solid #ff9b9b; box-shadow: 0 3px 6px -1px rgb(0 0 0 / 26%), 0 2px 4px -1px rgb(0 0 0 / 6%); border-radius: 5px; margin: 0 auto; padding: 10px; display: flex; justify-content: space-around; } .card .card-footer .footer-box .box-wrapper { position: relative; } .card .card-footer .footer-box .box-wrapper .count { font-family: 'consolas' color: #434343; font-size: 20px; font-weight: 600; } .card .card-footer .footer-box .box-wrapper .box-text { font-size: 12px; font-weight: 600; color: #00000085; letter-spacing: 0.5px; } `;function nFormatter(t){if(!(1e3<=t))return t;let o=t;let r=0;for(;1e3<=o;)o/=1e3,r+=1;return o=o.toPrecision(3),o+=["","K","M","B","T"][r],o}const template=document.createElement("template");template.innerHTML=` <style> ${widgetStyle} </style> <div class="card"></div> `;class myCard extends HTMLElement{constructor(){super(),this._shadowRoot=this.attachShadow({mode:"open"}),this._shadowRoot.append(template.content.cloneNode(!0))}get observedAttribute(){return["data-theme"]}attributeChangedCallback(t,o,r){"data-theme"===t&&o!==r&&""!==r&&(this[t]=r)}connectedCallback(){var t;this.fetchData(this.getAttribute("data-user")).then(t=>{t=this.createCard(t);this._shadowRoot.querySelector(".card").innerHTML=t}),this.getAttribute("data-theme")&&(t=this.getAttribute("data-theme"),this.setTheme(t))}setTheme(t){"dark"===t?this._shadowRoot.querySelector(".card").classList.add("dark"):this._shadowRoot.querySelector(".card").classList.remove("dark")}async fetchData(t){const o=await fetch(`https://api.github.com/users/${t}`,{method:"GET"});return await o.json()}createCard(t){return` <div class="cover"></div> <div class="card-wrapper"> <a href="https://github.com/${t.login}" target="_blank" rel="noopener"><img id="github-logo" src="https://i.ibb.co/frv5pB3/github-logo.png" alt="github-logo" border="0"></a> <div class="card-header"> <div class="card-img-wrapper"><img src="https://avatars.githubusercontent.com/${t.login}"/></div> <h1><a class="card-title" href="${t.html_url}" target="_blank" rel="noopener">${t.name}</a></h1> <div class="card-responsename"><a href="${t.html_url}" target="_blank" rel="noopener">@${t.login}</a></div> <p class="card-desc">${t.bio??""}</p> <div class="card-footer"> <div class="footer-box"> <div class="box-wrapper"> <div class="count">${nFormatter(t.followers)}</div> <div class="box-text">Followers</div> </div> <div class="box-wrapper"> <div class="count">${nFormatter(t.following)}</div> <div class="box-text">Following</div> </div> <div class="box-wrapper"> <div class="count">${nFormatter(t.public_repos)}</div> <div class="box-text">Repositories</div> </div> </div> </div> `}}customElements.define("github-card",myCard);