diff --git a/components/Footer.tsx b/components/Footer.tsx
index e927b79606..1565ec3111 100644
--- a/components/Footer.tsx
+++ b/components/Footer.tsx
@@ -1,13 +1,19 @@
-import { FaEnvelopeOpenText } from '@react-icons/all-files/fa/FaEnvelopeOpenText'
-import { FaGithub } from '@react-icons/all-files/fa/FaGithub'
-import { FaLinkedin } from '@react-icons/all-files/fa/FaLinkedin'
-import { FaMastodon } from '@react-icons/all-files/fa/FaMastodon'
-import { FaTwitter } from '@react-icons/all-files/fa/FaTwitter'
-import { FaYoutube } from '@react-icons/all-files/fa/FaYoutube'
-import { FaZhihu } from '@react-icons/all-files/fa/FaZhihu'
-import { IoMoonSharp } from '@react-icons/all-files/io5/IoMoonSharp'
-import { IoSunnyOutline } from '@react-icons/all-files/io5/IoSunnyOutline'
import * as React from 'react'
+import /* Font Awesome */
+{
+ FaDiscord,
+ FaEnvelopeOpenText,
+ FaGithub,
+ FaLinkedin,
+ FaMastodon,
+ FaTwitter,
+ FaYoutube,
+ FaZhihu} from "react-icons/fa";
+import /* Ionicons 5 */
+{
+ IoMoonSharp,
+ IoSunnyOutline
+} from 'react-icons/io5'
import * as config from '@/lib/config'
import { useDarkMode } from '@/lib/use-dark-mode'
@@ -54,6 +60,17 @@ export function FooterImpl() {
+ {config.discord_invite && (
+
+
+
+ )}
{config.twitter && (
+ )
+ },
+
+ config.youtube && {
+ name: 'youtube',
+ href: `https://www.youtube.com/${config.youtube}`,
+ title: `YouTube ${config.youtube}`,
+ icon: (
+
+ )
+ },
+
config.twitter && {
name: 'twitter',
href: `https://twitter.com/${config.twitter}`,
title: `Twitter @${config.twitter}`,
icon: (
-
+
)
},
@@ -29,9 +54,7 @@ const socialLinks: SocialLink[] = [
href: `https://github.com/${config.github}`,
title: `GitHub @${config.github}`,
icon: (
-
+
)
},
@@ -40,9 +63,7 @@ const socialLinks: SocialLink[] = [
href: `https://www.linkedin.com/in/${config.linkedin}`,
title: `LinkedIn ${config.author}`,
icon: (
-
+
)
},
@@ -57,16 +78,6 @@ const socialLinks: SocialLink[] = [
)
},
- config.youtube && {
- name: 'youtube',
- href: `https://www.youtube.com/${config.youtube}`,
- title: `YouTube ${config.youtube}`,
- icon: (
-
- )
- }
].filter(Boolean)
export function PageSocial() {
diff --git a/components/styles.module.css b/components/styles.module.css
index bea8ff1ed9..95a8fc5c33 100644
--- a/components/styles.module.css
+++ b/components/styles.module.css
@@ -90,6 +90,10 @@
color: #2795e9;
}
+.discord:hover {
+ color: #5865f2;
+}
+
.twitter:hover {
color: #2795e9;
}
diff --git a/lib/config.ts b/lib/config.ts
index 4e74d12c97..de6e722398 100644
--- a/lib/config.ts
+++ b/lib/config.ts
@@ -54,6 +54,8 @@ export const description: string = getSiteConfig('description', 'Notion Blog')
export const language: string = getSiteConfig('language', 'en')
// social accounts
+export const discord: string | null = getSiteConfig('discord', null)
+export const discord_invite: string | null = getSiteConfig('discord_invite', null)
export const twitter: string | null = getSiteConfig('twitter', null)
export const mastodon: string | null = getSiteConfig('mastodon', null)
export const github: string | null = getSiteConfig('github', null)
diff --git a/lib/site-config.ts b/lib/site-config.ts
index cfd538e767..9cf91a1e3f 100644
--- a/lib/site-config.ts
+++ b/lib/site-config.ts
@@ -10,6 +10,8 @@ export interface SiteConfig {
description?: string
language?: string
+ discord?: string
+ discord_invite?: string
twitter?: string
github?: string
linkedin?: string
diff --git a/package.json b/package.json
index 452b457dfb..c885229333 100644
--- a/package.json
+++ b/package.json
@@ -35,6 +35,8 @@
"@keyvhq/redis": "^1.6.10",
"@react-icons/all-files": "^4.1.0",
"classnames": "^2.5.1",
+ "@vercel/og": "^0.0.19",
+ "date-fns": "^2.28.0",
"expiry-map": "^2.0.0",
"fathom-client": "^3.4.1",
"ky": "^1.7.2",
@@ -52,6 +54,8 @@
"react-dom": "^18.2.0",
"react-notion-x": "^7.2.3",
"react-tweet": "^3.2.1",
+ "react-icons": "^4.7.1",
+ "react-tweet-embed": "^2.0.0",
"react-use": "^17.4.2",
"rss": "^1.2.2"
},
diff --git a/pages/_document.tsx b/pages/_document.tsx
index 28cc023758..1b0f437ce3 100644
--- a/pages/_document.tsx
+++ b/pages/_document.tsx
@@ -1,5 +1,5 @@
-import { IconContext } from '@react-icons/all-files'
import Document, { Head, Html, Main, NextScript } from 'next/document'
+import { IconContext } from 'react-icons'
export default class MyDocument extends Document {
render() {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index be02629a53..67916dd972 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -20,9 +20,15 @@ importers:
'@react-icons/all-files':
specifier: ^4.1.0
version: 4.1.0(react@18.3.1)
+ '@vercel/og':
+ specifier: ^0.0.19
+ version: 0.0.19
classnames:
specifier: ^2.5.1
version: 2.5.1
+ date-fns:
+ specifier: ^2.28.0
+ version: 2.30.0
expiry-map:
specifier: ^2.0.0
version: 2.0.0
@@ -68,12 +74,18 @@ importers:
react-dom:
specifier: ^18.2.0
version: 18.3.1(react@18.3.1)
+ react-icons:
+ specifier: ^4.7.1
+ version: 4.12.0(react@18.3.1)
react-notion-x:
specifier: ^7.2.3
version: 7.2.3(@babel/runtime@7.26.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-tweet:
specifier: ^3.2.1
version: 3.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-tweet-embed:
+ specifier: ^2.0.0
+ version: 2.0.0(react@18.3.1)
react-use:
specifier: ^17.4.2
version: 17.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -387,12 +399,21 @@ packages:
peerDependencies:
react: '*'
+ '@resvg/resvg-wasm@2.0.0-alpha.4':
+ resolution: {integrity: sha512-pWIG9a/x1ky8gXKRhPH1OPKpHFoMN1ISLbJ+O+gPXQHIAKhNd5I28RlWf7q576hAOQA9JZTlo3p/M2uyLzJmmw==}
+ engines: {node: '>= 10'}
+
'@rtsao/scc@1.1.0':
resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
'@rushstack/eslint-patch@1.10.4':
resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==}
+ '@shuding/opentype.js@1.4.0-beta.0':
+ resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==}
+ engines: {node: '>= 8.0.0'}
+ hasBin: true
+
'@swc/counter@0.1.3':
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
@@ -417,6 +438,9 @@ packages:
'@types/react@18.3.12':
resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==}
+ '@types/yoga-layout@1.9.2':
+ resolution: {integrity: sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==}
+
'@typescript-eslint/eslint-plugin@7.18.0':
resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==}
engines: {node: ^18.18.0 || >=20.0.0}
@@ -483,6 +507,10 @@ packages:
peerDependencies:
react: '>=16.8.0'
+ '@vercel/og@0.0.19':
+ resolution: {integrity: sha512-1LrPUlCoe8T+aEI1fGdvJDhwewK1/wpYlQnF+E9ERgJMFCnmWH4FA+NYBkQaJqxUUeHoutIxNZTHQFT39+I+BQ==}
+ engines: {node: '>=16'}
+
'@xobotyi/scrollbar-width@1.9.5':
resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==}
@@ -622,6 +650,9 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
+ camelize@1.0.1:
+ resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
+
caniuse-lite@1.0.30001676:
resolution: {integrity: sha512-Qz6zwGCiPghQXGJvgQAem79esjitvJ+CxSbSQkW9H/UX5hg8XM88d4lp2W+MEQ81j+Hip58Il+jGVdazk1z9cw==}
@@ -712,9 +743,22 @@ packages:
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
engines: {node: '>= 8'}
+ css-background-parser@0.1.0:
+ resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==}
+
+ css-box-shadow@1.0.0-3:
+ resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==}
+
+ css-color-keywords@1.0.0:
+ resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
+ engines: {node: '>=4'}
+
css-in-js-utils@3.1.0:
resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==}
+ css-to-react-native@3.2.0:
+ resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==}
+
css-tree@1.1.3:
resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
engines: {node: '>=8.0.0'}
@@ -737,6 +781,10 @@ packages:
resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
engines: {node: '>= 0.4'}
+ date-fns@2.30.0:
+ resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
+ engines: {node: '>=0.11'}
+
debounce@1.2.1:
resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
@@ -1053,6 +1101,9 @@ packages:
fflate@0.4.8:
resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==}
+ fflate@0.7.4:
+ resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==}
+
file-entry-cache@6.0.1:
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
engines: {node: ^10.12.0 || >=12.0.0}
@@ -1802,6 +1853,9 @@ packages:
resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
engines: {node: '>= 0.4'}
+ postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
postcss@8.4.31:
resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
engines: {node: ^10 || ^12 || >=14}
@@ -1852,6 +1906,11 @@ packages:
react: '>=16.8.1'
react-dom: '>=16.8.1'
+ react-icons@4.12.0:
+ resolution: {integrity: sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==}
+ peerDependencies:
+ react: '*'
+
react-image@4.1.0:
resolution: {integrity: sha512-qwPNlelQe9Zy14K2pGWSwoL+vHsAwmJKS6gkotekDgRpcnRuzXNap00GfibD3eEPYu3WCPlyIUUNzcyHOrLHjw==}
peerDependencies:
@@ -1905,6 +1964,11 @@ packages:
peerDependencies:
react: ^16.3.0 || ^17.0.0 || ^18.0.0
+ react-tweet-embed@2.0.0:
+ resolution: {integrity: sha512-g2kfPjSRTOKeJtaQF5EMuSTmp/q8I0qdDs/pZ2qLXZjCWExDT/JgjxSlyM65NyNzsz8072PDpvlO/sIXwwVpdQ==}
+ peerDependencies:
+ react: '>=17'
+
react-tweet@3.2.1:
resolution: {integrity: sha512-dktP3RMuwRB4pnSDocKpSsW5Hq1IXRW6fONkHhxT5EBIXsKZzdQuI70qtub1XN2dtZdkJWWxfBm/Q+kN+vRYFA==}
peerDependencies:
@@ -2024,6 +2088,10 @@ packages:
safe-regex@2.1.1:
resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==}
+ satori@0.0.42:
+ resolution: {integrity: sha512-ZZaNp2Ya1ACJ4Yf++e9Ccc1Rb6GcKjC9Nhcl4SQFcdM4VqCLfWHR6Iq7AdRCTcJDDuO8u/qGE2Cs+McVoqJenw==}
+ engines: {node: '>=16'}
+
scheduler@0.23.2:
resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
@@ -2145,6 +2213,9 @@ packages:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
+ string.prototype.codepointat@0.2.1:
+ resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==}
+
string.prototype.includes@2.0.1:
resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==}
engines: {node: '>= 0.4'}
@@ -2411,6 +2482,13 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
+ yoga-layout-prebuilt@1.10.0:
+ resolution: {integrity: sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==}
+ engines: {node: '>=8'}
+
+ yoga-wasm-web@0.1.2:
+ resolution: {integrity: sha512-8SkgawHcA0RUbMrnhxbaQkZDBi8rMed8pQHixkFF9w32zGhAwZ9/cOHWlpYfr6RCx42Yp3siV45/jPEkJxsk6w==}
+
snapshots:
'@babel/code-frame@7.26.2':
@@ -2476,8 +2554,8 @@ snapshots:
'@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.3)
'@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.6.3)
eslint-config-prettier: 9.1.0(eslint@8.57.1)
- eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1)
- eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
eslint-plugin-jest: 28.8.3(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)
eslint-plugin-jest-dom: 5.4.0(eslint@8.57.1)
eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1)
@@ -2680,10 +2758,17 @@ snapshots:
dependencies:
react: 18.3.1
+ '@resvg/resvg-wasm@2.0.0-alpha.4': {}
+
'@rtsao/scc@1.1.0': {}
'@rushstack/eslint-patch@1.10.4': {}
+ '@shuding/opentype.js@1.4.0-beta.0':
+ dependencies:
+ fflate: 0.7.4
+ string.prototype.codepointat: 0.2.1
+
'@swc/counter@0.1.3': {}
'@swc/helpers@0.5.13':
@@ -2707,6 +2792,8 @@ snapshots:
'@types/prop-types': 15.7.13
csstype: 3.1.3
+ '@types/yoga-layout@1.9.2': {}
+
'@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)':
dependencies:
'@eslint-community/regexpp': 4.12.1
@@ -2794,6 +2881,12 @@ snapshots:
dependencies:
react: 18.3.1
+ '@vercel/og@0.0.19':
+ dependencies:
+ '@resvg/resvg-wasm': 2.0.0-alpha.4
+ satori: 0.0.42
+ yoga-wasm-web: 0.1.2
+
'@xobotyi/scrollbar-width@1.9.5': {}
abbrev@1.1.1:
@@ -2959,6 +3052,8 @@ snapshots:
callsites@3.1.0: {}
+ camelize@1.0.1: {}
+
caniuse-lite@1.0.30001676: {}
caniuse-lite@1.0.30001678: {}
@@ -3043,10 +3138,22 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
+ css-background-parser@0.1.0: {}
+
+ css-box-shadow@1.0.0-3: {}
+
+ css-color-keywords@1.0.0: {}
+
css-in-js-utils@3.1.0:
dependencies:
hyphenate-style-name: 1.1.0
+ css-to-react-native@3.2.0:
+ dependencies:
+ camelize: 1.0.1
+ css-color-keywords: 1.0.0
+ postcss-value-parser: 4.2.0
+
css-tree@1.1.3:
dependencies:
mdn-data: 2.0.14
@@ -3074,6 +3181,10 @@ snapshots:
es-errors: 1.3.0
is-data-view: 1.0.1
+ date-fns@2.30.0:
+ dependencies:
+ '@babel/runtime': 7.26.0
+
debounce@1.2.1: {}
debug@3.2.7:
@@ -3257,37 +3368,37 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1):
+ eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@8.57.1):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.3.7
enhanced-resolve: 5.17.1
eslint: 8.57.1
- eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
fast-glob: 3.3.2
get-tsconfig: 4.8.1
is-bun-module: 1.2.1
is-glob: 4.0.3
optionalDependencies:
- eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
transitivePeerDependencies:
- '@typescript-eslint/parser'
- eslint-import-resolver-node
- eslint-import-resolver-webpack
- supports-color
- eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1):
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.3)
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1)
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0)(eslint@8.57.1)
transitivePeerDependencies:
- supports-color
- eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1):
+ eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.8
@@ -3298,7 +3409,7 @@ snapshots:
doctrine: 2.1.0
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
hasown: 2.0.2
is-core-module: 2.15.1
is-glob: 4.0.3
@@ -3517,6 +3628,8 @@ snapshots:
fflate@0.4.8: {}
+ fflate@0.7.4: {}
+
file-entry-cache@6.0.1:
dependencies:
flat-cache: 3.2.0
@@ -4260,6 +4373,8 @@ snapshots:
possible-typed-array-names@1.0.0: {}
+ postcss-value-parser@4.2.0: {}
+
postcss@8.4.31:
dependencies:
nanoid: 3.3.7
@@ -4311,6 +4426,10 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
+ react-icons@4.12.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
react-image@4.1.0(@babel/runtime@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@babel/runtime': 7.26.0
@@ -4389,6 +4508,10 @@ snapshots:
dependencies:
react: 18.3.1
+ react-tweet-embed@2.0.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
react-tweet@3.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@swc/helpers': 0.5.13
@@ -4540,6 +4663,15 @@ snapshots:
dependencies:
regexp-tree: 0.1.27
+ satori@0.0.42:
+ dependencies:
+ '@shuding/opentype.js': 1.4.0-beta.0
+ css-background-parser: 0.1.0
+ css-box-shadow: 1.0.0-3
+ css-to-react-native: 3.2.0
+ postcss-value-parser: 4.2.0
+ yoga-layout-prebuilt: 1.10.0
+
scheduler@0.23.2:
dependencies:
loose-envify: 1.4.0
@@ -4687,6 +4819,8 @@ snapshots:
strip-ansi: 6.0.1
optional: true
+ string.prototype.codepointat@0.2.1: {}
+
string.prototype.includes@2.0.1:
dependencies:
call-bind: 1.0.7
@@ -4994,3 +5128,9 @@ snapshots:
optional: true
yocto-queue@0.1.0: {}
+
+ yoga-layout-prebuilt@1.10.0:
+ dependencies:
+ '@types/yoga-layout': 1.9.2
+
+ yoga-wasm-web@0.1.2: {}
diff --git a/site.config.ts b/site.config.ts
index cded79c3bf..5161fb65d6 100644
--- a/site.config.ts
+++ b/site.config.ts
@@ -1,55 +1,78 @@
import { siteConfig } from './lib/site-config'
export default siteConfig({
- // the site's root Notion page (required)
+ /* (required)
+ The site's root Notion page
+ */
rootNotionPageId: '7875426197cf461698809def95960ebf',
- // if you want to restrict pages to a single notion workspace (optional)
- // (this should be a Notion ID; see the docs for how to extract this)
+ /* (optional)
+ if you want to restrict pages to a single notion workspace
+ (this should be a Notion ID; see the docs for how to extract this)
+ */
rootNotionSpaceId: null,
- // basic site info (required)
+ /* (required)
+ Basic site info
+ */
name: 'Next.js Notion Starter Kit',
domain: 'nextjs-notion-starter-kit.transitivebullsh.it',
author: 'Travis Fischer',
- // open graph metadata (optional)
+ /* (optional)
+ Open graph metadata
+ */
description: 'Example Next.js Notion Starter Kit Site',
- // social usernames (optional)
+ /* (optional)
+ Social usernames
+ */
twitter: 'transitive_bs',
github: 'transitive-bullshit',
linkedin: 'fisch2',
- // mastodon: '#', // optional mastodon profile URL, provides link verification
- // newsletter: '#', // optional newsletter URL
- // youtube: '#', // optional youtube channel name or `channel/UCGbXXXXXXXXXXXXXXXXXXXXXX`
+ // discord: 'My Server', /* Server Name */
+ // discord_invite: 'https://discord.gg/zf6g5KQ6H4', /* Discord invite link */
+ // mastodon: '#', /* Optional mastodon profile URL, provides link verification */
+ // newsletter: '#', /* Optional newsletter URL */
+ // youtube: '#', /* Optional youtube channel name or `channel/UCGbXXXXXXXXXXXXXXXXXXXXXX` */
- // default notion icon and cover images for site-wide consistency (optional)
- // page-specific values will override these site-wide defaults
+ /* (optional)
+ Default notion icon and cover images for site-wide consistency.
+ Page-specific values will override these site-wide defaults.
+ */
defaultPageIcon: null,
defaultPageCover: null,
defaultPageCoverPosition: 0.5,
- // whether or not to enable support for LQIP preview images (optional)
+ /* (optional)
+ Whether or not to enable support for LQIP preview images.
+ */
isPreviewImageSupportEnabled: true,
- // whether or not redis is enabled for caching generated preview images (optional)
- // NOTE: if you enable redis, you need to set the `REDIS_HOST` and `REDIS_PASSWORD`
- // environment variables. see the readme for more info
+ /* (optional)
+ Whether or not redis is enabled for caching generated preview images.
+ NOTE: if you enable redis, you need to set the `REDIS_HOST`
+ and `REDIS_PASSWORD` environment variables.
+ See the readme for more info.
+ */
isRedisEnabled: false,
- // map of notion page IDs to URL paths (optional)
- // any pages defined here will override their default URL paths
- // example:
- //
+ /* (optional)
+ Map of notion page IDs to URL paths.
+ Any pages defined here will override their default URL paths.
+ Example:
+ */
// pageUrlOverrides: {
// '/foo': '067dd719a912471ea9a3ac10710e7fdf',
// '/bar': '0be6efce9daf42688f65c76b89f8eb27'
// }
pageUrlOverrides: null,
- // whether to use the default notion navigation style or a custom one with links to
- // important pages. To use `navigationLinks`, set `navigationStyle` to `custom`.
+ /*
+ Whether to use the default notion navigation style
+ or a custom one with links to important pages.
+ To use `navigationLinks`, set `navigationStyle` to `custom`.
+ */
navigationStyle: 'default'
// navigationStyle: 'custom',
// navigationLinks: [
@@ -59,7 +82,7 @@ export default siteConfig({
// },
// {
// title: 'Contact',
- // pageId: '6a29ebcb935a4f0689fe661ab5f3b8d1'
+ // url: 'https://twitter.com/transitive_bs'
// }
// ]
})