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 @@
+
+
+
+
+