extends basic

block extra_head
    title Documentation - Apache ECharts
    style.
        html, body {
            /* position: sticky should not have overflow parents.*/
            overflow-x: hidden;
        }
    link(rel="stylesheet", href="#{cdnThirdParty.elementUICSS}")
    link(rel="stylesheet", href="#{getAssetUrl(cdnPayRoot, ecWWWLang + '/css/doc-bundle.css')}")

block content

    nav(class='navbar navbar-default navbar-fixed-top doc-nav' id="ec-doc-nav")
        if ecWWWLang == 'en'
            include ../en/nav
        else
            include ../components/nav

    .page-main
        block vars

        #ec-doc-main

        #v4-link.alert.alert-info.alert-dismissible
            if ecWWWLang == 'en'
                a(href="#{host}/v4/#{ecWWWLang}/option.html") V4 Documentation
            else
                a(href="#{host}/v4/#{ecWWWLang}/option.html") 旧版本文档

            button.close(type="button", data-dismiss="alert", aria-label="Close")
                span(aria-hidden="true") &times;


block extra_js
    script(src="#{cdnThirdParty.vueJS}")
    script(src="#{cdnThirdParty.elementUIJS}")
    script(src="#{cdnThirdParty.codeMirrorJS}")
    script(src="#{cdnThirdParty.codeMirrorJSModeJS}")
    script(src="#{cdnThirdParty.beautifierJS}")
    script(src="#{getAssetUrl(cdnPayRoot, ecWWWLang + '/js/doc-bundle.js')}")
    script(type="text/javascript").
        document.getElementById('nav-doc').className = 'active';
        window.EC_WWW_CDN_PAY_ROOT = '#{cdnPayRoot}';

    block global_args_extra

    script(type="text/javascript").
        window.globalArgsExtra.version = '#{docHash}';
        echartsDoc.init('#ec-doc-main', window.globalArgsExtra);

