@screenly/edge-apps 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/fonts/Inter-Medium.woff2 +0 -0
- package/dist/assets/fonts/Inter-Regular.woff2 +0 -0
- package/dist/assets/fonts/Inter-SemiBold.woff2 +0 -0
- package/dist/assets/images/icons/chancesleet.svg +4 -0
- package/dist/assets/images/icons/clear-night.svg +5 -0
- package/dist/assets/images/icons/clear.svg +11 -0
- package/dist/assets/images/icons/cloudy.svg +4 -0
- package/dist/assets/images/icons/drizzle.svg +5 -0
- package/dist/assets/images/icons/fewdrops.svg +4 -0
- package/dist/assets/images/icons/fog.svg +6 -0
- package/dist/assets/images/icons/haze.svg +6 -0
- package/dist/assets/images/icons/mostly-cloudy-night.svg +7 -0
- package/dist/assets/images/icons/mostly-cloudy.svg +13 -0
- package/dist/assets/images/icons/partially-cloudy-night.svg +6 -0
- package/dist/assets/images/icons/partially-cloudy.svg +12 -0
- package/dist/assets/images/icons/partlysunny.svg +6 -0
- package/dist/assets/images/icons/rain-night.svg +8 -0
- package/dist/assets/images/icons/rainy.svg +6 -0
- package/dist/assets/images/icons/sleet-night.svg +14 -0
- package/dist/assets/images/icons/sleet.svg +4 -0
- package/dist/assets/images/icons/snow.svg +19 -0
- package/dist/assets/images/icons/thunderstorm-night.svg +9 -0
- package/dist/assets/images/icons/thunderstorm.svg +7 -0
- package/dist/assets/images/icons/windy.svg +6 -0
- package/dist/assets/images/screenly.svg +10 -0
- package/dist/components/app-header/app-header.d.ts +43 -0
- package/dist/components/app-header/app-header.d.ts.map +1 -0
- package/dist/components/app-header/app-header.js +244 -0
- package/dist/components/auto-scaler/auto-scaler.d.ts +65 -0
- package/dist/components/auto-scaler/auto-scaler.d.ts.map +1 -0
- package/dist/components/auto-scaler/auto-scaler.js +304 -0
- package/dist/components/brand-logo/brand-logo.d.ts +42 -0
- package/dist/components/brand-logo/brand-logo.d.ts.map +1 -0
- package/dist/components/brand-logo/brand-logo.js +209 -0
- package/dist/components/calendar-views/calendar-view-utils.d.ts +5 -0
- package/dist/components/calendar-views/calendar-view-utils.d.ts.map +1 -0
- package/dist/components/calendar-views/calendar-view-utils.js +73 -0
- package/dist/components/calendar-views/calendar-window-utils.d.ts +9 -0
- package/dist/components/calendar-views/calendar-window-utils.d.ts.map +1 -0
- package/dist/components/calendar-views/calendar-window-utils.js +57 -0
- package/dist/components/calendar-views/daily-calendar-view/daily-calendar-view-styles.d.ts +2 -0
- package/dist/components/calendar-views/daily-calendar-view/daily-calendar-view-styles.d.ts.map +1 -0
- package/dist/components/calendar-views/daily-calendar-view/daily-calendar-view-styles.js +175 -0
- package/dist/components/calendar-views/daily-calendar-view/daily-calendar-view.d.ts +21 -0
- package/dist/components/calendar-views/daily-calendar-view/daily-calendar-view.d.ts.map +1 -0
- package/dist/components/calendar-views/daily-calendar-view/daily-calendar-view.js +130 -0
- package/dist/components/calendar-views/daily-calendar-view/index.d.ts +2 -0
- package/dist/components/calendar-views/daily-calendar-view/index.d.ts.map +1 -0
- package/dist/components/calendar-views/daily-calendar-view/index.js +1 -0
- package/dist/components/calendar-views/event-layout.d.ts +18 -0
- package/dist/components/calendar-views/event-layout.d.ts.map +1 -0
- package/dist/components/calendar-views/event-layout.js +139 -0
- package/dist/components/calendar-views/schedule-calendar-view/index.d.ts +2 -0
- package/dist/components/calendar-views/schedule-calendar-view/index.d.ts.map +1 -0
- package/dist/components/calendar-views/schedule-calendar-view/index.js +1 -0
- package/dist/components/calendar-views/schedule-calendar-view/schedule-calendar-view-styles.d.ts +2 -0
- package/dist/components/calendar-views/schedule-calendar-view/schedule-calendar-view-styles.d.ts.map +1 -0
- package/dist/components/calendar-views/schedule-calendar-view/schedule-calendar-view-styles.js +118 -0
- package/dist/components/calendar-views/schedule-calendar-view/schedule-calendar-view.d.ts +23 -0
- package/dist/components/calendar-views/schedule-calendar-view/schedule-calendar-view.d.ts.map +1 -0
- package/dist/components/calendar-views/schedule-calendar-view/schedule-calendar-view.js +167 -0
- package/dist/components/calendar-views/weekly-calendar-view/index.d.ts +3 -0
- package/dist/components/calendar-views/weekly-calendar-view/index.d.ts.map +1 -0
- package/dist/components/calendar-views/weekly-calendar-view/index.js +1 -0
- package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view-styles.d.ts +2 -0
- package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view-styles.d.ts.map +1 -0
- package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view-styles.js +234 -0
- package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view-utils.d.ts +16 -0
- package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view-utils.d.ts.map +1 -0
- package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view-utils.js +83 -0
- package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view.d.ts +26 -0
- package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view.d.ts.map +1 -0
- package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view.js +220 -0
- package/dist/components/dev-tools/dev-tools.d.ts +48 -0
- package/dist/components/dev-tools/dev-tools.d.ts.map +1 -0
- package/dist/components/dev-tools/dev-tools.js +186 -0
- package/dist/components/index.d.ts +14 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +13 -0
- package/dist/components/register.d.ts +12 -0
- package/dist/components/register.d.ts.map +1 -0
- package/dist/components/register.js +11 -0
- package/dist/core/index.d.ts +30 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +77 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/test/index.d.ts +3 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +2 -0
- package/dist/test/mock.d.ts +23 -0
- package/dist/test/mock.d.ts.map +1 -0
- package/dist/test/mock.js +49 -0
- package/dist/test/screenshots.d.ts +120 -0
- package/dist/test/screenshots.d.ts.map +1 -0
- package/dist/test/screenshots.js +127 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +13 -0
- package/dist/types/index.d.ts +138 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +15 -0
- package/dist/utils/calendar.d.ts +28 -0
- package/dist/utils/calendar.d.ts.map +1 -0
- package/dist/utils/calendar.js +77 -0
- package/dist/utils/error-handling.d.ts +6 -0
- package/dist/utils/error-handling.d.ts.map +1 -0
- package/dist/utils/error-handling.js +16 -0
- package/dist/utils/html.d.ts +7 -0
- package/dist/utils/html.d.ts.map +1 -0
- package/dist/utils/html.js +13 -0
- package/dist/utils/index.d.ts +13 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +12 -0
- package/dist/utils/locale.d.ts +68 -0
- package/dist/utils/locale.d.ts.map +1 -0
- package/dist/utils/locale.js +318 -0
- package/dist/utils/metadata.d.ts +39 -0
- package/dist/utils/metadata.d.ts.map +1 -0
- package/dist/utils/metadata.js +66 -0
- package/dist/utils/oauth.d.ts +16 -0
- package/dist/utils/oauth.d.ts.map +1 -0
- package/dist/utils/oauth.js +42 -0
- package/dist/utils/screen.d.ts +26 -0
- package/dist/utils/screen.d.ts.map +1 -0
- package/dist/utils/screen.js +44 -0
- package/dist/utils/settings.d.ts +38 -0
- package/dist/utils/settings.d.ts.map +1 -0
- package/dist/utils/settings.js +89 -0
- package/dist/utils/template.d.ts +2 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/utils/template.js +6 -0
- package/dist/utils/theme.d.ts +47 -0
- package/dist/utils/theme.d.ts.map +1 -0
- package/dist/utils/theme.js +183 -0
- package/dist/utils/utm.d.ts +23 -0
- package/dist/utils/utm.d.ts.map +1 -0
- package/dist/utils/utm.js +30 -0
- package/dist/utils/weather.d.ts +84 -0
- package/dist/utils/weather.d.ts.map +1 -0
- package/dist/utils/weather.js +272 -0
- package/package.json +2 -1
package/dist/components/calendar-views/schedule-calendar-view/schedule-calendar-view-styles.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
export const COMPONENT_CSS = `:host {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
width: 100%;
|
|
5
|
+
height: 100%;
|
|
6
|
+
background: transparent;
|
|
7
|
+
font-family: 'Inter', system-ui, sans-serif;
|
|
8
|
+
overflow: hidden;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
*,
|
|
12
|
+
*::before,
|
|
13
|
+
*::after {
|
|
14
|
+
box-sizing: border-box;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.schedule-container {
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-direction: column;
|
|
20
|
+
width: 100%;
|
|
21
|
+
height: 100%;
|
|
22
|
+
padding: 1rem 1.25rem 1rem 1rem;
|
|
23
|
+
gap: 1.5rem;
|
|
24
|
+
overflow: hidden;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.schedule-title {
|
|
28
|
+
font-size: 2.8125rem;
|
|
29
|
+
font-weight: 400;
|
|
30
|
+
color: var(--theme-color-primary, #0f3a97);
|
|
31
|
+
letter-spacing: -0.1125rem;
|
|
32
|
+
margin: 2rem 0 0 0;
|
|
33
|
+
line-height: normal;
|
|
34
|
+
text-align: center;
|
|
35
|
+
flex-shrink: 0;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.schedule-body {
|
|
39
|
+
display: flex;
|
|
40
|
+
flex: 1;
|
|
41
|
+
min-height: 0;
|
|
42
|
+
background: #fff;
|
|
43
|
+
border-radius: 0.75rem;
|
|
44
|
+
overflow: hidden;
|
|
45
|
+
padding: 1.5rem;
|
|
46
|
+
gap: 2rem;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.day-section {
|
|
50
|
+
display: flex;
|
|
51
|
+
flex-direction: column;
|
|
52
|
+
flex: 1;
|
|
53
|
+
min-width: 0;
|
|
54
|
+
gap: 0.75rem;
|
|
55
|
+
overflow: hidden;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.day-section + .day-section {
|
|
59
|
+
border-left: 0.0625rem solid #f3f4f6;
|
|
60
|
+
padding-left: 2rem;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.day-heading {
|
|
64
|
+
font-size: 0.98rem;
|
|
65
|
+
font-weight: 500;
|
|
66
|
+
color: #6b7280;
|
|
67
|
+
text-transform: uppercase;
|
|
68
|
+
letter-spacing: 0.05em;
|
|
69
|
+
line-height: 1.333;
|
|
70
|
+
flex-shrink: 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.events-list {
|
|
74
|
+
display: flex;
|
|
75
|
+
flex-direction: column;
|
|
76
|
+
gap: 0.5rem;
|
|
77
|
+
overflow: hidden;
|
|
78
|
+
flex: 1;
|
|
79
|
+
min-height: 0;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.event-item {
|
|
83
|
+
display: flex;
|
|
84
|
+
flex-direction: column;
|
|
85
|
+
background: #ededed;
|
|
86
|
+
border-left: 0.327rem solid var(--theme-color-primary, #0f3a97);
|
|
87
|
+
border-radius: 0 0.5rem 0.5rem 0;
|
|
88
|
+
padding: 0.5rem 0.75rem;
|
|
89
|
+
gap: 0.2rem;
|
|
90
|
+
flex-shrink: 0;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.event-title {
|
|
94
|
+
font-size: 0.9rem;
|
|
95
|
+
font-weight: 500;
|
|
96
|
+
color: #111827;
|
|
97
|
+
white-space: nowrap;
|
|
98
|
+
overflow: hidden;
|
|
99
|
+
text-overflow: ellipsis;
|
|
100
|
+
line-height: normal;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.event-time {
|
|
104
|
+
font-size: 0.8rem;
|
|
105
|
+
font-weight: 400;
|
|
106
|
+
color: var(--theme-color-primary, #0f3a97);
|
|
107
|
+
white-space: nowrap;
|
|
108
|
+
overflow: hidden;
|
|
109
|
+
text-overflow: ellipsis;
|
|
110
|
+
line-height: normal;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.no-events {
|
|
114
|
+
font-size: 0.9rem;
|
|
115
|
+
color: #9ca3af;
|
|
116
|
+
text-align: center;
|
|
117
|
+
padding: 1.5rem 0;
|
|
118
|
+
}`;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { CalendarEvent } from '../event-layout.js';
|
|
2
|
+
export type { CalendarEvent };
|
|
3
|
+
export declare class ScheduleCalendarView extends HTMLElement {
|
|
4
|
+
private _events;
|
|
5
|
+
private _now;
|
|
6
|
+
private _timezone;
|
|
7
|
+
private _locale;
|
|
8
|
+
private _initialized;
|
|
9
|
+
static get observedAttributes(): string[];
|
|
10
|
+
constructor();
|
|
11
|
+
connectedCallback(): void;
|
|
12
|
+
attributeChangedCallback(name: string, _oldVal: string, newVal: string): void;
|
|
13
|
+
get events(): CalendarEvent[];
|
|
14
|
+
set events(value: CalendarEvent[]);
|
|
15
|
+
get now(): Date;
|
|
16
|
+
set now(value: Date);
|
|
17
|
+
private _getVisibleEvents;
|
|
18
|
+
private _buildEventItem;
|
|
19
|
+
private _buildDaySection;
|
|
20
|
+
private _getDayLabel;
|
|
21
|
+
private _render;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=schedule-calendar-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-calendar-view.d.ts","sourceRoot":"","sources":["../../../../src/components/calendar-views/schedule-calendar-view/schedule-calendar-view.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAOvD,YAAY,EAAE,aAAa,EAAE,CAAA;AAI7B,qBAAa,oBAAqB,SAAQ,WAAW;IACnD,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,YAAY,CAAiB;IAErC,MAAM,KAAK,kBAAkB,aAE5B;;IAOD,iBAAiB;IAKjB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMtE,IAAI,MAAM,IAAI,aAAa,EAAE,CAE5B;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,EAGhC;IAED,IAAI,GAAG,IAAI,IAAI,CAEd;IAED,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,EAGlB;IAED,OAAO,CAAC,iBAAiB;IAgDzB,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,OAAO;CA+BhB"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
import utc from 'dayjs/plugin/utc';
|
|
3
|
+
import timezone from 'dayjs/plugin/timezone';
|
|
4
|
+
import { COMPONENT_CSS } from './schedule-calendar-view-styles.js';
|
|
5
|
+
import { formatEventTime } from '../weekly-calendar-view/weekly-calendar-view-utils.js';
|
|
6
|
+
dayjs.extend(utc);
|
|
7
|
+
dayjs.extend(timezone);
|
|
8
|
+
const MAX_EVENTS_TOTAL = 12;
|
|
9
|
+
export class ScheduleCalendarView extends HTMLElement {
|
|
10
|
+
_events = [];
|
|
11
|
+
_now = new Date();
|
|
12
|
+
_timezone = 'UTC';
|
|
13
|
+
_locale = 'en';
|
|
14
|
+
_initialized = false;
|
|
15
|
+
static get observedAttributes() {
|
|
16
|
+
return ['timezone', 'locale'];
|
|
17
|
+
}
|
|
18
|
+
constructor() {
|
|
19
|
+
super();
|
|
20
|
+
this.attachShadow({ mode: 'open' });
|
|
21
|
+
}
|
|
22
|
+
connectedCallback() {
|
|
23
|
+
this._initialized = true;
|
|
24
|
+
this._render();
|
|
25
|
+
}
|
|
26
|
+
attributeChangedCallback(name, _oldVal, newVal) {
|
|
27
|
+
if (name === 'timezone')
|
|
28
|
+
this._timezone = newVal || 'UTC';
|
|
29
|
+
if (name === 'locale')
|
|
30
|
+
this._locale = newVal || 'en';
|
|
31
|
+
if (this._initialized)
|
|
32
|
+
this._render();
|
|
33
|
+
}
|
|
34
|
+
get events() {
|
|
35
|
+
return this._events;
|
|
36
|
+
}
|
|
37
|
+
set events(value) {
|
|
38
|
+
this._events = value || [];
|
|
39
|
+
if (this._initialized)
|
|
40
|
+
this._render();
|
|
41
|
+
}
|
|
42
|
+
get now() {
|
|
43
|
+
return this._now;
|
|
44
|
+
}
|
|
45
|
+
set now(value) {
|
|
46
|
+
this._now = value;
|
|
47
|
+
if (this._initialized)
|
|
48
|
+
this._render();
|
|
49
|
+
}
|
|
50
|
+
_getVisibleEvents() {
|
|
51
|
+
const timezone = this._timezone;
|
|
52
|
+
const now = dayjs(this._now).tz(timezone);
|
|
53
|
+
const startOfToday = now.startOf('day');
|
|
54
|
+
const startOfTomorrow = startOfToday.add(1, 'day');
|
|
55
|
+
const startOfDayAfter = startOfTomorrow.add(1, 'day');
|
|
56
|
+
const sortByStart = (a, b) => dayjs(a.startTime).tz(timezone).valueOf() -
|
|
57
|
+
dayjs(b.startTime).tz(timezone).valueOf();
|
|
58
|
+
const todayAll = this._events
|
|
59
|
+
.filter((event) => {
|
|
60
|
+
if (event.isAllDay)
|
|
61
|
+
return false;
|
|
62
|
+
const start = dayjs(event.startTime).tz(timezone);
|
|
63
|
+
const end = dayjs(event.endTime).tz(timezone);
|
|
64
|
+
// Include events that start today and haven't ended yet (covers ongoing events)
|
|
65
|
+
return start.isBefore(startOfTomorrow) && end.isAfter(now);
|
|
66
|
+
})
|
|
67
|
+
.sort(sortByStart);
|
|
68
|
+
const tomorrowAll = this._events
|
|
69
|
+
.filter((event) => {
|
|
70
|
+
if (event.isAllDay)
|
|
71
|
+
return false;
|
|
72
|
+
const start = dayjs(event.startTime).tz(timezone);
|
|
73
|
+
return (!start.isBefore(startOfTomorrow) && start.isBefore(startOfDayAfter));
|
|
74
|
+
})
|
|
75
|
+
.sort(sortByStart);
|
|
76
|
+
let todayEvents;
|
|
77
|
+
let tomorrowEvents;
|
|
78
|
+
if (todayAll.length >= MAX_EVENTS_TOTAL) {
|
|
79
|
+
todayEvents = todayAll.slice(0, MAX_EVENTS_TOTAL);
|
|
80
|
+
tomorrowEvents = [];
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
todayEvents = todayAll;
|
|
84
|
+
tomorrowEvents = tomorrowAll.slice(0, MAX_EVENTS_TOTAL - todayAll.length);
|
|
85
|
+
}
|
|
86
|
+
return { todayEvents, tomorrowEvents };
|
|
87
|
+
}
|
|
88
|
+
_buildEventItem(event) {
|
|
89
|
+
const timezone = this._timezone;
|
|
90
|
+
const locale = this._locale;
|
|
91
|
+
const item = document.createElement('div');
|
|
92
|
+
item.className = 'event-item';
|
|
93
|
+
if (event.backgroundColor) {
|
|
94
|
+
item.style.setProperty('background-color', event.backgroundColor);
|
|
95
|
+
}
|
|
96
|
+
const titleEl = document.createElement('div');
|
|
97
|
+
titleEl.className = 'event-title';
|
|
98
|
+
titleEl.textContent = event.title;
|
|
99
|
+
const timeEl = document.createElement('div');
|
|
100
|
+
timeEl.className = 'event-time';
|
|
101
|
+
timeEl.textContent = formatEventTime(event.startTime, event.endTime, locale, timezone);
|
|
102
|
+
item.appendChild(titleEl);
|
|
103
|
+
item.appendChild(timeEl);
|
|
104
|
+
return item;
|
|
105
|
+
}
|
|
106
|
+
_buildDaySection(heading, events, showNoEvents) {
|
|
107
|
+
const section = document.createElement('div');
|
|
108
|
+
section.className = 'day-section';
|
|
109
|
+
const headingEl = document.createElement('h2');
|
|
110
|
+
headingEl.className = 'day-heading';
|
|
111
|
+
headingEl.textContent = heading;
|
|
112
|
+
section.appendChild(headingEl);
|
|
113
|
+
const list = document.createElement('div');
|
|
114
|
+
list.className = 'events-list';
|
|
115
|
+
if (events.length === 0 && showNoEvents) {
|
|
116
|
+
const empty = document.createElement('div');
|
|
117
|
+
empty.className = 'no-events';
|
|
118
|
+
empty.textContent = 'No upcoming events';
|
|
119
|
+
list.appendChild(empty);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
for (const event of events) {
|
|
123
|
+
list.appendChild(this._buildEventItem(event));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
section.appendChild(list);
|
|
127
|
+
return section;
|
|
128
|
+
}
|
|
129
|
+
_getDayLabel(offsetDays) {
|
|
130
|
+
const timezone = this._timezone;
|
|
131
|
+
const locale = this._locale;
|
|
132
|
+
const date = dayjs(this._now).tz(timezone).add(offsetDays, 'day');
|
|
133
|
+
const weekday = date.toDate().toLocaleDateString(locale, {
|
|
134
|
+
weekday: 'long',
|
|
135
|
+
timeZone: timezone,
|
|
136
|
+
});
|
|
137
|
+
const dayNum = date.date();
|
|
138
|
+
const month = date.toDate().toLocaleDateString(locale, {
|
|
139
|
+
month: 'short',
|
|
140
|
+
timeZone: timezone,
|
|
141
|
+
});
|
|
142
|
+
return `${weekday}, ${month} ${dayNum}`;
|
|
143
|
+
}
|
|
144
|
+
_render() {
|
|
145
|
+
const shadow = this.shadowRoot;
|
|
146
|
+
const { todayEvents, tomorrowEvents } = this._getVisibleEvents();
|
|
147
|
+
shadow.innerHTML = `<style>${COMPONENT_CSS}</style>`;
|
|
148
|
+
const container = document.createElement('div');
|
|
149
|
+
container.className = 'schedule-container';
|
|
150
|
+
const title = document.createElement('p');
|
|
151
|
+
title.className = 'schedule-title';
|
|
152
|
+
title.textContent = 'Schedule';
|
|
153
|
+
container.appendChild(title);
|
|
154
|
+
const body = document.createElement('div');
|
|
155
|
+
body.className = 'schedule-body';
|
|
156
|
+
body.appendChild(this._buildDaySection(this._getDayLabel(0), todayEvents, true));
|
|
157
|
+
if (tomorrowEvents.length > 0) {
|
|
158
|
+
body.appendChild(this._buildDaySection(this._getDayLabel(1), tomorrowEvents, false));
|
|
159
|
+
}
|
|
160
|
+
container.appendChild(body);
|
|
161
|
+
shadow.appendChild(container);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (typeof window !== 'undefined' &&
|
|
165
|
+
!customElements.get('schedule-calendar-view')) {
|
|
166
|
+
customElements.define('schedule-calendar-view', ScheduleCalendarView);
|
|
167
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/calendar-views/weekly-calendar-view/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { WeeklyCalendarView } from './weekly-calendar-view.js';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const COMPONENT_CSS = ":host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background: transparent;\n font-family: 'Inter', system-ui, sans-serif;\n overflow: hidden;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n.weekly-calendar-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n padding: 1rem 1.25rem 1rem 1rem;\n}\n\n.this-week-title {\n font-size: 2.8125rem;\n font-weight: 400;\n font-style: normal;\n color: var(--theme-color-primary, #0f3a97);\n letter-spacing: -0.1125rem;\n margin: 2rem 0 2.875rem 0;\n line-height: normal;\n text-align: center;\n flex-shrink: 0;\n}\n\n.week-grid {\n display: flex;\n flex: 1;\n min-height: 0;\n background: #fff;\n border-radius: 0.75rem;\n overflow: hidden;\n}\n\n.time-gutter {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n width: 6.5rem;\n padding-top: 5.225rem;\n}\n\n.time-label {\n flex: 1;\n display: flex;\n align-items: flex-start;\n justify-content: flex-end;\n padding-right: 1rem;\n font-size: 0.98rem;\n color: #6b7280;\n white-space: nowrap;\n transform: translateY(-0.5em);\n}\n\n.days-grid {\n display: flex;\n flex: 1;\n min-width: 0;\n border-left: 0.0625rem solid #f3f4f6;\n}\n\n.day-column {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n border-right: 0.0625rem solid #f3f4f6;\n}\n\n.day-column:last-child {\n border-right: none;\n}\n\n.day-header {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 0.375rem 0.25rem;\n gap: 0.125rem;\n height: 5.225rem;\n flex-shrink: 0;\n border-bottom: 0.0625rem solid #f3f4f6;\n}\n\n.day-header.today {\n background: var(--theme-color-primary, #0f3a97);\n}\n\n.day-name {\n font-size: 0.98rem;\n font-weight: 500;\n color: #6b7280;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n line-height: 1.333;\n}\n\n.day-header.today .day-name {\n color: #fff;\n opacity: 0.8;\n}\n\n.day-date {\n font-size: 1.469rem;\n font-weight: 600;\n color: #111827;\n line-height: 1.556;\n}\n\n.day-header.today .day-date {\n color: #fff;\n}\n\n.day-body {\n flex: 1;\n position: relative;\n display: flex;\n flex-direction: column;\n overflow: visible;\n}\n\n.hour-row {\n flex: 1;\n border-bottom: 0.0625rem solid #f3f4f6;\n position: relative;\n min-height: 0;\n}\n\n.hour-row:last-child {\n border-bottom: none;\n}\n\n.events-area {\n position: absolute;\n top: 0;\n left: 0.327rem;\n bottom: 0;\n right: 0.653rem;\n}\n\n.event-wrapper {\n position: absolute;\n z-index: 2;\n outline: 0.125rem solid white;\n border-radius: 0 0.653rem 0.653rem 0;\n}\n\n.event-item {\n height: 100%;\n background: #ededed;\n border-left: 0.327rem solid var(--theme-color-primary, #0f3a97);\n border-radius: 0 0.653rem 0.653rem 0;\n padding: 0.5rem 0.98rem;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: flex-start;\n gap: 0.327rem;\n}\n\n.event-item.event-compact {\n justify-content: center;\n padding-top: 0;\n padding-bottom: 0;\n}\n\n.event-inline-time {\n color: var(--theme-color-primary, #0f3a97);\n}\n\n.event-item.clipped-top {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.event-item.clipped-bottom {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.event-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: #111827;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: normal;\n}\n\n.event-time {\n font-size: 0.75rem;\n font-weight: 400;\n color: var(--theme-color-primary, #0f3a97);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: normal;\n}\n\n.current-time-indicator {\n position: absolute;\n left: 0;\n right: 0;\n height: 0.125rem;\n background: #ea4335;\n z-index: 10;\n pointer-events: none;\n}\n\n.current-time-indicator::before {\n content: '';\n position: absolute;\n left: -0.25rem;\n top: 50%;\n transform: translateY(-50%);\n width: 0.5rem;\n height: 0.5rem;\n border-radius: 50%;\n background: #ea4335;\n}";
|
|
2
|
+
//# sourceMappingURL=weekly-calendar-view-styles.d.ts.map
|
package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view-styles.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weekly-calendar-view-styles.d.ts","sourceRoot":"","sources":["../../../../src/components/calendar-views/weekly-calendar-view/weekly-calendar-view-styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,0mIAyOxB,CAAA"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
export const COMPONENT_CSS = `:host {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
width: 100%;
|
|
5
|
+
height: 100%;
|
|
6
|
+
background: transparent;
|
|
7
|
+
font-family: 'Inter', system-ui, sans-serif;
|
|
8
|
+
overflow: hidden;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
*,
|
|
12
|
+
*::before,
|
|
13
|
+
*::after {
|
|
14
|
+
box-sizing: border-box;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.weekly-calendar-container {
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-direction: column;
|
|
20
|
+
width: 100%;
|
|
21
|
+
height: 100%;
|
|
22
|
+
padding: 1rem 1.25rem 1rem 1rem;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.this-week-title {
|
|
26
|
+
font-size: 2.8125rem;
|
|
27
|
+
font-weight: 400;
|
|
28
|
+
font-style: normal;
|
|
29
|
+
color: var(--theme-color-primary, #0f3a97);
|
|
30
|
+
letter-spacing: -0.1125rem;
|
|
31
|
+
margin: 2rem 0 2.875rem 0;
|
|
32
|
+
line-height: normal;
|
|
33
|
+
text-align: center;
|
|
34
|
+
flex-shrink: 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.week-grid {
|
|
38
|
+
display: flex;
|
|
39
|
+
flex: 1;
|
|
40
|
+
min-height: 0;
|
|
41
|
+
background: #fff;
|
|
42
|
+
border-radius: 0.75rem;
|
|
43
|
+
overflow: hidden;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.time-gutter {
|
|
47
|
+
display: flex;
|
|
48
|
+
flex-direction: column;
|
|
49
|
+
flex-shrink: 0;
|
|
50
|
+
width: 6.5rem;
|
|
51
|
+
padding-top: 5.225rem;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.time-label {
|
|
55
|
+
flex: 1;
|
|
56
|
+
display: flex;
|
|
57
|
+
align-items: flex-start;
|
|
58
|
+
justify-content: flex-end;
|
|
59
|
+
padding-right: 1rem;
|
|
60
|
+
font-size: 0.98rem;
|
|
61
|
+
color: #6b7280;
|
|
62
|
+
white-space: nowrap;
|
|
63
|
+
transform: translateY(-0.5em);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.days-grid {
|
|
67
|
+
display: flex;
|
|
68
|
+
flex: 1;
|
|
69
|
+
min-width: 0;
|
|
70
|
+
border-left: 0.0625rem solid #f3f4f6;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.day-column {
|
|
74
|
+
display: flex;
|
|
75
|
+
flex-direction: column;
|
|
76
|
+
flex: 1;
|
|
77
|
+
min-width: 0;
|
|
78
|
+
border-right: 0.0625rem solid #f3f4f6;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.day-column:last-child {
|
|
82
|
+
border-right: none;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.day-header {
|
|
86
|
+
display: flex;
|
|
87
|
+
flex-direction: column;
|
|
88
|
+
align-items: center;
|
|
89
|
+
justify-content: center;
|
|
90
|
+
padding: 0.375rem 0.25rem;
|
|
91
|
+
gap: 0.125rem;
|
|
92
|
+
height: 5.225rem;
|
|
93
|
+
flex-shrink: 0;
|
|
94
|
+
border-bottom: 0.0625rem solid #f3f4f6;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.day-header.today {
|
|
98
|
+
background: var(--theme-color-primary, #0f3a97);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.day-name {
|
|
102
|
+
font-size: 0.98rem;
|
|
103
|
+
font-weight: 500;
|
|
104
|
+
color: #6b7280;
|
|
105
|
+
text-transform: uppercase;
|
|
106
|
+
letter-spacing: 0.03em;
|
|
107
|
+
line-height: 1.333;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.day-header.today .day-name {
|
|
111
|
+
color: #fff;
|
|
112
|
+
opacity: 0.8;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.day-date {
|
|
116
|
+
font-size: 1.469rem;
|
|
117
|
+
font-weight: 600;
|
|
118
|
+
color: #111827;
|
|
119
|
+
line-height: 1.556;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.day-header.today .day-date {
|
|
123
|
+
color: #fff;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.day-body {
|
|
127
|
+
flex: 1;
|
|
128
|
+
position: relative;
|
|
129
|
+
display: flex;
|
|
130
|
+
flex-direction: column;
|
|
131
|
+
overflow: visible;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.hour-row {
|
|
135
|
+
flex: 1;
|
|
136
|
+
border-bottom: 0.0625rem solid #f3f4f6;
|
|
137
|
+
position: relative;
|
|
138
|
+
min-height: 0;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.hour-row:last-child {
|
|
142
|
+
border-bottom: none;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.events-area {
|
|
146
|
+
position: absolute;
|
|
147
|
+
top: 0;
|
|
148
|
+
left: 0.327rem;
|
|
149
|
+
bottom: 0;
|
|
150
|
+
right: 0.653rem;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.event-wrapper {
|
|
154
|
+
position: absolute;
|
|
155
|
+
z-index: 2;
|
|
156
|
+
outline: 0.125rem solid white;
|
|
157
|
+
border-radius: 0 0.653rem 0.653rem 0;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.event-item {
|
|
161
|
+
height: 100%;
|
|
162
|
+
background: #ededed;
|
|
163
|
+
border-left: 0.327rem solid var(--theme-color-primary, #0f3a97);
|
|
164
|
+
border-radius: 0 0.653rem 0.653rem 0;
|
|
165
|
+
padding: 0.5rem 0.98rem;
|
|
166
|
+
overflow: hidden;
|
|
167
|
+
display: flex;
|
|
168
|
+
flex-direction: column;
|
|
169
|
+
align-items: flex-start;
|
|
170
|
+
justify-content: flex-start;
|
|
171
|
+
gap: 0.327rem;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.event-item.event-compact {
|
|
175
|
+
justify-content: center;
|
|
176
|
+
padding-top: 0;
|
|
177
|
+
padding-bottom: 0;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.event-inline-time {
|
|
181
|
+
color: var(--theme-color-primary, #0f3a97);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.event-item.clipped-top {
|
|
185
|
+
border-top-left-radius: 0;
|
|
186
|
+
border-top-right-radius: 0;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.event-item.clipped-bottom {
|
|
190
|
+
border-bottom-left-radius: 0;
|
|
191
|
+
border-bottom-right-radius: 0;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.event-title {
|
|
195
|
+
font-size: 0.875rem;
|
|
196
|
+
font-weight: 500;
|
|
197
|
+
color: #111827;
|
|
198
|
+
white-space: nowrap;
|
|
199
|
+
overflow: hidden;
|
|
200
|
+
text-overflow: ellipsis;
|
|
201
|
+
line-height: normal;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.event-time {
|
|
205
|
+
font-size: 0.75rem;
|
|
206
|
+
font-weight: 400;
|
|
207
|
+
color: var(--theme-color-primary, #0f3a97);
|
|
208
|
+
white-space: nowrap;
|
|
209
|
+
overflow: hidden;
|
|
210
|
+
text-overflow: ellipsis;
|
|
211
|
+
line-height: normal;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.current-time-indicator {
|
|
215
|
+
position: absolute;
|
|
216
|
+
left: 0;
|
|
217
|
+
right: 0;
|
|
218
|
+
height: 0.125rem;
|
|
219
|
+
background: #ea4335;
|
|
220
|
+
z-index: 10;
|
|
221
|
+
pointer-events: none;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.current-time-indicator::before {
|
|
225
|
+
content: '';
|
|
226
|
+
position: absolute;
|
|
227
|
+
left: -0.25rem;
|
|
228
|
+
top: 50%;
|
|
229
|
+
transform: translateY(-50%);
|
|
230
|
+
width: 0.5rem;
|
|
231
|
+
height: 0.5rem;
|
|
232
|
+
border-radius: 50%;
|
|
233
|
+
background: #ea4335;
|
|
234
|
+
}`;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CalendarEvent, EventLayout } from '../event-layout.js';
|
|
2
|
+
export type { TimeSlot } from '../calendar-window-utils.js';
|
|
3
|
+
export declare function getEventStyle(event: CalendarEvent, windowStartHour: number, layout: EventLayout, timezone: string): {
|
|
4
|
+
topPercent: number;
|
|
5
|
+
heightPercent: number;
|
|
6
|
+
widthPercent: number;
|
|
7
|
+
leftPercent: number;
|
|
8
|
+
zIndex: number;
|
|
9
|
+
clippedTop: boolean;
|
|
10
|
+
clippedBottom: boolean;
|
|
11
|
+
isLastColumn: boolean;
|
|
12
|
+
};
|
|
13
|
+
export declare function formatEventStartTime(startTime: string, locale: string, timezone: string): string;
|
|
14
|
+
export declare function formatEventTime(startTime: string, endTime: string, locale: string, timezone: string): string;
|
|
15
|
+
export declare function setAttribute(el: HTMLElement, name: string, value: string): void;
|
|
16
|
+
//# sourceMappingURL=weekly-calendar-view-utils.d.ts.map
|
package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view-utils.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weekly-calendar-view-utils.d.ts","sourceRoot":"","sources":["../../../../src/components/calendar-views/weekly-calendar-view/weekly-calendar-view-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACpE,YAAY,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAK3D,wBAAgB,aAAa,CAC3B,KAAK,EAAE,aAAa,EACpB,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,GACf;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,OAAO,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;IACtB,YAAY,EAAE,OAAO,CAAA;CACtB,CA8CA;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,MAAM,CAYR;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,MAAM,CAaR;AAWD,wBAAgB,YAAY,CAC1B,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,IAAI,CAIN"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
import utc from 'dayjs/plugin/utc';
|
|
3
|
+
import timezone from 'dayjs/plugin/timezone';
|
|
4
|
+
dayjs.extend(utc);
|
|
5
|
+
dayjs.extend(timezone);
|
|
6
|
+
export function getEventStyle(event, windowStartHour, layout, timezone) {
|
|
7
|
+
const windowSize = 12;
|
|
8
|
+
const startDt = dayjs(event.startTime).tz(timezone);
|
|
9
|
+
const endDt = dayjs(event.endTime).tz(timezone);
|
|
10
|
+
// Anchor window to the event's calendar date in the target timezone
|
|
11
|
+
const windowStart = startDt.startOf('day').add(windowStartHour, 'hour');
|
|
12
|
+
const windowEnd = windowStart.add(windowSize, 'hour');
|
|
13
|
+
const startMs = startDt.valueOf();
|
|
14
|
+
const endMs = endDt.valueOf();
|
|
15
|
+
const windowStartMs = windowStart.valueOf();
|
|
16
|
+
const windowEndMs = windowEnd.valueOf();
|
|
17
|
+
const windowDurationMs = windowEnd.diff(windowStart);
|
|
18
|
+
const visibleStartMs = Math.max(startMs, windowStartMs);
|
|
19
|
+
const visibleEndMs = Math.min(endMs, windowEndMs);
|
|
20
|
+
const topPercent = ((visibleStartMs - windowStartMs) / windowDurationMs) * 100;
|
|
21
|
+
const heightPercent = Math.max(((visibleEndMs - visibleStartMs) / windowDurationMs) * 100, 0.5);
|
|
22
|
+
const clippedTop = startMs < windowStartMs;
|
|
23
|
+
const clippedBottom = endMs > windowEndMs;
|
|
24
|
+
const columnWidth = 100 / layout.totalColumns;
|
|
25
|
+
const span = layout.columnSpan > 0 ? layout.columnSpan : 1;
|
|
26
|
+
const isLastColumn = layout.column + span >= layout.totalColumns;
|
|
27
|
+
const overlapBonus = isLastColumn ? 0 : columnWidth * 0.7;
|
|
28
|
+
const widthPercent = columnWidth * span + overlapBonus;
|
|
29
|
+
const leftPercent = layout.column * columnWidth;
|
|
30
|
+
const zIndex = 2 + layout.column;
|
|
31
|
+
return {
|
|
32
|
+
topPercent,
|
|
33
|
+
heightPercent,
|
|
34
|
+
widthPercent,
|
|
35
|
+
leftPercent,
|
|
36
|
+
zIndex,
|
|
37
|
+
clippedTop,
|
|
38
|
+
clippedBottom,
|
|
39
|
+
isLastColumn,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export function formatEventStartTime(startTime, locale, timezone) {
|
|
43
|
+
try {
|
|
44
|
+
const start = new Date(startTime);
|
|
45
|
+
const opts = {
|
|
46
|
+
hour: 'numeric',
|
|
47
|
+
minute: '2-digit',
|
|
48
|
+
timeZone: timezone,
|
|
49
|
+
};
|
|
50
|
+
return start.toLocaleTimeString(locale, opts);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return '';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function formatEventTime(startTime, endTime, locale, timezone) {
|
|
57
|
+
try {
|
|
58
|
+
const start = new Date(startTime);
|
|
59
|
+
const end = new Date(endTime);
|
|
60
|
+
const opts = {
|
|
61
|
+
hour: 'numeric',
|
|
62
|
+
minute: '2-digit',
|
|
63
|
+
timeZone: timezone,
|
|
64
|
+
};
|
|
65
|
+
return `${start.toLocaleTimeString(locale, opts)} – ${end.toLocaleTimeString(locale, opts)}`;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return '';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const ALLOWED_ATTRIBUTES = new Set([
|
|
72
|
+
'class',
|
|
73
|
+
'style',
|
|
74
|
+
'data-day-index',
|
|
75
|
+
'data-hour',
|
|
76
|
+
'title',
|
|
77
|
+
'aria-label',
|
|
78
|
+
]);
|
|
79
|
+
export function setAttribute(el, name, value) {
|
|
80
|
+
if (ALLOWED_ATTRIBUTES.has(name) || name.startsWith('data-')) {
|
|
81
|
+
el.setAttribute(name, value);
|
|
82
|
+
}
|
|
83
|
+
}
|