@yaoxiu/marketing-dsl 1.5.2 → 2.1.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
  {
@@ -987,6 +1090,11 @@ var sections6 = [
987
1090
  t: "p",
988
1091
  text: "\u5706\u89D2\u88C1\u5207\u53EA\u4F5C\u7528\u4E8E\u5F39\u7A97\u5185\u5BB9\uFF0C\u5173\u95ED\u6309\u94AE\u5728\u88C1\u5207\u5C42\u4E4B\u5916\uFF0C\u6240\u4EE5 `offset` \u5199\u8D1F\u503C\u65F6\u4E0D\u4F1A\u88AB\u88C1\u6389\u3002\u4E24\u79CD\u5E38\u89C1\u505A\u6CD5\uFF1A"
989
1092
  },
1093
+ {
1094
+ t: "note",
1095
+ tone: "warn",
1096
+ text: "**\u4E24\u4E2A\u503C\u8981\u540C\u5411**\uFF1A`[x, y]` \u8981\u4E48\u90FD\u662F\u6B63\u6570\uFF08\u8D34\u5728\u5F39\u7A97\u5185\u4FA7\uFF09\uFF0C\u8981\u4E48\u90FD\u662F\u8D1F\u6570\uFF08\u6311\u5230\u5F39\u7A97\u5916\u4FA7\uFF09\u3002\u5199\u6210 `[-12, 12]` \u8FD9\u79CD\u4E00\u8D1F\u4E00\u6B63\uFF0C\u6309\u94AE\u4F1A\u6A2A\u8DE8\u5F39\u7A97\u8FB9\u7F18\u2014\u2014\u6A2A\u5411\u6311\u51FA\u53BB\u4E00\u534A\u3001\u7EB5\u5411\u53C8\u7F29\u5728\u91CC\u9762\uFF0C\u770B\u7740\u5C31\u662F\u8D34\u6B6A\u4E86\u3002"
1097
+ },
990
1098
  {
991
1099
  t: "code",
992
1100
  code: `// \u53F3\u4E0A\u89D2\u5916\u4FA7
@@ -1006,6 +1114,35 @@ var sections6 = [
1006
1114
  t: "note",
1007
1115
  tone: "warn",
1008
1116
  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"
1117
+ },
1118
+ { t: "h3", text: "banner \u7684\u5BBD\u9AD8\u6BD4\uFF1A\u4E0D\u80FD\u5C0F\u4E8E 12:1" },
1119
+ {
1120
+ t: "p",
1121
+ text: "\u6574\u56FE banner \u9760\u6839\u8282\u70B9\u7684 `aspectRatio` \u7EF4\u6301\u7B49\u6BD4\uFF08\u5199\u6B7B\u9AD8\u5EA6\u7684\u8BDD\u5751\u4F4D\u4E00\u5BBD\uFF0C\u56FE\u5C31\u88AB\u6A2A\u5411\u62C9\u53D8\u5F62\uFF09\u3002\u4F46\u6BD4\u4F8B\u8D8A\u65B9\uFF0C\u5728\u5BBD\u5C4F\u4E0A\u7B97\u51FA\u6765\u8D8A\u9AD8\u2014\u2014**\u6BD4\u4F8B\u5C0F\u4E8E 12:1 \u7684\u914D\u7F6E\u4FDD\u5B58\u65F6\u4F1A\u88AB\u62E6\u4E0B**\u3002"
1122
+ },
1123
+ {
1124
+ t: "table",
1125
+ head: ["\u5BBD\u9AD8\u6BD4", "1800px \u5BBD\u7684\u5751\u4F4D\u91CC\u6709\u591A\u9AD8", "\u7ED3\u679C"],
1126
+ rows: [
1127
+ ["`960 / 56`\uFF08\u224817:1\uFF09", "\u7EA6 105px", "\u2705 \u4E00\u6761\u901A\u680F\u63D0\u793A"],
1128
+ ["`24 / 1`", "\u7EA6 75px", "\u2705 \u66F4\u6241\uFF0C\u89C6\u89C9\u66F4\u8F7B"],
1129
+ ["`1200 / 300`\uFF084:1\uFF09", "\u7EA6 451px", "\u274C \u5403\u6389\u9996\u5C4F\u4E00\u5927\u5757"]
1130
+ ]
1131
+ },
1132
+ {
1133
+ t: "note",
1134
+ tone: "info",
1135
+ text: "banner \u5751\u4F4D\u5E38\u9A7B\u5728\u9875\u9762\u9876\u90E8\u3001\u4E0D\u8DDF\u968F\u5185\u5BB9\u6EDA\u52A8\uFF0C\u9AD8\u5EA6\u662F**\u5751\u4F4D\u7684\u8BBE\u8BA1\u5C3A\u5BF8**\uFF0C\u4E0D\u662F\u914D\u7F6E\u7684\u81EA\u7531\u5EA6\u3002\u9700\u8981\u5927\u56FE\u5F3A\u66DD\u5149\uFF0C\u7528\u5F39\u7A97\uFF08popup\uFF09\uFF0C\u522B\u628A banner \u6491\u6210\u5927\u56FE\u3002"
1136
+ },
1137
+ { t: "h3", text: "banner / \u516C\u544A\u6761\uFF1A\u522B\u5199 maxWidth" },
1138
+ {
1139
+ t: "p",
1140
+ 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'
1141
+ },
1142
+ {
1143
+ t: "note",
1144
+ tone: "info",
1145
+ 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
1146
  }
1010
1147
  ]
1011
1148
  }
@@ -1351,6 +1488,25 @@ var sections_default = sections9;
1351
1488
 
1352
1489
  // src/docs/meta.ts
1353
1490
  var changelog = [
1491
+ {
1492
+ date: "2026-08-22",
1493
+ items: [
1494
+ "\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",
1495
+ "\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",
1496
+ "\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",
1497
+ "\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",
1498
+ "\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",
1499
+ "\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",
1500
+ "\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",
1501
+ "\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",
1502
+ "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",
1503
+ "\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",
1504
+ "\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",
1505
+ "\u3010\u65B0\u589E\u786C\u7EA6\u675F\u3011banner \u7684\u5BBD\u9AD8\u6BD4\u4E0D\u80FD\u5C0F\u4E8E 12:1\uFF08\u7B2C 3 \u8282\uFF09\uFF1Abanner \u9AD8\u5EA6\u662F\u300C\u5751\u4F4D\u5BBD\u5EA6 \xD7 \u6BD4\u4F8B\u300D\u7B97\u51FA\u6765\u7684\uFF0C\u6BD4\u4F8B\u8D8A\u65B9\u5728\u5BBD\u5C4F\u4E0A\u8D8A\u9AD8\uFF0C1200\xD7300 \u90A3\u79CD\u5927\u56FE\u5728 1800 \u5BBD\u7684\u5751\u4F4D\u91CC\u6709 451px\u3001\u76F4\u63A5\u5403\u6389\u9996\u5C4F\uFF0C\u73B0\u5728\u4FDD\u5B58\u65F6\u4F1A\u88AB\u62E6\u4E0B",
1506
+ "\u5173\u95ED\u6309\u94AE\u7684 offset \u4E24\u4E2A\u503C\u8981\u540C\u5411\uFF08\u7B2C 3 \u8282\uFF09\uFF1A\u5199\u6210 [-12, 12] \u8FD9\u79CD\u4E00\u8D1F\u4E00\u6B63\uFF0C\u6309\u94AE\u4F1A\u6A2A\u8DE8\u5F39\u7A97\u8FB9\u7F18\u3001\u770B\u7740\u50CF\u8D34\u6B6A\u4E86\uFF0C\u793A\u4F8B \u2466 \u5DF2\u4FEE",
1507
+ "\u793A\u4F8B \u2467 \u6574\u56FE Banner \u7684\u5173\u95ED\u56FE\u6807\u6539\u7528 calc(100% - 32px) \u56FA\u5B9A\u8D34\u53F3\u2014\u2014\u539F\u5148\u7528\u767E\u5206\u6BD4\u5B9A\u4F4D\uFF0C\u5751\u4F4D\u8D8A\u5BBD\u79BB\u53F3\u8FB9\u7F18\u8D8A\u8FDC\uFF081885 \u5BBD\u65F6\u5DEE\u51FA\u5FEB 200px\uFF09\uFF0C\u770B\u7740\u50CF\u98D8\u5728\u4E2D\u95F4"
1508
+ ]
1509
+ },
1354
1510
  {
1355
1511
  date: "2026-08-18",
1356
1512
  items: [
@@ -1617,7 +1773,7 @@ var renewExpire = {
1617
1773
  children: [
1618
1774
  {
1619
1775
  type: "text",
1620
- content: "\u23F0 \u8BD5\u7528\u5269 {{ user.trialLeftDays }} \u5929",
1776
+ content: "\u23F0 \u8BD5\u7528\u5269 {{ user.remainDays }} \u5929",
1621
1777
  style: {
1622
1778
  // 不写 alignSelf 会被 flex 列拉满整行,标签必须按内容宽度
1623
1779
  alignSelf: "flex-start",
@@ -1644,7 +1800,7 @@ var renewExpire = {
1644
1800
  children: [
1645
1801
  {
1646
1802
  type: "text",
1647
- content: "{{ user.trialLeftDays }} \u5929\u540E\u8BD5\u7528\u5230\u671F\uFF0C\u4EE5\u4E0B\u80FD\u529B\u4F1A\u505C\u6B62\uFF1A",
1803
+ content: "{{ user.remainDays }} \u5929\u540E\u8BD5\u7528\u5230\u671F\uFF0C\u4EE5\u4E0B\u80FD\u529B\u4F1A\u505C\u6B62\uFF1A",
1648
1804
  style: { fontSize: 15, fontWeight: "800", color: "#1f2533", marginBottom: 11 }
1649
1805
  },
1650
1806
  {
@@ -2038,7 +2194,7 @@ var lastDay = {
2038
2194
  children: [
2039
2195
  {
2040
2196
  type: "text",
2041
- content: "\u{1F525} \u8FD8\u5269\u6700\u540E {{ user.lastDayLeft }} \u5929",
2197
+ content: "\u{1F525} \u8FD8\u5269\u6700\u540E {{ user.remainDays }} \u5929",
2042
2198
  style: {
2043
2199
  alignSelf: "flex-start",
2044
2200
  background: "rgba(255,255,255,0.18)",
@@ -2058,7 +2214,7 @@ var lastDay = {
2058
2214
  // ===== 分格倒计时 + 厘秒逐帧动画 =====
2059
2215
  {
2060
2216
  type: "countdown",
2061
- to: "{{ user.trialEndAt }}",
2217
+ to: "{{ user.serviceExpireTime }}",
2062
2218
  precision: "cs",
2063
2219
  as: "cd",
2064
2220
  style: { align: "center", gap: 6, marginTop: 10 },
@@ -2268,14 +2424,15 @@ var noticeToPopup = {
2268
2424
  state: { plan: 0 },
2269
2425
  derived: { current: { list: "plans", indexBy: "plan" } },
2270
2426
  views: {
2271
- // 常驻在页面里的公告条,点它才弹弹窗
2427
+ // 常驻在页面里的公告条,点右侧按钮才弹弹窗
2272
2428
  bar: {
2273
2429
  type: "notice",
2274
2430
  stage: {
2275
2431
  width: "100%",
2276
2432
  height: "auto",
2277
2433
  layout: "flow",
2278
- style: { radius: 6, background: "#fff8e6", maxWidth: 1200 },
2434
+ // 通栏类型不写 maxWidth,宽度交给宿主坑位(写死上限会铺不满、右边留白)
2435
+ style: { radius: 6, background: "#fff8e6" },
2279
2436
  // 多视图下每层各埋各的,能分别统计「公告条曝光」和「弹窗曝光」
2280
2437
  onShow: { type: "track", event: "notice_show", params: { view: "bar" } },
2281
2438
  onClose: {
@@ -2287,20 +2444,14 @@ var noticeToPopup = {
2287
2444
  nodes: [
2288
2445
  {
2289
2446
  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
- },
2447
+ // 行容器本身不绑动作:公告条的文案是给人读的,整条可点会让用户
2448
+ // 想选中文字复制时误弹窗;打开弹窗的入口只有右侧那个按钮
2449
+ style: { align: "center", gap: 10, padding: "10px 14px" },
2299
2450
  children: [
2300
2451
  { type: "text", content: "\u{1F4E2}", style: { fontSize: 16 } },
2301
2452
  {
2302
2453
  type: "text",
2303
- content: "{{ user.shopName }}\uFF0C\u4F60\u7684{{ user.version }}\u8FD8\u6709 {{ user.expireDays }} \u5929\u5230\u671F",
2454
+ content: "{{ user.shopName }}\uFF0C\u4F60\u7684{{ user.levelName }}\u8FD8\u6709 {{ user.remainDays }} \u5929\u5230\u671F",
2304
2455
  style: { flex: "1", fontSize: 14, color: "#8a6212", lineHeight: 1.5 }
2305
2456
  },
2306
2457
  {
@@ -2314,7 +2465,7 @@ var noticeToPopup = {
2314
2465
  color: "#fff",
2315
2466
  fontSize: 12
2316
2467
  },
2317
- // 叠一层弹窗,公告条留在下面
2468
+ // 打开弹窗的唯一入口。叠一层弹窗,公告条留在下面
2318
2469
  action: {
2319
2470
  type: "sequence",
2320
2471
  actions: [
@@ -2324,7 +2475,7 @@ var noticeToPopup = {
2324
2475
  }
2325
2476
  },
2326
2477
  {
2327
- // × 有自己的动作,点它不会再冒泡去触发外层的「打开弹窗」
2478
+ // 关掉整条公告(不是关弹窗——此时弹窗还没开)
2328
2479
  type: "text",
2329
2480
  content: "\u2715",
2330
2481
  style: {
@@ -2473,7 +2624,7 @@ var confirmAndSwitch = {
2473
2624
  children: [
2474
2625
  {
2475
2626
  type: "text",
2476
- content: "\u8BD5\u7528\u8FD8\u5269 {{ user.trialLeftDays }} \u5929",
2627
+ content: "\u8BD5\u7528\u8FD8\u5269 {{ user.remainDays }} \u5929",
2477
2628
  style: {
2478
2629
  fontSize: 19,
2479
2630
  fontWeight: "800",
@@ -2784,7 +2935,9 @@ var tabTheme = {
2784
2935
  closeButton: {
2785
2936
  show: true,
2786
2937
  position: "top-right",
2787
- offset: [-12, 12],
2938
+ // 两个值要么都往内、要么都往外:[-12, 12] 这种一外一内会让按钮横跨弹窗边缘,
2939
+ // 看着像贴歪了。这里放在弹窗内侧右上角(stage 有 22 的 padding,压不到内容)
2940
+ offset: [12, 12],
2788
2941
  size: 28,
2789
2942
  icon: "\u2715",
2790
2943
  style: { color: "rgba(255,255,255,0.85)", fontSize: 16 }
@@ -2946,16 +3099,32 @@ var tabTheme = {
2946
3099
  var tab_theme_default = tabTheme;
2947
3100
 
2948
3101
  // src/docs/examples/image-banner.ts
2949
- var RATIO = "1200 / 300";
3102
+ var RATIO = "1920 / 75";
3103
+ var BANNER_SVG = `<svg xmlns="http://www.w3.org/2000/svg" width="1920" height="75" viewBox="0 0 1920 75">
3104
+ <defs>
3105
+ <linearGradient id="g" x1="0" y1="0" x2="1" y2="0">
3106
+ <stop offset="0" stop-color="#ff4433"/>
3107
+ <stop offset="1" stop-color="#ff8a3c"/>
3108
+ </linearGradient>
3109
+ </defs>
3110
+ <rect width="1920" height="75" fill="url(#g)"/>
3111
+ <text x="48" y="47" font-family="sans-serif" font-size="24" fill="#ffffff">\u79CB\u5B63\u5927\u4FC3 \xB7 \u6574\u56FE Banner \u5360\u4F4D\u56FE</text>
3112
+ <rect x="1344" y="19" width="288" height="38" rx="19" fill="#ffffff" fill-opacity="0.92"/>
3113
+ <text x="1488" y="45" font-family="sans-serif" font-size="22" fill="#d43a1f" text-anchor="middle">\u7ACB\u5373\u67E5\u770B</text>
3114
+ </svg>`;
3115
+ var BANNER_IMAGE = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(BANNER_SVG)}`;
2950
3116
  var imageBanner = {
2951
3117
  version: 1,
2952
3118
  type: "banner",
2953
- meta: { name: "\u6574\u56FE Banner\uFF08\u5BBD\u5EA6\u81EA\u9002\u5E94 + \u70ED\u533A\uFF09" },
3119
+ meta: { name: "\u6574\u56FE Banner\uFF08\u7A84\u901A\u680F + \u70ED\u533A\uFF09" },
2954
3120
  stage: {
2955
3121
  width: "100%",
3122
+ // 高度由下面那层 box 的 aspectRatio 撑出来,所以这里是 auto + flow
2956
3123
  height: "auto",
2957
3124
  layout: "flow",
2958
- style: { radius: 8, maxWidth: 1200, overflow: "hidden" },
3125
+ // 不写 maxWidth:banner 是通栏类型,宽度该由宿主坑位决定。
3126
+ // 写死上限后一旦小于坑位宽度就铺不满、右边留白
3127
+ style: { radius: 8, overflow: "hidden" },
2959
3128
  onClose: {
2960
3129
  type: "track",
2961
3130
  event: "banner_dismiss",
@@ -2964,21 +3133,23 @@ var imageBanner = {
2964
3133
  },
2965
3134
  nodes: [
2966
3135
  {
2967
- // 热区的定位容器:宽度铺满,高度由 aspectRatio
3136
+ // 热区的定位容器:宽度铺满,高度由 aspectRatio 按实际宽度算。
3137
+ // 子节点都是绝对定位、撑不起高度,这里没有确定高度的话热区的百分比 rect 全算成 0
2968
3138
  type: "box",
2969
3139
  style: { width: "100%", aspectRatio: RATIO },
2970
3140
  children: [
2971
3141
  {
2972
3142
  type: "image",
2973
3143
  rect: [0, 0, "100%", "100%"],
2974
- src: "https://picsum.photos/id/1039/1200/300",
3144
+ src: BANNER_IMAGE,
3145
+ // 容器比例与图比例一致,cover 既不裁也不拉,图里元素与百分比热区天然对齐
2975
3146
  style: { objectFit: "cover" }
2976
3147
  },
2977
3148
  {
2978
- // 左半边:主标题区,点了看活动详情
3149
+ // 左半边:文案区,点了看活动详情(图里文字从 48/1920 起,热区框大一圈)
2979
3150
  type: "box",
2980
- rect: ["4%", "20%", "40%", "46%"],
2981
- style: { radius: 8, background: "rgba(255,68,51,0.16)", cursor: "pointer" },
3151
+ rect: ["1.5%", "16%", "46%", "68%"],
3152
+ style: { radius: 6, background: "rgba(255,255,255,0.16)", cursor: "pointer" },
2982
3153
  action: {
2983
3154
  type: "sequence",
2984
3155
  actions: [
@@ -2992,10 +3163,10 @@ var imageBanner = {
2992
3163
  }
2993
3164
  },
2994
3165
  {
2995
- // 右侧按钮:直接去下单
3166
+ // 右侧按钮:直接去下单。图里按钮是 1344~1632(70%~85%),热区照着框
2996
3167
  type: "box",
2997
- rect: ["70%", "58%", "22%", "24%"],
2998
- style: { radius: 999, background: "rgba(255,68,51,0.16)", cursor: "pointer" },
3168
+ rect: ["70%", "25%", "15%", "51%"],
3169
+ style: { radius: 999, background: "rgba(255,255,255,0.16)", cursor: "pointer" },
2999
3170
  action: {
3000
3171
  type: "sequence",
3001
3172
  actions: [
@@ -3009,17 +3180,20 @@ var imageBanner = {
3009
3180
  }
3010
3181
  },
3011
3182
  {
3012
- // 关闭放在图上角落,同样用百分比,缩放时不会跑位
3183
+ // 关闭按钮固定贴右:x 用 calc 而不是百分比 ——
3184
+ // 百分比是按容器宽度算的,坑位越宽它离右边缘越远(1885 宽时能差出快 200px),
3185
+ // 看着就像飘在中间。calc(100% - 32px) 让它永远距右边缘 12px(20 宽 + 12 边距);
3186
+ // y 同理用 calc 垂直居中,banner 高度随坑位宽度变,写死百分比会上下飘
3013
3187
  type: "text",
3014
3188
  content: "\u2715",
3015
- rect: ["95%", "6%", 22, 22],
3189
+ rect: ["calc(100% - 32px)", "calc(50% - 10px)", 20, 20],
3016
3190
  style: {
3017
3191
  textAlign: "center",
3018
- lineHeight: 22,
3019
- radius: 11,
3192
+ lineHeight: 20,
3193
+ radius: 10,
3020
3194
  background: "rgba(0,0,0,0.35)",
3021
3195
  color: "#fff",
3022
- fontSize: 13,
3196
+ fontSize: 12,
3023
3197
  cursor: "pointer"
3024
3198
  },
3025
3199
  // 「不再提醒」写在 close 的 reason 上,上报给后端即可,不配 call 写本地存储
@@ -3170,7 +3344,9 @@ var noticeBar = {
3170
3344
  width: "100%",
3171
3345
  height: "auto",
3172
3346
  layout: "flow",
3173
- style: { radius: 6, background: "#fff8e6", maxWidth: 1200 },
3347
+ // 不写 maxWidth:公告条是通栏类型,宽度该由宿主坑位决定。
3348
+ // 写死上限后一旦小于坑位宽度就铺不满,右边留白(core 会居中,但仍不如铺满)
3349
+ style: { radius: 6, background: "#fff8e6" },
3174
3350
  onShow: { type: "track", event: "notice_show", params: { notice: "guide" } },
3175
3351
  onClose: {
3176
3352
  type: "track",
@@ -3260,7 +3436,7 @@ var examples = [
3260
3436
  dsl: confirmAndSwitch
3261
3437
  },
3262
3438
  { 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 }
3439
+ { label: "\u2467 \u6574\u56FE Banner\uFF08\u7A84\u901A\u680F + \u70ED\u533A\uFF09", value: "imageBanner", dsl: image_banner_default }
3264
3440
  ];
3265
3441
  var examples_default = examples;
3266
3442
 
@@ -3526,6 +3702,8 @@ countdown_end // \u5012\u8BA1\u65F6\u5F52\u96F6
3526
3702
  - \`onClose\` \u5728\u70B9 X\u3001\u70B9\u906E\u7F69\u3001\u8D70 \`close\` \u52A8\u4F5C\u3001\u88AB \`replace\` \u9876\u6389\u65F6\u90FD\u4F1A\u89E6\u53D1
3527
3703
  - \`{{ closeReason }}\` \u53D6\u503C\uFF1A\`close-button\` / \`mask\` / \`replace\` / \`close\` \u52A8\u4F5C\u81EA\u5E26\u7684 \`reason\`\uFF08\u5982 \`"user-dismiss"\`\uFF09/ \u9ED8\u8BA4 \`action\`
3528
3704
  - \u591A\u89C6\u56FE\u65F6\u6BCF\u5C42\u5404\u5199\u5404\u7684\uFF0C\u624D\u80FD\u5206\u5F00\u7EDF\u8BA1
3705
+ - **\`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
3706
+ - \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
3707
 
3530
3708
  ## \u516C\u544A\u6761 / Banner \u7684\u5173\u95ED
3531
3709
 
@@ -3585,7 +3763,7 @@ function countdownSection() {
3585
3763
 
3586
3764
  \`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
3765
 
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
3766
+ \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
3767
 
3590
3768
  \u5199\u6210 \`"\u4E0B\u5468\u4E09"\` \u8FD9\u79CD\u8BC6\u522B\u4E0D\u4E86\u7684\u4F1A\u5728\u4FDD\u5B58\u524D\u62A5\u9519\u3002
3591
3769
 
@@ -3596,7 +3774,7 @@ function countdownSection() {
3596
3774
  \`\`\`jsonc
3597
3775
  {
3598
3776
  "type": "countdown",
3599
- "to": "2026-09-01 18:00:00", // \u4E5F\u53EF\u4EE5\u5199 "{{ user.trialEndAt }}" \u4ECE\u6570\u636E\u53D6
3777
+ "to": "2026-09-01 18:00:00", // \u4E5F\u53EF\u4EE5\u5199 "{{ user.serviceExpireTime }}" \u4ECE\u6570\u636E\u53D6
3600
3778
  "precision": "s", // "s" \u6BCF\u79D2 | "cs" \u5398\u79D2\u9010\u5E27\uFF08\u7D27\u8FEB\u611F\u66F4\u5F3A\uFF09
3601
3779
  "as": "cd",
3602
3780
  "style": { "align": "center", "gap": 6 },
@@ -3673,6 +3851,10 @@ function dataSection() {
3673
3851
  \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
3852
  \`derived\` \u7684\u522B\u540D\u3001\`item\`/\`index\`\uFF08repeat \u5185\uFF09\u3001\`cd.xxx\`\uFF08countdown \u5185\uFF09\u3002
3675
3853
 
3854
+ \`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
3855
+ ${DEFAULT_USER_FIELDS.map((field) => `\`${field}\`\uFF08${USER_FIELD_LABELS[field]}\uFF09`).join("\u3001")}\u3002
3856
+ \u5012\u8BA1\u65F6\u7684 \`to\` \u7528 \`{{ user.serviceExpireTime }}\`\uFF0C\u5269\u4F59\u5929\u6570\u6587\u6848\u7528 \`{{ user.remainDays }}\`\u3002
3857
+
3676
3858
  \`{{ }}\` \u53EF\u7528\u4E8E \`content\` \`src\` \`text\` \`to\`\u3001**\`style\` \u7684\u6BCF\u4E2A\u503C**\u3001\u4EE5\u53CA\u52A8\u4F5C\u7684 \`url\`/\`event\`/\`params\`\u3002
3677
3859
 
3678
3860
  \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
  * 开发文档的数据结构。