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' // } // ] })