codexmate 0.0.28 → 0.0.30

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 (50) hide show
  1. package/cli/builtin-proxy.js +107 -2
  2. package/cli/config-bootstrap.js +30 -12
  3. package/cli/config-health.js +117 -1
  4. package/cli/local-bridge.js +324 -0
  5. package/cli/openai-bridge.js +195 -31
  6. package/cli.js +245 -28
  7. package/lib/cli-webhook.js +126 -0
  8. package/package.json +1 -1
  9. package/web-ui/app.js +28 -8
  10. package/web-ui/index.html +1 -0
  11. package/web-ui/logic.codex.mjs +13 -0
  12. package/web-ui/modules/app.computed.dashboard.mjs +25 -2
  13. package/web-ui/modules/app.computed.session.mjs +22 -17
  14. package/web-ui/modules/app.methods.claude-config.mjs +12 -2
  15. package/web-ui/modules/app.methods.codex-config.mjs +25 -0
  16. package/web-ui/modules/app.methods.index.mjs +2 -0
  17. package/web-ui/modules/app.methods.navigation.mjs +39 -8
  18. package/web-ui/modules/app.methods.providers.mjs +125 -8
  19. package/web-ui/modules/app.methods.session-actions.mjs +1 -1
  20. package/web-ui/modules/app.methods.session-browser.mjs +1 -1
  21. package/web-ui/modules/app.methods.session-trash.mjs +3 -4
  22. package/web-ui/modules/app.methods.startup-claude.mjs +1 -0
  23. package/web-ui/modules/app.methods.webhook.mjs +79 -0
  24. package/web-ui/modules/i18n.dict.mjs +1109 -72
  25. package/web-ui/modules/i18n.mjs +9 -3
  26. package/web-ui/modules/skills.methods.mjs +1 -0
  27. package/web-ui/partials/index/layout-header.html +25 -0
  28. package/web-ui/partials/index/modals-basic.html +0 -3
  29. package/web-ui/partials/index/panel-config-claude.html +8 -2
  30. package/web-ui/partials/index/panel-config-codex.html +28 -3
  31. package/web-ui/partials/index/panel-dashboard.html +33 -0
  32. package/web-ui/partials/index/panel-market.html +3 -3
  33. package/web-ui/partials/index/panel-plugins.html +2 -2
  34. package/web-ui/partials/index/panel-sessions.html +1 -9
  35. package/web-ui/partials/index/panel-settings.html +71 -134
  36. package/web-ui/partials/index/panel-trash.html +88 -0
  37. package/web-ui/session-helpers.mjs +20 -2
  38. package/web-ui/styles/dashboard.css +132 -0
  39. package/web-ui/styles/docs-panel.css +63 -39
  40. package/web-ui/styles/layout-shell.css +54 -34
  41. package/web-ui/styles/plugins-panel.css +121 -80
  42. package/web-ui/styles/sessions-list.css +41 -43
  43. package/web-ui/styles/sessions-preview.css +34 -38
  44. package/web-ui/styles/sessions-toolbar-trash.css +31 -27
  45. package/web-ui/styles/settings-panel.css +197 -33
  46. package/web-ui/styles/skills-list.css +12 -10
  47. package/web-ui/styles/skills-market.css +67 -44
  48. package/web-ui/styles/trash-panel.css +90 -0
  49. package/web-ui/styles/webhook.css +81 -0
  50. package/web-ui/styles.css +2 -0
@@ -1,6 +1,5 @@
1
1
  .session-preview.active {
2
2
  box-shadow: var(--shadow-float);
3
- transform: translateX(0);
4
3
  }
5
4
 
6
5
  .session-preview-scroll {
@@ -23,7 +22,7 @@
23
22
  }
24
23
 
25
24
  .session-preview-header {
26
- padding: 12px var(--spacing-sm);
25
+ padding: 14px var(--spacing-sm);
27
26
  border-bottom: 1px solid var(--color-border-soft);
28
27
  display: flex;
29
28
  align-items: flex-start;
@@ -32,8 +31,8 @@
32
31
  position: sticky;
33
32
  top: 0;
34
33
  z-index: 2;
35
- background: linear-gradient(to bottom, rgba(255, 255, 255, 0.98) 0%, rgba(255, 255, 255, 0.92) 100%);
36
- backdrop-filter: blur(6px);
34
+ background: var(--color-surface-elevated);
35
+ backdrop-filter: blur(12px);
37
36
  }
38
37
 
39
38
  .session-preview-header > div:first-child {
@@ -100,17 +99,17 @@
100
99
  .session-preview-body {
101
100
  flex: 1;
102
101
  min-height: 0;
103
- padding: var(--spacing-sm);
102
+ padding: var(--spacing-md);
104
103
  display: flex;
105
104
  flex-direction: column;
106
- gap: 10px;
105
+ gap: 12px;
107
106
  }
108
107
 
109
108
  .session-preview-messages {
110
109
  min-width: 0;
111
110
  display: flex;
112
111
  flex-direction: column;
113
- gap: 10px;
112
+ gap: 12px;
114
113
  contain: layout style;
115
114
  }
116
115
 
@@ -122,9 +121,9 @@
122
121
  width: 44px;
123
122
  height: auto;
124
123
  border-radius: 12px;
125
- border: 1px solid rgba(208, 196, 182, 0.5);
126
- background: linear-gradient(to bottom, rgba(255, 255, 255, 0.92) 0%, rgba(252, 246, 239, 0.94) 100%);
127
- box-shadow: 0 4px 12px rgba(31, 26, 23, 0.06);
124
+ border: 1px solid var(--color-border-soft);
125
+ background: var(--color-surface-elevated);
126
+ box-shadow: var(--shadow-card);
128
127
  padding: 6px 4px 28px;
129
128
  z-index: 3;
130
129
  }
@@ -136,7 +135,7 @@
136
135
  bottom: 32px;
137
136
  width: 2px;
138
137
  transform: translateX(-50%);
139
- background: linear-gradient(to bottom, rgba(166, 149, 130, 0.3) 0%, rgba(166, 149, 130, 0.65) 100%);
138
+ background: var(--color-border-soft);
140
139
  border-radius: 999px;
141
140
  }
142
141
 
@@ -146,27 +145,24 @@
146
145
  width: 10px;
147
146
  height: 10px;
148
147
  border-radius: 50%;
149
- border: 1px solid rgba(139, 118, 104, 0.7);
150
- background: rgba(255, 255, 255, 0.94);
148
+ border: 1px solid var(--color-border-strong);
149
+ background: var(--color-surface);
151
150
  transform: translate(-50%, -50%);
152
151
  cursor: pointer;
153
152
  padding: 0;
154
- transition: none;
155
- will-change: auto;
153
+ transition: border-color var(--transition-fast) var(--ease-spring), background var(--transition-fast) var(--ease-spring), box-shadow var(--transition-fast) var(--ease-spring);
156
154
  }
157
155
 
158
156
  .session-timeline-node:hover {
159
- transform: translate(-50%, -50%);
160
- border-color: rgba(201, 94, 75, 0.85);
161
- background: rgba(255, 255, 255, 1);
162
- box-shadow: none;
157
+ border-color: var(--color-brand);
158
+ background: var(--color-surface);
159
+ box-shadow: 0 0 0 3px rgba(210, 107, 90, 0.15);
163
160
  }
164
161
 
165
162
  .session-timeline-node.active {
166
- transform: translate(-50%, -50%);
167
- border-color: rgba(201, 94, 75, 0.95);
168
- background: rgba(201, 94, 75, 0.95);
169
- box-shadow: none;
163
+ border-color: var(--color-brand);
164
+ background: var(--color-brand);
165
+ box-shadow: 0 0 0 3px rgba(210, 107, 90, 0.2);
170
166
  }
171
167
 
172
168
  .session-timeline-current {
@@ -184,18 +180,18 @@
184
180
  }
185
181
 
186
182
  .session-msg {
187
- border-radius: 10px;
188
- padding: 10px 12px 10px 18px;
189
- border: 1px solid rgba(208, 196, 182, 0.45);
190
- background: rgba(255, 255, 255, 0.75);
183
+ border-radius: var(--radius-md);
184
+ padding: 10px 14px 10px 20px;
185
+ border: 1px solid var(--color-border-soft);
186
+ background: var(--color-surface);
191
187
  position: relative;
192
- box-shadow: 0 2px 6px rgba(31, 26, 23, 0.04);
188
+ box-shadow: var(--shadow-subtle);
193
189
  contain: layout style paint;
194
190
  }
195
191
 
196
192
  .session-msg.user {
197
- border-color: rgba(210, 107, 90, 0.35);
198
- background: rgba(210, 107, 90, 0.08);
193
+ border-color: rgba(210, 107, 90, 0.3);
194
+ background: rgba(210, 107, 90, 0.05);
199
195
  }
200
196
 
201
197
  .session-msg::before {
@@ -206,15 +202,15 @@
206
202
  bottom: 10px;
207
203
  width: 3px;
208
204
  border-radius: 999px;
209
- background: rgba(139, 118, 104, 0.45);
205
+ background: var(--color-border-soft);
210
206
  }
211
207
 
212
208
  .session-msg.user::before {
213
- background: rgba(210, 107, 90, 0.85);
209
+ background: var(--color-brand);
214
210
  }
215
211
 
216
212
  .session-msg.assistant::before {
217
- background: rgba(90, 139, 106, 0.6);
213
+ background: rgba(90, 139, 106, 0.5);
218
214
  }
219
215
 
220
216
  .session-msg-header {
@@ -249,7 +245,7 @@
249
245
 
250
246
  .session-msg-content {
251
247
  font-size: var(--font-size-secondary);
252
- line-height: 1.55;
248
+ line-height: 1.6;
253
249
  color: var(--color-text-primary);
254
250
  white-space: pre-wrap;
255
251
  word-break: break-word;
@@ -270,11 +266,11 @@
270
266
 
271
267
  .session-preview-empty::before {
272
268
  content: "";
273
- width: 34px;
274
- height: 34px;
269
+ width: 40px;
270
+ height: 40px;
275
271
  border-radius: 50%;
276
- background: rgba(210, 107, 90, 0.12);
277
- box-shadow: inset 0 0 0 6px rgba(255, 255, 255, 0.7);
272
+ background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
273
+ opacity: 0.18;
278
274
  }
279
275
 
280
276
  @media (max-width: 1100px) {
@@ -32,9 +32,9 @@
32
32
  justify-content: flex-end;
33
33
  gap: var(--spacing-xs);
34
34
  margin-top: -1px;
35
- padding-top: 4px;
35
+ padding-top: 6px;
36
36
  margin-bottom: var(--spacing-xs);
37
- border-top: 1px dashed var(--color-border-soft);
37
+ border-top: 1px solid var(--color-border-soft);
38
38
  }
39
39
 
40
40
  .session-filter-chips {
@@ -50,21 +50,21 @@
50
50
  align-items: center;
51
51
  gap: 6px;
52
52
  max-width: 100%;
53
- padding: 6px 10px;
53
+ padding: 5px 10px;
54
54
  border-radius: 999px;
55
55
  border: 1px solid var(--color-border-soft);
56
- background: linear-gradient(to bottom, rgba(255, 255, 255, 0.92) 0%, rgba(255, 255, 255, 0.78) 100%);
56
+ background: var(--color-surface);
57
57
  color: var(--color-text-secondary);
58
58
  font-size: var(--font-size-caption);
59
59
  font-weight: var(--font-weight-secondary);
60
60
  cursor: pointer;
61
61
  transition: all var(--transition-fast) var(--ease-spring);
62
- box-shadow: inset 0 1px 2px rgba(31, 26, 23, 0.04);
63
62
  min-width: 0;
64
63
  }
65
64
 
66
65
  .session-filter-chip:hover {
67
- border-color: var(--color-border-strong);
66
+ border-color: var(--color-brand);
67
+ background: var(--color-surface-alt);
68
68
  transform: translateY(-1px);
69
69
  }
70
70
 
@@ -88,30 +88,36 @@
88
88
  width: 18px;
89
89
  height: 18px;
90
90
  border-radius: 999px;
91
- border: 1px solid rgba(70, 86, 110, 0.22);
92
- background: rgba(70, 86, 110, 0.08);
91
+ border: 1px solid var(--color-border-soft);
92
+ background: var(--color-surface-alt);
93
93
  line-height: 1;
94
94
  flex: 0 0 auto;
95
+ transition: all var(--transition-fast) var(--ease-spring);
96
+ }
97
+
98
+ .session-filter-chip-close:hover {
99
+ border-color: var(--color-brand);
100
+ background: var(--color-brand);
101
+ color: #fff;
95
102
  }
96
103
 
97
104
  .session-filter-chip:focus-visible {
98
- outline: 3px solid rgba(201, 94, 75, 0.25);
105
+ outline: 3px solid rgba(210, 107, 90, 0.2);
99
106
  outline-offset: 2px;
100
107
  }
101
108
 
102
109
  .session-toolbar-footer .quick-option {
103
110
  margin: 0;
104
- padding: 6px 10px;
105
- border-radius: var(--radius-sm);
111
+ padding: 5px 10px;
112
+ border-radius: var(--radius-md);
106
113
  border: 1px solid var(--color-border-soft);
107
- background: linear-gradient(to bottom, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.8) 100%);
108
- box-shadow: inset 0 1px 2px rgba(31, 26, 23, 0.04);
114
+ background: var(--color-surface);
109
115
  transition: all var(--transition-fast) var(--ease-spring);
110
116
  line-height: 1.2;
111
117
  }
112
118
 
113
119
  .session-toolbar-footer .quick-option:hover {
114
- border-color: var(--color-border-strong);
120
+ border-color: var(--color-brand);
115
121
  }
116
122
 
117
123
  .session-source-select,
@@ -121,16 +127,15 @@
121
127
  .session-time-select {
122
128
  flex: 1;
123
129
  min-width: 160px;
124
- padding: 10px 12px;
125
- border-radius: var(--radius-sm);
130
+ padding: 9px 12px;
131
+ border-radius: var(--radius-md);
126
132
  border: 1px solid var(--color-border-soft);
127
- background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.92) 100%);
133
+ background: var(--color-surface);
128
134
  color: var(--color-text-secondary);
129
135
  font-size: var(--font-size-body);
130
136
  font-family: var(--font-family);
131
137
  outline: none;
132
138
  transition: all var(--transition-fast) var(--ease-spring);
133
- box-shadow: inset 0 1px 2px rgba(31, 26, 23, 0.04);
134
139
  }
135
140
 
136
141
  .session-query-input {
@@ -251,31 +256,29 @@
251
256
  .btn-session-clone,
252
257
  .btn-session-refresh {
253
258
  border: 1px solid var(--color-border-soft);
254
- border-radius: var(--radius-sm);
255
- background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.9) 100%);
259
+ border-radius: var(--radius-md);
260
+ background: var(--color-surface);
256
261
  color: var(--color-text-secondary);
257
- padding: 8px 12px;
262
+ padding: 7px 12px;
258
263
  font-size: var(--font-size-secondary);
259
264
  font-weight: var(--font-weight-secondary);
260
265
  cursor: pointer;
261
266
  transition: all var(--transition-fast) var(--ease-spring);
262
267
  white-space: nowrap;
263
- box-shadow: var(--shadow-subtle);
264
268
  letter-spacing: -0.01em;
265
269
  }
266
270
 
267
271
  .btn-session-delete {
268
- border: 1px solid rgba(189, 70, 68, 0.45);
269
- border-radius: var(--radius-sm);
270
- background: linear-gradient(to bottom, rgba(255, 245, 245, 0.95) 0%, rgba(255, 255, 255, 0.9) 100%);
272
+ border: 1px solid rgba(189, 70, 68, 0.4);
273
+ border-radius: var(--radius-md);
274
+ background: var(--color-surface);
271
275
  color: #b74545;
272
- padding: 8px 12px;
276
+ padding: 7px 12px;
273
277
  font-size: var(--font-size-secondary);
274
278
  font-weight: var(--font-weight-secondary);
275
279
  cursor: pointer;
276
280
  transition: all var(--transition-fast) var(--ease-spring);
277
281
  white-space: nowrap;
278
- box-shadow: var(--shadow-subtle);
279
282
  letter-spacing: -0.01em;
280
283
  }
281
284
 
@@ -319,6 +322,7 @@
319
322
 
320
323
  .btn-session-delete:hover {
321
324
  border-color: rgba(189, 70, 68, 0.8);
325
+ background: rgba(189, 70, 68, 0.06);
322
326
  color: #9f3b3b;
323
327
  transform: translateY(-1px);
324
328
  }
@@ -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
-