@k2b/ui 0.22.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/content/Calendar.js +1086 -1049
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/CalendarDayView.js +1187 -0
- package/dist/browser/content/CalendarDayView.js.map +1 -0
- package/dist/browser/content/CalendarWeekView.js +1571 -0
- package/dist/browser/content/CalendarWeekView.js.map +1 -0
- package/dist/browser/content/ChartExplorer.js +174 -82
- package/dist/browser/content/ChartExplorer.js.map +1 -1
- package/dist/browser/content/ChartFilterControls.js +90 -33
- package/dist/browser/content/ChartFilterControls.js.map +1 -1
- package/dist/browser/content/DataTable.js +199 -171
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/calendar-day-scroll.js +98 -0
- package/dist/browser/content/calendar-day-scroll.js.map +1 -0
- package/dist/browser/content/calendar-days.js +408 -0
- package/dist/browser/content/calendar-days.js.map +1 -0
- package/dist/browser/content/calendar-dialogs.js +236 -0
- package/dist/browser/content/calendar-dialogs.js.map +1 -0
- package/dist/browser/content/calendar-messages.js +210 -2
- package/dist/browser/content/calendar-messages.js.map +1 -1
- package/dist/browser/content/calendar-pointer.js +15 -3
- package/dist/browser/content/calendar-pointer.js.map +1 -1
- package/dist/browser/content/calendar-shared.js +328 -0
- package/dist/browser/content/calendar-shared.js.map +1 -0
- package/dist/browser/content/calendar-time-view.js +1649 -0
- package/dist/browser/content/calendar-time-view.js.map +1 -0
- package/dist/browser/content/chart-messages.js +10 -0
- package/dist/browser/content/chart-messages.js.map +1 -1
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/inputs/Combobox.js +0 -1
- package/dist/browser/inputs/Combobox.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +123 -97
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/PageTitle.js +4 -1
- package/dist/browser/layout/PageTitle.js.map +1 -1
- package/dist/browser/layout/app-workspace-controller.js +164 -86
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +18 -6
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/content/Calendar.js +524 -335
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/CalendarDayView.js +800 -0
- package/dist/ssr/content/CalendarDayView.js.map +1 -0
- package/dist/ssr/content/CalendarWeekView.js +1069 -0
- package/dist/ssr/content/CalendarWeekView.js.map +1 -0
- package/dist/ssr/content/ChartExplorer.js +93 -34
- package/dist/ssr/content/ChartExplorer.js.map +1 -1
- package/dist/ssr/content/ChartFilterControls.js +49 -7
- package/dist/ssr/content/ChartFilterControls.js.map +1 -1
- package/dist/ssr/content/DataTable.js +69 -51
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/calendar-day-scroll.js +98 -0
- package/dist/ssr/content/calendar-day-scroll.js.map +1 -0
- package/dist/ssr/content/calendar-days.js +408 -0
- package/dist/ssr/content/calendar-days.js.map +1 -0
- package/dist/ssr/content/calendar-dialogs.js +159 -0
- package/dist/ssr/content/calendar-dialogs.js.map +1 -0
- package/dist/ssr/content/calendar-messages.js +210 -2
- package/dist/ssr/content/calendar-messages.js.map +1 -1
- package/dist/ssr/content/calendar-pointer.js +15 -3
- package/dist/ssr/content/calendar-pointer.js.map +1 -1
- package/dist/ssr/content/calendar-shared.js +261 -0
- package/dist/ssr/content/calendar-shared.js.map +1 -0
- package/dist/ssr/content/calendar-time-view.js +1306 -0
- package/dist/ssr/content/calendar-time-view.js.map +1 -0
- package/dist/ssr/content/chart-messages.js +10 -0
- package/dist/ssr/content/chart-messages.js.map +1 -1
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/inputs/Combobox.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +38 -29
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/PageTitle.js +4 -1
- package/dist/ssr/layout/PageTitle.js.map +1 -1
- package/dist/ssr/layout/app-workspace-controller.js +164 -86
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +2 -2
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/content/Calendar.d.ts +91 -0
- package/dist/types/content/CalendarDayView.d.ts +7 -0
- package/dist/types/content/CalendarWeekView.d.ts +7 -0
- package/dist/types/content/ChartExplorer.d.ts +36 -1
- package/dist/types/content/ChartFilterControls.d.ts +6 -1
- package/dist/types/content/DataTable.d.ts +5 -0
- package/dist/types/content/calendar-day-scroll.d.ts +42 -0
- package/dist/types/content/calendar-days.d.ts +192 -0
- package/dist/types/content/calendar-dialogs.d.ts +22 -0
- package/dist/types/content/calendar-messages.d.ts +99 -0
- package/dist/types/content/calendar-pointer.d.ts +9 -0
- package/dist/types/content/calendar-shared.d.ts +69 -0
- package/dist/types/content/calendar-time-view.d.ts +252 -0
- package/dist/types/content/chart-messages.d.ts +5 -0
- package/dist/types/content/index.d.ts +2 -2
- package/dist/types/layout/AppWorkspace.d.ts +25 -3
- package/dist/types/layout/PageTitle.d.ts +2 -1
- package/dist/types/layout/app-workspace-controller.d.ts +9 -1
- package/dist/types/surfaces/StatCell.d.ts +5 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/CalendarWeekView.tsx"],"sourcesContent":["import { dates as calendar } from \"@k2b/stdlib\";\nimport {\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 type { CalendarEvent } from \"./Calendar\";\nimport { GESTURE_GAP_MS, snapToColumn, type WheelAxis, wheelAxis, wheelDelta, wheelPixels } from \"./calendar-day-scroll\";\nimport {\n addDayKeys,\n DAY_MINUTES,\n type DaySpan,\n dayHeightTerms,\n dayKeyNumber,\n dayKeyRange,\n dayMinuteAt,\n dayY,\n dayYTerms,\n markerLanes,\n readDayGeometry,\n termsCss,\n} from \"./calendar-days\";\nimport { layoutMonthWeek } from \"./calendar-month-layout\";\nimport { startCalendarPointerSession } from \"./calendar-pointer\";\nimport { EventChip, eventHref, followCalendarHref, textWidth } from \"./calendar-shared\";\nimport {\n createTimeView,\n dayBands,\n dayGaps,\n dayLoad,\n eventAccent,\n foldedEntries,\n gapAside,\n isNearNow,\n longDay,\n markerAbove,\n nightHours,\n reducedMotion,\n swallowNextClick,\n TimeBand,\n TimeCheck,\n TimeGap,\n TimeMarker,\n TimeOverlays,\n TimeQuickCreate,\n type TimeView,\n type TimeViewHandle,\n type TimeViewProps,\n weekKeysOf,\n} from \"./calendar-time-view\";\n\n/** Room a bar keeps beside its title and date hint: padding, torn edge, gap, and an icon such as a task box. */\nconst HINT_SLACK_PX = 36;\n\n/**\n * The week view with `dayHours`: the loaded days side by side in one strip, seven on a wide screen and three on a\n * phone. A trackpad, Shift with the wheel, or a finger scroll it sideways day by day; each gesture keeps the axis it\n * started on, and the strip settles on a day start. The arrows move by whole weeks.\n */\nexport const CalendarWeekView = (props: TimeViewProps) => {\n const view = createTimeView(props);\n const [mounted, setMounted] = createSignal(false);\n const [firstIndex, setFirstIndex] = createSignal(0);\n const [visibleCount, setVisibleCount] = createSignal(7);\n /** The week whose nights decide whether the night rows open, set by navigation, not by free scrolling. */\n const [nightWeek, setNightWeek] = createSignal(untrack(view.anchorKey));\n const [nightOverride, setNightOverride] = createSignal<boolean | null>(null);\n const [roving, setRoving] = createSignal(\"\");\n let scroller: HTMLDivElement | undefined;\n const helpId = createUniqueId();\n\n const anchorWeek = () => weekKeysOf(view, view.anchorKey());\n // The server and the first render draw only the shown week, so the strip never flashes the days before it.\n const keys = createMemo(() => {\n const { first, last } = view.range();\n if (mounted()) return dayKeyRange(first, last);\n const week = anchorWeek();\n return week[0]! >= first && week[6]! <= last ? week : dayKeyRange(first, last);\n });\n const indexOf = (key: string) => dayKeyNumber(key) - dayKeyNumber(keys()[0]!);\n const nightsOpen = createMemo(() => {\n const override = nightOverride();\n if (override !== null) return override;\n return weekKeysOf(view, nightWeek()).some((key) => view.dayOf(key).night);\n });\n createEffect(on(nightWeek, () => setNightOverride(null), { defer: true }));\n const wake = () => view.wake();\n\n // Columns and scrolling.\n /** The exact width of a day column: columns are a seventh or a third of the strip, rarely whole pixels. */\n const columnWidth = () => scroller?.querySelector<HTMLElement>(\"[data-calendar-column]\")?.getBoundingClientRect().width ?? 0;\n const gutterWidth = () => scroller?.querySelector<HTMLElement>(\".k2b-calendar-week__gutter\")?.offsetWidth ?? 0;\n const leftOf = (index: number) => index * columnWidth();\n const visibleIndex = () => {\n const width = columnWidth();\n return width > 0 && scroller ? Math.round(scroller.scrollLeft / width) : 0;\n };\n const visibleKeys = () => {\n const first = keys()[Math.min(keys().length - 1, Math.max(0, firstIndex()))] ?? view.anchorKey();\n return { first, last: addDayKeys(first, visibleCount() - 1) };\n };\n /** Now shows in the hours while today is among the days in view, like the prototype's week. */\n const nowShown = () => {\n const { first, last } = visibleKeys();\n const today = view.nowKey();\n return today >= first && today <= last && view.nowMinute() >= 0 && view.nowMinute() < (nightsOpen() ? DAY_MINUTES : wake());\n };\n\n let settling = false;\n let glideTarget: number | null = null;\n let glideTimer = 0;\n const glideTo = (left: number, top?: number) => {\n if (!scroller) return;\n const target = Math.max(0, Math.min(left, scroller.scrollWidth - scroller.clientWidth));\n glideTarget = target;\n window.clearTimeout(glideTimer);\n glideTimer = window.setTimeout(() => {\n glideTarget = null;\n }, 1600);\n scroller.scrollTo({ left: target, ...(top === undefined ? {} : { top }), behavior: reducedMotion() ? \"instant\" : \"smooth\" });\n };\n /** The scroll position of a minute in the timeline, with now in the upper third. */\n const topFor = (minute: number) => {\n if (!scroller) return 0;\n const body = scroller.querySelector<HTMLElement>(\"[data-calendar-body]\");\n const head = scroller.querySelector<HTMLElement>(\".k2b-calendar-week__top\");\n if (!body || !head) return 0;\n const geometry = readDayGeometry(body, wake(), nightsOpen());\n const offset = body.getBoundingClientRect().top - scroller.getBoundingClientRect().top + scroller.scrollTop - head.offsetHeight;\n return Math.max(0, offset + dayY(geometry, minute) - (scroller.clientHeight - head.offsetHeight) / 3);\n };\n /** The first column of a week: its first day, or on a phone a day of it kept inside the week. */\n const columnFor = (key: string, phoneDay?: string) => {\n const week = weekKeysOf(view, key);\n if (visibleCount() >= 7 || !phoneDay) return indexOf(week[0]!);\n const day = Math.max(0, Math.min(7 - visibleCount(), dayKeyNumber(phoneDay) - dayKeyNumber(week[0]!)));\n return indexOf(week[day]!);\n };\n const positionAt = (key: string) => {\n if (!scroller) return;\n measureCount();\n const today = view.nowKey();\n const inWeek = weekKeysOf(view, key).includes(today);\n scroller.scrollLeft = leftOf(columnFor(key, key));\n scroller.scrollTop = inWeek ? topFor(view.nowMinute()) : topFor(60);\n lastLeft = scroller.scrollLeft;\n syncFirst();\n };\n const measureCount = () => {\n const width = columnWidth();\n if (!scroller || width <= 0) return;\n // Whole-pixel columns leave a few pixels at the right edge; the strip ends at its last whole day instead of\n // showing a sliver of the next one.\n const room = scroller.clientWidth + (Number.parseFloat(scroller.style.marginRight) || 0) - gutterWidth();\n const count = Math.max(1, Math.round(room / width));\n setVisibleCount(count);\n const rest = Math.floor(room - count * width);\n scroller.style.marginRight = rest > 0 ? `${rest}px` : \"\";\n };\n let reportTimer = 0;\n let reported = \"\";\n const syncFirst = () => {\n const index = visibleIndex();\n if (index !== untrack(firstIndex)) setFirstIndex(index);\n if (!untrack(keys)[index]) return;\n // The host learns the days the reader sees once they changed, after the scroll calmed down.\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\n // A gesture keeps its axis; the strip settles on a day start once the scroll rests.\n let axis: WheelAxis | null = null;\n let lastWheel = 0;\n let fingers = 0;\n let restTimer = 0;\n let ready = false;\n const settle = () => {\n if (!scroller || fingers > 0 || settling || glideTarget !== null || view.dragging()) return;\n const width = columnWidth();\n const target = snapToColumn(scroller.scrollLeft, width);\n if (Math.abs(target - scroller.scrollLeft) <= 0.5) return;\n settling = true;\n scroller.scrollTo({ left: target, behavior: reducedMotion() ? \"instant\" : \"smooth\" });\n window.setTimeout(() => {\n settling = false;\n }, 450);\n };\n const onWheel = (event: WheelEvent) => {\n if (!scroller || event.ctrlKey || view.dragging()) return;\n // A gesture that goes on takes over from a glide onto a day start; the strip settles again once it rests.\n settling = false;\n if (event.timeStamp - lastWheel > GESTURE_GAP_MS || axis === null) axis = wheelAxis(event.deltaX, event.deltaY, event.shiftKey);\n lastWheel = event.timeStamp;\n const delta = wheelPixels(\n wheelDelta(axis, event.deltaX, event.deltaY, event.shiftKey),\n event.deltaMode,\n axis === \"x\" ? scroller.clientWidth : scroller.clientHeight,\n );\n if (axis === \"x\") {\n event.preventDefault();\n glideTarget = null;\n scroller.scrollLeft += delta;\n } else if (event.deltaX !== 0) {\n // A trackpad's slight sideways drift in a vertical gesture would move the days; only the vertical part counts.\n event.preventDefault();\n scroller.scrollTop += delta;\n }\n };\n let askedEarlier = \"\";\n let askedLater = \"\";\n /** The last scroll position the strip read, to tell which way the reader moves. */\n let lastLeft = 0;\n /**\n * Asks for the week before or after once the reader moves within a week of an end. Days loaded before the strip push\n * it on by a week, so only moving toward an end asks; a glide may load later days, which push nothing.\n */\n const loadMore = () => {\n if (!scroller || !ready || view.dragging()) return;\n const width = columnWidth();\n const { first, last } = view.range();\n const left = scroller.scrollLeft;\n const direction = Math.sign(left - lastLeft);\n lastLeft = left;\n if (direction < 0 && glideTarget === null && left < width * 7 - 1 && props.owner.onLoadEarlier && askedEarlier !== first) {\n askedEarlier = first;\n void props.owner.onLoadEarlier();\n }\n if (\n direction > 0 &&\n left + scroller.clientWidth > scroller.scrollWidth - width * 7 + 1 &&\n props.owner.onLoadLater &&\n askedLater !== last\n ) {\n askedLater = last;\n void props.owner.onLoadLater();\n }\n };\n let frame = 0;\n const onScroll = () => {\n if (!scroller) return;\n if (glideTarget !== null && Math.abs(scroller.scrollLeft - glideTarget) < 2) glideTarget = null;\n if (!frame)\n frame = requestAnimationFrame(() => {\n frame = 0;\n syncFirst();\n loadMore();\n rememberAnchor();\n });\n window.clearTimeout(restTimer);\n restTimer = window.setTimeout(settle, fingers > 0 ? 160 : 140);\n };\n\n // Days loaded before the strip's first day shift it; the view keeps its days in place.\n let anchor: { key: string; offset: 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 /** Notes the day at the start of the strip, read against the days the strip draws, which may still be the old ones. */\n const rememberAnchor = (drawn = untrack(keys)) => {\n if (!scroller) return;\n const width = columnWidth();\n if (width <= 0) return;\n const index = Math.floor(scroller.scrollLeft / width);\n const key = drawn[index];\n if (key) anchor = { key, offset: scroller.scrollLeft - index * width };\n };\n // Before the days change the strip, note its place from the page as it stands. A computation runs before any render\n // effect touches the page, so no row has shrunk the strip yet.\n createComputed(\n on(\n keys,\n (next, drawn) => {\n if (!untrack(mounted) || !drawn) return;\n rememberAnchor(drawn);\n // Days that come in before the strip move every index; the first day in view stays the same day, so what\n // depends on the days in view, such as the all-day row, never sees the days that came in.\n const shift = dayKeyNumber(drawn[0]!) - dayKeyNumber(next[0]!);\n if (shift !== 0) setFirstIndex((index) => index + shift);\n },\n { defer: true },\n ),\n );\n createEffect(\n on(\n keys,\n () => {\n if (!untrack(mounted) || !scroller) return;\n if (pendingTarget && loaded(pendingTarget)) {\n positionAt(pendingTarget);\n pendingTarget = null;\n rememberAnchor();\n syncFirst();\n return;\n }\n if (!anchor) return;\n const index = indexOf(anchor.key);\n const left = leftOf(index) + anchor.offset;\n if (Math.abs(scroller.scrollLeft - left) > 0.5) scroller.scrollLeft = left;\n lastLeft = scroller.scrollLeft;\n },\n { defer: true },\n ),\n );\n\n onMount(() => {\n setMounted(true);\n queueMicrotask(() => {\n positionAt(view.anchorKey());\n rememberAnchor();\n ready = true;\n });\n const observer =\n typeof ResizeObserver === \"undefined\"\n ? undefined\n : new ResizeObserver(() => {\n const before = untrack(firstIndex);\n measureCount();\n if (!scroller) return;\n scroller.scrollLeft = leftOf(before);\n lastLeft = scroller.scrollLeft;\n syncFirst();\n });\n if (scroller) observer?.observe(scroller);\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 createEffect(\n on(\n view.anchorKey,\n (key) => {\n if (!untrack(mounted)) return;\n setNightWeek(key);\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 });\n },\n { defer: true },\n ),\n );\n\n const loaded = (key: string) => key >= view.range().first && key <= view.range().last;\n const handle: TimeViewHandle = {\n visibleKeys,\n step: (direction) => {\n const first = visibleKeys().first;\n const week = weekKeysOf(view, first);\n // From the middle of a week the arrows go to the start of a week first.\n const target = direction > 0 ? addDayKeys(week[0]!, 7) : first === week[0] ? addDayKeys(week[0]!, -7) : week[0]!;\n const last = addDayKeys(target, Math.min(6, visibleCount() - 1));\n if (!loaded(target) || !loaded(last)) return false;\n setNightWeek(target);\n glideTo(leftOf(indexOf(target)));\n return true;\n },\n goTo: (key) => {\n if (!loaded(key)) return false;\n setNightWeek(key);\n view.setSelection({ key });\n glideTo(leftOf(columnFor(key, key)));\n return true;\n },\n today: () => {\n const today = view.nowKey();\n const week = weekKeysOf(view, today);\n if (!loaded(week[0]!) || !loaded(week[6]!)) return false;\n setNightWeek(today);\n queueMicrotask(() => glideTo(leftOf(columnFor(today, today)), topFor(view.nowMinute())));\n return true;\n },\n todayDirection: () => {\n const today = view.nowKey();\n const { first, last } = visibleKeys();\n if (today < first) return \"left\";\n if (today > last) return \"right\";\n return \"\";\n },\n controller: {\n quickCreate: (create) => {\n const target = view.createTarget(visibleKeys());\n const column = scroller?.querySelector<HTMLElement>(`[data-calendar-body=\"${target.key}\"]`);\n view.openQuickCreate(\n target.key,\n target.start,\n target.end,\n slotRect(target.key, target.start, target.end) ?? column ?? scroller!,\n create,\n );\n },\n createTarget: () => view.rangeOfSelection(view.createTarget(visibleKeys())),\n dragIn: (event, item, onDrop) => view.dragIn(event, item, onDrop, scroller),\n },\n };\n const slotRect = (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 if (rect.right < bounds.left + gutterWidth() || rect.left > bounds.right) return null;\n const geometry = readDayGeometry(body, wake(), nightsOpen());\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 return new DOMRect(\n rect.left,\n Math.max(bounds.top, top),\n rect.width,\n Math.max(8, Math.min(bottom, bounds.bottom) - Math.max(bounds.top, top)),\n );\n };\n onMount(() => props.register(handle));\n onCleanup(() => props.register(null));\n\n // The all-day row: one bar per week, with a torn edge where an event goes on in the week before or after.\n const allDay = createMemo(() => {\n const all = keys();\n const spans = new Map<CalendarEvent, DaySpan<CalendarEvent>>();\n for (const key of all) for (const span of view.dayOf(key).spans) spans.set(span.item, span);\n const entries = [...spans.values()]\n .sort((left, right) => left.firstKey.localeCompare(right.firstKey) || right.lastKey.localeCompare(left.lastKey))\n .map((span) => ({ item: span, firstKey: span.firstKey, lastKey: span.lastKey, bar: !span.marker }));\n const weeks: { offset: number; keys: string[] }[] = [];\n for (let index = 0; index < all.length; ) {\n const week = weekKeysOf(view, all[index]!).filter((key) => key >= all[0]! && key <= all[all.length - 1]!);\n const offset = indexOf(week[0]!);\n weeks.push({ offset, keys: week });\n index = offset + week.length;\n }\n return weeks.map((week) => {\n const layout = layoutMonthWeek(week.keys, entries);\n const lanes = Math.max(0, ...layout.bars.map((bar) => bar.lane + 1));\n return { ...week, layout, rows: lanes + Math.max(0, ...layout.singles.map((singles) => singles.length)) };\n });\n });\n /**\n * The rows the weeks in view need, as in a week of its own. A week that loads off screen never changes them, so the\n * hours stay where they are; its entries below these rows wait hidden until it comes into view.\n */\n const allDayRows = createMemo(() => {\n const first = firstIndex();\n const last = first + visibleCount() - 1;\n return Math.max(\n 1,\n ...allDay()\n .filter((week) => week.offset <= last && week.offset + week.keys.length - 1 >= first)\n .map((week) => week.rows),\n );\n });\n\n // Keyboard: one tab stop in the grid; the arrows move between days, entries, and free time. Only what is drawn can\n // take the focus.\n const stops = () =>\n [...(scroller?.querySelectorAll<HTMLElement>(\"[data-stop]\") ?? [])].filter((stop) => stop.getClientRects().length > 0);\n const focusDayKey = () => {\n const current = view.selection()?.key;\n const { first, last } = visibleKeys();\n if (current && current >= first && current <= last) return current;\n return view.nowKey() >= first && view.nowKey() <= last ? view.nowKey() : first;\n };\n const rovingId = () => roving() || `h:${focusDayKey()}`;\n const tabOf = (id: string) => (rovingId() === id ? 0 : -1);\n // An entry that leaves the days gives the grid's tab stop back to a heading after the page has updated.\n createEffect(\n on(\n view.days,\n () => {\n queueMicrotask(() => {\n if (!scroller || !roving()) return;\n if ([...scroller.querySelectorAll<HTMLElement>(\"[data-stop]\")].some((stop) => stop.dataset.stop === roving())) return;\n setRoving(\"\");\n if (!document.activeElement || document.activeElement === document.body) {\n scroller.querySelector<HTMLElement>(`[data-stop=\"h:${focusDayKey()}\"]`)?.focus({ preventScroll: true });\n }\n });\n },\n { defer: true },\n ),\n );\n const onKeyDown = (event: KeyboardEvent) => {\n const current = event.target instanceof HTMLElement ? event.target.closest<HTMLElement>(\"[data-stop]\") : null;\n if (!current || event.altKey || event.metaKey || event.ctrlKey) return;\n const direction = { ArrowUp: \"up\", ArrowDown: \"down\", ArrowLeft: \"left\", ArrowRight: \"right\", Home: \"home\", End: \"end\" }[event.key];\n if (!direction) return;\n event.preventDefault();\n const all = stops();\n const column = Number(current.dataset.col);\n const minute = Number(current.dataset.minute);\n const inColumn = (index: number) =>\n all\n .filter((stop) => Number(stop.dataset.col) === index)\n .sort((left, right) => Number(left.dataset.minute) - Number(right.dataset.minute));\n const list = inColumn(column);\n const position = list.indexOf(current);\n let next: HTMLElement | undefined;\n if (direction === \"down\") next = list[position + 1];\n else if (direction === \"up\") next = list[position - 1];\n else if (direction === \"home\") next = list[0];\n else if (direction === \"end\") next = list[list.length - 1];\n else {\n const other = inColumn(column + (direction === \"left\" ? -1 : 1));\n next = other.reduce<HTMLElement | undefined>(\n (best, stop) =>\n Math.abs(Number(stop.dataset.minute) - minute) < Math.abs(Number(best?.dataset.minute ?? Number.POSITIVE_INFINITY) - minute)\n ? stop\n : best,\n undefined,\n );\n }\n if (!next) return;\n setRoving(next.dataset.stop ?? \"\");\n next.focus({ preventScroll: Boolean(next.closest(\".k2b-calendar-week__top\")) });\n const index = Number(next.dataset.col);\n const first = untrack(firstIndex);\n if (index < first) glideTo(leftOf(index));\n else if (index >= first + visibleCount()) glideTo(leftOf(index - visibleCount() + 1));\n };\n\n const openDay = (key: string) => {\n const href = props.owner.views && !props.owner.views.includes(\"day\") ? undefined : props.owner.getDateHref?.(view.parseKey(key), \"day\");\n if (href) followCalendarHref(props.owner, href);\n else {\n props.owner.onViewChange?.(\"day\");\n props.owner.onDateChange?.(view.parseKey(key), \"day\");\n }\n };\n let lastPointer = \"mouse\";\n\n // The all-day row: drag across days for one all-day event; a double-click creates on one day.\n const startAllDayRange = (pointerEvent: PointerEvent, row: HTMLElement) => {\n if (pointerEvent.pointerType !== \"mouse\" || pointerEvent.button !== 0 || !view.canCreate()) return;\n const keyAt = (clientX: number) => {\n const width = columnWidth();\n const rect = row.getBoundingClientRect();\n const index = Math.max(0, Math.min(keys().length - 1, Math.floor((clientX - rect.left) / width)));\n return keys()[index]!;\n };\n const origin = keyAt(pointerEvent.clientX);\n startCalendarPointerSession({\n event: pointerEvent,\n resolve: (clientX) => keyAt(clientX),\n onPreview: (key) => setRangeSelection(origin < key ? { first: origin, last: key } : { first: key, last: origin }),\n onCommit: (key) => {\n swallowNextClick();\n const range = origin < key ? { first: origin, last: key } : { first: key, last: origin };\n const cells = scroller?.querySelector<HTMLElement>(\".k2b-calendar-week__range\");\n setRangeSelection(null);\n const start = view.parseKey(range.first);\n const end = calendar.addDays(view.parseKey(range.last), 1, view.dateConfig());\n if (props.owner.renderQuickCreate)\n view.setQuick({ range: { start, end, allDay: true }, anchor: cells?.getBoundingClientRect() ?? row, key: range.first });\n else props.owner.onSlotActivate?.({ start, end, allDay: true });\n },\n onCancel: () => setRangeSelection(null),\n });\n };\n const [rangeSelection, setRangeSelection] = createSignal<{ first: string; last: string } | null>(null);\n\n return (\n <div class=\"k2b-calendar-week\" data-view=\"week\" data-dragging={view.dragging() || undefined}>\n <div\n ref={scroller}\n class=\"k2b-calendar-week__scroll\"\n role=\"group\"\n aria-label={view.messages().calendarWeek}\n aria-describedby={helpId}\n onScroll={onScroll}\n onWheel={onWheel}\n onKeyDown={onKeyDown}\n onFocusIn={(event) => {\n const stop = event.target instanceof HTMLElement ? event.target.closest<HTMLElement>(\"[data-stop]\") : null;\n if (stop?.dataset.stop) setRoving(stop.dataset.stop);\n }}\n onTouchStart={(event) => {\n fingers = event.touches.length;\n glideTarget = null;\n }}\n onTouchEnd={(event) => {\n fingers = event.touches.length;\n onScroll();\n }}\n onTouchCancel={(event) => {\n fingers = event.touches.length;\n }}\n style={{ \"--k2b-calendar-days\": String(keys().length) }}\n >\n <div class=\"k2b-calendar-week__grid\">\n <div class=\"k2b-calendar-week__top\">\n <div class=\"k2b-calendar-week__corner\" aria-hidden=\"true\">\n {view.messages().calendarWeekNumber({ week: isoWeek(visibleKeys().first) })}\n </div>\n <For each={keys()}>\n {(key) => {\n const today = () => key === view.calendarToday();\n const selected = () => {\n const current = view.selection();\n return Boolean(current && current.key === key && current.start === undefined);\n };\n const badge = () => props.owner.dayBadges?.[key];\n const load = () => dayLoad(view, key);\n const date = () => view.parseKey(key);\n return (\n <button\n type=\"button\"\n class=\"k2b-calendar-week__head\"\n data-calendar-head={key}\n data-stop={`h:${key}`}\n data-col={indexOf(key)}\n data-minute={-2}\n tabIndex={tabOf(`h:${key}`)}\n aria-pressed={selected() ? \"true\" : \"false\"}\n aria-label={[longDay(view, key), today() ? view.props.labels.today : \"\", badge()?.label ?? \"\"]\n .filter(Boolean)\n .join(\", \")}\n data-today={today() ? \"true\" : undefined}\n data-past={key < view.calendarToday() ? \"true\" : undefined}\n data-cheer={view.cheered() === key ? \"true\" : undefined}\n style={{ \"grid-column\": String(indexOf(key) + 2) }}\n onPointerDown={(event) => {\n lastPointer = event.pointerType;\n // The heading stays on top: focusing it must not scroll the grid.\n if (event.button === 0) {\n event.preventDefault();\n event.currentTarget.focus({ preventScroll: true });\n }\n }}\n onClick={(event) => {\n if (event.detail >= 2 || (selected() && lastPointer !== \"mouse\")) {\n openDay(key);\n return;\n }\n view.setTouchDraft(null);\n view.setSelection(selected() ? null : { key });\n }}\n >\n <span class=\"k2b-calendar-week__weekday\">\n {date()\n .toLocaleDateString(view.dateConfig().locale ?? \"en\", { weekday: \"short\", timeZone: view.dateConfig().timeZone })\n .replace(/\\.$/, \"\")}\n </span>\n <span class=\"k2b-calendar-week__number\">{calendar.formatDayNumber(date(), view.dateConfig())}</span>\n <span class=\"k2b-calendar-week__extra\">\n <Show when={badge()}>\n {(current) => (\n <span class=\"k2b-calendar-week__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>\n <span class=\"k2b-calendar-week__load\" aria-hidden=\"true\">\n <For each={load()}>\n {(piece) => <span style={{ width: `${((piece.end - piece.start) / wake()) * 100}%`, background: piece.color }} />}\n </For>\n </span>\n <span class=\"k2b-calendar-week__cheer\" aria-hidden=\"true\">\n <i class=\"ti ti-confetti\" aria-hidden=\"true\" />\n <span class=\"k2b-calendar-week__cheer-long\">{view.messages().calendarAllDone}</span>\n <span class=\"k2b-calendar-week__cheer-short\">{view.messages().calendarAllDoneShort}</span>\n </span>\n </button>\n );\n }}\n </For>\n <div class=\"k2b-calendar-week__all-day-label\" aria-hidden=\"true\">\n <span class=\"k2b-calendar-week__all-day-long\">{view.messages().calendarAllDayRow}</span>\n <span class=\"k2b-calendar-week__all-day-short\">{view.messages().calendarAllDayRowShort}</span>\n </div>\n <div\n class=\"k2b-calendar-week__all-day\"\n role=\"group\"\n aria-label={view.messages().calendarAllDayAndDue}\n style={{ \"grid-template-rows\": `repeat(${allDayRows()}, var(--k2b-calendar-all-day-row))` }}\n onPointerDown={(event) => {\n if (event.target instanceof Element && event.target.closest(\"a,button,[data-calendar-event]\")) return;\n startAllDayRange(event, event.currentTarget);\n }}\n onDblClick={(event) => {\n if (!(event.target instanceof Element) || event.target.closest(\"a,button,[data-calendar-event]\")) return;\n const width = columnWidth();\n const rect = event.currentTarget.getBoundingClientRect();\n const key = keys()[Math.max(0, Math.min(keys().length - 1, Math.floor((event.clientX - rect.left) / width)))]!;\n const start = view.parseKey(key);\n const range = { start, end: calendar.addDays(start, 1, view.dateConfig()), allDay: true };\n if (props.owner.renderQuickCreate)\n view.setQuick({ range, anchor: new DOMRect(rect.left + indexOf(key) * width, rect.top, width, rect.height), key });\n else props.owner.onSlotActivate?.(range);\n }}\n >\n <Show when={rangeSelection()}>\n {(range) => (\n <div\n class=\"k2b-calendar-week__range\"\n style={{ \"grid-column\": `${indexOf(range().first) + 1} / ${indexOf(range().last) + 2}`, \"grid-row\": \"1 / -1\" }}\n aria-hidden=\"true\"\n />\n )}\n </Show>\n <For each={allDay()}>\n {(week) => (\n <>\n <For each={week.layout.bars}>\n {(bar) => {\n const span = bar.endColumn - bar.startColumn + 1;\n const event = bar.item.item;\n const checked = () => view.checkedOf(event);\n const hint = (target: string, kind: \"from\" | \"until\", before = \"\") => {\n const text =\n kind === \"from\"\n ? view.messages().calendarContinuesFrom(hintDate(view, target, visibleKeys().first))\n : view.messages().calendarContinuesUntil(hintDate(view, target, visibleKeys().first));\n const font = `600 11px ${typeof document === \"undefined\" ? \"sans-serif\" : getComputedStyle(document.body).fontFamily}`;\n return textWidth(`${event.title}${before}`, font) + textWidth(text, font) + HINT_SLACK_PX <=\n span * columnWidthSignal()\n ? text\n : undefined;\n };\n const start = () => (bar.continuesBefore ? hint(bar.item.firstKey, \"from\") : undefined);\n const end = () => (bar.continuesAfter ? hint(bar.item.lastKey, \"until\", start() ?? \"\") : undefined);\n return (\n <div\n class=\"k2b-calendar-week__slot\"\n data-checkbox={checked() !== undefined ? \"true\" : undefined}\n data-checked={checked() ? \"true\" : undefined}\n data-just-checked={view.justChecked().has(event.id) ? \"true\" : undefined}\n style={{\n \"grid-column\": `${week.offset + bar.startColumn + 1} / ${week.offset + bar.endColumn + 2}`,\n \"grid-row\": String(bar.lane + 1),\n \"--k2b-calendar-accent\": eventAccent(event),\n display: bar.lane + 1 > allDayRows() ? \"none\" : undefined,\n }}\n >\n <Show when={checked() !== undefined}>\n <TimeCheck view={view} event={event} tabIndex={-1} />\n </Show>\n <EventChip\n event={view.normalized(event, bar.item.firstKey)}\n owner={props.owner}\n href={eventHref(props.owner, event)}\n label={spanLabel(view, bar.item)}\n compact\n timeline\n bar\n checkbox={checked() !== undefined}\n onCheck={view.checkOf(event)}\n continuesBefore={bar.continuesBefore}\n continuesAfter={bar.continuesAfter}\n hintStart={start()}\n hintEnd={end()}\n tabIndex={tabOf(`a:${event.id}:${week.offset}`)}\n stop={{\n id: `a:${event.id}:${week.offset}`,\n column: week.offset + bar.startColumn,\n minute: -1 + bar.lane / 100,\n }}\n />\n </div>\n );\n }}\n </For>\n <For each={week.layout.singles}>\n {(singles, column) => {\n const lanes = () =>\n Math.max(\n 0,\n ...week.layout.bars\n .filter((bar) => bar.startColumn <= column() && bar.endColumn >= column())\n .map((bar) => bar.lane + 1),\n );\n return (\n <For each={singles}>\n {(span, row) => {\n const event = span.item;\n const checked = () => view.checkedOf(event);\n const id = `a:${event.id}:${week.offset}`;\n return (\n <div\n class=\"k2b-calendar-week__slot\"\n data-checkbox={checked() !== undefined ? \"true\" : undefined}\n data-checked={checked() ? \"true\" : undefined}\n data-just-checked={view.justChecked().has(event.id) ? \"true\" : undefined}\n style={{\n \"grid-column\": String(week.offset + column() + 1),\n \"grid-row\": String(lanes() + row() + 1),\n \"--k2b-calendar-accent\": eventAccent(event),\n display: lanes() + row() + 1 > allDayRows() ? \"none\" : undefined,\n }}\n >\n <Show when={checked() !== undefined}>\n <TimeCheck view={view} event={event} tabIndex={-1} />\n </Show>\n <EventChip\n event={view.normalized(event, span.firstKey)}\n owner={props.owner}\n href={eventHref(props.owner, event)}\n compact\n timeline\n checkbox={checked() !== undefined}\n onCheck={view.checkOf(event)}\n tabIndex={tabOf(id)}\n stop={{ id, column: week.offset + column(), minute: -1 + (lanes() + row()) / 100 }}\n />\n </div>\n );\n }}\n </For>\n );\n }}\n </For>\n </>\n )}\n </For>\n </div>\n </div>\n <div class=\"k2b-calendar-week__body\" style={{ height: termsCss(dayHeightTerms(wake(), nightsOpen())) }}>\n <div class=\"k2b-calendar-week__gutter\">\n <For each={Array.from({ length: wake() / 60 + 1 }, (_, index) => index * 60)}>\n {(minute) => (\n <span\n class=\"k2b-calendar-week__hour\"\n data-near-now={nowShown() && isNearNow(view, view.nowKey(), minute) ? \"true\" : undefined}\n style={{ top: termsCss(dayYTerms(wake(), nightsOpen(), minute)) }}\n aria-hidden=\"true\"\n >\n {view.clock(minute)}\n </span>\n )}\n </For>\n <Show when={nightsOpen()}>\n <For each={nightHours(wake())}>\n {(minute) => (\n <span\n class=\"k2b-calendar-week__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 )}\n </For>\n </Show>\n <button\n type=\"button\"\n class=\"k2b-calendar-week__moon\"\n aria-expanded={nightsOpen() ? \"true\" : \"false\"}\n aria-label={\n nightsOpen()\n ? view.messages().calendarFoldNights\n : view.messages().calendarOpenNights({ from: view.clock(wake()).slice(0, 2), to: view.clock(DAY_MINUTES).slice(0, 2) })\n }\n title={\n nightsOpen()\n ? view.messages().calendarFoldNights\n : view.messages().calendarOpenNights({ from: view.clock(wake()).slice(0, 2), to: view.clock(DAY_MINUTES).slice(0, 2) })\n }\n data-open={nightsOpen() ? \"true\" : undefined}\n style={{ top: termsCss(dayYTerms(wake(), nightsOpen(), nightsOpen() ? wake() : wake() + 1)) }}\n onClick={() => setNightOverride(!nightsOpen())}\n >\n <i class=\"ti ti-moon\" aria-hidden=\"true\" />\n <i class={`ti ${nightsOpen() ? \"ti-chevron-up\" : \"ti-chevron-down\"}`} aria-hidden=\"true\" />\n </button>\n <Show when={nowShown()}>\n <span\n class=\"k2b-calendar-week__now-time\"\n style={{ top: termsCss(dayYTerms(wake(), nightsOpen(), view.nowMinute())) }}\n aria-hidden=\"true\"\n >\n {view.clock(view.nowMinute())}\n </span>\n </Show>\n </div>\n <div class=\"k2b-calendar-week__lines\" aria-hidden=\"true\">\n <For each={Array.from({ length: wake() / 60 + 1 }, (_, index) => index * 60)}>\n {(minute) => <span class=\"k2b-calendar-week__line\" style={{ top: termsCss(dayYTerms(wake(), nightsOpen(), minute)) }} />}\n </For>\n <Show\n when={nightsOpen()}\n fallback={\n <span class=\"k2b-calendar-week__fold\" style={{ top: `calc(${termsCss(dayYTerms(wake(), false, wake()))} + 3px)` }} />\n }\n >\n <span\n class=\"k2b-calendar-night\"\n style={{ top: termsCss(dayYTerms(wake(), true, wake())), height: termsCss([0, (DAY_MINUTES - wake()) / 60, 1, 0]) }}\n />\n <For each={nightHours(wake())}>\n {(minute) => (\n <span\n class=\"k2b-calendar-week__line\"\n data-midnight={view.clock(minute) === \"00:00\" ? \"true\" : undefined}\n style={{ top: termsCss(dayYTerms(wake(), true, minute)) }}\n />\n )}\n </For>\n </Show>\n <Show when={nowShown()}>\n <span class=\"k2b-calendar-week__now-line\" style={{ top: termsCss(dayYTerms(wake(), nightsOpen(), view.nowMinute())) }} />\n </Show>\n </div>\n <For each={keys()}>\n {(key) => (\n <WeekColumn\n view={view}\n dayKey={key}\n column={indexOf(key)}\n expanded={nightsOpen()}\n tabOf={tabOf}\n lastPointer={() => lastPointer}\n setLastPointer={(value) => {\n lastPointer = value;\n }}\n scroller={() => scroller}\n />\n )}\n </For>\n </div>\n </div>\n </div>\n <p class=\"k2b-calendar-sr\" id={helpId}>\n {view.messages().calendarKeyboardHelp}\n </p>\n <TimeQuickCreate view={view} />\n </div>\n );\n\n function columnWidthSignal() {\n // Read through the visible count so a resize recomputes the hints.\n visibleCount();\n return columnWidth();\n }\n};\n\nconst WeekColumn = (props: {\n view: TimeView;\n dayKey: string;\n column: number;\n expanded: boolean;\n tabOf: (id: string) => number;\n lastPointer: () => string;\n setLastPointer: (value: string) => void;\n scroller: () => HTMLElement | undefined;\n}) => {\n const view = props.view;\n const model = createMemo(() => view.dayOf(props.dayKey));\n const wake = () => view.wake();\n const bands = createMemo(() => dayBands(view, props.dayKey, props.expanded));\n const gaps = createMemo(() => dayGaps(view, props.dayKey));\n const markers = () => model().markers.filter((marker) => marker.minute < (props.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 = () => (props.expanded ? [] : foldedEntries(view, props.dayKey));\n const isEmptyTarget = (target: EventTarget | null) =>\n target instanceof Element &&\n !target.closest(\n \"a,button,[data-calendar-event],.k2b-calendar-band,.k2b-calendar-marker,.k2b-calendar-draft,.k2b-calendar-week__fold-cell\",\n );\n const minuteAt = (element: HTMLElement, clientY: number) => {\n const geometry = readDayGeometry(element, wake(), props.expanded);\n return Math.max(\n 0,\n Math.min((props.expanded ? DAY_MINUTES : wake()) - 15, dayMinuteAt(geometry, clientY - element.getBoundingClientRect().top)),\n );\n };\n const nowMinute = () => (props.dayKey === view.nowKey() ? view.nowMinute() : null);\n const selected = () => view.selection()?.key === props.dayKey;\n /** The quarter hour under the mouse on empty time, as a line with its time, to aim a drag at. */\n const [hover, setHover] = createSignal<number | null>(null);\n const timeline = createMemo(() =>\n [\n ...gaps().map((gap) => ({ at: gap.start, kind: \"gap\" as const, gap })),\n ...bands().map((band) => ({ at: Math.max(0, band.start), kind: \"band\" as const, band })),\n ...markers().map((marker) => ({ at: marker.minute, kind: \"marker\" as const, marker })),\n ].sort((left, right) => left.at - right.at),\n );\n return (\n <div\n ref={(element) => view.registerBody(props.dayKey, element, () => props.expanded)}\n class=\"k2b-calendar-week__column\"\n data-calendar-column=\"\"\n data-calendar-body={props.dayKey}\n data-expanded={props.expanded ? \"true\" : \"false\"}\n data-today={props.dayKey === view.calendarToday() ? \"true\" : undefined}\n data-selected={selected() ? \"true\" : undefined}\n data-active={view.activeKey() === props.dayKey ? \"true\" : undefined}\n role=\"group\"\n aria-label={longDay(view, props.dayKey)}\n style={{ \"grid-column\": String(props.column + 2), height: termsCss(dayHeightTerms(wake(), props.expanded)) }}\n onPointerDown={(event) => {\n props.setLastPointer(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={() => props.setLastPointer(\"touch\")}\n // Listening on the column itself, not through delegation, makes it a tap target on iOS.\n on:click={(event) => {\n if (!isEmptyTarget(event.target)) return;\n const minute = Math.floor(minuteAt(event.currentTarget, event.clientY) / 30) * 30;\n const end = Math.min(minute + 60, props.expanded ? DAY_MINUTES : wake());\n if (props.lastPointer() === \"mouse\") {\n if (!view.canCreate()) return;\n view.setTouchDraft(null);\n view.setSelection({ key: props.dayKey, start: minute, end });\n return;\n }\n // A first tap on a column shows its free time; the next one proposes an hour there.\n if (view.activeKey() !== props.dayKey) {\n view.setActiveKey(props.dayKey);\n view.setTouchDraft(null);\n view.setSelection({ key: props.dayKey });\n return;\n }\n if (!view.canCreate()) return;\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) || props.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, props.expanded ? DAY_MINUTES : wake()), event.currentTarget);\n }}\n onPointerMove={(event) => {\n if (event.pointerType !== \"mouse\" || view.dragging() || !isEmptyTarget(event.target)) return setHover(null);\n setHover(Math.floor(minuteAt(event.currentTarget, event.clientY) / 15) * 15);\n }}\n onPointerLeave={() => setHover(null)}\n >\n <For each={timeline()}>\n {(entry) =>\n entry.kind === \"gap\" ? (\n <TimeGap\n view={view}\n gap={entry.gap}\n dayKey={props.dayKey}\n expanded={props.expanded}\n aside={gapAside(model(), entry.gap)}\n tabIndex={props.tabOf(`g:${props.dayKey}:${entry.gap.start}`)}\n stop={{ id: `g:${props.dayKey}:${entry.gap.start}`, column: props.column, minute: entry.gap.start + 0.5 }}\n />\n ) : entry.kind === \"band\" ? (\n <TimeBand\n view={view}\n band={entry.band}\n dayKey={props.dayKey}\n expanded={props.expanded}\n hourPx={48}\n tabIndex={props.tabOf(`b:${entry.band.item.id}:${props.dayKey}`)}\n stop={{ id: `b:${entry.band.item.id}:${props.dayKey}`, column: props.column, minute: entry.band.start }}\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={props.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={false}\n tabIndex={props.tabOf(`m:${entry.marker.item.id}`)}\n stop={{ id: `m:${entry.marker.item.id}`, column: props.column, minute: entry.marker.minute }}\n scroller={props.scroller}\n />\n )\n }\n </For>\n <Show when={!props.expanded && folded().length > 0}>\n <div class=\"k2b-calendar-week__fold-cell\" style={{ top: `calc(${termsCss(dayYTerms(wake(), false, wake()))} + 3px)` }}>\n <ul class=\"k2b-calendar-fold__chips\">\n {/* The arrows reach the entries of a folded night after the waking hours, and Space checks a to-do off. */}\n <For each={folded()}>\n {(entry, index) => {\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} tabIndex={-1} />\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 tabIndex={props.tabOf(`f:${entry.event.id}:${props.dayKey}`)}\n stop={{ id: `f:${entry.event.id}:${props.dayKey}`, column: props.column, minute: wake() + index() / 100 }}\n />\n </li>\n );\n }}\n </For>\n </ul>\n </div>\n </Show>\n <TimeOverlays view={view} dayKey={props.dayKey} expanded={props.expanded} />\n <Show when={hover() !== null}>\n <span class=\"k2b-calendar-hover\" style={{ top: termsCss(dayYTerms(wake(), props.expanded, hover()!)) }} aria-hidden=\"true\">\n {view.clock(hover()!)}\n </span>\n </Show>\n <Show when={nowMinute() !== null && nowMinute()! >= 0 && nowMinute()! < (props.expanded ? DAY_MINUTES : wake())}>\n <div class=\"k2b-calendar-now\" style={{ top: termsCss(dayYTerms(wake(), props.expanded, nowMinute()!)) }} aria-hidden=\"true\" />\n </Show>\n </div>\n );\n};\n\n/** ISO week number of a day key. */\nconst isoWeek = (key: string) => {\n const date = new Date(`${key}T00:00:00Z`);\n const day = date.getUTCDay() || 7;\n date.setUTCDate(date.getUTCDate() + 4 - day);\n const yearStart = new Date(Date.UTC(date.getUTCFullYear(), 0, 1));\n return Math.ceil(((date.getTime() - yearStart.getTime()) / 86_400_000 + 1) / 7);\n};\n\n/** The day at a torn end of a bar, with its month when it lies in another month than the shown week. */\nconst hintDate = (view: TimeView, target: string, shown: string) => ({\n day: Number(target.slice(8, 10)),\n month:\n target.slice(0, 7) === shown.slice(0, 7)\n ? undefined\n : view\n .parseKey(target)\n .toLocaleDateString(view.dateConfig().locale ?? \"en\", { month: \"short\", timeZone: view.dateConfig().timeZone })\n .replace(/\\.$/, \"\"),\n});\n\n/** A long entry's accessible name names the days it spans. */\nconst spanLabel = (view: TimeView, span: DaySpan<CalendarEvent>) => {\n if (span.firstKey === span.lastKey) return undefined;\n const format = (key: string) =>\n view\n .parseKey(key)\n .toLocaleDateString(view.dateConfig().locale ?? \"en\", { month: \"long\", day: \"numeric\", timeZone: view.dateConfig().timeZone });\n return view.messages().calendarEventTime({ title: span.item.title, start: format(span.firstKey), end: format(span.lastKey) });\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,17 +1,22 @@
|
|
|
1
|
+
import { memo as _$memo } from "solid-js/web";
|
|
1
2
|
import { ssrStyleProperty as _$ssrStyleProperty } from "solid-js/web";
|
|
2
|
-
import { createComponent as _$createComponent } from "solid-js/web";
|
|
3
3
|
import { ssr as _$ssr } from "solid-js/web";
|
|
4
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
4
5
|
import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
|
|
5
6
|
import { escape as _$escape } from "solid-js/web";
|
|
6
7
|
var _tmpl$ = ["<div>", "</div>"],
|
|
7
8
|
_tmpl$2 = ["<span role=\"alert\">", "</span>"],
|
|
8
|
-
_tmpl$3 = ["<
|
|
9
|
-
_tmpl$4 = ["<
|
|
10
|
-
_tmpl$5 = ["<div class=\"k2b-
|
|
11
|
-
_tmpl$6 = ["<
|
|
12
|
-
_tmpl$7 = "<
|
|
13
|
-
_tmpl$8 = ["<
|
|
14
|
-
|
|
9
|
+
_tmpl$3 = ["<ul class=\"k2b-chart-legend\"", ">", "</ul>"],
|
|
10
|
+
_tmpl$4 = ["<div class=\"k2b-chart-explorer__details\" aria-live=\"polite\">", "</div>"],
|
|
11
|
+
_tmpl$5 = ["<section class=\"", "\"", "><header class=\"k2b-chart-explorer__header\"><div>", "", "</div><div class=\"k2b-chart-explorer__actions\">", "", "</div></header>", "", "<div class=\"k2b-chart-explorer__viewport\"", " style=\"", "\">", "</div>", "</section>"],
|
|
12
|
+
_tmpl$6 = ["<div class=\"k2b-chart__empty\">", "</div>"],
|
|
13
|
+
_tmpl$7 = ["<p class=\"k2b-chart-explorer__note\">", "</p>"],
|
|
14
|
+
_tmpl$8 = ["<i class=\"", "\"", " aria-hidden=\"true\"></i>"],
|
|
15
|
+
_tmpl$9 = ["<li><span class=\"k2b-chart-legend__swatch\"", " style=\"", "\" aria-hidden=\"true\"></span>", "</li>"],
|
|
16
|
+
_tmpl$0 = "<i class=\"ti ti-x\" aria-hidden=\"true\"></i>",
|
|
17
|
+
_tmpl$1 = ["<div class=\"k2b-chart-explorer__detail-header\"><span>", "</span>", "</div>"];
|
|
18
|
+
import { createEffect, createMemo, createSignal, createUniqueId, For, Show } from "solid-js";
|
|
19
|
+
import { Dynamic } from "solid-js/web";
|
|
15
20
|
import { Button, IconButton } from "../actions/Button";
|
|
16
21
|
import { CopyButton } from "../actions/CopyButton";
|
|
17
22
|
import { SelectChip } from "../inputs/SelectChip";
|
|
@@ -23,7 +28,13 @@ import { ChartSnapshotView } from "./ChartSnapshotView";
|
|
|
23
28
|
import { validateChartExplorerData } from "./chart-explorer";
|
|
24
29
|
import { useChartMessages } from "./chart-messages";
|
|
25
30
|
import DataTable from "./DataTable";
|
|
26
|
-
|
|
31
|
+
|
|
32
|
+
/** One legend entry; `color` is the palette index the renderer gave the series (0 is `--stdlib-chart-c1`). */
|
|
33
|
+
|
|
34
|
+
const tsvCell = (value, numeric = false) => {
|
|
35
|
+
const safe = !numeric && /^[=+\-@\t\r]/.test(value) ? `'${value}` : value;
|
|
36
|
+
return /[\t\r\n"]/.test(safe) ? `"${safe.replaceAll('"', '""')}"` : safe;
|
|
37
|
+
};
|
|
27
38
|
export function ChartExplorer(props) {
|
|
28
39
|
const messages = useUiMessages();
|
|
29
40
|
const chartMessages = useChartMessages();
|
|
@@ -79,8 +90,38 @@ export function ChartExplorer(props) {
|
|
|
79
90
|
return order.direction === "asc" ? comparison : -comparison;
|
|
80
91
|
});
|
|
81
92
|
});
|
|
82
|
-
const
|
|
83
|
-
|
|
93
|
+
const shownRows = () => props.tableRows === undefined ? rows() : rows().slice(0, props.tableRows);
|
|
94
|
+
// Chart ids are data; a prefix keeps one named "table" apart from the table entry.
|
|
95
|
+
const switcherValue = () => view() === "table" || !props.charts?.length ? view() : `chart:${props.chart ?? props.charts[0]?.id}`;
|
|
96
|
+
const switcherOptions = () => props.charts?.length ? [...props.charts.map(chart => ({
|
|
97
|
+
value: `chart:${chart.id}`,
|
|
98
|
+
label: chart.label
|
|
99
|
+
})), {
|
|
100
|
+
value: "table",
|
|
101
|
+
label: chartMessages().chartData
|
|
102
|
+
}] : [{
|
|
103
|
+
value: "chart",
|
|
104
|
+
label: chartMessages().chartDiagram
|
|
105
|
+
}, {
|
|
106
|
+
value: "table",
|
|
107
|
+
label: chartMessages().chartData
|
|
108
|
+
}];
|
|
109
|
+
const pick = value => {
|
|
110
|
+
if (value === "table" || value === "chart") return setView(value);
|
|
111
|
+
setView("chart");
|
|
112
|
+
props.onChartChange?.(value.slice("chart:".length));
|
|
113
|
+
};
|
|
114
|
+
const copyText = () => [props.columns.map(c => tsvCell(c.label)).join("\t"), ...rows().map(row => props.columns.map(c => tsvCell(c.value(row), typeof c.sortValue?.(row) === "number")).join("\t"))].join("\n");
|
|
115
|
+
return _$ssr(_tmpl$5, `k2b-chart-explorer ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-labelledby", _$escape(id, true), false), _$escape(_$createComponent(Dynamic, {
|
|
116
|
+
get component() {
|
|
117
|
+
return `h${props.headingLevel ?? 3}`;
|
|
118
|
+
},
|
|
119
|
+
id: id,
|
|
120
|
+
"class": "k2b-chart-explorer__title",
|
|
121
|
+
get children() {
|
|
122
|
+
return props.title;
|
|
123
|
+
}
|
|
124
|
+
})), _$escape(_$createComponent(Show, {
|
|
84
125
|
get when() {
|
|
85
126
|
return props.description;
|
|
86
127
|
},
|
|
@@ -104,20 +145,14 @@ export function ChartExplorer(props) {
|
|
|
104
145
|
onCopied: () => setCopyFailed(false)
|
|
105
146
|
})), _$escape(_$createComponent(SelectChip, {
|
|
106
147
|
get value() {
|
|
107
|
-
return
|
|
148
|
+
return switcherValue();
|
|
108
149
|
},
|
|
109
|
-
onValueChange:
|
|
150
|
+
onValueChange: pick,
|
|
110
151
|
get ["aria-label"]() {
|
|
111
152
|
return chartMessages().chartView;
|
|
112
153
|
},
|
|
113
154
|
get options() {
|
|
114
|
-
return
|
|
115
|
-
value: "chart",
|
|
116
|
-
label: chartMessages().chartDiagram
|
|
117
|
-
}, {
|
|
118
|
-
value: "table",
|
|
119
|
-
label: chartMessages().chartData
|
|
120
|
-
}];
|
|
155
|
+
return switcherOptions();
|
|
121
156
|
}
|
|
122
157
|
})), _$escape(_$createComponent(Show, {
|
|
123
158
|
get when() {
|
|
@@ -126,12 +161,12 @@ export function ChartExplorer(props) {
|
|
|
126
161
|
get children() {
|
|
127
162
|
return _$ssr(_tmpl$2, _$escape(chartMessages().chartCopyFailed));
|
|
128
163
|
}
|
|
129
|
-
})), _$ssrStyleProperty("height:", _$escape(props.height ?? "18rem", true)), _$escape(_$createComponent(Show, {
|
|
164
|
+
})), _$escape(props.controls), _$ssrAttribute("data-legend", view() === "chart" && props.legend?.length && data().rows.length > 0 ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-capped", view() === "table" && shownRows().length < rows().length ? "true" : _$escape(undefined, true), false), _$ssrStyleProperty("height:", _$escape(props.height ?? "18rem", true)), _$escape(_$createComponent(Show, {
|
|
130
165
|
get when() {
|
|
131
166
|
return data().rows.length > 0;
|
|
132
167
|
},
|
|
133
168
|
get fallback() {
|
|
134
|
-
return _$ssr(_tmpl$
|
|
169
|
+
return _$ssr(_tmpl$6, _$escape(props.empty ?? messages().noData));
|
|
135
170
|
},
|
|
136
171
|
get children() {
|
|
137
172
|
return _$createComponent(Show, {
|
|
@@ -139,9 +174,9 @@ export function ChartExplorer(props) {
|
|
|
139
174
|
return view() === "chart";
|
|
140
175
|
},
|
|
141
176
|
get fallback() {
|
|
142
|
-
return _$createComponent(DataTable, {
|
|
177
|
+
return [_$createComponent(DataTable, {
|
|
143
178
|
get rows() {
|
|
144
|
-
return
|
|
179
|
+
return shownRows();
|
|
145
180
|
},
|
|
146
181
|
get columns() {
|
|
147
182
|
return props.columns.map(column => ({
|
|
@@ -171,7 +206,7 @@ export function ChartExplorer(props) {
|
|
|
171
206
|
}) => {
|
|
172
207
|
const custom = props.columns.find(column => column.id === col.id)?.render;
|
|
173
208
|
const cell = () => custom ? custom(row) : render(value);
|
|
174
|
-
return col.id === props.columns[0]?.id ? _$createComponent(Button, {
|
|
209
|
+
return !custom && col.id === props.columns[0]?.id ? _$createComponent(Button, {
|
|
175
210
|
variant: "text",
|
|
176
211
|
size: "sm",
|
|
177
212
|
onClick: () => select(row.key),
|
|
@@ -191,13 +226,23 @@ export function ChartExplorer(props) {
|
|
|
191
226
|
direction: sort()?.key === col.id && sort()?.direction === "asc" ? "desc" : "asc"
|
|
192
227
|
}),
|
|
193
228
|
get children() {
|
|
194
|
-
return [props.columns.find(column => column.id === col.id)?.label, _$ssr(_tmpl$
|
|
229
|
+
return [props.columns.find(column => column.id === col.id)?.label, _$ssr(_tmpl$8, `k2b-data-table__sort-icon ti ${sort()?.key === col.id && sort()?.direction === "asc" ? "ti-arrow-up" : "ti-arrow-down"}`, _$ssrAttribute("data-active", sort()?.key === col.id ? "true" : _$escape(undefined, true), false))];
|
|
195
230
|
}
|
|
196
231
|
}) : render()
|
|
197
|
-
})
|
|
232
|
+
}), _$createComponent(Show, {
|
|
233
|
+
get when() {
|
|
234
|
+
return shownRows().length < rows().length;
|
|
235
|
+
},
|
|
236
|
+
get children() {
|
|
237
|
+
return _$ssr(_tmpl$7, _$escape(chartMessages().chartRowsShown({
|
|
238
|
+
shown: new Intl.NumberFormat(locale()).format(shownRows().length),
|
|
239
|
+
total: new Intl.NumberFormat(locale()).format(rows().length)
|
|
240
|
+
})));
|
|
241
|
+
}
|
|
242
|
+
})];
|
|
198
243
|
},
|
|
199
244
|
get children() {
|
|
200
|
-
return _$createComponent(ChartSnapshotView, {
|
|
245
|
+
return [_$createComponent(ChartSnapshotView, {
|
|
201
246
|
get cursor() {
|
|
202
247
|
return props.cursor;
|
|
203
248
|
},
|
|
@@ -208,10 +253,24 @@ export function ChartExplorer(props) {
|
|
|
208
253
|
return selected();
|
|
209
254
|
},
|
|
210
255
|
onSelect: select,
|
|
211
|
-
style
|
|
212
|
-
|
|
256
|
+
get style() {
|
|
257
|
+
return props.legend?.length ? undefined : {
|
|
258
|
+
height: "100%"
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
}), _$createComponent(Show, {
|
|
262
|
+
get when() {
|
|
263
|
+
return props.legend?.length;
|
|
264
|
+
},
|
|
265
|
+
get children() {
|
|
266
|
+
return _$ssr(_tmpl$3, _$ssrAttribute("aria-label", _$escape(chartMessages().chartLegend, true), false), _$escape(_$createComponent(For, {
|
|
267
|
+
get each() {
|
|
268
|
+
return props.legend;
|
|
269
|
+
},
|
|
270
|
+
children: entry => _$ssr(_tmpl$9, _$ssrAttribute("data-style", entry.style && entry.style !== "solid" ? _$escape(entry.style, true) : _$escape(undefined, true), false) + _$ssrAttribute("data-reference", entry.reference ? "true" : _$escape(undefined, true), false), _$ssrStyleProperty("--k2b-chart-legend-color:", `var(--stdlib-chart-c${_$escape(Math.abs(Math.trunc(entry.color)), true) % 8 + 1})`), _$escape(entry.label))
|
|
271
|
+
})));
|
|
213
272
|
}
|
|
214
|
-
});
|
|
273
|
+
})];
|
|
215
274
|
}
|
|
216
275
|
});
|
|
217
276
|
}
|
|
@@ -220,14 +279,14 @@ export function ChartExplorer(props) {
|
|
|
220
279
|
return props.renderDetails !== false;
|
|
221
280
|
},
|
|
222
281
|
get children() {
|
|
223
|
-
return _$ssr(_tmpl$
|
|
282
|
+
return _$ssr(_tmpl$4, _$escape(_$createComponent(Show, {
|
|
224
283
|
get when() {
|
|
225
284
|
return selectedRow();
|
|
226
285
|
},
|
|
227
286
|
children: row => _$createComponent(Paper, {
|
|
228
287
|
"class": "k2b-chart-explorer__detail-paper",
|
|
229
288
|
get children() {
|
|
230
|
-
return [_$ssr(_tmpl$
|
|
289
|
+
return [_$ssr(_tmpl$1, _$escape(chartMessages().chartSelectedDatum), _$escape(_$createComponent(IconButton, {
|
|
231
290
|
variant: "text",
|
|
232
291
|
size: "sm",
|
|
233
292
|
get label() {
|
|
@@ -235,7 +294,7 @@ export function ChartExplorer(props) {
|
|
|
235
294
|
},
|
|
236
295
|
onClick: () => select(null),
|
|
237
296
|
get children() {
|
|
238
|
-
return _$ssr(_tmpl$
|
|
297
|
+
return _$ssr(_tmpl$0);
|
|
239
298
|
}
|
|
240
299
|
}))), props.renderDetails ? props.renderDetails(row()) : _$createComponent(DescriptionList, {
|
|
241
300
|
columns: 3,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/ChartExplorer.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, createUniqueId, type JSX, Show } from \"solid-js\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { CopyButton } from \"../actions/CopyButton\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { DescriptionList } from \"../surfaces/DescriptionList\";\nimport { Paper } from \"../surfaces/Paper\";\nimport { ChartSnapshotView } from \"./ChartSnapshotView\";\nimport type { ChartCursor } from \"./chart-cursor\";\nimport { type ChartExplorerData, type ChartExplorerRow, validateChartExplorerData } from \"./chart-explorer\";\nimport { useChartMessages } from \"./chart-messages\";\nimport DataTable, { type DataTableSort } from \"./DataTable\";\n\nexport type ChartExplorerColumn<T> = {\n id: string;\n label: string;\n value: (row: T) => string;\n /** Optional table cell presentation; value remains the plain text used for copy/details. */\n render?: (row: T) => JSX.Element;\n /** Explicit comparable value. Omit to leave the column unsortable. */\n sortValue?: (row: T) => string | number | null;\n align?: \"left\" | \"center\" | \"right\";\n};\nexport type ChartExplorerProps<T extends ChartExplorerRow> = {\n cursor?: ChartCursor;\n title: string;\n description?: JSX.Element;\n data: ChartExplorerData<T>;\n columns: readonly ChartExplorerColumn<T>[];\n view?: \"chart\" | \"table\";\n defaultView?: \"chart\" | \"table\";\n onViewChange?: (view: \"chart\" | \"table\") => void;\n sort?: DataTableSort | null;\n defaultSort?: DataTableSort | null;\n onSortChange?: (sort: DataTableSort | null) => void;\n selectedKey?: string | null;\n onSelectedKeyChange?: (key: string | null) => void;\n /** false hides the complete local detail area for a shared selection panel. */\n renderDetails?: false | ((row: T) => JSX.Element);\n height?: string;\n class?: string;\n};\n\nconst tsvCell = (value: string) => (/[\\t\\r\\n\"]/.test(value) ? `\"${value.replaceAll('\"', '\"\"')}\"` : value);\n\nexport function ChartExplorer<T extends ChartExplorerRow>(props: ChartExplorerProps<T>) {\n const messages = useUiMessages();\n const chartMessages = useChartMessages();\n const locale = useLocale();\n const id = `k2b-chart-explorer-${createUniqueId()}`;\n const data = () => props.data;\n const [copyFailed, setCopyFailed] = createSignal(false);\n const [localSelection, setLocalSelection] = createSignal<string | null>(null);\n const [localView, setLocalView] = createSignal(props.defaultView ?? \"chart\");\n const [localSort, setLocalSort] = createSignal<DataTableSort | null>(props.defaultSort ?? null);\n const view = () => props.view ?? localView();\n const sort = () => (props.sort === undefined ? localSort() : props.sort);\n const setView = (value: \"chart\" | \"table\") => {\n if (props.view === undefined) setLocalView(value);\n props.onViewChange?.(value);\n };\n const setSort = (value: DataTableSort | null) => {\n if (props.sort === undefined) setLocalSort(value);\n props.onSortChange?.(value);\n };\n const rowsByKey = createMemo(() => new Map(data().rows.map((row) => [row.key, row])));\n const rawSelected = () => (props.selectedKey !== undefined ? props.selectedKey : localSelection());\n const selected = () => (rowsByKey().has(rawSelected() ?? \"\") ? rawSelected() : null);\n const selectedRow = () => rowsByKey().get(selected() ?? \"\");\n const select = (key: string | null) => {\n if (key !== null && !rowsByKey().has(key)) return;\n setLocalSelection(key);\n props.onSelectedKeyChange?.(key);\n };\n if (\n !props.columns.length ||\n props.columns.some((column) => !column.id) ||\n new Set(props.columns.map((column) => column.id)).size !== props.columns.length\n ) {\n throw new Error(\"Chart columns require unique nonempty IDs and at least one column\");\n }\n validateChartExplorerData(data());\n createEffect(() => validateChartExplorerData(data()));\n createEffect(() => {\n if (props.selectedKey === undefined && rawSelected() !== null && selected() === null) select(null);\n });\n const rows = createMemo(() => {\n const result = [...data().rows];\n const order = sort();\n const column = props.columns.find((c) => c.id === order?.key);\n const value = column?.sortValue;\n if (!order || !value) return result;\n const collator = new Intl.Collator(locale(), { numeric: true });\n return result.sort((a, b) => {\n const av = value(a),\n bv = value(b);\n if (av === null) return bv === null ? 0 : 1;\n if (bv === null) return -1;\n const comparison = typeof av === \"number\" && typeof bv === \"number\" ? av - bv : collator.compare(String(av), String(bv));\n return order.direction === \"asc\" ? comparison : -comparison;\n });\n });\n const copyText = () =>\n [\n props.columns.map((c) => tsvCell(c.label)).join(\"\\t\"),\n ...rows().map((row) => props.columns.map((c) => tsvCell(c.value(row))).join(\"\\t\")),\n ].join(\"\\n\");\n return (\n <section class={`k2b-chart-explorer ${props.class ?? \"\"}`} aria-labelledby={id}>\n <header class=\"k2b-chart-explorer__header\">\n <div>\n <h3 id={id}>{props.title}</h3>\n <Show when={props.description}>\n <div>{props.description}</div>\n </Show>\n </div>\n <div class=\"k2b-chart-explorer__actions\">\n <CopyButton\n text={copyText()}\n label={chartMessages().chartCopyData}\n iconOnly\n size=\"sm\"\n variant=\"ghost\"\n disabled={!rows().length}\n onCopyError={() => setCopyFailed(true)}\n onCopied={() => setCopyFailed(false)}\n />\n <SelectChip<\"chart\" | \"table\">\n value={view()}\n onValueChange={setView}\n aria-label={chartMessages().chartView}\n options={[\n { value: \"chart\", label: chartMessages().chartDiagram },\n { value: \"table\", label: chartMessages().chartData },\n ]}\n />\n </div>\n </header>\n <Show when={copyFailed()}>\n <span role=\"alert\">{chartMessages().chartCopyFailed}</span>\n </Show>\n <div class=\"k2b-chart-explorer__viewport\" style={{ height: props.height ?? \"18rem\" }}>\n <Show when={data().rows.length > 0} fallback={<div class=\"k2b-chart__empty\">{messages().noData}</div>}>\n <Show\n when={view() === \"chart\"}\n fallback={\n <DataTable\n rows={rows()}\n columns={props.columns.map((column) => ({\n id: column.id,\n header: column.label,\n value: column.value,\n align: column.align,\n sortable: Boolean(column.sortValue),\n }))}\n ariaLabelledBy={id}\n getRowId={(row) => row.key}\n selectedRowId={selected()}\n sort={sort()}\n fillHeight\n surface=\"paper\"\n onRowClick={(row) => select(row.key)}\n renderCell={({ row, col, value, render }) => {\n const custom = props.columns.find((column) => column.id === col.id)?.render;\n const cell = () => (custom ? custom(row) : render(value));\n return col.id === props.columns[0]?.id ? (\n <Button variant=\"text\" size=\"sm\" onClick={() => select(row.key)}>\n {cell()}\n </Button>\n ) : (\n cell()\n );\n }}\n renderHeader={({ col, render }) =>\n col.sortable ? (\n <Button\n variant=\"text\"\n size=\"sm\"\n onClick={() =>\n setSort({\n key: col.id,\n direction: sort()?.key === col.id && sort()?.direction === \"asc\" ? \"desc\" : \"asc\",\n })\n }\n >\n {props.columns.find((column) => column.id === col.id)?.label}\n {/* The data table's own marker: inactive columns keep a dimmed arrow so the header reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${sort()?.key === col.id && sort()?.direction === \"asc\" ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={sort()?.key === col.id ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </Button>\n ) : (\n render()\n )\n }\n />\n }\n >\n <ChartSnapshotView\n cursor={props.cursor}\n snapshot={data().chart}\n selectedKey={selected()}\n onSelect={select}\n style={{ height: \"100%\" }}\n />\n </Show>\n </Show>\n </div>\n <Show when={props.renderDetails !== false}>\n <div class=\"k2b-chart-explorer__details\" aria-live=\"polite\">\n <Show when={selectedRow()}>\n {(row) => (\n <Paper class=\"k2b-chart-explorer__detail-paper\">\n <div class=\"k2b-chart-explorer__detail-header\">\n <span>{chartMessages().chartSelectedDatum}</span>\n <IconButton variant=\"text\" size=\"sm\" label={messages().clearSelection} onClick={() => select(null)}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n {props.renderDetails ? (\n props.renderDetails(row())\n ) : (\n <DescriptionList\n columns={3}\n size=\"sm\"\n items={props.columns.map((column) => ({\n term: column.label,\n description: column.value(row()),\n }))}\n />\n )}\n </Paper>\n )}\n </Show>\n </div>\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/ChartExplorer.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, createUniqueId, For, type JSX, Show } from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { CopyButton } from \"../actions/CopyButton\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { DescriptionList } from \"../surfaces/DescriptionList\";\nimport { Paper } from \"../surfaces/Paper\";\nimport { ChartSnapshotView } from \"./ChartSnapshotView\";\nimport type { ChartCursor } from \"./chart-cursor\";\nimport { type ChartExplorerData, type ChartExplorerRow, validateChartExplorerData } from \"./chart-explorer\";\nimport { useChartMessages } from \"./chart-messages\";\nimport DataTable, { type DataTableSort } from \"./DataTable\";\n\nexport type ChartExplorerColumn<T> = {\n id: string;\n label: string;\n value: (row: T) => string;\n /** Optional table cell presentation; value remains the plain text used for copy/details. */\n render?: (row: T) => JSX.Element;\n /**\n * Explicit comparable value. Omit to leave the column unsortable.\n * Returning a number also exempts the cell from spreadsheet formula guarding on copy.\n */\n sortValue?: (row: T) => string | number | null;\n align?: \"left\" | \"center\" | \"right\";\n};\n/** One legend entry; `color` is the palette index the renderer gave the series (0 is `--stdlib-chart-c1`). */\nexport type ChartLegendEntry = {\n label: string;\n color: number;\n /** Line pattern of a line series; a solid series shows a filled swatch. */\n style?: \"solid\" | \"dashed\" | \"dotted\";\n /** A comparison series, drawn hollow like its marks. */\n reference?: boolean;\n};\nexport type ChartExplorerProps<T extends ChartExplorerRow> = {\n cursor?: ChartCursor;\n title: string;\n /** Level of the title heading. Defaults to 3; a chart inside a titled group of charts sits one level below it. */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n description?: JSX.Element;\n data: ChartExplorerData<T>;\n columns: readonly ChartExplorerColumn<T>[];\n view?: \"chart\" | \"table\";\n defaultView?: \"chart\" | \"table\";\n onViewChange?: (view: \"chart\" | \"table\") => void;\n /**\n * Several charts of the same rows. The switcher then lists each chart and the table; `chart` names the one `data`\n * holds, and `onChartChange` reports a pick, so the owner passes the matching data.\n */\n charts?: readonly { id: string; label: string }[];\n chart?: string;\n onChartChange?: (id: string) => void;\n /** Filter controls between the header and the viewport, such as ChartFilterControls. */\n controls?: JSX.Element;\n /** The table renders at most this many rows of the sorted order; sorting and Copy data use every row. */\n tableRows?: number;\n sort?: DataTableSort | null;\n defaultSort?: DataTableSort | null;\n onSortChange?: (sort: DataTableSort | null) => void;\n selectedKey?: string | null;\n onSelectedKeyChange?: (key: string | null) => void;\n /** false hides the complete local detail area for a shared selection panel. */\n renderDetails?: false | ((row: T) => JSX.Element);\n height?: string;\n /**\n * Series names below the chart, wrapping inside the fixed viewport height. Use it instead of the renderer's legend,\n * which draws in one row and runs out of narrow columns.\n */\n legend?: readonly ChartLegendEntry[];\n /** What the viewport shows without rows, for example while they load; defaults to \"No data\". */\n empty?: JSX.Element;\n class?: string;\n};\n\nconst tsvCell = (value: string, numeric = false) => {\n const safe = !numeric && /^[=+\\-@\\t\\r]/.test(value) ? `'${value}` : value;\n return /[\\t\\r\\n\"]/.test(safe) ? `\"${safe.replaceAll('\"', '\"\"')}\"` : safe;\n};\n\nexport function ChartExplorer<T extends ChartExplorerRow>(props: ChartExplorerProps<T>) {\n const messages = useUiMessages();\n const chartMessages = useChartMessages();\n const locale = useLocale();\n const id = `k2b-chart-explorer-${createUniqueId()}`;\n const data = () => props.data;\n const [copyFailed, setCopyFailed] = createSignal(false);\n const [localSelection, setLocalSelection] = createSignal<string | null>(null);\n const [localView, setLocalView] = createSignal(props.defaultView ?? \"chart\");\n const [localSort, setLocalSort] = createSignal<DataTableSort | null>(props.defaultSort ?? null);\n const view = () => props.view ?? localView();\n const sort = () => (props.sort === undefined ? localSort() : props.sort);\n const setView = (value: \"chart\" | \"table\") => {\n if (props.view === undefined) setLocalView(value);\n props.onViewChange?.(value);\n };\n const setSort = (value: DataTableSort | null) => {\n if (props.sort === undefined) setLocalSort(value);\n props.onSortChange?.(value);\n };\n const rowsByKey = createMemo(() => new Map(data().rows.map((row) => [row.key, row])));\n const rawSelected = () => (props.selectedKey !== undefined ? props.selectedKey : localSelection());\n const selected = () => (rowsByKey().has(rawSelected() ?? \"\") ? rawSelected() : null);\n const selectedRow = () => rowsByKey().get(selected() ?? \"\");\n const select = (key: string | null) => {\n if (key !== null && !rowsByKey().has(key)) return;\n setLocalSelection(key);\n props.onSelectedKeyChange?.(key);\n };\n if (\n !props.columns.length ||\n props.columns.some((column) => !column.id) ||\n new Set(props.columns.map((column) => column.id)).size !== props.columns.length\n ) {\n throw new Error(\"Chart columns require unique nonempty IDs and at least one column\");\n }\n validateChartExplorerData(data());\n createEffect(() => validateChartExplorerData(data()));\n createEffect(() => {\n if (props.selectedKey === undefined && rawSelected() !== null && selected() === null) select(null);\n });\n const rows = createMemo(() => {\n const result = [...data().rows];\n const order = sort();\n const column = props.columns.find((c) => c.id === order?.key);\n const value = column?.sortValue;\n if (!order || !value) return result;\n const collator = new Intl.Collator(locale(), { numeric: true });\n return result.sort((a, b) => {\n const av = value(a),\n bv = value(b);\n if (av === null) return bv === null ? 0 : 1;\n if (bv === null) return -1;\n const comparison = typeof av === \"number\" && typeof bv === \"number\" ? av - bv : collator.compare(String(av), String(bv));\n return order.direction === \"asc\" ? comparison : -comparison;\n });\n });\n const shownRows = () => (props.tableRows === undefined ? rows() : rows().slice(0, props.tableRows));\n // Chart ids are data; a prefix keeps one named \"table\" apart from the table entry.\n const switcherValue = () => (view() === \"table\" || !props.charts?.length ? view() : `chart:${props.chart ?? props.charts[0]?.id}`);\n const switcherOptions = () =>\n props.charts?.length\n ? [\n ...props.charts.map((chart) => ({ value: `chart:${chart.id}`, label: chart.label })),\n { value: \"table\", label: chartMessages().chartData },\n ]\n : [\n { value: \"chart\", label: chartMessages().chartDiagram },\n { value: \"table\", label: chartMessages().chartData },\n ];\n const pick = (value: string) => {\n if (value === \"table\" || value === \"chart\") return setView(value);\n setView(\"chart\");\n props.onChartChange?.(value.slice(\"chart:\".length));\n };\n const copyText = () =>\n [\n props.columns.map((c) => tsvCell(c.label)).join(\"\\t\"),\n ...rows().map((row) => props.columns.map((c) => tsvCell(c.value(row), typeof c.sortValue?.(row) === \"number\")).join(\"\\t\")),\n ].join(\"\\n\");\n return (\n <section class={`k2b-chart-explorer ${props.class ?? \"\"}`} aria-labelledby={id}>\n <header class=\"k2b-chart-explorer__header\">\n <div>\n <Dynamic component={`h${props.headingLevel ?? 3}`} id={id} class=\"k2b-chart-explorer__title\">\n {props.title}\n </Dynamic>\n <Show when={props.description}>\n <div>{props.description}</div>\n </Show>\n </div>\n <div class=\"k2b-chart-explorer__actions\">\n <CopyButton\n text={copyText()}\n label={chartMessages().chartCopyData}\n iconOnly\n size=\"sm\"\n variant=\"ghost\"\n disabled={!rows().length}\n onCopyError={() => setCopyFailed(true)}\n onCopied={() => setCopyFailed(false)}\n />\n <SelectChip<string>\n value={switcherValue()}\n onValueChange={pick}\n aria-label={chartMessages().chartView}\n options={switcherOptions()}\n />\n </div>\n </header>\n <Show when={copyFailed()}>\n <span role=\"alert\">{chartMessages().chartCopyFailed}</span>\n </Show>\n {props.controls}\n <div\n class=\"k2b-chart-explorer__viewport\"\n data-legend={view() === \"chart\" && props.legend?.length && data().rows.length > 0 ? \"true\" : undefined}\n data-capped={view() === \"table\" && shownRows().length < rows().length ? \"true\" : undefined}\n style={{ height: props.height ?? \"18rem\" }}\n >\n <Show when={data().rows.length > 0} fallback={<div class=\"k2b-chart__empty\">{props.empty ?? messages().noData}</div>}>\n <Show\n when={view() === \"chart\"}\n fallback={\n <>\n <DataTable\n rows={shownRows()}\n columns={props.columns.map((column) => ({\n id: column.id,\n header: column.label,\n value: column.value,\n align: column.align,\n sortable: Boolean(column.sortValue),\n }))}\n ariaLabelledBy={id}\n getRowId={(row) => row.key}\n selectedRowId={selected()}\n sort={sort()}\n fillHeight\n surface=\"paper\"\n onRowClick={(row) => select(row.key)}\n renderCell={({ row, col, value, render }) => {\n const custom = props.columns.find((column) => column.id === col.id)?.render;\n const cell = () => (custom ? custom(row) : render(value));\n return !custom && col.id === props.columns[0]?.id ? (\n <Button variant=\"text\" size=\"sm\" onClick={() => select(row.key)}>\n {cell()}\n </Button>\n ) : (\n cell()\n );\n }}\n renderHeader={({ col, render }) =>\n col.sortable ? (\n <Button\n variant=\"text\"\n size=\"sm\"\n onClick={() =>\n setSort({\n key: col.id,\n direction: sort()?.key === col.id && sort()?.direction === \"asc\" ? \"desc\" : \"asc\",\n })\n }\n >\n {props.columns.find((column) => column.id === col.id)?.label}\n {/* The data table's own marker: inactive columns keep a dimmed arrow so the header reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${sort()?.key === col.id && sort()?.direction === \"asc\" ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={sort()?.key === col.id ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </Button>\n ) : (\n render()\n )\n }\n />\n <Show when={shownRows().length < rows().length}>\n <p class=\"k2b-chart-explorer__note\">\n {chartMessages().chartRowsShown({\n shown: new Intl.NumberFormat(locale()).format(shownRows().length),\n total: new Intl.NumberFormat(locale()).format(rows().length),\n })}\n </p>\n </Show>\n </>\n }\n >\n <ChartSnapshotView\n cursor={props.cursor}\n snapshot={data().chart}\n selectedKey={selected()}\n onSelect={select}\n style={props.legend?.length ? undefined : { height: \"100%\" }}\n />\n <Show when={props.legend?.length}>\n <ul class=\"k2b-chart-legend\" aria-label={chartMessages().chartLegend}>\n <For each={props.legend}>\n {(entry) => (\n <li>\n <span\n class=\"k2b-chart-legend__swatch\"\n data-style={entry.style && entry.style !== \"solid\" ? entry.style : undefined}\n data-reference={entry.reference ? \"true\" : undefined}\n style={{ \"--k2b-chart-legend-color\": `var(--stdlib-chart-c${(Math.abs(Math.trunc(entry.color)) % 8) + 1})` }}\n aria-hidden=\"true\"\n />\n {entry.label}\n </li>\n )}\n </For>\n </ul>\n </Show>\n </Show>\n </Show>\n </div>\n <Show when={props.renderDetails !== false}>\n <div class=\"k2b-chart-explorer__details\" aria-live=\"polite\">\n <Show when={selectedRow()}>\n {(row) => (\n <Paper class=\"k2b-chart-explorer__detail-paper\">\n <div class=\"k2b-chart-explorer__detail-header\">\n <span>{chartMessages().chartSelectedDatum}</span>\n <IconButton variant=\"text\" size=\"sm\" label={messages().clearSelection} onClick={() => select(null)}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n {props.renderDetails ? (\n props.renderDetails(row())\n ) : (\n <DescriptionList\n columns={3}\n size=\"sm\"\n items={props.columns.map((column) => ({\n term: column.label,\n description: column.value(row()),\n }))}\n />\n )}\n </Paper>\n )}\n </Show>\n </div>\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|