148 Commits

Author SHA1 Message Date
87a65c2309 chore(deps-dev): bump tailwindcss from 4.0.7 to 4.1.5
Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) from 4.0.7 to 4.1.5.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.5/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: tailwindcss
  dependency-version: 4.1.5
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-01 03:07:04 +00:00
ff2bb77707 feat: 更新自我介绍页面
- 更改自我介绍内容为 "前端 / 吉他 / 摄影 / 追星"
- 移除旧的介绍文字和外部链接
2025-04-30 12:50:18 +08:00
f0752c8a1a feat: 添加Umami分析
- 集成Umami进行网站分析
- 添加Umami跟踪脚本
2025-04-30 12:37:07 +08:00
f05b886396 Update docs and sort content 2025-04-29 07:00:53 +00:00
48f3227688 Update docs and sort content 2025-04-29 06:54:11 +00:00
77ae882b43 Update docs and sort content 2025-04-29 06:53:56 +00:00
9c0973638a Update docs and sort content 2025-04-29 06:53:35 +00:00
a1275593b9 Update docs and sort content 2025-04-29 06:48:38 +00:00
262b6ed3ab Update docs and sort content 2025-04-29 06:39:39 +00:00
8ba6f6e413 Update docs and sort content 2025-04-28 16:30:58 +00:00
d652a45c13 Update docs and sort content 2025-04-28 16:25:32 +00:00
c15c556c06 Update docs and sort content 2025-04-24 03:51:25 +00:00
b63c52df9e Update docs and sort content 2025-04-21 14:52:49 +00:00
ec402ffbfe feat: 显示标签和分类的数量 2025-04-15 17:26:00 +08:00
a1fc14d838 feat: 修改分页大小以匹配全局配置 2025-04-15 16:46:46 +08:00
ece753d46b Merge branch 'main' of https://github.com/KazooTTT/kazoottt-blog-v2 2025-04-15 16:43:48 +08:00
e271a2efd9 chore: 修改每页最大文章数为100 2025-04-15 16:43:46 +08:00
bd2f5178ce Update docs and sort content 2025-04-10 15:25:09 +00:00
a4d4ad6b93 docs: update self-intro content for clarity and context 2025-04-10 18:18:44 +08:00
c834969703 Update docs and sort content 2025-04-09 04:17:02 +00:00
97ce476651 Merge branch 'main' of https://github.com/KazooTTT/kazoottt-blog-v2 2025-04-09 12:12:59 +08:00
ea0268259d docs: remove notes 2025-04-09 12:12:48 +08:00
f343d4d18c Update docs and sort content 2025-04-09 04:03:54 +00:00
37d80c7d79 Merge branch 'main' of https://github.com/KazooTTT/kazoottt-blog-v2 2025-04-07 13:12:56 +08:00
0a72b399ce feat(social-list): 更新社交链接列表
- 移除Bilibili链接
- 更新YouTube链接
- 添加RSS链接

此次修改更新了社交链接列表,移除了不再使用的Bilibili链接,更新了YouTube链接,并添加了RSS链接。
2025-04-07 13:12:54 +08:00
ebe5cc59a5 Update docs and sort content 2025-04-05 16:53:32 +00:00
1f48dedb16 feat: 首页增加查看更多文章的链接
- 在首页的文章列表下方添加了一个“查看更多 →”的链接,指向 /posts/ 页面,方便用户浏览所有文章。
2025-04-02 12:40:09 +08:00
1a49d28395 docs: 更新自我介绍
- 简化自我介绍,只保留最基本的信息
2025-04-02 11:55:00 +08:00
827e6eeadf fix(date): replace Beijing time conversion with GMT conversion 2025-04-01 23:21:59 +08:00
f816128ccc Update docs and sort content 2025-04-01 15:06:36 +00:00
054047e2b4 Merge branch 'main' of https://github.com/KazooTTT/kazoottt-blog-v2 2025-04-01 22:31:38 +08:00
baee12dd9f style: 修改标题和样式
- 修改网站标题为 "KazooTTT 博客"
- 修改头部导航栏样式,使页面更加美观
2025-04-01 22:31:36 +08:00
10cc40f869 Update docs and sort content 2025-04-01 14:24:23 +00:00
6aed3ff17c feat(rss): RSS 时间转换为北京时间
- 将 RSS 源中的时间转换为北京时间,保证时区正确。
- 使用 `convertToBeijingTime` 函数进行转换。
2025-04-01 22:22:39 +08:00
3a4364976c Update docs and sort content 2025-04-01 13:54:08 +00:00
7463daefe7 Update docs and sort content 2025-04-01 13:46:21 +00:00
fa9ab1a4bc chore: 移除首页的笔记模块
- 移除首页的笔记模块,因为笔记功能暂时不使用
- 修改了README中的链接格式,使用plaintext
- 修改了menuLinks,注释掉了notes
2025-04-01 17:09:42 +08:00
75da123e09 chore: no pnpm lock 2025-03-28 21:17:46 +08:00
c03e9c6658 feat: 首页增加关于我的信息,更新依赖
- 首页增加个人简介和wakatime代码时间
- 更新pnpm版本
- 移除about页面,精简导航栏
- 增加最近更新组件,在归档页展示
- 移除notes的index
2025-03-28 21:13:04 +08:00
b5dd9d1f84 Update docs and sort content 2025-03-27 06:17:24 +00:00
ee9a8e4b0a Update docs and sort content 2025-03-27 06:01:12 +00:00
4c96c80101 Update README.md 2025-03-25 18:02:26 +08:00
fa09ed5bc1 Updated with the latest blog posts 2025-03-24 16:04:46 +00:00
07d4fcbc19 Update docs and sort content 2025-03-24 16:01:14 +00:00
a563602baf Updated with the latest blog posts 2025-03-24 15:04:26 +00:00
a7f416df4f docs: 添加个人歌词本链接到自我介绍页 2025-03-24 22:54:18 +08:00
6dfdcc2234 Update docs and sort content 2025-03-24 14:31:49 +00:00
c3ff39ab6e Update docs and sort content 2025-03-24 13:30:59 +00:00
e4d7129465 Update docs and sort content 2025-03-24 13:14:37 +00:00
c8c0250793 Updated with the latest blog posts 2025-03-24 13:10:24 +00:00
73d962248a Update docs and sort content 2025-03-24 12:44:10 +00:00
0149481062 feat: 添加自我介绍组件并将其集成到主页和关于页面 2025-03-24 18:41:57 +08:00
f3547b2e51 Update docs and sort content 2025-03-20 10:18:04 +00:00
ed3119e37d Updated with the latest blog posts 2025-03-20 10:04:44 +00:00
723151fad0 Update docs and sort content 2025-03-20 09:20:37 +00:00
befe3b6f11 Updated with the latest blog posts 2025-03-20 09:04:15 +00:00
433d2f1152 Update docs and sort content 2025-03-20 08:57:34 +00:00
207d923ee7 style: 优化文章图片加载样式 2025-03-20 14:13:16 +08:00
535082b945 Updated with the latest blog posts 2025-03-20 06:05:34 +00:00
cc89da80d8 Update docs and sort content 2025-03-20 05:56:54 +00:00
0c8cae5bea Update docs and sort content 2025-03-20 05:37:01 +00:00
f8e73888d1 Updated with the latest blog posts 2025-03-15 23:03:39 +00:00
53487b36e7 Updated with the latest blog posts 2025-03-15 22:03:42 +00:00
6a3b085635 Updated with the latest blog posts 2025-03-15 21:03:38 +00:00
85ac5bcda1 Updated with the latest blog posts 2025-03-15 20:03:55 +00:00
1b16e54e09 Updated with the latest blog posts 2025-03-15 19:03:28 +00:00
4705878c1d Updated with the latest blog posts 2025-03-15 18:04:36 +00:00
e31323397b Updated with the latest blog posts 2025-03-15 17:03:33 +00:00
b5502d4cbe Updated with the latest blog posts 2025-03-15 16:03:55 +00:00
09b8958141 Update docs and sort content 2025-03-15 15:52:35 +00:00
ac1173786f Update docs and sort content 2025-03-15 15:49:05 +00:00
55040baff5 Updated with the latest blog posts 2025-03-07 02:28:28 +00:00
b2b1ba6dcd Update docs and sort content 2025-03-07 02:21:53 +00:00
66ec490344 Updated with the latest blog posts 2025-03-06 08:05:05 +00:00
39652a9e90 Update docs and sort content 2025-03-06 07:27:17 +00:00
4feb5e95af fix: 修复归档页面链接生成错误
-   修复归档页面中文章链接生成错误的问题
-   根据文章类型(post或note)动态生成链接,将post指向/posts/,note指向/notes/
2025-03-06 15:18:16 +08:00
a9879a68b1 Update docs and sort content 2025-03-06 07:11:30 +00:00
8e7273da0c Updated with the latest blog posts 2025-03-05 10:04:10 +00:00
807cf650f8 Updated with the latest blog posts 2025-03-05 09:04:09 +00:00
b7bf1eab35 style(footer): 调整页脚链接样式以支持折行
- 修改页脚链接的 flex 布局,从 `gap-x-2 sm:gap-x-0` 改为 `flex-wrap gap-x-2 sm:gap-x-0`,使其支持折行。
- 调整链接的内边距,在小屏幕上使用 `px-2 py-2`,在大屏幕上使用 `sm:px-4 sm:py-0`,以优化在小屏幕上的显示效果。
2025-03-05 16:36:49 +08:00
b931b14013 fix(notes): 移除多余的预览链接
- 移除 `/notes/[...page].astro` 中多余的预览链接。
2025-03-05 16:16:30 +08:00
e123d5928a Merge branch 'main' of https://github.com/KazooTTT/kazoottt-blog-v2 2025-03-05 16:14:59 +08:00
e6a88b73af feat(blog): 重构文章和笔记展示,优化分类和标签 2025-03-05 16:14:05 +08:00
c36acc92c6 Updated with the latest blog posts 2025-03-05 08:05:01 +00:00
79e12689c9 Updated with the latest blog posts 2025-03-05 07:04:08 +00:00
013ede32a4 Merge branch 'main' of https://github.com/KazooTTT/kazoottt-blog-v2 2025-03-05 14:26:11 +08:00
ee3068bc18 fix: 移动 ads.txt 文件 2025-03-05 14:26:06 +08:00
99b2d194bb Updated with the latest blog posts 2025-03-04 12:06:14 +00:00
f37e2a10bb Update docs and sort content 2025-03-04 11:07:00 +00:00
ca268a37dc Update docs and sort content 2025-03-04 07:57:37 +00:00
1a40d05221 Updated with the latest blog posts 2025-03-04 07:04:09 +00:00
f5085a2490 Updated with the latest blog posts 2025-03-04 07:04:06 +00:00
0fc8c6cb80 feat(content): 支持内容集合中可选的日期字段 2025-03-04 14:08:17 +08:00
5a7c9eced0 Updated with the latest blog posts 2025-03-04 06:05:10 +00:00
45bbf23dbc Update docs and sort content 2025-03-04 05:52:40 +00:00
66cbee31df Updated with the latest blog posts 2025-03-03 09:04:49 +00:00
ae886f5596 Updated with the latest blog posts 2025-03-03 08:05:41 +00:00
fcf0f24937 Updated with the latest blog posts 2025-03-03 07:04:17 +00:00
10abfc34a7 Update docs and sort content 2025-03-03 06:20:42 +00:00
c5eca7b064 Update docs and sort content 2025-03-03 06:12:56 +00:00
6b7e3f1b70 Update docs and sort content 2025-03-03 06:00:44 +00:00
c12699b65c Update docs and sort content 2025-03-03 05:48:17 +00:00
937eee5627 Update docs and sort content 2025-03-03 03:51:30 +00:00
6dee4650b9 Updated with the latest blog posts 2025-02-28 02:27:51 +00:00
0e9ad45b65 Update main.yml 2025-02-28 10:20:08 +08:00
fd1bbcbf21 Updated with the latest blog posts 2025-02-27 07:03:59 +00:00
47473a34f9 Update docs and sort content 2025-02-27 06:27:49 +00:00
fdd2768e0c Update docs and sort content 2025-02-25 03:56:48 +00:00
57ee25f4f3 fix: add number type parse 2025-02-25 11:55:07 +08:00
58f4e095b5 Update docs and sort content 2025-02-25 03:25:15 +00:00
64383959c0 Update docs and sort content 2025-02-24 15:37:36 +00:00
bb1b0eaa5b Updated with the latest blog posts 2025-02-24 08:05:39 +00:00
2bfda8024b Updated with the latest blog posts 2025-02-24 07:04:21 +00:00
0cf1cbb56a Update docs and sort content 2025-02-24 06:33:22 +00:00
e2e98f9cc7 feat: update rss config 2025-02-24 14:19:48 +08:00
c037d61e49 Merge branch 'main' of https://github.com/KazooTTT/kazoottt-blog-v2 2025-02-24 14:05:41 +08:00
ab931dd953 fix: update feed id for notes 2025-02-24 14:05:37 +08:00
0eba98f263 Updated with the latest blog posts 2025-02-24 06:05:32 +00:00
50d4e72216 fix: 修复未分类的筛选 2025-02-24 13:38:26 +08:00
b3004795f0 Updated with the latest blog posts 2025-02-23 19:03:14 +00:00
92aa02ed46 Updated with the latest blog posts 2025-02-23 18:04:30 +00:00
e7d79d1733 Updated with the latest blog posts 2025-02-23 17:03:34 +00:00
f5a8cd1a06 Update docs and sort content 2025-02-23 16:16:20 +00:00
e5a5192922 Update docs and sort content 2025-02-23 16:12:23 +00:00
7037b5a0fb Update docs and sort content 2025-02-23 16:07:15 +00:00
ab9ca1ba14 Update docs and sort content 2025-02-22 03:48:20 +00:00
57edf2f4e6 Updated with the latest blog posts 2025-02-21 15:03:58 +00:00
b187b8c9ca Update docs and sort content 2025-02-21 14:24:53 +00:00
0e5bf1e01e Updated with the latest blog posts 2025-02-21 14:03:24 +00:00
c57de061be Update docs and sort content 2025-02-21 14:02:31 +00:00
56d4cc877e Merge branch 'main' of https://github.com/KazooTTT/kazoottt-blog-v2 2025-02-21 21:58:29 +08:00
eeed2a201b feat: update date sorting function in notes pages 2025-02-21 21:58:26 +08:00
cf0ed3decd Updated with the latest blog posts 2025-02-21 13:07:45 +00:00
3e4539ddbe Merge branch 'main' of https://github.com/KazooTTT/kazoottt-blog-v2 2025-02-21 20:53:38 +08:00
d3f479d891 feat: change the sort priority 2025-02-21 20:53:36 +08:00
27d1849336 Update docs and sort content 2025-02-21 12:49:28 +00:00
8390d757ea Update docs and sort content 2025-02-21 12:43:48 +00:00
a25ea16c36 Update docs and sort content 2025-02-21 12:39:07 +00:00
febcdb06a4 fix: cf 直接重定向,移除astro配置 2025-02-21 20:27:36 +08:00
a9928d78c8 fix: error directory name 2025-02-21 19:31:59 +08:00
d70d2af9d1 Update docs and sort content 2025-02-21 11:19:40 +00:00
4288d472c7 feat: 优化重定向的写法 2025-02-21 15:44:50 +08:00
2fd907f3e8 Update docs and sort content 2025-02-21 03:39:38 +00:00
95fed683c8 Update docs and sort content 2025-02-21 03:23:48 +00:00
492e9bac78 Update docs and sort content 2025-02-21 02:54:17 +00:00
4fe221acf1 Update docs and sort content 2025-02-19 17:59:49 +00:00
1c36e3f5ec Update docs and sort content 2025-02-19 17:36:53 +00:00
a2bef5b7ad feat: enable notes rss 2025-02-20 01:32:27 +08:00
441 changed files with 3072 additions and 20519 deletions

View File

@ -14,7 +14,7 @@ jobs:
- name: Pull in dev.to posts
uses: gautamkrishnar/blog-post-workflow@v1
with:
template: $newline - [$date 【$categories】 $title]($url)
template: $newline - [$date $title]($url)
date_format: "yyyy-mm-dd"
feed_list: "https://blog.kazoottt.top/rss.xml"
max_post_count: 25

View File

@ -1,52 +1,13 @@
# KazooTTT | 声控烤箱 博客
# KazooTTT 博客
## [Blog](https://blog.kazoottt.top/posts/)
<!-- BLOG-POST-LIST:START -->
- [2025-02-16 【周报】 2025-W07](https://blog.kazoottt.top/posts/2025-W07/)
- [2025-02-09 【周报】 2025-W06](https://blog.kazoottt.top/posts/2025-W06/)
- [2025-02-09 【前端】 不引入astro wiki plugin实现链接跳转的思路](https://blog.kazoottt.top/posts/redirect-links-without-astro-wiki-plugin/)
- [2025-02-06 【软件】 Obsidian Web Clipper 离线阅读同人作品](https://blog.kazoottt.top/posts/obsidian-web-clipper-offline-reading-fanfics/)
- [2025-02-01 【软件】 封面生成器推荐](https://blog.kazoottt.top/posts/cover-generator/)
- [2025-01-30 【年报】 Y5-2024年度总结](https://blog.kazoottt.top/posts/2024-annual-summary/)
- [2025-01-14 【frontend】 how to generate the path like router config in vite + react + react-router project](https://blog.kazoottt.top/posts/how-to-generate-the-path-like-router-config-in-vite-react-react-router-project/)
- [2025-01-12 【随笔】 原来亲人在侧,是我最深重的感谢](https://blog.kazoottt.top/posts/plain-and-simple-is-true/)
- [2025-01-07 【随笔】 ollama + excel 处理器开发总结](https://blog.kazoottt.top/posts/ollama-excel-processor-development-summary/)
- [2025-01-06 【项目】 MUV家元旦24H限定食堂 - 汇总网站](https://blog.kazoottt.top/posts/milklovemuv/)
- [2024-12-19 【推荐】 值得一看的博客](https://blog.kazoottt.top/posts/blogs-worth-reading/)
- [2024-12-18 【】 与hanser有关的github仓库](https://blog.kazoottt.top/posts/hanser-repository/)
- [2024-12-17 【】 Share My Incorrect Usage Cases of Zustand](https://blog.kazoottt.top/posts/share-my-incorrect-usage-case-of-zustand-en/)
- [2024-12-17 【前端】 分享一下我的zustand错误使用案例](https://blog.kazoottt.top/posts/zustand-use-record/)
- [2024-12-11 【】 raycast + imessage 2famessauto的半平替](https://blog.kazoottt.top/posts/raycast-imessage-2fa/)
- [2024-11-29 【】 使用github action定时同步obsidian内容到astro博客仓库](https://blog.kazoottt.top/posts/synchronize-profiles-to-remote-and-local-on-a-regular-basis/)
- [2024-11-23 【软件】 个人工具与设备清单202502](https://blog.kazoottt.top/posts/personal-tools-and-equipment-inventory-202502/)
- [2024-11-12 【旅行】 五一 上海-重庆-成都流水账](https://blog.kazoottt.top/posts/may-1st-shanghai-chongqing-chengdu-flow-account/)
- [2024-09-02 【旅行】 2024 小缘永不完结的冒险 武汉线下vlog](https://blog.kazoottt.top/posts/yukari-2024-live/)
- [2024-07-30 【项目】 微信读书网页版复制快捷键](https://blog.kazoottt.top/posts/wechat-reading-web-version-copy-shortcut/)
- [2024-07-17 【旅行】 2024 BW记录-个人向流水账版](https://blog.kazoottt.top/posts/bw-record-personal-notes/)
- [2024-07-11 【周报】 2024-W03](https://blog.kazoottt.top/posts/2024-W03/)
- [2024-07-11 【周报】 2024-W03-编程篇](https://blog.kazoottt.top/posts/2024-W03-programming/)
- [2024-07-11 【周报】 2023-W48](https://blog.kazoottt.top/posts/2023-W48/)
- [2024-07-08 【旅行】 2024 端午去广州玩了](https://blog.kazoottt.top/posts/duanwu-guangzhou-trip/)<!-- BLOG-POST-LIST:END -->
## 关于我
## [Memos](https://blog.kazoottt.top/notes/)
<!-- MEMO-POST-LIST:START -->
- [2025-02-19 2024-10-21 11分17秒 使用飞书来记账](https://blog.kazoottt.top/notes/fragmented-notes-2025-02-19-21-08-36/)
- [2025-02-19 2024-10-28 18分05秒 craft收费](https://blog.kazoottt.top/notes/fragmented-notes-2025-02-19-21-11-13/)
- [2025-02-19 241029 1144 vite环境变量](https://blog.kazoottt.top/notes/fragmented-notes-2025-02-19-21-11-25/)
- [2025-02-19 碎片-2025-02-19 17时30分 You Should Use Hono in your Next Projec](https://blog.kazoottt.top/notes/fragmented-notes-2025-02-19-17-30-55/)
- [2025-02-17 碎片-2025-02-17 10时55分 做事设计](https://blog.kazoottt.top/notes/fragmented-notes-2025-02-17-10-55-29/)
- [2025-02-16 2024-10-25 13分02秒 Vintage Camera Lab](https://blog.kazoottt.top/notes/fragmented-notes-2025-02-16-23-41-18/)
- [2025-02-14 碎片-2025-02-14 15时00分 状态没变更记录一次没阻止冒泡导致的bug](https://blog.kazoottt.top/notes/fragmented-notes-2025-02-14-15-00-49/)
- [2025-02-14 碎片-2025-02-14 15时18分 飞书 excalidraw画图对比](https://blog.kazoottt.top/notes/fragmented-notes-2025-02-14-15-18-56/)
- [2025-02-11 碎片-2025-02-11 12时32分](https://blog.kazoottt.top/notes/fragmented-notes-2025-02-11-12-32-42/)
- [2025-02-08 如何解决 Nginx 启动时未联网无法访问DNS而挂掉的问题](https://blog.kazoottt.top/notes/nginx-startup-fix-configure-local-hosts-file/)
- [2025-02-06 小红书长文切图笔记?其实 craft 就可以实现。](https://blog.kazoottt.top/notes/use-craft-to-cut-the-long-text-note-of-xiaohongshu/)
- [2025-02-06 试试action5 pro推流到本地rtmp和有线连接的效果](https://blog.kazoottt.top/notes/action5-pro-obs-rtmp/)
- [2025-02-05 askfm的关停](https://blog.kazoottt.top/notes/askfm-shutdown/)
- [2025-02-05 使用 1password 的 secure notes 存储提示词](https://blog.kazoottt.top/notes/use-1password-secure-notes-to-store-prompt-templates/)
- [2025-02-03 记录一次滴滴打车维权](https://blog.kazoottt.top/notes/record-a-ride-sharing-complaint/)
- [2025-01-31 Blender on macOS - Steam Version Limitations for Apple Silicon Devices](https://blog.kazoottt.top/notes/blender-macos-steam-version-limitations/)
- [2025-01-31 how to split window in blender](https://blog.kazoottt.top/notes/split-window-in-blender/)
- [2025-01-20 how to separate object in blender](https://blog.kazoottt.top/notes/how-to-separate-object-in-blender/)
- [2025-01-20 win11如何下载chatgpt](https://blog.kazoottt.top/notes/win11chatgpt/)
- [2025-01-15 how to make a hollow cylinder in blender](https://blog.kazoottt.top/notes/how-to-make-a-hollow-cylinder-in-blender/)<!-- MEMO-POST-LIST:END -->
无论是博客还是笔记,最重要的服务对象是我自己。
[平台合集](https://bento.me/kazoottt)
[个人博客Blog](https://blog.kazoottt.top/)
[个人笔记 Notes](https://notes.kazoottt.top/)
[GitHub](https://github.com/KazooTTT)

View File

@ -21,7 +21,7 @@
"@astrojs/rss": "4.0.11",
"@astrojs/sitemap": "3.2.1",
"@giscus/react": "^3.1.0",
"@tailwindcss/vite": "4.0.3",
"@tailwindcss/vite": "4.0.7",
"astro": "5.2.5",
"astro-expressive-code": "^0.40.1",
"astro-icon": "^1.1.5",
@ -66,7 +66,8 @@
"prettier-plugin-astro": "0.14.1",
"prettier-plugin-tailwindcss": "^0.6.11",
"reading-time": "^1.5.0",
"tailwindcss": "4.0.4",
"tailwindcss": "4.1.5",
"typescript": "^5.7.3"
}
},
"packageManager": "pnpm@10.7.0+sha512.6b865ad4b62a1d9842b61d674a393903b871d9244954f652b8842c2b553c72176b278f64c463e52d40fff8aba385c235c8c9ecf5cc7de4fd78b8bb6d49633ab6"
}

7734
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 319 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 620 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 413 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 847 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 603 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 788 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 827 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

View File

@ -61,19 +61,16 @@ const { className = "", dataPagefindBody = true } = Astro.props;
/* 修改图片相关样式 */
:global(article img) {
opacity: 0;
position: relative;
background-color: #f0f0f0;
transition: all 0.5s ease-in-out;
}
:global(article img.loading) {
opacity: 1;
filter: blur(10px);
}
:global(article img.loaded) {
opacity: 1;
filter: blur(0);
}
</style>

View File

@ -121,6 +121,11 @@ const socialImageURL = new URL(ogImage ? ogImage : "/social-card.png", Astro.url
})(window, document, "clarity", "script", "kvbyuhu6d2");
</script>
<script
defer
src="https://cloud.umami.is/script.js"
data-website-id="247d7726-70c1-46fd-9453-fbe95630c3d6"></script>
<meta content={Astro.generator} name="generator" />
<style is:global>

View File

@ -0,0 +1,30 @@
---
import { getAllCollectionPosts } from "@/data/post";
import { MAX_LATEST_POSTS } from "@/utils/constant";
import { getLatestUpdatedPost } from "@/utils/date";
const allPosts = await getAllCollectionPosts();
const latestUpdatedPost = allPosts.sort(getLatestUpdatedPost).slice(0, MAX_LATEST_POSTS);
---
{
(
<div>
<h2 class="title mb-4 flex items-center gap-2 text-lg">
<a class="">最近更新</a>
</h2>
<ul class="flex flex-wrap gap-2">
{latestUpdatedPost.map((post) => (
<li>
<a
href={`${post.collection === "post" ? "/posts/" : "/notes/"}${post.id}/`}
class="hover:text-link"
>
<span>{post.data.date_modified.toLocaleDateString()}</span>
{post.data.title}
</a>
</li>
))}
</ul>
</div>
)
}

View File

@ -1,7 +1,7 @@
---
import { Icon } from "astro-icon/components";
/**
/**
Uses https://www.astroicon.dev/getting-started/
Find icons via guide: https://www.astroicon.dev/guides/customization/#open-source-icon-sets
Only installed pack is: @iconify-json/mdi
@ -27,14 +27,9 @@ const socialLinks: {
link: "https://x.com/kazoottt",
name: "mdi:twitter",
},
{
friendlyName: "Bilibili",
link: "https://space.bilibili.com/391236013",
name: "mdi:video",
},
{
friendlyName: "YouTube",
link: "https://www.youtube.com/@kazoottt4718",
link: "https://www.youtube.com/@kazoottt255",
name: "mdi:youtube",
},
{
@ -47,6 +42,11 @@ const socialLinks: {
link: "https://bento.me/KazooTTT",
name: "mdi:open-in-new",
},
{
friendlyName: "rss",
link: "https://blog.kazoottt.top/rss.xml",
name: "mdi:rss-box",
},
];
---

View File

@ -1,18 +1,18 @@
---
import type { CollectionEntry } from "astro:content";
import FormattedDate from "@/components/FormattedDate.astro";
import Card from "../componentsBefore/Card.astro";
import { Icon } from "astro-icon/components";
import Label from "../componentsBefore/Label.astro";
import type { PostItem } from "@/types";
interface Props {
content: CollectionEntry<"post">;
content: PostItem;
readingTime: string;
ogImage: string;
}
const {
content: { data },
content: { data, dateToCmp },
readingTime,
ogImage,
} = Astro.props;
@ -27,13 +27,7 @@ const socialImageURL = new URL(ogImage ? ogImage : "/social-card.png", Astro.url
{
socialImageURL && (
<div class="mb-6 aspect-video">
<img
alt={socialImageURL}
class="rounded-lg object-cover"
fetchpriority="high"
loading="eager"
src={socialImageURL}
/>
<img alt={socialImageURL} class="rounded-lg object-cover" src={socialImageURL} />
</div>
)
}
@ -54,7 +48,7 @@ const socialImageURL = new URL(ogImage ? ogImage : "/social-card.png", Astro.url
</h1>
<div class="flex flex-wrap items-center gap-x-3 gap-y-2">
<p class="font-semibold">
<FormattedDate date={data.date} dateTimeOptions={dateTimeOptions} /> /{" "}
<FormattedDate date={dateToCmp} dateTimeOptions={dateTimeOptions} /> /{" "}
{readingTime}
</p>
{

View File

@ -1,10 +1,10 @@
---
import type { CollectionEntry } from "astro:content";
import FormattedDate from "@/components/FormattedDate.astro";
import type { HTMLTag, Polymorphic } from "astro/types";
import type { AllItem } from "@/types";
type Props<Tag extends HTMLTag> = Polymorphic<{ as: Tag }> & {
post: CollectionEntry<"post">;
post: AllItem;
withDesc?: boolean;
};
@ -17,7 +17,11 @@ const { as: Tag = "div", post, withDesc = false } = Astro.props;
/>
<Tag>
{post.data.draft && <span class="text-red-500">(Draft) </span>}
<a class="cactus-link" data-astro-prefetch href={`/posts/${post.id}/`}>
<a
class="hover:text-link"
data-astro-prefetch
href={`${post.collection === "post" ? "/posts/" : "/notes/"}${post.id}/`}
>
{post.data.fixedToTop && <span class="text-accent-2 mr-2">*</span>}
{post.data.title}
</a>

View File

@ -1,111 +1,111 @@
---
import kazootttAvatar from '../../assets/kazoottt-avatar.jpeg'
import { Image } from 'astro:assets'
import kazootttAvatar from "../../assets/kazoottt-avatar.jpeg";
import { Image } from "astro:assets";
---
<header class='fixed left-0 right-0 top-0 z-50 bg-white shadow-sm dark:bg-gray-800'>
<header class="fixed top-0 right-0 left-0 z-50 bg-white shadow-sm dark:bg-gray-800">
<nav
class='mx-auto flex w-full items-center justify-between px-4 py-3 lg:flex lg:w-3/5 lg:w-4/5 lg:items-center'
aria-label='global'
class="mx-auto flex w-full items-center justify-between px-4 py-3 lg:flex lg:w-3/5 lg:w-4/5 lg:items-center"
aria-label="global"
>
<a class='flex items-center' href='/'>
<a class="flex items-center" href="/">
<Image
src={kazootttAvatar}
alt='profile photo'
class='mr-2 h-8 w-auto rounded-full lg:hidden'
loading='eager'
alt="profile photo"
class="mr-2 h-8 w-auto rounded-full lg:hidden"
loading="eager"
/>
<div class='hidden flex-none text-xl font-semibold lg:block' aria-label='Brand'>声控烤箱</div>
<div class="hidden flex-none text-xl font-semibold lg:block" aria-label="Brand">KazooTTT</div>
</a>
<!-- Mobile menu button -->
<button
id='mobileMenuButton'
class='rounded-md p-2 hover:bg-border lg:hidden'
aria-label='Toggle mobile menu'
id="mobileMenuButton"
class="hover:bg-border rounded-md p-2 lg:hidden"
aria-label="Toggle mobile menu"
>
<svg
xmlns='http://www.w3.org/2000/svg'
width='24'
height='24'
viewBox='0 0 24 24'
class='h-6 w-6'
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
class="h-6 w-6"
>
<path fill='currentColor' d='M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z'></path>
<path fill="currentColor" d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"></path>
</svg>
</button>
<!-- Desktop Navigation -->
<div class='hidden flex-row items-center justify-center gap-x-7 lg:flex'>
<div class='relative'>
<div class="hidden flex-row items-center justify-center gap-x-7 lg:flex">
<div class="relative">
<a
href='/blog'
class={`peer flex items-center text-[1.05rem] font-medium ${Astro.url.pathname.startsWith('/blog') ? 'text-green-400' : ''}`}
aria-label='Blog Menu'
href="/blog"
class={`peer flex items-center text-[1.05rem] font-medium ${Astro.url.pathname.startsWith("/blog") ? "text-green-400" : ""}`}
aria-label="Blog Menu"
>
Blog
<svg
xmlns='http://www.w3.org/2000/svg'
width='20'
height='20'
viewBox='0 0 24 24'
class='ml-1 transform transition-transform duration-200 peer-hover:rotate-180'
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 24 24"
class="ml-1 transform transition-transform duration-200 peer-hover:rotate-180"
>
<path fill='currentColor' d='m12 15l-5-5h10z'></path>
<path fill="currentColor" d="m12 15l-5-5h10z"></path>
</svg>
</a>
<div
class='invisible absolute left-0 mt-2 w-48 rounded-md bg-white py-2 opacity-0 shadow-lg transition-all duration-200 hover:visible hover:opacity-100 peer-hover:visible peer-hover:opacity-100 dark:bg-gray-800'
class="invisible absolute left-0 mt-2 w-48 rounded-md bg-white py-2 opacity-0 shadow-lg transition-all duration-200 peer-hover:visible peer-hover:opacity-100 hover:visible hover:opacity-100 dark:bg-gray-800"
>
<a
href='/categories'
class={`block px-6 py-3 text-[1.05rem] font-medium transition-colors hover:bg-gray-100 ${Astro.url.pathname.startsWith('/categories') ? 'text-green-400' : ''} dark:hover:bg-gray-700`}
aria-label='Categories Page'
href="/categories"
class={`block px-6 py-3 text-[1.05rem] font-medium transition-colors hover:bg-gray-100 ${Astro.url.pathname.startsWith("/categories") ? "text-green-400" : ""} dark:hover:bg-gray-700`}
aria-label="Categories Page"
>
Categories
</a>
<a
href='/tags'
class={`block px-6 py-3 text-[1.05rem] font-medium transition-colors hover:bg-gray-100 ${Astro.url.pathname.startsWith('/tags') ? 'text-green-400' : ''} dark:hover:bg-gray-700`}
aria-label='Tags Page'
href="/tags"
class={`block px-6 py-3 text-[1.05rem] font-medium transition-colors hover:bg-gray-100 ${Astro.url.pathname.startsWith("/tags") ? "text-green-400" : ""} dark:hover:bg-gray-700`}
aria-label="Tags Page"
>
Tags
</a>
<a
href='/diary'
class={`block px-6 py-3 text-[1.05rem] font-medium transition-colors hover:bg-gray-100 ${Astro.url.pathname.startsWith('/diary') ? 'text-green-400' : ''} dark:hover:bg-gray-700`}
aria-label='Diary Page'
href="/diary"
class={`block px-6 py-3 text-[1.05rem] font-medium transition-colors hover:bg-gray-100 ${Astro.url.pathname.startsWith("/diary") ? "text-green-400" : ""} dark:hover:bg-gray-700`}
aria-label="Diary Page"
>
Diary
</a>
</div>
</div>
<a
href='/tools'
class={`flex-none text-[1.05rem] font-medium ${Astro.url.pathname.startsWith('/tools') ? 'text-green-400' : ''}`}
aria-label='Nav Menu Item'
href="/tools"
class={`flex-none text-[1.05rem] font-medium ${Astro.url.pathname.startsWith("/tools") ? "text-green-400" : ""}`}
aria-label="Nav Menu Item"
>Tools
</a>
<div class='relative'>
<button class='peer flex items-center text-[1.05rem] font-medium' aria-label='More Menu'>
<div class="relative">
<button class="peer flex items-center text-[1.05rem] font-medium" aria-label="More Menu">
More
<svg
xmlns='http://www.w3.org/2000/svg'
width='20'
height='20'
viewBox='0 0 24 24'
class='ml-1 transform transition-transform duration-200 peer-hover:rotate-180'
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 24 24"
class="ml-1 transform transition-transform duration-200 peer-hover:rotate-180"
>
<path fill='currentColor' d='m12 15l-5-5h10z'></path>
<path fill="currentColor" d="m12 15l-5-5h10z"></path>
</svg>
</button>
<div
class='invisible absolute right-0 mt-2 w-48 rounded-md bg-white py-2 opacity-0 shadow-lg transition-all duration-200 hover:visible hover:opacity-100 peer-hover:visible peer-hover:opacity-100 dark:bg-gray-800'
class="invisible absolute right-0 mt-2 w-48 rounded-md bg-white py-2 opacity-0 shadow-lg transition-all duration-200 peer-hover:visible peer-hover:opacity-100 hover:visible hover:opacity-100 dark:bg-gray-800"
>
<a
href='/friends'
class={`block px-6 py-3 text-[1.05rem] font-medium transition-colors hover:bg-gray-100 ${Astro.url.pathname.startsWith('/friends') ? 'text-green-400' : ''} dark:hover:bg-gray-700`}
aria-label='Friends Page'
href="/friends"
class={`block px-6 py-3 text-[1.05rem] font-medium transition-colors hover:bg-gray-100 ${Astro.url.pathname.startsWith("/friends") ? "text-green-400" : ""} dark:hover:bg-gray-700`}
aria-label="Friends Page"
>
Friends
</a>
@ -113,30 +113,30 @@ import { Image } from 'astro:assets'
</div>
<button
id='toggleDarkMode'
class='relative rounded-md border border-border p-1.5 transition-all hover:bg-border'
id="toggleDarkMode"
class="border-border hover:bg-border relative rounded-md border p-1.5 transition-all"
>
<span class='sr-only'>Dark Theme</span>
<span class="sr-only">Dark Theme</span>
<svg
xmlns='http://www.w3.org/2000/svg'
width='32'
height='32'
viewBox='0 0 24 24'
class='h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:hidden dark:-rotate-90 dark:scale-0'
xmlns="http://www.w3.org/2000/svg"
width="32"
height="32"
viewBox="0 0 24 24"
class="h-[1.2rem] w-[1.2rem] scale-100 rotate-0 transition-all dark:hidden dark:scale-0 dark:-rotate-90"
><path
fill='currentColor'
d='M12 15q1.25 0 2.125-.875T15 12q0-1.25-.875-2.125T12 9q-1.25 0-2.125.875T9 12q0 1.25.875 2.125T12 15m0 1q-1.671 0-2.836-1.164T8 12q0-1.671 1.164-2.836T12 8q1.671 0 2.836 1.164T16 12q0 1.671-1.164 2.836T12 16m-7-3.5H1.5v-1H5zm17.5 0H19v-1h3.5zM11.5 5V1.5h1V5zm0 17.5V19h1v3.5zM6.746 7.404l-2.16-2.098l.695-.744l2.111 2.134zM18.72 19.438l-2.117-2.14l.652-.702l2.16 2.098zM16.596 6.746l2.098-2.16l.744.695l-2.134 2.111zM4.562 18.72l2.14-2.117l.663.652l-2.078 2.179zM12 12'
fill="currentColor"
d="M12 15q1.25 0 2.125-.875T15 12q0-1.25-.875-2.125T12 9q-1.25 0-2.125.875T9 12q0 1.25.875 2.125T12 15m0 1q-1.671 0-2.836-1.164T8 12q0-1.671 1.164-2.836T12 8q1.671 0 2.836 1.164T16 12q0 1.671-1.164 2.836T12 16m-7-3.5H1.5v-1H5zm17.5 0H19v-1h3.5zM11.5 5V1.5h1V5zm0 17.5V19h1v3.5zM6.746 7.404l-2.16-2.098l.695-.744l2.111 2.134zM18.72 19.438l-2.117-2.14l.652-.702l2.16 2.098zM16.596 6.746l2.098-2.16l.744.695l-2.134 2.111zM4.562 18.72l2.14-2.117l.663.652l-2.078 2.179zM12 12"
></path></svg
>
<svg
xmlns='http://www.w3.org/2000/svg'
width='32'
height='32'
viewBox='0 0 24 24'
class='hidden h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:block dark:rotate-0 dark:scale-100'
xmlns="http://www.w3.org/2000/svg"
width="32"
height="32"
viewBox="0 0 24 24"
class="hidden h-[1.2rem] w-[1.2rem] scale-0 rotate-90 transition-all dark:block dark:scale-100 dark:rotate-0"
><path
fill='currentColor'
d='M12.058 20q-3.334 0-5.667-2.333Q4.058 15.333 4.058 12q0-3.038 1.98-5.27Q8.02 4.5 10.942 4.097q.081 0 .159.006t.153.017q-.506.706-.801 1.57q-.295.865-.295 1.811q0 2.667 1.866 4.533q1.867 1.867 4.534 1.867q.952 0 1.813-.295q.862-.295 1.548-.801q.012.075.018.153q.005.078.005.158q-.384 2.923-2.615 4.904T12.057 20'
fill="currentColor"
d="M12.058 20q-3.334 0-5.667-2.333Q4.058 15.333 4.058 12q0-3.038 1.98-5.27Q8.02 4.5 10.942 4.097q.081 0 .159.006t.153.017q-.506.706-.801 1.57q-.295.865-.295 1.811q0 2.667 1.866 4.533q1.867 1.867 4.534 1.867q.952 0 1.813-.295q.862-.295 1.548-.801q.012.075.018.153q.005.078.005.158q-.384 2.923-2.615 4.904T12.057 20"
></path></svg
>
</button>
@ -144,71 +144,71 @@ import { Image } from 'astro:assets'
<!-- Mobile Navigation -->
<div
id='mobileMenu'
class='fixed inset-x-0 top-[72px] z-50 hidden max-h-[calc(100vh-72px)] overflow-y-auto rounded-b-lg bg-white shadow-lg dark:bg-gray-800 lg:hidden'
id="mobileMenu"
class="fixed inset-x-0 top-[72px] z-50 hidden max-h-[calc(100vh-72px)] overflow-y-auto rounded-b-lg bg-white shadow-lg lg:hidden dark:bg-gray-800"
>
<div class='space-y-2 px-4 py-2'>
<div class="space-y-2 px-4 py-2">
<a
href='/blog'
class={`block py-2 text-[1.05rem] font-medium ${Astro.url.pathname.startsWith('/blog') ? 'text-green-400' : ''}`}
href="/blog"
class={`block py-2 text-[1.05rem] font-medium ${Astro.url.pathname.startsWith("/blog") ? "text-green-400" : ""}`}
>
Blog
</a>
<a
href='/categories'
class={`block py-2 text-[1.05rem] font-medium ${Astro.url.pathname.startsWith('/categories') ? 'text-green-400' : ''}`}
href="/categories"
class={`block py-2 text-[1.05rem] font-medium ${Astro.url.pathname.startsWith("/categories") ? "text-green-400" : ""}`}
>
Categories
</a>
<a
href='/tags'
class={`block py-2 text-[1.05rem] font-medium ${Astro.url.pathname.startsWith('/tags') ? 'text-green-400' : ''}`}
href="/tags"
class={`block py-2 text-[1.05rem] font-medium ${Astro.url.pathname.startsWith("/tags") ? "text-green-400" : ""}`}
>
Tags
</a>
<a
href='/diary'
class={`block py-2 text-[1.05rem] font-medium ${Astro.url.pathname.startsWith('/diary') ? 'text-green-400' : ''}`}
href="/diary"
class={`block py-2 text-[1.05rem] font-medium ${Astro.url.pathname.startsWith("/diary") ? "text-green-400" : ""}`}
>
Diary
</a>
<a
href='/tools'
class={`block py-2 text-[1.05rem] font-medium ${Astro.url.pathname.startsWith('/tools') ? 'text-green-400' : ''}`}
href="/tools"
class={`block py-2 text-[1.05rem] font-medium ${Astro.url.pathname.startsWith("/tools") ? "text-green-400" : ""}`}
>
Tools
</a>
<a
href='/friends'
class={`block py-2 text-[1.05rem] font-medium ${Astro.url.pathname.startsWith('/friends') ? 'text-green-400' : ''}`}
href="/friends"
class={`block py-2 text-[1.05rem] font-medium ${Astro.url.pathname.startsWith("/friends") ? "text-green-400" : ""}`}
>
Friends
</a>
<button
id='mobileToggleDarkMode'
class='mt-2 flex w-full items-center py-2 text-[1.05rem] font-medium'
id="mobileToggleDarkMode"
class="mt-2 flex w-full items-center py-2 text-[1.05rem] font-medium"
>
<span>Theme</span>
<svg
xmlns='http://www.w3.org/2000/svg'
width='32'
height='32'
viewBox='0 0 24 24'
class='ml-2 h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:hidden dark:-rotate-90 dark:scale-0'
xmlns="http://www.w3.org/2000/svg"
width="32"
height="32"
viewBox="0 0 24 24"
class="ml-2 h-[1.2rem] w-[1.2rem] scale-100 rotate-0 transition-all dark:hidden dark:scale-0 dark:-rotate-90"
><path
fill='currentColor'
d='M12 15q1.25 0 2.125-.875T15 12q0-1.25-.875-2.125T12 9q-1.25 0-2.125.875T9 12q0 1.25.875 2.125T12 15m0 1q-1.671 0-2.836-1.164T8 12q0-1.671 1.164-2.836T12 8q1.671 0 2.836 1.164T16 12q0 1.671-1.164 2.836T12 16m-7-3.5H1.5v-1H5zm17.5 0H19v-1h3.5zM11.5 5V1.5h1V5zm0 17.5V19h1v3.5zM6.746 7.404l-2.16-2.098l.695-.744l2.111 2.134zM18.72 19.438l-2.117-2.14l.652-.702l2.16 2.098zM16.596 6.746l2.098-2.16l.744.695l-2.134 2.111zM4.562 18.72l2.14-2.117l.663.652l-2.078 2.179zM12 12'
fill="currentColor"
d="M12 15q1.25 0 2.125-.875T15 12q0-1.25-.875-2.125T12 9q-1.25 0-2.125.875T9 12q0 1.25.875 2.125T12 15m0 1q-1.671 0-2.836-1.164T8 12q0-1.671 1.164-2.836T12 8q1.671 0 2.836 1.164T16 12q0 1.671-1.164 2.836T12 16m-7-3.5H1.5v-1H5zm17.5 0H19v-1h3.5zM11.5 5V1.5h1V5zm0 17.5V19h1v3.5zM6.746 7.404l-2.16-2.098l.695-.744l2.111 2.134zM18.72 19.438l-2.117-2.14l.652-.702l2.16 2.098zM16.596 6.746l2.098-2.16l.744.695l-2.134 2.111zM4.562 18.72l2.14-2.117l.663.652l-2.078 2.179zM12 12"
></path></svg
>
<svg
xmlns='http://www.w3.org/2000/svg'
width='32'
height='32'
viewBox='0 0 24 24'
class='ml-2 hidden h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:block dark:rotate-0 dark:scale-100'
xmlns="http://www.w3.org/2000/svg"
width="32"
height="32"
viewBox="0 0 24 24"
class="ml-2 hidden h-[1.2rem] w-[1.2rem] scale-0 rotate-90 transition-all dark:block dark:scale-100 dark:rotate-0"
><path
fill='currentColor'
d='M12.058 20q-3.334 0-5.667-2.333Q4.058 15.333 4.058 12q0-3.038 1.98-5.27Q8.02 4.5 10.942 4.097q.081 0 .159.006t.153.017q-.506.706-.801 1.57q-.295.865-.295 1.811q0 2.667 1.866 4.533q1.867 1.867 4.534 1.867q.952 0 1.813-.295q.862-.295 1.548-.801q.012.075.018.153q.005.078.005.158q-.384 2.923-2.615 4.904T12.057 20'
fill="currentColor"
d="M12.058 20q-3.334 0-5.667-2.333Q4.058 15.333 4.058 12q0-3.038 1.98-5.27Q8.02 4.5 10.942 4.097q.081 0 .159.006t.153.017q-.506.706-.801 1.57q-.295.865-.295 1.811q0 2.667 1.866 4.533q1.867 1.867 4.534 1.867q.952 0 1.813-.295q.862-.295 1.548-.801q.012.075.018.153q.005.078.005.158q-.384 2.923-2.615 4.904T12.057 20"
></path></svg
>
</button>
@ -219,59 +219,59 @@ import { Image } from 'astro:assets'
<script>
function getCurrentTheme() {
return localStorage.getItem('theme')
return localStorage.getItem("theme");
}
function setupDarkModeToggle() {
const toggleDarkModeButton = document.getElementById('toggleDarkMode')
const mobileToggleDarkMode = document.getElementById('mobileToggleDarkMode')
const toggleDarkModeButton = document.getElementById("toggleDarkMode");
const mobileToggleDarkMode = document.getElementById("mobileToggleDarkMode");
function toggleTheme() {
const currentTheme = getCurrentTheme()
const newTheme = currentTheme === 'dark' ? 'light' : 'dark'
localStorage.setItem('theme', newTheme)
document.documentElement.classList.toggle('dark')
const currentTheme = getCurrentTheme();
const newTheme = currentTheme === "dark" ? "light" : "dark";
localStorage.setItem("theme", newTheme);
document.documentElement.classList.toggle("dark");
// Dispatch theme change event
window.dispatchEvent(new CustomEvent('theme-change', { detail: { theme: newTheme } }))
window.dispatchEvent(new CustomEvent("theme-change", { detail: { theme: newTheme } }));
}
if (toggleDarkModeButton) {
toggleDarkModeButton.addEventListener('click', toggleTheme)
toggleDarkModeButton.addEventListener("click", toggleTheme);
}
if (mobileToggleDarkMode) {
mobileToggleDarkMode.addEventListener('click', toggleTheme)
mobileToggleDarkMode.addEventListener("click", toggleTheme);
}
}
function setupMobileMenu() {
const mobileMenuButton = document.getElementById('mobileMenuButton')
const mobileMenu = document.getElementById('mobileMenu')
if (!mobileMenuButton || !mobileMenu) return
const mobileMenuButton = document.getElementById("mobileMenuButton");
const mobileMenu = document.getElementById("mobileMenu");
if (!mobileMenuButton || !mobileMenu) return;
mobileMenuButton.addEventListener('click', () => {
mobileMenu.classList.toggle('hidden')
})
mobileMenuButton.addEventListener("click", () => {
mobileMenu.classList.toggle("hidden");
});
// Close mobile menu when clicking outside
document.addEventListener('click', (event) => {
document.addEventListener("click", (event) => {
if (
!mobileMenuButton.contains(event.target as Node) &&
!mobileMenu.contains(event.target as Node)
) {
mobileMenu.classList.add('hidden')
mobileMenu.classList.add("hidden");
}
})
});
}
// Setup initial functionality
setupDarkModeToggle()
setupMobileMenu()
setupDarkModeToggle();
setupMobileMenu();
// Re-setup functionality after view transitions
document.addEventListener('astro:after-swap', () => {
setupDarkModeToggle()
setupMobileMenu()
})
document.addEventListener("astro:after-swap", () => {
setupDarkModeToggle();
setupMobileMenu();
});
</script>

Some files were not shown because too many files have changed in this diff Show More