---
license: |
    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.
layout: default
---
<section id="full-screen-2" class="container-fluid p-0">
    <div id="particules" ></div>
    <div class="container h-100">
        <div class="row d-flex justify-content-center">
            <img style="height: 50vh; max-height: 50vh; margin-top: -15vh" src="{{ "assets/img/logo/logo_svg_letter.svg" | absolute_url }}"/>
        </div>
        <div class="row">
            <div class="col h-100 text-center flex-wrap" >
                    <h1 class="display-4 " style="font-size: 7vh; color: #a00e5a; font-weight: 900;">
                        <strong>
                            {{ page.section-1.title }}
                        </strong>

                    </h1>
            </div>
        </div>
    </div>
</section>
<section class="container-fluid p-0 mb-0" style="background-color:#f8f9fa !important ">
    <div class="container">
            <p class="lead p-2 ">
                <strong>
                    {{ page.section-1.text }}
                </strong>
            </p>
    </div>
</section>

<section class="container-fluid p-0 mt-n3 mb-n3" style="background-color:#ffffff !important ">
        <div class="container ">
            <p class="display-4 p-2 text-center">
                {{ page.section-2.title }}
            </p>
        </div>
        <div class="container text-center">
            <p class="lead p-2">
                <strong>
                    {{ page.section-2.text }}
                </strong>
            </p>
        </div>
</section>
<section id="full-screen" class="p-0">
    <div class="container">
        <div class="d-flex justify-content-center tx-shadow">
            <p class="display-4 p-2">
                {{ page.section-3.title }}
            </p>
        </div>
        <div class="d-flex justify-content-center tx-shadow">
            <p class="lead p-2">
                <strong>
                    {{ page.section-3.text }}
                </strong>
            </p>
        </div>
    </div>
    <div class="container">
        {% assign col = 1 %}
        <div class="row mb-3">
        {% for item in site.data.features %}
                <div class="col d-flex align-items-stretch mb-2">
                    <div class="card text-center">
                        <div class="card-body">
                            <i class="{{item.icon}} fa-8x"></i>
                            <h5 class="card-title">{{item.title}}</h5>
                            <p class="card-text">{{item.description-short}}</p>
                        </div>
                    </div>
                </div>
            {% if col == 3 %}
            </div>
            <div class="row mb-3">
                {% assign col = 0 %}
            {% else %}
                {% assign col = col | plus: 1 %}
            {% endif %}
        {% endfor %}
        </div>
    </div>
</section>

<script src="https://cdn.jsdelivr.net/npm/particles.js@2.0.0/particles.min.js"></script>
<script>
    const queryString = window.location.search;
    const urlParams = new URLSearchParams(queryString);
    with_image = ! urlParams.has('poli');
    if(with_image) {
       image_url = '{{ "assets/img/puzzle-piece-gray.png" | absolute_url }}';
       particlesJS(
           'particules',
           {
               "particles": {
                   "number": {
                       "value": 50,
                       "density": {
                           "enable": true,
                           "value_area": 800
                       }
                   },
                   "color": {
                       "value": "#1b1e34"
                   },
                   "shape": {
                       "type": "image",
                       "stroke": {
                           "width": 0,
                           "color": "#000"
                       },
                       "polygon": {
                           "nb_sides": 6
                       },
                       "image": {
                           "src": image_url,
                           "width": 1,
                           "height": 1
                       }
                   },
                   "opacity": {
                       "value": 0.8,
                       "random": true,
                       "anim": {
                           "enable": false,
                           "speed": 1,
                           "opacity_min": 0.1,
                           "sync": false
                       }
                   },
                   "size": {
                       "value": 30,
                       "random": true,
                       "anim": {
                           "enable": true,
                           "speed": 10,
                           "size_min": 40,
                           "sync": false
                       }
                   },
                   "line_linked": {
                       "enable": false,
                       "distance": 200,
                       "color": "#ffffff",
                       "opacity": 1,
                       "width": 2
                   },
                   "move": {
                       "enable": true,
                       "speed": 2,
                       "direction": "none",
                       "random": false,
                       "straight": false,
                       "out_mode": "out",
                       "bounce": false,
                       "attract": {
                           "enable": false,
                           "rotateX": 600,
                           "rotateY": 1200
                       }
                   }
               },
               "interactivity": {
                   "detect_on": "canvas",
                   "events": {
                       "onhover": {
                           "enable": false,
                           "mode": "grab"
                       },
                       "onclick": {
                           "enable": false,
                           "mode": "push"
                       },
                       "resize": true
                   },
                   "modes": {
                       "grab": {
                           "distance": 400,
                           "line_linked": {
                               "opacity": 1
                           }
                       },
                       "bubble": {
                           "distance": 400,
                           "size": 40,
                           "duration": 2,
                           "opacity": 8,
                           "speed": 3
                       },
                       "repulse": {
                           "distance": 200,
                           "duration": 0.4
                       },
                       "push": {
                           "particles_nb": 4
                       },
                       "remove": {
                           "particles_nb": 2
                       }
                   }
               },
               "retina_detect": true
           }
       );
    }else{
       particlesJS.load('particules', '{{ "assets/json/particules.conf.poligon.json" | absolute_url }}', function() {});
    }
</script>

