@ezuikit/player-theme 3.1.5-beta.4 → 3.1.6

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.
package/dist/constant.js CHANGED
@@ -1,10 +1,10 @@
1
1
  /*
2
- * @ezuikit/player-theme v3.1.5-beta.4
3
- * Copyright (c) 2026-09-15 13:35:29 Ezviz-OpenBiz
2
+ * @ezuikit/player-theme v3.1.6
3
+ * Copyright (c) 2026-09-18 12:22:27 Ezviz-OpenBiz
4
4
  * Released under the MIT License.
5
5
  */
6
- /**
7
- * 播放器的类名前缀
6
+ /**
7
+ * 播放器的类名前缀
8
8
  */ var PREFIX_CLASS = 'ezplayer';
9
9
  /** */ var DATE_PICKER_ICON_WIDTH = 36;
10
10
  /** 填充模式 */ var THEME_SCALE_MODE_TYPE = {
@@ -37,26 +37,26 @@ var THEME_PROPS = [
37
37
  // 播放区间(片段分享)。通过 props 下发而不是靠事件,避免主题异步渲染时错过初始化事件
38
38
  'playbackRange'
39
39
  ];
40
- /**
41
- * 当移动端 picker 控件打开时需要关闭动画(定时器)
40
+ /**
41
+ * 当移动端 picker 控件打开时需要关闭动画(定时器)
42
42
  */ var CLEAR_TIMER_HEADER_FOOTER_ANIMATION = 'CLEAR_TIMER_HEADER_FOOTER_ANIMATION';
43
- /**
44
- * 'rec', 'cloudRec', 'cloudRecord' 是一个组,并且要在头部(移动端特殊处理)
45
- *
46
- * | rec | cloudRec | cloudRecord |
47
- * |:---------------------:|:------------:|:---------------:|
48
- * | 本地回放(SDK存储回放) | 云存储回放 | 云录制回放 |
43
+ /**
44
+ * 'rec', 'cloudRec', 'cloudRecord' 是一个组,并且要在头部(移动端特殊处理)
45
+ *
46
+ * | rec | cloudRec | cloudRecord |
47
+ * |:---------------------:|:------------:|:---------------:|
48
+ * | 本地回放(SDK存储回放) | 云存储回放 | 云录制回放 |
49
49
  */ var REC_GROUP = [
50
50
  'rec',
51
51
  'cloudRec',
52
52
  'cloudRecord'
53
53
  ];
54
- /**
55
- * 设备信息
56
- *
57
- * | deviceID | deviceName |
58
- * |:-------------------:|:-------------:|
59
- * | 设备ID(唯一标识) | 设备名称 |
54
+ /**
55
+ * 设备信息
56
+ *
57
+ * | deviceID | deviceName |
58
+ * |:-------------------:|:-------------:|
59
+ * | 设备ID(唯一标识) | 设备名称 |
60
60
  */ var DEVICE_INFO_GROUP = [
61
61
  'deviceID',
62
62
  'deviceName'
@@ -69,8 +69,8 @@ var THEME_PROPS = [
69
69
  // * 录像(录像)支持的控件
70
70
  // */
71
71
  // export const REC_CONTROL_GROUP_BOTTOM: string[] = [...REC_GROUP, 'play', 'capturePicture', 'volume', 'record', 'zoom', 'speed', 'fullscreen', 'globalFullscreen', 'date', 'timeLine'] as const;
72
- /**
73
- * 能在底部并放置到 More 中的控件
72
+ /**
73
+ * 能在底部并放置到 More 中的控件
74
74
  */ var FOOTER_MORE_GROUP = [
75
75
  'play',
76
76
  'capturePicture',
@@ -84,8 +84,8 @@ var THEME_PROPS = [
84
84
  'fullscreen',
85
85
  'globalFullscreen'
86
86
  ];
87
- /**
88
- * 暂停时能禁用的控件按钮
87
+ /**
88
+ * 暂停时能禁用的控件按钮
89
89
  */ var PAUSE_DISABLED_BTN = [
90
90
  'capturePicture',
91
91
  'volume',
@@ -96,9 +96,9 @@ var THEME_PROPS = [
96
96
  'speed',
97
97
  'globalFullscreen'
98
98
  ];
99
- /**
100
- * 移动端可以扩展的控件
101
- * ['ptz', 'talk', 'record', 'capturePicture', 'timeLine', 'rec', 'date'];
99
+ /**
100
+ * 移动端可以扩展的控件
101
+ * ['ptz', 'talk', 'record', 'capturePicture', 'timeLine', 'rec', 'date'];
102
102
  */ var MOBILE_EXTENDS = [
103
103
  'ptz',
104
104
  'timeLine',
@@ -106,32 +106,32 @@ var THEME_PROPS = [
106
106
  'date',
107
107
  'segmentProgress'
108
108
  ];
109
- /**
110
- * 回放时间轴和日历
111
- * 放置在最顶部
109
+ /**
110
+ * 回放时间轴和日历
111
+ * 放置在最顶部
112
112
  */ var REC_BOTTOM_GROUP = [
113
113
  'timeLine',
114
114
  'date'
115
115
  ];
116
- /**
117
- *
118
- * 事件名
119
- *
120
- * --------------- ------------------
121
- * - - theme.emit(EVENTS.xxxxx) - -
122
- * - - -------------------------------------> - -
123
- * - - - -
124
- * - Theme - - Controls -
125
- * - - control.emit(EVENTS.control.xxx) - -
126
- * - - <-------------------------------------- - -
127
- * --------------- ------------------
128
- *
129
- * @example
130
- * ```ts
131
- * theme.on(EVENTS.loading)
132
- * theme.on(EVENTS.loading)
133
- * ```
134
- *
116
+ /**
117
+ *
118
+ * 事件名
119
+ *
120
+ * --------------- ------------------
121
+ * - - theme.emit(EVENTS.xxxxx) - -
122
+ * - - -------------------------------------> - -
123
+ * - - - -
124
+ * - Theme - - Controls -
125
+ * - - control.emit(EVENTS.control.xxx) - -
126
+ * - - <-------------------------------------- - -
127
+ * --------------- ------------------
128
+ *
129
+ * @example
130
+ * ```ts
131
+ * theme.on(EVENTS.loading)
132
+ * theme.on(EVENTS.loading)
133
+ * ```
134
+ *
135
135
  */ // 事件命名不要超过两层
136
136
  var EVENTS = {
137
137
  loading: 'loading',
@@ -146,11 +146,11 @@ var EVENTS = {
146
146
  /** 首帧 */ firstFrameDisplay: 'firstFrameDisplay',
147
147
  /** 全屏 */ fullscreen: 'fullscreen',
148
148
  /** 退出全屏 */ exitFullscreen: 'exitFullscreen',
149
- /**
150
- * 全屏变化(移动端也支持触发, 不过移动端是模拟的web全屏 即旋转 180度)
151
- * 当 isCurrentFullscreen 为 true 时,表示当前容器全局全屏状态
152
- *
153
- * 注意:同一个页面中只要有全屏的操作或取消全屏的操作,都会触发该事件 (移动端除外)
149
+ /**
150
+ * 全屏变化(移动端也支持触发, 不过移动端是模拟的web全屏 即旋转 180度)
151
+ * 当 isCurrentFullscreen 为 true 时,表示当前容器全局全屏状态
152
+ *
153
+ * 注意:同一个页面中只要有全屏的操作或取消全屏的操作,都会触发该事件 (移动端除外)
154
154
  */ fullscreenChange: 'fullscreenChange',
155
155
  /** 重置容器尺寸 */ resize: 'resize',
156
156
  /** 屏幕旋转方向变化 */ orientationChange: 'orientationChange',
@@ -177,8 +177,8 @@ var EVENTS = {
177
177
  setAllDayRecTimes: 'setAllDayRecTimes',
178
178
  getOSDTime: 'getOSDTime',
179
179
  /** 播放区间播放结束(SDK 层 playbackRange 特性) */ playbackEnd: 'playbackEnd',
180
- /**
181
- * 控件相关
180
+ /**
181
+ * 控件相关
182
182
  */ control: {
183
183
  /** 点击播放播放/暂停按钮 */ play: 'Control.play',
184
184
  /** 播放控件销毁 */ playDestroy: 'Control.playDestroy',
@@ -233,6 +233,8 @@ var EVENTS = {
233
233
  /** 日期面板展示隐藏变换 */ datePanelOpenChange: 'Control.datePanelOpenChange',
234
234
  /** 日期改变 */ dateChange: 'Control.dateChange',
235
235
  /** 日期改变 */ dateMonthChange: 'Control.dateMonthChange',
236
+ /** 日期面板展示的月份变化 */ datePanelMonthChange: 'Control.datePanelMonthChange',
237
+ /** 日期面板展示的年份变化 */ datePanelYearChange: 'Control.datePanelYearChange',
236
238
  /** 日期销毁 */ dateDestroy: 'Control.datePanelDestroy',
237
239
  /** 时间面板展示隐藏变换 */ timePanelOpenChange: 'Control.timePanelOpenChange',
238
240
  /** 时间改变 */ timeChange: 'Control.timeChange',
@@ -249,8 +251,8 @@ var EVENTS = {
249
251
  /** 播放器内容区域销毁 */ contentDestroy: 'Control.contentDestroy',
250
252
  /** 播放器内容区域重新渲染 */ contentRerender: 'Control.contentRerender'
251
253
  },
252
- /**
253
- * 主题控件相关
254
+ /**
255
+ * 主题控件相关
254
256
  */ theme: {
255
257
  /** 销毁前 */ beforeDestroy: 'Theme.beforeDestroy',
256
258
  /** 销毁后 */ destroyed: 'Theme.destroyed',
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  /*
2
- * @ezuikit/player-theme v3.1.5-beta.4
3
- * Copyright (c) 2026-09-15 13:35:29 Ezviz-OpenBiz
2
+ * @ezuikit/player-theme v3.1.6
3
+ * Copyright (c) 2026-09-18 12:22:27 Ezviz-OpenBiz
4
4
  * Released under the MIT License.
5
5
  */
6
6
  'use strict';
@@ -20,8 +20,8 @@ var controlDatePicker = require('@ezuikit/control-date-picker');
20
20
  var controlTimeLine = require('@ezuikit/control-time-line');
21
21
  var SegmentProgress = require('@ezuikit/control-segment-progress');
22
22
 
23
- /**
24
- * 播放器的类名前缀
23
+ /**
24
+ * 播放器的类名前缀
25
25
  */ var PREFIX_CLASS = 'ezplayer';
26
26
  /** 填充模式 */ var THEME_SCALE_MODE_TYPE = {
27
27
  /** 画面完全填充canvas区域,画面会被拉伸 */ full: 0,
@@ -53,32 +53,32 @@ var THEME_PROPS = [
53
53
  // 播放区间(片段分享)。通过 props 下发而不是靠事件,避免主题异步渲染时错过初始化事件
54
54
  'playbackRange'
55
55
  ];
56
- /**
57
- * 当移动端 picker 控件打开时需要关闭动画(定时器)
56
+ /**
57
+ * 当移动端 picker 控件打开时需要关闭动画(定时器)
58
58
  */ var CLEAR_TIMER_HEADER_FOOTER_ANIMATION = 'CLEAR_TIMER_HEADER_FOOTER_ANIMATION';
59
- /**
60
- * 'rec', 'cloudRec', 'cloudRecord' 是一个组,并且要在头部(移动端特殊处理)
61
- *
62
- * | rec | cloudRec | cloudRecord |
63
- * |:---------------------:|:------------:|:---------------:|
64
- * | 本地回放(SDK存储回放) | 云存储回放 | 云录制回放 |
59
+ /**
60
+ * 'rec', 'cloudRec', 'cloudRecord' 是一个组,并且要在头部(移动端特殊处理)
61
+ *
62
+ * | rec | cloudRec | cloudRecord |
63
+ * |:---------------------:|:------------:|:---------------:|
64
+ * | 本地回放(SDK存储回放) | 云存储回放 | 云录制回放 |
65
65
  */ var REC_GROUP = [
66
66
  'rec',
67
67
  'cloudRec',
68
68
  'cloudRecord'
69
69
  ];
70
- /**
71
- * 设备信息
72
- *
73
- * | deviceID | deviceName |
74
- * |:-------------------:|:-------------:|
75
- * | 设备ID(唯一标识) | 设备名称 |
70
+ /**
71
+ * 设备信息
72
+ *
73
+ * | deviceID | deviceName |
74
+ * |:-------------------:|:-------------:|
75
+ * | 设备ID(唯一标识) | 设备名称 |
76
76
  */ var DEVICE_INFO_GROUP = [
77
77
  'deviceID',
78
78
  'deviceName'
79
79
  ];
80
- /**
81
- * 暂停时能禁用的控件按钮
80
+ /**
81
+ * 暂停时能禁用的控件按钮
82
82
  */ var PAUSE_DISABLED_BTN = [
83
83
  'capturePicture',
84
84
  'volume',
@@ -89,9 +89,9 @@ var THEME_PROPS = [
89
89
  'speed',
90
90
  'globalFullscreen'
91
91
  ];
92
- /**
93
- * 移动端可以扩展的控件
94
- * ['ptz', 'talk', 'record', 'capturePicture', 'timeLine', 'rec', 'date'];
92
+ /**
93
+ * 移动端可以扩展的控件
94
+ * ['ptz', 'talk', 'record', 'capturePicture', 'timeLine', 'rec', 'date'];
95
95
  */ var MOBILE_EXTENDS = [
96
96
  'ptz',
97
97
  'timeLine',
@@ -99,25 +99,25 @@ var THEME_PROPS = [
99
99
  'date',
100
100
  'segmentProgress'
101
101
  ];
102
- /**
103
- *
104
- * 事件名
105
- *
106
- * --------------- ------------------
107
- * - - theme.emit(EVENTS.xxxxx) - -
108
- * - - -------------------------------------> - -
109
- * - - - -
110
- * - Theme - - Controls -
111
- * - - control.emit(EVENTS.control.xxx) - -
112
- * - - <-------------------------------------- - -
113
- * --------------- ------------------
114
- *
115
- * @example
116
- * ```ts
117
- * theme.on(EVENTS.loading)
118
- * theme.on(EVENTS.loading)
119
- * ```
120
- *
102
+ /**
103
+ *
104
+ * 事件名
105
+ *
106
+ * --------------- ------------------
107
+ * - - theme.emit(EVENTS.xxxxx) - -
108
+ * - - -------------------------------------> - -
109
+ * - - - -
110
+ * - Theme - - Controls -
111
+ * - - control.emit(EVENTS.control.xxx) - -
112
+ * - - <-------------------------------------- - -
113
+ * --------------- ------------------
114
+ *
115
+ * @example
116
+ * ```ts
117
+ * theme.on(EVENTS.loading)
118
+ * theme.on(EVENTS.loading)
119
+ * ```
120
+ *
121
121
  */ // 事件命名不要超过两层
122
122
  var EVENTS = {
123
123
  loading: 'loading',
@@ -132,11 +132,11 @@ var EVENTS = {
132
132
  /** 首帧 */ firstFrameDisplay: 'firstFrameDisplay',
133
133
  /** 全屏 */ fullscreen: 'fullscreen',
134
134
  /** 退出全屏 */ exitFullscreen: 'exitFullscreen',
135
- /**
136
- * 全屏变化(移动端也支持触发, 不过移动端是模拟的web全屏 即旋转 180度)
137
- * 当 isCurrentFullscreen 为 true 时,表示当前容器全局全屏状态
138
- *
139
- * 注意:同一个页面中只要有全屏的操作或取消全屏的操作,都会触发该事件 (移动端除外)
135
+ /**
136
+ * 全屏变化(移动端也支持触发, 不过移动端是模拟的web全屏 即旋转 180度)
137
+ * 当 isCurrentFullscreen 为 true 时,表示当前容器全局全屏状态
138
+ *
139
+ * 注意:同一个页面中只要有全屏的操作或取消全屏的操作,都会触发该事件 (移动端除外)
140
140
  */ fullscreenChange: 'fullscreenChange',
141
141
  /** 重置容器尺寸 */ resize: 'resize',
142
142
  /** 屏幕旋转方向变化 */ orientationChange: 'orientationChange',
@@ -163,8 +163,8 @@ var EVENTS = {
163
163
  setAllDayRecTimes: 'setAllDayRecTimes',
164
164
  getOSDTime: 'getOSDTime',
165
165
  /** 播放区间播放结束(SDK 层 playbackRange 特性) */ playbackEnd: 'playbackEnd',
166
- /**
167
- * 控件相关
166
+ /**
167
+ * 控件相关
168
168
  */ control: {
169
169
  /** 点击播放播放/暂停按钮 */ play: 'Control.play',
170
170
  /** 播放控件销毁 */ playDestroy: 'Control.playDestroy',
@@ -219,6 +219,8 @@ var EVENTS = {
219
219
  /** 日期面板展示隐藏变换 */ datePanelOpenChange: 'Control.datePanelOpenChange',
220
220
  /** 日期改变 */ dateChange: 'Control.dateChange',
221
221
  /** 日期改变 */ dateMonthChange: 'Control.dateMonthChange',
222
+ /** 日期面板展示的月份变化 */ datePanelMonthChange: 'Control.datePanelMonthChange',
223
+ /** 日期面板展示的年份变化 */ datePanelYearChange: 'Control.datePanelYearChange',
222
224
  /** 日期销毁 */ dateDestroy: 'Control.datePanelDestroy',
223
225
  /** 时间面板展示隐藏变换 */ timePanelOpenChange: 'Control.timePanelOpenChange',
224
226
  /** 时间改变 */ timeChange: 'Control.timeChange',
@@ -235,8 +237,8 @@ var EVENTS = {
235
237
  /** 播放器内容区域销毁 */ contentDestroy: 'Control.contentDestroy',
236
238
  /** 播放器内容区域重新渲染 */ contentRerender: 'Control.contentRerender'
237
239
  },
238
- /**
239
- * 主题控件相关
240
+ /**
241
+ * 主题控件相关
240
242
  */ theme: {
241
243
  /** 销毁前 */ beforeDestroy: 'Theme.beforeDestroy',
242
244
  /** 销毁后 */ destroyed: 'Theme.destroyed',
@@ -2966,7 +2968,8 @@ var zh = {
2966
2968
  cancel: '取消',
2967
2969
  ok: '确定',
2968
2970
  close: '关闭',
2969
- BTN_REC_LIST_TITLE: '录像片段'
2971
+ BTN_REC_LIST_TITLE: '录像片段',
2972
+ UNKOWN_ISSUE: '未知问题 【{{scope}}】'
2970
2973
  };
2971
2974
 
2972
2975
  // 不要出现多层的的数据, 数据铺平
@@ -3250,7 +3253,8 @@ var en = {
3250
3253
  cancel: 'Cancel',
3251
3254
  ok: 'Ok',
3252
3255
  close: 'Close',
3253
- BTN_REC_LIST_TITLE: 'Records'
3256
+ BTN_REC_LIST_TITLE: 'Records',
3257
+ UNKOWN_ISSUE: 'Unknown issue [{{scope}}]'
3254
3258
  };
3255
3259
 
3256
3260
  /**
@@ -4848,6 +4852,12 @@ function debounce(func, wait) {
4848
4852
  theme.controls.dateControl.on(EVENTS.control.dateChange, function(date) {
4849
4853
  theme.emit(EVENTS.control.dateChange, date);
4850
4854
  });
4855
+ theme.controls.dateControl.on(EVENTS.control.datePanelMonthChange, function(date, month) {
4856
+ theme.emit(EVENTS.control.datePanelMonthChange, date, month);
4857
+ });
4858
+ theme.controls.dateControl.on(EVENTS.control.datePanelYearChange, function(date, year) {
4859
+ theme.emit(EVENTS.control.datePanelYearChange, date, year);
4860
+ });
4851
4861
  theme.controls.dateControl.on(EVENTS.control.dateDestroy, function() {
4852
4862
  theme.emit(EVENTS.control.dateDestroy);
4853
4863
  });
@@ -8390,9 +8400,9 @@ function _set_prototype_of$8(o, p) {
8390
8400
  };
8391
8401
  return _set_prototype_of$8(o, p);
8392
8402
  }
8393
- /**
8394
- * 日历选择器控件
8395
- * @category Control
8403
+ /**
8404
+ * 日历选择器控件
8405
+ * @category Control
8396
8406
  */ var DatePickerControl = /*#__PURE__*/ function(Control) {
8397
8407
  _inherits$8(DatePickerControl, Control);
8398
8408
  function DatePickerControl(options) {
@@ -8407,6 +8417,8 @@ function _set_prototype_of$8(o, p) {
8407
8417
  })) || this;
8408
8418
  _this.options = options;
8409
8419
  _this._value = utilsTools.DateTime.format(((_this_options_props = _this.options.props) == null ? void 0 : (_this_options_props_urlInfo = _this_options_props.urlInfo) == null ? void 0 : (_this_options_props_urlInfo_searchParams = _this_options_props_urlInfo.searchParams) == null ? void 0 : _this_options_props_urlInfo_searchParams.begin) || new Date(), 'YYYY-MM-DD');
8420
+ // 面板首次展示的就是选中日期所在月份,初始化后不应触发年 / 月变化
8421
+ _this._renderMonth = _this._value.slice(0, 7);
8410
8422
  _this._render();
8411
8423
  // 日期上的点
8412
8424
  _this.on(EVENTS.control.dateMonthChange, function(dates) {
@@ -8467,20 +8479,39 @@ function _set_prototype_of$8(o, p) {
8467
8479
  _this.emit(EVENTS.control.dateChange, date);
8468
8480
  }
8469
8481
  },
8482
+ // 日历面板「上一月 / 上一年」,底层两种翻页都回调 onPrevMonth
8483
+ onPrevMonth: function onPrevMonth(current, prev) {
8484
+ _this.options.onPrevMonth == null ? void 0 : _this.options.onPrevMonth.call(_this.options, current, prev);
8485
+ _this._onPanelDateChange(prev);
8486
+ },
8487
+ // 日历面板「下一月 / 下一年」,底层两种翻页都回调 onNextMonth
8488
+ onNextMonth: function onNextMonth(current, next) {
8489
+ _this.options.onNextMonth == null ? void 0 : _this.options.onNextMonth.call(_this.options, current, next);
8490
+ _this._onPanelDateChange(next);
8491
+ },
8492
+ // 月 / 年面板中点选单元格同样会改变日历展示的年月,但底层不回调翻页钩子
8493
+ onCell: function onCell(date, mode) {
8494
+ _this.options.onCell == null ? void 0 : _this.options.onCell.call(_this.options, date, mode);
8495
+ if (mode !== 'date' && !_this._isPanelCellDisabled(date, mode)) _this._onPanelDateChange(date);
8496
+ },
8470
8497
  onOpenChange: function onOpenChange(open) {
8471
8498
  _this.options.onPanelChange == null ? void 0 : _this.options.onPanelChange.call(_this.options, open, _this.datePicker.current);
8472
8499
  _this.emit(EVENTS.control.datePanelOpenChange, open, _this.datePicker.current);
8500
+ // 面板重新打开会跳回选中日期所在月份,且底层不会回调翻页钩子,这里补齐
8501
+ if (open) _this._onPanelDateChange(_this.datePicker.current);
8473
8502
  }
8474
8503
  }));
8475
8504
  };
8476
- /**
8477
- * 设置日期, change = true 时触发 onChange 事件
8478
- * @param date 设置的日期
8479
- * @param change 是否触发 onChange 事件
8505
+ /**
8506
+ * 设置日期, change = true 时触发 onChange 事件
8507
+ * @param date 设置的日期
8508
+ * @param change 是否触发 onChange 事件
8480
8509
  */ _proto.setDate = function setDate(date, change) {
8481
8510
  if (change === void 0) change = true;
8482
8511
  var _this_datePicker;
8483
8512
  (_this_datePicker = this.datePicker) == null ? void 0 : _this_datePicker.setCurrent(date, change);
8513
+ // 主动设值由调用方发起,同步展示月份但不触发年 / 月变化回调
8514
+ if (date) this._renderMonth = utilsTools.DateTime.format(date, 'YYYY-MM');
8484
8515
  if (date && !change && this._value !== utilsTools.DateTime.format(date, 'YYYY-MM-DD')) {
8485
8516
  this._value = utilsTools.DateTime.format(date, 'YYYY-MM-DD');
8486
8517
  if (date && this.$container.querySelector("." + PREFIX_CLASS + "-mobile-date-filter-value")) {
@@ -8492,9 +8523,9 @@ function _set_prototype_of$8(o, p) {
8492
8523
  if (this.datePicker) this.datePicker.open = false;
8493
8524
  Control.prototype.reset.call(this);
8494
8525
  };
8495
- /**
8496
- * 销毁控件
8497
- * @override
8526
+ /**
8527
+ * 销毁控件
8528
+ * @override
8498
8529
  */ _proto.destroy = function destroy() {
8499
8530
  if (this.datePicker) {
8500
8531
  this.datePicker.destroy();
@@ -8507,9 +8538,39 @@ function _set_prototype_of$8(o, p) {
8507
8538
  var arr = this._value.split('-');
8508
8539
  return arr[1] + "." + arr[2];
8509
8540
  };
8510
- /**
8511
- * 点击 Control 会触发
8512
- * @overload super._onControlClick(e: Event)
8541
+ /**
8542
+ * / 年面板中被点选的单元格是否已被调用方禁用
8543
+ *
8544
+ * 禁用的单元格底层不会切换展示的年月,因此不应派发变化
8545
+ * @param date 单元格日期
8546
+ * @param mode 当前面板模式
8547
+ */ _proto._isPanelCellDisabled = function _isPanelCellDisabled(date, mode) {
8548
+ if (mode === 'month') return !!(this.options.disabledMonth == null ? void 0 : this.options.disabledMonth.call(this.options, date, utilsTools.DateTime.format(date, 'YYYY-MM')));
8549
+ if (mode === 'year') return !!(this.options.disabledYear == null ? void 0 : this.options.disabledYear.call(this.options, date, date.getFullYear()));
8550
+ return false;
8551
+ };
8552
+ /**
8553
+ * 日历面板展示的年月发生变化时,派发年份 / 月份变化
8554
+ *
8555
+ * 年份变化会先于月份变化派发;跨年翻页(如 2026-01 -> 2025-12)两者都会触发
8556
+ * @param renderDate 面板当前展示的日期
8557
+ */ _proto._onPanelDateChange = function _onPanelDateChange(renderDate) {
8558
+ if (!renderDate) return;
8559
+ var month = utilsTools.DateTime.format(renderDate, 'YYYY-MM');
8560
+ if (!month || month === this._renderMonth) return;
8561
+ var prevYear = this._renderMonth.slice(0, 4);
8562
+ var year = month.slice(0, 4);
8563
+ this._renderMonth = month;
8564
+ if (year !== prevYear) {
8565
+ this.options.onYearChange == null ? void 0 : this.options.onYearChange.call(this.options, renderDate, year);
8566
+ this.emit(EVENTS.control.datePanelYearChange, renderDate, year);
8567
+ }
8568
+ this.options.onMonthChange == null ? void 0 : this.options.onMonthChange.call(this.options, renderDate, month);
8569
+ this.emit(EVENTS.control.datePanelMonthChange, renderDate, month);
8570
+ };
8571
+ /**
8572
+ * 点击 Control 会触发
8573
+ * @overload super._onControlClick(e: Event)
8513
8574
  */ _proto._onControlClick = function _onControlClick(e) {
8514
8575
  Control.prototype._onControlClick.call(this, e);
8515
8576
  };
@@ -10400,6 +10461,11 @@ function _unsupported_iterable_to_array(o, minLen) {
10400
10461
  if (n === "Map" || n === "Set") return Array.from(n);
10401
10462
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
10402
10463
  }
10464
+ /**
10465
+ * 语言包缺 key 时的兜底文案 key
10466
+ *
10467
+ * 拼写沿用语言包中既有的 `UNKOWN_ISSUE`(少了一个 N),改名属破坏性变更,故保持原样。
10468
+ */ var UNKOWN_ISSUE_KEY = 'UNKOWN_ISSUE';
10403
10469
  var THEME_DEFAULT_OPTIONS = {
10404
10470
  dblClickFullscreen: true,
10405
10471
  language: 'zh',
@@ -10475,7 +10541,7 @@ var THEME_DEFAULT_OPTIONS = {
10475
10541
  */ _this._footerMoreControl = null, /** 头部控件 @since 0.0.1 @private */ _this._header = null, /** 低部控件 @since 0.0.1 @private */ _this._footer = null, /** 回放底部时间轴 @since 0.0.1 @private */ _this._recFooter = null, /**
10476
10542
  * 移动端扩展容器, 扩展的控件渲染在指定容器以外, 仅只用端适用, 为了可以放置大的控件和方便开发接入
10477
10543
  * @private
10478
- */ _this._mobileExtend = null, /** @since 0.0.1 @private */ _this._interactiveResult = null, /** @since 0.0.1 @private */ _this._themeData = null, _this._fullscreen = null, _this.zoomUtil = null, /** 清除屏幕旋转 */ _this._cleanupOrientation = null, /** resizeObserver 监听销毁 */ _this._cleanUpResizeObserver = null, /** 容器的宽 */ _this._width = 0, /** 容器的高 */ _this._height = 0, /** 当前容器的全屏状态 true: 全屏, false: 非全屏 */ _this._isCurrentFullscreen = false, /** 屏幕旋转角度 0 | 90 | 180 | 270 */ _this._orientationAngle = 0, _this._url = '', /** 是否播放中 @private */ _this._playing = false, /** @private 加载中 */ _this._loading = false, /** 音量 */ _this._volume = 0, /** 静音 */ _this._muted = false, /** 电子放大倍数 @private */ _this._zoom = 1, /** 放大中 true: 可缩放状态,false: 禁止缩放状态(不能缩放) @private */ _this._zooming = false, /** 录制中 @private */ _this._recording = false, /** 对讲中 @private */ _this._talking = false, /** 倍速 @private */ _this._speed = 1, /** 自定清晰度 @private */ _this._videoLevelAuto = false, /** 清晰度列表 */ _this.videoLevelList = [], /** 回放片段列表 */ _this.recordList = [], /**
10544
+ */ _this._mobileExtend = null, /** @since 0.0.1 @private */ _this._interactiveResult = null, /** @since 0.0.1 @private */ _this._themeData = null, _this._fullscreen = null, _this.zoomUtil = null, /** 清除屏幕旋转 */ _this._cleanupOrientation = null, /** resizeObserver 监听销毁 */ _this._cleanUpResizeObserver = null, /** 容器的宽 */ _this._width = 0, /** 容器的高 */ _this._height = 0, /** 当前容器的全屏状态 true: 全屏, false: 非全屏 */ _this._isCurrentFullscreen = false, /** 屏幕旋转角度 0 | 90 | 180 | 270 */ _this._orientationAngle = 0, _this._url = '', /** 是否播放中 @private */ _this._playing = false, /** @private 加载中 */ _this._loading = false, /** 音量 */ _this._volume = 0, /** 静音 */ _this._muted = false, /** 正在兜底的原始 scope,非 null 表示处于兜底取值中(用于避免 customizeMissing 无限递归) */ _this._missingScope = null, /** 电子放大倍数 @private */ _this._zoom = 1, /** 放大中 true: 可缩放状态,false: 禁止缩放状态(不能缩放) @private */ _this._zooming = false, /** 录制中 @private */ _this._recording = false, /** 对讲中 @private */ _this._talking = false, /** 倍速 @private */ _this._speed = 1, /** 自定清晰度 @private */ _this._videoLevelAuto = false, /** 清晰度列表 */ _this.videoLevelList = [], /** 回放片段列表 */ _this.recordList = [], /**
10479
10545
  * 播放区间(片段分享),null 表示不约束。
10480
10546
  * 由 SDK 层在初始化时通过 props 下发,主题层据此决定日历/回放类型按钮
10481
10547
  * 是否渲染、片段进度条是否渲染。区间没有运行时变更入口。
@@ -10738,6 +10804,50 @@ var THEME_DEFAULT_OPTIONS = {
10738
10804
  }
10739
10805
  };
10740
10806
  /**
10807
+ * 获取多语言文案
10808
+ *
10809
+ * 相比直接用 `theme.i18n.t()`:返回类型收窄为 `string`(底层签名是 `string | number`,
10810
+ * 调用处不必再写 `as string`)。缺失 key 的兜底由 i18n 实例上的 `customizeMissing`
10811
+ * 统一处理,因此两者在兜底行为上一致。
10812
+ * @param scope 多语言 key
10813
+ * @param variables 插值变量,如 `{ zoom: 8 }`;传 `defaultvalue` 可指定自己的兜底文案
10814
+ * @returns 文案;scope 不存在时返回「未知问题 【scope】」
10815
+ * @example
10816
+ * ```ts
10817
+ * theme.t('ZOOM_LIMIT_MAX', { zoom: 8 });
10818
+ * theme.t('NOT_EXIST_KEY'); // 未知问题 【NOT_EXIST_KEY】
10819
+ * theme.t('NOT_EXIST_KEY', { defaultvalue: '自定义兜底' }); // 自定义兜底
10820
+ * ```
10821
+ */ _proto.t = function t(scope, variables) {
10822
+ return this.i18n.t(scope, variables);
10823
+ };
10824
+ /**
10825
+ * 语言包缺 key 时的兜底文案(`customizeMissing` 的实现)
10826
+ *
10827
+ * 注意底层是把本方法的返回值「原样返回」、不再做插值,所以这里借
10828
+ * `i18n.t(UNKOWN_ISSUE)` 完成插值。而这一次取值本身也可能缺失
10829
+ * (如 `language` 传了不存在的语言,当前语言包整体不存在),
10830
+ * 那会再次回调到这里造成无限递归,因此用重入标记兜住,退化为直接返回原始 scope。
10831
+ *
10832
+ * 注:`options.locales` 与内置语言包是深合并,无法移除内置的 UNKOWN_ISSUE,
10833
+ * 因此正常配置下不会走到退化分支。
10834
+ * @param scope 缺失的多语言 key
10835
+ * @param variables 原始插值变量
10836
+ */ _proto._missingText = function _missingText(scope, variables) {
10837
+ // 兜底文案自身也缺失(如当前语言的语言包不存在):直接返回最初的 scope,
10838
+ // 而不是兜底 key 本身,否则用户看到的是 'UNKOWN_ISSUE' 这种无意义内容
10839
+ if (this._missingScope !== null) return "" + this._missingScope;
10840
+ this._missingScope = scope;
10841
+ try {
10842
+ // scope 放在最后,避免调用方传入同名变量把它覆盖掉
10843
+ return this.i18n.t(UNKOWN_ISSUE_KEY, _extends({}, variables, {
10844
+ scope: scope
10845
+ }));
10846
+ } finally{
10847
+ this._missingScope = null;
10848
+ }
10849
+ };
10850
+ /**
10741
10851
  * 销毁包括事件、控件 ...
10742
10852
  *
10743
10853
  * Destroy (including events, controls...)
@@ -10793,6 +10903,7 @@ var THEME_DEFAULT_OPTIONS = {
10793
10903
  // 私有方法
10794
10904
  // ==============================================================================================
10795
10905
  /** 初始化配置项 */ _proto._initOptions = function _initOptions(options) {
10906
+ var _this = this;
10796
10907
  if (options === void 0) options = {};
10797
10908
  var _this_options_loggerOptions, _this_options_definitionOptions_list, _this_options_definitionOptions, _this_options_videoLevelList;
10798
10909
  // 先对模块级默认配置做一次深拷贝,得到全新的嵌套对象/数组,
@@ -10845,7 +10956,13 @@ var THEME_DEFAULT_OPTIONS = {
10845
10956
  });
10846
10957
  // prettier-ignore
10847
10958
  this.i18n = new I18n(locales, {
10848
- defaultLocale: language
10959
+ defaultLocale: language,
10960
+ // 语言包缺 key 时,底层默认返回 `[missing "zh.XXX" translation]`,
10961
+ // 这种占位串一旦透到 UI 上对用户毫无意义。挂在 i18n 实例上统一兜底,
10962
+ // 这样控件内直接调用 `i18n.t()` 的地方也能受益,无需逐处改造。
10963
+ customizeMissing: function customizeMissing(scope, variables) {
10964
+ return _this._missingText(scope, variables);
10965
+ }
10849
10966
  });
10850
10967
  // 默认清晰度列表
10851
10968
  if (((_this_options_definitionOptions = this.options.definitionOptions) == null ? void 0 : (_this_options_definitionOptions_list = _this_options_definitionOptions.list) == null ? void 0 : _this_options_definitionOptions_list.length) > 0 || ((_this_options_videoLevelList = this.options.videoLevelList) == null ? void 0 : _this_options_videoLevelList.length) > 0) {
@@ -11870,7 +11987,7 @@ var THEME_DEFAULT_OPTIONS = {
11870
11987
  zh: zh,
11871
11988
  en: en
11872
11989
  };
11873
- /** 版本号 @since 0.0.1 */ Theme.THEME_VERSION = '3.1.5-beta.4';
11990
+ /** 版本号 @since 0.0.1 */ Theme.THEME_VERSION = '3.1.6';
11874
11991
 
11875
11992
  exports.Control = Control;
11876
11993
  exports.EVENTS = EVENTS;