@timelinekit/core 1.0.0 → 1.0.3

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 (232) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +200 -0
  3. package/dist/__tests__/calendar/sidebar/calendar-list.test.d.ts +1 -0
  4. package/dist/__tests__/calendar/sidebar/mini-calendar.test.d.ts +1 -0
  5. package/dist/__tests__/calendar/test-helpers.d.ts +169 -0
  6. package/dist/__tests__/calendar/tooltip/calendar-tooltip-renderer.test.d.ts +1 -0
  7. package/dist/__tests__/calendar/validation.test.d.ts +1 -0
  8. package/dist/__tests__/calendar/views/agenda-view.test.d.ts +1 -0
  9. package/dist/__tests__/calendar/views/day-view.test.d.ts +1 -0
  10. package/dist/__tests__/calendar/views/drag-handlers.test.d.ts +1 -0
  11. package/dist/__tests__/calendar/views/keyboard-navigation.test.d.ts +1 -0
  12. package/dist/__tests__/calendar/views/month-view.test.d.ts +1 -0
  13. package/dist/__tests__/calendar/views/swipe-navigation-handler.test.d.ts +1 -0
  14. package/dist/__tests__/calendar/views/time-grid-helper.test.d.ts +1 -0
  15. package/dist/__tests__/calendar/views/view-utils.test.d.ts +1 -0
  16. package/dist/__tests__/calendar/views/week-view.test.d.ts +1 -0
  17. package/dist/__tests__/ganttchart/model/dependency-evaluator.test.d.ts +1 -0
  18. package/dist/__tests__/ganttchart/model/task-filters.test.d.ts +1 -0
  19. package/dist/__tests__/ganttchart/model/task-link.test.d.ts +1 -0
  20. package/dist/calendar/clipboard/calendar-clipboard.d.ts +19 -0
  21. package/dist/calendar/eventcalendar-context.d.ts +157 -0
  22. package/dist/calendar/eventcalendar-engine.d.ts +80 -0
  23. package/dist/calendar/eventcalendar-events.d.ts +40 -0
  24. package/dist/calendar/eventcalendar-settings.d.ts +30 -0
  25. package/dist/calendar/export/calendar-data-exporter.d.ts +32 -0
  26. package/dist/calendar/export/calendar-icalendar-exporter.d.ts +24 -0
  27. package/dist/calendar/export/calendar-image-exporter.d.ts +17 -0
  28. package/dist/calendar/export/calendar-pdf-exporter.d.ts +30 -0
  29. package/dist/calendar/import/calendar-icalendar-importer.d.ts +30 -0
  30. package/dist/calendar/model/calendar-data.d.ts +34 -0
  31. package/dist/calendar/model/calendar-entry.d.ts +44 -0
  32. package/dist/calendar/model/calendar-item.d.ts +151 -0
  33. package/dist/calendar/model/calendar.d.ts +29 -0
  34. package/dist/calendar/model/recurrence-editor.d.ts +25 -0
  35. package/dist/calendar/model/recurrence-exception.d.ts +34 -0
  36. package/dist/calendar/model/recurrence-expander.d.ts +17 -0
  37. package/dist/calendar/model/recurrence-rule.d.ts +42 -0
  38. package/dist/calendar/sidebar/calendar-list.d.ts +13 -0
  39. package/dist/calendar/sidebar/mini-calendar.d.ts +20 -0
  40. package/dist/calendar/themes/dark-theme.d.ts +4 -0
  41. package/dist/calendar/themes/eventcalendar-theme.d.ts +156 -0
  42. package/dist/calendar/themes/light-theme.d.ts +4 -0
  43. package/dist/calendar/tooltip/calendar-tooltip-renderer.d.ts +8 -0
  44. package/dist/calendar/views/agenda-view.d.ts +12 -0
  45. package/dist/calendar/views/base-view.d.ts +23 -0
  46. package/dist/calendar/views/day-view.d.ts +11 -0
  47. package/dist/calendar/views/handlers/allday-drag-handler.d.ts +14 -0
  48. package/dist/calendar/views/handlers/allday-entry-drag-handler.d.ts +18 -0
  49. package/dist/calendar/views/handlers/month-drag-handler.d.ts +14 -0
  50. package/dist/calendar/views/handlers/month-entry-drag-handler.d.ts +18 -0
  51. package/dist/calendar/views/handlers/swipe-navigation-handler.d.ts +14 -0
  52. package/dist/calendar/views/handlers/time-grid-drag-handler.d.ts +14 -0
  53. package/dist/calendar/views/handlers/time-grid-entry-drag-handler.d.ts +18 -0
  54. package/dist/calendar/views/month-view.d.ts +13 -0
  55. package/dist/calendar/views/time-grid-helper.d.ts +36 -0
  56. package/dist/calendar/views/view-utils.d.ts +38 -0
  57. package/dist/calendar/views/week-view.d.ts +16 -0
  58. package/dist/common/base-background-renderer.d.ts +9 -6
  59. package/dist/common/base-chart-handler.d.ts +19 -13
  60. package/dist/common/base-chart-handlers.d.ts +34 -0
  61. package/dist/common/base-chart-scroll-handler.d.ts +5 -3
  62. package/dist/common/base-chart.d.ts +98 -0
  63. package/dist/common/base-divider.d.ts +2 -0
  64. package/dist/common/base-engine.d.ts +112 -0
  65. package/dist/common/base-export-renderer.d.ts +26 -0
  66. package/dist/common/base-header-renderer.d.ts +8 -6
  67. package/dist/common/base-markers-renderer.d.ts +9 -6
  68. package/dist/common/base-theme.d.ts +107 -0
  69. package/dist/common/base-tooltip-renderer.d.ts +7 -0
  70. package/dist/common/chart-time-axis.d.ts +32 -0
  71. package/dist/common/common.d.ts +12 -2
  72. package/dist/common/custom-properties-container.d.ts +14 -0
  73. package/dist/common/drawing.d.ts +8 -2
  74. package/dist/common/export-utils.d.ts +34 -7
  75. package/dist/common/functions.d.ts +1 -1
  76. package/dist/common/locale.d.ts +101 -0
  77. package/dist/common/marker.d.ts +13 -0
  78. package/dist/common/subscription-manager.d.ts +17 -0
  79. package/dist/common/text.d.ts +9 -9
  80. package/dist/common/theme-utils.d.ts +5 -0
  81. package/dist/common/timeline-theme.d.ts +107 -0
  82. package/dist/common/undo-manager.d.ts +22 -0
  83. package/dist/common/working-calendar.d.ts +57 -0
  84. package/dist/ganttchart/chart/chart-scroll-handler.d.ts +1 -1
  85. package/dist/ganttchart/chart/chart-time-axis.d.ts +2 -32
  86. package/dist/ganttchart/chart/chart.d.ts +10 -4
  87. package/dist/ganttchart/chart/handlers/add-task-part.d.ts +14 -7
  88. package/dist/ganttchart/chart/handlers/connector-dots-handler.d.ts +10 -8
  89. package/dist/ganttchart/chart/handlers/gantt-drag-handler.d.ts +32 -0
  90. package/dist/ganttchart/chart/handlers/handler.d.ts +7 -4
  91. package/dist/ganttchart/chart/handlers/handlers.d.ts +5 -10
  92. package/dist/ganttchart/chart/handlers/move-milestone.d.ts +9 -7
  93. package/dist/ganttchart/chart/handlers/move-task-part.d.ts +9 -7
  94. package/dist/ganttchart/chart/handlers/resize-task-part.d.ts +18 -7
  95. package/dist/ganttchart/chart/handlers/select-link.d.ts +8 -6
  96. package/dist/ganttchart/chart/handlers/select-task.d.ts +13 -11
  97. package/dist/ganttchart/chart/handlers/set-task-progress.d.ts +14 -7
  98. package/dist/ganttchart/chart/renderers/chart-background-renderer.d.ts +3 -2
  99. package/dist/ganttchart/chart/renderers/chart-header-renderer.d.ts +2 -2
  100. package/dist/ganttchart/chart/renderers/chart-links-renderer.d.ts +4 -3
  101. package/dist/ganttchart/chart/renderers/chart-markers-renderer.d.ts +2 -2
  102. package/dist/ganttchart/chart/renderers/chart-tasks-renderer.d.ts +9 -9
  103. package/dist/ganttchart/chart/renderers/renderer-base.d.ts +2 -1
  104. package/dist/ganttchart/chart/tooltip/chart-tooltip-renderer.d.ts +4 -6
  105. package/dist/ganttchart/clipboard.d.ts +10 -3
  106. package/dist/ganttchart/divider/divider.d.ts +1 -1
  107. package/dist/ganttchart/export/data-exporter.d.ts +12 -7
  108. package/dist/ganttchart/export/export-common.d.ts +16 -16
  109. package/dist/ganttchart/export/image-exporter.d.ts +5 -4
  110. package/dist/ganttchart/export/pdf-exporter.d.ts +7 -6
  111. package/dist/ganttchart/ganttchart-engine.d.ts +134 -40
  112. package/dist/ganttchart/locale.d.ts +2 -66
  113. package/dist/ganttchart/model/dependency-evaluator.d.ts +16 -0
  114. package/dist/ganttchart/model/lag.d.ts +11 -0
  115. package/dist/ganttchart/model/length.d.ts +13 -2
  116. package/dist/ganttchart/model/marker.d.ts +1 -7
  117. package/dist/ganttchart/model/rate.d.ts +7 -1
  118. package/dist/ganttchart/model/resource-list.d.ts +11 -0
  119. package/dist/ganttchart/model/resource.d.ts +15 -1
  120. package/dist/ganttchart/model/task-filters.d.ts +10 -0
  121. package/dist/ganttchart/model/task-link.d.ts +15 -2
  122. package/dist/ganttchart/model/task-list-adapter.d.ts +22 -0
  123. package/dist/ganttchart/model/task-list.d.ts +55 -2
  124. package/dist/ganttchart/model/task-part.d.ts +20 -0
  125. package/dist/ganttchart/model/task-parts-manager.d.ts +44 -0
  126. package/dist/ganttchart/model/task-resource.d.ts +11 -0
  127. package/dist/ganttchart/model/task-serializer.d.ts +5 -0
  128. package/dist/ganttchart/model/task-warnings.d.ts +4 -0
  129. package/dist/ganttchart/model/task.d.ts +92 -19
  130. package/dist/ganttchart/model/work.d.ts +14 -1
  131. package/dist/ganttchart/model/working-calendar.d.ts +2 -32
  132. package/dist/ganttchart/sheet/renderers/sheet-icons-cell-renderer.d.ts +2 -0
  133. package/dist/ganttchart/sheet/sheet.d.ts +12 -7
  134. package/dist/ganttchart/themes/theme.d.ts +63 -108
  135. package/dist/ganttchart/undo-manager.d.ts +1 -13
  136. package/dist/index.d.ts +77 -8
  137. package/dist/index.js +6 -1
  138. package/dist/licensing/features.d.ts +3 -1
  139. package/dist/licensing/license-key.d.ts +1 -0
  140. package/dist/licensing/license-manager.d.ts +4 -1
  141. package/dist/licensing/watermark.d.ts +1 -0
  142. package/dist/locales/cs.d.ts +1 -1
  143. package/dist/locales/cs.js +1 -0
  144. package/dist/locales/de.d.ts +1 -1
  145. package/dist/locales/de.js +1 -0
  146. package/dist/locales/es.d.ts +1 -1
  147. package/dist/locales/es.js +1 -0
  148. package/dist/locales/fr.d.ts +1 -1
  149. package/dist/locales/fr.js +1 -0
  150. package/dist/locales/it.d.ts +1 -1
  151. package/dist/locales/it.js +1 -0
  152. package/dist/locales/ja.d.ts +1 -1
  153. package/dist/locales/ja.js +1 -0
  154. package/dist/locales/ko.d.ts +1 -1
  155. package/dist/locales/ko.js +1 -0
  156. package/dist/locales/nl.d.ts +1 -1
  157. package/dist/locales/nl.js +1 -0
  158. package/dist/locales/pl.d.ts +1 -1
  159. package/dist/locales/pl.js +1 -0
  160. package/dist/locales/pt.d.ts +1 -1
  161. package/dist/locales/pt.js +1 -0
  162. package/dist/locales/ru.d.ts +1 -1
  163. package/dist/locales/ru.js +1 -0
  164. package/dist/locales/sv.d.ts +1 -1
  165. package/dist/locales/sv.js +1 -0
  166. package/dist/locales/zh.d.ts +1 -1
  167. package/dist/locales/zh.js +1 -0
  168. package/dist/resourcescheduler/chart/handlers/add-event.d.ts +15 -8
  169. package/dist/resourcescheduler/chart/handlers/move-event.d.ts +10 -8
  170. package/dist/resourcescheduler/chart/handlers/resize-event.d.ts +21 -8
  171. package/dist/resourcescheduler/chart/handlers/scheduler-drag-handler.d.ts +32 -0
  172. package/dist/resourcescheduler/chart/handlers/scheduler-handler.d.ts +5 -3
  173. package/dist/resourcescheduler/chart/handlers/scheduler-handlers.d.ts +9 -10
  174. package/dist/resourcescheduler/chart/handlers/select-event.d.ts +10 -8
  175. package/dist/resourcescheduler/chart/renderers/scheduler-background-renderer.d.ts +2 -1
  176. package/dist/resourcescheduler/chart/renderers/scheduler-events-renderer.d.ts +2 -1
  177. package/dist/resourcescheduler/chart/renderers/scheduler-renderer-base.d.ts +1 -0
  178. package/dist/resourcescheduler/chart/scheduler-chart.d.ts +9 -4
  179. package/dist/resourcescheduler/chart/tooltip/scheduler-tooltip-renderer.d.ts +2 -4
  180. package/dist/resourcescheduler/clipboard.d.ts +8 -0
  181. package/dist/resourcescheduler/export/scheduler-data-exporter.d.ts +5 -0
  182. package/dist/resourcescheduler/export/scheduler-export-common.d.ts +12 -7
  183. package/dist/resourcescheduler/export/scheduler-image-exporter.d.ts +2 -1
  184. package/dist/resourcescheduler/export/scheduler-pdf-exporter.d.ts +3 -1
  185. package/dist/resourcescheduler/model/scheduler-data-adapter.d.ts +1 -0
  186. package/dist/resourcescheduler/model/scheduler-data.d.ts +45 -2
  187. package/dist/resourcescheduler/model/scheduler-event.d.ts +22 -2
  188. package/dist/resourcescheduler/model/scheduler-layout-calculator.d.ts +18 -0
  189. package/dist/resourcescheduler/model/scheduler-resource.d.ts +21 -2
  190. package/dist/resourcescheduler/resourcescheduler-engine.d.ts +134 -42
  191. package/dist/resourcescheduler/sheet/renderers/scheduler-icon-cell-renderer.d.ts +2 -0
  192. package/dist/resourcescheduler/sheet/scheduler-sheet.d.ts +11 -6
  193. package/dist/resourcescheduler/themes/scheduler-themes.d.ts +13 -0
  194. package/dist/styles/ec.css +1 -0
  195. package/dist/styles/gc.css +1 -1
  196. package/dist/styles/index.css +1 -0
  197. package/dist/styles/rs.css +1 -0
  198. package/dist/table/editors/input-editor.d.ts +1 -0
  199. package/dist/table/table-column.d.ts +7 -1
  200. package/dist/table/table-data-source.d.ts +2 -0
  201. package/dist/table/table-rows-selection.d.ts +1 -0
  202. package/dist/table/table.d.ts +11 -0
  203. package/dist/table/tree-table.d.ts +2 -0
  204. package/package.json +17 -6
  205. package/styles/_common.scss +12 -1
  206. package/styles/ec.scss +1225 -0
  207. package/styles/index.scss +3 -0
  208. package/dist/ganttchart/model/sheet-column.d.ts +0 -27
  209. package/dist/ganttchart/sheet/editors/cell-editor.d.ts +0 -23
  210. package/dist/ganttchart/sheet/editors/currency-editor.d.ts +0 -6
  211. package/dist/ganttchart/sheet/editors/date-editor.d.ts +0 -6
  212. package/dist/ganttchart/sheet/editors/decimal-editor.d.ts +0 -6
  213. package/dist/ganttchart/sheet/editors/dialog-editor.d.ts +0 -17
  214. package/dist/ganttchart/sheet/editors/input-editor.d.ts +0 -19
  215. package/dist/ganttchart/sheet/editors/integer-editor.d.ts +0 -6
  216. package/dist/ganttchart/sheet/editors/percent-editor.d.ts +0 -6
  217. package/dist/ganttchart/sheet/editors/text-editor.d.ts +0 -5
  218. package/dist/ganttchart/sheet/sheet-keyboard-navigation.d.ts +0 -26
  219. package/dist/ganttchart/sheet/sheet-rows-selection.d.ts +0 -24
  220. /package/dist/__tests__/{critical-path-calculator.test.d.ts → calendar/calendar-clipboard.test.d.ts} +0 -0
  221. /package/dist/__tests__/{model/lag.test.d.ts → calendar/eventcalendar-engine.test.d.ts} +0 -0
  222. /package/dist/__tests__/{model/length.test.d.ts → calendar/export/calendar-data-export.test.d.ts} +0 -0
  223. /package/dist/__tests__/{model/resource-list.test.d.ts → calendar/export/calendar-export.test.d.ts} +0 -0
  224. /package/dist/__tests__/{model/resource.test.d.ts → calendar/export/calendar-icalendar.test.d.ts} +0 -0
  225. /package/dist/__tests__/{model/task-list.test.d.ts → calendar/model/calendar-data.test.d.ts} +0 -0
  226. /package/dist/__tests__/{model/task-part.test.d.ts → calendar/model/calendar-item-recurrence.test.d.ts} +0 -0
  227. /package/dist/__tests__/{model/task-resource.test.d.ts → calendar/model/calendar-item-types.test.d.ts} +0 -0
  228. /package/dist/__tests__/{model/task-warnings.test.d.ts → calendar/model/calendar-occurrence.test.d.ts} +0 -0
  229. /package/dist/__tests__/{model/task.test.d.ts → calendar/model/calendar.test.d.ts} +0 -0
  230. /package/dist/__tests__/{model/work.test.d.ts → calendar/model/recurrence-editor.test.d.ts} +0 -0
  231. /package/dist/__tests__/{model/working-calendar.test.d.ts → calendar/model/recurrence-expander.test.d.ts} +0 -0
  232. /package/dist/__tests__/{undo-manager.test.d.ts → calendar/model/recurrence-rule.test.d.ts} +0 -0
package/styles/ec.scss ADDED
@@ -0,0 +1,1225 @@
1
+ .ec-host {
2
+ display: block;
3
+ height: 100%;
4
+ overflow: hidden;
5
+
6
+ *, *::before, *::after {
7
+ box-sizing: border-box;
8
+ }
9
+ }
10
+
11
+ .ec-wrapper {
12
+ width: 100%;
13
+ height: 100%;
14
+ display: flex;
15
+ color: var(--ec-content-text, #333333);
16
+ background: var(--ec-content-bg, #ffffff);
17
+ outline: none;
18
+
19
+ &::-webkit-scrollbar {
20
+ width: 8px;
21
+ height: 8px;
22
+ }
23
+ &::-webkit-scrollbar-thumb {
24
+ background: var(--ec-scrollbar-thumb, #c1c1c1);
25
+ border-radius: 4px;
26
+ }
27
+ &::-webkit-scrollbar-track {
28
+ background: var(--ec-scrollbar-track, #f1f1f1);
29
+ }
30
+ }
31
+
32
+ // ─── Sidebar ───────────────────────────────────
33
+
34
+ .ec-sidebar {
35
+ width: var(--ec-sidebar-width, 256px);
36
+ flex-shrink: 0;
37
+ border-right: 1px solid var(--ec-sidebar-border, #e0e0e0);
38
+ background: var(--ec-sidebar-bg, #ffffff);
39
+ color: var(--ec-sidebar-text, #333333);
40
+ overflow-y: auto;
41
+ }
42
+
43
+ // ─── Main area ─────────────────────────────────
44
+
45
+ .ec-main {
46
+ flex: 1;
47
+ display: flex;
48
+ flex-direction: column;
49
+ min-width: 0;
50
+ overflow: hidden;
51
+ }
52
+
53
+ // ─── Toolbar ───────────────────────────────────
54
+
55
+ .ec-toolbar {
56
+ display: flex;
57
+ align-items: center;
58
+ height: var(--ec-toolbar-height, 48px);
59
+ padding: 0 12px;
60
+ background: var(--ec-toolbar-bg, #ffffff);
61
+ border-bottom: 1px solid var(--ec-toolbar-border, #e0e0e0);
62
+ flex-shrink: 0;
63
+ gap: 8px;
64
+ user-select: none;
65
+ }
66
+
67
+ .ec-toolbar-nav {
68
+ display: flex;
69
+ align-items: center;
70
+ gap: 4px;
71
+ margin-right: auto;
72
+ }
73
+
74
+ .ec-toolbar-btn {
75
+ border: none;
76
+ background: transparent;
77
+ color: var(--ec-toolbar-btn-color, #555555);
78
+ cursor: pointer;
79
+ padding: 4px 10px;
80
+ border-radius: 4px;
81
+ font: inherit;
82
+ font-size: 14px;
83
+ line-height: 1.5;
84
+
85
+ &:hover {
86
+ background: var(--ec-toolbar-btn-hover-bg, #f0f0f0);
87
+ }
88
+ }
89
+
90
+ .ec-toolbar-nav-btn {
91
+ font-size: 22px;
92
+ line-height: 1;
93
+ width: 32px;
94
+ height: 32px;
95
+ }
96
+
97
+ .ec-toolbar-today {
98
+ font-weight: 500;
99
+ }
100
+
101
+ .ec-toolbar-title {
102
+ font-size: 18px;
103
+ font-weight: 600;
104
+ color: var(--ec-toolbar-text, #333333);
105
+ padding: 0 8px;
106
+ white-space: nowrap;
107
+ }
108
+
109
+ .ec-toolbar-views {
110
+ display: flex;
111
+ align-items: center;
112
+ gap: 2px;
113
+ }
114
+
115
+ .ec-toolbar-view-btn {
116
+ &.ec-active {
117
+ background: var(--ec-toolbar-active-bg, #e8f0fe);
118
+ color: var(--ec-toolbar-active-text, #1a73e8);
119
+ }
120
+ }
121
+
122
+ // ─── View container ────────────────────────────
123
+
124
+ .ec-view-container {
125
+ flex: 1;
126
+ overflow: hidden;
127
+ position: relative;
128
+ }
129
+
130
+ // ─── Month view ────────────────────────────────
131
+
132
+ .ec-month-view {
133
+ height: 100%;
134
+ display: flex;
135
+ flex-direction: column;
136
+ }
137
+
138
+ .ec-month-header {
139
+ display: flex;
140
+ background: var(--ec-header-bg, #ffffff);
141
+ border-bottom: 1px solid var(--ec-header-border, #e0e0e0);
142
+ flex-shrink: 0;
143
+ }
144
+
145
+ .ec-month-header-cell {
146
+ flex: 1;
147
+ text-align: center;
148
+ padding: 6px 0;
149
+ font-size: 11px;
150
+ font-weight: 500;
151
+ text-transform: uppercase;
152
+ color: var(--ec-header-text, #555555);
153
+ }
154
+
155
+ .ec-month-grid {
156
+ flex: 1;
157
+ display: flex;
158
+ flex-direction: column;
159
+ overflow: hidden;
160
+ }
161
+
162
+ .ec-month-week {
163
+ flex: 1;
164
+ display: flex;
165
+ min-height: 0;
166
+ position: relative;
167
+ }
168
+
169
+ .ec-month-day {
170
+ flex: 1;
171
+ border-right: 1px solid var(--ec-grid-line, #e0e0e0);
172
+ border-bottom: 1px solid var(--ec-grid-line, #e0e0e0);
173
+ overflow: hidden;
174
+ min-width: 0;
175
+ cursor: default;
176
+
177
+ &:last-child {
178
+ border-right: none;
179
+ }
180
+
181
+ &:hover {
182
+ background: var(--ec-hover-bg, rgba(0, 0, 0, 0.04));
183
+ }
184
+
185
+ &.ec-today {
186
+ background: var(--ec-today-bg, #e8f0fe);
187
+ }
188
+
189
+ &.ec-month-day-drag {
190
+ background: var(--ec-drag-highlight, rgba(3, 155, 229, 0.15));
191
+ }
192
+
193
+ &.ec-other-month {
194
+ background: var(--ec-other-month-bg, #fafafa);
195
+
196
+ .ec-month-day-header {
197
+ color: var(--ec-other-month-text, #b0b0b0);
198
+ }
199
+ }
200
+ }
201
+
202
+ .ec-month-day-header {
203
+ padding: 4px 6px;
204
+ font-size: 12px;
205
+ font-weight: 500;
206
+ color: var(--ec-content-text, #333333);
207
+ height: var(--ec-day-header-height, 24px);
208
+ line-height: calc(var(--ec-day-header-height, 24px) - 8px);
209
+ }
210
+
211
+ .ec-month-day-entries {
212
+ display: flex;
213
+ flex-direction: column;
214
+ gap: var(--ec-entry-gap, 2px);
215
+ padding: 0 2px;
216
+ overflow: hidden;
217
+ }
218
+
219
+ // ─── Entry elements ────────────────────────────
220
+
221
+ .ec-entry {
222
+ height: var(--ec-entry-height, 22px);
223
+ line-height: var(--ec-entry-height, 22px);
224
+ border-radius: var(--ec-entry-radius, 4px);
225
+ padding: 0 4px;
226
+ font-size: 11px;
227
+ white-space: nowrap;
228
+ overflow: hidden;
229
+ text-overflow: ellipsis;
230
+ cursor: pointer;
231
+ flex-shrink: 0;
232
+ user-select: none;
233
+
234
+ &:hover {
235
+ opacity: 0.85;
236
+ }
237
+ }
238
+
239
+ .ec-entry-multiday {
240
+ background: var(--ec-entry-chip-bg, #d3e3fd);
241
+ color: var(--ec-entry-chip-text, #1b4fa3);
242
+ }
243
+
244
+ .ec-entry-single {
245
+ background: var(--ec-entry-chip-bg, #d3e3fd);
246
+ color: var(--ec-entry-chip-text, #1b4fa3);
247
+ }
248
+
249
+ // ─── Response status modifiers ────────────────
250
+
251
+ // Tentative: diagonal stripes over transparent background
252
+ .ec-entry-tentative {
253
+ background: repeating-linear-gradient(
254
+ -45deg,
255
+ transparent,
256
+ transparent 2px,
257
+ var(--ec-entry-stripe-color, #d3e3fd) 2px,
258
+ var(--ec-entry-stripe-color, #d3e3fd) 4px
259
+ ) !important;
260
+ }
261
+
262
+ // Needs action: outline only, dashed border
263
+ .ec-entry-needs-action {
264
+ background: var(--ec-content-bg, #ffffff) !important;
265
+ border: 1px dashed var(--ec-entry-status-color, #999999);
266
+ border-left: var(--ec-entry-accent-width, 3px) dashed var(--ec-entry-status-color, #999999);
267
+ }
268
+
269
+ // Declined: outline only, muted text, strikethrough
270
+ .ec-entry-declined {
271
+ background: var(--ec-content-bg, #ffffff) !important;
272
+ opacity: var(--ec-declined-opacity, 0.55);
273
+
274
+ .ec-tg-entry-title,
275
+ & {
276
+ text-decoration: line-through;
277
+ }
278
+ }
279
+
280
+ // ─── Entry icons ──────────────────────────────────
281
+
282
+ .ec-entry-icon {
283
+ display: inline-flex;
284
+ align-items: center;
285
+ vertical-align: text-bottom;
286
+ flex-shrink: 0;
287
+ margin-right: 3px;
288
+
289
+ svg {
290
+ width: 14px;
291
+ height: 14px;
292
+ }
293
+ }
294
+
295
+ .ec-entry-multiday .ec-entry-icon svg,
296
+ .ec-entry-single .ec-entry-icon svg {
297
+ width: 12px;
298
+ height: 12px;
299
+ }
300
+
301
+ .ec-month-day-more {
302
+ padding: 0 6px;
303
+ font-size: 11px;
304
+ color: var(--ec-more-text, #555555);
305
+ cursor: pointer;
306
+
307
+ &:hover {
308
+ text-decoration: underline;
309
+ }
310
+ }
311
+
312
+ // ─── Mini calendar (sidebar) ───────────────────
313
+
314
+ .ec-mini-calendar {
315
+ padding: 12px;
316
+ user-select: none;
317
+ }
318
+
319
+ .ec-mini-header {
320
+ display: flex;
321
+ align-items: center;
322
+ margin-bottom: 8px;
323
+ }
324
+
325
+ .ec-mini-nav-btn {
326
+ border: none;
327
+ background: transparent;
328
+ color: var(--ec-sidebar-text, #333333);
329
+ cursor: pointer;
330
+ width: 28px;
331
+ height: 28px;
332
+ border-radius: 50%;
333
+ font-size: 16px;
334
+ line-height: 28px;
335
+ text-align: center;
336
+ padding: 0;
337
+
338
+ &:hover {
339
+ background: var(--ec-mini-hover-bg, #f0f0f0);
340
+ }
341
+ }
342
+
343
+ .ec-mini-title {
344
+ flex: 1;
345
+ border: none;
346
+ background: transparent;
347
+ color: var(--ec-sidebar-text, #333333);
348
+ cursor: pointer;
349
+ font: inherit;
350
+ font-size: 13px;
351
+ font-weight: 500;
352
+ text-align: center;
353
+ padding: 4px 0;
354
+ border-radius: 4px;
355
+
356
+ &:hover {
357
+ background: var(--ec-mini-hover-bg, #f0f0f0);
358
+ }
359
+ }
360
+
361
+ .ec-mini-daynames {
362
+ display: grid;
363
+ grid-template-columns: repeat(7, 1fr);
364
+ margin-bottom: 2px;
365
+ }
366
+
367
+ .ec-mini-dayname {
368
+ text-align: center;
369
+ font-size: 10px;
370
+ font-weight: 500;
371
+ color: var(--ec-sidebar-text, #333333);
372
+ line-height: 24px;
373
+
374
+ &.ec-mini-weekend {
375
+ color: var(--ec-mini-weekend-text, #777777);
376
+ }
377
+ }
378
+
379
+ .ec-mini-grid {
380
+ display: flex;
381
+ flex-direction: column;
382
+ gap: 0;
383
+ }
384
+
385
+ .ec-mini-row {
386
+ display: grid;
387
+ grid-template-columns: repeat(7, 1fr);
388
+ border: 1px solid transparent;
389
+ border-radius: 14px;
390
+
391
+ &.ec-mini-week-selected {
392
+ border-color: var(--ec-mini-selected-text, #1a73e8);
393
+ }
394
+ }
395
+
396
+ // ─── Day cells ─────────────────────────────────
397
+
398
+ .ec-mini-day {
399
+ border: none;
400
+ background: transparent;
401
+ color: var(--ec-sidebar-text, #333333);
402
+ cursor: pointer;
403
+ font: inherit;
404
+ font-size: 11px;
405
+ width: 28px;
406
+ height: 28px;
407
+ line-height: 28px;
408
+ text-align: center;
409
+ padding: 0;
410
+ border-radius: 50%;
411
+ position: relative;
412
+ justify-self: center;
413
+
414
+ &:hover {
415
+ background: var(--ec-mini-hover-bg, #f0f0f0);
416
+ }
417
+
418
+ &.ec-mini-other-month {
419
+ color: var(--ec-mini-other-month-text, #b0b0b0);
420
+ }
421
+
422
+ &.ec-mini-weekend {
423
+ color: var(--ec-mini-weekend-text, #777777);
424
+ }
425
+
426
+ // Today: filled circle
427
+ &.ec-mini-today {
428
+ background: var(--ec-mini-today-bg, #1a73e8);
429
+ color: var(--ec-mini-today-text, #ffffff);
430
+ font-weight: 600;
431
+
432
+ &:hover {
433
+ opacity: 0.85;
434
+ }
435
+ }
436
+
437
+ // Selected day (viewMode = day)
438
+ &.ec-mini-selected:not(.ec-mini-today) {
439
+ background: var(--ec-mini-selected-bg, #e8f0fe);
440
+ color: var(--ec-mini-selected-text, #1a73e8);
441
+ font-weight: 600;
442
+ }
443
+
444
+
445
+ // Event dot indicator
446
+ &.ec-mini-has-events::after {
447
+ content: '';
448
+ position: absolute;
449
+ bottom: 2px;
450
+ left: 50%;
451
+ transform: translateX(-50%);
452
+ width: 4px;
453
+ height: 4px;
454
+ border-radius: 50%;
455
+ background: var(--ec-mini-dot-color, #1a73e8);
456
+ }
457
+
458
+ &.ec-mini-today.ec-mini-has-events::after {
459
+ background: var(--ec-mini-today-dot, #ffffff);
460
+ }
461
+ }
462
+
463
+ // ─── Month picker mode ─────────────────────────
464
+
465
+ .ec-mini-grid-months {
466
+ .ec-mini-row {
467
+ grid-template-columns: repeat(3, 1fr);
468
+ }
469
+ }
470
+
471
+ .ec-mini-month {
472
+ border: none;
473
+ background: transparent;
474
+ color: var(--ec-sidebar-text, #333333);
475
+ cursor: pointer;
476
+ font: inherit;
477
+ font-size: 12px;
478
+ padding: 10px 0;
479
+ border-radius: 16px;
480
+ text-align: center;
481
+
482
+ &:hover {
483
+ background: var(--ec-mini-hover-bg, #f0f0f0);
484
+ }
485
+
486
+ &.ec-mini-selected {
487
+ background: var(--ec-mini-selected-bg, #e8f0fe);
488
+ color: var(--ec-mini-selected-text, #1a73e8);
489
+ font-weight: 600;
490
+ }
491
+ }
492
+
493
+ // ─── Calendar list (sidebar) ──────────────────
494
+
495
+ .ec-calendar-list {
496
+ padding: 12px;
497
+ border-top: 1px solid var(--ec-sidebar-border, #e0e0e0);
498
+ }
499
+
500
+ .ec-calendar-list-header {
501
+ font-size: 11px;
502
+ font-weight: 600;
503
+ text-transform: uppercase;
504
+ color: var(--ec-cal-list-header-text, #555555);
505
+ margin-bottom: 8px;
506
+ letter-spacing: 0.5px;
507
+ }
508
+
509
+ .ec-calendar-list-items {
510
+ display: flex;
511
+ flex-direction: column;
512
+ gap: 2px;
513
+ }
514
+
515
+ .ec-calendar-list-item {
516
+ display: flex;
517
+ align-items: center;
518
+ gap: 8px;
519
+ padding: 4px 4px;
520
+ border-radius: 4px;
521
+ cursor: default;
522
+
523
+ &:hover {
524
+ background: var(--ec-mini-hover-bg, #f0f0f0);
525
+
526
+ .ec-calendar-list-remove {
527
+ opacity: 1;
528
+ }
529
+ }
530
+ }
531
+
532
+ .ec-calendar-list-checkbox {
533
+ width: 16px;
534
+ height: 16px;
535
+ border-radius: 3px;
536
+ border: 2px solid;
537
+ flex-shrink: 0;
538
+ cursor: pointer;
539
+ padding: 0;
540
+ position: relative;
541
+
542
+ &.ec-checked::after {
543
+ content: '';
544
+ position: absolute;
545
+ left: 3px;
546
+ top: 0px;
547
+ width: 5px;
548
+ height: 9px;
549
+ border: solid #ffffff;
550
+ border-width: 0 2px 2px 0;
551
+ transform: rotate(45deg);
552
+ }
553
+ }
554
+
555
+ .ec-calendar-list-name {
556
+ flex: 1;
557
+ font-size: 13px;
558
+ color: var(--ec-sidebar-text, #333333);
559
+ white-space: nowrap;
560
+ overflow: hidden;
561
+ text-overflow: ellipsis;
562
+ min-width: 0;
563
+ }
564
+
565
+ .ec-calendar-list-remove {
566
+ border: none;
567
+ background: transparent;
568
+ color: var(--ec-sidebar-text, #333333);
569
+ cursor: pointer;
570
+ font-size: 16px;
571
+ line-height: 1;
572
+ padding: 0 2px;
573
+ opacity: 0;
574
+ flex-shrink: 0;
575
+ border-radius: 3px;
576
+
577
+ &:hover {
578
+ background: rgba(0, 0, 0, 0.1);
579
+ }
580
+ }
581
+
582
+ .ec-calendar-list-add {
583
+ border: none;
584
+ background: transparent;
585
+ color: var(--ec-sidebar-text, #333333);
586
+ cursor: pointer;
587
+ font: inherit;
588
+ font-size: 13px;
589
+ padding: 6px 4px;
590
+ margin-top: 4px;
591
+ border-radius: 4px;
592
+ text-align: left;
593
+ width: 100%;
594
+
595
+ &:hover {
596
+ background: var(--ec-mini-hover-bg, #f0f0f0);
597
+ }
598
+ }
599
+
600
+ // ─── Agenda view ──────────────────────────────
601
+
602
+ .ec-agenda-view {
603
+ height: 100%;
604
+ display: flex;
605
+ flex-direction: column;
606
+ }
607
+
608
+ .ec-agenda-scroll {
609
+ flex: 1;
610
+ overflow-y: auto;
611
+
612
+ &::-webkit-scrollbar {
613
+ width: 8px;
614
+ }
615
+ &::-webkit-scrollbar-thumb {
616
+ background: var(--ec-scrollbar-thumb, #c1c1c1);
617
+ border-radius: 4px;
618
+ }
619
+ &::-webkit-scrollbar-track {
620
+ background: var(--ec-scrollbar-track, #f1f1f1);
621
+ }
622
+ }
623
+
624
+ .ec-agenda-day {
625
+ &:not(:first-child) {
626
+ border-top: 1px solid var(--ec-grid-line, #e0e0e0);
627
+ }
628
+ }
629
+
630
+ .ec-agenda-day-header {
631
+ display: flex;
632
+ align-items: center;
633
+ gap: 10px;
634
+ padding: 10px 14px;
635
+ background: var(--ec-agenda-day-header-bg, #f8f9fa);
636
+ border-bottom: 1px solid var(--ec-grid-line, #e0e0e0);
637
+ }
638
+
639
+ .ec-agenda-day-name {
640
+ font-size: 15px;
641
+ font-weight: 600;
642
+ color: var(--ec-agenda-day-header-text, #333333);
643
+ }
644
+
645
+ .ec-agenda-day-date {
646
+ font-size: 14px;
647
+ color: var(--ec-agenda-day-header-text, #333333);
648
+ opacity: 0.6;
649
+ }
650
+
651
+ .ec-agenda-today-badge {
652
+ background: var(--ec-tg-today-circle, #1a73e8);
653
+ color: var(--ec-tg-today-circle-text, #ffffff);
654
+ font-size: 10px;
655
+ font-weight: 600;
656
+ padding: 2px 8px;
657
+ border-radius: 10px;
658
+ text-transform: uppercase;
659
+ letter-spacing: 0.5px;
660
+ }
661
+
662
+ .ec-agenda-entries {
663
+ display: flex;
664
+ flex-direction: column;
665
+ }
666
+
667
+ .ec-agenda-entry {
668
+ display: flex;
669
+ align-items: center;
670
+ gap: 12px;
671
+ height: var(--ec-agenda-entry-height, 48px);
672
+ padding: 0 14px;
673
+ cursor: pointer;
674
+ user-select: none;
675
+ border-bottom: 1px solid var(--ec-grid-line, #e0e0e0);
676
+ position: relative;
677
+
678
+ // Override generic .ec-entry styles
679
+ font-size: 13px;
680
+ white-space: normal;
681
+ text-overflow: unset;
682
+ border-radius: 0;
683
+ line-height: 1.4;
684
+ overflow: visible;
685
+ // Suppress inline outline from JS — use ::after pseudo-element instead
686
+ outline: none !important;
687
+
688
+ &:hover {
689
+ background: var(--ec-agenda-entry-hover-bg, rgba(0, 0, 0, 0.04));
690
+ opacity: 1;
691
+ }
692
+
693
+ // Selection / keyboard-focus ring via pseudo-element
694
+ // — only :focus-visible (no flash on mousedown)
695
+ // — full height, small side inset
696
+ &[aria-selected="true"],
697
+ &:focus-visible {
698
+ z-index: 1;
699
+ box-shadow: inset 0 0 0 2px var(--ec-selected-outline, #1a73e8);
700
+ }
701
+
702
+ // Needs-action: uniform 2px dashed border for larger agenda rows
703
+ &.ec-entry-needs-action {
704
+ border: 1px dashed var(--ec-entry-status-color, #999999);
705
+ }
706
+ }
707
+
708
+ .ec-agenda-entry-dot {
709
+ width: 10px;
710
+ height: 10px;
711
+ border-radius: 50%;
712
+ flex-shrink: 0;
713
+ }
714
+
715
+ .ec-agenda-entry-time {
716
+ min-width: 120px;
717
+ font-size: 12px;
718
+ color: var(--ec-tg-gutter-text, #888888);
719
+ flex-shrink: 0;
720
+ }
721
+
722
+ .ec-agenda-entry-title {
723
+ flex: 1;
724
+ min-width: 0;
725
+ overflow: hidden;
726
+ text-overflow: ellipsis;
727
+ white-space: nowrap;
728
+ font-size: 13px;
729
+ font-weight: 500;
730
+ color: var(--ec-content-text, #333333);
731
+ }
732
+
733
+ .ec-agenda-entry-location {
734
+ font-size: 12px;
735
+ color: var(--ec-tg-gutter-text, #888888);
736
+ flex-shrink: 0;
737
+ white-space: nowrap;
738
+ }
739
+
740
+ .ec-agenda-empty {
741
+ padding: 48px 14px;
742
+ text-align: center;
743
+ color: var(--ec-agenda-empty-text, #999999);
744
+ font-size: 14px;
745
+ }
746
+
747
+ // ─── Time grid (shared by week + day view) ─────
748
+
749
+ .ec-week-view,
750
+ .ec-day-view {
751
+ height: 100%;
752
+ display: flex;
753
+ flex-direction: column;
754
+ }
755
+
756
+ // Scroll container — wraps header, allday, and body
757
+ .ec-tg-scroll {
758
+ flex: 1;
759
+ overflow-y: auto;
760
+
761
+ &::-webkit-scrollbar {
762
+ width: 8px;
763
+ }
764
+ &::-webkit-scrollbar-thumb {
765
+ background: var(--ec-scrollbar-thumb, #c1c1c1);
766
+ border-radius: 4px;
767
+ }
768
+ &::-webkit-scrollbar-track {
769
+ background: var(--ec-scrollbar-track, #f1f1f1);
770
+ }
771
+ }
772
+
773
+ // Header row (day names + numbers) — sticky inside scroll container
774
+ .ec-tg-header {
775
+ display: flex;
776
+ border-bottom: 1px solid var(--ec-header-border, #e0e0e0);
777
+ background: var(--ec-header-bg, #ffffff);
778
+ position: sticky;
779
+ top: 0;
780
+ z-index: 4;
781
+ }
782
+
783
+ .ec-tg-gutter-corner {
784
+ width: var(--ec-tg-gutter-width, 60px);
785
+ flex-shrink: 0;
786
+ }
787
+
788
+ .ec-tg-day-header {
789
+ flex: 1;
790
+ display: flex;
791
+ flex-direction: column;
792
+ align-items: center;
793
+ justify-content: center;
794
+ padding: 6px 0;
795
+ min-width: 0;
796
+ border-left: 1px solid var(--ec-grid-line, #e0e0e0);
797
+
798
+ &.ec-tg-today {
799
+ color: var(--ec-tg-today-text, #1a73e8);
800
+ }
801
+ }
802
+
803
+ .ec-tg-day-name {
804
+ font-size: 11px;
805
+ font-weight: 500;
806
+ text-transform: uppercase;
807
+ color: inherit;
808
+ }
809
+
810
+ .ec-tg-day-number {
811
+ font-size: 22px;
812
+ font-weight: 400;
813
+ line-height: 1.3;
814
+ color: inherit;
815
+ }
816
+
817
+ .ec-tg-today-number {
818
+ display: inline-flex;
819
+ align-items: center;
820
+ justify-content: center;
821
+ width: 36px;
822
+ height: 36px;
823
+ border-radius: 50%;
824
+ background: var(--ec-tg-today-circle, #1a73e8);
825
+ color: var(--ec-tg-today-circle-text, #ffffff);
826
+ }
827
+
828
+ // All-day section — always visible, sticky below header
829
+ .ec-tg-allday {
830
+ display: flex;
831
+ border-bottom: 1px solid var(--ec-header-border, #e0e0e0);
832
+ background: var(--ec-header-bg, #ffffff);
833
+ position: sticky;
834
+ z-index: 3;
835
+ min-height: var(--ec-tg-allday-min-height, 28px);
836
+ max-height: var(--ec-tg-allday-max-height, 120px);
837
+ }
838
+
839
+ .ec-tg-allday-row {
840
+ flex: 1;
841
+ display: flex;
842
+ min-width: 0;
843
+ overflow-y: auto;
844
+ }
845
+
846
+ .ec-tg-allday-cell {
847
+ flex: 1;
848
+ display: flex;
849
+ flex-direction: column;
850
+ gap: 2px;
851
+ padding: 2px;
852
+ min-width: 0;
853
+ border-left: 1px solid var(--ec-grid-line, #e0e0e0);
854
+
855
+ &.ec-tg-allday-drag {
856
+ background: var(--ec-drag-highlight, rgba(3, 155, 229, 0.15));
857
+ }
858
+ }
859
+
860
+ // Body (gutter + content, no own scroll)
861
+ // margin-top: -1px overlaps first slot border with allday border-bottom,
862
+ // so the sticky allday (higher z-index) hides the duplicate border
863
+ .ec-tg-body {
864
+ display: flex;
865
+ margin-top: -1px;
866
+ }
867
+
868
+ // Time gutter
869
+ .ec-tg-gutter {
870
+ width: var(--ec-tg-gutter-width, 60px);
871
+ flex-shrink: 0;
872
+ }
873
+
874
+ .ec-tg-gutter-slot {
875
+ // Same border-top as content slots so horizontal lines span full width
876
+ border-top: 1px dashed var(--ec-tg-slot-border, #e0e0e0);
877
+
878
+ &.ec-tg-gutter-hour {
879
+ border-top: 1px solid var(--ec-tg-slot-hour-border, #e0e0e0);
880
+ }
881
+ }
882
+
883
+ .ec-tg-gutter-label {
884
+ padding: 2px 8px 0 4px;
885
+ font-size: 11px;
886
+ color: var(--ec-tg-gutter-text, #888888);
887
+ line-height: 1;
888
+ white-space: nowrap;
889
+ }
890
+
891
+ // Content area (columns)
892
+ .ec-tg-content {
893
+ flex: 1;
894
+ display: flex;
895
+ min-width: 0;
896
+ }
897
+
898
+ .ec-tg-column {
899
+ flex: 1;
900
+ position: relative;
901
+ min-width: 0;
902
+ border-left: 1px solid var(--ec-grid-line, #e0e0e0);
903
+
904
+ &.ec-tg-today {
905
+ background: var(--ec-tg-today-bg, rgba(26, 115, 232, 0.04));
906
+ }
907
+ }
908
+
909
+ // Slot grid lines — horizontal: hour=solid, sub-hour=dashed
910
+ .ec-tg-slot {
911
+ border-top: 1px dashed var(--ec-tg-slot-border, #e0e0e0);
912
+
913
+ &.ec-tg-slot-hour {
914
+ border-top: 1px solid var(--ec-tg-slot-hour-border, #e0e0e0);
915
+ }
916
+ }
917
+
918
+ // Timed entries (absolute positioned within column)
919
+ .ec-tg-entry {
920
+ position: absolute;
921
+ left: 0;
922
+ right: 0;
923
+ border-radius: var(--ec-entry-radius, 4px);
924
+ padding: 2px 4px;
925
+ font-size: 11px;
926
+ overflow: hidden;
927
+ cursor: pointer;
928
+ user-select: none;
929
+ background: var(--ec-entry-chip-bg, #d3e3fd);
930
+ color: var(--ec-entry-chip-text, #1b4fa3);
931
+ border-left: var(--ec-entry-accent-width, 3px) solid var(--ec-tg-entry-accent, #1b66c9);
932
+ z-index: 1;
933
+
934
+ &:hover {
935
+ opacity: 0.9;
936
+ z-index: 2;
937
+ }
938
+ }
939
+
940
+ .ec-tg-entry-title {
941
+ font-weight: 500;
942
+ white-space: nowrap;
943
+ overflow: hidden;
944
+ text-overflow: ellipsis;
945
+ }
946
+
947
+ .ec-tg-entry-time {
948
+ font-size: 10px;
949
+ opacity: 0.85;
950
+ white-space: nowrap;
951
+ overflow: hidden;
952
+ text-overflow: ellipsis;
953
+ }
954
+
955
+ // Resize handles on timed entries
956
+ .ec-tg-entry-resize-handle {
957
+ position: absolute;
958
+ left: 0;
959
+ right: 0;
960
+ height: 6px;
961
+ z-index: 2;
962
+
963
+ // Enlarged invisible hit area for easier grabbing (touch + mouse)
964
+ &::before {
965
+ content: '';
966
+ position: absolute;
967
+ left: 0;
968
+ right: 0;
969
+ height: 20px;
970
+ top: 50%;
971
+ transform: translateY(-50%);
972
+ }
973
+
974
+ &.ec-tg-entry-resize-handle-top {
975
+ top: 0;
976
+ cursor: n-resize;
977
+ }
978
+
979
+ &.ec-tg-entry-resize-handle-bottom {
980
+ bottom: 0;
981
+ cursor: s-resize;
982
+ }
983
+ }
984
+
985
+ // Entry dragging state (dimmed original)
986
+ .ec-entry-dragging {
987
+ opacity: 0.4;
988
+ }
989
+
990
+ // Drag preview (cloned entry shown at target position)
991
+ .ec-entry-drag-preview {
992
+ opacity: 0.7;
993
+ pointer-events: none;
994
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
995
+ z-index: 10;
996
+ }
997
+
998
+ // Suppress hover effects during drag
999
+ body.ec-dragging {
1000
+ .ec-month-day,
1001
+ .ec-tg-allday-cell,
1002
+ .ec-tg-column,
1003
+ .ec-entry {
1004
+ pointer-events: none;
1005
+ }
1006
+ }
1007
+
1008
+ // Swipe navigation snap-back animation
1009
+ .ec-view-container.ec-swipe-transition {
1010
+ transition: transform 0.2s ease-out;
1011
+ }
1012
+
1013
+ // Drag-to-create preview
1014
+ .ec-tg-drag-preview {
1015
+ position: absolute;
1016
+ left: 0;
1017
+ right: 0;
1018
+ background: var(--ec-drag-highlight, rgba(3, 155, 229, 0.15));
1019
+ border-radius: var(--ec-entry-radius, 4px);
1020
+ border-left: var(--ec-entry-accent-width, 3px) solid var(--ec-tg-entry-accent, #1b66c9);
1021
+ z-index: 5;
1022
+ pointer-events: none;
1023
+ font-size: 11px;
1024
+ color: var(--ec-content-text, #333333);
1025
+ padding: 2px 4px;
1026
+ font-weight: 500;
1027
+ overflow: hidden;
1028
+ white-space: nowrap;
1029
+ }
1030
+
1031
+ // Sidebar toggle button (hidden on desktop, shown on mobile via .ec-mobile)
1032
+ .ec-toolbar-sidebar-toggle {
1033
+ display: none;
1034
+ }
1035
+
1036
+ // Sidebar backdrop overlay (mobile only)
1037
+ .ec-sidebar-backdrop {
1038
+ display: none;
1039
+ }
1040
+
1041
+ // ─── Mobile layout ───────────────────────────────
1042
+ // Applied via .ec-mobile class on wrapper (detected by ResizeObserver)
1043
+
1044
+ .ec-mobile {
1045
+ position: relative;
1046
+
1047
+ // Sidebar: slide-in overlay instead of inline
1048
+ .ec-sidebar {
1049
+ position: absolute;
1050
+ top: 0;
1051
+ left: 0;
1052
+ height: 100%;
1053
+ z-index: 20;
1054
+ box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15);
1055
+ transform: translateX(-100%);
1056
+ transition: transform 0.25s ease;
1057
+
1058
+ &.ec-sidebar-open {
1059
+ transform: translateX(0);
1060
+ }
1061
+ }
1062
+
1063
+ // Backdrop behind sidebar
1064
+ .ec-sidebar-backdrop {
1065
+ display: block;
1066
+ position: absolute;
1067
+ inset: 0;
1068
+ z-index: 19;
1069
+ background: rgba(0, 0, 0, 0.3);
1070
+ }
1071
+
1072
+ // Toolbar: taller with larger touch targets
1073
+ .ec-toolbar {
1074
+ height: 56px;
1075
+ padding: 0 8px;
1076
+ }
1077
+
1078
+ .ec-toolbar-sidebar-toggle {
1079
+ display: flex;
1080
+ align-items: center;
1081
+ justify-content: center;
1082
+ width: 44px;
1083
+ height: 44px;
1084
+ font-size: 20px;
1085
+ flex-shrink: 0;
1086
+ }
1087
+
1088
+ .ec-toolbar-nav-btn {
1089
+ width: 44px;
1090
+ height: 44px;
1091
+ font-size: 24px;
1092
+ line-height: 44px;
1093
+ }
1094
+
1095
+ .ec-toolbar-btn {
1096
+ min-height: 44px;
1097
+ }
1098
+
1099
+ .ec-toolbar-today {
1100
+ padding: 8px 12px;
1101
+ }
1102
+
1103
+ .ec-toolbar-title {
1104
+ font-size: 16px;
1105
+ padding: 0 4px;
1106
+ }
1107
+
1108
+ // Mini calendar: larger day cells for touch
1109
+ .ec-mini-day {
1110
+ width: 36px;
1111
+ height: 36px;
1112
+ line-height: 36px;
1113
+ font-size: 13px;
1114
+ }
1115
+
1116
+ .ec-mini-nav-btn {
1117
+ width: 36px;
1118
+ height: 36px;
1119
+ line-height: 36px;
1120
+ }
1121
+
1122
+ .ec-mini-row {
1123
+ border-radius: 18px;
1124
+ }
1125
+
1126
+ // Week view is too cramped on mobile — hide the button
1127
+ .ec-toolbar-view-btn[data-view-mode="week"] {
1128
+ display: none;
1129
+ }
1130
+
1131
+ // Month view entries: taller for touch
1132
+ .ec-entry {
1133
+ height: 28px;
1134
+ line-height: 28px;
1135
+ font-size: 12px;
1136
+ }
1137
+
1138
+ // Agenda view: larger touch targets
1139
+ .ec-agenda-entry {
1140
+ height: 56px;
1141
+ padding: 0 12px;
1142
+ }
1143
+
1144
+ .ec-agenda-day-header {
1145
+ padding: 12px;
1146
+ }
1147
+
1148
+ // Calendar list checkbox: larger
1149
+ .ec-calendar-list-checkbox {
1150
+ width: 20px;
1151
+ height: 20px;
1152
+ }
1153
+
1154
+ .ec-calendar-list-item {
1155
+ padding: 6px 4px;
1156
+ }
1157
+
1158
+ .ec-calendar-list-remove {
1159
+ opacity: 1;
1160
+ width: 28px;
1161
+ height: 28px;
1162
+ display: flex;
1163
+ align-items: center;
1164
+ justify-content: center;
1165
+ }
1166
+ }
1167
+
1168
+ // ─── Tooltip ──────────────────────────────────────
1169
+
1170
+ .ec-tooltip {
1171
+ position: absolute;
1172
+ z-index: 15;
1173
+ background: var(--ec-tooltip-bg, var(--ec-content-bg, #ffffff));
1174
+ color: var(--ec-tooltip-text, var(--ec-content-text, #333333));
1175
+ border: 1px solid var(--ec-tooltip-border, var(--ec-grid-line, #e0e0e0));
1176
+ border-radius: 6px;
1177
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
1178
+ padding: 8px 12px;
1179
+ max-width: 300px;
1180
+ pointer-events: none;
1181
+ font-size: 12px;
1182
+ line-height: 1.4;
1183
+ }
1184
+
1185
+ .ec-tooltip-title {
1186
+ font-weight: 600;
1187
+ font-size: 13px;
1188
+ margin-bottom: 4px;
1189
+ }
1190
+
1191
+ .ec-tooltip-row {
1192
+ display: flex;
1193
+ gap: 6px;
1194
+ }
1195
+
1196
+ .ec-tooltip-label {
1197
+ color: var(--ec-tooltip-label, #888888);
1198
+ flex-shrink: 0;
1199
+ }
1200
+
1201
+ .ec-tooltip-value {
1202
+ color: var(--ec-tooltip-text, var(--ec-content-text, #333333));
1203
+ }
1204
+
1205
+ // Now line (current time indicator)
1206
+ .ec-tg-now-line {
1207
+ position: absolute;
1208
+ left: 0;
1209
+ right: 0;
1210
+ height: var(--ec-tg-now-line-height, 2px);
1211
+ background: var(--ec-tg-now-line, #ea4335);
1212
+ z-index: 3;
1213
+ pointer-events: none;
1214
+
1215
+ &::before {
1216
+ content: '';
1217
+ position: absolute;
1218
+ left: -5px;
1219
+ top: calc(var(--ec-tg-now-line-height, 2px) / 2 - 5px);
1220
+ width: 10px;
1221
+ height: 10px;
1222
+ border-radius: 50%;
1223
+ background: var(--ec-tg-now-line, #ea4335);
1224
+ }
1225
+ }