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, 'next/' + 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

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, 'next/' + ecWWWLang + '/js/doc-bundle.js')}")
    script(type="text/javascript").
        window.EC_WWW_CDN_PAY_ROOT = '#{cdnPayRoot}';

    block global_args_extra

    script(type="text/javascript").
        document.getElementById('nav-ec5').className = 'active';
        window.globalArgsExtra.version = '#{nextDocHash}';
        echartsDoc.init('#ec-doc-main', window.globalArgsExtra);

