From 960d8dec817c2e18aa8c05519098cbf6a35ce01e Mon Sep 17 00:00:00 2001 From: Naomi Carrigan Date: Mon, 4 Nov 2024 22:43:07 +0000 Subject: [PATCH] chore: add new socials (#38) ### Explanation _No response_ ### Issue _No response_ ### Attestations - [ ] I have read and agree to the [Code of Conduct](https://docs.nhcarrigan.com/community/coc/) - [ ] I have read and agree to the [Community Guidelines](https://docs.nhcarrigan.com/community/guide/). - [ ] 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 - [ ] I have run the linter and resolved any errors. - [ ] My pull request uses an appropriate title, matching the conventional commit standards. - [ ] My scope of feat/fix/chore/etc. correctly matches the nature of changes in my pull request. ### Tests - [ ] 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. - [ ] All new and existing tests pass locally with my changes. - [ ] Code coverage remains at or above the configured threshold. ### Documentation _No response_ ### Versioning _No response_ Reviewed-on: https://codeberg.org/nhcarrigan/portfolio/pulls/38 Co-authored-by: Naomi Carrigan Co-committed-by: Naomi Carrigan --- src/config/Socials.ts | 31 +++++- src/icons/Gumroad.ts | 212 +++++++++++++++++++++++++++++++++++++ src/icons/Topmate.ts | 52 +++++++++ test/icons/Gumroad.spec.ts | 38 +++++++ test/icons/Topmate.spec.ts | 38 +++++++ 5 files changed, 369 insertions(+), 2 deletions(-) create mode 100644 src/icons/Gumroad.ts create mode 100644 src/icons/Topmate.ts create mode 100644 test/icons/Gumroad.spec.ts create mode 100644 test/icons/Topmate.spec.ts diff --git a/src/config/Socials.ts b/src/config/Socials.ts index 0fa3e70..6fa9d0a 100644 --- a/src/config/Socials.ts +++ b/src/config/Socials.ts @@ -19,6 +19,7 @@ import { faNpm, faPatreon, faPaypal, + faProductHunt, faReddit, faSignalMessenger, faSlack, @@ -32,9 +33,9 @@ import { faWhatsapp, faWordpress, faYoutube, + faSnapchat, + faXTwitter, } from "@fortawesome/free-brands-svg-icons"; -import { faSnapchat } from "@fortawesome/free-brands-svg-icons/faSnapchat"; -import { faXTwitter } from "@fortawesome/free-brands-svg-icons/faXTwitter"; import { faAtom, faBriefcase, @@ -50,6 +51,7 @@ import { Coursera } from "../icons/Coursera"; import { Fiverr } from "../icons/Fiverr"; import { Gather } from "../icons/Gather"; import { Gog } from "../icons/Gog"; +import { Gumroad } from "../icons/Gumroad"; import { Kofi } from "../icons/KoFi"; import { Matrix } from "../icons/Matrix"; import { Peerlist } from "../icons/Peerlist"; @@ -59,6 +61,7 @@ import { RetroAchievements } from "../icons/RetroAchievements"; import { Saylor } from "../icons/Saylor"; import { TeeSpring } from "../icons/TeeSpring"; import { Throne } from "../icons/Throne"; +import { Topmate } from "../icons/Topmate"; import { TreeNation } from "../icons/TreeNation"; import { Udemy } from "../icons/Udemy"; import { VRoid } from "../icons/VRoid"; @@ -557,6 +560,30 @@ const Socials: Array<{ label: "RetroAchievements", link: "https://retroachievements.org/user/naomilgbt", }, + { + alt: "ProductHunt Logo", + background: "#da552f", + color: "#FFFFFF", + icon: faProductHunt, + label: "ProductHunt", + link: "https://www.producthunt.com/@naomi_lgbt", + }, + { + alt: "Topmate Logo", + background: "#e44332", + color: "#FFFFFF", + icon: Topmate, + label: "Topmate", + link: "https://topmate.io/nhcarrigan", + }, + { + alt: "Gumroad Logo", + background: "#fe90e7", + color: "#000000", + icon: Gumroad, + label: "Gumroad", + link: "https://nhcarrigan.gumroad.com", + }, ]; export { HireMe, Donate, Socials }; diff --git a/src/icons/Gumroad.ts b/src/icons/Gumroad.ts new file mode 100644 index 0000000..0c5fd99 --- /dev/null +++ b/src/icons/Gumroad.ts @@ -0,0 +1,212 @@ +/** + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +import type { IconDefinition } from "@fortawesome/fontawesome-svg-core"; + +/** + * Custom FontAwesome icon definition for the + * Gumroad logo. + */ +export const Gumroad: IconDefinition = { + icon: [ + 806, + 807, + [], + "U+E002", + `M 364.00,13.21 + C 364.00,13.21 407.00,13.21 407.00,13.21 + 407.00,13.21 430.00,14.84 430.00,14.84 + 470.27,19.14 502.77,27.65 540.00,43.72 + 576.05,59.28 613.12,82.48 642.00,109.08 + 675.08,139.56 703.05,173.90 723.74,214.00 + 738.19,241.99 750.78,274.21 757.58,305.00 + 784.23,425.71 753.19,550.83 669.83,643.00 + 639.15,676.93 601.80,705.56 561.00,726.24 + 516.61,748.75 475.34,760.23 426.00,765.17 + 426.00,765.17 402.00,767.00 402.00,767.00 + 402.00,767.00 376.00,767.00 376.00,767.00 + 376.00,767.00 366.00,766.09 366.00,766.09 + 330.81,763.68 296.20,757.84 263.00,745.42 + 204.49,723.54 155.94,692.99 113.09,647.00 + 65.89,596.34 30.94,528.28 18.61,460.00 + 15.57,443.12 13.03,422.08 13.00,405.00 + 13.00,405.00 12.02,391.00 12.02,391.00 + 12.02,391.00 13.00,367.00 13.00,367.00 + 13.00,367.00 14.84,347.00 14.84,347.00 + 18.92,308.86 29.28,269.90 45.31,235.00 + 88.37,141.20 166.12,67.87 264.00,33.86 + 287.93,25.55 309.94,20.14 335.00,16.43 + 335.00,16.43 364.00,13.21 364.00,13.21 Z + M 487.00,15.00 + C 487.00,15.00 488.00,15.00 488.00,15.00 + 488.00,15.00 487.00,16.00 487.00,16.00 + 487.00,16.00 487.00,15.00 487.00,15.00 Z + M 279.00,16.00 + C 279.00,16.00 280.00,16.00 280.00,16.00 + 280.00,16.00 279.00,17.00 279.00,17.00 + 279.00,17.00 279.00,16.00 279.00,16.00 Z + M 515.00,21.00 + C 515.00,21.00 516.00,21.00 516.00,21.00 + 516.00,21.00 515.00,22.00 515.00,22.00 + 515.00,22.00 515.00,21.00 515.00,21.00 Z + M 259.00,25.00 + C 259.00,25.00 260.00,25.00 260.00,25.00 + 260.00,25.00 259.00,26.00 259.00,26.00 + 259.00,26.00 259.00,25.00 259.00,25.00 Z + M 193.00,53.00 + C 193.00,53.00 194.00,53.00 194.00,53.00 + 194.00,53.00 193.00,54.00 193.00,54.00 + 193.00,54.00 193.00,53.00 193.00,53.00 Z + M 642.00,93.00 + C 642.00,93.00 643.00,93.00 643.00,93.00 + 643.00,93.00 642.00,94.00 642.00,94.00 + 642.00,94.00 642.00,93.00 642.00,93.00 Z + M 682.00,133.00 + C 682.00,133.00 683.00,133.00 683.00,133.00 + 683.00,133.00 682.00,134.00 682.00,134.00 + 682.00,134.00 682.00,133.00 682.00,133.00 Z + M 591.00,314.00 + C 591.00,314.00 589.71,302.00 589.71,302.00 + 588.99,296.11 587.42,289.73 585.85,284.00 + 578.82,258.31 565.04,234.46 546.91,215.00 + 519.65,185.73 479.11,167.16 440.00,160.59 + 430.57,159.00 419.52,157.05 410.00,157.00 + 410.00,157.00 389.00,156.00 389.00,156.00 + 389.00,156.00 374.00,157.00 374.00,157.00 + 328.27,157.53 280.79,174.27 245.00,202.67 + 204.83,234.54 180.07,285.67 173.29,336.00 + 170.87,353.96 170.79,371.90 171.00,390.00 + 171.10,397.99 173.12,413.92 174.58,422.00 + 182.77,467.44 200.62,508.93 235.00,540.91 + 259.89,564.06 294.39,579.29 328.00,583.71 + 341.20,585.45 354.70,585.15 368.00,585.00 + 395.65,584.67 429.52,572.90 451.00,555.54 + 475.68,535.59 490.57,509.76 500.49,480.00 + 500.49,480.00 505.79,460.00 505.79,460.00 + 505.79,460.00 508.00,449.00 508.00,449.00 + 508.00,449.00 508.00,576.00 508.00,576.00 + 508.00,576.00 603.00,576.00 603.00,576.00 + 603.00,576.00 603.00,366.00 603.00,366.00 + 603.00,366.00 387.00,366.00 387.00,366.00 + 387.00,374.75 386.09,401.28 388.00,408.00 + 388.00,408.00 423.00,407.00 423.00,407.00 + 423.00,407.00 490.00,407.00 490.00,407.00 + 481.72,435.57 476.08,457.30 454.58,479.83 + 425.65,510.14 379.12,514.70 342.00,497.69 + 325.65,490.20 311.69,478.08 300.67,464.00 + 282.46,440.74 273.94,411.05 271.91,382.00 + 271.91,382.00 271.00,370.00 271.00,370.00 + 271.00,370.00 274.46,338.00 274.46,338.00 + 282.81,293.71 310.68,253.08 355.00,239.03 + 401.17,224.39 455.83,241.98 476.27,288.00 + 479.83,296.01 482.60,305.22 483.00,314.00 + 483.00,314.00 591.00,314.00 591.00,314.00 Z + M 51.00,201.00 + C 51.00,201.00 52.00,201.00 52.00,201.00 + 52.00,201.00 51.00,202.00 51.00,202.00 + 51.00,202.00 51.00,201.00 51.00,201.00 Z + M 42.00,213.00 + C 42.00,213.00 43.00,213.00 43.00,213.00 + 43.00,213.00 42.00,214.00 42.00,214.00 + 42.00,214.00 42.00,213.00 42.00,213.00 Z + M 39.00,219.00 + C 39.00,219.00 40.00,219.00 40.00,219.00 + 40.00,219.00 39.00,220.00 39.00,220.00 + 39.00,220.00 39.00,219.00 39.00,219.00 Z + M 36.00,225.00 + C 36.00,225.00 37.00,225.00 37.00,225.00 + 37.00,225.00 36.00,226.00 36.00,226.00 + 36.00,226.00 36.00,225.00 36.00,225.00 Z + M 756.00,229.00 + C 756.00,229.00 757.00,229.00 757.00,229.00 + 757.00,229.00 756.00,230.00 756.00,230.00 + 756.00,230.00 756.00,229.00 756.00,229.00 Z + M 771.00,259.00 + C 771.00,259.00 772.00,259.00 772.00,259.00 + 772.00,259.00 771.00,260.00 771.00,260.00 + 771.00,260.00 771.00,259.00 771.00,259.00 Z + M 17.00,283.00 + C 17.00,283.00 18.00,283.00 18.00,283.00 + 18.00,283.00 17.00,284.00 17.00,284.00 + 17.00,284.00 17.00,283.00 17.00,283.00 Z + M 783.00,289.00 + C 783.00,289.00 784.00,289.00 784.00,289.00 + 784.00,289.00 783.00,290.00 783.00,290.00 + 783.00,290.00 783.00,289.00 783.00,289.00 Z + M 2.00,346.00 + C 2.00,346.00 3.00,346.00 3.00,346.00 + 3.00,346.00 2.00,347.00 2.00,347.00 + 2.00,347.00 2.00,346.00 2.00,346.00 Z + M 5.00,454.00 + C 5.00,454.00 6.00,454.00 6.00,454.00 + 6.00,454.00 5.00,455.00 5.00,455.00 + 5.00,455.00 5.00,454.00 5.00,454.00 Z + M 24.00,517.00 + C 24.00,517.00 25.00,517.00 25.00,517.00 + 25.00,517.00 24.00,518.00 24.00,518.00 + 24.00,518.00 24.00,517.00 24.00,517.00 Z + M 689.00,539.00 + C 689.97,545.46 701.63,554.40 707.00,558.00 + 704.77,551.47 694.61,543.33 689.00,539.00 Z + M 33.00,547.00 + C 33.00,547.00 34.00,547.00 34.00,547.00 + 34.00,547.00 33.00,548.00 33.00,548.00 + 33.00,548.00 33.00,547.00 33.00,547.00 Z + M 48.00,577.00 + C 48.00,577.00 49.00,577.00 49.00,577.00 + 49.00,577.00 48.00,578.00 48.00,578.00 + 48.00,578.00 48.00,577.00 48.00,577.00 Z + M 749.00,618.00 + C 749.00,618.00 750.00,618.00 750.00,618.00 + 750.00,618.00 749.00,619.00 749.00,619.00 + 749.00,619.00 749.00,618.00 749.00,618.00 Z + M 79.00,625.00 + C 79.00,625.00 80.00,625.00 80.00,625.00 + 80.00,625.00 79.00,626.00 79.00,626.00 + 79.00,626.00 79.00,625.00 79.00,625.00 Z + M 107.00,658.00 + C 107.00,658.00 108.00,658.00 108.00,658.00 + 108.00,658.00 107.00,659.00 107.00,659.00 + 107.00,659.00 107.00,658.00 107.00,658.00 Z + M 721.00,658.00 + C 721.00,658.00 722.00,658.00 722.00,658.00 + 722.00,658.00 721.00,659.00 721.00,659.00 + 721.00,659.00 721.00,658.00 721.00,658.00 Z + M 113.00,664.00 + C 113.00,664.00 114.00,664.00 114.00,664.00 + 114.00,664.00 113.00,665.00 113.00,665.00 + 113.00,665.00 113.00,664.00 113.00,664.00 Z + M 588.00,766.00 + C 588.00,766.00 589.00,766.00 589.00,766.00 + 589.00,766.00 588.00,767.00 588.00,767.00 + 588.00,767.00 588.00,766.00 588.00,766.00 Z + M 562.00,778.00 + C 562.00,778.00 563.00,778.00 563.00,778.00 + 563.00,778.00 562.00,779.00 562.00,779.00 + 562.00,779.00 562.00,778.00 562.00,778.00 Z + M 559.00,779.00 + C 559.00,779.00 560.00,779.00 560.00,779.00 + 560.00,779.00 559.00,780.00 559.00,780.00 + 559.00,780.00 559.00,779.00 559.00,779.00 Z + M 276.00,781.00 + C 276.00,781.00 277.00,781.00 277.00,781.00 + 277.00,781.00 276.00,782.00 276.00,782.00 + 276.00,782.00 276.00,781.00 276.00,781.00 Z + M 543.00,785.00 + C 543.00,785.00 544.00,785.00 544.00,785.00 + 544.00,785.00 543.00,786.00 543.00,786.00 + 543.00,786.00 543.00,785.00 543.00,785.00 Z + M 344.00,800.00 + C 344.00,800.00 345.00,800.00 345.00,800.00 + 345.00,800.00 344.00,801.00 344.00,801.00 + 344.00,801.00 344.00,800.00 344.00,800.00 Z + M 467.00,803.00 + C 467.00,803.00 468.00,803.00 468.00,803.00 + 468.00,803.00 467.00,804.00 467.00,804.00 + 467.00,804.00 467.00,803.00 467.00,803.00 Z`, + ], + iconName: "yyy", + prefix: "xxx", +} as never; diff --git a/src/icons/Topmate.ts b/src/icons/Topmate.ts new file mode 100644 index 0000000..dcd41f5 --- /dev/null +++ b/src/icons/Topmate.ts @@ -0,0 +1,52 @@ +/** + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ +import type { IconDefinition } from "@fortawesome/fontawesome-svg-core"; + +/** + * Custom FontAwesome icon definition for the + * Topmate.io logo. + */ +export const Topmate: IconDefinition = { + icon: [ + 502, + 503, + [], + "U+E002", + `M 240.00,0.42 + C 256.32,-1.56 286.52,2.28 303.00,5.60 + 400.40,25.19 477.58,103.88 497.00,201.00 + 497.00,201.00 501.17,232.00 501.17,232.00 + 501.17,232.00 502.00,241.00 502.00,241.00 + 502.35,270.85 499.89,297.30 490.98,326.00 + 467.36,401.97 409.93,461.62 335.00,488.31 + 310.99,496.86 285.45,501.71 260.00,502.00 + 260.00,502.00 251.00,502.66 251.00,502.66 + 251.00,502.66 242.00,502.00 242.00,502.00 + 242.00,502.00 234.00,502.00 234.00,502.00 + 211.79,501.74 178.65,493.13 158.00,484.80 + 126.34,472.03 97.19,453.16 73.01,428.99 + -2.96,353.01 -20.43,237.27 25.32,141.00 + 55.16,78.19 112.06,31.52 178.00,11.02 + 194.55,5.88 209.86,3.32 227.00,1.28 + 227.00,1.28 240.00,0.42 240.00,0.42 Z + M 376.00,177.00 + C 368.26,163.21 357.11,149.88 345.00,139.75 + 284.88,89.46 195.07,94.22 142.17,153.00 + 130.81,165.62 121.94,180.30 115.60,196.00 + 110.16,209.48 105.17,229.47 105.00,244.00 + 105.00,244.00 105.00,255.00 105.00,255.00 + 105.01,263.83 107.03,276.36 109.13,285.00 + 119.96,329.56 149.30,364.60 191.00,383.69 + 237.19,404.84 292.51,398.62 334.00,369.98 + 344.45,362.76 364.10,345.47 369.00,334.00 + 369.00,334.00 295.00,281.71 295.00,281.71 + 295.00,281.71 251.00,250.00 251.00,250.00 + 251.00,250.00 297.00,223.60 297.00,223.60 + 297.00,223.60 376.00,177.00 376.00,177.00 Z`, + ], + iconName: "yyy", + prefix: "xxx", +} as never; diff --git a/test/icons/Gumroad.spec.ts b/test/icons/Gumroad.spec.ts new file mode 100644 index 0000000..4a1bda3 --- /dev/null +++ b/test/icons/Gumroad.spec.ts @@ -0,0 +1,38 @@ +/** + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +import { describe, it, expect } from "vitest"; +import { Gumroad } from "../../src/icons/Gumroad"; + +describe("gumroad icon", () => { + it("should have a valid width", () => { + expect.assertions(1); + expect(Gumroad.icon[0], "width is negative").toBeGreaterThan(0); + }); + + it("should have a valid height", () => { + expect.assertions(1); + expect(Gumroad.icon[1], "height is negative").toBeGreaterThan(0); + }); + + it("should not have any ligatures", () => { + expect.assertions(1); + expect(Gumroad.icon[2], "ligatures are present").toStrictEqual([]); + }); + + it("should have a valid unicode set", () => { + expect.assertions(1); + expect(Gumroad.icon[3], "unicode set is wrong").toBe("U+E002"); + }); + + it("should have valid SVG path data", () => { + expect.assertions(1); + expect(Gumroad.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, + ); + }); +}); diff --git a/test/icons/Topmate.spec.ts b/test/icons/Topmate.spec.ts new file mode 100644 index 0000000..2ef1f57 --- /dev/null +++ b/test/icons/Topmate.spec.ts @@ -0,0 +1,38 @@ +/** + * @copyright nhcarrigan + * @license Naomi's Public License + * @author Naomi Carrigan + */ + +import { describe, it, expect } from "vitest"; +import { Topmate } from "../../src/icons/Topmate"; + +describe("topmate icon", () => { + it("should have a valid width", () => { + expect.assertions(1); + expect(Topmate.icon[0], "width is negative").toBeGreaterThan(0); + }); + + it("should have a valid height", () => { + expect.assertions(1); + expect(Topmate.icon[1], "height is negative").toBeGreaterThan(0); + }); + + it("should not have any ligatures", () => { + expect.assertions(1); + expect(Topmate.icon[2], "ligatures are present").toStrictEqual([]); + }); + + it("should have a valid unicode set", () => { + expect.assertions(1); + expect(Topmate.icon[3], "unicode set is wrong").toBe("U+E002"); + }); + + it("should have valid SVG path data", () => { + expect.assertions(1); + expect(Topmate.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, + ); + }); +});