@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.
Files changed (117) hide show
  1. package/dist/browser/content/Calendar.js +1122 -1065
  2. package/dist/browser/content/Calendar.js.map +1 -1
  3. package/dist/browser/content/CalendarDayView.js +1187 -0
  4. package/dist/browser/content/CalendarDayView.js.map +1 -0
  5. package/dist/browser/content/CalendarWeekView.js +1593 -0
  6. package/dist/browser/content/CalendarWeekView.js.map +1 -0
  7. package/dist/browser/content/ChartExplorer.js +174 -82
  8. package/dist/browser/content/ChartExplorer.js.map +1 -1
  9. package/dist/browser/content/ChartFilterControls.js +90 -33
  10. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  11. package/dist/browser/content/DataTable.js +235 -197
  12. package/dist/browser/content/DataTable.js.map +1 -1
  13. package/dist/browser/content/calendar-day-scroll.js +111 -0
  14. package/dist/browser/content/calendar-day-scroll.js.map +1 -0
  15. package/dist/browser/content/calendar-days.js +408 -0
  16. package/dist/browser/content/calendar-days.js.map +1 -0
  17. package/dist/browser/content/calendar-dialogs.js +236 -0
  18. package/dist/browser/content/calendar-dialogs.js.map +1 -0
  19. package/dist/browser/content/calendar-messages.js +210 -2
  20. package/dist/browser/content/calendar-messages.js.map +1 -1
  21. package/dist/browser/content/calendar-pointer.js +15 -3
  22. package/dist/browser/content/calendar-pointer.js.map +1 -1
  23. package/dist/browser/content/calendar-shared.js +328 -0
  24. package/dist/browser/content/calendar-shared.js.map +1 -0
  25. package/dist/browser/content/calendar-time-view.js +1654 -0
  26. package/dist/browser/content/calendar-time-view.js.map +1 -0
  27. package/dist/browser/content/chart-messages.js +10 -0
  28. package/dist/browser/content/chart-messages.js.map +1 -1
  29. package/dist/browser/content/index.js.map +1 -1
  30. package/dist/browser/inputs/Combobox.js +0 -1
  31. package/dist/browser/inputs/Combobox.js.map +1 -1
  32. package/dist/browser/layout/AppWorkspace.js +125 -97
  33. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  34. package/dist/browser/layout/Navigation.js +18 -3
  35. package/dist/browser/layout/Navigation.js.map +1 -1
  36. package/dist/browser/layout/PageTitle.js +18 -1
  37. package/dist/browser/layout/PageTitle.js.map +1 -1
  38. package/dist/browser/layout/SidebarSwitcher.js +505 -0
  39. package/dist/browser/layout/SidebarSwitcher.js.map +1 -0
  40. package/dist/browser/layout/app-workspace-controller.js +174 -86
  41. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  42. package/dist/browser/layout/index.js +1 -0
  43. package/dist/browser/layout/index.js.map +1 -1
  44. package/dist/browser/layout/navigation-model.js +1 -0
  45. package/dist/browser/layout/navigation-model.js.map +1 -1
  46. package/dist/browser/surfaces/StatCell.js +18 -6
  47. package/dist/browser/surfaces/StatCell.js.map +1 -1
  48. package/dist/ssr/content/Calendar.js +553 -341
  49. package/dist/ssr/content/Calendar.js.map +1 -1
  50. package/dist/ssr/content/CalendarDayView.js +800 -0
  51. package/dist/ssr/content/CalendarDayView.js.map +1 -0
  52. package/dist/ssr/content/CalendarWeekView.js +1090 -0
  53. package/dist/ssr/content/CalendarWeekView.js.map +1 -0
  54. package/dist/ssr/content/ChartExplorer.js +93 -34
  55. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  56. package/dist/ssr/content/ChartFilterControls.js +49 -7
  57. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  58. package/dist/ssr/content/DataTable.js +88 -66
  59. package/dist/ssr/content/DataTable.js.map +1 -1
  60. package/dist/ssr/content/calendar-day-scroll.js +111 -0
  61. package/dist/ssr/content/calendar-day-scroll.js.map +1 -0
  62. package/dist/ssr/content/calendar-days.js +408 -0
  63. package/dist/ssr/content/calendar-days.js.map +1 -0
  64. package/dist/ssr/content/calendar-dialogs.js +159 -0
  65. package/dist/ssr/content/calendar-dialogs.js.map +1 -0
  66. package/dist/ssr/content/calendar-messages.js +210 -2
  67. package/dist/ssr/content/calendar-messages.js.map +1 -1
  68. package/dist/ssr/content/calendar-pointer.js +15 -3
  69. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  70. package/dist/ssr/content/calendar-shared.js +261 -0
  71. package/dist/ssr/content/calendar-shared.js.map +1 -0
  72. package/dist/ssr/content/calendar-time-view.js +1311 -0
  73. package/dist/ssr/content/calendar-time-view.js.map +1 -0
  74. package/dist/ssr/content/chart-messages.js +10 -0
  75. package/dist/ssr/content/chart-messages.js.map +1 -1
  76. package/dist/ssr/content/index.js.map +1 -1
  77. package/dist/ssr/inputs/Combobox.js.map +1 -1
  78. package/dist/ssr/layout/AppWorkspace.js +40 -29
  79. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  80. package/dist/ssr/layout/Navigation.js +12 -2
  81. package/dist/ssr/layout/Navigation.js.map +1 -1
  82. package/dist/ssr/layout/PageTitle.js +18 -1
  83. package/dist/ssr/layout/PageTitle.js.map +1 -1
  84. package/dist/ssr/layout/SidebarSwitcher.js +271 -0
  85. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -0
  86. package/dist/ssr/layout/app-workspace-controller.js +174 -86
  87. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  88. package/dist/ssr/layout/index.js +1 -0
  89. package/dist/ssr/layout/index.js.map +1 -1
  90. package/dist/ssr/layout/navigation-model.js +1 -0
  91. package/dist/ssr/layout/navigation-model.js.map +1 -1
  92. package/dist/ssr/surfaces/StatCell.js +2 -2
  93. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  94. package/dist/styles.css +1 -1
  95. package/dist/types/content/Calendar.d.ts +95 -1
  96. package/dist/types/content/CalendarDayView.d.ts +7 -0
  97. package/dist/types/content/CalendarWeekView.d.ts +7 -0
  98. package/dist/types/content/ChartExplorer.d.ts +36 -1
  99. package/dist/types/content/ChartFilterControls.d.ts +6 -1
  100. package/dist/types/content/DataTable.d.ts +14 -0
  101. package/dist/types/content/calendar-day-scroll.d.ts +47 -0
  102. package/dist/types/content/calendar-days.d.ts +192 -0
  103. package/dist/types/content/calendar-dialogs.d.ts +22 -0
  104. package/dist/types/content/calendar-messages.d.ts +99 -0
  105. package/dist/types/content/calendar-pointer.d.ts +9 -0
  106. package/dist/types/content/calendar-shared.d.ts +69 -0
  107. package/dist/types/content/calendar-time-view.d.ts +252 -0
  108. package/dist/types/content/chart-messages.d.ts +5 -0
  109. package/dist/types/content/index.d.ts +2 -2
  110. package/dist/types/layout/AppWorkspace.d.ts +27 -3
  111. package/dist/types/layout/PageTitle.d.ts +2 -1
  112. package/dist/types/layout/SidebarSwitcher.d.ts +65 -0
  113. package/dist/types/layout/app-workspace-controller.d.ts +9 -1
  114. package/dist/types/layout/index.d.ts +1 -0
  115. package/dist/types/layout/navigation-model.d.ts +4 -0
  116. package/dist/types/surfaces/StatCell.d.ts +5 -0
  117. package/package.json +3 -3
@@ -0,0 +1,261 @@
1
+ import { ssrElement as _$ssrElement } from "solid-js/web";
2
+ import { mergeProps as _$mergeProps } from "solid-js/web";
3
+ import { memo as _$memo } from "solid-js/web";
4
+ import { createComponent as _$createComponent } from "solid-js/web";
5
+ import { ssr as _$ssr } from "solid-js/web";
6
+ import { escape as _$escape } from "solid-js/web";
7
+ var _tmpl$ = ["<span class=\"k2b-calendar-event__time\">", "</span>"],
8
+ _tmpl$2 = "<span class=\"k2b-calendar-event__marker\" aria-hidden=\"true\"></span>",
9
+ _tmpl$3 = ["<span class=\"k2b-calendar-event__title\">", "", "</span>"],
10
+ _tmpl$4 = ["<span class=\"k2b-calendar-event__remaining\">", "</span>"],
11
+ _tmpl$5 = ["<span class=\"k2b-calendar-event__meta\">", "", "</span>"],
12
+ _tmpl$6 = ["<span class=\"k2b-calendar-event__meta\">", "</span>"],
13
+ _tmpl$7 = ["<span class=\"k2b-calendar-event__description\">", "</span>"],
14
+ _tmpl$8 = ["<span class=\"k2b-calendar-event__hint\" data-edge=\"start\" aria-hidden=\"true\">", "</span>"],
15
+ _tmpl$9 = ["<span class=\"k2b-calendar-event__hint\" data-edge=\"end\" aria-hidden=\"true\">", "</span>"];
16
+ import { dates as calendar } from "@k2b/stdlib";
17
+ import { createMemo, Show } from "solid-js";
18
+ import { useCalendarMessages } from "./calendar-messages";
19
+
20
+ /** One piece of an event in one day, with the times of the whole event. */
21
+
22
+ /** A keyboard stop of the week grid. */
23
+
24
+ /** What the built-in views read from the props: they only ever link to built-in views. */
25
+
26
+ export const ownerDateConfig = owner => ({
27
+ ...owner.dateConfig,
28
+ timeZone: owner.timeZone ?? owner.dateConfig?.timeZone,
29
+ firstDayOfWeek: owner.firstDayOfWeek ?? owner.dateConfig?.firstDayOfWeek ?? owner.dateConfig?.weekStartsOn ?? 1
30
+ });
31
+ const dateOnlyPattern = /^\d{4}-\d{2}-\d{2}$/;
32
+ export const parseDate = (value, context) => {
33
+ if (value instanceof Date) return new Date(value);
34
+ if (dateOnlyPattern.test(value)) return calendar.parseCalendarDate(value, context);
35
+ const normalized = value.includes("T") ? value : value.replace(" ", "T");
36
+ const parsed = new Date(normalized);
37
+ if (!Number.isNaN(parsed.getTime())) return parsed;
38
+ const [year, month = "1", day = "1"] = value.split("-");
39
+ return new Date(Number(year), Number(month) - 1, Number(day), 12);
40
+ };
41
+ export const validDate = value => !Number.isNaN(value.getTime());
42
+ export const formatTime = (date, context) => calendar.formatTime(date, context);
43
+ export const eventHref = (props, event) => props.getEventHref?.(event) ?? event.href;
44
+
45
+ /** Places a calendar popover below its anchor when there is room and above it otherwise, inside the viewport. */
46
+ export const placeCalendarPopover = (anchor, popover) => {
47
+ const margin = 8;
48
+ const gap = 4;
49
+ const rect = anchor instanceof Element ? anchor.getBoundingClientRect() : anchor;
50
+ const width = Math.min(popover.offsetWidth || 288, window.innerWidth - margin * 2);
51
+ const height = popover.offsetHeight;
52
+ const left = Math.max(margin, Math.min(rect.left, window.innerWidth - width - margin));
53
+ const roomBelow = window.innerHeight - rect.bottom - gap - margin;
54
+ const above = height > roomBelow && rect.top - gap - margin > roomBelow;
55
+ const top = above ? Math.max(margin, rect.top - height - gap) : Math.min(rect.bottom + gap, window.innerHeight - height - margin);
56
+ popover.style.left = `${left}px`;
57
+ popover.style.top = `${Math.max(margin, top)}px`;
58
+ };
59
+
60
+ /** Follows a calendar link the way the calendar's own links do: through the host's navigation when it has one. */
61
+ export const followCalendarHref = (owner, href) => {
62
+ if (owner.onNavigateHref) owner.onNavigateHref(href);else window.location.assign(href);
63
+ };
64
+ export const EventChip = props => {
65
+ const messages = useCalendarMessages();
66
+ const dateConfig = createMemo(() => ownerDateConfig(props.owner));
67
+ const color = () => props.event.color ?? "blue";
68
+ const selected = () => Boolean(props.owner.selectedEventId) && props.owner.selectedEventId === props.event.id;
69
+ const style = () => props.event.colorHex ? {
70
+ "--k2b-calendar-accent": props.event.colorHex
71
+ } : undefined;
72
+ const isInteractive = () => Boolean(props.owner.onEventActivate);
73
+ const durationHours = () => (props.event.endDate.getTime() - props.event.startDate.getTime()) / 3_600_000;
74
+ const short = () => Boolean(props.fill && !props.event.allDay && durationHours() < 0.75);
75
+ const showTime = () => props.timeLabel ? !props.event.allDay : !props.event.allDay && !props.compact && durationHours() >= 0.75;
76
+ const showLocation = () => Boolean(props.event.location && (props.showLocation ?? (!props.compact && !props.timeLabel && durationHours() >= 1.25)));
77
+ const showDescription = () => Boolean(props.event.description?.trim() && props.fill && !props.timeLabel && !props.event.allDay && !props.compact && durationHours() >= 1.5);
78
+ const timeLabel = () => props.timeLabel ?? `${formatTime(props.event.startDate, dateConfig())} - ${formatTime(props.event.endDate, dateConfig())}`;
79
+ const ariaLabel = () => {
80
+ const label = props.label ? props.label : props.event.allDay ? props.event.title : props.event.endDate.getTime() <= props.event.startDate.getTime() ?
81
+ // A deadline is a moment, not a span: it names one time.
82
+ `${props.event.title}, ${formatTime(props.event.startDate, dateConfig())}` : messages().calendarEventTime({
83
+ title: props.event.title,
84
+ start: formatTime(props.event.startDate, dateConfig()),
85
+ end: formatTime(props.event.endDate, dateConfig())
86
+ });
87
+ return [label, props.remaining, props.event.accessibleDetail].filter(Boolean).join(", ");
88
+ };
89
+ const renderedEvent = () => props.owner.renderEvent?.(props.event, {
90
+ compact: props.compact ?? false,
91
+ fill: props.fill ?? false,
92
+ start: props.event.startDate,
93
+ end: props.event.endDate,
94
+ allDay: props.event.allDay ?? false,
95
+ durationHours: durationHours(),
96
+ timeLabel: timeLabel(),
97
+ leadingTime: props.leadingTime,
98
+ remaining: props.remaining,
99
+ checkbox: props.checkbox ?? false,
100
+ timeline: props.timeline ?? false
101
+ });
102
+ const defaultContent = [_$createComponent(Show, {
103
+ get when() {
104
+ return props.leadingTime;
105
+ },
106
+ get children() {
107
+ return _$ssr(_tmpl$, _$escape(props.leadingTime));
108
+ }
109
+ }), _$ssr(_tmpl$3, _$escape(_$createComponent(Show, {
110
+ get when() {
111
+ return _$memo(() => props.event.display === "marker")() && !props.checkbox;
112
+ },
113
+ get children() {
114
+ return _$ssr(_tmpl$2);
115
+ }
116
+ })), _$escape(props.event.title)), _$createComponent(Show, {
117
+ get when() {
118
+ return showTime() || props.remaining;
119
+ },
120
+ get children() {
121
+ return _$ssr(_tmpl$5, _$escape(_$createComponent(Show, {
122
+ get when() {
123
+ return showTime();
124
+ },
125
+ get children() {
126
+ return timeLabel();
127
+ }
128
+ })), _$escape(_$createComponent(Show, {
129
+ get when() {
130
+ return props.remaining;
131
+ },
132
+ get children() {
133
+ return _$ssr(_tmpl$4, showTime() ? ` · ${_$escape(props.remaining)}` : _$escape(props.remaining));
134
+ }
135
+ })));
136
+ }
137
+ }), _$createComponent(Show, {
138
+ get when() {
139
+ return showLocation();
140
+ },
141
+ get children() {
142
+ return _$ssr(_tmpl$6, _$escape(props.event.location));
143
+ }
144
+ }), _$createComponent(Show, {
145
+ get when() {
146
+ return showDescription();
147
+ },
148
+ get children() {
149
+ return _$ssr(_tmpl$7, _$escape(props.event.description));
150
+ }
151
+ })];
152
+ const content = () => [_$createComponent(Show, {
153
+ get when() {
154
+ return props.hintStart;
155
+ },
156
+ get children() {
157
+ return _$ssr(_tmpl$8, _$escape(props.hintStart));
158
+ }
159
+ }), renderedEvent() ?? defaultContent, _$createComponent(Show, {
160
+ get when() {
161
+ return props.hintEnd;
162
+ },
163
+ get children() {
164
+ return _$ssr(_tmpl$9, _$escape(props.hintEnd));
165
+ }
166
+ }), props.trailing];
167
+ const isActionable = () => isInteractive() || Boolean(props.onMovePointerDown);
168
+ let suppressClickUntil = 0;
169
+ const onClick = event => {
170
+ if (performance.now() < suppressClickUntil) {
171
+ event.preventDefault();
172
+ event.stopPropagation();
173
+ return;
174
+ }
175
+ if (!props.owner.onEventActivate || props.owner.eventActivation === "double") return;
176
+ event.preventDefault();
177
+ event.stopPropagation();
178
+ props.owner.onEventActivate(props.event);
179
+ };
180
+ const onDoubleClick = event => {
181
+ if (!props.owner.onEventActivate || props.owner.eventActivation !== "double") return;
182
+ event.preventDefault();
183
+ event.stopPropagation();
184
+ props.owner.onEventActivate(props.event);
185
+ };
186
+ /** Space on an entry with a box checks it; Enter still opens the entry. */
187
+ const onCheckKeyDown = event => {
188
+ if (event.key !== " " || !props.onCheck || event.altKey || event.ctrlKey || event.metaKey) return false;
189
+ event.preventDefault();
190
+ props.onCheck();
191
+ return true;
192
+ };
193
+ const onButtonKeyDown = event => {
194
+ if (onCheckKeyDown(event) || !isInteractive() || event.key !== "Enter" && event.key !== " ") return;
195
+ event.preventDefault();
196
+ props.owner.onEventActivate?.(props.event);
197
+ };
198
+ const onPointerDown = event => {
199
+ if (event.pointerType === "touch") return;
200
+ if (props.onMovePointerDown) event.stopPropagation();
201
+ props.onMovePointerDown?.(event, () => {
202
+ suppressClickUntil = performance.now() + 400;
203
+ });
204
+ };
205
+ const attributes = () => ({
206
+ class: "k2b-calendar-event",
207
+ "data-calendar-event": "",
208
+ "data-color": props.event.colorHex ? undefined : color(),
209
+ "data-selected": selected() ? "true" : undefined,
210
+ "data-compact": props.compact ? "true" : undefined,
211
+ "data-fill": props.fill ? "true" : undefined,
212
+ "data-short": short() ? "true" : undefined,
213
+ "data-moving": props.moving ? "true" : undefined,
214
+ "data-continues-before": props.continuesBefore ? "true" : undefined,
215
+ "data-continues-after": props.continuesAfter ? "true" : undefined,
216
+ "data-bar": props.bar ? "true" : undefined,
217
+ "data-display": props.event.display,
218
+ "data-stop": props.stop?.id,
219
+ "data-col": props.stop?.column,
220
+ "data-minute": props.stop?.minute,
221
+ style: style(),
222
+ "aria-label": ariaLabel()
223
+ });
224
+ return props.href ? _$ssrElement("a", _$mergeProps(attributes, {
225
+ get href() {
226
+ return props.href;
227
+ },
228
+ get ["data-interactive"]() {
229
+ return isInteractive() ? "true" : undefined;
230
+ },
231
+ get ["data-space-item-id"]() {
232
+ return props.event.dataSpaceItemId;
233
+ },
234
+ get tabIndex() {
235
+ return props.tabIndex;
236
+ },
237
+ get draggable() {
238
+ return props.onMovePointerDown ? false : undefined;
239
+ }
240
+ }), _$escape(content()), false) : isActionable() ? _$ssrElement("button", _$mergeProps(attributes, {
241
+ type: "button",
242
+ "data-interactive": "true",
243
+ get tabIndex() {
244
+ return props.tabIndex;
245
+ }
246
+ }), _$escape(content()), false) : _$ssrElement("div", _$mergeProps(attributes, {
247
+ role: "group",
248
+ get tabIndex() {
249
+ return props.tabIndex;
250
+ }
251
+ }), _$escape(content()), false);
252
+ };
253
+ let measureContext;
254
+ /** The width of a text in a font, from a canvas, so a bar can tell whether its title leaves room for a date hint. */
255
+ export const textWidth = (text, font) => {
256
+ measureContext ??= typeof document === "undefined" ? null : document.createElement("canvas").getContext("2d");
257
+ if (!measureContext) return Number.POSITIVE_INFINITY;
258
+ measureContext.font = font;
259
+ return measureContext.measureText(text).width;
260
+ };
261
+ //# sourceMappingURL=calendar-shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/calendar-shared.tsx"],"sourcesContent":["import { dates as calendar, type DateContext } from \"@k2b/stdlib\";\nimport type { JSX } from \"solid-js\";\nimport { createMemo, Show } from \"solid-js\";\nimport type { CalendarEvent, CalendarProps } from \"./Calendar\";\nimport { useCalendarMessages } from \"./calendar-messages\";\n\n/** One piece of an event in one day, with the times of the whole event. */\nexport type NormalizedEvent = CalendarEvent & {\n startDate: Date;\n endDate: Date;\n dayKey: string;\n sourceStartDate: Date;\n sourceEndDate: Date;\n};\n\n/** A keyboard stop of the week grid. */\nexport type CalendarStop = { id: string; column: number; minute: number };\n\n/** What the built-in views read from the props: they only ever link to built-in views. */\nexport type CalendarOwner = Omit<CalendarProps, \"view\" | \"customViews\" | \"children\">;\n\nexport const ownerDateConfig = (owner: CalendarOwner): DateContext => ({\n ...owner.dateConfig,\n timeZone: owner.timeZone ?? owner.dateConfig?.timeZone,\n firstDayOfWeek: owner.firstDayOfWeek ?? owner.dateConfig?.firstDayOfWeek ?? owner.dateConfig?.weekStartsOn ?? 1,\n});\n\nconst dateOnlyPattern = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport const parseDate = (value: Date | string, context?: DateContext): Date => {\n if (value instanceof Date) return new Date(value);\n if (dateOnlyPattern.test(value)) return calendar.parseCalendarDate(value, context);\n const normalized = value.includes(\"T\") ? value : value.replace(\" \", \"T\");\n const parsed = new Date(normalized);\n if (!Number.isNaN(parsed.getTime())) return parsed;\n const [year, month = \"1\", day = \"1\"] = value.split(\"-\");\n return new Date(Number(year), Number(month) - 1, Number(day), 12);\n};\n\nexport const validDate = (value: Date): boolean => !Number.isNaN(value.getTime());\n\nexport const formatTime = (date: Date, context?: DateContext): string => calendar.formatTime(date, context);\n\nexport const eventHref = (props: CalendarOwner, event: CalendarEvent): string | undefined => props.getEventHref?.(event) ?? event.href;\n\n/** Places a calendar popover below its anchor when there is room and above it otherwise, inside the viewport. */\nexport const placeCalendarPopover = (anchor: Element | DOMRect, popover: HTMLElement): void => {\n const margin = 8;\n const gap = 4;\n const rect = anchor instanceof Element ? anchor.getBoundingClientRect() : anchor;\n const width = Math.min(popover.offsetWidth || 288, window.innerWidth - margin * 2);\n const height = popover.offsetHeight;\n const left = Math.max(margin, Math.min(rect.left, window.innerWidth - width - margin));\n const roomBelow = window.innerHeight - rect.bottom - gap - margin;\n const above = height > roomBelow && rect.top - gap - margin > roomBelow;\n const top = above ? Math.max(margin, rect.top - height - gap) : Math.min(rect.bottom + gap, window.innerHeight - height - margin);\n popover.style.left = `${left}px`;\n popover.style.top = `${Math.max(margin, top)}px`;\n};\n\n/** Follows a calendar link the way the calendar's own links do: through the host's navigation when it has one. */\nexport const followCalendarHref = (owner: CalendarOwner, href: string): void => {\n if (owner.onNavigateHref) owner.onNavigateHref(href);\n else window.location.assign(href);\n};\n\nexport const EventChip = (props: {\n event: NormalizedEvent;\n owner: CalendarOwner;\n href?: string;\n compact?: boolean;\n fill?: boolean;\n moving?: boolean;\n /** Replaces the title and time at the start of the accessible name, for example with the dates a long event spans. */\n label?: string;\n /** A bar of a long event that goes on before or after the week row it sits in. */\n continuesBefore?: boolean;\n continuesAfter?: boolean;\n /** Month view: an all-day or multi-day entry drawn as a bar. */\n bar?: boolean;\n /** Short dates at the torn ends of a bar, where it continues in another week row. */\n hintStart?: string;\n hintEnd?: string;\n /** Month view: the start time before the title. */\n leadingTime?: string;\n /** Day and week views: what is left of a running event, such as \"27 min left\". */\n remaining?: string;\n /** Day and week views: the calendar draws the event's checkbox beside the chip. */\n checkbox?: boolean;\n /** Day and week views with `dayHours`: the chip is a band, a deadline, or an all-day entry of a timeline. */\n timeline?: boolean;\n /** Text after the content, such as the time of a deadline. */\n trailing?: JSX.Element;\n /** Day and week views: the time as they write it, such as \"10:30–11:15\", shown whatever the length. */\n timeLabel?: string;\n /** Day view: a band tall enough shows its place below the time. */\n showLocation?: boolean;\n /** Week view: the grid's one tab stop decides which chip takes Tab. */\n tabIndex?: number;\n /** A keyboard stop of the week grid: its id, its day column, and its minute for moving between columns. */\n stop?: CalendarStop;\n /** Day and week views: Space on the chip checks the box the calendar draws beside it, as on the box itself. */\n onCheck?: () => void;\n onMovePointerDown?: (event: PointerEvent, onActivate: () => void) => void;\n}): JSX.Element => {\n const messages = useCalendarMessages();\n const dateConfig = createMemo(() => ownerDateConfig(props.owner));\n const color = () => props.event.color ?? \"blue\";\n const selected = () => Boolean(props.owner.selectedEventId) && props.owner.selectedEventId === props.event.id;\n const style = () => (props.event.colorHex ? { \"--k2b-calendar-accent\": props.event.colorHex } : undefined);\n const isInteractive = () => Boolean(props.owner.onEventActivate);\n const durationHours = () => (props.event.endDate.getTime() - props.event.startDate.getTime()) / 3_600_000;\n const short = () => Boolean(props.fill && !props.event.allDay && durationHours() < 0.75);\n const showTime = () => (props.timeLabel ? !props.event.allDay : !props.event.allDay && !props.compact && durationHours() >= 0.75);\n const showLocation = () =>\n Boolean(props.event.location && (props.showLocation ?? (!props.compact && !props.timeLabel && durationHours() >= 1.25)));\n const showDescription = () =>\n Boolean(\n props.event.description?.trim() && props.fill && !props.timeLabel && !props.event.allDay && !props.compact && durationHours() >= 1.5,\n );\n const timeLabel = () =>\n props.timeLabel ?? `${formatTime(props.event.startDate, dateConfig())} - ${formatTime(props.event.endDate, dateConfig())}`;\n const ariaLabel = () => {\n const label = props.label\n ? props.label\n : props.event.allDay\n ? props.event.title\n : props.event.endDate.getTime() <= props.event.startDate.getTime()\n ? // A deadline is a moment, not a span: it names one time.\n `${props.event.title}, ${formatTime(props.event.startDate, dateConfig())}`\n : messages().calendarEventTime({\n title: props.event.title,\n start: formatTime(props.event.startDate, dateConfig()),\n end: formatTime(props.event.endDate, dateConfig()),\n });\n return [label, props.remaining, props.event.accessibleDetail].filter(Boolean).join(\", \");\n };\n const renderedEvent = () =>\n props.owner.renderEvent?.(props.event, {\n compact: props.compact ?? false,\n fill: props.fill ?? false,\n start: props.event.startDate,\n end: props.event.endDate,\n allDay: props.event.allDay ?? false,\n durationHours: durationHours(),\n timeLabel: timeLabel(),\n leadingTime: props.leadingTime,\n remaining: props.remaining,\n checkbox: props.checkbox ?? false,\n timeline: props.timeline ?? false,\n });\n const defaultContent = (\n <>\n <Show when={props.leadingTime}>\n <span class=\"k2b-calendar-event__time\">{props.leadingTime}</span>\n </Show>\n <span class=\"k2b-calendar-event__title\">\n <Show when={props.event.display === \"marker\" && !props.checkbox}>\n <span class=\"k2b-calendar-event__marker\" aria-hidden=\"true\" />\n </Show>\n {props.event.title}\n </span>\n <Show when={showTime() || props.remaining}>\n <span class=\"k2b-calendar-event__meta\">\n <Show when={showTime()}>{timeLabel()}</Show>\n <Show when={props.remaining}>\n <span class=\"k2b-calendar-event__remaining\">{showTime() ? ` · ${props.remaining}` : props.remaining}</span>\n </Show>\n </span>\n </Show>\n <Show when={showLocation()}>\n <span class=\"k2b-calendar-event__meta\">{props.event.location}</span>\n </Show>\n <Show when={showDescription()}>\n <span class=\"k2b-calendar-event__description\">{props.event.description}</span>\n </Show>\n </>\n );\n const content = () => (\n <>\n <Show when={props.hintStart}>\n <span class=\"k2b-calendar-event__hint\" data-edge=\"start\" aria-hidden=\"true\">\n {props.hintStart}\n </span>\n </Show>\n {renderedEvent() ?? defaultContent}\n <Show when={props.hintEnd}>\n <span class=\"k2b-calendar-event__hint\" data-edge=\"end\" aria-hidden=\"true\">\n {props.hintEnd}\n </span>\n </Show>\n {props.trailing}\n </>\n );\n const isActionable = () => isInteractive() || Boolean(props.onMovePointerDown);\n let suppressClickUntil = 0;\n const onClick = (event: MouseEvent) => {\n if (performance.now() < suppressClickUntil) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n if (!props.owner.onEventActivate || props.owner.eventActivation === \"double\") return;\n event.preventDefault();\n event.stopPropagation();\n props.owner.onEventActivate(props.event);\n };\n const onDoubleClick = (event: MouseEvent) => {\n if (!props.owner.onEventActivate || props.owner.eventActivation !== \"double\") return;\n event.preventDefault();\n event.stopPropagation();\n props.owner.onEventActivate(props.event);\n };\n /** Space on an entry with a box checks it; Enter still opens the entry. */\n const onCheckKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \" \" || !props.onCheck || event.altKey || event.ctrlKey || event.metaKey) return false;\n event.preventDefault();\n props.onCheck();\n return true;\n };\n const onButtonKeyDown = (event: KeyboardEvent) => {\n if (onCheckKeyDown(event) || !isInteractive() || (event.key !== \"Enter\" && event.key !== \" \")) return;\n event.preventDefault();\n props.owner.onEventActivate?.(props.event);\n };\n const onPointerDown = (event: PointerEvent) => {\n if (event.pointerType === \"touch\") return;\n if (props.onMovePointerDown) event.stopPropagation();\n props.onMovePointerDown?.(event, () => {\n suppressClickUntil = performance.now() + 400;\n });\n };\n const attributes = () => ({\n class: \"k2b-calendar-event\",\n \"data-calendar-event\": \"\",\n \"data-color\": props.event.colorHex ? undefined : color(),\n \"data-selected\": selected() ? \"true\" : undefined,\n \"data-compact\": props.compact ? \"true\" : undefined,\n \"data-fill\": props.fill ? \"true\" : undefined,\n \"data-short\": short() ? \"true\" : undefined,\n \"data-moving\": props.moving ? \"true\" : undefined,\n \"data-continues-before\": props.continuesBefore ? \"true\" : undefined,\n \"data-continues-after\": props.continuesAfter ? \"true\" : undefined,\n \"data-bar\": props.bar ? \"true\" : undefined,\n \"data-display\": props.event.display,\n \"data-stop\": props.stop?.id,\n \"data-col\": props.stop?.column,\n \"data-minute\": props.stop?.minute,\n style: style(),\n \"aria-label\": ariaLabel(),\n });\n\n return props.href ? (\n <a\n {...attributes()}\n href={props.href}\n data-interactive={isInteractive() ? \"true\" : undefined}\n data-space-item-id={props.event.dataSpaceItemId}\n tabIndex={props.tabIndex}\n draggable={props.onMovePointerDown ? false : undefined}\n onClick={onClick}\n onDblClick={onDoubleClick}\n onDragStart={props.onMovePointerDown ? (event) => event.preventDefault() : undefined}\n onPointerDown={onPointerDown}\n onKeyDown={onCheckKeyDown}\n >\n {content()}\n </a>\n ) : isActionable() ? (\n <button\n {...attributes()}\n type=\"button\"\n data-interactive=\"true\"\n tabIndex={props.tabIndex}\n onClick={onClick}\n onDblClick={onDoubleClick}\n onPointerDown={onPointerDown}\n onKeyDown={onButtonKeyDown}\n >\n {content()}\n </button>\n ) : (\n <div {...attributes()} role=\"group\" tabIndex={props.tabIndex} onKeyDown={onCheckKeyDown}>\n {content()}\n </div>\n );\n};\n\nlet measureContext: CanvasRenderingContext2D | null | undefined;\n/** The width of a text in a font, from a canvas, so a bar can tell whether its title leaves room for a date hint. */\nexport const textWidth = (text: string, font: string): number => {\n measureContext ??= typeof document === \"undefined\" ? null : document.createElement(\"canvas\").getContext(\"2d\");\n if (!measureContext) return Number.POSITIVE_INFINITY;\n measureContext.font = font;\n return measureContext.measureText(text).width;\n};\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,KAAK,IAAI,QAAQ,QAA0B,aAAa;AAEjE,SAAS,UAAU,EAAE,IAAI,QAAQ,UAAU;AAE3C,SAAS,mBAAmB,QAAQ,qBAAqB;;AAEzD;;AASA;;AAGA;;AAGA,OAAO,MAAM,eAAe,GAAI,KAAoB,KAAmB;EACrE,GAAG,KAAK,CAAC,UAAU;EACnB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,UAAU,EAAE,QAAQ;EACtD,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,UAAU,EAAE,cAAc,IAAI,KAAK,CAAC,UAAU,EAAE,YAAY,IAAI;AAChH,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,qBAAqB;AAE7C,OAAO,MAAM,SAAS,GAAG,CAAC,KAAoB,EAAE,OAAqB,KAAW;EAC9E,IAAI,KAAK,YAAY,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC;EACjD,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,QAAQ,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC;EAClF,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;EACxE,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC;EACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,MAAM;EAClD,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;EACvD,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;AACnE,CAAC;AAED,OAAO,MAAM,SAAS,GAAI,KAAW,IAAc,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAEjF,OAAO,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,OAAqB,KAAa,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC;AAE3G,OAAO,MAAM,SAAS,GAAG,CAAC,KAAoB,EAAE,KAAoB,KAAyB,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI;;AAEtI;AACA,OAAO,MAAM,oBAAoB,GAAG,CAAC,MAAyB,EAAE,OAAoB,KAAW;EAC7F,MAAM,MAAM,GAAG,CAAC;EAChB,MAAM,GAAG,GAAG,CAAC;EACb,MAAM,IAAI,GAAG,MAAM,YAAY,OAAO,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC,GAAG,MAAM;EAChF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC;EAClF,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY;EACnC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;EACtF,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM;EACjE,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,SAAS;EACvE,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;EACjI,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI;EAChC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;AAClD,CAAC;;AAED;AACA,OAAO,MAAM,kBAAkB,GAAG,CAAC,KAAoB,EAAE,IAAY,KAAW;EAC9E,IAAI,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,KAChD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,OAAO,MAAM,SAAS,GAAI,KAsCzB,IAAkB;EACjB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,CAAC;EACtC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;EACjE,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM;EAC/C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,eAAe,KAAK,KAAK,CAAC,KAAK,CAAC,EAAE;EAC7G,MAAM,KAAK,GAAG,MAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG;IAAE,uBAAuB,EAAE,KAAK,CAAC,KAAK,CAAC;EAAS,CAAC,GAAG,SAAU;EAC1G,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC;EAChE,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,SAAS;EACzG,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC;EACxF,MAAM,QAAQ,GAAG,MAAO,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,aAAa,CAAC,CAAC,IAAI,IAAK;EACjI,MAAM,YAAY,GAAG,MACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,YAAY,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,aAAa,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;EAC1H,MAAM,eAAe,GAAG,MACtB,OAAO,CACL,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,aAAa,CAAC,CAAC,IAAI,GACnI,CAAC;EACH,MAAM,SAAS,GAAG,MAChB,KAAK,CAAC,SAAS,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE;EAC5H,MAAM,SAAS,GAAG,MAAM;IACtB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GACrB,KAAK,CAAC,KAAK,GACX,KAAK,CAAC,KAAK,CAAC,MAAM,GAChB,KAAK,CAAC,KAAK,CAAC,KAAK,GACjB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC9D;IACA,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAC1E,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC;MAC3B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK;MACxB,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;MACtD,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC,CAAC;IACV,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;EAC1F,CAAC;EACD,MAAM,aAAa,GAAG,MACpB,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,EAAE;IACrC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK;IAC/B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK;IACzB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS;IAC5B,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO;IACxB,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK;IACnC,aAAa,EAAE,aAAa,CAAC,CAAC;IAC9B,SAAS,EAAE,SAAS,CAAC,CAAC;IACtB,WAAW,EAAE,KAAK,CAAC,WAAW;IAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;IAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK;IACjC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI;EAC9B,CAAC,CAAC;EACJ,MAAM,cAAc,sBAEf,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,WAAW;IAAA;IAAA;MAAA,8BACa,KAAK,CAAC,WAAW;IAAA;EAAA,8CAGxD,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,kBAAK,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ,OAAI,CAAC,KAAK,CAAC,QAAQ;IAAA;IAAA;MAAA;IAAA;EAAA,cAG9D,KAAK,CAAC,KAAK,CAAC,KAAK,sBAEnB,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS;IAAA;IAAA;MAAA,iDAEpC,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,QAAQ,CAAC,CAAC;QAAA;QAAA;UAAA,OAAG,SAAS,CAAC,CAAC;QAAA;MAAA,gCACnC,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,SAAS;QAAA;QAAA;UAAA,sBACoB,QAAQ,CAAC,CAAC,GAAG,eAAM,KAAK,CAAC,SAAS,GAAE,YAAG,KAAK,CAAC,SAAS;QAAA;MAAA;IAAA;EAAA,sBAIxG,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,YAAY,CAAC,CAAC;IAAA;IAAA;MAAA,+BACgB,KAAK,CAAC,KAAK,CAAC,QAAQ;IAAA;EAAA,sBAE7D,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,eAAe,CAAC,CAAC;IAAA;IAAA;MAAA,+BACoB,KAAK,CAAC,KAAK,CAAC,WAAW;IAAA;EAAA,GAG3E;EACD,MAAM,OAAO,GAAG,yBAEX,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,SAAS;IAAA;IAAA;MAAA,+BAEtB,KAAK,CAAC,SAAS;IAAA;EAAA,IAGnB,aAAa,CAAC,CAAC,IAAI,cAAc,oBACjC,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,OAAO;IAAA;IAAA;MAAA,+BAEpB,KAAK,CAAC,OAAO;IAAA;EAAA,IAGjB,KAAK,CAAC,QAAQ,CAElB;EACD,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC;EAC9E,IAAI,kBAAkB,GAAG,CAAC;EAC1B,MAAM,OAAO,GAAI,KAAiB,IAAK;IACrC,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,kBAAkB,EAAE;MAC1C,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,KAAK,CAAC,eAAe,CAAC,CAAC;MACvB;IACF;IACA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,CAAC,eAAe,KAAK,QAAQ,EAAE;IAC9E,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,KAAK,CAAC,eAAe,CAAC,CAAC;IACvB,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;EAC1C,CAAC;EACD,MAAM,aAAa,GAAI,KAAiB,IAAK;IAC3C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,CAAC,eAAe,KAAK,QAAQ,EAAE;IAC9E,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,KAAK,CAAC,eAAe,CAAC,CAAC;IACvB,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;EAC1C,CAAC;EACD;EACA,MAAM,cAAc,GAAI,KAAoB,IAAK;IAC/C,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,KAAK;IACvG,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,KAAK,CAAC,OAAO,CAAC,CAAC;IACf,OAAO,IAAI;EACb,CAAC;EACD,MAAM,eAAe,GAAI,KAAoB,IAAK;IAChD,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAK,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAI,EAAE;IAC/F,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,KAAK,CAAC,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC;EAC5C,CAAC;EACD,MAAM,aAAa,GAAI,KAAmB,IAAK;IAC7C,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE;IACnC,IAAI,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IACpD,KAAK,CAAC,iBAAiB,GAAG,KAAK,EAAE,MAAM;MACrC,kBAAkB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG;IAC9C,CAAC,CAAC;EACJ,CAAC;EACD,MAAM,UAAU,GAAG,OAAO;IACxB,KAAK,EAAE,oBAAoB;IAC3B,qBAAqB,EAAE,EAAE;IACzB,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC;IACxD,eAAe,EAAE,QAAQ,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS;IAChD,cAAc,EAAE,KAAK,CAAC,OAAO,GAAG,MAAM,GAAG,SAAS;IAClD,WAAW,EAAE,KAAK,CAAC,IAAI,GAAG,MAAM,GAAG,SAAS;IAC5C,YAAY,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS;IAC1C,aAAa,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS;IAChD,uBAAuB,EAAE,KAAK,CAAC,eAAe,GAAG,MAAM,GAAG,SAAS;IACnE,sBAAsB,EAAE,KAAK,CAAC,cAAc,GAAG,MAAM,GAAG,SAAS;IACjE,UAAU,EAAE,KAAK,CAAC,GAAG,GAAG,MAAM,GAAG,SAAS;IAC1C,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO;IACnC,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE;IAC3B,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM;IAC9B,aAAa,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM;IACjC,KAAK,EAAE,KAAK,CAAC,CAAC;IACd,YAAY,EAAE,SAAS,CAAC;EAC1B,CAAC,CAAC;EAEF,OAAO,KAAK,CAAC,IAAI,kCAET,UAAU;IAAA,IACd,IAAI;MAAA,OAAE,KAAK,CAAC,IAAI;IAAA;IAAA;MAAA,OACE,aAAa,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS;IAAA;IAAA;MAAA,OAClC,KAAK,CAAC,KAAK,CAAC,eAAe;IAAA;IAAA,IAC/C,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA,IACxB,SAAS;MAAA,OAAE,KAAK,CAAC,iBAAiB,GAAG,KAAK,GAAG,SAAS;IAAA;EAAA,aAOrD,OAAO,CAAC,CAAC,YAEV,YAAY,CAAC,CAAC,uCAEV,UAAU;IACd,IAAI,EAAC,QAAQ;IAAA,oBACI,MAAM;IAAA,IACvB,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;EAAA,aAMvB,OAAO,CAAC,CAAC,6CAGH,UAAU;IAAI,IAAI,EAAC,OAAO;IAAA,IAAC,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;EAAA,aACzD,OAAO,CAAC,CAAC,SAEb;AACH,CAAC;AAED,IAAI,cAA2D;AAC/D;AACA,OAAO,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,IAAY,KAAa;EAC/D,cAAc,KAAK,OAAO,QAAQ,KAAK,WAAW,GAAG,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;EAC7G,IAAI,CAAC,cAAc,EAAE,OAAO,MAAM,CAAC,iBAAiB;EACpD,cAAc,CAAC,IAAI,GAAG,IAAI;EAC1B,OAAO,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK;AAC/C,CAAC","ignoreList":[]}