Commit 5fd3b083 authored by suiguoxin's avatar suiguoxin
Browse files

Merge branch 'master' of git://github.com/microsoft/nni

parents 571817e2 f6d66673
...@@ -17,9 +17,9 @@ ...@@ -17,9 +17,9 @@
NNI (Neural Network Intelligence) is a toolkit to help users run automated machine learning (AutoML) experiments. NNI (Neural Network Intelligence) is a toolkit to help users run automated machine learning (AutoML) experiments.
The tool dispatches and runs trial jobs generated by tuning algorithms to search the best neural architecture and/or hyper-parameters in different environments like local machine, remote servers and cloud. The tool dispatches and runs trial jobs generated by tuning algorithms to search the best neural architecture and/or hyper-parameters in different environments like local machine, remote servers and cloud.
### **NNI [v0.8](https://github.com/Microsoft/nni/releases) has been released!** ### **NNI [v0.9](https://github.com/Microsoft/nni/releases) has been released! &nbsp;<a href="#nni-released-reminder"><img width="48" src="docs/img/release_icon.png"></a>**
<p align="center"> <p align="center">
<a href="#nni-v05-has-been-released"><img src="docs/img/overview.svg" /></a> <a href="#nni-has-been-released"><img src="docs/img/overview.svg" /></a>
</p> </p>
<table> <table>
<tbody> <tbody>
...@@ -138,7 +138,7 @@ Linux and MacOS ...@@ -138,7 +138,7 @@ Linux and MacOS
* Run the following commands in an environment that has `python >= 3.5`, `git` and `wget`. * Run the following commands in an environment that has `python >= 3.5`, `git` and `wget`.
```bash ```bash
git clone -b v0.8 https://github.com/Microsoft/nni.git git clone -b v0.9 https://github.com/Microsoft/nni.git
cd nni cd nni
source install.sh source install.sh
``` ```
...@@ -148,7 +148,7 @@ Windows ...@@ -148,7 +148,7 @@ Windows
* Run the following commands in an environment that has `python >=3.5`, `git` and `PowerShell` * Run the following commands in an environment that has `python >=3.5`, `git` and `PowerShell`
```bash ```bash
git clone -b v0.8 https://github.com/Microsoft/nni.git git clone -b v0.9 https://github.com/Microsoft/nni.git
cd nni cd nni
powershell -ExecutionPolicy Bypass -file install.ps1 powershell -ExecutionPolicy Bypass -file install.ps1
``` ```
...@@ -164,7 +164,7 @@ The following example is an experiment built on TensorFlow. Make sure you have * ...@@ -164,7 +164,7 @@ The following example is an experiment built on TensorFlow. Make sure you have *
* Download the examples via clone the source code. * Download the examples via clone the source code.
```bash ```bash
git clone -b v0.8 https://github.com/Microsoft/nni.git git clone -b v0.9 https://github.com/Microsoft/nni.git
``` ```
Linux and MacOS Linux and MacOS
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
NNI (Neural Network Intelligence) 是自动机器学习(AutoML)的工具包。 它通过多种调优的算法来搜索最好的神经网络结构和(或)超参,并支持单机、本地多机、云等不同的运行环境。 NNI (Neural Network Intelligence) 是自动机器学习(AutoML)的工具包。 它通过多种调优的算法来搜索最好的神经网络结构和(或)超参,并支持单机、本地多机、云等不同的运行环境。
### **NNI [v0.8](https://github.com/Microsoft/nni/releases) 已发布!** ### **NNI [v0.9](https://github.com/Microsoft/nni/releases) 已发布!**
<p align="center"> <p align="center">
<a href="#nni-v05-has-been-released"><img src="docs/img/overview.svg" /></a> <a href="#nni-v05-has-been-released"><img src="docs/img/overview.svg" /></a>
......
...@@ -23,8 +23,12 @@ maxTrialNum: ...@@ -23,8 +23,12 @@ maxTrialNum:
#choice: local, remote, pai, kubeflow #choice: local, remote, pai, kubeflow
trainingServicePlatform: trainingServicePlatform:
searchSpacePath: searchSpacePath:
#choice: true, false #choice: true, false, default: false
useAnnotation: useAnnotation:
#choice: true, false, default: false
multiPhase:
#choice: true, false, default: false
multiThread:
tuner: tuner:
#choice: TPE, Random, Anneal, Evolution #choice: TPE, Random, Anneal, Evolution
builtinTunerName: builtinTunerName:
...@@ -55,8 +59,12 @@ maxTrialNum: ...@@ -55,8 +59,12 @@ maxTrialNum:
#choice: local, remote, pai, kubeflow #choice: local, remote, pai, kubeflow
trainingServicePlatform: trainingServicePlatform:
searchSpacePath: searchSpacePath:
#choice: true, false #choice: true, false, default: false
useAnnotation: useAnnotation:
#choice: true, false, default: false
multiPhase:
#choice: true, false, default: false
multiThread:
tuner: tuner:
#choice: TPE, Random, Anneal, Evolution #choice: TPE, Random, Anneal, Evolution
builtinTunerName: builtinTunerName:
...@@ -93,8 +101,12 @@ maxExecDuration: ...@@ -93,8 +101,12 @@ maxExecDuration:
maxTrialNum: maxTrialNum:
#choice: local, remote, pai, kubeflow #choice: local, remote, pai, kubeflow
trainingServicePlatform: trainingServicePlatform:
#choice: true, false #choice: true, false, default: false
useAnnotation: useAnnotation:
#choice: true, false, default: false
multiPhase:
#choice: true, false, default: false
multiThread:
tuner: tuner:
#choice: TPE, Random, Anneal, Evolution #choice: TPE, Random, Anneal, Evolution
builtinTunerName: builtinTunerName:
...@@ -194,6 +206,16 @@ machineList: ...@@ -194,6 +206,16 @@ machineList:
Note: if set useAnnotation=True, the searchSpacePath field should be removed. Note: if set useAnnotation=True, the searchSpacePath field should be removed.
* __multiPhase__
* Description
__multiPhase__ enable [multi-phase experiment](./MultiPhase.md).
* __multiThread__
* Description
__multiThread__ enable multi-thread mode for dispatcher, if multiThread is set to `true`, dispatcher will start a thread to process each command from NNI Manager.
* __nniManagerIp__ * __nniManagerIp__
* Description * Description
......
...@@ -368,9 +368,15 @@ Debug mode will disable version check function in Trialkeeper. ...@@ -368,9 +368,15 @@ Debug mode will disable version check function in Trialkeeper.
* Usage * Usage
```bash ```bash
nnictl experiment list nnictl experiment list [OPTIONS]
``` ```
* Options
|Name, shorthand|Required|Default|Description|
|------|------|------ |------|
|--all| False| |list all of experiments|
* __nnictl experiment delete__ * __nnictl experiment delete__
* Description * Description
...@@ -388,6 +394,7 @@ Debug mode will disable version check function in Trialkeeper. ...@@ -388,6 +394,7 @@ Debug mode will disable version check function in Trialkeeper.
|Name, shorthand|Required|Default|Description| |Name, shorthand|Required|Default|Description|
|------|------|------ |------| |------|------|------ |------|
|id| False| |ID of the experiment| |id| False| |ID of the experiment|
|--all| False| |delete all of experiments|
......
# ChangeLog # ChangeLog
## Release 0.9 - 7/1/2019
### Major Features
* General NAS programming interface
* Add `enas-mode` and `oneshot-mode` for NAS interface: [PR #1201](https://github.com/microsoft/nni/pull/1201#issue-291094510)
* [Gaussian Process Tuner with Matern kernel](./GPTuner.md)
* Multiphase experiment supports
* Added new training service support for multiphase experiment: PAI mode supports multiphase experiment since v0.9.
* Added multiphase capability for the following builtin tuners:
* TPE, Random Search, Anneal, Naïve Evolution, SMAC, Network Morphism, Metis Tuner.
For details, please refer to [Write a tuner that leverages multi-phase](./MultiPhase.md#write-a-tuner-that-leverages-multi-phase)
* Web Portal
* Enable trial comparation in Web Portal. For details, refer to [View trials status](WebUI.md#view-trials-status)
* Allow users to adjust rendering interval of Web Portal. For details, refer to [View Summary Page](WebUI.md#view-summary-page)
* show intermediate results more friendly. For details, refer to [View trials status](WebUI.md#view-trials-status)
* [Commandline Interface](Nnictl.md)
* `nnictl experiment delete`: delete one or all experiments, it includes log, result, environment information and cache. It uses to delete useless experiment result, or save disk space.
* `nnictl platform clean`: It uses to clean up disk on a target platform. The provided YAML file includes the information of target platform, and it follows the same schema as the NNI configuration file.
### Bug fix and other changes
* Tuner Installation Improvements: add [sklearn](https://scikit-learn.org/stable/) to nni dependencies.
* (Bug Fix) Failed to connect to PAI http code - [Issue #1076](https://github.com/microsoft/nni/issues/1076)
* (Bug Fix) Validate file name for PAI platform - [Issue #1164](https://github.com/microsoft/nni/issues/1164)
* (Bug Fix) Update GMM evaluation in Metis Tuner
* (Bug Fix) Negative time number rendering in Web Portal - [Issue #1182](https://github.com/microsoft/nni/issues/1182), [Issue #1185](https://github.com/microsoft/nni/issues/1185)
* (Bug Fix) Hyper-parameter not shown correctly in WebUI when there is only one hyper parameter - [Issue #1192](https://github.com/microsoft/nni/issues/1192)
## Release 0.8 - 6/4/2019 ## Release 0.8 - 6/4/2019
### Major Features ### Major Features
......
docs/img/webui-img/addColumn.png

35.7 KB | W: | H:

docs/img/webui-img/addColumn.png

42 KB | W: | H:

docs/img/webui-img/addColumn.png
docs/img/webui-img/addColumn.png
docs/img/webui-img/addColumn.png
docs/img/webui-img/addColumn.png
  • 2-up
  • Swipe
  • Onion skin
docs/img/webui-img/compare.png

61.7 KB | W: | H:

docs/img/webui-img/compare.png

49.9 KB | W: | H:

docs/img/webui-img/compare.png
docs/img/webui-img/compare.png
docs/img/webui-img/compare.png
docs/img/webui-img/compare.png
  • 2-up
  • Swipe
  • Onion skin
docs/img/webui-img/detail-local.png

37.2 KB | W: | H:

docs/img/webui-img/detail-local.png

21.7 KB | W: | H:

docs/img/webui-img/detail-local.png
docs/img/webui-img/detail-local.png
docs/img/webui-img/detail-local.png
docs/img/webui-img/detail-local.png
  • 2-up
  • Swipe
  • Onion skin
.nni{ .nni{
font-family: 'Segoe';
color: #212121; color: #212121;
font-size: 14px; font-size: 14px;
background: #f2f2f2; background: #f2f2f2;
......
...@@ -127,7 +127,7 @@ class Compare extends React.Component<CompareProps, {}> { ...@@ -127,7 +127,7 @@ class Compare extends React.Component<CompareProps, {}> {
<td /> <td />
{Object.keys(idList).map(key => { {Object.keys(idList).map(key => {
return ( return (
<td className="value" key={key}>{idList[key]}</td> <td className="value idList" key={key}>{idList[key]}</td>
); );
})} })}
</tr> </tr>
...@@ -193,6 +193,7 @@ class Compare extends React.Component<CompareProps, {}> { ...@@ -193,6 +193,7 @@ class Compare extends React.Component<CompareProps, {}> {
destroyOnClose={true} destroyOnClose={true}
maskClosable={false} maskClosable={false}
width="90%" width="90%"
// centered={true}
> >
<Row>{this.intermediate()}</Row> <Row>{this.intermediate()}</Row>
<Row>{this.initColumn()}</Row> <Row>{this.initColumn()}</Row>
......
...@@ -4,7 +4,7 @@ import axios from 'axios'; ...@@ -4,7 +4,7 @@ import axios from 'axios';
import { MANAGER_IP } from '../static/const'; import { MANAGER_IP } from '../static/const';
import MediaQuery from 'react-responsive'; import MediaQuery from 'react-responsive';
import { DOWNLOAD_IP } from '../static/const'; import { DOWNLOAD_IP } from '../static/const';
import { Row, Col, Menu, Dropdown, Icon, Select } from 'antd'; import { Row, Col, Menu, Dropdown, Icon, Select, Button } from 'antd';
const { SubMenu } = Menu; const { SubMenu } = Menu;
const { Option } = Select; const { Option } = Select;
import '../static/style/slideBar.scss'; import '../static/style/slideBar.scss';
...@@ -14,6 +14,7 @@ interface SliderState { ...@@ -14,6 +14,7 @@ interface SliderState {
version: string; version: string;
menuVisible: boolean; menuVisible: boolean;
navBarVisible: boolean; navBarVisible: boolean;
isdisabledFresh: boolean;
} }
interface SliderProps { interface SliderProps {
...@@ -37,6 +38,7 @@ class SlideBar extends React.Component<SliderProps, SliderState> { ...@@ -37,6 +38,7 @@ class SlideBar extends React.Component<SliderProps, SliderState> {
version: '', version: '',
menuVisible: false, menuVisible: false,
navBarVisible: false, navBarVisible: false,
isdisabledFresh: false
}; };
} }
...@@ -224,9 +226,6 @@ class SlideBar extends React.Component<SliderProps, SliderState> { ...@@ -224,9 +226,6 @@ class SlideBar extends React.Component<SliderProps, SliderState> {
<Menu onClick={this.handleMenuClick} className="menuModal"> <Menu onClick={this.handleMenuClick} className="menuModal">
<Menu.Item key="overview"><Link to={'/oview'}>Overview</Link></Menu.Item> <Menu.Item key="overview"><Link to={'/oview'}>Overview</Link></Menu.Item>
<Menu.Item key="detail"><Link to={'/detail'}>Trials detail</Link></Menu.Item> <Menu.Item key="detail"><Link to={'/detail'}>Trials detail</Link></Menu.Item>
<Menu.Item key="fresh">
<span className="fresh" onClick={this.fresh}><span>Fresh</span></span>
</Menu.Item>
<Menu.Item key="feedback"> <Menu.Item key="feedback">
<a href={feedBackLink} target="_blank">Feedback</a> <a href={feedBackLink} target="_blank">Feedback</a>
</Menu.Item> </Menu.Item>
...@@ -249,11 +248,20 @@ class SlideBar extends React.Component<SliderProps, SliderState> { ...@@ -249,11 +248,20 @@ class SlideBar extends React.Component<SliderProps, SliderState> {
} }
select = () => { select = () => {
const { isdisabledFresh } = this.state;
return ( return (
<div className="interval">
<Button
className="fresh"
onClick={this.fresh}
type="ghost"
disabled={isdisabledFresh}
>
<Icon type="sync" /><span>Refresh</span>
</Button>
<Select <Select
onSelect={this.getInterval} onSelect={this.getInterval}
defaultValue="Refresh every 10s" defaultValue="Refresh every 10s"
className="interval"
> >
<Option value="close">Disable Auto Refresh</Option> <Option value="close">Disable Auto Refresh</Option>
<Option value="10">Refresh every 10s</Option> <Option value="10">Refresh every 10s</Option>
...@@ -261,13 +269,20 @@ class SlideBar extends React.Component<SliderProps, SliderState> { ...@@ -261,13 +269,20 @@ class SlideBar extends React.Component<SliderProps, SliderState> {
<Option value="30">Refresh every 30s</Option> <Option value="30">Refresh every 30s</Option>
<Option value="60">Refresh every 1min</Option> <Option value="60">Refresh every 1min</Option>
</Select> </Select>
</div>
); );
} }
fresh = (event: React.SyntheticEvent<EventTarget>) => { fresh = (event: React.SyntheticEvent<EventTarget>) => {
event.preventDefault(); event.preventDefault();
event.stopPropagation();
if (this._isMounted) {
this.setState({ isdisabledFresh: true }, () => {
const whichPage = window.location.pathname; const whichPage = window.location.pathname;
this.props.changeFresh(whichPage); this.props.changeFresh(whichPage);
setTimeout(() => { this.setState(() => ({ isdisabledFresh: false })); }, 1000);
});
}
} }
componentDidMount() { componentDidMount() {
...@@ -284,6 +299,7 @@ class SlideBar extends React.Component<SliderProps, SliderState> { ...@@ -284,6 +299,7 @@ class SlideBar extends React.Component<SliderProps, SliderState> {
const feed = `https://github.com/Microsoft/nni/issues/new?labels=${version}`; const feed = `https://github.com/Microsoft/nni/issues/new?labels=${version}`;
return ( return (
<Row> <Row>
<Col span={18}>
<MediaQuery query="(min-width: 1299px)"> <MediaQuery query="(min-width: 1299px)">
<Row className="nav"> <Row className="nav">
<ul className="link"> <ul className="link">
...@@ -307,9 +323,6 @@ class SlideBar extends React.Component<SliderProps, SliderState> { ...@@ -307,9 +323,6 @@ class SlideBar extends React.Component<SliderProps, SliderState> {
</Link> </Link>
</li> </li>
<li className="feedback"> <li className="feedback">
<span className="fresh" onClick={this.fresh}>
<Icon type="sync" /><span>Fresh</span>
</span>
<Dropdown <Dropdown
className="dropdown" className="dropdown"
overlay={this.menu()} overlay={this.menu()}
...@@ -333,25 +346,28 @@ class SlideBar extends React.Component<SliderProps, SliderState> { ...@@ -333,25 +346,28 @@ class SlideBar extends React.Component<SliderProps, SliderState> {
</ul> </ul>
</Row> </Row>
</MediaQuery> </MediaQuery>
</Col>
<Col span={18}>
<MediaQuery query="(max-width: 1299px)"> <MediaQuery query="(max-width: 1299px)">
<Row className="little"> <Row className="little">
<Col span={6} className="menu"> <Col span={1} className="menu">
<Dropdown overlay={this.navigationBar()} trigger={['click']}> <Dropdown overlay={this.navigationBar()} trigger={['click']}>
<Icon type="unordered-list" className="more" /> <Icon type="unordered-list" className="more" />
</Dropdown> </Dropdown>
</Col> </Col>
<Col span={10} className="logo"> <Col span={14} className="logo">
<Link to={'/oview'}> <Link to={'/oview'}>
<img <img
src={require('../static/img/logo2.png')} src={require('../static/img/logo2.png')}
style={{ width: 88 }} style={{ width: 80 }}
alt="NNI logo" alt="NNI logo"
/> />
</Link> </Link>
</Col> </Col>
</Row> </Row>
</MediaQuery> </MediaQuery>
{this.select()} </Col>
<Col span={3}> {this.select()} </Col>
</Row> </Row>
); );
} }
......
...@@ -394,15 +394,13 @@ class TrialsDetail extends React.Component<TrialsDetailProps, TrialDetailState> ...@@ -394,15 +394,13 @@ class TrialsDetail extends React.Component<TrialsDetailProps, TrialDetailState>
</Col> </Col>
<Col span={14} className="right"> <Col span={14} className="right">
<Button <Button
type="primary" className="common"
className="tableButton editStyle"
onClick={this.tableList ? this.tableList.addColumn : this.test} onClick={this.tableList ? this.tableList.addColumn : this.test}
> >
Add column Add column
</Button> </Button>
<Button <Button
type="primary" className="mediateBtn common"
className="tableButton editStyle mediateBtn"
// use child-component tableList's function, the function is in child-component. // use child-component tableList's function, the function is in child-component.
onClick={this.tableList ? this.tableList.compareBtn : this.test} onClick={this.tableList ? this.tableList.compareBtn : this.test}
> >
......
...@@ -175,14 +175,15 @@ class Duration extends React.Component<DurationProps, DurationState> { ...@@ -175,14 +175,15 @@ class Duration extends React.Component<DurationProps, DurationState> {
return true; return true;
} }
if (beforeSource[beforeSource.length - 1] !== undefined) {
if (source[source.length - 1].duration !== beforeSource[beforeSource.length - 1].duration) { if (source[source.length - 1].duration !== beforeSource[beforeSource.length - 1].duration) {
return true; return true;
} }
if (source[source.length - 1].status !== beforeSource[beforeSource.length - 1].status) { if (source[source.length - 1].status !== beforeSource[beforeSource.length - 1].status) {
return true; return true;
} }
} }
}
return false; return false;
} }
......
...@@ -136,7 +136,7 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> ...@@ -136,7 +136,7 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState>
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
name: 'Scape' name: 'metric'
} }
}; };
if (this._isMounted) { if (this._isMounted) {
...@@ -226,14 +226,12 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> ...@@ -226,14 +226,12 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState>
} }
shouldComponentUpdate(nextProps: IntermediateProps, nextState: IntermediateState) { shouldComponentUpdate(nextProps: IntermediateProps, nextState: IntermediateState) {
const { whichGraph } = nextProps; const { whichGraph, source } = nextProps;
const beforeGraph = this.props.whichGraph; const beforeGraph = this.props.whichGraph;
if (whichGraph === '4') { if (whichGraph === '4') {
const { source } = nextProps;
const { isFilter, length, clickCounts } = nextState; const { isFilter, length, clickCounts } = nextState;
const beforeLength = this.state.length; const beforeLength = this.state.length;
const beforeSource = this.state.detailSource; const beforeSource = this.props.source;
const beforeClickCounts = this.state.clickCounts; const beforeClickCounts = this.state.clickCounts;
if (isFilter !== this.state.isFilter) { if (isFilter !== this.state.isFilter) {
...@@ -251,6 +249,10 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> ...@@ -251,6 +249,10 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState>
if (length !== beforeLength) { if (length !== beforeLength) {
return true; return true;
} }
if (beforeSource.length !== source.length) {
return true;
}
if (beforeSource[beforeSource.length - 1] !== undefined) {
if (source[source.length - 1].description.intermediate.length !== if (source[source.length - 1].description.intermediate.length !==
beforeSource[beforeSource.length - 1].description.intermediate.length) { beforeSource[beforeSource.length - 1].description.intermediate.length) {
return true; return true;
...@@ -263,6 +265,7 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> ...@@ -263,6 +265,7 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState>
} }
} }
} }
}
return false; return false;
} }
...@@ -291,7 +294,7 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> ...@@ -291,7 +294,7 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState>
? ?
<div> <div>
<Col span={3}> <Col span={3}>
<span>Scape</span> <span>Step</span>
<input <input
placeholder="point" placeholder="point"
ref={input => this.pointInput = input} ref={input => this.pointInput = input}
......
...@@ -49,8 +49,4 @@ table { ...@@ -49,8 +49,4 @@ table {
border-collapse: collapse; border-collapse: collapse;
border-spacing: 0; border-spacing: 0;
} }
@font-face {
font-family: 'Segoe';
src: url('./static/font/SegoePro-Regular.ttf');
}
.compare{ .compare{
width: 92%; width: 92%;
table-layout: fixed;
margin: 0 auto; margin: 0 auto;
color: #333; color: #333;
tr{ tr{
line-height: 30px; line-height: 30px;
border-bottom: 1px solid #ccc; }
tr:nth-of-type(even){
background-color: gainsboro;
} }
.column{ .column{
width: 124px; max-width: 124px;
padding-left: 18px; padding-left: 18px;
font-weight: 700; font-weight: 700;
} }
.value{ .value{
width: 152px; max-width: 152px;
padding-right: 18px; padding-right: 18px;
text-align: right; text-align: left;
}
.idList{
font-weight: 700;
} }
} }
...@@ -4,6 +4,13 @@ ...@@ -4,6 +4,13 @@
margin: 0 auto; margin: 0 auto;
.right{ .right{
text-align: right; text-align: right;
.common{
border-radius: 0;
}
.common:hover{
color: #0071BC;
border-radius: 0;
}
} }
.entry{ .entry{
width: 120px; width: 120px;
...@@ -31,8 +38,9 @@ ...@@ -31,8 +38,9 @@
} }
} }
/* compare button style */
Button.mediateBtn{ Button.mediateBtn{
margin: 0 32px; margin: 0 2px 0 8px;
} }
/* each row's Intermediate btn -> Modal*/ /* each row's Intermediate btn -> Modal*/
......
...@@ -34,18 +34,10 @@ $drowHoverBgColor: #e2e2e2; ...@@ -34,18 +34,10 @@ $drowHoverBgColor: #e2e2e2;
.feedback{ .feedback{
position: fixed; position: fixed;
right: 19%; right: 26%;
line-height: $barHeight; line-height: $barHeight;
font-size: 16px; font-size: 16px;
color: #fff; color: #fff;
.fresh{
span{
margin: 0 10px 0 3px;
}
}
.fresh:hover{
cursor: pointer;
}
a{ a{
color: #fff; color: #fff;
text-decoration: none; text-decoration: none;
...@@ -60,6 +52,17 @@ $drowHoverBgColor: #e2e2e2; ...@@ -60,6 +52,17 @@ $drowHoverBgColor: #e2e2e2;
} }
} }
/* refresh button */
.fresh{
border: none;
color: #fff;
font-size: 16px;
padding: 0;
}
.fresh:hover{
color: #fff;
}
.link li{ .link li{
float: left; float: left;
} }
...@@ -70,8 +73,10 @@ $drowHoverBgColor: #e2e2e2; ...@@ -70,8 +73,10 @@ $drowHoverBgColor: #e2e2e2;
} }
.interval{ .interval{
position: fixed; position: fixed;
right: 7%; right: 6%;
top: 12px; top: 12px;
font-size: 16px;
color: #fff;
.ant-select-selection{ .ant-select-selection{
background-color: transparent; background-color: transparent;
border: none; border: none;
...@@ -82,6 +87,10 @@ $drowHoverBgColor: #e2e2e2; ...@@ -82,6 +87,10 @@ $drowHoverBgColor: #e2e2e2;
.ant-select-arrow{ .ant-select-arrow{
color: #fff; color: #fff;
} }
.ant-btn-ghost[disabled]{
background-color: transparent;
color: #fff;
}
} }
/* set select bgcolor */ /* set select bgcolor */
.ant-select-dropdown-menu{ .ant-select-dropdown-menu{
...@@ -120,8 +129,9 @@ $drowHoverBgColor: #e2e2e2; ...@@ -120,8 +129,9 @@ $drowHoverBgColor: #e2e2e2;
/* nav style*/ /* nav style*/
.little{ .little{
width: 100%; width: 90%;
.menu{ .menu{
margin-left: 33px;
.more{ .more{
color: #fff; color: #fff;
font-size: 24px; font-size: 24px;
...@@ -132,10 +142,10 @@ $drowHoverBgColor: #e2e2e2; ...@@ -132,10 +142,10 @@ $drowHoverBgColor: #e2e2e2;
} }
} }
.logo{ .logo{
text-align: center; text-align: right;
} }
} }
.menuModal{ .menuModal{
width: 180px; width: 198px;
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment