<!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 lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <script src="../../dist/echarts.js"></script>
    <script src="../../map/js/china.js"></script>
</head>
<body>
    <style>
        body {
            margin: 0;
        }
    </style>
    <div id="main"></div>
    <script type="module">
        import bar from './option/bar';
        import area from './option/area';
        import scatter from './option/scatter';
        import pie from './option/pie';
        import graph from './option/graph';
        import map from './option/map';

        let options = [bar, area, scatter, pie, graph, map];
        let mainDiv = document.querySelector('#main');

        let theme = window.location.hash.slice(1);

        let scriptTag = document.createElement('script');
        scriptTag.src = '../' + theme + '.js';
        scriptTag.onload = function () {
            options.forEach(option => {
                let div = document.createElement('div');
                mainDiv.appendChild(div);
                div.style.cssText = 'float:left;width:50%;height:400px';
                let chart = echarts.init(div, theme);
                option.animation = false;
                chart.setOption(option);
            });
        }
        document.body.appendChild(scriptTag);
    </script>
</body>
</html>