codexmate 0.0.27 → 0.0.29

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 (51) hide show
  1. package/README.md +1 -1
  2. package/README.zh.md +1 -1
  3. package/cli/builtin-proxy.js +430 -4
  4. package/cli/openai-bridge.js +498 -13
  5. package/cli.js +130 -41
  6. package/lib/cli-models-utils.js +71 -10
  7. package/lib/cli-webhook.js +126 -0
  8. package/package.json +76 -74
  9. package/plugins/prompt-templates/computed.mjs +1 -1
  10. package/plugins/prompt-templates/methods.mjs +0 -66
  11. package/plugins/prompt-templates/overview.mjs +1 -0
  12. package/web-ui/app.js +21 -16
  13. package/web-ui/index.html +1 -0
  14. package/web-ui/logic.codex.mjs +69 -0
  15. package/web-ui/modules/app.computed.dashboard.mjs +54 -0
  16. package/web-ui/modules/app.computed.session.mjs +22 -17
  17. package/web-ui/modules/app.methods.claude-config.mjs +24 -8
  18. package/web-ui/modules/app.methods.codex-config.mjs +35 -3
  19. package/web-ui/modules/app.methods.index.mjs +2 -0
  20. package/web-ui/modules/app.methods.navigation.mjs +21 -3
  21. package/web-ui/modules/app.methods.providers.mjs +96 -7
  22. package/web-ui/modules/app.methods.session-actions.mjs +3 -6
  23. package/web-ui/modules/app.methods.session-browser.mjs +1 -6
  24. package/web-ui/modules/app.methods.session-trash.mjs +6 -7
  25. package/web-ui/modules/app.methods.startup-claude.mjs +8 -1
  26. package/web-ui/modules/app.methods.webhook.mjs +79 -0
  27. package/web-ui/modules/i18n.dict.mjs +1104 -104
  28. package/web-ui/modules/i18n.mjs +9 -3
  29. package/web-ui/modules/provider-url-display.mjs +17 -0
  30. package/web-ui/partials/index/layout-header.html +25 -0
  31. package/web-ui/partials/index/modals-basic.html +0 -3
  32. package/web-ui/partials/index/panel-config-claude.html +10 -3
  33. package/web-ui/partials/index/panel-config-codex.html +44 -4
  34. package/web-ui/partials/index/panel-plugins.html +3 -29
  35. package/web-ui/partials/index/panel-sessions.html +0 -10
  36. package/web-ui/partials/index/panel-settings.html +93 -177
  37. package/web-ui/partials/index/panel-trash.html +88 -0
  38. package/web-ui/session-helpers.mjs +2 -2
  39. package/web-ui/styles/base-theme.css +47 -34
  40. package/web-ui/styles/controls-forms.css +27 -28
  41. package/web-ui/styles/docs-panel.css +63 -39
  42. package/web-ui/styles/layout-shell.css +69 -46
  43. package/web-ui/styles/modals-core.css +12 -10
  44. package/web-ui/styles/navigation-panels.css +36 -35
  45. package/web-ui/styles/responsive.css +4 -4
  46. package/web-ui/styles/sessions-list.css +10 -6
  47. package/web-ui/styles/settings-panel.css +197 -33
  48. package/web-ui/styles/titles-cards.css +90 -26
  49. package/web-ui/styles/trash-panel.css +90 -0
  50. package/web-ui/styles/webhook.css +81 -0
  51. package/web-ui/styles.css +2 -0
@@ -17,7 +17,9 @@
17
17
  left: 0;
18
18
  right: 0;
19
19
  bottom: 0;
20
- background: linear-gradient(to bottom, rgba(31, 26, 23, 0.3) 0%, rgba(31, 26, 23, 0.5) 100%);
20
+ background:
21
+ radial-gradient(circle at 50% 18%, rgba(255, 248, 241, 0.22), rgba(255, 248, 241, 0) 36%),
22
+ linear-gradient(to bottom, rgba(31, 26, 23, 0.28) 0%, rgba(31, 26, 23, 0.48) 100%);
21
23
  display: flex;
22
24
  justify-content: center;
23
25
  align-items: center;
@@ -28,16 +30,16 @@
28
30
  }
29
31
 
30
32
  .modal {
31
- background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.98) 100%);
33
+ background: linear-gradient(to bottom, rgba(255, 255, 255, 0.96) 0%, rgba(255, 250, 246, 0.94) 100%);
32
34
  width: 90%;
33
35
  max-width: 400px;
34
36
  max-height: 90vh;
35
37
  overflow-y: auto;
36
38
  overscroll-behavior: contain;
37
- border-radius: var(--radius-lg);
39
+ border-radius: var(--radius-xl);
38
40
  padding: var(--spacing-md);
39
41
  box-shadow: var(--shadow-modal);
40
- border: 1px solid rgba(255, 255, 255, 0.8);
42
+ border: 1px solid rgba(255, 255, 255, 0.72);
41
43
  animation: modalSlideUp var(--transition-slow) var(--ease-spring);
42
44
  }
43
45
 
@@ -75,8 +77,8 @@
75
77
  margin-top: 0;
76
78
  padding: var(--spacing-sm) var(--spacing-md) var(--spacing-md);
77
79
  border-top: 1px solid var(--color-border-soft);
78
- background: linear-gradient(to bottom, rgba(255, 255, 255, 0.82) 0%, rgba(255, 255, 255, 0.96) 100%);
79
- backdrop-filter: blur(2px);
80
+ background: linear-gradient(to bottom, rgba(255, 250, 246, 0.78) 0%, rgba(255, 250, 246, 0.96) 100%);
81
+ backdrop-filter: blur(10px);
80
82
  }
81
83
 
82
84
  .modal-title {
@@ -116,8 +118,8 @@
116
118
  gap: var(--spacing-sm);
117
119
  padding: 10px 12px;
118
120
  border: 1px solid var(--color-border-soft);
119
- border-radius: var(--radius-lg);
120
- background: var(--color-surface-alt);
121
+ border-radius: var(--radius-md);
122
+ background: rgba(255, 255, 255, 0.48);
121
123
  }
122
124
 
123
125
  .install-row-main {
@@ -138,7 +140,7 @@
138
140
  font-size: var(--font-size-secondary);
139
141
  color: var(--color-text-primary);
140
142
  word-break: break-all;
141
- background: rgba(255, 255, 255, 0.7);
143
+ background: rgba(255, 255, 255, 0.72);
142
144
  padding: 8px 10px;
143
145
  border-radius: var(--radius-sm);
144
146
  border: 1px solid var(--color-border-soft);
@@ -156,7 +158,7 @@
156
158
 
157
159
  .install-action-tabs .btn-mini.active {
158
160
  background: var(--color-brand-light);
159
- border-color: rgba(199, 116, 98, 0.22);
161
+ border-color: rgba(200, 121, 99, 0.22);
160
162
  color: var(--color-brand-dark);
161
163
  }
162
164
 
@@ -14,7 +14,7 @@
14
14
  color: var(--color-text-secondary);
15
15
  font-size: var(--font-size-body);
16
16
  font-weight: var(--font-weight-secondary);
17
- box-shadow: var(--shadow-subtle);
17
+ box-shadow: var(--shadow-card);
18
18
  transition: all var(--transition-normal) var(--ease-spring);
19
19
  }
20
20
 
@@ -62,23 +62,23 @@
62
62
  }
63
63
 
64
64
  .lang-toggle-btn:hover {
65
- border-color: rgba(0, 0, 0, 0.22);
65
+ border-color: var(--color-border-strong);
66
66
  background: var(--color-surface);
67
67
  }
68
68
 
69
69
  .lang-toggle-btn.active {
70
- background: rgba(18, 22, 35, 0.10);
71
- border-color: rgba(18, 22, 35, 0.30);
72
- color: var(--color-text);
70
+ background: var(--color-brand-light);
71
+ border-color: rgba(200, 121, 99, 0.28);
72
+ color: var(--color-brand-dark);
73
73
  }
74
74
 
75
75
  .status-chip {
76
76
  min-width: 0;
77
77
  max-width: 100%;
78
78
  padding: 6px 10px;
79
- border: 1px solid var(--color-border);
80
- background: var(--color-surface-tint);
81
- box-shadow: none;
79
+ border: 1px solid var(--color-border-soft);
80
+ background: rgba(255, 255, 255, 0.62);
81
+ box-shadow: var(--shadow-subtle);
82
82
  display: inline-flex;
83
83
  flex-direction: row;
84
84
  align-items: center;
@@ -109,10 +109,10 @@
109
109
  .provider-fast-switch {
110
110
  margin: 0 0 14px;
111
111
  padding: 10px 12px;
112
- border-radius: 10px;
113
- border: 1px solid var(--color-border);
114
- background: var(--color-surface-tint);
115
- box-shadow: none;
112
+ border-radius: var(--radius-md);
113
+ border: 1px solid var(--color-border-soft);
114
+ background: rgba(255, 255, 255, 0.58);
115
+ box-shadow: var(--shadow-card);
116
116
  display: grid;
117
117
  gap: 6px;
118
118
  }
@@ -133,7 +133,7 @@
133
133
  border-radius: var(--radius-sm);
134
134
  font-size: var(--font-size-body);
135
135
  color: var(--color-text-primary);
136
- background-color: var(--color-surface-alt);
136
+ background-color: rgba(255, 255, 255, 0.72);
137
137
  outline: none;
138
138
  cursor: pointer;
139
139
  appearance: none;
@@ -158,7 +158,7 @@
158
158
 
159
159
  .main-panel {
160
160
  min-width: 0;
161
- background: var(--color-bg);
161
+ background: transparent;
162
162
  border: none;
163
163
  border-radius: 0;
164
164
  box-shadow: none;
@@ -181,10 +181,10 @@
181
181
  position: sticky;
182
182
  top: 0;
183
183
  z-index: 12;
184
- margin: 0 -28px 14px;
185
- padding: 0 28px 12px;
184
+ margin: 0 -28px 18px;
185
+ padding: 0 28px 14px;
186
186
  background: linear-gradient(180deg, var(--color-bg-topbar-strong) 0%, var(--color-bg-topbar-soft) 78%, var(--color-bg-topbar-clear) 100%);
187
- backdrop-filter: blur(8px);
187
+ backdrop-filter: blur(18px) saturate(130%);
188
188
  }
189
189
 
190
190
  .panel-header {
@@ -198,8 +198,8 @@
198
198
  justify-content: space-between;
199
199
  gap: 14px;
200
200
  margin: 0 0 14px;
201
- padding: 18px 0 14px;
202
- border-bottom: 1px solid var(--color-border);
201
+ padding: 20px 0 16px;
202
+ border-bottom: 1px solid rgba(137, 111, 94, 0.14);
203
203
  background: transparent;
204
204
  }
205
205
 
@@ -277,16 +277,16 @@
277
277
  }
278
278
 
279
279
  .top-tab {
280
- border: 1px solid var(--color-border);
280
+ border: 1px solid var(--color-border-soft);
281
281
  border-radius: 999px;
282
- background: var(--color-surface);
282
+ background: rgba(255, 255, 255, 0.66);
283
283
  padding: 6px 10px;
284
284
  font-size: 11px;
285
285
  color: var(--color-text-secondary);
286
286
  text-align: center;
287
287
  cursor: pointer;
288
- transition: border-color var(--transition-fast) var(--ease-smooth), background-color var(--transition-fast) var(--ease-smooth), color var(--transition-fast) var(--ease-smooth);
289
- box-shadow: none;
288
+ transition: border-color var(--transition-fast) var(--ease-smooth), background-color var(--transition-fast) var(--ease-smooth), color var(--transition-fast) var(--ease-smooth), box-shadow var(--transition-fast) var(--ease-smooth), transform var(--transition-fast) var(--ease-smooth);
289
+ box-shadow: var(--shadow-subtle);
290
290
  flex: 0 0 auto;
291
291
  scroll-snap-align: start;
292
292
  }
@@ -294,14 +294,15 @@
294
294
  .top-tab:hover {
295
295
  border-color: var(--color-border-strong);
296
296
  color: var(--color-text-primary);
297
+ transform: translateY(-1px);
297
298
  }
298
299
 
299
300
  .top-tab.active,
300
301
  .top-tab.nav-intent-active {
301
- border-color: rgba(199, 116, 98, 0.18);
302
+ border-color: rgba(200, 121, 99, 0.28);
302
303
  color: var(--color-brand-dark);
303
- background: var(--color-brand-light);
304
- box-shadow: none;
304
+ background: rgba(255, 255, 255, 0.82);
305
+ box-shadow: 0 10px 24px rgba(92, 68, 52, 0.1);
305
306
  }
306
307
 
307
308
  .top-tab.nav-intent-inactive,
@@ -321,17 +322,17 @@
321
322
  gap: 6px;
322
323
  margin-bottom: 12px;
323
324
  padding: 4px;
324
- background: rgba(246, 241, 235, 0.72);
325
- border-radius: 12px;
326
- border: 1px solid rgba(216, 201, 184, 0.26);
327
- box-shadow: none;
325
+ background: rgba(255, 255, 255, 0.42);
326
+ border-radius: var(--radius-md);
327
+ border: 1px solid var(--color-border-soft);
328
+ box-shadow: var(--shadow-subtle);
328
329
  }
329
330
 
330
331
  .config-subtab {
331
332
  border: 1px solid rgba(216, 201, 184, 0.3);
332
- border-radius: 10px;
333
+ border-radius: var(--radius-sm);
333
334
  padding: 8px 10px;
334
- background: rgba(255, 255, 255, 0.82);
335
+ background: rgba(255, 255, 255, 0.62);
335
336
  color: var(--color-text-secondary);
336
337
  cursor: pointer;
337
338
  font-size: 13px;
@@ -346,10 +347,10 @@
346
347
  }
347
348
 
348
349
  .config-subtab.active {
349
- border-color: rgba(201, 94, 75, 0.34);
350
+ border-color: rgba(200, 121, 99, 0.34);
350
351
  color: var(--color-text-primary);
351
352
  background: rgba(255, 255, 255, 0.98);
352
- box-shadow: 0 1px 4px rgba(31, 26, 23, 0.025);
353
+ box-shadow: 0 8px 20px rgba(92, 68, 52, 0.08);
353
354
  }
354
355
 
355
356
  .settings-subtabs {
@@ -365,7 +366,7 @@
365
366
  margin-left: 6px;
366
367
  padding: 0 6px;
367
368
  border-radius: 999px;
368
- background: rgba(210, 107, 90, 0.14);
369
+ background: rgba(200, 121, 99, 0.14);
369
370
  color: var(--color-text-secondary);
370
371
  font-size: 11px;
371
372
  line-height: 1;
@@ -233,9 +233,9 @@ textarea:focus-visible {
233
233
  }
234
234
 
235
235
  .session-item {
236
- min-height: 75px;
237
- height: 75px;
238
- contain-intrinsic-size: 75px;
236
+ min-height: 108px;
237
+ height: auto;
238
+ contain-intrinsic-size: 108px;
239
239
  padding: 12px 14px;
240
240
  }
241
241
 
@@ -278,7 +278,7 @@ textarea:focus-visible {
278
278
  }
279
279
 
280
280
  .session-item-meta {
281
- margin-top: -2px;
281
+ margin-top: 4px;
282
282
  margin-bottom: 0;
283
283
  gap: 4px;
284
284
  align-items: center;
@@ -205,9 +205,9 @@
205
205
  min-width: 0;
206
206
  position: relative;
207
207
  overflow: hidden;
208
- min-height: 80px;
208
+ min-height: 108px;
209
209
  content-visibility: auto;
210
- contain-intrinsic-size: 80px;
210
+ contain-intrinsic-size: 108px;
211
211
  }
212
212
 
213
213
  .session-item-header {
@@ -370,8 +370,8 @@
370
370
  display: flex;
371
371
  flex-wrap: wrap;
372
372
  align-items: center;
373
- gap: 6px;
374
- margin-top: 2px;
373
+ gap: 6px 8px;
374
+ margin-top: 4px;
375
375
  margin-bottom: 2px;
376
376
  }
377
377
 
@@ -393,9 +393,13 @@
393
393
  }
394
394
 
395
395
  .session-item-cwd {
396
- flex: 1 1 160px;
397
- min-width: 160px;
396
+ flex: 1 0 100%;
397
+ min-width: 0;
398
398
  color: var(--color-text-muted);
399
+ white-space: normal;
400
+ overflow: visible;
401
+ text-overflow: clip;
402
+ overflow-wrap: anywhere;
399
403
  }
400
404
 
401
405
  .session-preview {
@@ -1,7 +1,5 @@
1
1
  /* ============================================
2
- Settings Panel (refined layout)
3
- - Keep existing warm-neutral theme
4
- - Add clearer hierarchy, grid rhythm, and card affordance
2
+ Settings Panel refined visual layer
5
3
  ============================================ */
6
4
 
7
5
  .settings-layout {
@@ -11,36 +9,33 @@
11
9
  .settings-grid {
12
10
  display: grid;
13
11
  grid-template-columns: repeat(12, minmax(0, 1fr));
14
- gap: 12px;
12
+ gap: 18px;
15
13
  }
16
14
 
15
+ /* ---- Card shell ---- */
17
16
  .settings-card {
18
17
  grid-column: span 6;
19
18
  border-radius: var(--radius-xl);
20
19
  border: 1px solid rgba(216, 201, 184, 0.42);
21
20
  background:
22
- linear-gradient(180deg, rgba(255, 255, 255, 0.94) 0%, rgba(255, 253, 252, 0.88) 100%);
21
+ linear-gradient(180deg, rgba(255, 255, 255, 0.96) 0%, rgba(255, 253, 252, 0.9) 100%);
23
22
  box-shadow: var(--shadow-card);
24
- padding: 14px 14px 12px;
23
+ padding: 16px 16px 14px;
25
24
  display: flex;
26
25
  flex-direction: column;
27
- gap: 10px;
28
26
  min-width: 0;
29
27
  position: relative;
30
28
  overflow: hidden;
29
+ transition: box-shadow var(--transition-normal) var(--ease-smooth),
30
+ transform var(--transition-normal) var(--ease-smooth);
31
31
  }
32
32
 
33
- .settings-card::before {
34
- content: '';
35
- position: absolute;
36
- inset: 0;
37
- background:
38
- radial-gradient(900px 240px at 10% 0%, rgba(199, 116, 98, 0.12) 0%, rgba(199, 116, 98, 0) 55%),
39
- radial-gradient(700px 240px at 90% 10%, rgba(199, 116, 98, 0.07) 0%, rgba(199, 116, 98, 0) 60%);
40
- pointer-events: none;
41
- opacity: 0.7;
33
+ .settings-card:hover {
34
+ box-shadow: var(--shadow-card-hover);
35
+ transform: translateY(-1px);
42
36
  }
43
37
 
38
+
44
39
  .settings-card > * {
45
40
  position: relative;
46
41
  z-index: 1;
@@ -51,26 +46,22 @@
51
46
  }
52
47
 
53
48
  .settings-card--danger {
54
- border-color: rgba(196, 69, 54, 0.28);
55
- }
56
-
57
- .settings-card--danger::before {
58
- background:
59
- radial-gradient(980px 260px at 10% 0%, rgba(196, 69, 54, 0.13) 0%, rgba(196, 69, 54, 0) 55%),
60
- radial-gradient(740px 240px at 90% 10%, rgba(199, 116, 98, 0.08) 0%, rgba(199, 116, 98, 0) 60%);
49
+ border-color: rgba(196, 69, 54, 0.22);
61
50
  }
62
51
 
52
+ /* ---- Card header ---- */
63
53
  .settings-card-header {
64
54
  display: flex;
65
55
  flex-direction: column;
66
56
  gap: 3px;
57
+ padding-bottom: 0;
67
58
  }
68
59
 
69
60
  .settings-card-header-row {
70
61
  flex-direction: row;
71
62
  justify-content: space-between;
72
63
  align-items: flex-start;
73
- gap: 12px;
64
+ gap: 16px;
74
65
  }
75
66
 
76
67
  .settings-card-title {
@@ -78,6 +69,22 @@
78
69
  font-weight: 700;
79
70
  letter-spacing: -0.01em;
80
71
  color: var(--color-text-primary);
72
+ display: flex;
73
+ align-items: center;
74
+ gap: 7px;
75
+ }
76
+
77
+ .settings-card-title-icon {
78
+ display: inline-flex;
79
+ align-items: center;
80
+ justify-content: center;
81
+ width: 22px;
82
+ height: 22px;
83
+ border-radius: 6px;
84
+ background: var(--color-brand-light);
85
+ color: var(--color-brand-dark);
86
+ font-size: 12px;
87
+ flex-shrink: 0;
81
88
  }
82
89
 
83
90
  .settings-card-meta {
@@ -86,6 +93,7 @@
86
93
  line-height: 1.35;
87
94
  }
88
95
 
96
+ /* ---- Card body ---- */
89
97
  .settings-card-body {
90
98
  display: flex;
91
99
  flex-direction: column;
@@ -109,6 +117,7 @@
109
117
  color: var(--color-text-secondary);
110
118
  }
111
119
 
120
+ /* ---- Field row ---- */
112
121
  .settings-field-row {
113
122
  display: grid;
114
123
  grid-template-columns: 88px minmax(0, 1fr);
@@ -123,6 +132,7 @@
123
132
  letter-spacing: 0.02em;
124
133
  }
125
134
 
135
+ /* ---- Actions ---- */
126
136
  .settings-actions {
127
137
  display: flex;
128
138
  flex-wrap: wrap;
@@ -140,39 +150,180 @@
140
150
  margin-top: 2px;
141
151
  }
142
152
 
153
+ /* ---- Toggle switch (replaces checkbox) ---- */
143
154
  .settings-toggle {
144
- padding: 8px 10px;
145
- border-radius: 12px;
146
- border: 1px solid rgba(216, 201, 184, 0.4);
147
- background: rgba(248, 243, 238, 0.6);
155
+ display: inline-flex;
156
+ align-items: center;
157
+ gap: 10px;
158
+ cursor: pointer;
159
+ padding: 0;
160
+ border: none;
161
+ background: none;
162
+ border-radius: 0;
163
+ user-select: none;
148
164
  }
149
165
 
166
+ .settings-toggle input[type="checkbox"] {
167
+ appearance: none;
168
+ -webkit-appearance: none;
169
+ width: 40px;
170
+ height: 22px;
171
+ border-radius: 11px;
172
+ background: rgba(137, 111, 94, 0.22);
173
+ border: 1px solid rgba(137, 111, 94, 0.16);
174
+ cursor: pointer;
175
+ position: relative;
176
+ transition: background var(--transition-fast) var(--ease-smooth),
177
+ border-color var(--transition-fast) var(--ease-smooth);
178
+ flex-shrink: 0;
179
+ margin: 0;
180
+ }
181
+
182
+ .settings-toggle input[type="checkbox"]::after {
183
+ content: '';
184
+ position: absolute;
185
+ top: 2px;
186
+ left: 2px;
187
+ width: 16px;
188
+ height: 16px;
189
+ border-radius: 50%;
190
+ background: #fff;
191
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
192
+ transition: transform var(--transition-fast) var(--ease-spring);
193
+ }
194
+
195
+ .settings-toggle input[type="checkbox"]:checked {
196
+ background: var(--color-brand);
197
+ border-color: var(--color-brand);
198
+ }
199
+
200
+ .settings-toggle input[type="checkbox"]:checked::after {
201
+ transform: translateX(18px);
202
+ }
203
+
204
+ .settings-toggle input[type="checkbox"]:focus-visible {
205
+ outline: 2px solid var(--color-brand);
206
+ outline-offset: 2px;
207
+ }
208
+
209
+ .settings-toggle span {
210
+ font-size: var(--font-size-secondary);
211
+ color: var(--color-text-secondary);
212
+ font-weight: var(--font-weight-body);
213
+ }
214
+
215
+ /* ---- Retention row ---- */
150
216
  .settings-retention-row {
151
217
  display: flex;
152
218
  align-items: center;
153
219
  gap: 10px;
154
- padding: 8px 10px;
220
+ padding: 8px 12px;
155
221
  border-radius: 12px;
156
222
  border: 1px solid rgba(216, 201, 184, 0.4);
157
223
  background: rgba(248, 243, 238, 0.6);
158
224
  }
159
225
 
160
226
  .settings-retention-input {
161
- width: 72px;
227
+ width: 64px;
162
228
  padding: 4px 8px;
163
229
  border: 1px solid rgba(216, 201, 184, 0.6);
164
230
  border-radius: 8px;
165
231
  font-size: 14px;
166
232
  text-align: center;
233
+ font-weight: 600;
234
+ color: var(--color-text-primary);
235
+ background: var(--color-surface);
236
+ transition: border-color var(--transition-fast) var(--ease-smooth);
237
+ }
238
+
239
+ .settings-retention-input:focus {
240
+ border-color: var(--color-brand);
241
+ outline: none;
242
+ box-shadow: 0 0 0 3px var(--color-brand-light);
167
243
  }
168
244
 
169
- /* Re-balance action buttons inside cards */
245
+ /* ---- Backup grid ---- */
246
+ .settings-backup-grid {
247
+ display: grid;
248
+ grid-template-columns: 1fr 1fr;
249
+ gap: 16px;
250
+ }
251
+
252
+ .settings-backup-slot {
253
+ display: flex;
254
+ flex-direction: column;
255
+ gap: 8px;
256
+ padding: 12px 14px;
257
+ border-radius: var(--radius-md);
258
+ background: rgba(247, 240, 233, 0.45);
259
+ border: 1px solid var(--color-border-soft);
260
+ transition: border-color var(--transition-fast) var(--ease-smooth);
261
+ }
262
+
263
+ .settings-backup-slot:hover {
264
+ border-color: var(--color-border);
265
+ }
266
+
267
+ .settings-backup-slot-label {
268
+ font-size: var(--font-size-caption);
269
+ font-weight: var(--font-weight-secondary);
270
+ color: var(--color-text-muted);
271
+ letter-spacing: 0.03em;
272
+ }
273
+
274
+ /* ---- Trash config grid ---- */
275
+ .settings-trash-config-grid {
276
+ display: flex;
277
+ align-items: center;
278
+ gap: 16px;
279
+ flex-wrap: wrap;
280
+ }
281
+
282
+ /* ---- Subtab bar ---- */
283
+ .settings-subtabs-bar {
284
+ display: flex;
285
+ align-items: center;
286
+ gap: 4px;
287
+ margin-bottom: 22px;
288
+ padding: 4px;
289
+ background: rgba(247, 240, 233, 0.4);
290
+ border-radius: var(--radius-md);
291
+ border: 1px solid var(--color-border-soft);
292
+ }
293
+
294
+ .settings-subtab {
295
+ position: relative;
296
+ padding: 8px 18px;
297
+ border: none;
298
+ border-radius: var(--radius-sm);
299
+ background: transparent;
300
+ color: var(--color-text-muted);
301
+ cursor: pointer;
302
+ font-size: 13px;
303
+ font-weight: var(--font-weight-secondary);
304
+ transition: all var(--transition-fast) var(--ease-smooth);
305
+ letter-spacing: 0.01em;
306
+ }
307
+
308
+ .settings-subtab:hover {
309
+ color: var(--color-text-primary);
310
+ background: rgba(255, 255, 255, 0.6);
311
+ }
312
+
313
+ .settings-subtab.active {
314
+ color: var(--color-brand-dark);
315
+ font-weight: 700;
316
+ background: var(--color-surface);
317
+ box-shadow: var(--shadow-subtle);
318
+ }
319
+
320
+ /* ---- Buttons inside cards ---- */
170
321
  .settings-card .btn-tool {
171
322
  width: auto;
172
323
  max-width: 100%;
173
324
  }
174
325
 
175
- /* Mobile / narrow */
326
+ /* ---- Mobile ---- */
176
327
  @media (max-width: 860px) {
177
328
  .settings-card {
178
329
  grid-column: 1 / -1;
@@ -181,5 +332,18 @@
181
332
  grid-template-columns: 1fr;
182
333
  align-items: stretch;
183
334
  }
335
+ .settings-backup-grid {
336
+ grid-template-columns: 1fr;
337
+ }
338
+ .settings-trash-config-grid {
339
+ flex-direction: column;
340
+ align-items: stretch;
341
+ }
342
+ .settings-subtabs-bar {
343
+ gap: 2px;
344
+ }
345
+ .settings-subtab {
346
+ padding: 8px 14px;
347
+ font-size: 12px;
348
+ }
184
349
  }
185
-