diff --git a/src/common/reducers/preferences.ts b/src/common/reducers/preferences.ts index ce42ac2a7..dbd2a7b13 100644 --- a/src/common/reducers/preferences.ts +++ b/src/common/reducers/preferences.ts @@ -22,6 +22,7 @@ export const initialState = { preferOptimizedPatches: false, disableBrowser: env.integrationTests ? true : false, enableTabs: false, + lightMode: false, } as PreferencesState; export default reducer(initialState, (on) => { diff --git a/src/common/types/index.ts b/src/common/types/index.ts index a60f90afe..d874b4403 100644 --- a/src/common/types/index.ts +++ b/src/common/types/index.ts @@ -450,6 +450,9 @@ export interface PreferencesState { /** when closing window, keep running in tray */ closeToTray: boolean; + /** toggle light mode on or off */ + lightMode: boolean; + /** notify when a download has been installed or updated */ readyNotification: boolean; diff --git a/src/main/reactors/winds.ts b/src/main/reactors/winds.ts index cd5cbe1d0..7b736b3ca 100644 --- a/src/main/reactors/winds.ts +++ b/src/main/reactors/winds.ts @@ -530,6 +530,13 @@ function getIconPath(): string { function commonBrowserWindowOpts( store: Store ): Partial { + logger.debug("---"); + logger.debug("---"); + logger.debug("---"); + logger.debug("Common browser window opts"); + logger.debug("---"); + logger.debug("---"); + logger.debug("---"); return { icon: getIconPath(), autoHideMenuBar: true, diff --git a/src/renderer/App/Modals.tsx b/src/renderer/App/Modals.tsx index 04bf2adb1..81da51028 100644 --- a/src/renderer/App/Modals.tsx +++ b/src/renderer/App/Modals.tsx @@ -34,11 +34,16 @@ import styled, * as styles from "renderer/styles"; import { T, TString } from "renderer/t"; import { filter, isEmpty, map } from "underscore"; import { isSecretClick } from "common/helpers/secret-click"; +import { lightTheme } from "renderer/lightTheme"; const HoverCover = Hoverable(Cover); type Flavor = "normal" | "big"; +let lColor = global.ReduxStore.getState().preferences.lightMode + ? lightTheme.colors.ivory + : styles.colors.ivory; + const ModalPortalDiv = styled.div` position: fixed; top: 0; @@ -149,10 +154,10 @@ const ModalsDiv = styled.div` } a { - color: darken($ivory, 5%); + color: darken(${lColor}, 5%); &:hover { - color: $ivory; + color: ${lColor}; cursor: pointer; } } @@ -271,6 +276,7 @@ const ButtonsDiv = styled.div` flex-direction: row; align-items: center; padding: 20px; + background-color: ${(props) => props.theme.breadBackground}; & > * { margin-left: 8px; diff --git a/src/renderer/App/index.tsx b/src/renderer/App/index.tsx index 6cc3e07de..2a07c9063 100644 --- a/src/renderer/App/index.tsx +++ b/src/renderer/App/index.tsx @@ -3,6 +3,7 @@ const Profiler = require("react").unstable_Profiler; import { IntlProvider } from "react-intl"; import { hook } from "renderer/hocs/hook"; import { theme, ThemeProvider } from "renderer/styles"; +import { lightTheme } from "renderer/lightTheme"; import AppContents from "renderer/App/AppContents"; import { isEqual } from "underscore"; @@ -17,6 +18,7 @@ class App extends React.PureComponent { messages: {}, localeMessages: {}, fallbackMessages: {}, + lightMode: false, }; } @@ -42,10 +44,11 @@ class App extends React.PureComponent { realRender() { const { localeVersion, locale, messages } = this.state; + const { lightMode } = this.props; return ( - + @@ -70,6 +73,7 @@ class App extends React.PureComponent { ...props.fallbackMessages, ...props.localeMessages, }, + lightMode: props.lightMode, }; } return null; @@ -84,6 +88,7 @@ interface Props { fallbackMessages: { [id: string]: string; }; + lightMode: boolean; } interface State { @@ -99,6 +104,7 @@ interface State { fallbackMessages: { [id: string]: string; }; + lightMode: boolean; } const emptyObj = {}; @@ -110,4 +116,5 @@ export default hook((map) => ({ return strings[lang] || strings[lang.substring(0, 2)] || emptyObj; }), fallbackMessages: map((rs) => rs.i18n.strings.en || emptyObj), + lightMode: map((rs) => rs.preferences.lightMode), }))(App); diff --git a/src/renderer/basics/Button.tsx b/src/renderer/basics/Button.tsx index 7f0eadcdd..cdec0e5ef 100644 --- a/src/renderer/basics/Button.tsx +++ b/src/renderer/basics/Button.tsx @@ -8,6 +8,13 @@ const Label = styled.div` ${styles.singleLine}; `; +const buttonBackground = ` + hsla(355, 40%, 21%, 1), + hsla(355, 40%, 32%, 1)`; + +const primaryBackground = ` + hsla(355, 50%, 32%, 1), + hsla(355, 50%, 48%, 1)`; const ButtonDiv = styled.div` ${styles.singleLine}; transition: all 0.2s; @@ -20,17 +27,13 @@ const ButtonDiv = styled.div` border-width: 4px 1px 1px 1px; border-radius: 3px; - background-image: linear-gradient( - 10deg, - hsla(355, 40%, 21%, 1), - hsla(355, 40%, 32%, 1) - ); + background-image: linear-gradient(10deg, ${buttonBackground}); border-color: hsla(355, 40%, 44%, 1); box-shadow: 0 1px 3px ${(props) => props.theme.inputBoxShadow}; text-shadow: 0px 1px rgba(0, 0, 0, 0.4); - color: ${(props) => props.theme.baseText}; + color: #fffff0; min-height: 38px; min-width: 7em; @@ -45,11 +48,7 @@ const ButtonDiv = styled.div` &.primary { font-weight: bold; - background-image: linear-gradient( - 10deg, - hsla(355, 50%, 32%, 1), - hsla(355, 50%, 48%, 1) - ); + background-image: linear-gradient(10deg, ${primaryBackground}); border-color: hsla(355, 40%, 52%, 1); } diff --git a/src/renderer/basics/GameStats.tsx b/src/renderer/basics/GameStats.tsx index 942260748..3f15296fa 100644 --- a/src/renderer/basics/GameStats.tsx +++ b/src/renderer/basics/GameStats.tsx @@ -24,7 +24,7 @@ const GameStatsDiv = styled.div` } label { - color: #fff; + color: ${(props) => props.theme.baseText}; .nice-ago { color: ${(props) => props.theme.secondaryText}; // sigh diff --git a/src/renderer/basics/NavigationBar.tsx b/src/renderer/basics/NavigationBar.tsx index c43b8c66a..2b129899a 100644 --- a/src/renderer/basics/NavigationBar.tsx +++ b/src/renderer/basics/NavigationBar.tsx @@ -82,6 +82,26 @@ const browserAddressStyle = css` } `; +const lightBrowserAddressStyle = css` + ${browserAddressSizing}; + ${styles.singleLine}; + font-size: 14px; + text-shadow: 0 0 1px black; + padding: 0; + padding-left: 8px; + padding-right: 12px; + width: 100%; + color: #333333; + + border: none; + background: rgba(200, 200, 200, 0.7); + box-shadow: none; + + &:focus { + outline: none; + } +`; + const AddressWrapper = styled.div` ${browserAddressSizing}; margin: 0 6px; @@ -101,6 +121,13 @@ const AddressInput = styled.input` color: white; `; +const LightAddressInput = styled.input` + ${lightBrowserAddressStyle}; + + text-shadow: 0 0 1px transparent; + color: black; +`; + const AddressDiv = styled.div` ${browserAddressStyle}; @@ -113,6 +140,18 @@ const AddressDiv = styled.div` } `; +const LightAddressDiv = styled.div` + ${lightBrowserAddressStyle}; + + .security-theater-bit { + color: rgb(108, 145, 85); + } + + .fluff-bit { + color: rgb(75, 121, 166); + } +`; + function isHTMLInput(el: HTMLElement): el is HTMLInputElement { return el.tagName === "INPUT"; } @@ -201,7 +240,7 @@ class NavigationBar extends React.PureComponent { } renderAddressBar() { - const { loading, url } = this.props; + const { loading, url, lightMode } = this.props; if (!this.props.showAddressBar) { return null; @@ -209,6 +248,37 @@ class NavigationBar extends React.PureComponent { let { editingAddress } = this.state; + if (lightMode) { + return ( + <> + {loading ? ( + + ) : ( + + )} + + {editingAddress ? ( + + ) : ( + + {this.renderURL(url)} + + )} + + + ); + } return ( <> {loading ? ( @@ -345,11 +415,13 @@ interface Props { internalPage: string; canGoBack: string; canGoForward: string; + lightMode: boolean; } interface State { url: string; editingAddress: boolean; + lightMode: boolean; } export default withTab( @@ -360,5 +432,6 @@ export default withTab( ), canGoBack: map((rs, props) => ambientTab(rs, props).status.canGoBack), canGoForward: map((rs, props) => ambientTab(rs, props).status.canGoForward), + lightMode: map((rs) => rs.preferences.lightMode), }))(NavigationBar) ); diff --git a/src/renderer/global-styles/base.ts b/src/renderer/global-styles/base.ts index 7578d724c..20210825f 100644 --- a/src/renderer/global-styles/base.ts +++ b/src/renderer/global-styles/base.ts @@ -1,6 +1,11 @@ import { css, theme } from "renderer/styles"; +import { lightTheme } from "renderer/lightTheme"; import env from "renderer/env"; +const currentTheme = global.ReduxStore.getState().preferences.lightMode + ? lightTheme + : theme; + const testDisables = () => { if (!env.integrationTests) { return css``; @@ -33,7 +38,7 @@ export default css` user-select: none; font-family: LatoWeb, sans-serif; - color: ${theme.baseText}; + color: ${currentTheme.baseText}; } img.emojione { @@ -46,10 +51,10 @@ export default css` } a { - color: ${theme.accent}; + color: ${currentTheme.accent}; &[href^="itch:"] { - color: ${theme.baseText}; + color: ${currentTheme.baseText}; text-decoration: none; &:hover { diff --git a/src/renderer/lightTheme.ts b/src/renderer/lightTheme.ts new file mode 100644 index 000000000..b1e6fb7e8 --- /dev/null +++ b/src/renderer/lightTheme.ts @@ -0,0 +1,429 @@ +import { lighten } from "polished"; + +export const baseColors = { + codGray: "#f7f7f7", + darkMineShaft: "#d9d9d9", + lightMineShaft: "#e9e9e9", + zambezi: "#4e4545", + silverChalice: "#161616", + swissCoffee: "#746d6d", + ivory: "#272929", + + flushMahogany: "#f97b7b", + mintJulep: "#c1c252", + gossip: "#74a46c", + + shamrock: "#13916d", + amber: "#ffc200", + heliotrope: "#7c409a", + + carnation: "#bb2525", + vividTangerine: "#cc4b4a", +}; + +export const uiColors = { + background: "#a5a5a5", + + border: "#8b8d8d", + borderFocused: "#c5c5c6", + + // FIXME: no pure blacks + textShadow: "#b9b9ba", + boxShadow: "#989898", +}; + +const breadBackground = `#f4f4f4`; +const itemBackground = "#eedbdb"; + +export const colors = { + accent: baseColors.carnation, + lightAccent: baseColors.vividTangerine, + + error: baseColors.flushMahogany, + warning: baseColors.mintJulep, + success: baseColors.gossip, + + buy: baseColors.shamrock, + sale: "#34a0f2", + bundle: baseColors.heliotrope, + + explanation: itemBackground, + + meatBackground: breadBackground, + itemBackground, + + baseBackground: baseColors.codGray, + baseText: baseColors.ivory, + + inputBackground: uiColors.background, + inputFocusedBackground: lighten(0.1, uiColors.background), + inputSelectedBackground: lighten(0.2, uiColors.background), + inputText: "#3e3f3f", + inputPlaceholder: baseColors.silverChalice, + + inputBorder: uiColors.border, + inputBorderFocused: uiColors.borderFocused, + + inputTextShadow: uiColors.textShadow, + inputBoxShadow: uiColors.boxShadow, + inputBoxShadowFocused: "#1b1919", + + sidebarBackground: "#e9e9e9", + + sidebarBorder: lighten(0.03, breadBackground), + sidebarEntryFocusedBackground: lighten(0.05, breadBackground), + + dropdownBackground: lighten(0.15, baseColors.codGray), + + secondaryText: lighten(0.1, baseColors.silverChalice), + secondaryTextHover: baseColors.ivory, + + ternaryText: baseColors.zambezi, + + descText: lighten(0.3, "#a0a0a0"), + + breadBackground, + breadBoxShadow: "#171717", + + filterBackground: "#4a4848", + filterBorder: "#333", + + filterTagBorder: "#777575", + filterTagBackground: "#5f5c5c", + filterTagText: "#e0dfdf", + + tooltipBackground: baseColors.swissCoffee, + tooltipText: baseColors.codGray, + + prefBorder: baseColors.zambezi, + + priceNormal: "#70f1c9", + priceSale: "#ffd700", + + windowBorder: baseColors.lightMineShaft, +}; + +export const fontSizes = { + small: "12px", + sidebar: "14px", + smaller: "14px", + baseText: "15px", + modal: "18px", + large: "16px", + larger: "18px", + huge: "19px", + huger: "23px", + enormous: "30px", +}; + +export const borderRadii = { + explanation: "4px", +}; + +export const widths = { + searchSidebar: "500px", + handle: "8px", + gridItem: "235px", +}; + +export const lightTheme = { + ...colors, + baseColors, + fontSizes, + borderRadii, + widths, +}; + +import * as sc from "styled-components"; +import { ThemedStyledComponentsModule } from "styled-components"; +const { + default: lstyled, + css, + keyframes, + createGlobalStyle, + ThemeProvider, +} = sc as ThemedStyledComponentsModule; + +export default lstyled; +export { css, keyframes, createGlobalStyle, ThemeProvider }; + +// animations + +export const animations = { + horizontalIndeterminate: keyframes` + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(300%); + } + `, + + horizontalScan: keyframes` + 0% { + background-position: 0em 0; + } + 100% { + background-position: 1em 0; + } + `, + + enterLeft: keyframes` + 0% { + opacity: 0; + transform: translateX(-20%); + } + 100% { + opacity: 1; + transform: translateX(0%); + } + `, + + fixedEnterTop: keyframes` + 0% { + opacity: 0; + transform: translateY(-200px); + } + 100% { + opacity: 1; + transform: translateY(0); + } + `, + + fixedEnterBottom: keyframes` + 0% { + opacity: 0; + transform: translateY(200px); + } + 100% { + opacity: 1; + transform: translateY(0); + } + `, + + fixedEnterLeft: keyframes` + 0% { + opacity: 0; + transform: translateX(-200px); + } + 100% { + opacity: 1; + transform: translateX(0); + } + `, + + fixedEnterRight: keyframes` + 0% { + opacity: 0; + transform: translateX(200px); + } + 100% { + opacity: 1; + transform: translateX(0); + } + `, + + fadeIn: keyframes` + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + `, + + enterTop: keyframes` + 0% { + opacity: 0; + transform: translateY(-25%); + } + 100% { + opacity: 1; + transform: translateY(0%); + } + `, + + enterBottom: keyframes` + 0% { + opacity: 0; + transform: translateY(25%); + } + 100% { + opacity: 1; + transform: translateY(0%); + } + `, + + loadBorder: keyframes` + 0% { + border-image-slice: 0% 0% 10% 92%; + border-image-width: 0 0 2px 0; + } + 100% { + border-image-slice: 0% 0% 10% 0%; + border-image-width: 0 0 2px 0; + } + `, + + lineSpinner: keyframes` + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(100%); + } + `, +}; + +// mixins + +export const heavyInput = css` + font-size: ${(props) => props.theme.fontSizes.baseText}; + padding: 12px 10px 9px 10px; + margin: 8px 4px; + border: 1px solid rgba(255, 255, 255, 0.1); + + background-color: rgba(0, 0, 0, 0.4); + color: ${(props) => props.theme.inputText}; + + text-shadow: 0 0 2px ${(props) => props.theme.inputTextShadow}; + transition: all 0.4s; + + &::-webkit-input-placeholder { + text-shadow: 0 0 2px transparent; + color: ${(props) => props.theme.inputPlaceholder}; + } + + &:focus { + outline: 0; + border-color: rgba(255, 255, 255, 0.4); + } +`; + +export const searchInput = css` + color: ${(props) => props.theme.secondaryTextHover}; + + ::-webkit-input-placeholder { + color: ${(props) => props.theme.inputPlaceholder}; + } + + background: none; + border: none; + width: 200px; + padding: 6px 10px 5px 22px; + height: 32px; + font-size: 14px; +`; + +export const searchIcon = css` + position: absolute; + left: 10px; + bottom: 50%; + transform: translateY(50%); + font-size: 14px; + color: ${(props) => props.theme.secondaryText}; + pointer-events: none; +`; + +export const clickable = css` + filter: brightness(90%); + + &:hover { + filter: brightness(110%); + cursor: pointer; + } + + &:active { + transform: translateY(1px); + } +`; + +const downloadProgressColorOut = "rgba(165, 165, 165, 0.47)"; +const downloadProgressColorInA = "rgba(255, 255, 255, .1)"; +const downloadProgressColorInB = "rgba(255, 255, 255, .4)"; + +export const progress = css` + position: relative; + height: 3px; + width: 100%; + + background: ${downloadProgressColorOut}; + transition: background 1s; + + .progress-inner { + position: absolute; + transition: width 0.51s linear; + left: 0; + top: 0; + bottom: 0; + background-color: ${(props) => props.theme.accent}; + background-image: -webkit-repeating-linear-gradient( + -60deg, + ${downloadProgressColorInA} 0, + ${downloadProgressColorInA} 4px, + ${downloadProgressColorInB} 4px, + ${downloadProgressColorInB} 8px + ); + } +`; + +export const horizontalScan = css` + background: -webkit-linear-gradient( + left, + ${(props) => props.theme.secondaryTextHover} 0% + ${(props) => props.theme.secondaryTextHover} 50% + ${(props) => props.theme.secondaryText} 50% + ); + background-size: 200% 100%; + animation: horizontal-scan 2s infinite; + background-clip: text; + -webkit-text-fill-color: transparent; +`; + +export const singleLine = css` + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + min-width: 0; +`; + +export const secondaryLink = css` + color: ${(props) => props.theme.secondaryText}; + text-decoration: underline; + + &:hover { + cursor: pointer; + color: ${(props) => props.theme.secondaryTextHover}; + } +`; + +export const meat = css` + display: flex; + flex-direction: column; + flex-grow: 1; + flex-shrink: 1; + width: 100%; + max-height: 100%; + + color: ${(props) => props.theme.secondaryText}; +`; + +export const prefChunk = css` + border-left: 3px solid ${(props) => props.theme.prefBorder}; + transition: 0.2s border ease-in-out; +`; + +export const prefChunkActive = css` + border-left: 3px solid ${(props) => props.theme.accent}; +`; + +export const boxy = css` + border: 1px solid rgba(255, 255, 255, 0.05); + background: ${(props) => props.theme.itemBackground}; + overflow: hidden; +`; + +export const windowBorder = css` + border: 1px solid ${(props) => props.theme.windowBorder}; + border-radius: 2px; +`; diff --git a/src/renderer/modal-widgets/ManageCave.tsx b/src/renderer/modal-widgets/ManageCave.tsx index 6ba2af9f5..6f06b58f6 100644 --- a/src/renderer/modal-widgets/ManageCave.tsx +++ b/src/renderer/modal-widgets/ManageCave.tsx @@ -104,6 +104,7 @@ class ManageCave extends React.PureComponent { } renderCave(): JSX.Element { + const { dispatch, lightMode } = this.props; const { cave } = this.props.modal.widgetParams; const { game } = cave; @@ -303,9 +304,13 @@ class ManageCave extends React.PureComponent { interface Props extends ModalWidgetProps { dispatch: Dispatch; + + lightMode: boolean; } -export default hook()(ManageCave); +export default hook((map) => ({ + lightMode: map((rs) => rs.preferences.lightMode), +}))(ManageCave); function formatUpload(upload: Upload): JSX.Element { return ( diff --git a/src/renderer/modal-widgets/ManageGame.tsx b/src/renderer/modal-widgets/ManageGame.tsx index cd086a6af..45a3c9161 100644 --- a/src/renderer/modal-widgets/ManageGame.tsx +++ b/src/renderer/modal-widgets/ManageGame.tsx @@ -86,6 +86,8 @@ const FileSize = styled.div` const ManageGameDiv = styled(ModalWidgetDiv)` min-width: 600px; min-height: 300px; + background-color: ${(props) => props.theme.breadBackground}; + color: ${(props) => props.theme.baseText}; `; class ManageGame extends React.PureComponent { diff --git a/src/renderer/pages/BrowserPage/index.tsx b/src/renderer/pages/BrowserPage/index.tsx index 13c2c6d9c..14090ddd5 100644 --- a/src/renderer/pages/BrowserPage/index.tsx +++ b/src/renderer/pages/BrowserPage/index.tsx @@ -15,6 +15,8 @@ import BrowserContext from "renderer/pages/BrowserPage/BrowserContext"; import DisabledBrowser from "renderer/pages/BrowserPage/DisabledBrowser"; import { MeatProps } from "renderer/scenes/HubScene/Meats/types"; import styled, * as styles from "renderer/styles"; +import { rendererLogger } from "renderer/logger"; +const logger = rendererLogger.child(__filename); const BrowserPageDiv = styled.div` ${styles.meat}; @@ -53,18 +55,51 @@ class BrowserPage extends React.PureComponent { } render() { - const { sleepy, disableBrowser, visible, partition } = this.props; + const { + sleepy, + disableBrowser, + visible, + partition, + lightMode, + } = this.props; + if (sleepy && !visible) { return null; } + if (disableBrowser) { + return ( + + + + + + + + + + ); + } + + //Changes based on the light mode checkbox - itch/kitch need to be removed from user agent + //in order to not receive dark themed web content. webview must also be wrapped in its + //own div because otherwise the checkbox will not trigger a rerender. return ( - {disableBrowser ? ( - + {lightMode ? ( +
+ +
) : ( rs.system.proxy), proxySource: map((rs) => rs.system.proxySource), disableBrowser: map((rs) => rs.preferences.disableBrowser), + lightMode: map((rs) => rs.preferences.lightMode), partition: map((rs, props) => partitionForUser(String(rs.profile.profile.id)) diff --git a/src/renderer/pages/LibraryPage/index.tsx b/src/renderer/pages/LibraryPage/index.tsx index b77f44685..f5687f367 100644 --- a/src/renderer/pages/LibraryPage/index.tsx +++ b/src/renderer/pages/LibraryPage/index.tsx @@ -24,7 +24,6 @@ class LibraryPage extends React.PureComponent { return ( - props.theme.secondaryText}; + color: ${(props) => props.theme.descText}; `; diff --git a/src/renderer/pages/PreferencesPage/AdvancedSettings.tsx b/src/renderer/pages/PreferencesPage/AdvancedSettings.tsx index ad0cd22eb..da6c6dc04 100644 --- a/src/renderer/pages/PreferencesPage/AdvancedSettings.tsx +++ b/src/renderer/pages/PreferencesPage/AdvancedSettings.tsx @@ -12,9 +12,59 @@ import { T } from "renderer/t"; class AdvancedSettings extends React.PureComponent { render() { - const { system, dispatch } = this.props; + const { system, dispatch, lightMode } = this.props; - return ( + return lightMode ? ( + <> +

{T(["preferences.advanced"])}

+
+ +
+ {formatPlatform(system.platform)}{" "} + {formatArch(system.arch)} +
+
+ +
+
+ + {T(["preferences.advanced.open_app_log"])} + +
+
+ + {T(["preferences.advanced.check_game_updates"])} + +
+
+ + {T(["preferences.advanced.clear_browsing_data"])} + +
+ + +
+ + ) : ( <>

{T(["preferences.advanced"])}

@@ -86,8 +136,10 @@ interface Props { dispatch: Dispatch; system: SystemState; + lightMode: boolean; } export default hook((map) => ({ system: map((rs) => rs.system), + lightMode: map((rs) => rs.preferences.lightMode), }))(AdvancedSettings); diff --git a/src/renderer/pages/PreferencesPage/BehaviorSettings.tsx b/src/renderer/pages/PreferencesPage/BehaviorSettings.tsx index ba8afdc56..afc1265fe 100644 --- a/src/renderer/pages/PreferencesPage/BehaviorSettings.tsx +++ b/src/renderer/pages/PreferencesPage/BehaviorSettings.tsx @@ -2,12 +2,15 @@ import React from "react"; import Checkbox from "renderer/pages/PreferencesPage/Checkbox"; import OpenAtLoginErrorMessage from "renderer/pages/PreferencesPage/OpenAtLoginErrorMessage"; +import { hook } from "renderer/hocs/hook"; import { T } from "renderer/t"; import urls from "common/constants/urls"; class BehaviorSettings extends React.PureComponent { render() { + const { lightMode } = this.props; + return ( <>

{T(["preferences.security"])}

@@ -18,13 +21,27 @@ class BehaviorSettings extends React.PureComponent { />
-

- {T(["preferences.security.sandbox.description"])}{" "} - {T(["docs.learn_more"])} -

+ {lightMode ? ( +

+ {T(["preferences.security.sandbox.description"])}{" "} + + {T(["docs.learn_more"])} + +

+ ) : ( +

+ {T(["preferences.security.sandbox.description"])}{" "} + {T(["docs.learn_more"])} +

+ )}

{T(["preferences.behavior"])}

+ + { } } -export default BehaviorSettings; +interface Props { + lightMode: boolean; +} -interface Props {} +export default hook((map) => ({ + lightMode: map((rs) => rs.preferences.lightMode), +}))(BehaviorSettings); diff --git a/src/renderer/pages/PreferencesPage/BrothComponents.tsx b/src/renderer/pages/PreferencesPage/BrothComponents.tsx index 7cfa2a5d7..7d5f6bfd3 100644 --- a/src/renderer/pages/PreferencesPage/BrothComponents.tsx +++ b/src/renderer/pages/PreferencesPage/BrothComponents.tsx @@ -8,21 +8,36 @@ import { T } from "renderer/t"; class BrothComponents extends React.Component { render() { - const { packageNames } = this.props; + const { packageNames, lightMode } = this.props; return (
{T(["preferences.advanced.components"])} - - {T(["menu.help.check_for_update"])} - + {lightMode ? ( + + {T(["menu.help.check_for_update"])} + + ) : ( + + {T(["menu.help.check_for_update"])} + + )} {packageNames.map((name) => ( ))} @@ -40,8 +55,10 @@ interface Props { dispatch: Dispatch; packageNames: string[]; + lightMode: boolean; } export default hook((map) => ({ packageNames: map((rs) => rs.broth.packageNames), + lightMode: map((rs) => rs.preferences.lightMode), }))(BrothComponents); diff --git a/src/renderer/pages/PreferencesPage/LanguageSettings.tsx b/src/renderer/pages/PreferencesPage/LanguageSettings.tsx index 004917e15..fe98f0b89 100644 --- a/src/renderer/pages/PreferencesPage/LanguageSettings.tsx +++ b/src/renderer/pages/PreferencesPage/LanguageSettings.tsx @@ -24,7 +24,7 @@ const LanguageSelect = styled(SimpleSelect)` class LanguageSettings extends React.PureComponent { render() { - const { dispatch, locales, lang, sniffedLang } = this.props; + const { dispatch, locales, lang, sniffedLang, lightMode } = this.props; let autoLang: BaseOptionType = { label: ["preferences.language.auto", { language: sniffedLang }], @@ -63,12 +63,21 @@ class LanguageSettings extends React.PureComponent {
-

- {T(["preferences.language.get_involved", { name: "itch" }])}{" "} - - - -

+ {lightMode ? ( +

+ {T(["preferences.language.get_involved", { name: "itch" }])}{" "} + + + +

+ ) : ( +

+ {T(["preferences.language.get_involved", { name: "itch" }])}{" "} + + + +

+ )} ); } @@ -99,6 +108,7 @@ interface Props { lang: string; sniffedLang: string; downloading: RootState["i18n"]["downloading"]; + lightMode: boolean; } export default hook((map) => ({ @@ -106,4 +116,5 @@ export default hook((map) => ({ lang: map((rs) => rs.i18n.lang), sniffedLang: map((rs) => rs.system.sniffedLanguage), downloading: map((rs) => rs.i18n.downloading), + lightMode: map((rs) => rs.preferences.lightMode), }))(LanguageSettings); diff --git a/src/renderer/pages/common/GameStripe.tsx b/src/renderer/pages/common/GameStripe.tsx index 13b493339..c20c31abb 100644 --- a/src/renderer/pages/common/GameStripe.tsx +++ b/src/renderer/pages/common/GameStripe.tsx @@ -81,6 +81,7 @@ interface GenericProps { sequence: number; linkId?: string; // useful for integration tests + lightMode: boolean; } const stripeLimit = 12; @@ -137,12 +138,18 @@ export function makeGameStripe>( href, title, renderTitleExtras = renderNoop, + lightMode, } = this.props; + return ( <> - <a id={linkId} href={href}> + <a + id={linkId} + href={href} + style={{ color: lightMode ? "#272929" : "#fffff0" }} + > {T(title)} </a> {renderTitleExtras()} @@ -216,6 +223,7 @@ export function makeGameStripe<Params, Res extends FetchRes<any>>( let result = withTab( hookWithProps(Stripe)((map) => ({ sequence: map((rs, props) => ambientTab(rs, props).sequence), + lightMode: map((rs) => rs.preferences.lightMode), }))(Stripe) ); type ResultType = typeof result; diff --git a/src/renderer/pages/common/SortsAndFilters.tsx b/src/renderer/pages/common/SortsAndFilters.tsx index 35e00bc70..52d3f8d96 100644 --- a/src/renderer/pages/common/SortsAndFilters.tsx +++ b/src/renderer/pages/common/SortsAndFilters.tsx @@ -18,10 +18,9 @@ export const FilterGroup = styled.div` flex-flow: row wrap; `; -// const inactiveBg = `linear-gradient(to top,hsla(355, 43%, 25%, 1),hsla(355, 43%, 17%, 1))`; -// const activeBg = `linear-gradient(to top, hsla(355, 43%, 50%, 1), hsla(355, 43%, 37%, 1));`; -const inactiveBg = `linear-gradient(to top,hsla(355, 43%, 17%, 1),hsla(355, 43%, 11%, 1))`; +const inactiveBg = `linear-gradient(to top, hsla(355, 48%, 38%, 1), hsla(355, 48%, 27%, 1));`; const activeBg = `linear-gradient(to top, hsla(355, 43%, 33%, 1), hsla(355, 43%, 22%, 1));`; + const borderColor = `#843442`; const borderRadius = `4px`; @@ -53,7 +52,7 @@ const optionButtonLike = css` &.active { background: ${activeBg}; - color: ${(props) => props.theme.baseText}; + color: #fffff0; } &:hover { diff --git a/src/renderer/scenes/GateScene/LogoIndicator.tsx b/src/renderer/scenes/GateScene/LogoIndicator.tsx index 46258f6af..b03ad5a6e 100644 --- a/src/renderer/scenes/GateScene/LogoIndicator.tsx +++ b/src/renderer/scenes/GateScene/LogoIndicator.tsx @@ -6,6 +6,9 @@ import Vivus from "vivus"; const appWhiteContour = require("static/images/logos/app-white-contour.svg") .default; +const appBlackContour = require("static/images/logos/app-black-contour.svg") + .default; + const LogoIndicatorDiv = styled.div` pointer-events: none; @@ -27,17 +30,27 @@ const LogoIndicatorDiv = styled.div` } `; -class LogoIndicator extends React.PureComponent<Props> { +class LogoIndicator extends React.PureComponent<Props, State> { vivus: Vivus; + constructor(props: LogoIndicator["props"], context: any) { + super(props, context); + this.state = { + progress: 0, + lightMode: false, + }; + } + render() { return <LogoIndicatorDiv id="logo-indicator-div" ref={this.gotEl} />; } gotEl = (el: HTMLDivElement) => { + const { lightMode } = this.props; + if (el) { new Vivus(el.id, { - file: appWhiteContour, + file: lightMode ? appBlackContour : appWhiteContour, type: "delayed", start: "manual", animTimingFunction: Vivus.EASE_OUT, @@ -62,6 +75,12 @@ class LogoIndicator extends React.PureComponent<Props> { interface Props { progress: number; + lightMode: boolean; +} + +interface State { + progress: number; + lightMode: boolean; } export default hook((map) => ({ @@ -77,4 +96,5 @@ export default hook((map) => ({ } } }), + lightMode: map((rs) => rs.preferences.lightMode), }))(LogoIndicator); diff --git a/src/renderer/scenes/HubScene/Sidebar/Logo.tsx b/src/renderer/scenes/HubScene/Sidebar/Logo.tsx index df180793c..5e3fdeefd 100644 --- a/src/renderer/scenes/HubScene/Sidebar/Logo.tsx +++ b/src/renderer/scenes/HubScene/Sidebar/Logo.tsx @@ -22,10 +22,27 @@ const LogoDiv = styled.div` `; class Logo extends React.PureComponent<Props> { + constructor(props: Logo["props"], context: any) { + super(props, context); + this.state = { + progress: 0, + lightMode: false, + }; + } + render() { const { appVersion } = this.props; + let lm = global.ReduxStore.getState().preferences.lightMode; - return ( + return lm ? ( + <LogoDiv + title={appVersion} + className={classNames("logo-div")} + onClick={this.onClick} + > + <img src={require("static/images/logos/app-black.svg").default} /> + </LogoDiv> + ) : ( <LogoDiv title={appVersion} className={classNames("logo-div")} @@ -65,11 +82,17 @@ class Logo extends React.PureComponent<Props> { }; } +interface State { + lightMode: boolean; +} + interface Props { dispatch: Dispatch; appVersion: string; + lightMode: boolean; } export default hook((map) => ({ appVersion: map((rs) => rs.system.appVersion), + lightMode: map((rs) => rs.preferences.lightMode), }))(Logo); diff --git a/src/renderer/scenes/HubScene/Sidebar/PrimeDownload/PrimeDownloadContents.tsx b/src/renderer/scenes/HubScene/Sidebar/PrimeDownload/PrimeDownloadContents.tsx index eee547c0f..ac70da4d4 100644 --- a/src/renderer/scenes/HubScene/Sidebar/PrimeDownload/PrimeDownloadContents.tsx +++ b/src/renderer/scenes/HubScene/Sidebar/PrimeDownload/PrimeDownloadContents.tsx @@ -61,6 +61,7 @@ const PrimeDownloadDiv = styled.div` display: flex; flex-direction: column; align-items: center; + color: #fffff0; `; const Overlay = styled.div` diff --git a/src/renderer/styles.ts b/src/renderer/styles.ts index d8dbc7001..1bfacbd5a 100644 --- a/src/renderer/styles.ts +++ b/src/renderer/styles.ts @@ -81,6 +81,8 @@ export const colors = { ternaryText: baseColors.zambezi, + descText: lighten(0.1, baseColors.silverChalice), + breadBackground, breadBoxShadow: "#171717", diff --git a/src/static/images/logos/app-black-contour.svg b/src/static/images/logos/app-black-contour.svg new file mode 100644 index 000000000..43277b10a --- /dev/null +++ b/src/static/images/logos/app-black-contour.svg @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="168.69514" + width="402.48669" + version="1.1" + id="svg2" + inkscape:version="0.91 r13725" + sodipodi:docname="app-white-contour.svg"> + <metadata + id="metadata16"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs14" /> + <sodipodi:namedview + pagecolor="#000000" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1027" + id="namedview12" + showgrid="false" + inkscape:zoom="2.1574634" + inkscape:cx="187.9773" + inkscape:cy="136.14992" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:current-layer="g6" + fit-margin-top="10" + fit-margin-right="10" + fit-margin-left="10" + fit-margin-bottom="10" /> + <path + d="m 172.1347,62.095152 24.142,0 0,71.553998 -24.14,0 0,-71.555998 z m 12.217,-5.817 c -4.07,0 -7.197,-1.02 -9.38,-3.054 -2.18,-2.036 -3.272,-4.75 -3.272,-8.145 0,-3.2 1.09,-5.916 3.272,-8.145 2.183,-2.23 5.31,-3.345 9.38,-3.345 4.073,0 7.2,1.115 9.38,3.345 2.183,2.23 3.274,4.945 3.274,8.144 0,3.393 -1.09,6.108 -3.272,8.144 -2.18,2.035 -5.308,3.054 -9.38,3.054 m 47.11,78.813998 c -6.98,0 -12.24,-1.866 -15.78,-5.6 -3.54,-3.732 -5.31,-8.944 -5.31,-15.634 l 0,-33.883998 -9.596,0 0,-17.89 9.597,0 0,-17.45 24.143,0 0,17.45 15.707,0 0,17.89 -15.71,0 0,30.395998 c 0,2.23 0.46,3.806 1.382,4.728 0.922,0.922 2.35,1.38 4.29,1.38 2.618,0 5.478,-1.162 8.58,-3.49 l 5.528,15.853 c -2.81,1.94 -6.01,3.468 -9.6,4.583 -3.59,1.115 -8,1.672 -13.234,1.672 m 58.43,0 c -11.053,0 -19.755,-3.15 -26.105,-9.454 -6.353,-6.3 -9.528,-15.464 -9.528,-27.484998 0,-8.726 1.794,-16.047 5.38,-21.96 3.685,-6.11 8.292,-10.23 13.82,-12.364 5.815,-2.23 11.197,-3.344 16.142,-3.344 6.203,0 11.392,1.237 15.56,3.71 4.17,2.472 7.248,5.162 9.236,8.07 1.988,2.908 3.417,5.188 4.29,6.837 l -16.725,10.76 c -1.55,-3.198 -3.248,-5.72 -5.09,-7.562 -1.843,-1.84 -4.073,-2.76 -6.69,-2.76 -3.685,0 -6.593,1.453 -8.726,4.36 -2.134,2.91 -3.2,7.32 -3.2,13.236 0,6.399998 1.26,11.101998 3.78,14.107998 2.52,3.005 6.11,4.507 10.762,4.507 3.684,0 6.763,-0.676 9.237,-2.035 2.47,-1.356 4.82,-3.1 7.05,-5.235 l 7.71,18.034 c -2.328,1.94 -5.77,3.855 -10.325,5.745 -4.56,1.89 -10.085,2.835 -16.58,2.835 m 34.47,-1.44 0,-97.149998 24.287,0 0,29.523 c 2.037,-1.455 4.51,-2.74 7.417,-3.854 2.91,-1.115 6.4,-1.673 10.473,-1.673 8.53,0 14.907,2.425 19.125,7.273 4.218,4.848 6.326,11.683 6.326,20.506 l 0,45.374998 -24.286,0 0,-42.466998 c 0,-4.072 -0.775,-7.054 -2.327,-8.944 -1.552,-1.89 -3.59,-2.836 -6.11,-2.836 -2.132,0 -4.12,0.485 -5.962,1.455 -1.84,0.968 -3.394,1.986 -4.654,3.052 l 0,49.739998 -24.286,0 z" + id="path4" + style="fill:none;stroke:#000000;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <g + transform="matrix(1,0.21625,0,1,-30.3723,-377.78285)" + id="g6" + style="fill:none"> + <path + style="color:#000000;fill:none;fill-opacity:0.23457001;stroke:#000000;stroke-opacity:0.31360952" + d="m 160.16,353.9 c -1.0274,-0.0432 -2.1572,0.14856 -3.3457,0.60156 l -107.36,40.92 c -4.7542,1.812 -8.582,7.1126 -8.582,11.885 l 0,107.77 c -1e-6,4.7722 3.8278,7.1538 8.582,5.3418 l 0.79297,-0.30273 c -0.19453,-0.64689 -0.30859,-1.3586 -0.30859,-2.1426 l 0,-107.77 c 0,-4.7722 3.843,-10.076 8.6152,-11.891 l 106.57,-40.52 c -0.66948,-2.3606 -2.517,-3.7901 -4.9551,-3.8926 z" + id="path8" + inkscape:connector-curvature="0" /> + <path + style="color:#000000;fill:none;stroke:#000000;stroke-opacity:1" + d="m 58.549,398.19 c -4.7722,1.8146 -8.6152,7.119 -8.6152,11.891 l 0,107.77 c 0,4.7722 3.843,7.152 8.6152,5.3374 l 107.77,-40.98 c 4.7722,-1.8146 8.6133,-7.1162 8.6133,-11.888 l 0,-107.77 c 0,-4.7722 -3.8411,-7.1547 -8.6133,-5.34 l -107.77,40.98 z m 30.461,23.154 0.008,-0.003 c 4.9574,-1.885 8.4829,-0.0134 9.7324,4.35 l 27.4,-10.419 c 1.2473,-5.3128 4.7509,-9.8573 9.709,-11.743 7.8748,-2.9944 16.532,1.7998 19.234,10.653 l 6.457,21.138 c 2.7034,8.8528 -1.5353,18.551 -9.4102,21.545 -6.9132,2.6287 -14.427,-0.74261 -17.988,-7.5955 l -43.436,16.516 c -3.5603,9.5608 -11.076,18.647 -17.99,21.276 -7.8763,2.995 -12.112,-3.4805 -9.4082,-14.389 l 6.457,-26.049 c 2.7027,-10.91 11.358,-22.286 19.234,-25.281 z m 17.035,7.5595 0,8.8066 -7.0703,2.6885 6.7305,5.9798 6.7266,5.9813 6.7344,-11.104 6.7305,-11.098 -6.6309,2.5214 0,-8.8027 -13.221,5.0272 z" + id="path10" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/src/static/images/logos/app-black.svg b/src/static/images/logos/app-black.svg new file mode 100644 index 000000000..c0485fdbf --- /dev/null +++ b/src/static/images/logos/app-black.svg @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="147.67" + width="381.5" + version="1.1" + id="svg3" + sodipodi:docname="app-black.svg" + inkscape:version="1.3 (1:1.3+202307231459+0e150ed6c4)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs3" /> + <sodipodi:namedview + id="namedview3" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + showgrid="false" + inkscape:zoom="2.9882045" + inkscape:cx="190.75" + inkscape:cy="73.957456" + inkscape:window-width="1850" + inkscape:window-height="1016" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg3" /> + <path + d="m161.64 51.588h24.142v71.554h-24.14v-71.556zm12.217-5.817c-4.07 0-7.197-1.02-9.38-3.054-2.18-2.036-3.272-4.75-3.272-8.145 0-3.2 1.09-5.916 3.272-8.145 2.183-2.23 5.31-3.345 9.38-3.345 4.073 0 7.2 1.115 9.38 3.345 2.183 2.23 3.274 4.945 3.274 8.144 0 3.393-1.09 6.108-3.272 8.144-2.18 2.035-5.308 3.054-9.38 3.054m47.11 78.814c-6.98 0-12.24-1.866-15.78-5.6-3.54-3.732-5.31-8.944-5.31-15.634v-33.884h-9.596v-17.89h9.597v-17.45h24.143v17.45h15.707v17.89h-15.71v30.396c0 2.23 0.46 3.806 1.382 4.728s2.35 1.38 4.29 1.38c2.618 0 5.478-1.162 8.58-3.49l5.528 15.853c-2.81 1.94-6.01 3.468-9.6 4.583s-8 1.672-13.234 1.672m58.43 0c-11.053 0-19.755-3.15-26.105-9.454-6.353-6.3-9.528-15.464-9.528-27.485 0-8.726 1.794-16.047 5.38-21.96 3.685-6.11 8.292-10.23 13.82-12.364 5.815-2.23 11.197-3.344 16.142-3.344 6.203 0 11.392 1.237 15.56 3.71 4.17 2.472 7.248 5.162 9.236 8.07s3.417 5.188 4.29 6.837l-16.725 10.76c-1.55-3.198-3.248-5.72-5.09-7.562-1.843-1.84-4.073-2.76-6.69-2.76-3.685 0-6.593 1.453-8.726 4.36-2.134 2.91-3.2 7.32-3.2 13.236 0 6.4 1.26 11.102 3.78 14.108 2.52 3.005 6.11 4.507 10.762 4.507 3.684 0 6.763-0.676 9.237-2.035 2.47-1.356 4.82-3.1 7.05-5.235l7.71 18.034c-2.328 1.94-5.77 3.855-10.325 5.745-4.56 1.89-10.085 2.835-16.58 2.835m34.47-1.44v-97.15h24.287v29.523c2.037-1.455 4.51-2.74 7.417-3.854 2.91-1.115 6.4-1.673 10.473-1.673 8.53 0 14.907 2.425 19.125 7.273s6.326 11.683 6.326 20.506v45.375h-24.286v-42.467c0-4.072-0.775-7.054-2.327-8.944s-3.59-2.836-6.11-2.836c-2.132 0-4.12 0.485-5.962 1.455-1.84 0.968-3.394 1.986-4.654 3.052v49.74h-24.286z" + fill="#fff" + id="path1" + style="fill:#000000" /> + <g + transform="matrix(1 .21625 0 1 -40.867 -388.29)" + fill="#fff" + id="g3" + style="fill:#000000"> + <path + style="color:#000000;fill:#000000" + d="m160.16 353.9c-1.0274-0.0432-2.1572 0.14856-3.3457 0.60156l-107.36 40.92c-4.7542 1.812-8.582 7.1126-8.582 11.885v107.77c-0.000001 4.7722 3.8278 7.1538 8.582 5.3418l0.79297-0.30273c-0.19453-0.64689-0.30859-1.3586-0.30859-2.1426v-107.77c0-4.7722 3.843-10.076 8.6152-11.891l106.57-40.52c-0.66948-2.3606-2.517-3.7901-4.9551-3.8926z" + fill-opacity=".23457" + id="path2" /> + <path + style="color:#000000;fill:#000000" + d="m58.549 398.19c-4.7722 1.8146-8.6152 7.119-8.6152 11.891v107.77c0 4.7722 3.843 7.152 8.6152 5.3374l107.77-40.98c4.7722-1.8146 8.6133-7.1162 8.6133-11.888v-107.77c0-4.7722-3.8411-7.1547-8.6133-5.34l-107.77 40.98zm30.461 23.154 0.008-0.003c4.9574-1.885 8.4829-0.0134 9.7324 4.35l27.4-10.419c1.2473-5.3128 4.7509-9.8573 9.709-11.743 7.8748-2.9944 16.532 1.7998 19.234 10.653l6.457 21.138c2.7034 8.8528-1.5353 18.551-9.4102 21.545-6.9132 2.6287-14.427-0.74261-17.988-7.5955l-43.436 16.516c-3.5603 9.5608-11.076 18.647-17.99 21.276-7.8763 2.995-12.112-3.4805-9.4082-14.389l6.457-26.049c2.7027-10.91 11.358-22.286 19.234-25.281zm17.035 7.5595v8.8066l-7.0703 2.6885 6.7305 5.9798 6.7266 5.9813 6.7344-11.104 6.7305-11.098-6.6309 2.5214v-8.8027l-13.221 5.0272z" + id="path3" /> + </g> +</svg> diff --git a/src/static/locales/ar.json b/src/static/locales/ar.json index 0ade0a0f9..cdc8dd16f 100644 --- a/src/static/locales/ar.json +++ b/src/static/locales/ar.json @@ -303,6 +303,7 @@ "preferences.scan_install_locations.no_items_found": "لم يتم إيجاد عناصر إضافية في موقع التثبيت", "preferences.scan_install_locations.title": "جار الفحص....", "preferences.behavior": "الأداء", + "preferences.behavior.lightMode": "قم بتنشيط الوضع الساطع", "preferences.behavior.enable_tabs": "تفعيل النوافذ", "preferences.behavior.close_to_tray": "أبقي التطبيق في الخلفية حينما تغلق النافذة", "preferences.behavior.open_at_login": "تشغيل itch حين بدء تشغيل الحاسب", diff --git a/src/static/locales/bg.json b/src/static/locales/bg.json index 8d38951b3..ff67e4028 100644 --- a/src/static/locales/bg.json +++ b/src/static/locales/bg.json @@ -179,6 +179,7 @@ "outlinks.manage_collections": "Управление на колекциите", "preferences.install_location.is_default_short": "По подразбиране", "preferences.behavior": "Поведение", + "preferences.behavior.lightMode": "Активиране на ярък режим", "preferences.advanced.open_app_log": "Отваряне на журнала на приложението", "pick_install_upload.title": "Налични са няколко възможности за сваляне на „{{title}}“", "pick_install_upload.message": "Кой от файловете на „{{title}}“ искате да свалите?", diff --git a/src/static/locales/ca.json b/src/static/locales/ca.json index 62eb03f08..18d5a3b89 100644 --- a/src/static/locales/ca.json +++ b/src/static/locales/ca.json @@ -307,6 +307,7 @@ "preferences.scan_install_locations.no_items_found": "No s’han trobat elements addicionals a les ubicacions d’instal·lació", "preferences.scan_install_locations.title": "S’està cercant...", "preferences.behavior": "Comportament", + "preferences.behavior.lightMode": "Activa el mode brillant", "preferences.behavior.enable_tabs": "Activa les pestanyes", "preferences.behavior.close_to_tray": "Mantingues l’aplicació a la safata en tancar la finestra", "preferences.behavior.open_at_login": "Executa l’itch en engegar ’ordinador", diff --git a/src/static/locales/cs.json b/src/static/locales/cs.json index 46c62251b..6cdd2f6b2 100644 --- a/src/static/locales/cs.json +++ b/src/static/locales/cs.json @@ -246,6 +246,7 @@ "preferences.install_location.make_default_short": "Nastavit výchozí", "preferences.behavior": "Chování", "preferences.behavior.close_to_tray": "Při zavření okna nechat aplikaci v oznamovací oblasti", + "preferences.behavior.lightMode": "Aktivace jasného režimu", "preferences.behavior.open_at_login": "Spustit itch při spuštění počítače", "preferences.behavior.open_as_hidden": "Spustit itch se skrytým oknem", "preferences.behavior.open_at_login.error": "Předvolby automatického spuštění nemohly být uloženy: {{cause}}", diff --git a/src/static/locales/da.json b/src/static/locales/da.json index 74784c128..28b45e071 100644 --- a/src/static/locales/da.json +++ b/src/static/locales/da.json @@ -395,6 +395,7 @@ "preferences.scan_install_locations.no_items_found": "Ingen yderligere genstande fundet i installationslokationer", "preferences.scan_install_locations.title": "Scanner...", "preferences.behavior.enable_tabs": "Aktiver faneblade", + "preferences.behavior.lightMode": "Aktivér lys tilstand", "preferences.behavior.close_to_tray": "Behold appen i proceslinjen når vinduet lukkes", "preferences.behavior.open_at_login": "Start itch når min computer tænder", "preferences.behavior.open_as_hidden": "Åbn itch skjult ved opstart", diff --git a/src/static/locales/de.json b/src/static/locales/de.json index 66736bbbb..476202005 100644 --- a/src/static/locales/de.json +++ b/src/static/locales/de.json @@ -286,6 +286,7 @@ "preferences.install_location.is_default_short": "Standard", "preferences.install_location.make_default_short": "Als Standard einstellen", "preferences.behavior": "Verhalten", + "preferences.behavior.lightMode": "Aktivieren des Helligkeitsmodus", "preferences.behavior.close_to_tray": "Anwendung weiter im Infobereich anzeigen, wenn das Fenster geschlossen wird", "preferences.advanced": "Erweitert", "preferences.proxy_server_address": "HTTPS Proxy", diff --git a/src/static/locales/el.json b/src/static/locales/el.json index 5f6321679..2cdf12c63 100644 --- a/src/static/locales/el.json +++ b/src/static/locales/el.json @@ -315,6 +315,7 @@ "preferences.notifications.ready_notification": "Ειδοποίησε με όταν μια λήψη έχει εγκατασταθεί ή ενημερωθεί", "preferences.notifications": "Ειδοποιήσεις", "preferences.behavior.prevent_display_sleep": "Αποτροπή σβήσιμο οθόνης κατά την αναπαραγωγή παιχνιδιών", + "preferences.behavior.lightMode": "Ενεργοποίηση φωτεινής λειτουργίας", "preferences.behavior.open_as_hidden": "Άνοιγμα itch ως κρυμμένο στην εκκίνηση", "preferences.behavior.open_at_login": "Τρέξε το itch όταν ανοίγει ο υπολογιστής μου", "preferences.behavior": "Συμπεριφορά", diff --git a/src/static/locales/en.json b/src/static/locales/en.json index c79f61509..f8c37c515 100644 --- a/src/static/locales/en.json +++ b/src/static/locales/en.json @@ -301,6 +301,7 @@ "preferences.behavior": "Behavior", "preferences.behavior.enable_tabs": "Enable tabs", "preferences.behavior.close_to_tray": "Keep app in tray when closing window", + "preferences.behavior.lightMode": "Turn on light mode", "preferences.behavior.open_at_login": "Run itch when my computer starts", "preferences.behavior.open_as_hidden": "Open itch as hidden on startup", "preferences.behavior.open_at_login.error": diff --git a/src/static/locales/eo.json b/src/static/locales/eo.json index 0084e6c02..72505c3b6 100644 --- a/src/static/locales/eo.json +++ b/src/static/locales/eo.json @@ -320,6 +320,7 @@ "sandbox.setup.linux.detail": "Post kiam vi alklakas la butonon „Daŭrigi“, la sistemo petos vian pasvorton. Tio estas necesa nur la unuan fojon, kiam oni uzas aŭ ĝisdatigas la sablujon, kaj itch ne memoros vian pasvorton.", "preferences.behavior": "Konduto", "preferences.behavior.close_to_tray": "Konservi la aplikaĵon en la taskopleto post fermo de la fenestro", + "preferences.behavior.lightMode": "Aktivigu helan reĝimon", "grid.criterion.search": "Serĉado…", "grid.filters.options.compatible": "Kongruaj", "grid.filters.options.installed": "Instalitaj", diff --git a/src/static/locales/es.json b/src/static/locales/es.json index 36e780523..5a9f55f7f 100644 --- a/src/static/locales/es.json +++ b/src/static/locales/es.json @@ -292,6 +292,7 @@ "sandbox.setup.linux.detail": "Después de hacer clic en 'Seguir', se te pedirá tu contraseña. Esto sólo es necesario la primera vez que se inicie el aislamiento de procesos de itch, y tu contraseña nunca será vista o guardada por itch.", "preferences.behavior": "Comportamiento", "preferences.behavior.close_to_tray": "Mantener la aplicación en la bandeja de sistema cuando se cierre la ventana", + "preferences.behavior.lightMode": "Activar modo luminoso", "preferences.advanced": "Avanzado", "preferences.advanced.open_app_log": "Abrir registro de la aplicación", "pick_install_upload.title": "Múltiples descargas están disponibles para {{title}}", diff --git a/src/static/locales/fi.json b/src/static/locales/fi.json index 1d6adea02..84b75abf4 100644 --- a/src/static/locales/fi.json +++ b/src/static/locales/fi.json @@ -235,6 +235,7 @@ "preferences.install_location.make_default_short": "Aseta oletukseksi", "preferences.behavior": "Käyttäytyminen", "preferences.behavior.close_to_tray": "Suljettaessa ohjelma pidä se käynnissä palkissa", + "preferences.behavior.lightMode": "Aktivoi kirkas tila", "preferences.behavior.open_at_login": "Käynnistä itch tietokoneen kanssa", "preferences.behavior.open_as_hidden": "Avaa itch käynnistäessä piilotettuna", "preferences.behavior.open_at_login.error": "Automaattisen käynnistyksen asetuksia ei voitu asettaa koska: {{cause}}", diff --git a/src/static/locales/fr.json b/src/static/locales/fr.json index efa96f95d..e57892825 100644 --- a/src/static/locales/fr.json +++ b/src/static/locales/fr.json @@ -296,6 +296,7 @@ "outlinks.manage_collections": "Gérer mes collections", "preferences.behavior": "Comportement", "preferences.behavior.close_to_tray": "Maintenir l'application en tâche de fond à la fermeture de la fenêtre", + "preferences.behavior.lightMode": "Activer le mode lumineux", "pick_install_upload.title": "Plusieurs téléchargements sont disponibles pour {{title}}", "pick_install_upload.message": "Quel fichier souhaitez-vous télécharger pour {{title}} ?", "pick_install_upload.detail": "Nous vous redemanderons dès que de nouveaux téléchargements seront disponibles.", diff --git a/src/static/locales/in.json b/src/static/locales/in.json index 7be481129..75de48699 100644 --- a/src/static/locales/in.json +++ b/src/static/locales/in.json @@ -216,6 +216,7 @@ "preferences.install_location.make_default_short": "Jadikan default", "preferences.behavior": "Perilaku", "preferences.behavior.close_to_tray": "Jaga aplikasi pada tray saat menutup jendela", + "preferences.behavior.lightMode": "Mengaktifkan mode terang", "preferences.behavior.open_at_login": "Jalankan itch saat komputer saya menyala", "preferences.behavior.open_as_hidden": "Buka itch tersembunyi saat startup", "preferences.behavior.open_at_login.error": "Pengaturan mulai-otomatis tidak dapat diterapkan: {{cause}}", diff --git a/src/static/locales/it.json b/src/static/locales/it.json index eff3e3e85..c1f5eba86 100644 --- a/src/static/locales/it.json +++ b/src/static/locales/it.json @@ -198,6 +198,7 @@ "preferences.install_location.make_default_short": "Imposta predefinito", "preferences.behavior": "Comportamento", "preferences.behavior.close_to_tray": "Tieni aperta l'app quando chiudi la finestra", + "preferences.behavior.lightMode": "Attivare la modalità luminosa", "preferences.language.auto": "Lingua del sistema ({{language}})", "preferences.advanced": "Avanzate", "preferences.advanced.open_app_log": "Apri log dell'app", diff --git a/src/static/locales/ja.json b/src/static/locales/ja.json index 76bb9035a..306c053c4 100644 --- a/src/static/locales/ja.json +++ b/src/static/locales/ja.json @@ -257,6 +257,7 @@ "preferences.security.sandbox.description": "itch.ioサンドボックスは、インストールしたゲームに含まれた有害データにより重要なデータが盗まれる事を防止します。完全な安全保障はないですが、itch.ioサンドボックス内でゲームを実行すると、通常よりも遥かに安全です。", "preferences.behavior": "動作", "preferences.behavior.close_to_tray": "ウィンドウを閉じた際にタスクトレイに隠す", + "preferences.behavior.lightMode": "ブライトモードの起動", "preferences.advanced": "高度な設定", "preferences.advanced.open_app_log": "アプリログを開く", "pick_install_upload.title": "{{title}}には複数のダウンロードファイルあり", diff --git a/src/static/locales/ko.json b/src/static/locales/ko.json index 17fe084da..22ae36440 100644 --- a/src/static/locales/ko.json +++ b/src/static/locales/ko.json @@ -282,6 +282,7 @@ "preferences.behavior": "행동", "preferences.behavior.enable_tabs": "탭 활성화", "preferences.behavior.close_to_tray": "창을 닫아도 트레이에 앱 표시하기", + "preferences.behavior.lightMode": "밝은 모드 활성화", "preferences.behavior.open_at_login": "컴퓨터가 켜질 때 itch 실행", "preferences.behavior.open_at_login.causes.no_desktop_file": ".desktop 파일을 찾을 수 없습니다. 이것은 시스템 패키지에서 설정하지 않았을 때 일어나는 현상입니다. 자세한 정보는 {{linux_install_page}}을(를) 확인하세요.", "preferences.language.auto": "시스템 언어 {{language}}", diff --git a/src/static/locales/nb.json b/src/static/locales/nb.json index 415a3e273..19dfb9cb8 100644 --- a/src/static/locales/nb.json +++ b/src/static/locales/nb.json @@ -221,6 +221,7 @@ "preferences.install_location.is_default_short": "Standard", "preferences.install_location.make_default_short": "Gjør til standard", "preferences.behavior": "Oppførsel", + "preferences.behavior.lightMode": "Aktivere lyssterk modus", "preferences.advanced": "Avansert", "preferences.advanced.open_app_log": "Åpne applikasjonslogg", "pick_update_upload.message": "Hvilken fil vil du oppdatere til for {{title}}?", diff --git a/src/static/locales/nl.json b/src/static/locales/nl.json index 2d71d770c..3d9b164fb 100644 --- a/src/static/locales/nl.json +++ b/src/static/locales/nl.json @@ -143,6 +143,7 @@ "preferences.security.sandbox.title": "itch.io sandbox inschakelen", "preferences.security.sandbox.description": "De itch.io sandbox zal proberen te voorkomen dat de gedownloade spellen geen schade verrichten of gevoelige data stelen. Alhoewel het geen complete veiligheid garandeert, is het veel veiliger om spellen in de itch.io sandbox uit te voeren.", "preferences.behavior": "Gedrag", + "preferences.behavior.lightMode": "Activeer heldere modus", "action.name.play": "Nu spelen", "action.name.editor": "Editor", "action.name.forums": "Forums", diff --git a/src/static/locales/pl.json b/src/static/locales/pl.json index cb9eccd3c..e90f6f597 100644 --- a/src/static/locales/pl.json +++ b/src/static/locales/pl.json @@ -307,6 +307,7 @@ "preferences.security.sandbox.description": "Piaskownica itch.io próbuje uniemożliwić pobranym grom wyrządzanie szkód lub kradzież ważnych danych. Mimo że nie gwarantuje to całkowitej ochrony, uruchamianie gier w piaskownicy jest znacznie bezpieczniejsze.", "preferences.behavior": "Zachowanie aplikacji", "preferences.behavior.close_to_tray": "Pozostaw aplikację w pasku zadań po zamknięciu okna", + "preferences.behavior.lightMode": "Aktywacja trybu jasnego", "preferences.behavior.manual_game_updates": "Zapytaj przed aktualizacją", "preferences.notifications": "Powiadomienia", "preferences.notifications.ready_notification": "Powiadom mnie gdy instalacja lub aktualizacja zostanie zakończona", diff --git a/src/static/locales/pt_BR.json b/src/static/locales/pt_BR.json index 080649880..a963f88b6 100644 --- a/src/static/locales/pt_BR.json +++ b/src/static/locales/pt_BR.json @@ -290,6 +290,7 @@ "outlinks.manage_collections": "Gerenciar coleções", "preferences.behavior": "Comportamento", "preferences.behavior.close_to_tray": "Manter ícone na barra de tarefas ao fechar a janela", + "preferences.behavior.lightMode": "Ativar o modo brilhante", "preferences.advanced": "Avançado", "pick_install_upload.title": "Há múltiplos downloads disponíveis para {{title}}", "pick_install_upload.message": "Qual arquivo deseja baixar para {{title}}?", diff --git a/src/static/locales/pt_PT.json b/src/static/locales/pt_PT.json index 0670a23eb..ed2639042 100644 --- a/src/static/locales/pt_PT.json +++ b/src/static/locales/pt_PT.json @@ -318,6 +318,7 @@ "preferences.scan_install_locations.title": "A procurar...", "preferences.behavior": "Comportamento", "preferences.behavior.enable_tabs": "Ativar separadores", + "preferences.behavior.lightMode": "Ativar o modo brilhante", "preferences.behavior.close_to_tray": "Manter a aplicação na barra de tarefas ao fechar a janela", "preferences.behavior.open_at_login": "Executar o itch ao iniciar o computador", "preferences.behavior.open_as_hidden": "Iniciar o itch em modo oculto durante a inicialização do sistema", diff --git a/src/static/locales/ro.json b/src/static/locales/ro.json index b303a9584..5e7f0c74e 100644 --- a/src/static/locales/ro.json +++ b/src/static/locales/ro.json @@ -231,6 +231,7 @@ "preferences.advanced.open_app_log": "Deschide jurnalul", "grid.item.review": "Scrie o recenzie", "preferences.behavior.close_to_tray": "Pune aplicaţia în fundal când închizi fereastra", + "preferences.behavior.lightMode": "Activați modul luminos", "pick_install_upload.title": "Sunt disponibile mai multe fişiere pentru {{title}}", "pick_install_upload.message": "Pe care fişier vrei să-l descarci pentru {{title}}?", "pick_install_upload.detail": "O să te întrebăm din nou când devin disponibile fişiere noi.", diff --git a/src/static/locales/ru.json b/src/static/locales/ru.json index 0163bedf4..41ad43d4c 100644 --- a/src/static/locales/ru.json +++ b/src/static/locales/ru.json @@ -306,6 +306,7 @@ "outlinks.manage_collections": "Управление коллекциями", "preferences.behavior": "Поведение", "preferences.behavior.close_to_tray": "Сворачиваться в системный трей при закрытии окна", + "preferences.behavior.lightMode": "Активация яркого режима", "outlinks.open_dashboard": "Кабинет разработчика", "menu.file.new_tab": "Новая вкладка", "preferences.proxy_server_address": "HTTPS прокси", diff --git a/src/static/locales/sr.json b/src/static/locales/sr.json index 8a433bf83..c5afa6e51 100644 --- a/src/static/locales/sr.json +++ b/src/static/locales/sr.json @@ -160,6 +160,7 @@ "preferences.install_locations": "Путање за инсталацију", "preferences.behavior": "Понашање", "preferences.behavior.close_to_tray": "Задржи програм у системској касети након уклањања прозора", + "preferences.behavior.lightMode": "Активирајте светли режим", "preferences.language": "Језик", "preferences.language.auto": "Језик система ({{language}})", "preferences.language.get_involved": "Помози да се {{name}} преведе на твој језик!", diff --git a/src/static/locales/sv.json b/src/static/locales/sv.json index 265da4528..6d0f74490 100644 --- a/src/static/locales/sv.json +++ b/src/static/locales/sv.json @@ -195,6 +195,7 @@ "menu.help.about": "Om", "menu.view.view": "Visa", "preferences.behavior.close_to_tray": "Behåll programmet i aktivitetsfältet när fönstret stängs", + "preferences.behavior.lightMode": "Aktivera ljusläge", "preferences.advanced": "Avancerat", "preferences.advanced.open_app_log": "Öppna logg", "pick_install_upload.title": "Flera nedladdningar finns tillgängliga för {{title}}", diff --git a/src/static/locales/tr.json b/src/static/locales/tr.json index 3e46594b2..dac50bc97 100644 --- a/src/static/locales/tr.json +++ b/src/static/locales/tr.json @@ -160,6 +160,7 @@ "preferences.install_locations": "Kurulum lokasyonları", "preferences.behavior": "Davranış", "preferences.behavior.close_to_tray": "Pencere kapatıldığında programı açık tut", + "preferences.behavior.lightMode": "Parlak modu etkinleştirin", "preferences.language": "Dil", "preferences.language.auto": "Sistem dili ({{language}})", "preferences.language.get_involved": "{{name}}'i dilinize çevirmeye yardımcı olun!", diff --git a/src/static/locales/uk.json b/src/static/locales/uk.json index 0ca559383..7b2ac9d93 100644 --- a/src/static/locales/uk.json +++ b/src/static/locales/uk.json @@ -284,6 +284,7 @@ "preferences.behavior": "Поведінка", "preferences.behavior.enable_tabs": "Ввімкнути вкладки", "preferences.behavior.close_to_tray": "Тримати застосунок в фоновому режимі при закритті вікна", + "preferences.behavior.lightMode": "Увімкнути яскравий режим", "preferences.behavior.open_at_login": "Запускати itch при ввімкненні комп'ютера", "preferences.behavior.open_as_hidden": "На старті ОС запускати itch у фоновому режимі", "preferences.behavior.open_at_login.error": "Налаштування автозапуску не можуть бути прийняті: {{cause}}", diff --git a/src/static/locales/zh.json b/src/static/locales/zh.json index 7f9d42270..985c3e499 100644 --- a/src/static/locales/zh.json +++ b/src/static/locales/zh.json @@ -236,6 +236,7 @@ "preferences.notifications.ready_notification": "当下载或更新完成后通知我", "preferences.notifications": "通知", "preferences.behavior.manual_game_updates": "在更新前询问", + "preferences.behavior.lightMode": "激活明亮模式", "preferences.behavior.open_at_login.causes.no_desktop_file": "未找到 .desktop 文件。如果您不是从系统软件包中安装的,那么这是正常情况。请点击 {{linux_install_page}} 查看详情。", "preferences.behavior.open_at_login": "开机启动 itch", "preferences.behavior.open_as_hidden": "开机启动 itch 时在后台运行",