@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.
@@ -5,6 +5,11 @@ function toLength(value) {
5
5
  return typeof value === "number" ? `${value}px` : String(value);
6
6
  }
7
7
  var px = toLength;
8
+ function clampZIndex(value) {
9
+ const num = typeof value === "number" ? value : parseFloat(String(value));
10
+ if (!isFinite(num)) return 0;
11
+ return Math.min(10, Math.max(0, Math.round(num)));
12
+ }
8
13
  var STYLE_MAP = {
9
14
  // 文字
10
15
  color: ["color", String],
@@ -57,6 +62,26 @@ var STYLE_MAP = {
57
62
  minHeight: ["minHeight", px],
58
63
  maxWidth: ["maxWidth", px],
59
64
  maxHeight: ["maxHeight", px],
65
+ // 动效相关。transform / transition 是做位移、缩放、hover 过渡的最小必需集;
66
+ // 不放开 position / display / grid —— rect 已经提供绝对定位,栅格用 flex wrap + 百分比宽复刻,
67
+ // 放开 position 等于把「全屏覆盖」这类越权手段又交回给配置。
68
+ transform: ["transform", String],
69
+ transformOrigin: ["transformOrigin", String],
70
+ transition: ["transition", String],
71
+ // 只为 hoverStyle 而放开:`animationPlayState: 'paused'` 才能做到「悬停时暂停呼吸动画」。
72
+ // 写进普通 style 也合法(等于一开始就暂停),但那基本没有意义。
73
+ animationPlayState: ["animationPlayState", String],
74
+ // 毛玻璃。Safari 至今只认带前缀的写法,所以两个键一起输出,见 EXTRA_CSS_KEYS
75
+ backdropFilter: ["backdropFilter", String],
76
+ textShadow: ["textShadow", String],
77
+ // 只允许 0~10:越权提层是弹窗类配置最容易做的坏事(盖住宿主自己的导航 / 收银台),
78
+ // 层内排布十层绰绰有余,真需要压过页面其它内容的是弹窗层,那由解释器自己给 1000
79
+ zIndex: ["zIndex", (v) => String(clampZIndex(v))],
80
+ // 装饰性图层(光斑、扫光)必须让点击穿透,否则会挡住下面的按钮
81
+ pointerEvents: ["pointerEvents", String],
82
+ // 横向排布里「这一项不许被压扁」,图标位和数字位常用
83
+ flexShrink: ["flexShrink", String],
84
+ fontStyle: ["fontStyle", String],
60
85
  // 图片
61
86
  objectFit: ["objectFit", String],
62
87
  // 宽度给百分比、高度按比例算。整图 banner 的热区必须靠它才能用百分比定位:
@@ -93,6 +118,17 @@ var USER_FIELD_LABELS = {
93
118
  serviceInfo: "\u5BA2\u670D\u4E0E\u793E\u7FA4\u4FE1\u606F\uFF08\u5BF9\u8C61\uFF0C\u6309\u9700\u53D6\u5B50\u5B57\u6BB5\uFF09"
94
119
  };
95
120
 
121
+ // src/css.ts
122
+ var ALLOWED_EASINGS = [
123
+ "linear",
124
+ "ease",
125
+ "ease-in",
126
+ "ease-out",
127
+ "ease-in-out",
128
+ "step-start",
129
+ "step-end"
130
+ ];
131
+
96
132
  // src/validate.ts
97
133
  var DSL_VERSION = 1;
98
134
  var NODE_TYPES = [
@@ -445,8 +481,228 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6`
445
481
  ];
446
482
  var action_default = sections;
447
483
 
448
- // src/docs/sections/countdown.ts
484
+ // src/docs/sections/animation.ts
449
485
  var sections2 = [
486
+ {
487
+ id: "animation",
488
+ title: "15. \u52A8\u753B\u4E0E hover",
489
+ blocks: [
490
+ {
491
+ t: "p",
492
+ 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"
493
+ },
494
+ {
495
+ t: "code",
496
+ code: `{
497
+ "version": 1,
498
+ "keyframes": {
499
+ "zoomIn": {
500
+ "from": { "opacity": "0", "transform": "scale(0.7)" },
501
+ "to": { "opacity": "1", "transform": "scale(1)" }
502
+ },
503
+ "floatY": {
504
+ "0%": { "transform": "translateY(0)" },
505
+ "50%": { "transform": "translateY(-8px)" },
506
+ "100%": { "transform": "translateY(0)" }
507
+ }
508
+ },
509
+ "stage": {
510
+ "animate": { "name": "zoomIn", "duration": 500, "easing": "cubic-bezier(0.34, 1.56, 0.64, 1)" },
511
+ "maskAnimate": { "name": "fadeIn", "duration": 400 }
512
+ },
513
+ "nodes": [
514
+ { "type": "text", "content": "\u{1F9E7}",
515
+ "animate": { "name": "floatY", "duration": 3000, "easing": "ease-in-out", "iteration": "infinite" } }
516
+ ]
517
+ }`
518
+ },
519
+ { t: "h3", text: "keyframes\uFF1A\u5173\u952E\u5E27\u5E93" },
520
+ {
521
+ t: "list",
522
+ items: [
523
+ "\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",
524
+ "\u504F\u79FB\u91CF\u53EA\u8BA4 `from` / `to` / `50%` \u4E09\u79CD\u5199\u6CD5\uFF0C\u5199 `0.5` \u6216 `half` \u4F1A\u88AB\u62E6\u4E0B",
525
+ "\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",
526
+ "\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"
527
+ ]
528
+ },
529
+ {
530
+ t: "note",
531
+ tone: "info",
532
+ 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"
533
+ },
534
+ { t: "h3", text: "animate\uFF1A\u600E\u4E48\u64AD" },
535
+ {
536
+ t: "table",
537
+ head: ["\u5B57\u6BB5", "\u5FC5\u586B", "\u9ED8\u8BA4", "\u8BF4\u660E"],
538
+ rows: [
539
+ ["`name`", "\u662F", "\u2014", "\u5173\u952E\u5E27\u540D\uFF0C\u5FC5\u987B\u5728 `keyframes` \u91CC\u5B9A\u4E49\u8FC7\uFF0C\u5426\u5219\u4FDD\u5B58\u65F6\u62A5\u9519"],
540
+ ["`duration`", "\u662F", "\u2014", "\u65F6\u957F\uFF0C\u6BEB\u79D2\u3002\u5FC5\u987B\u5927\u4E8E 0"],
541
+ ["`delay`", "\u5426", "`0`", "\u5EF6\u8FDF\uFF0C\u6BEB\u79D2\u3002\u4EA4\u9519\u5165\u573A\u5C31\u9760\u5B83\u4E00\u683C\u4E00\u683C\u9519\u5F00"],
542
+ ["`easing`", "\u5426", "`ease`", `\u7F13\u52A8\uFF0C\u767D\u540D\u5355\u89C1\u4E0B`],
543
+ ["`iteration`", "\u5426", "`1`", "\u64AD\u653E\u6B21\u6570\uFF0C\u6B63\u6574\u6570\uFF1B`'infinite'` \u65E0\u9650\u5FAA\u73AF"],
544
+ [
545
+ "`direction`",
546
+ "\u5426",
547
+ "`normal`",
548
+ "`normal` / `reverse` / `alternate` / `alternate-reverse`"
549
+ ],
550
+ [
551
+ "`fill`",
552
+ "\u5426",
553
+ "`both`",
554
+ "`none` / `forwards` / `backwards` / `both`\u3002\u9ED8\u8BA4\u4FDD\u7559\u7EC8\u6001\uFF0C\u5165\u573A\u52A8\u753B\u4E0D\u8981\u6539\u5B83"
555
+ ]
556
+ ]
557
+ },
558
+ {
559
+ t: "p",
560
+ text: `\u53EF\u7528\u7684 \`easing\`\uFF1A${ALLOWED_EASINGS.map((item) => "`" + item + "`").join(" ")}\uFF0C
561
+ \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
562
+ \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`
563
+ },
564
+ {
565
+ t: "note",
566
+ tone: "warn",
567
+ 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"
568
+ },
569
+ { t: "h3", text: "\u80FD\u6302\u5728\u54EA" },
570
+ {
571
+ t: "table",
572
+ head: ["\u4F4D\u7F6E", "\u5178\u578B\u7528\u9014"],
573
+ rows: [
574
+ ["`stage.animate`", "\u5F39\u7A97\u4E3B\u4F53\u5165\u573A\uFF08\u653E\u5927\u56DE\u5F39\u3001\u4E0A\u6ED1\uFF09"],
575
+ [
576
+ "`stage.maskAnimate`",
577
+ "\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"
578
+ ],
579
+ ["\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"],
580
+ [
581
+ "`stage.closeButton.animate`",
582
+ "\u5EF6\u8FDF\u6DE1\u5165\u7684 \u2715\uFF08\u5148\u8BA9\u7528\u6237\u770B\u5185\u5BB9\uFF0C\u518D\u9732\u51FA\u5173\u95ED\u5165\u53E3\uFF09"
583
+ ]
584
+ ]
585
+ },
586
+ { t: "h3", text: "\u4EA4\u9519\u5165\u573A\uFF1A\u540C\u4E00\u7EC4\u5173\u952E\u5E27 + \u4E0D\u540C delay" },
587
+ {
588
+ t: "p",
589
+ 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"
590
+ },
591
+ {
592
+ t: "code",
593
+ code: `"keyframes": {
594
+ "cellIn": {
595
+ "0%": { "opacity": "0", "transform": "translateY(10px)" },
596
+ "100%": { "opacity": "1", "transform": "translateY(0)" }
597
+ }
598
+ }
599
+
600
+ // \u4E94\u4E2A\u683C\u5B50\uFF0C\u6BCF\u683C\u665A 80ms
601
+ { "animate": { "name": "cellIn", "duration": 460, "delay": 340, "easing": "ease-out" } }
602
+ { "animate": { "name": "cellIn", "duration": 460, "delay": 420, "easing": "ease-out" } }
603
+ { "animate": { "name": "cellIn", "duration": 460, "delay": 500, "easing": "ease-out" } }`
604
+ },
605
+ { t: "h3", text: "\u65E0\u9650\u5FAA\u73AF\uFF1A\u547C\u5438\u3001\u626B\u5149\u3001\u5149\u70B9" },
606
+ {
607
+ t: "list",
608
+ items: [
609
+ '\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`',
610
+ "\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",
611
+ '\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',
612
+ "\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",
613
+ "\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"
614
+ ]
615
+ },
616
+ {
617
+ t: "note",
618
+ tone: "info",
619
+ 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"
620
+ },
621
+ { t: "h3", text: "hoverStyle\uFF1A\u9F20\u6807\u60AC\u505C" },
622
+ {
623
+ t: "p",
624
+ 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"
625
+ },
626
+ {
627
+ t: "code",
628
+ code: `{
629
+ "type": "text", "content": "\u2715",
630
+ "style": { "background": "rgba(0,0,0,0.08)", "transition": "background 0.2s" },
631
+ "hoverStyle": { "background": "rgba(0,0,0,0.2)" }
632
+ }`
633
+ },
634
+ {
635
+ t: "list",
636
+ items: [
637
+ "\u60F3\u8981\u5E73\u6ED1\u8FC7\u6E21\u5C31\u5728 `style` \u91CC\u5199 `transition`\uFF0C`hoverStyle` \u53EA\u8D1F\u8D23\u7EC8\u6001",
638
+ "\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",
639
+ "`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",
640
+ "`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"
641
+ ]
642
+ },
643
+ { t: "h3", text: "\u60AC\u505C\u65F6\u6682\u505C\u5FAA\u73AF\u52A8\u753B" },
644
+ {
645
+ t: "p",
646
+ 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'
647
+ },
648
+ {
649
+ t: "code",
650
+ code: `{
651
+ "type": "button", "text": "\u7ACB\u5373\u9886\u53D6",
652
+ "style": { "transition": "transform 0.18s" },
653
+ "animate": { "name": "breath", "duration": 2400, "easing": "ease-in-out", "iteration": "infinite" },
654
+ "hoverStyle": { "transform": "translateY(-2px)", "animationPlayState": "paused" }
655
+ }`
656
+ },
657
+ { t: "h3", text: "\u7CFB\u7EDF\u5F00\u4E86\u300C\u51CF\u5C11\u52A8\u6001\u6548\u679C\u300D\u4F1A\u81EA\u52A8\u9759\u6B62" },
658
+ {
659
+ t: "p",
660
+ 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"
661
+ },
662
+ { t: "h3", text: "\u4E3A\u4EC0\u4E48\u4E0D\u80FD\u76F4\u63A5\u5199 CSS" },
663
+ {
664
+ t: "p",
665
+ 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"
666
+ },
667
+ {
668
+ t: "list",
669
+ items: [
670
+ "`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",
671
+ "`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",
672
+ "\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",
673
+ "\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"
674
+ ]
675
+ },
676
+ { t: "h3", text: "\u5B89\u5168\u8FC7\u6EE4\uFF1A\u4EC0\u4E48\u4F1A\u88AB\u6084\u6084\u4E22\u6389" },
677
+ {
678
+ t: "p",
679
+ 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"
680
+ },
681
+ {
682
+ t: "list",
683
+ items: [
684
+ "\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",
685
+ "\u767D\u540D\u5355\u5916\u7684\u6837\u5F0F\u5C5E\u6027\uFF08\u540C `style`\uFF09",
686
+ "\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"
687
+ ]
688
+ },
689
+ {
690
+ t: "note",
691
+ tone: "warn",
692
+ 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"
693
+ },
694
+ { t: "h3", text: "\u5B8C\u6574\u4F8B\u5B50" },
695
+ {
696
+ t: "p",
697
+ 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"
698
+ }
699
+ ]
700
+ }
701
+ ];
702
+ var animation_default = sections2;
703
+
704
+ // src/docs/sections/countdown.ts
705
+ var sections3 = [
450
706
  {
451
707
  id: "countdown",
452
708
  title: "10. \u5012\u8BA1\u65F6",
@@ -520,6 +776,22 @@ var sections2 = [
520
776
  "style": { "color": "#999" } }
521
777
  ]`
522
778
  },
779
+ { t: "h3", text: "duration\uFF1A\u6BCF\u6B21\u6253\u5F00\u91CD\u65B0\u5012\u8BA1\u65F6" },
780
+ {
781
+ t: "p",
782
+ 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'
783
+ },
784
+ {
785
+ t: "code",
786
+ code: `{ "type": "countdown", "duration": 300000, "precision": "cs",
787
+ "onEnd": { "type": "closeAll", "reason": "countdown-end" },
788
+ "children": [ /* \u540C\u4E0A */ ] }`
789
+ },
790
+ {
791
+ t: "note",
792
+ tone: "info",
793
+ 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"
794
+ },
523
795
  { t: "h3", text: "to\uFF1A\u7ED3\u675F\u65F6\u95F4\u600E\u4E48\u5199" },
524
796
  { 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" },
525
797
  {
@@ -551,14 +823,14 @@ var sections2 = [
551
823
  ]
552
824
  }
553
825
  ];
554
- var countdown_default = sections2;
826
+ var countdown_default = sections3;
555
827
 
556
828
  // src/docs/sections/data-state.ts
557
829
  var userFieldRows = DEFAULT_USER_FIELDS.map((field) => [
558
830
  `\`user.${field}\``,
559
831
  USER_FIELD_LABELS[field] || ""
560
832
  ]);
561
- var sections3 = [
833
+ var sections4 = [
562
834
  {
563
835
  id: "data",
564
836
  title: "8. \u6570\u636E\u4E0E\u72B6\u6001",
@@ -588,7 +860,12 @@ var sections3 = [
588
860
  {
589
861
  t: "note",
590
862
  tone: "info",
591
- 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"
863
+ 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"
864
+ },
865
+ {
866
+ t: "note",
867
+ tone: "warn",
868
+ 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'
592
869
  },
593
870
  {
594
871
  t: "p",
@@ -726,10 +1003,10 @@ var sections3 = [
726
1003
  ]
727
1004
  }
728
1005
  ];
729
- var data_state_default = sections3;
1006
+ var data_state_default = sections4;
730
1007
 
731
1008
  // src/docs/sections/guide-basics.ts
732
- var sections4 = [
1009
+ var sections5 = [
733
1010
  {
734
1011
  id: "ai",
735
1012
  title: "0. \u4E0D\u4F1A\u5199 JSON\uFF1F\u7528 AI \u751F\u6210",
@@ -842,10 +1119,10 @@ var sections4 = [
842
1119
  ]
843
1120
  }
844
1121
  ];
845
- var guide_basics_default = sections4;
1122
+ var guide_basics_default = sections5;
846
1123
 
847
1124
  // src/docs/sections/guide-layout.ts
848
- var sections5 = [
1125
+ var sections6 = [
849
1126
  {
850
1127
  id: "layout",
851
1128
  title: "4. \u5E03\u5C40\u6A21\u578B\uFF08\u6700\u91CD\u8981\uFF09",
@@ -988,10 +1265,10 @@ var sections5 = [
988
1265
  ]
989
1266
  }
990
1267
  ];
991
- var guide_layout_default = sections5;
1268
+ var guide_layout_default = sections6;
992
1269
 
993
1270
  // src/docs/sections/guide-stage.ts
994
- var sections6 = [
1271
+ var sections7 = [
995
1272
  {
996
1273
  id: "stage",
997
1274
  title: "3. stage \u821E\u53F0",
@@ -1004,6 +1281,8 @@ var sections6 = [
1004
1281
  "layout": "flow", // absolute\uFF08\u9ED8\u8BA4\uFF09| flow
1005
1282
  "mask": true, // \u662F\u5426\u6709\u534A\u900F\u660E\u906E\u7F69\uFF0C\u4EC5 popup \u6709\u6548
1006
1283
  "maskClosable": false, // \u70B9\u906E\u7F69\u80FD\u5426\u5173\u95ED
1284
+ "maskStyle": { "background": "rgba(0,0,0,0.65)" }, // \u906E\u7F69\u914D\u8272\uFF08\u53EF\u9009\uFF09
1285
+ "maskAction": { "type": "open", "view": "confirm" }, // \u70B9\u906E\u7F69\u505A\u4EC0\u4E48\uFF08\u53EF\u9009\uFF09
1007
1286
  "closeButton": {
1008
1287
  "show": true,
1009
1288
  "position": "top-right", // top-right | top-left | bottom-center
@@ -1020,7 +1299,17 @@ var sections6 = [
1020
1299
  ["height", "400", '\u6570\u5B57\u6309 px\uFF1B\u5199 `auto` \u65F6\u5FC5\u987B\u540C\u65F6\u8BBE `layout: "flow"`'],
1021
1300
  ["layout", "absolute", "\u5B50\u8282\u70B9\u6392\u5E03\u65B9\u5F0F\uFF0C\u89C1\u7B2C 4 \u8282\u3002\u9009\u9519\u662F\u6700\u5E38\u89C1\u7684\u9519\u8BEF"],
1022
1301
  ["mask", "true", "\u4EC5 popup \u751F\u6548"],
1023
- ["maskClosable", "false", "\u70B9\u906E\u7F69\u5173\u95ED"],
1302
+ ["maskClosable", "false", "\u70B9\u906E\u7F69\u80FD\u4E0D\u80FD\u70B9\uFF08\u80FD\u4E0D\u80FD\u5173\uFF09"],
1303
+ [
1304
+ "maskStyle",
1305
+ "`rgba(0,0,0,0.55)`",
1306
+ "\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"
1307
+ ],
1308
+ [
1309
+ "maskAction",
1310
+ "\u65E0\uFF08\u5173\u6389\u8FD9\u4E00\u5C42\uFF09",
1311
+ "\u70B9\u906E\u7F69\u6267\u884C\u7684\u52A8\u4F5C\u3002\u914D\u4E86\u5C31**\u4E0D\u5173\u5C42**\uFF0C\u53EA\u6267\u884C\u52A8\u4F5C"
1312
+ ],
1024
1313
  ["closeButton", "\u65E0", "\u4E0D\u5199\u5C31\u6CA1\u6709\u5173\u95ED\u6309\u94AE"],
1025
1314
  ["style", "\u65E0", "\u821E\u53F0\u81EA\u8EAB\u6837\u5F0F\uFF0C\u5E38\u7528 `radius` / `maxWidth` / `background`"]
1026
1315
  ]
@@ -1030,6 +1319,32 @@ var sections6 = [
1030
1319
  tone: "info",
1031
1320
  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"
1032
1321
  },
1322
+ { t: "h3", text: "\u906E\u7F69\uFF1A\u6539\u914D\u8272\u3001\u6539\u70B9\u51FB\u884C\u4E3A" },
1323
+ {
1324
+ t: "p",
1325
+ 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"
1326
+ },
1327
+ {
1328
+ t: "code",
1329
+ code: `"stage": {
1330
+ "mask": true,
1331
+ "maskClosable": true,
1332
+ // \u66F4\u91CD\u7684\u906E\u7F69 + \u6BDB\u73BB\u7483\uFF08\u80CC\u540E\u9875\u9762\u7CCA\u6389\uFF0C\u5F39\u7A97\u66F4\u805A\u7126\uFF09
1333
+ "maskStyle": { "background": "rgba(0,0,0,0.65)", "backdropFilter": "blur(4px)" },
1334
+ // \u70B9\u906E\u7F69\u4E0D\u76F4\u63A5\u5173\uFF0C\u5148\u5F39\u4E8C\u6B21\u633D\u7559
1335
+ "maskAction": { "type": "open", "view": "confirm", "mode": "stack" }
1336
+ }`
1337
+ },
1338
+ {
1339
+ t: "note",
1340
+ tone: "warn",
1341
+ 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"
1342
+ },
1343
+ {
1344
+ t: "note",
1345
+ tone: "info",
1346
+ 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"
1347
+ },
1033
1348
  { t: "h3", text: "closeButton \u5173\u95ED\u6309\u94AE" },
1034
1349
  {
1035
1350
  t: "code",
@@ -1042,7 +1357,9 @@ var sections6 = [
1042
1357
  // 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
1043
1358
  "icon": "\u2715", // \u53EF\u9009\uFF1A\u6539\u6210\u6587\u672C\u5B57\u7B26 / emoji
1044
1359
  "image": "https://...", // \u53EF\u9009\uFF1A\u6539\u6210\u56FE\u7247\uFF0C\u5199\u4E86\u5C31\u76D6\u8FC7 icon
1045
- "style": { "background": "rgba(0,0,0,0.35)", "color": "#fff", "fontSize": 18 }
1360
+ "style": { "background": "rgba(0,0,0,0.35)", "color": "#fff", "fontSize": 18 },
1361
+ // \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
1362
+ "action": { "type": "open", "view": "confirm", "mode": "stack" }
1046
1363
  }`
1047
1364
  },
1048
1365
  {
@@ -1059,9 +1376,19 @@ var sections6 = [
1059
1376
  "**\u53EF\u9009\u8986\u76D6\u9879**\u3002\u5199\u4E86\u5C31\u7528\u8FD9\u4E2A\u6587\u672C\u5B57\u7B26 / emoji \u4EE3\u66FF\u5185\u7F6E\u56FE\u6807"
1060
1377
  ],
1061
1378
  ["image", "\u65E0", "\u56FE\u7247\u56FE\u6807\uFF0C\u4F1A\u94FA\u6EE1\u6309\u94AE\uFF08`object-fit: contain`\uFF09"],
1062
- ["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"]
1379
+ ["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"],
1380
+ [
1381
+ "action",
1382
+ "\u65E0\uFF08\u5173\u6389\u8FD9\u4E00\u5C42\uFF09",
1383
+ "\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"
1384
+ ]
1063
1385
  ]
1064
1386
  },
1387
+ {
1388
+ t: "note",
1389
+ tone: "warn",
1390
+ 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'
1391
+ },
1065
1392
  { t: "h3", text: "\u56FE\u6807\u753B\u4EC0\u4E48\uFF1A\u4E09\u9009\u4E00\uFF0C\u4F18\u5148\u7EA7\u56FA\u5B9A" },
1066
1393
  {
1067
1394
  t: "table",
@@ -1152,7 +1479,7 @@ var sections6 = [
1152
1479
  ]
1153
1480
  }
1154
1481
  ];
1155
- var guide_stage_default = sections6;
1482
+ var guide_stage_default = sections7;
1156
1483
 
1157
1484
  // src/docs/sections/nodes.ts
1158
1485
  var containerRows = [
@@ -1182,7 +1509,7 @@ var contentRows = [
1182
1509
  var styleRows = [
1183
1510
  [
1184
1511
  "\u6587\u5B57",
1185
- "`color` `fontSize` `fontWeight` `fontFamily` `lineHeight` `letterSpacing` `textAlign` `textDecoration` `whiteSpace` `fontVariantNumeric`"
1512
+ "`color` `fontSize` `fontWeight` `fontFamily` `fontStyle` `lineHeight` `letterSpacing` `textAlign` `textDecoration` `whiteSpace` `fontVariantNumeric` `textShadow`"
1186
1513
  ],
1187
1514
  [
1188
1515
  "\u80CC\u666F",
@@ -1196,11 +1523,15 @@ var styleRows = [
1196
1523
  ["flex \u5BB9\u5668", "`direction` `gap` `wrap` `align` `justify`"],
1197
1524
  [
1198
1525
  "flex \u5B50\u9879 / \u5C3A\u5BF8",
1199
- "`flex` `alignSelf` `width` `height` `minWidth` `minHeight` `maxWidth` `maxHeight`"
1526
+ "`flex` `alignSelf` `flexShrink` `width` `height` `minWidth` `minHeight` `maxWidth` `maxHeight`"
1527
+ ],
1528
+ [
1529
+ "\u52A8\u6548 / \u5C42\u7EA7\uFF08\u89C1\u7B2C 15 \u8282\uFF09",
1530
+ "`transform` `transformOrigin` `transition` `animationPlayState` `backdropFilter` `zIndex` `pointerEvents`"
1200
1531
  ],
1201
1532
  ["\u56FE\u7247 / \u6BD4\u4F8B", "`objectFit` `aspectRatio`"]
1202
1533
  ];
1203
- var sections7 = [
1534
+ var sections8 = [
1204
1535
  {
1205
1536
  id: "nodes",
1206
1537
  title: "6. \u8282\u70B9\u7C7B\u578B",
@@ -1297,7 +1628,10 @@ var sections7 = [
1297
1628
  '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"`',
1298
1629
  "\u5927\u5B57\u53F7\u6587\u672C\u8981\u663E\u5F0F\u5199 `lineHeight`\uFF0C\u5426\u5219\u9ED8\u8BA4\u884C\u9AD8\u4F1A\u628A\u5BB9\u5668\u6491\u9AD8",
1299
1630
  '\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',
1300
- "`style` \u7684\u503C\u4E5F\u652F\u6301 `{{ }}` \u63D2\u503C\uFF0C\u9009\u4E2D\u6001\u5C31\u662F\u9760\u8FD9\u4E2A\u505A\u7684"
1631
+ "`style` \u7684\u503C\u4E5F\u652F\u6301 `{{ }}` \u63D2\u503C\uFF0C\u9009\u4E2D\u6001\u5C31\u662F\u9760\u8FD9\u4E2A\u505A\u7684",
1632
+ "`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`",
1633
+ "\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",
1634
+ '\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'
1301
1635
  ]
1302
1636
  },
1303
1637
  {
@@ -1313,10 +1647,10 @@ var sections7 = [
1313
1647
  ]
1314
1648
  }
1315
1649
  ];
1316
- var nodes_default = sections7;
1650
+ var nodes_default = sections8;
1317
1651
 
1318
1652
  // src/docs/sections/views.ts
1319
- var sections8 = [
1653
+ var sections9 = [
1320
1654
  {
1321
1655
  id: "views",
1322
1656
  title: "12. \u591A\u89C6\u56FE\uFF08\u4E00\u4EFD\u914D\u7F6E\u91CC\u653E\u51E0\u4E2A\u5F39\u7A97\uFF09",
@@ -1468,10 +1802,10 @@ var sections8 = [
1468
1802
  ]
1469
1803
  }
1470
1804
  ];
1471
- var views_default = sections8;
1805
+ var views_default = sections9;
1472
1806
 
1473
1807
  // src/docs/sections/index.ts
1474
- var sections9 = [].concat(
1808
+ var sections10 = [].concat(
1475
1809
  guide_basics_default,
1476
1810
  // 0~2
1477
1811
  guide_stage_default,
@@ -1486,13 +1820,42 @@ var sections9 = [].concat(
1486
1820
  // 10
1487
1821
  action_default,
1488
1822
  // 11
1489
- views_default
1823
+ views_default,
1490
1824
  // 12~14
1825
+ animation_default
1826
+ // 15
1491
1827
  );
1492
- var sections_default = sections9;
1828
+ var sections_default = sections10;
1493
1829
 
1494
1830
  // src/docs/meta.ts
1495
1831
  var changelog = [
1832
+ {
1833
+ date: "2026-09-01",
1834
+ items: [
1835
+ "`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`",
1836
+ "\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",
1837
+ "\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",
1838
+ "`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"
1839
+ ]
1840
+ },
1841
+ {
1842
+ date: "2026-08-31",
1843
+ items: [
1844
+ "\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",
1845
+ "\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",
1846
+ "style \u767D\u540D\u5355\u65B0\u589E transform / transformOrigin / transition / backdropFilter / textShadow / zIndex\uFF080~10\uFF09 / pointerEvents / flexShrink / fontStyle\uFF08\u7B2C 7 \u8282\uFF09",
1847
+ "\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",
1848
+ "\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",
1849
+ "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",
1850
+ "\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",
1851
+ "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",
1852
+ "\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)",
1853
+ "\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",
1854
+ "\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",
1855
+ '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',
1856
+ "\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"
1857
+ ]
1858
+ },
1496
1859
  {
1497
1860
  date: "2026-08-24",
1498
1861
  items: [
@@ -1586,7 +1949,7 @@ var meta_default = meta;
1586
1949
 
1587
1950
  // src/docs/examples/renew-expire.ts
1588
1951
  var ORANGE = "linear-gradient(90deg,#ff7a00,#faad14)";
1589
- var achieveCell = {
1952
+ var achieveCell = (verb, field, unit, label) => ({
1590
1953
  type: "flex",
1591
1954
  style: {
1592
1955
  direction: "column",
@@ -1608,7 +1971,7 @@ var achieveCell = {
1608
1971
  children: [
1609
1972
  {
1610
1973
  type: "text",
1611
- content: "{{ item.v }}",
1974
+ content: verb,
1612
1975
  style: {
1613
1976
  fontSize: 11.5,
1614
1977
  fontWeight: "600",
@@ -1618,23 +1981,23 @@ var achieveCell = {
1618
1981
  },
1619
1982
  {
1620
1983
  type: "text",
1621
- content: "{{ item.n }}",
1984
+ content: `{{ stat.${field} }}`,
1622
1985
  style: { fontSize: 20, fontWeight: "800", lineHeight: 1.1, color: "#ffffff" }
1623
1986
  },
1624
1987
  {
1625
1988
  type: "text",
1626
- content: "{{ item.u }}",
1989
+ content: ` ${unit}`,
1627
1990
  style: { fontSize: 12, lineHeight: 1.1, color: "rgba(255,255,255,0.92)" }
1628
1991
  }
1629
1992
  ]
1630
1993
  },
1631
1994
  {
1632
1995
  type: "text",
1633
- content: "{{ item.l }}",
1996
+ content: label,
1634
1997
  style: { fontSize: 11.5, lineHeight: 1.35, color: "rgba(255,255,255,0.72)" }
1635
1998
  }
1636
1999
  ]
1637
- };
2000
+ });
1638
2001
  var loseRow = {
1639
2002
  type: "flex",
1640
2003
  style: { align: "center", gap: 8, padding: "8px 0" },
@@ -1754,9 +2117,9 @@ var renewExpire = {
1754
2117
  style: { radius: 18 }
1755
2118
  },
1756
2119
  data: {
1757
- // 成果格子同样走数据源(字段 v / n / u / l 与 achieveCell 模板对应),
1758
- // 后端返回几格就渲染几格
1759
- achieve: { $source: "shopAchievements" },
2120
+ // 成果格子同样走数据源。userStatistics 返回扁平对象,字段名是后端的 snake_case,
2121
+ // 下面四格各自直接插值 {{ stat.xxx }}(扁平对象没法 bind 遍历,见文件头注释)
2122
+ stat: { $source: "userStatistics" },
1760
2123
  lose: [
1761
2124
  { b: "\u6279\u91CF\u642C\u5BB6\u4E0A\u8D27", t: "\u5230\u671F\u540E\u65E0\u6CD5\u7EE7\u7EED\u4E0A\u8D27" },
1762
2125
  { 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" },
@@ -1794,10 +2157,20 @@ var renewExpire = {
1794
2157
  }
1795
2158
  },
1796
2159
  {
1797
- type: "repeat",
1798
- bind: "achieve",
2160
+ // 四格并列写死(扁平对象没法 bind 遍历),flex + wrap 排成 2×2
2161
+ type: "flex",
1799
2162
  style: { gap: 9, wrap: true },
1800
- template: achieveCell
2163
+ children: [
2164
+ achieveCell("\u5DF2\u4E0A\u67B6", "move_success_count", "\u4E2A", "\u7D2F\u8BA1\u642C\u5BB6\u6210\u529F"),
2165
+ achieveCell("\u8FD0\u884C", "operate_task_count", "\u9879", "\u81EA\u52A8\u7ECF\u8425\u4EFB\u52A1"),
2166
+ achieveCell(
2167
+ "\u5DF2\u8865\u9F50",
2168
+ "white_image_fill_count",
2169
+ "\u5F20",
2170
+ "\u767D\u5E95\u56FE \xB7 \u5408\u89C4\u53EF\u62A5\u6D3B\u52A8"
2171
+ ),
2172
+ achieveCell("\u5B8C\u6210", "ai_optimize_count", "\u6B21", "AI \u81EA\u52A8\u4F18\u5316")
2173
+ ]
1801
2174
  }
1802
2175
  ]
1803
2176
  },
@@ -1934,7 +2307,7 @@ var cdSeparator = (content) => ({
1934
2307
  content,
1935
2308
  style: { fontSize: 13, fontWeight: "800", color: "rgba(255,255,255,0.7)" }
1936
2309
  });
1937
- var achieveCell2 = {
2310
+ var achieveCell2 = (verb, field, unit, label) => ({
1938
2311
  type: "flex",
1939
2312
  style: {
1940
2313
  direction: "column",
@@ -1954,7 +2327,7 @@ var achieveCell2 = {
1954
2327
  children: [
1955
2328
  {
1956
2329
  type: "text",
1957
- content: "{{ item.v }}",
2330
+ content: verb,
1958
2331
  style: {
1959
2332
  fontSize: 11.5,
1960
2333
  fontWeight: "600",
@@ -1964,23 +2337,23 @@ var achieveCell2 = {
1964
2337
  },
1965
2338
  {
1966
2339
  type: "text",
1967
- content: "{{ item.n }}",
2340
+ content: `{{ stat.${field} }}`,
1968
2341
  style: { fontSize: 20, fontWeight: "800", lineHeight: 1.1, color: "#ffffff" }
1969
2342
  },
1970
2343
  {
1971
2344
  type: "text",
1972
- content: "{{ item.u }}",
2345
+ content: ` ${unit}`,
1973
2346
  style: { fontSize: 12, lineHeight: 1.1, color: "rgba(255,255,255,0.92)" }
1974
2347
  }
1975
2348
  ]
1976
2349
  },
1977
2350
  {
1978
2351
  type: "text",
1979
- content: "{{ item.l }}",
2352
+ content: label,
1980
2353
  style: { fontSize: 11.5, lineHeight: 1.35, color: "rgba(255,255,255,0.72)" }
1981
2354
  }
1982
2355
  ]
1983
- };
2356
+ });
1984
2357
  var loseRow2 = {
1985
2358
  type: "flex",
1986
2359
  style: { align: "flex-start", gap: 10, padding: "7px 0" },
@@ -2119,9 +2492,10 @@ var lastDay = {
2119
2492
  },
2120
2493
  data: {
2121
2494
  // 成果格子的数字是**实时统计**,写死就会跟店铺实际情况对不上 —— 走后端数据源。
2122
- // $source 填的是宿主注册过的数据源名(不是接口地址),返回项的字段
2123
- // v / n / u / l 与下面 achieveCell 模板里的 {{ item.x }} 一一对应。
2124
- achieve: { $source: "shopAchievements" },
2495
+ // $source 填的是宿主注册过的数据源名(不是接口地址)。
2496
+ // userStatistics 返回一个扁平对象,字段名就是后端的 snake_case,
2497
+ // 下面四格各自直接插值 {{ stat.xxx }}(见文件头注释:扁平对象没法 bind 遍历)。
2498
+ stat: { $source: "userStatistics" },
2125
2499
  lose: [
2126
2500
  {
2127
2501
  b: "118 \u4E2A\u5546\u54C1\u7684\u5168\u90E8\u4F18\u5316\u8BB0\u5F55",
@@ -2212,10 +2586,25 @@ var lastDay = {
2212
2586
  }
2213
2587
  },
2214
2588
  {
2215
- type: "repeat",
2216
- bind: "achieve",
2589
+ // 四格并列写死(扁平对象没法 bind 遍历),flex + wrap 排成 2×2
2590
+ type: "flex",
2217
2591
  style: { gap: 9, wrap: true, marginTop: 14 },
2218
- template: achieveCell2
2592
+ children: [
2593
+ achieveCell2("\u5DF2\u4E0A\u67B6", "move_success_count", "\u4E2A", "\u7D2F\u8BA1\u642C\u5BB6\u6210\u529F"),
2594
+ achieveCell2(
2595
+ "\u8FD0\u884C",
2596
+ "operate_task_count",
2597
+ "\u9879",
2598
+ "\u7ECF\u8425\u4EFB\u52A1\uFF08\u5546\u54C1\u4F18\u5316/\u6D41\u91CF\u589E\u957F\uFF09"
2599
+ ),
2600
+ achieveCell2(
2601
+ "\u5DF2\u8865\u9F50",
2602
+ "white_image_fill_count",
2603
+ "\u5F20",
2604
+ "\u767D\u5E95\u56FE \xB7 \u5408\u89C4\u53EF\u62A5\u6D3B\u52A8"
2605
+ ),
2606
+ achieveCell2("\u5B8C\u6210", "ai_optimize_count", "\u6B21", "AI \u81EA\u52A8\u4F18\u5316")
2607
+ ]
2219
2608
  },
2220
2609
  // ===== 分格倒计时 + 厘秒逐帧动画 =====
2221
2610
  {
@@ -3338,60 +3727,1087 @@ var drawerBottomBanner = createDrawerBanner({
3338
3727
  url: "https://maibaole.example.com/support"
3339
3728
  });
3340
3729
 
3341
- // src/docs/examples/index.ts
3342
- var HOTSPOT_BG = "rgba(255,68,51,0.16)";
3343
- var imageHotspot = {
3344
- version: 1,
3345
- type: "popup",
3346
- meta: { name: "\u6574\u56FE\u70ED\u533A\u5F39\u7A97" },
3347
- stage: {
3348
- // 窄屏时跟着父级收,最宽不超过 420
3349
- width: "calc(100% - 48px)",
3350
- height: 520,
3351
- mask: true,
3352
- maskClosable: true,
3353
- // 关闭按钮放到弹窗正下方外侧:offset 的 y 写负值即可,不会被圆角裁掉
3354
- closeButton: {
3355
- show: true,
3356
- position: "bottom-center",
3357
- offset: [0, -46],
3358
- size: 34,
3359
- // 不写 icon / image,用内置的矢量 × 图标(跟着 style.color 走)
3360
- style: {
3361
- background: "rgba(0,0,0,0.4)",
3362
- color: "#ffffff",
3363
- fontSize: 18,
3364
- borderWidth: 1,
3365
- borderStyle: "solid",
3366
- borderColor: "rgba(255,255,255,0.55)"
3367
- }
3368
- },
3369
- style: { radius: 12, maxWidth: 420 },
3370
- // 曝光埋点:数据就绪、弹窗真正展示时触发一次
3371
- onShow: { type: "track", event: "popup_show", params: { popup: "image_hotspot" } },
3372
- // 关闭埋点:点 X、点遮罩、点「不再提醒」都会触发,用 closeReason 区分
3373
- onClose: {
3374
- type: "track",
3375
- event: "popup_close",
3376
- params: { popup: "image_hotspot", reason: "{{ closeReason }}" }
3377
- }
3378
- },
3379
- nodes: [
3380
- {
3381
- // 背景图用百分比铺满舞台,舞台宽度变了也不用改配置
3382
- id: "bg",
3383
- type: "image",
3384
- rect: [0, 0, "100%", "100%"],
3385
- src: "https://picsum.photos/id/1015/420/520"
3730
+ // src/docs/examples/gift-give-up.ts
3731
+ var GIFT_MASK_STYLE = {
3732
+ background: "rgba(0,0,0,0.65)",
3733
+ backdropFilter: "blur(4px)"
3734
+ };
3735
+ function createGiveUpView(options) {
3736
+ return {
3737
+ type: "popup",
3738
+ stage: {
3739
+ width: 360,
3740
+ height: "auto",
3741
+ layout: "flow",
3742
+ mask: true,
3743
+ // 点遮罩 = 关掉栈顶这一层 = 退回主弹窗,正是原页面 hideConfirm 的行为:
3744
+ // 挽留层的 close 不会关掉整份物料,也不产生上报。
3745
+ // 【注意】这一层**不配 maskAction**:它的点击本来就该是「退回主弹窗」,
3746
+ // 配了动作反而会把这个退栈行为顶掉
3747
+ maskClosable: true,
3748
+ // 与主弹窗同一份,弹出这一层时背景不能有落差,见 GIFT_MASK_STYLE
3749
+ maskStyle: GIFT_MASK_STYLE,
3750
+ style: { radius: 16, background: "#ffffff" },
3751
+ onShow: { type: "track", event: `${options.giveUpEvent}_show` }
3386
3752
  },
3387
- // 热区想放几个放几个,位置各自由 rect 决定,互不影响。
3388
- // 热区 = 一个透明的 box + action,调试时把 background 的透明度调高就能看见框。
3389
- {
3390
- id: "hotspot-rule",
3391
- type: "box",
3392
- // 右上角「活动规则」
3393
- rect: ["62%", 24, "30%", 30],
3394
- style: { radius: 15, background: HOTSPOT_BG, cursor: "pointer" },
3753
+ nodes: [
3754
+ {
3755
+ type: "flex",
3756
+ style: { direction: "column", align: "center", padding: "28px 24px" },
3757
+ children: [
3758
+ { type: "text", content: "\u{1F622}", style: { fontSize: 48, marginBottom: 12 } },
3759
+ {
3760
+ type: "text",
3761
+ content: "\u771F\u7684\u8981\u653E\u5F03\u5417\uFF1F",
3762
+ style: { fontSize: 18, fontWeight: "700", color: "#1d2129" }
3763
+ },
3764
+ {
3765
+ type: "text",
3766
+ content: "\u60A8\u5C06\u635F\u5931\u793C\u5305\u6536\u76CA",
3767
+ style: {
3768
+ margin: "12px 0 20px",
3769
+ fontSize: 13,
3770
+ lineHeight: 1.6,
3771
+ color: "#4e5969",
3772
+ textAlign: "center"
3773
+ }
3774
+ },
3775
+ {
3776
+ type: "flex",
3777
+ style: { width: "100%", gap: 12 },
3778
+ children: [
3779
+ {
3780
+ type: "button",
3781
+ text: "\u5FCD\u75DB\u653E\u5F03",
3782
+ style: {
3783
+ flex: "1",
3784
+ padding: 12,
3785
+ radius: 8,
3786
+ background: "#f7f8fa",
3787
+ color: "#86909c",
3788
+ fontSize: 14,
3789
+ fontWeight: "600"
3790
+ },
3791
+ hoverStyle: { background: "#f0f1f5" },
3792
+ // closeAll:挽留层和主弹窗一起关掉,只 close 的话会退回主弹窗
3793
+ action: {
3794
+ type: "sequence",
3795
+ actions: [
3796
+ { type: "track", event: options.giveUpEvent },
3797
+ { type: "closeAll", reason: "user-give-up" }
3798
+ ]
3799
+ }
3800
+ },
3801
+ {
3802
+ type: "button",
3803
+ text: "\u9886\u53D6\u793C\u5305",
3804
+ style: {
3805
+ flex: "1",
3806
+ padding: 12,
3807
+ radius: 8,
3808
+ background: "linear-gradient(90deg,#ff7a00 0%,#f53f3f 100%)",
3809
+ color: "#ffffff",
3810
+ fontSize: 14,
3811
+ fontWeight: "600"
3812
+ },
3813
+ hoverStyle: { transform: "translateY(-1px)" },
3814
+ action: {
3815
+ type: "sequence",
3816
+ actions: [
3817
+ {
3818
+ type: "track",
3819
+ event: options.claimEvent,
3820
+ params: { from: "confirm" }
3821
+ },
3822
+ { type: "navigate", url: options.url }
3823
+ ]
3824
+ }
3825
+ }
3826
+ ]
3827
+ }
3828
+ ]
3829
+ }
3830
+ ]
3831
+ };
3832
+ }
3833
+
3834
+ // src/docs/examples/gift-v6-head.ts
3835
+ var HEAD_HEIGHT = 300;
3836
+ function createHead() {
3837
+ return {
3838
+ type: "box",
3839
+ style: {
3840
+ width: "100%",
3841
+ height: HEAD_HEIGHT,
3842
+ background: "linear-gradient(180deg,#ff4d4d 0%,#d93025 100%)",
3843
+ overflow: "hidden"
3844
+ },
3845
+ children: [
3846
+ {
3847
+ // 左上角的白色光晕,原页面是 .v6-modal-top::before
3848
+ type: "box",
3849
+ rect: [-40, -40, "calc(100% + 80px)", "calc(100% + 80px)"],
3850
+ style: {
3851
+ background: "radial-gradient(circle at 30% 30%, rgba(255,255,255,0.2) 0%, transparent 50%)",
3852
+ // 装饰层必须让点击穿透,否则整块红头都点不动
3853
+ pointerEvents: "none"
3854
+ }
3855
+ },
3856
+ {
3857
+ type: "flex",
3858
+ rect: [0, 0, "100%", "auto"],
3859
+ style: { direction: "column", align: "center", padding: "20px 32px 0" },
3860
+ children: [
3861
+ {
3862
+ type: "text",
3863
+ content: "\u{1F389} \u642C\u5BB6\u6210\u529F \xB7 \u7CFB\u7EDF\u4E13\u5C5E\u5956\u52B1",
3864
+ style: {
3865
+ alignSelf: "center",
3866
+ padding: "4px 16px",
3867
+ marginBottom: 12,
3868
+ fontSize: 12,
3869
+ color: "#ffffff",
3870
+ background: "rgba(255,255,255,0.25)",
3871
+ radius: 12
3872
+ }
3873
+ },
3874
+ {
3875
+ type: "text",
3876
+ content: "\u606D\u559C\uFF01\u60A8\u83B7\u5F97\u4E00\u4EFD\u4E13\u5C5E\u793C\u5305",
3877
+ style: {
3878
+ fontSize: 24,
3879
+ fontWeight: "900",
3880
+ lineHeight: 1.3,
3881
+ color: "#ffffff",
3882
+ textAlign: "center"
3883
+ }
3884
+ },
3885
+ {
3886
+ type: "text",
3887
+ content: "\u4EC5\u9650\u521A\u5B8C\u6210\u642C\u5BB6\u7684\u7528\u6237",
3888
+ style: {
3889
+ marginTop: 6,
3890
+ fontSize: 13,
3891
+ color: "#ffffff",
3892
+ opacity: "0.9"
3893
+ }
3894
+ },
3895
+ {
3896
+ type: "flex",
3897
+ style: {
3898
+ alignSelf: "center",
3899
+ justify: "center",
3900
+ align: "center",
3901
+ width: 110,
3902
+ height: 110,
3903
+ marginTop: 16,
3904
+ radius: "50%",
3905
+ background: "linear-gradient(135deg,#fff5e6 0%,#ffd591 100%)",
3906
+ shadow: "0 8px 24px rgba(0,0,0,0.2), inset 0 4px 8px rgba(255,255,255,0.5)"
3907
+ },
3908
+ animate: {
3909
+ name: "floatY",
3910
+ duration: 3e3,
3911
+ easing: "ease-in-out",
3912
+ iteration: "infinite"
3913
+ },
3914
+ children: [
3915
+ {
3916
+ type: "text",
3917
+ content: "4\u6298",
3918
+ style: {
3919
+ fontSize: 40,
3920
+ fontWeight: "900",
3921
+ lineHeight: 1,
3922
+ color: "#d93025"
3923
+ }
3924
+ }
3925
+ ]
3926
+ }
3927
+ ]
3928
+ }
3929
+ ]
3930
+ };
3931
+ }
3932
+
3933
+ // src/docs/examples/gift-v6.ts
3934
+ var PURCHASE_URL = "https://fuwu.jinritemai.com/detail?from=isv.promotion&service_id=21361&promotionIdCode=CgYIASAHKAESXgpc6AasSWVCtjAmMcE%2B00V9l5ZRXgoh0wWk5uc6B7Z8JN4ILp0xJ0CmyiOhAVTvTbl5yoLE1muPBxT7P5lZMT1SYVI8RleaK62xu%2FEwuJHpwa0hmOuDn0wllsRvaLcaAA%3D%3D";
3935
+ var NUM_STYLE = {
3936
+ minWidth: 26,
3937
+ padding: "2px 6px",
3938
+ fontFamily: "'Courier New', monospace",
3939
+ fontSize: 13,
3940
+ fontWeight: "700",
3941
+ color: "#ffffff",
3942
+ textAlign: "center",
3943
+ background: "#1d2129",
3944
+ radius: 4,
3945
+ fontVariantNumeric: "tabular-nums"
3946
+ };
3947
+ function giftRow(highlight, text) {
3948
+ return {
3949
+ type: "flex",
3950
+ style: { align: "center", gap: 8, padding: "4px 0" },
3951
+ children: [
3952
+ { type: "text", content: "\u{1F381}", style: { fontSize: 14 } },
3953
+ {
3954
+ type: "flex",
3955
+ // gap 跟外层一致取 8:原页面 li 本身就是 `display:flex; gap:8`,
3956
+ // 🎁、`<b>4折</b>`、说明文案是同一层的三个 flex 项,三段间距相等。
3957
+ // 这里拆成两层是为了让说明文案能独立换行,间距必须还原成 8,
3958
+ // 写 4 会明显比行首那一格紧、看着像没对齐
3959
+ style: { flex: "1", align: "baseline", gap: 8 },
3960
+ children: [
3961
+ {
3962
+ type: "text",
3963
+ content: highlight,
3964
+ style: { fontSize: 11, fontWeight: "700", color: "#d93025" }
3965
+ },
3966
+ { type: "text", content: text, style: { fontSize: 11, color: "#4e5969" } }
3967
+ ]
3968
+ }
3969
+ ]
3970
+ };
3971
+ }
3972
+ var giftV6 = {
3973
+ version: 1,
3974
+ meta: { name: "\u590D\u523B\u7EBF\u4E0A\u5F39\u7A97 \xB7 4 \u6298\u4E13\u5C5E\u793C\u5305\uFF08\u52A8\u753B + \u4E8C\u6B21\u633D\u7559\uFF09" },
3975
+ entry: "main",
3976
+ // 关键帧库全配置共用,两个视图都能引用
3977
+ keyframes: {
3978
+ /** 遮罩淡入 */
3979
+ fadeIn: { from: { opacity: "0" }, to: { opacity: "1" } },
3980
+ /** 弹窗回弹放大,配 cubic-bezier 的超调曲线才有「弹一下」的手感 */
3981
+ zoomIn: {
3982
+ from: { opacity: "0", transform: "scale(0.7)" },
3983
+ to: { opacity: "1", transform: "scale(1)" }
3984
+ },
3985
+ /** 红包上下浮动 */
3986
+ floatY: {
3987
+ "0%": { transform: "translateY(0)" },
3988
+ "50%": { transform: "translateY(-8px)" },
3989
+ "100%": { transform: "translateY(0)" }
3990
+ },
3991
+ /** CTA 呼吸:只放大 2%,再多就晃眼了 */
3992
+ pulseBtn: {
3993
+ "0%": { transform: "scale(1)" },
3994
+ "50%": { transform: "scale(1.02)" },
3995
+ "100%": { transform: "scale(1)" }
3996
+ }
3997
+ },
3998
+ views: {
3999
+ main: {
4000
+ type: "popup",
4001
+ stage: {
4002
+ width: 450,
4003
+ height: "auto",
4004
+ layout: "flow",
4005
+ mask: true,
4006
+ maskClosable: true,
4007
+ // 原页面的遮罩是 rgba(0,0,0,0.65) + 4px 毛玻璃,比内置默认(0.55 纯色)更重
4008
+ // 与挽留层共用同一份:只有栈顶那层遮罩会画,两层不一致就会在弹出时看到落差
4009
+ maskStyle: GIFT_MASK_STYLE,
4010
+ // 点遮罩不直接关,先弹二次挽留(原页面 @click.self="tryClose()")
4011
+ maskAction: { type: "open", view: "confirm", mode: "stack" },
4012
+ // 内置关闭按钮(矢量 ✕)+ action:配了 action 就只执行它、不再自动关层
4013
+ closeButton: {
4014
+ position: "top-right",
4015
+ offset: [12, 12],
4016
+ size: 32,
4017
+ style: {
4018
+ background: "rgba(0,0,0,0.08)",
4019
+ backdropFilter: "blur(4px)",
4020
+ color: "#ffffff",
4021
+ transition: "background 0.2s"
4022
+ },
4023
+ hoverStyle: { background: "rgba(0,0,0,0.2)" },
4024
+ action: { type: "open", view: "confirm", mode: "stack" }
4025
+ },
4026
+ style: {
4027
+ radius: 20,
4028
+ background: "#ffffff",
4029
+ shadow: "0 20px 60px rgba(0,0,0,0.3)",
4030
+ maxWidth: "60vw"
4031
+ },
4032
+ animate: {
4033
+ name: "zoomIn",
4034
+ duration: 500,
4035
+ easing: "cubic-bezier(0.34, 1.56, 0.64, 1)"
4036
+ },
4037
+ maskAnimate: { name: "fadeIn", duration: 400 },
4038
+ onShow: { type: "track", event: "move_success_v6_show" },
4039
+ onClose: {
4040
+ type: "track",
4041
+ event: "move_success_v6_close",
4042
+ params: { reason: "{{ closeReason }}" }
4043
+ }
4044
+ },
4045
+ nodes: [
4046
+ createHead(),
4047
+ // ── 白色主体:往上盖住红头下沿 ──
4048
+ {
4049
+ type: "flex",
4050
+ style: {
4051
+ direction: "column",
4052
+ marginTop: -40,
4053
+ // 必须有层级,否则这 40px 根本盖不住:红头是 box 节点,解释器给所有 box
4054
+ // 加了 position:relative(它要当绝对定位子节点的包含块),定位元素恒画在
4055
+ // 静态元素之上。声明 zIndex 会让解释器顺带补一个 relative,见 resolveNodeStyle
4056
+ zIndex: 1,
4057
+ padding: "30px 32px 30px",
4058
+ background: "#ffffff",
4059
+ radius: "20px 20px 0 0"
4060
+ },
4061
+ children: [
4062
+ {
4063
+ type: "flex",
4064
+ style: {
4065
+ direction: "column",
4066
+ padding: 10,
4067
+ marginBottom: 10,
4068
+ background: "#fffbeb",
4069
+ borderWidth: 1,
4070
+ borderStyle: "dashed",
4071
+ borderColor: "#fbbf24",
4072
+ radius: 12
4073
+ },
4074
+ children: [
4075
+ {
4076
+ type: "text",
4077
+ content: "\u{1F4E6} \u793C\u5305\u5185\u5BB9",
4078
+ style: {
4079
+ marginBottom: 8,
4080
+ fontSize: 12,
4081
+ fontWeight: "600",
4082
+ color: "#92400e",
4083
+ textAlign: "center"
4084
+ }
4085
+ },
4086
+ giftRow("4\u6298", "\u300C\u4E00\u952E\u4E0B\u5355\u300D\u771F\u6298\u6263\u6765\u88AD\uFF0C\u4F4E\u81F34\u6298"),
4087
+ giftRow("50 \u5355", "0 \u670D\u52A1\u8D39 \xB7 \u5355\u5355\u8FD4\u4F63 0.5%"),
4088
+ giftRow("200%", "\u81EA\u52A8\u4E0B\u5355\u3001\u53D1\u8D27\u3001\u552E\u540E\uFF0C\u63D0\u9AD8\u4EBA\u6548")
4089
+ ]
4090
+ },
4091
+ {
4092
+ // duration 而不是 to:这份物料每次弹出都重新倒 5 分钟,没有绝对结束时间
4093
+ type: "countdown",
4094
+ duration: 3e5,
4095
+ precision: "cs",
4096
+ as: "cd",
4097
+ style: { justify: "center", align: "center", gap: 6, marginBottom: 16 },
4098
+ onEnd: { type: "closeAll", reason: "countdown-end" },
4099
+ children: [
4100
+ {
4101
+ type: "text",
4102
+ content: "\u23F0 \u793C\u5305\u5931\u6548\u5012\u8BA1\u65F6",
4103
+ style: { fontSize: 12, color: "#4e5969" }
4104
+ },
4105
+ { type: "text", content: "{{ cd.m }}", style: NUM_STYLE },
4106
+ { type: "text", content: ":", style: { fontSize: 13, color: "#4e5969" } },
4107
+ { type: "text", content: "{{ cd.s }}", style: NUM_STYLE },
4108
+ { type: "text", content: ":", style: { fontSize: 13, color: "#4e5969" } },
4109
+ { type: "text", content: "{{ cd.cs }}", style: NUM_STYLE }
4110
+ ]
4111
+ },
4112
+ {
4113
+ type: "button",
4114
+ text: "\u{1F381} \u7ACB\u5373\u9886\u53D6\u5E76\u542F\u7528",
4115
+ style: {
4116
+ width: "100%",
4117
+ padding: 10,
4118
+ fontSize: 16,
4119
+ fontWeight: "700",
4120
+ color: "#ffffff",
4121
+ background: "linear-gradient(90deg,#ff7a00 0%,#f53f3f 100%)",
4122
+ radius: 28,
4123
+ shadow: "0 6px 20px rgba(245,63,63,0.4)"
4124
+ },
4125
+ animate: {
4126
+ name: "pulseBtn",
4127
+ duration: 1500,
4128
+ easing: "ease-in-out",
4129
+ iteration: "infinite"
4130
+ },
4131
+ action: {
4132
+ type: "sequence",
4133
+ actions: [
4134
+ {
4135
+ type: "track",
4136
+ event: "move_success_v6_claim",
4137
+ params: { from: "main" }
4138
+ },
4139
+ { type: "navigate", url: PURCHASE_URL }
4140
+ ]
4141
+ }
4142
+ }
4143
+ ]
4144
+ }
4145
+ ]
4146
+ },
4147
+ confirm: createGiveUpView({
4148
+ url: PURCHASE_URL,
4149
+ claimEvent: "move_success_v6_claim",
4150
+ giveUpEvent: "move_success_v6_give_up"
4151
+ })
4152
+ }
4153
+ };
4154
+ var gift_v6_default = giftV6;
4155
+
4156
+ // src/docs/examples/gift-red-packet-head.ts
4157
+ var HEAD_HEIGHT2 = 158;
4158
+ function sparkle(left, size, delay) {
4159
+ return {
4160
+ type: "box",
4161
+ // bottom: 14px 换算成 top —— rect 只有 [x, y, w, h],没有 bottom
4162
+ rect: [left, HEAD_HEIGHT2 - 14 - size, size, size],
4163
+ style: {
4164
+ radius: "50%",
4165
+ background: "#ffe3a1",
4166
+ shadow: "0 0 9px rgba(255,214,130,0.95)",
4167
+ // 初始透明:关键帧从 opacity 0 起步,没有这一行会在动画开播前闪一下
4168
+ opacity: "0",
4169
+ pointerEvents: "none"
4170
+ },
4171
+ animate: {
4172
+ name: "floatUp",
4173
+ duration: 4400,
4174
+ delay,
4175
+ easing: "linear",
4176
+ iteration: "infinite"
4177
+ }
4178
+ };
4179
+ }
4180
+ function createHead2() {
4181
+ return {
4182
+ type: "box",
4183
+ style: {
4184
+ width: "100%",
4185
+ height: HEAD_HEIGHT2,
4186
+ background: "linear-gradient(168deg,#ff6a52 0%,#f5433a 54%,#dd2b22 100%)",
4187
+ overflow: "hidden"
4188
+ },
4189
+ children: [
4190
+ {
4191
+ // 顶部的暖光晕,原页面是 .rp-hd::before
4192
+ type: "box",
4193
+ rect: ["50%", -70, 300, 180],
4194
+ style: {
4195
+ background: "radial-gradient(ellipse, rgba(255,220,150,0.4), transparent 66%)",
4196
+ // 关键帧里的 transform 同样带着 translateX(-50%),否则播动画时会向右跳半个身位
4197
+ transform: "translateX(-50%)",
4198
+ pointerEvents: "none"
4199
+ },
4200
+ animate: {
4201
+ name: "glow",
4202
+ duration: 3600,
4203
+ easing: "ease-in-out",
4204
+ iteration: "infinite"
4205
+ }
4206
+ },
4207
+ {
4208
+ type: "flex",
4209
+ rect: [0, 0, "100%", "auto"],
4210
+ style: { direction: "column", align: "center", padding: "26px 26px 0" },
4211
+ children: [
4212
+ {
4213
+ type: "flex",
4214
+ style: {
4215
+ alignSelf: "center",
4216
+ align: "center",
4217
+ gap: 6,
4218
+ padding: "5px 14px",
4219
+ fontSize: 12,
4220
+ color: "#ffe9e2",
4221
+ letterSpacing: "0.04em",
4222
+ background: "rgba(255,255,255,0.2)",
4223
+ radius: 14
4224
+ },
4225
+ animate: {
4226
+ name: "bob",
4227
+ duration: 2800,
4228
+ easing: "ease-in-out",
4229
+ iteration: "infinite"
4230
+ },
4231
+ children: [
4232
+ { type: "text", content: "\u{1F381}", style: { fontSize: 14 } },
4233
+ {
4234
+ type: "text",
4235
+ content: "\u642C\u5BB6\u6210\u529F \xB7 \u4E13\u5C5E\u56DE\u9988",
4236
+ style: { fontSize: 12, color: "#ffe9e2" }
4237
+ }
4238
+ ]
4239
+ },
4240
+ {
4241
+ // 一行混排两种颜色:拆成三个 text,用 baseline 对齐,DSL 没有富文本
4242
+ type: "flex",
4243
+ style: { align: "baseline", justify: "center", marginTop: 14 },
4244
+ children: [
4245
+ {
4246
+ type: "text",
4247
+ content: "\u606D\u559C\u83B7\u5F97 ",
4248
+ style: {
4249
+ fontSize: 25,
4250
+ fontWeight: "800",
4251
+ color: "#ffffff",
4252
+ letterSpacing: "0.02em",
4253
+ textShadow: "0 2px 8px rgba(150,20,10,0.22)"
4254
+ }
4255
+ },
4256
+ {
4257
+ type: "text",
4258
+ content: "1 \u5206\u94B1",
4259
+ style: {
4260
+ fontSize: 25,
4261
+ fontWeight: "800",
4262
+ color: "#ffdc7d",
4263
+ letterSpacing: "0.02em",
4264
+ textShadow: "0 2px 8px rgba(150,20,10,0.22)"
4265
+ }
4266
+ },
4267
+ {
4268
+ type: "text",
4269
+ content: " \u534A\u5E74\u5361",
4270
+ style: {
4271
+ fontSize: 25,
4272
+ fontWeight: "800",
4273
+ color: "#ffffff",
4274
+ letterSpacing: "0.02em",
4275
+ textShadow: "0 2px 8px rgba(150,20,10,0.22)"
4276
+ }
4277
+ }
4278
+ ]
4279
+ }
4280
+ ]
4281
+ },
4282
+ sparkle("13%", 6, 0),
4283
+ sparkle("33%", 4, 1100),
4284
+ sparkle("64%", 6, 2200),
4285
+ sparkle("85%", 5, 3300)
4286
+ ]
4287
+ };
4288
+ }
4289
+ function createPlate() {
4290
+ return {
4291
+ type: "box",
4292
+ style: {
4293
+ // 负的上外边距把牌子提上去压住红头,左右各留 26 与主体对齐
4294
+ margin: "-38px 26px 0",
4295
+ height: 70,
4296
+ background: "linear-gradient(140deg,#fffdf6,#fff2d9)",
4297
+ borderWidth: 1,
4298
+ borderStyle: "solid",
4299
+ borderColor: "#ffe1a8",
4300
+ radius: 13,
4301
+ shadow: "0 10px 26px rgba(140,30,15,0.24)",
4302
+ // 扫光条比牌子宽,不裁会飘到牌子外面
4303
+ overflow: "hidden"
4304
+ },
4305
+ animate: {
4306
+ name: "plateIn",
4307
+ duration: 660,
4308
+ delay: 120,
4309
+ easing: "cubic-bezier(0.18, 1.05, 0.35, 1)"
4310
+ },
4311
+ children: [
4312
+ {
4313
+ type: "box",
4314
+ rect: [-110, 0, 72, "100%"],
4315
+ style: {
4316
+ background: "linear-gradient(100deg, transparent, rgba(255,255,255,0.85), transparent)",
4317
+ pointerEvents: "none"
4318
+ },
4319
+ // 原页面动的是 left,DSL 只放开 transform:改成横向位移,效果等价且不触发重排
4320
+ animate: {
4321
+ name: "sweep",
4322
+ duration: 4e3,
4323
+ delay: 1200,
4324
+ easing: "ease-in-out",
4325
+ iteration: "infinite"
4326
+ }
4327
+ },
4328
+ {
4329
+ type: "flex",
4330
+ rect: [0, 0, "100%", "100%"],
4331
+ style: { align: "center", gap: 14, padding: "0 18px" },
4332
+ children: [
4333
+ {
4334
+ type: "flex",
4335
+ style: {
4336
+ align: "baseline",
4337
+ flexShrink: "0",
4338
+ color: "#d3281f",
4339
+ transformOrigin: "left center"
4340
+ },
4341
+ animate: {
4342
+ name: "pop",
4343
+ duration: 3400,
4344
+ delay: 1e3,
4345
+ easing: "ease-in-out",
4346
+ iteration: "infinite"
4347
+ },
4348
+ children: [
4349
+ {
4350
+ type: "text",
4351
+ content: "\xA5",
4352
+ style: {
4353
+ marginRight: 1,
4354
+ fontSize: 18,
4355
+ fontWeight: "800",
4356
+ color: "#d3281f"
4357
+ }
4358
+ },
4359
+ {
4360
+ type: "text",
4361
+ content: "0.01",
4362
+ style: {
4363
+ fontSize: 42,
4364
+ fontWeight: "900",
4365
+ lineHeight: 1,
4366
+ letterSpacing: "-0.03em",
4367
+ color: "#d3281f"
4368
+ }
4369
+ }
4370
+ ]
4371
+ },
4372
+ {
4373
+ type: "box",
4374
+ style: { width: 1, height: 34, background: "#f2dcae", flexShrink: "0" }
4375
+ },
4376
+ {
4377
+ type: "flex",
4378
+ style: { direction: "column", flex: "1" },
4379
+ children: [
4380
+ {
4381
+ type: "text",
4382
+ content: "\u6253\u5355\u53D1\u8D27 \xB7 \u5168\u529F\u80FD\u534A\u5E74\u5361",
4383
+ style: {
4384
+ fontSize: 14.5,
4385
+ fontWeight: "800",
4386
+ color: "#8f3517",
4387
+ letterSpacing: "0.02em"
4388
+ }
4389
+ },
4390
+ {
4391
+ type: "text",
4392
+ content: "\u539F\u4EF7 \xA590 / \u534A\u5E74",
4393
+ style: {
4394
+ marginTop: 5,
4395
+ fontSize: 11.5,
4396
+ lineHeight: 1.5,
4397
+ color: "#b08b62",
4398
+ textDecoration: "line-through"
4399
+ }
4400
+ }
4401
+ ]
4402
+ }
4403
+ ]
4404
+ }
4405
+ ]
4406
+ };
4407
+ }
4408
+
4409
+ // src/docs/examples/gift-red-packet-body.ts
4410
+ var FEATURES = [
4411
+ { icon: "\u{1F5A8}\uFE0F", title: "\u6279\u91CF\u6253\u5355", desc: "\u6279\u91CF\u9762\u5355\u4E00\u6B21\u51FA", delay: 340 },
4412
+ { icon: "\u{1F69A}", title: "\u6279\u91CF\u53D1\u8D27", desc: "\u5168\u5E97\u8BA2\u5355\u79D2\u53D1\u5B8C", delay: 420 },
4413
+ { icon: "\u{1F3EA}", title: "\u591A\u5E97\u7BA1\u7406", desc: "\u7BA1\u7406\u591A\u4E2A\u5E97\u94FA\u8BA2\u5355", delay: 500 },
4414
+ { icon: "\u{1F9E9}", title: "\u8BA2\u5355\u5408\u5E76", desc: "\u540C\u5740\u5408\u5355\u7701\u8FD0\u8D39", delay: 580 },
4415
+ {
4416
+ icon: "\u{1F4CD}",
4417
+ title: "\u7269\u6D41\u8F68\u8FF9",
4418
+ desc: "\u9762\u5355\u7269\u6D41\u8F68\u8FF9\uFF0C\u5BA2\u8BC9\u63D0\u524D\u62E6\u622A",
4419
+ delay: 660,
4420
+ full: true
4421
+ }
4422
+ ];
4423
+ function featureCell(feature) {
4424
+ return {
4425
+ type: "flex",
4426
+ style: {
4427
+ // 两列网格用 flex wrap + 百分比宽复刻:gap 8 时每列是 calc(50% - 4px),
4428
+ // 末项写 100% 就等于原来的 grid-column: 1 / -1
4429
+ width: feature.full ? "100%" : "calc(50% - 4px)",
4430
+ align: "center",
4431
+ gap: 9,
4432
+ padding: "9px 11px",
4433
+ background: "#fff8f1",
4434
+ borderWidth: 1,
4435
+ borderStyle: "solid",
4436
+ borderColor: "#ffe6d5",
4437
+ radius: 9
4438
+ },
4439
+ animate: { name: "cellIn", duration: 460, delay: feature.delay, easing: "ease-out" },
4440
+ children: [
4441
+ {
4442
+ type: "flex",
4443
+ style: {
4444
+ justify: "center",
4445
+ align: "center",
4446
+ width: 26,
4447
+ height: 26,
4448
+ // 图标位不许被压扁,否则长副标题会把它挤成一条
4449
+ flexShrink: "0",
4450
+ background: "#ffe9d8",
4451
+ radius: 7
4452
+ },
4453
+ children: [{ type: "text", content: feature.icon, style: { fontSize: 15 } }]
4454
+ },
4455
+ {
4456
+ type: "flex",
4457
+ style: { direction: "column", minWidth: 0 },
4458
+ children: [
4459
+ {
4460
+ type: "text",
4461
+ content: feature.title,
4462
+ style: {
4463
+ fontSize: 13,
4464
+ fontWeight: "700",
4465
+ lineHeight: 1.35,
4466
+ color: "#8f3517"
4467
+ }
4468
+ },
4469
+ {
4470
+ type: "text",
4471
+ content: feature.desc,
4472
+ style: {
4473
+ fontSize: 11.5,
4474
+ lineHeight: 1.35,
4475
+ color: "#b07a5c",
4476
+ whiteSpace: "nowrap"
4477
+ }
4478
+ }
4479
+ ]
4480
+ }
4481
+ ]
4482
+ };
4483
+ }
4484
+ function createFeatureGrid() {
4485
+ return {
4486
+ type: "flex",
4487
+ style: { wrap: true, gap: 8 },
4488
+ children: FEATURES.map(featureCell)
4489
+ };
4490
+ }
4491
+ function createCta(action) {
4492
+ return {
4493
+ type: "box",
4494
+ // 【必须写死高度的原因】这是绝对定位容器(角标要骑在按钮上沿外面,只能脱流),
4495
+ // 子节点撑不起它,不写死就塌成 0。52 即原页面 .rp-cta 的按钮高度
4496
+ style: { width: "100%", height: 52, marginTop: 16 },
4497
+ children: [
4498
+ {
4499
+ type: "box",
4500
+ // 高度跟满父级即可,不用再写一遍 52
4501
+ rect: [0, 0, "100%", "100%"],
4502
+ style: {
4503
+ background: "linear-gradient(92deg,#ff8f3d,#f5433a)",
4504
+ radius: 26,
4505
+ overflow: "hidden",
4506
+ cursor: "pointer",
4507
+ shadow: "0 8px 20px rgba(245,67,58,0.34)",
4508
+ transition: "transform 0.18s, box-shadow 0.18s"
4509
+ },
4510
+ animate: {
4511
+ name: "breath",
4512
+ duration: 2400,
4513
+ easing: "ease-in-out",
4514
+ iteration: "infinite"
4515
+ },
4516
+ // 原页面 hover 时上浮并暂停呼吸动画,两条都能配
4517
+ hoverStyle: { transform: "translateY(-2px)", animationPlayState: "paused" },
4518
+ action,
4519
+ children: [
4520
+ {
4521
+ type: "box",
4522
+ rect: [-90, 0, 62, "100%"],
4523
+ style: {
4524
+ background: "linear-gradient(100deg, transparent, rgba(255,255,255,0.5), transparent)",
4525
+ pointerEvents: "none"
4526
+ },
4527
+ animate: {
4528
+ name: "sweep",
4529
+ duration: 2900,
4530
+ delay: 800,
4531
+ easing: "ease-in-out",
4532
+ iteration: "infinite"
4533
+ }
4534
+ },
4535
+ {
4536
+ type: "flex",
4537
+ rect: [0, 0, "100%", "100%"],
4538
+ style: { justify: "center", align: "center", gap: 8 },
4539
+ children: [
4540
+ { type: "text", content: "\u{1F381}", style: { fontSize: 18 } },
4541
+ {
4542
+ type: "text",
4543
+ content: "1 \u5206\u94B1\u8BA2\u9605\u534A\u5E74",
4544
+ style: {
4545
+ fontSize: 17,
4546
+ fontWeight: "700",
4547
+ color: "#ffffff",
4548
+ letterSpacing: "0.03em"
4549
+ }
4550
+ }
4551
+ ]
4552
+ }
4553
+ ]
4554
+ },
4555
+ {
4556
+ // 角标骑在按钮上沿外面:y 写负值即可,父级没有 overflow: hidden 就不会被裁
4557
+ type: "flex",
4558
+ rect: ["calc(100% - 112px)", -10, "auto", 22],
4559
+ style: {
4560
+ justify: "center",
4561
+ align: "center",
4562
+ gap: 4,
4563
+ padding: "0 10px",
4564
+ fontSize: 11.5,
4565
+ fontWeight: "700",
4566
+ color: "#7a3b00",
4567
+ letterSpacing: "0.03em",
4568
+ background: "linear-gradient(96deg,#ffe08a,#ffc24d)",
4569
+ borderWidth: 1,
4570
+ borderStyle: "solid",
4571
+ borderColor: "rgba(255,255,255,0.75)",
4572
+ radius: 11,
4573
+ shadow: "0 4px 10px rgba(190,120,20,0.3)",
4574
+ // 角标压在按钮上,不穿透点击的话这一块就点不动了
4575
+ pointerEvents: "none",
4576
+ zIndex: 2
4577
+ },
4578
+ animate: {
4579
+ name: "badge",
4580
+ duration: 2400,
4581
+ easing: "ease-in-out",
4582
+ iteration: "infinite"
4583
+ },
4584
+ children: [
4585
+ { type: "text", content: "\u23F0", style: { fontSize: 12 } },
4586
+ {
4587
+ type: "text",
4588
+ content: "\u9650\u65F6\u4F18\u60E0",
4589
+ style: { fontSize: 11.5, fontWeight: "700", color: "#7a3b00" }
4590
+ }
4591
+ ]
4592
+ }
4593
+ ]
4594
+ };
4595
+ }
4596
+
4597
+ // src/docs/examples/gift-red-packet.ts
4598
+ var PURCHASE_URL2 = "https://fuwu.jinritemai.com/detail?from=isv.promotion&service_id=37954&promotionIdCode=CgYIASAHKAESXgpcZiuxEgmEfp%2BCuIELbEjHDmFi85jdhDOrbaXhk7JWo7S2zDy7ZoIOuQoLYASUv9XymFznWhybdvdPTpaa4bhM0ydWadh6ViYxI7%2FhpcEo%2F7W4MlNCKrcmzIu9j3YaAA%3D%3D";
4599
+ var giftRedPacket = {
4600
+ version: 1,
4601
+ meta: { name: "\u590D\u523B\u7EBF\u4E0A\u5F39\u7A97 \xB7 1 \u5206\u94B1\u534A\u5E74\u5361\uFF08\u7EA2\u5305\u5F00\u7BB1\u7248\uFF09" },
4602
+ entry: "main",
4603
+ keyframes: {
4604
+ /** 遮罩淡入 */
4605
+ fadeIn: { from: { opacity: "0" }, to: { opacity: "1" } },
4606
+ /** 弹窗回弹放大 */
4607
+ zoomIn: {
4608
+ from: { opacity: "0", transform: "scale(0.7)" },
4609
+ to: { opacity: "1", transform: "scale(1)" }
4610
+ },
4611
+ /** 红头顶部光晕呼吸。transform 里必须带上 translateX(-50%),否则播动画时会向右跳 */
4612
+ glow: {
4613
+ "0%": { opacity: "0.7", transform: "translateX(-50%) scale(1)" },
4614
+ "50%": { opacity: "1", transform: "translateX(-50%) scale(1.14)" },
4615
+ "100%": { opacity: "0.7", transform: "translateX(-50%) scale(1)" }
4616
+ },
4617
+ /** 缎带轻浮 */
4618
+ bob: {
4619
+ "0%": { transform: "translateY(0)" },
4620
+ "50%": { transform: "translateY(-3px)" },
4621
+ "100%": { transform: "translateY(0)" }
4622
+ },
4623
+ /** 金色光点:从下往上飘 116px,两头都是透明 */
4624
+ floatUp: {
4625
+ "0%": { opacity: "0", transform: "translateY(30px) scale(0.5)" },
4626
+ "18%": { opacity: "0.95" },
4627
+ "100%": { opacity: "0", transform: "translateY(-86px) scale(1)" }
4628
+ },
4629
+ /** 价格牌托上来 */
4630
+ plateIn: {
4631
+ "0%": { opacity: "0", transform: "translateY(24px) scale(0.94)" },
4632
+ "100%": { opacity: "1", transform: "translateY(0) scale(1)" }
4633
+ },
4634
+ /**
4635
+ * 扫光:一条斜光带从左侧滑到右侧外面,停一会儿再来一趟。
4636
+ *
4637
+ * 原页面动的是 `left`,这里改成 `transform` 位移 —— 一是 DSL 只放开 transform,
4638
+ * 二是动 left 每帧都要重排,动 transform 只走合成层。
4639
+ */
4640
+ sweep: {
4641
+ "0%": { transform: "skew(-18deg) translateX(0)" },
4642
+ "42%": { transform: "skew(-18deg) translateX(600px)" },
4643
+ "100%": { transform: "skew(-18deg) translateX(600px)" }
4644
+ },
4645
+ /** 价格每隔几秒弹一下 */
4646
+ pop: {
4647
+ "0%": { transform: "scale(1)" },
4648
+ "86%": { transform: "scale(1)" },
4649
+ "92%": { transform: "scale(1.09)" },
4650
+ "100%": { transform: "scale(1)" }
4651
+ },
4652
+ /** 权益格入场,五格靠各自的 delay 交错 */
4653
+ cellIn: {
4654
+ "0%": { opacity: "0", transform: "translateY(10px)" },
4655
+ "100%": { opacity: "1", transform: "translateY(0)" }
4656
+ },
4657
+ /** 「限时优惠」角标轻浮 */
4658
+ badge: {
4659
+ "0%": { transform: "translateY(0)" },
4660
+ "50%": { transform: "translateY(-2px)" },
4661
+ "100%": { transform: "translateY(0)" }
4662
+ },
4663
+ /** CTA 呼吸:只放大阴影不放大自身,按钮尺寸恒定,不会把下面的内容顶动 */
4664
+ breath: {
4665
+ "0%": { shadow: "0 8px 20px rgba(245,67,58,0.34)" },
4666
+ "50%": { shadow: "0 12px 30px rgba(245,67,58,0.56)" },
4667
+ "100%": { shadow: "0 8px 20px rgba(245,67,58,0.34)" }
4668
+ }
4669
+ },
4670
+ views: {
4671
+ main: {
4672
+ type: "popup",
4673
+ stage: {
4674
+ width: 460,
4675
+ height: "auto",
4676
+ layout: "flow",
4677
+ mask: true,
4678
+ maskClosable: true,
4679
+ // 原页面遮罩 rgba(0,0,0,0.65) + 4px 毛玻璃;与挽留层共用同一份 ——
4680
+ // 只有栈顶那层遮罩会画,两层不一致就会在弹出挽留层时看到背景落差
4681
+ maskStyle: GIFT_MASK_STYLE,
4682
+ // 点遮罩弹二次挽留,不直接关(原页面 @click.self="tryClose()")
4683
+ maskAction: { type: "open", view: "confirm", mode: "stack" },
4684
+ // 内置关闭按钮画的就是矢量交叉线,和原页面那段内联 SVG 是同一种东西
4685
+ closeButton: {
4686
+ position: "top-right",
4687
+ offset: [14, 14],
4688
+ size: 30,
4689
+ style: {
4690
+ background: "rgba(255,255,255,0.22)",
4691
+ color: "#ffffff",
4692
+ transition: "background 0.2s"
4693
+ },
4694
+ hoverStyle: { background: "rgba(255,255,255,0.38)" },
4695
+ action: { type: "open", view: "confirm", mode: "stack" }
4696
+ },
4697
+ style: {
4698
+ radius: 16,
4699
+ background: "#ffffff",
4700
+ shadow: "0 18px 50px rgba(20,26,45,0.24)",
4701
+ maxWidth: "90vw",
4702
+ // 原页面 .rp-modal 显式指定了字体栈,弹窗内所有文字继承它,
4703
+ // 不写就跟着宿主页面走、字形和字重会有出入
4704
+ fontFamily: "-apple-system, BlinkMacSystemFont, 'PingFang SC', 'Microsoft YaHei', sans-serif"
4705
+ },
4706
+ animate: {
4707
+ name: "zoomIn",
4708
+ duration: 500,
4709
+ easing: "cubic-bezier(0.34, 1.56, 0.64, 1)"
4710
+ },
4711
+ maskAnimate: { name: "fadeIn", duration: 400 },
4712
+ onShow: { type: "track", event: "move_success_rp_show" },
4713
+ onClose: {
4714
+ type: "track",
4715
+ event: "move_success_rp_close",
4716
+ params: { reason: "{{ closeReason }}" }
4717
+ }
4718
+ },
4719
+ nodes: [
4720
+ createHead2(),
4721
+ createPlate(),
4722
+ {
4723
+ type: "flex",
4724
+ style: {
4725
+ direction: "column",
4726
+ // 底部 38 而不是原页面的 20:原页面 CTA 下面还有一行「今日不再提示」
4727
+ // (约 18px + 14px 间距),那一行按需求去掉了,不把留白补回来底部就贴得慌
4728
+ padding: "18px 26px 38px",
4729
+ background: "#ffffff"
4730
+ },
4731
+ children: [
4732
+ createFeatureGrid(),
4733
+ createCta({
4734
+ type: "sequence",
4735
+ actions: [
4736
+ {
4737
+ type: "track",
4738
+ event: "move_success_rp_claim",
4739
+ params: { from: "main" }
4740
+ },
4741
+ { type: "navigate", url: PURCHASE_URL2 }
4742
+ ]
4743
+ })
4744
+ ]
4745
+ }
4746
+ ]
4747
+ },
4748
+ confirm: createGiveUpView({
4749
+ url: PURCHASE_URL2,
4750
+ claimEvent: "move_success_rp_claim",
4751
+ giveUpEvent: "move_success_rp_give_up"
4752
+ })
4753
+ }
4754
+ };
4755
+ var gift_red_packet_default = giftRedPacket;
4756
+
4757
+ // src/docs/examples/index.ts
4758
+ var HOTSPOT_BG = "rgba(255,68,51,0.16)";
4759
+ var imageHotspot = {
4760
+ version: 1,
4761
+ type: "popup",
4762
+ meta: { name: "\u6574\u56FE\u70ED\u533A\u5F39\u7A97" },
4763
+ stage: {
4764
+ // 窄屏时跟着父级收,最宽不超过 420
4765
+ width: "calc(100% - 48px)",
4766
+ height: 520,
4767
+ mask: true,
4768
+ maskClosable: true,
4769
+ // 关闭按钮放到弹窗正下方外侧:offset 的 y 写负值即可,不会被圆角裁掉
4770
+ closeButton: {
4771
+ show: true,
4772
+ position: "bottom-center",
4773
+ offset: [0, -46],
4774
+ size: 34,
4775
+ // 不写 icon / image,用内置的矢量 × 图标(跟着 style.color 走)
4776
+ style: {
4777
+ background: "rgba(0,0,0,0.4)",
4778
+ color: "#ffffff",
4779
+ fontSize: 18,
4780
+ borderWidth: 1,
4781
+ borderStyle: "solid",
4782
+ borderColor: "rgba(255,255,255,0.55)"
4783
+ }
4784
+ },
4785
+ style: { radius: 12, maxWidth: 420 },
4786
+ // 曝光埋点:数据就绪、弹窗真正展示时触发一次
4787
+ onShow: { type: "track", event: "popup_show", params: { popup: "image_hotspot" } },
4788
+ // 关闭埋点:点 X、点遮罩、点「不再提醒」都会触发,用 closeReason 区分
4789
+ onClose: {
4790
+ type: "track",
4791
+ event: "popup_close",
4792
+ params: { popup: "image_hotspot", reason: "{{ closeReason }}" }
4793
+ }
4794
+ },
4795
+ nodes: [
4796
+ {
4797
+ // 背景图用百分比铺满舞台,舞台宽度变了也不用改配置
4798
+ id: "bg",
4799
+ type: "image",
4800
+ rect: [0, 0, "100%", "100%"],
4801
+ src: "https://picsum.photos/id/1015/420/520"
4802
+ },
4803
+ // 热区想放几个放几个,位置各自由 rect 决定,互不影响。
4804
+ // 热区 = 一个透明的 box + action,调试时把 background 的透明度调高就能看见框。
4805
+ {
4806
+ id: "hotspot-rule",
4807
+ type: "box",
4808
+ // 右上角「活动规则」
4809
+ rect: ["62%", 24, "30%", 30],
4810
+ style: { radius: 15, background: HOTSPOT_BG, cursor: "pointer" },
3395
4811
  action: {
3396
4812
  type: "sequence",
3397
4813
  actions: [
@@ -3579,6 +4995,16 @@ var examples = [
3579
4995
  label: "\u2469 \u62BD\u5C49\u5E95\u90E8 Banner\uFF08\u56FA\u5B9A 400\xD745\uFF09",
3580
4996
  value: "drawerBottomBanner",
3581
4997
  dsl: drawerBottomBanner
4998
+ },
4999
+ {
5000
+ label: "\u246A \u590D\u523B\u7EBF\u4E0A\u5F39\u7A97 \xB7 4 \u6298\u793C\u5305\uFF08\u52A8\u753B + \u4E8C\u6B21\u633D\u7559\uFF09",
5001
+ value: "giftV6",
5002
+ dsl: gift_v6_default
5003
+ },
5004
+ {
5005
+ label: "\u246B \u590D\u523B\u7EBF\u4E0A\u5F39\u7A97 \xB7 1 \u5206\u94B1\u534A\u5E74\u5361\uFF08\u52A8\u753B\u6700\u5BC6\u7684\u4E00\u4EFD\uFF09",
5006
+ value: "giftRedPacket",
5007
+ dsl: gift_red_packet_default
3582
5008
  }
3583
5009
  ];
3584
5010
  var examples_default = examples;
@@ -3612,7 +5038,7 @@ function blockToMarkdown(block) {
3612
5038
  return "";
3613
5039
  }
3614
5040
  }
3615
- function toMarkdown(sections10, meta2) {
5041
+ function toMarkdown(sections11, meta2) {
3616
5042
  const lines = [
3617
5043
  "# \u8425\u9500\u5185\u5BB9 DSL \xB7 \u5F00\u53D1\u6587\u6863",
3618
5044
  "",
@@ -3622,7 +5048,7 @@ function toMarkdown(sections10, meta2) {
3622
5048
  "> \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",
3623
5049
  ""
3624
5050
  ];
3625
- sections10.forEach((section) => {
5051
+ sections11.forEach((section) => {
3626
5052
  lines.push(`## ${section.title}`, "");
3627
5053
  section.blocks.forEach((block) => {
3628
5054
  const text = blockToMarkdown(block);
@@ -3683,17 +5109,28 @@ function structureSection() {
3683
5109
  "layout": "flow", // "absolute" \u6216 "flow"\uFF0C\u89C1\u4E0B\u9762\u300C\u5E03\u5C40\u300D
3684
5110
  "mask": true,
3685
5111
  "maskClosable": false,
5112
+ // \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
5113
+ "maskStyle": { "background": "rgba(0,0,0,0.65)", "backdropFilter": "blur(4px)" },
5114
+ // \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
5115
+ "maskAction": { "type": "open", "view": "confirm", "mode": "stack" },
3686
5116
  "closeButton": {
3687
5117
  "position": "top-right", // ${CLOSE_POSITIONS.join(" | ")}
3688
5118
  "offset": [12, 12], // [x, y]\uFF1B\u5199\u8D1F\u503C = \u6309\u94AE\u8DD1\u5230\u5F39\u7A97\u5916\u9762
3689
5119
  "size": 26,
3690
5120
  // 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
3691
- "style": { "background": "rgba(0,0,0,0.35)", "color": "#fff" }
5121
+ "style": { "background": "rgba(0,0,0,0.35)", "color": "#fff" },
5122
+ // \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
5123
+ "action": { "type": "open", "view": "confirm", "mode": "stack" }
3692
5124
  },
3693
5125
  "style": { "radius": 18, "maxWidth": 420 }
3694
5126
  }
3695
5127
  \`\`\`
3696
5128
 
5129
+ \`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
5130
+ \`maskClosable: false\` \u65F6\u5149\u914D \`maskAction\` \u4E0D\u4F1A\u89E6\u53D1\u3002
5131
+ \`maskAction\` / \`closeButton.action\` \u914D\u4E86\u5C31**\u4E0D\u518D\u81EA\u52A8\u5173\u5C42**\uFF0C\u8981\u5173\u5C31\u628A \`close\` \u5199\u8FDB\u52A8\u4F5C\u91CC\u3002
5132
+ \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
5133
+
3697
5134
  **\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
3698
5135
  \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
3699
5136
  \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
@@ -3755,6 +5192,8 @@ function checklistSection() {
3755
5192
  - [ ] \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 }}"\`
3756
5193
  - [ ] \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
3757
5194
  - [ ] \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\`
5195
+ - [ ] \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
5196
+ - [ ] \u88C5\u9970\u6027\u56FE\u5C42\uFF08\u5149\u6655\u3001\u626B\u5149\u3001\u5149\u70B9\uFF09\u90FD\u5199\u4E86 \`"pointerEvents": "none"\`
3758
5197
  - [ ] \u8F93\u51FA\u7684\u662F\u5408\u6CD5 JSON\uFF08\u6CA1\u6709\u591A\u4F59\u9017\u53F7\u3001\u6CA1\u6709\u6CE8\u91CA\uFF09`;
3759
5198
  }
3760
5199
  function requirementSection() {
@@ -3910,6 +5349,9 @@ function countdownSection() {
3910
5349
 
3911
5350
  \u5199\u6210 \`"\u4E0B\u5468\u4E09"\` \u8FD9\u79CD\u8BC6\u522B\u4E0D\u4E86\u7684\u4F1A\u5728\u4FDD\u5B58\u524D\u62A5\u9519\u3002
3912
5351
 
5352
+ \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
5353
+ \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
5354
+
3913
5355
  \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
3914
5356
 
3915
5357
  \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
@@ -4023,6 +5465,65 @@ ${DEFAULT_USER_FIELDS.map((field) => `\`${field}\`\uFF08${USER_FIELD_LABELS[fiel
4023
5465
  \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`;
4024
5466
  }
4025
5467
 
5468
+ // src/docs/ai-prompt/animation.ts
5469
+ function animationSection() {
5470
+ return `# \u52A8\u753B\u4E0E hover
5471
+
5472
+ \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
5473
+
5474
+ \`\`\`jsonc
5475
+ "keyframes": {
5476
+ "zoomIn": { "from": { "opacity": "0", "transform": "scale(0.7)" },
5477
+ "to": { "opacity": "1", "transform": "scale(1)" } },
5478
+ "floatY": { "0%": { "transform": "translateY(0)" },
5479
+ "50%": { "transform": "translateY(-8px)" },
5480
+ "100%": { "transform": "translateY(0)" } }
5481
+ },
5482
+ "stage": {
5483
+ "animate": { "name": "zoomIn", "duration": 500, "easing": "cubic-bezier(0.34, 1.56, 0.64, 1)" },
5484
+ "maskAnimate": { "name": "fadeIn", "duration": 400 }
5485
+ },
5486
+ // \u4EFB\u610F\u8282\u70B9\u3001\u4EE5\u53CA stage.closeButton \u4E0A\u90FD\u80FD\u5199 animate
5487
+ { "animate": { "name": "floatY", "duration": 3000, "easing": "ease-in-out", "iteration": "infinite" } }
5488
+ \`\`\`
5489
+
5490
+ \`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
5491
+ \`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
5492
+ \`direction\`\uFF08\`normal\`/\`reverse\`/\`alternate\`/\`alternate-reverse\`\uFF09\u3001\`fill\`\uFF08\u9ED8\u8BA4 \`both\`\uFF0C**\u4E0D\u8981\u6539**\uFF09\u3002
5493
+
5494
+ \`easing\` \u53EA\u80FD\u662F\uFF1A${ALLOWED_EASINGS.map((item) => "`" + item + "`").join(" ")}\uFF0C
5495
+ \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
5496
+
5497
+ \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
5498
+ \uFF08\u52A8\u753B\u91CC\u5E38\u7528\u7684\u5C31 \`transform\` \`opacity\` \`shadow\` \`background\` \`color\`\uFF09\u3002
5499
+
5500
+ \u89C4\u5219\uFF1A
5501
+
5502
+ - \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
5503
+ - \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\`
5504
+ - \u5FAA\u73AF\u52A8\u753B\u5199 \`"iteration": "infinite"\`\uFF0C\u5E45\u5EA6\u8981\u5C0F\uFF08\u6309\u94AE\u8109\u51B2\u653E\u5927 2% \u5C31\u591F\uFF09
5505
+ - \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\`
5506
+ - \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
5507
+ - \u5B9A\u4E49\u4E86\u6CA1\u4EBA\u5F15\u7528\u7684\u5173\u952E\u5E27\u4F1A\u544A\u8B66\uFF0C\u4E0D\u8981\u7559
5508
+
5509
+ \`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
5510
+ \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
5511
+ \u5E26\u5FAA\u73AF\u52A8\u753B\u7684\u6309\u94AE\u60F3\u5728\u60AC\u505C\u65F6\u505C\u4F4F\uFF0C\u5728 \`hoverStyle\` \u91CC\u52A0 \`"animationPlayState": "paused"\`
5512
+ \uFF08\u5199\u8FDB \`style\` \u7B49\u4E8E\u4E00\u5F00\u59CB\u5C31\u6682\u505C\uFF0C\u6CA1\u6709\u610F\u4E49\uFF09\u3002
5513
+
5514
+ \`\`\`jsonc
5515
+ { "type": "text", "content": "\u2715",
5516
+ "style": { "background": "rgba(0,0,0,0.08)", "transition": "background 0.2s" },
5517
+ "hoverStyle": { "background": "rgba(0,0,0,0.2)" } }
5518
+ \`\`\`
5519
+
5520
+ \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
5521
+ \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
5522
+
5523
+ \u6CA1\u6709 \`position\`\u3001\u6CA1\u6709\u81EA\u7531 CSS\uFF1A\u7EDD\u5BF9\u5B9A\u4F4D\u7528 \`rect\`\uFF0C\`zIndex\` \u53EA\u5141\u8BB8 0~10\u3002
5524
+ \`keyframes\` \u548C \`hoverStyle\` \u7684\u503C\u91CC\u51FA\u73B0 \`{\` \`}\` \`<\` \`>\` \`;\` \`@\` \`/*\` \`\\\` \u65F6\uFF0C\u90A3\u6761\u58F0\u660E\u4F1A\u88AB\u6574\u6761\u4E22\u5F03\u3002`;
5525
+ }
5526
+
4026
5527
  // src/docs/ai-prompt/index.ts
4027
5528
  function findExample(value) {
4028
5529
  const found = examples_default.filter((item) => item.value === value)[0];
@@ -4056,6 +5557,7 @@ ${JSON.stringify(full, null, 2)}
4056
5557
  actionSection(),
4057
5558
  viewsSection(),
4058
5559
  countdownSection(),
5560
+ animationSection(),
4059
5561
  exampleSection,
4060
5562
  checklistSection(),
4061
5563
  requirementSection()