diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000000..76f0cee50ad --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "themes/endspace"] + path = themes/endspace + url = https://github.com/cloud-oc/endspace.git + branch = theme \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index d27b91bbe12..a9eafdda0a5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,8 @@ FROM base AS deps # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. RUN apk add --no-cache libc6-compat WORKDIR /app -COPY package.json ./ +COPY package.json yarn.lock ./ +COPY patches ./patches RUN yarn install --frozen-lockfile # 2. Rebuild the source code only when needed @@ -45,4 +46,4 @@ EXPOSE 3000 # Uncomment the following line in case you want to disable telemetry. # ENV NEXT_TELEMETRY_DISABLED 1 -CMD ["node", "server.js"] \ No newline at end of file +CMD ["node", "server.js"] diff --git a/blog.config.js b/blog.config.js index 85d3c65be22..208443807ea 100644 --- a/blog.config.js +++ b/blog.config.js @@ -6,22 +6,22 @@ const BLOG = { NOTION_PAGE_ID: process.env.NOTION_PAGE_ID || '02ab3b8678004aa69e9e415905ef32a5,en:7c1d570661754c8fbc568e00a01fd70e', - THEME: process.env.NEXT_PUBLIC_THEME || 'simple', // 当前主题,在themes文件夹下可找到所有支持的主题;主题名称就是文件夹名,例如 claude,endspace,example,fukasawa,fuwari,gitbook,heo,hexo,landing,matery,medium,next,nobelium,plog,simple + THEME: process.env.NEXT_PUBLIC_THEME || 'endspace', // 当前主题,在themes文件夹下可找到所有支持的主题;主题名称就是文件夹名,例如 example,fukasawa,gitbook,heo,hexo,landing,matery,medium,next,nobelium,plog,simple LANG: process.env.NEXT_PUBLIC_LANG || 'zh-CN', // e.g 'zh-CN','en-US' see /lib/lang.js for more. - SINCE: process.env.NEXT_PUBLIC_SINCE || 2021, // e.g if leave this empty, current year will be used. + SINCE: process.env.NEXT_PUBLIC_SINCE || 2024, // e.g if leave this empty, current year will be used. PSEUDO_STATIC: process.env.NEXT_PUBLIC_PSEUDO_STATIC || false, // 伪静态路径,开启后所有文章URL都以 .html 结尾。 NEXT_REVALIDATE_SECOND: process.env.NEXT_PUBLIC_REVALIDATE_SECOND || 60, // 更新缓存间隔 单位(秒);即每个页面有60秒的纯静态期、此期间无论多少次访问都不会抓取notion数据;调大该值有助于节省Vercel资源、同时提升访问速率,但也会使文章更新有延迟。 APPEARANCE: process.env.NEXT_PUBLIC_APPEARANCE || 'light', // ['light', 'dark', 'auto'], // light 日间模式 , dark夜间模式, auto根据时间和主题自动夜间模式 APPEARANCE_DARK_TIME: process.env.NEXT_PUBLIC_APPEARANCE_DARK_TIME || [18, 6], // 夜间模式起至时间,false时关闭根据时间自动切换夜间模式 - AUTHOR: process.env.NEXT_PUBLIC_AUTHOR || 'NotionNext', // 您的昵称 例如 tangly1024 - BIO: process.env.NEXT_PUBLIC_BIO || '一个普通的干饭人🍚', // 作者简介 - LINK: process.env.NEXT_PUBLIC_LINK || 'https://tangly1024.com', // 网站地址 + AUTHOR: process.env.NEXT_PUBLIC_AUTHOR || 'Cloud09', // 您的昵称 例如 tangly1024 + BIO: process.env.NEXT_PUBLIC_BIO || '∞', // 作者简介 + LINK: process.env.NEXT_PUBLIC_LINK || 'https://cloud09.space', // 网站地址 KEYWORDS: process.env.NEXT_PUBLIC_KEYWORD || 'Notion, 博客', // 网站关键词 英文逗号隔开 BLOG_FAVICON: process.env.NEXT_PUBLIC_FAVICON || '/favicon.ico', // blog favicon 配置, 默认使用 /public/favicon.ico,支持在线图片,如 https://img.imesong.com/favicon.png - BEI_AN: process.env.NEXT_PUBLIC_BEI_AN || '', // 备案号 闽ICP备XXXXXX - BEI_AN_LINK: process.env.NEXT_PUBLIC_BEI_AN_LINK || 'https://beian.miit.gov.cn/', // 备案查询链接,如果用了萌备等备案请在这里填写 + BEI_AN: process.env.NEXT_PUBLIC_BEI_AN || '萌ICP备20250928号', // 备案号 闽ICP备XXXXXX + BEI_AN_LINK: process.env.NEXT_PUBLIC_BEI_AN_LINK || 'https://icp.gov.moe/?keyword=20250928', // 备案查询链接,如果用了萌备等备案请在这里填写 BEI_AN_GONGAN: process.env.NEXT_PUBLIC_BEI_AN_GONGAN || '', // 公安备案号,例如 '浙公网安备3xxxxxxxx8号' // RSS订阅 @@ -68,7 +68,7 @@ const BLOG = { // 欢迎语打字效果,Hexo,Matery主题支持, 英文逗号隔开多个欢迎语。 GREETING_WORDS: process.env.NEXT_PUBLIC_GREETING_WORDS || - 'Hi,我是一个程序员, Hi,我是一个打工人,Hi,我是一个干饭人,欢迎来到我的博客🎉', + '', // uuid重定向至 slug UUID_REDIRECT: process.env.UUID_REDIRECT || false diff --git a/components/NotionPage.js b/components/NotionPage.js index d678b03d533..573c89b55ba 100644 --- a/components/NotionPage.js +++ b/components/NotionPage.js @@ -202,6 +202,7 @@ const autoScrollToHash = () => { * @returns */ const mapPageUrl = id => { + if (typeof id !== 'string' || !id) return '/' // return 'https://www.notion.so/' + id.replace(/-/g, '') return '/' + id.replace(/-/g, '') } diff --git a/conf/animation.config.js b/conf/animation.config.js index 0614c2b42f8..bd85252daf1 100644 --- a/conf/animation.config.js +++ b/conf/animation.config.js @@ -16,13 +16,13 @@ module.exports = { MOUSE_FOLLOW: process.env.NEXT_PUBLIC_MOUSE_FOLLOW || false, // 开关 // 这两个只有在鼠标跟随特效开启时才生效 // 鼠标类型 1:路劲散点 2:下降散点 3:上升散点 4:边缘向鼠标移动散点 5:跟踪转圈散点 6:路径线条 7:聚集散点 8:聚集网格 9:移动网格 10:上升粒子 11:转圈随机颜色粒子 12:圆锥放射跟随蓝色粒子 - MOUSE_FOLLOW_EFFECT_TYPE: 11, // 1-12 - MOUSE_FOLLOW_EFFECT_COLOR: '#ef672a', // 鼠标点击特效颜色 #xxxxxx 或者 rgba(r,g,b,a) + MOUSE_FOLLOW_EFFECT_TYPE: 1, // 1-12 + MOUSE_FOLLOW_EFFECT_COLOR: '#ededed', // 鼠标点击特效颜色 #xxxxxx 或者 rgba(r,g,b,a) // 樱花飘落特效 SAKURA: process.env.NEXT_PUBLIC_SAKURA || false, // 开关 // 漂浮线段特效 - NEST: process.env.NEXT_PUBLIC_NEST || false, // 开关 + NEST: process.env.NEXT_PUBLIC_NEST || true, // 开关 // 动态彩带特效 FLUTTERINGRIBBON: process.env.NEXT_PUBLIC_FLUTTERINGRIBBON || false, // 开关 // 静态彩带特效 diff --git a/conf/comment.config.js b/conf/comment.config.js index 40b754f44fd..7940936a0de 100644 --- a/conf/comment.config.js +++ b/conf/comment.config.js @@ -16,7 +16,7 @@ module.exports = { 'https://cdnjs.cloudflare.com/ajax/libs/artalk/2.5.5/Artalk.css', // ArtalkServert css cdn // twikoo - COMMENT_TWIKOO_ENV_ID: process.env.NEXT_PUBLIC_COMMENT_ENV_ID || '', // TWIKOO后端地址 腾讯云环境填envId;Vercel环境填域名,教程:https://tangly1024.com/article/notionnext-twikoo + COMMENT_TWIKOO_ENV_ID: process.env.NEXT_PUBLIC_COMMENT_ENV_ID || 'https://comment.cloud09.space', // TWIKOO后端地址 腾讯云环境填envId;Vercel环境填域名,教程:https://tangly1024.com/article/notionnext-twikoo COMMENT_TWIKOO_COUNT_ENABLE: process.env.NEXT_PUBLIC_COMMENT_TWIKOO_COUNT_ENABLE || false, // 博客列表是否显示评论数 COMMENT_TWIKOO_CDN_URL: diff --git a/conf/contact.config.js b/conf/contact.config.js index 2784e3600b1..943f8a66698 100644 --- a/conf/contact.config.js +++ b/conf/contact.config.js @@ -3,21 +3,15 @@ */ module.exports = { // 社交链接,不需要可留空白,例如 CONTACT_WEIBO:'' - CONTACT_EMAIL: - (process.env.NEXT_PUBLIC_CONTACT_EMAIL && - btoa( - unescape(encodeURIComponent(process.env.NEXT_PUBLIC_CONTACT_EMAIL)) - )) || - '', // 邮箱地址 例如mail@tangly1024.com - CONTACT_WEIBO: process.env.NEXT_PUBLIC_CONTACT_WEIBO || '', // 你的微博个人主页 - CONTACT_TWITTER: process.env.NEXT_PUBLIC_CONTACT_TWITTER || '', // 你的twitter个人主页 - CONTACT_GITHUB: process.env.NEXT_PUBLIC_CONTACT_GITHUB || '', // 你的github个人主页 例如 https://github.com/tangly1024 - CONTACT_TELEGRAM: process.env.NEXT_PUBLIC_CONTACT_TELEGRAM || '', // 你的telegram 地址 例如 https://t.me/tangly_1024 + CONTACT_WEIBO: process.env.NEXT_PUBLIC_CONTACT_WEIBO || 'https://weibo.com/cloud09', // 你的微博个人主页 + CONTACT_TWITTER: process.env.NEXT_PUBLIC_CONTACT_TWITTER || 'https://x.com/Cloud09Official', // 你的twitter个人主页 + CONTACT_GITHUB: process.env.NEXT_PUBLIC_CONTACT_GITHUB || 'https://github.com/cloud-oc', // 你的github个人主页 例如 https://github.com/tangly1024 + CONTACT_TELEGRAM: process.env.NEXT_PUBLIC_CONTACT_TELEGRAM || 'https://t.me/cloud_oc', // 你的telegram 地址 例如 https://t.me/tangly_1024 CONTACT_LINKEDIN: process.env.NEXT_PUBLIC_CONTACT_LINKEDIN || '', // 你的linkedIn 首页 CONTACT_INSTAGRAM: process.env.NEXT_PUBLIC_CONTACT_INSTAGRAM || '', // 您的instagram地址 - CONTACT_BILIBILI: process.env.NEXT_PUBLIC_CONTACT_BILIBILI || '', // B站主页 + CONTACT_BILIBILI: process.env.NEXT_PUBLIC_CONTACT_BILIBILI || 'https://space.bilibili.com/350267607', // B站主页 CONTACT_YOUTUBE: process.env.NEXT_PUBLIC_CONTACT_YOUTUBE || '', // Youtube主页 CONTACT_XIAOHONGSHU: process.env.NEXT_PUBLIC_CONTACT_XIAOHONGSHU || '', // 小红书主页 CONTACT_ZHISHIXINGQIU: process.env.NEXT_PUBLIC_CONTACT_ZHISHIXINGQIU || '', // 知识星球 CONTACT_WEHCHAT_PUBLIC: process.env.NEXT_PUBLIC_CONTACT_WEHCHAT_PUBLIC || '' // 微信公众号 格式:https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=【xxxxxx】==#wechat_redirect -} + } diff --git a/conf/image.config.js b/conf/image.config.js index 525b36711fa..620b5be8527 100644 --- a/conf/image.config.js +++ b/conf/image.config.js @@ -9,7 +9,7 @@ module.exports = { IMAGE_COMPRESS_WIDTH: process.env.NEXT_PUBLIC_IMAGE_COMPRESS_WIDTH || 1080, // 图片压缩宽度默认值,作用于博客封面和文章内容 越小加载图片越快 IMAGE_ZOOM_IN_WIDTH: process.env.NEXT_PUBLIC_IMAGE_ZOOM_IN_WIDTH || 1920, // 文章图片点击放大后的画质宽度,不代表在网页中的实际展示宽度 IMAGE_COMPRESS_QUALITY: process.env.NEXT_PUBLIC_IMAGE_COMPRESS_QUALITY || 80, // 图片压缩质量 0-100,数值越小文件越小但质量越低 - RANDOM_IMAGE_URL: process.env.NEXT_PUBLIC_RANDOM_IMAGE_URL || '', // 随机图片API,如果未配置下面的关键字,主页封面,头像,文章封面图都会被替换为随机图片 + RANDOM_IMAGE_URL: process.env.NEXT_PUBLIC_RANDOM_IMAGE_URL || 'https://moe.jitsu.top/img/?sort=pc', // 随机图片API,如果未配置下面的关键字,主页封面,头像,文章封面图都会被替换为随机图片 RANDOM_IMAGE_REPLACE_TEXT: process.env.NEXT_PUBLIC_RANDOM_IMAGE_NOT_REPLACE_TEXT || 'images.unsplash.com', // 触发替换图片的 url 关键字(多个支持用英文逗号分开),只有图片地址中包含此关键字才会替换为上方随机图片url diff --git a/conf/post.config.js b/conf/post.config.js index 9f317d09c81..837d8ad28d6 100644 --- a/conf/post.config.js +++ b/conf/post.config.js @@ -13,7 +13,7 @@ module.exports = { process.env.NEXT_PUBLIC_NOTION_SCHEDULE_PUBLISH || true, // 按照文章的发布时间字段,控制自动上下架 // 分享条 - POST_SHARE_BAR_ENABLE: process.env.NEXT_PUBLIC_POST_SHARE_BAR || 'true', //文章底部分享条开关 + POST_SHARE_BAR_ENABLE: process.env.NEXT_PUBLIC_POST_SHARE_BAR || 'false', //文章底部分享条开关 POSTS_SHARE_SERVICES: process.env.NEXT_PUBLIC_POST_SHARE_SERVICES || 'link,wechat,qq,weibo,email,facebook,twitter,telegram,messenger,line,reddit,whatsapp,linkedin,csdn,juejin', // 分享的服務,按顺序显示,逗号隔开 @@ -40,7 +40,7 @@ module.exports = { process.env.NEXT_PUBLIC_ARTICLE_EXPIRATION_ENABLED || 'false', // 是否启用文章过期提醒 POST_WAITING_TIME_FOR_404: - process.env.NEXT_PUBLIC_POST_WAITING_TIME_FOR_404 || '8', // 文章加载超时时间,单位秒;超时后跳转到404页面 + process.env.NEXT_PUBLIC_POST_WAITING_TIME_FOR_404 || '9', // 文章加载超时时间,单位秒;超时后跳转到404页面 // 标签相关 TAG_SORT_BY_COUNT: true, // 标签是否按照文章数量倒序排列,文章多的标签排在前。 diff --git a/conf/right-click-menu.js b/conf/right-click-menu.js index 3198bc232b4..bba0eb357e9 100644 --- a/conf/right-click-menu.js +++ b/conf/right-click-menu.js @@ -3,16 +3,16 @@ */ module.exports = { CUSTOM_RIGHT_CLICK_CONTEXT_MENU: - process.env.NEXT_PUBLIC_CUSTOM_RIGHT_CLICK_CONTEXT_MENU || true, // 自定义右键菜单,覆盖系统菜单 + process.env.NEXT_PUBLIC_CUSTOM_RIGHT_CLICK_CONTEXT_MENU || false, // 自定义右键菜单,覆盖系统菜单 CUSTOM_RIGHT_CLICK_CONTEXT_MENU_THEME_SWITCH: process.env.NEXT_PUBLIC_CUSTOM_RIGHT_CLICK_CONTEXT_MENU_THEME_SWITCH || - true, // 是否显示切换主题 + false, // 是否显示切换主题 CUSTOM_RIGHT_CLICK_CONTEXT_MENU_DARK_MODE: - process.env.NEXT_PUBLIC_CUSTOM_RIGHT_CLICK_CONTEXT_MENU_DARK_MODE || true, // 是否显示深色模式 + process.env.NEXT_PUBLIC_CUSTOM_RIGHT_CLICK_CONTEXT_MENU_DARK_MODE || false, // 是否显示深色模式 CUSTOM_RIGHT_CLICK_CONTEXT_MENU_SHARE_LINK: - process.env.NEXT_PUBLIC_CUSTOM_RIGHT_CLICK_CONTEXT_MENU_SHARE_LINK || true, // 是否显示分享链接 + process.env.NEXT_PUBLIC_CUSTOM_RIGHT_CLICK_CONTEXT_MENU_SHARE_LINK || false, // 是否显示分享链接 CUSTOM_RIGHT_CLICK_CONTEXT_MENU_RANDOM_POST: - process.env.NEXT_PUBLIC_CUSTOM_RIGHT_CLICK_CONTEXT_MENU_RANDOM_POST || true, // 是否显示随机博客 + process.env.NEXT_PUBLIC_CUSTOM_RIGHT_CLICK_CONTEXT_MENU_RANDOM_POST || false, // 是否显示随机博客 CUSTOM_RIGHT_CLICK_CONTEXT_MENU_CATEGORY: process.env.NEXT_PUBLIC_CUSTOM_RIGHT_CLICK_CONTEXT_MENU_CATEGORY || true, // 是否显示分类 CUSTOM_RIGHT_CLICK_CONTEXT_MENU_TAG: diff --git a/conf/widget.config.js b/conf/widget.config.js index 4e207451c43..ea730d850ac 100644 --- a/conf/widget.config.js +++ b/conf/widget.config.js @@ -15,18 +15,18 @@ module.exports = { DIFY_CHATBOT_TOKEN: process.env.NEXT_PUBLIC_DIFY_CHATBOT_TOKEN || '', // 悬浮挂件 - WIDGET_PET: process.env.NEXT_PUBLIC_WIDGET_PET || true, // 是否显示宠物挂件 + WIDGET_PET: process.env.NEXT_PUBLIC_WIDGET_PET || false, // 是否显示宠物挂件 WIDGET_PET_LINK: process.env.NEXT_PUBLIC_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 + 'https://raw.githubusercontent.com/imuncle/live2d/master/model/illyasviel/illyasviel.model.json', // 挂件模型地址 @see https://github.com/xiazeyu/live2d-widget-models WIDGET_PET_SWITCH_THEME: - process.env.NEXT_PUBLIC_WIDGET_PET_SWITCH_THEME || true, // 点击宠物挂件切换博客主题 + process.env.NEXT_PUBLIC_WIDGET_PET_SWITCH_THEME || false, // 点击宠物挂件切换博客主题 SPOILER_TEXT_TAG: process.env.NEXT_PUBLIC_SPOILER_TEXT_TAG || '', // Spoiler文本隐藏功能,如Notion中 [sp]希望被spoiler的文字[sp],填入[sp] 即可 // 音乐播放插件 - MUSIC_PLAYER: process.env.NEXT_PUBLIC_MUSIC_PLAYER || false, // 是否使用音乐播放插件 - MUSIC_PLAYER_VISIBLE: process.env.NEXT_PUBLIC_MUSIC_PLAYER_VISIBLE || true, // 是否在左下角显示播放和切换,如果使用播放器,打开自动播放再隐藏,就会以类似背景音乐的方式播放,无法取消和暂停 + MUSIC_PLAYER: process.env.NEXT_PUBLIC_MUSIC_PLAYER || true, // 是否使用音乐播放插件 + MUSIC_PLAYER_VISIBLE: process.env.NEXT_PUBLIC_MUSIC_PLAYER_VISIBLE || false, // 是否在左下角显示播放和切换,如果使用播放器,打开自动播放再隐藏,就会以类似背景音乐的方式播放,无法取消和暂停 MUSIC_PLAYER_AUTO_PLAY: process.env.NEXT_PUBLIC_MUSIC_PLAYER_AUTO_PLAY || true, // 是否自动播放,不过自动播放时常不生效(移动设备不支持自动播放) MUSIC_PLAYER_LRC_TYPE: process.env.NEXT_PUBLIC_MUSIC_PLAYER_LRC_TYPE || '0', // 歌词显示类型,可选值: 3 | 1 | 0(0:禁用 lrc 歌词,1:lrc 格式的字符串,3:lrc 文件 url)(前提是有配置歌词路径,对 meting 无效) @@ -37,18 +37,862 @@ module.exports = { MUSIC_PLAYER_AUDIO_LIST: [ // 示例音乐列表。除了以下配置外,还可配置歌词,具体配置项看此文档 https://aplayer.js.org/#/zh-Hans/ { - name: '风を共に舞う気持ち', - artist: 'Falcom Sound Team jdk', - url: 'https://music.163.com/song/media/outer/url?id=731419.mp3', - cover: - 'https://p2.music.126.net/kn6ugISTonvqJh3LHLaPtQ==/599233837187278.jpg' + name: 'Touch of the Law', + artist: '塞壬唱片-MSR / Alec Justice / Echos', + url: 'http://music.163.com/song/media/outer/url?id=2700386309.mp3', + cover: 'http://p1.music.126.net/ggCZGLbtzSBr2SL2QS1opw==/109951170928386693.jpg' }, { - name: '王都グランセル', - artist: 'Falcom Sound Team jdk', - url: 'https://music.163.com/song/media/outer/url?id=731355.mp3', - cover: - 'https://p1.music.126.net/kn6ugISTonvqJh3LHLaPtQ==/599233837187278.jpg' + 名称 : 'Halo Universalization', + artist: '塞壬唱片-MSR / Erik Castro / Robert Wolf', + url: 'http://music.163.com/song/media/outer/url?id=2700384134.mp3', + cover: 'http://p1.music.126.net/ggCZGLbtzSBr2SL2QS1opw==/109951170928386693.jpg' + }, + { + name: 'The Pilgrimage', + artist: '塞壬唱片-MSR / BaoUner', + url: 'http://music.163.com/song/media/outer/url?id=2700386310.mp3', + cover: 'http://p1.music.126.net/ggCZGLbtzSBr2SL2QS1opw==/109951170928386693.jpg' + }, + { + name: 'Faith Enlightenment', + artist: '塞壬唱片-MSR / Erik Castro / Robert Wolf / David Lin', + url: 'http://music.163.com/song/media/outer/url?id=2700386311.mp3', + cover: 'http://p1.music.126.net/ggCZGLbtzSBr2SL2QS1opw==/109951170928386693.jpg' + }, + { + name: 'The Birth', + artist: '塞壬唱片-MSR / BaoUner', + url: 'http://music.163.com/song/media/outer/url?id=2700384135.mp3', + cover: 'http://p1.music.126.net/ggCZGLbtzSBr2SL2QS1opw==/109951170928386693.jpg' + }, + { + name: 'Underneath the Sanctuary', + artist: '塞壬唱片-MSR / Adam Gubman', + url: 'http://music.163.com/song/media/outer/url?id=2700386312.mp3', + cover: 'http://p1.music.126.net/ggCZGLbtzSBr2SL2QS1opw==/109951170928386693.jpg' + }, + { + name: 'Somniomancer [null set]', + artist: '塞壬唱片-MSR / Crywolf', + url: 'http://music.163.com/song/media/outer/url?id=2700386313.mp3', + cover: 'http://p1.music.126.net/ggCZGLbtzSBr2SL2QS1opw==/109951170928386693.jpg' + }, + { + name: '夏ノ雪', + artist: 'MONACA / 西村隆文', + url: 'http://music.163.com/song/media/outer/url?id=2002645767.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: '光ノ風吹ク丘', + artist: 'MONACA / 西村隆文 / Oliver Good', + url: 'http://music.163.com/song/media/outer/url?id=2002647643.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'イニシエノウタ/ポポル', + artist: 'MONACA / 西村隆文 / 瀬尾祥太郎', + url: 'http://music.163.com/song/media/outer/url?id=2002647645.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'オバアチャン', + artist: 'MONACA / 西村隆文 / 帆足圭吾', + url: 'http://music.163.com/song/media/outer/url?id=2002647647.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: '愚カシイ機械', + artist: 'MONACA / 西村隆文 / 高橋邦幸', + url: 'http://music.163.com/song/media/outer/url?id=2002645769.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'ヨナ/Ver.弦', + artist: 'MONACA / 西村隆文 / 帆足圭吾', + url: 'http://music.163.com/song/media/outer/url?id=2002645770.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: '仮面ノ誉', + artist: 'MONACA / 西村隆文 / 高橋邦幸', + url: 'http://music.163.com/song/media/outer/url?id=2002645772.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: '喪失/Ver.ピアノ', + artist: 'MONACA / 西村隆文 / 高橋邦幸', + url: 'http://music.163.com/song/media/outer/url?id=2002645774.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'Ashes of Dreams/English Version', + artist: 'MONACA / 西村隆文', + url: 'http://music.163.com/song/media/outer/url?id=2002647649.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'イニシエノウタ/デボル', + artist: 'MONACA / 西村隆文 / 瀬尾祥太郎',  + url: 'http://music.163.com/song/media/outer/url?id=2002647650.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + + + + + + + { + name: '最終兵器', + artist: 'MONACA / 西村隆文 / 帆足圭吾', + url: 'http://music.163.com/song/media/outer/url?id=2002645776.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'ハルア', + artist: 'MONACA / 西村隆文 / 帆足圭吾', + url: 'http://music.163.com/song/media/outer/url?id=2002647651.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: '失ワレタ森', + artist: 'MONACA / 西村隆文 / 瀬尾祥太郎', + url: 'http://music.163.com/song/media/outer/url?id=2002647652.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: '彼ノ夢', + artist: 'MONACA / 西村隆文 / 瀬尾祥太郎', + url: 'http://music.163.com/song/media/outer/url?id=2002645778.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: '此ノ夢', + artist: 'MONACA / 西村隆文 / 瀬尾祥太郎', + url: 'http://music.163.com/song/media/outer/url?id=2002647653.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: '喪失/Ver.重奏', + artist: 'MONACA / 西村隆文 / 高橋邦幸', + url: 'http://music.163.com/song/media/outer/url?id=2002645779.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'カイネ/救済', + artist: 'MONACA / 西村隆文 / 帆足圭吾', + url: 'http://music.163.com/song/media/outer/url?id=2002647654.mp3',  + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'ヨナ/Ver.ピアノ', + artist: 'MONACA / 西村隆文 / 帆足圭吾', + url: 'http://music.163.com/song/media/outer/url?id=2002647655.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'Ashes of Dreams/Nouveau-FR Version', + artist: 'MONACA / 西村隆文', + url: 'http://music.163.com/song/media/outer/url?id=2002645781.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'Ashes of Dreams/Nuadhaich-GER Version', + artist: 'MONACA / 西村隆文', + url: 'http://music.163.com/song/media/outer/url?id=2002647656.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'Ashes of Dreams/Lost Music Box Version', + artist: 'MONACA / 西村隆文', + url: 'http://music.163.com/song/media/outer/url?id=2002645782.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: '休息', + artist: 'MONACA / 西村隆文 / 瀬尾祥太郎', + url: 'http://music.163.com/song/media/outer/url?id=2002647659.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'イニシエノウタ/虚ロナ夢', + artist: 'MONACA / 西村隆文 / 帆足圭吾', + url: 'http://music.163.com/song/media/outer/url?id=2002647660.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: '喪失/Ver.オルゴール', + artist: 'MONACA / 西村隆文 / 瀬尾祥太郎', + url: 'http://music.163.com/song/media/outer/url?id=2002645783.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: '魔王ノ城', + artist: 'MONACA / 西村隆文 / 高橋邦幸', + url: 'http://music.163.com/song/media/outer/url?id=2002645784.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: '儚キ者達ノ舞踏', + artist: 'MONACA / 西村隆文 / 高橋邦幸', + url: 'http://music.163.com/song/media/outer/url?id=2002645785.mp3',  + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'イニシエノウタ/運命', + artist: 'MONACA / 西村隆文 / 高橋邦幸', + url: 'http://music.163.com/song/media/outer/url?id=2002645786.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'エミール/犠牲', + artist: 'MONACA / 西村隆文 / 高橋邦幸', + url: 'http://music.163.com/song/media/outer/url?id=2002647662.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: '魔王', + artist: 'MONACA / 西村隆文 / 高橋邦幸', + url: 'http://music.163.com/song/media/outer/url?id=2002647663.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'カイネ/逃避',  + artist: 'MONACA / 西村隆文 / 帆足圭吾', + url: 'http://music.163.com/song/media/outer/url?id=2002647666.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: 'Ashes of Dreams/Aratanaru-JP Version', + artist: 'MONACA / 西村隆文', + url: 'http://music.163.com/song/media/outer/url?id=2002645787.mp3', + cover: 'http://p2.music.126.net/ZMqz5sL4U1G4Uiec0bqlrA==/109951168101799354.jpg' + }, + { + name: '穏ヤカナ眠リ', + artist: '岡部啓一', + url: 'http://music.163.com/song/media/outer/url?id=468490565.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: '砂塵ノ記憶', + artist: '高橋邦幸', + url: 'http://music.163.com/song/media/outer/url?id=468490566.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: '遊園施設', + artist: '帆足圭吾', + url: 'http://music.163.com/song/media/outer/url?id=468490569.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: '還ラナイ声/ギター', + artist: '岡部啓一', + url: 'http://music.163.com/song/media/outer/url?id=468490571.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: '澱ンダ祈リ/暁風', + artist: '帆足圭吾 / 岡部啓一', + url: 'http://music.163.com/song/media/outer/url?id=468490573.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: 'エミール/ショップ', + artist: '高橋邦幸 / 石濱翔 / 門脇舞以', + url: 'http://music.163.com/song/media/outer/url?id=468490574.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: '大切ナ時間', + artist: '帆足圭吾 / 石井咲希', + url: 'http://music.163.com/song/media/outer/url?id=468490575.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: '曖昧ナ希望/氷雨', + artist: '帆足圭吾', + url: 'http://music.163.com/song/media/outer/url?id=468490576.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: '遺サレタ場所/遮光', + artist: '岡部啓一', + url: 'http://music.163.com/song/media/outer/url?id=468490579.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: 'パスカル', + artist: '岡部啓一 / 石井咲希', + url: 'http://music.163.com/song/media/outer/url?id=468490582.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: '森ノ王国', + artist: '帆足圭吾', + url: 'http://music.163.com/song/media/outer/url?id=468490583.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: '愚カシイ兵器:乙:甲', + artist: '岡部啓一', + url: 'http://music.163.com/song/media/outer/url?id=468490586.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: '愚カシイ兵器:丙', + artist: '岡部啓一', + url: 'http://music.163.com/song/media/outer/url?id=468490589.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: '曖昧ナ希望/翠雨', + artist: '帆足圭吾', + url: 'http://music.163.com/song/media/outer/url?id=468490598.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: 'イニシエノウタ/贖罪', + artist: '岡部啓一', + url: 'http://music.163.com/song/media/outer/url?id=468490599.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: '澱ンダ祈リ/星空', + artist: '帆足圭吾 / 岡部啓一', + url: 'http://music.163.com/song/media/outer/url?id=468490602.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: '顕現シタ異物', + artist: '岡部啓一 / 帆足圭吾', + url: 'http://music.163.com/song/media/outer/url?id=468490603.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: '「塔」', + artist: '岡部啓一', + url: 'http://music.163.com/song/media/outer/url?id=468490604.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: 'カイネ/救済', + artist: 'MONACA / 岡部啓一', + url: 'http://music.163.com/song/media/outer/url?id=4937739.mp3', + cover: 'https://p1.music.126.net/tet1byB8_pPwwoedxzFKhg==/2356253418376742.jpg' + }, + { + name: 'Weight of the World/壊レタ世界ノ歌', + artist: '河野マリナ', + url: 'http://music.163.com/song/media/outer/url?id=468490592.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: 'Weight of the World (Nouveau-FR Version)', + artist: 'Emi Evans / 岡部啓一', + url: 'http://music.163.com/song/media/outer/url?id=468490607.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: 'Weight of the World/the End of YoRHa', + artist: 'YoRHa', + url: 'http://music.163.com/song/media/outer/url?id=468490608.mp3', + cover: 'https://p2.music.126.net/2mq_C15bHzYnbPX4fZHomw==/109951165543440452.jpg' + }, + { + name: '鳥の詩', + artist: 'Lia', + url: 'https://music.163.com/song/media/outer/url?id=761594.mp3', + cover: 'http://p2.music.126.net/CI_u3SfBgdTIAQtFnn_wnQ==/6040716883009850.jpg' + }, + { + name: 'Memoria-君の赴くままに', + artist: '藤崎わと', + url: 'https://cloud-oc.github.io/Audio-Bed/Music/Memoria-君の赴くままに.m4a', + cover: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQiMiehT3mFTCvo7gRCx6_e9e5DSAm8Q19M7w&s' + }, + { + name: 'モニタリング', + artist: 'DECO*27,初音ミク', + url: 'https://music.163.com/song/media/outer/url?id=2639291583.mp3', + cover: 'https://p2.music.126.net/AyOZCkH55VboMessdJnXGg==/109951170067309376.jpg' + }, + { + name: '妄想感傷代償連盟', + artist: 'DECO*27,初音ミク', + url: 'https://music.163.com/song/media/outer/url?id=432486474.mp3', + cover: 'https://p1.music.126.net/S8Fw1AOhq45Obb_YyThviw==/18495984602893574.jpg' + }, + { + name: 'ラビットホール', + artist: 'DECO*27,初音ミク', + url: 'https://music.163.com/song/media/outer/url?id=2043178301.mp3', + cover: 'https://p1.music.126.net/20QetRSvLjUmyyGF__1ALA==/109951168575689926.jpg' + }, + { + name: 'Come on,sweet death', + artist: 'ARIANNE', + url: 'https://cloud-oc.github.io/Audio-Bed/Music/come on,sweet death.mp3', + cover: 'https://p1.music.126.net/S4Kcgr9CmA_1yM6wbjL3Rg==/109951165354140879.jpg' + }, + { + name: 'Beautiful World', + artist: '宇多田ヒカル', + url: 'https://cloud-oc.github.io/Audio-Bed/Music/Beautiful_World.mp3', + cover: 'https://p1.music.126.net/l3G4LigZnOxFE9lB4bz_LQ==/109951165791860501.jpg' + }, + { + name: '桜流し (2021 Remastered)', + artist: '宇多田ヒカル', + url: 'https://music.163.com/song/media/outer/url?id=1825843935.mp3', + cover: 'https://p1.music.126.net/l3G4LigZnOxFE9lB4bz_LQ==/109951165791860501.jpg' + }, + { + name: 'Beautiful World(Da Capo Version)', + artist: '宇多田ヒカル', + url: 'https://cloud-oc.github.io/Audio-Bed/Music/Beautiful_World(Da_Capo_Version).mp3', + cover: 'https://p1.music.126.net/l3G4LigZnOxFE9lB4bz_LQ==/109951165791860501.jpg' + }, + { + name: 'One Last Kiss', + artist: '宇多田ヒカル', + url: 'https://cloud-oc.github.io/Audio-Bed/Music/One Last Kiss.mp3', + cover: 'https://p1.music.126.net/l3G4LigZnOxFE9lB4bz_LQ==/109951165791860501.jpg' + }, + { + name: 'Merry Christmas Mr. Lawrence', + artist: '坂本龍一', + url: 'https://cloud-oc.github.io/Audio-Bed/Music/Merry Christmas Mr. Lawrence.flac', + cover: 'https://p1.music.126.net/Vnb5M_-BCkEARNVGSF_KKg==/109951167113646412.jpg' + }, + { + name: 'energy flow', + artist: '坂本龍一', + url: 'https://cloud-oc.github.io/Audio-Bed/Music/energy flow.flac', + cover: 'https://p1.music.126.net/92bUIG25fZW2TqOT53dP9w==/109951168429185109.jpg' + }, + { + name: 'Opus - ending', + artist: '坂本龍一', + url: 'http://music.163.com/song/media/outer/url?id=2610262431.mp3', + cover: 'https://p2.music.126.net/YUFj5W_FSTK8euT5xWGr7A==/109951169805864161.jpg' + }, + { + name: 'Let It Be (Remastered 2009)', + artist: 'Beatles', + url: 'https://cloud-oc.github.io/Audio-Bed/Music/Let It Be (Remastered 2009).flac', + cover: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSoPQLBmAd4ABWAtGQRQOyDWVOsiHPFOMRqhw&s' + }, + { + name: 'Gymnopedie No.1', + artist: 'Erik Satie', + url: 'https://music.163.com/song/media/outer/url?id=1436101985.mp3', + cover: 'https://p2.music.126.net/TJn7g2nQLVqjKrKyY73aeg==/109951164857206844.jpg' + }, + { + name: 'Liebestraum No. 3 in A-flat', + artist: 'Arthur Rubinstein', + url: 'https://music.163.com/song/media/outer/url?id=1298576162.mp3', + cover: 'https://p1.music.126.net/zeyFNs7lZmSysEnPd_yoLw==/109951165965837333.jpg' + }, + { + name: 'Liebestraume(Lizt)', + artist: '阿保剛', + url: 'https://music.163.com/song/media/outer/url?id=28802057.mp3', + cover: 'https://p1.music.126.net/xGhMCNqVnRd6NX3y-5lrFQ==/6007731534871573.jpg' + }, + { + name: '爱之梦', + artist: '郎朗', + url: 'https://music.163.com/song/media/outer/url?id=114659.mp3', + cover: 'https://p2.music.126.net/xK887lhrem11-JyATCtWJA==/109951163890328509.jpg' + }, + { + name: '崩坏世界的歌姬 (Movie Ver.)', + artist: '小林未郁', + url: 'https://music.163.com/song/media/outer/url?id=1459722976.mp3', + cover: 'https://p2.music.126.net/2Rcimduy6Oj5Xz6beJDSIg==/3364505581118558.jpg' + }, + { + name: '崩坏世界的歌姬(Chinese Ver.)', + artist: '泠鸢yousa', + url: 'https://music.163.com/song/media/outer/url?id=33682747.mp3', + cover: 'https://p1.music.126.net/XftX_EwaEBhjPgddMv7Lbw==/109951165105147714.jpg' + }, + { + name: 'Da Capo', + artist: 'HOYO-MiX', + url: 'https://music.163.com/song/media/outer/url?id=2026565329.mp3', + cover: 'http://p1.music.126.net/awzv1LpuBJiKTeB7roh_Aw==/109951168434956885.jpg' + }, + { + name: '星间旅行 Interstellar Journey (中文版)', + artist: 'HOYO-MiX,茶理理', + url: 'https://music.163.com/song/media/outer/url?id=2043169389.mp3', + cover: 'http://p2.music.126.net/JaSa3Gt5oaJ77cDfJBR1fg==/109951168575641463.jpg' + }, + { + name: '轻涟 La vaguelette', + artist: 'HOYO-MiX', + url: 'https://music.163.com/song/media/outer/url?id=2100334024.mp3', + cover: 'http://p2.music.126.net/I-cw5yaq4Pz0EL2dZAmq1g==/109951169058808374.jpg' + }, + { + name: 'Moon Halo', + artist: '茶理理,TetraCalyx,Hanser,HOYO-MiX', + url: 'https://music.163.com/song/media/outer/url?id=1859652717.mp3', + cover: 'http://p2.music.126.net/ciLKATqflV2YWSV3ltE2Kw==/109951166159281275.jpg' + }, + { + name: '蒲苇如丝 Lovers\' Oath', + artist: '陈致逸,HOYO-MiX', + url: 'https://music.163.com/song/media/outer/url?id=1861577585.mp3', + cover: 'http://p2.music.126.net/klj1ylCHIDtuINQEXo1WEg==/109951166180599033.jpg' + }, + { + name: 'Regression', + artist: '阿云嘎,HOYO-MiX', + url: 'https://music.163.com/song/media/outer/url?id=1913478990.mp3', + cover: 'http://p1.music.126.net/DbD08enxZN2kDFScDFxcdQ==/109951166957048928.jpg' + }, + { + name: '在银河中孤独摇摆', + artist: '知更鸟,HOYO-MiX,Chevy', + url: 'https://cloud-oc.github.io/Audio-Bed/Music/01 在银河中孤独摇摆 Sway To My Beat In Cosmos.m4a', + cover: 'http://p1.music.126.net/aR4BlDNkA84tFbg8bBpriA==/109951169585655912.jpg' + }, + { + name: '使一颗心免于哀伤', + artist: '知更鸟,HOYO-MiX,Chevy', + url: 'https://cloud-oc.github.io/Audio-Bed/Music/02 使一颗心免于哀伤 If I Can Stop One Heart From Breaking.m4a', + cover: 'http://p1.music.126.net/aR4BlDNkA84tFbg8bBpriA==/109951169585655912.jpg' + }, + { + name: '希望有羽毛和翅膀', + artist: '知更鸟,HOYO-MiX,Chevy', + url: 'https://cloud-oc.github.io/Audio-Bed/Music/03 希望有羽毛和翅膀 Hope Is The Thing With Feathers.m4a', + cover: 'http://p1.music.126.net/aR4BlDNkA84tFbg8bBpriA==/109951169585655912.jpg' + }, + { + name: '若我不曾见过太阳', + artist: '知更鸟,HOYO-MiX,Chevy', + url: 'https://cloud-oc.github.io/Audio-Bed/Music/04 若我不曾见过太阳 Had I Not Seen The Sun.m4a', + cover: 'http://p1.music.126.net/aR4BlDNkA84tFbg8bBpriA==/109951169585655912.jpg' + }, + { + name: '红透晚烟青', + artist: '金玟岐,三Z-STUDIO,HOYO-MiX', + url: 'http://music.163.com/song/media/outer/url?id=2618046004.mp3', + cover: 'https://p1.music.126.net/xZwzMCIG6Tb0RvIf64q2Lg==/109951169878501910.jpg' + }, + { + name: '小停再出发', + artist: '三Z-STUDIO,HOYO-MiX', + url: 'http://music.163.com/song/media/outer/url?id=2644569024.mp3', + cover: 'https://p2.music.126.net/lCNxRyqAuVvIPkuhUXkcdg==/109951170130858980.jpg' + }, + { + name: '晓', + artist: '三Z-STUDIO,HOYO-MiX', + url: 'http://music.163.com/song/media/outer/url?id=2658093531.mp3', + cover: 'https://p1.music.126.net/1q8Nsdd7TIp_KG5_mVg4aw==/109951170280932175.jpg' + }, + { + name: 'Wake Up, Get Up, Get Out There', + artist: 'Lyn', + url: 'http://music.163.com/song/media/outer/url?id=454224827.mp3', + cover: 'https://p1.music.126.net/FmuZirfGmg9FbMy3hkEqAA==/109951165567176149.jpg' + }, + { + name: 'Life Will Change', + artist: 'Lyn', + url: 'http://music.163.com/song/media/outer/url?id=454231736.mp3', + cover: 'https://p1.music.126.net/FmuZirfGmg9FbMy3hkEqAA==/109951165567176149.jpg' + }, + { + name: 'Last Surprise', + artist: 'Lyn', + url: 'http://music.163.com/song/media/outer/url?id=454224836.mp3', + cover: 'https://p1.music.126.net/FmuZirfGmg9FbMy3hkEqAA==/109951165567176149.jpg' + }, + { + name: 'Beneath the Mask', + artist: 'Lyn', + url: 'http://music.163.com/song/media/outer/url?id=454224842.mp3', + cover: 'https://p1.music.126.net/FmuZirfGmg9FbMy3hkEqAA==/109951165567176149.jpg' + }, + { + name: 'Rivers In the Desert', + artist: 'Lyn', + url: 'http://music.163.com/song/media/outer/url?id=454231899.mp3', + cover: 'https://p1.music.126.net/FmuZirfGmg9FbMy3hkEqAA==/109951165567176149.jpg' + }, + { + name: '星と僕らと', + artist: 'Lyn', + url: 'http://music.163.com/song/media/outer/url?id=454224997.mp3', + cover: 'https://p1.music.126.net/FmuZirfGmg9FbMy3hkEqAA==/109951165567176149.jpg' + }, + { + name: 'Full Moon, Full Life', + artist: 'Lotus Juice / 高橋あず美', + url: 'http://music.163.com/song/media/outer/url?id=2123807708.mp3', + cover: 'https://p2.music.126.net/KZ9tA0eVW03mDYGKeIkwEQ==/109951169371891954.jpg' + }, + { + name: 'Want To Be Close -Reload-', + artist: 'アトラスサウンドチーム', + url: 'http://music.163.com/song/media/outer/url?id=2123807711.mp3', + cover: 'https://p2.music.126.net/KZ9tA0eVW03mDYGKeIkwEQ==/109951169371891954.jpg' + }, + { + name: 'When The Moon’s Reaching Out Stars', + artist: '川村ゆみ', + url: 'http://music.163.com/song/media/outer/url?id=403026.mp3', + cover: 'https://p1.music.126.net/1u0epGLkeAEez46pY-sTAw==/737772302249800.jpg' + }, + { + name: 'Mass Destruction -Reload-', + artist: 'アトラスサウンドチーム / Lotus Juice / 高橋あず美 / ATLUS GAME MUSIC', + url: 'http://music.163.com/song/media/outer/url?id=2123802233.mp3', + cover: 'https://p2.music.126.net/KZ9tA0eVW03mDYGKeIkwEQ==/109951169371891954.jpg' + }, + { + name: 'Color Your Night', + artist: 'Lotus Juice / 高橋あず美 / アトラスサウンドチーム', + url: 'http://music.163.com/song/media/outer/url?id=2123807718.mp3', + cover: 'https://p2.music.126.net/KZ9tA0eVW03mDYGKeIkwEQ==/109951169371891954.jpg' + }, + { + name: 'It\'s Going Down Now', + artist: 'アトラスサウンドチーム', + url: 'http://music.163.com/song/media/outer/url?id=2123802242.mp3', + cover: 'https://p2.music.126.net/KZ9tA0eVW03mDYGKeIkwEQ==/109951169371891954.jpg' + }, + { + name: '時価ネットたなか -Reload-', + artist: 'アトラスサウンドチーム', + url: 'http://music.163.com/song/media/outer/url?id=2123807728.mp3', + cover: 'https://p2.music.126.net/KZ9tA0eVW03mDYGKeIkwEQ==/109951169371891954.jpg' + }, + { + name: '街の記憶 (P3R ver.)', + artist: 'アトラスサウンドチーム', + url: 'http://music.163.com/song/media/outer/url?id=2123802253.mp3', + cover: 'https://p2.music.126.net/KZ9tA0eVW03mDYGKeIkwEQ==/109951169371891954.jpg' + }, + { + name: '学園の記憶 (P3R ver.)', + artist: 'アトラスサウンドチーム', + url: 'http://music.163.com/song/media/outer/url?id=2123802254.mp3', + cover: 'https://p2.music.126.net/KZ9tA0eVW03mDYGKeIkwEQ==/109951169371891954.jpg' + }, + { + name: 'Burn My Dread', + artist: '川村ゆみ', + url: 'http://music.163.com/song/media/outer/url?id=403002.mp3', + cover: 'https://p2.music.126.net/1u0epGLkeAEez46pY-sTAw==/737772302249800.jpg' + }, + { + name: '私が守るから -Reload-', + artist: 'アトラスサウンドチーム', + url: 'http://music.163.com/song/media/outer/url?id=2123802257.mp3', + cover: 'https://p2.music.126.net/KZ9tA0eVW03mDYGKeIkwEQ==/109951169371891954.jpg' + }, + { + name: 'キミの記憶 -Reload-', + artist: 'アトラスサウンドチーム', + url: 'http://music.163.com/song/media/outer/url?id=2123802258.mp3', + cover: 'https://p2.music.126.net/KZ9tA0eVW03mDYGKeIkwEQ==/109951169371891954.jpg' + }, + { + name: 'Trailer Theme - Just a To the Moon Series Beach Episode', + artist: 'Kan R. Gao', + url: 'http://music.163.com/song/media/outer/url?id=2633699898.mp3', + cover: 'https://p2.music.126.net/KZ9tA0eVW03mDYGKeIkwEQ==/109951169371891954.jpg' + }, + { + name: 'Title Theme - Just a To the Moon Series Beach Episode', + artist: 'Kan R. Gao', + url: 'http://music.163.com/song/media/outer/url?id=2633698053.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'The Day Off (Bus Map Music)', + artist: 'Kan R. Gao', + url: 'http://music.163.com/song/media/outer/url?id=2633698058.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'For River - Lobby Piano Version', + artist: 'Kan R. Gao', + url: 'http://music.163.com/song/media/outer/url?id=2633698054.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'Born a Stranger - Lobby Piano Version', + artist: 'Kan R. Gao', + url: 'http://music.163.com/song/media/outer/url?id=2633698059.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'Time is a Place - Lobby Piano Version', + artist: 'Kan R. Gao', + url: 'http://music.163.com/song/media/outer/url?id=2633699892.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'Faye\'s Theme - Lobby Piano Version', + artist: 'Kan R. Gao', + url: 'http://music.163.com/song/media/outer/url?id=2633699899.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'Lullaby from a Star - Lobby Piano Version', + artist: 'Kan R. Gao', + url: 'http://music.163.com/song/media/outer/url?id=2633699893.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'To Realize (Quintessence) - Lobby Piano Version', + artist: 'Kan R. Gao', + url: 'http://music.163.com/song/media/outer/url?id=2633699900.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'Envy (Quintessence) - Lobby Piano Version', + artist: 'Kan R. Gao', + url: 'http://music.163.com/song/media/outer/url?id=2633699894.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'Kaire\'s Theme (Quintessence) - Lobby Piano Version', + artist: 'Kan R. Gao', + url: 'http://music.163.com/song/media/outer/url?id=2633698060.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'To the Moon Lofi Medley', + artist: 'Kan R. Gao / Sunmin Kim', + url: 'http://music.163.com/song/media/outer/url?id=2633698063.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'Finding Paradise Lofi Medley', + artist: 'Ferdk / Kan R. Gao', + url: 'http://music.163.com/song/media/outer/url?id=2633699896.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'Impostor Factory Lofi Medley', + artist: 'Ferdk / Kan R. Gao', + url: 'http://music.163.com/song/media/outer/url?id=2633699901.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'Neil and Eva Lofi Medley', + artist: 'Ferdk / Kan R. Gao', + url: 'http://music.163.com/song/media/outer/url?id=2633698057.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'World in a Memory', + artist: 'Kan R. Gao / Pealeaf', + url: 'http://music.163.com/song/media/outer/url?id=2633698064.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'I Still Remember Everything', + artist: 'Kan R. Gao', + url: 'http://music.163.com/song/media/outer/url?id=2633699897.mp3', + cover: 'https://p1.music.126.net/q7j2CUBo6u-ivxzkjjaf1w==/109951170017498007.jpg' + }, + { + name: 'Everything\'s Alright (Bonus Version)', + artist: 'Kan R. Gao / Laura Shigihara', + url: 'http://music.163.com/song/media/outer/url?id=454966468.mp3', + cover: 'https://p2.music.126.net/0AYWra9rCzgeprGp6OUyUw==/868614185993997.jpg' + }, + { + name: '雑踏、僕らの街', + artist: 'トゲナシトゲアリ', + url: 'http://music.163.com/song/media/outer/url?id=2621540481.mp3', + cover: 'https://p2.music.126.net/yPW_EmIsyR7iD6awPiiQUQ==/109951170148303857.jpg' + }, + { + name: '誰にもなれない私だから', + artist: 'トゲナシトゲアリ', + url: 'http://music.163.com/song/media/outer/url?id=2621540483.mp3', + cover: 'https://p2.music.126.net/yPW_EmIsyR7iD6awPiiQUQ==/109951170148303857.jpg' + }, + { + name: '空の箱 (井芹仁菜、河原木桃香)', + artist: 'トゲナシトゲアリ', + url: 'http://music.163.com/song/media/outer/url?id=2621540484.mp3', + cover: 'https://p2.music.126.net/yPW_EmIsyR7iD6awPiiQUQ==/109951170148303857.jpg' + }, + { + name: '声なき魚 (新川崎(仮))', + artist: 'トゲナシトゲアリ', + url: 'http://music.163.com/song/media/outer/url?id=2621540487.mp3', + cover: 'https://p2.music.126.net/yPW_EmIsyR7iD6awPiiQUQ==/109951170148303857.jpg' + }, + { + name: '視界の隅 朽ちる音 (新川崎(仮))', + artist: 'トゲナシトゲアリ', + url: 'http://music.163.com/song/media/outer/url?id=2621539071.mp3', + cover: 'https://p2.music.126.net/yPW_EmIsyR7iD6awPiiQUQ==/109951170148303857.jpg' + }, + { + name: '心象的フラクタル (beni-shouga)', + artist: 'トゲナシトゲアリ', + url: 'http://music.163.com/song/media/outer/url?id=2621539072.mp3', + cover: 'https://p2.music.126.net/yPW_EmIsyR7iD6awPiiQUQ==/109951170148303857.jpg' + }, + { + name: '空白とカタルシス', + artist: 'トゲナシトゲアリ', + url: 'http://music.163.com/song/media/outer/url?id=2621539073.mp3', + cover: 'https://p2.music.126.net/yPW_EmIsyR7iD6awPiiQUQ==/109951170148303857.jpg' + }, + { + name: '運命の華', + artist: 'トゲナシトゲアリ', + url: 'http://music.163.com/song/media/outer/url?id=2621539074.mp3', + cover: 'https://p2.music.126.net/yPW_EmIsyR7iD6awPiiQUQ==/109951170148303857.jpg' + }, + { + name: 'Cycle Of Sorrow', + artist: 'トゲナシトゲアリ', + url: 'http://music.163.com/song/media/outer/url?id=2621540489.mp3', + cover: 'https://p2.music.126.net/yPW_EmIsyR7iD6awPiiQUQ==/109951170148303857.jpg' + }, + { + name: 'ETERNAL FLAME (VOID)', + artist: 'トゲナシトゲアリ', + url: 'http://music.163.com/song/media/outer/url?id=2621539076.mp3', + cover: 'https://p2.music.126.net/yPW_EmIsyR7iD6awPiiQUQ==/109951170148303857.jpg' + }, + { + name: '闇に溶けてく', + artist: 'トゲナシトゲアリ', + url: 'http://music.163.com/song/media/outer/url?id=2621540490.mp3', + cover: 'https://p2.music.126.net/yPW_EmIsyR7iD6awPiiQUQ==/109951170148303857.jpg' + }, + { + name: '蝶に結いた赤い糸', + artist: 'トゲナシトゲアリ', + url: 'http://music.163.com/song/media/outer/url?id=2621539078.mp3', + cover: 'https://p2.music.126.net/yPW_EmIsyR7iD6awPiiQUQ==/109951170148303857.jpg' + }, + { + name: "You're Going to Love Tomorrow's Story", + artist: "Yokaze", + url: "https://cloud-oc.github.io/Audio-Bed/Music/You're Going to Love Tomorrow's Story.m4a", + cover: "https://github.com/cloud-oc/picx-images-hosting/raw/master/Blog/Unreal-Life-OST.26lxfpu9eq.png" } ], MUSIC_PLAYER_METING: process.env.NEXT_PUBLIC_MUSIC_PLAYER_METING || false, // 是否要开启 MetingJS,从平台获取歌单。会覆盖自定义的 MUSIC_PLAYER_AUDIO_LIST,更多配置信息:https://github.com/metowolf/MetingJS diff --git a/package.json b/package.json index 75ec27da948..864d81c5f7f 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,7 @@ "@clerk/nextjs": "^5.7.6", "@headlessui/react": "^1.7.19", "@next/bundle-analyzer": "^12.3.7", + "@tabler/icons-react": "^3.36.1", "@supabase/supabase-js": "^2.57.4", "@tabler/icons-react": "^3.36.1", "@vercel/analytics": "^1.6.1", @@ -91,8 +92,10 @@ "react-facebook": "^8.1.4", "react-hotkeys-hook": "^4.6.2", "react-notion-x": "7.10.0", + "react-share": "^5.2.2", "react-tweet-embed": "~2.0.0", - "remixicon-react": "^1.0.0" + "remixicon-react": "^1.0.0", + "@supabase/supabase-js": "^2.57.4" }, "devDependencies": { "@lhci/cli": "^0.15.1", diff --git a/pages/search/[keyword]/index.js b/pages/search/[keyword]/index.js index 721721f2582..3ee05f00bdb 100644 --- a/pages/search/[keyword]/index.js +++ b/pages/search/[keyword]/index.js @@ -40,6 +40,7 @@ export async function getStaticProps({ params: { keyword }, locale }) { props.posts = props.posts?.slice(0, POSTS_PER_PAGE) } props.keyword = keyword + delete props.allPages return { props, revalidate: process.env.EXPORT diff --git a/public/favicon.ico b/public/favicon.ico index 92e7de8ffce..299ea9b360e 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/svg/cloud.svg b/public/svg/cloud.svg new file mode 100644 index 00000000000..3f17b58c8f4 --- /dev/null +++ b/public/svg/cloud.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/themes/endspace/components/BlogListArchive.js b/themes/endspace/components/BlogListArchive.js index 5a02eae66fc..86d266e8b0a 100644 --- a/themes/endspace/components/BlogListArchive.js +++ b/themes/endspace/components/BlogListArchive.js @@ -40,7 +40,7 @@ export const BlogListArchive = ({ archiveTitle, archivePosts }) => { {/* Date Badge */}
- + [{post.publishDay || post.date?.start_date}]
diff --git a/themes/endspace/components/FloatingControls.js b/themes/endspace/components/FloatingControls.js index edf4ffaeae6..9b9bc8a6608 100644 --- a/themes/endspace/components/FloatingControls.js +++ b/themes/endspace/components/FloatingControls.js @@ -1,10 +1,7 @@ import { useState, useEffect, useRef, useCallback } from 'react' import throttle from 'lodash.throttle' import { uuidToId } from 'notion-utils' -import { IconClock, IconListTree, IconArrowUp, IconX, IconMessage, IconMoon, IconSun } from '@tabler/icons-react' -import { siteConfig } from '@/lib/config' -import { useGlobal } from '@/lib/global' -import CONFIG from '../config' +import { IconClock, IconListTree, IconArrowUp, IconX, IconMessage } from '@tabler/icons-react' import { SideBar } from './SideBar' /** @@ -12,8 +9,6 @@ import { SideBar } from './SideBar' * Consolidates Recent Logs, TOC, and ScrollToTop into a single capsule widget. */ const FloatingControls = ({ toc, ...props }) => { - const { isDarkMode, toggleDarkMode } = useGlobal() - const showDarkToggle = siteConfig('ENDSPACE_WIDGET_DARK_MODE', true, CONFIG) const [isOpen, setIsOpen] = useState(false) const [activeTab, setActiveTab] = useState(null) // 'logs' | 'toc' const [percent, setPercent] = useState(0) @@ -186,15 +181,6 @@ const FloatingControls = ({ toc, ...props }) => {
{/* Capsule */}
- {showDarkToggle && ( - - )} {/* LOGS */} { // Get avatar from props or global context const avatarUrl = props?.siteInfo?.icon || siteInfo?.icon || siteConfig('AVATAR') - // All navigation items - const menuItems = [ - { name: 'Home', path: '/' }, - { name: 'Category', path: '/category', show: siteConfig('ENDSPACE_MENU_CATEGORY', null, CONFIG) }, - { name: 'Tag', path: '/tag', show: siteConfig('ENDSPACE_MENU_TAG', null, CONFIG) }, - { name: 'Archive', path: '/archive', show: siteConfig('ENDSPACE_MENU_ARCHIVE', null, CONFIG) }, - { name: 'Portfolio', path: '/portfolio' }, - { name: 'Friends', path: '/friends' }, - { name: 'Search', path: '/search', show: siteConfig('ENDSPACE_MENU_SEARCH', null, CONFIG) } - ].filter(item => item.show !== false) + const menuItems = useMemo( + () => getEndspaceMenuItems(props), + [props.customMenu, props.customNav] + ) // Social icon config - using contact.config.js settings const socialLinks = [ @@ -106,15 +91,8 @@ export const MobileNav = (props) => { const CONTACT_EMAIL = siteConfig('CONTACT_EMAIL') useEffect(() => { - const path = router.asPath - if (path === '/') setActiveTab('Home') - else if (path.includes('/category')) setActiveTab('Category') - else if (path.includes('/tag')) setActiveTab('Tag') - else if (path.includes('/archive')) setActiveTab('Archive') - else if (path.includes('/search')) setActiveTab('Search') - else if (path.includes('/friends')) setActiveTab('Friends') - else if (path.includes('/portfolio')) setActiveTab('Portfolio') - }, [router.asPath]) + setActiveTab(getEndspaceActiveMenuName(menuItems, router.asPath)) + }, [router.asPath, menuItems]) // Close menu when route changes useEffect(() => { @@ -134,8 +112,19 @@ export const MobileNav = (props) => { }, [isMenuOpen]) // Render icon component - const renderIcon = (name) => { - const IconComponent = IconComponents[name] + const renderIcon = (item) => { + if (item.pageIcon) { + return ( + + + + ) + } + if (item.customIcon) { + return + } + const name = item.icon || item.name + const IconComponent = IconComponents[name] || IconComponents.Default if (!IconComponent) return null return } @@ -201,7 +190,7 @@ export const MobileNav = (props) => {
{menuItems.map(item => ( { : 'text-[var(--endspace-text-secondary)] hover:text-black' }`} > -
- {renderIcon(item.name)} +
+ {renderIcon(item)}
{item.name} diff --git a/themes/endspace/components/NotionMenuIcon.js b/themes/endspace/components/NotionMenuIcon.js new file mode 100644 index 00000000000..3446095ded6 --- /dev/null +++ b/themes/endspace/components/NotionMenuIcon.js @@ -0,0 +1,29 @@ +const EMOJI_PATTERN = + /[\u{1F300}-\u{1F6FF}\u{1F1E0}-\u{1F1FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}\u{1F900}-\u{1F9FF}\u{1F018}-\u{1F270}]/u + +const isUrlIcon = icon => + typeof icon === 'string' && (icon.startsWith('http') || icon.startsWith('data:')) + +const isEmojiIcon = icon => typeof icon === 'string' && EMOJI_PATTERN.test(icon) + +export default function NotionMenuIcon({ icon, className = '' }) { + if (!icon) return null + + if (isUrlIcon(icon) && !isEmojiIcon(icon)) { + return ( + + ) + } + + return ( + + {icon} + + ) +} diff --git a/themes/endspace/components/SearchInput.js b/themes/endspace/components/SearchInput.js index 2598d5c7d1e..d9cbac9e842 100644 --- a/themes/endspace/components/SearchInput.js +++ b/themes/endspace/components/SearchInput.js @@ -1,12 +1,12 @@ import { useState, useEffect } from 'react' import { useRouter } from 'next/router' -import { IconSearch, IconX } from '@tabler/icons-react' +import { IconX } from '@tabler/icons-react' /** * SearchInput Component - Refined Tech Interface * Search input component */ -export const SearchInput = ({ keyword = '', locale }) => { +export const SearchInput = ({ keyword = '', locale, compact = false, titleMeta = '' }) => { const router = useRouter() const [searchTerm, setSearchTerm] = useState(keyword || '') const [isFocused, setIsFocused] = useState(false) @@ -27,12 +27,16 @@ export const SearchInput = ({ keyword = '', locale }) => { } return ( -
+
{/* Search Label */} -
- +
SEARCH + {titleMeta && ( + + // {titleMeta} + + )}
{/* Search Input Container */} diff --git a/themes/endspace/components/SideNav.js b/themes/endspace/components/SideNav.js index c45e4ad2696..95825e23c5a 100644 --- a/themes/endspace/components/SideNav.js +++ b/themes/endspace/components/SideNav.js @@ -1,35 +1,24 @@ import { useRouter } from 'next/router' -import { useState, useEffect, useRef } from 'react' +import { useState, useEffect, useMemo, useRef } from 'react' import { siteConfig } from '@/lib/config' import { handleEmailClick } from '@/lib/plugins/mailEncrypt' import { useGlobal } from '@/lib/global' -import CONFIG from '../config' import SmartLink from '@/components/SmartLink' import { EndspacePlayer } from './EndspacePlayer' +import NotionMenuIcon from './NotionMenuIcon' import { - IconBrandGithub, - IconBrandTwitter, - IconBrandWeibo, - IconBrandBilibili, - IconBrandTelegram, - IconBrandInstagram, - IconBrandYoutube, - IconBrandLinkedin, - IconBrandWechat, - IconBrandX, - IconPlanet + IconBrandX } from '@tabler/icons-react' import RadarFillIcon from 'remixicon-react/RadarFillIcon' -import MailSendFillIcon from 'remixicon-react/MailSendFillIcon' // Conceptual Navigation Icons (Solid, Angular) import AppsFillIcon from 'remixicon-react/AppsFillIcon' import FolderFillIcon from 'remixicon-react/FolderFillIcon' -import BookMarkFillIcon from 'remixicon-react/BookMarkFillIcon' import BarcodeFillIcon from 'remixicon-react/BarcodeFillIcon' import StackFillIcon from 'remixicon-react/StackFillIcon' import Compass3FillIcon from 'remixicon-react/Compass3FillIcon' import EarthFillIcon from 'remixicon-react/EarthFillIcon' import ProfileFillIcon from 'remixicon-react/ProfileFillIcon' +import { getEndspaceActiveMenuName, getEndspaceMenuItems } from './menu' // Social Icons (Solid) import GithubFillIcon from 'remixicon-react/GithubFillIcon' @@ -51,7 +40,8 @@ const IconComponents = { 'Archive': StackFillIcon, 'Search': Compass3FillIcon, 'Friends': EarthFillIcon, - 'Portfolio': ProfileFillIcon + 'Portfolio': ProfileFillIcon, + 'Default': AppsFillIcon } // Social icon mapping @@ -81,16 +71,10 @@ export const SideNav = (props) => { // Get avatar from props or global context (Hexo way uses props) const avatarUrl = props?.siteInfo?.icon || siteInfo?.icon || siteConfig('AVATAR') - // All navigation items - const menuItems = [ - { name: 'Home', path: '/' }, - { name: 'Category', path: '/category', show: siteConfig('ENDSPACE_MENU_CATEGORY', null, CONFIG) }, - { name: 'Tag', path: '/tag', show: siteConfig('ENDSPACE_MENU_TAG', null, CONFIG) }, - { name: 'Archive', path: '/archive', show: siteConfig('ENDSPACE_MENU_ARCHIVE', null, CONFIG) }, - { name: 'Portfolio', path: '/portfolio' }, - { name: 'Friends', path: '/friends' }, - { name: 'Search', path: '/search', show: siteConfig('ENDSPACE_MENU_SEARCH', null, CONFIG) } - ].filter(item => item.show !== false) + const menuItems = useMemo( + () => getEndspaceMenuItems(props), + [props.customMenu, props.customNav] + ) // Social icon config - using contact.config.js settings const socialLinks = [ @@ -128,19 +112,8 @@ export const SideNav = (props) => { } useEffect(() => { - // Set active tab based on path - const path = router.asPath - let newTab = 'Home' - if (path === '/') newTab = 'Home' - else if (path.includes('/category')) newTab = 'Category' - else if (path.includes('/tag')) newTab = 'Tag' - else if (path.includes('/archive')) newTab = 'Archive' - else if (path.includes('/search')) newTab = 'Search' - else if (path.includes('/friends')) newTab = 'Friends' - else if (path.includes('/portfolio')) newTab = 'Portfolio' - - setActiveTab(newTab) - }, [router.asPath]) + setActiveTab(getEndspaceActiveMenuName(menuItems, router.asPath)) + }, [router.asPath, menuItems]) // Update indicator position when activeTab changes useEffect(() => { @@ -161,8 +134,25 @@ export const SideNav = (props) => { }, [activeTab]) // Render icon component - const renderIcon = (name, isActive) => { - const IconComponent = IconComponents[name] + const renderIcon = (item, isActive) => { + if (item.pageIcon) { + return ( + + + + ) + } + if (item.customIcon) { + return ( + + ) + } + const name = item.icon || item.name + const IconComponent = IconComponents[name] || IconComponents.Default if (!IconComponent) return null return ( { {menuItems.map((item) => { const isActive = activeTab === item.name return ( - +
itemRefs.current[item.name] = el} className={`nier-nav-item relative h-[3rem] flex items-center cursor-pointer group transition-colors duration-300 hover:bg-[#d4d4d8] ${isActive ? 'active bg-[#d4d4d8]' : ''}`} > {/* Icon Container */} -
- {renderIcon(item.name, isActive)} +
+ {renderIcon(item, isActive)}
{/* Text Label (Reveal on Hover) */} diff --git a/themes/endspace/components/menu.js b/themes/endspace/components/menu.js new file mode 100644 index 00000000000..30cfd193d6d --- /dev/null +++ b/themes/endspace/components/menu.js @@ -0,0 +1,79 @@ +import { siteConfig } from '@/lib/config' +import CONFIG from '../config' + +const IconNames = { + Home: 'Home', + Category: 'Category', + Tag: 'Tag', + Tags: 'Tag', + Archive: 'Archive', + Search: 'Search', + Friends: 'Friends', + Portfolio: 'Portfolio' +} + +const normalizeHref = link => { + const value = link?.href || link?.path || link?.url || link?.slug || '' + if (!value) return '' + if (value.startsWith('/') || value.startsWith('http') || value.startsWith('#')) { + return value + } + return `/${value}` +} + +const normalizeMenuItem = (link, index) => { + if (!link || link.show === false) return null + const name = link.name || link.title || link.label || '' + const path = normalizeHref(link) + if (!name || !path) return null + + return { + ...link, + id: link.id || `endspace-menu-${index}`, + name, + path, + href: path, + icon: IconNames[name] || IconNames[name?.trim?.()] || 'Default', + pageIcon: link.pageIcon || '', + customIcon: link.icon || null + } +} + +const normalizeMenu = links => + (Array.isArray(links) ? links : []) + .map(normalizeMenuItem) + .filter(Boolean) + +export const getEndspaceMenuItems = ({ customNav, customMenu } = {}) => { + const defaultLinks = [ + { name: 'Home', path: '/' }, + { name: 'Category', path: '/category', show: siteConfig('ENDSPACE_MENU_CATEGORY', null, CONFIG) }, + { name: 'Tag', path: '/tag', show: siteConfig('ENDSPACE_MENU_TAG', null, CONFIG) }, + { name: 'Archive', path: '/archive', show: siteConfig('ENDSPACE_MENU_ARCHIVE', null, CONFIG) }, + { name: 'Portfolio', path: '/portfolio' }, + { name: 'Friends', path: '/friends' }, + { name: 'Search', path: '/search', show: siteConfig('ENDSPACE_MENU_SEARCH', null, CONFIG) } + ] + + let links = defaultLinks + if (Array.isArray(customNav) && customNav.length > 0) { + links = links.concat(customNav) + } + if (siteConfig('CUSTOM_MENU') && Array.isArray(customMenu)) { + links = customMenu + } + + return normalizeMenu(links) +} + +export const getEndspaceActiveMenuName = (menuItems, asPath = '/') => { + const cleanPath = asPath.split(/[?#]/)[0] || '/' + const activeItem = menuItems + .filter(item => item.path && !item.path.startsWith('http') && !item.path.startsWith('#')) + .find(item => { + if (item.path === '/') return cleanPath === '/' + return cleanPath === item.path || cleanPath.startsWith(`${item.path}/`) + }) + + return activeItem?.name || menuItems[0]?.name || '' +} diff --git a/themes/endspace/components/searchHighlight.js b/themes/endspace/components/searchHighlight.js new file mode 100644 index 00000000000..9eba40e7c49 --- /dev/null +++ b/themes/endspace/components/searchHighlight.js @@ -0,0 +1,31 @@ +import { loadExternalResource } from '@/lib/utils' + +const escapeRegExp = value => + value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + +/** + * Endspace search highlight must be idempotent because users can resubmit the + * same keyword on the same result DOM. + */ +export default async function replaceEndspaceSearchResult({ doms, search, target }) { + if (!doms || !target) return + + try { + await loadExternalResource('https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js', 'js') + const Mark = window.Mark + const instance = new Mark(doms) + const re = search ? new RegExp(escapeRegExp(search), 'gim') : null + + instance.unmark({ + element: target.element, + className: target.className, + done: () => { + if (re) { + instance.markRegExp(re, target) + } + } + }) + } catch (error) { + console.error('endspace search highlight failed', error) + } +} diff --git a/themes/endspace/config.js b/themes/endspace/config.js index 475fbc01cb0..b3c952a6caa 100644 --- a/themes/endspace/config.js +++ b/themes/endspace/config.js @@ -59,10 +59,10 @@ const CONFIG = { // ============================================ // 菜单配置 (Menu) // ============================================ - ENDSPACE_MENU_CATEGORY: true, // 显示分类菜单 - ENDSPACE_MENU_TAG: true, // 显示标签菜单 + ENDSPACE_MENU_CATEGORY: false, // 显示分类菜单(默认合并到 Archive) + ENDSPACE_MENU_TAG: false, // 显示标签菜单(默认合并到 Archive) ENDSPACE_MENU_ARCHIVE: true, // 显示归档菜单 - ENDSPACE_MENU_SEARCH: true, // 显示搜索菜单 + ENDSPACE_MENU_SEARCH: false, // 显示搜索菜单(默认合并到 Archive) // ============================================ // 文章列表 (Post List) @@ -79,7 +79,7 @@ const CONFIG = { // ============================================ // 浮动控件 (Floating controls) // ============================================ - /** 右下角胶囊是否显示浅色/深色切换(与全局 dark 类联动) */ - ENDSPACE_WIDGET_DARK_MODE: true + /** 右下角胶囊是否显示浅色/深色切换(夜间模式已禁用) */ + ENDSPACE_WIDGET_DARK_MODE: false } export default CONFIG diff --git a/themes/endspace/index.js b/themes/endspace/index.js index 6fc97ac1c92..ca766ba744e 100644 --- a/themes/endspace/index.js +++ b/themes/endspace/index.js @@ -1,7 +1,6 @@ 'use client' import Comment from '@/components/Comment' -import replaceSearchResult from '@/components/Mark' import NotionPage from '@/components/NotionPage' import ShareBar from '@/components/ShareBar' import SmartLink from '@/components/SmartLink' @@ -27,6 +26,7 @@ import MobileNav from './components/MobileNav' import ArticleAdjacent from './components/ArticleAdjacent' import FloatingControls from './components/FloatingControls' import useViewportScale from './components/useViewportScale' +import replaceEndspaceSearchResult from './components/searchHighlight' import CONFIG from './config' import { Style } from './style' import { IconLoader2 } from '@tabler/icons-react' @@ -317,24 +317,23 @@ const Layout404 = (props) => { */ const LayoutSearch = (props) => { const { keyword, posts = [] } = props - const router = useRouter() useEffect(() => { if (isBrowser) { // Highlight search results const container = document.getElementById('posts-wrapper') - if (keyword && container) { - replaceSearchResult({ + if (container) { + replaceEndspaceSearchResult({ doms: container, search: keyword, target: { element: 'span', - className: 'text-yellow-400 bg-yellow-400/20 px-1' + className: 'endspace-search-highlight' } }) } } - }, [router]) + }, [keyword, posts]) return ( <> @@ -359,17 +358,89 @@ const LayoutSearch = (props) => { * @returns Articles grouped by date */ const LayoutArchive = (props) => { - const { archivePosts } = props + const { archivePosts = {}, categoryOptions = [], tagOptions = [], postCount } = props + const archiveTitles = Object.keys(archivePosts) + const archivePostCount = archiveTitles.reduce( + (count, archiveTitle) => count + (archivePosts[archiveTitle]?.length || 0), + 0 + ) + const totalPostCount = postCount || archivePostCount return ( <> -
- {Object.keys(archivePosts).map((archiveTitle) => ( - +
+ - ))} +
+ +
+
+ CATEGORIES + + // {categoryOptions.length}_CATEGORY_NODES + +
+ +
+ +
+
+ TAGS + + // {tagOptions.length}_TAG_MARKERS + +
+ +
+ +
+
+ {archiveTitles.map((archiveTitle) => ( + + ))} +
+
) diff --git a/themes/endspace/style.js b/themes/endspace/style.js index eb89a594d8e..0b500085fb1 100644 --- a/themes/endspace/style.js +++ b/themes/endspace/style.js @@ -44,37 +44,6 @@ export const Style = () => { 0 0 0 1px var(--endspace-accent-yellow); } - /* Dark Mode Variables */ - .dark { - --endspace-bg-base: #09090b; - --endspace-bg-primary: #18181b; - --endspace-bg-secondary: #27272a; - --endspace-bg-tertiary: #3f3f46; - - --endspace-text-primary: #fafafa; - --endspace-text-secondary: #a1a1aa; - --endspace-text-muted: #71717a; - - --endspace-accent-yellow: #FBFB45; - --endspace-accent-yellow-dim: rgba(251, 251, 69, 0.15); - --endspace-accent-cyan: #FBFB45; /* Dark Mode: Yellow 600 */ - --endspace-accent-cyan-dim: rgba(251, 251, 69, 0.1); - - --endspace-border-base: #27272a; - --endspace-border-active: #FBFB45; - --endspace-grid-color: rgba(255,255,255,0.02); - - --endspace-shadow-base: - 0 1px 2px rgba(0, 0, 0, 0.2), - 0 2px 4px rgba(0, 0, 0, 0.15), - 0 4px 8px rgba(0, 0, 0, 0.1); - --endspace-shadow-hover: - 0 4px 8px rgba(0, 0, 0, 0.3), - 0 8px 16px rgba(0, 0, 0, 0.25), - 0 16px 32px rgba(0, 0, 0, 0.2), - 0 0 0 1px var(--endspace-accent-yellow); - } - /* ============================================ Viewport Scaling (Responsive Font Size) ============================================ */ @@ -136,6 +105,54 @@ export const Style = () => { letter-spacing: 1px; } + .endspace-search-highlight { + color: #a16207; + background: linear-gradient(90deg, rgba(251, 251, 69, 0.2), rgba(251, 191, 36, 0.35)); + padding: 0 0.25rem; + box-decoration-break: clone; + -webkit-box-decoration-break: clone; + } + + .archive-section { + position: relative; + } + + .endspace-section-title { + color: #E8E8EA !important; + width: 100%; + gap: 1rem; + margin-bottom: 1.5rem; + padding-bottom: 0.75rem; + border-bottom: 1px solid var(--endspace-border-base) !important; + justify-content: flex-start; + } + + #theme-endspace .endspace-section-title, + #theme-endspace .endspace-section-title * { + color: #E8E8EA !important; + } + + .endspace-section-meta { + color: var(--endspace-text-secondary); + font-size: 0.9rem; + font-weight: 500; + letter-spacing: 0.04em; + padding-top: 1.35rem; + white-space: nowrap; + } + + @media (max-width: 767px) { + .endspace-section-title { + align-items: flex-start; + flex-direction: column; + gap: 0.25rem; + } + + .endspace-section-meta { + padding-top: 0; + } + } + /* ============================================ "Float" Container Styles (Glassmorphism -> Solid Block) ============================================ */ @@ -150,11 +167,6 @@ export const Style = () => { z-index: 10; } - .dark .endspace-frame { - background: #18181b; /* Solid dark background */ - border-color: #3f3f46; - } - /* Corner Markers (Minimalist L-shape) */ .endspace-frame::before { content: ''; @@ -211,10 +223,6 @@ export const Style = () => { z-index: 20; } - .dark .endspace-card { - background: #18181b; - } - /* ============================================ Notion Content Overrides (Light Mode) ============================================ */ @@ -224,6 +232,63 @@ export const Style = () => { line-height: 1.75; } + #theme-endspace #article-wrapper, + #theme-endspace #notion-article, + #theme-endspace #notion-article .notion, + #theme-endspace #notion-article .notion-text, + #theme-endspace #notion-article .notion-blank, + #theme-endspace #notion-article .notion-h, + #theme-endspace #notion-article .notion-header, + #theme-endspace #notion-article .notion-sub_header, + #theme-endspace #notion-article .notion-sub_sub_header, + #theme-endspace #notion-article .notion-page, + #theme-endspace #notion-article .notion-list, + #theme-endspace #notion-article .notion-list-disc, + #theme-endspace #notion-article .notion-list-numbered, + #theme-endspace #notion-article .notion-toggle, + #theme-endspace #notion-article .notion-quote, + #theme-endspace #notion-article .notion-callout, + #theme-endspace #notion-article .notion-bookmark, + #theme-endspace #notion-article .notion-bookmark-title, + #theme-endspace #notion-article .notion-collection, + #theme-endspace #notion-article .notion-collection-row, + #theme-endspace #notion-article .notion-property, + #theme-endspace #notion-article .notion-property-text, + #theme-endspace #notion-article .notion-property-title, + #theme-endspace #notion-article .notion-simple-table, + #theme-endspace #notion-article .notion-table, + #theme-endspace #notion-article .notion-code, + #theme-endspace #notion-article .notion-equation { + color: var(--endspace-text-primary) !important; + } + + #theme-endspace #notion-article p, + #theme-endspace #notion-article li, + #theme-endspace #notion-article span, + #theme-endspace #notion-article figcaption, + #theme-endspace #notion-article .notion-text, + #theme-endspace #notion-article .notion-list, + #theme-endspace #notion-article .notion-list-disc, + #theme-endspace #notion-article .notion-list-numbered, + #theme-endspace #notion-article .notion-toggle, + #theme-endspace #notion-article .notion-bookmark-description, + #theme-endspace #notion-article .notion-bookmark-link, + #theme-endspace #notion-article .notion-collection-row-body, + #theme-endspace #notion-article .notion-simple-table-cell { + color: var(--endspace-text-secondary) !important; + } + + #theme-endspace #notion-article h1, + #theme-endspace #notion-article h2, + #theme-endspace #notion-article h3, + #theme-endspace #notion-article h4, + #theme-endspace #notion-article h5, + #theme-endspace #notion-article h6, + #theme-endspace #notion-article strong, + #theme-endspace #notion-article .notion-bookmark-title { + color: var(--endspace-text-primary) !important; + } + /* Headers - NieR: Automata Style Dynamic Shadow */ /* Requirement: Misaligned when not hovered, Merged when hovered */ #notion-article h1, #notion-article h2, #notion-article h3 { @@ -257,17 +322,6 @@ export const Style = () => { transform: translateX(2px); /* Slight physical shift on 'lock-on' */ } - .dark #notion-article h1, .dark #notion-article h2, .dark #notion-article h3 { - /* Dark mode: Stronger, glow-like ghosts */ - text-shadow: - -4px -2px 0 rgba(98, 240, 245, 0.5), - 4px 2px 0 rgba(255, 50, 50, 0.4); - } - - .dark #notion-article h1:hover, .dark #notion-article h2:hover, .dark #notion-article h3:hover { - text-shadow: none; - } - #notion-article h1::before, #notion-article h2::before, #notion-article h3::before { @@ -694,13 +748,6 @@ export const Style = () => { 6px 6px 10px rgba(0, 0, 0, 0.15); } - .dark .nier-title { - text-shadow: - 2px 2px 0 rgba(98, 240, 245, 0.45), - 4px 4px 0 rgba(98, 240, 245, 0.25), - 6px 6px 15px rgba(0, 0, 0, 0.6); - } - /* ============================================ 3D Button Effects ============================================ */ @@ -742,11 +789,6 @@ export const Style = () => { 8px 0 16px rgba(0, 0, 0, 0.03); } - .dark .endspace-sidebar-3d { - box-shadow: - 4px 0 8px rgba(0, 0, 0, 0.3), - 8px 0 16px rgba(0, 0, 0, 0.2); - } /* ============================================ NieR: Automata Style Navigation Transition ============================================ */ @@ -781,6 +823,28 @@ export const Style = () => { .nier-nav-item:hover, .nier-nav-item.active { color: var(--endspace-text-primary) !important; } + + .endspace-notion-menu-icon { + display: inline-block; + width: 1.25rem; + height: 1.25rem; + background-color: currentColor; + mask-position: center; + mask-repeat: no-repeat; + mask-size: contain; + -webkit-mask-position: center; + -webkit-mask-repeat: no-repeat; + -webkit-mask-size: contain; + } + + .endspace-notion-menu-emoji { + display: inline-flex; + align-items: center; + justify-content: center; + width: 1.5rem; + font-size: 1.15rem; + line-height: 1; + } /* Hover State: Slide to full width */ .nier-nav-item:hover::before { @@ -798,18 +862,24 @@ export const Style = () => { transition: color 0.3s ease; z-index: 2; } + + #theme-endspace .endspace-menu-icon-wrap, + #theme-endspace .endspace-menu-icon-wrap i, + #theme-endspace .endspace-menu-icon-wrap svg { + color: #000 !important; + fill: currentColor; + stroke: currentColor; + } + + #theme-endspace .endspace-menu-icon-wrap .endspace-notion-menu-icon { + color: #000 !important; + background-color: #000 !important; + } /* Removed specific active override to keep consistent grey background */ /* Also update the base hover/active shared rule to use this darker grey */ - .dark .nier-nav-item::before { - background: #f4f4f5; /* Light bg in dark mode */ - } - .dark .nier-nav-item:hover, .dark .nier-nav-item.active { - color: #fafafa !important; /* Dark text in dark mode */ - } - /* ============================================ Endfield Category Button Styles ============================================ */ @@ -873,6 +943,20 @@ export const Style = () => { .ef-btn:hover .ef-btn-text { color: #ffffff !important; } + + .archive-filter-btn:hover { + background-color: #FBFB46 !important; + border-color: #FBFB46; + box-shadow: var(--endspace-shadow-hover); + } + + .archive-filter-btn:hover .ef-btn-indicator { + background-color: #000; + } + + .archive-filter-btn:hover .ef-btn-text { + color: #000 !important; + } `} ) } diff --git a/themes/hexo/config.js b/themes/hexo/config.js index 2eaf59a443a..e4fe5e14734 100644 --- a/themes/hexo/config.js +++ b/themes/hexo/config.js @@ -8,11 +8,11 @@ const CONFIG = { '欢迎来到我的博客🎉' ], // 首页大图标语文字 - HEXO_HOME_NAV_BUTTONS: true, // 首页是否显示分类大图标按钮 + HEXO_HOME_NAV_BUTTONS: false, // 首页是否显示分类大图标按钮 // 已知未修复bug, 在移动端开启true后会加载不出图片; 暂时建议设置为false。 HEXO_HOME_NAV_BACKGROUND_IMG_FIXED: false, // 首页背景图滚动时是否固定,true 则滚动时图片不懂动; false则随鼠标滚动 ; // 是否显示开始阅读按钮 - HEXO_SHOW_START_READING: true, + HEXO_SHOW_START_READING: false, // 菜单配置 HEXO_MENU_INDEX: true, // 显示首页 @@ -35,7 +35,7 @@ const CONFIG = { HEXO_ARTICLE_NOT_BY_AI: false, // 显示非AI写作 HEXO_ARTICLE_RECOMMEND: true, // 文章关联推荐 - HEXO_WIDGET_LATEST_POSTS: true, // 显示最新文章卡 + HEXO_WIDGET_LATEST_POSTS: false, // 显示最新文章卡 HEXO_WIDGET_ANALYTICS: false, // 显示统计卡 HEXO_WIDGET_TO_TOP: true, HEXO_WIDGET_TO_COMMENT: true, // 跳到评论区 diff --git a/themes/nav/components/LogoBar.js b/themes/nav/components/LogoBar.js index 1d891f827ad..26985198041 100755 --- a/themes/nav/components/LogoBar.js +++ b/themes/nav/components/LogoBar.js @@ -14,7 +14,7 @@ export default function LogoBar(props) {
{/* eslint-disable-next-line @next/next/no-img-element */} - {siteConfig('AUTHOR') {siteConfig('NAV_SHOW_TITLE_TEXT', null, CONFIG) && siteConfig('TITLE')}