tabby-ai-assistant 1.0.8 → 1.0.10

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 (54) hide show
  1. package/dist/components/chat/ai-sidebar.component.d.ts +16 -3
  2. package/dist/components/chat/chat-input.component.d.ts +4 -0
  3. package/dist/components/chat/chat-interface.component.d.ts +22 -1
  4. package/dist/components/chat/chat-settings.component.d.ts +21 -11
  5. package/dist/components/settings/ai-settings-tab.component.d.ts +14 -4
  6. package/dist/components/settings/general-settings.component.d.ts +43 -12
  7. package/dist/components/settings/provider-config.component.d.ts +110 -5
  8. package/dist/components/settings/security-settings.component.d.ts +14 -4
  9. package/dist/i18n/index.d.ts +48 -0
  10. package/dist/i18n/translations/en-US.d.ts +5 -0
  11. package/dist/i18n/translations/ja-JP.d.ts +5 -0
  12. package/dist/i18n/translations/zh-CN.d.ts +5 -0
  13. package/dist/i18n/types.d.ts +198 -0
  14. package/dist/index.js +1 -1
  15. package/dist/services/chat/ai-sidebar.service.d.ts +23 -1
  16. package/dist/services/core/theme.service.d.ts +53 -0
  17. package/dist/services/core/toast.service.d.ts +15 -0
  18. package/package.json +1 -1
  19. package/src/components/chat/ai-sidebar.component.scss +468 -0
  20. package/src/components/chat/ai-sidebar.component.ts +47 -344
  21. package/src/components/chat/chat-input.component.scss +2 -2
  22. package/src/components/chat/chat-input.component.ts +16 -5
  23. package/src/components/chat/chat-interface.component.html +11 -11
  24. package/src/components/chat/chat-interface.component.scss +410 -4
  25. package/src/components/chat/chat-interface.component.ts +105 -14
  26. package/src/components/chat/chat-message.component.scss +3 -3
  27. package/src/components/chat/chat-message.component.ts +3 -2
  28. package/src/components/chat/chat-settings.component.html +95 -61
  29. package/src/components/chat/chat-settings.component.scss +224 -50
  30. package/src/components/chat/chat-settings.component.ts +56 -30
  31. package/src/components/security/risk-confirm-dialog.component.scss +7 -7
  32. package/src/components/settings/ai-settings-tab.component.html +27 -27
  33. package/src/components/settings/ai-settings-tab.component.scss +34 -20
  34. package/src/components/settings/ai-settings-tab.component.ts +59 -20
  35. package/src/components/settings/general-settings.component.html +69 -40
  36. package/src/components/settings/general-settings.component.scss +151 -58
  37. package/src/components/settings/general-settings.component.ts +168 -55
  38. package/src/components/settings/provider-config.component.html +183 -60
  39. package/src/components/settings/provider-config.component.scss +332 -153
  40. package/src/components/settings/provider-config.component.ts +268 -19
  41. package/src/components/settings/security-settings.component.html +70 -39
  42. package/src/components/settings/security-settings.component.scss +104 -8
  43. package/src/components/settings/security-settings.component.ts +48 -10
  44. package/src/i18n/index.ts +129 -0
  45. package/src/i18n/translations/en-US.ts +193 -0
  46. package/src/i18n/translations/ja-JP.ts +193 -0
  47. package/src/i18n/translations/zh-CN.ts +193 -0
  48. package/src/i18n/types.ts +224 -0
  49. package/src/index.ts +6 -0
  50. package/src/services/chat/ai-sidebar.service.ts +157 -5
  51. package/src/services/core/theme.service.ts +480 -0
  52. package/src/services/core/toast.service.ts +36 -0
  53. package/src/styles/ai-assistant.scss +8 -88
  54. package/src/styles/themes.scss +161 -0
@@ -1,10 +1,11 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
1
+ import { Component, Input, Output, EventEmitter, ViewEncapsulation } from '@angular/core';
2
2
  import { ChatMessage } from '../../types/ai.types';
3
3
 
4
4
  @Component({
5
5
  selector: 'app-chat-message',
6
6
  templateUrl: './chat-message.component.html',
7
- styleUrls: ['./chat-message.component.scss']
7
+ styleUrls: ['./chat-message.component.scss'],
8
+ encapsulation: ViewEncapsulation.None
8
9
  })
9
10
  export class ChatMessageComponent {
10
11
  @Input() message!: ChatMessage;
@@ -1,21 +1,23 @@
1
1
  <div class="chat-settings">
2
- <h3>聊天设置</h3>
2
+ <h3>{{ t.chatSettings.title }}</h3>
3
3
 
4
4
  <!-- 主题设置 -->
5
5
  <div class="settings-section">
6
- <h4>外观</h4>
6
+ <h4>{{ t.chatSettings.appearance }}</h4>
7
7
 
8
8
  <div class="form-group">
9
- <label>主题</label>
10
- <select class="form-control" [(ngModel)]="settings.theme" (change)="updateTheme(settings.theme)">
11
- <option *ngFor="let theme of themes" [value]="theme.value">
12
- {{ theme.label }}
13
- </option>
14
- </select>
9
+ <label>{{ t.chatSettings.theme }}</label>
10
+ <div class="theme-selector">
11
+ <button *ngFor="let themeOption of themes" class="theme-btn"
12
+ [class.active]="settings.theme === themeOption.value" (click)="updateTheme(themeOption.value)" type="button">
13
+ <div class="theme-preview" [attr.data-theme]="themeOption.value"></div>
14
+ <span>{{ themeOption.label }}</span>
15
+ </button>
16
+ </div>
15
17
  </div>
16
18
 
17
19
  <div class="form-group">
18
- <label>字体大小</label>
20
+ <label>{{ t.chatSettings.fontSize }}</label>
19
21
  <div class="font-size-selector">
20
22
  <button
21
23
  *ngFor="let size of fontSizes"
@@ -27,60 +29,83 @@
27
29
  </div>
28
30
  </div>
29
31
 
30
- <div class="form-check">
32
+ <div class="form-check compact-mode-check">
31
33
  <input
32
34
  type="checkbox"
33
35
  id="compactMode"
34
36
  [(ngModel)]="settings.compactMode"
35
37
  (change)="toggleCompactMode()">
36
- <label for="compactMode">紧凑模式</label>
38
+ <label for="compactMode">
39
+ <strong>{{ t.chatSettings.compactMode }}</strong>
40
+ <span class="option-desc">{{ t.chatSettings.compactModeDesc }}</span>
41
+ </label>
37
42
  </div>
38
43
  </div>
39
44
 
40
45
  <!-- 聊天行为 -->
41
46
  <div class="settings-section">
42
- <h4>聊天行为</h4>
47
+ <h4>{{ t.chatSettings.behavior }}</h4>
43
48
 
44
- <div class="form-check">
45
- <input
46
- type="checkbox"
47
- id="enterToSend"
48
- [(ngModel)]="settings.enterToSend"
49
- (change)="saveSetting('ui.enterToSend', settings.enterToSend)">
50
- <label for="enterToSend">Enter键发送消息</label>
49
+ <div class="setting-item">
50
+ <div class="form-check">
51
+ <input
52
+ type="checkbox"
53
+ id="enterToSend"
54
+ [(ngModel)]="settings.enterToSend"
55
+ (change)="saveSetting('ui.enterToSend', settings.enterToSend)">
56
+ <label for="enterToSend">
57
+ <strong>{{ t.chatSettings.enterToSend }}</strong>
58
+ <span class="option-desc">{{ t.chatSettings.enterToSendDesc }}</span>
59
+ </label>
60
+ </div>
51
61
  </div>
52
62
 
53
- <div class="form-check">
54
- <input
55
- type="checkbox"
56
- id="showTimestamps"
57
- [(ngModel)]="settings.showTimestamps"
58
- (change)="saveSetting('ui.showTimestamps', settings.showTimestamps)">
59
- <label for="showTimestamps">显示时间戳</label>
63
+ <div class="setting-item">
64
+ <div class="form-check">
65
+ <input
66
+ type="checkbox"
67
+ id="showTimestamps"
68
+ [(ngModel)]="settings.showTimestamps"
69
+ (change)="saveSetting('ui.showTimestamps', settings.showTimestamps)">
70
+ <label for="showTimestamps">
71
+ <strong>{{ t.chatSettings.showTimestamps }}</strong>
72
+ <span class="option-desc">{{ t.chatSettings.showTimestampsDesc }}</span>
73
+ </label>
74
+ </div>
60
75
  </div>
61
76
 
62
- <div class="form-check">
63
- <input
64
- type="checkbox"
65
- id="showAvatars"
66
- [(ngModel)]="settings.showAvatars"
67
- (change)="saveSetting('ui.showAvatars', settings.showAvatars)">
68
- <label for="showAvatars">显示头像</label>
77
+ <div class="setting-item">
78
+ <div class="form-check">
79
+ <input
80
+ type="checkbox"
81
+ id="showAvatars"
82
+ [(ngModel)]="settings.showAvatars"
83
+ (change)="saveSetting('ui.showAvatars', settings.showAvatars)">
84
+ <label for="showAvatars">
85
+ <strong>{{ t.chatSettings.showAvatars }}</strong>
86
+ <span class="option-desc">{{ t.chatSettings.showAvatarsDesc }}</span>
87
+ </label>
88
+ </div>
69
89
  </div>
70
90
 
71
- <div class="form-check">
72
- <input
73
- type="checkbox"
74
- id="soundEnabled"
75
- [(ngModel)]="settings.soundEnabled"
76
- (change)="saveSetting('ui.soundEnabled', settings.soundEnabled)">
77
- <label for="soundEnabled">启用提示音</label>
91
+ <div class="setting-item">
92
+ <div class="form-check">
93
+ <input
94
+ type="checkbox"
95
+ id="soundEnabled"
96
+ [(ngModel)]="settings.soundEnabled"
97
+ (change)="saveSetting('ui.soundEnabled', settings.soundEnabled)">
98
+ <label for="soundEnabled">
99
+ <strong>{{ t.chatSettings.soundEnabled }}</strong>
100
+ <span class="option-desc">{{ t.chatSettings.soundEnabledDesc }}</span>
101
+ </label>
102
+ </div>
78
103
  </div>
79
104
  </div>
80
105
 
81
106
  <!-- 聊天历史 -->
82
107
  <div class="settings-section">
83
- <h4>聊天历史</h4>
108
+ <h4>{{ t.chatSettings.history }}</h4>
84
109
 
85
110
  <div class="form-check">
86
111
  <input
@@ -88,20 +113,26 @@
88
113
  id="chatHistoryEnabled"
89
114
  [(ngModel)]="settings.chatHistoryEnabled"
90
115
  (change)="saveSetting('chatHistoryEnabled', settings.chatHistoryEnabled)">
91
- <label for="chatHistoryEnabled">启用聊天历史</label>
116
+ <label for="chatHistoryEnabled">
117
+ <strong>{{ t.chatSettings.enableHistory }}</strong>
118
+ <span class="option-desc">{{ t.chatSettings.enableHistoryDesc }}</span>
119
+ </label>
92
120
  </div>
93
121
 
94
- <div class="form-group" *ngIf="settings.chatHistoryEnabled">
95
- <label>最大历史记录数</label>
96
- <input
97
- type="number"
98
- class="form-control"
99
- [(ngModel)]="settings.maxChatHistory"
100
- (change)="saveSetting('maxChatHistory', settings.maxChatHistory)"
101
- min="10"
102
- max="1000"
103
- step="10">
104
- <small class="form-text">保存的最大聊天记录数量</small>
122
+ <div class="form-group history-limit" *ngIf="settings.chatHistoryEnabled">
123
+ <label>{{ t.chatSettings.maxHistory }}</label>
124
+ <div class="input-with-unit">
125
+ <input
126
+ type="number"
127
+ class="form-control"
128
+ [(ngModel)]="settings.maxChatHistory"
129
+ (change)="saveSetting('maxChatHistory', settings.maxChatHistory)"
130
+ min="10"
131
+ max="1000"
132
+ step="10">
133
+ <span class="unit">{{ t.chatSettings.maxHistoryUnit }}</span>
134
+ </div>
135
+ <small class="form-text">{{ t.chatSettings.autoSaveDesc }}</small>
105
136
  </div>
106
137
 
107
138
  <div class="form-check" *ngIf="settings.chatHistoryEnabled">
@@ -110,23 +141,26 @@
110
141
  id="autoSaveChat"
111
142
  [(ngModel)]="settings.autoSaveChat"
112
143
  (change)="saveSetting('autoSaveChat', settings.autoSaveChat)">
113
- <label for="autoSaveChat">自动保存聊天记录</label>
144
+ <label for="autoSaveChat">
145
+ <strong>{{ t.chatSettings.autoSave }}</strong>
146
+ <span class="option-desc">{{ t.chatSettings.autoSaveDesc }}</span>
147
+ </label>
114
148
  </div>
115
149
  </div>
116
150
 
117
151
  <!-- 操作按钮 -->
118
152
  <div class="settings-actions">
119
153
  <button class="btn btn-secondary" (click)="exportSettings()">
120
- <i class="icon-export"></i>
121
- 导出设置
154
+ <i class="fa fa-download"></i>
155
+ {{ t.chatSettings.exportSettings }}
122
156
  </button>
123
157
  <button class="btn btn-danger" (click)="clearChatHistory()">
124
- <i class="icon-clear"></i>
125
- 清空聊天记录
158
+ <i class="fa fa-trash"></i>
159
+ {{ t.chatSettings.clearHistory }}
126
160
  </button>
127
- <button class="btn btn-warning" (click)="resetToDefaults()">
128
- <i class="icon-refresh"></i>
129
- 重置为默认
161
+ <button class="btn btn-outline" (click)="resetToDefaults()">
162
+ <i class="fa fa-undo"></i>
163
+ {{ t.chatSettings.resetDefaults }}
130
164
  </button>
131
165
  </div>
132
166
  </div>
@@ -1,46 +1,56 @@
1
1
  .chat-settings {
2
2
  padding: 1.5rem;
3
+ max-width: 900px;
3
4
 
4
5
  h3 {
5
6
  margin: 0 0 1.5rem 0;
6
7
  font-size: 1.25rem;
7
8
  font-weight: 600;
8
- color: var(--ai-dark);
9
+ color: var(--ai-text-primary);
9
10
  }
10
11
 
11
12
  .settings-section {
12
13
  margin-bottom: 2rem;
13
- padding-bottom: 1.5rem;
14
- border-bottom: 1px solid var(--ai-border);
14
+ padding: 1.5rem;
15
+ background-color: var(--ai-bg-secondary);
16
+ border-radius: 12px;
17
+ border: 1px solid var(--ai-border);
15
18
 
16
19
  &:last-child {
17
20
  border-bottom: none;
21
+ padding-bottom: 0;
18
22
  }
19
23
 
20
24
  h4 {
21
- margin: 0 0 1rem 0;
25
+ margin: 0 0 1.25rem 0;
22
26
  font-size: 1.125rem;
23
27
  font-weight: 600;
24
- color: var(--ai-dark);
28
+ color: var(--ai-text-primary);
25
29
  }
26
30
 
27
31
  .form-group {
28
- margin-bottom: 1rem;
32
+ margin-bottom: 1.5rem;
33
+
34
+ &:last-child {
35
+ margin-bottom: 0;
36
+ }
29
37
 
30
38
  label {
31
39
  display: block;
32
40
  font-weight: 500;
33
- margin-bottom: 0.5rem;
34
- color: var(--ai-dark);
41
+ margin-bottom: 0.625rem;
42
+ color: var(--ai-text-primary);
43
+ font-size: 0.875rem;
35
44
  }
36
45
 
37
46
  .form-control {
38
47
  width: 100%;
39
- padding: 0.5rem 0.75rem;
48
+ max-width: 200px;
49
+ padding: 0.625rem 0.875rem;
40
50
  border: 1px solid var(--ai-border);
41
- border-radius: 0.375rem;
51
+ border-radius: 8px;
42
52
  background-color: var(--ai-bg-primary);
43
- color: var(--ai-dark);
53
+ color: var(--ai-text-primary);
44
54
  font-size: 14px;
45
55
 
46
56
  &:focus {
@@ -50,87 +60,220 @@
50
60
  }
51
61
  }
52
62
 
53
- .font-size-selector {
63
+ .form-text {
64
+ font-size: 0.8125rem;
65
+ color: var(--ai-text-secondary);
66
+ margin-top: 0.5rem;
67
+ }
68
+ }
69
+
70
+ .theme-selector {
71
+ display: flex;
72
+ gap: 1rem;
73
+ flex-wrap: wrap;
74
+
75
+ .theme-btn {
76
+ padding: 0.75rem;
77
+ border: 2px solid var(--ai-border);
78
+ border-radius: 12px;
79
+ background-color: var(--ai-bg-primary);
80
+ cursor: pointer;
81
+ transition: all 0.2s ease;
54
82
  display: flex;
83
+ flex-direction: column;
84
+ align-items: center;
55
85
  gap: 0.5rem;
56
- flex-wrap: wrap;
86
+ min-width: 100px;
57
87
 
58
- .font-size-btn {
59
- padding: 0.5rem 0.75rem;
60
- border: 1px solid var(--ai-border);
61
- border-radius: 0.375rem;
62
- background-color: var(--ai-bg-primary);
63
- color: var(--ai-dark);
64
- cursor: pointer;
65
- transition: all 0.2s;
66
- font-size: 0.875rem;
88
+ &:hover {
89
+ border-color: var(--ai-primary);
90
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
91
+ transform: translateY(-2px);
92
+ }
93
+
94
+ &.active {
95
+ border-color: var(--ai-primary);
96
+ background-color: rgba(0, 123, 255, 0.08);
97
+ box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.2);
98
+ }
99
+
100
+ .theme-preview {
101
+ width: 56px;
102
+ height: 56px;
103
+ border-radius: 8px;
104
+ border: 2px solid var(--ai-border);
105
+ transition: all 0.2s ease;
106
+
107
+ &[data-theme="light"] {
108
+ background: linear-gradient(135deg, #ffffff 0%, #f0f0f0 100%);
109
+ }
67
110
 
68
- &:hover {
69
- border-color: var(--ai-primary);
111
+ &[data-theme="dark"] {
112
+ background: linear-gradient(135deg, #3a3a4a 0%, #1a1a2a 100%);
70
113
  }
71
114
 
72
- &.active {
73
- background-color: var(--ai-primary);
74
- color: white;
75
- border-color: var(--ai-primary);
115
+ &[data-theme="auto"] {
116
+ background: linear-gradient(135deg, #ffffff 0%, #3a3a4a 50%, #1a1a2a 100%);
76
117
  }
77
118
  }
119
+
120
+ span {
121
+ font-size: 0.875rem;
122
+ color: var(--ai-text-primary);
123
+ font-weight: 500;
124
+ }
78
125
  }
126
+ }
79
127
 
80
- .form-text {
128
+ .font-size-selector {
129
+ display: flex;
130
+ gap: 0.75rem;
131
+ flex-wrap: wrap;
132
+
133
+ .font-size-btn {
134
+ padding: 0.625rem 1rem;
135
+ border: 2px solid var(--ai-border);
136
+ border-radius: 8px;
137
+ background-color: var(--ai-bg-primary);
138
+ color: var(--ai-text-primary);
139
+ cursor: pointer;
140
+ transition: all 0.2s ease;
81
141
  font-size: 0.875rem;
82
- color: var(--ai-secondary);
83
- margin-top: 0.25rem;
142
+ font-weight: 500;
143
+ min-width: 60px;
144
+
145
+ &:hover {
146
+ border-color: var(--ai-primary);
147
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
148
+ transform: translateY(-1px);
149
+ }
150
+
151
+ &.active {
152
+ background-color: var(--ai-primary);
153
+ color: white;
154
+ border-color: var(--ai-primary);
155
+ box-shadow: 0 2px 8px rgba(0, 123, 255, 0.3);
156
+ }
84
157
  }
85
158
  }
86
159
 
87
160
  .form-check {
88
161
  display: flex;
89
- align-items: center;
90
- gap: 0.5rem;
91
- margin-bottom: 0.75rem;
162
+ align-items: flex-start;
163
+ gap: 0.75rem;
164
+ padding: 0.75rem;
165
+ border-radius: 8px;
166
+ margin-bottom: 0.5rem;
167
+ transition: background-color 0.2s;
168
+
169
+ &:hover {
170
+ background-color: rgba(255, 255, 255, 0.03);
171
+ }
172
+
173
+ &:last-child {
174
+ margin-bottom: 0;
175
+ }
92
176
 
93
177
  input[type="checkbox"] {
94
- width: 1rem;
95
- height: 1rem;
178
+ width: 1.125rem;
179
+ height: 1.125rem;
180
+ margin-top: 0.125rem;
96
181
  accent-color: var(--ai-primary);
182
+ flex-shrink: 0;
97
183
  }
98
184
 
99
185
  label {
100
186
  margin: 0;
101
- font-weight: 400;
102
187
  cursor: pointer;
103
- color: var(--ai-dark);
188
+ flex: 1;
189
+
190
+ strong {
191
+ display: block;
192
+ margin-bottom: 0.25rem;
193
+ color: var(--ai-text-primary);
194
+ font-size: 0.9375rem;
195
+ }
196
+
197
+ .option-desc {
198
+ display: block;
199
+ font-size: 0.8125rem;
200
+ color: var(--ai-text-secondary);
201
+ font-weight: normal;
202
+ }
203
+ }
204
+ }
205
+
206
+ .setting-item {
207
+ margin-bottom: 0.5rem;
208
+
209
+ &:last-child {
210
+ margin-bottom: 0;
211
+ }
212
+ }
213
+
214
+ .compact-mode-check {
215
+ margin-top: 0.5rem;
216
+ }
217
+
218
+ .input-with-unit {
219
+ display: flex;
220
+ align-items: center;
221
+ gap: 0;
222
+
223
+ .form-control {
224
+ border-top-right-radius: 0;
225
+ border-bottom-right-radius: 0;
226
+ max-width: 120px;
227
+ }
228
+
229
+ .unit {
230
+ padding: 0.625rem 1rem;
231
+ background-color: var(--ai-bg-primary);
232
+ border: 1px solid var(--ai-border);
233
+ border-left: none;
234
+ border-top-right-radius: 8px;
235
+ border-bottom-right-radius: 8px;
236
+ color: var(--ai-text-secondary);
237
+ font-size: 0.875rem;
104
238
  }
105
239
  }
240
+
241
+ .history-limit {
242
+ margin-top: 1rem;
243
+ }
106
244
  }
107
245
 
108
246
  .settings-actions {
109
247
  display: flex;
110
- gap: 0.75rem;
248
+ gap: 1rem;
111
249
  flex-wrap: wrap;
112
250
  margin-top: 2rem;
113
251
  padding-top: 1.5rem;
114
252
  border-top: 1px solid var(--ai-border);
115
253
 
116
254
  .btn {
117
- padding: 0.5rem 1rem;
255
+ padding: 0.75rem 1.5rem;
118
256
  border: none;
119
- border-radius: 0.375rem;
120
- font-weight: 500;
257
+ border-radius: 8px;
258
+ font-weight: 600;
121
259
  cursor: pointer;
122
- transition: all 0.2s;
260
+ transition: all 0.2s ease;
123
261
  display: flex;
124
262
  align-items: center;
125
- gap: 0.375rem;
263
+ gap: 0.5rem;
126
264
  font-size: 0.875rem;
127
265
 
266
+ i {
267
+ font-size: 1rem;
268
+ }
269
+
128
270
  &.btn-secondary {
129
- background-color: var(--ai-secondary);
271
+ background-color: var(--ai-text-secondary);
130
272
  color: white;
131
273
 
132
274
  &:hover {
133
275
  background-color: #5a6268;
276
+ transform: translateY(-1px);
134
277
  }
135
278
  }
136
279
 
@@ -140,15 +283,19 @@
140
283
 
141
284
  &:hover {
142
285
  background-color: #c82333;
286
+ transform: translateY(-1px);
143
287
  }
144
288
  }
145
289
 
146
- &.btn-warning {
147
- background-color: var(--ai-warning);
148
- color: var(--ai-dark);
290
+ &.btn-outline {
291
+ background-color: transparent;
292
+ border: 2px solid var(--ai-border);
293
+ color: var(--ai-text-secondary);
149
294
 
150
295
  &:hover {
151
- background-color: #e0a800;
296
+ border-color: var(--ai-primary);
297
+ color: var(--ai-primary);
298
+ transform: translateY(-1px);
152
299
  }
153
300
  }
154
301
  }
@@ -160,6 +307,33 @@
160
307
  .chat-settings {
161
308
  padding: 1rem;
162
309
 
310
+ .settings-section {
311
+ padding: 1rem;
312
+
313
+ .theme-selector {
314
+ .theme-btn {
315
+ min-width: 80px;
316
+ padding: 0.5rem;
317
+
318
+ .theme-preview {
319
+ width: 48px;
320
+ height: 48px;
321
+ }
322
+
323
+ span {
324
+ font-size: 0.8rem;
325
+ }
326
+ }
327
+ }
328
+
329
+ .font-size-selector {
330
+ .font-size-btn {
331
+ padding: 0.5rem 0.875rem;
332
+ min-width: 55px;
333
+ }
334
+ }
335
+ }
336
+
163
337
  .settings-actions {
164
338
  flex-direction: column;
165
339
 
@@ -169,4 +343,4 @@
169
343
  }
170
344
  }
171
345
  }
172
- }
346
+ }