Skip to content

Commit

Permalink
feat(content-blog,theme-classic) Add additional social media sites
Browse files Browse the repository at this point in the history
Add Icon and Handle support for:
- Bluesky
- Mastodon
- Threads
- Twitch
- YouTube

Includes Dogfooding page for testing
  • Loading branch information
GingerGeek committed Dec 14, 2024
1 parent c5a6c26 commit aba2ac0
Show file tree
Hide file tree
Showing 12 changed files with 284 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,25 @@ describe('normalizeSocials', () => {
linkedin: 'ozakione',
github: 'ozakione',
stackoverflow: 'ozakione',
threads: 'gingergeekuk',

Check failure on line 18 in packages/docusaurus-plugin-content-blog/src/__tests__/authorsSocials.test.ts

View workflow job for this annotation

GitHub Actions / Lint

Unknown word (gingergeekuk) -- threads: 'gingergeekuk',
bluesky: 'gingergeek.co.uk',

Check failure on line 19 in packages/docusaurus-plugin-content-blog/src/__tests__/authorsSocials.test.ts

View workflow job for this annotation

GitHub Actions / Lint

Unknown word (bluesky) -- bluesky: 'gingergeek.co.uk'

Check failure on line 19 in packages/docusaurus-plugin-content-blog/src/__tests__/authorsSocials.test.ts

View workflow job for this annotation

GitHub Actions / Lint

Unknown word (gingergeek) -- bluesky: 'gingergeek.co.uk',
twitch: 'gingergeek',

Check failure on line 20 in packages/docusaurus-plugin-content-blog/src/__tests__/authorsSocials.test.ts

View workflow job for this annotation

GitHub Actions / Lint

Unknown word (gingergeek) -- twitch: 'gingergeek',
youtube: 'gingergeekuk',

Check failure on line 21 in packages/docusaurus-plugin-content-blog/src/__tests__/authorsSocials.test.ts

View workflow job for this annotation

GitHub Actions / Lint

Unknown word (gingergeekuk) -- youtube: 'gingergeekuk',
mastodon: 'Mastodon',
};

// eslint-disable-next-line jest/no-large-snapshots
expect(normalizeSocials(socials)).toMatchInlineSnapshot(`
{
"bluesky": "https://bsky.app/profile/gingergeek.co.uk",

Check failure on line 28 in packages/docusaurus-plugin-content-blog/src/__tests__/authorsSocials.test.ts

View workflow job for this annotation

GitHub Actions / Lint

Unknown word (bluesky) -- "bluesky": "https://bsky.app
"github": "https://github.com/ozakione",
"linkedin": "https://www.linkedin.com/in/ozakione/",
"mastodon": "https://mastodon.social/@Mastodon",
"stackoverflow": "https://stackoverflow.com/users/ozakione",
"threads": "https://www.threads.net/@gingergeekuk",
"twitch": "https://twitch.tv/gingergeek",
"twitter": "https://twitter.com/ozakione",
"youtube": "https://youtube.com/@gingergeekuk",
}
`);
});
Expand All @@ -33,13 +44,17 @@ describe('normalizeSocials', () => {
linkedIn: 'ozakione',
gitHub: 'ozakione',
STACKoverflow: 'ozakione',
BLUESKY: 'gingergeek.co.uk',

Check failure on line 47 in packages/docusaurus-plugin-content-blog/src/__tests__/authorsSocials.test.ts

View workflow job for this annotation

GitHub Actions / Lint

Unknown word (BLUESKY) -- BLUESKY: 'gingergeek.co.uk'

Check failure on line 47 in packages/docusaurus-plugin-content-blog/src/__tests__/authorsSocials.test.ts

View workflow job for this annotation

GitHub Actions / Lint

Unknown word (gingergeek) -- BLUESKY: 'gingergeek.co.uk',
tHrEaDs: 'gingergeekuk',

Check failure on line 48 in packages/docusaurus-plugin-content-blog/src/__tests__/authorsSocials.test.ts

View workflow job for this annotation

GitHub Actions / Lint

Unknown word (gingergeekuk) -- tHrEaDs: 'gingergeekuk',
};

expect(normalizeSocials(socials)).toMatchInlineSnapshot(`
{
"bluesky": "https://bsky.app/profile/gingergeek.co.uk",

Check failure on line 53 in packages/docusaurus-plugin-content-blog/src/__tests__/authorsSocials.test.ts

View workflow job for this annotation

GitHub Actions / Lint

Unknown word (bluesky) -- "bluesky": "https://bsky.app
"github": "https://github.com/ozakione",
"linkedin": "https://www.linkedin.com/in/ozakione/",
"stackoverflow": "https://stackoverflow.com/users/ozakione",
"threads": "https://www.threads.net/@gingergeekuk",
"twitter": "https://twitter.com/ozakione",
}
`);
Expand All @@ -62,12 +77,14 @@ describe('normalizeSocials', () => {
linkedin: 'ozakione',
github: 'https://github.com/ozakione',
stackoverflow: 'https://stackoverflow.com/ozakione',
mastodon: 'https://hachyderm.io/@hachyderm',
};

expect(normalizeSocials(socials)).toMatchInlineSnapshot(`
{
"github": "https://github.com/ozakione",
"linkedin": "https://www.linkedin.com/in/ozakione/",
"mastodon": "https://hachyderm.io/@hachyderm",
"stackoverflow": "https://stackoverflow.com/ozakione",
"twitter": "https://twitter.com/ozakione",
}
Expand Down
10 changes: 10 additions & 0 deletions packages/docusaurus-plugin-content-blog/src/authorsSocials.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ export const AuthorSocialsSchema = Joi.object<AuthorSocials>({
.try(Joi.number(), Joi.string())
.custom((val) => String(val)),
x: Joi.string(),
bluesky: Joi.string(),
threads: Joi.string(),
mastodon: Joi.string(),
twitch: Joi.string(),
youtube: Joi.string(),
}).unknown();

type PredefinedPlatformNormalizer = (value: string) => string;
Expand All @@ -35,6 +40,11 @@ const PredefinedPlatformNormalizers: Record<
linkedin: (handle: string) => `https://www.linkedin.com/in/${handle}/`,
stackoverflow: (userId: string) =>
`https://stackoverflow.com/users/${userId}`,
bluesky: (handle: string) => `https://bsky.app/profile/${handle}`,
threads: (handle: string) => `https://www.threads.net/@${handle}`,
mastodon: (handle: string) => `https://mastodon.social/@${handle}`, // can be in format [email protected] and it will redirect if needed
twitch: (handle: string) => `https://twitch.tv/${handle}`,
youtube: (handle: string) => `https://youtube.com/@${handle}`, // https://support.google.com/youtube/answer/6180214?hl=en
};

type SocialEntry = [string, string];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,13 @@ declare module '@docusaurus/plugin-content-blog' {
| 'github'
| 'linkedin'
| 'stackoverflow'
| 'x';
| 'x'
| 'bluesky'
| 'threads'
| 'mastodon'
| 'bluesky'
| 'youtube'
| 'twitch';

/**
* Social platforms of the author.
Expand Down
40 changes: 40 additions & 0 deletions packages/docusaurus-theme-classic/src/theme-classic.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1708,6 +1708,46 @@ declare module '@theme/Icon/Socials/StackOverflow' {
export default function StackOverflow(props: Props): ReactNode;
}

declare module '@theme/Icon/Socials/Bluesky' {
import type {ComponentProps} from 'react';

export interface Props extends ComponentProps<'svg'> {}

export default function Bluesky(props: Props): JSX.Element;
}

declare module '@theme/Icon/Socials/Threads' {
import type {ComponentProps} from 'react';

export interface Props extends ComponentProps<'svg'> {}

export default function Threads(props: Props): JSX.Element;
}

declare module '@theme/Icon/Socials/YouTube' {
import type {ComponentProps} from 'react';

export interface Props extends ComponentProps<'svg'> {}

export default function YouTube(props: Props): JSX.Element;
}

declare module '@theme/Icon/Socials/Twitch' {
import type {ComponentProps} from 'react';

export interface Props extends ComponentProps<'svg'> {}

export default function Twitch(props: Props): JSX.Element;
}

declare module '@theme/Icon/Socials/Mastodon' {
import type {ComponentProps} from 'react';

export interface Props extends ComponentProps<'svg'> {}

export default function Mastodon(props: Props): JSX.Element;
}

declare module '@theme/TagsListByLetter' {
import type {ReactNode} from 'react';
import type {TagsListItem} from '@docusaurus/utils';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ import X from '@theme/Icon/Socials/X';
import StackOverflow from '@theme/Icon/Socials/StackOverflow';
import LinkedIn from '@theme/Icon/Socials/LinkedIn';
import DefaultSocialIcon from '@theme/Icon/Socials/Default';
import Bluesky from '@theme/Icon/Socials/Bluesky';
import Threads from '@theme/Icon/Socials/Threads';
import Youtube from '@theme/Icon/Socials/YouTube';
import Mastodon from '@theme/Icon/Socials/Mastodon';
import Twitch from '@theme/Icon/Socials/Twitch';

import styles from './styles.module.css';

Expand All @@ -30,6 +35,11 @@ const SocialPlatformConfigs: Record<string, SocialPlatformConfig> = {
stackoverflow: {Icon: StackOverflow, label: 'Stack Overflow'},
linkedin: {Icon: LinkedIn, label: 'LinkedIn'},
x: {Icon: X, label: 'X'},
bluesky: {Icon: Bluesky, label: 'Bluesky'},
threads: {Icon: Threads, label: 'Threads'},
mastodon: {Icon: Mastodon, label: 'Mastodon'},
youtube: {Icon: Youtube, label: 'YouTube'},
twitch: {Icon: Twitch, label: 'Twitch'},
};

function getSocialPlatformConfig(platformKey: string): SocialPlatformConfig {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

import type {SVGProps, ReactNode} from 'react';

// SVG Source: https://svgl.app/
function Bluesky(props: SVGProps<SVGSVGElement>): ReactNode {
return (
<svg
xmlns="http://www.w3.org/2000/svg"
width="1em"
height="1em"
preserveAspectRatio="xMidYMid"
viewBox="0 0 256 226"
{...props}>
<path
fill="#1185FE"
d="M55.491 15.172c29.35 22.035 60.917 66.712 72.509 90.686 11.592-23.974 43.159-68.651 72.509-90.686C221.686-.727 256-13.028 256 26.116c0 7.818-4.482 65.674-7.111 75.068-9.138 32.654-42.436 40.983-72.057 35.942 51.775 8.812 64.946 38 36.501 67.187-54.021 55.433-77.644-13.908-83.696-31.676-1.11-3.257-1.63-4.78-1.637-3.485-.008-1.296-.527.228-1.637 3.485-6.052 17.768-29.675 87.11-83.696 31.676-28.445-29.187-15.274-58.375 36.5-67.187-29.62 5.041-62.918-3.288-72.056-35.942C4.482 91.79 0 33.934 0 26.116 0-13.028 34.314-.727 55.491 15.172Z"
/>
</svg>
);
}
export default Bluesky;
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

import type {SVGProps, ReactNode} from 'react';

// SVG Source: https://svgl.app/
function Mastodon(props: SVGProps<SVGSVGElement>): ReactNode {
return (
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 61 65"
width="1em"
height="1em"
{...props}>
<path
fill="url(#a)"
d="M60.754 14.39C59.814 7.406 53.727 1.903 46.512.836 45.294.656 40.682 0 29.997 0h-.08C19.23 0 16.938.656 15.72.836 8.705 1.873 2.299 6.82.745 13.886c-.748 3.48-.828 7.338-.689 10.877.198 5.075.237 10.142.697 15.197a71.482 71.482 0 0 0 1.664 9.968c1.477 6.056 7.458 11.096 13.317 13.152a35.718 35.718 0 0 0 19.484 1.028 28.365 28.365 0 0 0 2.107-.576c1.572-.5 3.413-1.057 4.766-2.038a.154.154 0 0 0 .062-.118v-4.899a.146.146 0 0 0-.055-.111.145.145 0 0 0-.122-.028 54 54 0 0 1-12.644 1.478c-7.328 0-9.298-3.478-9.863-4.925a15.258 15.258 0 0 1-.857-3.882.142.142 0 0 1 .178-.145 52.976 52.976 0 0 0 12.437 1.477c1.007 0 2.012 0 3.02-.026 4.213-.119 8.654-.334 12.8-1.144.103-.02.206-.038.295-.065 6.539-1.255 12.762-5.196 13.394-15.176.024-.393.083-4.115.083-4.523.003-1.386.446-9.829-.065-15.017Z"
/>
<path
fill="#fff"
d="M50.394 22.237v17.35H43.52V22.749c0-3.545-1.478-5.353-4.483-5.353-3.303 0-4.958 2.139-4.958 6.364v9.217h-6.835V23.76c0-4.225-1.657-6.364-4.96-6.364-2.988 0-4.48 1.808-4.48 5.353v16.84H10.93V22.237c0-3.545.905-6.362 2.715-8.45 1.868-2.082 4.317-3.152 7.358-3.152 3.519 0 6.178 1.354 7.951 4.057l1.711 2.871 1.714-2.871c1.773-2.704 4.432-4.056 7.945-4.056 3.038 0 5.487 1.069 7.36 3.152 1.81 2.085 2.712 4.902 2.71 8.449Z"
/>
<defs>
<linearGradient
id="a"
x1={30.5}
x2={30.5}
y1={0}
y2={65}
gradientUnits="userSpaceOnUse">
<stop stopColor="#6364FF" />
<stop offset={1} stopColor="#563ACC" />
</linearGradient>
</defs>
</svg>
);
}
export default Mastodon;
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

import type {SVGProps, ReactNode} from 'react';

import clsx from 'clsx';
import styles from './styles.module.css';

// SVG Source: https://svgl.app/
function Threads(props: SVGProps<SVGSVGElement>): ReactNode {
return (
<svg
xmlns="http://www.w3.org/2000/svg"
aria-label="Threads"
viewBox="0 0 192 192"
width="1em"
fill="none"
height="1em"
{...props}
className={clsx(props.className, styles.threadsSvg)}
style={{'--dark': '#000', '--light': '#fff'} as React.CSSProperties}>
<path d="M141.537 88.988a66.667 66.667 0 0 0-2.518-1.143c-1.482-27.307-16.403-42.94-41.457-43.1h-.34c-14.986 0-27.449 6.396-35.12 18.036l13.779 9.452c5.73-8.695 14.724-10.548 21.348-10.548h.229c8.249.053 14.474 2.452 18.503 7.129 2.932 3.405 4.893 8.111 5.864 14.05-7.314-1.243-15.224-1.626-23.68-1.14-23.82 1.371-39.134 15.264-38.105 34.568.522 9.792 5.4 18.216 13.735 23.719 7.047 4.652 16.124 6.927 25.557 6.412 12.458-.683 22.231-5.436 29.049-14.127 5.178-6.6 8.453-15.153 9.899-25.93 5.937 3.583 10.337 8.298 12.767 13.966 4.132 9.635 4.373 25.468-8.546 38.376-11.319 11.308-24.925 16.2-45.488 16.351-22.809-.169-40.06-7.484-51.275-21.742C35.236 139.966 29.808 120.682 29.605 96c.203-24.682 5.63-43.966 16.133-57.317C56.954 24.425 74.204 17.11 97.013 16.94c22.975.17 40.526 7.52 52.171 21.847 5.71 7.026 10.015 15.86 12.853 26.162l16.147-4.308c-3.44-12.68-8.853-23.606-16.219-32.668C147.036 9.607 125.202.195 97.07 0h-.113C68.882.194 47.292 9.642 32.788 28.08 19.882 44.485 13.224 67.315 13.001 95.932L13 96v.067c.224 28.617 6.882 51.447 19.788 67.854C47.292 182.358 68.882 191.806 96.957 192h.113c24.96-.173 42.554-6.708 57.048-21.189 18.963-18.945 18.392-42.692 12.142-57.27-4.484-10.454-13.033-18.945-24.723-24.553ZM98.44 129.507c-10.44.588-21.286-4.098-21.82-14.135-.397-7.442 5.296-15.746 22.461-16.735 1.966-.114 3.895-.169 5.79-.169 6.235 0 12.068.606 17.371 1.765-1.978 24.702-13.58 28.713-23.802 29.274Z" />
</svg>
);
}
export default Threads;
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

[data-theme='dark'] .threadsSvg {
fill: var(--light);
}

[data-theme='light'] .threadsSvg {
fill: var(--dark);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import type {SVGProps, ReactNode} from 'react';

// SVG Source: https://svgl.app/
function Twitch(props: SVGProps<SVGSVGElement>): ReactNode {
return (
<svg
xmlns="http://www.w3.org/2000/svg"
xmlSpace="preserve"
id="Layer_1"
x={0}
y={0}
viewBox="0 0 2400 2800"
width="1em"
height="1em"
{...props}>
<path
d="m2200 1300-400 400h-400l-350 350v-350H600V200h1600z"
fill="#fff"
/>
<g id="Layer_1-2">
<path
d="M500 0 0 500v1800h600v500l500-500h400l900-900V0H500zm1700 1300-400 400h-400l-350 350v-350H600V200h1600v1100z"
fill="#9146ff"
/>
<path
d="M1700 550h200v600h-200zM1150 550h200v600h-200z"
fill="#9146ff"
/>
</g>
</svg>
);
}
export default Twitch;
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import type {SVGProps, ReactNode} from 'react';

function YouTube(props: SVGProps<SVGSVGElement>): ReactNode {
return (
<svg
viewBox="0 0 256 180"
width="1em"
height="1em"
xmlns="http://www.w3.org/2000/svg"
preserveAspectRatio="xMidYMid"
{...props}>
<path
d="M250.346 28.075A32.18 32.18 0 0 0 227.69 5.418C207.824 0 127.87 0 127.87 0S47.912.164 28.046 5.582A32.18 32.18 0 0 0 5.39 28.24c-6.009 35.298-8.34 89.084.165 122.97a32.18 32.18 0 0 0 22.656 22.657c19.866 5.418 99.822 5.418 99.822 5.418s79.955 0 99.82-5.418a32.18 32.18 0 0 0 22.657-22.657c6.338-35.348 8.291-89.1-.164-123.134Z"
fill="red"
/>
<path fill="#FFF" d="m102.421 128.06 66.328-38.418-66.328-38.418z" />
</svg>
);
}
export default YouTube;
21 changes: 21 additions & 0 deletions website/_dogfooding/_blog tests/2024-12-14-all-thesocials.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
title: Social media test
authors:
- name: Zed Spencer-Milnes
title: All the socials test
urL: https://gingergeek.co.uk
image_url: https://github.com/GingerGeek.png
page: false
socials:
x: GingerGeek
github: gingergeek
linkedin: zedspencermilnes
youtube: gingergeekuk
bluesky: gingergeek.co.uk
stackoverflow: 2064409
twitch: gingergeek
threads: gingergeekuk
mastodon: https://hachyderm.io/@zed
---

Well, that's a lot of social media profiles.

0 comments on commit aba2ac0

Please sign in to comment.