diff --git a/src/renderer/components/ft-intersection-observer/ft-intersection-observer.js b/src/renderer/components/ft-intersection-observer/ft-intersection-observer.js
new file mode 100644
index 00000000..80183c66
--- /dev/null
+++ b/src/renderer/components/ft-intersection-observer/ft-intersection-observer.js
@@ -0,0 +1,54 @@
+import Vue from 'vue'
+
+export default Vue.extend({
+  name: 'FtIntersectionObserver',
+  props: {
+    checkOnMount: {
+      type: Boolean,
+      default: false
+    },
+    margin: {
+      type: String,
+      default: '0px 0px 0px 0px'
+    },
+    observeParent: {
+      type: Boolean,
+      default: false
+    },
+    threshold: {
+      type: Number,
+      default: 1
+    }
+  },
+  data() {
+    const observer = new IntersectionObserver(this.handleIntersection, {
+      rootMargin: this.margin,
+      threshold: this.threshold
+    })
+    const runOnce = false
+
+    return {
+      observer,
+      runOnce
+    }
+  },
+  mounted() {
+    this.observer.observe(this.observeParent ? this.$refs.elem.parentElement : this.$refs.elem)
+  },
+  beforeDestroy() {
+    this.observer.disconnect()
+  },
+  methods: {
+    handleIntersection(entries) {
+      if (!this.runOnce) {
+        this.runOnce = true
+
+        if (!this.checkOnMount) {
+          return
+        }
+      }
+
+      this.$emit(entries[0].isIntersecting ? 'intersected' : 'unintersected')
+    }
+  }
+})
diff --git a/src/renderer/components/ft-intersection-observer/ft-intersection-observer.vue b/src/renderer/components/ft-intersection-observer/ft-intersection-observer.vue
new file mode 100644
index 00000000..bb02f5a0
--- /dev/null
+++ b/src/renderer/components/ft-intersection-observer/ft-intersection-observer.vue
@@ -0,0 +1,5 @@
+
+  
+
+
+