@yaoxiu/marketing-dsl 2.6.0 → 2.7.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.
@@ -327,23 +327,45 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6`
327
327
  tone: "info",
328
328
  text: "`close` \u7684 `reason` \u4F1A\u4E00\u8D77\u4F20\u7ED9\u5BBF\u4E3B\uFF0C\u5BBF\u4E3B\u636E\u6B64\u51B3\u5B9A\u540E\u7EED\u884C\u4E3A\uFF0C\u5E76\u539F\u6837\u4E0A\u62A5\u7ED9\u540E\u7AEF\u3002\u4E0D\u5199 `reason` \u9ED8\u8BA4\u662F `action`\u3002"
329
329
  },
330
- { t: "h3", text: "\u300C\u4E0D\u518D\u63D0\u9192\u300D\u5C31\u5199 close \u7684 reason\uFF0C\u4E0D\u8981\u914D call" },
330
+ { t: "h3", text: "\u300C\u4ECA\u65E5\u4E0D\u518D\u63D0\u793A\u300D/\u300C\u4E0D\u518D\u63D0\u793A\u300D\uFF1AdismissToday / dismissForever" },
331
331
  {
332
332
  t: "p",
333
- text: "\u60F3\u8BA9\u7269\u6599\u300C\u5173\u4E86\u5C31\u522B\u518D\u51FA\u73B0\u300D\uFF0C\u4E00\u6761 `close` \u5C31\u591F\u4E86\uFF0C\u628A\u7528\u6237\u7684\u610F\u56FE\u5199\u8FDB `reason`\uFF1A"
333
+ text: "\u5BBF\u4E3B\u6CE8\u518C\u4E86\u4E24\u4E2A\u73B0\u6210\u7684\u65B9\u6CD5\uFF0C\u7528 `call` \u8C03\u5373\u53EF\uFF0C\u4E0D\u9700\u8981\u65B0\u7684\u52A8\u4F5C\u7C7B\u578B\uFF1A`dismissToday`\uFF08\u4ECA\u5929\u4E4B\u5185\u4E0D\u518D\u5C55\u793A\u8FD9\u6761\u7269\u6599\uFF09\u3001`dismissForever`\uFF08\u6C38\u4E45\u4E0D\u518D\u5C55\u793A\uFF09\u3002"
334
334
  },
335
335
  {
336
336
  t: "code",
337
- code: `{ "type": "close", "reason": "user-dismiss" }`
337
+ code: `// \u300C\u4ECA\u65E5\u4E0D\u518D\u63D0\u793A\u300D\u6309\u94AE\uFF1A\u5148\u5199\u6807\u8BB0\uFF0C\u518D\u5173\u6389\u8FD9\u4E00\u5C42
338
+ "action": {
339
+ "type": "sequence",
340
+ "actions": [
341
+ { "type": "call", "name": "dismissToday" },
342
+ { "type": "close", "reason": "dismiss-today" }
343
+ ]
344
+ }
345
+
346
+ // \u300C\u4E0D\u518D\u63D0\u793A\u300D\u6309\u94AE\uFF1A\u540C\u6837\u4E24\u6B65
347
+ "action": {
348
+ "type": "sequence",
349
+ "actions": [
350
+ { "type": "call", "name": "dismissForever" },
351
+ { "type": "close", "reason": "dismiss-forever" }
352
+ ]
353
+ }`
338
354
  },
339
355
  {
340
- t: "p",
341
- text: '\u4E0A\u62A5\u51FA\u53BB\u5C31\u662F `{ "id": "...", "event": "close", "reason": "user-dismiss" }`\uFF0C\u540E\u7AEF\u770B\u5230\u8FD9\u4E2A `reason` \u5C31\u6C38\u4E45\u538B\u5236\u8FD9\u6761\u7269\u6599\u3002\u8FD9\u4E2A\u4FE1\u606F\u8D70 `close` \u7684 `reason`\uFF0C\u4E0D\u8D70 `extra`\u2014\u2014`extra` \u53EA\u5C5E\u4E8E `click`\u3002'
356
+ t: "note",
357
+ tone: "warn",
358
+ text: "**\u6807\u8BB0\u548C\u5173\u95ED\u662F\u4E24\u56DE\u4E8B\uFF0C`close` \u5FC5\u987B\u81EA\u5DF1\u914D\u3002** \u8FD9\u4E24\u4E2A\u65B9\u6CD5\u53EA\u5199\u4E00\u6761\u300C\u4EE5\u540E\u522B\u518D\u5C55\u793A\u300D\u7684\u8BB0\u5F55\uFF0C\u4E0D\u4F1A\u987A\u624B\u628A\u5F53\u524D\u8FD9\u5C42\u5173\u6389\u2014\u2014\u7559\u51FA\u300C\u5148\u52FE\u4E00\u4E2A\u590D\u9009\u6846\u3001\u7A0D\u540E\u518D\u70B9\u5173\u95ED\u300D\u8FD9\u7C7B\u4EA4\u4E92\u7684\u4F59\u5730\u3002\u53EA\u5199 `call` \u4E0D\u5199 `close`\uFF0C\u7528\u6237\u70B9\u5B8C\u6309\u94AE\u5F39\u7A97\u8FD8\u6775\u5728\u90A3\u513F\u3002"
342
359
  },
343
360
  {
344
361
  t: "note",
345
362
  tone: "warn",
346
- text: "**\u4E0D\u8981**\u518D\u914D\u4E00\u6761 `call` \u8BA9\u5BBF\u4E3B\u5199 `localStorage` \u8BB0\u4F4F\u3002\u9891\u63A7\u7531\u540E\u7AEF\u7B97\uFF0C\u524D\u7AEF\u5B58\u4E00\u4EFD\u540E\u7AEF\u770B\u4E0D\u89C1\u7684\u4F9D\u636E\uFF0C\u4E24\u8FB9\u5C31\u5BF9\u4E0D\u4E0A\uFF1B\u800C\u4E14\u6362\u8BBE\u5907\u3001\u6E05\u7F13\u5B58\u5C31\u5931\u6548\u2014\u2014\u7528\u6237\u7684\u957F\u671F\u610F\u56FE\u8BE5\u8DDF\u7740\u8D26\u53F7\u8D70\uFF0C\u4E0D\u8BE5\u8DDF\u7740\u6D4F\u89C8\u5668\u8D70\uFF1B`call` \u7684\u65B9\u6CD5\u8FD8\u662F\u5404\u4E2A\u5BBF\u4E3B\u5404\u6CE8\u518C\u4E00\u4EFD\u7684\uFF0C\u884C\u4E3A\u8FDF\u65E9\u5206\u53C9\u3002"
363
+ text: "**\u8BB0\u5F55\u5B58\u5728\u7528\u6237\u6D4F\u89C8\u5668\u672C\u5730\uFF0C\u6309\u767B\u5F55\u8D26\u53F7\u9694\u79BB\u3002** \u540C\u4E00\u53F0\u7535\u8111\u6362\u4E2A\u8D26\u53F7\u767B\u5F55\u4E92\u4E0D\u5F71\u54CD\uFF0C\u4F46**\u6362\u8BBE\u5907\u3001\u6362\u6D4F\u89C8\u5668\u3001\u6E05\u7F13\u5B58\u5C31\u5931\u6548**\u2014\u2014\u5B83\u662F\u300C\u5C11\u70E6\u6211\u4E00\u4E0B\u300D\u7684\u4F53\u9A8C\u4F18\u5316\uFF0C\u4E0D\u662F\u300C\u540E\u7AEF\u6C38\u4E45\u538B\u5236\u8FD9\u6761\u6295\u653E\u300D\u7684\u51ED\u636E\u3002\u771F\u6B63\u7684\u957F\u671F\u9891\u63A7\u4ECD\u7531\u540E\u7AEF\u7B97\u3002"
364
+ },
365
+ {
366
+ t: "note",
367
+ tone: "info",
368
+ text: "`close` \u7684 `reason` \u7167\u65E7\u8981\u5199\uFF1A\u5173\u95ED\u4E8B\u4EF6\u4ECD\u4F1A\u539F\u6837\u4E0A\u62A5\u7ED9\u540E\u7AEF\uFF0C`reason` \u662F\u540E\u7AEF\u552F\u4E00\u80FD\u770B\u5230\u7684\u300C\u7528\u6237\u4E3A\u4EC0\u4E48\u5173\u300D\u3002\u8FD9\u4E2A\u4FE1\u606F\u8D70 `close` \u7684 `reason`\uFF0C\u4E0D\u8D70 `extra`\u2014\u2014`extra` \u53EA\u5C5E\u4E8E `click`\u3002"
347
369
  },
348
370
  { t: "h3", text: "call \u7684\u9002\u7528\u8FB9\u754C" },
349
371
  {
@@ -355,15 +377,15 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6`
355
377
  head: ["\u2705 \u8BE5\u7528 call", "\u274C \u4E0D\u8BE5\u7528 call"],
356
378
  rows: [
357
379
  [
358
- "\u5524\u8D77\u5145\u503C\u5F39\u7A97\u3001\u6253\u5F00\u5BA2\u670D\u4F1A\u8BDD\u3001\u590D\u5236\u5230\u526A\u8D34\u677F\u3001\u8DF3\u8F6C\u5E94\u7528\u5185\u7279\u5B9A\u9875\u9762",
359
- "\u8BB0\u5F55\u7528\u6237\u610F\u56FE\u3001\u5199\u672C\u5730\u5B58\u50A8"
380
+ "\u5524\u8D77\u5145\u503C\u5F39\u7A97\u3001\u6253\u5F00\u5BA2\u670D\u4F1A\u8BDD\u3001\u590D\u5236\u5230\u526A\u8D34\u677F\u3001\u8DF3\u8F6C\u5E94\u7528\u5185\u7279\u5B9A\u9875\u9762\u3001\u300C\u4ECA\u65E5\u4E0D\u518D\u63D0\u793A / \u4E0D\u518D\u63D0\u793A\u300D\uFF08`dismissToday` / `dismissForever`\uFF09",
381
+ "\u8BA9\u5BBF\u4E3B\u505A\u4E00\u4EF6\u5B83\u6CA1\u6CE8\u518C\u8FC7\u7684\u4E8B"
360
382
  ]
361
383
  ]
362
384
  },
363
385
  {
364
386
  t: "note",
365
387
  tone: "info",
366
- text: "\u5224\u65AD\u6807\u51C6\u53EA\u6709\u4E00\u6761\uFF1A**\u8FD9\u4EF6\u4E8B\u540E\u7AEF\u9700\u4E0D\u9700\u8981\u77E5\u9053**\u3002\u9700\u8981 \u2192 \u8D70\u4E0A\u62A5\uFF08`close` \u7684 `reason`\uFF0C\u6216 `track`\uFF09\uFF1B\u7EAF\u7CB9\u662F\u5BBF\u4E3B\u7684\u672C\u5730\u52A8\u4F5C\u3001\u540E\u7AEF\u4E0D\u5173\u5FC3 \u2192 \u624D\u7528 `call`\u3002"
388
+ text: "`call` \u53EA\u80FD\u8C03**\u4E0A\u9762\u6E05\u5355\u91CC\u5DF2\u6CE8\u518C**\u7684\u65B9\u6CD5\u540D\uFF0C\u540D\u5B57\u662F\u5BBF\u4E3B\u4E0E\u8FD0\u8425\u4E4B\u95F4\u7684\u5951\u7EA6\uFF0C\u5199\u4E86\u6CA1\u6CE8\u518C\u7684\u540D\u5B57\uFF0C\u90A3\u4E00\u6B65\u4F1A\u9759\u9ED8\u5931\u6548\uFF08\u7269\u6599\u7167\u5E38\u663E\u793A\uFF0C\u6309\u94AE\u70B9\u4E86\u6CA1\u53CD\u5E94\uFF09\u3002\u6240\u4EE5\u81EA\u5DF1\u53D1\u660E\u4E00\u4E2A\u540D\u5B57\u53BB\u300C\u8BB0\u4E00\u7B14\u8D26\u300D\u662F\u884C\u4E0D\u901A\u7684\u2014\u2014\u672C\u5730\u8BB0\u8D26\u7528\u73B0\u6210\u7684 `dismissToday` / `dismissForever`\uFF0C\u9700\u8981\u540E\u7AEF\u77E5\u9053\u7684\u4E8B\u4E00\u5F8B\u8D70\u4E0A\u62A5\uFF08`close` \u7684 `reason`\uFF0C\u6216 `track`\uFF09\u3002"
367
389
  },
368
390
  { t: "h3", text: "\u66DD\u5149\u548C\u5173\u95ED\u4E5F\u8981\u57CB\u70B9\uFF1Astage.onShow / stage.onClose" },
369
391
  {
@@ -427,7 +449,7 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6`
427
449
  {
428
450
  t: "note",
429
451
  tone: "info",
430
- text: '`close` \u53EA\u662F\u901A\u77E5\u5BBF\u4E3B\u300C\u7528\u6237\u5173\u6389\u4E86\u300D\uFF0C**\u8FD9\u4E00\u6B21\u5173\u4E0D\u5173\u7531\u5BBF\u4E3B\u51B3\u5B9A**\uFF1B\u800C\u300C\u4EE5\u540E\u8FD8\u51FA\u4E0D\u51FA\u300D\u7531\u540E\u7AEF\u6839\u636E\u4E0A\u62A5\u7684 `reason` \u51B3\u5B9A\uFF0C\u6240\u4EE5\u60F3\u8BA9\u5B83\u522B\u518D\u51FA\u73B0\uFF0C\u5199 `reason: "user-dismiss"` \u5373\u53EF\uFF0C\u4E0D\u9700\u8981\u518D\u914D `call`\u3002'
452
+ text: '`close` \u53EA\u662F\u901A\u77E5\u5BBF\u4E3B\u300C\u7528\u6237\u5173\u6389\u4E86\u300D\uFF0C**\u8FD9\u4E00\u6B21\u5173\u4E0D\u5173\u7531\u5BBF\u4E3B\u51B3\u5B9A**\uFF1B`reason` \u4F1A\u539F\u6837\u4E0A\u62A5\uFF0C\u540E\u7AEF\u636E\u6B64\u5224\u65AD\u300C\u4EE5\u540E\u8FD8\u51FA\u4E0D\u51FA\u300D\u3002\u60F3\u5728\u524D\u7AEF\u4E5F\u7ACB\u523B\u751F\u6548\uFF08\u4ECA\u5929\u4E4B\u5185 / \u6C38\u4E45\u4E0D\u518D\u51FA\u73B0\uFF09\uFF0C\u5728 `close` \u4E4B\u524D\u518D\u52A0\u4E00\u6761 `{ "type": "call", "name": "dismissToday" }`\uFF08\u6216 `dismissForever`\uFF09\uFF0C\u89C1\u4E0A\u4E00\u8282\u3002'
431
453
  },
432
454
  {
433
455
  t: "note",
@@ -2884,7 +2906,8 @@ var noticeToPopup = {
2884
2906
  fontSize: 13,
2885
2907
  cursor: "pointer"
2886
2908
  },
2887
- action: { type: "close", reason: "user-dismiss" }
2909
+ // 公告条行末的关闭只管「这一次」,不写本地标记
2910
+ action: { type: "close", reason: "user-close" }
2888
2911
  }
2889
2912
  ]
2890
2913
  }
@@ -3251,12 +3274,14 @@ var confirmAndSwitch = {
3251
3274
  cursor: "pointer"
3252
3275
  },
3253
3276
  // 确认后整个关掉,两层一起消失。
3254
- // 「不再提醒」的意图靠 reason 上报给后端,不配 call 写本地存储
3277
+ // 标记写在这一步而不是上一层的「不再提醒」按钮上:
3278
+ // 那个按钮只是打开二次确认,用户还可能反悔,真正的意图在这里才确定
3255
3279
  action: {
3256
3280
  type: "sequence",
3257
3281
  actions: [
3258
3282
  { type: "track", event: "popup_never_remind_confirm" },
3259
- { type: "closeAll", reason: "user-dismiss" }
3283
+ { type: "call", name: "dismissForever" },
3284
+ { type: "closeAll", reason: "dismiss-forever" }
3260
3285
  ]
3261
3286
  },
3262
3287
  children: [
@@ -3592,8 +3617,15 @@ var imageBanner = {
3592
3617
  fontSize: 12,
3593
3618
  cursor: "pointer"
3594
3619
  },
3595
- // 「不再提醒」写在 close 的 reason 上,上报给后端即可,不配 call 写本地存储
3596
- action: { type: "close", reason: "user-dismiss" }
3620
+ // 「不再提醒」两步走:先调宿主的 dismissForever 写本地标记(前端立刻不再展示),
3621
+ // close 关掉;reason 照旧上报给后端,那是后端唯一看得到的「为什么关」
3622
+ action: {
3623
+ type: "sequence",
3624
+ actions: [
3625
+ { type: "call", name: "dismissForever" },
3626
+ { type: "close", reason: "dismiss-forever" }
3627
+ ]
3628
+ }
3597
3629
  }
3598
3630
  ]
3599
3631
  }
@@ -3701,8 +3733,15 @@ function createDrawerBanner(options) {
3701
3733
  fontSize: 9,
3702
3734
  cursor: "pointer"
3703
3735
  },
3704
- // 「不再提醒」写在 close reason 上,上报给后端即可,不配 call 写本地存储
3705
- action: { type: "close", reason: "user-dismiss" }
3736
+ // 「不再提醒」两步走:dismissForever 写本地标记 + close 关掉,缺一不可
3737
+ // (这两个方法只写标记、不关闭)
3738
+ action: {
3739
+ type: "sequence",
3740
+ actions: [
3741
+ { type: "call", name: "dismissForever" },
3742
+ { type: "close", reason: "dismiss-forever" }
3743
+ ]
3744
+ }
3706
3745
  }
3707
3746
  ]
3708
3747
  };
@@ -4762,20 +4801,22 @@ var achieveCell3 = (verb, value, unit, label) => ({
4762
4801
  type: "flex",
4763
4802
  style: {
4764
4803
  direction: "column",
4804
+ // grid 不在白名单,用 flex wrap + 半宽复刻 grid-template-columns: 1fr 1fr(gap 9)
4765
4805
  width: "calc(50% - 5px)",
4766
4806
  background: "rgba(255,255,255,0.16)",
4767
4807
  borderWidth: 1,
4768
4808
  borderStyle: "solid",
4769
4809
  borderColor: "rgba(255,255,255,0.2)",
4770
4810
  radius: 10,
4771
- padding: "10px 13px",
4772
- gap: 3
4811
+ // .period-price-modal .ac 把基础规则的 9px 11px 覆盖成 10px 13px
4812
+ padding: "10px 13px"
4773
4813
  },
4774
4814
  children: [
4775
4815
  {
4776
- // lineHeight 必须显式给,否则 20px 数字的默认行高会把格子撑高
4816
+ // .ac .n:line-height 1.1 × 20px = 22px,显式给死,
4817
+ // 否则 20px 数字的默认行高(≈1.5)会把格子撑高 8px 左右
4777
4818
  type: "flex",
4778
- style: { align: "baseline", gap: 3, height: 22 },
4819
+ style: { align: "baseline", height: 22, whiteSpace: "nowrap" },
4779
4820
  children: [
4780
4821
  {
4781
4822
  type: "text",
@@ -4784,7 +4825,10 @@ var achieveCell3 = (verb, value, unit, label) => ({
4784
4825
  fontSize: 11.5,
4785
4826
  fontWeight: "600",
4786
4827
  lineHeight: 1.1,
4787
- color: "rgba(255,255,255,0.92)"
4828
+ letterSpacing: 0.2,
4829
+ marginRight: 3,
4830
+ // demo 是 opacity .7 叠在 .m-top 的白字上,等价于这个色值
4831
+ color: "rgba(255,255,255,0.7)"
4788
4832
  }
4789
4833
  },
4790
4834
  {
@@ -4795,14 +4839,25 @@ var achieveCell3 = (verb, value, unit, label) => ({
4795
4839
  {
4796
4840
  type: "text",
4797
4841
  content: ` ${unit}`,
4798
- style: { fontSize: 12, lineHeight: 1.1, color: "rgba(255,255,255,0.92)" }
4842
+ style: {
4843
+ fontSize: 12,
4844
+ fontWeight: "600",
4845
+ lineHeight: 1.1,
4846
+ // demo 是 opacity .85
4847
+ color: "rgba(255,255,255,0.85)"
4848
+ }
4799
4849
  }
4800
4850
  ]
4801
4851
  },
4802
4852
  {
4803
4853
  type: "text",
4804
4854
  content: label,
4805
- style: { fontSize: 11.5, lineHeight: 1.35, color: "rgba(255,255,255,0.72)" }
4855
+ style: {
4856
+ fontSize: 11,
4857
+ lineHeight: 1.4,
4858
+ marginTop: 2,
4859
+ color: "rgba(255,255,255,0.85)"
4860
+ }
4806
4861
  }
4807
4862
  ]
4808
4863
  });
@@ -4813,7 +4868,15 @@ var loseRow3 = {
4813
4868
  {
4814
4869
  type: "text",
4815
4870
  content: "",
4816
- style: { width: 6, height: 6, radius: "50%", background: "#f53f3f", marginTop: 7 }
4871
+ style: {
4872
+ width: 6,
4873
+ height: 6,
4874
+ radius: "50%",
4875
+ background: "#f53f3f",
4876
+ marginTop: 7,
4877
+ // demo 的 flex: none —— 文案换行时圆点不许被压扁
4878
+ flexShrink: "0"
4879
+ }
4817
4880
  },
4818
4881
  {
4819
4882
  type: "flex",
@@ -4829,20 +4892,6 @@ var loseRow3 = {
4829
4892
  color: "#1f2533"
4830
4893
  }
4831
4894
  },
4832
- {
4833
- type: "text",
4834
- content: "{{ item.tag }}",
4835
- visibleWhen: "item.tag != ''",
4836
- style: {
4837
- background: "{{ item.sev == 'lose' ? '#ffd5cf' : 'rgba(255,255,255,0.78)' }}",
4838
- color: "{{ item.sev == 'lose' ? '#cf1322' : '#8a7f78' }}",
4839
- fontSize: 10,
4840
- fontWeight: "800",
4841
- radius: 4,
4842
- padding: "1px 6px",
4843
- whiteSpace: "nowrap"
4844
- }
4845
- },
4846
4895
  {
4847
4896
  type: "text",
4848
4897
  content: "\u2014 {{ item.t }}",
@@ -4856,14 +4905,18 @@ var tierCard3 = {
4856
4905
  type: "box",
4857
4906
  style: {
4858
4907
  flex: "1",
4859
- height: 121,
4908
+ height: 119,
4860
4909
  radius: 12,
4861
4910
  background: "{{ item.key == current.key ? '#fffaf0' : '#ffffff' }}",
4862
4911
  borderStyle: "solid",
4863
4912
  borderWidth: "{{ item.key == current.key ? '2px' : '1px' }}",
4864
4913
  borderColor: "{{ item.key == current.key ? '#f0a000' : '#e5e8ed' }}",
4865
- cursor: "pointer"
4914
+ shadow: "{{ item.key == current.key ? '0 7px 18px rgba(240,160,0,0.1)' : 'none' }}",
4915
+ cursor: "pointer",
4916
+ transition: "border-color 0.15s, background 0.15s, box-shadow 0.15s"
4866
4917
  },
4918
+ // .tcol:hover { border-color: var(--gold) }
4919
+ hoverStyle: { borderColor: "#faad14" },
4867
4920
  action: {
4868
4921
  type: "sequence",
4869
4922
  actions: [
@@ -4877,6 +4930,8 @@ var tierCard3 = {
4877
4930
  },
4878
4931
  children: [
4879
4932
  {
4933
+ // .thot:top -9、字号 11、padding 2px 8px、radius 6。
4934
+ // 宽 38 = 2 字 × 11px + 左右 8px;居中靠 left: calc(50% - 19px)
4880
4935
  type: "text",
4881
4936
  rect: ["calc(50% - 19px)", -9, 38, 22],
4882
4937
  content: "\u63A8\u8350",
@@ -4888,29 +4943,41 @@ var tierCard3 = {
4888
4943
  fontWeight: "800",
4889
4944
  radius: 6,
4890
4945
  textAlign: "center",
4891
- lineHeight: 22
4946
+ lineHeight: 22,
4947
+ whiteSpace: "nowrap"
4892
4948
  }
4893
4949
  },
4894
4950
  {
4895
4951
  type: "text",
4896
4952
  rect: [0, 12, "100%", 19],
4897
4953
  content: "{{ item.p }}",
4898
- style: { fontSize: 13, color: "#8a909c", textAlign: "center" }
4954
+ style: { fontSize: 13, lineHeight: 1.45, color: "#8a909c", textAlign: "center" }
4899
4955
  },
4900
4956
  {
4901
4957
  type: "flex",
4902
- rect: [0, 34, "100%", 26],
4958
+ rect: [0, 36, "100%", 26],
4903
4959
  style: { justify: "center", align: "baseline" },
4904
4960
  children: [
4905
4961
  {
4962
+ // .tpr i:符号比数字小一号、字重 600
4906
4963
  type: "text",
4907
4964
  content: "\xA5",
4908
- style: { fontSize: 13, fontWeight: "800", color: "#1f2533" }
4965
+ style: {
4966
+ fontSize: 14,
4967
+ fontWeight: "600",
4968
+ lineHeight: 1.2,
4969
+ color: "{{ item.key == current.key ? '#d46b08' : '#1f2533' }}"
4970
+ }
4909
4971
  },
4910
4972
  {
4911
4973
  type: "text",
4912
4974
  content: "{{ item.price }}",
4913
- style: { fontSize: 21, fontWeight: "800", color: "#1f2533" }
4975
+ style: {
4976
+ fontSize: 21,
4977
+ fontWeight: "800",
4978
+ lineHeight: 1.2,
4979
+ color: "{{ item.key == current.key ? '#d46b08' : '#1f2533' }}"
4980
+ }
4914
4981
  }
4915
4982
  ]
4916
4983
  },
@@ -4918,14 +4985,21 @@ var tierCard3 = {
4918
4985
  type: "text",
4919
4986
  rect: [4, 63, "calc(100% - 8px)", 32],
4920
4987
  content: "{{ item.per }}",
4921
- style: { fontSize: 11, color: "#8a909c", textAlign: "center", lineHeight: 1.35 }
4988
+ style: {
4989
+ fontSize: 11,
4990
+ lineHeight: 1.5,
4991
+ textAlign: "center",
4992
+ color: "{{ item.key == current.key ? '#d46b08' : '#8a909c' }}",
4993
+ fontWeight: "{{ item.key == current.key ? '600' : '400' }}"
4994
+ }
4922
4995
  },
4923
4996
  {
4997
+ // .tflag 的 margin-top: auto(贴底)在绝对定位里直接写死 y = 119 - 9 - 15
4924
4998
  type: "text",
4925
- rect: [0, 98, "100%", 15],
4999
+ rect: [0, 95, "100%", 15],
4926
5000
  content: "{{ item.flag }}",
4927
5001
  visibleWhen: "item.flag != ''",
4928
- style: { fontSize: 11, color: "#8a909c", textAlign: "center" }
5002
+ style: { fontSize: 11, lineHeight: 1.35, color: "#8a909c", textAlign: "center" }
4929
5003
  }
4930
5004
  ]
4931
5005
  };
@@ -4934,13 +5008,37 @@ var quotaLow = {
4934
5008
  type: "popup",
4935
5009
  meta: { name: "\u642C\u5BB6\u6B21\u6570\u5C06\u5C3D \xB7 \u989D\u5EA6\u8FDB\u5EA6\u6761\uFF08\u590D\u523B\u8FD0\u8425 demo\uFF09" },
4936
5010
  stage: {
5011
+ // .modal.period-price-modal { width: min(520px, calc(100vw - 24px)) }
4937
5012
  width: 520,
4938
5013
  height: "auto",
4939
5014
  layout: "flow",
4940
5015
  mask: true,
4941
5016
  maskClosable: false,
4942
- closeButton: { show: true, position: "top-right", offset: [14, 14] },
4943
- style: { radius: 18 }
5017
+ closeButton: {
5018
+ // .m-close:24×24 的半透明白圆点,字符 ×、15px
5019
+ show: true,
5020
+ position: "top-right",
5021
+ offset: [14, 14],
5022
+ size: 24,
5023
+ icon: "\xD7",
5024
+ style: { background: "rgba(255,255,255,0.3)", fontSize: 15, color: "#ffffff" }
5025
+ },
5026
+ // .modal 的圆角与投影(--shadow-lg)
5027
+ style: { radius: 18, shadow: "0 28px 72px rgba(16,27,51,0.24)" },
5028
+ // demo 的 animation: pop .38s cubic-bezier(.16,1,.3,1) both
5029
+ // 注意 easing 的小数必须写成 0.16 —— 校验的正则不认 CSS 允许的 .16 简写
5030
+ animate: {
5031
+ name: "pop",
5032
+ duration: 380,
5033
+ easing: "cubic-bezier(0.16, 1, 0.3, 1)",
5034
+ fill: "both"
5035
+ }
5036
+ },
5037
+ keyframes: {
5038
+ pop: {
5039
+ from: { opacity: 0, transform: "translateY(14px) scale(0.96)" },
5040
+ to: { opacity: 1, transform: "none" }
5041
+ }
4944
5042
  },
4945
5043
  data: {
4946
5044
  // 实时统计走后端数据源。$source 填的是宿主注册过的数据源名(不是接口地址),
@@ -4948,20 +5046,11 @@ var quotaLow = {
4948
5046
  stat: { $source: "userStatistics" },
4949
5047
  // 总额度:运营按当前套餐手填。为什么不走接口、以后怎么换,见文件头注释
4950
5048
  total: 30,
5049
+ // 三条都没有状态标签 —— demo 这一屏的 lose 配置里就没有 tag 字段
4951
5050
  lose: [
4952
- { b: "\u6279\u91CF\u642C\u5BB6", tag: "\u5C06\u505C\u7528", sev: "lose", t: "\u989D\u5EA6\u5F52\u96F6\u540E\u65E0\u6CD5\u7EE7\u7EED\u4E0A\u8D27" },
4953
- {
4954
- b: "1688 \u4E00\u4EF6\u4EE3\u53D1",
4955
- tag: "\u5C06\u505C\u7528",
4956
- sev: "lose",
4957
- t: "\u6E90\u5934\u8D27\u6E90\u65AD\u4F9B\uFF0C\u9009\u54C1\u3001\u94FA\u8D27\u3001\u4EE3\u53D1\u90FD\u8981\u624B\u52A8\u505A"
4958
- },
4959
- {
4960
- b: "AI \u81EA\u52A8\u4F18\u5316",
4961
- tag: "\u5C06\u6682\u505C",
4962
- sev: "pause",
4963
- t: "\u65B0\u5546\u54C1\u4E0D\u518D\u8865\u4E3B\u6807\u9898 / \u77ED\u6807\u9898 / \u767D\u5E95\u56FE"
4964
- }
5051
+ { b: "\u6279\u91CF\u642C\u5BB6", t: "\u989D\u5EA6\u5F52\u96F6\u540E\u65E0\u6CD5\u7EE7\u7EED\u4E0A\u8D27" },
5052
+ { b: "1688 \u4E00\u4EF6\u4EE3\u53D1", t: "\u6E90\u5934\u8D27\u6E90\u65AD\u4F9B\uFF0C\u9009\u54C1\u3001\u94FA\u8D27\u3001\u4EE3\u53D1\u90FD\u8981\u624B\u52A8\u505A" },
5053
+ { b: "AI \u81EA\u52A8\u4F18\u5316", t: "\u65B0\u5546\u54C1\u4E0D\u518D\u8865\u4E3B\u6807\u9898 / \u77ED\u6807\u9898 / \u767D\u5E95\u56FE" }
4965
5054
  ],
4966
5055
  // 价格档位从后端数据源取,后端返回几档就渲染几档,配置时不用知道数量
4967
5056
  tiers: { $source: "listRenewTiers", params: { scene: "quota_low" } }
@@ -4969,118 +5058,114 @@ var quotaLow = {
4969
5058
  state: { period: 1 },
4970
5059
  derived: { current: { list: "tiers", indexBy: "period" } },
4971
5060
  nodes: [
4972
- // ===== 深色渐变头部:标签 + 2×2 成果格 =====
5061
+ // ===== .m-top 深色渐变头部:(标签 + 额度条)同排 + 2×2 成果格 =====
4973
5062
  {
4974
5063
  type: "flex",
4975
5064
  style: {
4976
5065
  direction: "column",
4977
5066
  background: "linear-gradient(135deg,#2b0f0f,#3a1414)",
4978
- padding: "20px 22px 16px",
4979
- gap: 13
5067
+ padding: "20px 22px 16px"
4980
5068
  },
4981
5069
  children: [
4982
5070
  {
4983
- type: "text",
4984
- content: "\u26A1 \u642C\u5BB6\u6B21\u6570\u5373\u5C06\u7528\u5B8C",
4985
- style: {
4986
- // 不写 alignSelf 会被 flex 列拉满整行,标签必须按内容宽度
4987
- alignSelf: "flex-start",
4988
- background: "rgba(255,255,255,0.18)",
4989
- color: "#ffffff",
4990
- fontSize: 12,
4991
- fontWeight: "700",
4992
- radius: 6,
4993
- padding: "5px 10px"
4994
- }
4995
- },
4996
- {
4997
- // 四格并列写死(扁平对象没法 bind 遍历),flex + wrap 排成 2×2。
4998
- // 第一格的数字不是统计字段,而是「总额度 − 剩余次数」现算出来的
4999
- type: "flex",
5000
- style: { gap: 9, wrap: true },
5001
- children: [
5002
- achieveCell3("\u5DF2\u7528", USED, "\u6B21", "\u642C\u5BB6\u6B21\u6570"),
5003
- achieveCell3("\u5DF2\u4E0A\u67B6", "{{ stat.move_success_count }}", "\u4E2A", "\u7D2F\u8BA1\u4E0A\u67B6\u5546\u54C1"),
5004
- achieveCell3("\u65E5\u5747", "{{ stat.avg_daily_move_count }}", "\u4E2A", "\u5E73\u5747\u6BCF\u5929\u4E0A\u67B6"),
5005
- achieveCell3(
5006
- "\u5DF2\u8865\u9F50",
5007
- "{{ stat.white_image_fill_count }}",
5008
- "\u5F20",
5009
- "\u767D\u5E95\u56FE \xB7 \u5408\u89C4\u53EF\u62A5\u6D3B\u52A8"
5010
- )
5011
- ]
5012
- }
5013
- ]
5014
- },
5015
- // ===== 白色 body =====
5016
- {
5017
- type: "flex",
5018
- style: { direction: "column", background: "#ffffff", padding: "22px 26px 24px" },
5019
- children: [
5020
- // ===== 额度进度条:轨道 + 填充条 + 百分比表达式(本示例的重点)=====
5021
- {
5071
+ // .m-top-head:右侧留 30px 给关闭按钮让位
5022
5072
  type: "flex",
5023
5073
  style: {
5024
- direction: "column",
5025
- background: "#fff8f3",
5026
- radius: 10,
5027
- padding: "8px 13px 9px",
5028
- gap: 4
5074
+ align: "center",
5075
+ justify: "space-between",
5076
+ gap: 14,
5077
+ padding: "0 30px 0 0"
5029
5078
  },
5030
5079
  children: [
5031
5080
  {
5032
- // 标题行:左边「剩余 N 次」,右边「已用 X / 总额度 次」
5081
+ // .tag:flex: none,按内容宽度,不许被额度条挤扁
5082
+ type: "text",
5083
+ content: "\u26A1 \u642C\u5BB6\u6B21\u6570\u5373\u5C06\u7528\u5B8C",
5084
+ style: {
5085
+ background: "rgba(255,255,255,0.18)",
5086
+ color: "#ffffff",
5087
+ fontSize: 12,
5088
+ fontWeight: "700",
5089
+ radius: 6,
5090
+ padding: "3px 10px",
5091
+ flexShrink: "0",
5092
+ whiteSpace: "nowrap"
5093
+ }
5094
+ },
5095
+ {
5096
+ // ===== 额度进度条(本示例的重点)。.m-top .quota 反白配色版 =====
5033
5097
  type: "flex",
5034
- style: { align: "baseline", justify: "space-between" },
5098
+ style: {
5099
+ direction: "column",
5100
+ flex: "1",
5101
+ maxWidth: 280,
5102
+ background: "rgba(255,255,255,0.12)",
5103
+ borderWidth: 1,
5104
+ borderStyle: "solid",
5105
+ borderColor: "rgba(255,255,255,0.16)",
5106
+ radius: 7,
5107
+ padding: "3px 10px 4px"
5108
+ },
5035
5109
  children: [
5036
5110
  {
5111
+ // .qh:左「搬家次数剩余」,右加粗的剩余次数
5037
5112
  type: "flex",
5038
- style: { align: "baseline", gap: 3 },
5113
+ style: { align: "baseline", justify: "space-between" },
5039
5114
  children: [
5040
5115
  {
5041
5116
  type: "text",
5042
5117
  content: "\u642C\u5BB6\u6B21\u6570\u5269\u4F59",
5043
- style: { fontSize: 12, lineHeight: 1.35, color: "#3f4656" }
5118
+ style: {
5119
+ fontSize: 10.5,
5120
+ lineHeight: 1.25,
5121
+ color: "rgba(255,255,255,0.85)"
5122
+ }
5044
5123
  },
5045
5124
  {
5046
5125
  type: "text",
5047
5126
  content: "{{ user.collectCount }} \u6B21",
5048
5127
  style: {
5049
- fontSize: 15,
5128
+ fontSize: 12.5,
5050
5129
  fontWeight: "800",
5051
- lineHeight: 1.25,
5052
- color: "#cf1322"
5130
+ lineHeight: 1.15,
5131
+ color: "#ffb066"
5132
+ }
5133
+ }
5134
+ ]
5135
+ },
5136
+ {
5137
+ // .qbar 轨道。用 flex 而不是 box —— box 的子节点走绝对定位、必须给 rect,
5138
+ // 填充条要的是「跟着父级流」;overflow: hidden 必须写,
5139
+ // 否则填充条的直角会戳出轨道的圆角外面
5140
+ type: "flex",
5141
+ style: {
5142
+ height: 3,
5143
+ radius: 4,
5144
+ background: "rgba(255,255,255,0.2)",
5145
+ margin: "2px 0 1px",
5146
+ overflow: "hidden"
5147
+ },
5148
+ children: [
5149
+ {
5150
+ // 填充条。宽度是算出来的:已用 ÷ 总额度 × 100,节点 style 里的
5151
+ // 字符串同样走插值,所以百分比不需要后端多下发一个字段
5152
+ type: "box",
5153
+ style: {
5154
+ width: "{{ (total - user.collectCount) / total * 100 }}%",
5155
+ height: "100%",
5156
+ background: "linear-gradient(90deg,#f53f3f,#ff7a45)"
5053
5157
  }
5054
5158
  }
5055
5159
  ]
5056
5160
  },
5057
5161
  {
5162
+ // .qn
5058
5163
  type: "text",
5059
5164
  content: `\u5DF2\u7528 ${USED} / {{ total }} \u6B21`,
5060
- style: { fontSize: 10.5, lineHeight: 1.35, color: "#8a909c" }
5061
- }
5062
- ]
5063
- },
5064
- {
5065
- // 轨道。用 flex 而不是 box —— box 的子节点走绝对定位、必须给 rect,
5066
- // 填充条要的是「跟着父级流」;overflow: hidden 必须写,否则填充条的
5067
- // 直角会戳出轨道的圆角外面
5068
- type: "flex",
5069
- style: {
5070
- height: 5,
5071
- radius: 4,
5072
- background: "#ffe0cc",
5073
- overflow: "hidden"
5074
- },
5075
- children: [
5076
- {
5077
- // 填充条。宽度是算出来的:已用 ÷ 总额度 × 100,节点 style 里的
5078
- // 字符串同样走插值,所以百分比不需要后端多下发一个字段
5079
- type: "box",
5080
5165
  style: {
5081
- width: "{{ (total - user.collectCount) / total * 100 }}%",
5082
- height: "100%",
5083
- background: "linear-gradient(90deg,#f53f3f,#ff7a45)"
5166
+ fontSize: 9,
5167
+ lineHeight: 1.25,
5168
+ color: "rgba(255,255,255,0.6)"
5084
5169
  }
5085
5170
  }
5086
5171
  ]
@@ -5088,17 +5173,49 @@ var quotaLow = {
5088
5173
  ]
5089
5174
  },
5090
5175
  {
5176
+ // .achieve:四格并列写死(扁平对象没法 bind 遍历),flex + wrap 复刻 2×2 grid。
5177
+ // 第一格的数字不是统计字段,而是「总额度 − 剩余次数」现算出来的
5178
+ type: "flex",
5179
+ style: { gap: 9, wrap: true, marginTop: 14 },
5180
+ children: [
5181
+ achieveCell3("\u5DF2\u7528", USED, "\u6B21", "\u642C\u5BB6\u6B21\u6570"),
5182
+ achieveCell3("\u5DF2\u4E0A\u67B6", "{{ stat.move_success_count }}", "\u4E2A", "\u7D2F\u8BA1\u4E0A\u67B6\u5546\u54C1"),
5183
+ achieveCell3("\u65E5\u5747", "{{ stat.avg_daily_move_count }}", "\u4E2A", "\u5E73\u5747\u6BCF\u5929\u4E0A\u67B6"),
5184
+ achieveCell3(
5185
+ "\u5DF2\u8865\u9F50",
5186
+ "{{ stat.white_image_fill_count }}",
5187
+ "\u5F20",
5188
+ "\u767D\u5E95\u56FE \xB7 \u5408\u89C4\u53EF\u62A5\u6D3B\u52A8"
5189
+ )
5190
+ ]
5191
+ }
5192
+ ]
5193
+ },
5194
+ // ===== .m-body 白底 =====
5195
+ {
5196
+ type: "flex",
5197
+ style: { direction: "column", background: "#ffffff", padding: "22px 26px 24px" },
5198
+ children: [
5199
+ {
5200
+ // .m-copy-panel
5091
5201
  type: "text",
5092
5202
  content: "\u642C\u5BB6\u6B21\u6570\u7528\u5B8C\uFF0C\u4EA7\u54C1\u80FD\u529B\u5C06\u53D7\u9650\uFF1A",
5093
- style: { fontSize: 15, fontWeight: "800", color: "#1f2533", marginTop: 17 }
5203
+ style: {
5204
+ fontSize: 15,
5205
+ fontWeight: "800",
5206
+ lineHeight: 1.55,
5207
+ letterSpacing: -0.15,
5208
+ color: "#1f2533"
5209
+ }
5094
5210
  },
5095
5211
  {
5212
+ // .lose
5096
5213
  type: "repeat",
5097
5214
  bind: "lose",
5098
5215
  template: loseRow3,
5099
5216
  style: {
5100
5217
  direction: "column",
5101
- marginTop: 12,
5218
+ marginTop: 14,
5102
5219
  background: "#ffe9e6",
5103
5220
  borderWidth: 1,
5104
5221
  borderStyle: "solid",
@@ -5108,13 +5225,20 @@ var quotaLow = {
5108
5225
  }
5109
5226
  },
5110
5227
  {
5228
+ // .tiers 的 border-top:白名单没有 borderTop,用 1px 实心分隔条代替
5229
+ type: "box",
5230
+ style: { height: 1, background: "#eceef3", marginTop: 18 }
5231
+ },
5232
+ {
5233
+ // .tv:lead 被 normalizeTrialPricing 置空,所以整行都在 <b> 里
5234
+ //(字重 800、墨色),后面跟价格口径标记 .tv-tag
5111
5235
  type: "flex",
5112
- style: { align: "center", gap: 8, marginTop: 17, marginBottom: 9 },
5236
+ style: { align: "center", gap: 8, marginTop: 17, marginBottom: 11 },
5113
5237
  children: [
5114
5238
  {
5115
5239
  type: "text",
5116
- content: "\u7EED\u6EE1\u989D\u5EA6 \xB7 \u9009\u62E9\u5468\u671F",
5117
- style: { fontSize: 13.5, fontWeight: "700", color: "#747b89" }
5240
+ content: "\u4E13\u5C5E\u4F18\u60E0 \xB7 \u5012\u8BA1\u65F6",
5241
+ style: { fontSize: 13.5, fontWeight: "800", color: "#1f2533" }
5118
5242
  },
5119
5243
  {
5120
5244
  type: "text",
@@ -5131,19 +5255,27 @@ var quotaLow = {
5131
5255
  }
5132
5256
  ]
5133
5257
  },
5258
+ // .tcols:wide 版 gap 8
5134
5259
  { type: "repeat", bind: "tiers", style: { gap: 8 }, template: tierCard3 },
5135
5260
  {
5261
+ // .m-cta(th-loss 主题的红橙渐变)
5136
5262
  type: "flex",
5137
5263
  style: {
5138
5264
  justify: "center",
5139
- align: "center",
5265
+ align: "baseline",
5140
5266
  gap: 5,
5141
- height: 52,
5267
+ padding: "13px",
5142
5268
  radius: 11,
5143
5269
  background: "linear-gradient(90deg,#f53f3f,#ff7a45)",
5144
- marginTop: 15,
5270
+ marginTop: 20,
5271
+ shadow: "0 8px 18px rgba(245,63,63,0.14)",
5272
+ transition: "transform 0.18s, box-shadow 0.18s",
5145
5273
  cursor: "pointer"
5146
5274
  },
5275
+ hoverStyle: {
5276
+ transform: "translateY(-1px)",
5277
+ shadow: "0 10px 22px rgba(245,63,63,0.2)"
5278
+ },
5147
5279
  action: {
5148
5280
  type: "sequence",
5149
5281
  actions: [
@@ -5157,11 +5289,18 @@ var quotaLow = {
5157
5289
  },
5158
5290
  children: [
5159
5291
  {
5292
+ // .m-cta .ct
5160
5293
  type: "text",
5161
5294
  content: "\u7EED\u6EE1\u989D\u5EA6 \xB7",
5162
- style: { fontSize: 14, fontWeight: "800", color: "#ffffff" }
5295
+ style: {
5296
+ fontSize: 14,
5297
+ fontWeight: "800",
5298
+ letterSpacing: -0.2,
5299
+ color: "#ffffff"
5300
+ }
5163
5301
  },
5164
5302
  {
5303
+ // .m-cta .cp —— demo 的 syncCTAPrice() 把它同步成「选中档位名 + 价格」
5165
5304
  type: "text",
5166
5305
  content: "{{ current.p }} \xA5{{ current.price }}",
5167
5306
  style: { fontSize: 16.5, fontWeight: "800", color: "#ffffff" }
@@ -5169,13 +5308,14 @@ var quotaLow = {
5169
5308
  ]
5170
5309
  },
5171
5310
  {
5311
+ // .m-ghost
5172
5312
  type: "text",
5173
5313
  content: "\u5347\u7EA7\u6216\u67E5\u770B\u66F4\u591A\u4EA7\u54C1\u5957\u9910",
5174
5314
  style: {
5175
- fontSize: 12.5,
5315
+ fontSize: 12,
5176
5316
  color: "#8a909c",
5177
5317
  textAlign: "center",
5178
- marginTop: 11,
5318
+ marginTop: 10,
5179
5319
  cursor: "pointer"
5180
5320
  },
5181
5321
  action: { type: "track", event: "popup_more_plans" }
@@ -5310,10 +5450,17 @@ var imageHotspot = {
5310
5450
  id: "hotspot-never",
5311
5451
  type: "box",
5312
5452
  // 最底部「不再提醒」,动作是关弹窗而不是跳转。
5313
- // reason 上报给后端,后端据此不再下发这条物料——不需要写本地存储
5453
+ // dismissForever 写本地标记让它前端立刻不再出现,close 才是真正关掉这一层;
5454
+ // reason 一并上报,后端据此决定以后还下不下发
5314
5455
  rect: ["30%", 478, "40%", 26],
5315
5456
  style: { radius: 13, background: HOTSPOT_BG, cursor: "pointer" },
5316
- action: { type: "close", reason: "user-dismiss" }
5457
+ action: {
5458
+ type: "sequence",
5459
+ actions: [
5460
+ { type: "call", name: "dismissForever" },
5461
+ { type: "close", reason: "dismiss-forever" }
5462
+ ]
5463
+ }
5317
5464
  }
5318
5465
  ]
5319
5466
  };
@@ -5393,7 +5540,9 @@ var noticeBar = {
5393
5540
  type: "sequence",
5394
5541
  actions: [
5395
5542
  { type: "track", event: "notice_close", params: { notice: "guide" } },
5396
- { type: "close", reason: "user-dismiss" }
5543
+ // 行末的 × 只是「这次关掉」,不写本地标记:下次进页面它还该出现。
5544
+ // 要「以后别再出现」得另放一个按钮,配 dismissForever(见 action 章节)
5545
+ { type: "close", reason: "user-close" }
5397
5546
  ]
5398
5547
  }
5399
5548
  }
@@ -5628,7 +5777,8 @@ function checklistSection() {
5628
5777
  \u6709\u4E00\u4E2A\u4E0D\u5408\u89C4\uFF0C\u6574\u4EFD\u914D\u7F6E\u5C31\u5B58\u4E0D\u4E0A
5629
5778
  - [ ] \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 }}"\`
5630
5779
  - [ ] \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
5631
- - [ ] \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\`
5780
+ - [ ] \u6BCF\u4E2A \`call\` \u7684 \`name\` \u90FD\u662F\u5BBF\u4E3B\u5DF2\u6CE8\u518C\u7684\u65B9\u6CD5\uFF08\u5F53\u524D\u53EA\u6709 \`dismissToday\` / \`dismissForever\`\uFF09\uFF0C\u6CA1\u6709\u81EA\u5DF1\u53D1\u660E\u7684\u540D\u5B57\u2014\u2014\u5199\u4E86\u6CA1\u6CE8\u518C\u7684\u540D\u5B57\u90A3\u4E00\u6B65\u9759\u9ED8\u5931\u6548
5781
+ - [ ] \u914D\u4E86\u300C\u4ECA\u65E5\u4E0D\u518D\u63D0\u793A\u300D/\u300C\u4E0D\u518D\u63D0\u793A\u300D\u7684\u8BDD\uFF1A\`call\` \u540E\u9762**\u8DDF\u7740 \`close\`**\uFF08\u8FD9\u4E24\u4E2A\u65B9\u6CD5\u53EA\u5199\u6807\u8BB0\u3001\u4E0D\u5173\u95ED\uFF0C\u6F0F\u4E86 \`close\` \u7528\u6237\u70B9\u5B8C\u5F39\u7A97\u8FD8\u5728\uFF09\uFF0C\u4E14 \`close\` \u5E26\u4E0A \`reason\`
5632
5782
  - [ ] \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
5633
5783
  - [ ] \u88C5\u9970\u6027\u56FE\u5C42\uFF08\u5149\u6655\u3001\u626B\u5149\u3001\u5149\u70B9\uFF09\u90FD\u5199\u4E86 \`"pointerEvents": "none"\`
5634
5784
  - [ ] \u8F93\u51FA\u7684\u662F\u5408\u6CD5 JSON\uFF08\u6CA1\u6709\u591A\u4F59\u9017\u53F7\u3001\u6CA1\u6709\u6CE8\u91CA\uFF09`;
@@ -5668,8 +5818,11 @@ function actionSection() {
5668
5818
  - \`setState\`\uFF1A\`{ "type": "setState", "key": "period", "value": "{{ index }}" }\` \u505A\u9009\u4E2D\u5207\u6362
5669
5819
  - \`close\`\uFF1A\u5173\u6389\u5F53\u524D\u8FD9\u4E00\u5C42\uFF08\u53EA\u6709\u4E00\u5C42\u65F6\u5C31\u662F\u6574\u4F53\u5173\u95ED\uFF09\u3002\u6CE8\u610F\u5B83\u53EA\u662F**\u901A\u77E5\u5BBF\u4E3B\u9875\u9762**\u300C\u7528\u6237\u60F3\u5173\u4E86\u300D\uFF0C\u7531\u5BBF\u4E3B\u51B3\u5B9A\u5173\u4E0D\u5173\uFF1B\u591A\u89C6\u56FE\u65F6\u5173\u5185\u5C42\u4E0D\u4F1A\u901A\u77E5\u5BBF\u4E3B\uFF0C\u53EA\u662F\u56DE\u5230\u4E0B\u9762\u90A3\u5C42
5670
5820
  - \`closeAll\`\uFF1A\u51E0\u5C42\u90FD\u5173\u6389\uFF0C\u4E00\u5B9A\u4F1A\u901A\u77E5\u5BBF\u4E3B
5671
- - \u60F3\u300C\u5173\u4E86\u5C31\u522B\u518D\u51FA\u73B0\u300D\uFF0C\u5C31\u5199 \`{ "type": "close", "reason": "user-dismiss" }\`\u3002\u4E0A\u62A5\u51FA\u53BB\u662F \`{ "event": "close", "reason": "user-dismiss" }\`\uFF0C\u540E\u7AEF\u636E\u6B64\u6C38\u4E45\u538B\u5236\u8FD9\u6761\u7269\u6599\u3002**\u4E0D\u8981**\u518D\u914D \`call\` \u8BA9\u5BBF\u4E3B\u5199\u672C\u5730\u5B58\u50A8\u2014\u2014\u9891\u63A7\u7531\u540E\u7AEF\u7B97\uFF0C\u524D\u7AEF\u5B58\u7684\u4F9D\u636E\u540E\u7AEF\u770B\u4E0D\u89C1\uFF0C\u800C\u4E14\u6362\u8BBE\u5907\u3001\u6E05\u7F13\u5B58\u5C31\u6CA1\u4E86
5672
- - \`call\`\uFF1A**\u8BA9\u5BBF\u4E3B\u53BB\u505A\u4E00\u4EF6\u4E8B**\uFF08\u5524\u8D77\u5145\u503C\u5F39\u7A97\u3001\u6253\u5F00\u5BA2\u670D\u4F1A\u8BDD\u3001\u590D\u5236\u5230\u526A\u8D34\u677F\u3001\u8DF3\u8F6C\u5E94\u7528\u5185\u7279\u5B9A\u9875\u9762\uFF09\u3002\u5224\u65AD\u6807\u51C6\uFF1A**\u8FD9\u4EF6\u4E8B\u540E\u7AEF\u9700\u4E0D\u9700\u8981\u77E5\u9053**\u2014\u2014\u9700\u8981\u5C31\u8D70\u4E0A\u62A5\uFF08\`close\` \u7684 \`reason\` \u6216 \`track\`\uFF09\uFF0C\u7EAF\u672C\u5730\u52A8\u4F5C\u624D\u7528 \`call\`\u3002\u7EDD\u4E0D\u7528 \`call\` \u8BB0\u5F55\u7528\u6237\u610F\u56FE\u6216\u5199\u672C\u5730\u5B58\u50A8
5821
+ - \`call\`\uFF1A**\u8BA9\u5BBF\u4E3B\u53BB\u505A\u4E00\u4EF6\u5DF2\u6CE8\u518C\u7684\u4E8B**\u3002\u540D\u5B57\u53EA\u80FD\u4ECE\u5BBF\u4E3B\u6CE8\u518C\u7684\u6E05\u5355\u91CC\u9009\uFF0C\u5199\u4E86\u6CA1\u6CE8\u518C\u7684\u540D\u5B57\u90A3\u4E00\u6B65\u9759\u9ED8\u5931\u6548\uFF08\u7269\u6599\u7167\u5E38\u663E\u793A\uFF0C\u6309\u94AE\u70B9\u4E86\u6CA1\u53CD\u5E94\uFF09\uFF0C\u6240\u4EE5\u4E0D\u8981\u81EA\u5DF1\u53D1\u660E\u65B9\u6CD5\u540D
5822
+ - \u300C\u4ECA\u65E5\u4E0D\u518D\u63D0\u793A\u300D/\u300C\u4E0D\u518D\u63D0\u793A\u300D\u7528\u73B0\u6210\u7684\u4E24\u4E2A\u65B9\u6CD5\uFF1A\`dismissToday\` / \`dismissForever\`\u3002**\u5B83\u4EEC\u53EA\u5199\u6807\u8BB0\u3001\u4E0D\u5173\u95ED**\uFF0C\`close\` \u5FC5\u987B\u81EA\u5DF1\u914D\u5728\u540E\u9762\uFF1A
5823
+ \`{ "type": "sequence", "actions": [{ "type": "call", "name": "dismissToday" }, { "type": "close", "reason": "dismiss-today" }] }\`
5824
+ \uFF08\u6C38\u4E45\u7248\u628A\u4E24\u5904\u5206\u522B\u6362\u6210 \`dismissForever\` \u548C \`"dismiss-forever"\`\uFF09
5825
+ - \u8FD9\u4E24\u4E2A\u65B9\u6CD5\u7684\u8BB0\u5F55**\u5B58\u5728\u7528\u6237\u6D4F\u89C8\u5668\u672C\u5730\u3001\u6309\u767B\u5F55\u8D26\u53F7\u9694\u79BB**\uFF0C\u6362\u8BBE\u5907 / \u6E05\u7F13\u5B58\u5C31\u5931\u6548\u2014\u2014\u662F\u300C\u5C11\u70E6\u6211\u4E00\u4E0B\u300D\u7684\u4F53\u9A8C\u4F18\u5316\uFF0C\u4E0D\u662F\u540E\u7AEF\u6C38\u4E45\u538B\u5236\u8FD9\u6761\u6295\u653E\u7684\u51ED\u636E\u3002\u6240\u4EE5 \`close\` \u7684 \`reason\` \u7167\u65E7\u8981\u5199\uFF0C\u90A3\u662F\u540E\u7AEF\u552F\u4E00\u770B\u5F97\u5230\u7684\u300C\u7528\u6237\u4E3A\u4EC0\u4E48\u5173\u300D
5673
5826
  - \`open\`\uFF1A\u6253\u5F00\u53E6\u4E00\u4E2A\u89C6\u56FE\uFF0C\u89C1\u4E0B\u4E00\u8282
5674
5827
  - \u4EFB\u4F55\u8282\u70B9\u52A0 \`action\` \u90FD\u80FD\u70B9\u51FB
5675
5828
  - **\u6BCF\u4E2A\u53EF\u70B9\u51FB\u5143\u7D20\u90FD\u5E94\u8BE5\u914D \`track\`**\uFF0C\u5426\u5219\u6CA1\u6709\u6570\u636E\u53EF\u770B
@@ -5738,7 +5891,7 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6
5738
5891
  ] } }
5739
5892
  \`\`\`
5740
5893
 
5741
- \`close\` \u53EA\u901A\u77E5\u5BBF\u4E3B\u300C\u8FD9\u4E00\u6B21\u5173\u4E0D\u5173\u300D\uFF1B\u300C\u4EE5\u540E\u8FD8\u51FA\u4E0D\u51FA\u300D\u7531\u540E\u7AEF\u6309\u4E0A\u62A5\u7684 \`reason\` \u51B3\u5B9A\uFF0C\u6240\u4EE5 \`reason: "user-dismiss"\` \u5C31\u591F\u4E86\uFF0C\u4E0D\u8981\u518D\u914D \`call\`\u3002
5894
+ \`close\` \u53EA\u901A\u77E5\u5BBF\u4E3B\u300C\u8FD9\u4E00\u6B21\u5173\u4E0D\u5173\u300D\uFF1B\`reason\` \u4F1A\u539F\u6837\u4E0A\u62A5\uFF0C\u540E\u7AEF\u636E\u6B64\u5224\u65AD\u300C\u4EE5\u540E\u8FD8\u51FA\u4E0D\u51FA\u300D\u3002\u60F3\u8BA9\u5B83\u5728\u524D\u7AEF\u4E5F\u7ACB\u523B\u4E0D\u518D\u51FA\u73B0\uFF0C\u5728 \`close\` \u4E4B\u524D\u52A0\u4E00\u6761 \`{ "type": "call", "name": "dismissToday" }\`\uFF08\u6216 \`dismissForever\`\uFF09\u3002
5742
5895
  \u6574\u6761\u53EF\u70B9 + \u884C\u672B \xD7 \u4E0D\u4F1A\u51B2\u7A81\uFF1A\u5185\u5C42\u6709\u81EA\u5DF1\u7684 \`action\` \u5C31\u4E0D\u518D\u5192\u6CE1\u7ED9\u5916\u5C42\u3002`;
5743
5896
  }
5744
5897
  function viewsSection() {