@bbki.ng/site 5.4.21 → 5.4.24

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.
Files changed (103) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/index.html +12 -19
  3. package/package.json +5 -8
  4. package/src/blog/app.tsx +32 -44
  5. package/src/blog/components/article/index.tsx +8 -17
  6. package/src/blog/components/index.tsx +0 -12
  7. package/src/blog/components/share/share-btn.tsx +5 -8
  8. package/src/blog/constants/index.ts +1 -16
  9. package/src/blog/constants/routes.ts +12 -22
  10. package/src/blog/context/bbcontext.tsx +7 -7
  11. package/src/blog/hooks/index.ts +3 -18
  12. package/src/blog/hooks/use_dynamic_logo.tsx +6 -11
  13. package/src/blog/hooks/use_posts.ts +19 -10
  14. package/src/blog/hooks/use_role.ts +9 -14
  15. package/src/blog/hooks/use_streaming.ts +16 -16
  16. package/src/blog/index.tsx +5 -11
  17. package/src/blog/pages/cover/index.tsx +0 -1
  18. package/src/blog/pages/extensions/txt/article.tsx +7 -21
  19. package/src/blog/pages/extensions/txt/index.tsx +3 -20
  20. package/src/blog/pages/login/index.tsx +18 -42
  21. package/src/blog/swr.tsx +4 -7
  22. package/src/blog/utils/index.ts +9 -172
  23. package/vite.config.js +2 -1
  24. package/src/blog/articles/anti-logic.mdx +0 -61
  25. package/src/blog/articles/bbking-manual.mdx +0 -7
  26. package/src/blog/articles/black-river.mdx +0 -8
  27. package/src/blog/articles/celebration.mdx +0 -21
  28. package/src/blog/articles/cloth.mdx +0 -11
  29. package/src/blog/articles/cooking.mdx +0 -7
  30. package/src/blog/articles/cooldown.mdx +0 -12
  31. package/src/blog/articles/cousin.mdx +0 -15
  32. package/src/blog/articles/fall.mdx +0 -8
  33. package/src/blog/articles/img.mdx +0 -104
  34. package/src/blog/articles/leaves.mdx +0 -7
  35. package/src/blog/articles/liqiu.mdx +0 -7
  36. package/src/blog/articles/loading.mdx +0 -144
  37. package/src/blog/articles/love.mdx +0 -19
  38. package/src/blog/articles/major-cold.mdx +0 -14
  39. package/src/blog/articles/marshroom.mdx +0 -17
  40. package/src/blog/articles/men-without-women.mdx +0 -19
  41. package/src/blog/articles/moment.mdx +0 -9
  42. package/src/blog/articles/movie-day.mdx +0 -15
  43. package/src/blog/articles/photos.mdx +0 -13
  44. package/src/blog/articles/projects.mdx +0 -8
  45. package/src/blog/articles/pseudo-spring.mdx +0 -7
  46. package/src/blog/articles/quote.mdx +0 -26
  47. package/src/blog/articles/red-gun.mdx +0 -19
  48. package/src/blog/articles/rice-noodle.mdx +0 -21
  49. package/src/blog/articles/spring-cooldown.mdx +0 -8
  50. package/src/blog/articles/spring-rain.mdx +0 -10
  51. package/src/blog/articles/travel.mdx +0 -22
  52. package/src/blog/articles/warming-up.mdx +0 -10
  53. package/src/blog/articles/web-burnning.mdx +0 -10
  54. package/src/blog/articles/woke-up.mdx +0 -7
  55. package/src/blog/articles/xwy-and-snowing.mdx +0 -13
  56. package/src/blog/articles/xwy.mdx +0 -9
  57. package/src/blog/components/ImageUploader.tsx +0 -55
  58. package/src/blog/components/Img_ctx_menu/index.tsx +0 -67
  59. package/src/blog/components/Logger.tsx +0 -9
  60. package/src/blog/components/Pochacco/Pochacco.tsx +0 -29
  61. package/src/blog/components/Pochacco/idle.tsx +0 -31
  62. package/src/blog/components/Pochacco/watch.tsx +0 -28
  63. package/src/blog/components/Version.tsx +0 -14
  64. package/src/blog/components/app_ctx_menu/LoginMenuItem.tsx +0 -72
  65. package/src/blog/components/app_ctx_menu/PostMenuItem.tsx +0 -22
  66. package/src/blog/components/app_ctx_menu/VersionMenuItem.tsx +0 -13
  67. package/src/blog/components/app_ctx_menu/ViewSourceMenuItem.tsx +0 -34
  68. package/src/blog/components/app_ctx_menu/index.tsx +0 -35
  69. package/src/blog/components/article_ctx_menu/index.tsx +0 -58
  70. package/src/blog/components/aspect_ratio_box/index.tsx +0 -29
  71. package/src/blog/components/blur_cover/index.tsx +0 -28
  72. package/src/blog/components/hotkey_nav/index.tsx +0 -51
  73. package/src/blog/components/progress_bar/index.tsx +0 -31
  74. package/src/blog/components/reaction/emojis.tsx +0 -143
  75. package/src/blog/components/reaction/oh_reaction.tsx +0 -105
  76. package/src/blog/components/reload_prompt/index.tsx +0 -51
  77. package/src/blog/components/tags/index.tsx +0 -52
  78. package/src/blog/components/video_player/index.tsx +0 -82
  79. package/src/blog/global/mdx.d.ts +0 -9
  80. package/src/blog/hooks/useLoadingIndicator.ts +0 -12
  81. package/src/blog/hooks/useScrollToTop.ts +0 -24
  82. package/src/blog/hooks/useTransitionCls.ts +0 -36
  83. package/src/blog/hooks/use_authed.ts +0 -7
  84. package/src/blog/hooks/use_authed_fetcher.ts +0 -8
  85. package/src/blog/hooks/use_authed_string_post.ts +0 -42
  86. package/src/blog/hooks/use_clipboard_content.ts +0 -21
  87. package/src/blog/hooks/use_clipboard_to_post.ts +0 -48
  88. package/src/blog/hooks/use_del_img.ts +0 -22
  89. package/src/blog/hooks/use_delete_post.ts +0 -22
  90. package/src/blog/hooks/use_file_to_post.ts +0 -38
  91. package/src/blog/hooks/use_img_loading.ts +0 -16
  92. package/src/blog/hooks/use_post.ts +0 -26
  93. package/src/blog/hooks/use_projects.ts +0 -67
  94. package/src/blog/hooks/use_route_name.ts +0 -7
  95. package/src/blog/hooks/use_shared_string_to_post.ts +0 -23
  96. package/src/blog/hooks/use_supa_session.ts +0 -31
  97. package/src/blog/hooks/use_text_plain_file.ts +0 -36
  98. package/src/blog/hooks/use_uploader.ts +0 -34
  99. package/src/blog/hooks/use_video_controls.ts +0 -71
  100. package/src/blog/pages/upload/index.tsx +0 -39
  101. package/src/blog/types/supabase.ts +0 -12
  102. package/src/blog/types/upload.ts +0 -16
  103. package/src/blog/utils/tags.ts +0 -21
@@ -1,7 +0,0 @@
1
- ---
2
- title: 树叶
3
- tags:
4
- - 随笔
5
- ---
6
-
7
- 下班发现洗衣机盖子上有片树叶,应该是窗外飘进来的。
@@ -1,7 +0,0 @@
1
- ---
2
- title: 立秋
3
- tags:
4
- - 随笔
5
- ---
6
-
7
- 这个没有参与感的夏天,就像六月的梦,是黑色的。对了,吃过一次西瓜,大面积黑色里,至少还有一小片红。
@@ -1,144 +0,0 @@
1
- ---
2
- title: 加载动画
3
- tags:
4
- - bbki.ng
5
- - loading
6
- - WebGL
7
- ---
8
-
9
- import { SpinnerDemo } from "@/demo/SpinnerDemo";
10
- import { DemoBox } from "@/demo/DemoBox";
11
-
12
- <SpinnerDemo />
13
- ## 前言 >《她》是讲述在不远的未来人与人工智能相爱的科幻爱情电影。主人公西奥多(杰昆·菲尼克斯
14
- Joaquin Phoenix 饰)是一位信件撰写人,心思细腻而深邃,能写出最感人肺腑的信件。他刚结束与妻子凯瑟琳(鲁妮·玛拉
15
- Rooney Mara 饰)的婚姻,还没走出心碎的阴影。一次偶然机会让他接触到最新的人工智能系统
16
- OS1 ……
17
-
18
- 相信大多数人,在看这部电影的时候,不仅仅会被剧情打动,也会被电影的镜头美学吸引。《她》呈现出一个没有被冷酷金属主导的科幻世界,那里光线柔和,色调温暖。人们的着装跟我们并没有太大区别,但是人工智能操作系统能完成的事情以及普及程度,现在看来很难想象。有意思的是,技术的发展并没有消灭「加载时间」,OS1 在安装的时候,西奥多依然需要等待。屏幕上精美的加载动画给我留下深刻的印象,从那时候起,就希望动画能出现在我的网站上。
19
-
20
- ## 灵感
21
-
22
- 根据 Atwood's Law
23
-
24
- > Any application that *can* be written in JavaScript, *will* eventually be written in JavaScript.
25
-
26
- 肯定有人已经用 JS 实现 OS1 系统的加载动画。没错,这个人是 [@psyonline](https://codepen.io/psyonline),他的[在线示例](https://codepen.io/psyonline/pen/yayYWg)也非常惊艳。
27
- 那么,直接复制粘贴过来可以吗?该示例使用 Three.js 实现,写这篇文章的时候,根据 [bundlephobia](https://bundlephobia.com/package/three@0.142.0) 显示,`three@142.0` 压缩后仍然有 `596.9kB`。对于个人网站,仅仅用来实现一个加载动画,无疑很不划算。
28
-
29
- [@shuding](https://twitter.com/shuding_)发布过一[系列推文](https://twitter.com/shuding_/status/1475916082875666441)介绍他如何制作一个轻量级的 [WebGL 地球库](https://github.com/shuding/cobe),十分精彩。开篇提及两个轻量级 WebGL 库:
30
-
31
- - [phenomenon](https://github.com/vaneenige/phenomenon)
32
- - [W](https://xem.github.io/W/)
33
-
34
- 前者压缩后,只有 `5.4KB`。正是我想找的工具。接下来,只需要 3 步就能实现文首的动画:
35
-
36
- 1. 熟悉 phenomenon 的 API
37
- 2. 用 phenomenon 绘制曲线
38
- 3. 让曲线动起来
39
-
40
- ## 行动
41
-
42
- ### WebGL
43
-
44
- 进行第一步时,发现自己还完全不了解 WebGL。看完 [The Book of Shaders](https://thebookofshaders.com/) 后,能基本理解 phenomenon 的[示例](https://codepen.io/collection/AOpMrm/)。至此,已经可以复制粘贴示例并修修改改,验证书中的概念和自己的理解。直到手痒痒想绘制自己想要的曲线,就进行到下一步。
45
-
46
- ### Curve
47
-
48
- @psyonline [示例](https://codepen.io/psyonline/pen/yayYWg)中不难找到绘制曲线的代码:
49
-
50
- ```
51
- function(percent) {
52
- var x = length*Math.sin(pi2*percent)
53
- , y = radius*Math.cos(pi2*3*percent)
54
- , z
55
- , t;
56
-
57
- t = percent%0.25/0.25;
58
- t = percent%0.25-(2*(1-t)*t* -0.0185 +t*t*0.25);
59
-
60
- if (Math.floor(percent/0.25) == 0
61
- || Math.floor(percent/0.25) == 2) {
62
- t *= -1;
63
- }
64
-
65
- z = radius*Math.sin(pi2*2* (percent-t));
66
-
67
- return new THREE.Vector3(x, y, z);
68
- }
69
- ```
70
-
71
- 我的主要目标变成移植这段代码,其中 `pi2`, `length` 和 `radius` 均为常量,原文取值:
72
-
73
- ```
74
- const length = 30;
75
- const radius = 5.6;
76
- const pi2 = Math.PI * 2;
77
- ```
78
-
79
- 还有一个比较重要的参数 `percent`,打印发现取值范围为 0 到 1。有了这些,我愉快的写好 phenomenon 的 attributes:
80
-
81
- ```
82
- const attributes = [
83
- {
84
- title: 'pos',
85
- data: (index: number, total: number) => {
86
- const percent = index / total;
87
- // ...
88
- // 复制粘贴 :)
89
- // 此处省略
90
-
91
- return [x, y, z];
92
- },
93
- size: 3,
94
- },
95
- ]
96
- ```
97
-
98
- 然后得到一个空白的画布
99
-
100
- <DemoBox />
101
-
102
- 因为对 WebGL 的了解依然接近于 0 在胡乱猜测并修改一通后,画布依然一片空白,于是沮丧放弃。直到晚上,突然想着将半径和长度都降低两个数量级,画布中终于出现一个扭曲的麻花。上次这么开心还是上一次。
103
-
104
- ### Matrix
105
-
106
- 现在可以回想一下大学课堂线性代数中矩阵运算的知识。回想不起来也没关系,如果有一个正在念大学的弟弟的话,他会帮助写出 `rotate` 方法。
107
-
108
- ```
109
- export const VERTEX_SHADER = `
110
- attribute vec3 pos;
111
- uniform mat4 uProjectionMatrix;
112
- uniform mat4 uModelMatrix;
113
- uniform mat4 uViewMatrix;
114
- uniform float uProgress;
115
- mat4 rotate(float _angle){
116
- return mat4(
117
- 1.0, 0.0, 0.0, 0.0,
118
- 0.0, cos(_angle), -sin(_angle), 0.0,
119
- 0.0, sin(_angle), cos(_angle), 0.0,
120
- 0.0, 0.0, 0.0, 1.0
121
- );
122
- }
123
- void main(){
124
- gl_Position = uProjectionMatrix
125
- * uModelMatrix
126
- * uViewMatrix
127
- * rotate(uProgress)
128
- * vec4(pos, 1.0);
129
- gl_PointSize = 1.0;
130
- }
131
- `;
132
-
133
- ```
134
-
135
- 这些碎片代码,和碎片想法,最终组装出心心念念的动画。
136
-
137
- ## 参考链接
138
-
139
- 1. https://codepen.io/psyonline/pen/yayYWg
140
- 2. https://twitter.com/shuding_/status/1475916082875666441
141
- 3. https://thebookofshaders.com/
142
- 4. https://shud.in/posts/metaballs-1
143
- 5. https://codepen.io/cvaneenige/pen/MGBZpB
144
- 6. https://movie.douban.com/subject/6722879/
@@ -1,19 +0,0 @@
1
- ---
2
- title: 爱情
3
- tags:
4
- - 摘抄
5
- - 诗歌
6
- ---
7
-
8
- ```
9
- I knew
10
- I would love you
11
- But I would never
12
- Have guessed that
13
- You would love me too
14
-
15
- What’s even more
16
- Unbelievable was that
17
- You too
18
- Thought the same way.
19
- ```
@@ -1,14 +0,0 @@
1
- ---
2
- title: 大寒
3
- tags:
4
- - 随笔
5
- - 天气
6
- ---
7
-
8
- 冬天下半场,更冷了,而且多雨。新闻开始有暴雪预警,更南边的同学,春节返乡将经受疫和天气双重影响。
9
-
10
- 小区的地面,被雨水浇成黑色,香樟的树干也是。傍晚的时候,这种黑色像是从地面沿着树干伸向天空。黑色路面上的车辆,总是会压出一片黏腻的声音,比以往更吵。
11
-
12
- 上次雪停后,没再穿过厚羽绒服。身体在一点点适应湿寒。某天中午大雾,绕湖散步途中,被过于湿润的空气包裹着,有种安心的感觉。换城市工作后,一直在经历的不仅仅是环境温度持续下降,内心的一部分也在慢慢冷却。
13
-
14
- 和四季一同起伏,不当暴躁的怪物。
@@ -1,17 +0,0 @@
1
- ---
2
- title: 口蘑
3
- tags:
4
- - 随笔
5
- ---
6
-
7
- “老板,这是什么?”
8
-
9
- “口蘑。”
10
-
11
- “怎么吃?”
12
-
13
- “切片,两面煎黄,煮汤吃。”
14
-
15
- “这些够了吗?”
16
-
17
- “再加点,这个又不贵,你们也难得做次饭。”
@@ -1,19 +0,0 @@
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,9 +0,0 @@
1
- ---
2
- title: 站一下
3
- tags:
4
- - 随笔
5
- ---
6
-
7
- “老板,取快递。”
8
-
9
- “好的,站一下啊。”
@@ -1,15 +0,0 @@
1
- ---
2
- title: 个人电影节
3
- tags:
4
- - 随笔
5
- - 电影
6
- - 一天计划
7
- ---
8
-
9
- **一天计划**,用一天时间在同一个地点做同一件事情。比如写一天代码、看一天书。个人电影节也是「一天计划」的一部分。从之前标记想看的电影清单中随机挑选出五部电影,用一天时间看完。
10
-
11
- | 上午 | 下午 | 晚上 |
12
- | :--------------------- | :--------------------------- | :------- |
13
- | 花火 <br /> 数电影的人 | 不能说的游戏 <br /> 蜂蜜之地 | 尽情游戏 |
14
-
15
- 《花火》整部电影都很沉默冷静,甚至连剧中的枪响也是。可能是浓烈的情感需要大面积的留白去稀释,主角台词不多,却好像什么都已说尽。《数电影的人》是一部记录片,介绍了一群修复电影胶片的人,为电影延续生命。他们有枯燥的工作,有来自同事间互相鼓励和安慰。有意义危机,也有使命感和成就感。我更羡慕的是他们的工作周期,能花很长很长的一段时间慢慢把事情做好,也紧迫也从容。《不能说的游戏》讲述小女孩被熟人性侵后,整个人生受到的影响。电影配乐很欢快,大部分剪辑也是,但看似轻松欢快的节奏,却能让人感受到背后的压抑与主角内心困兽般的反应。这部电影,比起犯人,我更讨厌女主的母亲。《蜂蜜之地》是一部很美的记录片,贫瘠的土地,满眼只能看到岩石灌木和沙砾。相依为命的母女,贪婪的邻居。能够看到一种截然不同的生活方式,已经很心满意足。《尽情游戏》则是一部轻松的喜剧,可能包含了对战争的反思,我更愿意就把它当成一部普通的喜剧。最后其实还有一部德国电影《奇迹》,已经无法看下去,就像很久没有运动,跑完三公里已经到了极限,无法跑完最后一圈。
@@ -1,13 +0,0 @@
1
- ---
2
- title: 照片
3
- tags:
4
- - 随笔
5
- ---
6
-
7
- 十岁的时候,外公的邻居从外地回来,背着黑色相机。现在回想,那个下午应该是他提出要给小孩拍照,我和另外几个在外边疯玩的小伙伴,才被叫回来,齐齐排在外公厨房后边的小路上,拍了合照。
8
-
9
- 后来照片寄到外公手中,我看见勾肩搭背的三个人:左边的小伙伴歪着脑袋,表情呆滞,眼神虚无。对正在发生的事情没有概念,也许在想着被中断的游戏。中间那个经常揍我的人,满脸堆着傻笑像标准的 Grinning Face Emoji 自然地看着镜头。我躲在右边赤脚低头、姿势扭捏、脚趾抠地,害羞地把塞在裤兜里的手攥成拳头,还往外顶出一个小包。邻居按快门的时候,并没有引导我们摆成特殊的姿势,整理出自然的表情,就那么弯腰咔嚓,凝固了三个小男孩十几岁的样子。仔细多看一会儿,整个童年就在脑中徐徐展开。
10
-
11
- 今天,那个位置的光线已经不适合拍照,外公栽种的枇杷树浓荫蔽空。枇杷树直直疯长时,他的背已经弓下去。大学某个假期,我回到乡下,给外公在同一个位置拍下一张照片:他弓着背双手握着几根干柴,并没有正对我。但是注意到我举着手机,就朝我笑,又或者仅仅是对着我笑。我和外公隔着一段距离,他在画面里显得更加瘦小,是的,我在偷拍外公。倔强执拗一生,外公那个笑,少有的温暖柔和。那是我拍的外公最后一张照片,分辨率并不高,但记忆里的笑容很清晰。
12
-
13
- 现在我有自己的相机,当然,也是黑色的。我乐意背着它去拍陌生人,学义粉店里出神的流浪汉,月宫街边提着蛋糕抹眼泪的小朋友,南郊公园自信的小号乐手……很长一段时间沉迷于收集这些,零碎的喜怒哀乐。
@@ -1,8 +0,0 @@
1
- ---
2
- title: 图片
3
- headless: True
4
- ---
5
-
6
- import Png from "@/pages/extensions/png";
7
-
8
- <Png />
@@ -1,7 +0,0 @@
1
- ---
2
- title: 春风模拟
3
- tags:
4
- - 随笔
5
- ---
6
-
7
- 夏天,在空调房间待到晚上某个时间点,然后出门。在适应室外的温度前,如果有风,会像是穿越到春天。
@@ -1,26 +0,0 @@
1
- ---
2
- title: 可以攻玉
3
- tags:
4
- - quote
5
- ---
6
-
7
- “生活曾经如此像游戏,在安谧甜美的气氛中,那些器具,都是玩具”
8
-
9
- “(眼泪)不掉下来也没有关系,她其实是一个情绪。这就是电影,看的是微妙的神态,并不是结果。”
10
-
11
- \- “我很悲惨,要是你知道我有多悲惨就好了。” \
12
- \- “我们能做什么?我们必须过好自己的生活。”
13
-
14
- “河流紀事 · 鄧獻誌
15
-
16
- 河流用一生梳理 \
17
- 地球的表情 \
18
- 沿岸收集人類的喜怒哀樂 \
19
- 檔案堆滿了海底的家”
20
-
21
- "No, you can’t force other people to change. You can, however, change just about everything else. And usually, that’s enough."
22
- [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.)
23
-
24
- "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."
25
-
26
- "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,19 +0,0 @@
1
- ---
2
- title: 红色的枪
3
- tags:
4
- - 随笔
5
- ---
6
-
7
- 菜鸟驿站取徐雯瑶寄来的快递,一个穿浅蓝色毛衣的小男孩,骑着单车停在门口,一只脚踮着地没下车,大声朝里问老板娘:
8
-
9
- “彭文俊在不在?”
10
-
11
- “不在”
12
-
13
- “他去哪了?”
14
-
15
- “上课,他上课去了”
16
-
17
- 小男孩掉头要走,老板娘大声问:
18
-
19
- “你昨天是不是拿了他那把红色的枪?”
@@ -1,21 +0,0 @@
1
- ---
2
- title: 圆粉
3
- tags:
4
- - 随笔
5
- ---
6
-
7
- “老板,香菜牛肉圆粉”
8
-
9
- “就是香菜牛肉粉噻?”
10
-
11
- “圆粉”
12
-
13
- “好”
14
-
15
- “有圆粉吧”
16
-
17
- “有”
18
-
19
- ……
20
-
21
- “哎!不是说了要圆粉吗?”
@@ -1,8 +0,0 @@
1
- ---
2
- title: 春寒
3
- tags:
4
- - 随笔
5
- - 天气
6
- ---
7
-
8
- 最开始只是刮风。重庆刮完台风的第二天,长沙,办公室窗外大风呼号,其声呜咽。工作群登出通告,提醒下班关窗。后边几天气温就回到冬季,并且有断断续续的小雨,不得不再次翻出羽绒服。小河涨水后,关注的钓鱼区 UP 主视频也随之陆续更新。
@@ -1,10 +0,0 @@
1
- ---
2
- title: 春雨
3
- tags:
4
- - 随笔
5
- - 天气
6
- ---
7
-
8
- 在正式进入夏天之前,这里的气温曾突然跌到冬天的水平。然后伴随着清明时节的雨水,慢慢回升。我的作息,已经提前向去年夏末的节奏靠近。要不是疫情,早起后就能很悠闲地去那家粉店。要不是疫情,每个人都能多出很多选择。
9
-
10
- 春天的雨在窗外滴滴答答,好像永远不会停下,雨声比冬天欢快,也许是整体气温让人先放松了下来。
@@ -1,22 +0,0 @@
1
- ---
2
- title: 离开
3
- created_at: 2023-05-11
4
- tags:
5
- - 随笔
6
- ---
7
-
8
- “人和事儿都在命运的秩序里展开,让我猝不及防,目瞪口呆。也就是这个时候,才发现自己已经长大成人,我觉得我必须离开。”
9
-
10
- 虽然还没过完,二零二一年已经可以总结成:重大决定最密集的一年。这些决定既不慎重也不轻率,就像迷宫中的老鼠,有个角落放着它喜欢的奶酪,循味靠近的过程中不觉就走过很多需要左右抉择的路口。
11
-
12
- 妈妈发消息说车库里的行李可能被水泡了,家里下大雨。寄回家的行李让弟弟就近堆在车库里,那天他要去考科目二。晚上,表弟特意过去把完好纸箱子都摞到凳子上。几天后,我回到家把行李都整理出来,一个路过的老婆婆问我纸箱子还要不要,我给了她。
13
-
14
- 回家第一次见到侄子,他刚过两岁生日没多久。可爱是可爱,顽皮也顽皮。会口齿不清说一些很短词语,只有在举着酸奶喊干杯的时候,如银瓶乍破同时字正腔圆。她奶奶说他长大绝对是个酒鬼,你们看吧。表弟则惯着他,吃饭时把他抱在腿上,任由他用食指和拇指去酒杯里捏着酒往嘴里送。隔天把他从客厅的小天地带去水上乐园玩,一路吹着风特别乖巧,不声不响。很久之后这段经历会在他两岁的的记忆里发酵成什么样子呢?他是不是会在某天,跟朋友喊着干杯想起两岁的时候,他赖在浅水区不肯上岸回家的情景。他是否还记得飘在泳池上方的彩带,是否还记得他爸抱着他冲下水滑梯重力失常的感觉。
15
-
16
- 小电驴跟县城很配。和弟弟每天骑着它,在外婆家和自己家穿梭。鼎山脚下的路上上下下,我自己脚下的路也是。早上穿着拖鞋去马路对面吃浇头喧宾夺主的三鲜粉,中午和带娃的表弟喝酒,晚上回家和弟弟一起看电影。如果不是前途未卜,现在的生活何尝不是向往的生活。空闲时间刷着省会城市的工作机会和房源,在踏实的当下和虚无的未来不断切换。生活有时候好像一成不变,有时候如梦似幻。一成不变的时候,如陷囹圄。瞬息破灭的时候,如坠深渊。聚散之后,定睛细看,有些碎片一直没有离开过,比如大学里买的帆布包和键盘。
17
-
18
- 一些云端存储应用保留着过去的照片。一直觉得照片是回忆的快捷键,它们又像一个个虫洞通往过去的时空。这些虫洞中,有几个反复在脑海涌现。湘江护栏边坐着靠椅钓鱼喝茶的大叔,我记得那天傍晚有风,江面粼粼。小洲前的红色帆船,水天被一线小洲和绿树隔断。那是一个秋天,烟霏云敛。凭着这些清晰又模糊的印象,我在找房应用上不断重组筛选条件。动身前一晚,终于确定下来收藏房源和看房次序。
19
-
20
- 动身回老家前,还有过一段过渡时间。房子到期感情也到期,工作即使辞职也需要临时的落脚地。终于明白为什么即使身处战争,士兵也需要营地。我也需要一个休息和思考的营地,同时因为仓促搬家,无比厌恶对一个地方产生依赖。室友听说我的处境后,在生日那天打车赶过来,在他之前住过的地方为我找到住处。行李被货车拉到楼下,很难不想起三年前只背着一个包就来到这座城市的场景。在营地休整了好一阵,最终还是决定离开这座城市离开这里,这座迷宫没有老鼠喜欢的奶酪。营地附近,有个正在备孕的同学,约好隔天慢跑。百忧撼心的营地生活,养成慢跑习惯成了为数不多的意外收获。
21
-
22
- 找房的过程比想象顺利,事实上只看完第一家就已经决定签订合同。在小区穿行的感觉很对,我需要这种老旧的氛围平复内心的戾气。后来朋友告诉我说,这是河西最老的小区。等房东和中介离开,我开始对附近进行简单的探索,走出小区门口竟然就到了江边。往东偏北望去,我看到了回忆快捷键中的小洲!住进了自己的回忆里。蓦然回首的感觉大抵如此了。在地图应用中得知小洲叫傅家洲。
@@ -1,10 +0,0 @@
1
- ---
2
- title: 回暖
3
- tags:
4
- - 随笔
5
- - 天气
6
- ---
7
-
8
- 最高温度已经到二十七度。阴冷的冬天刚过去没多久,如果不是柳枝才冒出新芽,春天就好像没有存在过一样。
9
-
10
- 《爱乐之城》上映的那一年,开始喜欢春天。一个人看完电影,吹着晚风往回走的时候突然意识到,只有春天才有这样的风,现在是春天。城市四季有长青的绿植,视觉上的花红柳绿,并不能明显地标示春天。相比之下,温度刚好的微风,在这里,是很稀有的存在。风,更能在一瞬间,全面唤醒身体关于春天的记忆。
@@ -1,10 +0,0 @@
1
- ---
2
- title: 入夏
3
- tags:
4
- - 随笔
5
- - 天气
6
- ---
7
-
8
- 很长一段时间,断断续续都有雨。最近出现一个明显的转折点,之前的凉爽舒适,被闷热潮湿代替。电梯里湿度计读数百分之一百,房间的墙壁、天花板、地面,布满细密的水珠。人像住进深水里。霉菌在不起眼的角落和物件上疯长。
9
-
10
- 第一次使用空调除湿模式,并感谢科技的力量。
@@ -1,7 +0,0 @@
1
- ---
2
- title: 惊醒
3
- tags:
4
- - 随笔
5
- ---
6
-
7
- 厨房里,小乌鸦买的火锅底料掉在纯净水瓶上,纯净水瓶掉到地上,这是清早发现的。凌晨只是被惊醒,瞬间不知道自己在哪,有点害怕。
@@ -1,13 +0,0 @@
1
- ---
2
- title: 我想看雪
3
- tags:
4
- - 随笔
5
- - 天气
6
- - 小乌鸦
7
- ---
8
-
9
- 「我要看雪」,徐雯瑶几乎每天都会随机念叨这句话。用方言说的时候,偶尔会听成「我要开学」。很久之前,她就在问:「今年长沙会下雪吗?」。
10
-
11
- 长沙有两次降雪,都跟从来没玩过雪的徐雯瑶擦肩而过。第一次下雪,长沙的朋友都在聊天群里发窗外雪景,只是望月湖没有看到一片雪花。同一时间,一公里外的岳麓山却纷纷扬扬。我们感染新型冠状病毒不久,正在恢复期间,徐雯瑶只能望雪兴叹。第二次下雪,徐雯瑶已经离开长沙。离开前,她看完一周天气预报,知道周日可能降雪后,忿忿不平。交代我如果下雪一定要和她视频通话。然后,她就在六百四十公里外,看着我在车顶滚雪球、用雪球在厨房洗碗池里堆小雪人并且,哭鼻子了。
12
-
13
- 徐雯瑶真的羡慕哭过。
@@ -1,9 +0,0 @@
1
- ---
2
- title: 小乌鸦
3
- tags:
4
- - 小乌鸦
5
- ---
6
-
7
- import { Xwy } from "../demo/Xwy";
8
-
9
- <Xwy />
@@ -1,55 +0,0 @@
1
- import React, { useContext } from "react";
2
- import { DropImage } from "@bbki.ng/components";
3
- import { useUploader } from "@/hooks/use_uploader";
4
- import { ImageUploaderProps } from "@/types/upload";
5
- import { GlobalLoadingContext } from "@/context/global_loading_state_provider";
6
- import { Auth } from "@/components/Auth";
7
- import { Role } from "@/hooks/use_role";
8
- import { useParams } from "react-router-dom";
9
-
10
- export const ImageUploader = (props: ImageUploaderProps) => {
11
- const {
12
- onUploadFinish,
13
- onUploadError = () => {},
14
- onUploadSuccess = () => {},
15
- onBeforeUpload = () => Promise.resolve(),
16
- projectId,
17
- projectName,
18
- ...rest
19
- } = props;
20
-
21
- const { setIsLoading } = useContext(GlobalLoadingContext);
22
- const uploader = useUploader();
23
- const isProjectOfQueen = projectName === "小乌鸦";
24
- const role = isProjectOfQueen ? [Role.QUEEN, Role.KING] : [Role.KING];
25
-
26
- return (
27
- <Auth role={role}>
28
- <DropImage
29
- {...rest}
30
- className="mb-256"
31
- onUploadFinish={onUploadFinish}
32
- uploader={async (file) => {
33
- await onBeforeUpload();
34
- setIsLoading(true);
35
- try {
36
- const res = await uploader(
37
- projectId || "",
38
- projectName || "",
39
- file
40
- );
41
- await onUploadSuccess(res);
42
- return setIsLoading(false);
43
- } catch (e) {
44
- setIsLoading(false);
45
- onUploadError();
46
- console.error(e, "failed to upload image.");
47
- }
48
- }}
49
- ghost
50
- >
51
- {() => null}
52
- </DropImage>
53
- </Auth>
54
- );
55
- };
@@ -1,67 +0,0 @@
1
- import {
2
- ContextMenuItem,
3
- ContextMenu,
4
- ContextMenuContent,
5
- ContextMenuTrigger,
6
- ContextMenuLabel,
7
- } from "@bbki.ng/components";
8
- import React, { ReactElement, useContext } from "react";
9
- import { useParams } from "react-router-dom";
10
- import { Auth } from "@/components/Auth";
11
- import { Role } from "@/hooks/use_role";
12
- import { confirm } from "@/utils";
13
- import { ContextMenuSeparator } from "@bbki.ng/components";
14
- import { useDelImg } from "@/hooks/use_del_img";
15
- import { toast } from "sonner";
16
- import { GlobalLoadingContext } from "@/context/global_loading_state_provider";
17
-
18
- export const ImgCtxMenu = (props: {
19
- children: ReactElement;
20
- name: string;
21
- date: string;
22
- width: number;
23
- height: number;
24
- id: number;
25
- onRemoved?: () => Promise<void>;
26
- }) => {
27
- const param = useParams();
28
- const delImg = useDelImg();
29
- const imgId = param.id;
30
- const isImgOfQueen = imgId === "小乌鸦";
31
- const role = isImgOfQueen ? [Role.QUEEN, Role.KING] : [Role.KING];
32
- const date = new Date(props.date).toLocaleString();
33
- const { setIsLoading } = useContext(GlobalLoadingContext);
34
-
35
- return (
36
- <ContextMenu>
37
- <ContextMenuTrigger draggable={false}>
38
- {props.children}
39
- </ContextMenuTrigger>
40
- <Auth role={role}>
41
- <ContextMenuContent className="w-5xl">
42
- <ContextMenuLabel>{props.name}</ContextMenuLabel>
43
- <ContextMenuItem disabled>
44
- {props.width} * {props.height}
45
- </ContextMenuItem>
46
- <ContextMenuItem disabled>{date}</ContextMenuItem>
47
- <ContextMenuSeparator />
48
- <ContextMenuItem
49
- onClick={() => {
50
- confirm("确认删除?", async () => {
51
- setIsLoading(true);
52
- await delImg(props.id);
53
- await props.onRemoved?.();
54
- toast.success("删除成功", {
55
- position: "bottom-right",
56
- });
57
- setIsLoading(false);
58
- });
59
- }}
60
- >
61
- Delete
62
- </ContextMenuItem>
63
- </ContextMenuContent>
64
- </Auth>
65
- </ContextMenu>
66
- );
67
- };
@@ -1,9 +0,0 @@
1
- export default () => {
2
- // @ts-ignore
3
- const appVer = GLOBAL_BBKING_VERSION;
4
- const tagUrl = `https://github.com/bbbottle/bottle/releases/tag/@bbki.ng/site@${appVer}`;
5
-
6
- console.log(appVer, tagUrl);
7
-
8
- return null;
9
- };
@@ -1,29 +0,0 @@
1
- import React from "react";
2
- import { Watch } from "@/components/Pochacco/watch";
3
- import { Idle } from "@/components/Pochacco/idle";
4
- import { Crows } from "./xwy";
5
-
6
- export enum PochaccoPose {
7
- Idle = "idle",
8
- Watching = "watching",
9
- Crows = "crows",
10
- }
11
-
12
- export type PochaccoProps = {
13
- size?: number;
14
- pose?: PochaccoPose;
15
- };
16
-
17
- export const Pochacco = (props: PochaccoProps) => {
18
- const { size = 48, pose = PochaccoPose.Idle } = props;
19
-
20
- if (pose === PochaccoPose.Watching) {
21
- return <Watch {...props} />;
22
- }
23
-
24
- if (pose === PochaccoPose.Crows) {
25
- return <Crows />;
26
- }
27
-
28
- return <Idle {...props} />;
29
- };