@k2b/ui 0.23.0 → 0.25.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/README.md +2 -2
- package/dist/browser/actions/Dropdown.js +67 -52
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/GestureMenu.js +3 -3
- package/dist/browser/actions/GestureMenu.js.map +1 -1
- package/dist/browser/actions/SpotlightSearch.js +13 -6
- package/dist/browser/actions/SpotlightSearch.js.map +1 -1
- package/dist/browser/actions/Toolbar.js +75 -1
- package/dist/browser/actions/Toolbar.js.map +1 -1
- package/dist/browser/content/Calendar.js +1570 -923
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/CalendarDayView.js +2 -2
- package/dist/browser/content/CalendarDayView.js.map +1 -1
- package/dist/browser/content/CalendarWeekView.js +29 -7
- package/dist/browser/content/CalendarWeekView.js.map +1 -1
- package/dist/browser/content/DataTable.js +45 -35
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/Kbd.js +51 -0
- package/dist/browser/content/Kbd.js.map +1 -0
- package/dist/browser/content/LabelChip.js +38 -0
- package/dist/browser/content/LabelChip.js.map +1 -0
- package/dist/browser/content/MarkdownView.js +2 -1
- package/dist/browser/content/MarkdownView.js.map +1 -1
- package/dist/browser/content/Steps.js +34 -0
- package/dist/browser/content/Steps.js.map +1 -0
- package/dist/browser/content/VirtualFeed.js +33 -1
- package/dist/browser/content/VirtualFeed.js.map +1 -1
- package/dist/browser/content/calendar-day-scroll.js +17 -4
- package/dist/browser/content/calendar-day-scroll.js.map +1 -1
- package/dist/browser/content/calendar-dialogs.js +32 -60
- package/dist/browser/content/calendar-dialogs.js.map +1 -1
- package/dist/browser/content/calendar-month-scroll.js +80 -0
- package/dist/browser/content/calendar-month-scroll.js.map +1 -0
- package/dist/browser/content/calendar-time-view.js +9 -4
- package/dist/browser/content/calendar-time-view.js.map +1 -1
- package/dist/browser/content/index.js +4 -1
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/content/markdown-info-blocks.js +33 -5
- package/dist/browser/content/markdown-info-blocks.js.map +1 -1
- package/dist/browser/feedback/prompts.js +17 -3
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/intl/index.js +1 -0
- package/dist/browser/intl/index.js.map +1 -1
- package/dist/browser/intl/shortcut-messages.js +77 -0
- package/dist/browser/intl/shortcut-messages.js.map +1 -0
- package/dist/browser/intl/shortcut.js +123 -0
- package/dist/browser/intl/shortcut.js.map +1 -0
- package/dist/browser/layout/AppWorkspace.js +345 -325
- 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 +14 -0
- 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/TableOfContents.js +115 -0
- package/dist/browser/layout/TableOfContents.js.map +1 -0
- package/dist/browser/layout/app-workspace-controller.js +15 -48
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/index.js +2 -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/layout/table-of-contents-messages.js +19 -0
- package/dist/browser/layout/table-of-contents-messages.js.map +1 -0
- package/dist/browser/surfaces/LinkCard.js +40 -24
- package/dist/browser/surfaces/LinkCard.js.map +1 -1
- package/dist/ssr/actions/Dropdown.js +11 -5
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/GestureMenu.js +3 -3
- package/dist/ssr/actions/GestureMenu.js.map +1 -1
- package/dist/ssr/actions/SpotlightSearch.js +9 -3
- package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
- package/dist/ssr/actions/Toolbar.js +67 -1
- package/dist/ssr/actions/Toolbar.js.map +1 -1
- package/dist/ssr/content/Calendar.js +895 -321
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/CalendarDayView.js +2 -2
- package/dist/ssr/content/CalendarDayView.js.map +1 -1
- package/dist/ssr/content/CalendarWeekView.js +28 -7
- package/dist/ssr/content/CalendarWeekView.js.map +1 -1
- package/dist/ssr/content/DataTable.js +21 -17
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/Kbd.js +38 -0
- package/dist/ssr/content/Kbd.js.map +1 -0
- package/dist/ssr/content/LabelChip.js +21 -0
- package/dist/ssr/content/LabelChip.js.map +1 -0
- package/dist/ssr/content/MarkdownView.js +2 -1
- package/dist/ssr/content/MarkdownView.js.map +1 -1
- package/dist/ssr/content/Steps.js +14 -0
- package/dist/ssr/content/Steps.js.map +1 -0
- package/dist/ssr/content/VirtualFeed.js +33 -1
- package/dist/ssr/content/VirtualFeed.js.map +1 -1
- package/dist/ssr/content/calendar-day-scroll.js +17 -4
- package/dist/ssr/content/calendar-day-scroll.js.map +1 -1
- package/dist/ssr/content/calendar-dialogs.js +12 -32
- package/dist/ssr/content/calendar-dialogs.js.map +1 -1
- package/dist/ssr/content/calendar-month-scroll.js +80 -0
- package/dist/ssr/content/calendar-month-scroll.js.map +1 -0
- package/dist/ssr/content/calendar-time-view.js +8 -3
- package/dist/ssr/content/calendar-time-view.js.map +1 -1
- package/dist/ssr/content/index.js +4 -1
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/content/markdown-info-blocks.js +33 -5
- package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
- package/dist/ssr/feedback/prompts.js +17 -3
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/intl/index.js +1 -0
- package/dist/ssr/intl/index.js.map +1 -1
- package/dist/ssr/intl/shortcut-messages.js +77 -0
- package/dist/ssr/intl/shortcut-messages.js.map +1 -0
- package/dist/ssr/intl/shortcut.js +123 -0
- package/dist/ssr/intl/shortcut.js.map +1 -0
- package/dist/ssr/layout/AppWorkspace.js +67 -59
- 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 +14 -0
- 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/TableOfContents.js +79 -0
- package/dist/ssr/layout/TableOfContents.js.map +1 -0
- package/dist/ssr/layout/app-workspace-controller.js +15 -48
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/index.js +2 -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/layout/table-of-contents-messages.js +19 -0
- package/dist/ssr/layout/table-of-contents-messages.js.map +1 -0
- package/dist/ssr/surfaces/LinkCard.js +26 -10
- package/dist/ssr/surfaces/LinkCard.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/Dropdown.d.ts +12 -0
- package/dist/types/actions/SpotlightSearch.d.ts +2 -0
- package/dist/types/content/Calendar.d.ts +20 -7
- package/dist/types/content/CalendarWeekView.d.ts +1 -1
- package/dist/types/content/DataTable.d.ts +9 -0
- package/dist/types/content/Kbd.d.ts +16 -0
- package/dist/types/content/LabelChip.d.ts +12 -0
- package/dist/types/content/MarkdownView.d.ts +2 -1
- package/dist/types/content/Steps.d.ts +12 -0
- package/dist/types/content/VirtualFeed.d.ts +8 -0
- package/dist/types/content/calendar-day-scroll.d.ts +9 -4
- package/dist/types/content/calendar-dialogs.d.ts +0 -2
- package/dist/types/content/calendar-month-scroll.d.ts +25 -0
- package/dist/types/content/index.d.ts +7 -1
- package/dist/types/content/markdown-info-blocks.d.ts +21 -4
- package/dist/types/feedback/prompts.d.ts +8 -2
- package/dist/types/intl/index.d.ts +2 -0
- package/dist/types/intl/shortcut-messages.d.ts +35 -0
- package/dist/types/intl/shortcut.d.ts +29 -0
- package/dist/types/layout/AppWorkspace.d.ts +5 -1
- package/dist/types/layout/SidebarSwitcher.d.ts +65 -0
- package/dist/types/layout/TableOfContents.d.ts +24 -0
- package/dist/types/layout/index.d.ts +3 -0
- package/dist/types/layout/navigation-model.d.ts +4 -0
- package/dist/types/layout/table-of-contents-messages.d.ts +4 -0
- package/dist/types/surfaces/LinkCard.d.ts +3 -0
- package/package.json +4 -4
|
@@ -5,7 +5,7 @@ import { createComponent as _$createComponent } from "solid-js/web";
|
|
|
5
5
|
import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
|
|
6
6
|
import { escape as _$escape } from "solid-js/web";
|
|
7
7
|
var _tmpl$ = ["<p class=\"k2b-calendar-days__more\">", "</p>"],
|
|
8
|
-
_tmpl$2 = ["<div class=\"k2b-calendar-days\" data-view=\"day\"", "><div class=\"k2b-calendar-days__scroll\" tabindex=\"-1\"", "><div class=\"k2b-calendar-days__track\">", "", "</div></div><p class=\"k2b-calendar-sr\"", ">", "</p>", "</div>"],
|
|
8
|
+
_tmpl$2 = ["<div class=\"k2b-calendar-days\" data-view=\"day\"", "><div class=\"k2b-calendar-days__scroll k2b-detail-trail\" tabindex=\"-1\"", "><div class=\"k2b-calendar-days__track\">", "", "</div></div><p class=\"k2b-calendar-sr\"", ">", "</p>", "</div>"],
|
|
9
9
|
_tmpl$3 = ["<span class=\"k2b-calendar-days__today\">", "</span>"],
|
|
10
10
|
_tmpl$4 = "<i class=\"ti ti-clock\" aria-hidden=\"true\"></i>",
|
|
11
11
|
_tmpl$5 = ["<span>", "</span>"],
|
|
@@ -242,7 +242,7 @@ export const CalendarDayView = props => {
|
|
|
242
242
|
if (`${first}/${last}` === reported) return;
|
|
243
243
|
reported = `${first}/${last}`;
|
|
244
244
|
window.clearTimeout(reportTimer);
|
|
245
|
-
reportTimer = window.setTimeout(() => props.owner.onVisibleDateChange?.(view.parseKey(first), view.parseKey(last)), 250);
|
|
245
|
+
reportTimer = window.setTimeout(() => props.owner.onVisibleDateChange?.(view.parseKey(first), view.parseKey(last), view.parseKey(first)), 250);
|
|
246
246
|
};
|
|
247
247
|
const updateChrome = () => {
|
|
248
248
|
if (!scroller) return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/CalendarDayView.tsx"],"sourcesContent":["import {\n createComputed,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n on,\n onCleanup,\n onMount,\n Show,\n untrack,\n} from \"solid-js\";\nimport { brakedScroll, GESTURE_GAP_MS, SETTLE_RADIUS, settleTarget, stopCrossing, stopIndexAt, wheelPixels } from \"./calendar-day-scroll\";\nimport {\n addDayKeys,\n DAY_MINUTES,\n type DayGroup,\n dayGroups,\n dayHeightTerms,\n dayKeyRange,\n dayMinuteAt,\n dayY,\n dayYTerms,\n markerLanes,\n readDayGeometry,\n termsCss,\n} from \"./calendar-days\";\nimport { EventChip, eventHref } from \"./calendar-shared\";\nimport {\n AllDayChips,\n createTimeView,\n dayBands,\n dayGaps,\n daySummary,\n eventAccent,\n foldedEntries,\n gapAside,\n isNearNow,\n longDay,\n markerAbove,\n nightHours,\n reducedMotion,\n shortDay,\n soonNote,\n TimeBand,\n TimeCheck,\n TimeGap,\n TimeMarker,\n TimeOverlays,\n TimeQuickCreate,\n type TimeView,\n type TimeViewHandle,\n type TimeViewProps,\n} from \"./calendar-time-view\";\n\nconst groupId = (group: DayGroup) => (group.kind === \"day\" ? `d:${group.key}` : `e:${group.keys.join(\",\")}`);\nconst groupFirst = (group: DayGroup) => (group.kind === \"day\" ? group.key : group.keys[0]!);\n\n/**\n * The day view with `dayHours`: the loaded days one below the other in a single scroll, each with its heading kept on\n * top while it is in view. Runs of empty days fold into one row. The view slows down and settles at each day start,\n * and a line at the top of the heading fills while a day start passes.\n */\nexport const CalendarDayView = (props: TimeViewProps) => {\n const view = createTimeView(props);\n const [mounted, setMounted] = createSignal(false);\n const [unfolded, setUnfolded] = createSignal<ReadonlySet<string>>(new Set());\n const [topKey, setTopKey] = createSignal(untrack(view.anchorKey));\n const [hover, setHover] = createSignal<{ key: string; minute: number } | null>(null);\n /** Where today's day lies from the view, kept current while scrolling for the Today button's arrow. */\n const [todayPlace, setTodayPlace] = createSignal<\"up\" | \"down\" | \"\">(\"\");\n let scroller: HTMLDivElement | undefined;\n let track: HTMLDivElement | undefined;\n const helpId = createUniqueId();\n\n // The server and the first render start at the shown day, so the page never flashes the days before it; once\n // mounted the earlier days join above it without moving the view.\n const keys = createMemo(() => {\n const { first, last } = view.range();\n const anchor = view.anchorKey();\n const from = mounted() || anchor < first || anchor > last ? first : anchor;\n return dayKeyRange(from, last);\n });\n // Today and the day the reader opened never fold, so a day opened from the month shows its hours to create in.\n const groups = createMemo(() =>\n dayGroups(keys(), (key) => view.dayOf(key).empty, new Set([view.nowKey(), view.anchorKey(), ...unfolded()])),\n );\n const unfold = (keys: readonly string[]) => setUnfolded((value) => new Set([...value, ...keys]));\n const groupIds = createMemo(() => groups().map(groupId));\n const groupsById = createMemo(() => new Map(groups().map((group) => [groupId(group), group])));\n\n // Where each group starts in the scroll, measured after every change of the groups and on resize.\n let sections: HTMLElement[] = [];\n let tops: number[] = [];\n const measure = () => {\n if (!track) return;\n sections = [...track.querySelectorAll<HTMLElement>(\":scope > [data-calendar-group]\")];\n tops = sections.map((section) => section.offsetTop);\n };\n const keysOf = (section: HTMLElement | undefined) => (section?.dataset.calendarKeys ?? \"\").split(\",\").filter(Boolean);\n const sectionOf = (key: string) => sections.find((section) => keysOf(section).includes(key));\n\n /** The group at the top of the view and how far into it the view is, kept across changes above it. */\n let anchor: { key: string; delta: number } | null = null;\n /** A day the host moved to before its days loaded; it goes on screen once they arrive. */\n let pendingTarget: string | null = null;\n /** The last scroll position the view read, to tell the reader's direction. */\n let lastScrollTop = 0;\n const rememberAnchor = () => {\n if (!scroller || sections.length === 0) return;\n const index = stopIndexAt(tops, scroller.scrollTop);\n const section = sections[index];\n if (section) anchor = { key: keysOf(section)[0]!, delta: scroller.scrollTop - tops[index]! };\n };\n const restoreAnchor = () => {\n if (!scroller || !anchor) return;\n const saved = anchor;\n let index = sections.findIndex((section) => keysOf(section).includes(saved.key));\n if (index < 0) index = sections.findIndex((section) => keysOf(section)[0]! >= saved.key);\n if (index < 0) return;\n const top = tops[index]! + Math.min(saved.delta, sections[index]!.offsetHeight - 1);\n if (Math.abs(scroller.scrollTop - top) > 0.5) scroller.scrollTop = top;\n lastScrollTop = scroller.scrollTop;\n };\n\n /** The scroll position of a minute of a day, or of the day's start without a minute. */\n const topFor = (key: string, minute?: number) => {\n const section = sectionOf(key);\n if (!section) return null;\n const index = sections.indexOf(section);\n const body = section.querySelector<HTMLElement>(\"[data-calendar-body]\");\n if (minute === undefined || !body) return tops[index]!;\n const geometry = readDayGeometry(body, view.wake(), body.dataset.expanded === \"true\");\n return tops[index]! + body.offsetTop + dayY(geometry, minute);\n };\n\n // Gliding: arrows, Today, and Go to scroll smoothly; the stops and loading wait until the glide arrived.\n let glideTarget: number | null = null;\n let glideTimer = 0;\n const glide = (top: number) => {\n if (!scroller) return;\n const target = Math.round(Math.max(0, Math.min(top, scroller.scrollHeight - scroller.clientHeight)));\n glideTarget = target;\n window.clearTimeout(glideTimer);\n glideTimer = window.setTimeout(() => {\n glideTarget = null;\n }, 1600);\n // What the view keeps in place from now on is where the glide arrives, not where it started.\n const index = stopIndexAt(tops, target);\n const section = sections[index];\n if (section) anchor = { key: keysOf(section)[0]!, delta: target - tops[index]! };\n scroller.scrollTo({ top: target, behavior: reducedMotion() ? \"instant\" : \"smooth\" });\n };\n\n /** Puts a day on screen: now in the upper third today, else an hour before its first entry, else its start. */\n const positionAt = (key: string) => {\n if (!scroller) return;\n measure();\n if (key === view.nowKey()) {\n const top = topFor(key, view.nowMinute());\n // Now in the upper third, but never showing the end of the day before above the day's own heading.\n if (top !== null) scroller.scrollTop = Math.max(topFor(key) ?? 0, top - scroller.clientHeight / 3);\n lastScrollTop = scroller.scrollTop;\n return;\n }\n const model = view.dayOf(key);\n const first = Math.min(\n ...model.bands.map((band) => band.start),\n ...model.markers.map((marker) => marker.minute),\n Number.POSITIVE_INFINITY,\n );\n const start = topFor(key);\n if (start === null) return;\n const entry = Number.isFinite(first) && first > 120 ? topFor(key, first - 60) : null;\n scroller.scrollTop = entry === null ? start : Math.max(start, entry - 44);\n lastScrollTop = scroller.scrollTop;\n };\n\n // Input: the wheel brakes at day starts; a resting scroll glides onto a near one.\n let lastInput: \"wheel\" | \"touch\" | \"other\" = \"other\";\n let fingers = 0;\n let settling = false;\n let restTimer = 0;\n let frame = 0;\n let ready = false;\n let carry = 0;\n let lastWheel = 0;\n const settle = () => {\n if (!scroller || fingers > 0 || settling || glideTarget !== null || view.dragging()) return;\n const target = settleTarget(tops.slice(1), scroller.scrollTop, lastInput === \"touch\" ? SETTLE_RADIUS.touch : SETTLE_RADIUS.wheel);\n if (target === undefined) return;\n settling = true;\n scroller.scrollTo({ top: target, behavior: reducedMotion() ? \"instant\" : \"smooth\" });\n window.setTimeout(() => {\n settling = false;\n }, 450);\n };\n const onWheel = (event: WheelEvent) => {\n if (!scroller || event.ctrlKey || Math.abs(event.deltaX) > Math.abs(event.deltaY) || view.dragging()) return;\n const delta = wheelPixels(event.deltaY, event.deltaMode, scroller.clientHeight);\n const top = scroller.scrollTop;\n const max = scroller.scrollHeight - scroller.clientHeight;\n // At the ends the wheel asks for more days instead.\n if ((delta > 0 && top >= max - 1) || (delta < 0 && top <= 1)) {\n loadMore(delta > 0 ? \"later\" : \"earlier\");\n return;\n }\n if (event.timeStamp - lastWheel > GESTURE_GAP_MS) carry = 0;\n // A gesture that goes on takes over from a glide onto a day start; the view settles again once it rests.\n settling = false;\n lastWheel = event.timeStamp;\n const next = brakedScroll(tops, top + carry, delta);\n lastInput = \"wheel\";\n if (next === undefined) {\n carry = 0;\n return;\n }\n event.preventDefault();\n glideTarget = null;\n const bounded = Math.max(0, Math.min(max, next));\n scroller.scrollTop = bounded;\n // Steps too small for a pixel add up instead of vanishing.\n carry = bounded - scroller.scrollTop;\n };\n\n // Loading: each end asks once per range, and only after the view settled at its first position.\n let askedEarlier = \"\";\n let askedLater = \"\";\n const loadMore = (edge: \"earlier\" | \"later\") => {\n // Days that come in above move the view, so they wait for a glide to arrive; days below move nothing.\n if (!ready || view.dragging() || (edge === \"earlier\" && glideTarget !== null)) return;\n const { first, last } = view.range();\n if (edge === \"earlier\" && props.owner.onLoadEarlier && askedEarlier !== first) {\n askedEarlier = first;\n void props.owner.onLoadEarlier();\n }\n if (edge === \"later\" && props.owner.onLoadLater && askedLater !== last) {\n askedLater = last;\n void props.owner.onLoadLater();\n }\n };\n\n let reportTimer = 0;\n let reported = \"\";\n /** Tells the host the days the reader sees once they changed, after the scroll calmed down. */\n const reportVisible = () => {\n const { first, last } = untrack(visibleKeys);\n if (`${first}/${last}` === reported) return;\n reported = `${first}/${last}`;\n window.clearTimeout(reportTimer);\n reportTimer = window.setTimeout(() => props.owner.onVisibleDateChange?.(view.parseKey(first), view.parseKey(last)), 250);\n };\n const updateChrome = () => {\n if (!scroller) return;\n const top = scroller.scrollTop;\n const index = stopIndexAt(tops, top);\n const key = keysOf(sections[index])[0];\n if (key && key !== untrack(topKey)) setTopKey(key);\n reportVisible();\n for (const [position, section] of sections.entries()) {\n const head = section.firstElementChild as HTMLElement | null;\n if (!head) continue;\n const crossing = position > 0 ? stopCrossing(tops[position]!, top) : 0;\n if (crossing > 0) head.style.setProperty(\"--k2b-calendar-cross\", String(crossing));\n else if (head.style.getPropertyValue(\"--k2b-calendar-cross\")) head.style.removeProperty(\"--k2b-calendar-cross\");\n }\n setTodayPlace(placeOfToday());\n // Only the reader's own scrolling asks for more: days that came in above push the view down, and runs of empty\n // days are short, so asking whenever the view is near an end would load one empty week after the other.\n const direction = Math.sign(top - lastScrollTop);\n lastScrollTop = top;\n if (direction > 0 && top + scroller.clientHeight > scroller.scrollHeight - 2 * scroller.clientHeight) loadMore(\"later\");\n else if (direction < 0 && top < scroller.clientHeight) loadMore(\"earlier\");\n rememberAnchor();\n };\n const onScroll = () => {\n if (!scroller) return;\n if (glideTarget !== null && Math.abs(scroller.scrollTop - glideTarget) < 2) glideTarget = null;\n if (!frame)\n frame = requestAnimationFrame(() => {\n frame = 0;\n updateChrome();\n });\n window.clearTimeout(restTimer);\n restTimer = window.setTimeout(settle, lastInput === \"touch\" ? 90 : 160);\n };\n\n onMount(() => {\n setMounted(true);\n queueMicrotask(() => {\n positionAt(view.anchorKey());\n rememberAnchor();\n ready = true;\n updateChrome();\n });\n const observer =\n typeof ResizeObserver === \"undefined\"\n ? undefined\n : new ResizeObserver(() => {\n measure();\n // A glide owns the scroll until it arrives; putting the view back meanwhile would stop it.\n if (glideTarget === null) restoreAnchor();\n });\n if (track) observer?.observe(track);\n onCleanup(() => {\n observer?.disconnect();\n window.clearTimeout(restTimer);\n window.clearTimeout(reportTimer);\n window.clearTimeout(glideTimer);\n if (frame) cancelAnimationFrame(frame);\n });\n });\n // Before new days or an unfolded run change the page, note where the reader is from the page as it stands: the\n // place remembered in the last frame can be a scroll behind on a busy page. A computation runs before any render\n // effect touches the page.\n createComputed(\n on(\n () => [groupIds(), view.days()] as const,\n () => {\n if (!untrack(mounted)) return;\n measure();\n rememberAnchor();\n },\n { defer: true },\n ),\n );\n // New days above or below, a folded night, or an unfolded run: keep what the reader looks at in place.\n createEffect(\n on(\n () => [groupIds(), view.days()] as const,\n () => {\n if (!untrack(mounted)) return;\n measure();\n if (pendingTarget && loaded(pendingTarget)) {\n positionAt(pendingTarget);\n pendingTarget = null;\n rememberAnchor();\n } else restoreAnchor();\n updateChrome();\n },\n { defer: true },\n ),\n );\n // Another date from the host puts that day on screen.\n createEffect(\n on(\n view.anchorKey,\n (key) => {\n if (!untrack(mounted)) return;\n pendingTarget = loaded(key) ? null : key;\n if (pendingTarget) return;\n if (key === untrack(visibleKeys).first) {\n rememberAnchor();\n return;\n }\n queueMicrotask(() => {\n positionAt(key);\n rememberAnchor();\n updateChrome();\n });\n },\n { defer: true },\n ),\n );\n\n /** Whether today's day is above, below, or in the view. */\n const placeOfToday = (): \"up\" | \"down\" | \"\" => {\n const key = view.nowKey();\n if (!scroller) return \"\";\n const section = sectionOf(key);\n if (!section) return key < untrack(topKey) ? \"up\" : \"down\";\n const index = sections.indexOf(section);\n const top = scroller.scrollTop;\n if (tops[index]! + section.offsetHeight < top) return \"up\";\n if (tops[index]! > top + scroller.clientHeight) return \"down\";\n return \"\";\n };\n const visibleKeys = () => {\n const first = topKey();\n if (!scroller || sections.length === 0) return { first, last: first };\n const bottom = scroller.scrollTop + scroller.clientHeight;\n const index = stopIndexAt(tops, bottom - 1);\n const keysAtBottom = keysOf(sections[index]);\n return { first, last: keysAtBottom[keysAtBottom.length - 1] ?? first };\n };\n const loaded = (key: string) => key >= view.range().first && key <= view.range().last;\n const goTo = (key: string) => {\n if (!loaded(key) || !scroller) return false;\n // A day inside a run of empty days opens on its own, so the view goes to that day and not to the run.\n if (untrack(groups).some((group) => group.kind === \"empty\" && group.keys.includes(key))) unfold([key]);\n measure();\n const top = topFor(key);\n if (top === null) return false;\n glide(top);\n return true;\n };\n const handle: TimeViewHandle = {\n visibleKeys,\n step: (direction) => {\n if (!scroller) return false;\n measure();\n const top = scroller.scrollTop;\n const index = stopIndexAt(tops, top);\n const target = direction > 0 ? tops[index + 1] : top - tops[index]! > 8 ? tops[index] : tops[index - 1];\n if (target === undefined) return false;\n glide(target);\n return true;\n },\n goTo,\n today: () => {\n const key = view.nowKey();\n if (!loaded(key) || !scroller) return false;\n measure();\n const top = topFor(key, view.nowMinute());\n if (top === null) return false;\n glide(Math.max(topFor(key) ?? 0, top - scroller.clientHeight / 3));\n return true;\n },\n todayDirection: () => {\n const key = view.nowKey();\n const { first, last } = view.range();\n if (key < first) return \"up\";\n if (key > last) return \"down\";\n return todayPlace();\n },\n controller: {\n quickCreate: (create) => {\n const target = view.createTarget(visibleKeys());\n const body = scroller?.querySelector<HTMLElement>(`[data-calendar-body=\"${target.key}\"]`);\n view.openQuickCreate(\n target.key,\n target.start,\n target.end,\n anchorFor(target.key, target.start, target.end) ?? body ?? scroller!,\n create,\n );\n },\n createTarget: () => {\n const target = view.createTarget(visibleKeys());\n return view.rangeOfSelection(target);\n },\n dragIn: (event, item, onDrop) => view.dragIn(event, item, onDrop, scroller),\n },\n };\n /** The place of a slot on screen for the quick create, when it is in view. */\n const anchorFor = (key: string, start: number, end: number): DOMRect | null => {\n const body = scroller?.querySelector<HTMLElement>(`[data-calendar-body=\"${key}\"]`);\n if (!body || !scroller) return null;\n const rect = body.getBoundingClientRect();\n const bounds = scroller.getBoundingClientRect();\n const geometry = readDayGeometry(body, view.wake(), body.dataset.expanded === \"true\");\n const top = rect.top + dayY(geometry, start);\n const bottom = rect.top + dayY(geometry, end);\n if (bottom < bounds.top + 40 || top > bounds.bottom - 20) return null;\n const left = rect.left + 56;\n const clampedTop = Math.max(bounds.top, top);\n return new DOMRect(left, clampedTop, Math.min(rect.right - left, 320), Math.max(8, Math.min(bottom, bounds.bottom) - clampedTop));\n };\n onMount(() => props.register(handle));\n onCleanup(() => props.register(null));\n\n /** Tab into the stream lands on the first stop on screen, not on the first loaded day weeks above. */\n let tabbedAt = -1e9;\n onMount(() => {\n const note = (event: KeyboardEvent) => {\n if (event.key === \"Tab\") {\n tabbedAt = performance.now();\n if (scroller) restingTop = scroller.scrollTop;\n }\n };\n window.addEventListener(\"keydown\", note, true);\n onCleanup(() => window.removeEventListener(\"keydown\", note, true));\n });\n let restingTop = 0;\n const onFocusIn = (event: FocusEvent) => {\n if (!scroller) return;\n const from = event.relatedTarget instanceof Node ? event.relatedTarget : null;\n if (performance.now() - tabbedAt > 400 || (from && scroller.contains(from))) {\n restingTop = scroller.scrollTop;\n return;\n }\n // Undo the scroll to the focused stop, which some engines make before this runs and some after; a stop on screen\n // keeps the focus.\n if (Math.abs(scroller.scrollTop - restingTop) >= 1) scroller.scrollTop = restingTop;\n const bounds = scroller.getBoundingClientRect();\n const visible = (element: Element) => {\n const rect = element.getBoundingClientRect();\n return rect.height > 0 && rect.top >= bounds.top - 1 && rect.bottom <= bounds.bottom + 1;\n };\n if (event.target instanceof Element && visible(event.target)) return;\n const stops = [...scroller.querySelectorAll<HTMLElement>(\"a[href],button:not([tabindex='-1'])\")].filter(visible);\n const back = Boolean(from && scroller.compareDocumentPosition(from) & Node.DOCUMENT_POSITION_FOLLOWING);\n (back ? stops[stops.length - 1] : stops[0])?.focus({ preventScroll: true });\n };\n\n return (\n <div class=\"k2b-calendar-days\" data-view=\"day\" data-dragging={view.dragging() || undefined}>\n <div\n ref={scroller}\n class=\"k2b-calendar-days__scroll\"\n tabIndex={-1}\n aria-describedby={helpId}\n onScroll={onScroll}\n onWheel={onWheel}\n onTouchStart={(event) => {\n fingers = event.touches.length;\n lastInput = \"touch\";\n glideTarget = null;\n }}\n onTouchEnd={(event) => {\n fingers = event.touches.length;\n }}\n onTouchCancel={(event) => {\n fingers = event.touches.length;\n }}\n onFocusIn={onFocusIn}\n >\n <div ref={track} class=\"k2b-calendar-days__track\">\n <For each={groupIds()}>\n {(id) => {\n const group = () => groupsById().get(id);\n return (\n <Show when={group()}>\n {(current) =>\n current().kind === \"day\" ? (\n <DaySection view={view} dayKey={groupFirst(current())} hover={hover} setHover={setHover} scroller={() => scroller} />\n ) : (\n <EmptyRun view={view} keys={(current() as Extract<DayGroup, { kind: \"empty\" }>).keys} onUnfold={unfold} />\n )\n }\n </Show>\n );\n }}\n </For>\n <Show when={props.owner.onLoadLater}>\n <p class=\"k2b-calendar-days__more\">{view.messages().calendarMoreDays}</p>\n </Show>\n </div>\n </div>\n <p class=\"k2b-calendar-sr\" id={helpId}>\n {view.messages().calendarDayKeyboardHelp}\n </p>\n <TimeQuickCreate view={view} />\n </div>\n );\n};\n\nconst DaySection = (props: {\n view: TimeView;\n dayKey: string;\n hover: () => { key: string; minute: number } | null;\n setHover: (value: { key: string; minute: number } | null) => void;\n scroller: () => HTMLElement | undefined;\n}) => {\n const view = props.view;\n const model = createMemo(() => view.dayOf(props.dayKey));\n const expanded = () => view.nightOpen(props.dayKey, model());\n const headingId = createUniqueId();\n const badge = () => view.props.owner.dayBadges?.[props.dayKey];\n const today = () => props.dayKey === view.calendarToday();\n const selectedDay = () => {\n const current = view.selection();\n return Boolean(current && current.key === props.dayKey && current.start === undefined);\n };\n const soon = () => soonNote(view, props.dayKey);\n const wake = () => view.wake();\n const nowMinute = () => (props.dayKey === view.nowKey() ? view.nowMinute() : null);\n const bands = createMemo(() => dayBands(view, props.dayKey, expanded()));\n const gaps = createMemo(() => dayGaps(view, props.dayKey));\n const markers = () => model().markers.filter((marker) => marker.minute < (expanded() ? DAY_MINUTES : wake()));\n /** Deadlines whose pills would cover each other share the width; keyed by marker, so rows keep their elements. */\n const lanes = createMemo(() => new Map(markerLanes(markers(), wake()).map((entry) => [entry.item, entry])));\n const folded = () => (expanded() ? [] : foldedEntries(view, props.dayKey));\n const nightLabel = () =>\n view.messages().calendarNight({ from: shortDay(view, props.dayKey), to: shortDay(view, addDayKeys(props.dayKey, 1)) });\n const foldLabel = () =>\n view.messages().calendarNightHours({\n from: view.clock(wake()).slice(0, 2),\n to: view.clock(DAY_MINUTES).slice(0, 2),\n });\n\n // Gaps, bands, and markers in one time order, so Tab runs through the day as it reads. Unchanged rows keep their\n // elements and focus when the clock updates the gaps.\n const timeline = createMemo<\n Array<\n | { at: number; kind: \"gap\"; gap: ReturnType<typeof gaps>[number] }\n | { at: number; kind: \"band\"; band: ReturnType<typeof bands>[number] }\n | { at: number; kind: \"marker\"; marker: ReturnType<typeof markers>[number] }\n >\n >(\n (previous) =>\n [\n ...gaps().map(\n (gap) =>\n previous.find(\n (row) => row.kind === \"gap\" && row.gap.start === gap.start && row.gap.end === gap.end && row.gap.past === gap.past,\n ) ?? { at: gap.start, kind: \"gap\" as const, gap },\n ),\n ...bands().map(\n (band) =>\n previous.find((row) => row.kind === \"band\" && row.band === band) ?? {\n at: Math.max(0, band.start),\n kind: \"band\" as const,\n band,\n },\n ),\n ...markers().map(\n (marker) =>\n previous.find((row) => row.kind === \"marker\" && row.marker === marker) ?? {\n at: marker.minute,\n kind: \"marker\" as const,\n marker,\n },\n ),\n ].sort((left, right) => left.at - right.at),\n [],\n );\n\n const isEmptyTarget = (target: EventTarget | null) =>\n target instanceof Element &&\n !target.closest(\"a,button,[data-calendar-event],.k2b-calendar-band,.k2b-calendar-marker,.k2b-calendar-draft,.k2b-calendar-fold\");\n const minuteAt = (element: HTMLElement, clientY: number) => {\n const geometry = readDayGeometry(element, wake(), expanded());\n const rect = element.getBoundingClientRect();\n return Math.max(0, Math.min((expanded() ? DAY_MINUTES : wake()) - 15, dayMinuteAt(geometry, clientY - rect.top)));\n };\n let lastPointer = \"mouse\";\n\n return (\n <section\n class=\"k2b-calendar-days__day\"\n data-calendar-group=\"\"\n data-calendar-keys={props.dayKey}\n aria-labelledby={headingId}\n data-today={today() ? \"true\" : undefined}\n data-past={props.dayKey < view.nowKey() ? \"true\" : undefined}\n data-selected={selectedDay() ? \"true\" : undefined}\n >\n <header class=\"k2b-calendar-days__head\">\n <h2 class=\"k2b-calendar-days__title\" id={headingId}>\n <button\n type=\"button\"\n class=\"k2b-calendar-days__title-button\"\n aria-pressed={selectedDay() ? \"true\" : \"false\"}\n onClick={() => {\n view.setTouchDraft(null);\n view.setSelection(selectedDay() ? null : { key: props.dayKey });\n }}\n >\n <Show when={today()}>\n <span class=\"k2b-calendar-days__today\">{view.props.labels.today}</span>\n </Show>\n <span class=\"k2b-calendar-days__long\">{longDay(view, props.dayKey)}</span>\n <span class=\"k2b-calendar-days__short\">{shortDay(view, props.dayKey, true)}</span>\n </button>\n </h2>\n <span class=\"k2b-calendar-days__note\" data-cheer={view.cheered() === props.dayKey ? \"true\" : undefined}>\n <span class=\"k2b-calendar-days__soon\">\n <Show when={soon()}>\n <i class=\"ti ti-clock\" aria-hidden=\"true\" />\n <span>{soon()}</span>\n </Show>\n </span>\n {/* Screen readers hear it as an announcement; this only marks the moment. */}\n <span class=\"k2b-calendar-days__cheer\" aria-hidden=\"true\">\n <i class=\"ti ti-confetti\" aria-hidden=\"true\" />\n {view.messages().calendarAllDone}\n </span>\n </span>\n <Show when={badge()}>\n {(current) => (\n <span class=\"k2b-calendar-days__badge\">\n <Show when={current().icon}>{(icon) => <i class={`ti ti-${icon()}`} aria-hidden=\"true\" />}</Show>\n {current().label}\n </span>\n )}\n </Show>\n <span class=\"k2b-calendar-days__summary\">{daySummary(view, props.dayKey)}</span>\n </header>\n <Show when={model().spans.length > 0}>\n <div class=\"k2b-calendar-days__all-day\" role=\"group\" aria-label={view.messages().calendarAllDayAndDue}>\n <AllDayChips view={view} dayKey={props.dayKey} spans={model().spans} />\n </div>\n </Show>\n {/* biome-ignore lint/a11y/noStaticElementInteractions: free time is reached through its gap buttons; the pointer adds drawing and slots. */}\n <div\n ref={(element) => view.registerBody(props.dayKey, element, expanded)}\n class=\"k2b-calendar-days__body\"\n data-calendar-body={props.dayKey}\n data-expanded={expanded() ? \"true\" : \"false\"}\n style={{ height: termsCss(dayHeightTerms(wake(), expanded())) }}\n onPointerDown={(event) => {\n lastPointer = event.pointerType;\n if (event.button !== 0 || !isEmptyTarget(event.target)) return;\n view.startDraw(event, props.dayKey, props.scroller());\n }}\n // Some engines send a tap as touch events only; a tap is a tap either way.\n onTouchStart={() => {\n lastPointer = \"touch\";\n }}\n // Listening on the timeline itself, not through delegation, makes it a tap target on iOS.\n on:click={(event) => {\n if (!isEmptyTarget(event.target) || !view.canCreate()) return;\n const minute = Math.floor(minuteAt(event.currentTarget, event.clientY) / 30) * 30;\n const end = Math.min(minute + 60, expanded() ? DAY_MINUTES : wake());\n if (lastPointer === \"mouse\") {\n view.setTouchDraft(null);\n view.setSelection({ key: props.dayKey, start: minute, end });\n return;\n }\n view.setTouchDraft({ key: props.dayKey, start: minute, end });\n view.setSelection({ key: props.dayKey, start: minute, end });\n }}\n onDblClick={(event) => {\n if (!isEmptyTarget(event.target) || lastPointer !== \"mouse\") return;\n const minute = Math.floor(minuteAt(event.currentTarget, event.clientY) / 30) * 30;\n view.openQuickCreate(props.dayKey, minute, Math.min(minute + 60, expanded() ? DAY_MINUTES : wake()), event.currentTarget);\n }}\n onPointerMove={(event) => {\n if (event.pointerType !== \"mouse\" || view.dragging() || !isEmptyTarget(event.target)) {\n if (props.hover()?.key === props.dayKey) props.setHover(null);\n return;\n }\n const minute = Math.floor(minuteAt(event.currentTarget, event.clientY) / 15) * 15;\n props.setHover({ key: props.dayKey, minute });\n }}\n onPointerLeave={() => {\n if (props.hover()?.key === props.dayKey) props.setHover(null);\n }}\n >\n <For each={Array.from({ length: wake() / 60 + 1 }, (_, index) => index * 60)}>\n {(minute) => (\n <>\n <span class=\"k2b-calendar-days__line\" style={{ top: termsCss(dayYTerms(wake(), expanded(), minute)) }} aria-hidden=\"true\" />\n <span\n class=\"k2b-calendar-days__hour\"\n data-near-now={isNearNow(view, props.dayKey, minute) ? \"true\" : undefined}\n style={{ top: termsCss(dayYTerms(wake(), expanded(), minute)) }}\n aria-hidden=\"true\"\n >\n {view.clock(minute)}\n </span>\n </>\n )}\n </For>\n <Show\n when={expanded()}\n fallback={\n <div class=\"k2b-calendar-fold\" style={{ top: `calc(${termsCss(dayYTerms(wake(), false, wake()))} + 3px)` }}>\n <button\n type=\"button\"\n class=\"k2b-calendar-fold__toggle\"\n aria-expanded=\"false\"\n aria-label={view.messages().calendarOpenNight}\n onClick={() => view.setNight(props.dayKey, true)}\n >\n <i class=\"ti ti-moon\" aria-hidden=\"true\" />\n <span>{foldLabel()}</span>\n <i class=\"ti ti-chevron-down\" aria-hidden=\"true\" />\n </button>\n <Show when={folded().length > 0}>\n <ul class=\"k2b-calendar-fold__chips\">\n <For each={folded()}>\n {(entry) => {\n const checked = () => view.checkedOf(entry.event);\n return (\n <li\n data-checkbox={checked() !== undefined ? \"true\" : undefined}\n data-checked={checked() ? \"true\" : undefined}\n style={{ \"--k2b-calendar-accent\": eventAccent(entry.event) }}\n >\n <Show when={checked() !== undefined}>\n <TimeCheck view={view} event={entry.event} />\n </Show>\n <EventChip\n event={view.normalized(entry.event, props.dayKey)}\n owner={view.props.owner}\n href={eventHref(view.props.owner, entry.event)}\n compact\n timeline\n leadingTime={entry.time}\n checkbox={checked() !== undefined}\n onCheck={view.checkOf(entry.event)}\n />\n </li>\n );\n }}\n </For>\n </ul>\n </Show>\n </div>\n }\n >\n <span\n class=\"k2b-calendar-night\"\n style={{ top: termsCss(dayYTerms(wake(), true, wake())), height: termsCss(dayHeightTermsNight(wake())) }}\n aria-hidden=\"true\"\n />\n <button\n type=\"button\"\n class=\"k2b-calendar-night__bar\"\n aria-expanded=\"true\"\n style={{ top: termsCss(dayYTerms(wake(), true, wake())) }}\n onClick={() => view.setNight(props.dayKey, false)}\n >\n <i class=\"ti ti-moon\" aria-hidden=\"true\" />\n <span>{nightLabel()}</span>\n <span class=\"k2b-calendar-night__action\">\n {view.messages().calendarFoldNight}\n <i class=\"ti ti-chevron-up\" aria-hidden=\"true\" />\n </span>\n </button>\n <For each={nightHours(wake())}>\n {(minute) => (\n <>\n <span\n class=\"k2b-calendar-days__line\"\n data-midnight={view.clock(minute) === \"00:00\" ? \"true\" : undefined}\n style={{ top: termsCss(dayYTerms(wake(), true, minute)) }}\n aria-hidden=\"true\"\n />\n <span\n class=\"k2b-calendar-days__hour\"\n data-night=\"true\"\n style={{ top: termsCss(dayYTerms(wake(), true, minute)) }}\n aria-hidden=\"true\"\n >\n {view.clock(minute)}\n </span>\n <Show when={view.clock(minute) === \"00:00\"}>\n <span class=\"k2b-calendar-days__midnight\" style={{ top: termsCss(dayYTerms(wake(), true, minute)) }} aria-hidden=\"true\">\n {shortDay(view, addDayKeys(props.dayKey, 1), true)}\n </span>\n </Show>\n </>\n )}\n </For>\n </Show>\n <For each={timeline()}>\n {(entry) =>\n entry.kind === \"gap\" ? (\n <TimeGap view={view} gap={entry.gap} dayKey={props.dayKey} expanded={expanded()} aside={gapAside(model(), entry.gap)} />\n ) : entry.kind === \"band\" ? (\n <TimeBand\n view={view}\n band={entry.band}\n dayKey={props.dayKey}\n expanded={expanded()}\n showLocation\n hourPx={56}\n scroller={props.scroller}\n />\n ) : (\n <TimeMarker\n view={view}\n event={entry.marker.item}\n minute={entry.marker.minute}\n dayKey={props.dayKey}\n expanded={expanded()}\n above={markerAbove(model(), entry.marker.minute)}\n lane={lanes().get(entry.marker)?.lane ?? 0}\n lanes={lanes().get(entry.marker)?.lanes ?? 1}\n showTime\n scroller={props.scroller}\n />\n )\n }\n </For>\n <TimeOverlays view={view} dayKey={props.dayKey} expanded={expanded()} />\n <Show when={props.hover()?.key === props.dayKey && props.hover()}>\n {(current) => (\n <span class=\"k2b-calendar-hover\" style={{ top: termsCss(dayYTerms(wake(), expanded(), current().minute)) }} aria-hidden=\"true\">\n {view.clock(current().minute)}\n </span>\n )}\n </Show>\n <Show when={nowMinute() !== null && nowMinute()! >= 0 && nowMinute()! < (expanded() ? DAY_MINUTES : wake())}>\n <div class=\"k2b-calendar-now\" style={{ top: termsCss(dayYTerms(wake(), expanded(), nowMinute()!)) }} aria-hidden=\"true\">\n <span class=\"k2b-calendar-now__time\">{view.clock(nowMinute()!)}</span>\n </div>\n </Show>\n </div>\n </section>\n );\n};\n\nconst dayHeightTermsNight = (wake: number) => {\n const total = dayHeightTerms(wake, true);\n return [0, total[1], total[2], 0] as const;\n};\n\nconst EmptyRun = (props: { view: TimeView; keys: string[]; onUnfold: (keys: readonly string[]) => void }) => {\n const view = props.view;\n const headingId = createUniqueId();\n const first = () => props.keys[0]!;\n const last = () => props.keys[props.keys.length - 1]!;\n const title = () => (props.keys.length === 1 ? longDay(view, first()) : `${shortDay(view, first())} – ${shortDay(view, last(), true)}`);\n return (\n <section\n class=\"k2b-calendar-days__day\"\n data-calendar-group=\"\"\n data-calendar-keys={props.keys.join(\",\")}\n data-empty=\"true\"\n data-past={last() < view.nowKey() ? \"true\" : undefined}\n aria-labelledby={headingId}\n >\n <header class=\"k2b-calendar-days__head\">\n <h2 class=\"k2b-calendar-days__title\" id={headingId}>\n <span class=\"k2b-calendar-days__run\">{title()}</span>\n </h2>\n <span class=\"k2b-calendar-days__note\" />\n <For each={props.keys.filter((key) => view.props.owner.dayBadges?.[key])}>\n {(key) => {\n const badge = view.props.owner.dayBadges![key]!;\n return (\n <span class=\"k2b-calendar-days__badge\" data-run=\"true\">\n <Show when={props.keys.length > 1}>\n <span class=\"k2b-calendar-days__badge-day\">{shortDay(view, key).split(/[\\s,.]/)[0]}</span>\n </Show>\n <Show when={badge.icon}>{(icon) => <i class={`ti ti-${icon()}`} aria-hidden=\"true\" />}</Show>\n {badge.label}\n </span>\n );\n }}\n </For>\n <span class=\"k2b-calendar-days__summary\">\n {props.keys.length > 1 ? view.messages().calendarDayCount({ count: props.keys.length }) : \"\"}\n </span>\n </header>\n <button type=\"button\" class=\"k2b-calendar-days__empty\" data-calendar-unfold=\"\" onClick={() => props.onUnfold(props.keys)}>\n <span>{view.messages().calendarNothingPlannedShort}</span>\n <span class=\"k2b-calendar-days__empty-action\">\n <i class=\"ti ti-arrows-vertical\" aria-hidden=\"true\" />\n {view.messages().calendarUnfoldDays({ count: props.keys.length })}\n </span>\n </button>\n </section>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/CalendarDayView.tsx"],"sourcesContent":["import {\n createComputed,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n on,\n onCleanup,\n onMount,\n Show,\n untrack,\n} from \"solid-js\";\nimport { brakedScroll, GESTURE_GAP_MS, SETTLE_RADIUS, settleTarget, stopCrossing, stopIndexAt, wheelPixels } from \"./calendar-day-scroll\";\nimport {\n addDayKeys,\n DAY_MINUTES,\n type DayGroup,\n dayGroups,\n dayHeightTerms,\n dayKeyRange,\n dayMinuteAt,\n dayY,\n dayYTerms,\n markerLanes,\n readDayGeometry,\n termsCss,\n} from \"./calendar-days\";\nimport { EventChip, eventHref } from \"./calendar-shared\";\nimport {\n AllDayChips,\n createTimeView,\n dayBands,\n dayGaps,\n daySummary,\n eventAccent,\n foldedEntries,\n gapAside,\n isNearNow,\n longDay,\n markerAbove,\n nightHours,\n reducedMotion,\n shortDay,\n soonNote,\n TimeBand,\n TimeCheck,\n TimeGap,\n TimeMarker,\n TimeOverlays,\n TimeQuickCreate,\n type TimeView,\n type TimeViewHandle,\n type TimeViewProps,\n} from \"./calendar-time-view\";\n\nconst groupId = (group: DayGroup) => (group.kind === \"day\" ? `d:${group.key}` : `e:${group.keys.join(\",\")}`);\nconst groupFirst = (group: DayGroup) => (group.kind === \"day\" ? group.key : group.keys[0]!);\n\n/**\n * The day view with `dayHours`: the loaded days one below the other in a single scroll, each with its heading kept on\n * top while it is in view. Runs of empty days fold into one row. The view slows down and settles at each day start,\n * and a line at the top of the heading fills while a day start passes.\n */\nexport const CalendarDayView = (props: TimeViewProps) => {\n const view = createTimeView(props);\n const [mounted, setMounted] = createSignal(false);\n const [unfolded, setUnfolded] = createSignal<ReadonlySet<string>>(new Set());\n const [topKey, setTopKey] = createSignal(untrack(view.anchorKey));\n const [hover, setHover] = createSignal<{ key: string; minute: number } | null>(null);\n /** Where today's day lies from the view, kept current while scrolling for the Today button's arrow. */\n const [todayPlace, setTodayPlace] = createSignal<\"up\" | \"down\" | \"\">(\"\");\n let scroller: HTMLDivElement | undefined;\n let track: HTMLDivElement | undefined;\n const helpId = createUniqueId();\n\n // The server and the first render start at the shown day, so the page never flashes the days before it; once\n // mounted the earlier days join above it without moving the view.\n const keys = createMemo(() => {\n const { first, last } = view.range();\n const anchor = view.anchorKey();\n const from = mounted() || anchor < first || anchor > last ? first : anchor;\n return dayKeyRange(from, last);\n });\n // Today and the day the reader opened never fold, so a day opened from the month shows its hours to create in.\n const groups = createMemo(() =>\n dayGroups(keys(), (key) => view.dayOf(key).empty, new Set([view.nowKey(), view.anchorKey(), ...unfolded()])),\n );\n const unfold = (keys: readonly string[]) => setUnfolded((value) => new Set([...value, ...keys]));\n const groupIds = createMemo(() => groups().map(groupId));\n const groupsById = createMemo(() => new Map(groups().map((group) => [groupId(group), group])));\n\n // Where each group starts in the scroll, measured after every change of the groups and on resize.\n let sections: HTMLElement[] = [];\n let tops: number[] = [];\n const measure = () => {\n if (!track) return;\n sections = [...track.querySelectorAll<HTMLElement>(\":scope > [data-calendar-group]\")];\n tops = sections.map((section) => section.offsetTop);\n };\n const keysOf = (section: HTMLElement | undefined) => (section?.dataset.calendarKeys ?? \"\").split(\",\").filter(Boolean);\n const sectionOf = (key: string) => sections.find((section) => keysOf(section).includes(key));\n\n /** The group at the top of the view and how far into it the view is, kept across changes above it. */\n let anchor: { key: string; delta: number } | null = null;\n /** A day the host moved to before its days loaded; it goes on screen once they arrive. */\n let pendingTarget: string | null = null;\n /** The last scroll position the view read, to tell the reader's direction. */\n let lastScrollTop = 0;\n const rememberAnchor = () => {\n if (!scroller || sections.length === 0) return;\n const index = stopIndexAt(tops, scroller.scrollTop);\n const section = sections[index];\n if (section) anchor = { key: keysOf(section)[0]!, delta: scroller.scrollTop - tops[index]! };\n };\n const restoreAnchor = () => {\n if (!scroller || !anchor) return;\n const saved = anchor;\n let index = sections.findIndex((section) => keysOf(section).includes(saved.key));\n if (index < 0) index = sections.findIndex((section) => keysOf(section)[0]! >= saved.key);\n if (index < 0) return;\n const top = tops[index]! + Math.min(saved.delta, sections[index]!.offsetHeight - 1);\n if (Math.abs(scroller.scrollTop - top) > 0.5) scroller.scrollTop = top;\n lastScrollTop = scroller.scrollTop;\n };\n\n /** The scroll position of a minute of a day, or of the day's start without a minute. */\n const topFor = (key: string, minute?: number) => {\n const section = sectionOf(key);\n if (!section) return null;\n const index = sections.indexOf(section);\n const body = section.querySelector<HTMLElement>(\"[data-calendar-body]\");\n if (minute === undefined || !body) return tops[index]!;\n const geometry = readDayGeometry(body, view.wake(), body.dataset.expanded === \"true\");\n return tops[index]! + body.offsetTop + dayY(geometry, minute);\n };\n\n // Gliding: arrows, Today, and Go to scroll smoothly; the stops and loading wait until the glide arrived.\n let glideTarget: number | null = null;\n let glideTimer = 0;\n const glide = (top: number) => {\n if (!scroller) return;\n const target = Math.round(Math.max(0, Math.min(top, scroller.scrollHeight - scroller.clientHeight)));\n glideTarget = target;\n window.clearTimeout(glideTimer);\n glideTimer = window.setTimeout(() => {\n glideTarget = null;\n }, 1600);\n // What the view keeps in place from now on is where the glide arrives, not where it started.\n const index = stopIndexAt(tops, target);\n const section = sections[index];\n if (section) anchor = { key: keysOf(section)[0]!, delta: target - tops[index]! };\n scroller.scrollTo({ top: target, behavior: reducedMotion() ? \"instant\" : \"smooth\" });\n };\n\n /** Puts a day on screen: now in the upper third today, else an hour before its first entry, else its start. */\n const positionAt = (key: string) => {\n if (!scroller) return;\n measure();\n if (key === view.nowKey()) {\n const top = topFor(key, view.nowMinute());\n // Now in the upper third, but never showing the end of the day before above the day's own heading.\n if (top !== null) scroller.scrollTop = Math.max(topFor(key) ?? 0, top - scroller.clientHeight / 3);\n lastScrollTop = scroller.scrollTop;\n return;\n }\n const model = view.dayOf(key);\n const first = Math.min(\n ...model.bands.map((band) => band.start),\n ...model.markers.map((marker) => marker.minute),\n Number.POSITIVE_INFINITY,\n );\n const start = topFor(key);\n if (start === null) return;\n const entry = Number.isFinite(first) && first > 120 ? topFor(key, first - 60) : null;\n scroller.scrollTop = entry === null ? start : Math.max(start, entry - 44);\n lastScrollTop = scroller.scrollTop;\n };\n\n // Input: the wheel brakes at day starts; a resting scroll glides onto a near one.\n let lastInput: \"wheel\" | \"touch\" | \"other\" = \"other\";\n let fingers = 0;\n let settling = false;\n let restTimer = 0;\n let frame = 0;\n let ready = false;\n let carry = 0;\n let lastWheel = 0;\n const settle = () => {\n if (!scroller || fingers > 0 || settling || glideTarget !== null || view.dragging()) return;\n const target = settleTarget(tops.slice(1), scroller.scrollTop, lastInput === \"touch\" ? SETTLE_RADIUS.touch : SETTLE_RADIUS.wheel);\n if (target === undefined) return;\n settling = true;\n scroller.scrollTo({ top: target, behavior: reducedMotion() ? \"instant\" : \"smooth\" });\n window.setTimeout(() => {\n settling = false;\n }, 450);\n };\n const onWheel = (event: WheelEvent) => {\n if (!scroller || event.ctrlKey || Math.abs(event.deltaX) > Math.abs(event.deltaY) || view.dragging()) return;\n const delta = wheelPixels(event.deltaY, event.deltaMode, scroller.clientHeight);\n const top = scroller.scrollTop;\n const max = scroller.scrollHeight - scroller.clientHeight;\n // At the ends the wheel asks for more days instead.\n if ((delta > 0 && top >= max - 1) || (delta < 0 && top <= 1)) {\n loadMore(delta > 0 ? \"later\" : \"earlier\");\n return;\n }\n if (event.timeStamp - lastWheel > GESTURE_GAP_MS) carry = 0;\n // A gesture that goes on takes over from a glide onto a day start; the view settles again once it rests.\n settling = false;\n lastWheel = event.timeStamp;\n const next = brakedScroll(tops, top + carry, delta);\n lastInput = \"wheel\";\n if (next === undefined) {\n carry = 0;\n return;\n }\n event.preventDefault();\n glideTarget = null;\n const bounded = Math.max(0, Math.min(max, next));\n scroller.scrollTop = bounded;\n // Steps too small for a pixel add up instead of vanishing.\n carry = bounded - scroller.scrollTop;\n };\n\n // Loading: each end asks once per range, and only after the view settled at its first position.\n let askedEarlier = \"\";\n let askedLater = \"\";\n const loadMore = (edge: \"earlier\" | \"later\") => {\n // Days that come in above move the view, so they wait for a glide to arrive; days below move nothing.\n if (!ready || view.dragging() || (edge === \"earlier\" && glideTarget !== null)) return;\n const { first, last } = view.range();\n if (edge === \"earlier\" && props.owner.onLoadEarlier && askedEarlier !== first) {\n askedEarlier = first;\n void props.owner.onLoadEarlier();\n }\n if (edge === \"later\" && props.owner.onLoadLater && askedLater !== last) {\n askedLater = last;\n void props.owner.onLoadLater();\n }\n };\n\n let reportTimer = 0;\n let reported = \"\";\n /** Tells the host the days the reader sees once they changed, after the scroll calmed down. */\n const reportVisible = () => {\n const { first, last } = untrack(visibleKeys);\n if (`${first}/${last}` === reported) return;\n reported = `${first}/${last}`;\n window.clearTimeout(reportTimer);\n reportTimer = window.setTimeout(\n () => props.owner.onVisibleDateChange?.(view.parseKey(first), view.parseKey(last), view.parseKey(first)),\n 250,\n );\n };\n const updateChrome = () => {\n if (!scroller) return;\n const top = scroller.scrollTop;\n const index = stopIndexAt(tops, top);\n const key = keysOf(sections[index])[0];\n if (key && key !== untrack(topKey)) setTopKey(key);\n reportVisible();\n for (const [position, section] of sections.entries()) {\n const head = section.firstElementChild as HTMLElement | null;\n if (!head) continue;\n const crossing = position > 0 ? stopCrossing(tops[position]!, top) : 0;\n if (crossing > 0) head.style.setProperty(\"--k2b-calendar-cross\", String(crossing));\n else if (head.style.getPropertyValue(\"--k2b-calendar-cross\")) head.style.removeProperty(\"--k2b-calendar-cross\");\n }\n setTodayPlace(placeOfToday());\n // Only the reader's own scrolling asks for more: days that came in above push the view down, and runs of empty\n // days are short, so asking whenever the view is near an end would load one empty week after the other.\n const direction = Math.sign(top - lastScrollTop);\n lastScrollTop = top;\n if (direction > 0 && top + scroller.clientHeight > scroller.scrollHeight - 2 * scroller.clientHeight) loadMore(\"later\");\n else if (direction < 0 && top < scroller.clientHeight) loadMore(\"earlier\");\n rememberAnchor();\n };\n const onScroll = () => {\n if (!scroller) return;\n if (glideTarget !== null && Math.abs(scroller.scrollTop - glideTarget) < 2) glideTarget = null;\n if (!frame)\n frame = requestAnimationFrame(() => {\n frame = 0;\n updateChrome();\n });\n window.clearTimeout(restTimer);\n restTimer = window.setTimeout(settle, lastInput === \"touch\" ? 90 : 160);\n };\n\n onMount(() => {\n setMounted(true);\n queueMicrotask(() => {\n positionAt(view.anchorKey());\n rememberAnchor();\n ready = true;\n updateChrome();\n });\n const observer =\n typeof ResizeObserver === \"undefined\"\n ? undefined\n : new ResizeObserver(() => {\n measure();\n // A glide owns the scroll until it arrives; putting the view back meanwhile would stop it.\n if (glideTarget === null) restoreAnchor();\n });\n if (track) observer?.observe(track);\n onCleanup(() => {\n observer?.disconnect();\n window.clearTimeout(restTimer);\n window.clearTimeout(reportTimer);\n window.clearTimeout(glideTimer);\n if (frame) cancelAnimationFrame(frame);\n });\n });\n // Before new days or an unfolded run change the page, note where the reader is from the page as it stands: the\n // place remembered in the last frame can be a scroll behind on a busy page. A computation runs before any render\n // effect touches the page.\n createComputed(\n on(\n () => [groupIds(), view.days()] as const,\n () => {\n if (!untrack(mounted)) return;\n measure();\n rememberAnchor();\n },\n { defer: true },\n ),\n );\n // New days above or below, a folded night, or an unfolded run: keep what the reader looks at in place.\n createEffect(\n on(\n () => [groupIds(), view.days()] as const,\n () => {\n if (!untrack(mounted)) return;\n measure();\n if (pendingTarget && loaded(pendingTarget)) {\n positionAt(pendingTarget);\n pendingTarget = null;\n rememberAnchor();\n } else restoreAnchor();\n updateChrome();\n },\n { defer: true },\n ),\n );\n // Another date from the host puts that day on screen.\n createEffect(\n on(\n view.anchorKey,\n (key) => {\n if (!untrack(mounted)) return;\n pendingTarget = loaded(key) ? null : key;\n if (pendingTarget) return;\n if (key === untrack(visibleKeys).first) {\n rememberAnchor();\n return;\n }\n queueMicrotask(() => {\n positionAt(key);\n rememberAnchor();\n updateChrome();\n });\n },\n { defer: true },\n ),\n );\n\n /** Whether today's day is above, below, or in the view. */\n const placeOfToday = (): \"up\" | \"down\" | \"\" => {\n const key = view.nowKey();\n if (!scroller) return \"\";\n const section = sectionOf(key);\n if (!section) return key < untrack(topKey) ? \"up\" : \"down\";\n const index = sections.indexOf(section);\n const top = scroller.scrollTop;\n if (tops[index]! + section.offsetHeight < top) return \"up\";\n if (tops[index]! > top + scroller.clientHeight) return \"down\";\n return \"\";\n };\n const visibleKeys = () => {\n const first = topKey();\n if (!scroller || sections.length === 0) return { first, last: first };\n const bottom = scroller.scrollTop + scroller.clientHeight;\n const index = stopIndexAt(tops, bottom - 1);\n const keysAtBottom = keysOf(sections[index]);\n return { first, last: keysAtBottom[keysAtBottom.length - 1] ?? first };\n };\n const loaded = (key: string) => key >= view.range().first && key <= view.range().last;\n const goTo = (key: string) => {\n if (!loaded(key) || !scroller) return false;\n // A day inside a run of empty days opens on its own, so the view goes to that day and not to the run.\n if (untrack(groups).some((group) => group.kind === \"empty\" && group.keys.includes(key))) unfold([key]);\n measure();\n const top = topFor(key);\n if (top === null) return false;\n glide(top);\n return true;\n };\n const handle: TimeViewHandle = {\n visibleKeys,\n step: (direction) => {\n if (!scroller) return false;\n measure();\n const top = scroller.scrollTop;\n const index = stopIndexAt(tops, top);\n const target = direction > 0 ? tops[index + 1] : top - tops[index]! > 8 ? tops[index] : tops[index - 1];\n if (target === undefined) return false;\n glide(target);\n return true;\n },\n goTo,\n today: () => {\n const key = view.nowKey();\n if (!loaded(key) || !scroller) return false;\n measure();\n const top = topFor(key, view.nowMinute());\n if (top === null) return false;\n glide(Math.max(topFor(key) ?? 0, top - scroller.clientHeight / 3));\n return true;\n },\n todayDirection: () => {\n const key = view.nowKey();\n const { first, last } = view.range();\n if (key < first) return \"up\";\n if (key > last) return \"down\";\n return todayPlace();\n },\n controller: {\n quickCreate: (create) => {\n const target = view.createTarget(visibleKeys());\n const body = scroller?.querySelector<HTMLElement>(`[data-calendar-body=\"${target.key}\"]`);\n view.openQuickCreate(\n target.key,\n target.start,\n target.end,\n anchorFor(target.key, target.start, target.end) ?? body ?? scroller!,\n create,\n );\n },\n createTarget: () => {\n const target = view.createTarget(visibleKeys());\n return view.rangeOfSelection(target);\n },\n dragIn: (event, item, onDrop) => view.dragIn(event, item, onDrop, scroller),\n },\n };\n /** The place of a slot on screen for the quick create, when it is in view. */\n const anchorFor = (key: string, start: number, end: number): DOMRect | null => {\n const body = scroller?.querySelector<HTMLElement>(`[data-calendar-body=\"${key}\"]`);\n if (!body || !scroller) return null;\n const rect = body.getBoundingClientRect();\n const bounds = scroller.getBoundingClientRect();\n const geometry = readDayGeometry(body, view.wake(), body.dataset.expanded === \"true\");\n const top = rect.top + dayY(geometry, start);\n const bottom = rect.top + dayY(geometry, end);\n if (bottom < bounds.top + 40 || top > bounds.bottom - 20) return null;\n const left = rect.left + 56;\n const clampedTop = Math.max(bounds.top, top);\n return new DOMRect(left, clampedTop, Math.min(rect.right - left, 320), Math.max(8, Math.min(bottom, bounds.bottom) - clampedTop));\n };\n onMount(() => props.register(handle));\n onCleanup(() => props.register(null));\n\n /** Tab into the stream lands on the first stop on screen, not on the first loaded day weeks above. */\n let tabbedAt = -1e9;\n onMount(() => {\n const note = (event: KeyboardEvent) => {\n if (event.key === \"Tab\") {\n tabbedAt = performance.now();\n if (scroller) restingTop = scroller.scrollTop;\n }\n };\n window.addEventListener(\"keydown\", note, true);\n onCleanup(() => window.removeEventListener(\"keydown\", note, true));\n });\n let restingTop = 0;\n const onFocusIn = (event: FocusEvent) => {\n if (!scroller) return;\n const from = event.relatedTarget instanceof Node ? event.relatedTarget : null;\n if (performance.now() - tabbedAt > 400 || (from && scroller.contains(from))) {\n restingTop = scroller.scrollTop;\n return;\n }\n // Undo the scroll to the focused stop, which some engines make before this runs and some after; a stop on screen\n // keeps the focus.\n if (Math.abs(scroller.scrollTop - restingTop) >= 1) scroller.scrollTop = restingTop;\n const bounds = scroller.getBoundingClientRect();\n const visible = (element: Element) => {\n const rect = element.getBoundingClientRect();\n return rect.height > 0 && rect.top >= bounds.top - 1 && rect.bottom <= bounds.bottom + 1;\n };\n if (event.target instanceof Element && visible(event.target)) return;\n const stops = [...scroller.querySelectorAll<HTMLElement>(\"a[href],button:not([tabindex='-1'])\")].filter(visible);\n const back = Boolean(from && scroller.compareDocumentPosition(from) & Node.DOCUMENT_POSITION_FOLLOWING);\n (back ? stops[stops.length - 1] : stops[0])?.focus({ preventScroll: true });\n };\n\n return (\n <div class=\"k2b-calendar-days\" data-view=\"day\" data-dragging={view.dragging() || undefined}>\n <div\n ref={scroller}\n class=\"k2b-calendar-days__scroll k2b-detail-trail\"\n tabIndex={-1}\n aria-describedby={helpId}\n onScroll={onScroll}\n onWheel={onWheel}\n onTouchStart={(event) => {\n fingers = event.touches.length;\n lastInput = \"touch\";\n glideTarget = null;\n }}\n onTouchEnd={(event) => {\n fingers = event.touches.length;\n }}\n onTouchCancel={(event) => {\n fingers = event.touches.length;\n }}\n onFocusIn={onFocusIn}\n >\n <div ref={track} class=\"k2b-calendar-days__track\">\n <For each={groupIds()}>\n {(id) => {\n const group = () => groupsById().get(id);\n return (\n <Show when={group()}>\n {(current) =>\n current().kind === \"day\" ? (\n <DaySection view={view} dayKey={groupFirst(current())} hover={hover} setHover={setHover} scroller={() => scroller} />\n ) : (\n <EmptyRun view={view} keys={(current() as Extract<DayGroup, { kind: \"empty\" }>).keys} onUnfold={unfold} />\n )\n }\n </Show>\n );\n }}\n </For>\n <Show when={props.owner.onLoadLater}>\n <p class=\"k2b-calendar-days__more\">{view.messages().calendarMoreDays}</p>\n </Show>\n </div>\n </div>\n <p class=\"k2b-calendar-sr\" id={helpId}>\n {view.messages().calendarDayKeyboardHelp}\n </p>\n <TimeQuickCreate view={view} />\n </div>\n );\n};\n\nconst DaySection = (props: {\n view: TimeView;\n dayKey: string;\n hover: () => { key: string; minute: number } | null;\n setHover: (value: { key: string; minute: number } | null) => void;\n scroller: () => HTMLElement | undefined;\n}) => {\n const view = props.view;\n const model = createMemo(() => view.dayOf(props.dayKey));\n const expanded = () => view.nightOpen(props.dayKey, model());\n const headingId = createUniqueId();\n const badge = () => view.props.owner.dayBadges?.[props.dayKey];\n const today = () => props.dayKey === view.calendarToday();\n const selectedDay = () => {\n const current = view.selection();\n return Boolean(current && current.key === props.dayKey && current.start === undefined);\n };\n const soon = () => soonNote(view, props.dayKey);\n const wake = () => view.wake();\n const nowMinute = () => (props.dayKey === view.nowKey() ? view.nowMinute() : null);\n const bands = createMemo(() => dayBands(view, props.dayKey, expanded()));\n const gaps = createMemo(() => dayGaps(view, props.dayKey));\n const markers = () => model().markers.filter((marker) => marker.minute < (expanded() ? DAY_MINUTES : wake()));\n /** Deadlines whose pills would cover each other share the width; keyed by marker, so rows keep their elements. */\n const lanes = createMemo(() => new Map(markerLanes(markers(), wake()).map((entry) => [entry.item, entry])));\n const folded = () => (expanded() ? [] : foldedEntries(view, props.dayKey));\n const nightLabel = () =>\n view.messages().calendarNight({ from: shortDay(view, props.dayKey), to: shortDay(view, addDayKeys(props.dayKey, 1)) });\n const foldLabel = () =>\n view.messages().calendarNightHours({\n from: view.clock(wake()).slice(0, 2),\n to: view.clock(DAY_MINUTES).slice(0, 2),\n });\n\n // Gaps, bands, and markers in one time order, so Tab runs through the day as it reads. Unchanged rows keep their\n // elements and focus when the clock updates the gaps.\n const timeline = createMemo<\n Array<\n | { at: number; kind: \"gap\"; gap: ReturnType<typeof gaps>[number] }\n | { at: number; kind: \"band\"; band: ReturnType<typeof bands>[number] }\n | { at: number; kind: \"marker\"; marker: ReturnType<typeof markers>[number] }\n >\n >(\n (previous) =>\n [\n ...gaps().map(\n (gap) =>\n previous.find(\n (row) => row.kind === \"gap\" && row.gap.start === gap.start && row.gap.end === gap.end && row.gap.past === gap.past,\n ) ?? { at: gap.start, kind: \"gap\" as const, gap },\n ),\n ...bands().map(\n (band) =>\n previous.find((row) => row.kind === \"band\" && row.band === band) ?? {\n at: Math.max(0, band.start),\n kind: \"band\" as const,\n band,\n },\n ),\n ...markers().map(\n (marker) =>\n previous.find((row) => row.kind === \"marker\" && row.marker === marker) ?? {\n at: marker.minute,\n kind: \"marker\" as const,\n marker,\n },\n ),\n ].sort((left, right) => left.at - right.at),\n [],\n );\n\n const isEmptyTarget = (target: EventTarget | null) =>\n target instanceof Element &&\n !target.closest(\"a,button,[data-calendar-event],.k2b-calendar-band,.k2b-calendar-marker,.k2b-calendar-draft,.k2b-calendar-fold\");\n const minuteAt = (element: HTMLElement, clientY: number) => {\n const geometry = readDayGeometry(element, wake(), expanded());\n const rect = element.getBoundingClientRect();\n return Math.max(0, Math.min((expanded() ? DAY_MINUTES : wake()) - 15, dayMinuteAt(geometry, clientY - rect.top)));\n };\n let lastPointer = \"mouse\";\n\n return (\n <section\n class=\"k2b-calendar-days__day\"\n data-calendar-group=\"\"\n data-calendar-keys={props.dayKey}\n aria-labelledby={headingId}\n data-today={today() ? \"true\" : undefined}\n data-past={props.dayKey < view.nowKey() ? \"true\" : undefined}\n data-selected={selectedDay() ? \"true\" : undefined}\n >\n <header class=\"k2b-calendar-days__head\">\n <h2 class=\"k2b-calendar-days__title\" id={headingId}>\n <button\n type=\"button\"\n class=\"k2b-calendar-days__title-button\"\n aria-pressed={selectedDay() ? \"true\" : \"false\"}\n onClick={() => {\n view.setTouchDraft(null);\n view.setSelection(selectedDay() ? null : { key: props.dayKey });\n }}\n >\n <Show when={today()}>\n <span class=\"k2b-calendar-days__today\">{view.props.labels.today}</span>\n </Show>\n <span class=\"k2b-calendar-days__long\">{longDay(view, props.dayKey)}</span>\n <span class=\"k2b-calendar-days__short\">{shortDay(view, props.dayKey, true)}</span>\n </button>\n </h2>\n <span class=\"k2b-calendar-days__note\" data-cheer={view.cheered() === props.dayKey ? \"true\" : undefined}>\n <span class=\"k2b-calendar-days__soon\">\n <Show when={soon()}>\n <i class=\"ti ti-clock\" aria-hidden=\"true\" />\n <span>{soon()}</span>\n </Show>\n </span>\n {/* Screen readers hear it as an announcement; this only marks the moment. */}\n <span class=\"k2b-calendar-days__cheer\" aria-hidden=\"true\">\n <i class=\"ti ti-confetti\" aria-hidden=\"true\" />\n {view.messages().calendarAllDone}\n </span>\n </span>\n <Show when={badge()}>\n {(current) => (\n <span class=\"k2b-calendar-days__badge\">\n <Show when={current().icon}>{(icon) => <i class={`ti ti-${icon()}`} aria-hidden=\"true\" />}</Show>\n {current().label}\n </span>\n )}\n </Show>\n <span class=\"k2b-calendar-days__summary\">{daySummary(view, props.dayKey)}</span>\n </header>\n <Show when={model().spans.length > 0}>\n <div class=\"k2b-calendar-days__all-day\" role=\"group\" aria-label={view.messages().calendarAllDayAndDue}>\n <AllDayChips view={view} dayKey={props.dayKey} spans={model().spans} />\n </div>\n </Show>\n {/* biome-ignore lint/a11y/noStaticElementInteractions: free time is reached through its gap buttons; the pointer adds drawing and slots. */}\n <div\n ref={(element) => view.registerBody(props.dayKey, element, expanded)}\n class=\"k2b-calendar-days__body\"\n data-calendar-body={props.dayKey}\n data-expanded={expanded() ? \"true\" : \"false\"}\n style={{ height: termsCss(dayHeightTerms(wake(), expanded())) }}\n onPointerDown={(event) => {\n lastPointer = event.pointerType;\n if (event.button !== 0 || !isEmptyTarget(event.target)) return;\n view.startDraw(event, props.dayKey, props.scroller());\n }}\n // Some engines send a tap as touch events only; a tap is a tap either way.\n onTouchStart={() => {\n lastPointer = \"touch\";\n }}\n // Listening on the timeline itself, not through delegation, makes it a tap target on iOS.\n on:click={(event) => {\n if (!isEmptyTarget(event.target) || !view.canCreate()) return;\n const minute = Math.floor(minuteAt(event.currentTarget, event.clientY) / 30) * 30;\n const end = Math.min(minute + 60, expanded() ? DAY_MINUTES : wake());\n if (lastPointer === \"mouse\") {\n view.setTouchDraft(null);\n view.setSelection({ key: props.dayKey, start: minute, end });\n return;\n }\n view.setTouchDraft({ key: props.dayKey, start: minute, end });\n view.setSelection({ key: props.dayKey, start: minute, end });\n }}\n onDblClick={(event) => {\n if (!isEmptyTarget(event.target) || lastPointer !== \"mouse\") return;\n const minute = Math.floor(minuteAt(event.currentTarget, event.clientY) / 30) * 30;\n view.openQuickCreate(props.dayKey, minute, Math.min(minute + 60, expanded() ? DAY_MINUTES : wake()), event.currentTarget);\n }}\n onPointerMove={(event) => {\n if (event.pointerType !== \"mouse\" || view.dragging() || !isEmptyTarget(event.target)) {\n if (props.hover()?.key === props.dayKey) props.setHover(null);\n return;\n }\n const minute = Math.floor(minuteAt(event.currentTarget, event.clientY) / 15) * 15;\n props.setHover({ key: props.dayKey, minute });\n }}\n onPointerLeave={() => {\n if (props.hover()?.key === props.dayKey) props.setHover(null);\n }}\n >\n <For each={Array.from({ length: wake() / 60 + 1 }, (_, index) => index * 60)}>\n {(minute) => (\n <>\n <span class=\"k2b-calendar-days__line\" style={{ top: termsCss(dayYTerms(wake(), expanded(), minute)) }} aria-hidden=\"true\" />\n <span\n class=\"k2b-calendar-days__hour\"\n data-near-now={isNearNow(view, props.dayKey, minute) ? \"true\" : undefined}\n style={{ top: termsCss(dayYTerms(wake(), expanded(), minute)) }}\n aria-hidden=\"true\"\n >\n {view.clock(minute)}\n </span>\n </>\n )}\n </For>\n <Show\n when={expanded()}\n fallback={\n <div class=\"k2b-calendar-fold\" style={{ top: `calc(${termsCss(dayYTerms(wake(), false, wake()))} + 3px)` }}>\n <button\n type=\"button\"\n class=\"k2b-calendar-fold__toggle\"\n aria-expanded=\"false\"\n aria-label={view.messages().calendarOpenNight}\n onClick={() => view.setNight(props.dayKey, true)}\n >\n <i class=\"ti ti-moon\" aria-hidden=\"true\" />\n <span>{foldLabel()}</span>\n <i class=\"ti ti-chevron-down\" aria-hidden=\"true\" />\n </button>\n <Show when={folded().length > 0}>\n <ul class=\"k2b-calendar-fold__chips\">\n <For each={folded()}>\n {(entry) => {\n const checked = () => view.checkedOf(entry.event);\n return (\n <li\n data-checkbox={checked() !== undefined ? \"true\" : undefined}\n data-checked={checked() ? \"true\" : undefined}\n style={{ \"--k2b-calendar-accent\": eventAccent(entry.event) }}\n >\n <Show when={checked() !== undefined}>\n <TimeCheck view={view} event={entry.event} />\n </Show>\n <EventChip\n event={view.normalized(entry.event, props.dayKey)}\n owner={view.props.owner}\n href={eventHref(view.props.owner, entry.event)}\n compact\n timeline\n leadingTime={entry.time}\n checkbox={checked() !== undefined}\n onCheck={view.checkOf(entry.event)}\n />\n </li>\n );\n }}\n </For>\n </ul>\n </Show>\n </div>\n }\n >\n <span\n class=\"k2b-calendar-night\"\n style={{ top: termsCss(dayYTerms(wake(), true, wake())), height: termsCss(dayHeightTermsNight(wake())) }}\n aria-hidden=\"true\"\n />\n <button\n type=\"button\"\n class=\"k2b-calendar-night__bar\"\n aria-expanded=\"true\"\n style={{ top: termsCss(dayYTerms(wake(), true, wake())) }}\n onClick={() => view.setNight(props.dayKey, false)}\n >\n <i class=\"ti ti-moon\" aria-hidden=\"true\" />\n <span>{nightLabel()}</span>\n <span class=\"k2b-calendar-night__action\">\n {view.messages().calendarFoldNight}\n <i class=\"ti ti-chevron-up\" aria-hidden=\"true\" />\n </span>\n </button>\n <For each={nightHours(wake())}>\n {(minute) => (\n <>\n <span\n class=\"k2b-calendar-days__line\"\n data-midnight={view.clock(minute) === \"00:00\" ? \"true\" : undefined}\n style={{ top: termsCss(dayYTerms(wake(), true, minute)) }}\n aria-hidden=\"true\"\n />\n <span\n class=\"k2b-calendar-days__hour\"\n data-night=\"true\"\n style={{ top: termsCss(dayYTerms(wake(), true, minute)) }}\n aria-hidden=\"true\"\n >\n {view.clock(minute)}\n </span>\n <Show when={view.clock(minute) === \"00:00\"}>\n <span class=\"k2b-calendar-days__midnight\" style={{ top: termsCss(dayYTerms(wake(), true, minute)) }} aria-hidden=\"true\">\n {shortDay(view, addDayKeys(props.dayKey, 1), true)}\n </span>\n </Show>\n </>\n )}\n </For>\n </Show>\n <For each={timeline()}>\n {(entry) =>\n entry.kind === \"gap\" ? (\n <TimeGap view={view} gap={entry.gap} dayKey={props.dayKey} expanded={expanded()} aside={gapAside(model(), entry.gap)} />\n ) : entry.kind === \"band\" ? (\n <TimeBand\n view={view}\n band={entry.band}\n dayKey={props.dayKey}\n expanded={expanded()}\n showLocation\n hourPx={56}\n scroller={props.scroller}\n />\n ) : (\n <TimeMarker\n view={view}\n event={entry.marker.item}\n minute={entry.marker.minute}\n dayKey={props.dayKey}\n expanded={expanded()}\n above={markerAbove(model(), entry.marker.minute)}\n lane={lanes().get(entry.marker)?.lane ?? 0}\n lanes={lanes().get(entry.marker)?.lanes ?? 1}\n showTime\n scroller={props.scroller}\n />\n )\n }\n </For>\n <TimeOverlays view={view} dayKey={props.dayKey} expanded={expanded()} />\n <Show when={props.hover()?.key === props.dayKey && props.hover()}>\n {(current) => (\n <span class=\"k2b-calendar-hover\" style={{ top: termsCss(dayYTerms(wake(), expanded(), current().minute)) }} aria-hidden=\"true\">\n {view.clock(current().minute)}\n </span>\n )}\n </Show>\n <Show when={nowMinute() !== null && nowMinute()! >= 0 && nowMinute()! < (expanded() ? DAY_MINUTES : wake())}>\n <div class=\"k2b-calendar-now\" style={{ top: termsCss(dayYTerms(wake(), expanded(), nowMinute()!)) }} aria-hidden=\"true\">\n <span class=\"k2b-calendar-now__time\">{view.clock(nowMinute()!)}</span>\n </div>\n </Show>\n </div>\n </section>\n );\n};\n\nconst dayHeightTermsNight = (wake: number) => {\n const total = dayHeightTerms(wake, true);\n return [0, total[1], total[2], 0] as const;\n};\n\nconst EmptyRun = (props: { view: TimeView; keys: string[]; onUnfold: (keys: readonly string[]) => void }) => {\n const view = props.view;\n const headingId = createUniqueId();\n const first = () => props.keys[0]!;\n const last = () => props.keys[props.keys.length - 1]!;\n const title = () => (props.keys.length === 1 ? longDay(view, first()) : `${shortDay(view, first())} – ${shortDay(view, last(), true)}`);\n return (\n <section\n class=\"k2b-calendar-days__day\"\n data-calendar-group=\"\"\n data-calendar-keys={props.keys.join(\",\")}\n data-empty=\"true\"\n data-past={last() < view.nowKey() ? \"true\" : undefined}\n aria-labelledby={headingId}\n >\n <header class=\"k2b-calendar-days__head\">\n <h2 class=\"k2b-calendar-days__title\" id={headingId}>\n <span class=\"k2b-calendar-days__run\">{title()}</span>\n </h2>\n <span class=\"k2b-calendar-days__note\" />\n <For each={props.keys.filter((key) => view.props.owner.dayBadges?.[key])}>\n {(key) => {\n const badge = view.props.owner.dayBadges![key]!;\n return (\n <span class=\"k2b-calendar-days__badge\" data-run=\"true\">\n <Show when={props.keys.length > 1}>\n <span class=\"k2b-calendar-days__badge-day\">{shortDay(view, key).split(/[\\s,.]/)[0]}</span>\n </Show>\n <Show when={badge.icon}>{(icon) => <i class={`ti ti-${icon()}`} aria-hidden=\"true\" />}</Show>\n {badge.label}\n </span>\n );\n }}\n </For>\n <span class=\"k2b-calendar-days__summary\">\n {props.keys.length > 1 ? view.messages().calendarDayCount({ count: props.keys.length }) : \"\"}\n </span>\n </header>\n <button type=\"button\" class=\"k2b-calendar-days__empty\" data-calendar-unfold=\"\" onClick={() => props.onUnfold(props.keys)}>\n <span>{view.messages().calendarNothingPlannedShort}</span>\n <span class=\"k2b-calendar-days__empty-action\">\n <i class=\"ti ti-arrows-vertical\" aria-hidden=\"true\" />\n {view.messages().calendarUnfoldDays({ count: props.keys.length })}\n </span>\n </button>\n </section>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -7,7 +7,7 @@ import { escape as _$escape } from "solid-js/web";
|
|
|
7
7
|
var _tmpl$ = ["<span class=\"k2b-calendar-week__now-time\" style=\"", "\" aria-hidden=\"true\">", "</span>"],
|
|
8
8
|
_tmpl$2 = ["<span class=\"k2b-calendar-night\" style=\"", "\"></span>"],
|
|
9
9
|
_tmpl$3 = ["<span class=\"k2b-calendar-week__now-line\" style=\"", "\"></span>"],
|
|
10
|
-
_tmpl$4 = ["<div class=\"k2b-calendar-week\" data-view=\"week\"", "><div class=\"k2b-calendar-week__scroll\" role=\"group\"", " style=\"", "\"><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\"", " style=\"", "\">", "", "</div></div><div class=\"k2b-calendar-week__body\" style=\"", "\"><div class=\"k2b-calendar-week__gutter\">", "", "<button type=\"button\" class=\"k2b-calendar-week__moon\"", " style=\"", "\"><i class=\"ti ti-moon\" aria-hidden=\"true\"></i><i class=\"", "\" 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>", "</div>"],
|
|
10
|
+
_tmpl$4 = ["<div class=\"k2b-calendar-week\" data-view=\"week\"", "><div class=\"k2b-calendar-week__scroll k2b-detail-trail\" role=\"group\"", " style=\"", "\"><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\"", " style=\"", "\">", "", "</div></div><div class=\"k2b-calendar-week__body\" style=\"", "\"><div class=\"k2b-calendar-week__gutter\">", "", "<button type=\"button\" class=\"k2b-calendar-week__moon\"", " style=\"", "\"><i class=\"ti ti-moon\" aria-hidden=\"true\"></i><i class=\"", "\" 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>", "</div>"],
|
|
11
11
|
_tmpl$5 = ["<button type=\"button\" class=\"k2b-calendar-week__head\"", " data-stop=\"", "\"", " data-minute=\"-2\"", " style=\"", "\"><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\">", "</span></span></button>"],
|
|
12
12
|
_tmpl$6 = ["<span class=\"k2b-calendar-week__badge\">", "", "</span>"],
|
|
13
13
|
_tmpl$7 = ["<i class=\"", "\" aria-hidden=\"true\"></i>"],
|
|
@@ -39,7 +39,7 @@ const HINT_SLACK_PX = 36;
|
|
|
39
39
|
/**
|
|
40
40
|
* The week view with `dayHours`: the loaded days side by side in one strip, seven on a wide screen and three on a
|
|
41
41
|
* phone. A trackpad, Shift with the wheel, or a finger scroll it sideways day by day; each gesture keeps the axis it
|
|
42
|
-
* started on, and the strip settles on a day
|
|
42
|
+
* started on, and the strip settles on a day edge. The arrows move by whole weeks.
|
|
43
43
|
*/
|
|
44
44
|
export const CalendarWeekView = props => {
|
|
45
45
|
const view = createTimeView(props);
|
|
@@ -170,19 +170,27 @@ export const CalendarWeekView = props => {
|
|
|
170
170
|
if (`${first}/${last}` === reported) return;
|
|
171
171
|
reported = `${first}/${last}`;
|
|
172
172
|
window.clearTimeout(reportTimer);
|
|
173
|
-
reportTimer = window.setTimeout(() => props.owner.onVisibleDateChange?.(view.parseKey(first), view.parseKey(last)), 250);
|
|
173
|
+
reportTimer = window.setTimeout(() => props.owner.onVisibleDateChange?.(view.parseKey(first), view.parseKey(last), view.parseKey(first)), 250);
|
|
174
174
|
};
|
|
175
175
|
|
|
176
|
-
// A gesture keeps its axis; the strip settles on a day
|
|
176
|
+
// A gesture keeps its axis; the strip settles on a day edge once the scroll rests.
|
|
177
177
|
let axis = null;
|
|
178
178
|
let lastWheel = 0;
|
|
179
179
|
let fingers = 0;
|
|
180
180
|
let restTimer = 0;
|
|
181
181
|
let ready = false;
|
|
182
|
+
/** Whether a wheel or a finger moved the strip since it last settled, and the way it last moved. */
|
|
183
|
+
let gesture = false;
|
|
184
|
+
let heading = 0;
|
|
185
|
+
let headingFrom = 0;
|
|
182
186
|
const settle = () => {
|
|
183
187
|
if (!scroller || fingers > 0 || settling || glideTarget !== null || view.dragging()) return;
|
|
184
188
|
const width = columnWidth();
|
|
185
|
-
const
|
|
189
|
+
const space = Number.parseFloat(getComputedStyle(scroller).scrollPaddingRight) || 0;
|
|
190
|
+
// A gesture rests on the nearest edge. A scroll without one, such as a reveal, goes on its way, so what it brought
|
|
191
|
+
// into view stays there; with end space, a revealed day can rest with its end beside the drawer.
|
|
192
|
+
const target = snapToColumn(scroller.scrollLeft, width, space > 0 ? scroller.clientWidth - gutterWidth() - space : undefined, gesture ? 0 : heading);
|
|
193
|
+
gesture = false;
|
|
186
194
|
if (Math.abs(target - scroller.scrollLeft) <= 0.5) return;
|
|
187
195
|
settling = true;
|
|
188
196
|
scroller.scrollTo({
|
|
@@ -197,6 +205,7 @@ export const CalendarWeekView = props => {
|
|
|
197
205
|
if (!scroller || event.ctrlKey || view.dragging()) return;
|
|
198
206
|
// A gesture that goes on takes over from a glide onto a day start; the strip settles again once it rests.
|
|
199
207
|
settling = false;
|
|
208
|
+
gesture = true;
|
|
200
209
|
if (event.timeStamp - lastWheel > GESTURE_GAP_MS || axis === null) axis = wheelAxis(event.deltaX, event.deltaY, event.shiftKey);
|
|
201
210
|
lastWheel = event.timeStamp;
|
|
202
211
|
const delta = wheelPixels(wheelDelta(axis, event.deltaX, event.deltaY, event.shiftKey), event.deltaMode, axis === "x" ? scroller.clientWidth : scroller.clientHeight);
|
|
@@ -241,6 +250,8 @@ export const CalendarWeekView = props => {
|
|
|
241
250
|
const onScroll = () => {
|
|
242
251
|
if (!scroller) return;
|
|
243
252
|
if (glideTarget !== null && Math.abs(scroller.scrollLeft - glideTarget) < 2) glideTarget = null;
|
|
253
|
+
if (Math.abs(scroller.scrollLeft - headingFrom) > 0.5) heading = Math.sign(scroller.scrollLeft - headingFrom);
|
|
254
|
+
headingFrom = scroller.scrollLeft;
|
|
244
255
|
if (!frame) frame = requestAnimationFrame(() => {
|
|
245
256
|
frame = 0;
|
|
246
257
|
syncFirst();
|
|
@@ -296,6 +307,9 @@ export const CalendarWeekView = props => {
|
|
|
296
307
|
}, {
|
|
297
308
|
defer: true
|
|
298
309
|
}));
|
|
310
|
+
|
|
311
|
+
/** The day width the strip last kept its first day for. */
|
|
312
|
+
let measuredWidth = 0;
|
|
299
313
|
onMount(() => {
|
|
300
314
|
setMounted(true);
|
|
301
315
|
queueMicrotask(() => {
|
|
@@ -304,10 +318,17 @@ export const CalendarWeekView = props => {
|
|
|
304
318
|
ready = true;
|
|
305
319
|
});
|
|
306
320
|
const observer = typeof ResizeObserver === "undefined" ? undefined : new ResizeObserver(() => {
|
|
321
|
+
if (!scroller) return;
|
|
322
|
+
// A reveal the scroll handler has not read yet wins over keeping the first day.
|
|
323
|
+
const unread = Math.abs(scroller.scrollLeft - lastLeft) > 0.5;
|
|
307
324
|
const before = untrack(firstIndex);
|
|
308
325
|
measureCount();
|
|
309
|
-
|
|
310
|
-
|
|
326
|
+
// Only days of a new width move the strip back onto its first day. Setting scrollLeft stops a smooth scroll
|
|
327
|
+
// on its way, such as a reveal, so a drawer's padding or the strip's own trim must not.
|
|
328
|
+
const width = columnWidth();
|
|
329
|
+
const resized = Math.abs(width - measuredWidth) > 0.01;
|
|
330
|
+
measuredWidth = width;
|
|
331
|
+
if (resized && !unread && Math.abs(scroller.scrollLeft - leftOf(before)) > 0.5) scroller.scrollLeft = leftOf(before);
|
|
311
332
|
lastLeft = scroller.scrollLeft;
|
|
312
333
|
syncFirst();
|
|
313
334
|
});
|