@swimmingliu/autovpn 1.8.0 → 2.0.2

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.
@@ -0,0 +1,381 @@
1
+ /* Compact controls and shared tokens keep content readable without large
2
+ repeated containers. All surfaces, including legacy panels, follow theme. */
3
+ :root {
4
+ --bg: #f6f7fa;
5
+ --surface: #fff;
6
+ --surface-soft: #f9f9fc;
7
+ --surface-muted: #f0f1f6;
8
+ --border: #e3e5ed;
9
+ --border-strong: #c9cdda;
10
+ --text: #25283d;
11
+ --text-soft: #686e83;
12
+ --accent: #5b5ce2;
13
+ --accent-strong: #4b4dcc;
14
+ --accent-soft: #efeffd;
15
+ --success: #187d50;
16
+ --success-soft: #eaf7ef;
17
+ --warning: #9b610c;
18
+ --warning-soft: #fff5e4;
19
+ --danger: #c83850;
20
+ --danger-soft: #ffedf0;
21
+ --shadow: 0 2px 8px rgb(25 30 55 / 3%);
22
+ --scroll-thumb: #a1a7b9;
23
+ }
24
+ :root[data-theme="dark"] {
25
+ color-scheme: dark;
26
+ --bg: #13151d;
27
+ --surface: #1b1e29;
28
+ --surface-soft: #202430;
29
+ --surface-muted: #282c3a;
30
+ --border: #313646;
31
+ --border-strong: #4a5269;
32
+ --text: #eceef7;
33
+ --text-soft: #a2abc2;
34
+ --accent: #a6a4ff;
35
+ --accent-strong: #8e8bf3;
36
+ --accent-soft: #2e2c4d;
37
+ --success: #76d7a3;
38
+ --success-soft: #20392e;
39
+ --warning: #f1c16d;
40
+ --warning-soft: #3b3122;
41
+ --danger: #ff96a8;
42
+ --danger-soft: #402936;
43
+ --shadow: none;
44
+ --scroll-thumb: #667089;
45
+ }
46
+ body { background: var(--bg); font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", system-ui, sans-serif; font-size: 14px; }
47
+ button { color: inherit; }
48
+ .ui-icon { display: inline-block; flex: none; vertical-align: middle; }
49
+ :focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
50
+ input:focus-visible, select:focus-visible, textarea:focus-visible { outline-offset: 1px; box-shadow: none; }
51
+ .btn, .icon-btn, .theme-choice { display: inline-flex; align-items: center; justify-content: center; gap: 8px; }
52
+ .btn, .btn.small { min-height: 36px; border-radius: 8px; padding-inline: 12px; font-size: 13px; font-weight: 600; box-shadow: none; }
53
+ .btn-primary { background: var(--accent); color: #fff; }
54
+ :root[data-theme="dark"] .btn-primary { background: #6663d9; }
55
+ .btn-primary:hover { background: var(--accent-strong); color: #fff; }
56
+ .btn-secondary, .icon-btn { background: var(--surface); border-color: var(--border); }
57
+ .btn:hover, .icon-btn:hover { box-shadow: none; filter: brightness(.97); }
58
+ .btn.icon-only, .icon-btn { width: 36px; min-width: 36px; height: 36px; min-height: 36px; padding: 0; border-radius: 8px; }
59
+ .btn.icon-only .ui-icon { width: 17px; height: 17px; }
60
+ input, select, textarea { min-height: 36px; padding-inline: 10px; border-radius: 8px; background: var(--surface); }
61
+ .panel { padding: 20px; border-radius: 12px; box-shadow: none; }
62
+ .panel-headline { margin-bottom: 16px; }
63
+ .panel-headline h3 { font-size: 15px; font-weight: 650; }
64
+ .page-shell, .page-grid { gap: 16px; }
65
+ .topbar { border: 0; background: transparent; box-shadow: none; border-radius: 0; padding: 0 0 4px; align-items: center; }
66
+ .topbar-heading h1 { font-size: 20px; letter-spacing: -.03em; }
67
+ .topbar-actions { align-items: center; gap: 8px; }
68
+ .result-details > summary { cursor: pointer; color: var(--text-soft); font-size: 13px; }
69
+ .result-details[open] > summary { margin-bottom: 18px; }
70
+ .result-details summary .badge { margin-left: 8px; }
71
+ .page-content { padding: 0 2px 12px 0; }
72
+ .page-content { min-width: 0; overflow-x: hidden; }
73
+ .page-shell, .page-grid, .panel, .account-pool-records, .account-pool-toolbar { min-width: 0; }
74
+ .table-wrap { min-width: 0; max-width: 100%; }
75
+ .results-subscription-card { display: flex; align-items: center; gap: 16px; position: relative; padding-block: 14px; }
76
+ .results-subscription-card .subscription-primary { flex: 1; min-width: 0; margin: 0; padding: 0; border: 0; background: none; font-size: 13px; }
77
+ .subscription-actions { display: flex; align-items: center; gap: 8px; flex: none; }
78
+ .subscription-qr summary { list-style: none; cursor: pointer; border: 1px solid var(--border); }
79
+ .subscription-qr summary::-webkit-details-marker { display: none; }
80
+ .subscription-qr-panel { position: absolute; right: 14px; top: calc(100% + 8px); padding: 14px; width: 224px; max-width: calc(100vw - 48px); border: 1px solid var(--border); border-radius: 10px; background: var(--surface); box-shadow: 0 8px 24px rgb(0 0 0 / 12%); z-index: 5; }
81
+ .subscription-qr-panel .qr-image { width: 194px; max-width: 100%; height: auto; background: #fff; }
82
+ .main-shell { padding: 24px 28px; gap: 20px; }
83
+ .badge { min-height: 24px; font-weight: 550; border-radius: 6px; padding-inline: 8px; }
84
+ .window-titlebar { background: var(--surface); border-color: var(--border); }
85
+ /* Navigation identifies these pages; removing their empty heading track
86
+ lets the actual tools start at the top of the workspace. */
87
+ /* The selected navigation item supplies page identity; actions now live
88
+ beside their status, so the shell needs no separate heading row. */
89
+ .topbar { display: none; }
90
+ .main-shell { grid-template-rows: minmax(0, 1fr); }
91
+ .run-icon-controls { display: flex; align-items: center; justify-content: flex-end; gap: 8px; flex: none; }
92
+ .run-stage-heading { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
93
+ .run-stage-heading h3 { margin-right: auto; }
94
+ .run-stage-heading .run-icon-controls { margin-left: 8px; }
95
+ .timeline-panel { align-self: start; }
96
+ .timeline { max-height: min(60vh, 480px); overflow: auto; overscroll-behavior: contain; }
97
+ .timeline-substeps { padding: 0 0 8px 34px; border-left: 1px solid var(--border); margin-left: 12px; }
98
+ .timeline-substep { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 30px; color: var(--text-soft); font-size: 12px; }
99
+ .status-hero-card[data-tone="danger"] h3 { color: var(--danger); }
100
+ .run-icon-controls .btn { min-width: 44px; min-height: 44px; }
101
+ .dashboard-analytics { display: grid; gap: 16px; min-width: 0; }
102
+ /* beUI utilities intentionally omit a global reset. Keep browser paragraph
103
+ margins and list markers out of chart captions and legend rows. */
104
+ .dashboard-analytics p { margin: 0; }
105
+ .dashboard-analytics ul { list-style: none; margin: 0; padding: 0; }
106
+ .analytics-distributions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
107
+ .analytics-distribution h3, .analytics-heading h3 { font-size: 14px; font-weight: 600; margin: 0 0 16px; }
108
+ .distribution-layout { display: grid; grid-template-columns: minmax(128px, .85fr) minmax(0, 1.15fr); align-items: center; gap: 20px; }
109
+ .analytics-distribution [data-donut-legend] { min-height: 44px; color: var(--text); font-size: 13px; border: 0; background: transparent; }
110
+ .analytics-distribution [data-donut-legend]:hover, .analytics-distribution [data-donut-legend]:focus-visible { background: var(--surface-muted); }
111
+ .distribution-share { color: var(--text-soft); margin-left: 10px; font-size: 12px; }
112
+ .chart-empty { min-height: 176px; display: flex; align-items: center; justify-content: center; gap: 20px; color: var(--text-soft); font-size: 13px; }
113
+ .empty-donut { width: 130px; height: 130px; border: 22px solid var(--surface-muted); border-radius: 50%; }
114
+ .analytics-heading { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 14px; }
115
+ .analytics-heading h3 { margin-bottom: 0; }
116
+ .analytics-heading > span { font-size: 12px; color: var(--text-soft); }
117
+ .calendar-scroll { overflow-x: auto; padding: 4px 2px 8px; max-width: 100%; }
118
+ .calendar-canvas { min-width: 1056px; }
119
+ .calendar-canvas [data-heat-cell] { min-width: 0; min-height: 0; padding: 0; font-size: inherit; }
120
+ .calendar-canvas .calendar-key { font-size: 12px; }
121
+ .contribution-legend { display: flex; justify-content: space-between; align-items: center; gap: 16px; margin-top: 12px; color: var(--text-soft); font-size: 12px; }
122
+ .contribution-scale { display: flex; align-items: center; gap: 4px; }
123
+ .contribution-scale i { width: 12px; height: 12px; border-radius: 3px; }
124
+ .account-pool-table-wrap { max-height: min(55vh, 500px); overflow: auto; }
125
+ .data-table thead th { position: sticky; top: 0; z-index: 1; }
126
+ @media (hover: hover) and (pointer: fine) {
127
+ .settings-overview-card, .nav-item, .btn, .icon-btn { transition: background 150ms ease, border-color 150ms ease, transform 150ms ease; }
128
+ .settings-overview-card:hover { transform: translateY(-1px); }
129
+ .btn:active, .icon-btn:active { transform: scale(.96); }
130
+ }
131
+ .run-options { padding: 16px 0 0; display: flex; align-items: center; flex-wrap: wrap; gap: 8px 16px; }
132
+ .run-options .checkbox-chip { border: 0; background: none; padding: 0; min-height: 36px; border-radius: 0; font-size: 13px; font-weight: 450; }
133
+ .status-hero-card { min-height: 80px; background: var(--surface); }
134
+ body[data-page="dashboard"] #runStateBadge { display: none; }
135
+ .status-hero-card h3 { font-size: 25px; }
136
+ .status-hero-card p { font-size: 13px; margin-top: 6px; }
137
+ .status-orb { width: 44px; height: 44px; }
138
+ .metric-grid.four { gap: 0; }
139
+ #dashboardMetricsPanel { padding: 18px 0; }
140
+ .metric-card { border: 0; border-radius: 0; padding: 0 20px; background: none; }
141
+ .metric-card + .metric-card { border-left: 1px solid var(--border); }
142
+ .metric-card:is(.accent, .success, .warning, .danger) { background: none; }
143
+ .metric-card strong { font-size: 32px; font-weight: 650; font-variant-numeric: tabular-nums; }
144
+ .metric-card > span { font-size: 13px; }
145
+ .metric-source-list { gap: 4px 10px; margin-top: 8px; }
146
+ .metric-source-chip { padding: 0; border: 0; background: none; font-size: 12px; font-weight: 450; }
147
+ .key-value-list { gap: 12px; }
148
+ .key-value-row { font-size: 13px; }
149
+ .key-value-row strong { font-weight: 550; }
150
+ .retry-control-card { border-radius: 10px; box-shadow: none; }
151
+ .retry-help { margin: 0; font-size: 12px; }
152
+ .timeline-row { min-height: 40px; }
153
+ .timeline-index { width: 24px; height: 24px; }
154
+ .table-wrap { border-color: var(--border); border-radius: 8px; }
155
+ .data-table { font-size: 13px; }
156
+ .data-table th { color: var(--text-soft); font-weight: 550; background: var(--surface-soft); }
157
+ .data-table td { padding: 12px; background: var(--surface); }
158
+ .data-table tbody tr:hover td { background: var(--surface-soft); }
159
+ .region-stat-grid { display: flex; flex-wrap: wrap; gap: 8px; }
160
+ .region-stat-card { display: flex; align-items: center; gap: 12px; padding: 8px 12px; border-radius: 6px; }
161
+ .region-stat-card strong { font-size: 15px; }
162
+ .subscription-primary { font-size: 14px; border-radius: 8px; }
163
+ .subscriptions-primary-panel .action-grid { display: flex; gap: 8px; }
164
+ .slim-panel .qr-block { background: #fff; width: fit-content; margin-inline: auto; }
165
+ .log-toolbar .btn-secondary { color: var(--text); }
166
+ .log-toolbar .subtab { color: var(--terminal-text); }
167
+ .log-toolbar .subtab.active { color: #fff; background: #4b4dcc; }
168
+ .terminal-output, .terminal-panel { border-radius: 10px; }
169
+ #logCenterTable { overflow-anchor: none; }
170
+ body[data-page="logs"] #logsWorkspace > .panel { grid-template-rows: auto minmax(0, 1fr); }
171
+ .log-state-actions { display: flex; align-items: center; gap: 8px; }
172
+ .log-state-actions:empty { display: none; }
173
+ /* Entries name the editor once. Supporting values use a quieter type level
174
+ instead of a second headline and permanent instructions. */
175
+ .settings-overview-panel { padding: 0; background: transparent; border: 0; }
176
+ .settings-overview-grid { gap: 12px; }
177
+ .settings-overview-card { min-height: 84px; padding: 16px; border-radius: 10px; background: var(--surface); box-shadow: none; display: grid; grid-template-columns: 36px minmax(0, 1fr) 16px; align-items: center; gap: 12px; }
178
+ .settings-overview-card:hover { box-shadow: none; border-color: var(--accent); }
179
+ .settings-card-icon { color: var(--accent); width: 36px; height: 36px; display: grid; place-items: center; background: var(--accent-soft); border-radius: 8px; }
180
+ .settings-card-copy { display: grid; gap: 5px; min-width: 0; }
181
+ .settings-card-kicker { color: var(--text); font-size: 14px; letter-spacing: 0; font-weight: 600; }
182
+ .settings-card-summary { color: var(--text-soft); font-size: 12px; line-height: 1.5; letter-spacing: 0; }
183
+ .settings-card-arrow { color: var(--text-soft); width: 16px; }
184
+ .appearance-panel { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding-block: 14px; }
185
+ .appearance-panel h3 { margin: 0; display: flex; align-items: center; gap: 10px; font-size: 14px; font-weight: 600; }
186
+ .appearance-panel h3 .ui-icon { color: var(--text-soft); width: 18px; }
187
+ .theme-choices { display: flex; padding: 3px; gap: 3px; background: var(--surface-muted); border-radius: 8px; }
188
+ .theme-choice { min-height: 34px; padding: 0 12px; color: var(--text-soft); font-size: 12px; border-radius: 6px; }
189
+ .theme-choice .ui-icon { width: 16px; height: 16px; }
190
+ .theme-choice[aria-pressed="true"] { background: var(--surface); color: var(--accent); box-shadow: var(--shadow); }
191
+ .account-pool-panel { gap: 14px; }
192
+ .account-pool-summary { display: flex; flex-wrap: wrap; align-items: center; gap: 16px; padding: 12px 0; background: transparent; border: 0; border-radius: 0; }
193
+ .account-pool-total strong { font-size: 28px; }
194
+ .account-pool-status-grid { display: flex; flex-wrap: wrap; gap: 16px; margin-left: auto; }
195
+ .account-pool-stat { display: flex; align-items: center; gap: 6px; padding: 0; border-radius: 0; background: transparent; }
196
+ .account-pool-stat strong { font-size: 14px; }
197
+ .account-pool-brands { gap: 8px; }
198
+ .account-brand-chip { padding: 4px 8px; border-radius: 6px; }
199
+ .account-pool-meter { flex: 1 0 100%; height: 3px; }
200
+ .account-pool-expiry { font-size: 12px; }
201
+ .account-pool-headline .panel-subcopy { display: none; }
202
+ .account-pool-headline { align-items: center; margin-bottom: 0; }
203
+ .account-pool-toolbar input, .account-pool-toolbar select { min-height: 36px; }
204
+ .settings-drawer-panel { width: min(800px, calc(100vw - 48px)); max-width: 800px; padding: 24px; border-radius: 14px; background: var(--surface); }
205
+ .settings-drawer-shell[data-section="speed_test"] .settings-drawer-panel { width: min(560px, calc(100vw - 48px)); }
206
+ .settings-drawer-head h3 { font-size: 19px; margin: 4px 0; letter-spacing: -.02em; }
207
+ .settings-drawer-shell[data-section="speed_test"] .compact-form-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
208
+ .settings-drawer-shell[data-section="speed_test"] .field input { width: 100%; max-width: 100%; min-height: 36px; }
209
+ .settings-drawer-shell[data-section="deploy"] .compact-form-grid { grid-template-columns: minmax(0, 1fr) 140px; }
210
+ .field > span, .source-field > span { font-size: 12px; line-height: 1.5; }
211
+ .settings-drawer-actions { padding-top: 4px; gap: 8px; }
212
+ /* The old extra scrollbar padding shifted fields left of footer buttons. */
213
+ .settings-drawer-body { padding-right: 0; }
214
+ .settings-drawer-shell[data-section="sources"] .settings-drawer-panel { width: min(1080px, calc(100vw - 48px)); }
215
+ .subscription-tab-scroller { gap: 4px; padding: 4px; margin-bottom: 0; border-radius: 8px; }
216
+ .subscription-tab-scroller .subtab { min-width: 0; flex: 1 1 0; white-space: nowrap; padding-inline: 8px; border-radius: 6px; font-size: 13px; }
217
+ .subscription-tab-scroller .subtab.active { box-shadow: none; }
218
+ .field-wide { grid-column: 1 / -1; }
219
+ .context-help { color: var(--text-soft); font-size: 12px; line-height: 1.7; }
220
+ .context-help summary { cursor: pointer; width: fit-content; }
221
+ .context-help[open] summary { margin-bottom: 10px; }
222
+ .context-help p { margin: 6px 0 0; }
223
+ .source-drawer-settings-copy, .source-drawer-notice { border: 0; padding: 0; background: transparent; }
224
+ .source-drawer-settings-copy strong { display: none; }
225
+ .source-round-summary { display: none; }
226
+ .table-textarea { min-height: 64px; }
227
+ /* Tables keep native semantics; handles supplement existing keyboard and
228
+ touch controls rather than replacing horizontal scrolling. */
229
+ [data-column-table] { table-layout: fixed; min-width: 100%; border-collapse: collapse; }
230
+ [data-column-table] th { position: relative; padding: 10px 12px 10px 4px; }
231
+ [data-column-table] td { overflow-wrap: anywhere; }
232
+ .column-heading { display: flex; align-items: center; gap: 4px; white-space: nowrap; }
233
+ .column-grip { width: 20px; height: 24px; padding: 0; color: var(--text-soft); cursor: grab; opacity: .55; }
234
+ .column-grip .ui-icon { width: 14px; height: 18px; }
235
+ .column-grip:hover, .column-grip:focus-visible { opacity: 1; color: var(--accent); }
236
+ .column-resize { position: absolute; right: 0; top: 0; bottom: 0; width: 8px; cursor: col-resize; touch-action: none; z-index: 1; }
237
+ .column-resize::after { content: ''; position: absolute; left: 4px; width: 2px; top: 10px; bottom: 10px; background: var(--border-strong); }
238
+ .column-resize:hover::after, .column-resize:focus-visible::after { background: var(--accent); }
239
+ .is-dragging { opacity: .45; }
240
+ .is-resizing { user-select: none; }
241
+ .table-tools { display: flex; align-items: center; justify-content: flex-end; margin: -8px 0 10px; position: relative; z-index: 2; }
242
+ .node-list-heading { margin-bottom: 0; min-height: 24px; align-items: center; }
243
+ .node-list-heading + .table-tools { margin-top: -28px; }
244
+ .artifact-card { padding-block: 14px; }
245
+ .artifact-card > div:first-child { min-width: 0; }
246
+ .artifact-card strong.mono { display: block; margin-top: 0; padding: 0; border: 0; border-radius: 0; background: transparent; font-size: 12px; font-weight: 450; color: var(--text-soft); }
247
+ .column-options { position: relative; }
248
+ .column-options > summary { list-style: none; cursor: pointer; display: flex; gap: 6px; align-items: center; min-height: 32px; padding: 0 8px; border-radius: 6px; color: var(--text-soft); font-size: 12px; }
249
+ .column-options > summary::-webkit-details-marker { display: none; }
250
+ .column-options > summary .ui-icon { width: 16px; height: 16px; }
251
+ .column-options[open] > summary, .column-options > summary:hover { background: var(--surface-muted); color: var(--accent); }
252
+ .column-options-body { position: absolute; right: 0; top: calc(100% + 6px); width: 330px; max-width: calc(100vw - 64px); padding: 14px; display: flex; flex-direction: column; gap: 8px; background: var(--surface); border: 1px solid var(--border); border-radius: 10px; box-shadow: 0 8px 24px rgb(0 0 0 / 12%); }
253
+ .column-options-heading { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 12px; color: var(--text-soft); margin-bottom: 4px; order: -1; }
254
+ .column-option { display: grid; align-items: center; grid-template-columns: minmax(64px, 1fr) 36px 36px 78px; gap: 6px; font-size: 12px; }
255
+ .column-width input { min-height: 36px; padding: 0 6px; width: 100%; font-variant-numeric: tabular-nums; }
256
+ /* Thumb paint changes only during activity, without changing layout width.
257
+ Focus and system contrast settings retain a visible scrolling affordance. */
258
+ * { scrollbar-color: transparent transparent; }
259
+ :is(.page-content, .table-wrap, .settings-drawer-body, .terminal-output, .timeline, .calendar-scroll)::-webkit-scrollbar { width: 4px; height: 4px; }
260
+ :is(.page-content, .table-wrap, .settings-drawer-body, .terminal-output, .timeline, .calendar-scroll)::-webkit-scrollbar-track, :is(.page-content, .table-wrap, .settings-drawer-body, .terminal-output, .timeline, .calendar-scroll)::-webkit-scrollbar-corner { background: transparent; }
261
+ :is(.page-content, .table-wrap, .settings-drawer-body, .terminal-output, .timeline, .calendar-scroll)::-webkit-scrollbar-thumb { background: transparent; border-radius: 8px; }
262
+ [data-scroll-active], .table-wrap:focus-visible, .terminal-output:focus-visible, .page-content:focus-visible { scrollbar-color: var(--scroll-thumb) transparent; }
263
+ [data-scroll-active]::-webkit-scrollbar-thumb, :focus-visible::-webkit-scrollbar-thumb, ::-webkit-scrollbar-thumb:active { background: var(--scroll-thumb); }
264
+ @supports selector(::-webkit-scrollbar) { * { scrollbar-width: auto; scrollbar-color: auto; } }
265
+ @supports not selector(::-webkit-scrollbar) { * { scrollbar-width: thin; } }
266
+ @media (min-width: 961px) {
267
+ .topbar { grid-template-columns: minmax(0, 1fr) auto; }
268
+ .topbar { min-height: 36px; }
269
+ #runsWorkspace .mobile-run-bar { position: static; width: auto; padding: 0; margin: 0 0 0 8px; border: 0; box-shadow: none; background: transparent; display: flex; align-items: center; gap: 8px; }
270
+ #runsWorkspace .mobile-run-bar .btn { min-width: 0; }
271
+ .workspace-shell { grid-template-columns: 184px minmax(0, 1fr); }
272
+ .sidebar { padding: 22px 14px; gap: 26px; background: var(--surface); }
273
+ .sidebar { grid-template-rows: auto minmax(0, 1fr) auto; }
274
+ .sidebar-toggle { justify-self: start; }
275
+ :root[data-sidebar-collapsed="true"] .workspace-shell { grid-template-columns: 72px minmax(0, 1fr); }
276
+ :root[data-sidebar-collapsed="true"] .sidebar { padding-inline: 10px; }
277
+ :root[data-sidebar-collapsed="true"] .sidebar-brand { justify-content: center; padding-inline: 0; }
278
+ :root[data-sidebar-collapsed="true"] .brand-copy, :root[data-sidebar-collapsed="true"] .nav-copy { display: none; }
279
+ :root[data-sidebar-collapsed="true"] .nav-item { justify-content: center; padding-inline: 0; }
280
+ :root[data-sidebar-collapsed="true"] .sidebar-toggle { justify-self: center; }
281
+ .sidebar-brand { gap: 10px; padding: 4px 6px; justify-content: flex-start; }
282
+ .brand-mark { width: 32px; height: 32px; border-radius: 8px; }
283
+ .sidebar-title { font-size: 15px; display: block; }
284
+ .sidebar-version { font-size: 11px; display: block; }
285
+ .sidebar-nav { gap: 6px; }
286
+ .nav-item { min-height: 44px; min-width: 0; gap: 10px; padding: 0 12px; border-radius: 8px; justify-content: flex-start; }
287
+ .nav-item.active, .nav-item:hover { background: var(--accent-soft); box-shadow: none; }
288
+ .nav-icon { min-width: 20px; width: 20px; height: 20px; border: 0; border-radius: 0; background: none; }
289
+ .nav-copy { display: block; font-size: 13px; font-weight: 550; }
290
+ .metric-grid.four { grid-template-columns: repeat(4, minmax(0, 1fr)); }
291
+ }
292
+ @media (min-width: 721px) and (max-width: 960px) {
293
+ /* A native frame clips its children. Bound the tablet grid and scroll the
294
+ main pane, rather than letting a tall page grow behind that frame. */
295
+ body { overflow: hidden; }
296
+ .workspace-shell { height: 100%; min-height: 0; grid-template-rows: auto minmax(0, 1fr); }
297
+ .main-shell { min-height: 0; }
298
+ .sidebar { display: flex; align-items: center; gap: 12px; background: var(--surface); padding: 10px 12px; }
299
+ .sidebar-brand { display: flex; flex: none; padding: 0; }
300
+ .sidebar-brand .brand-mark { width: 32px; height: 32px; border-radius: 8px; }
301
+ .sidebar-brand .brand-copy { display: none; }
302
+ .sidebar-nav { display: flex; flex: 1; min-width: 0; gap: 4px; padding: 0; }
303
+ .nav-item { flex: 1; min-width: 0; justify-content: center; gap: 8px; padding-inline: 8px; }
304
+ .nav-icon { min-width: 24px; width: 24px; height: 24px; border: 0; background: none; }
305
+ .nav-copy { font-size: 13px; }
306
+ .nav-item.active { background: var(--accent-soft); }
307
+ .main-shell { padding: 20px; }
308
+ .metric-grid.four { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px 0; }
309
+ .metric-card:nth-child(3) { border-left: 0; }
310
+ }
311
+ @media (max-width: 960px) {
312
+ .analytics-distributions { grid-template-columns: 1fr; }
313
+ .sidebar-toggle { display: none; }
314
+ .btn, .btn.small, .btn.icon-only, .icon-btn, .theme-choice, input, select, textarea { min-height: 44px; }
315
+ .btn.icon-only, .icon-btn { width: 44px; min-width: 44px; height: 44px; }
316
+ .account-pool-toolbar input, .account-pool-toolbar select { min-height: 44px; }
317
+ .column-option { grid-template-columns: minmax(48px, 1fr) 44px 44px 76px; gap: 4px; }
318
+ .column-options > summary { min-height: 44px; }
319
+ }
320
+ @media (max-width: 720px) {
321
+ .distribution-layout { grid-template-columns: 120px minmax(0, 1fr); gap: 10px; }
322
+ .analytics-distribution [data-donut-legend] { padding-inline: 6px; }
323
+ .account-pool-table-wrap { max-height: none; }
324
+ .sidebar-nav { grid-template-columns: repeat(5, minmax(0, 1fr)); }
325
+ .results-subscription-card { flex-wrap: wrap; gap: 12px; }
326
+ .results-subscription-card .subscription-primary { flex-basis: 100%; }
327
+ .subscription-actions { margin-left: auto; }
328
+ body { background: var(--bg); }
329
+ .main-shell { padding: max(12px, var(--safe-area-top)) max(12px, var(--safe-area-right)) 18px max(12px, var(--safe-area-left)); }
330
+ .sidebar { background: var(--surface); }
331
+ .nav-icon { border: 0; background: none; min-width: 24px; height: 24px; }
332
+ .nav-icon .ui-icon { width: 19px; height: 19px; }
333
+ .nav-item.active { background: var(--accent-soft); box-shadow: none; }
334
+ .topbar-heading h1 { font-size: 19px; }
335
+ .topbar { gap: 12px; }
336
+ .run-options .checkbox-chip { min-height: 44px; }
337
+ .run-icon-controls .btn { min-width: 44px; min-height: 44px; }
338
+ .run-stage-heading .mobile-run-bar { margin: 0; width: auto; left: auto; right: 12px; display: flex; }
339
+ .timeline { max-height: 420px; }
340
+ .panel { padding: 16px; }
341
+ .metric-grid.four { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px 0; }
342
+ .metric-card { padding-inline: 14px; }
343
+ .metric-card:nth-child(3) { border-left: 0; }
344
+ .settings-overview-panel { padding: 0; }
345
+ .settings-overview-grid { grid-template-columns: 1fr; gap: 8px; }
346
+ .settings-overview-card { min-height: 76px; padding: 12px; }
347
+ .appearance-panel { flex-wrap: wrap; gap: 12px; }
348
+ .theme-choices { width: 100%; }
349
+ .theme-choice { flex: 1; padding-inline: 8px; }
350
+ .account-pool-status-grid { margin-left: 0; }
351
+ .settings-drawer-panel, .settings-drawer-shell[data-section] .settings-drawer-panel { width: 100vw; max-width: none; padding: 0; border-radius: 0; background: var(--surface); }
352
+ .settings-drawer-actions { background: var(--surface); }
353
+ .settings-drawer-shell[data-section="speed_test"] .compact-form-grid { grid-template-columns: 1fr; }
354
+ .settings-drawer-shell[data-section="deploy"] .compact-form-grid { grid-template-columns: 1fr; }
355
+ .settings-drawer-shell[data-section="speed_test"] .field input { width: 100%; min-height: 44px; }
356
+ .field-wide { grid-column: auto; }
357
+ [data-column-table] { min-width: 0; width: 100% !important; }
358
+ .decoded-node-table td { padding: 0; }
359
+ .account-pool-table td { padding: 6px 0; }
360
+ [data-column-table] colgroup { display: none; }
361
+ .column-options-body { max-width: calc(100vw - 56px); padding: 10px; }
362
+ .settings-drawer-body .icon-only { width: 44px; }
363
+ input, select, textarea { font-size: 16px; }
364
+ .subscription-tab-scroller .subtab { min-width: 0; flex: 1 1 0; font-size: 12px; padding-inline: 4px; }
365
+ .log-toolbar { display: flex; flex-direction: column; align-items: stretch; gap: 8px; }
366
+ .log-toolbar .toolbar-left { display: flex; flex-wrap: nowrap; gap: 4px; }
367
+ .log-toolbar .subtab { min-width: 0; flex: 1; padding-inline: 4px; font-size: 12px; }
368
+ .log-toolbar .toolbar-right { display: flex; flex-direction: row; justify-content: flex-end; align-items: center; gap: 8px; }
369
+ .log-toolbar .log-utility-actions, .log-toolbar .log-destructive-actions { display: flex; flex-direction: row; width: auto; margin: 0; padding: 0; border: 0; }
370
+ .log-toolbar .log-destructive-actions { padding-left: 8px; border-left: 1px solid var(--border-strong); }
371
+ }
372
+ @media (forced-colors: active) {
373
+ * { scrollbar-color: ButtonText Canvas; scrollbar-width: auto; }
374
+ :is(.page-content, .table-wrap, .settings-drawer-body, .terminal-output, .timeline, .calendar-scroll)::-webkit-scrollbar-thumb { background: ButtonText; }
375
+ :is(.page-content, .table-wrap, .settings-drawer-body, .terminal-output, .timeline, .calendar-scroll)::-webkit-scrollbar-track { background: Canvas; }
376
+ .theme-choice[aria-pressed="true"], .nav-item.active { outline: 1px solid Highlight; }
377
+ .column-resize::after { background: ButtonText; }
378
+ }
379
+ @media (prefers-reduced-motion: reduce) {
380
+ *, *::before, *::after { transition: none !important; scroll-behavior: auto !important; }
381
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swimmingliu/autovpn",
3
- "version": "1.8.0",
3
+ "version": "2.0.2",
4
4
  "description": "npm wrapper for the AutoVPN headless CLI",
5
5
  "type": "module",
6
6
  "repository": {
@@ -22,7 +22,7 @@
22
22
  "scripts": {
23
23
  "build": "node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.json && node scripts/copy-web-assets.mjs",
24
24
  "prepack": "npm run build",
25
- "test": "npm run build && node --test test/*.test.mjs test/doctor/*.test.mjs test/jobs/*.test.mjs test/pipeline/*.test.mjs test/runtime/*.test.mjs test/server/*.test.mjs"
25
+ "test": "npm run build && node --test test/*.test.mjs test/doctor/*.test.mjs test/jobs/*.test.mjs test/pool/*.test.mjs test/pipeline/*.test.mjs test/runtime/*.test.mjs test/server/*.test.mjs"
26
26
  },
27
27
  "engines": {
28
28
  "node": ">=22.5.0"
@@ -35,6 +35,7 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "@iarna/toml": "^2.2.5",
38
- "qrcode": "^1.5.4"
38
+ "qrcode": "^1.5.4",
39
+ "undici": "7.30.2"
39
40
  }
40
41
  }