loom-browser 0.0.9 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/loom-react.esm.js +3810 -3099
- package/dist/loom-react.esm.min.js +1 -1
- package/dist/loom-react.esm.min.js.map +1 -1
- package/dist/loom-worker.js +191 -137
- package/dist/loom-worker.min.js +1 -1
- package/dist/loom-worker.min.js.map +1 -1
- package/dist/loom.esm.js +3641 -2883
- package/dist/loom.esm.min.js +1 -1
- package/dist/loom.esm.min.js.map +1 -1
- package/dist/loom.js +3652 -2886
- package/dist/loom.min.js +1 -1
- package/dist/loom.min.js.map +1 -1
- package/dist/tsconfig.src.tsbuildinfo +1 -1
- package/dist/types/browser/dom/browserExport.d.ts +32 -0
- package/dist/types/browser/dom/contextMenu.d.ts +64 -0
- package/dist/types/browser/dom/contextMenuManager.d.ts +49 -0
- package/dist/types/browser/dom/defaultProviders.d.ts +23 -0
- package/dist/types/browser/dom/genomeBrowser.d.ts +171 -0
- package/dist/types/browser/dom/pointerEventManager.d.ts +109 -0
- package/dist/types/browser/dom/roiOverlayManager.d.ts +38 -0
- package/dist/types/browser/dom/svgFeatureOverlay.d.ts +27 -0
- package/dist/types/browser/headless/errors.d.ts +10 -0
- package/dist/types/browser/headless/headlessGenomeBrowser.d.ts +391 -0
- package/dist/types/browser/headless/roiManager.d.ts +47 -0
- package/dist/types/browser/headless/session.d.ts +45 -0
- package/dist/types/browser/headless/trackDataManager.d.ts +53 -0
- package/dist/types/browser/headless/trackFactories.d.ts +145 -0
- package/dist/types/browser/index.d.ts +24 -0
- package/dist/types/browserExport.d.ts +32 -0
- package/dist/types/commandDispatcher.d.ts +1 -1
- package/dist/types/contextMenuManager.d.ts +49 -0
- package/dist/types/data/searchService.d.ts +24 -0
- package/dist/types/dataSourceWorkerProvider.d.ts +3 -3
- package/dist/types/dataSources/bigWigDataSource.d.ts +2 -2
- package/dist/types/dataSources/config.d.ts +40 -0
- package/dist/types/dataSources/configureDataSource.d.ts +17 -0
- package/dist/types/dataSources/createDataSource.d.ts +14 -0
- package/dist/types/dataSources/geneDataSource.d.ts +4 -3
- package/dist/types/dataSources/gtxDataSource.d.ts +2 -2
- package/dist/types/dataSources/memoryDataSource.d.ts +2 -2
- package/dist/types/dataSources/sequenceDataSource.d.ts +4 -1
- package/dist/types/dataSources/textFeatureSource.d.ts +4 -2
- package/dist/types/dataSources/wholeGenomeUtils.d.ts +37 -0
- package/dist/types/defaultProviders.d.ts +23 -0
- package/dist/types/errors.d.ts +10 -0
- package/dist/types/formats/featureParser.d.ts +1 -1
- package/dist/types/genomeBrowser.d.ts +18 -91
- package/dist/types/headlessGenomeBrowser.d.ts +88 -225
- package/dist/types/index.d.ts +21 -14
- package/dist/types/io/binaryParser.d.ts +0 -1
- package/dist/types/logger.d.ts +20 -0
- package/dist/types/pointerEventManager.d.ts +109 -0
- package/dist/types/react/GenomeBrowserContext.d.ts +1 -1
- package/dist/types/react/LoomBrowser.d.ts +4 -4
- package/dist/types/react/hooks/useBrowserEvent.d.ts +1 -1
- package/dist/types/react/hooks/useGenomeBrowser.d.ts +1 -1
- package/dist/types/react/hooks/useTrackManager.d.ts +1 -1
- package/dist/types/react/tracks/BedTrack.d.ts +7 -7
- package/dist/types/react/ui/ChromosomeSelect.d.ts +1 -1
- package/dist/types/react/ui/ExportControls.d.ts +1 -1
- package/dist/types/react/ui/LocusInput.d.ts +1 -1
- package/dist/types/react/ui/Navbar.d.ts +1 -1
- package/dist/types/react/ui/WindowSize.d.ts +1 -1
- package/dist/types/react/ui/ZoomControls.d.ts +1 -1
- package/dist/types/remoteProtocol.d.ts +1 -1
- package/dist/types/roiManager.d.ts +47 -0
- package/dist/types/roiOverlayManager.d.ts +38 -0
- package/dist/types/stateProjection.d.ts +1 -1
- package/dist/types/trackDataManager.d.ts +48 -0
- package/dist/types/trackFactories.d.ts +140 -0
- package/dist/types/trackSelector.d.ts +1 -1
- package/dist/types/tracks/annotation/annotationTrackCanvas.d.ts +0 -1
- package/dist/types/tracks/annotation/config.d.ts +61 -0
- package/dist/types/tracks/baseTrackCanvas.d.ts +10 -0
- package/dist/types/tracks/configDiff.d.ts +14 -0
- package/dist/types/tracks/interaction/config.d.ts +40 -0
- package/dist/types/tracks/ruler/config.d.ts +24 -0
- package/dist/types/tracks/sequence/config.d.ts +56 -0
- package/dist/types/tracks/sequence/sequenceTrackCanvas.d.ts +3 -0
- package/dist/types/tracks/wig/config.d.ts +77 -0
- package/dist/types/types/igvCompat.d.ts +36 -0
- package/dist/types/types.d.ts +48 -284
- package/dist/types/ui/components/LoomBrowserShell.d.ts +2 -2
- package/dist/types/ui/components/LoomChromosomeSelect.d.ts +1 -1
- package/dist/types/ui/components/LoomContextMenu.d.ts +1 -0
- package/dist/types/ui/components/LoomExportControls.d.ts +1 -1
- package/dist/types/ui/components/LoomLocusInput.d.ts +1 -1
- package/dist/types/ui/components/LoomNavbar.d.ts +1 -1
- package/dist/types/ui/components/LoomWindowSize.d.ts +1 -1
- package/dist/types/ui/components/LoomZoomControls.d.ts +1 -1
- package/dist/types/undoManager.d.ts +49 -0
- package/dist/types/worker/dataSourceRegistry.d.ts +2 -2
- package/dist/types/worker/serializedError.d.ts +16 -0
- package/dist/types/worker/taskTimeout.d.ts +21 -0
- package/dist/types/worker/webWorkerPool.d.ts +5 -2
- package/dist/types/worker/webWorkerProvider.d.ts +3 -0
- package/dist/types/workerDataSource.d.ts +2 -2
- package/dist/types/workerProvider.d.ts +2 -2
- package/package.json +1 -1
package/dist/types/index.d.ts
CHANGED
|
@@ -2,8 +2,8 @@ export type { CanvasProvider, CanvasAndContext } from './canvasProvider';
|
|
|
2
2
|
export { DOMCanvasProvider, defaultCanvasProvider } from './canvasProvider';
|
|
3
3
|
export type { PopupProvider } from './popupProvider';
|
|
4
4
|
export type { ContextMenuProvider } from './contextMenuProvider';
|
|
5
|
-
export type { ContextMenuCallbacks, ROIMenuCallbacks } from './contextMenu';
|
|
6
|
-
export { commonContextMenuItems, numericDataMenuItems, roiContextMenuItems } from './contextMenu';
|
|
5
|
+
export type { ContextMenuCallbacks, ROIMenuCallbacks } from './browser/dom/contextMenu';
|
|
6
|
+
export { commonContextMenuItems, numericDataMenuItems, roiContextMenuItems } from './browser/dom/contextMenu';
|
|
7
7
|
export type { WorkerProvider, WorkerTask, WorkerTaskResultMap } from './workerProvider';
|
|
8
8
|
export type { PackTask, SummarizeWigTask, ComputeWigRangeTask, ParseFeaturesTask, } from './workerProvider';
|
|
9
9
|
export { MainThreadProvider, mainThreadProvider } from './workerProvider';
|
|
@@ -23,10 +23,12 @@ export type { SequenceRenderConfig, SequenceType, SequenceTrackSessionConfig, Se
|
|
|
23
23
|
export { defaultSequenceRenderConfig } from './types';
|
|
24
24
|
export type { InteractionFeature, InteractionRenderConfig, ArcOrientation, ArcDisplayMode, InteractionTrackSessionConfig, InteractionSessionOverrides } from './types';
|
|
25
25
|
export { defaultInteractionRenderConfig } from './types';
|
|
26
|
-
export type { DataSource, FeatureCacheEntry, DataDrivenTrack } from './types';
|
|
26
|
+
export type { DataSource, ConfigurableDataSource, DataSourceConfigMethod, FeatureCacheEntry, DataDrivenTrack, ZoomAwareTrack } from './types';
|
|
27
|
+
export { isZoomAware } from './types';
|
|
27
28
|
export type { PopupDataItem, HitTestResult, TrackInteractionEvent, ContextMenuItem, TrackContextMenuEvent, NumericState, ROI, ROISetConfig, ROIInteractionEvent, FeatureRect } from './types';
|
|
28
|
-
export type { SessionConfig, TrackSessionConfig, WigTrackSessionConfig, AnnotationTrackSessionConfig, RulerTrackSessionConfig, WigSessionOverrides, AnnotationSessionOverrides, RulerSessionOverrides, DataSourceConfig, BigWigDataSourceConfig, GtxDataSourceConfig, UCSCDataSourceConfig, TextDataSourceConfig, MemoryDataSourceConfig, SequenceProvider,
|
|
29
|
+
export type { SessionConfig, TrackSessionConfig, WigTrackSessionConfig, AnnotationTrackSessionConfig, RulerTrackSessionConfig, WigSessionOverrides, AnnotationSessionOverrides, RulerSessionOverrides, DataSourceConfig, BigWigDataSourceConfig, GtxDataSourceConfig, UCSCDataSourceConfig, TextDataSourceConfig, MemoryDataSourceConfig, SequenceProvider, Chromosome, Genome, GenomeConfig, ChromAliasRecord, Strand, TextFileFormat, BedFeature, PeakFeature, BedGraphFeature, GFFRecord, GFFFeature, TextFeature, } from './types';
|
|
29
30
|
export { defaultAnnotationRenderConfig, defaultRulerRenderConfig, defaultWigRenderConfig } from './types';
|
|
31
|
+
export type { IgvSessionObject, IgvReferenceConfig, IgvTrackConfig } from './types/igvCompat';
|
|
30
32
|
export type { Packable } from './pack';
|
|
31
33
|
export { packFeatures } from './pack';
|
|
32
34
|
export { renderAnnotationTrack } from './tracks/annotation/annotationRenderer';
|
|
@@ -41,14 +43,20 @@ export { renderWigTrack } from './tracks/wig/wigRenderer';
|
|
|
41
43
|
export { WigTrackCanvas } from './tracks/wig/wigTrackCanvas';
|
|
42
44
|
export type { WigTrackCanvasOptions } from './tracks/wig/wigTrackCanvas';
|
|
43
45
|
export { summarizeWigData, computeWigDataRange } from './tracks/wig/wigSummary';
|
|
44
|
-
export { HeadlessGenomeBrowser, BrowserEvent } from './headlessGenomeBrowser';
|
|
45
|
-
export type { HeadlessGenomeBrowserOptions, ManagedTrack, AddRulerOptions, AddWigTrackOptions, AddGtxTrackOptions, AddBedTrackOptions, AddAnnotationTrackOptions, AddInteractionTrackOptions, AddSequenceTrackOptions, AddWigTrackWithFeaturesOptions, AddBedTrackWithFeaturesOptions } from './headlessGenomeBrowser';
|
|
46
|
-
export { GenomeBrowser } from './genomeBrowser';
|
|
47
|
-
export type { GenomeBrowserOptions, BrowserEvents } from './genomeBrowser';
|
|
46
|
+
export { HeadlessGenomeBrowser, BrowserEvent } from './browser/headless/headlessGenomeBrowser';
|
|
47
|
+
export type { HeadlessGenomeBrowserOptions, ManagedTrack, AddRulerOptions, AddWigTrackOptions, AddGtxTrackOptions, AddBedTrackOptions, AddAnnotationTrackOptions, AddInteractionTrackOptions, AddSequenceTrackOptions, AddWigTrackWithFeaturesOptions, AddBedTrackWithFeaturesOptions } from './browser/headless/headlessGenomeBrowser';
|
|
48
|
+
export { GenomeBrowser } from './browser/dom/genomeBrowser';
|
|
49
|
+
export type { GenomeBrowserOptions, BrowserEvents } from './browser/dom/genomeBrowser';
|
|
50
|
+
export { createDefaultContextMenuProvider, createDefaultPopupProvider } from './browser/dom/defaultProviders';
|
|
51
|
+
export { renderDOMBrowserSVG, svgToPNG, triggerDownload } from './browser/dom/browserExport';
|
|
48
52
|
export type { ChromSizes, CumulativeOffsets } from './genome/chromSizes';
|
|
49
53
|
export { hg38ChromSizes, getChromLength, isMainChromosome, mainChromosomeNames, computeCumulativeOffsets, genomeToChromCoord, parseChromSizes } from './genome/chromSizes';
|
|
50
54
|
export { hg38Genome, createGenome, createGenomeSync } from './genome/genome';
|
|
51
55
|
export { ChromAliasDefaults, addCaseAliases } from './genome/chromAlias';
|
|
56
|
+
export { UndoManager } from './undoManager';
|
|
57
|
+
export type { UndoEntry, UndoEntryType } from './undoManager';
|
|
58
|
+
export type { LogLevel } from './logger';
|
|
59
|
+
export { setLogLevel, getLogLevel } from './logger';
|
|
52
60
|
export { EventEmitter } from './events';
|
|
53
61
|
export { parseLocus, formatLocus, formatBpLength, clampLocus, isWholeGenomeView } from './locusUtils';
|
|
54
62
|
export { LoomChromosomeSelect, LoomLocusInput, LoomZoomControls, LoomWindowSize, LoomExportControls, LoomNavbar, LoomBrowserShell, createShell, classicThemeCSS, modernThemeCSS, getThemeCSS, LoomPopup, DefaultPopupProvider, LoomContextMenu, DefaultContextMenuProvider, LoomInputDialog, } from './ui';
|
|
@@ -83,21 +91,20 @@ export type { FetchGenesOptions } from './data/ucscApi';
|
|
|
83
91
|
export { fetchSequence } from './data/ucscSequence';
|
|
84
92
|
export type { FetchSequenceOptions } from './data/ucscSequence';
|
|
85
93
|
export { createCachedSequence } from './data/cachedSequence';
|
|
94
|
+
export { searchWebService, parseSearchResults } from './data/searchService';
|
|
95
|
+
export type { SearchResult } from './data/searchService';
|
|
86
96
|
export { fetchBigWigFeatures, fetchBigWigWGFeatures, clearBigWigCache, BigWigReader } from './bigwig';
|
|
87
97
|
export type { FetchBigWigOptions, BigWigHeader, BigWigTotalSummary } from './bigwig';
|
|
88
98
|
export { fetchGtxFeatures, fetchGtxWGFeatures, fetchGtxMultiFeatures, clearGtxCache, GtxReader } from './gtx';
|
|
89
99
|
export type { FetchGtxOptions, GtxHeader, ChromEntry, ExperimentEntry } from './gtx';
|
|
90
100
|
export { TabixReader } from './tabix';
|
|
91
101
|
export type { TabixReaderOptions, TabixHeader } from './tabix';
|
|
92
|
-
export { BinaryParser } from './io/binaryParser';
|
|
93
|
-
export { fetchRange, BufferedRangeReader } from './io/rangeReader';
|
|
94
|
-
export type { ByteRange } from './io/rangeReader';
|
|
95
102
|
export { BigWigDataSource } from './dataSources/bigWigDataSource';
|
|
96
103
|
export { GtxDataSource } from './dataSources/gtxDataSource';
|
|
97
104
|
export { GeneDataSource } from './dataSources/geneDataSource';
|
|
98
105
|
export { TextFeatureSource } from './dataSources/textFeatureSource';
|
|
99
106
|
export type { TextFeatureSourceConfig } from './dataSources/textFeatureSource';
|
|
100
|
-
export { SequenceDataSource } from './dataSources/sequenceDataSource';
|
|
107
|
+
export { SequenceDataSource, DEFAULT_BPP_SEQUENCE_THRESHOLD } from './dataSources/sequenceDataSource';
|
|
101
108
|
export { MemoryDataSource } from './dataSources/memoryDataSource';
|
|
102
109
|
export { createFeatureSource } from './dataSources/featureSourceFactory';
|
|
103
110
|
export type { FeatureSourceConfig, FeatureSourceResult } from './dataSources/featureSourceFactory';
|
|
@@ -117,8 +124,8 @@ export { renderROIOverlays } from './roi';
|
|
|
117
124
|
export type { ROIRenderOptions } from './roi';
|
|
118
125
|
export { registerTrackCreator, registerTypeAlias, getTrackCreator, knownTrackTypes, createTrackFromConfig, } from './trackRegistry';
|
|
119
126
|
export type { TrackCreatorContext, TrackCreator, CreatedTrack } from './trackRegistry';
|
|
120
|
-
export { SESSION_VERSION,
|
|
121
|
-
export type {
|
|
127
|
+
export { SESSION_VERSION, createTrackFromSession, fromIgvSession, toIgvSession, } from './browser/headless/session';
|
|
128
|
+
export type { CreateTrackFromSessionOptions } from './browser/headless/session';
|
|
122
129
|
export { StateProjection } from './stateProjection';
|
|
123
130
|
export type { ZoomLevel, TrackSummary, ProjectedState, StateDiff, TrackChangeDiff, GetStateOptions } from './stateProjection';
|
|
124
131
|
export { matchesSelector, selectTracks } from './trackSelector';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured logger for the Loom genome browser.
|
|
3
|
+
*
|
|
4
|
+
* Replaces scattered `console.log/warn/error` calls with a level-gated logger
|
|
5
|
+
* that can be silenced or redirected by consumers.
|
|
6
|
+
*
|
|
7
|
+
* Default level: 'warn' — only warnings and errors are logged.
|
|
8
|
+
* Call `setLogLevel('silent')` to suppress all output in production.
|
|
9
|
+
*/
|
|
10
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';
|
|
11
|
+
/** Set the minimum log level. Messages below this level are suppressed. */
|
|
12
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
13
|
+
/** Get the current log level. */
|
|
14
|
+
export declare function getLogLevel(): LogLevel;
|
|
15
|
+
export declare const log: {
|
|
16
|
+
debug(...args: unknown[]): void;
|
|
17
|
+
info(...args: unknown[]): void;
|
|
18
|
+
warn(...args: unknown[]): void;
|
|
19
|
+
error(...args: unknown[]): void;
|
|
20
|
+
};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PointerEventManager — pointer interaction state machine for GenomeBrowser.
|
|
3
|
+
*
|
|
4
|
+
* Owns all pointer-driven interaction state and handlers:
|
|
5
|
+
* - Drag-to-pan (pointer capture + rAF batching)
|
|
6
|
+
* - Sweep-to-zoom (ruler drag → selection overlay)
|
|
7
|
+
* - Click / double-click detection
|
|
8
|
+
* - Hover throttling
|
|
9
|
+
* - Scroll-wheel / trackpad pinch-to-zoom
|
|
10
|
+
* - Drag-to-reorder tracks
|
|
11
|
+
*
|
|
12
|
+
* Extracted from GenomeBrowser to isolate the complex pointer state machine
|
|
13
|
+
* from DOM layout and track lifecycle management.
|
|
14
|
+
*
|
|
15
|
+
* Layer 4 (DOM): requires DOM APIs.
|
|
16
|
+
*/
|
|
17
|
+
import type { Track, Locus, TrackInteractionEvent, PopupDataItem } from './types';
|
|
18
|
+
import type { ManagedTrack } from './headlessGenomeBrowser';
|
|
19
|
+
import type { CumulativeOffsets, ChromSizes } from './genome/chromSizes';
|
|
20
|
+
import type { UndoEntryType } from './undoManager';
|
|
21
|
+
/** Callback interface for browser operations — wired by GenomeBrowser. */
|
|
22
|
+
export interface PointerBrowserAccess {
|
|
23
|
+
getLocus(): Locus;
|
|
24
|
+
/** Set locus directly without triggering data load (used during drag). */
|
|
25
|
+
setLocusDirect(locus: Locus): void;
|
|
26
|
+
clampLocus(locus: Locus): Locus;
|
|
27
|
+
/** Set locus with full data lifecycle (used for sweep zoom, WG click). */
|
|
28
|
+
setLocus(locus: Locus): void;
|
|
29
|
+
getViewportWidth(): number;
|
|
30
|
+
getManagedTracks(): readonly ManagedTrack[];
|
|
31
|
+
loadAllTracksIfNeeded(): void;
|
|
32
|
+
zoomAroundCenter(factor: number, centerBP: number): void;
|
|
33
|
+
resolveInteraction(track: Track, x: number, y: number): TrackInteractionEvent | null;
|
|
34
|
+
findTrackForTarget(target: EventTarget | null): Track | null;
|
|
35
|
+
isRulerCanvas(target: EventTarget | null): boolean;
|
|
36
|
+
showPopup(data: PopupDataItem[], position: {
|
|
37
|
+
x: number;
|
|
38
|
+
y: number;
|
|
39
|
+
}): void;
|
|
40
|
+
hidePopup(): void;
|
|
41
|
+
hideContextMenu(): void;
|
|
42
|
+
isOverlayTarget(e: Event): boolean;
|
|
43
|
+
setFeatureOverlaysSuppressed(suppressed: boolean): void;
|
|
44
|
+
emitLocusChange(locus: Locus): void;
|
|
45
|
+
emitTrackClick(event: TrackInteractionEvent): void;
|
|
46
|
+
emitTrackHover(event: TrackInteractionEvent): void;
|
|
47
|
+
emitTrackOrderChanged(tracks: Track[]): void;
|
|
48
|
+
snapshotForUndo(type: UndoEntryType): void;
|
|
49
|
+
getCumulativeOffsets(): CumulativeOffsets | undefined;
|
|
50
|
+
getChromSizes(): ChromSizes | undefined;
|
|
51
|
+
getTrackAxisDiv(track: Track): HTMLDivElement | undefined;
|
|
52
|
+
moveTrackInArray(fromIndex: number, toIndex: number): void;
|
|
53
|
+
syncDOMOrder(): void;
|
|
54
|
+
finalizeReorder(): void;
|
|
55
|
+
}
|
|
56
|
+
export declare class PointerEventManager {
|
|
57
|
+
private options;
|
|
58
|
+
private container;
|
|
59
|
+
private browser;
|
|
60
|
+
private axisColumnWidth;
|
|
61
|
+
private isDragging;
|
|
62
|
+
private lastPointerX;
|
|
63
|
+
private isSweeping;
|
|
64
|
+
private sweepStartX;
|
|
65
|
+
private sweepOverlay;
|
|
66
|
+
private sweepRulerCanvas;
|
|
67
|
+
private pointerDownX;
|
|
68
|
+
private pointerDownY;
|
|
69
|
+
private pointerDownTarget;
|
|
70
|
+
private lastClickTime;
|
|
71
|
+
private lastClickX;
|
|
72
|
+
private lastClickY;
|
|
73
|
+
private singleClickTimer;
|
|
74
|
+
private hoverThrottleId;
|
|
75
|
+
private _rafId;
|
|
76
|
+
private _preNavLocus;
|
|
77
|
+
private handlePointerDown;
|
|
78
|
+
private handlePointerMove;
|
|
79
|
+
private handlePointerUp;
|
|
80
|
+
private handleMouseMove;
|
|
81
|
+
private handleMouseLeave;
|
|
82
|
+
private handleWheel;
|
|
83
|
+
private wheelRafId;
|
|
84
|
+
private reorderDragTrack;
|
|
85
|
+
private reorderDragRow;
|
|
86
|
+
private reorderHandlers;
|
|
87
|
+
constructor(container: HTMLElement, browser: PointerBrowserAccess, axisColumnWidth: number, options: {
|
|
88
|
+
wheelZoom?: boolean;
|
|
89
|
+
});
|
|
90
|
+
/** Set up all pointer event handlers. */
|
|
91
|
+
setup(): void;
|
|
92
|
+
/** Tear down all pointer event handlers and clean up state. */
|
|
93
|
+
dispose(): void;
|
|
94
|
+
/** Set up drag-to-reorder pointer handlers on a track's axis div. */
|
|
95
|
+
setupReorderForTrack(track: Track, axisDiv: HTMLDivElement): void;
|
|
96
|
+
/** Remove reorder handlers for a track. */
|
|
97
|
+
teardownReorderForTrack(track: Track): void;
|
|
98
|
+
private createSweepOverlay;
|
|
99
|
+
private removeSweepOverlay;
|
|
100
|
+
private setupDragHandlers;
|
|
101
|
+
private handleClick;
|
|
102
|
+
private teardownDragHandlers;
|
|
103
|
+
private setupHoverHandlers;
|
|
104
|
+
private teardownHoverHandlers;
|
|
105
|
+
private setupWheelHandler;
|
|
106
|
+
private teardownWheelHandler;
|
|
107
|
+
/** Get the DOM row element for a track (via browser). */
|
|
108
|
+
private getTrackRow;
|
|
109
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { GenomeBrowser } from '../genomeBrowser';
|
|
1
|
+
import type { GenomeBrowser } from '../browser/dom/genomeBrowser';
|
|
2
2
|
import type { ShellTheme } from '../ui/themes';
|
|
3
3
|
export interface GenomeBrowserContextValue {
|
|
4
4
|
/** The underlying GenomeBrowser instance. null before initialization or during SSR. */
|
|
@@ -5,9 +5,9 @@ import type { WorkerProvider } from '../workerProvider';
|
|
|
5
5
|
import type { PopupProvider } from '../popupProvider';
|
|
6
6
|
import type { ContextMenuProvider } from '../contextMenuProvider';
|
|
7
7
|
import type { RemoteSocket } from '../remoteProtocol';
|
|
8
|
-
import { GenomeBrowser } from '../genomeBrowser';
|
|
9
|
-
import type { ManagedTrack } from '../headlessGenomeBrowser';
|
|
10
|
-
import type { CreateTrackFromSessionOptions } from '../session';
|
|
8
|
+
import { GenomeBrowser } from '../browser/dom/genomeBrowser';
|
|
9
|
+
import type { ManagedTrack } from '../browser/headless/headlessGenomeBrowser';
|
|
10
|
+
import type { CreateTrackFromSessionOptions } from '../browser/headless/session';
|
|
11
11
|
import type { TrackSelector } from '../trackSelector';
|
|
12
12
|
import { ROISet } from '../roi/roiSet';
|
|
13
13
|
export interface LoomBrowserProps {
|
|
@@ -67,7 +67,7 @@ export interface LoomBrowserProps {
|
|
|
67
67
|
export interface LoomBrowserHandle {
|
|
68
68
|
/** The underlying GenomeBrowser instance. null during SSR. */
|
|
69
69
|
readonly browser: GenomeBrowser | null;
|
|
70
|
-
search(query: string): boolean
|
|
70
|
+
search(query: string): Promise<boolean>;
|
|
71
71
|
zoomIn(factor?: number): void;
|
|
72
72
|
zoomOut(factor?: number): void;
|
|
73
73
|
addTrackFromConfig(config: TrackSessionConfig): Track;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BrowserEvents } from '../../headlessGenomeBrowser';
|
|
1
|
+
import type { BrowserEvents } from '../../browser/headless/headlessGenomeBrowser';
|
|
2
2
|
/**
|
|
3
3
|
* Subscribe to a typed browser event. Automatically subscribes/unsubscribes
|
|
4
4
|
* with the browser lifecycle. Uses a stable ref for the handler to avoid
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Track } from '../../types';
|
|
2
|
-
import type { GenomeBrowser } from '../../genomeBrowser';
|
|
2
|
+
import type { GenomeBrowser } from '../../browser/dom/genomeBrowser';
|
|
3
3
|
/** Per-track click event with typed features. */
|
|
4
4
|
export interface TrackClickEvent<F> {
|
|
5
5
|
features: F[];
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { BedFeature, AnnotationRenderConfig, TextFileFormat } from '../../types';
|
|
2
2
|
import type { TrackClickEvent } from '../hooks/useTrackManager';
|
|
3
|
-
export interface BedTrackProps {
|
|
3
|
+
export interface BedTrackProps<F extends BedFeature = BedFeature> {
|
|
4
4
|
/** URL to a BED/peak file. Mutually exclusive with `features`. */
|
|
5
5
|
url?: string;
|
|
6
6
|
/** In-memory annotation features. Mutually exclusive with `url`. Features must include `chr`. */
|
|
7
|
-
features?:
|
|
7
|
+
features?: F[];
|
|
8
8
|
config?: Partial<AnnotationRenderConfig>;
|
|
9
9
|
height?: number;
|
|
10
10
|
background?: string;
|
|
@@ -15,10 +15,10 @@ export interface BedTrackProps {
|
|
|
15
15
|
name?: string;
|
|
16
16
|
metadata?: Record<string, string>;
|
|
17
17
|
/** Compute per-feature color. Applied to in-memory features before rendering. */
|
|
18
|
-
colorBy?: (feature:
|
|
19
|
-
/** Called when this track is clicked.
|
|
20
|
-
onClick?: (event: TrackClickEvent<
|
|
18
|
+
colorBy?: (feature: F) => string;
|
|
19
|
+
/** Called when this track is clicked. */
|
|
20
|
+
onClick?: (event: TrackClickEvent<F>) => void;
|
|
21
21
|
/** Called when this track is right-clicked. */
|
|
22
|
-
onContextMenu?: (event: TrackClickEvent<
|
|
22
|
+
onContextMenu?: (event: TrackClickEvent<F>) => void;
|
|
23
23
|
}
|
|
24
|
-
export declare function BedTrack({ url, features, config, height, background, format, indexURL, indexed, maxTrackHeight, name, metadata, colorBy, onClick, onContextMenu }: BedTrackProps): null;
|
|
24
|
+
export declare function BedTrack<F extends BedFeature = BedFeature>({ url, features, config, height, background, format, indexURL, indexed, maxTrackHeight, name, metadata, colorBy, onClick, onContextMenu }: BedTrackProps<F>): null;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* The `RemoteSocket` interface is minimal and testable — works with browser
|
|
9
9
|
* WebSocket, the `ws` npm package, or mock implementations.
|
|
10
10
|
*/
|
|
11
|
-
import type { HeadlessGenomeBrowser } from './headlessGenomeBrowser';
|
|
11
|
+
import type { HeadlessGenomeBrowser } from './browser/headless/headlessGenomeBrowser';
|
|
12
12
|
import type { CommandDispatcherOptions } from './commandDispatcher';
|
|
13
13
|
/** Inbound: agent/server sends a command request. */
|
|
14
14
|
export interface RequestMessage {
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ROIManager — manages Region of Interest sets for a genome browser.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from HeadlessGenomeBrowser to isolate ROI CRUD operations
|
|
5
|
+
* into a single-responsibility module. Owns the `roiSets` array and
|
|
6
|
+
* emits events through a callback interface.
|
|
7
|
+
*
|
|
8
|
+
* Layer 3 (Headless): no DOM dependencies.
|
|
9
|
+
*/
|
|
10
|
+
import type { ROI, ROISetConfig, Locus } from './types';
|
|
11
|
+
import { ROISet } from './roi/roiSet';
|
|
12
|
+
/** Callback interface for ROI events — wired by HeadlessGenomeBrowser to its EventEmitter. */
|
|
13
|
+
export interface ROIEventCallbacks {
|
|
14
|
+
onROIAdded(roi: ROI, set: ROISet): void;
|
|
15
|
+
onROIRemoved(roi: ROI, set: ROISet): void;
|
|
16
|
+
onROIChanged(roi: ROI, changes: Partial<ROI>, set: ROISet): void;
|
|
17
|
+
}
|
|
18
|
+
export declare class ROIManager {
|
|
19
|
+
private roiSets;
|
|
20
|
+
private callbacks;
|
|
21
|
+
constructor(callbacks: ROIEventCallbacks);
|
|
22
|
+
/**
|
|
23
|
+
* Add a single ROI to a named set. Creates a user-defined set if it doesn't exist.
|
|
24
|
+
* Returns the ROI (with generated ID if none provided).
|
|
25
|
+
*/
|
|
26
|
+
addROI(roi: ROI, setName?: string): ROI;
|
|
27
|
+
/** Add a full ROI set from config. Returns the created ROISet. */
|
|
28
|
+
addROISet(config: ROISetConfig): ROISet;
|
|
29
|
+
/** Remove an ROI by ID (searches all sets). Returns true if found and removed. */
|
|
30
|
+
removeROI(roiId: string): boolean;
|
|
31
|
+
/** Update an ROI by ID. Returns the updated ROI, or undefined if not found. */
|
|
32
|
+
updateROI(roiId: string, changes: Partial<Omit<ROI, 'id'>>): ROI | undefined;
|
|
33
|
+
/** Remove a specific ROI set by instance. Returns true if found and removed. */
|
|
34
|
+
removeROISet(set: ROISet): boolean;
|
|
35
|
+
/** Remove all ROI sets. */
|
|
36
|
+
clear(): void;
|
|
37
|
+
/** Get all ROIs across all sets (flattened). */
|
|
38
|
+
getROIs(): ROI[];
|
|
39
|
+
/** Get all ROI sets. */
|
|
40
|
+
getROISets(): readonly ROISet[];
|
|
41
|
+
/** Find ROIs overlapping a genomic region (searches all sets). */
|
|
42
|
+
findROIsAtLocus(chr: string, start: number, end: number): ROI[];
|
|
43
|
+
/** Get ROIs visible in the given viewport locus. */
|
|
44
|
+
getVisibleROIs(locus: Locus): ROI[];
|
|
45
|
+
/** Serialize all ROI sets for session persistence. Returns undefined if empty. */
|
|
46
|
+
serialize(): ROISetConfig[] | undefined;
|
|
47
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ROIOverlayManager — DOM-based Region of Interest overlay rendering.
|
|
3
|
+
*
|
|
4
|
+
* Manages ROI region elements (colored overlays with labels) positioned
|
|
5
|
+
* over the track viewport. Uses DOM elements (not canvas) for easy
|
|
6
|
+
* hover/click interaction without re-rendering track canvases.
|
|
7
|
+
*
|
|
8
|
+
* Extracted from GenomeBrowser to isolate ROI DOM lifecycle management.
|
|
9
|
+
*
|
|
10
|
+
* Layer 4 (DOM): requires DOM APIs.
|
|
11
|
+
*/
|
|
12
|
+
import type { ROI, Locus } from './types';
|
|
13
|
+
/** Callback interface for ROI overlay events — wired by GenomeBrowser. */
|
|
14
|
+
export interface ROIOverlayCallbacks {
|
|
15
|
+
onROIClick(roiId: string, e: MouseEvent): void;
|
|
16
|
+
onROIContextMenu(roiId: string, e: MouseEvent): void;
|
|
17
|
+
}
|
|
18
|
+
export declare class ROIOverlayManager {
|
|
19
|
+
private container;
|
|
20
|
+
private axisColumnWidth;
|
|
21
|
+
private overlayContainer;
|
|
22
|
+
private roiElements;
|
|
23
|
+
private callbacks;
|
|
24
|
+
constructor(container: HTMLElement, axisColumnWidth: number, callbacks: ROIOverlayCallbacks);
|
|
25
|
+
/**
|
|
26
|
+
* Render ROI overlays for the given visible ROIs.
|
|
27
|
+
* Creates/updates/removes DOM elements to match the current viewport.
|
|
28
|
+
*/
|
|
29
|
+
render(visibleROIs: ROI[], locus: Locus, viewportWidth: number): void;
|
|
30
|
+
/** Remove all ROI elements and the overlay container. */
|
|
31
|
+
clear(): void;
|
|
32
|
+
/** Alias for clear — clean up all ROI overlay resources. */
|
|
33
|
+
dispose(): void;
|
|
34
|
+
/** Ensure the ROI overlay container exists and is sized correctly. */
|
|
35
|
+
private ensureContainer;
|
|
36
|
+
/** Create a styled DOM element for an ROI region. */
|
|
37
|
+
private createElement;
|
|
38
|
+
}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* Swappable: consumers can extend or replace this class for custom projection logic.
|
|
11
11
|
*/
|
|
12
12
|
import type { Locus, TrackFeatureSummary, ROISetConfig } from './types';
|
|
13
|
-
import type { HeadlessGenomeBrowser, ManagedTrack } from './headlessGenomeBrowser';
|
|
13
|
+
import type { HeadlessGenomeBrowser, ManagedTrack } from './browser/headless/headlessGenomeBrowser';
|
|
14
14
|
/** Zoom level classification based on viewport span. */
|
|
15
15
|
export type ZoomLevel = 'base' | 'element' | 'gene' | 'region' | 'chromosome' | 'genome';
|
|
16
16
|
/** Concise summary of a single track, suitable for LLM consumption. */
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TrackDataManager — data lifecycle management for genome browser tracks.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from HeadlessGenomeBrowser to isolate data fetching concerns:
|
|
5
|
+
* - Debounced loading during rapid zoom/pan
|
|
6
|
+
* - Cache validation and coverage checks
|
|
7
|
+
* - Fetch deduplication across tracks sharing the same data source
|
|
8
|
+
* - Inflight request tracking and abort management
|
|
9
|
+
* - Visibility window enforcement
|
|
10
|
+
*
|
|
11
|
+
* Layer 3 (Headless): no DOM dependencies.
|
|
12
|
+
*/
|
|
13
|
+
import type { Locus, Track, DataSource } from './types';
|
|
14
|
+
import type { ManagedTrack } from './headlessGenomeBrowser';
|
|
15
|
+
import type { DataSourceWorkerProvider } from './dataSourceWorkerProvider';
|
|
16
|
+
/** Callback interface for data lifecycle events — wired by HeadlessGenomeBrowser. */
|
|
17
|
+
export interface DataEventCallbacks {
|
|
18
|
+
onDataLoaded(track: Track): void;
|
|
19
|
+
onDataError(track: Track, error: Error): void;
|
|
20
|
+
}
|
|
21
|
+
export declare class TrackDataManager {
|
|
22
|
+
/** Inflight fetch promises keyed by (cacheKey + fetchRegion + bpPerPixel) for deduplication. */
|
|
23
|
+
private inflightFetches;
|
|
24
|
+
/** Timer for debouncing data loads during rapid zoom/pan. */
|
|
25
|
+
private loadDebounceTimer;
|
|
26
|
+
/** Set to true by dispose() to suppress post-dispose promise handlers. */
|
|
27
|
+
private _disposed;
|
|
28
|
+
private callbacks;
|
|
29
|
+
private dataSourceWorkerProvider?;
|
|
30
|
+
constructor(callbacks: DataEventCallbacks, dataSourceWorkerProvider?: DataSourceWorkerProvider);
|
|
31
|
+
/**
|
|
32
|
+
* Debounced wrapper around loadAllTracksIfNeeded.
|
|
33
|
+
* During rapid zoom/pan, this coalesces multiple setLocus() calls into a
|
|
34
|
+
* single data fetch cycle after the interaction settles (100ms quiet period).
|
|
35
|
+
* Abort in-flight requests immediately so they don't race with the eventual fetch.
|
|
36
|
+
*/
|
|
37
|
+
debouncedLoad(managedTracks: ManagedTrack[], locus: Locus, viewportWidth: number): void;
|
|
38
|
+
loadAllTracksIfNeeded(managedTracks: ManagedTrack[], locus: Locus, viewportWidth: number): void;
|
|
39
|
+
/**
|
|
40
|
+
* Load data for a single track, deduplicating against inflight fetches
|
|
41
|
+
* from other tracks with the same data source identity.
|
|
42
|
+
*/
|
|
43
|
+
loadTrackWithDedup(mt: ManagedTrack, managedTracks: ManagedTrack[], locus: Locus, viewportWidth: number): void;
|
|
44
|
+
/** Clean up: cancel debounce timer, mark as disposed. */
|
|
45
|
+
dispose(): void;
|
|
46
|
+
/** Destroy a worker-resident data source. */
|
|
47
|
+
destroyWorkerDataSource(dataSource: DataSource): void;
|
|
48
|
+
}
|