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

{{ $links := .Site.Params.links }}
<footer>
    <div class="footer-section footer-section__media-section">
        <div class="d-flex align-items-center">
            {{ with $links }}
                {{ with index . "media"}}
                    {{ range . }}
                        <a class="footer-section__media-section--link" target="_blank" href="{{ .url }}">
                            {{ with resources.Get (print "icons/" .iconName) }}{{ .Content | safeHTML }}{{ end }}
                        </a>
                    {{ end }}
                {{ end }}
            {{ end }}
        </div>
        <div class="footer-section__media-section--button-with-text">
            <span class="footer-section__media-section--text">Want to be a part of Apache Airflow?</span>
            <a href="/community/">
                {{ partial "buttons/button-filled" (dict "text" "Join community") }}
            </a>
        </div>
    </div>
    <div class="footer-section footer-section__policies-section">
        <div class="footer-section">
            {{ with .Site.Params.copyright }}<span>&copy; {{ . }} {{ now.Format "2006" }}</span>{{ end }}
            <div class="footer-section__policies-section--policies">
                {{ with $links }}
                    {{ with index . "policies"}}
                        {{ range . }}
                            <a href="{{ .url }}" class="footer-section__policies-section--policy-item">
                                <span>{{ .name }}</span>
                            </a>
                        {{ end }}
                    {{ end }}
                {{ end }}
                <div class="footer-section__policies-section--language-toggle">
                    {{ partial "lang-selector" . }}
                </div>
            </div>
        </div>
        <span class="footer-section__policies-section--disclaimer">
            Apache Airflow, Apache, Airflow, the Airflow logo, and the Apache feather logo are either registered trademarks or trademarks of The Apache Software Foundation.
            All other products or name brands are trademarks of their respective holders, including The Apache Software Foundation.
        </span>
    </div>
</footer>
