cd-aichat 1.0.0

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 (356) hide show
  1. package/README.md +188 -0
  2. package/dist/ailogo.png +0 -0
  3. package/dist/cd-aichat.css +1 -0
  4. package/dist/cd-aichat.es.js +32223 -0
  5. package/dist/cd-aichat.umd.js +279 -0
  6. package/dist/index.css +1 -0
  7. package/package.json +61 -0
  8. package/src/ailogo.png +0 -0
  9. package/src/components/AiChat.test.js +538 -0
  10. package/src/components/AiChat.vue +2206 -0
  11. package/src/components/AiChatWidget.test.js +312 -0
  12. package/src/components/AiChatWidget.vue +963 -0
  13. package/src/components/BurnAfterReadDialog.test.js +121 -0
  14. package/src/components/BurnAfterReadDialog.vue +511 -0
  15. package/src/components/BurnAfterReadMessage.test.js +188 -0
  16. package/src/components/BurnAfterReadMessage.vue +193 -0
  17. package/src/components/BurnIndicator.test.js +101 -0
  18. package/src/components/BurnIndicator.vue +164 -0
  19. package/src/components/ChatWindow.vue +0 -0
  20. package/src/components/MentionList.vue +163 -0
  21. package/src/components/ResourceList.vue +194 -0
  22. package/src/components/RichTextEditor.vue +437 -0
  23. package/src/components/ScheduledSendDialog.vue +476 -0
  24. package/src/components/ScreenshotOverlay.vue +78 -0
  25. package/src/components/SendButtonGroup.test.js +174 -0
  26. package/src/components/SendButtonGroup.vue +166 -0
  27. package/src/components/UserDrawer.vue +0 -0
  28. package/src/components/screenshot/ScreenshotsBackground/getBoundsByPoints.ts +41 -0
  29. package/src/components/screenshot/ScreenshotsBackground/index.scss +27 -0
  30. package/src/components/screenshot/ScreenshotsBackground/index.tsx +145 -0
  31. package/src/components/screenshot/ScreenshotsButton/index.scss +29 -0
  32. package/src/components/screenshot/ScreenshotsButton/index.tsx +58 -0
  33. package/src/components/screenshot/ScreenshotsCanvas/getBoundsByPoints.ts +55 -0
  34. package/src/components/screenshot/ScreenshotsCanvas/getPoints.ts +60 -0
  35. package/src/components/screenshot/ScreenshotsCanvas/index.scss +84 -0
  36. package/src/components/screenshot/ScreenshotsCanvas/index.tsx +277 -0
  37. package/src/components/screenshot/ScreenshotsCanvas/isPointInDraw.ts +35 -0
  38. package/src/components/screenshot/ScreenshotsColor/index.scss +45 -0
  39. package/src/components/screenshot/ScreenshotsColor/index.tsx +39 -0
  40. package/src/components/screenshot/ScreenshotsContext.ts +56 -0
  41. package/src/components/screenshot/ScreenshotsMagnifier/index.scss +61 -0
  42. package/src/components/screenshot/ScreenshotsMagnifier/index.tsx +126 -0
  43. package/src/components/screenshot/ScreenshotsOperations/index.scss +25 -0
  44. package/src/components/screenshot/ScreenshotsOperations/index.tsx +118 -0
  45. package/src/components/screenshot/ScreenshotsOption/index.scss +50 -0
  46. package/src/components/screenshot/ScreenshotsOption/index.tsx +150 -0
  47. package/src/components/screenshot/ScreenshotsSize/index.scss +28 -0
  48. package/src/components/screenshot/ScreenshotsSize/index.tsx +41 -0
  49. package/src/components/screenshot/ScreenshotsSizeColor/index.scss +8 -0
  50. package/src/components/screenshot/ScreenshotsSizeColor/index.tsx +25 -0
  51. package/src/components/screenshot/ScreenshotsTextarea/calculateNodeSize.ts +117 -0
  52. package/src/components/screenshot/ScreenshotsTextarea/index.scss +19 -0
  53. package/src/components/screenshot/ScreenshotsTextarea/index.tsx +96 -0
  54. package/src/components/screenshot/composeImage.ts +57 -0
  55. package/src/components/screenshot/exports.ts +4 -0
  56. package/src/components/screenshot/hooks/useBounds.ts +35 -0
  57. package/src/components/screenshot/hooks/useCall.ts +17 -0
  58. package/src/components/screenshot/hooks/useCanvasContextRef.ts +8 -0
  59. package/src/components/screenshot/hooks/useCanvasMousedown.ts +13 -0
  60. package/src/components/screenshot/hooks/useCanvasMousemove.ts +13 -0
  61. package/src/components/screenshot/hooks/useCanvasMouseup.ts +13 -0
  62. package/src/components/screenshot/hooks/useCursor.ts +34 -0
  63. package/src/components/screenshot/hooks/useDispatcher.ts +8 -0
  64. package/src/components/screenshot/hooks/useDrawSelect.ts +16 -0
  65. package/src/components/screenshot/hooks/useEmiter.ts +61 -0
  66. package/src/components/screenshot/hooks/useHistory.ts +160 -0
  67. package/src/components/screenshot/hooks/useLang.ts +8 -0
  68. package/src/components/screenshot/hooks/useOperation.ts +37 -0
  69. package/src/components/screenshot/hooks/useReset.ts +26 -0
  70. package/src/components/screenshot/hooks/useStore.ts +8 -0
  71. package/src/components/screenshot/icons/iconfont.scss +88 -0
  72. package/src/components/screenshot/icons/iconfont.ttf +0 -0
  73. package/src/components/screenshot/icons/iconfont.woff +0 -0
  74. package/src/components/screenshot/icons/iconfont.woff2 +0 -0
  75. package/src/components/screenshot/index.tsx +169 -0
  76. package/src/components/screenshot/operations/Arrow/draw.ts +56 -0
  77. package/src/components/screenshot/operations/Arrow/index.tsx +193 -0
  78. package/src/components/screenshot/operations/Brush/draw.ts +45 -0
  79. package/src/components/screenshot/operations/Brush/index.tsx +169 -0
  80. package/src/components/screenshot/operations/Cancel/index.tsx +18 -0
  81. package/src/components/screenshot/operations/Ellipse/draw.ts +96 -0
  82. package/src/components/screenshot/operations/Ellipse/index.tsx +245 -0
  83. package/src/components/screenshot/operations/Mosaic/index.tsx +223 -0
  84. package/src/components/screenshot/operations/Ok/index.tsx +37 -0
  85. package/src/components/screenshot/operations/Pin/index.tsx +37 -0
  86. package/src/components/screenshot/operations/Rectangle/draw.ts +80 -0
  87. package/src/components/screenshot/operations/Rectangle/index.tsx +245 -0
  88. package/src/components/screenshot/operations/Redo/index.tsx +22 -0
  89. package/src/components/screenshot/operations/Save/index.tsx +37 -0
  90. package/src/components/screenshot/operations/Scan/index.tsx +46 -0
  91. package/src/components/screenshot/operations/Search/index.tsx +39 -0
  92. package/src/components/screenshot/operations/Text/index.tsx +307 -0
  93. package/src/components/screenshot/operations/Undo/index.tsx +22 -0
  94. package/src/components/screenshot/operations/index.ts +34 -0
  95. package/src/components/screenshot/operations/utils.ts +34 -0
  96. package/src/components/screenshot/screenshots.scss +13 -0
  97. package/src/components/screenshot/types.ts +53 -0
  98. package/src/components/screenshot/useGetLoadedImage.ts +29 -0
  99. package/src/components/screenshot/var.scss +107 -0
  100. package/src/components/screenshot/zh_CN.ts +37 -0
  101. package/src/emoji/100.gif +0 -0
  102. package/src/emoji/101.gif +0 -0
  103. package/src/emoji/102.gif +0 -0
  104. package/src/emoji/103.gif +0 -0
  105. package/src/emoji/104.gif +0 -0
  106. package/src/emoji/105.gif +0 -0
  107. package/src/emoji/106.gif +0 -0
  108. package/src/emoji/107.gif +0 -0
  109. package/src/emoji/108.gif +0 -0
  110. package/src/emoji/109.gif +0 -0
  111. package/src/emoji/110.gif +0 -0
  112. package/src/emoji/111.gif +0 -0
  113. package/src/emoji/112.gif +0 -0
  114. package/src/emoji/113.gif +0 -0
  115. package/src/emoji/114.gif +0 -0
  116. package/src/emoji/115.gif +0 -0
  117. package/src/emoji/116.gif +0 -0
  118. package/src/emoji/117.gif +0 -0
  119. package/src/emoji/118.gif +0 -0
  120. package/src/emoji/119.gif +0 -0
  121. package/src/emoji/120.gif +0 -0
  122. package/src/emoji/121.gif +0 -0
  123. package/src/emoji/122.gif +0 -0
  124. package/src/emoji/123.gif +0 -0
  125. package/src/emoji/124.gif +0 -0
  126. package/src/emoji/125.gif +0 -0
  127. package/src/emoji/126.gif +0 -0
  128. package/src/emoji/127.gif +0 -0
  129. package/src/emoji/128.gif +0 -0
  130. package/src/emoji/129.gif +0 -0
  131. package/src/emoji/130.gif +0 -0
  132. package/src/emoji/131.gif +0 -0
  133. package/src/emoji/132.gif +0 -0
  134. package/src/emoji/133.gif +0 -0
  135. package/src/emoji/134.gif +0 -0
  136. package/src/emoji/135.gif +0 -0
  137. package/src/emoji/136.gif +0 -0
  138. package/src/emoji/137.gif +0 -0
  139. package/src/emoji/138.gif +0 -0
  140. package/src/emoji/139.gif +0 -0
  141. package/src/emoji/140.gif +0 -0
  142. package/src/emoji/141.gif +0 -0
  143. package/src/emoji/142.gif +0 -0
  144. package/src/emoji/143.gif +0 -0
  145. package/src/emoji/144.gif +0 -0
  146. package/src/emoji/145.gif +0 -0
  147. package/src/emoji/146.gif +0 -0
  148. package/src/emoji/147.gif +0 -0
  149. package/src/emoji/148.gif +0 -0
  150. package/src/emoji/149.gif +0 -0
  151. package/src/emoji/150.gif +0 -0
  152. package/src/emoji/151.gif +0 -0
  153. package/src/emoji/152.gif +0 -0
  154. package/src/emoji/153.gif +0 -0
  155. package/src/emoji/154.gif +0 -0
  156. package/src/emoji/155.gif +0 -0
  157. package/src/emoji/156.gif +0 -0
  158. package/src/emoji/157.gif +0 -0
  159. package/src/emoji/158.gif +0 -0
  160. package/src/emoji/159.gif +0 -0
  161. package/src/emoji/160.gif +0 -0
  162. package/src/emoji/161.gif +0 -0
  163. package/src/emoji/162.gif +0 -0
  164. package/src/emoji/163.gif +0 -0
  165. package/src/emoji/164.gif +0 -0
  166. package/src/emoji/165.gif +0 -0
  167. package/src/emoji/166.gif +0 -0
  168. package/src/emoji/167.gif +0 -0
  169. package/src/emoji/168.gif +0 -0
  170. package/src/emoji/169.gif +0 -0
  171. package/src/emoji/170.gif +0 -0
  172. package/src/emoji/171.gif +0 -0
  173. package/src/emoji/172.gif +0 -0
  174. package/src/emoji/173.gif +0 -0
  175. package/src/emoji/174.gif +0 -0
  176. package/src/emoji/175.gif +0 -0
  177. package/src/emoji/176.gif +0 -0
  178. package/src/emoji/177.gif +0 -0
  179. package/src/emoji/178.gif +0 -0
  180. package/src/emoji/179.gif +0 -0
  181. package/src/emoji/180.gif +0 -0
  182. package/src/emoji/181.gif +0 -0
  183. package/src/emoji/182.gif +0 -0
  184. package/src/emoji/183.gif +0 -0
  185. package/src/emoji/184.gif +0 -0
  186. package/src/emoji/185.gif +0 -0
  187. package/src/emoji/186.gif +0 -0
  188. package/src/emoji/187.gif +0 -0
  189. package/src/emoji/188.gif +0 -0
  190. package/src/emoji/189.gif +0 -0
  191. package/src/emoji/190.gif +0 -0
  192. package/src/emoji/191.gif +0 -0
  193. package/src/emoji/192.gif +0 -0
  194. package/src/emoji/193.gif +0 -0
  195. package/src/emoji/194.gif +0 -0
  196. package/src/emoji/195.gif +0 -0
  197. package/src/emoji/196.gif +0 -0
  198. package/src/emoji/197.gif +0 -0
  199. package/src/emoji/198.gif +0 -0
  200. package/src/emoji/199.gif +0 -0
  201. package/src/emoji/200.png +0 -0
  202. package/src/emoji/201.png +0 -0
  203. package/src/emoji/202.png +0 -0
  204. package/src/emoji/203.png +0 -0
  205. package/src/emoji/204.png +0 -0
  206. package/src/emoji/205.png +0 -0
  207. package/src/emoji/206.png +0 -0
  208. package/src/emoji/207.png +0 -0
  209. package/src/emoji/208.png +0 -0
  210. package/src/emoji/209.png +0 -0
  211. package/src/emoji/210.png +0 -0
  212. package/src/emoji/211.png +0 -0
  213. package/src/emoji/212.png +0 -0
  214. package/src/emoji/213.png +0 -0
  215. package/src/emoji/214.png +0 -0
  216. package/src/emoji/215.png +0 -0
  217. package/src/emoji/216.png +0 -0
  218. package/src/emoji/217.png +0 -0
  219. package/src/emoji/218.png +0 -0
  220. package/src/emoji/219.png +0 -0
  221. package/src/emoji2/101--Streamline-The-Team.png +0 -0
  222. package/src/emoji2/128--Streamline-The-Team.png +0 -0
  223. package/src/emoji2/134--Streamline-The-Team.png +0 -0
  224. package/src/emoji2/173--Streamline-The-Team.png +0 -0
  225. package/src/emoji2/Airplane--Streamline-Emoji.svg +24 -0
  226. package/src/emoji2/Alien--Streamline-Emoji.svg +21 -0
  227. package/src/emoji2/Amazed-Face--Streamline-Emoji.svg +16 -0
  228. package/src/emoji2/Amusing-Face--Streamline-Emoji.svg +20 -0
  229. package/src/emoji2/Anguished-Face--Streamline-Emoji.svg +19 -0
  230. package/src/emoji2/Anxious-Face--Streamline-Emoji.svg +17 -0
  231. package/src/emoji2/Astonished-Face--Streamline-Emoji.svg +20 -0
  232. package/src/emoji2/Backhand-Index-Pointing-Down-1--Streamline-Emoji.svg +12 -0
  233. package/src/emoji2/Backhand-Index-Pointing-Left-1--Streamline-Emoji.svg +13 -0
  234. package/src/emoji2/Backhand-Index-Pointing-Right-1--Streamline-Emoji.svg +13 -0
  235. package/src/emoji2/Backhand-Index-Pointing-Up-1--Streamline-Emoji.svg +14 -0
  236. package/src/emoji2/Bar-Chart--Streamline-Emoji.svg +22 -0
  237. package/src/emoji2/Beaming-Face-With-Smiling-Eyes--Streamline-Emoji.svg +20 -0
  238. package/src/emoji2/Boy-1--Streamline-Emoji.svg +17 -0
  239. package/src/emoji2/Boy-2--Streamline-Emoji.svg +17 -0
  240. package/src/emoji2/Boy-3--Streamline-Emoji.svg +17 -0
  241. package/src/emoji2/Broken-Heart--Streamline-Emoji.svg +12 -0
  242. package/src/emoji2/Clapping-Hands-1--Streamline-Emoji.svg +23 -0
  243. package/src/emoji2/Clinking-Glasses-2--Streamline-Emoji.svg +43 -0
  244. package/src/emoji2/Confounded-Face--Streamline-Emoji.svg +17 -0
  245. package/src/emoji2/Confused-Face--Streamline-Emoji.svg +15 -0
  246. package/src/emoji2/Construction-Worker--Streamline-Emoji.svg +21 -0
  247. package/src/emoji2/Couple-With-Heart-Woman-Man-1--Streamline-Emoji.svg +40 -0
  248. package/src/emoji2/Couple-With-Heart-Woman-Man-2--Streamline-Emoji.svg +40 -0
  249. package/src/emoji2/Cowboy-Hat-Face--Streamline-Emoji.svg +22 -0
  250. package/src/emoji2/Crazy-Face--Streamline-Emoji.svg +25 -0
  251. package/src/emoji2/Crossed-Fingers-1--Streamline-Emoji.svg +25 -0
  252. package/src/emoji2/Crown--Streamline-Emoji.svg +35 -0
  253. package/src/emoji2/Crying-Face--Streamline-Emoji.svg +26 -0
  254. package/src/emoji2/Delivery-Truck--Streamline-Emoji.svg +31 -0
  255. package/src/emoji2/Determined-Face--Streamline-Emoji.svg +25 -0
  256. package/src/emoji2/Disappointed-Face--Streamline-Emoji.svg +15 -0
  257. package/src/emoji2/Dizzy-Face--Streamline-Emoji.svg +20 -0
  258. package/src/emoji2/Downcast-Face-With-Sweat--Streamline-Emoji.svg +18 -0
  259. package/src/emoji2/Drooling-Face-1--Streamline-Emoji.svg +19 -0
  260. package/src/emoji2/Drooling-Face-2--Streamline-Emoji.svg +18 -0
  261. package/src/emoji2/Ear--Streamline-Emoji.svg +14 -0
  262. package/src/emoji2/Exclamation-Mark--Streamline-Emoji.svg +12 -0
  263. package/src/emoji2/Exploding-Head--Streamline-Emoji.svg +24 -0
  264. package/src/emoji2/Expressionless-Face--Streamline-Emoji.svg +15 -0
  265. package/src/emoji2/Face-Blowing-A-Kiss--Streamline-Emoji.svg +18 -0
  266. package/src/emoji2/Face-Savoring-Food--Streamline-Emoji.svg +18 -0
  267. package/src/emoji2/Face-Screaming-In-Fear--Streamline-Emoji.svg +18 -0
  268. package/src/emoji2/Face-Vomiting--Streamline-Emoji.svg +28 -0
  269. package/src/emoji2/Face-With-Head-Bandage--Streamline-Emoji.svg +25 -0
  270. package/src/emoji2/Face-With-Medical-Mask--Streamline-Emoji.svg +23 -0
  271. package/src/emoji2/Face-With-Monocle--Streamline-Emoji.svg +26 -0
  272. package/src/emoji2/Face-With-Raised-Eyebrow--Streamline-Emoji.svg +17 -0
  273. package/src/emoji2/Face-With-Rolling-Eyes--Streamline-Emoji.svg +17 -0
  274. package/src/emoji2/Face-With-Steam-From-Nose--Streamline-Emoji.svg +19 -0
  275. package/src/emoji2/Face-With-Symbols-On-Mouth--Streamline-Emoji.svg +22 -0
  276. package/src/emoji2/Face-With-Tears-Of-Joy--Streamline-Emoji.svg +34 -0
  277. package/src/emoji2/Face-With-Thermometer--Streamline-Emoji.svg +31 -0
  278. package/src/emoji2/Face-With-Tongue--Streamline-Emoji.svg +18 -0
  279. package/src/emoji2/Face-Without-Mouth--Streamline-Emoji.svg +14 -0
  280. package/src/emoji2/Fearful-Face--Streamline-Emoji.svg +18 -0
  281. package/src/emoji2/Flexed-Biceps-1--Streamline-Emoji.svg +13 -0
  282. package/src/emoji2/Flushed-Face--Streamline-Emoji.svg +19 -0
  283. package/src/emoji2/Folded-Hands-1--Streamline-Emoji.svg +29 -0
  284. package/src/emoji2/Frowning-Face--Streamline-Emoji.svg +15 -0
  285. package/src/emoji2/Fuel-Pump--Streamline-Emoji.svg +30 -0
  286. package/src/emoji2/Girl-1--Streamline-Emoji.svg +23 -0
  287. package/src/emoji2/Glasses-1--Streamline-Emoji.svg +27 -0
  288. package/src/emoji2/Grimacing-Face--Streamline-Emoji.svg +19 -0
  289. package/src/emoji2/Grinning-Cat-Face--Streamline-Emoji.svg +32 -0
  290. package/src/emoji2/Grinning-Face--Streamline-Emoji.svg +16 -0
  291. package/src/emoji2/Grinning-Face-With-Sweat--Streamline-Emoji.svg +19 -0
  292. package/src/emoji2/Grinning-Squinting-Face--Streamline-Emoji.svg +16 -0
  293. package/src/emoji2/Hand-With-Fingers-Splayed-1--Streamline-Emoji.svg +14 -0
  294. package/src/emoji2/Heart-Suit--Streamline-Emoji.svg +9 -0
  295. package/src/emoji2/Hushed-Face-1--Streamline-Emoji.svg +17 -0
  296. package/src/emoji2/Hushed-Face-2--Streamline-Emoji.svg +15 -0
  297. package/src/emoji2/Index-Pointing-Up-1--Streamline-Emoji.svg +17 -0
  298. package/src/emoji2/Kissing-Face-With-Closed-Eyes--Streamline-Emoji.svg +18 -0
  299. package/src/emoji2/Loudly-Crying-Face--Streamline-Emoji.svg +16 -0
  300. package/src/emoji2/Lying-Face--Streamline-Emoji.svg +15 -0
  301. package/src/emoji2/Man-1--Streamline-Emoji.svg +17 -0
  302. package/src/emoji2/Man-Facepalming-1--Streamline-Emoji.svg +21 -0
  303. package/src/emoji2/Man-Gesturing-No-1--Streamline-Emoji.svg +34 -0
  304. package/src/emoji2/Man-Gesturing-Ok-1--Streamline-Emoji.svg +25 -0
  305. package/src/emoji2/Man-Health-Worker-1--Streamline-Emoji.svg +41 -0
  306. package/src/emoji2/Man-Raising-Hand-1--Streamline-Emoji.svg +26 -0
  307. package/src/emoji2/Man-Shrugging-1--Streamline-Emoji.svg +31 -0
  308. package/src/emoji2/Money-Mouth-Face-2--Streamline-Emoji.svg +30 -0
  309. package/src/emoji2/Mouth--Streamline-Emoji.svg +12 -0
  310. package/src/emoji2/Nauseated-Face-2--Streamline-Emoji.svg +19 -0
  311. package/src/emoji2/Neutral-Face--Streamline-Emoji.svg +15 -0
  312. package/src/emoji2/Ok-Hand-1--Streamline-Emoji.svg +14 -0
  313. package/src/emoji2/Old-Man-1--Streamline-Emoji.svg +27 -0
  314. package/src/emoji2/Old-Woman-1--Streamline-Emoji.svg +23 -0
  315. package/src/emoji2/Oncoming-Fist-1--Streamline-Emoji.svg +15 -0
  316. package/src/emoji2/Person-Wearing-Turban-2--Streamline-Emoji.svg +20 -0
  317. package/src/emoji2/Pile-Of-Poo--Streamline-Emoji.svg +15 -0
  318. package/src/emoji2/Police-Car-Light--Streamline-Emoji.svg +26 -0
  319. package/src/emoji2/Rocket--Streamline-Emoji.svg +32 -0
  320. package/src/emoji2/Sailboat--Streamline-Emoji.svg +18 -0
  321. package/src/emoji2/Shaved-Ice--Streamline-Emoji.svg +21 -0
  322. package/src/emoji2/Shortcake-2--Streamline-Emoji.svg +18 -0
  323. package/src/emoji2/Shushing-Face--Streamline-Emoji.svg +21 -0
  324. package/src/emoji2/Sign-Of-The-Horns-1--Streamline-Emoji.svg +19 -0
  325. package/src/emoji2/Sleeping-Face--Streamline-Emoji.svg +21 -0
  326. package/src/emoji2/Slightly-Smiling-Face--Streamline-Emoji.svg +15 -0
  327. package/src/emoji2/Smiling-Face-With-Halo--Streamline-Emoji.svg +20 -0
  328. package/src/emoji2/Smiling-Face-With-Heart-Eyes--Streamline-Emoji.svg +21 -0
  329. package/src/emoji2/Smirking-Face--Streamline-Emoji.svg +17 -0
  330. package/src/emoji2/Sun-With-Face--Streamline-Emoji.svg +24 -0
  331. package/src/emoji2/Thumbs-Down-1--Streamline-Emoji.svg +20 -0
  332. package/src/emoji2/Thumbs-Up-1--Streamline-Emoji.svg +19 -0
  333. package/src/emoji2/Winking-Face--Streamline-Emoji.svg +18 -0
  334. package/src/emoji2/Woman-Gesturing-No-1--Streamline-Emoji.svg +34 -0
  335. package/src/emoji2/Woman-Gesturing-Ok-2--Streamline-Emoji.svg +25 -0
  336. package/src/emoji2/Woman-Raising-Hand-1--Streamline-Emoji.svg +26 -0
  337. package/src/emoji2/Womans-Sandal--Streamline-Emoji.svg +13 -0
  338. package/src/emoji2/Worried-Face--Streamline-Emoji.svg +17 -0
  339. package/src/emoji2/Writing-Hand-1--Streamline-Emoji.svg +17 -0
  340. package/src/emoji2/Zipper-Mouth-Face--Streamline-Emoji.svg +21 -0
  341. package/src/index.js +19 -0
  342. package/src/services/burn-after-read-service.js +313 -0
  343. package/src/services/burn-after-read-service.test.js +325 -0
  344. package/src/services/dify-api.js +338 -0
  345. package/src/services/dify-api.test.js +376 -0
  346. package/src/services/scheduled-send-service.js +311 -0
  347. package/src/services/scheduled-send-service.test.js +317 -0
  348. package/src/styles/index.css +2368 -0
  349. package/src/utils/emoji.js +125 -0
  350. package/src/utils/emojiData.js +267 -0
  351. package/src/utils/eventEmitter.js +114 -0
  352. package/src/utils/state.js +224 -0
  353. package/src/utils/state.test.js +198 -0
  354. package/src/utils/storage.js +122 -0
  355. package/src/utils/storage.test.js +162 -0
  356. package/src/utils/validation.js +249 -0
@@ -0,0 +1,2368 @@
1
+ /* CD AI Chat 样式 - 参考 message.vue 设计 */
2
+ .im-container {
3
+ display: flex;
4
+ flex-direction: column;
5
+ height: 100%;
6
+ background-color: #f5f5f5;
7
+ font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
8
+ position: relative;
9
+ }
10
+ /* 头部 */
11
+ .header {
12
+ display: flex;
13
+ align-items: center;
14
+ padding: 12px 16px;
15
+ background-color: #fff;
16
+ border-bottom: 1px solid #e5e5e5;
17
+ gap: 12px;
18
+ }
19
+ .header .ri-arrow-left-line {
20
+ font-size: 24px;
21
+ cursor: pointer;
22
+ color: #333;
23
+ padding: 4px;
24
+ }
25
+ .header .ri-arrow-left-line:hover {
26
+ color: #1890ff;
27
+ }
28
+ .user-info {
29
+ flex: 1;
30
+ display: flex;
31
+ align-items: center;
32
+ gap: 12px;
33
+ min-width: 0;
34
+ }
35
+ .user-avatar {
36
+ width: 40px;
37
+ height: 40px;
38
+ border-radius: 50%;
39
+ overflow: hidden;
40
+ flex-shrink: 0;
41
+ }
42
+ .user-avatar img {
43
+ width: 100%;
44
+ height: 100%;
45
+ object-fit: cover;
46
+ }
47
+ .user-details {
48
+ flex: 1;
49
+ min-width: 0;
50
+ }
51
+ .user-name {
52
+ font-size: 16px;
53
+ font-weight: 600;
54
+ color: #333;
55
+ overflow: hidden;
56
+ text-overflow: ellipsis;
57
+ white-space: nowrap;
58
+ }
59
+ .user-account {
60
+ font-size: 12px;
61
+ color: #999;
62
+ overflow: hidden;
63
+ text-overflow: ellipsis;
64
+ white-space: nowrap;
65
+ }
66
+ .user-status {
67
+ font-size: 12px;
68
+ color: #999;
69
+ }
70
+ .header-actions {
71
+ display: flex;
72
+ align-items: center;
73
+ gap: 12px;
74
+ }
75
+ .header-more-icon,
76
+ .header-close-icon {
77
+ font-size: 20px;
78
+ cursor: pointer;
79
+ color: #666;
80
+ padding: 4px;
81
+ transition: color 0.2s;
82
+ }
83
+ .header-more-icon:hover,
84
+ .header-close-icon:hover {
85
+ color: #1890ff;
86
+ }
87
+ /* 主体区域 */
88
+ .main {
89
+ flex: 1;
90
+ overflow: hidden;
91
+ display: flex;
92
+ flex-direction: column;
93
+ }
94
+ .chatBox {
95
+ flex: 1;
96
+ display: flex;
97
+ flex-direction: column;
98
+ overflow: hidden;
99
+ }
100
+ /* 消息列表 */
101
+ .chatList {
102
+ flex: none;
103
+ overflow-y: auto;
104
+ padding: 16px;
105
+ scroll-behavior: smooth;
106
+ transition: height 0.1s ease;
107
+ position: relative;
108
+ }
109
+ .chatList::-webkit-scrollbar {
110
+ width: 6px;
111
+ }
112
+ .chatList::-webkit-scrollbar-thumb {
113
+ background-color: rgba(0, 0, 0, 0.2);
114
+ border-radius: 3px;
115
+ }
116
+ .chatList::-webkit-scrollbar-track {
117
+ background-color: transparent;
118
+ }
119
+ .chatList-item {
120
+ margin-bottom: 16px;
121
+ }
122
+ .chatList-item--compact {
123
+ margin-top: -8px;
124
+ }
125
+ .chatList-time {
126
+ text-align: center;
127
+ font-size: 12px;
128
+ color: #999;
129
+ margin-bottom: 16px;
130
+ }
131
+ .chatList-wrapper {
132
+ display: flex;
133
+ gap: 12px;
134
+ align-items: flex-start;
135
+ }
136
+ .chatList-item--mine .chatList-wrapper {
137
+ justify-content: flex-end;
138
+ }
139
+ .chatList-avatar {
140
+ width: 40px;
141
+ height: 40px;
142
+ border-radius: 50%;
143
+ overflow: hidden;
144
+ flex-shrink: 0;
145
+ }
146
+ .chatList-avatar img {
147
+ width: 100%;
148
+ height: 100%;
149
+ object-fit: cover;
150
+ }
151
+ .chatList-avatar--placeholder {
152
+ width: 40px;
153
+ height: 40px;
154
+ flex-shrink: 0;
155
+ }
156
+ .chatList-content {
157
+ flex: 0 1 auto;
158
+ min-width: 0;
159
+ max-width: 60%;
160
+ display: flex;
161
+ flex-direction: column;
162
+ }
163
+ .chatList-item--mine .chatList-content {
164
+ align-items: flex-end;
165
+ }
166
+ .chatList-sender-name {
167
+ font-size: 12px;
168
+ color: #666;
169
+ margin-bottom: 4px;
170
+ padding-left: 12px;
171
+ }
172
+ .chatList-item--mine .chatList-sender-name {
173
+ padding-left: 0;
174
+ padding-right: 12px;
175
+ }
176
+ .chatList-text {
177
+ position: relative;
178
+ padding: 10px 14px;
179
+ border-radius: 8px;
180
+ background-color: #fff;
181
+ word-wrap: break-word;
182
+ word-break: break-word;
183
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
184
+ }
185
+ .chatList-text--mine {
186
+ background-color: #95ec69;
187
+ color: #333;
188
+ }
189
+ .chatList-text--ai {
190
+ background-color: #fff;
191
+ border: 1px solid #e5e5e5;
192
+ }
193
+ .chatList-text--group {
194
+ background-color: #fff;
195
+ }
196
+ .chatList-text--no-bg {
197
+ background-color: transparent;
198
+ box-shadow: none;
199
+ padding: 0;
200
+ border-radius: 0;
201
+ }
202
+ .chatList-arrow {
203
+ position: absolute;
204
+ top: 12px;
205
+ width: 0;
206
+ height: 0;
207
+ border: 6px solid transparent;
208
+ }
209
+ .chatList-text .chatList-arrow {
210
+ left: -12px;
211
+ border-right-color: #fff;
212
+ }
213
+ .chatList-text--mine .chatList-arrow {
214
+ left: auto;
215
+ right: -12px;
216
+ border-left-color: #95ec69;
217
+ border-right-color: transparent;
218
+ }
219
+ .chatList-text--ai .chatList-arrow {
220
+ border-right-color: #fff;
221
+ }
222
+ .chatList__msg--text {
223
+ margin: 0;
224
+ font-size: 14px;
225
+ line-height: 1.6;
226
+ white-space: pre-wrap;
227
+ }
228
+ .chatList__msg--img {
229
+ max-width: 200px;
230
+ max-height: 200px;
231
+ border-radius: 4px;
232
+ cursor: pointer;
233
+ display: block;
234
+ }
235
+ .chatList__msg--audio {
236
+ width: 200px;
237
+ height: 40px;
238
+ }
239
+ .chatList__msg--voice {
240
+ display: flex;
241
+ align-items: center;
242
+ gap: 8px;
243
+ padding: 8px 12px;
244
+ background-color: #f0f0f0;
245
+ border-radius: 6px;
246
+ cursor: pointer;
247
+ transition: all 0.2s;
248
+ user-select: none;
249
+ }
250
+ .chatList__msg--voice:hover {
251
+ background-color: #e8e8e8;
252
+ }
253
+ .voice-play-icon {
254
+ font-size: 20px;
255
+ color: #0067CC;
256
+ flex-shrink: 0;
257
+ }
258
+ .voice-duration {
259
+ font-size: 14px;
260
+ color: #333;
261
+ min-width: 30px;
262
+ }
263
+ .chatList__msg--video {
264
+ max-width: 300px;
265
+ max-height: 200px;
266
+ border-radius: 4px;
267
+ }
268
+ .streaming-indicator {
269
+ display: inline-block;
270
+ animation: blink 1s infinite;
271
+ margin-left: 4px;
272
+ color: #1890ff;
273
+ }
274
+ @keyframes blink {
275
+ 0%, 50% { opacity: 1; }
276
+ 51%, 100% { opacity: 0; }
277
+ }
278
+ /* 加载中 */
279
+ .chatList-loading {
280
+ text-align: center;
281
+ padding: 20px;
282
+ }
283
+ .loading-dots {
284
+ display: inline-flex;
285
+ gap: 6px;
286
+ }
287
+ .loading-dots span {
288
+ width: 8px;
289
+ height: 8px;
290
+ border-radius: 50%;
291
+ background-color: #1890ff;
292
+ animation: bounce 1.4s infinite ease-in-out both;
293
+ }
294
+ .loading-dots span:nth-child(1) {
295
+ animation-delay: -0.32s;
296
+ }
297
+ .loading-dots span:nth-child(2) {
298
+ animation-delay: -0.16s;
299
+ }
300
+ @keyframes bounce {
301
+ 0%, 80%, 100% {
302
+ transform: scale(0);
303
+ }
304
+ 40% {
305
+ transform: scale(1);
306
+ }
307
+ }
308
+ /* 拖拽调整高度 */
309
+ .resize-handle {
310
+ height: 8px;
311
+ background-color: #f5f5f5;
312
+ cursor: ns-resize;
313
+ display: flex;
314
+ align-items: center;
315
+ justify-content: center;
316
+ transition: background-color 0.2s;
317
+ position: relative;
318
+ user-select: none;
319
+ }
320
+ .resize-handle:hover {
321
+ background-color: #e5e5e5;
322
+ }
323
+ .resize-handle.resizing {
324
+ background-color: #1890ff;
325
+ }
326
+ .resize-line {
327
+ width: 40px;
328
+ height: 3px;
329
+ background-color: #d9d9d9;
330
+ border-radius: 2px;
331
+ transition: background-color 0.2s;
332
+ }
333
+ .resize-handle:hover .resize-line,
334
+ .resize-handle.resizing .resize-line {
335
+ background-color: #1890ff;
336
+ }
337
+ /* 工具栏 */
338
+ .toolBox {
339
+ display: flex;
340
+ justify-content: space-between;
341
+ align-items: center;
342
+ padding: 8px 16px;
343
+ background-color: #fff;
344
+ border-top: 1px solid #e5e5e5;
345
+ }
346
+ .toolBox-left,
347
+ .toolBox-right {
348
+ display: flex;
349
+ gap: 16px;
350
+ }
351
+ .tool-icon {
352
+ font-size: 20px;
353
+ color: #666;
354
+ cursor: pointer;
355
+ transition: color 0.2s;
356
+ }
357
+ .tool-icon:hover {
358
+ color: #1890ff;
359
+ }
360
+ .tool-icon.recording-active {
361
+ color: #ff4d4f;
362
+ animation: pulse 1s infinite;
363
+ }
364
+ @keyframes pulse {
365
+ 0%, 100% {
366
+ opacity: 1;
367
+ }
368
+ 50% {
369
+ opacity: 0.5;
370
+ }
371
+ }
372
+ /* 输入框区域 */
373
+ .writeBox {
374
+ flex: 1;
375
+ display: flex;
376
+ flex-direction: column;
377
+ background-color: #fff;
378
+ border-top: 1px solid #e5e5e5;
379
+ }
380
+ .recording-dialog {
381
+ position: absolute;
382
+ top: 50%;
383
+ left: 50%;
384
+ transform: translate(-50%, -50%);
385
+ z-index: 100;
386
+ background-color: rgba(0, 0, 0, 0.9);
387
+ border-radius: 12px;
388
+ padding: 32px 48px;
389
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
390
+ animation: fadeIn 0.3s ease;
391
+ }
392
+ .recording-dialog-content {
393
+ display: flex;
394
+ flex-direction: column;
395
+ align-items: center;
396
+ gap: 16px;
397
+ }
398
+ .recording-icon-large {
399
+ width: 80px;
400
+ height: 80px;
401
+ border-radius: 50%;
402
+ background-color: #ff4d4f;
403
+ display: flex;
404
+ align-items: center;
405
+ justify-content: center;
406
+ animation: pulse 1.5s infinite;
407
+ }
408
+ .recording-icon-large i {
409
+ font-size: 40px;
410
+ color: #fff;
411
+ }
412
+ .recording-time {
413
+ font-size: 32px;
414
+ font-weight: 600;
415
+ color: #fff;
416
+ font-variant-numeric: tabular-nums;
417
+ }
418
+ .recording-text {
419
+ font-size: 16px;
420
+ color: rgba(255, 255, 255, 0.8);
421
+ }
422
+ .recording-stop-btn {
423
+ display: flex;
424
+ align-items: center;
425
+ gap: 8px;
426
+ padding: 12px 24px;
427
+ background-color: #fff;
428
+ color: #ff4d4f;
429
+ border: none;
430
+ border-radius: 24px;
431
+ font-size: 14px;
432
+ font-weight: 500;
433
+ cursor: pointer;
434
+ transition: all 0.2s;
435
+ margin-top: 8px;
436
+ }
437
+ .recording-stop-btn:hover {
438
+ background-color: #ff4d4f;
439
+ color: #fff;
440
+ transform: scale(1.05);
441
+ }
442
+ .recording-stop-btn i {
443
+ font-size: 18px;
444
+ }
445
+ /* 录音对话框样式 */
446
+ .recording-dialog-overlay {
447
+ position: absolute;
448
+ top: 0;
449
+ left: 0;
450
+ right: 0;
451
+ bottom: 0;
452
+ background: rgba(0, 0, 0, 0.7);
453
+ display: flex;
454
+ align-items: center;
455
+ justify-content: center;
456
+ z-index: 100;
457
+ pointer-events: auto;
458
+ backdrop-filter: blur(2px);
459
+ }
460
+ .recording-dialog-content {
461
+ display: flex;
462
+ flex-direction: column;
463
+ align-items: center;
464
+ gap: 16px;
465
+ background-color: rgba(0, 0, 0, 0.9);
466
+ border-radius: 12px;
467
+ padding: 32px 48px;
468
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
469
+ animation: slideUp 0.3s ease;
470
+ }
471
+ .recording-icon {
472
+ width: 80px;
473
+ height: 80px;
474
+ border-radius: 50%;
475
+ background-color: #ff4d4f;
476
+ display: flex;
477
+ align-items: center;
478
+ justify-content: center;
479
+ animation: pulse 1.5s infinite;
480
+ transition: all 0.2s;
481
+ }
482
+ .recording-icon i {
483
+ font-size: 40px;
484
+ color: #fff;
485
+ }
486
+ .recording-icon.cancel-mode {
487
+ background-color: #ff7875;
488
+ transform: scale(1.1);
489
+ }
490
+ .recording-icon.voice-to-text-mode {
491
+ background-color: #1890ff;
492
+ transform: scale(1.1);
493
+ }
494
+ .recording-time {
495
+ font-size: 32px;
496
+ font-weight: 600;
497
+ color: #fff;
498
+ font-variant-numeric: tabular-nums;
499
+ }
500
+ .recording-hints {
501
+ display: flex;
502
+ gap: 40px;
503
+ margin-top: 12px;
504
+ }
505
+ .hint-item {
506
+ display: flex;
507
+ flex-direction: column;
508
+ align-items: center;
509
+ gap: 8px;
510
+ color: rgba(255, 255, 255, 0.5);
511
+ transition: all 0.2s;
512
+ }
513
+ .hint-item i {
514
+ font-size: 24px;
515
+ }
516
+ .hint-item span {
517
+ font-size: 12px;
518
+ font-weight: 500;
519
+ color: rgba(255, 255, 255, 0.6);
520
+ }
521
+ .hint-item.active {
522
+ color: #fff;
523
+ transform: scale(1.1);
524
+ }
525
+ .hint-item.active i {
526
+ animation: bounce 0.6s ease-in-out infinite;
527
+ color: #1890ff;
528
+ text-shadow: 0 0 10px rgba(24, 144, 255, 0.8);
529
+ }
530
+ .input-container {
531
+ flex: 1;
532
+ display: flex;
533
+ flex-direction: column;
534
+ min-height: 0;
535
+ }
536
+ .message-input {
537
+ flex: 1;
538
+ width: 100%;
539
+ min-height: 60px;
540
+ padding: 8px 12px;
541
+ border: 1px solid #d9d9d9;
542
+ border-radius: 4px;
543
+ font-size: 14px;
544
+ line-height: 1.6;
545
+ resize: none;
546
+ font-family: inherit;
547
+ transition: border-color 0.2s;
548
+ }
549
+ .message-input:focus {
550
+ outline: none;
551
+ border-color: #1890ff;
552
+ box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.1);
553
+ }
554
+ .send-btn-wrapper {
555
+ display: flex;
556
+ gap: 8px;
557
+ }
558
+ .send-btn {
559
+ display: flex;
560
+ align-items: center;
561
+ gap: 6px;
562
+ padding: 8px 20px;
563
+ background-color: #1890ff;
564
+ color: #fff;
565
+ border: none;
566
+ border-radius: 4px;
567
+ font-size: 14px;
568
+ cursor: pointer;
569
+ transition: background-color 0.2s;
570
+ }
571
+ .send-btn:hover:not(:disabled) {
572
+ background-color: #40a9ff;
573
+ }
574
+ .send-btn:disabled {
575
+ background-color: #d9d9d9;
576
+ cursor: not-allowed;
577
+ }
578
+ .send-btn i {
579
+ font-size: 16px;
580
+ }
581
+ /* 表情选择器 */
582
+ .emoji-picker {
583
+ position: absolute;
584
+ bottom: 200px;
585
+ left: 16px;
586
+ background-color: #fff;
587
+ border: 1px solid #e5e5e5;
588
+ border-radius: 8px;
589
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
590
+ padding: 12px;
591
+ z-index: 1000;
592
+ width: 380px;
593
+ }
594
+ .emoji-list {
595
+ display: grid;
596
+ grid-template-columns: repeat(12, 1fr);
597
+ gap: 4px;
598
+ max-height: none;
599
+ overflow: visible;
600
+ }
601
+ .emoji-item {
602
+ font-size: 20px;
603
+ cursor: pointer;
604
+ text-align: center;
605
+ padding: 0;
606
+ border-radius: 4px;
607
+ transition: all 0.2s;
608
+ line-height: 1;
609
+ user-select: none;
610
+ width: 28px;
611
+ height: 28px;
612
+ display: flex;
613
+ align-items: center;
614
+ justify-content: center;
615
+ }
616
+ .emoji-item:hover {
617
+ background-color: #f5f5f5;
618
+ transform: scale(1.15);
619
+ }
620
+ /* 上下文菜单 */
621
+ .context-menu {
622
+ position: fixed;
623
+ background-color: #fff;
624
+ border: 1px solid #e5e5e5;
625
+ border-radius: 6px;
626
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
627
+ padding: 4px 0;
628
+ z-index: 1000;
629
+ min-width: 120px;
630
+ }
631
+ .context-menu-item {
632
+ display: flex;
633
+ align-items: center;
634
+ gap: 8px;
635
+ padding: 8px 16px;
636
+ cursor: pointer;
637
+ transition: background-color 0.2s;
638
+ }
639
+ .context-menu-item:hover {
640
+ background-color: #f5f5f5;
641
+ }
642
+ .context-menu-item i {
643
+ font-size: 16px;
644
+ color: #666;
645
+ }
646
+ .context-menu-item span {
647
+ font-size: 14px;
648
+ color: #333;
649
+ }
650
+ /* 移动端适配 */
651
+ .im-container--mobile {
652
+ font-size: 14px;
653
+ }
654
+ .im-container--mobile .header {
655
+ padding: 10px 12px;
656
+ }
657
+ .im-container--mobile .user-name {
658
+ font-size: 15px;
659
+ }
660
+ .im-container--mobile .chatList {
661
+ padding: 12px;
662
+ }
663
+ .im-container--mobile .chatList-avatar {
664
+ width: 36px;
665
+ height: 36px;
666
+ }
667
+ .im-container--mobile .chatList-avatar--placeholder {
668
+ width: 36px;
669
+ height: 36px;
670
+ }
671
+ .im-container--mobile .chatList-text {
672
+ font-size: 15px;
673
+ }
674
+ .im-container--mobile .toolBox {
675
+ padding: 6px 12px;
676
+ }
677
+ .im-container--mobile .tool-icon {
678
+ font-size: 22px;
679
+ }
680
+ .im-container--mobile .input-container {
681
+ padding: 10px 12px;
682
+ }
683
+ .im-container--mobile .message-input {
684
+ font-size: 15px;
685
+ }
686
+ .im-container--mobile .send-btn {
687
+ padding: 6px 16px;
688
+ font-size: 15px;
689
+ }
690
+ /* 响应式 */
691
+ @media (max-width: 768px) {
692
+ .chatList-content {
693
+ max-width: 75%;
694
+ }
695
+ .emoji-picker {
696
+ left: 50%;
697
+ transform: translateX(-50%);
698
+ max-width: 90%;
699
+ }
700
+ .emoji-list {
701
+ grid-template-columns: repeat(10, 1fr);
702
+ }
703
+ .emoji-item {
704
+ font-size: 18px;
705
+ width: 26px;
706
+ height: 26px;
707
+ }
708
+ }
709
+ /* 表情选择器 */
710
+ .emoji-picker {
711
+ position: absolute;
712
+ bottom: 200px;
713
+ left: 16px;
714
+ background-color: #fff;
715
+ border: 1px solid #e5e5e5;
716
+ border-radius: 8px;
717
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
718
+ padding: 0;
719
+ z-index: 1000;
720
+ width: 420px;
721
+ }
722
+ /* 表情分类标签 */
723
+ .emoji-tabs {
724
+ display: flex;
725
+ border-bottom: 1px solid #e5e5e5;
726
+ padding: 8px 12px;
727
+ gap: 4px;
728
+ background-color: #fafafa;
729
+ border-radius: 8px 8px 0 0;
730
+ }
731
+ .emoji-tab {
732
+ width: 36px;
733
+ height: 36px;
734
+ display: flex;
735
+ align-items: center;
736
+ justify-content: center;
737
+ font-size: 20px;
738
+ cursor: pointer;
739
+ border-radius: 6px;
740
+ transition: all 0.2s;
741
+ user-select: none;
742
+ }
743
+ .emoji-tab:hover {
744
+ background-color: #f0f0f0;
745
+ }
746
+ .emoji-tab.active {
747
+ background-color: #e6f7ff;
748
+ border: 1px solid #91d5ff;
749
+ }
750
+ .emoji-list {
751
+ display: grid;
752
+ grid-template-columns: repeat(12, 1fr);
753
+ gap: 4px;
754
+ padding: 12px;
755
+ }
756
+ .emoji-item {
757
+ cursor: pointer;
758
+ text-align: center;
759
+ padding: 0;
760
+ border-radius: 4px;
761
+ transition: all 0.2s;
762
+ line-height: 1;
763
+ user-select: none;
764
+ width: 28px;
765
+ height: 28px;
766
+ display: flex;
767
+ align-items: center;
768
+ justify-content: center;
769
+ }
770
+ .emoji-item img {
771
+ width: 24px;
772
+ height: 24px;
773
+ object-fit: contain;
774
+ }
775
+ .emoji-item:hover {
776
+ background-color: #f5f5f5;
777
+ transform: scale(1.15);
778
+ }
779
+ /* 消息中的表情图片 */
780
+ .emoji-img {
781
+ width: 20px;
782
+ height: 20px;
783
+ vertical-align: middle;
784
+ margin: 0 2px;
785
+ }
786
+ /* 收藏对话框 */
787
+ .favorite-dialog-overlay {
788
+ position: fixed;
789
+ top: 0;
790
+ left: 0;
791
+ right: 0;
792
+ bottom: 0;
793
+ background-color: rgba(0, 0, 0, 0.5);
794
+ display: flex;
795
+ align-items: center;
796
+ justify-content: center;
797
+ z-index: 2000;
798
+ animation: fadeIn 0.2s ease;
799
+ }
800
+ @keyframes fadeIn {
801
+ from {
802
+ opacity: 0;
803
+ }
804
+ to {
805
+ opacity: 1;
806
+ }
807
+ }
808
+ .favorite-dialog {
809
+ background-color: #fff;
810
+ border-radius: 12px;
811
+ width: 90%;
812
+ max-width: 400px;
813
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
814
+ animation: slideUp 0.3s ease;
815
+ }
816
+ @keyframes slideUp {
817
+ from {
818
+ transform: translateY(20px);
819
+ opacity: 0;
820
+ }
821
+ to {
822
+ transform: translateY(0);
823
+ opacity: 1;
824
+ }
825
+ }
826
+ .favorite-dialog-header {
827
+ display: flex;
828
+ align-items: center;
829
+ justify-content: space-between;
830
+ padding: 16px 20px;
831
+ border-bottom: 1px solid #e5e5e5;
832
+ }
833
+ .favorite-dialog-title {
834
+ font-size: 16px;
835
+ font-weight: 600;
836
+ color: #333;
837
+ }
838
+ .favorite-dialog-close {
839
+ font-size: 20px;
840
+ color: #999;
841
+ cursor: pointer;
842
+ transition: color 0.2s;
843
+ }
844
+ .favorite-dialog-close:hover {
845
+ color: #333;
846
+ }
847
+ .favorite-dialog-content {
848
+ padding: 20px;
849
+ max-height: 400px;
850
+ overflow-y: auto;
851
+ }
852
+ .favorite-default-content {
853
+ display: flex;
854
+ flex-direction: column;
855
+ gap: 16px;
856
+ }
857
+ .favorite-message-preview {
858
+ background-color: #f5f5f5;
859
+ border-radius: 8px;
860
+ padding: 12px;
861
+ }
862
+ .favorite-message-type {
863
+ display: flex;
864
+ align-items: center;
865
+ gap: 6px;
866
+ margin-bottom: 8px;
867
+ color: #666;
868
+ font-size: 13px;
869
+ }
870
+ .favorite-message-type i {
871
+ font-size: 16px;
872
+ }
873
+ .favorite-message-text {
874
+ color: #333;
875
+ font-size: 14px;
876
+ line-height: 1.6;
877
+ word-wrap: break-word;
878
+ }
879
+ .favorite-message-image {
880
+ max-width: 100%;
881
+ }
882
+ .favorite-message-image img {
883
+ max-width: 100%;
884
+ max-height: 200px;
885
+ border-radius: 4px;
886
+ object-fit: contain;
887
+ }
888
+ .favorite-note-input {
889
+ width: 100%;
890
+ padding: 10px;
891
+ border: 1px solid #e5e5e5;
892
+ border-radius: 6px;
893
+ font-size: 14px;
894
+ line-height: 1.6;
895
+ resize: vertical;
896
+ font-family: inherit;
897
+ transition: border-color 0.2s;
898
+ }
899
+ .favorite-note-input:focus {
900
+ outline: none;
901
+ border-color: #1890ff;
902
+ }
903
+ .favorite-dialog-footer {
904
+ display: flex;
905
+ gap: 12px;
906
+ padding: 16px 20px;
907
+ border-top: 1px solid #e5e5e5;
908
+ }
909
+ .favorite-btn {
910
+ flex: 1;
911
+ padding: 10px 20px;
912
+ border: none;
913
+ border-radius: 6px;
914
+ font-size: 14px;
915
+ cursor: pointer;
916
+ transition: all 0.2s;
917
+ }
918
+ .favorite-btn-cancel {
919
+ background-color: #f5f5f5;
920
+ color: #666;
921
+ }
922
+ .favorite-btn-cancel:hover {
923
+ background-color: #e5e5e5;
924
+ }
925
+ .favorite-btn-confirm {
926
+ background-color: #1890ff;
927
+ color: #fff;
928
+ }
929
+ .favorite-btn-confirm:hover {
930
+ background-color: #40a9ff;
931
+ }
932
+ .favorite-btn-confirm:active {
933
+ background-color: #096dd9;
934
+ }
935
+
936
+ /* 收藏列表对话框样式 */
937
+ .favorites-list-dialog-overlay {
938
+ position: fixed;
939
+ top: 0;
940
+ left: 0;
941
+ right: 0;
942
+ bottom: 0;
943
+ background-color: rgba(0, 0, 0, 0.5);
944
+ display: flex;
945
+ align-items: center;
946
+ justify-content: center;
947
+ z-index: 3000;
948
+ animation: fadeIn 0.2s ease;
949
+ }
950
+
951
+ .favorites-list-dialog {
952
+ background-color: #fff;
953
+ border-radius: 12px;
954
+ width: 90%;
955
+ max-width: 600px;
956
+ max-height: 80vh;
957
+ display: flex;
958
+ flex-direction: column;
959
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
960
+ animation: slideUp 0.3s ease;
961
+ }
962
+
963
+ .favorites-list-header {
964
+ display: flex;
965
+ align-items: center;
966
+ justify-content: space-between;
967
+ padding: 16px 20px;
968
+ border-bottom: 1px solid #e5e5e5;
969
+ }
970
+
971
+ .favorites-list-title {
972
+ font-size: 16px;
973
+ font-weight: 600;
974
+ color: #333;
975
+ }
976
+
977
+ .favorites-list-close {
978
+ font-size: 20px;
979
+ color: #999;
980
+ cursor: pointer;
981
+ transition: color 0.2s;
982
+ }
983
+
984
+ .favorites-list-close:hover {
985
+ color: #333;
986
+ }
987
+
988
+ .favorites-list-content {
989
+ flex: 1;
990
+ overflow-y: auto;
991
+ padding: 12px 0;
992
+ }
993
+
994
+ .favorites-list-empty {
995
+ display: flex;
996
+ flex-direction: column;
997
+ align-items: center;
998
+ justify-content: center;
999
+ padding: 60px 20px;
1000
+ color: #999;
1001
+ }
1002
+
1003
+ .favorites-list-empty i {
1004
+ font-size: 64px;
1005
+ margin-bottom: 16px;
1006
+ }
1007
+
1008
+ .favorites-list-empty p {
1009
+ font-size: 14px;
1010
+ }
1011
+
1012
+ .favorites-list-items {
1013
+ display: flex;
1014
+ flex-direction: column;
1015
+ }
1016
+
1017
+ .favorites-list-item {
1018
+ display: flex;
1019
+ align-items: center;
1020
+ padding: 12px 20px;
1021
+ cursor: pointer;
1022
+ transition: background-color 0.2s;
1023
+ border-bottom: 1px solid #f0f0f0;
1024
+ }
1025
+
1026
+ .favorites-list-item:hover {
1027
+ background-color: #f5f7fa;
1028
+ }
1029
+
1030
+ .favorites-list-item:last-child {
1031
+ border-bottom: none;
1032
+ }
1033
+
1034
+ .favorite-item-icon {
1035
+ font-size: 24px;
1036
+ color: #1890ff;
1037
+ margin-right: 12px;
1038
+ flex-shrink: 0;
1039
+ }
1040
+
1041
+ .favorite-item-content {
1042
+ flex: 1;
1043
+ min-width: 0;
1044
+ }
1045
+
1046
+ .favorite-item-title {
1047
+ font-size: 15px;
1048
+ font-weight: 500;
1049
+ color: #333;
1050
+ margin-bottom: 4px;
1051
+ overflow: hidden;
1052
+ text-overflow: ellipsis;
1053
+ white-space: nowrap;
1054
+ }
1055
+
1056
+ .favorite-item-preview {
1057
+ font-size: 13px;
1058
+ color: #999;
1059
+ overflow: hidden;
1060
+ text-overflow: ellipsis;
1061
+ white-space: nowrap;
1062
+ margin-bottom: 4px;
1063
+ }
1064
+
1065
+ .favorite-item-time {
1066
+ font-size: 12px;
1067
+ color: #bbb;
1068
+ }
1069
+
1070
+ .favorite-item-arrow {
1071
+ font-size: 20px;
1072
+ color: #ccc;
1073
+ margin-left: 12px;
1074
+ flex-shrink: 0;
1075
+ }
1076
+
1077
+ /* @ 提及成员弹窗样式 */
1078
+ .mention-list-container {
1079
+ position: relative;
1080
+ z-index: 99999;
1081
+ pointer-events: auto !important;
1082
+ }
1083
+
1084
+ .mention-item {
1085
+ display: flex;
1086
+ align-items: center;
1087
+ padding: 8px 12px;
1088
+ cursor: pointer;
1089
+ transition: background-color 0.2s;
1090
+ position: relative;
1091
+ z-index: 99999;
1092
+ pointer-events: auto !important;
1093
+ }
1094
+
1095
+ .mention-item:hover,
1096
+ .mention-item-selected {
1097
+ background-color: #f5f5f5;
1098
+ }
1099
+
1100
+ .mention-avatar {
1101
+ width: 36px;
1102
+ height: 36px;
1103
+ border-radius: 4px;
1104
+ margin-right: 10px;
1105
+ flex-shrink: 0;
1106
+ object-fit: cover;
1107
+ }
1108
+
1109
+ .mention-avatar-placeholder {
1110
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
1111
+ color: white;
1112
+ display: flex;
1113
+ align-items: center;
1114
+ justify-content: center;
1115
+ font-size: 16px;
1116
+ font-weight: 500;
1117
+ }
1118
+
1119
+ .mention-info {
1120
+ flex: 1;
1121
+ min-width: 0;
1122
+ overflow: hidden;
1123
+ }
1124
+
1125
+ .mention-name {
1126
+ font-size: 14px;
1127
+ color: #333;
1128
+ font-weight: 500;
1129
+ overflow: hidden;
1130
+ text-overflow: ellipsis;
1131
+ white-space: nowrap;
1132
+ margin-bottom: 2px;
1133
+ }
1134
+
1135
+ .mention-account {
1136
+ font-size: 12px;
1137
+ color: #999;
1138
+ overflow: hidden;
1139
+ text-overflow: ellipsis;
1140
+ white-space: nowrap;
1141
+ }
1142
+
1143
+ /* 文件消息样式 */
1144
+ .chatList__msg--file {
1145
+ display: flex;
1146
+ align-items: center;
1147
+ gap: 12px;
1148
+ padding: 12px;
1149
+ background-color: #f5f5f5;
1150
+ border-radius: 6px;
1151
+ min-width: 200px;
1152
+ cursor: pointer;
1153
+ transition: background-color 0.2s;
1154
+ }
1155
+ .chatList__msg--file:hover {
1156
+ background-color: #e5e5e5;
1157
+ }
1158
+ .file-icon {
1159
+ font-size: 32px;
1160
+ color: #1890ff;
1161
+ flex-shrink: 0;
1162
+ }
1163
+ .file-info {
1164
+ flex: 1;
1165
+ min-width: 0;
1166
+ }
1167
+ .file-name {
1168
+ font-size: 14px;
1169
+ color: #333;
1170
+ font-weight: 500;
1171
+ overflow: hidden;
1172
+ text-overflow: ellipsis;
1173
+ white-space: nowrap;
1174
+ margin-bottom: 4px;
1175
+ }
1176
+ .file-size {
1177
+ font-size: 12px;
1178
+ color: #999;
1179
+ }
1180
+ /* 自己消息的布局 - 头像在右侧,内容右对齐 */
1181
+ .chatList-item--mine .chatList-content {
1182
+ display: flex;
1183
+ flex-direction: column;
1184
+ align-items: flex-end;
1185
+ }
1186
+ .chatList-item--mine .chatList-text {
1187
+ text-align: left;
1188
+ }
1189
+ .input-wrapper {
1190
+ position: relative;
1191
+ flex:1;
1192
+ transition: border-color 0.2s;
1193
+ }
1194
+ .input-wrapper:focus-within {
1195
+ border-color: #0067CC;
1196
+ background: #fff;
1197
+ }
1198
+ .message-input {
1199
+ width: 100%;
1200
+ max-height: 360px;
1201
+ padding: 12px 100px 12px 12px;
1202
+ border: none;
1203
+ outline: none;
1204
+ background: transparent;
1205
+ font-size: 14px;
1206
+ line-height: 1.6;
1207
+ resize: vertical;
1208
+ font-family: inherit;
1209
+ }
1210
+ .message-input::placeholder {
1211
+ color: #999;
1212
+ }
1213
+ .input-actions {
1214
+ position: absolute;
1215
+ right: 8px;
1216
+ bottom: 30px;
1217
+ display: flex;
1218
+ gap: 4px;
1219
+ align-items: center;
1220
+ }
1221
+ .send-options-btn {
1222
+ width: 32px;
1223
+ height: 32px;
1224
+ border: none;
1225
+ background: transparent;
1226
+ color: #666;
1227
+ border-radius: 4px;
1228
+ cursor: pointer;
1229
+ display: flex;
1230
+ align-items: center;
1231
+ justify-content: center;
1232
+ font-size: 18px;
1233
+ transition: all 0.2s;
1234
+ }
1235
+ .send-options-btn:hover:not(:disabled) {
1236
+ background: #e8e8e8;
1237
+ color: #333;
1238
+ }
1239
+ .send-options-btn:disabled {
1240
+ opacity: 0.4;
1241
+ cursor: not-allowed;
1242
+ }
1243
+ .send-btn {
1244
+ height: 32px;
1245
+ padding: 0 16px;
1246
+ border: none;
1247
+ background: #0067CC;
1248
+ color: white;
1249
+ border-radius: 4px;
1250
+ cursor: pointer;
1251
+ display: flex;
1252
+ align-items: center;
1253
+ gap: 4px;
1254
+ font-size: 14px;
1255
+ font-weight: 500;
1256
+ transition: all 0.2s;
1257
+ }
1258
+ .send-btn:hover:not(:disabled) {
1259
+ background: #0052A3;
1260
+ transform: translateY(-1px);
1261
+ box-shadow: 0 2px 8px rgba(0, 103, 204, 0.3);
1262
+ }
1263
+ .send-btn:active:not(:disabled) {
1264
+ transform: translateY(0);
1265
+ }
1266
+ .send-btn:disabled {
1267
+ opacity: 0.5;
1268
+ cursor: not-allowed;
1269
+ }
1270
+ .send-btn i {
1271
+ font-size: 16px;
1272
+ }
1273
+ /* 发送选项下拉菜单 */
1274
+ .send-options-menu {
1275
+ position: absolute;
1276
+ right: 12px;
1277
+ bottom: 100%;
1278
+ margin-bottom: 8px;
1279
+ background: white;
1280
+ border-radius: 8px;
1281
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
1282
+ min-width: 160px;
1283
+ padding: 8px 0;
1284
+ z-index: 1000;
1285
+ animation: slideUp 0.2s ease;
1286
+ }
1287
+ @keyframes slideUp {
1288
+ from {
1289
+ opacity: 0;
1290
+ transform: translateY(10px);
1291
+ }
1292
+ to {
1293
+ opacity: 1;
1294
+ transform: translateY(0);
1295
+ }
1296
+ }
1297
+ .send-option-item {
1298
+ display: flex;
1299
+ align-items: center;
1300
+ gap: 12px;
1301
+ padding: 10px 16px;
1302
+ cursor: pointer;
1303
+ transition: background 0.2s;
1304
+ color: #333;
1305
+ font-size: 14px;
1306
+ }
1307
+ .send-option-item:hover {
1308
+ background: #f5f5f5;
1309
+ }
1310
+ .send-option-item i {
1311
+ font-size: 18px;
1312
+ color: #666;
1313
+ width: 20px;
1314
+ text-align: center;
1315
+ }
1316
+ .send-option-item:hover i {
1317
+ color: #0067CC;
1318
+ }
1319
+ /* 特殊选项颜色 */
1320
+ .send-option-item:has(.ri-fire-line):hover {
1321
+ background: #fff3f3;
1322
+ }
1323
+ .send-option-item:has(.ri-fire-line):hover i {
1324
+ color: #ff4757;
1325
+ }
1326
+ .send-option-item:has(.ri-alarm-warning-line):hover {
1327
+ background: #fff8e6;
1328
+ }
1329
+ .send-option-item:has(.ri-alarm-warning-line):hover i {
1330
+ color: #ff9800;
1331
+ }
1332
+ /* 移动端适配 */
1333
+ @media (max-width: 768px) {
1334
+ .message-input {
1335
+ padding: 10px 90px 10px 10px;
1336
+ min-height: 60px;
1337
+ }
1338
+ .send-btn {
1339
+ padding: 0 12px;
1340
+ font-size: 13px;
1341
+ }
1342
+ .send-options-menu {
1343
+ right: 8px;
1344
+ }
1345
+ }
1346
+ /* 延时发送消息列表 */
1347
+ .scheduled-messages {
1348
+ margin-top: 12px;
1349
+ background: #fff9e6;
1350
+ border: 1px solid #ffe58f;
1351
+ border-radius: 8px;
1352
+ padding: 12px;
1353
+ max-height: 200px;
1354
+ overflow-y: auto;
1355
+ }
1356
+ .scheduled-messages-header {
1357
+ display: flex;
1358
+ align-items: center;
1359
+ gap: 8px;
1360
+ margin-bottom: 12px;
1361
+ color: #d48806;
1362
+ font-size: 14px;
1363
+ font-weight: 500;
1364
+ }
1365
+ .scheduled-messages-header i {
1366
+ font-size: 16px;
1367
+ }
1368
+ .scheduled-message-item {
1369
+ display: flex;
1370
+ align-items: flex-start;
1371
+ gap: 12px;
1372
+ padding: 10px;
1373
+ background: white;
1374
+ border-radius: 6px;
1375
+ margin-bottom: 8px;
1376
+ border: 1px solid #ffe58f;
1377
+ transition: all 0.2s;
1378
+ }
1379
+ .scheduled-message-item:last-child {
1380
+ margin-bottom: 0;
1381
+ }
1382
+ .scheduled-message-item:hover {
1383
+ border-color: #ffc53d;
1384
+ box-shadow: 0 2px 8px rgba(250, 173, 20, 0.15);
1385
+ }
1386
+ .scheduled-message-content {
1387
+ flex: 1;
1388
+ min-width: 0;
1389
+ }
1390
+ .scheduled-message-text {
1391
+ color: #333;
1392
+ font-size: 14px;
1393
+ line-height: 1.5;
1394
+ margin-bottom: 6px;
1395
+ word-break: break-word;
1396
+ }
1397
+ .scheduled-message-time {
1398
+ display: flex;
1399
+ align-items: center;
1400
+ gap: 4px;
1401
+ color: #d48806;
1402
+ font-size: 12px;
1403
+ }
1404
+ .scheduled-message-time i {
1405
+ font-size: 14px;
1406
+ }
1407
+ .scheduled-message-actions {
1408
+ display: flex;
1409
+ gap: 4px;
1410
+ flex-shrink: 0;
1411
+ }
1412
+ .scheduled-action-btn {
1413
+ width: 28px;
1414
+ height: 28px;
1415
+ border: none;
1416
+ background: transparent;
1417
+ border-radius: 4px;
1418
+ cursor: pointer;
1419
+ display: flex;
1420
+ align-items: center;
1421
+ justify-content: center;
1422
+ font-size: 16px;
1423
+ transition: all 0.2s;
1424
+ color: #666;
1425
+ }
1426
+ .scheduled-action-btn:hover {
1427
+ background: #f5f5f5;
1428
+ }
1429
+ .edit-btn:hover {
1430
+ color: #0067CC;
1431
+ background: #e6f7ff;
1432
+ }
1433
+ .cancel-btn:hover {
1434
+ color: #ff4d4f;
1435
+ background: #fff1f0;
1436
+ }
1437
+ /* 延时消息动画 */
1438
+ @keyframes slideIn {
1439
+ from {
1440
+ opacity: 0;
1441
+ transform: translateY(-10px);
1442
+ }
1443
+ to {
1444
+ opacity: 1;
1445
+ transform: translateY(0);
1446
+ }
1447
+ }
1448
+ .scheduled-message-item {
1449
+ animation: slideIn 0.3s ease;
1450
+ }
1451
+ /* ==================== 消息模板样式 ==================== */
1452
+ /* 模板对话框遮罩 */
1453
+ .template-dialog-overlay {
1454
+ position: fixed;
1455
+ top: 0;
1456
+ left: 0;
1457
+ width: 100vw;
1458
+ height: 100vh;
1459
+ background: rgba(0, 0, 0, 0.5);
1460
+ display: flex;
1461
+ align-items: center;
1462
+ justify-content: center;
1463
+ z-index: 2000;
1464
+ backdrop-filter: blur(4px);
1465
+ }
1466
+ /* 模板对话框 */
1467
+ .template-dialog {
1468
+ background: white;
1469
+ border-radius: 12px;
1470
+ width: 90%;
1471
+ max-width: 600px;
1472
+ max-height: 80vh;
1473
+ overflow: hidden;
1474
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
1475
+ animation: slideUp 0.3s ease;
1476
+ display: flex;
1477
+ flex-direction: column;
1478
+ }
1479
+ /* 模板对话框头部 */
1480
+ .template-dialog-header {
1481
+ display: flex;
1482
+ align-items: center;
1483
+ justify-content: space-between;
1484
+ padding: 16px 20px;
1485
+ background: #0067CC;
1486
+ color: white;
1487
+ font-weight: 500;
1488
+ flex-shrink: 0;
1489
+ }
1490
+ .template-header-actions {
1491
+ display: flex;
1492
+ gap: 12px;
1493
+ }
1494
+ .template-header-actions i {
1495
+ font-size: 20px;
1496
+ cursor: pointer;
1497
+ padding: 4px;
1498
+ border-radius: 4px;
1499
+ transition: background 0.2s;
1500
+ }
1501
+ .template-header-actions i:hover {
1502
+ background: rgba(255, 255, 255, 0.2);
1503
+ }
1504
+ /* 模板对话框主体 */
1505
+ .template-dialog-body {
1506
+ padding: 20px;
1507
+ overflow-y: auto;
1508
+ flex: 1;
1509
+ }
1510
+ /* 模板过滤器 */
1511
+ .template-filters {
1512
+ margin-bottom: 20px;
1513
+ }
1514
+ .template-search {
1515
+ width: 100%;
1516
+ padding: 10px 12px;
1517
+ border: 2px solid #e0e0e0;
1518
+ border-radius: 8px;
1519
+ font-size: 14px;
1520
+ outline: none;
1521
+ transition: border-color 0.2s;
1522
+ margin-bottom: 12px;
1523
+ }
1524
+ .template-search:focus {
1525
+ border-color: #0067CC;
1526
+ }
1527
+ .template-categories {
1528
+ display: flex;
1529
+ gap: 8px;
1530
+ flex-wrap: wrap;
1531
+ }
1532
+ .category-btn {
1533
+ padding: 8px 16px;
1534
+ border: 2px solid #e0e0e0;
1535
+ background: white;
1536
+ color: #666;
1537
+ border-radius: 20px;
1538
+ cursor: pointer;
1539
+ font-size: 14px;
1540
+ font-weight: 500;
1541
+ transition: all 0.2s;
1542
+ white-space: nowrap;
1543
+ }
1544
+ .category-btn:hover {
1545
+ border-color: #0067CC;
1546
+ color: #0067CC;
1547
+ }
1548
+ .category-btn.active {
1549
+ border-color: #0067CC;
1550
+ background: #0067CC;
1551
+ color: white;
1552
+ }
1553
+ /* 模板列表 */
1554
+ .template-list {
1555
+ display: flex;
1556
+ flex-direction: column;
1557
+ gap: 12px;
1558
+ }
1559
+ .template-item {
1560
+ display: flex;
1561
+ gap: 12px;
1562
+ padding: 16px;
1563
+ border: 2px solid #e0e0e0;
1564
+ border-radius: 8px;
1565
+ transition: all 0.2s;
1566
+ }
1567
+ .template-item:hover {
1568
+ border-color: #0067CC;
1569
+ box-shadow: 0 2px 8px rgba(0, 103, 204, 0.1);
1570
+ }
1571
+ .template-content {
1572
+ flex: 1;
1573
+ cursor: pointer;
1574
+ }
1575
+ .template-name {
1576
+ font-weight: 600;
1577
+ color: #333;
1578
+ margin-bottom: 8px;
1579
+ font-size: 15px;
1580
+ }
1581
+ .template-preview {
1582
+ color: #666;
1583
+ font-size: 14px;
1584
+ line-height: 1.5;
1585
+ margin-bottom: 8px;
1586
+ display: -webkit-box;
1587
+ -webkit-line-clamp: 2;
1588
+ -webkit-box-orient: vertical;
1589
+ overflow: hidden;
1590
+ white-space: pre-wrap;
1591
+ }
1592
+ .template-meta {
1593
+ display: flex;
1594
+ gap: 12px;
1595
+ font-size: 12px;
1596
+ color: #999;
1597
+ }
1598
+ .template-category {
1599
+ color: #0067CC;
1600
+ }
1601
+ .template-actions {
1602
+ display: flex;
1603
+ flex-direction: column;
1604
+ gap: 8px;
1605
+ justify-content: center;
1606
+ }
1607
+ .template-actions i {
1608
+ font-size: 18px;
1609
+ padding: 8px;
1610
+ border-radius: 4px;
1611
+ cursor: pointer;
1612
+ transition: all 0.2s;
1613
+ color: #666;
1614
+ }
1615
+ .template-actions i:hover {
1616
+ background: #f5f5f5;
1617
+ color: #0067CC;
1618
+ }
1619
+ .template-actions .ri-delete-bin-line:hover {
1620
+ color: #ff4444;
1621
+ }
1622
+ /* 模板为空 */
1623
+ .template-empty {
1624
+ text-align: center;
1625
+ padding: 60px 20px;
1626
+ color: #999;
1627
+ }
1628
+ .template-empty i {
1629
+ font-size: 64px;
1630
+ color: #ddd;
1631
+ margin-bottom: 16px;
1632
+ }
1633
+ .template-empty p {
1634
+ font-size: 16px;
1635
+ margin-bottom: 20px;
1636
+ }
1637
+ .add-template-btn {
1638
+ padding: 10px 24px;
1639
+ background: #0067CC;
1640
+ color: white;
1641
+ border: none;
1642
+ border-radius: 8px;
1643
+ font-size: 14px;
1644
+ font-weight: 500;
1645
+ cursor: pointer;
1646
+ transition: all 0.2s;
1647
+ }
1648
+ .add-template-btn:hover {
1649
+ background: #0052A3;
1650
+ transform: translateY(-1px);
1651
+ box-shadow: 0 4px 12px rgba(0, 103, 204, 0.3);
1652
+ }
1653
+ /* 模板编辑器遮罩 */
1654
+ .template-editor-overlay {
1655
+ position: fixed;
1656
+ top: 0;
1657
+ left: 0;
1658
+ width: 100vw;
1659
+ height: 100vh;
1660
+ background: rgba(0, 0, 0, 0.5);
1661
+ display: flex;
1662
+ align-items: center;
1663
+ justify-content: center;
1664
+ z-index: 2100;
1665
+ backdrop-filter: blur(4px);
1666
+ }
1667
+ /* 模板编辑器 */
1668
+ .template-editor {
1669
+ background: white;
1670
+ border-radius: 12px;
1671
+ width: 90%;
1672
+ max-width: 500px;
1673
+ max-height: 80vh;
1674
+ overflow: hidden;
1675
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
1676
+ animation: slideUp 0.3s ease;
1677
+ display: flex;
1678
+ flex-direction: column;
1679
+ }
1680
+ .template-editor-header {
1681
+ display: flex;
1682
+ align-items: center;
1683
+ justify-content: space-between;
1684
+ padding: 16px 20px;
1685
+ background: #0067CC;
1686
+ color: white;
1687
+ font-weight: 500;
1688
+ flex-shrink: 0;
1689
+ }
1690
+ .template-editor-header i {
1691
+ font-size: 20px;
1692
+ cursor: pointer;
1693
+ padding: 4px;
1694
+ border-radius: 4px;
1695
+ transition: background 0.2s;
1696
+ }
1697
+ .template-editor-header i:hover {
1698
+ background: rgba(255, 255, 255, 0.2);
1699
+ }
1700
+ .template-editor-body {
1701
+ padding: 20px;
1702
+ overflow-y: auto;
1703
+ flex: 1;
1704
+ }
1705
+ .form-group {
1706
+ margin-bottom: 20px;
1707
+ }
1708
+ .form-group label {
1709
+ display: block;
1710
+ font-weight: 500;
1711
+ color: #333;
1712
+ margin-bottom: 8px;
1713
+ font-size: 14px;
1714
+ }
1715
+ .form-input {
1716
+ width: 100%;
1717
+ padding: 10px 12px;
1718
+ border: 2px solid #e0e0e0;
1719
+ border-radius: 8px;
1720
+ font-size: 14px;
1721
+ outline: none;
1722
+ transition: border-color 0.2s;
1723
+ }
1724
+ .form-input:focus {
1725
+ border-color: #0067CC;
1726
+ }
1727
+ .category-selector {
1728
+ display: flex;
1729
+ gap: 8px;
1730
+ flex-wrap: wrap;
1731
+ }
1732
+ .category-option {
1733
+ padding: 8px 16px;
1734
+ border: 2px solid #e0e0e0;
1735
+ background: white;
1736
+ color: #666;
1737
+ border-radius: 20px;
1738
+ cursor: pointer;
1739
+ font-size: 14px;
1740
+ font-weight: 500;
1741
+ transition: all 0.2s;
1742
+ }
1743
+ .category-option:hover {
1744
+ border-color: #0067CC;
1745
+ color: #0067CC;
1746
+ }
1747
+ .category-option.active {
1748
+ border-color: #0067CC;
1749
+ background: #0067CC;
1750
+ color: white;
1751
+ }
1752
+ .form-textarea {
1753
+ width: 100%;
1754
+ padding: 12px;
1755
+ border: 2px solid #e0e0e0;
1756
+ border-radius: 8px;
1757
+ font-size: 14px;
1758
+ line-height: 1.6;
1759
+ resize: vertical;
1760
+ outline: none;
1761
+ transition: border-color 0.2s;
1762
+ font-family: inherit;
1763
+ min-height: 120px;
1764
+ }
1765
+ .form-textarea:focus {
1766
+ border-color: #0067CC;
1767
+ }
1768
+ .variable-hint {
1769
+ display: flex;
1770
+ align-items: center;
1771
+ gap: 8px;
1772
+ padding: 12px;
1773
+ background: #f0f7ff;
1774
+ border-radius: 8px;
1775
+ color: #0067CC;
1776
+ font-size: 13px;
1777
+ }
1778
+ .variable-hint i {
1779
+ font-size: 16px;
1780
+ }
1781
+ .template-editor-footer {
1782
+ display: flex;
1783
+ gap: 12px;
1784
+ padding: 16px 20px;
1785
+ background: #f8f9fa;
1786
+ border-top: 1px solid #e9ecef;
1787
+ flex-shrink: 0;
1788
+ }
1789
+ .btn-cancel,
1790
+ .btn-save {
1791
+ flex: 1;
1792
+ padding: 12px 20px;
1793
+ border: none;
1794
+ border-radius: 8px;
1795
+ font-size: 14px;
1796
+ font-weight: 500;
1797
+ cursor: pointer;
1798
+ transition: all 0.2s;
1799
+ }
1800
+ .btn-cancel {
1801
+ background: #f5f5f5;
1802
+ color: #666;
1803
+ }
1804
+ .btn-cancel:hover {
1805
+ background: #e8e8e8;
1806
+ color: #333;
1807
+ }
1808
+ .btn-save {
1809
+ background: #0067CC;
1810
+ color: white;
1811
+ }
1812
+ .btn-save:hover {
1813
+ background: #0052A3;
1814
+ transform: translateY(-1px);
1815
+ box-shadow: 0 4px 12px rgba(0, 103, 204, 0.3);
1816
+ }
1817
+ /* 移动端适配 */
1818
+ @media (max-width: 768px) {
1819
+ .template-dialog,
1820
+ .template-editor {
1821
+ width: 95%;
1822
+ margin: 0 10px;
1823
+ }
1824
+ .template-dialog-body,
1825
+ .template-editor-body {
1826
+ padding: 16px;
1827
+ }
1828
+ .template-categories {
1829
+ overflow-x: auto;
1830
+ flex-wrap: nowrap;
1831
+ padding-bottom: 8px;
1832
+ }
1833
+ .template-item {
1834
+ flex-direction: column;
1835
+ }
1836
+ .template-actions {
1837
+ flex-direction: row;
1838
+ justify-content: flex-end;
1839
+ }
1840
+ }
1841
+ /* 暗色主题支持 */
1842
+ @media (prefers-color-scheme: dark) {
1843
+ .template-dialog,
1844
+ .template-editor {
1845
+ background: #1a1a1a;
1846
+ color: white;
1847
+ }
1848
+ .template-dialog-body,
1849
+ .template-editor-body {
1850
+ background: #1a1a1a;
1851
+ }
1852
+ .template-search,
1853
+ .form-input,
1854
+ .form-textarea {
1855
+ background: #2a2a2a;
1856
+ border-color: #404040;
1857
+ color: white;
1858
+ }
1859
+ .template-item {
1860
+ border-color: #404040;
1861
+ }
1862
+ .template-name {
1863
+ color: white;
1864
+ }
1865
+ .template-preview {
1866
+ color: #ccc;
1867
+ }
1868
+ .category-btn,
1869
+ .category-option {
1870
+ background: #2a2a2a;
1871
+ border-color: #404040;
1872
+ color: #ccc;
1873
+ }
1874
+ .template-editor-footer {
1875
+ background: #2a2a2a;
1876
+ border-top-color: #404040;
1877
+ }
1878
+ .btn-cancel {
1879
+ background: #404040;
1880
+ color: #ccc;
1881
+ }
1882
+ .variable-hint {
1883
+ background: #1a3a5a;
1884
+ }
1885
+ }
1886
+ /* ==================== 消息模板样式结束 ==================== */
1887
+ /* 发送按钮增强样式 */
1888
+ .input-wrapper {
1889
+ display: flex;
1890
+ gap: 8px;
1891
+ }
1892
+ .message-input {
1893
+ flex: 1;
1894
+ padding: 12px;
1895
+ font-size: 14px;
1896
+ line-height: 1.5;
1897
+ resize: vertical;
1898
+ outline: none;
1899
+ transition: border-color 0.2s;
1900
+ font-family: inherit;
1901
+ }
1902
+ .message-input:focus {
1903
+ border-color: #0067CC;
1904
+ }
1905
+ .input-actions {
1906
+ display: flex;
1907
+ gap: 4px;
1908
+ align-items: flex-end;
1909
+ }
1910
+ .send-options-btn,
1911
+ .send-btn {
1912
+ padding: 10px 12px;
1913
+ border: none;
1914
+ background: #0067CC;
1915
+ color: white;
1916
+ border-radius: 6px;
1917
+ cursor: pointer;
1918
+ font-size: 16px;
1919
+ transition: all 0.2s;
1920
+ display: flex;
1921
+ align-items: center;
1922
+ justify-content: center;
1923
+ min-width: 40px;
1924
+ height: 40px;
1925
+ }
1926
+ .send-options-btn:hover:not(:disabled),
1927
+ .send-btn:hover:not(:disabled) {
1928
+ background: #0052A3;
1929
+ transform: translateY(-1px);
1930
+ box-shadow: 0 4px 12px rgba(0, 103, 204, 0.3);
1931
+ }
1932
+ .send-options-btn:disabled,
1933
+ .send-btn:disabled {
1934
+ opacity: 0.5;
1935
+ cursor: not-allowed;
1936
+ transform: none;
1937
+ }
1938
+ .send-options-btn {
1939
+ position: relative;
1940
+ }
1941
+ .send-options-btn::after {
1942
+ content: '';
1943
+ position: absolute;
1944
+ right: 0;
1945
+ top: 50%;
1946
+ transform: translateY(-50%);
1947
+ width: 1px;
1948
+ height: 20px;
1949
+ background: rgba(255, 255, 255, 0.3);
1950
+ }
1951
+ /* 发送选项菜单 */
1952
+ .send-options-menu {
1953
+ position: absolute;
1954
+ bottom: 100%;
1955
+ right: 0;
1956
+ background: white;
1957
+ border: 1px solid #e0e0e0;
1958
+ border-radius: 8px;
1959
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1960
+ z-index: 100;
1961
+ min-width: 160px;
1962
+ margin-bottom: 8px;
1963
+ animation: slideUp 0.2s ease;
1964
+ }
1965
+ .send-option-item {
1966
+ display: flex;
1967
+ align-items: center;
1968
+ gap: 12px;
1969
+ padding: 12px 16px;
1970
+ cursor: pointer;
1971
+ transition: all 0.2s;
1972
+ color: #333;
1973
+ font-size: 14px;
1974
+ }
1975
+ .send-option-item:hover {
1976
+ background: #f5f5f5;
1977
+ color: #0067CC;
1978
+ }
1979
+ .send-option-item:first-child {
1980
+ border-radius: 8px 8px 0 0;
1981
+ }
1982
+ .send-option-item:last-child {
1983
+ border-radius: 0 0 8px 8px;
1984
+ }
1985
+ .send-option-item i {
1986
+ font-size: 16px;
1987
+ width: 20px;
1988
+ text-align: center;
1989
+ }
1990
+ /* 延时发送消息列表 */
1991
+ .scheduled-messages {
1992
+ margin-top: 12px;
1993
+ padding: 12px;
1994
+ background: #f8f9fa;
1995
+ border-radius: 8px;
1996
+ border: 1px solid #e9ecef;
1997
+ }
1998
+ .scheduled-messages-header {
1999
+ display: flex;
2000
+ align-items: center;
2001
+ gap: 8px;
2002
+ margin-bottom: 12px;
2003
+ font-weight: 500;
2004
+ color: #333;
2005
+ font-size: 14px;
2006
+ }
2007
+ .scheduled-messages-header i {
2008
+ font-size: 16px;
2009
+ color: #0067CC;
2010
+ }
2011
+ .scheduled-message-item {
2012
+ display: flex;
2013
+ align-items: center;
2014
+ justify-content: space-between;
2015
+ padding: 12px;
2016
+ background: white;
2017
+ border-radius: 6px;
2018
+ margin-bottom: 8px;
2019
+ border: 1px solid #e9ecef;
2020
+ transition: all 0.2s;
2021
+ }
2022
+ .scheduled-message-item:hover {
2023
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
2024
+ }
2025
+ .scheduled-message-content {
2026
+ flex: 1;
2027
+ min-width: 0;
2028
+ }
2029
+ .scheduled-message-text {
2030
+ color: #333;
2031
+ font-size: 14px;
2032
+ margin-bottom: 4px;
2033
+ overflow: hidden;
2034
+ text-overflow: ellipsis;
2035
+ white-space: nowrap;
2036
+ }
2037
+ .scheduled-message-time {
2038
+ display: flex;
2039
+ align-items: center;
2040
+ gap: 4px;
2041
+ color: #999;
2042
+ font-size: 12px;
2043
+ }
2044
+ .scheduled-message-time i {
2045
+ font-size: 12px;
2046
+ }
2047
+ .scheduled-message-actions {
2048
+ display: flex;
2049
+ gap: 8px;
2050
+ margin-left: 12px;
2051
+ }
2052
+ .scheduled-action-btn {
2053
+ width: 28px;
2054
+ height: 28px;
2055
+ border: none;
2056
+ background: #f5f5f5;
2057
+ border-radius: 4px;
2058
+ cursor: pointer;
2059
+ font-size: 14px;
2060
+ transition: all 0.2s;
2061
+ display: flex;
2062
+ align-items: center;
2063
+ justify-content: center;
2064
+ color: #666;
2065
+ }
2066
+ .scheduled-action-btn:hover {
2067
+ background: #e8e8e8;
2068
+ color: #333;
2069
+ }
2070
+ .scheduled-action-btn.edit-btn:hover {
2071
+ background: #e6f7ff;
2072
+ color: #0067CC;
2073
+ }
2074
+ .scheduled-action-btn.cancel-btn:hover {
2075
+ background: #fff1f0;
2076
+ color: #ff4d4f;
2077
+ }
2078
+ /* 响应式设计 */
2079
+ @media (max-width: 768px) {
2080
+ .input-wrapper {
2081
+ flex-direction: column;
2082
+ }
2083
+ .message-input {
2084
+ width: 100%;
2085
+ }
2086
+ .input-actions {
2087
+ width: 100%;
2088
+ justify-content: flex-end;
2089
+ }
2090
+ .send-options-btn,
2091
+ .send-btn {
2092
+ flex: 1;
2093
+ }
2094
+ .send-options-menu {
2095
+ position: fixed;
2096
+ bottom: auto;
2097
+ top: 50%;
2098
+ right: 50%;
2099
+ transform: translateX(50%);
2100
+ min-width: 200px;
2101
+ margin-bottom: 0;
2102
+ }
2103
+ .scheduled-messages {
2104
+ margin-top: 8px;
2105
+ padding: 8px;
2106
+ }
2107
+ .scheduled-message-item {
2108
+ flex-direction: column;
2109
+ align-items: flex-start;
2110
+ }
2111
+ .scheduled-message-actions {
2112
+ margin-left: 0;
2113
+ margin-top: 8px;
2114
+ width: 100%;
2115
+ }
2116
+ .scheduled-action-btn {
2117
+ flex: 1;
2118
+ }
2119
+ }
2120
+ /* ==================== 语音转文字对话框样式 ==================== */
2121
+ .voice-to-text-dialog-overlay {
2122
+ position: fixed;
2123
+ top: 0;
2124
+ left: 0;
2125
+ width: 100vw;
2126
+ height: 100vh;
2127
+ background: rgba(0, 0, 0, 0.5);
2128
+ display: flex;
2129
+ align-items: center;
2130
+ justify-content: center;
2131
+ z-index: 2000;
2132
+ backdrop-filter: blur(4px);
2133
+ }
2134
+ .voice-to-text-dialog {
2135
+ background: white;
2136
+ border-radius: 12px;
2137
+ width: 90%;
2138
+ max-width: 500px;
2139
+ max-height: 80vh;
2140
+ overflow: hidden;
2141
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
2142
+ animation: slideUp 0.3s ease;
2143
+ display: flex;
2144
+ flex-direction: column;
2145
+ }
2146
+ .voice-dialog-header {
2147
+ display: flex;
2148
+ align-items: center;
2149
+ justify-content: space-between;
2150
+ padding: 16px 20px;
2151
+ background: #0067CC;
2152
+ color: white;
2153
+ font-weight: 500;
2154
+ flex-shrink: 0;
2155
+ }
2156
+ .voice-dialog-header i {
2157
+ font-size: 20px;
2158
+ cursor: pointer;
2159
+ padding: 4px;
2160
+ border-radius: 4px;
2161
+ transition: background 0.2s;
2162
+ }
2163
+ .voice-dialog-header i:hover {
2164
+ background: rgba(255, 255, 255, 0.2);
2165
+ }
2166
+ .voice-dialog-body {
2167
+ padding: 20px;
2168
+ overflow-y: auto;
2169
+ flex: 1;
2170
+ display: flex;
2171
+ flex-direction: column;
2172
+ gap: 20px;
2173
+ }
2174
+ .voice-recording-status {
2175
+ display: flex;
2176
+ flex-direction: column;
2177
+ align-items: center;
2178
+ gap: 16px;
2179
+ padding: 20px;
2180
+ }
2181
+ .voice-icon-large {
2182
+ width: 80px;
2183
+ height: 80px;
2184
+ border-radius: 50%;
2185
+ background-color: #ff4d4f;
2186
+ display: flex;
2187
+ align-items: center;
2188
+ justify-content: center;
2189
+ animation: pulse 1.5s infinite;
2190
+ }
2191
+ .voice-icon-large i {
2192
+ font-size: 40px;
2193
+ color: #fff;
2194
+ }
2195
+ .voice-waveform {
2196
+ display: flex;
2197
+ align-items: center;
2198
+ justify-content: center;
2199
+ gap: 4px;
2200
+ height: 40px;
2201
+ }
2202
+ .voice-waveform span {
2203
+ width: 4px;
2204
+ background: #0067CC;
2205
+ border-radius: 2px;
2206
+ animation: waveform 0.6s ease-in-out infinite;
2207
+ }
2208
+ .voice-waveform span:nth-child(1) {
2209
+ height: 20px;
2210
+ animation-delay: 0s;
2211
+ }
2212
+ .voice-waveform span:nth-child(2) {
2213
+ height: 30px;
2214
+ animation-delay: 0.1s;
2215
+ }
2216
+ .voice-waveform span:nth-child(3) {
2217
+ height: 40px;
2218
+ animation-delay: 0.2s;
2219
+ }
2220
+ .voice-waveform span:nth-child(4) {
2221
+ height: 30px;
2222
+ animation-delay: 0.3s;
2223
+ }
2224
+ .voice-waveform span:nth-child(5) {
2225
+ height: 20px;
2226
+ animation-delay: 0.4s;
2227
+ }
2228
+ @keyframes waveform {
2229
+ 0%, 100% {
2230
+ transform: scaleY(0.5);
2231
+ }
2232
+ 50% {
2233
+ transform: scaleY(1);
2234
+ }
2235
+ }
2236
+ .voice-time {
2237
+ font-size: 32px;
2238
+ font-weight: 600;
2239
+ color: #333;
2240
+ font-variant-numeric: tabular-nums;
2241
+ }
2242
+ .voice-hint {
2243
+ font-size: 14px;
2244
+ color: #666;
2245
+ }
2246
+ .voice-result {
2247
+ display: flex;
2248
+ flex-direction: column;
2249
+ gap: 12px;
2250
+ }
2251
+ .result-label {
2252
+ font-size: 14px;
2253
+ font-weight: 500;
2254
+ color: #333;
2255
+ }
2256
+ .result-textarea {
2257
+ width: 100%;
2258
+ padding: 12px;
2259
+ border: 2px solid #e0e0e0;
2260
+ border-radius: 8px;
2261
+ font-size: 14px;
2262
+ line-height: 1.6;
2263
+ resize: vertical;
2264
+ outline: none;
2265
+ transition: border-color 0.2s;
2266
+ font-family: inherit;
2267
+ }
2268
+ .result-textarea:focus {
2269
+ border-color: #0067CC;
2270
+ }
2271
+ .voice-mode-selector {
2272
+ display: flex;
2273
+ gap: 8px;
2274
+ justify-content: center;
2275
+ }
2276
+ .mode-btn {
2277
+ display: flex;
2278
+ align-items: center;
2279
+ gap: 6px;
2280
+ padding: 10px 16px;
2281
+ border: 2px solid #e0e0e0;
2282
+ background: white;
2283
+ color: #666;
2284
+ border-radius: 20px;
2285
+ cursor: pointer;
2286
+ font-size: 14px;
2287
+ font-weight: 500;
2288
+ transition: all 0.2s;
2289
+ white-space: nowrap;
2290
+ }
2291
+ .mode-btn:hover {
2292
+ border-color: #0067CC;
2293
+ color: #0067CC;
2294
+ }
2295
+ .mode-btn.active {
2296
+ border-color: #0067CC;
2297
+ background: #0067CC;
2298
+ color: white;
2299
+ }
2300
+ .mode-btn i {
2301
+ font-size: 16px;
2302
+ }
2303
+ .voice-dialog-footer {
2304
+ display: flex;
2305
+ gap: 12px;
2306
+ padding: 16px 20px;
2307
+ background: #f8f9fa;
2308
+ border-top: 1px solid #e9ecef;
2309
+ flex-shrink: 0;
2310
+ }
2311
+ .voice-action-btn {
2312
+ flex: 1;
2313
+ padding: 12px 20px;
2314
+ border: none;
2315
+ border-radius: 8px;
2316
+ font-size: 14px;
2317
+ font-weight: 500;
2318
+ cursor: pointer;
2319
+ transition: all 0.2s;
2320
+ }
2321
+ .voice-action-btn.cancel {
2322
+ background: #f5f5f5;
2323
+ color: #666;
2324
+ }
2325
+ .voice-action-btn.cancel:hover {
2326
+ background: #e8e8e8;
2327
+ color: #333;
2328
+ }
2329
+ .voice-action-btn.primary {
2330
+ background: #0067CC;
2331
+ color: white;
2332
+ }
2333
+ .voice-action-btn.primary:hover:not(:disabled) {
2334
+ background: #0052A3;
2335
+ transform: translateY(-1px);
2336
+ box-shadow: 0 4px 12px rgba(0, 103, 204, 0.3);
2337
+ }
2338
+ .voice-action-btn:disabled {
2339
+ opacity: 0.5;
2340
+ cursor: not-allowed;
2341
+ }
2342
+ /* 移动端适配 */
2343
+ @media (max-width: 768px) {
2344
+ .voice-to-text-dialog {
2345
+ width: 95%;
2346
+ margin: 0 10px;
2347
+ }
2348
+ .voice-dialog-body {
2349
+ padding: 16px;
2350
+ }
2351
+ .voice-icon-large {
2352
+ width: 60px;
2353
+ height: 60px;
2354
+ }
2355
+ .voice-icon-large i {
2356
+ font-size: 30px;
2357
+ }
2358
+ .voice-time {
2359
+ font-size: 24px;
2360
+ }
2361
+ .voice-mode-selector {
2362
+ flex-wrap: wrap;
2363
+ }
2364
+ .mode-btn {
2365
+ flex: 1;
2366
+ min-width: 100px;
2367
+ }
2368
+ }