minitest2.0 0.0.5 → 0.0.7

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.
@@ -1,26 +1,580 @@
1
+ <script setup lang="ts">
2
+ defineOptions({ name: 'WarningPage' })
3
+
4
+ type WarningDetail = {
5
+ title: string
6
+ status: string
7
+ id: string
8
+ time: string
9
+ type: string
10
+ source: string
11
+ messagePrefix: string
12
+ amount: string
13
+ messageSuffix: string
14
+ }
15
+
16
+ const warningDetail: WarningDetail = {
17
+ title: '净借记限额预警',
18
+ status: '有效',
19
+ id: '167749751028801',
20
+ time: '2026-07-07 17:33:50',
21
+ type: '净借记限额预警',
22
+ source: '头寸预警',
23
+ messagePrefix: '小额可用净借记限额余额低于',
24
+ amount: '60000亿元',
25
+ messageSuffix: '!',
26
+ }
27
+
28
+ const detailRows = [
29
+ { label: '预警ID', value: warningDetail.id, icon: 'description' },
30
+ { label: '预警时间', value: warningDetail.time, icon: 'clock-o' },
31
+ { label: '预警类型', value: warningDetail.type, icon: 'apps-o' },
32
+ ]
33
+ </script>
34
+
1
35
  <template>
2
- <main class="page">
3
- <section class="page-body">
4
- <p class="placeholder">页面建设中…</p>
36
+ <main class="warning-page">
37
+ <section class="warning-hero" aria-label="预警信息查询">
38
+ <div class="hero-alert" aria-hidden="true">
39
+ <span class="shield-mark shield-mark--large"></span>
40
+ <span class="alert-underline"></span>
41
+ </div>
42
+
43
+ <div class="hero-copy">
44
+ <h1>预警信息查询</h1>
45
+ <p>及时掌握头寸预警信息,防范资金风险</p>
46
+ </div>
47
+
48
+ <div class="hero-scene" aria-hidden="true">
49
+ <span class="bank-roof"></span>
50
+ <span class="bank-base"></span>
51
+ <span class="bank-step"></span>
52
+ <span class="bank-column bank-column--1"></span>
53
+ <span class="bank-column bank-column--2"></span>
54
+ <span class="bank-column bank-column--3"></span>
55
+ <span class="bank-column bank-column--4"></span>
56
+ <span class="shield-mark shield-mark--small"></span>
57
+ </div>
5
58
  </section>
59
+
60
+ <section class="warning-detail" aria-labelledby="warning-detail-title">
61
+ <div class="section-title">
62
+ <span class="section-title-mark"></span>
63
+ <h2 id="warning-detail-title">预警详情</h2>
64
+ </div>
65
+
66
+ <article class="warning-card" aria-label="净借记限额预警详情">
67
+ <header class="warning-card-header">
68
+ <span class="bank-badge" aria-hidden="true">
69
+ <van-icon name="hotel-o" />
70
+ </span>
71
+ <h3>{{ warningDetail.title }}</h3>
72
+ <span class="status-badge">{{ warningDetail.status }}</span>
73
+ </header>
74
+
75
+ <dl class="warning-fields">
76
+ <div v-for="row in detailRows" :key="row.label" class="warning-field-row">
77
+ <dt>
78
+ <span class="field-icon" aria-hidden="true">
79
+ <van-icon :name="row.icon" />
80
+ </span>
81
+ <span>{{ row.label }}</span>
82
+ </dt>
83
+ <dd>{{ row.value }}</dd>
84
+ </div>
85
+ </dl>
86
+
87
+ <section class="warning-message" aria-label="预警内容">
88
+ <span class="message-icon" aria-hidden="true">
89
+ <van-icon name="warning-o" />
90
+ </span>
91
+ <div class="message-copy">
92
+ <strong>{{ warningDetail.source }}</strong>
93
+ <p>
94
+ {{ warningDetail.messagePrefix }}<em>{{ warningDetail.amount }}</em
95
+ >{{ warningDetail.messageSuffix }}
96
+ </p>
97
+ </div>
98
+ </section>
99
+ </article>
100
+ </section>
101
+
102
+ <p class="end-text" aria-label="列表结束">
103
+ <span></span>
104
+ 已到底,没有更多数据
105
+ <span></span>
106
+ </p>
6
107
  </main>
7
108
  </template>
8
109
 
9
110
  <style scoped>
10
- .page {
111
+ .warning-page {
112
+ width: 100%;
11
113
  max-width: 750px;
12
114
  min-height: var(--app-page-min-height, 100vh);
13
115
  margin: 0 auto;
14
- padding: 0 11px;
15
- background: #f7f8fa;
116
+ padding-bottom: calc(env(safe-area-inset-bottom, 0px) + 40px);
117
+ color: #171b20;
118
+ background:
119
+ radial-gradient(circle at 86% 8%, rgba(255, 223, 226, 0.8), transparent 94px),
120
+ linear-gradient(180deg, #fff6f6 0, #ffffff 178px, #ffffff 100%);
121
+ box-sizing: border-box;
122
+ }
123
+
124
+ .warning-hero {
125
+ position: relative;
126
+ display: grid;
127
+ grid-template-columns: 78px minmax(0, 1fr);
128
+ min-height: 120px;
129
+ overflow: hidden;
130
+ padding: 27px 17px 18px;
131
+ border-top: 1px solid #ffe1e2;
132
+ background:
133
+ linear-gradient(160deg, rgba(255, 255, 255, 0.92) 0%, rgba(255, 242, 243, 0.55) 100%),
134
+ linear-gradient(
135
+ 100deg,
136
+ rgba(255, 255, 255, 0) 0 68%,
137
+ rgba(255, 85, 94, 0.08) 68% 76%,
138
+ transparent 76%
139
+ );
140
+ box-sizing: border-box;
141
+ }
142
+
143
+ .warning-hero::after {
144
+ position: absolute;
145
+ right: -28px;
146
+ top: 11px;
147
+ width: 160px;
148
+ height: 98px;
149
+ background:
150
+ linear-gradient(155deg, transparent 0 42%, rgba(255, 92, 99, 0.08) 42% 54%, transparent 54%),
151
+ linear-gradient(24deg, transparent 0 38%, rgba(255, 92, 99, 0.08) 38% 50%, transparent 50%);
152
+ content: '';
153
+ pointer-events: none;
154
+ }
155
+
156
+ .hero-alert {
157
+ position: relative;
158
+ z-index: 1;
159
+ min-width: 0;
160
+ }
161
+
162
+ .shield-mark {
163
+ position: relative;
164
+ display: block;
165
+ clip-path: polygon(50% 0, 94% 18%, 91% 67%, 50% 100%, 9% 67%, 6% 18%);
166
+ background: linear-gradient(145deg, #ff5e64 0%, #ee1f2b 64%, #f7434b 100%);
167
+ box-shadow: 0 8px 18px rgba(238, 31, 43, 0.18);
168
+ }
169
+
170
+ .shield-mark::before {
171
+ position: absolute;
172
+ left: 50%;
173
+ top: 23%;
174
+ width: 5px;
175
+ height: 21px;
176
+ border-radius: 999px;
177
+ background: #ffffff;
178
+ content: '';
179
+ transform: translateX(-50%);
180
+ }
181
+
182
+ .shield-mark::after {
183
+ position: absolute;
184
+ left: 50%;
185
+ bottom: 22%;
186
+ width: 7px;
187
+ height: 7px;
188
+ border-radius: 50%;
189
+ background: #ffffff;
190
+ content: '';
191
+ transform: translateX(-50%);
192
+ }
193
+
194
+ .shield-mark--large {
195
+ width: 34px;
196
+ height: 40px;
197
+ }
198
+
199
+ .alert-underline {
200
+ display: block;
201
+ width: 36px;
202
+ height: 4px;
203
+ margin-top: 18px;
204
+ border-radius: 999px;
205
+ background: linear-gradient(90deg, #ff202b 0%, #ff696e 100%);
206
+ box-shadow: 0 5px 12px rgba(255, 42, 50, 0.18);
207
+ }
208
+
209
+ .hero-copy {
210
+ position: relative;
211
+ z-index: 1;
212
+ min-width: 0;
213
+ padding-top: 2px;
214
+ }
215
+
216
+ .hero-copy h1 {
217
+ margin: 0;
218
+ color: #181d22;
219
+ font-size: 24px;
220
+ font-weight: 800;
221
+ line-height: 1.18;
222
+ letter-spacing: 0;
223
+ }
224
+
225
+ .hero-copy p {
226
+ margin: 9px 0 0;
227
+ color: #73777f;
228
+ font-size: 13px;
229
+ font-weight: 500;
230
+ line-height: 1.45;
231
+ }
232
+
233
+ .hero-scene {
234
+ position: absolute;
235
+ right: 18px;
236
+ top: 26px;
237
+ z-index: 0;
238
+ width: 92px;
239
+ height: 68px;
240
+ opacity: 0.62;
241
+ }
242
+
243
+ .bank-roof {
244
+ position: absolute;
245
+ left: 16px;
246
+ top: 0;
247
+ width: 67px;
248
+ height: 20px;
249
+ clip-path: polygon(50% 0, 100% 72%, 100% 100%, 0 100%, 0 72%);
250
+ background: linear-gradient(180deg, rgba(250, 85, 94, 0.32), rgba(250, 85, 94, 0.14));
251
+ }
252
+
253
+ .bank-base,
254
+ .bank-step {
255
+ position: absolute;
256
+ right: 0;
257
+ border-radius: 3px;
258
+ background: rgba(247, 86, 94, 0.2);
259
+ }
260
+
261
+ .bank-base {
262
+ bottom: 12px;
263
+ width: 78px;
264
+ height: 8px;
265
+ }
266
+
267
+ .bank-step {
268
+ bottom: 3px;
269
+ width: 92px;
270
+ height: 6px;
271
+ }
272
+
273
+ .bank-column {
274
+ position: absolute;
275
+ top: 25px;
276
+ width: 11px;
277
+ height: 31px;
278
+ border-radius: 3px 3px 0 0;
279
+ background: rgba(247, 86, 94, 0.18);
280
+ }
281
+
282
+ .bank-column--1 {
283
+ left: 25px;
284
+ }
285
+
286
+ .bank-column--2 {
287
+ left: 42px;
288
+ }
289
+
290
+ .bank-column--3 {
291
+ left: 59px;
292
+ }
293
+
294
+ .bank-column--4 {
295
+ left: 76px;
296
+ }
297
+
298
+ .shield-mark--small {
299
+ position: absolute;
300
+ left: 0;
301
+ bottom: 0;
302
+ width: 31px;
303
+ height: 36px;
304
+ opacity: 0.78;
305
+ }
306
+
307
+ .shield-mark--small::before {
308
+ width: 4px;
309
+ height: 17px;
310
+ }
311
+
312
+ .shield-mark--small::after {
313
+ width: 6px;
314
+ height: 6px;
315
+ }
316
+
317
+ .warning-detail {
318
+ padding: 22px 17px 0;
319
+ }
320
+
321
+ .section-title {
322
+ display: flex;
323
+ align-items: center;
324
+ gap: 8px;
325
+ height: 24px;
326
+ }
327
+
328
+ .section-title-mark {
329
+ width: 4px;
330
+ height: 17px;
331
+ border-radius: 999px;
332
+ background: linear-gradient(180deg, #ff1f2b 0%, #ff4c53 100%);
333
+ }
334
+
335
+ .section-title h2 {
336
+ margin: 0;
337
+ color: #151a20;
338
+ font-size: 17px;
339
+ font-weight: 800;
340
+ line-height: 1;
341
+ }
342
+
343
+ .warning-card {
344
+ margin-top: 18px;
345
+ padding: 18px 13px 15px;
346
+ border: 1px solid #eceef2;
347
+ border-radius: 9px;
348
+ background: rgba(255, 255, 255, 0.98);
349
+ box-shadow:
350
+ 0 13px 24px rgba(31, 37, 51, 0.08),
351
+ 0 2px 6px rgba(31, 37, 51, 0.04);
352
+ box-sizing: border-box;
353
+ }
354
+
355
+ .warning-card-header {
356
+ display: grid;
357
+ grid-template-columns: 46px minmax(0, 1fr) auto;
358
+ align-items: center;
359
+ gap: 12px;
360
+ padding-bottom: 17px;
361
+ border-bottom: 1px dashed #e4e5e9;
16
362
  }
17
- .page-body {
18
- padding: 24px 0;
363
+
364
+ .bank-badge {
365
+ display: inline-flex;
366
+ align-items: center;
367
+ justify-content: center;
368
+ width: 40px;
369
+ height: 40px;
370
+ border-radius: 50%;
371
+ color: #f23a41;
372
+ font-size: 25px;
373
+ background: #ffe7e9;
374
+ }
375
+
376
+ .warning-card-header h3 {
377
+ min-width: 0;
378
+ margin: 0;
379
+ color: #161b21;
380
+ font-size: 16px;
381
+ font-weight: 800;
382
+ line-height: 1.2;
383
+ overflow-wrap: anywhere;
384
+ }
385
+
386
+ .status-badge {
387
+ display: inline-flex;
388
+ align-items: center;
389
+ justify-content: center;
390
+ min-width: 47px;
391
+ min-height: 31px;
392
+ padding: 0 9px;
393
+ border: 1px solid #ffb8bb;
394
+ border-radius: 4px;
395
+ color: #ed2832;
396
+ font-size: 16px;
397
+ font-weight: 500;
398
+ line-height: 1;
399
+ background: #fff0f1;
400
+ box-sizing: border-box;
401
+ }
402
+
403
+ .warning-fields {
404
+ margin: 0;
405
+ padding: 14px 0 7px;
406
+ }
407
+
408
+ .warning-field-row {
409
+ display: grid;
410
+ grid-template-columns: minmax(0, 112px) minmax(0, 1fr);
411
+ align-items: center;
412
+ min-height: 46px;
413
+ column-gap: 12px;
414
+ }
415
+
416
+ .warning-field-row + .warning-field-row {
417
+ border-top: 1px solid #edf0f2;
418
+ }
419
+
420
+ .warning-field-row dt {
421
+ display: flex;
422
+ align-items: center;
423
+ min-width: 0;
424
+ margin: 0;
425
+ color: #666b73;
426
+ font-size: 15px;
427
+ font-weight: 500;
428
+ line-height: 1.2;
429
+ }
430
+
431
+ .field-icon {
432
+ display: inline-flex;
433
+ align-items: center;
434
+ justify-content: center;
435
+ width: 28px;
436
+ height: 28px;
437
+ flex: 0 0 28px;
438
+ margin-right: 12px;
439
+ border-radius: 8px;
440
+ color: #ffffff;
441
+ font-size: 17px;
442
+ background: linear-gradient(145deg, #aeb3bd, #858b96);
19
443
  }
20
- .placeholder {
21
- text-align: center;
22
- color: #969799;
444
+
445
+ .warning-field-row dd {
446
+ min-width: 0;
447
+ margin: 0;
448
+ color: #131820;
449
+ font-size: 15px;
450
+ font-weight: 500;
451
+ line-height: 1.25;
452
+ text-align: right;
453
+ overflow-wrap: anywhere;
454
+ }
455
+
456
+ .warning-message {
457
+ display: grid;
458
+ grid-template-columns: 39px minmax(0, 1fr);
459
+ gap: 10px;
460
+ min-height: 68px;
461
+ margin-top: 4px;
462
+ padding: 14px 12px 12px;
463
+ border: 1px solid #ffbdc1;
464
+ border-radius: 7px;
465
+ background:
466
+ radial-gradient(circle at 95% 82%, rgba(255, 229, 231, 0.74), transparent 72px),
467
+ linear-gradient(135deg, #fffafa 0%, #fff4f4 100%);
468
+ box-sizing: border-box;
469
+ }
470
+
471
+ .message-icon {
472
+ display: inline-flex;
473
+ align-items: center;
474
+ justify-content: center;
475
+ width: 32px;
476
+ height: 42px;
477
+ color: #f23a41;
478
+ font-size: 29px;
479
+ }
480
+
481
+ .message-copy {
482
+ min-width: 0;
483
+ }
484
+
485
+ .message-copy strong {
486
+ display: block;
487
+ color: #e23239;
488
+ font-size: 15px;
489
+ font-weight: 740;
490
+ line-height: 1.25;
491
+ }
492
+
493
+ .message-copy p {
494
+ margin: 9px 0 0;
495
+ color: #131820;
496
+ font-size: 16px;
497
+ font-weight: 600;
498
+ line-height: 1.4;
499
+ overflow-wrap: anywhere;
500
+ }
501
+
502
+ .message-copy em {
503
+ color: #e42d36;
504
+ font-style: normal;
505
+ font-weight: 800;
506
+ }
507
+
508
+ .end-text {
509
+ display: flex;
510
+ align-items: center;
511
+ justify-content: center;
512
+ gap: 10px;
513
+ margin: 37px 0 0;
514
+ color: #888d96;
23
515
  font-size: 14px;
24
- padding-top: 120px;
516
+ font-weight: 500;
517
+ line-height: 1;
518
+ }
519
+
520
+ .end-text span {
521
+ width: 23px;
522
+ height: 1px;
523
+ background: #c8cbd1;
524
+ }
525
+
526
+ @media (max-width: 350px) {
527
+ .warning-hero {
528
+ grid-template-columns: 58px minmax(0, 1fr);
529
+ padding-right: 13px;
530
+ padding-left: 13px;
531
+ }
532
+
533
+ .hero-copy h1 {
534
+ font-size: 22px;
535
+ }
536
+
537
+ .hero-scene {
538
+ right: 6px;
539
+ opacity: 0.38;
540
+ }
541
+
542
+ .warning-detail {
543
+ padding-right: 13px;
544
+ padding-left: 13px;
545
+ }
546
+
547
+ .warning-card {
548
+ padding-right: 11px;
549
+ padding-left: 11px;
550
+ }
551
+
552
+ .warning-card-header {
553
+ grid-template-columns: 40px minmax(0, 1fr) auto;
554
+ gap: 9px;
555
+ }
556
+
557
+ .bank-badge {
558
+ width: 36px;
559
+ height: 36px;
560
+ font-size: 22px;
561
+ }
562
+
563
+ .warning-field-row {
564
+ grid-template-columns: minmax(0, 104px) minmax(0, 1fr);
565
+ }
566
+
567
+ .warning-field-row dt,
568
+ .warning-field-row dd {
569
+ font-size: 14px;
570
+ }
571
+
572
+ .field-icon {
573
+ margin-right: 9px;
574
+ }
575
+
576
+ .message-copy p {
577
+ font-size: 15px;
578
+ }
25
579
  }
26
580
  </style>
package/vite.config.ts CHANGED
@@ -14,6 +14,8 @@ export default defineConfig(({ command, mode }) => {
14
14
  const env = loadEnv(mode, process.cwd(), '')
15
15
  const apiBaseUrl = env.VITE_API_BASE_URL || '/api'
16
16
  const appVersion = getAppVersion(mode, command)
17
+ const enableVueDevTools =
18
+ command === 'serve' && env.VITE_ENABLE_VUE_DEVTOOLS !== 'false'
17
19
 
18
20
  return {
19
21
  base: './',
@@ -22,7 +24,7 @@ export default defineConfig(({ command, mode }) => {
22
24
  },
23
25
  plugins: [
24
26
  vue(),
25
- env.VITE_ENABLE_VUE_DEVTOOLS === 'true' && vueDevTools(),
27
+ enableVueDevTools && vueDevTools(),
26
28
 
27
29
  // 自动导入 Vue / Vue Router / Pinia / VueUse / Vant 的 API,省去手动 import
28
30
  AutoImport({