back at it

This commit is contained in:
2025-08-16 13:57:37 -07:00
parent 6711de5eb6
commit 60a9fb0339
10 changed files with 366 additions and 141 deletions

View File

@@ -1,6 +1,6 @@
PROJECT_NAME := "timmypidashev.dev" PROJECT_NAME := "timmypidashev.dev"
PROJECT_AUTHORS := "Timothy Pidashev (timmypidashev) <pidashev.tim@gmail.com>" PROJECT_AUTHORS := "Timothy Pidashev (timmypidashev) <pidashev.tim@gmail.com>"
PROJECT_VERSION := "v1.0.2" PROJECT_VERSION := "v2.1.1"
PROJECT_LICENSE := "MIT" PROJECT_LICENSE := "MIT"
PROJECT_SOURCES := "https://github.com/timmypidashev/web" PROJECT_SOURCES := "https://github.com/timmypidashev/web"
PROJECT_REGISTRY := "ghcr.io/timmypidashev" PROJECT_REGISTRY := "ghcr.io/timmypidashev"

View File

@@ -8,19 +8,19 @@
"preview": "astro preview" "preview": "astro preview"
}, },
"devDependencies": { "devDependencies": {
"@astrojs/react": "^4.2.4", "@astrojs/react": "^4.3.0",
"@astrojs/tailwind": "^6.0.2", "@astrojs/tailwind": "^6.0.2",
"@tailwindcss/typography": "^0.5.16", "@tailwindcss/typography": "^0.5.16",
"@types/react": "^18.3.20", "@types/react": "^18.3.20",
"@types/react-dom": "^18.3.6", "@types/react-dom": "^18.3.6",
"astro": "^5.7.4", "astro": "^5.13.2",
"tailwindcss": "^3.4.17" "tailwindcss": "^3.4.17"
}, },
"dependencies": { "dependencies": {
"@astrojs/mdx": "^4.2.4", "@astrojs/mdx": "^4.3.4",
"@astrojs/node": "^9.2.0", "@astrojs/node": "^9.4.2",
"@astrojs/rss": "^4.0.11", "@astrojs/rss": "^4.0.12",
"@astrojs/sitemap": "^3.3.0", "@astrojs/sitemap": "^3.5.0",
"@giscus/react": "^3.1.0", "@giscus/react": "^3.1.0",
"@pilcrowjs/object-parser": "^0.0.4", "@pilcrowjs/object-parser": "^0.0.4",
"@react-hook/intersection-observer": "^3.1.2", "@react-hook/intersection-observer": "^3.1.2",

220
src/pnpm-lock.yaml generated
View File

@@ -9,17 +9,17 @@ importers:
.: .:
dependencies: dependencies:
'@astrojs/mdx': '@astrojs/mdx':
specifier: ^4.2.4 specifier: ^4.3.4
version: 4.2.4(astro@5.7.4(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1)) version: 4.3.4(astro@5.13.2(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1))
'@astrojs/node': '@astrojs/node':
specifier: ^9.2.0 specifier: ^9.4.2
version: 9.2.0(astro@5.7.4(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1)) version: 9.4.2(astro@5.13.2(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1))
'@astrojs/rss': '@astrojs/rss':
specifier: ^4.0.11 specifier: ^4.0.12
version: 4.0.11 version: 4.0.12
'@astrojs/sitemap': '@astrojs/sitemap':
specifier: ^3.3.0 specifier: ^3.5.0
version: 3.3.0 version: 3.5.0
'@giscus/react': '@giscus/react':
specifier: ^3.1.0 specifier: ^3.1.0
version: 3.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) version: 3.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -70,11 +70,11 @@ importers:
version: 5.0.0 version: 5.0.0
devDependencies: devDependencies:
'@astrojs/react': '@astrojs/react':
specifier: ^4.2.4 specifier: ^4.3.0
version: 4.2.4(@types/react-dom@18.3.6(@types/react@18.3.20))(@types/react@18.3.20)(jiti@1.21.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(yaml@2.7.1) version: 4.3.0(@types/react-dom@18.3.6(@types/react@18.3.20))(@types/react@18.3.20)(jiti@1.21.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(yaml@2.7.1)
'@astrojs/tailwind': '@astrojs/tailwind':
specifier: ^6.0.2 specifier: ^6.0.2
version: 6.0.2(astro@5.7.4(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1))(tailwindcss@3.4.17) version: 6.0.2(astro@5.13.2(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1))(tailwindcss@3.4.17)
'@tailwindcss/typography': '@tailwindcss/typography':
specifier: ^0.5.16 specifier: ^0.5.16
version: 0.5.16(tailwindcss@3.4.17) version: 0.5.16(tailwindcss@3.4.17)
@@ -85,8 +85,8 @@ importers:
specifier: ^18.3.6 specifier: ^18.3.6
version: 18.3.6(@types/react@18.3.20) version: 18.3.6(@types/react@18.3.20)
astro: astro:
specifier: ^5.7.4 specifier: ^5.13.2
version: 5.7.4(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1) version: 5.13.2(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1)
tailwindcss: tailwindcss:
specifier: ^3.4.17 specifier: ^3.4.17
version: 3.4.17 version: 3.4.17
@@ -101,44 +101,44 @@ packages:
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
'@astrojs/compiler@2.11.0': '@astrojs/compiler@2.12.2':
resolution: {integrity: sha512-zZOO7i+JhojO8qmlyR/URui6LyfHJY6m+L9nwyX5GiKD78YoRaZ5tzz6X0fkl+5bD3uwlDHayf6Oe8Fu36RKNg==} resolution: {integrity: sha512-w2zfvhjNCkNMmMMOn5b0J8+OmUaBL1o40ipMvqcG6NRpdC+lKxmTi48DT8Xw0SzJ3AfmeFLB45zXZXtmbsjcgw==}
'@astrojs/internal-helpers@0.6.1': '@astrojs/internal-helpers@0.7.2':
resolution: {integrity: sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A==} resolution: {integrity: sha512-KCkCqR3Goym79soqEtbtLzJfqhTWMyVaizUi35FLzgGSzBotSw8DB1qwsu7U96ihOJgYhDk2nVPz+3LnXPeX6g==}
'@astrojs/markdown-remark@6.3.1': '@astrojs/markdown-remark@6.3.6':
resolution: {integrity: sha512-c5F5gGrkczUaTVgmMW9g1YMJGzOtRvjjhw6IfGuxarM6ct09MpwysP10US729dy07gg8y+ofVifezvP3BNsWZg==} resolution: {integrity: sha512-bwylYktCTsLMVoCOEHbn2GSUA3c5KT/qilekBKA3CBng0bo1TYjNZPr761vxumRk9kJGqTOtU+fgCAp5Vwokug==}
'@astrojs/mdx@4.2.4': '@astrojs/mdx@4.3.4':
resolution: {integrity: sha512-c832AWpiMCcuPY8j+yr5T+hOf8n5RlKLFHlNTt15xxkOk3zjFJP81TIYKrMrbhD5rMzJ09Ixi+xM0m68w2Q0DQ==} resolution: {integrity: sha512-Ew3iP+6zuzzJWNEH5Qr1iknrue1heEfgmfuMpuwLaSwqlUiJQ0NDb2oxKosgWU1ROYmVf1H4KCmS6QdMWKyFjw==}
engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
peerDependencies: peerDependencies:
astro: ^5.0.0 astro: ^5.0.0
'@astrojs/node@9.2.0': '@astrojs/node@9.4.2':
resolution: {integrity: sha512-TUQPsMz8OtMsVc66rE7R2c2KsHgZ31sgdnazbn1bQp+9JMAYUvl9XzDPwBnrb9WkVWtEKLdyw+W8h9DzU+LQ9w==} resolution: {integrity: sha512-4whvXWUIL7yi84ayEXCZd/G2sLMqJKiA7hKps2Z3AVPlymXWY7qyafJ/5gphD6CzRjen6+mqPRYeqxnJG8VcDw==}
peerDependencies: peerDependencies:
astro: ^5.3.0 astro: ^5.3.0
'@astrojs/prism@3.2.0': '@astrojs/prism@3.3.0':
resolution: {integrity: sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw==} resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==}
engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
'@astrojs/react@4.2.4': '@astrojs/react@4.3.0':
resolution: {integrity: sha512-Qnj4dPsGZzUF0duQG+m6B7oFbGZpiRTl8TP6WvjeMr6BlI3dobj7wkKc/I9dQhUrWsswUafbPJuOJPGFUZtmKQ==} resolution: {integrity: sha512-N02aj52Iezn69qHyx5+XvPqgsPMEnel9mI5JMbGiRMTzzLMuNaxRVoQTaq2024Dpr7BLsxCjqMkNvelqMDhaHA==}
engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
peerDependencies: peerDependencies:
'@types/react': ^17.0.50 || ^18.0.21 || ^19.0.0 '@types/react': ^17.0.50 || ^18.0.21 || ^19.0.0
'@types/react-dom': ^17.0.17 || ^18.0.6 || ^19.0.0 '@types/react-dom': ^17.0.17 || ^18.0.6 || ^19.0.0
react: ^17.0.2 || ^18.0.0 || ^19.0.0 react: ^17.0.2 || ^18.0.0 || ^19.0.0
react-dom: ^17.0.2 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.2 || ^18.0.0 || ^19.0.0
'@astrojs/rss@4.0.11': '@astrojs/rss@4.0.12':
resolution: {integrity: sha512-3e3H8i6kc97KGnn9iaZBJpIkdoQi8MmR5zH5R+dWsfCM44lLTszOqy1OBfGGxDt56mpQkYVtZJWoxMyWuUZBfw==} resolution: {integrity: sha512-O5yyxHuDVb6DQ6VLOrbUVFSm+NpObulPxjs6XT9q3tC+RoKbN4HXMZLpv0LvXd1qdAjzVgJ1NFD+zKHJNDXikw==}
'@astrojs/sitemap@3.3.0': '@astrojs/sitemap@3.5.0':
resolution: {integrity: sha512-nYE4lKQtk+Kbrw/w0G0TTgT724co0jUsU4tPlHY9au5HmTBKbwiCLwO/15b1/y13aZ4Kr9ZbMeMHlXuwn0ty4Q==} resolution: {integrity: sha512-ldOvoBxuRgpcdndzksskOTzU55g76tkHC/POpejUbPGz6zR4rJKiXh8thX4WEPWDhCTZUafhJ1qf7k1muStHfg==}
'@astrojs/tailwind@6.0.2': '@astrojs/tailwind@6.0.2':
resolution: {integrity: sha512-j3mhLNeugZq6A8dMNXVarUa8K6X9AW+QHU9u3lKNrPLMHhOQ0S7VeWhHwEeJFpEK1BTKEUY1U78VQv2gN6hNGg==} resolution: {integrity: sha512-j3mhLNeugZq6A8dMNXVarUa8K6X9AW+QHU9u3lKNrPLMHhOQ0S7VeWhHwEeJFpEK1BTKEUY1U78VQv2gN6hNGg==}
@@ -146,9 +146,9 @@ packages:
astro: ^3.0.0 || ^4.0.0 || ^5.0.0 astro: ^3.0.0 || ^4.0.0 || ^5.0.0
tailwindcss: ^3.0.24 tailwindcss: ^3.0.24
'@astrojs/telemetry@3.2.0': '@astrojs/telemetry@3.3.0':
resolution: {integrity: sha512-wxhSKRfKugLwLlr4OFfcqovk+LIFtKwLyGPqMsv+9/ibqqnW3Gv7tBhtKEb0gAyUAC4G9BTVQeQahqnQAhd6IQ==} resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==}
engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
'@babel/code-frame@7.26.2': '@babel/code-frame@7.26.2':
resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
@@ -733,6 +733,9 @@ packages:
'@types/estree@1.0.7': '@types/estree@1.0.7':
resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
'@types/fontkit@2.0.8':
resolution: {integrity: sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==}
'@types/hast@3.0.4': '@types/hast@3.0.4':
resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
@@ -839,9 +842,9 @@ packages:
resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
hasBin: true hasBin: true
astro@5.7.4: astro@5.13.2:
resolution: {integrity: sha512-h+pndGOyoYbsBd0YvP7bL3gotUSlyltp8OLpcYg062w0n5c96wJ9xt/RmwwXzGbdcUjWFtw0c5z4zCA92NDmlA==} resolution: {integrity: sha512-yjcXY0Ua3EwjpVd3GoUXa65HQ6qgmURBptA+M9GzE0oYvgfuyM7bIbH8IR/TWIbdefVUJR5b7nZ0oVnMytmyfQ==}
engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'}
hasBin: true hasBin: true
autoprefixer@10.4.21: autoprefixer@10.4.21:
@@ -1161,8 +1164,8 @@ packages:
resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
engines: {node: '>=8.6.0'} engines: {node: '>=8.6.0'}
fast-xml-parser@4.5.3: fast-xml-parser@5.2.5:
resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==}
hasBin: true hasBin: true
fastq@1.19.1: fastq@1.19.1:
@@ -1184,6 +1187,9 @@ packages:
resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
fontace@0.3.0:
resolution: {integrity: sha512-czoqATrcnxgWb/nAkfyIrRp6Q8biYj7nGnL6zfhTcX+JKKpWHFBnb8uNMw/kZr7u++3Y3wYSYoZgHkCcsuBpBg==}
fontkit@2.0.4: fontkit@2.0.4:
resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==}
@@ -2066,8 +2072,8 @@ packages:
engines: {node: '>=14.0.0', npm: '>=6.0.0'} engines: {node: '>=14.0.0', npm: '>=6.0.0'}
hasBin: true hasBin: true
smol-toml@1.3.3: smol-toml@1.4.2:
resolution: {integrity: sha512-KMVLNWu490KlNfD0lbfDBUktJIEaZRBj1eeK0SMfdpO/rfyARIzlnPVI1Ge4l0vtSJmQUAiGKxMyLGrCT38iyA==} resolution: {integrity: sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
source-map-js@1.2.1: source-map-js@1.2.1:
@@ -2111,8 +2117,8 @@ packages:
resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
strnum@1.1.2: strnum@2.1.1:
resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==}
style-to-js@1.1.16: style-to-js@1.1.16:
resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==}
@@ -2217,8 +2223,8 @@ packages:
unified@11.0.5: unified@11.0.5:
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
unifont@0.2.0: unifont@0.5.0:
resolution: {integrity: sha512-RoF14/tOhLvDa7R5K6A3PjsfJVFKvadvRpWjfV1ttabUe9704P1ie9z1ABLWEts/8SxrBVePav/XhgeFNltpsw==} resolution: {integrity: sha512-4DueXMP5Hy4n607sh+vJ+rajoLu778aU3GzqeTCqsD/EaUcvqZT9wPC8kgK6Vjh22ZskrxyRCR71FwNOaYn6jA==}
unist-util-find-after@5.0.0: unist-util-find-after@5.0.0:
resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==}
@@ -2327,8 +2333,8 @@ packages:
vfile@6.0.3: vfile@6.0.3:
resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
vite@6.3.2: vite@6.3.5:
resolution: {integrity: sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==} resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@@ -2447,8 +2453,8 @@ packages:
typescript: ^4.9.4 || ^5.0.2 typescript: ^4.9.4 || ^5.0.2
zod: ^3 zod: ^3
zod@3.24.3: zod@3.25.76:
resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==} resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
zwitch@2.0.4: zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
@@ -2462,14 +2468,14 @@ snapshots:
'@jridgewell/gen-mapping': 0.3.8 '@jridgewell/gen-mapping': 0.3.8
'@jridgewell/trace-mapping': 0.3.25 '@jridgewell/trace-mapping': 0.3.25
'@astrojs/compiler@2.11.0': {} '@astrojs/compiler@2.12.2': {}
'@astrojs/internal-helpers@0.6.1': {} '@astrojs/internal-helpers@0.7.2': {}
'@astrojs/markdown-remark@6.3.1': '@astrojs/markdown-remark@6.3.6':
dependencies: dependencies:
'@astrojs/internal-helpers': 0.6.1 '@astrojs/internal-helpers': 0.7.2
'@astrojs/prism': 3.2.0 '@astrojs/prism': 3.3.0
github-slugger: 2.0.0 github-slugger: 2.0.0
hast-util-from-html: 2.0.3 hast-util-from-html: 2.0.3
hast-util-to-text: 4.0.2 hast-util-to-text: 4.0.2
@@ -2483,7 +2489,7 @@ snapshots:
remark-rehype: 11.1.2 remark-rehype: 11.1.2
remark-smartypants: 3.0.2 remark-smartypants: 3.0.2
shiki: 3.2.2 shiki: 3.2.2
smol-toml: 1.3.3 smol-toml: 1.4.2
unified: 11.0.5 unified: 11.0.5
unist-util-remove-position: 5.0.0 unist-util-remove-position: 5.0.0
unist-util-visit: 5.0.0 unist-util-visit: 5.0.0
@@ -2492,12 +2498,12 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@astrojs/mdx@4.2.4(astro@5.7.4(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1))': '@astrojs/mdx@4.3.4(astro@5.13.2(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1))':
dependencies: dependencies:
'@astrojs/markdown-remark': 6.3.1 '@astrojs/markdown-remark': 6.3.6
'@mdx-js/mdx': 3.1.0(acorn@8.14.1) '@mdx-js/mdx': 3.1.0(acorn@8.14.1)
acorn: 8.14.1 acorn: 8.14.1
astro: 5.7.4(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1) astro: 5.13.2(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1)
es-module-lexer: 1.6.0 es-module-lexer: 1.6.0
estree-util-visit: 2.0.0 estree-util-visit: 2.0.0
hast-util-to-html: 9.0.5 hast-util-to-html: 9.0.5
@@ -2511,28 +2517,28 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@astrojs/node@9.2.0(astro@5.7.4(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1))': '@astrojs/node@9.4.2(astro@5.13.2(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1))':
dependencies: dependencies:
'@astrojs/internal-helpers': 0.6.1 '@astrojs/internal-helpers': 0.7.2
astro: 5.7.4(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1) astro: 5.13.2(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1)
send: 1.2.0 send: 1.2.0
server-destroy: 1.0.1 server-destroy: 1.0.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@astrojs/prism@3.2.0': '@astrojs/prism@3.3.0':
dependencies: dependencies:
prismjs: 1.30.0 prismjs: 1.30.0
'@astrojs/react@4.2.4(@types/react-dom@18.3.6(@types/react@18.3.20))(@types/react@18.3.20)(jiti@1.21.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(yaml@2.7.1)': '@astrojs/react@4.3.0(@types/react-dom@18.3.6(@types/react@18.3.20))(@types/react@18.3.20)(jiti@1.21.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(yaml@2.7.1)':
dependencies: dependencies:
'@types/react': 18.3.20 '@types/react': 18.3.20
'@types/react-dom': 18.3.6(@types/react@18.3.20) '@types/react-dom': 18.3.6(@types/react@18.3.20)
'@vitejs/plugin-react': 4.4.1(vite@6.3.2(jiti@1.21.7)(yaml@2.7.1)) '@vitejs/plugin-react': 4.4.1(vite@6.3.5(jiti@1.21.7)(yaml@2.7.1))
react: 18.3.1 react: 18.3.1
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
ultrahtml: 1.6.0 ultrahtml: 1.6.0
vite: 6.3.2(jiti@1.21.7)(yaml@2.7.1) vite: 6.3.5(jiti@1.21.7)(yaml@2.7.1)
transitivePeerDependencies: transitivePeerDependencies:
- '@types/node' - '@types/node'
- jiti - jiti
@@ -2547,20 +2553,20 @@ snapshots:
- tsx - tsx
- yaml - yaml
'@astrojs/rss@4.0.11': '@astrojs/rss@4.0.12':
dependencies: dependencies:
fast-xml-parser: 4.5.3 fast-xml-parser: 5.2.5
kleur: 4.1.5 kleur: 4.1.5
'@astrojs/sitemap@3.3.0': '@astrojs/sitemap@3.5.0':
dependencies: dependencies:
sitemap: 8.0.0 sitemap: 8.0.0
stream-replace-string: 2.0.0 stream-replace-string: 2.0.0
zod: 3.24.3 zod: 3.25.76
'@astrojs/tailwind@6.0.2(astro@5.7.4(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1))(tailwindcss@3.4.17)': '@astrojs/tailwind@6.0.2(astro@5.13.2(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1))(tailwindcss@3.4.17)':
dependencies: dependencies:
astro: 5.7.4(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1) astro: 5.13.2(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1)
autoprefixer: 10.4.21(postcss@8.5.3) autoprefixer: 10.4.21(postcss@8.5.3)
postcss: 8.5.3 postcss: 8.5.3
postcss-load-config: 4.0.2(postcss@8.5.3) postcss-load-config: 4.0.2(postcss@8.5.3)
@@ -2568,7 +2574,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- ts-node - ts-node
'@astrojs/telemetry@3.2.0': '@astrojs/telemetry@3.3.0':
dependencies: dependencies:
ci-info: 4.2.0 ci-info: 4.2.0
debug: 4.4.0 debug: 4.4.0
@@ -3111,6 +3117,10 @@ snapshots:
'@types/estree@1.0.7': {} '@types/estree@1.0.7': {}
'@types/fontkit@2.0.8':
dependencies:
'@types/node': 17.0.45
'@types/hast@3.0.4': '@types/hast@3.0.4':
dependencies: dependencies:
'@types/unist': 3.0.3 '@types/unist': 3.0.3
@@ -3152,14 +3162,14 @@ snapshots:
'@ungap/structured-clone@1.3.0': {} '@ungap/structured-clone@1.3.0': {}
'@vitejs/plugin-react@4.4.1(vite@6.3.2(jiti@1.21.7)(yaml@2.7.1))': '@vitejs/plugin-react@4.4.1(vite@6.3.5(jiti@1.21.7)(yaml@2.7.1))':
dependencies: dependencies:
'@babel/core': 7.26.10 '@babel/core': 7.26.10
'@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10)
'@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10)
'@types/babel__core': 7.20.5 '@types/babel__core': 7.20.5
react-refresh: 0.17.0 react-refresh: 0.17.0
vite: 6.3.2(jiti@1.21.7)(yaml@2.7.1) vite: 6.3.5(jiti@1.21.7)(yaml@2.7.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -3206,12 +3216,12 @@ snapshots:
astring@1.9.0: {} astring@1.9.0: {}
astro@5.7.4(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1): astro@5.13.2(jiti@1.21.7)(rollup@4.40.0)(typescript@5.7.3)(yaml@2.7.1):
dependencies: dependencies:
'@astrojs/compiler': 2.11.0 '@astrojs/compiler': 2.12.2
'@astrojs/internal-helpers': 0.6.1 '@astrojs/internal-helpers': 0.7.2
'@astrojs/markdown-remark': 6.3.1 '@astrojs/markdown-remark': 6.3.6
'@astrojs/telemetry': 3.2.0 '@astrojs/telemetry': 3.3.0
'@capsizecss/unpack': 2.4.0 '@capsizecss/unpack': 2.4.0
'@oslojs/encoding': 1.1.0 '@oslojs/encoding': 1.1.0
'@rollup/pluginutils': 5.1.4(rollup@4.40.0) '@rollup/pluginutils': 5.1.4(rollup@4.40.0)
@@ -3234,9 +3244,11 @@ snapshots:
esbuild: 0.25.2 esbuild: 0.25.2
estree-walker: 3.0.3 estree-walker: 3.0.3
flattie: 1.1.1 flattie: 1.1.1
fontace: 0.3.0
github-slugger: 2.0.0 github-slugger: 2.0.0
html-escaper: 3.0.3 html-escaper: 3.0.3
http-cache-semantics: 4.1.1 http-cache-semantics: 4.1.1
import-meta-resolve: 4.1.0
js-yaml: 4.1.0 js-yaml: 4.1.0
kleur: 4.1.5 kleur: 4.1.5
magic-string: 0.30.17 magic-string: 0.30.17
@@ -3251,22 +3263,23 @@ snapshots:
rehype: 13.0.2 rehype: 13.0.2
semver: 7.7.1 semver: 7.7.1
shiki: 3.2.2 shiki: 3.2.2
smol-toml: 1.4.2
tinyexec: 0.3.2 tinyexec: 0.3.2
tinyglobby: 0.2.13 tinyglobby: 0.2.13
tsconfck: 3.1.5(typescript@5.7.3) tsconfck: 3.1.5(typescript@5.7.3)
ultrahtml: 1.6.0 ultrahtml: 1.6.0
unifont: 0.2.0 unifont: 0.5.0
unist-util-visit: 5.0.0 unist-util-visit: 5.0.0
unstorage: 1.15.0 unstorage: 1.15.0
vfile: 6.0.3 vfile: 6.0.3
vite: 6.3.2(jiti@1.21.7)(yaml@2.7.1) vite: 6.3.5(jiti@1.21.7)(yaml@2.7.1)
vitefu: 1.0.6(vite@6.3.2(jiti@1.21.7)(yaml@2.7.1)) vitefu: 1.0.6(vite@6.3.5(jiti@1.21.7)(yaml@2.7.1))
xxhash-wasm: 1.1.0 xxhash-wasm: 1.1.0
yargs-parser: 21.1.1 yargs-parser: 21.1.1
yocto-spinner: 0.2.2 yocto-spinner: 0.2.2
zod: 3.24.3 zod: 3.25.76
zod-to-json-schema: 3.24.5(zod@3.24.3) zod-to-json-schema: 3.24.5(zod@3.25.76)
zod-to-ts: 1.2.0(typescript@5.7.3)(zod@3.24.3) zod-to-ts: 1.2.0(typescript@5.7.3)(zod@3.25.76)
optionalDependencies: optionalDependencies:
sharp: 0.33.5 sharp: 0.33.5
transitivePeerDependencies: transitivePeerDependencies:
@@ -3617,9 +3630,9 @@ snapshots:
merge2: 1.4.1 merge2: 1.4.1
micromatch: 4.0.8 micromatch: 4.0.8
fast-xml-parser@4.5.3: fast-xml-parser@5.2.5:
dependencies: dependencies:
strnum: 1.1.2 strnum: 2.1.1
fastq@1.19.1: fastq@1.19.1:
dependencies: dependencies:
@@ -3635,6 +3648,11 @@ snapshots:
flattie@1.1.1: {} flattie@1.1.1: {}
fontace@0.3.0:
dependencies:
'@types/fontkit': 2.0.8
fontkit: 2.0.4
fontkit@2.0.4: fontkit@2.0.4:
dependencies: dependencies:
'@swc/helpers': 0.5.17 '@swc/helpers': 0.5.17
@@ -4977,7 +4995,7 @@ snapshots:
arg: 5.0.2 arg: 5.0.2
sax: 1.4.1 sax: 1.4.1
smol-toml@1.3.3: {} smol-toml@1.4.2: {}
source-map-js@1.2.1: {} source-map-js@1.2.1: {}
@@ -5020,7 +5038,7 @@ snapshots:
dependencies: dependencies:
ansi-regex: 6.1.0 ansi-regex: 6.1.0
strnum@1.1.2: {} strnum@2.1.1: {}
style-to-js@1.1.16: style-to-js@1.1.16:
dependencies: dependencies:
@@ -5143,7 +5161,7 @@ snapshots:
trough: 2.2.0 trough: 2.2.0
vfile: 6.0.3 vfile: 6.0.3
unifont@0.2.0: unifont@0.5.0:
dependencies: dependencies:
css-tree: 3.1.0 css-tree: 3.1.0
ohash: 2.0.11 ohash: 2.0.11
@@ -5228,7 +5246,7 @@ snapshots:
'@types/unist': 3.0.3 '@types/unist': 3.0.3
vfile-message: 4.0.2 vfile-message: 4.0.2
vite@6.3.2(jiti@1.21.7)(yaml@2.7.1): vite@6.3.5(jiti@1.21.7)(yaml@2.7.1):
dependencies: dependencies:
esbuild: 0.25.2 esbuild: 0.25.2
fdir: 6.4.4(picomatch@4.0.2) fdir: 6.4.4(picomatch@4.0.2)
@@ -5241,9 +5259,9 @@ snapshots:
jiti: 1.21.7 jiti: 1.21.7
yaml: 2.7.1 yaml: 2.7.1
vitefu@1.0.6(vite@6.3.2(jiti@1.21.7)(yaml@2.7.1)): vitefu@1.0.6(vite@6.3.5(jiti@1.21.7)(yaml@2.7.1)):
optionalDependencies: optionalDependencies:
vite: 6.3.2(jiti@1.21.7)(yaml@2.7.1) vite: 6.3.5(jiti@1.21.7)(yaml@2.7.1)
web-namespaces@2.0.1: {} web-namespaces@2.0.1: {}
@@ -5298,15 +5316,15 @@ snapshots:
yoctocolors@2.1.1: {} yoctocolors@2.1.1: {}
zod-to-json-schema@3.24.5(zod@3.24.3): zod-to-json-schema@3.24.5(zod@3.25.76):
dependencies: dependencies:
zod: 3.24.3 zod: 3.25.76
zod-to-ts@1.2.0(typescript@5.7.3)(zod@3.24.3): zod-to-ts@1.2.0(typescript@5.7.3)(zod@3.25.76):
dependencies: dependencies:
typescript: 5.7.3 typescript: 5.7.3
zod: 3.24.3 zod: 3.25.76
zod@3.24.3: {} zod@3.25.76: {}
zwitch@2.0.4: {} zwitch@2.0.4: {}

View File

@@ -1,5 +1,24 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import { Check, Copy } from 'lucide-react'; import { Copy, Check } from 'lucide-react';
import {
SiJavascript,
SiTypescript,
SiPython,
SiRust,
SiGo,
SiC,
SiCplusplus,
SiHtml5,
SiCss3,
SiPhp,
SiRuby,
SiSwift,
SiKotlin,
SiLua,
SiJson,
SiMarkdown,
} from 'react-icons/si';
import { RxTextAlignLeft } from 'react-icons/rx';
interface CodeBlockProps { interface CodeBlockProps {
children: React.ReactNode; children: React.ReactNode;
@@ -9,51 +28,134 @@ interface CodeBlockProps {
raw?: string; raw?: string;
} }
const getLanguageIcon = (language: string) => {
// Normalize the language name
const normalizedLang = language.toLowerCase().replace(/^\s+|\s+$/g, '');
// Map language names to icons
switch (normalizedLang) {
case 'js':
case 'javascript':
return <SiJavascript className="text-yellow-bright" />;
case 'ts':
case 'typescript':
return <SiTypescript className="text-blue-bright" />;
case 'py':
case 'python':
return <SiPython className="text-blue-bright" />;
case 'rs':
case 'rust':
return <SiRust className="text-orange-bright" />;
case 'go':
case 'golang':
return <SiGo className="text-blue-bright" />;
case 'c':
return <SiC className="text-blue-bright" />;
case 'cpp':
case 'c++':
return <SiCplusplus className="text-blue-bright" />;
case 'html':
return <SiHtml5 className="text-orange-bright" />;
case 'css':
return <SiCss3 className="text-blue-bright" />;
case 'php':
return <SiPhp className="text-purple-bright" />;
case 'rb':
case 'ruby':
return <SiRuby className="text-red-bright" />;
case 'swift':
return <SiSwift className="text-orange-bright" />;
case 'kt':
case 'kotlin':
return <SiKotlin className="text-purple-bright" />;
case 'lua':
return <SiLua className="text-blue-bright" />;
case 'json':
return <SiJson className="text-yellow-bright" />;
case 'md':
case 'markdown':
return <SiMarkdown className="text-blue-bright" />;
default:
return <RxTextAlignLeft className="text-yellow-bright" />;
}
};
export const CodeBlock: React.FC<CodeBlockProps> = ({ export const CodeBlock: React.FC<CodeBlockProps> = ({
children, children,
className, className,
'data-language': language, 'data-language': language = 'text',
'data-theme': theme,
raw raw
}) => { }) => {
const [copied, setCopied] = useState(false); const [copied, setCopied] = useState(false);
const languageIcon = getLanguageIcon(language);
const handleCopy = () => { const handleCopy = () => {
if (raw) { // If raw content is provided, use that, otherwise try to extract text from children
navigator.clipboard.writeText(raw); const textToCopy = raw || (
setCopied(true); typeof children === 'string'
setTimeout(() => setCopied(false), 2000); ? children
} : (
React.Children.toArray(children)
.map(child =>
typeof child === 'string'
? child
: child && typeof child === 'object' && 'props' in child && typeof child.props.children === 'string'
? child.props.children
: ''
)
.join('')
)
);
navigator.clipboard.writeText(textToCopy)
.then(() => {
setCopied(true);
setTimeout(() => setCopied(false), 2000);
})
.catch(err => {
console.error('Failed to copy: ', err);
});
}; };
return ( return (
<div className="relative group"> <div className="w-full rounded-md overflow-hidden border border-foreground/20 bg-background my-4" style={{ maxWidth: '95vw' }}>
{language && ( {/* Header with Language Icon and Copy Button */}
<div className="absolute top-0 left-4 -translate-y-1/2"> <div className="bg-background border-b border-foreground/20 text-foreground p-2 flex items-center justify-between">
<span className="inline-block px-2 py-1 text-xs font-bold text-foreground/80 bg-[#282828] rounded"> <div className="flex items-center">
{language} <span className="mr-2 text-xl">
{languageIcon}
</span> </span>
<div className="text-sm font-comic-code">
{language || "Code"}
</div>
</div> </div>
)} <button
<button onClick={handleCopy}
onClick={handleCopy} className="bg-background hover:bg-foreground/10 text-foreground text-xs px-2 py-1 rounded flex items-center"
className="absolute top-0 right-0 -translate-y-[50%] hidden group-hover:flex items-center gap-1 px-2 py-1 text-xs font-medium text-foreground/80 bg-[#282828] rounded hover:text-foreground transition-colors" >
aria-label="Copy code" {copied ? (
> <>
{copied ? ( <Check size={14} className="mr-1 text-green-bright" />
<> <span>Copied</span>
<Check size={14} /> </>
Copied! ) : (
</> <>
) : ( <Copy size={14} className="mr-1 text-foreground/70" />
<> <span>Copy</span>
<Copy size={14} /> </>
Copy )}
</> </button>
)} </div>
</button>
<pre className={className}> {/* Code Display */}
<code>{children}</code> <div className="text-foreground overflow-x-auto">
</pre> <pre className={className}>
<code>{children}</code>
</pre>
</div>
</div> </div>
); );
}; };
export default CodeBlock;

View File

@@ -0,0 +1,104 @@
import React from 'react';
interface T440pAdProps {
className?: string;
}
const Advertisement: React.FC<T440pAdProps> = ({ className = '' }) => {
return (
<div className={`bg-gradient-to-br from-blue-50 to-indigo-100 border-2 border-blue-200 rounded-lg p-6 my-8 shadow-lg ${className}`}>
<div className="flex items-start gap-4">
{/* Icon/Logo placeholder */}
<div className="flex-shrink-0 w-12 h-12 bg-blue-600 rounded-lg flex items-center justify-center">
<svg
className="w-8 h-8 text-white"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
/>
</svg>
</div>
<div className="flex-1">
<div className="flex items-center gap-3 mb-3">
<h3 className="text-xl font-bold text-gray-900">
Custom Corebooted ThinkPad T440p
</h3>
<span className="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800">
Available Now
</span>
</div>
<p className="text-gray-700 mb-4">
Skip the technical complexity and get a professionally corebooted ThinkPad T440p
built to your specifications. Each laptop is carefully modified and tested to ensure
optimal performance and reliability.
</p>
<div className="grid md:grid-cols-2 gap-4 mb-4">
<div>
<h4 className="font-semibold text-gray-900 mb-2"> What's Included:</h4>
<ul className="text-sm text-gray-700 space-y-1">
<li> Coreboot firmware pre-installed</li>
<li> IPS 1080p display upgrade</li>
<li> RAM options: 4GB, 8GB, or 16GB</li>
<li> CPU choice available</li>
<li> Battery upgrade option</li>
<li> Thorough testing & quality assurance</li>
</ul>
</div>
<div>
<h4 className="font-semibold text-gray-900 mb-2">🔧 Benefits:</h4>
<ul className="text-sm text-gray-700 space-y-1">
<li> Faster boot times</li>
<li> Open-source BIOS</li>
<li> Enhanced security</li>
<li> No proprietary firmware</li>
<li> Full hardware control</li>
<li> Professional installation</li>
</ul>
</div>
</div>
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4 pt-4 border-t border-blue-200">
<div className="flex items-baseline gap-2">
<span className="text-3xl font-bold text-blue-600">$500</span>
<span className="text-sm text-gray-600">USD (base configuration)</span>
</div>
<div className="flex gap-3">
<a
href="https://ebay.com"
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center px-4 py-2 bg-blue-600 text-white font-medium rounded-lg hover:bg-blue-700 transition-colors"
>
<svg className="w-4 h-4 mr-2" fill="currentColor" viewBox="0 0 24 24">
<path d="M8.5 2A1.5 1.5 0 007 3.5v1A1.5 1.5 0 008.5 6h7A1.5 1.5 0 0017 4.5v-1A1.5 1.5 0 0015.5 2h-7zM10 3h4v1h-4V3z"/>
<path d="M6 7.5A1.5 1.5 0 017.5 6h9A1.5 1.5 0 0118 7.5v9a1.5 1.5 0 01-1.5 1.5h-9A1.5 1.5 0 016 16.5v-9z"/>
</svg>
Order on eBay
</a>
<button className="inline-flex items-center px-4 py-2 border border-blue-600 text-blue-600 font-medium rounded-lg hover:bg-blue-50 transition-colors">
<svg className="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
Ask Questions
</button>
</div>
</div>
</div>
</div>
</div>
);
};
export default Advertisement;

View File

@@ -8,6 +8,7 @@ image: "/blog/thinkpad-t440p-coreboot-guide/thumbnail.png"
--- ---
import { Commands, Command, CommandSequence } from "@/components/mdx/command"; import { Commands, Command, CommandSequence } from "@/components/mdx/command";
import Advertisement from '@/content/blog/components/thinkpad-t440p-coreboot-guide/advertisement';
> **Interactive Script Available!** > **Interactive Script Available!**
> Want to skip the manual steps in this guide? > Want to skip the manual steps in this guide?

View File

View File

View File

View File