Compare commits

..
Author SHA1 Message Date
Zohan Subhash d0cb83cfd2 Update wakatime.js 2023-03-01 13:03:51 +05:30
Zohan Subhash 7b87177734 Update top-langs.js 2023-03-01 13:03:38 +05:30
Zohan Subhash 7e30ca6cc0 Update pin.js 2023-03-01 13:03:26 +05:30
Zohan Subhash 22a201df41 Update index.js 2023-03-01 13:02:52 +05:30
github-actions[bot]andrickstaa d60d53cdb4 refactor: update languages JSON (#2554)
Co-authored-by: rickstaa <rickstaa@users.noreply.github.com>
2023-03-01 06:47:56 +05:30
Rick Staa 252c2b419d refactor: format code (#2550) 2023-02-26 08:14:42 +05:30
Rick Staa d5fbfb4345 ci: fix a bug in the theme preview action (#2549) 2023-02-25 19:44:47 +05:30
Rick Staa 82224fa68a ci: update e2e tests (#2548) 2023-02-25 19:42:11 +05:30
Zohan Subhash 1d528da1dc Add option to deploy using other services (#2525)
* Create express.js

* Update readme.md

* Update readme.md
2023-02-25 19:34:00 +05:30
Rehman 2ab8b85ae3 fix: for issue #2534 (#2536) 2023-02-25 14:31:49 +01:00
Rick Staa a3c6f874af test: update snapshots (#2519) 2023-02-25 13:32:08 +01:00
Raphael Gonçalves 8898d013b6 Update readme.md (#2414)
fix: missing "&" in show_icons=true in Showing icons section
2023-02-25 17:32:42 +05:30
Rick Staa 91345ed55f ci: fix unsafe directory bug (#2518)
This commit fixes a bug that was introduced due to a upstream change in
the git package. See https://stackoverflow.com/questions/71849415/i-cannot-add-the-parent-directory-to-safe-directory-in-git/71904131#71904131
for more information.
2023-02-25 17:21:54 +05:30
Zohan Subhash 55a303b4a6 Add auto-labelling for documentation updates (#2526) 2023-02-25 17:20:14 +05:30
Cateline Mnemosyne f3f7a4837d fix: fix JSON themes bug. (#2544)
This fixes a JSON bug that was introduced in https://github.com/anuraghazra/github-readme-stats/pull/2507.
2023-02-25 14:25:12 +05:30
Oleksandr PerlovandZohan Subhash a6ff0fa521 Add one_dark_pro (#2507)
This colors were taken from One Dark Pro theme in VSCode extention. Please add it and I will use it in my profile

Co-authored-by: Zohan Subhash <zohan.subhash@gmail.com>
2023-02-25 12:20:00 +05:30
Mohamed Hassan 5f20e6c97a add holi_theme (#2539)
* add holi_theme

* add holi_theme
2023-02-25 12:19:30 +05:30
AmirandZohan Subhash ba7c2f8b55 Support hide_progress for top-langs feature (#2514)
* Add support for hide_progress in top languages feature

* Fix mistake

* Add documents for all languages

* Remove unnecessary value check

* Update top-languages-card.js

* Revert document for all languages except English

* Update documentation

* Update documentation

---------

Co-authored-by: Zohan Subhash <zohan.subhash@gmail.com>
2023-02-16 06:53:11 +05:30
강민지and강민지 888663a477 Add rose theme (#2480)
Co-authored-by: 강민지 <68285922+Kminzzi@users.noreply.github.com>
2023-02-14 06:20:12 +05:30
Rick Staa 112000667c ci: add update languages action (#2484)
* ci: add update languages action

* ci: make sure PR is created when upstream languages are updated
2023-01-29 15:19:01 +01:00
36 changed files with 284 additions and 2575 deletions
+1
View File
@@ -1,3 +1,4 @@
themes: themes/index.js
doc-translation: docs/*
card-i18n: src/translations.js
documentation: readme.md
+4
View File
@@ -23,6 +23,10 @@ jobs:
node-version: ${{ matrix.node-version }}
cache: npm
# Fix the unsafe repo error which was introduced by the CVE-2022-24765 git patches.
- name: Fix unsafe repo error
run: git config --global --add safe.directory ${{ github.workspace }}
- name: npm install, generate readme
run: |
npm ci
+44
View File
@@ -0,0 +1,44 @@
name: Update supported languages
on:
schedule:
- cron: "0 0 */30 * *"
jobs:
updateLanguages:
if: github.repository == 'anuraghazra/github-readme-stats'
name: Update supported languages
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16.x]
steps:
- uses: actions/checkout@v3
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: npm
- name: Install dependencies
run: npm ci
env:
CI: true
- name: Run update-languages-json.js script
run: npm run generate-langs-json
- name: Create Pull Request if upstream language file is changed
uses: peter-evans/create-pull-request@v4
with:
commit-message: "refactor: update languages JSON"
branch: "update_langs/patch"
delete-branch: true
title: Update languages JSON
body:
"The
[update-langs](https://github.com/anuraghazra/github-readme-stats/actions/workflows/update-langs.yaml)
action found new/updated languages in the [upstream languages JSON
file](https://raw.githubusercontent.com/github/linguist/master/lib/linguist/languages.yml)."
labels: "ci, lang-card"
+2
View File
@@ -10,3 +10,5 @@ vercel_token
# IDE
.vscode
*.code-workspace
.vercel
+2
View File
@@ -46,6 +46,8 @@ export default async (req, res) => {
if (locale && !isLocaleAvailable(locale)) {
return res.send(renderError("Something went wrong", "Language not found"));
}
theme = theme.replace(/-/g, "_")
try {
const stats = await fetchStats(
+2
View File
@@ -35,6 +35,8 @@ export default async (req, res) => {
if (locale && !isLocaleAvailable(locale)) {
return res.send(renderError("Something went wrong", "Language not found"));
}
theme = theme.replace(/-/g, "_")
try {
const repoData = await fetchRepo(username, repo);
+4
View File
@@ -30,6 +30,7 @@ export default async (req, res) => {
border_radius,
border_color,
disable_animations,
hide_progress,
} = req.query;
res.setHeader("Content-Type", "image/svg+xml");
@@ -40,6 +41,8 @@ export default async (req, res) => {
if (locale && !isLocaleAvailable(locale)) {
return res.send(renderError("Something went wrong", "Locale not found"));
}
theme = theme.replace(/-/g, "_")
try {
const topLangs = await fetchTopLanguages(
@@ -77,6 +80,7 @@ export default async (req, res) => {
border_color,
locale: locale ? locale.toLowerCase() : null,
disable_animations: parseBoolean(disable_animations),
hide_progress: parseBoolean(hide_progress),
}),
);
} catch (err) {
+2
View File
@@ -38,6 +38,8 @@ export default async (req, res) => {
if (locale && !isLocaleAvailable(locale)) {
return res.send(renderError("Something went wrong", "Language not found"));
}
theme = theme.replace(/-/g, "_")
try {
const stats = await fetchWakatimeStats({ username, api_domain, range });
+15
View File
@@ -0,0 +1,15 @@
import statsCard from "./api/index.js";
import repoCard from "./api/pin.js";
import langCard from "./api/top-langs.js";
import wakatimeCard from "./api/wakatime.js";
import express from "express";
import dotenv from "dotenv";
dotenv.config();
const app = express();
app.listen(process.env.port || 9000);
app.get("/", statsCard);
app.get("/pin", repoCard);
app.get("/top-langs", langCard);
app.get("/wakatime", wakatimeCard);
+1 -2
View File
@@ -45,12 +45,11 @@
"husky": "^8.0.0",
"jest": "^29.0.3",
"jest-environment-jsdom": "^29.0.3",
"jest-svg-snapshot": "^0.1.0",
"js-yaml": "^4.1.0",
"lint-staged": "^13.0.3",
"lodash.snakecase": "^4.1.1",
"parse-diff": "^0.7.0",
"prettier": "^2.8.3"
"prettier": "^2.1.2"
},
"dependencies": {
"axios": "^0.24.0",
+37 -3
View File
@@ -92,7 +92,9 @@ Visit <https://indiafightscorona.giveindia.org> and make a small donation to hel
- [Repo Card Exclusive Options](#repo-card-exclusive-options)
- [Language Card Exclusive Options](#language-card-exclusive-options)
- [Wakatime Card Exclusive Option](#wakatime-card-exclusive-options)
- [Deploy Yourself](#deploy-on-your-own-vercel-instance)
- [Deploy Yourself](#deploy-on-your-own)
- [On Vercel](#on-vercel)
- [On other platforms](#on-other-platforms)
- [Keep your fork up to date](#keep-your-fork-up-to-date)
# GitHub Stats Card
@@ -133,7 +135,7 @@ You can add the count of all your private contributions to the total commits cou
### Showing icons
To enable icons, you can pass `show_icons=true` in the query param, like so:
To enable icons, you can pass `&show_icons=true` in the query param, like so:
```md
![Anurag's GitHub stats](https://github-readme-stats.vercel.app/api?username=anuraghazra&show_icons=true)
@@ -305,6 +307,7 @@ You can provide multiple comma-separated values in the bg_color option to render
- `exclude_repo` - Exclude specified repositories _(Comma-separated values)_. Default: `[] (blank array)`.
- `custom_title` - Sets a custom title for the card _(string)_. Default `Most Used Languages`.
- `disable_animations` - Disables all animations in the card _(boolean)_. Default: `false`.
- `hide_progress` - It uses the compact layout option, hides percentages, and removes the bars. Default: `false`.
> **Warning**
> Language names should be URI-escaped, as specified in [Percent Encoding](https://en.wikipedia.org/wiki/Percent-encoding)
@@ -398,6 +401,14 @@ You can use the `&layout=compact` option to change the card design.
[![Top Langs](https://github-readme-stats.vercel.app/api/top-langs/?username=anuraghazra&layout=compact)](https://github.com/anuraghazra/github-readme-stats)
```
### Hide Progress Bars
You can use the `&hide_progress=true` option to hide the percentages and the progress bars (layout will be automatically set to `compact`).
```md
[![Top Langs](https://github-readme-stats.vercel.app/api/top-langs/?username=anuraghazra&hide_progress=true)](https://github.com/anuraghazra/github-readme-stats)
```
### Demo
[![Top Langs](https://github-readme-stats.vercel.app/api/top-langs/?username=anuraghazra)](https://github.com/anuraghazra/github-readme-stats)
@@ -406,6 +417,10 @@ You can use the `&layout=compact` option to change the card design.
[![Top Langs](https://github-readme-stats.vercel.app/api/top-langs/?username=anuraghazra&layout=compact)](https://github.com/anuraghazra/github-readme-stats)
- Hidden progress bars
[![Top Langs](https://github-readme-stats.vercel.app/api/top-langs/?username=anuraghazra&hide_progress=true)](https://github.com/anuraghazra/github-readme-stats)
# Wakatime Week Stats
Change the `?username=` value to your [Wakatime](https://wakatime.com) username.
@@ -496,7 +511,9 @@ By default, GitHub does not lay out the cards side by side. To do that, you can
</a>
```
## Deploy on your own Vercel instance
## Deploy on your own
### On Vercel
#### :film_projector: [Check Out Step By Step Video Tutorial By @codeSTACKr](https://youtu.be/n6d4KHSKqGk?t=107)
@@ -533,6 +550,23 @@ Since the GitHub API only allows 5k requests per hour, my `https://github-readme
</details>
### On other platforms
> **Warning**
> This way of using GRS is not officially supported and was added to cater to some particular use cases where Vercel could not be used (e.g. #2341). The support for this method, therefore, is limited.
<details>
<summary><b>:hammer_and_wrench: Step-by-step guide for deploying on other platforms</b></summary>
1. Fork or clone this repo as per your needs
2. Add `express` to the dependencies section of `package.json`
https://github.com/anuraghazra/github-readme-stats/blob/ba7c2f8b55eac8452e479c8bd38b044d204d0424/package.json#L54-L61
3. Run `npm i` if needed (initial setup)
4. Run `node express.js` to start the server, or set the entry point to `express.js` in `package.json` if you're deploying on a managed service
https://github.com/anuraghazra/github-readme-stats/blob/ba7c2f8b55eac8452e479c8bd38b044d204d0424/package.json#L11
5. You're done 🎉
</details>
### Keep your fork up to date
You can keep your fork, and thus your private Vercel instance up to date with the upstream using GitHubs' [Sync Fork button](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork). You can also use the [pull](https://github.com/wei/pull) package created by [@wei](https://github.com/wei) to automate this process.
+5 -4
View File
@@ -298,12 +298,13 @@ const themeNameAlreadyExists = (name) => {
return themes[name] !== undefined;
};
const DRY_RUN = process.env.DRY_RUN === "true" || false;
/**
* Main function.
*/
export const run = async (prNumber) => {
try {
const dryRun = process.env.DRY_RUN === "true" || false;
debug("Retrieve action information from context...");
debug(`Context: ${inspect(github.context)}`);
let commentBody = `
@@ -513,7 +514,7 @@ export const run = async (prNumber) => {
// Create or update theme-preview comment.
debug("Create or update theme-preview comment...");
let comment_url;
if (!dryRun) {
if (!DRY_RUN) {
comment_url = await upsertComment(octokit, {
comment_id: comment?.id,
issue_number: pullRequestId,
@@ -535,7 +536,7 @@ export const run = async (prNumber) => {
const reviewReason = themesValid
? undefined
: INVALID_REVIEW_COMMENT(comment_url);
if (!dryRun) {
if (!DRY_RUN) {
await addReview(
octokit,
pullRequestId,
@@ -558,7 +559,7 @@ export const run = async (prNumber) => {
}
} catch (error) {
debug("Set review state to `REQUEST_CHANGES` and add `invalid` label...");
if (!dryRun) {
if (!DRY_RUN) {
await addReview(
octokit,
pullRequestId,
+28 -12
View File
@@ -13,7 +13,7 @@ import {
import { langCardLocales } from "../translations.js";
const DEFAULT_CARD_WIDTH = 300;
const MIN_CARD_WIDTH = 230;
const MIN_CARD_WIDTH = 280;
const DEFAULT_LANGS_COUNT = 5;
const DEFAULT_LANG_COLOR = "#858585";
const CARD_PADDING = 25;
@@ -76,10 +76,11 @@ const createProgressTextNode = ({ width, color, name, progress, index }) => {
* @param {object} props Function properties.
* @param {Lang} props.lang Programming language object.
* @param {number} props.totalSize Total size of all languages.
* @param {boolean} props.hideProgress Whether to hide percentage.
* @param {number} props.index Index of the programming language.
* @returns {string} Compact layout programming language SVG node.
*/
const createCompactLangNode = ({ lang, totalSize, index }) => {
const createCompactLangNode = ({ lang, totalSize, hideProgress, index }) => {
const percentage = ((lang.size / totalSize) * 100).toFixed(2);
const staggerDelay = (index + 3) * 150;
const color = lang.color || "#858585";
@@ -88,7 +89,7 @@ const createCompactLangNode = ({ lang, totalSize, index }) => {
<g class="stagger" style="animation-delay: ${staggerDelay}ms">
<circle cx="5" cy="6" r="5" fill="${color}" />
<text data-testid="lang-name" x="15" y="10" class='lang-name'>
${lang.name} ${percentage}%
${lang.name} ${hideProgress ? "" : percentage + "%"}
</text>
</g>
`;
@@ -100,9 +101,10 @@ const createCompactLangNode = ({ lang, totalSize, index }) => {
* @param {object[]} props Function properties.
* @param {Lang[]} props.langs Array of programming languages.
* @param {number} props.totalSize Total size of all languages.
* @param {boolean} props.hideProgress Whether to hide percentage.
* @returns {string} Programming languages SVG node.
*/
const createLanguageTextNode = ({ langs, totalSize }) => {
const createLanguageTextNode = ({ langs, totalSize, hideProgress }) => {
const longestLang = getLongestLang(langs);
const chunked = chunkArray(langs, langs.length / 2);
const layouts = chunked.map((array) => {
@@ -111,6 +113,7 @@ const createLanguageTextNode = ({ langs, totalSize }) => {
createCompactLangNode({
lang,
totalSize,
hideProgress,
index,
}),
);
@@ -160,9 +163,10 @@ const renderNormalLayout = (langs, width, totalLanguageSize) => {
* @param {Lang[]} langs Array of programming languages.
* @param {number} width Card width.
* @param {number} totalLanguageSize Total size of all languages.
* @param {boolean} hideProgress Whether to hide progress bar.
* @returns {string} Compact layout card SVG object.
*/
const renderCompactLayout = (langs, width, totalLanguageSize) => {
const renderCompactLayout = (langs, width, totalLanguageSize, hideProgress) => {
const paddingRight = 50;
const offsetWidth = width - paddingRight;
// progressOffset holds the previous language's width and used to offset the next language
@@ -193,15 +197,21 @@ const renderCompactLayout = (langs, width, totalLanguageSize) => {
.join("");
return `
<mask id="rect-mask">
${
!hideProgress
? `
<mask id="rect-mask">
<rect x="0" y="0" width="${offsetWidth}" height="8" fill="white" rx="5"/>
</mask>
${compactProgressBar}
<g transform="translate(0, 25)">
`
: ""
}
<g transform="translate(0, ${hideProgress ? "0" : "25"})">
${createLanguageTextNode({
langs,
totalSize: totalLanguageSize,
hideProgress: hideProgress,
})}
</g>
`;
@@ -276,6 +286,7 @@ const renderTopLanguages = (topLangs, options = {}) => {
text_color,
bg_color,
hide,
hide_progress,
theme,
layout,
custom_title,
@@ -305,11 +316,16 @@ const renderTopLanguages = (topLangs, options = {}) => {
let height = calculateNormalLayoutHeight(langs.length);
let finalLayout = "";
if (layout === "compact") {
width = width + 50; // padding
height = calculateCompactLayoutHeight(langs.length);
if (layout === "compact" || hide_progress == true) {
height =
calculateCompactLayoutHeight(langs.length) + (hide_progress ? -25 : 0);
finalLayout = renderCompactLayout(langs, width, totalLanguageSize);
finalLayout = renderCompactLayout(
langs,
width,
totalLanguageSize,
hide_progress,
);
} else {
finalLayout = renderNormalLayout(langs, width, totalLanguageSize);
}
+1
View File
@@ -38,6 +38,7 @@ export type TopLangOptions = CommonOptions & {
custom_title: string;
langs_count: number;
disable_animations: boolean;
hide_progress: boolean;
};
type WakaTimeOptions = CommonOptions & {
+25 -1
View File
@@ -118,6 +118,7 @@ const createTextNode = ({
// @ts-ignore
name: label,
progressBarBackgroundColor,
delay: staggerDelay + 300,
});
return `
@@ -276,11 +277,12 @@ const renderWakatimeCard = (stats = {}, options = { hide: [] }) => {
} else {
finalLayout = flexLayout({
items: filteredLanguages.length
? filteredLanguages.map((language) => {
? filteredLanguages.map((language, index) => {
return createTextNode({
id: language.name,
label: language.name,
value: language.text,
index: index,
percent: language.percent,
// @ts-ignore
progressBarColor: titleColor,
@@ -321,7 +323,29 @@ const renderWakatimeCard = (stats = {}, options = { hide: [] }) => {
card.setCSS(
`
${cssStyles}
@keyframes slideInAnimation {
from {
width: 0;
}
to {
width: calc(100%-100px);
}
}
@keyframes growWidthAnimation {
from {
width: 0;
}
to {
width: 100%;
}
}
.lang-name { font: 400 11px 'Segoe UI', Ubuntu, Sans-Serif; fill: ${textColor} }
#rect-mask rect{
animation: slideInAnimation 1s ease-in-out forwards;
}
.lang-progress{
animation: growWidthAnimation 0.6s ease-in-out forwards;
}
`,
);
+1 -5
View File
@@ -177,11 +177,7 @@ class Card {
}
${this.css}
${
process.env.NODE_ENV === "test" || this.animations === false
? ""
: getAnimations()
}
${process.env.NODE_ENV === "test" ? "" : getAnimations()}
${
this.animations === false
? `* { animation-duration: 0s !important; animation-delay: 0s !important; }`
+27 -1
View File
@@ -79,6 +79,7 @@
"Ceylon": "#dfa535",
"Chapel": "#8dc63f",
"ChucK": "#3f8000",
"Circom": "#707575",
"Cirru": "#ccccff",
"Clarion": "#db901e",
"Clarity": "#5546ff",
@@ -102,6 +103,7 @@
"Csound Score": "#1a1a1a",
"Cuda": "#3A4E3A",
"Curry": "#531242",
"Cypher": "#34c0eb",
"Cython": "#fedf5b",
"D": "#ba595e",
"DM": "#447265",
@@ -115,6 +117,7 @@
"DirectX 3D File": "#aace60",
"Dockerfile": "#384d54",
"Dogescript": "#cca760",
"Dotenv": "#e5d559",
"Dylan": "#6c616e",
"E": "#ccce35",
"ECL": "#8a1267",
@@ -124,6 +127,7 @@
"Earthly": "#2af0ff",
"Easybuild": "#069406",
"Ecere Projects": "#913960",
"Ecmarkup": "#eb8131",
"EditorConfig": "#fff1f2",
"Eiffel": "#4d6977",
"Elixir": "#6e4a7e",
@@ -147,7 +151,7 @@
"Forth": "#341708",
"Fortran": "#4d41b1",
"Fortran Free Form": "#4d41b1",
"FreeBasic": "#867db1",
"FreeBasic": "#141AC9",
"FreeMarker": "#0050b2",
"Frege": "#00cafe",
"Futhark": "#5f021f",
@@ -180,6 +184,7 @@
"Go": "#00ADD8",
"Go Checksums": "#00ADD8",
"Go Module": "#00ADD8",
"Godot Resource": "#355570",
"Golo": "#88562A",
"Gosu": "#82937f",
"Grace": "#615f8b",
@@ -190,6 +195,7 @@
"Groovy": "#4298b8",
"Groovy Server Pages": "#4298b8",
"HAProxy": "#106da9",
"HCL": "#844FBA",
"HLSL": "#aace60",
"HOCON": "#9ff8ee",
"HTML": "#e34c26",
@@ -215,6 +221,7 @@
"Idris": "#b30000",
"Ignore List": "#000000",
"ImageJ Macro": "#99AAFF",
"Imba": "#16cec6",
"Inno Setup": "#264b99",
"Io": "#a9188d",
"Ioke": "#078193",
@@ -222,6 +229,7 @@
"Isabelle ROOT": "#FEFE00",
"J": "#9EEDFF",
"JAR Manifest": "#b07219",
"JCL": "#d90e09",
"JFlex": "#DBCA00",
"JSON": "#292929",
"JSON with Comments": "#292929",
@@ -244,9 +252,11 @@
"Jsonnet": "#0064bd",
"Julia": "#a270ba",
"Jupyter Notebook": "#DA5B0B",
"Just": "#384d54",
"KRL": "#28430A",
"Kaitai Struct": "#773b37",
"KakouneScript": "#6f8042",
"KerboScript": "#41adf0",
"KiCad Layout": "#2f4aab",
"KiCad Legacy Layout": "#2f4aab",
"KiCad Schematic": "#2f4aab",
@@ -286,6 +296,7 @@
"Mathematica": "#dd1100",
"Max": "#c4a79c",
"Mercury": "#ff2b2b",
"Mermaid": "#ff3670",
"Meson": "#007800",
"Metal": "#8f14e9",
"MiniYAML": "#ff1111",
@@ -318,6 +329,10 @@
"Nu": "#c9df40",
"NumPy": "#9C8AF9",
"Nunjucks": "#3d8137",
"OASv2-json": "#85ea2d",
"OASv2-yaml": "#85ea2d",
"OASv3-json": "#85ea2d",
"OASv3-yaml": "#85ea2d",
"OCaml": "#3be133",
"ObjectScript": "#424893",
"Objective-C": "#438eff",
@@ -327,14 +342,18 @@
"Omgrofl": "#cabbff",
"Opal": "#f7ede0",
"Open Policy Agent": "#7d9199",
"OpenAPI Specification v2": "#85ea2d",
"OpenAPI Specification v3": "#85ea2d",
"OpenCL": "#ed2e2d",
"OpenEdge ABL": "#5ce600",
"OpenQASM": "#AA70FF",
"OpenSCAD": "#e5cd45",
"Option List": "#476732",
"Org": "#77aa99",
"Oxygene": "#cdd0e3",
"Oz": "#fab738",
"P4": "#7055b5",
"PDDL": "#0d00ff",
"PEG.js": "#234d6b",
"PHP": "#4F5D95",
"PLSQL": "#dad8d8",
@@ -350,7 +369,9 @@
"PicoLisp": "#6067af",
"PigLatin": "#fcd7de",
"Pike": "#005390",
"PlantUML": "#fbbd16",
"PogoScript": "#d80074",
"Polar": "#ae81ff",
"Portugol": "#f8bd00",
"PostCSS": "#dc3a0c",
"PostScript": "#da291c",
@@ -366,6 +387,7 @@
"Puppet": "#302B6D",
"PureBasic": "#5a6986",
"PureScript": "#1D222D",
"Pyret": "#ee1e10",
"Python": "#3572A5",
"Python console": "#3572A5",
"Python traceback": "#3572A5",
@@ -414,6 +436,7 @@
"Sass": "#a53b70",
"Scala": "#c22d40",
"Scaml": "#bd181a",
"Scenic": "#fdc700",
"Scheme": "#1e4aec",
"Scilab": "#ca0f21",
"Self": "#0579aa",
@@ -421,6 +444,7 @@
"Shell": "#89e051",
"ShellCheck Config": "#cecfcb",
"Shen": "#120F14",
"Simple File Verification": "#C9BFED",
"Singularity": "#64E6AD",
"Slash": "#007eff",
"Slice": "#003fa2",
@@ -428,6 +452,7 @@
"SmPL": "#c94949",
"Smalltalk": "#596706",
"Smarty": "#f0c040",
"Smithy": "#c44536",
"Solidity": "#AA6746",
"SourcePawn": "#f69e1d",
"Squirrel": "#800000",
@@ -478,6 +503,7 @@
"Vim Script": "#199f4b",
"Vim Snippet": "#199f4b",
"Visual Basic .NET": "#945db7",
"Visual Basic 6.0": "#2c6353",
"Volt": "#1F1F1F",
"Vue": "#41b883",
"Vyper": "#2980b9",
+4 -6
View File
@@ -43,11 +43,6 @@ const getProgressAnimation = ({ progress }) => {
const getAnimations = () => {
return `
/* Animations */
.stagger {
opacity: 0;
animation: fadeInAnimation 0.3s ease-in-out forwards;
}
@keyframes scaleInAnimation {
from {
transform: translate(-5px, 5px) scale(0);
@@ -94,7 +89,10 @@ const getStyles = ({
/* Selector detects Firefox */
.stat { font-size:12px; }
}
.stagger {
opacity: 0;
animation: fadeInAnimation 0.3s ease-in-out forwards;
}
.rank-text {
font: 800 24px 'Segoe UI', Ubuntu, Sans-Serif; fill: ${textColor};
animation: scaleInAnimation 0.3s ease-in-out forwards;
@@ -34,7 +34,10 @@ exports[`Test Render Wakatime Card should render correctly with compact layout 1
/* Selector detects Firefox */
.stat { font-size:12px; }
}
.stagger {
opacity: 0;
animation: fadeInAnimation 0.3s ease-in-out forwards;
}
.rank-text {
font: 800 24px 'Segoe UI', Ubuntu, Sans-Serif; fill: #434d58;
animation: scaleInAnimation 0.3s ease-in-out forwards;
@@ -66,7 +69,29 @@ exports[`Test Render Wakatime Card should render correctly with compact layout 1
}
@keyframes slideInAnimation {
from {
width: 0;
}
to {
width: calc(100%-100px);
}
}
@keyframes growWidthAnimation {
from {
width: 0;
}
to {
width: 100%;
}
}
.lang-name { font: 400 11px 'Segoe UI', Ubuntu, Sans-Serif; fill: #434d58 }
#rect-mask rect{
animation: slideInAnimation 1s ease-in-out forwards;
}
.lang-progress{
animation: growWidthAnimation 0.6s ease-in-out forwards;
}
@@ -189,7 +214,10 @@ exports[`Test Render Wakatime Card should render correctly with compact layout w
/* Selector detects Firefox */
.stat { font-size:12px; }
}
.stagger {
opacity: 0;
animation: fadeInAnimation 0.3s ease-in-out forwards;
}
.rank-text {
font: 800 24px 'Segoe UI', Ubuntu, Sans-Serif; fill: #434d58;
animation: scaleInAnimation 0.3s ease-in-out forwards;
@@ -221,7 +249,29 @@ exports[`Test Render Wakatime Card should render correctly with compact layout w
}
@keyframes slideInAnimation {
from {
width: 0;
}
to {
width: calc(100%-100px);
}
}
@keyframes growWidthAnimation {
from {
width: 0;
}
to {
width: 100%;
}
}
.lang-name { font: 400 11px 'Segoe UI', Ubuntu, Sans-Serif; fill: #434d58 }
#rect-mask rect{
animation: slideInAnimation 1s ease-in-out forwards;
}
.lang-progress{
animation: growWidthAnimation 0.6s ease-in-out forwards;
}
+3 -3
View File
@@ -15,14 +15,14 @@ const REPO = "curly-fiesta";
const USER = "catelinemnemosyne";
const STATS_DATA = {
name: "Cateline Mnemosyne",
totalPRs: 1,
totalCommits: 7,
totalPRs: 2,
totalCommits: 8,
totalIssues: 1,
totalStars: 1,
contributedTo: 1,
rank: {
level: "A+",
score: 50.893750297869225,
score: 50.88831151384285,
},
};
+3 -3
View File
@@ -216,7 +216,7 @@ describe("Test renderTopLanguages", () => {
);
expect(queryAllByTestId(document.body, "lang-progress")[0]).toHaveAttribute(
"width",
"120",
"100",
);
expect(queryAllByTestId(document.body, "lang-name")[1]).toHaveTextContent(
@@ -224,7 +224,7 @@ describe("Test renderTopLanguages", () => {
);
expect(queryAllByTestId(document.body, "lang-progress")[1]).toHaveAttribute(
"width",
"120",
"100",
);
expect(queryAllByTestId(document.body, "lang-name")[2]).toHaveTextContent(
@@ -232,7 +232,7 @@ describe("Test renderTopLanguages", () => {
);
expect(queryAllByTestId(document.body, "lang-progress")[2]).toHaveAttribute(
"width",
"60",
"50",
);
});
@@ -1,177 +0,0 @@
<svg
width="800"
height="195"
viewBox="0 0 800 195"
fill="none"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="descId"
>
<title id="titleId">Cateline Mnemosyne's GitHub Stats, Rank: A+</title>
<desc id="descId">
Total Stars Earned: 1, Total Commits in 2023 : 1, Total PRs: 1, Total
Issues: 1, Contributed to (last year): 1
</desc>
<style>
.header {
font: 600 18px "Segoe UI", Ubuntu, Sans-Serif;
fill: #2f80ed;
animation: fadeInAnimation 0.8s ease-in-out forwards;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.header {
font-size: 15.5px;
}
}
.stat {
font: 600 14px "Segoe UI", Ubuntu, "Helvetica Neue", Sans-Serif;
fill: #434d58;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.stat {
font-size: 12px;
}
}
.rank-text {
font: 800 24px "Segoe UI", Ubuntu, Sans-Serif;
fill: #434d58;
animation: scaleInAnimation 0.3s ease-in-out forwards;
}
.not_bold {
font-weight: 400;
}
.bold {
font-weight: 700;
}
.icon {
fill: #4c71f2;
display: none;
}
.rank-circle-rim {
stroke: #2f80ed;
fill: none;
stroke-width: 6;
opacity: 0.2;
}
.rank-circle {
stroke: #2f80ed;
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;
}
* {
animation-duration: 0s !important;
animation-delay: 0s !important;
}
</style>
<rect
data-testid="card-bg"
x="0.5"
y="0.5"
rx="4.5"
height="99%"
stroke="#e4e2e2"
width="799"
fill="#fffefe"
stroke-opacity="1"
/>
<g data-testid="card-title" transform="translate(25, 35)">
<g transform="translate(0, 0)">
<text x="0" y="0" class="header" data-testid="header">
Cateline Mnemosyne's GitHub Stats
</text>
</g>
</g>
<g data-testid="main-card-body" transform="translate(0, 55)">
<g data-testid="rank-circle" transform="translate(715, 47.5)">
<circle class="rank-circle-rim" cx="-10" cy="8" r="40" />
<circle class="rank-circle" cx="-10" cy="8" r="40" />
<g class="rank-text">
<text
x="-5"
y="3"
alignment-baseline="central"
dominant-baseline="central"
text-anchor="middle"
>
A+
</text>
</g>
</g>
<svg x="0" y="0">
<g transform="translate(0, 0)">
<g
class="stagger"
style="animation-delay: 450ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Stars Earned:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="stars">
1
</text>
</g>
</g>
<g transform="translate(0, 25)">
<g
class="stagger"
style="animation-delay: 600ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Commits (2023):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="commits">
7
</text>
</g>
</g>
<g transform="translate(0, 50)">
<g
class="stagger"
style="animation-delay: 750ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total PRs:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="prs">1</text>
</g>
</g>
<g transform="translate(0, 75)">
<g
class="stagger"
style="animation-delay: 900ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Issues:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="issues">
1
</text>
</g>
</g>
<g transform="translate(0, 100)">
<g
class="stagger"
style="animation-delay: 1050ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Contributed to (last year):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="contribs">
1
</text>
</g>
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

@@ -1,249 +0,0 @@
<svg
width="467"
height="195"
viewBox="0 0 467 195"
fill="none"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="descId"
>
<title id="titleId">Cateline Mnemosyne's GitHub Stats, Rank: A+</title>
<desc id="descId">
Total Stars Earned: 1, Total Commits in 2023 : 1, Total PRs: 1, Total
Issues: 1, Contributed to (last year): 1
</desc>
<style>
.header {
font: 600 18px "Segoe UI", Ubuntu, Sans-Serif;
fill: #abd200;
animation: fadeInAnimation 0.8s ease-in-out forwards;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.header {
font-size: 15.5px;
}
}
.stat {
font: 600 14px "Segoe UI", Ubuntu, "Helvetica Neue", Sans-Serif;
fill: #68b587;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.stat {
font-size: 12px;
}
}
.rank-text {
font: 800 24px "Segoe UI", Ubuntu, Sans-Serif;
fill: #68b587;
animation: scaleInAnimation 0.3s ease-in-out forwards;
}
.not_bold {
font-weight: 400;
}
.bold {
font-weight: 700;
}
.icon {
fill: #b7d364;
display: block;
}
.rank-circle-rim {
stroke: #abd200;
fill: none;
stroke-width: 6;
opacity: 0.2;
}
.rank-circle {
stroke: #abd200;
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;
}
* {
animation-duration: 0s !important;
animation-delay: 0s !important;
}
</style>
<rect
data-testid="card-bg"
x="0.5"
y="0.5"
rx="4.5"
height="99%"
stroke="#0044ff"
width="466"
fill="#0a0f0b"
stroke-opacity="1"
/>
<g data-testid="card-title" transform="translate(25, 35)">
<g transform="translate(0, 0)">
<text x="0" y="0" class="header" data-testid="header">
Cateline Mnemosyne's GitHub Stats
</text>
</g>
</g>
<g data-testid="main-card-body" transform="translate(0, 55)">
<g data-testid="rank-circle" transform="translate(390.5, 47.5)">
<circle class="rank-circle-rim" cx="-10" cy="8" r="40" />
<circle class="rank-circle" cx="-10" cy="8" r="40" />
<g class="rank-text">
<text
x="-5"
y="3"
alignment-baseline="central"
dominant-baseline="central"
text-anchor="middle"
>
A+
</text>
</g>
</g>
<svg x="0" y="0">
<g transform="translate(0, 0)">
<g
class="stagger"
style="animation-delay: 450ms"
transform="translate(25, 0)"
>
<svg
data-testid="icon"
class="icon"
viewBox="0 0 16 16"
version="1.1"
width="16"
height="16"
>
<path
fill-rule="evenodd"
d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"
/>
</svg>
<text class="stat bold" x="25" y="12.5">Total Stars Earned:</text>
<text class="stat bold" x="219.01" y="12.5" data-testid="stars">
1
</text>
</g>
</g>
<g transform="translate(0, 25)">
<g
class="stagger"
style="animation-delay: 600ms"
transform="translate(25, 0)"
>
<svg
data-testid="icon"
class="icon"
viewBox="0 0 16 16"
version="1.1"
width="16"
height="16"
>
<path
fill-rule="evenodd"
d="M1.643 3.143L.427 1.927A.25.25 0 000 2.104V5.75c0 .138.112.25.25.25h3.646a.25.25 0 00.177-.427L2.715 4.215a6.5 6.5 0 11-1.18 4.458.75.75 0 10-1.493.154 8.001 8.001 0 101.6-5.684zM7.75 4a.75.75 0 01.75.75v2.992l2.028.812a.75.75 0 01-.557 1.392l-2.5-1A.75.75 0 017 8.25v-3.5A.75.75 0 017.75 4z"
/>
</svg>
<text class="stat bold" x="25" y="12.5">Total Commits (2023):</text>
<text class="stat bold" x="219.01" y="12.5" data-testid="commits">
7
</text>
</g>
</g>
<g transform="translate(0, 50)">
<g
class="stagger"
style="animation-delay: 750ms"
transform="translate(25, 0)"
>
<svg
data-testid="icon"
class="icon"
viewBox="0 0 16 16"
version="1.1"
width="16"
height="16"
>
<path
fill-rule="evenodd"
d="M7.177 3.073L9.573.677A.25.25 0 0110 .854v4.792a.25.25 0 01-.427.177L7.177 3.427a.25.25 0 010-.354zM3.75 2.5a.75.75 0 100 1.5.75.75 0 000-1.5zm-2.25.75a2.25 2.25 0 113 2.122v5.256a2.251 2.251 0 11-1.5 0V5.372A2.25 2.25 0 011.5 3.25zM11 2.5h-1V4h1a1 1 0 011 1v5.628a2.251 2.251 0 101.5 0V5A2.5 2.5 0 0011 2.5zm1 10.25a.75.75 0 111.5 0 .75.75 0 01-1.5 0zM3.75 12a.75.75 0 100 1.5.75.75 0 000-1.5z"
/>
</svg>
<text class="stat bold" x="25" y="12.5">Total PRs:</text>
<text class="stat bold" x="219.01" y="12.5" data-testid="prs">1</text>
</g>
</g>
<g transform="translate(0, 75)">
<g
class="stagger"
style="animation-delay: 900ms"
transform="translate(25, 0)"
>
<svg
data-testid="icon"
class="icon"
viewBox="0 0 16 16"
version="1.1"
width="16"
height="16"
>
<path
fill-rule="evenodd"
d="M8 1.5a6.5 6.5 0 100 13 6.5 6.5 0 000-13zM0 8a8 8 0 1116 0A8 8 0 010 8zm9 3a1 1 0 11-2 0 1 1 0 012 0zm-.25-6.25a.75.75 0 00-1.5 0v3.5a.75.75 0 001.5 0v-3.5z"
/>
</svg>
<text class="stat bold" x="25" y="12.5">Total Issues:</text>
<text class="stat bold" x="219.01" y="12.5" data-testid="issues">
1
</text>
</g>
</g>
<g transform="translate(0, 100)">
<g
class="stagger"
style="animation-delay: 1050ms"
transform="translate(25, 0)"
>
<svg
data-testid="icon"
class="icon"
viewBox="0 0 16 16"
version="1.1"
width="16"
height="16"
>
<path
fill-rule="evenodd"
d="M2 2.5A2.5 2.5 0 014.5 0h8.75a.75.75 0 01.75.75v12.5a.75.75 0 01-.75.75h-2.5a.75.75 0 110-1.5h1.75v-2h-8a1 1 0 00-.714 1.7.75.75 0 01-1.072 1.05A2.495 2.495 0 012 11.5v-9zm10.5-1V9h-8c-.356 0-.694.074-1 .208V2.5a1 1 0 011-1h8zM5 12.25v3.25a.25.25 0 00.4.2l1.45-1.087a.25.25 0 01.3 0L8.6 15.7a.25.25 0 00.4-.2v-3.25a.25.25 0 00-.25-.25h-3.5a.25.25 0 00-.25.25z"
/>
</svg>
<text class="stat bold" x="25" y="12.5">
Contributed to (last year):
</text>
<text class="stat bold" x="219.01" y="12.5" data-testid="contribs">
1
</text>
</g>
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.5 KiB

@@ -1,179 +0,0 @@
<svg
width="450"
height="195"
viewBox="0 0 450 195"
fill="none"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="descId"
>
<title id="titleId">
Hello world, this is a very very very very very long title, Rank: A+
</title>
<desc id="descId">
Total Stars Earned: 1, Total Commits in 2023 : 1, Total PRs: 1, Total
Issues: 1, Contributed to (last year): 1
</desc>
<style>
.header {
font: 600 18px "Segoe UI", Ubuntu, Sans-Serif;
fill: #2f80ed;
animation: fadeInAnimation 0.8s ease-in-out forwards;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.header {
font-size: 15.5px;
}
}
.stat {
font: 600 14px "Segoe UI", Ubuntu, "Helvetica Neue", Sans-Serif;
fill: #434d58;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.stat {
font-size: 12px;
}
}
.rank-text {
font: 800 24px "Segoe UI", Ubuntu, Sans-Serif;
fill: #434d58;
animation: scaleInAnimation 0.3s ease-in-out forwards;
}
.not_bold {
font-weight: 400;
}
.bold {
font-weight: 700;
}
.icon {
fill: #4c71f2;
display: none;
}
.rank-circle-rim {
stroke: #2f80ed;
fill: none;
stroke-width: 6;
opacity: 0.2;
}
.rank-circle {
stroke: #2f80ed;
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;
}
* {
animation-duration: 0s !important;
animation-delay: 0s !important;
}
</style>
<rect
data-testid="card-bg"
x="0.5"
y="0.5"
rx="4.5"
height="99%"
stroke="#e4e2e2"
width="449"
fill="#fffefe"
stroke-opacity="1"
/>
<g data-testid="card-title" transform="translate(25, 35)">
<g transform="translate(0, 0)">
<text x="0" y="0" class="header" data-testid="header">
Hello world, this is a very very very very very long title
</text>
</g>
</g>
<g data-testid="main-card-body" transform="translate(0, 55)">
<g data-testid="rank-circle" transform="translate(365, 47.5)">
<circle class="rank-circle-rim" cx="-10" cy="8" r="40" />
<circle class="rank-circle" cx="-10" cy="8" r="40" />
<g class="rank-text">
<text
x="-5"
y="3"
alignment-baseline="central"
dominant-baseline="central"
text-anchor="middle"
>
A+
</text>
</g>
</g>
<svg x="0" y="0">
<g transform="translate(0, 0)">
<g
class="stagger"
style="animation-delay: 450ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Stars Earned:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="stars">
1
</text>
</g>
</g>
<g transform="translate(0, 25)">
<g
class="stagger"
style="animation-delay: 600ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Commits (2023):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="commits">
7
</text>
</g>
</g>
<g transform="translate(0, 50)">
<g
class="stagger"
style="animation-delay: 750ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total PRs:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="prs">1</text>
</g>
</g>
<g transform="translate(0, 75)">
<g
class="stagger"
style="animation-delay: 900ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Issues:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="issues">
1
</text>
</g>
</g>
<g transform="translate(0, 100)">
<g
class="stagger"
style="animation-delay: 1050ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Contributed to (last year):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="contribs">
1
</text>
</g>
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

@@ -1,164 +0,0 @@
<svg
width="524.375"
height="195"
viewBox="0 0 524.375 195"
fill="none"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="descId"
>
<title id="titleId">
Hello world, this is a very very very very very long title, Rank: A+
</title>
<desc id="descId">
Total Stars Earned: 1, Total Commits in 2023 : 1, Total PRs: 1, Total
Issues: 1, Contributed to (last year): 1
</desc>
<style>
.header {
font: 600 18px "Segoe UI", Ubuntu, Sans-Serif;
fill: #2f80ed;
animation: fadeInAnimation 0.8s ease-in-out forwards;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.header {
font-size: 15.5px;
}
}
.stat {
font: 600 14px "Segoe UI", Ubuntu, "Helvetica Neue", Sans-Serif;
fill: #434d58;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.stat {
font-size: 12px;
}
}
.rank-text {
font: 800 24px "Segoe UI", Ubuntu, Sans-Serif;
fill: #434d58;
animation: scaleInAnimation 0.3s ease-in-out forwards;
}
.not_bold {
font-weight: 400;
}
.bold {
font-weight: 700;
}
.icon {
fill: #4c71f2;
display: none;
}
.rank-circle-rim {
stroke: #2f80ed;
fill: none;
stroke-width: 6;
opacity: 0.2;
}
.rank-circle {
stroke: #2f80ed;
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;
}
* {
animation-duration: 0s !important;
animation-delay: 0s !important;
}
</style>
<rect
data-testid="card-bg"
x="0.5"
y="0.5"
rx="4.5"
height="99%"
stroke="#e4e2e2"
width="523.375"
fill="#fffefe"
stroke-opacity="1"
/>
<g data-testid="card-title" transform="translate(25, 35)">
<g transform="translate(0, 0)">
<text x="0" y="0" class="header" data-testid="header">
Hello world, this is a very very very very very long title
</text>
</g>
</g>
<g data-testid="main-card-body" transform="translate(0, 55)">
<svg x="0" y="0">
<g transform="translate(0, 0)">
<g
class="stagger"
style="animation-delay: 450ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Stars Earned:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="stars">
1
</text>
</g>
</g>
<g transform="translate(0, 25)">
<g
class="stagger"
style="animation-delay: 600ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Commits (2023):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="commits">
7
</text>
</g>
</g>
<g transform="translate(0, 50)">
<g
class="stagger"
style="animation-delay: 750ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total PRs:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="prs">1</text>
</g>
</g>
<g transform="translate(0, 75)">
<g
class="stagger"
style="animation-delay: 900ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Issues:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="issues">
1
</text>
</g>
</g>
<g transform="translate(0, 100)">
<g
class="stagger"
style="animation-delay: 1050ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Contributed to (last year):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="contribs">
1
</text>
</g>
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

@@ -1,164 +0,0 @@
<svg
width="524.375"
height="195"
viewBox="0 0 524.375 195"
fill="none"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="descId"
>
<title id="titleId">
Hello world, this is a very very very very very long title, Rank: A+
</title>
<desc id="descId">
Total Stars Earned: 1, Total Commits in 2023 : 1, Total PRs: 1, Total
Issues: 1, Contributed to (last year): 1
</desc>
<style>
.header {
font: 600 18px "Segoe UI", Ubuntu, Sans-Serif;
fill: #2f80ed;
animation: fadeInAnimation 0.8s ease-in-out forwards;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.header {
font-size: 15.5px;
}
}
.stat {
font: 600 14px "Segoe UI", Ubuntu, "Helvetica Neue", Sans-Serif;
fill: #434d58;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.stat {
font-size: 12px;
}
}
.rank-text {
font: 800 24px "Segoe UI", Ubuntu, Sans-Serif;
fill: #434d58;
animation: scaleInAnimation 0.3s ease-in-out forwards;
}
.not_bold {
font-weight: 400;
}
.bold {
font-weight: 700;
}
.icon {
fill: #4c71f2;
display: none;
}
.rank-circle-rim {
stroke: #2f80ed;
fill: none;
stroke-width: 6;
opacity: 0.2;
}
.rank-circle {
stroke: #2f80ed;
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;
}
* {
animation-duration: 0s !important;
animation-delay: 0s !important;
}
</style>
<rect
data-testid="card-bg"
x="0.5"
y="0.5"
rx="4.5"
height="99%"
stroke="#e4e2e2"
width="523.375"
fill="#fffefe"
stroke-opacity="1"
/>
<g data-testid="card-title" transform="translate(25, 35)">
<g transform="translate(0, 0)">
<text x="0" y="0" class="header" data-testid="header">
Hello world, this is a very very very very very long title
</text>
</g>
</g>
<g data-testid="main-card-body" transform="translate(0, 55)">
<svg x="0" y="0">
<g transform="translate(0, 0)">
<g
class="stagger"
style="animation-delay: 450ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Stars Earned:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="stars">
1
</text>
</g>
</g>
<g transform="translate(0, 25)">
<g
class="stagger"
style="animation-delay: 600ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Commits (2023):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="commits">
7
</text>
</g>
</g>
<g transform="translate(0, 50)">
<g
class="stagger"
style="animation-delay: 750ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total PRs:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="prs">1</text>
</g>
</g>
<g transform="translate(0, 75)">
<g
class="stagger"
style="animation-delay: 900ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Issues:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="issues">
1
</text>
</g>
</g>
<g transform="translate(0, 100)">
<g
class="stagger"
style="animation-delay: 1050ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Contributed to (last year):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="contribs">
1
</text>
</g>
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

@@ -1,152 +0,0 @@
<svg
width="450"
height="150"
viewBox="0 0 450 150"
fill="none"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="descId"
>
<title id="titleId">Cateline Mnemosyne's GitHub Stats, Rank: A+</title>
<desc id="descId">
Total PRs: 1, Total Issues: 1, Contributed to (last year): 1
</desc>
<style>
.header {
font: 600 18px "Segoe UI", Ubuntu, Sans-Serif;
fill: #2f80ed;
animation: fadeInAnimation 0.8s ease-in-out forwards;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.header {
font-size: 15.5px;
}
}
.stat {
font: 600 14px "Segoe UI", Ubuntu, "Helvetica Neue", Sans-Serif;
fill: #434d58;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.stat {
font-size: 12px;
}
}
.rank-text {
font: 800 24px "Segoe UI", Ubuntu, Sans-Serif;
fill: #434d58;
animation: scaleInAnimation 0.3s ease-in-out forwards;
}
.not_bold {
font-weight: 400;
}
.bold {
font-weight: 700;
}
.icon {
fill: #4c71f2;
display: none;
}
.rank-circle-rim {
stroke: #2f80ed;
fill: none;
stroke-width: 6;
opacity: 0.2;
}
.rank-circle {
stroke: #2f80ed;
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;
}
* {
animation-duration: 0s !important;
animation-delay: 0s !important;
}
</style>
<rect
data-testid="card-bg"
x="0.5"
y="0.5"
rx="4.5"
height="99%"
stroke="#e4e2e2"
width="449"
fill="#fffefe"
stroke-opacity="1"
/>
<g data-testid="card-title" transform="translate(25, 35)">
<g transform="translate(0, 0)">
<text x="0" y="0" class="header" data-testid="header">
Cateline Mnemosyne's GitHub Stats
</text>
</g>
</g>
<g data-testid="main-card-body" transform="translate(0, 55)">
<g data-testid="rank-circle" transform="translate(365, 25)">
<circle class="rank-circle-rim" cx="-10" cy="8" r="40" />
<circle class="rank-circle" cx="-10" cy="8" r="40" />
<g class="rank-text">
<text
x="-5"
y="3"
alignment-baseline="central"
dominant-baseline="central"
text-anchor="middle"
>
A+
</text>
</g>
</g>
<svg x="0" y="0">
<g transform="translate(0, 0)">
<g
class="stagger"
style="animation-delay: 450ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total PRs:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="prs">1</text>
</g>
</g>
<g transform="translate(0, 25)">
<g
class="stagger"
style="animation-delay: 600ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Issues:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="issues">
1
</text>
</g>
</g>
<g transform="translate(0, 50)">
<g
class="stagger"
style="animation-delay: 750ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Contributed to (last year):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="contribs">
1
</text>
</g>
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.6 KiB

@@ -1,177 +0,0 @@
<svg
width="450"
height="195"
viewBox="0 0 450 195"
fill="none"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="descId"
>
<title id="titleId">Cateline Mnemosyne's GitHub Stats, Rank: A+</title>
<desc id="descId">
Total Stars Earned: 1, Total Commits in 2023 : 1, Total PRs: 1, Total
Issues: 1, Contributed to (last year): 1
</desc>
<style>
.header {
font: 600 18px "Segoe UI", Ubuntu, Sans-Serif;
fill: #2f80ed;
animation: fadeInAnimation 0.8s ease-in-out forwards;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.header {
font-size: 15.5px;
}
}
.stat {
font: 600 14px "Segoe UI", Ubuntu, "Helvetica Neue", Sans-Serif;
fill: #434d58;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.stat {
font-size: 12px;
}
}
.rank-text {
font: 800 24px "Segoe UI", Ubuntu, Sans-Serif;
fill: #434d58;
animation: scaleInAnimation 0.3s ease-in-out forwards;
}
.not_bold {
font-weight: 400;
}
.bold {
font-weight: 700;
}
.icon {
fill: #4c71f2;
display: none;
}
.rank-circle-rim {
stroke: #2f80ed;
fill: none;
stroke-width: 6;
opacity: 0.2;
}
.rank-circle {
stroke: #2f80ed;
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;
}
* {
animation-duration: 0s !important;
animation-delay: 0s !important;
}
</style>
<rect
data-testid="card-bg"
x="0.5"
y="0.5"
rx="4.5"
height="99%"
stroke="#e4e2e2"
width="449"
fill="#fffefe"
stroke-opacity="0"
/>
<g data-testid="card-title" transform="translate(25, 35)">
<g transform="translate(0, 0)">
<text x="0" y="0" class="header" data-testid="header">
Cateline Mnemosyne's GitHub Stats
</text>
</g>
</g>
<g data-testid="main-card-body" transform="translate(0, 55)">
<g data-testid="rank-circle" transform="translate(365, 47.5)">
<circle class="rank-circle-rim" cx="-10" cy="8" r="40" />
<circle class="rank-circle" cx="-10" cy="8" r="40" />
<g class="rank-text">
<text
x="-5"
y="3"
alignment-baseline="central"
dominant-baseline="central"
text-anchor="middle"
>
A+
</text>
</g>
</g>
<svg x="0" y="0">
<g transform="translate(0, 0)">
<g
class="stagger"
style="animation-delay: 450ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Stars Earned:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="stars">
1
</text>
</g>
</g>
<g transform="translate(0, 25)">
<g
class="stagger"
style="animation-delay: 600ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Commits (2023):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="commits">
7
</text>
</g>
</g>
<g transform="translate(0, 50)">
<g
class="stagger"
style="animation-delay: 750ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total PRs:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="prs">1</text>
</g>
</g>
<g transform="translate(0, 75)">
<g
class="stagger"
style="animation-delay: 900ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Issues:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="issues">
1
</text>
</g>
</g>
<g transform="translate(0, 100)">
<g
class="stagger"
style="animation-delay: 1050ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Contributed to (last year):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="contribs">
1
</text>
</g>
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

@@ -1,162 +0,0 @@
<svg
width="370.1875000000001"
height="195"
viewBox="0 0 370.1875000000001 195"
fill="none"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="descId"
>
<title id="titleId">Cateline Mnemosyne's GitHub Stats, Rank: A+</title>
<desc id="descId">
Total Stars Earned: 1, Total Commits in 2023 : 1, Total PRs: 1, Total
Issues: 1, Contributed to (last year): 1
</desc>
<style>
.header {
font: 600 18px "Segoe UI", Ubuntu, Sans-Serif;
fill: #2f80ed;
animation: fadeInAnimation 0.8s ease-in-out forwards;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.header {
font-size: 15.5px;
}
}
.stat {
font: 600 14px "Segoe UI", Ubuntu, "Helvetica Neue", Sans-Serif;
fill: #434d58;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.stat {
font-size: 12px;
}
}
.rank-text {
font: 800 24px "Segoe UI", Ubuntu, Sans-Serif;
fill: #434d58;
animation: scaleInAnimation 0.3s ease-in-out forwards;
}
.not_bold {
font-weight: 400;
}
.bold {
font-weight: 700;
}
.icon {
fill: #4c71f2;
display: none;
}
.rank-circle-rim {
stroke: #2f80ed;
fill: none;
stroke-width: 6;
opacity: 0.2;
}
.rank-circle {
stroke: #2f80ed;
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;
}
* {
animation-duration: 0s !important;
animation-delay: 0s !important;
}
</style>
<rect
data-testid="card-bg"
x="0.5"
y="0.5"
rx="4.5"
height="99%"
stroke="#e4e2e2"
width="369.1875000000001"
fill="#fffefe"
stroke-opacity="1"
/>
<g data-testid="card-title" transform="translate(25, 35)">
<g transform="translate(0, 0)">
<text x="0" y="0" class="header" data-testid="header">
Cateline Mnemosyne's GitHub Stats
</text>
</g>
</g>
<g data-testid="main-card-body" transform="translate(0, 55)">
<svg x="0" y="0">
<g transform="translate(0, 0)">
<g
class="stagger"
style="animation-delay: 450ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Stars Earned:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="stars">
1
</text>
</g>
</g>
<g transform="translate(0, 25)">
<g
class="stagger"
style="animation-delay: 600ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Commits (2023):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="commits">
7
</text>
</g>
</g>
<g transform="translate(0, 50)">
<g
class="stagger"
style="animation-delay: 750ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total PRs:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="prs">1</text>
</g>
</g>
<g transform="translate(0, 75)">
<g
class="stagger"
style="animation-delay: 900ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Issues:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="issues">
1
</text>
</g>
</g>
<g transform="translate(0, 100)">
<g
class="stagger"
style="animation-delay: 1050ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Contributed to (last year):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="contribs">
1
</text>
</g>
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

@@ -1,169 +0,0 @@
<svg
width="450"
height="165"
viewBox="0 0 450 165"
fill="none"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="descId"
>
<title id="titleId">Cateline Mnemosyne's GitHub Stats, Rank: A+</title>
<desc id="descId">
Total Stars Earned: 1, Total Commits in 2023 : 1, Total PRs: 1, Total
Issues: 1, Contributed to (last year): 1
</desc>
<style>
.header {
font: 600 18px "Segoe UI", Ubuntu, Sans-Serif;
fill: #2f80ed;
animation: fadeInAnimation 0.8s ease-in-out forwards;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.header {
font-size: 15.5px;
}
}
.stat {
font: 600 14px "Segoe UI", Ubuntu, "Helvetica Neue", Sans-Serif;
fill: #434d58;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.stat {
font-size: 12px;
}
}
.rank-text {
font: 800 24px "Segoe UI", Ubuntu, Sans-Serif;
fill: #434d58;
animation: scaleInAnimation 0.3s ease-in-out forwards;
}
.not_bold {
font-weight: 400;
}
.bold {
font-weight: 700;
}
.icon {
fill: #4c71f2;
display: none;
}
.rank-circle-rim {
stroke: #2f80ed;
fill: none;
stroke-width: 6;
opacity: 0.2;
}
.rank-circle {
stroke: #2f80ed;
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;
}
* {
animation-duration: 0s !important;
animation-delay: 0s !important;
}
</style>
<rect
data-testid="card-bg"
x="0.5"
y="0.5"
rx="4.5"
height="99%"
stroke="#e4e2e2"
width="449"
fill="#fffefe"
stroke-opacity="1"
/>
<g data-testid="main-card-body" transform="translate(0, 25)">
<g data-testid="rank-circle" transform="translate(365, 47.5)">
<circle class="rank-circle-rim" cx="-10" cy="8" r="40" />
<circle class="rank-circle" cx="-10" cy="8" r="40" />
<g class="rank-text">
<text
x="-5"
y="3"
alignment-baseline="central"
dominant-baseline="central"
text-anchor="middle"
>
A+
</text>
</g>
</g>
<svg x="0" y="0">
<g transform="translate(0, 0)">
<g
class="stagger"
style="animation-delay: 450ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Stars Earned:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="stars">
1
</text>
</g>
</g>
<g transform="translate(0, 25)">
<g
class="stagger"
style="animation-delay: 600ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Commits (2023):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="commits">
7
</text>
</g>
</g>
<g transform="translate(0, 50)">
<g
class="stagger"
style="animation-delay: 750ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total PRs:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="prs">1</text>
</g>
</g>
<g transform="translate(0, 75)">
<g
class="stagger"
style="animation-delay: 900ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Issues:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="issues">
1
</text>
</g>
</g>
<g transform="translate(0, 100)">
<g
class="stagger"
style="animation-delay: 1050ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Contributed to (last year):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="contribs">
1
</text>
</g>
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.2 KiB

@@ -1,249 +0,0 @@
<svg
width="467"
height="645"
viewBox="0 0 467 645"
fill="none"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="descId"
>
<title id="titleId">Cateline Mnemosyne's GitHub Stats, Rank: A+</title>
<desc id="descId">
Total Stars Earned: 1, Total Commits in 2023 : 1, Total PRs: 1, Total
Issues: 1, Contributed to (last year): 1
</desc>
<style>
.header {
font: 600 18px "Segoe UI", Ubuntu, Sans-Serif;
fill: #2f80ed;
animation: fadeInAnimation 0.8s ease-in-out forwards;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.header {
font-size: 15.5px;
}
}
.stat {
font: 600 14px "Segoe UI", Ubuntu, "Helvetica Neue", Sans-Serif;
fill: #434d58;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.stat {
font-size: 12px;
}
}
.rank-text {
font: 800 24px "Segoe UI", Ubuntu, Sans-Serif;
fill: #434d58;
animation: scaleInAnimation 0.3s ease-in-out forwards;
}
.not_bold {
font-weight: 400;
}
.bold {
font-weight: 700;
}
.icon {
fill: #4c71f2;
display: block;
}
.rank-circle-rim {
stroke: #2f80ed;
fill: none;
stroke-width: 6;
opacity: 0.2;
}
.rank-circle {
stroke: #2f80ed;
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;
}
* {
animation-duration: 0s !important;
animation-delay: 0s !important;
}
</style>
<rect
data-testid="card-bg"
x="0.5"
y="0.5"
rx="4.5"
height="99%"
stroke="#e4e2e2"
width="466"
fill="#fffefe"
stroke-opacity="1"
/>
<g data-testid="card-title" transform="translate(25, 35)">
<g transform="translate(0, 0)">
<text x="0" y="0" class="header" data-testid="header">
Cateline Mnemosyne's GitHub Stats
</text>
</g>
</g>
<g data-testid="main-card-body" transform="translate(0, 55)">
<g data-testid="rank-circle" transform="translate(390.5, 272.5)">
<circle class="rank-circle-rim" cx="-10" cy="8" r="40" />
<circle class="rank-circle" cx="-10" cy="8" r="40" />
<g class="rank-text">
<text
x="-5"
y="3"
alignment-baseline="central"
dominant-baseline="central"
text-anchor="middle"
>
A+
</text>
</g>
</g>
<svg x="0" y="0">
<g transform="translate(0, 0)">
<g
class="stagger"
style="animation-delay: 450ms"
transform="translate(25, 0)"
>
<svg
data-testid="icon"
class="icon"
viewBox="0 0 16 16"
version="1.1"
width="16"
height="16"
>
<path
fill-rule="evenodd"
d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"
/>
</svg>
<text class="stat bold" x="25" y="12.5">Total Stars Earned:</text>
<text class="stat bold" x="219.01" y="12.5" data-testid="stars">
1
</text>
</g>
</g>
<g transform="translate(0, 100)">
<g
class="stagger"
style="animation-delay: 600ms"
transform="translate(25, 0)"
>
<svg
data-testid="icon"
class="icon"
viewBox="0 0 16 16"
version="1.1"
width="16"
height="16"
>
<path
fill-rule="evenodd"
d="M1.643 3.143L.427 1.927A.25.25 0 000 2.104V5.75c0 .138.112.25.25.25h3.646a.25.25 0 00.177-.427L2.715 4.215a6.5 6.5 0 11-1.18 4.458.75.75 0 10-1.493.154 8.001 8.001 0 101.6-5.684zM7.75 4a.75.75 0 01.75.75v2.992l2.028.812a.75.75 0 01-.557 1.392l-2.5-1A.75.75 0 017 8.25v-3.5A.75.75 0 017.75 4z"
/>
</svg>
<text class="stat bold" x="25" y="12.5">Total Commits (2023):</text>
<text class="stat bold" x="219.01" y="12.5" data-testid="commits">
7
</text>
</g>
</g>
<g transform="translate(0, 200)">
<g
class="stagger"
style="animation-delay: 750ms"
transform="translate(25, 0)"
>
<svg
data-testid="icon"
class="icon"
viewBox="0 0 16 16"
version="1.1"
width="16"
height="16"
>
<path
fill-rule="evenodd"
d="M7.177 3.073L9.573.677A.25.25 0 0110 .854v4.792a.25.25 0 01-.427.177L7.177 3.427a.25.25 0 010-.354zM3.75 2.5a.75.75 0 100 1.5.75.75 0 000-1.5zm-2.25.75a2.25 2.25 0 113 2.122v5.256a2.251 2.251 0 11-1.5 0V5.372A2.25 2.25 0 011.5 3.25zM11 2.5h-1V4h1a1 1 0 011 1v5.628a2.251 2.251 0 101.5 0V5A2.5 2.5 0 0011 2.5zm1 10.25a.75.75 0 111.5 0 .75.75 0 01-1.5 0zM3.75 12a.75.75 0 100 1.5.75.75 0 000-1.5z"
/>
</svg>
<text class="stat bold" x="25" y="12.5">Total PRs:</text>
<text class="stat bold" x="219.01" y="12.5" data-testid="prs">1</text>
</g>
</g>
<g transform="translate(0, 300)">
<g
class="stagger"
style="animation-delay: 900ms"
transform="translate(25, 0)"
>
<svg
data-testid="icon"
class="icon"
viewBox="0 0 16 16"
version="1.1"
width="16"
height="16"
>
<path
fill-rule="evenodd"
d="M8 1.5a6.5 6.5 0 100 13 6.5 6.5 0 000-13zM0 8a8 8 0 1116 0A8 8 0 010 8zm9 3a1 1 0 11-2 0 1 1 0 012 0zm-.25-6.25a.75.75 0 00-1.5 0v3.5a.75.75 0 001.5 0v-3.5z"
/>
</svg>
<text class="stat bold" x="25" y="12.5">Total Issues:</text>
<text class="stat bold" x="219.01" y="12.5" data-testid="issues">
1
</text>
</g>
</g>
<g transform="translate(0, 400)">
<g
class="stagger"
style="animation-delay: 1050ms"
transform="translate(25, 0)"
>
<svg
data-testid="icon"
class="icon"
viewBox="0 0 16 16"
version="1.1"
width="16"
height="16"
>
<path
fill-rule="evenodd"
d="M2 2.5A2.5 2.5 0 014.5 0h8.75a.75.75 0 01.75.75v12.5a.75.75 0 01-.75.75h-2.5a.75.75 0 110-1.5h1.75v-2h-8a1 1 0 00-.714 1.7.75.75 0 01-1.072 1.05A2.495 2.495 0 012 11.5v-9zm10.5-1V9h-8c-.356 0-.694.074-1 .208V2.5a1 1 0 011-1h8zM5 12.25v3.25a.25.25 0 00.4.2l1.45-1.087a.25.25 0 01.3 0L8.6 15.7a.25.25 0 00.4-.2v-3.25a.25.25 0 00-.25-.25h-3.5a.25.25 0 00-.25.25z"
/>
</svg>
<text class="stat bold" x="25" y="12.5">
Contributed to (last year):
</text>
<text class="stat bold" x="219.01" y="12.5" data-testid="contribs">
1
</text>
</g>
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.5 KiB

@@ -1,185 +0,0 @@
<svg
width="450"
height="195"
viewBox="0 0 450 195"
fill="none"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="descId"
>
<title id="titleId">
&#1057;&#1090;&#1072;&#1090;&#1080;&#1089;&#1090;&#1080;&#1082;&#1072;
GitHub
&#1087;&#1086;&#1083;&#1100;&#1079;&#1086;&#1074;&#1072;&#1090;&#1077;&#1083;&#1103;
Cateline Mnemosyne, Rank: A+
</title>
<desc id="descId">
Всего звезд: 1, Всего коммитов in 2023 : 1, Всего pull request`ов: 1, Всего
issue: 1, Внёс вклад в (last year): 1
</desc>
<style>
.header {
font: 600 18px "Segoe UI", Ubuntu, Sans-Serif;
fill: #2f80ed;
animation: fadeInAnimation 0.8s ease-in-out forwards;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.header {
font-size: 15.5px;
}
}
.stat {
font: 600 14px "Segoe UI", Ubuntu, "Helvetica Neue", Sans-Serif;
fill: #434d58;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.stat {
font-size: 12px;
}
}
.rank-text {
font: 800 24px "Segoe UI", Ubuntu, Sans-Serif;
fill: #434d58;
animation: scaleInAnimation 0.3s ease-in-out forwards;
}
.not_bold {
font-weight: 400;
}
.bold {
font-weight: 700;
}
.icon {
fill: #4c71f2;
display: none;
}
.rank-circle-rim {
stroke: #2f80ed;
fill: none;
stroke-width: 6;
opacity: 0.2;
}
.rank-circle {
stroke: #2f80ed;
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;
}
* {
animation-duration: 0s !important;
animation-delay: 0s !important;
}
</style>
<rect
data-testid="card-bg"
x="0.5"
y="0.5"
rx="4.5"
height="99%"
stroke="#e4e2e2"
width="449"
fill="#fffefe"
stroke-opacity="1"
/>
<g data-testid="card-title" transform="translate(25, 35)">
<g transform="translate(0, 0)">
<text x="0" y="0" class="header" data-testid="header">
&#1057;&#1090;&#1072;&#1090;&#1080;&#1089;&#1090;&#1080;&#1082;&#1072;
GitHub
&#1087;&#1086;&#1083;&#1100;&#1079;&#1086;&#1074;&#1072;&#1090;&#1077;&#1083;&#1103;
Cateline Mnemosyne
</text>
</g>
</g>
<g data-testid="main-card-body" transform="translate(0, 55)">
<g data-testid="rank-circle" transform="translate(365, 47.5)">
<circle class="rank-circle-rim" cx="-10" cy="8" r="40" />
<circle class="rank-circle" cx="-10" cy="8" r="40" />
<g class="rank-text">
<text
x="-5"
y="3"
alignment-baseline="central"
dominant-baseline="central"
text-anchor="middle"
>
A+
</text>
</g>
</g>
<svg x="0" y="0">
<g transform="translate(0, 0)">
<g
class="stagger"
style="animation-delay: 450ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Всего звезд:</text>
<text class="stat bold" x="249.01" y="12.5" data-testid="stars">
1
</text>
</g>
</g>
<g transform="translate(0, 25)">
<g
class="stagger"
style="animation-delay: 600ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Всего коммитов (2023):</text>
<text class="stat bold" x="249.01" y="12.5" data-testid="commits">
7
</text>
</g>
</g>
<g transform="translate(0, 50)">
<g
class="stagger"
style="animation-delay: 750ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Всего pull request`ов:</text>
<text class="stat bold" x="249.01" y="12.5" data-testid="prs">1</text>
</g>
</g>
<g transform="translate(0, 75)">
<g
class="stagger"
style="animation-delay: 900ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Всего issue:</text>
<text class="stat bold" x="249.01" y="12.5" data-testid="issues">
1
</text>
</g>
</g>
<g transform="translate(0, 100)">
<g
class="stagger"
style="animation-delay: 1050ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Внёс вклад в (last year):</text>
<text class="stat bold" x="249.01" y="12.5" data-testid="contribs">
1
</text>
</g>
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.8 KiB

@@ -1,177 +0,0 @@
<svg
width="450"
height="195"
viewBox="0 0 450 195"
fill="none"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="descId"
>
<title id="titleId">Cateline Mnemosyne's GitHub Stats, Rank: A+</title>
<desc id="descId">
Total Stars Earned: 1, Total Commits in 2023 : 1, Total PRs: 1, Total
Issues: 1, Contributed to (last year): 1
</desc>
<style>
.header {
font: 600 18px "Segoe UI", Ubuntu, Sans-Serif;
fill: #fe428e;
animation: fadeInAnimation 0.8s ease-in-out forwards;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.header {
font-size: 15.5px;
}
}
.stat {
font: 600 14px "Segoe UI", Ubuntu, "Helvetica Neue", Sans-Serif;
fill: #a9fef7;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.stat {
font-size: 12px;
}
}
.rank-text {
font: 800 24px "Segoe UI", Ubuntu, Sans-Serif;
fill: #a9fef7;
animation: scaleInAnimation 0.3s ease-in-out forwards;
}
.not_bold {
font-weight: 400;
}
.bold {
font-weight: 700;
}
.icon {
fill: #f8d847;
display: none;
}
.rank-circle-rim {
stroke: #fe428e;
fill: none;
stroke-width: 6;
opacity: 0.2;
}
.rank-circle {
stroke: #fe428e;
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;
}
* {
animation-duration: 0s !important;
animation-delay: 0s !important;
}
</style>
<rect
data-testid="card-bg"
x="0.5"
y="0.5"
rx="4.5"
height="99%"
stroke="#e4e2e2"
width="449"
fill="#141321"
stroke-opacity="1"
/>
<g data-testid="card-title" transform="translate(25, 35)">
<g transform="translate(0, 0)">
<text x="0" y="0" class="header" data-testid="header">
Cateline Mnemosyne's GitHub Stats
</text>
</g>
</g>
<g data-testid="main-card-body" transform="translate(0, 55)">
<g data-testid="rank-circle" transform="translate(365, 47.5)">
<circle class="rank-circle-rim" cx="-10" cy="8" r="40" />
<circle class="rank-circle" cx="-10" cy="8" r="40" />
<g class="rank-text">
<text
x="-5"
y="3"
alignment-baseline="central"
dominant-baseline="central"
text-anchor="middle"
>
A+
</text>
</g>
</g>
<svg x="0" y="0">
<g transform="translate(0, 0)">
<g
class="stagger"
style="animation-delay: 450ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Stars Earned:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="stars">
1
</text>
</g>
</g>
<g transform="translate(0, 25)">
<g
class="stagger"
style="animation-delay: 600ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Commits (2023):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="commits">
7
</text>
</g>
</g>
<g transform="translate(0, 50)">
<g
class="stagger"
style="animation-delay: 750ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total PRs:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="prs">1</text>
</g>
</g>
<g transform="translate(0, 75)">
<g
class="stagger"
style="animation-delay: 900ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Issues:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="issues">
1
</text>
</g>
</g>
<g transform="translate(0, 100)">
<g
class="stagger"
style="animation-delay: 1050ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Contributed to (last year):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="contribs">
1
</text>
</g>
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

@@ -1,177 +0,0 @@
<svg
width="450"
height="195"
viewBox="0 0 450 195"
fill="none"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="descId"
>
<title id="titleId">Cateline Mnemosyne's GitHub Stats, Rank: A+</title>
<desc id="descId">
Total Stars Earned: 1, Total Commits in 2023 : 1, Total PRs: 1, Total
Issues: 1, Contributed to (last year): 1
</desc>
<style>
.header {
font: 600 18px "Segoe UI", Ubuntu, Sans-Serif;
fill: #2f80ed;
animation: fadeInAnimation 0.8s ease-in-out forwards;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.header {
font-size: 15.5px;
}
}
.stat {
font: 600 14px "Segoe UI", Ubuntu, "Helvetica Neue", Sans-Serif;
fill: #434d58;
}
@supports (-moz-appearance: auto) {
/* Selector detects Firefox */
.stat {
font-size: 12px;
}
}
.rank-text {
font: 800 24px "Segoe UI", Ubuntu, Sans-Serif;
fill: #434d58;
animation: scaleInAnimation 0.3s ease-in-out forwards;
}
.not_bold {
font-weight: 400;
}
.bold {
font-weight: 700;
}
.icon {
fill: #4c71f2;
display: none;
}
.rank-circle-rim {
stroke: #2f80ed;
fill: none;
stroke-width: 6;
opacity: 0.2;
}
.rank-circle {
stroke: #2f80ed;
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;
}
* {
animation-duration: 0s !important;
animation-delay: 0s !important;
}
</style>
<rect
data-testid="card-bg"
x="0.5"
y="0.5"
rx="4.5"
height="99%"
stroke="#e4e2e2"
width="449"
fill="#fffefe"
stroke-opacity="1"
/>
<g data-testid="card-title" transform="translate(25, 35)">
<g transform="translate(0, 0)">
<text x="0" y="0" class="header" data-testid="header">
Cateline Mnemosyne's GitHub Stats
</text>
</g>
</g>
<g data-testid="main-card-body" transform="translate(0, 55)">
<g data-testid="rank-circle" transform="translate(365, 47.5)">
<circle class="rank-circle-rim" cx="-10" cy="8" r="40" />
<circle class="rank-circle" cx="-10" cy="8" r="40" />
<g class="rank-text">
<text
x="-5"
y="3"
alignment-baseline="central"
dominant-baseline="central"
text-anchor="middle"
>
A+
</text>
</g>
</g>
<svg x="0" y="0">
<g transform="translate(0, 0)">
<g
class="stagger"
style="animation-delay: 450ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Stars Earned:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="stars">
1
</text>
</g>
</g>
<g transform="translate(0, 25)">
<g
class="stagger"
style="animation-delay: 600ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Commits (2023):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="commits">
7
</text>
</g>
</g>
<g transform="translate(0, 50)">
<g
class="stagger"
style="animation-delay: 750ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total PRs:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="prs">1</text>
</g>
</g>
<g transform="translate(0, 75)">
<g
class="stagger"
style="animation-delay: 900ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Total Issues:</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="issues">
1
</text>
</g>
</g>
<g transform="translate(0, 100)">
<g
class="stagger"
style="animation-delay: 1050ms"
transform="translate(25, 0)"
>
<text class="stat bold" y="12.5">Contributed to (last year):</text>
<text class="stat bold" x="199.01" y="12.5" data-testid="contribs">
1
</text>
</g>
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

-152
View File
@@ -1,152 +0,0 @@
import "jest-svg-snapshot";
import "@testing-library/jest-dom";
import renderStatsCard from "../../src/cards/stats-card";
import prettier from "prettier";
const STATS_DATA = {
name: "Cateline Mnemosyne",
totalPRs: 1,
totalCommits: 7,
totalIssues: 1,
totalStars: 1,
contributedTo: 1,
rank: {
level: "A+",
score: 50.893750297869225,
},
};
const format = (svg) => prettier.format(svg, { parser: "html" });
describe("statsCard", () => {
it("should match default stat card", () => {
const svg = format(
renderStatsCard(STATS_DATA, { disable_animations: true }),
);
expect(svg).toMatchSVGSnapshot();
});
it("option hide", () => {
const svg = format(
renderStatsCard(STATS_DATA, {
disable_animations: true,
hide: ["commits", "stars"],
}),
);
expect(svg).toMatchSVGSnapshot();
});
it("option hide_border", () => {
const svg = format(
renderStatsCard(STATS_DATA, {
disable_animations: true,
hide_border: true,
}),
);
expect(svg).toMatchSVGSnapshot();
});
it("option hide_title", () => {
const svg = format(
renderStatsCard(STATS_DATA, {
disable_animations: true,
hide_title: true,
}),
);
expect(svg).toMatchSVGSnapshot();
});
it("option hide_rank", () => {
const svg = format(
renderStatsCard(STATS_DATA, {
disable_animations: true,
hide_rank: true,
}),
);
expect(svg).toMatchSVGSnapshot();
});
it("option theme", () => {
const svg = format(
renderStatsCard(STATS_DATA, {
disable_animations: true,
theme: "radical",
}),
);
expect(svg).toMatchSVGSnapshot();
});
it("option card_width", () => {
const svg = format(
renderStatsCard(STATS_DATA, {
disable_animations: true,
card_width: 800,
}),
);
expect(svg).toMatchSVGSnapshot();
});
it("option custom_title", () => {
const svg = format(
renderStatsCard(STATS_DATA, {
disable_animations: true,
custom_title:
"Hello world, this is a very very very very very long title",
}),
);
expect(svg).toMatchSVGSnapshot();
});
it("option custom_title hideRank", () => {
const svg = format(
renderStatsCard(STATS_DATA, {
disable_animations: true,
hide_rank: true,
custom_title:
"Hello world, this is a very very very very very long title",
}),
);
expect(svg).toMatchSVGSnapshot();
});
it("option custom_title hideRank card_width", () => {
const svg = format(
renderStatsCard(STATS_DATA, {
disable_animations: true,
card_width: 300,
hide_rank: true,
custom_title:
"Hello world, this is a very very very very very long title",
}),
);
expect(svg).toMatchSVGSnapshot();
});
it("option line_height show_icons", () => {
const svg = format(
renderStatsCard(STATS_DATA, {
disable_animations: true,
line_height: 100,
show_icons: true,
}),
);
expect(svg).toMatchSVGSnapshot();
});
it("option locale", () => {
const svg = format(
renderStatsCard(STATS_DATA, {
disable_animations: true,
locale: "ru",
}),
);
expect(svg).toMatchSVGSnapshot();
});
it("option colors", () => {
const svg = format(
renderStatsCard(STATS_DATA, {
disable_animations: true,
border_color: "0044ff",
title_color: "abd200",
icon_color: "b7d364",
text_color: "68b587",
bg_color: "0a0f0b",
show_icons: true,
}),
);
expect(svg).toMatchSVGSnapshot();
});
});
+21
View File
@@ -374,6 +374,27 @@ export const themes = {
border_color: "170F0C",
bg_color: "170F0C",
},
one_dark_pro: {
title_color: "61AFEF",
text_color: "E5C06E",
icon_color: "C678DD",
border_color: "3B4048",
bg_color: "23272E",
},
rose: {
title_color: "8d192b",
text_color: "862931",
icon_color: "B71F36",
border_color: "e9d8d4",
bg_color: "e9d8d4",
},
holi_theme: {
title_color: "5FABEE",
text_color: "D6E7FF",
icon_color: "5FABEE",
border_color: "85A4C0",
bg_color: "030314",
},
};
export default themes;