@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.
Files changed (370) hide show
  1. package/README.md +17 -16
  2. package/fonts.css +97 -22
  3. package/lib/common/About.tsx +87 -71
  4. package/lib/common/ClientOnly.tsx +2 -14
  5. package/lib/common/CopyButton.tsx +3 -1
  6. package/lib/common/LoadingIndicator.tsx +4 -2
  7. package/lib/common/PresetChips.tsx +9 -8
  8. package/lib/common/confidence-tiers.ts +7 -6
  9. package/lib/common/cx.ts +3 -1
  10. package/lib/common/text-tokens.ts +7 -4
  11. package/lib/common/useBuildInfo.ts +54 -0
  12. package/lib/common/useClipboard.ts +2 -11
  13. package/lib/common.ts +22 -0
  14. package/lib/index.ts +27 -112
  15. package/lib/map/AppIdentity.tsx +85 -0
  16. package/lib/map/BackendControl.tsx +16 -13
  17. package/lib/map/CompareToggle.tsx +11 -33
  18. package/lib/map/DebugInfo.tsx +88 -0
  19. package/lib/map/Geocoder.tsx +92 -58
  20. package/lib/map/GeocoderControls.tsx +582 -127
  21. package/lib/map/GraticuleLayer.tsx +54 -0
  22. package/lib/map/MapCanvas.tsx +23 -12
  23. package/lib/map/MapChipRow.tsx +73 -0
  24. package/lib/map/MapCompass.tsx +68 -0
  25. package/lib/map/MapControlStack.tsx +97 -0
  26. package/lib/map/MapFooter.tsx +101 -0
  27. package/lib/map/MapProgressBar.tsx +55 -0
  28. package/lib/map/MapSearchBar.tsx +82 -0
  29. package/lib/map/MapSheet.tsx +71 -0
  30. package/lib/map/OverlayLayers.tsx +1 -1
  31. package/lib/map/PlaceAutocomplete.tsx +10 -21
  32. package/lib/map/PlaceMarker.tsx +4 -2
  33. package/lib/map/ResolvedPlaceLayers.tsx +5 -14
  34. package/lib/map/ResultCamera.tsx +8 -31
  35. package/lib/map/ResultOverlay.tsx +2 -12
  36. package/lib/map/ResultPanel.tsx +1 -20
  37. package/lib/map/VersionPicker.tsx +10 -19
  38. package/lib/map/fake-runtime.ts +10 -12
  39. package/lib/map/geometry.ts +14 -47
  40. package/lib/map/graticule.ts +80 -0
  41. package/lib/map/map-debug.ts +1 -1
  42. package/lib/map/place-render.ts +28 -60
  43. package/lib/map/types.ts +65 -97
  44. package/lib/map/useCompareState.ts +5 -4
  45. package/lib/map/useGeocode.ts +7 -5
  46. package/lib/map/useMapBearing.ts +56 -0
  47. package/lib/map/useMapLabelPick.ts +114 -0
  48. package/lib/map/useMapPlaceRender.ts +2 -6
  49. package/lib/map/usePlaceAutocomplete.ts +44 -50
  50. package/lib/map.ts +95 -0
  51. package/lib/pipeline/CandidatePicker.tsx +13 -5
  52. package/lib/pipeline/ConfidenceCell.tsx +1 -1
  53. package/lib/pipeline/FailureDiagnostic.tsx +8 -2
  54. package/lib/pipeline/QueryForm.tsx +5 -2
  55. package/lib/pipeline/ResolvedPlace.tsx +1 -1
  56. package/lib/pipeline/SpanHighlight.tsx +7 -5
  57. package/lib/pipeline/TimingPanel.tsx +1 -1
  58. package/lib/pipeline/TreeView.tsx +1 -1
  59. package/lib/pipeline/copy.ts +22 -25
  60. package/lib/pipeline/presets.ts +15 -13
  61. package/lib/pipeline/types.ts +21 -14
  62. package/lib/pipeline/useParsePipeline.ts +38 -24
  63. package/lib/pipeline.ts +36 -0
  64. package/lib/poi/AbstainPanel.tsx +1 -1
  65. package/lib/poi/LiveResultsBlock.tsx +2 -1
  66. package/lib/poi/POIExplorer.tsx +24 -15
  67. package/lib/poi/QueryInput.tsx +1 -1
  68. package/lib/poi/SubjectPanel.tsx +4 -3
  69. package/lib/poi/runtime.ts +5 -16
  70. package/lib/poi/types.ts +39 -27
  71. package/lib/poi/usePOISearch.ts +39 -44
  72. package/lib/poi.ts +39 -0
  73. package/lib/runtime/useReleaseRuntime.ts +125 -74
  74. package/lib/runtime.ts +16 -0
  75. package/lib/search/SearchModal.tsx +317 -0
  76. package/lib/search/search.css +144 -0
  77. package/lib/search/types.ts +67 -0
  78. package/lib/search.ts +11 -0
  79. package/out/common/About.d.ts +13 -4
  80. package/out/common/About.d.ts.map +1 -1
  81. package/out/common/About.js +5 -2
  82. package/out/common/About.js.map +1 -1
  83. package/out/common/ClientOnly.d.ts +2 -11
  84. package/out/common/ClientOnly.d.ts.map +1 -1
  85. package/out/common/ClientOnly.js +1 -13
  86. package/out/common/ClientOnly.js.map +1 -1
  87. package/out/common/CopyButton.d.ts +3 -1
  88. package/out/common/CopyButton.d.ts.map +1 -1
  89. package/out/common/CopyButton.js.map +1 -1
  90. package/out/common/LoadingIndicator.d.ts +4 -2
  91. package/out/common/LoadingIndicator.d.ts.map +1 -1
  92. package/out/common/LoadingIndicator.js.map +1 -1
  93. package/out/common/PresetChips.d.ts +9 -8
  94. package/out/common/PresetChips.d.ts.map +1 -1
  95. package/out/common/PresetChips.js.map +1 -1
  96. package/out/common/confidence-tiers.d.ts +7 -6
  97. package/out/common/confidence-tiers.d.ts.map +1 -1
  98. package/out/common/confidence-tiers.js +7 -6
  99. package/out/common/confidence-tiers.js.map +1 -1
  100. package/out/common/cx.d.ts +3 -1
  101. package/out/common/cx.d.ts.map +1 -1
  102. package/out/common/cx.js +3 -1
  103. package/out/common/cx.js.map +1 -1
  104. package/out/common/text-tokens.d.ts +4 -3
  105. package/out/common/text-tokens.d.ts.map +1 -1
  106. package/out/common/text-tokens.js +6 -3
  107. package/out/common/text-tokens.js.map +1 -1
  108. package/out/common/useBuildInfo.d.ts +27 -0
  109. package/out/common/useBuildInfo.d.ts.map +1 -0
  110. package/out/common/useBuildInfo.js +32 -0
  111. package/out/common/useBuildInfo.js.map +1 -0
  112. package/out/common/useClipboard.d.ts +1 -3
  113. package/out/common/useClipboard.d.ts.map +1 -1
  114. package/out/common/useClipboard.js +2 -11
  115. package/out/common/useClipboard.js.map +1 -1
  116. package/out/common.d.ts +22 -0
  117. package/out/common.d.ts.map +1 -0
  118. package/out/common.js +15 -0
  119. package/out/common.js.map +1 -0
  120. package/out/index.d.ts +26 -71
  121. package/out/index.d.ts.map +1 -1
  122. package/out/index.js +21 -47
  123. package/out/index.js.map +1 -1
  124. package/out/map/AppIdentity.d.ts +42 -0
  125. package/out/map/AppIdentity.d.ts.map +1 -0
  126. package/out/map/AppIdentity.js +16 -0
  127. package/out/map/AppIdentity.js.map +1 -0
  128. package/out/map/BackendControl.d.ts +9 -10
  129. package/out/map/BackendControl.d.ts.map +1 -1
  130. package/out/map/BackendControl.js +2 -2
  131. package/out/map/BackendControl.js.map +1 -1
  132. package/out/map/CompareToggle.d.ts +8 -31
  133. package/out/map/CompareToggle.d.ts.map +1 -1
  134. package/out/map/CompareToggle.js +5 -2
  135. package/out/map/CompareToggle.js.map +1 -1
  136. package/out/map/DebugInfo.d.ts +34 -0
  137. package/out/map/DebugInfo.d.ts.map +1 -0
  138. package/out/map/DebugInfo.js +39 -0
  139. package/out/map/DebugInfo.js.map +1 -0
  140. package/out/map/Geocoder.d.ts +47 -26
  141. package/out/map/Geocoder.d.ts.map +1 -1
  142. package/out/map/Geocoder.js +34 -50
  143. package/out/map/Geocoder.js.map +1 -1
  144. package/out/map/GeocoderControls.d.ts +23 -33
  145. package/out/map/GeocoderControls.d.ts.map +1 -1
  146. package/out/map/GeocoderControls.js +277 -16
  147. package/out/map/GeocoderControls.js.map +1 -1
  148. package/out/map/GraticuleLayer.d.ts +28 -0
  149. package/out/map/GraticuleLayer.d.ts.map +1 -0
  150. package/out/map/GraticuleLayer.js +25 -0
  151. package/out/map/GraticuleLayer.js.map +1 -0
  152. package/out/map/MapCanvas.d.ts +23 -12
  153. package/out/map/MapCanvas.d.ts.map +1 -1
  154. package/out/map/MapCanvas.js +5 -2
  155. package/out/map/MapCanvas.js.map +1 -1
  156. package/out/map/MapChipRow.d.ts +43 -0
  157. package/out/map/MapChipRow.d.ts.map +1 -0
  158. package/out/map/MapChipRow.js +12 -0
  159. package/out/map/MapChipRow.js.map +1 -0
  160. package/out/map/MapCompass.d.ts +33 -0
  161. package/out/map/MapCompass.d.ts.map +1 -0
  162. package/out/map/MapCompass.js +15 -0
  163. package/out/map/MapCompass.js.map +1 -0
  164. package/out/map/MapControlStack.d.ts +56 -0
  165. package/out/map/MapControlStack.d.ts.map +1 -0
  166. package/out/map/MapControlStack.js +18 -0
  167. package/out/map/MapControlStack.js.map +1 -0
  168. package/out/map/MapFooter.d.ts +27 -0
  169. package/out/map/MapFooter.d.ts.map +1 -0
  170. package/out/map/MapFooter.js +37 -0
  171. package/out/map/MapFooter.js.map +1 -0
  172. package/out/map/MapProgressBar.d.ts +31 -0
  173. package/out/map/MapProgressBar.d.ts.map +1 -0
  174. package/out/map/MapProgressBar.js +8 -0
  175. package/out/map/MapProgressBar.js.map +1 -0
  176. package/out/map/MapSearchBar.d.ts +48 -0
  177. package/out/map/MapSearchBar.d.ts.map +1 -0
  178. package/out/map/MapSearchBar.js +12 -0
  179. package/out/map/MapSearchBar.js.map +1 -0
  180. package/out/map/MapSheet.d.ts +35 -0
  181. package/out/map/MapSheet.d.ts.map +1 -0
  182. package/out/map/MapSheet.js +29 -0
  183. package/out/map/MapSheet.js.map +1 -0
  184. package/out/map/OverlayLayers.d.ts +1 -1
  185. package/out/map/OverlayLayers.js +2 -2
  186. package/out/map/PlaceAutocomplete.d.ts +10 -21
  187. package/out/map/PlaceAutocomplete.d.ts.map +1 -1
  188. package/out/map/PlaceAutocomplete.js +2 -1
  189. package/out/map/PlaceAutocomplete.js.map +1 -1
  190. package/out/map/PlaceMarker.d.ts +4 -2
  191. package/out/map/PlaceMarker.d.ts.map +1 -1
  192. package/out/map/PlaceMarker.js +3 -1
  193. package/out/map/PlaceMarker.js.map +1 -1
  194. package/out/map/ResolvedPlaceLayers.d.ts +5 -14
  195. package/out/map/ResolvedPlaceLayers.d.ts.map +1 -1
  196. package/out/map/ResolvedPlaceLayers.js +2 -2
  197. package/out/map/ResolvedPlaceLayers.js.map +1 -1
  198. package/out/map/ResultCamera.d.ts +8 -31
  199. package/out/map/ResultCamera.d.ts.map +1 -1
  200. package/out/map/ResultCamera.js +3 -28
  201. package/out/map/ResultCamera.js.map +1 -1
  202. package/out/map/ResultOverlay.d.ts +2 -12
  203. package/out/map/ResultOverlay.d.ts.map +1 -1
  204. package/out/map/ResultOverlay.js +1 -2
  205. package/out/map/ResultOverlay.js.map +1 -1
  206. package/out/map/ResultPanel.d.ts +1 -20
  207. package/out/map/ResultPanel.d.ts.map +1 -1
  208. package/out/map/ResultPanel.js +1 -1
  209. package/out/map/ResultPanel.js.map +1 -1
  210. package/out/map/VersionPicker.d.ts +7 -19
  211. package/out/map/VersionPicker.d.ts.map +1 -1
  212. package/out/map/VersionPicker.js +5 -2
  213. package/out/map/VersionPicker.js.map +1 -1
  214. package/out/map/fake-runtime.d.ts +9 -11
  215. package/out/map/fake-runtime.d.ts.map +1 -1
  216. package/out/map/fake-runtime.js +9 -12
  217. package/out/map/fake-runtime.js.map +1 -1
  218. package/out/map/geometry.d.ts +13 -34
  219. package/out/map/geometry.d.ts.map +1 -1
  220. package/out/map/geometry.js +9 -34
  221. package/out/map/geometry.js.map +1 -1
  222. package/out/map/graticule.d.ts +17 -0
  223. package/out/map/graticule.d.ts.map +1 -0
  224. package/out/map/graticule.js +67 -0
  225. package/out/map/graticule.js.map +1 -0
  226. package/out/map/map-debug.d.ts +1 -1
  227. package/out/map/map-debug.d.ts.map +1 -1
  228. package/out/map/map-debug.js +1 -1
  229. package/out/map/map-debug.js.map +1 -1
  230. package/out/map/place-render.d.ts +23 -43
  231. package/out/map/place-render.d.ts.map +1 -1
  232. package/out/map/place-render.js +4 -39
  233. package/out/map/place-render.js.map +1 -1
  234. package/out/map/types.d.ts +67 -95
  235. package/out/map/types.d.ts.map +1 -1
  236. package/out/map/types.js +1 -10
  237. package/out/map/types.js.map +1 -1
  238. package/out/map/useCompareState.d.ts +5 -4
  239. package/out/map/useCompareState.d.ts.map +1 -1
  240. package/out/map/useCompareState.js +3 -3
  241. package/out/map/useCompareState.js.map +1 -1
  242. package/out/map/useGeocode.d.ts +5 -3
  243. package/out/map/useGeocode.d.ts.map +1 -1
  244. package/out/map/useGeocode.js +4 -4
  245. package/out/map/useGeocode.js.map +1 -1
  246. package/out/map/useMapBearing.d.ts +28 -0
  247. package/out/map/useMapBearing.d.ts.map +1 -0
  248. package/out/map/useMapBearing.js +30 -0
  249. package/out/map/useMapBearing.js.map +1 -0
  250. package/out/map/useMapLabelPick.d.ts +13 -0
  251. package/out/map/useMapLabelPick.d.ts.map +1 -0
  252. package/out/map/useMapLabelPick.js +95 -0
  253. package/out/map/useMapLabelPick.js.map +1 -0
  254. package/out/map/useMapPlaceRender.d.ts +2 -6
  255. package/out/map/useMapPlaceRender.d.ts.map +1 -1
  256. package/out/map/useMapPlaceRender.js +2 -6
  257. package/out/map/useMapPlaceRender.js.map +1 -1
  258. package/out/map/usePlaceAutocomplete.d.ts +30 -28
  259. package/out/map/usePlaceAutocomplete.d.ts.map +1 -1
  260. package/out/map/usePlaceAutocomplete.js +6 -33
  261. package/out/map/usePlaceAutocomplete.js.map +1 -1
  262. package/out/map.d.ts +69 -0
  263. package/out/map.d.ts.map +1 -0
  264. package/out/map.js +46 -0
  265. package/out/map.js.map +1 -0
  266. package/out/pipeline/CandidatePicker.d.ts +12 -2
  267. package/out/pipeline/CandidatePicker.d.ts.map +1 -1
  268. package/out/pipeline/CandidatePicker.js +2 -2
  269. package/out/pipeline/CandidatePicker.js.map +1 -1
  270. package/out/pipeline/ConfidenceCell.d.ts +1 -1
  271. package/out/pipeline/ConfidenceCell.js +1 -1
  272. package/out/pipeline/FailureDiagnostic.d.ts +8 -2
  273. package/out/pipeline/FailureDiagnostic.d.ts.map +1 -1
  274. package/out/pipeline/FailureDiagnostic.js +3 -0
  275. package/out/pipeline/FailureDiagnostic.js.map +1 -1
  276. package/out/pipeline/PipelineExplorer.js +1 -1
  277. package/out/pipeline/QueryForm.d.ts +5 -2
  278. package/out/pipeline/QueryForm.d.ts.map +1 -1
  279. package/out/pipeline/QueryForm.js +1 -1
  280. package/out/pipeline/QueryForm.js.map +1 -1
  281. package/out/pipeline/ResolvedPlace.js +1 -1
  282. package/out/pipeline/SpanHighlight.d.ts +4 -3
  283. package/out/pipeline/SpanHighlight.d.ts.map +1 -1
  284. package/out/pipeline/SpanHighlight.js +3 -2
  285. package/out/pipeline/SpanHighlight.js.map +1 -1
  286. package/out/pipeline/TimingPanel.d.ts +1 -1
  287. package/out/pipeline/TimingPanel.js +1 -1
  288. package/out/pipeline/TreeView.d.ts +1 -1
  289. package/out/pipeline/copy.d.ts +1 -1
  290. package/out/pipeline/copy.d.ts.map +1 -1
  291. package/out/pipeline/copy.js +4 -3
  292. package/out/pipeline/copy.js.map +1 -1
  293. package/out/pipeline/presets.d.ts +5 -4
  294. package/out/pipeline/presets.d.ts.map +1 -1
  295. package/out/pipeline/presets.js +15 -13
  296. package/out/pipeline/presets.js.map +1 -1
  297. package/out/pipeline/types.d.ts +21 -14
  298. package/out/pipeline/types.d.ts.map +1 -1
  299. package/out/pipeline/types.js +2 -4
  300. package/out/pipeline/types.js.map +1 -1
  301. package/out/pipeline/useParsePipeline.d.ts +15 -7
  302. package/out/pipeline/useParsePipeline.d.ts.map +1 -1
  303. package/out/pipeline/useParsePipeline.js +10 -7
  304. package/out/pipeline/useParsePipeline.js.map +1 -1
  305. package/out/pipeline.d.ts +33 -0
  306. package/out/pipeline.d.ts.map +1 -0
  307. package/out/pipeline.js +21 -0
  308. package/out/pipeline.js.map +1 -0
  309. package/out/poi/AbstainPanel.d.ts +1 -1
  310. package/out/poi/LiveResultsBlock.d.ts +2 -1
  311. package/out/poi/LiveResultsBlock.d.ts.map +1 -1
  312. package/out/poi/LiveResultsBlock.js +1 -1
  313. package/out/poi/LiveResultsBlock.js.map +1 -1
  314. package/out/poi/POIExplorer.d.ts +22 -12
  315. package/out/poi/POIExplorer.d.ts.map +1 -1
  316. package/out/poi/POIExplorer.js +10 -9
  317. package/out/poi/POIExplorer.js.map +1 -1
  318. package/out/poi/QueryInput.d.ts +1 -1
  319. package/out/poi/SubjectPanel.d.ts +2 -2
  320. package/out/poi/SubjectPanel.d.ts.map +1 -1
  321. package/out/poi/SubjectPanel.js +3 -2
  322. package/out/poi/SubjectPanel.js.map +1 -1
  323. package/out/poi/runtime.d.ts +5 -14
  324. package/out/poi/runtime.d.ts.map +1 -1
  325. package/out/poi/runtime.js +5 -16
  326. package/out/poi/runtime.js.map +1 -1
  327. package/out/poi/types.d.ts +39 -27
  328. package/out/poi/types.d.ts.map +1 -1
  329. package/out/poi/types.js +2 -4
  330. package/out/poi/types.js.map +1 -1
  331. package/out/poi/usePOISearch.d.ts +28 -17
  332. package/out/poi/usePOISearch.d.ts.map +1 -1
  333. package/out/poi/usePOISearch.js +6 -32
  334. package/out/poi/usePOISearch.js.map +1 -1
  335. package/out/poi.d.ts +23 -0
  336. package/out/poi.d.ts.map +1 -0
  337. package/out/poi.js +15 -0
  338. package/out/poi.js.map +1 -0
  339. package/out/runtime/useReleaseRuntime.d.ts +64 -65
  340. package/out/runtime/useReleaseRuntime.d.ts.map +1 -1
  341. package/out/runtime/useReleaseRuntime.js +31 -26
  342. package/out/runtime/useReleaseRuntime.js.map +1 -1
  343. package/out/runtime.d.ts +9 -0
  344. package/out/runtime.d.ts.map +1 -0
  345. package/out/runtime.js +8 -0
  346. package/out/runtime.js.map +1 -0
  347. package/out/search/SearchModal.d.ts +33 -0
  348. package/out/search/SearchModal.d.ts.map +1 -0
  349. package/out/search/SearchModal.js +187 -0
  350. package/out/search/SearchModal.js.map +1 -0
  351. package/out/search/types.d.ts +64 -0
  352. package/out/search/types.d.ts.map +1 -0
  353. package/out/search/types.js +13 -0
  354. package/out/search/types.js.map +1 -0
  355. package/out/search.d.ts +11 -0
  356. package/out/search.d.ts.map +1 -0
  357. package/out/search.js +9 -0
  358. package/out/search.js.map +1 -0
  359. package/package.json +132 -133
  360. package/styles.css +1340 -202
  361. package/tokens/index.css +26 -7
  362. package/tokens/tokens.json +121 -6
  363. package/tokens/tokens.resolver.json +1 -1
  364. package/lib/map/index.ts +0 -76
  365. package/out/map/index.d.ts +0 -52
  366. package/out/map/index.d.ts.map +0 -1
  367. package/out/map/index.js +0 -36
  368. package/out/map/index.js.map +0 -1
  369. package/styleframe.config.ts +0 -321
  370. 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
- * Drive the shared version → asset-bundle load state machine over a host-injected loader.
8
+ * Loads the release manifest on mount and the selected release's assets whenever
9
+ * the version or `forceWASM` changes.
22
10
  *
23
- * Sequence: on mount `loadManifest` runs and its `defaultVersion` becomes the selection; each version (or `forceWASM`)
24
- * change reloads the bundle via `loadAssets`, the previous load aborted first. The assets are revealed ATOMICALLY when
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
- // Latest manifest for the version-load effect, so it can resolve the release WITHOUT depending on `manifest`
43
- // identity — which would double-fire the load the instant the manifest first arrives (the selection transition
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":"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"}
1
+ {"version":3,"file":"useReleaseRuntime.js","sourceRoot":"","sources":["../../lib/runtime/useReleaseRuntime.ts"],"names":[],"mappings":"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"}
@@ -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,8 @@
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
+ //# sourceMappingURL=runtime.js.map
@@ -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"}
@@ -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"}