@k2b/ui 0.22.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/browser/content/Calendar.js +1122 -1065
  2. package/dist/browser/content/Calendar.js.map +1 -1
  3. package/dist/browser/content/CalendarDayView.js +1187 -0
  4. package/dist/browser/content/CalendarDayView.js.map +1 -0
  5. package/dist/browser/content/CalendarWeekView.js +1593 -0
  6. package/dist/browser/content/CalendarWeekView.js.map +1 -0
  7. package/dist/browser/content/ChartExplorer.js +174 -82
  8. package/dist/browser/content/ChartExplorer.js.map +1 -1
  9. package/dist/browser/content/ChartFilterControls.js +90 -33
  10. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  11. package/dist/browser/content/DataTable.js +235 -197
  12. package/dist/browser/content/DataTable.js.map +1 -1
  13. package/dist/browser/content/calendar-day-scroll.js +111 -0
  14. package/dist/browser/content/calendar-day-scroll.js.map +1 -0
  15. package/dist/browser/content/calendar-days.js +408 -0
  16. package/dist/browser/content/calendar-days.js.map +1 -0
  17. package/dist/browser/content/calendar-dialogs.js +236 -0
  18. package/dist/browser/content/calendar-dialogs.js.map +1 -0
  19. package/dist/browser/content/calendar-messages.js +210 -2
  20. package/dist/browser/content/calendar-messages.js.map +1 -1
  21. package/dist/browser/content/calendar-pointer.js +15 -3
  22. package/dist/browser/content/calendar-pointer.js.map +1 -1
  23. package/dist/browser/content/calendar-shared.js +328 -0
  24. package/dist/browser/content/calendar-shared.js.map +1 -0
  25. package/dist/browser/content/calendar-time-view.js +1654 -0
  26. package/dist/browser/content/calendar-time-view.js.map +1 -0
  27. package/dist/browser/content/chart-messages.js +10 -0
  28. package/dist/browser/content/chart-messages.js.map +1 -1
  29. package/dist/browser/content/index.js.map +1 -1
  30. package/dist/browser/inputs/Combobox.js +0 -1
  31. package/dist/browser/inputs/Combobox.js.map +1 -1
  32. package/dist/browser/layout/AppWorkspace.js +125 -97
  33. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  34. package/dist/browser/layout/Navigation.js +18 -3
  35. package/dist/browser/layout/Navigation.js.map +1 -1
  36. package/dist/browser/layout/PageTitle.js +18 -1
  37. package/dist/browser/layout/PageTitle.js.map +1 -1
  38. package/dist/browser/layout/SidebarSwitcher.js +505 -0
  39. package/dist/browser/layout/SidebarSwitcher.js.map +1 -0
  40. package/dist/browser/layout/app-workspace-controller.js +174 -86
  41. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  42. package/dist/browser/layout/index.js +1 -0
  43. package/dist/browser/layout/index.js.map +1 -1
  44. package/dist/browser/layout/navigation-model.js +1 -0
  45. package/dist/browser/layout/navigation-model.js.map +1 -1
  46. package/dist/browser/surfaces/StatCell.js +18 -6
  47. package/dist/browser/surfaces/StatCell.js.map +1 -1
  48. package/dist/ssr/content/Calendar.js +553 -341
  49. package/dist/ssr/content/Calendar.js.map +1 -1
  50. package/dist/ssr/content/CalendarDayView.js +800 -0
  51. package/dist/ssr/content/CalendarDayView.js.map +1 -0
  52. package/dist/ssr/content/CalendarWeekView.js +1090 -0
  53. package/dist/ssr/content/CalendarWeekView.js.map +1 -0
  54. package/dist/ssr/content/ChartExplorer.js +93 -34
  55. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  56. package/dist/ssr/content/ChartFilterControls.js +49 -7
  57. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  58. package/dist/ssr/content/DataTable.js +88 -66
  59. package/dist/ssr/content/DataTable.js.map +1 -1
  60. package/dist/ssr/content/calendar-day-scroll.js +111 -0
  61. package/dist/ssr/content/calendar-day-scroll.js.map +1 -0
  62. package/dist/ssr/content/calendar-days.js +408 -0
  63. package/dist/ssr/content/calendar-days.js.map +1 -0
  64. package/dist/ssr/content/calendar-dialogs.js +159 -0
  65. package/dist/ssr/content/calendar-dialogs.js.map +1 -0
  66. package/dist/ssr/content/calendar-messages.js +210 -2
  67. package/dist/ssr/content/calendar-messages.js.map +1 -1
  68. package/dist/ssr/content/calendar-pointer.js +15 -3
  69. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  70. package/dist/ssr/content/calendar-shared.js +261 -0
  71. package/dist/ssr/content/calendar-shared.js.map +1 -0
  72. package/dist/ssr/content/calendar-time-view.js +1311 -0
  73. package/dist/ssr/content/calendar-time-view.js.map +1 -0
  74. package/dist/ssr/content/chart-messages.js +10 -0
  75. package/dist/ssr/content/chart-messages.js.map +1 -1
  76. package/dist/ssr/content/index.js.map +1 -1
  77. package/dist/ssr/inputs/Combobox.js.map +1 -1
  78. package/dist/ssr/layout/AppWorkspace.js +40 -29
  79. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  80. package/dist/ssr/layout/Navigation.js +12 -2
  81. package/dist/ssr/layout/Navigation.js.map +1 -1
  82. package/dist/ssr/layout/PageTitle.js +18 -1
  83. package/dist/ssr/layout/PageTitle.js.map +1 -1
  84. package/dist/ssr/layout/SidebarSwitcher.js +271 -0
  85. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -0
  86. package/dist/ssr/layout/app-workspace-controller.js +174 -86
  87. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  88. package/dist/ssr/layout/index.js +1 -0
  89. package/dist/ssr/layout/index.js.map +1 -1
  90. package/dist/ssr/layout/navigation-model.js +1 -0
  91. package/dist/ssr/layout/navigation-model.js.map +1 -1
  92. package/dist/ssr/surfaces/StatCell.js +2 -2
  93. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  94. package/dist/styles.css +1 -1
  95. package/dist/types/content/Calendar.d.ts +95 -1
  96. package/dist/types/content/CalendarDayView.d.ts +7 -0
  97. package/dist/types/content/CalendarWeekView.d.ts +7 -0
  98. package/dist/types/content/ChartExplorer.d.ts +36 -1
  99. package/dist/types/content/ChartFilterControls.d.ts +6 -1
  100. package/dist/types/content/DataTable.d.ts +14 -0
  101. package/dist/types/content/calendar-day-scroll.d.ts +47 -0
  102. package/dist/types/content/calendar-days.d.ts +192 -0
  103. package/dist/types/content/calendar-dialogs.d.ts +22 -0
  104. package/dist/types/content/calendar-messages.d.ts +99 -0
  105. package/dist/types/content/calendar-pointer.d.ts +9 -0
  106. package/dist/types/content/calendar-shared.d.ts +69 -0
  107. package/dist/types/content/calendar-time-view.d.ts +252 -0
  108. package/dist/types/content/chart-messages.d.ts +5 -0
  109. package/dist/types/content/index.d.ts +2 -2
  110. package/dist/types/layout/AppWorkspace.d.ts +27 -3
  111. package/dist/types/layout/PageTitle.d.ts +2 -1
  112. package/dist/types/layout/SidebarSwitcher.d.ts +65 -0
  113. package/dist/types/layout/app-workspace-controller.d.ts +9 -1
  114. package/dist/types/layout/index.d.ts +1 -0
  115. package/dist/types/layout/navigation-model.d.ts +4 -0
  116. package/dist/types/surfaces/StatCell.d.ts +5 -0
  117. package/package.json +3 -3
@@ -0,0 +1 @@
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 edge. 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 edge 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 /** Whether a wheel or a finger moved the strip since it last settled, and the way it last moved. */\n let gesture = false;\n let heading = 0;\n let headingFrom = 0;\n const settle = () => {\n if (!scroller || fingers > 0 || settling || glideTarget !== null || view.dragging()) return;\n const width = columnWidth();\n const space = Number.parseFloat(getComputedStyle(scroller).scrollPaddingRight) || 0;\n // A gesture rests on the nearest edge. A scroll without one, such as a reveal, goes on its way, so what it brought\n // into view stays there; with end space, a revealed day can rest with its end beside the drawer.\n const target = snapToColumn(\n scroller.scrollLeft,\n width,\n space > 0 ? scroller.clientWidth - gutterWidth() - space : undefined,\n gesture ? 0 : heading,\n );\n gesture = false;\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 gesture = true;\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 (Math.abs(scroller.scrollLeft - headingFrom) > 0.5) heading = Math.sign(scroller.scrollLeft - headingFrom);\n headingFrom = scroller.scrollLeft;\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 /** The day width the strip last kept its first day for. */\n let measuredWidth = 0;\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 if (!scroller) return;\n // A reveal the scroll handler has not read yet wins over keeping the first day.\n const unread = Math.abs(scroller.scrollLeft - lastLeft) > 0.5;\n const before = untrack(firstIndex);\n measureCount();\n // Only days of a new width move the strip back onto its first day. Setting scrollLeft stops a smooth scroll\n // on its way, such as a reveal, so a drawer's padding or the strip's own trim must not.\n const width = columnWidth();\n const resized = Math.abs(width - measuredWidth) > 0.01;\n measuredWidth = width;\n if (resized && !unread && Math.abs(scroller.scrollLeft - leftOf(before)) > 0.5) 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 k2b-detail-trail\"\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 gesture = true;\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 = ["<div class=\"k2b-chart-explorer__details\" aria-live=\"polite\">", "</div>"],
9
- _tmpl$4 = ["<section class=\"", "\"", "><header class=\"k2b-chart-explorer__header\"><div><h3", ">", "</h3>", "</div><div class=\"k2b-chart-explorer__actions\">", "", "</div></header>", "<div class=\"k2b-chart-explorer__viewport\" style=\"", "\">", "</div>", "</section>"],
10
- _tmpl$5 = ["<div class=\"k2b-chart__empty\">", "</div>"],
11
- _tmpl$6 = ["<i class=\"", "\"", " aria-hidden=\"true\"></i>"],
12
- _tmpl$7 = "<i class=\"ti ti-x\" aria-hidden=\"true\"></i>",
13
- _tmpl$8 = ["<div class=\"k2b-chart-explorer__detail-header\"><span>", "</span>", "</div>"];
14
- import { createEffect, createMemo, createSignal, createUniqueId, Show } from "solid-js";
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
- const tsvCell = value => /[\t\r\n"]/.test(value) ? `"${value.replaceAll('"', '""')}"` : value;
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 copyText = () => [props.columns.map(c => tsvCell(c.label)).join("\t"), ...rows().map(row => props.columns.map(c => tsvCell(c.value(row))).join("\t"))].join("\n");
83
- return _$ssr(_tmpl$4, `k2b-chart-explorer ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-labelledby", _$escape(id, true), false), _$ssrAttribute("id", _$escape(id, true), false), _$escape(props.title), _$escape(_$createComponent(Show, {
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 view();
148
+ return switcherValue();
108
149
  },
109
- onValueChange: setView,
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$5, _$escape(messages().noData));
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 rows();
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$6, `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))];
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
- height: "100%"
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$3, _$escape(_$createComponent(Show, {
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$8, _$escape(chartMessages().chartSelectedDatum), _$escape(_$createComponent(IconButton, {
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$7);
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":[]}