extend _components/base.pug

block pagetitle
    | Events Watch Video 

block css 
    link(rel="stylesheet", href="../css/events.css")

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
        



    