//-
    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.

section.intro-container-wrapper
    .container
        .col-lg-6.col-md-6.col-sm-6.col-xs-12.intro-content
            h1  Web Console
            h2 An Interactive Configuration Wizard and Management Tool for Apache™ Ignite®
            p It provides an interactive configuration wizard which helps you create and download configuration files and code snippets for your Apache Ignite projects. Additionally, the tool allows you to automatically load SQL metadata from any RDBMS, run SQL queries on your in-memory cache, and view execution plans, in-memory schema, and streaming charts.
            a#signup_show.btn.btn-lg.btn-primary.btn-custom(ui-sref='signup') Sign Up
        .col-lg-6.col-md-6.col-sm-6.col-xs-12
            img(src='/images/page-landing-ui-sample.png')
section.features-container-wrapper
    .container.features-container
        .section-title The Web Console allows you to:
        .row
            .col-lg-6.col-md-6.col-sm-6.col-xs-12.feature
                .col-lg-2.col-md-2.col-sm-2.col-xs-2
                    i.fa.fa-sitemap
                .col-lg-9.col-md-9.col-sm-9.col-xs-9
                    h3 Configure Apache Ignite clusters and caches
                    p The Web Console configuration wizard takes you through a step-by-step process that helps you define all the required configuration parameters. The system then generates a ready-to-use project with all the required config files.
            .col-lg-6.col-md-6.col-sm-6.col-xs-12.feature
                .col-lg-2.col-md-2.col-sm-2.col-xs-2
                    i.fa.fa-search
                .col-lg-9.col-md-9.col-sm-9.col-xs-9
                    h3 Run free-form SQL queries on #[br] Apache Ignite caches
                    p By connecting the Web Console to your Apache Ignite cluster, you can execute SQL queries on your in-memory cache. You can also view the execution plan, in-memory schema, and streaming charts for your cluster.
        .row
            .col-lg-6.col-md-6.col-sm-6.col-xs-12.feature
                .col-lg-2.col-md-2.col-sm-2.col-xs-2
                    i.fa.fa-database
                .col-lg-9.col-md-9.col-sm-9.col-xs-9
                    h3 Import database schemas from #[br] virtually any RDBMS
                    p To speed the creation of your configuration files, the Web Console allows you to automatically import the database schema from virtually any RDBMS including Oracle, SAP, MySQL, PostgreSQL, and many more.
            .col-lg-6.col-md-6.col-sm-6.col-xs-12.feature
                .col-lg-2.col-md-2.col-sm-2.col-xs-2
                    i.fa.fa-gears
                .col-lg-9.col-md-9.col-sm-9.col-xs-9
                    h3 Manage the Web Console users
                    p The Web Console allows you to have accounts with different roles.
        .align-center.text-center
            a.btn.btn-lg.btn-primary.btn-custom(ui-sref='signup') Get Started
