@yaoxiu/marketing-dsl 2.6.1 → 2.8.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",
@@ -455,9 +477,14 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6`
455
477
  "`close` \u7684 `extra.name`\uFF08`reason` \u4ECD\u662F\u5173\u95ED\u539F\u56E0\uFF09"
456
478
  ],
457
479
  [
458
- "\u5173\u95ED\u6309\u94AE\u7684 `action` \u91CC\uFF08\u548C `close` \u5199\u5728\u540C\u4E00\u4E2A `sequence`\uFF09",
480
+ "\u5173\u95ED\u6309\u94AE\u7684 `action` \u91CC\uFF08\u548C `close` \u5199\u5728\u540C\u4E00\u4E2A `sequence`\uFF0C\u4E14**\u4E0D\u8DF3\u8F6C**\uFF09",
459
481
  "**\u4E0D\u7B97\u70B9\u51FB**\uFF0C\u5E76\u8FDB\u90A3\u6761\u5173\u95ED",
460
482
  "`close` \u7684 `extra.name`"
483
+ ],
484
+ [
485
+ "\u4E3B\u6309\u94AE\u7684 `action` \u91CC\uFF08`sequence` \u91CC\u65E2\u6709 `close` / `closeAll`\uFF0C\u53C8\u6709 `navigate`\uFF09",
486
+ "**\u7B97\u4E00\u6761 `click`**\uFF08\u8DF3\u8D70\u4E86\u5C31\u662F\u8F6C\u5316\uFF09",
487
+ "`extra.name`\uFF1B\u8DF3\u8F6C\u5730\u5740\u5E76\u8FDB `extra.url`"
461
488
  ]
462
489
  ]
463
490
  },
@@ -469,7 +496,12 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6`
469
496
  {
470
497
  t: "note",
471
498
  tone: "warn",
472
- text: '**\u5173\u95ED\u52A8\u4F5C\u4E0D\u4EA7\u751F\u70B9\u51FB\u3002**\u53EA\u8981\u8FD9\u4E00\u4E0B\u6267\u884C\u4E86 `close` / `closeAll`\uFF0C\u5B83\u7684\u672C\u8D28\u5C31\u662F\u300C\u5173\u6389\u5B83\u300D\u800C\u4E0D\u662F\u300C\u70B9\u4E86\u5B83\u300D\u2014\u2014\u540E\u7AEF\u7B97\u70B9\u51FB\u7387\u65F6\u5206\u6BCD\u662F\u66DD\u5149\u3001\u5206\u5B50\u662F\u70B9\u51FB\uFF0C\u628A\u5173\u95ED\u7B97\u8FDB\u70B9\u51FB\u4F1A\u8BA9\u70B9\u51FB\u7387\u865A\u9AD8\u3002\u4F60\u914D\u5728\u5173\u95ED\u6309\u94AE\u4E0A\u7684\u57CB\u70B9\u540D\u4E0D\u4F1A\u4E22\uFF0C\u5B83\u8FDB\u4E86 `close` \u7684 `extra`\u3002\u60F3\u533A\u5206\u300C\u4ECE\u54EA\u4E2A\u5165\u53E3\u5173\u7684\u300D\uFF0C\u66F4\u63A8\u8350\u7528 `close` \u52A8\u4F5C\u7684 `reason`\uFF08\u5982 `reason: "user-dismiss"`\uFF09\u3002'
499
+ text: '**\u7EAF\u5173\u95ED\u52A8\u4F5C\u4E0D\u4EA7\u751F\u70B9\u51FB\u3002**\u8FD9\u4E00\u4E0B\u6267\u884C\u4E86 `close` / `closeAll`\u3001\u53C8\u6CA1\u6709\u8DF3\u8F6C\uFF0C\u5B83\u7684\u672C\u8D28\u5C31\u662F\u300C\u5173\u6389\u5B83\u300D\u800C\u4E0D\u662F\u300C\u70B9\u4E86\u5B83\u300D\u2014\u2014\u540E\u7AEF\u7B97\u70B9\u51FB\u7387\u65F6\u5206\u6BCD\u662F\u66DD\u5149\u3001\u5206\u5B50\u662F\u70B9\u51FB\uFF0C\u628A\u5173\u95ED\u7B97\u8FDB\u70B9\u51FB\u4F1A\u8BA9\u70B9\u51FB\u7387\u865A\u9AD8\u3002\u4F60\u914D\u5728\u5173\u95ED\u6309\u94AE\u4E0A\u7684\u57CB\u70B9\u540D\u4E0D\u4F1A\u4E22\uFF0C\u5B83\u8FDB\u4E86 `close` \u7684 `extra`\u3002\u60F3\u533A\u5206\u300C\u4ECE\u54EA\u4E2A\u5165\u53E3\u5173\u7684\u300D\uFF0C\u66F4\u63A8\u8350\u7528 `close` \u52A8\u4F5C\u7684 `reason`\uFF08\u5982 `reason: "user-dismiss"`\uFF09\u3002'
500
+ },
501
+ {
502
+ t: "note",
503
+ tone: "info",
504
+ text: "**\u4F46\u300C\u70B9\u4E86\u5C31\u8DF3\u8D70\u300D\u7684\u6309\u94AE\u5373\u4F7F\u5E26\u5173\u95ED\u4E5F\u7B97\u4E00\u6B21\u70B9\u51FB\u3002**\u4E3B CTA \u5E38\u5199\u6210 `sequence: [track, closeAll, navigate]`\uFF08\u8DF3\u8D70\u524D\u987A\u624B\u628A\u5F39\u7A97\u6536\u6389\uFF09\uFF0C\u540C\u4E00\u6B21\u624B\u52BF\u91CC\u53EA\u8981\u6709 `navigate`\uFF0C\u5C31\u7167\u5E38\u4E0A\u62A5\u4E00\u6761 `click`\u2014\u2014\u7528\u6237\u771F\u7684\u8DF3\u8FC7\u53BB\u4E86\uFF0C\u8FD9\u662F\u8F6C\u5316\u884C\u4E3A\uFF0C\u5173\u95ED\u53EA\u662F\u5B83\u7684\u526F\u4F5C\u7528\u3002\u8FD9\u6761 `click` \u7684 `extra` \u91CC\u65E2\u6709\u4F60\u914D\u7684\u57CB\u70B9\u540D\uFF0C\u4E5F\u6709\u8DF3\u8F6C\u5730\u5740\uFF1B\u8FD9\u4E00\u4E0B\u4E0D\u4F1A\u518D\u628A\u57CB\u70B9\u540D\u5E76\u8FDB `close`\uFF0C\u540C\u4E00\u4E2A\u540D\u5B57\u4E0D\u4F1A\u88AB\u62A5\u4E24\u904D\u3002"
473
505
  },
474
506
  {
475
507
  t: "note",
@@ -2884,7 +2916,8 @@ var noticeToPopup = {
2884
2916
  fontSize: 13,
2885
2917
  cursor: "pointer"
2886
2918
  },
2887
- action: { type: "close", reason: "user-dismiss" }
2919
+ // 公告条行末的关闭只管「这一次」,不写本地标记
2920
+ action: { type: "close", reason: "user-close" }
2888
2921
  }
2889
2922
  ]
2890
2923
  }
@@ -3251,12 +3284,14 @@ var confirmAndSwitch = {
3251
3284
  cursor: "pointer"
3252
3285
  },
3253
3286
  // 确认后整个关掉,两层一起消失。
3254
- // 「不再提醒」的意图靠 reason 上报给后端,不配 call 写本地存储
3287
+ // 标记写在这一步而不是上一层的「不再提醒」按钮上:
3288
+ // 那个按钮只是打开二次确认,用户还可能反悔,真正的意图在这里才确定
3255
3289
  action: {
3256
3290
  type: "sequence",
3257
3291
  actions: [
3258
3292
  { type: "track", event: "popup_never_remind_confirm" },
3259
- { type: "closeAll", reason: "user-dismiss" }
3293
+ { type: "call", name: "dismissForever" },
3294
+ { type: "closeAll", reason: "dismiss-forever" }
3260
3295
  ]
3261
3296
  },
3262
3297
  children: [
@@ -3592,8 +3627,15 @@ var imageBanner = {
3592
3627
  fontSize: 12,
3593
3628
  cursor: "pointer"
3594
3629
  },
3595
- // 「不再提醒」写在 close 的 reason 上,上报给后端即可,不配 call 写本地存储
3596
- action: { type: "close", reason: "user-dismiss" }
3630
+ // 「不再提醒」两步走:先调宿主的 dismissForever 写本地标记(前端立刻不再展示),
3631
+ // close 关掉;reason 照旧上报给后端,那是后端唯一看得到的「为什么关」
3632
+ action: {
3633
+ type: "sequence",
3634
+ actions: [
3635
+ { type: "call", name: "dismissForever" },
3636
+ { type: "close", reason: "dismiss-forever" }
3637
+ ]
3638
+ }
3597
3639
  }
3598
3640
  ]
3599
3641
  }
@@ -3701,8 +3743,15 @@ function createDrawerBanner(options) {
3701
3743
  fontSize: 9,
3702
3744
  cursor: "pointer"
3703
3745
  },
3704
- // 「不再提醒」写在 close reason 上,上报给后端即可,不配 call 写本地存储
3705
- action: { type: "close", reason: "user-dismiss" }
3746
+ // 「不再提醒」两步走:dismissForever 写本地标记 + close 关掉,缺一不可
3747
+ // (这两个方法只写标记、不关闭)
3748
+ action: {
3749
+ type: "sequence",
3750
+ actions: [
3751
+ { type: "call", name: "dismissForever" },
3752
+ { type: "close", reason: "dismiss-forever" }
3753
+ ]
3754
+ }
3706
3755
  }
3707
3756
  ]
3708
3757
  };
@@ -5411,10 +5460,17 @@ var imageHotspot = {
5411
5460
  id: "hotspot-never",
5412
5461
  type: "box",
5413
5462
  // 最底部「不再提醒」,动作是关弹窗而不是跳转。
5414
- // reason 上报给后端,后端据此不再下发这条物料——不需要写本地存储
5463
+ // dismissForever 写本地标记让它前端立刻不再出现,close 才是真正关掉这一层;
5464
+ // reason 一并上报,后端据此决定以后还下不下发
5415
5465
  rect: ["30%", 478, "40%", 26],
5416
5466
  style: { radius: 13, background: HOTSPOT_BG, cursor: "pointer" },
5417
- action: { type: "close", reason: "user-dismiss" }
5467
+ action: {
5468
+ type: "sequence",
5469
+ actions: [
5470
+ { type: "call", name: "dismissForever" },
5471
+ { type: "close", reason: "dismiss-forever" }
5472
+ ]
5473
+ }
5418
5474
  }
5419
5475
  ]
5420
5476
  };
@@ -5494,7 +5550,9 @@ var noticeBar = {
5494
5550
  type: "sequence",
5495
5551
  actions: [
5496
5552
  { type: "track", event: "notice_close", params: { notice: "guide" } },
5497
- { type: "close", reason: "user-dismiss" }
5553
+ // 行末的 × 只是「这次关掉」,不写本地标记:下次进页面它还该出现。
5554
+ // 要「以后别再出现」得另放一个按钮,配 dismissForever(见 action 章节)
5555
+ { type: "close", reason: "user-close" }
5498
5556
  ]
5499
5557
  }
5500
5558
  }
@@ -5729,7 +5787,8 @@ function checklistSection() {
5729
5787
  \u6709\u4E00\u4E2A\u4E0D\u5408\u89C4\uFF0C\u6574\u4EFD\u914D\u7F6E\u5C31\u5B58\u4E0D\u4E0A
5730
5788
  - [ ] \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
5789
  - [ ] \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\`
5790
+ - [ ] \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
5791
+ - [ ] \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
5792
  - [ ] \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
5793
  - [ ] \u88C5\u9970\u6027\u56FE\u5C42\uFF08\u5149\u6655\u3001\u626B\u5149\u3001\u5149\u70B9\uFF09\u90FD\u5199\u4E86 \`"pointerEvents": "none"\`
5735
5794
  - [ ] \u8F93\u51FA\u7684\u662F\u5408\u6CD5 JSON\uFF08\u6CA1\u6709\u591A\u4F59\u9017\u53F7\u3001\u6CA1\u6709\u6CE8\u91CA\uFF09`;
@@ -5769,8 +5828,11 @@ function actionSection() {
5769
5828
  - \`setState\`\uFF1A\`{ "type": "setState", "key": "period", "value": "{{ index }}" }\` \u505A\u9009\u4E2D\u5207\u6362
5770
5829
  - \`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
5830
  - \`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
5831
+ - \`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
5832
+ - \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
5833
+ \`{ "type": "sequence", "actions": [{ "type": "call", "name": "dismissToday" }, { "type": "close", "reason": "dismiss-today" }] }\`
5834
+ \uFF08\u6C38\u4E45\u7248\u628A\u4E24\u5904\u5206\u522B\u6362\u6210 \`dismissForever\` \u548C \`"dismiss-forever"\`\uFF09
5835
+ - \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
5836
  - \`open\`\uFF1A\u6253\u5F00\u53E6\u4E00\u4E2A\u89C6\u56FE\uFF0C\u89C1\u4E0B\u4E00\u8282
5775
5837
  - \u4EFB\u4F55\u8282\u70B9\u52A0 \`action\` \u90FD\u80FD\u70B9\u51FB
5776
5838
  - **\u6BCF\u4E2A\u53EF\u70B9\u51FB\u5143\u7D20\u90FD\u5E94\u8BE5\u914D \`track\`**\uFF0C\u5426\u5219\u6CA1\u6709\u6570\u636E\u53EF\u770B
@@ -5839,7 +5901,7 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6
5839
5901
  ] } }
5840
5902
  \`\`\`
5841
5903
 
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
5904
+ \`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
5905
  \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
5906
  }
5845
5907
  function viewsSection() {
@@ -1,4 +1,4 @@
1
- import { D as Dsl } from '../types-8FNxDXp0.cjs';
1
+ import { D as Dsl } from '../types-DDOAHxQt.cjs';
2
2
 
3
3
  /**
4
4
  * 开发文档的数据结构。
@@ -1,4 +1,4 @@
1
- import { D as Dsl } from '../types-8FNxDXp0.js';
1
+ import { D as Dsl } from '../types-DDOAHxQt.js';
2
2
 
3
3
  /**
4
4
  * 开发文档的数据结构。
@@ -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",
@@ -294,9 +316,14 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6`
294
316
  "`close` \u7684 `extra.name`\uFF08`reason` \u4ECD\u662F\u5173\u95ED\u539F\u56E0\uFF09"
295
317
  ],
296
318
  [
297
- "\u5173\u95ED\u6309\u94AE\u7684 `action` \u91CC\uFF08\u548C `close` \u5199\u5728\u540C\u4E00\u4E2A `sequence`\uFF09",
319
+ "\u5173\u95ED\u6309\u94AE\u7684 `action` \u91CC\uFF08\u548C `close` \u5199\u5728\u540C\u4E00\u4E2A `sequence`\uFF0C\u4E14**\u4E0D\u8DF3\u8F6C**\uFF09",
298
320
  "**\u4E0D\u7B97\u70B9\u51FB**\uFF0C\u5E76\u8FDB\u90A3\u6761\u5173\u95ED",
299
321
  "`close` \u7684 `extra.name`"
322
+ ],
323
+ [
324
+ "\u4E3B\u6309\u94AE\u7684 `action` \u91CC\uFF08`sequence` \u91CC\u65E2\u6709 `close` / `closeAll`\uFF0C\u53C8\u6709 `navigate`\uFF09",
325
+ "**\u7B97\u4E00\u6761 `click`**\uFF08\u8DF3\u8D70\u4E86\u5C31\u662F\u8F6C\u5316\uFF09",
326
+ "`extra.name`\uFF1B\u8DF3\u8F6C\u5730\u5740\u5E76\u8FDB `extra.url`"
300
327
  ]
301
328
  ]
302
329
  },
@@ -308,7 +335,12 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6`
308
335
  {
309
336
  t: "note",
310
337
  tone: "warn",
311
- text: '**\u5173\u95ED\u52A8\u4F5C\u4E0D\u4EA7\u751F\u70B9\u51FB\u3002**\u53EA\u8981\u8FD9\u4E00\u4E0B\u6267\u884C\u4E86 `close` / `closeAll`\uFF0C\u5B83\u7684\u672C\u8D28\u5C31\u662F\u300C\u5173\u6389\u5B83\u300D\u800C\u4E0D\u662F\u300C\u70B9\u4E86\u5B83\u300D\u2014\u2014\u540E\u7AEF\u7B97\u70B9\u51FB\u7387\u65F6\u5206\u6BCD\u662F\u66DD\u5149\u3001\u5206\u5B50\u662F\u70B9\u51FB\uFF0C\u628A\u5173\u95ED\u7B97\u8FDB\u70B9\u51FB\u4F1A\u8BA9\u70B9\u51FB\u7387\u865A\u9AD8\u3002\u4F60\u914D\u5728\u5173\u95ED\u6309\u94AE\u4E0A\u7684\u57CB\u70B9\u540D\u4E0D\u4F1A\u4E22\uFF0C\u5B83\u8FDB\u4E86 `close` \u7684 `extra`\u3002\u60F3\u533A\u5206\u300C\u4ECE\u54EA\u4E2A\u5165\u53E3\u5173\u7684\u300D\uFF0C\u66F4\u63A8\u8350\u7528 `close` \u52A8\u4F5C\u7684 `reason`\uFF08\u5982 `reason: "user-dismiss"`\uFF09\u3002'
338
+ text: '**\u7EAF\u5173\u95ED\u52A8\u4F5C\u4E0D\u4EA7\u751F\u70B9\u51FB\u3002**\u8FD9\u4E00\u4E0B\u6267\u884C\u4E86 `close` / `closeAll`\u3001\u53C8\u6CA1\u6709\u8DF3\u8F6C\uFF0C\u5B83\u7684\u672C\u8D28\u5C31\u662F\u300C\u5173\u6389\u5B83\u300D\u800C\u4E0D\u662F\u300C\u70B9\u4E86\u5B83\u300D\u2014\u2014\u540E\u7AEF\u7B97\u70B9\u51FB\u7387\u65F6\u5206\u6BCD\u662F\u66DD\u5149\u3001\u5206\u5B50\u662F\u70B9\u51FB\uFF0C\u628A\u5173\u95ED\u7B97\u8FDB\u70B9\u51FB\u4F1A\u8BA9\u70B9\u51FB\u7387\u865A\u9AD8\u3002\u4F60\u914D\u5728\u5173\u95ED\u6309\u94AE\u4E0A\u7684\u57CB\u70B9\u540D\u4E0D\u4F1A\u4E22\uFF0C\u5B83\u8FDB\u4E86 `close` \u7684 `extra`\u3002\u60F3\u533A\u5206\u300C\u4ECE\u54EA\u4E2A\u5165\u53E3\u5173\u7684\u300D\uFF0C\u66F4\u63A8\u8350\u7528 `close` \u52A8\u4F5C\u7684 `reason`\uFF08\u5982 `reason: "user-dismiss"`\uFF09\u3002'
339
+ },
340
+ {
341
+ t: "note",
342
+ tone: "info",
343
+ text: "**\u4F46\u300C\u70B9\u4E86\u5C31\u8DF3\u8D70\u300D\u7684\u6309\u94AE\u5373\u4F7F\u5E26\u5173\u95ED\u4E5F\u7B97\u4E00\u6B21\u70B9\u51FB\u3002**\u4E3B CTA \u5E38\u5199\u6210 `sequence: [track, closeAll, navigate]`\uFF08\u8DF3\u8D70\u524D\u987A\u624B\u628A\u5F39\u7A97\u6536\u6389\uFF09\uFF0C\u540C\u4E00\u6B21\u624B\u52BF\u91CC\u53EA\u8981\u6709 `navigate`\uFF0C\u5C31\u7167\u5E38\u4E0A\u62A5\u4E00\u6761 `click`\u2014\u2014\u7528\u6237\u771F\u7684\u8DF3\u8FC7\u53BB\u4E86\uFF0C\u8FD9\u662F\u8F6C\u5316\u884C\u4E3A\uFF0C\u5173\u95ED\u53EA\u662F\u5B83\u7684\u526F\u4F5C\u7528\u3002\u8FD9\u6761 `click` \u7684 `extra` \u91CC\u65E2\u6709\u4F60\u914D\u7684\u57CB\u70B9\u540D\uFF0C\u4E5F\u6709\u8DF3\u8F6C\u5730\u5740\uFF1B\u8FD9\u4E00\u4E0B\u4E0D\u4F1A\u518D\u628A\u57CB\u70B9\u540D\u5E76\u8FDB `close`\uFF0C\u540C\u4E00\u4E2A\u540D\u5B57\u4E0D\u4F1A\u88AB\u62A5\u4E24\u904D\u3002"
312
344
  },
313
345
  {
314
346
  t: "note",
@@ -2723,7 +2755,8 @@ var noticeToPopup = {
2723
2755
  fontSize: 13,
2724
2756
  cursor: "pointer"
2725
2757
  },
2726
- action: { type: "close", reason: "user-dismiss" }
2758
+ // 公告条行末的关闭只管「这一次」,不写本地标记
2759
+ action: { type: "close", reason: "user-close" }
2727
2760
  }
2728
2761
  ]
2729
2762
  }
@@ -3090,12 +3123,14 @@ var confirmAndSwitch = {
3090
3123
  cursor: "pointer"
3091
3124
  },
3092
3125
  // 确认后整个关掉,两层一起消失。
3093
- // 「不再提醒」的意图靠 reason 上报给后端,不配 call 写本地存储
3126
+ // 标记写在这一步而不是上一层的「不再提醒」按钮上:
3127
+ // 那个按钮只是打开二次确认,用户还可能反悔,真正的意图在这里才确定
3094
3128
  action: {
3095
3129
  type: "sequence",
3096
3130
  actions: [
3097
3131
  { type: "track", event: "popup_never_remind_confirm" },
3098
- { type: "closeAll", reason: "user-dismiss" }
3132
+ { type: "call", name: "dismissForever" },
3133
+ { type: "closeAll", reason: "dismiss-forever" }
3099
3134
  ]
3100
3135
  },
3101
3136
  children: [
@@ -3431,8 +3466,15 @@ var imageBanner = {
3431
3466
  fontSize: 12,
3432
3467
  cursor: "pointer"
3433
3468
  },
3434
- // 「不再提醒」写在 close 的 reason 上,上报给后端即可,不配 call 写本地存储
3435
- action: { type: "close", reason: "user-dismiss" }
3469
+ // 「不再提醒」两步走:先调宿主的 dismissForever 写本地标记(前端立刻不再展示),
3470
+ // close 关掉;reason 照旧上报给后端,那是后端唯一看得到的「为什么关」
3471
+ action: {
3472
+ type: "sequence",
3473
+ actions: [
3474
+ { type: "call", name: "dismissForever" },
3475
+ { type: "close", reason: "dismiss-forever" }
3476
+ ]
3477
+ }
3436
3478
  }
3437
3479
  ]
3438
3480
  }
@@ -3540,8 +3582,15 @@ function createDrawerBanner(options) {
3540
3582
  fontSize: 9,
3541
3583
  cursor: "pointer"
3542
3584
  },
3543
- // 「不再提醒」写在 close reason 上,上报给后端即可,不配 call 写本地存储
3544
- action: { type: "close", reason: "user-dismiss" }
3585
+ // 「不再提醒」两步走:dismissForever 写本地标记 + close 关掉,缺一不可
3586
+ // (这两个方法只写标记、不关闭)
3587
+ action: {
3588
+ type: "sequence",
3589
+ actions: [
3590
+ { type: "call", name: "dismissForever" },
3591
+ { type: "close", reason: "dismiss-forever" }
3592
+ ]
3593
+ }
3545
3594
  }
3546
3595
  ]
3547
3596
  };
@@ -5250,10 +5299,17 @@ var imageHotspot = {
5250
5299
  id: "hotspot-never",
5251
5300
  type: "box",
5252
5301
  // 最底部「不再提醒」,动作是关弹窗而不是跳转。
5253
- // reason 上报给后端,后端据此不再下发这条物料——不需要写本地存储
5302
+ // dismissForever 写本地标记让它前端立刻不再出现,close 才是真正关掉这一层;
5303
+ // reason 一并上报,后端据此决定以后还下不下发
5254
5304
  rect: ["30%", 478, "40%", 26],
5255
5305
  style: { radius: 13, background: HOTSPOT_BG, cursor: "pointer" },
5256
- action: { type: "close", reason: "user-dismiss" }
5306
+ action: {
5307
+ type: "sequence",
5308
+ actions: [
5309
+ { type: "call", name: "dismissForever" },
5310
+ { type: "close", reason: "dismiss-forever" }
5311
+ ]
5312
+ }
5257
5313
  }
5258
5314
  ]
5259
5315
  };
@@ -5333,7 +5389,9 @@ var noticeBar = {
5333
5389
  type: "sequence",
5334
5390
  actions: [
5335
5391
  { type: "track", event: "notice_close", params: { notice: "guide" } },
5336
- { type: "close", reason: "user-dismiss" }
5392
+ // 行末的 × 只是「这次关掉」,不写本地标记:下次进页面它还该出现。
5393
+ // 要「以后别再出现」得另放一个按钮,配 dismissForever(见 action 章节)
5394
+ { type: "close", reason: "user-close" }
5337
5395
  ]
5338
5396
  }
5339
5397
  }
@@ -5568,7 +5626,8 @@ function checklistSection() {
5568
5626
  \u6709\u4E00\u4E2A\u4E0D\u5408\u89C4\uFF0C\u6574\u4EFD\u914D\u7F6E\u5C31\u5B58\u4E0D\u4E0A
5569
5627
  - [ ] \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
5628
  - [ ] \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\`
5629
+ - [ ] \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
5630
+ - [ ] \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
5631
  - [ ] \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
5632
  - [ ] \u88C5\u9970\u6027\u56FE\u5C42\uFF08\u5149\u6655\u3001\u626B\u5149\u3001\u5149\u70B9\uFF09\u90FD\u5199\u4E86 \`"pointerEvents": "none"\`
5574
5633
  - [ ] \u8F93\u51FA\u7684\u662F\u5408\u6CD5 JSON\uFF08\u6CA1\u6709\u591A\u4F59\u9017\u53F7\u3001\u6CA1\u6709\u6CE8\u91CA\uFF09`;
@@ -5608,8 +5667,11 @@ function actionSection() {
5608
5667
  - \`setState\`\uFF1A\`{ "type": "setState", "key": "period", "value": "{{ index }}" }\` \u505A\u9009\u4E2D\u5207\u6362
5609
5668
  - \`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
5669
  - \`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
5670
+ - \`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
5671
+ - \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
5672
+ \`{ "type": "sequence", "actions": [{ "type": "call", "name": "dismissToday" }, { "type": "close", "reason": "dismiss-today" }] }\`
5673
+ \uFF08\u6C38\u4E45\u7248\u628A\u4E24\u5904\u5206\u522B\u6362\u6210 \`dismissForever\` \u548C \`"dismiss-forever"\`\uFF09
5674
+ - \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
5675
  - \`open\`\uFF1A\u6253\u5F00\u53E6\u4E00\u4E2A\u89C6\u56FE\uFF0C\u89C1\u4E0B\u4E00\u8282
5614
5676
  - \u4EFB\u4F55\u8282\u70B9\u52A0 \`action\` \u90FD\u80FD\u70B9\u51FB
5615
5677
  - **\u6BCF\u4E2A\u53EF\u70B9\u51FB\u5143\u7D20\u90FD\u5E94\u8BE5\u914D \`track\`**\uFF0C\u5426\u5219\u6CA1\u6709\u6570\u636E\u53EF\u770B
@@ -5678,7 +5740,7 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6
5678
5740
  ] } }
5679
5741
  \`\`\`
5680
5742
 
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
5743
+ \`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
5744
  \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
5745
  }
5684
5746
  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
@@ -1,5 +1,5 @@
1
- import { D as Dsl, R as RuntimeOptions, a as RenderTree, b as DslView, c as DslStyle, C as CssStyle } from './types-8FNxDXp0.cjs';
2
- export { s as DslAction, j as DslActionBase, h as DslAnimate, q as DslCallAction, l as DslCloseAction, m as DslCloseAllAction, v as DslCloseButton, u as DslClosePosition, y as DslDerived, E as DslHandler, G as DslInteractionEvent, F as DslInteractionTrigger, i as DslKeyframe, f as DslLength, k as DslNavigateAction, t as DslNode, e as DslNodeType, n as DslOpenAction, g as DslRect, r as DslSequenceAction, o as DslSetStateAction, B as DslSource, x as DslSourceRef, w as DslStage, p as DslTrackAction, d as DslViewType, z as RenderElement, A as RenderLayer, J as RuntimeEmit, I as RuntimeEventName, H as RuntimeEvents } from './types-8FNxDXp0.cjs';
1
+ import { D as Dsl, R as RuntimeOptions, a as RenderTree, b as DslView, c as DslStyle, C as CssStyle } from './types-DDOAHxQt.cjs';
2
+ export { s as DslAction, j as DslActionBase, h as DslAnimate, q as DslCallAction, l as DslCloseAction, m as DslCloseAllAction, v as DslCloseButton, u as DslClosePosition, y as DslDerived, E as DslHandler, G as DslInteractionEvent, F as DslInteractionTrigger, i as DslKeyframe, f as DslLength, k as DslNavigateAction, t as DslNode, e as DslNodeType, n as DslOpenAction, g as DslRect, r as DslSequenceAction, o as DslSetStateAction, B as DslSource, x as DslSourceRef, w as DslStage, p as DslTrackAction, d as DslViewType, z as RenderElement, A as RenderLayer, J as RuntimeEmit, I as RuntimeEventName, H as RuntimeEvents } from './types-DDOAHxQt.cjs';
3
3
 
4
4
  /**
5
5
  * 运行时。
@@ -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
@@ -1,5 +1,5 @@
1
- import { D as Dsl, R as RuntimeOptions, a as RenderTree, b as DslView, c as DslStyle, C as CssStyle } from './types-8FNxDXp0.js';
2
- export { s as DslAction, j as DslActionBase, h as DslAnimate, q as DslCallAction, l as DslCloseAction, m as DslCloseAllAction, v as DslCloseButton, u as DslClosePosition, y as DslDerived, E as DslHandler, G as DslInteractionEvent, F as DslInteractionTrigger, i as DslKeyframe, f as DslLength, k as DslNavigateAction, t as DslNode, e as DslNodeType, n as DslOpenAction, g as DslRect, r as DslSequenceAction, o as DslSetStateAction, B as DslSource, x as DslSourceRef, w as DslStage, p as DslTrackAction, d as DslViewType, z as RenderElement, A as RenderLayer, J as RuntimeEmit, I as RuntimeEventName, H as RuntimeEvents } from './types-8FNxDXp0.js';
1
+ import { D as Dsl, R as RuntimeOptions, a as RenderTree, b as DslView, c as DslStyle, C as CssStyle } from './types-DDOAHxQt.js';
2
+ export { s as DslAction, j as DslActionBase, h as DslAnimate, q as DslCallAction, l as DslCloseAction, m as DslCloseAllAction, v as DslCloseButton, u as DslClosePosition, y as DslDerived, E as DslHandler, G as DslInteractionEvent, F as DslInteractionTrigger, i as DslKeyframe, f as DslLength, k as DslNavigateAction, t as DslNode, e as DslNodeType, n as DslOpenAction, g as DslRect, r as DslSequenceAction, o as DslSetStateAction, B as DslSource, x as DslSourceRef, w as DslStage, p as DslTrackAction, d as DslViewType, z as RenderElement, A as RenderLayer, J as RuntimeEmit, I as RuntimeEventName, H as RuntimeEvents } from './types-DDOAHxQt.js';
3
3
 
4
4
  /**
5
5
  * 运行时。
@@ -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
  }
@@ -46,7 +46,7 @@ function mapRuntimeEventToReport(id, event, payload) {
46
46
  if (event !== "interaction") return null;
47
47
  const data = payload != null ? payload : {};
48
48
  if (data.trigger !== "action") return null;
49
- if (data.closes) return null;
49
+ if (data.closes && !data.navigate) return null;
50
50
  const extra = buildClickExtra(data);
51
51
  if (!extra) return null;
52
52
  return { id, event: "click", extra };
@@ -1,4 +1,4 @@
1
- import { I as RuntimeEventName, G as DslInteractionEvent } from '../types-8FNxDXp0.cjs';
1
+ import { I as RuntimeEventName, G as DslInteractionEvent } from '../types-DDOAHxQt.cjs';
2
2
 
3
3
  /**
4
4
  * 营销物料上报载荷类型(上报契约的唯一数据源)。
@@ -184,8 +184,10 @@ declare function buildCloseReport(id: string | undefined | null, options?: {
184
184
  * - `interaction` 且 `trigger='action'` → 一条 `click`,`extra` 见 {@link buildClickExtra}
185
185
  * - `interaction` 且 `trigger='show'` / `'close'` → `null`:曝光 / 关闭由宿主统一上报,
186
186
  * 运营配在这两个时机上的埋点名走 {@link buildExposureReport} / {@link buildCloseReport} 的 `extra`
187
- * - `interaction` 且 `trigger='action'` `closes` 为真(手势里执行了关闭动作)→ `null`:
188
- * 点关闭按钮的本质是关闭,不再算一次点击
187
+ * - `interaction` 且 `trigger='action'`、`closes` 为真(手势里执行了关闭动作)但**没有** `navigate`
188
+ * → `null`:纯关闭手势的本质是关闭,不再算一次点击
189
+ * - `interaction` 且 `trigger='action'`、`closes` 为真但同一次交互里**有** `navigate`
190
+ * → 照常产出 `click`:跳走了就是一次转化行为,「顺手关掉弹窗」只是它的副作用
189
191
  * - 其余事件(`track` / `navigate` / `close` / `call` / `error` / `state-change` /
190
192
  * `view-change` / `ready` / `open`)不产生上报 —— 它们是动作粒度的事件,按它们上报会重复计数
191
193
  *
@@ -1,4 +1,4 @@
1
- import { I as RuntimeEventName, G as DslInteractionEvent } from '../types-8FNxDXp0.js';
1
+ import { I as RuntimeEventName, G as DslInteractionEvent } from '../types-DDOAHxQt.js';
2
2
 
3
3
  /**
4
4
  * 营销物料上报载荷类型(上报契约的唯一数据源)。
@@ -184,8 +184,10 @@ declare function buildCloseReport(id: string | undefined | null, options?: {
184
184
  * - `interaction` 且 `trigger='action'` → 一条 `click`,`extra` 见 {@link buildClickExtra}
185
185
  * - `interaction` 且 `trigger='show'` / `'close'` → `null`:曝光 / 关闭由宿主统一上报,
186
186
  * 运营配在这两个时机上的埋点名走 {@link buildExposureReport} / {@link buildCloseReport} 的 `extra`
187
- * - `interaction` 且 `trigger='action'` `closes` 为真(手势里执行了关闭动作)→ `null`:
188
- * 点关闭按钮的本质是关闭,不再算一次点击
187
+ * - `interaction` 且 `trigger='action'`、`closes` 为真(手势里执行了关闭动作)但**没有** `navigate`
188
+ * → `null`:纯关闭手势的本质是关闭,不再算一次点击
189
+ * - `interaction` 且 `trigger='action'`、`closes` 为真但同一次交互里**有** `navigate`
190
+ * → 照常产出 `click`:跳走了就是一次转化行为,「顺手关掉弹窗」只是它的副作用
189
191
  * - 其余事件(`track` / `navigate` / `close` / `call` / `error` / `state-change` /
190
192
  * `view-change` / `ready` / `open`)不产生上报 —— 它们是动作粒度的事件,按它们上报会重复计数
191
193
  *
@@ -44,7 +44,7 @@ function mapRuntimeEventToReport(id, event, payload) {
44
44
  if (event !== "interaction") return null;
45
45
  const data = payload != null ? payload : {};
46
46
  if (data.trigger !== "action") return null;
47
- if (data.closes) return null;
47
+ if (data.closes && !data.navigate) return null;
48
48
  const extra = buildClickExtra(data);
49
49
  if (!extra) return null;
50
50
  return { id, event: "click", extra };
@@ -383,9 +383,14 @@ interface DslInteractionEvent {
383
383
  /**
384
384
  * 这次交互里执行了关闭动作(`close` / `closeAll`)。
385
385
  *
386
- * 用来把「点关闭按钮」和「点营销内容」区分开:前者的本质是关闭,不该再算一次点击。
387
- * 运营常把埋点配进关闭按钮的 `sequence: [track, close]`,不标记的话这一下会同时
388
- * 产出 close 和 click 两条,点击量照样虚增。埋点名不会丢 —— 宿主把它并进 close 上报。
386
+ * 用来把「点关闭按钮」和「点营销内容」区分开:**纯关闭手势**(有关闭动作、又没有
387
+ * `navigate`)的本质是关闭,不该再算一次点击。运营常把埋点配进关闭按钮的
388
+ * `sequence: [track, close]`,不标记的话这一下会同时产出 close 和 click 两条,
389
+ * 点击量虚增。埋点名不会丢 —— 宿主把它并进 close 上报。
390
+ *
391
+ * 例外:同一次交互里还有 `navigate` 时仍算一次 click。转化型主 CTA 常写成
392
+ * `sequence: [track, closeAll, navigate]`(跳走前顺手收掉弹窗),真跳转了就是转化行为,
393
+ * 关闭只是副作用。此时埋点名已进 click 的 `extra`,宿主不再把它并进 close。
389
394
  */
390
395
  closes?: boolean;
391
396
  }
@@ -383,9 +383,14 @@ interface DslInteractionEvent {
383
383
  /**
384
384
  * 这次交互里执行了关闭动作(`close` / `closeAll`)。
385
385
  *
386
- * 用来把「点关闭按钮」和「点营销内容」区分开:前者的本质是关闭,不该再算一次点击。
387
- * 运营常把埋点配进关闭按钮的 `sequence: [track, close]`,不标记的话这一下会同时
388
- * 产出 close 和 click 两条,点击量照样虚增。埋点名不会丢 —— 宿主把它并进 close 上报。
386
+ * 用来把「点关闭按钮」和「点营销内容」区分开:**纯关闭手势**(有关闭动作、又没有
387
+ * `navigate`)的本质是关闭,不该再算一次点击。运营常把埋点配进关闭按钮的
388
+ * `sequence: [track, close]`,不标记的话这一下会同时产出 close 和 click 两条,
389
+ * 点击量虚增。埋点名不会丢 —— 宿主把它并进 close 上报。
390
+ *
391
+ * 例外:同一次交互里还有 `navigate` 时仍算一次 click。转化型主 CTA 常写成
392
+ * `sequence: [track, closeAll, navigate]`(跳走前顺手收掉弹窗),真跳转了就是转化行为,
393
+ * 关闭只是副作用。此时埋点名已进 click 的 `extra`,宿主不再把它并进 close。
389
394
  */
390
395
  closes?: boolean;
391
396
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yaoxiu/marketing-dsl",
3
- "version": "2.6.1",
3
+ "version": "2.8.0",
4
4
  "type": "module",
5
5
  "description": "营销弹窗 DSL 解释器核心,纯逻辑无框架依赖",
6
6
  "license": "MIT",