apexgantt 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  import { Task } from './Tasks';
2
+ import { ChartContext } from '../../../../graph-utils/src/index.ts';
2
3
  import { Dayjs } from 'dayjs';
3
4
 
4
5
  type Dependency = {
@@ -10,96 +11,34 @@ export declare class DataManager {
10
11
  private dependencies;
11
12
  private taskMap;
12
13
  private taskTree;
14
+ private arrowLinkInstanceId;
13
15
  constructor(tasks?: Task[]);
14
16
  private buildTaskTree;
15
17
  private processLevel;
16
- /**
17
- * Sort tasks recursively by a specified date field (start or end).
18
- * @param field - The date field to sort by ('start' or 'end').
19
- */
20
18
  private sortTasksByDate;
21
- /**
22
- * Validate a single task.
23
- * @param task - Task to validate
24
- * @returns - The validated task
25
- */
26
19
  private validateTask;
27
- /**
28
- * Add a new dependency between tasks
29
- */
30
20
  addDependency(fromId: string, toId: string, type?: Dependency['type']): void;
31
- /**
32
- * Add a new task to the list.
33
- * @param task - Task to add
34
- */
35
21
  addTask(task: Partial<Task>): void;
36
- /**
37
- * Calculate the overall progress of all tasks.
38
- * @returns - Total progress percentage (0-100)
39
- */
40
22
  calculateProgress(): number;
41
- /**
42
- * Get a date range from all tasks.
43
- * @returns - The start and end date from all tasks
44
- */
45
23
  getDateRange(add: number, viewMode: any): [Dayjs, Dayjs];
46
24
  getFlatSortedTasks(tasks: Task[], getAll?: boolean): Task[];
47
25
  getFlatTasks(): Task[];
48
26
  getFlatVisibleTasks(): Task[];
49
27
  getNestedChildTasks(taskId: string, visibleOnly?: boolean): Task[];
50
- /**
51
- * Get a task by ID.
52
- * @param id - ID of the task
53
- * @returns - The task or null if not found
54
- */
55
28
  getTaskById(id: string): null | Task;
56
- /**
57
- * Get all dependencies for a task
58
- * @param taskId - ID of the task
59
- * @returns Object containing incoming and outgoing dependencies
60
- */
61
29
  getTaskDependencies(taskId: string): {
62
30
  incoming: Dependency[];
63
31
  outgoing: Dependency[];
64
32
  };
65
- /**
66
- * Get a all tasks.
67
- * @returns - The all tasks
68
- */
69
33
  getTasks(): Task[];
70
- /**
71
- * Get a all top parent tasks.
72
- * @returns - The all tasks
73
- */
74
34
  getTopParentTasks(): Task[];
75
35
  hasChildren(id: string): boolean;
76
- /**
77
- * Remove a dependency
78
- */
79
36
  removeDependency(fromId: string, toId: string): void;
80
- /**
81
- * Remove a task by ID.
82
- * @param id - ID of the task to remove
83
- */
84
37
  removeTask(id: string): void;
85
- /**
86
- * Validate and set the initial list of tasks.
87
- * @param tasks - Array of tasks to initialize the DataManager
88
- */
89
38
  setTasks(tasks: Task[]): void;
90
39
  toggleTask(id: string): void;
91
- /**
92
- * Update arrow positions when a task is moved
93
- * @param taskId - ID of the task being moved
94
- * @param dx - Change in x position
95
- */
96
- updateDependencyArrows(taskId: string): void;
97
- /**
98
- * Update an existing task by ID.
99
- * @param id - ID of the task to update
100
- * @param updates - Partial task updates
101
- */
40
+ setArrowLinkInstanceId(instanceId: string): void;
41
+ updateDependencyArrows(taskId: string, chartContext?: ChartContext): void;
102
42
  updateTask(id: string, updates: Partial<Task>): Task;
103
43
  }
104
- export declare const dataManager: DataManager;
105
44
  export {};
@@ -1,3 +1,5 @@
1
+ import { ChartContext } from '../../../../graph-utils/src/index.ts';
2
+
1
3
  export interface DialogOptions {
2
4
  closeOnClickOutside?: boolean;
3
5
  closeOnEscape?: boolean;
@@ -7,16 +9,22 @@ export interface DialogOptions {
7
9
  modal?: boolean;
8
10
  title?: string;
9
11
  width?: string;
12
+ positionRelativeToChart?: boolean;
10
13
  }
11
14
  export declare class Dialog {
15
+ private chartContext;
12
16
  private options;
13
17
  private container;
14
18
  private overlay;
15
19
  private keydownHandler;
16
20
  private clickOutsideHandler;
17
- constructor(options: DialogOptions);
21
+ constructor(chartContext: ChartContext, options: DialogOptions);
18
22
  private createDialog;
19
23
  private createDialogStructure;
24
+ /**
25
+ * Position dialog relative to the chart container
26
+ */
27
+ private positionRelativeToChart;
20
28
  private setupEventListeners;
21
29
  private trapFocus;
22
30
  private updateDialogContent;
@@ -1,7 +1,7 @@
1
+ import { ThemeMode } from './Theme';
1
2
  import { Task } from './Tasks';
2
3
  import { Annotation, Orientation } from './Annotation';
3
4
  import { ViewMode } from '../util/gantt.util';
4
- import { ArrowLink } from '../../../../graph-utils/src/index.ts';
5
5
 
6
6
  export interface AnnotationOptions {
7
7
  readonly annotationBgColor?: string;
@@ -15,6 +15,8 @@ export interface BorderOptions {
15
15
  readonly cellBorderWidth: string;
16
16
  }
17
17
  export interface CommonOptions {
18
+ readonly backgroundColor: string;
19
+ readonly borderColor: string;
18
20
  readonly canvasStyle: string;
19
21
  readonly enableExport: boolean;
20
22
  readonly enableResize: boolean;
@@ -60,6 +62,7 @@ export interface TooltipOptions {
60
62
  }
61
63
  export type GanttOptionsInternal = AnnotationOptions & BorderOptions & CommonOptions & FontOptions & GanttBarOptions & GanttData & GanttRowOptions & InteractiveOptions & TooltipOptions;
62
64
  export interface GanttUserOptions {
65
+ readonly theme?: ThemeMode;
63
66
  readonly annotationBgColor?: string;
64
67
  readonly annotationBorderColor?: string;
65
68
  readonly annotationBorderDashArray?: number[];
@@ -67,10 +70,12 @@ export interface GanttUserOptions {
67
70
  readonly annotationOrientation?: Orientation;
68
71
  readonly annotations?: Annotation[];
69
72
  readonly arrowColor?: string;
73
+ readonly backgroundColor?: string;
70
74
  readonly barBackgroundColor?: string;
71
75
  readonly barBorderRadius?: string;
72
76
  readonly barMargin?: number;
73
77
  readonly barTextColor?: string;
78
+ readonly borderColor?: string;
74
79
  readonly canvasStyle?: string;
75
80
  readonly cellBorderColor?: string;
76
81
  readonly cellBorderWidth?: string;
@@ -102,5 +107,5 @@ export type GanttOptions = GanttOptionsInternal;
102
107
  export declare const ColumnWidthByMode: Record<ViewMode, number>;
103
108
  export declare function getDaysInUnit(date: any, mode: any): number;
104
109
  export declare const getPixelsPerDayForUnit: (unitStartDate: any, viewMode: any) => number;
105
- export declare const arrowLink: ArrowLink;
110
+ export declare function getDefaultOptions(theme?: ThemeMode): GanttOptionsInternal;
106
111
  export declare const DefaultOptions: GanttOptionsInternal;
@@ -1,13 +1,19 @@
1
1
  import { Task } from './Tasks';
2
+ import { DataManager } from './DataManager';
3
+ import { ChartContext } from '../../../../graph-utils/src/index.ts';
2
4
 
3
5
  export declare class TaskForm {
6
+ private chartContext;
7
+ private dataManager;
4
8
  private task;
9
+ private containerElement;
5
10
  private onSubmit;
6
11
  private dateFormat;
7
12
  private errors;
8
13
  private form;
9
14
  private submitButton;
10
- constructor(task: Task, onSubmit: (updatedTask: Partial<Task>) => void, dateFormat?: string);
15
+ constructor(chartContext: ChartContext, dataManager: DataManager, task: Task, containerElement: HTMLElement, onSubmit: (updatedTask: Partial<Task>) => void, dateFormat?: string);
16
+ private emitEvent;
11
17
  private clearError;
12
18
  private createForm;
13
19
  private formatDate;
@@ -1,4 +1,6 @@
1
1
  import { GanttOptions } from './Options';
2
+ import { DataManager } from './DataManager';
3
+ import { ChartContext } from '../../../../graph-utils/src/index.ts';
2
4
 
3
5
  export declare enum TaskType {
4
6
  Milestone = "milestone",
@@ -22,10 +24,12 @@ export interface Task {
22
24
  }
23
25
  export declare class Tasks {
24
26
  options: GanttOptions;
25
- constructor(options: GanttOptions);
27
+ chartContext: ChartContext;
28
+ dataManager: DataManager;
29
+ constructor(options: GanttOptions, chartContext: ChartContext, dataManager: DataManager);
26
30
  generateBody(tasks: Task[], reRender: () => void): HTMLElement;
27
31
  generateHeader(headerList: string[]): HTMLElement;
28
32
  generateRow(task: Task, reRender: () => void): HTMLTableRowElement;
29
33
  generateRows(tasks: Task[], tableBody: HTMLElement, reRender: () => void): HTMLElement;
30
- render(reRender: () => void): HTMLElement;
34
+ render(reRender: () => void): HTMLElement[];
31
35
  }
@@ -0,0 +1,36 @@
1
+ export type ThemeMode = 'dark' | 'light';
2
+ export interface GanttTheme {
3
+ readonly tooltipBGColor: string;
4
+ readonly tooltipBorderColor: string;
5
+ readonly tooltipTextColor: string;
6
+ readonly cellBorderColor: string;
7
+ readonly rowBackgroundColors: readonly string[];
8
+ readonly headerBackground: string;
9
+ readonly headerTextColor: string;
10
+ readonly barBackgroundColor: string;
11
+ readonly barTextColor: string;
12
+ readonly arrowColor: string;
13
+ readonly backgroundColor: string;
14
+ readonly textColor: string;
15
+ readonly borderColor: string;
16
+ readonly annotationBgColor: string;
17
+ readonly annotationBorderColor: string;
18
+ readonly dialogBgColor: string;
19
+ readonly dialogBorderColor: string;
20
+ readonly buttonBgColor: string;
21
+ readonly buttonTextColor: string;
22
+ readonly buttonHoverBgColor: string;
23
+ readonly toolbarBgColor: string;
24
+ readonly toolbarBorderColor: string;
25
+ readonly toolbarHoverBgColor: string;
26
+ readonly scrollbarTrackColor: string;
27
+ readonly scrollbarThumbColor: string;
28
+ readonly scrollbarThumbHoverColor: string;
29
+ readonly splitBarColor: string;
30
+ readonly splitBarHoverColor: string;
31
+ readonly splitBarBorderColor: string;
32
+ readonly splitBarHandleColor: string;
33
+ }
34
+ export declare const LightTheme: GanttTheme;
35
+ export declare const DarkTheme: GanttTheme;
36
+ export declare function getTheme(mode: ThemeMode): GanttTheme;
@@ -1,13 +1,17 @@
1
1
  import { Task } from './Tasks';
2
2
  import { GanttOptions } from './Options';
3
+ import { DataManager } from './DataManager';
3
4
  import { ViewMode } from '../util/gantt.util';
4
5
  import { HeaderObject } from '../util/date.util';
5
6
  import { Dayjs } from 'dayjs';
7
+ import { ChartContext } from '../../../../graph-utils/src/index.ts';
6
8
 
7
9
  export declare class TimeLine {
8
10
  viewMode: ViewMode;
9
11
  options: GanttOptions;
10
- constructor(viewMode: ViewMode, options: GanttOptions);
12
+ chartContext: ChartContext;
13
+ dataManager: DataManager;
14
+ constructor(viewMode: ViewMode, options: GanttOptions, chartContext: ChartContext, dataManager: DataManager);
11
15
  generateHeader(headerData: HeaderObject[], subHeader: null | string[]): HTMLElement;
12
16
  generateRow(taskId: string, cellCount: number): HTMLElement;
13
17
  generateRows(tasks: Task[], cellCount: number): HTMLElement;
@@ -1 +1 @@
1
- export declare const DialogStyle = "\n .gantt-dialog-container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: none;\n z-index: 999;\n }\n\n .gantt-dialog-container .dialog-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.5);\n }\n\n .gantt-dialog-container .gantt-dialog {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: white;\n border-radius: 4px;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n min-width: 300px;\n }\n\n .gantt-dialog .dialog-header {\n padding: 12px 16px;\n border-bottom: 1px solid #eee;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .gantt-dialog .dialog-title {\n font-weight: 600;\n font-size: 16px;\n }\n\n .gantt-dialog .dialog-close {\n background: none;\n border: none;\n font-size: 20px;\n cursor: pointer;\n padding: 0;\n color: #666;\n transition: color 0.2s;\n }\n\n .gantt-dialog .dialog-close:hover {\n color: #333;\n }\n\n .gantt-dialog .dialog-content {\n padding: 16px;\n max-height: calc(100vh - 200px);\n overflow-y: auto;\n }\n\n .gantt-dialog-container.show {\n display: block;\n }\n\n /* Animation classes */\n .gantt-dialog-container.animate .dialog-overlay {\n animation: fadeIn 0.2s ease-out;\n }\n\n .gantt-dialog-container.animate .gantt-dialog {\n animation: slideIn 0.3s ease-out;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translate(-50%, -48%);\n }\n to {\n opacity: 1;\n transform: translate(-50%, -50%);\n }\n }\n";
1
+ export declare const DialogStyle = "\n .gantt-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: none;\n z-index: 999;\n overflow: hidden;\n }\n\n .gantt-dialog-container .dialog-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.5);\n }\n\n .gantt-dialog-container .gantt-dialog {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--dialog-bg-color, white);\n border-radius: 4px;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);\n border: 1px solid var(--dialog-border-color, #eee);\n z-index: 1000;\n min-width: 300px;\n max-width: 90%;\n max-height: 90%;\n display: flex;\n flex-direction: column;\n }\n\n .gantt-dialog .dialog-header {\n padding: 12px 16px;\n border-bottom: 1px solid var(--dialog-border-color, #eee);\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: var(--header-bg-color, #f3f3f3);\n flex-shrink: 0;\n }\n\n .gantt-dialog .dialog-title {\n font-weight: 600;\n font-size: 16px;\n color: var(--header-text-color, #333);\n margin: 0;\n }\n\n .gantt-dialog .dialog-close {\n background: none;\n border: none;\n font-size: 20px;\n cursor: pointer;\n padding: 0;\n color: var(--text-color, #666);\n transition: color 0.2s;\n line-height: 1;\n }\n\n .gantt-dialog .dialog-close:hover {\n color: var(--text-color, #333);\n }\n\n .gantt-dialog .dialog-content {\n padding: 16px;\n overflow-y: auto;\n overflow-x: hidden;\n flex: 1;\n background: var(--dialog-bg-color, white);\n color: var(--text-color, #333);\n }\n\n .gantt-dialog .dialog-content::-webkit-scrollbar {\n width: 8px;\n }\n\n .gantt-dialog .dialog-content::-webkit-scrollbar-track {\n background: var(--dialog-bg-color, #f1f1f1);\n }\n\n .gantt-dialog .dialog-content::-webkit-scrollbar-thumb {\n background: var(--border-color, #888);\n border-radius: 4px;\n }\n\n .gantt-dialog .dialog-content::-webkit-scrollbar-thumb:hover {\n background: var(--text-color, #555);\n }\n\n .gantt-dialog-container.show {\n display: block;\n }\n\n .gantt-dialog-container.animate .dialog-overlay {\n animation: fadeIn 0.2s ease-out;\n }\n\n .gantt-dialog-container.animate .gantt-dialog {\n animation: slideIn 0.3s ease-out;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translate(-50%, -48%);\n }\n to {\n opacity: 1;\n transform: translate(-50%, -50%);\n }\n }\n\n .gantt-container {\n position: relative;\n }\n";
@@ -1 +1 @@
1
- export declare const DropdownStyle = "\n .dropdown {\n position: relative;\n display: inline-block;\n }\n \n .dropdown-btn {\n padding: 8px 16px;\n background-color: #fff;\n color: rgba(0, 0, 0, 0.7);\n border: 1px solid #ddd;\n cursor: pointer;\n font-weight: bold;\n border-radius: 2px;\n font-family: inherit;\n font-size: inherit;\n line-height: 1.5;\n transition: background-color 0.2s ease, border-color 0.2s ease;\n }\n \n .dropdown-btn:hover {\n background-color: #f8f9fa;\n border-color: #bbb;\n }\n \n .dropdown-btn:focus {\n outline: none;\n border-color: #0066cc;\n box-shadow: 0 0 0 2px rgba(0, 102, 204, 0.2);\n }\n \n .dropdown-content {\n display: none;\n position: absolute;\n background-color: #fff;\n min-width: 160px;\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n border-radius: 4px;\n right: 0;\n border: 1px solid #D9D9D9;\n overflow: hidden;\n }\n \n .dropdown-content a {\n color: #333;\n padding: 12px 16px;\n text-decoration: none;\n display: block;\n font-family: inherit;\n font-size: inherit;\n line-height: 1.4;\n transition: background-color 0.2s ease;\n cursor: pointer;\n }\n \n .dropdown-content a:hover {\n background-color: #f1f1f1;\n }\n \n .dropdown-content a:focus {\n background-color: #e6f3ff;\n outline: none;\n }\n \n .dropdown.show .dropdown-content {\n display: block;\n animation: dropdownSlideDown 0.2s ease-out;\n }\n \n @keyframes dropdownSlideDown {\n from {\n opacity: 0;\n transform: translateY(-5px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n \n /* Shadow DOM specific adjustments */\n :host .dropdown {\n position: relative;\n display: inline-block;\n }\n";
1
+ export declare const DropdownStyle = "\n .dropdown {\n position: relative;\n display: inline-block;\n }\n\n .dropdown .gantt-action-button {\n border-radius: 4px;\n }\n\n .dropdown.show .gantt-action-button {\n background: var(--toolbar-hover-bg-color, #f8f9fa);\n border-color: var(--button-bg-color, #0066cc);\n }\n \n .dropdown-btn {\n padding: 8px 16px;\n background-color: var(--toolbar-bg-color, #fff);\n color: var(--text-color, rgba(0, 0, 0, 0.7));\n border: 1px solid var(--toolbar-border-color, #ddd);\n cursor: pointer;\n font-weight: bold;\n border-radius: 2px;\n font-family: inherit;\n font-size: inherit;\n line-height: 1.5;\n transition: background-color 0.2s ease, border-color 0.2s ease;\n }\n \n .dropdown-btn:hover {\n background-color: var(--toolbar-hover-bg-color, #f8f9fa);\n border-color: var(--toolbar-border-color, #bbb);\n }\n \n .dropdown-btn:focus {\n outline: none;\n border-color: var(--button-bg-color, #0066cc);\n box-shadow: 0 0 0 2px rgba(0, 102, 204, 0.2);\n }\n \n .dropdown-content {\n display: none;\n position: absolute;\n background-color: var(--dialog-bg-color, #fff);\n min-width: 160px;\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n border-radius: 4px;\n right: 0;\n top: calc(100% + 4px);\n border: 1px solid var(--dialog-border-color, #D9D9D9);\n overflow: hidden;\n }\n \n .dropdown-content a {\n color: var(--text-color, #333);\n padding: 10px 14px;\n text-decoration: none;\n display: block;\n font-family: inherit;\n font-size: 13px;\n line-height: 1.4;\n transition: background-color 0.2s ease;\n cursor: pointer;\n }\n \n .dropdown-content a:hover {\n background-color: var(--toolbar-hover-bg-color, #f1f1f1);\n }\n \n .dropdown-content a:focus {\n background-color: var(--button-hover-bg-color, #e6f3ff);\n outline: none;\n }\n \n .dropdown.show .dropdown-content {\n display: block;\n animation: dropdownSlideDown 0.2s ease-out;\n }\n \n @keyframes dropdownSlideDown {\n from {\n opacity: 0;\n transform: translateY(-5px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n \n /* Shadow DOM specific adjustments */\n :host .dropdown {\n position: relative;\n display: inline-block;\n }\n";
@@ -1 +1 @@
1
- export declare const GanttStyle = "\n * {\n box-sizing: border-box;\n }\n\n .gantt-container * {\n user-select: none;\n }\n\n .gantt-actions-container {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 5px 0;\n }\n\n .gantt-container {\n display: flex; \n border: 1px solid #DFE0E1;\n height: auto;\n position: relative;\n }\n \n .gantt-button {\n border: 1px solid #D9D9D9;\n border-radius: 2px;\n background: #fff;\n padding: 4px 12px;\n color: rgba(0, 0, 0, 0.7);\n line-height: 20px;\n font-weight: bold;\n cursor: pointer;\n }\n \n .gantt-button:disabled {\n color: rgba(0, 0, 0, 0.2);\n }\n";
1
+ export declare const GanttStyle = "\n * {\n box-sizing: border-box;\n }\n\n .gantt-container * {\n user-select: none;\n }\n\n .gantt-actions-container {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 10px;\n flex: 0 0 36px;\n min-height: 36px;\n max-height: 36px;\n background-color: var(--background-color, #FFFFFF);\n border-bottom: 1px solid var(--border-color, #DFE0E1);\n }\n\n .gantt-action-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: 1px solid var(--toolbar-border-color, #D9D9D9);\n border-radius: 4px;\n background: var(--toolbar-bg-color, #fff);\n color: var(--text-color, #333);\n cursor: pointer;\n transition: all 0.15s ease;\n flex-shrink: 0;\n }\n\n .gantt-action-button:hover:not(:disabled) {\n background: var(--toolbar-hover-bg-color, #f8f9fa);\n border-color: var(--toolbar-border-color, #999);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n }\n\n .gantt-action-button:active:not(:disabled) {\n transform: translateY(0);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n }\n\n .gantt-action-button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n background: var(--toolbar-bg-color, #fafafa);\n }\n\n .gantt-action-button svg {\n width: 16px;\n height: 16px;\n stroke: currentColor;\n flex-shrink: 0;\n }\n\n .gantt-action-separator {\n width: 1px;\n height: 20px;\n background-color: var(--border-color, #DFE0E1);\n margin: 0 4px;\n flex-shrink: 0;\n }\n\n .gantt-view-mode-display {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n height: 28px;\n font-size: 13px;\n color: var(--text-color, #666);\n background: var(--toolbar-bg-color, #f8f9fa);\n border-radius: 4px;\n margin-left: 4px;\n font-weight: 500;\n white-space: nowrap;\n flex-shrink: 0;\n }\n\n .gantt-view-mode-display svg {\n width: 14px;\n height: 14px;\n flex-shrink: 0;\n }\n \n .gantt-container {\n display: flex;\n flex: 1 1 auto;\n min-height: 0;\n min-width: 0;\n border: 1px solid var(--border-color, #DFE0E1);\n border-top: none;\n position: relative;\n background-color: var(--background-color, #FFFFFF);\n overflow: hidden;\n }\n \n .gantt-button {\n border: 1px solid var(--toolbar-border-color, #D9D9D9);\n border-radius: 2px;\n background: var(--toolbar-bg-color, #fff);\n padding: 4px 12px;\n color: var(--text-color, rgba(0, 0, 0, 0.7));\n line-height: 20px;\n font-weight: bold;\n cursor: pointer;\n transition: background-color 0.2s ease;\n }\n\n .gantt-button:hover {\n background: var(--toolbar-hover-bg-color, #f8f9fa);\n }\n \n .gantt-button:disabled {\n color: rgba(128, 128, 128, 0.5);\n opacity: 0.6;\n }\n";
@@ -0,0 +1 @@
1
+ export declare const ScrollbarStyle = "\n .gantt-container ::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n }\n\n .gantt-container ::-webkit-scrollbar-track {\n background: var(--scrollbar-track-color, #F5F5F5);\n border-radius: 4px;\n }\n\n .gantt-container ::-webkit-scrollbar-thumb {\n background: var(--scrollbar-thumb-color, #C1C1C1);\n border-radius: 4px;\n border: 2px solid var(--scrollbar-track-color, #F5F5F5);\n }\n\n .gantt-container ::-webkit-scrollbar-thumb:hover {\n background: var(--scrollbar-thumb-hover-color, #A8A8A8);\n }\n\n .gantt-container * {\n scrollbar-width: thin;\n scrollbar-color: var(--scrollbar-thumb-color, #C1C1C1) var(--scrollbar-track-color, #F5F5F5);\n }\n\n /* Shadow DOM support */\n :host .gantt-container ::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n }\n\n :host .gantt-container ::-webkit-scrollbar-track {\n background: var(--scrollbar-track-color, #F5F5F5);\n border-radius: 4px;\n }\n\n :host .gantt-container ::-webkit-scrollbar-thumb {\n background: var(--scrollbar-thumb-color, #C1C1C1);\n border-radius: 4px;\n border: 2px solid var(--scrollbar-track-color, #F5F5F5);\n }\n\n :host .gantt-container ::-webkit-scrollbar-thumb:hover {\n background: var(--scrollbar-thumb-hover-color, #A8A8A8);\n }\n\n :host .gantt-container * {\n scrollbar-width: thin;\n scrollbar-color: var(--scrollbar-thumb-color, #C1C1C1) var(--scrollbar-track-color, #F5F5F5);\n }\n";
@@ -1 +1 @@
1
- export declare const TaskFormStyle = "\n\n .task-form .form-group {\n margin-bottom: 18px;\n position: relative;\n }\n\n .task-form label {\n display: block;\n margin-bottom: 5px;\n font-weight: 500;\n }\n\n .task-form input {\n width: 100%;\n padding: 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 14px;\n }\n\n .task-form input:focus {\n outline: none;\n border-color: #0066cc;\n }\n\n .task-form .grid {\n display: flex;\n justify-content: space-between;\n }\n\n .task-form .form-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-top: 24px;\n }\n\n .task-form .btn-primary {\n background: #0066cc;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n cursor: pointer;\n }\n\n .task-form .btn-primary:hover {\n background: #0052a3;\n }\n\n .task-form .btn-disabled,\n .task-form .btn-disabled:hover {\n background: #99c2ff;\n cursor: not-allowed;\n opacity: 0.7;\n }\n\n .task-form .form-error {\n position: absolute;\n bottom: -15px;\n left: 0;\n color: #dc3545;\n font-size: 12px;\n margin-top: 4px;\n line-height: 1.2;\n transition: opacity 0.2s ease;\n }\n\n .task-form .invalid {\n border-color: #dc3545;\n }\n\n .task-form .invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n }\n\n .color-picker-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .color-picker-wrapper input[type=\"color\"] {\n -webkit-appearance: none;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n }\n\n .color-picker-wrapper input[type=\"color\"]::-webkit-color-swatch-wrapper {\n padding: 0;\n }\n\n .color-picker-wrapper input[type=\"color\"]::-webkit-color-swatch {\n border: 1px solid #ddd;\n border-radius: 4px;\n }\n\n .color-picker-wrapper .color-preview {\n font-size: 12px;\n color: #666;\n }\n";
1
+ export declare const TaskFormStyle = "\n\n .task-form {\n overflow: visible;\n }\n\n .task-form .form-group {\n margin-bottom: 18px;\n position: relative;\n }\n\n /* extra padding to last form group for breathing room */\n .task-form .form-group:last-of-type {\n margin-bottom: 24px;\n }\n\n .task-form label {\n display: block;\n margin-bottom: 5px;\n font-weight: 500;\n color: var(--text-color, #333);\n }\n\n .task-form input {\n width: 100%;\n padding: 8px;\n border: 1px solid var(--dialog-border-color, #ddd);\n border-radius: 4px;\n font-size: 14px;\n background-color: var(--dialog-bg-color, #fff);\n color: var(--text-color, #333);\n }\n\n .task-form input:focus {\n outline: none;\n border-color: var(--button-bg-color, #0066cc);\n }\n\n .task-form .grid {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n }\n\n .task-form .grid .form-group {\n flex: 1;\n }\n\n .task-form .form-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-top: 24px;\n padding-top: 16px;\n border-top: 1px solid var(--dialog-border-color, #eee);\n position: sticky;\n bottom: -16px;\n background: var(--dialog-bg-color, white);\n margin-left: -16px;\n margin-right: -16px;\n margin-bottom: -16px;\n padding-left: 16px;\n padding-right: 16px;\n padding-bottom: 16px;\n }\n\n .task-form .btn-primary {\n background: var(--button-bg-color, #0066cc);\n color: var(--button-text-color, white);\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 500;\n }\n\n .task-form .btn-primary:hover {\n background: var(--button-hover-bg-color, #0052a3);\n }\n\n .task-form .btn-disabled,\n .task-form .btn-disabled:hover {\n background: #99c2ff;\n cursor: not-allowed;\n opacity: 0.7;\n }\n\n .task-form .form-error {\n position: absolute;\n bottom: -15px;\n left: 0;\n color: #dc3545;\n font-size: 12px;\n margin-top: 4px;\n line-height: 1.2;\n transition: opacity 0.2s ease;\n }\n\n .task-form .invalid {\n border-color: #dc3545;\n }\n\n .task-form .invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n }\n\n .color-picker-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .color-picker-wrapper input[type=\"color\"] {\n -webkit-appearance: none;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n }\n\n .color-picker-wrapper input[type=\"color\"]::-webkit-color-swatch-wrapper {\n padding: 0;\n }\n\n .color-picker-wrapper input[type=\"color\"]::-webkit-color-swatch {\n border: 1px solid var(--dialog-border-color, #ddd);\n border-radius: 4px;\n }\n\n .color-picker-wrapper .color-preview {\n font-size: 12px;\n color: var(--text-color, #666);\n }\n";
@@ -1 +1 @@
1
- export declare const TableStyle = "\n .tasks-table,\n .tasks-table th,\n .tasks-table td {\n border: var(--cell-border-width, 1px) solid var(--cell-border-color, #eff0f0);\n border-collapse: collapse;\n }\n\n .tasks-table th {\n height: 50px;\n }\n\n .tasks-table th,\n .tasks-table td {\n padding: 0 10px;\n text-align: center;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .tasks-table .tasks-data-row .task-toggle-icon,\n .tasks-table .tasks-data-row .task-toggle-icon-blank {\n margin-right: 5px;\n width: 10px;\n }\n";
1
+ export declare const TableStyle = "\n .tasks-container {\n height: 100%;\n position: relative;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .tasks-header-table {\n flex-shrink: 0;\n overflow-x: auto;\n overflow-y: hidden;\n display: block;\n background-color: var(--header-bg-color, #F3F3F3) !important;\n scrollbar-width: none;\n -ms-overflow-style: none;\n }\n\n .tasks-header-table::-webkit-scrollbar {\n display: none;\n height: 0;\n width: 0;\n }\n\n /* Shadow DOM specific - hiding */\n :host .tasks-header-table {\n scrollbar-width: none !important;\n -ms-overflow-style: none !important;\n }\n\n :host .tasks-header-table::-webkit-scrollbar {\n display: none !important;\n height: 0 !important;\n width: 0 !important;\n }\n\n .tasks-header-table thead {\n display: table;\n width: 100%;\n table-layout: fixed;\n }\n\n .tasks-body-wrapper {\n flex: 1;\n overflow: auto;\n position: relative;\n }\n\n .tasks-table {\n background-color: var(--background-color, #FFFFFF);\n width: 100%;\n table-layout: fixed;\n }\n\n .tasks-table,\n .tasks-table th,\n .tasks-table td {\n border: var(--cell-border-width, 1px) solid var(--cell-border-color, #eff0f0);\n border-collapse: collapse;\n }\n\n .tasks-table th {\n height: 50px;\n background-color: var(--header-bg-color, #F3F3F3);\n color: var(--header-text-color, #333);\n }\n\n .tasks-table th,\n .tasks-table td {\n padding: 0 10px;\n text-align: center;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--text-color, #000);\n }\n\n .tasks-table .tasks-data-row .task-toggle-icon,\n .tasks-table .tasks-data-row .task-toggle-icon-blank {\n display: inline-block;\n margin-right: 5px;\n width: 10px;\n height: 10px;\n vertical-align: middle;\n }\n\n .tasks-table .tasks-data-row .task-toggle-icon {\n cursor: pointer;\n position: relative;\n }\n\n /* chevron (expanded) */\n .tasks-table .tasks-data-row .task-toggle-icon.expanded::before {\n content: '';\n position: absolute;\n width: 6px;\n height: 6px;\n border-right: 2px solid var(--text-color, #000000);\n border-bottom: 2px solid var(--text-color, #000000);\n transform: rotate(45deg);\n top: 0;\n left: 2px;\n }\n\n /* chevron - pointing right (collapsed) */\n .tasks-table .tasks-data-row .task-toggle-icon.collapsed::before {\n content: '';\n position: absolute;\n width: 6px;\n height: 6px;\n border-right: 2px solid var(--text-color, #000000);\n border-bottom: 2px solid var(--text-color, #000000);\n transform: rotate(-45deg);\n top: 2px;\n left: 0;\n }\n\n .tasks-table .tasks-data-row .task-toggle-icon:hover::before {\n opacity: 0.7;\n }\n";
@@ -1 +1 @@
1
- export declare const TimelineStyle = "\n .gantt-container .timeline-container {\n width: 100%;\n overflow-y: auto;\n position: relative;\n }\n\n .timeline-container .annotation {\n position: absolute;\n }\n\n .timeline-container .bar-timeline {\n position: absolute;\n cursor: move;\n cursor: grab;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .timeline-container .bar-timeline .bar-handle {\n height: 100%;\n width: 5px;\n position: absolute;\n z-index: 1000;\n background: transparent;\n }\n\n .timeline-container .bar-timeline .bar-handle:hover {\n cursor: col-resize;\n }\n\n .resizing {\n pointer-events: none;\n opacity: 0.8;\n }\n\n .timeline-container .bar-timeline .bar-handle.handle-left {\n left: -5px;\n }\n\n .timeline-container .bar-timeline .bar-handle.handle-right {\n right: -5px;\n }\n\n .timeline-container .bar-timeline.dragging {\n cursor: grabbing;\n }\n\n .bar-timeline .bar-timeline-progress {\n position: absolute;\n pointer-events: none;\n height: 100%;\n left: 0;\n }\n\n .bar-timeline .bar-label {\n white-space: nowrap;\n pointer-events: none;\n overflow: hidden;\n z-index: 1;\n }\n\n .timeline-container .timeline-header,\n .timeline-container .timeline-body {\n width: max-content;\n position: relative;\n }\n \n .timeline-container .timeline-header-row,\n .timeline-container .timeline-data-row {\n display: flex;\n }\n\n .timeline-container .timeline-header-cell,\n .timeline-container .timeline-data-cell {\n padding: 0 10px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n justify-content: center;\n border: var(--cell-border-width, 1px) solid var(--cell-border-color, #eff0f0);\n }\n";
1
+ export declare const TimelineStyle = "\n .gantt-container .timeline-container {\n width: 100%;\n height: 100%;\n position: relative;\n background-color: var(--background-color, #FFFFFF);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .timeline-container .timeline-header {\n position: relative;\n z-index: 100;\n background-color: var(--header-bg-color, #F3F3F3);\n flex-shrink: 0;\n overflow-x: auto;\n overflow-y: hidden;\n width: 100%;\n scrollbar-width: none; \n -ms-overflow-style: none; \n }\n\n .timeline-container .timeline-header::-webkit-scrollbar {\n display: none;\n height: 0;\n width: 0;\n }\n\n /* Shadow DOM specific */\n :host .timeline-container .timeline-header {\n scrollbar-width: none !important;\n -ms-overflow-style: none !important;\n }\n\n :host .timeline-container .timeline-header::-webkit-scrollbar {\n display: none !important;\n height: 0 !important;\n width: 0 !important;\n }\n\n .timeline-container .timeline-header > .timeline-header-row {\n width: max-content;\n position: relative;\n }\n\n .timeline-container .timeline-body-wrapper {\n flex: 1;\n overflow: auto;\n position: relative;\n width: 100%;\n }\n\n .timeline-container .annotation,\n .timeline-container .annotation-container {\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n }\n\n .timeline-container .annotation-container > * {\n pointer-events: auto;\n }\n\n .timeline-container .bar-container {\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n }\n\n .timeline-container .bar-container > * {\n pointer-events: auto;\n }\n\n .timeline-container .bar-timeline {\n position: absolute;\n cursor: move;\n cursor: grab;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .timeline-container .bar-timeline .bar-handle {\n height: 100%;\n width: 5px;\n position: absolute;\n z-index: 1000;\n background: transparent;\n }\n\n .timeline-container .bar-timeline .bar-handle:hover {\n cursor: col-resize;\n }\n\n .resizing {\n pointer-events: none;\n opacity: 0.8;\n }\n\n .timeline-container .bar-timeline .bar-handle.handle-left {\n left: -5px;\n }\n\n .timeline-container .bar-timeline .bar-handle.handle-right {\n right: -5px;\n }\n\n .timeline-container .bar-timeline.dragging {\n cursor: grabbing;\n }\n\n .bar-timeline .bar-timeline-progress {\n position: absolute;\n pointer-events: none;\n height: 100%;\n left: 0;\n }\n\n .bar-timeline .bar-label {\n white-space: nowrap;\n pointer-events: none;\n overflow: hidden;\n z-index: 1;\n }\n\n .timeline-container .timeline-body {\n width: max-content;\n position: relative;\n }\n \n .timeline-container .timeline-header-row,\n .timeline-container .timeline-data-row {\n display: flex;\n }\n\n .timeline-container .timeline-header-cell,\n .timeline-container .timeline-data-cell {\n padding: 0 10px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n justify-content: center;\n border: var(--cell-border-width, 1px) solid var(--cell-border-color, #eff0f0);\n color: var(--text-color, #000);\n }\n\n .timeline-container .timeline-header-cell {\n background-color: var(--header-bg-color, #F3F3F3);\n color: var(--header-text-color, #333);\n }\n";
@@ -1 +1 @@
1
- export declare const ToolbarStyle = "\n #toolbar {\n display: flex;\n gap: 5px;\n position: absolute;\n right: 10px;\n top: 10px;\n z-index: 100;\n }\n \n .toolbar-item {\n align-items: center;\n background-color: #FFFFFF;\n border: 1px solid #BCBCBC;\n cursor: pointer;\n display: flex;\n height: 30px;\n justify-content: center;\n width: 30px;\n border-radius: 3px;\n transition: all 0.2s ease;\n position: relative;\n }\n \n .toolbar-item:hover {\n background-color: #f8f9fa;\n border-color: #999;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n \n .toolbar-item:active {\n transform: translateY(0);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n }\n \n .toolbar-item:focus {\n outline: none;\n border-color: #0066cc;\n box-shadow: 0 0 0 2px rgba(0, 102, 204, 0.2);\n }\n \n .toolbar-item img {\n width: 16px;\n height: 16px;\n pointer-events: none;\n }\n \n .toolbar-item[disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n }\n \n /* Tooltip styles */\n .toolbar-item::after {\n content: attr(data-tooltip);\n position: absolute;\n bottom: -35px;\n left: 50%;\n transform: translateX(-50%);\n background: #333;\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease;\n z-index: 1000;\n }\n \n .toolbar-item::before {\n content: '';\n position: absolute;\n bottom: -25px;\n left: 50%;\n transform: translateX(-50%);\n border: 5px solid transparent;\n border-bottom-color: #333;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease;\n z-index: 1000;\n }\n \n .toolbar-item:hover::after,\n .toolbar-item:hover::before {\n opacity: 1;\n }\n \n /* Shadow DOM specific adjustments */\n :host #toolbar {\n display: flex;\n gap: 5px;\n position: absolute;\n right: 10px;\n top: 10px;\n z-index: 100;\n }\n";
1
+ export declare const ToolbarStyle = "\n #toolbar {\n display: flex;\n gap: 5px;\n position: absolute;\n right: 10px;\n top: 10px;\n z-index: 100;\n }\n \n .toolbar-item {\n align-items: center;\n background-color: var(--toolbar-bg-color, #FFFFFF);\n border: 1px solid var(--toolbar-border-color, #BCBCBC);\n cursor: pointer;\n display: flex;\n height: 30px;\n justify-content: center;\n width: 30px;\n border-radius: 3px;\n transition: all 0.2s ease;\n position: relative;\n }\n \n .toolbar-item:hover {\n background-color: var(--toolbar-hover-bg-color, #f8f9fa);\n border-color: var(--toolbar-border-color, #999);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n \n .toolbar-item:active {\n transform: translateY(0);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n }\n \n .toolbar-item:focus {\n outline: none;\n border-color: var(--button-bg-color, #0066cc);\n box-shadow: 0 0 0 2px rgba(0, 102, 204, 0.2);\n }\n \n .toolbar-item img {\n width: 16px;\n height: 16px;\n pointer-events: none;\n filter: var(--toolbar-icon-filter, none);\n }\n \n .toolbar-item[disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n }\n \n /* Tooltip styles */\n .toolbar-item::after {\n content: attr(data-tooltip);\n position: absolute;\n bottom: -35px;\n left: 50%;\n transform: translateX(-50%);\n background: var(--tooltip-bg-color, #333);\n color: var(--tooltip-text-color, white);\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease;\n z-index: 1000;\n }\n \n .toolbar-item::before {\n content: '';\n position: absolute;\n bottom: -25px;\n left: 50%;\n transform: translateX(-50%);\n border: 5px solid transparent;\n border-bottom-color: var(--tooltip-bg-color, #333);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease;\n z-index: 1000;\n }\n \n .toolbar-item:hover::after,\n .toolbar-item:hover::before {\n opacity: 1;\n }\n \n /* Shadow DOM specific adjustments */\n :host #toolbar {\n display: flex;\n gap: 5px;\n position: absolute;\n right: 10px;\n top: 10px;\n z-index: 100;\n }\n";
@@ -1 +1 @@
1
- export declare const TooltipStyle = "\n #apexgantt-tooltip-container,\n [role=\"tooltip\"] {\n position: absolute;\n z-index: 1000;\n pointer-events: none;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.2s ease;\n font-family: inherit;\n font-size: 13px;\n line-height: 1.4;\n display: none;\n width: 300px !important;\n max-width: 300px !important;\n box-sizing: border-box;\n }\n \n #apexgantt-tooltip-container.visible,\n [role=\"tooltip\"].visible {\n display: block;\n opacity: 1;\n visibility: visible;\n }\n \n #apexgantt-tooltip-container .tooltip-content,\n [role=\"tooltip\"] .tooltip-content {\n background: #333;\n color: white;\n padding: 12px 16px;\n border-radius: 6px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);\n width: 100%;\n word-wrap: break-word;\n overflow-wrap: break-word;\n box-sizing: border-box;\n display: block;\n border: 1px solid rgba(255, 255, 255, 0.1);\n }\n \n /* Shadow DOM specific adjustments */\n :host #apexgantt-tooltip-container,\n :host [role=\"tooltip\"] {\n position: absolute;\n z-index: 1000;\n pointer-events: none;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.2s ease;\n font-family: inherit;\n font-size: 13px;\n line-height: 1.4;\n display: none;\n width: 300px !important;\n max-width: 300px !important;\n box-sizing: border-box;\n }\n \n :host #apexgantt-tooltip-container.visible,\n :host [role=\"tooltip\"].visible {\n display: block;\n opacity: 1;\n visibility: visible;\n }\n\n #apexgantt-tooltip-container .tooltip-content div,\n [role=\"tooltip\"] .tooltip-content div {\n margin: 6px 0;\n word-break: break-word;\n line-height: 1.4;\n }\n \n #apexgantt-tooltip-container .tooltip-content strong,\n [role=\"tooltip\"] .tooltip-content strong {\n font-weight: 600;\n color: rgba(255, 255, 255, 0.9);\n display: inline;\n margin-right: 8px;\n }\n \n #apexgantt-tooltip-container .tooltip-content span,\n [role=\"tooltip\"] .tooltip-content span {\n color: white;\n display: inline;\n }\n \n /* First item (Name) styling */\n #apexgantt-tooltip-container .tooltip-content div:first-child,\n [role=\"tooltip\"] .tooltip-content div:first-child {\n margin-bottom: 10px;\n padding-bottom: 8px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.2);\n }\n \n #apexgantt-tooltip-container .tooltip-content div:first-child strong,\n [role=\"tooltip\"] .tooltip-content div:first-child strong {\n color: #4CAF50;\n font-weight: 700;\n }\n \n #apexgantt-tooltip-container .tooltip-content div:last-child,\n [role=\"tooltip\"] .tooltip-content div:last-child {\n margin-bottom: 0;\n }\n";
1
+ export declare const TooltipStyle = "\n #apexgantt-tooltip-container,\n [role=\"tooltip\"] {\n position: absolute;\n z-index: 1000;\n pointer-events: none;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.2s ease;\n font-family: inherit;\n font-size: 13px;\n line-height: 1.4;\n display: none;\n width: 300px !important;\n max-width: 300px !important;\n box-sizing: border-box;\n }\n \n #apexgantt-tooltip-container.visible,\n [role=\"tooltip\"].visible {\n display: block;\n opacity: 1;\n visibility: visible;\n }\n \n #apexgantt-tooltip-container .tooltip-content,\n [role=\"tooltip\"] .tooltip-content {\n padding: 12px 16px;\n border-radius: 6px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);\n width: 100%;\n word-wrap: break-word;\n overflow-wrap: break-word;\n box-sizing: border-box;\n display: block;\n border: 1px solid rgba(255, 255, 255, 0.1);\n }\n \n /* Shadow DOM specific adjustments */\n :host #apexgantt-tooltip-container,\n :host [role=\"tooltip\"] {\n position: absolute;\n z-index: 1000;\n pointer-events: none;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.2s ease;\n font-family: inherit;\n font-size: 13px;\n line-height: 1.4;\n display: none;\n width: 300px !important;\n max-width: 300px !important;\n box-sizing: border-box;\n }\n \n :host #apexgantt-tooltip-container.visible,\n :host [role=\"tooltip\"].visible {\n display: block;\n opacity: 1;\n visibility: visible;\n }\n\n #apexgantt-tooltip-container .tooltip-content div,\n [role=\"tooltip\"] .tooltip-content div {\n margin: 6px 0;\n word-break: break-word;\n line-height: 1.4;\n }\n \n #apexgantt-tooltip-container .tooltip-content strong,\n [role=\"tooltip\"] .tooltip-content strong {\n font-weight: 600;\n display: inline;\n margin-right: 8px;\n }\n \n #apexgantt-tooltip-container .tooltip-content span,\n [role=\"tooltip\"] .tooltip-content span {\n display: inline;\n }\n \n /* First item (Name) styling */\n #apexgantt-tooltip-container .tooltip-content div:first-child,\n [role=\"tooltip\"] .tooltip-content div:first-child {\n margin-bottom: 10px;\n padding-bottom: 8px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.2);\n }\n \n #apexgantt-tooltip-container .tooltip-content div:first-child strong,\n [role=\"tooltip\"] .tooltip-content div:first-child strong {\n font-weight: 700;\n }\n \n #apexgantt-tooltip-container .tooltip-content div:last-child,\n [role=\"tooltip\"] .tooltip-content div:last-child {\n margin-bottom: 0;\n }\n";
@@ -1,9 +1,63 @@
1
+ import { Task } from '../models/Tasks';
2
+
1
3
  export interface DependencyArrowUpdateDetail {
2
4
  fromId: string;
3
5
  toId: string;
4
6
  type: 'FF' | 'FS' | 'SF' | 'SS';
7
+ chartInstanceId: string;
8
+ arrowLinkInstanceId?: string;
5
9
  }
6
10
  export interface DependencyArrowUpdateEvent extends CustomEvent {
7
11
  detail: DependencyArrowUpdateDetail;
8
12
  }
9
13
  export declare function isDependencyArrowUpdateEvent(event: Event): event is DependencyArrowUpdateEvent;
14
+ export interface TaskUpdateEventDetail {
15
+ taskId: string;
16
+ updates: Partial<Task>;
17
+ updatedTask: Task;
18
+ timestamp: number;
19
+ }
20
+ export interface TaskValidationErrorEventDetail {
21
+ taskId: string;
22
+ errors: Array<{
23
+ field: string;
24
+ message: string;
25
+ }>;
26
+ timestamp: number;
27
+ }
28
+ export interface TaskUpdateSuccessEventDetail {
29
+ taskId: string;
30
+ updatedTask: Task;
31
+ timestamp: number;
32
+ }
33
+ export interface TaskUpdateErrorEventDetail {
34
+ taskId: string;
35
+ error: Error;
36
+ timestamp: number;
37
+ }
38
+ /**
39
+ * chart event names
40
+ * use these constants to attach event listeners like below
41
+ *
42
+ * element.addEventListener(GanttEvents.TASK_UPDATE, (e) => {
43
+ * console.log(e.detail);
44
+ * });
45
+ */
46
+ export declare const GanttEvents: {
47
+ /**
48
+ * emits when a task is being updated (before completion)
49
+ */
50
+ readonly TASK_UPDATE: "taskUpdate";
51
+ /**
52
+ * emits when form validation fails
53
+ */
54
+ readonly TASK_VALIDATION_ERROR: "taskValidationError";
55
+ /**
56
+ * emits after a task update completes successfully
57
+ */
58
+ readonly TASK_UPDATE_SUCCESS: "taskUpdateSuccess";
59
+ /**
60
+ * emits when a task update fails
61
+ */
62
+ readonly TASK_UPDATE_ERROR: "taskUpdateError";
63
+ };
@@ -1 +1,3 @@
1
- export declare function updateArrow(fromId: string, toId: string): void;
1
+ import { ChartContext } from '../../../../graph-utils/src/index.ts';
2
+
3
+ export declare function updateArrow(context: ChartContext, fromId: string, toId: string, arrowLinkInstanceId: string): void;
@@ -1,2 +1,7 @@
1
- export declare function getBarElement(taskId: string): HTMLElement | null;
2
- export declare function getBarRowElement(taskId: string): HTMLElement | null;
1
+ import { ChartContext } from '../../../../graph-utils/src/index.ts';
2
+
3
+ export declare function getBarElement(context: ChartContext, taskId: string): HTMLElement | null;
4
+ export declare function getBarRowElement(context: ChartContext, taskId: string): HTMLElement | null;
5
+ export declare function getTaskRowElement(context: ChartContext, taskId: string): HTMLElement | null;
6
+ export declare function updateColumnContent(context: ChartContext, taskId: string, columnKey: string, value: string): void;
7
+ export declare function setTaskRowBackgroundColor(context: ChartContext, taskId: string, bgColor: string): void;
@@ -0,0 +1,7 @@
1
+ export declare const Icons: {
2
+ zoomIn: string;
3
+ zoomOut: string;
4
+ calendar: string;
5
+ chevronDown: string;
6
+ download: string;
7
+ };
@@ -1,21 +1,24 @@
1
+ import { ChartContext } from '../../../../graph-utils/src/index.ts';
2
+
1
3
  export declare class StyleInjection {
2
4
  private static injectedStyles;
3
5
  /**
4
- * Inject CSS styles into the correct context (document.head or shadow root)
6
+ * Inject CSS styles into the correct context using ChartContext
7
+ * @param chartContext - Chart context instance
5
8
  * @param css - CSS string to inject
6
9
  * @param id - Optional ID for the style element to prevent duplicates
7
10
  */
8
- static injectStyles(css: string, id?: string): void;
11
+ static injectStyles(chartContext: ChartContext, css: string, id?: string): void;
9
12
  /**
10
13
  * Check if a style with given ID has been injected
11
14
  */
12
15
  static hasStyle(id: string): boolean;
13
16
  /**
14
- * Remove a style by ID
17
+ * Remove a style by ID using ChartContext
15
18
  */
16
- static removeStyle(id: string): void;
19
+ static removeStyle(chartContext: ChartContext, id: string): void;
17
20
  /**
18
- * Clear all injected styles
21
+ * Clear all injected styles using ChartContext
19
22
  */
20
- static clearAll(): void;
23
+ static clearAll(chartContext: ChartContext): void;
21
24
  }
@@ -1,7 +1,9 @@
1
1
  import { ViewMode } from './gantt.util';
2
2
  import { Task } from '../models/Tasks';
3
3
  import { GanttOptions } from '../models/Options';
4
+ import { DataManager } from '../models/DataManager';
4
5
  import { Dayjs } from 'dayjs';
6
+ import { ChartContext } from '../../../../graph-utils/src/index.ts';
5
7
 
6
8
  export declare enum ColumnKey {
7
9
  Duration = "duration",
@@ -23,15 +25,15 @@ export interface ColumnListItem {
23
25
  }
24
26
  export declare const ColumnList: ColumnListItem[];
25
27
  export declare function getTaskTextByColumn(task: Task, columnKey: ColumnKey, inputDateFormat: string): string;
26
- export declare function getTaskRowElement(taskId: string): HTMLElement | null;
27
- export declare function updateColumnContent(taskId: string, columnKey: string, value: string): void;
28
+ export declare function getTaskRowElement(context: ChartContext, taskId: string): HTMLElement | null;
29
+ export declare function updateColumnContent(context: ChartContext, taskId: string, columnKey: string, value: string): void;
28
30
  export declare function getRowBackgroundColor(index: number, rowBackgroundColors: readonly string[]): string;
29
- export declare function setTaskRowBackgroundColor(taskId: string, bgColor: string): void;
31
+ export declare function setTaskRowBackgroundColor(context: ChartContext, taskId: string, bgColor: string): void;
30
32
  interface TaskElements {
31
33
  taskBar: HTMLElement | null;
32
34
  taskBarRow: HTMLElement | null;
33
35
  taskRow: HTMLElement | null;
34
36
  }
35
- export declare const getTaskElements: (taskId: string) => TaskElements;
36
- export declare const updateTaskInUI: (taskId: string, updates: Partial<Task>, options: GanttOptions, viewMode: ViewMode, ganttStartDate: Dayjs) => void;
37
+ export declare const getTaskElements: (context: ChartContext, taskId: string) => TaskElements;
38
+ export declare const updateTaskInUI: (context: ChartContext, dataManager: DataManager, taskId: string, updates: Partial<Task>, options: GanttOptions, viewMode: ViewMode, ganttStartDate: Dayjs) => void;
37
39
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "apexgantt",
3
- "version": "2.0.0",
3
+ "version": "3.0.0",
4
4
  "dependencies": {
5
5
  "dayjs": "^1.11.13",
6
6
  "html2pdf.js": "^0.10.3",
@@ -22,4 +22,4 @@
22
22
  }
23
23
  }
24
24
  }
25
- }
25
+ }