extend _components/base.pug

block pagetitle
    | Events Watch Video 

block css 
    link(rel="stylesheet", href="../css/events.css?ver=" + config.version)

block main
    - global.pageHref = "events.html"
    include ./_components/header.pug



    section.eventhero
        .container
            .eventhero__main
                h2.h2.
                    Join The Apache Ignite <br>
                    Community At&nbsp;Conferences, <br>
                    Summits And Other Events
                .h5.pt-3.
                    The community meets online and offline regularly. <br>
                    Join our meetup groups and events to learn from <br>Ignite experts or to share your Ignite experience.
            img.eventhero__img(src="/public/img/events/b1-mainpic.svg", alt="Join the Apache Ignite Community at Conferences, Summits and Other Events")
    // /.eventhero


    section.cmtynavblock 
        .container
            ul.cmtynavblock__list.flexi 
                li
                    a.cmtynavblock__active(href="#summit")  Ignite Summit
                li
                    a(href="#meetups") Meetups Worldwide
                li
                    a(href="#upcoming") Upcoming Events
                li
                    a(href="#past") Past Events
    // /.cmtynavblock



    section.event-featured.container 
        p.capstext Featured Event
        a(href="https://ignite-summit.org/schedule/", target="_blank").event-featured__banner.pt-5
            picture
                source(srcset="/public/img/events/event-banner-vert.jpg" media="(max-width: 767px)")
                img(src="/public/img/events/event-banner.jpg", alt="")
            //- .event-featured__placeholder(style="background:#E8F2FA; height:340px;")
    // /.event-featured



    section.evsummit.container#summit
        .evsummit__date.flexi 
            .evsummit__day 16
            .evsummit__month.h5 NOVEMBER <br>2021
        .evsummit__info.flexi.pt-5
            .evsummit__logo 
                img(src="/public/img/events/b2-summit.svg", alt="")
            .evsummit__descr
                h3.h3 Apache Ignite Summit
                p.h5.pt-2.
                    This virtual conference will feature speakers from industry-leading companies <br>
                    and hundreds of participants from all over the world. 
        .evsummit__blocks.pt-5.flexi 
            a(href="#", target="_blank").evsummblock.evsummblock--speaker
                p.h4.evsummblock__title Watch Summit videos and learn more about in-memory computing technology
                p.fz20.pt-1x.evsummblock__descr A full collection of Apache Ignite Summit presentations
                p.evsummblock__listtitle.pt-4
                    span.button Watch Summit Videos 
    // /.evsummit
        

    section.event-planet#meetups
        .container
            .event-planet__wrap.flexi 
                .event-planet__main 
                    h3.h3.pb-1 Apache Ignite Meetups Worldwide
                    p.h5.pt-5 Meet the community&nbsp;&mdash; developers, experts, and practitioners&nbsp;&mdash; face-to-face, virtually, or&nbsp;onsite in&nbsp;your city.
                .event-planet__pic 
                    img(src="/public/img/events/b4-world.svg", alt="")
    // /.event-planet
        


    section.event-virtual.container 
        .eventvirt.flexi 
            .eventvirt__left 
                h3.h4 Virtual Apache Ignite Meetup
                p.pt-2 Join Ignite users, developers, committers, contributors, and architects from all over the world and&nbsp;get access to&nbsp;the online-talks and presentations by&nbsp;Apache Ignite experts and practitioners.
            .eventvirt__right 
                a.button(href="#") Join Virtual Meetup

        .event-virtbot.flexi
            .event-virtbot__col
                h4.h4 Recordings Of Past Meetups
                p.pt-2 Find a collection of past Virtual Apache Ignite Meetup <br>presentations, talks, and webinars.
                .event-recording.pb-2
                    a(href="#").event-recorditem.videoscr.glightbox
                        .event-recpic(style="border-radius:10px; background:#F6F6F6;")
                    a(href="#").event-recorditem.videoscr.glightbox
                        .event-recpic(style="border-radius:10px; background:#F6F6F6;")
                    a(href="#").event-recorditem.videoscr.glightbox
                        .event-recpic(style="border-radius:10px; background:#F6F6F6;")
                a.event-recbutton.button.button--shadow(href="https://www.youtube.com/playlist?list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ", target="_blank")
                    i.
                        <svg width="9" height="10" viewBox="0 0 9 10" fill="none" xmlns="http://www.w3.org/2000/svg">
                            <path d="M8.71423 4.99993L0.142805 9.94865L0.142805 0.0512134L8.71423 4.99993Z"/>
                        </svg>
                    span Watch Virtual Meetup videos 

            .event-virtbot__col
                h4.h4 Upcoming Virtual Meetup
                p.pt-2.event-virtbot__gray November 16, 2021
                .event-dynamicsect
                a.button.button--shadow.event-recmorebutton(href="https://www.meetup.com/ru-RU/Apache-Ignite-Virtual-Meetup/events/280383112/", target="_blank") Learn more
    // /.event-virtual



    section.eventyoucity.container 
        h2.h4 Apache Ignite Meetups In Your City
        .eventyoucity__wrap.pt-5
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/public/img/events/flag-uk.svg", alt="")
                .eventyoucity__town.h5
                    strong London
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="#")
                        img(src="/public/img/events/icon-plus.svg", alt="")
                        span Join 
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/public/img/events/flag-ru.svg", alt="")
                .eventyoucity__town.h5
                    strong St.Petersburg
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="#")
                        img(src="/public/img/events/icon-plus.svg", alt="")
                        span Join 
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/public/img/events/flag-ru.svg", alt="")
                .eventyoucity__town.h5
                    strong Moscow
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="#")
                        img(src="/public/img/events/icon-plus.svg", alt="")
                        span Join
            article.eventyoucity__last
                p.fz20.pb-3 Start an onsite Apache Ignite Meetup in your city.
                small Take the first step.
                small Send us a note to <br><a href="mailto:dev@ignite.apache.org">dev@ignite.apache.org</a> <br>and we'll see what can be done.
    // /.eventyoucity



    section.eventupcoming.container#upcoming 
        .capstext.pb-1 Upcoming Events Schedule
        .eventupcoming__wrap.pt-4
            h2.h4.eventupcoming__head.pb-5 Online events (2)
            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 21
                    p.eventcomingitem__month SEPTEMBER
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Distributed Java Databases Under the Hood: Main Components and Interactions Between Them
                    p.eventcomingitem__descr.pt-1 We will describe the minimal architecture of distributed data storage—the main components and how these components work together.
                    a.eventcomingitem__more(href="#")  Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker Valentin Kulichenko
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/public/img/events/icon-pero.png", alt="")
                        .eventcomingitem__camera Online event
            // /.eventcomingitem

            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 23
                    p.eventcomingitem__month SEPTEMBER
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Apache Ignite Extensions – Modularization 
                    p.eventcomingitem__descr.pt-1 Apache Ignite Extensions to allow Apache Ignite codebase host core modules capabilities and migrate 3rd party integrations in a separate repository.
                    a.eventcomingitem__more(href="#") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker Saikat Maitra
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/public/img/events/icon-pero.png", alt="")
                        .eventcomingitem__camera Online event
            // /.eventcomingitem

        .eventupcoming__wrap.pt-4
            h2.h4.py-4 Offline events (4)
            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 20
                    p.eventcomingitem__month SEPTEMBER
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    .eventcomingitem__complextitle.flexi
                        img.eventcomingitem__logo(src="/public/img/events/content/event1.png", alt="")
                        p.eventcomingitem__title.h5 Apache Ignite. Now with CDC!
                    p.eventcomingitem__descr.pt-2 Nikolay Izhikov, Apache Ignite PMC, will introduce the audience to Change Data Capture and share how it's organized in Apache Ignite
                    a.eventcomingitem__more(href="#") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker Nikolay Izhikov
                    .eventcomingitem__loc
                        .eventcomingitem__locblock Saint-Petersburg, Russia
                        .eventcomingitem__camera Online event
            // /.eventcomingitem

            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 23
                    p.eventcomingitem__month SEPTEMBER
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    .eventcomingitem__complextitle.flexi
                        img.eventcomingitem__logo(src="/public/img/events/content/event2.png", alt="")
                        p.eventcomingitem__title.h5 Organization of testing distributed systems on the example of a real Java project
                    p.eventcomingitem__descr.pt-2 First offline meeting in 2021! Ignite Committers will talk about recently updated features. Dmitry Gorchakov will introduce the case – building a distributed system of "super services" on Apache Ignite.
                    a.eventcomingitem__more(href="#") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker.
                            Ivan Bessonov<br>
                            Maxim Muzafarov<br>
                            Dmitry Gorchakov
                    .eventcomingitem__loc 
                        .eventcomingitem__locblock Moscow, Russia
            // /.eventcomingitem
    // /.eventupcoming




    section.eventspast#past.container
        h3.capstext.pb-5 Past Events
        .eventspast__tablinks.flexi 
            button.eventpast__link(data-tablink="e2021").active 2021
            button.eventpast__link(data-tablink="e2021") 2020
            button.eventpast__link(data-tablink="e2021") 2019
            button.eventpast__link(data-tablink="e2021") 2018
            button.eventpast__link(data-tablink="e2021") 2017
            button.eventpast__link(data-tablink="e2021") 2016
            button.eventpast__link(data-tablink="e2021") 2015
            button.eventpast__link(data-tablink="e2021") 2014
        .eventspast__tabs
            .eventspast__tab 
                article.eventcard
                    .eventcard__date September 2, 2021
                    h3.h5.pt-3 Building a low-code BaaS platform on Apache Ignite
                    .eventcard__info.pt-2 
                        .eventcard__speaker Courtney Robinson
                            small (Hypi, co-founder and CEO)
                        .eventcard__loc Virtual Apache Ignite Meetup
                    a.eventcard__button.button.button--shadow Learn more details
                article.eventcard
                    .eventcard__date September 2, 2021
                    h3.h5.pt-3 Apache Ignite 3.0.0 Alpha 2 Build Community Gathering
                    .eventcard__info.pt-2 
                        .eventcard__speaker.eventcard__speaker--one Valentin Kulichenko
                        .eventcard__loc Virtual Apache Ignite Meetup
                    a.eventcard__button.button.button--shadow Learn more details
                article.eventcard
                    .eventcard__date June 19, 2021
                    h3.h5.pt-3 Apache Ignite on Kubernetes
                    .eventcard__info.pt-2 
                        .eventcard__speaker.eventcard__speaker--one Colin Capriati
                        .eventcard__loc Virtual Apache Ignite Meetup
                    a.eventcard__button.button.button--shadow Learn more details
            // /.eventspast__tab
            .eventspast__bottom.pt-5
                a.eventspast__more.jsLoadMoreEvents(href="#")  Show more
    // /.eventspast
        



    