@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.
Files changed (143) hide show
  1. package/dist/assets/fonts/Inter-Medium.woff2 +0 -0
  2. package/dist/assets/fonts/Inter-Regular.woff2 +0 -0
  3. package/dist/assets/fonts/Inter-SemiBold.woff2 +0 -0
  4. package/dist/assets/images/icons/chancesleet.svg +4 -0
  5. package/dist/assets/images/icons/clear-night.svg +5 -0
  6. package/dist/assets/images/icons/clear.svg +11 -0
  7. package/dist/assets/images/icons/cloudy.svg +4 -0
  8. package/dist/assets/images/icons/drizzle.svg +5 -0
  9. package/dist/assets/images/icons/fewdrops.svg +4 -0
  10. package/dist/assets/images/icons/fog.svg +6 -0
  11. package/dist/assets/images/icons/haze.svg +6 -0
  12. package/dist/assets/images/icons/mostly-cloudy-night.svg +7 -0
  13. package/dist/assets/images/icons/mostly-cloudy.svg +13 -0
  14. package/dist/assets/images/icons/partially-cloudy-night.svg +6 -0
  15. package/dist/assets/images/icons/partially-cloudy.svg +12 -0
  16. package/dist/assets/images/icons/partlysunny.svg +6 -0
  17. package/dist/assets/images/icons/rain-night.svg +8 -0
  18. package/dist/assets/images/icons/rainy.svg +6 -0
  19. package/dist/assets/images/icons/sleet-night.svg +14 -0
  20. package/dist/assets/images/icons/sleet.svg +4 -0
  21. package/dist/assets/images/icons/snow.svg +19 -0
  22. package/dist/assets/images/icons/thunderstorm-night.svg +9 -0
  23. package/dist/assets/images/icons/thunderstorm.svg +7 -0
  24. package/dist/assets/images/icons/windy.svg +6 -0
  25. package/dist/assets/images/screenly.svg +10 -0
  26. package/dist/components/app-header/app-header.d.ts +43 -0
  27. package/dist/components/app-header/app-header.d.ts.map +1 -0
  28. package/dist/components/app-header/app-header.js +244 -0
  29. package/dist/components/auto-scaler/auto-scaler.d.ts +65 -0
  30. package/dist/components/auto-scaler/auto-scaler.d.ts.map +1 -0
  31. package/dist/components/auto-scaler/auto-scaler.js +304 -0
  32. package/dist/components/brand-logo/brand-logo.d.ts +42 -0
  33. package/dist/components/brand-logo/brand-logo.d.ts.map +1 -0
  34. package/dist/components/brand-logo/brand-logo.js +209 -0
  35. package/dist/components/calendar-views/calendar-view-utils.d.ts +5 -0
  36. package/dist/components/calendar-views/calendar-view-utils.d.ts.map +1 -0
  37. package/dist/components/calendar-views/calendar-view-utils.js +73 -0
  38. package/dist/components/calendar-views/calendar-window-utils.d.ts +9 -0
  39. package/dist/components/calendar-views/calendar-window-utils.d.ts.map +1 -0
  40. package/dist/components/calendar-views/calendar-window-utils.js +57 -0
  41. package/dist/components/calendar-views/daily-calendar-view/daily-calendar-view-styles.d.ts +2 -0
  42. package/dist/components/calendar-views/daily-calendar-view/daily-calendar-view-styles.d.ts.map +1 -0
  43. package/dist/components/calendar-views/daily-calendar-view/daily-calendar-view-styles.js +175 -0
  44. package/dist/components/calendar-views/daily-calendar-view/daily-calendar-view.d.ts +21 -0
  45. package/dist/components/calendar-views/daily-calendar-view/daily-calendar-view.d.ts.map +1 -0
  46. package/dist/components/calendar-views/daily-calendar-view/daily-calendar-view.js +130 -0
  47. package/dist/components/calendar-views/daily-calendar-view/index.d.ts +2 -0
  48. package/dist/components/calendar-views/daily-calendar-view/index.d.ts.map +1 -0
  49. package/dist/components/calendar-views/daily-calendar-view/index.js +1 -0
  50. package/dist/components/calendar-views/event-layout.d.ts +18 -0
  51. package/dist/components/calendar-views/event-layout.d.ts.map +1 -0
  52. package/dist/components/calendar-views/event-layout.js +139 -0
  53. package/dist/components/calendar-views/schedule-calendar-view/index.d.ts +2 -0
  54. package/dist/components/calendar-views/schedule-calendar-view/index.d.ts.map +1 -0
  55. package/dist/components/calendar-views/schedule-calendar-view/index.js +1 -0
  56. package/dist/components/calendar-views/schedule-calendar-view/schedule-calendar-view-styles.d.ts +2 -0
  57. package/dist/components/calendar-views/schedule-calendar-view/schedule-calendar-view-styles.d.ts.map +1 -0
  58. package/dist/components/calendar-views/schedule-calendar-view/schedule-calendar-view-styles.js +118 -0
  59. package/dist/components/calendar-views/schedule-calendar-view/schedule-calendar-view.d.ts +23 -0
  60. package/dist/components/calendar-views/schedule-calendar-view/schedule-calendar-view.d.ts.map +1 -0
  61. package/dist/components/calendar-views/schedule-calendar-view/schedule-calendar-view.js +167 -0
  62. package/dist/components/calendar-views/weekly-calendar-view/index.d.ts +3 -0
  63. package/dist/components/calendar-views/weekly-calendar-view/index.d.ts.map +1 -0
  64. package/dist/components/calendar-views/weekly-calendar-view/index.js +1 -0
  65. package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view-styles.d.ts +2 -0
  66. package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view-styles.d.ts.map +1 -0
  67. package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view-styles.js +234 -0
  68. package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view-utils.d.ts +16 -0
  69. package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view-utils.d.ts.map +1 -0
  70. package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view-utils.js +83 -0
  71. package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view.d.ts +26 -0
  72. package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view.d.ts.map +1 -0
  73. package/dist/components/calendar-views/weekly-calendar-view/weekly-calendar-view.js +220 -0
  74. package/dist/components/dev-tools/dev-tools.d.ts +48 -0
  75. package/dist/components/dev-tools/dev-tools.d.ts.map +1 -0
  76. package/dist/components/dev-tools/dev-tools.js +186 -0
  77. package/dist/components/index.d.ts +14 -0
  78. package/dist/components/index.d.ts.map +1 -0
  79. package/dist/components/index.js +13 -0
  80. package/dist/components/register.d.ts +12 -0
  81. package/dist/components/register.d.ts.map +1 -0
  82. package/dist/components/register.js +11 -0
  83. package/dist/core/index.d.ts +30 -0
  84. package/dist/core/index.d.ts.map +1 -0
  85. package/dist/core/index.js +77 -0
  86. package/dist/index.d.ts +5 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +8 -0
  89. package/dist/test/index.d.ts +3 -0
  90. package/dist/test/index.d.ts.map +1 -0
  91. package/dist/test/index.js +2 -0
  92. package/dist/test/mock.d.ts +23 -0
  93. package/dist/test/mock.d.ts.map +1 -0
  94. package/dist/test/mock.js +49 -0
  95. package/dist/test/screenshots.d.ts +120 -0
  96. package/dist/test/screenshots.d.ts.map +1 -0
  97. package/dist/test/screenshots.js +127 -0
  98. package/dist/test/setup.d.ts +2 -0
  99. package/dist/test/setup.d.ts.map +1 -0
  100. package/dist/test/setup.js +13 -0
  101. package/dist/types/index.d.ts +138 -0
  102. package/dist/types/index.d.ts.map +1 -0
  103. package/dist/types/index.js +15 -0
  104. package/dist/utils/calendar.d.ts +28 -0
  105. package/dist/utils/calendar.d.ts.map +1 -0
  106. package/dist/utils/calendar.js +77 -0
  107. package/dist/utils/error-handling.d.ts +6 -0
  108. package/dist/utils/error-handling.d.ts.map +1 -0
  109. package/dist/utils/error-handling.js +16 -0
  110. package/dist/utils/html.d.ts +7 -0
  111. package/dist/utils/html.d.ts.map +1 -0
  112. package/dist/utils/html.js +13 -0
  113. package/dist/utils/index.d.ts +13 -0
  114. package/dist/utils/index.d.ts.map +1 -0
  115. package/dist/utils/index.js +12 -0
  116. package/dist/utils/locale.d.ts +68 -0
  117. package/dist/utils/locale.d.ts.map +1 -0
  118. package/dist/utils/locale.js +318 -0
  119. package/dist/utils/metadata.d.ts +39 -0
  120. package/dist/utils/metadata.d.ts.map +1 -0
  121. package/dist/utils/metadata.js +66 -0
  122. package/dist/utils/oauth.d.ts +16 -0
  123. package/dist/utils/oauth.d.ts.map +1 -0
  124. package/dist/utils/oauth.js +42 -0
  125. package/dist/utils/screen.d.ts +26 -0
  126. package/dist/utils/screen.d.ts.map +1 -0
  127. package/dist/utils/screen.js +44 -0
  128. package/dist/utils/settings.d.ts +38 -0
  129. package/dist/utils/settings.d.ts.map +1 -0
  130. package/dist/utils/settings.js +89 -0
  131. package/dist/utils/template.d.ts +2 -0
  132. package/dist/utils/template.d.ts.map +1 -0
  133. package/dist/utils/template.js +6 -0
  134. package/dist/utils/theme.d.ts +47 -0
  135. package/dist/utils/theme.d.ts.map +1 -0
  136. package/dist/utils/theme.js +183 -0
  137. package/dist/utils/utm.d.ts +23 -0
  138. package/dist/utils/utm.d.ts.map +1 -0
  139. package/dist/utils/utm.js +30 -0
  140. package/dist/utils/weather.d.ts +84 -0
  141. package/dist/utils/weather.d.ts.map +1 -0
  142. package/dist/utils/weather.js +272 -0
  143. package/package.json +2 -1
@@ -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,3 @@
1
+ export { WeeklyCalendarView } from './weekly-calendar-view.js';
2
+ export type { CalendarEvent } from '../event-layout.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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
@@ -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
@@ -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
+ }