loom-browser 0.0.1
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/LICENSE +21 -0
- package/README.md +287 -0
- package/dist/igv.d.ts +667 -0
- package/dist/igv.esm.js +76708 -0
- package/dist/igv.esm.min.js +26 -0
- package/dist/igv.esm.min.js.map +1 -0
- package/dist/igv.js +76716 -0
- package/dist/igv.min.js +26 -0
- package/dist/igv.min.js.map +1 -0
- package/dist/loom.d.ts +667 -0
- package/dist/loom.esm.js +14927 -0
- package/dist/loom.esm.min.js +2 -0
- package/dist/loom.esm.min.js.map +1 -0
- package/dist/loom.js +15114 -0
- package/dist/loom.min.js +2 -0
- package/dist/loom.min.js.map +1 -0
- package/dist/types/agent/index.d.ts +4 -0
- package/dist/types/agent/stateProjection.d.ts +115 -0
- package/dist/types/agent/trackSelector.d.ts +31 -0
- package/dist/types/baseTrackCanvas.d.ts +62 -0
- package/dist/types/bigwig/binaryParser.d.ts +25 -0
- package/dist/types/bigwig/bpTree.d.ts +40 -0
- package/dist/types/bigwig/bwReader.d.ts +69 -0
- package/dist/types/bigwig/chromTree.d.ts +28 -0
- package/dist/types/bigwig/index.d.ts +66 -0
- package/dist/types/bigwig/inflate.d.ts +9 -0
- package/dist/types/bigwig/rangeReader.d.ts +48 -0
- package/dist/types/bigwig/rpTree.d.ts +27 -0
- package/dist/types/canvasProvider.d.ts +36 -0
- package/dist/types/commandDispatcher.d.ts +199 -0
- package/dist/types/contextMenu.d.ts +64 -0
- package/dist/types/contextMenuProvider.d.ts +25 -0
- package/dist/types/data/cachedSequence.d.ts +19 -0
- package/dist/types/data/ucscApi.d.ts +21 -0
- package/dist/types/data/ucscSequence.d.ts +19 -0
- package/dist/types/dataLifecycle.d.ts +16 -0
- package/dist/types/dataSources/bigWigDataSource.d.ts +24 -0
- package/dist/types/dataSources/dataSourceCacheKey.d.ts +9 -0
- package/dist/types/dataSources/dynseqDataSource.d.ts +20 -0
- package/dist/types/dataSources/featureSourceFactory.d.ts +46 -0
- package/dist/types/dataSources/geneDataSource.d.ts +16 -0
- package/dist/types/dataSources/gtxDataSource.d.ts +42 -0
- package/dist/types/dataSources/sequenceDataSource.d.ts +15 -0
- package/dist/types/dataSources/textFeatureSource.d.ts +63 -0
- package/dist/types/decode/bed.d.ts +64 -0
- package/dist/types/decode/bedpe.d.ts +36 -0
- package/dist/types/decode/exonUtils.d.ts +29 -0
- package/dist/types/decode/gff.d.ts +58 -0
- package/dist/types/decode/interact.d.ts +19 -0
- package/dist/types/decode/ucsc.d.ts +56 -0
- package/dist/types/dynseqRenderer.d.ts +37 -0
- package/dist/types/events.d.ts +23 -0
- package/dist/types/export/canvas2svg.d.ts +166 -0
- package/dist/types/export/index.d.ts +2 -0
- package/dist/types/featureCache.d.ts +69 -0
- package/dist/types/formats/featureParser.d.ts +72 -0
- package/dist/types/formats/formatDetection.d.ts +46 -0
- package/dist/types/geneRenderer.d.ts +17 -0
- package/dist/types/geneThemes.d.ts +11 -0
- package/dist/types/geneTrackCanvas.d.ts +46 -0
- package/dist/types/genome/chromAlias.d.ts +46 -0
- package/dist/types/genome/chromSizes.d.ts +53 -0
- package/dist/types/genome/genome.d.ts +51 -0
- package/dist/types/genomeBrowser.d.ts +189 -0
- package/dist/types/gtx/fetchCoordinator.d.ts +34 -0
- package/dist/types/gtx/gtxReader.d.ts +144 -0
- package/dist/types/gtx/index.d.ts +40 -0
- package/dist/types/gtx/zstdWasm.d.ts +22 -0
- package/dist/types/headlessGenomeBrowser.d.ts +450 -0
- package/dist/types/index.d.ts +123 -0
- package/dist/types/intervalTree.d.ts +56 -0
- package/dist/types/io/binaryParser.d.ts +25 -0
- package/dist/types/io/index.d.ts +7 -0
- package/dist/types/io/rangeReader.d.ts +48 -0
- package/dist/types/locusUtils.d.ts +37 -0
- package/dist/types/pack.d.ts +41 -0
- package/dist/types/popupProvider.d.ts +22 -0
- package/dist/types/remoteProtocol.d.ts +79 -0
- package/dist/types/renderTheme.d.ts +72 -0
- package/dist/types/renderThemePresets.d.ts +16 -0
- package/dist/types/roi/index.d.ts +3 -0
- package/dist/types/roi/roiRenderer.d.ts +24 -0
- package/dist/types/roi/roiSet.d.ts +41 -0
- package/dist/types/rulerRenderer.d.ts +14 -0
- package/dist/types/rulerTrackCanvas.d.ts +32 -0
- package/dist/types/sequence/sequenceUtils.d.ts +44 -0
- package/dist/types/session.d.ts +55 -0
- package/dist/types/src/bigwig/index.d.ts +66 -0
- package/dist/types/src/canvasProvider.d.ts +36 -0
- package/dist/types/src/commandDispatcher.d.ts +220 -0
- package/dist/types/src/contextMenu.d.ts +64 -0
- package/dist/types/src/contextMenuProvider.d.ts +25 -0
- package/dist/types/src/data/cachedSequence.d.ts +19 -0
- package/dist/types/src/data/ucscApi.d.ts +21 -0
- package/dist/types/src/data/ucscSequence.d.ts +19 -0
- package/dist/types/src/dataLifecycle.d.ts +16 -0
- package/dist/types/src/dataSources/bigWigDataSource.d.ts +24 -0
- package/dist/types/src/dataSources/dataSourceCacheKey.d.ts +9 -0
- package/dist/types/src/dataSources/featureSourceFactory.d.ts +46 -0
- package/dist/types/src/dataSources/geneDataSource.d.ts +16 -0
- package/dist/types/src/dataSources/gtxDataSource.d.ts +42 -0
- package/dist/types/src/dataSources/sequenceDataSource.d.ts +15 -0
- package/dist/types/src/dataSources/textFeatureSource.d.ts +63 -0
- package/dist/types/src/decode/bed.d.ts +64 -0
- package/dist/types/src/decode/bedpe.d.ts +36 -0
- package/dist/types/src/decode/exonUtils.d.ts +29 -0
- package/dist/types/src/decode/gff.d.ts +58 -0
- package/dist/types/src/decode/interact.d.ts +19 -0
- package/dist/types/src/decode/ucsc.d.ts +56 -0
- package/dist/types/src/events.d.ts +23 -0
- package/dist/types/src/export/canvas2svg.d.ts +166 -0
- package/dist/types/src/export/index.d.ts +2 -0
- package/dist/types/src/featureCache.d.ts +69 -0
- package/dist/types/src/formats/featureParser.d.ts +72 -0
- package/dist/types/src/formats/formatDetection.d.ts +46 -0
- package/dist/types/src/genome/chromAlias.d.ts +46 -0
- package/dist/types/src/genome/chromSizes.d.ts +53 -0
- package/dist/types/src/genome/genome.d.ts +51 -0
- package/dist/types/src/genomeBrowser.d.ts +189 -0
- package/dist/types/src/gtx/fetchCoordinator.d.ts +34 -0
- package/dist/types/src/gtx/gtxReader.d.ts +144 -0
- package/dist/types/src/gtx/index.d.ts +40 -0
- package/dist/types/src/gtx/zstdWasm.d.ts +22 -0
- package/dist/types/src/headlessGenomeBrowser.d.ts +450 -0
- package/dist/types/src/index.d.ts +123 -0
- package/dist/types/src/intervalTree.d.ts +56 -0
- package/dist/types/src/io/binaryParser.d.ts +25 -0
- package/dist/types/src/io/index.d.ts +7 -0
- package/dist/types/src/io/rangeReader.d.ts +48 -0
- package/dist/types/src/locusUtils.d.ts +37 -0
- package/dist/types/src/pack.d.ts +41 -0
- package/dist/types/src/popupProvider.d.ts +22 -0
- package/dist/types/src/remoteProtocol.d.ts +81 -0
- package/dist/types/src/roi/index.d.ts +3 -0
- package/dist/types/src/roi/roiRenderer.d.ts +24 -0
- package/dist/types/src/roi/roiSet.d.ts +41 -0
- package/dist/types/src/sequence/sequenceUtils.d.ts +44 -0
- package/dist/types/src/session.d.ts +55 -0
- package/dist/types/src/stateProjection.d.ts +115 -0
- package/dist/types/src/tabix/index.d.ts +48 -0
- package/dist/types/src/themes/index.d.ts +3 -0
- package/dist/types/src/themes/renderTheme.d.ts +86 -0
- package/dist/types/src/themes/renderThemePresets.d.ts +16 -0
- package/dist/types/src/trackRegistry.d.ts +81 -0
- package/dist/types/src/trackSelector.d.ts +31 -0
- package/dist/types/src/tracks/annotation/annotationRenderer.d.ts +17 -0
- package/dist/types/src/tracks/annotation/annotationThemes.d.ts +11 -0
- package/dist/types/src/tracks/annotation/annotationTrackCanvas.d.ts +58 -0
- package/dist/types/src/tracks/annotation/index.d.ts +4 -0
- package/dist/types/src/tracks/axis/axisRenderer.d.ts +19 -0
- package/dist/types/src/tracks/axis/index.d.ts +1 -0
- package/dist/types/src/tracks/baseTrackCanvas.d.ts +113 -0
- package/dist/types/src/tracks/dynseq/dynseqRenderer.d.ts +38 -0
- package/dist/types/src/tracks/dynseq/index.d.ts +1 -0
- package/dist/types/src/tracks/index.d.ts +7 -0
- package/dist/types/src/tracks/interaction/index.d.ts +4 -0
- package/dist/types/src/tracks/interaction/interactionRenderer.d.ts +52 -0
- package/dist/types/src/tracks/interaction/interactionTrackCanvas.d.ts +54 -0
- package/dist/types/src/tracks/ruler/index.d.ts +3 -0
- package/dist/types/src/tracks/ruler/rulerRenderer.d.ts +25 -0
- package/dist/types/src/tracks/ruler/rulerTrackCanvas.d.ts +43 -0
- package/dist/types/src/tracks/sequence/index.d.ts +5 -0
- package/dist/types/src/tracks/sequence/sequenceRenderer.d.ts +34 -0
- package/dist/types/src/tracks/sequence/sequenceThemes.d.ts +11 -0
- package/dist/types/src/tracks/sequence/sequenceTrackCanvas.d.ts +67 -0
- package/dist/types/src/tracks/wig/index.d.ts +5 -0
- package/dist/types/src/tracks/wig/wigRenderer.d.ts +15 -0
- package/dist/types/src/tracks/wig/wigSummary.d.ts +31 -0
- package/dist/types/src/tracks/wig/wigThemes.d.ts +15 -0
- package/dist/types/src/tracks/wig/wigTrackCanvas.d.ts +82 -0
- package/dist/types/src/types.d.ts +885 -0
- package/dist/types/src/ui/components/LoomBrowserShell.d.ts +52 -0
- package/dist/types/src/ui/components/LoomChromosomeSelect.d.ts +18 -0
- package/dist/types/src/ui/components/LoomContextMenu.d.ts +39 -0
- package/dist/types/src/ui/components/LoomExportControls.d.ts +13 -0
- package/dist/types/src/ui/components/LoomInputDialog.d.ts +27 -0
- package/dist/types/src/ui/components/LoomLocusInput.d.ts +18 -0
- package/dist/types/src/ui/components/LoomNavbar.d.ts +15 -0
- package/dist/types/src/ui/components/LoomPopup.d.ts +32 -0
- package/dist/types/src/ui/components/LoomWindowSize.d.ts +14 -0
- package/dist/types/src/ui/components/LoomZoomControls.d.ts +10 -0
- package/dist/types/src/ui/index.d.ts +21 -0
- package/dist/types/src/ui/themes.d.ts +14 -0
- package/dist/types/src/worker/nodeWorkerProvider.d.ts +28 -0
- package/dist/types/src/worker/taskHandler.d.ts +15 -0
- package/dist/types/src/worker/webWorkerProvider.d.ts +51 -0
- package/dist/types/src/worker/workerScript.d.ts +11 -0
- package/dist/types/src/workerProvider.d.ts +76 -0
- package/dist/types/stateProjection.d.ts +115 -0
- package/dist/types/tabix/bgzBlockLoader.d.ts +60 -0
- package/dist/types/tabix/bgzf.d.ts +43 -0
- package/dist/types/tabix/index.d.ts +48 -0
- package/dist/types/tabix/tabixIndex.d.ts +85 -0
- package/dist/types/tabix/tabixReader.d.ts +60 -0
- package/dist/types/tabix/virtualOffset.d.ts +41 -0
- package/dist/types/test/src/mockCanvasProvider.d.ts +67 -0
- package/dist/types/test/src/testBedDecode.d.ts +1 -0
- package/dist/types/test/src/testCanvas2SVG.d.ts +7 -0
- package/dist/types/test/src/testChromAlias.d.ts +1 -0
- package/dist/types/test/src/testCommandDispatcher.d.ts +1 -0
- package/dist/types/test/src/testData.d.ts +7 -0
- package/dist/types/test/src/testDataLifecycle.d.ts +1 -0
- package/dist/types/test/src/testDataSourceCacheKey.d.ts +1 -0
- package/dist/types/test/src/testDataSources.d.ts +5 -0
- package/dist/types/test/src/testDecodeUcsc.d.ts +1 -0
- package/dist/types/test/src/testEvents.d.ts +1 -0
- package/dist/types/test/src/testFeatureCache.d.ts +1 -0
- package/dist/types/test/src/testFeatureParser.d.ts +1 -0
- package/dist/types/test/src/testFormatDetection.d.ts +1 -0
- package/dist/types/test/src/testGffDecode.d.ts +1 -0
- package/dist/types/test/src/testHeadlessBrowser.d.ts +1 -0
- package/dist/types/test/src/testInteractionDecoder.d.ts +1 -0
- package/dist/types/test/src/testIntervalTree.d.ts +1 -0
- package/dist/types/test/src/testLocusUtils.d.ts +1 -0
- package/dist/types/test/src/testPack.d.ts +1 -0
- package/dist/types/test/src/testROI.d.ts +1 -0
- package/dist/types/test/src/testRemoteProtocol.d.ts +1 -0
- package/dist/types/test/src/testRenderTheme.d.ts +1 -0
- package/dist/types/test/src/testSVGExport.d.ts +5 -0
- package/dist/types/test/src/testSequence.d.ts +1 -0
- package/dist/types/test/src/testSession.d.ts +1 -0
- package/dist/types/test/src/testTrackSelector.d.ts +1 -0
- package/dist/types/test/src/testTrackSerialize.d.ts +1 -0
- package/dist/types/test/src/testWigSummary.d.ts +1 -0
- package/dist/types/test/src/testWorkerDispatch.d.ts +9 -0
- package/dist/types/themes/index.d.ts +3 -0
- package/dist/types/themes/renderTheme.d.ts +86 -0
- package/dist/types/themes/renderThemePresets.d.ts +16 -0
- package/dist/types/trackRegistry.d.ts +81 -0
- package/dist/types/trackSelector.d.ts +31 -0
- package/dist/types/tracks/annotation/annotationRenderer.d.ts +17 -0
- package/dist/types/tracks/annotation/annotationThemes.d.ts +11 -0
- package/dist/types/tracks/annotation/annotationTrackCanvas.d.ts +58 -0
- package/dist/types/tracks/annotation/index.d.ts +4 -0
- package/dist/types/tracks/axis/axisRenderer.d.ts +19 -0
- package/dist/types/tracks/axis/index.d.ts +1 -0
- package/dist/types/tracks/baseTrackCanvas.d.ts +113 -0
- package/dist/types/tracks/dynseq/dynseqRenderer.d.ts +38 -0
- package/dist/types/tracks/dynseq/index.d.ts +1 -0
- package/dist/types/tracks/gene/geneRenderer.d.ts +17 -0
- package/dist/types/tracks/gene/geneThemes.d.ts +11 -0
- package/dist/types/tracks/gene/geneTrackCanvas.d.ts +58 -0
- package/dist/types/tracks/gene/index.d.ts +4 -0
- package/dist/types/tracks/index.d.ts +7 -0
- package/dist/types/tracks/interaction/index.d.ts +4 -0
- package/dist/types/tracks/interaction/interactionRenderer.d.ts +52 -0
- package/dist/types/tracks/interaction/interactionTrackCanvas.d.ts +54 -0
- package/dist/types/tracks/ruler/index.d.ts +3 -0
- package/dist/types/tracks/ruler/rulerRenderer.d.ts +25 -0
- package/dist/types/tracks/ruler/rulerTrackCanvas.d.ts +43 -0
- package/dist/types/tracks/sequence/index.d.ts +5 -0
- package/dist/types/tracks/sequence/sequenceRenderer.d.ts +34 -0
- package/dist/types/tracks/sequence/sequenceThemes.d.ts +11 -0
- package/dist/types/tracks/sequence/sequenceTrackCanvas.d.ts +67 -0
- package/dist/types/tracks/wig/index.d.ts +5 -0
- package/dist/types/tracks/wig/wigRenderer.d.ts +15 -0
- package/dist/types/tracks/wig/wigSummary.d.ts +31 -0
- package/dist/types/tracks/wig/wigThemes.d.ts +15 -0
- package/dist/types/tracks/wig/wigTrackCanvas.d.ts +82 -0
- package/dist/types/types.d.ts +885 -0
- package/dist/types/ui/components/IgvBrowserShell.d.ts +52 -0
- package/dist/types/ui/components/IgvChromosomeSelect.d.ts +18 -0
- package/dist/types/ui/components/IgvExportControls.d.ts +13 -0
- package/dist/types/ui/components/IgvLocusInput.d.ts +18 -0
- package/dist/types/ui/components/IgvNavbar.d.ts +15 -0
- package/dist/types/ui/components/IgvWindowSize.d.ts +14 -0
- package/dist/types/ui/components/IgvZoomControls.d.ts +10 -0
- package/dist/types/ui/components/LoomBrowserShell.d.ts +52 -0
- package/dist/types/ui/components/LoomChromosomeSelect.d.ts +18 -0
- package/dist/types/ui/components/LoomContextMenu.d.ts +39 -0
- package/dist/types/ui/components/LoomExportControls.d.ts +13 -0
- package/dist/types/ui/components/LoomInputDialog.d.ts +27 -0
- package/dist/types/ui/components/LoomLocusInput.d.ts +18 -0
- package/dist/types/ui/components/LoomNavbar.d.ts +15 -0
- package/dist/types/ui/components/LoomPopup.d.ts +32 -0
- package/dist/types/ui/components/LoomWindowSize.d.ts +14 -0
- package/dist/types/ui/components/LoomZoomControls.d.ts +10 -0
- package/dist/types/ui/index.d.ts +21 -0
- package/dist/types/ui/themes.d.ts +14 -0
- package/dist/types/wigRenderer.d.ts +15 -0
- package/dist/types/wigSummary.d.ts +31 -0
- package/dist/types/wigThemes.d.ts +15 -0
- package/dist/types/wigTrackCanvas.d.ts +46 -0
- package/dist/types/worker/decodeWig.d.ts +20 -0
- package/dist/types/worker/nodeWorkerProvider.d.ts +28 -0
- package/dist/types/worker/taskHandler.d.ts +15 -0
- package/dist/types/worker/webWorkerProvider.d.ts +51 -0
- package/dist/types/worker/workerScript.d.ts +11 -0
- package/dist/types/workerProvider.d.ts +76 -0
- package/package.json +102 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2014-2025 Broad Institute of MIT and Harvard, Regents of the University of California
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="docs-site/static/img/logo.svg" alt="Loom" width="200" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">Loom</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">A modular, headless-first genomic visualization engine built in TypeScript.</p>
|
|
8
|
+
|
|
9
|
+
[](https://www.npmjs.com/package/loom-browser)
|
|
10
|
+
[](LICENSE)
|
|
11
|
+
|
|
12
|
+
Loom renders genomic tracks (genes, signal, sequence, interactions) to Canvas or SVG. It works headlessly in Node for server-side rendering, in web workers, and in the browser with full interactivity.
|
|
13
|
+
|
|
14
|
+
## Quick Start
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
npm install loom-browser
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Interactive browser (DOM)
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { GenomeBrowser } from 'loom-browser'
|
|
24
|
+
|
|
25
|
+
const browser = new GenomeBrowser(document.getElementById('container')!, {
|
|
26
|
+
locus: { chr: 'chr17', start: 7_668_000, end: 7_688_000 },
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
browser.addRuler()
|
|
30
|
+
browser.addGeneTrack() // UCSC RefSeq genes
|
|
31
|
+
browser.addWigTrack('https://example.com/signal.bigWig', {
|
|
32
|
+
config: { color: '#4A90D9', height: 80 },
|
|
33
|
+
})
|
|
34
|
+
browser.addBedTrack('https://example.com/peaks.bed.gz')
|
|
35
|
+
browser.addInteractionTrack('https://example.com/loops.bedpe')
|
|
36
|
+
browser.addSequenceTrack() // visible at base-level zoom
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Built-in drag-to-pan, sweep-to-zoom on the ruler, pinch-to-zoom, and responsive resizing — no setup needed.
|
|
40
|
+
|
|
41
|
+
### Headless (Node / SSR)
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
import { HeadlessGenomeBrowser } from 'loom-browser'
|
|
45
|
+
|
|
46
|
+
const browser = new HeadlessGenomeBrowser({
|
|
47
|
+
locus: { chr: 'chr17', start: 7_668_000, end: 7_688_000 },
|
|
48
|
+
viewportWidth: 1200,
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
browser.addRuler()
|
|
52
|
+
browser.addGeneTrack()
|
|
53
|
+
browser.addWigTrack('https://example.com/signal.bigWig')
|
|
54
|
+
|
|
55
|
+
// Wait for data, then export
|
|
56
|
+
browser.on('dataloaded', () => {
|
|
57
|
+
const svg = browser.toSVG({ width: 1200, backdropColor: '#fff' })
|
|
58
|
+
fs.writeFileSync('output.svg', svg)
|
|
59
|
+
})
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### UI Shell (web components)
|
|
63
|
+
|
|
64
|
+
Drop in a full browser shell with navbar, locus search, zoom controls, and export buttons:
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
import { createShell } from 'loom-browser'
|
|
68
|
+
|
|
69
|
+
const shell = createShell(document.getElementById('container')!, {
|
|
70
|
+
locus: { chr: 'chr17', start: 7_668_000, end: 7_688_000 },
|
|
71
|
+
shellTheme: 'modern', // 'classic' | 'modern' | 'dark'
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
shell.browser.addRuler()
|
|
75
|
+
shell.browser.addGeneTrack()
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Or use the custom element directly:
|
|
79
|
+
|
|
80
|
+
```html
|
|
81
|
+
<loom-browser theme="modern" id="my-browser"></loom-browser>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Track Types
|
|
85
|
+
|
|
86
|
+
| Type | Method | Formats | Description |
|
|
87
|
+
|------|--------|---------|-------------|
|
|
88
|
+
| **Ruler** | `addRuler()` | — | Genomic coordinate axis with tick marks |
|
|
89
|
+
| **Gene / Annotation** | `addGeneTrack()`, `addBedTrack(url)` | BED, GFF3, GTF, GenePred, RefFlat, NarrowPeak, BroadPeak | Gene models with exons, UTR, strand arrows, labels |
|
|
90
|
+
| **Signal** | `addWigTrack(url)` | BigWig, BedGraph | Bar, line, points, or dynamic-sequence graphs with autoscale |
|
|
91
|
+
| **Sequence** | `addSequenceTrack()` | UCSC API | DNA bases with optional 3-frame translation |
|
|
92
|
+
| **Interaction** | `addInteractionTrack(url)` | BEDPE, UCSC interact | Arc diagrams for chromatin loops and contacts |
|
|
93
|
+
|
|
94
|
+
## Navigation
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
browser.search('TP53') // gene name lookup
|
|
98
|
+
browser.search('chr17:7,668,000-7,688,000') // locus string
|
|
99
|
+
browser.setLocus({ chr: 'chr17', start: 7_668_000, end: 7_688_000 })
|
|
100
|
+
browser.zoomIn() // 2x
|
|
101
|
+
browser.zoomOut(4) // 4x
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Events
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
browser.on('locuschange', ({ locus }) => { /* navigation happened */ })
|
|
108
|
+
browser.on('dataloaded', ({ track }) => { /* track finished loading */ })
|
|
109
|
+
browser.on('trackclick', ({ track, feature, x, y }) => { /* feature clicked */ })
|
|
110
|
+
browser.on('trackcontextmenu', ({ track, feature, x, y }) => { /* right-click */ })
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Full list: `locuschange`, `trackadded`, `trackremoved`, `trackorderchanged`, `dataloaded`, `dataerror`, `rendererror`, `trackclick`, `trackhover`, `trackcontextmenu`, `roiadded`, `roiremoved`, `roichanged`, `roiclick`, `roicontextmenu`.
|
|
114
|
+
|
|
115
|
+
## Themes
|
|
116
|
+
|
|
117
|
+
Three built-in render themes control colors for all track types:
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
import { defaultRenderTheme, modernRenderTheme, darkRenderTheme } from 'loom-browser'
|
|
121
|
+
|
|
122
|
+
const browser = new GenomeBrowser(container, {
|
|
123
|
+
locus,
|
|
124
|
+
theme: darkRenderTheme,
|
|
125
|
+
})
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Override individual properties or provide per-track overrides:
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
browser.addWigTrack(url, {
|
|
132
|
+
config: { color: '#E74C3C', graphType: 'line', height: 60 },
|
|
133
|
+
})
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Export
|
|
137
|
+
|
|
138
|
+
```ts
|
|
139
|
+
// SVG string
|
|
140
|
+
const svg = browser.toSVG({ width: 1200, backdropColor: '#ffffff' })
|
|
141
|
+
|
|
142
|
+
// PNG data URL (DOM browser only)
|
|
143
|
+
const png = await browser.toPNG()
|
|
144
|
+
|
|
145
|
+
// Download files
|
|
146
|
+
browser.saveSVGtoFile('my-region.svg')
|
|
147
|
+
await browser.savePNGtoFile('my-region.png')
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Regions of Interest (ROIs)
|
|
151
|
+
|
|
152
|
+
```ts
|
|
153
|
+
browser.addROI({
|
|
154
|
+
chr: 'chr17', start: 7_674_000, end: 7_676_000,
|
|
155
|
+
color: 'rgba(255, 0, 0, 0.15)',
|
|
156
|
+
label: 'Exon 7',
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
const rois = browser.getVisibleROIs()
|
|
160
|
+
browser.removeROI(rois[0].id)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Sessions
|
|
164
|
+
|
|
165
|
+
Save and restore browser state:
|
|
166
|
+
|
|
167
|
+
```ts
|
|
168
|
+
const session = browser.toJSON() // serialize
|
|
169
|
+
browser.loadSession(session) // restore
|
|
170
|
+
|
|
171
|
+
// Import from igv.js session format
|
|
172
|
+
import { fromIgvSession } from 'loom-browser'
|
|
173
|
+
const loomSession = fromIgvSession(igvSessionObject)
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## Remote Control (WebSocket)
|
|
177
|
+
|
|
178
|
+
Let an LLM or agent control the browser over WebSocket:
|
|
179
|
+
|
|
180
|
+
```ts
|
|
181
|
+
const ws = new WebSocket('wss://your-server/browser')
|
|
182
|
+
browser.attachRemote(ws)
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Or use `CommandDispatcher` in-process:
|
|
186
|
+
|
|
187
|
+
```ts
|
|
188
|
+
import { CommandDispatcher } from 'loom-browser'
|
|
189
|
+
|
|
190
|
+
const dispatcher = new CommandDispatcher(browser)
|
|
191
|
+
const state = await dispatcher.dispatch({ command: 'get_browser_state' })
|
|
192
|
+
await dispatcher.dispatch({ command: 'navigate', locus: 'BRCA1' })
|
|
193
|
+
await dispatcher.dispatch({
|
|
194
|
+
command: 'modify_tracks',
|
|
195
|
+
actions: [{ action: 'add', type: 'wig', url: 'https://example.com/signal.bigWig' }],
|
|
196
|
+
})
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Commands: `get_browser_state`, `navigate`, `modify_tracks`, `query_features`, `set_layout`, `export_view`, `manage_rois`, `subscribe_events`.
|
|
200
|
+
|
|
201
|
+
## State Projection
|
|
202
|
+
|
|
203
|
+
Inspect browser state programmatically (useful for agents/LLMs):
|
|
204
|
+
|
|
205
|
+
```ts
|
|
206
|
+
const state = browser.state.getState()
|
|
207
|
+
// { locus, locusString, span, zoomLevel, tracks: [...], rois: [...] }
|
|
208
|
+
|
|
209
|
+
// Diff workflow
|
|
210
|
+
browser.state.getState({ record: 'before' })
|
|
211
|
+
browser.search('chr1:1,000,000-2,000,000')
|
|
212
|
+
const diff = browser.state.diff('before')
|
|
213
|
+
// { locus: { from, to }, zoomLevel: { from, to }, ... }
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Web Workers
|
|
217
|
+
|
|
218
|
+
Offload BigWig decoding and feature packing to a worker thread:
|
|
219
|
+
|
|
220
|
+
```ts
|
|
221
|
+
import { GenomeBrowser, WebWorkerProvider } from 'loom-browser'
|
|
222
|
+
|
|
223
|
+
const browser = new GenomeBrowser(container, {
|
|
224
|
+
locus,
|
|
225
|
+
workerProvider: new WebWorkerProvider('/loom-worker.js'),
|
|
226
|
+
})
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
In Node:
|
|
230
|
+
|
|
231
|
+
```ts
|
|
232
|
+
import { NodeWorkerProvider } from 'loom-browser'
|
|
233
|
+
const browser = new HeadlessGenomeBrowser({
|
|
234
|
+
locus,
|
|
235
|
+
viewportWidth: 1200,
|
|
236
|
+
workerProvider: new NodeWorkerProvider(),
|
|
237
|
+
})
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Low-Level Renderer API
|
|
241
|
+
|
|
242
|
+
Use standalone renderers and track canvases directly — no browser instance needed:
|
|
243
|
+
|
|
244
|
+
```ts
|
|
245
|
+
import { AnnotationTrackCanvas, fetchGeneFeatures } from 'loom-browser'
|
|
246
|
+
|
|
247
|
+
const canvas = document.createElement('canvas')
|
|
248
|
+
const track = new AnnotationTrackCanvas(canvas, {
|
|
249
|
+
locus: { chr: 'chr17', start: 7_668_000, end: 7_688_000 },
|
|
250
|
+
features: [],
|
|
251
|
+
config: { displayMode: 'EXPANDED', featureHeight: 14, drawLabels: true },
|
|
252
|
+
})
|
|
253
|
+
track.attachTo(document.getElementById('track-container')!)
|
|
254
|
+
|
|
255
|
+
const features = await fetchGeneFeatures(track.locus)
|
|
256
|
+
track.setFeatures(features)
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Architecture
|
|
260
|
+
|
|
261
|
+
Loom uses a four-layer architecture. Each layer has zero dependencies on the layers above it:
|
|
262
|
+
|
|
263
|
+
1. **Data + Layout** — Types, decoders, data sources, feature packing. No DOM, no canvas. Safe for Node and workers.
|
|
264
|
+
2. **Renderers** — Stateless pure functions: `(ctx, features, config, viewport) → pixels`. Takes `CanvasRenderingContext2D`, no DOM.
|
|
265
|
+
3. **Headless Browser** — Track orchestration, data lifecycle, navigation, session serialization, SVG export. No DOM.
|
|
266
|
+
4. **DOM Shell** — `GenomeBrowser` adds pointer events, drag/pan/zoom, axis columns, ResizeObserver. Web components for UI.
|
|
267
|
+
|
|
268
|
+
## Development
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
git clone https://github.com/riyavsinha/loom.git
|
|
272
|
+
cd loom
|
|
273
|
+
npm install
|
|
274
|
+
npm run build
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
```
|
|
278
|
+
npm test # unit tests (Vitest)
|
|
279
|
+
npm run typecheck # type check src/
|
|
280
|
+
npx tsc --noEmit # type check js/ (legacy)
|
|
281
|
+
npm run storybook # component stories
|
|
282
|
+
npm run test:visual # Playwright screenshot tests
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
## License
|
|
286
|
+
|
|
287
|
+
[MIT](LICENSE)
|