Compare commits

...

5 commits

Author SHA1 Message Date
CDN
e1d44586b9
feat: contents integration (artalk) + cleanup
All checks were successful
Deploy / Deploy (push) Successful in 1m13s
closes #8
2025-02-03 20:58:21 +08:00
CDN
e8ca5568c7
chore: update social links 2025-02-03 20:35:46 +08:00
CDN
8e55ea6fe6
chore: update translations 2025-02-03 20:32:06 +08:00
CDN
23397634f1
chore: update footer 2025-02-03 20:30:56 +08:00
CDN
efe0b21753
fix: update detailes does not load 2025-02-03 20:24:16 +08:00
11 changed files with 265 additions and 143 deletions

View file

@ -63,6 +63,7 @@
"tags": {
"journal": "Journal/Summary",
"milestone": "Milestone",
"service": "Service",
"other": "Other"
},
"notFound": {
@ -110,7 +111,7 @@
"openMenu": "Open menu"
},
"hero": {
"title": "Connecting STARSET with You",
"title": "Connecting STARSET and You",
"subtitle": "",
"cta": {
"projects": "Browse Projects",
@ -123,7 +124,7 @@
"system": "System"
},
"footer": {
"copyright": " 2024 STARSET Mirror."
"copyright": " 2020-{{currentYear}} STARSET Mirror."
},
"social": {
"links": [
@ -146,10 +147,10 @@
"icon": "Fediverse"
},
{
"name": "Twitter",
"url": "https://x.com/starset_mirror",
"name": "Bluesky",
"url": "https://bsky.app/profile/mirror.starset.fans",
"color": "text-gray-400 hover:text-blue-400",
"icon": "Twitter"
"icon": "Bluesky"
},
{
"name": "Discord",
@ -162,6 +163,12 @@
"url": "https://git.owu.one/starset-mirror",
"color": "text-gray-400 hover:text-orange-400",
"icon": "Forgejo"
},
{
"name": "Twitter",
"url": "https://x.com/starset_mirror",
"color": "text-gray-400 hover:text-blue-400",
"icon": "Twitter"
}
]
},

View file

@ -84,6 +84,7 @@
"tags": {
"journal": "日志/总结",
"milestone": "里程碑",
"service": "服务",
"other": "其它"
},
"notFound": {
@ -123,7 +124,7 @@
"system": "跟随系统"
},
"footer": {
"copyright": " 2024 STARSET Mirror."
"copyright": " 2020-{{currentYear}} STARSET Mirror."
},
"social": {
"links": [

View file

@ -76,6 +76,7 @@
"tags": {
"journal": "日誌/總結",
"milestone": "里程碑",
"service": "服務",
"other": "其他"
},
"notFound": {
@ -107,7 +108,7 @@
"system": "跟隨系統"
},
"footer": {
"copyright": " 2024 STARSET Mirror."
"copyright": " 2020-{{currentYear}} STARSET Mirror."
},
"social": {
"links": [
@ -130,10 +131,10 @@
"icon": "Fediverse"
},
{
"name": "Twitter",
"url": "https://x.com/starset_mirror",
"name": "Bluesky",
"url": "https://bsky.app/profile/mirror.starset.fans",
"color": "text-gray-400 hover:text-blue-400",
"icon": "Twitter"
"icon": "Bluesky"
},
{
"name": "Discord",
@ -146,6 +147,12 @@
"url": "https://git.owu.one/starset-mirror",
"color": "text-gray-400 hover:text-orange-400",
"icon": "Forgejo"
},
{
"name": "Twitter",
"url": "https://x.com/starset_mirror",
"color": "text-gray-400 hover:text-blue-400",
"icon": "Twitter"
}
]
},

View file

@ -13,18 +13,19 @@
"@ant-design/icons": "^5.6.0",
"@tanstack/react-query": "^5.66.0",
"antd": "^5.23.3",
"artalk": "^2.9.1",
"clsx": "^2.1.1",
"feed": "^4.2.2",
"i18next": "^23.16.8",
"i18next-browser-languagedetector": "^7.2.2",
"lucide-react": "^0.344.0",
"marked": "^12.0.2",
"marked": "^15.0.6",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-helmet-async": "^2.0.5",
"react-i18next": "^14.1.3",
"react-icons": "^5.4.0",
"react-router-dom": "^6.28.2"
"react-router-dom": "^6.29.0"
},
"devDependencies": {
"@eslint/js": "^9.19.0",

254
pnpm-lock.yaml generated
View file

@ -17,6 +17,9 @@ importers:
antd:
specifier: ^5.23.3
version: 5.23.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
artalk:
specifier: ^2.9.1
version: 2.9.1(marked@15.0.6)
clsx:
specifier: ^2.1.1
version: 2.1.1
@ -33,8 +36,8 @@ importers:
specifier: ^0.344.0
version: 0.344.0(react@18.3.1)
marked:
specifier: ^12.0.2
version: 12.0.2
specifier: ^15.0.6
version: 15.0.6
react:
specifier: ^18.3.1
version: 18.3.1
@ -51,8 +54,8 @@ importers:
specifier: ^5.4.0
version: 5.4.0(react@18.3.1)
react-router-dom:
specifier: ^6.28.2
version: 6.28.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
specifier: ^6.29.0
version: 6.29.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
devDependencies:
'@eslint/js':
specifier: ^9.19.0
@ -543,8 +546,8 @@ packages:
resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
'@eslint/config-array@0.19.1':
resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==}
'@eslint/config-array@0.19.2':
resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/core@0.10.0':
@ -559,8 +562,8 @@ packages:
resolution: {integrity: sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.5':
resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==}
'@eslint/object-schema@2.1.6':
resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/plugin-kit@0.2.5':
@ -680,102 +683,102 @@ packages:
react: '>=16.9.0'
react-dom: '>=16.9.0'
'@remix-run/router@1.21.1':
resolution: {integrity: sha512-KeBYSwohb8g4/wCcnksvKTYlg69O62sQeLynn2YE+5z7JWEj95if27kclW9QqbrlsQ2DINI8fjbV3zyuKfwjKg==}
'@remix-run/router@1.22.0':
resolution: {integrity: sha512-MBOl8MeOzpK0HQQQshKB7pABXbmyHizdTpqnrIseTbsv0nAepwC2ENZa1aaBExNQcpLoXmWthhak8SABLzvGPw==}
engines: {node: '>=14.0.0'}
'@rollup/rollup-android-arm-eabi@4.32.1':
resolution: {integrity: sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==}
'@rollup/rollup-android-arm-eabi@4.34.1':
resolution: {integrity: sha512-kwctwVlswSEsr4ljpmxKrRKp1eG1v2NAhlzFzDf1x1OdYaMjBYjDCbHkzWm57ZXzTwqn8stMXgROrnMw8dJK3w==}
cpu: [arm]
os: [android]
'@rollup/rollup-android-arm64@4.32.1':
resolution: {integrity: sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==}
'@rollup/rollup-android-arm64@4.34.1':
resolution: {integrity: sha512-4H5ZtZitBPlbPsTv6HBB8zh1g5d0T8TzCmpndQdqq20Ugle/nroOyDMf9p7f88Gsu8vBLU78/cuh8FYHZqdXxw==}
cpu: [arm64]
os: [android]
'@rollup/rollup-darwin-arm64@4.32.1':
resolution: {integrity: sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==}
'@rollup/rollup-darwin-arm64@4.34.1':
resolution: {integrity: sha512-f2AJ7Qwx9z25hikXvg+asco8Sfuc5NCLg8rmqQBIOUoWys5sb/ZX9RkMZDPdnnDevXAMJA5AWLnRBmgdXGEUiA==}
cpu: [arm64]
os: [darwin]
'@rollup/rollup-darwin-x64@4.32.1':
resolution: {integrity: sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==}
'@rollup/rollup-darwin-x64@4.34.1':
resolution: {integrity: sha512-+/2JBrRfISCsWE4aEFXxd+7k9nWGXA8+wh7ZUHn/u8UDXOU9LN+QYKKhd57sIn6WRcorOnlqPMYFIwie/OHXWw==}
cpu: [x64]
os: [darwin]
'@rollup/rollup-freebsd-arm64@4.32.1':
resolution: {integrity: sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==}
'@rollup/rollup-freebsd-arm64@4.34.1':
resolution: {integrity: sha512-SUeB0pYjIXwT2vfAMQ7E4ERPq9VGRrPR7Z+S4AMssah5EHIilYqjWQoTn5dkDtuIJUSTs8H+C9dwoEcg3b0sCA==}
cpu: [arm64]
os: [freebsd]
'@rollup/rollup-freebsd-x64@4.32.1':
resolution: {integrity: sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==}
'@rollup/rollup-freebsd-x64@4.34.1':
resolution: {integrity: sha512-L3T66wAZiB/ooiPbxz0s6JEX6Sr2+HfgPSK+LMuZkaGZFAFCQAHiP3dbyqovYdNaiUXcl9TlgnIbcsIicAnOZg==}
cpu: [x64]
os: [freebsd]
'@rollup/rollup-linux-arm-gnueabihf@4.32.1':
resolution: {integrity: sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==}
'@rollup/rollup-linux-arm-gnueabihf@4.34.1':
resolution: {integrity: sha512-UBXdQ4+ATARuFgsFrQ+tAsKvBi/Hly99aSVdeCUiHV9dRTTpMU7OrM3WXGys1l40wKVNiOl0QYY6cZQJ2xhKlQ==}
cpu: [arm]
os: [linux]
'@rollup/rollup-linux-arm-musleabihf@4.32.1':
resolution: {integrity: sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==}
'@rollup/rollup-linux-arm-musleabihf@4.34.1':
resolution: {integrity: sha512-m/yfZ25HGdcCSwmopEJm00GP7xAUyVcBPjttGLRAqZ60X/bB4Qn6gP7XTwCIU6bITeKmIhhwZ4AMh2XLro+4+w==}
cpu: [arm]
os: [linux]
'@rollup/rollup-linux-arm64-gnu@4.32.1':
resolution: {integrity: sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==}
'@rollup/rollup-linux-arm64-gnu@4.34.1':
resolution: {integrity: sha512-Wy+cUmFuvziNL9qWRRzboNprqSQ/n38orbjRvd6byYWridp5TJ3CD+0+HUsbcWVSNz9bxkDUkyASGP0zS7GAvg==}
cpu: [arm64]
os: [linux]
'@rollup/rollup-linux-arm64-musl@4.32.1':
resolution: {integrity: sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==}
'@rollup/rollup-linux-arm64-musl@4.34.1':
resolution: {integrity: sha512-CQ3MAGgiFmQW5XJX5W3wnxOBxKwFlUAgSXFA2SwgVRjrIiVt5LHfcQLeNSHKq5OEZwv+VCBwlD1+YKCjDG8cpg==}
cpu: [arm64]
os: [linux]
'@rollup/rollup-linux-loongarch64-gnu@4.32.1':
resolution: {integrity: sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==}
'@rollup/rollup-linux-loongarch64-gnu@4.34.1':
resolution: {integrity: sha512-rSzb1TsY4lSwH811cYC3OC2O2mzNMhM13vcnA7/0T6Mtreqr3/qs6WMDriMRs8yvHDI54qxHgOk8EV5YRAHFbw==}
cpu: [loong64]
os: [linux]
'@rollup/rollup-linux-powerpc64le-gnu@4.32.1':
resolution: {integrity: sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==}
'@rollup/rollup-linux-powerpc64le-gnu@4.34.1':
resolution: {integrity: sha512-fwr0n6NS0pG3QxxlqVYpfiY64Fd1Dqd8Cecje4ILAV01ROMp4aEdCj5ssHjRY3UwU7RJmeWd5fi89DBqMaTawg==}
cpu: [ppc64]
os: [linux]
'@rollup/rollup-linux-riscv64-gnu@4.32.1':
resolution: {integrity: sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==}
'@rollup/rollup-linux-riscv64-gnu@4.34.1':
resolution: {integrity: sha512-4uJb9qz7+Z/yUp5RPxDGGGUcoh0PnKF33QyWgEZ3X/GocpWb6Mb+skDh59FEt5d8+Skxqs9mng6Swa6B2AmQZg==}
cpu: [riscv64]
os: [linux]
'@rollup/rollup-linux-s390x-gnu@4.32.1':
resolution: {integrity: sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==}
'@rollup/rollup-linux-s390x-gnu@4.34.1':
resolution: {integrity: sha512-QlIo8ndocWBEnfmkYqj8vVtIUpIqJjfqKggjy7IdUncnt8BGixte1wDON7NJEvLg3Kzvqxtbo8tk+U1acYEBlw==}
cpu: [s390x]
os: [linux]
'@rollup/rollup-linux-x64-gnu@4.32.1':
resolution: {integrity: sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==}
'@rollup/rollup-linux-x64-gnu@4.34.1':
resolution: {integrity: sha512-hzpleiKtq14GWjz3ahWvJXgU1DQC9DteiwcsY4HgqUJUGxZThlL66MotdUEK9zEo0PK/2ADeZGM9LIondE302A==}
cpu: [x64]
os: [linux]
'@rollup/rollup-linux-x64-musl@4.32.1':
resolution: {integrity: sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==}
'@rollup/rollup-linux-x64-musl@4.34.1':
resolution: {integrity: sha512-jqtKrO715hDlvUcEsPn55tZt2TEiBvBtCMkUuU0R6fO/WPT7lO9AONjPbd8II7/asSiNVQHCMn4OLGigSuxVQA==}
cpu: [x64]
os: [linux]
'@rollup/rollup-win32-arm64-msvc@4.32.1':
resolution: {integrity: sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==}
'@rollup/rollup-win32-arm64-msvc@4.34.1':
resolution: {integrity: sha512-RnHy7yFf2Wz8Jj1+h8klB93N0NHNHXFhNwAmiy9zJdpY7DE01VbEVtPdrK1kkILeIbHGRJjvfBDBhnxBr8kD4g==}
cpu: [arm64]
os: [win32]
'@rollup/rollup-win32-ia32-msvc@4.32.1':
resolution: {integrity: sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==}
'@rollup/rollup-win32-ia32-msvc@4.34.1':
resolution: {integrity: sha512-i7aT5HdiZIcd7quhzvwQ2oAuX7zPYrYfkrd1QFfs28Po/i0q6kas/oRrzGlDhAEyug+1UfUtkWdmoVlLJj5x9Q==}
cpu: [ia32]
os: [win32]
'@rollup/rollup-win32-x64-msvc@4.32.1':
resolution: {integrity: sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==}
'@rollup/rollup-win32-x64-msvc@4.34.1':
resolution: {integrity: sha512-k3MVFD9Oq+laHkw2N2v7ILgoa9017ZMF/inTtHzyTVZjYs9cSH18sdyAf6spBAJIGwJ5UaC7et2ZH1WCdlhkMw==}
cpu: [x64]
os: [win32]
@ -937,6 +940,11 @@ packages:
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
artalk@2.9.1:
resolution: {integrity: sha512-IFo9XqWDalsHy8BsmMA5SSB9bozBa/sBhTm/+O5KwA6DnC95lFKv7C6ScMx/Xa4ue5qSQ7VV5vxRgCh/raohkQ==}
peerDependencies:
marked: ^14.1.0
autoprefixer@10.4.20:
resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
engines: {node: ^10 || ^12 || >=14}
@ -1144,8 +1152,8 @@ packages:
fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
fastq@1.18.0:
resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==}
fastq@1.19.0:
resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==}
feed@4.2.2:
resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==}
@ -1252,8 +1260,8 @@ packages:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
import-fresh@3.3.0:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
import-fresh@3.3.1:
resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
engines: {node: '>=6'}
imurmurhash@0.1.4:
@ -1379,8 +1387,8 @@ packages:
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0
marked@12.0.2:
resolution: {integrity: sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==}
marked@15.0.6:
resolution: {integrity: sha512-Y07CUOE+HQXbVDCGl3LXggqJDbXDP2pArc2C1N1RRMN0ONiShoSsIInMd5Gsxupe7fKLpgimTV+HOJ9r7bA+pg==}
engines: {node: '>= 18'}
hasBin: true
@ -1815,15 +1823,15 @@ packages:
resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
engines: {node: '>=0.10.0'}
react-router-dom@6.28.2:
resolution: {integrity: sha512-O81EWqNJWqvlN/a7eTudAdQm0TbI7hw+WIi7OwwMcTn5JMyZ0ibTFNGz+t+Lju0df4LcqowCegcrK22lB1q9Kw==}
react-router-dom@6.29.0:
resolution: {integrity: sha512-pkEbJPATRJ2iotK+wUwHfy0xs2T59YPEN8BQxVCPeBZvK7kfPESRc/nyxzdcxR17hXgUPYx2whMwl+eo9cUdnQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
react: '>=16.8'
react-dom: '>=16.8'
react-router@6.28.2:
resolution: {integrity: sha512-BgFY7+wEGVjHCiqaj2XiUBQ1kkzfg6UoKYwEe0wv+FF+HNPCxtS/MVPvLAPH++EsuCMReZl9RYVGqcHLk5ms3A==}
react-router@6.29.0:
resolution: {integrity: sha512-DXZJoE0q+KyeVw75Ck6GkPxFak63C4fGqZGNijnWgzB/HzSP1ZfTlBj5COaGWwhrMQ/R8bXiq5Ooy4KG+ReyjQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
react: '>=16.8'
@ -1861,8 +1869,8 @@ packages:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
rollup@4.32.1:
resolution: {integrity: sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==}
rollup@4.34.1:
resolution: {integrity: sha512-iYZ/+PcdLYSGfH3S+dGahlW/RWmsqDhLgj1BT9DH/xXJ0ggZN7xkdP9wipPNjjNLczI+fmMLmTB9pye+d2r4GQ==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@ -1968,8 +1976,8 @@ packages:
toggle-selection@1.0.6:
resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
ts-api-utils@2.0.0:
resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==}
ts-api-utils@2.0.1:
resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==}
engines: {node: '>=18.12'}
peerDependencies:
typescript: '>=4.8.4'
@ -2417,9 +2425,9 @@ snapshots:
'@eslint-community/regexpp@4.12.1': {}
'@eslint/config-array@0.19.1':
'@eslint/config-array@0.19.2':
dependencies:
'@eslint/object-schema': 2.1.5
'@eslint/object-schema': 2.1.6
debug: 4.4.0
minimatch: 3.1.2
transitivePeerDependencies:
@ -2436,7 +2444,7 @@ snapshots:
espree: 10.3.0
globals: 14.0.0
ignore: 5.3.2
import-fresh: 3.3.0
import-fresh: 3.3.1
js-yaml: 4.1.0
minimatch: 3.1.2
strip-json-comments: 3.1.1
@ -2445,7 +2453,7 @@ snapshots:
'@eslint/js@9.19.0': {}
'@eslint/object-schema@2.1.5': {}
'@eslint/object-schema@2.1.6': {}
'@eslint/plugin-kit@0.2.5':
dependencies:
@ -2501,7 +2509,7 @@ snapshots:
'@nodelib/fs.walk@1.2.8':
dependencies:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.18.0
fastq: 1.19.0
'@pkgjs/parseargs@0.11.0':
optional: true
@ -2575,63 +2583,63 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
'@remix-run/router@1.21.1': {}
'@remix-run/router@1.22.0': {}
'@rollup/rollup-android-arm-eabi@4.32.1':
'@rollup/rollup-android-arm-eabi@4.34.1':
optional: true
'@rollup/rollup-android-arm64@4.32.1':
'@rollup/rollup-android-arm64@4.34.1':
optional: true
'@rollup/rollup-darwin-arm64@4.32.1':
'@rollup/rollup-darwin-arm64@4.34.1':
optional: true
'@rollup/rollup-darwin-x64@4.32.1':
'@rollup/rollup-darwin-x64@4.34.1':
optional: true
'@rollup/rollup-freebsd-arm64@4.32.1':
'@rollup/rollup-freebsd-arm64@4.34.1':
optional: true
'@rollup/rollup-freebsd-x64@4.32.1':
'@rollup/rollup-freebsd-x64@4.34.1':
optional: true
'@rollup/rollup-linux-arm-gnueabihf@4.32.1':
'@rollup/rollup-linux-arm-gnueabihf@4.34.1':
optional: true
'@rollup/rollup-linux-arm-musleabihf@4.32.1':
'@rollup/rollup-linux-arm-musleabihf@4.34.1':
optional: true
'@rollup/rollup-linux-arm64-gnu@4.32.1':
'@rollup/rollup-linux-arm64-gnu@4.34.1':
optional: true
'@rollup/rollup-linux-arm64-musl@4.32.1':
'@rollup/rollup-linux-arm64-musl@4.34.1':
optional: true
'@rollup/rollup-linux-loongarch64-gnu@4.32.1':
'@rollup/rollup-linux-loongarch64-gnu@4.34.1':
optional: true
'@rollup/rollup-linux-powerpc64le-gnu@4.32.1':
'@rollup/rollup-linux-powerpc64le-gnu@4.34.1':
optional: true
'@rollup/rollup-linux-riscv64-gnu@4.32.1':
'@rollup/rollup-linux-riscv64-gnu@4.34.1':
optional: true
'@rollup/rollup-linux-s390x-gnu@4.32.1':
'@rollup/rollup-linux-s390x-gnu@4.34.1':
optional: true
'@rollup/rollup-linux-x64-gnu@4.32.1':
'@rollup/rollup-linux-x64-gnu@4.34.1':
optional: true
'@rollup/rollup-linux-x64-musl@4.32.1':
'@rollup/rollup-linux-x64-musl@4.34.1':
optional: true
'@rollup/rollup-win32-arm64-msvc@4.32.1':
'@rollup/rollup-win32-arm64-msvc@4.34.1':
optional: true
'@rollup/rollup-win32-ia32-msvc@4.32.1':
'@rollup/rollup-win32-ia32-msvc@4.34.1':
optional: true
'@rollup/rollup-win32-x64-msvc@4.32.1':
'@rollup/rollup-win32-x64-msvc@4.34.1':
optional: true
'@tailwindcss/typography@0.5.16(tailwindcss@3.4.17)':
@ -2717,7 +2725,7 @@ snapshots:
graphemer: 1.4.0
ignore: 5.3.2
natural-compare: 1.4.0
ts-api-utils: 2.0.0(typescript@5.7.3)
ts-api-utils: 2.0.1(typescript@5.7.3)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
@ -2745,7 +2753,7 @@ snapshots:
'@typescript-eslint/utils': 8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3)
debug: 4.4.0
eslint: 9.19.0(jiti@1.21.7)
ts-api-utils: 2.0.0(typescript@5.7.3)
ts-api-utils: 2.0.1(typescript@5.7.3)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
@ -2761,7 +2769,7 @@ snapshots:
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.7.0
ts-api-utils: 2.0.0(typescript@5.7.3)
ts-api-utils: 2.0.1(typescript@5.7.3)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
@ -2885,6 +2893,10 @@ snapshots:
argparse@2.0.1: {}
artalk@2.9.1(marked@15.0.6):
dependencies:
marked: 15.0.6
autoprefixer@10.4.20(postcss@8.5.1):
dependencies:
browserslist: 4.24.4
@ -3072,7 +3084,7 @@ snapshots:
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@1.21.7))
'@eslint-community/regexpp': 4.12.1
'@eslint/config-array': 0.19.1
'@eslint/config-array': 0.19.2
'@eslint/core': 0.10.0
'@eslint/eslintrc': 3.2.0
'@eslint/js': 9.19.0
@ -3141,7 +3153,7 @@ snapshots:
fast-levenshtein@2.0.6: {}
fastq@1.18.0:
fastq@1.19.0:
dependencies:
reusify: 1.0.4
@ -3249,7 +3261,7 @@ snapshots:
ignore@5.3.2: {}
import-fresh@3.3.0:
import-fresh@3.3.1:
dependencies:
parent-module: 1.0.1
resolve-from: 4.0.0
@ -3357,7 +3369,7 @@ snapshots:
dependencies:
react: 18.3.1
marked@12.0.2: {}
marked@15.0.6: {}
merge2@1.4.1: {}
@ -3847,16 +3859,16 @@ snapshots:
react-refresh@0.14.2: {}
react-router-dom@6.28.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
react-router-dom@6.29.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@remix-run/router': 1.21.1
'@remix-run/router': 1.22.0
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
react-router: 6.28.2(react@18.3.1)
react-router: 6.29.0(react@18.3.1)
react-router@6.28.2(react@18.3.1):
react-router@6.29.0(react@18.3.1):
dependencies:
'@remix-run/router': 1.21.1
'@remix-run/router': 1.22.0
react: 18.3.1
react@18.3.1:
@ -3887,29 +3899,29 @@ snapshots:
reusify@1.0.4: {}
rollup@4.32.1:
rollup@4.34.1:
dependencies:
'@types/estree': 1.0.6
optionalDependencies:
'@rollup/rollup-android-arm-eabi': 4.32.1
'@rollup/rollup-android-arm64': 4.32.1
'@rollup/rollup-darwin-arm64': 4.32.1
'@rollup/rollup-darwin-x64': 4.32.1
'@rollup/rollup-freebsd-arm64': 4.32.1
'@rollup/rollup-freebsd-x64': 4.32.1
'@rollup/rollup-linux-arm-gnueabihf': 4.32.1
'@rollup/rollup-linux-arm-musleabihf': 4.32.1
'@rollup/rollup-linux-arm64-gnu': 4.32.1
'@rollup/rollup-linux-arm64-musl': 4.32.1
'@rollup/rollup-linux-loongarch64-gnu': 4.32.1
'@rollup/rollup-linux-powerpc64le-gnu': 4.32.1
'@rollup/rollup-linux-riscv64-gnu': 4.32.1
'@rollup/rollup-linux-s390x-gnu': 4.32.1
'@rollup/rollup-linux-x64-gnu': 4.32.1
'@rollup/rollup-linux-x64-musl': 4.32.1
'@rollup/rollup-win32-arm64-msvc': 4.32.1
'@rollup/rollup-win32-ia32-msvc': 4.32.1
'@rollup/rollup-win32-x64-msvc': 4.32.1
'@rollup/rollup-android-arm-eabi': 4.34.1
'@rollup/rollup-android-arm64': 4.34.1
'@rollup/rollup-darwin-arm64': 4.34.1
'@rollup/rollup-darwin-x64': 4.34.1
'@rollup/rollup-freebsd-arm64': 4.34.1
'@rollup/rollup-freebsd-x64': 4.34.1
'@rollup/rollup-linux-arm-gnueabihf': 4.34.1
'@rollup/rollup-linux-arm-musleabihf': 4.34.1
'@rollup/rollup-linux-arm64-gnu': 4.34.1
'@rollup/rollup-linux-arm64-musl': 4.34.1
'@rollup/rollup-linux-loongarch64-gnu': 4.34.1
'@rollup/rollup-linux-powerpc64le-gnu': 4.34.1
'@rollup/rollup-linux-riscv64-gnu': 4.34.1
'@rollup/rollup-linux-s390x-gnu': 4.34.1
'@rollup/rollup-linux-x64-gnu': 4.34.1
'@rollup/rollup-linux-x64-musl': 4.34.1
'@rollup/rollup-win32-arm64-msvc': 4.34.1
'@rollup/rollup-win32-ia32-msvc': 4.34.1
'@rollup/rollup-win32-x64-msvc': 4.34.1
fsevents: 2.3.3
run-parallel@1.2.0:
@ -4027,7 +4039,7 @@ snapshots:
toggle-selection@1.0.6: {}
ts-api-utils@2.0.0(typescript@5.7.3):
ts-api-utils@2.0.1(typescript@5.7.3):
dependencies:
typescript: 5.7.3
@ -4076,7 +4088,7 @@ snapshots:
dependencies:
esbuild: 0.21.5
postcss: 8.5.1
rollup: 4.32.1
rollup: 4.34.1
optionalDependencies:
'@types/node': 22.13.0
fsevents: 2.3.3

View file

@ -78,7 +78,7 @@ function App() {
<footer className="bg-gray-900 dark:bg-gray-950 text-white py-6" role="contentinfo">
<div className="container mx-auto px-4">
<div className="flex flex-col items-center">
<p className="text-gray-400 mb-4"> {t('footer.copyright')}</p>
<p className="text-gray-400 mb-4"> {t('footer.copyright', { currentYear: new Date().getFullYear() })}</p>
<div className="flex space-x-6">
{socialLinks.map((link: any) => {
const Icon = iconMap[link.icon as keyof typeof iconMap];

View file

@ -0,0 +1,71 @@
import { useCallback, useRef, useEffect } from 'react'
import { useLocation } from 'react-router-dom'
import 'artalk/dist/Artalk.css'
import Artalk from 'artalk'
interface CommentsProps {
title?: string;
}
const Comments = ({ title }: CommentsProps) => {
const { pathname } = useLocation()
const artalkRef = useRef<Artalk>()
const containerRef = useRef<HTMLDivElement>(null)
useEffect(() => {
if (!containerRef.current) return
// Clean up previous instance
if (artalkRef.current) {
artalkRef.current.destroy()
artalkRef.current = undefined
}
// Initialize new instance
artalkRef.current = Artalk.init({
el: containerRef.current,
pageKey: pathname,
pageTitle: title || document.title,
server: 'https://comments.owu.one',
site: 'STARSET Mirror Homepage',
darkMode: document.documentElement.classList.contains('dark'),
useBackendConf: true,
pagination: {
pageSize: 15,
readMore: true,
},
emoticons: true,
})
// Handle dark mode changes
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
if (mutation.attributeName === 'class') {
const isDark = document.documentElement.classList.contains('dark')
artalkRef.current?.setDarkMode(isDark)
}
})
})
observer.observe(document.documentElement, {
attributes: true,
attributeFilter: ['class'],
})
return () => {
observer.disconnect()
artalkRef.current?.destroy()
}
}, [pathname, title])
return (
<div
ref={containerRef}
className="mt-12 p-4 bg-white dark:bg-gray-800 rounded-lg shadow"
aria-label="Comments section"
role="complementary"
/>
)
}
export default Comments

View file

@ -3,6 +3,7 @@ import { useNavigate } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
import { ChevronLeft } from 'lucide-react';
import { Update } from '../utils/updates';
import Comments from './Comments';
interface UpdateDetailProps {
update: Update;
@ -51,6 +52,8 @@ const UpdateDetail: React.FC<UpdateDetailProps> = ({ update, content }) => {
{update.summary}
</p>
)}
<Comments title={update.title} />
</article>
</div>
);

View file

@ -8,11 +8,12 @@ import { useUpdates, Update } from '../utils/updates';
const UpdateDetailPage: React.FC = () => {
const { id } = useParams<{ id: string }>();
const { i18n, t } = useTranslation();
const { getAllUpdates } = useUpdates();
const { data: allUpdates = [], isLoading } = useUpdates();
const [update, setUpdate] = useState<Update | null>(null);
const [content, setContent] = useState<string | null>(null);
useEffect(() => {
const fetchUpdateData = async () => {
if (!id) {
setUpdate(null);
@ -21,8 +22,6 @@ const UpdateDetailPage: React.FC = () => {
}
try {
// 获取所有更新条目
const allUpdates = await getAllUpdates();
// 查找对应 id 的更新条目
const foundUpdate = allUpdates.find(u => u.id === id);
@ -48,11 +47,19 @@ const UpdateDetailPage: React.FC = () => {
const mdPath = `/data/${i18n.language}/updates/${year}/${foundUpdate.id}.md`;
const response = await fetch(mdPath);
if (!response.ok) {
throw new Error('Markdown file not found');
// 检查响应状态和内容类型
const contentType = response.headers.get('content-type');
if (!response.ok || !contentType || !contentType.includes('text/markdown')) {
throw new Error('Markdown file not found or invalid');
}
const mdText = await response.text();
// 简单验证内容是否看起来像 markdown
if (mdText.includes('<script') || mdText.includes('<meta')) {
throw new Error('Invalid markdown content');
}
// 将 Markdown 转换为 HTML
setContent(marked(mdText));
} catch (error) {
@ -60,14 +67,25 @@ const UpdateDetailPage: React.FC = () => {
setContent(foundUpdate.summary);
}
} catch (error) {
console.error('Failed to fetch update data:', error);
setUpdate(null);
setContent(null);
}
};
fetchUpdateData();
}, [id, i18n.language, getAllUpdates]);
}, [id, i18n.language, allUpdates]);
if (isLoading) {
return (
<div className="min-h-screen flex items-center justify-center">
<div className="text-center">
<h2 className="text-2xl font-semibold text-gray-900 dark:text-white mb-2">
{t('common.loading')}
</h2>
</div>
</div>
);
}
if (!update) {
return (

View file

@ -1,6 +1,6 @@
import { MdVerified, MdHome } from 'react-icons/md';
import { AiFillBilibili } from 'react-icons/ai';
import { SiNeteasecloudmusic, SiTencentqq, SiYoutube, SiForgejo } from 'react-icons/si';
import { SiNeteasecloudmusic, SiTencentqq, SiYoutube, SiForgejo, SiBluesky } from 'react-icons/si';
import { PiFediverseLogo } from 'react-icons/pi';
import { FaTwitter, FaDiscord, FaWeibo } from 'react-icons/fa';
@ -15,7 +15,8 @@ const iconMap = {
Discord: FaDiscord,
Forgejo: SiForgejo,
Weibo: FaWeibo,
Home: MdHome
Home: MdHome,
Bluesky: SiBluesky
};
export default iconMap;

View file

@ -131,6 +131,7 @@ export const useUpdates = (page: number = 1, pageSize: number = 10) => {
return {
getPaginatedUpdates,
data: allUpdates,
isLoading,
error
};