epoch-tui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.d.ts +3 -0
- package/dist/App.js +38 -0
- package/dist/components/calendar/CalendarPane.d.ts +2 -0
- package/dist/components/calendar/CalendarPane.js +91 -0
- package/dist/components/calendar/DayCell.d.ts +7 -0
- package/dist/components/calendar/DayCell.js +26 -0
- package/dist/components/calendar/MonthView.d.ts +7 -0
- package/dist/components/calendar/MonthView.js +10 -0
- package/dist/components/common/BorderedBox.d.ts +18 -0
- package/dist/components/common/BorderedBox.js +29 -0
- package/dist/components/common/ClearTimelineDialog.d.ts +2 -0
- package/dist/components/common/ClearTimelineDialog.js +33 -0
- package/dist/components/common/FullscreenBackground.d.ts +11 -0
- package/dist/components/common/FullscreenBackground.js +12 -0
- package/dist/components/common/HelpDialog.d.ts +2 -0
- package/dist/components/common/HelpDialog.js +40 -0
- package/dist/components/common/Modal.d.ts +10 -0
- package/dist/components/common/Modal.js +15 -0
- package/dist/components/common/Separator.d.ts +8 -0
- package/dist/components/common/Separator.js +10 -0
- package/dist/components/common/ThemeDialog.d.ts +2 -0
- package/dist/components/common/ThemeDialog.js +117 -0
- package/dist/components/common/ThemedScreen.d.ts +22 -0
- package/dist/components/common/ThemedScreen.js +36 -0
- package/dist/components/common/ThemedText.d.ts +11 -0
- package/dist/components/common/ThemedText.js +20 -0
- package/dist/components/layout/Pane.d.ts +12 -0
- package/dist/components/layout/Pane.js +10 -0
- package/dist/components/layout/ThreeColumnLayout.d.ts +13 -0
- package/dist/components/layout/ThreeColumnLayout.js +22 -0
- package/dist/components/overview/OverviewScreen.d.ts +2 -0
- package/dist/components/overview/OverviewScreen.js +138 -0
- package/dist/components/tasks/TaskHeader.d.ts +7 -0
- package/dist/components/tasks/TaskHeader.js +8 -0
- package/dist/components/tasks/TaskItem.d.ts +10 -0
- package/dist/components/tasks/TaskItem.js +25 -0
- package/dist/components/tasks/TaskList.d.ts +11 -0
- package/dist/components/tasks/TaskList.js +11 -0
- package/dist/components/tasks/TasksPane.d.ts +2 -0
- package/dist/components/tasks/TasksPane.js +410 -0
- package/dist/components/timeline/TimelineEntry.d.ts +9 -0
- package/dist/components/timeline/TimelineEntry.js +26 -0
- package/dist/components/timeline/TimelinePane.d.ts +2 -0
- package/dist/components/timeline/TimelinePane.js +78 -0
- package/dist/contexts/AppContext.d.ts +47 -0
- package/dist/contexts/AppContext.js +104 -0
- package/dist/contexts/StorageContext.d.ts +15 -0
- package/dist/contexts/StorageContext.js +83 -0
- package/dist/contexts/ThemeContext.d.ts +15 -0
- package/dist/contexts/ThemeContext.js +44 -0
- package/dist/hooks/useKeyboardNav.d.ts +1 -0
- package/dist/hooks/useKeyboardNav.js +89 -0
- package/dist/hooks/useTerminalSize.d.ts +9 -0
- package/dist/hooks/useTerminalSize.js +34 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8 -0
- package/dist/services/calendarService.d.ts +18 -0
- package/dist/services/calendarService.js +57 -0
- package/dist/services/storage.d.ts +14 -0
- package/dist/services/storage.js +130 -0
- package/dist/services/taskService.d.ts +17 -0
- package/dist/services/taskService.js +106 -0
- package/dist/services/timelineService.d.ts +25 -0
- package/dist/services/timelineService.js +78 -0
- package/dist/themes/amazon.d.ts +2 -0
- package/dist/themes/amazon.js +37 -0
- package/dist/themes/amazonLight.d.ts +2 -0
- package/dist/themes/amazonLight.js +38 -0
- package/dist/themes/apple.d.ts +2 -0
- package/dist/themes/apple.js +38 -0
- package/dist/themes/appleLight.d.ts +2 -0
- package/dist/themes/appleLight.js +38 -0
- package/dist/themes/atomOneDark.d.ts +2 -0
- package/dist/themes/atomOneDark.js +37 -0
- package/dist/themes/atomOneLight.d.ts +2 -0
- package/dist/themes/atomOneLight.js +38 -0
- package/dist/themes/batman.d.ts +2 -0
- package/dist/themes/batman.js +37 -0
- package/dist/themes/catppuccin.d.ts +2 -0
- package/dist/themes/catppuccin.js +37 -0
- package/dist/themes/catppuccinLatte.d.ts +2 -0
- package/dist/themes/catppuccinLatte.js +38 -0
- package/dist/themes/claude.d.ts +2 -0
- package/dist/themes/claude.js +48 -0
- package/dist/themes/claudeCode.d.ts +2 -0
- package/dist/themes/claudeCode.js +47 -0
- package/dist/themes/cursor.d.ts +2 -0
- package/dist/themes/cursor.js +38 -0
- package/dist/themes/cursorLight.d.ts +2 -0
- package/dist/themes/cursorLight.js +38 -0
- package/dist/themes/dark.d.ts +2 -0
- package/dist/themes/dark.js +38 -0
- package/dist/themes/githubDark.d.ts +2 -0
- package/dist/themes/githubDark.js +37 -0
- package/dist/themes/githubLight.d.ts +2 -0
- package/dist/themes/githubLight.js +38 -0
- package/dist/themes/index.d.ts +9 -0
- package/dist/themes/index.js +83 -0
- package/dist/themes/instagram.d.ts +2 -0
- package/dist/themes/instagram.js +37 -0
- package/dist/themes/instagramLight.d.ts +2 -0
- package/dist/themes/instagramLight.js +38 -0
- package/dist/themes/intellij.d.ts +2 -0
- package/dist/themes/intellij.js +37 -0
- package/dist/themes/intellijLight.d.ts +2 -0
- package/dist/themes/intellijLight.js +38 -0
- package/dist/themes/light.d.ts +2 -0
- package/dist/themes/light.js +38 -0
- package/dist/themes/nord.d.ts +2 -0
- package/dist/themes/nord.js +37 -0
- package/dist/themes/nordLight.d.ts +2 -0
- package/dist/themes/nordLight.js +38 -0
- package/dist/themes/postman.d.ts +2 -0
- package/dist/themes/postman.js +37 -0
- package/dist/themes/postmanLight.d.ts +2 -0
- package/dist/themes/postmanLight.js +38 -0
- package/dist/themes/spiderman.d.ts +2 -0
- package/dist/themes/spiderman.js +37 -0
- package/dist/themes/terminal.d.ts +2 -0
- package/dist/themes/terminal.js +37 -0
- package/dist/themes/ubuntu.d.ts +2 -0
- package/dist/themes/ubuntu.js +37 -0
- package/dist/themes/ubuntuLight.d.ts +2 -0
- package/dist/themes/ubuntuLight.js +38 -0
- package/dist/themes/x.d.ts +2 -0
- package/dist/themes/x.js +38 -0
- package/dist/themes/xLight.d.ts +2 -0
- package/dist/themes/xLight.js +38 -0
- package/dist/types/calendar.d.ts +19 -0
- package/dist/types/calendar.js +1 -0
- package/dist/types/storage.d.ts +21 -0
- package/dist/types/storage.js +1 -0
- package/dist/types/task.d.ts +21 -0
- package/dist/types/task.js +1 -0
- package/dist/types/theme.d.ts +38 -0
- package/dist/types/theme.js +1 -0
- package/dist/types/timeline.d.ts +23 -0
- package/dist/types/timeline.js +9 -0
- package/dist/utils/date.d.ts +7 -0
- package/dist/utils/date.js +37 -0
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.js +39 -0
- package/dist/utils/tree.d.ts +11 -0
- package/dist/utils/tree.js +64 -0
- package/dist/utils/validation.d.ts +7 -0
- package/dist/utils/validation.js +35 -0
- package/package.json +44 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export const postmanTheme = {
|
|
2
|
+
name: 'postman',
|
|
3
|
+
colors: {
|
|
4
|
+
background: '#212121',
|
|
5
|
+
foreground: '#ededed',
|
|
6
|
+
border: '#333333',
|
|
7
|
+
calendarBorder: '#333333',
|
|
8
|
+
calendarHeader: '#EF5B25', // Postman Orange
|
|
9
|
+
calendarToday: '#EF5B25',
|
|
10
|
+
calendarSelected: '#EF5B25',
|
|
11
|
+
calendarDayWithTasks: '#00B8D9', // Accent Blueish
|
|
12
|
+
calendarDayOtherMonth: '#666666',
|
|
13
|
+
taskBorder: '#333333',
|
|
14
|
+
taskHeader: '#EF5B25',
|
|
15
|
+
taskCheckboxEmpty: '#666666',
|
|
16
|
+
taskCheckboxFilled: '#00B8D9',
|
|
17
|
+
taskStateTodo: '#ededed',
|
|
18
|
+
taskStateCompleted: '#666666',
|
|
19
|
+
taskStateDelegated: '#FF9900',
|
|
20
|
+
taskStateDelayed: '#FF3333',
|
|
21
|
+
taskIndent: '#333333',
|
|
22
|
+
timelineBorder: '#333333',
|
|
23
|
+
timelineHeader: '#EF5B25',
|
|
24
|
+
timelineTimestamp: '#666666',
|
|
25
|
+
timelineEventCreated: '#EF5B25',
|
|
26
|
+
timelineEventStarted: '#FF9900',
|
|
27
|
+
timelineEventCompleted: '#00B8D9',
|
|
28
|
+
timelineEventDelegated: '#6554C0', // Purple
|
|
29
|
+
timelineEventDelayed: '#FF3333',
|
|
30
|
+
separator: '#333333',
|
|
31
|
+
keyboardHint: '#666666',
|
|
32
|
+
helpDialogBorder: '#EF5B25',
|
|
33
|
+
focusIndicator: '#EF5B25',
|
|
34
|
+
modalOverlay: '#121212',
|
|
35
|
+
modalBackground: '#212121',
|
|
36
|
+
},
|
|
37
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Postman Light theme - Official Postman Light mode colors
|
|
2
|
+
export const postmanLightTheme = {
|
|
3
|
+
name: 'postman-light',
|
|
4
|
+
colors: {
|
|
5
|
+
background: '#ffffff',
|
|
6
|
+
foreground: '#212121',
|
|
7
|
+
border: '#e0e0e0',
|
|
8
|
+
calendarBorder: '#e0e0e0',
|
|
9
|
+
calendarHeader: '#ff6c37', // Postman Orange
|
|
10
|
+
calendarToday: '#ff6c37',
|
|
11
|
+
calendarSelected: '#ff6c37',
|
|
12
|
+
calendarDayWithTasks: '#00a86b', // Green
|
|
13
|
+
calendarDayOtherMonth: '#9e9e9e',
|
|
14
|
+
taskBorder: '#e0e0e0',
|
|
15
|
+
taskHeader: '#ff6c37',
|
|
16
|
+
taskCheckboxEmpty: '#9e9e9e',
|
|
17
|
+
taskCheckboxFilled: '#00a86b',
|
|
18
|
+
taskStateTodo: '#212121',
|
|
19
|
+
taskStateCompleted: '#9e9e9e',
|
|
20
|
+
taskStateDelegated: '#6554c0', // Purple
|
|
21
|
+
taskStateDelayed: '#ffab00', // Amber
|
|
22
|
+
taskIndent: '#e0e0e0',
|
|
23
|
+
timelineBorder: '#e0e0e0',
|
|
24
|
+
timelineHeader: '#ff6c37',
|
|
25
|
+
timelineTimestamp: '#9e9e9e',
|
|
26
|
+
timelineEventCreated: '#ff6c37',
|
|
27
|
+
timelineEventStarted: '#ffab00',
|
|
28
|
+
timelineEventCompleted: '#00a86b',
|
|
29
|
+
timelineEventDelegated: '#6554c0',
|
|
30
|
+
timelineEventDelayed: '#ff3333', // Red
|
|
31
|
+
separator: '#e0e0e0',
|
|
32
|
+
keyboardHint: '#9e9e9e',
|
|
33
|
+
helpDialogBorder: '#ff6c37',
|
|
34
|
+
focusIndicator: '#ff6c37',
|
|
35
|
+
modalOverlay: '#f5f5f5',
|
|
36
|
+
modalBackground: '#ffffff',
|
|
37
|
+
},
|
|
38
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export const spidermanTheme = {
|
|
2
|
+
name: 'spiderman',
|
|
3
|
+
colors: {
|
|
4
|
+
background: '#101820', // Very dark blueish black
|
|
5
|
+
foreground: '#e0e0e0',
|
|
6
|
+
border: '#2B3784', // Spidey Blue
|
|
7
|
+
calendarBorder: '#2B3784',
|
|
8
|
+
calendarHeader: '#DF1F2D', // Spidey Red
|
|
9
|
+
calendarToday: '#DF1F2D',
|
|
10
|
+
calendarSelected: '#DF1F2D',
|
|
11
|
+
calendarDayWithTasks: '#DF1F2D',
|
|
12
|
+
calendarDayOtherMonth: '#4a4a4a',
|
|
13
|
+
taskBorder: '#2B3784',
|
|
14
|
+
taskHeader: '#DF1F2D',
|
|
15
|
+
taskCheckboxEmpty: '#2B3784',
|
|
16
|
+
taskCheckboxFilled: '#DF1F2D',
|
|
17
|
+
taskStateTodo: '#e0e0e0',
|
|
18
|
+
taskStateCompleted: '#4a4a4a',
|
|
19
|
+
taskStateDelegated: '#2B3784',
|
|
20
|
+
taskStateDelayed: '#a71814',
|
|
21
|
+
taskIndent: '#2B3784',
|
|
22
|
+
timelineBorder: '#2B3784',
|
|
23
|
+
timelineHeader: '#DF1F2D',
|
|
24
|
+
timelineTimestamp: '#4a4a4a',
|
|
25
|
+
timelineEventCreated: '#DF1F2D',
|
|
26
|
+
timelineEventStarted: '#DF1F2D',
|
|
27
|
+
timelineEventCompleted: '#DF1F2D',
|
|
28
|
+
timelineEventDelegated: '#2B3784',
|
|
29
|
+
timelineEventDelayed: '#a71814',
|
|
30
|
+
separator: '#2B3784',
|
|
31
|
+
keyboardHint: '#4a4a4a',
|
|
32
|
+
helpDialogBorder: '#DF1F2D',
|
|
33
|
+
focusIndicator: '#DF1F2D',
|
|
34
|
+
modalOverlay: '#000000cc',
|
|
35
|
+
modalBackground: '#1d2a38',
|
|
36
|
+
},
|
|
37
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export const terminalTheme = {
|
|
2
|
+
name: 'terminal',
|
|
3
|
+
colors: {
|
|
4
|
+
// defaults rely on terminal settings
|
|
5
|
+
border: 'gray',
|
|
6
|
+
calendarBorder: 'gray',
|
|
7
|
+
calendarHeader: 'blue',
|
|
8
|
+
calendarToday: 'green',
|
|
9
|
+
calendarSelected: 'magenta',
|
|
10
|
+
calendarDayWithTasks: 'yellow',
|
|
11
|
+
calendarDayOtherMonth: 'gray',
|
|
12
|
+
taskBorder: 'gray',
|
|
13
|
+
taskHeader: 'blue',
|
|
14
|
+
taskCheckboxEmpty: 'gray',
|
|
15
|
+
taskCheckboxFilled: 'green',
|
|
16
|
+
taskStateTodo: undefined, // default
|
|
17
|
+
taskStateCompleted: 'green',
|
|
18
|
+
taskStateDelegated: 'magenta',
|
|
19
|
+
taskStateDelayed: 'red',
|
|
20
|
+
taskIndent: 'gray',
|
|
21
|
+
timelineBorder: 'gray',
|
|
22
|
+
timelineHeader: 'blue',
|
|
23
|
+
timelineTimestamp: 'gray',
|
|
24
|
+
timelineEventCreated: 'cyan',
|
|
25
|
+
timelineEventStarted: 'yellow',
|
|
26
|
+
timelineEventCompleted: 'green',
|
|
27
|
+
timelineEventDelegated: 'magenta',
|
|
28
|
+
timelineEventDelayed: 'red',
|
|
29
|
+
separator: 'gray',
|
|
30
|
+
keyboardHint: 'gray',
|
|
31
|
+
helpDialogBorder: 'blue',
|
|
32
|
+
focusIndicator: 'cyan',
|
|
33
|
+
// Modal colors follow terminal defaults
|
|
34
|
+
modalOverlay: undefined,
|
|
35
|
+
modalBackground: undefined,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export const ubuntuTheme = {
|
|
2
|
+
name: 'ubuntu',
|
|
3
|
+
colors: {
|
|
4
|
+
background: '#2c001e', // Aubergine
|
|
5
|
+
foreground: '#f6f5f4',
|
|
6
|
+
border: '#5c5c5c', // Warm Grey
|
|
7
|
+
calendarBorder: '#5c5c5c',
|
|
8
|
+
calendarHeader: '#E95420', // Orange
|
|
9
|
+
calendarToday: '#E95420',
|
|
10
|
+
calendarSelected: '#E95420',
|
|
11
|
+
calendarDayWithTasks: '#77216F', // Aubergine light / Purple
|
|
12
|
+
calendarDayOtherMonth: '#AEA79F',
|
|
13
|
+
taskBorder: '#5c5c5c',
|
|
14
|
+
taskHeader: '#E95420',
|
|
15
|
+
taskCheckboxEmpty: '#AEA79F',
|
|
16
|
+
taskCheckboxFilled: '#0E8420', // Green
|
|
17
|
+
taskStateTodo: '#f6f5f4',
|
|
18
|
+
taskStateCompleted: '#AEA79F',
|
|
19
|
+
taskStateDelegated: '#77216F',
|
|
20
|
+
taskStateDelayed: '#C7162B', // Red
|
|
21
|
+
taskIndent: '#5c5c5c',
|
|
22
|
+
timelineBorder: '#5c5c5c',
|
|
23
|
+
timelineHeader: '#E95420',
|
|
24
|
+
timelineTimestamp: '#AEA79F',
|
|
25
|
+
timelineEventCreated: '#E95420',
|
|
26
|
+
timelineEventStarted: '#F99B11',
|
|
27
|
+
timelineEventCompleted: '#0E8420',
|
|
28
|
+
timelineEventDelegated: '#77216F',
|
|
29
|
+
timelineEventDelayed: '#C7162B',
|
|
30
|
+
separator: '#5c5c5c',
|
|
31
|
+
keyboardHint: '#AEA79F',
|
|
32
|
+
helpDialogBorder: '#E95420',
|
|
33
|
+
focusIndicator: '#E95420',
|
|
34
|
+
modalOverlay: '#1a0012',
|
|
35
|
+
modalBackground: '#300a24',
|
|
36
|
+
},
|
|
37
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Ubuntu Light (Yaru Light) theme - Official Ubuntu/Yaru palette
|
|
2
|
+
export const ubuntuLightTheme = {
|
|
3
|
+
name: 'ubuntu-light',
|
|
4
|
+
colors: {
|
|
5
|
+
background: '#fafafa',
|
|
6
|
+
foreground: '#3d3d3d',
|
|
7
|
+
border: '#cdcdcd',
|
|
8
|
+
calendarBorder: '#cdcdcd',
|
|
9
|
+
calendarHeader: '#e95420', // Ubuntu Orange
|
|
10
|
+
calendarToday: '#e95420',
|
|
11
|
+
calendarSelected: '#e95420',
|
|
12
|
+
calendarDayWithTasks: '#77216f', // Ubuntu Aubergine
|
|
13
|
+
calendarDayOtherMonth: '#929292',
|
|
14
|
+
taskBorder: '#cdcdcd',
|
|
15
|
+
taskHeader: '#e95420',
|
|
16
|
+
taskCheckboxEmpty: '#929292',
|
|
17
|
+
taskCheckboxFilled: '#0e8420', // Ubuntu Green
|
|
18
|
+
taskStateTodo: '#3d3d3d',
|
|
19
|
+
taskStateCompleted: '#929292',
|
|
20
|
+
taskStateDelegated: '#77216f',
|
|
21
|
+
taskStateDelayed: '#c7162b', // Ubuntu Red
|
|
22
|
+
taskIndent: '#cdcdcd',
|
|
23
|
+
timelineBorder: '#cdcdcd',
|
|
24
|
+
timelineHeader: '#e95420',
|
|
25
|
+
timelineTimestamp: '#929292',
|
|
26
|
+
timelineEventCreated: '#e95420',
|
|
27
|
+
timelineEventStarted: '#f99b11', // Light Orange
|
|
28
|
+
timelineEventCompleted: '#0e8420',
|
|
29
|
+
timelineEventDelegated: '#77216f',
|
|
30
|
+
timelineEventDelayed: '#c7162b',
|
|
31
|
+
separator: '#cdcdcd',
|
|
32
|
+
keyboardHint: '#929292',
|
|
33
|
+
helpDialogBorder: '#e95420',
|
|
34
|
+
focusIndicator: '#e95420',
|
|
35
|
+
modalOverlay: '#e8e8e8',
|
|
36
|
+
modalBackground: '#ffffff',
|
|
37
|
+
},
|
|
38
|
+
};
|
package/dist/themes/x.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// X (Twitter) Dark theme - Official X/Twitter dark mode colors (Dim mode)
|
|
2
|
+
export const xTheme = {
|
|
3
|
+
name: 'x',
|
|
4
|
+
colors: {
|
|
5
|
+
background: '#15202b', // X Dim background
|
|
6
|
+
foreground: '#f7f9f9',
|
|
7
|
+
border: '#38444d',
|
|
8
|
+
calendarBorder: '#38444d',
|
|
9
|
+
calendarHeader: '#1d9bf0', // X Blue
|
|
10
|
+
calendarToday: '#1d9bf0',
|
|
11
|
+
calendarSelected: '#1d9bf0',
|
|
12
|
+
calendarDayWithTasks: '#00ba7c', // Green
|
|
13
|
+
calendarDayOtherMonth: '#8b98a5', // Secondary text
|
|
14
|
+
taskBorder: '#38444d',
|
|
15
|
+
taskHeader: '#1d9bf0',
|
|
16
|
+
taskCheckboxEmpty: '#8b98a5',
|
|
17
|
+
taskCheckboxFilled: '#00ba7c',
|
|
18
|
+
taskStateTodo: '#f7f9f9',
|
|
19
|
+
taskStateCompleted: '#8b98a5',
|
|
20
|
+
taskStateDelegated: '#7856ff', // Purple
|
|
21
|
+
taskStateDelayed: '#f4212e', // Red
|
|
22
|
+
taskIndent: '#38444d',
|
|
23
|
+
timelineBorder: '#38444d',
|
|
24
|
+
timelineHeader: '#1d9bf0',
|
|
25
|
+
timelineTimestamp: '#8b98a5',
|
|
26
|
+
timelineEventCreated: '#1d9bf0',
|
|
27
|
+
timelineEventStarted: '#ffad1f', // Yellow
|
|
28
|
+
timelineEventCompleted: '#00ba7c',
|
|
29
|
+
timelineEventDelegated: '#7856ff',
|
|
30
|
+
timelineEventDelayed: '#f4212e',
|
|
31
|
+
separator: '#38444d',
|
|
32
|
+
keyboardHint: '#8b98a5',
|
|
33
|
+
helpDialogBorder: '#1d9bf0',
|
|
34
|
+
focusIndicator: '#1d9bf0',
|
|
35
|
+
modalOverlay: '#5b708366', // X dim overlay style
|
|
36
|
+
modalBackground: '#1e2d3d',
|
|
37
|
+
},
|
|
38
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// X (Twitter) Light theme - Official X/Twitter light mode colors
|
|
2
|
+
export const xLightTheme = {
|
|
3
|
+
name: 'x-light',
|
|
4
|
+
colors: {
|
|
5
|
+
background: '#ffffff',
|
|
6
|
+
foreground: '#0f1419', // Twitter black text
|
|
7
|
+
border: '#eff3f4',
|
|
8
|
+
calendarBorder: '#eff3f4',
|
|
9
|
+
calendarHeader: '#1d9bf0', // X Blue
|
|
10
|
+
calendarToday: '#1d9bf0',
|
|
11
|
+
calendarSelected: '#1d9bf0',
|
|
12
|
+
calendarDayWithTasks: '#00ba7c', // Green
|
|
13
|
+
calendarDayOtherMonth: '#536471', // Gray
|
|
14
|
+
taskBorder: '#eff3f4',
|
|
15
|
+
taskHeader: '#1d9bf0',
|
|
16
|
+
taskCheckboxEmpty: '#536471',
|
|
17
|
+
taskCheckboxFilled: '#00ba7c',
|
|
18
|
+
taskStateTodo: '#0f1419',
|
|
19
|
+
taskStateCompleted: '#536471',
|
|
20
|
+
taskStateDelegated: '#7856ff', // Purple
|
|
21
|
+
taskStateDelayed: '#f4212e', // Red (delayed = urgent)
|
|
22
|
+
taskIndent: '#eff3f4',
|
|
23
|
+
timelineBorder: '#eff3f4',
|
|
24
|
+
timelineHeader: '#1d9bf0',
|
|
25
|
+
timelineTimestamp: '#536471',
|
|
26
|
+
timelineEventCreated: '#1d9bf0',
|
|
27
|
+
timelineEventStarted: '#ffad1f', // Yellow
|
|
28
|
+
timelineEventCompleted: '#00ba7c',
|
|
29
|
+
timelineEventDelegated: '#7856ff',
|
|
30
|
+
timelineEventDelayed: '#f4212e',
|
|
31
|
+
separator: '#eff3f4',
|
|
32
|
+
keyboardHint: '#536471',
|
|
33
|
+
helpDialogBorder: '#1d9bf0',
|
|
34
|
+
focusIndicator: '#1d9bf0',
|
|
35
|
+
modalOverlay: '#00000033',
|
|
36
|
+
modalBackground: '#ffffff',
|
|
37
|
+
},
|
|
38
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface CalendarDate {
|
|
2
|
+
year: number;
|
|
3
|
+
month: number;
|
|
4
|
+
day: number;
|
|
5
|
+
}
|
|
6
|
+
export interface CalendarDay {
|
|
7
|
+
date: CalendarDate;
|
|
8
|
+
dateString: string;
|
|
9
|
+
isToday: boolean;
|
|
10
|
+
isSelected: boolean;
|
|
11
|
+
isCurrentMonth: boolean;
|
|
12
|
+
hasTasks: boolean;
|
|
13
|
+
taskCount: number;
|
|
14
|
+
}
|
|
15
|
+
export interface CalendarView {
|
|
16
|
+
year: number;
|
|
17
|
+
month: number;
|
|
18
|
+
weeks: CalendarDay[][];
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { TaskTree } from './task';
|
|
2
|
+
import { TimelineEvent } from './timeline';
|
|
3
|
+
export interface UserSettings {
|
|
4
|
+
theme: string;
|
|
5
|
+
defaultStartTime: 'now' | 'custom';
|
|
6
|
+
dateFormat: string;
|
|
7
|
+
timeFormat: '12h' | '24h';
|
|
8
|
+
}
|
|
9
|
+
export interface StorageSchema {
|
|
10
|
+
version: string;
|
|
11
|
+
tasks: TaskTree;
|
|
12
|
+
timeline: {
|
|
13
|
+
[date: string]: TimelineEvent[];
|
|
14
|
+
};
|
|
15
|
+
settings: UserSettings;
|
|
16
|
+
}
|
|
17
|
+
export interface StorageConfig {
|
|
18
|
+
filePath: string;
|
|
19
|
+
autoSave: boolean;
|
|
20
|
+
saveDebounceMs: number;
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type TaskState = 'todo' | 'completed' | 'delegated' | 'delayed';
|
|
2
|
+
export interface Task {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
state: TaskState;
|
|
6
|
+
createdAt: Date;
|
|
7
|
+
updatedAt: Date;
|
|
8
|
+
startTime?: Date;
|
|
9
|
+
endTime?: Date;
|
|
10
|
+
children: Task[];
|
|
11
|
+
parentId?: string;
|
|
12
|
+
date: string;
|
|
13
|
+
}
|
|
14
|
+
export interface TaskTree {
|
|
15
|
+
[date: string]: Task[];
|
|
16
|
+
}
|
|
17
|
+
export interface TaskStats {
|
|
18
|
+
total: number;
|
|
19
|
+
completed: number;
|
|
20
|
+
percentage: number;
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface ColorScheme {
|
|
2
|
+
background?: string;
|
|
3
|
+
foreground?: string;
|
|
4
|
+
border?: string;
|
|
5
|
+
calendarBorder?: string;
|
|
6
|
+
calendarHeader?: string;
|
|
7
|
+
calendarToday?: string;
|
|
8
|
+
calendarSelected?: string;
|
|
9
|
+
calendarDayWithTasks?: string;
|
|
10
|
+
calendarDayOtherMonth?: string;
|
|
11
|
+
taskBorder?: string;
|
|
12
|
+
taskHeader?: string;
|
|
13
|
+
taskCheckboxEmpty?: string;
|
|
14
|
+
taskCheckboxFilled?: string;
|
|
15
|
+
taskStateTodo?: string;
|
|
16
|
+
taskStateCompleted?: string;
|
|
17
|
+
taskStateDelegated?: string;
|
|
18
|
+
taskStateDelayed?: string;
|
|
19
|
+
taskIndent?: string;
|
|
20
|
+
timelineBorder?: string;
|
|
21
|
+
timelineHeader?: string;
|
|
22
|
+
timelineTimestamp?: string;
|
|
23
|
+
timelineEventCreated?: string;
|
|
24
|
+
timelineEventStarted?: string;
|
|
25
|
+
timelineEventCompleted?: string;
|
|
26
|
+
timelineEventDelegated?: string;
|
|
27
|
+
timelineEventDelayed?: string;
|
|
28
|
+
separator?: string;
|
|
29
|
+
keyboardHint?: string;
|
|
30
|
+
helpDialogBorder?: string;
|
|
31
|
+
focusIndicator?: string;
|
|
32
|
+
modalOverlay?: string;
|
|
33
|
+
modalBackground?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface Theme {
|
|
36
|
+
name: string;
|
|
37
|
+
colors: ColorScheme;
|
|
38
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { TaskState } from './task';
|
|
2
|
+
export declare enum TimelineEventType {
|
|
3
|
+
CREATED = "created",
|
|
4
|
+
STARTED = "started",
|
|
5
|
+
COMPLETED = "completed",
|
|
6
|
+
DELEGATED = "delegated",
|
|
7
|
+
DELAYED = "delayed",
|
|
8
|
+
UPDATED = "updated"
|
|
9
|
+
}
|
|
10
|
+
export interface TimelineEvent {
|
|
11
|
+
id: string;
|
|
12
|
+
taskId: string;
|
|
13
|
+
taskTitle: string;
|
|
14
|
+
type: TimelineEventType;
|
|
15
|
+
timestamp: Date;
|
|
16
|
+
previousState?: TaskState;
|
|
17
|
+
newState?: TaskState;
|
|
18
|
+
metadata?: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
export interface DayTimeline {
|
|
21
|
+
date: string;
|
|
22
|
+
events: TimelineEvent[];
|
|
23
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export var TimelineEventType;
|
|
2
|
+
(function (TimelineEventType) {
|
|
3
|
+
TimelineEventType["CREATED"] = "created";
|
|
4
|
+
TimelineEventType["STARTED"] = "started";
|
|
5
|
+
TimelineEventType["COMPLETED"] = "completed";
|
|
6
|
+
TimelineEventType["DELEGATED"] = "delegated";
|
|
7
|
+
TimelineEventType["DELAYED"] = "delayed";
|
|
8
|
+
TimelineEventType["UPDATED"] = "updated";
|
|
9
|
+
})(TimelineEventType || (TimelineEventType = {}));
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const formatDate: (date: Date, formatStr?: string) => string;
|
|
2
|
+
export declare const formatTime: (date: Date, format12h?: boolean) => string;
|
|
3
|
+
export declare const getDateString: (date: Date) => string;
|
|
4
|
+
export declare const parseDateString: (dateStr: string) => Date;
|
|
5
|
+
export declare const generateMonthCalendar: (year: number, month: number) => Date[][];
|
|
6
|
+
export declare const isToday: (date: Date) => boolean;
|
|
7
|
+
export declare const isSameDay: (date1: Date, date2: Date) => boolean;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { format, startOfMonth, endOfMonth, eachDayOfInterval, startOfWeek, endOfWeek } from 'date-fns';
|
|
2
|
+
export const formatDate = (date, formatStr = 'MMM d, yyyy') => {
|
|
3
|
+
return format(date, formatStr);
|
|
4
|
+
};
|
|
5
|
+
export const formatTime = (date, format12h = true) => {
|
|
6
|
+
return format(date, format12h ? 'h:mm a' : 'HH:mm');
|
|
7
|
+
};
|
|
8
|
+
export const getDateString = (date) => {
|
|
9
|
+
return format(date, 'yyyy-MM-dd');
|
|
10
|
+
};
|
|
11
|
+
export const parseDateString = (dateStr) => {
|
|
12
|
+
const [year, month, day] = dateStr.split('-').map(Number);
|
|
13
|
+
return new Date(year, month - 1, day);
|
|
14
|
+
};
|
|
15
|
+
export const generateMonthCalendar = (year, month) => {
|
|
16
|
+
const monthStart = startOfMonth(new Date(year, month, 1));
|
|
17
|
+
const monthEnd = endOfMonth(monthStart);
|
|
18
|
+
const calendarStart = startOfWeek(monthStart);
|
|
19
|
+
const calendarEnd = endOfWeek(monthEnd);
|
|
20
|
+
const days = eachDayOfInterval({ start: calendarStart, end: calendarEnd });
|
|
21
|
+
const weeks = [];
|
|
22
|
+
for (let i = 0; i < days.length; i += 7) {
|
|
23
|
+
weeks.push(days.slice(i, i + 7));
|
|
24
|
+
}
|
|
25
|
+
return weeks;
|
|
26
|
+
};
|
|
27
|
+
export const isToday = (date) => {
|
|
28
|
+
const today = new Date();
|
|
29
|
+
return (date.getDate() === today.getDate() &&
|
|
30
|
+
date.getMonth() === today.getMonth() &&
|
|
31
|
+
date.getFullYear() === today.getFullYear());
|
|
32
|
+
};
|
|
33
|
+
export const isSameDay = (date1, date2) => {
|
|
34
|
+
return (date1.getDate() === date2.getDate() &&
|
|
35
|
+
date1.getMonth() === date2.getMonth() &&
|
|
36
|
+
date1.getFullYear() === date2.getFullYear());
|
|
37
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
// Get app data directory
|
|
5
|
+
const getAppDataDir = () => {
|
|
6
|
+
const homeDir = os.homedir();
|
|
7
|
+
const platform = os.platform();
|
|
8
|
+
if (platform === 'darwin') {
|
|
9
|
+
return path.join(homeDir, 'Library', 'Application Support', 'epoch');
|
|
10
|
+
}
|
|
11
|
+
else if (platform === 'win32') {
|
|
12
|
+
return path.join(process.env.APPDATA || path.join(homeDir, 'AppData', 'Roaming'), 'epoch');
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
return path.join(homeDir, '.config', 'epoch');
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const LOG_FILE = path.join(getAppDataDir(), 'debug.log');
|
|
19
|
+
// Ensure directory exists
|
|
20
|
+
const ensureLogDir = () => {
|
|
21
|
+
const dir = path.dirname(LOG_FILE);
|
|
22
|
+
if (!fs.existsSync(dir)) {
|
|
23
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
// Clear log file on app start
|
|
27
|
+
export const initLogger = () => {
|
|
28
|
+
ensureLogDir();
|
|
29
|
+
fs.writeFileSync(LOG_FILE, `=== Epoch Debug Log - ${new Date().toISOString()} ===\n`);
|
|
30
|
+
};
|
|
31
|
+
// Log to file
|
|
32
|
+
export const log = (...args) => {
|
|
33
|
+
ensureLogDir();
|
|
34
|
+
const timestamp = new Date().toISOString();
|
|
35
|
+
const message = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)).join(' ');
|
|
36
|
+
fs.appendFileSync(LOG_FILE, `[${timestamp}] ${message}\n`);
|
|
37
|
+
};
|
|
38
|
+
// Export the log file path
|
|
39
|
+
export const getLogFilePath = () => LOG_FILE;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Task } from '../types/task';
|
|
2
|
+
export declare const findTaskById: (tasks: Task[], id: string) => Task | null;
|
|
3
|
+
export declare const updateTaskInTree: (tasks: Task[], id: string, updates: Partial<Task>) => Task[];
|
|
4
|
+
export declare const deleteTaskFromTree: (tasks: Task[], id: string) => Task[];
|
|
5
|
+
export declare const addSubtaskToTree: (tasks: Task[], parentId: string, newTask: Task) => Task[];
|
|
6
|
+
export declare const flattenTasks: (tasks: Task[]) => Task[];
|
|
7
|
+
export declare const getTaskStats: (tasks: Task[]) => {
|
|
8
|
+
total: number;
|
|
9
|
+
completed: number;
|
|
10
|
+
percentage: number;
|
|
11
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export const findTaskById = (tasks, id) => {
|
|
2
|
+
for (const task of tasks) {
|
|
3
|
+
if (task.id === id)
|
|
4
|
+
return task;
|
|
5
|
+
const found = findTaskById(task.children, id);
|
|
6
|
+
if (found)
|
|
7
|
+
return found;
|
|
8
|
+
}
|
|
9
|
+
return null;
|
|
10
|
+
};
|
|
11
|
+
export const updateTaskInTree = (tasks, id, updates) => {
|
|
12
|
+
return tasks.map(task => {
|
|
13
|
+
if (task.id === id) {
|
|
14
|
+
return { ...task, ...updates, updatedAt: new Date() };
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
...task,
|
|
18
|
+
children: updateTaskInTree(task.children, id, updates),
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
export const deleteTaskFromTree = (tasks, id) => {
|
|
23
|
+
return tasks
|
|
24
|
+
.filter(task => task.id !== id)
|
|
25
|
+
.map(task => ({
|
|
26
|
+
...task,
|
|
27
|
+
children: deleteTaskFromTree(task.children, id),
|
|
28
|
+
}));
|
|
29
|
+
};
|
|
30
|
+
export const addSubtaskToTree = (tasks, parentId, newTask) => {
|
|
31
|
+
return tasks.map(task => {
|
|
32
|
+
if (task.id === parentId) {
|
|
33
|
+
return {
|
|
34
|
+
...task,
|
|
35
|
+
children: [...task.children, newTask],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
...task,
|
|
40
|
+
children: addSubtaskToTree(task.children, parentId, newTask),
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
export const flattenTasks = (tasks) => {
|
|
45
|
+
const result = [];
|
|
46
|
+
const traverse = (taskList) => {
|
|
47
|
+
for (const task of taskList) {
|
|
48
|
+
result.push(task);
|
|
49
|
+
traverse(task.children);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
traverse(tasks);
|
|
53
|
+
return result;
|
|
54
|
+
};
|
|
55
|
+
export const getTaskStats = (tasks) => {
|
|
56
|
+
const flat = flattenTasks(tasks);
|
|
57
|
+
const total = flat.length;
|
|
58
|
+
const completed = flat.filter(t => t.state === 'completed').length;
|
|
59
|
+
return {
|
|
60
|
+
total,
|
|
61
|
+
completed,
|
|
62
|
+
percentage: total === 0 ? 0 : Math.round((completed / total) * 100),
|
|
63
|
+
};
|
|
64
|
+
};
|