diff --git a/packages/pl-fe/src/features/preferences/index.tsx b/packages/pl-fe/src/features/preferences/index.tsx index af53577c8..82377f824 100644 --- a/packages/pl-fe/src/features/preferences/index.tsx +++ b/packages/pl-fe/src/features/preferences/index.tsx @@ -107,6 +107,8 @@ const messages = defineMessages({ content_type_html: { id: 'preferences.options.content_type_html', defaultMessage: 'HTML' }, content_type_wysiwyg: { id: 'preferences.options.content_type_wysiwyg', defaultMessage: 'WYSIWYG' }, brandColor: { id: 'preferences.options.brand_color', defaultMessage: 'Base color' }, + dark: { id: 'theme_toggle.dark', defaultMessage: 'Dark' }, + black: { id: 'theme_toggle.black', defaultMessage: 'Black' }, }); const debouncedSave = debounce((dispatch: AppDispatch) => { @@ -165,6 +167,11 @@ const Preferences = () => { private: intl.formatMessage(messages.privacy_followers_only), }), [settings.locale]); + const systemDarkThemePreferenceOptions = React.useMemo(() => ({ + dark: intl.formatMessage(messages.dark), + black: intl.formatMessage(messages.black), + }), [settings.locale]); + const defaultContentTypeOptions = React.useMemo(() => { const postFormats = instance.pleroma.metadata.post_formats; @@ -209,6 +216,20 @@ const Preferences = () => { }> + {settings.themeMode === 'system' && ( + } + hint={} + > + ) => onSelectChange(event, ['theme', 'systemDarkThemePreference'])} + /> + + + )} diff --git a/packages/pl-fe/src/hooks/use-system-theme.ts b/packages/pl-fe/src/hooks/use-system-theme.ts index 1b0c574d9..012f0662f 100644 --- a/packages/pl-fe/src/hooks/use-system-theme.ts +++ b/packages/pl-fe/src/hooks/use-system-theme.ts @@ -1,11 +1,14 @@ import { useState, useEffect } from 'react'; -type SystemTheme = 'light' | 'black'; +import { useSettings } from './use-settings'; + +import type { Theme } from './use-theme'; /** Get the system color scheme of the system. */ -const useSystemTheme = (): SystemTheme => { +const useSystemTheme = (): Theme => { const query = window.matchMedia('(prefers-color-scheme: dark)'); const [dark, setDark] = useState(query.matches); + const { theme } = useSettings(); const handleChange = (event: MediaQueryListEvent) => { setDark(event.matches); @@ -29,7 +32,7 @@ const useSystemTheme = (): SystemTheme => { }; }, []); - return dark ? 'black' : 'light'; + return dark ? (theme?.systemDarkThemePreference || 'black') : 'light'; }; export { useSystemTheme }; diff --git a/packages/pl-fe/src/hooks/use-theme.ts b/packages/pl-fe/src/hooks/use-theme.ts index 563425c83..b4a3cfba9 100644 --- a/packages/pl-fe/src/hooks/use-theme.ts +++ b/packages/pl-fe/src/hooks/use-theme.ts @@ -14,4 +14,4 @@ const useTheme = (): Theme => { return themeMode === 'system' ? systemTheme : themeMode; }; -export { useTheme }; +export { useTheme, type Theme }; diff --git a/packages/pl-fe/src/locales/en.json b/packages/pl-fe/src/locales/en.json index 73ac636df..102f39aba 100644 --- a/packages/pl-fe/src/locales/en.json +++ b/packages/pl-fe/src/locales/en.json @@ -1104,7 +1104,7 @@ "list.click_to_add": "Click here to add people", "list_adder.header_title": "Add or remove from lists", "lists.account.add": "Add to list", - "lists.account.remove": "List members", + "lists.account.remove": "Remove from list", "lists.delete": "Delete list", "lists.edit": "Edit list", "lists.edit.error": "Error updating list", @@ -1423,6 +1423,8 @@ "preferences.fields.system_emoji_font_label": "Use system emoji font", "preferences.fields.system_font_label": "Use system's default font", "preferences.fields.theme": "Theme", + "preferences.fields.theme.dark_theme_preference_hint": "Select dark theme to be used when theme is set to \"System\"", + "preferences.fields.theme.dark_theme_preference_label": "Dark theme preference", "preferences.fields.theme.display_background_gradient": "Display background gradient", "preferences.fields.theme_reset": "Reset theme", "preferences.fields.underline_links_label": "Always underline links in posts", diff --git a/packages/pl-fe/src/modals/list-editor-modal/components/list-members-form.tsx b/packages/pl-fe/src/modals/list-editor-modal/components/list-members-form.tsx index d541fe4c9..82c6048ac 100644 --- a/packages/pl-fe/src/modals/list-editor-modal/components/list-members-form.tsx +++ b/packages/pl-fe/src/modals/list-editor-modal/components/list-members-form.tsx @@ -12,7 +12,7 @@ import Search from './search'; const messages = defineMessages({ addToList: { id: 'lists.account.add', defaultMessage: 'Add to list' }, - removeFromList: { id: 'lists.account.remove', defaultMessage: 'List members' }, + removeFromList: { id: 'lists.account.remove', defaultMessage: 'Remove from list' }, }); interface IListMembersForm { diff --git a/packages/pl-fe/src/modals/list-editor-modal/index.tsx b/packages/pl-fe/src/modals/list-editor-modal/index.tsx index 904d70bfc..2d712c7ab 100644 --- a/packages/pl-fe/src/modals/list-editor-modal/index.tsx +++ b/packages/pl-fe/src/modals/list-editor-modal/index.tsx @@ -26,7 +26,7 @@ const ListEditorModal: React.FC = ({ list return ( : } + title={tab === 'info' ? : } onClose={onClickClose} onBack={tab === 'members' ? () => setTab('info') : undefined} > diff --git a/packages/pl-fe/src/schemas/pl-fe/settings.ts b/packages/pl-fe/src/schemas/pl-fe/settings.ts index d1ba9b900..e4147e6a0 100644 --- a/packages/pl-fe/src/schemas/pl-fe/settings.ts +++ b/packages/pl-fe/src/schemas/pl-fe/settings.ts @@ -61,6 +61,7 @@ const settingsSchema = v.object({ colors: v.optional(v.any()), interfaceSize: v.fallback(v.picklist(['sm', 'md', 'lg', 'xl']), 'md'), backgroundGradient: v.optional(v.boolean(), true), + systemDarkThemePreference: v.fallback(v.picklist(['dark', 'black']), 'black'), }), undefined), systemFont: v.fallback(v.boolean(), false),