mirror of
https://github.com/cheeaun/phanpy.git
synced 2024-12-18 07:21:56 +03:00
Experimental theme-color change when viewing media
This commit is contained in:
parent
7135ec905f
commit
5394584647
2 changed files with 66 additions and 13 deletions
|
@ -14,6 +14,7 @@ import { oklab2rgb, rgb2oklab } from '../utils/color-utils';
|
||||||
import isRTL from '../utils/is-rtl';
|
import isRTL from '../utils/is-rtl';
|
||||||
import showToast from '../utils/show-toast';
|
import showToast from '../utils/show-toast';
|
||||||
import states from '../utils/states';
|
import states from '../utils/states';
|
||||||
|
import store from '../utils/store';
|
||||||
|
|
||||||
import Icon from './icon';
|
import Icon from './icon';
|
||||||
import Link from './link';
|
import Link from './link';
|
||||||
|
@ -115,17 +116,24 @@ function MediaModal({
|
||||||
return () => clearTimeout(timer);
|
return () => clearTimeout(timer);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const mediaAccentColors = useMemo(() => {
|
const mediaOklabColors = useMemo(() => {
|
||||||
return mediaAttachments?.map((media) => {
|
return mediaAttachments?.map((media) => {
|
||||||
const { blurhash } = media;
|
const { blurhash } = media;
|
||||||
if (blurhash) {
|
if (blurhash) {
|
||||||
const averageColor = getBlurHashAverageColor(blurhash);
|
const averageColor = getBlurHashAverageColor(blurhash);
|
||||||
const labAverageColor = rgb2oklab(averageColor);
|
return rgb2oklab(averageColor);
|
||||||
return oklab2rgb([0.6, labAverageColor[1], labAverageColor[2]]);
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
}, [mediaAttachments]);
|
}, [mediaAttachments]);
|
||||||
|
const mediaAccentColors = useMemo(() => {
|
||||||
|
return mediaOklabColors?.map((labAverageColor) => {
|
||||||
|
if (labAverageColor) {
|
||||||
|
return oklab2rgb([0.6, labAverageColor[1], labAverageColor[2]]);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}, [mediaOklabColors]);
|
||||||
const mediaAccentGradient = useMemo(() => {
|
const mediaAccentGradient = useMemo(() => {
|
||||||
const gap = 5;
|
const gap = 5;
|
||||||
const range = 100 / mediaAccentColors.length;
|
const range = 100 / mediaAccentColors.length;
|
||||||
|
@ -157,6 +165,51 @@ function MediaModal({
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
useLayoutEffect(() => {
|
||||||
|
const currentColor = mediaOklabColors[currentIndex];
|
||||||
|
let $meta;
|
||||||
|
let metaColor;
|
||||||
|
if (currentColor) {
|
||||||
|
const mediaColor = {
|
||||||
|
light: `rgb(${oklab2rgb([0.81, currentColor[1], currentColor[2]]).join(
|
||||||
|
',',
|
||||||
|
)})`,
|
||||||
|
dark: `rgb(${oklab2rgb([0.35, currentColor[1], currentColor[2]]).join(
|
||||||
|
',',
|
||||||
|
)})`,
|
||||||
|
};
|
||||||
|
|
||||||
|
const theme = store.local.get('theme');
|
||||||
|
if (theme) {
|
||||||
|
$meta = document.querySelector(
|
||||||
|
`meta[name="theme-color"][data-theme-setting="manual"]`,
|
||||||
|
);
|
||||||
|
if ($meta) {
|
||||||
|
metaColor = $meta.content;
|
||||||
|
$meta.content = mediaColor[theme];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const colorScheme = window.matchMedia('(prefers-color-scheme: dark)')
|
||||||
|
.matches
|
||||||
|
? 'dark'
|
||||||
|
: 'light';
|
||||||
|
$meta = document.querySelector(
|
||||||
|
`meta[name="theme-color"][media*="${colorScheme}"]`,
|
||||||
|
);
|
||||||
|
if ($meta) {
|
||||||
|
metaColor = $meta.content;
|
||||||
|
$meta.content = mediaColor[colorScheme];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return () => {
|
||||||
|
// Reset meta color
|
||||||
|
if ($meta && metaColor) {
|
||||||
|
$meta.content = metaColor;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}, [currentIndex, mediaAccentColors]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
class={`media-modal-container media-modal-count-${mediaAttachments?.length}`}
|
class={`media-modal-container media-modal-count-${mediaAttachments?.length}`}
|
||||||
|
|
20
src/locales/en.po
generated
20
src/locales/en.po
generated
|
@ -106,7 +106,7 @@ msgstr ""
|
||||||
#: src/components/account-info.jsx:1118
|
#: src/components/account-info.jsx:1118
|
||||||
#: src/components/compose.jsx:2488
|
#: src/components/compose.jsx:2488
|
||||||
#: src/components/media-alt-modal.jsx:45
|
#: src/components/media-alt-modal.jsx:45
|
||||||
#: src/components/media-modal.jsx:283
|
#: src/components/media-modal.jsx:336
|
||||||
#: src/components/status.jsx:1721
|
#: src/components/status.jsx:1721
|
||||||
#: src/components/status.jsx:1738
|
#: src/components/status.jsx:1738
|
||||||
#: src/components/status.jsx:1862
|
#: src/components/status.jsx:1862
|
||||||
|
@ -410,7 +410,7 @@ msgstr ""
|
||||||
#: src/components/keyboard-shortcuts-help.jsx:39
|
#: src/components/keyboard-shortcuts-help.jsx:39
|
||||||
#: src/components/list-add-edit.jsx:33
|
#: src/components/list-add-edit.jsx:33
|
||||||
#: src/components/media-alt-modal.jsx:33
|
#: src/components/media-alt-modal.jsx:33
|
||||||
#: src/components/media-modal.jsx:247
|
#: src/components/media-modal.jsx:300
|
||||||
#: src/components/notification-service.jsx:156
|
#: src/components/notification-service.jsx:156
|
||||||
#: src/components/report-modal.jsx:75
|
#: src/components/report-modal.jsx:75
|
||||||
#: src/components/shortcuts-settings.jsx:230
|
#: src/components/shortcuts-settings.jsx:230
|
||||||
|
@ -858,13 +858,13 @@ msgid "Type to search GIFs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/compose.jsx:3491
|
#: src/components/compose.jsx:3491
|
||||||
#: src/components/media-modal.jsx:387
|
#: src/components/media-modal.jsx:440
|
||||||
#: src/components/timeline.jsx:889
|
#: src/components/timeline.jsx:889
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/compose.jsx:3509
|
#: src/components/compose.jsx:3509
|
||||||
#: src/components/media-modal.jsx:406
|
#: src/components/media-modal.jsx:459
|
||||||
#: src/components/timeline.jsx:906
|
#: src/components/timeline.jsx:906
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1185,27 +1185,27 @@ msgstr ""
|
||||||
msgid "Speak"
|
msgid "Speak"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/media-modal.jsx:294
|
#: src/components/media-modal.jsx:347
|
||||||
msgid "Open original media in new window"
|
msgid "Open original media in new window"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/media-modal.jsx:298
|
#: src/components/media-modal.jsx:351
|
||||||
msgid "Open original media"
|
msgid "Open original media"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/media-modal.jsx:314
|
#: src/components/media-modal.jsx:367
|
||||||
msgid "Attempting to describe image. Please wait…"
|
msgid "Attempting to describe image. Please wait…"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/media-modal.jsx:329
|
#: src/components/media-modal.jsx:382
|
||||||
msgid "Failed to describe image"
|
msgid "Failed to describe image"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/media-modal.jsx:339
|
#: src/components/media-modal.jsx:392
|
||||||
msgid "Describe image…"
|
msgid "Describe image…"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/media-modal.jsx:362
|
#: src/components/media-modal.jsx:415
|
||||||
msgid "View post"
|
msgid "View post"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue