@yaoxiu/marketing-dsl 2.3.0 → 2.5.0

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,4 +1,4 @@
1
- import { TRACK_EVENT_PATTERN, DEFAULT_USER_FIELDS, USER_FIELD_LABELS, DSL_VERSION, ACTION_TYPES, NODE_TYPES, ALLOWED_STYLE_KEYS, CLOSE_POSITIONS } from '../chunk-DTHKC5AL.js';
1
+ import { TRACK_EVENT_PATTERN, ALLOWED_EASINGS, DEFAULT_USER_FIELDS, USER_FIELD_LABELS, DSL_VERSION, ACTION_TYPES, NODE_TYPES, ALLOWED_STYLE_KEYS, CLOSE_POSITIONS } from '../chunk-DT3ZINDI.js';
2
2
 
3
3
  // src/docs/reconcile.ts
4
4
  function pickTokens(rows, columnIndex) {
@@ -320,8 +320,228 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6`
320
320
  ];
321
321
  var action_default = sections;
322
322
 
323
- // src/docs/sections/countdown.ts
323
+ // src/docs/sections/animation.ts
324
324
  var sections2 = [
325
+ {
326
+ id: "animation",
327
+ title: "15. \u52A8\u753B\u4E0E hover",
328
+ blocks: [
329
+ {
330
+ t: "p",
331
+ text: "\u52A8\u753B\u5206\u4E24\u6B65\u5199\uFF1A\u5148\u5728**\u9876\u5C42** `keyframes` \u91CC\u5B9A\u4E49\u4E00\u7EC4\u5173\u952E\u5E27\uFF0C\u518D\u5728\u8981\u52A8\u7684\u5730\u65B9\u7528 `animate` \u5F15\u7528\u5B83\u3002\u5173\u952E\u5E27\u5E93\u5168\u914D\u7F6E\u5171\u7528\uFF0C\u591A\u89C6\u56FE\u4E4B\u95F4\u4E5F\u5171\u7528\uFF0C\u540C\u4E00\u7EC4\u5173\u952E\u5E27\u53EF\u4EE5\u88AB\u5F15\u7528\u4EFB\u610F\u591A\u6B21\u3002"
332
+ },
333
+ {
334
+ t: "code",
335
+ code: `{
336
+ "version": 1,
337
+ "keyframes": {
338
+ "zoomIn": {
339
+ "from": { "opacity": "0", "transform": "scale(0.7)" },
340
+ "to": { "opacity": "1", "transform": "scale(1)" }
341
+ },
342
+ "floatY": {
343
+ "0%": { "transform": "translateY(0)" },
344
+ "50%": { "transform": "translateY(-8px)" },
345
+ "100%": { "transform": "translateY(0)" }
346
+ }
347
+ },
348
+ "stage": {
349
+ "animate": { "name": "zoomIn", "duration": 500, "easing": "cubic-bezier(0.34, 1.56, 0.64, 1)" },
350
+ "maskAnimate": { "name": "fadeIn", "duration": 400 }
351
+ },
352
+ "nodes": [
353
+ { "type": "text", "content": "\u{1F9E7}",
354
+ "animate": { "name": "floatY", "duration": 3000, "easing": "ease-in-out", "iteration": "infinite" } }
355
+ ]
356
+ }`
357
+ },
358
+ { t: "h3", text: "keyframes\uFF1A\u5173\u952E\u5E27\u5E93" },
359
+ {
360
+ t: "list",
361
+ items: [
362
+ "\u540D\u5B57\u53EA\u80FD\u7528\u5B57\u6BCD\u5F00\u5934\u7684\u5B57\u6BCD / \u6570\u5B57 / \u4E0B\u5212\u7EBF / \u4E2D\u5212\u7EBF\uFF0C\u6700\u957F 32 \u4E2A\u5B57\u7B26\uFF08\u5B83\u8981\u62FC\u8FDB CSS\uFF0C\u5FC5\u987B\u53EF\u63A7\uFF09",
363
+ "\u504F\u79FB\u91CF\u53EA\u8BA4 `from` / `to` / `50%` \u4E09\u79CD\u5199\u6CD5\uFF0C\u5199 `0.5` \u6216 `half` \u4F1A\u88AB\u62E6\u4E0B",
364
+ "\u6BCF\u4E00\u5E27\u7684\u503C\u662F**\u6837\u5F0F\u5BF9\u8C61**\uFF0C\u952E\u8D70\u7684\u662F\u7B2C 7 \u8282\u90A3\u4EFD style \u767D\u540D\u5355 \u2014\u2014 \u767D\u540D\u5355\u5916\u7684\u5C5E\u6027\u4F1A\u88AB\u4E22\u5F03\u5E76\u7ED9\u51FA\u8B66\u544A",
365
+ "\u52A8\u753B\u91CC\u5E38\u7528\u7684\u5C31 `transform` `opacity` `shadow` `background` `color` \u51E0\u4E2A\uFF1B\u6539\u5BBD\u9AD8\u4F1A\u9010\u5E27\u89E6\u53D1\u91CD\u6392\uFF0C\u80FD\u7528 `transform` \u5C31\u522B\u7528\u5BBD\u9AD8"
366
+ ]
367
+ },
368
+ {
369
+ t: "note",
370
+ tone: "info",
371
+ text: "\u5B9A\u4E49\u4E86\u5374\u6CA1\u6709\u4EFB\u4F55 `animate` \u5F15\u7528\u7684\u5173\u952E\u5E27\uFF0C\u4FDD\u5B58\u65F6\u4F1A\u7ED9\u51FA\u8B66\u544A\u3002\u591A\u534A\u662F\u6539\u914D\u7F6E\u65F6\u628A `animate` \u5220\u4E86\u5FD8\u4E86\u5220\u5173\u952E\u5E27\uFF0C\u6216\u8005\u540D\u5B57\u6253\u9519\u4E86\u4E00\u4E2A\u5B57\u6BCD \u2014\u2014 \u540E\u8005\u7684\u8868\u73B0\u662F\u300C\u4EC0\u4E48\u90FD\u6CA1\u53D1\u751F\u300D\uFF0C\u4E0D\u63D0\u793A\u7684\u8BDD\u5F88\u96BE\u60F3\u5230\u662F\u540D\u5B57\u7684\u95EE\u9898\u3002"
372
+ },
373
+ { t: "h3", text: "animate\uFF1A\u600E\u4E48\u64AD" },
374
+ {
375
+ t: "table",
376
+ head: ["\u5B57\u6BB5", "\u5FC5\u586B", "\u9ED8\u8BA4", "\u8BF4\u660E"],
377
+ rows: [
378
+ ["`name`", "\u662F", "\u2014", "\u5173\u952E\u5E27\u540D\uFF0C\u5FC5\u987B\u5728 `keyframes` \u91CC\u5B9A\u4E49\u8FC7\uFF0C\u5426\u5219\u4FDD\u5B58\u65F6\u62A5\u9519"],
379
+ ["`duration`", "\u662F", "\u2014", "\u65F6\u957F\uFF0C\u6BEB\u79D2\u3002\u5FC5\u987B\u5927\u4E8E 0"],
380
+ ["`delay`", "\u5426", "`0`", "\u5EF6\u8FDF\uFF0C\u6BEB\u79D2\u3002\u4EA4\u9519\u5165\u573A\u5C31\u9760\u5B83\u4E00\u683C\u4E00\u683C\u9519\u5F00"],
381
+ ["`easing`", "\u5426", "`ease`", `\u7F13\u52A8\uFF0C\u767D\u540D\u5355\u89C1\u4E0B`],
382
+ ["`iteration`", "\u5426", "`1`", "\u64AD\u653E\u6B21\u6570\uFF0C\u6B63\u6574\u6570\uFF1B`'infinite'` \u65E0\u9650\u5FAA\u73AF"],
383
+ [
384
+ "`direction`",
385
+ "\u5426",
386
+ "`normal`",
387
+ "`normal` / `reverse` / `alternate` / `alternate-reverse`"
388
+ ],
389
+ [
390
+ "`fill`",
391
+ "\u5426",
392
+ "`both`",
393
+ "`none` / `forwards` / `backwards` / `both`\u3002\u9ED8\u8BA4\u4FDD\u7559\u7EC8\u6001\uFF0C\u5165\u573A\u52A8\u753B\u4E0D\u8981\u6539\u5B83"
394
+ ]
395
+ ]
396
+ },
397
+ {
398
+ t: "p",
399
+ text: `\u53EF\u7528\u7684 \`easing\`\uFF1A${ALLOWED_EASINGS.map((item) => "`" + item + "`").join(" ")}\uFF0C
400
+ \u4EE5\u53CA \`cubic-bezier(0.34, 1.56, 0.64, 1)\` \u8FD9\u79CD\u56DB\u53C2\u6570\u5199\u6CD5\uFF08\u8D85\u8C03\u66F2\u7EBF\u624D\u6709\u300C\u5F39\u4E00\u4E0B\u300D\u7684\u624B\u611F\uFF09\u3002
401
+ \u522B\u7684\u5199\u6CD5\u4E00\u5F8B\u5728\u4FDD\u5B58\u65F6\u62A5\u9519\uFF0C\u4E0D\u505A\u300C\u770B\u7740\u50CF\u5C31\u653E\u884C\u300D\u7684\u6A21\u7CCA\u5224\u65AD\u3002`
402
+ },
403
+ {
404
+ t: "note",
405
+ tone: "warn",
406
+ text: "`fill` \u9ED8\u8BA4\u662F `both`\uFF0C\u522B\u6539\u6210 `none`\uFF1A\u5165\u573A\u52A8\u753B\u4E0D\u4FDD\u7559\u7EC8\u6001\u7684\u8BDD\uFF0C\u64AD\u5B8C\u90A3\u4E00\u5E27\u4F1A\u76F4\u63A5\u5F39\u56DE\u521D\u59CB\u503C\uFF08\u900F\u660E\u3001\u7F29\u5C0F\uFF09\uFF0C\u770B\u7740\u50CF\u95EA\u4E86\u4E00\u4E0B\u3002"
407
+ },
408
+ { t: "h3", text: "\u80FD\u6302\u5728\u54EA" },
409
+ {
410
+ t: "table",
411
+ head: ["\u4F4D\u7F6E", "\u5178\u578B\u7528\u9014"],
412
+ rows: [
413
+ ["`stage.animate`", "\u5F39\u7A97\u4E3B\u4F53\u5165\u573A\uFF08\u653E\u5927\u56DE\u5F39\u3001\u4E0A\u6ED1\uFF09"],
414
+ [
415
+ "`stage.maskAnimate`",
416
+ "\u906E\u7F69\u6DE1\u5165\u3002\u548C\u821E\u53F0\u5206\u5F00\u914D\uFF0C\u624D\u80FD\u5404\u8D70\u5404\u7684\u65F6\u957F\uFF1B\u906E\u7F69\u914D\u8272\u53E6\u89C1\u7B2C 3 \u8282\u7684 `maskStyle`\uFF0C\u4E24\u8005\u4E92\u4E0D\u5E72\u6270"
417
+ ],
418
+ ["\u4EFB\u610F\u8282\u70B9\u7684 `animate`", "\u7EA2\u5305\u547C\u5438\u3001\u6309\u94AE\u8109\u51B2\u3001\u626B\u5149\u3001\u5149\u70B9\u4E0A\u6D6E\u3001\u5217\u8868\u4EA4\u9519\u5165\u573A"],
419
+ [
420
+ "`stage.closeButton.animate`",
421
+ "\u5EF6\u8FDF\u6DE1\u5165\u7684 \u2715\uFF08\u5148\u8BA9\u7528\u6237\u770B\u5185\u5BB9\uFF0C\u518D\u9732\u51FA\u5173\u95ED\u5165\u53E3\uFF09"
422
+ ]
423
+ ]
424
+ },
425
+ { t: "h3", text: "\u4EA4\u9519\u5165\u573A\uFF1A\u540C\u4E00\u7EC4\u5173\u952E\u5E27 + \u4E0D\u540C delay" },
426
+ {
427
+ t: "p",
428
+ text: "\u4E00\u6392\u5361\u7247\u4F9D\u6B21\u6D6E\u4E0A\u6765\uFF0C\u4E0D\u9700\u8981\u51E0\u7EC4\u5173\u952E\u5E27\uFF0C\u4E00\u7EC4 `cellIn` \u914D\u4E0D\u540C `delay` \u5C31\u591F\u4E86\u3002\u6CE8\u610F `delay` \u5FC5\u987B\u662F**\u5E38\u91CF\u6570\u5B57**\uFF0C\u4E0D\u652F\u6301 `{{ }}` \u63D2\u503C \u2014\u2014 \u5B83\u8981\u62FC\u8FDB CSS \u7B80\u5199\uFF0C\u63D2\u503C\u8FDB\u53BB\u5C31\u6CA1\u6CD5\u505A\u5B89\u5168\u8FC7\u6EE4\u4E86\u3002\u6240\u4EE5\u6570\u91CF\u56FA\u5B9A\u7684\u4EA4\u9519\u5217\u8868\u8981\u4E00\u683C\u4E00\u683C\u5199\uFF0C\u4E0D\u80FD\u7528 `repeat` \u5FAA\u73AF\u51FA\u6765\u3002"
429
+ },
430
+ {
431
+ t: "code",
432
+ code: `"keyframes": {
433
+ "cellIn": {
434
+ "0%": { "opacity": "0", "transform": "translateY(10px)" },
435
+ "100%": { "opacity": "1", "transform": "translateY(0)" }
436
+ }
437
+ }
438
+
439
+ // \u4E94\u4E2A\u683C\u5B50\uFF0C\u6BCF\u683C\u665A 80ms
440
+ { "animate": { "name": "cellIn", "duration": 460, "delay": 340, "easing": "ease-out" } }
441
+ { "animate": { "name": "cellIn", "duration": 460, "delay": 420, "easing": "ease-out" } }
442
+ { "animate": { "name": "cellIn", "duration": 460, "delay": 500, "easing": "ease-out" } }`
443
+ },
444
+ { t: "h3", text: "\u65E0\u9650\u5FAA\u73AF\uFF1A\u547C\u5438\u3001\u626B\u5149\u3001\u5149\u70B9" },
445
+ {
446
+ t: "list",
447
+ items: [
448
+ '\u5FAA\u73AF\u52A8\u753B\u4E00\u5F8B `"iteration": "infinite"`\uFF0C\u914D `ease-in-out` \u6700\u81EA\u7136\uFF1B\u626B\u5149\u8FD9\u7C7B\u5300\u901F\u7684\u7528 `linear`',
449
+ "\u5FAA\u73AF\u5E45\u5EA6\u8981\u5C0F\u3002\u6309\u94AE\u8109\u51B2\u653E\u5927 2% \u5C31\u591F\uFF0C\u653E\u5927 10% \u4F1A\u628A\u5468\u56F4\u7684\u6392\u7248\u9876\u52A8\u3001\u4E5F\u6643\u773C",
450
+ '\u88C5\u9970\u6027\u56FE\u5C42\uFF08\u5149\u6655\u3001\u626B\u5149\u6761\u3001\u5149\u70B9\uFF09\u5FC5\u987B\u5199 `"pointerEvents": "none"`\uFF0C\u5426\u5219\u4F1A\u6321\u4F4F\u4E0B\u9762\u7684\u6309\u94AE',
451
+ "\u626B\u5149\u7528 `transform` \u4F4D\u79FB\uFF0C\u4E0D\u8981\u52A8 `left`\uFF1A\u52A8 `left` \u6BCF\u5E27\u90FD\u8981\u91CD\u6392\uFF0C`transform` \u53EA\u8D70\u5408\u6210\u5C42",
452
+ "\u6309\u94AE\u547C\u5438\u4F18\u5148\u52A8 `shadow` \u800C\u4E0D\u662F\u5C3A\u5BF8\uFF1A\u5C3A\u5BF8\u4E00\u53D8\uFF0C\u6574\u5757\u5185\u5BB9\u90FD\u4F1A\u8DDF\u7740\u52A8"
453
+ ]
454
+ },
455
+ {
456
+ t: "note",
457
+ tone: "info",
458
+ text: "\u4E00\u4E2A\u8282\u70B9\u53EA\u80FD\u6302\u4E00\u7EC4 `animate`\u3002\u65E2\u8981\u5165\u573A\u53C8\u8981\u5FAA\u73AF\u65F6\uFF0C\u628A\u5B83\u4EEC\u62C6\u5230\u7236\u5B50\u4E24\u5C42\u4E0A\uFF1A\u5916\u5C42\u8D1F\u8D23\u5165\u573A\uFF0C\u5185\u5C42\u8D1F\u8D23\u5FAA\u73AF\u3002"
459
+ },
460
+ { t: "h3", text: "hoverStyle\uFF1A\u9F20\u6807\u60AC\u505C" },
461
+ {
462
+ t: "p",
463
+ text: "`hoverStyle` \u548C `style` \u7528\u7684\u662F**\u540C\u4E00\u5957**\u5C5E\u6027\u767D\u540D\u5355\uFF0C\u5199\u6CD5\u4E5F\u4E00\u6837\uFF0C\u533A\u522B\u53EA\u5728\u4E8E\u5B83\u53EA\u5728\u9F20\u6807\u60AC\u505C\u65F6\u751F\u6548\u3002\u8282\u70B9\u548C `stage.closeButton` \u4E0A\u90FD\u80FD\u5199\u3002"
464
+ },
465
+ {
466
+ t: "code",
467
+ code: `{
468
+ "type": "text", "content": "\u2715",
469
+ "style": { "background": "rgba(0,0,0,0.08)", "transition": "background 0.2s" },
470
+ "hoverStyle": { "background": "rgba(0,0,0,0.2)" }
471
+ }`
472
+ },
473
+ {
474
+ t: "list",
475
+ items: [
476
+ "\u60F3\u8981\u5E73\u6ED1\u8FC7\u6E21\u5C31\u5728 `style` \u91CC\u5199 `transition`\uFF0C`hoverStyle` \u53EA\u8D1F\u8D23\u7EC8\u6001",
477
+ "\u89E6\u5C4F\u6CA1\u6709 hover\uFF0C\u6240\u4EE5 `hoverStyle` \u53EA\u80FD\u505A\u9526\u4E0A\u6DFB\u82B1\u7684\u6548\u679C\uFF0C**\u4E0D\u80FD\u627F\u8F7D\u4FE1\u606F**\uFF08\u522B\u628A\u4EF7\u683C\u85CF\u5728 hover \u91CC\uFF09",
478
+ "`hoverStyle` \u4F1A\u751F\u6210\u4E00\u6761 CSS \u89C4\u5219\u800C\u4E0D\u662F\u884C\u5185\u6837\u5F0F \u2014\u2014 \u884C\u5185\u6837\u5F0F\u6CA1\u6709 `:hover` \u8FD9\u56DE\u4E8B",
479
+ "`hoverStyle` \u91CC\u7684 `{{ }}` \u53EA\u5728\u9996\u5C4F\u6C42\u503C\u4E00\u6B21\uFF0C\u4E4B\u540E\u4E0D\u968F state \u53D8\u5316\u3002\u8981\u8DDF\u7740\u72B6\u6001\u53D8\u7684\u6837\u5F0F\u5199\u5728 `style` \u91CC \u2014\u2014 hover \u89C4\u5219\u82E5\u968F\u72B6\u6001\u53D8\uFF0C\u6574\u5F20\u6837\u5F0F\u8868\u5C31\u5F97\u53CD\u590D\u91CD\u5199\uFF0C\u9875\u9762\u4E0A\u6B63\u5728\u8DD1\u7684\u52A8\u753B\u4F1A\u5168\u90E8\u91CD\u5934\u64AD\u4E00\u904D"
480
+ ]
481
+ },
482
+ { t: "h3", text: "\u60AC\u505C\u65F6\u6682\u505C\u5FAA\u73AF\u52A8\u753B" },
483
+ {
484
+ t: "p",
485
+ text: '\u6309\u94AE\u4E00\u76F4\u5728\u547C\u5438\uFF0C\u9F20\u6807\u79FB\u4E0A\u53BB\u65F6\u505C\u4F4F\u3001\u770B\u6E05\u695A\u518D\u70B9\uFF0C\u662F\u5E38\u89C1\u505A\u6CD5\u3002\u5199 `animationPlayState: "paused"` \u5373\u53EF \u2014\u2014 \u5B83\u4E0D\u91CD\u64AD\u3001\u4E0D\u8DF3\u5E27\uFF0C\u5C31\u505C\u5728\u5F53\u524D\u90A3\u4E00\u5E27\uFF0C\u79FB\u5F00\u7EE7\u7EED\u3002\u53EA\u5728 `hoverStyle` \u91CC\u5199\u624D\u6709\u610F\u4E49\uFF08\u5199\u8FDB `style` \u7B49\u4E8E\u4E00\u4E0A\u6765\u5C31\u662F\u6682\u505C\u7684\uFF09\u3002'
486
+ },
487
+ {
488
+ t: "code",
489
+ code: `{
490
+ "type": "button", "text": "\u7ACB\u5373\u9886\u53D6",
491
+ "style": { "transition": "transform 0.18s" },
492
+ "animate": { "name": "breath", "duration": 2400, "easing": "ease-in-out", "iteration": "infinite" },
493
+ "hoverStyle": { "transform": "translateY(-2px)", "animationPlayState": "paused" }
494
+ }`
495
+ },
496
+ { t: "h3", text: "\u7CFB\u7EDF\u5F00\u4E86\u300C\u51CF\u5C11\u52A8\u6001\u6548\u679C\u300D\u4F1A\u81EA\u52A8\u9759\u6B62" },
497
+ {
498
+ t: "p",
499
+ text: "\u89E3\u91CA\u5668\u5728\u751F\u6210\u7684 CSS \u672B\u5C3E\u6052\u5B9A\u8FFD\u52A0\u4E00\u6761 `@media (prefers-reduced-motion: reduce)`\uFF0C\u628A\u8FD9\u4EFD\u7269\u6599\u91CC\u7684 `animation` \u4E0E `transition` \u5168\u90E8\u5173\u6389\u3002\u8FD9\u662F\u65E0\u969C\u788D\u8981\u6C42\uFF0C\u4E5F\u786E\u5B9E\u6709\u4EBA\u4E00\u770B\u52A8\u753B\u5C31\u6655\u3002**\u4E0D\u9700\u8981\u5728\u914D\u7F6E\u91CC\u505A\u4EFB\u4F55\u4E8B**\uFF0C\u4E5F\u6CA1\u6709\u5F00\u5173\u53EF\u4EE5\u7ED5\u8FC7\u5B83 \u2014\u2014 \u6240\u4EE5\u52A8\u753B\u53EA\u80FD\u662F\u9526\u4E0A\u6DFB\u82B1\uFF1A\u9759\u6B62\u72B6\u6001\u4E0B\u8FD9\u4EFD\u7269\u6599\u4E5F\u5FC5\u987B\u5B8C\u6574\u53EF\u8BFB\u3001\u53EF\u70B9\u3002"
500
+ },
501
+ { t: "h3", text: "\u4E3A\u4EC0\u4E48\u4E0D\u80FD\u76F4\u63A5\u5199 CSS" },
502
+ {
503
+ t: "p",
504
+ text: "\u5E38\u6709\u4EBA\u95EE\uFF1A\u65E2\u7136\u90FD\u80FD\u5199 `transform` \u4E86\uFF0C\u4E3A\u4EC0\u4E48\u4E0D\u5E72\u8106\u653E\u5F00 `position`\u3001\u653E\u5F00\u4E00\u4E2A `css` \u5B57\u6BB5\u968F\u4FBF\u5199\uFF1F\u56E0\u4E3A\u8FD9\u4EFD\u914D\u7F6E\u662F**\u4ECE\u540E\u53F0\u4E0B\u53D1\u3001\u8DD1\u5728\u7528\u6237\u9875\u9762\u4E0A\u7684**\uFF0C\u5B83\u548C\u9875\u9762\u5171\u4EAB\u540C\u4E00\u4E2A DOM\u3002"
505
+ },
506
+ {
507
+ t: "list",
508
+ items: [
509
+ "`position: fixed` + \u94FA\u6EE1\u89C6\u53E3 = \u4E00\u4EFD\u7269\u6599\u53EF\u4EE5\u76D6\u4F4F\u6574\u4E2A\u9875\u9762\uFF0C\u5305\u62EC\u6536\u94F6\u53F0\u548C\u5BFC\u822A \u2014\u2014 \u8FD9\u662F\u9493\u9C7C\u7684\u6807\u51C6\u505A\u6CD5\u3002\u5F39\u7A97\u8981\u94FA\u6EE1\u89C6\u53E3\u7531\u89E3\u91CA\u5668\u81EA\u5DF1\u5B8C\u6210\uFF0C\u4E0D\u7ECF\u8FC7\u914D\u7F6E",
510
+ "`z-index` \u53EA\u5141\u8BB8 0~10\uFF1A\u5C42\u5185\u6392\u5E03\u5341\u5C42\u7EF0\u7EF0\u6709\u4F59\uFF0C\u771F\u8981\u538B\u8FC7\u9875\u9762\u5176\u5B83\u5185\u5BB9\u7684\u662F\u5F39\u7A97\u5C42\uFF0C\u90A3\u7531\u89E3\u91CA\u5668\u7ED9",
511
+ "\u81EA\u7531 CSS \u610F\u5473\u7740\u53EF\u4EE5\u5199\u4EFB\u610F\u9009\u62E9\u5668\u53BB\u6539**\u5BBF\u4E3B\u9875\u9762**\u7684\u6837\u5F0F\uFF0C\u8D8A\u6743\u8303\u56F4\u6CA1\u6709\u8FB9\u754C",
512
+ "\u767D\u540D\u5355\u8FD8\u6709\u4E00\u4E2A\u597D\u5904\uFF1A\u5C5E\u6027\u6709\u9650\uFF0C\u7F16\u8F91\u5668\u624D\u80FD\u505A\u51FA\u53EF\u89C6\u5316\u9762\u677F\uFF1B\u81EA\u7531 CSS \u53EA\u80FD\u7ED9\u4E00\u4E2A\u6587\u672C\u6846"
513
+ ]
514
+ },
515
+ { t: "h3", text: "\u5B89\u5168\u8FC7\u6EE4\uFF1A\u4EC0\u4E48\u4F1A\u88AB\u6084\u6084\u4E22\u6389" },
516
+ {
517
+ t: "p",
518
+ text: "`keyframes` \u4E0E `hoverStyle` \u662F\u552F\u4E8C\u4F1A\u88AB**\u62FC\u6210 CSS \u6587\u672C**\u7684\u5730\u65B9\uFF08\u884C\u5185\u6837\u5F0F\u90A3\u6761\u8DEF\u5F84\u7531\u6846\u67B6\u8F6C\u4E49\uFF0C\u503C\u518D\u602A\u4E5F\u53EA\u662F\u4E0D\u751F\u6548\uFF09\u3002\u6240\u4EE5\u8FD9\u4E24\u5904\u7684\u6BCF\u4E2A\u503C\u90FD\u8981\u8FC7\u4E00\u904D\u8FC7\u6EE4\uFF0C\u4E0D\u5408\u683C\u7684**\u6574\u6761\u58F0\u660E\u4E22\u5F03**\uFF1A"
519
+ },
520
+ {
521
+ t: "list",
522
+ items: [
523
+ "\u503C\u91CC\u51FA\u73B0 `{` `}` `<` `>` `;` `@`\u3001\u6CE8\u91CA\u7B26 `/*` `*/` \u6216\u53CD\u659C\u6760 `\\` \u2014\u2014 \u8FD9\u4E9B\u5B57\u7B26\u80FD\u63D0\u524D\u95ED\u5408\u89C4\u5219\u3001\u63A5\u7740\u5199\u4EFB\u610F\u9009\u62E9\u5668",
524
+ "\u767D\u540D\u5355\u5916\u7684\u6837\u5F0F\u5C5E\u6027\uFF08\u540C `style`\uFF09",
525
+ "\u5173\u952E\u5E27\u540D / \u7F13\u52A8\u503C\u683C\u5F0F\u4E0D\u5408\u89C4\uFF08\u8FD9\u4E24\u9879\u5728\u4FDD\u5B58\u65F6\u5C31\u4F1A\u62A5\u9519\uFF0C\u4E0D\u4F1A\u8D70\u5230\u8FD0\u884C\u65F6\uFF09"
526
+ ]
527
+ },
528
+ {
529
+ t: "note",
530
+ tone: "warn",
531
+ text: "\u88AB\u4E22\u5F03\u7684\u662F**\u90A3\u4E00\u6761\u58F0\u660E**\uFF0C\u4E0D\u662F\u628A\u8FDD\u89C4\u5B57\u7B26\u5220\u6389\u540E\u7167\u5199 \u2014\u2014 \u534A\u622A\u503C\u540C\u6837\u53EF\u80FD\u62FC\u51FA\u610F\u6599\u5916\u7684\u6548\u679C\u3002\u6B63\u5E38\u5199\u989C\u8272\u3001`transform`\u3001\u9634\u5F71\u90FD\u78B0\u4E0D\u5230\u8FD9\u4E9B\u5B57\u7B26\uFF0C\u771F\u78B0\u5230\u4E86\u57FA\u672C\u5C31\u662F\u590D\u5236\u7C98\u8D34\u5E26\u8FDB\u4E86\u591A\u4F59\u5185\u5BB9\u3002"
532
+ },
533
+ { t: "h3", text: "\u5B8C\u6574\u4F8B\u5B50" },
534
+ {
535
+ t: "p",
536
+ text: "\u793A\u4F8B \u246A\u246B \u662F\u642C\u5BB6\u6210\u529F\u9875\u4E24\u4E2A\u7EBF\u4E0A\u5F39\u7A97\u7684\u4E00\u6BD4\u4E00\u590D\u523B\uFF1A\u246A \u6F14\u793A\u5165\u573A + \u547C\u5438 + \u76F8\u5BF9\u65F6\u957F\u5012\u8BA1\u65F6\uFF0C\u246B \u662F\u52A8\u753B\u6700\u5BC6\u7684\u4E00\u4EFD\uFF08\u5341\u4E00\u7EC4\u5173\u952E\u5E27\uFF1A\u5149\u6655\u547C\u5438\u3001\u5149\u70B9\u4E0A\u6D6E\u3001\u626B\u5149\u3001\u4EA4\u9519\u5165\u573A\u3001\u89D2\u6807\u8F7B\u6D6E\u3001CTA \u547C\u5438\uFF09\uFF0C\u4E24\u4EFD\u90FD\u5E26\u4E8C\u6B21\u633D\u7559\u5F39\u7A97\u3002\u8981\u505A\u52A8\u753B\u5F39\u7A97\uFF0C\u6539\u8FD9\u4E24\u4EFD\u6BD4\u4ECE\u96F6\u5199\u5FEB\u5F97\u591A\u3002"
537
+ }
538
+ ]
539
+ }
540
+ ];
541
+ var animation_default = sections2;
542
+
543
+ // src/docs/sections/countdown.ts
544
+ var sections3 = [
325
545
  {
326
546
  id: "countdown",
327
547
  title: "10. \u5012\u8BA1\u65F6",
@@ -395,6 +615,22 @@ var sections2 = [
395
615
  "style": { "color": "#999" } }
396
616
  ]`
397
617
  },
618
+ { t: "h3", text: "duration\uFF1A\u6BCF\u6B21\u6253\u5F00\u91CD\u65B0\u5012\u8BA1\u65F6" },
619
+ {
620
+ t: "p",
621
+ text: '`to` \u662F**\u7EDD\u5BF9**\u7ED3\u675F\u65F6\u95F4\uFF08\u6D3B\u52A8\u51E0\u53F7\u51E0\u70B9\u622A\u6B62\uFF09\uFF0C`duration` \u662F**\u76F8\u5BF9**\u65F6\u957F\uFF08\u6BEB\u79D2\uFF09\uFF0C\u4ECE\u8FD9\u4E00\u5C4F\u771F\u6B63\u5C55\u793A\u7684\u90A3\u4E00\u523B\u8D77\u7B97\u3002\u300C\u6253\u5F00\u5F39\u7A97\u540E 5 \u5206\u949F\u5185\u4E0B\u5355\u300D\u8FD9\u79CD\u8425\u9500\u8BDD\u672F\u7528\u540E\u8005\uFF0C\u5199 `"duration": 300000` \u5373\u53EF\uFF0C\u4E0D\u7528\u53BB\u7B97\u7ED3\u675F\u65F6\u95F4\u3002\u4E24\u4E2A\u81F3\u5C11\u8981\u6709\u4E00\u4E2A\uFF0C\u540C\u65F6\u5199\u4EE5 `to` \u4E3A\u51C6\uFF08\u5E76\u7ED9\u51FA\u8B66\u544A\uFF09\u3002'
622
+ },
623
+ {
624
+ t: "code",
625
+ code: `{ "type": "countdown", "duration": 300000, "precision": "cs",
626
+ "onEnd": { "type": "closeAll", "reason": "countdown-end" },
627
+ "children": [ /* \u540C\u4E0A */ ] }`
628
+ },
629
+ {
630
+ t: "note",
631
+ tone: "info",
632
+ text: "\u8D77\u7B97\u65F6\u523B\u9489\u5728\u8FD0\u884C\u65F6\u91CC\uFF1A\u5207 tab\u3001\u6539 state \u5BFC\u81F4\u6574\u68F5\u6E32\u67D3\u6811\u91CD\u7B97\uFF0C\u5269\u4F59\u65F6\u95F4**\u4E0D\u4F1A**\u88AB\u5237\u56DE\u53BB\u3002\u4F46\u5173\u6389\u518D\u6253\u5F00\u5C31\u662F\u65B0\u7684\u4E00\u8F6E \u2014\u2014 \u8FD9\u6B63\u662F\u300C\u6BCF\u6B21\u6253\u5F00\u91CD\u65B0\u5012 5 \u5206\u949F\u300D\u60F3\u8981\u7684\u6548\u679C\u3002"
633
+ },
398
634
  { t: "h3", text: "to\uFF1A\u7ED3\u675F\u65F6\u95F4\u600E\u4E48\u5199" },
399
635
  { t: "p", text: "**\u4E0D\u9700\u8981\u65F6\u95F4\u6233**\uFF0C\u76F4\u63A5\u5199\u65E5\u671F\u5C31\u884C\u3002\u4E0B\u9762\u8FD9\u4E9B\u5199\u6CD5\u90FD\u80FD\u8BC6\u522B\uFF1A" },
400
636
  {
@@ -426,14 +662,14 @@ var sections2 = [
426
662
  ]
427
663
  }
428
664
  ];
429
- var countdown_default = sections2;
665
+ var countdown_default = sections3;
430
666
 
431
667
  // src/docs/sections/data-state.ts
432
668
  var userFieldRows = DEFAULT_USER_FIELDS.map((field) => [
433
669
  `\`user.${field}\``,
434
670
  USER_FIELD_LABELS[field] || ""
435
671
  ]);
436
- var sections3 = [
672
+ var sections4 = [
437
673
  {
438
674
  id: "data",
439
675
  title: "8. \u6570\u636E\u4E0E\u72B6\u6001",
@@ -463,7 +699,12 @@ var sections3 = [
463
699
  {
464
700
  t: "note",
465
701
  tone: "info",
466
- text: "**\u76EE\u524D\u5DF2\u6CE8\u518C\u7684\u6570\u636E\u6E90**\uFF1A`shopAchievements`\uFF08\u5E97\u94FA\u6210\u679C\u7EDF\u8BA1\uFF0C\u8FD4\u56DE\u9879\u5B57\u6BB5 `v` \u52A8\u8BCD / `n` \u6570\u5B57 / `u` \u5355\u4F4D / `l` \u8BF4\u660E\uFF0C\u793A\u4F8B \u2462\u2463 \u7684\u6210\u679C\u683C\u5B50\u7528\u7684\u5C31\u662F\u5B83\uFF09\u3001`listRenewTiers`\uFF08\u7EED\u8D39\u4EF7\u683C\u6863\u4F4D\uFF0C\u5B57\u6BB5 `key` / `p` / `price` / `per` / `flag` / `hot` / `url`\uFF0C\u89C1\u793A\u4F8B \u2462\uFF09\u3002\u8981\u65B0\u7684\u627E\u524D\u7AEF\u767B\u8BB0\u3002"
702
+ text: "**\u76EE\u524D\u5DF2\u6CE8\u518C\u7684\u6570\u636E\u6E90**\uFF1A`userStatistics`\uFF08\u7528\u6237\u6570\u636E\u7EDF\u8BA1\uFF0C\u8FD4\u56DE\u4E00\u4E2A**\u6241\u5E73\u5BF9\u8C61**\u800C\u4E0D\u662F\u6570\u7EC4\uFF0C\u5B57\u6BB5\u540D\u5C31\u662F\u540E\u7AEF\u7684 snake_case\uFF0C\u5982 `move_success_count` \u7D2F\u8BA1\u642C\u5BB6\u6210\u529F\u6570 / `balance` \u642C\u5BB6\u6B21\u6570\u4F59\u989D / `ai_optimize_count` AI \u81EA\u52A8\u4F18\u5316\u6B21\u6570 / `white_image_fill_count` \u8865\u767D\u5E95\u56FE\u6B21\u6570\uFF0C\u793A\u4F8B \u2462\u2463 \u7684\u6210\u679C\u683C\u5B50\u7528\u7684\u5C31\u662F\u5B83\uFF09\u3001`listRenewTiers`\uFF08\u7EED\u8D39\u4EF7\u683C\u6863\u4F4D**\u6570\u7EC4**\uFF0C\u9879\u5B57\u6BB5 `key` / `p` / `price` / `per` / `flag` / `hot` / `url`\uFF0C\u89C1\u793A\u4F8B \u2462\uFF09\u3002\u8981\u65B0\u7684\u627E\u524D\u7AEF\u767B\u8BB0\u3002"
703
+ },
704
+ {
705
+ t: "note",
706
+ tone: "warn",
707
+ text: '**\u8FD4\u56DE\u6241\u5E73\u5BF9\u8C61\u7684\u6570\u636E\u6E90\uFF08\u5982 `userStatistics`\uFF09\u4E0D\u80FD\u7528 `repeat` \u7684 `bind` \u904D\u5386**\uFF0C\u683C\u5B50\u53EA\u80FD\u4E00\u4E2A\u4E2A\u5199\uFF0C\u6BCF\u683C\u76F4\u63A5\u63D2\u503C `{{ stat.move_success_count }}`\u3002\u4E5F\u4E0D\u8981\u8BD5\u56FE\u5728 `data` \u7684\u5199\u6B7B\u6570\u7EC4\u91CC\u585E `{{ }}` \u518D\u9760 `bind` \u5C55\u5F00 \u2014\u2014 `data` \u91CC\u7684\u9759\u6001\u503C\u539F\u6837\u5B58\uFF0C`{{ }}` \u53EA\u5728\u6E32\u67D3\u8282\u70B9\u65F6\u6C42\u503C\u4E00\u6B21\uFF0C`{{ item.n }}` \u6C42\u51FA\u6765\u662F\u5B57\u7B26\u4E32 `"{{ stat.xxx }}"`\uFF0C**\u4E0D\u4F1A\u4E8C\u6B21\u6C42\u503C**\uFF0C\u9875\u9762\u4E0A\u4F1A\u539F\u6837\u663E\u793A\u8FD9\u4E00\u4E32\u82B1\u62EC\u53F7\u3002'
467
708
  },
468
709
  {
469
710
  t: "p",
@@ -601,10 +842,10 @@ var sections3 = [
601
842
  ]
602
843
  }
603
844
  ];
604
- var data_state_default = sections3;
845
+ var data_state_default = sections4;
605
846
 
606
847
  // src/docs/sections/guide-basics.ts
607
- var sections4 = [
848
+ var sections5 = [
608
849
  {
609
850
  id: "ai",
610
851
  title: "0. \u4E0D\u4F1A\u5199 JSON\uFF1F\u7528 AI \u751F\u6210",
@@ -717,10 +958,10 @@ var sections4 = [
717
958
  ]
718
959
  }
719
960
  ];
720
- var guide_basics_default = sections4;
961
+ var guide_basics_default = sections5;
721
962
 
722
963
  // src/docs/sections/guide-layout.ts
723
- var sections5 = [
964
+ var sections6 = [
724
965
  {
725
966
  id: "layout",
726
967
  title: "4. \u5E03\u5C40\u6A21\u578B\uFF08\u6700\u91CD\u8981\uFF09",
@@ -863,10 +1104,10 @@ var sections5 = [
863
1104
  ]
864
1105
  }
865
1106
  ];
866
- var guide_layout_default = sections5;
1107
+ var guide_layout_default = sections6;
867
1108
 
868
1109
  // src/docs/sections/guide-stage.ts
869
- var sections6 = [
1110
+ var sections7 = [
870
1111
  {
871
1112
  id: "stage",
872
1113
  title: "3. stage \u821E\u53F0",
@@ -879,6 +1120,8 @@ var sections6 = [
879
1120
  "layout": "flow", // absolute\uFF08\u9ED8\u8BA4\uFF09| flow
880
1121
  "mask": true, // \u662F\u5426\u6709\u534A\u900F\u660E\u906E\u7F69\uFF0C\u4EC5 popup \u6709\u6548
881
1122
  "maskClosable": false, // \u70B9\u906E\u7F69\u80FD\u5426\u5173\u95ED
1123
+ "maskStyle": { "background": "rgba(0,0,0,0.65)" }, // \u906E\u7F69\u914D\u8272\uFF08\u53EF\u9009\uFF09
1124
+ "maskAction": { "type": "open", "view": "confirm" }, // \u70B9\u906E\u7F69\u505A\u4EC0\u4E48\uFF08\u53EF\u9009\uFF09
882
1125
  "closeButton": {
883
1126
  "show": true,
884
1127
  "position": "top-right", // top-right | top-left | bottom-center
@@ -895,7 +1138,17 @@ var sections6 = [
895
1138
  ["height", "400", '\u6570\u5B57\u6309 px\uFF1B\u5199 `auto` \u65F6\u5FC5\u987B\u540C\u65F6\u8BBE `layout: "flow"`'],
896
1139
  ["layout", "absolute", "\u5B50\u8282\u70B9\u6392\u5E03\u65B9\u5F0F\uFF0C\u89C1\u7B2C 4 \u8282\u3002\u9009\u9519\u662F\u6700\u5E38\u89C1\u7684\u9519\u8BEF"],
897
1140
  ["mask", "true", "\u4EC5 popup \u751F\u6548"],
898
- ["maskClosable", "false", "\u70B9\u906E\u7F69\u5173\u95ED"],
1141
+ ["maskClosable", "false", "\u70B9\u906E\u7F69\u80FD\u4E0D\u80FD\u70B9\uFF08\u80FD\u4E0D\u80FD\u5173\uFF09"],
1142
+ [
1143
+ "maskStyle",
1144
+ "`rgba(0,0,0,0.55)`",
1145
+ "\u906E\u7F69\u81EA\u8EAB\u6837\u5F0F\uFF0C\u8D70 style \u767D\u540D\u5355\u3002\u5E38\u7528 `background` \u8C03\u6DF1\u6D45\u3001`backdropFilter` \u52A0\u6BDB\u73BB\u7483"
1146
+ ],
1147
+ [
1148
+ "maskAction",
1149
+ "\u65E0\uFF08\u5173\u6389\u8FD9\u4E00\u5C42\uFF09",
1150
+ "\u70B9\u906E\u7F69\u6267\u884C\u7684\u52A8\u4F5C\u3002\u914D\u4E86\u5C31**\u4E0D\u5173\u5C42**\uFF0C\u53EA\u6267\u884C\u52A8\u4F5C"
1151
+ ],
899
1152
  ["closeButton", "\u65E0", "\u4E0D\u5199\u5C31\u6CA1\u6709\u5173\u95ED\u6309\u94AE"],
900
1153
  ["style", "\u65E0", "\u821E\u53F0\u81EA\u8EAB\u6837\u5F0F\uFF0C\u5E38\u7528 `radius` / `maxWidth` / `background`"]
901
1154
  ]
@@ -905,6 +1158,32 @@ var sections6 = [
905
1158
  tone: "info",
906
1159
  text: "\u5F39\u7A97\u6BD4\u5C4F\u5E55\u9AD8\u65F6\u4F1A\u81EA\u52A8\u51FA\u73B0\u6EDA\u52A8\uFF0C\u4E0D\u4F1A\u88AB\u88C1\u6389\u3002\u6240\u4EE5\u505A\u957F\u5F39\u7A97\u4E0D\u7528\u62C5\u5FC3\u5C0F\u5C4F\u770B\u4E0D\u5168\uFF0C\u4F46\u4ECD\u5EFA\u8BAE\u63A7\u5236\u5728 700px \u4EE5\u5185\u3002"
907
1160
  },
1161
+ { t: "h3", text: "\u906E\u7F69\uFF1A\u6539\u914D\u8272\u3001\u6539\u70B9\u51FB\u884C\u4E3A" },
1162
+ {
1163
+ t: "p",
1164
+ text: "\u906E\u7F69\u9ED8\u8BA4\u662F `rgba(0, 0, 0, 0.55)` \u7684\u7EAF\u8272\u3002`maskStyle` \u8986\u76D6\u5B83\uFF0C\u8D70\u7684\u662F\u7B2C 7 \u8282\u90A3\u4EFD style \u767D\u540D\u5355\uFF0C\u5199\u522B\u7684\u5C5E\u6027\u4F1A\u88AB\u5FFD\u7565\uFF08\u4FDD\u5B58\u65F6\u7ED9\u8B66\u544A\uFF09\u3002\u94FA\u6EE1\u3001\u5C42\u7EA7\u8FD9\u4E9B\u5730\u57FA\u7531\u89E3\u91CA\u5668\u7ED9\uFF0C\u914D\u7F6E\u76D6\u4E0D\u6389\u3002"
1165
+ },
1166
+ {
1167
+ t: "code",
1168
+ code: `"stage": {
1169
+ "mask": true,
1170
+ "maskClosable": true,
1171
+ // \u66F4\u91CD\u7684\u906E\u7F69 + \u6BDB\u73BB\u7483\uFF08\u80CC\u540E\u9875\u9762\u7CCA\u6389\uFF0C\u5F39\u7A97\u66F4\u805A\u7126\uFF09
1172
+ "maskStyle": { "background": "rgba(0,0,0,0.65)", "backdropFilter": "blur(4px)" },
1173
+ // \u70B9\u906E\u7F69\u4E0D\u76F4\u63A5\u5173\uFF0C\u5148\u5F39\u4E8C\u6B21\u633D\u7559
1174
+ "maskAction": { "type": "open", "view": "confirm", "mode": "stack" }
1175
+ }`
1176
+ },
1177
+ {
1178
+ t: "note",
1179
+ tone: "warn",
1180
+ text: "`maskClosable` \u548C `maskAction` \u5404\u7BA1\u4E00\u4EF6\u4E8B\uFF1A\u524D\u8005\u51B3\u5B9A**\u906E\u7F69\u54CD\u4E0D\u54CD\u5E94\u70B9\u51FB**\uFF0C\u540E\u8005\u51B3\u5B9A**\u70B9\u4E86\u4E4B\u540E\u505A\u4EC0\u4E48**\u3002\u6240\u4EE5 `maskClosable: false` \u65F6\u906E\u7F69\u4ECD\u7136\u70B9\u4E0D\u52A8\uFF0C\u5149\u914D `maskAction` \u6CA1\u6709\u7528\uFF08\u4FDD\u5B58\u65F6\u4F1A\u63D0\u9192\uFF09\u3002\u60F3\u300C\u70B9\u906E\u7F69\u5F39\u633D\u7559\u300D\u5C31\u4E24\u4E2A\u4E00\u8D77\u5199\u3002"
1181
+ },
1182
+ {
1183
+ t: "note",
1184
+ tone: "info",
1185
+ text: "`maskStyle` \u548C `maskAnimate`\uFF08\u7B2C 15 \u8282\uFF09\u4E92\u4E0D\u5E72\u6270\uFF1A\u52A8\u753B\u7684 `animation` \u6C38\u8FDC\u6392\u5728\u6700\u540E\uFF0C\u6539\u914D\u8272\u4E0D\u4F1A\u628A\u6DE1\u5165\u5F04\u4E22\u3002"
1186
+ },
908
1187
  { t: "h3", text: "closeButton \u5173\u95ED\u6309\u94AE" },
909
1188
  {
910
1189
  t: "code",
@@ -917,7 +1196,9 @@ var sections6 = [
917
1196
  // icon / image \u90FD\u4E0D\u5199\u65F6\uFF0C\u753B\u7684\u662F\u5185\u7F6E\u7684\u77E2\u91CF \xD7 \u56FE\u6807\uFF08\u63A8\u8350\uFF0C\u4E0D\u7528\u914D\uFF09
918
1197
  "icon": "\u2715", // \u53EF\u9009\uFF1A\u6539\u6210\u6587\u672C\u5B57\u7B26 / emoji
919
1198
  "image": "https://...", // \u53EF\u9009\uFF1A\u6539\u6210\u56FE\u7247\uFF0C\u5199\u4E86\u5C31\u76D6\u8FC7 icon
920
- "style": { "background": "rgba(0,0,0,0.35)", "color": "#fff", "fontSize": 18 }
1199
+ "style": { "background": "rgba(0,0,0,0.35)", "color": "#fff", "fontSize": 18 },
1200
+ // \u53EF\u9009\uFF1A\u70B9\u5B83\u505A\u4EC0\u4E48\u3002\u4E0D\u5199 = \u5173\u6389\u8FD9\u4E00\u5C42\uFF1B\u5199\u4E86 = \u53EA\u6267\u884C\u8FD9\u4E2A\u52A8\u4F5C\uFF0C\u4E0D\u5173\u5C42
1201
+ "action": { "type": "open", "view": "confirm", "mode": "stack" }
921
1202
  }`
922
1203
  },
923
1204
  {
@@ -934,9 +1215,19 @@ var sections6 = [
934
1215
  "**\u53EF\u9009\u8986\u76D6\u9879**\u3002\u5199\u4E86\u5C31\u7528\u8FD9\u4E2A\u6587\u672C\u5B57\u7B26 / emoji \u4EE3\u66FF\u5185\u7F6E\u56FE\u6807"
935
1216
  ],
936
1217
  ["image", "\u65E0", "\u56FE\u7247\u56FE\u6807\uFF0C\u4F1A\u94FA\u6EE1\u6309\u94AE\uFF08`object-fit: contain`\uFF09"],
937
- ["style", "\u65E0", "\u8D70 style \u767D\u540D\u5355\uFF0C\u53EF\u6539\u80CC\u666F\u3001\u989C\u8272\u3001\u5706\u89D2\u3001\u8FB9\u6846\u3001\u9634\u5F71\u7B49"]
1218
+ ["style", "\u65E0", "\u8D70 style \u767D\u540D\u5355\uFF0C\u53EF\u6539\u80CC\u666F\u3001\u989C\u8272\u3001\u5706\u89D2\u3001\u8FB9\u6846\u3001\u9634\u5F71\u7B49"],
1219
+ [
1220
+ "action",
1221
+ "\u65E0\uFF08\u5173\u6389\u8FD9\u4E00\u5C42\uFF09",
1222
+ "\u70B9\u5B83\u6267\u884C\u7684\u52A8\u4F5C\u3002\u914D\u4E86\u5C31**\u4E0D\u5173\u5C42**\uFF0C\u300C\u70B9 \u2715 \u5148\u5F39\u4E8C\u6B21\u633D\u7559\u300D\u9760\u5B83"
1223
+ ]
938
1224
  ]
939
1225
  },
1226
+ {
1227
+ t: "note",
1228
+ tone: "warn",
1229
+ text: '\u914D\u4E86 `action` \u4E4B\u540E\u8FD9\u4E2A \u2715 **\u4E0D\u4F1A\u518D\u81EA\u52A8\u5173\u95ED\u5F39\u7A97**\u2014\u2014\u60F3\u5728\u52A8\u4F5C\u91CC\u987A\u5E26\u5173\u6389\uFF0C\u81EA\u5DF1\u5199\u8FDB\u53BB\uFF08`{ "type": "sequence", "actions": [ {"type":"track", \u2026}, {"type":"close", "reason":"user-dismiss"} ] }`\uFF09\u3002\u5FD8\u4E86\u5199\u7684\u8868\u73B0\u662F\u300C\u70B9 \u2715 \u6CA1\u53CD\u5E94\u300D\u3002'
1230
+ },
940
1231
  { t: "h3", text: "\u56FE\u6807\u753B\u4EC0\u4E48\uFF1A\u4E09\u9009\u4E00\uFF0C\u4F18\u5148\u7EA7\u56FA\u5B9A" },
941
1232
  {
942
1233
  t: "table",
@@ -1027,7 +1318,7 @@ var sections6 = [
1027
1318
  ]
1028
1319
  }
1029
1320
  ];
1030
- var guide_stage_default = sections6;
1321
+ var guide_stage_default = sections7;
1031
1322
 
1032
1323
  // src/docs/sections/nodes.ts
1033
1324
  var containerRows = [
@@ -1057,7 +1348,7 @@ var contentRows = [
1057
1348
  var styleRows = [
1058
1349
  [
1059
1350
  "\u6587\u5B57",
1060
- "`color` `fontSize` `fontWeight` `fontFamily` `lineHeight` `letterSpacing` `textAlign` `textDecoration` `whiteSpace` `fontVariantNumeric`"
1351
+ "`color` `fontSize` `fontWeight` `fontFamily` `fontStyle` `lineHeight` `letterSpacing` `textAlign` `textDecoration` `whiteSpace` `fontVariantNumeric` `textShadow`"
1061
1352
  ],
1062
1353
  [
1063
1354
  "\u80CC\u666F",
@@ -1071,11 +1362,15 @@ var styleRows = [
1071
1362
  ["flex \u5BB9\u5668", "`direction` `gap` `wrap` `align` `justify`"],
1072
1363
  [
1073
1364
  "flex \u5B50\u9879 / \u5C3A\u5BF8",
1074
- "`flex` `alignSelf` `width` `height` `minWidth` `minHeight` `maxWidth` `maxHeight`"
1365
+ "`flex` `alignSelf` `flexShrink` `width` `height` `minWidth` `minHeight` `maxWidth` `maxHeight`"
1366
+ ],
1367
+ [
1368
+ "\u52A8\u6548 / \u5C42\u7EA7\uFF08\u89C1\u7B2C 15 \u8282\uFF09",
1369
+ "`transform` `transformOrigin` `transition` `animationPlayState` `backdropFilter` `zIndex` `pointerEvents`"
1075
1370
  ],
1076
1371
  ["\u56FE\u7247 / \u6BD4\u4F8B", "`objectFit` `aspectRatio`"]
1077
1372
  ];
1078
- var sections7 = [
1373
+ var sections8 = [
1079
1374
  {
1080
1375
  id: "nodes",
1081
1376
  title: "6. \u8282\u70B9\u7C7B\u578B",
@@ -1172,7 +1467,10 @@ var sections7 = [
1172
1467
  'flex \u5217\u5BB9\u5668\u7684\u5B50\u9879\u9ED8\u8BA4\u88AB\u62C9\u6EE1\u6574\u884C\uFF0C\u6807\u7B7E\u7C7B\u5143\u7D20\u8981\u5199 `alignSelf: "flex-start"`',
1173
1468
  "\u5927\u5B57\u53F7\u6587\u672C\u8981\u663E\u5F0F\u5199 `lineHeight`\uFF0C\u5426\u5219\u9ED8\u8BA4\u884C\u9AD8\u4F1A\u628A\u5BB9\u5668\u6491\u9AD8",
1174
1469
  '\u9010\u5E27\u53D8\u5316\u7684\u6570\u5B57\uFF08\u5012\u8BA1\u65F6\u5398\u79D2\uFF09\u8981\u5199 `fontVariantNumeric: "tabular-nums"`\uFF0C\u5426\u5219\u6570\u5B57\u4F1A\u6296',
1175
- "`style` \u7684\u503C\u4E5F\u652F\u6301 `{{ }}` \u63D2\u503C\uFF0C\u9009\u4E2D\u6001\u5C31\u662F\u9760\u8FD9\u4E2A\u505A\u7684"
1470
+ "`style` \u7684\u503C\u4E5F\u652F\u6301 `{{ }}` \u63D2\u503C\uFF0C\u9009\u4E2D\u6001\u5C31\u662F\u9760\u8FD9\u4E2A\u505A\u7684",
1471
+ "`zIndex` \u53EA\u5141\u8BB8 0~10\uFF0C\u8D85\u51FA\u4F1A\u88AB\u5939\u5230\u533A\u95F4\u5185\uFF1B\u6CA1\u6709 `position`\uFF1A\u7EDD\u5BF9\u5B9A\u4F4D\u7EDF\u4E00\u7528 `rect`",
1472
+ "\u914D\u4E86 `zIndex` \u7684\u8282\u70B9\u4F1A\u81EA\u52A8\u5E26\u4E0A\u5B9A\u4F4D\u65B9\u5F0F \u2014\u2014 `z-index` \u5BF9\u9759\u6001\u5143\u7D20\u662F\u6B7B\u58F0\u660E\uFF0C\u4E0D\u8FD9\u4E48\u505A\uFF0C\u9760\u8D1F `marginTop` \u5F80\u4E0A\u76D6\u7684\u5757\uFF08\u5982\u538B\u4F4F\u7EA2\u5934\u4E0B\u6CBF\u7684\u767D\u8272\u4E3B\u4F53\uFF09\u6C38\u8FDC\u76D6\u4E0D\u4F4F\u524D\u4E00\u4E2A\u5144\u5F1F\u8282\u70B9",
1473
+ '\u5149\u6655\u3001\u626B\u5149\u8FD9\u7C7B\u538B\u5728\u6309\u94AE\u4E0A\u7684\u88C5\u9970\u5C42\u8981\u5199 `pointerEvents: "none"`\uFF0C\u5426\u5219\u4F1A\u6321\u4F4F\u70B9\u51FB'
1176
1474
  ]
1177
1475
  },
1178
1476
  {
@@ -1188,10 +1486,10 @@ var sections7 = [
1188
1486
  ]
1189
1487
  }
1190
1488
  ];
1191
- var nodes_default = sections7;
1489
+ var nodes_default = sections8;
1192
1490
 
1193
1491
  // src/docs/sections/views.ts
1194
- var sections8 = [
1492
+ var sections9 = [
1195
1493
  {
1196
1494
  id: "views",
1197
1495
  title: "12. \u591A\u89C6\u56FE\uFF08\u4E00\u4EFD\u914D\u7F6E\u91CC\u653E\u51E0\u4E2A\u5F39\u7A97\uFF09",
@@ -1343,10 +1641,10 @@ var sections8 = [
1343
1641
  ]
1344
1642
  }
1345
1643
  ];
1346
- var views_default = sections8;
1644
+ var views_default = sections9;
1347
1645
 
1348
1646
  // src/docs/sections/index.ts
1349
- var sections9 = [].concat(
1647
+ var sections10 = [].concat(
1350
1648
  guide_basics_default,
1351
1649
  // 0~2
1352
1650
  guide_stage_default,
@@ -1361,13 +1659,42 @@ var sections9 = [].concat(
1361
1659
  // 10
1362
1660
  action_default,
1363
1661
  // 11
1364
- views_default
1662
+ views_default,
1365
1663
  // 12~14
1664
+ animation_default
1665
+ // 15
1366
1666
  );
1367
- var sections_default = sections9;
1667
+ var sections_default = sections10;
1368
1668
 
1369
1669
  // src/docs/meta.ts
1370
1670
  var changelog = [
1671
+ {
1672
+ date: "2026-09-01",
1673
+ items: [
1674
+ "`zIndex` \u73B0\u5728\u4F1A\u81EA\u52A8\u5E26\u4E0A\u5B9A\u4F4D\u65B9\u5F0F\uFF1A`z-index` \u5BF9\u9759\u6001\u5143\u7D20\u662F\u6B7B\u58F0\u660E\uFF0C\u5199\u4E86\u4E0D\u751F\u6548\u3002\u6D41\u5F0F\u6392\u7248\u91CC\u9760\u8D1F `marginTop` \u5F80\u4E0A\u76D6\u7684\u5757\uFF08\u5982\u538B\u4F4F\u7EA2\u5934\u4E0B\u6CBF\u7684\u767D\u8272\u4E3B\u4F53\uFF09\u5FC5\u987B\u6709\u5C42\u7EA7\u624D\u76D6\u5F97\u4F4F\uFF0C\u914D\u4E86 `zIndex` \u5373\u53EF\uFF0C\u4E0D\u7528\uFF08\u4E5F\u6CA1\u6CD5\uFF09\u53E6\u914D `position`",
1675
+ "\u3010\u4FEE\u590D\u3011\u5F39\u51FA\u7B2C\u4E8C\u5C42\u5F39\u7A97\uFF08\u5982\u4E8C\u6B21\u633D\u7559\uFF09\u518D\u5173\u6389\u65F6\uFF0C\u4E0B\u5C42\u5F39\u7A97\u7684\u906E\u7F69\u5165\u573A\u52A8\u753B\u4F1A\u91CD\u64AD\u4E00\u904D\uFF0C\u80CC\u666F\u300C\u95EA\u300D\u4E00\u4E0B\u91CD\u65B0\u6DE1\u5165\u3002\u73B0\u5DF2\u4FEE\u6B63\uFF0C\u914D\u7F6E\u5199\u6CD5\u4E0D\u7528\u6539",
1676
+ "\u3010\u4FEE\u590D\u3011\u5207\u89C6\u56FE / \u5207 tab / `visibleWhen` \u7FFB\u8F6C\u65F6\uFF0C\u9875\u9762\u4E0A\u6B63\u5728\u8DD1\u7684\u5FAA\u73AF\u52A8\u753B\u4F1A\u5168\u90E8\u91CD\u5934\u64AD\u4E00\u904D\u3002\u73B0\u5DF2\u4FEE\u6B63",
1677
+ "`hoverStyle` \u91CC\u7684 `{{ }}` \u53EA\u5728\u9996\u5C4F\u6C42\u503C\u4E00\u6B21\uFF0C\u4E4B\u540E\u4E0D\u968F state \u53D8\u5316\u2014\u2014\u8981\u8DDF\u7740\u72B6\u6001\u53D8\u7684\u6837\u5F0F\u5199\u5728 `style` \u91CC\uFF08\u90A3\u6761\u8DEF\u5F84\u6BCF\u5E27\u90FD\u4F1A\u91CD\u7B97\uFF09"
1678
+ ]
1679
+ },
1680
+ {
1681
+ date: "2026-08-31",
1682
+ items: [
1683
+ "\u65B0\u589E\u52A8\u753B\u80FD\u529B\uFF08\u7B2C 15 \u8282\uFF09\uFF1A\u9876\u5C42 keyframes \u5B9A\u4E49\u5173\u952E\u5E27\uFF0C\u8282\u70B9 / stage / \u906E\u7F69 / \u5173\u95ED\u6309\u94AE\u4E0A\u7528 animate \u5F15\u7528\uFF0C\u652F\u6301\u5EF6\u8FDF\u3001\u65E0\u9650\u5FAA\u73AF\u3001\u65B9\u5411\u4E0E\u586B\u5145\u6A21\u5F0F",
1684
+ "\u65B0\u589E hoverStyle\uFF1A\u4E0E style \u540C\u4E00\u5957\u5C5E\u6027\u767D\u540D\u5355\uFF0C\u53EA\u5728\u9F20\u6807\u60AC\u505C\u65F6\u751F\u6548\uFF08\u89E6\u5C4F\u6CA1\u6709 hover\uFF0C\u522B\u628A\u4FE1\u606F\u653E\u8FDB\u53BB\uFF09",
1685
+ "style \u767D\u540D\u5355\u65B0\u589E transform / transformOrigin / transition / backdropFilter / textShadow / zIndex\uFF080~10\uFF09 / pointerEvents / flexShrink / fontStyle\uFF08\u7B2C 7 \u8282\uFF09",
1686
+ "\u4ECD\u7136\u4E0D\u653E\u5F00 position \u4E0E\u81EA\u7531 CSS\uFF1A\u7EDD\u5BF9\u5B9A\u4F4D\u7528 rect\uFF0C\u5F39\u7A97\u94FA\u6EE1\u89C6\u53E3\u7531\u89E3\u91CA\u5668\u5B8C\u6210\u2014\u2014\u653E\u5F00\u7B49\u4E8E\u628A\u300C\u5168\u5C4F\u8986\u76D6\u9493\u9C7C\u300D\u4EA4\u56DE\u7ED9\u914D\u7F6E\uFF08\u7B2C 15 \u8282\u6709\u5B8C\u6574\u7406\u7531\uFF09",
1687
+ "\u7CFB\u7EDF\u5F00\u4E86\u300C\u51CF\u5C11\u52A8\u6001\u6548\u679C\u300D\u65F6\u81EA\u52A8\u5173\u6389\u8FD9\u4EFD\u7269\u6599\u7684\u5168\u90E8\u52A8\u753B\u4E0E\u8FC7\u6E21\uFF0C\u914D\u7F6E\u91CC\u4E0D\u7528\u7BA1\uFF0C\u4E5F\u6CA1\u6709\u5F00\u5173\u80FD\u7ED5\u8FC7",
1688
+ "countdown \u65B0\u589E duration\uFF08\u76F8\u5BF9\u65F6\u957F\uFF0C\u6BEB\u79D2\uFF0C\u4ECE\u8FD9\u4E00\u5C4F\u5C55\u793A\u90A3\u4E00\u523B\u8D77\u7B97\uFF09\uFF1A\u300C\u6BCF\u6B21\u6253\u5F00\u91CD\u65B0\u5012 5 \u5206\u949F\u300D\u4E0D\u7528\u518D\u53BB\u7B97\u7ED3\u675F\u65F6\u95F4\uFF1Bto \u4E0E duration \u81F3\u5C11\u8981\u6709\u4E00\u4E2A\uFF08\u7B2C 10 \u8282\uFF09",
1689
+ "\u65B0\u589E\u793A\u4F8B \u246A 4 \u6298\u4E13\u5C5E\u793C\u5305\u3001\u246B 1 \u5206\u94B1\u534A\u5E74\u5361\uFF1A\u642C\u5BB6\u6210\u529F\u9875\u4E24\u4E2A\u7EBF\u4E0A\u5F39\u7A97\u7684\u4E00\u6BD4\u4E00\u590D\u523B\uFF0C\u542B\u5165\u573A / \u547C\u5438 / \u626B\u5149 / \u4EA4\u9519\u5165\u573A / \u4E8C\u6B21\u633D\u7559\u5F39\u7A97\uFF0C\u8981\u505A\u52A8\u753B\u5F39\u7A97\u6539\u8FD9\u4E24\u4EFD\u6700\u5FEB",
1690
+ "AI \u63D0\u793A\u8BCD\u8865\u4E0A\u52A8\u753B\u4E0E hover \u7684\u786C\u89C4\u5219\uFF0C\u81EA\u68C0\u6E05\u5355\u52A0\u4E86\u5173\u952E\u5E27\u5F15\u7528\u4E0E\u88C5\u9970\u5C42\u70B9\u51FB\u7A7F\u900F\u4E24\u6761",
1691
+ "\u65B0\u589E stage.maskStyle\uFF08\u7B2C 3 \u8282\uFF09\uFF1A\u906E\u7F69\u914D\u8272\u7EC8\u4E8E\u80FD\u6539\u4E86\uFF0C\u8D70 style \u767D\u540D\u5355\uFF0C\u5E38\u7528 background \u8C03\u6DF1\u6D45 + backdropFilter \u52A0\u6BDB\u73BB\u7483\uFF1B\u4E0D\u5199\u4ECD\u662F\u5185\u7F6E\u7684 rgba(0,0,0,0.55)",
1692
+ "\u65B0\u589E stage.maskAction\uFF08\u7B2C 3 \u8282\uFF09\uFF1A\u70B9\u906E\u7F69\u6267\u884C\u6307\u5B9A\u52A8\u4F5C\u800C\u4E0D\u662F\u76F4\u63A5\u5173\uFF0C\u300C\u70B9\u906E\u7F69\u5148\u5F39\u4E8C\u6B21\u633D\u7559\u300D\u4E0D\u7528\u518D\u81EA\u5DF1\u94FA\u4E00\u5C42\u900F\u660E\u8282\u70B9\u3002\u5B83\u4E0E maskClosable \u5404\u7BA1\u4E00\u4EF6\u4E8B\u2014\u2014\u906E\u7F69\u4E0D\u53EF\u70B9\u65F6\u914D\u4E86\u4E5F\u4E0D\u89E6\u53D1\uFF0C\u4FDD\u5B58\u65F6\u4F1A\u63D0\u9192",
1693
+ "\u65B0\u589E stage.closeButton.action\uFF08\u7B2C 3 \u8282\uFF09\uFF1A\u5185\u7F6E \u2715 \u4E5F\u80FD\u63A5\u52A8\u4F5C\u4E86\uFF0C\u4EE5\u524D\u60F3\u300C\u70B9 \u2715 \u5F39\u633D\u7559\u300D\u53EA\u80FD\u653E\u5F03\u5185\u7F6E\u6309\u94AE\u3001\u81EA\u5DF1\u6446\u4E00\u4E2A\u6587\u672C \u2715\uFF08\u5B57\u5F62\u504F\u4E0B\u3001\u8FD8\u5F97\u624B\u5199\u5B9A\u4F4D\uFF09\u3002\u914D\u4E86 action \u5C31\u4E0D\u518D\u81EA\u52A8\u5173\u5C42\uFF0C\u8981\u5173\u81EA\u5DF1\u628A close \u5199\u8FDB\u52A8\u4F5C\u91CC",
1694
+ 'style \u767D\u540D\u5355\u65B0\u589E animationPlayState\uFF08\u7B2C 15 \u8282\uFF09\uFF1A\u5728 hoverStyle \u91CC\u5199 "paused" \u5373\u53EF\u8BA9\u5FAA\u73AF\u52A8\u753B\u5728\u60AC\u505C\u65F6\u505C\u4F4F\uFF0C\u79FB\u5F00\u7EE7\u7EED',
1695
+ "\u793A\u4F8B \u246A\u246B \u6539\u7528\u5185\u7F6E\u5173\u95ED\u6309\u94AE + action\uFF0C\u5E76\u6309\u539F\u9875\u9762\u914D\u4E0A rgba(0,0,0,0.65) + 4px \u6BDB\u73BB\u7483\u7684\u906E\u7F69\u3001\u70B9\u906E\u7F69\u5F39\u633D\u7559\uFF1B\u246B \u7684 CTA \u8865\u4E0A\u60AC\u505C\u6682\u505C\u547C\u5438"
1696
+ ]
1697
+ },
1371
1698
  {
1372
1699
  date: "2026-08-24",
1373
1700
  items: [
@@ -1461,7 +1788,7 @@ var meta_default = meta;
1461
1788
 
1462
1789
  // src/docs/examples/renew-expire.ts
1463
1790
  var ORANGE = "linear-gradient(90deg,#ff7a00,#faad14)";
1464
- var achieveCell = {
1791
+ var achieveCell = (verb, field, unit, label) => ({
1465
1792
  type: "flex",
1466
1793
  style: {
1467
1794
  direction: "column",
@@ -1483,7 +1810,7 @@ var achieveCell = {
1483
1810
  children: [
1484
1811
  {
1485
1812
  type: "text",
1486
- content: "{{ item.v }}",
1813
+ content: verb,
1487
1814
  style: {
1488
1815
  fontSize: 11.5,
1489
1816
  fontWeight: "600",
@@ -1493,23 +1820,23 @@ var achieveCell = {
1493
1820
  },
1494
1821
  {
1495
1822
  type: "text",
1496
- content: "{{ item.n }}",
1823
+ content: `{{ stat.${field} }}`,
1497
1824
  style: { fontSize: 20, fontWeight: "800", lineHeight: 1.1, color: "#ffffff" }
1498
1825
  },
1499
1826
  {
1500
1827
  type: "text",
1501
- content: "{{ item.u }}",
1828
+ content: ` ${unit}`,
1502
1829
  style: { fontSize: 12, lineHeight: 1.1, color: "rgba(255,255,255,0.92)" }
1503
1830
  }
1504
1831
  ]
1505
1832
  },
1506
1833
  {
1507
1834
  type: "text",
1508
- content: "{{ item.l }}",
1835
+ content: label,
1509
1836
  style: { fontSize: 11.5, lineHeight: 1.35, color: "rgba(255,255,255,0.72)" }
1510
1837
  }
1511
1838
  ]
1512
- };
1839
+ });
1513
1840
  var loseRow = {
1514
1841
  type: "flex",
1515
1842
  style: { align: "center", gap: 8, padding: "8px 0" },
@@ -1629,9 +1956,9 @@ var renewExpire = {
1629
1956
  style: { radius: 18 }
1630
1957
  },
1631
1958
  data: {
1632
- // 成果格子同样走数据源(字段 v / n / u / l 与 achieveCell 模板对应),
1633
- // 后端返回几格就渲染几格
1634
- achieve: { $source: "shopAchievements" },
1959
+ // 成果格子同样走数据源。userStatistics 返回扁平对象,字段名是后端的 snake_case,
1960
+ // 下面四格各自直接插值 {{ stat.xxx }}(扁平对象没法 bind 遍历,见文件头注释)
1961
+ stat: { $source: "userStatistics" },
1635
1962
  lose: [
1636
1963
  { b: "\u6279\u91CF\u642C\u5BB6\u4E0A\u8D27", t: "\u5230\u671F\u540E\u65E0\u6CD5\u7EE7\u7EED\u4E0A\u8D27" },
1637
1964
  { b: "6 \u9879\u81EA\u52A8\u7ECF\u8425\u4EFB\u52A1", t: "\u767D\u5E95\u56FE / \u77ED\u6807\u9898\u8865\u9F50\u3001\u4F4E\u6548\u54C1\u8BCA\u65AD\u4F18\u5316" },
@@ -1669,10 +1996,20 @@ var renewExpire = {
1669
1996
  }
1670
1997
  },
1671
1998
  {
1672
- type: "repeat",
1673
- bind: "achieve",
1999
+ // 四格并列写死(扁平对象没法 bind 遍历),flex + wrap 排成 2×2
2000
+ type: "flex",
1674
2001
  style: { gap: 9, wrap: true },
1675
- template: achieveCell
2002
+ children: [
2003
+ achieveCell("\u5DF2\u4E0A\u67B6", "move_success_count", "\u4E2A", "\u7D2F\u8BA1\u642C\u5BB6\u6210\u529F"),
2004
+ achieveCell("\u8FD0\u884C", "operate_task_count", "\u9879", "\u81EA\u52A8\u7ECF\u8425\u4EFB\u52A1"),
2005
+ achieveCell(
2006
+ "\u5DF2\u8865\u9F50",
2007
+ "white_image_fill_count",
2008
+ "\u5F20",
2009
+ "\u767D\u5E95\u56FE \xB7 \u5408\u89C4\u53EF\u62A5\u6D3B\u52A8"
2010
+ ),
2011
+ achieveCell("\u5B8C\u6210", "ai_optimize_count", "\u6B21", "AI \u81EA\u52A8\u4F18\u5316")
2012
+ ]
1676
2013
  }
1677
2014
  ]
1678
2015
  },
@@ -1809,7 +2146,7 @@ var cdSeparator = (content) => ({
1809
2146
  content,
1810
2147
  style: { fontSize: 13, fontWeight: "800", color: "rgba(255,255,255,0.7)" }
1811
2148
  });
1812
- var achieveCell2 = {
2149
+ var achieveCell2 = (verb, field, unit, label) => ({
1813
2150
  type: "flex",
1814
2151
  style: {
1815
2152
  direction: "column",
@@ -1829,7 +2166,7 @@ var achieveCell2 = {
1829
2166
  children: [
1830
2167
  {
1831
2168
  type: "text",
1832
- content: "{{ item.v }}",
2169
+ content: verb,
1833
2170
  style: {
1834
2171
  fontSize: 11.5,
1835
2172
  fontWeight: "600",
@@ -1839,23 +2176,23 @@ var achieveCell2 = {
1839
2176
  },
1840
2177
  {
1841
2178
  type: "text",
1842
- content: "{{ item.n }}",
2179
+ content: `{{ stat.${field} }}`,
1843
2180
  style: { fontSize: 20, fontWeight: "800", lineHeight: 1.1, color: "#ffffff" }
1844
2181
  },
1845
2182
  {
1846
2183
  type: "text",
1847
- content: "{{ item.u }}",
2184
+ content: ` ${unit}`,
1848
2185
  style: { fontSize: 12, lineHeight: 1.1, color: "rgba(255,255,255,0.92)" }
1849
2186
  }
1850
2187
  ]
1851
2188
  },
1852
2189
  {
1853
2190
  type: "text",
1854
- content: "{{ item.l }}",
2191
+ content: label,
1855
2192
  style: { fontSize: 11.5, lineHeight: 1.35, color: "rgba(255,255,255,0.72)" }
1856
2193
  }
1857
2194
  ]
1858
- };
2195
+ });
1859
2196
  var loseRow2 = {
1860
2197
  type: "flex",
1861
2198
  style: { align: "flex-start", gap: 10, padding: "7px 0" },
@@ -1994,9 +2331,10 @@ var lastDay = {
1994
2331
  },
1995
2332
  data: {
1996
2333
  // 成果格子的数字是**实时统计**,写死就会跟店铺实际情况对不上 —— 走后端数据源。
1997
- // $source 填的是宿主注册过的数据源名(不是接口地址),返回项的字段
1998
- // v / n / u / l 与下面 achieveCell 模板里的 {{ item.x }} 一一对应。
1999
- achieve: { $source: "shopAchievements" },
2334
+ // $source 填的是宿主注册过的数据源名(不是接口地址)。
2335
+ // userStatistics 返回一个扁平对象,字段名就是后端的 snake_case,
2336
+ // 下面四格各自直接插值 {{ stat.xxx }}(见文件头注释:扁平对象没法 bind 遍历)。
2337
+ stat: { $source: "userStatistics" },
2000
2338
  lose: [
2001
2339
  {
2002
2340
  b: "118 \u4E2A\u5546\u54C1\u7684\u5168\u90E8\u4F18\u5316\u8BB0\u5F55",
@@ -2087,10 +2425,25 @@ var lastDay = {
2087
2425
  }
2088
2426
  },
2089
2427
  {
2090
- type: "repeat",
2091
- bind: "achieve",
2428
+ // 四格并列写死(扁平对象没法 bind 遍历),flex + wrap 排成 2×2
2429
+ type: "flex",
2092
2430
  style: { gap: 9, wrap: true, marginTop: 14 },
2093
- template: achieveCell2
2431
+ children: [
2432
+ achieveCell2("\u5DF2\u4E0A\u67B6", "move_success_count", "\u4E2A", "\u7D2F\u8BA1\u642C\u5BB6\u6210\u529F"),
2433
+ achieveCell2(
2434
+ "\u8FD0\u884C",
2435
+ "operate_task_count",
2436
+ "\u9879",
2437
+ "\u7ECF\u8425\u4EFB\u52A1\uFF08\u5546\u54C1\u4F18\u5316/\u6D41\u91CF\u589E\u957F\uFF09"
2438
+ ),
2439
+ achieveCell2(
2440
+ "\u5DF2\u8865\u9F50",
2441
+ "white_image_fill_count",
2442
+ "\u5F20",
2443
+ "\u767D\u5E95\u56FE \xB7 \u5408\u89C4\u53EF\u62A5\u6D3B\u52A8"
2444
+ ),
2445
+ achieveCell2("\u5B8C\u6210", "ai_optimize_count", "\u6B21", "AI \u81EA\u52A8\u4F18\u5316")
2446
+ ]
2094
2447
  },
2095
2448
  // ===== 分格倒计时 + 厘秒逐帧动画 =====
2096
2449
  {
@@ -3213,63 +3566,1090 @@ var drawerBottomBanner = createDrawerBanner({
3213
3566
  url: "https://maibaole.example.com/support"
3214
3567
  });
3215
3568
 
3216
- // src/docs/examples/index.ts
3217
- var HOTSPOT_BG = "rgba(255,68,51,0.16)";
3218
- var imageHotspot = {
3219
- version: 1,
3220
- type: "popup",
3221
- meta: { name: "\u6574\u56FE\u70ED\u533A\u5F39\u7A97" },
3222
- stage: {
3223
- // 窄屏时跟着父级收,最宽不超过 420
3224
- width: "calc(100% - 48px)",
3225
- height: 520,
3226
- mask: true,
3227
- maskClosable: true,
3228
- // 关闭按钮放到弹窗正下方外侧:offset 的 y 写负值即可,不会被圆角裁掉
3229
- closeButton: {
3230
- show: true,
3231
- position: "bottom-center",
3232
- offset: [0, -46],
3233
- size: 34,
3234
- // 不写 icon / image,用内置的矢量 × 图标(跟着 style.color 走)
3235
- style: {
3236
- background: "rgba(0,0,0,0.4)",
3237
- color: "#ffffff",
3238
- fontSize: 18,
3239
- borderWidth: 1,
3240
- borderStyle: "solid",
3241
- borderColor: "rgba(255,255,255,0.55)"
3242
- }
3243
- },
3244
- style: { radius: 12, maxWidth: 420 },
3245
- // 曝光埋点:数据就绪、弹窗真正展示时触发一次
3246
- onShow: { type: "track", event: "popup_show", params: { popup: "image_hotspot" } },
3247
- // 关闭埋点:点 X、点遮罩、点「不再提醒」都会触发,用 closeReason 区分
3248
- onClose: {
3249
- type: "track",
3250
- event: "popup_close",
3251
- params: { popup: "image_hotspot", reason: "{{ closeReason }}" }
3252
- }
3253
- },
3254
- nodes: [
3255
- {
3256
- // 背景图用百分比铺满舞台,舞台宽度变了也不用改配置
3257
- id: "bg",
3258
- type: "image",
3259
- rect: [0, 0, "100%", "100%"],
3260
- src: "https://picsum.photos/id/1015/420/520"
3569
+ // src/docs/examples/gift-give-up.ts
3570
+ var GIFT_MASK_STYLE = {
3571
+ background: "rgba(0,0,0,0.65)",
3572
+ backdropFilter: "blur(4px)"
3573
+ };
3574
+ function createGiveUpView(options) {
3575
+ return {
3576
+ type: "popup",
3577
+ stage: {
3578
+ width: 360,
3579
+ height: "auto",
3580
+ layout: "flow",
3581
+ mask: true,
3582
+ // 点遮罩 = 关掉栈顶这一层 = 退回主弹窗,正是原页面 hideConfirm 的行为:
3583
+ // 挽留层的 close 不会关掉整份物料,也不产生上报。
3584
+ // 【注意】这一层**不配 maskAction**:它的点击本来就该是「退回主弹窗」,
3585
+ // 配了动作反而会把这个退栈行为顶掉
3586
+ maskClosable: true,
3587
+ // 与主弹窗同一份,弹出这一层时背景不能有落差,见 GIFT_MASK_STYLE
3588
+ maskStyle: GIFT_MASK_STYLE,
3589
+ style: { radius: 16, background: "#ffffff" },
3590
+ onShow: { type: "track", event: `${options.giveUpEvent}_show` }
3261
3591
  },
3262
- // 热区想放几个放几个,位置各自由 rect 决定,互不影响。
3263
- // 热区 = 一个透明的 box + action,调试时把 background 的透明度调高就能看见框。
3264
- {
3265
- id: "hotspot-rule",
3266
- type: "box",
3267
- // 右上角「活动规则」
3268
- rect: ["62%", 24, "30%", 30],
3269
- style: { radius: 15, background: HOTSPOT_BG, cursor: "pointer" },
3270
- action: {
3271
- type: "sequence",
3272
- actions: [
3592
+ nodes: [
3593
+ {
3594
+ type: "flex",
3595
+ style: { direction: "column", align: "center", padding: "28px 24px" },
3596
+ children: [
3597
+ { type: "text", content: "\u{1F622}", style: { fontSize: 48, marginBottom: 12 } },
3598
+ {
3599
+ type: "text",
3600
+ content: "\u771F\u7684\u8981\u653E\u5F03\u5417\uFF1F",
3601
+ style: { fontSize: 18, fontWeight: "700", color: "#1d2129" }
3602
+ },
3603
+ {
3604
+ type: "text",
3605
+ content: "\u60A8\u5C06\u635F\u5931\u793C\u5305\u6536\u76CA",
3606
+ style: {
3607
+ margin: "12px 0 20px",
3608
+ fontSize: 13,
3609
+ lineHeight: 1.6,
3610
+ color: "#4e5969",
3611
+ textAlign: "center"
3612
+ }
3613
+ },
3614
+ {
3615
+ type: "flex",
3616
+ style: { width: "100%", gap: 12 },
3617
+ children: [
3618
+ {
3619
+ type: "button",
3620
+ text: "\u5FCD\u75DB\u653E\u5F03",
3621
+ style: {
3622
+ flex: "1",
3623
+ padding: 12,
3624
+ radius: 8,
3625
+ background: "#f7f8fa",
3626
+ color: "#86909c",
3627
+ fontSize: 14,
3628
+ fontWeight: "600"
3629
+ },
3630
+ hoverStyle: { background: "#f0f1f5" },
3631
+ // closeAll:挽留层和主弹窗一起关掉,只 close 的话会退回主弹窗
3632
+ action: {
3633
+ type: "sequence",
3634
+ actions: [
3635
+ { type: "track", event: options.giveUpEvent },
3636
+ { type: "closeAll", reason: "user-give-up" }
3637
+ ]
3638
+ }
3639
+ },
3640
+ {
3641
+ type: "button",
3642
+ text: "\u9886\u53D6\u793C\u5305",
3643
+ style: {
3644
+ flex: "1",
3645
+ padding: 12,
3646
+ radius: 8,
3647
+ background: "linear-gradient(90deg,#ff7a00 0%,#f53f3f 100%)",
3648
+ color: "#ffffff",
3649
+ fontSize: 14,
3650
+ fontWeight: "600"
3651
+ },
3652
+ hoverStyle: { transform: "translateY(-1px)" },
3653
+ action: {
3654
+ type: "sequence",
3655
+ actions: [
3656
+ {
3657
+ type: "track",
3658
+ event: options.claimEvent,
3659
+ params: { from: "confirm" }
3660
+ },
3661
+ { type: "navigate", url: options.url }
3662
+ ]
3663
+ }
3664
+ }
3665
+ ]
3666
+ }
3667
+ ]
3668
+ }
3669
+ ]
3670
+ };
3671
+ }
3672
+
3673
+ // src/docs/examples/gift-v6-head.ts
3674
+ var HEAD_HEIGHT = 300;
3675
+ function createHead() {
3676
+ return {
3677
+ type: "box",
3678
+ style: {
3679
+ width: "100%",
3680
+ height: HEAD_HEIGHT,
3681
+ background: "linear-gradient(180deg,#ff4d4d 0%,#d93025 100%)",
3682
+ overflow: "hidden"
3683
+ },
3684
+ children: [
3685
+ {
3686
+ // 左上角的白色光晕,原页面是 .v6-modal-top::before
3687
+ type: "box",
3688
+ rect: [-40, -40, "calc(100% + 80px)", "calc(100% + 80px)"],
3689
+ style: {
3690
+ background: "radial-gradient(circle at 30% 30%, rgba(255,255,255,0.2) 0%, transparent 50%)",
3691
+ // 装饰层必须让点击穿透,否则整块红头都点不动
3692
+ pointerEvents: "none"
3693
+ }
3694
+ },
3695
+ {
3696
+ type: "flex",
3697
+ rect: [0, 0, "100%", "auto"],
3698
+ style: { direction: "column", align: "center", padding: "20px 32px 0" },
3699
+ children: [
3700
+ {
3701
+ type: "text",
3702
+ content: "\u{1F389} \u642C\u5BB6\u6210\u529F \xB7 \u7CFB\u7EDF\u4E13\u5C5E\u5956\u52B1",
3703
+ style: {
3704
+ alignSelf: "center",
3705
+ padding: "4px 16px",
3706
+ marginBottom: 12,
3707
+ fontSize: 12,
3708
+ color: "#ffffff",
3709
+ background: "rgba(255,255,255,0.25)",
3710
+ radius: 12
3711
+ }
3712
+ },
3713
+ {
3714
+ type: "text",
3715
+ content: "\u606D\u559C\uFF01\u60A8\u83B7\u5F97\u4E00\u4EFD\u4E13\u5C5E\u793C\u5305",
3716
+ style: {
3717
+ fontSize: 24,
3718
+ fontWeight: "900",
3719
+ lineHeight: 1.3,
3720
+ color: "#ffffff",
3721
+ textAlign: "center"
3722
+ }
3723
+ },
3724
+ {
3725
+ type: "text",
3726
+ content: "\u4EC5\u9650\u521A\u5B8C\u6210\u642C\u5BB6\u7684\u7528\u6237",
3727
+ style: {
3728
+ marginTop: 6,
3729
+ fontSize: 13,
3730
+ color: "#ffffff",
3731
+ opacity: "0.9"
3732
+ }
3733
+ },
3734
+ {
3735
+ type: "flex",
3736
+ style: {
3737
+ alignSelf: "center",
3738
+ justify: "center",
3739
+ align: "center",
3740
+ width: 110,
3741
+ height: 110,
3742
+ marginTop: 16,
3743
+ radius: "50%",
3744
+ background: "linear-gradient(135deg,#fff5e6 0%,#ffd591 100%)",
3745
+ shadow: "0 8px 24px rgba(0,0,0,0.2), inset 0 4px 8px rgba(255,255,255,0.5)"
3746
+ },
3747
+ animate: {
3748
+ name: "floatY",
3749
+ duration: 3e3,
3750
+ easing: "ease-in-out",
3751
+ iteration: "infinite"
3752
+ },
3753
+ children: [
3754
+ {
3755
+ type: "text",
3756
+ content: "4\u6298",
3757
+ style: {
3758
+ fontSize: 40,
3759
+ fontWeight: "900",
3760
+ lineHeight: 1,
3761
+ color: "#d93025"
3762
+ }
3763
+ }
3764
+ ]
3765
+ }
3766
+ ]
3767
+ }
3768
+ ]
3769
+ };
3770
+ }
3771
+
3772
+ // src/docs/examples/gift-v6.ts
3773
+ var PURCHASE_URL = "https://fuwu.jinritemai.com/detail?from=isv.promotion&service_id=21361&promotionIdCode=CgYIASAHKAESXgpc6AasSWVCtjAmMcE%2B00V9l5ZRXgoh0wWk5uc6B7Z8JN4ILp0xJ0CmyiOhAVTvTbl5yoLE1muPBxT7P5lZMT1SYVI8RleaK62xu%2FEwuJHpwa0hmOuDn0wllsRvaLcaAA%3D%3D";
3774
+ var NUM_STYLE = {
3775
+ minWidth: 26,
3776
+ padding: "2px 6px",
3777
+ fontFamily: "'Courier New', monospace",
3778
+ fontSize: 13,
3779
+ fontWeight: "700",
3780
+ color: "#ffffff",
3781
+ textAlign: "center",
3782
+ background: "#1d2129",
3783
+ radius: 4,
3784
+ fontVariantNumeric: "tabular-nums"
3785
+ };
3786
+ function giftRow(highlight, text) {
3787
+ return {
3788
+ type: "flex",
3789
+ style: { align: "center", gap: 8, padding: "4px 0" },
3790
+ children: [
3791
+ { type: "text", content: "\u{1F381}", style: { fontSize: 14 } },
3792
+ {
3793
+ type: "flex",
3794
+ // gap 跟外层一致取 8:原页面 li 本身就是 `display:flex; gap:8`,
3795
+ // 🎁、`<b>4折</b>`、说明文案是同一层的三个 flex 项,三段间距相等。
3796
+ // 这里拆成两层是为了让说明文案能独立换行,间距必须还原成 8,
3797
+ // 写 4 会明显比行首那一格紧、看着像没对齐
3798
+ style: { flex: "1", align: "baseline", gap: 8 },
3799
+ children: [
3800
+ {
3801
+ type: "text",
3802
+ content: highlight,
3803
+ style: { fontSize: 11, fontWeight: "700", color: "#d93025" }
3804
+ },
3805
+ { type: "text", content: text, style: { fontSize: 11, color: "#4e5969" } }
3806
+ ]
3807
+ }
3808
+ ]
3809
+ };
3810
+ }
3811
+ var giftV6 = {
3812
+ version: 1,
3813
+ meta: { name: "\u590D\u523B\u7EBF\u4E0A\u5F39\u7A97 \xB7 4 \u6298\u4E13\u5C5E\u793C\u5305\uFF08\u52A8\u753B + \u4E8C\u6B21\u633D\u7559\uFF09" },
3814
+ entry: "main",
3815
+ // 关键帧库全配置共用,两个视图都能引用
3816
+ keyframes: {
3817
+ /** 遮罩淡入 */
3818
+ fadeIn: { from: { opacity: "0" }, to: { opacity: "1" } },
3819
+ /** 弹窗回弹放大,配 cubic-bezier 的超调曲线才有「弹一下」的手感 */
3820
+ zoomIn: {
3821
+ from: { opacity: "0", transform: "scale(0.7)" },
3822
+ to: { opacity: "1", transform: "scale(1)" }
3823
+ },
3824
+ /** 红包上下浮动 */
3825
+ floatY: {
3826
+ "0%": { transform: "translateY(0)" },
3827
+ "50%": { transform: "translateY(-8px)" },
3828
+ "100%": { transform: "translateY(0)" }
3829
+ },
3830
+ /** CTA 呼吸:只放大 2%,再多就晃眼了 */
3831
+ pulseBtn: {
3832
+ "0%": { transform: "scale(1)" },
3833
+ "50%": { transform: "scale(1.02)" },
3834
+ "100%": { transform: "scale(1)" }
3835
+ }
3836
+ },
3837
+ views: {
3838
+ main: {
3839
+ type: "popup",
3840
+ stage: {
3841
+ width: 450,
3842
+ height: "auto",
3843
+ layout: "flow",
3844
+ mask: true,
3845
+ maskClosable: true,
3846
+ // 原页面的遮罩是 rgba(0,0,0,0.65) + 4px 毛玻璃,比内置默认(0.55 纯色)更重
3847
+ // 与挽留层共用同一份:只有栈顶那层遮罩会画,两层不一致就会在弹出时看到落差
3848
+ maskStyle: GIFT_MASK_STYLE,
3849
+ // 点遮罩不直接关,先弹二次挽留(原页面 @click.self="tryClose()")
3850
+ maskAction: { type: "open", view: "confirm", mode: "stack" },
3851
+ // 内置关闭按钮(矢量 ✕)+ action:配了 action 就只执行它、不再自动关层
3852
+ closeButton: {
3853
+ position: "top-right",
3854
+ offset: [12, 12],
3855
+ size: 32,
3856
+ style: {
3857
+ background: "rgba(0,0,0,0.08)",
3858
+ backdropFilter: "blur(4px)",
3859
+ color: "#ffffff",
3860
+ transition: "background 0.2s"
3861
+ },
3862
+ hoverStyle: { background: "rgba(0,0,0,0.2)" },
3863
+ action: { type: "open", view: "confirm", mode: "stack" }
3864
+ },
3865
+ style: {
3866
+ radius: 20,
3867
+ background: "#ffffff",
3868
+ shadow: "0 20px 60px rgba(0,0,0,0.3)",
3869
+ maxWidth: "60vw"
3870
+ },
3871
+ animate: {
3872
+ name: "zoomIn",
3873
+ duration: 500,
3874
+ easing: "cubic-bezier(0.34, 1.56, 0.64, 1)"
3875
+ },
3876
+ maskAnimate: { name: "fadeIn", duration: 400 },
3877
+ onShow: { type: "track", event: "move_success_v6_show" },
3878
+ onClose: {
3879
+ type: "track",
3880
+ event: "move_success_v6_close",
3881
+ params: { reason: "{{ closeReason }}" }
3882
+ }
3883
+ },
3884
+ nodes: [
3885
+ createHead(),
3886
+ // ── 白色主体:往上盖住红头下沿 ──
3887
+ {
3888
+ type: "flex",
3889
+ style: {
3890
+ direction: "column",
3891
+ marginTop: -40,
3892
+ // 必须有层级,否则这 40px 根本盖不住:红头是 box 节点,解释器给所有 box
3893
+ // 加了 position:relative(它要当绝对定位子节点的包含块),定位元素恒画在
3894
+ // 静态元素之上。声明 zIndex 会让解释器顺带补一个 relative,见 resolveNodeStyle
3895
+ zIndex: 1,
3896
+ padding: "30px 32px 30px",
3897
+ background: "#ffffff",
3898
+ radius: "20px 20px 0 0"
3899
+ },
3900
+ children: [
3901
+ {
3902
+ type: "flex",
3903
+ style: {
3904
+ direction: "column",
3905
+ padding: 10,
3906
+ marginBottom: 10,
3907
+ background: "#fffbeb",
3908
+ borderWidth: 1,
3909
+ borderStyle: "dashed",
3910
+ borderColor: "#fbbf24",
3911
+ radius: 12
3912
+ },
3913
+ children: [
3914
+ {
3915
+ type: "text",
3916
+ content: "\u{1F4E6} \u793C\u5305\u5185\u5BB9",
3917
+ style: {
3918
+ marginBottom: 8,
3919
+ fontSize: 12,
3920
+ fontWeight: "600",
3921
+ color: "#92400e",
3922
+ textAlign: "center"
3923
+ }
3924
+ },
3925
+ giftRow("4\u6298", "\u300C\u4E00\u952E\u4E0B\u5355\u300D\u771F\u6298\u6263\u6765\u88AD\uFF0C\u4F4E\u81F34\u6298"),
3926
+ giftRow("50 \u5355", "0 \u670D\u52A1\u8D39 \xB7 \u5355\u5355\u8FD4\u4F63 0.5%"),
3927
+ giftRow("200%", "\u81EA\u52A8\u4E0B\u5355\u3001\u53D1\u8D27\u3001\u552E\u540E\uFF0C\u63D0\u9AD8\u4EBA\u6548")
3928
+ ]
3929
+ },
3930
+ {
3931
+ // duration 而不是 to:这份物料每次弹出都重新倒 5 分钟,没有绝对结束时间
3932
+ type: "countdown",
3933
+ duration: 3e5,
3934
+ precision: "cs",
3935
+ as: "cd",
3936
+ style: { justify: "center", align: "center", gap: 6, marginBottom: 16 },
3937
+ onEnd: { type: "closeAll", reason: "countdown-end" },
3938
+ children: [
3939
+ {
3940
+ type: "text",
3941
+ content: "\u23F0 \u793C\u5305\u5931\u6548\u5012\u8BA1\u65F6",
3942
+ style: { fontSize: 12, color: "#4e5969" }
3943
+ },
3944
+ { type: "text", content: "{{ cd.m }}", style: NUM_STYLE },
3945
+ { type: "text", content: ":", style: { fontSize: 13, color: "#4e5969" } },
3946
+ { type: "text", content: "{{ cd.s }}", style: NUM_STYLE },
3947
+ { type: "text", content: ":", style: { fontSize: 13, color: "#4e5969" } },
3948
+ { type: "text", content: "{{ cd.cs }}", style: NUM_STYLE }
3949
+ ]
3950
+ },
3951
+ {
3952
+ type: "button",
3953
+ text: "\u{1F381} \u7ACB\u5373\u9886\u53D6\u5E76\u542F\u7528",
3954
+ style: {
3955
+ width: "100%",
3956
+ padding: 10,
3957
+ fontSize: 16,
3958
+ fontWeight: "700",
3959
+ color: "#ffffff",
3960
+ background: "linear-gradient(90deg,#ff7a00 0%,#f53f3f 100%)",
3961
+ radius: 28,
3962
+ shadow: "0 6px 20px rgba(245,63,63,0.4)"
3963
+ },
3964
+ animate: {
3965
+ name: "pulseBtn",
3966
+ duration: 1500,
3967
+ easing: "ease-in-out",
3968
+ iteration: "infinite"
3969
+ },
3970
+ action: {
3971
+ type: "sequence",
3972
+ actions: [
3973
+ {
3974
+ type: "track",
3975
+ event: "move_success_v6_claim",
3976
+ params: { from: "main" }
3977
+ },
3978
+ { type: "navigate", url: PURCHASE_URL }
3979
+ ]
3980
+ }
3981
+ }
3982
+ ]
3983
+ }
3984
+ ]
3985
+ },
3986
+ confirm: createGiveUpView({
3987
+ url: PURCHASE_URL,
3988
+ claimEvent: "move_success_v6_claim",
3989
+ giveUpEvent: "move_success_v6_give_up"
3990
+ })
3991
+ }
3992
+ };
3993
+ var gift_v6_default = giftV6;
3994
+
3995
+ // src/docs/examples/gift-red-packet-head.ts
3996
+ var HEAD_HEIGHT2 = 158;
3997
+ function sparkle(left, size, delay) {
3998
+ return {
3999
+ type: "box",
4000
+ // bottom: 14px 换算成 top —— rect 只有 [x, y, w, h],没有 bottom
4001
+ rect: [left, HEAD_HEIGHT2 - 14 - size, size, size],
4002
+ style: {
4003
+ radius: "50%",
4004
+ background: "#ffe3a1",
4005
+ shadow: "0 0 9px rgba(255,214,130,0.95)",
4006
+ // 初始透明:关键帧从 opacity 0 起步,没有这一行会在动画开播前闪一下
4007
+ opacity: "0",
4008
+ pointerEvents: "none"
4009
+ },
4010
+ animate: {
4011
+ name: "floatUp",
4012
+ duration: 4400,
4013
+ delay,
4014
+ easing: "linear",
4015
+ iteration: "infinite"
4016
+ }
4017
+ };
4018
+ }
4019
+ function createHead2() {
4020
+ return {
4021
+ type: "box",
4022
+ style: {
4023
+ width: "100%",
4024
+ height: HEAD_HEIGHT2,
4025
+ background: "linear-gradient(168deg,#ff6a52 0%,#f5433a 54%,#dd2b22 100%)",
4026
+ overflow: "hidden"
4027
+ },
4028
+ children: [
4029
+ {
4030
+ // 顶部的暖光晕,原页面是 .rp-hd::before
4031
+ type: "box",
4032
+ rect: ["50%", -70, 300, 180],
4033
+ style: {
4034
+ background: "radial-gradient(ellipse, rgba(255,220,150,0.4), transparent 66%)",
4035
+ // 关键帧里的 transform 同样带着 translateX(-50%),否则播动画时会向右跳半个身位
4036
+ transform: "translateX(-50%)",
4037
+ pointerEvents: "none"
4038
+ },
4039
+ animate: {
4040
+ name: "glow",
4041
+ duration: 3600,
4042
+ easing: "ease-in-out",
4043
+ iteration: "infinite"
4044
+ }
4045
+ },
4046
+ {
4047
+ type: "flex",
4048
+ rect: [0, 0, "100%", "auto"],
4049
+ style: { direction: "column", align: "center", padding: "26px 26px 0" },
4050
+ children: [
4051
+ {
4052
+ type: "flex",
4053
+ style: {
4054
+ alignSelf: "center",
4055
+ align: "center",
4056
+ gap: 6,
4057
+ padding: "5px 14px",
4058
+ fontSize: 12,
4059
+ color: "#ffe9e2",
4060
+ letterSpacing: "0.04em",
4061
+ background: "rgba(255,255,255,0.2)",
4062
+ radius: 14
4063
+ },
4064
+ animate: {
4065
+ name: "bob",
4066
+ duration: 2800,
4067
+ easing: "ease-in-out",
4068
+ iteration: "infinite"
4069
+ },
4070
+ children: [
4071
+ { type: "text", content: "\u{1F381}", style: { fontSize: 14 } },
4072
+ {
4073
+ type: "text",
4074
+ content: "\u642C\u5BB6\u6210\u529F \xB7 \u4E13\u5C5E\u56DE\u9988",
4075
+ style: { fontSize: 12, color: "#ffe9e2" }
4076
+ }
4077
+ ]
4078
+ },
4079
+ {
4080
+ // 一行混排两种颜色:拆成三个 text,用 baseline 对齐,DSL 没有富文本
4081
+ type: "flex",
4082
+ style: { align: "baseline", justify: "center", marginTop: 14 },
4083
+ children: [
4084
+ {
4085
+ type: "text",
4086
+ content: "\u606D\u559C\u83B7\u5F97 ",
4087
+ style: {
4088
+ fontSize: 25,
4089
+ fontWeight: "800",
4090
+ color: "#ffffff",
4091
+ letterSpacing: "0.02em",
4092
+ textShadow: "0 2px 8px rgba(150,20,10,0.22)"
4093
+ }
4094
+ },
4095
+ {
4096
+ type: "text",
4097
+ content: "1 \u5206\u94B1",
4098
+ style: {
4099
+ fontSize: 25,
4100
+ fontWeight: "800",
4101
+ color: "#ffdc7d",
4102
+ letterSpacing: "0.02em",
4103
+ textShadow: "0 2px 8px rgba(150,20,10,0.22)"
4104
+ }
4105
+ },
4106
+ {
4107
+ type: "text",
4108
+ content: " \u534A\u5E74\u5361",
4109
+ style: {
4110
+ fontSize: 25,
4111
+ fontWeight: "800",
4112
+ color: "#ffffff",
4113
+ letterSpacing: "0.02em",
4114
+ textShadow: "0 2px 8px rgba(150,20,10,0.22)"
4115
+ }
4116
+ }
4117
+ ]
4118
+ }
4119
+ ]
4120
+ },
4121
+ sparkle("13%", 6, 0),
4122
+ sparkle("33%", 4, 1100),
4123
+ sparkle("64%", 6, 2200),
4124
+ sparkle("85%", 5, 3300)
4125
+ ]
4126
+ };
4127
+ }
4128
+ function createPlate() {
4129
+ return {
4130
+ type: "box",
4131
+ style: {
4132
+ // 负的上外边距把牌子提上去压住红头,左右各留 26 与主体对齐
4133
+ margin: "-38px 26px 0",
4134
+ height: 70,
4135
+ background: "linear-gradient(140deg,#fffdf6,#fff2d9)",
4136
+ borderWidth: 1,
4137
+ borderStyle: "solid",
4138
+ borderColor: "#ffe1a8",
4139
+ radius: 13,
4140
+ shadow: "0 10px 26px rgba(140,30,15,0.24)",
4141
+ // 扫光条比牌子宽,不裁会飘到牌子外面
4142
+ overflow: "hidden"
4143
+ },
4144
+ animate: {
4145
+ name: "plateIn",
4146
+ duration: 660,
4147
+ delay: 120,
4148
+ easing: "cubic-bezier(0.18, 1.05, 0.35, 1)"
4149
+ },
4150
+ children: [
4151
+ {
4152
+ type: "box",
4153
+ rect: [-110, 0, 72, "100%"],
4154
+ style: {
4155
+ background: "linear-gradient(100deg, transparent, rgba(255,255,255,0.85), transparent)",
4156
+ pointerEvents: "none"
4157
+ },
4158
+ // 原页面动的是 left,DSL 只放开 transform:改成横向位移,效果等价且不触发重排
4159
+ animate: {
4160
+ name: "sweep",
4161
+ duration: 4e3,
4162
+ delay: 1200,
4163
+ easing: "ease-in-out",
4164
+ iteration: "infinite"
4165
+ }
4166
+ },
4167
+ {
4168
+ type: "flex",
4169
+ rect: [0, 0, "100%", "100%"],
4170
+ style: { align: "center", gap: 14, padding: "0 18px" },
4171
+ children: [
4172
+ {
4173
+ type: "flex",
4174
+ style: {
4175
+ align: "baseline",
4176
+ flexShrink: "0",
4177
+ color: "#d3281f",
4178
+ transformOrigin: "left center"
4179
+ },
4180
+ animate: {
4181
+ name: "pop",
4182
+ duration: 3400,
4183
+ delay: 1e3,
4184
+ easing: "ease-in-out",
4185
+ iteration: "infinite"
4186
+ },
4187
+ children: [
4188
+ {
4189
+ type: "text",
4190
+ content: "\xA5",
4191
+ style: {
4192
+ marginRight: 1,
4193
+ fontSize: 18,
4194
+ fontWeight: "800",
4195
+ color: "#d3281f"
4196
+ }
4197
+ },
4198
+ {
4199
+ type: "text",
4200
+ content: "0.01",
4201
+ style: {
4202
+ fontSize: 42,
4203
+ fontWeight: "900",
4204
+ lineHeight: 1,
4205
+ letterSpacing: "-0.03em",
4206
+ color: "#d3281f"
4207
+ }
4208
+ }
4209
+ ]
4210
+ },
4211
+ {
4212
+ type: "box",
4213
+ style: { width: 1, height: 34, background: "#f2dcae", flexShrink: "0" }
4214
+ },
4215
+ {
4216
+ type: "flex",
4217
+ style: { direction: "column", flex: "1" },
4218
+ children: [
4219
+ {
4220
+ type: "text",
4221
+ content: "\u6253\u5355\u53D1\u8D27 \xB7 \u5168\u529F\u80FD\u534A\u5E74\u5361",
4222
+ style: {
4223
+ fontSize: 14.5,
4224
+ fontWeight: "800",
4225
+ color: "#8f3517",
4226
+ letterSpacing: "0.02em"
4227
+ }
4228
+ },
4229
+ {
4230
+ type: "text",
4231
+ content: "\u539F\u4EF7 \xA590 / \u534A\u5E74",
4232
+ style: {
4233
+ marginTop: 5,
4234
+ fontSize: 11.5,
4235
+ lineHeight: 1.5,
4236
+ color: "#b08b62",
4237
+ textDecoration: "line-through"
4238
+ }
4239
+ }
4240
+ ]
4241
+ }
4242
+ ]
4243
+ }
4244
+ ]
4245
+ };
4246
+ }
4247
+
4248
+ // src/docs/examples/gift-red-packet-body.ts
4249
+ var FEATURES = [
4250
+ { icon: "\u{1F5A8}\uFE0F", title: "\u6279\u91CF\u6253\u5355", desc: "\u6279\u91CF\u9762\u5355\u4E00\u6B21\u51FA", delay: 340 },
4251
+ { icon: "\u{1F69A}", title: "\u6279\u91CF\u53D1\u8D27", desc: "\u5168\u5E97\u8BA2\u5355\u79D2\u53D1\u5B8C", delay: 420 },
4252
+ { icon: "\u{1F3EA}", title: "\u591A\u5E97\u7BA1\u7406", desc: "\u7BA1\u7406\u591A\u4E2A\u5E97\u94FA\u8BA2\u5355", delay: 500 },
4253
+ { icon: "\u{1F9E9}", title: "\u8BA2\u5355\u5408\u5E76", desc: "\u540C\u5740\u5408\u5355\u7701\u8FD0\u8D39", delay: 580 },
4254
+ {
4255
+ icon: "\u{1F4CD}",
4256
+ title: "\u7269\u6D41\u8F68\u8FF9",
4257
+ desc: "\u9762\u5355\u7269\u6D41\u8F68\u8FF9\uFF0C\u5BA2\u8BC9\u63D0\u524D\u62E6\u622A",
4258
+ delay: 660,
4259
+ full: true
4260
+ }
4261
+ ];
4262
+ function featureCell(feature) {
4263
+ return {
4264
+ type: "flex",
4265
+ style: {
4266
+ // 两列网格用 flex wrap + 百分比宽复刻:gap 8 时每列是 calc(50% - 4px),
4267
+ // 末项写 100% 就等于原来的 grid-column: 1 / -1
4268
+ width: feature.full ? "100%" : "calc(50% - 4px)",
4269
+ align: "center",
4270
+ gap: 9,
4271
+ padding: "9px 11px",
4272
+ background: "#fff8f1",
4273
+ borderWidth: 1,
4274
+ borderStyle: "solid",
4275
+ borderColor: "#ffe6d5",
4276
+ radius: 9
4277
+ },
4278
+ animate: { name: "cellIn", duration: 460, delay: feature.delay, easing: "ease-out" },
4279
+ children: [
4280
+ {
4281
+ type: "flex",
4282
+ style: {
4283
+ justify: "center",
4284
+ align: "center",
4285
+ width: 26,
4286
+ height: 26,
4287
+ // 图标位不许被压扁,否则长副标题会把它挤成一条
4288
+ flexShrink: "0",
4289
+ background: "#ffe9d8",
4290
+ radius: 7
4291
+ },
4292
+ children: [{ type: "text", content: feature.icon, style: { fontSize: 15 } }]
4293
+ },
4294
+ {
4295
+ type: "flex",
4296
+ style: { direction: "column", minWidth: 0 },
4297
+ children: [
4298
+ {
4299
+ type: "text",
4300
+ content: feature.title,
4301
+ style: {
4302
+ fontSize: 13,
4303
+ fontWeight: "700",
4304
+ lineHeight: 1.35,
4305
+ color: "#8f3517"
4306
+ }
4307
+ },
4308
+ {
4309
+ type: "text",
4310
+ content: feature.desc,
4311
+ style: {
4312
+ fontSize: 11.5,
4313
+ lineHeight: 1.35,
4314
+ color: "#b07a5c",
4315
+ whiteSpace: "nowrap"
4316
+ }
4317
+ }
4318
+ ]
4319
+ }
4320
+ ]
4321
+ };
4322
+ }
4323
+ function createFeatureGrid() {
4324
+ return {
4325
+ type: "flex",
4326
+ style: { wrap: true, gap: 8 },
4327
+ children: FEATURES.map(featureCell)
4328
+ };
4329
+ }
4330
+ function createCta(action) {
4331
+ return {
4332
+ type: "box",
4333
+ // 【必须写死高度的原因】这是绝对定位容器(角标要骑在按钮上沿外面,只能脱流),
4334
+ // 子节点撑不起它,不写死就塌成 0。52 即原页面 .rp-cta 的按钮高度
4335
+ style: { width: "100%", height: 52, marginTop: 16 },
4336
+ children: [
4337
+ {
4338
+ type: "box",
4339
+ // 高度跟满父级即可,不用再写一遍 52
4340
+ rect: [0, 0, "100%", "100%"],
4341
+ style: {
4342
+ background: "linear-gradient(92deg,#ff8f3d,#f5433a)",
4343
+ radius: 26,
4344
+ overflow: "hidden",
4345
+ cursor: "pointer",
4346
+ shadow: "0 8px 20px rgba(245,67,58,0.34)",
4347
+ transition: "transform 0.18s, box-shadow 0.18s"
4348
+ },
4349
+ animate: {
4350
+ name: "breath",
4351
+ duration: 2400,
4352
+ easing: "ease-in-out",
4353
+ iteration: "infinite"
4354
+ },
4355
+ // 原页面 hover 时上浮并暂停呼吸动画,两条都能配
4356
+ hoverStyle: { transform: "translateY(-2px)", animationPlayState: "paused" },
4357
+ action,
4358
+ children: [
4359
+ {
4360
+ type: "box",
4361
+ rect: [-90, 0, 62, "100%"],
4362
+ style: {
4363
+ background: "linear-gradient(100deg, transparent, rgba(255,255,255,0.5), transparent)",
4364
+ pointerEvents: "none"
4365
+ },
4366
+ animate: {
4367
+ name: "sweep",
4368
+ duration: 2900,
4369
+ delay: 800,
4370
+ easing: "ease-in-out",
4371
+ iteration: "infinite"
4372
+ }
4373
+ },
4374
+ {
4375
+ type: "flex",
4376
+ rect: [0, 0, "100%", "100%"],
4377
+ style: { justify: "center", align: "center", gap: 8 },
4378
+ children: [
4379
+ { type: "text", content: "\u{1F381}", style: { fontSize: 18 } },
4380
+ {
4381
+ type: "text",
4382
+ content: "1 \u5206\u94B1\u8BA2\u9605\u534A\u5E74",
4383
+ style: {
4384
+ fontSize: 17,
4385
+ fontWeight: "700",
4386
+ color: "#ffffff",
4387
+ letterSpacing: "0.03em"
4388
+ }
4389
+ }
4390
+ ]
4391
+ }
4392
+ ]
4393
+ },
4394
+ {
4395
+ // 角标骑在按钮上沿外面:y 写负值即可,父级没有 overflow: hidden 就不会被裁
4396
+ type: "flex",
4397
+ rect: ["calc(100% - 112px)", -10, "auto", 22],
4398
+ style: {
4399
+ justify: "center",
4400
+ align: "center",
4401
+ gap: 4,
4402
+ padding: "0 10px",
4403
+ fontSize: 11.5,
4404
+ fontWeight: "700",
4405
+ color: "#7a3b00",
4406
+ letterSpacing: "0.03em",
4407
+ background: "linear-gradient(96deg,#ffe08a,#ffc24d)",
4408
+ borderWidth: 1,
4409
+ borderStyle: "solid",
4410
+ borderColor: "rgba(255,255,255,0.75)",
4411
+ radius: 11,
4412
+ shadow: "0 4px 10px rgba(190,120,20,0.3)",
4413
+ // 角标压在按钮上,不穿透点击的话这一块就点不动了
4414
+ pointerEvents: "none",
4415
+ zIndex: 2
4416
+ },
4417
+ animate: {
4418
+ name: "badge",
4419
+ duration: 2400,
4420
+ easing: "ease-in-out",
4421
+ iteration: "infinite"
4422
+ },
4423
+ children: [
4424
+ { type: "text", content: "\u23F0", style: { fontSize: 12 } },
4425
+ {
4426
+ type: "text",
4427
+ content: "\u9650\u65F6\u4F18\u60E0",
4428
+ style: { fontSize: 11.5, fontWeight: "700", color: "#7a3b00" }
4429
+ }
4430
+ ]
4431
+ }
4432
+ ]
4433
+ };
4434
+ }
4435
+
4436
+ // src/docs/examples/gift-red-packet.ts
4437
+ var PURCHASE_URL2 = "https://fuwu.jinritemai.com/detail?from=isv.promotion&service_id=37954&promotionIdCode=CgYIASAHKAESXgpcZiuxEgmEfp%2BCuIELbEjHDmFi85jdhDOrbaXhk7JWo7S2zDy7ZoIOuQoLYASUv9XymFznWhybdvdPTpaa4bhM0ydWadh6ViYxI7%2FhpcEo%2F7W4MlNCKrcmzIu9j3YaAA%3D%3D";
4438
+ var giftRedPacket = {
4439
+ version: 1,
4440
+ meta: { name: "\u590D\u523B\u7EBF\u4E0A\u5F39\u7A97 \xB7 1 \u5206\u94B1\u534A\u5E74\u5361\uFF08\u7EA2\u5305\u5F00\u7BB1\u7248\uFF09" },
4441
+ entry: "main",
4442
+ keyframes: {
4443
+ /** 遮罩淡入 */
4444
+ fadeIn: { from: { opacity: "0" }, to: { opacity: "1" } },
4445
+ /** 弹窗回弹放大 */
4446
+ zoomIn: {
4447
+ from: { opacity: "0", transform: "scale(0.7)" },
4448
+ to: { opacity: "1", transform: "scale(1)" }
4449
+ },
4450
+ /** 红头顶部光晕呼吸。transform 里必须带上 translateX(-50%),否则播动画时会向右跳 */
4451
+ glow: {
4452
+ "0%": { opacity: "0.7", transform: "translateX(-50%) scale(1)" },
4453
+ "50%": { opacity: "1", transform: "translateX(-50%) scale(1.14)" },
4454
+ "100%": { opacity: "0.7", transform: "translateX(-50%) scale(1)" }
4455
+ },
4456
+ /** 缎带轻浮 */
4457
+ bob: {
4458
+ "0%": { transform: "translateY(0)" },
4459
+ "50%": { transform: "translateY(-3px)" },
4460
+ "100%": { transform: "translateY(0)" }
4461
+ },
4462
+ /** 金色光点:从下往上飘 116px,两头都是透明 */
4463
+ floatUp: {
4464
+ "0%": { opacity: "0", transform: "translateY(30px) scale(0.5)" },
4465
+ "18%": { opacity: "0.95" },
4466
+ "100%": { opacity: "0", transform: "translateY(-86px) scale(1)" }
4467
+ },
4468
+ /** 价格牌托上来 */
4469
+ plateIn: {
4470
+ "0%": { opacity: "0", transform: "translateY(24px) scale(0.94)" },
4471
+ "100%": { opacity: "1", transform: "translateY(0) scale(1)" }
4472
+ },
4473
+ /**
4474
+ * 扫光:一条斜光带从左侧滑到右侧外面,停一会儿再来一趟。
4475
+ *
4476
+ * 原页面动的是 `left`,这里改成 `transform` 位移 —— 一是 DSL 只放开 transform,
4477
+ * 二是动 left 每帧都要重排,动 transform 只走合成层。
4478
+ */
4479
+ sweep: {
4480
+ "0%": { transform: "skew(-18deg) translateX(0)" },
4481
+ "42%": { transform: "skew(-18deg) translateX(600px)" },
4482
+ "100%": { transform: "skew(-18deg) translateX(600px)" }
4483
+ },
4484
+ /** 价格每隔几秒弹一下 */
4485
+ pop: {
4486
+ "0%": { transform: "scale(1)" },
4487
+ "86%": { transform: "scale(1)" },
4488
+ "92%": { transform: "scale(1.09)" },
4489
+ "100%": { transform: "scale(1)" }
4490
+ },
4491
+ /** 权益格入场,五格靠各自的 delay 交错 */
4492
+ cellIn: {
4493
+ "0%": { opacity: "0", transform: "translateY(10px)" },
4494
+ "100%": { opacity: "1", transform: "translateY(0)" }
4495
+ },
4496
+ /** 「限时优惠」角标轻浮 */
4497
+ badge: {
4498
+ "0%": { transform: "translateY(0)" },
4499
+ "50%": { transform: "translateY(-2px)" },
4500
+ "100%": { transform: "translateY(0)" }
4501
+ },
4502
+ /** CTA 呼吸:只放大阴影不放大自身,按钮尺寸恒定,不会把下面的内容顶动 */
4503
+ breath: {
4504
+ "0%": { shadow: "0 8px 20px rgba(245,67,58,0.34)" },
4505
+ "50%": { shadow: "0 12px 30px rgba(245,67,58,0.56)" },
4506
+ "100%": { shadow: "0 8px 20px rgba(245,67,58,0.34)" }
4507
+ }
4508
+ },
4509
+ views: {
4510
+ main: {
4511
+ type: "popup",
4512
+ stage: {
4513
+ width: 460,
4514
+ height: "auto",
4515
+ layout: "flow",
4516
+ mask: true,
4517
+ maskClosable: true,
4518
+ // 原页面遮罩 rgba(0,0,0,0.65) + 4px 毛玻璃;与挽留层共用同一份 ——
4519
+ // 只有栈顶那层遮罩会画,两层不一致就会在弹出挽留层时看到背景落差
4520
+ maskStyle: GIFT_MASK_STYLE,
4521
+ // 点遮罩弹二次挽留,不直接关(原页面 @click.self="tryClose()")
4522
+ maskAction: { type: "open", view: "confirm", mode: "stack" },
4523
+ // 内置关闭按钮画的就是矢量交叉线,和原页面那段内联 SVG 是同一种东西
4524
+ closeButton: {
4525
+ position: "top-right",
4526
+ offset: [14, 14],
4527
+ size: 30,
4528
+ style: {
4529
+ background: "rgba(255,255,255,0.22)",
4530
+ color: "#ffffff",
4531
+ transition: "background 0.2s"
4532
+ },
4533
+ hoverStyle: { background: "rgba(255,255,255,0.38)" },
4534
+ action: { type: "open", view: "confirm", mode: "stack" }
4535
+ },
4536
+ style: {
4537
+ radius: 16,
4538
+ background: "#ffffff",
4539
+ shadow: "0 18px 50px rgba(20,26,45,0.24)",
4540
+ maxWidth: "90vw",
4541
+ // 原页面 .rp-modal 显式指定了字体栈,弹窗内所有文字继承它,
4542
+ // 不写就跟着宿主页面走、字形和字重会有出入
4543
+ fontFamily: "-apple-system, BlinkMacSystemFont, 'PingFang SC', 'Microsoft YaHei', sans-serif"
4544
+ },
4545
+ animate: {
4546
+ name: "zoomIn",
4547
+ duration: 500,
4548
+ easing: "cubic-bezier(0.34, 1.56, 0.64, 1)"
4549
+ },
4550
+ maskAnimate: { name: "fadeIn", duration: 400 },
4551
+ onShow: { type: "track", event: "move_success_rp_show" },
4552
+ onClose: {
4553
+ type: "track",
4554
+ event: "move_success_rp_close",
4555
+ params: { reason: "{{ closeReason }}" }
4556
+ }
4557
+ },
4558
+ nodes: [
4559
+ createHead2(),
4560
+ createPlate(),
4561
+ {
4562
+ type: "flex",
4563
+ style: {
4564
+ direction: "column",
4565
+ // 底部 38 而不是原页面的 20:原页面 CTA 下面还有一行「今日不再提示」
4566
+ // (约 18px + 14px 间距),那一行按需求去掉了,不把留白补回来底部就贴得慌
4567
+ padding: "18px 26px 38px",
4568
+ background: "#ffffff"
4569
+ },
4570
+ children: [
4571
+ createFeatureGrid(),
4572
+ createCta({
4573
+ type: "sequence",
4574
+ actions: [
4575
+ {
4576
+ type: "track",
4577
+ event: "move_success_rp_claim",
4578
+ params: { from: "main" }
4579
+ },
4580
+ { type: "navigate", url: PURCHASE_URL2 }
4581
+ ]
4582
+ })
4583
+ ]
4584
+ }
4585
+ ]
4586
+ },
4587
+ confirm: createGiveUpView({
4588
+ url: PURCHASE_URL2,
4589
+ claimEvent: "move_success_rp_claim",
4590
+ giveUpEvent: "move_success_rp_give_up"
4591
+ })
4592
+ }
4593
+ };
4594
+ var gift_red_packet_default = giftRedPacket;
4595
+
4596
+ // src/docs/examples/index.ts
4597
+ var HOTSPOT_BG = "rgba(255,68,51,0.16)";
4598
+ var imageHotspot = {
4599
+ version: 1,
4600
+ type: "popup",
4601
+ meta: { name: "\u6574\u56FE\u70ED\u533A\u5F39\u7A97" },
4602
+ stage: {
4603
+ // 窄屏时跟着父级收,最宽不超过 420
4604
+ width: "calc(100% - 48px)",
4605
+ height: 520,
4606
+ mask: true,
4607
+ maskClosable: true,
4608
+ // 关闭按钮放到弹窗正下方外侧:offset 的 y 写负值即可,不会被圆角裁掉
4609
+ closeButton: {
4610
+ show: true,
4611
+ position: "bottom-center",
4612
+ offset: [0, -46],
4613
+ size: 34,
4614
+ // 不写 icon / image,用内置的矢量 × 图标(跟着 style.color 走)
4615
+ style: {
4616
+ background: "rgba(0,0,0,0.4)",
4617
+ color: "#ffffff",
4618
+ fontSize: 18,
4619
+ borderWidth: 1,
4620
+ borderStyle: "solid",
4621
+ borderColor: "rgba(255,255,255,0.55)"
4622
+ }
4623
+ },
4624
+ style: { radius: 12, maxWidth: 420 },
4625
+ // 曝光埋点:数据就绪、弹窗真正展示时触发一次
4626
+ onShow: { type: "track", event: "popup_show", params: { popup: "image_hotspot" } },
4627
+ // 关闭埋点:点 X、点遮罩、点「不再提醒」都会触发,用 closeReason 区分
4628
+ onClose: {
4629
+ type: "track",
4630
+ event: "popup_close",
4631
+ params: { popup: "image_hotspot", reason: "{{ closeReason }}" }
4632
+ }
4633
+ },
4634
+ nodes: [
4635
+ {
4636
+ // 背景图用百分比铺满舞台,舞台宽度变了也不用改配置
4637
+ id: "bg",
4638
+ type: "image",
4639
+ rect: [0, 0, "100%", "100%"],
4640
+ src: "https://picsum.photos/id/1015/420/520"
4641
+ },
4642
+ // 热区想放几个放几个,位置各自由 rect 决定,互不影响。
4643
+ // 热区 = 一个透明的 box + action,调试时把 background 的透明度调高就能看见框。
4644
+ {
4645
+ id: "hotspot-rule",
4646
+ type: "box",
4647
+ // 右上角「活动规则」
4648
+ rect: ["62%", 24, "30%", 30],
4649
+ style: { radius: 15, background: HOTSPOT_BG, cursor: "pointer" },
4650
+ action: {
4651
+ type: "sequence",
4652
+ actions: [
3273
4653
  { type: "track", event: "popup_click", params: { area: "rule" } },
3274
4654
  {
3275
4655
  type: "navigate",
@@ -3454,6 +4834,16 @@ var examples = [
3454
4834
  label: "\u2469 \u62BD\u5C49\u5E95\u90E8 Banner\uFF08\u56FA\u5B9A 400\xD745\uFF09",
3455
4835
  value: "drawerBottomBanner",
3456
4836
  dsl: drawerBottomBanner
4837
+ },
4838
+ {
4839
+ label: "\u246A \u590D\u523B\u7EBF\u4E0A\u5F39\u7A97 \xB7 4 \u6298\u793C\u5305\uFF08\u52A8\u753B + \u4E8C\u6B21\u633D\u7559\uFF09",
4840
+ value: "giftV6",
4841
+ dsl: gift_v6_default
4842
+ },
4843
+ {
4844
+ label: "\u246B \u590D\u523B\u7EBF\u4E0A\u5F39\u7A97 \xB7 1 \u5206\u94B1\u534A\u5E74\u5361\uFF08\u52A8\u753B\u6700\u5BC6\u7684\u4E00\u4EFD\uFF09",
4845
+ value: "giftRedPacket",
4846
+ dsl: gift_red_packet_default
3457
4847
  }
3458
4848
  ];
3459
4849
  var examples_default = examples;
@@ -3487,7 +4877,7 @@ function blockToMarkdown(block) {
3487
4877
  return "";
3488
4878
  }
3489
4879
  }
3490
- function toMarkdown(sections10, meta2) {
4880
+ function toMarkdown(sections11, meta2) {
3491
4881
  const lines = [
3492
4882
  "# \u8425\u9500\u5185\u5BB9 DSL \xB7 \u5F00\u53D1\u6587\u6863",
3493
4883
  "",
@@ -3497,7 +4887,7 @@ function toMarkdown(sections10, meta2) {
3497
4887
  "> \u672C\u6587\u4EF6\u7531\u300C\u8425\u9500DSL\u8C03\u8BD5\u53F0 \u2192 \u5F00\u53D1\u6587\u6863\u300D\u5BFC\u51FA\u3002DSL \u6709\u6539\u52A8\u65F6\u8BF7\u91CD\u65B0\u5BFC\u51FA\uFF0C\u4E0D\u8981\u624B\u5DE5\u4FEE\u6539\u672C\u6587\u4EF6\u3002",
3498
4888
  ""
3499
4889
  ];
3500
- sections10.forEach((section) => {
4890
+ sections11.forEach((section) => {
3501
4891
  lines.push(`## ${section.title}`, "");
3502
4892
  section.blocks.forEach((block) => {
3503
4893
  const text = blockToMarkdown(block);
@@ -3558,17 +4948,28 @@ function structureSection() {
3558
4948
  "layout": "flow", // "absolute" \u6216 "flow"\uFF0C\u89C1\u4E0B\u9762\u300C\u5E03\u5C40\u300D
3559
4949
  "mask": true,
3560
4950
  "maskClosable": false,
4951
+ // \u53EF\u9009\uFF1A\u906E\u7F69\u6837\u5F0F\uFF0C\u8D70 style \u767D\u540D\u5355\u3002\u4E0D\u5199\u5C31\u662F\u5185\u7F6E\u7684 rgba(0,0,0,0.55) \u7EAF\u8272
4952
+ "maskStyle": { "background": "rgba(0,0,0,0.65)", "backdropFilter": "blur(4px)" },
4953
+ // \u53EF\u9009\uFF1A\u70B9\u906E\u7F69\u505A\u4EC0\u4E48\u3002\u4E0D\u5199 = \u5173\u6389\u8FD9\u4E00\u5C42\uFF1B\u5199\u4E86 = \u53EA\u6267\u884C\u52A8\u4F5C\u3001\u4E0D\u5173\u5C42
4954
+ "maskAction": { "type": "open", "view": "confirm", "mode": "stack" },
3561
4955
  "closeButton": {
3562
4956
  "position": "top-right", // ${CLOSE_POSITIONS.join(" | ")}
3563
4957
  "offset": [12, 12], // [x, y]\uFF1B\u5199\u8D1F\u503C = \u6309\u94AE\u8DD1\u5230\u5F39\u7A97\u5916\u9762
3564
4958
  "size": 26,
3565
4959
  // icon / image \u90FD\u4E0D\u5199\u65F6\uFF0C\u753B\u7684\u662F\u5185\u7F6E\u7684\u77E2\u91CF \xD7 \u56FE\u6807 \u2014\u2014 \u9ED8\u8BA4\u5C31\u662F\u5BF9\u7684\uFF0C\u4E0D\u7528\u914D
3566
- "style": { "background": "rgba(0,0,0,0.35)", "color": "#fff" }
4960
+ "style": { "background": "rgba(0,0,0,0.35)", "color": "#fff" },
4961
+ // \u53EF\u9009\uFF1A\u70B9 \u2715 \u505A\u4EC0\u4E48\u3002\u4E0D\u5199 = \u5173\u6389\u8FD9\u4E00\u5C42\uFF1B\u5199\u4E86 = \u53EA\u6267\u884C\u52A8\u4F5C\u3001\u4E0D\u5173\u5C42
4962
+ "action": { "type": "open", "view": "confirm", "mode": "stack" }
3567
4963
  },
3568
4964
  "style": { "radius": 18, "maxWidth": 420 }
3569
4965
  }
3570
4966
  \`\`\`
3571
4967
 
4968
+ \`maskClosable\` \u51B3\u5B9A\u906E\u7F69\u54CD\u4E0D\u54CD\u5E94\u70B9\u51FB\uFF0C\`maskAction\` \u51B3\u5B9A\u70B9\u4E86\u505A\u4EC0\u4E48\uFF0C\u4E24\u4EF6\u4E8B\uFF1A
4969
+ \`maskClosable: false\` \u65F6\u5149\u914D \`maskAction\` \u4E0D\u4F1A\u89E6\u53D1\u3002
4970
+ \`maskAction\` / \`closeButton.action\` \u914D\u4E86\u5C31**\u4E0D\u518D\u81EA\u52A8\u5173\u5C42**\uFF0C\u8981\u5173\u5C31\u628A \`close\` \u5199\u8FDB\u52A8\u4F5C\u91CC\u3002
4971
+ \u300C\u70B9 \u2715 \u6216\u70B9\u906E\u7F69\u5148\u5F39\u4E8C\u6B21\u633D\u7559\u300D\u7684\u6807\u51C6\u5199\u6CD5\u5C31\u662F\u8FD9\u4E24\u4E2A\u5B57\u6BB5\u5404\u914D\u4E00\u4E2A \`open\`\u3002
4972
+
3572
4973
  **\u5173\u95ED\u6309\u94AE\u7684\u56FE\u6807\u4E0D\u8981\u778E\u914D\u3002** \u9ED8\u8BA4\u662F\u5185\u7F6E\u77E2\u91CF\u56FE\u6807\uFF08\u4E24\u6761\u4EA4\u53C9\u7EBF\uFF0C\u5C45\u4E2D\u5BF9\u9F50\u5DF2\u7ECF\u8C03\u597D\uFF09\uFF0C
3573
4974
  \u7528\u6237\u6CA1\u63D0\u300C\u6362\u56FE\u6807\u300D\u5C31**\u4E0D\u8981\u5199 \`icon\`**\u2014\u2014\u5199\u6210 \`"icon": "\xD7"\` \u4F1A\u9000\u56DE\u6587\u672C\u5B57\u7B26\u6E32\u67D3\uFF0C
3574
4975
  \u90A3\u4E2A\u5B57\u5F62\u672C\u8EAB\u504F\u4E0A\u504F\u5C0F\uFF0C\u770B\u7740\u5C31\u662F\u6CA1\u5BF9\u9F50\u3002\u786E\u5B9E\u8981\u6362\u65F6\uFF1A
@@ -3630,6 +5031,8 @@ function checklistSection() {
3630
5031
  - [ ] \u6BCF\u4E2A\u89C6\u56FE\u7684 \`stage\` \u90FD\u6709 \`onShow\` \u66DD\u5149\u57CB\u70B9\u548C \`onClose\` \u5173\u95ED\u57CB\u70B9\uFF0C\`onClose\` \u7684 params \u91CC\u5E26\u4E0A \`"reason": "{{ closeReason }}"\`
3631
5032
  - [ ] \u5173\u95ED\u6309\u94AE\u6CA1\u6709\u591A\u4F59\u7684 \`icon\`\uFF08\u9ED8\u8BA4\u7684\u5185\u7F6E\u77E2\u91CF\u56FE\u6807\u5C31\u662F\u5BF9\u7684\uFF09
3632
5033
  - [ ] \u6CA1\u6709\u7528 \`call\` \u53BB\u8BB0\u5F55\u7528\u6237\u610F\u56FE\u6216\u5199\u672C\u5730\u5B58\u50A8\uFF08\`call\` \u53EA\u7528\u6765\u8BA9\u5BBF\u4E3B\u505A\u4E00\u4EF6\u4E8B\uFF0C\u5982\u5524\u8D77\u5145\u503C / \u6253\u5F00\u5BA2\u670D / \u590D\u5236\u5230\u526A\u8D34\u677F\uFF09\u3002\u300C\u4E0D\u518D\u63D0\u9192\u300D\u5199\u6210 \`{ "type": "close", "reason": "user-dismiss" }\`\uFF0C\u4E0D\u914D \`call\`
5034
+ - [ ] \u6BCF\u4E2A \`animate.name\` \u90FD\u80FD\u5728\u9876\u5C42 \`keyframes\` \u91CC\u627E\u5230\uFF1B\`easing\` \u5728\u767D\u540D\u5355\u91CC\uFF1B\u6CA1\u6709\u5B9A\u4E49\u4E86\u5374\u6CA1\u4EBA\u5F15\u7528\u7684\u5173\u952E\u5E27
5035
+ - [ ] \u88C5\u9970\u6027\u56FE\u5C42\uFF08\u5149\u6655\u3001\u626B\u5149\u3001\u5149\u70B9\uFF09\u90FD\u5199\u4E86 \`"pointerEvents": "none"\`
3633
5036
  - [ ] \u8F93\u51FA\u7684\u662F\u5408\u6CD5 JSON\uFF08\u6CA1\u6709\u591A\u4F59\u9017\u53F7\u3001\u6CA1\u6709\u6CE8\u91CA\uFF09`;
3634
5037
  }
3635
5038
  function requirementSection() {
@@ -3785,6 +5188,9 @@ function countdownSection() {
3785
5188
 
3786
5189
  \u5199\u6210 \`"\u4E0B\u5468\u4E09"\` \u8FD9\u79CD\u8BC6\u522B\u4E0D\u4E86\u7684\u4F1A\u5728\u4FDD\u5B58\u524D\u62A5\u9519\u3002
3787
5190
 
5191
+ \u300C\u6253\u5F00\u540E 5 \u5206\u949F\u5185\u4E0B\u5355\u300D\u8FD9\u79CD**\u76F8\u5BF9**\u65F6\u957F\u4E0D\u8981\u53BB\u7B97\u7ED3\u675F\u65F6\u95F4\uFF0C\u5199 \`"duration": 300000\`\uFF08\u6BEB\u79D2\uFF09\u4EE3\u66FF \`to\`\uFF0C
5192
+ \u4ECE\u8FD9\u4E00\u5C4F\u5C55\u793A\u90A3\u4E00\u523B\u8D77\u7B97\u3002\`to\` \u548C \`duration\` \u81F3\u5C11\u8981\u6709\u4E00\u4E2A\uFF0C\u540C\u65F6\u5199\u4EE5 \`to\` \u4E3A\u51C6\u3002
5193
+
3788
5194
  \u5F52\u96F6\u65F6\u53EF\u4EE5\u505A\u70B9\u4EC0\u4E48\uFF0C\u7528 \`onEnd\`\uFF08\u4EFB\u610F\u52A8\u4F5C\uFF09\uFF1A\`{ "type": "track", "event": "countdown_end" }\` \u4E0A\u62A5\u3001\`{ "type": "close" }\` \u81EA\u52A8\u5173\u5F39\u7A97\u3001\`{ "type": "open", "view": "expired", "mode": "replace" }\` \u6362\u5C4F\u3002**\u53EA\u5728\u7528\u6237\u773C\u770B\u7740\u5B83\u5F52\u96F6\u65F6\u89E6\u53D1**\uFF0C\u6253\u5F00\u65F6\u5C31\u5DF2\u7ECF\u8FC7\u671F\u7684\u4E0D\u89E6\u53D1\u3002
3789
5195
 
3790
5196
  \u60F3\u8BA9\u300C\u5DF2\u7ED3\u675F\u300D\u663E\u793A\u6210\u53E6\u4E00\u5957\u6392\u7248\uFF0C\u7528 \`cd.ended\` \u914D \`visibleWhen\`\uFF0C\u4E0D\u8981\u7528 \`onEnd\`\u3002
@@ -3898,6 +5304,65 @@ ${DEFAULT_USER_FIELDS.map((field) => `\`${field}\`\uFF08${USER_FIELD_LABELS[fiel
3898
5304
  \u5207 tab \u8981\u6362\u6210\u5B8C\u5168\u4E0D\u540C\u7684\u6392\u7248\u65F6\uFF0C\u5199\u4E24\u5957\u8282\u70B9\u5404\u914D\u4E00\u4E2A \`visibleWhen\`\uFF08\u5982 \`current.mode == 'grid'\` / \`current.mode == 'list'\`\uFF09\uFF0C\u540C\u4E00\u65F6\u523B\u53EA\u663E\u793A\u4E00\u5957\u3002\u4E0D\u8981\u8BD5\u56FE\u7528\u4E00\u5957\u8282\u70B9\u786C\u51D1\u3002`;
3899
5305
  }
3900
5306
 
5307
+ // src/docs/ai-prompt/animation.ts
5308
+ function animationSection() {
5309
+ return `# \u52A8\u753B\u4E0E hover
5310
+
5311
+ \u4E24\u6B65\uFF1A\u9876\u5C42 \`keyframes\` \u5B9A\u4E49\u5173\u952E\u5E27 \u2192 \u9700\u8981\u52A8\u7684\u5730\u65B9\u5199 \`animate\` \u5F15\u7528\u5B83\u3002\u5173\u952E\u5E27\u5E93\u5168\u914D\u7F6E\u5171\u7528\u3002
5312
+
5313
+ \`\`\`jsonc
5314
+ "keyframes": {
5315
+ "zoomIn": { "from": { "opacity": "0", "transform": "scale(0.7)" },
5316
+ "to": { "opacity": "1", "transform": "scale(1)" } },
5317
+ "floatY": { "0%": { "transform": "translateY(0)" },
5318
+ "50%": { "transform": "translateY(-8px)" },
5319
+ "100%": { "transform": "translateY(0)" } }
5320
+ },
5321
+ "stage": {
5322
+ "animate": { "name": "zoomIn", "duration": 500, "easing": "cubic-bezier(0.34, 1.56, 0.64, 1)" },
5323
+ "maskAnimate": { "name": "fadeIn", "duration": 400 }
5324
+ },
5325
+ // \u4EFB\u610F\u8282\u70B9\u3001\u4EE5\u53CA stage.closeButton \u4E0A\u90FD\u80FD\u5199 animate
5326
+ { "animate": { "name": "floatY", "duration": 3000, "easing": "ease-in-out", "iteration": "infinite" } }
5327
+ \`\`\`
5328
+
5329
+ \`animate\` \u5B57\u6BB5\uFF1A\`name\`\uFF08\u5FC5\u586B\uFF0C\u5FC5\u987B\u5728 keyframes \u91CC\u5B9A\u4E49\u8FC7\uFF09\u3001\`duration\`\uFF08\u5FC5\u586B\uFF0C\u6BEB\u79D2\uFF0C>0\uFF09\u3001
5330
+ \`delay\`\uFF08\u6BEB\u79D2\uFF0C\u9ED8\u8BA4 0\uFF09\u3001\`easing\`\uFF08\u9ED8\u8BA4 \`ease\`\uFF09\u3001\`iteration\`\uFF08\u6B63\u6574\u6570\u6216 \`"infinite"\`\uFF0C\u9ED8\u8BA4 1\uFF09\u3001
5331
+ \`direction\`\uFF08\`normal\`/\`reverse\`/\`alternate\`/\`alternate-reverse\`\uFF09\u3001\`fill\`\uFF08\u9ED8\u8BA4 \`both\`\uFF0C**\u4E0D\u8981\u6539**\uFF09\u3002
5332
+
5333
+ \`easing\` \u53EA\u80FD\u662F\uFF1A${ALLOWED_EASINGS.map((item) => "`" + item + "`").join(" ")}\uFF0C
5334
+ \u6216 \`cubic-bezier(0.34, 1.56, 0.64, 1)\` \u8FD9\u79CD\u56DB\u53C2\u6570\u5199\u6CD5\u3002**\u522B\u7684\u53D6\u503C\u4E00\u5F8B\u62A5\u9519**\u3002
5335
+
5336
+ \u5173\u952E\u5E27\u7684\u504F\u79FB\u91CF\u53EA\u80FD\u5199 \`"from"\` / \`"to"\` / \`"50%"\`\uFF1B\u6BCF\u4E00\u5E27\u7684\u503C\u662F\u6837\u5F0F\u5BF9\u8C61\uFF0C\u952E\u8D70 style \u767D\u540D\u5355
5337
+ \uFF08\u52A8\u753B\u91CC\u5E38\u7528\u7684\u5C31 \`transform\` \`opacity\` \`shadow\` \`background\` \`color\`\uFF09\u3002
5338
+
5339
+ \u89C4\u5219\uFF1A
5340
+
5341
+ - \u4E00\u4E2A\u8282\u70B9\u53EA\u80FD\u6302\u4E00\u7EC4 \`animate\`\u3002\u65E2\u8981\u5165\u573A\u53C8\u8981\u5FAA\u73AF\uFF0C\u5C31\u62C6\u6210\u7236\u5B50\u4E24\u5C42
5342
+ - \u4EA4\u9519\u5165\u573A\u7528**\u540C\u4E00\u7EC4\u5173\u952E\u5E27 + \u4E0D\u540C \`delay\`**\u3002\`delay\` \u5FC5\u987B\u662F\u5E38\u91CF\u6570\u5B57\uFF0C\u4E0D\u652F\u6301 \`{{ }}\`\uFF0C\u6240\u4EE5\u4EA4\u9519\u5217\u8868\u8981\u4E00\u683C\u4E00\u683C\u5199\u3001\u4E0D\u80FD\u7528 \`repeat\`
5343
+ - \u5FAA\u73AF\u52A8\u753B\u5199 \`"iteration": "infinite"\`\uFF0C\u5E45\u5EA6\u8981\u5C0F\uFF08\u6309\u94AE\u8109\u51B2\u653E\u5927 2% \u5C31\u591F\uFF09
5344
+ - \u4F4D\u79FB\u4E00\u5F8B\u7528 \`transform\`\uFF0C\u4E0D\u8981\u52A8\u5BBD\u9AD8 / \`left\`\uFF08\u6BCF\u5E27\u91CD\u6392\uFF09\uFF1B\u6309\u94AE\u547C\u5438\u4F18\u5148\u52A8 \`shadow\`
5345
+ - \u88C5\u9970\u5C42\uFF08\u5149\u6655\u3001\u626B\u5149\u6761\u3001\u5149\u70B9\uFF09\u5FC5\u987B\u5199 \`"pointerEvents": "none"\`\uFF0C\u5426\u5219\u6321\u4F4F\u4E0B\u9762\u7684\u6309\u94AE
5346
+ - \u5B9A\u4E49\u4E86\u6CA1\u4EBA\u5F15\u7528\u7684\u5173\u952E\u5E27\u4F1A\u544A\u8B66\uFF0C\u4E0D\u8981\u7559
5347
+
5348
+ \`hoverStyle\` \u4E0E \`style\` \u540C\u4E00\u5957\u767D\u540D\u5355\uFF0C\u53EA\u5728\u9F20\u6807\u60AC\u505C\u65F6\u751F\u6548\uFF08\u8282\u70B9\u4E0E \`stage.closeButton\` \u90FD\u80FD\u5199\uFF09\u3002
5349
+ \u8981\u5E73\u6ED1\u8FC7\u6E21\u5C31\u5728 \`style\` \u91CC\u5199 \`transition\`\u3002\u89E6\u5C4F\u6CA1\u6709 hover\uFF0C**hover \u91CC\u4E0D\u80FD\u653E\u4FE1\u606F**\u3002
5350
+ \u5E26\u5FAA\u73AF\u52A8\u753B\u7684\u6309\u94AE\u60F3\u5728\u60AC\u505C\u65F6\u505C\u4F4F\uFF0C\u5728 \`hoverStyle\` \u91CC\u52A0 \`"animationPlayState": "paused"\`
5351
+ \uFF08\u5199\u8FDB \`style\` \u7B49\u4E8E\u4E00\u5F00\u59CB\u5C31\u6682\u505C\uFF0C\u6CA1\u6709\u610F\u4E49\uFF09\u3002
5352
+
5353
+ \`\`\`jsonc
5354
+ { "type": "text", "content": "\u2715",
5355
+ "style": { "background": "rgba(0,0,0,0.08)", "transition": "background 0.2s" },
5356
+ "hoverStyle": { "background": "rgba(0,0,0,0.2)" } }
5357
+ \`\`\`
5358
+
5359
+ \u7CFB\u7EDF\u5F00\u4E86\u300C\u51CF\u5C11\u52A8\u6001\u6548\u679C\u300D\u65F6\uFF0C\u89E3\u91CA\u5668\u4F1A\u81EA\u52A8\u628A\u8FD9\u4EFD\u7269\u6599\u7684\u52A8\u753B\u548C\u8FC7\u6E21\u5168\u90E8\u5173\u6389\uFF0C\u914D\u7F6E\u91CC\u4E0D\u7528\u7BA1\uFF0C
5360
+ \u4E5F\u6CA1\u6709\u5F00\u5173\u80FD\u7ED5\u8FC7 \u2014\u2014 \u6240\u4EE5**\u9759\u6B62\u72B6\u6001\u4E0B\u8FD9\u4EFD\u7269\u6599\u5FC5\u987B\u5B8C\u6574\u53EF\u8BFB\u3001\u53EF\u70B9**\u3002
5361
+
5362
+ \u6CA1\u6709 \`position\`\u3001\u6CA1\u6709\u81EA\u7531 CSS\uFF1A\u7EDD\u5BF9\u5B9A\u4F4D\u7528 \`rect\`\uFF0C\`zIndex\` \u53EA\u5141\u8BB8 0~10\u3002
5363
+ \`keyframes\` \u548C \`hoverStyle\` \u7684\u503C\u91CC\u51FA\u73B0 \`{\` \`}\` \`<\` \`>\` \`;\` \`@\` \`/*\` \`\\\` \u65F6\uFF0C\u90A3\u6761\u58F0\u660E\u4F1A\u88AB\u6574\u6761\u4E22\u5F03\u3002`;
5364
+ }
5365
+
3901
5366
  // src/docs/ai-prompt/index.ts
3902
5367
  function findExample(value) {
3903
5368
  const found = examples_default.filter((item) => item.value === value)[0];
@@ -3931,6 +5396,7 @@ ${JSON.stringify(full, null, 2)}
3931
5396
  actionSection(),
3932
5397
  viewsSection(),
3933
5398
  countdownSection(),
5399
+ animationSection(),
3934
5400
  exampleSection,
3935
5401
  checklistSection(),
3936
5402
  requirementSection()