diff --git a/package.json b/package.json
index deb384c14d..21deea51d9 100644
--- a/package.json
+++ b/package.json
@@ -213,6 +213,7 @@
"vue": "2.5.17",
"vue-chartjs": "3.4.0",
"vue-color": "2.7.0",
+ "vue-content-loading": "1.5.3",
"vue-cropperjs": "2.2.2",
"vue-js-modal": "1.3.26",
"vue-json-tree-view": "2.1.4",
diff --git a/src/client/app/common/views/components/index.ts b/src/client/app/common/views/components/index.ts
index 0dea38a7a1..e2b9089d35 100644
--- a/src/client/app/common/views/components/index.ts
+++ b/src/client/app/common/views/components/index.ts
@@ -1,5 +1,6 @@
import Vue from 'vue';
+import noteSkeleton from './note-skeleton.vue';
import theme from './theme.vue';
import instance from './instance.vue';
import cwButton from './cw-button.vue';
@@ -44,6 +45,7 @@ import uiSelect from './ui/select.vue';
import formButton from './ui/form/button.vue';
import formRadio from './ui/form/radio.vue';
+Vue.component('mk-note-skeleton', noteSkeleton);
Vue.component('mk-theme', theme);
Vue.component('mk-instance', instance);
Vue.component('mk-cw-button', cwButton);
diff --git a/src/client/app/common/views/components/note-skeleton.vue b/src/client/app/common/views/components/note-skeleton.vue
new file mode 100644
index 0000000000..a2e09e3222
--- /dev/null
+++ b/src/client/app/common/views/components/note-skeleton.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/client/app/desktop/views/components/ellipsis-icon.vue b/src/client/app/desktop/views/components/ellipsis-icon.vue
deleted file mode 100644
index 4a5a0f23dc..0000000000
--- a/src/client/app/desktop/views/components/ellipsis-icon.vue
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
diff --git a/src/client/app/desktop/views/components/index.ts b/src/client/app/desktop/views/components/index.ts
index 7b7a38afa2..38b1547448 100644
--- a/src/client/app/desktop/views/components/index.ts
+++ b/src/client/app/desktop/views/components/index.ts
@@ -9,7 +9,6 @@ import subNoteContent from './sub-note-content.vue';
import window from './window.vue';
import noteFormWindow from './post-form-window.vue';
import renoteFormWindow from './renote-form-window.vue';
-import ellipsisIcon from './ellipsis-icon.vue';
import mediaImage from './media-image.vue';
import mediaImageDialog from './media-image-dialog.vue';
import mediaVideo from './media-video.vue';
@@ -39,7 +38,6 @@ Vue.component('mk-sub-note-content', subNoteContent);
Vue.component('mk-window', window);
Vue.component('mk-post-form-window', noteFormWindow);
Vue.component('mk-renote-form-window', renoteFormWindow);
-Vue.component('mk-ellipsis-icon', ellipsisIcon);
Vue.component('mk-media-image', mediaImage);
Vue.component('mk-media-image-dialog', mediaImageDialog);
Vue.component('mk-media-video', mediaVideo);
diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue
index 84b13ed84e..b43720d19b 100644
--- a/src/client/app/desktop/views/components/notes.vue
+++ b/src/client/app/desktop/views/components/notes.vue
@@ -9,6 +9,12 @@
+
+
+
+
+
+
@@ -226,6 +232,10 @@ export default Vue.extend({
> *
transition transform .3s ease, opacity .3s ease
+ > .skeleton
+ padding 32px
+ opacity 0.3
+
> .notes
> .date
display block
diff --git a/src/client/app/desktop/views/components/notifications.vue b/src/client/app/desktop/views/components/notifications.vue
index a572f43adc..361ca5f1c8 100644
--- a/src/client/app/desktop/views/components/notifications.vue
+++ b/src/client/app/desktop/views/components/notifications.vue
@@ -1,5 +1,11 @@
+
+
+
+
+
+
@@ -102,7 +108,6 @@
%fa:spinner .pulse .fw%{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }}
%i18n:@empty%
- %fa:spinner .pulse .fw%%i18n:common.loading%
@@ -202,6 +207,10 @@ export default Vue.extend({
> *
transition transform .3s ease, opacity .3s ease
+ > .skeleton
+ padding 16px
+ opacity 0.3
+
> .notifications
> div
> .notification
@@ -319,13 +328,4 @@ export default Vue.extend({
text-align center
color #aaa
- > .loading
- margin 0
- padding 16px
- text-align center
- color #aaa
-
- > [data-fa]
- margin-right 4px
-
diff --git a/src/client/app/desktop/views/components/timeline.core.vue b/src/client/app/desktop/views/components/timeline.core.vue
index 2c17e936eb..f1af7116b2 100644
--- a/src/client/app/desktop/views/components/timeline.core.vue
+++ b/src/client/app/desktop/views/components/timeline.core.vue
@@ -1,9 +1,6 @@
-
-
-
@@ -170,15 +167,10 @@ export default Vue.extend({