diff --git a/blog.config.js b/blog.config.js
index 2641ca33..8da9becd 100644
--- a/blog.config.js
+++ b/blog.config.js
@@ -69,6 +69,9 @@ const BLOG = {
// 樱花飘落特效
SAKURA: process.env.NEXT_PUBLIC_SAKURA || false, // 开关
+ // 星空雨特效 黑夜模式才会生效
+ STARRY_SKY: process.env.NEXT_PUBLIC_STARRY_SKY || false, // 开关
+
// 悬浮挂件
WIDGET_PET: process.env.NEXT_PUBLIC_WIDGET_PET || true, // 是否显示宠物挂件
WIDGET_PET_LINK: 'https://cdn.jsdelivr.net/npm/live2d-widget-model-wanko@1.0.5/assets/wanko.model.json', // 挂件模型地址 @see https://github.com/xiazeyu/live2d-widget-models
diff --git a/components/StarrySky.js b/components/StarrySky.js
new file mode 100644
index 00000000..045dd533
--- /dev/null
+++ b/components/StarrySky.js
@@ -0,0 +1,133 @@
+/* eslint-disable */
+/**
+ * https://codepen.io/juliangarnier/pen/gmOwJX
+ * custom by hexo-theme-yun @YunYouJun
+ */
+import React from 'react'
+
+export const StarrySky = () => {
+ React.useEffect(() => {
+ dark()
+ }, [])
+ return (
+
+
+
+ )
+}
+
+/**
+ * 创建星空雨
+ * @param config
+ */
+function dark() {
+ window.requestAnimationFrame =
+ window.requestAnimationFrame ||
+ window.mozRequestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ window.msRequestAnimationFrame
+ var n,
+ e,
+ i,
+ h,
+ t = 0.05,
+ s = document.getElementById('starry-sky-vixcity'),
+ o = !0,
+ a = '180,184,240',
+ r = '226,225,142',
+ d = '226,225,224',
+ c = []
+ function f() {
+ ;(n = window.innerWidth),
+ (e = window.innerHeight),
+ (i = 0.216 * n),
+ s.setAttribute('width', n),
+ s.setAttribute('height', e)
+ }
+ function u() {
+ h.clearRect(0, 0, n, e)
+ for (var t = c.length, i = 0; i < t; i++) {
+ var s = c[i]
+ s.move(), s.fadeIn(), s.fadeOut(), s.draw()
+ }
+ }
+ function y() {
+ ;(this.reset = function () {
+ ;(this.giant = m(3)),
+ (this.comet = !this.giant && !o && m(10)),
+ (this.x = l(0, n - 10)),
+ (this.y = l(0, e)),
+ (this.r = l(1.1, 2.6)),
+ (this.dx = l(t, 6 * t) + (this.comet + 1 - 1) * t * l(50, 120) + 2 * t),
+ (this.dy = -l(t, 6 * t) - (this.comet + 1 - 1) * t * l(50, 120)),
+ (this.fadingOut = null),
+ (this.fadingIn = !0),
+ (this.opacity = 0),
+ (this.opacityTresh = l(0.2, 1 - 0.4 * (this.comet + 1 - 1))),
+ (this.do = l(5e-4, 0.002) + 0.001 * (this.comet + 1 - 1))
+ }),
+ (this.fadeIn = function () {
+ this.fadingIn &&
+ ((this.fadingIn = !(this.opacity > this.opacityTresh)),
+ (this.opacity += this.do))
+ }),
+ (this.fadeOut = function () {
+ this.fadingOut &&
+ ((this.fadingOut = !(this.opacity < 0)),
+ (this.opacity -= this.do / 2),
+ (this.x > n || this.y < 0) && ((this.fadingOut = !1), this.reset()))
+ }),
+ (this.draw = function () {
+ if ((h.beginPath(), this.giant))
+ (h.fillStyle = 'rgba(' + a + ',' + this.opacity + ')'),
+ h.arc(this.x, this.y, 2, 0, 2 * Math.PI, !1)
+ else if (this.comet) {
+ ;(h.fillStyle = 'rgba(' + d + ',' + this.opacity + ')'),
+ h.arc(this.x, this.y, 1.5, 0, 2 * Math.PI, !1)
+ for (var t = 0; t < 30; t++)
+ (h.fillStyle =
+ 'rgba(' +
+ d +
+ ',' +
+ (this.opacity - (this.opacity / 20) * t) +
+ ')'),
+ h.rect(
+ this.x - (this.dx / 4) * t,
+ this.y - (this.dy / 4) * t - 2,
+ 2,
+ 2
+ ),
+ h.fill()
+ } else
+ (h.fillStyle = 'rgba(' + r + ',' + this.opacity + ')'),
+ h.rect(this.x, this.y, this.r, this.r)
+ h.closePath(), h.fill()
+ }),
+ (this.move = function () {
+ ;(this.x += this.dx),
+ (this.y += this.dy),
+ !1 === this.fadingOut && this.reset(),
+ (this.x > n - n / 4 || this.y < 0) && (this.fadingOut = !0)
+ }),
+ setTimeout(function () {
+ o = !1
+ }, 50)
+ }
+ function m(t) {
+ return Math.floor(1e3 * Math.random()) + 1 < 10 * t
+ }
+ function l(t, i) {
+ return Math.random() * (i - t) + t
+ }
+ f(),
+ window.addEventListener('resize', f, !1),
+ (function () {
+ h = s.getContext('2d')
+ for (var t = 0; t < i; t++) (c[t] = new y()), c[t].reset()
+ u()
+ })(),
+ (function t() {
+ document.getElementsByTagName('html')[0].className == 'dark' && u(),
+ window.requestAnimationFrame(t)
+ })()
+}
diff --git a/pages/_app.js b/pages/_app.js
index 0f196386..099b8514 100644
--- a/pages/_app.js
+++ b/pages/_app.js
@@ -26,6 +26,7 @@ import { DebugPanel } from '@/components/DebugPanel'
import { ThemeSwitch } from '@/components/ThemeSwitch'
import { Fireworks } from '@/components/Fireworks'
import { Sakura } from '@/components/Sakura'
+import { StarrySky } from '@/components/StarrySky'
import MusicPlayer from '@/components/MusicPlayer'
const Ackee = dynamic(() => import('@/components/Ackee'), { ssr: false })
@@ -50,6 +51,7 @@ const MyApp = ({ Component, pageProps }) => {
{BLOG.FACEBOOK_APP_ID && BLOG.FACEBOOK_PAGE_ID && }
{JSON.parse(BLOG.FIREWORKS) && }
{JSON.parse(BLOG.SAKURA) && }
+ {JSON.parse(BLOG.STARRY_SKY) && }
{JSON.parse(BLOG.MUSIC_PLAYER) && }
>
diff --git a/themes/matery/components/ArticleInfo.js b/themes/matery/components/ArticleInfo.js
index 666a0b0c..da62ac81 100644
--- a/themes/matery/components/ArticleInfo.js
+++ b/themes/matery/components/ArticleInfo.js
@@ -29,7 +29,7 @@ export const ArticleInfo = (props) => {
passHref
className="cursor-pointer whitespace-nowrap">
- 发布日期:{date}
+ 发布日期:{date}