koishi-plugin-chat-patch 3.0.2 → 5.0.1

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 (237) hide show
  1. package/client/vue/index.vue +60 -634
  2. package/client/web/dist/assets/AppIcon-DIku6-h0.png +0 -0
  3. package/client/web/dist/assets/AppIconDark-BYymN71t.png +0 -0
  4. package/client/web/dist/assets/CapacitorAppIcon-CSZwNhvi.png +0 -0
  5. package/client/web/dist/assets/CapacitorAppIconDark-BMvMOzsg.png +0 -0
  6. package/client/web/dist/assets/Chat-CTdyeaX2.css +1 -0
  7. package/client/web/dist/assets/Chat-DkZvD7d8.js +28 -0
  8. package/client/web/dist/assets/MealHungryPan-Beos3lRI.js +1 -0
  9. package/client/web/dist/assets/MsgBody-aZ4_aija.js +1 -0
  10. package/client/web/dist/assets/MsgBody.vue_vue_type_script_setup_true_lang-CPZjRLp6.js +67 -0
  11. package/client/web/dist/assets/NapcatAppIcon-C7VOAkW9.png +0 -0
  12. package/client/web/dist/assets/Vue-lEhHouxB.png +0 -0
  13. package/client/web/dist/assets/append_darwin-CqBNU62J.css +1 -0
  14. package/client/web/dist/assets/append_full_vibrancy-j0D2LM9m.css +1 -0
  15. package/client/web/dist/assets/append_linux-uhxeBqeC.css +1 -0
  16. package/client/web/dist/assets/append_linux_vibrancy-COiZq8MS.css +1 -0
  17. package/client/web/dist/assets/append_napcat-DV8CAyAd.css +1 -0
  18. package/client/web/dist/assets/append_new-407Lo5_V.css +1 -0
  19. package/client/web/dist/assets/append_vibrancy-6FHctkOY.css +1 -0
  20. package/client/web/dist/assets/append_win32-srmD-78y.css +1 -0
  21. package/client/web/dist/assets/cakes-CxTVKdnK.svg +189 -0
  22. package/client/web/dist/assets/core-DhEqZVGG.js +1 -0
  23. package/client/web/dist/assets/event-Cadp6m6J.js +1 -0
  24. package/client/web/dist/assets/index-CPTXiemn.js +4045 -0
  25. package/client/web/dist/assets/index-Cg_esKB0.js +1 -0
  26. package/client/web/dist/assets/index-Cln012sP.css +1 -0
  27. package/client/web/dist/assets//346/226/271/346/255/243/345/226/265/345/221/234/344/275/223-CJKIKBn3.ttf +0 -0
  28. package/client/web/dist/assets//346/234/237/345/276/205-C90_OY60.png +0 -0
  29. package/client/web/dist/bcui/css/color-dark.css +35 -0
  30. package/client/web/dist/bcui/css/color-light.css +35 -0
  31. package/client/web/dist/bcui/css/style.css +468 -0
  32. package/client/web/dist/bcui/js/main.js +193 -0
  33. package/client/web/dist/css/append-dark.css +13 -0
  34. package/client/web/dist/css/append-light.css +13 -0
  35. package/client/web/dist/css/append-napcat-dark.css +14 -0
  36. package/client/web/dist/css/append-napcat-light.css +14 -0
  37. package/client/web/dist/favicon.ico +0 -0
  38. package/client/web/dist/img/icons/icon-for-fuck-apple.png +0 -0
  39. package/client/web/dist/img/icons/icon-maskable.png +0 -0
  40. package/client/web/dist/img/icons/icon.png +0 -0
  41. package/client/web/dist/img/icons/icon.svg +10 -0
  42. package/client/web/dist/index.html +22 -0
  43. package/client/web/dist/robots.txt +2 -0
  44. package/client/web/dist/sw.js +58 -0
  45. package/client/web/env.d.ts +56 -0
  46. package/client/web/index.html +21 -0
  47. package/client/web/package-lock.json +3419 -0
  48. package/client/web/package.json +62 -0
  49. package/client/web/public/bcui/css/color-dark.css +35 -0
  50. package/client/web/public/bcui/css/color-light.css +35 -0
  51. package/client/web/public/bcui/css/style.css +468 -0
  52. package/client/web/public/bcui/js/main.js +193 -0
  53. package/client/web/public/css/append-dark.css +13 -0
  54. package/client/web/public/css/append-light.css +13 -0
  55. package/client/web/public/css/append-napcat-dark.css +14 -0
  56. package/client/web/public/css/append-napcat-light.css +14 -0
  57. package/client/web/public/favicon.ico +0 -0
  58. package/client/web/public/img/icons/icon-for-fuck-apple.png +0 -0
  59. package/client/web/public/img/icons/icon-maskable.png +0 -0
  60. package/client/web/public/img/icons/icon.png +0 -0
  61. package/client/web/public/img/icons/icon.svg +10 -0
  62. package/client/web/public/robots.txt +2 -0
  63. package/client/web/public/sw.js +58 -0
  64. package/client/web/scripts/copy-bcui.mjs +17 -0
  65. package/client/web/src/App.vue +1127 -0
  66. package/client/web/src/assets/css/append/append_darwin.css +68 -0
  67. package/client/web/src/assets/css/append/append_full_vibrancy.css +290 -0
  68. package/client/web/src/assets/css/append/append_linux.css +125 -0
  69. package/client/web/src/assets/css/append/append_linux_vibrancy.css +22 -0
  70. package/client/web/src/assets/css/append/append_napcat.css +35 -0
  71. package/client/web/src/assets/css/append/append_new.css +843 -0
  72. package/client/web/src/assets/css/append/append_vibrancy.css +113 -0
  73. package/client/web/src/assets/css/append/append_win32.css +109 -0
  74. package/client/web/src/assets/css/append/mobile/append_mobile_horizontal.css +349 -0
  75. package/client/web/src/assets/css/append/mobile/append_mobile_vertical.css +96 -0
  76. package/client/web/src/assets/css/chat.css +2104 -0
  77. package/client/web/src/assets/css/msg.css +941 -0
  78. package/client/web/src/assets/css/options.css +811 -0
  79. package/client/web/src/assets/css/sys_notice.css +62 -0
  80. package/client/web/src/assets/css/view.css +2105 -0
  81. package/client/web/src/assets/font//346/226/271/346/255/243/345/226/265/345/221/234/344/275/223.ttf +0 -0
  82. package/client/web/src/assets/img/Vue.png +0 -0
  83. package/client/web/src/assets/img/cakes.svg +189 -0
  84. package/client/web/src/assets/img/icons/AppIcon.png +0 -0
  85. package/client/web/src/assets/img/icons/AppIconDark.png +0 -0
  86. package/client/web/src/assets/img/icons/CapacitorAppIcon.png +0 -0
  87. package/client/web/src/assets/img/icons/CapacitorAppIconDark.png +0 -0
  88. package/client/web/src/assets/img/icons/NapcatAppIcon.png +0 -0
  89. package/client/web/src/assets/img/icons/NapcatAppIconDark.png +0 -0
  90. package/client/web/src/assets/img/icons/exit.png +0 -0
  91. package/client/web/src/assets/img/icons/pen.png +0 -0
  92. package/client/web/src/assets/img/stars.svg +89 -0
  93. package/client/web/src/assets/img//346/234/237/345/276/205.png +0 -0
  94. package/client/web/src/assets/l10n/_About I10n.md +35 -0
  95. package/client/web/src/assets/l10n/_l10nconfig.json +7 -0
  96. package/client/web/src/assets/l10n/zh-CN.po +1941 -0
  97. package/client/web/src/assets/logo.png +0 -0
  98. package/client/web/src/assets/pathMap/LLOneBot.yaml +2 -0
  99. package/client/web/src/assets/pathMap/Lagrange.OneBot.yaml +180 -0
  100. package/client/web/src/assets/pathMap/NapCat.Onebot.yaml +224 -0
  101. package/client/web/src/assets/pathMap/SnowLuma.yaml +80 -0
  102. package/client/web/src/assets/qed.txt +1 -0
  103. package/client/web/src/components/AboutPan.vue +197 -0
  104. package/client/web/src/components/BulletinBody.vue +129 -0
  105. package/client/web/src/components/DepPan.vue +310 -0
  106. package/client/web/src/components/EmojiFace.vue +32 -0
  107. package/client/web/src/components/FacePan.vue +461 -0
  108. package/client/web/src/components/FileBody.vue +129 -0
  109. package/client/web/src/components/FileManager.vue +532 -0
  110. package/client/web/src/components/FriendBody.vue +54 -0
  111. package/client/web/src/components/GlobalSessionSearchBar.vue +301 -0
  112. package/client/web/src/components/History.vue +49 -0
  113. package/client/web/src/components/LazyLottie.vue +82 -0
  114. package/client/web/src/components/MergePan.vue +127 -0
  115. package/client/web/src/components/MsgBody.vue +1478 -0
  116. package/client/web/src/components/MusicPlayer.vue +549 -0
  117. package/client/web/src/components/NoticeBody.vue +168 -0
  118. package/client/web/src/components/QzonePermissionPan.vue +150 -0
  119. package/client/web/src/components/RawMsgRenderPreviewPan.vue +190 -0
  120. package/client/web/src/components/ThemeColorPickerPan.vue +420 -0
  121. package/client/web/src/components/TinySessionBody.vue +51 -0
  122. package/client/web/src/components/UmamiInfoPan.vue +1549 -0
  123. package/client/web/src/components/UpdatePan.vue +263 -0
  124. package/client/web/src/components/ViewerCom.vue +1360 -0
  125. package/client/web/src/components/VoiceMsg.vue +626 -0
  126. package/client/web/src/components/WelPan.vue +894 -0
  127. package/client/web/src/components/msg-body/.gitkeep +0 -0
  128. package/client/web/src/components/msg-component/JsonSegComp.vue +138 -0
  129. package/client/web/src/components/msg-component/XmlSegComp.vue +132 -0
  130. package/client/web/src/components/msg-component/jsonComp/AutoReply.vue +97 -0
  131. package/client/web/src/components/msg-component/jsonComp/Contact.lua.vue +129 -0
  132. package/client/web/src/components/msg-component/jsonComp/Feed.lua.vue +94 -0
  133. package/client/web/src/components/msg-component/jsonComp/Forum.vue +84 -0
  134. package/client/web/src/components/msg-component/jsonComp/Mannounce.vue +111 -0
  135. package/client/web/src/components/msg-component/jsonComp/Map.vue +52 -0
  136. package/client/web/src/components/msg-component/jsonComp/Miniapp.lua.vue +53 -0
  137. package/client/web/src/components/msg-component/jsonComp/Miniapp.vue +69 -0
  138. package/client/web/src/components/msg-component/jsonComp/Music.lua.vue +135 -0
  139. package/client/web/src/components/msg-component/jsonComp/Tuwen.lua.vue +56 -0
  140. package/client/web/src/components/notice-component/.gitkeep +0 -0
  141. package/client/web/src/components/notice-component/MealHungryPan.vue +119 -0
  142. package/client/web/src/components/tooltip/CustomFaceTooltip.vue +22 -0
  143. package/client/web/src/components/tooltip/Tooltip.vue +50 -0
  144. package/client/web/src/components/tooltip/Tooltips.vue +14 -0
  145. package/client/web/src/components/tooltip/UserInfoTooltip.vue +69 -0
  146. package/client/web/src/function/base.ts +238 -0
  147. package/client/web/src/function/connect.ts +2042 -0
  148. package/client/web/src/function/debug.ts +10 -0
  149. package/client/web/src/function/elements/information.ts +141 -0
  150. package/client/web/src/function/elements/system.ts +101 -0
  151. package/client/web/src/function/elements/vueComp.ts +62 -0
  152. package/client/web/src/function/favicon.ts +76 -0
  153. package/client/web/src/function/input.ts +69 -0
  154. package/client/web/src/function/model/emoji.ts +127 -0
  155. package/client/web/src/function/model/img.ts +150 -0
  156. package/client/web/src/function/model/msg-body.ts +51 -0
  157. package/client/web/src/function/msg.ts +2674 -0
  158. package/client/web/src/function/notify.ts +225 -0
  159. package/client/web/src/function/option.ts +749 -0
  160. package/client/web/src/function/satori-model.ts +818 -0
  161. package/client/web/src/function/satori.ts +325 -0
  162. package/client/web/src/function/sender.ts +178 -0
  163. package/client/web/src/function/tooltip.ts +49 -0
  164. package/client/web/src/function/utils/appUtil.ts +2288 -0
  165. package/client/web/src/function/utils/avatarUtil.ts +31 -0
  166. package/client/web/src/function/utils/backgroundUtil.ts +110 -0
  167. package/client/web/src/function/utils/linkViewUtil.ts +101 -0
  168. package/client/web/src/function/utils/localHistoryUtil.ts +517 -0
  169. package/client/web/src/function/utils/msgUtil.ts +1242 -0
  170. package/client/web/src/function/utils/pinyin.ts +141 -0
  171. package/client/web/src/function/utils/recordUtil.ts +187 -0
  172. package/client/web/src/function/utils/sessionUtil.ts +114 -0
  173. package/client/web/src/function/utils/systemUtil.ts +664 -0
  174. package/client/web/src/main.ts +91 -0
  175. package/client/web/src/pages/Chat.vue +3453 -0
  176. package/client/web/src/pages/Friends.vue +636 -0
  177. package/client/web/src/pages/Info.vue +717 -0
  178. package/client/web/src/pages/Messages.vue +875 -0
  179. package/client/web/src/pages/Options.vue +82 -0
  180. package/client/web/src/pages/Qzone.vue +1178 -0
  181. package/client/web/src/pages/chat-view/ChatDanmaku.vue +759 -0
  182. package/client/web/src/pages/chat-view/ChatGlagame.vue +642 -0
  183. package/client/web/src/pages/chat-view/ChatTerminal.vue +1044 -0
  184. package/client/web/src/pages/chat-view/SystemNotice.vue +171 -0
  185. package/client/web/src/pages/options/OptAccount.vue +107 -0
  186. package/client/web/src/pages/options/OptAddon.vue +185 -0
  187. package/client/web/src/pages/options/OptDev.vue +704 -0
  188. package/client/web/src/pages/options/OptFunction.vue +403 -0
  189. package/client/web/src/pages/options/OptInfo.vue +165 -0
  190. package/client/web/src/pages/options/OptView.vue +846 -0
  191. package/client/web/src/runtime/backend.ts +310 -0
  192. package/client/web/src/state/auth.ts +14 -0
  193. package/client/web/src/state/chat.ts +36 -0
  194. package/client/web/src/state/connection.ts +20 -0
  195. package/client/web/src/state/contact.ts +37 -0
  196. package/client/web/src/state/qzone.ts +18 -0
  197. package/client/web/src/state/sessionHistory.ts +25 -0
  198. package/client/web/src/state/settings.ts +18 -0
  199. package/client/web/src/state/sticker.ts +10 -0
  200. package/client/web/src/state/ui.ts +56 -0
  201. package/client/web/tsconfig.json +27 -0
  202. package/client/web/tsconfig.tsbuildinfo +1 -0
  203. package/client/web/vite.config.ts +33 -0
  204. package/dist/index.js +1 -12
  205. package/dist/style.css +1 -1
  206. package/lib/index.js +2070 -2077
  207. package/package.json +15 -2
  208. package/readme.md +0 -22
  209. package/src/bootstrap.ts +71 -0
  210. package/src/cache.ts +319 -0
  211. package/src/config.ts +23 -35
  212. package/src/database.ts +650 -0
  213. package/src/index.ts +27 -59
  214. package/src/media.ts +302 -0
  215. package/src/recorder.ts +175 -0
  216. package/src/self-message.ts +456 -0
  217. package/src/server.d.ts +26 -0
  218. package/src/types.ts +108 -48
  219. package/src/web.ts +712 -0
  220. package/client/vue/chat-logic.ts +0 -683
  221. package/client/vue/composables/useChatActions.ts +0 -61
  222. package/client/vue/composables/useChatData.ts +0 -185
  223. package/client/vue/composables/useImageCache.ts +0 -281
  224. package/client/vue/composables/useVideoCache.ts +0 -125
  225. package/client/vue/types.ts +0 -72
  226. package/lib/api-handlers.d.ts +0 -25
  227. package/lib/config.d.ts +0 -14
  228. package/lib/file-manager.d.ts +0 -124
  229. package/lib/index.d.ts +0 -17
  230. package/lib/logger.d.ts +0 -9
  231. package/lib/message-handler.d.ts +0 -35
  232. package/lib/types.d.ts +0 -57
  233. package/lib/utils.d.ts +0 -18
  234. package/src/api-handlers.ts +0 -646
  235. package/src/file-manager.ts +0 -1436
  236. package/src/message-handler.ts +0 -507
  237. package/src/utils.ts +0 -189
@@ -0,0 +1,263 @@
1
+ <template>
2
+ <div class="update-info" :class="{ 'multiple-releases': releases && releases.length > 0 }">
3
+ <template v-if="!releases || releases.length === 0">
4
+ <span>{{ updated ? $t('更新记录') : $t('新版本') }}</span>
5
+ <a>{{ version }}</a>
6
+ <div class="title">
7
+ <img :src="user?.avatar || ''">
8
+ <a :href="user?.url || ''">{{ user?.name || '' }}</a>
9
+ <span>
10
+ {{
11
+ Intl.DateTimeFormat(getTrueLang(), {
12
+ year: 'numeric',
13
+ month: 'short',
14
+ day: 'numeric',
15
+ }).format(new Date(date || 0))
16
+ }}
17
+ </span>
18
+ </div>
19
+ <div class="info">
20
+ <span>{{ info.title }}</span>
21
+ <div>
22
+ <div v-for="(item, index) in info.content"
23
+ :key="'changelog-' + index">
24
+ <span>{{ item.text }}</span>
25
+ <div v-if="item.issue"
26
+ class="log-issue">
27
+ <span> -&gt; </span>
28
+ <div />
29
+ <a @click="openLink(`https://github.com/${repoName}/issues/${item.issue}`)">#{{ item.issue }}</a>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ </div>
34
+ </template>
35
+ <template v-else>
36
+ <div v-for="(release, releaseIndex) in releaseList" :key="'release-' + releaseIndex" class="release-item">
37
+ <div class="release-header">
38
+ <a class="release-version">{{ release.version }} - {{ release.info.title.replace('Release', '') }}</a>
39
+ <div class="release-meta">
40
+ <img :src="release.user.avatar">
41
+ <a :href="release.user.url" target="_blank">{{ release.user.name }}</a>
42
+ <span>
43
+ {{
44
+ Intl.DateTimeFormat(getTrueLang(), {
45
+ year: 'numeric',
46
+ month: 'short',
47
+ day: 'numeric',
48
+ }).format(new Date(release.date))
49
+ }}
50
+ </span>
51
+ </div>
52
+ </div>
53
+ <hr>
54
+ <div class="info">
55
+ <div>
56
+ <div v-for="(item, index) in release.info.content"
57
+ :key="'changelog-' + releaseIndex + '-' + index">
58
+ <span>{{ item.text }}</span>
59
+ <div v-if="item.issue"
60
+ class="log-issue">
61
+ <span> -&gt; </span>
62
+ <div />
63
+ <a @click="openLink(`https://github.com/${repoName}/issues/${item.issue}`)">#{{ item.issue }}</a>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ </template>
70
+ </div>
71
+ </template>
72
+
73
+ <script setup lang="ts">
74
+ import { ref, onMounted } from 'vue'
75
+ import { i18n } from '../main'
76
+ import {
77
+ getTrueLang,
78
+ gitmojiToEmoji,
79
+ } from '../function/utils/systemUtil'
80
+ import { openLink } from '../function/utils/appUtil'
81
+
82
+ defineOptions({ name: 'UpdatePan' })
83
+
84
+ const $t = i18n.global.t
85
+
86
+ const props = defineProps<{
87
+ version?: string
88
+ date?: string
89
+ user?: { avatar: string; url: string; name: string }
90
+ message?: string
91
+ updated?: boolean
92
+ releases?: any[]
93
+ }>()
94
+
95
+ const repoName = import.meta.env.VITE_APP_REPO_NAME
96
+
97
+ const info = ref({
98
+ title: '' as string,
99
+ content: [] as { [key: string]: string }[],
100
+ })
101
+
102
+ const releaseList = ref<any[]>([])
103
+
104
+ function parseMessage(message: string) {
105
+ let msg = message
106
+ // 处理 title,取开头到下一个 "\r\n" 之间的内容
107
+ const title = msg.split('\r\n')[0].substring(1)
108
+ // 处理 msg,取 "## 更新内容" 到下一个 "##" 之间的内容
109
+ const start = msg.indexOf('## 更新内容\r\n')
110
+ if (start != -1) {
111
+ msg = msg.substring(start + 9)
112
+ const end = msg.indexOf('##')
113
+ if (end != -1) {
114
+ msg = msg.substring(0, end)
115
+ }
116
+ }
117
+ msg = title + '\r\n' + msg
118
+
119
+ const updateInfo = msg.split('\n')
120
+ const result = {
121
+ title: updateInfo[0],
122
+ content: [] as { [key: string]: string }[],
123
+ }
124
+
125
+ for (let i = 1; i < updateInfo.length; i++) {
126
+ const item = { text: '' } as { [key: string]: string }
127
+ let text = updateInfo[i]
128
+ if (text.startsWith(':')) {
129
+ const end = text.substring(1).indexOf(':')
130
+ const name = text.substring(0, end + 2)
131
+ const emj = gitmojiToEmoji(name)
132
+ if (emj != undefined) {
133
+ text = text.replace(name, emj)
134
+ }
135
+ }
136
+ // 匹配 issue 编号
137
+ const regexIssue = /<- #(\d+)/
138
+ const matchIssue = text.match(regexIssue)
139
+ if (matchIssue) {
140
+ const issueId = matchIssue[1]
141
+ text = text.replace(regexIssue, '')
142
+ item.issue = issueId
143
+ }
144
+ const regexHash = /[a-f0-9]{40}/
145
+ const matchHash = text.match(regexHash)
146
+ if (matchHash) {
147
+ const hash = matchHash[0]
148
+ // 保留前 7 位
149
+ text = text.replace(hash, hash.substring(0, 7))
150
+ }
151
+ item.text = text
152
+ result.content.push(item)
153
+ }
154
+
155
+ return result
156
+ }
157
+
158
+ onMounted(() => {
159
+ // 如果是多条记录模式
160
+ if (props.releases && props.releases.length > 0) {
161
+ releaseList.value = props.releases.map((release: any) => {
162
+ const parsedInfo = parseMessage(release.message)
163
+ return {
164
+ version: release.version,
165
+ date: release.date,
166
+ user: release.user,
167
+ info: parsedInfo,
168
+ html_url: release.html_url,
169
+ }
170
+ })
171
+ } else {
172
+ // 单条记录模式(原有逻辑)
173
+ info.value = parseMessage(props.message || '')
174
+ }
175
+ })
176
+ </script>
177
+
178
+ <style scoped>
179
+ .log-issue {
180
+ cursor: pointer;
181
+ display: inline-flex;
182
+ flex-direction: row;
183
+ align-items: center;
184
+ }
185
+ .log-issue > div {
186
+ width: calc(0.8rem - 6px);
187
+ height: calc(0.8rem - 6px);
188
+ border-radius: 100%;
189
+ outline: 3px solid var(--color-issue-close);
190
+ margin: 0 5px;
191
+ }
192
+ .log-issue > a {
193
+ text-decoration: underline;
194
+ color: var(--color-issue-close);
195
+ }
196
+
197
+ /* 多条更新记录样式 */
198
+ .update-info.multiple-releases {
199
+ margin: 5px 0 0 -10px;
200
+ overflow-y: auto;
201
+ }
202
+
203
+ .release-item {
204
+ margin-bottom: 20px;
205
+ border-bottom: 1px solid var(--color-card-2);
206
+ background: var(--color-card);
207
+ border-radius: 7px;
208
+ padding: 10px 10px 20px 10px;
209
+ }
210
+
211
+ .release-item hr {
212
+ border: none;
213
+ border-top: 1px solid var(--color-main);
214
+ margin: 0 0 10px 0;
215
+ }
216
+
217
+ .release-item span {
218
+ line-height: 1.5;
219
+ }
220
+
221
+ .release-item:last-child {
222
+ border-bottom: none;
223
+ margin-bottom: 0;
224
+ padding-bottom: 0;
225
+ }
226
+
227
+ .release-header {
228
+ margin: -10px -10px 0 -10px;
229
+ border-radius: 7px 7px 0 0;
230
+ padding: 10px;
231
+ }
232
+
233
+ .release-version {
234
+ font-size: 1.2rem;
235
+ font-weight: bold;
236
+ display: block;
237
+ margin-bottom: 5px;
238
+ color: var(--color-font);
239
+ }
240
+
241
+ .release-meta {
242
+ display: flex;
243
+ align-items: center;
244
+ gap: 8px;
245
+ font-size: 0.9rem;
246
+ color: var(--color-font-2);
247
+ }
248
+
249
+ .release-meta img {
250
+ width: 20px;
251
+ height: 20px;
252
+ border-radius: 50%;
253
+ }
254
+
255
+ .release-meta a {
256
+ color: var(--color-main);
257
+ text-decoration: none;
258
+ }
259
+
260
+ .release-meta a:hover {
261
+ text-decoration: underline;
262
+ }
263
+ </style>