@mailwoman/react 9.4.0 → 10.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -16
- package/fonts.css +97 -22
- package/lib/common/About.tsx +87 -71
- package/lib/common/ClientOnly.tsx +2 -14
- package/lib/common/CopyButton.tsx +3 -1
- package/lib/common/LoadingIndicator.tsx +4 -2
- package/lib/common/PresetChips.tsx +9 -8
- package/lib/common/confidence-tiers.ts +7 -6
- package/lib/common/cx.ts +3 -1
- package/lib/common/text-tokens.ts +7 -4
- package/lib/common/useBuildInfo.ts +54 -0
- package/lib/common/useClipboard.ts +2 -11
- package/lib/common.ts +22 -0
- package/lib/index.ts +27 -112
- package/lib/map/AppIdentity.tsx +85 -0
- package/lib/map/BackendControl.tsx +16 -13
- package/lib/map/CompareToggle.tsx +11 -33
- package/lib/map/DebugInfo.tsx +88 -0
- package/lib/map/Geocoder.tsx +92 -58
- package/lib/map/GeocoderControls.tsx +582 -127
- package/lib/map/GraticuleLayer.tsx +54 -0
- package/lib/map/MapCanvas.tsx +23 -12
- package/lib/map/MapChipRow.tsx +73 -0
- package/lib/map/MapCompass.tsx +68 -0
- package/lib/map/MapControlStack.tsx +97 -0
- package/lib/map/MapFooter.tsx +101 -0
- package/lib/map/MapProgressBar.tsx +55 -0
- package/lib/map/MapSearchBar.tsx +82 -0
- package/lib/map/MapSheet.tsx +71 -0
- package/lib/map/OverlayLayers.tsx +1 -1
- package/lib/map/PlaceAutocomplete.tsx +10 -21
- package/lib/map/PlaceMarker.tsx +4 -2
- package/lib/map/ResolvedPlaceLayers.tsx +5 -14
- package/lib/map/ResultCamera.tsx +8 -31
- package/lib/map/ResultOverlay.tsx +2 -12
- package/lib/map/ResultPanel.tsx +1 -20
- package/lib/map/VersionPicker.tsx +10 -19
- package/lib/map/fake-runtime.ts +10 -12
- package/lib/map/geometry.ts +14 -47
- package/lib/map/graticule.ts +80 -0
- package/lib/map/map-debug.ts +1 -1
- package/lib/map/place-render.ts +28 -60
- package/lib/map/types.ts +65 -97
- package/lib/map/useCompareState.ts +5 -4
- package/lib/map/useGeocode.ts +7 -5
- package/lib/map/useMapBearing.ts +56 -0
- package/lib/map/useMapLabelPick.ts +114 -0
- package/lib/map/useMapPlaceRender.ts +2 -6
- package/lib/map/usePlaceAutocomplete.ts +44 -50
- package/lib/map.ts +95 -0
- package/lib/pipeline/CandidatePicker.tsx +13 -5
- package/lib/pipeline/ConfidenceCell.tsx +1 -1
- package/lib/pipeline/FailureDiagnostic.tsx +8 -2
- package/lib/pipeline/QueryForm.tsx +5 -2
- package/lib/pipeline/ResolvedPlace.tsx +1 -1
- package/lib/pipeline/SpanHighlight.tsx +7 -5
- package/lib/pipeline/TimingPanel.tsx +1 -1
- package/lib/pipeline/TreeView.tsx +1 -1
- package/lib/pipeline/copy.ts +22 -25
- package/lib/pipeline/presets.ts +15 -13
- package/lib/pipeline/types.ts +21 -14
- package/lib/pipeline/useParsePipeline.ts +38 -24
- package/lib/pipeline.ts +36 -0
- package/lib/poi/AbstainPanel.tsx +1 -1
- package/lib/poi/LiveResultsBlock.tsx +2 -1
- package/lib/poi/POIExplorer.tsx +24 -15
- package/lib/poi/QueryInput.tsx +1 -1
- package/lib/poi/SubjectPanel.tsx +4 -3
- package/lib/poi/runtime.ts +5 -16
- package/lib/poi/types.ts +39 -27
- package/lib/poi/usePOISearch.ts +39 -44
- package/lib/poi.ts +39 -0
- package/lib/runtime/useReleaseRuntime.ts +125 -74
- package/lib/runtime.ts +16 -0
- package/lib/search/SearchModal.tsx +317 -0
- package/lib/search/search.css +144 -0
- package/lib/search/types.ts +67 -0
- package/lib/search.ts +11 -0
- package/out/common/About.d.ts +13 -4
- package/out/common/About.d.ts.map +1 -1
- package/out/common/About.js +5 -2
- package/out/common/About.js.map +1 -1
- package/out/common/ClientOnly.d.ts +2 -11
- package/out/common/ClientOnly.d.ts.map +1 -1
- package/out/common/ClientOnly.js +1 -13
- package/out/common/ClientOnly.js.map +1 -1
- package/out/common/CopyButton.d.ts +3 -1
- package/out/common/CopyButton.d.ts.map +1 -1
- package/out/common/CopyButton.js.map +1 -1
- package/out/common/LoadingIndicator.d.ts +4 -2
- package/out/common/LoadingIndicator.d.ts.map +1 -1
- package/out/common/LoadingIndicator.js.map +1 -1
- package/out/common/PresetChips.d.ts +9 -8
- package/out/common/PresetChips.d.ts.map +1 -1
- package/out/common/PresetChips.js.map +1 -1
- package/out/common/confidence-tiers.d.ts +7 -6
- package/out/common/confidence-tiers.d.ts.map +1 -1
- package/out/common/confidence-tiers.js +7 -6
- package/out/common/confidence-tiers.js.map +1 -1
- package/out/common/cx.d.ts +3 -1
- package/out/common/cx.d.ts.map +1 -1
- package/out/common/cx.js +3 -1
- package/out/common/cx.js.map +1 -1
- package/out/common/text-tokens.d.ts +4 -3
- package/out/common/text-tokens.d.ts.map +1 -1
- package/out/common/text-tokens.js +6 -3
- package/out/common/text-tokens.js.map +1 -1
- package/out/common/useBuildInfo.d.ts +27 -0
- package/out/common/useBuildInfo.d.ts.map +1 -0
- package/out/common/useBuildInfo.js +32 -0
- package/out/common/useBuildInfo.js.map +1 -0
- package/out/common/useClipboard.d.ts +1 -3
- package/out/common/useClipboard.d.ts.map +1 -1
- package/out/common/useClipboard.js +2 -11
- package/out/common/useClipboard.js.map +1 -1
- package/out/common.d.ts +22 -0
- package/out/common.d.ts.map +1 -0
- package/out/common.js +15 -0
- package/out/common.js.map +1 -0
- package/out/index.d.ts +26 -71
- package/out/index.d.ts.map +1 -1
- package/out/index.js +21 -47
- package/out/index.js.map +1 -1
- package/out/map/AppIdentity.d.ts +42 -0
- package/out/map/AppIdentity.d.ts.map +1 -0
- package/out/map/AppIdentity.js +16 -0
- package/out/map/AppIdentity.js.map +1 -0
- package/out/map/BackendControl.d.ts +9 -10
- package/out/map/BackendControl.d.ts.map +1 -1
- package/out/map/BackendControl.js +2 -2
- package/out/map/BackendControl.js.map +1 -1
- package/out/map/CompareToggle.d.ts +8 -31
- package/out/map/CompareToggle.d.ts.map +1 -1
- package/out/map/CompareToggle.js +5 -2
- package/out/map/CompareToggle.js.map +1 -1
- package/out/map/DebugInfo.d.ts +34 -0
- package/out/map/DebugInfo.d.ts.map +1 -0
- package/out/map/DebugInfo.js +39 -0
- package/out/map/DebugInfo.js.map +1 -0
- package/out/map/Geocoder.d.ts +47 -26
- package/out/map/Geocoder.d.ts.map +1 -1
- package/out/map/Geocoder.js +34 -50
- package/out/map/Geocoder.js.map +1 -1
- package/out/map/GeocoderControls.d.ts +23 -33
- package/out/map/GeocoderControls.d.ts.map +1 -1
- package/out/map/GeocoderControls.js +277 -16
- package/out/map/GeocoderControls.js.map +1 -1
- package/out/map/GraticuleLayer.d.ts +28 -0
- package/out/map/GraticuleLayer.d.ts.map +1 -0
- package/out/map/GraticuleLayer.js +25 -0
- package/out/map/GraticuleLayer.js.map +1 -0
- package/out/map/MapCanvas.d.ts +23 -12
- package/out/map/MapCanvas.d.ts.map +1 -1
- package/out/map/MapCanvas.js +5 -2
- package/out/map/MapCanvas.js.map +1 -1
- package/out/map/MapChipRow.d.ts +43 -0
- package/out/map/MapChipRow.d.ts.map +1 -0
- package/out/map/MapChipRow.js +12 -0
- package/out/map/MapChipRow.js.map +1 -0
- package/out/map/MapCompass.d.ts +33 -0
- package/out/map/MapCompass.d.ts.map +1 -0
- package/out/map/MapCompass.js +15 -0
- package/out/map/MapCompass.js.map +1 -0
- package/out/map/MapControlStack.d.ts +56 -0
- package/out/map/MapControlStack.d.ts.map +1 -0
- package/out/map/MapControlStack.js +18 -0
- package/out/map/MapControlStack.js.map +1 -0
- package/out/map/MapFooter.d.ts +27 -0
- package/out/map/MapFooter.d.ts.map +1 -0
- package/out/map/MapFooter.js +37 -0
- package/out/map/MapFooter.js.map +1 -0
- package/out/map/MapProgressBar.d.ts +31 -0
- package/out/map/MapProgressBar.d.ts.map +1 -0
- package/out/map/MapProgressBar.js +8 -0
- package/out/map/MapProgressBar.js.map +1 -0
- package/out/map/MapSearchBar.d.ts +48 -0
- package/out/map/MapSearchBar.d.ts.map +1 -0
- package/out/map/MapSearchBar.js +12 -0
- package/out/map/MapSearchBar.js.map +1 -0
- package/out/map/MapSheet.d.ts +35 -0
- package/out/map/MapSheet.d.ts.map +1 -0
- package/out/map/MapSheet.js +29 -0
- package/out/map/MapSheet.js.map +1 -0
- package/out/map/OverlayLayers.d.ts +1 -1
- package/out/map/OverlayLayers.js +2 -2
- package/out/map/PlaceAutocomplete.d.ts +10 -21
- package/out/map/PlaceAutocomplete.d.ts.map +1 -1
- package/out/map/PlaceAutocomplete.js +2 -1
- package/out/map/PlaceAutocomplete.js.map +1 -1
- package/out/map/PlaceMarker.d.ts +4 -2
- package/out/map/PlaceMarker.d.ts.map +1 -1
- package/out/map/PlaceMarker.js +3 -1
- package/out/map/PlaceMarker.js.map +1 -1
- package/out/map/ResolvedPlaceLayers.d.ts +5 -14
- package/out/map/ResolvedPlaceLayers.d.ts.map +1 -1
- package/out/map/ResolvedPlaceLayers.js +2 -2
- package/out/map/ResolvedPlaceLayers.js.map +1 -1
- package/out/map/ResultCamera.d.ts +8 -31
- package/out/map/ResultCamera.d.ts.map +1 -1
- package/out/map/ResultCamera.js +3 -28
- package/out/map/ResultCamera.js.map +1 -1
- package/out/map/ResultOverlay.d.ts +2 -12
- package/out/map/ResultOverlay.d.ts.map +1 -1
- package/out/map/ResultOverlay.js +1 -2
- package/out/map/ResultOverlay.js.map +1 -1
- package/out/map/ResultPanel.d.ts +1 -20
- package/out/map/ResultPanel.d.ts.map +1 -1
- package/out/map/ResultPanel.js +1 -1
- package/out/map/ResultPanel.js.map +1 -1
- package/out/map/VersionPicker.d.ts +7 -19
- package/out/map/VersionPicker.d.ts.map +1 -1
- package/out/map/VersionPicker.js +5 -2
- package/out/map/VersionPicker.js.map +1 -1
- package/out/map/fake-runtime.d.ts +9 -11
- package/out/map/fake-runtime.d.ts.map +1 -1
- package/out/map/fake-runtime.js +9 -12
- package/out/map/fake-runtime.js.map +1 -1
- package/out/map/geometry.d.ts +13 -34
- package/out/map/geometry.d.ts.map +1 -1
- package/out/map/geometry.js +9 -34
- package/out/map/geometry.js.map +1 -1
- package/out/map/graticule.d.ts +17 -0
- package/out/map/graticule.d.ts.map +1 -0
- package/out/map/graticule.js +67 -0
- package/out/map/graticule.js.map +1 -0
- package/out/map/map-debug.d.ts +1 -1
- package/out/map/map-debug.d.ts.map +1 -1
- package/out/map/map-debug.js +1 -1
- package/out/map/map-debug.js.map +1 -1
- package/out/map/place-render.d.ts +23 -43
- package/out/map/place-render.d.ts.map +1 -1
- package/out/map/place-render.js +4 -39
- package/out/map/place-render.js.map +1 -1
- package/out/map/types.d.ts +67 -95
- package/out/map/types.d.ts.map +1 -1
- package/out/map/types.js +1 -10
- package/out/map/types.js.map +1 -1
- package/out/map/useCompareState.d.ts +5 -4
- package/out/map/useCompareState.d.ts.map +1 -1
- package/out/map/useCompareState.js +3 -3
- package/out/map/useCompareState.js.map +1 -1
- package/out/map/useGeocode.d.ts +5 -3
- package/out/map/useGeocode.d.ts.map +1 -1
- package/out/map/useGeocode.js +4 -4
- package/out/map/useGeocode.js.map +1 -1
- package/out/map/useMapBearing.d.ts +28 -0
- package/out/map/useMapBearing.d.ts.map +1 -0
- package/out/map/useMapBearing.js +30 -0
- package/out/map/useMapBearing.js.map +1 -0
- package/out/map/useMapLabelPick.d.ts +13 -0
- package/out/map/useMapLabelPick.d.ts.map +1 -0
- package/out/map/useMapLabelPick.js +95 -0
- package/out/map/useMapLabelPick.js.map +1 -0
- package/out/map/useMapPlaceRender.d.ts +2 -6
- package/out/map/useMapPlaceRender.d.ts.map +1 -1
- package/out/map/useMapPlaceRender.js +2 -6
- package/out/map/useMapPlaceRender.js.map +1 -1
- package/out/map/usePlaceAutocomplete.d.ts +30 -28
- package/out/map/usePlaceAutocomplete.d.ts.map +1 -1
- package/out/map/usePlaceAutocomplete.js +6 -33
- package/out/map/usePlaceAutocomplete.js.map +1 -1
- package/out/map.d.ts +69 -0
- package/out/map.d.ts.map +1 -0
- package/out/map.js +46 -0
- package/out/map.js.map +1 -0
- package/out/pipeline/CandidatePicker.d.ts +12 -2
- package/out/pipeline/CandidatePicker.d.ts.map +1 -1
- package/out/pipeline/CandidatePicker.js +2 -2
- package/out/pipeline/CandidatePicker.js.map +1 -1
- package/out/pipeline/ConfidenceCell.d.ts +1 -1
- package/out/pipeline/ConfidenceCell.js +1 -1
- package/out/pipeline/FailureDiagnostic.d.ts +8 -2
- package/out/pipeline/FailureDiagnostic.d.ts.map +1 -1
- package/out/pipeline/FailureDiagnostic.js +3 -0
- package/out/pipeline/FailureDiagnostic.js.map +1 -1
- package/out/pipeline/PipelineExplorer.js +1 -1
- package/out/pipeline/QueryForm.d.ts +5 -2
- package/out/pipeline/QueryForm.d.ts.map +1 -1
- package/out/pipeline/QueryForm.js +1 -1
- package/out/pipeline/QueryForm.js.map +1 -1
- package/out/pipeline/ResolvedPlace.js +1 -1
- package/out/pipeline/SpanHighlight.d.ts +4 -3
- package/out/pipeline/SpanHighlight.d.ts.map +1 -1
- package/out/pipeline/SpanHighlight.js +3 -2
- package/out/pipeline/SpanHighlight.js.map +1 -1
- package/out/pipeline/TimingPanel.d.ts +1 -1
- package/out/pipeline/TimingPanel.js +1 -1
- package/out/pipeline/TreeView.d.ts +1 -1
- package/out/pipeline/copy.d.ts +1 -1
- package/out/pipeline/copy.d.ts.map +1 -1
- package/out/pipeline/copy.js +4 -3
- package/out/pipeline/copy.js.map +1 -1
- package/out/pipeline/presets.d.ts +5 -4
- package/out/pipeline/presets.d.ts.map +1 -1
- package/out/pipeline/presets.js +15 -13
- package/out/pipeline/presets.js.map +1 -1
- package/out/pipeline/types.d.ts +21 -14
- package/out/pipeline/types.d.ts.map +1 -1
- package/out/pipeline/types.js +2 -4
- package/out/pipeline/types.js.map +1 -1
- package/out/pipeline/useParsePipeline.d.ts +15 -7
- package/out/pipeline/useParsePipeline.d.ts.map +1 -1
- package/out/pipeline/useParsePipeline.js +10 -7
- package/out/pipeline/useParsePipeline.js.map +1 -1
- package/out/pipeline.d.ts +33 -0
- package/out/pipeline.d.ts.map +1 -0
- package/out/pipeline.js +21 -0
- package/out/pipeline.js.map +1 -0
- package/out/poi/AbstainPanel.d.ts +1 -1
- package/out/poi/LiveResultsBlock.d.ts +2 -1
- package/out/poi/LiveResultsBlock.d.ts.map +1 -1
- package/out/poi/LiveResultsBlock.js +1 -1
- package/out/poi/LiveResultsBlock.js.map +1 -1
- package/out/poi/POIExplorer.d.ts +22 -12
- package/out/poi/POIExplorer.d.ts.map +1 -1
- package/out/poi/POIExplorer.js +10 -9
- package/out/poi/POIExplorer.js.map +1 -1
- package/out/poi/QueryInput.d.ts +1 -1
- package/out/poi/SubjectPanel.d.ts +2 -2
- package/out/poi/SubjectPanel.d.ts.map +1 -1
- package/out/poi/SubjectPanel.js +3 -2
- package/out/poi/SubjectPanel.js.map +1 -1
- package/out/poi/runtime.d.ts +5 -14
- package/out/poi/runtime.d.ts.map +1 -1
- package/out/poi/runtime.js +5 -16
- package/out/poi/runtime.js.map +1 -1
- package/out/poi/types.d.ts +39 -27
- package/out/poi/types.d.ts.map +1 -1
- package/out/poi/types.js +2 -4
- package/out/poi/types.js.map +1 -1
- package/out/poi/usePOISearch.d.ts +28 -17
- package/out/poi/usePOISearch.d.ts.map +1 -1
- package/out/poi/usePOISearch.js +6 -32
- package/out/poi/usePOISearch.js.map +1 -1
- package/out/poi.d.ts +23 -0
- package/out/poi.d.ts.map +1 -0
- package/out/poi.js +15 -0
- package/out/poi.js.map +1 -0
- package/out/runtime/useReleaseRuntime.d.ts +64 -65
- package/out/runtime/useReleaseRuntime.d.ts.map +1 -1
- package/out/runtime/useReleaseRuntime.js +31 -26
- package/out/runtime/useReleaseRuntime.js.map +1 -1
- package/out/runtime.d.ts +9 -0
- package/out/runtime.d.ts.map +1 -0
- package/out/runtime.js +8 -0
- package/out/runtime.js.map +1 -0
- package/out/search/SearchModal.d.ts +33 -0
- package/out/search/SearchModal.d.ts.map +1 -0
- package/out/search/SearchModal.js +187 -0
- package/out/search/SearchModal.js.map +1 -0
- package/out/search/types.d.ts +64 -0
- package/out/search/types.d.ts.map +1 -0
- package/out/search/types.js +13 -0
- package/out/search/types.js.map +1 -0
- package/out/search.d.ts +11 -0
- package/out/search.d.ts.map +1 -0
- package/out/search.js +9 -0
- package/out/search.js.map +1 -0
- package/package.json +132 -133
- package/styles.css +1340 -202
- package/tokens/index.css +26 -7
- package/tokens/tokens.json +121 -6
- package/tokens/tokens.resolver.json +1 -1
- package/lib/map/index.ts +0 -76
- package/out/map/index.d.ts +0 -52
- package/out/map/index.d.ts.map +0 -1
- package/out/map/index.js +0 -36
- package/out/map/index.js.map +0 -1
- package/styleframe.config.ts +0 -321
- package/vitest.node.config.ts +0 -20
|
@@ -2,27 +2,14 @@
|
|
|
2
2
|
* @copyright Sister Software
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* `useReleaseRuntime` — the headless load-orchestration hook shared by every mailwoman browser surface (the
|
|
7
|
-
* inline doc-embeds via `RuntimeEmbed`, and the geocoder). It owns the version-selection state
|
|
8
|
-
* machine, the per-version load SEQUENCING, cancellation, and the ready / loading / error state — but
|
|
9
|
-
* NOTHING model- or map-specific. The actual asset fetchers (the ONNX classifier factory, the httpvfs
|
|
10
|
-
* WOF opener, the FST fetch, the releases.json fetch) are INJECTED by the host as async functions, so
|
|
11
|
-
* this module imports only React: no `onnxruntime-web`, no `sql.js-httpvfs`, no `maplibre-gl`, no
|
|
12
|
-
* `fetch`-specific plumbing. That keeps it node-import-safe and root-exportable from
|
|
13
|
-
* `@mailwoman/react` — the exact interface `PipelineRuntime` established, generalized to the loader itself.
|
|
14
|
-
*
|
|
15
|
-
* The hook is generic over `TAssets` (the opaque bundle the host's `loadAssets` returns — classifier,
|
|
16
|
-
* FST, WOF lookup, calibrator, …) and `TRelease` (the host's release-manifest entry). The package
|
|
17
|
-
* never inspects either; it just holds, reveals, and re-loads them across version/backend switches.
|
|
18
5
|
*/
|
|
19
6
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
20
7
|
/**
|
|
21
|
-
*
|
|
8
|
+
* Loads the release manifest on mount and the selected release's assets whenever
|
|
9
|
+
* the version or `forceWASM` changes.
|
|
22
10
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* `loadAssets` resolves (so `ready` flips exactly once per load), and consumers wait on `ready`.
|
|
11
|
+
* Each reload aborts the previous load and disposes the old assets.
|
|
12
|
+
* `ready` becomes true after the new assets load.
|
|
26
13
|
*/
|
|
27
14
|
export function useReleaseRuntime(config) {
|
|
28
15
|
const { initialProgress = "Loading releases…" } = config;
|
|
@@ -34,21 +21,19 @@ export function useReleaseRuntime(config) {
|
|
|
34
21
|
const [loadingStepLabels, setLoadingStepLabels] = useState([]);
|
|
35
22
|
const [errorMessage, setErrorMessage] = useState(null);
|
|
36
23
|
const [activeBackend, setActiveBackend] = useState("");
|
|
24
|
+
const [loadingByteFraction, setLoadingByteFraction] = useState(null);
|
|
37
25
|
const [forceWASM, setForceWASMState] = useState(false);
|
|
38
|
-
// Latest-ref the injected loaders: a host that re-creates them each render (an inline arrow) must NOT retrigger the
|
|
39
|
-
// load effects, which key ONLY on version/backend. The effects read `.current` at run time.
|
|
40
26
|
const loadManifestRef = useRef(config.loadManifest);
|
|
41
27
|
const loadAssetsRef = useRef(config.loadAssets);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
// null → defaultVersion already fires it once).
|
|
28
|
+
const disposeAssetsRef = useRef(config.disposeAssets);
|
|
29
|
+
const liveAssetsRef = useRef(null);
|
|
45
30
|
const manifestRef = useRef(null);
|
|
46
31
|
useEffect(() => {
|
|
47
32
|
loadManifestRef.current = config.loadManifest;
|
|
48
33
|
loadAssetsRef.current = config.loadAssets;
|
|
34
|
+
disposeAssetsRef.current = config.disposeAssets;
|
|
49
35
|
manifestRef.current = manifest;
|
|
50
|
-
}, [config.loadAssets, config.loadManifest, manifest]);
|
|
51
|
-
// Mount: fetch the manifest, then select the default version.
|
|
36
|
+
}, [config.disposeAssets, config.loadAssets, config.loadManifest, manifest]);
|
|
52
37
|
useEffect(() => {
|
|
53
38
|
const controller = new AbortController();
|
|
54
39
|
void (async () => {
|
|
@@ -69,7 +54,6 @@ export function useReleaseRuntime(config) {
|
|
|
69
54
|
})();
|
|
70
55
|
return () => controller.abort();
|
|
71
56
|
}, []);
|
|
72
|
-
// Load the per-version asset bundle when the version (or the backend force) changes.
|
|
73
57
|
useEffect(() => {
|
|
74
58
|
if (!selectedVersion)
|
|
75
59
|
return;
|
|
@@ -85,10 +69,16 @@ export function useReleaseRuntime(config) {
|
|
|
85
69
|
};
|
|
86
70
|
void (async () => {
|
|
87
71
|
try {
|
|
72
|
+
const outgoing = liveAssetsRef.current;
|
|
73
|
+
liveAssetsRef.current = null;
|
|
74
|
+
if (outgoing) {
|
|
75
|
+
await disposeAssetsRef.current?.(outgoing);
|
|
76
|
+
}
|
|
88
77
|
setAssets(null);
|
|
89
78
|
setLoadingStepIndex(-1);
|
|
90
79
|
setLoadingStepLabels([]);
|
|
91
80
|
setActiveBackend("");
|
|
81
|
+
setLoadingByteFraction(null);
|
|
92
82
|
const ctx = {
|
|
93
83
|
signal,
|
|
94
84
|
forceWASM,
|
|
@@ -96,12 +86,17 @@ export function useReleaseRuntime(config) {
|
|
|
96
86
|
setStepLabels: (labels) => guard(() => setLoadingStepLabels(labels)),
|
|
97
87
|
setStepIndex: (index) => guard(() => setLoadingStepIndex(index)),
|
|
98
88
|
setBackend: (backend) => guard(() => setActiveBackend(backend)),
|
|
89
|
+
setByteFraction: (fraction) => guard(() => setLoadingByteFraction(fraction)),
|
|
99
90
|
};
|
|
100
91
|
const loaded = await loadAssetsRef.current(release, ctx);
|
|
101
|
-
if (signal.aborted)
|
|
92
|
+
if (signal.aborted) {
|
|
93
|
+
await disposeAssetsRef.current?.(loaded);
|
|
102
94
|
return;
|
|
95
|
+
}
|
|
96
|
+
liveAssetsRef.current = loaded;
|
|
103
97
|
setAssets(loaded);
|
|
104
98
|
setLoadingProgress("");
|
|
99
|
+
setLoadingByteFraction(null);
|
|
105
100
|
}
|
|
106
101
|
catch (error) {
|
|
107
102
|
if (signal.aborted)
|
|
@@ -112,6 +107,15 @@ export function useReleaseRuntime(config) {
|
|
|
112
107
|
})();
|
|
113
108
|
return () => controller.abort();
|
|
114
109
|
}, [selectedVersion, forceWASM]);
|
|
110
|
+
useEffect(() => {
|
|
111
|
+
return () => {
|
|
112
|
+
const live = liveAssetsRef.current;
|
|
113
|
+
liveAssetsRef.current = null;
|
|
114
|
+
if (live) {
|
|
115
|
+
void disposeAssetsRef.current?.(live);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}, []);
|
|
115
119
|
const selectVersion = useCallback((version) => {
|
|
116
120
|
setSelectedVersion(version);
|
|
117
121
|
setErrorMessage(null);
|
|
@@ -127,6 +131,7 @@ export function useReleaseRuntime(config) {
|
|
|
127
131
|
loadingProgress,
|
|
128
132
|
loadingStepIndex,
|
|
129
133
|
loadingStepLabels,
|
|
134
|
+
loadingByteFraction,
|
|
130
135
|
errorMessage,
|
|
131
136
|
activeBackend,
|
|
132
137
|
forceWASM,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useReleaseRuntime.js","sourceRoot":"","sources":["../../lib/runtime/useReleaseRuntime.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"useReleaseRuntime.js","sourceRoot":"","sources":["../../lib/runtime/useReleaseRuntime.ts"],"names":[],"mappings":"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"}
|
package/out/runtime.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
* @file Node-safe release-runtime exports.
|
|
6
|
+
*/
|
|
7
|
+
export { useReleaseRuntime } from "#runtime/useReleaseRuntime";
|
|
8
|
+
export type { AssetsLoadContext, ReleaseBase, ReleaseLoaderState, ReleaseManifest, ReleaseRuntimeConfig, } from "#runtime/useReleaseRuntime";
|
|
9
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../lib/runtime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAE9D,YAAY,EACX,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,oBAAoB,GACpB,MAAM,4BAA4B,CAAA"}
|
package/out/runtime.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../lib/runtime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* The docs search modal. A native `<dialog>` opened with `showModal()` supplies the focus trap, the inert
|
|
7
|
+
* background, the backdrop, the close on Escape and the return of focus to the opener. The query field is an
|
|
8
|
+
* `<input type="search">` with the ARIA combobox role. DOM focus stays on the input, and the selected hit is
|
|
9
|
+
* named by `aria-activedescendant`. The component owns no data access: `search` is passed in.
|
|
10
|
+
*/
|
|
11
|
+
import type { SearchHit, SearchResponse } from "./types.ts";
|
|
12
|
+
export interface SearchModalProps {
|
|
13
|
+
open: boolean;
|
|
14
|
+
onClose: () => void;
|
|
15
|
+
/**
|
|
16
|
+
* Called with the hit's site-relative link on Enter or on an unmodified click.
|
|
17
|
+
* Absent, the link navigates as an ordinary anchor.
|
|
18
|
+
*/
|
|
19
|
+
onNavigate?: (href: string) => void;
|
|
20
|
+
/**
|
|
21
|
+
* Runs the query.
|
|
22
|
+
*
|
|
23
|
+
* The function must keep a stable identity across renders (for example through `useCallback`),
|
|
24
|
+
* because a new identity refires the request for the current query.
|
|
25
|
+
*/
|
|
26
|
+
search: (q: string, signal: AbortSignal) => Promise<SearchResponse>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The site-relative link for a hit.
|
|
30
|
+
*/
|
|
31
|
+
export declare function hitHref(hit: Pick<SearchHit, "url" | "anchor">): string;
|
|
32
|
+
export declare function SearchModal({ open, onClose, onNavigate, search }: SearchModalProps): import("react").JSX.Element;
|
|
33
|
+
//# sourceMappingURL=SearchModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchModal.d.ts","sourceRoot":"","sources":["../../lib/search/SearchModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3D,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC;;;;;OAKG;IACH,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,cAAc,CAAC,CAAA;CACnE;AAiBD;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,QAAQ,CAAC,GAAG,MAAM,CAEtE;AAuCD,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,gBAAgB,+BA+NlF"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @copyright Sister Software
|
|
4
|
+
* @license AGPL-3.0
|
|
5
|
+
* @author Teffen Ellis, et al.
|
|
6
|
+
*
|
|
7
|
+
* The docs search modal. A native `<dialog>` opened with `showModal()` supplies the focus trap, the inert
|
|
8
|
+
* background, the backdrop, the close on Escape and the return of focus to the opener. The query field is an
|
|
9
|
+
* `<input type="search">` with the ARIA combobox role. DOM focus stays on the input, and the selected hit is
|
|
10
|
+
* named by `aria-activedescendant`. The component owns no data access: `search` is passed in.
|
|
11
|
+
*/
|
|
12
|
+
import { useEffect, useId, useMemo, useRef, useState } from "react";
|
|
13
|
+
import { useDebouncedValue } from "#common/useDebouncedValue";
|
|
14
|
+
const DEBOUNCE_MS = 150;
|
|
15
|
+
/**
|
|
16
|
+
* How long a request runs before the live region announces that the index is loading.
|
|
17
|
+
*/
|
|
18
|
+
const LOADING_ANNOUNCE_MS = 300;
|
|
19
|
+
const MAX_QUERY_LENGTH = 200;
|
|
20
|
+
const DEFAULT_CATEGORY = "Documentation";
|
|
21
|
+
/**
|
|
22
|
+
* The site-relative link for a hit.
|
|
23
|
+
*/
|
|
24
|
+
export function hitHref(hit) {
|
|
25
|
+
return hit.anchor === "" ? hit.url : `${hit.url}#${hit.anchor}`;
|
|
26
|
+
}
|
|
27
|
+
function statusText(status) {
|
|
28
|
+
if (status.kind === "failed")
|
|
29
|
+
return "Search is unavailable. Try again in a moment.";
|
|
30
|
+
if (status.kind === "loading")
|
|
31
|
+
return "Loading the search index…";
|
|
32
|
+
if (status.kind === "idle")
|
|
33
|
+
return "";
|
|
34
|
+
const { response } = status;
|
|
35
|
+
if (!response.hits.length)
|
|
36
|
+
return `No results for “${response.query}”.`;
|
|
37
|
+
return response.hits.length === 1 ? "1 result." : `${response.hits.length} results.`;
|
|
38
|
+
}
|
|
39
|
+
function highlighted(hit) {
|
|
40
|
+
const parts = [];
|
|
41
|
+
let cursor = 0;
|
|
42
|
+
for (const [start, end] of hit.highlights) {
|
|
43
|
+
if (start < cursor)
|
|
44
|
+
continue;
|
|
45
|
+
parts.push(hit.snippet.slice(cursor, start), _jsx("mark", { children: hit.snippet.slice(start, end) }, start));
|
|
46
|
+
cursor = end;
|
|
47
|
+
}
|
|
48
|
+
parts.push(hit.snippet.slice(cursor));
|
|
49
|
+
return parts;
|
|
50
|
+
}
|
|
51
|
+
function title(hit) {
|
|
52
|
+
return hit.hierarchy
|
|
53
|
+
.slice(1)
|
|
54
|
+
.filter((entry) => entry !== null)
|
|
55
|
+
.join(" › ");
|
|
56
|
+
}
|
|
57
|
+
export function SearchModal({ open, onClose, onNavigate, search }) {
|
|
58
|
+
const dialogRef = useRef(null);
|
|
59
|
+
const inputRef = useRef(null);
|
|
60
|
+
const baseID = useId();
|
|
61
|
+
const listboxID = `${baseID}-listbox`;
|
|
62
|
+
const [query, setQuery] = useState("");
|
|
63
|
+
const [settled, setSettled] = useState({ kind: "idle" });
|
|
64
|
+
const [selected, setSelected] = useState(0);
|
|
65
|
+
const [loading, setLoading] = useState(false);
|
|
66
|
+
const trimmed = query.trim().slice(0, MAX_QUERY_LENGTH);
|
|
67
|
+
const debounced = useDebouncedValue(trimmed, DEBOUNCE_MS);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
const dialog = dialogRef.current;
|
|
70
|
+
if (!dialog)
|
|
71
|
+
return;
|
|
72
|
+
if (open && !dialog.open) {
|
|
73
|
+
dialog.showModal();
|
|
74
|
+
inputRef.current?.focus();
|
|
75
|
+
}
|
|
76
|
+
else if (!open && dialog.open) {
|
|
77
|
+
dialog.close();
|
|
78
|
+
}
|
|
79
|
+
}, [open]);
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
if (debounced === "")
|
|
82
|
+
return;
|
|
83
|
+
// Aborting the earlier request is what keeps a late response from replacing newer results.
|
|
84
|
+
const controller = new AbortController();
|
|
85
|
+
const loadingTimer = setTimeout(() => setLoading(true), LOADING_ANNOUNCE_MS);
|
|
86
|
+
search(debounced, controller.signal).then((response) => {
|
|
87
|
+
if (controller.signal.aborted)
|
|
88
|
+
return;
|
|
89
|
+
clearTimeout(loadingTimer);
|
|
90
|
+
setLoading(false);
|
|
91
|
+
setSettled({ kind: "results", response });
|
|
92
|
+
setSelected(0);
|
|
93
|
+
}, () => {
|
|
94
|
+
if (controller.signal.aborted)
|
|
95
|
+
return;
|
|
96
|
+
clearTimeout(loadingTimer);
|
|
97
|
+
setLoading(false);
|
|
98
|
+
setSettled({ kind: "failed" });
|
|
99
|
+
});
|
|
100
|
+
return () => {
|
|
101
|
+
clearTimeout(loadingTimer);
|
|
102
|
+
setLoading(false);
|
|
103
|
+
controller.abort();
|
|
104
|
+
};
|
|
105
|
+
}, [debounced, search]);
|
|
106
|
+
// An empty query shows no results, whatever the last settled response was.
|
|
107
|
+
const status = debounced === "" ? { kind: "idle" } : settled;
|
|
108
|
+
const response = status.kind === "results" ? status.response : undefined;
|
|
109
|
+
// The announcement reports a slow request while the last results stay on screen.
|
|
110
|
+
const announced = loading && debounced !== "" ? { kind: "loading" } : status;
|
|
111
|
+
const groups = useMemo(() => {
|
|
112
|
+
const hits = response?.hits ?? [];
|
|
113
|
+
const byCategory = new Map();
|
|
114
|
+
for (const hit of hits) {
|
|
115
|
+
const category = hit.hierarchy[0] ?? DEFAULT_CATEGORY;
|
|
116
|
+
byCategory.set(category, [...(byCategory.get(category) ?? []), hit]);
|
|
117
|
+
}
|
|
118
|
+
// Options are numbered in display order so the arrow keys follow what the reader sees.
|
|
119
|
+
let order = 0;
|
|
120
|
+
return [...byCategory].map(([category, entries]) => ({
|
|
121
|
+
category,
|
|
122
|
+
entries: entries.map((hit) => ({ hit, order: order++ })),
|
|
123
|
+
}));
|
|
124
|
+
}, [response]);
|
|
125
|
+
const ordered = groups.flatMap((group) => group.entries);
|
|
126
|
+
const optionID = (order) => `${baseID}-option-${order}`;
|
|
127
|
+
function go(hit) {
|
|
128
|
+
const href = hitHref(hit);
|
|
129
|
+
onClose();
|
|
130
|
+
if (onNavigate) {
|
|
131
|
+
onNavigate(href);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
globalThis.location.assign(href);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function onKeyDown(event) {
|
|
138
|
+
// A key that commits or edits an IME composition is not a command.
|
|
139
|
+
if (event.nativeEvent.isComposing)
|
|
140
|
+
return;
|
|
141
|
+
if (!ordered.length)
|
|
142
|
+
return;
|
|
143
|
+
const last = ordered.length - 1;
|
|
144
|
+
const next = event.key === "ArrowDown"
|
|
145
|
+
? selected === last
|
|
146
|
+
? 0
|
|
147
|
+
: selected + 1
|
|
148
|
+
: event.key === "ArrowUp"
|
|
149
|
+
? selected === 0
|
|
150
|
+
? last
|
|
151
|
+
: selected - 1
|
|
152
|
+
: event.key === "Home"
|
|
153
|
+
? 0
|
|
154
|
+
: event.key === "End"
|
|
155
|
+
? last
|
|
156
|
+
: undefined;
|
|
157
|
+
if (next !== undefined) {
|
|
158
|
+
event.preventDefault();
|
|
159
|
+
setSelected(next);
|
|
160
|
+
document.getElementById(optionID(next))?.scrollIntoView({ block: "nearest" });
|
|
161
|
+
}
|
|
162
|
+
else if (event.key === "Enter") {
|
|
163
|
+
event.preventDefault();
|
|
164
|
+
// The hits on screen answer an earlier query until the debounce settles.
|
|
165
|
+
if (trimmed !== debounced)
|
|
166
|
+
return;
|
|
167
|
+
const entry = ordered[selected];
|
|
168
|
+
if (entry) {
|
|
169
|
+
go(entry.hit);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function onDialogClick(event) {
|
|
174
|
+
// A click whose target is the dialog element itself landed on the backdrop.
|
|
175
|
+
if (event.target === event.currentTarget) {
|
|
176
|
+
event.currentTarget.close();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function onLinkClick(event, hit) {
|
|
180
|
+
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0)
|
|
181
|
+
return;
|
|
182
|
+
event.preventDefault();
|
|
183
|
+
go(hit);
|
|
184
|
+
}
|
|
185
|
+
return (_jsxs("dialog", { ref: dialogRef, className: "mw-search", "aria-label": "Search the documentation", onClose: onClose, onClick: onDialogClick, children: [_jsx("form", { role: "search", className: "mw-search__form", onSubmit: (event) => event.preventDefault(), children: _jsx("input", { ref: inputRef, type: "search", className: "mw-search__input", role: "combobox", "aria-label": "Search the documentation", "aria-autocomplete": "list", "aria-expanded": ordered.length > 0, "aria-controls": listboxID, "aria-activedescendant": ordered.length ? optionID(selected) : undefined, autoComplete: "off", spellCheck: false, maxLength: MAX_QUERY_LENGTH, placeholder: "Search the documentation", value: query, onChange: (event) => setQuery(event.target.value), onKeyDown: onKeyDown }) }), response?.corrected !== undefined && (_jsxs("p", { className: "mw-search__corrected", children: ["Showing results for \u201C", response.corrected, "\u201D"] })), _jsx("div", { id: listboxID, role: "listbox", "aria-label": "Search results", className: "mw-search__results", children: groups.map((group, groupIndex) => (_jsxs("div", { role: "group", "aria-labelledby": `${baseID}-group-${groupIndex}`, className: "mw-search__group", children: [_jsx("div", { id: `${baseID}-group-${groupIndex}`, className: "mw-search__category", children: group.category }), group.entries.map(({ hit, order }) => (_jsxs("a", { id: optionID(order), role: "option", "aria-selected": order === selected, href: hitHref(hit), tabIndex: -1, className: "mw-search__option", onPointerMove: () => setSelected(order), onClick: (event) => onLinkClick(event, hit), children: [_jsx("span", { className: "mw-search__title", children: title(hit) }), hit.snippet !== "" && _jsx("span", { className: "mw-search__snippet", children: highlighted(hit) })] }, order)))] }, group.category))) }), _jsx("p", { "aria-live": "polite", className: "mw-search__status", children: statusText(announced) })] }));
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=SearchModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchModal.js","sourceRoot":"","sources":["../../lib/search/SearchModal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* The record the docs build indexes and the response the search modal renders. The modal and the
|
|
7
|
+
* query code share these through `import type`.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* The number of hierarchy entries: the sidebar category, then `h1` through `h6`.
|
|
11
|
+
*/
|
|
12
|
+
export declare const HIERARCHY_DEPTH = 7;
|
|
13
|
+
export interface SearchRecord {
|
|
14
|
+
/**
|
|
15
|
+
* The first 32 hex characters of `sha256(url + "#" + anchor + "\n" + position)`.
|
|
16
|
+
*/
|
|
17
|
+
id: string;
|
|
18
|
+
/**
|
|
19
|
+
* Site-relative path without the anchor, such as `/docs/developers/reference/cli`.
|
|
20
|
+
*/
|
|
21
|
+
url: string;
|
|
22
|
+
/**
|
|
23
|
+
* The heading id the record links to, or the empty string for the top of the page.
|
|
24
|
+
*/
|
|
25
|
+
anchor: string;
|
|
26
|
+
/**
|
|
27
|
+
* Seven entries, `lvl0` through `lvl6`, with `null` below the record's own level.
|
|
28
|
+
*/
|
|
29
|
+
hierarchy: (string | null)[];
|
|
30
|
+
/**
|
|
31
|
+
* Aggregated text under the heading, or the empty string for a heading without body text.
|
|
32
|
+
*/
|
|
33
|
+
content: string;
|
|
34
|
+
/**
|
|
35
|
+
* Depth of the deepest non-null hierarchy entry, 0 through 6.
|
|
36
|
+
*/
|
|
37
|
+
level: number;
|
|
38
|
+
/**
|
|
39
|
+
* Zero-based order of the record on its page.
|
|
40
|
+
*/
|
|
41
|
+
position: number;
|
|
42
|
+
}
|
|
43
|
+
export interface SearchHit {
|
|
44
|
+
url: string;
|
|
45
|
+
anchor: string;
|
|
46
|
+
hierarchy: (string | null)[];
|
|
47
|
+
/**
|
|
48
|
+
* At most 160 characters of content around the first match.
|
|
49
|
+
*/
|
|
50
|
+
snippet: string;
|
|
51
|
+
/**
|
|
52
|
+
* Character ranges within `snippet` that matched a query token.
|
|
53
|
+
*/
|
|
54
|
+
highlights: [start: number, end: number][];
|
|
55
|
+
}
|
|
56
|
+
export interface SearchResponse {
|
|
57
|
+
query: string;
|
|
58
|
+
/**
|
|
59
|
+
* The text actually searched when a token was corrected against the vocabulary.
|
|
60
|
+
*/
|
|
61
|
+
corrected?: string;
|
|
62
|
+
hits: SearchHit[];
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/search/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe,IAAI,CAAA;AAEhC,MAAM,WAAW,YAAY;IAC5B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAA;IACV;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IACX;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,SAAS,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;IAC5B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,SAAS;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;IAC5B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,CAAA;CAC1C;AAED,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,SAAS,EAAE,CAAA;CACjB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* The record the docs build indexes and the response the search modal renders. The modal and the
|
|
7
|
+
* query code share these through `import type`.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* The number of hierarchy entries: the sidebar category, then `h1` through `h6`.
|
|
11
|
+
*/
|
|
12
|
+
export const HIERARCHY_DEPTH = 7;
|
|
13
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../lib/search/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAA"}
|
package/out/search.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
* @file The docs search modal and its wire types.
|
|
6
|
+
*/
|
|
7
|
+
export { hitHref, SearchModal } from "./search/SearchModal.tsx";
|
|
8
|
+
export type { SearchModalProps } from "./search/SearchModal.tsx";
|
|
9
|
+
export { HIERARCHY_DEPTH } from "./search/types.ts";
|
|
10
|
+
export type { SearchHit, SearchRecord, SearchResponse } from "./search/types.ts";
|
|
11
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../lib/search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC/D,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA"}
|
package/out/search.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
* @file The docs search modal and its wire types.
|
|
6
|
+
*/
|
|
7
|
+
export { hitHref, SearchModal } from "./search/SearchModal.js";
|
|
8
|
+
export { HIERARCHY_DEPTH } from "./search/types.js";
|
|
9
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../lib/search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAA0B,CAAA;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA"}
|