@bbki.ng/site 0.0.17 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/deploy.yml +44 -44
- package/.prettierignore +1 -1
- package/CHANGELOG.md +11 -0
- package/CODE_OF_CONDUCT.md +45 -45
- package/CONTRIBUTING.md +11 -11
- package/LICENSE +21 -21
- package/README.md +21 -21
- package/index.html +33 -33
- package/jest.config.js +15 -15
- package/package.json +3 -3
- package/postcss.config.cjs +6 -6
- package/public/Logo.svg +9 -9
- package/public/favicon.svg +9 -9
- package/public/robots.txt +2 -2
- package/src/__test__/utils/index.test.ts +90 -90
- package/src/app.tsx +97 -97
- package/src/articles/anti-logic.mdx +61 -61
- package/src/articles/bbking-manual.mdx +88 -88
- package/src/articles/black-river.mdx +8 -8
- package/src/articles/cooldown.mdx +12 -12
- package/src/articles/fall.mdx +8 -8
- package/src/articles/img.mdx +104 -104
- package/src/articles/index.ts +35 -35
- package/src/articles/loading.mdx +129 -129
- package/src/articles/major-cold.mdx +14 -14
- package/src/articles/men-without-women.mdx +19 -19
- package/src/articles/movie-day.mdx +15 -15
- package/src/articles/now.mdx +14 -14
- package/src/articles/projects.mdx +9 -9
- package/src/articles/quote.mdx +27 -27
- package/src/articles/spring-cooldown.mdx +7 -7
- package/src/articles/spring-rain.mdx +9 -9
- package/src/articles/travel.mdx +21 -21
- package/src/articles/warming-up.mdx +10 -10
- package/src/articles/web-burnning.mdx +10 -10
- package/src/auth_required.tsx +17 -17
- package/src/components/Spinner.tsx +33 -33
- package/src/components/article/index.tsx +31 -31
- package/src/components/aspect_ratio_box/index.tsx +29 -29
- package/src/components/blur_cover/index.tsx +28 -28
- package/src/components/book_list/index.tsx +50 -50
- package/src/components/comment/index.tsx +70 -70
- package/src/components/comment/use_cusdis_event.ts +37 -37
- package/src/components/corner_prompt_box/index.tsx +63 -63
- package/src/components/disabled_text/index.tsx +23 -23
- package/src/components/fade_out_cover/index.tsx +37 -37
- package/src/components/footer/footer_links.ts +13 -13
- package/src/components/footer/index.tsx +21 -21
- package/src/components/hotkey_nav/index.tsx +50 -50
- package/src/components/img_list/index.tsx +43 -43
- package/src/components/index.tsx +27 -27
- package/src/components/movie_list/index.tsx +50 -50
- package/src/components/my_suspense.tsx +14 -14
- package/src/components/progress_bar/index.tsx +31 -31
- package/src/components/reload_prompt/index.tsx +36 -36
- package/src/components/stickers/index.tsx +46 -46
- package/src/components/table_skeleton/index.tsx +40 -40
- package/src/components/tags/index.tsx +52 -52
- package/src/components/video_player/index.tsx +81 -81
- package/src/components/with_wrapper/index.tsx +13 -13
- package/src/constants/cusdis.ts +6 -6
- package/src/constants/index.ts +16 -16
- package/src/constants/photo_projects.ts +54 -54
- package/src/constants/routes.ts +24 -24
- package/src/constants/video_logs.ts +16 -16
- package/src/demo/SpinnerDemo.tsx +17 -17
- package/src/global/mdx.d.ts +8 -8
- package/src/global_loading_state_provider.tsx +27 -27
- package/src/hooks/index.ts +15 -15
- package/src/hooks/useScrollToTop.ts +24 -24
- package/src/hooks/useTransitionCls.ts +36 -36
- package/src/hooks/use_img_loading.ts +16 -16
- package/src/hooks/use_pathname.ts +6 -6
- package/src/hooks/use_paths.ts +30 -30
- package/src/hooks/use_projects.ts +56 -56
- package/src/hooks/use_route_name.ts +7 -7
- package/src/hooks/use_supa_session.ts +30 -30
- package/src/hooks/use_uploader.ts +34 -34
- package/src/hooks/use_video_controls.ts +71 -71
- package/src/main.css +156 -156
- package/src/main.tsx +19 -19
- package/src/pages/cover/index.tsx +10 -10
- package/src/pages/extensions/png/consts.ts +9 -9
- package/src/pages/extensions/png/index.tsx +41 -41
- package/src/pages/extensions/png/png_projects.tsx +63 -63
- package/src/pages/extensions/txt/article.tsx +26 -26
- package/src/pages/extensions/txt/consts.ts +8 -8
- package/src/pages/extensions/txt/index.tsx +21 -21
- package/src/pages/index.tsx +14 -14
- package/src/pages/login/index.tsx +33 -33
- package/src/pages/now/index.tsx +7 -7
- package/src/pages/tags/index.tsx +28 -28
- package/src/pages/tags/tag_result.tsx +19 -19
- package/src/swr.tsx +18 -18
- package/src/types/articles.ts +6 -6
- package/src/types/color.ts +21 -21
- package/src/types/cusdis.ts +4 -4
- package/src/types/oss.ts +15 -15
- package/src/types/path.ts +11 -11
- package/src/types/photo.ts +17 -17
- package/src/types/supabase.ts +9 -9
- package/src/utils/tags.ts +21 -21
- package/tailwind.config.cjs +10 -10
- package/tsconfig.json +24 -24
- package/vite.config.ts +108 -108
- package/.rush/temp/shrinkwrap-deps.json +0 -908
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 没有女人的男人们
|
|
3
|
-
tags:
|
|
4
|
-
- 随笔
|
|
5
|
-
- 阅读
|
|
6
|
-
- 一天计划
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
《没有女人的男人们》是村上春树的短篇小说集,书本介绍写的是:「村上返回原点之作,《东京奇谭集》之后时隔九年又一短篇小说集」。「返回原点」也多少有点像在说自己,时隔三年又回到之前离开的城市。一天刚好看完。
|
|
10
|
-
|
|
11
|
-
| 上午 | 下午 | 晚上 |
|
|
12
|
-
|:----|:-----|:----|
|
|
13
|
-
| 驾驶我的车 <br /> 昨天 | 独立器官 <br /> 山鲁左德 <br /> 木野 | 恋爱的萨姆沙 |
|
|
14
|
-
|
|
15
|
-
故事中的男人们,有人妻子过世,有人想满世界流浪,有人是坚定的不婚主义,有人被戴上有颜色的帽子……男男女女,来来去去。短篇小说比起电影好像更任性一点,结局戛然而止也让人也觉得情理之中,根据交代过的信息想象一下男女主接下来的境遇也是一件很有意思的事情。我最喜欢的两篇是《山鲁佐德》和《木野》。前者作为一个故事,故事中又穿插了女主讲述的故事,很有层次感,也很容易被带入女主的玄妙变态、虚实莫辨的回忆或者说是想象中。甚至阅读完都不太想深究她和男主到底是什么关系。此外文中有一段关于胡子的描述,觉得挺好玩,感觉也可以尝试一下:
|
|
16
|
-
|
|
17
|
-
> 他之所以开始蓄胡子,主要是因为没有什么事情可做。如果有了胡子,他便可以经常把手放在下颔、鼻子下边或者鬓角,享受触摸的感觉。用剪刀和锑须刀修剪胡子的形状,也可以消磨时间。他这才发现,原来仅仅留个胡子,便能打发无聊。
|
|
18
|
-
|
|
19
|
-
《木野》直到结尾才对自己说,没错,我受伤了。一开始,故事男主好像都不是他一样,快结尾情节也开始有点莫名奇妙,就像拍摄过程中相机一直没有对焦。直到最后,木野对自己说,没错,我受伤了。读者可能才会和木野一起恍然而悟,是啊,他一开始就是个受伤的人啊。木野落跑逃避,沉默冷静,毫不在意。但最终他还是要正面盯着自己的创伤。
|
|
1
|
+
---
|
|
2
|
+
title: 没有女人的男人们
|
|
3
|
+
tags:
|
|
4
|
+
- 随笔
|
|
5
|
+
- 阅读
|
|
6
|
+
- 一天计划
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
《没有女人的男人们》是村上春树的短篇小说集,书本介绍写的是:「村上返回原点之作,《东京奇谭集》之后时隔九年又一短篇小说集」。「返回原点」也多少有点像在说自己,时隔三年又回到之前离开的城市。一天刚好看完。
|
|
10
|
+
|
|
11
|
+
| 上午 | 下午 | 晚上 |
|
|
12
|
+
|:----|:-----|:----|
|
|
13
|
+
| 驾驶我的车 <br /> 昨天 | 独立器官 <br /> 山鲁左德 <br /> 木野 | 恋爱的萨姆沙 |
|
|
14
|
+
|
|
15
|
+
故事中的男人们,有人妻子过世,有人想满世界流浪,有人是坚定的不婚主义,有人被戴上有颜色的帽子……男男女女,来来去去。短篇小说比起电影好像更任性一点,结局戛然而止也让人也觉得情理之中,根据交代过的信息想象一下男女主接下来的境遇也是一件很有意思的事情。我最喜欢的两篇是《山鲁佐德》和《木野》。前者作为一个故事,故事中又穿插了女主讲述的故事,很有层次感,也很容易被带入女主的玄妙变态、虚实莫辨的回忆或者说是想象中。甚至阅读完都不太想深究她和男主到底是什么关系。此外文中有一段关于胡子的描述,觉得挺好玩,感觉也可以尝试一下:
|
|
16
|
+
|
|
17
|
+
> 他之所以开始蓄胡子,主要是因为没有什么事情可做。如果有了胡子,他便可以经常把手放在下颔、鼻子下边或者鬓角,享受触摸的感觉。用剪刀和锑须刀修剪胡子的形状,也可以消磨时间。他这才发现,原来仅仅留个胡子,便能打发无聊。
|
|
18
|
+
|
|
19
|
+
《木野》直到结尾才对自己说,没错,我受伤了。一开始,故事男主好像都不是他一样,快结尾情节也开始有点莫名奇妙,就像拍摄过程中相机一直没有对焦。直到最后,木野对自己说,没错,我受伤了。读者可能才会和木野一起恍然而悟,是啊,他一开始就是个受伤的人啊。木野落跑逃避,沉默冷静,毫不在意。但最终他还是要正面盯着自己的创伤。
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 个人电影节
|
|
3
|
-
tags:
|
|
4
|
-
- 随笔
|
|
5
|
-
- 电影
|
|
6
|
-
- 一天计划
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
**一天计划**,用一天时间在同一个地点做同一件事情。比如写一天代码、看一天书。个人电影节也是「一天计划」的一部分。从之前标记想看的电影清单中随机挑选出五部电影,用一天时间看完。
|
|
10
|
-
|
|
11
|
-
| 上午 | 下午 | 晚上 |
|
|
12
|
-
|:----|:-----|:----|
|
|
13
|
-
| 花火 <br /> 数电影的人 | 不能说的游戏 <br /> 蜂蜜之地 | 尽情游戏 |
|
|
14
|
-
|
|
15
|
-
《花火》整部电影都很沉默冷静,甚至连剧中的枪响也是。可能是浓烈的情感需要大面积的留白去稀释,主角台词不多,却好像什么都已说尽。《数电影的人》是一部记录片,介绍了一群修复电影胶片的人,为电影延续生命。他们有枯燥的工作,有来自同事间互相鼓励和安慰。有意义危机,也有使命感和成就感。我更羡慕的是他们的工作周期,能花很长很长的一段时间慢慢把事情做好,也紧迫也从容。《不能说的游戏》讲述小女孩被熟人性侵后,整个人生受到的影响。电影配乐很欢快,大部分剪辑也是,但看似轻松欢快的节奏,却能让人感受到背后的压抑与主角内心困兽般的反应。这部电影,比起犯人,我更讨厌女主的母亲。《蜂蜜之地》是一部很美的记录片,贫瘠的土地,满眼只能看到岩石灌木和沙砾。相依为命的母女,贪婪的邻居。能够看到一种截然不同的生活方式,已经很心满意足。《尽情游戏》则是一部轻松的喜剧,可能包含了对战争的反思,我更愿意就把它当成一部普通的喜剧。最后其实还有一部德国电影《奇迹》,已经无法看下去,就像很久没有运动,跑完三公里已经到了极限,无法跑完最后一圈。
|
|
1
|
+
---
|
|
2
|
+
title: 个人电影节
|
|
3
|
+
tags:
|
|
4
|
+
- 随笔
|
|
5
|
+
- 电影
|
|
6
|
+
- 一天计划
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
**一天计划**,用一天时间在同一个地点做同一件事情。比如写一天代码、看一天书。个人电影节也是「一天计划」的一部分。从之前标记想看的电影清单中随机挑选出五部电影,用一天时间看完。
|
|
10
|
+
|
|
11
|
+
| 上午 | 下午 | 晚上 |
|
|
12
|
+
|:----|:-----|:----|
|
|
13
|
+
| 花火 <br /> 数电影的人 | 不能说的游戏 <br /> 蜂蜜之地 | 尽情游戏 |
|
|
14
|
+
|
|
15
|
+
《花火》整部电影都很沉默冷静,甚至连剧中的枪响也是。可能是浓烈的情感需要大面积的留白去稀释,主角台词不多,却好像什么都已说尽。《数电影的人》是一部记录片,介绍了一群修复电影胶片的人,为电影延续生命。他们有枯燥的工作,有来自同事间互相鼓励和安慰。有意义危机,也有使命感和成就感。我更羡慕的是他们的工作周期,能花很长很长的一段时间慢慢把事情做好,也紧迫也从容。《不能说的游戏》讲述小女孩被熟人性侵后,整个人生受到的影响。电影配乐很欢快,大部分剪辑也是,但看似轻松欢快的节奏,却能让人感受到背后的压抑与主角内心困兽般的反应。这部电影,比起犯人,我更讨厌女主的母亲。《蜂蜜之地》是一部很美的记录片,贫瘠的土地,满眼只能看到岩石灌木和沙砾。相依为命的母女,贪婪的邻居。能够看到一种截然不同的生活方式,已经很心满意足。《尽情游戏》则是一部轻松的喜剧,可能包含了对战争的反思,我更愿意就把它当成一部普通的喜剧。最后其实还有一部德国电影《奇迹》,已经无法看下去,就像很久没有运动,跑完三公里已经到了极限,无法跑完最后一圈。
|
package/src/articles/now.mdx
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 在干嘛?
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
import { MovieList } from "@/components/movie_list";
|
|
6
|
-
import { BookList } from "@/components/book_list";
|
|
7
|
-
|
|
8
|
-
## 编码
|
|
9
|
-
- [github](https://github.com/zjhou)
|
|
10
|
-
|
|
11
|
-
## 阅读
|
|
12
|
-
<BookList />
|
|
13
|
-
|
|
14
|
-
## 电影
|
|
1
|
+
---
|
|
2
|
+
title: 在干嘛?
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
import { MovieList } from "@/components/movie_list";
|
|
6
|
+
import { BookList } from "@/components/book_list";
|
|
7
|
+
|
|
8
|
+
## 编码
|
|
9
|
+
- [github](https://github.com/zjhou)
|
|
10
|
+
|
|
11
|
+
## 阅读
|
|
12
|
+
<BookList />
|
|
13
|
+
|
|
14
|
+
## 电影
|
|
15
15
|
<MovieList />
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 图片
|
|
3
|
-
headless: True
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
import Png from "@/pages/extensions/png";
|
|
7
|
-
|
|
8
|
-
<Png />
|
|
9
|
-
|
|
1
|
+
---
|
|
2
|
+
title: 图片
|
|
3
|
+
headless: True
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
import Png from "@/pages/extensions/png";
|
|
7
|
+
|
|
8
|
+
<Png />
|
|
9
|
+
|
package/src/articles/quote.mdx
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 可以攻玉
|
|
3
|
-
tags:
|
|
4
|
-
- quote
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
“生活曾经如此像游戏,在安谧甜美的气氛中,那些器具,都是玩具”
|
|
8
|
-
|
|
9
|
-
“(眼泪)不掉下来也没有关系,她其实是一个情绪。这就是电影,看的是微妙的神态,并不是结果。”
|
|
10
|
-
|
|
11
|
-
\- “我很悲惨,要是你知道我有多悲惨就好了。” \
|
|
12
|
-
\- “我们能做什么?我们必须过好自己的生活。”
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
“河流紀事 · 鄧獻誌
|
|
16
|
-
|
|
17
|
-
河流用一生梳理 \
|
|
18
|
-
地球的表情 \
|
|
19
|
-
沿岸收集人類的喜怒哀樂 \
|
|
20
|
-
檔案堆滿了海底的家”
|
|
21
|
-
|
|
22
|
-
"No, you can’t force other people to change. You can, however, change just about everything else. And usually, that’s enough."
|
|
23
|
-
[Aaron Swartz](http://www.aaronsw.com/weblog/nummi#:~:text=No%2C%20you%20can%E2%80%99t%20force%20other%20people%20to%20change.%20You%20can%2C%20however%2C%20change%20just%20about%20everything%20else.%20And%20usually%2C%20that%E2%80%99s%20enough.)
|
|
24
|
-
|
|
25
|
-
"The [hedonic treadmill](https://en.wikipedia.org/wiki/Hedonic_treadmill), also known as hedonic adaptation, is the observed tendency of humans to quickly return to a relatively stable level of happiness despite major positive or negative events or life changes."
|
|
26
|
-
|
|
27
|
-
"When people look at my pictures I want them to feel the way they do when they want to read a line of a poem twice."
|
|
1
|
+
---
|
|
2
|
+
title: 可以攻玉
|
|
3
|
+
tags:
|
|
4
|
+
- quote
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
“生活曾经如此像游戏,在安谧甜美的气氛中,那些器具,都是玩具”
|
|
8
|
+
|
|
9
|
+
“(眼泪)不掉下来也没有关系,她其实是一个情绪。这就是电影,看的是微妙的神态,并不是结果。”
|
|
10
|
+
|
|
11
|
+
\- “我很悲惨,要是你知道我有多悲惨就好了。” \
|
|
12
|
+
\- “我们能做什么?我们必须过好自己的生活。”
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
“河流紀事 · 鄧獻誌
|
|
16
|
+
|
|
17
|
+
河流用一生梳理 \
|
|
18
|
+
地球的表情 \
|
|
19
|
+
沿岸收集人類的喜怒哀樂 \
|
|
20
|
+
檔案堆滿了海底的家”
|
|
21
|
+
|
|
22
|
+
"No, you can’t force other people to change. You can, however, change just about everything else. And usually, that’s enough."
|
|
23
|
+
[Aaron Swartz](http://www.aaronsw.com/weblog/nummi#:~:text=No%2C%20you%20can%E2%80%99t%20force%20other%20people%20to%20change.%20You%20can%2C%20however%2C%20change%20just%20about%20everything%20else.%20And%20usually%2C%20that%E2%80%99s%20enough.)
|
|
24
|
+
|
|
25
|
+
"The [hedonic treadmill](https://en.wikipedia.org/wiki/Hedonic_treadmill), also known as hedonic adaptation, is the observed tendency of humans to quickly return to a relatively stable level of happiness despite major positive or negative events or life changes."
|
|
26
|
+
|
|
27
|
+
"When people look at my pictures I want them to feel the way they do when they want to read a line of a poem twice."
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 春寒
|
|
3
|
-
tags:
|
|
4
|
-
- 随笔
|
|
5
|
-
- 天气
|
|
6
|
-
---
|
|
7
|
-
最开始只是刮风。重庆刮完台风的第二天,长沙,办公室窗外大风呼号,其声呜咽。工作群登出通告,提醒下班关窗。后边几天气温就回到冬季,并且有断断续续的小雨,不得不再次翻出羽绒服。小河涨水后,关注的钓鱼区 UP 主视频也随之陆续更新。
|
|
1
|
+
---
|
|
2
|
+
title: 春寒
|
|
3
|
+
tags:
|
|
4
|
+
- 随笔
|
|
5
|
+
- 天气
|
|
6
|
+
---
|
|
7
|
+
最开始只是刮风。重庆刮完台风的第二天,长沙,办公室窗外大风呼号,其声呜咽。工作群登出通告,提醒下班关窗。后边几天气温就回到冬季,并且有断断续续的小雨,不得不再次翻出羽绒服。小河涨水后,关注的钓鱼区 UP 主视频也随之陆续更新。
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 春雨
|
|
3
|
-
tags:
|
|
4
|
-
- 随笔
|
|
5
|
-
- 天气
|
|
6
|
-
---
|
|
7
|
-
在正式进入夏天之前,这里的气温曾突然跌到冬天的水平。然后伴随着清明时节的雨水,慢慢回升。我的作息,已经提前向去年夏末的节奏靠近。要不是疫情,早起后就能很悠闲地去那家粉店。要不是疫情,每个人都能多出很多选择。
|
|
8
|
-
|
|
9
|
-
春天的雨在窗外滴滴答答,好像永远不会停下,雨声比冬天欢快,也许是整体气温让人先放松了下来。
|
|
1
|
+
---
|
|
2
|
+
title: 春雨
|
|
3
|
+
tags:
|
|
4
|
+
- 随笔
|
|
5
|
+
- 天气
|
|
6
|
+
---
|
|
7
|
+
在正式进入夏天之前,这里的气温曾突然跌到冬天的水平。然后伴随着清明时节的雨水,慢慢回升。我的作息,已经提前向去年夏末的节奏靠近。要不是疫情,早起后就能很悠闲地去那家粉店。要不是疫情,每个人都能多出很多选择。
|
|
8
|
+
|
|
9
|
+
春天的雨在窗外滴滴答答,好像永远不会停下,雨声比冬天欢快,也许是整体气温让人先放松了下来。
|
package/src/articles/travel.mdx
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 离开
|
|
3
|
-
tags:
|
|
4
|
-
- 随笔
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
“人和事儿都在命运的秩序里展开,让我猝不及防,目瞪口呆。也就是这个时候,才发现自己已经长大成人,我觉得我必须离开。”
|
|
8
|
-
|
|
9
|
-
虽然还没过完,二零二一年已经可以总结成:重大决定最密集的一年。这些决定既不慎重也不轻率,就像迷宫中的老鼠,有个角落放着它喜欢的奶酪,循味靠近的过程中不觉就走过很多需要左右抉择的路口。
|
|
10
|
-
|
|
11
|
-
妈妈发消息说车库里的行李可能被水泡了,家里下大雨。寄回家的行李让弟弟就近堆在车库里,那天他要去考科目二。晚上,表弟特意过去把完好纸箱子都摞到凳子上。几天后,我回到家把行李都整理出来,一个路过的老婆婆问我纸箱子还要不要,我给了她。
|
|
12
|
-
|
|
13
|
-
回家第一次见到侄子,他刚过两岁生日没多久。可爱是可爱,顽皮也顽皮。会口齿不清说一些很短词语,只有在举着酸奶喊干杯的时候,如银瓶乍破同时字正腔圆。她奶奶说他长大绝对是个酒鬼,你们看吧。表弟则惯着他,吃饭时把他抱在腿上,任由他用食指和拇指去酒杯里捏着酒往嘴里送。隔天把他从客厅的小天地带去水上乐园玩,一路吹着风特别乖巧,不声不响。很久之后这段经历会在他两岁的的记忆里发酵成什么样子呢?他是不是会在某天,跟朋友喊着干杯想起两岁的时候,他赖在浅水区不肯上岸回家的情景。他是否还记得飘在泳池上方的彩带,是否还记得他爸抱着他冲下水滑梯重力失常的感觉。
|
|
14
|
-
|
|
15
|
-
小电驴跟县城很配。和弟弟每天骑着它,在外婆家和自己家穿梭。鼎山脚下的路上上下下,我自己脚下的路也是。早上穿着拖鞋去马路对面吃浇头喧宾夺主的三鲜粉,中午和带娃的表弟喝酒,晚上回家和弟弟一起看电影。如果不是前途未卜,现在的生活何尝不是向往的生活。空闲时间刷着省会城市的工作机会和房源,在踏实的当下和虚无的未来不断切换。生活有时候好像一成不变,有时候如梦似幻。一成不变的时候,如陷囹圄。瞬息破灭的时候,如坠深渊。聚散之后,定睛细看,有些碎片一直没有离开过,比如大学里买的帆布包和键盘。
|
|
16
|
-
|
|
17
|
-
一些云端存储应用保留着过去的照片。一直觉得照片是回忆的快捷键,它们又像一个个虫洞通往过去的时空。这些虫洞中,有几个反复在脑海涌现。湘江护栏边坐着靠椅钓鱼喝茶的大叔,我记得那天傍晚有风,江面粼粼。小洲前的红色帆船,水天被一线小洲和绿树隔断。那是一个秋天,烟霏云敛。凭着这些清晰又模糊的印象,我在找房应用上不断重组筛选条件。动身前一晚,终于确定下来收藏房源和看房次序。
|
|
18
|
-
|
|
19
|
-
动身回老家前,还有过一段过渡时间。房子到期感情也到期,工作即使辞职也需要临时的落脚地。终于明白为什么即使身处战争,士兵也需要营地。我也需要一个休息和思考的营地,同时因为仓促搬家,无比厌恶对一个地方产生依赖。室友听说我的处境后,在生日那天打车赶过来,在他之前住过的地方为我找到住处。行李被货车拉到楼下,很难不想起三年前只背着一个包就来到这座城市的场景。在营地休整了好一阵,最终还是决定离开这座城市离开这里,这座迷宫没有老鼠喜欢的奶酪。营地附近,有个正在备孕的同学,约好隔天慢跑。百忧撼心的营地生活,养成慢跑习惯成了为数不多的意外收获。
|
|
20
|
-
|
|
21
|
-
找房的过程比想象顺利,事实上只看完第一家就已经决定签订合同。在小区穿行的感觉很对,我需要这种老旧的氛围平复内心的戾气。后来朋友告诉我说,这是河西最老的小区。等房东和中介离开,我开始对附近进行简单的探索,走出小区门口竟然就到了江边。往东偏北望去,我看到了回忆快捷键中的小洲!住进了自己的回忆里。蓦然回首的感觉大抵如此了。在地图应用中得知小洲叫傅家洲。
|
|
1
|
+
---
|
|
2
|
+
title: 离开
|
|
3
|
+
tags:
|
|
4
|
+
- 随笔
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
“人和事儿都在命运的秩序里展开,让我猝不及防,目瞪口呆。也就是这个时候,才发现自己已经长大成人,我觉得我必须离开。”
|
|
8
|
+
|
|
9
|
+
虽然还没过完,二零二一年已经可以总结成:重大决定最密集的一年。这些决定既不慎重也不轻率,就像迷宫中的老鼠,有个角落放着它喜欢的奶酪,循味靠近的过程中不觉就走过很多需要左右抉择的路口。
|
|
10
|
+
|
|
11
|
+
妈妈发消息说车库里的行李可能被水泡了,家里下大雨。寄回家的行李让弟弟就近堆在车库里,那天他要去考科目二。晚上,表弟特意过去把完好纸箱子都摞到凳子上。几天后,我回到家把行李都整理出来,一个路过的老婆婆问我纸箱子还要不要,我给了她。
|
|
12
|
+
|
|
13
|
+
回家第一次见到侄子,他刚过两岁生日没多久。可爱是可爱,顽皮也顽皮。会口齿不清说一些很短词语,只有在举着酸奶喊干杯的时候,如银瓶乍破同时字正腔圆。她奶奶说他长大绝对是个酒鬼,你们看吧。表弟则惯着他,吃饭时把他抱在腿上,任由他用食指和拇指去酒杯里捏着酒往嘴里送。隔天把他从客厅的小天地带去水上乐园玩,一路吹着风特别乖巧,不声不响。很久之后这段经历会在他两岁的的记忆里发酵成什么样子呢?他是不是会在某天,跟朋友喊着干杯想起两岁的时候,他赖在浅水区不肯上岸回家的情景。他是否还记得飘在泳池上方的彩带,是否还记得他爸抱着他冲下水滑梯重力失常的感觉。
|
|
14
|
+
|
|
15
|
+
小电驴跟县城很配。和弟弟每天骑着它,在外婆家和自己家穿梭。鼎山脚下的路上上下下,我自己脚下的路也是。早上穿着拖鞋去马路对面吃浇头喧宾夺主的三鲜粉,中午和带娃的表弟喝酒,晚上回家和弟弟一起看电影。如果不是前途未卜,现在的生活何尝不是向往的生活。空闲时间刷着省会城市的工作机会和房源,在踏实的当下和虚无的未来不断切换。生活有时候好像一成不变,有时候如梦似幻。一成不变的时候,如陷囹圄。瞬息破灭的时候,如坠深渊。聚散之后,定睛细看,有些碎片一直没有离开过,比如大学里买的帆布包和键盘。
|
|
16
|
+
|
|
17
|
+
一些云端存储应用保留着过去的照片。一直觉得照片是回忆的快捷键,它们又像一个个虫洞通往过去的时空。这些虫洞中,有几个反复在脑海涌现。湘江护栏边坐着靠椅钓鱼喝茶的大叔,我记得那天傍晚有风,江面粼粼。小洲前的红色帆船,水天被一线小洲和绿树隔断。那是一个秋天,烟霏云敛。凭着这些清晰又模糊的印象,我在找房应用上不断重组筛选条件。动身前一晚,终于确定下来收藏房源和看房次序。
|
|
18
|
+
|
|
19
|
+
动身回老家前,还有过一段过渡时间。房子到期感情也到期,工作即使辞职也需要临时的落脚地。终于明白为什么即使身处战争,士兵也需要营地。我也需要一个休息和思考的营地,同时因为仓促搬家,无比厌恶对一个地方产生依赖。室友听说我的处境后,在生日那天打车赶过来,在他之前住过的地方为我找到住处。行李被货车拉到楼下,很难不想起三年前只背着一个包就来到这座城市的场景。在营地休整了好一阵,最终还是决定离开这座城市离开这里,这座迷宫没有老鼠喜欢的奶酪。营地附近,有个正在备孕的同学,约好隔天慢跑。百忧撼心的营地生活,养成慢跑习惯成了为数不多的意外收获。
|
|
20
|
+
|
|
21
|
+
找房的过程比想象顺利,事实上只看完第一家就已经决定签订合同。在小区穿行的感觉很对,我需要这种老旧的氛围平复内心的戾气。后来朋友告诉我说,这是河西最老的小区。等房东和中介离开,我开始对附近进行简单的探索,走出小区门口竟然就到了江边。往东偏北望去,我看到了回忆快捷键中的小洲!住进了自己的回忆里。蓦然回首的感觉大抵如此了。在地图应用中得知小洲叫傅家洲。
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 回暖
|
|
3
|
-
tags:
|
|
4
|
-
- 随笔
|
|
5
|
-
- 天气
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
最高温度已经到二十七度。阴冷的冬天刚过去没多久,如果不是柳枝才冒出新芽,春天就好像没有存在过一样。
|
|
9
|
-
|
|
10
|
-
《爱乐之城》上映的那一年,开始喜欢春天。一个人看完电影,吹着晚风往回走的时候突然意识到,只有春天才有这样的风,现在是春天。城市四季有长青的绿植,视觉上的花红柳绿,并不能明显地标示春天。相比之下,温度刚好的微风,在这里,是很稀有的存在。风,更能在一瞬间,全面唤醒身体关于春天的记忆。
|
|
1
|
+
---
|
|
2
|
+
title: 回暖
|
|
3
|
+
tags:
|
|
4
|
+
- 随笔
|
|
5
|
+
- 天气
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
最高温度已经到二十七度。阴冷的冬天刚过去没多久,如果不是柳枝才冒出新芽,春天就好像没有存在过一样。
|
|
9
|
+
|
|
10
|
+
《爱乐之城》上映的那一年,开始喜欢春天。一个人看完电影,吹着晚风往回走的时候突然意识到,只有春天才有这样的风,现在是春天。城市四季有长青的绿植,视觉上的花红柳绿,并不能明显地标示春天。相比之下,温度刚好的微风,在这里,是很稀有的存在。风,更能在一瞬间,全面唤醒身体关于春天的记忆。
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 入夏
|
|
3
|
-
tags:
|
|
4
|
-
- 随笔
|
|
5
|
-
- 天气
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
很长一段时间,断断续续都有雨。最近出现一个明显的转折点,之前的凉爽舒适,被闷热潮湿代替。电梯里湿度计读数百分之一百,房间的墙壁、天花板、地面,布满细密的水珠。人像住进深水里。霉菌在不起眼的角落和物件上疯长。
|
|
9
|
-
|
|
10
|
-
第一次使用空调除湿模式,并感谢科技的力量。
|
|
1
|
+
---
|
|
2
|
+
title: 入夏
|
|
3
|
+
tags:
|
|
4
|
+
- 随笔
|
|
5
|
+
- 天气
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
很长一段时间,断断续续都有雨。最近出现一个明显的转折点,之前的凉爽舒适,被闷热潮湿代替。电梯里湿度计读数百分之一百,房间的墙壁、天花板、地面,布满细密的水珠。人像住进深水里。霉菌在不起眼的角落和物件上疯长。
|
|
9
|
+
|
|
10
|
+
第一次使用空调除湿模式,并感谢科技的力量。
|
package/src/auth_required.tsx
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { Navigate } from "react-router-dom";
|
|
3
|
-
import { useSupabaseSession } from "@/hooks/use_supa_session";
|
|
4
|
-
|
|
5
|
-
export const AuthRequired = (props: {
|
|
6
|
-
children: any;
|
|
7
|
-
shouldRedirect?: boolean;
|
|
8
|
-
shouldBeKing?: boolean;
|
|
9
|
-
}) => {
|
|
10
|
-
const { access_token: token, isKing } = useSupabaseSession() || {};
|
|
11
|
-
|
|
12
|
-
if (!token || (props.shouldBeKing && !isKing)) {
|
|
13
|
-
return props.shouldRedirect ? <Navigate to={"/login"} /> : null;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
return props.children;
|
|
17
|
-
};
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Navigate } from "react-router-dom";
|
|
3
|
+
import { useSupabaseSession } from "@/hooks/use_supa_session";
|
|
4
|
+
|
|
5
|
+
export const AuthRequired = (props: {
|
|
6
|
+
children: any;
|
|
7
|
+
shouldRedirect?: boolean;
|
|
8
|
+
shouldBeKing?: boolean;
|
|
9
|
+
}) => {
|
|
10
|
+
const { access_token: token, isKing } = useSupabaseSession() || {};
|
|
11
|
+
|
|
12
|
+
if (!token || (props.shouldBeKing && !isKing)) {
|
|
13
|
+
return props.shouldRedirect ? <Navigate to={"/login"} /> : null;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return props.children;
|
|
17
|
+
};
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
import React, { useContext, useEffect } from "react";
|
|
2
|
-
import { GlobalLoadingContext } from "@/global_loading_state_provider";
|
|
3
|
-
import { LoadingSpiral } from "@bbki.ng/components";
|
|
4
|
-
|
|
5
|
-
export const Spinner = (props: any) => {
|
|
6
|
-
const {
|
|
7
|
-
disableDotIndicator,
|
|
8
|
-
multiplier = 10000,
|
|
9
|
-
color = [209, 213, 219, 1],
|
|
10
|
-
offset = -0.3,
|
|
11
|
-
length = 0.3,
|
|
12
|
-
} = props;
|
|
13
|
-
const { setIsLoading } = useContext(GlobalLoadingContext);
|
|
14
|
-
|
|
15
|
-
useEffect(() => {
|
|
16
|
-
if (disableDotIndicator) {
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
setIsLoading(true);
|
|
20
|
-
return () => {
|
|
21
|
-
setIsLoading(false);
|
|
22
|
-
};
|
|
23
|
-
}, []);
|
|
24
|
-
|
|
25
|
-
return (
|
|
26
|
-
<LoadingSpiral
|
|
27
|
-
multiplier={multiplier}
|
|
28
|
-
color={color}
|
|
29
|
-
offset={offset}
|
|
30
|
-
length={length}
|
|
31
|
-
/>
|
|
32
|
-
);
|
|
33
|
-
};
|
|
1
|
+
import React, { useContext, useEffect } from "react";
|
|
2
|
+
import { GlobalLoadingContext } from "@/global_loading_state_provider";
|
|
3
|
+
import { LoadingSpiral } from "@bbki.ng/components";
|
|
4
|
+
|
|
5
|
+
export const Spinner = (props: any) => {
|
|
6
|
+
const {
|
|
7
|
+
disableDotIndicator,
|
|
8
|
+
multiplier = 10000,
|
|
9
|
+
color = [209, 213, 219, 1],
|
|
10
|
+
offset = -0.3,
|
|
11
|
+
length = 0.3,
|
|
12
|
+
} = props;
|
|
13
|
+
const { setIsLoading } = useContext(GlobalLoadingContext);
|
|
14
|
+
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
if (disableDotIndicator) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
setIsLoading(true);
|
|
20
|
+
return () => {
|
|
21
|
+
setIsLoading(false);
|
|
22
|
+
};
|
|
23
|
+
}, []);
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<LoadingSpiral
|
|
27
|
+
multiplier={multiplier}
|
|
28
|
+
color={color}
|
|
29
|
+
offset={offset}
|
|
30
|
+
length={length}
|
|
31
|
+
/>
|
|
32
|
+
);
|
|
33
|
+
};
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import React, { ReactElement } from "react";
|
|
2
|
-
import { Tags, Article } from "@bbki.ng/components";
|
|
3
|
-
import { ROUTES } from "@/constants";
|
|
4
|
-
|
|
5
|
-
type ArticlePageProps = {
|
|
6
|
-
tags?: string[];
|
|
7
|
-
title: string;
|
|
8
|
-
description?: any;
|
|
9
|
-
headless?: boolean;
|
|
10
|
-
children: ReactElement;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export const ArticlePage = (props: ArticlePageProps) => {
|
|
14
|
-
const { tags: tagNames, title, description, headless } = props;
|
|
15
|
-
const tags = tagNames
|
|
16
|
-
? tagNames.map((t) => ({ children: t, to: `${ROUTES.TAGS}/${t}` }))
|
|
17
|
-
: [];
|
|
18
|
-
|
|
19
|
-
if (headless) {
|
|
20
|
-
return props.children;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return (
|
|
24
|
-
<>
|
|
25
|
-
<Article title={title} description={description}>
|
|
26
|
-
<article className="prose mb-20">{props.children}</article>
|
|
27
|
-
</Article>
|
|
28
|
-
{tagNames && <Tags tags={tags} />}
|
|
29
|
-
</>
|
|
30
|
-
);
|
|
31
|
-
};
|
|
1
|
+
import React, { ReactElement } from "react";
|
|
2
|
+
import { Tags, Article } from "@bbki.ng/components";
|
|
3
|
+
import { ROUTES } from "@/constants";
|
|
4
|
+
|
|
5
|
+
type ArticlePageProps = {
|
|
6
|
+
tags?: string[];
|
|
7
|
+
title: string;
|
|
8
|
+
description?: any;
|
|
9
|
+
headless?: boolean;
|
|
10
|
+
children: ReactElement;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const ArticlePage = (props: ArticlePageProps) => {
|
|
14
|
+
const { tags: tagNames, title, description, headless } = props;
|
|
15
|
+
const tags = tagNames
|
|
16
|
+
? tagNames.map((t) => ({ children: t, to: `${ROUTES.TAGS}/${t}` }))
|
|
17
|
+
: [];
|
|
18
|
+
|
|
19
|
+
if (headless) {
|
|
20
|
+
return props.children;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<>
|
|
25
|
+
<Article title={title} description={description}>
|
|
26
|
+
<article className="prose mb-20">{props.children}</article>
|
|
27
|
+
</Article>
|
|
28
|
+
{tagNames && <Tags tags={tags} />}
|
|
29
|
+
</>
|
|
30
|
+
);
|
|
31
|
+
};
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import classnames from "classnames";
|
|
2
|
-
import React from "react";
|
|
3
|
-
|
|
4
|
-
type aspectRatioBoxProps = {
|
|
5
|
-
width: number | string;
|
|
6
|
-
hwRatio: number;
|
|
7
|
-
className?: string;
|
|
8
|
-
children?: any;
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export const AspectRatioBox = (props: aspectRatioBoxProps) => {
|
|
12
|
-
const { className, width, hwRatio, children } = props;
|
|
13
|
-
const innerStyle = {
|
|
14
|
-
width: "100%",
|
|
15
|
-
paddingTop: `${hwRatio * 100}%`,
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
return (
|
|
19
|
-
<div
|
|
20
|
-
style={{ width, maxWidth: "100%" }}
|
|
21
|
-
className={classnames(className, "relative")}
|
|
22
|
-
>
|
|
23
|
-
<div style={innerStyle} />
|
|
24
|
-
{children && (
|
|
25
|
-
<div className="absolute top-0 bottom-0 left-0 right-0">{children}</div>
|
|
26
|
-
)}
|
|
27
|
-
</div>
|
|
28
|
-
);
|
|
29
|
-
};
|
|
1
|
+
import classnames from "classnames";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
type aspectRatioBoxProps = {
|
|
5
|
+
width: number | string;
|
|
6
|
+
hwRatio: number;
|
|
7
|
+
className?: string;
|
|
8
|
+
children?: any;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export const AspectRatioBox = (props: aspectRatioBoxProps) => {
|
|
12
|
+
const { className, width, hwRatio, children } = props;
|
|
13
|
+
const innerStyle = {
|
|
14
|
+
width: "100%",
|
|
15
|
+
paddingTop: `${hwRatio * 100}%`,
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<div
|
|
20
|
+
style={{ width, maxWidth: "100%" }}
|
|
21
|
+
className={classnames(className, "relative")}
|
|
22
|
+
>
|
|
23
|
+
<div style={innerStyle} />
|
|
24
|
+
{children && (
|
|
25
|
+
<div className="absolute top-0 bottom-0 left-0 right-0">{children}</div>
|
|
26
|
+
)}
|
|
27
|
+
</div>
|
|
28
|
+
);
|
|
29
|
+
};
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import classnames from "classnames";
|
|
3
|
-
import { TextColors } from "@/types/color";
|
|
4
|
-
|
|
5
|
-
type blurCoverProps = {
|
|
6
|
-
textColor?: TextColors;
|
|
7
|
-
className?: string;
|
|
8
|
-
children: any;
|
|
9
|
-
height?: number;
|
|
10
|
-
visibleOnHover?: boolean;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export const BlurCover = (props: blurCoverProps) => {
|
|
14
|
-
const { textColor, children, className, height = 50, visibleOnHover } = props;
|
|
15
|
-
const cls = classnames(
|
|
16
|
-
className,
|
|
17
|
-
textColor,
|
|
18
|
-
"blur-cover",
|
|
19
|
-
"absolute",
|
|
20
|
-
"w-full",
|
|
21
|
-
"flex items-center justify-center"
|
|
22
|
-
);
|
|
23
|
-
return (
|
|
24
|
-
<div className={cls} style={{ height }}>
|
|
25
|
-
{children}
|
|
26
|
-
</div>
|
|
27
|
-
);
|
|
28
|
-
};
|
|
1
|
+
import React from "react";
|
|
2
|
+
import classnames from "classnames";
|
|
3
|
+
import { TextColors } from "@/types/color";
|
|
4
|
+
|
|
5
|
+
type blurCoverProps = {
|
|
6
|
+
textColor?: TextColors;
|
|
7
|
+
className?: string;
|
|
8
|
+
children: any;
|
|
9
|
+
height?: number;
|
|
10
|
+
visibleOnHover?: boolean;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const BlurCover = (props: blurCoverProps) => {
|
|
14
|
+
const { textColor, children, className, height = 50, visibleOnHover } = props;
|
|
15
|
+
const cls = classnames(
|
|
16
|
+
className,
|
|
17
|
+
textColor,
|
|
18
|
+
"blur-cover",
|
|
19
|
+
"absolute",
|
|
20
|
+
"w-full",
|
|
21
|
+
"flex items-center justify-center"
|
|
22
|
+
);
|
|
23
|
+
return (
|
|
24
|
+
<div className={cls} style={{ height }}>
|
|
25
|
+
{children}
|
|
26
|
+
</div>
|
|
27
|
+
);
|
|
28
|
+
};
|