From 43795fcabbe87ff8b1407720f1cfe54bbf569d70 Mon Sep 17 00:00:00 2001 From: Zed Spencer-Milnes Date: Fri, 27 Dec 2024 11:32:25 +0000 Subject: [PATCH] feat(blog): Add author social icons for bluesky, mastodon, threads, twitch, youtube, instagram (#10768) Co-authored-by: sebastien Co-authored-by: Chas Emerick --- .prettierignore | 1 + .../src/__tests__/authorsSocials.test.ts | 21 ++++++++ .../src/authorsSocials.ts | 12 +++++ .../src/plugin-content-blog.d.ts | 8 +++- .../src/theme-classic.d.ts | 48 +++++++++++++++++++ .../Blog/Components/Author/Socials/index.tsx | 12 +++++ .../src/theme/Icon/Socials/Bluesky/index.tsx | 27 +++++++++++ .../src/theme/Icon/Socials/GitHub/index.tsx | 12 ++--- .../theme/Icon/Socials/Instagram/index.tsx | 28 +++++++++++ .../Icon/Socials/Instagram/styles.module.css | 14 ++++++ .../src/theme/Icon/Socials/LinkedIn/index.tsx | 2 +- .../src/theme/Icon/Socials/Mastodon/index.tsx | 45 +++++++++++++++++ .../src/theme/Icon/Socials/Threads/index.tsx | 30 ++++++++++++ .../Icon/Socials/Threads/styles.module.css | 14 ++++++ .../src/theme/Icon/Socials/Twitch/index.tsx | 37 ++++++++++++++ .../src/theme/Icon/Socials/Twitter/index.tsx | 2 +- .../src/theme/Icon/Socials/X/index.tsx | 6 +-- .../src/theme/Icon/Socials/YouTube/index.tsx | 27 +++++++++++ project-words.txt | 8 ++++ .../2024-07-03-multiple-authors.mdx | 17 +++++++ website/blog/authors.yml | 7 ++- .../docs/api/plugins/plugin-content-blog.mdx | 3 +- 22 files changed, 364 insertions(+), 17 deletions(-) create mode 100644 packages/docusaurus-theme-classic/src/theme/Icon/Socials/Bluesky/index.tsx create mode 100644 packages/docusaurus-theme-classic/src/theme/Icon/Socials/Instagram/index.tsx create mode 100644 packages/docusaurus-theme-classic/src/theme/Icon/Socials/Instagram/styles.module.css create mode 100644 packages/docusaurus-theme-classic/src/theme/Icon/Socials/Mastodon/index.tsx create mode 100644 packages/docusaurus-theme-classic/src/theme/Icon/Socials/Threads/index.tsx create mode 100644 packages/docusaurus-theme-classic/src/theme/Icon/Socials/Threads/styles.module.css create mode 100644 packages/docusaurus-theme-classic/src/theme/Icon/Socials/Twitch/index.tsx create mode 100644 packages/docusaurus-theme-classic/src/theme/Icon/Socials/YouTube/index.tsx diff --git a/.prettierignore b/.prettierignore index fe032054f7ef..19af204b9c6a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -4,6 +4,7 @@ node_modules build coverage .docusaurus +.idea .svg *.svg diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/authorsSocials.test.ts b/packages/docusaurus-plugin-content-blog/src/__tests__/authorsSocials.test.ts index af408e3dedb0..9a1a256587c9 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/authorsSocials.test.ts +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/authorsSocials.test.ts @@ -15,14 +15,27 @@ describe('normalizeSocials', () => { linkedin: 'ozakione', github: 'ozakione', stackoverflow: 'ozakione', + threads: 'gingergeekuk', + bluesky: 'gingergeek.co.uk', + instagram: 'thisweekinreact', + twitch: 'gingergeek', + youtube: 'gingergeekuk', + mastodon: 'Mastodon', }; + // eslint-disable-next-line jest/no-large-snapshots expect(normalizeSocials(socials)).toMatchInlineSnapshot(` { + "bluesky": "https://bsky.app/profile/gingergeek.co.uk", "github": "https://github.com/ozakione", + "instagram": "https://www.instagram.com/thisweekinreact", "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", } `); }); @@ -33,13 +46,19 @@ describe('normalizeSocials', () => { linkedIn: 'ozakione', gitHub: 'ozakione', STACKoverflow: 'ozakione', + instaGRam: 'thisweekinreact', + BLUESKY: 'gingergeek.co.uk', + tHrEaDs: 'gingergeekuk', }; expect(normalizeSocials(socials)).toMatchInlineSnapshot(` { + "bluesky": "https://bsky.app/profile/gingergeek.co.uk", "github": "https://github.com/ozakione", + "instagram": "https://www.instagram.com/thisweekinreact", "linkedin": "https://www.linkedin.com/in/ozakione/", "stackoverflow": "https://stackoverflow.com/users/ozakione", + "threads": "https://www.threads.net/@gingergeekuk", "twitter": "https://twitter.com/ozakione", } `); @@ -62,12 +81,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", } diff --git a/packages/docusaurus-plugin-content-blog/src/authorsSocials.ts b/packages/docusaurus-plugin-content-blog/src/authorsSocials.ts index b190e3e09dc2..80bb3c586407 100644 --- a/packages/docusaurus-plugin-content-blog/src/authorsSocials.ts +++ b/packages/docusaurus-plugin-content-blog/src/authorsSocials.ts @@ -21,6 +21,12 @@ export const AuthorSocialsSchema = Joi.object({ .try(Joi.number(), Joi.string()) .custom((val) => String(val)), x: Joi.string(), + bluesky: Joi.string(), + instagram: Joi.string(), + threads: Joi.string(), + mastodon: Joi.string(), + twitch: Joi.string(), + youtube: Joi.string(), }).unknown(); type PredefinedPlatformNormalizer = (value: string) => string; @@ -35,6 +41,12 @@ 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}`, + instagram: (handle: string) => `https://www.instagram.com/${handle}`, + threads: (handle: string) => `https://www.threads.net/@${handle}`, + mastodon: (handle: string) => `https://mastodon.social/@${handle}`, // can be in format user@other.server 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]; diff --git a/packages/docusaurus-plugin-content-blog/src/plugin-content-blog.d.ts b/packages/docusaurus-plugin-content-blog/src/plugin-content-blog.d.ts index f13f42ec1df2..afe7fe519b32 100644 --- a/packages/docusaurus-plugin-content-blog/src/plugin-content-blog.d.ts +++ b/packages/docusaurus-plugin-content-blog/src/plugin-content-blog.d.ts @@ -46,7 +46,13 @@ declare module '@docusaurus/plugin-content-blog' { | 'github' | 'linkedin' | 'stackoverflow' - | 'x'; + | 'x' + | 'bluesky' + | 'instagram' + | 'threads' + | 'mastodon' + | 'youtube' + | 'twitch'; /** * Social platforms of the author. diff --git a/packages/docusaurus-theme-classic/src/theme-classic.d.ts b/packages/docusaurus-theme-classic/src/theme-classic.d.ts index 6b5c40d73047..59906ef77a98 100644 --- a/packages/docusaurus-theme-classic/src/theme-classic.d.ts +++ b/packages/docusaurus-theme-classic/src/theme-classic.d.ts @@ -1708,6 +1708,54 @@ declare module '@theme/Icon/Socials/StackOverflow' { export default function StackOverflow(props: Props): ReactNode; } +declare module '@theme/Icon/Socials/Bluesky' { + import type {ComponentProps, ReactNode} from 'react'; + + export interface Props extends ComponentProps<'svg'> {} + + export default function Bluesky(props: Props): ReactNode; +} + +declare module '@theme/Icon/Socials/Instagram' { + import type {ComponentProps, ReactNode} from 'react'; + + export interface Props extends ComponentProps<'svg'> {} + + export default function Instagram(props: Props): ReactNode; +} + +declare module '@theme/Icon/Socials/Threads' { + import type {ComponentProps, ReactNode} from 'react'; + + export interface Props extends ComponentProps<'svg'> {} + + export default function Threads(props: Props): ReactNode; +} + +declare module '@theme/Icon/Socials/YouTube' { + import type {ComponentProps, ReactNode} from 'react'; + + export interface Props extends ComponentProps<'svg'> {} + + export default function YouTube(props: Props): ReactNode; +} + +declare module '@theme/Icon/Socials/Twitch' { + import type {ComponentProps, ReactNode} from 'react'; + + export interface Props extends ComponentProps<'svg'> {} + + export default function Twitch(props: Props): ReactNode; +} + +declare module '@theme/Icon/Socials/Mastodon' { + import type {ComponentProps, ReactNode} from 'react'; + + export interface Props extends ComponentProps<'svg'> {} + + export default function Mastodon(props: Props): ReactNode; +} + declare module '@theme/TagsListByLetter' { import type {ReactNode} from 'react'; import type {TagsListItem} from '@docusaurus/utils'; diff --git a/packages/docusaurus-theme-classic/src/theme/Blog/Components/Author/Socials/index.tsx b/packages/docusaurus-theme-classic/src/theme/Blog/Components/Author/Socials/index.tsx index a632bd62addd..1ba60c5ae79a 100644 --- a/packages/docusaurus-theme-classic/src/theme/Blog/Components/Author/Socials/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/Blog/Components/Author/Socials/index.tsx @@ -17,6 +17,12 @@ 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 Instagram from '@theme/Icon/Socials/Instagram'; +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'; @@ -30,6 +36,12 @@ const SocialPlatformConfigs: Record = { stackoverflow: {Icon: StackOverflow, label: 'Stack Overflow'}, linkedin: {Icon: LinkedIn, label: 'LinkedIn'}, x: {Icon: X, label: 'X'}, + bluesky: {Icon: Bluesky, label: 'Bluesky'}, + instagram: {Icon: Instagram, label: 'Instagram'}, + 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 { diff --git a/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Bluesky/index.tsx b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Bluesky/index.tsx new file mode 100644 index 000000000000..0f0c400bb42b --- /dev/null +++ b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Bluesky/index.tsx @@ -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): ReactNode { + return ( + + + + ); +} +export default Bluesky; diff --git a/packages/docusaurus-theme-classic/src/theme/Icon/Socials/GitHub/index.tsx b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/GitHub/index.tsx index 2fee4037a012..34ed3c4f9f2d 100644 --- a/packages/docusaurus-theme-classic/src/theme/Icon/Socials/GitHub/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/GitHub/index.tsx @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -import type {ReactNode, SVGProps} from 'react'; +import type {ReactNode, SVGProps, CSSProperties} from 'react'; import clsx from 'clsx'; import styles from './styles.module.css'; @@ -14,14 +14,14 @@ import styles from './styles.module.css'; function GitHub(props: SVGProps): ReactNode { return ( + className={clsx(props.className, styles.githubSvg)}> ); diff --git a/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Instagram/index.tsx b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Instagram/index.tsx new file mode 100644 index 000000000000..a0cf834bba84 --- /dev/null +++ b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Instagram/index.tsx @@ -0,0 +1,28 @@ +/** + * 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, CSSProperties} from 'react'; +import clsx from 'clsx'; +import styles from './styles.module.css'; + +// SVG Source: https://svgl.app/ +function Instagram(props: SVGProps): ReactNode { + return ( + + + + ); +} + +export default Instagram; diff --git a/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Instagram/styles.module.css b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Instagram/styles.module.css new file mode 100644 index 000000000000..981e10a43418 --- /dev/null +++ b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Instagram/styles.module.css @@ -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'] .instagramSvg { + fill: var(--light); +} + +[data-theme='light'] .instagramSvg { + fill: var(--dark); +} diff --git a/packages/docusaurus-theme-classic/src/theme/Icon/Socials/LinkedIn/index.tsx b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/LinkedIn/index.tsx index 7cb8b2aa4514..1970a5bcd1c7 100644 --- a/packages/docusaurus-theme-classic/src/theme/Icon/Socials/LinkedIn/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/LinkedIn/index.tsx @@ -11,9 +11,9 @@ import type {ReactNode, SVGProps} from 'react'; function LinkedIn(props: SVGProps): ReactNode { return ( diff --git a/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Mastodon/index.tsx b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Mastodon/index.tsx new file mode 100644 index 000000000000..5afb5de361bc --- /dev/null +++ b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Mastodon/index.tsx @@ -0,0 +1,45 @@ +/** + * 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 {useId} from 'react'; +import type {SVGProps, ReactNode} from 'react'; + +// SVG Source: https://svgl.app/ +function Mastodon(props: SVGProps): ReactNode { + const gradientId = useId(); + return ( + + + + + + + + + + + ); +} +export default Mastodon; diff --git a/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Threads/index.tsx b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Threads/index.tsx new file mode 100644 index 000000000000..dbaa2f21bd44 --- /dev/null +++ b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Threads/index.tsx @@ -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, CSSProperties} from 'react'; + +import clsx from 'clsx'; +import styles from './styles.module.css'; + +// SVG Source: https://svgl.app/ +function Threads(props: SVGProps): ReactNode { + return ( + + + + ); +} +export default Threads; diff --git a/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Threads/styles.module.css b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Threads/styles.module.css new file mode 100644 index 000000000000..a8031d376c96 --- /dev/null +++ b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Threads/styles.module.css @@ -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); +} diff --git a/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Twitch/index.tsx b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Twitch/index.tsx new file mode 100644 index 000000000000..a9208b8e3d7d --- /dev/null +++ b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Twitch/index.tsx @@ -0,0 +1,37 @@ +/** + * 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): ReactNode { + return ( + + + + + + + + ); +} +export default Twitch; diff --git a/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Twitter/index.tsx b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Twitter/index.tsx index 0972a3671374..fbcc74b39a08 100644 --- a/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Twitter/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/Twitter/index.tsx @@ -11,10 +11,10 @@ import type {ReactNode, SVGProps} from 'react'; function Twitter(props: SVGProps): ReactNode { return ( ): ReactNode { height="1em" fill="none" viewBox="0 0 1200 1227" + style={{'--dark': '#000', '--light': '#fff'} as CSSProperties} {...props} - className={clsx(props.className, styles.xSvg)} - style={{'--dark': '#000', '--light': '#fff'} as React.CSSProperties}> + className={clsx(props.className, styles.xSvg)}> ); diff --git a/packages/docusaurus-theme-classic/src/theme/Icon/Socials/YouTube/index.tsx b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/YouTube/index.tsx new file mode 100644 index 000000000000..2cf6c187eba9 --- /dev/null +++ b/packages/docusaurus-theme-classic/src/theme/Icon/Socials/YouTube/index.tsx @@ -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 YouTube(props: SVGProps): ReactNode { + return ( + + + + + ); +} +export default YouTube; diff --git a/project-words.txt b/project-words.txt index a0f0822f61f0..654d92dfc661 100644 --- a/project-words.txt +++ b/project-words.txt @@ -25,6 +25,9 @@ beforeinstallprompt Bhatt blockquotes Blockquotes +bluesky +Bluesky +BLUESKY Bokmål bunx caabernathy @@ -94,6 +97,8 @@ froms gabrielcsapo getcanary Gifs +gingergeek +gingergeekuk Goss Goyal gtag @@ -174,6 +179,7 @@ metrica Metrika microdata Microdata +Milnes mindmap Mindmap mkdn @@ -320,6 +326,7 @@ Tagkey Teik Therox toplevel +thisweekinreact Transifex transpiles treeified @@ -363,6 +370,7 @@ Yacop yangshun Yangshun yangshunz +zedspencermilnes Zhou zoomable zpao diff --git a/website/_dogfooding/_blog tests/2024-07-03-multiple-authors.mdx b/website/_dogfooding/_blog tests/2024-07-03-multiple-authors.mdx index eaf0b91ec48f..b13b5215bde7 100644 --- a/website/_dogfooding/_blog tests/2024-07-03-multiple-authors.mdx +++ b/website/_dogfooding/_blog tests/2024-07-03-multiple-authors.mdx @@ -9,11 +9,28 @@ authors: github: https://github.com/slorber stackoverflow: https://stackoverflow.com/users/82609/sebastien-lorber linkedin: https://www.linkedin.com/in/sebastienlorber/ + instagram: https://www.instagram.com/thisweekinreact/ newsletter: https://thisweekinreact.com/newsletter - name: Sébastien Lorber imageURL: https://github.com/slorber.png socials: x: https://x.com/sebastienlorber + instagram: thisweekinreact + - 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 - name: Sébastien Lorber imageURL: https://github.com/slorber.png title: Docusaurus Maintainer and This Week In React editor diff --git a/website/blog/authors.yml b/website/blog/authors.yml index 94352e14d550..0b063d6de86b 100644 --- a/website/blog/authors.yml +++ b/website/blog/authors.yml @@ -24,14 +24,13 @@ slorber: url: https://thisweekinreact.com image_url: https://github.com/slorber.png page: true - description: > - A freelance React and React-Native developer near Paris and Docusaurus maintainer. Also runs ThisWeekInReact.com, a newsletter to stay updated with the React ecosystem. - - + description: A freelance React and React-Native developer near Paris and Docusaurus maintainer. Also runs ThisWeekInReact.com, a newsletter to stay updated with the React ecosystem. socials: + bluesky: sebastienlorber.com x: sebastienlorber linkedin: sebastienlorber github: slorber + instagram: thisweekinreact newsletter: https://thisweekinreact.com yangshun: diff --git a/website/docs/api/plugins/plugin-content-blog.mdx b/website/docs/api/plugins/plugin-content-blog.mdx index a3d7a3f7421f..4445f49a1e49 100644 --- a/website/docs/api/plugins/plugin-content-blog.mdx +++ b/website/docs/api/plugins/plugin-content-blog.mdx @@ -278,7 +278,8 @@ type AuthorKey = string; // Social platform name -> Social platform link // Example: {MyPlatform: 'https://myplatform.com/myusername'} -// Pre-defined platforms ("x", "github", "twitter", "linkedin", "stackoverflow") accept handles: +// Pre-defined platforms +// ("x", "github", "twitter", "linkedin", "stackoverflow", "instagram", "bluesky", "mastodon", "threads", "twitch", "youtube") accept handles: // Example: {github: 'slorber'} type AuthorSocials = Record;