@datagrok/sequence-translator 1.2.6 → 1.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/.eslintrc.json +5 -5
  2. package/CHANGELOG.md +12 -0
  3. package/dist/package-test.js +2 -1
  4. package/dist/package-test.js.LICENSE.txt +8 -0
  5. package/dist/package-test.js.map +1 -1
  6. package/dist/package.js +2 -1
  7. package/dist/package.js.LICENSE.txt +8 -0
  8. package/dist/package.js.map +1 -1
  9. package/files/pattern-app-data.json +80 -0
  10. package/package.json +21 -14
  11. package/src/{model → apps/common/model}/const.ts +1 -1
  12. package/src/{model/data-loading-utils → apps/common/model/data-loader}/const.ts +7 -2
  13. package/src/apps/common/model/data-loader/json-loader.ts +48 -0
  14. package/src/{model/data-loading-utils → apps/common/model/data-loader}/types.ts +13 -6
  15. package/src/{model → apps/common/model}/monomer-lib/lib-wrapper.ts +9 -12
  16. package/src/apps/common/model/oligo-toolkit-package.ts +30 -0
  17. package/src/{model → apps/common/model}/parsing-validation/format-detector.ts +5 -5
  18. package/src/{model → apps/common/model}/parsing-validation/format-handler.ts +18 -19
  19. package/src/{model → apps/common/model}/parsing-validation/sequence-validator.ts +1 -1
  20. package/src/apps/common/view/app-ui-base.ts +28 -0
  21. package/src/apps/common/view/combined-app-ui.ts +66 -0
  22. package/src/{view/utils → apps/common/view/components}/colored-input/colored-text-input.ts +1 -1
  23. package/src/{view/utils → apps/common/view/components}/draw-molecule.ts +1 -1
  24. package/src/{view/utils → apps/common/view/components}/molecule-img.ts +3 -3
  25. package/src/{view/const/ui.ts → apps/common/view/const.ts} +4 -4
  26. package/src/apps/common/view/isolated-app-ui.ts +43 -0
  27. package/src/{view/monomer-lib-viewer/viewer.ts → apps/common/view/monomer-lib-viewer.ts} +2 -2
  28. package/src/apps/common/view/utils.ts +29 -0
  29. package/src/apps/pattern/model/const.ts +121 -0
  30. package/src/apps/pattern/model/data-manager.ts +297 -0
  31. package/src/apps/pattern/model/event-bus.ts +470 -0
  32. package/src/apps/pattern/model/router.ts +46 -0
  33. package/src/apps/pattern/model/subscription-manager.ts +21 -0
  34. package/src/apps/pattern/model/translator.ts +68 -0
  35. package/src/apps/pattern/model/types.ts +52 -0
  36. package/src/apps/pattern/model/utils.ts +110 -0
  37. package/src/apps/pattern/view/components/bulk-convert/column-input.ts +69 -0
  38. package/src/apps/pattern/view/components/bulk-convert/table-controls.ts +37 -0
  39. package/src/apps/pattern/view/components/bulk-convert/table-input.ts +95 -0
  40. package/src/apps/pattern/view/components/edit-block-controls.ts +196 -0
  41. package/src/apps/pattern/view/components/left-section.ts +44 -0
  42. package/src/apps/pattern/view/components/load-block-controls.ts +198 -0
  43. package/src/apps/pattern/view/components/numeric-label-visibility-controls.ts +69 -0
  44. package/src/apps/pattern/view/components/right-section.ts +148 -0
  45. package/src/apps/pattern/view/components/strand-editor/dialog.ts +79 -0
  46. package/src/apps/pattern/view/components/strand-editor/header-controls.ts +105 -0
  47. package/src/apps/pattern/view/components/strand-editor/strand-controls.ts +159 -0
  48. package/src/apps/pattern/view/components/terminal-modification-editor.ts +127 -0
  49. package/src/apps/pattern/view/components/translation-examples-block.ts +139 -0
  50. package/src/{view/style/pattern-app.css → apps/pattern/view/style.css} +4 -0
  51. package/src/apps/pattern/view/svg-utils/const.ts +63 -0
  52. package/src/apps/pattern/view/svg-utils/dimensions-calculator.ts +498 -0
  53. package/src/apps/pattern/view/svg-utils/svg-display-manager.ts +45 -0
  54. package/src/apps/pattern/view/svg-utils/svg-element-factory.ts +82 -0
  55. package/src/apps/pattern/view/svg-utils/svg-renderer.ts +396 -0
  56. package/src/apps/pattern/view/svg-utils/utils.ts +37 -0
  57. package/src/apps/pattern/view/types.ts +14 -0
  58. package/src/apps/pattern/view/ui.ts +61 -0
  59. package/src/{model/structure-app → apps/structure/model}/mol-transformations.ts +3 -3
  60. package/src/{model/structure-app → apps/structure/model}/monomer-code-parser.ts +9 -10
  61. package/src/{model/structure-app → apps/structure/model}/oligo-structure.ts +4 -4
  62. package/src/{model/structure-app → apps/structure/model}/sequence-to-molfile.ts +2 -2
  63. package/src/{view/apps/oligo-structure.ts → apps/structure/view/ui.ts} +31 -17
  64. package/src/{model/translator-app → apps/translator/model}/conversion-utils.ts +25 -7
  65. package/src/{model/translator-app → apps/translator/model}/format-converter.ts +7 -12
  66. package/src/{view/const/oligo-translator.ts → apps/translator/view/const.ts} +2 -0
  67. package/src/apps/translator/view/ui.ts +547 -0
  68. package/src/demo/demo-st-ui.ts +12 -32
  69. package/src/package.ts +76 -56
  70. package/src/plugins/mermade.ts +9 -9
  71. package/src/polytool/const.ts +40 -0
  72. package/src/polytool/csv-to-json-monomer-lib-converter.ts +40 -0
  73. package/src/polytool/cyclized.ts +56 -0
  74. package/src/polytool/monomer-lib-handler.ts +115 -0
  75. package/src/polytool/transformation.ts +326 -0
  76. package/src/polytool/ui.ts +59 -0
  77. package/src/polytool/utils.ts +20 -0
  78. package/src/tests/const.ts +5 -5
  79. package/src/tests/formats-support.ts +6 -6
  80. package/src/tests/formats-to-helm.ts +5 -5
  81. package/src/tests/helm-to-nucleotides.ts +5 -5
  82. package/tsconfig.json +4 -10
  83. package/webpack.config.js +3 -0
  84. package/files/axolabs-style.json +0 -97
  85. package/src/model/data-loading-utils/json-loader.ts +0 -38
  86. package/src/model/pattern-app/const.ts +0 -33
  87. package/src/model/pattern-app/draw-svg.ts +0 -193
  88. package/src/model/pattern-app/helpers.ts +0 -96
  89. package/src/model/pattern-app/oligo-pattern.ts +0 -111
  90. package/src/view/app-ui.ts +0 -193
  91. package/src/view/apps/oligo-pattern.ts +0 -759
  92. package/src/view/apps/oligo-translator.ts +0 -184
  93. /package/src/{model → apps/common/model}/helpers.ts +0 -0
  94. /package/src/{model → apps/common/model}/monomer-lib/const.ts +0 -0
  95. /package/src/{view/utils → apps/common/view/components}/app-info-dialog.ts +0 -0
  96. /package/src/{view/utils → apps/common/view/components}/colored-input/input-painters.ts +0 -0
  97. /package/src/{view/style/colored-text-input.css → apps/common/view/components/colored-input/style.css} +0 -0
  98. /package/src/{view/utils → apps/common/view/components}/router.ts +0 -0
  99. /package/src/{model/structure-app → apps/structure/model}/const.ts +0 -0
  100. /package/src/{view/style/structure-app.css → apps/structure/view/style.css} +0 -0
  101. /package/src/{model/translator-app → apps/translator/model}/const.ts +0 -0
  102. /package/src/{view/style/translator-app.css → apps/translator/view/style.css} +0 -0
@@ -0,0 +1,159 @@
1
+ import * as ui from 'datagrok-api/ui';
2
+
3
+ import $ from 'cash-dom';
4
+
5
+ import {PATTERN_APP_DATA} from '../../../../common/model/data-loader/json-loader';
6
+ import {STRAND, STRANDS, STRAND_LABEL} from '../../../model/const';
7
+ import {EventBus} from '../../../model/event-bus';
8
+ import {StrandType} from '../../../model/types';
9
+ import {isOverhangNucleotide} from '../../../model/utils';
10
+ import {BooleanInput, StringInput} from '../../types';
11
+ import {SubscriptionManager} from '../../../model/subscription-manager';
12
+ import {DataManager} from '../../../model/data-manager';
13
+
14
+ export class StrandControls {
15
+ private displayedInputLabels: Map<StrandType, string[]>;
16
+
17
+ constructor(
18
+ private eventBus: EventBus,
19
+ private dataManager: DataManager,
20
+ private subscriptions: SubscriptionManager
21
+ ) {
22
+ const subscription = this.eventBus.nucleotideSequencesChanged$.subscribe(() => {
23
+ this.displayedInputLabels = this.computeDisplayedInputLabels();
24
+ });
25
+ this.subscriptions.add(subscription);
26
+ }
27
+
28
+ create(): HTMLDivElement {
29
+ const inputPanels = STRANDS.map((strand) => this.constructControlsPanel(strand));
30
+
31
+ const container = ui.divH(inputPanels, {style: {gap: '24px'}});
32
+ return container;
33
+ }
34
+
35
+ private constructControlsPanel(strand: StrandType): HTMLDivElement {
36
+ if (!this.eventBus.isAntisenseStrandActive() && strand === STRAND.ANTISENSE)
37
+ return ui.div([]);
38
+
39
+
40
+ const header = this.constructHeader();
41
+ const modificationControls = this.createControls(strand);
42
+
43
+ const container = ui.block([
44
+ ui.h1(`${STRAND_LABEL[strand]}`),
45
+ header,
46
+ modificationControls,
47
+ ], {style: {paddingTop: '12px'}});
48
+
49
+ return container;
50
+ }
51
+
52
+ private constructHeader() {
53
+ return ui.divH([
54
+ ui.div([ui.divText('#')], {style: {width: '20px'}}),
55
+ ui.block75([ui.divText('Modification')]),
56
+ ui.div([ui.divText('PTO')]),
57
+ ]);
58
+ }
59
+
60
+ private createControls(strand: StrandType): HTMLDivElement {
61
+ const nucleobaseInputs = this.createNucleobaseInputs(strand);
62
+ const labels = this.createLabelDivs(strand);
63
+ const ptoLinkageInputs = this.createPTOFlagInputs(strand);
64
+ const container = ui.div(nucleobaseInputs.map(
65
+ (nucleobaseInput, idx) => {
66
+ return ui.divH([
67
+ labels[idx],
68
+ ui.block75([nucleobaseInput.root]),
69
+ ptoLinkageInputs[idx].root,
70
+ ], {style: {alignItems: 'center'}});
71
+ }));
72
+ return container;
73
+ }
74
+
75
+ private createNucleobaseInputs(strand: StrandType): StringInput[] {
76
+ const nucleotideBaseChoices: string[] = this.dataManager.fetchAvailableNucleotideBases()
77
+ .sort(
78
+ (a, b) => a.toLowerCase().localeCompare(b.toLowerCase())
79
+ );
80
+ const nucleotides = this.eventBus.getNucleotideSequences()[strand];
81
+ const choiceInputs = nucleotides.map((nucleotide, index) => {
82
+ const input = ui.choiceInput<string>('', nucleotide, nucleotideBaseChoices);
83
+ input.onInput(() => {
84
+ const newValue = input.value!;
85
+ this.eventBus.setNucleotide(strand, index, newValue);
86
+ });
87
+ return input;
88
+ });
89
+
90
+ return choiceInputs;
91
+ }
92
+
93
+ private createPTOFlagInputs(strand: StrandType): BooleanInput[] {
94
+ const ptoLinkageFlags = this.eventBus.getPhosphorothioateLinkageFlags()[strand].slice(1);
95
+ const ptoLinkageInputs = ptoLinkageFlags.map((flag, index) => {
96
+ const input = ui.boolInput('', flag);
97
+ input.onInput(() => {
98
+ const newValue = input.value!;
99
+ this.eventBus.setPhosphorothioateLinkageFlag(strand, index + 1, newValue);
100
+ });
101
+
102
+ const subscription = this.eventBus.phosphorothioateLingeFlagsChanged$.subscribe((flags) => {
103
+ const newValue = flags[strand][index + 1];
104
+ input.value = newValue;
105
+ });
106
+ this.subscriptions.add(subscription);
107
+
108
+ return input;
109
+ });
110
+
111
+ return ptoLinkageInputs;
112
+ }
113
+
114
+ private computeDisplayedInputLabels(): Map<StrandType, string[]> {
115
+ const nucleotides = this.eventBus.getNucleotideSequences();
116
+ const labels = new Map<StrandType, string[]>();
117
+ STRANDS.forEach((strand) => {
118
+ let counter = 1;
119
+ const strandNucleotides = nucleotides[strand];
120
+ const strandLabels = strandNucleotides.map((nucleotide) => {
121
+ if (isOverhangNucleotide(nucleotide))
122
+ return '';
123
+
124
+ const label = String(counter);
125
+ counter++;
126
+ return label;
127
+ });
128
+ labels.set(strand, strandLabels);
129
+ });
130
+
131
+ return labels;
132
+ }
133
+
134
+ private createLabelDivs(strand: StrandType): HTMLElement[] {
135
+ const labels = this.createLabels(strand);
136
+ const labelDivs = labels.map((label) => ui.div([label], {style: {width: '20px'}}));
137
+
138
+ const subscription = this.eventBus.nucleotideSequencesChanged$.subscribe(() => {
139
+ const newLabels = this.createLabels(strand);
140
+ newLabels.forEach((newLabel, index) => {
141
+ $(labelDivs[index]).empty();
142
+ $(labelDivs[index]).append(newLabel);
143
+ });
144
+ });
145
+ this.subscriptions.add(subscription);
146
+
147
+ return labelDivs;
148
+ }
149
+
150
+ private createLabels(strand: StrandType): HTMLLabelElement[] {
151
+ const nucleotides = this.eventBus.getNucleotideSequences()[strand];
152
+ const labels = nucleotides.map((_, index) => {
153
+ const labelText = this.displayedInputLabels.get(strand)![index];
154
+ return ui.label(labelText);
155
+ });
156
+
157
+ return labels;
158
+ }
159
+ }
@@ -0,0 +1,127 @@
1
+ /* Do not change these import lines to match external modules in webpack configuration */
2
+ import * as DG from 'datagrok-api/dg';
3
+ import * as ui from 'datagrok-api/ui';
4
+
5
+ import $ from 'cash-dom';
6
+ import _ from 'lodash';
7
+
8
+ import {EventBus} from '../../model/event-bus';
9
+ import {PatternConfiguration, StrandType} from '../../model/types';
10
+ import {SubscriptionManager} from '../../model/subscription-manager';
11
+ import {STRAND, STRANDS, STRAND_LABEL, TERMINI, TERMINUS} from '../../model/const';
12
+ import {StringInput} from '../types';
13
+
14
+ export class TerminalModificationEditorDialog {
15
+ private static isDialogOpen = false;
16
+ private static instance: TerminalModificationEditorDialog;
17
+
18
+ private initialPatternConfig: PatternConfiguration;
19
+ private subscriptions = new SubscriptionManager();
20
+
21
+ private constructor(
22
+ private eventBus: EventBus
23
+ ) { }
24
+
25
+ static open(eventBus: EventBus): void {
26
+ if (TerminalModificationEditorDialog.isDialogOpen)
27
+ return;
28
+
29
+ if (!TerminalModificationEditorDialog.instance)
30
+ TerminalModificationEditorDialog.instance = new TerminalModificationEditorDialog(eventBus);
31
+
32
+ TerminalModificationEditorDialog.instance.openDialog();
33
+ }
34
+
35
+ private openDialog(): void {
36
+ this.initialPatternConfig = _.cloneDeep(this.eventBus.getPatternConfig());
37
+ TerminalModificationEditorDialog.isDialogOpen = true;
38
+ this.createDialog().show();
39
+ }
40
+
41
+ private createDialog(): DG.Dialog {
42
+ const editorBody = ui.divV([]);
43
+ this.subscriptions.add(
44
+ this.eventBus.strandsUpdated$.subscribe(() => this.onStrandsUpdated(editorBody))
45
+ );
46
+
47
+ const dialog = ui.dialog('Edit terminal modifications')
48
+ .add(editorBody)
49
+ .onOK(() => {})
50
+ .onCancel(() => this.resetToInitialState());
51
+
52
+ this.subscriptions.add(
53
+ dialog.onClose.subscribe(() => {
54
+ TerminalModificationEditorDialog.isDialogOpen = false;
55
+ this.subscriptions.unsubscribeAll();
56
+ })
57
+ );
58
+
59
+ return dialog;
60
+ }
61
+
62
+ private onStrandsUpdated(editorBody: HTMLDivElement) {
63
+ const controls = new StrandTerminalModificationControls(this.eventBus).create();
64
+
65
+ $(editorBody).empty();
66
+ $(editorBody).append(controls);
67
+ }
68
+
69
+ private resetToInitialState(): void {
70
+ // this.eventBus.setLastLoadedPatternConfig(this.initialPatternConfig);
71
+ this.eventBus.setPatternConfig(this.initialPatternConfig);
72
+ }
73
+ }
74
+
75
+ class StrandTerminalModificationControls {
76
+ constructor(
77
+ private eventBus: EventBus
78
+ ) { }
79
+
80
+ create(): HTMLDivElement {
81
+ const inputPanels = STRANDS.map((strand) => this.constructControlsPanel(strand));
82
+
83
+ const container = ui.divH(inputPanels, {style: {gap: '24px'}});
84
+ return container;
85
+ }
86
+
87
+ private constructControlsPanel(strand: StrandType): HTMLDivElement {
88
+ if (!this.eventBus.isAntisenseStrandActive() && strand === STRAND.ANTISENSE)
89
+ return ui.div([]);
90
+
91
+ const modificationControls = this.createInputs(strand);
92
+
93
+ const container = ui.block([
94
+ ui.h1(`${STRAND_LABEL[strand]}`),
95
+ modificationControls,
96
+ ], {style: {paddingTop: '12px'}});
97
+
98
+ return container;
99
+ }
100
+
101
+ private createInputs(strand: StrandType): HTMLElement {
102
+ const termini = strand === STRAND.SENSE ? [...TERMINI].reverse() : TERMINI;
103
+ const inputs = termini.map((terminus) => this.createInputForTerminus(strand, terminus)) as DG.InputBase[];
104
+ return ui.form(inputs);
105
+ }
106
+
107
+ private createInputForTerminus(strand: StrandType, terminus: TERMINUS): StringInput {
108
+ const initialValue = this.eventBus.getTerminalModifications()[strand][terminus];
109
+ const input = ui.textInput(terminus, initialValue);
110
+ this.applyStylingToInput(input);
111
+
112
+ input.onInput(() => {
113
+ const newValue = input.value;
114
+ if (newValue === null)
115
+ return;
116
+
117
+ this.eventBus.updateTerminusModification(strand, terminus, newValue);
118
+ });
119
+
120
+ return input;
121
+ }
122
+
123
+ private applyStylingToInput(input: StringInput): void {
124
+ const textarea = input.root.getElementsByTagName('textarea')[0];
125
+ $(textarea).css('resize', 'none');
126
+ }
127
+ }
@@ -0,0 +1,139 @@
1
+ import * as ui from 'datagrok-api/ui';
2
+
3
+ import '../style.css';
4
+
5
+ import {StringInput} from '../types';
6
+
7
+ import $ from 'cash-dom';
8
+ import {NUCLEOTIDES} from '../../../common/model/const';
9
+ import {STRAND, STRANDS, STRAND_LABEL} from '../../model/const';
10
+ import {DataManager} from '../../model/data-manager';
11
+ import {EventBus} from '../../model/event-bus';
12
+ import {applyPatternToRawSequence} from '../../model/translator';
13
+ import {SubscriptionManager} from '../../model/subscription-manager';
14
+
15
+
16
+ export class TranslationExamplesBlock {
17
+ private subscriptions = new SubscriptionManager();
18
+ constructor(
19
+ private eventBus: EventBus,
20
+ private dataManager: DataManager
21
+ ) { }
22
+
23
+ createContainer(): HTMLDivElement {
24
+ return ui.div([
25
+ ui.h1('Translation example'),
26
+ this.createTranslationExamples(),
27
+ ], {style: {paddingTop: '20px'}});
28
+ }
29
+
30
+ private createTranslationExamples(): HTMLDivElement {
31
+ const strandExamples = ui.divH([
32
+ ...this.getExampleElements(),
33
+ ], 'ui-form');
34
+
35
+ this.eventBus.antisenseStrandToggled$.subscribe(() => {
36
+ this.subscriptions.unsubscribeAll();
37
+ $(strandExamples).empty();
38
+ $(strandExamples).append(this.getExampleElements());
39
+ });
40
+
41
+ return strandExamples;
42
+ }
43
+
44
+ private getExampleElements(): HTMLDivElement[] {
45
+ return STRANDS.map(
46
+ (strand) => new StrandExample(strand, this.eventBus, this.subscriptions).create()
47
+ );
48
+ }
49
+ }
50
+
51
+ class StrandExample {
52
+ private inputExample: StringInput;
53
+ private outputExample: StringInput;
54
+
55
+ constructor(
56
+ private strand: STRAND,
57
+ private eventBus: EventBus,
58
+ private subscriptions: SubscriptionManager
59
+ ) { }
60
+
61
+ create(): HTMLDivElement {
62
+ if (!this.eventBus.isAntisenseStrandActive() && this.strand === STRAND.ANTISENSE)
63
+ return ui.div([]);
64
+
65
+ this.inputExample = this.createInputExample();
66
+ this.outputExample = this.createOutputExample(this.inputExample.value!);
67
+ this.subscribeToEvents();
68
+
69
+ const strandExample = ui.block50([
70
+ ui.h2(STRAND_LABEL[this.strand]),
71
+ this.inputExample.root,
72
+ this.outputExample.root,
73
+ ], {style: {paddingRight: '20px'}});
74
+ return strandExample;
75
+ }
76
+
77
+ private subscribeToEvents(): void {
78
+ const subscription = this.eventBus.strandsLinkagesAndTerminalsUpdated$.subscribe(() => {
79
+ const exampleInputSequence = this.generateExampleSequence();
80
+ this.inputExample.value = exampleInputSequence;
81
+ this.outputExample.value = this.computeOutputValue(exampleInputSequence);
82
+ });
83
+
84
+ if (this.strand === STRAND.ANTISENSE)
85
+ this.subscriptions.add(subscription);
86
+ }
87
+
88
+ private createInputExample(): StringInput {
89
+ const input = this.createTextInputForExamples();
90
+
91
+ const exampleInputSequence = this.generateExampleSequence();
92
+ input.value = exampleInputSequence;
93
+
94
+ input.setTooltip(`Example raw nucleotides input for ${STRAND_LABEL[this.strand]}`);
95
+
96
+ return input;
97
+ }
98
+
99
+ private generateExampleSequence(): string {
100
+ const sourceSequence = this.eventBus.getNucleotideSequences()[this.strand];
101
+ const exampleSequence = sourceSequence.map((_, index) => {
102
+ return NUCLEOTIDES[index % NUCLEOTIDES.length];
103
+ }).join('');
104
+
105
+ return exampleSequence;
106
+ }
107
+
108
+ private createOutputExample(exampleInputSequence: string): StringInput {
109
+ const output = this.createTextInputForExamples();
110
+ output.value = this.computeOutputValue(exampleInputSequence);
111
+
112
+ output.setTooltip(`Pattern applied to the example input for ${STRAND_LABEL[this.strand]}`);
113
+
114
+ return output;
115
+ }
116
+
117
+ private computeOutputValue(exampleInputSequence: string): string {
118
+ const modifications = this.eventBus.getNucleotideSequences()[this.strand];
119
+ const terminals = this.eventBus.getTerminalModifications()[this.strand];
120
+ const ptoFlags = this.eventBus.getPhosphorothioateLinkageFlags()[this.strand];
121
+ return applyPatternToRawSequence(
122
+ exampleInputSequence, modifications, ptoFlags, terminals
123
+ );
124
+ }
125
+
126
+ private createTextInputForExamples(): StringInput {
127
+ const input = ui.textInput('', '');
128
+ this.applyStylingToInput(input);
129
+
130
+ return input;
131
+ }
132
+
133
+ private applyStylingToInput(input: StringInput): void {
134
+ const textarea = input.root.getElementsByTagName('textarea')[0];
135
+ textarea.setAttribute('readonly', 'true');
136
+ $(textarea).css('resize', 'none');
137
+ $(input.root).css('opacity', '75%');
138
+ }
139
+ }
@@ -1 +1,5 @@
1
1
  /* Naming convention: class names should begin with st and app name to avoid naming collitions */
2
+
3
+ .st-pattern-text-input > textarea {
4
+ resize: none;
5
+ }
@@ -0,0 +1,63 @@
1
+ import {STRAND, TERMINUS, STRAND_END} from '../../model/const';
2
+
3
+ export const enum LUMINANCE_COEFFICIENTS {
4
+ RED = 0.299,
5
+ GREEN = 0.587,
6
+ BLUE = 0.114,
7
+ THRESHOLD = 186,
8
+ };
9
+
10
+ export const enum TEXT_COLOR {
11
+ DARK = '#333333',
12
+ LIGHT = '#ffffff',
13
+ };
14
+
15
+ export const enum SVG_CIRCLE_SIZES {
16
+ NUCLEOBASE_RADIUS = 15,
17
+ NUCLEOBASE_DIAMETER = 2 * NUCLEOBASE_RADIUS,
18
+ LEGEND_RADIUS = 6,
19
+ LINKAGE_STAR_RADIUS = 5,
20
+ };
21
+
22
+ export const enum SVG_TEXT_FONT_SIZES {
23
+ NUCLEOBASE = 17,
24
+ COMMENT = 14,
25
+ };
26
+
27
+ export const enum SVG_ELEMENT_COLORS {
28
+ LINKAGE_STAR = 'red',
29
+ TEXT = 'var(--grey-6)',
30
+ TITLE_TEXT = 'black',
31
+ MODIFICATION_TEXT = 'red'
32
+ };
33
+
34
+ export const STRAND_END_LABEL_TEXT = {
35
+ [STRAND_END.LEFT]: {
36
+ [STRAND.SENSE]: `${STRAND.SENSE}: ${TERMINUS.FIVE_PRIME}`,
37
+ [STRAND.ANTISENSE]: `${STRAND.ANTISENSE}: ${TERMINUS.THREE_PRIME}`,
38
+ },
39
+ [STRAND_END.RIGHT]: {
40
+ [STRAND.SENSE]: `${TERMINUS.THREE_PRIME}`,
41
+ [STRAND.ANTISENSE]: `${TERMINUS.FIVE_PRIME}`,
42
+ }
43
+ } as const;
44
+
45
+ export const NUMERIC_LABEL_POSITION_OFFSET = {
46
+ ONE_DIGIT: -5,
47
+ TWO_DIGIT: -10,
48
+ } as const;
49
+
50
+ export const DEFAULT_FONT_FAMILY = 'Arial';
51
+
52
+ export const Y_POSITIONS_FOR_STRAND_ELEMENTS = {
53
+ [STRAND.SENSE]: {
54
+ NUMERIC_LABEL: 2 * SVG_CIRCLE_SIZES.NUCLEOBASE_RADIUS,
55
+ NUCLEOBASE_CIRCLE: 3.5 * SVG_CIRCLE_SIZES.NUCLEOBASE_RADIUS,
56
+ NUCLEOBASE_LABEL: 4 * SVG_CIRCLE_SIZES.NUCLEOBASE_RADIUS,
57
+ },
58
+ [STRAND.ANTISENSE]: {
59
+ NUMERIC_LABEL: 8.5 * SVG_CIRCLE_SIZES.NUCLEOBASE_RADIUS,
60
+ NUCLEOBASE_CIRCLE: 6.5 * SVG_CIRCLE_SIZES.NUCLEOBASE_RADIUS,
61
+ NUCLEOBASE_LABEL: 7 * SVG_CIRCLE_SIZES.NUCLEOBASE_RADIUS,
62
+ }
63
+ };