@k2b/ui 0.30.0 → 0.32.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 (186) hide show
  1. package/README.md +1 -1
  2. package/dist/base.css +2 -0
  3. package/dist/browser/actions/Toolbar.js +2 -0
  4. package/dist/browser/actions/Toolbar.js.map +1 -1
  5. package/dist/browser/actions/ViewTabs.js +8 -0
  6. package/dist/browser/actions/ViewTabs.js.map +1 -1
  7. package/dist/browser/chat/ChatDecision.js +28 -2
  8. package/dist/browser/chat/ChatDecision.js.map +1 -1
  9. package/dist/browser/content/Chart.js +104 -55
  10. package/dist/browser/content/Chart.js.map +1 -1
  11. package/dist/browser/content/ChartExplorer.js +5 -3
  12. package/dist/browser/content/ChartExplorer.js.map +1 -1
  13. package/dist/browser/content/MapAttribution.js +27 -0
  14. package/dist/browser/content/MapAttribution.js.map +1 -0
  15. package/dist/browser/content/MapView.js +553 -0
  16. package/dist/browser/content/MapView.js.map +1 -0
  17. package/dist/browser/content/MapViewFrame.js +395 -0
  18. package/dist/browser/content/MapViewFrame.js.map +1 -0
  19. package/dist/browser/content/chart-inspection-core.js +4 -1
  20. package/dist/browser/content/chart-inspection-core.js.map +1 -1
  21. package/dist/browser/content/code-highlight.js +66 -0
  22. package/dist/browser/content/code-highlight.js.map +1 -1
  23. package/dist/browser/content/index.js +6 -0
  24. package/dist/browser/content/index.js.map +1 -1
  25. package/dist/browser/content/map-palette.js +39 -0
  26. package/dist/browser/content/map-palette.js.map +1 -0
  27. package/dist/browser/content/map-style.js +276 -0
  28. package/dist/browser/content/map-style.js.map +1 -0
  29. package/dist/browser/content/map-view-geometry.js +269 -0
  30. package/dist/browser/content/map-view-geometry.js.map +1 -0
  31. package/dist/browser/content/map-view-live.js +65 -0
  32. package/dist/browser/content/map-view-live.js.map +1 -0
  33. package/dist/browser/content/map-view-messages.js +53 -0
  34. package/dist/browser/content/map-view-messages.js.map +1 -0
  35. package/dist/browser/content/map-view-types.js +2 -0
  36. package/dist/browser/content/map-view-types.js.map +1 -0
  37. package/dist/browser/content/map-view-worker.js +10 -0
  38. package/dist/browser/feedback/dialog-core.js +19 -0
  39. package/dist/browser/feedback/dialog-core.js.map +1 -1
  40. package/dist/browser/inputs/AutocompleteEditor.js +167 -104
  41. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  42. package/dist/browser/inputs/RichSelect.js +1474 -0
  43. package/dist/browser/inputs/RichSelect.js.map +1 -0
  44. package/dist/browser/inputs/TextInput.js +95 -60
  45. package/dist/browser/inputs/TextInput.js.map +1 -1
  46. package/dist/browser/inputs/choice.js +19 -8
  47. package/dist/browser/inputs/choice.js.map +1 -1
  48. package/dist/browser/inputs/index.js +1 -0
  49. package/dist/browser/inputs/index.js.map +1 -1
  50. package/dist/browser/inputs/rich-select-messages.js +46 -0
  51. package/dist/browser/inputs/rich-select-messages.js.map +1 -0
  52. package/dist/browser/layout/AppWorkspace.js +194 -144
  53. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  54. package/dist/browser/layout/DetailPanel.js +10 -1
  55. package/dist/browser/layout/DetailPanel.js.map +1 -1
  56. package/dist/browser/layout/Navigation.js +14 -5
  57. package/dist/browser/layout/Navigation.js.map +1 -1
  58. package/dist/browser/layout/PageTitle.js +9 -3
  59. package/dist/browser/layout/PageTitle.js.map +1 -1
  60. package/dist/browser/layout/ResizeSeparator.js +8 -2
  61. package/dist/browser/layout/ResizeSeparator.js.map +1 -1
  62. package/dist/browser/layout/app-workspace-controller.js +301 -34
  63. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  64. package/dist/browser/layout/app-workspace-width.js +26 -0
  65. package/dist/browser/layout/app-workspace-width.js.map +1 -0
  66. package/dist/browser/layout/index.js +1 -1
  67. package/dist/browser/layout/index.js.map +1 -1
  68. package/dist/browser/layout/navigation-model.js.map +1 -1
  69. package/dist/browser/layout/resize-separator.js +25 -1
  70. package/dist/browser/layout/resize-separator.js.map +1 -1
  71. package/dist/browser/surfaces/Skeleton.js +14 -0
  72. package/dist/browser/surfaces/Skeleton.js.map +1 -0
  73. package/dist/browser/surfaces/index.js +1 -0
  74. package/dist/browser/surfaces/index.js.map +1 -1
  75. package/dist/licenses/maplibre-gl.txt +116 -0
  76. package/dist/ssr/actions/Toolbar.js +2 -0
  77. package/dist/ssr/actions/Toolbar.js.map +1 -1
  78. package/dist/ssr/actions/ViewTabs.js +8 -0
  79. package/dist/ssr/actions/ViewTabs.js.map +1 -1
  80. package/dist/ssr/chat/ChatDecision.js +11 -0
  81. package/dist/ssr/chat/ChatDecision.js.map +1 -1
  82. package/dist/ssr/content/Chart.js +27 -7
  83. package/dist/ssr/content/Chart.js.map +1 -1
  84. package/dist/ssr/content/ChartExplorer.js +5 -3
  85. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  86. package/dist/ssr/content/MapAttribution.js +19 -0
  87. package/dist/ssr/content/MapAttribution.js.map +1 -0
  88. package/dist/ssr/content/MapView.js +474 -0
  89. package/dist/ssr/content/MapView.js.map +1 -0
  90. package/dist/ssr/content/MapViewFrame.js +193 -0
  91. package/dist/ssr/content/MapViewFrame.js.map +1 -0
  92. package/dist/ssr/content/chart-inspection-core.js +4 -1
  93. package/dist/ssr/content/chart-inspection-core.js.map +1 -1
  94. package/dist/ssr/content/code-highlight.js +66 -0
  95. package/dist/ssr/content/code-highlight.js.map +1 -1
  96. package/dist/ssr/content/index.js +6 -0
  97. package/dist/ssr/content/index.js.map +1 -1
  98. package/dist/ssr/content/map-palette.js +39 -0
  99. package/dist/ssr/content/map-palette.js.map +1 -0
  100. package/dist/ssr/content/map-style.js +276 -0
  101. package/dist/ssr/content/map-style.js.map +1 -0
  102. package/dist/ssr/content/map-view-geometry.js +269 -0
  103. package/dist/ssr/content/map-view-geometry.js.map +1 -0
  104. package/dist/ssr/content/map-view-live.js +1 -0
  105. package/dist/ssr/content/map-view-messages.js +53 -0
  106. package/dist/ssr/content/map-view-messages.js.map +1 -0
  107. package/dist/ssr/content/map-view-types.js +2 -0
  108. package/dist/ssr/content/map-view-types.js.map +1 -0
  109. package/dist/ssr/feedback/dialog-core.js +19 -0
  110. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  111. package/dist/ssr/inputs/AutocompleteEditor.js +64 -24
  112. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  113. package/dist/ssr/inputs/RichSelect.js +950 -0
  114. package/dist/ssr/inputs/RichSelect.js.map +1 -0
  115. package/dist/ssr/inputs/TextInput.js +40 -16
  116. package/dist/ssr/inputs/TextInput.js.map +1 -1
  117. package/dist/ssr/inputs/choice.js +19 -8
  118. package/dist/ssr/inputs/choice.js.map +1 -1
  119. package/dist/ssr/inputs/index.js +1 -0
  120. package/dist/ssr/inputs/index.js.map +1 -1
  121. package/dist/ssr/inputs/rich-select-messages.js +46 -0
  122. package/dist/ssr/inputs/rich-select-messages.js.map +1 -0
  123. package/dist/ssr/layout/AppWorkspace.js +53 -16
  124. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  125. package/dist/ssr/layout/DetailPanel.js +1 -1
  126. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  127. package/dist/ssr/layout/Navigation.js +1 -1
  128. package/dist/ssr/layout/Navigation.js.map +1 -1
  129. package/dist/ssr/layout/PageTitle.js +9 -3
  130. package/dist/ssr/layout/PageTitle.js.map +1 -1
  131. package/dist/ssr/layout/ResizeSeparator.js +4 -1
  132. package/dist/ssr/layout/ResizeSeparator.js.map +1 -1
  133. package/dist/ssr/layout/app-workspace-controller.js +301 -34
  134. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  135. package/dist/ssr/layout/app-workspace-width.js +26 -0
  136. package/dist/ssr/layout/app-workspace-width.js.map +1 -0
  137. package/dist/ssr/layout/index.js +1 -1
  138. package/dist/ssr/layout/index.js.map +1 -1
  139. package/dist/ssr/layout/navigation-model.js.map +1 -1
  140. package/dist/ssr/layout/resize-separator.js +25 -1
  141. package/dist/ssr/layout/resize-separator.js.map +1 -1
  142. package/dist/ssr/surfaces/Skeleton.js +8 -0
  143. package/dist/ssr/surfaces/Skeleton.js.map +1 -0
  144. package/dist/ssr/surfaces/index.js +1 -0
  145. package/dist/ssr/surfaces/index.js.map +1 -1
  146. package/dist/styles.css +1 -1
  147. package/dist/types/content/Chart.d.ts +4 -2
  148. package/dist/types/content/ChartExplorer.d.ts +0 -1
  149. package/dist/types/content/MapAttribution.d.ts +6 -0
  150. package/dist/types/content/MapView.d.ts +5 -0
  151. package/dist/types/content/MapViewFrame.d.ts +31 -0
  152. package/dist/types/content/code-highlight.d.ts +3 -1
  153. package/dist/types/content/index.d.ts +7 -0
  154. package/dist/types/content/map-palette.d.ts +58 -0
  155. package/dist/types/content/map-style.d.ts +29 -0
  156. package/dist/types/content/map-view-geometry.d.ts +55 -0
  157. package/dist/types/content/map-view-live.d.ts +2 -0
  158. package/dist/types/content/map-view-messages.d.ts +21 -0
  159. package/dist/types/content/map-view-types.d.ts +63 -0
  160. package/dist/types/feedback/dialog-core.d.ts +1 -0
  161. package/dist/types/inputs/AutocompleteEditor.d.ts +6 -1
  162. package/dist/types/inputs/RichSelect.d.ts +93 -0
  163. package/dist/types/inputs/TextInput.d.ts +5 -2
  164. package/dist/types/inputs/choice.d.ts +24 -4
  165. package/dist/types/inputs/index.d.ts +2 -0
  166. package/dist/types/inputs/rich-select-messages.d.ts +21 -0
  167. package/dist/types/layout/AppWorkspace.d.ts +14 -3
  168. package/dist/types/layout/DetailPanel.d.ts +2 -0
  169. package/dist/types/layout/app-workspace-controller.d.ts +2 -0
  170. package/dist/types/layout/app-workspace-width.d.ts +13 -0
  171. package/dist/types/layout/index.d.ts +2 -2
  172. package/dist/types/layout/navigation-model.d.ts +2 -0
  173. package/dist/types/layout/resize-separator.d.ts +1 -0
  174. package/dist/types/surfaces/Skeleton.d.ts +6 -0
  175. package/dist/types/surfaces/index.d.ts +1 -0
  176. package/map-glyphs/IBM Plex Sans Medium/0-255.pbf +0 -0
  177. package/map-glyphs/IBM Plex Sans Medium/1024-1279.pbf +0 -0
  178. package/map-glyphs/IBM Plex Sans Medium/256-511.pbf +0 -0
  179. package/map-glyphs/IBM Plex Sans Medium/512-767.pbf +0 -0
  180. package/map-glyphs/IBM Plex Sans Medium/768-1023.pbf +0 -0
  181. package/map-glyphs/IBM Plex Sans Medium/7680-7935.pbf +0 -0
  182. package/map-glyphs/IBM Plex Sans Medium/8192-8447.pbf +0 -0
  183. package/map-glyphs/IBM Plex Sans Medium/8448-8703.pbf +0 -0
  184. package/map-glyphs/IBM Plex Sans Medium/8704-8959.pbf +0 -0
  185. package/map-glyphs/OFL.txt +93 -0
  186. package/package.json +11 -6
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/MapView.tsx"],"sourcesContent":["import type { Map as LiveMap } from \"maplibre-gl\";\nimport { children, createEffect, createMemo, createSignal, type JSX, on, onCleanup, onMount, Show, untrack } from \"solid-js\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { prefersReducedMotion } from \"../motion\";\nimport { MapFootRow, MapGeometry, type MapScale, referenceScale, selectedMarker } from \"./MapViewFrame\";\nimport {\n DEFAULT_PADDING,\n fitCamera,\n type MapFrame,\n mapFrame,\n metersPerPixel,\n pinOffsets,\n scaleBar,\n sortMarkers,\n unprojectPoint,\n} from \"./map-view-geometry\";\nimport { useMapViewMessages } from \"./map-view-messages\";\nimport type { MapViewMarker, MapViewProps, MapViewStyle } from \"./map-view-types\";\n\nexport type { MapViewProps } from \"./map-view-types\";\n\ntype MapState = \"static\" | \"loading\" | \"ready\" | \"error\" | \"no-webgl\" | \"empty\";\n\nfunction supportsWebgl(): boolean {\n try {\n const canvas = document.createElement(\"canvas\");\n // MapLibre 6 draws with WebGL 2 only; a browser with just WebGL 1 gets the static frame and the notice.\n const gl = canvas.getContext(\"webgl2\");\n if (!gl) return false;\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return true;\n } catch {\n return false;\n }\n}\n\n/** A static server frame enhanced with a same-origin MapLibre worker only after it enters the viewport. */\nexport function MapView(props: MapViewProps): JSX.Element {\n const messages = useMapViewMessages();\n const frame = createMemo(() => mapFrame(props, props.height, props.padding ?? DEFAULT_PADDING));\n const selected = createMemo(() => selectedMarker(props.markers ?? [], props.selectedId));\n const selectedId = createMemo(() => selected()?.id);\n const notice = children(() => props.notice);\n const empty = children(() => props.empty);\n const [state, setState] = createSignal<MapState>(\"static\");\n createEffect(() => props.onStateChange?.(state()));\n const [dark, setDark] = createSignal(false);\n const [boxStyle, setBoxStyle] = createSignal<JSX.CSSProperties>();\n const [liveScale, setLiveScale] = createSignal<MapScale>();\n const [measuredWidth, setMeasuredWidth] = createSignal<number>();\n // The zoom the person chose, once they zoomed; pin separation follows it relative to the current fit.\n const [chosenZoom, setChosenZoom] = createSignal<number>();\n const zoomFactor = createMemo(() => {\n const zoom = chosenZoom();\n const f = frame();\n const width = measuredWidth();\n if (zoom === undefined || !f || width === undefined) return 1;\n return 2 ** (zoom - fitCamera(f, width, props.padding ?? DEFAULT_PADDING).zoom);\n });\n const [needsReload, setNeedsReload] = createSignal(false);\n // The server picks the scale bar for the widest fit; once the width is known, the bar names a distance that fits it.\n const scale = createMemo((): MapScale | undefined => {\n const f = frame();\n if (!f) return undefined;\n const live = liveScale();\n if (live) return live;\n const width = measuredWidth();\n if (width === undefined) return referenceScale(f, props.padding ?? DEFAULT_PADDING);\n const camera = fitCamera(f, width, props.padding ?? DEFAULT_PADDING);\n const mpp = metersPerPixel(camera.center[1], camera.zoom);\n const bar = scaleBar(mpp);\n return { label: bar.label, width: `${bar.meters / mpp}px` };\n });\n const resolvedStyle = (): MapViewStyle => {\n const source = props.style;\n return typeof source === \"object\" && \"dark\" in source ? (dark() ? source.dark : source.light) : source;\n };\n let root!: HTMLDivElement;\n let live!: HTMLDivElement;\n let info!: HTMLDivElement;\n let map: LiveMap | undefined;\n let currentStyle: MapViewStyle | undefined;\n let disposed = false;\n let visible = false;\n let mounted = false;\n let touched = false;\n let replacingStyle = false;\n let generation = 0;\n let intersection: IntersectionObserver | undefined;\n let resize: ResizeObserver | undefined;\n let infoResize: ResizeObserver | undefined;\n const themes: MutationObserver[] = [];\n\n // From the person's first camera change on, the camera stays theirs; pin separation follows its zoom.\n const touch = () => {\n touched = true;\n if (map) setChosenZoom(map.getZoom());\n };\n const removeMap = () => {\n generation++;\n const previous = map;\n map = undefined;\n previous?.remove();\n setBoxStyle(undefined);\n setLiveScale(undefined);\n setChosenZoom(undefined);\n currentStyle = undefined;\n replacingStyle = false;\n };\n // MapLibre wraps its center across the antimeridian; geometry is drawn in the world copy nearest the camera.\n const worldCopy = (live: LiveMap, f: MapFrame): number => Math.round((live.getCenter().lng + 180) / 360 - (f.minX + f.spanX / 2));\n const syncOverlay = () => {\n const f = frame();\n if (!map || !f || state() !== \"ready\") return;\n const copy = worldCopy(map, f);\n const a = unprojectPoint(f.minX + copy, f.minY);\n const b = unprojectPoint(f.minX + copy + f.spanX, f.minY + f.spanY);\n const top = map.project([a.lon, a.lat]);\n const bottom = map.project([b.lon, b.lat]);\n setBoxStyle({\n left: `${top.x}px`,\n top: `${top.y}px`,\n width: `${bottom.x - top.x}px`,\n height: `${bottom.y - top.y}px`,\n transform: \"none\",\n });\n const mpp = metersPerPixel(map.getCenter().lat, map.getZoom());\n const bar = scaleBar(mpp);\n setLiveScale({ label: bar.label, width: `${bar.meters / mpp}px` });\n };\n const refit = () => {\n const f = frame();\n if (map && f && !touched) map.jumpTo(fitCamera(f, root.clientWidth, props.padding ?? DEFAULT_PADDING));\n syncOverlay();\n };\n const start = async () => {\n if (disposed || !visible || !frame()) return;\n removeMap();\n touched = false;\n if (!supportsWebgl()) {\n setState(\"no-webgl\");\n return;\n }\n const attempt = generation;\n setState(\"loading\");\n const fail = () => {\n if (disposed || attempt !== generation) return;\n removeMap();\n setState(\"error\");\n };\n let engine: typeof import(\"./map-view-live\");\n try {\n engine = await import(\"./map-view-live\");\n } catch {\n // The map code did not load, for example because the page outlived a release that removed its files.\n // Importing the same address again cannot help; a reload fetches the current page and its map code.\n if (disposed || attempt !== generation) return;\n setNeedsReload(true);\n fail();\n return;\n }\n try {\n const { createMap } = engine;\n if (disposed || attempt !== generation) return;\n const f = frame();\n if (!f) return;\n currentStyle = resolvedStyle();\n const t = messages();\n const instance = createMap(\n {\n container: live,\n style: currentStyle,\n ...fitCamera(f, root.clientWidth, props.padding ?? DEFAULT_PADDING),\n attributionControl: false,\n cooperativeGestures: true,\n dragRotate: false,\n // Shift-drag box zoom needs MapLibre's own stylesheet for its rectangle and starts without an input event.\n boxZoom: false,\n pitchWithRotate: false,\n touchPitch: false,\n maxPitch: 0,\n bearing: 0,\n pitch: 0,\n keyboard: true,\n trackResize: false,\n // MapLibre's own gestures (keyboard and double-click zoom, inertia) follow the same choice as our buttons.\n // The value is read when the map starts; MapLibre keeps one setting for all maps on the page.\n reduceMotion: prefersReducedMotion(),\n locale: {\n \"Map.Title\": t.canvasTitle,\n \"CooperativeGesturesHandler.WindowsHelpText\": t.gestureWindows,\n \"CooperativeGesturesHandler.MacHelpText\": t.gestureMac,\n \"CooperativeGesturesHandler.MobileHelpText\": t.gestureMobile,\n },\n },\n fail,\n );\n map = instance;\n instance.on(\"error\", (event) => {\n // A missing paid resource must remain visible and recoverable, including failures after initial load.\n if (\"sourceId\" in event || \"tile\" in event || state() === \"loading\" || replacingStyle) fail();\n });\n instance.on(\"style.load\", () => {\n replacingStyle = false;\n });\n instance.on(\"load\", () => {\n if (disposed || attempt !== generation) return;\n setState(\"ready\");\n refit();\n });\n instance.on(\"movestart\", (event) => {\n if (event.originalEvent) touch();\n });\n instance.on(\"move\", syncOverlay);\n // Pin separation is decided again once a zoom ends, not on every animation frame.\n instance.on(\"zoomend\", () => {\n if (map === instance && touched) setChosenZoom(instance.getZoom());\n });\n instance.on(\"resize\", syncOverlay);\n } catch {\n fail();\n }\n };\n const clearSelectedPin = () => {\n const marker = selected();\n if (!marker || state() !== \"ready\" || !map) return;\n const f = frame();\n const lon = marker.point.lon + (f ? worldCopy(map, f) * 360 : 0);\n const p = map.project([lon, marker.point.lat]);\n const offset = f ? pinOffsets(sortMarkers(props.markers ?? []), f, zoomFactor(), props.ownLocation?.point).get(marker.id) : undefined;\n const x = p.x + (offset?.dx ?? 0);\n const y = p.y + (offset?.dy ?? 0);\n const w = root.clientWidth;\n const h = root.clientHeight;\n const tile = info.getBoundingClientRect();\n const bounds = root.getBoundingClientRect();\n const tileTop = tile.top - bounds.top - 8;\n const covered =\n tile.height > 0 &&\n x >= tile.left - bounds.left - 8 &&\n x <= tile.right - bounds.left + 8 &&\n y >= tileTop &&\n y <= tile.bottom - bounds.top + 8;\n if (!covered && x >= 16 && x <= w - 16 && y >= 16 && y <= h - 16) return;\n touch();\n // Put the drawn pin, offset included, in the free band above the tile.\n const targetX = w / 2;\n const targetY = tile.height > 0 ? tileTop / 2 : h / 2;\n const target = map.unproject([x + w / 2 - targetX, y + h / 2 - targetY]);\n const camera = { center: [target.lng, target.lat] satisfies [number, number] };\n if (prefersReducedMotion()) map.jumpTo(camera);\n else map.easeTo(camera);\n };\n onMount(() => {\n mounted = true;\n const theme = () => setDark(!!root.closest('.dark, .k2b-dark, [data-theme=\"dark\"]'));\n theme();\n for (let ancestor: Element | null = root; ancestor; ancestor = ancestor.parentElement) {\n const observer = new MutationObserver(theme);\n observer.observe(ancestor, { attributes: true, attributeFilter: [\"class\", \"data-theme\"] });\n themes.push(observer);\n }\n setMeasuredWidth(root.clientWidth);\n resize = new ResizeObserver(() => {\n setMeasuredWidth(root.clientWidth);\n map?.resize();\n refit();\n });\n resize.observe(root);\n infoResize = new ResizeObserver(clearSelectedPin);\n infoResize.observe(info);\n const enter = () => {\n visible = true;\n intersection?.disconnect();\n if (frame()) void start();\n };\n if (!frame()) setState(\"empty\");\n if (typeof IntersectionObserver === \"undefined\") enter();\n else {\n intersection = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) enter();\n },\n { threshold: 0, rootMargin: \"0px\" },\n );\n intersection.observe(root);\n }\n });\n createEffect(\n on(\n frame,\n (value) => {\n if (!mounted) return;\n if (!value) {\n removeMap();\n setState(\"empty\");\n } else if (state() === \"empty\") {\n setState(\"static\");\n if (visible) void start();\n } else refit();\n },\n { defer: true },\n ),\n );\n createEffect(() => {\n const style = resolvedStyle();\n if (state() === \"ready\" && map && style !== currentStyle) {\n currentStyle = style;\n replacingStyle = true;\n map.setStyle(style);\n }\n });\n createEffect(() => {\n selected();\n state();\n untrack(clearSelectedPin);\n });\n onCleanup(() => {\n disposed = true;\n intersection?.disconnect();\n resize?.disconnect();\n infoResize?.disconnect();\n for (const observer of themes) observer.disconnect();\n removeMap();\n });\n const zoom = (direction: \"in\" | \"out\") => {\n if (!map || state() !== \"ready\") return;\n touch();\n const options = { animate: !prefersReducedMotion() };\n if (direction === \"in\") map.zoomIn(options);\n else map.zoomOut(options);\n };\n return (\n <div\n ref={root}\n class={`k2b-map-view${props.class ? ` ${props.class}` : \"\"}`}\n style={{ height: `${props.height}px` }}\n data-state={state()}\n role=\"region\"\n aria-label={messages().mapLabel}\n >\n <span class=\"k2b-sr-only\">{messages().summary({ count: props.markers?.length ?? 0 })}</span>\n <div ref={live} class=\"k2b-map-view__live\" />\n <Show\n when={frame()}\n fallback={\n <div class=\"k2b-map-view__empty\">\n <Show when={empty()}>\n <span>{empty()}</span>\n </Show>\n </div>\n }\n >\n {(value) => (\n <MapGeometry {...props} frame={value()} boxStyle={boxStyle()} zoomFactor={zoomFactor()} onSelect={props.onSelect} interactive />\n )}\n </Show>\n <div class=\"k2b-map-view__messages\">\n <Show when={notice()}>\n <div class=\"k2b-map-view__notice\">{notice()}</div>\n </Show>\n <Show when={state() === \"loading\" || state() === \"error\" || state() === \"no-webgl\"}>\n <div class=\"k2b-map-view__status\" role=\"status\">\n <i\n aria-hidden=\"true\"\n class={state() === \"loading\" ? \"ti ti-loader-2 k2b-spin\" : state() === \"error\" ? \"ti ti-alert-circle\" : \"ti ti-info-circle\"}\n />\n <span>{state() === \"loading\" ? messages().loading : state() === \"error\" ? messages().error : messages().noWebgl}</span>\n <Show when={state() === \"error\"}>\n <Button size=\"xs\" variant=\"text\" onClick={() => (needsReload() ? window.location.reload() : void start())}>\n {needsReload() ? messages().reload : messages().retry}\n </Button>\n </Show>\n </div>\n </Show>\n </div>\n <div class=\"k2b-map-view__controls\">\n <div class=\"k2b-map-view__zoom\">\n <IconButton label={messages().zoomIn} tooltip={false} disabled={state() !== \"ready\"} onClick={() => zoom(\"in\")}>\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n </IconButton>\n <IconButton label={messages().zoomOut} tooltip={false} disabled={state() !== \"ready\"} onClick={() => zoom(\"out\")}>\n <i class=\"ti ti-minus\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n <Show when={props.onLocate}>\n <IconButton\n class=\"k2b-map-view__locate\"\n tooltip={false}\n label={messages().locate}\n aria-pressed={!!props.ownLocation}\n onClick={() => props.onLocate?.()}\n >\n <i class=\"ti ti-current-location\" aria-hidden=\"true\" />\n </IconButton>\n </Show>\n </div>\n <div class=\"k2b-map-view__foot\">\n <div ref={info} class=\"k2b-map-view__info\" aria-live=\"polite\">\n <Show when={selectedId()} keyed>\n {(_id) => {\n // Keep the tile's state and focus for this selection while its marker data refreshes.\n const initial = selected();\n const current = () => selected() ?? initial;\n const marker: MapViewMarker = {\n get id() {\n return current()!.id;\n },\n get point() {\n return current()!.point;\n },\n get mark() {\n return current()!.mark;\n },\n get label() {\n return current()!.label;\n },\n get tone() {\n return current()!.tone;\n },\n get selected() {\n return current()!.selected;\n },\n };\n return props.infoTile?.(marker);\n }}\n </Show>\n </div>\n <MapFootRow scale={scale()}>{props.attribution}</MapFootRow>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,193 @@
1
+ import { mergeProps as _$mergeProps } from "solid-js/web";
2
+ import { ssrStyleProperty as _$ssrStyleProperty } from "solid-js/web";
3
+ import { memo as _$memo } from "solid-js/web";
4
+ import { ssr as _$ssr } from "solid-js/web";
5
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
6
+ import { createComponent as _$createComponent } from "solid-js/web";
7
+ import { escape as _$escape } from "solid-js/web";
8
+ import { ssrStyle as _$ssrStyle } from "solid-js/web";
9
+ var _tmpl$ = ["<div class=\"k2b-map-view__fit\" style=\"", "\"><svg class=\"k2b-map-view__geometry\" viewBox=\"", "\" preserveAspectRatio=\"none\" overflow=\"visible\" aria-hidden=\"true\">", "", "", "</svg>", "<div class=\"k2b-map-view__pins\" role=\"group\"", ">", "</div></div>"],
10
+ _tmpl$2 = ["<path class=\"k2b-map-view__area\"", " vector-effect=\"non-scaling-stroke\"></path>"],
11
+ _tmpl$3 = ["<path class=\"k2b-map-view__casing\"", " vector-effect=\"non-scaling-stroke\"></path>"],
12
+ _tmpl$4 = ["<g class=\"k2b-map-view__line\"", ">", "<path class=\"k2b-map-view__stroke\"", " vector-effect=\"non-scaling-stroke\"></path></g>"],
13
+ _tmpl$5 = ["<circle class=\"k2b-map-view__accuracy\"", " vector-effect=\"non-scaling-stroke\"></circle>"],
14
+ _tmpl$6 = ["<span class=\"k2b-map-view__me\" role=\"img\"", " style=\"", "\"></span>"],
15
+ _tmpl$7 = ["<span class=\"k2b-map-view__pin\"", " style=\"", "\" role=\"img\"", "><span aria-hidden=\"true\">", "</span></span>"],
16
+ _tmpl$8 = ["<button type=\"button\" class=\"k2b-map-view__pin\"", " style=\"", "\"", "><span aria-hidden=\"true\">", "</span></button>"],
17
+ _tmpl$9 = ["<div class=\"k2b-map-view__scale\" style=\"", "\"><span>", "</span><div></div></div>"],
18
+ _tmpl$0 = ["<div class=\"k2b-map-view__foot-row\">", "<div class=\"k2b-map-view__attribution\">", "</div></div>"],
19
+ _tmpl$1 = ["<div class=\"", "\" style=\"", "\" data-state=\"static\" role=\"region\"", "><span class=\"k2b-sr-only\">", "</span>", "<div class=\"k2b-map-view__foot\">", "</div></div>"];
20
+ import { createMemo, For, Show } from "solid-js";
21
+ import { DEFAULT_PADDING, EARTH_CIRCUMFERENCE, isStop, linePoints, mapFrame, pinHitRadii, pinOffsets, projectPoint, scaleBar, sortMarkers, unprojectPoint } from "./map-view-geometry";
22
+ import { useMapViewMessages } from "./map-view-messages";
23
+ const S = 1e6;
24
+ export const mapNumber = value => String(Number(value.toFixed(6)));
25
+ export const selectedMarker = (markers, selectedId) => selectedId !== undefined ? markers.find(marker => marker.id === selectedId) : markers.find(marker => marker.selected);
26
+
27
+ /** The CSS form of fitCamera's width rule, so the server lays out exactly what MapLibre shows. */
28
+ const fittedWidth = (frame, padding) => `max(min(100% - ${2 * padding}px, ${frame.referenceWidth}px), ${frame.minWidth}px)`;
29
+ export function frameStyle(frame, padding) {
30
+ return {
31
+ left: "50%",
32
+ top: "50%",
33
+ width: fittedWidth(frame, padding),
34
+ "aspect-ratio": `${frame.spanX} / ${frame.spanY}`,
35
+ transform: "translate(-50%, -50%)"
36
+ };
37
+ }
38
+ const pointInFrame = (point, frame) => {
39
+ const p = projectPoint(point);
40
+ return {
41
+ x: (p.x - frame.minX) / frame.spanX,
42
+ y: (p.y - frame.minY) / frame.spanY
43
+ };
44
+ };
45
+ const positionStyle = (point, frame) => {
46
+ const p = pointInFrame(point, frame);
47
+ return {
48
+ left: `${mapNumber(p.x * 100)}%`,
49
+ top: `${mapNumber(p.y * 100)}%`
50
+ };
51
+ };
52
+ const path = (points, frame, closed = false) => points.map((point, index) => {
53
+ const p = projectPoint(point);
54
+ return `${index ? "L" : "M"}${mapNumber((p.x - frame.minX) * S)} ${mapNumber((p.y - frame.minY) * S)}`;
55
+ }).join(" ") + (closed && points.length ? " Z" : "");
56
+ export function MapGeometry(props) {
57
+ const messages = useMapViewMessages();
58
+ const markers = createMemo(() => sortMarkers(props.markers ?? []));
59
+ const markerIds = createMemo(() => markers().map(marker => marker.id));
60
+ const markersById = createMemo(() => new Map(markers().map(marker => [marker.id, marker])));
61
+ const offsets = createMemo(() => pinOffsets(markers(), props.frame, props.zoomFactor, props.ownLocation?.point));
62
+ const hitRadii = createMemo(() => pinHitRadii(markers(), props.frame, offsets(), props.zoomFactor));
63
+ // Input order decides the fallback selection, as in MapView; sorting is only for drawing and keys.
64
+ const selected = createMemo(() => selectedMarker(props.markers ?? [], props.selectedId));
65
+ const keydown = (event, id) => {
66
+ const index = markerIds().indexOf(id);
67
+ let next;
68
+ switch (event.key) {
69
+ case "ArrowRight":
70
+ case "ArrowDown":
71
+ next = (index + 1) % markers().length;
72
+ break;
73
+ case "ArrowLeft":
74
+ case "ArrowUp":
75
+ next = (index + markers().length - 1) % markers().length;
76
+ break;
77
+ case "Home":
78
+ next = 0;
79
+ break;
80
+ case "End":
81
+ next = markers().length - 1;
82
+ break;
83
+ default:
84
+ return;
85
+ }
86
+ event.preventDefault();
87
+ event.stopPropagation();
88
+ const target = markers()[next];
89
+ if (target) {
90
+ event.currentTarget.parentElement?.querySelectorAll(".k2b-map-view__pin")[next]?.focus({
91
+ preventScroll: true
92
+ });
93
+ props.onSelect?.(target.id);
94
+ }
95
+ };
96
+ return _$ssr(_tmpl$, _$ssrStyle(props.boxStyle ?? frameStyle(props.frame, props.padding ?? DEFAULT_PADDING)), `0 0 ${_$escape(mapNumber(props.frame.spanX * S), true)} ${_$escape(mapNumber(props.frame.spanY * S), true)}`, _$escape(_$createComponent(For, {
97
+ get each() {
98
+ return props.areas;
99
+ },
100
+ children: area => _$ssr(_tmpl$2, _$ssrAttribute("data-tone", _$escape(area.tone ?? "accent", true), false) + _$ssrAttribute("d", _$escape(path(area.polygon, props.frame, true), true), false))
101
+ })), _$escape(_$createComponent(For, {
102
+ get each() {
103
+ return props.lines;
104
+ },
105
+ children: line => _$ssr(_tmpl$4, _$ssrAttribute("data-tone", _$escape(line.tone ?? "accent", true), false), _$escape(_$createComponent(Show, {
106
+ get when() {
107
+ return !line.tone || line.tone === "accent" || line.tone === "preview";
108
+ },
109
+ get children() {
110
+ return _$ssr(_tmpl$3, _$ssrAttribute("d", _$escape(path(linePoints(line), props.frame), true), false));
111
+ }
112
+ })), _$ssrAttribute("d", _$escape(path(linePoints(line), props.frame), true), false))
113
+ })), _$escape(_$createComponent(Show, {
114
+ get when() {
115
+ return props.ownLocation;
116
+ },
117
+ children: location => {
118
+ const p = () => projectPoint(location().point);
119
+ return _$ssr(_tmpl$5, _$ssrAttribute("cx", _$escape(mapNumber((p().x - props.frame.minX) * S), true), false) + _$ssrAttribute("cy", _$escape(mapNumber((p().y - props.frame.minY) * S), true), false) + _$ssrAttribute("r", _$escape(mapNumber((location().accuracyMeters ?? 0) / (EARTH_CIRCUMFERENCE * Math.cos(location().point.lat * Math.PI / 180)) * S), true), false));
120
+ }
121
+ })), _$escape(_$createComponent(Show, {
122
+ get when() {
123
+ return props.ownLocation;
124
+ },
125
+ children: location => _$ssr(_tmpl$6, _$ssrAttribute("aria-label", _$escape(messages().ownLocation, true), false), _$ssrStyle(positionStyle(location().point, props.frame)))
126
+ })), _$ssrAttribute("aria-label", _$escape(messages().pins, true), false), _$escape(_$createComponent(For, {
127
+ get each() {
128
+ return markerIds();
129
+ },
130
+ children: id => {
131
+ const marker = () => markersById().get(id);
132
+ const name = () => marker().mark === undefined ? marker().label : `${marker().mark} ${marker().label}`;
133
+ const style = () => ({
134
+ ...positionStyle(marker().point, props.frame),
135
+ "--k2b-map-pin-dx": `${mapNumber(offsets().get(marker().id)?.dx ?? 0)}px`,
136
+ "--k2b-map-pin-dy": `${mapNumber(offsets().get(marker().id)?.dy ?? 0)}px`,
137
+ "--k2b-map-pin-hit": `${mapNumber(hitRadii().get(marker().id) ?? 22)}px`
138
+ });
139
+ if (!props.interactive) return _$ssr(_tmpl$7, _$ssrAttribute("data-id", _$escape(marker().id, true), false) + _$ssrAttribute("data-tone", _$escape(marker().tone ?? "accent", true), false) + _$ssrAttribute("data-stop", _$escape(isStop(marker()) || undefined, true), false) + _$ssrAttribute("data-drop", _$escape(marker().mark === undefined || undefined, true), false) + _$ssrAttribute("data-selected", _$escape(selected()?.id === marker().id || undefined, true), false), _$ssrStyle(style()), _$ssrAttribute("aria-label", _$escape(name(), true), false), _$escape(marker().mark));
140
+ return _$ssr(_tmpl$8, _$ssrAttribute("data-id", _$escape(marker().id, true), false) + _$ssrAttribute("data-tone", _$escape(marker().tone ?? "accent", true), false) + _$ssrAttribute("data-stop", _$escape(isStop(marker()) || undefined, true), false) + _$ssrAttribute("data-drop", _$escape(marker().mark === undefined || undefined, true), false), _$ssrStyle(style()), _$ssrAttribute("aria-label", _$escape(name(), true), false) + _$ssrAttribute("aria-pressed", _$escape(selected()?.id, true) === _$escape(marker().id, true), false) + _$ssrAttribute("tabindex", (selected() ?? markers()[0])?.id === marker().id ? 0 : -1, false), _$escape(marker().mark));
141
+ }
142
+ })));
143
+ }
144
+ export function referenceScale(frame, padding) {
145
+ const center = unprojectPoint(frame.minX + frame.spanX / 2, frame.minY + frame.spanY / 2);
146
+ const spanMeters = frame.spanX * EARTH_CIRCUMFERENCE * Math.cos(center.lat * Math.PI / 180);
147
+ const bar = scaleBar(spanMeters / frame.referenceWidth);
148
+ return {
149
+ label: bar.label,
150
+ width: `calc(${fittedWidth(frame, padding)} * ${bar.meters / spanMeters})`
151
+ };
152
+ }
153
+ export function MapScaleBar(props) {
154
+ return _$ssr(_tmpl$9, _$ssrStyleProperty("width:", _$escape(props.scale.width, true)), _$escape(props.scale.label));
155
+ }
156
+ /** The scale bar and the attribution share the bottom row, so a long attribution wraps before it covers the scale. */
157
+ export function MapFootRow(props) {
158
+ return _$ssr(_tmpl$0, _$escape(_$createComponent(Show, {
159
+ get when() {
160
+ return props.scale;
161
+ },
162
+ children: scale => _$createComponent(MapScaleBar, {
163
+ get scale() {
164
+ return scale();
165
+ }
166
+ })
167
+ })), _$escape(props.children));
168
+ }
169
+ /** Geometry without a browser, a canvas, or a network dependency; suitable for server rendering and PDF output. */
170
+ export function MapViewFrame(props) {
171
+ const messages = useMapViewMessages();
172
+ const frame = createMemo(() => mapFrame(props, props.height, props.padding ?? DEFAULT_PADDING));
173
+ return _$ssr(_tmpl$1, `k2b-map-view${props.class ? ` ${_$escape(props.class, true)}` : ""}`, _$ssrStyleProperty("height:", `${_$escape(props.height, true)}px`), _$ssrAttribute("aria-label", _$escape(messages().mapLabel, true), false), _$escape(messages().summary({
174
+ count: props.markers?.length ?? 0
175
+ })), _$escape(_$createComponent(Show, {
176
+ get when() {
177
+ return frame();
178
+ },
179
+ children: value => _$createComponent(MapGeometry, _$mergeProps(props, {
180
+ get frame() {
181
+ return value();
182
+ }
183
+ }))
184
+ })), _$escape(_$createComponent(MapFootRow, {
185
+ get scale() {
186
+ return _$memo(() => !!frame())() ? referenceScale(frame(), props.padding ?? DEFAULT_PADDING) : undefined;
187
+ },
188
+ get children() {
189
+ return props.attribution;
190
+ }
191
+ })));
192
+ }
193
+ //# sourceMappingURL=MapViewFrame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/MapViewFrame.tsx"],"sourcesContent":["import { createMemo, For, type JSX, Show } from \"solid-js\";\nimport {\n DEFAULT_PADDING,\n EARTH_CIRCUMFERENCE,\n isStop,\n linePoints,\n type MapFrame,\n mapFrame,\n pinHitRadii,\n pinOffsets,\n projectPoint,\n scaleBar,\n sortMarkers,\n unprojectPoint,\n} from \"./map-view-geometry\";\nimport { useMapViewMessages } from \"./map-view-messages\";\nimport type { MapViewFrameProps, MapViewMarker, MapViewPoint } from \"./map-view-types\";\n\nexport type { MapViewFrameProps } from \"./map-view-types\";\n\nconst S = 1e6;\nexport const mapNumber = (value: number): string => String(Number(value.toFixed(6)));\nexport const selectedMarker = (markers: MapViewMarker[], selectedId?: string): MapViewMarker | undefined =>\n selectedId !== undefined ? markers.find((marker) => marker.id === selectedId) : markers.find((marker) => marker.selected);\n\n/** The CSS form of fitCamera's width rule, so the server lays out exactly what MapLibre shows. */\nconst fittedWidth = (frame: MapFrame, padding: number): string =>\n `max(min(100% - ${2 * padding}px, ${frame.referenceWidth}px), ${frame.minWidth}px)`;\n\nexport function frameStyle(frame: MapFrame, padding: number): JSX.CSSProperties {\n return {\n left: \"50%\",\n top: \"50%\",\n width: fittedWidth(frame, padding),\n \"aspect-ratio\": `${frame.spanX} / ${frame.spanY}`,\n transform: \"translate(-50%, -50%)\",\n };\n}\nconst pointInFrame = (point: MapViewPoint, frame: MapFrame) => {\n const p = projectPoint(point);\n return { x: (p.x - frame.minX) / frame.spanX, y: (p.y - frame.minY) / frame.spanY };\n};\nconst positionStyle = (point: MapViewPoint, frame: MapFrame): JSX.CSSProperties => {\n const p = pointInFrame(point, frame);\n return { left: `${mapNumber(p.x * 100)}%`, top: `${mapNumber(p.y * 100)}%` };\n};\nconst path = (points: MapViewPoint[], frame: MapFrame, closed = false): string =>\n points\n .map((point, index) => {\n const p = projectPoint(point);\n return `${index ? \"L\" : \"M\"}${mapNumber((p.x - frame.minX) * S)} ${mapNumber((p.y - frame.minY) * S)}`;\n })\n .join(\" \") + (closed && points.length ? \" Z\" : \"\");\n\nexport function MapGeometry(\n props: MapViewFrameProps & {\n frame: MapFrame;\n boxStyle?: JSX.CSSProperties;\n onSelect?: (id: string) => void;\n /** Pins are buttons in MapView; the standalone frame draws them as labelled images, never focusable. */\n interactive?: boolean;\n /** 2^(live zoom - fitted zoom), so pin separation follows the person's zoom; 1 until then. */\n zoomFactor?: number;\n },\n): JSX.Element {\n const messages = useMapViewMessages();\n const markers = createMemo(() => sortMarkers(props.markers ?? []));\n const markerIds = createMemo(() => markers().map((marker) => marker.id));\n const markersById = createMemo(() => new Map(markers().map((marker) => [marker.id, marker])));\n const offsets = createMemo(() => pinOffsets(markers(), props.frame, props.zoomFactor, props.ownLocation?.point));\n const hitRadii = createMemo(() => pinHitRadii(markers(), props.frame, offsets(), props.zoomFactor));\n // Input order decides the fallback selection, as in MapView; sorting is only for drawing and keys.\n const selected = createMemo(() => selectedMarker(props.markers ?? [], props.selectedId));\n const keydown = (event: KeyboardEvent & { currentTarget: HTMLButtonElement }, id: string) => {\n const index = markerIds().indexOf(id);\n let next: number;\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowDown\":\n next = (index + 1) % markers().length;\n break;\n case \"ArrowLeft\":\n case \"ArrowUp\":\n next = (index + markers().length - 1) % markers().length;\n break;\n case \"Home\":\n next = 0;\n break;\n case \"End\":\n next = markers().length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const target = markers()[next];\n if (target) {\n event.currentTarget.parentElement?.querySelectorAll<HTMLButtonElement>(\".k2b-map-view__pin\")[next]?.focus({ preventScroll: true });\n props.onSelect?.(target.id);\n }\n };\n return (\n <div class=\"k2b-map-view__fit\" style={props.boxStyle ?? frameStyle(props.frame, props.padding ?? DEFAULT_PADDING)}>\n <svg\n class=\"k2b-map-view__geometry\"\n viewBox={`0 0 ${mapNumber(props.frame.spanX * S)} ${mapNumber(props.frame.spanY * S)}`}\n preserveAspectRatio=\"none\"\n overflow=\"visible\"\n aria-hidden=\"true\"\n >\n <For each={props.areas}>\n {(area) => (\n <path\n class=\"k2b-map-view__area\"\n data-tone={area.tone ?? \"accent\"}\n d={path(area.polygon, props.frame, true)}\n vector-effect=\"non-scaling-stroke\"\n />\n )}\n </For>\n <For each={props.lines}>\n {(line) => (\n <g class=\"k2b-map-view__line\" data-tone={line.tone ?? \"accent\"}>\n <Show when={!line.tone || line.tone === \"accent\" || line.tone === \"preview\"}>\n <path class=\"k2b-map-view__casing\" d={path(linePoints(line), props.frame)} vector-effect=\"non-scaling-stroke\" />\n </Show>\n <path class=\"k2b-map-view__stroke\" d={path(linePoints(line), props.frame)} vector-effect=\"non-scaling-stroke\" />\n </g>\n )}\n </For>\n <Show when={props.ownLocation}>\n {(location) => {\n const p = () => projectPoint(location().point);\n return (\n <circle\n class=\"k2b-map-view__accuracy\"\n cx={mapNumber((p().x - props.frame.minX) * S)}\n cy={mapNumber((p().y - props.frame.minY) * S)}\n r={mapNumber(\n ((location().accuracyMeters ?? 0) / (EARTH_CIRCUMFERENCE * Math.cos((location().point.lat * Math.PI) / 180))) * S,\n )}\n vector-effect=\"non-scaling-stroke\"\n />\n );\n }}\n </Show>\n </svg>\n <Show when={props.ownLocation}>\n {(location) => (\n <span\n class=\"k2b-map-view__me\"\n role=\"img\"\n aria-label={messages().ownLocation}\n style={positionStyle(location().point, props.frame)}\n />\n )}\n </Show>\n <div class=\"k2b-map-view__pins\" role=\"group\" aria-label={messages().pins}>\n <For each={markerIds()}>\n {(id) => {\n const marker = () => markersById().get(id)!;\n const name = () => (marker().mark === undefined ? marker().label : `${marker().mark} ${marker().label}`);\n const style = () => ({\n ...positionStyle(marker().point, props.frame),\n \"--k2b-map-pin-dx\": `${mapNumber(offsets().get(marker().id)?.dx ?? 0)}px`,\n \"--k2b-map-pin-dy\": `${mapNumber(offsets().get(marker().id)?.dy ?? 0)}px`,\n \"--k2b-map-pin-hit\": `${mapNumber(hitRadii().get(marker().id) ?? 22)}px`,\n });\n if (!props.interactive)\n return (\n <span\n class=\"k2b-map-view__pin\"\n data-id={marker().id}\n data-tone={marker().tone ?? \"accent\"}\n data-stop={isStop(marker()) || undefined}\n data-drop={marker().mark === undefined || undefined}\n data-selected={selected()?.id === marker().id || undefined}\n style={style()}\n role=\"img\"\n aria-label={name()}\n >\n <span aria-hidden=\"true\">{marker().mark}</span>\n </span>\n );\n return (\n <button\n type=\"button\"\n class=\"k2b-map-view__pin\"\n data-id={marker().id}\n data-tone={marker().tone ?? \"accent\"}\n data-stop={isStop(marker()) || undefined}\n data-drop={marker().mark === undefined || undefined}\n style={style()}\n aria-label={name()}\n aria-pressed={selected()?.id === marker().id}\n tabIndex={(selected() ?? markers()[0])?.id === marker().id ? 0 : -1}\n onKeyDown={(event) => keydown(event, id)}\n onClick={() => props.onSelect?.(marker().id)}\n >\n <span aria-hidden=\"true\">{marker().mark}</span>\n </button>\n );\n }}\n </For>\n </div>\n </div>\n );\n}\nexport type MapScale = { label: string; width: string };\nexport function referenceScale(frame: MapFrame, padding: number): MapScale {\n const center = unprojectPoint(frame.minX + frame.spanX / 2, frame.minY + frame.spanY / 2);\n const spanMeters = frame.spanX * EARTH_CIRCUMFERENCE * Math.cos((center.lat * Math.PI) / 180);\n const bar = scaleBar(spanMeters / frame.referenceWidth);\n return { label: bar.label, width: `calc(${fittedWidth(frame, padding)} * ${bar.meters / spanMeters})` };\n}\nexport function MapScaleBar(props: { scale: MapScale }): JSX.Element {\n return (\n <div class=\"k2b-map-view__scale\" style={{ width: props.scale.width }}>\n <span>{props.scale.label}</span>\n <div />\n </div>\n );\n}\n/** The scale bar and the attribution share the bottom row, so a long attribution wraps before it covers the scale. */\nexport function MapFootRow(props: { scale?: MapScale; children?: JSX.Element }): JSX.Element {\n return (\n <div class=\"k2b-map-view__foot-row\">\n <Show when={props.scale}>{(scale) => <MapScaleBar scale={scale()} />}</Show>\n <div class=\"k2b-map-view__attribution\">{props.children}</div>\n </div>\n );\n}\n/** Geometry without a browser, a canvas, or a network dependency; suitable for server rendering and PDF output. */\nexport function MapViewFrame(props: MapViewFrameProps): JSX.Element {\n const messages = useMapViewMessages();\n const frame = createMemo(() => mapFrame(props, props.height, props.padding ?? DEFAULT_PADDING));\n return (\n <div\n class={`k2b-map-view${props.class ? ` ${props.class}` : \"\"}`}\n style={{ height: `${props.height}px` }}\n data-state=\"static\"\n role=\"region\"\n aria-label={messages().mapLabel}\n >\n <span class=\"k2b-sr-only\">{messages().summary({ count: props.markers?.length ?? 0 })}</span>\n <Show when={frame()}>{(value) => <MapGeometry {...props} frame={value()} />}</Show>\n <div class=\"k2b-map-view__foot\">\n <MapFootRow scale={frame() ? referenceScale(frame()!, props.padding ?? DEFAULT_PADDING) : undefined}>\n {props.attribution}\n </MapFootRow>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -295,7 +295,10 @@ export function createChartInspector(options) {
295
295
  if (hit && nodes.includes(hit)) return hit;
296
296
  if (seriesChart()) {
297
297
  const plot = updatePlotBounds();
298
- if (plot && (x < plot.left || x > plot.right || y < plot.top || y > plot.bottom)) return;
298
+ // SVG transforms and DOM rectangles can round the same painted edge
299
+ // differently. Keep its half-pixel raster fringe inspectable.
300
+ const edgeTolerance = 0.5;
301
+ if (plot && (x < plot.left - edgeTolerance || x > plot.right + edgeTolerance || y < plot.top - edgeTolerance || y > plot.bottom + edgeTolerance)) return;
299
302
  }
300
303
  // Exact shapes win. A small physical hit radius also reaches tiny or
301
304
  // zero-sized marks; distant whitespace leaves the chart unselected.
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["content/chart-inspection-core.ts"],"sourcesContent":["import type { ChartDatum, charts } from \"@k2b/stdlib\";\nimport { positionTooltipSurface } from \"../feedback/tooltip-position\";\nimport type { ChartCursor, ChartCursorState } from \"./chart-cursor\";\n\nexport type ChartKind = keyof typeof charts;\n\nexport type ChartDatumRef = Pick<ChartDatum, \"role\" | \"index\" | \"seriesIndex\">;\nexport const sameChartDatum = (a: ChartDatumRef, b: ChartDatumRef) =>\n a.role === b.role && a.index === b.index && a.seriesIndex === b.seriesIndex;\n\nexport type ChartSelection = { kind: ChartKind; datum: ChartDatum };\nexport type ChartTooltip = { title?: string; rows: readonly { label: string; value: string }[] };\nexport type ChartTooltipFormatter = (selection: ChartSelection) => ChartTooltip;\n\ntype Entry = { element: SVGGraphicsElement; datum: ChartDatum };\nconst object = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null;\nconst pair = (value: unknown): value is [number, number] =>\n Array.isArray(value) && value.length === 2 && value.every((n) => typeof n === \"number\" && Number.isFinite(n));\nconst roles = new Set([\"point\", \"item\", \"bin\", \"box\", \"outlier\", \"value\", \"cell\", \"interval\"]);\nexport function isChartDatum(value: unknown): value is ChartDatum {\n return (\n object(value) &&\n Number.isInteger(value.index) &&\n typeof value.index === \"number\" &&\n value.index >= 0 &&\n (value.seriesIndex === undefined ||\n (typeof value.seriesIndex === \"number\" && Number.isInteger(value.seriesIndex) && value.seriesIndex >= 0)) &&\n typeof value.role === \"string\" &&\n roles.has(value.role) &&\n pair(value.anchor) &&\n (value.grid === undefined || pair(value.grid)) &&\n (value.label === undefined || typeof value.label === \"string\") &&\n Array.isArray(value.values) &&\n value.values.every(\n (field) =>\n object(field) &&\n typeof field.key === \"string\" &&\n (typeof field.value === \"string\" || (typeof field.value === \"number\" && Number.isFinite(field.value))) &&\n (field.formatted === undefined || typeof field.formatted === \"string\"),\n )\n );\n}\n\n/** Adds or removes only the tooltip id, keeping descriptions the host put on the container. */\nconst describe = (container: HTMLElement, id: string, on: boolean) => {\n const ids = (container.getAttribute(\"aria-describedby\") ?? \"\").split(/\\s+/).filter((token) => token && token !== id);\n if (on) ids.push(id);\n if (ids.length) container.setAttribute(\"aria-describedby\", ids.join(\" \"));\n else container.removeAttribute(\"aria-describedby\");\n};\n\n/** Enhances existing SVG nodes. Pointer/focus changes never rebuild the chart. */\nexport function createChartInspector(options: {\n container: () => HTMLElement | undefined;\n cursor?: () => ChartCursor | undefined;\n tooltip: () => HTMLSpanElement | undefined;\n anchor: () => HTMLSpanElement | undefined;\n kind: () => ChartKind;\n enabled: () => boolean;\n format: ChartTooltipFormatter;\n select: (selection: ChartSelection) => void;\n}) {\n const source = Symbol(\"chart cursor\");\n let entries: Entry[] | undefined;\n let sortedPoints: Entry[] = [];\n const byElement = new Map<Element, Entry>();\n let active: Entry | undefined;\n let highlighted: Entry[] = [];\n let pinned = false;\n let pointerStart: { x: number; y: number } | undefined;\n let moved = false;\n let pending: { x: number; y: number; target: Element | null } | undefined;\n let frame: number | undefined;\n // The cursor this chart is subscribed to. Closing reads it instead of the cursor prop: a chart also closes\n // while it unmounts, when a parent `<Show>` may already have dropped the value the prop came from.\n let linkedCursor: ChartCursor | undefined;\n\n const records = () => {\n if (!entries || (entries.length > 0 && !entries[0]!.element.isConnected)) {\n entries = [];\n byElement.clear();\n sortedPoints = [];\n for (const element of Array.from(options.container()?.querySelectorAll<SVGGraphicsElement>(\"[data-chart-datum]\") ?? [])) {\n try {\n const value: unknown = JSON.parse(element.getAttribute(\"data-chart-datum\") ?? \"null\");\n if (isChartDatum(value)) {\n const entry = { element, datum: value };\n entries.push(entry);\n byElement.set(element, entry);\n }\n } catch {\n /* Only valid renderer metadata participates in inspection. */\n }\n }\n sortedPoints = entries.filter((entry) => entry.datum.role === \"point\").sort((a, b) => a.datum.anchor[0] - b.datum.anchor[0]);\n }\n return entries;\n };\n const highlightColor = (item: Entry): string => {\n // Read the actual paint before applying inspection styles, including\n // custom series and threshold colors. Invisible points use their line.\n const point = item.element.querySelector(\".stdlib-chart-inspection-point\");\n const source = point\n ? options\n .container()\n ?.querySelector(\n options.kind() === \"line\"\n ? `.stdlib-chart-line.stdlib-chart-series-${(item.datum.seriesIndex ?? 0) % 8}`\n : \".stdlib-chart-sparkline, .stdlib-chart-stat-sparkline\",\n )\n : (item.element.querySelector(\".stdlib-chart-bar-gauge-fill, .stdlib-chart-gauge-fill, .stdlib-chart-stat-value\") ??\n item.element.querySelector(\"rect, path, circle\"));\n const paint = source ? source.ownerDocument.defaultView?.getComputedStyle(source) : undefined;\n const color =\n (point || item.element.hasAttribute(\"data-chart-reference\") ? paint?.stroke : paint?.fill) ||\n `var(--stdlib-chart-c${((item.datum.seriesIndex ?? 0) % 8) + 1})`;\n return `color-mix(in srgb, ${color} 72%, var(--k2b-chart-highlight-mix))`;\n };\n const selectData = (selected: readonly ChartDatumRef[]) => {\n for (const entry of records()) {\n const matches = selected.some((datum) => sameChartDatum(datum, entry.datum));\n if (matches) entry.element.style.setProperty(\"--k2b-chart-selection-color\", highlightColor(entry));\n else entry.element.style.removeProperty(\"--k2b-chart-selection-color\");\n entry.element.toggleAttribute(\"data-selected\", matches);\n }\n };\n const screenPoint = (entry: Entry) => {\n const matrix = entry.element.getScreenCTM?.();\n const [x, y] = entry.datum.anchor;\n if (matrix) return { x: matrix.a * x + matrix.c * y + matrix.e, y: matrix.b * x + matrix.d * y + matrix.f };\n const rect = entry.element.getBoundingClientRect();\n return { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 };\n };\n const visibleRecords = () => {\n const nodes = records();\n if (options.kind() !== \"map\") return nodes;\n const viewport = options.container()?.querySelector<SVGSVGElement>(\".stdlib-chart-map-viewport\");\n if (!viewport?.getScreenCTM?.()) return nodes;\n const root = viewport.ownerSVGElement?.getBoundingClientRect();\n if (!root?.width || !root.height) return nodes;\n const width = viewport?.width?.baseVal.value;\n const height = viewport?.height?.baseVal.value;\n if (!width || !height) return nodes;\n const left = root.left + viewport.x.baseVal.value;\n const top = root.top + viewport.y.baseVal.value;\n const clip = { left, top, right: left + width, bottom: top + height };\n return nodes.filter((entry) => {\n const point = screenPoint(entry);\n return point.x >= clip.left && point.x <= clip.right && point.y >= clip.top && point.y <= clip.bottom;\n });\n };\n const rawX = (entry: Entry) => entry.datum.values.find((field) => field.key === \"x\")?.value;\n const seriesChart = () => options.kind() === \"line\" || options.kind() === \"sparkline\";\n const clearHighlight = () => {\n for (const entry of highlighted) {\n entry.element.removeAttribute(\"data-inspected\");\n entry.element.style.removeProperty(\"--k2b-chart-inspection-color\");\n if (!entry.element.getAttribute(\"style\")) entry.element.removeAttribute(\"style\");\n }\n highlighted = [];\n };\n const close = (broadcast = true, cancelPending = true) => {\n const state = linkedCursor?.read();\n if (broadcast && state && state.source !== source) return;\n if (broadcast) linkedCursor?.clear(source);\n options.container()?.removeAttribute(\"data-cursor-source\");\n pinned = false;\n active = undefined;\n clearHighlight();\n const container = options.container(),\n id = options.tooltip()?.id;\n if (container && id) describe(container, id, false);\n options.container()?.removeAttribute(\"data-inspecting\");\n const tooltip = options.tooltip();\n if (tooltip) {\n try {\n if (tooltip.matches(\":popover-open\")) tooltip.hidePopover();\n } catch {\n /* Detached during navigation. */\n }\n }\n if (cancelPending) {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n pending = undefined;\n }\n };\n const invalidate = () => {\n options.cursor?.()?.clear(source);\n close(false);\n entries = undefined;\n sortedPoints = [];\n byElement.clear();\n receive(options.cursor?.()?.read() ?? null);\n };\n const show = (entry: Entry, broadcast = true) => {\n const x = rawX(entry);\n if (broadcast && options.kind() === \"line\" && typeof x === \"number\") options.cursor?.()?.move(source, x);\n const tooltip = options.tooltip(),\n anchor = options.anchor(),\n container = options.container();\n if (!tooltip || !anchor || !container || !options.enabled()) return;\n if (active === entry && tooltip.matches(\":popover-open\")) return;\n clearHighlight();\n active = entry;\n highlighted = options.kind() === \"line\" ? records().filter((candidate) => rawX(candidate) === rawX(entry)) : [entry];\n for (const item of highlighted) {\n item.element.style.setProperty(\"--k2b-chart-inspection-color\", highlightColor(item));\n item.element.setAttribute(\"data-inspected\", \"true\");\n }\n const document = tooltip.ownerDocument;\n const contents = highlighted.map((item) => ({\n item,\n content: options.format({ kind: options.kind(), datum: item.datum }),\n missing: false,\n }));\n if (options.cursor?.() && options.kind() === \"line\") {\n const present = new Set(highlighted.map((item) => item.datum.seriesIndex));\n for (const item of records()) {\n if (present.has(item.datum.seriesIndex)) continue;\n present.add(item.datum.seriesIndex);\n contents.push({ item, content: options.format({ kind: options.kind(), datum: item.datum }), missing: true });\n }\n contents.sort((a, b) => (a.item.datum.seriesIndex ?? 0) - (b.item.datum.seriesIndex ?? 0));\n }\n tooltip.replaceChildren();\n const sharedTitle = typeof x === \"number\" ? options.cursor?.()?.formatX?.(x) : undefined;\n const commonTitle =\n sharedTitle ??\n (contents.every(({ content }) => content.title === contents[0]?.content.title) ? contents[0]?.content.title : undefined);\n if (commonTitle) {\n const title = document.createElement(\"strong\");\n title.className = \"k2b-chart__tooltip-title\";\n title.textContent = commonTitle;\n tooltip.append(title);\n }\n for (const { item, content, missing } of contents) {\n if (content.title && !commonTitle) {\n const title = document.createElement(\"strong\");\n title.className = \"k2b-chart__tooltip-title\";\n title.textContent = content.title;\n tooltip.append(title);\n }\n for (const row of content.rows) {\n const line = document.createElement(\"span\");\n line.className = \"k2b-chart__tooltip-row\";\n if (options.kind() === \"line\") {\n const swatch = document.createElement(\"i\");\n swatch.setAttribute(\"aria-hidden\", \"true\");\n const series = container.querySelector(`.stdlib-chart-line.stdlib-chart-series-${(item.datum.seriesIndex ?? 0) % 8}`);\n swatch.style.background = series\n ? getComputedStyle(series).stroke\n : `var(--stdlib-chart-c${((item.datum.seriesIndex ?? 0) % 8) + 1})`;\n line.append(swatch);\n }\n const label = document.createElement(\"span\");\n label.textContent = `${row.label}: `;\n const value = document.createElement(\"b\");\n value.textContent = missing ? \"—\" : row.value;\n line.append(label, value);\n tooltip.append(line);\n }\n }\n const rect = container.getBoundingClientRect(),\n point = screenPoint(entry);\n anchor.style.left = `${point.x - rect.left}px`;\n anchor.style.top = `${point.y - rect.top}px`;\n updatePlotBounds();\n container.style.setProperty(\"--k2b-chart-inspection-x\", `${point.x - rect.left}px`);\n container.setAttribute(\"data-inspecting\", seriesChart() ? \"series\" : \"datum\");\n describe(container, tooltip.id, true);\n try {\n if (!tooltip.matches(\":popover-open\")) tooltip.showPopover();\n positionTooltipSurface(tooltip, anchor);\n } catch {\n /* SVG titles remain available without the Popover API. */\n }\n };\n const updatePlotBounds = () => {\n const container = options.container();\n if (!container) return;\n const axes = Array.from(container.querySelectorAll(\".stdlib-chart-axis\")).map((axis) => axis.getBoundingClientRect());\n if (axes.length < 2) return;\n const left = Math.min(...axes.map((a) => a.left)),\n right = Math.max(...axes.map((a) => a.right));\n const top = Math.min(...axes.map((a) => a.top)),\n bottom = Math.max(...axes.map((a) => a.bottom));\n if (right <= left || bottom <= top) return;\n const rect = container.getBoundingClientRect();\n for (const [name, value] of Object.entries({\n left: left - rect.left,\n right: rect.right - right,\n top: top - rect.top,\n bottom: rect.bottom - bottom,\n }))\n container.style.setProperty(`--k2b-chart-plot-${name}`, `${value}px`);\n return { left, right, top, bottom };\n };\n const receive = (state: ChartCursorState) => {\n if (state?.source === source) return;\n close(false, false);\n if (!state || options.kind() !== \"line\") return;\n const entry = records().find((item) => rawX(item) === state.x);\n if (entry) show(entry, false);\n };\n const linkCursor = (cursor: ChartCursor | undefined): (() => void) => {\n linkedCursor = cursor;\n const unsubscribe = cursor?.subscribe(receive);\n return () => {\n unsubscribe?.();\n cursor?.clear(source);\n linkedCursor = undefined;\n };\n };\n const nearest = (x: number, y: number, target: Element | null): Entry | undefined => {\n if (target?.closest(\"button,a\") && !target.closest(\"[data-chart-datum]\")) return;\n const nodes = visibleRecords();\n // A mark wins before the plot bounds: the first and last points of a line sit on the plot's edges, so half of\n // their hit area lies outside it.\n const direct = target?.closest(\"[data-chart-datum]\");\n const hit = direct ? byElement.get(direct) : undefined;\n if (hit && nodes.includes(hit)) return hit;\n if (seriesChart()) {\n const plot = updatePlotBounds();\n if (plot && (x < plot.left || x > plot.right || y < plot.top || y > plot.bottom)) return;\n }\n // Exact shapes win. A small physical hit radius also reaches tiny or\n // zero-sized marks; distant whitespace leaves the chart unselected.\n const points = seriesChart() ? sortedPoints : nodes;\n if (seriesChart() && points.length) {\n const matrix = points[0]!.element.getScreenCTM?.();\n if (matrix) {\n const determinant = matrix.a * matrix.d - matrix.b * matrix.c;\n if (!determinant) return;\n const targetX = ((x - matrix.e) * matrix.d - (y - matrix.f) * matrix.c) / determinant;\n let low = 0,\n high = points.length - 1;\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (points[mid]!.datum.anchor[0] < targetX) low = mid + 1;\n else high = mid;\n }\n const previous = Math.max(0, low - 1);\n return Math.abs(points[previous]!.datum.anchor[0] - targetX) <= Math.abs(points[low]!.datum.anchor[0] - targetX)\n ? points[previous]\n : points[low];\n }\n }\n const matrices = new Map<SVGSVGElement, DOMMatrix | null>();\n let best: Entry | undefined,\n distance = Infinity;\n for (const entry of points) {\n const svg = entry.element.ownerSVGElement;\n if (svg && !matrices.has(svg)) matrices.set(svg, svg.getScreenCTM?.() ?? null);\n const matrix = svg ? matrices.get(svg) : null;\n const [ax, ay] = entry.datum.anchor;\n const point = matrix\n ? { x: matrix.a * ax + matrix.c * ay + matrix.e, y: matrix.b * ax + matrix.d * ay + matrix.f }\n : screenPoint(entry);\n const dx = point.x - x,\n dy = point.y - y;\n const next = seriesChart() ? Math.abs(dx) : Math.hypot(dx, dy);\n if (next < distance) {\n distance = next;\n best = entry;\n }\n }\n return seriesChart() || distance <= 24 ? best : undefined;\n };\n const move = (event: PointerEvent) => {\n if (event.target instanceof Node && options.tooltip()?.contains(event.target)) return;\n if (pointerStart && Math.hypot(event.clientX - pointerStart.x, event.clientY - pointerStart.y) > 6) moved = true;\n if (!options.enabled() || pinned || event.pointerType === \"touch\" || event.buttons) return;\n pending = { x: event.clientX, y: event.clientY, target: event.target instanceof Element ? event.target : null };\n if (frame !== undefined) return;\n frame = requestAnimationFrame(() => {\n frame = undefined;\n const sample = pending;\n pending = undefined;\n if (!sample) return;\n const entry = nearest(sample.x, sample.y, sample.target);\n if (entry) {\n show(entry);\n if (seriesChart()) {\n const container = options.container();\n container?.setAttribute(\"data-cursor-source\", \"true\");\n container?.style.setProperty(\"--k2b-chart-inspection-y\", `${sample.y - container.getBoundingClientRect().top}px`);\n }\n } else close();\n });\n };\n const down = (event: PointerEvent) => {\n pointerStart = { x: event.clientX, y: event.clientY };\n moved = false;\n };\n const click = (event: MouseEvent) => {\n if (!options.enabled() || moved || (event.target instanceof Element && event.target.closest(\"button,a\"))) return;\n const entry = nearest(event.clientX, event.clientY, event.target instanceof Element ? event.target : null);\n if (!entry) {\n close();\n return;\n }\n pinned = true;\n show(entry);\n options.select({ kind: options.kind(), datum: entry.datum });\n };\n const focus = (event: FocusEvent) => {\n if (event.target !== options.container() || !options.enabled()) return;\n const nodes = visibleRecords();\n const first = options.kind() === \"line\" ? sortedPoints.at(-1) : nodes[0];\n if (first) show(first);\n };\n const key = (event: KeyboardEvent): boolean => {\n if (!options.enabled() || event.target !== options.container()) return false;\n if (event.key === \"Escape\") {\n close();\n return true;\n }\n if (event.key === \"Enter\" && active) {\n if (options.kind() === \"map\" && !visibleRecords().includes(active)) {\n close();\n return true;\n }\n event.preventDefault();\n pinned = true;\n const link = active.element.closest(\"a\");\n if (link) link.dispatchEvent(new MouseEvent(\"click\", { bubbles: true, cancelable: true }));\n else options.select({ kind: options.kind(), datum: active.datum });\n return true;\n }\n const navigationChart = options.kind() === \"map\" || options.kind() === \"stateTimeline\";\n if (navigationChart && !event.altKey) return false;\n if (![\"Home\", \"End\", \"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)) return false;\n let nodes = visibleRecords();\n if (seriesChart()) nodes = [...nodes].sort((a, b) => a.datum.anchor[0] - b.datum.anchor[0]);\n if (options.kind() === \"line\") {\n const seen = new Set<string | number | undefined>();\n nodes = nodes.filter((entry) => {\n const x = rawX(entry);\n if (seen.has(x)) return false;\n seen.add(x);\n return true;\n });\n }\n if (!nodes.length) return false;\n event.preventDefault();\n pinned = false;\n let index = active\n ? options.kind() === \"line\"\n ? nodes.findIndex((entry) => rawX(entry) === rawX(active!))\n : nodes.indexOf(active)\n : -1;\n if (event.key === \"Home\") index = 0;\n else if (event.key === \"End\") index = nodes.length - 1;\n else if (active?.datum.grid && [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(event.key)) {\n const [x, y] = active.datum.grid;\n const dx = event.key === \"ArrowLeft\" ? -1 : event.key === \"ArrowRight\" ? 1 : 0;\n const dy = event.key === \"ArrowUp\" ? -1 : event.key === \"ArrowDown\" ? 1 : 0;\n const next = nodes\n .filter(\n (entry) =>\n entry.datum.grid &&\n (dx\n ? entry.datum.grid[1] === y && (entry.datum.grid[0] - x) * dx > 0\n : entry.datum.grid[0] === x && (entry.datum.grid[1] - y) * dy > 0),\n )\n .sort(\n (a, b) =>\n Math.abs(a.datum.grid![0] - x) +\n Math.abs(a.datum.grid![1] - y) -\n Math.abs(b.datum.grid![0] - x) -\n Math.abs(b.datum.grid![1] - y),\n )[0];\n if (next) index = nodes.indexOf(next);\n } else index += event.key === \"ArrowLeft\" || event.key === \"ArrowUp\" ? -1 : 1;\n show(nodes[Math.max(0, Math.min(nodes.length - 1, index))]!);\n return true;\n };\n return {\n selectDatum: (selected: ChartDatumRef | null | undefined) => selectData(selected ? [selected] : []),\n selectData,\n linkCursor,\n destroy: () => close(false),\n move,\n down,\n click,\n focus,\n key,\n close: () => close(),\n invalidate,\n leave: () => {\n if (!pinned) close();\n },\n };\n}\n\n/** Dismiss inspection on outside interaction, but allow the tooltip itself to scroll. */\nexport function closeChartInspectionOnOutside(options: {\n container: () => HTMLElement | undefined;\n tooltip: () => HTMLElement | undefined;\n close: () => void;\n}): () => void {\n const outside = (event: PointerEvent) => {\n if (event.target instanceof Node && !options.container()?.contains(event.target)) options.close();\n };\n const scroll = (event: Event) => {\n if (event.target instanceof Node && options.tooltip()?.contains(event.target)) return;\n options.close();\n };\n window.addEventListener(\"pointerdown\", outside);\n window.addEventListener(\"scroll\", scroll, true);\n window.addEventListener(\"resize\", options.close);\n return () => {\n window.removeEventListener(\"pointerdown\", outside);\n window.removeEventListener(\"scroll\", scroll, true);\n window.removeEventListener(\"resize\", options.close);\n };\n}\n\nexport type InspectChartOptions = {\n kind: ChartKind;\n format: ChartTooltipFormatter;\n select?: (selection: ChartSelection) => void;\n cursor?: ChartCursor;\n};\nexport type ChartInspection = { invalidate(): void; close(): void; destroy(): void };\n\nlet tooltipId = 0;\n\n/** Attach inspection to stdlib SVG rendered with inspect: true, without a framework. */\nexport function inspectChart(container: HTMLElement, options: InspectChartOptions): ChartInspection {\n const document = container.ownerDocument;\n const anchor = document.createElement(\"span\");\n anchor.className = \"k2b-chart__anchor\";\n anchor.setAttribute(\"aria-hidden\", \"true\");\n const tooltip = document.createElement(\"span\");\n tooltip.className = \"k2b-tooltip k2b-chart__tooltip\";\n tooltip.setAttribute(\"role\", \"tooltip\");\n tooltip.setAttribute(\"popover\", \"manual\");\n tooltip.setAttribute(\"data-instant\", \"true\");\n do {\n tooltip.id = `k2b-chart-tooltip-${++tooltipId}`;\n } while (document.getElementById(tooltip.id));\n container.append(anchor, tooltip);\n const addedTabindex = !container.hasAttribute(\"tabindex\");\n if (addedTabindex) container.setAttribute(\"tabindex\", \"0\");\n\n const inspector = createChartInspector({\n container: () => container,\n cursor: () => options.cursor,\n tooltip: () => tooltip,\n anchor: () => anchor,\n kind: () => options.kind,\n enabled: () => true,\n format: options.format,\n select: (selection) => options.select?.(selection),\n });\n container.addEventListener(\"pointerdown\", inspector.down);\n container.addEventListener(\"pointermove\", inspector.move);\n container.addEventListener(\"click\", inspector.click);\n container.addEventListener(\"pointerleave\", inspector.leave);\n container.addEventListener(\"focusin\", inspector.focus);\n container.addEventListener(\"focusout\", inspector.close);\n container.addEventListener(\"keydown\", inspector.key);\n const removeOutside = closeChartInspectionOnOutside({ container: () => container, tooltip: () => tooltip, close: inspector.close });\n const unlinkCursor = inspector.linkCursor(options.cursor);\n let destroyed = false;\n return {\n invalidate: () => {\n if (!destroyed) inspector.invalidate();\n },\n close: () => {\n if (!destroyed) inspector.close();\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n container.removeEventListener(\"pointerdown\", inspector.down);\n container.removeEventListener(\"pointermove\", inspector.move);\n container.removeEventListener(\"click\", inspector.click);\n container.removeEventListener(\"pointerleave\", inspector.leave);\n container.removeEventListener(\"focusin\", inspector.focus);\n container.removeEventListener(\"focusout\", inspector.close);\n container.removeEventListener(\"keydown\", inspector.key);\n removeOutside();\n unlinkCursor();\n inspector.destroy();\n for (const element of container.querySelectorAll<SVGGraphicsElement>(\"[data-chart-datum]\")) {\n element.removeAttribute(\"data-inspected\");\n element.style.removeProperty(\"--k2b-chart-inspection-color\");\n if (!element.getAttribute(\"style\")) element.removeAttribute(\"style\");\n }\n // Inspection geometry the inspector wrote onto the host container.\n for (const name of [\"inspection-x\", \"inspection-y\", \"plot-left\", \"plot-right\", \"plot-top\", \"plot-bottom\"])\n container.style.removeProperty(`--k2b-chart-${name}`);\n anchor.remove();\n tooltip.remove();\n if (addedTabindex) container.removeAttribute(\"tabindex\");\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/chart-inspection-core.ts"],"sourcesContent":["import type { ChartDatum, charts } from \"@k2b/stdlib\";\nimport { positionTooltipSurface } from \"../feedback/tooltip-position\";\nimport type { ChartCursor, ChartCursorState } from \"./chart-cursor\";\n\nexport type ChartKind = keyof typeof charts;\n\nexport type ChartDatumRef = Pick<ChartDatum, \"role\" | \"index\" | \"seriesIndex\">;\nexport const sameChartDatum = (a: ChartDatumRef, b: ChartDatumRef) =>\n a.role === b.role && a.index === b.index && a.seriesIndex === b.seriesIndex;\n\nexport type ChartSelection = { kind: ChartKind; datum: ChartDatum };\nexport type ChartTooltip = { title?: string; rows: readonly { label: string; value: string }[] };\nexport type ChartTooltipFormatter = (selection: ChartSelection) => ChartTooltip;\n\ntype Entry = { element: SVGGraphicsElement; datum: ChartDatum };\nconst object = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null;\nconst pair = (value: unknown): value is [number, number] =>\n Array.isArray(value) && value.length === 2 && value.every((n) => typeof n === \"number\" && Number.isFinite(n));\nconst roles = new Set([\"point\", \"item\", \"bin\", \"box\", \"outlier\", \"value\", \"cell\", \"interval\"]);\nexport function isChartDatum(value: unknown): value is ChartDatum {\n return (\n object(value) &&\n Number.isInteger(value.index) &&\n typeof value.index === \"number\" &&\n value.index >= 0 &&\n (value.seriesIndex === undefined ||\n (typeof value.seriesIndex === \"number\" && Number.isInteger(value.seriesIndex) && value.seriesIndex >= 0)) &&\n typeof value.role === \"string\" &&\n roles.has(value.role) &&\n pair(value.anchor) &&\n (value.grid === undefined || pair(value.grid)) &&\n (value.label === undefined || typeof value.label === \"string\") &&\n Array.isArray(value.values) &&\n value.values.every(\n (field) =>\n object(field) &&\n typeof field.key === \"string\" &&\n (typeof field.value === \"string\" || (typeof field.value === \"number\" && Number.isFinite(field.value))) &&\n (field.formatted === undefined || typeof field.formatted === \"string\"),\n )\n );\n}\n\n/** Adds or removes only the tooltip id, keeping descriptions the host put on the container. */\nconst describe = (container: HTMLElement, id: string, on: boolean) => {\n const ids = (container.getAttribute(\"aria-describedby\") ?? \"\").split(/\\s+/).filter((token) => token && token !== id);\n if (on) ids.push(id);\n if (ids.length) container.setAttribute(\"aria-describedby\", ids.join(\" \"));\n else container.removeAttribute(\"aria-describedby\");\n};\n\n/** Enhances existing SVG nodes. Pointer/focus changes never rebuild the chart. */\nexport function createChartInspector(options: {\n container: () => HTMLElement | undefined;\n cursor?: () => ChartCursor | undefined;\n tooltip: () => HTMLSpanElement | undefined;\n anchor: () => HTMLSpanElement | undefined;\n kind: () => ChartKind;\n enabled: () => boolean;\n format: ChartTooltipFormatter;\n select: (selection: ChartSelection) => void;\n}) {\n const source = Symbol(\"chart cursor\");\n let entries: Entry[] | undefined;\n let sortedPoints: Entry[] = [];\n const byElement = new Map<Element, Entry>();\n let active: Entry | undefined;\n let highlighted: Entry[] = [];\n let pinned = false;\n let pointerStart: { x: number; y: number } | undefined;\n let moved = false;\n let pending: { x: number; y: number; target: Element | null } | undefined;\n let frame: number | undefined;\n // The cursor this chart is subscribed to. Closing reads it instead of the cursor prop: a chart also closes\n // while it unmounts, when a parent `<Show>` may already have dropped the value the prop came from.\n let linkedCursor: ChartCursor | undefined;\n\n const records = () => {\n if (!entries || (entries.length > 0 && !entries[0]!.element.isConnected)) {\n entries = [];\n byElement.clear();\n sortedPoints = [];\n for (const element of Array.from(options.container()?.querySelectorAll<SVGGraphicsElement>(\"[data-chart-datum]\") ?? [])) {\n try {\n const value: unknown = JSON.parse(element.getAttribute(\"data-chart-datum\") ?? \"null\");\n if (isChartDatum(value)) {\n const entry = { element, datum: value };\n entries.push(entry);\n byElement.set(element, entry);\n }\n } catch {\n /* Only valid renderer metadata participates in inspection. */\n }\n }\n sortedPoints = entries.filter((entry) => entry.datum.role === \"point\").sort((a, b) => a.datum.anchor[0] - b.datum.anchor[0]);\n }\n return entries;\n };\n const highlightColor = (item: Entry): string => {\n // Read the actual paint before applying inspection styles, including\n // custom series and threshold colors. Invisible points use their line.\n const point = item.element.querySelector(\".stdlib-chart-inspection-point\");\n const source = point\n ? options\n .container()\n ?.querySelector(\n options.kind() === \"line\"\n ? `.stdlib-chart-line.stdlib-chart-series-${(item.datum.seriesIndex ?? 0) % 8}`\n : \".stdlib-chart-sparkline, .stdlib-chart-stat-sparkline\",\n )\n : (item.element.querySelector(\".stdlib-chart-bar-gauge-fill, .stdlib-chart-gauge-fill, .stdlib-chart-stat-value\") ??\n item.element.querySelector(\"rect, path, circle\"));\n const paint = source ? source.ownerDocument.defaultView?.getComputedStyle(source) : undefined;\n const color =\n (point || item.element.hasAttribute(\"data-chart-reference\") ? paint?.stroke : paint?.fill) ||\n `var(--stdlib-chart-c${((item.datum.seriesIndex ?? 0) % 8) + 1})`;\n return `color-mix(in srgb, ${color} 72%, var(--k2b-chart-highlight-mix))`;\n };\n const selectData = (selected: readonly ChartDatumRef[]) => {\n for (const entry of records()) {\n const matches = selected.some((datum) => sameChartDatum(datum, entry.datum));\n if (matches) entry.element.style.setProperty(\"--k2b-chart-selection-color\", highlightColor(entry));\n else entry.element.style.removeProperty(\"--k2b-chart-selection-color\");\n entry.element.toggleAttribute(\"data-selected\", matches);\n }\n };\n const screenPoint = (entry: Entry) => {\n const matrix = entry.element.getScreenCTM?.();\n const [x, y] = entry.datum.anchor;\n if (matrix) return { x: matrix.a * x + matrix.c * y + matrix.e, y: matrix.b * x + matrix.d * y + matrix.f };\n const rect = entry.element.getBoundingClientRect();\n return { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 };\n };\n const visibleRecords = () => {\n const nodes = records();\n if (options.kind() !== \"map\") return nodes;\n const viewport = options.container()?.querySelector<SVGSVGElement>(\".stdlib-chart-map-viewport\");\n if (!viewport?.getScreenCTM?.()) return nodes;\n const root = viewport.ownerSVGElement?.getBoundingClientRect();\n if (!root?.width || !root.height) return nodes;\n const width = viewport?.width?.baseVal.value;\n const height = viewport?.height?.baseVal.value;\n if (!width || !height) return nodes;\n const left = root.left + viewport.x.baseVal.value;\n const top = root.top + viewport.y.baseVal.value;\n const clip = { left, top, right: left + width, bottom: top + height };\n return nodes.filter((entry) => {\n const point = screenPoint(entry);\n return point.x >= clip.left && point.x <= clip.right && point.y >= clip.top && point.y <= clip.bottom;\n });\n };\n const rawX = (entry: Entry) => entry.datum.values.find((field) => field.key === \"x\")?.value;\n const seriesChart = () => options.kind() === \"line\" || options.kind() === \"sparkline\";\n const clearHighlight = () => {\n for (const entry of highlighted) {\n entry.element.removeAttribute(\"data-inspected\");\n entry.element.style.removeProperty(\"--k2b-chart-inspection-color\");\n if (!entry.element.getAttribute(\"style\")) entry.element.removeAttribute(\"style\");\n }\n highlighted = [];\n };\n const close = (broadcast = true, cancelPending = true) => {\n const state = linkedCursor?.read();\n if (broadcast && state && state.source !== source) return;\n if (broadcast) linkedCursor?.clear(source);\n options.container()?.removeAttribute(\"data-cursor-source\");\n pinned = false;\n active = undefined;\n clearHighlight();\n const container = options.container(),\n id = options.tooltip()?.id;\n if (container && id) describe(container, id, false);\n options.container()?.removeAttribute(\"data-inspecting\");\n const tooltip = options.tooltip();\n if (tooltip) {\n try {\n if (tooltip.matches(\":popover-open\")) tooltip.hidePopover();\n } catch {\n /* Detached during navigation. */\n }\n }\n if (cancelPending) {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n pending = undefined;\n }\n };\n const invalidate = () => {\n options.cursor?.()?.clear(source);\n close(false);\n entries = undefined;\n sortedPoints = [];\n byElement.clear();\n receive(options.cursor?.()?.read() ?? null);\n };\n const show = (entry: Entry, broadcast = true) => {\n const x = rawX(entry);\n if (broadcast && options.kind() === \"line\" && typeof x === \"number\") options.cursor?.()?.move(source, x);\n const tooltip = options.tooltip(),\n anchor = options.anchor(),\n container = options.container();\n if (!tooltip || !anchor || !container || !options.enabled()) return;\n if (active === entry && tooltip.matches(\":popover-open\")) return;\n clearHighlight();\n active = entry;\n highlighted = options.kind() === \"line\" ? records().filter((candidate) => rawX(candidate) === rawX(entry)) : [entry];\n for (const item of highlighted) {\n item.element.style.setProperty(\"--k2b-chart-inspection-color\", highlightColor(item));\n item.element.setAttribute(\"data-inspected\", \"true\");\n }\n const document = tooltip.ownerDocument;\n const contents = highlighted.map((item) => ({\n item,\n content: options.format({ kind: options.kind(), datum: item.datum }),\n missing: false,\n }));\n if (options.cursor?.() && options.kind() === \"line\") {\n const present = new Set(highlighted.map((item) => item.datum.seriesIndex));\n for (const item of records()) {\n if (present.has(item.datum.seriesIndex)) continue;\n present.add(item.datum.seriesIndex);\n contents.push({ item, content: options.format({ kind: options.kind(), datum: item.datum }), missing: true });\n }\n contents.sort((a, b) => (a.item.datum.seriesIndex ?? 0) - (b.item.datum.seriesIndex ?? 0));\n }\n tooltip.replaceChildren();\n const sharedTitle = typeof x === \"number\" ? options.cursor?.()?.formatX?.(x) : undefined;\n const commonTitle =\n sharedTitle ??\n (contents.every(({ content }) => content.title === contents[0]?.content.title) ? contents[0]?.content.title : undefined);\n if (commonTitle) {\n const title = document.createElement(\"strong\");\n title.className = \"k2b-chart__tooltip-title\";\n title.textContent = commonTitle;\n tooltip.append(title);\n }\n for (const { item, content, missing } of contents) {\n if (content.title && !commonTitle) {\n const title = document.createElement(\"strong\");\n title.className = \"k2b-chart__tooltip-title\";\n title.textContent = content.title;\n tooltip.append(title);\n }\n for (const row of content.rows) {\n const line = document.createElement(\"span\");\n line.className = \"k2b-chart__tooltip-row\";\n if (options.kind() === \"line\") {\n const swatch = document.createElement(\"i\");\n swatch.setAttribute(\"aria-hidden\", \"true\");\n const series = container.querySelector(`.stdlib-chart-line.stdlib-chart-series-${(item.datum.seriesIndex ?? 0) % 8}`);\n swatch.style.background = series\n ? getComputedStyle(series).stroke\n : `var(--stdlib-chart-c${((item.datum.seriesIndex ?? 0) % 8) + 1})`;\n line.append(swatch);\n }\n const label = document.createElement(\"span\");\n label.textContent = `${row.label}: `;\n const value = document.createElement(\"b\");\n value.textContent = missing ? \"—\" : row.value;\n line.append(label, value);\n tooltip.append(line);\n }\n }\n const rect = container.getBoundingClientRect(),\n point = screenPoint(entry);\n anchor.style.left = `${point.x - rect.left}px`;\n anchor.style.top = `${point.y - rect.top}px`;\n updatePlotBounds();\n container.style.setProperty(\"--k2b-chart-inspection-x\", `${point.x - rect.left}px`);\n container.setAttribute(\"data-inspecting\", seriesChart() ? \"series\" : \"datum\");\n describe(container, tooltip.id, true);\n try {\n if (!tooltip.matches(\":popover-open\")) tooltip.showPopover();\n positionTooltipSurface(tooltip, anchor);\n } catch {\n /* SVG titles remain available without the Popover API. */\n }\n };\n const updatePlotBounds = () => {\n const container = options.container();\n if (!container) return;\n const axes = Array.from(container.querySelectorAll(\".stdlib-chart-axis\")).map((axis) => axis.getBoundingClientRect());\n if (axes.length < 2) return;\n const left = Math.min(...axes.map((a) => a.left)),\n right = Math.max(...axes.map((a) => a.right));\n const top = Math.min(...axes.map((a) => a.top)),\n bottom = Math.max(...axes.map((a) => a.bottom));\n if (right <= left || bottom <= top) return;\n const rect = container.getBoundingClientRect();\n for (const [name, value] of Object.entries({\n left: left - rect.left,\n right: rect.right - right,\n top: top - rect.top,\n bottom: rect.bottom - bottom,\n }))\n container.style.setProperty(`--k2b-chart-plot-${name}`, `${value}px`);\n return { left, right, top, bottom };\n };\n const receive = (state: ChartCursorState) => {\n if (state?.source === source) return;\n close(false, false);\n if (!state || options.kind() !== \"line\") return;\n const entry = records().find((item) => rawX(item) === state.x);\n if (entry) show(entry, false);\n };\n const linkCursor = (cursor: ChartCursor | undefined): (() => void) => {\n linkedCursor = cursor;\n const unsubscribe = cursor?.subscribe(receive);\n return () => {\n unsubscribe?.();\n cursor?.clear(source);\n linkedCursor = undefined;\n };\n };\n const nearest = (x: number, y: number, target: Element | null): Entry | undefined => {\n if (target?.closest(\"button,a\") && !target.closest(\"[data-chart-datum]\")) return;\n const nodes = visibleRecords();\n // A mark wins before the plot bounds: the first and last points of a line sit on the plot's edges, so half of\n // their hit area lies outside it.\n const direct = target?.closest(\"[data-chart-datum]\");\n const hit = direct ? byElement.get(direct) : undefined;\n if (hit && nodes.includes(hit)) return hit;\n if (seriesChart()) {\n const plot = updatePlotBounds();\n // SVG transforms and DOM rectangles can round the same painted edge\n // differently. Keep its half-pixel raster fringe inspectable.\n const edgeTolerance = 0.5;\n if (\n plot &&\n (x < plot.left - edgeTolerance || x > plot.right + edgeTolerance || y < plot.top - edgeTolerance || y > plot.bottom + edgeTolerance)\n )\n return;\n }\n // Exact shapes win. A small physical hit radius also reaches tiny or\n // zero-sized marks; distant whitespace leaves the chart unselected.\n const points = seriesChart() ? sortedPoints : nodes;\n if (seriesChart() && points.length) {\n const matrix = points[0]!.element.getScreenCTM?.();\n if (matrix) {\n const determinant = matrix.a * matrix.d - matrix.b * matrix.c;\n if (!determinant) return;\n const targetX = ((x - matrix.e) * matrix.d - (y - matrix.f) * matrix.c) / determinant;\n let low = 0,\n high = points.length - 1;\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (points[mid]!.datum.anchor[0] < targetX) low = mid + 1;\n else high = mid;\n }\n const previous = Math.max(0, low - 1);\n return Math.abs(points[previous]!.datum.anchor[0] - targetX) <= Math.abs(points[low]!.datum.anchor[0] - targetX)\n ? points[previous]\n : points[low];\n }\n }\n const matrices = new Map<SVGSVGElement, DOMMatrix | null>();\n let best: Entry | undefined,\n distance = Infinity;\n for (const entry of points) {\n const svg = entry.element.ownerSVGElement;\n if (svg && !matrices.has(svg)) matrices.set(svg, svg.getScreenCTM?.() ?? null);\n const matrix = svg ? matrices.get(svg) : null;\n const [ax, ay] = entry.datum.anchor;\n const point = matrix\n ? { x: matrix.a * ax + matrix.c * ay + matrix.e, y: matrix.b * ax + matrix.d * ay + matrix.f }\n : screenPoint(entry);\n const dx = point.x - x,\n dy = point.y - y;\n const next = seriesChart() ? Math.abs(dx) : Math.hypot(dx, dy);\n if (next < distance) {\n distance = next;\n best = entry;\n }\n }\n return seriesChart() || distance <= 24 ? best : undefined;\n };\n const move = (event: PointerEvent) => {\n if (event.target instanceof Node && options.tooltip()?.contains(event.target)) return;\n if (pointerStart && Math.hypot(event.clientX - pointerStart.x, event.clientY - pointerStart.y) > 6) moved = true;\n if (!options.enabled() || pinned || event.pointerType === \"touch\" || event.buttons) return;\n pending = { x: event.clientX, y: event.clientY, target: event.target instanceof Element ? event.target : null };\n if (frame !== undefined) return;\n frame = requestAnimationFrame(() => {\n frame = undefined;\n const sample = pending;\n pending = undefined;\n if (!sample) return;\n const entry = nearest(sample.x, sample.y, sample.target);\n if (entry) {\n show(entry);\n if (seriesChart()) {\n const container = options.container();\n container?.setAttribute(\"data-cursor-source\", \"true\");\n container?.style.setProperty(\"--k2b-chart-inspection-y\", `${sample.y - container.getBoundingClientRect().top}px`);\n }\n } else close();\n });\n };\n const down = (event: PointerEvent) => {\n pointerStart = { x: event.clientX, y: event.clientY };\n moved = false;\n };\n const click = (event: MouseEvent) => {\n if (!options.enabled() || moved || (event.target instanceof Element && event.target.closest(\"button,a\"))) return;\n const entry = nearest(event.clientX, event.clientY, event.target instanceof Element ? event.target : null);\n if (!entry) {\n close();\n return;\n }\n pinned = true;\n show(entry);\n options.select({ kind: options.kind(), datum: entry.datum });\n };\n const focus = (event: FocusEvent) => {\n if (event.target !== options.container() || !options.enabled()) return;\n const nodes = visibleRecords();\n const first = options.kind() === \"line\" ? sortedPoints.at(-1) : nodes[0];\n if (first) show(first);\n };\n const key = (event: KeyboardEvent): boolean => {\n if (!options.enabled() || event.target !== options.container()) return false;\n if (event.key === \"Escape\") {\n close();\n return true;\n }\n if (event.key === \"Enter\" && active) {\n if (options.kind() === \"map\" && !visibleRecords().includes(active)) {\n close();\n return true;\n }\n event.preventDefault();\n pinned = true;\n const link = active.element.closest(\"a\");\n if (link) link.dispatchEvent(new MouseEvent(\"click\", { bubbles: true, cancelable: true }));\n else options.select({ kind: options.kind(), datum: active.datum });\n return true;\n }\n const navigationChart = options.kind() === \"map\" || options.kind() === \"stateTimeline\";\n if (navigationChart && !event.altKey) return false;\n if (![\"Home\", \"End\", \"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)) return false;\n let nodes = visibleRecords();\n if (seriesChart()) nodes = [...nodes].sort((a, b) => a.datum.anchor[0] - b.datum.anchor[0]);\n if (options.kind() === \"line\") {\n const seen = new Set<string | number | undefined>();\n nodes = nodes.filter((entry) => {\n const x = rawX(entry);\n if (seen.has(x)) return false;\n seen.add(x);\n return true;\n });\n }\n if (!nodes.length) return false;\n event.preventDefault();\n pinned = false;\n let index = active\n ? options.kind() === \"line\"\n ? nodes.findIndex((entry) => rawX(entry) === rawX(active!))\n : nodes.indexOf(active)\n : -1;\n if (event.key === \"Home\") index = 0;\n else if (event.key === \"End\") index = nodes.length - 1;\n else if (active?.datum.grid && [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(event.key)) {\n const [x, y] = active.datum.grid;\n const dx = event.key === \"ArrowLeft\" ? -1 : event.key === \"ArrowRight\" ? 1 : 0;\n const dy = event.key === \"ArrowUp\" ? -1 : event.key === \"ArrowDown\" ? 1 : 0;\n const next = nodes\n .filter(\n (entry) =>\n entry.datum.grid &&\n (dx\n ? entry.datum.grid[1] === y && (entry.datum.grid[0] - x) * dx > 0\n : entry.datum.grid[0] === x && (entry.datum.grid[1] - y) * dy > 0),\n )\n .sort(\n (a, b) =>\n Math.abs(a.datum.grid![0] - x) +\n Math.abs(a.datum.grid![1] - y) -\n Math.abs(b.datum.grid![0] - x) -\n Math.abs(b.datum.grid![1] - y),\n )[0];\n if (next) index = nodes.indexOf(next);\n } else index += event.key === \"ArrowLeft\" || event.key === \"ArrowUp\" ? -1 : 1;\n show(nodes[Math.max(0, Math.min(nodes.length - 1, index))]!);\n return true;\n };\n return {\n selectDatum: (selected: ChartDatumRef | null | undefined) => selectData(selected ? [selected] : []),\n selectData,\n linkCursor,\n destroy: () => close(false),\n move,\n down,\n click,\n focus,\n key,\n close: () => close(),\n invalidate,\n leave: () => {\n if (!pinned) close();\n },\n };\n}\n\n/** Dismiss inspection on outside interaction, but allow the tooltip itself to scroll. */\nexport function closeChartInspectionOnOutside(options: {\n container: () => HTMLElement | undefined;\n tooltip: () => HTMLElement | undefined;\n close: () => void;\n}): () => void {\n const outside = (event: PointerEvent) => {\n if (event.target instanceof Node && !options.container()?.contains(event.target)) options.close();\n };\n const scroll = (event: Event) => {\n if (event.target instanceof Node && options.tooltip()?.contains(event.target)) return;\n options.close();\n };\n window.addEventListener(\"pointerdown\", outside);\n window.addEventListener(\"scroll\", scroll, true);\n window.addEventListener(\"resize\", options.close);\n return () => {\n window.removeEventListener(\"pointerdown\", outside);\n window.removeEventListener(\"scroll\", scroll, true);\n window.removeEventListener(\"resize\", options.close);\n };\n}\n\nexport type InspectChartOptions = {\n kind: ChartKind;\n format: ChartTooltipFormatter;\n select?: (selection: ChartSelection) => void;\n cursor?: ChartCursor;\n};\nexport type ChartInspection = { invalidate(): void; close(): void; destroy(): void };\n\nlet tooltipId = 0;\n\n/** Attach inspection to stdlib SVG rendered with inspect: true, without a framework. */\nexport function inspectChart(container: HTMLElement, options: InspectChartOptions): ChartInspection {\n const document = container.ownerDocument;\n const anchor = document.createElement(\"span\");\n anchor.className = \"k2b-chart__anchor\";\n anchor.setAttribute(\"aria-hidden\", \"true\");\n const tooltip = document.createElement(\"span\");\n tooltip.className = \"k2b-tooltip k2b-chart__tooltip\";\n tooltip.setAttribute(\"role\", \"tooltip\");\n tooltip.setAttribute(\"popover\", \"manual\");\n tooltip.setAttribute(\"data-instant\", \"true\");\n do {\n tooltip.id = `k2b-chart-tooltip-${++tooltipId}`;\n } while (document.getElementById(tooltip.id));\n container.append(anchor, tooltip);\n const addedTabindex = !container.hasAttribute(\"tabindex\");\n if (addedTabindex) container.setAttribute(\"tabindex\", \"0\");\n\n const inspector = createChartInspector({\n container: () => container,\n cursor: () => options.cursor,\n tooltip: () => tooltip,\n anchor: () => anchor,\n kind: () => options.kind,\n enabled: () => true,\n format: options.format,\n select: (selection) => options.select?.(selection),\n });\n container.addEventListener(\"pointerdown\", inspector.down);\n container.addEventListener(\"pointermove\", inspector.move);\n container.addEventListener(\"click\", inspector.click);\n container.addEventListener(\"pointerleave\", inspector.leave);\n container.addEventListener(\"focusin\", inspector.focus);\n container.addEventListener(\"focusout\", inspector.close);\n container.addEventListener(\"keydown\", inspector.key);\n const removeOutside = closeChartInspectionOnOutside({ container: () => container, tooltip: () => tooltip, close: inspector.close });\n const unlinkCursor = inspector.linkCursor(options.cursor);\n let destroyed = false;\n return {\n invalidate: () => {\n if (!destroyed) inspector.invalidate();\n },\n close: () => {\n if (!destroyed) inspector.close();\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n container.removeEventListener(\"pointerdown\", inspector.down);\n container.removeEventListener(\"pointermove\", inspector.move);\n container.removeEventListener(\"click\", inspector.click);\n container.removeEventListener(\"pointerleave\", inspector.leave);\n container.removeEventListener(\"focusin\", inspector.focus);\n container.removeEventListener(\"focusout\", inspector.close);\n container.removeEventListener(\"keydown\", inspector.key);\n removeOutside();\n unlinkCursor();\n inspector.destroy();\n for (const element of container.querySelectorAll<SVGGraphicsElement>(\"[data-chart-datum]\")) {\n element.removeAttribute(\"data-inspected\");\n element.style.removeProperty(\"--k2b-chart-inspection-color\");\n if (!element.getAttribute(\"style\")) element.removeAttribute(\"style\");\n }\n // Inspection geometry the inspector wrote onto the host container.\n for (const name of [\"inspection-x\", \"inspection-y\", \"plot-left\", \"plot-right\", \"plot-top\", \"plot-bottom\"])\n container.style.removeProperty(`--k2b-chart-${name}`);\n anchor.remove();\n tooltip.remove();\n if (addedTabindex) container.removeAttribute(\"tabindex\");\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}