@k2b/ui 0.50.0 → 0.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base.css +32 -1
- package/dist/browser/actions/Button.js.map +1 -1
- package/dist/browser/actions/CommandList.js +861 -0
- package/dist/browser/actions/CommandList.js.map +1 -0
- package/dist/browser/actions/CommandMenu.js +237 -0
- package/dist/browser/actions/CommandMenu.js.map +1 -0
- package/dist/browser/actions/Dropdown.js +43 -10
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/command-dock.js +47 -0
- package/dist/browser/actions/command-dock.js.map +1 -0
- package/dist/browser/actions/command-items.js +84 -0
- package/dist/browser/actions/command-items.js.map +1 -0
- package/dist/browser/actions/command-messages.js +42 -0
- package/dist/browser/actions/command-messages.js.map +1 -0
- package/dist/browser/actions/index.js +1 -0
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/charts/core/area.js +3 -5
- package/dist/browser/charts/core/area.js.map +1 -1
- package/dist/browser/charts/core/calendar.js +1 -1
- package/dist/browser/charts/core/calendar.js.map +1 -1
- package/dist/browser/charts/core/chart-messages.js +17 -0
- package/dist/browser/charts/core/chart-messages.js.map +1 -0
- package/dist/browser/charts/core/hbar-layout.js +118 -0
- package/dist/browser/charts/core/hbar-layout.js.map +1 -0
- package/dist/browser/charts/core/hbar.js +39 -0
- package/dist/browser/charts/core/hbar.js.map +1 -0
- package/dist/browser/charts/core/index.js +7 -2
- package/dist/browser/charts/core/index.js.map +1 -1
- package/dist/browser/charts/core/map.js +116 -0
- package/dist/browser/charts/core/map.js.map +1 -0
- package/dist/browser/charts/core/registry.js +22 -15
- package/dist/browser/charts/core/registry.js.map +1 -1
- package/dist/browser/charts/core/render-size.js +13 -0
- package/dist/browser/charts/core/render-size.js.map +1 -0
- package/dist/browser/charts/core/render.js +20 -10
- package/dist/browser/charts/core/render.js.map +1 -1
- package/dist/browser/charts/core/snapshot.js +3 -3
- package/dist/browser/charts/core/snapshot.js.map +1 -1
- package/dist/browser/charts/core/svg-renderers.js +2406 -0
- package/dist/browser/charts/core/svg-renderers.js.map +1 -0
- package/dist/browser/charts/core/svg.js +4 -2525
- package/dist/browser/charts/core/svg.js.map +1 -1
- package/dist/browser/charts/core/types.js +0 -2
- package/dist/browser/charts/core/types.js.map +1 -1
- package/dist/browser/charts/core/waterfall.js +162 -0
- package/dist/browser/charts/core/waterfall.js.map +1 -0
- package/dist/browser/charts/description.js +2 -0
- package/dist/browser/charts/description.js.map +1 -0
- package/dist/browser/charts.js.map +1 -1
- package/dist/browser/content/Chart.js +14 -628
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartRoot.js +632 -0
- package/dist/browser/content/ChartRoot.js.map +1 -0
- package/dist/browser/content/ChartSparkline.js +24 -0
- package/dist/browser/content/ChartSparkline.js.map +1 -0
- package/dist/browser/content/FileView.js +111 -61
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/Lightbox.js +8 -8
- package/dist/browser/content/Lightbox.js.map +1 -1
- package/dist/browser/content/MapView.js +30 -28
- package/dist/browser/content/MapView.js.map +1 -1
- package/dist/browser/content/PdfPreview.js +84 -52
- package/dist/browser/content/PdfPreview.js.map +1 -1
- package/dist/browser/content/PdfViewer.js +588 -0
- package/dist/browser/content/PdfViewer.js.map +1 -0
- package/dist/browser/content/chart-bar.js +246 -16
- package/dist/browser/content/chart-bar.js.map +1 -1
- package/dist/browser/content/chart-inspection-core.js +22 -21
- package/dist/browser/content/chart-inspection-core.js.map +1 -1
- package/dist/browser/content/chart-line-gaps.js +1 -1
- package/dist/browser/content/chart-line-gaps.js.map +1 -1
- package/dist/browser/content/chart-message-catalog.js +10 -0
- package/dist/browser/content/chart-message-catalog.js.map +1 -1
- package/dist/browser/content/chart-state-timeline.js +1 -1
- package/dist/browser/content/chart-state-timeline.js.map +1 -1
- package/dist/browser/content/chart-svg.js +2 -1
- package/dist/browser/content/chart-svg.js.map +1 -1
- package/dist/browser/content/index.js +1 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/content/pdf-document.js +29 -0
- package/dist/browser/content/pdf-document.js.map +1 -0
- package/dist/browser/content/pdf-limits.js +31 -0
- package/dist/browser/content/pdf-limits.js.map +1 -0
- package/dist/browser/content/pdf-messages.js +34 -2
- package/dist/browser/content/pdf-messages.js.map +1 -1
- package/dist/browser/content/pdf-viewer-engine.js +57 -0
- package/dist/browser/content/pdf-viewer-worker.js +28 -0
- package/dist/browser/inputs/ChoiceInputs.js +94 -51
- package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
- package/dist/browser/inputs/ChoiceSlider.js +75 -58
- package/dist/browser/inputs/ChoiceSlider.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +113 -98
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/PeriodPicker.js +874 -0
- package/dist/browser/inputs/PeriodPicker.js.map +1 -0
- package/dist/browser/inputs/index.js +4 -1
- package/dist/browser/inputs/index.js.map +1 -1
- package/dist/browser/inputs/input-messages.js +8 -2
- package/dist/browser/inputs/input-messages.js.map +1 -1
- package/dist/browser/inputs/markdown/MarkdownEditor.js +14 -10
- package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/browser/inputs/markdown/SlashCommands.js +402 -0
- package/dist/browser/inputs/markdown/SlashCommands.js.map +1 -0
- package/dist/browser/inputs/period-picker-messages.js +71 -0
- package/dist/browser/inputs/period-picker-messages.js.map +1 -0
- package/dist/browser/inputs/period.js +263 -0
- package/dist/browser/inputs/period.js.map +1 -0
- package/dist/browser/layout/DetailPanel.js +147 -120
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/Discussion.js +101 -108
- package/dist/browser/layout/Discussion.js.map +1 -1
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/surfaces/DescriptionList.js +5 -2
- package/dist/browser/surfaces/DescriptionList.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +19 -14
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/browser/surfaces/delta-badge.js +16 -2
- package/dist/browser/surfaces/delta-badge.js.map +1 -1
- package/dist/browser/widgets/DashboardFrame.js +310 -0
- package/dist/browser/widgets/DashboardFrame.js.map +1 -0
- package/dist/browser/widgets/index.js +1 -0
- package/dist/browser/widgets/index.js.map +1 -1
- package/dist/licenses/pdfjs-dist.txt +177 -0
- package/dist/ssr/actions/Button.js.map +1 -1
- package/dist/ssr/actions/CommandList.js +638 -0
- package/dist/ssr/actions/CommandList.js.map +1 -0
- package/dist/ssr/actions/CommandMenu.js +197 -0
- package/dist/ssr/actions/CommandMenu.js.map +1 -0
- package/dist/ssr/actions/Dropdown.js +43 -10
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/command-dock.js +47 -0
- package/dist/ssr/actions/command-dock.js.map +1 -0
- package/dist/ssr/actions/command-items.js +84 -0
- package/dist/ssr/actions/command-items.js.map +1 -0
- package/dist/ssr/actions/command-messages.js +42 -0
- package/dist/ssr/actions/command-messages.js.map +1 -0
- package/dist/ssr/actions/index.js +1 -0
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/charts/core/area.js +3 -5
- package/dist/ssr/charts/core/area.js.map +1 -1
- package/dist/ssr/charts/core/calendar.js +1 -1
- package/dist/ssr/charts/core/calendar.js.map +1 -1
- package/dist/ssr/charts/core/chart-messages.js +17 -0
- package/dist/ssr/charts/core/chart-messages.js.map +1 -0
- package/dist/ssr/charts/core/hbar-layout.js +118 -0
- package/dist/ssr/charts/core/hbar-layout.js.map +1 -0
- package/dist/ssr/charts/core/hbar.js +39 -0
- package/dist/ssr/charts/core/hbar.js.map +1 -0
- package/dist/ssr/charts/core/index.js +7 -2
- package/dist/ssr/charts/core/index.js.map +1 -1
- package/dist/ssr/charts/core/map.js +116 -0
- package/dist/ssr/charts/core/map.js.map +1 -0
- package/dist/ssr/charts/core/registry.js +22 -15
- package/dist/ssr/charts/core/registry.js.map +1 -1
- package/dist/ssr/charts/core/render-size.js +13 -0
- package/dist/ssr/charts/core/render-size.js.map +1 -0
- package/dist/ssr/charts/core/render.js +20 -10
- package/dist/ssr/charts/core/render.js.map +1 -1
- package/dist/ssr/charts/core/snapshot.js +3 -3
- package/dist/ssr/charts/core/snapshot.js.map +1 -1
- package/dist/ssr/charts/core/svg-renderers.js +2406 -0
- package/dist/ssr/charts/core/svg-renderers.js.map +1 -0
- package/dist/ssr/charts/core/svg.js +4 -2525
- package/dist/ssr/charts/core/svg.js.map +1 -1
- package/dist/ssr/charts/core/types.js +0 -2
- package/dist/ssr/charts/core/types.js.map +1 -1
- package/dist/ssr/charts/core/waterfall.js +162 -0
- package/dist/ssr/charts/core/waterfall.js.map +1 -0
- package/dist/ssr/charts/description.js +2 -0
- package/dist/ssr/charts/description.js.map +1 -0
- package/dist/ssr/charts.js.map +1 -1
- package/dist/ssr/content/Chart.js +14 -471
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartRoot.js +475 -0
- package/dist/ssr/content/ChartRoot.js.map +1 -0
- package/dist/ssr/content/ChartSparkline.js +24 -0
- package/dist/ssr/content/ChartSparkline.js.map +1 -0
- package/dist/ssr/content/FileView.js +56 -7
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/Lightbox.js +8 -8
- package/dist/ssr/content/Lightbox.js.map +1 -1
- package/dist/ssr/content/MapView.js +9 -9
- package/dist/ssr/content/MapView.js.map +1 -1
- package/dist/ssr/content/PdfPreview.js +49 -20
- package/dist/ssr/content/PdfPreview.js.map +1 -1
- package/dist/ssr/content/PdfViewer.js +484 -0
- package/dist/ssr/content/PdfViewer.js.map +1 -0
- package/dist/ssr/content/chart-bar.js +246 -16
- package/dist/ssr/content/chart-bar.js.map +1 -1
- package/dist/ssr/content/chart-inspection-core.js +22 -21
- package/dist/ssr/content/chart-inspection-core.js.map +1 -1
- package/dist/ssr/content/chart-line-gaps.js +1 -1
- package/dist/ssr/content/chart-line-gaps.js.map +1 -1
- package/dist/ssr/content/chart-message-catalog.js +10 -0
- package/dist/ssr/content/chart-message-catalog.js.map +1 -1
- package/dist/ssr/content/chart-state-timeline.js +1 -1
- package/dist/ssr/content/chart-state-timeline.js.map +1 -1
- package/dist/ssr/content/chart-svg.js +2 -1
- package/dist/ssr/content/chart-svg.js.map +1 -1
- package/dist/ssr/content/index.js +1 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/content/pdf-document.js +29 -0
- package/dist/ssr/content/pdf-document.js.map +1 -0
- package/dist/ssr/content/pdf-limits.js +31 -0
- package/dist/ssr/content/pdf-limits.js.map +1 -0
- package/dist/ssr/content/pdf-messages.js +34 -2
- package/dist/ssr/content/pdf-messages.js.map +1 -1
- package/dist/ssr/inputs/ChoiceInputs.js +49 -12
- package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
- package/dist/ssr/inputs/ChoiceSlider.js +17 -12
- package/dist/ssr/inputs/ChoiceSlider.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +14 -9
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/PeriodPicker.js +598 -0
- package/dist/ssr/inputs/PeriodPicker.js.map +1 -0
- package/dist/ssr/inputs/index.js +4 -1
- package/dist/ssr/inputs/index.js.map +1 -1
- package/dist/ssr/inputs/input-messages.js +8 -2
- package/dist/ssr/inputs/input-messages.js.map +1 -1
- package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
- package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/ssr/inputs/markdown/SlashCommands.js +339 -0
- package/dist/ssr/inputs/markdown/SlashCommands.js.map +1 -0
- package/dist/ssr/inputs/period-picker-messages.js +71 -0
- package/dist/ssr/inputs/period-picker-messages.js.map +1 -0
- package/dist/ssr/inputs/period.js +263 -0
- package/dist/ssr/inputs/period.js.map +1 -0
- package/dist/ssr/layout/DetailPanel.js +27 -4
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/Discussion.js +16 -2
- package/dist/ssr/layout/Discussion.js.map +1 -1
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/surfaces/DescriptionList.js +1 -1
- package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +4 -5
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/surfaces/delta-badge.js +16 -2
- package/dist/ssr/surfaces/delta-badge.js.map +1 -1
- package/dist/ssr/widgets/DashboardFrame.js +200 -0
- package/dist/ssr/widgets/DashboardFrame.js.map +1 -0
- package/dist/ssr/widgets/index.js +1 -0
- package/dist/ssr/widgets/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/Button.d.ts +1 -1
- package/dist/types/actions/CommandList.d.ts +120 -0
- package/dist/types/actions/CommandMenu.d.ts +39 -0
- package/dist/types/actions/Dropdown.d.ts +17 -0
- package/dist/types/actions/command-dock.d.ts +8 -0
- package/dist/types/actions/command-items.d.ts +134 -0
- package/dist/types/actions/command-messages.d.ts +19 -0
- package/dist/types/actions/index.d.ts +3 -0
- package/dist/types/charts/core/calendar.d.ts +1 -1
- package/dist/types/charts/core/chart-messages.d.ts +5 -0
- package/dist/types/charts/core/hbar-layout.d.ts +74 -0
- package/dist/types/charts/core/hbar.d.ts +13 -0
- package/dist/types/charts/core/index.d.ts +7 -2
- package/dist/types/charts/core/map.d.ts +3 -0
- package/dist/types/charts/core/registry.d.ts +17 -11
- package/dist/types/charts/core/render-size.d.ts +7 -0
- package/dist/types/charts/core/render.d.ts +1 -4
- package/dist/types/charts/core/snapshot.d.ts +2 -2
- package/dist/types/charts/core/svg-renderers.d.ts +722 -0
- package/dist/types/charts/core/svg.d.ts +4 -698
- package/dist/types/charts/core/types.d.ts +1 -12
- package/dist/types/charts/core/waterfall.d.ts +68 -0
- package/dist/types/charts/description.d.ts +226 -0
- package/dist/types/charts.d.ts +1 -0
- package/dist/types/content/Chart.d.ts +3 -91
- package/dist/types/content/ChartRoot.d.ts +92 -0
- package/dist/types/content/ChartSparkline.d.ts +5 -0
- package/dist/types/content/PdfViewer.d.ts +32 -0
- package/dist/types/content/chart-bar.d.ts +95 -2
- package/dist/types/content/index.d.ts +2 -0
- package/dist/types/content/pdf-document.d.ts +5 -0
- package/dist/types/content/pdf-engine.d.ts +9 -0
- package/dist/types/content/pdf-limits.d.ts +43 -0
- package/dist/types/content/pdf-messages.d.ts +16 -0
- package/dist/types/inputs/ChoiceInputs.d.ts +4 -0
- package/dist/types/inputs/ChoiceSlider.d.ts +12 -0
- package/dist/types/inputs/DatePicker.d.ts +22 -0
- package/dist/types/inputs/PeriodPicker.d.ts +24 -0
- package/dist/types/inputs/index.d.ts +8 -2
- package/dist/types/inputs/input-messages.d.ts +3 -0
- package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -0
- package/dist/types/inputs/markdown/SlashCommands.d.ts +20 -0
- package/dist/types/inputs/period-picker-messages.d.ts +34 -0
- package/dist/types/inputs/period.d.ts +134 -0
- package/dist/types/layout/DetailPanel.d.ts +12 -0
- package/dist/types/layout/index.d.ts +1 -1
- package/dist/types/surfaces/DescriptionList.d.ts +5 -0
- package/dist/types/surfaces/StatCell.d.ts +6 -1
- package/dist/types/widgets/DashboardFrame.d.ts +58 -0
- package/dist/types/widgets/index.d.ts +1 -0
- package/package.json +2 -1
|
@@ -1 +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 { MapSnapshotError, rasterizeMapView, snapshotAborted, snapshotWait } from \"./map-view-snapshot\";\nimport type { MapViewHandle, 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 attribution = children(() => props.attribution);\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 generation = 0;\n let revision = 0;\n let idle = false;\n let capturing = false;\n const lifetime = new AbortController();\n const handle: MapViewHandle = {\n async snapshot(options = {}) {\n const timeout = options.timeoutMs ?? 30_000;\n if (!Number.isInteger(timeout) || timeout < 1 || timeout > 240_000) throw new RangeError(\"Invalid snapshot timeout\");\n if (disposed) throw new MapSnapshotError(\"disposed\");\n if (capturing) throw new MapSnapshotError(\"busy\");\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(new MapSnapshotError(\"timed_out\")), timeout);\n const signal = AbortSignal.any([controller.signal, lifetime.signal, ...(options.signal ? [options.signal] : [])]);\n const initial = revision;\n const initialGeneration = generation;\n const assertCurrent = () => {\n if (signal.aborted) throw snapshotAborted(signal);\n if (disposed) throw new MapSnapshotError(\"disposed\");\n if (state() === \"error\") throw new MapSnapshotError(\"resource_failed\");\n if ([\"static\", \"empty\", \"no-webgl\"].includes(state())) throw new MapSnapshotError(\"not_ready\");\n if (revision !== initial || generation !== initialGeneration) throw new MapSnapshotError(\"changed\");\n };\n capturing = true;\n try {\n assertCurrent();\n await snapshotWait(document.fonts.ready, signal);\n // An idle event includes symbol placement/fades, unlike the initial load event.\n await new Promise<void>((resolve, reject) => {\n let frameId = 0;\n const stop = () => {\n cancelAnimationFrame(frameId);\n reject(snapshotAborted(signal));\n };\n const poll = () => {\n try {\n assertCurrent();\n if (map && idle && map.isStyleLoaded() && map.areTilesLoaded() && !map.isMoving()) {\n signal.removeEventListener(\"abort\", stop);\n resolve();\n } else frameId = requestAnimationFrame(poll);\n } catch (error) {\n signal.removeEventListener(\"abort\", stop);\n reject(error);\n }\n };\n signal.addEventListener(\"abort\", stop, { once: true });\n poll();\n });\n assertCurrent();\n const instance = map!;\n const result = await new Promise<Awaited<ReturnType<typeof rasterizeMapView>>>((resolve, reject) => {\n const clean = () => {\n instance.off(\"render\", render);\n instance.off(\"remove\", removed);\n signal.removeEventListener(\"abort\", stop);\n };\n const stop = () => {\n clean();\n reject(snapshotAborted(signal));\n };\n const removed = () => {\n clean();\n reject(new MapSnapshotError(disposed ? \"disposed\" : state() === \"error\" ? \"resource_failed\" : \"changed\"));\n };\n const render = () => {\n clean();\n try {\n assertCurrent();\n if (!instance.isStyleLoaded() || !instance.areTilesLoaded() || instance.isMoving()) throw new MapSnapshotError(\"changed\");\n syncOverlay();\n rasterizeMapView(root, instance.getCanvas(), signal).then(resolve, reject);\n } catch (error) {\n reject(error);\n }\n };\n signal.addEventListener(\"abort\", stop, { once: true });\n instance.on(\"render\", render);\n instance.on(\"remove\", removed);\n instance.triggerRepaint();\n });\n assertCurrent();\n return result;\n } finally {\n clearTimeout(timer);\n capturing = false;\n }\n },\n };\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 idle = false;\n const previous = map;\n map = undefined;\n previous?.remove();\n setBoxStyle(undefined);\n setLiveScale(undefined);\n setChosenZoom(undefined);\n currentStyle = undefined;\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 setState(\"error\");\n removeMap();\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\", () => {\n // A missing paid resource must remain visible and recoverable, including failures after initial load.\n fail();\n });\n instance.on(\"load\", () => {\n if (disposed || attempt !== generation) return;\n refit();\n setState(\"ready\");\n syncOverlay();\n });\n instance.on(\"idle\", () => {\n if (map !== instance || disposed) return;\n idle = true;\n syncOverlay();\n });\n instance.on(\"dataloading\", () => {\n idle = false;\n });\n instance.on(\"movestart\", (event) => {\n idle = false;\n if (event.originalEvent) touch();\n });\n instance.on(\"move\", () => {\n revision++;\n syncOverlay();\n });\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 props.ref?.(handle);\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 revision++;\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 revision++;\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 revision++;\n idle = false;\n currentStyle = style;\n map.setStyle(style);\n }\n });\n createEffect(() => {\n selected();\n state();\n untrack(clearSelectedPin);\n });\n onCleanup(() => {\n disposed = true;\n lifetime.abort(new MapSnapshotError(\"disposed\"));\n intersection?.disconnect();\n resize?.disconnect();\n infoResize?.disconnect();\n for (const observer of themes) observer.disconnect();\n removeMap();\n });\n createEffect(() => {\n // Deep reads also subscribe to in-place Solid store updates (tone/mark/labels included).\n JSON.stringify([props.markers, props.lines, props.areas, props.ownLocation, props.selectedId, props.class]);\n dark();\n attribution();\n revision++;\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.toArray().some((child) => child != null && typeof child !== \"boolean\" && child !== \"\")}>\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()}>{attribution()}</MapFootRow>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
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 { MapSnapshotError, rasterizeMapView, snapshotAborted, snapshotWait } from \"./map-view-snapshot\";\nimport type { MapViewHandle, 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 attribution = children(() => props.attribution);\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 generation = 0;\n let revision = 0;\n let idle = false;\n let capturing = false;\n const lifetime = new AbortController();\n const handle: MapViewHandle = {\n async snapshot(options = {}) {\n const timeout = options.timeoutMs ?? 30_000;\n if (!Number.isInteger(timeout) || timeout < 1 || timeout > 240_000) throw new RangeError(\"Invalid snapshot timeout\");\n if (disposed) throw new MapSnapshotError(\"disposed\");\n if (capturing) throw new MapSnapshotError(\"busy\");\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(new MapSnapshotError(\"timed_out\")), timeout);\n const signal = AbortSignal.any([controller.signal, lifetime.signal, ...(options.signal ? [options.signal] : [])]);\n const initial = revision;\n const initialGeneration = generation;\n const assertCurrent = () => {\n if (signal.aborted) throw snapshotAborted(signal);\n if (disposed) throw new MapSnapshotError(\"disposed\");\n if (state() === \"error\") throw new MapSnapshotError(\"resource_failed\");\n if ([\"static\", \"empty\", \"no-webgl\"].includes(state())) throw new MapSnapshotError(\"not_ready\");\n if (revision !== initial || generation !== initialGeneration) throw new MapSnapshotError(\"changed\");\n };\n capturing = true;\n try {\n assertCurrent();\n await snapshotWait(document.fonts.ready, signal);\n // An idle event includes symbol placement/fades, unlike the initial load event.\n await new Promise<void>((resolve, reject) => {\n let frameId = 0;\n const stop = () => {\n cancelAnimationFrame(frameId);\n reject(snapshotAborted(signal));\n };\n const poll = () => {\n try {\n assertCurrent();\n if (map && idle && map.isStyleLoaded() && map.areTilesLoaded() && !map.isMoving()) {\n signal.removeEventListener(\"abort\", stop);\n resolve();\n } else frameId = requestAnimationFrame(poll);\n } catch (error) {\n signal.removeEventListener(\"abort\", stop);\n reject(error);\n }\n };\n signal.addEventListener(\"abort\", stop, { once: true });\n poll();\n });\n assertCurrent();\n const instance = map!;\n const result = await new Promise<Awaited<ReturnType<typeof rasterizeMapView>>>((resolve, reject) => {\n const clean = () => {\n instance.off(\"render\", render);\n instance.off(\"remove\", removed);\n signal.removeEventListener(\"abort\", stop);\n };\n const stop = () => {\n clean();\n reject(snapshotAborted(signal));\n };\n const removed = () => {\n clean();\n reject(new MapSnapshotError(disposed ? \"disposed\" : state() === \"error\" ? \"resource_failed\" : \"changed\"));\n };\n const render = () => {\n clean();\n try {\n assertCurrent();\n if (!instance.isStyleLoaded() || !instance.areTilesLoaded() || instance.isMoving()) throw new MapSnapshotError(\"changed\");\n syncOverlay();\n rasterizeMapView(root, instance.getCanvas(), signal).then(resolve, reject);\n } catch (error) {\n reject(error);\n }\n };\n signal.addEventListener(\"abort\", stop, { once: true });\n instance.on(\"render\", render);\n instance.on(\"remove\", removed);\n instance.triggerRepaint();\n });\n assertCurrent();\n return result;\n } finally {\n clearTimeout(timer);\n capturing = false;\n }\n },\n };\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 idle = false;\n const previous = map;\n map = undefined;\n previous?.remove();\n setBoxStyle(undefined);\n setLiveScale(undefined);\n setChosenZoom(undefined);\n currentStyle = undefined;\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 setState(\"error\");\n removeMap();\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\", () => {\n // A missing paid resource must remain visible and recoverable, including failures after initial load.\n fail();\n });\n instance.on(\"load\", () => {\n if (disposed || attempt !== generation) return;\n refit();\n setState(\"ready\");\n syncOverlay();\n });\n instance.on(\"idle\", () => {\n if (map !== instance || disposed) return;\n idle = true;\n syncOverlay();\n });\n instance.on(\"dataloading\", () => {\n idle = false;\n });\n instance.on(\"movestart\", (event) => {\n idle = false;\n if (event.originalEvent) touch();\n });\n instance.on(\"move\", () => {\n revision++;\n syncOverlay();\n });\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 props.ref?.(handle);\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 revision++;\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 revision++;\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 revision++;\n idle = false;\n currentStyle = style;\n map.setStyle(style);\n }\n });\n createEffect(() => {\n selected();\n state();\n untrack(clearSelectedPin);\n });\n onCleanup(() => {\n disposed = true;\n lifetime.abort(new MapSnapshotError(\"disposed\"));\n intersection?.disconnect();\n resize?.disconnect();\n infoResize?.disconnect();\n for (const observer of themes) observer.disconnect();\n removeMap();\n });\n createEffect(() => {\n // Deep reads also subscribe to in-place Solid store updates (tone/mark/labels included).\n JSON.stringify([props.markers, props.lines, props.areas, props.ownLocation, props.selectedId, props.class]);\n dark();\n attribution();\n revision++;\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.toArray().some((child) => child != null && typeof child !== \"boolean\" && child !== \"\")}>\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 k2b-overlay-surface\">\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 <div class=\"k2b-map-view__locate-group k2b-overlay-surface\">\n <IconButton tooltip={false} label={messages().locate} aria-pressed={!!props.ownLocation} onClick={() => props.onLocate?.()}>\n <i class=\"ti ti-current-location\" aria-hidden=\"true\" />\n </IconButton>\n </div>\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()}>{attribution()}</MapFootRow>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,12 +16,12 @@ var _tmpl$ = /*#__PURE__*/_$template(`<button type=button class=k2b-button data-
|
|
|
16
16
|
_tmpl$3 = /*#__PURE__*/_$template(`<span role=alert class=k2b-content-pdf-preview__notice>`),
|
|
17
17
|
_tmpl$4 = /*#__PURE__*/_$template(`<div class=k2b-content-pdf-preview__actions><!$><!/><!$><!/><!$><!/><!$><!/>`),
|
|
18
18
|
_tmpl$5 = /*#__PURE__*/_$template(`<a class=k2b-button data-variant=secondary data-size=sm target=_blank rel=noopener><i class="ti ti-external-link"aria-hidden=true></i><!$><!/>`),
|
|
19
|
-
_tmpl$6 = /*#__PURE__*/_$template(`<div class=k2b-content-pdf-preview__viewer
|
|
19
|
+
_tmpl$6 = /*#__PURE__*/_$template(`<div class=k2b-content-pdf-preview__viewer><!$><!/><!$><!/><!$><!/>`),
|
|
20
20
|
_tmpl$7 = /*#__PURE__*/_$template(`<iframe class=k2b-content-pdf-preview__frame>`),
|
|
21
21
|
_tmpl$8 = /*#__PURE__*/_$template(`<button type=button class=k2b-button data-variant=secondary data-size=sm>`),
|
|
22
22
|
_tmpl$9 = /*#__PURE__*/_$template(`<h2 class=k2b-content-pdf-preview__title>`),
|
|
23
23
|
_tmpl$0 = /*#__PURE__*/_$template(`<section><div class=k2b-content-pdf-preview__toolbar><div class=k2b-content-pdf-preview__heading></div><!$><!/></div><!$><!/>`);
|
|
24
|
-
import { createSignal, onCleanup, onMount, Show } from "solid-js";
|
|
24
|
+
import { createSignal, lazy, onCleanup, onMount, Show } from "solid-js";
|
|
25
25
|
import { announce } from "../feedback/announce";
|
|
26
26
|
import { useUiMessages } from "../intl/messages";
|
|
27
27
|
import Placeholder from "../surfaces/Placeholder";
|
|
@@ -37,6 +37,9 @@ const readErrorMessage = async response => {
|
|
|
37
37
|
status: response.status
|
|
38
38
|
});
|
|
39
39
|
};
|
|
40
|
+
|
|
41
|
+
// The viewer and pdf.js load only once a document is shown, so a page that never shows one carries neither.
|
|
42
|
+
const PdfViewer = lazy(() => import("./PdfViewer"));
|
|
40
43
|
export default function PdfPreview(props) {
|
|
41
44
|
const messages = useUiMessages();
|
|
42
45
|
const pdfMessages = usePdfMessages();
|
|
@@ -48,8 +51,12 @@ export default function PdfPreview(props) {
|
|
|
48
51
|
const [error, setError] = createSignal(null);
|
|
49
52
|
const [failed, setFailed] = createSignal(false);
|
|
50
53
|
const [tabBlocked, setTabBlocked] = createSignal(false);
|
|
51
|
-
// The
|
|
54
|
+
// The viewer has its document only once it drew the first page (or the fallback frame fired `load`); until then the
|
|
55
|
+
// loading state covers it.
|
|
52
56
|
const [drawn, setDrawn] = createSignal(false);
|
|
57
|
+
// The document pdf.js draws. When pdf.js cannot open or draw it, the browser's own viewer shows it in a frame.
|
|
58
|
+
const [shownDocument, setShownDocument] = createSignal(null);
|
|
59
|
+
const [viewerFailed, setViewerFailed] = createSignal(false);
|
|
53
60
|
// An automatic preview shows one fixed document; the open action reuses it instead of requesting it again.
|
|
54
61
|
let shownBlob = null;
|
|
55
62
|
let openButton;
|
|
@@ -61,13 +68,10 @@ export default function PdfPreview(props) {
|
|
|
61
68
|
let loadGeneration = 0;
|
|
62
69
|
let openGeneration = 0;
|
|
63
70
|
|
|
64
|
-
//
|
|
65
|
-
//
|
|
71
|
+
// pdf.js draws the document in every browser. Only when it fails does the browser's own viewer take over; without one
|
|
72
|
+
// (`navigator.pdfViewerEnabled === false`, as in Chrome on Android) a frame stays empty or downloads the file, so the
|
|
73
|
+
// viewer explains that instead and leaves the document to the open and download actions.
|
|
66
74
|
const inlineViewer = () => typeof navigator === "undefined" || navigator.pdfViewerEnabled !== false;
|
|
67
|
-
// There an automatic preview could show only that hint, so it requests nothing: the open action fetches the document
|
|
68
|
-
// when someone asks for it, and is also the retry after it fails. An on-demand preview still renders, because its
|
|
69
|
-
// request also checks the caller's input.
|
|
70
|
-
const openOnly = () => Boolean(props.autoLoad) && !inlineViewer();
|
|
71
75
|
const revokeCurrent = () => {
|
|
72
76
|
const current = url();
|
|
73
77
|
if (current) URL.revokeObjectURL(current);
|
|
@@ -104,14 +108,11 @@ export default function PdfPreview(props) {
|
|
|
104
108
|
shownBlob = blob;
|
|
105
109
|
setFailed(false);
|
|
106
110
|
setDrawn(false);
|
|
111
|
+
setViewerFailed(false);
|
|
112
|
+
setShownDocument(blob);
|
|
107
113
|
setUrl(nextUrl);
|
|
108
114
|
setLoading(false);
|
|
109
115
|
if (previousUrl) URL.revokeObjectURL(previousUrl);
|
|
110
|
-
// The loading status turns into the missing-viewer hint in place and stops being a live region, so say it here.
|
|
111
|
-
if (!inlineViewer()) {
|
|
112
|
-
announce(pdfMessages().pdfPreviewNoViewer);
|
|
113
|
-
announce(pdfMessages().pdfPreviewNoViewerDescription);
|
|
114
|
-
}
|
|
115
116
|
// The shown document removes the retry action; keep keyboard focus in the actions instead of the page, or, when
|
|
116
117
|
// the host shows only the content, in the viewer, which hands it on to the document once the frame has loaded it.
|
|
117
118
|
if (retryFocused && document.activeElement === document.body) (openButton?.isConnected ? openButton : viewer)?.focus();
|
|
@@ -129,7 +130,7 @@ export default function PdfPreview(props) {
|
|
|
129
130
|
// Hand the initial loading state to the request itself, which also covers a preview disabled by now or one that
|
|
130
131
|
// leaves the document to the open action.
|
|
131
132
|
setLoading(false);
|
|
132
|
-
if (props.autoLoad
|
|
133
|
+
if (props.autoLoad) void load();
|
|
133
134
|
});
|
|
134
135
|
const openInNewTab = async () => {
|
|
135
136
|
if (loading() || opening() || props.disabled?.()) return;
|
|
@@ -162,7 +163,7 @@ export default function PdfPreview(props) {
|
|
|
162
163
|
|
|
163
164
|
// With autoLoad, rendering again would show the same document: offer it only until one is shown. After a failure the
|
|
164
165
|
// default error state carries it as the retry; beside a caller's error content it stays in place while a retry loads.
|
|
165
|
-
const renderable = () => !
|
|
166
|
+
const renderable = () => !props.autoLoad || (failed() ? Boolean(props.renderError) : !url() && !loading());
|
|
166
167
|
const actions = () => (() => {
|
|
167
168
|
var _el$ = _$getNextElement(_tmpl$4),
|
|
168
169
|
_el$1 = _el$.firstChild,
|
|
@@ -268,28 +269,59 @@ export default function PdfPreview(props) {
|
|
|
268
269
|
return _el$;
|
|
269
270
|
})();
|
|
270
271
|
// Every state uses one placeholder in the viewer's box, so loading changes no layout: idle and loading before a
|
|
271
|
-
// document arrives, loading over the
|
|
272
|
+
// document arrives, loading over the viewer until it has drawn the document, and the hint where nothing can draw it.
|
|
272
273
|
const status = () => {
|
|
273
274
|
if (error()) return null;
|
|
274
|
-
if (
|
|
275
|
+
if (viewerFailed() && !inlineViewer() && url()) return "no-viewer";
|
|
275
276
|
if (!url()) return loading() ? "loading" : "idle";
|
|
276
277
|
return drawn() ? null : "loading";
|
|
277
278
|
};
|
|
279
|
+
// pdf.js could not draw the document: the browser's viewer takes over, or, without one, the hint explains it. The
|
|
280
|
+
// loading status turns into that hint in place and stops being a live region, so say it here.
|
|
281
|
+
const fallBack = () => {
|
|
282
|
+
setDrawn(false);
|
|
283
|
+
setViewerFailed(true);
|
|
284
|
+
if (!inlineViewer()) {
|
|
285
|
+
announce(pdfMessages().pdfPreviewNoViewer);
|
|
286
|
+
announce(pdfMessages().pdfPreviewNoViewerDescription);
|
|
287
|
+
}
|
|
288
|
+
};
|
|
278
289
|
const viewerBox = () => // While it shows a placeholder, the viewer itself holds keyboard focus that has nowhere else to go.
|
|
279
290
|
(() => {
|
|
280
291
|
var _el$25 = _$getNextElement(_tmpl$6),
|
|
281
292
|
_el$26 = _el$25.firstChild,
|
|
282
293
|
[_el$27, _co$9] = _$getNextMarker(_el$26.nextSibling),
|
|
283
294
|
_el$28 = _el$27.nextSibling,
|
|
284
|
-
[_el$29, _co$0] = _$getNextMarker(_el$28.nextSibling)
|
|
295
|
+
[_el$29, _co$0] = _$getNextMarker(_el$28.nextSibling),
|
|
296
|
+
_el$30 = _el$29.nextSibling,
|
|
297
|
+
[_el$31, _co$1] = _$getNextMarker(_el$30.nextSibling);
|
|
285
298
|
_$use(element => viewer = element, _el$25);
|
|
286
299
|
_$insert(_el$25, _$createComponent(Show, {
|
|
287
300
|
get when() {
|
|
288
|
-
return _$memo(() => !!(!error() &&
|
|
301
|
+
return _$memo(() => !!(!error() && !viewerFailed()))() && shownDocument();
|
|
302
|
+
},
|
|
303
|
+
children: data => _$createComponent(PdfViewer, {
|
|
304
|
+
get data() {
|
|
305
|
+
return data();
|
|
306
|
+
},
|
|
307
|
+
get title() {
|
|
308
|
+
return props.title ?? pdfMessages().pdfPreview;
|
|
309
|
+
},
|
|
310
|
+
onReady: () => {
|
|
311
|
+
const waiting = document.activeElement === viewer;
|
|
312
|
+
setDrawn(true);
|
|
313
|
+
if (waiting) viewer?.querySelector(".k2b-pdf-viewer__pages")?.focus();
|
|
314
|
+
},
|
|
315
|
+
onError: fallBack
|
|
316
|
+
})
|
|
317
|
+
}), _el$27, _co$9);
|
|
318
|
+
_$insert(_el$25, _$createComponent(Show, {
|
|
319
|
+
get when() {
|
|
320
|
+
return _$memo(() => !!(!error() && viewerFailed() && inlineViewer()))() && url();
|
|
289
321
|
},
|
|
290
322
|
children: currentUrl => (() => {
|
|
291
|
-
var _el$
|
|
292
|
-
_el$
|
|
323
|
+
var _el$32 = _$getNextElement(_tmpl$7);
|
|
324
|
+
_el$32.addEventListener("load", () => {
|
|
293
325
|
const waiting = document.activeElement === viewer;
|
|
294
326
|
setDrawn(true);
|
|
295
327
|
if (waiting) frame?.focus();
|
|
@@ -298,16 +330,16 @@ export default function PdfPreview(props) {
|
|
|
298
330
|
frame = element;
|
|
299
331
|
// A new frame loads its document again, also one that was shown before a failed reload.
|
|
300
332
|
setDrawn(false);
|
|
301
|
-
}, _el$
|
|
333
|
+
}, _el$32);
|
|
302
334
|
_$effect(_p$ => {
|
|
303
335
|
var _v$5 = drawn() ? "" : undefined,
|
|
304
336
|
_v$6 = !drawn(),
|
|
305
337
|
_v$7 = currentUrl(),
|
|
306
338
|
_v$8 = props.title ?? pdfMessages().pdfPreview;
|
|
307
|
-
_v$5 !== _p$.e && _$setAttribute(_el$
|
|
308
|
-
_v$6 !== _p$.t && _$setProperty(_el$
|
|
309
|
-
_v$7 !== _p$.a && _$setAttribute(_el$
|
|
310
|
-
_v$8 !== _p$.o && _$setAttribute(_el$
|
|
339
|
+
_v$5 !== _p$.e && _$setAttribute(_el$32, "data-drawn", _p$.e = _v$5);
|
|
340
|
+
_v$6 !== _p$.t && _$setProperty(_el$32, "inert", _p$.t = _v$6);
|
|
341
|
+
_v$7 !== _p$.a && _$setAttribute(_el$32, "src", _p$.a = _v$7);
|
|
342
|
+
_v$8 !== _p$.o && _$setAttribute(_el$32, "title", _p$.o = _v$8);
|
|
311
343
|
return _p$;
|
|
312
344
|
}, {
|
|
313
345
|
e: undefined,
|
|
@@ -315,9 +347,9 @@ export default function PdfPreview(props) {
|
|
|
315
347
|
a: undefined,
|
|
316
348
|
o: undefined
|
|
317
349
|
});
|
|
318
|
-
return _el$
|
|
350
|
+
return _el$32;
|
|
319
351
|
})()
|
|
320
|
-
}), _el$
|
|
352
|
+
}), _el$29, _co$0);
|
|
321
353
|
_$insert(_el$25, _$createComponent(Show, {
|
|
322
354
|
get when() {
|
|
323
355
|
return error();
|
|
@@ -354,19 +386,19 @@ export default function PdfPreview(props) {
|
|
|
354
386
|
return (
|
|
355
387
|
// One retry at a time: the render action moves here only where the toolbar no longer offers it, and the
|
|
356
388
|
// open action is the retry of a preview that leaves the document to it.
|
|
357
|
-
_$memo(() => !!
|
|
358
|
-
var _el$
|
|
359
|
-
_el$
|
|
360
|
-
_$use(element => errorRetryButton = element, _el$
|
|
361
|
-
_$insert(_el$
|
|
362
|
-
_$effect(() => _$setProperty(_el$
|
|
389
|
+
_$memo(() => !!renderable())() ? undefined : (() => {
|
|
390
|
+
var _el$33 = _$getNextElement(_tmpl$8);
|
|
391
|
+
_el$33.$$click = () => void load();
|
|
392
|
+
_$use(element => errorRetryButton = element, _el$33);
|
|
393
|
+
_$insert(_el$33, () => props.buttonLabel ?? messages().retry);
|
|
394
|
+
_$effect(() => _$setProperty(_el$33, "disabled", opening() || props.disabled?.()));
|
|
363
395
|
_$runHydrationEvents();
|
|
364
|
-
return _el$
|
|
396
|
+
return _el$33;
|
|
365
397
|
})()
|
|
366
398
|
);
|
|
367
399
|
}
|
|
368
400
|
})
|
|
369
|
-
}), _el$
|
|
401
|
+
}), _el$31, _co$1);
|
|
370
402
|
_$effect(() => _$setAttribute(_el$25, "tabindex", status() ? -1 : undefined));
|
|
371
403
|
return _el$25;
|
|
372
404
|
})();
|
|
@@ -389,27 +421,27 @@ export default function PdfPreview(props) {
|
|
|
389
421
|
}
|
|
390
422
|
});
|
|
391
423
|
return (() => {
|
|
392
|
-
var _el$
|
|
393
|
-
_el$
|
|
394
|
-
_el$
|
|
395
|
-
_el$
|
|
396
|
-
[_el$
|
|
397
|
-
_el$
|
|
398
|
-
[_el$
|
|
399
|
-
_$insert(_el$
|
|
424
|
+
var _el$34 = _$getNextElement(_tmpl$0),
|
|
425
|
+
_el$35 = _el$34.firstChild,
|
|
426
|
+
_el$36 = _el$35.firstChild,
|
|
427
|
+
_el$38 = _el$36.nextSibling,
|
|
428
|
+
[_el$39, _co$10] = _$getNextMarker(_el$38.nextSibling),
|
|
429
|
+
_el$40 = _el$35.nextSibling,
|
|
430
|
+
[_el$41, _co$11] = _$getNextMarker(_el$40.nextSibling);
|
|
431
|
+
_$insert(_el$36, _$createComponent(Show, {
|
|
400
432
|
get when() {
|
|
401
433
|
return props.title;
|
|
402
434
|
},
|
|
403
435
|
get children() {
|
|
404
|
-
var _el$
|
|
405
|
-
_$insert(_el$
|
|
406
|
-
return _el$
|
|
436
|
+
var _el$37 = _$getNextElement(_tmpl$9);
|
|
437
|
+
_$insert(_el$37, () => props.title);
|
|
438
|
+
return _el$37;
|
|
407
439
|
}
|
|
408
440
|
}));
|
|
409
|
-
_$insert(_el$
|
|
410
|
-
_$insert(_el$
|
|
411
|
-
_$effect(() => _$className(_el$
|
|
412
|
-
return _el$
|
|
441
|
+
_$insert(_el$35, actions, _el$39, _co$10);
|
|
442
|
+
_$insert(_el$34, content, _el$41, _co$11);
|
|
443
|
+
_$effect(() => _$className(_el$34, `k2b-content-pdf-preview ${props.class ?? ""}`));
|
|
444
|
+
return _el$34;
|
|
413
445
|
})();
|
|
414
446
|
}
|
|
415
447
|
_$delegateEvents(["click"]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/PdfPreview.tsx"],"sourcesContent":["import { createSignal, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { announce } from \"../feedback/announce\";\nimport { useUiMessages } from \"../intl/messages\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport { resolvePdfMessages, usePdfMessages } from \"./pdf-messages\";\n\nexport type PdfPreviewRequest = () => Promise<Response | Blob>;\n\nexport type PdfPreviewProps = {\n request: PdfPreviewRequest;\n autoLoad?: boolean;\n disabled?: () => boolean;\n title?: string;\n buttonLabel?: string;\n openButtonLabel?: string;\n /**\n * Opens the document at this address in a new tab instead of a local copy. Pass a stable same-origin URL that\n * serves the PDF inline, so reloading and the viewer's file name keep working. Without it, the open action shows\n * a temporary copy of the requested document.\n */\n openHref?: string;\n /** Adds a Download action. The host owns the download, for example a fresh attachment URL. */\n onDownload?: () => void;\n emptyText?: string;\n class?: string;\n children?: (parts: { actions: JSX.Element; content: JSX.Element }) => JSX.Element;\n renderError?: (message: string) => JSX.Element;\n};\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n try {\n const data = (await response.json()) as unknown;\n if (data && typeof data === \"object\" && \"message\" in data && typeof data.message === \"string\") return data.message;\n } catch {\n // Fall through to the HTTP status fallback.\n }\n return resolvePdfMessages().pdfPreviewHttpError({ status: response.status });\n};\n\nexport default function PdfPreview(props: PdfPreviewProps) {\n const messages = useUiMessages();\n const pdfMessages = usePdfMessages();\n const [url, setUrl] = createSignal<string | null>(null);\n // An automatic preview starts loading once mounted. The server and the page before hydration already show that\n // state, so they offer neither a retry nor an invitation to render while nothing has failed.\n const [loading, setLoading] = createSignal(Boolean(props.autoLoad) && !props.disabled?.());\n const [opening, setOpening] = createSignal(false);\n const [error, setError] = createSignal<string | null>(null);\n const [failed, setFailed] = createSignal(false);\n const [tabBlocked, setTabBlocked] = createSignal(false);\n // The frame has its document only once it fires `load`; until then the loading state covers it.\n const [drawn, setDrawn] = createSignal(false);\n // An automatic preview shows one fixed document; the open action reuses it instead of requesting it again.\n let shownBlob: Blob | null = null;\n let openButton: HTMLElement | undefined;\n let frame: HTMLIFrameElement | undefined;\n let viewer: HTMLDivElement | undefined;\n let renderButton: HTMLButtonElement | undefined;\n let errorRetryButton: HTMLButtonElement | undefined;\n let disposed = false;\n let loadGeneration = 0;\n let openGeneration = 0;\n\n // Without an inline PDF viewer (`navigator.pdfViewerEnabled === false`, as in Chrome on Android) a frame stays empty\n // or downloads the file, so the viewer explains that instead and leaves the document to the open and download actions.\n const inlineViewer = () => typeof navigator === \"undefined\" || navigator.pdfViewerEnabled !== false;\n // There an automatic preview could show only that hint, so it requests nothing: the open action fetches the document\n // when someone asks for it, and is also the retry after it fails. An on-demand preview still renders, because its\n // request also checks the caller's input.\n const openOnly = () => Boolean(props.autoLoad) && !inlineViewer();\n\n const revokeCurrent = () => {\n const current = url();\n if (current) URL.revokeObjectURL(current);\n setUrl(null);\n };\n\n onCleanup(() => {\n disposed = true;\n loadGeneration += 1;\n openGeneration += 1;\n revokeCurrent();\n });\n\n const readPdfBlob = async () => {\n const response = await props.request();\n const blob = response instanceof Response ? (response.ok ? await response.blob() : null) : response;\n if (!blob) throw new Error(await readErrorMessage(response as Response));\n if (blob.type && blob.type !== \"application/pdf\") throw new Error(`PDF preview returned ${blob.type} instead of application/pdf`);\n return blob;\n };\n\n const load = async () => {\n if (loading() || opening() || props.disabled?.()) return;\n const generation = ++loadGeneration;\n // A retry the shown document or the loading state removes hands keyboard focus on instead of dropping it.\n const retryFocused =\n (props.autoLoad && document.activeElement === renderButton) ||\n (errorRetryButton?.isConnected && document.activeElement === errorRetryButton);\n setLoading(true);\n setError(null);\n try {\n const blob = await readPdfBlob();\n const nextUrl = URL.createObjectURL(blob);\n if (disposed || generation !== loadGeneration) {\n URL.revokeObjectURL(nextUrl);\n return;\n }\n const previousUrl = url();\n shownBlob = blob;\n setFailed(false);\n setDrawn(false);\n setUrl(nextUrl);\n setLoading(false);\n if (previousUrl) URL.revokeObjectURL(previousUrl);\n // The loading status turns into the missing-viewer hint in place and stops being a live region, so say it here.\n if (!inlineViewer()) {\n announce(pdfMessages().pdfPreviewNoViewer);\n announce(pdfMessages().pdfPreviewNoViewerDescription);\n }\n // The shown document removes the retry action; keep keyboard focus in the actions instead of the page, or, when\n // the host shows only the content, in the viewer, which hands it on to the document once the frame has loaded it.\n if (retryFocused && document.activeElement === document.body) (openButton?.isConnected ? openButton : viewer)?.focus();\n } catch (e) {\n if (disposed || generation !== loadGeneration) return;\n shownBlob = null;\n setFailed(true);\n setError(e instanceof Error ? e.message : \"PDF preview failed\");\n if (retryFocused && document.activeElement === document.body) errorRetryButton?.focus();\n } finally {\n if (!disposed && generation === loadGeneration) setLoading(false);\n }\n };\n\n onMount(() => {\n // Hand the initial loading state to the request itself, which also covers a preview disabled by now or one that\n // leaves the document to the open action.\n setLoading(false);\n if (props.autoLoad && !openOnly()) void load();\n });\n\n const openInNewTab = async () => {\n if (loading() || opening() || props.disabled?.()) return;\n const generation = ++openGeneration;\n const tab = window.open(\"\", \"_blank\");\n // A blocked tab is not a document error: keep the shown document and report it beside the actions.\n setTabBlocked(!tab);\n if (!tab) return;\n tab.opener = null;\n tab.document.title = props.title ?? pdfMessages().pdfPreview;\n tab.document.body.textContent = pdfMessages().pdfPreviewRendering;\n setOpening(true);\n setError(null);\n try {\n const blob = (props.autoLoad ? shownBlob : null) ?? (await readPdfBlob());\n if (disposed || generation !== openGeneration) {\n tab.close();\n return;\n }\n const objectUrl = URL.createObjectURL(blob);\n tab.location.href = objectUrl;\n window.setTimeout(() => URL.revokeObjectURL(objectUrl), 60_000);\n } catch (e) {\n tab.close();\n if (!disposed && generation === openGeneration) setError(e instanceof Error ? e.message : \"PDF preview failed\");\n } finally {\n if (!disposed && generation === openGeneration) setOpening(false);\n }\n };\n\n // With autoLoad, rendering again would show the same document: offer it only until one is shown. After a failure the\n // default error state carries it as the retry; beside a caller's error content it stays in place while a retry loads.\n const renderable = () => !openOnly() && (!props.autoLoad || (failed() ? Boolean(props.renderError) : !url() && !loading()));\n const actions = () => (\n <div class=\"k2b-content-pdf-preview__actions\">\n <Show\n when={!props.disabled?.() && props.openHref}\n fallback={\n <button\n ref={(element) => (openButton = element)}\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => void openInNewTab()}\n disabled={loading() || opening() || props.disabled?.()}\n >\n <i class={opening() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-external-link\"} aria-hidden=\"true\" />\n {props.openButtonLabel ?? pdfMessages().openPreview}\n </button>\n }\n >\n {(href) => (\n // A plain link to a real address: the browser opens it on the user's own click, and the tab can reload it.\n <a\n ref={(element) => (openButton = element)}\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n href={href()}\n target=\"_blank\"\n rel=\"noopener\"\n >\n <i class=\"ti ti-external-link\" aria-hidden=\"true\" />\n {props.openButtonLabel ?? pdfMessages().openPreview}\n </a>\n )}\n </Show>\n <Show when={props.onDownload}>\n <button\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => props.onDownload?.()}\n disabled={props.disabled?.()}\n >\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </button>\n </Show>\n <Show when={renderable()}>\n <button\n ref={renderButton}\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => void load()}\n disabled={loading() || opening() || props.disabled?.()}\n >\n <i class={loading() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-file-type-pdf\"} aria-hidden=\"true\" />\n {props.buttonLabel ?? pdfMessages().previewPdf}\n </button>\n </Show>\n <Show when={tabBlocked()}>\n <span role=\"alert\" class=\"k2b-content-pdf-preview__notice\">\n {pdfMessages().pdfPreviewTabBlocked}\n </span>\n </Show>\n </div>\n );\n // Every state uses one placeholder in the viewer's box, so loading changes no layout: idle and loading before a\n // document arrives, loading over the frame until it has loaded the document, and the hint where no frame can.\n const status = () => {\n if (error()) return null;\n if (!inlineViewer() && (url() || (openOnly() && !loading()))) return \"no-viewer\";\n if (!url()) return loading() ? \"loading\" : \"idle\";\n return drawn() ? null : \"loading\";\n };\n const viewerBox = () => (\n // While it shows a placeholder, the viewer itself holds keyboard focus that has nowhere else to go.\n <div ref={(element) => (viewer = element)} class=\"k2b-content-pdf-preview__viewer\" tabIndex={status() ? -1 : undefined}>\n <Show when={!error() && inlineViewer() && url()}>\n {(currentUrl) => (\n <iframe\n ref={(element) => {\n frame = element;\n // A new frame loads its document again, also one that was shown before a failed reload.\n setDrawn(false);\n }}\n class=\"k2b-content-pdf-preview__frame\"\n data-drawn={drawn() ? \"\" : undefined}\n // Out of reach while the loading state covers it, so keyboard focus never lands on an invisible frame.\n inert={!drawn()}\n src={currentUrl()}\n title={props.title ?? pdfMessages().pdfPreview}\n onLoad={() => {\n const waiting = document.activeElement === viewer;\n setDrawn(true);\n if (waiting) frame?.focus();\n }}\n />\n )}\n </Show>\n <Show\n when={error()}\n fallback={\n <Show when={status()}>\n {(state) => (\n <Placeholder\n class=\"k2b-content-pdf-preview__placeholder\"\n state={state() === \"loading\" ? \"loading\" : \"empty\"}\n icon={state() === \"loading\" ? undefined : \"ti ti-file-type-pdf\"}\n title={state() === \"loading\" ? messages().loading : state() === \"no-viewer\" ? pdfMessages().pdfPreviewNoViewer : undefined}\n description={\n state() === \"idle\"\n ? (props.emptyText ?? pdfMessages().renderPdfPreview)\n : state() === \"no-viewer\"\n ? pdfMessages().pdfPreviewNoViewerDescription\n : undefined\n }\n />\n )}\n </Show>\n }\n >\n {(message) => (\n <Placeholder\n class=\"k2b-content-pdf-preview__placeholder\"\n state=\"error\"\n description={message()}\n action={\n // One retry at a time: the render action moves here only where the toolbar no longer offers it, and the\n // open action is the retry of a preview that leaves the document to it.\n renderable() || openOnly() ? undefined : (\n <button\n ref={(element) => (errorRetryButton = element)}\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => void load()}\n disabled={opening() || props.disabled?.()}\n >\n {props.buttonLabel ?? messages().retry}\n </button>\n )\n }\n />\n )}\n </Show>\n </div>\n );\n // A caller's error content replaces the whole viewer, as it brings its own layout.\n const content = () => (\n <Show when={props.renderError ? error() : null} fallback={viewerBox()}>\n {(message) => props.renderError?.(message())}\n </Show>\n );\n\n if (props.children)\n return props.children({\n get actions() {\n return actions();\n },\n get content() {\n return content();\n },\n });\n return (\n <section class={`k2b-content-pdf-preview ${props.class ?? \"\"}`}>\n <div class=\"k2b-content-pdf-preview__toolbar\">\n <div class=\"k2b-content-pdf-preview__heading\">\n <Show when={props.title}>\n <h2 class=\"k2b-content-pdf-preview__title\">{props.title}</h2>\n </Show>\n </div>\n {actions()}\n </div>\n {content()}\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/PdfPreview.tsx"],"sourcesContent":["import { createSignal, type JSX, lazy, onCleanup, onMount, Show } from \"solid-js\";\nimport { announce } from \"../feedback/announce\";\nimport { useUiMessages } from \"../intl/messages\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport { resolvePdfMessages, usePdfMessages } from \"./pdf-messages\";\n\nexport type PdfPreviewRequest = () => Promise<Response | Blob>;\n\nexport type PdfPreviewProps = {\n request: PdfPreviewRequest;\n autoLoad?: boolean;\n disabled?: () => boolean;\n title?: string;\n buttonLabel?: string;\n openButtonLabel?: string;\n /**\n * Opens the document at this address in a new tab instead of a local copy. Pass a stable same-origin URL that\n * serves the PDF inline, so reloading and the viewer's file name keep working. Without it, the open action shows\n * a temporary copy of the requested document.\n */\n openHref?: string;\n /** Adds a Download action. The host owns the download, for example a fresh attachment URL. */\n onDownload?: () => void;\n emptyText?: string;\n class?: string;\n children?: (parts: { actions: JSX.Element; content: JSX.Element }) => JSX.Element;\n renderError?: (message: string) => JSX.Element;\n};\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n try {\n const data = (await response.json()) as unknown;\n if (data && typeof data === \"object\" && \"message\" in data && typeof data.message === \"string\") return data.message;\n } catch {\n // Fall through to the HTTP status fallback.\n }\n return resolvePdfMessages().pdfPreviewHttpError({ status: response.status });\n};\n\n// The viewer and pdf.js load only once a document is shown, so a page that never shows one carries neither.\nconst PdfViewer = lazy(() => import(\"./PdfViewer\"));\n\nexport default function PdfPreview(props: PdfPreviewProps) {\n const messages = useUiMessages();\n const pdfMessages = usePdfMessages();\n const [url, setUrl] = createSignal<string | null>(null);\n // An automatic preview starts loading once mounted. The server and the page before hydration already show that\n // state, so they offer neither a retry nor an invitation to render while nothing has failed.\n const [loading, setLoading] = createSignal(Boolean(props.autoLoad) && !props.disabled?.());\n const [opening, setOpening] = createSignal(false);\n const [error, setError] = createSignal<string | null>(null);\n const [failed, setFailed] = createSignal(false);\n const [tabBlocked, setTabBlocked] = createSignal(false);\n // The viewer has its document only once it drew the first page (or the fallback frame fired `load`); until then the\n // loading state covers it.\n const [drawn, setDrawn] = createSignal(false);\n // The document pdf.js draws. When pdf.js cannot open or draw it, the browser's own viewer shows it in a frame.\n const [shownDocument, setShownDocument] = createSignal<Blob | null>(null);\n const [viewerFailed, setViewerFailed] = createSignal(false);\n // An automatic preview shows one fixed document; the open action reuses it instead of requesting it again.\n let shownBlob: Blob | null = null;\n let openButton: HTMLElement | undefined;\n let frame: HTMLIFrameElement | undefined;\n let viewer: HTMLDivElement | undefined;\n let renderButton: HTMLButtonElement | undefined;\n let errorRetryButton: HTMLButtonElement | undefined;\n let disposed = false;\n let loadGeneration = 0;\n let openGeneration = 0;\n\n // pdf.js draws the document in every browser. Only when it fails does the browser's own viewer take over; without one\n // (`navigator.pdfViewerEnabled === false`, as in Chrome on Android) a frame stays empty or downloads the file, so the\n // viewer explains that instead and leaves the document to the open and download actions.\n const inlineViewer = () => typeof navigator === \"undefined\" || navigator.pdfViewerEnabled !== false;\n\n const revokeCurrent = () => {\n const current = url();\n if (current) URL.revokeObjectURL(current);\n setUrl(null);\n };\n\n onCleanup(() => {\n disposed = true;\n loadGeneration += 1;\n openGeneration += 1;\n revokeCurrent();\n });\n\n const readPdfBlob = async () => {\n const response = await props.request();\n const blob = response instanceof Response ? (response.ok ? await response.blob() : null) : response;\n if (!blob) throw new Error(await readErrorMessage(response as Response));\n if (blob.type && blob.type !== \"application/pdf\") throw new Error(`PDF preview returned ${blob.type} instead of application/pdf`);\n return blob;\n };\n\n const load = async () => {\n if (loading() || opening() || props.disabled?.()) return;\n const generation = ++loadGeneration;\n // A retry the shown document or the loading state removes hands keyboard focus on instead of dropping it.\n const retryFocused =\n (props.autoLoad && document.activeElement === renderButton) ||\n (errorRetryButton?.isConnected && document.activeElement === errorRetryButton);\n setLoading(true);\n setError(null);\n try {\n const blob = await readPdfBlob();\n const nextUrl = URL.createObjectURL(blob);\n if (disposed || generation !== loadGeneration) {\n URL.revokeObjectURL(nextUrl);\n return;\n }\n const previousUrl = url();\n shownBlob = blob;\n setFailed(false);\n setDrawn(false);\n setViewerFailed(false);\n setShownDocument(blob);\n setUrl(nextUrl);\n setLoading(false);\n if (previousUrl) URL.revokeObjectURL(previousUrl);\n // The shown document removes the retry action; keep keyboard focus in the actions instead of the page, or, when\n // the host shows only the content, in the viewer, which hands it on to the document once the frame has loaded it.\n if (retryFocused && document.activeElement === document.body) (openButton?.isConnected ? openButton : viewer)?.focus();\n } catch (e) {\n if (disposed || generation !== loadGeneration) return;\n shownBlob = null;\n setFailed(true);\n setError(e instanceof Error ? e.message : \"PDF preview failed\");\n if (retryFocused && document.activeElement === document.body) errorRetryButton?.focus();\n } finally {\n if (!disposed && generation === loadGeneration) setLoading(false);\n }\n };\n\n onMount(() => {\n // Hand the initial loading state to the request itself, which also covers a preview disabled by now or one that\n // leaves the document to the open action.\n setLoading(false);\n if (props.autoLoad) void load();\n });\n\n const openInNewTab = async () => {\n if (loading() || opening() || props.disabled?.()) return;\n const generation = ++openGeneration;\n const tab = window.open(\"\", \"_blank\");\n // A blocked tab is not a document error: keep the shown document and report it beside the actions.\n setTabBlocked(!tab);\n if (!tab) return;\n tab.opener = null;\n tab.document.title = props.title ?? pdfMessages().pdfPreview;\n tab.document.body.textContent = pdfMessages().pdfPreviewRendering;\n setOpening(true);\n setError(null);\n try {\n const blob = (props.autoLoad ? shownBlob : null) ?? (await readPdfBlob());\n if (disposed || generation !== openGeneration) {\n tab.close();\n return;\n }\n const objectUrl = URL.createObjectURL(blob);\n tab.location.href = objectUrl;\n window.setTimeout(() => URL.revokeObjectURL(objectUrl), 60_000);\n } catch (e) {\n tab.close();\n if (!disposed && generation === openGeneration) setError(e instanceof Error ? e.message : \"PDF preview failed\");\n } finally {\n if (!disposed && generation === openGeneration) setOpening(false);\n }\n };\n\n // With autoLoad, rendering again would show the same document: offer it only until one is shown. After a failure the\n // default error state carries it as the retry; beside a caller's error content it stays in place while a retry loads.\n const renderable = () => !props.autoLoad || (failed() ? Boolean(props.renderError) : !url() && !loading());\n const actions = () => (\n <div class=\"k2b-content-pdf-preview__actions\">\n <Show\n when={!props.disabled?.() && props.openHref}\n fallback={\n <button\n ref={(element) => (openButton = element)}\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => void openInNewTab()}\n disabled={loading() || opening() || props.disabled?.()}\n >\n <i class={opening() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-external-link\"} aria-hidden=\"true\" />\n {props.openButtonLabel ?? pdfMessages().openPreview}\n </button>\n }\n >\n {(href) => (\n // A plain link to a real address: the browser opens it on the user's own click, and the tab can reload it.\n <a\n ref={(element) => (openButton = element)}\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n href={href()}\n target=\"_blank\"\n rel=\"noopener\"\n >\n <i class=\"ti ti-external-link\" aria-hidden=\"true\" />\n {props.openButtonLabel ?? pdfMessages().openPreview}\n </a>\n )}\n </Show>\n <Show when={props.onDownload}>\n <button\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => props.onDownload?.()}\n disabled={props.disabled?.()}\n >\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </button>\n </Show>\n <Show when={renderable()}>\n <button\n ref={renderButton}\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => void load()}\n disabled={loading() || opening() || props.disabled?.()}\n >\n <i class={loading() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-file-type-pdf\"} aria-hidden=\"true\" />\n {props.buttonLabel ?? pdfMessages().previewPdf}\n </button>\n </Show>\n <Show when={tabBlocked()}>\n <span role=\"alert\" class=\"k2b-content-pdf-preview__notice\">\n {pdfMessages().pdfPreviewTabBlocked}\n </span>\n </Show>\n </div>\n );\n // Every state uses one placeholder in the viewer's box, so loading changes no layout: idle and loading before a\n // document arrives, loading over the viewer until it has drawn the document, and the hint where nothing can draw it.\n const status = () => {\n if (error()) return null;\n if (viewerFailed() && !inlineViewer() && url()) return \"no-viewer\";\n if (!url()) return loading() ? \"loading\" : \"idle\";\n return drawn() ? null : \"loading\";\n };\n // pdf.js could not draw the document: the browser's viewer takes over, or, without one, the hint explains it. The\n // loading status turns into that hint in place and stops being a live region, so say it here.\n const fallBack = () => {\n setDrawn(false);\n setViewerFailed(true);\n if (!inlineViewer()) {\n announce(pdfMessages().pdfPreviewNoViewer);\n announce(pdfMessages().pdfPreviewNoViewerDescription);\n }\n };\n const viewerBox = () => (\n // While it shows a placeholder, the viewer itself holds keyboard focus that has nowhere else to go.\n <div ref={(element) => (viewer = element)} class=\"k2b-content-pdf-preview__viewer\" tabIndex={status() ? -1 : undefined}>\n <Show when={!error() && !viewerFailed() && shownDocument()}>\n {(data) => (\n <PdfViewer\n data={data()}\n title={props.title ?? pdfMessages().pdfPreview}\n onReady={() => {\n const waiting = document.activeElement === viewer;\n setDrawn(true);\n if (waiting) viewer?.querySelector<HTMLElement>(\".k2b-pdf-viewer__pages\")?.focus();\n }}\n onError={fallBack}\n />\n )}\n </Show>\n <Show when={!error() && viewerFailed() && inlineViewer() && url()}>\n {(currentUrl) => (\n <iframe\n ref={(element) => {\n frame = element;\n // A new frame loads its document again, also one that was shown before a failed reload.\n setDrawn(false);\n }}\n class=\"k2b-content-pdf-preview__frame\"\n data-drawn={drawn() ? \"\" : undefined}\n // Out of reach while the loading state covers it, so keyboard focus never lands on an invisible frame.\n inert={!drawn()}\n src={currentUrl()}\n title={props.title ?? pdfMessages().pdfPreview}\n onLoad={() => {\n const waiting = document.activeElement === viewer;\n setDrawn(true);\n if (waiting) frame?.focus();\n }}\n />\n )}\n </Show>\n <Show\n when={error()}\n fallback={\n <Show when={status()}>\n {(state) => (\n <Placeholder\n class=\"k2b-content-pdf-preview__placeholder\"\n state={state() === \"loading\" ? \"loading\" : \"empty\"}\n icon={state() === \"loading\" ? undefined : \"ti ti-file-type-pdf\"}\n title={state() === \"loading\" ? messages().loading : state() === \"no-viewer\" ? pdfMessages().pdfPreviewNoViewer : undefined}\n description={\n state() === \"idle\"\n ? (props.emptyText ?? pdfMessages().renderPdfPreview)\n : state() === \"no-viewer\"\n ? pdfMessages().pdfPreviewNoViewerDescription\n : undefined\n }\n />\n )}\n </Show>\n }\n >\n {(message) => (\n <Placeholder\n class=\"k2b-content-pdf-preview__placeholder\"\n state=\"error\"\n description={message()}\n action={\n // One retry at a time: the render action moves here only where the toolbar no longer offers it, and the\n // open action is the retry of a preview that leaves the document to it.\n renderable() ? undefined : (\n <button\n ref={(element) => (errorRetryButton = element)}\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => void load()}\n disabled={opening() || props.disabled?.()}\n >\n {props.buttonLabel ?? messages().retry}\n </button>\n )\n }\n />\n )}\n </Show>\n </div>\n );\n // A caller's error content replaces the whole viewer, as it brings its own layout.\n const content = () => (\n <Show when={props.renderError ? error() : null} fallback={viewerBox()}>\n {(message) => props.renderError?.(message())}\n </Show>\n );\n\n if (props.children)\n return props.children({\n get actions() {\n return actions();\n },\n get content() {\n return content();\n },\n });\n return (\n <section class={`k2b-content-pdf-preview ${props.class ?? \"\"}`}>\n <div class=\"k2b-content-pdf-preview__toolbar\">\n <div class=\"k2b-content-pdf-preview__heading\">\n <Show when={props.title}>\n <h2 class=\"k2b-content-pdf-preview__title\">{props.title}</h2>\n </Show>\n </div>\n {actions()}\n </div>\n {content()}\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|