@k2b/ui 0.22.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/content/Calendar.js +1122 -1065
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/CalendarDayView.js +1187 -0
- package/dist/browser/content/CalendarDayView.js.map +1 -0
- package/dist/browser/content/CalendarWeekView.js +1593 -0
- package/dist/browser/content/CalendarWeekView.js.map +1 -0
- package/dist/browser/content/ChartExplorer.js +174 -82
- package/dist/browser/content/ChartExplorer.js.map +1 -1
- package/dist/browser/content/ChartFilterControls.js +90 -33
- package/dist/browser/content/ChartFilterControls.js.map +1 -1
- package/dist/browser/content/DataTable.js +235 -197
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/calendar-day-scroll.js +111 -0
- package/dist/browser/content/calendar-day-scroll.js.map +1 -0
- package/dist/browser/content/calendar-days.js +408 -0
- package/dist/browser/content/calendar-days.js.map +1 -0
- package/dist/browser/content/calendar-dialogs.js +236 -0
- package/dist/browser/content/calendar-dialogs.js.map +1 -0
- package/dist/browser/content/calendar-messages.js +210 -2
- package/dist/browser/content/calendar-messages.js.map +1 -1
- package/dist/browser/content/calendar-pointer.js +15 -3
- package/dist/browser/content/calendar-pointer.js.map +1 -1
- package/dist/browser/content/calendar-shared.js +328 -0
- package/dist/browser/content/calendar-shared.js.map +1 -0
- package/dist/browser/content/calendar-time-view.js +1654 -0
- package/dist/browser/content/calendar-time-view.js.map +1 -0
- package/dist/browser/content/chart-messages.js +10 -0
- package/dist/browser/content/chart-messages.js.map +1 -1
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/inputs/Combobox.js +0 -1
- package/dist/browser/inputs/Combobox.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +125 -97
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/Navigation.js +18 -3
- package/dist/browser/layout/Navigation.js.map +1 -1
- package/dist/browser/layout/PageTitle.js +18 -1
- package/dist/browser/layout/PageTitle.js.map +1 -1
- package/dist/browser/layout/SidebarSwitcher.js +505 -0
- package/dist/browser/layout/SidebarSwitcher.js.map +1 -0
- package/dist/browser/layout/app-workspace-controller.js +174 -86
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/index.js +1 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/navigation-model.js +1 -0
- package/dist/browser/layout/navigation-model.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +18 -6
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/content/Calendar.js +553 -341
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/CalendarDayView.js +800 -0
- package/dist/ssr/content/CalendarDayView.js.map +1 -0
- package/dist/ssr/content/CalendarWeekView.js +1090 -0
- package/dist/ssr/content/CalendarWeekView.js.map +1 -0
- package/dist/ssr/content/ChartExplorer.js +93 -34
- package/dist/ssr/content/ChartExplorer.js.map +1 -1
- package/dist/ssr/content/ChartFilterControls.js +49 -7
- package/dist/ssr/content/ChartFilterControls.js.map +1 -1
- package/dist/ssr/content/DataTable.js +88 -66
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/calendar-day-scroll.js +111 -0
- package/dist/ssr/content/calendar-day-scroll.js.map +1 -0
- package/dist/ssr/content/calendar-days.js +408 -0
- package/dist/ssr/content/calendar-days.js.map +1 -0
- package/dist/ssr/content/calendar-dialogs.js +159 -0
- package/dist/ssr/content/calendar-dialogs.js.map +1 -0
- package/dist/ssr/content/calendar-messages.js +210 -2
- package/dist/ssr/content/calendar-messages.js.map +1 -1
- package/dist/ssr/content/calendar-pointer.js +15 -3
- package/dist/ssr/content/calendar-pointer.js.map +1 -1
- package/dist/ssr/content/calendar-shared.js +261 -0
- package/dist/ssr/content/calendar-shared.js.map +1 -0
- package/dist/ssr/content/calendar-time-view.js +1311 -0
- package/dist/ssr/content/calendar-time-view.js.map +1 -0
- package/dist/ssr/content/chart-messages.js +10 -0
- package/dist/ssr/content/chart-messages.js.map +1 -1
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/inputs/Combobox.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +40 -29
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/Navigation.js +12 -2
- package/dist/ssr/layout/Navigation.js.map +1 -1
- package/dist/ssr/layout/PageTitle.js +18 -1
- package/dist/ssr/layout/PageTitle.js.map +1 -1
- package/dist/ssr/layout/SidebarSwitcher.js +271 -0
- package/dist/ssr/layout/SidebarSwitcher.js.map +1 -0
- package/dist/ssr/layout/app-workspace-controller.js +174 -86
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/index.js +1 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/navigation-model.js +1 -0
- package/dist/ssr/layout/navigation-model.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +2 -2
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/content/Calendar.d.ts +95 -1
- package/dist/types/content/CalendarDayView.d.ts +7 -0
- package/dist/types/content/CalendarWeekView.d.ts +7 -0
- package/dist/types/content/ChartExplorer.d.ts +36 -1
- package/dist/types/content/ChartFilterControls.d.ts +6 -1
- package/dist/types/content/DataTable.d.ts +14 -0
- package/dist/types/content/calendar-day-scroll.d.ts +47 -0
- package/dist/types/content/calendar-days.d.ts +192 -0
- package/dist/types/content/calendar-dialogs.d.ts +22 -0
- package/dist/types/content/calendar-messages.d.ts +99 -0
- package/dist/types/content/calendar-pointer.d.ts +9 -0
- package/dist/types/content/calendar-shared.d.ts +69 -0
- package/dist/types/content/calendar-time-view.d.ts +252 -0
- package/dist/types/content/chart-messages.d.ts +5 -0
- package/dist/types/content/index.d.ts +2 -2
- package/dist/types/layout/AppWorkspace.d.ts +27 -3
- package/dist/types/layout/PageTitle.d.ts +2 -1
- package/dist/types/layout/SidebarSwitcher.d.ts +65 -0
- package/dist/types/layout/app-workspace-controller.d.ts +9 -1
- package/dist/types/layout/index.d.ts +1 -0
- package/dist/types/layout/navigation-model.d.ts +4 -0
- package/dist/types/surfaces/StatCell.d.ts +5 -0
- package/package.json +3 -3
|
@@ -0,0 +1,1593 @@
|
|
|
1
|
+
import { template as _$template } from "solid-js/web";
|
|
2
|
+
import { delegateEvents as _$delegateEvents } from "solid-js/web";
|
|
3
|
+
import { memo as _$memo } from "solid-js/web";
|
|
4
|
+
import { addEventListener as _$addEventListener } from "solid-js/web";
|
|
5
|
+
import { className as _$className } from "solid-js/web";
|
|
6
|
+
import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
|
|
7
|
+
import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
|
|
8
|
+
import { effect as _$effect } from "solid-js/web";
|
|
9
|
+
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
10
|
+
import { getNextMarker as _$getNextMarker } from "solid-js/web";
|
|
11
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
12
|
+
import { insert as _$insert } from "solid-js/web";
|
|
13
|
+
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
14
|
+
import { use as _$use } from "solid-js/web";
|
|
15
|
+
var _tmpl$ = /*#__PURE__*/_$template(`<span class=k2b-calendar-week__now-time aria-hidden=true>`),
|
|
16
|
+
_tmpl$2 = /*#__PURE__*/_$template(`<span class=k2b-calendar-night>`),
|
|
17
|
+
_tmpl$3 = /*#__PURE__*/_$template(`<span class=k2b-calendar-week__now-line>`),
|
|
18
|
+
_tmpl$4 = /*#__PURE__*/_$template(`<div class=k2b-calendar-week data-view=week><div class="k2b-calendar-week__scroll k2b-detail-trail"role=group><div class=k2b-calendar-week__grid><div class=k2b-calendar-week__top><div class=k2b-calendar-week__corner aria-hidden=true></div><!$><!/><div class=k2b-calendar-week__all-day-label aria-hidden=true><span class=k2b-calendar-week__all-day-long></span><span class=k2b-calendar-week__all-day-short></span></div><div class=k2b-calendar-week__all-day role=group><!$><!/><!$><!/></div></div><div class=k2b-calendar-week__body><div class=k2b-calendar-week__gutter><!$><!/><!$><!/><button type=button class=k2b-calendar-week__moon><i class="ti ti-moon"aria-hidden=true></i><i aria-hidden=true></i></button><!$><!/></div><div class=k2b-calendar-week__lines aria-hidden=true><!$><!/><!$><!/><!$><!/></div><!$><!/></div></div></div><p class=k2b-calendar-sr></p><!$><!/>`),
|
|
19
|
+
_tmpl$5 = /*#__PURE__*/_$template(`<button type=button class=k2b-calendar-week__head data-minute=-2><span class=k2b-calendar-week__weekday></span><span class=k2b-calendar-week__number></span><span class=k2b-calendar-week__extra></span><span class=k2b-calendar-week__load aria-hidden=true></span><span class=k2b-calendar-week__cheer aria-hidden=true><i class="ti ti-confetti"aria-hidden=true></i><span class=k2b-calendar-week__cheer-long></span><span class=k2b-calendar-week__cheer-short>`),
|
|
20
|
+
_tmpl$6 = /*#__PURE__*/_$template(`<span class=k2b-calendar-week__badge><!$><!/><!$><!/>`),
|
|
21
|
+
_tmpl$7 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
|
|
22
|
+
_tmpl$8 = /*#__PURE__*/_$template(`<span>`),
|
|
23
|
+
_tmpl$9 = /*#__PURE__*/_$template(`<div class=k2b-calendar-week__range aria-hidden=true style="grid-row:1 / -1">`),
|
|
24
|
+
_tmpl$0 = /*#__PURE__*/_$template(`<div class=k2b-calendar-week__slot><!$><!/><!$><!/>`),
|
|
25
|
+
_tmpl$1 = /*#__PURE__*/_$template(`<span class=k2b-calendar-week__hour aria-hidden=true>`),
|
|
26
|
+
_tmpl$10 = /*#__PURE__*/_$template(`<span class=k2b-calendar-week__hour data-night=true aria-hidden=true>`),
|
|
27
|
+
_tmpl$11 = /*#__PURE__*/_$template(`<span class=k2b-calendar-week__line>`),
|
|
28
|
+
_tmpl$12 = /*#__PURE__*/_$template(`<span class=k2b-calendar-week__fold>`),
|
|
29
|
+
_tmpl$13 = /*#__PURE__*/_$template(`<div class=k2b-calendar-week__fold-cell><ul class=k2b-calendar-fold__chips>`),
|
|
30
|
+
_tmpl$14 = /*#__PURE__*/_$template(`<span class=k2b-calendar-hover aria-hidden=true>`),
|
|
31
|
+
_tmpl$15 = /*#__PURE__*/_$template(`<div class=k2b-calendar-now aria-hidden=true>`),
|
|
32
|
+
_tmpl$16 = /*#__PURE__*/_$template(`<div class=k2b-calendar-week__column data-calendar-column role=group><!$><!/><!$><!/><!$><!/><!$><!/><!$><!/>`),
|
|
33
|
+
_tmpl$17 = /*#__PURE__*/_$template(`<li><!$><!/><!$><!/>`);
|
|
34
|
+
import { dates as calendar } from "@k2b/stdlib";
|
|
35
|
+
import { createComputed, createEffect, createMemo, createSignal, createUniqueId, For, on, onCleanup, onMount, Show, untrack } from "solid-js";
|
|
36
|
+
import { GESTURE_GAP_MS, snapToColumn, wheelAxis, wheelDelta, wheelPixels } from "./calendar-day-scroll";
|
|
37
|
+
import { addDayKeys, DAY_MINUTES, dayHeightTerms, dayKeyNumber, dayKeyRange, dayMinuteAt, dayY, dayYTerms, markerLanes, readDayGeometry, termsCss } from "./calendar-days";
|
|
38
|
+
import { layoutMonthWeek } from "./calendar-month-layout";
|
|
39
|
+
import { startCalendarPointerSession } from "./calendar-pointer";
|
|
40
|
+
import { EventChip, eventHref, followCalendarHref, textWidth } from "./calendar-shared";
|
|
41
|
+
import { createTimeView, dayBands, dayGaps, dayLoad, eventAccent, foldedEntries, gapAside, isNearNow, longDay, markerAbove, nightHours, reducedMotion, swallowNextClick, TimeBand, TimeCheck, TimeGap, TimeMarker, TimeOverlays, TimeQuickCreate, weekKeysOf } from "./calendar-time-view";
|
|
42
|
+
|
|
43
|
+
/** Room a bar keeps beside its title and date hint: padding, torn edge, gap, and an icon such as a task box. */
|
|
44
|
+
const HINT_SLACK_PX = 36;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The week view with `dayHours`: the loaded days side by side in one strip, seven on a wide screen and three on a
|
|
48
|
+
* phone. A trackpad, Shift with the wheel, or a finger scroll it sideways day by day; each gesture keeps the axis it
|
|
49
|
+
* started on, and the strip settles on a day edge. The arrows move by whole weeks.
|
|
50
|
+
*/
|
|
51
|
+
export const CalendarWeekView = props => {
|
|
52
|
+
const view = createTimeView(props);
|
|
53
|
+
const [mounted, setMounted] = createSignal(false);
|
|
54
|
+
const [firstIndex, setFirstIndex] = createSignal(0);
|
|
55
|
+
const [visibleCount, setVisibleCount] = createSignal(7);
|
|
56
|
+
/** The week whose nights decide whether the night rows open, set by navigation, not by free scrolling. */
|
|
57
|
+
const [nightWeek, setNightWeek] = createSignal(untrack(view.anchorKey));
|
|
58
|
+
const [nightOverride, setNightOverride] = createSignal(null);
|
|
59
|
+
const [roving, setRoving] = createSignal("");
|
|
60
|
+
let scroller;
|
|
61
|
+
const helpId = createUniqueId();
|
|
62
|
+
const anchorWeek = () => weekKeysOf(view, view.anchorKey());
|
|
63
|
+
// The server and the first render draw only the shown week, so the strip never flashes the days before it.
|
|
64
|
+
const keys = createMemo(() => {
|
|
65
|
+
const {
|
|
66
|
+
first,
|
|
67
|
+
last
|
|
68
|
+
} = view.range();
|
|
69
|
+
if (mounted()) return dayKeyRange(first, last);
|
|
70
|
+
const week = anchorWeek();
|
|
71
|
+
return week[0] >= first && week[6] <= last ? week : dayKeyRange(first, last);
|
|
72
|
+
});
|
|
73
|
+
const indexOf = key => dayKeyNumber(key) - dayKeyNumber(keys()[0]);
|
|
74
|
+
const nightsOpen = createMemo(() => {
|
|
75
|
+
const override = nightOverride();
|
|
76
|
+
if (override !== null) return override;
|
|
77
|
+
return weekKeysOf(view, nightWeek()).some(key => view.dayOf(key).night);
|
|
78
|
+
});
|
|
79
|
+
createEffect(on(nightWeek, () => setNightOverride(null), {
|
|
80
|
+
defer: true
|
|
81
|
+
}));
|
|
82
|
+
const wake = () => view.wake();
|
|
83
|
+
|
|
84
|
+
// Columns and scrolling.
|
|
85
|
+
/** The exact width of a day column: columns are a seventh or a third of the strip, rarely whole pixels. */
|
|
86
|
+
const columnWidth = () => scroller?.querySelector("[data-calendar-column]")?.getBoundingClientRect().width ?? 0;
|
|
87
|
+
const gutterWidth = () => scroller?.querySelector(".k2b-calendar-week__gutter")?.offsetWidth ?? 0;
|
|
88
|
+
const leftOf = index => index * columnWidth();
|
|
89
|
+
const visibleIndex = () => {
|
|
90
|
+
const width = columnWidth();
|
|
91
|
+
return width > 0 && scroller ? Math.round(scroller.scrollLeft / width) : 0;
|
|
92
|
+
};
|
|
93
|
+
const visibleKeys = () => {
|
|
94
|
+
const first = keys()[Math.min(keys().length - 1, Math.max(0, firstIndex()))] ?? view.anchorKey();
|
|
95
|
+
return {
|
|
96
|
+
first,
|
|
97
|
+
last: addDayKeys(first, visibleCount() - 1)
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
/** Now shows in the hours while today is among the days in view, like the prototype's week. */
|
|
101
|
+
const nowShown = () => {
|
|
102
|
+
const {
|
|
103
|
+
first,
|
|
104
|
+
last
|
|
105
|
+
} = visibleKeys();
|
|
106
|
+
const today = view.nowKey();
|
|
107
|
+
return today >= first && today <= last && view.nowMinute() >= 0 && view.nowMinute() < (nightsOpen() ? DAY_MINUTES : wake());
|
|
108
|
+
};
|
|
109
|
+
let settling = false;
|
|
110
|
+
let glideTarget = null;
|
|
111
|
+
let glideTimer = 0;
|
|
112
|
+
const glideTo = (left, top) => {
|
|
113
|
+
if (!scroller) return;
|
|
114
|
+
const target = Math.max(0, Math.min(left, scroller.scrollWidth - scroller.clientWidth));
|
|
115
|
+
glideTarget = target;
|
|
116
|
+
window.clearTimeout(glideTimer);
|
|
117
|
+
glideTimer = window.setTimeout(() => {
|
|
118
|
+
glideTarget = null;
|
|
119
|
+
}, 1600);
|
|
120
|
+
scroller.scrollTo({
|
|
121
|
+
left: target,
|
|
122
|
+
...(top === undefined ? {} : {
|
|
123
|
+
top
|
|
124
|
+
}),
|
|
125
|
+
behavior: reducedMotion() ? "instant" : "smooth"
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
/** The scroll position of a minute in the timeline, with now in the upper third. */
|
|
129
|
+
const topFor = minute => {
|
|
130
|
+
if (!scroller) return 0;
|
|
131
|
+
const body = scroller.querySelector("[data-calendar-body]");
|
|
132
|
+
const head = scroller.querySelector(".k2b-calendar-week__top");
|
|
133
|
+
if (!body || !head) return 0;
|
|
134
|
+
const geometry = readDayGeometry(body, wake(), nightsOpen());
|
|
135
|
+
const offset = body.getBoundingClientRect().top - scroller.getBoundingClientRect().top + scroller.scrollTop - head.offsetHeight;
|
|
136
|
+
return Math.max(0, offset + dayY(geometry, minute) - (scroller.clientHeight - head.offsetHeight) / 3);
|
|
137
|
+
};
|
|
138
|
+
/** The first column of a week: its first day, or on a phone a day of it kept inside the week. */
|
|
139
|
+
const columnFor = (key, phoneDay) => {
|
|
140
|
+
const week = weekKeysOf(view, key);
|
|
141
|
+
if (visibleCount() >= 7 || !phoneDay) return indexOf(week[0]);
|
|
142
|
+
const day = Math.max(0, Math.min(7 - visibleCount(), dayKeyNumber(phoneDay) - dayKeyNumber(week[0])));
|
|
143
|
+
return indexOf(week[day]);
|
|
144
|
+
};
|
|
145
|
+
const positionAt = key => {
|
|
146
|
+
if (!scroller) return;
|
|
147
|
+
measureCount();
|
|
148
|
+
const today = view.nowKey();
|
|
149
|
+
const inWeek = weekKeysOf(view, key).includes(today);
|
|
150
|
+
scroller.scrollLeft = leftOf(columnFor(key, key));
|
|
151
|
+
scroller.scrollTop = inWeek ? topFor(view.nowMinute()) : topFor(60);
|
|
152
|
+
lastLeft = scroller.scrollLeft;
|
|
153
|
+
syncFirst();
|
|
154
|
+
};
|
|
155
|
+
const measureCount = () => {
|
|
156
|
+
const width = columnWidth();
|
|
157
|
+
if (!scroller || width <= 0) return;
|
|
158
|
+
// Whole-pixel columns leave a few pixels at the right edge; the strip ends at its last whole day instead of
|
|
159
|
+
// showing a sliver of the next one.
|
|
160
|
+
const room = scroller.clientWidth + (Number.parseFloat(scroller.style.marginRight) || 0) - gutterWidth();
|
|
161
|
+
const count = Math.max(1, Math.round(room / width));
|
|
162
|
+
setVisibleCount(count);
|
|
163
|
+
const rest = Math.floor(room - count * width);
|
|
164
|
+
scroller.style.marginRight = rest > 0 ? `${rest}px` : "";
|
|
165
|
+
};
|
|
166
|
+
let reportTimer = 0;
|
|
167
|
+
let reported = "";
|
|
168
|
+
const syncFirst = () => {
|
|
169
|
+
const index = visibleIndex();
|
|
170
|
+
if (index !== untrack(firstIndex)) setFirstIndex(index);
|
|
171
|
+
if (!untrack(keys)[index]) return;
|
|
172
|
+
// The host learns the days the reader sees once they changed, after the scroll calmed down.
|
|
173
|
+
const {
|
|
174
|
+
first,
|
|
175
|
+
last
|
|
176
|
+
} = untrack(visibleKeys);
|
|
177
|
+
if (`${first}/${last}` === reported) return;
|
|
178
|
+
reported = `${first}/${last}`;
|
|
179
|
+
window.clearTimeout(reportTimer);
|
|
180
|
+
reportTimer = window.setTimeout(() => props.owner.onVisibleDateChange?.(view.parseKey(first), view.parseKey(last)), 250);
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
// A gesture keeps its axis; the strip settles on a day edge once the scroll rests.
|
|
184
|
+
let axis = null;
|
|
185
|
+
let lastWheel = 0;
|
|
186
|
+
let fingers = 0;
|
|
187
|
+
let restTimer = 0;
|
|
188
|
+
let ready = false;
|
|
189
|
+
/** Whether a wheel or a finger moved the strip since it last settled, and the way it last moved. */
|
|
190
|
+
let gesture = false;
|
|
191
|
+
let heading = 0;
|
|
192
|
+
let headingFrom = 0;
|
|
193
|
+
const settle = () => {
|
|
194
|
+
if (!scroller || fingers > 0 || settling || glideTarget !== null || view.dragging()) return;
|
|
195
|
+
const width = columnWidth();
|
|
196
|
+
const space = Number.parseFloat(getComputedStyle(scroller).scrollPaddingRight) || 0;
|
|
197
|
+
// A gesture rests on the nearest edge. A scroll without one, such as a reveal, goes on its way, so what it brought
|
|
198
|
+
// into view stays there; with end space, a revealed day can rest with its end beside the drawer.
|
|
199
|
+
const target = snapToColumn(scroller.scrollLeft, width, space > 0 ? scroller.clientWidth - gutterWidth() - space : undefined, gesture ? 0 : heading);
|
|
200
|
+
gesture = false;
|
|
201
|
+
if (Math.abs(target - scroller.scrollLeft) <= 0.5) return;
|
|
202
|
+
settling = true;
|
|
203
|
+
scroller.scrollTo({
|
|
204
|
+
left: target,
|
|
205
|
+
behavior: reducedMotion() ? "instant" : "smooth"
|
|
206
|
+
});
|
|
207
|
+
window.setTimeout(() => {
|
|
208
|
+
settling = false;
|
|
209
|
+
}, 450);
|
|
210
|
+
};
|
|
211
|
+
const onWheel = event => {
|
|
212
|
+
if (!scroller || event.ctrlKey || view.dragging()) return;
|
|
213
|
+
// A gesture that goes on takes over from a glide onto a day start; the strip settles again once it rests.
|
|
214
|
+
settling = false;
|
|
215
|
+
gesture = true;
|
|
216
|
+
if (event.timeStamp - lastWheel > GESTURE_GAP_MS || axis === null) axis = wheelAxis(event.deltaX, event.deltaY, event.shiftKey);
|
|
217
|
+
lastWheel = event.timeStamp;
|
|
218
|
+
const delta = wheelPixels(wheelDelta(axis, event.deltaX, event.deltaY, event.shiftKey), event.deltaMode, axis === "x" ? scroller.clientWidth : scroller.clientHeight);
|
|
219
|
+
if (axis === "x") {
|
|
220
|
+
event.preventDefault();
|
|
221
|
+
glideTarget = null;
|
|
222
|
+
scroller.scrollLeft += delta;
|
|
223
|
+
} else if (event.deltaX !== 0) {
|
|
224
|
+
// A trackpad's slight sideways drift in a vertical gesture would move the days; only the vertical part counts.
|
|
225
|
+
event.preventDefault();
|
|
226
|
+
scroller.scrollTop += delta;
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
let askedEarlier = "";
|
|
230
|
+
let askedLater = "";
|
|
231
|
+
/** The last scroll position the strip read, to tell which way the reader moves. */
|
|
232
|
+
let lastLeft = 0;
|
|
233
|
+
/**
|
|
234
|
+
* Asks for the week before or after once the reader moves within a week of an end. Days loaded before the strip push
|
|
235
|
+
* it on by a week, so only moving toward an end asks; a glide may load later days, which push nothing.
|
|
236
|
+
*/
|
|
237
|
+
const loadMore = () => {
|
|
238
|
+
if (!scroller || !ready || view.dragging()) return;
|
|
239
|
+
const width = columnWidth();
|
|
240
|
+
const {
|
|
241
|
+
first,
|
|
242
|
+
last
|
|
243
|
+
} = view.range();
|
|
244
|
+
const left = scroller.scrollLeft;
|
|
245
|
+
const direction = Math.sign(left - lastLeft);
|
|
246
|
+
lastLeft = left;
|
|
247
|
+
if (direction < 0 && glideTarget === null && left < width * 7 - 1 && props.owner.onLoadEarlier && askedEarlier !== first) {
|
|
248
|
+
askedEarlier = first;
|
|
249
|
+
void props.owner.onLoadEarlier();
|
|
250
|
+
}
|
|
251
|
+
if (direction > 0 && left + scroller.clientWidth > scroller.scrollWidth - width * 7 + 1 && props.owner.onLoadLater && askedLater !== last) {
|
|
252
|
+
askedLater = last;
|
|
253
|
+
void props.owner.onLoadLater();
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
let frame = 0;
|
|
257
|
+
const onScroll = () => {
|
|
258
|
+
if (!scroller) return;
|
|
259
|
+
if (glideTarget !== null && Math.abs(scroller.scrollLeft - glideTarget) < 2) glideTarget = null;
|
|
260
|
+
if (Math.abs(scroller.scrollLeft - headingFrom) > 0.5) heading = Math.sign(scroller.scrollLeft - headingFrom);
|
|
261
|
+
headingFrom = scroller.scrollLeft;
|
|
262
|
+
if (!frame) frame = requestAnimationFrame(() => {
|
|
263
|
+
frame = 0;
|
|
264
|
+
syncFirst();
|
|
265
|
+
loadMore();
|
|
266
|
+
rememberAnchor();
|
|
267
|
+
});
|
|
268
|
+
window.clearTimeout(restTimer);
|
|
269
|
+
restTimer = window.setTimeout(settle, fingers > 0 ? 160 : 140);
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
// Days loaded before the strip's first day shift it; the view keeps its days in place.
|
|
273
|
+
let anchor = null;
|
|
274
|
+
/** A day the host moved to before its days loaded; it goes on screen once they arrive. */
|
|
275
|
+
let pendingTarget = null;
|
|
276
|
+
/** Notes the day at the start of the strip, read against the days the strip draws, which may still be the old ones. */
|
|
277
|
+
const rememberAnchor = (drawn = untrack(keys)) => {
|
|
278
|
+
if (!scroller) return;
|
|
279
|
+
const width = columnWidth();
|
|
280
|
+
if (width <= 0) return;
|
|
281
|
+
const index = Math.floor(scroller.scrollLeft / width);
|
|
282
|
+
const key = drawn[index];
|
|
283
|
+
if (key) anchor = {
|
|
284
|
+
key,
|
|
285
|
+
offset: scroller.scrollLeft - index * width
|
|
286
|
+
};
|
|
287
|
+
};
|
|
288
|
+
// Before the days change the strip, note its place from the page as it stands. A computation runs before any render
|
|
289
|
+
// effect touches the page, so no row has shrunk the strip yet.
|
|
290
|
+
createComputed(on(keys, (next, drawn) => {
|
|
291
|
+
if (!untrack(mounted) || !drawn) return;
|
|
292
|
+
rememberAnchor(drawn);
|
|
293
|
+
// Days that come in before the strip move every index; the first day in view stays the same day, so what
|
|
294
|
+
// depends on the days in view, such as the all-day row, never sees the days that came in.
|
|
295
|
+
const shift = dayKeyNumber(drawn[0]) - dayKeyNumber(next[0]);
|
|
296
|
+
if (shift !== 0) setFirstIndex(index => index + shift);
|
|
297
|
+
}, {
|
|
298
|
+
defer: true
|
|
299
|
+
}));
|
|
300
|
+
createEffect(on(keys, () => {
|
|
301
|
+
if (!untrack(mounted) || !scroller) return;
|
|
302
|
+
if (pendingTarget && loaded(pendingTarget)) {
|
|
303
|
+
positionAt(pendingTarget);
|
|
304
|
+
pendingTarget = null;
|
|
305
|
+
rememberAnchor();
|
|
306
|
+
syncFirst();
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (!anchor) return;
|
|
310
|
+
const index = indexOf(anchor.key);
|
|
311
|
+
const left = leftOf(index) + anchor.offset;
|
|
312
|
+
if (Math.abs(scroller.scrollLeft - left) > 0.5) scroller.scrollLeft = left;
|
|
313
|
+
lastLeft = scroller.scrollLeft;
|
|
314
|
+
}, {
|
|
315
|
+
defer: true
|
|
316
|
+
}));
|
|
317
|
+
|
|
318
|
+
/** The day width the strip last kept its first day for. */
|
|
319
|
+
let measuredWidth = 0;
|
|
320
|
+
onMount(() => {
|
|
321
|
+
setMounted(true);
|
|
322
|
+
queueMicrotask(() => {
|
|
323
|
+
positionAt(view.anchorKey());
|
|
324
|
+
rememberAnchor();
|
|
325
|
+
ready = true;
|
|
326
|
+
});
|
|
327
|
+
const observer = typeof ResizeObserver === "undefined" ? undefined : new ResizeObserver(() => {
|
|
328
|
+
if (!scroller) return;
|
|
329
|
+
// A reveal the scroll handler has not read yet wins over keeping the first day.
|
|
330
|
+
const unread = Math.abs(scroller.scrollLeft - lastLeft) > 0.5;
|
|
331
|
+
const before = untrack(firstIndex);
|
|
332
|
+
measureCount();
|
|
333
|
+
// Only days of a new width move the strip back onto its first day. Setting scrollLeft stops a smooth scroll
|
|
334
|
+
// on its way, such as a reveal, so a drawer's padding or the strip's own trim must not.
|
|
335
|
+
const width = columnWidth();
|
|
336
|
+
const resized = Math.abs(width - measuredWidth) > 0.01;
|
|
337
|
+
measuredWidth = width;
|
|
338
|
+
if (resized && !unread && Math.abs(scroller.scrollLeft - leftOf(before)) > 0.5) scroller.scrollLeft = leftOf(before);
|
|
339
|
+
lastLeft = scroller.scrollLeft;
|
|
340
|
+
syncFirst();
|
|
341
|
+
});
|
|
342
|
+
if (scroller) observer?.observe(scroller);
|
|
343
|
+
onCleanup(() => {
|
|
344
|
+
observer?.disconnect();
|
|
345
|
+
window.clearTimeout(restTimer);
|
|
346
|
+
window.clearTimeout(reportTimer);
|
|
347
|
+
window.clearTimeout(glideTimer);
|
|
348
|
+
if (frame) cancelAnimationFrame(frame);
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
createEffect(on(view.anchorKey, key => {
|
|
352
|
+
if (!untrack(mounted)) return;
|
|
353
|
+
setNightWeek(key);
|
|
354
|
+
pendingTarget = loaded(key) ? null : key;
|
|
355
|
+
if (pendingTarget) return;
|
|
356
|
+
if (key === untrack(visibleKeys).first) {
|
|
357
|
+
rememberAnchor();
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
queueMicrotask(() => {
|
|
361
|
+
positionAt(key);
|
|
362
|
+
rememberAnchor();
|
|
363
|
+
});
|
|
364
|
+
}, {
|
|
365
|
+
defer: true
|
|
366
|
+
}));
|
|
367
|
+
const loaded = key => key >= view.range().first && key <= view.range().last;
|
|
368
|
+
const handle = {
|
|
369
|
+
visibleKeys,
|
|
370
|
+
step: direction => {
|
|
371
|
+
const first = visibleKeys().first;
|
|
372
|
+
const week = weekKeysOf(view, first);
|
|
373
|
+
// From the middle of a week the arrows go to the start of a week first.
|
|
374
|
+
const target = direction > 0 ? addDayKeys(week[0], 7) : first === week[0] ? addDayKeys(week[0], -7) : week[0];
|
|
375
|
+
const last = addDayKeys(target, Math.min(6, visibleCount() - 1));
|
|
376
|
+
if (!loaded(target) || !loaded(last)) return false;
|
|
377
|
+
setNightWeek(target);
|
|
378
|
+
glideTo(leftOf(indexOf(target)));
|
|
379
|
+
return true;
|
|
380
|
+
},
|
|
381
|
+
goTo: key => {
|
|
382
|
+
if (!loaded(key)) return false;
|
|
383
|
+
setNightWeek(key);
|
|
384
|
+
view.setSelection({
|
|
385
|
+
key
|
|
386
|
+
});
|
|
387
|
+
glideTo(leftOf(columnFor(key, key)));
|
|
388
|
+
return true;
|
|
389
|
+
},
|
|
390
|
+
today: () => {
|
|
391
|
+
const today = view.nowKey();
|
|
392
|
+
const week = weekKeysOf(view, today);
|
|
393
|
+
if (!loaded(week[0]) || !loaded(week[6])) return false;
|
|
394
|
+
setNightWeek(today);
|
|
395
|
+
queueMicrotask(() => glideTo(leftOf(columnFor(today, today)), topFor(view.nowMinute())));
|
|
396
|
+
return true;
|
|
397
|
+
},
|
|
398
|
+
todayDirection: () => {
|
|
399
|
+
const today = view.nowKey();
|
|
400
|
+
const {
|
|
401
|
+
first,
|
|
402
|
+
last
|
|
403
|
+
} = visibleKeys();
|
|
404
|
+
if (today < first) return "left";
|
|
405
|
+
if (today > last) return "right";
|
|
406
|
+
return "";
|
|
407
|
+
},
|
|
408
|
+
controller: {
|
|
409
|
+
quickCreate: create => {
|
|
410
|
+
const target = view.createTarget(visibleKeys());
|
|
411
|
+
const column = scroller?.querySelector(`[data-calendar-body="${target.key}"]`);
|
|
412
|
+
view.openQuickCreate(target.key, target.start, target.end, slotRect(target.key, target.start, target.end) ?? column ?? scroller, create);
|
|
413
|
+
},
|
|
414
|
+
createTarget: () => view.rangeOfSelection(view.createTarget(visibleKeys())),
|
|
415
|
+
dragIn: (event, item, onDrop) => view.dragIn(event, item, onDrop, scroller)
|
|
416
|
+
}
|
|
417
|
+
};
|
|
418
|
+
const slotRect = (key, start, end) => {
|
|
419
|
+
const body = scroller?.querySelector(`[data-calendar-body="${key}"]`);
|
|
420
|
+
if (!body || !scroller) return null;
|
|
421
|
+
const rect = body.getBoundingClientRect();
|
|
422
|
+
const bounds = scroller.getBoundingClientRect();
|
|
423
|
+
if (rect.right < bounds.left + gutterWidth() || rect.left > bounds.right) return null;
|
|
424
|
+
const geometry = readDayGeometry(body, wake(), nightsOpen());
|
|
425
|
+
const top = rect.top + dayY(geometry, start);
|
|
426
|
+
const bottom = rect.top + dayY(geometry, end);
|
|
427
|
+
if (bottom < bounds.top + 40 || top > bounds.bottom - 20) return null;
|
|
428
|
+
return new DOMRect(rect.left, Math.max(bounds.top, top), rect.width, Math.max(8, Math.min(bottom, bounds.bottom) - Math.max(bounds.top, top)));
|
|
429
|
+
};
|
|
430
|
+
onMount(() => props.register(handle));
|
|
431
|
+
onCleanup(() => props.register(null));
|
|
432
|
+
|
|
433
|
+
// The all-day row: one bar per week, with a torn edge where an event goes on in the week before or after.
|
|
434
|
+
const allDay = createMemo(() => {
|
|
435
|
+
const all = keys();
|
|
436
|
+
const spans = new Map();
|
|
437
|
+
for (const key of all) for (const span of view.dayOf(key).spans) spans.set(span.item, span);
|
|
438
|
+
const entries = [...spans.values()].sort((left, right) => left.firstKey.localeCompare(right.firstKey) || right.lastKey.localeCompare(left.lastKey)).map(span => ({
|
|
439
|
+
item: span,
|
|
440
|
+
firstKey: span.firstKey,
|
|
441
|
+
lastKey: span.lastKey,
|
|
442
|
+
bar: !span.marker
|
|
443
|
+
}));
|
|
444
|
+
const weeks = [];
|
|
445
|
+
for (let index = 0; index < all.length;) {
|
|
446
|
+
const week = weekKeysOf(view, all[index]).filter(key => key >= all[0] && key <= all[all.length - 1]);
|
|
447
|
+
const offset = indexOf(week[0]);
|
|
448
|
+
weeks.push({
|
|
449
|
+
offset,
|
|
450
|
+
keys: week
|
|
451
|
+
});
|
|
452
|
+
index = offset + week.length;
|
|
453
|
+
}
|
|
454
|
+
return weeks.map(week => {
|
|
455
|
+
const layout = layoutMonthWeek(week.keys, entries);
|
|
456
|
+
const lanes = Math.max(0, ...layout.bars.map(bar => bar.lane + 1));
|
|
457
|
+
return {
|
|
458
|
+
...week,
|
|
459
|
+
layout,
|
|
460
|
+
rows: lanes + Math.max(0, ...layout.singles.map(singles => singles.length))
|
|
461
|
+
};
|
|
462
|
+
});
|
|
463
|
+
});
|
|
464
|
+
/**
|
|
465
|
+
* The rows the weeks in view need, as in a week of its own. A week that loads off screen never changes them, so the
|
|
466
|
+
* hours stay where they are; its entries below these rows wait hidden until it comes into view.
|
|
467
|
+
*/
|
|
468
|
+
const allDayRows = createMemo(() => {
|
|
469
|
+
const first = firstIndex();
|
|
470
|
+
const last = first + visibleCount() - 1;
|
|
471
|
+
return Math.max(1, ...allDay().filter(week => week.offset <= last && week.offset + week.keys.length - 1 >= first).map(week => week.rows));
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
// Keyboard: one tab stop in the grid; the arrows move between days, entries, and free time. Only what is drawn can
|
|
475
|
+
// take the focus.
|
|
476
|
+
const stops = () => [...(scroller?.querySelectorAll("[data-stop]") ?? [])].filter(stop => stop.getClientRects().length > 0);
|
|
477
|
+
const focusDayKey = () => {
|
|
478
|
+
const current = view.selection()?.key;
|
|
479
|
+
const {
|
|
480
|
+
first,
|
|
481
|
+
last
|
|
482
|
+
} = visibleKeys();
|
|
483
|
+
if (current && current >= first && current <= last) return current;
|
|
484
|
+
return view.nowKey() >= first && view.nowKey() <= last ? view.nowKey() : first;
|
|
485
|
+
};
|
|
486
|
+
const rovingId = () => roving() || `h:${focusDayKey()}`;
|
|
487
|
+
const tabOf = id => rovingId() === id ? 0 : -1;
|
|
488
|
+
// An entry that leaves the days gives the grid's tab stop back to a heading after the page has updated.
|
|
489
|
+
createEffect(on(view.days, () => {
|
|
490
|
+
queueMicrotask(() => {
|
|
491
|
+
if (!scroller || !roving()) return;
|
|
492
|
+
if ([...scroller.querySelectorAll("[data-stop]")].some(stop => stop.dataset.stop === roving())) return;
|
|
493
|
+
setRoving("");
|
|
494
|
+
if (!document.activeElement || document.activeElement === document.body) {
|
|
495
|
+
scroller.querySelector(`[data-stop="h:${focusDayKey()}"]`)?.focus({
|
|
496
|
+
preventScroll: true
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
}, {
|
|
501
|
+
defer: true
|
|
502
|
+
}));
|
|
503
|
+
const onKeyDown = event => {
|
|
504
|
+
const current = event.target instanceof HTMLElement ? event.target.closest("[data-stop]") : null;
|
|
505
|
+
if (!current || event.altKey || event.metaKey || event.ctrlKey) return;
|
|
506
|
+
const direction = {
|
|
507
|
+
ArrowUp: "up",
|
|
508
|
+
ArrowDown: "down",
|
|
509
|
+
ArrowLeft: "left",
|
|
510
|
+
ArrowRight: "right",
|
|
511
|
+
Home: "home",
|
|
512
|
+
End: "end"
|
|
513
|
+
}[event.key];
|
|
514
|
+
if (!direction) return;
|
|
515
|
+
event.preventDefault();
|
|
516
|
+
const all = stops();
|
|
517
|
+
const column = Number(current.dataset.col);
|
|
518
|
+
const minute = Number(current.dataset.minute);
|
|
519
|
+
const inColumn = index => all.filter(stop => Number(stop.dataset.col) === index).sort((left, right) => Number(left.dataset.minute) - Number(right.dataset.minute));
|
|
520
|
+
const list = inColumn(column);
|
|
521
|
+
const position = list.indexOf(current);
|
|
522
|
+
let next;
|
|
523
|
+
if (direction === "down") next = list[position + 1];else if (direction === "up") next = list[position - 1];else if (direction === "home") next = list[0];else if (direction === "end") next = list[list.length - 1];else {
|
|
524
|
+
const other = inColumn(column + (direction === "left" ? -1 : 1));
|
|
525
|
+
next = other.reduce((best, stop) => Math.abs(Number(stop.dataset.minute) - minute) < Math.abs(Number(best?.dataset.minute ?? Number.POSITIVE_INFINITY) - minute) ? stop : best, undefined);
|
|
526
|
+
}
|
|
527
|
+
if (!next) return;
|
|
528
|
+
setRoving(next.dataset.stop ?? "");
|
|
529
|
+
next.focus({
|
|
530
|
+
preventScroll: Boolean(next.closest(".k2b-calendar-week__top"))
|
|
531
|
+
});
|
|
532
|
+
const index = Number(next.dataset.col);
|
|
533
|
+
const first = untrack(firstIndex);
|
|
534
|
+
if (index < first) glideTo(leftOf(index));else if (index >= first + visibleCount()) glideTo(leftOf(index - visibleCount() + 1));
|
|
535
|
+
};
|
|
536
|
+
const openDay = key => {
|
|
537
|
+
const href = props.owner.views && !props.owner.views.includes("day") ? undefined : props.owner.getDateHref?.(view.parseKey(key), "day");
|
|
538
|
+
if (href) followCalendarHref(props.owner, href);else {
|
|
539
|
+
props.owner.onViewChange?.("day");
|
|
540
|
+
props.owner.onDateChange?.(view.parseKey(key), "day");
|
|
541
|
+
}
|
|
542
|
+
};
|
|
543
|
+
let lastPointer = "mouse";
|
|
544
|
+
|
|
545
|
+
// The all-day row: drag across days for one all-day event; a double-click creates on one day.
|
|
546
|
+
const startAllDayRange = (pointerEvent, row) => {
|
|
547
|
+
if (pointerEvent.pointerType !== "mouse" || pointerEvent.button !== 0 || !view.canCreate()) return;
|
|
548
|
+
const keyAt = clientX => {
|
|
549
|
+
const width = columnWidth();
|
|
550
|
+
const rect = row.getBoundingClientRect();
|
|
551
|
+
const index = Math.max(0, Math.min(keys().length - 1, Math.floor((clientX - rect.left) / width)));
|
|
552
|
+
return keys()[index];
|
|
553
|
+
};
|
|
554
|
+
const origin = keyAt(pointerEvent.clientX);
|
|
555
|
+
startCalendarPointerSession({
|
|
556
|
+
event: pointerEvent,
|
|
557
|
+
resolve: clientX => keyAt(clientX),
|
|
558
|
+
onPreview: key => setRangeSelection(origin < key ? {
|
|
559
|
+
first: origin,
|
|
560
|
+
last: key
|
|
561
|
+
} : {
|
|
562
|
+
first: key,
|
|
563
|
+
last: origin
|
|
564
|
+
}),
|
|
565
|
+
onCommit: key => {
|
|
566
|
+
swallowNextClick();
|
|
567
|
+
const range = origin < key ? {
|
|
568
|
+
first: origin,
|
|
569
|
+
last: key
|
|
570
|
+
} : {
|
|
571
|
+
first: key,
|
|
572
|
+
last: origin
|
|
573
|
+
};
|
|
574
|
+
const cells = scroller?.querySelector(".k2b-calendar-week__range");
|
|
575
|
+
setRangeSelection(null);
|
|
576
|
+
const start = view.parseKey(range.first);
|
|
577
|
+
const end = calendar.addDays(view.parseKey(range.last), 1, view.dateConfig());
|
|
578
|
+
if (props.owner.renderQuickCreate) view.setQuick({
|
|
579
|
+
range: {
|
|
580
|
+
start,
|
|
581
|
+
end,
|
|
582
|
+
allDay: true
|
|
583
|
+
},
|
|
584
|
+
anchor: cells?.getBoundingClientRect() ?? row,
|
|
585
|
+
key: range.first
|
|
586
|
+
});else props.owner.onSlotActivate?.({
|
|
587
|
+
start,
|
|
588
|
+
end,
|
|
589
|
+
allDay: true
|
|
590
|
+
});
|
|
591
|
+
},
|
|
592
|
+
onCancel: () => setRangeSelection(null)
|
|
593
|
+
});
|
|
594
|
+
};
|
|
595
|
+
const [rangeSelection, setRangeSelection] = createSignal(null);
|
|
596
|
+
return (() => {
|
|
597
|
+
var _el$ = _$getNextElement(_tmpl$4),
|
|
598
|
+
_el$2 = _el$.firstChild,
|
|
599
|
+
_el$3 = _el$2.firstChild,
|
|
600
|
+
_el$4 = _el$3.firstChild,
|
|
601
|
+
_el$5 = _el$4.firstChild,
|
|
602
|
+
_el$12 = _el$5.nextSibling,
|
|
603
|
+
[_el$13, _co$3] = _$getNextMarker(_el$12.nextSibling),
|
|
604
|
+
_el$6 = _el$13.nextSibling,
|
|
605
|
+
_el$7 = _el$6.firstChild,
|
|
606
|
+
_el$8 = _el$7.nextSibling,
|
|
607
|
+
_el$9 = _el$6.nextSibling,
|
|
608
|
+
_el$0 = _el$9.firstChild,
|
|
609
|
+
[_el$1, _co$] = _$getNextMarker(_el$0.nextSibling),
|
|
610
|
+
_el$10 = _el$1.nextSibling,
|
|
611
|
+
[_el$11, _co$2] = _$getNextMarker(_el$10.nextSibling),
|
|
612
|
+
_el$14 = _el$4.nextSibling,
|
|
613
|
+
_el$15 = _el$14.firstChild,
|
|
614
|
+
_el$20 = _el$15.firstChild,
|
|
615
|
+
[_el$21, _co$4] = _$getNextMarker(_el$20.nextSibling),
|
|
616
|
+
_el$22 = _el$21.nextSibling,
|
|
617
|
+
[_el$23, _co$5] = _$getNextMarker(_el$22.nextSibling),
|
|
618
|
+
_el$16 = _el$23.nextSibling,
|
|
619
|
+
_el$17 = _el$16.firstChild,
|
|
620
|
+
_el$18 = _el$17.nextSibling,
|
|
621
|
+
_el$24 = _el$16.nextSibling,
|
|
622
|
+
[_el$25, _co$6] = _$getNextMarker(_el$24.nextSibling),
|
|
623
|
+
_el$26 = _el$15.nextSibling,
|
|
624
|
+
_el$29 = _el$26.firstChild,
|
|
625
|
+
[_el$30, _co$7] = _$getNextMarker(_el$29.nextSibling),
|
|
626
|
+
_el$31 = _el$30.nextSibling,
|
|
627
|
+
[_el$32, _co$8] = _$getNextMarker(_el$31.nextSibling),
|
|
628
|
+
_el$33 = _el$32.nextSibling,
|
|
629
|
+
[_el$34, _co$9] = _$getNextMarker(_el$33.nextSibling),
|
|
630
|
+
_el$35 = _el$26.nextSibling,
|
|
631
|
+
[_el$36, _co$0] = _$getNextMarker(_el$35.nextSibling),
|
|
632
|
+
_el$37 = _el$2.nextSibling,
|
|
633
|
+
_el$38 = _el$37.nextSibling,
|
|
634
|
+
[_el$39, _co$1] = _$getNextMarker(_el$38.nextSibling);
|
|
635
|
+
_el$2.addEventListener("touchcancel", event => {
|
|
636
|
+
fingers = event.touches.length;
|
|
637
|
+
});
|
|
638
|
+
_el$2.$$touchend = event => {
|
|
639
|
+
fingers = event.touches.length;
|
|
640
|
+
onScroll();
|
|
641
|
+
};
|
|
642
|
+
_el$2.$$touchstart = event => {
|
|
643
|
+
fingers = event.touches.length;
|
|
644
|
+
gesture = true;
|
|
645
|
+
glideTarget = null;
|
|
646
|
+
};
|
|
647
|
+
_el$2.$$focusin = event => {
|
|
648
|
+
const stop = event.target instanceof HTMLElement ? event.target.closest("[data-stop]") : null;
|
|
649
|
+
if (stop?.dataset.stop) setRoving(stop.dataset.stop);
|
|
650
|
+
};
|
|
651
|
+
_el$2.$$keydown = onKeyDown;
|
|
652
|
+
_el$2.addEventListener("wheel", onWheel);
|
|
653
|
+
_el$2.addEventListener("scroll", onScroll);
|
|
654
|
+
var _ref$ = scroller;
|
|
655
|
+
typeof _ref$ === "function" ? _$use(_ref$, _el$2) : scroller = _el$2;
|
|
656
|
+
_$setAttribute(_el$2, "aria-describedby", helpId);
|
|
657
|
+
_$insert(_el$5, () => view.messages().calendarWeekNumber({
|
|
658
|
+
week: isoWeek(visibleKeys().first)
|
|
659
|
+
}));
|
|
660
|
+
_$insert(_el$4, _$createComponent(For, {
|
|
661
|
+
get each() {
|
|
662
|
+
return keys();
|
|
663
|
+
},
|
|
664
|
+
children: key => {
|
|
665
|
+
const today = () => key === view.calendarToday();
|
|
666
|
+
const selected = () => {
|
|
667
|
+
const current = view.selection();
|
|
668
|
+
return Boolean(current && current.key === key && current.start === undefined);
|
|
669
|
+
};
|
|
670
|
+
const badge = () => props.owner.dayBadges?.[key];
|
|
671
|
+
const load = () => dayLoad(view, key);
|
|
672
|
+
const date = () => view.parseKey(key);
|
|
673
|
+
return (() => {
|
|
674
|
+
var _el$40 = _$getNextElement(_tmpl$5),
|
|
675
|
+
_el$41 = _el$40.firstChild,
|
|
676
|
+
_el$42 = _el$41.nextSibling,
|
|
677
|
+
_el$43 = _el$42.nextSibling,
|
|
678
|
+
_el$44 = _el$43.nextSibling,
|
|
679
|
+
_el$45 = _el$44.nextSibling,
|
|
680
|
+
_el$46 = _el$45.firstChild,
|
|
681
|
+
_el$47 = _el$46.nextSibling,
|
|
682
|
+
_el$48 = _el$47.nextSibling;
|
|
683
|
+
_el$40.$$click = event => {
|
|
684
|
+
if (event.detail >= 2 || selected() && lastPointer !== "mouse") {
|
|
685
|
+
openDay(key);
|
|
686
|
+
return;
|
|
687
|
+
}
|
|
688
|
+
view.setTouchDraft(null);
|
|
689
|
+
view.setSelection(selected() ? null : {
|
|
690
|
+
key
|
|
691
|
+
});
|
|
692
|
+
};
|
|
693
|
+
_el$40.$$pointerdown = event => {
|
|
694
|
+
lastPointer = event.pointerType;
|
|
695
|
+
// The heading stays on top: focusing it must not scroll the grid.
|
|
696
|
+
if (event.button === 0) {
|
|
697
|
+
event.preventDefault();
|
|
698
|
+
event.currentTarget.focus({
|
|
699
|
+
preventScroll: true
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
};
|
|
703
|
+
_$setAttribute(_el$40, "data-calendar-head", key);
|
|
704
|
+
_$setAttribute(_el$40, "data-stop", `h:${key}`);
|
|
705
|
+
_$insert(_el$41, () => date().toLocaleDateString(view.dateConfig().locale ?? "en", {
|
|
706
|
+
weekday: "short",
|
|
707
|
+
timeZone: view.dateConfig().timeZone
|
|
708
|
+
}).replace(/\.$/, ""));
|
|
709
|
+
_$insert(_el$42, () => calendar.formatDayNumber(date(), view.dateConfig()));
|
|
710
|
+
_$insert(_el$43, _$createComponent(Show, {
|
|
711
|
+
get when() {
|
|
712
|
+
return badge();
|
|
713
|
+
},
|
|
714
|
+
children: current => (() => {
|
|
715
|
+
var _el$49 = _$getNextElement(_tmpl$6),
|
|
716
|
+
_el$50 = _el$49.firstChild,
|
|
717
|
+
[_el$51, _co$10] = _$getNextMarker(_el$50.nextSibling),
|
|
718
|
+
_el$52 = _el$51.nextSibling,
|
|
719
|
+
[_el$53, _co$11] = _$getNextMarker(_el$52.nextSibling);
|
|
720
|
+
_$insert(_el$49, _$createComponent(Show, {
|
|
721
|
+
get when() {
|
|
722
|
+
return current().icon;
|
|
723
|
+
},
|
|
724
|
+
children: icon => (() => {
|
|
725
|
+
var _el$54 = _$getNextElement(_tmpl$7);
|
|
726
|
+
_$effect(() => _$className(_el$54, `ti ti-${icon()}`));
|
|
727
|
+
return _el$54;
|
|
728
|
+
})()
|
|
729
|
+
}), _el$51, _co$10);
|
|
730
|
+
_$insert(_el$49, () => current().label, _el$53, _co$11);
|
|
731
|
+
return _el$49;
|
|
732
|
+
})()
|
|
733
|
+
}));
|
|
734
|
+
_$insert(_el$44, _$createComponent(For, {
|
|
735
|
+
get each() {
|
|
736
|
+
return load();
|
|
737
|
+
},
|
|
738
|
+
children: piece => (() => {
|
|
739
|
+
var _el$55 = _$getNextElement(_tmpl$8);
|
|
740
|
+
_$effect(_p$ => {
|
|
741
|
+
var _v$21 = `${(piece.end - piece.start) / wake() * 100}%`,
|
|
742
|
+
_v$22 = piece.color;
|
|
743
|
+
_v$21 !== _p$.e && _$setStyleProperty(_el$55, "width", _p$.e = _v$21);
|
|
744
|
+
_v$22 !== _p$.t && _$setStyleProperty(_el$55, "background", _p$.t = _v$22);
|
|
745
|
+
return _p$;
|
|
746
|
+
}, {
|
|
747
|
+
e: undefined,
|
|
748
|
+
t: undefined
|
|
749
|
+
});
|
|
750
|
+
return _el$55;
|
|
751
|
+
})()
|
|
752
|
+
}));
|
|
753
|
+
_$insert(_el$47, () => view.messages().calendarAllDone);
|
|
754
|
+
_$insert(_el$48, () => view.messages().calendarAllDoneShort);
|
|
755
|
+
_$effect(_p$ => {
|
|
756
|
+
var _v$13 = indexOf(key),
|
|
757
|
+
_v$14 = tabOf(`h:${key}`),
|
|
758
|
+
_v$15 = selected() ? "true" : "false",
|
|
759
|
+
_v$16 = [longDay(view, key), today() ? view.props.labels.today : "", badge()?.label ?? ""].filter(Boolean).join(", "),
|
|
760
|
+
_v$17 = today() ? "true" : undefined,
|
|
761
|
+
_v$18 = key < view.calendarToday() ? "true" : undefined,
|
|
762
|
+
_v$19 = view.cheered() === key ? "true" : undefined,
|
|
763
|
+
_v$20 = String(indexOf(key) + 2);
|
|
764
|
+
_v$13 !== _p$.e && _$setAttribute(_el$40, "data-col", _p$.e = _v$13);
|
|
765
|
+
_v$14 !== _p$.t && _$setAttribute(_el$40, "tabindex", _p$.t = _v$14);
|
|
766
|
+
_v$15 !== _p$.a && _$setAttribute(_el$40, "aria-pressed", _p$.a = _v$15);
|
|
767
|
+
_v$16 !== _p$.o && _$setAttribute(_el$40, "aria-label", _p$.o = _v$16);
|
|
768
|
+
_v$17 !== _p$.i && _$setAttribute(_el$40, "data-today", _p$.i = _v$17);
|
|
769
|
+
_v$18 !== _p$.n && _$setAttribute(_el$40, "data-past", _p$.n = _v$18);
|
|
770
|
+
_v$19 !== _p$.s && _$setAttribute(_el$40, "data-cheer", _p$.s = _v$19);
|
|
771
|
+
_v$20 !== _p$.h && _$setStyleProperty(_el$40, "grid-column", _p$.h = _v$20);
|
|
772
|
+
return _p$;
|
|
773
|
+
}, {
|
|
774
|
+
e: undefined,
|
|
775
|
+
t: undefined,
|
|
776
|
+
a: undefined,
|
|
777
|
+
o: undefined,
|
|
778
|
+
i: undefined,
|
|
779
|
+
n: undefined,
|
|
780
|
+
s: undefined,
|
|
781
|
+
h: undefined
|
|
782
|
+
});
|
|
783
|
+
_$runHydrationEvents();
|
|
784
|
+
return _el$40;
|
|
785
|
+
})();
|
|
786
|
+
}
|
|
787
|
+
}), _el$13, _co$3);
|
|
788
|
+
_$insert(_el$7, () => view.messages().calendarAllDayRow);
|
|
789
|
+
_$insert(_el$8, () => view.messages().calendarAllDayRowShort);
|
|
790
|
+
_el$9.$$dblclick = event => {
|
|
791
|
+
if (!(event.target instanceof Element) || event.target.closest("a,button,[data-calendar-event]")) return;
|
|
792
|
+
const width = columnWidth();
|
|
793
|
+
const rect = event.currentTarget.getBoundingClientRect();
|
|
794
|
+
const key = keys()[Math.max(0, Math.min(keys().length - 1, Math.floor((event.clientX - rect.left) / width)))];
|
|
795
|
+
const start = view.parseKey(key);
|
|
796
|
+
const range = {
|
|
797
|
+
start,
|
|
798
|
+
end: calendar.addDays(start, 1, view.dateConfig()),
|
|
799
|
+
allDay: true
|
|
800
|
+
};
|
|
801
|
+
if (props.owner.renderQuickCreate) view.setQuick({
|
|
802
|
+
range,
|
|
803
|
+
anchor: new DOMRect(rect.left + indexOf(key) * width, rect.top, width, rect.height),
|
|
804
|
+
key
|
|
805
|
+
});else props.owner.onSlotActivate?.(range);
|
|
806
|
+
};
|
|
807
|
+
_el$9.$$pointerdown = event => {
|
|
808
|
+
if (event.target instanceof Element && event.target.closest("a,button,[data-calendar-event]")) return;
|
|
809
|
+
startAllDayRange(event, event.currentTarget);
|
|
810
|
+
};
|
|
811
|
+
_$insert(_el$9, _$createComponent(Show, {
|
|
812
|
+
get when() {
|
|
813
|
+
return rangeSelection();
|
|
814
|
+
},
|
|
815
|
+
children: range => (() => {
|
|
816
|
+
var _el$56 = _$getNextElement(_tmpl$9);
|
|
817
|
+
_$effect(_$p => _$setStyleProperty(_el$56, "grid-column", `${indexOf(range().first) + 1} / ${indexOf(range().last) + 2}`));
|
|
818
|
+
return _el$56;
|
|
819
|
+
})()
|
|
820
|
+
}), _el$1, _co$);
|
|
821
|
+
_$insert(_el$9, _$createComponent(For, {
|
|
822
|
+
get each() {
|
|
823
|
+
return allDay();
|
|
824
|
+
},
|
|
825
|
+
children: week => [_$createComponent(For, {
|
|
826
|
+
get each() {
|
|
827
|
+
return week.layout.bars;
|
|
828
|
+
},
|
|
829
|
+
children: bar => {
|
|
830
|
+
const span = bar.endColumn - bar.startColumn + 1;
|
|
831
|
+
const event = bar.item.item;
|
|
832
|
+
const checked = () => view.checkedOf(event);
|
|
833
|
+
const hint = (target, kind, before = "") => {
|
|
834
|
+
const text = kind === "from" ? view.messages().calendarContinuesFrom(hintDate(view, target, visibleKeys().first)) : view.messages().calendarContinuesUntil(hintDate(view, target, visibleKeys().first));
|
|
835
|
+
const font = `600 11px ${typeof document === "undefined" ? "sans-serif" : getComputedStyle(document.body).fontFamily}`;
|
|
836
|
+
return textWidth(`${event.title}${before}`, font) + textWidth(text, font) + HINT_SLACK_PX <= span * columnWidthSignal() ? text : undefined;
|
|
837
|
+
};
|
|
838
|
+
const start = () => bar.continuesBefore ? hint(bar.item.firstKey, "from") : undefined;
|
|
839
|
+
const end = () => bar.continuesAfter ? hint(bar.item.lastKey, "until", start() ?? "") : undefined;
|
|
840
|
+
return (() => {
|
|
841
|
+
var _el$57 = _$getNextElement(_tmpl$0),
|
|
842
|
+
_el$58 = _el$57.firstChild,
|
|
843
|
+
[_el$59, _co$12] = _$getNextMarker(_el$58.nextSibling),
|
|
844
|
+
_el$60 = _el$59.nextSibling,
|
|
845
|
+
[_el$61, _co$13] = _$getNextMarker(_el$60.nextSibling);
|
|
846
|
+
_$insert(_el$57, _$createComponent(Show, {
|
|
847
|
+
get when() {
|
|
848
|
+
return checked() !== undefined;
|
|
849
|
+
},
|
|
850
|
+
get children() {
|
|
851
|
+
return _$createComponent(TimeCheck, {
|
|
852
|
+
view: view,
|
|
853
|
+
event: event,
|
|
854
|
+
tabIndex: -1
|
|
855
|
+
});
|
|
856
|
+
}
|
|
857
|
+
}), _el$59, _co$12);
|
|
858
|
+
_$insert(_el$57, _$createComponent(EventChip, {
|
|
859
|
+
get event() {
|
|
860
|
+
return view.normalized(event, bar.item.firstKey);
|
|
861
|
+
},
|
|
862
|
+
get owner() {
|
|
863
|
+
return props.owner;
|
|
864
|
+
},
|
|
865
|
+
get href() {
|
|
866
|
+
return eventHref(props.owner, event);
|
|
867
|
+
},
|
|
868
|
+
get label() {
|
|
869
|
+
return spanLabel(view, bar.item);
|
|
870
|
+
},
|
|
871
|
+
compact: true,
|
|
872
|
+
timeline: true,
|
|
873
|
+
bar: true,
|
|
874
|
+
get checkbox() {
|
|
875
|
+
return checked() !== undefined;
|
|
876
|
+
},
|
|
877
|
+
get onCheck() {
|
|
878
|
+
return view.checkOf(event);
|
|
879
|
+
},
|
|
880
|
+
get continuesBefore() {
|
|
881
|
+
return bar.continuesBefore;
|
|
882
|
+
},
|
|
883
|
+
get continuesAfter() {
|
|
884
|
+
return bar.continuesAfter;
|
|
885
|
+
},
|
|
886
|
+
get hintStart() {
|
|
887
|
+
return start();
|
|
888
|
+
},
|
|
889
|
+
get hintEnd() {
|
|
890
|
+
return end();
|
|
891
|
+
},
|
|
892
|
+
get tabIndex() {
|
|
893
|
+
return tabOf(`a:${event.id}:${week.offset}`);
|
|
894
|
+
},
|
|
895
|
+
get stop() {
|
|
896
|
+
return {
|
|
897
|
+
id: `a:${event.id}:${week.offset}`,
|
|
898
|
+
column: week.offset + bar.startColumn,
|
|
899
|
+
minute: -1 + bar.lane / 100
|
|
900
|
+
};
|
|
901
|
+
}
|
|
902
|
+
}), _el$61, _co$13);
|
|
903
|
+
_$effect(_p$ => {
|
|
904
|
+
var _v$23 = checked() !== undefined ? "true" : undefined,
|
|
905
|
+
_v$24 = checked() ? "true" : undefined,
|
|
906
|
+
_v$25 = view.justChecked().has(event.id) ? "true" : undefined,
|
|
907
|
+
_v$26 = `${week.offset + bar.startColumn + 1} / ${week.offset + bar.endColumn + 2}`,
|
|
908
|
+
_v$27 = String(bar.lane + 1),
|
|
909
|
+
_v$28 = eventAccent(event),
|
|
910
|
+
_v$29 = bar.lane + 1 > allDayRows() ? "none" : undefined;
|
|
911
|
+
_v$23 !== _p$.e && _$setAttribute(_el$57, "data-checkbox", _p$.e = _v$23);
|
|
912
|
+
_v$24 !== _p$.t && _$setAttribute(_el$57, "data-checked", _p$.t = _v$24);
|
|
913
|
+
_v$25 !== _p$.a && _$setAttribute(_el$57, "data-just-checked", _p$.a = _v$25);
|
|
914
|
+
_v$26 !== _p$.o && _$setStyleProperty(_el$57, "grid-column", _p$.o = _v$26);
|
|
915
|
+
_v$27 !== _p$.i && _$setStyleProperty(_el$57, "grid-row", _p$.i = _v$27);
|
|
916
|
+
_v$28 !== _p$.n && _$setStyleProperty(_el$57, "--k2b-calendar-accent", _p$.n = _v$28);
|
|
917
|
+
_v$29 !== _p$.s && _$setStyleProperty(_el$57, "display", _p$.s = _v$29);
|
|
918
|
+
return _p$;
|
|
919
|
+
}, {
|
|
920
|
+
e: undefined,
|
|
921
|
+
t: undefined,
|
|
922
|
+
a: undefined,
|
|
923
|
+
o: undefined,
|
|
924
|
+
i: undefined,
|
|
925
|
+
n: undefined,
|
|
926
|
+
s: undefined
|
|
927
|
+
});
|
|
928
|
+
return _el$57;
|
|
929
|
+
})();
|
|
930
|
+
}
|
|
931
|
+
}), _$createComponent(For, {
|
|
932
|
+
get each() {
|
|
933
|
+
return week.layout.singles;
|
|
934
|
+
},
|
|
935
|
+
children: (singles, column) => {
|
|
936
|
+
const lanes = () => Math.max(0, ...week.layout.bars.filter(bar => bar.startColumn <= column() && bar.endColumn >= column()).map(bar => bar.lane + 1));
|
|
937
|
+
return _$createComponent(For, {
|
|
938
|
+
each: singles,
|
|
939
|
+
children: (span, row) => {
|
|
940
|
+
const event = span.item;
|
|
941
|
+
const checked = () => view.checkedOf(event);
|
|
942
|
+
const id = `a:${event.id}:${week.offset}`;
|
|
943
|
+
return (() => {
|
|
944
|
+
var _el$62 = _$getNextElement(_tmpl$0),
|
|
945
|
+
_el$63 = _el$62.firstChild,
|
|
946
|
+
[_el$64, _co$14] = _$getNextMarker(_el$63.nextSibling),
|
|
947
|
+
_el$65 = _el$64.nextSibling,
|
|
948
|
+
[_el$66, _co$15] = _$getNextMarker(_el$65.nextSibling);
|
|
949
|
+
_$insert(_el$62, _$createComponent(Show, {
|
|
950
|
+
get when() {
|
|
951
|
+
return checked() !== undefined;
|
|
952
|
+
},
|
|
953
|
+
get children() {
|
|
954
|
+
return _$createComponent(TimeCheck, {
|
|
955
|
+
view: view,
|
|
956
|
+
event: event,
|
|
957
|
+
tabIndex: -1
|
|
958
|
+
});
|
|
959
|
+
}
|
|
960
|
+
}), _el$64, _co$14);
|
|
961
|
+
_$insert(_el$62, _$createComponent(EventChip, {
|
|
962
|
+
get event() {
|
|
963
|
+
return view.normalized(event, span.firstKey);
|
|
964
|
+
},
|
|
965
|
+
get owner() {
|
|
966
|
+
return props.owner;
|
|
967
|
+
},
|
|
968
|
+
get href() {
|
|
969
|
+
return eventHref(props.owner, event);
|
|
970
|
+
},
|
|
971
|
+
compact: true,
|
|
972
|
+
timeline: true,
|
|
973
|
+
get checkbox() {
|
|
974
|
+
return checked() !== undefined;
|
|
975
|
+
},
|
|
976
|
+
get onCheck() {
|
|
977
|
+
return view.checkOf(event);
|
|
978
|
+
},
|
|
979
|
+
get tabIndex() {
|
|
980
|
+
return tabOf(id);
|
|
981
|
+
},
|
|
982
|
+
get stop() {
|
|
983
|
+
return {
|
|
984
|
+
id,
|
|
985
|
+
column: week.offset + column(),
|
|
986
|
+
minute: -1 + (lanes() + row()) / 100
|
|
987
|
+
};
|
|
988
|
+
}
|
|
989
|
+
}), _el$66, _co$15);
|
|
990
|
+
_$effect(_p$ => {
|
|
991
|
+
var _v$30 = checked() !== undefined ? "true" : undefined,
|
|
992
|
+
_v$31 = checked() ? "true" : undefined,
|
|
993
|
+
_v$32 = view.justChecked().has(event.id) ? "true" : undefined,
|
|
994
|
+
_v$33 = String(week.offset + column() + 1),
|
|
995
|
+
_v$34 = String(lanes() + row() + 1),
|
|
996
|
+
_v$35 = eventAccent(event),
|
|
997
|
+
_v$36 = lanes() + row() + 1 > allDayRows() ? "none" : undefined;
|
|
998
|
+
_v$30 !== _p$.e && _$setAttribute(_el$62, "data-checkbox", _p$.e = _v$30);
|
|
999
|
+
_v$31 !== _p$.t && _$setAttribute(_el$62, "data-checked", _p$.t = _v$31);
|
|
1000
|
+
_v$32 !== _p$.a && _$setAttribute(_el$62, "data-just-checked", _p$.a = _v$32);
|
|
1001
|
+
_v$33 !== _p$.o && _$setStyleProperty(_el$62, "grid-column", _p$.o = _v$33);
|
|
1002
|
+
_v$34 !== _p$.i && _$setStyleProperty(_el$62, "grid-row", _p$.i = _v$34);
|
|
1003
|
+
_v$35 !== _p$.n && _$setStyleProperty(_el$62, "--k2b-calendar-accent", _p$.n = _v$35);
|
|
1004
|
+
_v$36 !== _p$.s && _$setStyleProperty(_el$62, "display", _p$.s = _v$36);
|
|
1005
|
+
return _p$;
|
|
1006
|
+
}, {
|
|
1007
|
+
e: undefined,
|
|
1008
|
+
t: undefined,
|
|
1009
|
+
a: undefined,
|
|
1010
|
+
o: undefined,
|
|
1011
|
+
i: undefined,
|
|
1012
|
+
n: undefined,
|
|
1013
|
+
s: undefined
|
|
1014
|
+
});
|
|
1015
|
+
return _el$62;
|
|
1016
|
+
})();
|
|
1017
|
+
}
|
|
1018
|
+
});
|
|
1019
|
+
}
|
|
1020
|
+
})]
|
|
1021
|
+
}), _el$11, _co$2);
|
|
1022
|
+
_$insert(_el$15, _$createComponent(For, {
|
|
1023
|
+
get each() {
|
|
1024
|
+
return Array.from({
|
|
1025
|
+
length: wake() / 60 + 1
|
|
1026
|
+
}, (_, index) => index * 60);
|
|
1027
|
+
},
|
|
1028
|
+
children: minute => (() => {
|
|
1029
|
+
var _el$67 = _$getNextElement(_tmpl$1);
|
|
1030
|
+
_$insert(_el$67, () => view.clock(minute));
|
|
1031
|
+
_$effect(_p$ => {
|
|
1032
|
+
var _v$37 = nowShown() && isNearNow(view, view.nowKey(), minute) ? "true" : undefined,
|
|
1033
|
+
_v$38 = termsCss(dayYTerms(wake(), nightsOpen(), minute));
|
|
1034
|
+
_v$37 !== _p$.e && _$setAttribute(_el$67, "data-near-now", _p$.e = _v$37);
|
|
1035
|
+
_v$38 !== _p$.t && _$setStyleProperty(_el$67, "top", _p$.t = _v$38);
|
|
1036
|
+
return _p$;
|
|
1037
|
+
}, {
|
|
1038
|
+
e: undefined,
|
|
1039
|
+
t: undefined
|
|
1040
|
+
});
|
|
1041
|
+
return _el$67;
|
|
1042
|
+
})()
|
|
1043
|
+
}), _el$21, _co$4);
|
|
1044
|
+
_$insert(_el$15, _$createComponent(Show, {
|
|
1045
|
+
get when() {
|
|
1046
|
+
return nightsOpen();
|
|
1047
|
+
},
|
|
1048
|
+
get children() {
|
|
1049
|
+
return _$createComponent(For, {
|
|
1050
|
+
get each() {
|
|
1051
|
+
return nightHours(wake());
|
|
1052
|
+
},
|
|
1053
|
+
children: minute => (() => {
|
|
1054
|
+
var _el$68 = _$getNextElement(_tmpl$10);
|
|
1055
|
+
_$insert(_el$68, () => view.clock(minute));
|
|
1056
|
+
_$effect(_$p => _$setStyleProperty(_el$68, "top", termsCss(dayYTerms(wake(), true, minute))));
|
|
1057
|
+
return _el$68;
|
|
1058
|
+
})()
|
|
1059
|
+
});
|
|
1060
|
+
}
|
|
1061
|
+
}), _el$23, _co$5);
|
|
1062
|
+
_el$16.$$click = () => setNightOverride(!nightsOpen());
|
|
1063
|
+
_$insert(_el$15, _$createComponent(Show, {
|
|
1064
|
+
get when() {
|
|
1065
|
+
return nowShown();
|
|
1066
|
+
},
|
|
1067
|
+
get children() {
|
|
1068
|
+
var _el$19 = _$getNextElement(_tmpl$);
|
|
1069
|
+
_$insert(_el$19, () => view.clock(view.nowMinute()));
|
|
1070
|
+
_$effect(_$p => _$setStyleProperty(_el$19, "top", termsCss(dayYTerms(wake(), nightsOpen(), view.nowMinute()))));
|
|
1071
|
+
return _el$19;
|
|
1072
|
+
}
|
|
1073
|
+
}), _el$25, _co$6);
|
|
1074
|
+
_$insert(_el$26, _$createComponent(For, {
|
|
1075
|
+
get each() {
|
|
1076
|
+
return Array.from({
|
|
1077
|
+
length: wake() / 60 + 1
|
|
1078
|
+
}, (_, index) => index * 60);
|
|
1079
|
+
},
|
|
1080
|
+
children: minute => (() => {
|
|
1081
|
+
var _el$69 = _$getNextElement(_tmpl$11);
|
|
1082
|
+
_$effect(_$p => _$setStyleProperty(_el$69, "top", termsCss(dayYTerms(wake(), nightsOpen(), minute))));
|
|
1083
|
+
return _el$69;
|
|
1084
|
+
})()
|
|
1085
|
+
}), _el$30, _co$7);
|
|
1086
|
+
_$insert(_el$26, _$createComponent(Show, {
|
|
1087
|
+
get when() {
|
|
1088
|
+
return nightsOpen();
|
|
1089
|
+
},
|
|
1090
|
+
get fallback() {
|
|
1091
|
+
return (() => {
|
|
1092
|
+
var _el$70 = _$getNextElement(_tmpl$12);
|
|
1093
|
+
_$effect(_$p => _$setStyleProperty(_el$70, "top", `calc(${termsCss(dayYTerms(wake(), false, wake()))} + 3px)`));
|
|
1094
|
+
return _el$70;
|
|
1095
|
+
})();
|
|
1096
|
+
},
|
|
1097
|
+
get children() {
|
|
1098
|
+
return [(() => {
|
|
1099
|
+
var _el$27 = _$getNextElement(_tmpl$2);
|
|
1100
|
+
_$effect(_p$ => {
|
|
1101
|
+
var _v$ = termsCss(dayYTerms(wake(), true, wake())),
|
|
1102
|
+
_v$2 = termsCss([0, (DAY_MINUTES - wake()) / 60, 1, 0]);
|
|
1103
|
+
_v$ !== _p$.e && _$setStyleProperty(_el$27, "top", _p$.e = _v$);
|
|
1104
|
+
_v$2 !== _p$.t && _$setStyleProperty(_el$27, "height", _p$.t = _v$2);
|
|
1105
|
+
return _p$;
|
|
1106
|
+
}, {
|
|
1107
|
+
e: undefined,
|
|
1108
|
+
t: undefined
|
|
1109
|
+
});
|
|
1110
|
+
return _el$27;
|
|
1111
|
+
})(), _$createComponent(For, {
|
|
1112
|
+
get each() {
|
|
1113
|
+
return nightHours(wake());
|
|
1114
|
+
},
|
|
1115
|
+
children: minute => (() => {
|
|
1116
|
+
var _el$71 = _$getNextElement(_tmpl$11);
|
|
1117
|
+
_$effect(_p$ => {
|
|
1118
|
+
var _v$39 = view.clock(minute) === "00:00" ? "true" : undefined,
|
|
1119
|
+
_v$40 = termsCss(dayYTerms(wake(), true, minute));
|
|
1120
|
+
_v$39 !== _p$.e && _$setAttribute(_el$71, "data-midnight", _p$.e = _v$39);
|
|
1121
|
+
_v$40 !== _p$.t && _$setStyleProperty(_el$71, "top", _p$.t = _v$40);
|
|
1122
|
+
return _p$;
|
|
1123
|
+
}, {
|
|
1124
|
+
e: undefined,
|
|
1125
|
+
t: undefined
|
|
1126
|
+
});
|
|
1127
|
+
return _el$71;
|
|
1128
|
+
})()
|
|
1129
|
+
})];
|
|
1130
|
+
}
|
|
1131
|
+
}), _el$32, _co$8);
|
|
1132
|
+
_$insert(_el$26, _$createComponent(Show, {
|
|
1133
|
+
get when() {
|
|
1134
|
+
return nowShown();
|
|
1135
|
+
},
|
|
1136
|
+
get children() {
|
|
1137
|
+
var _el$28 = _$getNextElement(_tmpl$3);
|
|
1138
|
+
_$effect(_$p => _$setStyleProperty(_el$28, "top", termsCss(dayYTerms(wake(), nightsOpen(), view.nowMinute()))));
|
|
1139
|
+
return _el$28;
|
|
1140
|
+
}
|
|
1141
|
+
}), _el$34, _co$9);
|
|
1142
|
+
_$insert(_el$14, _$createComponent(For, {
|
|
1143
|
+
get each() {
|
|
1144
|
+
return keys();
|
|
1145
|
+
},
|
|
1146
|
+
children: key => _$createComponent(WeekColumn, {
|
|
1147
|
+
view: view,
|
|
1148
|
+
dayKey: key,
|
|
1149
|
+
get column() {
|
|
1150
|
+
return indexOf(key);
|
|
1151
|
+
},
|
|
1152
|
+
get expanded() {
|
|
1153
|
+
return nightsOpen();
|
|
1154
|
+
},
|
|
1155
|
+
tabOf: tabOf,
|
|
1156
|
+
lastPointer: () => lastPointer,
|
|
1157
|
+
setLastPointer: value => {
|
|
1158
|
+
lastPointer = value;
|
|
1159
|
+
},
|
|
1160
|
+
scroller: () => scroller
|
|
1161
|
+
})
|
|
1162
|
+
}), _el$36, _co$0);
|
|
1163
|
+
_$setAttribute(_el$37, "id", helpId);
|
|
1164
|
+
_$insert(_el$37, () => view.messages().calendarKeyboardHelp);
|
|
1165
|
+
_$insert(_el$, _$createComponent(TimeQuickCreate, {
|
|
1166
|
+
view: view
|
|
1167
|
+
}), _el$39, _co$1);
|
|
1168
|
+
_$effect(_p$ => {
|
|
1169
|
+
var _v$3 = view.dragging() || undefined,
|
|
1170
|
+
_v$4 = view.messages().calendarWeek,
|
|
1171
|
+
_v$5 = String(keys().length),
|
|
1172
|
+
_v$6 = view.messages().calendarAllDayAndDue,
|
|
1173
|
+
_v$7 = `repeat(${allDayRows()}, var(--k2b-calendar-all-day-row))`,
|
|
1174
|
+
_v$8 = termsCss(dayHeightTerms(wake(), nightsOpen())),
|
|
1175
|
+
_v$9 = nightsOpen() ? "true" : "false",
|
|
1176
|
+
_v$0 = nightsOpen() ? view.messages().calendarFoldNights : view.messages().calendarOpenNights({
|
|
1177
|
+
from: view.clock(wake()).slice(0, 2),
|
|
1178
|
+
to: view.clock(DAY_MINUTES).slice(0, 2)
|
|
1179
|
+
}),
|
|
1180
|
+
_v$1 = nightsOpen() ? view.messages().calendarFoldNights : view.messages().calendarOpenNights({
|
|
1181
|
+
from: view.clock(wake()).slice(0, 2),
|
|
1182
|
+
to: view.clock(DAY_MINUTES).slice(0, 2)
|
|
1183
|
+
}),
|
|
1184
|
+
_v$10 = nightsOpen() ? "true" : undefined,
|
|
1185
|
+
_v$11 = termsCss(dayYTerms(wake(), nightsOpen(), nightsOpen() ? wake() : wake() + 1)),
|
|
1186
|
+
_v$12 = `ti ${nightsOpen() ? "ti-chevron-up" : "ti-chevron-down"}`;
|
|
1187
|
+
_v$3 !== _p$.e && _$setAttribute(_el$, "data-dragging", _p$.e = _v$3);
|
|
1188
|
+
_v$4 !== _p$.t && _$setAttribute(_el$2, "aria-label", _p$.t = _v$4);
|
|
1189
|
+
_v$5 !== _p$.a && _$setStyleProperty(_el$2, "--k2b-calendar-days", _p$.a = _v$5);
|
|
1190
|
+
_v$6 !== _p$.o && _$setAttribute(_el$9, "aria-label", _p$.o = _v$6);
|
|
1191
|
+
_v$7 !== _p$.i && _$setStyleProperty(_el$9, "grid-template-rows", _p$.i = _v$7);
|
|
1192
|
+
_v$8 !== _p$.n && _$setStyleProperty(_el$14, "height", _p$.n = _v$8);
|
|
1193
|
+
_v$9 !== _p$.s && _$setAttribute(_el$16, "aria-expanded", _p$.s = _v$9);
|
|
1194
|
+
_v$0 !== _p$.h && _$setAttribute(_el$16, "aria-label", _p$.h = _v$0);
|
|
1195
|
+
_v$1 !== _p$.r && _$setAttribute(_el$16, "title", _p$.r = _v$1);
|
|
1196
|
+
_v$10 !== _p$.d && _$setAttribute(_el$16, "data-open", _p$.d = _v$10);
|
|
1197
|
+
_v$11 !== _p$.l && _$setStyleProperty(_el$16, "top", _p$.l = _v$11);
|
|
1198
|
+
_v$12 !== _p$.u && _$className(_el$18, _p$.u = _v$12);
|
|
1199
|
+
return _p$;
|
|
1200
|
+
}, {
|
|
1201
|
+
e: undefined,
|
|
1202
|
+
t: undefined,
|
|
1203
|
+
a: undefined,
|
|
1204
|
+
o: undefined,
|
|
1205
|
+
i: undefined,
|
|
1206
|
+
n: undefined,
|
|
1207
|
+
s: undefined,
|
|
1208
|
+
h: undefined,
|
|
1209
|
+
r: undefined,
|
|
1210
|
+
d: undefined,
|
|
1211
|
+
l: undefined,
|
|
1212
|
+
u: undefined
|
|
1213
|
+
});
|
|
1214
|
+
_$runHydrationEvents();
|
|
1215
|
+
return _el$;
|
|
1216
|
+
})();
|
|
1217
|
+
function columnWidthSignal() {
|
|
1218
|
+
// Read through the visible count so a resize recomputes the hints.
|
|
1219
|
+
visibleCount();
|
|
1220
|
+
return columnWidth();
|
|
1221
|
+
}
|
|
1222
|
+
};
|
|
1223
|
+
const WeekColumn = props => {
|
|
1224
|
+
const view = props.view;
|
|
1225
|
+
const model = createMemo(() => view.dayOf(props.dayKey));
|
|
1226
|
+
const wake = () => view.wake();
|
|
1227
|
+
const bands = createMemo(() => dayBands(view, props.dayKey, props.expanded));
|
|
1228
|
+
const gaps = createMemo(() => dayGaps(view, props.dayKey));
|
|
1229
|
+
const markers = () => model().markers.filter(marker => marker.minute < (props.expanded ? DAY_MINUTES : wake()));
|
|
1230
|
+
/** Deadlines whose pills would cover each other share the width; keyed by marker, so rows keep their elements. */
|
|
1231
|
+
const lanes = createMemo(() => new Map(markerLanes(markers(), wake()).map(entry => [entry.item, entry])));
|
|
1232
|
+
const folded = () => props.expanded ? [] : foldedEntries(view, props.dayKey);
|
|
1233
|
+
const isEmptyTarget = target => target instanceof Element && !target.closest("a,button,[data-calendar-event],.k2b-calendar-band,.k2b-calendar-marker,.k2b-calendar-draft,.k2b-calendar-week__fold-cell");
|
|
1234
|
+
const minuteAt = (element, clientY) => {
|
|
1235
|
+
const geometry = readDayGeometry(element, wake(), props.expanded);
|
|
1236
|
+
return Math.max(0, Math.min((props.expanded ? DAY_MINUTES : wake()) - 15, dayMinuteAt(geometry, clientY - element.getBoundingClientRect().top)));
|
|
1237
|
+
};
|
|
1238
|
+
const nowMinute = () => props.dayKey === view.nowKey() ? view.nowMinute() : null;
|
|
1239
|
+
const selected = () => view.selection()?.key === props.dayKey;
|
|
1240
|
+
/** The quarter hour under the mouse on empty time, as a line with its time, to aim a drag at. */
|
|
1241
|
+
const [hover, setHover] = createSignal(null);
|
|
1242
|
+
const timeline = createMemo(() => [...gaps().map(gap => ({
|
|
1243
|
+
at: gap.start,
|
|
1244
|
+
kind: "gap",
|
|
1245
|
+
gap
|
|
1246
|
+
})), ...bands().map(band => ({
|
|
1247
|
+
at: Math.max(0, band.start),
|
|
1248
|
+
kind: "band",
|
|
1249
|
+
band
|
|
1250
|
+
})), ...markers().map(marker => ({
|
|
1251
|
+
at: marker.minute,
|
|
1252
|
+
kind: "marker",
|
|
1253
|
+
marker
|
|
1254
|
+
}))].sort((left, right) => left.at - right.at));
|
|
1255
|
+
return (() => {
|
|
1256
|
+
var _el$72 = _$getNextElement(_tmpl$16),
|
|
1257
|
+
_el$77 = _el$72.firstChild,
|
|
1258
|
+
[_el$78, _co$16] = _$getNextMarker(_el$77.nextSibling),
|
|
1259
|
+
_el$79 = _el$78.nextSibling,
|
|
1260
|
+
[_el$80, _co$17] = _$getNextMarker(_el$79.nextSibling),
|
|
1261
|
+
_el$81 = _el$80.nextSibling,
|
|
1262
|
+
[_el$82, _co$18] = _$getNextMarker(_el$81.nextSibling),
|
|
1263
|
+
_el$83 = _el$82.nextSibling,
|
|
1264
|
+
[_el$84, _co$19] = _$getNextMarker(_el$83.nextSibling),
|
|
1265
|
+
_el$85 = _el$84.nextSibling,
|
|
1266
|
+
[_el$86, _co$20] = _$getNextMarker(_el$85.nextSibling);
|
|
1267
|
+
_el$72.addEventListener("pointerleave", () => setHover(null));
|
|
1268
|
+
_el$72.$$pointermove = event => {
|
|
1269
|
+
if (event.pointerType !== "mouse" || view.dragging() || !isEmptyTarget(event.target)) return setHover(null);
|
|
1270
|
+
setHover(Math.floor(minuteAt(event.currentTarget, event.clientY) / 15) * 15);
|
|
1271
|
+
};
|
|
1272
|
+
_el$72.$$dblclick = event => {
|
|
1273
|
+
if (!isEmptyTarget(event.target) || props.lastPointer() !== "mouse") return;
|
|
1274
|
+
const minute = Math.floor(minuteAt(event.currentTarget, event.clientY) / 30) * 30;
|
|
1275
|
+
view.openQuickCreate(props.dayKey, minute, Math.min(minute + 60, props.expanded ? DAY_MINUTES : wake()), event.currentTarget);
|
|
1276
|
+
};
|
|
1277
|
+
_$addEventListener(_el$72, "click", event => {
|
|
1278
|
+
if (!isEmptyTarget(event.target)) return;
|
|
1279
|
+
const minute = Math.floor(minuteAt(event.currentTarget, event.clientY) / 30) * 30;
|
|
1280
|
+
const end = Math.min(minute + 60, props.expanded ? DAY_MINUTES : wake());
|
|
1281
|
+
if (props.lastPointer() === "mouse") {
|
|
1282
|
+
if (!view.canCreate()) return;
|
|
1283
|
+
view.setTouchDraft(null);
|
|
1284
|
+
view.setSelection({
|
|
1285
|
+
key: props.dayKey,
|
|
1286
|
+
start: minute,
|
|
1287
|
+
end
|
|
1288
|
+
});
|
|
1289
|
+
return;
|
|
1290
|
+
}
|
|
1291
|
+
// A first tap on a column shows its free time; the next one proposes an hour there.
|
|
1292
|
+
if (view.activeKey() !== props.dayKey) {
|
|
1293
|
+
view.setActiveKey(props.dayKey);
|
|
1294
|
+
view.setTouchDraft(null);
|
|
1295
|
+
view.setSelection({
|
|
1296
|
+
key: props.dayKey
|
|
1297
|
+
});
|
|
1298
|
+
return;
|
|
1299
|
+
}
|
|
1300
|
+
if (!view.canCreate()) return;
|
|
1301
|
+
view.setTouchDraft({
|
|
1302
|
+
key: props.dayKey,
|
|
1303
|
+
start: minute,
|
|
1304
|
+
end
|
|
1305
|
+
});
|
|
1306
|
+
view.setSelection({
|
|
1307
|
+
key: props.dayKey,
|
|
1308
|
+
start: minute,
|
|
1309
|
+
end
|
|
1310
|
+
});
|
|
1311
|
+
});
|
|
1312
|
+
_el$72.$$touchstart = () => props.setLastPointer("touch");
|
|
1313
|
+
_el$72.$$pointerdown = event => {
|
|
1314
|
+
props.setLastPointer(event.pointerType);
|
|
1315
|
+
if (event.button !== 0 || !isEmptyTarget(event.target)) return;
|
|
1316
|
+
view.startDraw(event, props.dayKey, props.scroller());
|
|
1317
|
+
};
|
|
1318
|
+
_$use(element => view.registerBody(props.dayKey, element, () => props.expanded), _el$72);
|
|
1319
|
+
_$insert(_el$72, _$createComponent(For, {
|
|
1320
|
+
get each() {
|
|
1321
|
+
return timeline();
|
|
1322
|
+
},
|
|
1323
|
+
children: entry => entry.kind === "gap" ? _$createComponent(TimeGap, {
|
|
1324
|
+
view: view,
|
|
1325
|
+
get gap() {
|
|
1326
|
+
return entry.gap;
|
|
1327
|
+
},
|
|
1328
|
+
get dayKey() {
|
|
1329
|
+
return props.dayKey;
|
|
1330
|
+
},
|
|
1331
|
+
get expanded() {
|
|
1332
|
+
return props.expanded;
|
|
1333
|
+
},
|
|
1334
|
+
get aside() {
|
|
1335
|
+
return gapAside(model(), entry.gap);
|
|
1336
|
+
},
|
|
1337
|
+
get tabIndex() {
|
|
1338
|
+
return props.tabOf(`g:${props.dayKey}:${entry.gap.start}`);
|
|
1339
|
+
},
|
|
1340
|
+
get stop() {
|
|
1341
|
+
return {
|
|
1342
|
+
id: `g:${props.dayKey}:${entry.gap.start}`,
|
|
1343
|
+
column: props.column,
|
|
1344
|
+
minute: entry.gap.start + 0.5
|
|
1345
|
+
};
|
|
1346
|
+
}
|
|
1347
|
+
}) : entry.kind === "band" ? _$createComponent(TimeBand, {
|
|
1348
|
+
view: view,
|
|
1349
|
+
get band() {
|
|
1350
|
+
return entry.band;
|
|
1351
|
+
},
|
|
1352
|
+
get dayKey() {
|
|
1353
|
+
return props.dayKey;
|
|
1354
|
+
},
|
|
1355
|
+
get expanded() {
|
|
1356
|
+
return props.expanded;
|
|
1357
|
+
},
|
|
1358
|
+
hourPx: 48,
|
|
1359
|
+
get tabIndex() {
|
|
1360
|
+
return props.tabOf(`b:${entry.band.item.id}:${props.dayKey}`);
|
|
1361
|
+
},
|
|
1362
|
+
get stop() {
|
|
1363
|
+
return {
|
|
1364
|
+
id: `b:${entry.band.item.id}:${props.dayKey}`,
|
|
1365
|
+
column: props.column,
|
|
1366
|
+
minute: entry.band.start
|
|
1367
|
+
};
|
|
1368
|
+
},
|
|
1369
|
+
get scroller() {
|
|
1370
|
+
return props.scroller;
|
|
1371
|
+
}
|
|
1372
|
+
}) : _$createComponent(TimeMarker, {
|
|
1373
|
+
view: view,
|
|
1374
|
+
get event() {
|
|
1375
|
+
return entry.marker.item;
|
|
1376
|
+
},
|
|
1377
|
+
get minute() {
|
|
1378
|
+
return entry.marker.minute;
|
|
1379
|
+
},
|
|
1380
|
+
get dayKey() {
|
|
1381
|
+
return props.dayKey;
|
|
1382
|
+
},
|
|
1383
|
+
get expanded() {
|
|
1384
|
+
return props.expanded;
|
|
1385
|
+
},
|
|
1386
|
+
get above() {
|
|
1387
|
+
return markerAbove(model(), entry.marker.minute);
|
|
1388
|
+
},
|
|
1389
|
+
get lane() {
|
|
1390
|
+
return lanes().get(entry.marker)?.lane ?? 0;
|
|
1391
|
+
},
|
|
1392
|
+
get lanes() {
|
|
1393
|
+
return lanes().get(entry.marker)?.lanes ?? 1;
|
|
1394
|
+
},
|
|
1395
|
+
showTime: false,
|
|
1396
|
+
get tabIndex() {
|
|
1397
|
+
return props.tabOf(`m:${entry.marker.item.id}`);
|
|
1398
|
+
},
|
|
1399
|
+
get stop() {
|
|
1400
|
+
return {
|
|
1401
|
+
id: `m:${entry.marker.item.id}`,
|
|
1402
|
+
column: props.column,
|
|
1403
|
+
minute: entry.marker.minute
|
|
1404
|
+
};
|
|
1405
|
+
},
|
|
1406
|
+
get scroller() {
|
|
1407
|
+
return props.scroller;
|
|
1408
|
+
}
|
|
1409
|
+
})
|
|
1410
|
+
}), _el$78, _co$16);
|
|
1411
|
+
_$insert(_el$72, _$createComponent(Show, {
|
|
1412
|
+
get when() {
|
|
1413
|
+
return _$memo(() => !!!props.expanded)() && folded().length > 0;
|
|
1414
|
+
},
|
|
1415
|
+
get children() {
|
|
1416
|
+
var _el$73 = _$getNextElement(_tmpl$13),
|
|
1417
|
+
_el$74 = _el$73.firstChild;
|
|
1418
|
+
_$insert(_el$74, _$createComponent(For, {
|
|
1419
|
+
get each() {
|
|
1420
|
+
return folded();
|
|
1421
|
+
},
|
|
1422
|
+
children: (entry, index) => {
|
|
1423
|
+
const checked = () => view.checkedOf(entry.event);
|
|
1424
|
+
return (() => {
|
|
1425
|
+
var _el$87 = _$getNextElement(_tmpl$17),
|
|
1426
|
+
_el$88 = _el$87.firstChild,
|
|
1427
|
+
[_el$89, _co$21] = _$getNextMarker(_el$88.nextSibling),
|
|
1428
|
+
_el$90 = _el$89.nextSibling,
|
|
1429
|
+
[_el$91, _co$22] = _$getNextMarker(_el$90.nextSibling);
|
|
1430
|
+
_$insert(_el$87, _$createComponent(Show, {
|
|
1431
|
+
get when() {
|
|
1432
|
+
return checked() !== undefined;
|
|
1433
|
+
},
|
|
1434
|
+
get children() {
|
|
1435
|
+
return _$createComponent(TimeCheck, {
|
|
1436
|
+
view: view,
|
|
1437
|
+
get event() {
|
|
1438
|
+
return entry.event;
|
|
1439
|
+
},
|
|
1440
|
+
tabIndex: -1
|
|
1441
|
+
});
|
|
1442
|
+
}
|
|
1443
|
+
}), _el$89, _co$21);
|
|
1444
|
+
_$insert(_el$87, _$createComponent(EventChip, {
|
|
1445
|
+
get event() {
|
|
1446
|
+
return view.normalized(entry.event, props.dayKey);
|
|
1447
|
+
},
|
|
1448
|
+
get owner() {
|
|
1449
|
+
return view.props.owner;
|
|
1450
|
+
},
|
|
1451
|
+
get href() {
|
|
1452
|
+
return eventHref(view.props.owner, entry.event);
|
|
1453
|
+
},
|
|
1454
|
+
compact: true,
|
|
1455
|
+
timeline: true,
|
|
1456
|
+
get leadingTime() {
|
|
1457
|
+
return entry.time;
|
|
1458
|
+
},
|
|
1459
|
+
get checkbox() {
|
|
1460
|
+
return checked() !== undefined;
|
|
1461
|
+
},
|
|
1462
|
+
get onCheck() {
|
|
1463
|
+
return view.checkOf(entry.event);
|
|
1464
|
+
},
|
|
1465
|
+
get tabIndex() {
|
|
1466
|
+
return props.tabOf(`f:${entry.event.id}:${props.dayKey}`);
|
|
1467
|
+
},
|
|
1468
|
+
get stop() {
|
|
1469
|
+
return {
|
|
1470
|
+
id: `f:${entry.event.id}:${props.dayKey}`,
|
|
1471
|
+
column: props.column,
|
|
1472
|
+
minute: wake() + index() / 100
|
|
1473
|
+
};
|
|
1474
|
+
}
|
|
1475
|
+
}), _el$91, _co$22);
|
|
1476
|
+
_$effect(_p$ => {
|
|
1477
|
+
var _v$49 = checked() !== undefined ? "true" : undefined,
|
|
1478
|
+
_v$50 = checked() ? "true" : undefined,
|
|
1479
|
+
_v$51 = eventAccent(entry.event);
|
|
1480
|
+
_v$49 !== _p$.e && _$setAttribute(_el$87, "data-checkbox", _p$.e = _v$49);
|
|
1481
|
+
_v$50 !== _p$.t && _$setAttribute(_el$87, "data-checked", _p$.t = _v$50);
|
|
1482
|
+
_v$51 !== _p$.a && _$setStyleProperty(_el$87, "--k2b-calendar-accent", _p$.a = _v$51);
|
|
1483
|
+
return _p$;
|
|
1484
|
+
}, {
|
|
1485
|
+
e: undefined,
|
|
1486
|
+
t: undefined,
|
|
1487
|
+
a: undefined
|
|
1488
|
+
});
|
|
1489
|
+
return _el$87;
|
|
1490
|
+
})();
|
|
1491
|
+
}
|
|
1492
|
+
}));
|
|
1493
|
+
_$effect(_$p => _$setStyleProperty(_el$73, "top", `calc(${termsCss(dayYTerms(wake(), false, wake()))} + 3px)`));
|
|
1494
|
+
return _el$73;
|
|
1495
|
+
}
|
|
1496
|
+
}), _el$80, _co$17);
|
|
1497
|
+
_$insert(_el$72, _$createComponent(TimeOverlays, {
|
|
1498
|
+
view: view,
|
|
1499
|
+
get dayKey() {
|
|
1500
|
+
return props.dayKey;
|
|
1501
|
+
},
|
|
1502
|
+
get expanded() {
|
|
1503
|
+
return props.expanded;
|
|
1504
|
+
}
|
|
1505
|
+
}), _el$82, _co$18);
|
|
1506
|
+
_$insert(_el$72, _$createComponent(Show, {
|
|
1507
|
+
get when() {
|
|
1508
|
+
return hover() !== null;
|
|
1509
|
+
},
|
|
1510
|
+
get children() {
|
|
1511
|
+
var _el$75 = _$getNextElement(_tmpl$14);
|
|
1512
|
+
_$insert(_el$75, () => view.clock(hover()));
|
|
1513
|
+
_$effect(_$p => _$setStyleProperty(_el$75, "top", termsCss(dayYTerms(wake(), props.expanded, hover()))));
|
|
1514
|
+
return _el$75;
|
|
1515
|
+
}
|
|
1516
|
+
}), _el$84, _co$19);
|
|
1517
|
+
_$insert(_el$72, _$createComponent(Show, {
|
|
1518
|
+
get when() {
|
|
1519
|
+
return _$memo(() => !!(nowMinute() !== null && nowMinute() >= 0))() && nowMinute() < (props.expanded ? DAY_MINUTES : wake());
|
|
1520
|
+
},
|
|
1521
|
+
get children() {
|
|
1522
|
+
var _el$76 = _$getNextElement(_tmpl$15);
|
|
1523
|
+
_$effect(_$p => _$setStyleProperty(_el$76, "top", termsCss(dayYTerms(wake(), props.expanded, nowMinute()))));
|
|
1524
|
+
return _el$76;
|
|
1525
|
+
}
|
|
1526
|
+
}), _el$86, _co$20);
|
|
1527
|
+
_$effect(_p$ => {
|
|
1528
|
+
var _v$41 = props.dayKey,
|
|
1529
|
+
_v$42 = props.expanded ? "true" : "false",
|
|
1530
|
+
_v$43 = props.dayKey === view.calendarToday() ? "true" : undefined,
|
|
1531
|
+
_v$44 = selected() ? "true" : undefined,
|
|
1532
|
+
_v$45 = view.activeKey() === props.dayKey ? "true" : undefined,
|
|
1533
|
+
_v$46 = longDay(view, props.dayKey),
|
|
1534
|
+
_v$47 = String(props.column + 2),
|
|
1535
|
+
_v$48 = termsCss(dayHeightTerms(wake(), props.expanded));
|
|
1536
|
+
_v$41 !== _p$.e && _$setAttribute(_el$72, "data-calendar-body", _p$.e = _v$41);
|
|
1537
|
+
_v$42 !== _p$.t && _$setAttribute(_el$72, "data-expanded", _p$.t = _v$42);
|
|
1538
|
+
_v$43 !== _p$.a && _$setAttribute(_el$72, "data-today", _p$.a = _v$43);
|
|
1539
|
+
_v$44 !== _p$.o && _$setAttribute(_el$72, "data-selected", _p$.o = _v$44);
|
|
1540
|
+
_v$45 !== _p$.i && _$setAttribute(_el$72, "data-active", _p$.i = _v$45);
|
|
1541
|
+
_v$46 !== _p$.n && _$setAttribute(_el$72, "aria-label", _p$.n = _v$46);
|
|
1542
|
+
_v$47 !== _p$.s && _$setStyleProperty(_el$72, "grid-column", _p$.s = _v$47);
|
|
1543
|
+
_v$48 !== _p$.h && _$setStyleProperty(_el$72, "height", _p$.h = _v$48);
|
|
1544
|
+
return _p$;
|
|
1545
|
+
}, {
|
|
1546
|
+
e: undefined,
|
|
1547
|
+
t: undefined,
|
|
1548
|
+
a: undefined,
|
|
1549
|
+
o: undefined,
|
|
1550
|
+
i: undefined,
|
|
1551
|
+
n: undefined,
|
|
1552
|
+
s: undefined,
|
|
1553
|
+
h: undefined
|
|
1554
|
+
});
|
|
1555
|
+
_$runHydrationEvents();
|
|
1556
|
+
return _el$72;
|
|
1557
|
+
})();
|
|
1558
|
+
};
|
|
1559
|
+
|
|
1560
|
+
/** ISO week number of a day key. */
|
|
1561
|
+
const isoWeek = key => {
|
|
1562
|
+
const date = new Date(`${key}T00:00:00Z`);
|
|
1563
|
+
const day = date.getUTCDay() || 7;
|
|
1564
|
+
date.setUTCDate(date.getUTCDate() + 4 - day);
|
|
1565
|
+
const yearStart = new Date(Date.UTC(date.getUTCFullYear(), 0, 1));
|
|
1566
|
+
return Math.ceil(((date.getTime() - yearStart.getTime()) / 86_400_000 + 1) / 7);
|
|
1567
|
+
};
|
|
1568
|
+
|
|
1569
|
+
/** The day at a torn end of a bar, with its month when it lies in another month than the shown week. */
|
|
1570
|
+
const hintDate = (view, target, shown) => ({
|
|
1571
|
+
day: Number(target.slice(8, 10)),
|
|
1572
|
+
month: target.slice(0, 7) === shown.slice(0, 7) ? undefined : view.parseKey(target).toLocaleDateString(view.dateConfig().locale ?? "en", {
|
|
1573
|
+
month: "short",
|
|
1574
|
+
timeZone: view.dateConfig().timeZone
|
|
1575
|
+
}).replace(/\.$/, "")
|
|
1576
|
+
});
|
|
1577
|
+
|
|
1578
|
+
/** A long entry's accessible name names the days it spans. */
|
|
1579
|
+
const spanLabel = (view, span) => {
|
|
1580
|
+
if (span.firstKey === span.lastKey) return undefined;
|
|
1581
|
+
const format = key => view.parseKey(key).toLocaleDateString(view.dateConfig().locale ?? "en", {
|
|
1582
|
+
month: "long",
|
|
1583
|
+
day: "numeric",
|
|
1584
|
+
timeZone: view.dateConfig().timeZone
|
|
1585
|
+
});
|
|
1586
|
+
return view.messages().calendarEventTime({
|
|
1587
|
+
title: span.item.title,
|
|
1588
|
+
start: format(span.firstKey),
|
|
1589
|
+
end: format(span.lastKey)
|
|
1590
|
+
});
|
|
1591
|
+
};
|
|
1592
|
+
_$delegateEvents(["keydown", "focusin", "touchstart", "touchend", "pointerdown", "dblclick", "click", "pointermove"]);
|
|
1593
|
+
//# sourceMappingURL=CalendarWeekView.js.map
|