@rocktimsaikia/github-card
Version:
A minimal github card widget for your portfolio.
165 lines (159 loc) • 5.13 kB
JavaScript
function l(e){return String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"&
h1, div, p {
margin: 0px;
padding: 0px;
font-family: 'system-ui'
}
a{
text-decoration: none;
color: inherit;
}
height: 20px;
position: absolute;
top: 10px;
right: 10px;
}
.cover{
height: 120px;
width: 100%;
background:
position: absolute;
left: 0px;
top: 0px;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
}
.card {
position: relative;
display: inline-block;
background:
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:
}
.dark .card-title{
color:
font-weight: 500 !important;
}
.dark .card-desc{
font-weight: 400 !important;
color:
}
.dark .count{
color:
font-weight: 600 !important;
}
.dark .box-text{
color:
font-weight: 500 !important;
}
.dark .footer-box{
background:
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:
font-size: 20px;
top: 10px;
right: 10px;
}
.card .card-title {
color:
margin-bottom: -8px;
font-size: 25px;
font-weight: 600;
}
.card .card-responsename {
margin-bottom: 20px;
color:
}
.card .card-desc {
font-weight: 500;
width: 250px;
margin: auto;
display: block;
color:
}
.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
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:
font-size: 20px;
font-weight: 600;
}
.card .card-footer .footer-box .box-wrapper .box-text {
font-size: 12px;
font-weight: 600;
color:
letter-spacing: 0.5px;
}
`,s=g;var p=document.createElement("template");p.innerHTML=`
<style>
${s}
</style>
<div class="card"></div>
`;var c=class extends HTMLElement{constructor(){super(),this._shadowRoot=this.attachShadow({mode:"open"}),this._shadowRoot.append(p.content.cloneNode(!0))}static get observedAttributes(){return["data-theme"]}attributeChangedCallback(t,o,r){t==="data-theme"&&o!==r&&this.setTheme(r)}connectedCallback(){this.fetchData(this.getAttribute("data-user")).then(t=>{let o=this.createCard(t);this._shadowRoot.querySelector(".card").innerHTML=o})}setTheme(t){t==="dark"?this._shadowRoot.querySelector(".card").classList.add("dark"):this._shadowRoot.querySelector(".card").classList.remove("dark")}async fetchData(t){return await(await fetch(`https://api.github.com/users/${t}`,{method:"GET"})).json()}createCard(t){let o=a(t.login),r=a(t.html_url),d=a(t.name),n=a(t.bio??"");return`
<div class="cover"></div>
<div class="card-wrapper">
<a href="https://github.com/${o}" 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/${o}" alt="${d}"/></div>
<h1><a class="card-title" href="${r}" target="_blank" rel="noopener">${d}</a></h1>
<div class="card-responsename"><a href="${r}" target="_blank" rel="noopener">@${o}</a></div>
<p class="card-desc">${n}</p>
<div class="card-footer">
<div class="footer-box">
<div class="box-wrapper">
<div class="count">${i(t.followers)}</div>
<div class="box-text">Followers</div>
</div>
<div class="box-wrapper">
<div class="count">${i(t.following)}</div>
<div class="box-text">Following</div>
</div>
<div class="box-wrapper">
<div class="count">${i(t.public_repos)}</div>
<div class="box-text">Repositories</div>
</div>
</div>
</div>
</div>
</div>
`}};customElements.define("github-card",c);