vue-chat-kit 0.3.10 → 0.3.11

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 (79) hide show
  1. package/dist/vue-chat-kit.css +1 -1
  2. package/dist/vue-chat-kit.es.js +4426 -2819
  3. package/dist/vue-chat-kit.umd.js +1 -1
  4. package/package.json +1 -1
  5. package/src/components/AvatarCrop.vue +16 -127
  6. package/src/components/ChatPanel.vue +491 -2675
  7. package/src/components/EmojiPicker.vue +2 -73
  8. package/src/components/chat/ChatWindow.vue +177 -0
  9. package/src/components/chat/ContentList.vue +300 -0
  10. package/src/components/chat/ContextMenu.vue +32 -0
  11. package/src/components/chat/GroupSidebar.vue +284 -0
  12. package/src/components/chat/MainArea.vue +87 -0
  13. package/src/components/chat/Sidebar.vue +52 -0
  14. package/src/components/chat/dialogs/AddFriendDialog.vue +62 -0
  15. package/src/components/chat/dialogs/CreateGroupDialog.vue +86 -0
  16. package/src/components/chat/dialogs/GroupDetailDialog.vue +132 -0
  17. package/src/components/ui/Button.vue +190 -0
  18. package/src/components/ui/Dialog.vue +194 -0
  19. package/src/components/ui/Empty.vue +66 -0
  20. package/src/components/ui/Input.vue +166 -0
  21. package/src/components/ui/Message.vue +186 -0
  22. package/src/components/ui/MessageBox.vue +143 -0
  23. package/src/components/ui/MessageManager.vue +92 -0
  24. package/src/components/ui/Switch.vue +65 -0
  25. package/src/components/ui/Tag.vue +68 -0
  26. package/src/components/ui/icons/ArrowDown.vue +5 -0
  27. package/src/components/ui/icons/ArrowRight.vue +5 -0
  28. package/src/components/ui/icons/Bell.vue +6 -0
  29. package/src/components/ui/icons/Camera.vue +6 -0
  30. package/src/components/ui/icons/ChatDotRound.vue +5 -0
  31. package/src/components/ui/icons/Check.vue +5 -0
  32. package/src/components/ui/icons/CircleCheck.vue +6 -0
  33. package/src/components/ui/icons/Clock.vue +6 -0
  34. package/src/components/ui/icons/Close.vue +5 -0
  35. package/src/components/ui/icons/Delete.vue +8 -0
  36. package/src/components/ui/icons/Edit.vue +6 -0
  37. package/src/components/ui/icons/Folder.vue +5 -0
  38. package/src/components/ui/icons/Minus.vue +5 -0
  39. package/src/components/ui/icons/Monitor.vue +7 -0
  40. package/src/components/ui/icons/Moon.vue +5 -0
  41. package/src/components/ui/icons/Picture.vue +7 -0
  42. package/src/components/ui/icons/Plus.vue +5 -0
  43. package/src/components/ui/icons/Search.vue +6 -0
  44. package/src/components/ui/icons/Setting.vue +6 -0
  45. package/src/components/ui/icons/Sunny.vue +6 -0
  46. package/src/components/ui/icons/User.vue +6 -0
  47. package/src/components/ui/icons/UserFilled.vue +6 -0
  48. package/src/components/ui/icons/Warning.vue +5 -0
  49. package/src/components/ui/icons/index.js +24 -0
  50. package/src/components/ui/index.js +10 -0
  51. package/src/composables/useFriendChat.js +10 -14
  52. package/src/composables/useGroupChat.js +140 -48
  53. package/src/composables/useMessage.js +21 -0
  54. package/src/composables/useMessageBox.js +98 -0
  55. package/src/composables/useTheme.js +140 -0
  56. package/src/config/index.js +1 -0
  57. package/src/const/index.js +1 -0
  58. package/src/const/theme.js +19 -0
  59. package/src/core/api.js +13 -2
  60. package/src/index.js +5 -5
  61. package/src/styles/_base.scss +38 -0
  62. package/src/styles/_variables.scss +43 -0
  63. package/src/styles/components/_add-friend-dialog.scss +45 -0
  64. package/src/styles/components/_avatar-crop.scss +120 -0
  65. package/src/styles/components/_chat-panel.scss +546 -0
  66. package/src/styles/components/_chat-window.scss +239 -0
  67. package/src/styles/components/_content-list.scss +260 -0
  68. package/src/styles/components/_context-menu.scss +35 -0
  69. package/src/styles/components/_create-group-dialog.scss +78 -0
  70. package/src/styles/components/_dialogs.scss +226 -0
  71. package/src/styles/components/_emoji-picker.scss +74 -0
  72. package/src/styles/components/_group-detail-dialog.scss +110 -0
  73. package/src/styles/components/_group-sidebar.scss +278 -0
  74. package/src/styles/components/_main-area.scss +94 -0
  75. package/src/styles/components/_sidebar.scss +83 -0
  76. package/src/styles/index.scss +18 -0
  77. package/src/styles/themes/_dark.scss +68 -0
  78. package/src/styles/themes/_index.scss +7 -0
  79. package/src/styles/themes/_light.scss +69 -0
@@ -0,0 +1,239 @@
1
+ // ==========================================
2
+ // ChatWindow 组件样式
3
+ // ==========================================
4
+
5
+ .chat-window-area {
6
+ flex: 1;
7
+ display: flex;
8
+ flex-direction: column;
9
+ min-height: 0;
10
+ transition: var(--vck-transition);
11
+ }
12
+
13
+ .chat-window-header {
14
+ height: 56px;
15
+ padding: 0 var(--vck-space-md);
16
+ display: flex;
17
+ align-items: center;
18
+ justify-content: space-between;
19
+ border-bottom: 1px solid var(--vck-border);
20
+ background: var(--vck-bg);
21
+ }
22
+
23
+ .chat-window-title {
24
+ display: flex;
25
+ align-items: center;
26
+ gap: var(--vck-space-sm);
27
+ }
28
+
29
+ .chat-window-name {
30
+ font-size: 16px;
31
+ font-weight: 600;
32
+ color: var(--vck-text-primary);
33
+ }
34
+
35
+ .chat-window-status {
36
+ font-size: 12px;
37
+ color: var(--vck-text-muted);
38
+ }
39
+
40
+ .chat-window-status-online {
41
+ color: var(--vck-success);
42
+ }
43
+
44
+ .chat-window-actions {
45
+ display: flex;
46
+ gap: var(--vck-space-md);
47
+ }
48
+
49
+ .chat-action-icon {
50
+ font-size: 20px;
51
+ color: var(--vck-text-secondary);
52
+ cursor: pointer;
53
+ transition: var(--vck-transition-fast);
54
+ }
55
+
56
+ .chat-action-icon:hover {
57
+ color: var(--vck-text-primary);
58
+ }
59
+
60
+ .chat-messages-container {
61
+ flex: 1;
62
+ overflow-y: auto;
63
+ padding: var(--vck-space-lg);
64
+ background-color: var(--vck-bg-chat);
65
+ display: flex;
66
+ flex-direction: column;
67
+ gap: var(--vck-space-md);
68
+ }
69
+
70
+ .message-wrapper {
71
+ display: flex;
72
+ gap: var(--vck-space);
73
+ max-width: 80%;
74
+ }
75
+
76
+ .message-self {
77
+ align-self: flex-end;
78
+ flex-direction: row-reverse;
79
+ }
80
+
81
+ .message-other {
82
+ align-self: flex-start;
83
+ }
84
+
85
+ .message-avatar {
86
+ flex-shrink: 0;
87
+ }
88
+
89
+ .message-avatar-img {
90
+ width: 40px;
91
+ height: 40px;
92
+ border-radius: var(--vck-radius);
93
+ }
94
+
95
+ .message-content {
96
+ display: flex;
97
+ flex-direction: column;
98
+ gap: var(--vck-space-xs);
99
+ }
100
+
101
+ .message-sender-name {
102
+ font-size: 12px;
103
+ color: var(--vck-text-secondary);
104
+ }
105
+
106
+ .message-bubble-wrapper {
107
+ position: relative;
108
+ }
109
+
110
+ .message-bubble {
111
+ padding: var(--vck-space-sm) var(--vck-space);
112
+ font-size: 14px;
113
+ word-break: break-all;
114
+ white-space: pre-wrap;
115
+ border-radius: var(--vck-radius-md);
116
+ box-shadow: var(--vck-shadow-light);
117
+ }
118
+
119
+ .message-bubble-self {
120
+ background-color: var(--vck-bg-bubble-self);
121
+ color: var(--vck-text-primary);
122
+ position: relative;
123
+ }
124
+
125
+ .message-bubble-self::after {
126
+ content: '';
127
+ position: absolute;
128
+ right: -5px;
129
+ top: 10px;
130
+ width: 10px;
131
+ height: 10px;
132
+ background-color: var(--vck-bg-bubble-self);
133
+ transform: rotate(45deg);
134
+ }
135
+
136
+ .message-bubble-other {
137
+ background-color: var(--vck-bg-bubble-other);
138
+ color: var(--vck-text-primary);
139
+ position: relative;
140
+ }
141
+
142
+ .message-bubble-other::after {
143
+ content: '';
144
+ position: absolute;
145
+ left: -5px;
146
+ top: 10px;
147
+ width: 10px;
148
+ height: 10px;
149
+ background-color: var(--vck-bg-bubble-other);
150
+ transform: rotate(45deg);
151
+ }
152
+
153
+ .message-image-bubble {
154
+ border-radius: var(--vck-radius-md);
155
+ cursor: pointer;
156
+ overflow: hidden;
157
+ max-width: 300px;
158
+ padding: 0;
159
+ }
160
+
161
+ .message-image {
162
+ width: 100%;
163
+ height: auto;
164
+ display: block;
165
+ }
166
+
167
+ .message-image-size {
168
+ position: absolute;
169
+ left: var(--vck-space-xs);
170
+ bottom: 0;
171
+ color: var(--vck-text-white);
172
+ font-size: 10px;
173
+ }
174
+
175
+ .message-file-bubble {
176
+ border-radius: var(--vck-radius-md);
177
+ cursor: pointer;
178
+ overflow: hidden;
179
+ min-width: 200px;
180
+ }
181
+
182
+ .message-file-content {
183
+ display: flex;
184
+ align-items: center;
185
+ gap: var(--vck-space);
186
+ padding: var(--vck-space) var(--vck-space-md);
187
+ }
188
+
189
+ .message-file-icon {
190
+ width: 40px;
191
+ height: 40px;
192
+ display: flex;
193
+ align-items: center;
194
+ justify-content: center;
195
+ border-radius: var(--vck-radius-md);
196
+ background: var(--vck-bg-panel);
197
+ }
198
+
199
+ .message-file-info {
200
+ flex: 1;
201
+ min-width: 0;
202
+ }
203
+
204
+ .message-file-name {
205
+ overflow: hidden;
206
+ text-overflow: ellipsis;
207
+ font-size: 14px;
208
+ font-weight: 500;
209
+ line-height: 1.2;
210
+ color: var(--vck-text-primary);
211
+ }
212
+
213
+ .message-file-meta {
214
+ font-size: 12px;
215
+ margin-top: var(--vck-space-xs);
216
+ display: flex;
217
+ align-items: center;
218
+ gap: var(--vck-space-sm);
219
+ color: var(--vck-text-secondary);
220
+ }
221
+
222
+ .message-time {
223
+ font-size: 10px;
224
+ color: var(--vck-text-muted);
225
+ margin-top: var(--vck-space-xs);
226
+ }
227
+
228
+ .message-time-right {
229
+ text-align: right;
230
+ }
231
+
232
+ .message-time-left {
233
+ text-align: left;
234
+ }
235
+
236
+ .chat-input-area {
237
+ background: var(--vck-bg);
238
+ border-top: 1px solid var(--vck-border);
239
+ }
@@ -0,0 +1,260 @@
1
+ // ==========================================
2
+ // ContentList 组件样式
3
+ // ==========================================
4
+
5
+ .chat-content-panel {
6
+ width: 260px;
7
+ background: var(--vck-bg);
8
+ border-right: 1px solid var(--vck-border);
9
+ display: flex;
10
+ flex-direction: column;
11
+ flex-shrink: 0;
12
+ }
13
+
14
+ .chat-search-bar {
15
+ padding: var(--vck-space-md) var(--vck-space);
16
+ background: var(--vck-bg);
17
+ display: flex;
18
+ align-items: center;
19
+ gap: var(--vck-space-sm);
20
+ }
21
+
22
+ .chat-search-input {
23
+ flex: 1;
24
+
25
+ :deep(.el-input__wrapper) {
26
+ background-color: var(--vck-bg-panel);
27
+ box-shadow: none;
28
+ border: 1px solid var(--vck-border-light);
29
+ transition: var(--vck-transition-fast);
30
+ border-radius: var(--vck-radius-lg);
31
+
32
+ &:hover {
33
+ border-color: var(--vck-border);
34
+ }
35
+
36
+ &.is-focus {
37
+ border-color: var(--vck-primary);
38
+ }
39
+ }
40
+
41
+ :deep(.el-input__inner) {
42
+ color: var(--vck-text-primary);
43
+
44
+ &::placeholder {
45
+ color: var(--vck-text-placeholder);
46
+ }
47
+ }
48
+ }
49
+
50
+ .search-actions {
51
+ display: flex;
52
+ gap: var(--vck-space-xs);
53
+ }
54
+
55
+ .chat-content-scroll {
56
+ flex: 1;
57
+ overflow-y: auto;
58
+ overflow-x: hidden;
59
+ }
60
+
61
+ .chat-list-item {
62
+ padding: var(--vck-space);
63
+ display: flex;
64
+ gap: var(--vck-space-sm);
65
+ cursor: pointer;
66
+ transition: var(--vck-transition-fast);
67
+ position: relative;
68
+ }
69
+
70
+ .chat-list-item:hover {
71
+ background: var(--vck-bg-hover);
72
+ }
73
+
74
+ .chat-list-item.chat-list-item-active {
75
+ background: var(--vck-bg-active);
76
+ }
77
+
78
+ .chat-list-avatar-wrapper {
79
+ position: relative;
80
+ flex-shrink: 0;
81
+ }
82
+
83
+ .group-avatar-grid {
84
+ width: 44px;
85
+ height: 44px;
86
+ display: grid;
87
+ grid-template-columns: repeat(2, 1fr);
88
+ grid-template-rows: repeat(2, 1fr);
89
+ gap: 2px;
90
+ background: var(--vck-bg-panel);
91
+ border-radius: var(--vck-radius-md);
92
+ overflow: hidden;
93
+ }
94
+
95
+ .group-avatar-item {
96
+ display: flex;
97
+ align-items: center;
98
+ justify-content: center;
99
+ overflow: hidden;
100
+ }
101
+
102
+ .group-avatar-img {
103
+ width: 100%;
104
+ height: 100%;
105
+ object-fit: cover;
106
+ }
107
+
108
+ .chat-list-avatar {
109
+ width: 44px;
110
+ height: 44px;
111
+ border-radius: var(--vck-radius-md);
112
+ object-fit: cover;
113
+ }
114
+
115
+ .chat-list-online-indicator {
116
+ position: absolute;
117
+ bottom: 2px;
118
+ right: 2px;
119
+ width: 12px;
120
+ height: 12px;
121
+ border-radius: 50%;
122
+ border: 2px solid var(--vck-bg);
123
+ }
124
+
125
+ .chat-list-online-indicator.chat-list-online {
126
+ background-color: var(--vck-success);
127
+ }
128
+
129
+ .chat-list-online-indicator.chat-list-offline {
130
+ background-color: var(--vck-text-muted);
131
+ }
132
+
133
+ .chat-list-info {
134
+ flex: 1;
135
+ min-width: 0;
136
+ }
137
+
138
+ .chat-list-header {
139
+ display: flex;
140
+ align-items: center;
141
+ justify-content: space-between;
142
+ gap: var(--vck-space-sm);
143
+ }
144
+
145
+ .chat-list-name {
146
+ font-size: 14px;
147
+ font-weight: 500;
148
+ color: var(--vck-text-primary);
149
+ white-space: nowrap;
150
+ overflow: hidden;
151
+ text-overflow: ellipsis;
152
+ }
153
+
154
+ .chat-list-time {
155
+ font-size: 12px;
156
+ color: var(--vck-text-muted);
157
+ flex-shrink: 0;
158
+ }
159
+
160
+ .chat-list-preview {
161
+ display: flex;
162
+ align-items: center;
163
+ justify-content: space-between;
164
+ gap: var(--vck-space-sm);
165
+ margin-top: var(--vck-space-xs);
166
+ }
167
+
168
+ .chat-list-last-msg {
169
+ font-size: 12px;
170
+ color: var(--vck-text-secondary);
171
+ white-space: nowrap;
172
+ overflow: hidden;
173
+ text-overflow: ellipsis;
174
+ flex: 1;
175
+ }
176
+
177
+ .chat-list-unread {
178
+ background: var(--vck-primary);
179
+ color: var(--vck-text-white);
180
+ font-size: 10px;
181
+ padding: 0 6px;
182
+ border-radius: 10px;
183
+ line-height: 18px;
184
+ min-width: 18px;
185
+ text-align: center;
186
+ flex-shrink: 0;
187
+ }
188
+
189
+ // 好友/群聊列表分组样式
190
+ .list-section-title {
191
+ display: flex;
192
+ align-items: center;
193
+ gap: var(--vck-space-xs);
194
+ padding: var(--vck-space-md) var(--vck-space) var(--vck-space-sm);
195
+ font-size: 12px;
196
+ font-weight: 600;
197
+ color: var(--vck-text-muted);
198
+ text-transform: uppercase;
199
+ letter-spacing: 0.5px;
200
+ cursor: pointer;
201
+ user-select: none;
202
+ transition: var(--vck-transition-fast);
203
+
204
+ &:hover {
205
+ color: var(--vck-text-secondary);
206
+ }
207
+ }
208
+
209
+ .collapse-icon {
210
+ transition: transform 0.2s ease;
211
+ font-size: 14px;
212
+ }
213
+
214
+ .collapse-icon.collapsed {
215
+ transform: rotate(-90deg);
216
+ }
217
+
218
+ .list-content {
219
+ display: flex;
220
+ flex-direction: column;
221
+ }
222
+
223
+ // 好友申请列表样式
224
+ .friend-request-item {
225
+ display: flex;
226
+ align-items: center;
227
+ justify-content: space-between;
228
+ padding: var(--vck-space);
229
+ transition: var(--vck-transition-fast);
230
+ }
231
+
232
+ .friend-request-info {
233
+ display: flex;
234
+ align-items: center;
235
+ gap: var(--vck-space-sm);
236
+ }
237
+
238
+ .friend-request-avatar {
239
+ width: 44px;
240
+ height: 44px;
241
+ border-radius: var(--vck-radius-md);
242
+ object-fit: cover;
243
+ }
244
+
245
+ .friend-request-details {
246
+ display: flex;
247
+ flex-direction: column;
248
+ gap: var(--vck-space-xs);
249
+ }
250
+
251
+ .friend-request-username {
252
+ font-size: 14px;
253
+ font-weight: 500;
254
+ color: var(--vck-text-primary);
255
+ }
256
+
257
+ .friend-request-desc {
258
+ font-size: 12px;
259
+ color: var(--vck-text-muted);
260
+ }
@@ -0,0 +1,35 @@
1
+ // ==========================================
2
+ // ContextMenu 组件样式
3
+ // ==========================================
4
+
5
+ .context-menu {
6
+ position: fixed;
7
+ background: var(--vck-bg);
8
+ border-radius: var(--vck-radius-lg);
9
+ box-shadow: var(--vck-shadow);
10
+ border: 1px solid var(--vck-border);
11
+ padding: 4px 0;
12
+ z-index: 9999;
13
+ }
14
+
15
+ .context-menu-item {
16
+ padding: 8px 16px;
17
+ cursor: pointer;
18
+ font-size: 14px;
19
+ color: var(--vck-text-primary);
20
+ margin: 2px 4px;
21
+ border-radius: var(--vck-radius);
22
+ transition: var(--vck-transition-fast);
23
+ }
24
+
25
+ .context-menu-item:hover {
26
+ background-color: var(--vck-bg-hover);
27
+ }
28
+
29
+ .context-menu-item.danger {
30
+ color: var(--vck-danger);
31
+ }
32
+
33
+ .context-menu-item.danger:hover {
34
+ background-color: var(--vck-bg-active);
35
+ }
@@ -0,0 +1,78 @@
1
+ // ==========================================
2
+ // CreateGroupDialog 组件样式
3
+ // ==========================================
4
+
5
+ .create-group-form {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: 20px;
9
+ }
10
+
11
+ .form-item {
12
+ display: flex;
13
+ flex-direction: column;
14
+ gap: 8px;
15
+ }
16
+
17
+ .form-label {
18
+ font-size: 14px;
19
+ font-weight: 500;
20
+ color: var(--vck-text-primary);
21
+ }
22
+
23
+ .member-selection {
24
+ border: 1px solid var(--vck-border);
25
+ border-radius: var(--vck-radius);
26
+ padding: 12px;
27
+ background-color: var(--vck-bg-panel);
28
+ }
29
+
30
+ .member-list {
31
+ display: grid;
32
+ grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
33
+ gap: 12px;
34
+ }
35
+
36
+ .member-item {
37
+ display: flex;
38
+ flex-direction: column;
39
+ align-items: center;
40
+ padding: 12px 8px;
41
+ border-radius: var(--vck-radius);
42
+ cursor: pointer;
43
+ transition: var(--vck-transition-fast);
44
+ border: 2px solid transparent;
45
+ background-color: var(--vck-bg);
46
+ }
47
+
48
+ .member-item:hover {
49
+ background-color: var(--vck-bg-hover);
50
+ }
51
+
52
+ .member-item.member-selected {
53
+ border-color: var(--vck-primary);
54
+ background-color: var(--vck-bg-active);
55
+ }
56
+
57
+ .member-avatar {
58
+ width: 56px;
59
+ height: 56px;
60
+ border-radius: 50%;
61
+ object-fit: cover;
62
+ margin-bottom: 8px;
63
+ }
64
+
65
+ .member-name {
66
+ font-size: 13px;
67
+ color: var(--vck-text-primary);
68
+ text-align: center;
69
+ overflow: hidden;
70
+ text-overflow: ellipsis;
71
+ white-space: nowrap;
72
+ max-width: 100%;
73
+ }
74
+
75
+ .member-check {
76
+ color: var(--vck-primary);
77
+ margin-top: 4px;
78
+ }