@linked.cm/calendar 0.1.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/LICENSE +12 -0
- package/README.md +48 -0
- package/THIRD_PARTY_NOTICES.md +12 -0
- package/lib/esm/Calendar.d.ts +57 -0
- package/lib/esm/Calendar.js +202 -0
- package/lib/esm/Calendar.js.map +1 -0
- package/lib/esm/Calendar.module.css +912 -0
- package/lib/esm/EventPopover.d.ts +17 -0
- package/lib/esm/EventPopover.js +104 -0
- package/lib/esm/EventPopover.js.map +1 -0
- package/lib/esm/ResourceGrid.d.ts +11 -0
- package/lib/esm/ResourceGrid.js +36 -0
- package/lib/esm/ResourceGrid.js.map +1 -0
- package/lib/esm/TimeGrid.d.ts +15 -0
- package/lib/esm/TimeGrid.js +276 -0
- package/lib/esm/TimeGrid.js.map +1 -0
- package/lib/esm/index.d.ts +10 -0
- package/lib/esm/index.js +12 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/package.d.ts +8 -0
- package/lib/esm/package.js +10 -0
- package/lib/esm/package.js.map +1 -0
- package/lib/esm/range.d.ts +3 -0
- package/lib/esm/range.js +22 -0
- package/lib/esm/range.js.map +1 -0
- package/lib/esm/recurrence.d.ts +14 -0
- package/lib/esm/recurrence.js +60 -0
- package/lib/esm/recurrence.js.map +1 -0
- package/lib/esm/refreshBus.d.ts +10 -0
- package/lib/esm/refreshBus.js +25 -0
- package/lib/esm/refreshBus.js.map +1 -0
- package/lib/esm/styles.d.ts +4 -0
- package/lib/esm/translations/en.json +49 -0
- package/lib/esm/translations.d.ts +56 -0
- package/lib/esm/translations.js +44 -0
- package/lib/esm/translations.js.map +1 -0
- package/lib/esm/types.d.ts +97 -0
- package/lib/esm/types.js +11 -0
- package/lib/esm/types.js.map +1 -0
- package/lib/esm/tz.d.ts +30 -0
- package/lib/esm/tz.js +78 -0
- package/lib/esm/tz.js.map +1 -0
- package/package.json +98 -0
- package/src/translations/en.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Linked Community
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is
|
|
6
|
+
hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
|
|
7
|
+
|
|
8
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
|
|
9
|
+
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
10
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
11
|
+
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
12
|
+
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# `@linked.cm/calendar`
|
|
2
|
+
|
|
3
|
+
`@linked.cm/calendar` is the first-party, shape-agnostic calendar engine shared by LINKED applications.
|
|
4
|
+
It is a controlled projection: hosts provide render-ready calendar items and handle change callbacks through
|
|
5
|
+
their own canonical Shape verbs. The package never becomes an authoritative event store.
|
|
6
|
+
|
|
7
|
+
## Architecture
|
|
8
|
+
|
|
9
|
+
- The generic engine, recurrence windowing, timezone helpers, lanes, invitations, and refresh contract live
|
|
10
|
+
here.
|
|
11
|
+
- Serve's Event/Mission/RSVP/Resource mappings remain in `serve-community/src/services/calendar`.
|
|
12
|
+
- The Schedule organizer add-on supplies a separate adapter over its authorized Event and occurrence queries.
|
|
13
|
+
- Interactive and heading elements compose `@_linked/primitives`; the package does not create competing
|
|
14
|
+
atoms.
|
|
15
|
+
- Calendar-specific CSS seams fall back to the component/type tokens shipped by `@_linked/css`. Host themes
|
|
16
|
+
may override those seams, but the package does not own a Serve or Create Now palette.
|
|
17
|
+
- English source copy and stable translation keys live in `src/translations/en.json`. Consumers may pass a
|
|
18
|
+
translated `labels` contract without forking the component or its markup.
|
|
19
|
+
- RFC 5545 recurrence strings are parsed by the BSD-3-Clause `rrule` package behind the bounded
|
|
20
|
+
`expandRule`/`expandEvents` adapter. RRULE, DTSTART, RDATE, and EXDATE remain graph-authored inputs; the
|
|
21
|
+
returned occurrences are view projections only.
|
|
22
|
+
- The optional resource view accepts host-projected `CalResource` records and `CalEventData.resourceIds`.
|
|
23
|
+
Resource IDs stay opaque: people, rooms, equipment, and roles remain canonical in their owning graph
|
|
24
|
+
Shapes, while one event may be displayed in several columns without being copied.
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
import { Calendar, type CalEventData } from '@_linked/calendar';
|
|
28
|
+
|
|
29
|
+
const items: CalEventData[] = graphProjection.map(toCalendarItem);
|
|
30
|
+
|
|
31
|
+
<Calendar
|
|
32
|
+
events={items}
|
|
33
|
+
view="week"
|
|
34
|
+
cursor={cursor}
|
|
35
|
+
onView={setView}
|
|
36
|
+
onCursor={setCursor}
|
|
37
|
+
onMove={(item, start, end) => hostCommands.reschedule(item.id, start, end)}
|
|
38
|
+
/>;
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Package identity
|
|
42
|
+
|
|
43
|
+
- npm: `@_linked/calendar`
|
|
44
|
+
- package IRI: `https://linked.cm/pkg/calendar`
|
|
45
|
+
- repository target: `linked-cm/calendar`
|
|
46
|
+
|
|
47
|
+
The current Serve workspace is the extraction staging location. The package is structured so moving it into
|
|
48
|
+
its own public repository does not change imports, package identity, or graph identifiers.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
`@_linked/calendar` depends on the following permissively licensed runtime packages. Their full license
|
|
4
|
+
texts are distributed with their packages.
|
|
5
|
+
|
|
6
|
+
| Package | Version | License | Purpose |
|
|
7
|
+
| --- | --- | --- | --- |
|
|
8
|
+
| `rrule` | 2.8.1 | BSD-3-Clause | Bounded RFC 5545 recurrence parsing and expansion |
|
|
9
|
+
| `tslib` | 2.8.1 | 0BSD | Runtime helpers used by `rrule` |
|
|
10
|
+
|
|
11
|
+
The remaining direct runtime dependencies are first-party `@_linked/*` packages and React is a peer
|
|
12
|
+
dependency.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { CalEventData, CalResource, CalView } from './types.js';
|
|
3
|
+
export interface CalLabels {
|
|
4
|
+
today: string;
|
|
5
|
+
previous: string;
|
|
6
|
+
next: string;
|
|
7
|
+
viewName: (v: CalView) => string;
|
|
8
|
+
viewSwitcher: string;
|
|
9
|
+
loading: string;
|
|
10
|
+
allDay: string;
|
|
11
|
+
more: (n: number) => string;
|
|
12
|
+
empty: string;
|
|
13
|
+
resourceView: string;
|
|
14
|
+
resourceEmpty: string;
|
|
15
|
+
resourceColumnEmpty: string;
|
|
16
|
+
unassigned: string;
|
|
17
|
+
start: string;
|
|
18
|
+
end: string;
|
|
19
|
+
save: string;
|
|
20
|
+
cancel: string;
|
|
21
|
+
edit: string;
|
|
22
|
+
eventLocalTime: (time: string) => string;
|
|
23
|
+
directions: string;
|
|
24
|
+
join: string;
|
|
25
|
+
share: string;
|
|
26
|
+
checkIn: string;
|
|
27
|
+
expand: string;
|
|
28
|
+
close: string;
|
|
29
|
+
continued: string;
|
|
30
|
+
confirm: string;
|
|
31
|
+
interactionHint: string;
|
|
32
|
+
}
|
|
33
|
+
export interface CalendarProps {
|
|
34
|
+
events: CalEventData[];
|
|
35
|
+
/** Optional host-projected resources. Supplying this contract enables the Resource view tab. */
|
|
36
|
+
resources?: readonly CalResource[];
|
|
37
|
+
view: CalView;
|
|
38
|
+
cursor: Date;
|
|
39
|
+
timeZone?: string;
|
|
40
|
+
onView: (v: CalView) => void;
|
|
41
|
+
onCursor: (d: Date) => void;
|
|
42
|
+
/** Expand → full detail (called from the quick popover's Expand). */
|
|
43
|
+
onOpen?: (e: CalEventData) => void;
|
|
44
|
+
/** optional Check-in quick action in the popover. */
|
|
45
|
+
onCheckIn?: (e: CalEventData) => void;
|
|
46
|
+
onMove?: (e: CalEventData, start: Date, end: Date) => void;
|
|
47
|
+
onCreate?: (start: Date, end: Date) => void;
|
|
48
|
+
/** host-supplied extra content for the quick popover (Serve: a compact coverage peek). `close` lets the
|
|
49
|
+
* extra dismiss the popover (e.g. after firing an action). */
|
|
50
|
+
renderPopoverExtra?: (e: CalEventData, close: () => void) => React.ReactNode;
|
|
51
|
+
loading?: boolean;
|
|
52
|
+
/** BCP-47 locale for date/weekday formatting (default 'en-US'). */
|
|
53
|
+
locale?: string;
|
|
54
|
+
/** localized chrome strings (default English). */
|
|
55
|
+
labels?: Partial<CalLabels>;
|
|
56
|
+
}
|
|
57
|
+
export declare const Calendar: React.FC<CalendarProps>;
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { TimeGrid } from './TimeGrid.js';
|
|
4
|
+
import { ResourceGrid } from './ResourceGrid.js';
|
|
5
|
+
import { EventPopover } from './EventPopover.js';
|
|
6
|
+
import { dayKey, dayKeyTz, formatTime, formatTimeZone, isCrossTz } from './tz.js';
|
|
7
|
+
import { registerPackageExport } from './package.js';
|
|
8
|
+
import { defaultCalendarText } from './translations.js';
|
|
9
|
+
import { Button } from '@_linked/primitives/components/Button';
|
|
10
|
+
import { Heading } from '@_linked/primitives/components/Heading';
|
|
11
|
+
import { IconButton } from '@_linked/primitives/components/IconButton';
|
|
12
|
+
import style from './Calendar.module.css';
|
|
13
|
+
// Calendar — the headless, themeable engine (generic; → @_linked/calendar). Controlled: events in,
|
|
14
|
+
// interactions out. Month / Week / Day / Agenda / Resource. Displays in the VIEWER's `timeZone`; events carry their
|
|
15
|
+
// own location tz, so a cross-tz event shows both times. Token-themed; colours resolved by the host.
|
|
16
|
+
const DAY = 24 * 60 * 60 * 1000;
|
|
17
|
+
// Localized short weekday names (Sun-first) derived from a BCP-47 locale. Jan 1 2023 was a Sunday.
|
|
18
|
+
const weekdayShort = (locale) => Array.from({ length: 7 }, (_, i) => new Date(2023, 0, 1 + i).toLocaleDateString(locale, { weekday: 'short' }));
|
|
19
|
+
const DEFAULT_LABELS = {
|
|
20
|
+
today: defaultCalendarText.today,
|
|
21
|
+
previous: defaultCalendarText.previous,
|
|
22
|
+
next: defaultCalendarText.next,
|
|
23
|
+
viewName: (v) => defaultCalendarText[v],
|
|
24
|
+
viewSwitcher: defaultCalendarText.viewSwitcher,
|
|
25
|
+
loading: defaultCalendarText.loading,
|
|
26
|
+
allDay: defaultCalendarText.allDay,
|
|
27
|
+
more: (n) => defaultCalendarText.more.replace('{count}', String(n)),
|
|
28
|
+
empty: defaultCalendarText.empty,
|
|
29
|
+
resourceView: defaultCalendarText.resourceView,
|
|
30
|
+
resourceEmpty: defaultCalendarText.resourceEmpty,
|
|
31
|
+
resourceColumnEmpty: defaultCalendarText.resourceColumnEmpty,
|
|
32
|
+
unassigned: defaultCalendarText.unassigned,
|
|
33
|
+
start: defaultCalendarText.start,
|
|
34
|
+
end: defaultCalendarText.end,
|
|
35
|
+
save: defaultCalendarText.save,
|
|
36
|
+
cancel: defaultCalendarText.cancel,
|
|
37
|
+
edit: defaultCalendarText.edit,
|
|
38
|
+
eventLocalTime: (time) => defaultCalendarText.eventLocalTime.replace('{time}', time),
|
|
39
|
+
directions: defaultCalendarText.directions,
|
|
40
|
+
join: defaultCalendarText.join,
|
|
41
|
+
share: defaultCalendarText.share,
|
|
42
|
+
checkIn: defaultCalendarText.checkIn,
|
|
43
|
+
expand: defaultCalendarText.expand,
|
|
44
|
+
close: defaultCalendarText.close,
|
|
45
|
+
continued: defaultCalendarText.continued,
|
|
46
|
+
confirm: defaultCalendarText.confirm,
|
|
47
|
+
interactionHint: defaultCalendarText.interactionHint,
|
|
48
|
+
};
|
|
49
|
+
const startOfDay = (d) => new Date(d.getFullYear(), d.getMonth(), d.getDate());
|
|
50
|
+
const dayKeyLocal = (d) => dayKey(d.getFullYear(), d.getMonth() + 1, d.getDate());
|
|
51
|
+
const addDays = (d, n) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);
|
|
52
|
+
const weekOf = (d) => Array.from({ length: 7 }, (_, i) => addDays(d, i - d.getDay()));
|
|
53
|
+
const monthMatrix = (cursor) => {
|
|
54
|
+
const first = new Date(cursor.getFullYear(), cursor.getMonth(), 1);
|
|
55
|
+
const gridStart = addDays(first, -first.getDay());
|
|
56
|
+
return Array.from({ length: 42 }, (_, i) => addDays(gridStart, i));
|
|
57
|
+
};
|
|
58
|
+
export const Calendar = ({ events, resources, view, cursor, timeZone, onView, onCursor, onOpen, onCheckIn, onMove, onCreate, renderPopoverExtra, loading, locale = 'en-US', labels }) => {
|
|
59
|
+
const today = new Date();
|
|
60
|
+
const lab = { ...DEFAULT_LABELS, ...labels };
|
|
61
|
+
const weekdays = React.useMemo(() => weekdayShort(locale), [locale]);
|
|
62
|
+
// single click on an event → a quick-action popover anchored at the click; Expand opens the full detail
|
|
63
|
+
const [pop, setPop] = React.useState(null);
|
|
64
|
+
const returnFocusRef = React.useRef(null);
|
|
65
|
+
const instanceId = React.useId();
|
|
66
|
+
const headingId = `${instanceId}-heading`;
|
|
67
|
+
const panelId = `${instanceId}-panel`;
|
|
68
|
+
const tabId = (candidate) => `${instanceId}-${candidate}-tab`;
|
|
69
|
+
const onSelect = (e, x, y, trigger) => {
|
|
70
|
+
returnFocusRef.current = trigger !== null && trigger !== void 0 ? trigger : null;
|
|
71
|
+
setPop({ e, x, y });
|
|
72
|
+
};
|
|
73
|
+
const closePopover = React.useCallback(() => {
|
|
74
|
+
setPop(null);
|
|
75
|
+
const trigger = returnFocusRef.current;
|
|
76
|
+
returnFocusRef.current = null;
|
|
77
|
+
if (!trigger)
|
|
78
|
+
return;
|
|
79
|
+
if (typeof window !== 'undefined' && typeof window.requestAnimationFrame === 'function') {
|
|
80
|
+
window.requestAnimationFrame(() => trigger.focus());
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
trigger.focus();
|
|
84
|
+
}
|
|
85
|
+
}, []);
|
|
86
|
+
const step = (dir) => {
|
|
87
|
+
if (view === 'week')
|
|
88
|
+
onCursor(addDays(cursor, dir * 7));
|
|
89
|
+
else if (view === 'day' || view === 'resource')
|
|
90
|
+
onCursor(addDays(cursor, dir));
|
|
91
|
+
else
|
|
92
|
+
onCursor(new Date(cursor.getFullYear(), cursor.getMonth() + dir, 1));
|
|
93
|
+
};
|
|
94
|
+
const heading = view === 'day' || view === 'resource'
|
|
95
|
+
? cursor.toLocaleDateString(locale, { weekday: 'long', month: 'long', day: 'numeric' })
|
|
96
|
+
: view === 'week'
|
|
97
|
+
? (() => {
|
|
98
|
+
const w = weekOf(cursor);
|
|
99
|
+
return `${w[0].toLocaleDateString(locale, { month: 'short', day: 'numeric' })} – ${w[6].toLocaleDateString(locale, { month: 'short', day: 'numeric' })}`;
|
|
100
|
+
})()
|
|
101
|
+
: cursor.toLocaleDateString(locale, { month: 'long', year: 'numeric' });
|
|
102
|
+
const availableViews = resources
|
|
103
|
+
? ['month', 'week', 'day', 'agenda', 'resource']
|
|
104
|
+
: ['month', 'week', 'day', 'agenda'];
|
|
105
|
+
const selectViewTab = (event, index) => {
|
|
106
|
+
var _a;
|
|
107
|
+
let next = index;
|
|
108
|
+
if (event.key === 'ArrowRight')
|
|
109
|
+
next = (index + 1) % availableViews.length;
|
|
110
|
+
else if (event.key === 'ArrowLeft')
|
|
111
|
+
next = (index - 1 + availableViews.length) % availableViews.length;
|
|
112
|
+
else if (event.key === 'Home')
|
|
113
|
+
next = 0;
|
|
114
|
+
else if (event.key === 'End')
|
|
115
|
+
next = availableViews.length - 1;
|
|
116
|
+
else
|
|
117
|
+
return;
|
|
118
|
+
event.preventDefault();
|
|
119
|
+
onView(availableViews[next]);
|
|
120
|
+
const tablist = event.currentTarget.parentElement;
|
|
121
|
+
(_a = (tablist === null || tablist === void 0 ? void 0 : tablist.querySelectorAll('[role="tab"]')[next])) === null || _a === void 0 ? void 0 : _a.focus();
|
|
122
|
+
};
|
|
123
|
+
return (_jsxs("div", { className: style.cal, role: "region", "aria-labelledby": headingId, children: [_jsxs("header", { className: style.head, children: [_jsxs("div", { className: style.nav, children: [_jsx(IconButton, { type: "button", variant: "outline", size: "small", className: style.navBtn, "aria-label": lab.previous, onClick: () => step(-1), children: "\u2039" }), _jsx(Button, { type: "button", variant: "outline", size: "small", className: style.today, onClick: () => onCursor(new Date()), children: lab.today }), _jsx(IconButton, { type: "button", variant: "outline", size: "small", className: style.navBtn, "aria-label": lab.next, onClick: () => step(1), children: "\u203A" }), _jsx(Heading, { as: "h2", className: style.title, id: headingId, "aria-live": "polite", "aria-atomic": "true", children: heading })] }), _jsx("div", { className: style.views, role: "tablist", "aria-label": lab.viewSwitcher, children: availableViews.map((v, index) => (_jsx(Button, { id: tabId(v), type: "button", variant: "ghost", size: "small", role: "tab", "aria-selected": view === v, "aria-controls": panelId, tabIndex: view === v ? 0 : -1, className: style.viewBtn, "data-active": view === v || undefined, onClick: () => onView(v), onKeyDown: (event) => selectViewTab(event, index), children: lab.viewName(v) }, v))) })] }), _jsx("div", { id: panelId, role: "tabpanel", "aria-labelledby": tabId(view), children: loading ? (_jsx("div", { className: style.empty, role: "status", "aria-live": "polite", children: lab.loading })) : view === 'month' ? (_jsx(MonthGrid, { cursor: cursor, events: events, today: today, tz: timeZone, locale: locale, weekdays: weekdays, more: lab.more, eventLocalTime: lab.eventLocalTime, onSelect: onSelect, onDayOpen: (d) => { onCursor(startOfDay(d)); onView('day'); } })) : view === 'agenda' ? (_jsx(Agenda, { cursor: cursor, events: events, today: today, tz: timeZone, weekdays: weekdays, allDayLabel: lab.allDay, emptyLabel: lab.empty, eventLocalTime: lab.eventLocalTime, locale: locale, onSelect: onSelect })) : view === 'resource' ? (_jsx(ResourceGrid, { cursor: cursor, events: events, resources: resources !== null && resources !== void 0 ? resources : [], labels: lab, tz: timeZone, onSelect: onSelect })) : (_jsx(TimeGrid, { days: view === 'day' ? [cursor] : weekOf(cursor), events: events, tz: timeZone, weekdays: weekdays, locale: locale, labels: lab, onSelect: onSelect, onMove: onMove, onCreate: onCreate })) }), pop && _jsx(EventPopover, { event: pop.e, x: pop.x, y: pop.y, tz: timeZone, labels: lab, onClose: closePopover, onExpand: (e) => onOpen === null || onOpen === void 0 ? void 0 : onOpen(e), onCheckIn: onCheckIn, onReschedule: onMove, extra: renderPopoverExtra === null || renderPopoverExtra === void 0 ? void 0 : renderPopoverExtra(pop.e, closePopover) })] }));
|
|
124
|
+
};
|
|
125
|
+
registerPackageExport(Calendar);
|
|
126
|
+
// Month view — week-row spanning bars. A multi-day event renders as ONE continuous bar across exactly
|
|
127
|
+
// the days it covers (clamped per week); a single-day event is a one-column bar — so every item stays
|
|
128
|
+
// constrained to its day(s) and never bleeds into neighbours. Bars are lane-stacked per week; overflow
|
|
129
|
+
// past the lane cap becomes a per-day "+N more". Day-keys (YYYY-MM-DD, tz-resolved) drive placement.
|
|
130
|
+
const MONTH_LANE_CAP = 4;
|
|
131
|
+
const MonthGrid = ({ cursor, events, today, tz, locale, weekdays, more, eventLocalTime, onSelect, onDayOpen }) => {
|
|
132
|
+
const days = monthMatrix(cursor);
|
|
133
|
+
const weeks = Array.from({ length: 6 }, (_, w) => days.slice(w * 7, w * 7 + 7));
|
|
134
|
+
const todayKey = dayKeyTz(today, tz);
|
|
135
|
+
const startKeyOf = (e) => dayKeyTz(e.start, tz);
|
|
136
|
+
const endKeyOf = (e) => dayKeyTz(new Date(e.end.getTime() - 1), tz); // inclusive last day
|
|
137
|
+
return (_jsxs("div", { className: style.month, children: [_jsx("div", { className: style.dowRow, children: weekdays.map((w) => (_jsx("div", { className: style.dow, children: w }, w))) }), weeks.map((week, wi) => {
|
|
138
|
+
const keys = week.map(dayKeyLocal);
|
|
139
|
+
const wStart = keys[0];
|
|
140
|
+
const wEnd = keys[6];
|
|
141
|
+
// events intersecting this week → bar segments (clamped to the week), lane-stacked
|
|
142
|
+
const segs = events
|
|
143
|
+
.filter((e) => endKeyOf(e) >= wStart && startKeyOf(e) <= wEnd)
|
|
144
|
+
.map((e) => {
|
|
145
|
+
const sk = startKeyOf(e);
|
|
146
|
+
const ek = endKeyOf(e);
|
|
147
|
+
let s = sk < wStart ? 0 : keys.indexOf(sk);
|
|
148
|
+
let en = ek > wEnd ? 6 : keys.indexOf(ek);
|
|
149
|
+
if (s < 0)
|
|
150
|
+
s = 0;
|
|
151
|
+
if (en < 0)
|
|
152
|
+
en = 6;
|
|
153
|
+
if (en < s)
|
|
154
|
+
en = s;
|
|
155
|
+
return { e, s, en, span: en - s + 1 };
|
|
156
|
+
})
|
|
157
|
+
.sort((a, b) => a.s - b.s || b.span - a.span || a.e.start.getTime() - b.e.start.getTime());
|
|
158
|
+
const laneEnds = [];
|
|
159
|
+
const placed = segs.map((it) => {
|
|
160
|
+
let lane = laneEnds.findIndex((end) => it.s > end);
|
|
161
|
+
if (lane === -1) {
|
|
162
|
+
lane = laneEnds.length;
|
|
163
|
+
laneEnds.push(it.en);
|
|
164
|
+
}
|
|
165
|
+
else
|
|
166
|
+
laneEnds[lane] = it.en;
|
|
167
|
+
return { ...it, lane };
|
|
168
|
+
});
|
|
169
|
+
const visible = placed.filter((p) => p.lane < MONTH_LANE_CAP);
|
|
170
|
+
const hiddenPerDay = week.map((_, di) => placed.filter((p) => p.lane >= MONTH_LANE_CAP && p.s <= di && p.en >= di).length);
|
|
171
|
+
return (_jsxs("div", { className: style.mWeek, children: [week.map((d, di) => (_jsxs(Button, { type: "button", variant: "solid", className: style.mCell, "data-out": d.getMonth() !== cursor.getMonth() || undefined, "data-today": dayKeyLocal(d) === todayKey || undefined, "aria-label": d.toLocaleDateString(locale, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }), onClick: () => onDayOpen === null || onDayOpen === void 0 ? void 0 : onDayOpen(d), children: [_jsx("div", { className: style.mDate, children: d.getDate() }), hiddenPerDay[di] > 0 && _jsx("div", { className: style.mMore, children: more(hiddenPerDay[di]) })] }, d.toISOString()))), _jsx("div", { className: style.mBars, children: visible.map((p) => {
|
|
172
|
+
var _a, _b, _c;
|
|
173
|
+
const cross = isCrossTz(p.e.start, p.e.tz, tz);
|
|
174
|
+
const multi = p.span > 1 || p.e.allDay;
|
|
175
|
+
return (_jsxs(Button, { type: "button", variant: "solid", size: "small", className: style.mBar, "data-multi": multi || undefined, style: { left: `calc(${(p.s / 7) * 100}% + 3px)`, width: `calc(${(p.span / 7) * 100}% - 6px)`, top: `calc(var(--m-date-h) + ${p.lane} * (var(--m-bar-h) + 2px))`, ['--c']: (_a = p.e.color) !== null && _a !== void 0 ? _a : 'var(--control-accent)', ['--a']: (_c = (_b = p.e.accent) !== null && _b !== void 0 ? _b : p.e.color) !== null && _c !== void 0 ? _c : 'var(--control-accent)' }, onClick: (ev) => { ev.stopPropagation(); onSelect === null || onSelect === void 0 ? void 0 : onSelect(p.e, ev.clientX, ev.clientY, ev.currentTarget); }, title: cross ? `${p.e.title} — ${eventLocalTime(formatTimeZone(p.e.start, p.e.tz))}` : p.e.title, children: [_jsx("span", { className: style.mDot }), _jsx("span", { className: style.mBarText, children: multi ? p.e.title : `${formatTime(p.e.start, tz)} ${p.e.title}` }), p.e.alert && _jsx("span", { className: style.alertDot, "data-tone": p.e.alert.tone, title: p.e.alert.label, role: "img", "aria-label": p.e.alert.label })] }, p.e.id));
|
|
176
|
+
}) })] }, wi));
|
|
177
|
+
})] }));
|
|
178
|
+
};
|
|
179
|
+
const Agenda = ({ cursor, events, today, tz, weekdays, allDayLabel, emptyLabel, eventLocalTime, locale, onSelect }) => {
|
|
180
|
+
const inMonth = events.filter((e) => {
|
|
181
|
+
const k = dayKeyTz(e.start, tz);
|
|
182
|
+
return k >= dayKey(cursor.getFullYear(), cursor.getMonth() + 1, 1) && k <= dayKey(cursor.getFullYear(), cursor.getMonth() + 1, 31);
|
|
183
|
+
}).sort((a, b) => a.start.getTime() - b.start.getTime());
|
|
184
|
+
const groups = [];
|
|
185
|
+
for (const e of inMonth) {
|
|
186
|
+
const k = dayKeyTz(e.start, tz);
|
|
187
|
+
const last = groups[groups.length - 1];
|
|
188
|
+
if (last && last.key === k)
|
|
189
|
+
last.items.push(e);
|
|
190
|
+
else
|
|
191
|
+
groups.push({ key: k, label: startOfDay(e.start), items: [e] });
|
|
192
|
+
}
|
|
193
|
+
if (!groups.length)
|
|
194
|
+
return _jsx("div", { className: style.empty, role: "status", children: emptyLabel });
|
|
195
|
+
const todayKey = dayKeyTz(today, tz);
|
|
196
|
+
return (_jsx("div", { className: style.agenda, children: groups.map((g) => (_jsxs("div", { className: style.agDay, children: [_jsxs("div", { className: style.agDate, "data-today": g.key === todayKey || undefined, children: [_jsx("div", { className: style.agDow, children: weekdays[g.label.getDay()] }), _jsx("div", { className: style.agNum, children: g.label.getDate() })] }), _jsx("div", { className: style.agItems, children: g.items.map((e) => {
|
|
197
|
+
var _a, _b, _c;
|
|
198
|
+
const cross = isCrossTz(e.start, e.tz, tz);
|
|
199
|
+
return (_jsxs(Button, { type: "button", variant: "solid", className: style.agItem, style: { ['--c']: (_a = e.color) !== null && _a !== void 0 ? _a : 'var(--control-accent)' }, onClick: (ev) => onSelect === null || onSelect === void 0 ? void 0 : onSelect(e, ev.clientX, ev.clientY, ev.currentTarget), children: [_jsx("span", { className: style.agBar, style: { background: (_c = (_b = e.accent) !== null && _b !== void 0 ? _b : e.color) !== null && _c !== void 0 ? _c : 'var(--control-accent)' } }), _jsxs("span", { className: style.agTime, children: [e.allDay ? allDayLabel : formatTime(e.start, tz), cross && _jsx("span", { className: style.agCross, children: eventLocalTime(formatTimeZone(e.start, e.tz)) })] }), _jsx("span", { className: style.agTitle, children: e.title }), e.alert && _jsx("span", { className: style.alertDot, "data-tone": e.alert.tone, title: e.alert.label, role: "img", "aria-label": e.alert.label }), e.location && _jsx("span", { className: style.agLoc, children: e.location })] }, e.id));
|
|
200
|
+
}) })] }, g.key))) }));
|
|
201
|
+
};
|
|
202
|
+
//# sourceMappingURL=Calendar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Calendar.js","sourceRoot":"","sources":["../../src/Calendar.tsx"],"names":[],"mappings":"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"}
|