-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathquiz.html
More file actions
505 lines (485 loc) · 39.3 KB
/
Copy pathquiz.html
File metadata and controls
505 lines (485 loc) · 39.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="测一测:6 问测出你的 AI 修为境界,并诊断你中了哪只心魔,附该境该读的典籍。">
<link rel="canonical" href="https://9jing.top/quiz.html">
<link rel="alternate" hreflang="zh-Hans" href="https://9jing.top/quiz.html">
<link rel="alternate" hreflang="en" href="https://9jing.top/en/quiz.html">
<link rel="alternate" hreflang="x-default" href="https://9jing.top/quiz.html">
<meta property="og:type" content="website">
<meta property="og:site_name" content="几境 · Nine Realms">
<meta property="og:locale" content="zh_CN">
<meta property="og:title" content="测一测 · 几境">
<meta property="og:description" content="测一测:6 问测出你的 AI 修为境界,并诊断你中了哪只心魔,附该境该读的典籍。">
<meta property="og:url" content="https://9jing.top/quiz.html">
<meta property="og:image" content="https://9jing.top/og.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="测一测 · 几境">
<meta name="twitter:description" content="测一测:6 问测出你的 AI 修为境界,并诊断你中了哪只心魔,附该境该读的典籍。">
<meta name="twitter:image" content="https://9jing.top/og.png">
<title>测一测 · 几境</title>
<style>
@font-face{font-family:'MaShanLocal';src:url('fonts/mashanzheng.woff2') format('woff2');font-display:swap}
@font-face{font-family:'SerifLocal';src:url('fonts/notoserifsc.woff2') format('woff2');font-weight:400 500;font-display:swap}
@font-face{font-family:'SerifLocal';src:url('fonts/notoserifsc-bold.woff2') format('woff2');font-weight:600 700;font-display:swap}
@font-face{font-family:'SansLocal';src:url('fonts/notosanssc-light.woff2') format('woff2');font-weight:300;font-display:swap}
@font-face{font-family:'SansLocal';src:url('fonts/notosanssc.woff2') format('woff2');font-weight:400 500;font-display:swap}
</style>
<style>
:root{
--ink:#0d1115;--panel:#171f25;--panel2:#1c252b;--rice:#ece6d6;--rice-dim:#b8b3a4;--muted:#8b938d;
--jade:#5bb295;--jade-d:#3f8f76;--gold:#c9a45c;--gold-l:#e6c074;--cinnabar:#d05f4c;--azure:#6db0c4;
--line:rgba(220,210,185,.12);--serif:'SerifLocal','Songti SC','SimSun',serif;--sans:'SansLocal','PingFang SC','Microsoft YaHei',sans-serif;--brush:'MaShanLocal','Songti SC',cursive;
}
*{margin:0;padding:0;box-sizing:border-box}
html{background:#0c1014}/*BGFIX:实色兜底——iOS Safari 滚动/回弹露馅也是深色,绝不露白*/
/* 站点统一作者署名(低调,五页一致) */
.site-by{flex:0 0 auto;text-align:center;font-family:var(--sans);font-size:10.5px;color:var(--muted);letter-spacing:.04em;padding:9px 12px 13px;position:relative;z-index:2}
.site-by a{color:var(--rice-dim);text-decoration:none;border-bottom:1px solid rgba(184,179,164,.32)}
.site-by a:hover{color:var(--rice)}
html::before{content:'';position:fixed;inset:0;z-index:-1;background:radial-gradient(800px 520px at 72% 22%,rgba(91,178,149,.10),transparent 58%),radial-gradient(700px 460px at 16% 80%,rgba(201,164,92,.07),transparent 55%),linear-gradient(180deg,#0c1014,#0e141a 45%,#0c1014)}
body{color:var(--rice);font-family:var(--serif);-webkit-font-smoothing:antialiased;min-height:100svh;display:flex;flex-direction:column;overflow-x:hidden}
body::before{content:"";position:fixed;inset:0;pointer-events:none;z-index:1;opacity:.04;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");}
@keyframes fade{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
.fade{animation:fade .5s both}
.jjnav{flex:0 0 auto;display:flex;align-items:center;gap:2px;justify-content:center;padding:9px 12px;border-bottom:1px solid var(--line);font-family:var(--sans);font-size:13px;position:relative;z-index:5}
.jjnav a{color:var(--rice-dim);text-decoration:none;padding:5px 12px;border-radius:8px;transition:.2s;letter-spacing:.04em}
.jjnav a:hover{color:var(--rice);background:rgba(255,255,255,.05)}
.jjnav a.brand{font-family:var(--brush);font-size:20px;color:var(--gold);padding-right:4px}
.jjnav a.on{color:var(--jade)}
.jjnav .sp{width:1px;height:15px;background:rgba(220,210,185,.2);margin:0 3px}
.wrap{flex:1 0 auto;display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:0;position:relative;z-index:2;padding:clamp(10px,2vh,20px) 18px clamp(14px,2.4vh,22px)}
.screen{display:none;width:100%;max-width:560px;flex-direction:column;align-items:center;text-align:center}
.screen.on{display:flex;animation:fade .4s both}
/* ===== intro ===== */
.kicker{font-family:var(--sans);font-size:11.5px;letter-spacing:.22em;color:var(--jade);text-transform:uppercase}
.title{font-family:var(--brush);font-size:clamp(46px,9vh,72px);line-height:1;color:var(--gold-l);text-shadow:0 0 34px rgba(201,164,92,.3);margin-top:8px}
.title .s{display:block;font-family:var(--sans);font-size:clamp(12px,1.7vh,14px);font-weight:300;letter-spacing:.16em;color:var(--rice-dim);margin-top:11px}
.ornament{display:flex;align-items:center;justify-content:center;gap:12px;margin-top:13px}
.ornament .ln{width:clamp(38px,12vw,62px);height:1px;background:linear-gradient(90deg,transparent,rgba(201,164,92,.7))}
.ornament .ln.r{transform:scaleX(-1)}
.ornament .dot{color:var(--gold);font-size:13px;text-shadow:0 0 10px rgba(201,164,92,.6)}
.tagline{font-size:clamp(13px,1.95vh,15px);color:var(--rice-dim);line-height:1.7;margin-top:clamp(12px,2vh,18px)}
.tagline b{color:var(--jade);font-weight:600}
.tagline .x{color:var(--muted);text-decoration:line-through;text-decoration-color:rgba(208,95,76,.6)}
.pyramid{margin:clamp(16px,2.8vh,26px) 0;width:100%;max-width:430px}
.divider{font-family:var(--sans);font-size:9px;letter-spacing:.14em;color:var(--muted);margin:5px 0 3px;text-align:center}
.divider.inner{color:#a99cc0}
/* 两列网格在层中线对齐:境界名右对齐到中线、描述左对齐从中线起 → 各层境界名竖直对齐 */
.tier{margin:3.5px auto;height:clamp(24px,3.3vh,32px);display:grid;grid-template-columns:1fr 1fr;align-items:center;column-gap:11px;border-radius:7px;border:1px solid var(--line);background:rgba(255,255,255,.02);transition:.2s}
.tier .nm{font-family:var(--brush);font-size:clamp(16px,2.6vh,20px);line-height:1;justify-self:end;text-align:right;white-space:nowrap}
.tier .es{font-family:var(--sans);font-size:clamp(8.5px,1.2vh,10px);color:var(--muted);letter-spacing:.04em;justify-self:start;text-align:left;white-space:nowrap;opacity:.82}
.tier.lock{opacity:.5}.tier.lock .nm::after{content:" 🔒";font-size:8px}
.t0{width:100%}.t1{width:93%}.t2{width:86%}.t3{width:78%}.t4{width:70%}.t5{width:62%}.t6{width:54%}.t7{width:46%}.t8{width:39%}
.t0 .nm{color:#9aa39e}.t1 .nm{color:#9fb0a8}.t2{border-color:rgba(91,178,149,.4)}.t2 .nm{color:var(--jade)}
.t3{border-color:rgba(201,164,92,.4)}.t3 .nm{color:var(--gold)}.t4 .nm{color:var(--azure)}.t5 .nm{color:#ecdfb6}
.t6 .nm{color:#a99cc0}.t7 .nm{color:#bba6cc}.t8 .nm{color:#cdb9d6}
.btn{font-family:var(--sans);font-size:15px;font-weight:500;color:var(--ink);background:linear-gradient(180deg,var(--jade),var(--jade-d));border:none;border-radius:30px;padding:13px 38px;cursor:pointer;letter-spacing:.06em;box-shadow:0 8px 22px -8px var(--jade);transition:.2s}
.btn:hover{transform:translateY(-2px);box-shadow:0 12px 26px -8px var(--jade)}
.btn.ghost{background:none;color:var(--rice-dim);border:1px solid var(--line);box-shadow:none;font-size:13px;padding:10px 24px;margin-top:16px}
.btn.ghost:hover{color:var(--rice);transform:none;border-color:var(--rice-dim)}
.foot-note{font-family:var(--sans);font-size:11px;color:var(--muted);margin-top:14px;letter-spacing:.03em}
/* ===== quiz ===== */
.prog{width:100%;max-width:480px;display:flex;align-items:center;gap:12px;margin-bottom:clamp(14px,3vh,26px)}
.prog-txt{font-family:var(--sans);font-size:12px;color:var(--muted);flex:0 0 auto;letter-spacing:.08em}
.prog-bar{flex:1;height:3px;background:rgba(255,255,255,.08);border-radius:3px;overflow:hidden}
.prog-fill{height:100%;width:0;background:linear-gradient(90deg,var(--jade),var(--gold));border-radius:3px;transition:width .4s cubic-bezier(.4,0,.2,1)}
.q-axis{display:inline-block;font-family:var(--sans);font-size:11px;letter-spacing:.16em;color:var(--jade);border:1px solid rgba(91,178,149,.4);border-radius:18px;padding:3px 14px}
.q-text{font-size:clamp(18px,3vh,23px);font-weight:600;color:var(--rice);line-height:1.45;margin:14px 0 6px}
.q-hint{font-size:12.5px;color:var(--muted);font-style:italic;margin-bottom:clamp(14px,2.6vh,22px)}
.opts{display:flex;flex-direction:column;gap:9px;width:100%;max-width:480px}
.opt{position:relative;display:flex;align-items:center;justify-content:space-between;gap:10px;text-align:left;font-family:var(--serif);font-size:clamp(13.5px,1.95vh,15px);color:var(--rice);background:linear-gradient(180deg,var(--panel),var(--panel2));border:1px solid var(--line);border-radius:11px;padding:11px 16px;cursor:pointer;transition:.2s;line-height:1.4;-webkit-tap-highlight-color:transparent}
/* hover 效果只在真有指针悬停的设备生效,避免触屏点击后样式“粘”到下一题同位置的选项 */
@media(hover:hover){.opt:hover{border-color:var(--jade);transform:translateX(4px);box-shadow:-5px 0 16px -10px var(--jade)}}
.opt .tag{flex:0 0 auto;font-family:var(--sans);font-size:9.5px;color:var(--muted);letter-spacing:.04em;border:1px solid var(--line);border-radius:5px;padding:2px 7px;white-space:nowrap}
.back{font-family:var(--sans);font-size:12.5px;color:var(--muted);background:none;border:none;cursor:pointer;margin-top:16px}
.back:hover{color:var(--rice)}
/* ===== result ===== */
.res-card{width:100%;max-width:470px;background:linear-gradient(180deg,var(--panel),#12171c);border:1px solid var(--line);border-radius:16px;padding:clamp(18px,2.6vh,26px) clamp(18px,4vw,28px);text-align:center}
.res-eyebrow{font-family:var(--sans);font-size:11px;letter-spacing:.18em;color:var(--muted)}
.res-realm{font-family:var(--brush);font-size:clamp(46px,8vh,66px);line-height:1;margin:5px 0 3px}
.res-sub{font-family:var(--sans);font-size:12.5px;color:var(--rice-dim);letter-spacing:.08em}
.res-stage{font-family:var(--sans);font-size:11.5px;color:var(--jade);margin-top:5px}
.mini-pyr{margin:clamp(13px,2.2vh,18px) 0;display:flex;flex-direction:column;align-items:center;gap:3px}
.mt{height:clamp(15px,2.05vh,19px);display:flex;align-items:center;justify-content:center;font-family:var(--sans);font-size:9.5px;color:var(--muted);background:rgba(255,255,255,.03);border:1px solid var(--line);border-radius:4px;letter-spacing:.04em}
.mt.lk{opacity:.4}
.mt.here{color:var(--ink);font-weight:600;background:linear-gradient(90deg,var(--gold-l),var(--jade));border-color:transparent;box-shadow:0 0 16px -3px var(--jade);font-size:11px}
.res-block{text-align:left;margin-top:clamp(12px,2vh,16px);border-top:1px dashed var(--line);padding-top:clamp(10px,1.6vh,13px)}
.res-block .lab{font-family:var(--sans);font-size:11px;letter-spacing:.12em;color:var(--jade);margin-bottom:5px}
.res-block .lab.cb{color:var(--cinnabar)}
.res-block p{font-size:13px;color:var(--rice-dim);line-height:1.62}
.demon-seal{display:inline-block;font-family:var(--brush);border:1.5px solid var(--cinnabar);color:#f0c4bb;border-radius:8px;padding:5px 16px;background:rgba(208,95,76,.1)}
.demon-seal.good{border-color:var(--jade);color:#a7e0cc;background:rgba(91,178,149,.1)}
.demon-seal .dn{font-size:20px}
.share-tip{font-family:var(--sans);font-size:11px;color:var(--muted);margin-top:14px;text-align:center}
.pro-guide{display:inline-block;margin-top:14px;font-family:var(--sans);font-size:12.5px;color:var(--gold-l);text-decoration:none;border:1px solid rgba(201,164,92,.35);border-radius:18px;padding:7px 16px;transition:.2s}
.pro-guide:hover{background:rgba(201,164,92,.1);border-color:var(--gold);color:#f0d79a}
/* 移动端法印卡预览浮层 */
.seal-modal{position:fixed;inset:0;z-index:99;background:rgba(8,11,14,.94);display:flex;align-items:center;justify-content:center;padding:18px;overflow:auto}
.seal-modal .seal-box{display:flex;flex-direction:column;align-items:center;max-width:440px;width:100%}
.seal-modal img{width:100%;max-width:min(82vw,420px);height:auto;border-radius:12px;box-shadow:0 14px 44px -12px #000;border:1px solid var(--line)}
.seal-modal p{font-family:var(--sans);font-size:13px;color:var(--gold-l);margin-top:15px;letter-spacing:.04em}
.seal-modal .seal-close{margin-top:12px;font-family:var(--sans);font-size:13px;color:var(--rice-dim);background:none;border:1px solid var(--line);border-radius:20px;padding:8px 26px;cursor:pointer}
/* 题目与选项统一左对齐到同一列(题目原为居中,统一为左对齐) */
#qbody{width:100%;max-width:480px;margin-left:auto;margin-right:auto;text-align:left}
</style>
</head>
<body>
<nav class="jjnav">
<a class="brand" href="index.html">几境</a>
<span class="sp"></span>
<a href="realms.html">境界</a>
<a href="scripture.html">藏经阁</a>
<a class="on" href="quiz.html">测一测</a>
<span class="sp"></span>
<a href="en/quiz.html">EN</a>
</nav>
<div class="wrap">
<!-- ============ INTRO ============ -->
<div class="screen on" id="intro">
<div class="kicker fade">人机协作 · 修为自测</div>
<h1 class="title fade" style="animation-delay:.1s">几境<span class="s">AI 修为 · 九重天梯自测</span></h1>
<div class="ornament fade" style="animation-delay:.2s"><span class="ln l"></span><span class="dot">❖</span><span class="ln r"></span></div>
<div class="pyramid fade" style="animation-delay:.28s">
<div class="tier t8 lock"><span class="nm">道祖</span><span class="es">范式创生</span></div>
<div class="tier t7 lock"><span class="nm">合道</span><span class="es">领域立法</span></div>
<div class="tier t6 lock"><span class="nm">返虚</span><span class="es">组织重塑</span></div>
<div class="tier t5"><span class="nm">化神</span><span class="es">跨场景迁移</span></div>
<div class="tier t4"><span class="nm">元婴</span><span class="es">别人也能用</span></div>
<div class="tier t3"><span class="nm">金丹</span><span class="es">稳定闭环</span></div>
<div class="tier t2"><span class="nm">筑基</span><span class="es">个人工作法</span></div>
<div class="tier t1"><span class="nm">炼气</span><span class="es">问答把玩</span></div>
<div class="tier t0"><span class="nm">凡人</span><span class="es">未入门</span></div>
</div>
<button class="btn fade" style="animation-delay:.5s" onclick="start()">开始测 · 共 6 问</button>
</div>
<!-- ============ QUIZ ============ -->
<div class="screen" id="quiz">
<div class="prog">
<span class="prog-txt" id="pnum">1 / 6</span>
<div class="prog-bar"><div class="prog-fill" id="pfill"></div></div>
</div>
<div id="qbody"></div>
<button class="back" id="backBtn" onclick="back()" style="display:none">← 上一题</button>
</div>
<!-- ============ RESULT ============ -->
<div class="screen" id="result"></div>
</div>
<footer class="site-by">作者 Hugin-Z · <a href="https://github.com/Hugin-Z" target="_blank" rel="noopener">GitHub</a></footer>
<script>
/* ===================== 引擎数据 ===================== */
// 境界阶梯:0凡人 1炼气 2筑基 3金丹 4元婴 5化神 | 6返虚 7合道 8道祖(封印)
var REALM = [
{nm:"凡人",sub:"未入门",break:"先承认 AI 会一本正经地胡说。挑一件你常做的小事,让它给你出个初稿试试。"},
{nm:"炼气",sub:"初触灵气",break:"沉淀 5 个你反复要用的任务模板,并写清每个「不能用在什么场景」。"},
{nm:"筑基",sub:"道基初成",break:"把一个真实任务做成 SOP:输入是什么、怎么处理、怎么检查、输出什么。"},
{nm:"金丹",sub:"结丹成流",break:"让一个流程在 3 个以上真实变体上跑通,每次留记录、修问题、迭代版本。"},
{nm:"元婴",sub:"第二元神",break:"把判别力沉淀成可复用的 eval / 验收协议,让标准替你盯;再找一个外部的人照你的说明跑通。"},
{nm:"化神",sub:"神识外放",break:"把方法抽象成框架,证明它在第 4、第 5 个不同项目里仍然成立;开始造工具、定标准。"},
{nm:"返虚",sub:"组织重塑",break:"封印位 · 解锁条件:有一个真实团队按你的体系持续运作一个月以上。"},
{nm:"合道",sub:"领域立法",break:"封印位 · 解锁条件:你的方法或框架被同行、社区采用并传播。"},
{nm:"道祖",sub:"范式创生",break:"封印位 · 传说之境:形成行业级影响、事实标准与生态。"}
];
var COLOR = ["#7c847e","#9fb0a8","#5bb295","#c9a45c","#6db0c4","#ecdfb6","#a99cc0","#bba6cc","#cdb9d6"];
// 心魔(放手程度 × 神识)
var DEMON = {
fire:{nm:"走火入魔",good:false,txt:"你敢放手,却分不清好坏——最容易把幻觉当真理。补「神识」:产出后做系统检查,别让 AI 一个人开车。"},
guard:{nm:"谨守心神",good:false,txt:"你看得清好坏,却不敢放手,事必躬亲。补「委托」:挑低风险的活,试着定好要求让它自己跑完,你再验收。"},
novice:{nm:"初心未炼",good:false,txt:"放手和判别都还在养。先从「让 AI 做低风险初稿、再自己逐项核对」开始练。"},
way:{nm:"渐入正道",good:true,txt:"放手与神识齐涨,走的是正道。继续把判别标准沉淀成可复用的协议,让神识外放。"},
collect:{nm:"Prompt 收藏癖",good:false,txt:"收藏了 300 个 prompt,却没有一个稳定跑通的工作流。"},
framework:{nm:"框架走火",good:false,txt:"LangChain、MCP、Agent、RAG 全学了,没一个真实任务跑穿。"},
demo:{nm:"Demo 飞升",good:false,txt:"做出一个 demo,就以为自己已经产品化了。"},
feedback:{nm:"幻觉回灌",good:false,txt:"AI 编的内容被你放回知识库,污染了下一轮输出。"},
autopilot:{nm:"自动化成瘾",good:false,txt:"本该人工确认的高风险判断,也想让 AI 自动放行。"},
idol:{nm:"模型拜物",good:false,txt:"以为换个更强的模型,就能解决业务逻辑上的错误。"}
};
/* ===================== 题目 ===================== */
// 每个选项可设置某条轴的「封顶值」(cap);境界 = 各轴 cap 取最低
var QS = [
{ axis:"证据", q:"你能拿出的、最硬的那件「作品」是什么?",
hint:"作品是法器,不是境界——但它划定你的上限。",
opts:[
{t:"几乎不用 AI,偶尔玩玩", tag:"封顶 · 凡人", cap:{ev:0}},
{t:"就在聊天框里问答、复制结果", tag:"封顶 · 炼气", cap:{ev:1}},
{t:"有自己反复用的模板 / 提示词", tag:"封顶 · 筑基", cap:{ev:2}},
{t:"做出过 1 个能跑的 demo / 小工具", tag:"法器一件 · 封顶 筑基", cap:{ev:2}},
{t:"同一套流程在 3+ 个真实任务上跑过", tag:"封顶 · 金丹", cap:{ev:3}},
{t:"有 repo + 文档 + 测试 / eval", tag:"封顶 · 元婴候选", cap:{ev:4}},
{t:"一套方法迁移到多个不同项目都成立", tag:"封顶 · 化神", cap:{ev:5}}
]},
{ axis:"次数", q:"你最得意的那套 AI 工作法,到底跑过几次?",
hint:"一次是运气,三次是方法,十次才是能力。",
opts:[
{t:"就成功过一两次", tag:"运气 / 灵感 · 封顶 筑基", cap:{cnt:2}},
{t:"大概 3–5 次,基本稳定了", tag:"初步方法 · 封顶 金丹", cap:{cnt:3}},
{t:"十几次以上,闭着眼也能跑", tag:"稳定能力", cap:{cnt:5}}
]},
{ axis:"迁移", q:"这套工作法,换了任务、换了人,还成立吗?",
hint:"绑死一个任务是术,换场景仍有效才是法。",
opts:[
{t:"就一个任务,而且只有我自己跑过", tag:"封顶 · 金丹", cap:{mig:3}},
{t:"不同任务我都跑过,都还行", tag:"封顶 · 化神", cap:{mig:5}},
{t:"别人也照着跑通过", tag:"可传承", cap:{mig:7}}
]},
{ axis:"神识", q:"AI 给的东西出错时,你通常是什么状态?",
hint:"会不会兜底,是高手与车手的分水岭。",
opts:[
{t:"我多半看不出对错,先信了再说", tag:"神识未开 · 封顶 筑基", cap:{shen:2}, sh:0},
{t:"大致觉得哪里怪,但说不太清", tag:"神识初成", cap:{shen:4}, sh:1},
{t:"有检查清单,能定位到哪步错、怎么修", tag:"神识已成", cap:{shen:9}, sh:2}
]},
{ axis:"采用", q:"你做的东西,有没有被「真实用起来」?",
hint:"没被真实使用过的,最多算金丹。",
opts:[
{t:"只有我自己玩 / 给人看过 demo", tag:"封顶 · 金丹", cap:{adopt:3}},
{t:"我自己日常一直在用", tag:"封顶 · 化神", cap:{adopt:5}},
{t:"同事 / 朋友也照着在用", tag:"封顶 · 化神", cap:{adopt:5}},
{t:"有团队在持续用我定的流程", tag:"内功解锁 · 返虚", cap:{adopt:6}},
{t:"有同行 / 社区在用我的方法", tag:"内功解锁 · 合道", cap:{adopt:7}}
]},
{ axis:"心魔", q:"面对一个多步骤的任务,你更像哪一种?",
hint:"这一题只诊断心魔,不定境界。",
opts:[
{t:"自己一步步盯着 AI 做,不敢撒手", tag:"事必躬亲", let:0},
{t:"定好要求让它自己跑完,我再验收", tag:"在环之上", let:1},
{t:"基本扔给它,不太回头看", tag:"全然放手", let:1}
]}
];
/* ===================== 流程控制 ===================== */
var idx=0, ans=[], CARD=null, ORDER=[];
// 选项随机排序:分值绑定在选项本身(onclick 回传原始下标),打乱仅改显示位置;证据题(Q0)不打乱
function shuffle(a){for(var i=a.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=a[i];a[i]=a[j];a[j]=t;}return a;}
function buildOrder(){ORDER=QS.map(function(q,qi){var base=q.opts.map(function(_,i){return i;});return qi===0?base:shuffle(base);});}
function show(id){document.querySelectorAll('.screen').forEach(function(s){s.classList.remove('on')});document.getElementById(id).classList.add('on');window.scrollTo({top:0,behavior:'smooth'});}
function start(){idx=0;ans=[];buildOrder();show('quiz');render();}
function render(){
var q=QS[idx];
document.getElementById('pnum').textContent=(idx+1)+' / '+QS.length;
document.getElementById('pfill').style.width=((idx)/QS.length*100)+'%';
document.getElementById('backBtn').style.display=idx>0?'inline-block':'none';
var h='<div class="fade"><div class="q-axis">'+q.axis+'</div><div class="q-text">'+q.q+'</div><div class="q-hint">'+q.hint+'</div><div class="opts">';
(ORDER[idx]||q.opts.map(function(_,i){return i;})).forEach(function(oi){var o=q.opts[oi];h+='<button class="opt" onclick="pick('+oi+')">'+o.t+'</button>';}); // 选项随机显示;onclick 回传原始下标,分值绑定选项内容
h+='</div></div>';
document.getElementById('qbody').innerHTML=h;
}
function pick(i){ans[idx]=QS[idx].opts[i];if(idx<QS.length-1){idx++;render();}else{finish();}}
function back(){if(idx>0){idx--;render();}}
/* ===================== 计分引擎 ===================== */
function finish(){
document.getElementById('pfill').style.width='100%';
// 取各轴 cap,缺省给极大值;境界 = 取最低
var caps={ev:99,cnt:99,mig:99,shen:99,adopt:99};
var sh=2, lt=1;
ans.forEach(function(o){
if(o.cap){for(var k in o.cap){if(o.cap[k]<caps[k])caps[k]=o.cap[k];}}
if(o.sh!==undefined)sh=o.sh;
if(o.let!==undefined)lt=o.let;
});
var axisName={ev:"证据",cnt:"次数",mig:"迁移",shen:"神识",adopt:"采用"};
var lvl=99, binders=[];
for(var k in caps){if(caps[k]<lvl)lvl=caps[k];}
if(lvl>8)lvl=5; // 兜底
for(var k in caps){if(caps[k]===lvl)binders.push(k);}
// 短板优先级:神识 > 采用 > 证据 > 迁移 > 次数
var pri=["shen","adopt","ev","mig","cnt"];
var binder=pri.filter(function(p){return binders.indexOf(p)>=0;})[0]||binders[0];
// 子标签:若多数轴都高于短板,则「后期·已显苗头」
var above=0;for(var k in caps){if(caps[k]>lvl)above++;}
var stageLabel = (lvl<5 && above>=4) ? "后期 · 已显下一境苗头" : (above>=3 && lvl<5 ? "中期" : "");
// 短板提示
var binderHint={
shen:"封住你的是【神识】——你还看不太出 AI 的对错。这是最该先补的:建检查清单、做系统验证。不会兜底,最多筑基。",
adopt:"封住你的是【采用】——你做的东西还没被真实用起来。让它进入真实使用:自己日常用,或给同事用一次。",
ev:"封住你的是【证据】——把你手头最好的那次,做成更硬的形态(SOP → 带测试的 repo → 能让别人跑通)。",
mig:"封住你的是【迁移】——你只在一个任务、一个人身上验证过。换个任务、让别人也跑一次。",
cnt:"封住你的是【次数】——你做到过,但跑得太少。同一套再多跑几轮,让它稳定下来。"
};
// 心魔:先按具体答案模式抽新增 6 心魔,命中不了再回落到原 4 象限
var evIdx=QS[0].opts.indexOf(ans[0]); // 证据题选了第几项(3=做了个 demo, 2=有模板, >=4 仓库/迁移)
var letIdx=QS[5].opts.indexOf(ans[5]); // 心魔题:2=全然放手不回头
var demon =
(letIdx===2 && sh<=1) ? DEMON.autopilot : // 全然放手 + 神识不足 → 自动化成瘾
(evIdx===3 && caps.adopt<=3) ? DEMON.demo : // 做了 demo + 没被真实采用 → Demo 飞升
(evIdx===2 && caps.cnt<=2) ? DEMON.collect : // 攒了模板 + 几乎没跑过 → Prompt 收藏癖
(evIdx>=5 && caps.adopt<=3 && caps.mig<=3) ? DEMON.framework : // 仓库/高阶证据 + 没采用没迁移 → 框架走火
(sh<=0 && lt===1 && evIdx>=4) ? DEMON.feedback : // 放手 + 看不出对错 + 已在跑链路 → 幻觉回灌
(caps.shen<=2 && caps.cnt<=2 && evIdx>=3) ? DEMON.idol : // 神识弱 + 跑得少 + 做过东西 → 模型拜物
(lt===1 && sh<=0) ? DEMON.fire :
(lt===0 && sh>=1) ? DEMON.guard :
(lt===0 && sh<=0) ? DEMON.novice :
DEMON.way;
renderResult(lvl,stageLabel,binder,binderHint[binder],demon);
}
function renderResult(lvl,stage,binder,bhint,demon){
var r=REALM[lvl], col=COLOR[lvl];
var locked = lvl>=6;
CARD={lvl:lvl, realm:r.nm, sub:r.sub, stage:stage, col:col, demon:demon.nm, demonGood:!!demon.good};
var stageLine = stage ? '<div class="res-stage">'+r.nm+' · '+stage+'</div>' : '';
// mini 金字塔(外功 0-5 + 内功 6-8 锁)
var mini='';
for(var i=8;i>=0;i--){
var cls='mt'+(i===lvl?' here':'')+(i>=6?' lk':'');
mini+='<div class="'+cls+'" style="width:'+(34+(8-i)*8.2)+'%">'+REALM[i].nm+(i===lvl?' · 你在此':'')+'</div>';
}
var demonLab = demon.good?'你的修行姿态':'你的心魔';
var h=
'<div class="res-card">'+
'<div class="res-eyebrow">你修到 · 第 '+(lvl+1)+' 重</div>'+
'<div class="res-realm" style="color:'+col+';text-shadow:0 0 46px '+col+'55">'+r.nm+'</div>'+
'<div class="res-sub">'+r.sub+'</div>'+ stageLine +
'<div class="mini-pyr">'+mini+'</div>'+
'<div class="res-block"><div class="lab">是谁封住了你的顶</div><p>'+ (locked?'你已踏入封印之境,前路需外部证据为凭。':bhint) +'</p></div>'+
'<div class="res-block"><div class="lab">破境心法</div><p>'+r.break+'</p></div>'+
'<div class="res-block"><div class="lab cb">'+demonLab+'</div>'+
'<div class="demon-seal'+(demon.good?' good':'')+'"><span class="dn">'+demon.nm+'</span></div>'+
'<p style="margin-top:12px">'+demon.txt+'</p></div>'+
'</div>'+
'<button class="btn" id="sealBtn" style="margin-top:18px" onclick="makeSeal(this)">凝练修为法印 · 存图分享</button>'+
'<a class="btn ghost" style="margin-top:12px;text-decoration:none;display:inline-block" href="scripture.html#realm'+(lvl<1?1:(lvl>6?6:lvl))+'">去藏经阁 · 取你这一境的典籍 →</a>'+
'<p class="share-tip">凝练成「修为法印」图,或直接截图,发出来对个号 ↑</p>'+
'<a class="pro-guide" href="quiz-pro.html">想测得更准?→ 进正卷(24 题 · 八脉雷达 · 破境指引)</a>'+
'<br><button class="btn ghost" onclick="show(\'intro\')">← 重新测一次</button>';
document.getElementById('result').innerHTML=h;
show('result');
}
/* ===================== 修为法印 · 分享卡 ===================== */
// 圆角矩形路径
function rr(x,a,b,w,h,r){x.beginPath();x.moveTo(a+r,b);x.arcTo(a+w,b,a+w,b+h,r);x.arcTo(a+w,b+h,a,b+h,r);x.arcTo(a,b+h,a,b,r);x.arcTo(a,b,a+w,b,r);x.closePath();}
// 纯前端二维码(Version 2 / ECC-M / byte 模式,固定指向 9jing.top;已离线验证可扫)
function qrEncode(text){
var N=25, DATA_CW=28, EC_CW=16;
var EXP=new Array(512), LOG=new Array(256);
(function(){var x=1;for(var i=0;i<255;i++){EXP[i]=x;LOG[x]=i;x<<=1;if(x&0x100)x^=0x11d;}for(var i=255;i<512;i++)EXP[i]=EXP[i-255];})();
function gmul(a,b){return (a===0||b===0)?0:EXP[LOG[a]+LOG[b]];}
var bytes=[];for(var i=0;i<text.length;i++)bytes.push(text.charCodeAt(i)&0xff);
var bits=[];function pb(v,n){for(var b=n-1;b>=0;b--)bits.push((v>>b)&1);}
pb(4,4);pb(bytes.length,8);for(var i=0;i<bytes.length;i++)pb(bytes[i],8);
var cap=DATA_CW*8;for(var i=0,t=Math.min(4,cap-bits.length);i<t;i++)bits.push(0);
while(bits.length%8)bits.push(0);
var data=[];for(var i=0;i<bits.length;i+=8){var v=0;for(var j=0;j<8;j++)v=(v<<1)|bits[i+j];data.push(v);}
for(var pad=[0xEC,0x11],pi=0;data.length<DATA_CW;pi++)data.push(pad[pi&1]);
function polymul(p,q){var r=new Array(p.length+q.length-1).fill(0);for(var i=0;i<p.length;i++)for(var j=0;j<q.length;j++)r[i+j]^=gmul(p[i],q[j]);return r;}
function rsGen(n){var g=[1];for(var i=0;i<n;i++)g=polymul(g,[1,EXP[i]]);return g;}
var gen=rsGen(EC_CW);var ec=new Array(EC_CW).fill(0);
for(var i=0;i<data.length;i++){var factor=data[i]^ec[0];ec.shift();ec.push(0);for(var j=0;j<EC_CW;j++)ec[j]^=gmul(gen[j+1],factor);}
var all=data.concat(ec);
var m=[],fn=[];for(var r=0;r<N;r++){m[r]=[];fn[r]=[];for(var c=0;c<N;c++){m[r][c]=0;fn[r][c]=false;}}
function finder(r,c){for(var i=-1;i<=7;i++)for(var j=-1;j<=7;j++){var rr2=r+i,cc=c+j;if(rr2<0||rr2>=N||cc<0||cc>=N)continue;var d=(i>=0&&i<=6&&(j===0||j===6))||(j>=0&&j<=6&&(i===0||i===6))||(i>=2&&i<=4&&j>=2&&j<=4);m[rr2][cc]=d?1:0;fn[rr2][cc]=true;}}
finder(0,0);finder(0,N-7);finder(N-7,0);
for(var i=8;i<N-8;i++){var b=(i%2===0)?1:0;m[6][i]=b;fn[6][i]=true;m[i][6]=b;fn[i][6]=true;}
(function(r,c){for(var i=-2;i<=2;i++)for(var j=-2;j<=2;j++){var rr2=r+i,cc=c+j;var ring=Math.max(Math.abs(i),Math.abs(j));m[rr2][cc]=(ring!==1)?1:0;fn[rr2][cc]=true;}})(18,18);
for(var i=0;i<=5;i++)fn[i][8]=true;fn[7][8]=true;fn[8][8]=true;fn[8][7]=true;for(var i=9;i<15;i++)fn[8][14-i]=true;for(var i=0;i<8;i++)fn[8][N-1-i]=true;for(var i=8;i<15;i++)fn[N-15+i][8]=true;fn[N-8][8]=true;
var db=[];for(var i=0;i<all.length;i++)for(var b=7;b>=0;b--)db.push((all[i]>>b)&1);
var di=0,up=true;
for(var c=N-1;c>0;c-=2){if(c===6)c=5;for(var tt=0;tt<N;tt++){var row=up?(N-1-tt):tt;for(var ci=0;ci<2;ci++){var cc=c-ci;if(!fn[row][cc]){m[row][cc]=di<db.length?db[di]:0;di++;}}}up=!up;}
function mask(k,r,c){switch(k){case 0:return (r+c)%2===0;case 1:return r%2===0;case 2:return c%3===0;case 3:return (r+c)%3===0;case 4:return (((r>>1)+(Math.floor(c/3)))%2)===0;case 5:return ((r*c)%2)+((r*c)%3)===0;case 6:return ((((r*c)%2)+((r*c)%3))%2)===0;default:return ((((r+c)%2)+((r*c)%3))%2)===0;}}
var FMT=[0x5412,0x5125,0x5E7C,0x5B4B,0x45F9,0x40CE,0x4F97,0x4AA0];
function gb(x,i){return (x>>i)&1;}
function placeFmt(M,bb){for(var i=0;i<=5;i++)M[i][8]=gb(bb,i);M[7][8]=gb(bb,6);M[8][8]=gb(bb,7);M[8][7]=gb(bb,8);for(var i=9;i<15;i++)M[8][14-i]=gb(bb,i);for(var i=0;i<8;i++)M[8][N-1-i]=gb(bb,i);for(var i=8;i<15;i++)M[N-15+i][8]=gb(bb,i);M[N-8][8]=1;}
function penalty(M){var p=0,i,j,k;
for(i=0;i<N;i++){for(var dir=0;dir<2;dir++){var run=1,prev=-1;for(j=0;j<N;j++){var v=dir?M[j][i]:M[i][j];if(v===prev){run++;if(run===5)p+=3;else if(run>5)p+=1;}else{run=1;prev=v;}}}}
for(i=0;i<N-1;i++)for(j=0;j<N-1;j++){var v=M[i][j];if(v===M[i][j+1]&&v===M[i+1][j]&&v===M[i+1][j+1])p+=3;}
var p1=[1,0,1,1,1,0,1,0,0,0,0],p2=[0,0,0,0,1,0,1,1,1,0,1];
function mt(get){for(i=0;i<N;i++)for(j=0;j<=N-11;j++){var o1=true,o2=true;for(k=0;k<11;k++){var v=get(i,j+k);if(v!==p1[k])o1=false;if(v!==p2[k])o2=false;}if(o1)p+=40;if(o2)p+=40;}}
mt(function(a,b){return M[a][b];});mt(function(a,b){return M[b][a];});
var dark=0;for(i=0;i<N;i++)for(j=0;j<N;j++)if(M[i][j])dark++;
p+=Math.floor(Math.abs(dark*100/(N*N)-50)/5)*10;return p;}
var best=null,bestP=Infinity;
for(var k=0;k<8;k++){var M=[];for(var r=0;r<N;r++)M[r]=m[r].slice();for(var r=0;r<N;r++)for(var c=0;c<N;c++){if(!fn[r][c]&&mask(k,r,c))M[r][c]^=1;}placeFmt(M,FMT[k]);var pp=penalty(M);if(pp<bestP){bestP=pp;best=M;}}
return {size:N,matrix:best};
}
// 把卡片画到 canvas 并导出 PNG Blob
function drawSeal(card){
var W=1080,H=1350;
var cv=document.createElement('canvas');cv.width=W;cv.height=H;window.__sealCanvas=cv;
var x=cv.getContext('2d');
var brush="'MaShanLocal','SerifLocal',serif", sans="'SansLocal',sans-serif", serif="'SerifLocal',serif";
// 背景
var g=x.createLinearGradient(0,0,0,H);g.addColorStop(0,'#0c1014');g.addColorStop(.45,'#0e141a');g.addColorStop(1,'#0c1014');x.fillStyle=g;x.fillRect(0,0,W,H);
var rg=x.createRadialGradient(W*.72,H*.24,0,W*.72,H*.24,W*.72);rg.addColorStop(0,'rgba(91,178,149,.14)');rg.addColorStop(1,'rgba(91,178,149,0)');x.fillStyle=rg;x.fillRect(0,0,W,H);
var rg2=x.createRadialGradient(W*.2,H*.82,0,W*.2,H*.82,W*.72);rg2.addColorStop(0,'rgba(201,164,92,.10)');rg2.addColorStop(1,'rgba(201,164,92,0)');x.fillStyle=rg2;x.fillRect(0,0,W,H);
// 边框
x.strokeStyle='rgba(201,164,92,.5)';x.lineWidth=3;rr(x,40,40,W-80,H-80,18);x.stroke();
x.strokeStyle='rgba(201,164,92,.16)';x.lineWidth=1.5;rr(x,56,56,W-112,H-112,12);x.stroke();
x.textAlign='center';
// 品牌
x.fillStyle='#c9a45c';x.font='400 92px '+brush;x.shadowColor='rgba(201,164,92,.5)';x.shadowBlur=30;x.fillText('几境',W/2,190);x.shadowBlur=0;
x.fillStyle='#8b938d';x.font='300 27px '+sans;x.fillText('AI 修为天梯',W/2,234);
x.strokeStyle='rgba(201,164,92,.4)';x.lineWidth=2;x.beginPath();x.moveTo(W/2-120,276);x.lineTo(W/2-26,276);x.moveTo(W/2+26,276);x.lineTo(W/2+120,276);x.stroke();
x.fillStyle='#c9a45c';x.font='26px '+brush;x.fillText('❖',W/2,285);
// 境界
x.fillStyle='#8b938d';x.font='300 31px '+sans;x.fillText('你修到 · 第 '+(card.lvl+1)+' 重',W/2,372);
x.fillStyle=card.col;x.font='400 172px '+brush;x.shadowColor=card.col;x.shadowBlur=46;x.fillText(card.realm,W/2,536);x.shadowBlur=0;
x.fillStyle='#b8b3a4';x.font='400 34px '+sans;
x.fillText(card.stage?(card.sub+' · '+card.stage):card.sub,W/2,592);
// 心魔印章
var _max=W-150,_df=56;x.font='400 '+_df+'px '+brush;while(x.measureText(card.demon).width+96>_max&&_df>20){_df-=3;x.font='400 '+_df+'px '+brush;}var dw=x.measureText(card.demon).width;var boxW=dw+96,boxH=110,bx=W/2-boxW/2,by=672;
x.fillStyle=card.demonGood?'#8b938d':'#8b938d';x.font='300 25px '+sans;x.fillText(card.demonGood?'修行姿态':'你的心魔',W/2,by-20);
var sealCol=card.demonGood?'#5bb295':'#d05f4c';
x.fillStyle=card.demonGood?'rgba(91,178,149,.10)':'rgba(208,95,76,.12)';x.strokeStyle=sealCol;x.lineWidth=3;rr(x,bx,by,boxW,boxH,14);x.fill();x.stroke();
x.fillStyle=card.demonGood?'#a7e0cc':'#f0c4bb';x.font='400 '+_df+'px '+brush;x.textBaseline='middle';x.fillText(card.demon,W/2,by+boxH/2+3);x.textBaseline='alphabetic';
// 信条
x.fillStyle='#ece6d6';x.font='400 42px '+serif;x.fillText('作品是法器,不是境界。',W/2,884);
x.fillStyle='#8b938d';x.font='300 26px '+sans;x.fillText('神识,先于放手。 修为在人,AI 为器。',W/2,930);
// 二维码
var qr=qrEncode('https://9jing.top');var qz=4,cell=7,qpx=(qr.size+qz*2)*cell;var qx=W/2-qpx/2,qy=994;
x.fillStyle='#ece6d6';rr(x,qx-3,qy-3,qpx+6,qpx+6,14);x.fill();
x.fillStyle='#0d1115';
for(var r=0;r<qr.size;r++)for(var c=0;c<qr.size;c++){if(qr.matrix[r][c])x.fillRect(qx+(c+qz)*cell,qy+(r+qz)*cell,cell,cell);}
x.fillStyle='#b8b3a4';x.font='300 26px '+sans;x.fillText('扫码测你的修为 · 9jing.top',W/2,qy+qpx+40);
return cv; // 返回画好的 canvas,下载 / 预览由调用方决定
}
// 是否移动端(手机 / 平板)——iOS Safari 不支持 a[download] 存 blob,改用预览长按保存
function isTouchSave(){
try{var ua=navigator.userAgent||'';
var iOS=/iPhone|iPad|iPod/i.test(ua)||(/Macintosh/.test(ua)&&navigator.maxTouchPoints>1);
return iOS||/Android/i.test(ua)||/Mobile|HarmonyOS|Silk/i.test(ua);
}catch(e){return false;}
}
// 移动端:把卡片图放进浮层,提示长按保存到相册
function showSealPreview(dataURL){
var old=document.getElementById('sealModal');if(old)old.remove();
var d=document.createElement('div');d.id='sealModal';d.className='seal-modal';
d.innerHTML='<div class="seal-box"><img alt="修为法印" src="'+dataURL+'"><p>长按图片 · 保存到相册</p><button type="button" class="seal-close">关闭</button></div>';
d.addEventListener('click',function(){d.remove();});
d.querySelector('.seal-box').addEventListener('click',function(e){e.stopPropagation();});
d.querySelector('.seal-close').addEventListener('click',function(){d.remove();});
document.body.appendChild(d);
}
function makeSeal(btn){
if(!CARD){return;}
var old=btn?btn.textContent:'';
function reset(){if(btn){btn.disabled=false;btn.textContent=old||'凝练修为法印 · 存图分享';}}
if(btn){btn.disabled=true;btn.textContent='凝练中…';}
var FILE='几境-修为法印.png';
// 先确保字体加载(失败也不阻断,回退衬线/无衬线)
var ready;
try{ready=(document.fonts&&document.fonts.load)?Promise.all([document.fonts.load("400 120px 'MaShanLocal'"),document.fonts.load("400 40px 'SerifLocal'"),document.fonts.load("300 30px 'SansLocal'")]).catch(function(){}):Promise.resolve();}
catch(e){ready=Promise.resolve();}
ready.then(function(){
var cv=drawSeal(CARD);
if(isTouchSave()){ showSealPreview(cv.toDataURL('image/png')); reset(); return; } // 移动端:预览 + 长按保存
if(cv.toBlob){ // PC:下载 PNG
cv.toBlob(function(b){
try{
if(!b){showSealPreview(cv.toDataURL('image/png'));reset();return;}
var url=URL.createObjectURL(b);var a=document.createElement('a');a.href=url;a.download=FILE;document.body.appendChild(a);a.click();a.remove();
setTimeout(function(){URL.revokeObjectURL(url);},4000);
}catch(e){try{showSealPreview(cv.toDataURL('image/png'));}catch(e2){}}
reset();
},'image/png');
}else{
var a=document.createElement('a');a.href=cv.toDataURL('image/png');a.download=FILE;document.body.appendChild(a);a.click();a.remove();reset();
}
}).catch(function(){
try{var c=window.__sealCanvas;if(c){showSealPreview(c.toDataURL('image/png'));}else{alert('生成失败,可直接截图保存。');}}
catch(e){alert('生成失败,可直接截图保存。');}
reset();
});
}
</script>
</body>
</html>