Merge pull request #405 from 0xProject/refactor/docs-redesign

Re-design Wiki + Doc pages
This commit is contained in:
Fabio Berger
2018-02-16 07:45:55 -08:00
committed by GitHub
18 changed files with 365 additions and 170 deletions

View File

@@ -61,7 +61,8 @@ a {
*/ */
::-webkit-scrollbar { ::-webkit-scrollbar {
-webkit-appearance: none; -webkit-appearance: none;
width: 7px; width: 4px;
height: 2px;
} }
::-webkit-scrollbar-thumb { ::-webkit-scrollbar-thumb {
border-radius: 4px; border-radius: 4px;
@@ -85,19 +86,28 @@ a {
} }
code { code {
font-family: 'Roboto'; border: 1px solid #e3eefe;
background-color: #f3f4f4; font-family: 'Roboto Mono';
color: rgb(36, 41, 46); background-color: #f2f6ff !important; // lightBlue
padding: 3px;
&.hljs {
background-color: #dde4e9 !important; // blue gray
border-left: 5px solid #0091ea !important; // colors.lightBlueA700
padding: 30px;
}
} }
#wiki { #wiki {
p {
color: #515151; // grey750
fontsize: 15;
}
a {
color: #1d5cde; // linkBlue
}
h1,
h2,
h3,
h4 {
padding-top: 15px;
}
p, p,
blockquote, blockquote,
ol, ol,

View File

@@ -0,0 +1,71 @@
/**
* GitHub Gist Theme
* Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro
*/
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 760 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -12,7 +12,7 @@
<title>0x: The Protocol for Trading Tokens</title> <title>0x: The Protocol for Trading Tokens</title>
<link rel="icon" type="image/png" href="/images/favicon/favicon-2-32x32.png" sizes="32x32" /> <link rel="icon" type="image/png" href="/images/favicon/favicon-2-32x32.png" sizes="32x32" />
<link rel="icon" type="image/png" href="/images/favicon/favicon-2-16x16.png" sizes="16x16" /> <link rel="icon" type="image/png" href="/images/favicon/favicon-2-16x16.png" sizes="16x16" />
<link rel="stylesheet" href="/css/atom-one-light.css"> <link rel="stylesheet" href="/css/github-gist.css">
<link rel="stylesheet" href="/css/material-design-iconic-font.min.css"> <link rel="stylesheet" href="/css/material-design-iconic-font.min.css">
<link rel="stylesheet" href="/css/roboto.css"> <link rel="stylesheet" href="/css/roboto.css">
<link rel="stylesheet" href="/css/roboto_mono.css"> <link rel="stylesheet" href="/css/roboto_mono.css">

View File

@@ -228,6 +228,7 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
openSecondary={true} openSecondary={true}
onRequestChange={this._onMenuButtonClick.bind(this)} onRequestChange={this._onMenuButtonClick.bind(this)}
> >
<div className="clearfix">
{this._renderPortalMenu()} {this._renderPortalMenu()}
{this._renderDocsMenu()} {this._renderDocsMenu()}
{this._renderWiki()} {this._renderWiki()}
@@ -274,6 +275,7 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
FAQ FAQ
</MenuItem> </MenuItem>
</Link> </Link>
</div>
</Drawer> </Drawer>
); );
} }
@@ -288,12 +290,10 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
const sectionTitle = `${this.props.docsInfo.displayName} Docs`; const sectionTitle = `${this.props.docsInfo.displayName} Docs`;
return ( return (
<div className="lg-hide md-hide"> <div className="lg-hide md-hide">
<div className="pl1 py1" style={{ backgroundColor: colors.lightGrey }}>
{sectionTitle}
</div>
<NestedSidebarMenu <NestedSidebarMenu
topLevelMenu={this.props.menu} topLevelMenu={this.props.menu}
menuSubsectionsBySection={this.props.menuSubsectionsBySection} menuSubsectionsBySection={this.props.menuSubsectionsBySection}
title={this.props.docsInfo.displayName}
shouldDisplaySectionHeaders={false} shouldDisplaySectionHeaders={false}
onMenuItemClick={this._onMenuButtonClick.bind(this)} onMenuItemClick={this._onMenuButtonClick.bind(this)}
selectedVersion={this.props.docsVersion} selectedVersion={this.props.docsVersion}
@@ -310,12 +310,10 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
return ( return (
<div className="lg-hide md-hide"> <div className="lg-hide md-hide">
<div className="pl1 py1" style={{ backgroundColor: colors.lightGrey }}>
0x Protocol Wiki
</div>
<NestedSidebarMenu <NestedSidebarMenu
topLevelMenu={this.props.menuSubsectionsBySection} topLevelMenu={this.props.menuSubsectionsBySection}
menuSubsectionsBySection={this.props.menuSubsectionsBySection} menuSubsectionsBySection={this.props.menuSubsectionsBySection}
title="Wiki"
shouldDisplaySectionHeaders={false} shouldDisplaySectionHeaders={false}
onMenuItemClick={this._onMenuButtonClick.bind(this)} onMenuItemClick={this._onMenuButtonClick.bind(this)}
/> />

View File

@@ -8,7 +8,6 @@ const styles: Styles = {
fontSize: 11, fontSize: 11,
height: 10, height: 10,
borderRadius: 5, borderRadius: 5,
marginTop: 25,
lineHeight: 0.9, lineHeight: 0.9,
fontFamily: 'Roboto Mono', fontFamily: 'Roboto Mono',
marginLeft: 3, marginLeft: 3,

View File

@@ -37,6 +37,7 @@ import { constants } from 'ts/utils/constants';
import { docUtils } from 'ts/utils/doc_utils'; import { docUtils } from 'ts/utils/doc_utils';
import { utils } from 'ts/utils/utils'; import { utils } from 'ts/utils/utils';
const TOP_BAR_HEIGHT = 60;
const SCROLL_TOP_ID = 'docsScrollTop'; const SCROLL_TOP_ID = 'docsScrollTop';
const networkNameToColor: { [network: string]: string } = { const networkNameToColor: { [network: string]: string } = {
@@ -67,7 +68,7 @@ const styles: Styles = {
right: 0, right: 0,
overflowZ: 'hidden', overflowZ: 'hidden',
overflowY: 'scroll', overflowY: 'scroll',
minHeight: 'calc(100vh - 1px)', minHeight: `calc(100vh - ${TOP_BAR_HEIGHT}px)`,
WebkitOverflowScrolling: 'touch', WebkitOverflowScrolling: 'touch',
}, },
menuContainer: { menuContainer: {
@@ -111,7 +112,6 @@ export class Documentation extends React.Component<DocumentationAllProps, Docume
availableDocVersions={this.props.availableDocVersions} availableDocVersions={this.props.availableDocVersions}
menu={this.props.docsInfo.getMenu(this.props.docsVersion)} menu={this.props.docsInfo.getMenu(this.props.docsVersion)}
menuSubsectionsBySection={menuSubsectionsBySection} menuSubsectionsBySection={menuSubsectionsBySection}
shouldFullWidth={true}
docsInfo={this.props.docsInfo} docsInfo={this.props.docsInfo}
/> />
{_.isUndefined(this.state.docAgnosticFormat) ? ( {_.isUndefined(this.state.docAgnosticFormat) ? (
@@ -129,33 +129,44 @@ export class Documentation extends React.Component<DocumentationAllProps, Docume
</div> </div>
</div> </div>
) : ( ) : (
<div className="mx-auto flex" style={{ color: colors.grey800, height: 43 }}> <div style={{ width: '100%', height: '100%', backgroundColor: colors.gray40 }}>
<div className="relative col md-col-3 lg-col-3 lg-pl0 md-pl1 sm-hide xs-hide"> <div
className="mx-auto max-width-4 flex"
style={{ color: colors.grey800, height: `calc(100vh - ${TOP_BAR_HEIGHT}px)` }}
>
<div
className="relative sm-hide xs-hide"
style={{ width: '36%', height: `calc(100vh - ${TOP_BAR_HEIGHT}px)` }}
>
<div <div
className="border-right absolute" className="border-right absolute"
style={{ ...styles.menuContainer, ...styles.mainContainers }} style={{
...styles.menuContainer,
...styles.mainContainers,
height: `calc(100vh - ${TOP_BAR_HEIGHT}px)`,
}}
> >
<NestedSidebarMenu <NestedSidebarMenu
selectedVersion={this.props.docsVersion} selectedVersion={this.props.docsVersion}
versions={this.props.availableDocVersions} versions={this.props.availableDocVersions}
title={this.props.docsInfo.displayName}
topLevelMenu={this.props.docsInfo.getMenu(this.props.docsVersion)} topLevelMenu={this.props.docsInfo.getMenu(this.props.docsVersion)}
menuSubsectionsBySection={menuSubsectionsBySection} menuSubsectionsBySection={menuSubsectionsBySection}
docPath={this.props.docsInfo.websitePath} docPath={this.props.docsInfo.websitePath}
/> />
</div> </div>
</div> </div>
<div className="relative col lg-col-9 md-col-9 sm-col-12 col-12"> <div
<div id="documentation" style={styles.mainContainers} className="absolute"> className="relative col lg-col-9 md-col-9 sm-col-12 col-12"
style={{ backgroundColor: colors.white }}
>
<div id="documentation" style={styles.mainContainers} className="absolute px1">
<div id={SCROLL_TOP_ID} /> <div id={SCROLL_TOP_ID} />
<h1 className="md-pl2 sm-pl3">
<a href={this.props.docsInfo.packageUrl} target="_blank">
{this.props.docsInfo.displayName}
</a>
</h1>
{this._renderDocumentation()} {this._renderDocumentation()}
</div> </div>
</div> </div>
</div> </div>
</div>
)} )}
</div> </div>
); );
@@ -220,7 +231,7 @@ export class Documentation extends React.Component<DocumentationAllProps, Docume
}); });
return ( return (
<div key={`section-${sectionName}`} className="py2 pr3 md-pl2 sm-pl3"> <div key={`section-${sectionName}`} className="py2 pr3 md-pl2 sm-pl3">
<div className="flex"> <div className="flex pb2">
<div style={{ marginRight: 7 }}> <div style={{ marginRight: 7 }}>
<SectionHeader sectionName={sectionName} /> <SectionHeader sectionName={sectionName} />
</div> </div>

View File

@@ -28,8 +28,7 @@ const styles: Styles = {
color: colors.white, color: colors.white,
height: 11, height: 11,
borderRadius: 14, borderRadius: 14,
marginTop: 19, lineHeight: 0.9,
lineHeight: 0.8,
}, },
}; };
@@ -55,10 +54,11 @@ export class MethodBlock extends React.Component<MethodBlockProps, MethodBlockSt
onMouseOut={this._setAnchorVisibility.bind(this, false)} onMouseOut={this._setAnchorVisibility.bind(this, false)}
> >
{!method.isConstructor && ( {!method.isConstructor && (
<div className="flex"> <div className="flex pb2 pt2">
{(method as TypescriptMethod).isStatic && this._renderChip('Static')} {(method as TypescriptMethod).isStatic && this._renderChip('Static')}
{(method as SolidityMethod).isConstant && this._renderChip('Constant')} {(method as SolidityMethod).isConstant && this._renderChip('Constant')}
{(method as SolidityMethod).isPayable && this._renderChip('Payable')} {(method as SolidityMethod).isPayable && this._renderChip('Payable')}
<div style={{ lineHeight: 1.3 }}>
<AnchorTitle <AnchorTitle
headerSize={HeaderSizes.H3} headerSize={HeaderSizes.H3}
title={method.name} title={method.name}
@@ -66,6 +66,7 @@ export class MethodBlock extends React.Component<MethodBlockProps, MethodBlockSt
shouldShowAnchor={this.state.shouldShowAnchor} shouldShowAnchor={this.state.shouldShowAnchor}
/> />
</div> </div>
</div>
)} )}
<code className="hljs"> <code className="hljs">
<MethodSignature <MethodSignature
@@ -121,12 +122,17 @@ export class MethodBlock extends React.Component<MethodBlockProps, MethodBlockSt
style={{ borderBottom: '1px solid #f0f4f7' }} style={{ borderBottom: '1px solid #f0f4f7' }}
> >
<div className="pl2 col lg-col-4 md-col-4 sm-col-12 col-12"> <div className="pl2 col lg-col-4 md-col-4 sm-col-12 col-12">
<div className="bold">{parameter.name}</div> <div
className="bold"
style={{ overflow: 'hidden', whiteSpace: 'nowrap', textOverflow: 'ellipsis' }}
>
{parameter.name}
</div>
<div className="pt1" style={{ color: colors.grey, fontSize: 14 }}> <div className="pt1" style={{ color: colors.grey, fontSize: 14 }}>
{isOptional && 'optional'} {isOptional && 'optional'}
</div> </div>
</div> </div>
<div className="col lg-col-8 md-col-8 sm-col-12 col-12"> <div className="col lg-col-8 md-col-8 sm-col-12 col-12" style={{ paddingLeft: 5 }}>
{parameter.comment && <Comment comment={parameter.comment} />} {parameter.comment && <Comment comment={parameter.comment} />}
</div> </div>
</div> </div>

View File

@@ -1,5 +1,6 @@
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as React from 'react'; import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { DocsInfo } from 'ts/pages/documentation/docs_info'; import { DocsInfo } from 'ts/pages/documentation/docs_info';
import { Type } from 'ts/pages/documentation/type'; import { Type } from 'ts/pages/documentation/type';
import { Parameter, SolidityMethod, TypeDefinitionByName, TypescriptMethod } from 'ts/types'; import { Parameter, SolidityMethod, TypeDefinitionByName, TypescriptMethod } from 'ts/types';
@@ -22,26 +23,52 @@ const defaultProps = {
export const MethodSignature: React.SFC<MethodSignatureProps> = (props: MethodSignatureProps) => { export const MethodSignature: React.SFC<MethodSignatureProps> = (props: MethodSignatureProps) => {
const sectionName = constants.TYPES_SECTION_NAME; const sectionName = constants.TYPES_SECTION_NAME;
const parameters = renderParameters(props.method, props.docsInfo, sectionName, props.typeDefinitionByName); const parameters = renderParameters(props.method, props.docsInfo, sectionName, props.typeDefinitionByName);
const paramString = _.reduce(parameters, (prev: React.ReactNode, curr: React.ReactNode) => { const paramStringArray: any[] = [];
return [prev, ', ', curr]; // HACK: For now we don't put params on newlines if there are less then 2 of them.
// Ideally we would check the character length of the resulting method signature and
// if it exceeds the available space, put params on their own lines.
const hasMoreThenTwoParams = parameters.length > 2;
_.each(parameters, (param: React.ReactNode, i: number) => {
const finalParam = hasMoreThenTwoParams ? (
<span className="pl2" key={`param-${i}`}>
{param}
</span>
) : (
param
);
paramStringArray.push(finalParam);
const comma = hasMoreThenTwoParams ? (
<span key={`param-comma-${i}`}>
, <br />
</span>
) : (
', '
);
paramStringArray.push(comma);
}); });
if (!hasMoreThenTwoParams) {
paramStringArray.pop();
}
const methodName = props.shouldHideMethodName ? '' : props.method.name; const methodName = props.shouldHideMethodName ? '' : props.method.name;
const typeParameterIfExists = _.isUndefined((props.method as TypescriptMethod).typeParameter) const typeParameterIfExists = _.isUndefined((props.method as TypescriptMethod).typeParameter)
? undefined ? undefined
: renderTypeParameter(props.method, props.docsInfo, sectionName, props.typeDefinitionByName); : renderTypeParameter(props.method, props.docsInfo, sectionName, props.typeDefinitionByName);
return ( return (
<span> <span style={{ fontSize: 15 }}>
{props.method.callPath} {props.method.callPath}
{methodName} {methodName}
{typeParameterIfExists}({paramString}) {typeParameterIfExists}({hasMoreThenTwoParams && <br />}
{props.shouldUseArrowSyntax ? ' => ' : ': '}{' '} {paramStringArray})
{props.method.returnType && ( {props.method.returnType && (
<span>
{props.shouldUseArrowSyntax ? ' => ' : ': '}{' '}
<Type <Type
type={props.method.returnType} type={props.method.returnType}
sectionName={sectionName} sectionName={sectionName}
typeDefinitionByName={props.typeDefinitionByName} typeDefinitionByName={props.typeDefinitionByName}
docsInfo={props.docsInfo} docsInfo={props.docsInfo}
/> />
</span>
)} )}
</span> </span>
); );

View File

@@ -34,18 +34,13 @@ const styles: Styles = {
}, },
h1: { h1: {
fontSize: '1.8em', fontSize: '1.8em',
WebkitMarginBefore: '0.83em',
WebkitMarginAfter: '0.83em',
}, },
h2: { h2: {
fontSize: '1.5em', fontSize: '1.5em',
WebkitMarginBefore: '0.83em', fontWeight: 400,
WebkitMarginAfter: '0.83em',
}, },
h3: { h3: {
fontSize: '1.17em', fontSize: '1.17em',
WebkitMarginBefore: '1em',
WebkitMarginAfter: '1em',
}, },
}; };

View File

@@ -17,7 +17,7 @@ export class MarkdownCodeBlock extends React.Component<MarkdownCodeBlockProps, M
} }
public render() { public render() {
return ( return (
<span style={{ fontSize: 16 }}> <span style={{ fontSize: 14 }}>
<HighLight className={this.props.language || 'javascript'}>{this.props.literal}</HighLight> <HighLight className={this.props.language || 'javascript'}>{this.props.literal}</HighLight>
</span> </span>
); );

View File

@@ -6,6 +6,7 @@ import { Element as ScrollElement } from 'react-scroll';
import { AnchorTitle } from 'ts/pages/shared/anchor_title'; import { AnchorTitle } from 'ts/pages/shared/anchor_title';
import { MarkdownCodeBlock } from 'ts/pages/shared/markdown_code_block'; import { MarkdownCodeBlock } from 'ts/pages/shared/markdown_code_block';
import { HeaderSizes } from 'ts/types'; import { HeaderSizes } from 'ts/types';
import { colors } from 'ts/utils/colors';
import { utils } from 'ts/utils/utils'; import { utils } from 'ts/utils/utils';
interface MarkdownSectionProps { interface MarkdownSectionProps {
@@ -34,14 +35,14 @@ export class MarkdownSection extends React.Component<MarkdownSectionProps, Markd
const id = utils.getIdFromName(sectionName); const id = utils.getIdFromName(sectionName);
return ( return (
<div <div
className="pt2 pr3 md-pl2 sm-pl3 overflow-hidden" className="md-px1 sm-px2 overflow-hidden"
onMouseOver={this._setAnchorVisibility.bind(this, true)} onMouseOver={this._setAnchorVisibility.bind(this, true)}
onMouseOut={this._setAnchorVisibility.bind(this, false)} onMouseOut={this._setAnchorVisibility.bind(this, false)}
> >
<ScrollElement name={id}> <ScrollElement name={id}>
<div className="clearfix"> <div className="clearfix pt3">
<div className="col lg-col-8 md-col-8 sm-col-12"> <div className="col lg-col-8 md-col-8 sm-col-12">
<span style={{ textTransform: 'capitalize' }}> <span style={{ textTransform: 'capitalize', color: colors.grey700 }}>
<AnchorTitle <AnchorTitle
headerSize={this.props.headerSize} headerSize={this.props.headerSize}
title={sectionName} title={sectionName}
@@ -50,17 +51,19 @@ export class MarkdownSection extends React.Component<MarkdownSectionProps, Markd
/> />
</span> </span>
</div> </div>
<div className="col col-4 sm-hide xs-hide py2 right-align"> <div className="col col-4 sm-hide xs-hide right-align pr3" style={{ height: 28 }}>
{!_.isUndefined(this.props.githubLink) && ( {!_.isUndefined(this.props.githubLink) && (
<RaisedButton <a
href={this.props.githubLink} href={this.props.githubLink}
target="_blank" target="_blank"
label="Edit on Github" style={{ color: colors.linkBlue, textDecoration: 'none', lineHeight: 2.1 }}
icon={<i className="zmdi zmdi-github" style={{ fontSize: 23 }} />} >
/> Edit on Github
</a>
)} )}
</div> </div>
</div> </div>
<hr style={{ border: `1px solid ${colors.lightestGrey}` }} />
<ReactMarkdown source={this.props.markdownContent} renderers={{ CodeBlock: MarkdownCodeBlock }} /> <ReactMarkdown source={this.props.markdownContent} renderers={{ CodeBlock: MarkdownCodeBlock }} />
</ScrollElement> </ScrollElement>
</div> </div>

View File

@@ -11,12 +11,12 @@ import { utils } from 'ts/utils/utils';
interface NestedSidebarMenuProps { interface NestedSidebarMenuProps {
topLevelMenu: { [topLevel: string]: string[] }; topLevelMenu: { [topLevel: string]: string[] };
menuSubsectionsBySection: MenuSubsectionsBySection; menuSubsectionsBySection: MenuSubsectionsBySection;
title: string;
shouldDisplaySectionHeaders?: boolean; shouldDisplaySectionHeaders?: boolean;
onMenuItemClick?: () => void; onMenuItemClick?: () => void;
selectedVersion?: string; selectedVersion?: string;
versions?: string[]; versions?: string[];
docPath?: string; docPath?: string;
isSectionHeaderClickable?: boolean;
} }
interface NestedSidebarMenuState {} interface NestedSidebarMenuState {}
@@ -29,10 +29,20 @@ const styles: Styles = {
minHeight: 48, minHeight: 48,
}, },
menuItemInnerDivWithHeaders: { menuItemInnerDivWithHeaders: {
color: colors.grey800,
fontSize: 14,
lineHeight: 2, lineHeight: 2,
padding: 0,
}, },
}; };
const titleToIcon: { [title: string]: string } = {
'0x.js': 'zeroExJs.png',
'0x Connect': 'connect.png',
'0x Smart Contracts': 'contracts.png',
Wiki: 'wiki.png',
};
export class NestedSidebarMenu extends React.Component<NestedSidebarMenuProps, NestedSidebarMenuState> { export class NestedSidebarMenu extends React.Component<NestedSidebarMenuProps, NestedSidebarMenuState> {
public static defaultProps: Partial<NestedSidebarMenuProps> = { public static defaultProps: Partial<NestedSidebarMenuProps> = {
shouldDisplaySectionHeaders: true, shouldDisplaySectionHeaders: true,
@@ -44,17 +54,10 @@ export class NestedSidebarMenu extends React.Component<NestedSidebarMenuProps, N
if (this.props.shouldDisplaySectionHeaders) { if (this.props.shouldDisplaySectionHeaders) {
const id = utils.getIdFromName(sectionName); const id = utils.getIdFromName(sectionName);
return ( return (
<div key={`section-${sectionName}`} className="py1"> <div key={`section-${sectionName}`} className="py1" style={{ color: colors.grey800 }}>
<ScrollLink <div style={{ fontWeight: 'bold', fontSize: 15 }} className="py1">
to={id}
offset={-20}
duration={constants.DOCS_SCROLL_DURATION_MS}
containerId={constants.DOCS_CONTAINER_ID}
>
<div style={{ color: colors.grey, cursor: 'pointer' }} className="pb1">
{finalSectionName.toUpperCase()} {finalSectionName.toUpperCase()}
</div> </div>
</ScrollLink>
{this._renderMenuItems(menuItems)} {this._renderMenuItems(menuItems)}
</div> </div>
); );
@@ -64,6 +67,7 @@ export class NestedSidebarMenu extends React.Component<NestedSidebarMenuProps, N
}); });
return ( return (
<div> <div>
{this._renderEmblem()}
{!_.isUndefined(this.props.versions) && {!_.isUndefined(this.props.versions) &&
!_.isUndefined(this.props.selectedVersion) && !_.isUndefined(this.props.selectedVersion) &&
!_.isUndefined(this.props.docPath) && ( !_.isUndefined(this.props.docPath) && (
@@ -73,7 +77,32 @@ export class NestedSidebarMenu extends React.Component<NestedSidebarMenuProps, N
docPath={this.props.docPath} docPath={this.props.docPath}
/> />
)} )}
{navigation} <div className="pl1">{navigation}</div>
</div>
);
}
private _renderEmblem() {
return (
<div className="pt2 md-px1 sm-px2" style={{ color: colors.black, paddingBottom: 18 }}>
<div className="flex" style={{ fontSize: 25 }}>
<div className="robotoMono" style={{ fontWeight: 'bold' }}>
0x
</div>
<div className="pl2" style={{ lineHeight: 1.4, fontWeight: 300 }}>
docs
</div>
</div>
<div className="pl1" style={{ color: colors.grey350, paddingBottom: 9, paddingLeft: 14, height: 17 }}>
|
</div>
<div className="flex">
<div>
<img src={`/images/doc_icons/${titleToIcon[this.props.title]}`} width="24" />
</div>
<div className="pl1" style={{ fontWeight: 600, fontSize: 20, lineHeight: 1 }}>
{this.props.title}
</div>
</div>
</div> </div>
); );
} }
@@ -132,7 +161,7 @@ export class NestedSidebarMenu extends React.Component<NestedSidebarMenuProps, N
onTouchTap={this._onMenuItemClick.bind(this, name)} onTouchTap={this._onMenuItemClick.bind(this, name)}
style={{ minHeight: 35 }} style={{ minHeight: 35 }}
innerDivStyle={{ innerDivStyle={{
paddingLeft: 36, paddingLeft: 16,
fontSize: 14, fontSize: 14,
lineHeight: '35px', lineHeight: '35px',
}} }}

View File

@@ -1,5 +1,6 @@
import * as _ from 'lodash'; import * as _ from 'lodash';
import CircularProgress from 'material-ui/CircularProgress'; import CircularProgress from 'material-ui/CircularProgress';
import RaisedButton from 'material-ui/RaisedButton';
import * as React from 'react'; import * as React from 'react';
import DocumentTitle = require('react-document-title'); import DocumentTitle = require('react-document-title');
import { scroller } from 'react-scroll'; import { scroller } from 'react-scroll';
@@ -13,6 +14,7 @@ import { configs } from 'ts/utils/configs';
import { constants } from 'ts/utils/constants'; import { constants } from 'ts/utils/constants';
import { utils } from 'ts/utils/utils'; import { utils } from 'ts/utils/utils';
const TOP_BAR_HEIGHT = 60;
const WIKI_NOT_READY_BACKOUT_TIMEOUT_MS = 5000; const WIKI_NOT_READY_BACKOUT_TIMEOUT_MS = 5000;
export interface WikiProps { export interface WikiProps {
@@ -22,6 +24,7 @@ export interface WikiProps {
interface WikiState { interface WikiState {
articlesBySection: ArticlesBySection; articlesBySection: ArticlesBySection;
isHoveringSidebar: boolean;
} }
const styles: Styles = { const styles: Styles = {
@@ -32,14 +35,13 @@ const styles: Styles = {
bottom: 0, bottom: 0,
right: 0, right: 0,
overflowZ: 'hidden', overflowZ: 'hidden',
overflowY: 'scroll', height: `calc(100vh - ${TOP_BAR_HEIGHT}px)`,
minHeight: 'calc(100vh - 1px)',
WebkitOverflowScrolling: 'touch', WebkitOverflowScrolling: 'touch',
}, },
menuContainer: { menuContainer: {
borderColor: colors.grey300, borderColor: colors.grey300,
maxWidth: 330, maxWidth: 330,
marginLeft: 20, backgroundColor: colors.gray40,
}, },
}; };
@@ -51,6 +53,7 @@ export class Wiki extends React.Component<WikiProps, WikiState> {
this._isUnmounted = false; this._isUnmounted = false;
this.state = { this.state = {
articlesBySection: undefined, articlesBySection: undefined,
isHoveringSidebar: false,
}; };
} }
public componentWillMount() { public componentWillMount() {
@@ -65,6 +68,10 @@ export class Wiki extends React.Component<WikiProps, WikiState> {
const menuSubsectionsBySection = _.isUndefined(this.state.articlesBySection) const menuSubsectionsBySection = _.isUndefined(this.state.articlesBySection)
? {} ? {}
: this._getMenuSubsectionsBySection(this.state.articlesBySection); : this._getMenuSubsectionsBySection(this.state.articlesBySection);
const mainContainersStyle: React.CSSProperties = {
...styles.mainContainers,
overflow: this.state.isHoveringSidebar ? 'auto' : 'hidden',
};
return ( return (
<div> <div>
<DocumentTitle title="0x Protocol Wiki" /> <DocumentTitle title="0x Protocol Wiki" />
@@ -72,10 +79,9 @@ export class Wiki extends React.Component<WikiProps, WikiState> {
blockchainIsLoaded={false} blockchainIsLoaded={false}
location={this.props.location} location={this.props.location}
menuSubsectionsBySection={menuSubsectionsBySection} menuSubsectionsBySection={menuSubsectionsBySection}
shouldFullWidth={true}
/> />
{_.isUndefined(this.state.articlesBySection) ? ( {_.isUndefined(this.state.articlesBySection) ? (
<div className="col col-12" style={styles.mainContainers}> <div className="col col-12" style={mainContainersStyle}>
<div <div
className="relative sm-px2 sm-pt2 sm-m1" className="relative sm-px2 sm-pt2 sm-m1"
style={{ height: 122, top: '50%', transform: 'translateY(-50%)' }} style={{ height: 122, top: '50%', transform: 'translateY(-50%)' }}
@@ -89,28 +95,50 @@ export class Wiki extends React.Component<WikiProps, WikiState> {
</div> </div>
</div> </div>
) : ( ) : (
<div className="mx-auto flex" style={{ color: colors.grey800, height: 43 }}> <div style={{ width: '100%', height: '100%', backgroundColor: colors.gray40 }}>
<div className="relative col md-col-3 lg-col-3 lg-pl0 md-pl1 sm-hide xs-hide">
<div <div
className="border-right absolute pt2" className="mx-auto max-width-4 flex"
style={{ ...styles.menuContainer, ...styles.mainContainers }} style={{ color: colors.grey800, height: `calc(100vh - ${TOP_BAR_HEIGHT}px)` }}
>
<div
className="relative lg-pl0 md-pl1 sm-hide xs-hide"
style={{ height: `calc(100vh - ${TOP_BAR_HEIGHT}px)`, width: '36%' }}
>
<div
className="absolute"
style={{
...styles.menuContainer,
...mainContainersStyle,
height: 'calc(100vh - 76px)',
}}
onMouseEnter={this._onSidebarHover.bind(this)}
onMouseLeave={this._onSidebarHoverOff.bind(this)}
> >
<NestedSidebarMenu <NestedSidebarMenu
topLevelMenu={menuSubsectionsBySection} topLevelMenu={menuSubsectionsBySection}
menuSubsectionsBySection={menuSubsectionsBySection} menuSubsectionsBySection={menuSubsectionsBySection}
isSectionHeaderClickable={true} title="Wiki"
/> />
</div> </div>
</div> </div>
<div className="relative col lg-col-9 md-col-9 sm-col-12 col-12"> <div
<div id="documentation" style={styles.mainContainers} className="absolute"> className="relative"
style={{
width: '100%',
height: `calc(100vh - ${TOP_BAR_HEIGHT}px)`,
backgroundColor: 'white',
}}
>
<div
id="documentation"
style={{ ...mainContainersStyle, overflow: 'auto' }}
className="absolute"
>
<div id="0xProtocolWiki" /> <div id="0xProtocolWiki" />
<h1 className="md-pl2 sm-pl3"> <div id="wiki" style={{ paddingRight: 2 }}>
<a href={constants.URL_GITHUB_WIKI} target="_blank"> {this._renderWikiArticles()}
0x Protocol Wiki </div>
</a> </div>
</h1>
<div id="wiki">{this._renderWikiArticles()}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -135,18 +163,22 @@ export class Wiki extends React.Component<WikiProps, WikiState> {
headerSize={HeaderSizes.H2} headerSize={HeaderSizes.H2}
githubLink={githubLink} githubLink={githubLink}
/> />
<div className="mb4 mt3 p3 center" style={{ backgroundColor: colors.lightestGrey }}> <div className="clearfix mb3 mt2 p3 mx-auto lg-flex md-flex sm-pb4" style={{ maxWidth: 390 }}>
See a way to make this article better?{' '} <div className="sm-col sm-col-12 sm-center" style={{ opacity: 0.4, lineHeight: 2.5 }}>
<a href={githubLink} target="_blank"> See a way to improve this article?
Edit here </div>
</a> <div className="sm-col sm-col-12 lg-col-7 md-col-7 sm-center sm-pt2">
<RaisedButton href={githubLink} target="_blank" label="Edit on Github" />
</div>
</div> </div>
</div> </div>
); );
}); });
return ( return (
<div key={`section-${sectionName}`} className="py2 pr3 md-pl2 sm-pl3"> <div key={`section-${sectionName}`} className="py2 md-px1 sm-px2">
{/* <div className="pl2">
<SectionHeader sectionName={sectionName} headerSize={HeaderSizes.H1} /> <SectionHeader sectionName={sectionName} headerSize={HeaderSizes.H1} />
</div> */}
{renderedArticles} {renderedArticles}
</div> </div>
); );
@@ -203,4 +235,14 @@ export class Wiki extends React.Component<WikiProps, WikiState> {
} }
return menuSubsectionsBySection; return menuSubsectionsBySection;
} }
private _onSidebarHover(event: React.FormEvent<HTMLInputElement>) {
this.setState({
isHoveringSidebar: true,
});
}
private _onSidebarHoverOff() {
this.setState({
isHoveringSidebar: false,
});
}
} }

View File

@@ -2,12 +2,14 @@ import { colors as materialUiColors } from 'material-ui/styles';
export const colors = { export const colors = {
...materialUiColors, ...materialUiColors,
gray40: '#F8F8F8',
grey50: '#FAFAFA', grey50: '#FAFAFA',
grey100: '#F5F5F5', grey100: '#F5F5F5',
lightestGrey: '#F0F0F0', lightestGrey: '#F0F0F0',
greyishPink: '#E6E5E5', greyishPink: '#E6E5E5',
grey300: '#E0E0E0', grey300: '#E0E0E0',
beigeWhite: '#E4E4E4', beigeWhite: '#E4E4E4',
grey350: '#cacaca',
grey400: '#BDBDBD', grey400: '#BDBDBD',
lightGrey: '#BBBBBB', lightGrey: '#BBBBBB',
grey500: '#9E9E9E', grey500: '#9E9E9E',
@@ -15,6 +17,7 @@ export const colors = {
darkGrey: '#818181', darkGrey: '#818181',
landingLinkGrey: '#919191', landingLinkGrey: '#919191',
grey700: '#616161', grey700: '#616161',
grey750: '#515151',
grey800: '#424242', grey800: '#424242',
darkerGrey: '#393939', darkerGrey: '#393939',
heroGrey: '#404040', heroGrey: '#404040',
@@ -23,6 +26,7 @@ export const colors = {
dharmaDarkGrey: '#252525', dharmaDarkGrey: '#252525',
lightBlue: '#60A4F4', lightBlue: '#60A4F4',
lightBlueA700: '#0091EA', lightBlueA700: '#0091EA',
linkBlue: '#1D5CDE',
darkBlue: '#4D5481', darkBlue: '#4D5481',
turquois: '#058789', turquois: '#058789',
lightPurple: '#A81CA6', lightPurple: '#A81CA6',