<!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/simpleRequire.js"></script>
        <script src="lib/config.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="main0"></div>
        <div id="main1"></div>


        <script>
        require([
            'echarts'
        ], function (echarts) {
            var option;

            option = {
              xAxis: {
                type: 'category',
                data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
              },
              yAxis: {
                type: 'value'
              },
              series: [
                {
                  data: [120, 200, 150, 80, 70, 110, 130],
                  type: 'bar',
                  markArea: {
                    data: [
                      [
                        {
                          name: 'Invert input',
                          xAxis: 'Thu'
                        },
                        {
                          xAxis: 'Mon'
                        }
                      ]
                    ]
                  }
                },
                {
                  data: [120, 200, 150, 80, 70, 110, 130],
                  type: 'bar',
                  markArea: {
                    data: [
                      [
                        {
                          name: 'Single Emphasis',
                          xAxis: 'Sun'
                        },
                        {
                          xAxis: 'Sun'
                        }
                      ]
                    ]
                  }
                }
              ]
            };


            var chart = testHelper.create(echarts, 'main0', {
                title: [
                    `MarkArea should cover the **'Mon'** to **'Thu'** area and **'Sun'** area`,
                    `rather than area between bars inside. (See issue#12341)`
                ],
                option: option
            });
        });
        </script>

<script>
    require([
        'echarts'
    ], function (echarts) {
        var option;

        option = {
          xAxis: {
            type: 'category',
            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
          },
          yAxis: {
            type: 'category',
            data: ['Sleep', 'Exercise', 'Gardening', 'Gaming', 'Work']
          },
          series: [
            {
              data: ['Work', 'Exercise', 'Work', 'Gardening', 'Gaming'],
              type: 'bar',
              markArea: {
                data: [
                  [
                    {
                      name: 'Dual Axes specified Emphasis',
                      xAxis: 'Fri',
                      yAxis: 'Work'
                    },
                    {
                      xAxis: 'Mon',
                      yAxis: 'Gardening'
                    }
                  ]
                ]
              }
            },
            {
              data: ['Gardening', 'Work', 'Exercise', 'Exercise', 'Gardening'],
              type: 'bar',
              markArea: {
                data: [
                  [
                    {
                      name: 'Coord specified Emphasis',
                      coord: ['Mon', 'Exercise']
                    },
                    {
                      coord: ['Tue', 'Gardening']
                    }
                  ]
                ]
              }
            }
          ]
        };

        var chart = testHelper.create(echarts, 'main1', {
            title: [
                `MarkArea should cover the **'Mon'** to **'Fri'** area and **'Exercise'** to **'Gaming'** area`,
                `rather than area between bars inside. (Dual category axes for bar chart is rare)`
            ],
            option: option
        });
    });
    </script>


    </body>
</html>

