timeline-canvas 1.0.9

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 (35) hide show
  1. package/README.md +162 -0
  2. package/README_CN.md +164 -0
  3. package/dist/ContextMenuPlugin-B9TmnnaU.mjs +1 -0
  4. package/dist/ContextMenuPlugin-Crk3ma0O.d.mts +10 -0
  5. package/dist/DarkThemePlugin-CRFdrOR3.mjs +1 -0
  6. package/dist/DarkThemePlugin-IbJNx65n.d.mts +6 -0
  7. package/dist/EventMediaPlugin-DPPdLbey.mjs +1 -0
  8. package/dist/EventMediaPlugin-daiUXxsT.d.mts +6 -0
  9. package/dist/EventTooltipPlugin-Ce6xChyf.mjs +1 -0
  10. package/dist/EventTooltipPlugin-b5fqBb8j.d.mts +28 -0
  11. package/dist/LightThemePlugin-BOreTGti.mjs +1 -0
  12. package/dist/LightThemePlugin-DrdhIHgA.d.mts +6 -0
  13. package/dist/Logger-Bwd6lZLT.mjs +1 -0
  14. package/dist/PerformanceOverlayPlugin-BFU4Le2k.d.mts +6 -0
  15. package/dist/PerformanceOverlayPlugin-Bx-DkYbW.mjs +1 -0
  16. package/dist/builtin-plugin/ContextMenuPlugin.d.mts +3 -0
  17. package/dist/builtin-plugin/ContextMenuPlugin.mjs +1 -0
  18. package/dist/builtin-plugin/DarkThemePlugin.d.mts +3 -0
  19. package/dist/builtin-plugin/DarkThemePlugin.mjs +1 -0
  20. package/dist/builtin-plugin/EventMediaPlugin.d.mts +3 -0
  21. package/dist/builtin-plugin/EventMediaPlugin.mjs +1 -0
  22. package/dist/builtin-plugin/EventTooltipPlugin.d.mts +3 -0
  23. package/dist/builtin-plugin/EventTooltipPlugin.mjs +1 -0
  24. package/dist/builtin-plugin/LightThemePlugin.d.mts +3 -0
  25. package/dist/builtin-plugin/LightThemePlugin.mjs +1 -0
  26. package/dist/builtin-plugin/MutexGuardPlugin.d.mts +6 -0
  27. package/dist/builtin-plugin/MutexGuardPlugin.mjs +1 -0
  28. package/dist/builtin-plugin/PerformanceOverlayPlugin.d.mts +3 -0
  29. package/dist/builtin-plugin/PerformanceOverlayPlugin.mjs +1 -0
  30. package/dist/index.d.mts +13 -0
  31. package/dist/index.mjs +1 -0
  32. package/dist/performanceMonitor-Cf-Ah4F7.mjs +1 -0
  33. package/dist/types-CkHQNcJ5.mjs +1 -0
  34. package/dist/types-D5-4YwEP.d.mts +600 -0
  35. package/package.json +51 -0
@@ -0,0 +1,600 @@
1
+ //#region src/types/index.d.ts
2
+ interface TimelineColors {
3
+ canvasBackground: string;
4
+ timelineBackground: string;
5
+ trackBackground: string;
6
+ trackBackgroundSelected: string;
7
+ trackBackgroundOdd?: string;
8
+ trackBackgroundEven?: string;
9
+ timelineText: string;
10
+ timelineGrid: string;
11
+ timelineSubGrid: string;
12
+ trackText: string;
13
+ eventColors: string[];
14
+ eventText: string;
15
+ eventBorder: string;
16
+ eventBorderSelected: string;
17
+ eventOverlay: string;
18
+ dragPreviewValid: string;
19
+ dragPreviewInvalid: string;
20
+ dragPreviewBorderValid: string;
21
+ dragPreviewBorderInvalid: string;
22
+ timeIndicator: string;
23
+ guideLine: string;
24
+ guideLineLabel: string;
25
+ dragTimeReferenceLine: string;
26
+ dragTimeReferenceLabel: string;
27
+ dragTimeReferenceLabelBackground: string;
28
+ scrollbarTrack: string;
29
+ scrollbarHandle: string;
30
+ scrollbarHandleHover: string;
31
+ scrollbarHandleHighlight: string;
32
+ scrollbarBorder: string;
33
+ contextMenuBackground: string;
34
+ contextMenuBorder: string;
35
+ contextMenuText: string;
36
+ contextMenuHoverBackground: string;
37
+ contextMenuHoverText: string;
38
+ eventDurationLabel: string;
39
+ }
40
+ interface EventTextStyle {
41
+ titleFontSize: number | "auto";
42
+ timeFontSize: number | "auto";
43
+ titleFontFamily: string;
44
+ timeFontFamily: string;
45
+ titleFontWeight: string;
46
+ timeFontWeight: string;
47
+ titleColor: string | null;
48
+ timeColor: string | null;
49
+ textAlign: "left" | "center" | "right";
50
+ verticalAlign: "top" | "middle" | "bottom";
51
+ titleOffsetY: number;
52
+ timeOffsetY: number;
53
+ showTitle: boolean;
54
+ showTime: boolean;
55
+ minHeightForTitle: number;
56
+ minHeightForTime: number;
57
+ }
58
+ interface EventBlockStyle {
59
+ borderRadius: number;
60
+ enableSelectionGlow: boolean;
61
+ selectionGlowBlur: number;
62
+ }
63
+ interface ContextMenuItem {
64
+ type: string;
65
+ name: string;
66
+ }
67
+ interface ContextMenuStyle {
68
+ fontSize: number;
69
+ fontFamily: string;
70
+ fontWeight: string;
71
+ padding: number;
72
+ itemHeight: number;
73
+ borderRadius: number;
74
+ borderWidth: number;
75
+ minWidth: number;
76
+ }
77
+ interface TimelineConfig {
78
+ canvasHeight?: number;
79
+ timelineHeight: number;
80
+ trackHeight: number;
81
+ trackMargin: number;
82
+ firstTrackTopMargin: number;
83
+ secondWidth: number;
84
+ startTime: number;
85
+ endTime: number;
86
+ startPaddingTime: number;
87
+ endPaddingTime: number;
88
+ autoFitOnInit: boolean;
89
+ minAutoFitZoom: number;
90
+ maxAutoFitZoom: number;
91
+ timeUnit: string;
92
+ timeFormat: string;
93
+ snapInterval: number;
94
+ snapToSeconds: boolean;
95
+ secondPrecisionZoomThreshold: number;
96
+ timeIndicatorWidth: number;
97
+ timeIndicatorSnapThreshold: number;
98
+ timeIndicatorHeadSize: number;
99
+ timeIndicatorTriangleHeight: number;
100
+ guideLineSnapThreshold: number;
101
+ enableTimeIndicator: boolean;
102
+ enableEventResize: boolean;
103
+ enableEventSplit: boolean;
104
+ enableContextMenu: boolean;
105
+ resizeHandleWidth: number;
106
+ minEventDuration: number;
107
+ debug: boolean;
108
+ enablePerformanceMonitor: boolean;
109
+ autoAddTrack: boolean;
110
+ autoRemoveEmptyLastTrack: boolean;
111
+ readOnly: boolean;
112
+ showEventDurationLabel: boolean;
113
+ formatEventDuration: ((duration: number) => string) | null;
114
+ eventTextStyle: EventTextStyle;
115
+ eventBlockStyle: EventBlockStyle;
116
+ colors: TimelineColors;
117
+ contextMenuItems: ContextMenuItem[];
118
+ contextMenuStyle: ContextMenuStyle;
119
+ contextMenuHtml?: string | HTMLElement;
120
+ }
121
+ interface TimelineCallbacks {
122
+ onEventAdd?: ((data: EventAddData) => void) | null;
123
+ onEventUpdate?: ((data: EventUpdateData) => void) | null;
124
+ onEventDelete?: ((data: EventDeleteData) => void) | null;
125
+ onEventMove?: ((data: EventMoveData) => void) | null;
126
+ onEventClick?: ((data: EventClickData) => void) | null;
127
+ onEventEdit?: ((data: EventEditData) => void) | null;
128
+ onContextMenu?: ((data: ContextMenuData) => void) | null;
129
+ onTrackAdd?: ((track: Track) => void) | null;
130
+ onTrackRemove?: ((track: Track) => void) | null;
131
+ onTimeIndicatorMove?: ((data: TimeIndicatorMoveData) => void) | null;
132
+ onZoom?: ((data: ZoomData) => void) | null;
133
+ onStatusChange?: ((statusText: string) => void) | null;
134
+ onEventHighlight?: ((data: EventHighlightData) => void) | null;
135
+ onTimeIndicatorHighlight?: ((data: TimeIndicatorHighlightData) => void) | null;
136
+ }
137
+ interface TimelineEvent {
138
+ id: number;
139
+ startTime: number;
140
+ endTime: number;
141
+ duration: number;
142
+ title: string;
143
+ description: string;
144
+ color: string;
145
+ readonly?: boolean;
146
+ customData?: Record<string, any>;
147
+ media?: {
148
+ images?: Array<{
149
+ src: string;
150
+ fit?: "cover" | "contain" | "stretch";
151
+ opacity?: number;
152
+ }>;
153
+ waveform?: {
154
+ data: Float32Array | number[];
155
+ color?: string;
156
+ backgroundColor?: string;
157
+ opacity?: number;
158
+ };
159
+ };
160
+ }
161
+ interface Track {
162
+ id: number;
163
+ events: TimelineEvent[];
164
+ }
165
+ interface SelectedEvent {
166
+ trackIndex: number;
167
+ eventIndex: number;
168
+ }
169
+ interface DraggingEvent {
170
+ trackIndex: number;
171
+ eventIndex: number;
172
+ eventX: number;
173
+ eventY: number;
174
+ originalTrackIndex: number;
175
+ originalEventIndex: number;
176
+ originalStartTime: number;
177
+ startX: number;
178
+ startY: number;
179
+ isDragging: boolean;
180
+ currentMouseX?: number;
181
+ currentMouseY?: number;
182
+ canMove?: boolean;
183
+ }
184
+ interface ResizingEvent {
185
+ trackIndex: number;
186
+ eventIndex: number;
187
+ edge: "left" | "right";
188
+ startX: number;
189
+ originalStartTime: number;
190
+ originalDuration: number;
191
+ }
192
+ interface GuideLine {
193
+ time: number;
194
+ type: "start" | "end";
195
+ trackIndices: number[];
196
+ }
197
+ interface HoveredResizeHandle {
198
+ trackIndex: number;
199
+ eventIndex: number;
200
+ edge: "left" | "right";
201
+ }
202
+ interface HoveredSplitLine {
203
+ trackIndex: number;
204
+ eventIndex: number;
205
+ splitTime: number;
206
+ }
207
+ interface ContextMenuEvent {
208
+ trackIndex: number;
209
+ eventIndex: number;
210
+ }
211
+ interface ContextMenuData {
212
+ menuType: string;
213
+ trackIndex: number;
214
+ eventIndex: number;
215
+ event: TimelineEvent;
216
+ }
217
+ interface TimelineState {
218
+ tracks: Track[];
219
+ selectedTrack: number | null;
220
+ selectedEvent: SelectedEvent | null;
221
+ highlightedEvent: SelectedEvent | null;
222
+ draggingEvent: DraggingEvent | null;
223
+ dragOffsetX: number;
224
+ dragOffsetY: number;
225
+ resizingEvent: ResizingEvent | null;
226
+ draggingTimeIndicator: boolean;
227
+ timeIndicatorDragOffsetX: number;
228
+ draggingScrollbar: boolean;
229
+ scrollbarDragOffset: number;
230
+ draggingHorizontalScrollbar: boolean;
231
+ horizontalScrollbarDragOffset: number;
232
+ zoomLevel: number;
233
+ scrollX: number;
234
+ scrollY: number;
235
+ snapEnabled: boolean;
236
+ timeIndicatorSnapEnabled: boolean;
237
+ contextMenuEvent: ContextMenuEvent | null;
238
+ contextMenuVisible: boolean;
239
+ contextMenuX: number;
240
+ contextMenuY: number;
241
+ hoveredContextMenuItem: number;
242
+ timeIndicatorPosition: number;
243
+ timeIndicatorHighlightedEvents: SelectedEvent[];
244
+ isManualSelection: boolean;
245
+ guideLines: GuideLine[];
246
+ dragTimeReference: {
247
+ time: number;
248
+ y: number;
249
+ } | null;
250
+ hoveredResizeHandle: HoveredResizeHandle | null;
251
+ lastClickTime: number;
252
+ lastClickEvent: SelectedEvent | null;
253
+ hoveredSplitLine: HoveredSplitLine | null;
254
+ statusText: string;
255
+ contextMenuBounds: {
256
+ x: number;
257
+ y: number;
258
+ width: number;
259
+ height: number;
260
+ itemHeight: number;
261
+ padding: number;
262
+ } | null;
263
+ lastDrawTime: number;
264
+ }
265
+ interface EventAddData {
266
+ trackIndex: number;
267
+ event: TimelineEvent;
268
+ }
269
+ interface EventEditData {
270
+ trackIndex: number;
271
+ eventIndex: number;
272
+ event: TimelineEvent;
273
+ trackName: string;
274
+ formattedTimeRange: string;
275
+ }
276
+ interface EventUpdateData {
277
+ type?: "resize" | "split";
278
+ trackIndex: number;
279
+ eventIndex: number;
280
+ event: TimelineEvent;
281
+ oldEvent?: TimelineEvent;
282
+ firstEvent?: TimelineEvent;
283
+ secondEvent?: TimelineEvent;
284
+ }
285
+ interface EventDeleteData {
286
+ trackIndex: number;
287
+ eventIndex: number;
288
+ event: TimelineEvent;
289
+ }
290
+ interface EventMoveData {
291
+ trackIndex: number;
292
+ eventIndex: number;
293
+ event: TimelineEvent;
294
+ fromTrackIndex: number;
295
+ }
296
+ interface EventClickData {
297
+ trackIndex: number;
298
+ eventIndex: number;
299
+ event: TimelineEvent;
300
+ trackName: string;
301
+ formattedTimeRange: string;
302
+ }
303
+ interface TimeIndicatorMoveData {
304
+ position: number;
305
+ time: string;
306
+ }
307
+ interface ZoomData {
308
+ zoomLevel: number;
309
+ percentage: number;
310
+ }
311
+ interface EventHighlightData {
312
+ trackIndex: number | null;
313
+ eventIndex: number | null;
314
+ event: TimelineEvent | null;
315
+ }
316
+ interface TimeIndicatorHighlightData {
317
+ position: number;
318
+ highlightedEvents: Array<{
319
+ trackIndex: number;
320
+ eventIndex: number;
321
+ event: TimelineEvent;
322
+ }>;
323
+ }
324
+ interface LoadDataFormat {
325
+ timeIndicatorPosition?: number;
326
+ tracks: Array<{
327
+ events: Array<{
328
+ startTime?: number;
329
+ endTime?: number;
330
+ duration?: number;
331
+ title: string;
332
+ description?: string;
333
+ color?: string;
334
+ readonly?: boolean;
335
+ customData?: Record<string, any>;
336
+ media?: {
337
+ images?: Array<{
338
+ src: string;
339
+ fit?: "cover" | "contain" | "stretch";
340
+ opacity?: number;
341
+ }>;
342
+ waveform?: {
343
+ data: Float32Array | number[];
344
+ color?: string;
345
+ backgroundColor?: string;
346
+ opacity?: number;
347
+ };
348
+ };
349
+ }>;
350
+ }>;
351
+ }
352
+ interface TimelineOptions {
353
+ canvasHeight?: number;
354
+ startTime?: number;
355
+ endTime?: number;
356
+ startPaddingTime?: number;
357
+ endPaddingTime?: number;
358
+ secondWidth?: number;
359
+ autoFitOnInit?: boolean;
360
+ minAutoFitZoom?: number;
361
+ maxAutoFitZoom?: number;
362
+ trackHeight?: number;
363
+ trackMargin?: number;
364
+ firstTrackTopMargin?: number;
365
+ timelineHeight?: number;
366
+ snapInterval?: number;
367
+ snapToSeconds?: boolean;
368
+ secondPrecisionZoomThreshold?: number;
369
+ enableTimeIndicator?: boolean;
370
+ enableEventResize?: boolean;
371
+ enableEventSplit?: boolean;
372
+ enableContextMenu?: boolean;
373
+ minEventDuration?: number;
374
+ resizeHandleWidth?: number;
375
+ debug?: boolean;
376
+ enablePerformanceMonitor?: boolean;
377
+ autoAddTrack?: boolean;
378
+ autoRemoveEmptyLastTrack?: boolean;
379
+ readOnly?: boolean;
380
+ showEventDurationLabel?: boolean;
381
+ formatEventDuration?: (duration: number) => string;
382
+ eventTextStyle?: Partial<EventTextStyle>;
383
+ eventBlockStyle?: Partial<EventBlockStyle>;
384
+ colors?: Partial<TimelineColors>;
385
+ contextMenuItems?: ContextMenuItem[];
386
+ contextMenuStyle?: Partial<ContextMenuStyle>;
387
+ contextMenuHtml?: string | HTMLElement;
388
+ theme?: TimelinePlugin;
389
+ onEventAdd?: (data: EventAddData) => void;
390
+ onEventUpdate?: (data: EventUpdateData) => void;
391
+ onEventDelete?: (data: EventDeleteData) => void;
392
+ onEventMove?: (data: EventMoveData) => void;
393
+ onEventClick?: (data: EventClickData) => void;
394
+ onEventEdit?: (data: EventEditData) => void;
395
+ onContextMenu?: (data: ContextMenuData) => void;
396
+ onTrackAdd?: (track: Track) => void;
397
+ onTrackRemove?: (track: Track) => void;
398
+ onTimeIndicatorMove?: (data: TimeIndicatorMoveData) => void;
399
+ onZoom?: (data: ZoomData) => void;
400
+ onStatusChange?: (statusText: string) => void;
401
+ onEventHighlight?: (data: EventHighlightData) => void;
402
+ onTimeIndicatorHighlight?: (data: TimeIndicatorHighlightData) => void;
403
+ }
404
+ declare global {
405
+ interface CanvasRenderingContext2D {
406
+ roundRect?: (x: number, y: number, w: number, h: number, radii: number | [number, number, number, number]) => void;
407
+ }
408
+ }
409
+ //#endregion
410
+ //#region src/core/managers/ChangeScheduler.d.ts
411
+ /**
412
+ * 状态变更类型
413
+ */
414
+ type ChangeType = "events:add" | "events:update" | "events:delete" | "events:move" | "events:split" | "tracks:add" | "tracks:remove" | "timeIndicator:move" | "timeIndicator:drag" | "scroll:x" | "scroll:y" | "zoom:change" | "selection:change" | "highlight:change" | "canvas:resize" | "data:load" | "theme:change" | "interaction:hover" | "interaction:contextMenu" | "interaction:splitLine" | "config:endTime" | "config:readOnly";
415
+ //#endregion
416
+ //#region src/core/Timeline.d.ts
417
+ declare class Timeline {
418
+ private canvas;
419
+ private ctx;
420
+ config: TimelineConfig;
421
+ callbacks: TimelineCallbacks;
422
+ state: TimelineState;
423
+ private mouseHandler;
424
+ private wheelHandler;
425
+ private renderManager;
426
+ private guideLinesCache;
427
+ private guideLinesCacheTimestamp;
428
+ private readonly GUIDE_LINES_CACHE_TTL;
429
+ private eventListeners;
430
+ private pluginManager;
431
+ private logger;
432
+ private errorHandler;
433
+ private stateManager;
434
+ private eventIndexManager;
435
+ private changeScheduler;
436
+ private currentThemePluginId;
437
+ constructor(canvasId: string, options?: TimelineOptions);
438
+ getCanvas(): HTMLCanvasElement;
439
+ usePlugin(plugin: any): Promise<boolean>;
440
+ getLoadedPlugins(): any[];
441
+ isPluginLoaded(pluginName: string): boolean;
442
+ removePlugin(pluginId: string): Promise<boolean>;
443
+ setTheme(theme: "light" | "dark"): Promise<boolean>;
444
+ private switchTheme;
445
+ private init;
446
+ getContentWidthForZoom(zoomLevel: number): number;
447
+ hasHorizontalScrollbar(): boolean;
448
+ getAvailableHeight(): number;
449
+ /**
450
+ * 通知状态变更,由调度器自动处理脏层标记、派生状态计算和回调触发
451
+ */
452
+ notifyChange(change: ChangeType): void;
453
+ /**
454
+ * 开始批量变更操作
455
+ */
456
+ beginChangeBatch(): void;
457
+ /**
458
+ * 结束批量变更操作
459
+ */
460
+ endChangeBatch(): void;
461
+ markDirty(layers: Array<"background" | "tracks" | "timeline" | "guideLines" | "indicator" | "scrollbar" | "overlay" | "interaction">): void;
462
+ getLastLayerTimes(): Record<string, number>;
463
+ beginIndexBatch(): void;
464
+ endIndexBatch(): void;
465
+ invalidateIndexTrack(trackIndex: number): void;
466
+ invalidateIndexAll(): void;
467
+ private autoFitZoomToCanvas;
468
+ private setupEventListeners;
469
+ private setInitialCanvasSize;
470
+ setCanvasSize(width: number, height: number): void;
471
+ getCanvasLogicalHeight(): number;
472
+ getCachedLogicalHeight(): number;
473
+ adjustCanvasSize(): void;
474
+ addTrack(): void;
475
+ removeTrack(): void;
476
+ autoRemoveEmptyLastTrack(): void;
477
+ private validateEventTime;
478
+ addEvent(trackIndex: number, startTime: number, endTime: number, title: string, description?: string, customData?: Record<string, any>, readonly?: boolean): void;
479
+ updateEvent(trackIndex: number, eventIndex: number, updates: Partial<TimelineEvent>): boolean;
480
+ updateEventData(trackIndex: number, eventIndex: number, eventData: {
481
+ title?: string;
482
+ startTime?: number;
483
+ duration?: number;
484
+ description?: string;
485
+ }): boolean;
486
+ deleteEvent(trackIndex: number, eventIndex: number): boolean;
487
+ loadData(data: LoadDataFormat): boolean;
488
+ setTimeIndicator(seconds: number, applySnap?: boolean): boolean;
489
+ private scrollToTimeIndicator;
490
+ zoom(factor: number): void;
491
+ setZoomLevel(zoomLevel: number): boolean;
492
+ getZoomLevel(): number;
493
+ setEndTime(endTime: number): boolean;
494
+ getEndTime(): number;
495
+ formatTime(seconds: number): string;
496
+ setStatus(text: string): void;
497
+ getStatus(): string;
498
+ getEventAtPosition(x: number, y: number): {
499
+ trackIndex: number;
500
+ eventIndex: number;
501
+ } | null;
502
+ getResizeHandle(x: number, y: number): {
503
+ trackIndex: number;
504
+ eventIndex: number;
505
+ edge: "left" | "right";
506
+ } | null;
507
+ calculateGuideLines(fromTrackIndex: number, eventIndex: number, toTrackIndex: number, newStartTime: number, duration: number): Array<{
508
+ time: number;
509
+ type: "start" | "end";
510
+ trackIndices: number[];
511
+ }>;
512
+ snapToGuideLines(newStartTime: number, duration: number): number | null;
513
+ canMoveEvent(fromTrackIndex: number, fromEventIndex: number, toTrackIndex: number, newStartTime: number, duration: number): boolean;
514
+ showSplitLine(trackIndex: number, eventIndex: number, splitTime: number): void;
515
+ hideSplitLine(): void;
516
+ splitEvent(trackIndex: number, eventIndex: number, splitTime: number): boolean;
517
+ draw(): void;
518
+ setReadOnly(readOnly: boolean): void;
519
+ highlightEvent(trackIndex: number, eventIndex: number): boolean;
520
+ clearHighlight(): void;
521
+ getHighlightedEvent(): {
522
+ trackIndex: number;
523
+ eventIndex: number;
524
+ } | null;
525
+ isReadOnly(): boolean;
526
+ destroy(): void;
527
+ }
528
+ //#endregion
529
+ //#region src/utils/performanceMonitor.d.ts
530
+ interface PerformanceStats {
531
+ average: number;
532
+ min: number;
533
+ max: number;
534
+ count: number;
535
+ total: number;
536
+ }
537
+ //#endregion
538
+ //#region src/plugins/types.d.ts
539
+ declare enum PluginType {
540
+ RENDER = "render",
541
+ EVENT_HANDLER = "event_handler",
542
+ DATA_SOURCE = "data_source",
543
+ THEME = "theme",
544
+ TOOL = "tool",
545
+ EXTENSION = "extension",
546
+ }
547
+ declare enum PluginPriority {
548
+ LOW = 0,
549
+ NORMAL = 50,
550
+ HIGH = 100,
551
+ CRITICAL = 200,
552
+ }
553
+ interface PluginMetadata {
554
+ name: string;
555
+ version: string;
556
+ description: string;
557
+ author?: string;
558
+ type: PluginType;
559
+ priority?: PluginPriority;
560
+ dependencies?: string[];
561
+ }
562
+ type RenderLayerPosition = "background" | "overlay";
563
+ interface RenderLayer {
564
+ name: string;
565
+ position: RenderLayerPosition;
566
+ render: (ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement, config: any, state: any) => void;
567
+ }
568
+ interface PluginAPI {
569
+ registerRenderLayer: (layer: RenderLayer) => void;
570
+ unregisterRenderLayer: (name: string) => void;
571
+ registerEventHandler: (event: string, handler: Function) => void;
572
+ unregisterEventHandler: (event: string, handler: Function) => void;
573
+ showNotification: (message: string, type?: "info" | "warning" | "error") => void;
574
+ getData: (key: string) => any;
575
+ setData: (key: string, value: any) => void;
576
+ setPerformanceProvider: (provider: PerformanceProvider) => void;
577
+ getPerformanceStats: () => Map<string, PerformanceStats>;
578
+ getFPS: () => number;
579
+ }
580
+ interface PluginContext {
581
+ timeline: Timeline;
582
+ config: any;
583
+ state: any;
584
+ api: PluginAPI;
585
+ }
586
+ interface TimelinePlugin {
587
+ metadata: PluginMetadata;
588
+ init?: (context: PluginContext) => Promise<void> | void;
589
+ activate?: (context: PluginContext) => Promise<void> | void;
590
+ deactivate?: (context: PluginContext) => Promise<void> | void;
591
+ destroy?: (context: PluginContext) => Promise<void> | void;
592
+ }
593
+ interface PerformanceProvider {
594
+ startMeasurement: (name: string) => void;
595
+ endMeasurement: (name: string) => void;
596
+ getAllStats: () => Map<string, PerformanceStats>;
597
+ getFPS: () => number;
598
+ }
599
+ //#endregion
600
+ export { ZoomData as C, Track as S, TimelineColors as _, ContextMenuItem as a, TimelineOptions as b, EventClickData as c, EventMoveData as d, EventTextStyle as f, TimelineCallbacks as g, TimeIndicatorMoveData as h, ContextMenuData as i, EventDeleteData as l, LoadDataFormat as m, Timeline as n, ContextMenuStyle as o, EventUpdateData as p, ChangeType as r, EventAddData as s, TimelinePlugin as t, EventEditData as u, TimelineConfig as v, TimelineState as x, TimelineEvent as y };
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "timeline-canvas",
3
+ "version": "1.0.9",
4
+ "description": "A powerful timeline component built with Canvas and TypeScript",
5
+ "main": "dist/index.mjs",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.mts",
8
+ "type": "module",
9
+ "scripts": {
10
+ "build": "tsdown",
11
+ "dev": "tsdown --watch",
12
+ "typecheck": "tsc -p tsconfig.json --noEmit",
13
+ "lint": "oxlint src",
14
+ "test": "echo \"Error: no test specified\" && exit 1"
15
+ },
16
+ "keywords": [
17
+ "timeline",
18
+ "canvas",
19
+ "typescript",
20
+ "event-timeline",
21
+ "visual-timeline"
22
+ ],
23
+ "author": "sky <https://github.com/umbrella22>",
24
+ "license": "MIT",
25
+ "packageManager": "pnpm@10.18.1",
26
+ "devDependencies": {
27
+ "@types/node": "^24.10.1",
28
+ "oxlint": "^1.30.0",
29
+ "tsdown": "^0.16.8",
30
+ "typescript": "^5.9.3",
31
+ "vue": "^3.5.25"
32
+ },
33
+ "dependencies": {
34
+ "immer": "^10.1.1"
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "README.md",
39
+ "README_CN.md"
40
+ ],
41
+ "exports": {
42
+ ".": {
43
+ "types": "./dist/index.d.mts",
44
+ "import": "./dist/index.mjs"
45
+ },
46
+ "./builtin-plugin/*": {
47
+ "types": "./dist/builtin-plugin/*.d.mts",
48
+ "import": "./dist/builtin-plugin/*.mjs"
49
+ }
50
+ }
51
+ }