diff --git a/core/client.js b/core/client.js
index 78dfd4de..602bd3b7 100644
--- a/core/client.js
+++ b/core/client.js
@@ -149,12 +149,14 @@ class TfFilesElement extends LitElement {
 		return {
 			current: {type: String},
 			files: {type: Object},
+			dropping: {type: Number},
 		};
 	}
 
 	constructor() {
 		super();
 		this.files = {};
+		this.dropping = 0;
 	}
 
 	file_click(file) {
@@ -178,6 +180,36 @@ class TfFilesElement extends LitElement {
 		return html`
 this.file_click(file)}>${file}
`;
 	}
 
+	async drop(event) {
+		event.preventDefault();
+		event.stopPropagation();
+		this.dropping = 0;
+		for (let file of event.dataTransfer.files) {
+			let text = '';
+			try {
+				text = await file.text();
+			} catch {
+				text = new TextDecoder('latin1').decode(await file.arrayBuffer());
+			}
+			gFiles[file.name] = {
+				doc: new CodeMirror.Doc(text, guessMode(file.name)),
+				generation: -1,
+			};
+			gCurrentFile = file.name;
+		}
+		openFile(gCurrentFile);
+		updateFiles();
+	}
+
+	drag_enter(event) {
+		this.dropping++;
+		event.preventDefault();
+	}
+
+	drag_leave(event) {
+		this.dropping--;
+	}
+
 	render() {
 		let self = this;
 		return html`
@@ -202,9 +234,15 @@ class TfFilesElement extends LitElement {
 					content: '*';
 				}
 			
-			
+			
 				${Object.keys(this.files).sort().map(x => self.render_file(x))}
 			
+			
+				Drop File(s)
+			
 		`;
 	}
 }
@@ -992,7 +1030,6 @@ function updateFiles() {
 		}]));
 		files.current = gCurrentFile;
 	}
-
 	gEditor.focus();
 }