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="/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="/img/events/event-banner-vert.jpg" media="(max-width: 767px)")
                img(src="/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="/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="/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="/img/events/flag-uk.svg", alt="")
                .eventyoucity__town.h5
                    strong London
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="#")
                        img(src="/img/events/icon-plus.svg", alt="")
                        span Join 
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/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="/img/events/icon-plus.svg", alt="")
                        span Join 
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/img/events/flag-ru.svg", alt="")
                .eventyoucity__town.h5
                    strong Moscow
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="#")
                        img(src="/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="/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="/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="/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="/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
        



    