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.
Files changed (147) hide show
  1. package/dist/App.d.ts +3 -0
  2. package/dist/App.js +38 -0
  3. package/dist/components/calendar/CalendarPane.d.ts +2 -0
  4. package/dist/components/calendar/CalendarPane.js +91 -0
  5. package/dist/components/calendar/DayCell.d.ts +7 -0
  6. package/dist/components/calendar/DayCell.js +26 -0
  7. package/dist/components/calendar/MonthView.d.ts +7 -0
  8. package/dist/components/calendar/MonthView.js +10 -0
  9. package/dist/components/common/BorderedBox.d.ts +18 -0
  10. package/dist/components/common/BorderedBox.js +29 -0
  11. package/dist/components/common/ClearTimelineDialog.d.ts +2 -0
  12. package/dist/components/common/ClearTimelineDialog.js +33 -0
  13. package/dist/components/common/FullscreenBackground.d.ts +11 -0
  14. package/dist/components/common/FullscreenBackground.js +12 -0
  15. package/dist/components/common/HelpDialog.d.ts +2 -0
  16. package/dist/components/common/HelpDialog.js +40 -0
  17. package/dist/components/common/Modal.d.ts +10 -0
  18. package/dist/components/common/Modal.js +15 -0
  19. package/dist/components/common/Separator.d.ts +8 -0
  20. package/dist/components/common/Separator.js +10 -0
  21. package/dist/components/common/ThemeDialog.d.ts +2 -0
  22. package/dist/components/common/ThemeDialog.js +117 -0
  23. package/dist/components/common/ThemedScreen.d.ts +22 -0
  24. package/dist/components/common/ThemedScreen.js +36 -0
  25. package/dist/components/common/ThemedText.d.ts +11 -0
  26. package/dist/components/common/ThemedText.js +20 -0
  27. package/dist/components/layout/Pane.d.ts +12 -0
  28. package/dist/components/layout/Pane.js +10 -0
  29. package/dist/components/layout/ThreeColumnLayout.d.ts +13 -0
  30. package/dist/components/layout/ThreeColumnLayout.js +22 -0
  31. package/dist/components/overview/OverviewScreen.d.ts +2 -0
  32. package/dist/components/overview/OverviewScreen.js +138 -0
  33. package/dist/components/tasks/TaskHeader.d.ts +7 -0
  34. package/dist/components/tasks/TaskHeader.js +8 -0
  35. package/dist/components/tasks/TaskItem.d.ts +10 -0
  36. package/dist/components/tasks/TaskItem.js +25 -0
  37. package/dist/components/tasks/TaskList.d.ts +11 -0
  38. package/dist/components/tasks/TaskList.js +11 -0
  39. package/dist/components/tasks/TasksPane.d.ts +2 -0
  40. package/dist/components/tasks/TasksPane.js +410 -0
  41. package/dist/components/timeline/TimelineEntry.d.ts +9 -0
  42. package/dist/components/timeline/TimelineEntry.js +26 -0
  43. package/dist/components/timeline/TimelinePane.d.ts +2 -0
  44. package/dist/components/timeline/TimelinePane.js +78 -0
  45. package/dist/contexts/AppContext.d.ts +47 -0
  46. package/dist/contexts/AppContext.js +104 -0
  47. package/dist/contexts/StorageContext.d.ts +15 -0
  48. package/dist/contexts/StorageContext.js +83 -0
  49. package/dist/contexts/ThemeContext.d.ts +15 -0
  50. package/dist/contexts/ThemeContext.js +44 -0
  51. package/dist/hooks/useKeyboardNav.d.ts +1 -0
  52. package/dist/hooks/useKeyboardNav.js +89 -0
  53. package/dist/hooks/useTerminalSize.d.ts +9 -0
  54. package/dist/hooks/useTerminalSize.js +34 -0
  55. package/dist/index.d.ts +2 -0
  56. package/dist/index.js +8 -0
  57. package/dist/services/calendarService.d.ts +18 -0
  58. package/dist/services/calendarService.js +57 -0
  59. package/dist/services/storage.d.ts +14 -0
  60. package/dist/services/storage.js +130 -0
  61. package/dist/services/taskService.d.ts +17 -0
  62. package/dist/services/taskService.js +106 -0
  63. package/dist/services/timelineService.d.ts +25 -0
  64. package/dist/services/timelineService.js +78 -0
  65. package/dist/themes/amazon.d.ts +2 -0
  66. package/dist/themes/amazon.js +37 -0
  67. package/dist/themes/amazonLight.d.ts +2 -0
  68. package/dist/themes/amazonLight.js +38 -0
  69. package/dist/themes/apple.d.ts +2 -0
  70. package/dist/themes/apple.js +38 -0
  71. package/dist/themes/appleLight.d.ts +2 -0
  72. package/dist/themes/appleLight.js +38 -0
  73. package/dist/themes/atomOneDark.d.ts +2 -0
  74. package/dist/themes/atomOneDark.js +37 -0
  75. package/dist/themes/atomOneLight.d.ts +2 -0
  76. package/dist/themes/atomOneLight.js +38 -0
  77. package/dist/themes/batman.d.ts +2 -0
  78. package/dist/themes/batman.js +37 -0
  79. package/dist/themes/catppuccin.d.ts +2 -0
  80. package/dist/themes/catppuccin.js +37 -0
  81. package/dist/themes/catppuccinLatte.d.ts +2 -0
  82. package/dist/themes/catppuccinLatte.js +38 -0
  83. package/dist/themes/claude.d.ts +2 -0
  84. package/dist/themes/claude.js +48 -0
  85. package/dist/themes/claudeCode.d.ts +2 -0
  86. package/dist/themes/claudeCode.js +47 -0
  87. package/dist/themes/cursor.d.ts +2 -0
  88. package/dist/themes/cursor.js +38 -0
  89. package/dist/themes/cursorLight.d.ts +2 -0
  90. package/dist/themes/cursorLight.js +38 -0
  91. package/dist/themes/dark.d.ts +2 -0
  92. package/dist/themes/dark.js +38 -0
  93. package/dist/themes/githubDark.d.ts +2 -0
  94. package/dist/themes/githubDark.js +37 -0
  95. package/dist/themes/githubLight.d.ts +2 -0
  96. package/dist/themes/githubLight.js +38 -0
  97. package/dist/themes/index.d.ts +9 -0
  98. package/dist/themes/index.js +83 -0
  99. package/dist/themes/instagram.d.ts +2 -0
  100. package/dist/themes/instagram.js +37 -0
  101. package/dist/themes/instagramLight.d.ts +2 -0
  102. package/dist/themes/instagramLight.js +38 -0
  103. package/dist/themes/intellij.d.ts +2 -0
  104. package/dist/themes/intellij.js +37 -0
  105. package/dist/themes/intellijLight.d.ts +2 -0
  106. package/dist/themes/intellijLight.js +38 -0
  107. package/dist/themes/light.d.ts +2 -0
  108. package/dist/themes/light.js +38 -0
  109. package/dist/themes/nord.d.ts +2 -0
  110. package/dist/themes/nord.js +37 -0
  111. package/dist/themes/nordLight.d.ts +2 -0
  112. package/dist/themes/nordLight.js +38 -0
  113. package/dist/themes/postman.d.ts +2 -0
  114. package/dist/themes/postman.js +37 -0
  115. package/dist/themes/postmanLight.d.ts +2 -0
  116. package/dist/themes/postmanLight.js +38 -0
  117. package/dist/themes/spiderman.d.ts +2 -0
  118. package/dist/themes/spiderman.js +37 -0
  119. package/dist/themes/terminal.d.ts +2 -0
  120. package/dist/themes/terminal.js +37 -0
  121. package/dist/themes/ubuntu.d.ts +2 -0
  122. package/dist/themes/ubuntu.js +37 -0
  123. package/dist/themes/ubuntuLight.d.ts +2 -0
  124. package/dist/themes/ubuntuLight.js +38 -0
  125. package/dist/themes/x.d.ts +2 -0
  126. package/dist/themes/x.js +38 -0
  127. package/dist/themes/xLight.d.ts +2 -0
  128. package/dist/themes/xLight.js +38 -0
  129. package/dist/types/calendar.d.ts +19 -0
  130. package/dist/types/calendar.js +1 -0
  131. package/dist/types/storage.d.ts +21 -0
  132. package/dist/types/storage.js +1 -0
  133. package/dist/types/task.d.ts +21 -0
  134. package/dist/types/task.js +1 -0
  135. package/dist/types/theme.d.ts +38 -0
  136. package/dist/types/theme.js +1 -0
  137. package/dist/types/timeline.d.ts +23 -0
  138. package/dist/types/timeline.js +9 -0
  139. package/dist/utils/date.d.ts +7 -0
  140. package/dist/utils/date.js +37 -0
  141. package/dist/utils/logger.d.ts +3 -0
  142. package/dist/utils/logger.js +39 -0
  143. package/dist/utils/tree.d.ts +11 -0
  144. package/dist/utils/tree.js +64 -0
  145. package/dist/utils/validation.d.ts +7 -0
  146. package/dist/utils/validation.js +35 -0
  147. 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,2 @@
1
+ import type { Theme } from '../types/theme';
2
+ export declare const postmanLightTheme: Theme;
@@ -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,2 @@
1
+ import type { Theme } from '../types/theme';
2
+ export declare const spidermanTheme: Theme;
@@ -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,2 @@
1
+ import type { Theme } from '../types/theme';
2
+ export declare const terminalTheme: Theme;
@@ -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,2 @@
1
+ import type { Theme } from '../types/theme';
2
+ export declare const ubuntuTheme: Theme;
@@ -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,2 @@
1
+ import type { Theme } from '../types/theme';
2
+ export declare const ubuntuLightTheme: Theme;
@@ -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
+ };
@@ -0,0 +1,2 @@
1
+ import type { Theme } from '../types/theme';
2
+ export declare const xTheme: Theme;
@@ -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,2 @@
1
+ import type { Theme } from '../types/theme';
2
+ export declare const xLightTheme: Theme;
@@ -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,3 @@
1
+ export declare const initLogger: () => void;
2
+ export declare const log: (...args: any[]) => void;
3
+ export declare const getLogFilePath: () => string;
@@ -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
+ };