diff --git a/common/app/components/SK-Wave.jsx b/common/app/components/SK-Wave.jsx
deleted file mode 100644
index 8f8080a0fb..0000000000
--- a/common/app/components/SK-Wave.jsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import React, { PureComponent } from 'react';
-
-const propTypes = {
-};
-export default class SKWave extends PureComponent {
- render() {
- return (
-
- );
- }
-}
-SKWave.displayName = 'SKWave';
-SKWave.propTypes = propTypes;
diff --git a/common/app/routes/index.less b/common/app/routes/index.less
index 5fb84826d4..af0f7d4506 100644
--- a/common/app/routes/index.less
+++ b/common/app/routes/index.less
@@ -1 +1,2 @@
&{ @import "./challenges/challenges.less"; }
+&{ @import "./settings/settings.less"; }
\ No newline at end of file
diff --git a/common/app/routes/settings/components/Settings.jsx b/common/app/routes/settings/components/Settings.jsx
index a0fc73eea6..ed257f252c 100644
--- a/common/app/routes/settings/components/Settings.jsx
+++ b/common/app/routes/settings/components/Settings.jsx
@@ -9,7 +9,7 @@ import LockedSettings from './Locked-Settings.jsx';
import SocialSettings from './Social-Settings.jsx';
import EmailSettings from './Email-Setting.jsx';
import LanguageSettings from './Language-Settings.jsx';
-import SKWave from '../../../components/SK-Wave.jsx';
+import SettingsSkeleton from './SettingsSkeleton.jsx';
import { toggleUserFlag } from '../redux/actions.js';
@@ -115,7 +115,7 @@ export class Settings extends React.Component {
toggleNotificationEmail
} = this.props;
if (!username && !showLoading) {
- return ;
+ return ;
}
if (children) {
return (
diff --git a/common/app/routes/settings/components/SettingsSkeleton.jsx b/common/app/routes/settings/components/SettingsSkeleton.jsx
new file mode 100644
index 0000000000..3224f16f93
--- /dev/null
+++ b/common/app/routes/settings/components/SettingsSkeleton.jsx
@@ -0,0 +1,99 @@
+import React from 'react';
+import { Button, Row, Col } from 'react-bootstrap';
+
+import ns from '../ns.json';
+
+// actual chars required to give buttons some height
+// whitespace alone is no good
+const placeholderString = (
+
+ placeholder text of 28 chars
+
+);
+const shortString = (
+
+ placeholder
+
+);
+
+
+export default function SettingsSkeleton() {
+ return (
+
+
+
+
+
+
+
+
+
{ placeholderString }
+
{ shortString }
+
+
+
+
+
+
+
+
+
+
{ placeholderString }
+
+
+
+
+
+
+
{ placeholderString }
+
+ );
+}
diff --git a/common/app/routes/settings/ns.json b/common/app/routes/settings/ns.json
new file mode 100644
index 0000000000..1beea17991
--- /dev/null
+++ b/common/app/routes/settings/ns.json
@@ -0,0 +1 @@
+"settings"
diff --git a/common/app/routes/settings/settings.less b/common/app/routes/settings/settings.less
new file mode 100644
index 0000000000..7be26e4713
--- /dev/null
+++ b/common/app/routes/settings/settings.less
@@ -0,0 +1,37 @@
+// should be the same as the filename and ./ns.json
+@ns: settings;
+
+@skeleton-gray: #b0bdb7;
+
+@keyframes pulsingOverlay {
+ 0% {
+ opacity: 0.5;
+ }
+ 50% {
+ opacity: 0.8;
+ }
+ 100% {
+ opacity: 0.5;
+ }
+}
+
+.@{ns}-skeleton {
+ background-color: #fff;
+ z-index: 10;
+ animation-name: pulsingOverlay;
+ animation-duration: 2.5s;
+ animation-timing-function: linear;
+ animation-iteration-count: infinite;
+ animation-direction: normal;
+
+ .placeholder-string {
+ background-color: @skeleton-gray;
+ box-shadow: 0px 0px 12px 6px @skeleton-gray;
+ color: @skeleton-gray;
+ }
+ .btn-link-social {
+ background-color: @skeleton-gray;
+ border-color: @skeleton-gray;
+ box-shadow: 0px 0px 12px 6px @skeleton-gray;
+ }
+}