diff --git a/src/apps/docking-viewer/index.ts b/src/apps/docking-viewer/index.ts
index c22b42be4f0d02b6e6bf8157d557fca29b9f059a..10574f79c1156950130528c7c84c32a13451ee42 100644
--- a/src/apps/docking-viewer/index.ts
+++ b/src/apps/docking-viewer/index.ts
@@ -54,7 +54,7 @@ const DefaultViewerOptions = {
 };
 
 class Viewer {
-    plugin: PluginUIContext
+    plugin: PluginUIContext;
 
     constructor(elementOrId: string | HTMLElement, colors = [Color(0x992211), Color(0xDDDDDD)], showButtons = true) {
         const o = { ...DefaultViewerOptions, ...{
diff --git a/src/apps/docking-viewer/viewport.tsx b/src/apps/docking-viewer/viewport.tsx
index 6be977980e1461ccd38a7335c6a7e1dc6083a65f..d34d58701f1d60761e71a40834daa7c4e0b0c042 100644
--- a/src/apps/docking-viewer/viewport.tsx
+++ b/src/apps/docking-viewer/viewport.tsx
@@ -230,7 +230,7 @@ export class ViewportComponent extends PluginUIComponent {
 
     set = async (preset: StructureRepresentationPresetProvider) => {
         await this._set(this.plugin.managers.structure.hierarchy.selection.structures, preset);
-    }
+    };
 
     structurePreset = () => this.set(StructurePreset);
     illustrativePreset = () => this.set(IllustrativePreset);
diff --git a/src/apps/viewer/index.ts b/src/apps/viewer/index.ts
index 4c8dde6c901dd088af8f8647be08b7cf78afa4c2..063c33be45e82ea39c6c3f3a76019e40badef4b1 100644
--- a/src/apps/viewer/index.ts
+++ b/src/apps/viewer/index.ts
@@ -95,7 +95,7 @@ const DefaultViewerOptions = {
 type ViewerOptions = typeof DefaultViewerOptions;
 
 export class Viewer {
-    plugin: PluginUIContext
+    plugin: PluginUIContext;
 
     constructor(elementOrId: string | HTMLElement, options: Partial<ViewerOptions> = {}) {
         const o = { ...DefaultViewerOptions, ...options };
diff --git a/src/examples/basic-wrapper/index.ts b/src/examples/basic-wrapper/index.ts
index 1bf4a5d4d7758b3a6a379199cc799f60f8da0fce..3ad7cb47f993d634078b1f28876a702a0336ef3c 100644
--- a/src/examples/basic-wrapper/index.ts
+++ b/src/examples/basic-wrapper/index.ts
@@ -95,7 +95,7 @@ class BasicWrapper {
             loop: () => { this.plugin.managers.animation.play(AnimateModelIndex, { duration: { name: 'computed', params: { targetFps: this.animateModelIndexTargetFps() } }, mode: { name: 'loop', params: { direction: 'forward' } } }); },
             stop: () => this.plugin.managers.animation.stop()
         }
-    }
+    };
 
     coloring = {
         applyStripes: async () => {
@@ -119,7 +119,7 @@ class BasicWrapper {
                 }
             });
         }
-    }
+    };
 
     interactivity = {
         highlightOn: () => {
@@ -137,7 +137,7 @@ class BasicWrapper {
         clearHighlight: () => {
             this.plugin.managers.interactivity.lociHighlights.highlightOnly({ loci: EmptyLoci });
         }
-    }
+    };
 
     tests = {
         staticSuperposition: async () => {
@@ -168,7 +168,7 @@ class BasicWrapper {
             PluginCommands.Toast.Hide(this.plugin, { key: 'toast-1' });
             PluginCommands.Toast.Hide(this.plugin, { key: 'toast-2' });
         }
-    }
+    };
 }
 
 (window as any).BasicMolStarWrapper = new BasicWrapper();
\ No newline at end of file
diff --git a/src/examples/proteopedia-wrapper/index.ts b/src/examples/proteopedia-wrapper/index.ts
index 26f6d852643fb9c220539b4bb2a38ffe6bf3f526..d430411809ea0991012e36de552c12d4145d310a 100644
--- a/src/examples/proteopedia-wrapper/index.ts
+++ b/src/examples/proteopedia-wrapper/index.ts
@@ -270,7 +270,7 @@ class MolStarProteopediaWrapper {
     camera = {
         toggleSpin: () => this.toggleSpin(),
         resetPosition: () => PluginCommands.Camera.Reset(this.plugin, { })
-    }
+    };
 
     private animateModelIndexTargetFps() {
         return Math.max(1, this.animate.modelIndex.targetFps | 0);
@@ -285,7 +285,7 @@ class MolStarProteopediaWrapper {
             loop: () => { this.plugin.managers.animation.play(AnimateModelIndex, { duration: { name: 'computed', params: { targetFps: this.animateModelIndexTargetFps() } }, mode: { name: 'loop', params: { direction: 'forward' } } }); },
             stop: () => this.plugin.managers.animation.stop()
         }
-    }
+    };
 
     coloring = {
         evolutionaryConservation: async (params?: { sequence?: boolean, het?: boolean, keepStyle?: boolean }) => {
@@ -306,7 +306,7 @@ class MolStarProteopediaWrapper {
 
             await PluginCommands.State.Update(this.plugin, { state, tree });
         }
-    }
+    };
 
     private experimentalDataElement?: Element = void 0;
     experimentalData = {
@@ -330,7 +330,7 @@ class MolStarProteopediaWrapper {
                 this.experimentalDataElement = void 0;
             }
         }
-    }
+    };
 
     hetGroups = {
         reset: () => {
@@ -397,7 +397,7 @@ class MolStarProteopediaWrapper {
             const snapshot = this.plugin.canvas3d!.camera.getFocus(sphere.center, radius);
             PluginCommands.Camera.SetSnapshot(this.plugin, { snapshot, durationMs: 250 });
         }
-    }
+    };
 
     snapshot = {
         get: (params?: PluginState.SnapshotParams) => {
@@ -420,7 +420,7 @@ class MolStarProteopediaWrapper {
             }
         }
 
-    }
+    };
 }
 
 (window as any).MolStarProteopediaWrapper = MolStarProteopediaWrapper;
\ No newline at end of file
diff --git a/src/extensions/anvil/behavior.ts b/src/extensions/anvil/behavior.ts
index 8339b34ac6f21c143717c1c626d9e18b90a90c87..c78edc3a156f998f10c70b37d636bddf72bcb9ea 100644
--- a/src/extensions/anvil/behavior.ts
+++ b/src/extensions/anvil/behavior.ts
@@ -30,7 +30,7 @@ export const ANVILMembraneOrientation = PluginBehavior.create<{ autoAttach: bool
         description: 'Data calculated with ANVIL algorithm.'
     },
     ctor: class extends PluginBehavior.Handler<{ autoAttach: boolean }> {
-        private provider = MembraneOrientationProvider
+        private provider = MembraneOrientationProvider;
 
         register(): void {
             DefaultQueryRuntimeTable.addCustomProp(this.provider.descriptor);
diff --git a/src/extensions/dnatco/confal-pyramids/behavior.ts b/src/extensions/dnatco/confal-pyramids/behavior.ts
index ae89a8e2524fe7df39cc4e2b9635a18dd9fcba78..6293e2b6cd60b8710dd2c0c3f68ea074980b2b52 100644
--- a/src/extensions/dnatco/confal-pyramids/behavior.ts
+++ b/src/extensions/dnatco/confal-pyramids/behavior.ts
@@ -66,7 +66,7 @@ export const DnatcoConfalPyramids = PluginBehavior.create<{ autoAttach: boolean,
                 /* TODO: Implement this */
                 return void 0;
             }
-        }
+        };
 
         register(): void {
             this.ctx.customModelProperties.register(this.provider, this.params.autoAttach);
diff --git a/src/extensions/dnatco/confal-pyramids/util.ts b/src/extensions/dnatco/confal-pyramids/util.ts
index 9a6e88ba79dec9a2ac0644aba6ce8cf261174d10..e84f84efe00f41fbd393966cfe5e021a0d8bcf1e 100644
--- a/src/extensions/dnatco/confal-pyramids/util.ts
+++ b/src/extensions/dnatco/confal-pyramids/util.ts
@@ -114,7 +114,7 @@ export namespace ConfalPyramidsUtil {
             this.modelNum = unit.model.modelNum;
         }
 
-        protected readonly data: CPT.PyramidsData
+        protected readonly data: CPT.PyramidsData;
         protected readonly hasMultipleModels: boolean;
         protected readonly entryId: string;
         protected readonly modelNum: number;
diff --git a/src/extensions/geo-export/controls.ts b/src/extensions/geo-export/controls.ts
index e87da196c882fd84cdb62112584a75e833b8ed64..11fe422a285c0122d28de94f750208cd2c5d9fe1 100644
--- a/src/extensions/geo-export/controls.ts
+++ b/src/extensions/geo-export/controls.ts
@@ -29,7 +29,7 @@ export const GeometryParams = {
 export class GeometryControls extends PluginComponent {
     readonly behaviors = {
         params: this.ev.behavior<PD.Values<typeof GeometryParams>>(PD.getDefaultValues(GeometryParams))
-    }
+    };
 
     private getFilename() {
         const models = this.plugin.state.data.select(StateSelection.Generators.rootsOfType(PluginStateObject.Molecule.Model)).map(s => s.obj!.data);
diff --git a/src/extensions/geo-export/ui.tsx b/src/extensions/geo-export/ui.tsx
index 87fb607cdb391197f7695e9df2e4f806e36f356f..45461b77abdeb470b2691050752f0caaaec0bc4e 100644
--- a/src/extensions/geo-export/ui.tsx
+++ b/src/extensions/geo-export/ui.tsx
@@ -85,7 +85,7 @@ export class GeometryExporterUI extends CollapsableControls<{}, State> {
         } finally {
             this.setState({ busy: false });
         }
-    }
+    };
 
     viewInAR = async () => {
         try {
@@ -104,5 +104,5 @@ export class GeometryExporterUI extends CollapsableControls<{}, State> {
         } finally {
             this.setState({ busy: false });
         }
-    }
+    };
 }
\ No newline at end of file
diff --git a/src/extensions/mp4-export/controls.ts b/src/extensions/mp4-export/controls.ts
index ba8acf6a9b587a4b026c2cb29f9942bd8332e22c..a8edd32816a919b64d0ce1337dc6e6084d2ed5bd 100644
--- a/src/extensions/mp4-export/controls.ts
+++ b/src/extensions/mp4-export/controls.ts
@@ -31,7 +31,7 @@ export class Mp4Controls extends PluginComponent {
         canApply: this.ev.behavior<PluginStateAnimation.CanApply>({ canApply: false }),
         info: this.ev.behavior<Mp4AnimationInfo>({ width: 0, height: 0 }),
         params: this.ev.behavior<PD.Values<typeof Mp4AnimationParams>>(PD.getDefaultValues(Mp4AnimationParams))
-    }
+    };
 
     setCurrent(name?: string) {
         const anim = this.animations.find(a => a.name === name);
diff --git a/src/extensions/mp4-export/ui.tsx b/src/extensions/mp4-export/ui.tsx
index 9b8f40a1269aafbf559c89047af4fc8f7dcbce70..0dbcd35c4c0200434616e520e845373e0260374a 100644
--- a/src/extensions/mp4-export/ui.tsx
+++ b/src/extensions/mp4-export/ui.tsx
@@ -108,7 +108,7 @@ export class Mp4EncoderUI extends CollapsableControls<{}, State> {
 
     save = () => {
         download(new Blob([this.state.data!.movie]), this.state.data!.filename);
-    }
+    };
 
     generate = async () => {
         try {
@@ -119,5 +119,5 @@ export class Mp4EncoderUI extends CollapsableControls<{}, State> {
             console.error(e);
             this.setState({ busy: false });
         }
-    }
+    };
 }
\ No newline at end of file
diff --git a/src/extensions/pdbe/structure-quality-report/behavior.ts b/src/extensions/pdbe/structure-quality-report/behavior.ts
index c9032be392abff34406454a319b7d2ab8e69f2e8..4fd3cd1f48bcd993eb7938b423c6d3d526cfefde 100644
--- a/src/extensions/pdbe/structure-quality-report/behavior.ts
+++ b/src/extensions/pdbe/structure-quality-report/behavior.ts
@@ -21,7 +21,7 @@ export const PDBeStructureQualityReport = PluginBehavior.create<{ autoAttach: bo
     },
     ctor: class extends PluginBehavior.Handler<{ autoAttach: boolean, showTooltip: boolean }> {
 
-        private provider = StructureQualityReportProvider
+        private provider = StructureQualityReportProvider;
 
         private labelPDBeValidation = {
             label: (loci: Loci): string | undefined => {
@@ -42,7 +42,7 @@ export const PDBeStructureQualityReport = PluginBehavior.create<{ autoAttach: bo
                     default: return void 0;
                 }
             }
-        }
+        };
 
         register(): void {
             this.ctx.customModelProperties.register(this.provider, this.params.autoAttach);
diff --git a/src/extensions/rcsb/assembly-symmetry/behavior.ts b/src/extensions/rcsb/assembly-symmetry/behavior.ts
index 9e032c80984592c59262c603f43235da0215d585..7bafe306e40b5eba771b50b0f75e151c0dd1fb19 100644
--- a/src/extensions/rcsb/assembly-symmetry/behavior.ts
+++ b/src/extensions/rcsb/assembly-symmetry/behavior.ts
@@ -27,7 +27,7 @@ export const RCSBAssemblySymmetry = PluginBehavior.create<{ autoAttach: boolean
         description: 'Assembly Symmetry data calculated with BioJava, obtained via RCSB PDB.'
     },
     ctor: class extends PluginBehavior.Handler<{ autoAttach: boolean }> {
-        private provider = AssemblySymmetryProvider
+        private provider = AssemblySymmetryProvider;
 
         register(): void {
             this.ctx.state.data.actions.add(InitAssemblySymmetry3D);
diff --git a/src/extensions/rcsb/assembly-symmetry/ui.tsx b/src/extensions/rcsb/assembly-symmetry/ui.tsx
index bafaa1575ed018d7ea2b842a08f0ade1dbea881f..12848ac57f82b43b02009947518cbe8e798ba9e0 100644
--- a/src/extensions/rcsb/assembly-symmetry/ui.tsx
+++ b/src/extensions/rcsb/assembly-symmetry/ui.tsx
@@ -118,7 +118,7 @@ export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySy
 
     paramsOnChange = (options: AssemblySymmetryProps) => {
         this.updateAssemblySymmetry(options);
-    }
+    };
 
     get hasAssemblySymmetry3D() {
         return !this.pivot.cell.parent || !!StateSelection.findTagInSubtree(this.pivot.cell.parent.tree, this.pivot.cell.transform.ref, AssemblySymmetry.Tag.Representation);
diff --git a/src/extensions/rcsb/validation-report/behavior.ts b/src/extensions/rcsb/validation-report/behavior.ts
index f1b589456d962766456b76855c7bbea87ceb2926..d1bf57a48698f0fdafd9c0e87b3e919601e96015 100644
--- a/src/extensions/rcsb/validation-report/behavior.ts
+++ b/src/extensions/rcsb/validation-report/behavior.ts
@@ -30,7 +30,7 @@ export const RCSBValidationReport = PluginBehavior.create<{ autoAttach: boolean,
         description: 'Data from wwPDB Validation Report, obtained via RCSB PDB.'
     },
     ctor: class extends PluginBehavior.Handler<{ autoAttach: boolean, showTooltip: boolean }> {
-        private provider = ValidationReportProvider
+        private provider = ValidationReportProvider;
 
         private labelProvider = {
             label: (loci: Loci): string | undefined => {
@@ -41,7 +41,7 @@ export const RCSBValidationReport = PluginBehavior.create<{ autoAttach: boolean,
                     randomCoilIndexLabel(loci)
                 ].filter(l => !!l).join('</br>');
             }
-        }
+        };
 
         register(): void {
             DefaultQueryRuntimeTable.addCustomProp(this.provider.descriptor);
diff --git a/src/mol-canvas3d/camera.ts b/src/mol-canvas3d/camera.ts
index 95074d76a1d1418d90c61ab2c28c8dea20f6df34..2cd6d53480cde80288fca2c8ac53a2afd6427a8e 100644
--- a/src/mol-canvas3d/camera.ts
+++ b/src/mol-canvas3d/camera.ts
@@ -37,7 +37,7 @@ class Camera implements ICamera {
     readonly projectionView: Mat4 = Mat4.identity();
     readonly inverseProjectionView: Mat4 = Mat4.identity();
 
-    private pixelScale: number
+    private pixelScale: number;
     get pixelRatio() {
         const dpr = (typeof window !== 'undefined') ? window.devicePixelRatio : 1;
         return dpr * this.pixelScale;
@@ -47,11 +47,11 @@ class Camera implements ICamera {
     readonly state: Readonly<Camera.Snapshot> = Camera.createDefaultSnapshot();
     readonly viewOffset = Camera.ViewOffset();
 
-    near = 1
-    far = 10000
-    fogNear = 5000
-    fogFar = 10000
-    zoom = 1
+    near = 1;
+    far = 10000;
+    fogNear = 5000;
+    fogFar = 10000;
+    zoom = 1;
 
     readonly transition: CameraTransitionManager = new CameraTransitionManager(this);
     readonly stateChanged = new BehaviorSubject<Partial<Camera.Snapshot>>(this.state);
diff --git a/src/mol-canvas3d/camera/stereo.ts b/src/mol-canvas3d/camera/stereo.ts
index 956e3762753cbedef5e957472578969178cfa83c..0111427191417c5e81137c60bff2f1144b38b560 100644
--- a/src/mol-canvas3d/camera/stereo.ts
+++ b/src/mol-canvas3d/camera/stereo.ts
@@ -33,7 +33,7 @@ class StereoCamera {
         return this.parent.viewOffset;
     }
 
-    private props: StereoCameraProps
+    private props: StereoCameraProps;
 
     constructor(private parent: Camera, props: Partial<StereoCameraProps> = {}) {
         this.props = { ...DefaultStereoCameraProps, ...props };
diff --git a/src/mol-canvas3d/helper/bounding-sphere-helper.ts b/src/mol-canvas3d/helper/bounding-sphere-helper.ts
index ec230bf1f119ae7c251e8f18506c78d8e6e72aa8..aa673adef7365ce52d4f3ed8558d326136e081c5 100644
--- a/src/mol-canvas3d/helper/bounding-sphere-helper.ts
+++ b/src/mol-canvas3d/helper/bounding-sphere-helper.ts
@@ -31,14 +31,14 @@ export type DebugHelperProps = PD.Values<DebugHelperParams>
 type BoundingSphereData = { boundingSphere: Sphere3D, renderObject: GraphicsRenderObject, mesh: Mesh }
 
 export class BoundingSphereHelper {
-    readonly scene: Scene
-
-    private readonly parent: Scene
-    private _props: DebugHelperProps
-    private objectsData = new Map<GraphicsRenderObject, BoundingSphereData>()
-    private instancesData = new Map<GraphicsRenderObject, BoundingSphereData>()
-    private sceneData: BoundingSphereData | undefined
-    private visibleSceneData: BoundingSphereData | undefined
+    readonly scene: Scene;
+
+    private readonly parent: Scene;
+    private _props: DebugHelperProps;
+    private objectsData = new Map<GraphicsRenderObject, BoundingSphereData>();
+    private instancesData = new Map<GraphicsRenderObject, BoundingSphereData>();
+    private sceneData: BoundingSphereData | undefined;
+    private visibleSceneData: BoundingSphereData | undefined;
 
     constructor(ctx: WebGLContext, parent: Scene, props: Partial<DebugHelperProps>) {
         this.scene = Scene.create(ctx);
diff --git a/src/mol-canvas3d/helper/camera-helper.ts b/src/mol-canvas3d/helper/camera-helper.ts
index c93437f244b895d3bd312df4724b3fe6319abbee..6beb962a76d048f15d522d131872958b7bcba7fa 100644
--- a/src/mol-canvas3d/helper/camera-helper.ts
+++ b/src/mol-canvas3d/helper/camera-helper.ts
@@ -49,13 +49,13 @@ export type CameraHelperParams = typeof CameraHelperParams
 export type CameraHelperProps = PD.Values<CameraHelperParams>
 
 export class CameraHelper {
-    scene: Scene
-    camera: Camera
+    scene: Scene;
+    camera: Camera;
     props: CameraHelperProps = {
         axes: { name: 'off', params: {} }
-    }
+    };
 
-    private renderObject: GraphicsRenderObject | undefined
+    private renderObject: GraphicsRenderObject | undefined;
 
     constructor(private webgl: WebGLContext, props: Partial<CameraHelperProps> = {}) {
         this.scene = Scene.create(webgl);
@@ -109,7 +109,7 @@ export class CameraHelper {
             if (apply(Interval.ofSingleton(idx))) changed = true;
         }
         return changed;
-    }
+    };
 
     mark(loci: Loci, action: MarkerAction) {
         if (!MarkerActions.is(MarkerActions.Highlighting, action)) return false;
diff --git a/src/mol-canvas3d/helper/handle-helper.ts b/src/mol-canvas3d/helper/handle-helper.ts
index 542dcb63fc6f50b470bc199940bb44f014b5dcc9..303b67a1256c53af3344a1cd533b7a09836d0b52 100644
--- a/src/mol-canvas3d/helper/handle-helper.ts
+++ b/src/mol-canvas3d/helper/handle-helper.ts
@@ -47,12 +47,12 @@ export type HandleHelperParams = typeof HandleHelperParams
 export type HandleHelperProps = PD.Values<HandleHelperParams>
 
 export class HandleHelper {
-    scene: Scene
+    scene: Scene;
     props: HandleHelperProps = {
         handle: { name: 'off', params: {} }
-    }
+    };
 
-    private renderObject: GraphicsRenderObject | undefined
+    private renderObject: GraphicsRenderObject | undefined;
 
     private _transform = Mat4();
     getBoundingSphere(out: Sphere3D, instanceId: number) {
@@ -117,7 +117,7 @@ export class HandleHelper {
             if (apply(Interval.ofSingleton(idx))) changed = true;
         }
         return changed;
-    }
+    };
 
     mark(loci: Loci, action: MarkerAction) {
         if (!MarkerActions.is(MarkerActions.Highlighting, action)) return false;
diff --git a/src/mol-canvas3d/helper/helper.ts b/src/mol-canvas3d/helper/helper.ts
index 2837d05fb40eebd9eeca2c43045b7f38ab432ee8..9603b05b8386e0c4e780812951d9f8dbda0500e9 100644
--- a/src/mol-canvas3d/helper/helper.ts
+++ b/src/mol-canvas3d/helper/helper.ts
@@ -23,9 +23,9 @@ export type HelperProps = PD.Values<typeof HelperParams>
 
 
 export class Helper {
-    readonly debug: BoundingSphereHelper
-    readonly camera: CameraHelper
-    readonly handle: HandleHelper
+    readonly debug: BoundingSphereHelper;
+    readonly camera: CameraHelper;
+    readonly handle: HandleHelper;
 
     constructor(webgl: WebGLContext, scene: Scene, props: Partial<HelperProps> = {}) {
         const p = { ...DefaultHelperProps, ...props };
diff --git a/src/mol-canvas3d/passes/draw.ts b/src/mol-canvas3d/passes/draw.ts
index 5b5b37d261e17cfd3e080de805214b67e3346e17..25eae12b6c055fbd62bad8612f0b2105fdf241a0 100644
--- a/src/mol-canvas3d/passes/draw.ts
+++ b/src/mol-canvas3d/passes/draw.ts
@@ -54,27 +54,27 @@ function getDepthMergeRenderable(ctx: WebGLContext, depthTexturePrimitives: Text
 }
 
 export class DrawPass {
-    private readonly drawTarget: RenderTarget
+    private readonly drawTarget: RenderTarget;
 
-    readonly colorTarget: RenderTarget
-    readonly depthTexture: Texture
-    readonly depthTexturePrimitives: Texture
+    readonly colorTarget: RenderTarget;
+    readonly depthTexture: Texture;
+    readonly depthTexturePrimitives: Texture;
 
-    readonly packedDepth: boolean
+    readonly packedDepth: boolean;
 
-    private depthTarget: RenderTarget
-    private depthTargetPrimitives: RenderTarget | null
-    private depthTargetVolumes: RenderTarget | null
-    private depthTextureVolumes: Texture
-    private depthMerge: DepthMergeRenderable
+    private depthTarget: RenderTarget;
+    private depthTargetPrimitives: RenderTarget | null;
+    private depthTargetVolumes: RenderTarget | null;
+    private depthTextureVolumes: Texture;
+    private depthMerge: DepthMergeRenderable;
 
-    private copyFboTarget: CopyRenderable
-    private copyFboPostprocessing: CopyRenderable
+    private copyFboTarget: CopyRenderable;
+    private copyFboPostprocessing: CopyRenderable;
 
-    private wboit: WboitPass | undefined
-    private readonly marking: MarkingPass
-    readonly postprocessing: PostprocessingPass
-    private readonly antialiasing: AntialiasingPass
+    private wboit: WboitPass | undefined;
+    private readonly marking: MarkingPass;
+    readonly postprocessing: PostprocessingPass;
+    private readonly antialiasing: AntialiasingPass;
 
     get wboitEnabled() {
         return !!this.wboit?.supported;
diff --git a/src/mol-canvas3d/passes/fxaa.ts b/src/mol-canvas3d/passes/fxaa.ts
index 127309601796817b92bd909854a5c872b2f2d16e..d7aac98f5ed430f69fa494ebd0173251eec5c0b9 100644
--- a/src/mol-canvas3d/passes/fxaa.ts
+++ b/src/mol-canvas3d/passes/fxaa.ts
@@ -28,7 +28,7 @@ export const FxaaParams = {
 export type FxaaProps = PD.Values<typeof FxaaParams>
 
 export class FxaaPass {
-    private readonly renderable: FxaaRenderable
+    private readonly renderable: FxaaRenderable;
 
     constructor(private webgl: WebGLContext, input: Texture) {
         this.renderable = getFxaaRenderable(webgl, input);
diff --git a/src/mol-canvas3d/passes/image.ts b/src/mol-canvas3d/passes/image.ts
index bf56b9300e317f26da3ccc1bdd96c8c3e3c51c81..9c88fe34bbbae1caa71ff8a6d72b5960779de157 100644
--- a/src/mol-canvas3d/passes/image.ts
+++ b/src/mol-canvas3d/passes/image.ts
@@ -30,19 +30,19 @@ export const ImageParams = {
 export type ImageProps = PD.Values<typeof ImageParams>
 
 export class ImagePass {
-    private _width = 0
-    private _height = 0
-    private _camera = new Camera()
+    private _width = 0;
+    private _height = 0;
+    private _camera = new Camera();
 
-    readonly props: ImageProps
+    readonly props: ImageProps;
 
-    private _colorTarget: RenderTarget
+    private _colorTarget: RenderTarget;
     get colorTarget() { return this._colorTarget; }
 
-    private readonly drawPass: DrawPass
-    private readonly multiSamplePass: MultiSamplePass
-    private readonly multiSampleHelper: MultiSampleHelper
-    private readonly helper: Helper
+    private readonly drawPass: DrawPass;
+    private readonly multiSamplePass: MultiSamplePass;
+    private readonly multiSampleHelper: MultiSampleHelper;
+    private readonly helper: Helper;
 
     get width() { return this._width; }
     get height() { return this._height; }
diff --git a/src/mol-canvas3d/passes/marking.ts b/src/mol-canvas3d/passes/marking.ts
index df19ea731db269c87f2be5873c97891afdc4d861..fa5223dfc5354461f7a8943f6bb32e25ed9a01ab 100644
--- a/src/mol-canvas3d/passes/marking.ts
+++ b/src/mol-canvas3d/passes/marking.ts
@@ -36,12 +36,12 @@ export class MarkingPass {
         return props.enabled;
     }
 
-    readonly depthTarget: RenderTarget
-    readonly maskTarget: RenderTarget
-    private readonly edgesTarget: RenderTarget
+    readonly depthTarget: RenderTarget;
+    readonly maskTarget: RenderTarget;
+    private readonly edgesTarget: RenderTarget;
 
-    private readonly edge: EdgeRenderable
-    private readonly overlay: OverlayRenderable
+    private readonly edge: EdgeRenderable;
+    private readonly overlay: OverlayRenderable;
 
     constructor(private webgl: WebGLContext, width: number, height: number) {
         this.depthTarget = webgl.createRenderTarget(width, height);
diff --git a/src/mol-canvas3d/passes/multi-sample.ts b/src/mol-canvas3d/passes/multi-sample.ts
index 082326bbe8d7ffeeef57c50cd85b773ce1283fe8..6c7b24b22c9be056549b50dd577dd6335b998ade 100644
--- a/src/mol-canvas3d/passes/multi-sample.ts
+++ b/src/mol-canvas3d/passes/multi-sample.ts
@@ -66,11 +66,11 @@ export class MultiSamplePass {
         return props.mode !== 'off';
     }
 
-    colorTarget: RenderTarget
+    colorTarget: RenderTarget;
 
-    private composeTarget: RenderTarget
-    private holdTarget: RenderTarget
-    private compose: ComposeRenderable
+    private composeTarget: RenderTarget;
+    private holdTarget: RenderTarget;
+    private compose: ComposeRenderable;
 
     constructor(private webgl: WebGLContext, private drawPass: DrawPass) {
         const { colorBufferFloat, textureFloat, colorBufferHalfFloat, textureHalfFloat } = webgl.extensions;
@@ -317,7 +317,7 @@ JitterVectors.forEach(offsetList => {
 });
 
 export class MultiSampleHelper {
-    private sampleIndex = -2
+    private sampleIndex = -2;
 
     update(changed: boolean, props: MultiSampleProps) {
         if (changed) this.sampleIndex = -1;
diff --git a/src/mol-canvas3d/passes/passes.ts b/src/mol-canvas3d/passes/passes.ts
index cc61b18b7048192fa04948787356dbad44ee6b08..208795e33bb2af60d8966f2f857fb87dc594087a 100644
--- a/src/mol-canvas3d/passes/passes.ts
+++ b/src/mol-canvas3d/passes/passes.ts
@@ -10,9 +10,9 @@ import { MultiSamplePass } from './multi-sample';
 import { WebGLContext } from '../../mol-gl/webgl/context';
 
 export class Passes {
-    readonly draw: DrawPass
-    readonly pick: PickPass
-    readonly multiSample: MultiSamplePass
+    readonly draw: DrawPass;
+    readonly pick: PickPass;
+    readonly multiSample: MultiSamplePass;
 
     constructor(private webgl: WebGLContext, attribs: Partial<{ pickScale: number, enableWboit: boolean }> = {}) {
         const { gl } = webgl;
diff --git a/src/mol-canvas3d/passes/pick.ts b/src/mol-canvas3d/passes/pick.ts
index 130fe9d80affe760eed23f612d399ed1372b503b..ee2d7f7b89c1d9fc46eaca3fcefa8879e9ec44a5 100644
--- a/src/mol-canvas3d/passes/pick.ts
+++ b/src/mol-canvas3d/passes/pick.ts
@@ -25,13 +25,13 @@ const NullId = Math.pow(2, 24) - 2;
 export type PickData = { id: PickingId, position: Vec3 }
 
 export class PickPass {
-    readonly objectPickTarget: RenderTarget
-    readonly instancePickTarget: RenderTarget
-    readonly groupPickTarget: RenderTarget
-    readonly depthPickTarget: RenderTarget
+    readonly objectPickTarget: RenderTarget;
+    readonly instancePickTarget: RenderTarget;
+    readonly groupPickTarget: RenderTarget;
+    readonly depthPickTarget: RenderTarget;
 
-    private pickWidth: number
-    private pickHeight: number
+    private pickWidth: number;
+    private pickHeight: number;
 
     constructor(private webgl: WebGLContext, private drawPass: DrawPass, readonly pickBaseScale: number) {
         const pickScale = pickBaseScale / webgl.pixelRatio;
@@ -97,23 +97,23 @@ export class PickPass {
 }
 
 export class PickHelper {
-    dirty = true
+    dirty = true;
 
-    private objectBuffer: Uint8Array
-    private instanceBuffer: Uint8Array
-    private groupBuffer: Uint8Array
-    private depthBuffer: Uint8Array
+    private objectBuffer: Uint8Array;
+    private instanceBuffer: Uint8Array;
+    private groupBuffer: Uint8Array;
+    private depthBuffer: Uint8Array;
 
-    private viewport = Viewport()
+    private viewport = Viewport();
 
-    private pickScale: number
-    private pickX: number
-    private pickY: number
-    private pickWidth: number
-    private pickHeight: number
-    private halfPickWidth: number
+    private pickScale: number;
+    private pickX: number;
+    private pickY: number;
+    private pickWidth: number;
+    private pickHeight: number;
+    private halfPickWidth: number;
 
-    private spiral: [number, number][]
+    private spiral: [number, number][];
 
     private setupBuffers() {
         const bufferSize = this.pickWidth * this.pickHeight * 4;
diff --git a/src/mol-canvas3d/passes/postprocessing.ts b/src/mol-canvas3d/passes/postprocessing.ts
index 5f013e24811d62a5956a463d8700ad252fec3413..f3f27a6e398faeb250125ce4af9bd9f88b2ed86e 100644
--- a/src/mol-canvas3d/passes/postprocessing.ts
+++ b/src/mol-canvas3d/passes/postprocessing.ts
@@ -271,29 +271,29 @@ export class PostprocessingPass {
         return props.occlusion.name === 'on' || props.outline.name === 'on';
     }
 
-    readonly target: RenderTarget
+    readonly target: RenderTarget;
 
-    private readonly outlinesTarget: RenderTarget
-    private readonly outlinesRenderable: OutlinesRenderable
+    private readonly outlinesTarget: RenderTarget;
+    private readonly outlinesRenderable: OutlinesRenderable;
 
-    private readonly randomHemisphereVector: Vec3[]
-    private readonly ssaoFramebuffer: Framebuffer
-    private readonly ssaoBlurFirstPassFramebuffer: Framebuffer
-    private readonly ssaoBlurSecondPassFramebuffer: Framebuffer
+    private readonly randomHemisphereVector: Vec3[];
+    private readonly ssaoFramebuffer: Framebuffer;
+    private readonly ssaoBlurFirstPassFramebuffer: Framebuffer;
+    private readonly ssaoBlurSecondPassFramebuffer: Framebuffer;
 
-    private readonly ssaoDepthTexture: Texture
-    private readonly ssaoDepthBlurProxyTexture: Texture
+    private readonly ssaoDepthTexture: Texture;
+    private readonly ssaoDepthBlurProxyTexture: Texture;
 
-    private readonly ssaoRenderable: SsaoRenderable
-    private readonly ssaoBlurFirstPassRenderable: SsaoBlurRenderable
-    private readonly ssaoBlurSecondPassRenderable: SsaoBlurRenderable
+    private readonly ssaoRenderable: SsaoRenderable;
+    private readonly ssaoBlurFirstPassRenderable: SsaoBlurRenderable;
+    private readonly ssaoBlurSecondPassRenderable: SsaoBlurRenderable;
 
-    private nSamples: number
-    private blurKernelSize: number
+    private nSamples: number;
+    private blurKernelSize: number;
 
-    private readonly renderable: PostprocessingRenderable
+    private readonly renderable: PostprocessingRenderable;
 
-    private ssaoScale: number
+    private ssaoScale: number;
     private calcSsaoScale() {
         // downscale ssao for high pixel-ratios
         return Math.min(1, 1 / this.webgl.pixelRatio);
@@ -543,9 +543,9 @@ export class AntialiasingPass {
         return props.antialiasing.name !== 'off';
     }
 
-    readonly target: RenderTarget
-    private readonly fxaa: FxaaPass
-    private readonly smaa: SmaaPass
+    readonly target: RenderTarget;
+    private readonly fxaa: FxaaPass;
+    private readonly smaa: SmaaPass;
 
     constructor(webgl: WebGLContext, private drawPass: DrawPass) {
         const { colorTarget } = drawPass;
diff --git a/src/mol-canvas3d/passes/smaa.ts b/src/mol-canvas3d/passes/smaa.ts
index 4572ad613f9457aa024560070d9439bcf96decf5..cbeea8cb48748ac9ec1bdba0bfec0bcaf7639781 100644
--- a/src/mol-canvas3d/passes/smaa.ts
+++ b/src/mol-canvas3d/passes/smaa.ts
@@ -31,12 +31,12 @@ export const SmaaParams = {
 export type SmaaProps = PD.Values<typeof SmaaParams>
 
 export class SmaaPass {
-    private readonly edgesTarget: RenderTarget
-    private readonly weightsTarget: RenderTarget
+    private readonly edgesTarget: RenderTarget;
+    private readonly weightsTarget: RenderTarget;
 
-    private readonly edgesRenderable: EdgesRenderable
-    private readonly weightsRenderable: WeightsRenderable
-    private readonly blendRenderable: BlendRenderable
+    private readonly edgesRenderable: EdgesRenderable;
+    private readonly weightsRenderable: WeightsRenderable;
+    private readonly blendRenderable: BlendRenderable;
 
     private _supported = false;
     get supported() {
diff --git a/src/mol-canvas3d/passes/wboit.ts b/src/mol-canvas3d/passes/wboit.ts
index 8c29442ca5b889a120a9bb8941b4f230046e0b1b..89c39d7fbe22fec8974daf264de33fb5e9ae1b0f 100644
--- a/src/mol-canvas3d/passes/wboit.ts
+++ b/src/mol-canvas3d/passes/wboit.ts
@@ -45,11 +45,11 @@ function getEvaluateWboitRenderable(ctx: WebGLContext, wboitATexture: Texture, w
 //
 
 export class WboitPass {
-    private readonly renderable: EvaluateWboitRenderable
+    private readonly renderable: EvaluateWboitRenderable;
 
-    private readonly framebuffer: Framebuffer
-    private readonly textureA: Texture
-    private readonly textureB: Texture
+    private readonly framebuffer: Framebuffer;
+    private readonly textureA: Texture;
+    private readonly textureB: Texture;
 
     private _supported = false;
     get supported() {
diff --git a/src/mol-data/int/sorted-ranges.ts b/src/mol-data/int/sorted-ranges.ts
index 7086b0fc38800737fe8b03360bf37217812da2bb..95a36d866abfeb83ac4e36740e1963ede8525a41 100644
--- a/src/mol-data/int/sorted-ranges.ts
+++ b/src/mol-data/int/sorted-ranges.ts
@@ -87,9 +87,9 @@ namespace SortedRanges {
     }
 
     export class Iterator<T extends number = number, I extends number = number> implements _Iterator<Segmentation.Segment<I>> {
-        private value: Segmentation.Segment<I> = { index: 0 as I, start: 0 as T, end: 0 as T }
+        private value: Segmentation.Segment<I> = { index: 0 as I, start: 0 as T, end: 0 as T };
 
-        private curIndex = 0
+        private curIndex = 0;
 
         hasNext: boolean = false;
 
diff --git a/src/mol-data/util/combination.ts b/src/mol-data/util/combination.ts
index 751927520511268c74ad7daa18d5c65452f371b1..7cc162f50a8c39b43c78337163d8e6d5752c71b9 100644
--- a/src/mol-data/util/combination.ts
+++ b/src/mol-data/util/combination.ts
@@ -28,11 +28,11 @@ function nextIndex(n: number) {
 };
 
 export class CombinationIterator<T> implements Iterator<ReadonlyArray<T>> {
-    private value: T[]
-    private index: number
-    private maxIndex: number
+    private value: T[];
+    private index: number;
+    private maxIndex: number;
 
-    size: number
+    size: number;
     hasNext: boolean = false;
 
     move() {
diff --git a/src/mol-data/util/interval-iterator.ts b/src/mol-data/util/interval-iterator.ts
index b6fb217b1547c8319ce8342b5bb295c42cb9f591..2c495d9f829d3785749afa02cbfa37a04cba5e29 100644
--- a/src/mol-data/util/interval-iterator.ts
+++ b/src/mol-data/util/interval-iterator.ts
@@ -9,10 +9,10 @@ import { OrderedSet, Interval, Segmentation } from '../int';
 
 /** Emits a segment of length one for each element in the interval that is also in the set */
 export class IntervalIterator<I extends number = number> implements Iterator<Segmentation.Segment<I>> {
-    private value: Segmentation.Segment<I> = { index: 0 as I, start: 0, end: 0 }
+    private value: Segmentation.Segment<I> = { index: 0 as I, start: 0, end: 0 };
 
-    private curIndex = 0
-    private maxIndex = 0
+    private curIndex = 0;
+    private maxIndex = 0;
 
     hasNext: boolean = false;
 
diff --git a/src/mol-geo/geometry/text/font-atlas.ts b/src/mol-geo/geometry/text/font-atlas.ts
index f4355d228a626de1de5b0520647bdddf04bb8609..609a6985a50ab450799a602ed1ae91caaa95beb3 100644
--- a/src/mol-geo/geometry/text/font-atlas.ts
+++ b/src/mol-geo/geometry/text/font-atlas.ts
@@ -39,35 +39,35 @@ export type FontAtlasMap = {
 }
 
 export class FontAtlas {
-    readonly props: Readonly<FontAtlasProps>
-    readonly mapped: { [k: string]: FontAtlasMap } = {}
-    readonly placeholder: FontAtlasMap
-    readonly texture: TextureImage<Uint8Array>
-
-    private scratchW = 0
-    private scratchH = 0
-    private currentX = 0
-    private currentY = 0
-    private readonly scratchData: Uint8Array
-
-    private readonly cutoff = 0.5
-    readonly buffer: number
-    private readonly radius: number
-
-    private gridOuter: Float64Array
-    private gridInner: Float64Array
-    private f: Float64Array
-    private d: Float64Array
-    private z: Float64Array
-    private v: Int16Array
-
-    private scratchCanvas: HTMLCanvasElement
-    private scratchContext: CanvasRenderingContext2D
-
-    readonly lineHeight: number
-
-    private readonly maxWidth: number
-    private readonly middle: number
+    readonly props: Readonly<FontAtlasProps>;
+    readonly mapped: { [k: string]: FontAtlasMap } = {};
+    readonly placeholder: FontAtlasMap;
+    readonly texture: TextureImage<Uint8Array>;
+
+    private scratchW = 0;
+    private scratchH = 0;
+    private currentX = 0;
+    private currentY = 0;
+    private readonly scratchData: Uint8Array;
+
+    private readonly cutoff = 0.5;
+    readonly buffer: number;
+    private readonly radius: number;
+
+    private gridOuter: Float64Array;
+    private gridInner: Float64Array;
+    private f: Float64Array;
+    private d: Float64Array;
+    private z: Float64Array;
+    private v: Int16Array;
+
+    private scratchCanvas: HTMLCanvasElement;
+    private scratchContext: CanvasRenderingContext2D;
+
+    readonly lineHeight: number;
+
+    private readonly maxWidth: number;
+    private readonly middle: number;
 
     constructor(props: Partial<FontAtlasProps> = {}) {
         const p = { ...PD.getDefaultValues(FontAtlasParams), ...props };
diff --git a/src/mol-geo/geometry/texture-mesh/texture-mesh.ts b/src/mol-geo/geometry/texture-mesh/texture-mesh.ts
index 3a5eb21c7413a423bc22e546a4f3d290ecae673d..890e476d98ce39bebea7135d51194ace46bf67fe 100644
--- a/src/mol-geo/geometry/texture-mesh/texture-mesh.ts
+++ b/src/mol-geo/geometry/texture-mesh/texture-mesh.ts
@@ -47,7 +47,7 @@ export interface TextureMesh {
 export namespace TextureMesh {
     export class DoubleBuffer {
         private index = 0;
-        private textures: ({ vertex: Texture, group: Texture, normal: Texture } | undefined)[] = []
+        private textures: ({ vertex: Texture, group: Texture, normal: Texture } | undefined)[] = [];
 
         get() {
             return this.textures[this.index];
diff --git a/src/mol-geo/util/marching-cubes/algorithm.ts b/src/mol-geo/util/marching-cubes/algorithm.ts
index 067c2d6c39fac81a4aad38353133a8fdfa54cc5e..b6e84e918a1291303561cc0ff20190349603b8e3 100644
--- a/src/mol-geo/util/marching-cubes/algorithm.ts
+++ b/src/mol-geo/util/marching-cubes/algorithm.ts
@@ -72,7 +72,7 @@ export function computeMarchingCubesLines(params: MarchingCubesParams, lines?: L
 class MarchingCubesComputation {
     private size: number;
     private sliceSize: number;
-    private edgeFilter: number
+    private edgeFilter: number;
 
     private minX = 0; private minY = 0; private minZ = 0;
     private maxX = 0; private maxY = 0; private maxZ = 0;
diff --git a/src/mol-math/geometry/boundary-helper.ts b/src/mol-math/geometry/boundary-helper.ts
index 9d2532a58cfc1c8a73cc9ad9f644f8b2eb7d12f1..c49ff1afddb6bd9a9816495bb94a963afc1ae87e 100644
--- a/src/mol-math/geometry/boundary-helper.ts
+++ b/src/mol-math/geometry/boundary-helper.ts
@@ -12,12 +12,12 @@ import { Box3D } from './primitives/box3d';
 // implementing http://www.ep.liu.se/ecp/034/009/ecp083409.pdf
 
 export class BoundaryHelper {
-    private dir: Vec3[]
+    private dir: Vec3[];
 
-    private minDist: number[] = []
-    private maxDist: number[] = []
-    private extrema: Vec3[] = []
-    centroidHelper = new CentroidHelper()
+    private minDist: number[] = [];
+    private maxDist: number[] = [];
+    private extrema: Vec3[] = [];
+    centroidHelper = new CentroidHelper();
 
     private computeExtrema(i: number, p: Vec3) {
         const d = Vec3.dot(this.dir[i], p);
diff --git a/src/mol-math/geometry/lookup3d/grid.ts b/src/mol-math/geometry/lookup3d/grid.ts
index a4f4443d59ad148f51cf2b8ed018baf33d7771b0..9a3019e479571ae1d422dd7723aa382a068dd4fb 100644
--- a/src/mol-math/geometry/lookup3d/grid.ts
+++ b/src/mol-math/geometry/lookup3d/grid.ts
@@ -27,7 +27,7 @@ class GridLookup3DImpl<T extends number = number> implements GridLookup3D<T> {
     private ctx: QueryContext;
     boundary: Lookup3D['boundary'];
     buckets: GridLookup3D['buckets'];
-    result: Result<T>
+    result: Result<T>;
 
     find(x: number, y: number, z: number, radius: number, result?: Result<T>): Result<T> {
         this.ctx.x = x;
diff --git a/src/mol-math/graph/inter-unit-graph.ts b/src/mol-math/graph/inter-unit-graph.ts
index 91c1c2acc3dd70fbb7e9399ba454498346b4fd54..e2078b1fa21aa15233f7bd6c35b6c2c3776f694b 100644
--- a/src/mol-math/graph/inter-unit-graph.ts
+++ b/src/mol-math/graph/inter-unit-graph.ts
@@ -11,11 +11,11 @@ export { InterUnitGraph };
 
 class InterUnitGraph<UnitId extends number, VertexIndex extends number, EdgeProps extends InterUnitGraph.EdgePropsBase = {}> {
     /** Number of inter-unit edges */
-    readonly edgeCount: number
+    readonly edgeCount: number;
     /** Array of inter-unit edges */
-    readonly edges: ReadonlyArray<InterUnitGraph.Edge<UnitId, VertexIndex, EdgeProps>>
-    private readonly edgeKeyIndex: Map<string, number>
-    private readonly vertexKeyIndex: Map<string, number[]>
+    readonly edges: ReadonlyArray<InterUnitGraph.Edge<UnitId, VertexIndex, EdgeProps>>;
+    private readonly edgeKeyIndex: Map<string, number>;
+    private readonly vertexKeyIndex: Map<string, number[]>;
 
     /** Get an array of unit-pair-edges that are connected to the given unit */
     getConnectedUnits(unit: UnitId): ReadonlyArray<InterUnitGraph.UnitPairEdges<UnitId, VertexIndex, EdgeProps>> {
@@ -134,13 +134,13 @@ namespace InterUnitGraph {
 
 
     export class Builder<UnitId extends number, VertexIndex extends number, EdgeProps extends InterUnitGraph.EdgePropsBase = {}> {
-        private uA: UnitId
-        private uB: UnitId
-        private mapAB: Map<number, EdgeInfo<VertexIndex, EdgeProps>[]>
-        private mapBA: Map<number, EdgeInfo<VertexIndex, EdgeProps>[]>
-        private linkedA: UniqueArray<VertexIndex, VertexIndex>
-        private linkedB: UniqueArray<VertexIndex, VertexIndex>
-        private linkCount: number
+        private uA: UnitId;
+        private uB: UnitId;
+        private mapAB: Map<number, EdgeInfo<VertexIndex, EdgeProps>[]>;
+        private mapBA: Map<number, EdgeInfo<VertexIndex, EdgeProps>[]>;
+        private linkedA: UniqueArray<VertexIndex, VertexIndex>;
+        private linkedB: UniqueArray<VertexIndex, VertexIndex>;
+        private linkCount: number;
 
         private map = new Map<number, UnitPairEdges<UnitId, VertexIndex, EdgeProps>[]>();
 
diff --git a/src/mol-model-formats/structure/common/component.ts b/src/mol-model-formats/structure/common/component.ts
index dfa708dfa8b7e3b8abf56763e788b23c2903118b..cdacb28722b658ff42e32c6e50d737b31a540868 100644
--- a/src/mol-model-formats/structure/common/component.ts
+++ b/src/mol-model-formats/structure/common/component.ts
@@ -98,12 +98,12 @@ const CharmmIonComponents = (function () {
 })();
 
 export class ComponentBuilder {
-    private namesMap = new Map<string, string>()
-    private comps = new Map<string, Component>()
-    private ids: string[] = []
-    private names: string[] = []
-    private types: mmCIF_chemComp_schema['type']['T'][] = []
-    private mon_nstd_flags: mmCIF_chemComp_schema['mon_nstd_flag']['T'][] = []
+    private namesMap = new Map<string, string>();
+    private comps = new Map<string, Component>();
+    private ids: string[] = [];
+    private names: string[] = [];
+    private types: mmCIF_chemComp_schema['type']['T'][] = [];
+    private mon_nstd_flags: mmCIF_chemComp_schema['mon_nstd_flag']['T'][] = [];
 
     private set(c: Component) {
         this.comps.set(c.id, c);
diff --git a/src/mol-model-formats/structure/common/entity.ts b/src/mol-model-formats/structure/common/entity.ts
index 107108f4035349098c04e0150536d5527250ffed..25e271473cb87989b2cdebc2d792f82e0986defa 100644
--- a/src/mol-model-formats/structure/common/entity.ts
+++ b/src/mol-model-formats/structure/common/entity.ts
@@ -14,16 +14,16 @@ export type EntityCompound = { chains: string[], description: string }
 type EntityType = 'water' | 'polymer' | 'non-polymer'
 
 export class EntityBuilder {
-    private count = 0
-    private ids: string[] = []
-    private types: EntityType[] = []
-    private descriptions: string[][] = []
+    private count = 0;
+    private ids: string[] = [];
+    private types: EntityType[] = [];
+    private descriptions: string[][] = [];
 
-    private compoundsMap = new Map<string, string>()
-    private namesMap = new Map<string, string>()
-    private heteroMap = new Map<string, string>()
-    private chainMap = new Map<string, string>()
-    private waterId?: string
+    private compoundsMap = new Map<string, string>();
+    private namesMap = new Map<string, string>();
+    private heteroMap = new Map<string, string>();
+    private chainMap = new Map<string, string>();
+    private waterId?: string;
 
     private set(type: EntityType, description: string) {
         this.count += 1;
diff --git a/src/mol-model-formats/structure/common/property.ts b/src/mol-model-formats/structure/common/property.ts
index b4f099861bec86cb87607e5e643c81f642670362..f9fefc875d63bca023c1f823ba1632293bea56a5 100644
--- a/src/mol-model-formats/structure/common/property.ts
+++ b/src/mol-model-formats/structure/common/property.ts
@@ -9,8 +9,8 @@ import { ModelFormat } from '../../format';
 import { CustomPropertyDescriptor } from '../../../mol-model/custom-property';
 
 class FormatRegistry<T> {
-    private map = new Map<ModelFormat['kind'], (model: Model) => T | undefined>()
-    private applicable = new Map<ModelFormat['kind'], (model: Model) => boolean>()
+    private map = new Map<ModelFormat['kind'], (model: Model) => T | undefined>();
+    private applicable = new Map<ModelFormat['kind'], (model: Model) => boolean>();
 
     add(kind: ModelFormat['kind'], obtain: (model: Model) => T | undefined, applicable?: (model: Model) => boolean) {
         this.map.set(kind, obtain);
diff --git a/src/mol-model-props/common/custom-property.ts b/src/mol-model-props/common/custom-property.ts
index 4c2824d58bce3d31249de73bd8352eeb8dddb909..e03d2ba47b8ae8b0f7af84f5e1c10b29e4a2222a 100644
--- a/src/mol-model-props/common/custom-property.ts
+++ b/src/mol-model-props/common/custom-property.ts
@@ -42,8 +42,8 @@ namespace CustomProperty {
     }
 
     export class Registry<Data> {
-        private providers = OrderedMap<string, Provider<Data, any, any>>().asMutable()
-        private defaultAutoAttachValues = new Map<string, boolean>()
+        private providers = OrderedMap<string, Provider<Data, any, any>>().asMutable();
+        private defaultAutoAttachValues = new Map<string, boolean>();
 
         /** Get params for all applicable property providers */
         getParams(data?: Data) {
diff --git a/src/mol-model-props/computed/interactions/common.ts b/src/mol-model-props/computed/interactions/common.ts
index fba1647f4b27897e36e2584042a0d55e9ccb8c49..fb975526dd7b8c3213f1eed94aeb3598b22f56ef 100644
--- a/src/mol-model-props/computed/interactions/common.ts
+++ b/src/mol-model-props/computed/interactions/common.ts
@@ -85,7 +85,7 @@ namespace InteractionsIntraContacts {
 
 export { InteractionsInterContacts };
 class InteractionsInterContacts extends InterUnitGraph<number, Features.FeatureIndex, InteractionsInterContacts.Props> {
-    private readonly elementKeyIndex: Map<string, number[]>
+    private readonly elementKeyIndex: Map<string, number[]>;
 
     getContactIndicesForElement(index: StructureElement.UnitIndex, unit: Unit): ReadonlyArray<number> {
         return this.elementKeyIndex.get(this.getElementKey(index, unit.id)) || [];
diff --git a/src/mol-model-props/integrative/pair-restraints.ts b/src/mol-model-props/integrative/pair-restraints.ts
index 82724c787909bae1ff54c0d4b890f1529161ccc9..1777ba5981b58ae6e02f75024afffa7b97c0087d 100644
--- a/src/mol-model-props/integrative/pair-restraints.ts
+++ b/src/mol-model-props/integrative/pair-restraints.ts
@@ -20,8 +20,8 @@ function getPairKey(indexA: StructureElement.UnitIndex, unitA: Unit, indexB: Str
 }
 
 export class PairRestraints<T extends PairRestraint> {
-    readonly count: number
-    private readonly pairKeyIndices: Map<string, number[]>
+    readonly count: number;
+    private readonly pairKeyIndices: Map<string, number[]>;
 
     /** Indices into this.pairs */
     getPairIndices(indexA: StructureElement.UnitIndex, unitA: Unit, indexB: StructureElement.UnitIndex, unitB: Unit): ReadonlyArray<number> {
diff --git a/src/mol-model/sequence/alignment/alignment.ts b/src/mol-model/sequence/alignment/alignment.ts
index 1f319a95a8e2baa761adc71e32974c967e28cbe8..cf64db2196fb4507a7d50b5ffde40a9f4f7f1385 100644
--- a/src/mol-model/sequence/alignment/alignment.ts
+++ b/src/mol-model/sequence/alignment/alignment.ts
@@ -21,11 +21,11 @@ export function align(seqA: ArrayLike<string>, seqB: ArrayLike<string>, options:
 }
 
 class Alignment {
-    readonly gapPenalty: number; readonly gapExtensionPenalty: number
-    readonly substMatrix: SubstitutionMatrixData | undefined
+    readonly gapPenalty: number; readonly gapExtensionPenalty: number;
+    readonly substMatrix: SubstitutionMatrixData | undefined;
 
-    readonly n: number; readonly m: number
-    readonly S: number[][] = []; readonly V: number[][] = []; readonly H: number[][] = []
+    readonly n: number; readonly m: number;
+    readonly S: number[][] = []; readonly V: number[][] = []; readonly H: number[][] = [];
 
     constructor(readonly seqA: ArrayLike<string>, readonly seqB: ArrayLike<string>, options: AlignmentOptions) {
         this.gapPenalty = options.gapPenalty;
diff --git a/src/mol-model/sequence/sequence.ts b/src/mol-model/sequence/sequence.ts
index 722da04fce3cc6a4cf7e3565043ef37d369df039..5ac73f82f7aa50277fb548cfa76c3cfa044c16c4 100644
--- a/src/mol-model/sequence/sequence.ts
+++ b/src/mol-model/sequence/sequence.ts
@@ -86,14 +86,14 @@ namespace Sequence {
     }
 
     class ResidueNamesImpl<K extends Kind, Alphabet extends string> implements Base<K, Alphabet> {
-        public length: number
-        public code: Column<Alphabet>
-        public label: Column<string>
-        public seqId: Column<number>
-        public compId: Column<string>
-        public microHet: ReadonlyMap<number, string[]> = new Map()
-
-        private indexMap: Map<number, number>
+        public length: number;
+        public code: Column<Alphabet>;
+        public label: Column<string>;
+        public seqId: Column<number>;
+        public compId: Column<string>;
+        public microHet: ReadonlyMap<number, string[]> = new Map();
+
+        private indexMap: Map<number, number>;
         index(seqId: number) {
             return this.indexMap.get(seqId)!;
         }
@@ -158,14 +158,14 @@ namespace Sequence {
     }
 
     class SequenceRangesImpl<K extends Kind, Alphabet extends string> implements Base<K, Alphabet> {
-        public length: number
-        public code: Column<Alphabet>
-        public label: Column<string>
-        public seqId: Column<number>
-        public compId: Column<string>
-        public microHet: ReadonlyMap<number, string[]> = new Map()
-
-        private minSeqId: number
+        public length: number;
+        public code: Column<Alphabet>;
+        public label: Column<string>;
+        public seqId: Column<number>;
+        public compId: Column<string>;
+        public microHet: ReadonlyMap<number, string[]> = new Map();
+
+        private minSeqId: number;
         index(seqId: number) {
             return seqId - this.minSeqId;
         }
diff --git a/src/mol-model/structure/structure/structure.ts b/src/mol-model/structure/structure/structure.ts
index 2898c04ee3934eff8dba7e246c6438931f336e26..f962ee68207d5ea93d2b7fa605c9a78aae1b6ec1 100644
--- a/src/mol-model/structure/structure/structure.ts
+++ b/src/mol-model/structure/structure/structure.ts
@@ -938,7 +938,7 @@ namespace Structure {
 
     export class StructureBuilder {
         private units: Unit[] = [];
-        private invariantId = idFactory()
+        private invariantId = idFactory();
 
         private chainGroupId = -1;
         private inChainGroup = false;
diff --git a/src/mol-model/structure/structure/unit/bonds.ts b/src/mol-model/structure/structure/unit/bonds.ts
index 20f562397f43989f92f78ea1347a77ae26027c1e..c8d2bf019f2623d1a214f71e58b85e592100cf0c 100644
--- a/src/mol-model/structure/structure/unit/bonds.ts
+++ b/src/mol-model/structure/structure/unit/bonds.ts
@@ -180,18 +180,18 @@ namespace Bond {
     }
 
     export class ElementBondIterator implements Iterator<ElementBondData> {
-        private current: ElementBondData = {} as any
+        private current: ElementBondData = {} as any;
 
-        private structure: Structure
-        private unit: Unit.Atomic
-        private index: StructureElement.UnitIndex
+        private structure: Structure;
+        private unit: Unit.Atomic;
+        private index: StructureElement.UnitIndex;
 
-        private interBondIndices: ReadonlyArray<number>
-        private interBondCount: number
-        private interBondIndex: number
+        private interBondIndices: ReadonlyArray<number>;
+        private interBondCount: number;
+        private interBondIndex: number;
 
-        private intraBondEnd: number
-        private intraBondIndex: number
+        private intraBondEnd: number;
+        private intraBondIndex: number;
 
         hasNext: boolean;
         move(): ElementBondData {
diff --git a/src/mol-model/structure/structure/unit/rings.ts b/src/mol-model/structure/structure/unit/rings.ts
index 43a4ed4010ff2683350e03304f05f3627e4fd244..99501fc6db76e9f1bd5631586d79e04dd57ab266 100644
--- a/src/mol-model/structure/structure/unit/rings.ts
+++ b/src/mol-model/structure/structure/unit/rings.ts
@@ -29,7 +29,7 @@ class UnitRings {
         readonly ringComponentIndex: ReadonlyArray<UnitRings.ComponentIndex>,
         readonly ringComponents: ReadonlyArray<ReadonlyArray<UnitRings.Index>>
     };
-    private _aromaticRings?: ReadonlyArray<UnitRings.Index>
+    private _aromaticRings?: ReadonlyArray<UnitRings.Index>;
 
     private get index() {
         if (this._index) return this._index;
diff --git a/src/mol-model/structure/structure/util/unit-transforms.ts b/src/mol-model/structure/structure/util/unit-transforms.ts
index 79d73da5cea24afdffae4202d7b8e8fadf204802..7934acc5fd997b8b586b0f3af61a47f26fdbe676 100644
--- a/src/mol-model/structure/structure/util/unit-transforms.ts
+++ b/src/mol-model/structure/structure/util/unit-transforms.ts
@@ -12,8 +12,8 @@ import { fillIdentityTransform } from '../../../../mol-geo/geometry/transform-da
 const tmpMat = Mat4();
 
 export class StructureUnitTransforms {
-    private unitTransforms: Float32Array
-    private groupUnitTransforms: Float32Array[] = []
+    private unitTransforms: Float32Array;
+    private groupUnitTransforms: Float32Array[] = [];
     /** maps unit.id to offset of transform in unitTransforms */
     private unitOffsetMap = IntMap.Mutable<number>();
     private groupIndexMap = IntMap.Mutable<number>();
diff --git a/src/mol-plugin-state/formats/registry.ts b/src/mol-plugin-state/formats/registry.ts
index 3c2a14c48859c8f7bd46aa08a386df9aa2f85b11..45e328dace350682327c4ddc641800970a8bed98 100644
--- a/src/mol-plugin-state/formats/registry.ts
+++ b/src/mol-plugin-state/formats/registry.ts
@@ -14,11 +14,11 @@ import { BuiltInShapeFormats } from './shape';
 import { BuiltInStructureFormats } from './structure';
 
 export class DataFormatRegistry {
-    private _list: { name: string, provider: DataFormatProvider }[] = []
-    private _map = new Map<string, DataFormatProvider>()
-    private _extensions: Set<string> | undefined = undefined
-    private _binaryExtensions: Set<string> | undefined = undefined
-    private _options: [string, string, string][] | undefined = undefined
+    private _list: { name: string, provider: DataFormatProvider }[] = [];
+    private _map = new Map<string, DataFormatProvider>();
+    private _extensions: Set<string> | undefined = undefined;
+    private _binaryExtensions: Set<string> | undefined = undefined;
+    private _options: [string, string, string][] | undefined = undefined;
 
     get types(): [string, string][] {
         return this._list.map(e => [e.name, e.provider.label] as [string, string]);
diff --git a/src/mol-plugin-state/helpers/structure-selection-query.ts b/src/mol-plugin-state/helpers/structure-selection-query.ts
index a8d3505aa3549f4bad81e5ef09ad9198c9aa6bb9..4640cf0fc9ace99f2202be4539da4f33d02f1907 100644
--- a/src/mol-plugin-state/helpers/structure-selection-query.ts
+++ b/src/mol-plugin-state/helpers/structure-selection-query.ts
@@ -742,9 +742,9 @@ export const StructureSelectionQueries = {
 };
 
 export class StructureSelectionQueryRegistry {
-    list: StructureSelectionQuery[] = []
-    options: [StructureSelectionQuery, string, string][] = []
-    version = 1
+    list: StructureSelectionQuery[] = [];
+    options: [StructureSelectionQuery, string, string][] = [];
+    version = 1;
 
     add(q: StructureSelectionQuery) {
         this.list.push(q);
diff --git a/src/mol-plugin-state/manager/interactivity.ts b/src/mol-plugin-state/manager/interactivity.ts
index 8805432230c49f0046ac8d8f24c5c98d08646775..c9f972483613367f64c7f127754f35d07ab9201d 100644
--- a/src/mol-plugin-state/manager/interactivity.ts
+++ b/src/mol-plugin-state/manager/interactivity.ts
@@ -36,7 +36,7 @@ class InteractivityManager extends StatefulPluginComponent<InteractivityManagerS
     readonly lociSelects: InteractivityManager.LociSelectManager;
     readonly lociHighlights: InteractivityManager.LociHighlightManager;
 
-    private _props = PD.getDefaultValues(InteractivityManager.Params)
+    private _props = PD.getDefaultValues(InteractivityManager.Params);
 
     readonly events = {
         propsUpdated: this.ev()
@@ -84,9 +84,9 @@ namespace InteractivityManager {
 
     export abstract class LociMarkManager {
         protected providers: LociMarkProvider[] = [];
-        protected sel: StructureSelectionManager
+        protected sel: StructureSelectionManager;
 
-        readonly props: Readonly<Props> = PD.getDefaultValues(Params)
+        readonly props: Readonly<Props> = PD.getDefaultValues(Params);
 
         setProps(props: Partial<Props>) {
             Object.assign(this.props, props);
@@ -141,7 +141,7 @@ namespace InteractivityManager {
                 this.mark(p, MarkerAction.RemoveHighlight, noRender);
             }
             this.prev.length = 0;
-        }
+        };
 
         highlight(current: Representation.Loci, applyGranularity = true) {
             const normalized = this.normalizedLoci(current, applyGranularity);
diff --git a/src/mol-plugin-state/manager/loci-label.ts b/src/mol-plugin-state/manager/loci-label.ts
index e36300411da24de741785ce48e51b81fe192fada..b5b9f94127d1733d14531269e5ec0347a53f5dbd 100644
--- a/src/mol-plugin-state/manager/loci-label.ts
+++ b/src/mol-plugin-state/manager/loci-label.ts
@@ -41,7 +41,7 @@ export class LociLabelManager {
         this.showLabels();
     }
 
-    private locis: Representation.Loci[] = []
+    private locis: Representation.Loci[] = [];
 
     private mark(loci: Representation.Loci, action: MarkerAction) {
         const idx = this.locis.findIndex(l => Representation.Loci.areEqual(loci, l));
@@ -54,9 +54,9 @@ export class LociLabelManager {
         }
     }
 
-    private isDirty = false
-    private labels: LociLabel[] = []
-    private groupedLabels = new Map<string, LociLabel[]>()
+    private isDirty = false;
+    private labels: LociLabel[] = [];
+    private groupedLabels = new Map<string, LociLabel[]>();
 
     private showLabels() {
         this.ctx.behaviors.labels.highlight.next({ labels: this.getLabels() });
diff --git a/src/mol-plugin-state/manager/structure/component.ts b/src/mol-plugin-state/manager/structure/component.ts
index cbfb1cbeae75f0520621ca903ef124702d040d65..2494fa2970282e14bbf5a2481dd88ee1ed3cb371 100644
--- a/src/mol-plugin-state/manager/structure/component.ts
+++ b/src/mol-plugin-state/manager/structure/component.ts
@@ -42,7 +42,7 @@ interface StructureComponentManagerState {
 class StructureComponentManager extends StatefulPluginComponent<StructureComponentManagerState> {
     readonly events = {
         optionsUpdated: this.ev<undefined>()
-    }
+    };
 
     get currentStructures() {
         return this.plugin.managers.structure.hierarchy.selection.structures;
diff --git a/src/mol-plugin-state/manager/structure/focus.ts b/src/mol-plugin-state/manager/structure/focus.ts
index 836f50f77c5478e1307a49ba8d41bcf35af466b7..50ad8780061a79fc9580453e0659ebd2f14a3e21 100644
--- a/src/mol-plugin-state/manager/structure/focus.ts
+++ b/src/mol-plugin-state/manager/structure/focus.ts
@@ -41,7 +41,7 @@ const HISTORY_CAPACITY = 8;
 export class StructureFocusManager extends StatefulPluginComponent<StructureFocusManagerState> {
     readonly events = {
         historyUpdated: this.ev<undefined>()
-    }
+    };
 
     readonly behaviors = {
         current: this.ev.behavior<FocusEntry | undefined>(void 0)
diff --git a/src/mol-plugin-state/manager/structure/hierarchy.ts b/src/mol-plugin-state/manager/structure/hierarchy.ts
index e314df6dda7667016510b4a10fe90ca0b2d7aca8..e9cc03ec62c2a52764b14914e7c5e01b5941adc1 100644
--- a/src/mol-plugin-state/manager/structure/hierarchy.ts
+++ b/src/mol-plugin-state/manager/structure/hierarchy.ts
@@ -25,7 +25,7 @@ export class StructureHierarchyManager extends PluginComponent {
             models: [] as ReadonlyArray<ModelRef>,
             structures: [] as ReadonlyArray<StructureRef>
         }
-    }
+    };
 
     readonly behaviors = {
         selection: this.ev.behavior({
@@ -34,7 +34,7 @@ export class StructureHierarchyManager extends PluginComponent {
             models: this.selection.models,
             structures: this.selection.structures
         })
-    }
+    };
 
     private get dataState() {
         return this.plugin.state.data;
diff --git a/src/mol-plugin-state/manager/structure/selection.ts b/src/mol-plugin-state/manager/structure/selection.ts
index c043a9e614cde87c2312401549f90828ff847b96..0cbae64dc82cc4a4069205236c7f567f5908621a 100644
--- a/src/mol-plugin-state/manager/structure/selection.ts
+++ b/src/mol-plugin-state/manager/structure/selection.ts
@@ -45,9 +45,9 @@ export class StructureSelectionManager extends StatefulPluginComponent<Structure
             remove: this.ev<StructureElement.Loci>(),
             clear: this.ev<undefined>()
         }
-    }
+    };
 
-    private referenceLoci: StructureElement.Loci | undefined
+    private referenceLoci: StructureElement.Loci | undefined;
 
     get entries() { return this.state.entries; }
     get additionsHistory() { return this.state.additionsHistory; }
diff --git a/src/mol-plugin-state/manager/volume/hierarchy.ts b/src/mol-plugin-state/manager/volume/hierarchy.ts
index 7b9f21cd54b35ae609483f69b7b3f45abdbfe7c0..4076f5f4e9b41ed96f869a6428868b53865a97b2 100644
--- a/src/mol-plugin-state/manager/volume/hierarchy.ts
+++ b/src/mol-plugin-state/manager/volume/hierarchy.ts
@@ -18,14 +18,14 @@ export class VolumeHierarchyManager extends PluginComponent {
 
         hierarchy: VolumeHierarchy(),
         selection: void 0 as VolumeRef | undefined
-    }
+    };
 
     readonly behaviors = {
         selection: this.ev.behavior({
             hierarchy: this.current,
             volume: this.selection
         })
-    }
+    };
 
     private get dataState() {
         return this.plugin.state.data;
diff --git a/src/mol-plugin-ui/base.tsx b/src/mol-plugin-ui/base.tsx
index 20047db2eb57cb428653f012180d648702912fe6..2dba5dc4e0a376a7c484714531077a07e01092e8 100644
--- a/src/mol-plugin-ui/base.tsx
+++ b/src/mol-plugin-ui/base.tsx
@@ -82,7 +82,7 @@ export type CollapsableState = {
 export abstract class CollapsableControls<P = {}, S = {}, SS = {}> extends PluginUIComponent<P & CollapsableProps, S & CollapsableState, SS> {
     toggleCollapsed = () => {
         this.setState({ isCollapsed: !this.state.isCollapsed } as (S & CollapsableState));
-    }
+    };
 
     componentDidUpdate(prevProps: P & CollapsableProps) {
         if (this.props.initiallyCollapsed !== undefined && prevProps.initiallyCollapsed !== this.props.initiallyCollapsed) {
diff --git a/src/mol-plugin-ui/controls.tsx b/src/mol-plugin-ui/controls.tsx
index 880070a51087f5eddcfa5a17a81485b4573e6a52..bb2f46fd1e75e84f3d4b2b9585da395683ff3453 100644
--- a/src/mol-plugin-ui/controls.tsx
+++ b/src/mol-plugin-ui/controls.tsx
@@ -26,7 +26,7 @@ import { PluginConfig } from '../mol-plugin/config';
 import { StructureSuperpositionControls } from './structure/superposition';
 
 export class TrajectoryViewportControls extends PluginUIComponent<{}, { show: boolean, label: string }> {
-    state = { show: false, label: '' }
+    state = { show: false, label: '' };
 
     private update = () => {
         const state = this.plugin.state.data;
@@ -63,7 +63,7 @@ export class TrajectoryViewportControls extends PluginUIComponent<{}, { show: bo
 
         if (count > 1) label = '';
         this.setState({ show: count > 0, label });
-    }
+    };
 
     componentDidMount() {
         this.subscribe(this.plugin.state.data.events.changed, this.update);
@@ -100,7 +100,7 @@ export class TrajectoryViewportControls extends PluginUIComponent<{}, { show: bo
 }
 
 export class StateSnapshotViewportControls extends PluginUIComponent<{}, { isBusy: boolean, show: boolean }> {
-    state = { isBusy: false, show: true }
+    state = { isBusy: false, show: true };
 
     componentDidMount() {
         // TODO: this needs to be diabled when the state is updating!
@@ -147,23 +147,23 @@ export class StateSnapshotViewportControls extends PluginUIComponent<{}, { isBus
     change = (e: React.ChangeEvent<HTMLSelectElement>) => {
         if (e.target.value === 'none') return;
         this.update(e.target.value);
-    }
+    };
 
     prev = () => {
         const s = this.plugin.managers.snapshot;
         const id = s.getNextId(s.state.current, -1);
         if (id) this.update(id);
-    }
+    };
 
     next = () => {
         const s = this.plugin.managers.snapshot;
         const id = s.getNextId(s.state.current, 1);
         if (id) this.update(id);
-    }
+    };
 
     togglePlay = () => {
         this.plugin.managers.snapshot.togglePlay();
-    }
+    };
 
     render() {
         const snapshots = this.plugin.managers.snapshot;
@@ -212,7 +212,7 @@ export class AnimationViewportControls extends PluginUIComponent<{}, { isEmpty:
     stop = () => {
         this.plugin.managers.animation.stop();
         this.plugin.managers.snapshot.stop();
-    }
+    };
 
     render() {
         const isPlaying = this.plugin.managers.snapshot.state.isPlaying;
@@ -242,7 +242,7 @@ export class SelectionViewportControls extends PluginUIComponent {
     onMouseMove = (e: React.MouseEvent) => {
         // ignore mouse moves when no button is held
         if (e.buttons === 0) e.stopPropagation();
-    }
+    };
 
     render() {
         if (!this.plugin.selectionMode) return null;
@@ -253,7 +253,7 @@ export class SelectionViewportControls extends PluginUIComponent {
 }
 
 export class LociLabels extends PluginUIComponent<{}, { labels: ReadonlyArray<LociLabel> }> {
-    state = { labels: [] }
+    state = { labels: [] };
 
     componentDidMount() {
         this.subscribe(this.plugin.behaviors.labels.highlight, e => this.setState({ labels: e.labels }));
diff --git a/src/mol-plugin-ui/controls/action-menu.tsx b/src/mol-plugin-ui/controls/action-menu.tsx
index 5ce7e61c0fdaad308edeceba1e8ca3c7d648805e..e6d51d2794710bb2570fc9ede26df04c525196c7 100644
--- a/src/mol-plugin-ui/controls/action-menu.tsx
+++ b/src/mol-plugin-ui/controls/action-menu.tsx
@@ -11,7 +11,7 @@ import { Button, ControlGroup } from './common';
 import { CloseSvg, ArrowDropDownSvg, ArrowRightSvg, CheckSvg } from './icons';
 
 export class ActionMenu extends React.PureComponent<ActionMenu.Props> {
-    hide = () => this.props.onSelect(void 0)
+    hide = () => this.props.onSelect(void 0);
 
     render() {
         const cmd = this.props;
@@ -193,12 +193,12 @@ class Section extends React.PureComponent<SectionProps, SectionState> {
         };
     }
 
-    state = Section.createState(this.props)
+    state = Section.createState(this.props);
 
     toggleExpanded = (e: React.MouseEvent<HTMLButtonElement>) => {
         this.setState({ isExpanded: !this.state.isExpanded });
         e.currentTarget.blur();
-    }
+    };
 
     componentDidUpdate(prevProps: SectionProps) {
         if (this.props.items !== prevProps.items || this.props.current !== prevProps.current) {
@@ -215,12 +215,12 @@ class Section extends React.PureComponent<SectionProps, SectionState> {
     selectAll = () => {
         const items = collectItems(this.props.items, []).filter(i => !i.selected);
         this.props.onSelect(items as any);
-    }
+    };
 
     selectNone = () => {
         const items = collectItems(this.props.items, []).filter(i => !!i.selected);
         this.props.onSelect(items as any);
-    }
+    };
 
     get multiselectHeader() {
         const { header, hasCurrent } = this.state;
diff --git a/src/mol-plugin-ui/controls/color.tsx b/src/mol-plugin-ui/controls/color.tsx
index cbb04476f626a7549ac63b1150081c63ad8e3275..3b22e0d2db061b1019bff7cccafa754b6b405636 100644
--- a/src/mol-plugin-ui/controls/color.tsx
+++ b/src/mol-plugin-ui/controls/color.tsx
@@ -18,7 +18,7 @@ export class CombinedColorControl extends React.PureComponent<ParamProps<PD.Colo
     state = {
         isExpanded: !!this.props.param.isExpanded,
         lightness: 0
-    }
+    };
 
     protected update(value: Color) {
         this.props.onChange({ param: this.props.param, name: this.props.name, value });
@@ -27,7 +27,7 @@ export class CombinedColorControl extends React.PureComponent<ParamProps<PD.Colo
     toggleExpanded = (e: React.MouseEvent<HTMLButtonElement>) => {
         this.setState({ isExpanded: !this.state.isExpanded });
         e.currentTarget.blur();
-    }
+    };
 
     onClickSwatch = (e: React.MouseEvent<HTMLButtonElement>) => {
         const value = Color(+(e.currentTarget.getAttribute('data-color') || '0'));
@@ -35,33 +35,33 @@ export class CombinedColorControl extends React.PureComponent<ParamProps<PD.Colo
             if (!this.props.param.isExpanded) this.setState({ isExpanded: false });
             this.update(value);
         }
-    }
+    };
 
     onR = (v: number) => {
         const [, g, b] = Color.toRgb(this.props.value);
         const value = Color.fromRgb(v, g, b);
         if (value !== this.props.value) this.update(value);
-    }
+    };
 
     onG = (v: number) => {
         const [r, , b] = Color.toRgb(this.props.value);
         const value = Color.fromRgb(r, v, b);
         if (value !== this.props.value) this.update(value);
-    }
+    };
 
     onB = (v: number) => {
         const [r, g] = Color.toRgb(this.props.value);
         const value = Color.fromRgb(r, g, v);
         if (value !== this.props.value) this.update(value);
-    }
+    };
 
     onLighten = () => {
         this.update(Color.lighten(this.props.value, 0.1));
-    }
+    };
 
     onDarken = () => {
         this.update(Color.darken(this.props.value, 0.1));
-    }
+    };
 
     swatch() {
         return <div className='msp-combined-color-swatch'>
diff --git a/src/mol-plugin-ui/controls/common.tsx b/src/mol-plugin-ui/controls/common.tsx
index 20a74a6f9ae7c70dd190cb9bf23f0fb66a752d2a..2b0a05cc398482363e74942eea2388eb21bcbbe7 100644
--- a/src/mol-plugin-ui/controls/common.tsx
+++ b/src/mol-plugin-ui/controls/common.tsx
@@ -23,7 +23,7 @@ export class ControlGroup extends React.Component<{
     childrenClassName?: string,
     maxHeight?: string
 }, { isExpanded: boolean }> {
-    state = { isExpanded: !!this.props.initialExpanded }
+    state = { isExpanded: !!this.props.initialExpanded };
 
     headerClicked = () => {
         if (this.props.onHeaderClick) {
@@ -31,7 +31,7 @@ export class ControlGroup extends React.Component<{
         } else {
             this.setState({ isExpanded: !this.state.isExpanded });
         }
-    }
+    };
 
     render() {
         let groupClassName = this.props.hideOffset ? 'msp-control-group-children' : 'msp-control-group-children msp-control-offset';
@@ -84,12 +84,12 @@ export class TextInput<T = string> extends React.PureComponent<TextInputProps<T>
     private delayHandle: any = void 0;
     private pendingValue: T | undefined = void 0;
 
-    state = { originalValue: '', value: '' }
+    state = { originalValue: '', value: '' };
 
     onBlur = () => {
         this.setState({ value: '' + this.state.originalValue });
         if (this.props.onBlur) this.props.onBlur();
-    }
+    };
 
     get isPending() { return typeof this.delayHandle !== 'undefined'; }
 
@@ -105,7 +105,7 @@ export class TextInput<T = string> extends React.PureComponent<TextInputProps<T>
 
         this.props.onChange(this.pendingValue!);
         this.pendingValue = void 0;
-    }
+    };
 
     triggerChanged(formatted: string, converted: T) {
         this.clearTimeout();
@@ -138,7 +138,7 @@ export class TextInput<T = string> extends React.PureComponent<TextInputProps<T>
             this.setState({ value: formatted }, () => this.triggerChanged(formatted, converted));
         }
 
-    }
+    };
 
     onKeyUp = (e: React.KeyboardEvent<HTMLInputElement>) => {
         if (e.charCode === 27 || e.keyCode === 27 || e.key === 'Escape') {
@@ -146,7 +146,7 @@ export class TextInput<T = string> extends React.PureComponent<TextInputProps<T>
                 this.input.current.blur();
             }
         }
-    }
+    };
 
     onKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {
         if (e.keyCode === 13 || e.charCode === 13 || e.key === 'Enter') {
@@ -160,7 +160,7 @@ export class TextInput<T = string> extends React.PureComponent<TextInputProps<T>
             if (this.props.onEnter) this.props.onEnter();
         }
         e.stopPropagation();
-    }
+    };
 
     static getDerivedStateFromProps(props: TextInputProps<any>, state: TextInputState) {
         const value = props.fromValue ? props.fromValue(props.value) : props.value;
@@ -322,7 +322,7 @@ export class ToggleButton extends React.PureComponent<ToggleButtonProps> {
     onClick = (e: React.MouseEvent<HTMLButtonElement>) => {
         e.currentTarget.blur();
         this.props.toggle();
-    }
+    };
 
     render() {
         const props = this.props;
diff --git a/src/mol-plugin-ui/controls/line-graph/line-graph-component.tsx b/src/mol-plugin-ui/controls/line-graph/line-graph-component.tsx
index 968068d2b19af01f43c727df22a60a8c180729b6..654d6733e0d656edf9258fe149197ec1f17f71ac 100644
--- a/src/mol-plugin-ui/controls/line-graph/line-graph-component.tsx
+++ b/src/mol-plugin-ui/controls/line-graph/line-graph-component.tsx
@@ -117,15 +117,15 @@ export class LineGraphComponent extends React.Component<any, LineGraphComponentS
 
     private handleKeyDown = (event: any) => {
         // TODO: set canSelectMultiple = true
-    }
+    };
 
     private handleKeyUp = (event: any) => {
         // TODO: SET canSelectMultiple = fasle
-    }
+    };
 
     private handleClick = (id: number) => (event: any) => {
         // TODO: add point to selected array
-    }
+    };
 
     private handleMouseDown = (id: number) => (event: any) => {
         if (id === 0 || id === this.state.points.length - 1) {
@@ -147,7 +147,7 @@ export class LineGraphComponent extends React.Component<any, LineGraphComponentS
         this.updatedX = copyPoint[0];
         this.updatedY = copyPoint[1];
         this.selected = [id];
-    }
+    };
 
     private handleDrag(event: any) {
         if (this.selected === undefined) {
@@ -280,7 +280,7 @@ export class LineGraphComponent extends React.Component<any, LineGraphComponentS
         this.setState({ points });
         this.change(points);
         event.stopPropagation();
-    }
+    };
 
     private handleLeave() {
         if (this.selected === undefined) {
diff --git a/src/mol-plugin-ui/controls/parameters.tsx b/src/mol-plugin-ui/controls/parameters.tsx
index f21c052649fc9ba68e5a00564261dca0ae114849..ac908aeccc687e434a9a4bd1306082b156633f19 100644
--- a/src/mol-plugin-ui/controls/parameters.tsx
+++ b/src/mol-plugin-ui/controls/parameters.tsx
@@ -45,7 +45,7 @@ export class ParameterControls<P extends PD.Params> extends React.PureComponent<
             const values = { ...this.props.values, [params.name]: params.value };
             this.props.onChangeValues(values, this.props.values);
         }
-    }
+    };
 
     renderGroup(group: ParamInfo[]) {
         if (group.length === 0) return null;
@@ -109,7 +109,7 @@ export class ParameterMappingControl<S, T> extends PluginUIComponent<{ mapping:
         const values = { ...old, [p.name]: p.value };
         const t = this.props.mapping.update(values, this.plugin);
         this.props.mapping.apply(t, this.plugin);
-    }
+    };
 
     componentDidMount() {
         this.subscribe(this.plugin.events.canvas3d.settingsUpdated, () => this.forceUpdate());
@@ -289,7 +289,7 @@ export abstract class SimpleParam<P extends PD.Any> extends React.PureComponent<
 }
 
 export class BoolControl extends SimpleParam<PD.BooleanParam> {
-    onClick = (e: React.MouseEvent<HTMLButtonElement>) => { this.update(!this.props.value); e.currentTarget.blur(); }
+    onClick = (e: React.MouseEvent<HTMLButtonElement>) => { this.update(!this.props.value); e.currentTarget.blur(); };
     renderControl() {
         return <button onClick={this.onClick} disabled={this.props.isDisabled}>
             <Icon svg={this.props.value ? CheckSvg : ClearSvg} />
@@ -303,7 +303,7 @@ export class LineGraphControl extends React.PureComponent<ParamProps<PD.LineGrap
         isExpanded: false,
         isOverPoint: false,
         message: `${this.props.param.defaultValue.length} points`,
-    }
+    };
 
     onHover = (point?: Vec2) => {
         this.setState({ isOverPoint: !this.state.isOverPoint });
@@ -312,20 +312,20 @@ export class LineGraphControl extends React.PureComponent<ParamProps<PD.LineGrap
             return;
         }
         this.setState({ message: `${this.props.value.length} points` });
-    }
+    };
 
     onDrag = (point: Vec2) => {
         this.setState({ message: `(${point[0].toFixed(2)}, ${point[1].toFixed(2)})` });
-    }
+    };
 
     onChange = (value: PD.LineGraph['defaultValue']) => {
         this.props.onChange({ name: this.props.name, param: this.props.param, value: value });
-    }
+    };
 
     toggleExpanded = (e: React.MouseEvent<HTMLButtonElement>) => {
         this.setState({ isExpanded: !this.state.isExpanded });
         e.currentTarget.blur();
-    }
+    };
 
     render() {
         const label = this.props.param.label || camelCaseToWords(this.props.name);
@@ -349,7 +349,7 @@ export class NumberInputControl extends React.PureComponent<ParamProps<PD.Numeri
         const p = getPrecision(this.props.param.step || 0.01);
         value = parseFloat(value.toFixed(p));
         this.props.onChange({ param: this.props.param, name: this.props.name, value });
-    }
+    };
 
     render() {
         const placeholder = this.props.param.label || camelCaseToWords(this.props.name);
@@ -365,7 +365,7 @@ export class NumberInputControl extends React.PureComponent<ParamProps<PD.Numeri
 }
 
 export class NumberRangeControl extends SimpleParam<PD.Numeric> {
-    onChange = (v: number) => { this.update(v); }
+    onChange = (v: number) => { this.update(v); };
     renderControl() {
         const value = typeof this.props.value === 'undefined' ? this.props.param.defaultValue : this.props.value;
         return <Slider value={value} min={this.props.param.min!} max={this.props.param.max!}
@@ -380,14 +380,14 @@ export class TextControl extends SimpleParam<PD.Text> {
         if (value !== this.props.value) {
             this.update(value);
         }
-    }
+    };
 
     onKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {
         if ((e.keyCode === 13 || e.charCode === 13 || e.key === 'Enter')) {
             if (this.props.onEnter) this.props.onEnter();
         }
         e.stopPropagation();
-    }
+    };
 
     renderControl() {
         const placeholder = this.props.param.label || camelCaseToWords(this.props.name);
@@ -412,7 +412,7 @@ export class PureSelectControl extends React.PureComponent<ParamProps<PD.Select<
         } else {
             this.update(e.target.value);
         }
-    }
+    };
 
     render() {
         const isInvalid = this.props.value !== void 0 && !this.props.param.options.some(e => e[0] === this.props.value);
@@ -434,7 +434,7 @@ export class SelectControl extends React.PureComponent<ParamProps<PD.Select<stri
                 this.props.onChange({ param: this.props.param, name: this.props.name, value: item.value });
             });
         }
-    }
+    };
 
     toggle = () => this.setState({ showOptions: !this.state.showOptions });
 
@@ -500,7 +500,7 @@ export class ValueRefControl extends React.PureComponent<ParamProps<PD.ValueRef<
                 this.props.onChange({ param: this.props.param, name: this.props.name, value: { ref: item.value } });
             });
         }
-    }
+    };
 
     toggle = () => this.setState({ showOptions: !this.state.showOptions });
 
@@ -540,12 +540,12 @@ export class ValueRefControl extends React.PureComponent<ParamProps<PD.ValueRef<
 }
 
 export class IntervalControl extends React.PureComponent<ParamProps<PD.Interval>, { isExpanded: boolean }> {
-    state = { isExpanded: false }
+    state = { isExpanded: false };
 
     components = {
         0: PD.Numeric(0, { step: this.props.param.step }, { label: 'Min' }),
         1: PD.Numeric(0, { step: this.props.param.step }, { label: 'Max' })
-    }
+    };
 
     change(value: PD.MultiSelect<any>['defaultValue']) {
         this.props.onChange({ name: this.props.name, param: this.props.param, value });
@@ -555,12 +555,12 @@ export class IntervalControl extends React.PureComponent<ParamProps<PD.Interval>
         const v = [...this.props.value];
         v[+name] = value;
         this.change(v);
-    }
+    };
 
     toggleExpanded = (e: React.MouseEvent<HTMLButtonElement>) => {
         this.setState({ isExpanded: !this.state.isExpanded });
         e.currentTarget.blur();
-    }
+    };
 
     render() {
         const v = this.props.value;
@@ -577,7 +577,7 @@ export class IntervalControl extends React.PureComponent<ParamProps<PD.Interval>
 }
 
 export class BoundedIntervalControl extends SimpleParam<PD.Interval> {
-    onChange = (v: [number, number]) => { this.update(v); }
+    onChange = (v: [number, number]) => { this.update(v); };
     renderControl() {
         return <Slider2 value={this.props.value} min={this.props.param.min!} max={this.props.param.max!}
             step={this.props.param.step} onChange={this.onChange} disabled={this.props.isDisabled} onEnter={this.props.onEnter} />;
@@ -587,7 +587,7 @@ export class BoundedIntervalControl extends SimpleParam<PD.Interval> {
 export class ColorControl extends SimpleParam<PD.Color> {
     onChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
         this.update(Color(parseInt(e.target.value)));
-    }
+    };
 
     stripStyle(): React.CSSProperties {
         return {
@@ -710,18 +710,18 @@ export class ColorListControl extends React.PureComponent<ParamProps<PD.ColorLis
 
         const preset = getColorListFromName(item.value as ColorListName);
         this.update({ kind: preset.type !== 'qualitative' ? 'interpolate' : 'set', colors: preset.list });
-    }
+    };
 
     colorsChanged: ParamOnChange = ({ value }) => {
         this.update({
             kind: this.props.value.kind,
             colors: (value as (typeof _colorListHelpers)['ColorsParam']['defaultValue']).map(c => c.color)
         });
-    }
+    };
 
     isInterpolatedChanged: ParamOnChange = ({ value }) => {
         this.update({ kind: value ? 'interpolate' : 'set', colors: this.props.value.colors });
-    }
+    };
 
     renderColors() {
         if (!this.state.show) return null;
@@ -779,17 +779,17 @@ export class OffsetColorListControl extends React.PureComponent<ParamProps<PD.Co
 
         const preset = getColorListFromName(item.value as ColorListName);
         this.update({ kind: preset.type !== 'qualitative' ? 'interpolate' : 'set', colors: preset.list });
-    }
+    };
 
     colorsChanged: ParamOnChange = ({ value }) => {
         const colors = (value as (typeof _colorListHelpers)['OffsetColorsParam']['defaultValue']).map(c => [c.color, c.offset] as [Color, number]);
         colors.sort((a, b) => a[1] - b[1]);
         this.update({ kind: this.props.value.kind, colors });
-    }
+    };
 
     isInterpolatedChanged: ParamOnChange = ({ value }) => {
         this.update({ kind: value ? 'interpolate' : 'set', colors: this.props.value.colors });
-    }
+    };
 
     renderColors() {
         if (!this.state.show) return null;
@@ -824,13 +824,13 @@ export class OffsetColorListControl extends React.PureComponent<ParamProps<PD.Co
 }
 
 export class Vec3Control extends React.PureComponent<ParamProps<PD.Vec3>, { isExpanded: boolean }> {
-    state = { isExpanded: false }
+    state = { isExpanded: false };
 
     components = {
         0: PD.Numeric(0, { step: this.props.param.step }, { label: (this.props.param.fieldLabels && this.props.param.fieldLabels.x) || 'X' }),
         1: PD.Numeric(0, { step: this.props.param.step }, { label: (this.props.param.fieldLabels && this.props.param.fieldLabels.y) || 'Y' }),
         2: PD.Numeric(0, { step: this.props.param.step }, { label: (this.props.param.fieldLabels && this.props.param.fieldLabels.z) || 'Z' })
-    }
+    };
 
     change(value: PD.MultiSelect<any>['defaultValue']) {
         this.props.onChange({ name: this.props.name, param: this.props.param, value });
@@ -840,12 +840,12 @@ export class Vec3Control extends React.PureComponent<ParamProps<PD.Vec3>, { isEx
         const v = Vec3.copy(Vec3.zero(), this.props.value);
         v[+name] = value;
         this.change(v);
-    }
+    };
 
     toggleExpanded = (e: React.MouseEvent<HTMLButtonElement>) => {
         this.setState({ isExpanded: !this.state.isExpanded });
         e.currentTarget.blur();
-    }
+    };
 
     render() {
         const v = this.props.value;
@@ -862,11 +862,11 @@ export class Vec3Control extends React.PureComponent<ParamProps<PD.Vec3>, { isEx
 }
 
 export class Mat4Control extends React.PureComponent<ParamProps<PD.Mat4>, { isExpanded: boolean }> {
-    state = { isExpanded: false }
+    state = { isExpanded: false };
 
     components = {
         json: PD.Text(JSON.stringify(Mat4()), { description: 'JSON array with 4x4 matrix in a column major (j * 4 + i indexing) format' })
-    }
+    };
 
     change(value: PD.MultiSelect<any>['defaultValue']) {
         this.props.onChange({ name: this.props.name, param: this.props.param, value });
@@ -881,12 +881,12 @@ export class Mat4Control extends React.PureComponent<ParamProps<PD.Mat4>, { isEx
         }
 
         this.change(v);
-    }
+    };
 
     toggleExpanded = (e: React.MouseEvent<HTMLButtonElement>) => {
         this.setState({ isExpanded: !this.state.isExpanded });
         e.currentTarget.blur();
-    }
+    };
 
     changeValue(idx: number) {
         return (v: number) => {
@@ -930,14 +930,14 @@ export class UrlControl extends SimpleParam<PD.UrlParam> {
         if (value !== Asset.getUrl(this.props.value || '')) {
             this.update(Asset.Url(value));
         }
-    }
+    };
 
     onKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {
         if ((e.keyCode === 13 || e.charCode === 13 || e.key === 'Enter')) {
             if (this.props.onEnter) this.props.onEnter();
         }
         e.stopPropagation();
-    }
+    };
 
     renderControl() {
         const placeholder = this.props.param.label || camelCaseToWords(this.props.name);
@@ -960,7 +960,7 @@ export class FileControl extends React.PureComponent<ParamProps<PD.FileParam>> {
 
     onChangeFile = (e: React.ChangeEvent<HTMLInputElement>) => {
         this.change(e.target.files![0]);
-    }
+    };
 
     toggleHelp = () => this.setState({ showHelp: !this.state.showHelp });
 
@@ -1002,7 +1002,7 @@ export class FileListControl extends React.PureComponent<ParamProps<PD.FileListP
 
     onChangeFileList = (e: React.ChangeEvent<HTMLInputElement>) => {
         this.change(e.target.files!);
-    }
+    };
 
     toggleHelp = () => this.setState({ showHelp: !this.state.showHelp });
 
@@ -1040,7 +1040,7 @@ export class FileListControl extends React.PureComponent<ParamProps<PD.FileListP
 }
 
 export class MultiSelectControl extends React.PureComponent<ParamProps<PD.MultiSelect<any>>, { isExpanded: boolean }> {
-    state = { isExpanded: false }
+    state = { isExpanded: false };
 
     change(value: PD.MultiSelect<any>['defaultValue']) {
         this.props.onChange({ name: this.props.name, param: this.props.param, value });
@@ -1057,7 +1057,7 @@ export class MultiSelectControl extends React.PureComponent<ParamProps<PD.MultiS
     toggleExpanded = (e: React.MouseEvent<HTMLButtonElement>) => {
         this.setState({ isExpanded: !this.state.isExpanded });
         e.currentTarget.blur();
-    }
+    };
 
     render() {
         const current = this.props.value;
@@ -1080,7 +1080,7 @@ export class MultiSelectControl extends React.PureComponent<ParamProps<PD.MultiS
 }
 
 export class GroupControl extends React.PureComponent<ParamProps<PD.Group<any>> & { inMapped?: boolean }, { isExpanded: boolean, showPresets: boolean, showHelp: boolean }> {
-    state = { isExpanded: !!this.props.param.isExpanded, showPresets: false, showHelp: false }
+    state = { isExpanded: !!this.props.param.isExpanded, showPresets: false, showHelp: false };
 
     change(value: any) {
         this.props.onChange({ name: this.props.name, param: this.props.param, value });
@@ -1088,7 +1088,7 @@ export class GroupControl extends React.PureComponent<ParamProps<PD.Group<any>>
 
     onChangeParam: ParamOnChange = e => {
         this.change({ ...this.props.value, [e.name]: e.value });
-    }
+    };
 
     toggleExpanded = () => this.setState({ isExpanded: !this.state.isExpanded });
     toggleShowPresets = () => this.setState({ showPresets: !this.state.showPresets });
@@ -1098,7 +1098,7 @@ export class GroupControl extends React.PureComponent<ParamProps<PD.Group<any>>
     onSelectPreset: ActionMenu.OnSelect = item => {
         this.setState({ showPresets: false });
         this.change(item?.value);
-    }
+    };
 
     pivotedPresets() {
         if (!this.props.param.presets) return null;
@@ -1197,11 +1197,11 @@ export class GroupControl extends React.PureComponent<ParamProps<PD.Group<any>>
 }
 
 export class MappedControl extends React.PureComponent<ParamProps<PD.Mapped<any>>, { isExpanded: boolean }> {
-    state = { isExpanded: false }
+    state = { isExpanded: false };
 
     // TODO: this could lead to a rare bug where the component is reused with different mapped control.
     // I think there are currently no cases where this could happen in the UI, but still need to watch out..
-    private valuesCache: { [name: string]: PD.Values<any> } = {}
+    private valuesCache: { [name: string]: PD.Values<any> } = {};
     private setValues(name: string, values: PD.Values<any>) {
         this.valuesCache[name] = values;
     }
@@ -1219,12 +1219,12 @@ export class MappedControl extends React.PureComponent<ParamProps<PD.Mapped<any>
 
     onChangeName: ParamOnChange = e => {
         this.change({ name: e.value, params: this.getValues(e.value) });
-    }
+    };
 
     onChangeParam: ParamOnChange = e => {
         this.setValues(this.props.value.name, e.value);
         this.change({ name: this.props.value.name, params: e.value });
-    }
+    };
 
     toggleExpanded = () => this.setState({ isExpanded: !this.state.isExpanded });
 
@@ -1283,11 +1283,11 @@ class ObjectListEditor extends React.PureComponent<ObjectListEditorProps, { curr
 
     onChangeParam: ParamOnChange = e => {
         this.setState({ current: { ...this.state.current, [e.name]: e.value } });
-    }
+    };
 
     apply = () => {
         this.props.apply(this.state.current);
-    }
+    };
 
     componentDidUpdate(prevProps: ObjectListEditorProps) {
         if (this.props.params !== prevProps.params || this.props.value !== prevProps.value) {
@@ -1312,7 +1312,7 @@ class ObjectListItem extends React.PureComponent<ObjectListItemProps, { isExpand
     update = (v: object) => {
         // this.setState({ isExpanded: false }); // TODO auto update? mark changed state?
         this.props.actions.update(v, this.props.index);
-    }
+    };
 
     moveUp = () => {
         this.props.actions.move(this.props.index, -1);
@@ -1353,7 +1353,7 @@ class ObjectListItem extends React.PureComponent<ObjectListItemProps, { isExpand
 }
 
 export class ObjectListControl extends React.PureComponent<ParamProps<PD.ObjectList>, { isExpanded: boolean }> {
-    state = { isExpanded: false }
+    state = { isExpanded: false };
 
     change(value: any) {
         this.props.onChange({ name: this.props.name, param: this.props.param, value });
@@ -1390,7 +1390,7 @@ export class ObjectListControl extends React.PureComponent<ParamProps<PD.ObjectL
             }
             this.change(update);
         }
-    }
+    };
 
     toggleExpanded = (e: React.MouseEvent<HTMLButtonElement>) => {
         this.setState({ isExpanded: !this.state.isExpanded });
@@ -1420,11 +1420,11 @@ export class ConditionedControl extends React.PureComponent<ParamProps<PD.Condit
 
     onChangeCondition: ParamOnChange = e => {
         this.change(this.props.param.conditionedValue(this.props.value, e.value));
-    }
+    };
 
     onChangeParam: ParamOnChange = e => {
         this.change(e.value);
-    }
+    };
 
     render() {
         const value = this.props.value;
@@ -1455,7 +1455,7 @@ export class ConvertedControl extends React.PureComponent<ParamProps<PD.Converte
             param: this.props.param,
             value: this.props.param.toValue(e.value)
         });
-    }
+    };
 
     render() {
         const value = this.props.param.fromValue(this.props.value);
@@ -1472,14 +1472,14 @@ export class ScriptControl extends SimpleParam<PD.Script> {
         if (value !== this.props.value.expression) {
             this.update({ language: this.props.value.language, expression: value });
         }
-    }
+    };
 
     onKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {
         if ((e.keyCode === 13 || e.charCode === 13 || e.key === 'Enter')) {
             if (this.props.onEnter) this.props.onEnter();
         }
         e.stopPropagation();
-    }
+    };
 
     renderControl() {
         // TODO: improve!
diff --git a/src/mol-plugin-ui/controls/slider.tsx b/src/mol-plugin-ui/controls/slider.tsx
index 2dd63afe4f156e0951ad1816c3c1f3cad790b4b4..02c16b34a966c11c7dd748b7c2b4df86a24d392e 100644
--- a/src/mol-plugin-ui/controls/slider.tsx
+++ b/src/mol-plugin-ui/controls/slider.tsx
@@ -20,7 +20,7 @@ export class Slider extends React.Component<{
     onEnter?: () => void
 }, { isChanging: boolean, current: number }> {
 
-    state = { isChanging: false, current: 0 }
+    state = { isChanging: false, current: 0 };
 
     static getDerivedStateFromProps(props: { value: number }, state: { isChanging: boolean, current: number }) {
         if (state.isChanging || props.value === state.current) return null;
@@ -29,17 +29,17 @@ export class Slider extends React.Component<{
 
     begin = () => {
         this.setState({ isChanging: true });
-    }
+    };
 
     end = (v: number) => {
         this.setState({ isChanging: false });
         this.props.onChange(v);
-    }
+    };
 
     updateCurrent = (current: number) => {
         this.setState({ current });
         this.props.onChangeImmediate?.(current);
-    }
+    };
 
     updateManually = (v: number) => {
         this.setState({ isChanging: true });
@@ -50,12 +50,12 @@ export class Slider extends React.Component<{
         if (n > this.props.max) n = this.props.max;
 
         this.setState({ current: n, isChanging: true });
-    }
+    };
 
     onManualBlur = () => {
         this.setState({ isChanging: false });
         this.props.onChange(this.state.current);
-    }
+    };
 
     render() {
         let step = this.props.step;
@@ -85,7 +85,7 @@ export class Slider2 extends React.Component<{
     onEnter?: () => void
 }, { isChanging: boolean, current: [number, number] }> {
 
-    state = { isChanging: false, current: [0, 1] as [number, number] }
+    state = { isChanging: false, current: [0, 1] as [number, number] };
 
     static getDerivedStateFromProps(props: { value: [number, number] }, state: { isChanging: boolean, current: [number, number] }) {
         if (state.isChanging || (props.value[0] === state.current[0] && props.value[1] === state.current[1])) return null;
@@ -94,16 +94,16 @@ export class Slider2 extends React.Component<{
 
     begin = () => {
         this.setState({ isChanging: true });
-    }
+    };
 
     end = (v: [number, number]) => {
         this.setState({ isChanging: false });
         this.props.onChange(v);
-    }
+    };
 
     updateCurrent = (current: [number, number]) => {
         this.setState({ current });
-    }
+    };
 
     updateMax = (v: number) => {
         let n = v;
@@ -112,7 +112,7 @@ export class Slider2 extends React.Component<{
         else if (n < this.props.min) n = this.props.min;
         if (n > this.props.max) n = this.props.max;
         this.props.onChange([this.state.current[0], n]);
-    }
+    };
 
     updateMin = (v: number) => {
         let n = v;
@@ -121,7 +121,7 @@ export class Slider2 extends React.Component<{
         if (n > this.state.current[1]) n = this.state.current[1];
         else if (n > this.props.max) n = this.props.max;
         this.props.onChange([n, this.state.current[1]]);
-    }
+    };
 
     render() {
         let step = this.props.step;
@@ -371,7 +371,7 @@ export class SliderBase extends React.Component<SliderBaseProps, SliderBaseState
         this.onStart(position);
         this.addDocumentEvents('mouse');
         pauseEvent(e);
-    }
+    };
 
     onMouseMove(e: MouseEvent) {
         const position = getMousePosition(this.props.vertical!, e);
@@ -462,7 +462,7 @@ export class SliderBase extends React.Component<SliderBaseProps, SliderBaseState
 
         const position = getTouchPosition(this.props.vertical!, e);
         this.onMove(e, position - this.dragOffset);
-    }
+    };
 
     onTouchStart = (e: TouchEvent) => {
         if (isNotTouchEvent(e)) return;
@@ -478,7 +478,7 @@ export class SliderBase extends React.Component<SliderBaseProps, SliderBaseState
         this.onStart(position);
         this.addDocumentEvents('touch');
         pauseEvent(e);
-    }
+    };
 
     /**
      * Returns an array of possible slider points, taking into account both
@@ -536,7 +536,7 @@ export class SliderBase extends React.Component<SliderBaseProps, SliderBaseState
         'touchend': (e: TouchEvent) => this.end('touch'),
         'mousemove': (e: MouseEvent) => this.onMouseMove(e),
         'mouseup': (e: MouseEvent) => this.end('mouse'),
-    }
+    };
 
     addDocumentEvents(type: 'touch' | 'mouse') {
         if (type === 'touch') {
@@ -552,7 +552,7 @@ export class SliderBase extends React.Component<SliderBaseProps, SliderBaseState
         const { min, max } = this.props;
         const ratio = (value - min) / (max - min);
         return ratio * 100;
-    }
+    };
 
     calcValue(offset: number) {
         const { vertical, min, max } = this.props;
diff --git a/src/mol-plugin-ui/left-panel.tsx b/src/mol-plugin-ui/left-panel.tsx
index 9498ccbe956779be3d7c92f57fdb770bc5419fc9..c492c1317b507ffde334980bd564a371629126eb 100644
--- a/src/mol-plugin-ui/left-panel.tsx
+++ b/src/mol-plugin-ui/left-panel.tsx
@@ -47,7 +47,7 @@ export class LeftPanelControls extends PluginUIComponent<{}, { tab: LeftPanelTab
         if (this.plugin.layout.state.regionState.left !== 'full') {
             PluginCommands.Layout.Update(this.plugin, { state: { regionState: { ...this.plugin.layout.state.regionState, left: 'full' } } });
         }
-    }
+    };
 
     tabs: { [K in LeftPanelTabName]: JSX.Element } = {
         'none': <></>,
@@ -69,7 +69,7 @@ export class LeftPanelControls extends PluginUIComponent<{}, { tab: LeftPanelTab
             <SectionHeader icon={HelpOutlineSvg} title='Help' />
             <HelpContent />
         </>
-    }
+    };
 
     render() {
         const tab = this.state.tab;
@@ -119,7 +119,7 @@ class DataIcon extends PluginUIComponent<{ set: (tab: LeftPanelTabName) => void
 class FullSettings extends PluginUIComponent {
     private setSettings = (p: { param: PD.Base<any>, name: string, value: any }) => {
         PluginCommands.Canvas3D.SetSettings(this.plugin, { settings: { [p.name]: p.value } });
-    }
+    };
 
     componentDidMount() {
         this.subscribe(this.plugin.events.canvas3d.settingsUpdated, () => this.forceUpdate());
@@ -158,7 +158,7 @@ class RemoveAllButton extends PluginUIComponent<{ }> {
     remove = (e: React.MouseEvent<HTMLElement>) => {
         e.preventDefault();
         PluginCommands.State.RemoveObject(this.plugin, { state: this.plugin.state.data, ref: StateTransform.RootRef });
-    }
+    };
 
     render() {
         const count = this.plugin.state.data.tree.children.get(StateTransform.RootRef).size;
diff --git a/src/mol-plugin-ui/plugin.tsx b/src/mol-plugin-ui/plugin.tsx
index b94f06a08f5029eda53423f6829aa4f2a7fe9fa1..939ffdb1f98ae626cf7c2e60c89bd2426ddbec0f 100644
--- a/src/mol-plugin-ui/plugin.tsx
+++ b/src/mol-plugin-ui/plugin.tsx
@@ -135,11 +135,11 @@ class Layout extends PluginUIComponent {
                 visuals: true
             }));
         }
-    }
+    };
 
     onDragOver = (ev: React.DragEvent<HTMLDivElement>) => {
         ev.preventDefault();
-    }
+    };
 
     private showDragOverlay = new BehaviorSubject(false);
     onDragEnter = () => this.showDragOverlay.next(true);
diff --git a/src/mol-plugin-ui/sequence.tsx b/src/mol-plugin-ui/sequence.tsx
index 44316caf7717d7c5cba6e9942b97cde8a4d2e8f5..3807eb073bce3679b54087076348f7b6c1db0e23 100644
--- a/src/mol-plugin-ui/sequence.tsx
+++ b/src/mol-plugin-ui/sequence.tsx
@@ -219,7 +219,7 @@ type SequenceViewState = {
 }
 
 export class SequenceView extends PluginUIComponent<{ defaultMode?: SequenceViewMode }, SequenceViewState> {
-    state: SequenceViewState = { structureOptions: { options: [], all: [] }, structure: Structure.Empty, structureRef: '', modelEntityId: '', chainGroupId: -1, operatorKey: '', mode: 'single' }
+    state: SequenceViewState = { structureOptions: { options: [], all: [] }, structure: Structure.Empty, structureRef: '', modelEntityId: '', chainGroupId: -1, operatorKey: '', mode: 'single' };
 
     componentDidMount() {
         if (this.plugin.state.data.select(StateSelection.Generators.rootsOfType(PSO.Molecule.Structure)).length > 0) this.setState(this.getInitialState());
@@ -358,7 +358,7 @@ export class SequenceView extends PluginUIComponent<{ defaultMode?: SequenceView
                 break;
         }
         this.setState(state);
-    }
+    };
 
     render() {
         if (this.getStructure(this.state.structureRef) === Structure.Empty) {
diff --git a/src/mol-plugin-ui/sequence/chain.ts b/src/mol-plugin-ui/sequence/chain.ts
index 34508c231f4a3b4cc2b6d3084e561a63eeee7ce4..ee4f4fcc0eb7ca2233396f98fab9f02526042f57 100644
--- a/src/mol-plugin-ui/sequence/chain.ts
+++ b/src/mol-plugin-ui/sequence/chain.ts
@@ -12,9 +12,9 @@ import { ColorNames } from '../../mol-util/color/names';
 import { MarkerAction, applyMarkerAction } from '../../mol-util/marker-action';
 
 export class ChainSequenceWrapper extends SequenceWrapper<StructureUnit> {
-    private label: string
-    private unitIndices: Map<number, Interval<StructureElement.UnitIndex>>
-    private loci: StructureElement.Loci
+    private label: string;
+    private unitIndices: Map<number, Interval<StructureElement.UnitIndex>>;
+    private loci: StructureElement.Loci;
 
     residueLabel(seqIdx: number) {
         return this.label;
diff --git a/src/mol-plugin-ui/sequence/element.ts b/src/mol-plugin-ui/sequence/element.ts
index 18d3ce5ba198256c9f07e82aab7c1f35d608fb69..0f43c45d52288b4278a0db8f1008c90f121cdb86 100644
--- a/src/mol-plugin-ui/sequence/element.ts
+++ b/src/mol-plugin-ui/sequence/element.ts
@@ -12,7 +12,7 @@ import { ColorNames } from '../../mol-util/color/names';
 import { MarkerAction, applyMarkerAction } from '../../mol-util/marker-action';
 
 export class ElementSequenceWrapper extends SequenceWrapper<StructureUnit> {
-    private unitIndices: Map<number, Interval<StructureElement.UnitIndex>>
+    private unitIndices: Map<number, Interval<StructureElement.UnitIndex>>;
 
     residueLabel(seqIdx: number) {
         return 'X';
diff --git a/src/mol-plugin-ui/sequence/hetero.ts b/src/mol-plugin-ui/sequence/hetero.ts
index 1265a4963702b88be5383a2cce482d8dab29deda..8f5518cb204374c60b8fd31304004a5a9a9365cf 100644
--- a/src/mol-plugin-ui/sequence/hetero.ts
+++ b/src/mol-plugin-ui/sequence/hetero.ts
@@ -12,11 +12,11 @@ import { ColorNames } from '../../mol-util/color/names';
 import { MarkerAction, applyMarkerAction } from '../../mol-util/marker-action';
 
 export class HeteroSequenceWrapper extends SequenceWrapper<StructureUnit> {
-    private readonly unitMap: Map<number, Unit>
-    private readonly sequence: string[]
-    private readonly sequenceIndices: Map<ResidueIndex, number>
-    private readonly residueIndices: Map<number, ResidueIndex>
-    private readonly seqToUnit: Map<number, Unit>
+    private readonly unitMap: Map<number, Unit>;
+    private readonly sequence: string[];
+    private readonly sequenceIndices: Map<ResidueIndex, number>;
+    private readonly residueIndices: Map<number, ResidueIndex>;
+    private readonly seqToUnit: Map<number, Unit>;
 
     residueLabel(seqIdx: number) {
         return this.sequence[seqIdx];
diff --git a/src/mol-plugin-ui/sequence/polymer.ts b/src/mol-plugin-ui/sequence/polymer.ts
index 051c49659c56ec03da0286e6dbace662c893dace..afbb53112469134582f780aff9d0d20a814fc3a6 100644
--- a/src/mol-plugin-ui/sequence/polymer.ts
+++ b/src/mol-plugin-ui/sequence/polymer.ts
@@ -14,13 +14,13 @@ import { ColorNames } from '../../mol-util/color/names';
 import { MarkerAction, applyMarkerAction, applyMarkerActionAtPosition } from '../../mol-util/marker-action';
 
 export class PolymerSequenceWrapper extends SequenceWrapper<StructureUnit> {
-    private readonly unitMap: Map<number, Unit>
-    private readonly sequence: Sequence
-    private readonly missing: MissingResidues
-    private readonly observed: OrderedSet // sequences indices
+    private readonly unitMap: Map<number, Unit>;
+    private readonly sequence: Sequence;
+    private readonly missing: MissingResidues;
+    private readonly observed: OrderedSet; // sequences indices
 
-    private readonly modelNum: number
-    private readonly asymId: string
+    private readonly modelNum: number;
+    private readonly asymId: string;
 
     private seqId(seqIdx: number) {
         return this.sequence.seqId.value(seqIdx);
diff --git a/src/mol-plugin-ui/sequence/sequence.tsx b/src/mol-plugin-ui/sequence/sequence.tsx
index bea9c49754924dc736f196a689dc6834f5fe8767..7628f46ea8e7cdc37aa100ef272745e844b5d8be 100644
--- a/src/mol-plugin-ui/sequence/sequence.tsx
+++ b/src/mol-plugin-ui/sequence/sequence.tsx
@@ -34,12 +34,12 @@ export class Sequence<P extends SequenceProps> extends PluginUIComponent<P> {
     private lociHighlightProvider = (loci: Representation.Loci, action: MarkerAction) => {
         const changed = this.props.sequenceWrapper.markResidue(loci.loci, action);
         if (changed) this.updateMarker();
-    }
+    };
 
     private lociSelectionProvider = (loci: Representation.Loci, action: MarkerAction) => {
         const changed = this.props.sequenceWrapper.markResidue(loci.loci, action);
         if (changed) this.updateMarker();
-    }
+    };
 
     private get sequenceNumberPeriod() {
         if (this.props.sequenceNumberPeriod !== undefined) {
@@ -104,9 +104,9 @@ export class Sequence<P extends SequenceProps> extends PluginUIComponent<P> {
 
     contextMenu = (e: React.MouseEvent) => {
         e.preventDefault();
-    }
+    };
 
-    private mouseDownLoci: StructureElement.Loci | undefined = undefined
+    private mouseDownLoci: StructureElement.Loci | undefined = undefined;
 
     mouseDown = (e: React.MouseEvent) => {
         e.stopPropagation();
@@ -119,7 +119,7 @@ export class Sequence<P extends SequenceProps> extends PluginUIComponent<P> {
 
         this.click(loci, buttons, button, modifiers);
         this.mouseDownLoci = loci;
-    }
+    };
 
     mouseUp = (e: React.MouseEvent) => {
         e.stopPropagation();
@@ -148,7 +148,7 @@ export class Sequence<P extends SequenceProps> extends PluginUIComponent<P> {
             this.click(StructureElement.Loci.subtract(range, this.mouseDownLoci), buttons, button, modifiers);
         }
         this.mouseDownLoci = undefined;
-    }
+    };
 
     private getBackgroundColor(marker: number) {
         // TODO: make marker color configurable
@@ -262,7 +262,7 @@ export class Sequence<P extends SequenceProps> extends PluginUIComponent<P> {
                 this.highlightQueue.next({ seqIdx, buttons, button, modifiers });
             }
         }
-    }
+    };
 
     mouseLeave = (e: React.MouseEvent) => {
         e.stopPropagation();
@@ -274,7 +274,7 @@ export class Sequence<P extends SequenceProps> extends PluginUIComponent<P> {
         const button = getButton(e.nativeEvent);
         const modifiers = getModifiers(e.nativeEvent);
         this.highlightQueue.next({ seqIdx: -1, buttons, button, modifiers });
-    }
+    };
 
     render() {
         const sw = this.props.sequenceWrapper;
diff --git a/src/mol-plugin-ui/state/animation.tsx b/src/mol-plugin-ui/state/animation.tsx
index bba0100f4cb380d3d8d1b665a34a91a13295339a..42d8013c19b59fd16c5e7212155fe18c5ecc6ad9 100644
--- a/src/mol-plugin-ui/state/animation.tsx
+++ b/src/mol-plugin-ui/state/animation.tsx
@@ -16,11 +16,11 @@ export class AnimationControls extends PluginUIComponent<{ onStart?: () => void
 
     updateParams: ParamOnChange = p => {
         this.plugin.managers.animation.updateParams({ [p.name]: p.value });
-    }
+    };
 
     updateCurrentParams: ParamOnChange = p => {
         this.plugin.managers.animation.updateCurrentParams({ [p.name]: p.value });
-    }
+    };
 
     startOrStop = () => {
         const anim = this.plugin.managers.animation;
@@ -29,7 +29,7 @@ export class AnimationControls extends PluginUIComponent<{ onStart?: () => void
             if (this.props.onStart) this.props.onStart();
             anim.start();
         }
-    }
+    };
 
     render() {
         const anim = this.plugin.managers.animation;
diff --git a/src/mol-plugin-ui/state/common.tsx b/src/mol-plugin-ui/state/common.tsx
index 1de8a23d01ed981d73e7337c3eafec343ab098dd..4e7183bc7f13c60b0b2c30a9de076fae178fc2f0 100644
--- a/src/mol-plugin-ui/state/common.tsx
+++ b/src/mol-plugin-ui/state/common.tsx
@@ -129,7 +129,7 @@ abstract class TransformControlBase<P, S extends TransformControlBase.ComponentS
     private onEnter = () => {
         if (this.state.error) return;
         this.apply();
-    }
+    };
 
     private autoApplyHandle: number | undefined = void 0;
     private clearAutoApply() {
@@ -150,7 +150,7 @@ abstract class TransformControlBase<P, S extends TransformControlBase.ComponentS
                 }
             });
         }
-    }
+    };
 
     apply = async () => {
         this.clearAutoApply();
@@ -164,7 +164,7 @@ abstract class TransformControlBase<P, S extends TransformControlBase.ComponentS
             this.props.onApply?.();
             this.busy.next(false);
         }
-    }
+    };
 
     componentDidMount() {
         this.subscribe(this.plugin.behaviors.state.isBusy, b => {
@@ -177,17 +177,17 @@ abstract class TransformControlBase<P, S extends TransformControlBase.ComponentS
 
     refresh = () => {
         this.setState({ params: this.getInfo().initialValues, isInitial: true, error: void 0 });
-    }
+    };
 
     setDefault = () => {
         const info = this.getInfo();
         const params = PD.getDefaultValues(info.params);
         this.setState({ params, isInitial: PD.areEqual(info.params, params, info.initialValues), error: void 0 });
-    }
+    };
 
     toggleExpanded = () => {
         this.setState({ isCollapsed: !this.state.isCollapsed });
-    }
+    };
 
     renderApply() {
         const canApply = this.canApply();
diff --git a/src/mol-plugin-ui/state/snapshots.tsx b/src/mol-plugin-ui/state/snapshots.tsx
index 296b8cb40a1aa28122c8c251bcaa6db7c369187f..540c17a8df5527c79d825881870ca22c8d8a019a 100644
--- a/src/mol-plugin-ui/state/snapshots.tsx
+++ b/src/mol-plugin-ui/state/snapshots.tsx
@@ -45,12 +45,12 @@ export class StateExportImportControls extends PluginUIComponent<{ onAction?: ()
     downloadToFileJson = () => {
         this.props.onAction?.();
         PluginCommands.State.Snapshots.DownloadToFile(this.plugin, { type: 'json' });
-    }
+    };
 
     downloadToFileZip = () => {
         this.props.onAction?.();
         PluginCommands.State.Snapshots.DownloadToFile(this.plugin, { type: 'zip' });
-    }
+    };
 
     open = (e: React.ChangeEvent<HTMLInputElement>) => {
         if (!e.target.files || !e.target.files[0]) {
@@ -60,7 +60,7 @@ export class StateExportImportControls extends PluginUIComponent<{ onAction?: ()
 
         this.props.onAction?.();
         PluginCommands.State.Snapshots.OpenFile(this.plugin, { file: e.target.files[0] });
-    }
+    };
 
     render() {
         return <>
@@ -107,13 +107,13 @@ export class LocalStateSnapshots extends PluginUIComponent<
             name: this.state.params.name,
             description: this.state.params.description
         });
-    }
+    };
 
     updateParams = (params: PD.Values<typeof LocalStateSnapshots.Params>) => this.setState({ params });
 
     clear = () => {
         PluginCommands.State.Snapshots.Clear(this.plugin, {});
-    }
+    };
 
     shouldComponentUpdate(nextProps: any, nextState: any) {
         return !shallowEqualObjects(this.props, nextProps) || !shallowEqualObjects(this.state, nextState);
@@ -139,31 +139,31 @@ export class LocalStateSnapshotList extends PluginUIComponent<{}, {}> {
         const id = e.currentTarget.getAttribute('data-id');
         if (!id) return;
         PluginCommands.State.Snapshots.Apply(this.plugin, { id });
-    }
+    };
 
     remove = (e: React.MouseEvent<HTMLElement>) => {
         const id = e.currentTarget.getAttribute('data-id');
         if (!id) return;
         PluginCommands.State.Snapshots.Remove(this.plugin, { id });
-    }
+    };
 
     moveUp = (e: React.MouseEvent<HTMLElement>) => {
         const id = e.currentTarget.getAttribute('data-id');
         if (!id) return;
         PluginCommands.State.Snapshots.Move(this.plugin, { id, dir: -1 });
-    }
+    };
 
     moveDown = (e: React.MouseEvent<HTMLElement>) => {
         const id = e.currentTarget.getAttribute('data-id');
         if (!id) return;
         PluginCommands.State.Snapshots.Move(this.plugin, { id, dir: 1 });
-    }
+    };
 
     replace = (e: React.MouseEvent<HTMLElement>) => {
         const id = e.currentTarget.getAttribute('data-id');
         if (!id) return;
         PluginCommands.State.Snapshots.Replace(this.plugin, { id });
-    }
+    };
 
     render() {
         const current = this.plugin.managers.snapshot.state.current;
@@ -250,7 +250,7 @@ export class RemoteStateSnapshots extends PluginUIComponent<
             this.plugin.log.error('Error fetching remote snapshots');
             if (this._mounted) this.setState({ entries: OrderedMap(), isBusy: false });
         }
-    }
+    };
 
     upload = async () => {
         this.setState({ isBusy: true });
@@ -269,7 +269,7 @@ export class RemoteStateSnapshots extends PluginUIComponent<
             this.setState({ isBusy: false });
             this.refresh();
         }
-    }
+    };
 
 
     fetch = async (e: React.MouseEvent<HTMLElement>) => {
@@ -284,7 +284,7 @@ export class RemoteStateSnapshots extends PluginUIComponent<
         } finally {
             if (this._mounted) this.setState({ isBusy: false });
         }
-    }
+    };
 
     remove = async (e: React.MouseEvent<HTMLElement>) => {
         const id = e.currentTarget.getAttribute('data-id');
@@ -298,7 +298,7 @@ export class RemoteStateSnapshots extends PluginUIComponent<
         } catch (e) {
             console.error(e);
         }
-    }
+    };
 
     render() {
         return <>
@@ -345,7 +345,7 @@ class RemoteStateSnapshotList extends PurePluginUIComponent<
         if (qi > 0) url = url.substr(0, qi);
 
         window.open(`${url}?snapshot-url=${encodeURIComponent(entry.url)}`, '_blank');
-    }
+    };
 
     render() {
         return <ul style={{ listStyle: 'none', marginTop: '10px' }} className='msp-state-list'>
diff --git a/src/mol-plugin-ui/state/tree.tsx b/src/mol-plugin-ui/state/tree.tsx
index a84d2ebac91c5bbf6b721c8c79fe355dd21388e4..5167efcc525c3a3733e99ddbf3357855c51095b6 100644
--- a/src/mol-plugin-ui/state/tree.tsx
+++ b/src/mol-plugin-ui/state/tree.tsx
@@ -87,7 +87,7 @@ class StateTreeNode extends PluginUIComponent<{ cell: StateObjectCell, depth: nu
         isCollapsed: !!this.props.cell.state.isCollapsed,
         isNull: StateTreeNode.isNull(this.props.cell),
         showLabel: StateTreeNode.showLabel(this.props.cell)
-    }
+    };
 
     static getDerivedStateFromProps(props: _Props<StateTreeNode>, state: _State<StateTreeNode>): _State<StateTreeNode> | null {
         const isNull = StateTreeNode.isNull(props.cell);
@@ -187,7 +187,7 @@ class StateTreeNodeLabel extends PluginUIComponent<{ cell: StateObjectCell, dept
         isCollapsed: !!this.props.cell.state.isCollapsed,
         action: void 0,
         currentAction: void 0 as StateAction | undefined
-    }
+    };
 
     static getDerivedStateFromProps(props: _Props<StateTreeNodeLabel>, state: _State<StateTreeNodeLabel>): _State<StateTreeNodeLabel> | null {
         const isCurrent = props.cell.parent!.current === props.cell.transform.ref;
@@ -201,46 +201,46 @@ class StateTreeNodeLabel extends PluginUIComponent<{ cell: StateObjectCell, dept
         e?.preventDefault();
         e?.currentTarget.blur();
         PluginCommands.State.SetCurrentObject(this.plugin, { state: this.props.cell.parent!, ref: this.ref });
-    }
+    };
 
     setCurrentRoot = (e?: React.MouseEvent<HTMLElement>) => {
         e?.preventDefault();
         e?.currentTarget.blur();
         PluginCommands.State.SetCurrentObject(this.plugin, { state: this.props.cell.parent!, ref: StateTransform.RootRef });
-    }
+    };
 
     remove = (e?: React.MouseEvent<HTMLElement>) => {
         e?.preventDefault();
         PluginCommands.State.RemoveObject(this.plugin, { state: this.props.cell.parent!, ref: this.ref, removeParentGhosts: true });
-    }
+    };
 
     toggleVisible = (e: React.MouseEvent<HTMLElement>) => {
         e.preventDefault();
         PluginCommands.State.ToggleVisibility(this.plugin, { state: this.props.cell.parent!, ref: this.ref });
         e.currentTarget.blur();
-    }
+    };
 
     toggleExpanded = (e: React.MouseEvent<HTMLElement>) => {
         e.preventDefault();
         PluginCommands.State.ToggleExpanded(this.plugin, { state: this.props.cell.parent!, ref: this.ref });
         e.currentTarget.blur();
-    }
+    };
 
     highlight = (e: React.MouseEvent<HTMLElement>) => {
         e.preventDefault();
         PluginCommands.Interactivity.Object.Highlight(this.plugin, { state: this.props.cell.parent!, ref: this.ref });
         e.currentTarget.blur();
-    }
+    };
 
     clearHighlight = (e: React.MouseEvent<HTMLElement>) => {
         e.preventDefault();
         PluginCommands.Interactivity.ClearHighlights(this.plugin);
         e.currentTarget.blur();
-    }
+    };
 
     hideApply = () => {
         this.setCurrentRoot();
-    }
+    };
 
     get actions() {
         const cell = this.props.cell;
@@ -258,7 +258,7 @@ class StateTreeNodeLabel extends PluginUIComponent<{ cell: StateObjectCell, dept
     selectAction: ActionMenu.OnSelect = item => {
         if (!item) return;
         (item?.value as any)();
-    }
+    };
 
     updates(margin: string) {
         const cell = this.props.cell;
diff --git a/src/mol-plugin-ui/structure/components.tsx b/src/mol-plugin-ui/structure/components.tsx
index 6481f5aeea3afab55fc23e69f9b0bc53fe2541c6..797286a746d2ec8ae5d86c44ef49a12e380f43d2 100644
--- a/src/mol-plugin-ui/structure/components.tsx
+++ b/src/mol-plugin-ui/structure/components.tsx
@@ -109,12 +109,12 @@ class ComponentEditorControls extends PurePluginUIComponent<{}, ComponentEditorC
         const { structures } = mng.hierarchy.selection;
         if (item.value === null) mng.component.clear(structures);
         else mng.component.applyPreset(structures, item.value as any);
-    }
+    };
 
     undo = () => {
         const task = this.plugin.state.data.undo();
         if (task) this.plugin.runTask(task);
-    }
+    };
 
     render() {
         const undoTitle = this.state.canUndo
@@ -166,9 +166,9 @@ export class AddComponentControls extends PurePluginUIComponent<AddComponentCont
         const structures = this.props.forSelection ? this.currentStructures : this.selectedStructures;
         this.props.onApply();
         this.plugin.managers.structure.component.add(this.state.values, structures);
-    }
+    };
 
-    paramsChanged = (values: any) => this.setState({ values })
+    paramsChanged = (values: any) => this.setState({ values });
 
     render() {
         return <>
@@ -185,7 +185,7 @@ class ComponentOptionsControls extends PurePluginUIComponent<{ isDisabled: boole
         this.subscribe(this.plugin.managers.structure.component.events.optionsUpdated, () => this.forceUpdate());
     }
 
-    update = (options: StructureComponentManager.Options) => this.plugin.managers.structure.component.setOptions(options)
+    update = (options: StructureComponentManager.Options) => this.plugin.managers.structure.component.setOptions(options);
 
     render() {
         return <ParameterControls params={StructureComponentManager.OptionsParams} values={this.plugin.managers.structure.component.state.options} onChangeValues={this.update} isDisabled={this.props.isDisabled} />;
@@ -212,7 +212,7 @@ class ComponentListControls extends PurePluginUIComponent {
 type StructureComponentEntryActions = 'action' | 'label'
 
 class StructureComponentGroup extends PurePluginUIComponent<{ group: StructureComponentRef[] }, { action?: StructureComponentEntryActions }> {
-    state = { action: void 0 as StructureComponentEntryActions | undefined }
+    state = { action: void 0 as StructureComponentEntryActions | undefined };
 
     get pivot() {
         return this.props.group[0];
@@ -228,7 +228,7 @@ class StructureComponentGroup extends PurePluginUIComponent<{ group: StructureCo
         e.preventDefault();
         e.currentTarget.blur();
         this.plugin.managers.structure.component.toggleVisibility(this.props.group);
-    }
+    };
 
     get colorByActions() {
         const mng = this.plugin.managers.structure.component;
@@ -282,7 +282,7 @@ class StructureComponentGroup extends PurePluginUIComponent<{ group: StructureCo
         if (!item) return;
         this.setState({ action: void 0 });
         (item?.value as any)();
-    }
+    };
 
     remove = () => this.plugin.managers.structure.hierarchy.remove(this.props.group, true);
 
@@ -293,12 +293,12 @@ class StructureComponentGroup extends PurePluginUIComponent<{ group: StructureCo
         e.preventDefault();
         if (!this.props.group[0].cell.parent) return;
         PluginCommands.Interactivity.Object.Highlight(this.plugin, { state: this.props.group[0].cell.parent!, ref: this.props.group.map(c => c.cell.transform.ref) });
-    }
+    };
 
     clearHighlight = (e: React.MouseEvent<HTMLElement>) => {
         e.preventDefault();
         PluginCommands.Interactivity.ClearHighlights(this.plugin);
-    }
+    };
 
     focus = () => {
         let allHidden = true;
@@ -317,7 +317,7 @@ class StructureComponentGroup extends PurePluginUIComponent<{ group: StructureCo
             if (e.cell.state.isHidden) return;
             return e.cell.obj?.data.boundary.sphere;
         });
-    }
+    };
 
     get reprLabel() {
         // TODO: handle generic reprs.
@@ -329,7 +329,7 @@ class StructureComponentGroup extends PurePluginUIComponent<{ group: StructureCo
 
     private updateLabel = (v: string) => {
         this.plugin.managers.structure.component.updateLabel(this.pivot, v);
-    }
+    };
 
     render() {
         const component = this.pivot;
@@ -370,7 +370,7 @@ class StructureRepresentationEntry extends PurePluginUIComponent<{ group: Struct
         e.preventDefault();
         e.currentTarget.blur();
         this.plugin.managers.structure.component.toggleVisibility(this.props.group, this.props.representation);
-    }
+    };
 
     componentDidMount() {
         this.subscribe(this.plugin.state.events.cell.stateUpdated, e => {
diff --git a/src/mol-plugin-ui/structure/focus.tsx b/src/mol-plugin-ui/structure/focus.tsx
index 1aa66ec0008c8fc91d8aadcc2aa350ba0070e8e9..18d12d822509eca1e5bdfabf633a02d022e30979 100644
--- a/src/mol-plugin-ui/structure/focus.tsx
+++ b/src/mol-plugin-ui/structure/focus.tsx
@@ -99,7 +99,7 @@ function getFocusEntries(structure: Structure) {
 }
 
 export class StructureFocusControls extends PluginUIComponent<{}, StructureFocusControlsState> {
-    state = { isBusy: false, showAction: false }
+    state = { isBusy: false, showAction: false };
 
     componentDidMount() {
         this.subscribe(this.plugin.managers.structure.focus.behaviors.current, c => {
@@ -185,28 +185,28 @@ export class StructureFocusControls extends PluginUIComponent<{}, StructureFocus
             this.plugin.managers.structure.focus.set(f);
         }
         this.focusCamera();
-    }
+    };
 
-    toggleAction = () => this.setState({ showAction: !this.state.showAction })
+    toggleAction = () => this.setState({ showAction: !this.state.showAction });
 
     focusCamera = () => {
         const { current } = this.plugin.managers.structure.focus;
         if (current) this.plugin.managers.camera.focusLoci(current.loci);
-    }
+    };
 
     clear = () => {
         this.plugin.managers.structure.focus.clear();
         this.plugin.managers.camera.reset();
-    }
+    };
 
     highlightCurrent = () => {
         const { current } = this.plugin.managers.structure.focus;
         if (current) this.plugin.managers.interactivity.lociHighlights.highlightOnly({ loci: current.loci }, false);
-    }
+    };
 
     clearHighlights = () => {
         this.plugin.managers.interactivity.lociHighlights.clearHighlights();
-    }
+    };
 
     getToggleBindingLabel() {
         const t = this.plugin.state.behaviors.transforms.get(FocusLoci.id) as StateTransform<typeof FocusLoci>;
diff --git a/src/mol-plugin-ui/structure/generic.tsx b/src/mol-plugin-ui/structure/generic.tsx
index dcabaffd96c014b3eda270f14dd0cc68c0d20ba0..828f0b86a0518ff706ce7ef3f4afc576eaee6411 100644
--- a/src/mol-plugin-ui/structure/generic.tsx
+++ b/src/mol-plugin-ui/structure/generic.tsx
@@ -61,7 +61,7 @@ export class GenericEntryListControls extends PurePluginUIComponent {
 }
 
 export class GenericEntry<T extends StructureHierarchyRef> extends PurePluginUIComponent<{ refs: T[], labelMultiple?: string }, { showOptions: boolean }> {
-    state = { showOptions: false }
+    state = { showOptions: false };
 
     componentDidMount() {
         this.subscribe(this.plugin.state.events.cell.stateUpdated, e => {
@@ -75,7 +75,7 @@ export class GenericEntry<T extends StructureHierarchyRef> extends PurePluginUIC
         e.preventDefault();
         this.plugin.managers.structure.hierarchy.toggleVisibility(this.props.refs);
         e.currentTarget.blur();
-    }
+    };
 
     highlight = (e: React.MouseEvent<HTMLElement>) => {
         e.preventDefault();
@@ -84,12 +84,12 @@ export class GenericEntry<T extends StructureHierarchyRef> extends PurePluginUIC
             state: this.pivot.cell.parent,
             ref: this.props.refs.map(c => c.cell.transform.ref)
         });
-    }
+    };
 
     clearHighlight = (e: React.MouseEvent<HTMLElement>) => {
         e.preventDefault();
         PluginCommands.Interactivity.ClearHighlights(this.plugin);
-    }
+    };
 
     focus = (e: React.MouseEvent<HTMLElement>) => {
         e.preventDefault();
@@ -116,9 +116,9 @@ export class GenericEntry<T extends StructureHierarchyRef> extends PurePluginUIC
             if (l) loci.push(l);
         }
         this.plugin.managers.camera.focusLoci(loci);
-    }
+    };
 
-    toggleOptions = () => this.setState({ showOptions: !this.state.showOptions })
+    toggleOptions = () => this.setState({ showOptions: !this.state.showOptions });
 
     render() {
         const { refs, labelMultiple } = this.props;
diff --git a/src/mol-plugin-ui/structure/measurements.tsx b/src/mol-plugin-ui/structure/measurements.tsx
index b9a8f08f93c8d8d16ac58500a52326663fcf948c..cd26069728850817262781ff669b27c229f9c573 100644
--- a/src/mol-plugin-ui/structure/measurements.tsx
+++ b/src/mol-plugin-ui/structure/measurements.tsx
@@ -74,7 +74,7 @@ export class MeasurementList extends PurePluginUIComponent {
 }
 
 export class MeasurementControls extends PurePluginUIComponent<{}, { isBusy: boolean, action?: 'add' | 'options' }> {
-    state = { isBusy: false, action: void 0 as 'add' | 'options' | undefined }
+    state = { isBusy: false, action: void 0 as 'add' | 'options' | undefined };
 
     componentDidMount() {
         this.subscribe(this.selection.events.additionsHistoryUpdated, () => {
@@ -121,22 +121,22 @@ export class MeasurementControls extends PurePluginUIComponent<{}, { isBusy: boo
     measureDistance = () => {
         const loci = this.plugin.managers.structure.selection.additionsHistory;
         this.plugin.managers.structure.measurement.addDistance(loci[0].loci, loci[1].loci);
-    }
+    };
 
     measureAngle = () => {
         const loci = this.plugin.managers.structure.selection.additionsHistory;
         this.plugin.managers.structure.measurement.addAngle(loci[0].loci, loci[1].loci, loci[2].loci);
-    }
+    };
 
     measureDihedral = () => {
         const loci = this.plugin.managers.structure.selection.additionsHistory;
         this.plugin.managers.structure.measurement.addDihedral(loci[0].loci, loci[1].loci, loci[2].loci, loci[3].loci);
-    }
+    };
 
     addLabel = () => {
         const loci = this.plugin.managers.structure.selection.additionsHistory;
         this.plugin.managers.structure.measurement.addLabel(loci[0].loci);
-    }
+    };
 
     addOrientation = () => {
         const locis: StructureElement.Loci[] = [];
@@ -144,7 +144,7 @@ export class MeasurementControls extends PurePluginUIComponent<{}, { isBusy: boo
             locis.push(v.selection);
         });
         this.plugin.managers.structure.measurement.addOrientation(locis);
-    }
+    };
 
     addPlane = () => {
         const locis: StructureElement.Loci[] = [];
@@ -152,7 +152,7 @@ export class MeasurementControls extends PurePluginUIComponent<{}, { isBusy: boo
             locis.push(v.selection);
         });
         this.plugin.managers.structure.measurement.addPlane(locis);
-    }
+    };
 
     get actions(): ActionMenu.Items {
         const history = this.selection.additionsHistory;
@@ -171,7 +171,7 @@ export class MeasurementControls extends PurePluginUIComponent<{}, { isBusy: boo
         this.toggleAdd();
         if (!item) return;
         (item?.value as any)();
-    }
+    };
 
     toggleAdd = () => this.setState({ action: this.state.action === 'add' ? void 0 : 'add' });
     toggleOptions = () => this.setState({ action: this.state.action === 'options' ? void 0 : 'options' });
@@ -232,7 +232,7 @@ export class MeasurementControls extends PurePluginUIComponent<{}, { isBusy: boo
 }
 
 class MeasurementsOptions extends PurePluginUIComponent<{}, { isDisabled: boolean }> {
-    state = { isDisabled: false }
+    state = { isDisabled: false };
 
     componentDidMount() {
         this.subscribe(this.plugin.managers.structure.measurement.behaviors.state, () => {
@@ -246,7 +246,7 @@ class MeasurementsOptions extends PurePluginUIComponent<{}, { isDisabled: boolea
 
     changed = (options: StructureMeasurementOptions) => {
         this.plugin.managers.structure.measurement.setOptions(options);
-    }
+    };
 
     render() {
         const measurements = this.plugin.managers.structure.measurement.state;
@@ -258,7 +258,7 @@ class MeasurementsOptions extends PurePluginUIComponent<{}, { isDisabled: boolea
 }
 
 class MeasurementEntry extends PurePluginUIComponent<{ cell: StructureMeasurementCell }, { showUpdate: boolean }> {
-    state = { showUpdate: false }
+    state = { showUpdate: false };
 
     componentDidMount() {
         this.subscribe(this.plugin.state.events.cell.stateUpdated, e => {
@@ -278,7 +278,7 @@ class MeasurementEntry extends PurePluginUIComponent<{ cell: StructureMeasuremen
         e.preventDefault();
         PluginCommands.State.ToggleVisibility(this.plugin, { state: this.props.cell.parent!, ref: this.props.cell.transform.parent });
         e.currentTarget.blur();
-    }
+    };
 
     highlight = () => {
         const selections = this.selections;
@@ -289,11 +289,11 @@ class MeasurementEntry extends PurePluginUIComponent<{ cell: StructureMeasuremen
             this.plugin.managers.interactivity.lociHighlights.highlight({ loci }, false);
         }
         this.plugin.managers.interactivity.lociHighlights.highlight({ loci: this.props.cell.obj?.data.repr.getLoci()! }, false);
-    }
+    };
 
     clearHighlight = () => {
         this.plugin.managers.interactivity.lociHighlights.clearHighlights();
-    }
+    };
 
     toggleUpdate = () => this.setState({ showUpdate: !this.state.showUpdate });
 
@@ -305,7 +305,7 @@ class MeasurementEntry extends PurePluginUIComponent<{ cell: StructureMeasuremen
         if (sphere) {
             this.plugin.managers.camera.focusSphere(sphere);
         }
-    }
+    };
 
     private get lociArray(): FiniteArray<Loci> {
         const selections = this.selections;
@@ -339,7 +339,7 @@ class MeasurementEntry extends PurePluginUIComponent<{ cell: StructureMeasuremen
         if (!item) return;
         this.setState({ showUpdate: false });
         (item?.value as any)();
-    }
+    };
 
     render() {
         const { cell } = this.props;
diff --git a/src/mol-plugin-ui/structure/selection.tsx b/src/mol-plugin-ui/structure/selection.tsx
index 8596ea83ace638c481e2640a2c70d9783063ebd0..02cab6bb0f14015111b5b336dbae38d01af53851 100644
--- a/src/mol-plugin-ui/structure/selection.tsx
+++ b/src/mol-plugin-ui/structure/selection.tsx
@@ -35,7 +35,7 @@ export class ToggleSelectionModeButton extends PurePluginUIComponent<{ inline?:
 
     _toggleSelMode = () => {
         this.plugin.selectionMode = !this.plugin.selectionMode;
-    }
+    };
 
     render() {
         const style = this.props.inline
@@ -75,7 +75,7 @@ export class StructureSelectionActionsControls extends PluginUIComponent<{}, Str
         isEmpty: true,
         isBusy: false,
         canUndo: false,
-    }
+    };
 
     componentDidMount() {
         this.subscribe(this.plugin.managers.structure.hierarchy.behaviors.selection, c => {
@@ -107,7 +107,7 @@ export class StructureSelectionActionsControls extends PluginUIComponent<{}, Str
 
     set = (modifier: StructureSelectionModifier, selectionQuery: StructureSelectionQuery) => {
         this.plugin.managers.structure.selection.fromSelectionQuery(modifier, selectionQuery, false);
-    }
+    };
 
     selectQuery: ActionMenu.OnSelect = (item, e) => {
         if (!item || !this.state.action) {
@@ -122,7 +122,7 @@ export class StructureSelectionActionsControls extends PluginUIComponent<{}, Str
                 this.set(q, item.value as StructureSelectionQuery);
             });
         }
-    }
+    };
 
     selectHelper: ActionMenu.OnSelect = (item, e) => {
         console.log(item);
@@ -131,7 +131,7 @@ export class StructureSelectionActionsControls extends PluginUIComponent<{}, Str
             return;
         }
         this.setState({ helper: (item.value as { kind: SelectionHelperType }).kind });
-    }
+    };
 
     get structures() {
         const structures: Structure[] = [];
@@ -142,8 +142,8 @@ export class StructureSelectionActionsControls extends PluginUIComponent<{}, Str
         return structures;
     }
 
-    private queriesItems: ActionMenu.Items[] = []
-    private queriesVersion = -1
+    private queriesItems: ActionMenu.Items[] = [];
+    private queriesVersion = -1;
     get queries() {
         const { registry } = this.plugin.query.structure;
         if (registry.version !== this.queriesVersion) {
@@ -186,24 +186,24 @@ export class StructureSelectionActionsControls extends PluginUIComponent<{}, Str
         return () => this.setState({ action: this.state.action === q ? void 0 : q, helper: void 0 });
     }
 
-    toggleAdd = this.showAction('add')
-    toggleRemove = this.showAction('remove')
-    toggleIntersect = this.showAction('intersect')
-    toggleSet = this.showAction('set')
-    toggleTheme = this.showAction('theme')
-    toggleAddComponent = this.showAction('add-component')
-    toggleHelp = this.showAction('help')
+    toggleAdd = this.showAction('add');
+    toggleRemove = this.showAction('remove');
+    toggleIntersect = this.showAction('intersect');
+    toggleSet = this.showAction('set');
+    toggleTheme = this.showAction('theme');
+    toggleAddComponent = this.showAction('add-component');
+    toggleHelp = this.showAction('help');
 
     setGranuality: ParamOnChange = ({ value }) => {
         this.plugin.managers.interactivity.setProps({ granularity: value });
-    }
+    };
 
     turnOff = () => this.plugin.selectionMode = false;
 
     undo = () => {
         const task = this.plugin.state.data.undo();
         if (task) this.plugin.runTask(task);
-    }
+    };
 
     subtract = () => {
         const sel = this.plugin.managers.structure.hierarchy.getStructuresWithSelection();
@@ -211,7 +211,7 @@ export class StructureSelectionActionsControls extends PluginUIComponent<{}, Str
         for (const s of sel) components.push(...s.components);
         if (components.length === 0) return;
         this.plugin.managers.structure.component.modifyByCurrentSelection(components, 'subtract');
-    }
+    };
 
     render() {
         const granularity = this.plugin.managers.interactivity.props.granularity;
@@ -283,7 +283,7 @@ export class StructureSelectionStatsControls extends PluginUIComponent<{ hideOnE
     state = {
         isEmpty: true,
         isBusy: false
-    }
+    };
 
     componentDidMount() {
         this.subscribe(this.plugin.managers.structure.selection.events.changed, () => {
@@ -321,18 +321,18 @@ export class StructureSelectionStatsControls extends PluginUIComponent<{ hideOnE
         if (this.plugin.managers.structure.selection.stats.elementCount === 0) return;
         const { sphere } = this.plugin.managers.structure.selection.getBoundary();
         this.plugin.managers.camera.focusSphere(sphere);
-    }
+    };
 
     highlight = (e: React.MouseEvent<HTMLElement>) => {
         this.plugin.managers.interactivity.lociHighlights.clearHighlights();
         this.plugin.managers.structure.selection.entries.forEach(e => {
             this.plugin.managers.interactivity.lociHighlights.highlight({ loci: e.selection }, false);
         });
-    }
+    };
 
     clearHighlight = () => {
         this.plugin.managers.interactivity.lociHighlights.clearHighlights();
-    }
+    };
 
     render() {
         const stats = this.plugin.managers.structure.selection.stats;
@@ -369,9 +369,9 @@ class ApplyThemeControls extends PurePluginUIComponent<ApplyThemeControlsProps,
     apply = () => {
         this.plugin.managers.structure.component.applyTheme(this.state.values, this.plugin.managers.structure.hierarchy.current.structures);
         this.props.onApply?.();
-    }
+    };
 
-    paramsChanged = (values: any) => this.setState({ values })
+    paramsChanged = (values: any) => this.setState({ values });
 
     render() {
         return <>
diff --git a/src/mol-plugin-ui/structure/source.tsx b/src/mol-plugin-ui/structure/source.tsx
index 1a41d4448da85ab4cffbf575c8e610e4116ede67..4a770278b9741aae6f8f6687a96187c5bd50f250 100644
--- a/src/mol-plugin-ui/structure/source.tsx
+++ b/src/mol-plugin-ui/structure/source.tsx
@@ -66,12 +66,12 @@ export class StructureSourceControls extends CollapsableControls<{}, StructureSo
         }
         const item: ActionMenu.Item = { kind: 'item', label: label || ref.kind, selected: selected.has(ref.cell.transform.ref), value: [ref] };
         return item;
-    }
+    };
 
     getTrajectoryItems = (t: TrajectoryRef): ActionMenu.Items => {
         if (t.models.length === 0) return this.item(t);
         return [ActionMenu.Header(t.cell.obj?.label!), ...t.models.map(this.getModelItems)];
-    }
+    };
 
     private getModelItems = (m: ModelRef): ActionMenu.Items => {
         if (m.structures.length === 0) return this.item(m);
@@ -81,7 +81,7 @@ export class StructureSourceControls extends CollapsableControls<{}, StructureSo
             return { label: `${m.cell.obj?.label} | ${ref.cell.obj?.label}`, selected: selected.has(ref.cell.transform.ref), value: [m, ref] } as ActionMenu.Item;
         }
         return [ActionMenu.Header(m.cell.obj?.label!), ...m.structures.map(this.item)];
-    }
+    };
 
     get hierarchyItems() {
         const mng = this.plugin.managers.structure.hierarchy;
@@ -186,7 +186,7 @@ export class StructureSourceControls extends CollapsableControls<{}, StructureSo
         }
 
         this.plugin.managers.structure.hierarchy.updateCurrent(refs, items[0].selected ? 'remove' : 'add');
-    }
+    };
 
     toggleHierarchy = () => this.setState({ show: this.state.show !== 'hierarchy' ? 'hierarchy' : void 0 });
     togglePreset = () => this.setState({ show: this.state.show !== 'presets' ? 'presets' : void 0 });
@@ -226,7 +226,7 @@ export class StructureSourceControls extends CollapsableControls<{}, StructureSo
 
         const { trajectories } = mng.hierarchy.selection;
         mng.hierarchy.applyPreset(trajectories, item.value as any);
-    }
+    };
 
     private updateModelQueueParams: any = void 0;
     private isUpdatingModel = false;
@@ -269,7 +269,7 @@ export class StructureSourceControls extends CollapsableControls<{}, StructureSo
         const { selection } = this.plugin.managers.structure.hierarchy;
         const s = selection.structures[0];
         return this.plugin.managers.structure.hierarchy.updateStructure(s, params);
-    }
+    };
 
     get structureType() {
         const { selection } = this.plugin.managers.structure.hierarchy;
diff --git a/src/mol-plugin-ui/structure/superposition.tsx b/src/mol-plugin-ui/structure/superposition.tsx
index 32f49650d8923b0383efc3fcbc6b10ae44a42669..eb9818c5b7a6838d1c9acf86b6b665c023a900fc 100644
--- a/src/mol-plugin-ui/structure/superposition.tsx
+++ b/src/mol-plugin-ui/structure/superposition.tsx
@@ -78,7 +78,7 @@ export class SuperpositionControls extends PurePluginUIComponent<{ }, Superposit
         canUseDb: false,
         action: undefined,
         options: DefaultStructureSuperpositionOptions
-    }
+    };
 
     componentDidMount() {
         this.subscribe(this.selection.events.changed, () => {
@@ -148,7 +148,7 @@ export class SuperpositionControls extends PurePluginUIComponent<{ }, Superposit
             const labelB = stripTags(eB.label);
             this.plugin.log.info(`Superposed [${labelA}] and [${labelB}] with RMSD ${rmsd.toFixed(2)}.`);
         }
-    }
+    };
 
     superposeAtoms = async () => {
         const entries = this.atomEntries;
@@ -171,7 +171,7 @@ export class SuperpositionControls extends PurePluginUIComponent<{ }, Superposit
             const count = entries[i].atoms.length;
             this.plugin.log.info(`Superposed ${count} ${count === 1 ? 'atom' : 'atoms'} of [${labelA}] and [${labelB}] with RMSD ${rmsd.toFixed(2)}.`);
         }
-    }
+    };
 
     superposeDb = async () => {
         const input = this.plugin.managers.structure.hierarchy.behaviors.selection.value.structures;
@@ -331,7 +331,7 @@ export class SuperpositionControls extends PurePluginUIComponent<{ }, Superposit
 
     private setOptions = (values: StructureSuperpositionOptions) => {
         this.setState({ options: values });
-    }
+    };
 
     render() {
         return <>
diff --git a/src/mol-plugin-ui/structure/volume.tsx b/src/mol-plugin-ui/structure/volume.tsx
index 94368e4d14c297c26accf3bfd5debd6110e8acf8..53eb289be6bb2106fbaf6e0882dc562e3be69787 100644
--- a/src/mol-plugin-ui/structure/volume.tsx
+++ b/src/mol-plugin-ui/structure/volume.tsx
@@ -142,7 +142,7 @@ export class VolumeSourceControls extends CollapsableControls<{}, VolumeSourceCo
             value: ref
         };
         return item;
-    }
+    };
 
     get hierarchyItems() {
         const mng = this.plugin.managers.volume.hierarchy;
@@ -195,7 +195,7 @@ export class VolumeSourceControls extends CollapsableControls<{}, VolumeSourceCo
         } else {
             this.lazyLoad(current.cell);
         }
-    }
+    };
 
     private async lazyLoad(cell: StateObjectCell<PluginStateObject.Volume.Lazy>) {
         const { url, isBinary, format, entryId, isovalues } = cell.obj!.data;
@@ -235,7 +235,7 @@ export class VolumeSourceControls extends CollapsableControls<{}, VolumeSourceCo
         if (!item) return;
         this.setState({ show: void 0 });
         (item.value as any)();
-    }
+    };
 
     toggleHierarchy = () => this.setState({ show: this.state.show !== 'hierarchy' ? 'hierarchy' : void 0 });
     toggleAddRepr = () => this.setState({ show: this.state.show !== 'add-repr' ? 'add-repr' : void 0 });
@@ -263,7 +263,7 @@ export class VolumeSourceControls extends CollapsableControls<{}, VolumeSourceCo
 type VolumeRepresentationEntryActions = 'update'
 
 class VolumeRepresentationControls extends PurePluginUIComponent<{ representation: VolumeRepresentationRef }, { action?: VolumeRepresentationEntryActions }> {
-    state = { action: void 0 as VolumeRepresentationEntryActions | undefined }
+    state = { action: void 0 as VolumeRepresentationEntryActions | undefined };
 
     componentDidMount() {
         this.subscribe(this.plugin.state.events.cell.stateUpdated, e => {
@@ -277,7 +277,7 @@ class VolumeRepresentationControls extends PurePluginUIComponent<{ representatio
         e.preventDefault();
         e.currentTarget.blur();
         this.plugin.managers.volume.hierarchy.toggleVisibility([this.props.representation]);
-    }
+    };
 
     toggleUpdate = () => this.setState({ action: this.state.action === 'update' ? void 0 : 'update' });
 
@@ -285,19 +285,19 @@ class VolumeRepresentationControls extends PurePluginUIComponent<{ representatio
         e.preventDefault();
         if (!this.props.representation.cell.parent) return;
         PluginCommands.Interactivity.Object.Highlight(this.plugin, { state: this.props.representation.cell.parent!, ref: this.props.representation.cell.transform.ref });
-    }
+    };
 
     clearHighlight = (e: React.MouseEvent<HTMLElement>) => {
         e.preventDefault();
         PluginCommands.Interactivity.ClearHighlights(this.plugin);
-    }
+    };
 
     focus = () => {
         const repr = this.props.representation;
         const objects = this.props.representation.cell.obj?.data.repr.renderObjects;
         if (repr.cell.state.isHidden) this.plugin.managers.volume.hierarchy.toggleVisibility([this.props.representation], 'show');
         this.plugin.managers.camera.focusRenderObjects(objects, { extraRadius: 1 });
-    }
+    };
 
     render() {
         const repr = this.props.representation.cell;
diff --git a/src/mol-plugin-ui/task.tsx b/src/mol-plugin-ui/task.tsx
index a67cef5dd1da992579b6d3de7768bb32741acc69..4f3cfb7bb7f8ab28476621836f2d7a956693d966 100644
--- a/src/mol-plugin-ui/task.tsx
+++ b/src/mol-plugin-ui/task.tsx
@@ -35,7 +35,7 @@ export class BackgroundTaskProgress extends PluginUIComponent<{ }, { tracked: Or
 class ProgressEntry extends PluginUIComponent<{ event: TaskManager.ProgressEvent }> {
     abort = () => {
         this.plugin.managers.task.requestAbort(this.props.event.progress.root.progress.taskId, 'User Request');
-    }
+    };
 
     render() {
         const root = this.props.event.progress.root;
diff --git a/src/mol-plugin-ui/viewport.tsx b/src/mol-plugin-ui/viewport.tsx
index 3fe2974b10e5a0213d87f853827ff7174bd7e11e..6d0c45df7796b782868ff32292dacb549def7b38 100644
--- a/src/mol-plugin-ui/viewport.tsx
+++ b/src/mol-plugin-ui/viewport.tsx
@@ -35,7 +35,7 @@ export class ViewportControls extends PluginUIComponent<ViewportControlsProps, V
 
     resetCamera = () => {
         PluginCommands.Camera.Reset(this.plugin, {});
-    }
+    };
 
     private toggle(panel: keyof ViewportControlsState) {
         return (e?: React.MouseEvent<HTMLButtonElement>) => {
@@ -49,23 +49,23 @@ export class ViewportControls extends PluginUIComponent<ViewportControlsProps, V
 
     toggleControls = () => {
         PluginCommands.Layout.Update(this.plugin, { state: { showControls: !this.plugin.layout.state.showControls } });
-    }
+    };
 
     toggleExpanded = () => {
         PluginCommands.Layout.Update(this.plugin, { state: { isExpanded: !this.plugin.layout.state.isExpanded } });
-    }
+    };
 
     setSettings = (p: { param: PD.Base<any>, name: string, value: any }) => {
         PluginCommands.Canvas3D.SetSettings(this.plugin, { settings: { [p.name]: p.value } });
-    }
+    };
 
     setLayout = (p: { param: PD.Base<any>, name: string, value: any }) => {
         PluginCommands.Layout.Update(this.plugin, { state: { [p.name]: p.value } });
-    }
+    };
 
     screenshot = () => {
         this.plugin.helpers.viewportScreenshot?.download();
-    }
+    };
 
     componentDidMount() {
         this.subscribe(this.plugin.events.canvas3d.settingsUpdated, () => this.forceUpdate());
@@ -79,7 +79,7 @@ export class ViewportControls extends PluginUIComponent<ViewportControlsProps, V
     onMouseMove = (e: React.MouseEvent) => {
         // ignore mouse moves when no button is held
         if (e.buttons === 0) e.stopPropagation();
-    }
+    };
 
     render() {
         return <div className={'msp-viewport-controls'} onMouseMove={this.onMouseMove}>
diff --git a/src/mol-plugin-ui/viewport/canvas.tsx b/src/mol-plugin-ui/viewport/canvas.tsx
index 0b7bb156ac3cafb64ae8e944ce587fd9b5abb35e..616c145d1bb5033e6ae956f125fe780863ff6f21 100644
--- a/src/mol-plugin-ui/viewport/canvas.tsx
+++ b/src/mol-plugin-ui/viewport/canvas.tsx
@@ -34,7 +34,7 @@ export class ViewportCanvas extends PluginUIComponent<ViewportCanvasParams, View
 
     private handleLogo = () => {
         this.setState({ showLogo: !this.plugin.canvas3d?.reprCount.value });
-    }
+    };
 
     componentDidMount() {
         if (!this.canvas.current || !this.container.current || !this.plugin.initViewer(this.canvas.current!, this.container.current!)) {
diff --git a/src/mol-plugin-ui/viewport/help.tsx b/src/mol-plugin-ui/viewport/help.tsx
index c8ffc22f6293d79b7ee1b7fa0a1609e453a63fb6..cb0958531faf4245c34d4a25fba976871337097d 100644
--- a/src/mol-plugin-ui/viewport/help.tsx
+++ b/src/mol-plugin-ui/viewport/help.tsx
@@ -49,7 +49,7 @@ export class HelpGroup extends React.PureComponent<{ header: string, initiallyEx
     state = {
         header: this.props.header,
         isExpanded: !!this.props.initiallyExpanded
-    }
+    };
 
     toggleExpanded = () => this.setState({ isExpanded: !this.state.isExpanded });
 
diff --git a/src/mol-plugin-ui/viewport/screenshot.tsx b/src/mol-plugin-ui/viewport/screenshot.tsx
index 712ecdf8c904402bb6997cba7d6c9669add69c79..443bf9b940eab4d2979abefde2d96969ea4251ee 100644
--- a/src/mol-plugin-ui/viewport/screenshot.tsx
+++ b/src/mol-plugin-ui/viewport/screenshot.tsx
@@ -26,12 +26,12 @@ export class DownloadScreenshotControls extends PluginUIComponent<{ close: () =>
     state: ImageControlsState = {
         showPreview: true,
         isDisabled: false
-    } as ImageControlsState
+    } as ImageControlsState;
 
     private download = () => {
         this.plugin.helpers.viewportScreenshot?.download();
         this.props.close();
-    }
+    };
 
     private copy = async () => {
         try {
@@ -44,12 +44,12 @@ export class DownloadScreenshotControls extends PluginUIComponent<{ close: () =>
         } catch {
             return this.copyImg();
         }
-    }
+    };
 
     private copyImg = async () => {
         const src = await this.plugin.helpers.viewportScreenshot?.getImageDataUri();
         this.setState({ imageData: src });
-    }
+    };
 
     componentDidMount() {
         this.subscribe(this.plugin.state.data.behaviors.isUpdating, v => {
@@ -64,7 +64,7 @@ export class DownloadScreenshotControls extends PluginUIComponent<{ close: () =>
     open = (e: React.ChangeEvent<HTMLInputElement>) => {
         if (!e.target.files || !e.target.files![0]) return;
         PluginCommands.State.Snapshots.OpenFile(this.plugin, { file: e.target.files![0] });
-    }
+    };
 
     render() {
         const hasClipboardApi = !!(navigator.clipboard as any)?.write;
diff --git a/src/mol-plugin/animation-loop.ts b/src/mol-plugin/animation-loop.ts
index 2903019f41c97facf495b4104a85fb5bdb6f7b09..3553f011a5c6cc87d288125f0da5ee694d5aa01c 100644
--- a/src/mol-plugin/animation-loop.ts
+++ b/src/mol-plugin/animation-loop.ts
@@ -25,7 +25,7 @@ export class PluginAnimationLoop {
         if (this._isAnimating) {
             this.currentFrame = requestAnimationFrame(this.frame);
         }
-    }
+    };
 
     resetTime(t: number = now()) {
         this.plugin.canvas3d?.resetTime(t);
diff --git a/src/mol-plugin/behavior/dynamic/custom-props/computed/accessible-surface-area.ts b/src/mol-plugin/behavior/dynamic/custom-props/computed/accessible-surface-area.ts
index 10a12d4c8a194f4b6ea6f7f05e43025de2962798..424b5504a5218ccfb01bea27822bdb34ef8a94de 100644
--- a/src/mol-plugin/behavior/dynamic/custom-props/computed/accessible-surface-area.ts
+++ b/src/mol-plugin/behavior/dynamic/custom-props/computed/accessible-surface-area.ts
@@ -20,14 +20,14 @@ export const AccessibleSurfaceArea = PluginBehavior.create<{ autoAttach: boolean
     category: 'custom-props',
     display: { name: 'Accessible Surface Area' },
     ctor: class extends PluginBehavior.Handler<{ autoAttach: boolean, showTooltip: boolean }> {
-        private provider = AccessibleSurfaceAreaProvider
+        private provider = AccessibleSurfaceAreaProvider;
 
         private labelProvider = {
             label: (loci: Loci): string | undefined => {
                 if (!this.params.showTooltip) return;
                 return accessibleSurfaceAreaLabel(loci);
             }
-        }
+        };
 
         update(p: { autoAttach: boolean, showTooltip: boolean }) {
             const updated = (
diff --git a/src/mol-plugin/behavior/dynamic/custom-props/computed/interactions.ts b/src/mol-plugin/behavior/dynamic/custom-props/computed/interactions.ts
index 38d6e64b57c4e9daa758e8451aff11f64d14ab23..d3edcd97b988172c522ec1d22b11e4f486a76c8b 100644
--- a/src/mol-plugin/behavior/dynamic/custom-props/computed/interactions.ts
+++ b/src/mol-plugin/behavior/dynamic/custom-props/computed/interactions.ts
@@ -23,7 +23,7 @@ export const Interactions = PluginBehavior.create<{ autoAttach: boolean, showToo
     category: 'custom-props',
     display: { name: 'Interactions' },
     ctor: class extends PluginBehavior.Handler<{ autoAttach: boolean, showTooltip: boolean }> {
-        private provider = InteractionsProvider
+        private provider = InteractionsProvider;
 
         private getStructures(structure: Structure) {
             const structures: Structure[] = [];
@@ -86,7 +86,7 @@ export const Interactions = PluginBehavior.create<{ autoAttach: boolean, showToo
                     default: return void 0;
                 }
             }
-        }
+        };
 
         update(p: { autoAttach: boolean, showTooltip: boolean }) {
             const updated = (
diff --git a/src/mol-plugin/behavior/dynamic/custom-props/computed/secondary-structure.ts b/src/mol-plugin/behavior/dynamic/custom-props/computed/secondary-structure.ts
index c6273093890d544ced1c477f31c314f3447308d6..54eca04842350b64caf267197ac873d7ed5dc663 100644
--- a/src/mol-plugin/behavior/dynamic/custom-props/computed/secondary-structure.ts
+++ b/src/mol-plugin/behavior/dynamic/custom-props/computed/secondary-structure.ts
@@ -13,7 +13,7 @@ export const SecondaryStructure = PluginBehavior.create<{ autoAttach: boolean }>
     category: 'custom-props',
     display: { name: 'Secondary Structure' },
     ctor: class extends PluginBehavior.Handler<{ autoAttach: boolean }> {
-        private provider = SecondaryStructureProvider
+        private provider = SecondaryStructureProvider;
 
         update(p: { autoAttach: boolean, showTooltip: boolean }) {
             const updated = (
diff --git a/src/mol-plugin/behavior/dynamic/custom-props/computed/valence-model.ts b/src/mol-plugin/behavior/dynamic/custom-props/computed/valence-model.ts
index b2ab4334ad3acc29e0bf8589bfbf0e203a4dafed..32f776dbcd1d92dccc738702e486cd2d2cc09add 100644
--- a/src/mol-plugin/behavior/dynamic/custom-props/computed/valence-model.ts
+++ b/src/mol-plugin/behavior/dynamic/custom-props/computed/valence-model.ts
@@ -20,7 +20,7 @@ export const ValenceModel = PluginBehavior.create<{ autoAttach: boolean, showToo
     category: 'custom-props',
     display: { name: 'Valence Model' },
     ctor: class extends PluginBehavior.Handler<{ autoAttach: boolean, showTooltip: boolean }> {
-        private provider = ValenceModelProvider
+        private provider = ValenceModelProvider;
 
         private getStructures(structure: Structure) {
             const structures: Structure[] = [];
@@ -73,7 +73,7 @@ export const ValenceModel = PluginBehavior.create<{ autoAttach: boolean, showToo
                     default: return void 0;
                 }
             }
-        }
+        };
 
         update(p: { autoAttach: boolean, showTooltip: boolean }) {
             const updated = (
diff --git a/src/mol-plugin/behavior/dynamic/custom-props/integrative/cross-link-restraint.ts b/src/mol-plugin/behavior/dynamic/custom-props/integrative/cross-link-restraint.ts
index 8fb480b3e2d3a61e183e96ebe6ae47539726fd80..077d33c780bba991d81254debcfa2652ce780ae9 100644
--- a/src/mol-plugin/behavior/dynamic/custom-props/integrative/cross-link-restraint.ts
+++ b/src/mol-plugin/behavior/dynamic/custom-props/integrative/cross-link-restraint.ts
@@ -17,7 +17,7 @@ export const CrossLinkRestraint = PluginBehavior.create<{ }>({
     category: 'custom-props',
     display: { name: 'Cross Link Restraint' },
     ctor: class extends PluginBehavior.Handler<{ }> {
-        private provider = ModelCrossLinkRestraint.Provider
+        private provider = ModelCrossLinkRestraint.Provider;
 
         register(): void {
             this.provider.formatRegistry.add('mmCIF', crossLinkRestraintFromMmcif);
diff --git a/src/mol-plugin/behavior/dynamic/custom-props/sequence/best-database-mapping.ts b/src/mol-plugin/behavior/dynamic/custom-props/sequence/best-database-mapping.ts
index 9336cf6aceda8fad0e860cd139f4f5eb399a820d..d5e4c1e615c7810aa31984dfa41a9d13888378fb 100644
--- a/src/mol-plugin/behavior/dynamic/custom-props/sequence/best-database-mapping.ts
+++ b/src/mol-plugin/behavior/dynamic/custom-props/sequence/best-database-mapping.ts
@@ -17,14 +17,14 @@ export const BestDatabaseSequenceMapping = PluginBehavior.create<{ autoAttach: b
     category: 'custom-props',
     display: { name: 'Best Database Sequence Mapping' },
     ctor: class extends PluginBehavior.Handler<{ autoAttach: boolean, showTooltip: boolean }> {
-        private provider = BestDatabaseSequenceMappingProp.Provider
+        private provider = BestDatabaseSequenceMappingProp.Provider;
 
         private labelProvider = {
             label: (loci: Loci): string | undefined => {
                 if (!this.params.showTooltip) return;
                 return bestDatabaseSequenceMappingLabel(loci);
             }
-        }
+        };
 
         update(p: { autoAttach: boolean, showTooltip: boolean }) {
             const updated = (
diff --git a/src/mol-plugin/behavior/dynamic/representation.ts b/src/mol-plugin/behavior/dynamic/representation.ts
index a561ae846bf9be8815987038e3ce131086c6ae28..9edca255ba8f345d4610beb6f23a15417277e487 100644
--- a/src/mol-plugin/behavior/dynamic/representation.ts
+++ b/src/mol-plugin/behavior/dynamic/representation.ts
@@ -46,7 +46,7 @@ export const HighlightLoci = PluginBehavior.create({
         private lociMarkProvider = (interactionLoci: Representation.Loci, action: MarkerAction, noRender?: boolean) => {
             if (!this.ctx.canvas3d || !this.params.mark) return;
             this.ctx.canvas3d.mark(interactionLoci, action, noRender);
-        }
+        };
         private getLoci(loci: Loci) {
             return this.params.preferAtoms && Bond.isLoci(loci) && loci.bonds.length === 2
                 ? Bond.toFirstStructureElementLoci(loci)
@@ -112,11 +112,11 @@ export const SelectLoci = PluginBehavior.create({
     name: 'representation-select-loci',
     category: 'interaction',
     ctor: class extends PluginBehavior.Handler<SelectLociProps> {
-        private spine: StateTreeSpine.Impl
+        private spine: StateTreeSpine.Impl;
         private lociMarkProvider = (reprLoci: Representation.Loci, action: MarkerAction, noRender?: boolean) => {
             if (!this.ctx.canvas3d || !this.params.mark) return;
             this.ctx.canvas3d.mark({ loci: reprLoci.loci }, action, noRender);
-        }
+        };
         private getLoci(loci: Loci) {
             return this.params.preferAtoms && Bond.isLoci(loci) && loci.bonds.length === 2
                 ? Bond.toFirstStructureElementLoci(loci)
diff --git a/src/mol-plugin/behavior/dynamic/volume-streaming/behavior.ts b/src/mol-plugin/behavior/dynamic/volume-streaming/behavior.ts
index c145b6d91f7aa8e775f8d0e6d8aaa1729c5ae10d..071e4544ac1f234044caa0d222ad3953025c44bf 100644
--- a/src/mol-plugin/behavior/dynamic/volume-streaming/behavior.ts
+++ b/src/mol-plugin/behavior/dynamic/volume-streaming/behavior.ts
@@ -139,9 +139,9 @@ export namespace VolumeStreaming {
         public params: Params = {} as any;
         private lastLoci: StructureElement.Loci | EmptyLoci = EmptyLoci;
         private ref: string = '';
-        public infoMap: Map<string, VolumeServerInfo.EntryData>
+        public infoMap: Map<string, VolumeServerInfo.EntryData>;
 
-        channels: Channels = {}
+        channels: Channels = {};
 
         public get info() {
             return this.infoMap.get(this.params.entry.name)!;
diff --git a/src/mol-plugin/context.ts b/src/mol-plugin/context.ts
index 35f0e33dccbb6dc21012e28df464039bc99eea8c..e953c67d60f0fe16bbf361798f551ccc1bf2ccba 100644
--- a/src/mol-plugin/context.ts
+++ b/src/mol-plugin/context.ts
@@ -67,7 +67,7 @@ export class PluginContext {
         if (!object) return void 0;
         if (Task.is(object)) return this.runTask(object);
         return object;
-    }
+    };
 
     protected subs: Subscription[] = [];
 
@@ -259,7 +259,7 @@ export class PluginContext {
      * This should be used in all transform related request so that it could be "spoofed" to allow
      * "static" access to resources.
      */
-    readonly fetch = ajaxGet
+    readonly fetch = ajaxGet;
 
     /** return true is animating or updating */
     get isBusy() {
diff --git a/src/mol-plugin/layout.ts b/src/mol-plugin/layout.ts
index 7261a6a1a5a3c0e149655a29b457e1397ef70b93..34241bcfad617026f2d3baa37afa0f16557ac672 100644
--- a/src/mol-plugin/layout.ts
+++ b/src/mol-plugin/layout.ts
@@ -62,7 +62,7 @@ interface RootState {
 export class PluginLayout extends StatefulPluginComponent<PluginLayoutStateProps> {
     readonly events = {
         updated: this.ev()
-    }
+    };
 
     private updateProps(state: Partial<PluginLayoutStateProps>) {
         const prevExpanded = !!this.state.isExpanded;
diff --git a/src/mol-plugin/state.ts b/src/mol-plugin/state.ts
index 281409b5130fe69960edc29413c65894fc236542..cf0a05dc34b3f3439e5bde476228cacba2d0a7cd 100644
--- a/src/mol-plugin/state.ts
+++ b/src/mol-plugin/state.ts
@@ -47,7 +47,7 @@ class PluginState extends PluginComponent {
 
     setSnapshotParams = (params?: PluginState.SnapshotParams) => {
         this.snapshotParams.next({ ...PluginState.DefaultSnapshotParams, ...params });
-    }
+    };
 
     getSnapshot(params?: PluginState.SnapshotParams): PluginState.Snapshot {
         const p = { ...this.snapshotParams.value, ...params };
diff --git a/src/mol-plugin/util/substructure-parent-helper.ts b/src/mol-plugin/util/substructure-parent-helper.ts
index 3b79ffd211a3b9870813e1d0778060e842b6a4ac..90795071c03f877696cef04649b83556f5854a13 100644
--- a/src/mol-plugin/util/substructure-parent-helper.ts
+++ b/src/mol-plugin/util/substructure-parent-helper.ts
@@ -18,7 +18,7 @@ class SubstructureParentHelper {
     readonly events = {
         updated: this.ev<{ ref: string, oldObj: PluginStateObject.Molecule.Structure | undefined, obj: PluginStateObject.Molecule.Structure }>(),
         removed: this.ev<{ ref: string, obj: PluginStateObject.Molecule.Structure | undefined }>(),
-    }
+    };
 
     // private decorators = new Map<string, string[]>();
     private root = new Map<Structure, { ref: string, count: number }>();
diff --git a/src/mol-repr/representation.ts b/src/mol-repr/representation.ts
index 622e4454c1737bbd8fc35c0020ea7597b79e6670..246e34eb625d176da85f0221531742c4c93ca499 100644
--- a/src/mol-repr/representation.ts
+++ b/src/mol-repr/representation.ts
@@ -85,9 +85,9 @@ function getTypes(list: { name: string, provider: RepresentationProvider<any, an
 }
 
 export class RepresentationRegistry<D, S extends Representation.State> {
-    private _list: { name: string, provider: RepresentationProvider<D, any, any> }[] = []
-    private _map = new Map<string, RepresentationProvider<D, any, any>>()
-    private _name = new Map<RepresentationProvider<D, any, any>, string>()
+    private _list: { name: string, provider: RepresentationProvider<D, any, any> }[] = [];
+    private _map = new Map<string, RepresentationProvider<D, any, any>>();
+    private _name = new Map<RepresentationProvider<D, any, any>, string>();
 
     get default() { return this._list[0]; }
     get types(): [string, string][] { return getTypes(this._list); }
diff --git a/src/mol-repr/structure/visual/util/polymer/gap-iterator.ts b/src/mol-repr/structure/visual/util/polymer/gap-iterator.ts
index 8f12043739bf7d631093fe94aa42710f992577f4..30fb33322d465381da22d3e2f64db430fec6358f 100644
--- a/src/mol-repr/structure/visual/util/polymer/gap-iterator.ts
+++ b/src/mol-repr/structure/visual/util/polymer/gap-iterator.ts
@@ -32,9 +32,9 @@ function createPolymerGapPair(structure: Structure, unit: Unit) {
 }
 
 export class AtomicPolymerGapIterator implements Iterator<PolymerGapPair> {
-    private traceElementIndex: ArrayLike<ElementIndex>
-    private value: PolymerGapPair
-    private gapIt: SortedRanges.Iterator<ElementIndex, ResidueIndex>
+    private traceElementIndex: ArrayLike<ElementIndex>;
+    private value: PolymerGapPair;
+    private gapIt: SortedRanges.Iterator<ElementIndex, ResidueIndex>;
     hasNext: boolean = false;
 
     move() {
@@ -55,8 +55,8 @@ export class AtomicPolymerGapIterator implements Iterator<PolymerGapPair> {
 }
 
 export class CoarsePolymerGapIterator implements Iterator<PolymerGapPair> {
-    private value: PolymerGapPair
-    private gapIt: SortedRanges.Iterator<ElementIndex, ElementIndex>
+    private value: PolymerGapPair;
+    private gapIt: SortedRanges.Iterator<ElementIndex, ElementIndex>;
     hasNext: boolean = false;
 
     move() {
diff --git a/src/mol-repr/structure/visual/util/polymer/trace-iterator.ts b/src/mol-repr/structure/visual/util/polymer/trace-iterator.ts
index e191b3c0151c44890d3abc78d4508817aaaa0738..0ee88dddeb5f4e7514b99cb841d39673e2caa117 100644
--- a/src/mol-repr/structure/visual/util/polymer/trace-iterator.ts
+++ b/src/mol-repr/structure/visual/util/polymer/trace-iterator.ts
@@ -87,42 +87,42 @@ const tmpVecA = Vec3();
 const tmpVecB = Vec3();
 
 export class AtomicPolymerTraceIterator implements Iterator<PolymerTraceElement> {
-    private value: PolymerTraceElement
-    private polymerIt: SortedRanges.Iterator<ElementIndex, number>
-    private residueIt: Segmentation.SegmentIterator<ResidueIndex>
-    private polymerSegment: Segmentation.Segment<number>
-    private cyclicPolymerMap: Map<ResidueIndex, ResidueIndex>
-    private residueSegmentMin: ResidueIndex
-    private residueSegmentMax: ResidueIndex
-    private prevSecStrucType: SecondaryStructureType
-    private currSecStrucType: SecondaryStructureType
-    private nextSecStrucType: SecondaryStructureType
-    private prevCoarseBackbone: boolean
-    private currCoarseBackbone: boolean
-    private nextCoarseBackbone: boolean
-    private state: AtomicPolymerTraceIteratorState = AtomicPolymerTraceIteratorState.nextPolymer
-    private polymerRanges: SortedArray<ElementIndex>
-    private residueAtomSegments: Segmentation<ElementIndex, ResidueIndex>
-    private traceElementIndex: ArrayLike<ElementIndex>
-    private directionFromElementIndex: ArrayLike<ElementIndex | -1>
-    private directionToElementIndex: ArrayLike<ElementIndex | -1>
-    private moleculeType: ArrayLike<MoleculeType>
-    private atomicConformation: AtomicConformation
-    private secondaryStructure: SecondaryStructure | undefined
-    private helixOrientationCenters: ArrayLike<number> | undefined
-
-    private p0 = Vec3()
-    private p1 = Vec3()
-    private p2 = Vec3()
-    private p3 = Vec3()
-    private p4 = Vec3()
-    private p5 = Vec3()
-    private p6 = Vec3()
-
-    private d01 = Vec3()
-    private d12 = Vec3()
-    private d23 = Vec3()
-    private d34 = Vec3()
+    private value: PolymerTraceElement;
+    private polymerIt: SortedRanges.Iterator<ElementIndex, number>;
+    private residueIt: Segmentation.SegmentIterator<ResidueIndex>;
+    private polymerSegment: Segmentation.Segment<number>;
+    private cyclicPolymerMap: Map<ResidueIndex, ResidueIndex>;
+    private residueSegmentMin: ResidueIndex;
+    private residueSegmentMax: ResidueIndex;
+    private prevSecStrucType: SecondaryStructureType;
+    private currSecStrucType: SecondaryStructureType;
+    private nextSecStrucType: SecondaryStructureType;
+    private prevCoarseBackbone: boolean;
+    private currCoarseBackbone: boolean;
+    private nextCoarseBackbone: boolean;
+    private state: AtomicPolymerTraceIteratorState = AtomicPolymerTraceIteratorState.nextPolymer;
+    private polymerRanges: SortedArray<ElementIndex>;
+    private residueAtomSegments: Segmentation<ElementIndex, ResidueIndex>;
+    private traceElementIndex: ArrayLike<ElementIndex>;
+    private directionFromElementIndex: ArrayLike<ElementIndex | -1>;
+    private directionToElementIndex: ArrayLike<ElementIndex | -1>;
+    private moleculeType: ArrayLike<MoleculeType>;
+    private atomicConformation: AtomicConformation;
+    private secondaryStructure: SecondaryStructure | undefined;
+    private helixOrientationCenters: ArrayLike<number> | undefined;
+
+    private p0 = Vec3();
+    private p1 = Vec3();
+    private p2 = Vec3();
+    private p3 = Vec3();
+    private p4 = Vec3();
+    private p5 = Vec3();
+    private p6 = Vec3();
+
+    private d01 = Vec3();
+    private d12 = Vec3();
+    private d23 = Vec3();
+    private d34 = Vec3();
 
     hasNext: boolean = false;
 
@@ -428,12 +428,12 @@ export class AtomicPolymerTraceIterator implements Iterator<PolymerTraceElement>
 const enum CoarsePolymerTraceIteratorState { nextPolymer, nextElement }
 
 export class CoarsePolymerTraceIterator implements Iterator<PolymerTraceElement> {
-    private value: PolymerTraceElement
-    private polymerIt: SortedRanges.Iterator<ElementIndex, ResidueIndex>
-    private polymerSegment: Segmentation.Segment<ResidueIndex>
-    private state: CoarsePolymerTraceIteratorState = CoarsePolymerTraceIteratorState.nextPolymer
-    private conformation: CoarseSphereConformation | CoarseGaussianConformation
-    private elementIndex: number
+    private value: PolymerTraceElement;
+    private polymerIt: SortedRanges.Iterator<ElementIndex, ResidueIndex>;
+    private polymerSegment: Segmentation.Segment<ResidueIndex>;
+    private state: CoarsePolymerTraceIteratorState = CoarsePolymerTraceIteratorState.nextPolymer;
+    private conformation: CoarseSphereConformation | CoarseGaussianConformation;
+    private elementIndex: number;
     hasNext: boolean = false;
 
     private getElementIndex(elementIndex: number) {
diff --git a/src/mol-state/action/manager.ts b/src/mol-state/action/manager.ts
index 922e6195a098c9641e862ecfe170aff371de75d7..4182c329bcfc2965e6f5c090006ccfd34c295226 100644
--- a/src/mol-state/action/manager.ts
+++ b/src/mol-state/action/manager.ts
@@ -21,7 +21,7 @@ class StateActionManager {
     readonly events = {
         added: this.ev<undefined>(),
         removed: this.ev<undefined>(),
-    }
+    };
 
     add(actionOrTransformer: StateAction | StateTransformer) {
         const action = StateTransformer.is(actionOrTransformer) ? actionOrTransformer.toAction() : actionOrTransformer;
diff --git a/src/mol-state/state.ts b/src/mol-state/state.ts
index e5e7f3511b4754c6bb11d5668669b1a4b0fc23fd..1602278c840eb9b0e07c5f901e3d6dc644cb9a91 100644
--- a/src/mol-state/state.ts
+++ b/src/mol-state/state.ts
@@ -73,7 +73,7 @@ class State {
         const ret = this.cells.get(ref)?.obj?.data;
         if (!ref) throw new Error(`Cell '${ref}' data undefined.`);
         return ret as T;
-    }
+    };
 
     private historyCapacity = 5;
     private history: [StateTree, string][] = [];
diff --git a/src/mol-theme/theme.ts b/src/mol-theme/theme.ts
index 2bd1543cdda981926c974bbacda80cc5340ee406..d5e07a88a34fbb53211b1f5c46cd7a89f8dc2426 100644
--- a/src/mol-theme/theme.ts
+++ b/src/mol-theme/theme.ts
@@ -84,9 +84,9 @@ function getTypes(list: { name: string, provider: ThemeProvider<any, any> }[]) {
 }
 
 export class ThemeRegistry<T extends ColorTheme<any> | SizeTheme<any>> {
-    private _list: { name: string, provider: ThemeProvider<T, any> }[] = []
-    private _map = new Map<string, ThemeProvider<T, any>>()
-    private _name = new Map<ThemeProvider<T, any>, string>()
+    private _list: { name: string, provider: ThemeProvider<T, any> }[] = [];
+    private _map = new Map<string, ThemeProvider<T, any>>();
+    private _name = new Map<ThemeProvider<T, any>, string>();
 
     get default() { return this._list[0]; }
     get list() { return this._list; }
diff --git a/src/mol-util/graphql-client.ts b/src/mol-util/graphql-client.ts
index b4b8514045f11bc2fbe11f29714b6b968bf2d529..7ca692d9542e5cbbd83a34ce9bf461e0dcdbf72d 100644
--- a/src/mol-util/graphql-client.ts
+++ b/src/mol-util/graphql-client.ts
@@ -31,8 +31,8 @@ interface GraphQLRequestContext {
 }
 
 export class ClientError extends Error {
-    response: GraphQLResponse
-    request: GraphQLRequestContext
+    response: GraphQLResponse;
+    request: GraphQLRequestContext;
 
     constructor(response: GraphQLResponse, request: GraphQLRequestContext) {
         const message = `${ClientError.extractMessage(response)}: ${JSON.stringify({ response, request })}`;
diff --git a/src/mol-util/mask.ts b/src/mol-util/mask.ts
index e35b68d86577b31da7b750722723f74a15a16eeb..6ea25eec6f6d3770c573c91c128ef23eecfb656b 100644
--- a/src/mol-util/mask.ts
+++ b/src/mol-util/mask.ts
@@ -26,7 +26,7 @@ interface Mask {
 
 namespace Mask {
     class EmptyMask implements Mask {
-        '@type': 'mask'
+        '@type': 'mask';
         size = 0;
         has(i: number) { return false; }
         forEach<Ctx>(f: (i: number, ctx?: Ctx) => void, ctx: Ctx) { return ctx; }
@@ -34,7 +34,7 @@ namespace Mask {
     }
 
     class SingletonMask implements Mask {
-        '@type': 'mask'
+        '@type': 'mask';
         size = 1;
         has(i: number) { return i === this.idx; }
         forEach<Ctx>(f: (i: number, ctx?: Ctx) => void, ctx?: Ctx) { f(this.idx, ctx); return ctx; }
@@ -42,7 +42,7 @@ namespace Mask {
     }
 
     class BitMask implements Mask {
-        '@type': 'mask'
+        '@type': 'mask';
         private length: number;
         has(i: number) { return i < this.length && !!this.mask[i] as any; }
 
@@ -59,7 +59,7 @@ namespace Mask {
     }
 
     class AllMask implements Mask {
-        '@type': 'mask'
+        '@type': 'mask';
         has(i: number) { return true; }
         private _forEach<Ctx>(f: (i: number, ctx?: Ctx) => void, ctx: Ctx | undefined) {
             for (let i = 0; i < this.size; i++) {
@@ -74,7 +74,7 @@ namespace Mask {
     }
 
     class SetMask implements Mask {
-        '@type': 'mask'
+        '@type': 'mask';
         private _flat: number[] | undefined = void 0;
         size: number;
         has(i: number) { return this.set.has(i); }