<!DOCTYPE html>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at
   http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->


<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <script src="lib/esl.js"></script>
        <script src="lib/config.js"></script>
        <script src="lib/jquery.min.js"></script>
        <script src="lib/facePrint.js"></script>
        <script src="lib/testHelper.js"></script>
        <!-- <script src="ut/lib/canteen.js"></script> -->
        <link rel="stylesheet" href="lib/reset.css" />
    </head>
    <body>
        <style>
        </style>


        <div id="main1"></div>
        <div id="main2"></div>

        <script>
            function getData(seriesId) {
                var data = [];
                for (var i = 0; i < 7; ++i) {
                    data.push(Math.random() * 100 + (seriesId + 1) * 200);
                }
                return data;
            }
        </script>

        <script>
        require(['echarts'], function (echarts) {
            var option = {
                xAxis: {
                    type: 'category',
                    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
                },
                yAxis: {
                    type: 'value'
                },
                legend: [{
                    data: [
                        'Line A',
                        'Line B',
                        {
                            name: 'Line C',
                            symbolSize: 'inherit'
                        },
                        'Line F',
                        'Pie A',
                        'Pie B',
                        'Pie C',
                        'Pie D'
                    ]
                }, {
                    bottom: 10,
                    data: [{
                        name: 'Line D',
                        icon: 'rect'
                    }, {
                        name: 'Line E',
                        itemStyle: {
                            color: '#f0f'
                        }
                    }],
                    itemStyle: {
                        color: 'orange'
                    },
                    icon: 'emptyRect'
                }],
                series: [{
                    data: getData(0),
                    type: 'line',
                    name: 'Line A'
                }, {
                    data: getData(1),
                    type: 'line',
                    name: 'Line B',
                    itemStyle: {
                        color: 'red',
                        borderWidth: 5
                    },
                    symbolSize: 15,
                    symbol: 'emptyTriangle'
                }, {
                    data: getData(2),
                    type: 'line',
                    name: 'Line C',
                    lineStyle: {
                        color: 'green',
                        width: 5,
                        shadowBlur: 10,
                        shadowColor: 'orange'
                    },
                    itemStyle: {
                        color: 'red'
                    },
                    symbolSize: 30
                }, {
                    data: getData(3),
                    type: 'line',
                    name: 'Line D',
                    itemStyle: {
                        color: 'blue'
                    },
                    symbol: 'emptyTriangle',
                    symbolSize: 15
                }, {
                    data: getData(4),
                    type: 'line',
                    name: 'Line E',
                    itemStyle: {
                        color: 'green'
                    },
                    symbolSize: 10
                }, {
                    data: getData(5),
                    type: 'line',
                    name: 'Line F',
                    symbolSize: 10,
                    itemStyle: {
                        color: 'blue'
                    }
                }, {
                    type: 'pie',
                    data: [{
                        name: 'Pie A',
                        value: 10
                    }, {
                        name: 'Pie B',
                        value: 8,
                        itemStyle: {
                            borderWidth: 0
                        }
                    }, {
                        name: 'Pie C',
                        value: 14,
                        itemStyle: {
                            color: 'blue',
                            borderColor: 'green'
                        }
                    }, {
                        name: 'Pie D',
                        value: 2
                    }],
                    itemStyle: {
                        borderWidth: 10,
                        borderColor: '#fff'
                    },
                    center: ['80%', '50%'],
                    radius: '40%'
                }],
                grid: {
                    left: 60,
                    width: '55%'
                },
                visualMap: [{
                    type: 'continuous',
                    min: 1200,
                    max: 1300,
                    inRange: {
                        color: ['green', 'yellow', 'red']
                    },
                    show: false,
                    seriesIndex: 5
                }, {
                    type: 'continuous',
                    min: 5,
                    max: 15,
                    inRange: {
                        color: ['green', 'yellow', 'red']
                    },
                    show: false,
                    seriesIndex: 6
                }],
                animation: 0
            };

            var chart = testHelper.create(echarts, 'main1', {
                title: [
                    '**Legend icon being more intuitive**',
                    'Line A: the style of the line and items should be the same in those in legend; all colored in the first theme color',
                    'Line B: the style of the line and items should be the same in those in legend; all colored in red',
                    'Line C: the style of the line and items should be the same in those in legend; items colored in red and line colored in green',
                    'Line D: the style of the line should be the same in that in the legend; items colored orange in legend and blue in series',
                    'Line E: the style of the line should be the same in that in the legend; items colored pink in legend and green in series',
                    'Line F: the colors in the legend should be blue'
                ],
                option: option
            });
        });
        </script>


    </body>
</html>
