From 6059cb16915898fab65ca82b062ae08eb31f4f3e Mon Sep 17 00:00:00 2001 From: anuraghazra Date: Tue, 14 Jul 2020 20:04:36 +0530 Subject: [PATCH] feat: added animations! --- src/getStyles.js | 97 +++++++++++++++++++++++++++++++++++ src/renderStatsCard.js | 52 +++++++++---------- tests/renderStatsCard.test.js | 5 +- 3 files changed, 123 insertions(+), 31 deletions(-) create mode 100644 src/getStyles.js diff --git a/src/getStyles.js b/src/getStyles.js new file mode 100644 index 00000000..198344fa --- /dev/null +++ b/src/getStyles.js @@ -0,0 +1,97 @@ +const calculateCircleProgress = (value) => { + let radius = 40; + let c = Math.PI * (radius * 2); + + if (value < 0) value = 0; + if (value > 100) value = 100; + + let percentage = ((100 - value) / 100) * c; + return percentage; +}; + +const getAnimations = ({ progress }) => { + return ` + /* Animations */ + @keyframes scaleIn { + from { + transform: translate(-5px, 5px) scale(0); + } + to { + transform: translate(-5px, 5px) scale(1); + } + } + @keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + @keyframes rankAnimation { + from { + stroke-dashoffset: ${calculateCircleProgress(0)}; + } + to { + stroke-dashoffset: ${calculateCircleProgress(progress)}; + } + } + `; +}; + +const getStyles = ({ + titleColor, + textColor, + iconColor, + show_icons, + progress, +}) => { + return ` + .header { + font: 600 18px 'Segoe UI', Ubuntu, Sans-Serif; fill: ${titleColor}; + animation: fadeIn 0.8s ease-in-out forwards; + } + .stat { + font: 600 14px 'Segoe UI', Ubuntu, Sans-Serif; fill: ${textColor}; + } + .stagger { + opacity: 0; + animation: fadeIn 0.3s ease-in-out forwards; + } + .rank-text { + font: 800 24px 'Segoe UI', Ubuntu, Sans-Serif; fill: ${textColor}; + animation: scaleIn 0.3s ease-in-out forwards; + } + + .bold { font-weight: 700 } + .star-icon { + font: 600 18px 'Segoe UI', Ubuntu, Sans-Serif; + } + .icon { + fill: ${iconColor}; + display: ${!!show_icons ? "block" : "none"}; + } + + .rank-circle-rim { + stroke: ${titleColor}; + fill: none; + stroke-width: 6; + opacity: 0.2; + } + .rank-circle { + stroke: ${titleColor}; + stroke-dasharray: 250; + fill: none; + stroke-width: 6; + stroke-linecap: round; + opacity: 0.8; + transform-origin: -10px 8px; + transform: rotate(-90deg); + animation: rankAnimation 1s forwards ease-in-out; + } + + ${process.env.NODE_ENV === "test" ? "" : getAnimations({ progress })} + `; +}; + +module.exports = getStyles; diff --git a/src/renderStatsCard.js b/src/renderStatsCard.js index af2951f2..aa14653c 100644 --- a/src/renderStatsCard.js +++ b/src/renderStatsCard.js @@ -1,12 +1,15 @@ const { kFormatter, isValidHexColor } = require("../src/utils"); +const getStyles = require("./getStyles"); const createTextNode = ({ icon, label, value, id, index, lineHeight }) => { const classname = icon === "★" && "star-icon"; const kValue = kFormatter(value); + const staggerDelay = (index + 3) * 150; // manually calculating lineHeight based on index instead of using // to fix firefox layout bug + const lheight = lineHeight * (index + 1); return ` - + ${icon} ${label}: @@ -107,7 +110,6 @@ const renderStatsCard = (stats = {}, options = { hide: [] }) => { /> `; - const rankProgress = 180 + rank.score * 0.8; const rankCircle = hide_rank ? "" : ` ${rank.level} `; + // re-adjust circle progressbar's value until the ranking algo is improved + let progress = rank.score; + if (rank.score > 86) { + progress = (40 + rank.score) * 0.6; + } + if (rank.score < 40) { + progress = 40 + rank.score; + } + + const styles = getStyles({ + titleColor, + textColor, + iconColor, + show_icons, + progress, + }); + return ` + ${hide_border ? "" : border} ${rankCircle} diff --git a/tests/renderStatsCard.test.js b/tests/renderStatsCard.test.js index 39ee63c4..6375f4bd 100644 --- a/tests/renderStatsCard.test.js +++ b/tests/renderStatsCard.test.js @@ -12,7 +12,7 @@ describe("Test renderStatsCard", () => { totalIssues: 300, totalPRs: 400, contributedTo: 500, - rank: { level: "A+", score: 100 }, + rank: { level: "A+", score: 40 }, }; it("should render correctly", () => { @@ -66,7 +66,8 @@ describe("Test renderStatsCard", () => { document.body.innerHTML = renderStatsCard(stats); const styleTag = document.querySelector("style"); - const stylesObject = cssToObject(styleTag.innerHTML); + console.log(styleTag.textContent); + const stylesObject = cssToObject(styleTag.textContent); const headerClassStyles = stylesObject[".header"]; const statClassStyles = stylesObject[".stat"];