feat: mdx page integration and styling

This commit is contained in:
Refansa 2024-08-03 23:51:39 +07:00
parent 9071c6994d
commit 4ed056f744
25 changed files with 360 additions and 420 deletions

View File

@ -29,6 +29,7 @@
"packageDir": "." "packageDir": "."
} }
], ],
"import/no-unresolved": "off",
"import/extensions": "off", "import/extensions": "off",
"no-console": "off", "no-console": "off",
"github/array-foreach": "off", "github/array-foreach": "off",

View File

@ -1,15 +1,4 @@
import nextMDX from '@next/mdx'
const withMDX = nextMDX()
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const nextConfig = { const nextConfig = {}
// Configure `pageExtensions` to include MDX files
pageExtensions: ['js', 'jsx', 'mdx', 'ts', 'tsx'],
experimental: {
// Use the mdx rust compiler
mdxRs: true,
},
}
export default withMDX(nextConfig) export default nextConfig

View File

@ -22,18 +22,16 @@
}, },
"dependencies": { "dependencies": {
"@icons-pack/react-simple-icons": "^9.6.0", "@icons-pack/react-simple-icons": "^9.6.0",
"@mdx-js/loader": "^3.0.1",
"@mdx-js/react": "^3.0.1",
"@next/mdx": "^14.2.5",
"@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-dialog": "^1.1.1",
"@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-tooltip": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.2",
"@react-spring/web": "^9.7.4", "@react-spring/web": "^9.7.4",
"@types/mdx": "^2.0.13",
"class-variance-authority": "^0.7.0", "class-variance-authority": "^0.7.0",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"gray-matter": "^4.0.3",
"lucide-react": "^0.408.0", "lucide-react": "^0.408.0",
"next": "14.2.5", "next": "14.2.5",
"next-mdx-remote": "^5.0.0",
"next-themes": "^0.3.0", "next-themes": "^0.3.0",
"react": "^18", "react": "^18",
"react-dom": "^18", "react-dom": "^18",
@ -43,6 +41,7 @@
"tailwindcss-animate": "^1.0.7" "tailwindcss-animate": "^1.0.7"
}, },
"devDependencies": { "devDependencies": {
"@types/mdx": "^2.0.13",
"@types/node": "^20", "@types/node": "^20",
"@types/react": "^18", "@types/react": "^18",
"@types/react-dom": "^18", "@types/react-dom": "^18",

View File

@ -11,15 +11,6 @@ importers:
'@icons-pack/react-simple-icons': '@icons-pack/react-simple-icons':
specifier: ^9.6.0 specifier: ^9.6.0
version: 9.6.0(react@18.3.1) version: 9.6.0(react@18.3.1)
'@mdx-js/loader':
specifier: ^3.0.1
version: 3.0.1(webpack@5.93.0)
'@mdx-js/react':
specifier: ^3.0.1
version: 3.0.1(@types/react@18.3.3)(react@18.3.1)
'@next/mdx':
specifier: ^14.2.5
version: 14.2.5(@mdx-js/loader@3.0.1(webpack@5.93.0))(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))
'@radix-ui/react-dialog': '@radix-ui/react-dialog':
specifier: ^1.1.1 specifier: ^1.1.1
version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@ -32,21 +23,24 @@ importers:
'@react-spring/web': '@react-spring/web':
specifier: ^9.7.4 specifier: ^9.7.4
version: 9.7.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) version: 9.7.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@types/mdx':
specifier: ^2.0.13
version: 2.0.13
class-variance-authority: class-variance-authority:
specifier: ^0.7.0 specifier: ^0.7.0
version: 0.7.0 version: 0.7.0
clsx: clsx:
specifier: ^2.1.1 specifier: ^2.1.1
version: 2.1.1 version: 2.1.1
gray-matter:
specifier: ^4.0.3
version: 4.0.3
lucide-react: lucide-react:
specifier: ^0.408.0 specifier: ^0.408.0
version: 0.408.0(react@18.3.1) version: 0.408.0(react@18.3.1)
next: next:
specifier: 14.2.5 specifier: 14.2.5
version: 14.2.5(@babel/core@7.24.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) version: 14.2.5(@babel/core@7.24.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next-mdx-remote:
specifier: ^5.0.0
version: 5.0.0(@types/react@18.3.3)(react@18.3.1)
next-themes: next-themes:
specifier: ^0.3.0 specifier: ^0.3.0
version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@ -69,6 +63,9 @@ importers:
specifier: ^1.0.7 specifier: ^1.0.7
version: 1.0.7(tailwindcss@3.4.6) version: 1.0.7(tailwindcss@3.4.6)
devDependencies: devDependencies:
'@types/mdx':
specifier: ^2.0.13
version: 2.0.13
'@types/node': '@types/node':
specifier: ^20 specifier: ^20
version: 20.14.11 version: 20.14.11
@ -966,11 +963,6 @@ packages:
'@jridgewell/trace-mapping@0.3.25': '@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
'@mdx-js/loader@3.0.1':
resolution: {integrity: sha512-YbYUt7YyEOdFxhyuCWmLKf5vKhID/hJAojEUnheJk4D8iYVLFQw+BAoBWru/dHGch1omtmZOPstsmKPyBF68Tw==}
peerDependencies:
webpack: '>=5'
'@mdx-js/mdx@3.0.1': '@mdx-js/mdx@3.0.1':
resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==}
@ -986,17 +978,6 @@ packages:
'@next/eslint-plugin-next@14.2.5': '@next/eslint-plugin-next@14.2.5':
resolution: {integrity: sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==} resolution: {integrity: sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==}
'@next/mdx@14.2.5':
resolution: {integrity: sha512-AROhSdXQg0/jt55iqxVSJqp9oaCyXwRe44/I17c77gDshZ6ex7VKBZDH0GljaxZ0Y4mScYUbFJJEh42Xw4X4Dg==}
peerDependencies:
'@mdx-js/loader': '>=0.15.0'
'@mdx-js/react': '>=0.15.0'
peerDependenciesMeta:
'@mdx-js/loader':
optional: true
'@mdx-js/react':
optional: true
'@next/swc-darwin-arm64@14.2.5': '@next/swc-darwin-arm64@14.2.5':
resolution: {integrity: sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==} resolution: {integrity: sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
@ -1563,9 +1544,6 @@ packages:
'@types/debug@4.1.12': '@types/debug@4.1.12':
resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
'@types/eslint-scope@3.7.7':
resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==}
'@types/eslint@9.6.0': '@types/eslint@9.6.0':
resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==}
@ -1732,57 +1710,6 @@ packages:
'@ungap/structured-clone@1.2.0': '@ungap/structured-clone@1.2.0':
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
'@webassemblyjs/ast@1.12.1':
resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==}
'@webassemblyjs/floating-point-hex-parser@1.11.6':
resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==}
'@webassemblyjs/helper-api-error@1.11.6':
resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==}
'@webassemblyjs/helper-buffer@1.12.1':
resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==}
'@webassemblyjs/helper-numbers@1.11.6':
resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==}
'@webassemblyjs/helper-wasm-bytecode@1.11.6':
resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==}
'@webassemblyjs/helper-wasm-section@1.12.1':
resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==}
'@webassemblyjs/ieee754@1.11.6':
resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==}
'@webassemblyjs/leb128@1.11.6':
resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==}
'@webassemblyjs/utf8@1.11.6':
resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==}
'@webassemblyjs/wasm-edit@1.12.1':
resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==}
'@webassemblyjs/wasm-gen@1.12.1':
resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==}
'@webassemblyjs/wasm-opt@1.12.1':
resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==}
'@webassemblyjs/wasm-parser@1.12.1':
resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==}
'@webassemblyjs/wast-printer@1.12.1':
resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==}
'@xtuc/ieee754@1.2.0':
resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
'@xtuc/long@4.2.2':
resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
abort-controller@3.0.0: abort-controller@3.0.0:
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
engines: {node: '>=6.5'} engines: {node: '>=6.5'}
@ -1791,11 +1718,6 @@ packages:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
acorn-import-attributes@1.9.5:
resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==}
peerDependencies:
acorn: ^8
acorn-jsx@5.3.2: acorn-jsx@5.3.2:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies: peerDependencies:
@ -1806,11 +1728,6 @@ packages:
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
hasBin: true hasBin: true
ajv-keywords@3.5.2:
resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
peerDependencies:
ajv: ^6.9.1
ajv@6.12.6: ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
@ -2089,10 +2006,6 @@ packages:
engines: {node: '>=12.13.0'} engines: {node: '>=12.13.0'}
hasBin: true hasBin: true
chrome-trace-event@1.0.4:
resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
engines: {node: '>=6.0'}
ci-info@2.0.0: ci-info@2.0.0:
resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==}
@ -2387,9 +2300,6 @@ packages:
resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
es-module-lexer@1.5.4:
resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
es-object-atoms@1.0.0: es-object-atoms@1.0.0:
resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -2552,10 +2462,6 @@ packages:
resolution: {integrity: sha512-pWReu3fkohwyvztx/oQWWgld2iad25TfUdi6wvhhaDPIQjHU/pyvlKgXFw1kX31SQK2Nq9MH+vRDWB0ZLy8fYw==} resolution: {integrity: sha512-pWReu3fkohwyvztx/oQWWgld2iad25TfUdi6wvhhaDPIQjHU/pyvlKgXFw1kX31SQK2Nq9MH+vRDWB0ZLy8fYw==}
engines: {node: '>=4.0.0'} engines: {node: '>=4.0.0'}
eslint-scope@5.1.1:
resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
engines: {node: '>=8.0.0'}
eslint-scope@7.2.2: eslint-scope@7.2.2:
resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -2589,10 +2495,6 @@ packages:
resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
engines: {node: '>=4.0'} engines: {node: '>=4.0'}
estraverse@4.3.0:
resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
engines: {node: '>=4.0'}
estraverse@5.3.0: estraverse@5.3.0:
resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
engines: {node: '>=4.0'} engines: {node: '>=4.0'}
@ -2627,14 +2529,14 @@ packages:
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
engines: {node: '>=6'} engines: {node: '>=6'}
events@3.3.0:
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
engines: {node: '>=0.8.x'}
execa@5.1.1: execa@5.1.1:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'} engines: {node: '>=10'}
extend-shallow@2.0.1:
resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
engines: {node: '>=0.10.0'}
extend@3.0.2: extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
@ -2774,9 +2676,6 @@ packages:
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
engines: {node: '>=10.13.0'} engines: {node: '>=10.13.0'}
glob-to-regexp@0.4.1:
resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
glob@10.3.10: glob@10.3.10:
resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==}
engines: {node: '>=16 || 14 >=14.17'} engines: {node: '>=16 || 14 >=14.17'}
@ -2815,6 +2714,10 @@ packages:
graphemer@1.4.0: graphemer@1.4.0:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
gray-matter@4.0.3:
resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
engines: {node: '>=6.0'}
has-bigints@1.0.2: has-bigints@1.0.2:
resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
@ -2987,6 +2890,10 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
hasBin: true hasBin: true
is-extendable@0.1.1:
resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
engines: {node: '>=0.10.0'}
is-extglob@2.1.1: is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -3151,10 +3058,6 @@ packages:
resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
jest-worker@27.5.1:
resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
engines: {node: '>= 10.13.0'}
jest-worker@29.7.0: jest-worker@29.7.0:
resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@ -3204,9 +3107,6 @@ packages:
json-parse-better-errors@1.0.2: json-parse-better-errors@1.0.2:
resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==}
json-parse-even-better-errors@2.3.1:
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
json-schema-traverse@0.4.1: json-schema-traverse@0.4.1:
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
@ -3272,10 +3172,6 @@ packages:
lines-and-columns@1.2.4: lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
loader-runner@4.3.0:
resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
engines: {node: '>=6.11.5'}
locate-path@3.0.0: locate-path@3.0.0:
resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -3615,6 +3511,12 @@ packages:
neo-async@2.6.2: neo-async@2.6.2:
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
next-mdx-remote@5.0.0:
resolution: {integrity: sha512-RNNbqRpK9/dcIFZs/esQhuLA8jANqlH694yqoDBK8hkVdJUndzzGmnPHa2nyi90N4Z9VmzuSWNRpr5ItT3M7xQ==}
engines: {node: '>=14', npm: '>=7'}
peerDependencies:
react: '>=16'
next-themes@0.3.0: next-themes@0.3.0:
resolution: {integrity: sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==} resolution: {integrity: sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==}
peerDependencies: peerDependencies:
@ -3959,9 +3861,6 @@ packages:
queue@6.0.2: queue@6.0.2:
resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==}
randombytes@2.1.0:
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
range-parser@1.2.1: range-parser@1.2.1:
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
@ -4212,9 +4111,9 @@ packages:
scheduler@0.24.0-canary-efb381bbf-20230505: scheduler@0.24.0-canary-efb381bbf-20230505:
resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==}
schema-utils@3.3.0: section-matter@1.0.0:
resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
engines: {node: '>= 10.13.0'} engines: {node: '>=4'}
selfsigned@2.4.1: selfsigned@2.4.1:
resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==}
@ -4241,9 +4140,6 @@ packages:
resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
serialize-javascript@6.0.2:
resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
serve-static@1.15.0: serve-static@1.15.0:
resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
@ -4405,6 +4301,10 @@ packages:
resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
strip-bom-string@1.0.0:
resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==}
engines: {node: '>=0.10.0'}
strip-bom@3.0.0: strip-bom@3.0.0:
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -4503,22 +4403,6 @@ packages:
resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
terser-webpack-plugin@5.3.10:
resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==}
engines: {node: '>= 10.13.0'}
peerDependencies:
'@swc/core': '*'
esbuild: '*'
uglify-js: '*'
webpack: ^5.1.0
peerDependenciesMeta:
'@swc/core':
optional: true
esbuild:
optional: true
uglify-js:
optional: true
terser@5.31.3: terser@5.31.3:
resolution: {integrity: sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==} resolution: {integrity: sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -4644,6 +4528,9 @@ packages:
unified@11.0.5: unified@11.0.5:
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
unist-util-is@5.2.1:
resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==}
unist-util-is@6.0.0: unist-util-is@6.0.0:
resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
@ -4656,9 +4543,15 @@ packages:
unist-util-remove-position@5.0.0: unist-util-remove-position@5.0.0:
resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
unist-util-remove@3.1.1:
resolution: {integrity: sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw==}
unist-util-stringify-position@4.0.0: unist-util-stringify-position@4.0.0:
resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
unist-util-visit-parents@5.1.3:
resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==}
unist-util-visit-parents@6.0.1: unist-util-visit-parents@6.0.1:
resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==}
@ -4713,6 +4606,9 @@ packages:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
vfile-matter@5.0.0:
resolution: {integrity: sha512-jhPSqlj8hTSkTXOqyxbUeZAFFVq/iwu/jukcApEqc/7DOidaAth6rDc0Zgg0vWpzUnWkwFP7aK28l6nBmxMqdQ==}
vfile-message@4.0.2: vfile-message@4.0.2:
resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
@ -4725,30 +4621,12 @@ packages:
walker@1.0.8: walker@1.0.8:
resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
watchpack@2.4.1:
resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==}
engines: {node: '>=10.13.0'}
wcwidth@1.0.1: wcwidth@1.0.1:
resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
webidl-conversions@3.0.1: webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
webpack-sources@3.2.3:
resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
engines: {node: '>=10.13.0'}
webpack@5.93.0:
resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==}
engines: {node: '>=10.13.0'}
hasBin: true
peerDependencies:
webpack-cli: '*'
peerDependenciesMeta:
webpack-cli:
optional: true
whatwg-fetch@3.6.20: whatwg-fetch@3.6.20:
resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
@ -5957,14 +5835,6 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2 '@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/sourcemap-codec': 1.5.0
'@mdx-js/loader@3.0.1(webpack@5.93.0)':
dependencies:
'@mdx-js/mdx': 3.0.1
source-map: 0.7.4
webpack: 5.93.0
transitivePeerDependencies:
- supports-color
'@mdx-js/mdx@3.0.1': '@mdx-js/mdx@3.0.1':
dependencies: dependencies:
'@types/estree': 1.0.5 '@types/estree': 1.0.5
@ -6005,13 +5875,6 @@ snapshots:
dependencies: dependencies:
glob: 10.3.10 glob: 10.3.10
'@next/mdx@14.2.5(@mdx-js/loader@3.0.1(webpack@5.93.0))(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))':
dependencies:
source-map: 0.7.4
optionalDependencies:
'@mdx-js/loader': 3.0.1(webpack@5.93.0)
'@mdx-js/react': 3.0.1(@types/react@18.3.3)(react@18.3.1)
'@next/swc-darwin-arm64@14.2.5': '@next/swc-darwin-arm64@14.2.5':
optional: true optional: true
@ -6743,15 +6606,11 @@ snapshots:
dependencies: dependencies:
'@types/ms': 0.7.34 '@types/ms': 0.7.34
'@types/eslint-scope@3.7.7':
dependencies:
'@types/eslint': 9.6.0
'@types/estree': 1.0.5
'@types/eslint@9.6.0': '@types/eslint@9.6.0':
dependencies: dependencies:
'@types/estree': 1.0.5 '@types/estree': 1.0.5
'@types/json-schema': 7.0.15 '@types/json-schema': 7.0.15
optional: true
'@types/estree-jsx@1.0.5': '@types/estree-jsx@1.0.5':
dependencies: dependencies:
@ -6773,7 +6632,8 @@ snapshots:
dependencies: dependencies:
'@types/istanbul-lib-report': 3.0.3 '@types/istanbul-lib-report': 3.0.3
'@types/json-schema@7.0.15': {} '@types/json-schema@7.0.15':
optional: true
'@types/json5@0.0.29': {} '@types/json5@0.0.29': {}
@ -6946,86 +6806,6 @@ snapshots:
'@ungap/structured-clone@1.2.0': {} '@ungap/structured-clone@1.2.0': {}
'@webassemblyjs/ast@1.12.1':
dependencies:
'@webassemblyjs/helper-numbers': 1.11.6
'@webassemblyjs/helper-wasm-bytecode': 1.11.6
'@webassemblyjs/floating-point-hex-parser@1.11.6': {}
'@webassemblyjs/helper-api-error@1.11.6': {}
'@webassemblyjs/helper-buffer@1.12.1': {}
'@webassemblyjs/helper-numbers@1.11.6':
dependencies:
'@webassemblyjs/floating-point-hex-parser': 1.11.6
'@webassemblyjs/helper-api-error': 1.11.6
'@xtuc/long': 4.2.2
'@webassemblyjs/helper-wasm-bytecode@1.11.6': {}
'@webassemblyjs/helper-wasm-section@1.12.1':
dependencies:
'@webassemblyjs/ast': 1.12.1
'@webassemblyjs/helper-buffer': 1.12.1
'@webassemblyjs/helper-wasm-bytecode': 1.11.6
'@webassemblyjs/wasm-gen': 1.12.1
'@webassemblyjs/ieee754@1.11.6':
dependencies:
'@xtuc/ieee754': 1.2.0
'@webassemblyjs/leb128@1.11.6':
dependencies:
'@xtuc/long': 4.2.2
'@webassemblyjs/utf8@1.11.6': {}
'@webassemblyjs/wasm-edit@1.12.1':
dependencies:
'@webassemblyjs/ast': 1.12.1
'@webassemblyjs/helper-buffer': 1.12.1
'@webassemblyjs/helper-wasm-bytecode': 1.11.6
'@webassemblyjs/helper-wasm-section': 1.12.1
'@webassemblyjs/wasm-gen': 1.12.1
'@webassemblyjs/wasm-opt': 1.12.1
'@webassemblyjs/wasm-parser': 1.12.1
'@webassemblyjs/wast-printer': 1.12.1
'@webassemblyjs/wasm-gen@1.12.1':
dependencies:
'@webassemblyjs/ast': 1.12.1
'@webassemblyjs/helper-wasm-bytecode': 1.11.6
'@webassemblyjs/ieee754': 1.11.6
'@webassemblyjs/leb128': 1.11.6
'@webassemblyjs/utf8': 1.11.6
'@webassemblyjs/wasm-opt@1.12.1':
dependencies:
'@webassemblyjs/ast': 1.12.1
'@webassemblyjs/helper-buffer': 1.12.1
'@webassemblyjs/wasm-gen': 1.12.1
'@webassemblyjs/wasm-parser': 1.12.1
'@webassemblyjs/wasm-parser@1.12.1':
dependencies:
'@webassemblyjs/ast': 1.12.1
'@webassemblyjs/helper-api-error': 1.11.6
'@webassemblyjs/helper-wasm-bytecode': 1.11.6
'@webassemblyjs/ieee754': 1.11.6
'@webassemblyjs/leb128': 1.11.6
'@webassemblyjs/utf8': 1.11.6
'@webassemblyjs/wast-printer@1.12.1':
dependencies:
'@webassemblyjs/ast': 1.12.1
'@xtuc/long': 4.2.2
'@xtuc/ieee754@1.2.0': {}
'@xtuc/long@4.2.2': {}
abort-controller@3.0.0: abort-controller@3.0.0:
dependencies: dependencies:
event-target-shim: 5.0.1 event-target-shim: 5.0.1
@ -7035,20 +6815,12 @@ snapshots:
mime-types: 2.1.35 mime-types: 2.1.35
negotiator: 0.6.3 negotiator: 0.6.3
acorn-import-attributes@1.9.5(acorn@8.12.1):
dependencies:
acorn: 8.12.1
acorn-jsx@5.3.2(acorn@8.12.1): acorn-jsx@5.3.2(acorn@8.12.1):
dependencies: dependencies:
acorn: 8.12.1 acorn: 8.12.1
acorn@8.12.1: {} acorn@8.12.1: {}
ajv-keywords@3.5.2(ajv@6.12.6):
dependencies:
ajv: 6.12.6
ajv@6.12.6: ajv@6.12.6:
dependencies: dependencies:
fast-deep-equal: 3.1.3 fast-deep-equal: 3.1.3
@ -7369,8 +7141,6 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
chrome-trace-event@1.0.4: {}
ci-info@2.0.0: {} ci-info@2.0.0: {}
ci-info@3.9.0: {} ci-info@3.9.0: {}
@ -7720,8 +7490,6 @@ snapshots:
iterator.prototype: 1.1.2 iterator.prototype: 1.1.2
safe-array-concat: 1.1.2 safe-array-concat: 1.1.2
es-module-lexer@1.5.4: {}
es-object-atoms@1.0.0: es-object-atoms@1.0.0:
dependencies: dependencies:
es-errors: 1.3.0 es-errors: 1.3.0
@ -8002,11 +7770,6 @@ snapshots:
eslint-rule-documentation@1.0.23: {} eslint-rule-documentation@1.0.23: {}
eslint-scope@5.1.1:
dependencies:
esrecurse: 4.3.0
estraverse: 4.3.0
eslint-scope@7.2.2: eslint-scope@7.2.2:
dependencies: dependencies:
esrecurse: 4.3.0 esrecurse: 4.3.0
@ -8075,8 +7838,6 @@ snapshots:
dependencies: dependencies:
estraverse: 5.3.0 estraverse: 5.3.0
estraverse@4.3.0: {}
estraverse@5.3.0: {} estraverse@5.3.0: {}
estree-util-attach-comments@3.0.0: estree-util-attach-comments@3.0.0:
@ -8113,8 +7874,6 @@ snapshots:
event-target-shim@5.0.1: {} event-target-shim@5.0.1: {}
events@3.3.0: {}
execa@5.1.1: execa@5.1.1:
dependencies: dependencies:
cross-spawn: 7.0.3 cross-spawn: 7.0.3
@ -8127,6 +7886,10 @@ snapshots:
signal-exit: 3.0.7 signal-exit: 3.0.7
strip-final-newline: 2.0.0 strip-final-newline: 2.0.0
extend-shallow@2.0.1:
dependencies:
is-extendable: 0.1.1
extend@3.0.2: {} extend@3.0.2: {}
fast-deep-equal@3.1.3: {} fast-deep-equal@3.1.3: {}
@ -8276,8 +8039,6 @@ snapshots:
dependencies: dependencies:
is-glob: 4.0.3 is-glob: 4.0.3
glob-to-regexp@0.4.1: {}
glob@10.3.10: glob@10.3.10:
dependencies: dependencies:
foreground-child: 3.2.1 foreground-child: 3.2.1
@ -8332,6 +8093,13 @@ snapshots:
graphemer@1.4.0: {} graphemer@1.4.0: {}
gray-matter@4.0.3:
dependencies:
js-yaml: 3.14.1
kind-of: 6.0.3
section-matter: 1.0.0
strip-bom-string: 1.0.0
has-bigints@1.0.2: {} has-bigints@1.0.2: {}
has-flag@3.0.0: {} has-flag@3.0.0: {}
@ -8524,6 +8292,8 @@ snapshots:
is-docker@2.2.1: {} is-docker@2.2.1: {}
is-extendable@0.1.1: {}
is-extglob@2.1.1: {} is-extglob@2.1.1: {}
is-finalizationregistry@1.0.2: is-finalizationregistry@1.0.2:
@ -8692,12 +8462,6 @@ snapshots:
leven: 3.1.0 leven: 3.1.0
pretty-format: 29.7.0 pretty-format: 29.7.0
jest-worker@27.5.1:
dependencies:
'@types/node': 20.14.11
merge-stream: 2.0.0
supports-color: 8.1.1
jest-worker@29.7.0: jest-worker@29.7.0:
dependencies: dependencies:
'@types/node': 20.14.11 '@types/node': 20.14.11
@ -8763,8 +8527,6 @@ snapshots:
json-parse-better-errors@1.0.2: {} json-parse-better-errors@1.0.2: {}
json-parse-even-better-errors@2.3.1: {}
json-schema-traverse@0.4.1: {} json-schema-traverse@0.4.1: {}
json-stable-stringify-without-jsonify@1.0.1: {} json-stable-stringify-without-jsonify@1.0.1: {}
@ -8822,8 +8584,6 @@ snapshots:
lines-and-columns@1.2.4: {} lines-and-columns@1.2.4: {}
loader-runner@4.3.0: {}
locate-path@3.0.0: locate-path@3.0.0:
dependencies: dependencies:
p-locate: 3.0.0 p-locate: 3.0.0
@ -9432,6 +9192,19 @@ snapshots:
neo-async@2.6.2: {} neo-async@2.6.2: {}
next-mdx-remote@5.0.0(@types/react@18.3.3)(react@18.3.1):
dependencies:
'@babel/code-frame': 7.24.7
'@mdx-js/mdx': 3.0.1
'@mdx-js/react': 3.0.1(@types/react@18.3.3)(react@18.3.1)
react: 18.3.1
unist-util-remove: 3.1.1
vfile: 6.0.2
vfile-matter: 5.0.0
transitivePeerDependencies:
- '@types/react'
- supports-color
next-themes@0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): next-themes@0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies: dependencies:
react: 18.3.1 react: 18.3.1
@ -9763,10 +9536,6 @@ snapshots:
dependencies: dependencies:
inherits: 2.0.4 inherits: 2.0.4
randombytes@2.1.0:
dependencies:
safe-buffer: 5.2.1
range-parser@1.2.1: {} range-parser@1.2.1: {}
react-devtools-core@5.3.1: react-devtools-core@5.3.1:
@ -10119,11 +9888,10 @@ snapshots:
dependencies: dependencies:
loose-envify: 1.4.0 loose-envify: 1.4.0
schema-utils@3.3.0: section-matter@1.0.0:
dependencies: dependencies:
'@types/json-schema': 7.0.15 extend-shallow: 2.0.1
ajv: 6.12.6 kind-of: 6.0.3
ajv-keywords: 3.5.2(ajv@6.12.6)
selfsigned@2.4.1: selfsigned@2.4.1:
dependencies: dependencies:
@ -10156,10 +9924,6 @@ snapshots:
serialize-error@2.1.0: {} serialize-error@2.1.0: {}
serialize-javascript@6.0.2:
dependencies:
randombytes: 2.1.0
serve-static@1.15.0: serve-static@1.15.0:
dependencies: dependencies:
encodeurl: 1.0.2 encodeurl: 1.0.2
@ -10342,6 +10106,8 @@ snapshots:
dependencies: dependencies:
ansi-regex: 6.0.1 ansi-regex: 6.0.1
strip-bom-string@1.0.0: {}
strip-bom@3.0.0: {} strip-bom@3.0.0: {}
strip-final-newline@2.0.0: {} strip-final-newline@2.0.0: {}
@ -10459,15 +10225,6 @@ snapshots:
dependencies: dependencies:
rimraf: 2.6.3 rimraf: 2.6.3
terser-webpack-plugin@5.3.10(webpack@5.93.0):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
jest-worker: 27.5.1
schema-utils: 3.3.0
serialize-javascript: 6.0.2
terser: 5.31.3
webpack: 5.93.0
terser@5.31.3: terser@5.31.3:
dependencies: dependencies:
'@jridgewell/source-map': 0.3.6 '@jridgewell/source-map': 0.3.6
@ -10599,6 +10356,10 @@ snapshots:
trough: 2.2.0 trough: 2.2.0
vfile: 6.0.2 vfile: 6.0.2
unist-util-is@5.2.1:
dependencies:
'@types/unist': 2.0.10
unist-util-is@6.0.0: unist-util-is@6.0.0:
dependencies: dependencies:
'@types/unist': 3.0.2 '@types/unist': 3.0.2
@ -10616,10 +10377,21 @@ snapshots:
'@types/unist': 3.0.2 '@types/unist': 3.0.2
unist-util-visit: 5.0.0 unist-util-visit: 5.0.0
unist-util-remove@3.1.1:
dependencies:
'@types/unist': 2.0.10
unist-util-is: 5.2.1
unist-util-visit-parents: 5.1.3
unist-util-stringify-position@4.0.0: unist-util-stringify-position@4.0.0:
dependencies: dependencies:
'@types/unist': 3.0.2 '@types/unist': 3.0.2
unist-util-visit-parents@5.1.3:
dependencies:
'@types/unist': 2.0.10
unist-util-is: 5.2.1
unist-util-visit-parents@6.0.1: unist-util-visit-parents@6.0.1:
dependencies: dependencies:
'@types/unist': 3.0.2 '@types/unist': 3.0.2
@ -10666,6 +10438,11 @@ snapshots:
vary@1.1.2: {} vary@1.1.2: {}
vfile-matter@5.0.0:
dependencies:
vfile: 6.0.2
yaml: 2.4.5
vfile-message@4.0.2: vfile-message@4.0.2:
dependencies: dependencies:
'@types/unist': 3.0.2 '@types/unist': 3.0.2
@ -10683,50 +10460,12 @@ snapshots:
dependencies: dependencies:
makeerror: 1.0.12 makeerror: 1.0.12
watchpack@2.4.1:
dependencies:
glob-to-regexp: 0.4.1
graceful-fs: 4.2.11
wcwidth@1.0.1: wcwidth@1.0.1:
dependencies: dependencies:
defaults: 1.0.4 defaults: 1.0.4
webidl-conversions@3.0.1: {} webidl-conversions@3.0.1: {}
webpack-sources@3.2.3: {}
webpack@5.93.0:
dependencies:
'@types/eslint-scope': 3.7.7
'@types/estree': 1.0.5
'@webassemblyjs/ast': 1.12.1
'@webassemblyjs/wasm-edit': 1.12.1
'@webassemblyjs/wasm-parser': 1.12.1
acorn: 8.12.1
acorn-import-attributes: 1.9.5(acorn@8.12.1)
browserslist: 4.23.2
chrome-trace-event: 1.0.4
enhanced-resolve: 5.17.0
es-module-lexer: 1.5.4
eslint-scope: 5.1.1
events: 3.3.0
glob-to-regexp: 0.4.1
graceful-fs: 4.2.11
json-parse-even-better-errors: 2.3.1
loader-runner: 4.3.0
mime-types: 2.1.35
neo-async: 2.6.2
schema-utils: 3.3.0
tapable: 2.2.1
terser-webpack-plugin: 5.3.10(webpack@5.93.0)
watchpack: 2.4.1
webpack-sources: 3.2.3
transitivePeerDependencies:
- '@swc/core'
- esbuild
- uglify-js
whatwg-fetch@3.6.20: {} whatwg-fetch@3.6.20: {}
whatwg-url@5.0.0: whatwg-url@5.0.0:

View File

@ -0,0 +1,20 @@
import { ReactNode } from 'react'
import DefaultLayout from '@/components/layouts/default-layout'
export interface PostLayoutProps {
children: ReactNode
params: {
slug: string
}
}
export default function PostLayout({ children }: PostLayoutProps) {
return (
<DefaultLayout>
<main>
<article className="flex flex-col gap-4 text-xs md:text-base my-6">{children}</article>
</main>
</DefaultLayout>
)
}

View File

@ -0,0 +1,126 @@
import fs from 'node:fs'
import path from 'node:path'
import matter from 'gray-matter'
import { MDXRemote } from 'next-mdx-remote/rsc'
import { Metadata } from 'next'
import { notFound } from 'next/navigation'
import { components } from '@/components/mdx-components'
const BLOG_PATH = path.join('src', 'contents', 'posts')
export interface Props {
params: {
slug: string
}
}
type FrontMatterMetadata = {
siteTitle: string
postTitle: string
siteDescription: string
postDescription: string
publishedOn: string
updatedOn: string
isPublished: boolean
tags: string[]
}
export interface PostMetadata {
slug: string
frontMatter: FrontMatterMetadata
content: string
}
/**
* Get the post from file system, matching the provided slug from the route params.
*/
function getPost(slug: string): PostMetadata {
try {
const markdownFile = fs.readFileSync(path.join(BLOG_PATH, slug + '.mdx'), 'utf-8')
const { data: frontMatter, content } = matter(markdownFile)
if (!frontMatter.isPublished) {
throw new Error('Post is currently not published yet!')
}
return {
frontMatter: frontMatter as FrontMatterMetadata,
slug,
content,
}
} catch {
/*
* Catch any possible error (could be no slug exists, post has not been published,
* or something wrong with the fs) above and just render not found.
*/
notFound()
}
}
/**
* Statically generate routes at build time.
*
* See: <https://nextjs.org/docs/app/api-reference/functions/generate-static-params>
*/
export async function generateStaticParams(): Promise<string[]> {
const files = fs.readdirSync(BLOG_PATH)
const slugPaths = files.map((filename) => filename.replace('.mdx', ''))
return slugPaths
}
export async function generateMetadata({ params }: Props): Promise<Metadata> {
const { slug } = params
const post = getPost(slug)
return {
title: post.frontMatter.siteTitle,
description: post.frontMatter.siteDescription,
}
}
export default function Post({ params }: Props) {
const { slug } = params
const post = getPost(slug)
return (
<main className="flex flex-col gap-4 my-8">
<div id="post-detail" className="flex flex-col gap-2 mb-2">
<h1 id="post-title" className="text-3xl md:text-4xl font-bold">
{post.frontMatter.postTitle}
</h1>
<span id="post-description" className="text-base md:text-lg">
{post.frontMatter.postDescription}
</span>
<div id="post-tags" className="flex gap-2 mb-4">
{post.frontMatter.tags.map((tag: string, index: number) => {
return (
<span key={index} className="px-2 py-1 rounded-lg bg-primary/30 text-xs">
#{tag}
</span>
)
})}
</div>
<div id="post-publication-date" className="flex gap-2 font-bold text-xs">
<span>PUBLISHED ON: {post.frontMatter.publishedOn}</span>
{post.frontMatter.updatedOn !== post.frontMatter.publishedOn ? (
<>
<span>|</span>
<span>UPDATED ON: {post.frontMatter.updatedOn}</span>
</>
) : null}
</div>
</div>
<hr />
<article id="post-content" className="flex flex-col gap-4">
<MDXRemote source={post.content} components={components} />
</article>
</main>
)
}

View File

@ -1,6 +1,6 @@
import { Metadata } from 'next' import { Metadata } from 'next'
import DefaultLayout from '@/components/layouts/DefaultLayout' import DefaultLayout from '@/components/layouts/default-layout'
import UnderConstruction from '@/components/blocks/error/under-construction' import UnderConstruction from '@/components/blocks/error/under-construction'
export const metadata: Metadata = { export const metadata: Metadata = {

View File

@ -1,6 +1,7 @@
import '@/styles/globals.css' import '@/styles/globals.css'
import type { Metadata, Viewport } from 'next' import type { Metadata, Viewport } from 'next'
import { ReactNode } from 'react'
import { siteConfig } from '@/config/site' import { siteConfig } from '@/config/site'
@ -10,7 +11,7 @@ import { TooltipProvider } from '@/components/ui/tooltip'
export const metadata: Metadata = { export const metadata: Metadata = {
title: { title: {
default: siteConfig.name, default: siteConfig.name,
template: `${siteConfig.name} | %s`, template: `%s | ${siteConfig.name}`,
}, },
metadataBase: new URL(siteConfig.url), metadataBase: new URL(siteConfig.url),
description: siteConfig.description, description: siteConfig.description,
@ -31,8 +32,8 @@ export const viewport: Viewport = {
], ],
} }
interface RootLayoutProps { export interface RootLayoutProps {
children: React.ReactNode children: ReactNode
} }
export default function RootLayout({ children }: RootLayoutProps) { export default function RootLayout({ children }: RootLayoutProps) {

View File

@ -1,7 +0,0 @@
import type { MDXComponents } from 'mdx/types'
export function useMDXComponents(components: MDXComponents): MDXComponents {
return {
...components,
}
}

View File

@ -1,6 +1,6 @@
import { Metadata } from 'next' import { Metadata } from 'next'
import DefaultLayout from '@/components/layouts/DefaultLayout' import DefaultLayout from '@/components/layouts/default-layout'
import PageNotFound from '@/components/blocks/error/page-not-found' import PageNotFound from '@/components/blocks/error/page-not-found'
export const metadata: Metadata = { export const metadata: Metadata = {

View File

@ -1,4 +1,4 @@
import DefaultLayout from '@/components/layouts/DefaultLayout' import DefaultLayout from '@/components/layouts/default-layout'
import IntroductionSection from '@/components/blocks/home/introduction-section' import IntroductionSection from '@/components/blocks/home/introduction-section'
import AboutSection from '@/components/blocks/home/about-section' import AboutSection from '@/components/blocks/home/about-section'
import ContactSection from '@/components/blocks/home/contact-section' import ContactSection from '@/components/blocks/home/contact-section'

View File

@ -1,6 +1,6 @@
import { Metadata } from 'next' import { Metadata } from 'next'
import DefaultLayout from '@/components/layouts/DefaultLayout' import DefaultLayout from '@/components/layouts/default-layout'
import UnderConstruction from '@/components/blocks/error/under-construction' import UnderConstruction from '@/components/blocks/error/under-construction'
export const metadata: Metadata = { export const metadata: Metadata = {

View File

@ -6,7 +6,7 @@ import { Button } from '@/components/ui/button'
export default function PageNotFound() { export default function PageNotFound() {
return ( return (
<div className="flex font-mono gap-4 flex-col items-center tracking-wider"> <div className="flex font-mono gap-4 flex-col items-center tracking-wide">
<span className="text-7xl md:text-9xl">404</span> <span className="text-7xl md:text-9xl">404</span>
<i className="text-xl md:text-2xl">Not Found</i> <i className="text-xl md:text-2xl">Not Found</i>
<p className="text-center">You are trying to access a page that doesn't exists.</p> <p className="text-center">You are trying to access a page that doesn't exists.</p>

View File

@ -6,7 +6,7 @@ import { Button } from '@/components/ui/button'
export default function UnderConstruction() { export default function UnderConstruction() {
return ( return (
<div className="flex font-mono gap-4 flex-col items-center tracking-wider"> <div className="flex font-mono gap-4 flex-col items-center tracking-wide">
<span className="text-7xl md:text-9xl">501</span> <span className="text-7xl md:text-9xl">501</span>
<i className="text-xl md:text-2xl">Not Implemented</i> <i className="text-xl md:text-2xl">Not Implemented</i>
<p className="text-center">Sorry! The page is currently under construction.</p> <p className="text-center">Sorry! The page is currently under construction.</p>

View File

@ -1,12 +1,9 @@
'use client'
import Anchor from '@/components/anchor' import Anchor from '@/components/anchor'
import Package from '../../../../package.json' import Package from '../../../../package.json'
export default function Footer() { export default function Footer() {
return ( return (
<footer className="flex flex-col gap-1 items-center mb-8 text-xs md:text-base"> <footer className="flex flex-col gap-1 items-center mb-8 text-xs md:text-base">
<p className="font-semibold text-center">Site Version: {Package.version}</p>
<p className="font-semibold text-center"> <p className="font-semibold text-center">
Created with by{' '} Created with by{' '}
<Anchor href={Package.author.url} isExternal> <Anchor href={Package.author.url} isExternal>

View File

@ -48,7 +48,7 @@ export default function HeaderNavigation() {
return ( return (
<nav className="flex h-16 p-2 items-center"> <nav className="flex h-16 p-2 items-center">
<div className="flex-1"> <div className="flex-1">
<Link href={'/'} className="font-bold text-xl" onClick={smoothHeaderScroll}> <Link href="/" className="font-bold text-xl" onClick={smoothHeaderScroll}>
Refansa Refansa
</Link> </Link>
</div> </div>
@ -56,8 +56,8 @@ export default function HeaderNavigation() {
<Clock /> <Clock />
</div> </div>
<div id="Desktop" className="flex-1 hidden md:flex gap-4 items-center justify-end"> <div id="Desktop" className="flex-1 hidden md:flex gap-4 items-center justify-end">
<NavigationItem href="blog">Blog</NavigationItem> <NavigationItem href="/blog">Blog</NavigationItem>
<NavigationItem href="projects">Projects</NavigationItem> <NavigationItem href="/projects">Projects</NavigationItem>
<ThemeSwitch /> <ThemeSwitch />
</div> </div>
<div id="Mobile" className="flex-1 flex md:hidden justify-end"> <div id="Mobile" className="flex-1 flex md:hidden justify-end">
@ -78,8 +78,8 @@ export default function HeaderNavigation() {
</SheetClose> </SheetClose>
</SheetTitle> </SheetTitle>
<SheetDescription className="flex flex-col gap-2"> <SheetDescription className="flex flex-col gap-2">
<NavigationItem href="blog">Blog</NavigationItem> <NavigationItem href="/blog">Blog</NavigationItem>
<NavigationItem href="projects">Projects</NavigationItem> <NavigationItem href="/projects">Projects</NavigationItem>
</SheetDescription> </SheetDescription>
</SheetHeader> </SheetHeader>
</SheetContent> </SheetContent>

View File

@ -4,7 +4,7 @@ import { Heading } from '@/components/ui/heading'
export default function AboutSection() { export default function AboutSection() {
return ( return (
<section className="flex flex-col gap-4 tracking-wider leading-relaxed text-xs md:text-base"> <section className="flex flex-col gap-4 tracking-wide leading-relaxed text-xs md:text-base">
<Heading level={3}>A bit about me</Heading> <Heading level={3}>A bit about me</Heading>
<p> <p>
I'm a Software Developer from Jakarta, Indonesia 🇮🇩,{' '} I'm a Software Developer from Jakarta, Indonesia 🇮🇩,{' '}

View File

@ -5,7 +5,7 @@ import Anchor from '@/components/anchor'
export default function ContactSection() { export default function ContactSection() {
return ( return (
<section className="flex flex-col gap-4 text-xs md:text-base tracking-wider leading-relaxed"> <section className="flex flex-col gap-4 text-xs md:text-base tracking-wide leading-relaxed">
<Heading level={3}>Contact</Heading> <Heading level={3}>Contact</Heading>
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<span> <span>

View File

@ -5,6 +5,7 @@ import { Mail } from 'lucide-react'
import { siteConfig } from '@/config/site' import { siteConfig } from '@/config/site'
import { Button } from '@/components/ui/button' import { Button } from '@/components/ui/button'
import TermWord from '@/components/term-word'
export default function IntroductionSection() { export default function IntroductionSection() {
return ( return (
@ -21,7 +22,11 @@ export default function IntroductionSection() {
</span> </span>
<div className="mt-4 flex flex-col"> <div className="mt-4 flex flex-col">
<span className="text-lg md:text-2xl font-bold"> <span className="text-lg md:text-2xl font-bold">
A Passionate, <i>self-taught</i> Software Developer A Passionate,{' '}
<TermWord description="College is too expensive nowadays.">
<i>self-taught</i>
</TermWord>{' '}
Software Developer
</span> </span>
<span className="text-lg md:text-2xl font-bold text-foreground/50"> <span className="text-lg md:text-2xl font-bold text-foreground/50">
And a Patron of Open Source Software. And a Patron of Open Source Software.

View File

@ -0,0 +1,46 @@
import { MDXComponents } from 'mdx/types'
import Anchor from '@/components/anchor'
import TermWord from '@/components/term-word'
import { Heading } from '@/components/ui/heading'
export const components: MDXComponents = {
Anchor,
TermWord,
Heading,
p(props) {
return <p className="tracking-wide leading-relaxed">{props.children}</p>
},
h1(props) {
return <Heading level={1}>{props.children as string}</Heading>
},
h2(props) {
return <Heading level={2}>{props.children as string}</Heading>
},
h3(props) {
return <Heading level={3}>{props.children as string}</Heading>
},
h4(props) {
return <Heading level={4}>{props.children as string}</Heading>
},
h5(props) {
return <Heading level={5}>{props.children as string}</Heading>
},
h6(props) {
return <Heading level={6}>{props.children as string}</Heading>
},
code(props) {
return (
<code className="bg-gray-500/20 text-foreground/50 p-1 tracking-normal">
{props.children}
</code>
)
},
blockquote(props) {
return (
<blockquote className="bg-gray-500/20 my-3 px-4 py-6 border-l-8 border-gray-500/50">
{props.children}
</blockquote>
)
},
}

View File

@ -1,8 +1,8 @@
import { ReactNode } from 'react' import { HTMLAttributes, ReactNode } from 'react'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip' import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
export interface Props { export interface Props extends HTMLAttributes<HTMLSpanElement> {
children: ReactNode children: ReactNode
/** /**
* The description of the term word. * The description of the term word.
@ -10,14 +10,16 @@ export interface Props {
description: string description: string
} }
export default function TermWord({ children, description }: Props) { export default function TermWord({ children, description, ...rest }: Props) {
return ( return (
<Tooltip> <Tooltip>
<TooltipTrigger> <TooltipTrigger>
<span className="underline decoration-dashed underline-offset-2">{children}</span> <span className="underline decoration-dashed underline-offset-2" {...rest}>
{children}
</span>
</TooltipTrigger> </TooltipTrigger>
<TooltipContent> <TooltipContent>
<span className="not-italic">{description}</span> <span className="not-italic font-normal">{description}</span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
) )

View File

@ -0,0 +1,20 @@
---
siteTitle: 'What the heck is going on with web development?'
postTitle: 'The Weird State of Web Development'
siteDescription: 'Javascript, the mother of all frameworks.'
postDescription: 'A never ending solution to a never ending problem...'
publishedOn: '03 August, 2024'
updatedOn: '04 August, 2024'
isPublished: true
tags: ['web-development', 'personal-thought']
---
I still remember the first time I tried to dip my toe into the world of programming. On that time, I still can't wrap my head around some of the general-purpose language
like C, C++, Java or the likes (*Yes, I'm just that stupid at the time*) actually works, this was in my early days when I start learning how to code in junior high school.
Everytime I tried C, I keep shooting my foot with **`segmentation fault`** errors, so I say to myself,
> You know what? Let me just learn how to create a website, it look simple enough. It won't be too hard isn't it? (*But boy do I was wrong...*)
I start off with just HTML, CSS, and a little bit of javascript, it was just a simple personal website. But then I start comparing my work with others.
I keep mumbling to myself, how do I do this? How do I do that? It was more complicated than I imagined. I thought browser just support HTML, CSS, and JS, so I did my research. But to my surprise,
<TermWord description="There are other things that are supported by browsers, but I'm talking about the main general support of browser DOM rendering.">**THEY DO JUST THAT**<span className="dark:text-red-400 text-red-600">*</span></TermWord>.

View File

@ -4,15 +4,15 @@
@layer base { @layer base {
:root { :root {
--background: 0 0% 100%; --background: 0 0% 90%;
--foreground: 240 10% 3.9%; --foreground: 240 10% 3.9%;
--card: 0 0% 100%; --card: 0 0% 100%;
--card-foreground: 240 10% 3.9%; --card-foreground: 240 10% 3.9%;
--popover: 0 0% 100%; --popover: 0 0% 95%;
--popover-foreground: 240 10% 3.9%; --popover-foreground: 240 10% 3.9%;
--primary: 33 44% 22%; --primary: 33 44% 42%;
--primary-foreground: 355.7 100% 97.3%; --primary-foreground: 355.7 100% 97.3%;
--secondary: 240 4.8% 95.9%; --secondary: 240 4.8% 80.9%;
--secondary-foreground: 240 5.9% 10%; --secondary-foreground: 240 5.9% 10%;
--muted: 240 4.8% 95.9%; --muted: 240 4.8% 95.9%;
--muted-foreground: 240 3.8% 46.1%; --muted-foreground: 240 3.8% 46.1%;
@ -65,11 +65,13 @@
} }
html { html {
@apply scroll-smooth; @apply scroll-smooth;
scrollbar-color: hsl(var(--primary)) hsl(var(--secondary));
scrollbar-width: thin;
} }
body { body {
@apply bg-background text-foreground; @apply bg-background text-foreground/90;
} }
*::selection { *::selection {
@apply bg-primary/20; @apply bg-primary/30;
} }
} }

View File

@ -4,10 +4,10 @@ import TailwindCSSAnimate from 'tailwindcss-animate'
const config = { const config = {
darkMode: ['class'], darkMode: ['class'],
content: [ content: [
'./pages/**/*.{ts,tsx}', './pages/**/*.{ts,tsx,mdx}',
'./components/**/*.{ts,tsx}', './components/**/*.{ts,tsx,mdx}',
'./app/**/*.{ts,tsx}', './app/**/*.{ts,tsx,mdx}',
'./src/**/*.{ts,tsx}', './src/**/*.{ts,tsx,mdx}',
], ],
prefix: '', prefix: '',
theme: { theme: {