diff --git a/webui/dev/index.tsx b/webui/dev/index.tsx index d02d9f422..0ecb266b6 100644 --- a/webui/dev/index.tsx +++ b/webui/dev/index.tsx @@ -16,41 +16,64 @@ import { createMuiTheme } from '@material-ui/core'; import { Main } from '../src/main'; import { ExtensionRegistryService } from '../src/extension-registry-service'; import createPageSettings from './page-settings'; +import useMediaQuery from '@material-ui/core/useMediaQuery'; // This file is the main entry point for the development setup. // The production code is at https://github.com/eclipse/open-vsx.org -const theme = createMuiTheme({ - palette: { - primary: { main: '#eeeeee', contrastText: '#3f3841', dark: '#565157' }, - secondary: { main: '#a60ee5', contrastText: '#edf5ea' } - }, - breakpoints: { - values: { - xs: 340, - sm: 550, - md: 800, - lg: 1040, - xl: 1240 - } - } -}); - let serverHost = location.hostname; if (serverHost.startsWith('3000-')) { // The frontend runs on port 3000, but the server runs on port 8080 serverHost = '8080-' + serverHost.substring(5); } -const service = new ExtensionRegistryService(`${location.protocol}//${serverHost}`); -const pageSettings = createPageSettings(theme); +const App = () => { + const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)'); + +const theme = React.useMemo( + () => + createMuiTheme({ + palette: { + primary: { + main: prefersDarkMode ? '#444' : '#eeeeee', + dark: prefersDarkMode ? '#f4f4f4' : '#565157' + }, + secondary: { + main: prefersDarkMode ? '#c160ef' : '#a60ee5', + contrastText: '#edf5ea', + light: prefersDarkMode ? '#777' : '#fff', + dark: prefersDarkMode ? '#333' : '#fff', + }, + type: prefersDarkMode ? 'dark' : 'light' + }, + breakpoints: { + values: { + xs: 340, + sm: 550, + md: 800, + lg: 1040, + xl: 1240 + } + } + }), + [prefersDarkMode], +); + + const service = new ExtensionRegistryService(`${location.protocol}//${serverHost}`); + const pageSettings = createPageSettings(theme, prefersDarkMode); + + return ( + +
+ + ); +} const node = document.getElementById('main'); ReactDOM.render( - -
- + , node); diff --git a/webui/dev/openvsx-registry-logo.tsx b/webui/dev/openvsx-registry-logo.tsx new file mode 100644 index 000000000..42e7e450a --- /dev/null +++ b/webui/dev/openvsx-registry-logo.tsx @@ -0,0 +1,27 @@ +/******************************************************************************** + * Copyright (c) 2019 TypeFox and others + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + ********************************************************************************/ + +import * as React from "react"; + +function OpenVSXLogo(props: { className: string, prefersDarkMode: boolean }) { + return ( + + + + + + ); +} export default OpenVSXLogo; \ No newline at end of file diff --git a/webui/dev/page-settings.tsx b/webui/dev/page-settings.tsx index 9142cdb60..978e295a2 100644 --- a/webui/dev/page-settings.tsx +++ b/webui/dev/page-settings.tsx @@ -17,8 +17,9 @@ import { Extension } from '../src/extension-registry-types'; import { PageSettings, Styleable } from '../src/page-settings'; import { ExtensionListRoutes } from '../src/pages/extension-list/extension-list-container'; import About from './about'; +import OpenVSXLogo from './openvsx-registry-logo'; -export default function createPageSettings(theme: Theme): PageSettings { +export default function createPageSettings(theme: Theme, prefersDarkMode: boolean): PageSettings { const toolbarStyle = makeStyles({ logo: { width: 'auto', @@ -29,11 +30,9 @@ export default function createPageSettings(theme: Theme): PageSettings { }); const toolbarContent = () => - Open VSX Registry + ; - + const footerStyle = makeStyles({ repositoryLink: { display: 'flex', diff --git a/webui/dev/static/openvsx-registry.svg b/webui/dev/static/openvsx-registry.svg deleted file mode 100644 index b18eb70a6..000000000 --- a/webui/dev/static/openvsx-registry.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webui/src/main.css b/webui/src/main.css index 354fcf99e..a423f27e5 100644 --- a/webui/src/main.css +++ b/webui/src/main.css @@ -1,7 +1,20 @@ +* { + line-height: 1.6; +} + html, body, #main, .extension-list-container { height: 100%; } +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.1; +} + img { object-fit: contain; } diff --git a/webui/src/main.tsx b/webui/src/main.tsx index b0be200ae..9bbf34192 100644 --- a/webui/src/main.tsx +++ b/webui/src/main.tsx @@ -148,6 +148,7 @@ class MainComponent extends React.Component } /> {AdditionalRoutes ? : null} @@ -187,6 +188,7 @@ export namespace MainComponent { export interface Props extends WithStyles { service: ExtensionRegistryService; pageSettings: PageSettings; + prefersDarkMode: boolean; } export interface State { diff --git a/webui/src/pages/extension-detail/extension-detail-overview.tsx b/webui/src/pages/extension-detail/extension-detail-overview.tsx index 8ebfabed8..9ecf1da95 100644 --- a/webui/src/pages/extension-detail/extension-detail-overview.tsx +++ b/webui/src/pages/extension-detail/extension-detail-overview.tsx @@ -31,7 +31,13 @@ const overviewStyles = (theme: Theme) => createStyles({ display: 'flex', [theme.breakpoints.down('lg')]: { flexDirection: 'column', - } + }, + 'h1': { + margin: '4.5rem 0 3rem' + }, + 'h2': { + marginBottom: '3.5rem 0 2.5rem' + }, }, resourcesWrapper: { margin: "4rem 0", @@ -60,14 +66,14 @@ const overviewStyles = (theme: Theme) => createStyles({ }, '& code': { whiteSpace: 'pre', - backgroundColor: '#f2f2f2', + backgroundColor: theme.palette.secondary.light, padding: 2 }, '& h2': { borderBottom: '1px solid #eee' }, '& pre': { - background: '#f2f2f2', + background: theme.palette.secondary.light, padding: '10px 5px', '& code': { padding: 0, @@ -85,7 +91,7 @@ const overviewStyles = (theme: Theme) => createStyles({ }, '& th': { textAlign: 'start', - background: '#eee' + background: theme.palette.secondary.dark } } }, diff --git a/webui/src/pages/extension-detail/extension-detail.tsx b/webui/src/pages/extension-detail/extension-detail.tsx index 2562d55de..de10ac904 100644 --- a/webui/src/pages/extension-detail/extension-detail.tsx +++ b/webui/src/pages/extension-detail/extension-detail.tsx @@ -66,7 +66,7 @@ const detailStyles = (theme: Theme) => createStyles({ marginBottom: theme.spacing(1) }, head: { - backgroundColor: theme.palette.grey[200] + backgroundColor: theme.palette.secondary.dark, }, alignVertically: { display: 'flex', @@ -165,10 +165,12 @@ export class ExtensionDetailComponent extends React.Component - + @@ -213,62 +215,64 @@ export class ExtensionDetailComponent extends React.Component - - {extension.displayName || extension.name} {extension.preview ? - preview - : ''} - - - - {this.renderAccessInfo(extension, themeClass)}  - {extension.namespace} - - - - - Published by { - extension.publishedBy.avatarUrl ? - - {extension.publishedBy.loginName}  - - : extension.publishedBy.loginName - } + return ( + + + {extension.displayName || extension.name} {extension.preview ? + preview + : ''} + + + + {this.renderAccessInfo(extension, themeClass)}  + {extension.namespace} + + + + + Published by { + extension.publishedBy.avatarUrl ? + + {extension.publishedBy.loginName}  + + : extension.publishedBy.loginName + } + + + {this.renderLicense(extension, themeClass)} - - {this.renderLicense(extension, themeClass)} - - - {extension.description} - - - -  {extension.downloadCount || 0} {extension.downloadCount === 1 ? 'download' : 'downloads'} + + {extension.description} - - + - - ({extension.reviewCount}) +  {extension.downloadCount || 0} {extension.downloadCount === 1 ? 'download' : 'downloads'} - + + + + + ({extension.reviewCount}) + + + - ; + ); } protected getRoundedRating(rating: number): number { @@ -339,6 +343,7 @@ export namespace ExtensionDetailComponent { service: ExtensionRegistryService; pageSettings: PageSettings; setError: (err: Error | Partial) => void; + prefersDarkMode: boolean; } export interface State { extension?: Extension; diff --git a/webui/src/pages/extension-list/extension-list-header.tsx b/webui/src/pages/extension-list/extension-list-header.tsx index 10e987e37..4f90a9511 100644 --- a/webui/src/pages/extension-list/extension-list-header.tsx +++ b/webui/src/pages/extension-list/extension-list-header.tsx @@ -63,7 +63,11 @@ const headerStyles = (theme: Theme) => createStyles({ iconButton: { backgroundColor: theme.palette.secondary.main, borderRadius: '0 4px 4px 0', - padding: theme.spacing(1) + padding: theme.spacing(1), + transition: 'all 0s', + '&:hover': { + filter: 'invert(100%)', + } }, placeholder: { opacity: 0.4 diff --git a/webui/src/pages/user/avatar.tsx b/webui/src/pages/user/avatar.tsx index 74fa4bd2a..0841023dc 100644 --- a/webui/src/pages/user/avatar.tsx +++ b/webui/src/pages/user/avatar.tsx @@ -35,6 +35,9 @@ const avatarStyle = (theme: Theme) => createStyles({ border: 'none', background: 'none', padding: 0 + }, + logoutButton: { + color: theme.palette.primary.dark, } }); @@ -110,7 +113,7 @@ class UserAvatarComponent extends React.Component diff --git a/webui/src/pages/user/generate-token-dialog.tsx b/webui/src/pages/user/generate-token-dialog.tsx index 8bf1720d1..908b6e1d2 100644 --- a/webui/src/pages/user/generate-token-dialog.tsx +++ b/webui/src/pages/user/generate-token-dialog.tsx @@ -36,6 +36,11 @@ const tokensDialogStyle = (theme: Theme) => createStyles({ }, buttonWrapper: { position: 'relative' + }, + generateTokenButton: { + '&:hover': { + color: theme.palette.primary.dark, + } } }); @@ -163,7 +168,9 @@ class GenerateTokenDialogComponent extends React.Component + color="secondary" + className={this.props.classes.generateTokenButton} + > Generate Token