react-msaview 5.10.0 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/index.js +99 -99
- package/bundle/index.js.map +4 -4
- package/dist/clustalX.js +22 -22
- package/dist/clustalX.js.map +1 -1
- package/dist/columnCounts.d.ts +7 -0
- package/dist/columnCounts.js +18 -0
- package/dist/columnCounts.js.map +1 -1
- package/dist/components/CopyButton.d.ts +9 -0
- package/dist/components/CopyButton.js +23 -0
- package/dist/components/CopyButton.js.map +1 -0
- package/dist/components/DragHandle.d.ts +25 -0
- package/dist/components/DragHandle.js +49 -0
- package/dist/components/DragHandle.js.map +1 -0
- package/dist/components/Loading.js +2 -2
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/MSAView.js +2 -2
- package/dist/components/MSAView.js.map +1 -1
- package/dist/components/ResizeHandles.d.ts +4 -2
- package/dist/components/ResizeHandles.js +35 -54
- package/dist/components/ResizeHandles.js.map +1 -1
- package/dist/components/SequenceTextArea.js +3 -10
- package/dist/components/SequenceTextArea.js.map +1 -1
- package/dist/components/VerticalScrollbar.js +11 -25
- package/dist/components/VerticalScrollbar.js.map +1 -1
- package/dist/components/dialogs/FeatureDialog.js +3 -3
- package/dist/components/dialogs/FeatureDialog.js.map +1 -1
- package/dist/components/dialogs/InterProScanDialog.js +52 -129
- package/dist/components/dialogs/InterProScanDialog.js.map +1 -1
- package/dist/components/dialogs/{UserProvidedDomainsDialog.d.ts → InterProScanFileDialog.d.ts} +2 -2
- package/dist/components/dialogs/{UserProvidedDomainsDialog.js → InterProScanFileDialog.js} +6 -10
- package/dist/components/dialogs/InterProScanFileDialog.js.map +1 -0
- package/dist/components/dialogs/TrackInfoDialog.d.ts +2 -4
- package/dist/components/dialogs/TrackInfoDialog.js +8 -14
- package/dist/components/dialogs/TrackInfoDialog.js.map +1 -1
- package/dist/components/header/FileMenu.js +3 -3
- package/dist/components/header/FileMenu.js.map +1 -1
- package/dist/components/header/GappynessSlider.js +1 -1
- package/dist/components/header/GappynessSlider.js.map +1 -1
- package/dist/components/header/{getDomainsMenu.d.ts → getAnnotationsMenu.d.ts} +1 -1
- package/dist/components/header/{getDomainsMenu.js → getAnnotationsMenu.js} +10 -9
- package/dist/components/header/getAnnotationsMenu.js.map +1 -0
- package/dist/components/header/settingsMenuItems.js +15 -0
- package/dist/components/header/settingsMenuItems.js.map +1 -1
- package/dist/components/import/ImportForm.js +1 -1
- package/dist/components/import/ImportForm.js.map +1 -1
- package/dist/components/import/ImportFormExamples.js +66 -57
- package/dist/components/import/ImportFormExamples.js.map +1 -1
- package/dist/components/minimap/Minimap.js +40 -23
- package/dist/components/minimap/Minimap.js.map +1 -1
- package/dist/components/minimap/MinimapSVG.d.ts +2 -1
- package/dist/components/minimap/MinimapSVG.js +3 -4
- package/dist/components/minimap/MinimapSVG.js.map +1 -1
- package/dist/components/minimap/minimapLayout.d.ts +10 -1
- package/dist/components/minimap/minimapLayout.js +15 -10
- package/dist/components/minimap/minimapLayout.js.map +1 -1
- package/dist/components/msa/{DomainLegend.d.ts → AnnotationLegend.d.ts} +2 -2
- package/dist/components/msa/{DomainLegend.js → AnnotationLegend.js} +4 -4
- package/dist/components/msa/AnnotationLegend.js.map +1 -0
- package/dist/components/msa/MSACanvas.js +9 -3
- package/dist/components/msa/MSACanvas.js.map +1 -1
- package/dist/components/msa/MSACanvasBlock.js +12 -3
- package/dist/components/msa/MSACanvasBlock.js.map +1 -1
- package/dist/components/msa/MSAMouseoverCanvas.js +1 -2
- package/dist/components/msa/MSAMouseoverCanvas.js.map +1 -1
- package/dist/components/msa/MSAPanel.js +2 -2
- package/dist/components/msa/MSAPanel.js.map +1 -1
- package/dist/components/msa/domainBandCursor.d.ts +17 -0
- package/dist/components/msa/domainBandCursor.js +39 -0
- package/dist/components/msa/domainBandCursor.js.map +1 -0
- package/dist/components/msa/msaRaster.d.ts +63 -0
- package/dist/components/msa/msaRaster.js +252 -0
- package/dist/components/msa/msaRaster.js.map +1 -0
- package/dist/components/msa/renderMSABlock.d.ts +2 -1
- package/dist/components/msa/renderMSABlock.js +27 -41
- package/dist/components/msa/renderMSABlock.js.map +1 -1
- package/dist/components/msa/renderMSAMouseover.js +1 -2
- package/dist/components/msa/renderMSAMouseover.js.map +1 -1
- package/dist/components/msa/tileColor.d.ts +6 -0
- package/dist/components/msa/tileColor.js +35 -0
- package/dist/components/msa/tileColor.js.map +1 -0
- package/dist/components/renderCtx.d.ts +1 -1
- package/dist/components/tracks/TrackBlocks.d.ts +14 -0
- package/dist/components/tracks/TrackBlocks.js +65 -0
- package/dist/components/tracks/TrackBlocks.js.map +1 -0
- package/dist/components/tracks/{renderTracksSvg.d.ts → drawTracks.d.ts} +22 -10
- package/dist/components/tracks/drawTracks.js +193 -0
- package/dist/components/tracks/drawTracks.js.map +1 -0
- package/dist/components/tree/TreeCanvas.js +8 -2
- package/dist/components/tree/TreeCanvas.js.map +1 -1
- package/dist/components/tree/TreeCanvasBlock.js +7 -4
- package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
- package/dist/components/tree/TreeRuler.js +5 -2
- package/dist/components/tree/TreeRuler.js.map +1 -1
- package/dist/components/tree/renderTreeCanvas.js +5 -2
- package/dist/components/tree/renderTreeCanvas.js.map +1 -1
- package/dist/constants.d.ts +3 -0
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -1
- package/dist/ggplotPalettes.d.ts +0 -1
- package/dist/ggplotPalettes.js +0 -3
- package/dist/ggplotPalettes.js.map +1 -1
- package/dist/hierarchy.d.ts +2 -6
- package/dist/hierarchy.js +4 -6
- package/dist/hierarchy.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/launchInterProScan.d.ts +0 -23
- package/dist/launchInterProScan.js +2 -5
- package/dist/launchInterProScan.js.map +1 -1
- package/dist/measureTextCanvas.js +21 -6
- package/dist/measureTextCanvas.js.map +1 -1
- package/dist/model/DataModel.d.ts +1 -4
- package/dist/model/DataModel.js +8 -10
- package/dist/model/DataModel.js.map +1 -1
- package/dist/model.d.ts +86 -107
- package/dist/model.js +238 -162
- package/dist/model.js.map +1 -1
- package/dist/neighborJoining.js +34 -18
- package/dist/neighborJoining.js.map +1 -1
- package/dist/renderTestEnv.d.ts +43 -0
- package/dist/renderTestEnv.js +88 -0
- package/dist/renderTestEnv.js.map +1 -0
- package/dist/renderToSvg.js +3 -3
- package/dist/renderToSvg.js.map +1 -1
- package/dist/rowCoordinateCalculations.d.ts +13 -17
- package/dist/rowCoordinateCalculations.js +45 -39
- package/dist/rowCoordinateCalculations.js.map +1 -1
- package/dist/sequenceLogo.d.ts +28 -0
- package/dist/sequenceLogo.js +47 -0
- package/dist/sequenceLogo.js.map +1 -0
- package/dist/types.d.ts +6 -11
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +5 -5
- package/src/clustalX.ts +22 -22
- package/src/colSpace.test.ts +27 -0
- package/src/columnCounts.test.ts +15 -0
- package/src/columnCounts.ts +19 -0
- package/src/components/CopyButton.tsx +44 -0
- package/src/components/DragHandle.tsx +81 -0
- package/src/components/Loading.tsx +10 -1
- package/src/components/MSAView.tsx +2 -3
- package/src/components/ResizeHandles.tsx +70 -87
- package/src/components/SequenceTextArea.tsx +3 -16
- package/src/components/VerticalScrollbar.tsx +20 -33
- package/src/components/dialogs/FeatureDialog.tsx +3 -4
- package/src/components/dialogs/InterProScanDialog.tsx +54 -131
- package/src/components/dialogs/{UserProvidedDomainsDialog.tsx → InterProScanFileDialog.tsx} +6 -14
- package/src/components/dialogs/TrackInfoDialog.tsx +18 -20
- package/src/components/header/FileMenu.tsx +3 -3
- package/src/components/header/GappynessSlider.tsx +4 -1
- package/src/components/header/{getDomainsMenu.ts → getAnnotationsMenu.ts} +10 -9
- package/src/components/header/settingsMenuItems.ts +18 -0
- package/src/components/import/ImportForm.tsx +1 -1
- package/src/components/import/ImportFormExamples.tsx +82 -133
- package/src/components/minimap/Minimap.tsx +67 -32
- package/src/components/minimap/MinimapSVG.tsx +32 -31
- package/src/components/minimap/minimapLayout.test.ts +60 -0
- package/src/components/minimap/minimapLayout.ts +15 -10
- package/src/components/msa/{DomainLegend.tsx → AnnotationLegend.tsx} +7 -3
- package/src/components/msa/MSACanvas.tsx +24 -11
- package/src/components/msa/MSACanvasBlock.tsx +13 -3
- package/src/components/msa/MSAMouseoverCanvas.tsx +1 -3
- package/src/components/msa/MSAPanel.tsx +2 -2
- package/src/components/msa/domainBandCursor.ts +41 -0
- package/src/components/msa/msaRaster.test.ts +145 -0
- package/src/components/msa/msaRaster.ts +350 -0
- package/src/components/msa/renderMSABlock.ts +34 -43
- package/src/components/msa/renderMSAMouseover.ts +1 -3
- package/src/components/msa/tileColor.ts +37 -0
- package/src/components/renderCtx.ts +2 -0
- package/src/components/tracks/TrackBlocks.tsx +111 -0
- package/src/components/tracks/drawTracks.ts +323 -0
- package/src/components/tree/TreeCanvas.tsx +16 -4
- package/src/components/tree/TreeCanvasBlock.tsx +18 -11
- package/src/components/tree/TreeRuler.tsx +7 -2
- package/src/components/tree/renderTreeCanvas.test.ts +15 -7
- package/src/components/tree/renderTreeCanvas.ts +5 -1
- package/src/constants.ts +10 -0
- package/src/domainBands.test.ts +24 -0
- package/src/domainLetterColor.test.ts +80 -0
- package/src/ggplotPalettes.ts +0 -4
- package/src/hierarchy.test.ts +7 -7
- package/src/hierarchy.ts +6 -9
- package/src/impgRender.test.tsx +2 -57
- package/src/index.ts +4 -1
- package/src/largeTree.test.ts +39 -4
- package/src/launchInterProScan.ts +3 -30
- package/src/loadErrorDisplay.test.tsx +102 -0
- package/src/measureTextCanvas.ts +22 -6
- package/src/model/DataModel.ts +11 -11
- package/src/model.ts +262 -172
- package/src/neighborJoining.ts +36 -18
- package/src/renderDomainsSvg.test.tsx +2 -57
- package/src/renderMinimapSvg.test.tsx +55 -0
- package/src/renderSequenceLogoSvg.test.tsx +176 -0
- package/src/renderTestEnv.ts +96 -0
- package/src/renderToSvg.tsx +3 -3
- package/src/rowCoordinateCalculations.ts +48 -44
- package/src/sequenceLogo.test.ts +88 -0
- package/src/sequenceLogo.ts +63 -0
- package/src/types.ts +17 -16
- package/src/version.ts +1 -1
- package/src/viewChrome.test.tsx +134 -0
- package/dist/components/ConservationTrack.d.ts +0 -8
- package/dist/components/ConservationTrack.js +0 -49
- package/dist/components/ConservationTrack.js.map +0 -1
- package/dist/components/TextTrack.d.ts +0 -8
- package/dist/components/TextTrack.js +0 -58
- package/dist/components/TextTrack.js.map +0 -1
- package/dist/components/dialogs/DomainDialog.d.ts +0 -6
- package/dist/components/dialogs/DomainDialog.js +0 -19
- package/dist/components/dialogs/DomainDialog.js.map +0 -1
- package/dist/components/dialogs/UserProvidedDomainsDialog.js.map +0 -1
- package/dist/components/header/SettingsMenu.d.ts +0 -6
- package/dist/components/header/SettingsMenu.js +0 -40
- package/dist/components/header/SettingsMenu.js.map +0 -1
- package/dist/components/header/getDomainsMenu.js.map +0 -1
- package/dist/components/msa/DomainLegend.js.map +0 -1
- package/dist/components/tracks/renderTracksSvg.js +0 -126
- package/dist/components/tracks/renderTracksSvg.js.map +0 -1
- package/src/components/ConservationTrack.tsx +0 -99
- package/src/components/TextTrack.tsx +0 -103
- package/src/components/dialogs/DomainDialog.tsx +0 -45
- package/src/components/header/SettingsMenu.tsx +0 -57
- package/src/components/tracks/renderTracksSvg.ts +0 -247
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { expect, test } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { columnCountsFromColumns } from './columnCounts.ts'
|
|
4
|
+
import { columnLogoStack, maxBitsFor } from './sequenceLogo.ts'
|
|
5
|
+
|
|
6
|
+
const dnaBits = maxBitsFor('dna')
|
|
7
|
+
const aminoBits = maxBitsFor('amino')
|
|
8
|
+
|
|
9
|
+
function stackOf(column: string, maxBits = dnaBits) {
|
|
10
|
+
return columnLogoStack(columnCountsFromColumns([column]), 0, maxBits)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
test('maxBits is log2 of the alphabet', () => {
|
|
14
|
+
expect(maxBitsFor('dna')).toBe(2)
|
|
15
|
+
expect(maxBitsFor('rna')).toBe(2)
|
|
16
|
+
expect(maxBitsFor('amino')).toBeCloseTo(4.3219, 4)
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
test('a fully conserved column is one letter at the full height', () => {
|
|
20
|
+
const stack = stackOf('AAAA')
|
|
21
|
+
expect(stack).toHaveLength(1)
|
|
22
|
+
expect(stack[0]!.letter).toBe('A')
|
|
23
|
+
expect(stack[0]!.bits).toBeCloseTo(2, 10)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
test('an even four-way column carries no information', () => {
|
|
27
|
+
expect(stackOf('ACGT')).toEqual([])
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
test('a two-way split is half the height, shared evenly', () => {
|
|
31
|
+
const stack = stackOf('AACC')
|
|
32
|
+
expect(stack.map(s => s.letter)).toEqual(['A', 'C'])
|
|
33
|
+
// entropy 1 bit, so information content is 2 - 1 = 1, split evenly
|
|
34
|
+
expect(stack[0]!.bits).toBeCloseTo(0.5, 10)
|
|
35
|
+
expect(stack[1]!.bits).toBeCloseTo(0.5, 10)
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
test('letters are ordered ascending so the tallest draws last, on top', () => {
|
|
39
|
+
const stack = stackOf('AAAC')
|
|
40
|
+
expect(stack.map(s => s.letter)).toEqual(['C', 'A'])
|
|
41
|
+
expect(stack[0]!.bits).toBeLessThan(stack[1]!.bits)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
test('ties break on letter so redraws are stable', () => {
|
|
45
|
+
expect(stackOf('GGCC').map(s => s.letter)).toEqual(['C', 'G'])
|
|
46
|
+
expect(stackOf('CCGG').map(s => s.letter)).toEqual(['C', 'G'])
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
test('gaps scale the stack down without skewing the frequencies', () => {
|
|
50
|
+
// 'A' is the only residue, so it takes the whole stack either way; the height
|
|
51
|
+
// is what the gaps change
|
|
52
|
+
const clean = stackOf('AAAA')
|
|
53
|
+
const gappy = stackOf('AA--')
|
|
54
|
+
expect(gappy[0]!.letter).toBe('A')
|
|
55
|
+
expect(gappy[0]!.bits).toBeCloseTo(clean[0]!.bits / 2, 10)
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
test('gaps do not make a two-residue column look like a four-way one', () => {
|
|
59
|
+
// frequencies come from the two real residues, so this is a 1-bit choice
|
|
60
|
+
// scaled by the half-gap occupancy, not a 4-way split
|
|
61
|
+
const stack = stackOf('AC--')
|
|
62
|
+
expect(stack.map(s => s.letter)).toEqual(['A', 'C'])
|
|
63
|
+
expect(stack[0]!.bits + stack[1]!.bits).toBeCloseTo(0.5, 10)
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
test('an all-gap column has no stack', () => {
|
|
67
|
+
expect(stackOf('----')).toEqual([])
|
|
68
|
+
expect(stackOf('....')).toEqual([])
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
test('the protein ceiling is higher than the nucleotide one', () => {
|
|
72
|
+
const protein = stackOf('WWWW', aminoBits)
|
|
73
|
+
expect(protein[0]!.bits).toBeCloseTo(aminoBits, 10)
|
|
74
|
+
expect(protein[0]!.bits).toBeGreaterThan(stackOf('AAAA')[0]!.bits)
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
test('stack height never exceeds the ceiling', () => {
|
|
78
|
+
const columns = ['AAAA', 'AACG', 'A-C-', 'ACGT', 'AAAT']
|
|
79
|
+
for (const column of columns) {
|
|
80
|
+
const total = stackOf(column).reduce((a, b) => a + b.bits, 0)
|
|
81
|
+
expect(total).toBeLessThanOrEqual(dnaBits + 1e-9)
|
|
82
|
+
}
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
test('a column past the end of a ragged alignment is empty, not a crash', () => {
|
|
86
|
+
const counts = columnCountsFromColumns(['AC'])
|
|
87
|
+
expect(columnLogoStack(counts, 5, dnaBits)).toEqual([])
|
|
88
|
+
})
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { letterOfResidueSlot } from './columnCounts.ts'
|
|
2
|
+
|
|
3
|
+
import type { ColumnCounts } from './columnCounts.ts'
|
|
4
|
+
|
|
5
|
+
export interface LogoLetter {
|
|
6
|
+
letter: string
|
|
7
|
+
/** height of this letter's slice of the stack, in bits */
|
|
8
|
+
bits: number
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** the y-axis ceiling of a logo: the information content of a fully conserved
|
|
12
|
+
* column, log2 of the alphabet size */
|
|
13
|
+
export function maxBitsFor(sequenceType: 'dna' | 'rna' | 'amino') {
|
|
14
|
+
return Math.log2(sequenceType === 'amino' ? 20 : 4)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* One column of a sequence logo, tallest letter last so a caller can draw the
|
|
19
|
+
* stack bottom-up in array order.
|
|
20
|
+
*
|
|
21
|
+
* Heights follow Schneider & Stephens: the column's information content is
|
|
22
|
+
* `log2(alphabet) - H` bits, and each residue takes the share of that its own
|
|
23
|
+
* frequency earns. Frequencies come from the non-gap residues only, so a column
|
|
24
|
+
* of two residues and eight gaps is read as a two-way choice rather than a
|
|
25
|
+
* ten-way one -- otherwise every gappy column would look uninformative for the
|
|
26
|
+
* wrong reason.
|
|
27
|
+
*
|
|
28
|
+
* The whole stack is then scaled by the non-gap fraction, which plain WebLogo
|
|
29
|
+
* does not do. Here it earns its place: the track sits directly under an
|
|
30
|
+
* alignment where the gaps are visible, and a column that is 90% gap drawing a
|
|
31
|
+
* full-height stack off its one remaining pair of residues reads as a conserved
|
|
32
|
+
* site. Scaling makes stack height mean "how much this column tells you about
|
|
33
|
+
* the family", matching what the conservation track above it already plots.
|
|
34
|
+
*/
|
|
35
|
+
export function columnLogoStack(
|
|
36
|
+
colStats: ColumnCounts,
|
|
37
|
+
col: number,
|
|
38
|
+
maxBits: number,
|
|
39
|
+
): LogoLetter[] {
|
|
40
|
+
const total = colStats.total(col)
|
|
41
|
+
const nonGapTotal = total - colStats.gapCount(col)
|
|
42
|
+
if (nonGapTotal === 0) {
|
|
43
|
+
return []
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const informationContent =
|
|
47
|
+
Math.max(0, maxBits - colStats.entropy(col)) * (nonGapTotal / total)
|
|
48
|
+
if (informationContent === 0) {
|
|
49
|
+
return []
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const stack: LogoLetter[] = []
|
|
53
|
+
colStats.forEachResidue(col, (slot, count) => {
|
|
54
|
+
stack.push({
|
|
55
|
+
letter: letterOfResidueSlot(slot),
|
|
56
|
+
bits: (count / nonGapTotal) * informationContent,
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
// ascending, so drawing in order stacks the tallest letter on top. Ties break
|
|
60
|
+
// on letter to keep the stack order stable between redraws.
|
|
61
|
+
stack.sort((a, b) => a.bits - b.bits || a.letter.localeCompare(b.letter))
|
|
62
|
+
return stack
|
|
63
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -1,13 +1,21 @@
|
|
|
1
|
+
import type { Annotation } from 'msa-parsers'
|
|
2
|
+
|
|
1
3
|
export interface Accession {
|
|
2
4
|
accession: string
|
|
3
5
|
name: string
|
|
4
6
|
description: string
|
|
5
7
|
}
|
|
8
|
+
// which renderer draws a track's content. Every track kind draws into the same
|
|
9
|
+
// per-column coordinate space, so the kind picks the draw function rather than
|
|
10
|
+
// the geometry -- see drawTracks.ts, which dispatches on it.
|
|
11
|
+
export type TrackKind = 'text' | 'bar' | 'logo'
|
|
12
|
+
|
|
6
13
|
export interface BasicTrackModel {
|
|
7
14
|
id: string
|
|
8
15
|
name: string
|
|
9
16
|
associatedRowName?: string
|
|
10
17
|
height: number
|
|
18
|
+
kind: TrackKind
|
|
11
19
|
}
|
|
12
20
|
|
|
13
21
|
export interface TextTrackModel extends BasicTrackModel {
|
|
@@ -16,7 +24,7 @@ export interface TextTrackModel extends BasicTrackModel {
|
|
|
16
24
|
}
|
|
17
25
|
|
|
18
26
|
// a track that draws a per-column bar chart (conservation, property
|
|
19
|
-
// conservation)
|
|
27
|
+
// conservation)
|
|
20
28
|
export interface BarTrackModel extends BasicTrackModel {
|
|
21
29
|
barColor?: string
|
|
22
30
|
}
|
|
@@ -26,24 +34,17 @@ export interface BasicTrack {
|
|
|
26
34
|
model: TextTrackModel & BarTrackModel
|
|
27
35
|
}
|
|
28
36
|
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
accession: string
|
|
35
|
-
description: string
|
|
36
|
-
featureType?: string
|
|
37
|
-
start: number
|
|
38
|
-
end: number
|
|
39
|
-
strand?: number
|
|
40
|
-
}
|
|
37
|
+
// the overlay annotation itself lives in msa-parsers, alongside the adapters
|
|
38
|
+
// that build it. TidyDomainAnnotation is its former name, kept because
|
|
39
|
+
// downstream plugins name it in their emitted declarations.
|
|
40
|
+
export type { Annotation }
|
|
41
|
+
export type TidyDomainAnnotation = Annotation
|
|
41
42
|
|
|
42
|
-
//
|
|
43
|
-
// stackIndex is its position
|
|
43
|
+
// an annotation resolved to the visible column span it is drawn across.
|
|
44
|
+
// stackIndex is its position among the bands its row actually draws, which the
|
|
44
45
|
// sub-row layout uses to stack boxes.
|
|
45
46
|
export interface DomainBand {
|
|
46
|
-
annotation:
|
|
47
|
+
annotation: Annotation
|
|
47
48
|
startCol: number
|
|
48
49
|
endCol: number
|
|
49
50
|
stackIndex: number
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '
|
|
1
|
+
export const version = '6.1.0'
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
//
|
|
3
|
+
// The chrome around the alignment -- the tree/height resize handles, the
|
|
4
|
+
// minimap and the vertical scrollbar -- is all built from the same
|
|
5
|
+
// mousedown-then-drag hook, and none of it is exercised by the render tests.
|
|
6
|
+
// This mounts the real view and drives one handle of each kind.
|
|
7
|
+
import React, { act } from 'react'
|
|
8
|
+
|
|
9
|
+
import { createRoot } from 'react-dom/client'
|
|
10
|
+
import { afterEach, beforeAll, beforeEach, expect, test } from 'vitest'
|
|
11
|
+
|
|
12
|
+
import MSAView from './components/Loading.tsx'
|
|
13
|
+
import MSAModelF from './model.ts'
|
|
14
|
+
|
|
15
|
+
import type { MsaViewModel } from './model.ts'
|
|
16
|
+
import type { Root } from 'react-dom/client'
|
|
17
|
+
|
|
18
|
+
Reflect.set(globalThis, 'IS_REACT_ACT_ENVIRONMENT', true)
|
|
19
|
+
|
|
20
|
+
beforeAll(() => {
|
|
21
|
+
HTMLCanvasElement.prototype.getContext = function (this: HTMLCanvasElement) {
|
|
22
|
+
return {
|
|
23
|
+
canvas: this,
|
|
24
|
+
font: '12px sans-serif',
|
|
25
|
+
measureText: (t: string) => ({ width: t.length * 7 }),
|
|
26
|
+
arc() {},
|
|
27
|
+
beginPath() {},
|
|
28
|
+
clearRect() {},
|
|
29
|
+
closePath() {},
|
|
30
|
+
fill() {},
|
|
31
|
+
fillRect() {},
|
|
32
|
+
fillText() {},
|
|
33
|
+
lineTo() {},
|
|
34
|
+
moveTo() {},
|
|
35
|
+
resetTransform() {},
|
|
36
|
+
scale() {},
|
|
37
|
+
setLineDash() {},
|
|
38
|
+
stroke() {},
|
|
39
|
+
strokeRect() {},
|
|
40
|
+
translate() {},
|
|
41
|
+
} as unknown as CanvasRenderingContext2D
|
|
42
|
+
} as unknown as typeof HTMLCanvasElement.prototype.getContext
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
// tall and wide enough that both scrollbars are on screen
|
|
46
|
+
const names = Array.from({ length: 20 }, (_, i) => `seq${i}`)
|
|
47
|
+
const msa = names.map(name => `>${name}\n${'ACGT'.repeat(25)}`).join('\n')
|
|
48
|
+
const tree = `(${names.map(n => `${n}:0.1`).join(',')});`
|
|
49
|
+
|
|
50
|
+
let container: HTMLDivElement
|
|
51
|
+
let root: Root
|
|
52
|
+
let model: MsaViewModel
|
|
53
|
+
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
container = document.createElement('div')
|
|
56
|
+
document.body.append(container)
|
|
57
|
+
root = createRoot(container)
|
|
58
|
+
model = MSAModelF().create({
|
|
59
|
+
type: 'MsaView',
|
|
60
|
+
msaFormat: 'fasta',
|
|
61
|
+
height: 200,
|
|
62
|
+
data: { msa, tree },
|
|
63
|
+
})
|
|
64
|
+
model.setWidth(800)
|
|
65
|
+
act(() => {
|
|
66
|
+
root.render(<MSAView model={model} />)
|
|
67
|
+
})
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
afterEach(() => {
|
|
71
|
+
act(() => {
|
|
72
|
+
root.unmount()
|
|
73
|
+
})
|
|
74
|
+
container.remove()
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
function byCursor(cursor: string) {
|
|
78
|
+
return [...container.querySelectorAll<HTMLElement>('div')].filter(
|
|
79
|
+
el => el.style.cursor === cursor,
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// useDragScroll defers each move to an animation frame, so a drag needs one
|
|
84
|
+
// flushed frame before the model has moved
|
|
85
|
+
async function drag(el: HTMLElement, { x = 0, y = 0 }) {
|
|
86
|
+
await act(async () => {
|
|
87
|
+
el.dispatchEvent(
|
|
88
|
+
new MouseEvent('mousedown', { bubbles: true, clientX: 0, clientY: 0 }),
|
|
89
|
+
)
|
|
90
|
+
})
|
|
91
|
+
await act(async () => {
|
|
92
|
+
document.dispatchEvent(
|
|
93
|
+
new MouseEvent('mousemove', { bubbles: true, clientX: x, clientY: y }),
|
|
94
|
+
)
|
|
95
|
+
await new Promise(resolve => {
|
|
96
|
+
requestAnimationFrame(resolve)
|
|
97
|
+
})
|
|
98
|
+
})
|
|
99
|
+
await act(async () => {
|
|
100
|
+
document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }))
|
|
101
|
+
})
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
test('the view mounts with both scrollbars', () => {
|
|
105
|
+
expect(container.querySelector('[data-testid="msa_canvas"]')).toBeTruthy()
|
|
106
|
+
expect(model.showVerticalScrollbar).toBe(true)
|
|
107
|
+
expect(model.showHorizontalScrollbar).toBe(true)
|
|
108
|
+
// one horizontal divider (tree/msa), two vertical (view height, and the
|
|
109
|
+
// conservation track's own)
|
|
110
|
+
expect(byCursor('ew-resize')).toHaveLength(1)
|
|
111
|
+
expect(byCursor('ns-resize')).toHaveLength(2)
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
test('dragging the tree divider widens the tree area', async () => {
|
|
115
|
+
const before = model.treeAreaWidth
|
|
116
|
+
await drag(byCursor('ew-resize')[0]!, { x: 60 })
|
|
117
|
+
expect(model.treeAreaWidth).toBe(before + 60)
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
test('dragging the view divider grows the view', async () => {
|
|
121
|
+
const before = model.height
|
|
122
|
+
// the last ns-resize handle is the one below the whole view
|
|
123
|
+
await drag(byCursor('ns-resize').at(-1)!, { y: 50 })
|
|
124
|
+
expect(model.height).toBe(before + 50)
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
test('dragging the scrollbar thumb scrolls the alignment', async () => {
|
|
128
|
+
const thumb = container.querySelector<HTMLElement>(
|
|
129
|
+
'div[style*="cursor: pointer"]',
|
|
130
|
+
)!
|
|
131
|
+
expect(model.scrollX).toBe(0)
|
|
132
|
+
await drag(thumb, { x: 40 })
|
|
133
|
+
expect(model.scrollX).toBeLessThan(0)
|
|
134
|
+
})
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import type { MsaViewModel } from '../model.ts';
|
|
3
|
-
import type { BasicTrack } from '../types.ts';
|
|
4
|
-
declare const ConservationTrack: ({ model, track, }: {
|
|
5
|
-
model: MsaViewModel;
|
|
6
|
-
track: BasicTrack;
|
|
7
|
-
}) => React.JSX.Element;
|
|
8
|
-
export default ConservationTrack;
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { observer } from 'mobx-react';
|
|
3
|
-
import { useCanvasAutorun } from '../useCanvasAutorun.js';
|
|
4
|
-
import { ConservationTrackResizeHandle } from './ResizeHandles.js';
|
|
5
|
-
import { barTrackValues, drawConservationBars, } from './tracks/renderTracksSvg.js';
|
|
6
|
-
const ConservationBlock = observer(function ({ model, track, offsetX, trackHeight, }) {
|
|
7
|
-
const { blockSize, scrollX, highResScaleFactor } = model;
|
|
8
|
-
const ref = useCanvasAutorun({
|
|
9
|
-
draw: ctx => {
|
|
10
|
-
const { colWidth } = model;
|
|
11
|
-
ctx.resetTransform();
|
|
12
|
-
ctx.scale(highResScaleFactor, highResScaleFactor);
|
|
13
|
-
ctx.clearRect(0, 0, blockSize, trackHeight);
|
|
14
|
-
ctx.translate(-offsetX, 0);
|
|
15
|
-
drawConservationBars({
|
|
16
|
-
ctx,
|
|
17
|
-
values: barTrackValues(model, track.model.id),
|
|
18
|
-
color: track.model.barColor ?? 'gray',
|
|
19
|
-
colWidth,
|
|
20
|
-
trackHeight,
|
|
21
|
-
offsetX,
|
|
22
|
-
blockSize,
|
|
23
|
-
});
|
|
24
|
-
},
|
|
25
|
-
width: blockSize * highResScaleFactor,
|
|
26
|
-
height: trackHeight * highResScaleFactor,
|
|
27
|
-
deps: [model, track, offsetX, trackHeight],
|
|
28
|
-
});
|
|
29
|
-
return (React.createElement("canvas", { ref: ref, height: trackHeight * highResScaleFactor, width: blockSize * highResScaleFactor, style: {
|
|
30
|
-
position: 'absolute',
|
|
31
|
-
left: scrollX + offsetX,
|
|
32
|
-
width: blockSize,
|
|
33
|
-
height: trackHeight,
|
|
34
|
-
} }));
|
|
35
|
-
});
|
|
36
|
-
const ConservationTrack = observer(function ({ model, track, }) {
|
|
37
|
-
const { blocksX, msaAreaWidth } = model;
|
|
38
|
-
const trackHeight = track.model.height;
|
|
39
|
-
return (React.createElement("div", { style: {
|
|
40
|
-
position: 'relative',
|
|
41
|
-
height: trackHeight,
|
|
42
|
-
width: msaAreaWidth,
|
|
43
|
-
overflow: 'hidden',
|
|
44
|
-
} },
|
|
45
|
-
blocksX.map(bx => (React.createElement(ConservationBlock, { key: bx, model: model, track: track, offsetX: bx, trackHeight: trackHeight }))),
|
|
46
|
-
React.createElement(ConservationTrackResizeHandle, { model: model })));
|
|
47
|
-
});
|
|
48
|
-
export default ConservationTrack;
|
|
49
|
-
//# sourceMappingURL=ConservationTrack.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConservationTrack.js","sourceRoot":"","sources":["../../src/components/ConservationTrack.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,6BAA6B,EAAE,MAAM,oBAAqB,CAAA;AACnE,OAAO,EACL,cAAc,EACd,oBAAoB,GACrB,MAAM,6BAA6B,CAAA;AAKpC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,UAAU,EAC3C,KAAK,EACL,KAAK,EACL,OAAO,EACP,WAAW,GAMZ;IACC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,KAAK,CAAA;IAExD,MAAM,GAAG,GAAG,gBAAgB,CAAC;QAC3B,IAAI,EAAE,GAAG,CAAC,EAAE;YACV,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;YAC1B,GAAG,CAAC,cAAc,EAAE,CAAA;YACpB,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;YACjD,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;YAC3C,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;YAE1B,oBAAoB,CAAC;gBACnB,GAAG;gBACH,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7C,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM;gBACrC,QAAQ;gBACR,WAAW;gBACX,OAAO;gBACP,SAAS;aACV,CAAC,CAAA;QACJ,CAAC;QACD,KAAK,EAAE,SAAS,GAAG,kBAAkB;QACrC,MAAM,EAAE,WAAW,GAAG,kBAAkB;QACxC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC;KAC3C,CAAC,CAAA;IAEF,OAAO,CACL,gCACE,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,WAAW,GAAG,kBAAkB,EACxC,KAAK,EAAE,SAAS,GAAG,kBAAkB,EACrC,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,IAAI,EAAE,OAAO,GAAG,OAAO;YACvB,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,WAAW;SACpB,GACD,CACH,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,iBAAiB,GAAG,QAAQ,CAAC,UAAU,EAC3C,KAAK,EACL,KAAK,GAIN;IACC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,KAAK,CAAA;IACvC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAA;IAEtC,OAAO,CACL,6BACE,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,QAAQ;SACnB;QAEA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CACjB,oBAAC,iBAAiB,IAChB,GAAG,EAAE,EAAE,EACP,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,EAAE,EACX,WAAW,EAAE,WAAW,GACxB,CACH,CAAC;QACF,oBAAC,6BAA6B,IAAC,KAAK,EAAE,KAAK,GAAI,CAC3C,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,iBAAiB,CAAA"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import type { MsaViewModel } from '../model.ts';
|
|
3
|
-
import type { BasicTrack } from '../types.ts';
|
|
4
|
-
declare const AnnotationTrack: ({ track, model, }: {
|
|
5
|
-
track: BasicTrack;
|
|
6
|
-
model: MsaViewModel;
|
|
7
|
-
}) => React.JSX.Element | null;
|
|
8
|
-
export default AnnotationTrack;
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { observer } from 'mobx-react';
|
|
3
|
-
import { setFontSize } from '../setFontSize.js';
|
|
4
|
-
import { useCanvasAutorun } from '../useCanvasAutorun.js';
|
|
5
|
-
import { useColorContrast } from '../useColorContrast.js';
|
|
6
|
-
import { drawTextTrackContent } from './tracks/renderTracksSvg.js';
|
|
7
|
-
const AnnotationBlock = observer(function ({ track, model, offsetX, }) {
|
|
8
|
-
const { blockSize, scrollX, colorScheme: modelColorScheme, rowHeight, highResScaleFactor, } = model;
|
|
9
|
-
const { model: { customColorScheme, data }, } = track;
|
|
10
|
-
const colorScheme = customColorScheme ?? modelColorScheme;
|
|
11
|
-
const { theme, contrastScheme } = useColorContrast(colorScheme);
|
|
12
|
-
const ref = useCanvasAutorun({
|
|
13
|
-
draw: ctx => {
|
|
14
|
-
const { bgColor, colWidth, fontSize } = model;
|
|
15
|
-
ctx.resetTransform();
|
|
16
|
-
ctx.scale(highResScaleFactor, highResScaleFactor);
|
|
17
|
-
ctx.clearRect(0, 0, blockSize, rowHeight);
|
|
18
|
-
ctx.translate(-offsetX, 0);
|
|
19
|
-
ctx.textAlign = 'center';
|
|
20
|
-
setFontSize(ctx, fontSize);
|
|
21
|
-
drawTextTrackContent({
|
|
22
|
-
ctx,
|
|
23
|
-
data,
|
|
24
|
-
colorScheme,
|
|
25
|
-
contrastScheme,
|
|
26
|
-
bgColor,
|
|
27
|
-
textColor: theme.palette.text.primary,
|
|
28
|
-
colWidth,
|
|
29
|
-
rowHeight,
|
|
30
|
-
offsetX,
|
|
31
|
-
blockSize,
|
|
32
|
-
});
|
|
33
|
-
},
|
|
34
|
-
width: blockSize * highResScaleFactor,
|
|
35
|
-
height: rowHeight * highResScaleFactor,
|
|
36
|
-
deps: [model, offsetX, theme, contrastScheme, colorScheme, data],
|
|
37
|
-
});
|
|
38
|
-
return (React.createElement("canvas", { ref: ref, height: rowHeight * highResScaleFactor, width: blockSize * highResScaleFactor, style: {
|
|
39
|
-
position: 'absolute',
|
|
40
|
-
left: scrollX + offsetX,
|
|
41
|
-
width: blockSize,
|
|
42
|
-
height: rowHeight,
|
|
43
|
-
} }));
|
|
44
|
-
});
|
|
45
|
-
const AnnotationTrack = observer(function ({ track, model, }) {
|
|
46
|
-
const { blocksX, msaAreaWidth, rowHeight } = model;
|
|
47
|
-
if (!track.model.data) {
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
return (React.createElement("div", { style: {
|
|
51
|
-
position: 'relative',
|
|
52
|
-
height: rowHeight,
|
|
53
|
-
width: msaAreaWidth,
|
|
54
|
-
overflow: 'hidden',
|
|
55
|
-
} }, blocksX.map(bx => (React.createElement(AnnotationBlock, { key: bx, track: track, model: model, offsetX: bx })))));
|
|
56
|
-
});
|
|
57
|
-
export default AnnotationTrack;
|
|
58
|
-
//# sourceMappingURL=TextTrack.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TextTrack.js","sourceRoot":"","sources":["../../src/components/TextTrack.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
2
|
-
import { Dialog } from '@jbrowse/core/ui';
|
|
3
|
-
import { Tab, Tabs } from '@mui/material';
|
|
4
|
-
import InterProScanPanel from './InterProScanDialog.js';
|
|
5
|
-
import UserProvidedResultPanel from './UserProvidedDomainsDialog.js';
|
|
6
|
-
export default function LaunchDomainViewDialog({ handleClose, model, }) {
|
|
7
|
-
const [choice, setChoice] = useState(0);
|
|
8
|
-
return (React.createElement(Dialog, { maxWidth: "xl", title: "Launch protein view", onClose: () => {
|
|
9
|
-
handleClose();
|
|
10
|
-
}, open: true },
|
|
11
|
-
React.createElement(Tabs, { value: choice, onChange: (_, val) => {
|
|
12
|
-
setChoice(val);
|
|
13
|
-
} },
|
|
14
|
-
React.createElement(Tab, { value: 0, label: "Automatic lookup" }),
|
|
15
|
-
React.createElement(Tab, { value: 1, label: "Manual" })),
|
|
16
|
-
choice === 0 ? (React.createElement(InterProScanPanel, { model: model, handleClose: handleClose })) : null,
|
|
17
|
-
choice === 1 ? (React.createElement(UserProvidedResultPanel, { model: model, handleClose: handleClose })) : null));
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=DomainDialog.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DomainDialog.js","sourceRoot":"","sources":["../../../src/components/dialogs/DomainDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAEzC,OAAO,iBAAiB,MAAM,yBAA0B,CAAA;AACxD,OAAO,uBAAuB,MAAM,gCAAiC,CAAA;AAIrE,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAC7C,WAAW,EACX,KAAK,GAIN;IACC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACvC,OAAO,CACL,oBAAC,MAAM,IACL,QAAQ,EAAC,IAAI,EACb,KAAK,EAAC,qBAAqB,EAC3B,OAAO,EAAE,GAAG,EAAE;YACZ,WAAW,EAAE,CAAA;QACf,CAAC,EACD,IAAI;QAEJ,oBAAC,IAAI,IACH,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;gBACnB,SAAS,CAAC,GAAG,CAAC,CAAA;YAChB,CAAC;YAED,oBAAC,GAAG,IAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAC,kBAAkB,GAAG;YAC1C,oBAAC,GAAG,IAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAC,QAAQ,GAAG,CAC3B;QACN,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACd,oBAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,GAAI,CAC9D,CAAC,CAAC,CAAC,IAAI;QACP,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACd,oBAAC,uBAAuB,IAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,GAAI,CACpE,CAAC,CAAC,CAAC,IAAI,CACD,CACV,CAAA;AACH,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UserProvidedDomainsDialog.js","sourceRoot":"","sources":["../../../src/components/dialogs/UserProvidedDomainsDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton';
|
|
3
|
-
import AccountTree from '@mui/icons-material/AccountTree';
|
|
4
|
-
import Palette from '@mui/icons-material/Palette';
|
|
5
|
-
import Settings from '@mui/icons-material/Settings';
|
|
6
|
-
import { observer } from 'mobx-react';
|
|
7
|
-
import colorSchemes from '../../colorSchemes.js';
|
|
8
|
-
import { msaSettingsMenuItems, treeSettingsMenuItems, } from './settingsMenuItems.js';
|
|
9
|
-
const SettingsMenu = observer(function ({ model }) {
|
|
10
|
-
const { colorSchemeName } = model;
|
|
11
|
-
return (React.createElement(CascadingMenuButton, { closeAfterItemClick: false, menuItems: [
|
|
12
|
-
{
|
|
13
|
-
label: 'Color scheme',
|
|
14
|
-
icon: Palette,
|
|
15
|
-
type: 'subMenu',
|
|
16
|
-
subMenu: Object.keys(colorSchemes).map(option => ({
|
|
17
|
-
label: option,
|
|
18
|
-
type: 'radio',
|
|
19
|
-
checked: colorSchemeName === option,
|
|
20
|
-
onClick: () => {
|
|
21
|
-
model.setColorSchemeName(option);
|
|
22
|
-
},
|
|
23
|
-
})),
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
label: 'MSA settings',
|
|
27
|
-
type: 'subMenu',
|
|
28
|
-
subMenu: msaSettingsMenuItems(model),
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
label: 'Tree settings',
|
|
32
|
-
type: 'subMenu',
|
|
33
|
-
icon: AccountTree,
|
|
34
|
-
subMenu: treeSettingsMenuItems(model),
|
|
35
|
-
},
|
|
36
|
-
] },
|
|
37
|
-
React.createElement(Settings, null)));
|
|
38
|
-
});
|
|
39
|
-
export default SettingsMenu;
|
|
40
|
-
//# sourceMappingURL=SettingsMenu.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsMenu.js","sourceRoot":"","sources":["../../../src/components/header/SettingsMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,mBAAmB,MAAM,sCAAsC,CAAA;AACtE,OAAO,WAAW,MAAM,iCAAiC,CAAA;AACzD,OAAO,OAAO,MAAM,6BAA6B,CAAA;AACjD,OAAO,QAAQ,MAAM,8BAA8B,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,YAAY,MAAM,uBAAuB,CAAA;AAChD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,wBAAwB,CAAA;AAI/B,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACxE,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,CAAA;IACjC,OAAO,CACL,oBAAC,mBAAmB,IAClB,mBAAmB,EAAE,KAAK,EAC1B,SAAS,EAAE;YACT;gBACE,KAAK,EAAE,cAAc;gBACrB,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CACpC,MAAM,CAAC,EAAE,CACP,CAAC;oBACC,KAAK,EAAE,MAAM;oBACb,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,eAAe,KAAK,MAAM;oBACnC,OAAO,EAAE,GAAG,EAAE;wBACZ,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;oBAClC,CAAC;iBACF,CAAU,CACd;aACF;YACD;gBACE,KAAK,EAAE,cAAc;gBACrB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,oBAAoB,CAAC,KAAK,CAAC;aACrC;YACD;gBACE,KAAK,EAAE,eAAe;gBACtB,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,qBAAqB,CAAC,KAAK,CAAC;aACtC;SACF;QAED,oBAAC,QAAQ,OAAG,CACQ,CACvB,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,YAAY,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getDomainsMenu.js","sourceRoot":"","sources":["../../../src/components/header/getDomainsMenu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAE5B,OAAO,SAAS,MAAM,+BAA+B,CAAA;AACrD,OAAO,UAAU,MAAM,gCAAgC,CAAA;AACvD,OAAO,MAAM,MAAM,4BAA4B,CAAA;AAC/C,OAAO,IAAI,MAAM,0BAA0B,CAAA;AAC3C,OAAO,UAAU,MAAM,gCAAgC,CAAA;AAIvD,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,6BAA8B,CAAC,CAAC,CAAA;AAC9E,MAAM,yBAAyB,GAAG,IAAI,CACpC,GAAG,EAAE,CAAC,MAAM,CAAC,yCAA0C,CAAC,CACzD,CAAA;AACD,MAAM,kBAAkB,GAAG,IAAI,CAC7B,GAAG,EAAE,CAAC,MAAM,CAAC,kCAAmC,CAAC,CAClD,CAAA;AAED,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAA2B;IAC9D,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,KAAK,CAAA;IAC7E,OAAO;QACL;YACE,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC/B,yBAAyB;oBACzB;wBACE,WAAW;wBACX,KAAK;qBACN;iBACF,CAAC,CAAA;YACJ,CAAC;SACF;QACD;YACE,KAAK,EAAE,mCAAmC;YAC1C,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC/B,kBAAkB;oBAClB;wBACE,WAAW;wBACX,KAAK;qBACN;iBACF,CAAC,CAAA;YACJ,CAAC;SACF;QACD;YACE,KAAK,EAAE,eAAe,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/D,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,mBAAmB;YAC5B,IAAI,EAAE,UAAmB;YACzB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,CAAA;YACpC,CAAC;SACF;QACD;YACE,KAAK,EAAE,qBAAqB,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,EAAE;YACrE,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK;YACrD,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,UAAmB;YACzB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC,CAAA;YAC1C,CAAC;SACF;QACD;YACE,KAAK,EAAE,iBAAiB,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,EAAE;YACjE,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3B,mBAAmB;oBACnB;wBACE,OAAO;wBACP,KAAK;qBACN;iBACF,CAAC,CAAA;YACJ,CAAC;SACF;KACF,CAAA;AACH,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DomainLegend.js","sourceRoot":"","sources":["../../../src/components/msa/DomainLegend.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,UAAU,MAAM,gCAAgC,CAAA;AACvD,OAAO,UAAU,MAAM,gCAAgC,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACxE,MAAM,EACJ,mBAAmB,EACnB,kBAAkB,EAAE,OAAO,EAC3B,WAAW,EACX,gBAAgB,EAAE,QAAQ,GAC3B,GAAG,KAAK,CAAA;IACT,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAA;IAErD,OAAO,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACjD,oBAAC,KAAK,IACJ,SAAS,EAAE,CAAC,EACZ,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,GAAG,EAAE,CAAC;YACN,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,GAAG;YACX,QAAQ,EAAE,GAAG;YACb,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,OAAO,EAAE,IAAI;SACd;QAED,6BACE,KAAK,EAAE;gBACL,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,cAAc,EAAE,UAAU;gBAC1B,OAAO,EAAE,iBAAiB;aAC3B;YAED,oBAAC,UAAU,IACT,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,mBAAmB,EAC7D,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,CAAA;gBACtC,CAAC;gBAED,oBAAC,UAAU,IAAC,QAAQ,EAAC,OAAO,GAAG,CACpB,CACT;QACL,QAAQ,CAAC,CAAC,CAAC,CACV,6BAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IACnD,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CACpC,6BACE,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,EACxD,KAAK,EAAE,SAAS;YAEhB,6BACE,KAAK,EAAE;oBACL,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,EAAE;oBACV,UAAU,EAAE,CAAC;oBACb,UAAU,EAAE,WAAW,CAAC,SAAS,CAAC;iBACnC,GACD;YACF,oBAAC,UAAU,IAAC,OAAO,EAAC,SAAS,EAAC,MAAM,UACjC,IAAI,CACM,CACT,CACP,CAAC,CACE,CACP,CAAC,CAAC,CAAC,IAAI,CACF,CACT,CAAC,CAAC,CAAC,IAAI,CAAA;AACV,CAAC,CAAC,CAAA;AAEF,eAAe,YAAY,CAAA"}
|