feat: add retro achievements link (#36)

### Explanation

_No response_

### Issue

_No response_

### Attestations

- [x] I have read and agree to the [Code of Conduct](https://docs.nhcarrigan.com/community/coc/)
- [x] I have read and agree to the [Community Guidelines](https://docs.nhcarrigan.com/community/guide/).
- [x] My contribution complies with the [Contributor Covenant](https://docs.nhcarrigan.com/dev/covenant/).

### Dependencies

- [ ] I have pinned the dependencies to a specific patch version.

### Style

- [x] I have run the linter and resolved any errors.
- [x] My pull request uses an appropriate title, matching the conventional commit standards.
- [x] My scope of feat/fix/chore/etc. correctly matches the nature of changes in my pull request.

### Tests

- [x] My contribution adds new code, and I have added tests to cover it.
- [ ] My contribution modifies existing code, and I have updated the tests to reflect these changes.
- [x] All new and existing tests pass locally with my changes.
- [x] Code coverage remains at or above the configured threshold.

### Documentation

_No response_

### Versioning

Patch - My pull request introduces bug fixes ONLY.

Reviewed-on: https://codeberg.org/nhcarrigan/portfolio/pulls/36
Co-authored-by: Naomi Carrigan <commits@nhcarrigan.com>
Co-committed-by: Naomi Carrigan <commits@nhcarrigan.com>
This commit is contained in:
Naomi Carrigan 2024-10-31 03:52:06 +00:00 committed by Naomi the Technomancer
parent c43635fa44
commit 857b8d331b
5 changed files with 236 additions and 64 deletions

View File

@ -3,7 +3,7 @@
"version": "0.1.0",
"private": true,
"scripts": {
"prebuild": "pnpm lint",
"prebuild": "pnpm lint && pnpm test",
"dev": "next dev",
"build": "next build",
"start": "next start",

View File

@ -55,6 +55,7 @@ import { Matrix } from "../icons/Matrix";
import { Peerlist } from "../icons/Peerlist";
import { Pixiv } from "../icons/Pixiv";
import { Polywork } from "../icons/Polywork";
import { RetroAchievements } from "../icons/RetroAchievements";
import { Saylor } from "../icons/Saylor";
import { TeeSpring } from "../icons/TeeSpring";
import { Throne } from "../icons/Throne";
@ -142,8 +143,8 @@ const Socials: Array<{
},
{
alt: "GitHub Logo",
background: "#333",
color: "#FFF",
background: "#333333",
color: "#FFFFFF",
icon: faGithub,
label: "GitHub",
link: "https://github.com/nhcarrigan",
@ -151,7 +152,7 @@ const Socials: Array<{
{
alt: "Discord Logo",
background: "#7289DA",
color: "#FFF",
color: "#FFFFFF",
icon: faDiscord,
label: "Discord",
link: "https://chat.naomi.lgbt",
@ -159,15 +160,15 @@ const Socials: Array<{
{
alt: "Element Logo",
background: "#29B6F6",
color: "#FFF",
color: "#FFFFFF",
icon: Matrix,
label: "Matrix",
link: "https://matrix.to/#/#naomi:matrix.org",
},
{
alt: "Octothorpe",
background: "#000",
color: "#FFF",
background: "#000000",
color: "#FFFFFF",
icon: faHashtag,
label: "IRC",
link: "https://docs.nhcarrigan.com/about/contact/#33-irc-channels",
@ -175,7 +176,7 @@ const Socials: Array<{
{
alt: "Slack Logo",
background: "#4A154B",
color: "#FFF",
color: "#FFFFFF",
icon: faSlack,
label: "Slack",
link: "https://join.slack.com/t/naomi-lgbt/signup",
@ -183,7 +184,7 @@ const Socials: Array<{
{
alt: "Reddit Logo",
background: "#FF4500",
color: "#FFF",
color: "#FFFFFF",
icon: faReddit,
label: "Reddit",
link: "https://reddit.com/r/nhcarrigan",
@ -191,7 +192,7 @@ const Socials: Array<{
{
alt: "Hashnode Logo",
background: "#2962FF",
color: "#FFF",
color: "#FFFFFF",
icon: faHashnode,
label: "Blog",
link: "https://blog.nhcarrigan.com",
@ -199,15 +200,15 @@ const Socials: Array<{
{
alt: "LinkedIn Logo",
background: "#0077B5",
color: "#FFF",
color: "#FFFFFF",
icon: faLinkedinIn,
label: "LinkedIn",
link: "https://linkedin.com/in/naomi-lgbt",
},
{
alt: "Peerlist Logo",
background: "rgb(33, 150, 83)",
color: "#FFF",
background: "#219653",
color: "#FFFFFF",
icon: Peerlist,
label: "Peerlist",
link: "https://resume.nhcarrigan.com",
@ -215,7 +216,7 @@ const Socials: Array<{
{
alt: "Polywork Logo",
background: "#7C3AED",
color: "#FFF",
color: "#FFFFFF",
icon: Polywork,
label: "Polywork",
link: "https://polywork.nhcarrigan.com/",
@ -223,7 +224,7 @@ const Socials: Array<{
{
alt: "Fiverr Logo",
background: "#1DBF73",
color: "#FFF",
color: "#FFFFFF",
icon: Fiverr,
label: "Fiverr",
link: "https://www.fiverr.com/nhcarrigan",
@ -231,7 +232,7 @@ const Socials: Array<{
{
alt: "Mastodon Logo",
background: "#2B90D9",
color: "#FFF",
color: "#FFFFFF",
icon: faMastodon,
label: "Mastodon",
link: "https://mastodon.social/@naomi_lgbt",
@ -239,15 +240,15 @@ const Socials: Array<{
{
alt: "X Logo",
background: "#1DA1F2",
color: "#FFF",
color: "#FFFFFF",
icon: faXTwitter,
label: "X (Twitter)",
link: "https://x.com/naomi_lgbt",
},
{
alt: "Steam Logo",
background: "rgb(27, 40, 56)",
color: "rgb(199, 213, 224)",
background: "#1b2838",
color: "#c7d5e0",
icon: faSteam,
label: "Steam",
link: "https://steamcommunity.com/id/naomi-lgbt/",
@ -255,15 +256,15 @@ const Socials: Array<{
{
alt: "Twitch Logo",
background: "#6441A4",
color: "#FFF",
color: "#FFFFFF",
icon: faTwitch,
label: "Twitch",
link: "https://www.twitch.tv/naomilgbt/",
},
{
alt: "How Long to Beat Logo",
background: "#333",
color: "#FFF",
background: "#333333",
color: "#FFFFFF",
icon: faGamepad,
label: "HLTB",
link: "https://howlongtobeat.com/user/naomi_lgbt",
@ -271,7 +272,7 @@ const Socials: Array<{
{
alt: "Snapchat Logo",
background: "#FFFC00",
color: "#000",
color: "#000000",
icon: faSnapchat,
label: "Snapchat",
link: "https://www.snapchat.com/add/naomi-lgbt",
@ -279,7 +280,7 @@ const Socials: Array<{
{
alt: "GOG Logo",
background: "#863A3A",
color: "#FFF",
color: "#FFFFFF",
icon: Gog,
label: "GOG",
link: "https://www.gog.com/u/naomi-lgbt",
@ -287,15 +288,15 @@ const Socials: Array<{
{
alt: "Itch.io Logo",
background: "#FA5C5C",
color: "#FFF",
color: "#FFFFFF",
icon: faItchIo,
label: "Itch.io",
link: "https://nhcarrigan.itch.io/",
},
{
alt: "Lichess Logo",
background: "#000",
color: "#FFF",
background: "#000000",
color: "#FFFFFF",
icon: faChessKnight,
label: "Lichess",
link: "https://lichess.org/../naomi-lgbt",
@ -311,7 +312,7 @@ const Socials: Array<{
{
alt: "Paypal Logo",
background: "#003087",
color: "#FFF",
color: "#FFFFFF",
icon: faPaypal,
label: "Paypal",
link: "https://paypal.me/nhcarrigan",
@ -319,7 +320,7 @@ const Socials: Array<{
{
alt: "Ko-Fi Logo",
background: "#FF5E5B",
color: "#FFF",
color: "#FFFFFF",
icon: Kofi,
label: "Ko-Fi",
link: "https://ko-fi.com/nhcarrigan",
@ -327,7 +328,7 @@ const Socials: Array<{
{
alt: "Patreon Logo",
background: "#F96854",
color: "#FFF",
color: "#FFFFFF",
icon: faPatreon,
label: "Patreon",
link: "https://patreon.com/nhcarrigan",
@ -335,7 +336,7 @@ const Socials: Array<{
{
alt: "freeCodeCamp Logo",
background: "#0a0a23",
color: "#FFF",
color: "#FFFFFF",
icon: faFreeCodeCamp,
label: "freeCodeCamp",
link: "https://forum.freecodecamp.org/u/nhcarrigan/summary",
@ -343,7 +344,7 @@ const Socials: Array<{
{
alt: "NPM Logo",
background: "#CB3837",
color: "#FFF",
color: "#FFFFFF",
icon: faNpm,
label: "NPM",
link: "https://www.npmjs.com/~nhcarrigan",
@ -351,7 +352,7 @@ const Socials: Array<{
{
alt: "GatherTown Logo",
background: "#7B68EE",
color: "#FFF",
color: "#FFFFFF",
icon: Gather,
label: "GatherTown",
link: "https://app.gather.town/invite?token=CiIvbSnrQiW-akXFSPL_",
@ -359,7 +360,7 @@ const Socials: Array<{
{
alt: "VRoid Logo",
background: "#ffe100",
color: "#000",
color: "#000000",
icon: VRoid,
label: "VRoid",
link: "https://hub.vroid.com/en/characters/6033404747153826650/models/3483506204509065121",
@ -367,7 +368,7 @@ const Socials: Array<{
{
alt: "Pixiv Logo",
background: "#0096FA",
color: "#FFF",
color: "#FFFFFF",
icon: Pixiv,
label: "Pixiv",
link: "https://www.pixiv.net/en/users/77818154",
@ -375,7 +376,7 @@ const Socials: Array<{
{
alt: "Email Icon",
background: "#000000",
color: "#FFF",
color: "#FFFFFF",
icon: faEnvelope,
label: "Email",
link: "https://docs.nhcarrigan.com/about/contact/#7-email-communication",
@ -383,7 +384,7 @@ const Socials: Array<{
{
alt: "Coursera Logo",
background: "#0056D2",
color: "#FFF",
color: "#FFFFFF",
icon: Coursera,
label: "Coursera",
link: "https://www.coursera.org/learner/naomi-lgbt",
@ -391,7 +392,7 @@ const Socials: Array<{
{
alt: "Udemy Logo",
background: "#EC5252",
color: "#FFF",
color: "#FFFFFF",
icon: Udemy,
label: "Udemy",
link: "https://www.udemy.com/user/naomi-carrigan/",
@ -399,23 +400,23 @@ const Socials: Array<{
{
alt: "Wordpress Logo",
background: "#1E8EDE",
color: "#FFF",
color: "#FFFFFF",
icon: faWordpress,
label: "Gravatar",
link: "https://gravatar.com/nhcarrigan",
},
{
alt: "Computer Icon",
background: "#000",
color: "#FFF",
background: "#000000",
color: "#FFFFFF",
icon: faComputer,
label: "PC Part Picker",
link: "https://pcpartpicker.com/user/nhcarrigan/",
},
{
alt: "Throne.me Logo",
background: "#000",
color: "#FFF",
background: "#000000",
color: "#FFFFFF",
icon: Throne,
label: "Throne",
link: "https://throne.com/naomilgbt",
@ -423,14 +424,14 @@ const Socials: Array<{
{
alt: "Stripe Logo",
background: "#6772E5",
color: "#FFF",
color: "#FFFFFF",
icon: faStripe,
label: "Stripe",
link: "https://buy.stripe.com/cN24iTfqu1j6b3afZ2",
},
{
alt: "Signal Logo",
background: "#FFF",
background: "#FFFFFF",
color: "#3A76F0",
icon: faSignalMessenger,
label: "Signal",
@ -438,24 +439,24 @@ const Socials: Array<{
},
{
alt: "Angellist Logo",
background: "#000",
color: "#FFF",
background: "#000000",
color: "#FFFFFF",
icon: faAngellist,
label: "WellFound",
link: "https://wellfound.com/u/naomi-h-carrigan",
},
{
alt: "ProtonDB Logo",
background: "#000",
color: "#FFF",
background: "#000000",
color: "#FFFFFF",
icon: faAtom,
label: "ProtonDB",
link: "https://www.protondb.com/users/1717755560",
},
{
alt: "TeeSpring Logo",
background: "#000",
color: "#FFF",
background: "#000000",
color: "#FFFFFF",
icon: TeeSpring,
label: "Merch",
link: "https://nhcarrigan.creator-spring.com/",
@ -463,7 +464,7 @@ const Socials: Array<{
{
alt: "BlueSky Logo",
background: "#1DA1F2",
color: "#FFF",
color: "#FFFFFF",
icon: faBluesky,
label: "BlueSky",
link: "https://bsky.app/profile/naomi-lgbt.bsky.social",
@ -471,7 +472,7 @@ const Socials: Array<{
{
alt: "Telegram Logo",
background: "#0088cc",
color: "#FFF",
color: "#FFFFFF",
icon: faTelegramPlane,
label: "Telegram",
link: "https://t.me/naomi_lgbt",
@ -479,7 +480,7 @@ const Socials: Array<{
{
alt: "WhatsApp Logo",
background: "#25D366",
color: "#FFF",
color: "#FFFFFF",
icon: faWhatsapp,
label: "WhatsApp",
link: "https://wa.me/qr/WCGJIID7UKWIE1",
@ -487,14 +488,14 @@ const Socials: Array<{
{
alt: "Google Chat Logo",
background: "#DB4437",
color: "#FFF",
color: "#FFFFFF",
icon: faGooglePlus,
label: "Google Chat",
link: "https://chat.google.com/room/AAAAK270m3M",
},
{
alt: "Tree Nation Logo",
background: "#FFF",
background: "#FFFFFF",
color: "#55C1A8",
icon: TreeNation,
label: "Tree Nation",
@ -503,7 +504,7 @@ const Socials: Array<{
{
alt: "Meetup Logo",
background: "#FF6D00",
color: "#FFF",
color: "#FFFFFF",
icon: faMeetup,
label: "Meetup",
link: "https://www.meetup.com/members/437962584/",
@ -511,7 +512,7 @@ const Socials: Array<{
{
alt: "Tumblr Logo",
background: "#36465D",
color: "#FFF",
color: "#FFFFFF",
icon: faTumblr,
label: "Tumblr",
link: "https://www.tumblr.com/naomi-lgbt",
@ -519,23 +520,23 @@ const Socials: Array<{
{
alt: "YouTube Logo",
background: "#FF0000",
color: "#FFF",
color: "#FFFFFF",
icon: faYoutube,
label: "YouTube",
link: "https://www.youtube.com/@naomilgbt",
},
{
alt: "Tiktok Logo",
background: "#000",
color: "#FFF",
background: "#000000",
color: "#FFFFFF",
icon: faTiktok,
label: "Tiktok",
link: "https://www.tiktok.com/@naomilgbt",
},
{
alt: "Threads Logo",
background: "#000",
color: "#FFF",
background: "#000000",
color: "#FFFFFF",
icon: faThreads,
label: "Threads",
link: "https://www.threads.net/@naomi.lgbt",
@ -543,11 +544,19 @@ const Socials: Array<{
{
alt: "Instagram Logo",
background: "#C13584",
color: "#FFF",
color: "#FFFFFF",
icon: faInstagram,
label: "Instagram",
link: "https://www.instagram.com/naomi.lgbt/",
},
{
alt: "RetroAchievements Logo",
background: "#1066dd",
color: "#cc9a00",
icon: RetroAchievements,
label: "RetroAchievements",
link: "https://retroachievements.org/user/naomilgbt",
},
];
export { HireMe, Donate, Socials };

View File

@ -0,0 +1,116 @@
/**
* @copyright nhcarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
import type { IconDefinition } from "@fortawesome/fontawesome-svg-core";
/**
* Custom FontAwesome icon definition for the
* RetroAchievements logo.
*/
export const RetroAchievements: IconDefinition = {
icon: [
500,
275,
[],
"U+E002",
`M 0.00,0.00
C 0.00,0.00 73.00,0.00 73.00,0.00
73.00,0.00 116.00,0.00 116.00,0.00
150.90,0.05 184.08,28.35 194.12,61.00
197.20,71.03 199.09,81.49 199.00,92.00
198.86,108.25 194.88,127.04 186.39,141.00
183.49,145.75 178.82,151.91 174.92,155.83
172.79,157.98 170.04,159.58 170.72,163.01
170.72,163.01 175.25,172.00 175.25,172.00
175.25,172.00 187.58,194.00 187.58,194.00
187.58,194.00 215.86,245.00 215.86,245.00
215.86,245.00 232.00,275.00 232.00,275.00
232.00,275.00 200.00,275.00 200.00,275.00
200.00,275.00 192.61,274.01 192.61,274.01
192.61,274.01 186.43,265.00 186.43,265.00
186.43,265.00 175.00,245.00 175.00,245.00
175.00,245.00 139.40,183.00 139.40,183.00
139.40,183.00 117.00,143.00 117.00,143.00
160.97,139.31 175.67,72.18 138.00,47.10
122.50,36.79 106.57,39.00 89.00,39.00
89.00,39.00 0.00,39.00 0.00,39.00
0.00,39.00 0.00,0.00 0.00,0.00 Z
M 238.00,275.00
C 238.00,275.00 253.58,229.00 253.58,229.00
253.58,229.00 278.31,159.00 278.31,159.00
278.31,159.00 308.66,73.00 308.66,73.00
308.66,73.00 326.32,24.00 326.32,24.00
332.59,12.07 343.55,2.89 357.00,0.23
357.00,0.23 375.00,0.23 375.00,0.23
381.82,0.08 386.99,1.57 393.00,4.79
412.88,15.46 416.50,37.70 423.81,57.00
423.81,57.00 446.69,122.00 446.69,122.00
446.69,122.00 474.69,201.00 474.69,201.00
474.69,201.00 492.34,251.00 492.34,251.00
494.69,257.75 499.30,268.27 500.00,275.00
500.00,275.00 336.00,275.00 336.00,275.00
336.00,275.00 336.00,241.00 336.00,241.00
336.00,241.00 452.00,241.00 452.00,241.00
452.00,241.00 435.95,197.00 435.95,197.00
435.95,197.00 397.42,90.00 397.42,90.00
397.42,90.00 384.42,54.00 384.42,54.00
381.75,46.85 381.24,41.88 373.00,39.11
367.19,37.16 360.56,39.79 357.53,45.09
357.53,45.09 351.95,60.00 351.95,60.00
351.95,60.00 341.33,90.00 341.33,90.00
341.33,90.00 299.31,210.00 299.31,210.00
299.31,210.00 285.95,248.00 285.95,248.00
285.95,248.00 277.00,275.00 277.00,275.00
277.00,275.00 238.00,275.00 238.00,275.00 Z
M 0.00,47.00
C 0.00,47.00 110.00,47.00 110.00,47.00
123.38,47.16 136.40,52.85 144.20,64.00
155.04,79.48 152.55,106.67 140.67,121.00
129.04,135.04 117.41,135.00 101.00,135.00
101.00,135.00 130.42,186.00 130.42,186.00
130.42,186.00 181.00,275.00 181.00,275.00
181.00,275.00 147.00,275.00 147.00,275.00
147.00,275.00 139.33,273.98 139.33,273.98
139.33,273.98 126.15,253.00 126.15,253.00
126.15,253.00 85.00,182.00 85.00,182.00
85.00,182.00 85.00,275.00 85.00,275.00
85.00,275.00 47.00,275.00 47.00,275.00
47.00,275.00 47.00,95.00 47.00,95.00
47.00,95.00 102.00,95.00 102.00,95.00
105.16,94.98 112.73,94.56 110.60,89.22
109.14,85.55 103.19,86.01 100.00,86.00
100.00,86.00 38.00,86.00 38.00,86.00
38.00,86.00 38.00,275.00 38.00,275.00
38.00,275.00 0.00,275.00 0.00,275.00
0.00,275.00 0.00,47.00 0.00,47.00 Z
M 285.00,275.00
C 285.00,275.00 302.00,224.00 302.00,224.00
302.00,224.00 344.00,102.00 344.00,102.00
344.00,102.00 358.14,61.00 358.14,61.00
359.89,56.05 361.21,48.97 367.02,47.43
373.36,45.76 376.14,49.86 378.19,55.00
378.19,55.00 390.00,88.00 390.00,88.00
390.00,88.00 423.05,182.00 423.05,182.00
423.05,182.00 434.34,214.00 434.34,214.00
436.60,220.49 439.37,226.04 440.00,233.00
440.00,233.00 336.00,233.00 336.00,233.00
336.00,233.00 335.00,229.00 335.00,229.00
335.00,229.00 325.00,261.00 325.00,261.00
325.00,261.00 320.16,273.40 320.16,273.40
320.16,273.40 313.00,275.00 313.00,275.00
313.00,275.00 285.00,275.00 285.00,275.00 Z
M 370.00,131.00
C 370.00,131.00 361.28,155.00 361.28,155.00
361.28,155.00 348.00,198.00 348.00,198.00
348.00,198.00 391.00,198.00 391.00,198.00
391.00,198.00 370.00,131.00 370.00,131.00 Z
M 337.00,227.00
C 337.00,227.00 336.00,227.00 336.00,227.00
336.00,227.00 337.00,228.00 337.00,228.00
337.00,228.00 337.00,227.00 337.00,227.00 Z`,
],
iconName: "yyy",
prefix: "xxx",
} as never;

View File

@ -37,6 +37,14 @@ describe("socials objects", () => {
);
expect(set, "are not unique").toHaveLength(Socials.length);
});
it("should have hex codes for colours", () => {
expect.hasAssertions();
for (const social of Socials) {
expect(social.color, `${social.label} is not a hex code`).toMatch(/^#[\da-f]{6}$/i);
expect(social.background, `${social.label} is not a hex code`).toMatch(/^#[\da-f]{6}$/i);
}
});
});
describe("hire me object", () => {

View File

@ -0,0 +1,39 @@
/**
* @copyright nhcarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
import { describe, it, expect } from "vitest";
import { RetroAchievements } from "../../src/icons/RetroAchievements";
describe("retroachievements icon", () => {
it("should have a valid width", () => {
expect.assertions(1);
expect(RetroAchievements.icon[0], "width is negative").toBeGreaterThan(0);
});
it("should have a valid height", () => {
expect.assertions(1);
expect(RetroAchievements.icon[1], "height is negative").toBeGreaterThan(0);
});
it("should not have any ligatures", () => {
expect.assertions(1);
expect(RetroAchievements.icon[2], "ligatures are present").
toStrictEqual([]);
});
it("should have a valid unicode set", () => {
expect.assertions(1);
expect(RetroAchievements.icon[3], "unicode set is wrong").toBe("U+E002");
});
it("should have valid SVG path data", () => {
expect.assertions(1);
expect(RetroAchievements.icon[4], "path data is bad").toMatch(
// eslint-disable-next-line stylistic/max-len
/(?:[lm]\s?-?(?:(?:\d+(?:\.\d+)?)|(?:\.\d+))[\s,]?-?(?:(?:\d+(?:\.\d+)?)|(?:\.\d+)))|(?:[hv]\s?-?(?:(?:\d+(?:\.\d+)?)|(?:\.\d+)))|(?:c\s?-?(?:(?:\d+(?:\.\d+)?)|(?:\.\d+))(?:[\s,]?-?(?:(?:\d+(?:\.\d+)?)|(?:\.\d+))){5})|(?:q\s?-?(?:(?:\d+(?:\.\d+)?)|(?:\.\d+))(?:[\s,]?-?(?:(?:\d+(?:\.\d+)?)|(?:\.\d+))){3}(?:\s?t?\s?-?(?:(?:\d+(?:\.\d+)?)|(?:\.\d+))[\s,]?-?(?:(?:\d+(?:\.\d+)?)|(?:\.\d+)))*)|(?:a\s?-?(?:(?:\d+(?:\.\d+)?)|(?:\.\d+))(?:[\s,]?-?(?:(?:\d+(?:\.\d+)?)|(?:\.\d+))){2}[\s,]?(?:[01][\s,]+){2}(?:[\s,]?-?(?:(?:\d+(?:\.\d+)?)|(?:\.\d+))){2})|(?:s\s?-?(?:(?:\d+(?:\.\d+)?)|(?:\.\d+))(?:[\s,]?-?(?:(?:\d+(?:\.\d+)?)|(?:\.\d+))){3})|z/gi,
);
});
});