Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: allow users to pass ring_color param #2075

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions api/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export default async (req, res) => {
include_all_commits,
line_height,
title_color,
ring_color,
icon_color,
text_color,
text_bold,
Expand Down Expand Up @@ -76,6 +77,7 @@ export default async (req, res) => {
include_all_commits: parseBoolean(include_all_commits),
line_height,
title_color,
ring_color,
icon_color,
text_color,
text_bold: parseBoolean(text_bold),
Expand Down
1 change: 1 addition & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ You can provide multiple comma-separated values in the bg_color option to render
- `custom_title` - Sets a custom title for the card. Default: `<username> Github Stats`.
- `text_bold` - Use bold text _(boolean)_. Default: `true`.
- `disable_animations` - Disables all animations in the card _(boolean)_. Default: `false`.
- `ring_color` - Color of the rank circle _(hex color)_. Defaults to the theme ring color if it exists and otherwise the title color.

> **Note**
> When hide_rank=`true`, the minimum card width is 270 px + the title length and padding.
Expand Down
7 changes: 5 additions & 2 deletions src/cards/stats-card.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ const renderStatsCard = (stats = {}, options = { hide: [] }) => {
include_all_commits = false,
line_height = 25,
title_color,
ring_color,
icon_color,
text_color,
text_bold = true,
Expand All @@ -104,13 +105,14 @@ const renderStatsCard = (stats = {}, options = { hide: [] }) => {
const lheight = parseInt(String(line_height), 10);

// returns theme based colors with proper overrides and defaults
const { titleColor, textColor, iconColor, bgColor, borderColor } =
const { titleColor, iconColor, textColor, bgColor, borderColor, ringColor } =
getCardColors({
title_color,
icon_color,
text_color,
icon_color,
bg_color,
border_color,
ring_color,
theme,
});

Expand Down Expand Up @@ -200,6 +202,7 @@ const renderStatsCard = (stats = {}, options = { hide: [] }) => {
const progress = 100 - rank.score;
const cssStyles = getStyles({
titleColor,
ringColor,
textColor,
iconColor,
show_icons,
Expand Down
12 changes: 10 additions & 2 deletions src/common/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,9 +133,9 @@ function isValidGradient(colors) {
* @returns {string | string[]} The gradient or color.
*/
function fallbackColor(color, fallbackColor) {
let colors = color.split(",");
let gradient = null;

let colors = color ? color.split(",") : [];
if (colors.length > 1 && isValidGradient(colors)) {
gradient = colors;
}
Expand Down Expand Up @@ -207,6 +207,7 @@ function getCardColors({
icon_color,
bg_color,
border_color,
ring_color,
theme,
fallbackTheme = "default",
}) {
Expand All @@ -221,6 +222,13 @@ function getCardColors({
title_color || selectedTheme.title_color,
"#" + defaultTheme.title_color,
);

// get the color provided by the user else the theme color
// finally if both colors are invalid we use the titleColor
const ringColor = fallbackColor(
ring_color || selectedTheme.ring_color,
titleColor,
);
const iconColor = fallbackColor(
icon_color || selectedTheme.icon_color,
"#" + defaultTheme.icon_color,
Expand All @@ -239,7 +247,7 @@ function getCardColors({
"#" + defaultBorderColor,
);

return { titleColor, iconColor, textColor, bgColor, borderColor };
return { titleColor, iconColor, textColor, bgColor, borderColor, ringColor };
}

/**
Expand Down
5 changes: 3 additions & 2 deletions src/getStyles.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ const getStyles = ({
titleColor,
textColor,
iconColor,
ringColor,
show_icons,
progress,
}) => {
Expand Down Expand Up @@ -105,13 +106,13 @@ const getStyles = ({
}

.rank-circle-rim {
stroke: ${titleColor};
stroke: ${ringColor};
fill: none;
stroke-width: 6;
opacity: 0.2;
}
.rank-circle {
stroke: ${titleColor};
stroke: ${ringColor};
stroke-dasharray: 250;
fill: none;
stroke-width: 6;
Expand Down
4 changes: 2 additions & 2 deletions tests/__snapshots__/renderWakatimeCard.test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,13 @@ exports[`Test Render Wakatime Card should render correctly with compact layout 1
}

.rank-circle-rim {
stroke: #2f80ed;
stroke: undefined;
fill: none;
stroke-width: 6;
opacity: 0.2;
}
.rank-circle {
stroke: #2f80ed;
stroke: undefined;
stroke-dasharray: 250;
fill: none;
stroke-width: 6;
Expand Down
35 changes: 35 additions & 0 deletions tests/api.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -238,4 +238,39 @@ describe("Test /api/", () => {
),
);
});

it("should allow changing ring_color", async () => {
const { req, res } = faker(
{
username: "anuraghazra",
hide: "issues,prs,contribs",
show_icons: true,
hide_border: true,
line_height: 100,
title_color: "fff",
ring_color: "0000ff",
icon_color: "fff",
text_color: "fff",
bg_color: "fff",
},
data,
);

await api(req, res);

expect(res.setHeader).toBeCalledWith("Content-Type", "image/svg+xml");
expect(res.send).toBeCalledWith(
renderStatsCard(stats, {
hide: ["issues", "prs", "contribs"],
show_icons: true,
hide_border: true,
line_height: 100,
title_color: "fff",
ring_color: "0000ff",
icon_color: "fff",
text_color: "fff",
bg_color: "fff",
}),
);
});
});
33 changes: 33 additions & 0 deletions tests/renderStatsCard.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,39 @@ describe("Test renderStatsCard", () => {
);
});

it("should render custom ring_color properly", () => {
const customColors = {
title_color: "5a0",
ring_color: "0000ff",
icon_color: "1b998b",
text_color: "9991",
bg_color: "252525",
};

document.body.innerHTML = renderStatsCard(stats, { ...customColors });

const styleTag = document.querySelector("style");
const stylesObject = cssToObject(styleTag.innerHTML);

const headerClassStyles = stylesObject[":host"][".header "];
const statClassStyles = stylesObject[":host"][".stat "];
const iconClassStyles = stylesObject[":host"][".icon "];
const rankCircleStyles = stylesObject[":host"][".rank-circle "];
const rankCircleRimStyles = stylesObject[":host"][".rank-circle-rim "];

expect(headerClassStyles.fill.trim()).toBe(`#${customColors.title_color}`);
expect(statClassStyles.fill.trim()).toBe(`#${customColors.text_color}`);
expect(iconClassStyles.fill.trim()).toBe(`#${customColors.icon_color}`);
expect(rankCircleStyles.stroke.trim()).toBe(`#${customColors.ring_color}`);
expect(rankCircleRimStyles.stroke.trim()).toBe(
`#${customColors.ring_color}`,
);
expect(queryByTestId(document.body, "card-bg")).toHaveAttribute(
"fill",
"#252525",
);
});

it("should render icons correctly", () => {
document.body.innerHTML = renderStatsCard(stats, {
show_icons: true,
Expand Down
23 changes: 23 additions & 0 deletions tests/utils.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ describe("Test utils.js", () => {
let colors = getCardColors({
title_color: "f00",
text_color: "0f0",
ring_color: "0000ff",
icon_color: "00f",
bg_color: "fff",
border_color: "fff",
Expand All @@ -57,6 +58,7 @@ describe("Test utils.js", () => {
titleColor: "#f00",
textColor: "#0f0",
iconColor: "#00f",
ringColor: "#0000ff",
bgColor: "#fff",
borderColor: "#fff",
});
Expand All @@ -75,6 +77,7 @@ describe("Test utils.js", () => {
titleColor: "#2f80ed",
textColor: "#0f0",
iconColor: "#00f",
ringColor: "#2f80ed",
bgColor: "#fff",
borderColor: "#e4e2e2",
});
Expand All @@ -87,11 +90,31 @@ describe("Test utils.js", () => {
expect(colors).toStrictEqual({
titleColor: "#fff",
textColor: "#9f9f9f",
ringColor: "#fff",
iconColor: "#79ff97",
bgColor: "#151515",
borderColor: "#e4e2e2",
});
});

it("getCardColors: should return ring color equal to title color if not ring color is defined", () => {
let colors = getCardColors({
title_color: "f00",
text_color: "0f0",
icon_color: "00f",
bg_color: "fff",
border_color: "fff",
theme: "dark",
});
expect(colors).toStrictEqual({
titleColor: "#f00",
textColor: "#0f0",
iconColor: "#00f",
ringColor: "#f00",
bgColor: "#fff",
borderColor: "#fff",
});
});
});

describe("wrapTextMultiline", () => {
Expand Down