@redvars/peacock 3.5.1 → 3.6.1

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 (225) hide show
  1. package/dist/{BaseButton-DuASuVth.js → BaseButton-BNFAYn-S.js} +2 -2
  2. package/dist/{BaseButton-DuASuVth.js.map → BaseButton-BNFAYn-S.js.map} +1 -1
  3. package/dist/BaseInput-14YmcfK7.js +27 -0
  4. package/dist/BaseInput-14YmcfK7.js.map +1 -0
  5. package/dist/banner.js +2 -3
  6. package/dist/banner.js.map +1 -1
  7. package/dist/{button-DouvOfEU.js → button-colors-Ccys3hvS.js} +5 -294
  8. package/dist/button-colors-Ccys3hvS.js.map +1 -0
  9. package/dist/button-group.js +226 -6
  10. package/dist/button-group.js.map +1 -1
  11. package/dist/button.js +294 -8
  12. package/dist/button.js.map +1 -1
  13. package/dist/calendar-column-view.js +634 -0
  14. package/dist/calendar-column-view.js.map +1 -0
  15. package/dist/calendar-event-BrQ_SEKD.js +199 -0
  16. package/dist/calendar-event-BrQ_SEKD.js.map +1 -0
  17. package/dist/calendar-month-view.js +376 -0
  18. package/dist/calendar-month-view.js.map +1 -0
  19. package/dist/calendar.js +339 -0
  20. package/dist/calendar.js.map +1 -0
  21. package/dist/canvas.js +361 -0
  22. package/dist/canvas.js.map +1 -0
  23. package/dist/cb-compound-expression.js +125 -0
  24. package/dist/cb-compound-expression.js.map +1 -0
  25. package/dist/cb-divider.js +150 -0
  26. package/dist/cb-divider.js.map +1 -0
  27. package/dist/cb-expression.js +75 -0
  28. package/dist/cb-expression.js.map +1 -0
  29. package/dist/cb-predicate.js +137 -0
  30. package/dist/cb-predicate.js.map +1 -0
  31. package/dist/code-editor.js +2 -1
  32. package/dist/code-editor.js.map +1 -1
  33. package/dist/code-highlighter.js +1 -1
  34. package/dist/code-highlighter.js.map +1 -1
  35. package/dist/condition-builder.js +58 -0
  36. package/dist/condition-builder.js.map +1 -0
  37. package/dist/custom-elements-jsdocs.json +8479 -3965
  38. package/dist/custom-elements.json +15228 -7544
  39. package/dist/dropdown-button.js +216 -0
  40. package/dist/dropdown-button.js.map +1 -0
  41. package/dist/event-manager-D-QCmUgR.js +113 -0
  42. package/dist/event-manager-D-QCmUgR.js.map +1 -0
  43. package/dist/fab.js +1 -1
  44. package/dist/flow-designer-DvTUrDp5.js +1656 -0
  45. package/dist/flow-designer-DvTUrDp5.js.map +1 -0
  46. package/dist/flow-designer-node-BWrPuxAR.js +548 -0
  47. package/dist/flow-designer-node-BWrPuxAR.js.map +1 -0
  48. package/dist/flow-designer-node.js +4 -0
  49. package/dist/flow-designer-node.js.map +1 -0
  50. package/dist/flow-designer.js +16 -0
  51. package/dist/flow-designer.js.map +1 -0
  52. package/dist/html-editor.js +27516 -0
  53. package/dist/html-editor.js.map +1 -0
  54. package/dist/icon-button-CK1ZuE-2.js +247 -0
  55. package/dist/icon-button-CK1ZuE-2.js.map +1 -0
  56. package/dist/index.js +29 -6
  57. package/dist/index.js.map +1 -1
  58. package/dist/{is-dark-mode-DicqGkCJ.js → is-dark-mode-DOcaw4Yq.js} +2 -27
  59. package/dist/is-dark-mode-DOcaw4Yq.js.map +1 -0
  60. package/dist/modal.js +412 -0
  61. package/dist/modal.js.map +1 -0
  62. package/dist/{navigation-rail-Lxetd5-Z.js → navigation-rail-DTTkqohi.js} +1049 -2391
  63. package/dist/navigation-rail-DTTkqohi.js.map +1 -0
  64. package/dist/notification-manager.js +268 -0
  65. package/dist/notification-manager.js.map +1 -0
  66. package/dist/peacock-loader.js +93 -8
  67. package/dist/peacock-loader.js.map +1 -1
  68. package/dist/popover-NC7b1lTq.js +1971 -0
  69. package/dist/popover-NC7b1lTq.js.map +1 -0
  70. package/dist/popover-content.js +125 -0
  71. package/dist/popover-content.js.map +1 -0
  72. package/dist/popover.js +4 -0
  73. package/dist/popover.js.map +1 -0
  74. package/dist/split-button.js +388 -0
  75. package/dist/split-button.js.map +1 -0
  76. package/dist/src/__controllers/floating-controller.d.ts +35 -0
  77. package/dist/src/calendar/base-event.d.ts +10 -0
  78. package/dist/src/calendar/calendar-column-view.d.ts +41 -0
  79. package/dist/src/calendar/calendar-event.d.ts +7 -0
  80. package/dist/src/calendar/calendar-month-view.d.ts +31 -0
  81. package/dist/src/calendar/calendar.d.ts +65 -0
  82. package/dist/src/calendar/event-manager.d.ts +17 -0
  83. package/dist/src/calendar/index.d.ts +4 -0
  84. package/dist/src/calendar/types.d.ts +13 -0
  85. package/dist/src/calendar/utils.d.ts +31 -0
  86. package/dist/src/canvas/canvas.d.ts +92 -0
  87. package/dist/src/canvas/index.d.ts +2 -0
  88. package/dist/src/condition-builder/cb-compound-expression.d.ts +31 -0
  89. package/dist/src/condition-builder/cb-divider.d.ts +26 -0
  90. package/dist/src/condition-builder/cb-expression.d.ts +31 -0
  91. package/dist/src/condition-builder/cb-predicate.d.ts +30 -0
  92. package/dist/src/condition-builder/condition-builder.d.ts +27 -0
  93. package/dist/src/condition-builder/index.d.ts +5 -0
  94. package/dist/src/dropdown-button/dropdown-button.d.ts +68 -0
  95. package/dist/src/dropdown-button/index.d.ts +1 -0
  96. package/dist/src/flow-designer/commands.d.ts +66 -0
  97. package/dist/src/flow-designer/flow-designer-node.d.ts +46 -0
  98. package/dist/src/flow-designer/flow-designer.d.ts +133 -0
  99. package/dist/src/flow-designer/index.d.ts +7 -0
  100. package/dist/src/flow-designer/layout.d.ts +30 -0
  101. package/dist/src/flow-designer/types.d.ts +142 -0
  102. package/dist/src/flow-designer/validation.d.ts +43 -0
  103. package/dist/src/flow-designer/workflow-utils.d.ts +40 -0
  104. package/dist/src/html-editor/html-editor.d.ts +89 -0
  105. package/dist/src/html-editor/index.d.ts +2 -0
  106. package/dist/src/index.d.ts +15 -0
  107. package/dist/src/list/index.d.ts +2 -0
  108. package/dist/src/list/list-item.d.ts +35 -0
  109. package/dist/src/list/list.d.ts +28 -0
  110. package/dist/src/menu/menu/menu.d.ts +5 -7
  111. package/dist/src/menu/menu-item/menu-item.d.ts +14 -13
  112. package/dist/src/modal/index.d.ts +1 -0
  113. package/dist/src/modal/modal.d.ts +57 -0
  114. package/dist/src/navigation-rail/navigation-rail.d.ts +3 -7
  115. package/dist/src/notification-manager/index.d.ts +1 -0
  116. package/dist/src/notification-manager/notification-manager.d.ts +44 -0
  117. package/dist/src/number-field/number-field.d.ts +2 -2
  118. package/dist/src/popover/index.d.ts +2 -0
  119. package/dist/src/popover/popover-content.d.ts +29 -0
  120. package/dist/src/popover/popover.d.ts +62 -0
  121. package/dist/src/split-button/index.d.ts +1 -0
  122. package/dist/src/split-button/split-button.d.ts +72 -0
  123. package/dist/src/svg/index.d.ts +1 -0
  124. package/dist/src/svg/svg.d.ts +38 -0
  125. package/dist/src/toolbar/toolbar.d.ts +3 -3
  126. package/dist/src/tooltip/tooltip.d.ts +2 -15
  127. package/dist/test/flow-designer.test.d.ts +1 -0
  128. package/dist/toolbar.js +3 -3
  129. package/dist/toolbar.js.map +1 -1
  130. package/dist/tsconfig.tsbuildinfo +1 -1
  131. package/package.json +10 -2
  132. package/readme.md +3 -3
  133. package/src/__controllers/floating-controller.ts +237 -0
  134. package/src/banner/banner.scss +2 -3
  135. package/src/button/button/button.ts +1 -0
  136. package/src/calendar/base-event.ts +49 -0
  137. package/src/calendar/calendar-column-view.scss +326 -0
  138. package/src/calendar/calendar-column-view.ts +392 -0
  139. package/src/calendar/calendar-event.ts +20 -0
  140. package/src/calendar/calendar-month-view.scss +192 -0
  141. package/src/calendar/calendar-month-view.ts +244 -0
  142. package/src/calendar/calendar.scss +71 -0
  143. package/src/calendar/calendar.ts +298 -0
  144. package/src/calendar/event-manager.ts +117 -0
  145. package/src/calendar/index.ts +4 -0
  146. package/src/calendar/types.ts +14 -0
  147. package/src/calendar/utils.ts +180 -0
  148. package/src/canvas/canvas.scss +60 -0
  149. package/src/canvas/canvas.ts +391 -0
  150. package/src/canvas/index.ts +2 -0
  151. package/src/code-highlighter/code-highlighter.ts +1 -1
  152. package/src/condition-builder/cb-compound-expression.scss +37 -0
  153. package/src/condition-builder/cb-compound-expression.ts +80 -0
  154. package/src/condition-builder/cb-divider.scss +93 -0
  155. package/src/condition-builder/cb-divider.ts +56 -0
  156. package/src/condition-builder/cb-expression.scss +14 -0
  157. package/src/condition-builder/cb-expression.ts +49 -0
  158. package/src/condition-builder/cb-predicate.scss +35 -0
  159. package/src/condition-builder/cb-predicate.ts +102 -0
  160. package/src/condition-builder/condition-builder.scss +13 -0
  161. package/src/condition-builder/condition-builder.ts +38 -0
  162. package/src/condition-builder/index.ts +5 -0
  163. package/src/dropdown-button/demo/index.html +110 -0
  164. package/src/dropdown-button/dropdown-button.scss +22 -0
  165. package/src/dropdown-button/dropdown-button.ts +206 -0
  166. package/src/dropdown-button/index.ts +1 -0
  167. package/src/flow-designer/DEMO.md +239 -0
  168. package/src/flow-designer/commands.ts +278 -0
  169. package/src/flow-designer/flow-designer-node.ts +172 -0
  170. package/src/flow-designer/flow-designer.scss +457 -0
  171. package/src/flow-designer/flow-designer.ts +611 -0
  172. package/src/flow-designer/index.ts +41 -0
  173. package/src/flow-designer/layout.ts +357 -0
  174. package/src/flow-designer/types.ts +166 -0
  175. package/src/flow-designer/validation.ts +284 -0
  176. package/src/flow-designer/workflow-utils.ts +282 -0
  177. package/src/html-editor/html-editor.scss +188 -0
  178. package/src/html-editor/html-editor.ts +491 -0
  179. package/src/html-editor/index.ts +3 -0
  180. package/src/index.ts +27 -1
  181. package/src/list/index.ts +2 -0
  182. package/src/list/list-item.scss +111 -0
  183. package/src/list/list-item.ts +175 -0
  184. package/src/list/list.scss +24 -0
  185. package/src/list/list.ts +51 -0
  186. package/src/menu/menu/menu.scss +2 -2
  187. package/src/menu/menu/menu.ts +91 -101
  188. package/src/menu/menu-item/menu-item.scss +4 -0
  189. package/src/menu/menu-item/menu-item.ts +82 -78
  190. package/src/modal/index.ts +1 -0
  191. package/src/modal/modal.scss +206 -0
  192. package/src/modal/modal.ts +195 -0
  193. package/src/navigation-rail/navigation-rail-item.scss +7 -38
  194. package/src/navigation-rail/navigation-rail-item.ts +1 -2
  195. package/src/navigation-rail/navigation-rail.scss +17 -21
  196. package/src/navigation-rail/navigation-rail.ts +6 -9
  197. package/src/notification-manager/index.ts +1 -0
  198. package/src/notification-manager/notification-manager.scss +113 -0
  199. package/src/notification-manager/notification-manager.ts +199 -0
  200. package/src/number-field/number-field.ts +2 -2
  201. package/src/peacock-loader.ts +83 -0
  202. package/src/popover/index.ts +2 -0
  203. package/src/popover/popover-content.scss +69 -0
  204. package/src/popover/popover-content.ts +51 -0
  205. package/src/popover/popover.scss +7 -0
  206. package/src/popover/popover.ts +170 -0
  207. package/src/split-button/index.ts +1 -0
  208. package/src/split-button/split-button-colors.scss +56 -0
  209. package/src/split-button/split-button-sizes.scss +28 -0
  210. package/src/split-button/split-button.scss +79 -0
  211. package/src/split-button/split-button.ts +236 -0
  212. package/src/svg/index.ts +1 -0
  213. package/src/svg/svg.scss +91 -0
  214. package/src/svg/svg.ts +160 -0
  215. package/src/table/table.ts +2 -2
  216. package/src/toolbar/toolbar.ts +3 -3
  217. package/src/tooltip/tooltip.scss +4 -3
  218. package/src/tooltip/tooltip.ts +46 -104
  219. package/dist/button-DouvOfEU.js.map +0 -1
  220. package/dist/button-group-CEdMwvJJ.js +0 -464
  221. package/dist/button-group-CEdMwvJJ.js.map +0 -1
  222. package/dist/is-dark-mode-DicqGkCJ.js.map +0 -1
  223. package/dist/navigation-rail-Lxetd5-Z.js.map +0 -1
  224. package/dist/src/menu/menu/MenuSurfaceController.d.ts +0 -18
  225. package/src/menu/menu/MenuSurfaceController.ts +0 -61
@@ -0,0 +1,117 @@
1
+ import { CalendarEvent } from './calendar-event.js';
2
+
3
+ export class ColumnEvent extends CalendarEvent {
4
+ width: number = 1;
5
+
6
+ constructor(event: CalendarEvent) {
7
+ super(event.start, event.end, event.title, event.color, event.data);
8
+ }
9
+ }
10
+
11
+ export class EventManager {
12
+ #events: ColumnEvent[] = [];
13
+ columns: ColumnEvent[][] = [];
14
+
15
+ addEvents(events: CalendarEvent[]): void {
16
+ events.forEach(event => {
17
+ this.#events.push(new ColumnEvent(event));
18
+ });
19
+ }
20
+
21
+ process(): void {
22
+ this.columns = [];
23
+ let events = this.#events.sort((a, b) => {
24
+ return a.start.valueOf() - b.start.valueOf() || b.length() - a.length();
25
+ });
26
+
27
+ let oldLength: number | null = null;
28
+ /* Bucketing: group non-overlapping events into columns */
29
+ while (events.length) {
30
+ if (oldLength === events.length) {
31
+ throw new Error(
32
+ 'Events not processed in previous run, breaking infinite loop',
33
+ );
34
+ }
35
+ oldLength = events.length;
36
+
37
+ const column: ColumnEvent[] = [];
38
+ for (let i = 0; i < events.length; i++) {
39
+ if (i === 0) {
40
+ column.push(events[i]);
41
+ } else if (events[i].start.valueOf() >= column[column.length - 1].end.valueOf()) {
42
+ column.push(events[i]);
43
+ }
44
+ }
45
+ this.columns.push(column);
46
+ events = events.filter(e => !column.find(ce => ce.gid === e.gid));
47
+ }
48
+
49
+ /* Calculate widths for events that span multiple columns */
50
+ for (let i = 0; i < this.columns.length - 1; i++) {
51
+ this.columns[i].forEach(event => {
52
+ for (let j = i + 1; j < this.columns.length; j++) {
53
+ if (this.columns[j].find(colEvent => event.isOverlapping(colEvent))) {
54
+ break;
55
+ }
56
+ event.width++;
57
+ }
58
+ });
59
+ }
60
+ }
61
+ }
62
+
63
+ export class MonthEventManager {
64
+ #events: ColumnEvent[] = [];
65
+ columns: ColumnEvent[][] = [];
66
+
67
+ addEvents(events: CalendarEvent[]): void {
68
+ events.forEach(event => {
69
+ this.#events.push(new ColumnEvent(event));
70
+ });
71
+ }
72
+
73
+ process(): void {
74
+ this.columns = [];
75
+ let events = this.#events.sort((a, b) => {
76
+ return a.start.valueOf() - b.start.valueOf() || b.length() - a.length();
77
+ });
78
+
79
+ let oldLength: number | null = null;
80
+ while (events.length) {
81
+ if (oldLength === events.length) {
82
+ throw new Error(
83
+ 'Events not processed in previous run, breaking infinite loop',
84
+ );
85
+ }
86
+ oldLength = events.length;
87
+
88
+ const column: ColumnEvent[] = [];
89
+ for (let i = 0; i < events.length; i++) {
90
+ if (i === 0) {
91
+ column.push(events[i]);
92
+ } else {
93
+ const lastEnd = new Date(column[column.length - 1].end);
94
+ lastEnd.setHours(23, 59, 59, 999);
95
+ const nextStart = new Date(events[i].start);
96
+ nextStart.setHours(0, 0, 0, 0);
97
+ if (nextStart.valueOf() > lastEnd.valueOf()) {
98
+ column.push(events[i]);
99
+ }
100
+ }
101
+ }
102
+ this.columns.push(column);
103
+ events = events.filter(e => !column.find(ce => ce.gid === e.gid));
104
+ }
105
+
106
+ for (let i = 0; i < this.columns.length - 1; i++) {
107
+ this.columns[i].forEach(event => {
108
+ for (let j = i + 1; j < this.columns.length; j++) {
109
+ if (this.columns[j].find(colEvent => event.isOverlapping(colEvent))) {
110
+ break;
111
+ }
112
+ event.width++;
113
+ }
114
+ });
115
+ }
116
+ }
117
+ }
@@ -0,0 +1,4 @@
1
+ export { Calendar } from './calendar.js';
2
+ export { CalendarColumnView } from './calendar-column-view.js';
3
+ export { CalendarMonthView } from './calendar-month-view.js';
4
+ export type { CalendarViewType, EventType } from './types.js';
@@ -0,0 +1,14 @@
1
+ export type CalendarViewType = {
2
+ label: string;
3
+ value: string;
4
+ type: 'column' | 'month';
5
+ days?: number;
6
+ };
7
+
8
+ export type EventType = {
9
+ start: Date;
10
+ end: Date;
11
+ title: string;
12
+ color?: string;
13
+ [key: string]: any;
14
+ };
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Pure date utility functions (no external dependencies).
3
+ */
4
+
5
+ export function startOfDay(date: Date): Date {
6
+ const d = new Date(date);
7
+ d.setHours(0, 0, 0, 0);
8
+ return d;
9
+ }
10
+
11
+ export function endOfDay(date: Date): Date {
12
+ const d = new Date(date);
13
+ d.setHours(23, 59, 59, 999);
14
+ return d;
15
+ }
16
+
17
+ export function addDays(date: Date, days: number): Date {
18
+ const d = new Date(date);
19
+ d.setDate(d.getDate() + days);
20
+ return d;
21
+ }
22
+
23
+ export function addMonths(date: Date, months: number): Date {
24
+ const d = new Date(date);
25
+ d.setMonth(d.getMonth() + months);
26
+ return d;
27
+ }
28
+
29
+ export function addHours(date: Date, hours: number): Date {
30
+ const d = new Date(date);
31
+ d.setHours(d.getHours() + hours);
32
+ return d;
33
+ }
34
+
35
+ export function differenceInDays(dateA: Date, dateB: Date): number {
36
+ const a = startOfDay(dateA);
37
+ const b = startOfDay(dateB);
38
+ return Math.round((a.valueOf() - b.valueOf()) / 86400000);
39
+ }
40
+
41
+ export function startOfWeek(
42
+ date: Date,
43
+ weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1,
44
+ ): Date {
45
+ const d = startOfDay(date);
46
+ const day = d.getDay();
47
+ const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
48
+ d.setDate(d.getDate() - diff);
49
+ return d;
50
+ }
51
+
52
+ export function endOfWeek(
53
+ date: Date,
54
+ weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1,
55
+ ): Date {
56
+ const d = startOfWeek(date, weekStartsOn);
57
+ d.setDate(d.getDate() + 6);
58
+ return endOfDay(d);
59
+ }
60
+
61
+ export function startOfMonth(date: Date): Date {
62
+ const d = new Date(date);
63
+ d.setDate(1);
64
+ d.setHours(0, 0, 0, 0);
65
+ return d;
66
+ }
67
+
68
+ export function endOfMonth(date: Date): Date {
69
+ const d = new Date(date);
70
+ d.setMonth(d.getMonth() + 1, 0);
71
+ d.setHours(23, 59, 59, 999);
72
+ return d;
73
+ }
74
+
75
+ export function calculateMonthRange(
76
+ date: Date,
77
+ weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1,
78
+ ) {
79
+ const sd = startOfWeek(startOfMonth(date), weekStartsOn);
80
+ const ed = endOfWeek(endOfMonth(date), weekStartsOn);
81
+ return { startDate: sd, endDate: ed, totalDays: 42 };
82
+ }
83
+
84
+ export function calculateWeekRange(
85
+ date: Date,
86
+ weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1,
87
+ ) {
88
+ const sd = startOfWeek(date, weekStartsOn);
89
+ const ed = endOfWeek(date, weekStartsOn);
90
+ return { startDate: sd, endDate: ed, totalDays: 7 };
91
+ }
92
+
93
+ export function calculateDateRange(
94
+ view: string,
95
+ contextDate: Date,
96
+ days: number,
97
+ ) {
98
+ if (view === 'week') {
99
+ return calculateWeekRange(contextDate, 1);
100
+ }
101
+ return {
102
+ startDate: startOfDay(contextDate),
103
+ endDate: endOfDay(addDays(contextDate, days - 1)),
104
+ totalDays: days,
105
+ };
106
+ }
107
+
108
+ export const LONG_EVENT_PADDING = 0.25;
109
+
110
+ const DAY_NAMES_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
111
+ const DAY_NAMES_LONG = [
112
+ 'Sunday',
113
+ 'Monday',
114
+ 'Tuesday',
115
+ 'Wednesday',
116
+ 'Thursday',
117
+ 'Friday',
118
+ 'Saturday',
119
+ ];
120
+ const MONTH_NAMES = [
121
+ 'January',
122
+ 'February',
123
+ 'March',
124
+ 'April',
125
+ 'May',
126
+ 'June',
127
+ 'July',
128
+ 'August',
129
+ 'September',
130
+ 'October',
131
+ 'November',
132
+ 'December',
133
+ ];
134
+
135
+ export function formatDate(date: Date, pattern: string): string {
136
+ const day = date.getDate();
137
+ const dayOfWeek = date.getDay();
138
+ const month = date.getMonth();
139
+ const year = date.getFullYear();
140
+ const hours = date.getHours();
141
+ const minutes = date.getMinutes();
142
+
143
+ switch (pattern) {
144
+ case 'MMMM d, yyyy':
145
+ return `${MONTH_NAMES[month]} ${day}, ${year}`;
146
+ case 'EEEE':
147
+ return DAY_NAMES_LONG[dayOfWeek];
148
+ case 'E':
149
+ return DAY_NAMES_SHORT[dayOfWeek];
150
+ case 'd':
151
+ return `${day}`;
152
+ case 'dd':
153
+ return day < 10 ? `0${day}` : `${day}`;
154
+ case 'hh a': {
155
+ const h = hours % 12 || 12;
156
+ const ampm = hours < 12 ? 'AM' : 'PM';
157
+ return `${h < 10 ? '0' : ''}${h} ${ampm}`;
158
+ }
159
+ case 'hh:mm a': {
160
+ const h = hours % 12 || 12;
161
+ const ampm = hours < 12 ? 'AM' : 'PM';
162
+ return `${h < 10 ? '0' : ''}${h}:${minutes < 10 ? '0' : ''}${minutes} ${ampm}`;
163
+ }
164
+ case 'dd-MM-yyyy':
165
+ return `${day < 10 ? '0' : ''}${day}-${month + 1 < 10 ? '0' : ''}${month + 1}-${year}`;
166
+ default:
167
+ return date.toLocaleDateString();
168
+ }
169
+ }
170
+
171
+ export function getTimePercent(date: Date, forDay?: Date): number {
172
+ const day = forDay || date;
173
+ const sd = startOfDay(day);
174
+ const ed = endOfDay(day);
175
+ const percent =
176
+ ((date.valueOf() - sd.valueOf()) / (ed.valueOf() - sd.valueOf())) * 100;
177
+ if (percent < 0) return 0;
178
+ if (percent > 100) return 100;
179
+ return percent;
180
+ }
@@ -0,0 +1,60 @@
1
+ @use '../../scss/mixin';
2
+
3
+ @include mixin.base-styles;
4
+
5
+ :host {
6
+ display: block;
7
+ --canvas-background: var(--color-surface-container-low);
8
+ --canvas-dot-color: var(--color-outline-variant);
9
+ --canvas-line-color: var(--color-on-surface);
10
+ --canvas-hover-color: var(--color-primary);
11
+ --canvas-arrow-color: var(--color-on-surface);
12
+ }
13
+
14
+ .canvas-wrapper {
15
+ background: var(--canvas-background);
16
+ border-radius: var(--shape-corner-medium);
17
+ }
18
+
19
+ #canvas-background circle {
20
+ fill: var(--canvas-dot-color);
21
+ }
22
+
23
+ #endarrow polyline {
24
+ fill: none;
25
+ stroke: var(--canvas-arrow-color);
26
+ vector-effect: non-scaling-stroke;
27
+ stroke-width: 2;
28
+ }
29
+
30
+ .line {
31
+ &.no-color {
32
+ stroke: var(--canvas-line-color);
33
+ }
34
+
35
+ &.variant-dashed {
36
+ stroke-dasharray: 6 6;
37
+ }
38
+
39
+ &.variant-animated-dashed {
40
+ animation: canvas-dash-flow 600ms linear infinite;
41
+ }
42
+ }
43
+
44
+ .clickable {
45
+ cursor: pointer;
46
+
47
+ &:hover .line {
48
+ stroke: var(--canvas-hover-color);
49
+ }
50
+ }
51
+
52
+ .line.clickable:hover {
53
+ stroke: var(--canvas-hover-color);
54
+ }
55
+
56
+ @keyframes canvas-dash-flow {
57
+ to {
58
+ stroke-dashoffset: -12;
59
+ }
60
+ }