{{/*
 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 "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 pipelines are configuration as code (Python), allowing for dynamic pipeline generation. This allows for writing code that instantiates pipelines dynamically.") }}
            {{ partial "text-with-icon" (dict "logo_path" "icons/dynamic-icon.svg" "header" "Dynamic" "text" "Airflow pipelines are configuration as code (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, executors and extend the library so that it fits 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. Parametrizing your scripts 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 all Python features to create your workflows including date time formats for scheduling tasks and loops to dynamically generate tasks. This allows you to build your workflows as complicated as you wish.") }}
            {{ partial "feature" (dict "logo_path" "icons/useful-ui-icon.svg" "header" "Useful UI" "text" "Monitor, schedule and manage your workflows using web app. No need to learn old, cron-like interfaces. You always have an insight into the status of completed and ongoing tasks along with insight into the logs.") }}
            {{ partial "feature" (dict "logo_path" "icons/integrations-icon.svg" "header" "Plenty of integrations" "text" "Airflow provides many plug-and-play operators that are ready to handle your task on Google Cloud Platform, Amazon Web Services, Microsoft Azure and many other services. This makes Airflow easy to use with your current infrastructure.") }}
            {{ 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 scopes of your pipelines. You can use it for building ML models, transferring data or managing your infrastructure.") }}
            {{ 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 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 }}
