{{/*
 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.
*/}}

{{ define "animation-header" }}
    <section id="header">
        <div id="header-canvas">
            <div class="text-area">
                <h2 class="text-area--header" id="header-title">Apache Airflow</h2>
                <h5 class="text-area--subheader" id="header-lead">
                    Airflow is a platform created by the community to programmatically author, schedule and monitor
                    workflows.
                </h5>
                {{/*
                    TODO: Temporary solution. Replace the link to docs with commented code when texts on install page are ready.

                    <a href="/install/" id="header-button">
                        {{ partial "buttons/button-filled" (dict "text" "Install") }}
                    </a>
                    */}}
                <a href="/docs/stable/start.html" id="header-button">
                    {{ partial "buttons/button-filled" (dict "text" "Install") }}
                </a>
            </div>
        </div>
    </section>
{{ end }}

{{ define "main" }}
    <div>
        <h4 class="page-header principles-header">Principles</h4>
        <div class="text-with-icon-list">
            {{ partial "text-with-icon" (dict "logo_path" "icons/scalable-icon.svg" "header" "Scalable" "text" "Airflow has a modular architecture and uses a message queue to orchestrate an arbitrary number of workers. Airflow is ready to scale to infinity.") }}
            {{ partial "text-with-icon" (dict "logo_path" "icons/dynamic-icon.svg" "header" "Dynamic" "text" "Airflow pipelines are defined in Python, allowing for dynamic pipeline generation. This allows for writing code that instantiates pipelines dynamically.") }}
            {{ partial "text-with-icon" (dict "logo_path" "icons/extensible-icon.svg" "header" "Extensible" "text" "Easily define your own operators and extend libraries to fit the level of abstraction that suits your environment.") }}
            {{ partial "text-with-icon" (dict "logo_path" "icons/elegant-icon.svg" "header" "Elegant" "text" "Airflow pipelines are lean and explicit. Parametrization is built into its core using the powerful Jinja templating engine.") }}
        </div>
    </div>
    <div>
        <h4 class="page-header">Features</h4>
        <div class="features-list">
            {{ partial "feature" (dict "logo_path" "icons/pure-python-icon.svg" "header" "Pure Python" "text" "No more command-line or XML black-magic! Use standard Python features to create your workflows, including date time formats for scheduling and loops to dynamically generate tasks. This allows you to maintain full flexibility when building your workflows.") }}
            {{ partial "feature" (dict "logo_path" "icons/useful-ui-icon.svg" "header" "Useful UI" "text" "Monitor, schedule and manage your workflows via a robust and modern web application. No need to learn old, cron-like interfaces. You always have full insight into the status and logs of completed and ongoing tasks.") }}
            {{ partial "feature" (dict "logo_path" "icons/integrations-icon.svg" "header" "Robust Integrations" "text" "Airflow provides many plug-and-play operators that are ready to execute your tasks on Google Cloud Platform, Amazon Web Services, Microsoft Azure and many other third-party services. This makes Airflow easy to apply to current infrastructure and extend to next-gen technologies.") }}
            {{ partial "feature" (dict "logo_path" "icons/easy-use-icon.svg" "header" "Easy to Use" "text" "Anyone with Python knowledge can deploy a workflow. Apache Airflow does not limit the scope of your pipelines; you can use it to build ML models, transfer data, manage your infrastructure, and more.") }}
            {{ partial "feature" (dict "logo_path" "icons/open-source-icon.svg" "header" "Open Source" "text" "Wherever you want to share your improvement you can do this by opening a PR. It’s simple as that, no barriers, no prolonged procedures. Airflow has many active users who willingly share their experiences. Have any questions? Check out our buzzing slack.") }}
        </div>

    </div>
    <div>
        <h4 class="page-header integrations-header">Integrations</h4>
        <div id="integrations">
            <script type="application/x-template" id="integration-template">
                <a class="list-item" href="">
                    <div class="card">
                        <div class="box-event box-event__integration">
                            <img src="" alt="" data-name="logo" class="box-event__integration--logo"/>
                            <span class="box-event__integration--name" data-name="name"></span>
                        </div>
                    </div>
                </a>
            </script>
            <form class="search-form">
                <input class="search-form__input" placeholder="Search" name="q" type="search" size="16"/>
                <button class="search-form__button" type="submit">
                    {{ with resources.Get "icons/search-icon.svg" }}
                    {{ .Content | safeHTML }}
                    {{ end }}
                </button>
            </form>
            <div id="integrations-container" class="list-items">
                {{ range $elem_index, $elem_val := (shuffle .Site.Data.integrations) }}
                {{ if lt $elem_index 8 }}
                <a class="list-item" href="{{ $elem_val.url }}">
                    {{ partial "boxes/integration" $elem_val }}
                </a>
                {{ end}}
                {{ end }}
            </div>
            <div class="loading" style="display: none">Loading..</div>
            <div class="show-more-button">
                {{ partial "buttons/button-filled" (dict "text" "Show more" "id" "show-more-integration")}}
            </div>
        </div>
    </div>
{{ end }}
