timeline-canvas 1.3.1 → 1.4.1

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.
Files changed (41) hide show
  1. package/README.md +183 -162
  2. package/README_CN.md +185 -164
  3. package/dist/ContextMenuPlugin-DkjzERie.mjs +1 -0
  4. package/dist/{ContextMenuPlugin-DaM7qC-I.d.mts → ContextMenuPlugin-erWC3clR.d.mts} +1 -1
  5. package/dist/{DarkThemePlugin-CbU457K7.d.mts → DarkThemePlugin-DSeernWS.d.mts} +1 -1
  6. package/dist/DarkThemePlugin-oE6DVEib.mjs +1 -0
  7. package/dist/EventMediaPlugin-Co_Fr3CX.mjs +1 -0
  8. package/dist/{EventMediaPlugin-BfZm0W26.d.mts → EventMediaPlugin-DpK2xquj.d.mts} +1 -1
  9. package/dist/{EventTooltipPlugin-D2jEsna_.d.mts → EventTooltipPlugin-B2lXP9uu.d.mts} +1 -1
  10. package/dist/EventTooltipPlugin-mbadM95i.mjs +1 -0
  11. package/dist/LightThemePlugin-BigH_oWz.mjs +1 -0
  12. package/dist/{LightThemePlugin-DAbrMpAs.d.mts → LightThemePlugin-CXkW_Wpg.d.mts} +1 -1
  13. package/dist/{PerformanceOverlayPlugin-B21vlKMn.d.mts → PerformanceOverlayPlugin-CnfsbiMK.d.mts} +1 -1
  14. package/dist/PerformanceOverlayPlugin-o5al1GSm.mjs +1 -0
  15. package/dist/builtin-plugin/ContextMenuPlugin.d.mts +1 -2
  16. package/dist/builtin-plugin/ContextMenuPlugin.mjs +1 -1
  17. package/dist/builtin-plugin/DarkThemePlugin.d.mts +1 -2
  18. package/dist/builtin-plugin/DarkThemePlugin.mjs +1 -1
  19. package/dist/builtin-plugin/EventMediaPlugin.d.mts +1 -2
  20. package/dist/builtin-plugin/EventMediaPlugin.mjs +1 -1
  21. package/dist/builtin-plugin/EventTooltipPlugin.d.mts +1 -2
  22. package/dist/builtin-plugin/EventTooltipPlugin.mjs +1 -1
  23. package/dist/builtin-plugin/LightThemePlugin.d.mts +1 -2
  24. package/dist/builtin-plugin/LightThemePlugin.mjs +1 -1
  25. package/dist/builtin-plugin/MutexGuardPlugin.d.mts +1 -1
  26. package/dist/builtin-plugin/MutexGuardPlugin.mjs +1 -1
  27. package/dist/builtin-plugin/PerformanceOverlayPlugin.d.mts +1 -2
  28. package/dist/builtin-plugin/PerformanceOverlayPlugin.mjs +1 -1
  29. package/dist/index.d.mts +10 -11
  30. package/dist/index.mjs +1 -1
  31. package/dist/{types-CHhzteRO.d.mts → types-Do4sfz9k.d.mts} +147 -48
  32. package/package.json +52 -47
  33. package/dist/ContextMenuPlugin-DDuNDVYG.mjs +0 -1
  34. package/dist/DarkThemePlugin-g_jQnbr2.mjs +0 -1
  35. package/dist/EventMediaPlugin-C10NRApa.mjs +0 -1
  36. package/dist/EventTooltipPlugin-BGMlHyI2.mjs +0 -1
  37. package/dist/LightThemePlugin-CCklHOHQ.mjs +0 -1
  38. package/dist/PerformanceOverlayPlugin-CiGYUAlO.mjs +0 -1
  39. /package/dist/{Logger-CfVK3yFL.mjs → Logger-BTKQPGDj.mjs} +0 -0
  40. /package/dist/{performanceMonitor-BBherdD8.mjs → performanceMonitor-Cb_v1gAo.mjs} +0 -0
  41. /package/dist/{types-Dc2ct_CM.mjs → types-NnKZYB1U.mjs} +0 -0
package/README_CN.md CHANGED
@@ -1,164 +1,185 @@
1
- # Timeline Canvas
2
-
3
- 一个基于 HTML5 Canvas 和 TypeScript 构建的强大、高性能时间轴组件。
4
-
5
- [文档地址](https://umbrella22.github.io/timeline-canvas/index.html)
6
-
7
- ## 特性
8
-
9
- - 🚀 **高性能**: 基于 Canvas API 构建,可流畅渲染大量数据。
10
- - 🎨 **主题支持**: 内置亮色和暗色主题,支持自定义主题。
11
- - 🖱️ **交互丰富**:
12
- - 拖拽移动事件。
13
- - 从两端调整事件大小。
14
- - 双击切割事件。
15
- - 缩放 (Ctrl/Cmd + 滚动) 和平移。
16
- - 支持右键菜单。
17
- - 📏 **智能辅助线**: 对齐辅助线和吸附功能,实现精确的事件放置。
18
- - ⏱️ **时间指示器**: 可拖动的时间头,支持吸附。
19
- - 🔌 **插件系统**: 可扩展架构,内置主题、右键菜单等插件。
20
- - 📝 **TypeScript**: 使用 TypeScript 编写,提供完整的类型定义。
21
-
22
- ## 安装
23
-
24
- ```bash
25
- npm install timeline-canvas
26
- # or
27
- pnpm add timeline-canvas
28
- # or
29
- yarn add timeline-canvas
30
- ```
31
-
32
- ## 基础用法
33
-
34
- 1. 在 HTML 中创建一个包含 canvas 元素的容器:
35
-
36
- ```html
37
- <div style="width: 100%; height: 500px;">
38
- <canvas id="timeline-canvas"></canvas>
39
- </div>
40
- ```
41
-
42
- 1. 初始化 Timeline:
43
-
44
- ```typescript
45
- import { Timeline } from "timeline-canvas";
46
-
47
- // 初始化
48
- const timeline = new Timeline("timeline-canvas", {
49
- startTime: 0,
50
- endTime: 100,
51
- trackHeight: 40,
52
- // ... 其他选项
53
- });
54
-
55
- // 添加一个轨道
56
- timeline.addTrack();
57
-
58
- // 添加一个事件 (轨道索引, 开始时间, 结束时间, 标题)
59
- timeline.addEvent(0, 10, 30, "我的事件", "描述信息");
60
- ```
61
-
62
- ## 配置
63
-
64
- `Timeline` 构造函数接受一个配置对象:
65
-
66
- ```typescript
67
- interface TimelineOptions {
68
- // 尺寸设置
69
- canvasHeight?: number;
70
- trackHeight?: number;
71
- trackMargin?: number;
72
- timelineHeight?: number;
73
-
74
- // 时间设置
75
- startTime?: number;
76
- endTime?: number;
77
- secondWidth?: number; // 每秒对应的像素宽度
78
- snapInterval?: number;
79
- snapToSeconds?: boolean;
80
-
81
- // 功能开关
82
- enableTimeIndicator?: boolean;
83
- enableEventResize?: boolean;
84
- enableEventSplit?: boolean;
85
- enableContextMenu?: boolean;
86
- readOnly?: boolean;
87
- autoAddTrack?: boolean;
88
-
89
- // 样式设置
90
- colors?: Partial<TimelineColors>;
91
- eventTextStyle?: Partial<EventTextStyle>;
92
- theme?: TimelinePlugin; // 初始主题
93
-
94
- // 回调函数
95
- onEventAdd?: (data: EventAddData) => void;
96
- onEventUpdate?: (data: EventUpdateData) => void;
97
- onEventClick?: (data: EventClickData) => void;
98
- // ... 更多回调
99
- }
100
- ```
101
-
102
- ## API 参考
103
-
104
- ### 核心方法
105
-
106
- - **`addTrack()`**: 添加一个新的空轨道。
107
- - **`removeTrack()`**: 移除最后一个轨道。
108
- - **`addEvent(trackIndex, startTime, endTime, title, ...)`**: 向指定轨道添加事件。
109
- - **`updateEvent(trackIndex, eventIndex, updates)`**: 更新现有事件。
110
- - **`deleteEvent(trackIndex, eventIndex)`**: 删除事件。
111
- - **`loadData(data)`**: 从 JSON 对象加载轨道和事件数据。
112
- - **`setZoomLevel(level)`**: 设置缩放级别 (默认为 1.0)。
113
- - **`setTimeIndicator(seconds)`**: 将时间指示器移动到指定时间。
114
- - **`setTheme('light' | 'dark')`**: 切换内置主题。
115
-
116
- ### 插件
117
-
118
- 本库自带几个内置插件:
119
-
120
- - **`DarkThemePlugin`**: 暗色模式主题。
121
- - **`LightThemePlugin`**: 亮色模式主题 (默认)。
122
- - **`ContextMenuPlugin`**: 添加右键菜单支持。
123
- - **`PerformanceOverlayPlugin`**: 显示 FPS 和渲染时间,用于调试。
124
- - **`EventMediaPlugin`**: 支持在事件内渲染媒体内容(图片、波形图)。
125
-
126
- 使用方法:
127
-
128
- ```typescript
129
- import { Timeline, PerformanceOverlayPlugin } from "timeline-canvas";
130
-
131
- const timeline = new Timeline("canvas-id");
132
- timeline.usePlugin(new PerformanceOverlayPlugin());
133
- ```
134
-
135
- ## 开发
136
-
137
- ```bash
138
- # 在仓库根目录执行以下命令(monorepo)
139
- # 安装依赖
140
- pnpm install
141
-
142
- # 启动开发服务器
143
- pnpm dev
144
-
145
- # 构建库
146
- pnpm build
147
-
148
- # 运行文档站点
149
- pnpm docs:dev
150
- ```
151
-
152
- ## MCP(面向 VS Code Copilot Chat)
153
-
154
- 本仓库提供一个最小可用的 MCP server(stdio),用于让 AI 以“工具调用”的方式完成:生成内置插件骨架、自动挂到导出、做基础校验、以及触发 allowlist 内的仓库脚本。
155
-
156
- - 安装与启动(推荐):在仓库根目录执行 `pnpm install`,然后 `pnpm mcp`
157
- - VS Code 配置示例:见 .vscode/mcp.json
158
- - 说明与工具列表:见 packages/mcp-service/README_CN.md
159
-
160
- > VS Code / Copilot Chat 的 MCP 配置入口可能随版本变化。核心是把一个 **stdio server** 配置为在 `packages/mcp-service` 目录启动(`pnpm start`),并将工作目录/环境变量指向仓库根目录(见 packages/mcp-service/README_CN.md)。
161
-
162
- ## 许可证
163
-
164
- MIT
1
+ # Timeline Canvas
2
+
3
+ 一个基于 HTML5 Canvas 和 TypeScript 构建的强大、高性能时间轴组件。
4
+
5
+ [文档地址](https://umbrella22.github.io/timeline-canvas/index.html)
6
+
7
+ ## 特性
8
+
9
+ - 🚀 **高性能**: 基于 Canvas API 构建,可流畅渲染大量数据。
10
+ - 🎨 **主题支持**: 内置亮色和暗色主题,支持自定义主题。
11
+ - 🖱️ **交互丰富**:
12
+ - 拖拽移动事件。
13
+ - 从两端调整事件大小。
14
+ - 双击切割事件。
15
+ - 缩放 (Ctrl/Cmd + 滚动) 和平移。
16
+ - 支持右键菜单。
17
+ - 📏 **智能辅助线**: 对齐辅助线和吸附功能,实现精确的事件放置。
18
+ - ⏱️ **时间指示器**: 可拖动的时间头,支持吸附。
19
+ - 🔌 **插件系统**: 可扩展架构,内置主题、右键菜单等插件。
20
+ - 📝 **TypeScript**: 使用 TypeScript 编写,提供完整的类型定义。
21
+
22
+ ## 安装
23
+
24
+ ```bash
25
+ npm install timeline-canvas
26
+ # or
27
+ pnpm add timeline-canvas
28
+ # or
29
+ yarn add timeline-canvas
30
+ ```
31
+
32
+ ## 基础用法
33
+
34
+ 1. 在 HTML 中创建一个包含 canvas 元素的容器:
35
+
36
+ ```html
37
+ <div style="width: 100%; height: 500px;">
38
+ <canvas id="timeline-canvas"></canvas>
39
+ </div>
40
+ ```
41
+
42
+ 1. 初始化 Timeline:
43
+
44
+ ```typescript
45
+ import { Timeline } from "timeline-canvas";
46
+
47
+ // 初始化
48
+ const timeline = new Timeline("timeline-canvas", {
49
+ startTime: 0,
50
+ endTime: 100,
51
+ trackHeight: 40,
52
+ // ... 其他选项
53
+ });
54
+
55
+ // 添加一个轨道
56
+ timeline.addTrack();
57
+
58
+ // 添加一个事件 (轨道索引, 开始时间, 结束时间, 标题)
59
+ timeline.addEvent(0, 10, 30, "我的事件", "描述信息");
60
+ ```
61
+
62
+ ## 配置
63
+
64
+ `Timeline` 构造函数接受一个配置对象:
65
+
66
+ ```typescript
67
+ interface TimelineOptions {
68
+ // 国际化
69
+ locale?: "en" | "zh" | "zh-CN";
70
+ messages?: Partial<TimelineI18nMessages>;
71
+
72
+ // 尺寸设置
73
+ canvasHeight?: number;
74
+ trackHeight?: number;
75
+ trackMargin?: number;
76
+ timelineHeight?: number;
77
+
78
+ // 时间设置
79
+ startTime?: number;
80
+ endTime?: number;
81
+ secondWidth?: number; // 每秒对应的像素宽度
82
+ snapInterval?: number;
83
+ snapToSeconds?: boolean;
84
+
85
+ // 功能开关
86
+ enableTimeIndicator?: boolean;
87
+ enableEventResize?: boolean;
88
+ enableEventSplit?: boolean;
89
+ enableContextMenu?: boolean;
90
+ readOnly?: boolean;
91
+ autoAddTrack?: boolean;
92
+
93
+ // 样式设置
94
+ colors?: Partial<TimelineColors>;
95
+ eventTextStyle?: Partial<EventTextStyle>;
96
+ theme?: TimelinePlugin; // 初始主题
97
+
98
+ // 回调函数
99
+ onEventAdd?: (data: EventAddData) => void;
100
+ onEventUpdate?: (data: EventUpdateData) => void;
101
+ onEventClick?: (data: EventClickData) => void;
102
+ // ... 更多回调
103
+ }
104
+ ```
105
+
106
+ ### 国际化
107
+
108
+ 内置状态提示、默认右键菜单文案和性能面板标签支持通过 `locale` 切换,也可以通过 `messages` 做局部覆盖:
109
+
110
+ ```typescript
111
+ import { Timeline } from "timeline-canvas";
112
+
113
+ const timeline = new Timeline("timeline-canvas", {
114
+ locale: "zh-CN",
115
+ messages: {
116
+ statusReady: "已准备",
117
+ },
118
+ });
119
+ ```
120
+
121
+ 内置插件元信息里的 `description` 也支持通过 `descriptionI18n` 提供多语言版本;如果需要按当前语言渲染描述,可以使用 `getPluginMetadataDescription(metadata, locale)`。
122
+
123
+ ## API 参考
124
+
125
+ ### 核心方法
126
+
127
+ - **`addTrack()`**: 添加一个新的空轨道。
128
+ - **`removeTrack()`**: 移除最后一个轨道。
129
+ - **`addEvent(trackIndex, startTime, endTime, title, ...)`**: 向指定轨道添加事件。
130
+ - **`updateEvent(trackIndex, eventIndex, updates)`**: 更新现有事件。
131
+ - **`deleteEvent(trackIndex, eventIndex)`**: 删除事件。
132
+ - **`loadData(data)`**: 从 JSON 对象加载轨道和事件数据。
133
+ - **`setZoomLevel(level)`**: 设置缩放级别 (默认为 1.0)。
134
+ - **`setTimeIndicator(seconds)`**: 将时间指示器移动到指定时间。
135
+ - **`setTheme('light' | 'dark')`**: 切换内置主题。
136
+
137
+ ### 插件
138
+
139
+ 本库自带几个内置插件:
140
+
141
+ - **`DarkThemePlugin`**: 暗色模式主题。
142
+ - **`LightThemePlugin`**: 亮色模式主题 (默认)。
143
+ - **`ContextMenuPlugin`**: 添加右键菜单支持。
144
+ - **`PerformanceOverlayPlugin`**: 显示 FPS 和渲染时间,用于调试。
145
+ - **`EventMediaPlugin`**: 支持在事件内渲染媒体内容(图片、波形图)。
146
+
147
+ 使用方法:
148
+
149
+ ```typescript
150
+ import { Timeline, PerformanceOverlayPlugin } from "timeline-canvas";
151
+
152
+ const timeline = new Timeline("canvas-id");
153
+ timeline.usePlugin(PerformanceOverlayPlugin);
154
+ ```
155
+
156
+ ## 开发
157
+
158
+ ```bash
159
+ # 在仓库根目录执行以下命令(monorepo)
160
+ # 安装依赖
161
+ pnpm install
162
+
163
+ # 启动开发服务器
164
+ pnpm dev
165
+
166
+ # 构建库
167
+ pnpm build
168
+
169
+ # 运行文档站点
170
+ pnpm docs:dev
171
+ ```
172
+
173
+ ## MCP(面向 VS Code Copilot Chat)
174
+
175
+ 本仓库提供一个最小可用的 MCP server(stdio),用于让 AI 以“工具调用”的方式完成:生成内置插件骨架、自动挂到导出、做基础校验、以及触发 allowlist 内的仓库脚本。
176
+
177
+ - 安装与启动(推荐):在仓库根目录执行 `pnpm install`,然后 `pnpm mcp`
178
+ - VS Code 配置示例:见 .vscode/mcp.json
179
+ - 说明与工具列表:见 packages/mcp-service/README_CN.md
180
+
181
+ > VS Code / Copilot Chat 的 MCP 配置入口可能随版本变化。核心是把一个 **stdio server** 配置为在 `packages/mcp-service` 目录启动(`pnpm start`),并将工作目录/环境变量指向仓库根目录(见 packages/mcp-service/README_CN.md)。
182
+
183
+ ## 许可证
184
+
185
+ MIT
@@ -0,0 +1 @@
1
+ import{i as e}from"./Logger-BTKQPGDj.mjs";import"./types-NnKZYB1U.mjs";const t=e(`ContextMenuPlugin`);function n(e,t){return e(t)}function r(e={}){return{metadata:{name:`context-menu`,version:`1.0.0`,description:`Context menu as plugin, supports HTML takeover`,descriptionI18n:{"zh-CN":`插件化右键菜单,支持 HTML 接管渲染`},type:`extension`},activate(r){let i=r.config&&r.config.contextMenuHtml||void 0,a=e.htmlTemplate||(typeof i==`string`?i:void 0),o=!!a;o&&(!a||a.trim()===``)&&(t.warn(r.timeline.t(`warningEmptyHtmlTemplateFallback`)),o=!1),r.api.registerRenderLayer({name:`context-menu-overlay`,position:`overlay`,render(e,t,i,s){if(!i.enableContextMenu||!s.contextMenuVisible||!s.contextMenuEvent){let e=n(r.api.getData,`contextMenuContainer`)||null;e&&(e.style.display=`none`),s.contextMenuBounds=null;return}let{padding:c,itemHeight:l,borderRadius:u,borderWidth:d,minWidth:f,fontSize:p,fontFamily:m,fontWeight:h}=i.contextMenuStyle;e.save(),e.font=`${h} ${p}px ${m}`;let g=f,_=`${h}-${p}-${m}`,v=n(r.api.getData,`contextMenuTextWidthCache`)||{},y=v[_]||{};for(let t of i.contextMenuItems){let n=y[t.name],r=n===void 0?e.measureText(t.name).width:n;n===void 0&&(y[t.name]=r),g=Math.max(g,r+c*2)}v[_]=y,r.api.setData(`contextMenuTextWidthCache`,v);let b=g,x=i.contextMenuItems.length*l+c*2,S=r.timeline.getCanvas().getBoundingClientRect(),C=s.contextMenuX,w=s.contextMenuY;if(C+b>S.width&&(C=S.width-b-5),w+x>S.height&&(w=S.height-x-5),s.contextMenuBounds={x:C,y:w,width:b,height:x,itemHeight:l,padding:c},o){let t=n(r.api.getData,`contextMenuContainer`)||null;if(!t){t=document.createElement(`div`),t.style.position=`absolute`,t.style.zIndex=`1000`,t.style.boxShadow=`0 2px 10px rgba(0,0,0,0.3)`,t.style.border=`${d}px solid ${i.colors.contextMenuBorder}`,t.style.borderRadius=`${u}px`,t.style.font=`${h} ${p}px ${m}`,t.style.background=i.colors.contextMenuBackground,t.style.color=i.colors.contextMenuText;let e=r.timeline.getCanvas().parentElement||document.body;e.style.position=e.style.position||`relative`,e.appendChild(t),r.api.setData(`contextMenuContainer`,t)}if(t.style.display=`block`,t.style.left=`${C}px`,t.style.top=`${w}px`,t.style.width=`${b}px`,t.style.height=`${x}px`,a)t.innerHTML=a;else{let e=``;for(let t=0;t<i.contextMenuItems.length;t++){let n=i.contextMenuItems[t],r=s.hoveredContextMenuItem===t,a=r?i.colors.contextMenuHoverBackground:`transparent`,o=r?i.colors.contextMenuHoverText:i.colors.contextMenuText;e+=`<div style="height:${l}px; padding:${c}px; background:${a}; color:${o}; display:flex; align-items:center;">${n.name}</div>`}t.innerHTML=e}e.restore();return}e.shadowColor=`rgba(0, 0, 0, 0.3)`,e.shadowBlur=10,e.shadowOffsetX=0,e.shadowOffsetY=2,e.fillStyle=i.colors.contextMenuBackground,e.beginPath(),e.roundRect?e.roundRect(C,w,b,x,u):(e.moveTo(C+u,w),e.lineTo(C+b-u,w),e.quadraticCurveTo(C+b,w,C+b,w+u),e.lineTo(C+b,w+x-u),e.quadraticCurveTo(C+b,w+x,C+b-u,w+x),e.lineTo(C+u,w+x),e.quadraticCurveTo(C,w+x,C,w+x-u),e.lineTo(C,w+u),e.quadraticCurveTo(C,w,C+u,w)),e.fill(),e.shadowColor=`transparent`,e.strokeStyle=i.colors.contextMenuBorder,e.lineWidth=d,e.stroke(),e.font=`${h} ${p}px ${m}`;for(let t=0;t<i.contextMenuItems.length;t++){let n=i.contextMenuItems[t],r=w+c+t*l;s.hoveredContextMenuItem===t&&(e.fillStyle=i.colors.contextMenuHoverBackground,e.beginPath(),t===0?e.roundRect?e.roundRect(C+d,r,b-d*2,l,[u-d,u-d,0,0]):e.fillRect(C+d,r,b-d*2,l):t===i.contextMenuItems.length-1&&e.roundRect?e.roundRect(C+d,r,b-d*2,l,[0,0,u-d,u-d]):e.fillRect(C+d,r,b-d*2,l),e.fill()),e.fillStyle=s.hoveredContextMenuItem===t?i.colors.contextMenuHoverText:i.colors.contextMenuText,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(n.name,C+c,r+l/2)}e.restore()}})},deactivate(e){e.api.unregisterRenderLayer(`context-menu-overlay`);let t=n(e.api.getData,`contextMenuContainer`)||null;t&&t.parentElement&&t.parentElement.removeChild(t)},destroy(e){let t=n(e.api.getData,`contextMenuContainer`)||null;t&&t.parentElement&&t.parentElement.removeChild(t)}}}export{r as t};
@@ -1,4 +1,4 @@
1
- import { u as TimelinePlugin } from "./types-CHhzteRO.mjs";
1
+ import { d as TimelinePlugin } from "./types-Do4sfz9k.mjs";
2
2
 
3
3
  //#region src/plugins/builtin/ContextMenuPlugin.d.ts
4
4
  interface ContextMenuPluginOptions {
@@ -1,4 +1,4 @@
1
- import { u as TimelinePlugin } from "./types-CHhzteRO.mjs";
1
+ import { d as TimelinePlugin } from "./types-Do4sfz9k.mjs";
2
2
 
3
3
  //#region src/plugins/builtin/DarkThemePlugin.d.ts
4
4
  declare const DarkThemePlugin: TimelinePlugin;
@@ -0,0 +1 @@
1
+ import"./types-NnKZYB1U.mjs";const e={canvasBackground:`#1E1E2E`,timelineBackground:`#2D2D3D`,trackBackground:`#2A2A3A`,trackBackgroundSelected:`#3A3A4A`,timelineText:`#CCCCDD`,timelineGrid:`#5A5A7A`,timelineSubGrid:`#3A3A4A`,trackText:`#CCCCDD`,eventColors:[`#FF6B6B`,`#4ECDC4`,`#45B7D1`,`#96CEB4`,`#FECA57`,`#FF9FF3`],eventText:`#FFFFFF`,eventBorder:`#FFFFFF`,eventBorderSelected:`#FFD700`,eventOverlay:`rgba(255, 255, 255, 0.1)`,dragPreviewValid:`rgba(100, 255, 100, 0.5)`,dragPreviewInvalid:`rgba(255, 100, 100, 0.5)`,dragPreviewBorderValid:`#00FF00`,dragPreviewBorderInvalid:`#FF0000`,timeIndicator:`#FF6B6B`,guideLine:`#00D9FF`,guideLineLabel:`#00D9FF`,dragTimeReferenceLine:`#FFD700`,dragTimeReferenceLabel:`#FFD700`,dragTimeReferenceLabelBackground:`rgba(0, 0, 0, 0)`,scrollbarTrack:`rgba(255, 255, 255, 0.6)`,scrollbarHandle:`rgba(150, 150, 150, 0.8)`,scrollbarHandleHover:`rgba(0, 0, 0, 0.85)`,scrollbarHandleHighlight:`rgba(255, 255, 255, 0.3)`,scrollbarBorder:`rgba(255, 255, 255, 0.9)`,contextMenuBackground:`#2D2D3D`,contextMenuBorder:`#5A5A7A`,contextMenuText:`#CCCCDD`,contextMenuHoverBackground:`#3A3A4A`,contextMenuHoverText:`#FFFFFF`,eventDurationLabel:`#FFD700`},t={metadata:{name:`theme-dark`,version:`1.0.0`,description:`Dark theme for timeline`,descriptionI18n:{"zh-CN":`时间轴暗色主题`},type:`theme`},activate(t){t.config.colors={...t.config.colors,...e},t.api.registerRenderLayer({name:`theme-dark-background`,position:`background`,render(e,t,n){e.fillStyle=n.colors.canvasBackground,e.fillRect(0,0,t.width,t.height)}})},deactivate(e){e.api.unregisterRenderLayer(`theme-dark-background`)}};export{t};
@@ -0,0 +1 @@
1
+ import"./types-NnKZYB1U.mjs";function e(e,t=!0){let n=Math.round(e),r=Math.floor(n/3600),i=Math.floor(n%3600/60),a=n%60;return t?`${r.toString().padStart(2,`0`)}:${i.toString().padStart(2,`0`)}:${a.toString().padStart(2,`0`)}`:`${r.toString().padStart(2,`0`)}:${i.toString().padStart(2,`0`)}`}function t(){let e=new Date;return e.getHours()*3600+e.getMinutes()*60+e.getSeconds()}function n(e,t,n,r,i,a){if(i!=null&&i>0){let t=i/Math.max(1,Math.floor(a??10));return e>=r?t:i}return!n||e<r?t*60:[{threshold:10,seconds:.5},{threshold:8,seconds:1},{threshold:5,seconds:2},{threshold:3,seconds:5},{threshold:2,seconds:10},{threshold:1.5,seconds:15},{threshold:0,seconds:30}].find(t=>e>=t.threshold)?.seconds??30}function r(e,t){return Math.round(e/t)*t}function i(e,t=3){let n=10**t;return Math.round(e*n)/n}function a(t,n){return`${e(t)} - ${e(n)}`}function o(t,n){let r=e(i(t));return n?`${n} ${r}`:r}function s(e,t,n,r,i,a,o=!1){e.beginPath(),e.moveTo(t+a,n),e.lineTo(t+r-a,n),e.arcTo(t+r,n,t+r,n+a,a),e.lineTo(t+r,n+i-a),e.arcTo(t+r,n+i,t+r-a,n+i,a),e.lineTo(t+a,n+i),e.arcTo(t,n+i,t,n+i-a,a),e.lineTo(t,n+a),e.arcTo(t,n,t+a,n,a),e.closePath(),o?e.stroke():e.fill()}function c(e,t,n,r,i,a){return n+(e-t)*r*i-a}const l={en:{statusReady:`Ready`,statusTrackAdded:`Track added ({count} total)`,statusAtLeastOneTrackRequired:`At least one track is required`,statusTrackRemoved:`Track removed ({count} remaining)`,statusEmptyTrackRemoved:`Empty track removed ({count} remaining)`,statusEventUpdated:`Event updated: {title}`,statusEventDeleted:`Event deleted: {title}`,statusDataLoaded:`Loaded {count} track(s)`,statusTimeIndicatorMoved:`Time indicator moved to: {time}`,statusZoomChanged:`Zoom: {percentage}%`,statusAutoFit:`Auto fit: {percentage}%`,statusAutoFitCappedWithPadding:`Auto fit capped at {percentage}%, added {seconds}s padding`,statusAutoFitCappedContentShort:`Auto fit capped at {percentage}%, content does not fill canvas`,statusEndTimeUpdated:`End time updated: {from} -> {to}`,statusInvalidSplitPosition:`Invalid split position: resulting events too short`,statusEventSplit:`Event split: {title}`,statusReadOnlyModeEnabled:`Read-only mode enabled`,statusReadOnlyModeDisabled:`Read-only mode disabled`,statusEventHighlighted:`Event highlighted: {title}`,statusHighlightCleared:`Highlight cleared`,statusTimelineDestroyed:`Timeline destroyed`,statusDragging:`Dragging: {title}`,statusAutoTrackAdded:`Auto-added track {count}`,statusEventPlaced:`Placed: {title} ({start} - {end})`,statusEventSelected:`Selected: {title}`,statusEventResizing:`Resizing: {start} - {end}`,statusEventResized:`Event resized: {title}`,statusReadOnlyEditDeleteBlocked:`Read-only events cannot be edited or deleted`,statusReadOnlySplitBlocked:`Read-only events cannot be split`,statusHoverEventTimeRange:`{title} ({start} - {end})`,labelTrackName:`Track {index}`,labelDurationPrefix:`Duration`,contextMenuEdit:`Edit`,contextMenuDelete:`Delete`,contextMenuExport:`Export`,overlayPerformanceMonitor:`Performance Monitor`,overlayFps:`FPS: {value}`,overlayLayerTimesMs:`Layer Times (ms):`,overlayCollecting:`Collecting...`,overlayLayerBackground:`Background`,overlayLayerTracks:`Tracks`,overlayLayerTimeline:`Timeline`,overlayLayerGuideLines:`Guide Lines`,overlayLayerIndicator:`Indicator`,overlayLayerScrollbar:`Scrollbar`,overlayLayerInteraction:`Interaction`,overlayLayerOverlay:`Overlay`,overlayLayerDragPreview:`Drag Preview`,errorCanvasNotFound:`Canvas element with id "{canvasId}" not found`,errorCanvasContextUnavailable:`Failed to get 2D context from canvas`,errorTimeIndicatorInvalid:`Time indicator position must be a number (seconds)`,errorZoomLevelInvalid:`Zoom level must be a valid number`,errorZoomLevelOutOfRange:`Zoom level out of valid range (1-1000)`,errorEndTimeInvalid:`End time must be a valid number (seconds)`,errorEndTimeNotAfterStart:`End time must be greater than start time`,warningEventsExceedEndTime:`Warning: some events exceed the new end time`,errorInvalidTrackIndex:`Invalid track index`,errorInvalidTrackIndexWithValue:`Invalid track index: {trackIndex}`,errorInvalidEventIndex:`Invalid event index`,errorInvalidEventIndexWithValue:`Invalid event index: {eventIndex}`,errorInvalidDataFormat:`Invalid data format`,errorInvalidTimeRange:`Invalid time range: startTime={startTime}, endTime={endTime}`,errorStartTimeBeforeMin:`Start time cannot enter left padding: startTime={startTime}, minAllowed={minAllowed}`,errorRenderLayer:`Error rendering layer "{layer}"`,errorCoreLayerHook:`Error in core layer hook "{hook}"`,errorPluginDependenciesMissing:`Plugin dependencies missing: {pluginId}`,errorPluginLoadFailed:`Plugin load failed: {pluginId}`,errorPluginLifecycleFailed:`Plugin {step} failed: {pluginId}`,errorPluginEventFailed:`Plugin event failed: {event}`,errorPluginValidationFailed:`Plugin validation failed: {event}`,warningInvalidDraggingState:`Invalid dragging state`,warningDraggingEventMissing:`Dragging event not found, aborting operation`,warningUnknownChangeType:`Unknown change type: {change}`,warningAlreadyInBatchMode:`Already in batch mode`,warningNotInBatchMode:`Not in batch mode`,warningEmptyHtmlTemplateFallback:`htmlTemplate is empty, falling back to Canvas rendering`,warningEmptyTooltipTemplateFallback:`htmlTemplate returned empty content, falling back to Canvas rendering`},"zh-CN":{statusReady:`就绪`,statusTrackAdded:`已新增轨道(共 {count} 条)`,statusAtLeastOneTrackRequired:`至少需要保留一条轨道`,statusTrackRemoved:`已删除轨道(剩余 {count} 条)`,statusEmptyTrackRemoved:`已移除空轨道(剩余 {count} 条)`,statusEventUpdated:`已更新事件:{title}`,statusEventDeleted:`已删除事件:{title}`,statusDataLoaded:`已加载 {count} 条轨道`,statusTimeIndicatorMoved:`时间指示器已移动到:{time}`,statusZoomChanged:`缩放:{percentage}%`,statusAutoFit:`自动适配:{percentage}%`,statusAutoFitCappedWithPadding:`自动适配已限制为 {percentage}%,并补充了 {seconds} 秒留白`,statusAutoFitCappedContentShort:`自动适配已限制为 {percentage}%,内容仍未铺满画布`,statusEndTimeUpdated:`结束时间已更新:{from} -> {to}`,statusInvalidSplitPosition:`分割位置无效:分割后的事件过短`,statusEventSplit:`已分割事件:{title}`,statusReadOnlyModeEnabled:`已启用只读模式`,statusReadOnlyModeDisabled:`已关闭只读模式`,statusEventHighlighted:`已高亮事件:{title}`,statusHighlightCleared:`已清除高亮`,statusTimelineDestroyed:`时间轴已销毁`,statusDragging:`正在拖拽:{title}`,statusAutoTrackAdded:`已自动新增轨道 {count}`,statusEventPlaced:`已放置:{title}({start} - {end})`,statusEventSelected:`已选中:{title}`,statusEventResizing:`正在调整大小:{start} - {end}`,statusEventResized:`已调整事件大小:{title}`,statusReadOnlyEditDeleteBlocked:`只读事件不能编辑或删除`,statusReadOnlySplitBlocked:`只读事件不能分割`,statusHoverEventTimeRange:`{title}({start} - {end})`,labelTrackName:`轨道 {index}`,labelDurationPrefix:`时长`,contextMenuEdit:`编辑`,contextMenuDelete:`删除`,contextMenuExport:`导出`,overlayPerformanceMonitor:`性能监视器`,overlayFps:`FPS:{value}`,overlayLayerTimesMs:`图层耗时(ms):`,overlayCollecting:`采集中...`,overlayLayerBackground:`背景`,overlayLayerTracks:`轨道`,overlayLayerTimeline:`时间轴`,overlayLayerGuideLines:`辅助线`,overlayLayerIndicator:`指示器`,overlayLayerScrollbar:`滚动条`,overlayLayerInteraction:`交互层`,overlayLayerOverlay:`叠加层`,overlayLayerDragPreview:`拖拽预览`,errorCanvasNotFound:`未找到 id 为 "{canvasId}" 的 canvas 元素`,errorCanvasContextUnavailable:`无法从 canvas 获取 2D 上下文`,errorTimeIndicatorInvalid:`时间指示器位置必须是数值(秒)`,errorZoomLevelInvalid:`缩放级别必须是有效数值`,errorZoomLevelOutOfRange:`缩放级别超出有效范围(1-1000)`,errorEndTimeInvalid:`结束时间必须是有效数值(秒)`,errorEndTimeNotAfterStart:`结束时间必须大于开始时间`,warningEventsExceedEndTime:`警告:部分事件超出了新的结束时间`,errorInvalidTrackIndex:`无效的轨道索引`,errorInvalidTrackIndexWithValue:`无效的轨道索引:{trackIndex}`,errorInvalidEventIndex:`无效的事件索引`,errorInvalidEventIndexWithValue:`无效的事件索引:{eventIndex}`,errorInvalidDataFormat:`无效的数据格式`,errorInvalidTimeRange:`无效的时间范围:startTime={startTime}, endTime={endTime}`,errorStartTimeBeforeMin:`开始时间不能进入左侧留白区域:startTime={startTime}, minAllowed={minAllowed}`,errorRenderLayer:`渲染图层 "{layer}" 时发生错误`,errorCoreLayerHook:`执行核心图层钩子 "{hook}" 时发生错误`,errorPluginDependenciesMissing:`插件依赖缺失:{pluginId}`,errorPluginLoadFailed:`插件加载失败:{pluginId}`,errorPluginLifecycleFailed:`插件 {step} 执行失败:{pluginId}`,errorPluginEventFailed:`插件事件处理失败:{event}`,errorPluginValidationFailed:`插件校验失败:{event}`,warningInvalidDraggingState:`拖拽状态无效`,warningDraggingEventMissing:`无法找到拖拽的事件,已放弃操作`,warningUnknownChangeType:`未知的变更类型:{change}`,warningAlreadyInBatchMode:`当前已处于批量模式`,warningNotInBatchMode:`当前不在批量模式中`,warningEmptyHtmlTemplateFallback:`htmlTemplate 为空,已回退到 Canvas 渲染`,warningEmptyTooltipTemplateFallback:`htmlTemplate 返回空内容,已回退到 Canvas 渲染`}};function u(e){return e&&e.toLowerCase().startsWith(`zh`)?`zh-CN`:`en`}function d(e=`en`,t={}){return{...l[u(e)],...t}}function f(e,t,n={}){return e[t].replace(/\{(\w+)\}/g,(e,t)=>t in n?String(n[t]):e)}function p(e,t,n={}){return f(e.messages||d(e.locale),t,n)}function m(e=`en`,t={}){let n=typeof e==`string`?d(e,t):e;return[{type:`edit`,name:n.contextMenuEdit},{type:`delete`,name:n.contextMenuDelete},{type:`export`,name:n.contextMenuExport}]}const h=d(`en`),g={canvasBackground:`#1E1E2E`,timelineBackground:`#2D2D3D`,trackBackground:`#2A2A3A`,trackBackgroundSelected:`#3A3A4A`,timelineText:`#CCCCDD`,timelineGrid:`#5A5A7A`,timelineSubGrid:`#3A3A4A`,trackText:`#CCCCDD`,eventColors:[`#FF6B6B`,`#4ECDC4`,`#45B7D1`,`#96CEB4`,`#FECA57`,`#FF9FF3`],eventText:`#FFFFFF`,eventBorder:`#FFFFFF`,eventBorderSelected:`#FFD700`,eventOverlay:`rgba(255, 255, 255, 0.2)`,dragPreviewValid:`rgba(100, 255, 100, 0.5)`,dragPreviewInvalid:`rgba(255, 100, 100, 0.5)`,dragPreviewBorderValid:`#00FF00`,dragPreviewBorderInvalid:`#FF0000`,timeIndicator:`#FF6B6B`,guideLine:`#00D9FF`,guideLineLabel:`#00D9FF`,dragTimeReferenceLine:`#FFD700`,dragTimeReferenceLabel:`#FFD700`,dragTimeReferenceLabelBackground:`rgba(0, 0, 0, 0)`,scrollbarTrack:`rgba(255, 255, 255, 0.6)`,scrollbarHandle:`rgba(150, 150, 150, 0.8)`,scrollbarHandleHover:`rgba(0, 0, 0, 0.85)`,scrollbarHandleHighlight:`rgba(255, 255, 255, 0.3)`,scrollbarBorder:`rgba(255, 255, 255, 0.9)`,contextMenuBackground:`#2D2D3D`,contextMenuBorder:`#5A5A7A`,contextMenuText:`#CCCCDD`,contextMenuHoverBackground:`#3A3A4A`,contextMenuHoverText:`#FFFFFF`,eventDurationLabel:`#FFD700`},_={titleFontSize:`auto`,timeFontSize:`auto`,titleFontFamily:`Arial`,timeFontFamily:`Arial`,titleFontWeight:`bold`,timeFontWeight:`normal`,titleColor:null,timeColor:null,textAlign:`left`,verticalAlign:`middle`,titleOffsetY:0,timeOffsetY:0,showTitle:!0,showTime:!0,minHeightForTitle:40,minHeightForTime:50},v={borderRadius:2,enableSelectionGlow:!1,selectionGlowBlur:10};m(h);const y={fontSize:14,fontFamily:`Arial, sans-serif`,fontWeight:`normal`,padding:8,itemHeight:32,borderRadius:6,borderWidth:1,minWidth:120},b={timelineHeight:40,trackHeight:80,trackMargin:10,firstTrackTopMargin:10,secondWidth:100/3600,startTime:0,endTime:86400,startPaddingTime:.5,endPaddingTime:0,autoFitOnInit:!0,minAutoFitZoom:1,maxAutoFitZoom:3,locale:`en`,messages:h,timeUnit:`second`,timeFormat:`24h`,snapInterval:15,snapToSeconds:!0,secondPrecisionZoomThreshold:1.5,timeIndicatorWidth:3,timeIndicatorSnapThreshold:10,timeIndicatorHeadSize:12,timeIndicatorTriangleHeight:8,edgeScrollThrottle:80,edgeScrollTriggerMargin:30,edgeScrollViewportMargin:50,guideLineSnapThreshold:1,enableTimeIndicator:!0,enableEventResize:!0,enableEventSplit:!0,enableContextMenu:!0,resizeHandleWidth:8,minEventDuration:.25,debug:!1,enablePerformanceMonitor:!1,autoAddTrack:!0,autoRemoveEmptyLastTrack:!0,readOnly:!1,showEventDurationLabel:!0,eventDurationPrefix:h.labelDurationPrefix,formatEventDuration:null,scale:null,scaleSplitCount:10,getScaleRender:null};function x(e){return typeof structuredClone==`function`?structuredClone(e):S(e)}function S(e){let t=Object.entries(e).map(([e,t])=>[e,w(t)]);return Object.fromEntries(t)}function C(e){return e.map(e=>w(e))}function w(e){return Array.isArray(e)?C(e):E(e)?S(e):e}function T(e){if(e.media)return{...e.media.images?{images:e.media.images.map(e=>({src:e.src,...e.fit?{fit:e.fit}:{},...e.opacity===void 0?{}:{opacity:e.opacity}}))}:{},...e.media.waveform?{waveform:{data:e.media.waveform.data,...e.media.waveform.color?{color:e.media.waveform.color}:{},...e.media.waveform.backgroundColor?{backgroundColor:e.media.waveform.backgroundColor}:{},...e.media.waveform.opacity===void 0?{}:{opacity:e.media.waveform.opacity}}}:{}}}function E(e){if(typeof e!=`object`||!e)return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function D(e){return{id:e.id,startTime:e.startTime,endTime:e.endTime,duration:e.duration,title:e.title,description:e.description,color:e.color,...e.readonly?{readonly:e.readonly}:{},...e.customData?{customData:x(e.customData)}:{},...e.media?{media:T(e)}:{}}}const O=new Map,k=new Map;function A(e,t,n,r){let i=O.get(e);if(i)return i;let a=new Path2D,o=r/2,s=Math.max(1,Math.floor((r-2)/2)),c=t.length,l=Math.max(1,n-1);for(let e=0;e<n;e++){let n=Math.min(c-1,Math.max(0,Math.floor(e/l*c))),r=Math.max(-1,Math.min(1,t[n]))*s;a.moveTo(e,o-r),a.lineTo(e,o+r)}return O.set(e,a),a}function j(e,t,n,r,i,a){let o=k.get(e);if(o&&o.width===n&&o.height===r)return o.bitmap;if(typeof OffscreenCanvas>`u`||n<=0||r<=0)return null;try{let o=Math.max(1,Math.ceil(n)),s=Math.max(1,Math.ceil(r)),c=new OffscreenCanvas(o,s),l=c.getContext(`2d`);if(!l)return null;a&&(l.fillStyle=a,l.fillRect(0,0,o,s));let u=A(`${e}_path`,t,o,s);l.strokeStyle=i,l.lineWidth=1,l.stroke(u);let d=c.transferToImageBitmap(),f=k.get(e);return f&&f.bitmap.close(),k.set(e,{bitmap:d,width:o,height:s}),d}catch(e){return console.debug(`[EventMediaPlugin] Failed to create waveform bitmap`,e),null}}function M(e,t){return e(t)}function N(e,t,n,r){let i=e.ids.get(t);if(i)return i;let a=`event_media_${e.nextId}_${n}_${r}`;return e.nextId+=1,e.ids.set(t,a),a}function P(){return{metadata:{name:`event-media`,version:`1.0.0`,description:`Render images and waveforms inside event blocks`,descriptionI18n:{"zh-CN":`在事件块内渲染图片和波形`},type:`render`},async activate(e){let t={ids:new WeakMap,nextId:0},n=new Map,r=new Map,i=new Map;e.api.setData(`eventMediaIdentityStore`,t),e.api.setData(`eventMediaImageCache`,n),e.api.setData(`eventMediaImageLoading`,r),e.api.setData(`eventMediaWaveCache`,i);let a=(t,n,r,i,a,o,c,l,u,d,f)=>{let p=M(e.api.getData,`eventMediaImageCache`),m=M(e.api.getData,`eventMediaImageLoading`),h=M(e.api.getData,`eventMediaWaveCache`),g=M(e.api.getData,`eventMediaIdentityStore`),_=i.tracks[a].events[o];if(!_.media||!g)return;let v=l+d,y=r.eventBlockStyle.borderRadius,b=N(g,_,a,o);t.save();try{y>0?(s(t,c,v,u,f,y),t.clip()):(t.beginPath(),t.rect(c,v,u,f),t.clip());let e=_.media.images||[];if(e.length>0&&p&&m)for(let n of e){let e=`${b}_${n.src}`,r=p.get(e);if(!r&&!m.get(e)){let t=fetch(n.src).then(e=>e.blob()).then(e=>createImageBitmap(e)).then(t=>(p.set(e,t),m.delete(e),t)).catch(t=>{console.debug(`[EventMediaPlugin] Failed to load event image`,t),m.delete(e)});m.set(e,t)}if(r=p.get(e),r){let e=n.fit||`cover`,i=n.opacity===void 0?.35:n.opacity,a=u,o=f;if(e!==`stretch`){let t=r.width,n=r.height,i=e===`cover`?Math.max(u/t,f/n):Math.min(u/t,f/n);a=Math.max(1,Math.floor(t*i)),o=Math.max(1,Math.floor(n*i))}let s=c+(u-a)/2,l=v+(f-o)/2,d=t.globalAlpha;t.globalAlpha=i,t.drawImage(r,0,0,r.width,r.height,s,l,a,o),t.globalAlpha=d}}let n=_.media.waveform;if(n){let e=`${b}_wf`,r=h?h.get(e):void 0;r||(r=Array.isArray(n.data)?new Float32Array(n.data):n.data,h&&h.set(e,r));let i=n.opacity===void 0?.5:n.opacity,a=t.globalAlpha;t.globalAlpha=i;let o=n.color||`#00A0FF`,s=Math.max(1,Math.ceil(u)),l=Math.max(1,Math.ceil(f)),d=j(`${e}_${s}_${l}_${o}_${n.backgroundColor||``}`,r,s,l,o,n.backgroundColor);if(d)t.drawImage(d,c,v,u,f);else{n.backgroundColor&&(t.fillStyle=n.backgroundColor,t.fillRect(c,v,u,f));let i=A(`${e}_${s}_${l}`,r,s,l);t.save(),t.translate(c,v),t.strokeStyle=o,t.lineWidth=1,t.stroke(i),t.restore()}t.globalAlpha=a}}finally{t.restore()}};e.api.registerEventHandler(`render:event:media`,a),e.api.setData(`eventMediaHandler`,a)},deactivate(e){let t=M(e.api.getData,`eventMediaHandler`);t&&e.api.unregisterEventHandler(`render:event:media`,t);let n=M(e.api.getData,`eventMediaImageCache`);n&&n.clear();let r=M(e.api.getData,`eventMediaImageLoading`);r&&r.clear();let i=M(e.api.getData,`eventMediaWaveCache`);i&&i.clear();for(let e of k.values())e.bitmap.close();k.clear(),O.clear()}}}export{e as _,y as a,n as b,m as c,p as d,f,o as g,i as h,b as i,d as l,c as m,D as n,v as o,s as p,g as r,_ as s,P as t,u,a as v,r as x,t as y};
@@ -1,4 +1,4 @@
1
- import { u as TimelinePlugin } from "./types-CHhzteRO.mjs";
1
+ import { d as TimelinePlugin } from "./types-Do4sfz9k.mjs";
2
2
 
3
3
  //#region src/plugins/builtin/EventMediaPlugin.d.ts
4
4
  declare function EventMediaPlugin(): TimelinePlugin;
@@ -1,4 +1,4 @@
1
- import { u as TimelinePlugin } from "./types-CHhzteRO.mjs";
1
+ import { d as TimelinePlugin } from "./types-Do4sfz9k.mjs";
2
2
 
3
3
  //#region src/plugins/builtin/EventTooltipPlugin.d.ts
4
4
  interface EventTooltipPluginOptions {
@@ -0,0 +1 @@
1
+ import{i as e}from"./Logger-BTKQPGDj.mjs";import"./types-NnKZYB1U.mjs";const t=e(`EventTooltipPlugin`);function n(e,t){return e(t)}function r(e={}){let{htmlTemplate:r,showDelay:i=300,maxWidth:a=300,padding:o=8,borderRadius:s=4,backgroundColor:c=`#333`,textColor:l=`#fff`,borderColor:u=`#555`,fontSize:d=12,fontFamily:f=`Arial, sans-serif`}=e,p={visible:!1,title:``,x:0,y:0,trackIndex:-1,eventIndex:-1},m=null,h=null;function g(e,t,n){return e.measureText(t).width>n}return{metadata:{name:`event-tooltip`,version:`1.0.0`,description:`Tooltip plugin for displaying full event title when text is truncated`,descriptionI18n:{"zh-CN":`当事件标题被截断时显示完整标题的提示插件`},type:`extension`},activate(e){let _=e.timeline.getCanvas(),v=!1,y=null,b=t=>{let n=_.getBoundingClientRect(),r=t.clientX-n.left,a=t.clientY-n.top,o=e.config,s=e.state,c=e.timeline.getEventAtPosition(r,a);if(c){let{trackIndex:t,eventIndex:n}=c,l=s.tracks[t]?.events[n];if(!l){S();return}if(h&&h.trackIndex===t&&h.eventIndex===n&&p.visible){p.x=r,p.y=a,e.timeline.draw();return}h={trackIndex:t,eventIndex:n},m&&=(clearTimeout(m),null);let u=l.duration*o.secondWidth*s.zoomLevel-20,d=_.getContext(`2d`);if(!d)return;let f=o.eventTextStyle,v=f.titleFontSize===`auto`?Math.max(10,Math.min(14,o.trackHeight*.175)):f.titleFontSize;d.font=`${f.titleFontWeight} ${v}px ${f.titleFontFamily}`,g(d,l.title,u)?m=setTimeout(()=>{p={visible:!0,title:l.title,x:r,y:a,trackIndex:t,eventIndex:n},e.timeline.draw()},i):S()}else S()},x=e=>{y=e,v||(v=!0,requestAnimationFrame(()=>{v=!1,y&&=(b(y),null)}))},S=()=>{m&&=(clearTimeout(m),null),h=null,p.visible&&(p.visible=!1,e.timeline.draw())},C=()=>{S()};_.addEventListener(`mousemove`,x),_.addEventListener(`mouseleave`,C),e.api.setData(`tooltipMouseMoveHandler`,x),e.api.setData(`tooltipMouseLeaveHandler`,C),e.api.registerRenderLayer({name:`event-tooltip-overlay`,position:`overlay`,render(i,m,h,g){if(!p.visible||!p.title){let t=n(e.api.getData,`tooltipContainer`)||null;t&&(t.style.display=`none`);return}let _=e.timeline.getCanvas().getBoundingClientRect(),v=p.x,y=p.y-10;i.save(),i.font=`${d}px ${f}`;let b=p.title.split(``),x=[],S=``;for(let e of b){let t=S+e;i.measureText(t).width>a-o*2?S?(x.push(S),S=e):x.push(e):S=t}S&&x.push(S);let C=0;for(let e of x){let t=i.measureText(e).width;C=Math.max(C,t)}C=Math.min(C+o*2,a);let w=d*1.4,T=x.length*w+o*2;if(y-=T,v+C>_.width&&(v=_.width-C-5),v<5&&(v=5),y<5&&(y=p.y+20),r){let m=r(p.title);if(!m||m.trim()===``)t.warn(e.timeline.t(`warningEmptyTooltipTemplateFallback`));else{let t=n(e.api.getData,`tooltipContainer`)||null;if(!t){t=document.createElement(`div`),t.style.position=`absolute`,t.style.zIndex=`1001`,t.style.pointerEvents=`none`,t.style.boxShadow=`0 2px 8px rgba(0,0,0,0.3)`,t.style.border=`1px solid ${u}`,t.style.borderRadius=`${s}px`,t.style.padding=`${o}px`,t.style.fontSize=`${d}px`,t.style.fontFamily=f,t.style.backgroundColor=c,t.style.color=l,t.style.maxWidth=`${a}px`,t.style.wordWrap=`break-word`,t.style.whiteSpace=`pre-wrap`;let n=e.timeline.getCanvas().parentElement||document.body;n.style.position=n.style.position||`relative`,n.appendChild(t),e.api.setData(`tooltipContainer`,t)}t.style.display=`block`,t.style.left=`${v}px`,t.style.top=`${y}px`,t.innerHTML=m,i.restore();return}}if(i.shadowColor=`rgba(0, 0, 0, 0.3)`,i.shadowBlur=8,i.shadowOffsetX=0,i.shadowOffsetY=2,i.fillStyle=c,i.beginPath(),i.roundRect)i.roundRect(v,y,C,T,s);else{let e=v,t=y,n=C,r=T,a=s;i.moveTo(e+a,t),i.lineTo(e+n-a,t),i.quadraticCurveTo(e+n,t,e+n,t+a),i.lineTo(e+n,t+r-a),i.quadraticCurveTo(e+n,t+r,e+n-a,t+r),i.lineTo(e+a,t+r),i.quadraticCurveTo(e,t+r,e,t+r-a),i.lineTo(e,t+a),i.quadraticCurveTo(e,t,e+a,t)}i.fill(),i.shadowColor=`transparent`,i.shadowBlur=0,i.strokeStyle=u,i.lineWidth=1,i.stroke(),i.fillStyle=l,i.font=`${d}px ${f}`,i.textAlign=`left`,i.textBaseline=`top`;for(let e=0;e<x.length;e++)i.fillText(x[e],v+o,y+o+e*w);i.restore()}})},deactivate(e){let t=e.timeline.getCanvas(),r=n(e.api.getData,`tooltipMouseMoveHandler`),i=n(e.api.getData,`tooltipMouseLeaveHandler`);r&&t.removeEventListener(`mousemove`,r),i&&t.removeEventListener(`mouseleave`,i),m&&=(clearTimeout(m),null),e.api.unregisterRenderLayer(`event-tooltip-overlay`);let a=n(e.api.getData,`tooltipContainer`)||null;a&&a.parentElement&&a.parentElement.removeChild(a)},destroy(e){let t=n(e.api.getData,`tooltipContainer`)||null;t&&t.parentElement&&t.parentElement.removeChild(t),m&&=(clearTimeout(m),null)}}}export{r as t};
@@ -0,0 +1 @@
1
+ import"./types-NnKZYB1U.mjs";const e={canvasBackground:`#FFFFFF`,timelineBackground:`#FFFFFF`,trackBackground:`#FFFFFF`,trackBackgroundSelected:`rgba(63, 118, 252, 0.1)`,trackBackgroundOdd:`#FFFFFF`,trackBackgroundEven:`#F9FAFD`,timelineText:`#969BA5`,timelineGrid:`#E5E5E5`,timelineSubGrid:`#fff`,trackText:`#CCCCDD`,eventColors:[`rgba(63, 118, 252, 0.16)`],eventText:`#FFFFFF`,eventBorder:`#FFFFFF`,eventBorderSelected:`#3F76FC`,eventOverlay:`rgba(63, 118, 252, 0.12)`,dragPreviewValid:`rgba(100, 255, 100, 0.5)`,dragPreviewInvalid:`rgba(255, 100, 100, 0.5)`,dragPreviewBorderValid:`#00FF00`,dragPreviewBorderInvalid:`#FF0000`,timeIndicator:`#3F76FC`,guideLine:`#00D9FF`,guideLineLabel:`#00D9FF`,dragTimeReferenceLine:`#FFD700`,dragTimeReferenceLabel:`#FFD700`,dragTimeReferenceLabelBackground:`rgba(0, 0, 0, 0)`,scrollbarTrack:`rgba(63, 118, 252, 0.08)`,scrollbarHandle:`rgba(63, 118, 252, 0.5)`,scrollbarHandleHover:`rgba(63, 118, 252, 0.8)`,scrollbarHandleHighlight:`rgba(63, 118, 252, 0.12)`,scrollbarBorder:`rgba(63, 118, 252, 0.6)`,contextMenuBackground:`#2D2D3D`,contextMenuBorder:`#5A5A7A`,contextMenuText:`#CCCCDD`,contextMenuHoverBackground:`#4a00e0`,contextMenuHoverText:`#FFFFFF`,eventDurationLabel:`#3F76FC`},t={metadata:{name:`theme-light`,version:`1.0.0`,description:`Light theme for timeline`,descriptionI18n:{"zh-CN":`时间轴亮色主题`},type:`theme`},activate(t){t.config.colors={...t.config.colors,...e},t.api.registerRenderLayer({name:`theme-light-background`,position:`background`,render(e,t,n){e.fillStyle=n.colors.canvasBackground,e.fillRect(0,0,t.width,t.height)}})},deactivate(e){e.api.unregisterRenderLayer(`theme-light-background`)}};export{t};
@@ -1,4 +1,4 @@
1
- import { u as TimelinePlugin } from "./types-CHhzteRO.mjs";
1
+ import { d as TimelinePlugin } from "./types-Do4sfz9k.mjs";
2
2
 
3
3
  //#region src/plugins/builtin/LightThemePlugin.d.ts
4
4
  declare const LightThemePlugin: TimelinePlugin;
@@ -1,4 +1,4 @@
1
- import { u as TimelinePlugin } from "./types-CHhzteRO.mjs";
1
+ import { d as TimelinePlugin } from "./types-Do4sfz9k.mjs";
2
2
 
3
3
  //#region src/plugins/builtin/PerformanceOverlayPlugin.d.ts
4
4
  declare const PerformanceOverlayPlugin: TimelinePlugin;
@@ -0,0 +1 @@
1
+ import{t as e}from"./performanceMonitor-Cb_v1gAo.mjs";import"./types-NnKZYB1U.mjs";const t={metadata:{name:`performance-overlay`,version:`1.0.0`,description:`Draw performance metrics overlay`,descriptionI18n:{"zh-CN":`绘制性能指标叠加层`},type:`tool`},activate(t){let n={background:`overlayLayerBackground`,tracks:`overlayLayerTracks`,timeline:`overlayLayerTimeline`,interaction:`overlayLayerInteraction`,guideLines:`overlayLayerGuideLines`,scrollbar:`overlayLayerScrollbar`,overlay:`overlayLayerOverlay`,dragPreview:`overlayLayerDragPreview`},r=new e(t.config.enablePerformanceMonitor||t.config.debug);t.api.setPerformanceProvider(r),t.api.setData(`perfMonitor`,r),t.api.setData(`perfOverlayPos`,{x:10,y:10}),t.api.setData(`perfOverlayDragging`,!1),t.api.setData(`perfOverlayOffset`,{x:0,y:0});let i=t.timeline.getCanvas(),a=e=>{let n=i.getBoundingClientRect(),r=e.clientX-n.left,a=e.clientY-n.top,o=t.api.getData(`perfOverlaySize`),s=t.api.getData(`perfOverlayPos`)||{x:10,y:10};o&&r>=s.x&&r<=s.x+o.width&&a>=s.y&&a<=s.y+o.height&&(t.api.setData(`perfOverlayDragging`,!0),t.api.setData(`perfOverlayOffset`,{x:r-s.x,y:a-s.y}),e.stopImmediatePropagation(),e.preventDefault())},o=e=>{if(!t.api.getData(`perfOverlayDragging`))return;let n=i.getBoundingClientRect(),r=e.clientX-n.left,a=e.clientY-n.top,o=t.api.getData(`perfOverlayOffset`)||{x:0,y:0},s=t.api.getData(`perfOverlaySize`)||{width:0,height:0},c=r-o.x,l=a-o.y;c=Math.max(0,Math.min(n.width-s.width,c)),l=Math.max(0,Math.min(n.height-s.height,l)),t.api.setData(`perfOverlayPos`,{x:c,y:l}),t.timeline.markDirty([`overlay`]),t.timeline.draw(),e.stopImmediatePropagation(),e.preventDefault()},s=e=>{t.api.getData(`perfOverlayDragging`)&&t.api.setData(`perfOverlayDragging`,!1)};i.addEventListener(`mousedown`,a,{capture:!0}),i.addEventListener(`mousemove`,o,{capture:!0}),window.addEventListener(`mouseup`,s,{capture:!0}),t.api.setData(`perfOverlayListeners`,{onMouseDown:a,onMouseMove:o,onMouseUp:s}),t.api.registerRenderLayer({name:`performance-overlay`,position:`overlay`,render(e){let r=t.api.getData(`perfMonitor`),i=!!(t.config.enablePerformanceMonitor||t.config.debug);if(r)if(i)r.enable();else{r.disable(),r.clear();return}else if(!i)return;let a=t.api.getPerformanceStats(),o=t.api.getFPS(),s=Array.from(a.entries()),c=[`background`,`tracks`,`timeline`,`interaction`,`guideLines`,`scrollbar`,`overlay`,`dragPreview`],l=t.timeline.getLastLayerTimes?t.timeline.getLastLayerTimes():void 0,u=l?c.filter(e=>l[e]!==void 0).length:0,d=l?1+u:0,f=25+(1+(a.size===0?1:s.length)+d)*20+30,p=t.api.getData(`perfOverlayPos`)||{x:10,y:10};t.api.setData(`perfOverlaySize`,{width:280,height:f}),e.fillStyle=`rgba(0, 0, 0, 0.8)`,e.fillRect(p.x,p.y,280,f),e.strokeStyle=`rgba(100, 255, 100, 0.6)`,e.lineWidth=2,e.strokeRect(p.x,p.y,280,f),e.fillStyle=`#00FF00`,e.font=`bold 16px monospace`,e.textAlign=`left`,e.fillText(t.timeline.t(`overlayPerformanceMonitor`),p.x+10,p.y+20);let m=p.y+20+25;if(e.fillStyle=o>=55?`#00FF00`:o>=30?`#FFFF00`:`#FF0000`,e.font=`bold 14px monospace`,e.fillText(t.timeline.t(`overlayFps`,{value:o.toFixed(1)}),p.x+10,m),e.font=`12px monospace`,m+=20,l){e.fillStyle=`#00FFFF`,e.font=`bold 12px monospace`,e.fillText(t.timeline.t(`overlayLayerTimesMs`),p.x+10,m),m+=20,e.font=`12px monospace`,e.fillStyle=`#FFFFFF`;for(let r of c)l[r]!==void 0&&(e.fillText(`${t.timeline.t(n[r]||`overlayLayerOverlay`)}: ${l[r].toFixed(2)}`,p.x+10,m),m+=20)}a.size===0?(e.fillStyle=`#FFFFFF`,e.fillText(t.timeline.t(`overlayCollecting`),p.x+10,m),m+=20):s.forEach(([t,n])=>{let r=`#00FF00`;n.average>16&&(r=`#FFFF00`),n.average>33&&(r=`#FF0000`),e.fillStyle=r;let i=`${t}: ${n.average.toFixed(2)}ms (${n.min.toFixed(1)}-${n.max.toFixed(1)})`;e.fillText(i,p.x+10,m),m+=20})}})},deactivate(e){e.api.unregisterRenderLayer(`performance-overlay`);let t=e.api.getData(`perfOverlayListeners`),n=e.timeline.getCanvas();t&&(n.removeEventListener(`mousedown`,t.onMouseDown,!0),n.removeEventListener(`mousemove`,t.onMouseMove,!0),window.removeEventListener(`mouseup`,t.onMouseUp,!0))}};export{t};
@@ -1,3 +1,2 @@
1
- import "../types-CHhzteRO.mjs";
2
- import { t as ContextMenuPlugin } from "../ContextMenuPlugin-DaM7qC-I.mjs";
1
+ import { t as ContextMenuPlugin } from "../ContextMenuPlugin-erWC3clR.mjs";
3
2
  export { ContextMenuPlugin };
@@ -1 +1 @@
1
- import{t as e}from"../ContextMenuPlugin-DDuNDVYG.mjs";export{e as ContextMenuPlugin};
1
+ import{t as e}from"../ContextMenuPlugin-DkjzERie.mjs";export{e as ContextMenuPlugin};
@@ -1,3 +1,2 @@
1
- import "../types-CHhzteRO.mjs";
2
- import { t as DarkThemePlugin } from "../DarkThemePlugin-CbU457K7.mjs";
1
+ import { t as DarkThemePlugin } from "../DarkThemePlugin-DSeernWS.mjs";
3
2
  export { DarkThemePlugin as DarkTheme, DarkThemePlugin };
@@ -1 +1 @@
1
- import{t as e}from"../DarkThemePlugin-g_jQnbr2.mjs";export{e as DarkTheme,e as DarkThemePlugin};
1
+ import{t as e}from"../DarkThemePlugin-oE6DVEib.mjs";export{e as DarkTheme,e as DarkThemePlugin};
@@ -1,3 +1,2 @@
1
- import "../types-CHhzteRO.mjs";
2
- import { t as EventMediaPlugin } from "../EventMediaPlugin-BfZm0W26.mjs";
1
+ import { t as EventMediaPlugin } from "../EventMediaPlugin-DpK2xquj.mjs";
3
2
  export { EventMediaPlugin };
@@ -1 +1 @@
1
- import{t as e}from"../EventMediaPlugin-C10NRApa.mjs";export{e as EventMediaPlugin};
1
+ import{t as e}from"../EventMediaPlugin-Co_Fr3CX.mjs";export{e as EventMediaPlugin};
@@ -1,3 +1,2 @@
1
- import "../types-CHhzteRO.mjs";
2
- import { t as EventTooltipPlugin } from "../EventTooltipPlugin-D2jEsna_.mjs";
1
+ import { t as EventTooltipPlugin } from "../EventTooltipPlugin-B2lXP9uu.mjs";
3
2
  export { EventTooltipPlugin };
@@ -1 +1 @@
1
- import{t as e}from"../EventTooltipPlugin-BGMlHyI2.mjs";export{e as EventTooltipPlugin};
1
+ import{t as e}from"../EventTooltipPlugin-mbadM95i.mjs";export{e as EventTooltipPlugin};
@@ -1,3 +1,2 @@
1
- import "../types-CHhzteRO.mjs";
2
- import { t as LightThemePlugin } from "../LightThemePlugin-DAbrMpAs.mjs";
1
+ import { t as LightThemePlugin } from "../LightThemePlugin-CXkW_Wpg.mjs";
3
2
  export { LightThemePlugin as LightTheme, LightThemePlugin };
@@ -1 +1 @@
1
- import{t as e}from"../LightThemePlugin-CCklHOHQ.mjs";export{e as LightTheme,e as LightThemePlugin};
1
+ import{t as e}from"../LightThemePlugin-BigH_oWz.mjs";export{e as LightTheme,e as LightThemePlugin};
@@ -1,4 +1,4 @@
1
- import { u as TimelinePlugin } from "../types-CHhzteRO.mjs";
1
+ import { d as TimelinePlugin } from "../types-Do4sfz9k.mjs";
2
2
 
3
3
  //#region src/plugins/builtin/MutexGuardPlugin.d.ts
4
4
  declare function MutexGuardPlugin(): TimelinePlugin;
@@ -1 +1 @@
1
- import{n as e}from"../types-Dc2ct_CM.mjs";function t(){return{metadata:{name:`MutexGuardPlugin`,version:`1.0.0`,description:`Disallow parallel existence of mutex-tagged events across tracks`,type:e.EXTENSION},activate(e){e.api.registerEventHandler(`validate:event:move`,t=>{let{fromTrackIndex:n,fromEventIndex:r,newStartTime:i,duration:a}=t,o=e.state,s=i+a,c=o.tracks[n]?.events[r];if(!c)return!0;let l=Array.isArray(c.customData?.mutex)?c.customData.mutex:[];if(l.length===0)return!0;for(let e=0;e<o.tracks.length;e++){let t=o.tracks[e];for(let a=0;a<t.events.length;a++){if(e===n&&a===r)continue;let o=t.events[a],c=Array.isArray(o.customData?.mutex)?o.customData.mutex:[];if(c.length!==0&&l.some(e=>c.includes(e))&&!(s<=o.startTime||i>=o.endTime))return!1}}return!0})}}}export{t as MutexGuardPlugin};
1
+ import"../types-NnKZYB1U.mjs";function e(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.fromTrackIndex==`number`&&typeof t.fromEventIndex==`number`&&typeof t.newStartTime==`number`&&typeof t.duration==`number`}function t(){function t(t,n){if(!e(t))return!0;let{fromTrackIndex:r,fromEventIndex:i,newStartTime:a,duration:o}=t,s=a+o,c=n.tracks[r]?.events[i];if(!c)return!0;let l=Array.isArray(c.customData?.mutex)?c.customData.mutex:[];if(l.length===0)return!0;for(let e=0;e<n.tracks.length;e++){let t=n.tracks[e];for(let n=0;n<t.events.length;n++){if(e===r&&n===i)continue;let o=t.events[n],c=Array.isArray(o.customData?.mutex)?o.customData.mutex:[];if(c.length!==0&&l.some(e=>c.includes(e))&&!(s<=o.startTime||a>=o.endTime))return!1}}return!0}let n;return{metadata:{name:`MutexGuardPlugin`,version:`1.0.0`,description:`Disallow parallel existence of mutex-tagged events across tracks`,descriptionI18n:{"zh-CN":`禁止带互斥标签的事件在不同轨道上并行存在`},type:`extension`},activate(e){n=n=>t(n,e.state),e.api.registerEventHandler(`validate:event:move`,n)},deactivate(e){n&&=(e.api.unregisterEventHandler(`validate:event:move`,n),void 0)}}}export{t as MutexGuardPlugin};
@@ -1,3 +1,2 @@
1
- import "../types-CHhzteRO.mjs";
2
- import { t as PerformanceOverlayPlugin } from "../PerformanceOverlayPlugin-B21vlKMn.mjs";
1
+ import { t as PerformanceOverlayPlugin } from "../PerformanceOverlayPlugin-CnfsbiMK.mjs";
3
2
  export { PerformanceOverlayPlugin };
@@ -1 +1 @@
1
- import{t as e}from"../PerformanceOverlayPlugin-CiGYUAlO.mjs";export{e as PerformanceOverlayPlugin};
1
+ import{t as e}from"../PerformanceOverlayPlugin-o5al1GSm.mjs";export{e as PerformanceOverlayPlugin};
package/dist/index.d.mts CHANGED
@@ -1,13 +1,12 @@
1
- import { A as TimelineOptions, C as InteractionTarget, D as TimelineColors, E as TimelineCallbacks, M as Track, N as ZoomData, O as TimelineConfig, S as EventUpdateData, T as TimeIndicatorMoveData, _ as EventClickData, a as PluginMetadata, b as EventMoveData, c as RenderLayer, d as Timeline, f as ChangeType, g as EventAddData, h as ContextMenuStyle, i as PluginContext, j as TimelineState, k as TimelineEvent, l as RenderLayerPosition, m as ContextMenuItem, n as CoreRenderTarget, o as PluginPriority, p as ContextMenuData, r as PluginAPI, s as PluginType, t as CoreLayerHook, u as TimelinePlugin, v as EventDeleteData, w as LoadDataFormat, x as EventTextStyle, y as EventEditData } from "./types-CHhzteRO.mjs";
2
- import { t as ContextMenuPlugin } from "./ContextMenuPlugin-DaM7qC-I.mjs";
3
- import { t as DarkThemePlugin } from "./DarkThemePlugin-CbU457K7.mjs";
4
- import { t as EventMediaPlugin } from "./EventMediaPlugin-BfZm0W26.mjs";
5
- import { t as EventTooltipPlugin } from "./EventTooltipPlugin-D2jEsna_.mjs";
6
- import { t as LightThemePlugin } from "./LightThemePlugin-DAbrMpAs.mjs";
7
- import { t as PerformanceOverlayPlugin } from "./PerformanceOverlayPlugin-B21vlKMn.mjs";
1
+ import { A as EventMoveData, B as TimelineI18nMessages, C as ContextMenuData, D as EventClickData, E as EventAddData, F as TimeIndicatorMoveData, G as Track, H as TimelineMessageParams, I as TimelineCallbacks, K as ZoomData, L as TimelineColors, M as EventUpdateData, N as InteractionTarget, O as EventDeleteData, P as LoadDataFormat, R as TimelineConfig, S as getCurrentTime, T as ContextMenuStyle, U as TimelineOptions, V as TimelineLocale, W as TimelineState, _ as translateTimelineConfig, a as PluginLocalizedText, b as formatTime, c as PluginType, d as TimelinePlugin, f as Timeline, g as normalizeTimelineLocale, h as createTimelineMessages, i as PluginContext, j as EventTextStyle, k as EventEditData, l as RenderLayer, m as createDefaultContextMenuItems, n as CoreRenderTarget, o as PluginMetadata, p as ChangeType, r as PluginAPI, s as PluginPriority, t as CoreLayerHook, u as RenderLayerPosition, v as translateTimelineMessage, w as ContextMenuItem, x as formatTimeRange, y as formatDuration, z as TimelineEvent } from "./types-Do4sfz9k.mjs";
2
+ import { t as ContextMenuPlugin } from "./ContextMenuPlugin-erWC3clR.mjs";
3
+ import { t as DarkThemePlugin } from "./DarkThemePlugin-DSeernWS.mjs";
4
+ import { t as EventMediaPlugin } from "./EventMediaPlugin-DpK2xquj.mjs";
5
+ import { t as EventTooltipPlugin } from "./EventTooltipPlugin-B2lXP9uu.mjs";
6
+ import { t as LightThemePlugin } from "./LightThemePlugin-CXkW_Wpg.mjs";
7
+ import { t as PerformanceOverlayPlugin } from "./PerformanceOverlayPlugin-CnfsbiMK.mjs";
8
8
 
9
- //#region src/utils/time.d.ts
10
- declare function formatTime(seconds: number, showSeconds?: boolean): string;
11
- declare function getCurrentTime(): number;
9
+ //#region src/plugins/metadata.d.ts
10
+ declare function getPluginMetadataDescription(metadata: PluginMetadata, locale?: string): string;
12
11
  //#endregion
13
- export { type ChangeType, type ContextMenuData, type ContextMenuItem, ContextMenuPlugin, type ContextMenuStyle, type CoreLayerHook, type CoreRenderTarget, DarkThemePlugin, type EventAddData, type EventClickData, type EventDeleteData, type EventEditData, EventMediaPlugin, type EventMoveData, type EventTextStyle, EventTooltipPlugin, type EventUpdateData, type InteractionTarget, LightThemePlugin, type LoadDataFormat, PerformanceOverlayPlugin, type PluginAPI, type PluginContext, type PluginMetadata, PluginPriority, PluginType, type RenderLayer, type RenderLayerPosition, type TimeIndicatorMoveData, Timeline, type TimelineCallbacks, type TimelineColors, type TimelineConfig, type TimelineEvent, type TimelineOptions, type TimelinePlugin, type TimelineState, type Track, type ZoomData, formatTime, getCurrentTime };
12
+ export { type ChangeType, type ContextMenuData, type ContextMenuItem, ContextMenuPlugin, type ContextMenuStyle, type CoreLayerHook, type CoreRenderTarget, DarkThemePlugin, type EventAddData, type EventClickData, type EventDeleteData, type EventEditData, EventMediaPlugin, type EventMoveData, type EventTextStyle, EventTooltipPlugin, type EventUpdateData, type InteractionTarget, LightThemePlugin, type LoadDataFormat, PerformanceOverlayPlugin, type PluginAPI, type PluginContext, type PluginLocalizedText, type PluginMetadata, PluginPriority, PluginType, type RenderLayer, type RenderLayerPosition, type TimeIndicatorMoveData, Timeline, type TimelineCallbacks, type TimelineColors, type TimelineConfig, type TimelineEvent, type TimelineI18nMessages, type TimelineLocale, type TimelineMessageParams, type TimelineOptions, type TimelinePlugin, type TimelineState, type Track, type ZoomData, createDefaultContextMenuItems, createTimelineMessages, formatDuration, formatTime, formatTimeRange, getCurrentTime, getPluginMetadataDescription, normalizeTimelineLocale, translateTimelineConfig, translateTimelineMessage };