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