diff --git a/src/features/quote/Quote.jsx b/src/features/quote/Quote.jsx
index 1b6df024..ef705339 100644
--- a/src/features/quote/Quote.jsx
+++ b/src/features/quote/Quote.jsx
@@ -154,7 +154,7 @@ class Quote extends PureComponent {
const metadata = authorImagePage?.imageinfo?.[0]?.extmetadata;
const license = metadata?.LicenseShortName;
const photographer =
- this.stripHTML(metadata.Attribution?.value || metadata.Artist?.value || '').replace(/ \(talk\)/, '') || // talk page link (if applicable) is only removed for English
+ this.stripHTML(metadata?.Attribution?.value || metadata?.Artist?.value || '').replace(/ \(talk\)/, '') || // talk page link (if applicable) is only removed for English
'Unknown';
authorimglicense = `© ${photographer}. ${license.value}`;
authorimglicense = authorimglicense.replace(/copyright\s/i, '').replace(/©\s©\s/, '© ');
@@ -462,8 +462,8 @@ class Quote extends PureComponent {
) : (
{/* these are placeholders for skeleton and as such don't need translating */}
- loading
- loading
+ loading
+ loading
)}
{(this.state.authorOccupation !== 'Unknown' && this.state.authorlink !== null) ||
diff --git a/src/features/weather/Weather.jsx b/src/features/weather/Weather.jsx
index 4417bea5..7cc7f4d6 100644
--- a/src/features/weather/Weather.jsx
+++ b/src/features/weather/Weather.jsx
@@ -3,6 +3,8 @@ import { PureComponent } from 'react';
import WeatherIcon from './components/WeatherIcon';
import Expanded from './components/Expanded';
+import WeatherSkeleton from './components/WeatherSkeleton';
+
import EventBus from 'utils/eventbus';
@@ -42,12 +44,13 @@ class WeatherWidget extends PureComponent {
}
render() {
- if (this.state.done === false) {
- return
;
- }
const weatherType = localStorage.getItem('weatherType') || 1;
+ if (this.state.done === false) {
+ return
diff --git a/src/features/weather/components/WeatherSkeleton.jsx b/src/features/weather/components/WeatherSkeleton.jsx
new file mode 100644
index 00000000..713eeac9
--- /dev/null
+++ b/src/features/weather/components/WeatherSkeleton.jsx
@@ -0,0 +1,49 @@
+import { memo } from 'react';
+
+function WeatherSkeleton({ weatherType }) {
+ return (
+
+
+
+
+ {weatherType >= 2 && (
+
+ min
+ max
+
+ )}
+
+ {weatherType >= 2 && (
+
+ feels like x
+ location
+
+ )}
+
+ {weatherType >= 3 && (
+
+ )}
+
+ );
+}
+
+export default memo(WeatherSkeleton);
\ No newline at end of file
diff --git a/src/features/weather/weather.scss b/src/features/weather/weather.scss
index bbb5b06f..6816c662 100644
--- a/src/features/weather/weather.scss
+++ b/src/features/weather/weather.scss
@@ -135,3 +135,63 @@
}
}
}
+
+.weather.skeleton {
+ .iconAndTemps {
+ gap: 10px;
+ }
+
+ .weatherCore {
+ gap: 10px;
+ }
+
+ .weathericon {
+ gap: 10px;
+ }
+
+ .minmax {
+ max-width: fit-content;
+ background: transparent !important;
+ .subtitle {
+ margin-bottom: 5px;
+ }
+ }
+
+ .weatherExpandedInfoItems {
+ padding-top: 10px;
+ }
+
+ .mainSkeletonIcon {
+ width: 70px;
+ height: 70px;
+ border-radius: 100%;
+ }
+
+ .infoItemSkeleton {
+ display: flex;
+ flex-flow: row;
+ gap: 5px;
+ align-items: center;
+
+ .subtitle {
+ font-size: 18px;
+ }
+ }
+
+ .smallSkeletonIcon {
+ width: 20px;
+ height: 20px;
+ border-radius: 100%;
+ }
+
+ .title,
+ span {
+ color: transparent;
+ width: 100px;
+ }
+
+ .subtitle {
+ color: transparent;
+ width: 50px;
+ }
+}
diff --git a/src/i18n/locales/en_GB.json b/src/i18n/locales/en_GB.json
index 97e9013d..7a9107ff 100644
--- a/src/i18n/locales/en_GB.json
+++ b/src/i18n/locales/en_GB.json
@@ -530,6 +530,8 @@
"information": "Information",
"last_updated": "Last Updated",
"description": "Description",
+ "details": "Details",
+ "more_from_curator": "More from {name}",
"show_more": "Show More",
"show_less": "Show Less",
"show_all": "Show All",
@@ -537,7 +539,7 @@
"no_images": "No. Images",
"no_quotes": "No. Quotes",
"version": "Version",
- "author": "Author",
+ "created_by": "Created by",
"part_of": "Part of",
"explore": "Explore",
"buttons": {
diff --git a/src/scss/index.scss b/src/scss/index.scss
index d91fe64b..fc5fc879 100644
--- a/src/scss/index.scss
+++ b/src/scss/index.scss
@@ -202,3 +202,42 @@ body {
}
}
}
+
+
+
+// credit to Kendrick Arnett https://codepen.io/kendrick/pen/WxNwdE
+.light {
+ .pulse {
+ height: 100%;
+ width: 100%;
+ background: linear-gradient(-90deg, #efefef 0%, #cccccc 50%, #efefef 100%);
+ background-size: 400% 400%;
+ animation: pulse 1.2s ease-in-out infinite;
+ @keyframes pulse {
+ 0% {
+ background-position: 0% 0%;
+ }
+ 100% {
+ background-position: -135% 0%;
+ }
+ }
+ }
+}
+
+.dark {
+ .pulse {
+ height: 100%;
+ width: 100%;
+ background: linear-gradient(-90deg, #000000 0%, rgb(83, 83, 83) 50%, #000000 100%);
+ background-size: 400% 400%;
+ animation: pulse 1.2s ease-in-out infinite;
+ @keyframes pulse {
+ 0% {
+ background-position: 0% 0%;
+ }
+ 100% {
+ background-position: -135% 0%;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/vite.config.mjs b/vite.config.mjs
index 9671cbc0..054cbdf8 100644
--- a/vite.config.mjs
+++ b/vite.config.mjs
@@ -129,6 +129,7 @@ export default defineConfig(({ command, mode }) => {
'@': path.resolve(__dirname, './src'),
i18n: path.resolve(__dirname, './src/i18n'),
components: path.resolve(__dirname, './src/components'),
+ assets: path.resolve(__dirname, './src/assets'),
config: path.resolve(__dirname, './src/config'),
features: path.resolve(__dirname, './src/features'),
lib: path.resolve(__dirname, './src/lib'),