@yaoxiu/marketing-dsl 2.6.1 → 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
  };
@@ -5411,10 +5450,17 @@ var imageHotspot = {
5411
5450
  id: "hotspot-never",
5412
5451
  type: "box",
5413
5452
  // 最底部「不再提醒」,动作是关弹窗而不是跳转。
5414
- // reason 上报给后端,后端据此不再下发这条物料——不需要写本地存储
5453
+ // dismissForever 写本地标记让它前端立刻不再出现,close 才是真正关掉这一层;
5454
+ // reason 一并上报,后端据此决定以后还下不下发
5415
5455
  rect: ["30%", 478, "40%", 26],
5416
5456
  style: { radius: 13, background: HOTSPOT_BG, cursor: "pointer" },
5417
- 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
+ }
5418
5464
  }
5419
5465
  ]
5420
5466
  };
@@ -5494,7 +5540,9 @@ var noticeBar = {
5494
5540
  type: "sequence",
5495
5541
  actions: [
5496
5542
  { type: "track", event: "notice_close", params: { notice: "guide" } },
5497
- { type: "close", reason: "user-dismiss" }
5543
+ // 行末的 × 只是「这次关掉」,不写本地标记:下次进页面它还该出现。
5544
+ // 要「以后别再出现」得另放一个按钮,配 dismissForever(见 action 章节)
5545
+ { type: "close", reason: "user-close" }
5498
5546
  ]
5499
5547
  }
5500
5548
  }
@@ -5729,7 +5777,8 @@ function checklistSection() {
5729
5777
  \u6709\u4E00\u4E2A\u4E0D\u5408\u89C4\uFF0C\u6574\u4EFD\u914D\u7F6E\u5C31\u5B58\u4E0D\u4E0A
5730
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 }}"\`
5731
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
5732
- - [ ] \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\`
5733
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
5734
5783
  - [ ] \u88C5\u9970\u6027\u56FE\u5C42\uFF08\u5149\u6655\u3001\u626B\u5149\u3001\u5149\u70B9\uFF09\u90FD\u5199\u4E86 \`"pointerEvents": "none"\`
5735
5784
  - [ ] \u8F93\u51FA\u7684\u662F\u5408\u6CD5 JSON\uFF08\u6CA1\u6709\u591A\u4F59\u9017\u53F7\u3001\u6CA1\u6709\u6CE8\u91CA\uFF09`;
@@ -5769,8 +5818,11 @@ function actionSection() {
5769
5818
  - \`setState\`\uFF1A\`{ "type": "setState", "key": "period", "value": "{{ index }}" }\` \u505A\u9009\u4E2D\u5207\u6362
5770
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
5771
5820
  - \`closeAll\`\uFF1A\u51E0\u5C42\u90FD\u5173\u6389\uFF0C\u4E00\u5B9A\u4F1A\u901A\u77E5\u5BBF\u4E3B
5772
- - \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
5773
- - \`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
5774
5826
  - \`open\`\uFF1A\u6253\u5F00\u53E6\u4E00\u4E2A\u89C6\u56FE\uFF0C\u89C1\u4E0B\u4E00\u8282
5775
5827
  - \u4EFB\u4F55\u8282\u70B9\u52A0 \`action\` \u90FD\u80FD\u70B9\u51FB
5776
5828
  - **\u6BCF\u4E2A\u53EF\u70B9\u51FB\u5143\u7D20\u90FD\u5E94\u8BE5\u914D \`track\`**\uFF0C\u5426\u5219\u6CA1\u6709\u6570\u636E\u53EF\u770B
@@ -5839,7 +5891,7 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6
5839
5891
  ] } }
5840
5892
  \`\`\`
5841
5893
 
5842
- \`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
5843
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`;
5844
5896
  }
5845
5897
  function viewsSection() {
@@ -166,23 +166,45 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6`
166
166
  tone: "info",
167
167
  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"
168
168
  },
169
- { t: "h3", text: "\u300C\u4E0D\u518D\u63D0\u9192\u300D\u5C31\u5199 close \u7684 reason\uFF0C\u4E0D\u8981\u914D call" },
169
+ { t: "h3", text: "\u300C\u4ECA\u65E5\u4E0D\u518D\u63D0\u793A\u300D/\u300C\u4E0D\u518D\u63D0\u793A\u300D\uFF1AdismissToday / dismissForever" },
170
170
  {
171
171
  t: "p",
172
- 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"
172
+ 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"
173
173
  },
174
174
  {
175
175
  t: "code",
176
- code: `{ "type": "close", "reason": "user-dismiss" }`
176
+ code: `// \u300C\u4ECA\u65E5\u4E0D\u518D\u63D0\u793A\u300D\u6309\u94AE\uFF1A\u5148\u5199\u6807\u8BB0\uFF0C\u518D\u5173\u6389\u8FD9\u4E00\u5C42
177
+ "action": {
178
+ "type": "sequence",
179
+ "actions": [
180
+ { "type": "call", "name": "dismissToday" },
181
+ { "type": "close", "reason": "dismiss-today" }
182
+ ]
183
+ }
184
+
185
+ // \u300C\u4E0D\u518D\u63D0\u793A\u300D\u6309\u94AE\uFF1A\u540C\u6837\u4E24\u6B65
186
+ "action": {
187
+ "type": "sequence",
188
+ "actions": [
189
+ { "type": "call", "name": "dismissForever" },
190
+ { "type": "close", "reason": "dismiss-forever" }
191
+ ]
192
+ }`
177
193
  },
178
194
  {
179
- t: "p",
180
- 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'
195
+ t: "note",
196
+ tone: "warn",
197
+ 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"
181
198
  },
182
199
  {
183
200
  t: "note",
184
201
  tone: "warn",
185
- 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"
202
+ 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"
203
+ },
204
+ {
205
+ t: "note",
206
+ tone: "info",
207
+ 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"
186
208
  },
187
209
  { t: "h3", text: "call \u7684\u9002\u7528\u8FB9\u754C" },
188
210
  {
@@ -194,15 +216,15 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6`
194
216
  head: ["\u2705 \u8BE5\u7528 call", "\u274C \u4E0D\u8BE5\u7528 call"],
195
217
  rows: [
196
218
  [
197
- "\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",
198
- "\u8BB0\u5F55\u7528\u6237\u610F\u56FE\u3001\u5199\u672C\u5730\u5B58\u50A8"
219
+ "\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",
220
+ "\u8BA9\u5BBF\u4E3B\u505A\u4E00\u4EF6\u5B83\u6CA1\u6CE8\u518C\u8FC7\u7684\u4E8B"
199
221
  ]
200
222
  ]
201
223
  },
202
224
  {
203
225
  t: "note",
204
226
  tone: "info",
205
- 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"
227
+ 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"
206
228
  },
207
229
  { t: "h3", text: "\u66DD\u5149\u548C\u5173\u95ED\u4E5F\u8981\u57CB\u70B9\uFF1Astage.onShow / stage.onClose" },
208
230
  {
@@ -266,7 +288,7 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6`
266
288
  {
267
289
  t: "note",
268
290
  tone: "info",
269
- 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'
291
+ 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'
270
292
  },
271
293
  {
272
294
  t: "note",
@@ -2723,7 +2745,8 @@ var noticeToPopup = {
2723
2745
  fontSize: 13,
2724
2746
  cursor: "pointer"
2725
2747
  },
2726
- action: { type: "close", reason: "user-dismiss" }
2748
+ // 公告条行末的关闭只管「这一次」,不写本地标记
2749
+ action: { type: "close", reason: "user-close" }
2727
2750
  }
2728
2751
  ]
2729
2752
  }
@@ -3090,12 +3113,14 @@ var confirmAndSwitch = {
3090
3113
  cursor: "pointer"
3091
3114
  },
3092
3115
  // 确认后整个关掉,两层一起消失。
3093
- // 「不再提醒」的意图靠 reason 上报给后端,不配 call 写本地存储
3116
+ // 标记写在这一步而不是上一层的「不再提醒」按钮上:
3117
+ // 那个按钮只是打开二次确认,用户还可能反悔,真正的意图在这里才确定
3094
3118
  action: {
3095
3119
  type: "sequence",
3096
3120
  actions: [
3097
3121
  { type: "track", event: "popup_never_remind_confirm" },
3098
- { type: "closeAll", reason: "user-dismiss" }
3122
+ { type: "call", name: "dismissForever" },
3123
+ { type: "closeAll", reason: "dismiss-forever" }
3099
3124
  ]
3100
3125
  },
3101
3126
  children: [
@@ -3431,8 +3456,15 @@ var imageBanner = {
3431
3456
  fontSize: 12,
3432
3457
  cursor: "pointer"
3433
3458
  },
3434
- // 「不再提醒」写在 close 的 reason 上,上报给后端即可,不配 call 写本地存储
3435
- action: { type: "close", reason: "user-dismiss" }
3459
+ // 「不再提醒」两步走:先调宿主的 dismissForever 写本地标记(前端立刻不再展示),
3460
+ // close 关掉;reason 照旧上报给后端,那是后端唯一看得到的「为什么关」
3461
+ action: {
3462
+ type: "sequence",
3463
+ actions: [
3464
+ { type: "call", name: "dismissForever" },
3465
+ { type: "close", reason: "dismiss-forever" }
3466
+ ]
3467
+ }
3436
3468
  }
3437
3469
  ]
3438
3470
  }
@@ -3540,8 +3572,15 @@ function createDrawerBanner(options) {
3540
3572
  fontSize: 9,
3541
3573
  cursor: "pointer"
3542
3574
  },
3543
- // 「不再提醒」写在 close reason 上,上报给后端即可,不配 call 写本地存储
3544
- action: { type: "close", reason: "user-dismiss" }
3575
+ // 「不再提醒」两步走:dismissForever 写本地标记 + close 关掉,缺一不可
3576
+ // (这两个方法只写标记、不关闭)
3577
+ action: {
3578
+ type: "sequence",
3579
+ actions: [
3580
+ { type: "call", name: "dismissForever" },
3581
+ { type: "close", reason: "dismiss-forever" }
3582
+ ]
3583
+ }
3545
3584
  }
3546
3585
  ]
3547
3586
  };
@@ -5250,10 +5289,17 @@ var imageHotspot = {
5250
5289
  id: "hotspot-never",
5251
5290
  type: "box",
5252
5291
  // 最底部「不再提醒」,动作是关弹窗而不是跳转。
5253
- // reason 上报给后端,后端据此不再下发这条物料——不需要写本地存储
5292
+ // dismissForever 写本地标记让它前端立刻不再出现,close 才是真正关掉这一层;
5293
+ // reason 一并上报,后端据此决定以后还下不下发
5254
5294
  rect: ["30%", 478, "40%", 26],
5255
5295
  style: { radius: 13, background: HOTSPOT_BG, cursor: "pointer" },
5256
- action: { type: "close", reason: "user-dismiss" }
5296
+ action: {
5297
+ type: "sequence",
5298
+ actions: [
5299
+ { type: "call", name: "dismissForever" },
5300
+ { type: "close", reason: "dismiss-forever" }
5301
+ ]
5302
+ }
5257
5303
  }
5258
5304
  ]
5259
5305
  };
@@ -5333,7 +5379,9 @@ var noticeBar = {
5333
5379
  type: "sequence",
5334
5380
  actions: [
5335
5381
  { type: "track", event: "notice_close", params: { notice: "guide" } },
5336
- { type: "close", reason: "user-dismiss" }
5382
+ // 行末的 × 只是「这次关掉」,不写本地标记:下次进页面它还该出现。
5383
+ // 要「以后别再出现」得另放一个按钮,配 dismissForever(见 action 章节)
5384
+ { type: "close", reason: "user-close" }
5337
5385
  ]
5338
5386
  }
5339
5387
  }
@@ -5568,7 +5616,8 @@ function checklistSection() {
5568
5616
  \u6709\u4E00\u4E2A\u4E0D\u5408\u89C4\uFF0C\u6574\u4EFD\u914D\u7F6E\u5C31\u5B58\u4E0D\u4E0A
5569
5617
  - [ ] \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 }}"\`
5570
5618
  - [ ] \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
5571
- - [ ] \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\`
5619
+ - [ ] \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
5620
+ - [ ] \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\`
5572
5621
  - [ ] \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
5573
5622
  - [ ] \u88C5\u9970\u6027\u56FE\u5C42\uFF08\u5149\u6655\u3001\u626B\u5149\u3001\u5149\u70B9\uFF09\u90FD\u5199\u4E86 \`"pointerEvents": "none"\`
5574
5623
  - [ ] \u8F93\u51FA\u7684\u662F\u5408\u6CD5 JSON\uFF08\u6CA1\u6709\u591A\u4F59\u9017\u53F7\u3001\u6CA1\u6709\u6CE8\u91CA\uFF09`;
@@ -5608,8 +5657,11 @@ function actionSection() {
5608
5657
  - \`setState\`\uFF1A\`{ "type": "setState", "key": "period", "value": "{{ index }}" }\` \u505A\u9009\u4E2D\u5207\u6362
5609
5658
  - \`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
5610
5659
  - \`closeAll\`\uFF1A\u51E0\u5C42\u90FD\u5173\u6389\uFF0C\u4E00\u5B9A\u4F1A\u901A\u77E5\u5BBF\u4E3B
5611
- - \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
5612
- - \`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
5660
+ - \`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
5661
+ - \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
5662
+ \`{ "type": "sequence", "actions": [{ "type": "call", "name": "dismissToday" }, { "type": "close", "reason": "dismiss-today" }] }\`
5663
+ \uFF08\u6C38\u4E45\u7248\u628A\u4E24\u5904\u5206\u522B\u6362\u6210 \`dismissForever\` \u548C \`"dismiss-forever"\`\uFF09
5664
+ - \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
5613
5665
  - \`open\`\uFF1A\u6253\u5F00\u53E6\u4E00\u4E2A\u89C6\u56FE\uFF0C\u89C1\u4E0B\u4E00\u8282
5614
5666
  - \u4EFB\u4F55\u8282\u70B9\u52A0 \`action\` \u90FD\u80FD\u70B9\u51FB
5615
5667
  - **\u6BCF\u4E2A\u53EF\u70B9\u51FB\u5143\u7D20\u90FD\u5E94\u8BE5\u914D \`track\`**\uFF0C\u5426\u5219\u6CA1\u6709\u6570\u636E\u53EF\u770B
@@ -5678,7 +5730,7 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6
5678
5730
  ] } }
5679
5731
  \`\`\`
5680
5732
 
5681
- \`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
5733
+ \`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
5682
5734
  \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`;
5683
5735
  }
5684
5736
  function viewsSection() {
package/dist/index.cjs CHANGED
@@ -2315,12 +2315,15 @@ function formatIssues(issues) {
2315
2315
 
2316
2316
  // src/host-capabilities.ts
2317
2317
  var HOST_SOURCE_NAMES = ["userStatistics", "listRenewTiers"];
2318
- var HOST_HANDLER_NAMES = [];
2318
+ var HOST_HANDLER_NAMES = ["dismissToday", "dismissForever"];
2319
2319
  var HOST_SOURCE_LABELS = {
2320
2320
  userStatistics: "\u7528\u6237\u6570\u636E\u7EDF\u8BA1\uFF08\u7D2F\u8BA1\u642C\u5BB6\u6570 / \u6B21\u6570\u4F59\u989D / AI \u4F18\u5316\u6B21\u6570\u7B49\uFF0C\u6241\u5E73\u5BF9\u8C61\uFF0C\u5B57\u6BB5\u540D\u4E3A\u540E\u7AEF snake_case\uFF09",
2321
2321
  listRenewTiers: "\u7EED\u8D39\u4EF7\u683C\u6863\u4F4D\u5217\u8868\uFF08\u6708\u4ED8/\u5B63\u4ED8/\u534A\u5E74/\u5E74\u4ED8\uFF0C\u542B\u4E0B\u5355\u5730\u5740\uFF09"
2322
2322
  };
2323
- var HOST_HANDLER_LABELS = {};
2323
+ var HOST_HANDLER_LABELS = {
2324
+ dismissToday: "\u4ECA\u65E5\u4E0D\u518D\u63D0\u793A\uFF1A\u628A\u8FD9\u6761\u7269\u6599\u6807\u8BB0\u4E3A\u300C\u4ECA\u5929\u4E0D\u518D\u5C55\u793A\u300D\uFF08\u524D\u7AEF\u672C\u5730\u8BB0\u5F55\uFF0C\u6309\u767B\u5F55\u8D26\u53F7\u9694\u79BB\uFF0C\u8DE8\u8BBE\u5907\u4E0D\u540C\u6B65\uFF1B\u53EA\u5199\u6807\u8BB0\u4E0D\u5173\u95ED\uFF0C\u8981\u5173\u5F97\u81EA\u5DF1\u518D\u914D\u4E00\u4E2A close\uFF09",
2325
+ dismissForever: "\u4E0D\u518D\u63D0\u793A\uFF1A\u628A\u8FD9\u6761\u7269\u6599\u6807\u8BB0\u4E3A\u300C\u6C38\u4E45\u4E0D\u518D\u5C55\u793A\u300D\uFF08\u524D\u7AEF\u672C\u5730\u8BB0\u5F55\uFF0C\u6309\u767B\u5F55\u8D26\u53F7\u9694\u79BB\uFF0C\u8DE8\u8BBE\u5907\u4E0D\u540C\u6B65\uFF1B\u53EA\u5199\u6807\u8BB0\u4E0D\u5173\u95ED\uFF0C\u8981\u5173\u5F97\u81EA\u5DF1\u518D\u914D\u4E00\u4E2A close\uFF09"
2326
+ };
2324
2327
  function isRegisteredHostSource(name) {
2325
2328
  return HOST_SOURCE_NAMES.indexOf(name) > -1;
2326
2329
  }
package/dist/index.d.cts CHANGED
@@ -144,7 +144,8 @@ declare function validateUserFields(dsl: unknown, allowed: string[]): FieldIssue
144
144
  * 它是「**前台宿主实际注册了什么**」的事实记录,**不是** core 的能力声明。
145
145
  * core 本身对数据源名一无所知:运行时只认宿主创建 runtime 时传进来的 `sources` /
146
146
  * `handlers` 对象,查不到名字就抛 `unknown-source`、整份物料静默白屏
147
- * (不报错、什么都不画,投到线上才发现)。
147
+ * (不报错、什么都不画,投到线上才发现);`call` 查不到 handler 则抛 `unknown-handler`,
148
+ * 该动作静默失效(物料照常显示,但按钮点了没反应)。
148
149
  *
149
150
  * 【为什么放在 core 里】
150
151
  * 因为前台(move-front,注册表在 `components-business/marketing/sources.ts`)与
@@ -172,11 +173,14 @@ type HostSourceName = (typeof HOST_SOURCE_NAMES)[number];
172
173
  /**
173
174
  * 前台已注册的**宿主方法名**(DSL 里 `{ type: 'call', name: 'xxx' }` 的 `name`)。
174
175
  *
175
- * 当前**确实一个都没注册**,空名单是真实状态、不是占位:
176
- * 运营在 DSL 里写任何 `call` 都会白屏,后台据此照常告警。
176
+ * 当前两个都是「不再提示」类的本地记账:写一条本地标记,让这条物料下次不再进坑位。
177
+ * **标记与关闭是两回事**——handler 只写标记、不关闭,这一次关不关由运营在
178
+ * `sequence` 里自己配 `close` 决定(也因此留出了「勾选框」式交互的可能)。
179
+ *
180
+ * 用 `as const` 是为了推导出 {@link HostHandlerName} 联合类型,供前台约束注册表。
177
181
  */
178
- declare const HOST_HANDLER_NAMES: readonly string[];
179
- /** 宿主方法名的联合类型(当前名单为空,故为 `never`) */
182
+ declare const HOST_HANDLER_NAMES: readonly ["dismissToday", "dismissForever"];
183
+ /** 宿主方法名的联合类型,前台注册表以它为键,漏注册一个就编译不过 */
180
184
  type HostHandlerName = (typeof HOST_HANDLER_NAMES)[number];
181
185
  /**
182
186
  * 数据源的中文含义。后台告警文案、运营看的能力清单共用一份,避免说明各写各的。
@@ -184,8 +188,12 @@ type HostHandlerName = (typeof HOST_HANDLER_NAMES)[number];
184
188
  * 键必须覆盖 {@link HOST_SOURCE_NAMES} 的全部名字(有单测钉死)。
185
189
  */
186
190
  declare const HOST_SOURCE_LABELS: Record<HostSourceName, string>;
187
- /** 宿主方法的中文含义,键覆盖 {@link HOST_HANDLER_NAMES}(当前为空对象) */
188
- declare const HOST_HANDLER_LABELS: Record<string, string>;
191
+ /**
192
+ * 宿主方法的中文含义。后台告警文案、运营看的能力清单共用一份。
193
+ *
194
+ * 键必须覆盖 {@link HOST_HANDLER_NAMES} 的全部名字(有单测钉死)。
195
+ */
196
+ declare const HOST_HANDLER_LABELS: Record<HostHandlerName, string>;
189
197
  /**
190
198
  * 判断一个数据源名是否已被前台注册。
191
199
  *
@@ -197,7 +205,7 @@ declare function isRegisteredHostSource(name: string): boolean;
197
205
  * 判断一个宿主方法名是否已被前台注册。
198
206
  *
199
207
  * @param name 待判断的名字,通常来自 DSL 里 `call` 动作的 `name`
200
- * @returns 已注册返回 true;当前名单为空,所以恒为 false
208
+ * @returns 已注册返回 true;未注册意味着该动作执行时会抛 `unknown-handler`,调用方应告警
201
209
  */
202
210
  declare function isRegisteredHostHandler(name: string): boolean;
203
211
 
package/dist/index.d.ts CHANGED
@@ -144,7 +144,8 @@ declare function validateUserFields(dsl: unknown, allowed: string[]): FieldIssue
144
144
  * 它是「**前台宿主实际注册了什么**」的事实记录,**不是** core 的能力声明。
145
145
  * core 本身对数据源名一无所知:运行时只认宿主创建 runtime 时传进来的 `sources` /
146
146
  * `handlers` 对象,查不到名字就抛 `unknown-source`、整份物料静默白屏
147
- * (不报错、什么都不画,投到线上才发现)。
147
+ * (不报错、什么都不画,投到线上才发现);`call` 查不到 handler 则抛 `unknown-handler`,
148
+ * 该动作静默失效(物料照常显示,但按钮点了没反应)。
148
149
  *
149
150
  * 【为什么放在 core 里】
150
151
  * 因为前台(move-front,注册表在 `components-business/marketing/sources.ts`)与
@@ -172,11 +173,14 @@ type HostSourceName = (typeof HOST_SOURCE_NAMES)[number];
172
173
  /**
173
174
  * 前台已注册的**宿主方法名**(DSL 里 `{ type: 'call', name: 'xxx' }` 的 `name`)。
174
175
  *
175
- * 当前**确实一个都没注册**,空名单是真实状态、不是占位:
176
- * 运营在 DSL 里写任何 `call` 都会白屏,后台据此照常告警。
176
+ * 当前两个都是「不再提示」类的本地记账:写一条本地标记,让这条物料下次不再进坑位。
177
+ * **标记与关闭是两回事**——handler 只写标记、不关闭,这一次关不关由运营在
178
+ * `sequence` 里自己配 `close` 决定(也因此留出了「勾选框」式交互的可能)。
179
+ *
180
+ * 用 `as const` 是为了推导出 {@link HostHandlerName} 联合类型,供前台约束注册表。
177
181
  */
178
- declare const HOST_HANDLER_NAMES: readonly string[];
179
- /** 宿主方法名的联合类型(当前名单为空,故为 `never`) */
182
+ declare const HOST_HANDLER_NAMES: readonly ["dismissToday", "dismissForever"];
183
+ /** 宿主方法名的联合类型,前台注册表以它为键,漏注册一个就编译不过 */
180
184
  type HostHandlerName = (typeof HOST_HANDLER_NAMES)[number];
181
185
  /**
182
186
  * 数据源的中文含义。后台告警文案、运营看的能力清单共用一份,避免说明各写各的。
@@ -184,8 +188,12 @@ type HostHandlerName = (typeof HOST_HANDLER_NAMES)[number];
184
188
  * 键必须覆盖 {@link HOST_SOURCE_NAMES} 的全部名字(有单测钉死)。
185
189
  */
186
190
  declare const HOST_SOURCE_LABELS: Record<HostSourceName, string>;
187
- /** 宿主方法的中文含义,键覆盖 {@link HOST_HANDLER_NAMES}(当前为空对象) */
188
- declare const HOST_HANDLER_LABELS: Record<string, string>;
191
+ /**
192
+ * 宿主方法的中文含义。后台告警文案、运营看的能力清单共用一份。
193
+ *
194
+ * 键必须覆盖 {@link HOST_HANDLER_NAMES} 的全部名字(有单测钉死)。
195
+ */
196
+ declare const HOST_HANDLER_LABELS: Record<HostHandlerName, string>;
189
197
  /**
190
198
  * 判断一个数据源名是否已被前台注册。
191
199
  *
@@ -197,7 +205,7 @@ declare function isRegisteredHostSource(name: string): boolean;
197
205
  * 判断一个宿主方法名是否已被前台注册。
198
206
  *
199
207
  * @param name 待判断的名字,通常来自 DSL 里 `call` 动作的 `name`
200
- * @returns 已注册返回 true;当前名单为空,所以恒为 false
208
+ * @returns 已注册返回 true;未注册意味着该动作执行时会抛 `unknown-handler`,调用方应告警
201
209
  */
202
210
  declare function isRegisteredHostHandler(name: string): boolean;
203
211
 
package/dist/index.js CHANGED
@@ -871,12 +871,15 @@ function createRuntime(dsl, options = {}) {
871
871
 
872
872
  // src/host-capabilities.ts
873
873
  var HOST_SOURCE_NAMES = ["userStatistics", "listRenewTiers"];
874
- var HOST_HANDLER_NAMES = [];
874
+ var HOST_HANDLER_NAMES = ["dismissToday", "dismissForever"];
875
875
  var HOST_SOURCE_LABELS = {
876
876
  userStatistics: "\u7528\u6237\u6570\u636E\u7EDF\u8BA1\uFF08\u7D2F\u8BA1\u642C\u5BB6\u6570 / \u6B21\u6570\u4F59\u989D / AI \u4F18\u5316\u6B21\u6570\u7B49\uFF0C\u6241\u5E73\u5BF9\u8C61\uFF0C\u5B57\u6BB5\u540D\u4E3A\u540E\u7AEF snake_case\uFF09",
877
877
  listRenewTiers: "\u7EED\u8D39\u4EF7\u683C\u6863\u4F4D\u5217\u8868\uFF08\u6708\u4ED8/\u5B63\u4ED8/\u534A\u5E74/\u5E74\u4ED8\uFF0C\u542B\u4E0B\u5355\u5730\u5740\uFF09"
878
878
  };
879
- var HOST_HANDLER_LABELS = {};
879
+ var HOST_HANDLER_LABELS = {
880
+ dismissToday: "\u4ECA\u65E5\u4E0D\u518D\u63D0\u793A\uFF1A\u628A\u8FD9\u6761\u7269\u6599\u6807\u8BB0\u4E3A\u300C\u4ECA\u5929\u4E0D\u518D\u5C55\u793A\u300D\uFF08\u524D\u7AEF\u672C\u5730\u8BB0\u5F55\uFF0C\u6309\u767B\u5F55\u8D26\u53F7\u9694\u79BB\uFF0C\u8DE8\u8BBE\u5907\u4E0D\u540C\u6B65\uFF1B\u53EA\u5199\u6807\u8BB0\u4E0D\u5173\u95ED\uFF0C\u8981\u5173\u5F97\u81EA\u5DF1\u518D\u914D\u4E00\u4E2A close\uFF09",
881
+ dismissForever: "\u4E0D\u518D\u63D0\u793A\uFF1A\u628A\u8FD9\u6761\u7269\u6599\u6807\u8BB0\u4E3A\u300C\u6C38\u4E45\u4E0D\u518D\u5C55\u793A\u300D\uFF08\u524D\u7AEF\u672C\u5730\u8BB0\u5F55\uFF0C\u6309\u767B\u5F55\u8D26\u53F7\u9694\u79BB\uFF0C\u8DE8\u8BBE\u5907\u4E0D\u540C\u6B65\uFF1B\u53EA\u5199\u6807\u8BB0\u4E0D\u5173\u95ED\uFF0C\u8981\u5173\u5F97\u81EA\u5DF1\u518D\u914D\u4E00\u4E2A close\uFF09"
882
+ };
880
883
  function isRegisteredHostSource(name) {
881
884
  return HOST_SOURCE_NAMES.indexOf(name) > -1;
882
885
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yaoxiu/marketing-dsl",
3
- "version": "2.6.1",
3
+ "version": "2.7.0",
4
4
  "type": "module",
5
5
  "description": "营销弹窗 DSL 解释器核心,纯逻辑无框架依赖",
6
6
  "license": "MIT",