@yaoxiu/marketing-dsl 1.5.2 → 2.0.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.
@@ -65,6 +65,34 @@ var STYLE_MAP = {
65
65
  };
66
66
  var ALLOWED_STYLE_KEYS = Object.keys(STYLE_MAP);
67
67
 
68
+ // src/user-fields.ts
69
+ var DEFAULT_USER_FIELDS = [
70
+ "shopId",
71
+ "shopName",
72
+ "collectCount",
73
+ "albbCollectCount",
74
+ "isNewUser",
75
+ "levelId",
76
+ "levelName",
77
+ "serviceExpireTime",
78
+ "remainDays",
79
+ "userTypeNew",
80
+ "serviceInfo"
81
+ ];
82
+ var USER_FIELD_LABELS = {
83
+ shopId: "\u5E97\u94FA ID",
84
+ shopName: "\u5E97\u94FA\u540D\u79F0",
85
+ collectCount: "\u5269\u4F59\u91C7\u96C6\u6B21\u6570",
86
+ albbCollectCount: "\u5269\u4F59 1688 \u91C7\u96C6\u6B21\u6570",
87
+ isNewUser: "\u662F\u5426\u65B0\u7528\u6237\uFF080 / 1\uFF0C\u53EF\u76F4\u63A5\u7528\u4E8E visibleWhen\uFF09",
88
+ levelId: "\u7248\u672C ID",
89
+ levelName: "\u7248\u672C\u540D\u79F0\uFF0C\u5982\u300C\u4E13\u4E1A\u7248\u300D",
90
+ serviceExpireTime: "\u670D\u52A1\u5230\u671F\u65F6\u95F4\uFF0C\u53EF\u76F4\u63A5\u5582\u7ED9 countdown \u7684 to",
91
+ remainDays: "\u670D\u52A1\u5269\u4F59\u5929\u6570",
92
+ userTypeNew: "\u65B0\u5546\u7528\u6237\u7C7B\u578B\uFF080 \u672A\u8BBE\u7F6E / 1 \u6709\u8D27\u6E90 / 2 \u65E0\u8D27\u6E90 / 3 \u4E24\u8005\u517C\u5907\uFF09",
93
+ serviceInfo: "\u5BA2\u670D\u4E0E\u793E\u7FA4\u4FE1\u606F\uFF08\u5BF9\u8C61\uFF0C\u6309\u9700\u53D6\u5B50\u5B57\u6BB5\uFF09"
94
+ };
95
+
68
96
  // src/validate.ts
69
97
  var DSL_VERSION = 1;
70
98
  var NODE_TYPES = [
@@ -335,6 +363,16 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6`
335
363
  tone: "info",
336
364
  text: "\u66DD\u5149\u57CB\u70B9\u7B49\u6570\u636E\u6E90\u8FD4\u56DE\u540E\u624D\u89E6\u53D1\u2014\u2014\u6570\u636E\u6CA1\u56DE\u6765\u65F6\u5F39\u7A97\u6839\u672C\u6CA1\u6E32\u67D3\uFF0C\u8FD9\u65F6\u5019\u4E0A\u62A5\u66DD\u5149\u4F1A\u628A\u8F6C\u5316\u7387\u7B97\u4F4E\u3002\u591A\u89C6\u56FE\u4E0B\u6BCF\u5C42\u5404\u57CB\u5404\u7684\uFF0C\u53EF\u4EE5\u5206\u522B\u7EDF\u8BA1\u300C\u516C\u544A\u6761\u66DD\u5149\u300D\u548C\u300C\u70B9\u5F00\u540E\u7684\u5F39\u7A97\u66DD\u5149\u300D\u3002"
337
365
  },
366
+ {
367
+ t: "note",
368
+ tone: "warn",
369
+ text: "**\u8FD9\u4E24\u4E2A\u94A9\u5B50\u91CC\u7684 `track` \u4E0D\u4F1A\u88AB\u7B97\u6210\u70B9\u51FB\u3002** \u4E0A\u62A5\u7684 `event` \u662F\u7269\u6599\u751F\u547D\u5468\u671F\u7684\u56FA\u5B9A\u4E09\u503C\uFF08\u66DD\u5149 / \u70B9\u51FB / \u5173\u95ED\uFF09\uFF0C\u524D\u53F0\u6309**\u65F6\u673A**\u51B3\u5B9A\u62A5\u54EA\u4E00\u4E2A\uFF1A`onShow` \u91CC\u7684\u57CB\u70B9\u540D\u5E76\u8FDB\u90A3\u6761\u66DD\u5149\u3001`onClose` \u91CC\u7684\u57CB\u70B9\u540D\u5E76\u8FDB\u90A3\u6761\u5173\u95ED\uFF0C\u90FD\u4F5C\u4E3A\u9644\u52A0\u5B57\u6BB5\u4E0A\u62A5\uFF0C\u8FD0\u8425\u5728\u540E\u7AEF\u7167\u6837\u770B\u5F97\u5230\uFF0C\u53EA\u662F\u4E0D\u4F1A\u6C61\u67D3\u70B9\u51FB\u91CF\u3002\u771F\u6B63\u7B97\u70B9\u51FB\u7684\u53EA\u6709\u300C\u7528\u6237\u70B9\u4E86\u5E26 `action` \u7684\u8282\u70B9\u300D\u3002"
370
+ },
371
+ {
372
+ t: "note",
373
+ tone: "info",
374
+ text: "\u540C\u7406\uFF0C\u4E00\u6B21\u70B9\u51FB\u91CC\u5199 `sequence: [track, navigate]`\uFF08\u5148\u57CB\u70B9\u518D\u8DF3\u8F6C\uFF09**\u53EA\u4E0A\u62A5\u4E00\u6761\u70B9\u51FB**\uFF0C\u4E0D\u662F\u4E24\u6761\u2014\u2014\u4E0A\u62A5\u6309\u300C\u4E00\u6B21\u624B\u52BF\u300D\u8BA1\u6570\uFF0C\u4E0D\u6309\u52A8\u4F5C\u4E2A\u6570\u8BA1\u6570\u3002\u653E\u5FC3\u6309\u9700\u8981\u4E32\u52A8\u4F5C\u3002"
375
+ },
338
376
  { t: "h3", text: "\u516C\u544A\u6761 / Banner \u600E\u4E48\u5173" },
339
377
  {
340
378
  t: "p",
@@ -358,7 +396,49 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6`
358
396
  {
359
397
  t: "note",
360
398
  tone: "info",
361
- text: "\u6574\u6761\u516C\u544A\u6761\u53EF\u70B9\u3001\u884C\u672B\u53C8\u6709 \xD7 \u65F6\u4E0D\u7528\u62C5\u5FC3\u51B2\u7A81\uFF1A\u5185\u5C42\u8282\u70B9\u6709\u81EA\u5DF1\u7684 `action` \u5C31\u4E0D\u4F1A\u518D\u5192\u6CE1\u7ED9\u5916\u5C42\uFF0C\u70B9 \xD7 \u53EA\u4F1A\u5173\u95ED\uFF0C\u4E0D\u4F1A\u540C\u65F6\u89E6\u53D1\u5916\u5C42\u7684\u8DF3\u8F6C\u6216\u5F39\u7A97\u3002"
399
+ text: "\u6574\u6761\u516C\u544A\u6761\u53EF\u70B9\u3001\u884C\u672B\u53C8\u6709 \xD7 \u65F6\u4E0D\u7528\u62C5\u5FC3\u51B2\u7A81\uFF1A\u5185\u5C42\u8282\u70B9\u6709\u81EA\u5DF1\u7684 `action` \u5C31\u4E0D\u4F1A\u518D\u5192\u6CE1\u7ED9\u5916\u5C42\uFF0C\u70B9 \xD7 \u53EA\u4F1A\u5173\u95ED\uFF0C\u4E0D\u4F1A\u540C\u65F6\u89E6\u53D1\u5916\u5C42\u7684\u8DF3\u8F6C\u6216\u5F39\u7A97\u3002\u4E0D\u8FC7**\u4E0D\u5EFA\u8BAE\u628A\u6574\u6761\u516C\u544A\u6761\u505A\u6210\u53EF\u70B9**\u2014\u2014\u7528\u6237\u60F3\u9009\u4E2D\u6587\u6848\u590D\u5236\u65F6\u4F1A\u8BEF\u89E6\u53D1\uFF0C\u628A\u6253\u5F00\u5165\u53E3\u6536\u5728\u53F3\u4FA7\u6309\u94AE\u4E0A\u66F4\u7A33\u3002"
400
+ },
401
+ { t: "h3", text: "\u57CB\u70B9\u5199\u5728\u54EA\uFF0C\u51B3\u5B9A\u5B83\u88AB\u7B97\u6210\u4EC0\u4E48\uFF08\u91CD\u8981\uFF09" },
402
+ {
403
+ t: "p",
404
+ text: "\u4E0A\u62A5\u7ED9\u540E\u7AEF\u7684\u4E8B\u4EF6\u53EA\u6709\u4E09\u79CD\uFF1A`exposure` \u66DD\u5149 / `click` \u70B9\u51FB / `close` \u5173\u95ED\u3002\u4F60\u914D\u7684 `track` **\u4E0D\u662F**\u7B2C\u56DB\u79CD\u4E8B\u4EF6\uFF0C\u5B83\u662F\u5F80\u8FD9\u4E09\u79CD\u91CC\u9644\u52A0\u300C\u4F60\u8D77\u7684\u540D\u5B57\u300D\u3002\u540C\u4E00\u4E2A `track` \u5199\u5728\u4E0D\u540C\u4F4D\u7F6E\uFF0C\u5F52\u5C5E\u5B8C\u5168\u4E0D\u540C\uFF1A"
405
+ },
406
+ {
407
+ t: "table",
408
+ head: ["track \u5199\u5728\u54EA", "\u7B97\u6210\u4EC0\u4E48", "\u4F60\u914D\u7684\u4E8B\u4EF6\u540D\u53BB\u54EA"],
409
+ rows: [
410
+ [
411
+ "\u8282\u70B9\u7684 `action` \u91CC\uFF08\u7528\u6237\u70B9\u4E86\u5B83\uFF09",
412
+ "\u4E00\u6761 `click`",
413
+ "`extra.name`\uFF1B\u540C\u4E00\u6B21\u70B9\u51FB\u91CC\u914D\u7684\u8DF3\u8F6C\u5730\u5740\u5E76\u8FDB `extra.url`"
414
+ ],
415
+ ["`stage.onShow`", "**\u4E0D\u7B97\u70B9\u51FB**\uFF0C\u5E76\u8FDB\u90A3\u6761\u66DD\u5149", "`exposure` \u7684 `extra.name`"],
416
+ [
417
+ "`stage.onClose`",
418
+ "**\u4E0D\u7B97\u70B9\u51FB**\uFF0C\u5E76\u8FDB\u90A3\u6761\u5173\u95ED",
419
+ "`close` \u7684 `extra.name`\uFF08`reason` \u4ECD\u662F\u5173\u95ED\u539F\u56E0\uFF09"
420
+ ],
421
+ [
422
+ "\u5173\u95ED\u6309\u94AE\u7684 `action` \u91CC\uFF08\u548C `close` \u5199\u5728\u540C\u4E00\u4E2A `sequence`\uFF09",
423
+ "**\u4E0D\u7B97\u70B9\u51FB**\uFF0C\u5E76\u8FDB\u90A3\u6761\u5173\u95ED",
424
+ "`close` \u7684 `extra.name`"
425
+ ]
426
+ ]
427
+ },
428
+ {
429
+ t: "note",
430
+ tone: "warn",
431
+ text: "**\u4E00\u6B21\u70B9\u51FB\u53EA\u4EA7\u751F\u4E00\u6761 `click`\u3002**\u300C\u5148\u57CB\u70B9\u518D\u8DF3\u8F6C\u300D\u8FD9\u79CD\u6700\u5E38\u89C1\u7684 `sequence` \u5199\u6CD5\uFF0C\u4E24\u4E2A\u52A8\u4F5C\u4F1A\u5408\u5E76\u6210\u4E00\u6761\u4E0A\u62A5\uFF0C\u4E0D\u4F1A\u88AB\u7B97\u6210\u4E24\u6B21\u70B9\u51FB\u2014\u2014\u6240\u4EE5\u653E\u5FC3\u6309\u7B2C 11 \u8282\u5F00\u5934\u90A3\u4E2A\u4F8B\u5B50\u5199\u3002"
432
+ },
433
+ {
434
+ t: "note",
435
+ tone: "warn",
436
+ 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'
437
+ },
438
+ {
439
+ t: "note",
440
+ tone: "warn",
441
+ text: "**\u591A\u89C6\u56FE\u91CC\u300C\u5173\u6389\u67D0\u4E00\u5C42\u300D\u76EE\u524D\u4E0D\u4EA7\u751F\u4EFB\u4F55\u4E0A\u62A5\u3002**\u6BD4\u5982\u516C\u544A\u6761\u70B9\u5F00\u5F39\u7A97\u540E\u53C8\u5173\u6389\u5F39\u7A97\uFF0C\u6B64\u65F6\u7269\u6599\u5E76\u6CA1\u6709\u5173\uFF08\u516C\u544A\u6761\u8FD8\u5728\u9875\u9762\u4E0A\uFF09\uFF0C\u6240\u4EE5\u65E2\u6CA1\u6709 `click` \u4E5F\u6CA1\u6709 `close`\u3002\u4F60\u5728\u90A3\u4E00\u5C42\u914D\u7684 `onClose` \u57CB\u70B9\u7B49\u4E0D\u5230\u6570\u636E\u2014\u2014\u8FD9\u662F\u5F53\u524D\u4E0A\u62A5\u6A21\u578B\u7684\u5DF2\u77E5\u7A7A\u767D\uFF0C\u9700\u8981\u7EDF\u8BA1\u300C\u6253\u5F00\u540E\u53C8\u5173\u6389\u300D\u7684\u8F6C\u5316\uFF0C\u5148\u627E\u524D\u7AEF / \u540E\u7AEF\u4E00\u8D77\u5B9A\u53E3\u5F84\uFF0C\u522B\u6307\u671B\u914D\u4E86\u5C31\u6709\u3002"
362
442
  }
363
443
  ]
364
444
  }
@@ -379,7 +459,7 @@ var sections2 = [
379
459
  t: "code",
380
460
  code: `{
381
461
  "type": "countdown",
382
- "to": "{{ user.trialEndAt }}",
462
+ "to": "{{ user.serviceExpireTime }}",
383
463
  "precision": "cs", // "s" \u6BCF\u79D2\uFF08\u9ED8\u8BA4\uFF09| "cs" \u5398\u79D2\uFF0C\u9010\u5E27\u5237\u65B0
384
464
  "as": "cd", // \u6CE8\u5165\u7684\u53D8\u91CF\u540D\uFF0C\u9ED8\u8BA4 cd
385
465
  "style": { "align": "center", "gap": 6 },
@@ -451,7 +531,7 @@ var sections2 = [
451
531
  ["\u4E2D\u6587", '`"2026\u5E749\u67081\u65E5"` `"2026\u5E749\u67081\u65E5 18\u70B9"` `"2026\u5E749\u67081\u65E5 18\u70B930\u5206"`'],
452
532
  ["\u63A5\u53E3\u8FD4\u56DE\u7684\u683C\u5F0F", '`"2026-09-01T18:00:00Z"` `"2026-09-01T18:00:00+08:00"`'],
453
533
  ["\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09", "`1786949074954`"],
454
- ["\u4ECE\u6570\u636E\u91CC\u53D6", '`"{{ user.trialEndAt }}"`']
534
+ ["\u4ECE\u6570\u636E\u91CC\u53D6", '`"{{ user.serviceExpireTime }}"`']
455
535
  ]
456
536
  },
457
537
  {
@@ -474,6 +554,10 @@ var sections2 = [
474
554
  var countdown_default = sections2;
475
555
 
476
556
  // src/docs/sections/data-state.ts
557
+ var userFieldRows = DEFAULT_USER_FIELDS.map((field) => [
558
+ `\`user.${field}\``,
559
+ USER_FIELD_LABELS[field] || ""
560
+ ]);
477
561
  var sections3 = [
478
562
  {
479
563
  id: "data",
@@ -505,6 +589,11 @@ var sections3 = [
505
589
  t: "p",
506
590
  text: "\u6570\u636E\u6CA1\u56DE\u6765\u3001\u6216\u8005\u62C9\u5931\u8D25\uFF0C\u5F39\u7A97\u90FD**\u4E0D\u4F1A\u6E32\u67D3**\uFF08\u4E0D\u5F39\u7A7A\u58F3\uFF09\u3002\u6240\u4EE5\u4E0D\u7528\u5728 DSL \u91CC\u5904\u7406\u52A0\u8F7D\u6001\u3002"
507
591
  },
592
+ {
593
+ t: "note",
594
+ tone: "warn",
595
+ text: "**\u8FD9\u6761\u7684\u53E6\u4E00\u9762**\uFF1A\u586B\u4E86\u4E00\u4E2A\u5BBF\u4E3B\u6CA1\u6CE8\u518C\u7684\u6570\u636E\u6E90\u540D\uFF0C\u6574\u4EFD\u7269\u6599\u5C31\u4E00\u76F4\u662F\u7A7A\u7684\u2014\u2014\u9875\u9762\u4E0A\u4EC0\u4E48\u90FD\u4E0D\u51FA\u73B0\uFF0C\u4E5F\u4E0D\u4F1A\u62A5\u9519\u7ED9\u7528\u6237\u770B\u3002\u8C03\u8BD5\u53F0\u91CC\u9884\u89C8\u6B63\u5E38\u4E0D\u4EE3\u8868\u7EBF\u4E0A\u4E5F\u6B63\u5E38\uFF1A\u6570\u636E\u6E90\u662F**\u6309\u9875\u9762\u6CE8\u518C**\u7684\uFF0CA \u9875\u9762\u80FD\u7528\u7684\u6E90 B \u9875\u9762\u672A\u5FC5\u6709\u3002\u914D\u597D\u4E4B\u540E\u4E00\u5B9A\u8981\u5728\u76EE\u6807\u9875\u9762\u4E0A\u771F\u8DD1\u4E00\u904D\uFF0C\u522B\u53EA\u5728\u8C03\u8BD5\u53F0\u91CC\u770B\u3002"
596
+ },
508
597
  { t: "h3", text: "state\uFF1A\u5C40\u90E8\u72B6\u6001" },
509
598
  {
510
599
  t: "p",
@@ -546,12 +635,26 @@ var sections3 = [
546
635
  rows: [
547
636
  ["`plans` \u7B49", "`data` \u7684\u5B57\u6BB5\u76F4\u63A5\u63D0\u5230\u9876\u5C42"],
548
637
  ["`state.xxx`", "\u5F53\u524D\u5C40\u90E8\u72B6\u6001"],
549
- ["`user.xxx`", "\u5BBF\u4E3B\u9875\u9762\u6CE8\u5165\u7684\u7528\u6237\u4FE1\u606F\uFF08\u7248\u672C\u3001\u5230\u671F\u5929\u6570\u3001\u5E97\u94FA\u540D\u2026\uFF09\uFF0C\u4E0D\u7528\u53D1\u8BF7\u6C42"],
638
+ [
639
+ "`user.xxx`",
640
+ "\u5BBF\u4E3B\u9875\u9762\u6CE8\u5165\u7684\u767B\u5F55\u7528\u6237\u4FE1\u606F\uFF08\u7248\u672C\u3001\u5269\u4F59\u5929\u6570\u3001\u5E97\u94FA\u540D\u2026\uFF09\uFF0C\u4E0D\u7528\u53D1\u8BF7\u6C42\uFF0C\u5B57\u6BB5\u6E05\u5355\u89C1\u4E0B"
641
+ ],
550
642
  ["`current` \u7B49", "`derived` \u63A8\u5BFC\u51FA\u6765\u7684\u522B\u540D"],
551
643
  ["`item` / `index`", "\u4EC5\u5728 `repeat` \u7684 `template` \u5185\u53EF\u7528"],
552
644
  ["`cd.xxx`", "\u4EC5\u5728 `countdown` \u7684 `children` \u5185\u53EF\u7528"]
553
645
  ]
554
646
  },
647
+ { t: "h3", text: "user.xxx\uFF1A\u53EF\u7528\u5B57\u6BB5\u6E05\u5355" },
648
+ {
649
+ t: "p",
650
+ text: "`user` \u662F\u5BBF\u4E3B\u6CE8\u5165\u7684\u767B\u5F55\u7528\u6237\u4FE1\u606F\uFF0C**\u53EA\u6709\u4E0B\u9762\u8FD9\u4E9B\u5B57\u6BB5**\uFF0C\u5B57\u6BB5\u540D\u5168\u5E73\u53F0\u901A\u7528\u3002\u5199\u522B\u7684\u540D\u5B57\uFF08\u5982 `user.expireDays`\uFF09\u4E0D\u4F1A\u62A5\u9519\uFF0C\u53EA\u4F1A\u6C42\u503C\u4E3A\u7A7A\u2014\u2014\u9875\u9762\u4E0A\u5C31\u662F\u4E00\u5904\u7A7A\u767D\u3001\u5012\u8BA1\u65F6\u5F52\u96F6\uFF0C\u6240\u4EE5\u4FDD\u5B58\u524D\u4F1A\u6309\u8FD9\u5F20\u8868\u6821\u9A8C\u4E00\u904D\u3002"
651
+ },
652
+ { t: "table", head: ["\u5B57\u6BB5", "\u542B\u4E49"], rows: userFieldRows },
653
+ {
654
+ t: "note",
655
+ tone: "warn",
656
+ text: "\u5012\u8BA1\u65F6\u7684 `to` \u8981\u7528 `{{ user.serviceExpireTime }}`\uFF08\u5230\u671F\u65F6\u95F4\u70B9\uFF09\uFF0C\u4E0D\u662F `{{ user.remainDays }}`\uFF08\u5269\u4F59\u5929\u6570\uFF0C\u662F\u4E2A\u6570\u5B57\uFF0C\u53EA\u80FD\u5199\u5728\u6587\u6848\u91CC\uFF09\u3002"
657
+ },
555
658
  { t: "h3", text: "\u5728\u54EA\u4E9B\u5730\u65B9\u80FD\u5199 {{ }}" },
556
659
  {
557
660
  t: "p",
@@ -588,7 +691,7 @@ var sections3 = [
588
691
  "visibleWhen": "current.gift != ''" }
589
692
 
590
693
  // \u53EA\u5BF9\u65B0\u7528\u6237\u663E\u793A
591
- { "type": "text", "content": "\u65B0\u4EBA\u4E13\u4EAB", "visibleWhen": "user.isNew" }`
694
+ { "type": "text", "content": "\u65B0\u4EBA\u4E13\u4EAB", "visibleWhen": "user.isNewUser" }`
592
695
  },
593
696
  { t: "h3", text: "\u5207 tab \u65F6\u6574\u4F53\u6362\u80A4 / \u6362\u5E03\u5C40" },
594
697
  {
@@ -1006,6 +1109,16 @@ var sections6 = [
1006
1109
  t: "note",
1007
1110
  tone: "warn",
1008
1111
  text: "\u653E\u5230\u5916\u9762\u65F6\u8BB0\u5F97\u7559\u51FA\u7A7A\u95F4\uFF1A\u5F39\u7A97\u56DB\u5468\u6709 20px \u5185\u8FB9\u8DDD\uFF0C\u8D85\u8FC7\u8FD9\u4E2A\u8DDD\u79BB\u5728\u5C0F\u5C4F\u4E0A\u53EF\u80FD\u8D34\u8FB9\u3002\u5728\u8C03\u8BD5\u53F0\u91CC\u628A\u9884\u89C8\u7F29\u653E\u5207\u5230 100% \u786E\u8BA4\u4E00\u4E0B\u3002"
1112
+ },
1113
+ { t: "h3", text: "banner / \u516C\u544A\u6761\uFF1A\u522B\u5199 maxWidth" },
1114
+ {
1115
+ t: "p",
1116
+ text: '`maxWidth` \u662F\u7ED9**\u5F39\u7A97**\u7528\u7684\uFF08\u5F39\u7A97\u8981\u9650\u5BBD\uFF0C\u5426\u5219\u5927\u5C4F\u4E0A\u4F1A\u62C9\u5F97\u5F88\u957F\uFF09\u3002banner \u548C\u516C\u544A\u6761\u662F\u901A\u680F\u5F62\u6001\uFF0C\u5BBD\u5EA6\u5E94\u8BE5\u7531\u9875\u9762\u4E0A\u90A3\u4E2A\u5751\u4F4D\u51B3\u5B9A\u2014\u2014\u5751\u4F4D\u6709\u591A\u5BBD\u662F\u5404\u4E2A\u9875\u9762\u7684\u5E03\u5C40\u8BF4\u4E86\u7B97\uFF0C\u914D\u7F6E\u91CC\u5199\u6B7B\u4E00\u4E2A\u4E0A\u9650\uFF0C\u4E00\u65E6\u5C0F\u4E8E\u5751\u4F4D\u5BBD\u5EA6\u5C31\u94FA\u4E0D\u6EE1\u3001\u53F3\u8FB9\u7A7A\u4E00\u622A\u3002\u5199 `"width": "100%"` \u5C31\u591F\u4E86\u3002'
1117
+ },
1118
+ {
1119
+ t: "note",
1120
+ tone: "info",
1121
+ text: "\u786E\u5B9E\u60F3\u9650\u5BBD\uFF08\u6BD4\u5982\u8D85\u5BBD\u5C4F\u4E0A\u522B\u62C9\u592A\u957F\uFF09\u4E5F\u53EF\u4EE5\u5199\uFF0C\u5199\u4E86\u4F1A\u81EA\u52A8\u5C45\u4E2D\u3001\u4E0D\u4F1A\u8D34\u7740\u5DE6\u8FB9\u3002\u4F46\u5148\u786E\u8BA4\u76EE\u6807\u9875\u9762\u7684\u5751\u4F4D\u5230\u5E95\u6709\u591A\u5BBD\uFF0C\u522B\u51ED\u611F\u89C9\u586B\u4E00\u4E2A\u6570\u5B57\u3002"
1009
1122
  }
1010
1123
  ]
1011
1124
  }
@@ -1351,6 +1464,22 @@ var sections_default = sections9;
1351
1464
 
1352
1465
  // src/docs/meta.ts
1353
1466
  var changelog = [
1467
+ {
1468
+ date: "2026-08-22",
1469
+ items: [
1470
+ "\u5217\u51FA user \u53EF\u7528\u5B57\u6BB5\u6E05\u5355\uFF08\u7B2C 9 \u8282\uFF09\uFF1A\u5BBF\u4E3B\u6CE8\u5165\u7684\u5C31\u662F\u767B\u5F55\u7528\u6237\u4FE1\u606F\u90A3\u4E00\u5957\uFF0C\u5B57\u6BB5\u540D\u5168\u5E73\u53F0\u901A\u7528",
1471
+ "\u4FDD\u5B58\u65F6\u53EF\u6309\u767D\u540D\u5355\u6821\u9A8C {{ user.xxx }}\uFF0C\u5199\u9519\u5B57\u6BB5\u540D\u76F4\u63A5\u62A5\u9519\u5E76\u63D0\u793A\u6700\u63A5\u8FD1\u7684\u5019\u9009\u2014\u2014\u4EE5\u524D\u53EA\u4F1A\u5728\u9875\u9762\u4E0A\u663E\u793A\u6210\u7A7A\u767D",
1472
+ "\u793A\u4F8B\u7EDF\u4E00\u6539\u7528\u771F\u5B9E\u5B57\u6BB5\uFF1A\u5269\u4F59\u5929\u6570\u4E00\u5F8B user.remainDays\uFF08\u539F\u5148 lastDayLeft / expireDays / trialLeftDays \u4E09\u79CD\u5199\u6CD5\u90FD\u662F\u4E0D\u5B58\u5728\u7684\u5B57\u6BB5\uFF09\uFF0C\u5230\u671F\u65F6\u95F4 user.serviceExpireTime\uFF0C\u7248\u672C\u540D user.levelName",
1473
+ "\u793A\u4F8B \u2467 \u6574\u56FE Banner \u6539\u6210\u7A84\u901A\u680F\u6BD4\u4F8B 960 \xD7 56\uFF0C\u5E95\u56FE\u6362\u6210\u5185\u8054 SVG \u5360\u4F4D\u56FE\uFF08\u5916\u94FE\u5728\u5BBF\u4E3B\u73AF\u5883\u4E0D\u4E00\u5B9A\u901A\uFF09",
1474
+ "\u65B0\u589E\u7B2C 11 \u8282\u300C\u57CB\u70B9\u5199\u5728\u54EA\uFF0C\u51B3\u5B9A\u5B83\u88AB\u7B97\u6210\u4EC0\u4E48\u300D\uFF1A\u540C\u4E00\u4E2A track \u5199\u5728\u8282\u70B9 action / stage.onShow / stage.onClose / \u5173\u95ED\u6309\u94AE\u91CC\uFF0C\u5F52\u5C5E\u5B8C\u5168\u4E0D\u540C\uFF0C\u52A1\u5FC5\u770B\u4E00\u904D",
1475
+ "\u3010\u53E3\u5F84\u4FEE\u6B63\u3011\u4E00\u6B21\u70B9\u51FB\u53EA\u4EA7\u751F\u4E00\u6761 click\uFF1A\u4EE5\u524D\u300C\u5148\u57CB\u70B9\u518D\u8DF3\u8F6C\u300D\u7684 sequence \u4F1A\u88AB\u7B97\u6210\u4E24\u6B21\u70B9\u51FB\uFF0ConShow / onClose \u91CC\u7684\u57CB\u70B9\u4E5F\u88AB\u7B97\u6210\u70B9\u51FB\uFF0C\u5B9E\u6D4B\u4E00\u4E2A\u5F39\u7A97\u7684\u5B8C\u6574\u751F\u547D\u5468\u671F\u4E0A\u62A5\u4E86 6 \u6761\u3001\u70B9\u51FB\u91CF\u865A\u9AD8 4 \u500D\uFF0C\u73B0\u5DF2\u4FEE\u6B63",
1476
+ "\u3010\u53E3\u5F84\u4FEE\u6B63\u3011\u5173\u95ED\u52A8\u4F5C\u4E0D\u518D\u7B97\u70B9\u51FB\uFF1A\u914D\u5728\u5173\u95ED\u6309\u94AE\u4E0A\u7684\u57CB\u70B9\u540D\u5E76\u8FDB close \u7684 extra\uFF0C\u60F3\u533A\u5206\u5173\u95ED\u5165\u53E3\u8BF7\u7528 close \u52A8\u4F5C\u7684 reason",
1477
+ "\u3010\u5DF2\u77E5\u7A7A\u767D\u3011\u591A\u89C6\u56FE\u91CC\u300C\u5173\u6389\u67D0\u4E00\u5C42\u300D\u4E0D\u4EA7\u751F\u4EFB\u4F55\u4E0A\u62A5\uFF08\u5982\u516C\u544A\u6761\u5F39\u51FA\u5F39\u7A97\u540E\u53C8\u5173\u6389\u5F39\u7A97\uFF0C\u7269\u6599\u5E76\u6CA1\u6709\u5173\uFF09\uFF0C\u90A3\u4E00\u5C42\u914D\u7684 onClose \u57CB\u70B9\u7B49\u4E0D\u5230\u6570\u636E",
1478
+ "banner / \u516C\u544A\u6761\u4E0D\u8981\u5199 maxWidth\uFF08\u7B2C 3 \u8282\uFF09\uFF1A\u901A\u680F\u5F62\u6001\u7684\u5BBD\u5EA6\u8BE5\u7531\u9875\u9762\u5751\u4F4D\u51B3\u5B9A\uFF0C\u5199\u6B7B\u4E0A\u9650\u4F1A\u94FA\u4E0D\u6EE1\u3001\u53F3\u8FB9\u7A7A\u4E00\u622A\uFF1B\u786E\u5B9E\u8981\u9650\u5BBD\u5219\u4F1A\u81EA\u52A8\u5C45\u4E2D",
1479
+ "\u6570\u636E\u6E90\u586B\u4E86\u5BBF\u4E3B\u6CA1\u6CE8\u518C\u7684\u540D\u5B57\uFF0C\u6574\u4EFD\u7269\u6599\u4E00\u76F4\u662F\u7A7A\u7684\u3001\u4E0D\u62A5\u9519\uFF08\u7B2C 8 \u8282\uFF09\uFF1A\u6570\u636E\u6E90\u6309\u9875\u9762\u6CE8\u518C\uFF0C\u8C03\u8BD5\u53F0\u6B63\u5E38\u4E0D\u4EE3\u8868\u76EE\u6807\u9875\u9762\u6B63\u5E38\uFF0C\u914D\u5B8C\u8981\u5728\u771F\u5B9E\u9875\u9762\u8DD1\u4E00\u904D",
1480
+ "\u793A\u4F8B \u2464 \u516C\u544A\u6761\u6539\u6210\u53EA\u6709\u53F3\u4FA7\u6309\u94AE\u80FD\u6253\u5F00\u5F39\u7A97\uFF1A\u6574\u6761\u53EF\u70B9\u4F1A\u8BA9\u7528\u6237\u60F3\u9009\u4E2D\u6587\u6848\u590D\u5236\u65F6\u8BEF\u89E6\u53D1"
1481
+ ]
1482
+ },
1354
1483
  {
1355
1484
  date: "2026-08-18",
1356
1485
  items: [
@@ -1617,7 +1746,7 @@ var renewExpire = {
1617
1746
  children: [
1618
1747
  {
1619
1748
  type: "text",
1620
- content: "\u23F0 \u8BD5\u7528\u5269 {{ user.trialLeftDays }} \u5929",
1749
+ content: "\u23F0 \u8BD5\u7528\u5269 {{ user.remainDays }} \u5929",
1621
1750
  style: {
1622
1751
  // 不写 alignSelf 会被 flex 列拉满整行,标签必须按内容宽度
1623
1752
  alignSelf: "flex-start",
@@ -1644,7 +1773,7 @@ var renewExpire = {
1644
1773
  children: [
1645
1774
  {
1646
1775
  type: "text",
1647
- content: "{{ user.trialLeftDays }} \u5929\u540E\u8BD5\u7528\u5230\u671F\uFF0C\u4EE5\u4E0B\u80FD\u529B\u4F1A\u505C\u6B62\uFF1A",
1776
+ content: "{{ user.remainDays }} \u5929\u540E\u8BD5\u7528\u5230\u671F\uFF0C\u4EE5\u4E0B\u80FD\u529B\u4F1A\u505C\u6B62\uFF1A",
1648
1777
  style: { fontSize: 15, fontWeight: "800", color: "#1f2533", marginBottom: 11 }
1649
1778
  },
1650
1779
  {
@@ -2038,7 +2167,7 @@ var lastDay = {
2038
2167
  children: [
2039
2168
  {
2040
2169
  type: "text",
2041
- content: "\u{1F525} \u8FD8\u5269\u6700\u540E {{ user.lastDayLeft }} \u5929",
2170
+ content: "\u{1F525} \u8FD8\u5269\u6700\u540E {{ user.remainDays }} \u5929",
2042
2171
  style: {
2043
2172
  alignSelf: "flex-start",
2044
2173
  background: "rgba(255,255,255,0.18)",
@@ -2058,7 +2187,7 @@ var lastDay = {
2058
2187
  // ===== 分格倒计时 + 厘秒逐帧动画 =====
2059
2188
  {
2060
2189
  type: "countdown",
2061
- to: "{{ user.trialEndAt }}",
2190
+ to: "{{ user.serviceExpireTime }}",
2062
2191
  precision: "cs",
2063
2192
  as: "cd",
2064
2193
  style: { align: "center", gap: 6, marginTop: 10 },
@@ -2268,14 +2397,15 @@ var noticeToPopup = {
2268
2397
  state: { plan: 0 },
2269
2398
  derived: { current: { list: "plans", indexBy: "plan" } },
2270
2399
  views: {
2271
- // 常驻在页面里的公告条,点它才弹弹窗
2400
+ // 常驻在页面里的公告条,点右侧按钮才弹弹窗
2272
2401
  bar: {
2273
2402
  type: "notice",
2274
2403
  stage: {
2275
2404
  width: "100%",
2276
2405
  height: "auto",
2277
2406
  layout: "flow",
2278
- style: { radius: 6, background: "#fff8e6", maxWidth: 1200 },
2407
+ // 通栏类型不写 maxWidth,宽度交给宿主坑位(写死上限会铺不满、右边留白)
2408
+ style: { radius: 6, background: "#fff8e6" },
2279
2409
  // 多视图下每层各埋各的,能分别统计「公告条曝光」和「弹窗曝光」
2280
2410
  onShow: { type: "track", event: "notice_show", params: { view: "bar" } },
2281
2411
  onClose: {
@@ -2287,20 +2417,14 @@ var noticeToPopup = {
2287
2417
  nodes: [
2288
2418
  {
2289
2419
  type: "flex",
2290
- // 整条都能点开弹窗
2291
- style: { align: "center", gap: 10, padding: "10px 14px", cursor: "pointer" },
2292
- action: {
2293
- type: "sequence",
2294
- actions: [
2295
- { type: "track", event: "notice_click", params: { from: "bar" } },
2296
- { type: "open", view: "renew" }
2297
- ]
2298
- },
2420
+ // 行容器本身不绑动作:公告条的文案是给人读的,整条可点会让用户
2421
+ // 想选中文字复制时误弹窗;打开弹窗的入口只有右侧那个按钮
2422
+ style: { align: "center", gap: 10, padding: "10px 14px" },
2299
2423
  children: [
2300
2424
  { type: "text", content: "\u{1F4E2}", style: { fontSize: 16 } },
2301
2425
  {
2302
2426
  type: "text",
2303
- content: "{{ user.shopName }}\uFF0C\u4F60\u7684{{ user.version }}\u8FD8\u6709 {{ user.expireDays }} \u5929\u5230\u671F",
2427
+ content: "{{ user.shopName }}\uFF0C\u4F60\u7684{{ user.levelName }}\u8FD8\u6709 {{ user.remainDays }} \u5929\u5230\u671F",
2304
2428
  style: { flex: "1", fontSize: 14, color: "#8a6212", lineHeight: 1.5 }
2305
2429
  },
2306
2430
  {
@@ -2314,7 +2438,7 @@ var noticeToPopup = {
2314
2438
  color: "#fff",
2315
2439
  fontSize: 12
2316
2440
  },
2317
- // 叠一层弹窗,公告条留在下面
2441
+ // 打开弹窗的唯一入口。叠一层弹窗,公告条留在下面
2318
2442
  action: {
2319
2443
  type: "sequence",
2320
2444
  actions: [
@@ -2324,7 +2448,7 @@ var noticeToPopup = {
2324
2448
  }
2325
2449
  },
2326
2450
  {
2327
- // × 有自己的动作,点它不会再冒泡去触发外层的「打开弹窗」
2451
+ // 关掉整条公告(不是关弹窗——此时弹窗还没开)
2328
2452
  type: "text",
2329
2453
  content: "\u2715",
2330
2454
  style: {
@@ -2473,7 +2597,7 @@ var confirmAndSwitch = {
2473
2597
  children: [
2474
2598
  {
2475
2599
  type: "text",
2476
- content: "\u8BD5\u7528\u8FD8\u5269 {{ user.trialLeftDays }} \u5929",
2600
+ content: "\u8BD5\u7528\u8FD8\u5269 {{ user.remainDays }} \u5929",
2477
2601
  style: {
2478
2602
  fontSize: 19,
2479
2603
  fontWeight: "800",
@@ -2946,16 +3070,32 @@ var tabTheme = {
2946
3070
  var tab_theme_default = tabTheme;
2947
3071
 
2948
3072
  // src/docs/examples/image-banner.ts
2949
- var RATIO = "1200 / 300";
3073
+ var RATIO = "960 / 56";
3074
+ var BANNER_SVG = `<svg xmlns="http://www.w3.org/2000/svg" width="960" height="56" viewBox="0 0 960 56">
3075
+ <defs>
3076
+ <linearGradient id="g" x1="0" y1="0" x2="1" y2="0">
3077
+ <stop offset="0" stop-color="#ff4433"/>
3078
+ <stop offset="1" stop-color="#ff8a3c"/>
3079
+ </linearGradient>
3080
+ </defs>
3081
+ <rect width="960" height="56" fill="url(#g)"/>
3082
+ <text x="24" y="34" font-family="sans-serif" font-size="15" fill="#ffffff">\u79CB\u5B63\u5927\u4FC3 \xB7 \u6574\u56FE Banner \u5360\u4F4D\u56FE\uFF08\u5BBD\u5EA6\u81EA\u9002\u5E94\uFF09</text>
3083
+ <rect x="749" y="12" width="144" height="32" rx="16" fill="#ffffff" fill-opacity="0.92"/>
3084
+ <text x="821" y="33" font-family="sans-serif" font-size="14" fill="#d43a1f" text-anchor="middle">\u7ACB\u5373\u67E5\u770B</text>
3085
+ </svg>`;
3086
+ var BANNER_IMAGE = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(BANNER_SVG)}`;
2950
3087
  var imageBanner = {
2951
3088
  version: 1,
2952
3089
  type: "banner",
2953
- meta: { name: "\u6574\u56FE Banner\uFF08\u5BBD\u5EA6\u81EA\u9002\u5E94 + \u70ED\u533A\uFF09" },
3090
+ meta: { name: "\u6574\u56FE Banner\uFF08\u7A84\u901A\u680F + \u70ED\u533A\uFF09" },
2954
3091
  stage: {
2955
3092
  width: "100%",
2956
3093
  height: "auto",
2957
3094
  layout: "flow",
2958
- style: { radius: 8, maxWidth: 1200, overflow: "hidden" },
3095
+ // 不写 maxWidth:banner 是通栏类型,宽度该由宿主坑位决定。写死上限后一旦
3096
+ // 小于坑位宽度就铺不满、右边留白。占位图是矢量 SVG + objectFit:cover,
3097
+ // 拉到多宽都不会糊;高度由下面的 aspectRatio 按实际宽度算
3098
+ style: { radius: 8, overflow: "hidden" },
2959
3099
  onClose: {
2960
3100
  type: "track",
2961
3101
  event: "banner_dismiss",
@@ -2971,14 +3111,14 @@ var imageBanner = {
2971
3111
  {
2972
3112
  type: "image",
2973
3113
  rect: [0, 0, "100%", "100%"],
2974
- src: "https://picsum.photos/id/1039/1200/300",
3114
+ src: BANNER_IMAGE,
2975
3115
  style: { objectFit: "cover" }
2976
3116
  },
2977
3117
  {
2978
- // 左半边:主标题区,点了看活动详情
3118
+ // 左半边:文案区,点了看活动详情(1.5% ~ 47.5%,不碰右侧按钮)
2979
3119
  type: "box",
2980
- rect: ["4%", "20%", "40%", "46%"],
2981
- style: { radius: 8, background: "rgba(255,68,51,0.16)", cursor: "pointer" },
3120
+ rect: ["1.5%", "14%", "46%", "72%"],
3121
+ style: { radius: 6, background: "rgba(255,255,255,0.16)", cursor: "pointer" },
2982
3122
  action: {
2983
3123
  type: "sequence",
2984
3124
  actions: [
@@ -2992,10 +3132,10 @@ var imageBanner = {
2992
3132
  }
2993
3133
  },
2994
3134
  {
2995
- // 右侧按钮:直接去下单
3135
+ // 右侧按钮:直接去下单(78% ~ 94%,正好盖住图里那颗白色按钮)
2996
3136
  type: "box",
2997
- rect: ["70%", "58%", "22%", "24%"],
2998
- style: { radius: 999, background: "rgba(255,68,51,0.16)", cursor: "pointer" },
3137
+ rect: ["78%", "16%", "16%", "68%"],
3138
+ style: { radius: 999, background: "rgba(255,255,255,0.16)", cursor: "pointer" },
2999
3139
  action: {
3000
3140
  type: "sequence",
3001
3141
  actions: [
@@ -3009,17 +3149,17 @@ var imageBanner = {
3009
3149
  }
3010
3150
  },
3011
3151
  {
3012
- // 关闭放在图上角落,同样用百分比,缩放时不会跑位
3152
+ // 关闭放在最右侧空白处(96% 起,20px 宽约占 2%),与按钮热区不重叠
3013
3153
  type: "text",
3014
3154
  content: "\u2715",
3015
- rect: ["95%", "6%", 22, 22],
3155
+ rect: ["96%", "25%", 20, 20],
3016
3156
  style: {
3017
3157
  textAlign: "center",
3018
- lineHeight: 22,
3019
- radius: 11,
3158
+ lineHeight: 20,
3159
+ radius: 10,
3020
3160
  background: "rgba(0,0,0,0.35)",
3021
3161
  color: "#fff",
3022
- fontSize: 13,
3162
+ fontSize: 12,
3023
3163
  cursor: "pointer"
3024
3164
  },
3025
3165
  // 「不再提醒」写在 close 的 reason 上,上报给后端即可,不配 call 写本地存储
@@ -3170,7 +3310,9 @@ var noticeBar = {
3170
3310
  width: "100%",
3171
3311
  height: "auto",
3172
3312
  layout: "flow",
3173
- style: { radius: 6, background: "#fff8e6", maxWidth: 1200 },
3313
+ // 不写 maxWidth:公告条是通栏类型,宽度该由宿主坑位决定。
3314
+ // 写死上限后一旦小于坑位宽度就铺不满,右边留白(core 会居中,但仍不如铺满)
3315
+ style: { radius: 6, background: "#fff8e6" },
3174
3316
  onShow: { type: "track", event: "notice_show", params: { notice: "guide" } },
3175
3317
  onClose: {
3176
3318
  type: "track",
@@ -3260,7 +3402,7 @@ var examples = [
3260
3402
  dsl: confirmAndSwitch
3261
3403
  },
3262
3404
  { label: "\u2466 \u5207 tab \u6362\u80A4\u6362\u5E03\u5C40", value: "tabTheme", dsl: tab_theme_default },
3263
- { label: "\u2467 \u6574\u56FE Banner\uFF08\u5BBD\u5EA6\u81EA\u9002\u5E94 + \u70ED\u533A\uFF09", value: "imageBanner", dsl: image_banner_default }
3405
+ { label: "\u2467 \u6574\u56FE Banner\uFF08\u7A84\u901A\u680F + \u70ED\u533A\uFF09", value: "imageBanner", dsl: image_banner_default }
3264
3406
  ];
3265
3407
  var examples_default = examples;
3266
3408
 
@@ -3526,6 +3668,8 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6
3526
3668
  - \`onClose\` \u5728\u70B9 X\u3001\u70B9\u906E\u7F69\u3001\u8D70 \`close\` \u52A8\u4F5C\u3001\u88AB \`replace\` \u9876\u6389\u65F6\u90FD\u4F1A\u89E6\u53D1
3527
3669
  - \`{{ closeReason }}\` \u53D6\u503C\uFF1A\`close-button\` / \`mask\` / \`replace\` / \`close\` \u52A8\u4F5C\u81EA\u5E26\u7684 \`reason\`\uFF08\u5982 \`"user-dismiss"\`\uFF09/ \u9ED8\u8BA4 \`action\`
3528
3670
  - \u591A\u89C6\u56FE\u65F6\u6BCF\u5C42\u5404\u5199\u5404\u7684\uFF0C\u624D\u80FD\u5206\u5F00\u7EDF\u8BA1
3671
+ - **\`onShow\` / \`onClose\` \u91CC\u7684 \`track\` \u4E0D\u4F1A\u88AB\u7B97\u6210\u70B9\u51FB**\uFF1A\u4E0A\u62A5\u7684 \`event\` \u662F\u300C\u66DD\u5149 / \u70B9\u51FB / \u5173\u95ED\u300D\u4E09\u503C\uFF0C\u524D\u53F0\u6309\u65F6\u673A\u51B3\u5B9A\u62A5\u54EA\u4E2A\uFF0C\u8FD9\u4E24\u4E2A\u94A9\u5B50\u91CC\u7684\u57CB\u70B9\u540D\u5206\u522B\u5E76\u8FDB\u66DD\u5149\u3001\u5173\u95ED\u90A3\u6761\u4E0A\u62A5\uFF0C\u540E\u7AEF\u7167\u6837\u770B\u5F97\u5230
3672
+ - \u4E00\u6B21\u70B9\u51FB\u91CC \`sequence: [track, navigate]\` **\u53EA\u4E0A\u62A5\u4E00\u6761\u70B9\u51FB**\uFF0C\u6309\u624B\u52BF\u8BA1\u6570\u3001\u4E0D\u6309\u52A8\u4F5C\u4E2A\u6570\u8BA1\u6570\uFF0C\u653E\u5FC3\u4E32
3529
3673
 
3530
3674
  ## \u516C\u544A\u6761 / Banner \u7684\u5173\u95ED
3531
3675
 
@@ -3585,7 +3729,7 @@ function countdownSection() {
3585
3729
 
3586
3730
  \`to\` \u662F\u7ED3\u675F\u65F6\u95F4\u3002**\u7528\u6237\u8BF4\u300C9\u67081\u53F7\u622A\u6B62\u300D\u5C31\u76F4\u63A5\u5199 \`"2026-09-01"\`\uFF0C\u4E0D\u8981\u81EA\u4F5C\u4E3B\u5F20\u6362\u7B97\u6210\u65F6\u95F4\u6233** \u2014\u2014 \u8FD0\u8425\u770B\u4E0D\u61C2\u65F6\u95F4\u6233\uFF0C\u4E5F\u6CA1\u6CD5\u6838\u5BF9\u3002
3587
3731
 
3588
- \u80FD\u8BC6\u522B\u7684\u5199\u6CD5\uFF1A\`"2026-09-01 18:00:00"\`\u3001\`"2026-09-01"\`\u3001\`"2026\u5E749\u67081\u65E5 18\u70B9"\`\u3001ISO\uFF08\`"2026-09-01T18:00:00+08:00"\`\uFF09\u3001\u6BEB\u79D2\u65F6\u95F4\u6233\u3001\`"{{ user.trialEndAt }}"\`\u3002
3732
+ \u80FD\u8BC6\u522B\u7684\u5199\u6CD5\uFF1A\`"2026-09-01 18:00:00"\`\u3001\`"2026-09-01"\`\u3001\`"2026\u5E749\u67081\u65E5 18\u70B9"\`\u3001ISO\uFF08\`"2026-09-01T18:00:00+08:00"\`\uFF09\u3001\u6BEB\u79D2\u65F6\u95F4\u6233\u3001\`"{{ user.serviceExpireTime }}"\`\u3002
3589
3733
 
3590
3734
  \u5199\u6210 \`"\u4E0B\u5468\u4E09"\` \u8FD9\u79CD\u8BC6\u522B\u4E0D\u4E86\u7684\u4F1A\u5728\u4FDD\u5B58\u524D\u62A5\u9519\u3002
3591
3735
 
@@ -3596,7 +3740,7 @@ function countdownSection() {
3596
3740
  \`\`\`jsonc
3597
3741
  {
3598
3742
  "type": "countdown",
3599
- "to": "2026-09-01 18:00:00", // \u4E5F\u53EF\u4EE5\u5199 "{{ user.trialEndAt }}" \u4ECE\u6570\u636E\u53D6
3743
+ "to": "2026-09-01 18:00:00", // \u4E5F\u53EF\u4EE5\u5199 "{{ user.serviceExpireTime }}" \u4ECE\u6570\u636E\u53D6
3600
3744
  "precision": "s", // "s" \u6BCF\u79D2 | "cs" \u5398\u79D2\u9010\u5E27\uFF08\u7D27\u8FEB\u611F\u66F4\u5F3A\uFF09
3601
3745
  "as": "cd",
3602
3746
  "style": { "align": "center", "gap": 6 },
@@ -3673,6 +3817,10 @@ function dataSection() {
3673
3817
  \u80FD\u8BFB\u5230\uFF1A\`data\` \u7684\u5B57\u6BB5\uFF08\u76F4\u63A5\u5728\u9876\u5C42\uFF09\u3001\`state.xxx\`\u3001\`user.xxx\`\uFF08\u5F53\u524D\u7528\u6237\u4FE1\u606F\uFF09\u3001
3674
3818
  \`derived\` \u7684\u522B\u540D\u3001\`item\`/\`index\`\uFF08repeat \u5185\uFF09\u3001\`cd.xxx\`\uFF08countdown \u5185\uFF09\u3002
3675
3819
 
3820
+ \`user\` **\u53EA\u6709\u8FD9\u4E9B\u5B57\u6BB5**\uFF08\u5199\u522B\u7684\u540D\u5B57\u6C42\u503C\u4E3A\u7A7A\uFF0C\u4FDD\u5B58\u65F6\u4F1A\u88AB\u6821\u9A8C\u62E6\u4E0B\uFF09\uFF1A
3821
+ ${DEFAULT_USER_FIELDS.map((field) => `\`${field}\`\uFF08${USER_FIELD_LABELS[field]}\uFF09`).join("\u3001")}\u3002
3822
+ \u5012\u8BA1\u65F6\u7684 \`to\` \u7528 \`{{ user.serviceExpireTime }}\`\uFF0C\u5269\u4F59\u5929\u6570\u6587\u6848\u7528 \`{{ user.remainDays }}\`\u3002
3823
+
3676
3824
  \`{{ }}\` \u53EF\u7528\u4E8E \`content\` \`src\` \`text\` \`to\`\u3001**\`style\` \u7684\u6BCF\u4E2A\u503C**\u3001\u4EE5\u53CA\u52A8\u4F5C\u7684 \`url\`/\`event\`/\`params\`\u3002
3677
3825
 
3678
3826
  \u652F\u6301\uFF1A\u53D6\u503C\u3001\u5B57\u9762\u91CF\u3001\`!\` \`-\`\u3001\`+ - * / %\`\u3001\u6BD4\u8F83\u3001\`&& ||\`\u3001\u4E09\u5143 \`a ? b : c\`\u3002
@@ -1,4 +1,4 @@
1
- import { D as Dsl } from '../types-BgUaJUAu.cjs';
1
+ import { D as Dsl } from '../types-Bj0xyWnx.cjs';
2
2
 
3
3
  /**
4
4
  * 开发文档的数据结构。
@@ -1,4 +1,4 @@
1
- import { D as Dsl } from '../types-BgUaJUAu.js';
1
+ import { D as Dsl } from '../types-Bj0xyWnx.js';
2
2
 
3
3
  /**
4
4
  * 开发文档的数据结构。